fldigi-4.1.06/0000775000175000017500000000000013515625025010047 500000000000000fldigi-4.1.06/ABOUT-NLS0000664000175000017500000022532613502576463011237 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of November 2007. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ Compendium | [] [] [] [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] | bison-runtime | [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | dialog | | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | fetchmail | [] [] () [] [] | findutils | [] | findutils_stable | [] [] [] | flex | [] [] [] | fslint | | gas | | gawk | [] [] [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gip | [] | gliv | [] [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | [] [] () () [] | gnuedu | | gnulib | [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | | gramadoir | [] [] | grep | [] [] | gretl | () | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gst-plugins-ugly | [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] | indent | [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | [] [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] | man-db | [] [] [] | minicom | [] [] [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] | pwdutils | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | shared-mime-info | [] [] [] [] () [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | skencil | [] () | solfege | | soundtracker | [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] | texinfo | [] [] [] | tin | () () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] | bfd | [] [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | dialog | [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | fetchmail | [] | findutils | [] [] [] | findutils_stable | [] [] [] [] | flex | [] [] [] | fslint | | gas | [] [] | gawk | [] [] [] [] () | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnuedu | [] | gnulib | [] [] [] | gnunet | | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] [] | gpsdrive | [] | gramadoir | [] [] | grep | [] [] [] | gretl | [] [] [] () | gsasl | [] [] | gss | [] [] | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] | gstreamer | [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] | keytouch-editor | [] | keytouch-keyboa... | [] [] | latrine | [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] [] | libidn | [] [] | lifelines | () | lilypond | [] [] [] | lingoteach | [] [] [] | lprng | | lynx | [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | [] | minicom | [] [] [] [] | nano | [] [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | tin | [] () | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | util-linux-ng | [] [] [] [] [] [] [] | vorbis-tools | | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn +--------------------------------------------------+ Compendium | [] | a2ps | () [] [] | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | [] | cpplib | [] | cryptonit | [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | fetchmail | [] [] | findutils | [] | findutils_stable | [] | flex | [] [] | fslint | | gas | | gawk | [] [] | gcal | | gcc | | gettext-examples | [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] [] | gnubiff | | gnucash | () () () | gnuedu | | gnulib | [] [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | [] | gpsdrive | [] | gramadoir | () | grep | [] [] | gretl | | gsasl | [] | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] | gtick | [] | gtkam | [] [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] | indent | [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | [] | libidn | [] [] | lifelines | [] | lilypond | [] | lingoteach | [] | lprng | | lynx | [] [] | m4 | [] [] | mailfromd | | mailutils | | make | [] [] [] | man-db | | minicom | [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] [] [] | pwdutils | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | shared-mime-info | [] [] [] [] [] [] [] | sharutils | [] [] | shishi | | skencil | | solfege | () () | soundtracker | | sp | () | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] | tin | | tuxpaint | () [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | util-linux-ng | [] [] | vorbis-tools | | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] [] | bash | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | dialog | [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | fetchmail | [] [] [] | findutils | [] [] [] | findutils_stable | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] | gas | | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gip | [] [] [] [] | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () [] | gnucash | () [] | gnuedu | | gnulib | [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | gretl | [] [] [] | gsasl | [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] | gstreamer | [] [] [] [] | gtick | [] | gtkam | [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | herrie | [] [] [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] [] | libgpg-error | [] [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] [] [] [] | minicom | [] [] [] [] [] | nano | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | [] [] | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | | wdiff | [] [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ Compendium | [] [] [] [] | 19 a2ps | [] [] [] | 19 aegis | [] | 1 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 16 bash | [] | 6 bfd | | 2 bibshelf | [] | 7 binutils | [] [] [] [] | 9 bison | [] [] [] [] | 20 bison-runtime | [] [] [] [] | 18 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 9 console-tools | [] [] | 5 coreutils | [] [] [] | 18 cpio | [] [] [] [] | 11 cpplib | [] [] [] [] [] | 12 cryptonit | [] | 6 dialog | [] [] [] | 9 diffutils | [] [] [] [] [] | 29 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 fetchmail | [] [] | 12 findutils | [] [] [] | 11 findutils_stable | [] [] [] [] | 18 flex | [] [] | 15 fslint | [] | 2 gas | [] | 3 gawk | [] [] [] | 16 gcal | [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] | 29 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 20 gip | [] [] | 13 gliv | [] [] | 11 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 16 gnubiff | [] | 2 gnucash | () [] | 5 gnuedu | [] | 2 gnulib | [] | 10 gnunet | | 0 gnunet-gtk | [] [] | 3 gnutls | | 4 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] [] | 7 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] [] | 16 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] [] | 22 gpe-filemanager | [] [] | 7 gpe-go | [] [] [] [] | 19 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] [] | 21 gpe-taskmanager | [] [] [] [] | 21 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] [] | 8 gphoto2 | [] [] [] [] | 21 gprof | [] [] | 13 gpsdrive | [] | 5 gramadoir | [] | 7 grep | [] | 12 gretl | | 6 gsasl | [] [] [] | 9 gss | [] | 7 gst-plugins-bad | [] [] [] | 13 gst-plugins-base | [] [] | 11 gst-plugins-good | [] [] [] [] [] | 16 gst-plugins-ugly | [] [] [] | 13 gstreamer | [] [] [] | 18 gtick | [] [] | 7 gtkam | [] | 16 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 27 gutenprint | | 4 hello | [] [] [] [] [] | 38 herrie | [] [] | 8 hylafax | | 0 idutils | [] [] | 15 indent | [] [] [] [] [] | 28 iso_15924 | [] [] | 4 iso_3166 | [] [] [] [] [] [] [] [] [] | 54 iso_3166_2 | [] [] | 4 iso_4217 | [] [] [] [] [] | 24 iso_639 | [] [] [] [] [] | 26 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] [] | 13 keytouch | [] | 8 keytouch-editor | [] | 5 keytouch-keyboa... | [] | 5 latrine | [] [] | 5 ld | [] [] [] [] | 10 leafpad | [] [] [] [] [] | 24 libc | [] [] [] | 19 libexif | [] | 5 libextractor | [] | 5 libgpewidget | [] [] [] | 20 libgpg-error | [] | 6 libgphoto2 | [] [] | 9 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] [] | 11 libidn | [] [] | 11 lifelines | | 4 lilypond | [] | 6 lingoteach | [] | 6 lprng | [] | 2 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailfromd | [] [] | 3 mailutils | [] [] | 8 make | [] [] [] | 20 man-db | [] | 9 minicom | [] | 14 nano | [] [] [] | 20 opcodes | [] [] | 10 parted | [] [] [] | 11 pilot-qof | [] | 1 popt | [] [] [] [] | 18 psmisc | [] [] | 10 pwdutils | [] | 3 qof | [] | 4 radius | [] [] | 7 recode | [] [] [] | 25 rpm | [] [] [] [] | 13 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] [] | 23 shared-mime-info | [] [] [] | 29 sharutils | [] [] [] | 23 shishi | [] | 3 skencil | [] | 7 solfege | [] | 3 soundtracker | [] [] | 9 sp | [] | 3 system-tools-ba... | [] [] [] [] [] [] [] | 38 tar | [] [] [] | 17 texinfo | [] [] [] | 15 tin | | 1 tuxpaint | [] [] [] | 19 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 util-linux-ng | [] [] [] | 20 vorbis-tools | [] [] | 4 wastesedge | | 1 wdiff | [] [] | 23 wget | [] [] [] | 20 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] | 14 xpad | [] [] [] | 15 +---------------------------------------------------+ 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If November 2007 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. fldigi-4.1.06/COPYING0000664000175000017500000010451313502576502011027 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . fldigi-4.1.06/NEWS0000664000175000017500000001651113502576530010474 00000000000000NEWS for version 4.x Version 4.0.4 cw scanner . adds multi signal scanner / browser Sound Card . keep input and output sound card devices open for duration of fldigi execution . Corrected tune output device . Changed tune, wfid, video and cw id to use tx offset CW QSY . Correct QSY when transceiver in CW and CW-R type modes CALL field size . Increased CALL, OP_CALL, STA_CALL from 15 to 30 chars LOG area controls . Resize controls to add County entry control. Allow user to select which extra qso field is displayed; country or county. Version 4.0.3 CW code update . Changed all element timing to number of samples both CW and CW scanning detectors . Removed FIR filter. FFT filter only for CW signal path. . Removed Hilbert transform from CW signal path . Update CW documentation OS X Wizard . Discovered cause of Wizard failure on OS X - newly created dialogs cannot be accessed until actually shown. CW wait . Correct Windows performance at end of CW Tx text - program should wait for keyboard input - terminate with the ^r character pair - terminate with control-r - terminate with the T/R button Version 4.0.2 Revert "wefax" . This reverts commit 5609415222335e9376defc325f20ae29c5c8c8ca. . Modifies wefax.cxx iaw request from Remi, wefax author Lotw Match . fix failure to mark logbook as dirty when records are matched flrigi bw synch . Improve bandwidth table / selection sync with flrig when changing xcvr mode from fldigi Clang 8.1.0 . Correct warning notification with latest Clang compiler on macOS Sierra 10.12.4 Sound card . Changed to separate Rx/Tx soundcard instances - only open/close when samplerate changes - attempt to reduce incidence of lost sound card in OS X IFKP image processing . Rx processing failed to return to TEXT state upon conclusion of image transfer Macro Save . Corrected issue with macro tag "Save" CW end of transmit . Add character to Rx echo text when going from Tx to Rx - provides visual separation of Tx and Rx text in the Rx panel - color rendition still applies. Font Initialization . Force all font initialization to be name dependent . Font name / Font number can change as user installs or removes fonts from the OS with potentially fatal impact on fldigi font usage. . May require user to reconfigure various font selections OS X socket connect . connect test for fail conditions not correct for OS X Winkeyer exit process . Release resources when closing Winkeyer . Issue ADMIN:CLOSE command to Winkeyer when disconnecting or closing fldigi. Version 4.0.1 Socket connect . FreeBSD mod causes seg fault on non BSD platforms - make change OS dependent Version 4.0.0 OS X 10.12 build . Compile changes for OS X Darwin 10.12 Clang build STATION_CALLSIGN . Change adif field STATION_CALL to STATION_CALLSIGN compliant with adif specification Free BSD mods . Compliance mods for current version of Clang compiler Logbook mods . Update log field LOTWSDATE for each record sent to LOTW when the upload file is created . clear LOTWSDATE field if lotw rejects submission or fails to respond within 25 seconds . insure that lotw review dialog closes on program exit . restore tabular sort order when adding a record Default Tx Audio . Change default audio output to both channels remove sprintf . change all remaining occurances of sprintf to snprintf Documentation update . New documentation for winkeyer interface n3fjp logger search . set initial search for n3fjp server to 5 second intervals fopen->fl_fopen . update to UDF-8 compatible fopen call 48 bar macro . allow user to select above / below Rx/Tx panels CW decoder . Improved CW decoder - removed user adjustable signal level controls - added automatic tracking filters for Rx signal level - tracking filters change parameters with detected WPM. DX cluster . Update dxcluster QSY to correctly align signal to sweet spot when transceiver is in a CW mode. . add ability to respond to password prompt Logbook support . Add checkband test to new log entry before writing record . Added BAND control to log view, contest tab - fldigi does not use the BAND field, it is present as a convenience for exporting or importing from log programs that do use it. - the control is on the contest tab since that seems to be the most common use for BAND (e.g. field day event). . OS X file naming dialog drops the ".adif" extension. - add code to insure newlog etc have the correct extension. WinKeyer . Added embedded WinKeyer interface fsq ifkp s/n computation . Additional change to s/n measurement fltk version update . update all fluid generated source and header files Macro Date Time Formats . Allow user to specify the date time format using strftime format strings - becomes ; etc. - fmt is the strftime format string if the ':fmt' is not in the macro tag then the current format is used lotw addition . Add jt9 modes for lotw upload . Allow up to 7 numerals in frequency element THOR/IFKP Image transfers . Add auto save Rx images to - Thor - IFKP . Corrected IFKP send image sequencing - pic%[T] where T is image scale was not being sent before the image fascimille. . Added Thor and IFKP image transfer using the macro tag ifkp s/n update . Change to s/n measurement - noise measured over full range of possible signal bins - noise referenced to 3000 Hz bandwidth fsq s/n update . Change to s/n measurement - noise measured over full range of possible signal bins - noise referenced to 3000 Hz bandwidth OSS bug fix . Add missing parenthesis to reverse audio test - bug fix submitted by Guiseppe, IZ1QZE PSKMAIL PTT fault protection . add REQ(...) to show_tx_timer function call Logbook File Handling . Change new log file naming paradigm - move logbook open/save/merge to a separate sub -menu . Change logbook merge logic - discover and cull duplicates in both current and merge records - write duplicates to adif file for user review - annotate Rx Panel with user information on merger performance Russian UTF-8 translation . Added Russian po files Tooltips . Correct and update various tooltips n3fjp contest update . Add read next serial to send from n3fjp logger . Add send TXTENTRYSERIALNOR to n3fjp generic logger . Add new macro tags - current serial number - last serial number . add support fields for N3FJP NAQP contest logging Hamlib/RigCAT/XMLRPC Interface . Hamlib (K5JAE) - Add user adjustable poll rate - Add Defaults button - Modify activation of controls based on hamlib selection . RigCAT (W1HKJ) - removed btnRevertRIGCAT & associated functions - toggle Initialize button state with change in rigcat enable . XMLRPC (W1HKJ) - toggle Initialize button state with change in xmlrpc enable fldigi-4.1.06/AUTHORS0000664000175000017500000000133713502576471011051 00000000000000AUTHOR: Dave Freese CALLSIGN: W1HKJ EMAIL: w1hkj (at) w1hkj [dot] com AUTHOR: Stelios Bounanos CALLSIGN: M0GLD EMAIL: m0gld (at) enotty [dot] net AUTHOR: Leigh L Klotz, Jr CALLSIGN: WA5ZNU EMAIL: leigh (at) wa5znu [dot] org AUTHOR: Remi Chateauneu CALLSIGN: F4ECW EMAIL: remi (dot) chateauneu (at) gmail [dot] com AUTHOR: John Douyere CALLSIGN: VK2ETA EMAIL: vk2eta (at) gmail [dot] com AUTHOR: Stefan Fendt CALLSIGN: DO2SMF EMAIL: stefan (at) sfendt [dot] de AUTHOR: John Phelps CALLSIGN: KL4YFD EMAIL: kl4yfd (at) gmail [dot] com AUTHOR: Andrej Lajovic CALLSIGN: S57LN EMAIL: s57ln (at) hamradio [dot] si All authors can be contacted on the fldigi-devel mailing list: https://sourceforge.net/p/fldigi/mailman/fldigi-devel/ fldigi-4.1.06/Makefile.am0000664000175000017500000000066013502576522012030 00000000000000ACLOCAL_AMFLAGS = -I m4 -I m4/intl # AC_CONFIG_MACRO_DIR([m4]) SUBDIRS = po doc src if HAVE_FLUID flgen: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if DARWIN appbundle: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if HAVE_NSIS nsisinst: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if WANT_FLDIGI if ENABLE_HAMLIB hamlib-static: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif endif EXTRA_DIST = build-aux/config.rpath fldigi-4.1.06/po/0000775000175000017500000000000013515625025010465 500000000000000fldigi-4.1.06/po/nl.po0000664000175000017500000070773613515625024011401 00000000000000# Dutch translations for fldigi package # Copyright (C) 2014 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Peter van der Post , 2014. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.01\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2014-11-10 20:14-0600\n" "Last-Translator: Peter van der Post \n" "Language-Team: Dutch\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "%s log gestart op %s" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "Ongeldig modem ID" #: src/main.cxx:1710 msgid "Bad frequency" msgstr "Ongeldige frequentie" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "License GPLv3+: GNU GPL versie 3 of nieuwer \n" "Dit is gratis software. Het staat je vrij om het te wijzigen en te " "verspreiden.\n" "Er is GEEN GARANTIE op deze software.\n" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 msgid "Could not make directory " msgstr "Kon map niet aanmaken" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "Log alle RX/TX tekst" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "TRX besturen" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "&Mode" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Toon minder modes" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Toon alle modes" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "B&eeld" #: src/dialogs/fl_digi.cxx:198 #, fuzzy msgid "MFSK Image" msgstr "&MFSK Beeld" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:200 #, fuzzy msgid "IFKP Raw Image" msgstr "&MFSK Beeld" #: src/dialogs/fl_digi.cxx:201 #, fuzzy msgid "Weather Fax Image RX" msgstr "&Weerfax-afbeelding RX" #: src/dialogs/fl_digi.cxx:202 #, fuzzy msgid "Weather Fax Image TX" msgstr "&Weerfax-afbeelding TX" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "&Landen" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "&Interface" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "Alles" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Geen" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "Vaste scope" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "Minimaal aantal knoppen" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "Toon kanalen" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "Verbind met server" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "Aangepast..." #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "Gewijzigde macro's opslaan?" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "Annuleren" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Bewaren" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "Niet niet bewaren" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "Nee" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Ja" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "Geen bestandsnaam opgegeven" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "Formaat niet ondersteund" #: src/dialogs/fl_digi.cxx:2700 msgid "channels != 1" msgstr "channels != 1" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "onbekende fout in WAVE bestand" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "Spotting uitgeschakeld" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Kan geen webbrowser starten:\n" "%s\n" "\n" "Open dit URL handmatig:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Kon URL niet openen:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Controleren op updates..." #: src/dialogs/fl_digi.cxx:2858 msgid "Update site not available" msgstr "" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "U gebruikt de nieuwste versie" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "U gebruikt de nieuwste versie" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "Versie %s is beschikbaar via\n" "\n" "%s\n" "\n" "Wat wilt u doen?" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "Sunspot creation underway!" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Informatie over de geluidskaart is alleen beschikbaar voor de PortAudio " "component" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "Opname-apparaat" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "Afspeelapparaat" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Opname- en afspeelapparaten" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Bestaan niet, maken?" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "Logvelden leeg maken?" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Bevestig" #: src/dialogs/fl_digi.cxx:4525 msgid "Save changed configuration?" msgstr "Configuratiewijzigingen opslaan?" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 msgid "Save log entry?" msgstr "Log-invoer opslaan?" #: src/dialogs/fl_digi.cxx:4557 msgid "Confirm Quit" msgstr "Afsluiten bevestigen" #: src/dialogs/fl_digi.cxx:4579 msgid "Confirm quit?" msgstr "Afsluiten bevestigen?" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "&Bestand" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Mappen" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Fldigi instellingen..." #: src/dialogs/fl_digi.cxx:5865 msgid "FLMSG files..." msgstr "FLMSG bestanden..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "NBEMS bestanden..." #: src/dialogs/fl_digi.cxx:5867 msgid "Data files..." msgstr "Databestanden..." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "Macro's" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Open ..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Opslaan ..." #: src/dialogs/fl_digi.cxx:5875 #, fuzzy msgid "Config Scripts" msgstr "Afsluiten bevestigen" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5877 #, fuzzy msgid "Generate" msgstr "Algemeen" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "Tekst opslaan" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "RX opslaan" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "TX genereren" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "Afspelen" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Afsluiten" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "&Instellingen" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "Gebruikersinterface" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "Kleuren && lettertypes" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "Operator" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "Gebruikersinterface" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "Waterval" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "Waterval-instellingen" #: src/dialogs/fl_digi.cxx:6146 #, fuzzy msgid "Operating" msgstr "Operator" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 #, fuzzy msgid "Active Modem" msgstr "Ontvangstmodes" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "Geluidskaart" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "" #: src/dialogs/fl_digi.cxx:6155 #, fuzzy msgid "CPU speed" msgstr "AFC snelheid" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/fl_digi.cxx:6157 #, fuzzy msgid "PSKmail" msgstr "Pskmail" #: src/dialogs/fl_digi.cxx:6158 #, fuzzy msgid "PSK reporter" msgstr "PSK Reporter" #: src/dialogs/fl_digi.cxx:6159 #, fuzzy msgid "Sweet spot" msgstr "Sweet Spot" #: src/dialogs/fl_digi.cxx:6160 #, fuzzy msgid "Text IO" msgstr "Tekst I/O" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "DTMF" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "WX" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "KML" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Other" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "Autostart" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 msgid "IO" msgstr "IO" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notificaties" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 #, fuzzy msgid "PSM" msgstr "PSK" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 #, fuzzy msgid "Test Signals" msgstr "Zendsignaal" #: src/dialogs/fl_digi.cxx:6175 #, fuzzy msgid "Contest/Logging" msgstr "Contest uitwisseling in" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Instellingen opslaan" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Kanalen tonen/verbergen" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "Signaalverkenner" #: src/dialogs/fl_digi.cxx:6190 #, fuzzy msgid "View/Hide 48 macros" msgstr "S-meter tonen/verbergen" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "Oscilloscoop" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6205 #, fuzzy msgid "Rig/Log Controls" msgstr "TRX besturen" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "&Logboek" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "Toon" #: src/dialogs/fl_digi.cxx:6221 #, fuzzy msgid "Files" msgstr "&Bestand" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Openen..." #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Nieuw" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "Samenvoegen..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "Exporteren..." #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "Rapporten" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "Tekst..." #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6242 #, fuzzy msgid "Field Day Logging" msgstr "Functie muiswiel" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "&Help" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "Create sunspots" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "Beginnersgids (Engels)" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "Online documentatie... (Engels)" #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Fldigi web site..." #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "Ontvangstrapporten..." #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Command line opties" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "Informatie geluidskaart" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "Build info (Engels)" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "Logboek" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Controleer op updates..." #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "&Over" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "alleen-waterval modus" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "GEEN ROEPNAAM INGESTELD" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Sluit lijst" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Open lijst" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "Lijst wissen?" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "rapport" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "rapporten" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "Recente activiteit voor grid" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "Signaalverkenner" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "Oscilloscoop" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Gedetecteerd signaalniveau" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Squelch-niveau" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Klik links: wijzig mode\n" "Klik rechts: instellen" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "CW zenden WPM" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "Standaard WPM" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "Tx niveau verzwakker (dB)" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "Automatic Frequency Control" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:8226 #, fuzzy msgid "Power Signal Monitor" msgstr "Toon vóór signaal" #: src/dialogs/fl_digi.cxx:9943 #, fuzzy msgid "Delete entry?" msgstr "Log-invoer opslaan?" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Alles" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "Zoek: " #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Sluiten" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "Wis" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Klik links om tekst te wissen\n" "Klik rechts voor begininstelling frequenties" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "Stel squelch in voor Viewer" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "Exporteer naar CSV bestand" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "Exporteer naar tekstbestand met vaste veldgrootte" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "Exporteer naar ADIF bestand" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "Gewijzigd logboek opslaan?" #: src/logbook/logsupport.cxx:381 #, fuzzy msgid "Create new logbook file" msgstr "Nieuw logboek aanmaken?" #: src/logbook/logsupport.cxx:404 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "%s: Bestaan niet, maken?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Open logboekbestand" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Logboekbestand opslaan" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "ADIF bestand samenvoegen" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "Bijwerken" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Registratie voor \"%s\" echt verwijderen?" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "Cabrillo rapport maken" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "Kon flmsg niet starten" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "Bepaal locatie flmsg executable" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "Bepaal locatie Flmsg executable" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:497 msgid "Locate binary" msgstr "Locatie 'Flmsg'" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "*" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Alle ontvangen tekst opslaan, één karakter tegelijk, naar het bestand:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "TRX mode" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Altijd LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Altijd USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Alle instellingen terugzetten naar de beginwaarden?\n" "\n" "Dit krijgt effect bij de volgende programmastart.\n" "Bestanden fldigi_def.xml en fldigi.prefs zullen worden verwijderd.\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Bevestig RESET" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "Quiet" #: src/misc/debug.cxx:89 msgid "Error" msgstr "Error" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "Warning" #: src/misc/debug.cxx:89 msgid "Info" msgstr "Info" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "Verbose" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "ARQ control" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:105 msgid "KISS control" msgstr "KISS instellingen" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "Log sources" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "Wijzig log-niveau" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tmijn frequentie" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tmode" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tmijn roepnaam" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tmijn locator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tmijn naam" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tmijn QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tmijn RST" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy FD class" msgstr "\tmijn roepnaam" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy state" msgstr "\tmijn naam" #: src/misc/macroedit.cxx:81 #, fuzzy msgid "\tmy ST" msgstr "\tmijn RST" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:83 #, fuzzy msgid "\tmy CNTY" msgstr "\tmijn QTH" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "\tmijn antenne" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "\texchange end" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "\tFldigi versie" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "\troepnaam tegenstation" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "\tnaam tegenstation" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "\tQTH tegenstation" #: src/misc/macroedit.cxx:93 #, fuzzy msgid "\tother State" msgstr "\tRST tegenstation" #: src/misc/macroedit.cxx:94 #, fuzzy msgid "\tother Province" msgstr "\tnaam tegenstation" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "\tlocator tegenstation" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "\tRST tegenstation" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "\t# QSO recs" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "\tVolgend QSO rec #" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "\ttoon kaart op Google" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "\ttoon kaart op basis van coördinaten" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "\twis RX scherm" #: src/misc/macroedit.cxx:112 msgid "\tclear TX pane" msgstr "\twis TX scherm" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "\ttekst naar NAME/QTH" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk aan (on), uit (off), wissel (toggle)" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "\twis logvelden" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "\tbewaar QSO gegevens" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "\tBewaar QSO gegevens, voeg bericht toe aan notities" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "\tlog tijdens zenden" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "\tBewaar QSO gegevens, voeg bericht toe aan notities" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "\tlog eQSL" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "\tlog eQSL optioneel bericht" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "\tQSO tijd (UUMM))" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:137 #, fuzzy msgid "\tlocal time, default %H%M" msgstr "\tlokale tijd UUMM" #: src/misc/macroedit.cxx:138 #, fuzzy msgid "\tzulu time default %H%MZ" msgstr "\tzulu tijd UUMMZ" #: src/misc/macroedit.cxx:139 #, fuzzy msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tlokale datum JJJJ-MM-DD" #: src/misc/macroedit.cxx:140 #, fuzzy msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tzulu datum JJJJ-MM-DD Z" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "\tweer-informatie ophalen" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "\tweer-informatie ophalen van specifiek METAR station" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "\tcontest-teller" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "\tcontest-teller verlagen" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "\tcontest-teller ophogen" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "\texchange in" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "\texchange out" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "\texchange begin" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "\texchange end" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "\tbewaar contest uit" #: src/misc/macroedit.cxx:153 #, fuzzy msgid "\tcurrent contest serno" msgstr "\tcontest-teller verlagen" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD class" msgstr "\tmijn roepnaam" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tFD section" msgstr "Ontvangen serienummer" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "\tcontest class" msgstr "\tmijn roepnaam" #: src/misc/macroedit.cxx:158 #, fuzzy msgid "
\tARRL section" msgstr "Ontvangen serienummer" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "\tontvangen" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "\tzenden" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "\twissel zenden/ontvangen" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "\tzoek VERDER naar signaal" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "\tzoek TERUG naar signaal" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "\tkeer terug naar 'sweet spot' (meest gunstige frequentie)" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "\tga naar frequentie NNNN Hz" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "\tklik links op QSY knop" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "\tklik rechts op QSY knop" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "\tQSY naar kHz, Hz" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "\tomhoog/omlaag TRX frequentie" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "\tschakel TRX naar mode" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "\tstel TRX filter in" #: src/misc/macroedit.cxx:174 #, fuzzy msgid "\tvalid xcvr low cutoff filter" msgstr "\tstel TRX filter in" #: src/misc/macroedit.cxx:175 #, fuzzy msgid "\tvalid xcvr hi cutoff filter" msgstr "\tstel TRX filter in" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "\tTRX frequentie heeft toetsenbordfocus" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "\tQRG invoegen in RX tekst" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "\ttekstbestand invoegen" #: src/misc/macroedit.cxx:183 #, fuzzy msgid "\tinsert image file" msgstr "\tMFSK afbeelding invoegen" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tpause transmit" msgstr "\tpauzeer uitzending" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "\t'idle' signaal gedurende NN,nn seconden" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "\therhaal elke NN seconden" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\t'tune' signaal gedurende NN seconden" #: src/misc/macroedit.cxx:191 #, fuzzy msgid "\tdelay xmt for NN.n sec" msgstr "\twacht met zenden gedurende NN seconden" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\therhaal macro doorlopend" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "\tplan uitvoering" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "\tTX verzwakker instellen" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "\tzend CW id" #: src/misc/macroedit.cxx:200 #, fuzzy msgid "\tsend mode ID; TX start only" msgstr "\tzend mode ID als videotekst" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RsID aan,uit,wissel" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RsID aan,uit,wissel" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tVerstuur |NN| opeenvolgende RsID uitzendingen" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "\t[Wacht][Lengte](ms)" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "\tCW QSK tijd achteraf (ms)" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK tijd vooraf (ms)" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "\tCW stijgtijd" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "\tCW WPM:Farnsworth" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "\tVerzend CAT commando" #: src/misc/macroedit.cxx:220 #, fuzzy msgid "\tsend CAT cmd" msgstr "\tVerzend CAT commando" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "\tAFC aan,uit,wissel" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "\tLOCK aan,uit,wissel" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "\tReverse aan,uit,wissel" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "\twissel van bestand met macrodefinities" #: src/misc/macroedit.cxx:229 msgid "\tsave current macro file" msgstr "\tBewaar huidig macro bestand" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "\tNegeer alle commentaartekst" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "\tmodem char/sec test on nn chars" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "\tmodem timing test, 'n' random 5 char groups" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "\tmodem timing test, spec' file" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "\tmodem timing test, string 's'" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "\tWAV file; internal string" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:243 msgid "\tWAV file; spec' file" msgstr "\tWAV bestand; spec' file" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "\tWAV bestand; string 's'" #: src/misc/macroedit.cxx:247 msgid "\tAnalysis CSV on,off,toggle" msgstr "\tCSV analyse aan, uit, wissel (toggle)" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "In te voegen tekstbestand" #: src/misc/macroedit.cxx:384 msgid "Test text file" msgstr "Test tekstbestand" #: src/misc/macroedit.cxx:394 msgid "MFSK image file" msgstr "Bestand MFSK afbeelding" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "Wissel naar macrobestand" #: src/misc/macroedit.cxx:414 #, fuzzy msgid "Select wav file" msgstr "Kies apparaat" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "In te voegen uitvoerbaar bestand" #: src/misc/macroedit.cxx:457 msgid "Macro Text" msgstr "Macro Tekst" #: src/misc/macroedit.cxx:462 msgid "Select Tag" msgstr "Kies label" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "Label macroknop" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "Toepassen" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "Macro editor - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Open macrobestand" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fldigi macro-definitiebestand\t*.{mdf}" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "Bewaar macrobestand" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Voltooien" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Volgende" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Terug" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "Deze wizard helpt je bij de basisinstellingen voor Fldigi" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Je kunt op elk moment schermen overslaan of de wizard verlaten" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Alle getoonde instellingen kunnen later worden gewijzigd via het " "Instellingen menu" #: src/misc/newinstall.cxx:540 msgid "Fldigi configuration wizard" msgstr "Fldigi configuratie-wizard" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "Benodigde tijd: " #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "Afbeelding inlezen" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Stuur afbeelding" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Laad of sleep een afbeelding\n" "Ondersteunde formaten: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "Snelheid, X1-normaal" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "Laden" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "Waterval / Spectrum / Oscilloscoop" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Hoogste signaalniveau (dB)" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "Signaalbereik (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Wijzig schaal waterval" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "Verschuif weergave naar lagere frequentie" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "Centreer weergave op signaal" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "Verschuif weergave naar hogere frequentie" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "Snelheid waterval" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "Cursorfrequentie aanpassen" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centreer in doorlaatband\n" "Klik rechts om ongedaan te maken" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Mode en frequentie opslaan\n" "Klik rechts voor lijst" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Zet zendfrequentie vast" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "Reverse" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Zenden/Ontvangen" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "AFC bereik of bandbreedte" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "Signaal zoeken" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "Modem carrier" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "Verschuiven" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Open TRX XML bestand" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fldigi TRX XML definitiebestand\t*.xml" #: src/soundcard/sound.cxx:170 #, fuzzy msgid "Waveform Audio Format\t*.wav\n" msgstr "" "Waveform Audio Opmaak\t*.wav\n" "AU\t*.{au,snd}\n" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Free Lossless Audio Codec\t*.flac" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "Geluidsbestand" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "Continu afspelen in een lus?" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "Mijn roepnaam de CALL" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "Station tweemaal gehoord" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "Zoeken op tekst" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "RsID ontvangst" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "Wissel" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "Verwijder" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Kies" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "Continent" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "ITU zone" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "CQ zone" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "Deselecteren" #: src/spot/notify.cxx:519 msgid "Add" msgstr "Toevoegen" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Alles selecteren" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "Alles wissen" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "Land" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "Het veld met de reguliere expressie mag niet leeg zijn." #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "De reguliere expressie moet geldig zijn." #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "Voer eerst de roepnaam in." #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Start programma" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" "Standaard testtekst is:\n" " \"" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "Voer testtekst in of laat leeg voor standaardtekst:" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "De reguliere expressie van deze gebeurtenis is ongeldig." #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "" "De testtekst komt niet overeen met het zoekpatroon van deze gebeurtenis." #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "Beschikbare deelteksten" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "Frequentie" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "Roepnaam" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Palet openen" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "Fldigi palet\t*.pal" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "Palet: " #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "Palet bewaren" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "Roepnaam opzoeken" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "Call" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "Naam" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "Staat" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 msgid "County" msgstr "Graafschap (county)" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "Provincie" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "Uitwisseling ontv." #: src/widgets/FTextRXTX.cxx:161 #, fuzzy msgid "Rx Serial #" msgstr "Volgnr. ontvangen" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 #, fuzzy msgid "Section" msgstr "Actie" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 #, fuzzy msgid "SS check" msgstr "Alles" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 #, fuzzy msgid "SS section" msgstr "Actie" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 #, fuzzy msgid "QSOp state" msgstr "QSO begintijd" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 #, fuzzy msgid "QSOp name" msgstr "Naam operator" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Markering invoegen" #: src/widgets/FTextRXTX.cxx:198 #, fuzzy msgid "All entries" msgstr "Pogingen" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "Scroll tips" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "Laatste QSO" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Zenden" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "Ontvangen" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "Afbreken" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Afbeelding versturen..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 msgid "A" msgstr "" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 #, fuzzy msgid "E" msgstr "Ex" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "IO" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "Nee" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 msgid "O" msgstr "O" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 #, fuzzy msgid "U" msgstr "Gebruikersinterface" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Tekst invoegen" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Tekst opslaan als" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Kopiëren" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Opslaan als..." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "Terugloop" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Knippen" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Plakken" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Bestand invoegen..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Herstel" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "Verwijder" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, fuzzy, c-format msgid "Executing script file: %s" msgstr "Kies RigCAT definitiebestand" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:394 #, fuzzy msgid "Command Not Found" msgstr "Command line opties" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:414 #, fuzzy msgid "General Error" msgstr "Algemeen" #: src/config_script/script_parsing.cxx:418 #, fuzzy msgid "No Errors" msgstr "Error" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "no" msgstr "Info" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "yes" msgstr "Ja" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Toon" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "Verberg" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "Fldigi configuratie" #: src/dialogs/confdialog.cxx:8227 #, fuzzy msgid "Station / Operator" msgstr "Station tweemaal gehoord" #: src/dialogs/confdialog.cxx:8230 #, fuzzy msgid "Station Callsign:" msgstr "Roepnaam operator" #: src/dialogs/confdialog.cxx:8231 #, fuzzy msgid "Station callsign" msgstr "Roepnaam operator" #: src/dialogs/confdialog.cxx:8244 #, fuzzy msgid "Operator Callsign:" msgstr "Roepnaam operator" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:8259 #, fuzzy msgid "Operator Name:" msgstr "Naam operator" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Naam operator" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "Antenne:" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "Omschrijving antenne" #: src/dialogs/confdialog.cxx:8287 #, fuzzy msgid "Station QTH:" msgstr "Station" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "QTH operator" #: src/dialogs/confdialog.cxx:8301 #, fuzzy msgid "Station Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "Maidenhead locator, bijvoorbeeld JO22IA" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "Verkenner" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Kanalen, eerste kanaal begint bij ondergrens waterval" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "Wijzig aantal PSK ontvangstkanalen" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "Time-out bij inactiviteit" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Wis tekst na # seconden\n" "zonder activiteit" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Label kanaal" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Weergave label voor elk kanaal" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "Audiofrequentie" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "Radiofrequentie" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "Kanaalnummer" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "Lettertype..." #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "Kies lettertype voor verkenner" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "Vaste intervallen" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forceer kanaalafstand op 100 Hz stappen" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "Doorlopend scrollen" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "ON - Marquee style\n" "OFF - Clear & restart" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "Laagste frequentie onderaan scherm" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "Wijzig posities van kanalen laag naar hoog" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "Speel geschiedenis terug bij kiezen van actief kanaal" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "Geschiedenis audio-spoor gedecodeerd voor geselecteerde signaal" #: src/dialogs/confdialog.cxx:8467 msgid "Detection Level" msgstr "Detectieniveau" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "Achtergr." #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "Achtergrondkleur van squelch-knop in signaalvenster" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "Knop" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "Kleur van squelch knop in signaalscherm" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "Lijnkleuren verkenner" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY Viewer HiLite Color 1" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "PSK/RTTY Viewer HiLite Color 2" #: src/dialogs/confdialog.cxx:8497 msgid "Even" msgstr "Even" #: src/dialogs/confdialog.cxx:8498 msgid "Even lines" msgstr "Even regels" #: src/dialogs/confdialog.cxx:8503 msgid "Odd" msgstr "Oneven" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "Oneven regels" #: src/dialogs/confdialog.cxx:8510 msgid "Select line" msgstr "Kies regel" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "Algemeen" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Toon tips" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "Tips in- of uitschakelen" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Toon icons in menu's" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "Icons in menu's in- of uitschakelen" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "Gebruikersinterfaceprofiel" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Wijzig 'look and feel' van applicatie" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "Getoonde modes" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Kies modes voor menutoegang" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "Taal programma" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Krijgt effect bij de volgende programmastart" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Ontvangen tekst in kleine letters voor CW, RTTY, THROB en CONTESTIA" #: src/dialogs/confdialog.cxx:8591 #, fuzzy msgid "Transmit lower case text" msgstr "Verzend laagste starttoon" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "Vragen bij afsluiten" #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "Vraag om instellingen op te slaan" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "Vraag om macrobestand op te slaan" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "Bewaar huidige macro set bij afsluiten programma" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "Vraag om logboek op te slaan" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "Dring aan op het opslaan van ingevoerde logs" #: src/dialogs/confdialog.cxx:8618 msgid "Confirm exit" msgstr "Bevestig afsluiten" #: src/dialogs/confdialog.cxx:8625 msgid "Check for updates" msgstr "Controleer op updates" #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "Controleer op updates bij programmastart" #: src/dialogs/confdialog.cxx:8638 #, fuzzy msgid "Show TX timer" msgstr "Toon DXCC entiteiten" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "Log" #: src/dialogs/confdialog.cxx:8658 #, fuzzy msgid "QSO" msgstr "QSY" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "QSO loggen" #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "Vraag om log op te slaan bij afsluiten" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "Leegmaken na opslaan" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "Wis log velden na opslaan of macro" #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "Sla roepnaam op in hoofdletters" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "Maakt van roepnaam HOOFDLETTERS" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Land+antennehoek autom. invullen" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Land en antennehoek invullen op basis van cty.dat bestand" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "Sorteren op datum/tijd UIT" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "Sorteren op datum/tijd UIT - beïnvloedt alle ADIF/Cabrillo rapporten" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "Datum tijd AAN == UIT" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "Forceer datijd/tijd AAN == datum/tijd UIT" #: src/dialogs/confdialog.cxx:8698 #, fuzzy msgid "Default RST in to 599/59" msgstr "RST ontvangen standaard 599" #: src/dialogs/confdialog.cxx:8699 #, fuzzy msgid "Clear log controls sets RST in to 599/59" msgstr "Maak logvelden leeg en zet RST ontvangen op 599" #: src/dialogs/confdialog.cxx:8704 #, fuzzy msgid "Default RST out to 599/59" msgstr "RST verzonden standaard 599" #: src/dialogs/confdialog.cxx:8705 #, fuzzy msgid "Clear log controls sets RST out to 599/59" msgstr "Maak logvelden leeg en zet RST verzonden op 599" #: src/dialogs/confdialog.cxx:8710 msgid "cty.dat folder" msgstr "Zoek naar cty.dat bestand" #: src/dialogs/confdialog.cxx:8711 msgid "Enter full path-name for cty.dat folder" msgstr "Voer het volledige pad in voor cty.dat" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "Bladeren" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "Zoek naar cty.dat bestand" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "Standaard" #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "Herstel standaardmap voor cty.dat" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "Herladen" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "cty.dat opnieuw laden" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "Zendvermogen" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "Zendvermogen voor vermelding in logboek" #: src/dialogs/confdialog.cxx:8751 #, fuzzy msgid "Display logbook read datum at start" msgstr "Toon naam macrobestand bij programmastart" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "De bestandsnaam wordt getoond in het RX scherm" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 #, fuzzy msgid "Rx Text" msgstr "Ontvangen tekst opslaan" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "Eén klik om op te slaan" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "" "Schakel in om met één klik ontvangen tekst vast te leggen in het RX scherm" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "Toon roepnaam tips in ontvangen tekst" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "Toon informatie na twee seconden met de muis zweven boven een roepnaam" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "Scheidingstekens voor woorden" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "QSO gegevensinvoer wordt begrensd door de scheidingstekens, die hier\n" "gedefinieerd zijn. Tab en 'nieuwe regel' tekens worden automatisch " "meegenomen." #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:8801 #, fuzzy msgid "Clear log fields - new CALL" msgstr "Logvelden leeg maken?" #: src/dialogs/confdialog.cxx:8812 #, fuzzy msgid "Connect to MacLogger" msgstr "Verbind met server" #: src/dialogs/confdialog.cxx:8817 #, fuzzy msgid "Capture Radio Report" msgstr "Cabrillo rapport maken" #: src/dialogs/confdialog.cxx:8823 #, fuzzy msgid "Capture Log Report" msgstr "Cabrillo rapport maken" #: src/dialogs/confdialog.cxx:8828 #, fuzzy msgid "Capture Lookup " msgstr "Roepnamen zoeken" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 #, fuzzy msgid "Enable UDP log file" msgstr "Alles aan" #: src/dialogs/confdialog.cxx:8848 #, fuzzy msgid "UDP data stream" msgstr "Databestand" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8868 #, fuzzy msgid "Clear text" msgstr "Wis lijst" #: src/dialogs/confdialog.cxx:8871 #, fuzzy msgid "Address" msgstr "Adres:" #: src/dialogs/confdialog.cxx:8872 #, fuzzy msgid "N3FJP Server IP Address" msgstr "IP adres" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 msgid "Port" msgstr "Poort" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Zet IP adres en poortnummer\n" "terug naar standaardwaarde." #: src/dialogs/confdialog.cxx:8905 #, fuzzy msgid "Enable Data Stream" msgstr "Schrijf ontvangen tekst naar bestand" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 #, fuzzy msgid "Connect" msgstr "Opnieuw verbinden" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 #, fuzzy msgid "Connected" msgstr "Opnieuw verbinden" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 #, fuzzy msgid "Contests" msgstr "Contest" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 #, fuzzy msgid "State QSO Party" msgstr "Datum start QSO" #: src/dialogs/confdialog.cxx:8980 #, fuzzy msgid "Text capture order" msgstr "Tekst opslaan" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Context Notes" msgstr "Contest" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "Controle dubbel gewerkt, roepnaam plus..." #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "Aan/Uit" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Controleer op duplicaten" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Band" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "'Band' moet overeenkomen" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "Mode" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "'Mode' moet overeenkomen" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "Time span over" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "QSO mag niet voorkomen binnen tijdspanne van" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "Duplicaat" #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "Klik links om de kleur voor duplicaten te kiezen" #: src/dialogs/confdialog.cxx:9029 #, fuzzy msgid "? Dup Color" msgstr "Duplicaat" #: src/dialogs/confdialog.cxx:9030 #, fuzzy msgid "Left click to select possible dup color" msgstr "Klik links om de kleur voor duplicaten te kiezen" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "vrije vorm 1 moet overeenkomen" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "'Staat' moet overeenkomen" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "minuten" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "Tijdspanne in minuten" #: src/dialogs/confdialog.cxx:9069 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Contest uitwisseling in" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 #, fuzzy msgid "Send" msgstr "Stuur:" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "vrije uitwisseling" #: src/dialogs/confdialog.cxx:9087 #, fuzzy msgid "RST always 599/59" msgstr "RST altijd 599" #: src/dialogs/confdialog.cxx:9088 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "RST verzonden/ontvangen altijd 599" #: src/dialogs/confdialog.cxx:9093 #, fuzzy msgid "Send CW cut #'s" msgstr "Verkorte cijfers in CW" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:9101 #, fuzzy msgid "Start Nbr" msgstr "Start" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "Eerste getal" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Cijfers" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "Aantal cijfers in volgnummer" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "Gebruik voorloopnullen" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "Voeg voorloopnullen toe aan verzonden volgnummer" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Reset" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "Initialiseer QSO logvelden" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 #, fuzzy msgid "Operator Call" msgstr "Naam operator" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:9170 #, fuzzy msgid "My Section" msgstr "Actie" #: src/dialogs/confdialog.cxx:9171 #, fuzzy msgid "Field Day Section" msgstr "Functie muiswiel" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 #, fuzzy msgid "Scout Operator Name" msgstr "Naam operator" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "Muiswiel actief voor macroknoppen" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "" "Maakt het mogelijk om de regel met macrobalk te bedienen met het muiswiel" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Aantal en positie van macrobalken" #: src/dialogs/confdialog.cxx:9282 msgid "Button Height" msgstr "Knophoogte" #: src/dialogs/confdialog.cxx:9283 msgid "Height of macro bar" msgstr "Hoogte macrobalk" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "Eén boven RX/TX" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Eén macrobalk onder logscherm\n" "variabele hoogte" #: src/dialogs/confdialog.cxx:9299 msgid "One above waterfall" msgstr "Eén boven waterval" #: src/dialogs/confdialog.cxx:9304 msgid "One below waterfall" msgstr "Eén onder waterval" #: src/dialogs/confdialog.cxx:9309 msgid "Two scheme 1" msgstr "Twee schema 1" #: src/dialogs/confdialog.cxx:9314 msgid "Two scheme 2" msgstr "Twee schema 2" #: src/dialogs/confdialog.cxx:9319 msgid "Two scheme 3" msgstr "Twee schema 3" #: src/dialogs/confdialog.cxx:9324 msgid "Two scheme 4" msgstr "Twee schema 4" #: src/dialogs/confdialog.cxx:9329 msgid "Two scheme 5" msgstr "Twee schema 5" #: src/dialogs/confdialog.cxx:9334 msgid "Two scheme 6" msgstr "Twee schema 6" #: src/dialogs/confdialog.cxx:9339 msgid "Two scheme 7" msgstr "Twee schema 7" #: src/dialogs/confdialog.cxx:9344 msgid "Two scheme 8" msgstr "Twee schema 8" #: src/dialogs/confdialog.cxx:9349 msgid "Two scheme 9" msgstr "Twee schema 9" #: src/dialogs/confdialog.cxx:9354 msgid "Two scheme 10" msgstr "Twee schema 10" #: src/dialogs/confdialog.cxx:9363 #, fuzzy msgid "Load last used macro file at start" msgstr "Laatst gebruikte macrobestand inlezen bij programmastart" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "AAN - laatst gebruikte set macro's\n" "UIT - standaardset" #: src/dialogs/confdialog.cxx:9369 #, fuzzy msgid "Display macro filename at start" msgstr "Toon naam macrobestand bij programmastart" #: src/dialogs/confdialog.cxx:9385 #, fuzzy msgid "Show macro control codes" msgstr "Toon macro editor" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9405 msgid "WF Ctrls" msgstr "Waterval" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "Vink de gewenste knoppen aan" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "Watervalvergroting" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "Waterval carrier" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "Waterval verschuiven" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "Waterval referentieniveau" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "Waterval snelheid" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "Waterval bereik versterking" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "Waterval opslaan" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "Waterval modus" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "XMT vast" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "Alles aan" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "Alles uit" #: src/dialogs/confdialog.cxx:9489 msgid "Clrs/Fnts" msgstr "Kleuren/lettertypes" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "RX/TX" #: src/dialogs/confdialog.cxx:9494 msgid "Rx/Tx Character set" msgstr "RX/TX karakterset" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "Kies RX/TX karakterset" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "Achtergr." #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "Achtergr." #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "RX font" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "TX font" #: src/dialogs/confdialog.cxx:9539 #, fuzzy msgid "Macro Edit Font" msgstr "Macro editor - " #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "Tekst markeren" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "Verzonden tekst in RX/TX scherm" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "Control karakters in RX/TX scherm" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Overgeslagen tekens in TX scherm\n" "(TX aan/uit in CW)" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "Alternatieve kleur RX scherm" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "Achtergrondkleur selectie RX/TX scherm" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "Systeem" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "Standaard" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "Frequentieweergave / meters" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "14.070,150" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "Lettertype" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "Achtergr.kleur" #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "Kleur cijfers" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "Syst.kleuren" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "S-meter" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 msgid "Scale Color" msgstr "Kleur schaal" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 msgid "Meter Color" msgstr "Kleur meter" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "PWR-meter" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "Vermogensmeter" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "Kies FFT pre-filter type" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "Knoppen logboekscherm" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "Logboekscherm" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 #, fuzzy msgid "Report Browser" msgstr "Verkenner" #: src/dialogs/confdialog.cxx:9721 #, fuzzy msgid "Even Lines" msgstr "Even regels" #: src/dialogs/confdialog.cxx:9726 #, fuzzy msgid "Odd Lines" msgstr "Oneven regels" #: src/dialogs/confdialog.cxx:9731 #, fuzzy msgid "Stream Text" msgstr "Secundaire tekst" #: src/dialogs/confdialog.cxx:9737 #, fuzzy msgid "Bg color" msgstr "Achtergr.kleur" #: src/dialogs/confdialog.cxx:9743 #, fuzzy msgid "Alt Color" msgstr "Kleur" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "Functietoetsen" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "Gebruik gekleurde knoppen" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Groep 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "Achtergrondkleur voor functietoets groep 1" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Groep 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "Achtergrondkleur voor functietoets groep 2" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Groep 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "Achtergrondkleur voor functietoets groep 3" #: src/dialogs/confdialog.cxx:9783 msgid "Font/Color" msgstr "Lettertype/Kleur" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "Tabs" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "Tabkleur" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "Knoppen" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "Rev" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "Tunen" #: src/dialogs/confdialog.cxx:9808 #, fuzzy msgid "RxID nar" msgstr "RxID" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "Lock" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:9820 #, fuzzy msgid "RxID wide" msgstr "RxID" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "Lighted button enabled colors" #: src/dialogs/confdialog.cxx:9882 #, fuzzy msgid "All Others" msgstr "Other" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "SigLvl" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "Laag" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "Hoog" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "Normaal" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "Over" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "Kleuren signaalniveau's" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "Aanraakscherm" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Opmerking:\n" "Deze instellingen zijn relevant maar niet uniek voor het gebruik van Fldigi\n" "op een aanraakscherm, zoals een tablet." #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "Frequentie-invoer met pijltjestoetsen" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Rechts/Links = 1 x LSD\n" "Omhoog/Omlaag= 10 x LSD\n" "Shift - Rechts/Links = 100 x LSD\n" "Shift - Omhoog/Omlaag = 1000 x LSD" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Rechts/Links\n" "Kies minst significante cijfer" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "RX/TX schermen" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "TX boven RX" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "Vink aan om TX scherm boven RX scherm te plaatsen" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "Toon" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "Kleuren en cursors" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Wijzig kleur" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "Laden..." #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "Nieuw palet inlezen" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Opslaan..." #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "Dit palet opslaan" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "Bandbreedte" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "AAN" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "Toon cursor met bandbreedte-lijnen" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Kleur" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "Breed" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "Toont bandbreedte-sporen in waterval" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "Middenlijn" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "Toon cursor met middenlijn" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "Signaalspoor" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "Notch" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "Frequentieschaal" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "Altijd audiofrequentie tonen" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "Audio of RF-frequentie aanduiding bij waterval" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "Kies lettertype watervalschaal" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "Zendsignaal" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "Toon verzonden signaal" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "Toon zendsignaal in waterval" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Signaalniveau" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "Kies niveau voor correcte weergave" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "Signaalverwerking (FFT)" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "Ondergrens (Hz)" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "Laagste te verwerken frequentie in Hz" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "FFT uitmiddeling" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "Gebruik uitmiddeling om watervalruis te verminderen" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "FFT prefilter window function" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "Rectangular" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "Triangular" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "Bovengrens" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "Hoogste frequentie in Hz" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "Vertraging" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" "Bepaling signaalgemiddelde gedurende tijd\n" "0 - kortst\n" "4 - langst" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "Toon grotere of kleinere waterval" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "Lage snelheid" #: src/dialogs/confdialog.cxx:10269 msgid "Normal drop speed / value" msgstr "Normale snelheid / waarde" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "Hoogte van de waterval in pixels" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "CPU gebruik neemt toe bij een grotere watervalhoogte" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Muis" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "Links of rechts klikken speelt altijd opnieuw de audio-geschiedenis af" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "Herhaal audio van het spoor" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "Slepen op de waterval wijzigt de frequentie" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "Slepen op waterval inschakelen" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "Tekst invoegen bij enkelvoudige klik linkerknop" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Voeg speciale tekst in bij Rx scherm\n" "wanneer er op de waterval geklikt wordt" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "De reeks wordt vervangen door\n" "huidige modem en frequentie" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "Functie muiswiel" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Kies de functie van het muiswiel\n" "voor de waterval" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:10374 #, fuzzy msgid "values left/below waterfall" msgstr "Eén onder waterval" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10389 #, fuzzy msgid "use" msgstr "Muis" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "Modems" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "SOM decoding" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "Self Organized Mapping" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "Tracking" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "Automatic Rx speed tracking" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "Bandbreedte filter" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "CW DSP filterbandbreedte" #: src/dialogs/confdialog.cxx:10451 #, fuzzy msgid "Matched Filt'" msgstr "Matched Filter" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "Matched Filter bandwidth" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "Gemeten CW snelheid in WPM" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "Ondergrens" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "Ondergrens detector" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "Boven" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "Bovengrens detector" #: src/dialogs/confdialog.cxx:10511 #, fuzzy msgid "Range" msgstr "dB bereik" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "Bereik +/- WPM" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "Mijn CW zendsnelheid WPM" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "Standaard CW snelheid" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "Niet lager dan deze snelheid" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "Niet hoger dan deze snelheid" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "Gebruik Farnsworth timing" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "Timing en QSK" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "Timing" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "Gewicht (%)" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "Verhouding punt / punt-spatie" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "Verhouding streep / punt" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "In-/uitschakel timing" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "In- en uitschakeltijden (msec)" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "Puslvorm in-/uitschakelen" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 #, fuzzy msgid "Edge decrease" msgstr "Inschakelpuls meetellen voor pulsbreedte" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "Gewicht verminderen bij verhoogde pulsbreedte" #: src/dialogs/confdialog.cxx:10735 #, fuzzy msgid "BPF transmit audio" msgstr "CW zenden WPM" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "QSK op rechter audiokanaal" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "Genereer blokgolf op rechter audiokanaal" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "Pre-keydown timing (ms)" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "Msec pre-keydown (+ is earlier in time)" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "Post-keydown timing (ms)" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "Msec post-keydown (+ is earlier in time)" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "Doorlopend zenden" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "Verzend een doorlopende reeks testsymbolen" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "Symbool voor test" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "Test symbool op QSK aanpassing" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "Professionele symbolen" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "Gebruik '(', niet KN" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 #, fuzzy msgid "Ser. Port" msgstr "Poort" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 #, fuzzy msgid "Xcvr serial port" msgstr "Seriële poort" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 #, fuzzy msgid "Connect / Disconnect from WinKeyer" msgstr "Maak/verbreek verbinding met Talker server" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 #, fuzzy msgid "ModeReg" msgstr "Mode" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 #, fuzzy msgid "Enable paddle auto spacing of characters" msgstr "Schakel in voor UTF-8 (Unicode) karakters" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 #, fuzzy msgid "Enable contest character spacing" msgstr "Schakel in voor UTF-8 (Unicode) karakters" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 #, fuzzy msgid "Serial echo" msgstr "Seriële poort" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 #, fuzzy msgid "Tone ON" msgstr "Tijd AAN" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 #, fuzzy msgid "WPM Settings" msgstr "Instellingen" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 #, fuzzy msgid "Min WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 #, fuzzy msgid "Rng WPM" msgstr "Bereik WPM" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 #, fuzzy msgid "Cmd WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 #, fuzzy msgid "Timing/Settings" msgstr "Instellingen" #: src/dialogs/confdialog.cxx:11155 #, fuzzy msgid "Ratio" msgstr "Locator" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 #, fuzzy msgid "Sample" msgstr "Sample snelheid" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 #, fuzzy msgid "Weight" msgstr "Gewicht (%)" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 #, fuzzy msgid "Bk" msgstr "Terug" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 #, fuzzy msgid "WPM setting" msgstr "Instellingen" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 #, fuzzy msgid "nanoIO serial port" msgstr "Seriële poort" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 #, fuzzy msgid "Connect / Disconnect from nanoIO" msgstr "Maak/verbreek verbinding met Talker server" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 #, fuzzy msgid "Status" msgstr "Staat" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 #, fuzzy msgid "Paddle" msgstr "Bereik WPM" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 #, fuzzy msgid "Comp'" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 #, fuzzy msgid "PTT off" msgstr "TX offset" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "Alles uit" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "Dom" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "Secundaire tekst" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "Deze tekst wordt verstuurd als het toetsenbord niet wordt gebruikt" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "Filter" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "Gebruik DSP filter voor het decoderen" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "Filter bandbreedtefactor" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "Filterbandbreedte ten opzichte van breedte signaal" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "Schakel MultiPSK-compatibele FEC in" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "CWI grens" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "CWI detectie en onderdrukking" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "Paths (hidden)" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "Feld" #: src/dialogs/confdialog.cxx:11647 #, fuzzy msgid "Hell Transmit Parameters" msgstr "karakters" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "Lettertype voor zenden" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "Kies rasterlettertype voor zenden" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "Vorm puls" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "'Raised cosine' pulsvormfactor" #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "Zend punten (.) indien 'idle'" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Verstuur punten wanneer er geen toetsbordactiviteit is" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 #, fuzzy msgid "Range 1...3" msgstr "Wijzig map..." #: src/dialogs/confdialog.cxx:11706 #, fuzzy msgid "Hell Receive Parameters" msgstr "karakters" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "Reverse video" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "Toon RX in 'reverse video'" #: src/dialogs/confdialog.cxx:11715 #, fuzzy msgid "Marquee text" msgstr "Wis lijst" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11722 #, fuzzy msgid "Range 1...4" msgstr "Wijzig map..." #: src/dialogs/confdialog.cxx:11734 #, fuzzy msgid "Rx Height in pixels" msgstr "Hoogte van de waterval in pixels" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "Bandbreedte ontvangstfilter" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "Pas DSP bandbreedte aan" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 #, fuzzy msgid "Rx Parameters" msgstr "karakters" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:11791 #, fuzzy msgid "Minimum # hits in tone detector" msgstr "Detecteer meerdere kanelen" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 #, fuzzy msgid "Tx Parameters" msgstr "karakters" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 #, fuzzy msgid "Center freq" msgstr "Middenlijn" #: src/dialogs/confdialog.cxx:11867 #, fuzzy msgid "Sounder" msgstr "Geluidskaart" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 #, fuzzy msgid "convert operator callsign to lower case" msgstr "Sla roepnaam op in hoofdletters" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Time out" msgstr "Wachttijd verstreken" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:11892 #, fuzzy msgid "Enter QTC text" msgstr "Tekst invoegen" #: src/dialogs/confdialog.cxx:11898 #, fuzzy msgid "Message Logging" msgstr "Loggen" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 #, fuzzy msgid "Notify time out" msgstr "Time-out bij inactiviteit" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "Loggen" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 #, fuzzy msgid "Audit log" msgstr "Audio" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "Actief" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 #, fuzzy msgid "Text Colors" msgstr "Kleur meter" #: src/dialogs/confdialog.cxx:11959 #, fuzzy msgid "Transmit text" msgstr "Transmit video text" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 #, fuzzy msgid "Directed received text" msgstr "Decodeer ontvangen DTMF tonen" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 #, fuzzy msgid "Undirected received text" msgstr "Decodeer ontvangen DTMF tonen" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "" #: src/dialogs/confdialog.cxx:11988 #, fuzzy msgid "1/2 speed" msgstr "AFC snelheid" #: src/dialogs/confdialog.cxx:11993 #, fuzzy msgid "1x speed" msgstr "AFC snelheid" #: src/dialogs/confdialog.cxx:11994 #, fuzzy msgid "default" msgstr "Standaard" #: src/dialogs/confdialog.cxx:11999 #, fuzzy msgid "2x speed" msgstr "AFC snelheid" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:12011 #, fuzzy msgid "convert other callsign to lower case" msgstr "Sla roepnaam op in hoofdletters" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "8-bit uitgebreide karakterset (UTF-8)" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "Schakel in voor UTF-8 (Unicode) karakters" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "Long receive integration" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "Schakel in voor zeer zwakke signalen" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "Verzend laagste starttoon" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "Verzend hoogste starttoon" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "Lengte toon (s)" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 #, fuzzy msgid "Manual tuning" msgstr "Handmatig aanpassen" #: src/dialogs/confdialog.cxx:12122 #, fuzzy msgid "Oliv" msgstr "Olivia" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "Kies bandbreedte" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "Tonen" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "Kies aantal tonen" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "Synchronisatie voor ontvangst" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "Afstemmarge (afstanden toonfrequenties)" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "Alleen aanpassen om te experimenteren!" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "Integratieperiode (FEC blokken)" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "FEC blokken wissen bij wisselen naar BW of tonen" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "Maak actief om UTF-8 (Unicode) karakters te kunnen verzenden" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 #, fuzzy msgid "Enable this to send start/stop tones" msgstr "Schakel in wanneer Fldigi wordt gestart" #: src/dialogs/confdialog.cxx:12227 #, fuzzy msgid "Cont" msgstr "Cont'" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "8-bit uitgebreide karakterset" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "Maak actief voor Latin-1 karakters met diacrieten (é, ü etc.)" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "AFC gedrag" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "Zoekbereik voor acquisitie (Hz)" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "Herken signalen binnen gegeven bandbreedte" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "S/N verhouding voor acquisitie (dB)" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "Herken signalen boven deze grens" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "S/N en IMD gedrag" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "na" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "Gedrag van signaalruisverhouding en IMD" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "Verlaag" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "seconden" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "Treedt op na verstreken tijd in seconden" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "Signaalverwerking meerdere kanalen" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "Detecteer meerdere kanelen" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" "Schakel uit bij zeer langzame CPU of indien de signaalverkenner niet wordt " "gebruikt" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12439 #, fuzzy msgid "Pilot tone power relative to signal" msgstr "Filterbandbreedte ten opzichte van breedte signaal" #: src/dialogs/confdialog.cxx:12458 #, fuzzy msgid "Short Preamble" msgstr "Video Preamble ID" #: src/dialogs/confdialog.cxx:12459 #, fuzzy msgid "Enable short preamble for 8PSK transmission" msgstr "Maak actief om UTF-8 (Unicode) karakters te kunnen verzenden" #: src/dialogs/confdialog.cxx:12472 #, fuzzy msgid "TTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "RX" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "AFC snelheid" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "Snelheid waarmee AFC volgt" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "RX - unshift on space" #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "Terug naar karakters zonder shift na spatie" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "Filtervormfactor" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "RCOS tijdcoëfficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "Decoderen (CWI onderdrukking)" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "Mark-Space" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "Alleen Mark" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "Alleen Space" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "RTTY scope weergave" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "Gebruik XY oscilloscoop" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "Gebruik standaard XY oscilloscoop" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "XY - klassieke scope" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Ingeschakeld - gebruik Mark/Space filter uitgang\n" "Uitgeschakeld - gebruik pseudo signalen" #: src/dialogs/confdialog.cxx:12555 msgid "Log RTTY frequency" msgstr "Log RTTY frequentie" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "Gebruik Mark frequentie" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Ingeschakeld - log QSO met frequentie Mark signaal\n" "Uitgeschakeld - log QSO met middenfrequentie" #: src/dialogs/confdialog.cxx:12566 msgid "track color" msgstr "Kleur spoor" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "Kleur van Mark spoor" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "TX" #: src/dialogs/confdialog.cxx:12580 #, fuzzy msgid "Sound Card FSK" msgstr "Geluidskaart" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "Shift" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "Kies afstand tussen de tonen" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "Aangepaste shift" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "Input carrier shift" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "Baudrate" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "Kies snelheid (baud)" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "Aantal bits per karakter" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "Kies het aantal bits per karakter" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "Pariteit" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "Kies pariteit" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "Aantal stopbits" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "Kies het aantal stopbits" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "Automatische terugloop (CR-LF)" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "Voegt CR-LF toe na aantal karakters" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "karakters" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "Regelbreedte auto CR-LF" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Gebruik CR-CR-LF bij regel-einde" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "TX - lettersymbolen na spatie (UOS)" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "Schakel om naar lettersymbolen na ontvangen van een spatie" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:12728 msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK - rechterkanaal" #: src/dialogs/confdialog.cxx:12729 msgid "Create keyed square wave on right audio channel" msgstr "Geschakelde blokgolf op rechter audiokanaal" #: src/dialogs/confdialog.cxx:12736 #, fuzzy msgid "Transceiver FSK" msgstr "Besturen zendontvanger" #: src/dialogs/confdialog.cxx:12739 #, fuzzy msgid "Mark" msgstr "Alleen Mark" #: src/dialogs/confdialog.cxx:12740 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Frequenctie in MHz" #: src/dialogs/confdialog.cxx:12751 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Shift" #: src/dialogs/confdialog.cxx:12766 #, fuzzy msgid "LTRS at start" msgstr "Start" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 #, fuzzy msgid "FSK Interface" msgstr "Gebruikersinterface" #: src/dialogs/confdialog.cxx:12847 #, fuzzy msgid "Navigator serial port" msgstr "Seriële poort" #: src/dialogs/confdialog.cxx:12861 #, fuzzy msgid "FSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12862 #, fuzzy msgid "Connect / Disconnect from Nav FSK port" msgstr "Maak/verbreek verbinding met Talker server" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 #, fuzzy msgid "Navigator configuration port" msgstr "Fldigi configuratie" #: src/dialogs/confdialog.cxx:12885 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Kanaalnummer" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 #, fuzzy msgid "Channel 2 attenuator" msgstr "Kanaalnummer" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 #, fuzzy msgid "RF attenuator" msgstr "KPSQL demping" #: src/dialogs/confdialog.cxx:12918 #, fuzzy msgid "NavRF Attenuator" msgstr "KPSQL demping" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 #, fuzzy msgid "Nav FSK baud rate" msgstr "Bitrate seriële poort" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Aantal stopbits" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 #, fuzzy msgid "Mark Polarity" msgstr "Alleen Mark" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 #, fuzzy msgid "Config" msgstr "Bevestig" #: src/dialogs/confdialog.cxx:13062 #, fuzzy msgid "Connect / Disconnect from Nav Config port" msgstr "Maak/verbreek verbinding met Talker server" #: src/dialogs/confdialog.cxx:13069 msgid "Synop" msgstr "Synop" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "SYNOP naar ADIF" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" "Decodeert SYNOP berichten (bijv. Deutsche Wetterdienst) naar ADIF logbestand" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "SYNOP naar KML" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Decodeert SYNOP berichten (bijv. Deutsche Wetterdienst) naar KML " "bestanden(bijv. Google Earth)" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "SYNOP en tekst afwisselen" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Wissel tekst af met gedecodeerde SYNOP berichten" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 #, fuzzy msgid "Serial Interface" msgstr "Gebruikersinterface" #: src/dialogs/confdialog.cxx:13158 #, fuzzy msgid "FSK port" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:13206 #, fuzzy msgid "Auto CRLF" msgstr "Automatische terugloop (CR-LF)" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 #, fuzzy msgid "Diddle char" msgstr "Symbool voor test" #: src/dialogs/confdialog.cxx:13239 #, fuzzy msgid "Diddle character" msgstr "Aantal bits per karakter" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 #, fuzzy msgid "Unshift on space" msgstr "Lettersymbolen na spatie (UOS)" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "Schakel DSP in voor decoder" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "Startsignaal-detectie" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Herken THOR startsignaal (preamble)\n" "Wis ontvangstbuffer" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "Soft-symbol decoding" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Gebruik soft-decision decoding voor symbooldetectie\n" "Ondersteunt soft-bit decoding" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "Soft-bit decoding" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Gebruik soft-bit Viterbi decodeeralgoritme voor verbeterde foutcorrectie " "(FEC)\n" "Werkt het best wanneer soft-symbol decoding ingeschakeld is" #: src/dialogs/confdialog.cxx:13402 #, fuzzy msgid "Nav" msgstr "WAV" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "Schrijf Navtex berichten naar ADIF bestand" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "Schrijf Navtex berichten naar KML bestand" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" "Schrijft berichten naar bestand met Keyhole Markup Language opmaak (Google " "Earth, Marble, Gaia, etc.)" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "Schrijf Wefax berichten naar ADIF bestand" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "" "Verzonden en ontvangen faxberichten worden weggeschreven naar het ADIF " "bestand" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "Geïntegreerde Wefax interface" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "Toon TX en RX in Fldigi hoofdscherm.\n" "Vereist herstart van Fldigi." #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "Frequentieshift (800 Hz)" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "Standaard 800 Hz (Deutsche Wetterdienst gebruikt 850 Hz)" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "Maximum aantal regels voor ontvangen fax (5000)" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "Maximum aantal rijen voor een ontvangen faxafbeelding" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "Map voor opslaan fax-afbeeldingen" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "Map..." #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "Verberg scherm voor zenden" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "Standaard scherm voor zenden verbergen" #: src/dialogs/confdialog.cxx:13475 msgid "Save image as monochrome file" msgstr "Bewaar afbeelding als monochroom bestand" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "Bewaar fax-afbeelding als PNG bestand met grijswaarden" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "Trx" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 #, fuzzy msgid "flrig" msgstr "flrig:" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 #, fuzzy msgid "Addr" msgstr "Adres:" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "IP adres poortnummer" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "Opnieuw verbinden" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "Gebruik RigCAT" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "RigCAT gebruiken voor besturing zendontvanger" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "RigCAT bestand met definities:" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "Gebruik 'Open' om bestand met omschrijvingen te kiezen" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "Kies RigCAT definitiebestand" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Poort:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "Pogingen" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "Aantal pogingen voordat RigCAT uitgeschakeld wordt" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "Interval tussen pogingen (ms)" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "Tijd tussen pogingen in ms" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "Wachttijd (ms)" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "Wacht op reactie op volgende commando" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "Bitrate (b/s):" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "Aantal stopbits" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "Initialiseren" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "Initialiseer RigCAT besturing" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "Commando's worden herhaald" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "" "Seriële interface van zendontvanger herhaalt elk karakter dat gestuurd wordt" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "CAT commando voor PTT" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "Voor PTT een CAT commando gebruiken (niet via hardware)" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "Gebruik RTS voor PTT" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "PTT is aangesloten op RTS" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "Gebruik DTR voor PTT" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "PTT is aangesloten op DTR" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "RTS +12 V" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "RTS beginwaarde" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "DTR +12 V" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "DTR beginwaarde" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "RTS/CTS flow control" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "Zendontvanger gebruikt RTS/CTS voor pauzeren/hervatten dataverkeer" #: src/dialogs/confdialog.cxx:13735 #, fuzzy msgid "Restore UART Settings on Close" msgstr "Herstel instellingen bij sluiten" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "Zet de seriële poort-instellingen terug" #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "VSP inschakelen" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Virtuele Seriële Poort emulator - onderdrukt waarschuwingen" #: src/dialogs/confdialog.cxx:13747 msgid "Init delay (ms)" msgstr "Wachttijd initialisatie (ms)" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "Wacht op reactie op eerste CAT commando" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "Gebruik Hamlib" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "Hamlib gebruiken voor besturing zendontvanger" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "TRX:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "Aantal pogingen voordat besturing gestopt wordt" #: src/dialogs/confdialog.cxx:13823 #, fuzzy msgid "Retry Interval (msec)" msgstr "Interval (ms)" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "Wachttijd tussen pogingen in ms" #: src/dialogs/confdialog.cxx:13840 #, fuzzy msgid "Write delay (msec)" msgstr "Wachttijd (ms)" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "Wachttijd in ms tussen opeenvolgende commando's" #: src/dialogs/confdialog.cxx:13857 #, fuzzy msgid "Post write delay (msec)" msgstr "Wachttijd na commando (ms)" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "Wachttijd in ms voordat antwoord gelezen wordt" #: src/dialogs/confdialog.cxx:13909 #, fuzzy msgid "Polling Interval (msec)" msgstr "Interval (ms)" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT via CAT commando" #: src/dialogs/confdialog.cxx:13929 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT wordt geactiveerd via een CAT commando (niet via hardware)" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "DTR +12 V" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "RTS +12 V" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "Zendontvanger vereist RTS/CTS flow control" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "XON/XOFF flow control" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "Zendontvanger vereist XON/XOFF flow control" #: src/dialogs/confdialog.cxx:13965 #, fuzzy msgid "CW is LSB mode" msgstr "CW is LSB" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:13977 #, fuzzy msgid "Mode delay (msec)" msgstr "Wachttijd (ms)" #: src/dialogs/confdialog.cxx:13978 #, fuzzy msgid "Delay NN msec after executing mode change" msgstr "Wacht NN ms voor loslaten PTT" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "Zijband" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "Geavanceerde instellingen:" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Extra instellingen met\n" "opmaak: parameter=waarde ..." #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "Initialiseer Hamlib besturing" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "PTT via hardware" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "PTT toon op rechter audiokanaal" #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Kan samen met andere PTT instellingen gebruikt worden" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "Hardware PTT aansluiting" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "Gebruik afzonderlijke seriële poort voor PTT" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "Gebruik parallelle poort voor PTT" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "Gebruik uHRouter PTT" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "Gebruik RTS" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "RTS is verbonden met PTT" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "Startspanning op RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "Gebruik DTR" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "DTR is verbonden met PTT" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "Startspanning op DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "Initialiseer de hardware PTT interface" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "PTT vertraging (geldt voor alle CAT/PTT varianten)" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "PTT vertraging bij begin uitzending" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "Wacht NN ms met audio" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "PTT vertraging bij einde uitzending" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "Wacht NN ms voor loslaten PTT" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 #, fuzzy msgid "Select pin number" msgstr "Kies regel" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 #, fuzzy msgid "Select PTT on state" msgstr "Kies regel" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "Apparaten" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "Gebruik OSS audioserver" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "Kies apparaat" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "Gebruik PortAudio server" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "Opnemen:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "Apparaat voor ontvangst" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "Afspelen:" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "Apparaat voor zenden" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "Gebruik PulseAudio server" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "Server tekenreeks:" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Laat veld leeg of kijk op\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "Alleen file I/O" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "Geen audioapparaat beschikbaar (of test)" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "Instellingen" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "Sample snelheid" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "Opnemen" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Forceer sample snelheid. Kies \"Native\" als \"Auto\"\n" "niet goed werkt met je geluidskaart." #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "Converter" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "Kies resampler type voor offset correctie" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "Correcties" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "Correctie geluidskaart voor ontvangst" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "Correctie geluidskaart voor zenden" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "TX offset" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Verschil tussen Rx & Tx frequenties (TRX offset)" #: src/dialogs/confdialog.cxx:14605 msgid "Right channel" msgstr "Rechterkanaal" #: src/dialogs/confdialog.cxx:14607 #, fuzzy msgid "Transmit Usage" msgstr "Zendsignaal" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "Modemsignaal op linker- en rechterkanaal" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "De linker- en rechterkanalen bevatten beiden geluid" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "Verwissel linker- en rechterkanaal" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 msgid "Software reversal of left-right audio channels" msgstr "Linker- en rechteraudiokanaal verwisselen in software" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Deze instellingen staan op andere tabbladen.\n" "Ze zijn hier weergegeven voor het gemak.\n" "De instellingen kunnen op beide plekken worden aangepast.\n" "..." #: src/dialogs/confdialog.cxx:14627 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "1000 Hz toon indien PTT is ingeschakeld\n" "Kan in combinatie met een andere vorm van PTT besturing worden gebruikt" #: src/dialogs/confdialog.cxx:14633 msgid "CW QSK signal on right channel" msgstr "CW QSK signaal op rechterkanaal" #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Genereer 1000 Hz blokgolf op rechterkanaal" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK op rechter audiokanaal" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "Maak 1000 Hz blokgolf op rechterkanaal" #: src/dialogs/confdialog.cxx:14649 #, fuzzy msgid "Receive Usage" msgstr "Ontvangen" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "WAV" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "Samplefrequentie voor WAV schrijven" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "Kies bitrate uit de lijst" #: src/dialogs/confdialog.cxx:14681 #, fuzzy msgid "Record both channels" msgstr "Verwissel linker- en rechterkanaal" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "" #: src/dialogs/confdialog.cxx:14692 #, fuzzy msgid "Regex Match in Browser" msgstr "Verkenner" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 #, fuzzy msgid "Sound:" msgstr "Geluidskaart" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 msgid "Test" msgstr "Test" #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 #, fuzzy msgid "flmsg interface" msgstr "Gebruikersinterface" #: src/dialogs/confdialog.cxx:14753 #, fuzzy msgid "flmsg received wav" msgstr "RST ontvangen" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "RsID detection" msgstr "RsID ontvangst" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "Alleen kennisgeving" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Schakel in voor notificatie bij RsID\n" "zonder wijziging van modem en frequentie" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "Ontvangstmodes" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "Doorzoekt doorlaatband" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "AAN - doorzoek gehele audiospectrum\n" "OFF - beperk zoeken tot +/- 200 Hz" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "Markeer vorige freq/mode" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Voeg RX markering in voor het\n" "wijzigen van frequentie en modem" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "Schakelt detector uit" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "Na ontvangst van RsID wordt verdere detectie uitgeschakeld" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "Sta fouten toe" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Laag = 0 fouten\n" "Middel = 1 fout\n" "Hoog = 2 fouten" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "Middel" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "Squelch open (s)" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "Open squelch aantal seconden bij RsID detectie" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "Schakel waarschuwingsscherm uit" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "RsID waarschuwing niet tonen" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "TX frequentie-lock behouden" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "TX frequentie vasthouden (Lk) bij wisselen naar RsID RX frequentie" #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "Schakel frequentiewijzingen uit" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "Niet automatisch wisselen naar RsID RX frequentie" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" "De RsID notificatie kan worden geconfigureerd\n" "via het \"Notificaties\" instellingenscherm." #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "Toon vóór signaal" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "seconden" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "Use for triggering amplifier carrier detect" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "Zendmodes" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "ID na einde uitzending" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "Voeg RsID signaal toe achter uitzending" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "Video" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "Video Preamble ID" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "Transmit mode ID" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "Waterval video ID" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "Transmit video text" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "Waterval video text" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Beperkt tot enkele tekens,\n" "zoals bij CQEM of IOTA etc." #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "Gebruik klein lettertype" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "AAN - klein lettertype\n" "UIT - groot lettertype" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "Tekens/rij:" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "Stel het aantal tekens per rij in" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "500 Hz limiet" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "Mode met beperking" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "Video ID modes" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "CW Postamble ID" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "Verzend roepnaam" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "Verzend roepnaam in CW na elke uitzending" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "Snelheid (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "Zend met deze snelheid" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "CW ID modes" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Diversen" #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "Langzame CPU (minder dan 700 MHz)" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "Maak actief indien de computer niet goed decodeert" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "NBEMS databestand interface" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Bestanden aanmaken voor gebruik met extern programma" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "Open berichtenmap" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "Open NBEMS map na successvolle herkenning" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "Ontvangst van 'flmsg' bestanden" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "Open met 'flmsg'" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "Open bericht met 'flmsg'" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "Open met browser" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "Open bestand met standaard browser" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "Voer het complete pad in voor 'flmsg'" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "Locatie 'flmsg'" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "Timeout (s)" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "Berichtherkenning stopt na NN seconden inactiviteit" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "Mail server instellingen" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "Carrier frequentie (Hz)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "Standaard audiofrequentie voor ontvangen/zenden" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "Zoekbereik (Hz)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "Luister naar signalen binnen dit bereik" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "AFC bereik (Hz)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "Beperk AFC tot dit bereik" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "Terug naar carrier" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "Ga terug naar carrierfrequentie bij geen signaal" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "Rapporteer gemiddelde S/N van ARQ frames" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "Spotten" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "Spot roepnamen in gedecodeerde tekst automatisch" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "Controleer alle ontvangen tekst" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "Stuur ontvangstrapport bij loggen QSO" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "Stuur rapport alleen als QSO is gelogd" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "Vermeld frequentie (gebruik alleen bij actieve TRX besturing!)" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "Stuur frequentie van de zendontvanger mee met spot" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Schakel spotting uit als de signaalverkenner(s) niet zichtbaar zijn." #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Vink aan om CPU gebruik bij PSK en RTTY te beperken." #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "Server:" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "Serveradres PSK Reporter" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "Poort:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "UDP poortnummer" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "Initialiseer verbinding" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "Sweet Spot" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "Ideale audiofrequentie voor CW" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "Ideale audiofrequentie voor RTTY" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "PSK e.a." #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "Ideale audiofrequentie voor PSK en andere modes" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "Start nieuw modem altijd op deze audiofrequenties" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - start at default\n" "OFF - keep current wf cursor position" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "K3 A1A configuratie" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "CW is LSB" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Maak actief voor de Elecraft K3\n" "Niet van toepassing voor andere zendontvangers" #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "Tekst I/O" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "Talker Socket (alleen MS)" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "Maak/verbreek verbinding met Talker server" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Automatisch verbinden wanneer Fldigi start (server moet beschikbaar zijn)" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "Schrijf ontvangen tekst naar bestand" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "Schrijf ontvangen tekst naar bestand" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "Ontvangen tekst wordt naar bestand 'textout.txt' geschreven" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "Decodeer DTMF tonen" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "Decodeer ontvangen DTMF tonen" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "Zoekvraag voor weerinformatie" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "METAR station ID" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "bijvoorbeeld KMDQ voor\n" "Huntsville-Madison Executive Airport, AL (USA)" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "Volledig rapport" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "Voeg volledig METAR rapport toe" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "Locatie METAR station" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "Voeg geopolitieke naam van het station toe" #: src/dialogs/confdialog.cxx:15524 msgid "Conditions" msgstr "Omstandigheden" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "Huidige weersomstandigheden" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "Rapporteer Fahrenheit" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "Celsius" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "Rapporteer Celsius" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "Mijl/uur" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "Rapporteer mijlen per uur" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "km/uur" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "Rapporteer kilometers per uur" #: src/dialogs/confdialog.cxx:15554 #, fuzzy msgid "Inches Hg." msgstr "Inch Mg" #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "Rapporteer aantal inches kwik" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "millibar" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "Rapporteer millibars" #: src/dialogs/confdialog.cxx:15566 msgid "Temperature" msgstr "Temperatuur" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "Windsnelheid/richting" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "Luchtdruk" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "Zoek op web" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "Default URL" msgstr "Standaard" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "Map KML bestanden" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "Waar gegenereerde KML bestanden worden opgeslagen." #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "KML root bestand" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Minimum afstand voor splitsen van aliassen (meter)" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Minimum afstand voor splitsen van alias nodes (meters)" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "Bewaartermijn voor gegevens in uren (0 voor geen grens)" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" "Aantal uren dat gegevens bewaard worden voor elke node. Nul betekent dat " "alles bewaard blijft." #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "KML verversingsinterval (s)" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Verversingsinterval gebruikt in KML bestand (seconden)" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "Weergavestijl KML ballon" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "KML ballon als tekst, HTML, tabellen of matrices." #: src/dialogs/confdialog.cxx:15658 msgid "Command run on KML creation" msgstr "Gestart commando bij aanmaken KML bestand" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Commando gestart zodra KML bestanden gegenereerd worden. Subprocessen worden " "eenmaal gestart en herstart indien nodig." #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "Testcommando" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "Voer commando uit op KML bestanden." #: src/dialogs/confdialog.cxx:15669 msgid "Change dir..." msgstr "Wijzig map..." #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "Kies map voor opslag KML documenten" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "Wis KML gegevens nu !" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Wist KML documenten en daarmee de Google Earth weergave." #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "Wis bij starten" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "Wist KML bestanden bij starten programma." #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "Web" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "Roepnamen zoeken" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "Opzoeken via web browser" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "Geen gebruik maken van roepnaam zoeken via web browser" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "PTT is aangesloten op RTS" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "Bezoek QRZ website" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "Bezoek HamCall website" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "Bezoek HamQTH website" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:15750 #, fuzzy msgid "Hamcall" msgstr "HamCall.net" #: src/dialogs/confdialog.cxx:15763 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15776 #, fuzzy msgid "Callook" msgstr "Roepnamen zoeken" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "Opzoeken in database" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "Geen gebruik maken van roepnamendatabase" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "QRZ CD-ROM" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "Gebruik CD of kopie op harde schijf" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Betaald QRZ online abonnement\n" "vereist voor toegang" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "HamCall.net" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Betaald HamCall abonnement\n" "vereist voor toegang" #: src/dialogs/confdialog.cxx:15820 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "Gratis dienst met dank aan OK" #: src/dialogs/confdialog.cxx:15826 #, fuzzy msgid "Callook.info" msgstr "Roepnamen zoeken" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Zoek met Callook.info (gratis dienst, alleen US roepnamen)" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "bijvoorbeeld: /home/dave/CALLBK/ (Linux) of C:/CALLBK/ (Windows)\n" "Leeg laten om te zoeken naar de database" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "Gebruiker" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "Wachtwoord" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "Toon wachtwoord" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "Voeg adres toe aan notities" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "eQSL" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "Login naam" #: src/dialogs/confdialog.cxx:15917 msgid "User ID" msgstr "Gebruiker" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "Login wachtwoord" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "QTH Nickname" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:15971 msgid "Options" msgstr "Opties" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "Verstuur zodra gelogd (log knop, , )" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "Automatisch uploaden van gegevens" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "Gebruik datum/tijd einde verbinding voor logboek" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "Standaard wordt datum/tijd begin gebruikt" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Toon minder modes" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 msgid "Default message" msgstr "Standaardbericht" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "Bericht om te versturen met etc." #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "Tekstlabels ({} scheidingstekens)" #: src/dialogs/confdialog.cxx:16010 msgid " {CALL} other ops call sign" msgstr " {CALL} roepnaam tegenstation" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr " {MODE} volledige mode / submode" #: src/dialogs/confdialog.cxx:16016 msgid "{NAME} other ops name" msgstr "{NAME} naam operator tegenstation" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "Deze labels kunnen ook worden gebruikt bij " #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:16030 #, fuzzy msgid "Enter full path-filename for tqsl executable" msgstr "Voer het volledige pad in voor Flnet" #: src/dialogs/confdialog.cxx:16044 #, fuzzy msgid "Your tqsl login password" msgstr "Login wachtwoord" #: src/dialogs/confdialog.cxx:16059 #, fuzzy msgid "Use password for tqsl access" msgstr "Wachtwoord" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:16065 #, fuzzy msgid "Location" msgstr "Locator" #: src/dialogs/confdialog.cxx:16066 #, fuzzy msgid "tqsl station location" msgstr "Locatie METAR station" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 msgid "Locate" msgstr "Locatie..." #: src/dialogs/confdialog.cxx:16081 #, fuzzy msgid "Locate tqsl executable" msgstr "Bepaal locatie Flmsg executable" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:16096 #, fuzzy msgid "Export" msgstr "Exporteren..." #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 #, fuzzy msgid "Check" msgstr "Alles" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16108 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:16125 #, fuzzy msgid "Use this tqsl station location" msgstr "Locatie METAR station" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "Start programma's automatisch samen met Fldigi" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:16160 msgid "Enter full path-filename for flrig" msgstr "Voer het volledige pad in voor Flrig" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "Bepaal locatie Flmsg executable" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16178 msgid "Enter full path-filename for flamp" msgstr "Voer het volledige pad in voor Flamp" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "Bepaal locatie Flamp executable" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16196 msgid "Enter full path-filename for flnet" msgstr "Voer het volledige pad in voor Flnet" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "Bepaal locatie Flnet executable" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16214 msgid "Enter full path-filename for fllog" msgstr "Voer het volledige pad in voor Fllog" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "Bepaal locatie Fllog executable" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 msgid "Enter full path-filename for external program" msgstr "Voer complete pad in voor externe applicatie" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "Bepaal locatie #1 executable" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "Bepaal locatie #2 executable" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "Bepaal locatie #3 executable" #: src/dialogs/confdialog.cxx:16285 msgid "" "Enable\n" "-" msgstr "" "Schakel in\n" "-" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "Schakel in wanneer Fldigi wordt gestart" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "Start Flrig" #: src/dialogs/confdialog.cxx:16333 msgid "Start flamp" msgstr "Start Flamp" #: src/dialogs/confdialog.cxx:16337 msgid "Start flnet" msgstr "Start Flnet" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "Start Fllog" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "Start prog1" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "Start prog2" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "Start prog3" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "Bevriezen" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "Vink aan om instellingen te bevriezen" #: src/dialogs/confdialog.cxx:16372 msgid "Enable ARQ" msgstr "Schakel ARQ in" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "Gebruikt voor PSKMail en familie van Fldigi programma's" #: src/dialogs/confdialog.cxx:16380 msgid "Enable KISS" msgstr "Schakel KISS in" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "Gebruikt voor BPQ32" #: src/dialogs/confdialog.cxx:16388 #, fuzzy msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Activeer ARQ voor programma's die TCP en het Fldigi ARQ protocol " "ondersteunen.\n" "Activeer KISS voor programma's die UDP en het TNC-2 KISS protocol " "ondersteunen.\n" "Slechts één interface (ARQ/KISS) kan tegelijkertijd actief zijn.\n" "Wijziging van IP adres en portnummer vereist een herstart van Fldigi." #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "I/O" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "Poortnummer (uit) indien hetzelfde IP adres wordt gebruikt" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "Schakel in wanneer beide programma's hetzelfde IP adres gebruiken" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "Restart" msgstr "Start" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "Start" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "AX.25 decoderen" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "Decodeer AX.25 packets naar leesbare vorm" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16564 #, fuzzy msgid "XML" msgstr "KML" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16659 #, fuzzy msgid "fllog" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16697 #, fuzzy msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "Berichtherkenning stopt na NN seconden inactiviteit" #: src/dialogs/confdialog.cxx:16707 msgid "Enable Busy Channel" msgstr "Schakel 'busy channel' in" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16726 #, fuzzy msgid "Modem Bandwidth Margins " msgstr "Mode met beperking" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16753 msgid "Enable CSMA" msgstr "Schakel CSMA in" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 #, fuzzy msgid "Slot Time" msgstr "Tijd" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16781 #, fuzzy msgid "Transmit Data Delay" msgstr "Zendsignaal" #: src/dialogs/confdialog.cxx:16782 #, fuzzy msgid "Idle transmit before data sent" msgstr "Stuur frequentie van de zendontvanger mee met spot" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 #, fuzzy msgid "MilliSeconds" msgstr "seconden" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16809 #, fuzzy msgid "Enable Histogram" msgstr "Schrijf ontvangen tekst naar bestand" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16831 #, fuzzy msgid "PSM Attenuate" msgstr "KPSQL demping" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16845 #, fuzzy msgid "Default Settings" msgstr "" "Standaard testtekst is:\n" " \"" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "Beginwaarden" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Tekstkleur" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Lettertype:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Grootte:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Lettertypes inlezen..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Databestanden" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Bijwerken databestanden" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Databestanden in tabelvorm" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Databestand" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Opslag databestanden" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" "Geselecteerde lokale databestanden bijwerken met inhoud uit de bewaarplaats" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Lokale bestanden wordt verwijderd indien geselecteerd" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Gebeurtenis" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Actief" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filter" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "DXCC entiteit" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Toon DXCC entiteiten" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Niet eerder gewerkt" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "LotW gebruiker" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "eQSL gebruiker" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicaten" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Negeer duplicaten" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "in:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Tijd (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Actie" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Limiet voor trigger (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Minimale verstreken tijd tussen gebeurtenissen" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Toon waarschuwing:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Voeg standaardtekst in" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Verberg scherm na (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Voeg toe aan RX tekst:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Voeg toe aan TX tekst:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Toon macro editor" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Start toepassing:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "DXCC entiteiten" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Zoek land:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Toets ENTER om zoekopdracht te vervolgen" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Zoek prefix:" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "Instellingen voor exporteren" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "Selecteer records voor export" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "Alles" #: src/logbook/lgbook.cxx:622 msgid "Start Date" msgstr "Startdatum" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "Startdatum voor export" #: src/logbook/lgbook.cxx:636 msgid "Stop Date" msgstr "Einddatum" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "Einddatum (inclusief) voor export" #: src/logbook/lgbook.cxx:650 msgid "select by date" msgstr "Selecteer op datum" #: src/logbook/lgbook.cxx:651 #, fuzzy msgid "Enable to select date range" msgstr "Vink aan om datumreeks te selecteren" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "Kies velden voor export" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "Freq" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "QSO datum AAN" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "QSO datum UIT" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "Tijd AAN" #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "Tijd UIT" #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "TX zendvermogen" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "RST verzonden" #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "RST ontvangen" #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "QTH" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 #, fuzzy msgid "Station Call" msgstr "Station" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 #, fuzzy msgid "Station QTH" msgstr "Station" #: src/logbook/lgbook.cxx:723 #, fuzzy msgid "Station LOC" msgstr "Station" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Notitie" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "Dat. QSL ontv." #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "Dat. QSL verz." #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "Dat. QSL ontv." #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "Dat. QSL verz." #: src/logbook/lgbook.cxx:750 #, fuzzy msgid "LoTW rcvd date" msgstr "Dat. QSL ontv." #: src/logbook/lgbook.cxx:753 #, fuzzy msgid "LoTW sent date" msgstr "Dat. QSL verz." #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "Volgnr. ontvangen" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "Volgnummer verzonden" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "Verz. uitwisseling" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:795 #, fuzzy msgid "FD section" msgstr "RsID ontvangst" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 #, fuzzy msgid "CW SS Check" msgstr "Alles" #: src/logbook/lgbook.cxx:809 #, fuzzy msgid "CW SS Section" msgstr "Actie" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "Logboek" #: src/logbook/lgbook.cxx:840 msgid "Date On" msgstr "Datum op" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "Datum start QSO" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "Begintijd" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "Tijd start QSO" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "Gewerkte roepnaam" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "Gewerkte operator" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "In" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "RST ontvangen" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "Items" #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "Aantal items in logboek" #: src/logbook/lgbook.cxx:913 msgid "Date Off" msgstr "Datum van" #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "Datum einde QSO" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "Eindtijd" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "Tijd einde QSO" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "Freq." #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "Frequenctie in MHz" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "Gebruikte mode" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "Pwr" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "Gebruikte zendvermogen (W)" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "Locator" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "Maidenhead locator gewerkte station" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "Uit" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "RST verzonden" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "Stad gewerkte station" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "Staat" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "Staat (USA) gewerkte station" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "Prov." #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "Provincie gewerkte station" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "Land gewerkte station" #: src/logbook/lgbook.cxx:1048 #, fuzzy msgid "QSL" msgstr "eQSL" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "QSL ontvangen" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "Datum QSL ontvangen" #: src/logbook/lgbook.cxx:1062 #, fuzzy msgid "EQSL-rcvd" msgstr "QSL ontvangen" #: src/logbook/lgbook.cxx:1075 #, fuzzy msgid "LOTW-rcvd" msgstr "QSL ontvangen" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "QSL verzonden" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "QSL verzonden op deze datum" #: src/logbook/lgbook.cxx:1101 #, fuzzy msgid "EQSL-sent" msgstr "QSL verzonden" #: src/logbook/lgbook.cxx:1114 #, fuzzy msgid "LOTW-sent" msgstr "QSL verzonden" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "QSL route van gewerkt station" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "Islands On The Air (IOTA)" #: src/logbook/lgbook.cxx:1181 msgid "Cont'" msgstr "Cont'" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "DXCC aanduiding" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "Notities" #: src/logbook/lgbook.cxx:1236 #, fuzzy msgid "My Station" msgstr "Station" #: src/logbook/lgbook.cxx:1274 #, fuzzy msgid "Station Locator" msgstr "Station tweemaal gehoord" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "Volgnr. uit" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 #, fuzzy msgid "Contest seral # sent" msgstr "Verzonden contest volgnr." #: src/logbook/lgbook.cxx:1302 #, fuzzy msgid "Exch Out" msgstr "Verz. uitwisseling" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "Contest uitwisseling verzonden" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "Volgnummer ontvangen" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "Ontvangen contest volgnr." #: src/logbook/lgbook.cxx:1326 #, fuzzy msgid "Exch In" msgstr "Uitwisseling ontv." #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "Contest uitwisseling ontvangen" #: src/logbook/lgbook.cxx:1339 #, fuzzy msgid "Field Day class received" msgstr "Functie muiswiel" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 #, fuzzy msgid "Field Section received" msgstr "Functie muiswiel" #: src/logbook/lgbook.cxx:1363 #, fuzzy msgid "Operators age received" msgstr "Naam operator" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 #, fuzzy msgid "Operating band" msgstr "Operator" #: src/logbook/lgbook.cxx:1399 #, fuzzy msgid "Check value received" msgstr "Contest uitwisseling ontvangen" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 #, fuzzy msgid "Ser NoR" msgstr "Volgnr. uit" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 #, fuzzy msgid "Sent troop number" msgstr "Kies regel" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 #, fuzzy msgid "Received troop number" msgstr "Ontvangen serienummer" #: src/logbook/lgbook.cxx:1492 #, fuzzy msgid "Name-S" msgstr "Naam" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 #, fuzzy msgid "Name-R" msgstr "Naam" #: src/logbook/lgbook.cxx:1505 #, fuzzy msgid "Received scout name" msgstr "Ontvangen" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "Zoek call" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "Zoek op deze roepnaam" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "Zoek vorige" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "Zoek volgende" #: src/logbook/lgbook.cxx:1549 #, fuzzy msgid "Retrieve" msgstr "Pogingen" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "Ophalen voor actief modem gebruik" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "Nieuw item / item opslaan" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "Huidige item bijwerken" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "Verwijder huidige item" #: src/logbook/lgbook.cxx:1583 #, fuzzy msgid "File:" msgstr "&Bestand" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "Datum" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "Tijd" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "Cabrillo instellingen" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "Kies Cabrillo contest en velden" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "Datum QSO" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Besturing zendontvanger\n" #~ "via extern programma\n" #~ "met XML-RPC protocol." #~ msgid "Use XML-RPC program" #~ msgstr "Gebruik XML-RPC besturing" #~ msgid "Experimental" #~ msgstr "Experimenteel" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Initialiseer XML-RPC besturing" #~ msgid "Enter a CALL !" #~ msgstr "Voer een roepnaam in!" #~ msgid "Add current frequency" #~ msgstr "Voeg huidige frequentie toe" #~ msgid "Clear list" #~ msgstr "Wis lijst" #~ msgid "Delete from list" #~ msgstr "Verwijder van lijst" #~ msgid "Select operating parameters" #~ msgstr "Kies werkinstellingen" #~ msgid "Frq" #~ msgstr "Freq" #~ msgid "frequency kHz" #~ msgstr "frequentie kHz" #~ msgid "On" #~ msgstr "Op" #~ msgid "Press to update QSO start time" #~ msgstr "Kies om begintijd QSO bij te werken" #~ msgid "Off" #~ msgstr "Uit" #~ msgid "QSO end time" #~ msgstr "QSO eindtijd" #~ msgid "call sign" #~ msgstr "roepnaam" #~ msgid "Op" #~ msgstr "Op" #~ msgid "Azimuth" #~ msgstr "Azimuth" #, fuzzy #~ msgid "QTH City" #~ msgstr "Stad" #~ msgid "US State" #~ msgstr "Staat (US)" #~ msgid "Can. Province" #~ msgstr "Provincie (CA)" #~ msgid "Maidenhead Locator" #~ msgstr "Maidenhead Locator" #~ msgid "Sent serial number (read only)" #~ msgstr "Stuur volgnummer (alleen-lezen)" #, fuzzy #~ msgid "Received FD class" #~ msgstr "RST ontvangen" #, fuzzy #~ msgid "Received FD section" #~ msgstr "Ontvangen serienummer" #, fuzzy #~ msgid "Received CQ zone" #~ msgstr "Ontvangstmodes" #, fuzzy #~ msgid "Received State/Prov" #~ msgstr "RST ontvangen" #, fuzzy #~ msgid "Received serno" #~ msgstr "Ontvangen" #, fuzzy #~ msgid "SS Check" #~ msgstr "Alles" #, fuzzy #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "Klik links - selecteer\n" #~ "Klik rechts - wis regel" #~ msgid "Press to update" #~ msgstr "Klik om bij te werken" #~ msgid "Other call" #~ msgstr "Andere roepnaam" #~ msgid "Received RST" #~ msgstr "RST ontvangen" #~ msgid "Sent RST" #~ msgstr "RST verzonden" #~ msgid "Nm" #~ msgstr "Naam" #~ msgid "Other name" #~ msgstr "Andere naam" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Klik links - uitvoeren\n" #~ "Functietoets - uitvoeren\n" #~ "Klik rechts - bewerken" #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Klik links - uitvoeren\n" #~ "Shift-Functietoets - uitvoeren\n" #~ "Klik rechts - bewerken" #~ msgid "Shift-key macro set" #~ msgstr "Shift-toets macro instellen" #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "Klik links - selecteer\n" #~ "Klik rechts - wis regel" #~ msgid "seek - regular expression" #~ msgstr "zoek - regular expression" #, fuzzy #~ msgid "Select FSQ station" #~ msgstr "Kies regel" #, fuzzy #~ msgid "Stations Heard" #~ msgstr "Station tweemaal gehoord" #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Klik links - uitvoeren\n" #~ "Functietoets - uitvoeren\n" #~ "Klik rechts - bewerken" #~ msgid "Primary macro set" #~ msgstr "Primaire set macro's" #~ msgid "Aborted" #~ msgstr "Afgebroken" #~ msgid "Timed out" #~ msgstr "Wachttijd verstreken" #~ msgid "Serial number" #~ msgstr "Volgnummer" #, fuzzy #~ msgid "Contest Exchanges" #~ msgstr "Contest uitwisseling verzonden" #, fuzzy #~ msgid "Send Xchg" #~ msgstr "Stuur afbeelding" #, fuzzy #~ msgid "Contest Logging" #~ msgstr "Contest uitwisseling in" #, fuzzy #~ msgid "Generic" #~ msgstr "Algemeen" #, fuzzy #~ msgid "Use generic contest fields" #~ msgstr "&Contest velden" #, fuzzy #~ msgid "Use Field Day Contest Fields" #~ msgstr "Kies Cabrillo contest en velden" #, fuzzy #~ msgid "CQWW RTTY" #~ msgstr "RTTY" #, fuzzy #~ msgid "Single-click to capture Rx word" #~ msgstr "Eén klik om op te slaan" #~ msgid "Slow (4 msec)" #~ msgstr "Langzaam (4 ms)" #~ msgid "Fast (2 msec)" #~ msgstr "Snel (2 ms)" #~ msgid "HamQTH.com (free service http://www.hamqth.com)" #~ msgstr "HamQTH.com (gratis dienst http://www.hamqth.com)" #~ msgid "at:" #~ msgstr "op:" #~ msgid "Test Signal - Do NOT use with transmitter" #~ msgstr "Testsignaal - NIET gebruiken met zenden" #~ msgid "dB" #~ msgstr "dB" #~ msgid "Noise on" #~ msgstr "Ruis aan" #, fuzzy #~ msgid "freq-offset" #~ msgstr "TX offset" #~ msgid "FFT filter" #~ msgstr "FFT filter" #~ msgid "FFT / FIR filter" #~ msgstr "FFT / FIR filter" #~ msgid "Scan" #~ msgstr "Scannen" #~ msgid "# scans" #~ msgstr "Aantal scans" #~ msgid "Use relative dB" #~ msgstr "Gebruik relatieve dB" #~ msgid "\tLDT in iso-8601 format" #~ msgstr "\tLDT in iso-8601 opmaak" #~ msgid "\tLocal datetime" #~ msgstr "\tlokale datum en tijd" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT in iso-8601 opmaak" #~ msgid "\tUTC datetime" #~ msgstr "\tUTC datum en tijd" #~ msgid "Operator information" #~ msgstr "Informatie operator" #~ msgid "User Interface - Browser" #~ msgstr "Gebruikersinterface - Verkenner" #~ msgid "User Interface - General" #~ msgstr "Gebruikersinterface - Algemeen" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Gebruikersinterface - Kleuren / Lettertypes" #~ msgid "User Interface - Contest" #~ msgstr "Gebruikersinterface - Contest" #~ msgid "User Interface - Macros" #~ msgstr "Gebruikersinterface - Macro's" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Gebruikersinterface - Waterval" #~ msgid "Rig Control using xml spec file" #~ msgstr "Zendontvanger besturen via CAT volgens XML bestand" #~ msgid "Audio devices" #~ msgstr "Geluidsapparaten" #~ msgid "Callsign database" #~ msgstr "Roepnaamdatabase" #~ msgid "Program to Program Communications" #~ msgstr "Communicatie tussen applicaties" #, fuzzy #~ msgid "Power Signal Monior" #~ msgstr "Toon vóór signaal" #~ msgid "Callsign:" #~ msgstr "Roepnaam:" #~ msgid "Name:" #~ msgstr "Naam:" #~ msgid "QTH:" #~ msgstr "QTH:" #~ msgid "Transmit width" #~ msgstr "Zendbreedte" #~ msgid "# of multiple scans / character line" #~ msgstr "Aantal meervoudige scans per regel" #~ msgid "Halve receive width" #~ msgstr "Halveer ontvangstbreedte" #~ msgid "Compress Rx in time" #~ msgstr "Comprimeer ontvangst in de tijd" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Xmt Width (hidden)" #~ msgid "Revert" #~ msgstr "Terug" #~ msgid "Reset rigCAT interface" #~ msgstr "Reset RigCAT besturing" #~ msgid "Reset hamlib interface" #~ msgstr "Reset Hamlib besturing" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Gebruik MemMap PTT" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Kies seriële poort" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-VIA" #~ msgid "Rig control and logging" #~ msgstr "TRX besturing en log" #~ msgid "Rig control and contest" #~ msgstr "TRX besturing en contest" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Fout bij controle op updates:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Bezoek URL" #~ msgid "Copy URL" #~ msgstr "Kopieer URL" #~ msgid "Controls" #~ msgstr "Instellingen" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #~ msgid "Monitor KISS Pwr Squelch" #~ msgstr "Monitor KISS Pwr Squelch" #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Leeg ADIF logboekbestand %s" #~ msgid "Error reading %s" #~ msgstr "Fout bij lezen van %s" #~ msgid "Quick entry" #~ msgstr "Snelle toegang" #~ msgid "Exchanges" #~ msgstr "Uitwisselingen" #~ msgid "Transmit all text in lower case" #~ msgstr "Verzend alle tekst als kleiner letters" #~ msgid "User Interface - Logging" #~ msgstr "Gebruikersinterface - Logboek" #~ msgid "Client/Server Logbook" #~ msgstr "Client/server logboek" #~ msgid "Enter URL address of server" #~ msgstr "Geef server URL" #~ msgid "Enter Port # assigned to server" #~ msgstr "Geef poortnummer van de server" #~ msgid "Prompt to save macro file when closing" #~ msgstr "Vraag om macrobestand op te slaan bij afsluiten" #~ msgid "Navtex" #~ msgstr "Navtex" #~ msgid "Wefax" #~ msgstr "Wefax" #~ msgid "Mono audio output" #~ msgstr "Mono audio output" #~ msgid "Force output audio to single channel" #~ msgstr "Audio output geforceerd op één kanaal" #~ msgid "End of header string:" #~ msgstr "Einde van koptekst:" #~ msgid "" #~ "Text defining end of METAR header\n" #~ "Typically 'Connection: close'\n" #~ "Used to search for station name" #~ msgstr "" #~ "Tekst die einde METAR header aangeeft\n" #~ "Typisch 'Connection: close'\n" #~ "Gebruikt om naam station te vinden" #~ msgid "QRZ online via default Internet Browser" #~ msgstr "QRZ online via standaard internet browser" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "HamCall online via standaard internet browser" #~ msgid "HamQTH via default Internet Browser" #~ msgstr "HamQTH via standaard internet browser" #~ msgid "IP Address format: nnn.nnn.nnn.nnn" #~ msgstr "IP adres opmaak: nnn.nnn.nnn.nnn" #~ msgid "XMLRPC" #~ msgstr "XMLRPC" #~ msgid "IP Address for KISS interface" #~ msgstr "IP adres voor KISS interface" #~ msgid "Continue After (sec)" #~ msgstr "Ga verder na (s)" #~ msgid "Dual Port" #~ msgstr "Tweevoudige poort" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "Dial" #~ msgstr "Dial" #~ msgid "\tvideo text" #~ msgstr "\tvideotekst" #~ msgid "Raised cosine = Hanning" #~ msgstr "'Hanning' is identiek aan 'raised cosine'" #~ msgid "cty.dat pathname" #~ msgstr "pad naar cty.dat" #~ msgid "Really want to quit?" #~ msgstr "Weet u zeker dat u wilt afsluiten?" #~ msgid "No rig specified" #~ msgstr "Geen TRX aangegeven" #~ msgid "Save image as:" #~ msgstr "Bewaar afbeelding als:" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Voer frequentie in of wijzig met\n" #~ "Links/Rechts/Omhoog/Omlaag/PageUp/PageDown" #~ msgid "Enter Xcvr Freq" #~ msgstr "Voer TRX frequentie in" #~ msgid "Memory Mapped Rig" #~ msgstr "Memory Mapped Rig" #~ msgid "Colors and Fonts" #~ msgstr "Kleuren en lettertypes" #~ msgid "Disp" #~ msgstr "Toon" #~ msgid "Label text" #~ msgstr "Tekst label" #~ msgid "" #~ "Exit prompts active only when File/Exit menu item selected.\n" #~ "Not active if window decoration close button pressed." #~ msgstr "" #~ "Prompt voor afsluiten alleen actief wanneer Bestand -> Afsluiten menu " #~ "item wordt gebruikt.\n" #~ "Niet actief wanneer windows sluiten knop wordt gebruikt." #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Schakel in als je de middelste muisknop niet kunt gebruiken" #~ msgid "One bar (above waterfall)" #~ msgstr "Eén balk (boven waterval)" #~ msgid "One bar (below waterfall)" #~ msgstr "Eén balk (onder waterval)" #~ msgid "FFT latency (scan merging)" #~ msgstr "FFT latency (scan merging)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgid "64-bit (long) interleave" #~ msgstr "64-bit (long) interleave" #~ msgid "Set page width" #~ msgstr "Kies paginabreedte" #~ msgid "after:" #~ msgstr "na:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "track clr" #~ msgstr "Volgkleur" #~ msgid "Create square wave on right channel" #~ msgstr "Genereer blokgolf op rechter audiokanaal" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (hidden)" #~ msgid "Navtex stations file:" #~ msgstr "Bestand Navtex stations:" #~ msgid "Select the rig by name" #~ msgstr "Kies zendontvanger uit de lijst" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forceer instelling voor zijband. Krijgt\n" #~ "effect nadat zendontvanger van mode wisselt." #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgid "Use Memmap" #~ msgstr "Gebruik MemMap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Besturing zendontvanger via 'Memory Mapped Kachina'" #~ msgid "Initialize Memmap interface" #~ msgstr "Initialiseer MemMap besturing" #~ msgid "Mixer" #~ msgstr "Mixer" #~ msgid "OSS mixer" #~ msgstr "OSS Mixer" #~ msgid "Manage mixer" #~ msgstr "Beheer mixer" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Voeg mixer toe aan hoofdscherm" #~ msgid "Select Mixer device" #~ msgstr "Kies mixerapparaat" #~ msgid "Mic In" #~ msgstr "Microfoon in" #~ msgid "Use microphone input" #~ msgstr "Gebruik microfooningang" #~ msgid "Line In" #~ msgstr "Lijningang" #~ msgid "Use Line-In device" #~ msgstr "Gebruik lijningang" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Stel PCM niveau geluidskaart in" fldigi-4.1.06/po/stamp-po0000664000175000017500000000001213515625025012061 00000000000000timestamp fldigi-4.1.06/po/fldigi.pot0000664000175000017500000053554413515625024012406 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: fldigi 4.1.06\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "" #: src/main.cxx:1710 msgid "Bad frequency" msgstr "" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 msgid "Could not make directory " msgstr "" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "" #: src/dialogs/fl_digi.cxx:198 msgid "MFSK Image" msgstr "" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:200 msgid "IFKP Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:201 msgid "Weather Fax Image RX" msgstr "" #: src/dialogs/fl_digi.cxx:202 msgid "Weather Fax Image TX" msgstr "" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "" #: src/dialogs/fl_digi.cxx:2700 msgid "channels != 1" msgstr "" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "" #: src/dialogs/fl_digi.cxx:2858 msgid "Update site not available" msgstr "" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "" #: src/dialogs/fl_digi.cxx:2875 msgid "You are probably running an alpha version " msgstr "" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, c-format msgid "Version %s is available at Source Forge" msgstr "" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "" #: src/dialogs/fl_digi.cxx:4525 msgid "Save changed configuration?" msgstr "" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 msgid "Save log entry?" msgstr "" #: src/dialogs/fl_digi.cxx:4557 msgid "Confirm Quit" msgstr "" #: src/dialogs/fl_digi.cxx:4579 msgid "Confirm quit?" msgstr "" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "" #: src/dialogs/fl_digi.cxx:5865 msgid "FLMSG files..." msgstr "" #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "" #: src/dialogs/fl_digi.cxx:5867 msgid "Data files..." msgstr "" #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "" #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "" #: src/dialogs/fl_digi.cxx:5875 msgid "Config Scripts" msgstr "" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5877 msgid "Generate" msgstr "" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "" #: src/dialogs/fl_digi.cxx:6146 msgid "Operating" msgstr "" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 msgid "Active Modem" msgstr "" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "" #: src/dialogs/fl_digi.cxx:6155 msgid "CPU speed" msgstr "" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "" #: src/dialogs/fl_digi.cxx:6157 msgid "PSKmail" msgstr "" #: src/dialogs/fl_digi.cxx:6158 msgid "PSK reporter" msgstr "" #: src/dialogs/fl_digi.cxx:6159 msgid "Sweet spot" msgstr "" #: src/dialogs/fl_digi.cxx:6160 msgid "Text IO" msgstr "" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 msgid "IO" msgstr "" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 msgid "PSM" msgstr "" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 msgid "Test Signals" msgstr "" #: src/dialogs/fl_digi.cxx:6175 msgid "Contest/Logging" msgstr "" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "" #: src/dialogs/fl_digi.cxx:6190 msgid "View/Hide 48 macros" msgstr "" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6205 msgid "Rig/Log Controls" msgstr "" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "" #: src/dialogs/fl_digi.cxx:6221 msgid "Files" msgstr "" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "" #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "" #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "" #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "" #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "" #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "" #: src/dialogs/fl_digi.cxx:6242 msgid "Field Day Logging" msgstr "" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "" #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "" #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "" #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "" #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "" #: src/dialogs/fl_digi.cxx:8226 msgid "Power Signal Monitor" msgstr "" #: src/dialogs/fl_digi.cxx:9943 msgid "Delete entry?" msgstr "" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "" #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "" #: src/logbook/logsupport.cxx:381 msgid "Create new logbook file" msgstr "" #: src/logbook/logsupport.cxx:404 #, c-format msgid "%s exists, overwrite?" msgstr "" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:497 msgid "Locate binary" msgstr "" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "" #: src/misc/debug.cxx:89 msgid "Error" msgstr "" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "" #: src/misc/debug.cxx:89 msgid "Info" msgstr "" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "" #: src/misc/debug.cxx:105 msgid "KISS control" msgstr "" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "" #: src/misc/macroedit.cxx:78 msgid "\tmy FD class" msgstr "" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:80 msgid "\tmy state" msgstr "" #: src/misc/macroedit.cxx:81 msgid "\tmy ST" msgstr "" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:83 msgid "\tmy CNTY" msgstr "" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "" #: src/misc/macroedit.cxx:93 msgid "\tother State" msgstr "" #: src/misc/macroedit.cxx:94 msgid "\tother Province" msgstr "" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "" #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "" #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "" #: src/misc/macroedit.cxx:112 msgid "\tclear TX pane" msgstr "" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:137 msgid "\tlocal time, default %H%M" msgstr "" #: src/misc/macroedit.cxx:138 msgid "\tzulu time default %H%MZ" msgstr "" #: src/misc/macroedit.cxx:139 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "" #: src/misc/macroedit.cxx:140 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "" #: src/misc/macroedit.cxx:153 msgid "\tcurrent contest serno" msgstr "" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:155 msgid "\tFD class" msgstr "" #: src/misc/macroedit.cxx:156 msgid "\tFD section" msgstr "" #: src/misc/macroedit.cxx:157 msgid "\tcontest class" msgstr "" #: src/misc/macroedit.cxx:158 msgid "
\tARRL section" msgstr "" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr low cutoff filter" msgstr "" #: src/misc/macroedit.cxx:175 msgid "\tvalid xcvr hi cutoff filter" msgstr "" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "" #: src/misc/macroedit.cxx:183 msgid "\tinsert image file" msgstr "" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tpause transmit" msgstr "" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "" #: src/misc/macroedit.cxx:200 msgid "\tsend mode ID; TX start only" msgstr "" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:229 msgid "\tsave current macro file" msgstr "" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:243 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:247 msgid "\tAnalysis CSV on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "" #: src/misc/macroedit.cxx:384 msgid "Test text file" msgstr "" #: src/misc/macroedit.cxx:394 msgid "MFSK image file" msgstr "" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "" #: src/misc/macroedit.cxx:414 msgid "Select wav file" msgstr "" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "" #: src/misc/macroedit.cxx:457 msgid "Macro Text" msgstr "" #: src/misc/macroedit.cxx:462 msgid "Select Tag" msgstr "" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "" #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" #: src/misc/newinstall.cxx:540 msgid "Fldigi configuration wizard" msgstr "" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "" #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "" #: src/soundcard/sound.cxx:170 msgid "Waveform Audio Format\t*.wav\n" msgstr "" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "" #: src/spot/notify.cxx:519 msgid "Add" msgstr "" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "" #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "" #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "" #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "" #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "" #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "" #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "" #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 msgid "County" msgstr "" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:159 msgid "RST(s)" msgstr "" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "" #: src/widgets/FTextRXTX.cxx:161 msgid "Rx Serial #" msgstr "" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 msgid "Section" msgstr "" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 msgid "SS check" msgstr "" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 msgid "SS section" msgstr "" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp state" msgstr "" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp name" msgstr "" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "" #: src/widgets/FTextRXTX.cxx:198 msgid "All entries" msgstr "" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr "" #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "" #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 msgid "A" msgstr "" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 msgid "E" msgstr "" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 msgid "I" msgstr "" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 msgid "N" msgstr "" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 msgid "O" msgstr "" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 msgid "U" msgstr "" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "" #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "" #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, c-format msgid "Executing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:394 msgid "Command Not Found" msgstr "" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:414 msgid "General Error" msgstr "" #: src/config_script/script_parsing.cxx:418 msgid "No Errors" msgstr "" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 msgid "no" msgstr "" #: src/dialogs/confdialog.cxx:330 msgid "yes" msgstr "" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "" #: src/dialogs/confdialog.cxx:8227 msgid "Station / Operator" msgstr "" #: src/dialogs/confdialog.cxx:8230 msgid "Station Callsign:" msgstr "" #: src/dialogs/confdialog.cxx:8231 msgid "Station callsign" msgstr "" #: src/dialogs/confdialog.cxx:8244 msgid "Operator Callsign:" msgstr "" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:8259 msgid "Operator Name:" msgstr "" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "" #: src/dialogs/confdialog.cxx:8287 msgid "Station QTH:" msgstr "" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "" #: src/dialogs/confdialog.cxx:8301 msgid "Station Locator:" msgstr "" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "" #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "" #: src/dialogs/confdialog.cxx:8467 msgid "Detection Level" msgstr "" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:8497 msgid "Even" msgstr "" #: src/dialogs/confdialog.cxx:8498 msgid "Even lines" msgstr "" #: src/dialogs/confdialog.cxx:8503 msgid "Odd" msgstr "" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "" #: src/dialogs/confdialog.cxx:8510 msgid "Select line" msgstr "" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "" #: src/dialogs/confdialog.cxx:8591 msgid "Transmit lower case text" msgstr "" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "" #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "" #: src/dialogs/confdialog.cxx:8618 msgid "Confirm exit" msgstr "" #: src/dialogs/confdialog.cxx:8625 msgid "Check for updates" msgstr "" #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "" #: src/dialogs/confdialog.cxx:8638 msgid "Show TX timer" msgstr "" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "" #: src/dialogs/confdialog.cxx:8658 msgid "QSO" msgstr "" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "" #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "" #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "" #: src/dialogs/confdialog.cxx:8698 msgid "Default RST in to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:8699 msgid "Clear log controls sets RST in to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:8704 msgid "Default RST out to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:8705 msgid "Clear log controls sets RST out to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:8710 msgid "cty.dat folder" msgstr "" #: src/dialogs/confdialog.cxx:8711 msgid "Enter full path-name for cty.dat folder" msgstr "" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "" #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "" #: src/dialogs/confdialog.cxx:8751 msgid "Display logbook read datum at start" msgstr "" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 msgid "Rx Text" msgstr "" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:8801 msgid "Clear log fields - new CALL" msgstr "" #: src/dialogs/confdialog.cxx:8812 msgid "Connect to MacLogger" msgstr "" #: src/dialogs/confdialog.cxx:8817 msgid "Capture Radio Report" msgstr "" #: src/dialogs/confdialog.cxx:8823 msgid "Capture Log Report" msgstr "" #: src/dialogs/confdialog.cxx:8828 msgid "Capture Lookup " msgstr "" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 msgid "Enable UDP log file" msgstr "" #: src/dialogs/confdialog.cxx:8848 msgid "UDP data stream" msgstr "" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8868 msgid "Clear text" msgstr "" #: src/dialogs/confdialog.cxx:8871 msgid "Address" msgstr "" #: src/dialogs/confdialog.cxx:8872 msgid "N3FJP Server IP Address" msgstr "" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 msgid "Port" msgstr "" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" #: src/dialogs/confdialog.cxx:8905 msgid "Enable Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 msgid "Connect" msgstr "" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 msgid "Connected" msgstr "" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 msgid "Contests" msgstr "" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 msgid "State QSO Party" msgstr "" #: src/dialogs/confdialog.cxx:8980 msgid "Text capture order" msgstr "" #: src/dialogs/confdialog.cxx:8981 msgid "Context Notes" msgstr "" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "" #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "" #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "" #: src/dialogs/confdialog.cxx:9029 msgid "? Dup Color" msgstr "" #: src/dialogs/confdialog.cxx:9030 msgid "Left click to select possible dup color" msgstr "" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "" #: src/dialogs/confdialog.cxx:9069 msgid "Contest Exchange / Serial #" msgstr "" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 msgid "Send" msgstr "" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "" #: src/dialogs/confdialog.cxx:9087 msgid "RST always 599/59" msgstr "" #: src/dialogs/confdialog.cxx:9088 msgid "Force RST in/out to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:9093 msgid "Send CW cut #'s" msgstr "" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "" #: src/dialogs/confdialog.cxx:9101 msgid "Start Nbr" msgstr "" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 msgid "Operator Call" msgstr "" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:9170 msgid "My Section" msgstr "" #: src/dialogs/confdialog.cxx:9171 msgid "Field Day Section" msgstr "" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 msgid "Scout Operator Name" msgstr "" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "" #: src/dialogs/confdialog.cxx:9282 msgid "Button Height" msgstr "" #: src/dialogs/confdialog.cxx:9283 msgid "Height of macro bar" msgstr "" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" #: src/dialogs/confdialog.cxx:9299 msgid "One above waterfall" msgstr "" #: src/dialogs/confdialog.cxx:9304 msgid "One below waterfall" msgstr "" #: src/dialogs/confdialog.cxx:9309 msgid "Two scheme 1" msgstr "" #: src/dialogs/confdialog.cxx:9314 msgid "Two scheme 2" msgstr "" #: src/dialogs/confdialog.cxx:9319 msgid "Two scheme 3" msgstr "" #: src/dialogs/confdialog.cxx:9324 msgid "Two scheme 4" msgstr "" #: src/dialogs/confdialog.cxx:9329 msgid "Two scheme 5" msgstr "" #: src/dialogs/confdialog.cxx:9334 msgid "Two scheme 6" msgstr "" #: src/dialogs/confdialog.cxx:9339 msgid "Two scheme 7" msgstr "" #: src/dialogs/confdialog.cxx:9344 msgid "Two scheme 8" msgstr "" #: src/dialogs/confdialog.cxx:9349 msgid "Two scheme 9" msgstr "" #: src/dialogs/confdialog.cxx:9354 msgid "Two scheme 10" msgstr "" #: src/dialogs/confdialog.cxx:9363 msgid "Load last used macro file at start" msgstr "" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" #: src/dialogs/confdialog.cxx:9369 msgid "Display macro filename at start" msgstr "" #: src/dialogs/confdialog.cxx:9385 msgid "Show macro control codes" msgstr "" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9405 msgid "WF Ctrls" msgstr "" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "" #: src/dialogs/confdialog.cxx:9489 msgid "Clrs/Fnts" msgstr "" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:9494 msgid "Rx/Tx Character set" msgstr "" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "" #: src/dialogs/confdialog.cxx:9539 msgid "Macro Edit Font" msgstr "" #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "" #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 msgid "Scale Color" msgstr "" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 msgid "Meter Color" msgstr "" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 msgid "Report Browser" msgstr "" #: src/dialogs/confdialog.cxx:9721 msgid "Even Lines" msgstr "" #: src/dialogs/confdialog.cxx:9726 msgid "Odd Lines" msgstr "" #: src/dialogs/confdialog.cxx:9731 msgid "Stream Text" msgstr "" #: src/dialogs/confdialog.cxx:9737 msgid "Bg color" msgstr "" #: src/dialogs/confdialog.cxx:9743 msgid "Alt Color" msgstr "" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "" #: src/dialogs/confdialog.cxx:9783 msgid "Font/Color" msgstr "" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:9808 msgid "RxID nar" msgstr "" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "" #: src/dialogs/confdialog.cxx:9820 msgid "RxID wide" msgstr "" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "" #: src/dialogs/confdialog.cxx:9882 msgid "All Others" msgstr "" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "" #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "" #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "" #: src/dialogs/confdialog.cxx:10269 msgid "Normal drop speed / value" msgstr "" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:10374 msgid "values left/below waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10389 msgid "use" msgstr "" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10451 msgid "Matched Filt'" msgstr "" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:10511 msgid "Range" msgstr "" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 msgid "Edge decrease" msgstr "" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10735 msgid "BPF transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 msgid "Ser. Port" msgstr "" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 msgid "Xcvr serial port" msgstr "" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 msgid "Connect / Disconnect from WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 msgid "ModeReg" msgstr "" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 msgid "Enable paddle auto spacing of characters" msgstr "" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 msgid "Enable contest character spacing" msgstr "" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 msgid "Serial echo" msgstr "" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 msgid "Tone ON" msgstr "" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 msgid "WPM Settings" msgstr "" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 msgid "Min WPM" msgstr "" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 msgid "Rng WPM" msgstr "" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 msgid "Cmd WPM" msgstr "" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 msgid "Timing/Settings" msgstr "" #: src/dialogs/confdialog.cxx:11155 msgid "Ratio" msgstr "" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 msgid "Sample" msgstr "" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 msgid "Weight" msgstr "" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 msgid "Bk" msgstr "" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 msgid "WPM setting" msgstr "" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 msgid "nanoIO serial port" msgstr "" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 msgid "Connect / Disconnect from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 msgid "Status" msgstr "" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 msgid "Paddle" msgstr "" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 msgid "Comp'" msgstr "" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 msgid "PTT off" msgstr "" #: src/dialogs/confdialog.cxx:11508 msgid "Disable PTT" msgstr "" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "" #: src/dialogs/confdialog.cxx:11647 msgid "Hell Transmit Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 msgid "Range 1...3" msgstr "" #: src/dialogs/confdialog.cxx:11706 msgid "Hell Receive Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "" #: src/dialogs/confdialog.cxx:11715 msgid "Marquee text" msgstr "" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11722 msgid "Range 1...4" msgstr "" #: src/dialogs/confdialog.cxx:11734 msgid "Rx Height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:11791 msgid "Minimum # hits in tone detector" msgstr "" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 msgid "Center freq" msgstr "" #: src/dialogs/confdialog.cxx:11867 msgid "Sounder" msgstr "" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 msgid "convert operator callsign to lower case" msgstr "" #: src/dialogs/confdialog.cxx:11880 msgid "Time out" msgstr "" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:11892 msgid "Enter QTC text" msgstr "" #: src/dialogs/confdialog.cxx:11898 msgid "Message Logging" msgstr "" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 msgid "Notify time out" msgstr "" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 msgid "Audit log" msgstr "" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 msgid "Text Colors" msgstr "" #: src/dialogs/confdialog.cxx:11959 msgid "Transmit text" msgstr "" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "" #: src/dialogs/confdialog.cxx:11988 msgid "1/2 speed" msgstr "" #: src/dialogs/confdialog.cxx:11993 msgid "1x speed" msgstr "" #: src/dialogs/confdialog.cxx:11994 msgid "default" msgstr "" #: src/dialogs/confdialog.cxx:11999 msgid "2x speed" msgstr "" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:12011 msgid "convert other callsign to lower case" msgstr "" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 msgid "Manual tuning" msgstr "" #: src/dialogs/confdialog.cxx:12122 msgid "Oliv" msgstr "" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 msgid "Enable this to send start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12227 msgid "Cont" msgstr "" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12439 msgid "Pilot tone power relative to signal" msgstr "" #: src/dialogs/confdialog.cxx:12458 msgid "Short Preamble" msgstr "" #: src/dialogs/confdialog.cxx:12459 msgid "Enable short preamble for 8PSK transmission" msgstr "" #: src/dialogs/confdialog.cxx:12472 msgid "TTY" msgstr "" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:12555 msgid "Log RTTY frequency" msgstr "" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:12566 msgid "track color" msgstr "" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "" #: src/dialogs/confdialog.cxx:12580 msgid "Sound Card FSK" msgstr "" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:12728 msgid "Pseudo-FSK - right channel" msgstr "" #: src/dialogs/confdialog.cxx:12729 msgid "Create keyed square wave on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:12736 msgid "Transceiver FSK" msgstr "" #: src/dialogs/confdialog.cxx:12739 msgid "Mark" msgstr "" #: src/dialogs/confdialog.cxx:12740 msgid "Mark frequency in Hertz" msgstr "" #: src/dialogs/confdialog.cxx:12751 msgid "Carrier shift in Hertz" msgstr "" #: src/dialogs/confdialog.cxx:12766 msgid "LTRS at start" msgstr "" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 msgid "FSK Interface" msgstr "" #: src/dialogs/confdialog.cxx:12847 msgid "Navigator serial port" msgstr "" #: src/dialogs/confdialog.cxx:12861 msgid "FSK" msgstr "" #: src/dialogs/confdialog.cxx:12862 msgid "Connect / Disconnect from Nav FSK port" msgstr "" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 msgid "Navigator configuration port" msgstr "" #: src/dialogs/confdialog.cxx:12885 msgid "Channel 1 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 msgid "Channel 2 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 msgid "RF attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12918 msgid "NavRF Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 msgid "Nav FSK baud rate" msgstr "" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 msgid "Nav FSK Stop bits" msgstr "" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 msgid "Mark Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 msgid "Config" msgstr "" #: src/dialogs/confdialog.cxx:13062 msgid "Connect / Disconnect from Nav Config port" msgstr "" #: src/dialogs/confdialog.cxx:13069 msgid "Synop" msgstr "" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 msgid "Serial Interface" msgstr "" #: src/dialogs/confdialog.cxx:13158 msgid "FSK port" msgstr "" #: src/dialogs/confdialog.cxx:13206 msgid "Auto CRLF" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 msgid "Diddle char" msgstr "" #: src/dialogs/confdialog.cxx:13239 msgid "Diddle character" msgstr "" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 msgid "Unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:13402 msgid "Nav" msgstr "" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "" #: src/dialogs/confdialog.cxx:13475 msgid "Save image as monochrome file" msgstr "" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 msgid "flrig" msgstr "" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 msgid "Addr" msgstr "" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "" #: src/dialogs/confdialog.cxx:13735 msgid "Restore UART Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" #: src/dialogs/confdialog.cxx:13747 msgid "Init delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:13823 msgid "Retry Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "" #: src/dialogs/confdialog.cxx:13840 msgid "Write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:13857 msgid "Post write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:13909 msgid "Polling Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "" #: src/dialogs/confdialog.cxx:13929 msgid "PTT using hamlib command" msgstr "" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "" #: src/dialogs/confdialog.cxx:13965 msgid "CW is LSB mode" msgstr "" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:13977 msgid "Mode delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13978 msgid "Delay NN msec after executing mode change" msgstr "" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "" #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 msgid "Select pin number" msgstr "" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 msgid "Select PTT on state" msgstr "" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "" #: src/dialogs/confdialog.cxx:14605 msgid "Right channel" msgstr "" #: src/dialogs/confdialog.cxx:14607 msgid "Transmit Usage" msgstr "" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 msgid "Software reversal of left-right audio channels" msgstr "" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" #: src/dialogs/confdialog.cxx:14627 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" #: src/dialogs/confdialog.cxx:14633 msgid "CW QSK signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "" #: src/dialogs/confdialog.cxx:14649 msgid "Receive Usage" msgstr "" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "" #: src/dialogs/confdialog.cxx:14681 msgid "Record both channels" msgstr "" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "" #: src/dialogs/confdialog.cxx:14692 msgid "Regex Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 msgid "Sound:" msgstr "" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 msgid "Test" msgstr "" #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 msgid "flmsg interface" msgstr "" #: src/dialogs/confdialog.cxx:14753 msgid "flmsg received wav" msgstr "" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 msgid "RsID detection" msgstr "" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr "" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "" #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "" #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "" #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:15524 msgid "Conditions" msgstr "" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "" #: src/dialogs/confdialog.cxx:15554 msgid "Inches Hg." msgstr "" #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "" #: src/dialogs/confdialog.cxx:15566 msgid "Temperature" msgstr "" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:15585 msgid "Default URL" msgstr "" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:15658 msgid "Command run on KML creation" msgstr "" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:15669 msgid "Change dir..." msgstr "" #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "" #: src/dialogs/confdialog.cxx:15713 msgid "QRS on line" msgstr "" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "" #: src/dialogs/confdialog.cxx:15750 msgid "Hamcall" msgstr "" #: src/dialogs/confdialog.cxx:15763 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15776 msgid "Callook" msgstr "" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:15820 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:15826 msgid "Callook.info" msgstr "" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "" #: src/dialogs/confdialog.cxx:15917 msgid "User ID" msgstr "" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:15971 msgid "Options" msgstr "" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 msgid "Show delivery message" msgstr "" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 msgid "Default message" msgstr "" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:16010 msgid " {CALL} other ops call sign" msgstr "" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:16016 msgid "{NAME} other ops name" msgstr "" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:16030 msgid "Enter full path-filename for tqsl executable" msgstr "" #: src/dialogs/confdialog.cxx:16044 msgid "Your tqsl login password" msgstr "" #: src/dialogs/confdialog.cxx:16059 msgid "Use password for tqsl access" msgstr "" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:16065 msgid "Location" msgstr "" #: src/dialogs/confdialog.cxx:16066 msgid "tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 msgid "Locate" msgstr "" #: src/dialogs/confdialog.cxx:16081 msgid "Locate tqsl executable" msgstr "" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:16096 msgid "Export" msgstr "" #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 msgid "Check" msgstr "" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16108 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:16125 msgid "Use this tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:16160 msgid "Enter full path-filename for flrig" msgstr "" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:16178 msgid "Enter full path-filename for flamp" msgstr "" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:16196 msgid "Enter full path-filename for flnet" msgstr "" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:16214 msgid "Enter full path-filename for fllog" msgstr "" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 msgid "Enter full path-filename for external program" msgstr "" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "" #: src/dialogs/confdialog.cxx:16285 msgid "" "Enable\n" "-" msgstr "" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "" #: src/dialogs/confdialog.cxx:16333 msgid "Start flamp" msgstr "" #: src/dialogs/confdialog.cxx:16337 msgid "Start flnet" msgstr "" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "" #: src/dialogs/confdialog.cxx:16372 msgid "Enable ARQ" msgstr "" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "" #: src/dialogs/confdialog.cxx:16380 msgid "Enable KISS" msgstr "" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "" #: src/dialogs/confdialog.cxx:16388 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 msgid "Restart" msgstr "" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16564 msgid "XML" msgstr "" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16659 msgid "fllog" msgstr "" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16697 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" #: src/dialogs/confdialog.cxx:16707 msgid "Enable Busy Channel" msgstr "" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16726 msgid "Modem Bandwidth Margins " msgstr "" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16753 msgid "Enable CSMA" msgstr "" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 msgid "Slot Time" msgstr "" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16781 msgid "Transmit Data Delay" msgstr "" #: src/dialogs/confdialog.cxx:16782 msgid "Idle transmit before data sent" msgstr "" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 msgid "MilliSeconds" msgstr "" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16809 msgid "Enable Histogram" msgstr "" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16831 msgid "PSM Attenuate" msgstr "" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16845 msgid "Default Settings" msgstr "" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "" #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "" #: src/logbook/lgbook.cxx:622 msgid "Start Date" msgstr "" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:636 msgid "Stop Date" msgstr "" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:650 msgid "select by date" msgstr "" #: src/logbook/lgbook.cxx:651 msgid "Enable to select date range" msgstr "" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "" #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "" #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "" #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "" #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 msgid "Station Call" msgstr "" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 msgid "Station QTH" msgstr "" #: src/logbook/lgbook.cxx:723 msgid "Station LOC" msgstr "" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "" #: src/logbook/lgbook.cxx:744 msgid "eQSL rcvd date" msgstr "" #: src/logbook/lgbook.cxx:747 msgid "eQSL sent date" msgstr "" #: src/logbook/lgbook.cxx:750 msgid "LoTW rcvd date" msgstr "" #: src/logbook/lgbook.cxx:753 msgid "LoTW sent date" msgstr "" #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:795 msgid "FD section" msgstr "" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 msgid "CW SS Check" msgstr "" #: src/logbook/lgbook.cxx:809 msgid "CW SS Section" msgstr "" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "" #: src/logbook/lgbook.cxx:840 msgid "Date On" msgstr "" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "" #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "" #: src/logbook/lgbook.cxx:913 msgid "Date Off" msgstr "" #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "" #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "" #: src/logbook/lgbook.cxx:1048 msgid "QSL" msgstr "" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "" #: src/logbook/lgbook.cxx:1062 msgid "EQSL-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1075 msgid "LOTW-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "" #: src/logbook/lgbook.cxx:1101 msgid "EQSL-sent" msgstr "" #: src/logbook/lgbook.cxx:1114 msgid "LOTW-sent" msgstr "" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "" #: src/logbook/lgbook.cxx:1181 msgid "Cont'" msgstr "" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "" #: src/logbook/lgbook.cxx:1236 msgid "My Station" msgstr "" #: src/logbook/lgbook.cxx:1274 msgid "Station Locator" msgstr "" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 msgid "Contest seral # sent" msgstr "" #: src/logbook/lgbook.cxx:1302 msgid "Exch Out" msgstr "" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "" #: src/logbook/lgbook.cxx:1326 msgid "Exch In" msgstr "" #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "" #: src/logbook/lgbook.cxx:1339 msgid "Field Day class received" msgstr "" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 msgid "Field Section received" msgstr "" #: src/logbook/lgbook.cxx:1363 msgid "Operators age received" msgstr "" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 msgid "Operating band" msgstr "" #: src/logbook/lgbook.cxx:1399 msgid "Check value received" msgstr "" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 msgid "Ser NoR" msgstr "" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 msgid "Sent troop number" msgstr "" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 msgid "Received troop number" msgstr "" #: src/logbook/lgbook.cxx:1492 msgid "Name-S" msgstr "" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 msgid "Name-R" msgstr "" #: src/logbook/lgbook.cxx:1505 msgid "Received scout name" msgstr "" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "" #: src/logbook/lgbook.cxx:1549 msgid "Retrieve" msgstr "" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "" #: src/logbook/lgbook.cxx:1583 msgid "File:" msgstr "" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "" fldigi-4.1.06/po/quot.sed0000644000175000017500000000023113472116044012062 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g fldigi-4.1.06/po/insert-header.sin0000644000175000017500000000124013472116044013643 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } fldigi-4.1.06/po/nl.gmo0000664000175000017500000026472213515625025011537 00000000000000Þ•=*ýìSàoáoþop p5p*Pp{ppªp ±p¼pÂpÈpÑpÕpÙpßpáp‚çp jqVwq ÎqØq Ýqêq!r&r(r!-rOrdrirnr„r‰r›rµrËrár.ør)'s5Qs,‡s-´s)âs t!t%:t"`tƒt“t&¬tÓtòtu"u@u^u&cuŠu£u´uÅuËu+Ðuüuv"&v+Ivuv ‰v ªvËv ávívþvw"w1w@w/Rw‚wšw!±wÓwðw" x0xDx#_x!ƒx¥xÂxÞx"îx y+2y^y}y–y ¦y'³yÛyúyz-zIziz(‡z°z Ïzðz {"{'4{\{a{ v{#—{$»{à{&þ{%|;|Q|e|w|‹|| ”|¡|°| À|Ê|Ý|â| æ| ò|þ|}}7}>}$B}&g}Ž}&©}Ð}è}~~C~ a~n~&…~ ¬~ ·~Â~,à~ #:M`$f‹‘D£ èó€*€A€/U€…€2›€΀î€ 1,M z„™ž)¦)Ð)ú1$‚ V‚ d‚q‚v‚ ‡‚‘‚ ¥‚ ¯‚º‚˂߂è‚û‚ƒ ƒƒ >ƒIƒ Pƒ^ƒ fƒqƒ…ƒ)‰ƒ³ƒ»ƒ¿ƒȃσÔƒ ׃ãƒóƒ„ *„4„D„ b„p„ „‹„ „ œ„¨„4¹„î„8÷„0…7…?…\… k…#Œ…+°…Ü…å… ü… ††&+† R†^†~† ˜† ¹† ƆÔ†(冇#‡+:‡ f‡t‡7ƒ‡ »‡ ƇЇå‡'÷‡ˆW4ˆ/Œˆ¼ˆ'Ôˆüˆ‰*‰5=‰s‰ y‰0ƒ‰ ´‰3À‰ô‰ ŠŠ Š %Š/Š5ŠIŠYŠlŠŠeŠ‹ ‹"‹ *‹ 7‹ E‹ R‹`‹*r‹‹£‹«‹Å‹Û‹õ‹ þ‹ŒŒ9Œ XŒbŒ gŒsŒŒ;¥ŒáŒ÷ŒÿŒ+ L/c“ £° ÃÍÑÖ ÞèñŽŽŽ -Ž ;ŽGŽYŽjŽ€Ž“Ž ¥Ž.³Ž âŽîŽóŽüŽ$8>,W„–C±VõL+T€š ¶Â#ß‘‘/‘O‘"X‘#{‘Ÿ‘$¦‘Ë‘å‘.î‘§’¤Å’j“€““¨“¿“Ç“,Ï“ ü“”” ” ” 5”A”/U”:…”8À”ù” ••J/•0z•!«•Í•*ê• –"– &–1–1H– z–„– Ÿ– ª– µ–Á–,Ô–———1— K—V— j—v— ’—ž— ½—9È—%˜2(˜[˜2x˜«˜*Á˜+ì˜,™ E™%f™7Œ™Ä™PÌ™Eš cš-qš"Ÿš"š"åš"›"+›'N›-v›¤›¿›Å› ʛ՛ Û› å› ñ›þ›œ6œ ;œ HœUœiœ|œ œœ:¦œ1ᜠ,:Xg n y:šÕ Ú3èž#ž7žHž)`ž Šž ”ž ¢ž ¬ž ¹žÇžΞÕžåžöž Ÿ$'ŸLŸ$aŸ†Ÿ™Ÿ¨Ÿ°Ÿ µŸÀŸ ÈŸÓŸbÙŸ!< /^ #Ž  ² Ó ï ô ú  ¡¡'¡7¡P¡ U¡a¡4i¡,ž¡Ë¡Ó¡Û¡ ã¡ï¡ö¡ ¢¢3¢<¢E¢J¢$c¢ˆ¢Ÿ¢¤¢¿¢Å¢É¢Ì¢ТÓ¢Ø¢ï¢ø¢ý¢££%£D£c£h£x££¢£¹£ УÛ£÷£ ¤!4¤V¤s¤9‡¤Á¤Õ¤ä¤,ý¤ *¥68¥ o¥ {¥œ¥¼¥Î¥<è¥%¦8¦L¦ Q¦^¦b¦@|¦½¦Ѧ ð¦þ¦§ §*§I>§0ˆ§9¹§ó§.¨0A¨Ïr¨B© `©2©$´©Ù©Ü©á©ô©:ª?ªGªKª Rª`ªtª†ªžª ¶ªêÛªóª «(«E«b«j«o«‡« ‹«¬«Ç«Ú«ú« ¬¬!¬0¬8¬MO¬¬ ¶¬ ìͬ2Ѭ­­ $­0­P­f­}­­“­ ¦­±­Á­È­è­ ÿ­ ® ®(®,A®n®u®…® Ž® š®§®3¸®/쮯8¯=¯ B¯N¯^¯o¯ u¯'ƒ¯«¯²¯ͯ#Ó¯(÷¯' °H°"_°‚°¢°¹°Ͱà°æ°±&±6±F±K±O±h±m±p±„±—±«±°±·±ѱã±xé±b² h² v²!‚²!¤²JƲ³³³(³BB³ …³;¦³1â³´´ ´&´-´=´Q´e´}´†´ ´™´¸´È´Ú´ê´þ´ µ#µ(5µ^µnµ/vµ¦µ¯µ ¿µ͵/ܵ ¶¶¶,¶K¶P¶ T¶ a¶l¶‹¶&ª¶Ѷ#ë¶ ·0· G· Q·[·b·z·ƒ·‰·˜·.±·à·é·¸ ¸¸/=¸m¸r¸ x¸‚¸ ›¸§¸ª¸º¸Ò¸#å¸0 ¹:¹B¹J¹R¹o¹‚¹¹·¹À¹ɹä¹!ÿ¹!º )º 5º@ºDº HºRºZºcºgº ‚ººªº ɺ׺íºõºþº» » » )»*5»`»d» h»u»y»»ƒ»‡»–»Ÿ»¨»¯» ·»Á»Ê»á»ñ»¼ ¼¼ 4¼?¼F¼v_¼Ö¼ æ¼ ½½&½E½M½ f½t½'‰½±½ʽã½ ø½¾ ¾¾(¾3=¾q¾x¾‡¾޾¥¾;þÿ¾¿* ¿•8¿οß¿þ¿&À@6ÀwÀ‹À“À±À8ÅÀþÀÁ Á &Á$4Á%YÁÁ ƒÁÁ¥Á"®Á!ÑÁ"óÁÂ1Â6Â= YÂ(gÂ^Âï ôÂà à Ã#Ã&Ã5Ã<ÃEÃMÃSÃgÃoÄÈà Úàà ¦Ã ´Ã ÁÃÍÃÒà Ûêçà ’ÄijÄÏÄäÄÅÅ$Å 4Å AÅ,NÅ{ÅÅ •šŧЮŻÅÔÅãÅõÅÆÆÆ%Æ:Æ MÆ XÆyƑƪÆÅÆ ÛÆæÆ÷ÆÇ $Ç72Ç jÇvÇ“Ç ªÇ¸Ç ÓÇ<ôÇ1È*MÈxÈ0È+ÁÈíÈþÈ É É()É#RÉ!vÉ0˜ÉÉÉâÉéÉ ñÉ ýÉ ÊÊ,Ê$GÊ3lÊ Ê©ÊÆÊËÊÞÊñÊ"Ë #Ë 1ËRËoˀ˒˱ËÁË ÝË!ëË ÌÌÌ-Ì1AÌsÌ ‚ÌÌ ¡Ì ¯Ì4½ÌòÌ Í*Í ;Í\Í4|ͱÍÍÍÜÍîÍ.Î2Î9HÎ ‚Î Î ˜Î¥ÎªÎ²Î»ÎÍÎ ÕÎãÎöÎùÎ ÿÎ Ï Ï ,Ï 8Ï DÏPÏ lÏ xÏ „ÏϠϦϷÏËÏ àÏ êÏôÏ-ýÏ+Ð FÐQÐ WÐbÐiÐmЃЌР“Ð ŸÐ©Ð°Ð ÉÐÓÐØÐíÐôÐ ÑÑ Ñ!'Ñ IÑVÑeÑ mÑzÑ"ŒÑ¯ÑÃÑ'ÌÑôÑqüÑznÒéÒ+þÒ/*Ó%ZÓB€Ó:ÃÓ;þÓ/:Ô+jÔ–Ô›Ô  ÔªÔ³Ô»ÔÄÔÌÔÛÔìÔ ÕÕ&Õ5Õ<ÕKÕjÕqÕ„Õ—Õ¬Õ²Õ¸ÕÐÕÙÕóÕüÕ Ö Ö+ÖEÖVÖeÖ„Ö˜Ö¨ÖÂÖÖÖ0çÖ ×#×6×$;× `× m× {× ˆ× •× ¢× ¯× ¼× É× Ö×ã× æ×ò×ûר!Ø>ØCØ FØ RØ\ØwØ|ØØ8–ØÏØéØ ïØûØÙ.ÙCÙaÙه٠٨ٷÙ"ÌÙïÙÚÚ $Ú)/ÚYÚmÚ‚Ú+¢ÚÎÚàÚöÚÛn"ÛI‘ÛÛÛ-ìÛÜ)Ü1Ü @ÜJÜ [ÜfÜnÜt܃ܕܚÜ0­Ü ÞÜìÜÝÝ,Ý5ÝFÝXÝ aÝ mÝ xÝ…Ý ÝšÝ&Ý'ÄÝ-ìÝÞ "Þ,ÞDÞWÞlÞ‡ÞšÞ¯Þ³ÞÉÞåÞéÞ üÞ,ß 4ßAß)Xß‚ß%‡ß­ß¼ß Ìß'Ößþßààà3àFà"Jà5mà1£àÕàåàùàüàá"á ;áIáOá^á#tá˜á²á ·á'Ááéáðá÷áÿáâââ=$âbâyâŒâGŸâçâëâýâãG ãSãZãiã{ã‘ã¬ãÂãÓãÛããã÷ã+ä 2ä>äVäjäL€äÍå!ìåææ2+æ/^æŽæ£æ¼æ ÂæÐæÙæßæèæ ìæ÷æþæç—ç žço«ç è&è +è9è%Wè}èè!„è¦è½èÂèÇèÛèàèýèé*é@é2Vé)‰é5³é,éé-ê4Dêyê‹ê)ªê'Ôêüê ë!*ë-Lëzë‘ë(«ëAÔëì4ìPìnììì–ì<›ìØìñì# í<0ímí0‡í7¸íðí îî0îEîXîiîzî8“îÌîçî(ï"+ïNï#kïï£ï,¾ï#ëïð/ðNð!eð%‡ð3­ð$áðññ6ñ(Eñ"nñ‘ñ¯ñ*´ñ ßñ!ò="ò#`ò.„ò³ò Óò&ßò(ó/ó4ó#Hó&ló$“ó¸ó=Öóô1ôGô[ômôô†ô Šô•ô¥ô ¿ôÌôçôìô ðôüô õ#õ9õYõ _õ#iõ'õµõ*Ñõüõö/öJöRPö£ö%²öØö õö ÷ ÷1(÷Z÷c÷‚÷™÷ °÷%º÷à÷æ÷Qþ÷Pø_øoø.‡ø¶ø?Ëø ùI#ù.mù œù½ùÜùøù0ú EúOúgú mú*wú*¢ú*Íú3øú,ûAûSûXû qû }û‡ûûŸû'¶ûÞûíûü üü,/ü\üpü uü€üˆüü¦ü4ªüßüçüëüôüûüý ýýý?ý Xý býpý Žý˜ý ®ýºý¿ý ÐýÚý:ìý'þ50þ fþpþxþ”þ$¤þ Éþ*êþÿÿ6ÿ<ÿDÿ9aÿ ›ÿ"¦ÿ&Éÿ%ðÿ  #1*Cn‡,ž Ë Ø5å '-F(\…Mž4ì!#;_u‹8›Ô Ø)å (F\q y…™Ÿ´ËÞ)òv“®½ÆÛêý*&QW_~· ÀÊ!Þ * 3>T;m©ÀÅÛ&ï+-Yiz Š—Ÿ ¤ ®¸ÁÚôù  '@U jx7¡ Ùå ëõþ  4 : )X ‚ – L´ ^  ` 8j £    ã /ñ /! Q b !~    ª È  Þ 5è   5 7B §z ¤" Ç â ñ  0* [iqy€  ª:ÊSDYž´¹AÔ1H(e6Ž ÅÑÕç+ 1); epŠ )¾è ï#ü 9HbrŽ#ž ÂÌéJ$S2x$«'Ð=ø<6)s1AÏ_XxÑ,è$$:%_$…$ª&Ï3ö*@F K Wck~ ‘#² Öàõ.1I {4‰3¾òøü%CV e!p>’ÑÖ9æ '8K2d— ž © · ÄÐ ×áó %9_%r˜ «¸ ¿ Ê Õã ôVW'w)Ÿ Éê  /:M^w}Ž*—(Âëóû -DUfox€&›ÂÙÞ÷ÿ  '05GJ2d!—¹¾Ûëû  % 3 Q &o – ± É >Ý !3!G!0g!˜!L«!ø!/"7"W"`"0z"«"Å"Ù"Þ"ð"ô"1 #?#Q#m#~# ‚# Ž#™#F¸#3ÿ#J3$0~$.¯$FÞ$Í%%ó%&6+&'b&Š&&•&©&B¼&ÿ&' ''+'E'e'…'¥'µ'Õ'õ'(2(O(l( t(~(–(*š()Å(ï())-) B)N) V)d)k)e)ç)**!*/&*%V* |*‡*"—*º*Ë*á*ù*ÿ* ++++'3+[+ t+€+ ™+¤+5½+ó+ú+, ",.,7,6O,2†,.¹,è,ñ,ö,--1- 7-(E-n-u-Œ-!‘-(³-'Ü-./$."T.w.’.¨.Á.Ç.ã.(ö./7/7H7a7p7v7ˆ7 7(¶7Cß7#8+838!;8]8&z8!¡8Ã8 Ú8ä8ÿ8!9<9 D9 N9Y9]9 a9l9t9}99œ9«9¿9Ý9ì9: : : ,: 6: D: R:,]:Š:Ž: ’:Ÿ:£:©:­:±: À: Î:Ü: ã: í:÷:;;3;H;M;a; w;‚;%‰;“¯;C<S<r<<'˜< À<Ê<æ<õ</=C=`=€=–=¨= ®=º=Ï=6ä=>$> :>D>(`>>‰> È>Ò>0Ø>ª ?´?!Ç? é?'ö?B@a@}@!†@¨@7Æ@þ@A" A -A:;A+vA¢A ¦A³AÒALÛA*(B+SBBBÂBÇB-ÎB üB+ Cr6C©C ®C ¼CÊCÚCìCïCþC DDDD/D7DIDMD RD_DeDkD{DŠDšD ¢D®DªÃDnE}E ˜E¹E(ÕEþEF)F =FKF6]F”F ¦F ±F ¾F ËF ×FãF ùFGG,G=GFG!KGmG†G—G·GÏGíG!H &H1HBHWH tH1‚H ´H¿HÛH íHûHIN1I€I&ŸIÆI)ÝI*J2JIJ[JlJ%„J&ªJ;ÑJN K\K|K ‘KK¯KÄK×K"óK!L)8L bLoL„L‰LžL±L$ÁL æL"óLM1MCM!UMwMŒM œM¦MÃMËMÒMãM?ûM;N LNZNmN |N.‰N¸NÐN3ÙN) O)7O'aO!‰O «O¹OËO5àOPD1P vP ƒPP P¥P­PµPÌPÔPãPôPúP Q Q "Q .Q :Q FQ#RQ vQ ‚Q ŽQ šQ§Q­QÇQ#àQ RRR1.R`R {R†R ŒR™R¡R#¥RÉRÙR àR íR÷R"þR!S*S/SJSQS kSwS|SŽS ­SºSÌS ÔSâS!ñST -TB7TzTqƒTXõTNU.dU7“U(ËU@ôUH5V9~V;¸V8ôV-W2W 7WAWJWSW \WfWuW„WŸW°W ¿WËW ÒWàWùWXX*X:X @XNXiXrX‡X ŽX›X¬XÃXÝX îXøXY 1Y=YWYkY6|Y ³Y¾Y×Y'ÝY ZZ "Z 0Z >Z LZ ZZ hZ vZ „Z’Z •Z ¡Z«Z³Z'ÍZõZúZ[[8[U[][ v[K€[Ì[ã[ é[ô[ \0\#E\%i\ \›\µ\Ä\Ü\6ô\+]D] ^]j]3y]­]Ç]0ß]+^<^!S^,u^¢^Š»^QF_˜_7­_å_ ù_` `!`1`A`I`O`^`p`u`;`É`Ø`ï`aa!a4aIaZava‡a™a¨aÂa'Åa%ía.bBbJb"SbvbŒb žb¿bÑbåb#éb c+c/c Hc-Tc‚c0“c2Äc÷c(ýc&dY@áÚ ´ÑÐäÚìü5%óÒk핟ȵ}ƒì÷UräKc w¬Ô‰9GIõq[‘©ôØV|çéĬ'Ç™¯x‚OLÑ¥ ®¨}Vñ¼+,Áñ¾”7 )k¿àÓgL“Ãà—÷¬Åœú‹°=.ö2/` 9t³]6ü‘nêï(ûµ-pÓª˜‘Ɔ]Ìsˆ%„4&ÿŸ¤ÄéîU½›T^è¿ß4§;Œ¡b{éƒþ(BïÙÜRæÚ¸ðØÿa1[hk±*ázyÉß]ø2 Äd&ï˜ÒË‘å&ù³Š$Fl+K w§³׊${ž|àý™í;ËM—¶’Þá@±oe¤Z7 S}x¢ƒ»1Ðnš¹Esê¡K­E’è äØb›ÏWMoœã—øo)°ª2ìc Zj¤É¥2´Èvð™èÍ?”œ©‡i’/¦#cq„§<U‚¡E^r±€˜Í:ùuÏš3=ò2Cý!$÷J 5:«v:<®ªÁÞCÖ‰Ä.=ëïÝ@1ýúùßO ŽÙ;¤Þ _ôz½Ó '»'í¶MsÜrT6OH?úÝ"`òy"Χóní kª;œFå<Í«CGBø÷M î9KX)?þ_)ÓÕ\JEëvƒS"­ñÀ=·£Æ.Ù>ûN¯˜^å ž >•‡:è·G!`.ŸzPq%ÕÆ…6¼'72ªÑs¹ôÏ-*ØpÎfÒŒµRÍÛNUn1£×†bFNè|6 y€£ˆ€Új=Ä ²pÜe¥3a0L.8oÏÌƱ.W+å ŠLiäwJ¿àQx[ý@¨Ü °(öö´¯aeF㌈ùÛ¤ [N¢þ:ôvz®º~ÊwæZgY:ÛÞ>Ç5×ír?º«ƒ6ÐÌ7A¢SUq-Ѱ="HØÙ|“æ¾L\À#­cP4 ü“#7C8ßðÛ8t0+Yë²¥X»÷<ë8€I$!óB¦#•Zã·“u†d Bž%âþgݼ-WD~Xò5–/XuVÐ3`ye*ÖA3åçÿ®ïöšâÁx0²æÎ…”mŽÔuK TŒµ+·ìQÇÇûš—*Šê>Á×½‡ÜóüÆ„!( {”?0d†Ã ’V• E¨zDÂeÐtJZî¥Áõu4Åg¼°IæºHìœÙÿÚtË3ê7Ûlq}³HÈòA†$¦599_âDlaÅS¸]üm,/I½'M-rR‚¦›j—áù‡ )*‰\øðV…Ôf‹¨ k âã_É,h³XhCôpçó, m80‹Wé‰@Q/sH¸Q|µ‘•AŽˆÑç¯ò¹hö­Ai jÒ™Y$;îi/· º~ú¦m¸ÉfOâ<^£ŽT‡ …ˆg«w!û‹lËÌG€¢x¡ê©®fd%Ò‹OÔ}¾ŸÖ„Ÿ_{–3È1¾Ó#¶­øî˜´4'm’%š›ßÀž v„Tö§¹»¼½¾~¶+»‚(á RÃbº5ÇfR;–-¬]¡ÔJã ÅðPÕ©ÊõyjÉ¿ŠŒh,ž²éd‚!Àú&DÝàÌÃ&ûÕõý…0¿6ñ´#~<™"×1t^¯ £©Io¢–ȖΓëËõÏ {CALL} other ops call sign {MODE} full mode / submode in # Records in logbook# retries before giving up# times to resend command before giving up%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&UI&View**.exe... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...0 = T; 9 = N1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types14070.15025 W500 Hz limit8-bit extended characters8-bit extended characters (UTF-8): AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter ignore all comment text modem timing test, spec' file modem timing test, 'n' random 5 char groups modem timing test, string 's' modem char/sec test on nn chars Analysis CSV on,off,toggle CW identifier decrement counter [Wait][Len](ms) log eQSL optional msg log eQSL insert text file valid xcvr filter width rig freq has kbd focus my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot idle signal for NN.nn sec increment counter S/N etc. IMD etc. saveQSO data, append msg to notes log at xmt time other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit CW QSK post-timing CW QSK pre-timing insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously Rev on,off,toggle send CAT cmd valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out schedule execution search DOWN for signal search UP for signal Digitalk On, Off, Toggle repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version WAV file; spec' file WAV file; string 's' WAV file; internal string CW WPM:Farnsworth get weather data for station get weather data exchange begin exchange end exchange in exchange outADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQARQ controlAX25 DecodeAbortAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdd address to notes fieldAdd geopolitical name of METAR stationAdjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAllow errorsAllow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto CRLF line lengthAuto connect when fldigi opens (server must be up)Auto start programs with fldigiAuto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutostartAvailable substringsBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBad modem idBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowseBrowserBrowser Line ColorsBug me about saving log entriesBuild infoButtonButton HeightButtonsC&ountriesCAT command for PTTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall LookupCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter in passband Right click to undoCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear channel text after # seconds of inactivityClear list?Clear log entries after saving or using macro Clear log fields?Clear on saveCloseClose ListClrs/FntsColorColor of Mark TrackColors && FontsColors and cursorsCommand line optionsCommand run on KML creationCommand started when KML files are generated. Subprocesses are started once, and restarted if needed.Commands are echoedConditionsConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?Connect to serverConnect/disconnect to Talker socket serverCont'ContestContest exchange receivedContest exchange sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate keyed square wave on right audio channelCreate sunspotsCustom shiftCustom text searchCustom...CutDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode (CWI suppression)Decode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault CW tracking pointDefault RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete local data files if selected.Delete the current recordDeselectDetect the THOR preamble Clear the Rx pipelineDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice:DevicesDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory...Disable alert dialogDisable allDisable freq changeDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay RX in reverse videoDisplay tx and rx in main fldigi window. Change requires restart of fldigiDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDot to dot-space ratioDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge shapeEdge timingEmbedded Wefax GuiEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable Busy ChannelEnable CSMAEnable DSP prior to decoderEnable KISSEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable rx text streamEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable to put Tx panel above Rx panelEnable when both programs are using the same IP addressEnabledEnabled - log QSO using Mark frequency Disabled - log QSO using center frequencyEnabled - use Mark/Space filter outputs Disabled - use pseudo signalsEnd of xmt IDEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-name for cty.dat folderEnter test string or leave blank for default:Enter time span in minutesErrorEvenEven linesEventEvent logExchange InExchange OutExecutable file to insertExecute command on KML files.ExitExit promptsExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.F-WPMFECFFT ProcessingFFT averagingFFT prefilter window functionFLMSG files...F_keysFahrenheitFax images destination directoryFeel free to skip any pages or exit the wizard at any timeFeldFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font/ColorFont:Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreq.FreqDisp / MetersFrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)FullFull reportGeneralGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlibHamlib used for rig controlHardware PTTHeight of macro barHiLite 1HiLite 2HideHide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:I/OIDIDsIOIOTAIP Address Port NumberITU zoneITUZIgnore duplicatesInInactivity timeoutInclude the transmit frequencyInclusive stop date for exportInfoInit delay (ms)Initial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Interesting notesInterleave SYNOP and textInterleave text with decoded SYNOP messages, or replacement.Islands on the airK3 A1A configuationKISSKISS controlKMLKML balloon display styleKML balloon in plain text, or HTML, in plain tables or matrices.KML files directoryKML refresh interval (seconds)KML root fileLOCLast QSOLatencyLeading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Listen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocatorLockLock transmit frequencyLogLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog sourcesLogbookLogbook DialogLoggingLogging Panel ControlsLogs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Long receive integrationLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMETAR station ID codeMETAR station locationMFSK image fileMT-63Macro Button LabelMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMark onlyMark prev freq/modeMark-SpaceMatched Filter bandwidthMaximum row number for a received fax image.MediumMerge ADIF fileMerge...Meter ColorMiles / HourMinimal controlsMinimum distance for splitting alias nodes (Meters)Minimum distance for splitting aliases (Meters)Minimum time between eventsMiscModeMode in useMode must matchMode width limitModemModem carrierModem signal on left and right channelsModemsMonitor transmitted signalMouseMouse wheel active on macro buttonsMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Msec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameNewNew record / Save recordNextNoNo faster than thisNo file name givenNo slower than thisNoneNormalNormal drop speed / valueNot worked beforeNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OOKONON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOddOdd linesOn/OffOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator workedOperators QTHOperators nameOptional configuration in format: param=val ...OptionsOtherOutOutput port number when same IP address usedOverPSKPSK ReporterPSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT via Hamlib commandPWR-meterPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPortPort:PortAudioPost-keydown timing (ms)Power scalePrPre-Signal TonePre-keydown timing (ms)Preamble DetectionPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProsignsProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPskmailPulse shapePulseAudioPwrQRZQRZ cdromQRZ.comQRZ/eQSLQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO loggingQSO must not occur within a time period ofQSYQTHQTH NicknameQthQuietRE:RPCRSID receptionRST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Scope DisplayRX - unshift on spaceRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine pulse shape factorRange +/- wpmReading fonts...Really delete record for "%s"?ReceiveReceive filter bandwidthReceive modesReceive synchronizerReceived fax maximum rows number (5000)Recent activity for gridReception of flmsg filesReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Refresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveReplay trackline audioReport ARQ frames average S/NReport rig frequency (enable only if you have rig control!)ReportsResetReset FEC blocks when changing BW or TonesReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetriesRetrieve for active modem useRetry interval (ms)Returns IP Address and port number to the default value.RevReverseReverse Left/Right channelsReverse videoRevert to Unsifted char's on a spaceRevert to unshifted char's on a spaceRigRig controlRig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRight channelRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRsIDRst receivedRst sentRun programRun program:RxRx / Tx PanelsRx WPMRx bkgndRx fontRx/TxRx/Tx Character setS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SYNOP to ADIFSYNOP to KMLSample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save image as monochrome fileSave log entry?Save logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...Scale ColorScopeScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Searches passbandSecondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelf Organizing MappingSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSer inSer outSerial # inSerial # outServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSettingsShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:SigLvlSignal BrowserSignal Level ColorsSignal averaging over time 0 - least 4 - greatestSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow CPU (less than 700MHz)Slow drop rateSoft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpace onlySpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!Sweet SpotSynopSys ColorsSystemT/RTX - unshift on spaceTX PowerTX WPMTX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTabular data sourcesTalkerTalker Socket (MS only)TemperatureTestTest charTest character for QSK adjustmentTest commandTest text fileTest...Text CaptureText HighlightingText Tags (tags use {} delimiters)Text file to insertText i/oText to send during keyboard idle timesText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThese tags can also be used in This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimeout (secs)TimingTiming and QSKTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTouchTracked CW speed in WPMTrackingTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):TuneTune margin (tone frequency spacing)Two scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9TxTx above RxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUIUI languageUI schemeUS state of station workedUndoUnsupported formatUpdateUpdate selected local data files with repository contentUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUse uHRouter PTTUsed For PSKMail and FLDIGI Suite of ProgramsUsed for BPQ32User IDUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVideoVideo ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWF CtrlsWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWXWait for response to first CAT commandWait for response to subsequent commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWavWav write sample rateWeather query specificationWebWeb Browser lookupWeight (%)Weight decreases with increasing edge timingWheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWind speed/dirWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)XMITXMT lockXON/XOFF flow controlXY - classic scopeYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafterautomatic data uploadcallsign tooltips in received textchannels != 1charscty.dat foldercurrent wx conditionsdefault text to send with etcdefault uses date/time oneQSLeQSL userenable mouse wheel control of macro barflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangeh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourmbarsminutesrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportssecondsselect browser fontselect by datesend when logged (log button, , )track colorunknown wave file errorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.22.01 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2014-11-10 20:14-0600 Last-Translator: Peter van der Post Language-Team: Dutch Language: nl MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.4 {CALL} roepnaam tegenstation {MODE} volledige mode / submode in Aantal items in logboekAantal pogingen voordat RigCAT uitgeschakeld wordtAantal pogingen voordat besturing gestopt wordt%s log gestart op %s%s: Bestaan niet, maken?&Over&Instellingen&Bestand&Help&Logboek&OK&InterfaceB&eeld**.exe... Deze instellingen staan op andere tabbladen. Ze zijn hier weergegeven voor het gemak. De instellingen kunnen op beide plekken worden aangepast. ...0 = T; 9 = N1000 Hz toon indien PTT is ingeschakeld Kan in combinatie met een andere vorm van PTT besturing worden gebruikt14.070,15025 W500 Hz limiet8-bit uitgebreide karakterset8-bit uitgebreide karakterset (UTF-8): AFC aan,uit,wissel mijn antenne exchange end roepnaam tegenstation wis logvelden wis RX scherm wis TX scherm contest-teller Negeer alle commentaartekst modem timing test, spec' file modem timing test, 'n' random 5 char groups modem timing test, string 's' modem char/sec test on nn chars CSV analyse aan, uit, wissel (toggle) zend CW id contest-teller verlagen [Wacht][Lengte](ms) log eQSL optioneel bericht log eQSL tekstbestand invoegen stel TRX filter in TRX frequentie heeft toetsenbordfocus mijn frequentie tekst naar NAME/QTH ga naar frequentie NNNN Hz keer terug naar 'sweet spot' (meest gunstige frequentie) 'idle' signaal gedurende NN,nn seconden contest-teller ophogen S/N etc. IMD etc. Bewaar QSO gegevens, voeg bericht toe aan notities log tijdens zenden locator tegenstation LOCK aan,uit,wissel Bewaar QSO gegevens, voeg bericht toe aan notities bewaar QSO gegevens wissel van bestand met macrodefinities toon kaart op basis van coördinaten toon kaart op Google mode mijn roepnaam mijn locator mijn naam mijn QTH mijn RST naam tegenstation Verstuur |NN| opeenvolgende RsID uitzendingen Volgend QSO rec # pauzeer uitzending CW QSK tijd achteraf (ms) CW QSK tijd vooraf (ms) QRG invoegen in RX tekst # QSO recs QSO tijd (UUMM)) omhoog/omlaag TRX frequentie QSY naar kHz, Hz klik rechts op QSY knop klik links op QSY knop QTH tegenstation herhaal macro doorlopend Reverse aan,uit,wissel Verzend CAT commando schakel TRX naar mode CW stijgtijd RST tegenstation ontvangen Rx RsID aan,uit,wissel Bewaar huidig macro bestand bewaar contest uit plan uitvoering zoek TERUG naar signaal zoek VERDER naar signaal Digitalk aan (on), uit (off), wissel (toggle) herhaal elke NN seconden 'tune' signaal gedurende NN seconden wissel zenden/ontvangen zenden TX verzwakker instellen Tx RsID aan,uit,wissel Fldigi versie WAV bestand; spec' file WAV bestand; string 's' WAV file; internal string CW WPM:Farnsworth weer-informatie ophalen van specifiek METAR station weer-informatie ophalen exchange begin exchange end exchange in exchange outADIFAFCAFC gedragAFC bereik (Hz)AFC bereik of bandbreedteAFC snelheidSnelheid waarmee AFC volgtALTRARQARQ controlAX.25 decoderenAfbrekenS/N verhouding voor acquisitie (dB)Zoekbereik voor acquisitie (Hz)ActieToevoegenVoegt CR-LF toe na aantal karaktersVoeg RsID signaal toe achter uitzendingVoeg adres toe aan notitiesVoeg geopolitieke naam van het station toeCursorfrequentie aanpassenPas DSP bandbreedte aanGeavanceerde instellingen:AllesAlle getoonde instellingen kunnen later worden gewijzigd via het Instellingen menuSta fouten toeVink aan om instellingen te bevriezenAlternatieve kleur RX schermAltijd LSBAltijd USBAltijd audiofrequentie tonenStart nieuw modem altijd op deze audiofrequentiesAntenne:Weergave label voor elk kanaalVoeg toe aan RX tekst:Voeg toe aan TX tekst:ToepassenFrequentie-invoer met pijltjestoetsenAudioInformatie geluidskaartInformatie over de geluidskaart is alleen beschikbaar voor de PortAudio componentGeluidsbestandAudiofrequentieApparaat voor ontvangstAudio of RF-frequentie aanduiding bij watervalApparaat voor zendenGeschiedenis audio-spoor gedecodeerd voor geselecteerde signaalRegelbreedte auto CR-LFAutomatisch verbinden wanneer Fldigi start (server moet beschikbaar zijn)Start programma's automatisch samen met FldigiLand+antennehoek autom. invullenAutomatische terugloop (CR-LF)Automatic Frequency ControlAutomatic Rx speed trackingSpot roepnamen in gedecodeerde tekst automatischAutostartBeschikbare deeltekstenTerugAchtergr.Achtergrondkleur voor functietoets groep 1Achtergrondkleur voor functietoets groep 2Achtergrondkleur voor functietoets groep 3Achtergrondkleur van squelch-knop in signaalvensterOngeldige frequentieOngeldig modem IDBand'Band' moet overeenkomenBandbreedteLuchtdrukBaudrateBitrate (b/s):Beginnersgids (Engels)Gedrag van signaalruisverhouding en IMDAchtergr.kleurAantal bits per karakterBladerenVerkennerLijnkleuren verkennerDring aan op het opslaan van ingevoerde logsBuild info (Engels)KnopKnophoogteKnoppen&LandenCAT commando voor PTTCPUCPU gebruik neemt toe bij een grotere watervalhoogteCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signaal op rechterkanaalCW DSP filterbandbreedteCW is LSBCW zenden WPMCWI detectie en onderdrukkingCWI grensCabrillo instellingenCabrillo...CallRoepnamen zoekenZoek callGewerkte roepnaamZoek met Callook.info (gratis dienst, alleen US roepnamen)RoepnaamKan samen met andere PTT instellingen gebruikt wordenAnnulerenOpnemenOpname- en afspeelapparatenOpname-apparaatSchrijf ontvangen tekst naar bestandHerken signalen boven deze grensHerken signalen binnen gegeven bandbreedteOpnemen:Carrier frequentie (Hz)ShiftCelsiusCentreer weergave op signaalCentreer in doorlaatband Klik rechts om ongedaan te makenMiddenlijnWijzig aantal PSK ontvangstkanalenAlleen aanpassen om te experimenteren!Wijzig 'look and feel' van applicatieWijzig kleurWijzig map...Wijzig log-niveauWijzig posities van kanalen laag naar hoogWissel naar macrobestandWijzig schaal watervalKrijgt effect bij de volgende programmastartLabel kanaalKanaalnummerKanalen, eerste kanaal begint bij ondergrens watervalTekens/rij:AllesControleer op duplicatenControleer op updatesControleer op updates bij programmastartControleer op updates...Schakel in voor notificatie bij RsID zonder wijziging van modem en frequentieVink aan om CPU gebruik bij PSK en RTTY te beperken.Controleren op updates...Kies map voor opslag KML documentenStad gewerkte stationWis KML gegevens nu !Wis bij startenWist KML documenten en daarmee de Google Earth weergave.WisAlles wissenWis tekst na # seconden zonder activiteitLijst wissen?Wis log velden na opslaan of macroLogvelden leeg maken?Leegmaken na opslaanSluitenSluit lijstKleuren/lettertypesKleurKleur van Mark spoorKleuren && lettertypesKleuren en cursorsCommand line optiesGestart commando bij aanmaken KML bestandCommando gestart zodra KML bestanden gegenereerd worden. Subprocessen worden eenmaal gestart en herstart indien nodig.Commando's worden herhaaldOmstandighedenBevestigAfsluiten bevestigenBevestig RESETBevestig afsluitenAfsluiten bevestigen?Verbind met serverMaak/verbreek verbinding met Talker serverCont'ContestContest uitwisseling ontvangenContest uitwisseling verzondenOntvangen contest volgnr.Contest:ContinentDoorlopend scrollenControl karakters in RX/TX schermSla roepnaam op in hoofdlettersConverterKopiërenCorrectiesKon map niet aanmakenKon URL niet openen: %s Kan geen webbrowser starten: %s Open dit URL handmatig: %sKon flmsg niet startenLandLand gewerkte stationGraafschap (county)Maak 1000 Hz blokgolf op rechterkanaalCabrillo rapport makenGeschakelde blokgolf op rechter audiokanaalCreate sunspotsAangepaste shiftZoeken op tekstAangepast...KnippenDTMFDTR +12 VDTR +12 VDTR = +VDTR is verbonden met PTTPTT is aangesloten op DTRDXCCDXCC aanduidingDXCC entiteitenDXCC entiteitVerhouding streep / puntOpzoeken in databaseOpslag databestandenDatabestandenBijwerken databestandenDatabestanden...Bewaartermijn voor gegevens in uren (0 voor geen grens)DatabestandDatumDatum vanDatum opDatum einde QSODatum start QSODatum tijd AAN == UITDebugDecoderen (CWI onderdrukking)Decodeer AX.25 packets naar leesbare vormDecodeer DTMF tonenDecodeer ontvangen DTMF tonenDecodeert SYNOP berichten (bijv. Deutsche Wetterdienst) naar ADIF logbestandDecodeert SYNOP berichten (bijv. Deutsche Wetterdienst) naar KML bestanden(bijv. Google Earth)StandaardStandaard 800 Hz (Deutsche Wetterdienst gebruikt 850 Hz)Ideale audiofrequentie voor CWIdeale audiofrequentie voor RTTYStandaard WPMIdeale audiofrequentie voor PSK en andere modesStandaard audiofrequentie voor ontvangen/zendenStandaardberichtStandaard testtekst is: "Gebruik standaard XY oscilloscoopStandaardWacht NN ms voor loslaten PTTWacht NN ms met audioVerwijderLokale bestanden wordt verwijderd indien geselecteerdVerwijder huidige itemDeselecterenHerken THOR startsignaal (preamble) Wis ontvangstbufferDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapGedetecteerd signaalniveauDetectieniveauBovengrens detectorOndergrens detectorPoort:ApparatenVerschil tussen Rx & Tx frequenties (TRX offset)Kleur cijfersCijfersVerlaagMap...Schakel waarschuwingsscherm uitAlles uitSchakel frequentiewijzingen uitNa ontvangst van RsID wordt verdere detectie uitgeschakeldSchakel uit bij zeer langzame CPU of indien de signaalverkenner niet wordt gebruiktSchakel spotting uit als de signaalverkenner(s) niet zichtbaar zijn.Schakelt detector uitToonToon RX in 'reverse video'Toon TX en RX in Fldigi hoofdscherm. Vereist herstart van Fldigi.Niet automatisch wisselen naar RsID RX frequentieRsID waarschuwing niet tonenGeen gebruik maken van roepnamendatabaseGeen gebruik maken van roepnaam zoeken via web browserVaste scopeDomNiet niet bewarenVerhouding punt / punt-spatieSlepen op de waterval wijzigt de frequentieDuplicaatControle dubbel gewerkt, roepnaam plus...DuplicatenPuslvorm in-/uitschakelenIn-/uitschakel timingGeïntegreerde Wefax interfaceWist KML bestanden bij starten programma.ActiefSchakel in -Icons in menu's in- of uitschakelenTips in- of uitschakelenSchakel ARQ inSchakel 'busy channel' inSchakel CSMA inSchakel DSP in voor decoderSchakel KISS inSchakel MultiPSK-compatibele FEC inAlles aanVink de gewenste knoppen aanSlepen op waterval inschakelenSchakel in om met één klik ontvangen tekst vast te leggen in het RX schermSchakel in voor zeer zwakke signalenMaak actief indien de computer niet goed decodeertSchrijf ontvangen tekst naar bestandSchakel in wanneer Fldigi wordt gestartMaak actief voor Latin-1 karakters met diacrieten (é, ü etc.)Maak actief om UTF-8 (Unicode) karakters te kunnen verzendenSchakel in voor UTF-8 (Unicode) karaktersVink aan om TX scherm boven RX scherm te plaatsenSchakel in wanneer beide programma's hetzelfde IP adres gebruikenActiefIngeschakeld - log QSO met frequentie Mark signaal Uitgeschakeld - log QSO met middenfrequentieIngeschakeld - gebruik Mark/Space filter uitgang Uitgeschakeld - gebruik pseudo signalenID na einde uitzendingVoer complete pad in voor externe applicatieVoer het volledige pad in voor FlampVoer het volledige pad in voor FllogVoer het complete pad in voor 'flmsg'Voer het volledige pad in voor FlnetVoer het volledige pad in voor FlrigVoer het volledige pad in voor cty.datVoer testtekst in of laat leeg voor standaardtekst:Tijdspanne in minutenErrorEvenEven regelsGebeurtenisLogboekUitwisseling ontv.Verz. uitwisselingIn te voegen uitvoerbaar bestandVoer commando uit op KML bestanden.AfsluitenVragen bij afsluitenInstellingen voor exporterenExporteer naar ADIF bestandExporteer naar CSV bestandExporteer naar tekstbestand met vaste veldgrootteExporteren...Bestanden aanmaken voor gebruik met extern programmaBerichtherkenning stopt na NN seconden inactiviteitF-WPMFECSignaalverwerking (FFT)FFT uitmiddelingFFT prefilter window functionFLMSG bestanden...FunctietoetsenFahrenheitMap voor opslaan fax-afbeeldingenJe kunt op elk moment schermen overslaan of de wizard verlatenFeldAlleen file I/OLand en antennehoek invullen op basis van cty.dat bestandFilterFiltervormfactorBandbreedte filterFilter bandbreedtefactorFilterbandbreedte ten opzichte van breedte signaalFilterZoek land:Zoek volgendeZoek prefix:Zoek vorigeZoek: VoltooienVaste intervallenFldigi instellingen...Fldigi configuratieFldigi configuratie-wizardFldigi macro-definitiebestand *.{mdf}Fldigi palet *.palFldigi TRX XML definitiebestand *.xmlFldigi web site...OscilloscoopMappenLettertypeTekstkleurLettertype...Lettertype/KleurLettertype:Forceer sample snelheid. Kies "Native" als "Auto" niet goed werkt met je geluidskaart.Maakt van roepnaam HOOFDLETTERSForceer kanaalafstand op 100 Hz stappenForceer datijd/tijd AAN == datum/tijd UITFree Lossless Audio Codec *.flacGratis dienst met dank aan OKFreqFreq.Frequentieweergave / metersFrequentieFrequenctie in MHzFrequentieschaalFrequentieshift (800 Hz)AllesVolledig rapportAlgemeenGenereer 1000 Hz blokgolf op rechterkanaalGenereer blokgolf op rechter audiokanaalGroep 1Groep 2Groep 3HamCall.netHamlibHamlib gebruiken voor besturing zendontvangerPTT via hardwareHoogte macrobalkHiLite 1HiLite 2VerbergVerberg scherm voor zendenStandaard scherm voor zenden verbergenVerberg scherm na (s):HoogHoogste frequentie in HzServer:I/OIDIDsIOIOTAIP adres poortnummerITU zoneITUZNegeer duplicatenInTime-out bij inactiviteitStuur frequentie van de zendontvanger mee met spotEinddatum (inclusief) voor exportInfoWachttijd initialisatie (ms)DTR beginwaardeRTS beginwaardeStartspanning op DTRStartspanning op RTSInitialiserenInitialiseer RigCAT besturingInitialiseer Hamlib besturingInitialiseer de hardware PTT interfaceInitialiseer QSO logveldenInitialiseer verbindingInput carrier shiftVoeg RX markering in voor het wijzigen van frequentie en modemVoeg standaardtekst inBestand invoegen...Voeg volledig METAR rapport toeVoeg voorloopnullen toe aan verzonden volgnummerMarkering invoegenVoeg speciale tekst in bij Rx scherm wanneer er op de waterval geklikt wordtTekst invoegenTekst invoegen bij enkelvoudige klik linkerknopIntegratieperiode (FEC blokken)NotitiesSYNOP en tekst afwisselenWissel tekst af met gedecodeerde SYNOP berichtenIslands On The Air (IOTA)K3 A1A configuratieKISSKISS instellingenKMLWeergavestijl KML ballonKML ballon als tekst, HTML, tabellen of matrices.Map KML bestandenKML verversingsinterval (s)KML root bestandLOCLaatste QSOVertragingIn- en uitschakeltijden (msec)Laat veld leeg of kijk op http://www.pulseaudio.org/wiki/ServerStringsDe linker- en rechterkanalen bevatten beiden geluidKlik links om tekst te wissen Klik rechts voor begininstelling frequentiesKlik links om de kleur voor duplicaten te kiezenKlik links: wijzig mode Klik rechts: instellenLinks of rechts klikken speelt altijd opnieuw de audio-geschiedenis afLicense GPLv3+: GNU GPL versie 3 of nieuwer Dit is gratis software. Het staat je vrij om het te wijzigen en te verspreiden. Er is GEEN GARANTIE op deze software. Lighted button enabled colorsBeperk AFC tot dit bereikBeperkt tot enkele tekens, zoals bij CQEM of IOTA etc.Luister naar signalen binnen dit bereikLockLadenNieuw palet inlezenAfbeelding inlezenLaad of sleep een afbeelding Ondersteunde formaten: PNG, JPEG, BMPLaden...LocatorLocatie...Locatie 'Flmsg'Zoek naar cty.dat bestandBepaal locatie Flmsg executableBepaal locatie Flamp executableBepaal locatie Fllog executableLocatie 'flmsg'Bepaal locatie flmsg executableBepaal locatie Flnet executableBepaal locatie Flmsg executableBepaal locatie #1 executableBepaal locatie #2 executableBepaal locatie #3 executableLocatorBevriezenZet zendfrequentie vastLogSchrijf Navtex berichten naar ADIF bestandSchrijf Navtex berichten naar KML bestandLog RTTY frequentieSchrijf Wefax berichten naar ADIF bestandLog alle RX/TX tekstLog sourcesLogboekLogboekschermLoggenKnoppen logboekschermSchrijft berichten naar bestand met Keyhole Markup Language opmaak (Google Earth, Marble, Gaia, etc.)Long receive integrationRoepnaam opzoekenLotW gebruikerLaagLaag = 0 fouten Middel = 1 fout Hoog = 2 foutenLaagste te verwerken frequentie in HzOndergrensOndergrens (Hz)Laagste frequentie onderaan schermMETAR station IDLocatie METAR stationBestand MFSK afbeeldingMT-63Label macroknopMacro TekstMacro editor - Macro'sMaidenhead locator, bijvoorbeeld JO22IAMail server instellingenAlleen MarkMarkeer vorige freq/modeMark-SpaceMatched Filter bandwidthMaximum aantal rijen voor een ontvangen faxafbeeldingMiddelADIF bestand samenvoegenSamenvoegen...Kleur meterMijl/uurMinimaal aantal knoppenMinimum afstand voor splitsen van alias nodes (meters)Minimum afstand voor splitsen van aliassen (meter)Minimale verstreken tijd tussen gebeurtenissenDiversenModeGebruikte mode'Mode' moet overeenkomenMode met beperkingModemModem carrierModemsignaal op linker- en rechterkanaalModemsToon verzonden signaalMuisMuiswiel actief voor macroknoppenMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Wachttijd tussen pogingen in msWachttijd in ms tussen opeenvolgende commando'sSignaalverwerking meerdere kanalenDetecteer meerdere kanelenMijn roepnaam de CALLMijn CW zendsnelheid WPMNBEMSNBEMS databestand interfaceNBEMS bestanden...Geen audioapparaat beschikbaar (of test)GEEN ROEPNAAM INGESTELDNaamNieuwNieuw item / item opslaanVolgendeNeeNiet hoger dan deze snelheidGeen bestandsnaam opgegevenNiet lager dan deze snelheidGeenNormaalNormale snelheid / waardeNiet eerder gewerktNotchOpmerking: Deze instellingen zijn relevant maar niet uniek voor het gebruik van Fldigi op een aanraakscherm, zoals een tablet.NotitieNotificatiesAlleen kennisgevingAantal en positie van macrobalkenAantal cijfers in volgnummerAantal uren dat gegevens bewaard worden voor elke node. Nul betekent dat alles bewaard blijft.OOKAANON - Marquee style OFF - Clear & restartAAN - doorzoek gehele audiospectrum OFF - beperk zoeken tot +/- 200 HzAAN - klein lettertype UIT - groot lettertypeON - start at default OFF - keep current wf cursor positionAAN - laatst gebruikte set macro's UIT - standaardsetOSSOnevenOneven regelsAan/UitEén boven RX/TXEén boven watervalEén onder watervalOnline documentatie... (Engels)&ModeOpen ...Open lijstOpen bestand met standaard browserOpen met browserOpen logboekbestandOpen macrobestandOpen berichtenmapOpen bericht met 'flmsg'Palet openenOpen TRX XML bestandOpen squelch aantal seconden bij RsID detectieOpen met 'flmsg'Openen...Open NBEMS map na successvolle herkenningOperatorGewerkte operatorQTH operatorNaam operatorExtra instellingen met opmaak: parameter=waarde ...OptiesOtherUitPoortnummer (uit) indien hetzelfde IP adres wordt gebruiktOverPSKPSK ReporterPSK e.a.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PTT vertraging (geldt voor alle CAT/PTT varianten)PTT vertraging bij einde uitzendingVoor PTT een CAT commando gebruiken (niet via hardware)PTT toon op rechter audiokanaalPTT via CAT commandoPWR-meterPalet: PariteitControleer alle ontvangen tekstWachtwoordPlakkenPaths (hidden)Kies bitrate uit de lijstSpeel geschiedenis terug bij kiezen van actief kanaalAfspelenContinu afspelen in een lus?AfspeelapparaatAfspelen:Voer eerst de roepnaam in.Toon informatie na twee seconden met de muis zweven boven een roepnaamPoortPoort:PortAudioPost-keydown timing (ms)VermogensmeterProv.Toon vóór signaalPre-keydown timing (ms)Startsignaal-detectieToets ENTER om zoekopdracht te vervolgenOntvangen tekst in kleine letters voor CW, RTTY, THROB en CONTESTIAProg 1:Prog 2:Prog 3:Vraag om instellingen op te slaanVraag om logboek op te slaanVraag om log op te slaan bij afsluitenVraag om macrobestand op te slaanProfessionele symbolenProvincieProvincie gewerkte stationPseudo-FSK - rechterkanaalPseudo-FSK op rechter audiokanaalPskmailVorm pulsPulseAudioPwrQRZQRZ CD-ROMQRZ.comQRZ/eQSLQSKQSK op rechter audiokanaalDat. QSL ontv.Datum QSL ontvangenQSL route van gewerkt stationDat. QSL verz.QSL verzonden op deze datumQSL-VIAQSL ontvangenQSL verzondenDatum QSOQSO datum UITQSO datum AANQSO loggenQSO mag niet voorkomen binnen tijdspanne vanQSYQTHQTH NicknameQTHQuietRE:RPCRsID ontvangstRST ontvangenRST verzondenRST(r)RTS +12 VRTS +12 VRTS = +VRTS is verbonden met PTTPTT is aangesloten op RTSRTS/CTS flow controlRTTYRTTY scope weergaveRX - unshift on spaceRX opslaanRX ppmCorrectie geluidskaart voor ontvangstQSO gegevensinvoer wordt begrensd door de scheidingstekens, die hier gedefinieerd zijn. Tab en 'nieuwe regel' tekens worden automatisch meegenomen.Radiofrequentie'Raised cosine' pulsvormfactorBereik +/- WPMLettertypes inlezen...Registratie voor "%s" echt verwijderen?OntvangenBandbreedte ontvangstfilterOntvangstmodesSynchronisatie voor ontvangstMaximum aantal regels voor ontvangen fax (5000)Recente activiteit voor gridOntvangst van 'flmsg' bestandenOntvangstrapporten...Opnieuw verbindenItemsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Verversingsinterval gebruikt in KML bestand (seconden)Herladencty.dat opnieuw ladenVerwijderHerhaal audio van het spoorRapporteer gemiddelde S/N van ARQ framesVermeld frequentie (gebruik alleen bij actieve TRX besturing!)RapportenResetFEC blokken wissen bij wisselen naar BW of tonenAlle instellingen terugzetten naar de beginwaarden? Dit krijgt effect bij de volgende programmastart. Bestanden fldigi_def.xml en fldigi.prefs zullen worden verwijderd. Terug naar carrierHerstel standaardmap voor cty.datBeginwaardenZet de seriële poort-instellingen terugTX frequentie vasthouden (Lk) bij wisselen naar RsID RX frequentieTX frequentie-lock behoudenPogingenOphalen voor actief modem gebruikInterval tussen pogingen (ms)Zet IP adres en poortnummer terug naar standaardwaarde.RevReverseVerwissel linker- en rechterkanaalReverse videoSchakel om naar lettersymbolen na ontvangen van een spatieTerug naar karakters zonder shift na spatieTrxTRX besturenRigCAT bestand met definities:TRX modeSeriële interface van zendontvanger herhaalt elk karakter dat gestuurd wordtZendontvanger vereist RTS/CTS flow controlZendontvanger vereist XON/XOFF flow controlZendontvanger gebruikt RTS/CTS voor pauzeren/hervatten dataverkeerTRX:RigCATRigCAT gebruiken voor besturing zendontvangerRechterkanaalRechts/Links Kies minst significante cijferRechts/Links = 1 x LSD Omhoog/Omlaag= 10 x LSD Shift - Rechts/Links = 100 x LSD Shift - Omhoog/Omlaag = 1000 x LSDRsIDRST ontvangenRST verzondenStart programmaStart toepassing:RXRX/TX schermenRx WPMAchtergr.RX fontRX/TXRX/TX karaktersetS-meterS/N en IMD gedragSELSKIPSOM decodingSQL-1SQL-2SYNOP naar ADIFSYNOP naar KMLSample snelheidBewarenOpslaan ...Instellingen opslaanAlle ontvangen tekst opslaan, één karakter tegelijk, naar het bestand: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Opslaan als...Gewijzigd logboek opslaan?Configuratiewijzigingen opslaan?Gewijzigde macro's opslaan?Bewaar afbeelding als monochroom bestandLog-invoer opslaan?Logboekbestand opslaanBewaar macrobestandPalet bewarenTekst opslaan alsBewaar fax-afbeelding als PNG bestand met grijswaardenDit palet opslaanOpslaan...Kleur schaalOscilloscoopVerschuivenScroll tipsZoek op deze roepnaamZoek op webZoekbereik (Hz)Doorzoekt doorlaatbandSecundaire tekstsecondenKiesKies het aantal bits per karakterKies het aantal stopbitsAlles selecterenKies Cabrillo contest en veldenKies velden voor exportSelecteer records voor exportKies RX/TX karaktersetKies rasterlettertype voor zendenKies labelKies bandbreedteKies snelheid (baud)Kies afstand tussen de tonenKies apparaatKies de functie van het muiswiel voor de watervalKies regelKies modes voor menutoegangKies aantal tonenKies pariteitKies RigCAT definitiebestandKies FFT pre-filter typeMaak actief voor de Elecraft K3 Niet van toepassing voor andere zendontvangersKies lettertype watervalschaalAchtergrondkleur selectie RX/TX schermSelf Organized MappingVerzend roepnaam in CW na elke uitzendingVerzend een doorlopende reeks testsymbolenZend met deze snelheidDoorlopend zendenStuur afbeeldingAfbeelding versturen...Stuur ontvangstrapport bij loggen QSOStuur rapport alleen als QSO is gelogdOntvangen tekst wordt naar bestand 'textout.txt' geschrevenVerzonden en ontvangen faxberichten worden weggeschreven naar het ADIF bestandVerzonden tekst in RX/TX schermVolgnummer ontvangenVolgnr. uitVolgnr. ontvangenVolgnummer verzondenServer tekenreeks:Stel squelch in voor ViewerKies niveau voor correcte weergaveStel het aantal tekens per rij inKies resampler type voor offset correctieInstellingenOmschrijving antenneToonToon DXCC entiteitenToon waarschuwing:Toon alle modesToont bandbreedte-sporen in watervalToon kanalenToon cursor met bandbreedte-lijnenToon cursor met middenlijnToon minder modesToon macro editorToon grotere of kleinere watervalToon icons in menu'sToon wachtwoordToon tipsToon zendsignaal in watervalZijbandSigLvlSignaalverkennerKleuren signaalniveau'sBepaling signaalgemiddelde gedurende tijd 0 - kortst 4 - langstSignaalverkennerSignaalniveauSignaalbereik (dB)Signaal zoekenSignaalspoorEén macrobalk onder logscherm variabele hoogteEén klik om op te slaanGrootte:Overgeslagen tekens in TX scherm (TX aan/uit in CW)Verschuif weergave naar hogere frequentieVerschuif weergave naar lagere frequentieKleur van squelch knop in signaalschermLangzame CPU (minder dan 700 MHz)Lage snelheidSoft-bit decodingSoft-symbol decodingLinker- en rechteraudiokanaal verwisselen in softwareSorteren op datum/tijd UITSorteren op datum/tijd UIT - beïnvloedt alle ADIF/Cabrillo rapportenGeluidskaartAlleen SpaceSnelheid (WPM):SpotSpotterSpottenSpotting uitgeschakeldSquelchSquelch-niveauSquelch open (s)StaatStartStartdatumStartdatum voor exportStart FlampStart FllogStart FlnetStart FlrigPTT vertraging bij begin uitzendingStart prog1Start prog2Start prog3Eerste getalStaat'Staat' moet overeenkomenStation tweemaal gehoordMaidenhead locator gewerkte stationEinddatumAantal stopbitsAantal stopbitsMode en frequentie opslaan Klik rechts voor lijstSunspot creation underway!Sweet SpotSynopSyst.kleurenSysteemT/RTX - lettersymbolen na spatie (UOS)TX zendvermogenTX WPMTX genererenTX offsetTX ppmCorrectie geluidskaart voor zendenTabkleurTabsDatabestanden in tabelvormTalkerTalker Socket (alleen MS)TemperatuurTestSymbool voor testTest symbool op QSK aanpassingTestcommandoTest tekstbestandTest...Tekst opslaanTekst markerenTekstlabels ({} scheidingstekens)In te voegen tekstbestandTekst I/ODeze tekst wordt verstuurd als het toetsenbord niet wordt gebruiktTekst...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~De RsID notificatie kan worden geconfigureerd via het "Notificaties" instellingenscherm.Standaard CW snelheidDe bestandsnaam wordt getoond in het RX schermHet veld met de reguliere expressie mag niet leeg zijn.De reguliere expressie moet geldig zijn.De reeks wordt vervangen door huidige modem en frequentieDe testtekst komt niet overeen met het zoekpatroon van deze gebeurtenis.Deze wizard helpt je bij de basisinstellingen voor FldigiDeze labels kunnen ook worden gebruikt bij De reguliere expressie van deze gebeurtenis is ongeldig.ThorTijdTijd (s):Tijd UITTijd AANEindtijdBegintijdTijd einde QSOTijd start QSOTijd tussen pogingen in msBenodigde tijd: Time span overTimeout (s)TimingTiming en QSKServeradres PSK ReporterWisselGebruik DTR voor PTTGebruik RTS voor PTTLengte toon (s)TonenAanraakschermGemeten CW snelheid in WPMTrackingSnelheid, X1-normaalZendenZendvermogenVerzend roepnaamLettertype voor zendenVerzend laagste starttoonTransmit mode IDZendmodesZend punten (.) indien 'idle'Gebruikte zendvermogen (W)ZendsignaalVerzend hoogste starttoonTransmit video textZenden/OntvangenVerstuur punten wanneer er geen toetsbordactiviteit isTriangularLimiet voor trigger (s):TunenAfstemmarge (afstanden toonfrequenties)Twee schema 1Twee schema 10Twee schema 2Twee schema 3Twee schema 4Twee schema 5Twee schema 6Twee schema 7Twee schema 8Twee schema 9TXTX boven RXAchtergr.TX fontTx niveau verzwakker (dB)Zendvermogen voor vermelding in logboekTxIDGebruikersinterfaceTaal programmaGebruikersinterfaceprofielStaat (USA) gewerkte stationHerstelFormaat niet ondersteundBijwerkenGeselecteerde lokale databestanden bijwerken met inhoud uit de bewaarplaatsHuidige item bijwerkenBovenBovengrensHoogste signaalniveau (dB)Gebruik CR-CR-LF bij regel-eindeGebruik '(', niet KNGebruik CD of kopie op harde schijfGebruik DSP filter voor het decoderenGebruik DTRGebruik Farnsworth timingGebruik HamlibGebruik Mark frequentieGebruik OSS audioserverGebruik 'Open' om bestand met omschrijvingen te kiezenGebruik PortAudio serverGebruik PulseAudio serverGebruik RTSGebruik RigCATGebruik uitmiddeling om watervalruis te verminderenGebruik gekleurde knoppenGebruik XY oscilloscoopGebruik datum/tijd einde verbinding voor logboekUse for triggering amplifier carrier detectGebruik voorloopnullenGebruik parallelle poort voor PTTGebruik afzonderlijke seriële poort voor PTTGebruik klein lettertypeGebruik soft-bit Viterbi decodeeralgoritme voor verbeterde foutcorrectie (FEC) Werkt het best wanneer soft-symbol decoding ingeschakeld isGebruik soft-decision decoding voor symbooldetectie Ondersteunt soft-bit decodingGebruik uHRouter PTTGebruikt voor PSKMail en familie van Fldigi programma'sGebruikt voor BPQ32GebruikerGebruikersinterfaceGebruikerUDP poortnummerVSP inschakelenVerboseVideoVideo ID modesVideo Preamble IDToonKanalen tonen/verbergenVirtuele Seriële Poort emulator - onderdrukt waarschuwingenGetoonde modesBezoek HamCall websiteBezoek QRZ websiteBezoek HamQTH websiteWatervalWatervalvergrotingWaterval verschuivenWaterval opslaanWaterval bereik versterkingWaterval carrierWaterval snelheidWaterval modusWaterval referentieniveauWXWacht op reactie op eerste CAT commandoWacht op reactie op volgende commandoWachttijd in ms voordat antwoord gelezen wordtWarningWatervalWaterval / Spectrum / OscilloscoopWaterval-instellingenSnelheid watervalHoogte van de waterval in pixelsWaterval video IDWaterval video textWAVSamplefrequentie voor WAV schrijvenZoekvraag voor weerinformatieWebOpzoeken via web browserGewicht (%)Gewicht verminderen bij verhoogde pulsbreedteFunctie muiswielGa terug naar carrierfrequentie bij geen signaalWaar gegenereerde KML bestanden worden opgeslagen.BreedTreedt op na verstreken tijd in secondenWindsnelheid/richtingScheidingstekens voor woordenTerugloopBewaar huidige macro set bij afsluiten programmaWachttijd (ms)XMITXMT vastXON/XOFF flow controlXY - klassieke scopeJaU gebruikt de nieuwste versieBetaald HamCall abonnement vereist voor toegangBetaald QRZ online abonnement vereist voor toegangLogin naamLogin wachtwoordaanaAutomatisch uploaden van gegevensToon roepnaam tips in ontvangen tekstchannels != 1karaktersZoek naar cty.dat bestandHuidige weersomstandighedenBericht om te versturen met etc.Standaard wordt datum/tijd begin gebruikteQSLeQSL gebruikerMaakt het mogelijk om de regel met macrobalk te bedienen met het muiswielflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:bijvoorbeeld KMDQ voor Huntsville-Madison Executive Airport, AL (USA)vrije vorm 1 moet overeenkomenvrije uitwisselingHardware PTT aansluitingbijvoorbeeld: /home/dave/CALLBK/ (Linux) of C:/CALLBK/ (Windows) Leeg laten om te zoeken naar de databasein:km/uurmillibarminutenRCOS tijdcoëfficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500rapportRapporteer CelsiusRapporteer FahrenheitRapporteer aantal inches kwikRapporteer kilometers per uurRapporteer mijlen per uurRapporteer millibarsrapportensecondenKies lettertype voor verkennerSelecteer op datumVerstuur zodra gelogd (log knop, , )Kleur spooronbekende fout in WAVE bestandalleen-waterval modus{NAME} naam operator tegenstationfldigi-4.1.06/po/fr.gmo0000664000175000017500000006406313515625025011531 00000000000000Þ•¬| ;ÜÈ#É#Þ#ø# ÿ# $$$$#$)$;$O$ c$o$€$“$¤$³$Â$Ô$ä$ ô$ % %% +%7%=%D%H%`%x%C|% À% Ë%Ö%#ß%& &D& `&k&~&’&°& Ì&Ö& ë&ø&ý&' '*' 1' ?'J'R'V'['8d''¤'¬'É'Ø'á'ø'&(8( X( y(†(—(+®( Ú(7è( )'5)])r)Š) )0š) Ë)×)é) ï)ú)**#*8* @*N*`*h* q*{**¯*´*;Ì*++'+ 7+A+E+M+V+m+ r+ €+Œ+‘+—+ Ÿ+«+Ç+Ð+×+§à+¤ˆ,--C-K-S-Z- b- o- z-„-¤-¾--Æ-ô-ú- . .../.B.:b. .3«.ß. æ. ô.////0/E/$Z//’/¡/ ©/´/¼/!Â//ä/ 050:0 @0J0O0W0_0g0 o0{0‚0 ž0«0¿0Ä0Ê0Í0Ñ0Ö0ß0ä0÷0ü01 *151Q1 m1Ž1 1 «1·1×1Û19ä12.=2Ïl2<3A3T3d3l3~3–3ž3¶3 É3Ö3æ3í3 44.43484H4 N4\4c4#i44¡4°4À4Å4É4Î4Ñ4ä4é4 ï4!ý4!5A51D5 v5€55¤5¸5Ð5Ù5 â5ì5þ5 66-656 >6L6/[6‹6‘6 •6¶6 Í6×6Þ6ç6í6ö6 7707 67 @70L7}7†7 Ž7™7 7§7 ¯7 ½7Ë7Ô7Ý7*æ78888#828;8D8K8S8\8s8 ˆ8“8²8 º8È8á8ö8ý8•9™9ª9 ²9 À9Ì9!Õ9"÷9:: &:2:5:=:B: K:ªW: ; ;#;8;J; Z; g;t;|;‚;‰;›; ¢;­; Ê; ë; ö;<<4<9<L<[<l<~< Ž< œ< ¦<³<Å< Ë< Ö<ã<õ< ý< ===$=*=;= O=Y=-b==«= ²=¾= Æ=+Ó=/ÿ=%/>:U>;>+Ì>ø>ý>? ??? $?2?9???H?W?h?k? „? ?š?Ÿ?²?¹?Ñ? Ù?ä? ì?÷? @*@;@ J@T@ g@u@†@ Ž@˜@«@'À@è@þ@"A%A'+ASAfAnAuA}A…AA]±AC&C @CKCZCcCiCrCvC{C—C¬C ÅCÑCèCüC DD-DCDXD mDzD‰DšD ©D·D¿DÆDÍDçDÿD`E eE rEE)ˆE²E¸ELÒE F-FDF,ZF#‡F«FÁFÚFëFñFG "G-G4GHGNGVG ZG dG@nG¯G·G¿GÜGíGöGH6+H0bH#“H·HÆHÛH7÷H/IKBIŽI7¥IÝIýIJ $J60JgJyJJ–J¦J®JÂJ×J ôJþJK#K,K 5K?K#TKxKKJœKçKìKLL+L2L:LCLbL gL uL‚L‡LŽL–L#¦LÊL ÓLÝL¿íL»­MiN„N”N¤N ­N·NÇNÚN'êNO1O19OkO rO~O–OžO¦O¿O(ÜO@PFPA\PžP¥PµP ÈPÒP×PéPúPQ$$QIQ\QkQtQ ƒQQ'•QE½Q#R'R-R 4R?R DRNRWR`R iRuR$|R ¡R¯RÌRÓRÚRÝRáRæRïRôR SS&S >SISeS&S¨S¼S ÍS#ÛSÿS TCT1ST.…Tø´T­U´UÐU åUïUV&V(.VWVrV†V›V¢VºVÎVàVçVìVW WW"W9)WcWyW‹W›WŸW§W¯W³WËWÑW ×W(åW,X;XH>X‡X—X®X ÍXîXY YY,YFY\YkY ‚Y ŒY—Y«Y2ÀYóYùY'ýY%Z =ZGZ OZ\ZcZjZzZ.‚Z±Z ·ZÁZ5ÖZ [[ [([ ,[6[>[ N[ \[f[o[9x[²[¶[º[À[Ä[ Ô[Þ[ç[î[ö[ÿ[\ 8\4C\ x\ƒ\!”\¶\Ë\Ó\©ã\]Ÿ]§]¶] Æ](Ñ])ú]$^+^2^H^K^ T^`^p^¶‚^9_ M_"n_‘_¯_Ê_á_ û_ ``` 0`>`,Q`'~` ¦`´`!Å`ç`aa(a>aUapa…a˜a ©a·aÌa ÔaÞaíab bb b'b:b@bZb rb |b<†bÃbßbèbøbc=c8Oc*ˆcI³c=ýc:;dvd{d d‹d ”džd§d»dÄd ÉdÖdédúdýd!e"=e`ehe }eŠe ¥e²e ÁeÎeÞe#þe"f8fNf^ftf ƒf ¤f ²f¾fÕf<éf&gAg"EghgBog%²gØgàgçgïgøgh ÿf蔚å£U¡1zÉBlÖõ…CbŒ^‹¸*ZZ‹v†¼Êd©˜ƒ+¦œ«£)t9ÄJ#´Ik†‘ˆróug8ÆŽOj¶ä4wE_%2ÈxXj¬P“™ Q_LâùF¡pæ’ç«iìšK̰•úö‡§kÚ<A,S€[ø›-@ ;`×YX½`Hñnu5œ(!N.Ai ré ò> ê ¥Q¹\a&CÒÇ!(VÎ6áK<hÏS/ ¦‚“}î©V®™Á:‘%¨ÞÀÔMcb|I?¤qlHDh{ }9–²t1ŠGD—~/'¤3a5;T¬­-‰=F'f)?„qŸà&*Eª ѧô^‚ÙwRdcí~Ð]U@mm¨4#Wn»ßs o+„6þ³e=Tµ˜v0W¢Ý—JžÍ•ž,Mïý>R[·Ó Ÿ ‰ª0zy2‡Üû$Ž÷YüB7LºŠˆ3€±¾ Ø{xNo.Ë–ðƒÃ|ëÕ…yŒãp¢7O¯P8$’g”¥:¿GÛs›"Å"e]\%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&View other call my frequency other locator mode my call my locator my name my QTH my RST other name other QTH other RST receive transmitAFC behaviorAFC range (Hz)ARQ controlAbortActionAddAdjust cursor frequencyAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAlways LSBAlways USBAntenna:Appearance of label on each channelAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio input deviceAudio output deviceAuto-fill Country and AzimuthAutomatic Frequency ControlAutostartAvailable substringsBad modem idBandBands must matchBeginners' GuideBuild infoButtonButton HeightC&ountriesCQ zoneCQZCallCallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture:Carrier frequency (Hz)Center display on signalCenter in passband Right click to undoChange # of psk viewer channelsChange application look and feelChange colorChange log levelChange waterfall scaleChanges take effect on next program startupChannel labelChannels, first channel starts at waterfall lower limitCheck for duplicatesCheck for updates when starting programCheck for updates...Checking for updates...ClearClear AllClear channel text after # seconds of inactivityClear list?Clear log fields?CloseClose ListColorColors && FontsColors and cursorsCommand line optionsConfirmConfirm RESETConnect to serverContestContest:ContinentContinuous scrollingConvert callsign to upper caseCopyCould not open url: %s Could not run a web browser: %s Open this URL manually: %sCountryCreate cabrillo reportCreate sunspotsCustom...CutDTR +12DTR = +VDTR is PTT signal lineDXCCDXCC entitiesDXCC entityDateDebugDefaultDefault WPMDefault test string is: "DefaultsDeleteDeselectDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDevice:DevicesDigitsDisplayDocked scopeDon't saveDup ColorEnable / disable icons on menusEnable / disable tooltipsEnabledEnter test string or leave blank for default:ErrorEventEvent logExchange InExitExport to ADIF fileExport to CSV fileExport to fixed field text fileFeel free to skip any pages or exit the wizard at any timeFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFind country:Find prefix:Find: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFont colorFont...Font:Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsFree Lossless Audio Codec *.flacFreqFreq.FrequencyFullGeneralGroup 1Group 2Group 3Hamcall.netHamlibHamlib used for rig controlHardware PTTHeight of macro barHideHost:IDIDsIOTAITU zoneITUZInactivity timeoutInfoInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInsert file...Insert markerInsert textIntegration period (FEC blocks)LOCLast QSOLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. LoadLoad a new paletteLoad image fileLoad...Locate executableLocate flmsg executableLocatorLock transmit frequencyLog all RX/TX textLook up callMacro editor - MacrosMaidenhead locator as in EM64qvMerge ADIF fileMinimal controlsMiscModeMode must matchModemModem carrierModemsMouseMouse wheel active on macro buttonsMy callsign de CALLNBEMS files...NO CALLSIGN SETNameNewNextNoNo file name givenNoneNotesNotificationsNumber and position of macro barsNumber of digits in serial numberOKON - use last set of macros OFF - use default setOdd linesOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen logbook fileOpen macro fileOpen paletteOpen rig xml fileOpen...OperatorOperators QTHOperators nameOptional configuration in format: param=val ...OtherPSKPTT tone on right audio channel PTT via Hamlib commandPalette: ParityPasswordPastePlaybackPlayback devicePlayback:Please set your callsign first.Port:PortAudioPower scalePrint CW / RTTY / THROB / CONTESTIA in lowercaseProvincePskmailPulseAudioQRZQRZ cdromQRZ.comQSL rcvd dateQSL sent dateQSL-rcvdQSL-sentQSO DateQSO must not occur within a time period ofQTHQthQuietRPCRSID receptionRST rcvdRST sentRST(r)RTS +12RTS = +VRTS is PTT signal lineRTS/CTS flow controlRX captureReally delete record for "%s"?ReceiveReceive modesRecent activity for gridReception reports...RemoveResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Restore defaultsReverseReverse videoRig controlRig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig:RigCATRun programRxS-meterSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed macros?Save logbook fileSave macro fileSave paletteSave text asSave...ScopeScrollSearch range (Hz)SelectSelect AllSelect modes for menu accessSelect the type of FFT prefilterSend imageSend image...Set Viewer SquelchShort description of antennaShowShow DXCC entitiesShow all modesShow fewer modesShow macro editorShow menu iconsShow tooltipsSideband:Signal levelSignal range (dB)Size:Sound CardSpeed (WPM):Spotting disabledSquelchSquelch levelStStartStarting numberStateState must matchStation heard twiceStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!SystemTX generateTest...Text CaptureThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThis event's regular expression is invalid.ThorTimeTime OFFTime ONTime OffTime OnTime needed: ToggleTonesTransmitTransmit modesTransmit/ReceiveTxTx level attenuator (dB)UI languageUI schemeUndoUnsupported formatUpdateUpper signal level (dB)Use DTRUse HamlibUse RTSUse RigCATUse parallel port PTTUse separate serial port PTTUse uHRouter PTTUser InterfaceUser nameView/Hide ChannelsVisible modesWF MagnificationWarningWaterfallWaterfall controlsWaterfall drop speedWrite current macro set on program exitXON/XOFF flow controlYesYou are running the latest versionafterenable mouse wheel control of macro barh/w ptt device-pinminutesreportreportssecondsunknown wave file errorwaterfall-only modeProject-Id-Version: fldigi 3.22.01 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2010-03-06 13:04+0200 Last-Translator: Bernard Seront, F4GAR Language-Team: French Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); %s log démarré le %s%s: N'existe pas, créer?À &propos&Configuration&Fichier&Aide&Journal&OK&Vue indicatif de l'autre ma fréquence locator de l'autre mode mon indicatif mon locator mon nom mon QTH mon RST nom de l'autre QTH de l'autre RST de l'autre reçois transmetsComportement AFCPlage AFC (Hz)Contrôle ARQAnnulerActionAjouteAjuste fréquence curseurConfiguration avancée:TousTous les réglages présents ici peuvent être changés ultérieuremet par le menu configurationToujours LSBToujours USBAntenne:Apparence de l'étiquette de chaque canalAudioInfo périphérique audioInformation sur le périphérique audio disponible uniquement pour PortAudioFichier audioPériph. audio entréePériph. audio sortieRemplir automatiquement le pays et l'azimuthContrôle Automatique de FréquenceLancement automatiqueSous-phrases disponiblesMauvais id modemBandeLes bandes doivent correspondreGuide DébutantsInfo BuildBoutonHauteur des boutonsPa&ysZone CQCQZIndicatifIndicatifPeut être utilisé à la place ou en plus d'autres types de PTTAnnulerCapturePériph de capture et sortiePériph. captureCapture:Fréquence porteuse (Hz)Centre affichage sur signalCentrer dans la bande passante Clic droit pour annulerChanger le nombre de canaux du visualisateur pskChanger l'apparence del'applicationChange couleurChange niveau de logChange échelle chute d'eauChangements prenent effet lors du prochain redémarrageEtiquette du canalCanaux, le prmeier canal démarre à la limite inférieure dela chute d'eauVérifier les doublonsRechercher des mises à jour au démarrage du programmeRechercher des mises à jour...Recherche des mises à jour...EffacerEfface ToutEffacer le canal texte après # secondes d'inactivitéEffacer la liste?Effacer champ de log?FermerFermer la ListeCouleurCouleurs && PolicesCouleurs et curseursOptions de ligne de commandeConfirmerConfirmer RESETConnecter au serveurConcoursContest:ContinentDéfillement continuConvertir l'indicatif en majusculesCopierEchec d'ouverture d'url: %s Ehec de lancement du navigateur web: %s Ouvrez cette url manuellement: %sPaysCréer un rapport CabrilloCréation sunspotsPersonnalisé...CouperDTR +12DTR = +VDTR est la ligne de signal PTTDXCCEntités DXCCEntité DXCCDateDébugDéfautWPM par défautLa phrase test par défaut est: "DéfautsSupprimerDésélectionneDetecter les occurances de [WRAP:beg] et [WRAP:end] Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-heure, ie: NBEMS.files \WRAP\recv\extract-20090127-092515.wrapDetecter les occurances de [WRAP:beg] et [WRAP:end] Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-heure, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapNiveau de signal détectéPériphérique:PériphériquesChiffresAffichageScope permanentNe pas sauvegarderCouleur des DupAfficher / masquer les icônes de menusAfficher / masquer les astucesActivéEntrer la phrase test ou laisser vide par défautErreurÉvénementHistorique événementsEchangeQuitterExport vers fichier ADIFExporter vers un fichier CSVExporter vers un fichier à champs fixesVous pouvez sauter une page ou quiter l'assistant à tout momentE/S fichier seulementRemplir le pays et l'azimuth en utilisant l'informaton de cty.datFiltreTrouve le pays:Trouve le préfix:Cherche: FiniIntervalles fixesConfig Fldigi...Configuration FldigiPalette Fldigi *.palFichier de définition rig xml *.xmlSite web Fldigi...Scope flottantDossiersCouleur policePolice...Police:Forcer le champ indicatif en majusculesForcer l'espacement des canaux à des incréments uniformes de 100 HzCodec Audio sans perte libre *.flacFréqFréq.FréquenceTousGénéralGroupe 1Groupe 2Groupe 3Hamcall.netHamlibHamlib utilisé pour contrôle radioPTT matérielHauteur de la bare de macrosCacherHôte:IDIDsIOTAZone ITUTIUZDélai d'inactivitéInfoVoltage initial sur DTRVoltage initial sur RTSInitialiseInitialise interface RigCATInitialise interface hamlibInitialise l'interface PTT matérielleInsèrer fichier...Insère marqueurInsère textePériode d'intégration (FEC blocs)LOCDernier QSOClic gauche pour effacer le texte Clic droit pour reset fréquencesClic gauche pour sélectionner la couleur des DupClic Gauche: change mode Clic Droit: configureLicence GPLv3+: GNU GPL version 3 ou ultérieure Ceci est un logiciel libre : vous êtes libre de le modifier et de le redistribuer. Ce logiciel n'offre pas d'autre garantie que celle imposée par la loi. ChargeCharge une nouvelle paletteCharge fichier imageCharge...Rechercherl'exécutableRechercher l'exécutable flmsgLocatorVérouille la fréquence de transmissionLoguer tout le texte RX/TXRecherche indicatifÉditeur de macro - MacrosLocalisation MaidenheadFusion fichier ADIFContrôle minimalDiversModeLe mode doit correspondreModemPorteuse modemModemsSourisLa molette de souris est active sur les boutons de macrosMon indicatif de CALLFichiers NBEMS...PAS D'INDICATIFNomNouveauSuivantNonNom de fichier manquantAucunNotesNotificationsNombre et positions des barres de macrosNombre de chiffres dans le numéro de sérieOKON : utiliser le dernier jeu de macros OFF : utiliser le jeu par défautLignes impairesUne au dessus de RX/TXUneau dessus de la chute d'eauUne en dessous de la chute d'eauDocumentation en ligne...&Mode OpOuvrir ...Ouvrir la ListeOuvrir le fichier journalOuvrir fichier macrosOuvrir paletteOuvrir fichier rig xmlOuvrir...OpérateurQTH des opérateursNoms des opérateursConfiguration optionnelle au format: param=val ...AutrePSKTonalité PTT sur le canal audio droit PTT par commande HamlibPalette: ParitéMot de passeCollerSortiePériph. sortieSortie:Merci de configurer votre indicatif en premierPort:PortAudioEchelle de puissanceImprimmer CW / RTTY / THROB / CONTESTIA en minusculesProvincePskmailPulseAudioQRZQRZ cdromQRZ.comDate QSL reçueDate QSL env.QSL-reçuQSL-env.Date QSOUn QSO ne doit pas avoir lieu sur une p&riode de temps deQTHQthCalmeRPCRéception RSIDRST reçuRST env.RST(r)RTS +12RTS = +VRTS est la ligne de signal PTTContrôle de flux RTS/CTSCapture RXConfirmer la suppression d'enregistrement pour "%s"?RéceptionModes réceptionActivité récente pour le carréRapport d'écoute...EnleverRemise à zéroRéinitialiser toutes les options? La réinitialisation des options sera effective au prochain démarrage Les fichiers: fldigi_def.xml et fldigi.prefs seront effacés! Restaure défautsInverseInverse vidéoContrôle radioMode RadioRadio requiert contrôle de flux RTS/CTSRadio requiert contrôle de flux Xon/XoffRadio:RigCATExécuter le prgrammeRxS-mètreSauvegarderSauvegarder ...Sauvegarde ConfigSauvegarder tout le texte reçu, un charactère àla fois dans le fichier suivant: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Enregistrer sous...Sauvegarder le journal modifié?Sauvegarder les macros modifiées?Sauvegarde le fichier journalEnregistrer fichier macrosEnregistrement paletteSauvegarder le texte sousSauvegarde...ScopeDéfilerPlage du recherche (Hz)SélectionnerTout SélectionnerSélectionner les modes accessibles par menuSélectionner le type depré-filtre FFTEnvoyer imageEnvoyer image...Positionne le Squelch VisualiseurCourte description de l'antenneMontrerMontre les entités DXCCMontrer moins demodesMontrer moins de modesMontre l'éditeur de macroMontrer icônes menuMontrer infobullesBande latérale:Niveau signalPlage du signal (dB)Taille:Carte SonVitesse (WPM):Repérage désactivéSquelchNiveau squelchStDémarrerNuméro de dépardÉtatL'état doit correspondreStation enrendue 2 foisStop bitsBits stopEnregistre le mode et la fréquence Clic droit pour la listeCréation sunspot en cours!SystèmeGénération TXTest...Capture le texteLe nom de fichier est écrit dans la zone texte de réceptionLe champ d'expression régulière ne doit pas être videL'expression régulière doit être valideLa phrase test ne correspond pas au motif de recherche de cet évennementL'assistant vous guidera pour les réglages de base de fldigiL'expression régulière pour cet évennement est invalideThorHeureHeure OFFHeure ONHeure OFFHeure ONTemps nécessaire: BasculerTonsTransmissionModes transmissionTransmet/ReçoitTxNiveau d'atténuation Tx (dB)Langue de l'interface utilisateurSchéma de l'interface utilisateurAnnulerFormat non supportéMise à jourNiveau haut de signal (dB)Utiliser DTRUtilise HamlibUtiliser RTSUtiliser RigCATUtiliser un port parallèle PTTUtiliser un port série PTT à partUtiliser PTT uHRouterInterface UtilisateurNom utilisateurMontrer/Cacher canauxModes visiblesAgrandissement de la chute d'eauAvertissementChute d'eauContrôles chute d'eauVitesse chute d'eauSauvegarder le jeu de macro actuel à la sortie du programmeContrôle de flux XON/XOFFOuiVous utilisez la dernière versionaprèsActiver le controle de la barre de macros par la molette de sourisBrochage périphérique PTT matérielminutesreportreportssecondesErreur inconue de fichier waveMode chute d'eau-uniquementfldigi-4.1.06/po/el.gmo0000664000175000017500000021764713515625024011531 00000000000000Þ•6ÌI|3 D¡D¶DÌDæD íDøDþDE‚ EE ¬EV¶E FFF8F!RF tFF FšF­F³F ºFÇFËFÓFëFG GCGSG&jG ‘G œG§GÅG#ÎGòGHH$HCHIHD[H  H«H»H*ÎHùH/ I=I]I{I,—I ÄIÎI)ÓI)ýI)'JQJVJ gJqJ…J™J¢J©J±JÅJåJ ìJúJ K K(K hbh‚h ™h¤h&³hÚhêhîhi ii#i6iJiOiVix\iÕi Ûi éi!õi!j(9jBbj1¥j×j Ûj åjïjÿjk'k0k 9kCkUkekyk‘k£k³k»k ÄkÒkåk6ôk +l9lHlPl Vl&alˆl#¢l Ælçlm m!m9mQmYm._mŽm—m §m±m/Ñmnn#nB)n ln#xn0œnÍnÕnÝnånoo0oJo!eo ‡o“o®oÈoÞo*çop!p3pJpZpop‚p “pžp®p ´p Âp ÎpÚpùpÿpq/q 7qEq^qwqŒq¡q¨q·q;¾qúqr•ržr½rÜr&írss8;sts|s ˜s¦s ªs¶s!¿s"ástt $t2t At MtZtitpt „t’tšt®t Ãt ÐtÜtát êt ötuu3uHuXuju zu‡u™u ¡u­u³uºuÓuåu÷uvv v v8vQv lvwv ˆv7–v ÎvÚv÷vw*w:w0?w+pwœw²w Äw Ïw(Ýw#x*xCxLxix nx|xx"žx Áx Ïxðx yy7yIyhyxy ”y!¢yÄyÓyçy öyz z #z41zfz~z*„z¯z.ËzSúzN{9d{ ž{©{ °{ »{Å{&Î{õ{ || #|1| 7| B|L| b| n| z| †|’| ®| º| Æ|Ò|â| õ|} } }0} A} M}Z}k}€} ‡}-‘}¿} Ñ}Ü}ã}ò}û} ~ !~-~ 2~ ?~I~X~ `~ m~y~‹~'Ÿ~+Ç~;ó~/4C Tbqx‡—¶ÉÜñ÷€€)€8€ J€X€q€€¤€ ´€€0Ó€    , 9 F S ` m z ‡ •¡!º Ü èò ‚(‚?‚O‚T‚g‚n‚ˆ‚¢‚ ¨‚´‚Ì‚ê‚ò‚ ƒƒ*ƒ 2ƒ=ƒQƒqƒƒƒ™ƒ¶ƒŃÔƒ'Ûƒ„„„ /„+=„ i„s„‹„ž„³„΄ã„ ø„……%!…G…V… f…'p…˜…®…"²…Õ…Û…ô…" † -†;†J†Y†o†(‰† ²†'¼† 䆇)‡8A‡z‡‚‡$…‡ª‡±‡À‡Ò‡è‡ˆˆ*ˆ02ˆcˆkˆˆŽˆ¤ˆ¼ˆ Àˆáˆýˆ‰Š‰!¡Š.Ê0òŠ#‹2‹ A‹N‹]‹l‹2…Œ¸ŒÀÍŒŽ¢6¶1í9ŽYŽtŽˆŽ)ŽÇŽØŽéŽüŽ 2 8SŒ¥ ¬'MWuÍÜ9ë %‘B3‘.v‘.¥‘Ô‘då‘J’&S’…z’““&2“WY“$±“oÖ“KF”@’”=Ó”Z•l•ƒ•LŒ•LÙ•L&– s–5€–¶–!Ì–%î–—)—9—0N—E— Å—Ò—ì— û—!˜(˜D˜kY˜,Ř ò˜™/™~G™Æ™Õ™Aä™&šKFš’š(¢šËš7Úš›-›WE›7›MÕ›#œAœVYœ2°œ€ãœd„žž:žIž(až,Šžm·ž/%ŸGUŸIŸ®çŸY– /ð N ¡,o¡4œ¡5Ñ¡¢¢y0¢"ª¢qÍ¢r?£l²£2¤&R¤9y¤³¤Ϥठþ¤. ¥&8¥%_¥.…¥´¥Ó¥ä¥ þ¥# ¦+0¦#\¦$€¦¥¦´¦Ϧ=æ¦$§!3§YU§1¯§á§ø§ ¨d ¨7…©V½©Àª%Õªûª,«`1«.’«4Á«ö«¬2¬6A¬'x¬- ¬ά"æ¬F ­P­#e­'‰­±­ Ì­)Ú­*®/®'M®u®UŽ®Yä®T>¯“¯(¤¯4ͯ°(°#@°0d°2•°PȰ±)±:± R±5]±“±%«±iѱz;²{¶²12³d³@s³D´³Yù³DS´X˜´'ñ´µb9µIœµæµ/õµ%¶8¶H¶\c¶]À¶·L;·4ˆ·½·9Û·¸z)¸u¤¸¹D«¹qð¹pbº<ÓºM»‡^»Tæ»;¼uX¼MμM½Mj½M¸½M¾LT¾O¡¾Hñ¾ :¿E¿Z¿9t¿®¿1¿¿ ñ¿%þ¿$À#3ÀCWÀ%›À$ÁÀ>æÀ%Á7Á`MÁ6®Á"åÁ. 7 EÂR àÂ$íÂÃ)ÃBÃ`Ã#uÙà ¨Ã!³ÃÕÃ$ëÃÄ)-ÄWÄfÄ'vÄ žÄ¬ÄÂÄ*ÞÄE ÅQOšŴÅ#ÐÅ ôÅÆ Æ*Æ`?Æb Æ Ç Ç Ç"*Ç$MÇ*rÇÇ8®Ç çÇ4òÇ'È#=ÈaÈÈNÈ9ìÈ*&É*QÉ |É É8¾É÷É2yÊ"¬ÊpÏÊ!@ËbË!óËIÌ/_ÌÌ"£ÌMÆÌ…ÍUšÍNðÍd?ÎU¤ÎDúÎ(?ÏJhϳÏÐÏ2ßÏ,ÐF?Ð}†Ð ÑÑ%Ñ+AÑ+mÑ1™Ñ1ËÑýÑ1Ò1@Ò1rÒ6¤Ò6ÛÒ6Ó0IÓzÓÓ6žÓOÕÓ%Ô 9Ô6FÔ}ÔŽÔB¨ÔëÔ ýÔÕ%>ÕdÕ!yÕ/›Õ ËÕ$ÙÕ!þÕg ÖˆÖ §ÖµÖÊÖ%ÞÖ?× D×N×<]×/š×HÊ×:ØNØH]Ø:¦Ø+áØ Ù&Ùb<Ù'ŸÙÇÙ=ÎÙ ÚÚ-"Ú-PÚ&~Ú ¥Ú²ÚÃÚåÒÚ¸ÛÍÛæÛ6ÜB9Üv|ÜóÜwuÝ íÝøÝ Þ'Þ&FÞ$mÞ’Þ¯ÞÂÞ%ÞÞ#ß0(ß,Yß'†ß®ßÈßÚß-íßà6àhSà¼àÏàëàüà ádá8vá'¯á4×á) â"6âYâ7wâ:¯â êâ÷âa ãnã'…ã­ã-Åã€óãtäE}ä ÃäÌÍäšåG¶å>þå =æ Iæ Uæ7aæ(™æ;Âæ1þæ40ç=eç£ç »ç5Üç9èLèceè Éè×è6íè'$éLé%lé"’é,µéâé ûéêê*êA;ê }ê0ˆê4¹êîê#÷ê$ë<@ë}ë4œëÑë2åëìX)ì‚ì “ì¡ìB·íDúí?îY_î¹î7Êî…ïˆïC›ï!ßïðð ðF'ðGnð?¶ðöðýðñ)+ñ*Uñ*€ñ«ñºñÚñúñ3ò%Hònò)ˆò²òÇò'àòó,%ó7Ró+Šó0¶ó+çó)ô*=ô5hôžô®ôÃô Üô0éô$õ.?õ#nõ’õ«õºõ1Ìõ5þõ–4öËö&ëö÷2÷´÷>Ò÷(øO:ø!Šø¬øT½øNù#aù…ù¥ù"ÅùSèùZ<úc—úûú0û?û8Pû9‰ûÃûSßû3üKKüB—üÚü0ùü-*ýTXý0­ý<Þý þX<þ#•þ,¹þ#æþ ÿ(ÿGÿcÿa{ÿ6Ýÿs$H˜Cá¿%1åx ¤®½!ÒSô!Hj‚š ±¾Ö7ï':M`<s°ÇÞõ#7Kdwަ¹ÍåY-‡¥¼Ëá3ÿ43h Œ¨4Äù# -%M5sx©V" jy ä ë  * 'F n  %Ÿ 2Å ø  '8  ` 7k £ ² )Î ø + -< 5j A  â ü  r4 § Ä â ÿ 9Vs­%Ê'ð=hV)¿é;ù.57d'œÄ(Õ þD 6Qˆ—/¯Lß,(;d+v¢±$Ã8è,!<N5‹Á!Ü þD Qb#£l´!78)p4š)Ï#ù+I'i ‘Cœ*à% !1SS §È5Ï54KJ€Ë#ß4CO^“ò]?d¤€Â|C ÀË_Ò27A3yB­>ð4/%dŠg›>![&}/¤ ÔIß@)5j —H}Ò1T®°•¤mªT g%™ªù.QоêÌ.Sc†kvaÎÐmÝ$ÕÖEŸ0‰³'ý•eÜÆ ºY~||Xl§€9õ5Ýn(%WbbòÙÕzóG1ö/²høsñÉö–{ñrÚÑ­ <#™B”èÓdŽiÞ©û»g`«Æä(û€yÔKïPaéW4`E*D_š úƒ Ì¥k"Óþ ¹[ƒu±‘M}²õ¯2øH ì ¦>R¹ü)–ÒIKFG‹„ùYzº“qgÈjòtáÃÃÂýâè-XÄd^ô© ©&Ï ¸6˜ËP¬ÓÉ|ãc³6ÄÛ£éóùK.¦¶)Ý+5J~·€ë½Í‰ñƒ±R ë#ךv¾Pên­Ðq UdÜÊõt;<=Ù1'‡f2¬8Ö*-pŒ#ðàBë~ÙáôÛ¶S“sÞ¬o%"2?‚ãJÆy¶5$]jÊ·ý —ví÷»´?,Ö%†µÈC\Ü$ÂQí4Ëü# [±xï¼EQÒ¤fßF&G.¨,‘æ¯Lå’h’ôŸLtΰ]wReß5u3š8›A+ JZì‹q˜Nü/(†D?Z !-¸,•hΣÅá¢ò³_â`C‚:Ø /Žú· ÑŠZÔVËzµ‚ 7kª0»ö«Õ¡^Ϙ¼‘ÿæXI bTÇžŸ*Dœ$^ 9—F²þž¤Â01O”¢&68ç'÷4MˆÑŽÚÏØÔ"–§Ç@['àO:Ä¥ioÉÅp!yåuAw¾”}ðÿˆ)®ø{‡…™U®s >ÊUméßð¥@:…= äÞHÀ;è“B;ÿ3å3íIlþV¿jÛãž36Áê\c¿´â¼îà!ÐÍ„or(ÇÀœ´Èä]/7¸Œ2+!r*ìN×p¦î¢ç¯4’9çÀ-+ï<@‡ ÁÌaÜæµ7Š\›O¨°N‰…Á„lxif "óŽ>¹)÷YVM_¿½&«Cn­ÚûxŒwú0§ºØA=e¡ÍS ›‹¨¡{×W,L# Records in logbook%s exists, overwrite?%s: Do not exist, create?&About&Configure&File&Help&View... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...1 - Slow, 2 - Medium, 3 - Fast1/2 speed1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types1x speed2x speed4 bar macro set below Tx8-bit extended characters8-bit extended characters (UTF-8)AFC behaviorAFC range (Hz)AFC speedAFC tracking speedAbortActionActive ModemAddAddressAdjust cursor frequencyAdjust the DSP bandwidthAlertsAllAll settings shown here can be changed later via the Configure menuAllow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto start programs with fldigiAuto-fill Country and AzimuthAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutostartBackBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3BandBands must matchBandwidthBarometric pressureBehavior of s/n imdBg ColorBrowseBrowserBrowser Line ColorsBug me about saving log entriesButtonButton HeightButtonsC&ountriesCALLSIGN always lower caseCAT command for PTTCPU speedCPU usage increases with waterfall heightCW QSK signal on right channelCW is LSB modeCabrillo SetupCall SearchCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture:Carrier frequency (Hz)CelsiusCenter display on signalCenter freqCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change positions of low to high channelsChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:CheckCheck AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check if xcvr uses LSB for CWCheck if xcvr uses USB for RTTYCheck this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedCleanup KML data now !Cleanup on startupClearClear AllClear channel text after # seconds of inactivityClear list?Clear log controls sets RST in to 599/59Clear log controls sets RST out to 599/59Clear log entries after saving or using macro Clear log fields - new CALLClear log fields?Clear on saveClear textCloseClose ListColorColors && FontsColors and cursorsCommand Not FoundCommand line optionsCommand missing ':'.ConditionsConfig ScriptsConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?ConnectConnect to serverConnectedContest Exchange / Serial #ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not find LoTW report file. Download from ARRL's LoTW page after logging in at: https://lotw.arrl.org/lotwuser/default Store the report file to the fldigi LOTW folder, naming the file 'lotwreport.adi'Could not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate new logbook fileCreate sunspotsCustom...CutDTR is PTT signal lineDTR is ptt lineDash to dot ratioDash/DotData files...Database merger in progressDateDate QSO EndedDate QSO startedDate time ON == OFFDefaultDefault RST in to 599/59Default RST out to 599/59Default SettingsDefault messageDefaultsDelay NN msec after executing mode changeDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete entry?Delete the current recordDeselectDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice supports full duplexDevice:DevicesDigit ColorDigitsDirectory path not foundDisable allDisable freq changeDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay RX as a scrolling marqueeDisplay RX in reverse videoDisplay logbook read datum at startDisplay macro filename at startDo not automatically change to RX RsID frequencyDocked scopeDon't saveDragging on the waterfall scale changes frequencyDriver requires stop bits to be ZERO!Dup ColorDuplicate check, CALL plusDuplicatesEnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable DSP prior to decoderEnable Data StreamEnable KISSEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable this entry when fldigi first startsEnable this for UTF-8 charactersEnable this to send start/stop tonesEnable to put Tx panel above Rx panelEnable to select date rangeEnabledEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-filename for tqsl executableEnter full path-name for cty.dat folderEnter time span in minutesEvenEven LinesEven linesExecutable file to insertExecuteExecuting script file: %sExitExit promptsExportExport SetupExport records for LoTW uploadExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...FLMSG files...Feel free to skip any pages or exit the wizard at any timeFile I/O onlyFile not foundFile read errorFile:FilesFill in Country / Azimuth using cty.dat informationFilterFilter bandwidthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFldigi config...Fldigi configurationFldigi configuration wizardFldigi web site...Floating scopeFoldersFontFont colorFont...Font/ColorFont:Force RST in/out to 599/59Force callsign field to UPPERCASEForce date/time ON == date/time OFFFrequencyFrequency in MHzFrequency scaleFullFull reportGeneralGenerateGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Height of macro barHell Receive ParametersHell Transmit ParametersHideHide window after (s):HighHigh frequency limit in HzIFKP Raw ImageIgnore duplicatesInactivity timeoutInches Hg.Include the transmit frequencyInclusive stop date for exportInitial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitialize the QSO logging fieldsInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickInteresting notesKISS controlLatencyLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLighted button enabled colorsLimit AFC movement to this rangeLine: %d Error:%d %s (%s)Listen for signals within this rangeLoTW download fileLoadLoad a new paletteLoad image fileLoad last used macro file at startLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocate tqsl executableLocationLockLock transmit frequencyLog all RX/TX textLotW userLowLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMFSK ImageMFSK image fileMYCALL always lower caseMacro Button LabelMacro TextMacro editor - Manual tuningMark onlyMark prev freq/modeMarquee textMay require resizing the Rx/Tx panelMerge ADIF fileMerge...Meter ColorMiles / HourMinimal controlsMinimum time between eventsMiscMiscellaneousMissing command %s after line %dMode must matchModem signal on left and right channelsMonitor transmitted signalMouseMouse wheel active on macro buttonsMulti-Channel Signal ProcessingMulti-channel detectorMy StationNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNewNew record / Save recordNextNoNo faster than thisNo file name givenNo slower than thisNoneNormalNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - use last set of macros OFF - use default setOddOdd LinesOdd linesOne above Rx/TxOne above waterfallOne below waterfallOp &ModeOpen ...Open ListOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen rig xml fileOpen with flmsgOpen...OperatorOperator CallOperator Callsign:Operator Name:Operator callsign (if different than station callsign)Operators QTHOperators nameOptionsOtherPSK et al.PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT using hamlib commandPTT via Hamlib commandPWR-meterParameter is not valid.Parse all incoming textPartialPastePlay back history when active channel selectedPlaybackPlayback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPortPort is second SCU-17 devicePort:Position the 4 bar macro set below Tx panel Default above Rx panelPower scalePress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro filePseudo-FSK - right channelPseudo-FSK on right audio channelPulse shapeQSK on right audio channelQSL received on this dateQSL sent on this dateQSO DateQSO must not occur within a time period ofRSID receptionRST always 599/59RTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTY Scope DisplayRTTY is USB modeRX captureRadio frequencyRangeRange +/- wpmRange 1...3Range 1...4Range WPM setting default = 25RatioReading fonts...Really delete record for "%s"?ReceiveReceive UsageReceive filter bandwidthRecent activity for gridReception reports...Record both channelsReloadReload cty.datRemoveReport rig frequency (enable only if you have rig control!)ReportsResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Restore UART Settings on CloseRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetrieveRetrieve for active modem useReturns IP Address and port number to the default value.ReverseReverse Left/Right channelsReverse videoRigRig controlRig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:Right channelRsID detectionRun programRun program:Rx / Tx PanelsRx AGCRx Height in pixelsRx ParametersRx TextRx/Tx Character setS/N and IMD behaviorSOM decodingSample rateSaveSave ...Save ConfigSave as...Save changed Logbook?Save changed configuration?Save changed macros?Save log entry?Save logbook fileSave macro fileSave text asSave this paletteSave...Scale ColorScopeScrollSearch for this callsignSearch range (Hz)Searches passbandSecondary TextSecondsSelectSelect AllSelect Fields to ExportSelect Records to ExportSelect Rx/Tx Character SetSelect TagSelect bandwidthSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect waterfall scale fontSelect wav fileSendSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend beacon every ...Send continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSent chars in Rx/Tx paneSettingsShort description of antennaShowShow TX timerShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro control codesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSignal BrowserSignal Level ColorsSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slow CPU (less than 700MHz)Software reversal of left-right audio channelsSome changes made by the script requires program restart before they become active.Sort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSound:Space onlySpec CharSpectrumSpectrum Scope / Waterfall interactionSpectrum scopeSpeed (WPM):Spotting disabledSquelch levelStartStart DateStart NbrStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStation / OperatorStation CallStation Callsign:Station LOCStation LocatorStation Locator:Station QTHStation QTH:Station callsignStations grid squareStatusStop DateStore mode and frequency Right click for listSwitch to ARQ I/OSys ColorsSystemTHOR Raw ImageTX PowerTX deadmen timeout (mins)TX generateTemperatureTestTest SignalsTest charTest text fileTest...Text CaptureText ColorsText HighlightingText file to insertText to send during keyboard idle timesThe filename is written to the RX text areaThe wizard will guide you through the basic fldigi settingsTimeTime QSO endedTime QSO startedTime needed: Time span overTimingTiming and QSKTiming/SettingsTo whom the connection is madeToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTransfer speed, X1-normalTransmitTransmit PowerTransmit UsageTransmit callsignTransmit fontTransmit lower case textTransmit periods (.) when idleTransmit power usedTransmit signalTransmit textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTwo scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9Tx ParametersTx above RxTx level attenuator (dB)Tx power used for logbook entriesUI languageUI schemeUS state of station workedUS units of distance (QRB)Unable to open file %sUndefined errorUndoUnsupported formatUpdateUpdate site not availableUpdate the current recordUpperUpper limitUpper signal level (dB)Use DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse Pulse Audio serverUse RTSUse RigCATUse colored buttonsUse date/time off for log entryUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUser InterfaceVerifyVersion %s is available at Source ForgeViewView/Hide 48 macrosView/Hide ChannelsVisible modesWARNING - this will over write ALL settingsWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWeather Fax Image RXWeather Fax Image TXWheel actionWhen no signal presentWideWill occur after this time in secondsWind speed/dirWord delimitersWord wrapWrite current macro set on program exitXON/XOFF flow controlYesYou are running the latest versionafteralways append to file(s)automatic data uploadcallsign tooltips in received textchannels != 1clear old datacty.dat foldercurrent wx conditionsdefault uses date/time ondisplay Rx control chars as ascii stringeQSL userenable mouse wheel control of macro barfreq scale = N * modem bandwidthkilometers / hourleft click on WF recenters spectrum scopeleft click transfers frequency to scope center frequencyminutesnoprint ^! execution codes in Rx panelreportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportsscale spectrum display linked to modem bandwidthsecondsselect browser fontselect by datetqsl station locationunknown wave file erroruseuse waterfall range/limit valuesvalues left/below waterfallxmt start/stop tonesyesProject-Id-Version: fldigi 4.0.19.53 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2018-11-10 13:07+0200 Last-Translator: Haris Andrianos Language-Team: Greek (Haris Andrianos) Language: el MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: iso-8859-7 X-Generator: Poedit 2.2 # εγγÏαφές στο logbook%s υπάÏχει, αντικατάσταση;%s: Δεν υπάÏχει, δημιουÏγία;ΣχετικάΡÏθμισηΑÏχείοΒοήθειαΠÏοβολή... Αυτές οι Ïυθμίσεις βÏίσκονται και σε άλλες καÏτέλες. Î’Ïίσκονται ως αντίγÏαφα εδώ για ευκολία. ΜποÏείτε να αλλάξετε μια ÏÏθμιση από οποιαδήποτε θέση. ...1 - ΑÏγό, 2 - Μεσαίο, 3 - ΓÏήγοÏοταχÏτητα 1/2Τόνος 1000 Hz όταν ενεÏγοποιείται το PTT ΜποÏεί να χÏησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους Ï„Ïόπους PTTταχÏτητα 1xταχÏτητα 2x4 bar macro κάτω από πίνακα εκπομπ.8-bit εκτεταμένοι χαÏακτήÏες8-bit εκτεταμένοι χαÏακτήÏες (UTF-8)ΣυμπεÏιφοÏά AFCΕÏÏος AFC (Hz)ΤαχÏτητα AFCΤαχÏτητα ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï AFCΑπόÏÏιψηΕνέÏγειαΕνεÏγό ModemΠÏοσθήκηΔιεÏθυνσηΡÏθμιση συχνότητας κέÏσοÏαΡÏθμιση του εÏÏους ζώνης του DSPΕιδοποιήσειςΌλαΌλες οι Ïυθμίσεις που εμφανίζονται μποÏοÏν να αλλάξουν αÏγότεÏα από το Î¼ÎµÎ½Î¿Ï Î¡Ï…Î¸Î¼Î¯ÏƒÎµÏ‰Î½Î•Ï€Î¹Ï„Ï./απαγοÏ.αλλαγώνΕναλλακτικό χÏώμα χαÏακτήÏων στον πίνακα ΛήψηςΠάντα LSBΠάντα USBΕμφάνιση συχνοτήτων ήχου πάνταΚεÏαία:Εμφάνιση ετικέτας του κάθε καναλιοÏΠÏοσάÏτηση στο κείμενο RX:ΠÏοσάÏτηση στο κείμενο TX:ΕφαÏμογήΤα πλήκτÏα με τα βέλη ελέγχουν την εισαγωγή συχνότηταςΉχοςΠληÏοφ.συσκευής ήχουΠληÏοφοÏίες της συσκευής ήχου είναι διαθέσιμες μόνο για το backend του PortAudioΑÏχείο ήχουΣυχνότητα ήχουΣυσκευή εισόδου ήχουΣυχνότητες ήχου ή RF στην κλίμακα του καταÏÏάκτηΣυσκευή εξόδου ήχουΤο ιστοÏικό Ïοής ήχου αποκωδικοποιείται στο επιλεγμένο σήμαΑυτόματη εκκίνηση Ï€ÏογÏαμμάτων με το fldigiΑυτόμ.συμπλήÏ.ΧώÏας και ΑζιμουθίουΑυτόματη παÏακολ.ταχÏτητας λήψηςΑυτόματο spot χαÏακÏηÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï Î±Ï€ÏŒ το κείμενο ΛήψηςΑυτόμ.εκκίν.ΠίσωΧÏώμα φόντου για την Ομάδα 1 των πλήκτÏων FΧÏώμα φόντου για την Ομάδα 2 των πλήκτÏων FΧÏώμα φόντου για την Ομάδα 3 των πλήκτÏων FΜπάνταΗ μπάντα Ï€Ïέπει να είναι ίδιαΕÏÏος ζώνηςΒαÏομετÏική πίεσηΣυμπεÏιφοÏά του s/n imdΧÏώμα φοντ.Εντοπισ.ΠεÏιηγητήςΧÏώματα γÏαμμών πεÏιηγητήΕÏώτηση για αποθήκευση καταχώÏησης logΚουμπίΎψος κουμπιοÏΚουμπιάΧώÏεςCALLSIGN πάντα σε πεζάΕντολή CAT για PTTΤαχÏτητα CPUΗ χÏήση της CPU αυξάνεται με αÏξηση του Ïψους του καταÏÏάκτηΣήμα CW QSK στο δεξί κανάλιΤο CW είναι διαμ. LSBΡυθμίσεις CabrilloΑναζήτηση CallΜποÏεί να χÏησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους Ï„Ïόπους PTTΑκÏÏωσηΕγγÏαφήΣυσκευές εγγÏαφής και αναπαÏαγωγήςΣυσκευή εγγÏαφήςΚαταγÏαφή κειμένου rx σε εξωτεÏικό αÏχείοΕγγÏαφή:Συχνότητα φέÏουσας (Hz)ΚελσίουΕπικέντÏωση Ï€Ïοβολής στο σήμαΚεντÏική συχν.ΚεντÏ.ΓÏαμμήΑλλαγή αÏÎ¹Î¸Î¼Î¿Ï ÎºÎ±Î½Î±Î»Î¹ÏŽÎ½ στον πεÏιηγητή σημάτωνΑλλάξτε ΜΟÎΟ για πειÏαματισμόΑλλαγή όψης και αίσθησης του Ï€ÏογÏάμματοςΑλλαγή χÏώματοςΑλλ.φακέλου..Αλλαγή θέσεων των χαμηλών Ï€Ïος υψηλών καναλιώνΑλλαγή κλίμακας καταÏÏάκτηΟι αλλαγές θα εφαÏμοστοÏν στην επόμενη επανεκκίνηση του Ï€ÏογÏάμματοςΕτικέτα καναλιοÏΑÏιθ.καναλιοÏΚανάλια, το Ï€Ïώτο κανάλι ξεκινάει από το κατώτεÏο ÏŒÏιο του καταÏÏάκτηΧαÏακτ./γÏαμμή:ΈλεγχοςΕπιλογή ΌλωνΈλεγχος για διπλότυπαΈλεγχος για ενημεÏώσειςΈλεγχος για ενημεÏώσεις κατά την εκκίνηση του Ï€ÏογÏάμματοςΈλεγχος για ενημεÏώσεις...Επιλέξτε εάν ο Π/Δ χÏησιμοποιεί LSB για CWΕπιλέξτε εάν ο Π/Δ χÏησιμοποιεί USB για RTTYΕπιλέξτε το ώστε να ειδοποιείστε όταν ένα σήμα RSID ληφθεί χωÏίς να αλλάξει η συχνότητα και το modemΕπιλέξτε για μείωση του φόÏτου της CPU σε PSK και RTTY.Έλεγχος για ενημεÏώσεις...Επιλέξτε φάκελο αποθήκευσης των αÏχείων KMLΠόλη δουλεμένου σταθμοÏΚαθαÏισμός των δεδομ.KML τώÏα!ΚαθαÏισμός κατά την εκκίνησηΚαθαÏισμόςΚαθαÏ.όλωνΚαθαÏισμός του κειμένου ÎºÎ±Î½Î±Î»Î¹Î¿Ï Î¼ÎµÏ„Î¬ από # δευτεÏόλεπτα αδÏάνειαΚαθαÏισμός λίστας;Αυτόματη συμπλήÏωση του πεδίου RST in με 599/59 κατά την εκκαθάÏισηΑυτόματη συμπλήÏωση του πεδίου RST out με 599/59 κατά την εκκαθάÏισηΚαθαÏισμός των πεδίων στο log μετά την αποθήκευση της επαφήςΚαθαÏισμός πεδίων log- νέο CALLΚαθαÏισμός πεδίων log;ΚαθαÏισμός κατά την αποθήκευσηΚαθαÏ.κειμένουΚλείσιμοΚλείσιμο λίσταςΧÏώμαΧÏώματα && ΓÏαμματοσειÏέςΧÏώματα και κέÏσοÏεςΗ εντολή δεν βÏέθηκεΕπιλογές γÏαμμής εντολώνΕντολή λείπει ':'.ΣυνθήκεςScript ÏυθμίσεωνΕπιβεβ.Επιβεβαίωση εξόδουΕπιβεβαίωση ΕΠΑÎΑΦΟΡΑΣΕπιβεβαίωση εξόδουΕπιβεβαίωση εξόδου;ΣÏνδεσηΣÏνδεση με serverΣυνδεδεμένοΑνταλλαγές Contest / σειÏιακός αÏιθμ.ΉπειÏοςΣυνεχόμενη κÏλισηΧαÏακτήÏες ελέγχου στους πίνακες Λήψης/ΕκπομπήςΜετατÏοπή callsign σε ΚΕΦΑΛΑΙΑΜετατÏοπέαςΑντιγÏαφήΔιοÏθώσειςΔεν ήταν δυνατή η εÏÏεση του αÏχείου report LoTW. Λήψη από τη σελίδα LoTW ARRL μετά τη σÏνδεση στο: https://lotw.arrl.org/lotwuser/default ΑποθηκεÏστε το αÏχείο αναφοÏάς στο φάκελο fldigi LOTW, ονομάζοντας το αÏχείο ' lotwreport. adi 'Αδυναμία δημιουÏγίας φακέλου Δεν ήταν δυνατό το άνοιγμα της διεÏθυνσης URL: %s Δεν ήταν δυνατή η εκτέλεση ενός Ï€ÏογÏάμματος πεÏιήγησης Web: %s Άνοιγμα αυτής της URL με μη αυτόματο Ï„Ïόπο: %sΑδυναμία έναÏξης flmsgΧώÏαΧώÏα δουλεμένου σταθμοÏΔημιουÏγεί ένα τετÏαγωνικό σήμα 1000 Hz στο δεξί κανάλιΔημιουÏγία αναφοÏάς cabrilloΔημιουÏγία νέου αÏχείου logbookΔημιουÏγία sunspotsΠÏοσαÏμοσμένο...ΑποκοπήΤο DTR είναι η γÏαμμή σήματος PTTΤο DTR είναι η εντολή PTTΛόγος παÏλας και τελείαςΠαÏλα/ΤελείαΑÏχεία δεδομένων...Συγχώνευση βάσης δεδομένων σε εξέλιξηΗμεÏομηνίαΗμεÏομηνία λήξης QSOΗμεÏομηνία έναÏξης QSOΗμεÏ./ÎÏα ON == OFFΕπαναφ.RST in 599/59 από Ï€ÏοεπιλογήRST out 599/59 από Ï€ÏοεπιλογήΠÏοεπ.ÏυθμίσειςΠÏοεπιλεγμένο μήνυμαΑÏχικές Ïυθμ.ΚαθυστέÏηση ÎÎ msec μετά από εκτέλεση αλλαγής modeΚαθυστέÏηση ÎÎ msec Ï€Ïιν από την αποδέσμευση του PTTΚαθυστέÏηση ÎÎ msec Ï€Ïιν από την έναÏξη του ήχουΔιαγÏαφήΔιαγÏαφή καταχώÏησης;ΔιαγÏαφή Ï„Ïέχουσας εγγÏαφήςΑποεπιλογήΕπίπεδο ανίχν.σήματοςΕπίπεδο εντοπισμοÏΑνώτατο κατώφλι ανιχνευτήΚατώτατο κατώφλι ανιχνευτήΗ συσκευή υποστηÏίζει αμφίδÏομη λειτουÏγίαΣυσκευή:ΣυσκευέςΧÏώμα ψηφίουΨηφίαΔιαδÏομή φακέλου δεν βÏέθηκεΑπενεÏγ.όλωνΑπενεÏγ.αλλαγή συχν.ΑπενεÏγοπoiεί πεÏαιτέÏω ανίχνευση όταν γίνει λήψη ενός RSIDΑπενεÏγοποιήστε σε αÏγές CPU ή όταν ο πεÏιηγητής σημάτων δεν χÏησιμ.ΑπενεÏγοποίηση του spotting όταν δεν είναι οÏατός ο πεÏιηγητής σημάτωνΑπενεÏγοποίηση ανίχνευσηςΠÏοβολήΠÏοβολή Λήψης ως κυλιόμενο κείμενοΠÏοβολή Λήψης σε ανεστÏαμμένη εικόναΕμφάνιση ονόματος αÏχείου logbook κατά την εκκίνησηΠÏοβολή αÏχείου macro κατά την εκκίνησηΧωÏίς αυτόματη μετάβαση στην συχνότητα λήψης RsIDΣταθεÏÏŒ παλμογÏάφημαΧωÏίς αποθήκευσηΣέÏνοντας την κλίμακα καταÏÏάκτη αλλάζει η συχνότηταΟ οδηγός απαιτεί τα stop bits να είναι ΜΗΔΕÎ!ΧÏώμα DupΈλεγχος διπλότυπου CALL συνΔιπλότυπαΕνεÏγοπ.ΕνεÏγοποίηση -ΕνεÏγοποίηση ΑπενεÏγοποίηση εικονιδίων στα μενοÏΕνεÏγοποίηση / ΑπενεÏγοποίηση Î²Î¿Î·Î¸Î·Ï„Î¹ÎºÎ¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…Î•Î½ÎµÏγοποίηση ARQΧÏήση φίλτÏου DSP Ï€Ïιν τον αποκωδικοποιητήΕνεÏγοποίηση Ïοής δεδομένωνΕνεÏγοποίηση KISSΕνεÏγοποίηση FEC συμβατό με MultiPSKΕνεÏγ.όλωνΕνεÏγ.επιλογής για την εμφάνιση του αντίστοιχου στοιχείου ελέγχουΕνεÏγοποίηση συÏσίματος της κλίμακας καταÏÏάκτη με τον κέÏσοÏαΕνεÏγοποιήστε για αυτόματη συμπλήÏωση πεδίου log με μονό κλικ στον πίνακα ΛήψηςΕνεÏγοποιήστε για Ï€Î¿Î»Ï Î±ÏƒÎ¸ÎµÎ½Î® σήματαΕνεÏγοποιήστε εάν ο υπολογιστής σας δεν αποκωδικοποιεί σωστάΕνεÏγοποίηση αυτής της καταχώÏησης κατά την εκκίνηση του fldigiΕνεÏγοποιήστε για χαÏακτήÏες UTF-8ΕνεÏγοπ.για αποστολή τόνων έναÏξης/τέλουςΕνεÏγοποιήστε για τα έχετε τον πίνακα Εκπομπής επάνω από τον πίνακα ΛήψηςΕνεÏγοποιήστε για επιλογή εÏÏους ημεÏομηνίαςΕνεÏγοποιημένοΕισάγετε πλήÏη διαδÏομή και αÏχείο του εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματοςΕισάγετε πλήÏη διαδÏομή και αÏχείο του flampΕισάγετε πλήÏη διαδÏομή και αÏχείο του fllogΕισάγετε πλήÏη διαδÏομή και αÏχείο του flmsgΕισάγετε πλήÏη διαδÏομή και αÏχείο του flnetΕισάγετε πλήÏη διαδÏομή και αÏχείο του flrigΕισάγετε πλήÏη διαδÏομή και αÏχείο του tqslΕισάγετε πλήÏη διαδÏομή αÏχείου για το cty.datΕισαγωγή χÏÎ¿Î½Î¹ÎºÎ¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ σε λεπτάΖυγέςΖυγές γÏαμ.Ζυγές γÏαμμέςΕκτελέσιμο αÏχείο για εισαγωγήΕκτέλεσηΕκτέλεση του αÏχείου script: %sΈξοδοςΥπενθυμίσεις εξόδουΕξαγωγήΡυθμίσεις εξαγωγήςΕξαγωγή εγγÏαφών για ανέβασμα στο LoTWΕξαγωγή σε αÏχείο ADIFΕξαγωγή σε αÏχείο CSVΕξαγωγή σε αÏχείο σταθεÏών πεδίωνΕξαγωγή...ΑÏχεία FLMSG...ΜποÏείτε να παÏαλείψετε οποιοδήποτε βήμα του βοηθοÏΕίσοδος/Έξοδος μόνο σε αÏχείοΔεν βÏέθηκε αÏχείοΣφάλμα ανάγνωσης αÏχείουΑÏχείο:ΑÏχείαΣυμπλήÏωση ΧώÏας / Αζιμουθίου χÏησιμοποιώντας πληÏοφοÏίες από το αÏχείο cty.datΦίλτÏοΕÏÏος ζώνης φίλτÏουΦιλτÏάÏισμαΕÏÏεση χώÏας:ΕÏÏεση επόμενουΕÏÏεση prefix:ΕÏÏεση Ï€ÏογοÏμενουΕÏÏεση: ΤέλοςΦάκελος Ïυθμ.Fldigi...ΡÏθμιση FldigiΒοηθός ÏÏθμισης FldigiΙστότοπος Fldigi...ΕλεÏθεÏο παλμογÏάφημαΦάκελοιΓÏαμματ.ΧÏώμα γÏαμματοσειÏάςΓÏαμμ...ΧÏώμ./ΓÏαμμ.ΓÏαμματοσειÏά:RST out 599/59 από Ï€ÏοεπιλογήΜετατÏοπή του πεδίου callsign σε ΚΕΦΑΛΑΙΑΟÏισμός υποχÏεωτικά ΗμεÏ./ÎÏα ON == ΗμεÏ./ÎÏα OFFΣυχνότηταΣυχνότητα σε MHzΚλίμακα συχνοτήτωνΠλήÏεςΠλήÏης αναφοÏάΓενικάΔημιουÏγίαΔημιουÏγεί ένα τετÏαγωνικό σήμα 1000 Hz στο δεξί κανάλιΔημιουÏγία σήμα τετÏÎ±Î³Ï‰Î½Î¹ÎºÎ¿Ï ÎºÏματος στο δεξί κανάλιΟμάδα 1Ομάδα 2Ομάδα 3Ύψος της μπάÏας macroΠαÏάμετÏοι λήψης HellΠαÏάμετÏοι εκπομπής HellΑπόκÏυψηΑπόκÏυψη παÏαθÏÏου μετά από (s):ΥψηλόΑνώτατο ÏŒÏιο συχνότητας σε HzIFKP εικόνα RawΑγνόηση διπλότυπωνΧÏόνος αδÏάνειαςΊντσες υδÏαÏ.Hg.Îα συμπεÏιλαμβάνεται η συχνότητα εκπομπήςΗμεÏομηνία τέλους της εξαγωγήςΑÏχική κατάσταση του DTRΑÏχική κατάσταση του RTSΑÏχική τάση στο DTRΑÏχική τάση στο RTSΑÏχικοποίηση των QSO logging πεδίωνΕισαγωγή ÏƒÎ·Î¼Î±Î´Î¹Î¿Ï ÏƒÏ„Î¿ κείμενο Λήψης Ï€Ïίν την αλλαγή συχνότητας και modemΕισαγωγή Ï€ÏοκαθοÏ.κειμένουΕισαγωγή αÏχείου...ΠÏοσθήκη αÏχικών μηδενικών στον εκπεμπόμενο σειÏιακό αÏιθμόΕισαγωγή σημαδιοÏΕισαγωγή ÎµÎ¹Î´Î¹ÎºÎ¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï… στον πίνακα Λήψης όταν γίνεται κλικ στον καταÏÏάκτηΕισαγωγή κειμένουΕισαγωγή κειμένου με μονό αÏιστεÏÏŒ κλικΕνδιαφέÏουσες σημειώσειςΈλεγχος KISSΚαθυστέÏηση μεταφ.Θα πεÏιέχουν ήχο του modem και τα δÏο κανάλιαΑÏιστεÏÏŒ κλικ για καθαÏισμό κειμένου Δεξί κλικ για επαναφοÏά συχνοτήτωνΑÏιστεÏÏŒ κλικ για επιλογή χÏώματος διπλότυπωνΑÏιστεÏÏŒ κλικ: αλλαγή mode Δεξί κλικ: ÏÏθμισηΑÏιστεÏÏŒ ή δεξί κλικ αναπαÏάγει πάντα το ιστοÏικό ήχουΧÏώματα ενεÏγοποιημένων φωτιζόμενων κουμπιώνΠεÏιοÏισμός κίνησης AFC στο εÏÏος αυτόΓÏαμμή: %d Σφάλμα:%d %s (%s)Αναζήτηση για σήματα μέσα στο εÏÏος αυτόΛήψη αÏχείου LoTWΦόÏτωσηΦόÏτωση καινοÏÏιας παλέταςΦόÏτωση αÏχείου εικόναςΦόÏÏ„.τελευτ.αÏχείου macro κατά την εκκίν.ΦοÏτώστε ή σÏÏετε ένα αÏχείο εικόνας ΥποστηÏιζόμενοι Ï„Ïποι: PNG, JPEG, BMPΦόÏÏ„...ΕντοπισμόςΕντοπισμός binaryΕντοπισμός αÏχείου cty.datΕντοπισμός εκτελέσιμουΕντοπισμός εκτελέσιμου flampΕντοπισμός εκτελέσιμου fllogΕντοπ.flmsgΕντοπισμός εκτελέσιμου flmsgΕντοπισμός εκτελέσιμου flnetΕντοπισμός εκτελέσιμου flrigΕντοπισμός εκτελέσιμου program #1Εντοπισμός εκτελέσιμου program #2Εντοπισμός εκτελέσιμου program #3Εντοπισμός εκτελέσιμου tqslΤοποθεσίαΚλείδωμαΚλείδωμα συχνότητας εκπομπήςΚαταγÏαφή όλου του κειμένου Λήψης/ΕκπομπήςΧÏήστης LoTWΧαμηλόΚατώτατο ÏŒÏιο συχνότητας σε HzΚατώτατοΚατώτατο ÏŒÏιοΧαμηλότεÏη συχνότητα στο κάτω μέÏοςΕικόνα MFSKΑÏχείο εικόνας MFSKMYCALL πάντα σε πεζάΕτικέτα ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï macroΚείμενο MacroΕπεξεÏγαστής macro - ΧειÏοκίνητος συντονισμόςΜόνο MarkΣημαδ.Ï€Ïοηγ.συχν./modeΚυλιόμενο κείμενοΊσως απαιτεί αλλαγή μεγέθους των πινάκων Λήψης/ΕκπομπήςΈνωση αÏχείων ADIFΈνωση...ΧÏώμα μετÏ.Μίλια / ÎÏαΛιγότεÏα ÏυθμιστικάΕλάχιστος χÏόνος Î¼ÎµÏ„Î±Î¾Ï Î³ÎµÎ³Î¿Î½ÏŒÏ„Ï‰Î½Î”Î¹Î¬Ï†.ΔιάφοÏαΛείπει η εντολή %s μετά τη γÏαμμή%dΤο Mode Ï€Ïέπει να είναι ίδιοΣήμα του modem σε αÏιστεÏÏŒ και δεξί κανάλιΠαÏακολοÏθηση σήματος εκπομπήςΠοντίκιΕνεÏγή Ïοδέλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î± κουμπιά macroΠολυκάναλη επεξεÏγασία σημάτωνΠολυκάναλος ανιχνευτήςΟ σταθμός μουΑÏχεία NBEMS...ΕΑΠΔΕΠΥΠΑΡΧΕΙ ΔΙΑΘΕΣΙΜΗ ΣΥΣΚΕΥΗ ΗΧΟΥ (ή για δοκιμές)ΔΕΠΕΧΕΙ ΟΡΙΣΤΕΙ CALLSIGNÎέοÎέα εγγÏαφή / Αποθήκευση εγγÏαφήςΕπόμενοΌχιΌχι γÏηγοÏότεÏο από αυτόΔεν δόθηκε όνομα αÏχείουΌχι πιο αÏγό από αυτόΚανέναΚανονικόΑποκοπήΣημείωση: Αυτές οι Ïυθμίσεις είναι χÏήσιμες αλλά όχι μοναδικές για τη χÏήση του fldigi σε μια συσκευή με οθόνη αφής, όπως ένα tablet.ΣημειώσειςΕιδοποιήσειςΜόνο ενημέÏωσηΠλήθος και θέση των μπαÏών macroΑÏιθμός ψηφίων στον σειÏιακό αÏιθμόON - Συνεχή κÏλιση κειμένου OFF - ΚαθαÏισμός & επανεκκίνηση κειμένουON - αναζήτηση σε όλο τον καταÏÏάκτη OFF - πεÏιοÏισμός αναζήτησης σε +/- 200 HzON - χÏήση του τελευταίου σετ macros OFF - χÏήση του Ï€ÏοκαθοÏισμένου σετΜονέςΜονές γÏαμ.Μονές γÏαμμέςΜία επάνω από Rx/TxΜία επάνω από καταÏÏ.Μία κάτω από καταÏÏ.&Mode λειτουÏγίαςΆνοιγμα ...Άνοιγμα λίσταςΆνοιγμα αÏχείου logbookΆνοιγμα αÏχείου macroΆνοιγμα φακέλου μηνυμάτωνΆνοιγμα μηνÏματος με flmsgΆνοιγμα αÏχείου Π/Δ xmlΆνοιγμα με flmsgΆνοιγμα...ΧειÏιστήςΧαÏακτηÏιστικό ΧειÏιστήCallsign χειÏιστή:Όνομα χειÏιστή:Callsign χειÏιστή (εάν είναι διαφοÏετικό από το callsign σταθμοÏ)QTH σταθμοÏΌνομα χειÏιστήΕπιλογέςΆλλαPSK κλπ.Οι καθυστεÏήσεις PTT ισχÏουν για όλους τους Ï„Ïόπους CAT/PTTΚαθυστέÏηση PTT λήξης εκμπομπήςΗ εντολή CAT είναι το PTTΤόνος PTT στο δεξί κανάλι ήχουPTT με χÏήση εντολής hamlibPTT μεσώ εντολής hamlibΜετÏητής ισχÏοςΗ παÏάμετÏος δεν είναι έγκυÏη.Ανάλυση όλου του κειμένου ΛήψηςΜεÏικόΕπικόλλησηΑναπαÏαγωγή ιστοÏÎ¹ÎºÎ¿Ï ÏŒÏ„Î±Î½ επιλέγεται ενεÏγό κανάλιΑναπαÏαγωγήΣυσκευή αναπαÏαγωγήςΑναπαÏαγωγή:ΠÏώτα οÏίστε το callsign σας.Αναδυόμενες πληÏοφοÏίες μετά από ένα πέÏασμα 2 δευτεÏολέπτων στο callsignΘÏÏαΗ θÏÏα είναι η δεÏτεÏη συσκευή του SCU-17ΘÏÏα:Τοποθετεί τις 4 μπάÏες macro κάτω από τον πίνακα Εκπομπής Η Ï€Ïοεπιλεγμένη ÏÏθμιση είναι επάνω από τον πίνακα ΛήψηςΚλίμακα ισχÏοςΠιέστε ENTER για να συνεχίσει η αναζήτησηΑποτÏπωση CW / RTTY / THROB / CONTESTIA με πεζάΠÏογ.1:ΠÏογ.2:ΠÏογ.3:ΕÏÏŽÏ„.για αποθήκευση ÏυθμίσεωνΕÏÏŽÏ„.για αποθήκευση logΕÏÏŽÏ„.για αποθήκ.log κατά την έξοδοΕÏÏŽÏ„.για αποθήκ.αÏχείου macroΨευδο-FSK σήμα στο δεξί κανάλιΨευδο-FSK σήμα στο δεξί κανάλι ήχουΣχήμα παλμοÏQSK στο δεξί κανάλιQSL ελήφθη την ημεÏομηνία αυτήQSL απεστάλη την ημεÏομηνία αυτήΗμεÏομηνία QSOΔεν Ï€Ïέπει να γίνει QSO μέσα σε αυτό το χÏονικά διάστημαΛήψη RSIDRST πάντα 599/59Το RTS είναι η γÏαμμή σήματος PTTΤο RTS είναι η εντολή PTTΈλεγχος Ïοής RTS/CTSΕμφάνιση παλμογÏ, RTTYΤο RTTY είναι διαμ. USBΚαταγÏαφή σημάτων ΛήψηςΣυχνότητα Π/ΔΕÏÏοςΕÏÏος +/- wpmΕÏÏος 1...3ΕÏÏος 1...4ΡÏθμιση εÏÏους WPM ΠÏοκαθοÏισμένο = 25ΛόγοςΑνάγνωση γÏαμματοσειÏών...ΔιαγÏαφή καταχώÏησης για "%s";ΛήψηΧÏήση κατά την ΛήψηΕÏÏος φίλτÏου ΛήψηςΠÏόσφατη δÏαστηÏιότητα για το gridΑναφοÏές λήψης...ΕγγÏαφή και των δÏο καναλιώνΕπαναφοÏÏ„.ΞαναφοÏτώνει το αÏχείο cty.datΑφαίÏεσηΑναφοÏά συχν.Π/Δ (ενεÏγ.μόνο εάν έχετε έλεγχο Π/Δ)ΑναφοÏέςΕπαναφ.ΕπαναφοÏά όλων των επιλογών στις αÏχικές τιμές; Η επαναφοÏά θα Ï€Ïαγματοποιηθεί στην επόμενη επανεκκίνηση Τα αÏχεία: fldigi_def.xml και fldigi.prefs θα διαγÏαφοÏν! ΕπαναφοÏά Ïυθμίσεων UART στο ΚλείσιμοΕπαναφέÏει τον αÏχικό φάκελο του cty.datΕπαν.Ï€ÏοεπιλογώνΕπαναφέÏει τις Ïυθμίσεις της σειÏιακής (COM) θÏÏαςΑνάκτησηΑνάκτηση για χÏήση ενεÏÎ³Î¿Ï modemΕπιστÏοφή της διεÏθυνση IP και του αÏÎ¹Î¸Î¼Î¿Ï Î¸ÏÏας στην Ï€Ïοεπιλεγμένη τιμή.ΑναστÏοφήΑναστÏοφή ΑÏιστεÏοÏ/Î”ÎµÎ¾Î¹Î¿Ï ÎºÎ±Î½Î±Î»Î¹Î¿ÏΑναστÏοφή εικόναςΠ/ΔΈλεγχος Π/ΔMode Π/ΔΟ πομποδέκτης απαιτεί έλεγχο Ïοής RTS/CTSΟ πομποδέκτης απαιτεί έλεγχο Ïοής Xon/XoffΟ Π/Δ χÏησιμοποιεί έλεγχο Ïοής RTC/CTSΠ/Δ:Δεξί κανάλιΑνίχνευση RsIDΕκτέλεση Ï€ÏογÏάμματοςΕκτέλεση Ï€ÏογÏάμματος:Πίνακες Λήψης/ΕκπομπήςAGC λήψηςΎψος Λήψης σε pixelsΠαÏάμετÏοι λήψηςΚείμενο ΛήψηςΚωδικοποίηση χαÏακτήÏων Rx/TxΣυμπεÏιφοÏά S/N και IMDΑποκωδικοπ. SOMΡυθμός δειγματοληψίαςΑποθήκευσηΑποθήκευση ...Αποθήκευση ÏυθμίσεωνΑποθήκευση ως...Αποθήκευση αλλαγών Logbook;Αποθήκευση αλλαγών Ïυθμίσεων;Αποθήκευση αλλαγών macros;Αποθήκευση καταχώÏησης log;Αποθήκευση αÏχείου logbookΑποθήκευση αÏχείου macroΑποθήκευση κειμένου ωςΑποθήκευση αυτής της παλέταςΑποθήκ...ΧÏώμα κλίμ.ΠαλμογÏάφημαΚÏλισηΑναζήτηση για αυτό το callsignΕÏÏος αναζήτησης (Hz)Αναζήτηση σε όλο το εÏÏοςΔευτεÏεÏον κείμενοΔευτεÏόλεπταΕπιλογήΕπιλ.όλωνΕπιλέξτε Πεδία για ΕξαγωγήΕπιλογή ΕγγÏαφών για ΕξαγωγήΕπιλογή της κωδικοποίησης χαÏακτήÏων του Λαμβανόμενου και Εκπεμπόμενου κειμένουΕπιλογή ετικέταςΕπιλογή εÏÏους ζώνηςΕπιλογή συσκευήςΕπιλέξτε πως θα συμπεÏιφέÏεται η Ïοδέλα του Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î¿Î½ καταÏÏάκτηΕπιλογή γÏαμμήςΕπιλογή modes για Ï€Ïόσβαση στο μενοÏΕπιλογή αÏÎ¹Î¸Î¼Î¿Ï Ï„ÏŒÎ½Ï‰Î½Î•Ï€Î¹Î»Î¿Î³Î® γÏαμματοσειÏά κλίμακας καταÏÏάκτηΕπιλογή αÏχείου wavΑποστολήΑποστολή του callsign σε CW στο τέλος κάθε εκπομπήςΑποστολή συνεχοÏÏ‚ Ïοής χαÏακτήÏων δοκιμήςΑποστολή beacon κάθε...Συνεχής αποστολήΑποστολή εικόναςΑποστολή εικόνας...Αποστολή αναφοÏάς λήψης όταν γίνεται log ένα QSOΑποστολή αναφοÏάς λήψης μόνο όταν γίνεται log το QSOΑπεσταλμένοι χαÏακτήÏες στους πίνακες Εκπομπής/ΛήψηςΡυθμίσειςΣÏντομη πεÏιγÏαφή κεÏαίαςΕμφάνισηΕμφάνιση χÏονομέτÏου ΕκπομπήςΠÏοβολή παÏαθÏÏου ειδοποίησης:Εμφ.όλων των modeΕμφάνιση ίχνους εÏÏους ζώνης στον καταÏÏάκτηΕμφ.καναλιώνΕμφάνιση κέÏσοÏα με γÏαμμές εÏÏους ζώνηςΕμφάνιση κέÏσοÏα με κεντÏική γÏαμμήΕμφ.λιγότεÏων modeΕμφ.χαÏακτήÏων ελέγχου macroΠÏοβολή επεξεÏγασίας macroΕμφάνιση μεγαλÏτεÏου ή μικÏότεÏου καταÏÏάκτηΕμφάνιση εικονιδίων μενοÏΕμφάνιση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï‰Ï‚ απλό κείμενοΕμφ.βοηθ.κειμένουÎα φαίνεται το εκπεμπόμενο σήμα στον καταÏÏάκτηΠεÏιηγητής σημάτωνΧÏώματα στάθμης σήματοςΠεÏιηγητής σημάτωνΕπίπεδο σήματοςΕÏÏος σήματος (dB)Αναζήτ.σήματοςΊχνη σήματοςΜονή μπάÏα macro κάτω από τον logging πίνακα μεταβλητό ÏψοςΣυλλογή κειμένου με μονό κλικΜέγεθος:ΧαÏακτήÏες που παÏαλείφθηκαν στον πίνακα Εκπομπής (Tx on/off στο CW)ΑÏγός επεξεÏγαστής (μικÏότεÏος από 700MHz)ΑναστÏοφή αÏιστεÏοÏ-Î´ÎµÎ¾Î¹Î¿Ï ÎºÎ±Î½Î±Î»Î¹Î¿ÏΟÏισμένες αλλαγές που έγιναν από στο script απαιτοÏν επανεκκίνηση του Ï€ÏογÏάμματος Ï€Ïιν να γίνουν ενεÏγές.Ταξινόμηση κατά ΗμεÏ/ÎÏα OFFΗ ταξινόμηση κατά ΗμεÏ/ÎÏα OFF - επηÏεάζει όλες τις αναφοÏές ADIF/CabrilloΚάÏτα ήχουΉχος:Μόνο SpaceΕιδ.χαÏακτ.Αναλυτής φάσματοςΑναλυτής φάσματος / ΑλληλεπίδÏαση καταÏÏάκτηΑναλυτής φάσματοςΤαχÏτητα (WPM):ΑπενεÏγ.SpottingΕπίπεδο SquelchΈναÏξηΗμεÏομ.ΑÏχήςΑÏχικός αÏιθ.ΗμεÏομηνία αÏχής της εξαγωγήςΈναÏξη flampΈναÏξη fllogΈναÏξη flnetΈναÏξη flrigΚαθυστέÏηση PTT έναÏξης εκμπομπήςΕκκίνηση prog1Εκκίνηση prog2Εκκίνηση prog3ΑÏχικός αÏιθμόςΣταθμός / ΧειÏιστήςCall σταθμοÏCallsign σταθμοÏ:LOC σταθμοÏLocator σταθμοÏLocator σταθμοÏ:QTH σταθμοÏQTH σταθμοÏ:Callsign σταθμοÏGrid square σταθμοÏΚατάστασηΗμεÏομ.τέλουςΑποθήκευση mode και συχνότητας Δεξί κλικ για λίσταΜετάβαση σε ARQ I/OΧÏώμ.συστήμ.ΣÏστημαTHOR εικόνα RawΙσχÏÏ‚ εκμπομπήςΌÏιο χÏόνου Εκπομπής (λεπτά)ΔημιουÏγία σημάτων ΕκπομπήςΘεÏμοκÏασίαΔοκιμήΣήματα δοκιμώνΧαÏακτ.δοκιμήςΔοκιμαστικό αÏχείο κειμένουΔοκιμή...ΚαταγÏαφή κειμένουΧÏώματα κειμένουΕπισήμανση κειμένουΑÏχείο κειμένου για εισαγωγήΚείμενο για αποστολή κατά τη διάÏκεια ηÏεμίας στην πληκτÏολόγησηΤο όνομα αÏχείου εμφανίζεται στον πίνακα ΛήψηςΟ βοηθός θα σας οδηγήσει για τις βασικές Ïυθμίσεις του fldigiÎÏαÎÏα λήξης QSOÎÏα έναÏξης QSOΧÏόνος που απαιτείται: ΔιαφοÏά ÏŽÏας πάνω απόΧÏονισμόςΧÏονισμός και QSKΧÏονισμός/ΡυθμίσειςΣε ποιόν έχει γίνει σÏνδεσηΕναλλαγή DTR για PTTΕναλλαγή RTS για PTTΔιάÏκεια τόνου (δευτ.)ΤόνοιΤαχÏτητα μεταφοÏάς X1-κανονικήΕκπομπήΙσχÏÏ‚ εκπομπήςΧÏήση κατά την ΕκπομπήΕκπομπή callsignΓÏαμματοσειÏά εκπομπήςΕκπομπή κειμένου σε πεζάΑποστολή τελείων (.) σε ηÏεμίαΙσχÏÏ‚ εκπομπής που χÏησιμοποιήθηκεΣήμα εκπομπήςΕκπομπή κειμένουΕκπομπή/ΛήψηΣτέλνει τελείες όταν δεν υπάÏχει δÏαστηÏιότητα πληκτÏολογίουΣχέδιο των δÏο 1Σχέδιο των δÏο 10Σχέδιο των δÏο 2Σχέδιο των δÏο 3Σχέδιο των δÏο 4Σχέδιο των δÏο 5Σχέδιο των δÏο 6Σχέδιο των δÏο 7Σχέδιο των δÏο 8Σχέδιο των δÏο 9ΠαÏάμετÏοι εκπομπήςΕκπομπή πάνω από ΛήψηΕξασθενητής επιπέδου Εκπομπής (dB)ΙσχÏÏ‚ εξόδου που χÏησιμοποιείται για καταχωÏήσεις στο logΓλώσσα πεÏιβ.χÏήστη (UI)Σχέδιο UIΠολιτεία ΗΠΑ δουλεμένου σταθμοÏΜονάδες απόστασης ΗΠΑ (QRB)Αδυναμία ανοίγματος αÏχείου %sΑπÏοσδιόÏιστο σφάλμαΑναίÏεσηFormat δεν υποστηÏίζεταιΕνημέÏ.Δεν υπάÏχει διαθέσιμο site ενημεÏώσεωνΕνημέÏωση Ï„Ïέχουσας εγγÏαφήςΑνώτατοΑνώτατο ÏŒÏιοΑνώτατη στάθμη σήματος (dB)ΧÏήση φίλτÏου DSP Ï€Ïιν τον αποκωδικοποιητήΧÏήση DTRΧÏήση χÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï FarnsworthΧÏήση HamlibΧÏήση διακομιστή Pulse AudioΧÏήση RTSΧÏήση RigCATΧÏήση έγχÏ.κουμπιώνΧÏήση της ημεÏ./ÏŽÏας off για το logΧÏήση αÏχικών μηδενικώνΧÏήση της παÏάλληλης θÏÏας για PTTΧÏήση ξεχωÏιστής θÏÏας για PTTΜικÏή γÏαμματ.ΠεÏιβάλλον ΧÏήστηΕπιβεβ.Η έκδοση %s είναι διαθέσιμη στο Source ForgeΕμφάνισηΕμφ./ΑπόκÏ.48 macrosΕμφ./ΑπόκÏ.καναλιώνΟÏατά modesΠΡΟΣΟΧΗ - αυτή η ενέÏγ.θα αντικαταστήσει ΟΛΕΣ τις ÏυθμίσειςΚαταÏÏάκτηςΚαταÏÏάκτης / FFT / ΠαλμογÏάφημαΡυθμιστικά καταÏÏάκτηΤαχÏτητα κÏλισης καταÏÏάκτηΎψος καταÏÏάκτη σε pixelsΛήψη εικόνας Weather FaxΑποστολή εικόνας Weather FaxΕνέÏγεια ÏοδέλαςΌταν δεν υπάÏχει σήμαΦαÏδÏΘα συμβεί μετά από τόσα δευτεÏόλεπταΤαχÏτητα/κατευθ.ανέμουΔιαχωÏιστικά λέξεωνΑναδίπλωση λέξεωνΑποθήκευση του Ï„Ïέχοντος macro set κατά την έξοδοΈλεγχος Ïοής XON/XOFFÎαιΤÏέχετε την τελευταία έκδοσημετά απόπάντα Ï€ÏοσάÏτηση σε αÏχείο(α)αυτόματο ανέβασμα δεδομένωνβοηθ.κείμενο του callsign στο λαμβαν.κείμενοκανάλια != 1εκκαθ.παλιών δεδομ.Φάκελος cty.datÏ„Ïέχουσες καιÏικές συνθήκεςΧÏήση της ημεÏ./ÏŽÏας on από Ï€ÏοεπιλογήΕμφάνιση των λαμβανομένων χαÏακτ.ελέγχου ως ascii stringΧÏήστης eQSLΕνεÏγοποίηση της Ïοδέλας Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î± κουμπιά macroΚλίμακα συχνότ. = Î * το εÏÏος του modeΧιλιόμετÏα / ÎÏατο αÏιστεÏÏŒ κλικ στον καταÏÏάκτη επανακεντÏάÏει τον αναλυτή φάσματοςτο αÏιστεÏÏŒ κλικ μεταφέÏει την συχν. στην κεντÏική συχν. του αναλυτήλεπτάΌχιεμφάνιση των ^! συμβόλων εκτέλεσης στον πίνακα ΛήψηςαναφοÏάνα αναφέÏονται βαθμοί Κελσίουνα αναφέÏονται βαθμοί Fahrenheitνα αναφέÏονται ίντσες υδÏαÏγÏÏου (Hg)να αναφέÏονται ΧιλιόμετÏα ανά ÏŽÏανα αναφέÏονται Μίλια ανά ÏŽÏανα αναφέÏονται millibarsαναφοÏέςΚλίμακα αναλυτή φάσματος συνδεδεμένη με το εÏÏος του modemδευτεÏόλεπταεπιλογή γÏαμματοσειÏάς πεÏιηγητήεπιλογή ανά ημ/νίαΤοποθεσία ÏƒÏ„Î±Î¸Î¼Î¿Ï tqslΆγνωστο σφάλμα αÏχείου waveχÏήσηχÏήση τιμών του εÏÏους/οÏίου καταÏÏάκτητιμές αÏιστεÏά/κάτω από καταÏÏάκτηεκπομπή τόνων έναÏξης/τέλουςÎαιfldigi-4.1.06/po/Makevars0000644000175000017500000000347513472116044012106 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = w1hkj AT w1hkj DOT com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = fldigi-4.1.06/po/LINGUAS0000644000175000017500000000003113472116044011420 00000000000000el es fr it pl de nl ru fldigi-4.1.06/po/remove-potcdate.sin0000644000175000017500000000066013472116044014214 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } fldigi-4.1.06/po/ru.po0000664000175000017500000076117413515625024011412 00000000000000# Russian translation file for Fldigi. # Copyright (C) YEAR Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the PACKAGE package. # Alexandr Kalugin rx9cdr@gmail.com, 2017. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.23.21.6\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2017-03-14 14:10+0500\n" "Last-Translator: RX9CDR \n" "Language-Team: RX9CDR Russia, tnx for help UV7QAE Ukraina \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.12\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Poedit-SourceCharset: UTF-8\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "%sлог Ñтартует на %s" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "" #: src/main.cxx:1710 msgid "Bad frequency" msgstr "ÐŸÐ»Ð¾Ñ…Ð°Ñ Ñ‡Ð°Ñтота" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 msgid "Could not make directory " msgstr "Ðе удалоÑÑŒ Ñоздать каталог" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "Загрузить вÑе RX/TX текÑты" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "RIG контроль" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "МодулÑциÑ" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Показать меньше режимов" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Показать вÑе моды" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "Вид" #: src/dialogs/fl_digi.cxx:198 msgid "MFSK Image" msgstr "MFSK Изображение" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:200 msgid "IFKP Raw Image" msgstr "IFKP Raw Image" #: src/dialogs/fl_digi.cxx:201 msgid "Weather Fax Image RX" msgstr "RX Погодных факÑов" #: src/dialogs/fl_digi.cxx:202 msgid "Weather Fax Image TX" msgstr "" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "КонтеÑты" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "Страны" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "ИнтерфейÑ" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "Полный" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "ЧаÑтичный" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Ðет" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "Docked scope" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "Минимальный контроль" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "Показать каналы" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "СоединитьÑÑ Ñ Ñервером" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "Custom..." #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "Сохранить измененные макроÑÑ‹?" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "Выйти" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Сохранить" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "Ðе ÑохранÑть" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "ПереключитьÑÑ Ð½Ð° ARQ I/O" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "Ðет" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Да" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "Ðе указано Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "Ðе иÑпользуемый формат" #: src/dialogs/fl_digi.cxx:2700 msgid "channels != 1" msgstr "channels != 1" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "неизвеÑтный Wave файл" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "Споттинг отключен" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Браузер не запуÑтилÑÑ:\n" "%s\n" "\n" "откройте URL вручную:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Ðе открываетÑÑ url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Проверить обновление" #: src/dialogs/fl_digi.cxx:2858 msgid "Update site not available" msgstr "Сайт обновлений не доÑтупен" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "Ð’Ñ‹ иÑпользуете поÑледнюю верÑию" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "Ð’Ñ‹ иÑпользуете поÑледнюю верÑию" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, c-format msgid "Version %s is available at Source Forge" msgstr "ВерÑÐ¸Ñ %s доÑтупна на Source Forge" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "Создание Ñолнечных пÑтен!" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± аудио уÑтройÑтве доÑтупна только Ð´Ð»Ñ PortAudio" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "УÑтройÑтво захвата" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "УÑтройÑтво воÑпроизведениÑ" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Захват и воÑпроизводÑщие уÑтройÑтва" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Ðе ÑущеÑтвует, Ñоздать?" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "ОчиÑтить Ð¿Ð¾Ð»Ñ Ð»Ð¾Ð³Ð°?" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Подтвердить" #: src/dialogs/fl_digi.cxx:4525 msgid "Save changed configuration?" msgstr "Сохранить конфигурацию?" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 msgid "Save log entry?" msgstr "Сохранить журнал?" #: src/dialogs/fl_digi.cxx:4557 msgid "Confirm Quit" msgstr "Подтвердить выход" #: src/dialogs/fl_digi.cxx:4579 msgid "Confirm quit?" msgstr "Подтвердить выход?" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "Файл" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Папки" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Fldigi config..." #: src/dialogs/fl_digi.cxx:5865 msgid "FLMSG files..." msgstr "FLMSG files..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "NBEMS files..." #: src/dialogs/fl_digi.cxx:5867 msgid "Data files..." msgstr "Data files..." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "МакроÑ" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Откр..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Сохр..." #: src/dialogs/fl_digi.cxx:5875 msgid "Config Scripts" msgstr "Конфиг Ñкриптов" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "Выполнить" #: src/dialogs/fl_digi.cxx:5877 msgid "Generate" msgstr "Создать" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "Захват текÑта" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Ðудио" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "Rx захват текÑта" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "TX генерациÑ" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "ВоÑпроизведение" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Выход" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "КонфигурациÑ" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "ИнтерфейÑ" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "Цвета && Шрифты" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "Оператор" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "ИнтерфейÑ" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "Водопад" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "ÐаÑтройка водопада" #: src/dialogs/fl_digi.cxx:6146 #, fuzzy msgid "Operating" msgstr "Оператор" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 #, fuzzy msgid "Active Modem" msgstr "Режимы приема" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "Ð—Ð²ÑƒÐºÐ¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "" #: src/dialogs/fl_digi.cxx:6155 #, fuzzy msgid "CPU speed" msgstr "AFC ÑкороÑть" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/fl_digi.cxx:6157 #, fuzzy msgid "PSKmail" msgstr "Pskmail" #: src/dialogs/fl_digi.cxx:6158 #, fuzzy msgid "PSK reporter" msgstr "PSK Reporter" #: src/dialogs/fl_digi.cxx:6159 msgid "Sweet spot" msgstr "" #: src/dialogs/fl_digi.cxx:6160 msgid "Text IO" msgstr "" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "DTMF" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "WX" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "KML" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Прочее" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "ÐвтоÑтарт" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 msgid "IO" msgstr "IO" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "УведомлениÑ" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 msgid "PSM" msgstr "PSM" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 #, fuzzy msgid "Test Signals" msgstr "Передаваемый Ñигнал" #: src/dialogs/fl_digi.cxx:6175 #, fuzzy msgid "Contest/Logging" msgstr "Журнал Ñоревнований" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "N3FJP logs" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "MacLogger" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Сохранить конфиг" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Показ/Скрыть Каналы" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "Браузер Ñигналов" #: src/dialogs/fl_digi.cxx:6190 msgid "View/Hide 48 macros" msgstr "Показ/Скрыть 48 макроÑов" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "DX Cluster" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "Floating scope" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6205 msgid "Rig/Log Controls" msgstr "Rig/Log Контроль" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "Журнал" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "Вид" #: src/dialogs/fl_digi.cxx:6221 msgid "Files" msgstr "Файл" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Открыть" #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Ðовый" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "СлиÑние..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "ЭкÑпорт..." #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "LoTW" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "pskreporter" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "ТекÑÑ‚..." #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6242 msgid "Field Day Logging" msgstr "Полевой день" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "Помощь" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "РуководÑтво" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "Онлайн помощь" #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Сайт Fldigi" #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "pskreporter.info" #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Парам командной Ñтроки" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "Инфо о звуковом уÑтройÑтве" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "Инфо о Ñборке" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "Журнал Ñобытий" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Проверить обновление..." #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "&О программе" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "Только водопад" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "ÐЕ ÐÐБРÐРПОЗЫВÐОЙ" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Закрыть СпиÑок" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Открыть ÑпиÑок" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "ОчиÑтить ÑпиÑок?" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "отчет" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "отчеты" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "ПоÑледние дейÑÑ‚Ð²Ð¸Ñ Ð² Ñетке" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "Браузер Ñигнала" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Определен уровень Ñигнала" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Уровень шумодава" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Left click: изменить режим\n" "Right click: конфигурациÑ" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "СкороÑть CW" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "Default WPM" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "Уровень аттенюатора Tx (dB)" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "ÐвтоматичеÑкий контроль чаÑтоты" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "Подавление" #: src/dialogs/fl_digi.cxx:8226 msgid "Power Signal Monitor" msgstr "Контроль мощноÑти Ñигнала" #: src/dialogs/fl_digi.cxx:9943 msgid "Delete entry?" msgstr "Удалить запиÑÑŒ?" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Ð’Ñе" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "Ðайти:" #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Закрыть" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "ОчиÑтить" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "левый клик очиÑтить текÑÑ‚\n" "правый клик ÑброÑить чаÑтоту" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "УÑтановки шумодава" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "ЭкÑпортировать в CSV" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "ЭкÑпортировать в fixed field text" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "ЭкÑпортировать в ADIF" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "Комментарий LoTW" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "Сохранить изменениÑ?" #: src/logbook/logsupport.cxx:381 msgid "Create new logbook file" msgstr "Создать новый журнал" #: src/logbook/logsupport.cxx:404 #, c-format msgid "%s exists, overwrite?" msgstr "%s exists, overwrite?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Открыть журнал" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Сохранить журнал" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "Объединить ADIF файлы" #: src/logbook/logsupport.cxx:971 #, fuzzy msgid "No records in lotw download file" msgstr "Выбрать запиÑи журнала Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° загрузки LoTW" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "Обновить" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Удалить запиÑÑŒ Ð´Ð»Ñ \"%s\"?" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "Создать cabrillo отчет" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "Удалить LoTW файл" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить flmsg" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "Locate flmsg executable" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "Ðайти иÑполнÑемый файл" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:497 msgid "Locate binary" msgstr "Locate binary" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "*" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "Rig уÑтановки" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Ð’Ñегда LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Ð’Ñегда USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "СброÑить вÑе параметры на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию?\n" "\n" "Параметры вÑтупÑÑ‚ в Ñилу при Ñледующем запуÑке\n" "Файлы: fldigi _def.xml и fldigi.prefs будут удалены!\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Подтвердить ÑброÑ" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "Тихо" #: src/misc/debug.cxx:89 msgid "Error" msgstr "Ошибка" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "Внимание" #: src/misc/debug.cxx:89 msgid "Info" msgstr "Инфо" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "Подробно" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "Отладка" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "ARQ control" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "Flrig I/O" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:105 msgid "KISS control" msgstr "KISS control" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "Mac Logger" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "ИÑточники лога" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "Уровень изменений лога" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tÐ¼Ð¾Ñ Ñ‡Ð°Ñтота" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tмодулÑциÑ" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tмой позывной" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tмой локатор" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tмоё имÑ" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tмой QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tмой передаваемый RST" #: src/misc/macroedit.cxx:78 msgid "\tmy FD class" msgstr "\tмой клаÑÑ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ днÑ" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "\tÐ¼Ð¾Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ днÑ" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy state" msgstr "\tмоё имÑ" #: src/misc/macroedit.cxx:81 #, fuzzy msgid "\tmy ST" msgstr "\tмой передаваемый RST" #: src/misc/macroedit.cxx:82 #, fuzzy msgid "\tmy county" msgstr "\tÐ¼Ð¾Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ днÑ" #: src/misc/macroedit.cxx:83 #, fuzzy msgid "\tmy CNTY" msgstr "\tмой QTH" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "\tÐ¼Ð¾Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½Ð°" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "\tрабочий диапазон" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "\tверÑÐ¸Ñ Fldigi" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "\tÑ†Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÑƒÐ»ÑÑ†Ð¸Ñ (Ð´Ð»Ñ adif)" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "\tпозывной корреÑпондента" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "\tÐ¸Ð¼Ñ ÐºÐ¾Ñ€Ñ€ÐµÑпондента" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "\tQTH корреÑпондента" #: src/misc/macroedit.cxx:93 #, fuzzy msgid "\tother State" msgstr "\tRST корреÑпондента" #: src/misc/macroedit.cxx:94 #, fuzzy msgid "\tother Province" msgstr "\tÐ¸Ð¼Ñ ÐºÐ¾Ñ€Ñ€ÐµÑпондента" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "\tлокатор корреÑпондента" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "\tRST корреÑпондента" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "" "\t Ð»ÑŽÐ±Ð°Ñ Ð²Ð°Ð¶Ð½Ð°Ñ Ð´Ð»Ñ Ð²Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ. например Ñоотношение Ñигнала к " "шуму " #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "\tÐ»ÑŽÐ±Ð°Ñ Ð²Ð°Ð¶Ð½Ð°Ñ Ð´Ð»Ñ Ð²Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ. IMD и так далее" #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "\t# номер QSO" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "\tÑледующий номер QSO" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "\tкарта в google" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "\tкоординаты на карте" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "\tочиÑтить RX окно" #: src/misc/macroedit.cxx:112 msgid "\tclear TX pane" msgstr "\tочиÑтить TX окно" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk вкл, выкл, переключить" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "\tочиÑтить Ð¿Ð¾Ð»Ñ Ð»Ð¾Ð³Ð°" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "\tзапиÑать QSO в лог" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "\tСохранить QSO и добавить примечаниÑ" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "\tÑохранить QSO и добавить примечаниÑ" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "\tÑохранить в логе eQSL" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "\tÑохранить QSO в eQSL и добавить примечаниÑ" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "\tÐ²Ñ€ÐµÐ¼Ñ QSO в формате (HHMM))" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "\tÐ›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° и Ð²Ñ€ÐµÐ¼Ñ Ð² формате '%Y-%m-%d %H:%M%z'" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\tÐ›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° и Ð²Ñ€ÐµÐ¼Ñ Ð² формате '%x %H:%M %Z'" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "\tЗулуÑÑÐºÐ°Ñ Ð´Ð°Ñ‚Ð° и Ð²Ñ€ÐµÐ¼Ñ Ð² формате '%Y-%m-%d %H:%MZ'" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "\tUTC дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾ умолчанию '%x %H:%MZ'" #: src/misc/macroedit.cxx:137 msgid "\tlocal time, default %H%M" msgstr "\tлокальное Ð²Ñ€ÐµÐ¼Ñ %H%M" #: src/misc/macroedit.cxx:138 msgid "\tzulu time default %H%MZ" msgstr "\tзулуÑÑкое Ð²Ñ€ÐµÐ¼Ñ %H%MZ" #: src/misc/macroedit.cxx:139 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tÐ»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° в формате '%Y-%M-%D'" #: src/misc/macroedit.cxx:140 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tдата в зулуÑÑком формате '%Y-%M-%D Z'" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "\tполучить данные о погоде" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "\tполучить данные о погоде Ð´Ð»Ñ Ñтанции" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "\tконтрольный номер" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "\tуменьшить контрольный номер на единицу" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "\tувеличить контрольный номер на единицу" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "\tпринимаемый контеÑÑ‚ рапорт (не номер ÑвÑзи)" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "\tпередаваемый контеÑÑ‚ рапорт (не номер ÑвÑзи)" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "\tначало контеÑÑ‚ рапорта Ð´Ð»Ñ Ð»Ð¾Ð³Ð°" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "\tконец контеÑÑ‚ рапорта Ð´Ð»Ñ Ð»Ð¾Ð³Ð°" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "\tÑохранить рапорт в лог" #: src/misc/macroedit.cxx:153 msgid "\tcurrent contest serno" msgstr "\tтекущий Ñерийный номер ÑвÑзи" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "\tпредыдущий Ñерийный номер ÑвÑзи" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD class" msgstr "\tмой клаÑÑ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ днÑ" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tFD section" msgstr "\tÐ¼Ð¾Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ днÑ" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "\tcontest class" msgstr "\tмой клаÑÑ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ днÑ" #: src/misc/macroedit.cxx:158 #, fuzzy msgid "
\tARRL section" msgstr "\tÐ¼Ð¾Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ днÑ" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "\tперейти на прием" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "\tвÑтать на передачу" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "\tпереключитьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ приемом и передачей" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "\tпоиÑк Ñигнала выше по чаÑтоте" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "\tпоиÑк Ñигнала ниже по чаÑтоте" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "\tвернутьÑÑ Ð½Ð° Ñвою чаÑтоту" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "\tперейти на чаÑтоту NNNN Hz" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "\tлевый клик QSY" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "\tправый клик QSY" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "\tqsy на kHz, Hz" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "\tУвеличить/уменьшить рабочую чаÑтоту транÑивера" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "\tВключить нужный режим транÑивера" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "\tВключить нужный фильтр в транÑивере" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr low cutoff filter" msgstr "\tВкл. ДейÑтвующий фильтр ÐЧ транÑивера" #: src/misc/macroedit.cxx:175 msgid "\tvalid xcvr hi cutoff filter" msgstr "\tВкл. ДейÑтвующий ВЧ фильтр транÑивера" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "\tÐ’Ñтавить раÑÑтоÑние между ÑтанциÑми в текÑÑ‚" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "\tвÑтавить текÑтовый файл" #: src/misc/macroedit.cxx:183 msgid "\tinsert image file" msgstr "\tÐ’Ñтавить изображение" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tpause transmit" msgstr "\tпауза передачи" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "\tзадердать передачу на NN.nn sec" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "\tповторить поÑле NN sec" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tÑигнал наÑтройкиr NN sec" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "\tзадержать передачу на NN.n sec" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tповторить Ð¼Ð°ÐºÑ€Ð¾Ñ Ð½ÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð¾" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "\tЗапланировать Ñкед" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "\t Вкл ТХ аттенюатор" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "\tCW идентификатор" #: src/misc/macroedit.cxx:200 msgid "\tsend mode ID; TX start only" msgstr "\tПередать идентификатор при Ñтарте передачи" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "\tТекÑÑ‚ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "\tПередавать RSID вкл, выкл, переключить" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "\tПринимать RSID вкл, выкл, переключить" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "\tÐвто подÑтройка чаÑтоты, вкл, выкл, переключить" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "\tФикÑ. чаÑтоту ТХ вкл, выкл, переключить" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:229 msgid "\tsave current macro file" msgstr "\tСохранить текущий файл макроÑов" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "\tИгнорировать вÑе комментарии" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:243 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:247 msgid "\tAnalysis CSV on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "ТекÑтовый файл Ð´Ð»Ñ Ð²Ñтавки" #: src/misc/macroedit.cxx:384 msgid "Test text file" msgstr "ТеÑÑ‚ текÑтового файла" #: src/misc/macroedit.cxx:394 msgid "MFSK image file" msgstr "MFSK image file" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "Изменение файла макроÑов" #: src/misc/macroedit.cxx:414 #, fuzzy msgid "Select wav file" msgstr "Выберите уÑтройÑтво" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "ИÑполнÑемый файл Ð´Ð»Ñ Ð²Ñтавки" #: src/misc/macroedit.cxx:457 msgid "Macro Text" msgstr "Макро текÑÑ‚" #: src/misc/macroedit.cxx:462 msgid "Select Tag" msgstr "Выбрать Ñ‚Ñг" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "ÐадпиÑÑŒ на кнопке макроÑа" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "Применить" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "Редактор макроÑов - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Открыть файл макроÑов" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fldigi файл Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑ€Ð¾Ñа\t*.{mdf}" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "ЗапиÑать файл макроÑа" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Конец" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Следующий" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Ðазад" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "МаÑтер проведет Ð²Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· оÑновные наÑтройки fldigi" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Можно пропуÑтить вÑе Ñтраницы или выйти из маÑтера в любое времÑ" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "Ð’Ñе наÑтройки могут быть изменены через меню наÑтройки" #: src/misc/newinstall.cxx:540 msgid "Fldigi configuration wizard" msgstr "МаÑтер наÑтройки Fldigi" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "Ðужное времÑ" #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "Загрузите файл изображениÑ" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Передать изображение" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Загрузите или пропуÑтите файл изображениÑ\n" "Поддерживаемые форматы: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "СкороÑть передачи, X1-нормально" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "Загрузить" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "Водопад / FFT / Scope" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Верхний уровень Ñигнала" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "Диапазон Ñигнала (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Изменение маÑштаба водопада" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "Повернуть диÑплей ниже по чаÑтоте" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "Сигнал в центре диÑплеÑ" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "Повернуть диÑплей выше по чаÑтоте" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "СкороÑть Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð²Ð¾Ð´Ð¾Ð¿Ð°Ð´Ð°" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "Отрегулируйте чаÑтоту курÑора" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Ð’ центре полоÑÑ‹ пропуÑканиÑ\n" "Правым кликом вернутьÑÑ" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Запомнить моду и чаÑтоту\n" "Правый клик Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Блокировка чаÑтоты передачи" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "РеверÑ" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Передача/Прием" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "Спектр ÐЧХ или Ч/Б" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "ПоиÑк Ñигнала" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "Модем ноÑителÑ" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "Прокрутка" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Открыть файл rig xml" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "УÑтановочный XML-файл\t*.xml" #: src/soundcard/sound.cxx:170 #, fuzzy msgid "Waveform Audio Format\t*.wav\n" msgstr "" "Формат аудио звука\t*.wav\n" "AU\t*.{au,snd}\n" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Lossless Ðудио кодек\t*.flac" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "Ðудио файл" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "ВоÑпроизводить непрерывно?" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "My callsign de CALL" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "Station heard twice" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "ПоиÑк текÑта" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "RSID reception" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "Переключение" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "Удалить" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Выбрать" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "Континент" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "ITU zone" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "CQ zone" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "СнÑть" #: src/spot/notify.cxx:519 msgid "Add" msgstr "Добавить" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Выбрать вÑÑ‘" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "ОчиÑтить вÑÑ‘" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "Страна" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "Поле не должно быть пуÑтым." #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "РегулÑрное выражение должно быть допуÑтимым." #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "УÑтановите Ваш позывной." #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Выполнить программу" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" "По умолчанию теÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока:\n" " \"" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "Введите теÑтовую Ñтроку или оÑтавьте пуÑтым по умолчанию:" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "Выражение Ñтого ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным." #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "ТеÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока не ÑоответÑтвует Ñтому Ñобытию в шаблоне поиÑка." #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "ДоÑтупные подÑтроки" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "ЧаÑтота" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "Позывной" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Открыть палитру" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "Fldigi палитра\t*.pal" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "Палитра: " #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "Сохранить палитру" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "Смотреть позывной" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "Call" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "ИмÑ" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "Штат" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 msgid "County" msgstr "Округ" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "ПровинциÑ" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "Локатор" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "Exchange In" #: src/widgets/FTextRXTX.cxx:161 #, fuzzy msgid "Rx Serial #" msgstr "ПринÑтый Ñер. номер" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "Class" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 msgid "Section" msgstr "Раздел" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 msgid "SS check" msgstr "" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 #, fuzzy msgid "SS section" msgstr "Раздел" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "CQ STATE" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 #, fuzzy msgid "QSOp state" msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° QSO" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 #, fuzzy msgid "QSOp name" msgstr "Ð˜Ð¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Ð’Ñтавить маркер" #: src/widgets/FTextRXTX.cxx:198 msgid "All entries" msgstr "Ð’Ñе запиÑи" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "Выпадающие подÑказки" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "ПоÑледнее QSO" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Передать" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "ПринÑть" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "Прервать" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Отправить изображение..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "Спец. Ñимволы" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 msgid "A" msgstr "A" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 msgid "E" msgstr "E" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 msgid "I" msgstr "I" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 msgid "N" msgstr "N" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 msgid "O" msgstr "O" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 msgid "U" msgstr "U" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "Y" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Ð’Ñтавить текÑÑ‚" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Сохранить текÑÑ‚ как" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Копировать" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Сохранить как.." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ñлова" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Вырезать" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Ð’Ñтавить" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Ð’Ñтавить файл" #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Ðазад" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "Удалить" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "Ðеверный режим Ð´Ð»Ñ KISS IO" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (путь) недейÑтвительно" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, c-format msgid "Executing script file: %s" msgstr "Выполнение ÑценариÑ:% s" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "Проблемы в обработке ÑценариÑ:%s" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" "Файл ÑÑ†ÐµÐ½Ð°Ñ€Ð¸Ñ Ñодержит потенциальные проблемы\n" "ОбратитеÑÑŒ к документации" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "ИзменениÑ, Ñделанные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑÑ†ÐµÐ½Ð°Ñ€Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚ программу\n" "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ активны поÑле перезагрузки" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "Файл Ñкрипта" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "*.txt" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "Ðет команды%s поÑле линии%d" #: src/config_script/script_parsing.cxx:394 msgid "Command Not Found" msgstr "Команда не найдена" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "Ðет ÑценариÑ/тег не найден" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "Ðеверный параметр" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "ÐедопуÑтимый параметр функции (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñкрипта)" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "ОтÑутÑтвует парные кавычки (\")" #: src/config_script/script_parsing.cxx:414 msgid "General Error" msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" #: src/config_script/script_parsing.cxx:418 msgid "No Errors" msgstr "Ðет ошибок" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "Символы не найдены" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "ДоÑтигнут конец Ñтроки" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "Файл не найден" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "Путь каталога не найден" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "Конец параметра (аргумент []) ÑпиÑок найден" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "Ðеожиданный конец параметра контрольного ÑпиÑка найден" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "Кол-во Ñимволов [] Параметр превоÑходит ожиданиÑ" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "РаÑпределение памÑти Error (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñкрипта)" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "Передаваемый параметр не ÑоответÑтвует ожидаемому типу." #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "Параметр не дейÑтвителен." #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "Команда отÑутÑтвует ':'." #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "ÐœÐ°ÐºÑ ÐºÐ¾Ð»-во открытых индекÑов доÑтигнуто." #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "СубÑкрипт выполнен неудачно" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "Путь к уÑтройÑтву Ñкрипта не найден." #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "Ðеожиданный конец файла доÑтигнут." #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "ЛиниÑ: %d Ошибка:%d %s (%s)" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€Ð° под файл: %s Ñтрока %d" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "Команда %s игнорируетÑÑ, Ñ‚Ð¾Ñ‡ÐµÑ‡Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не поддерживаетÑÑ" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "Команда %s игнорируетÑÑ, Ñтруктура команд не поддерживаетÑÑ" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "Ðеверный параметр функцииr 'char *file_name_path' (null)" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "не открылÑÑ Ñ„Ð°Ð¹Ð» %s" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "1" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "0" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (NULL) в функции %s:%d" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "Ðе удаетÑÑ Ñоздать файл %s (Ошибка No=%d) func %s:%d" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "no" msgstr "Инфо" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "yes" msgstr "Да" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Показать" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "СпрÑтать" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Fldigi" #: src/dialogs/confdialog.cxx:8227 msgid "Station / Operator" msgstr "Ð¡Ñ‚Ð°Ð½Ñ†Ð¸Ñ / Оператор" #: src/dialogs/confdialog.cxx:8230 msgid "Station Callsign:" msgstr "Позывной Ñтанции:" #: src/dialogs/confdialog.cxx:8231 msgid "Station callsign" msgstr "Позывной" #: src/dialogs/confdialog.cxx:8244 msgid "Operator Callsign:" msgstr "Позывной оператора" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "Позывной оператора (еÑли отличаетÑÑ Ð¾Ñ‚ позывного Ñтанции)" #: src/dialogs/confdialog.cxx:8259 msgid "Operator Name:" msgstr "Ð˜Ð¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Имена операторов" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "Ðнтенна Ñтанции" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "Краткое опиÑание антенны" #: src/dialogs/confdialog.cxx:8287 msgid "Station QTH:" msgstr "QTH Ñтанции:" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "QTH оператора" #: src/dialogs/confdialog.cxx:8301 msgid "Station Locator:" msgstr "Локатор Ñтанции" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "Локатор в формате EM64qv (6 Ñимволов)" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "Браузер" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "количеÑтво декодируемых каналов" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "ПаÑÑивное времÑ" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "ОчиÑтить Ñтроки от текÑта поÑле\n" "# Ñекунд отÑутÑÑ‚Ð²Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñти" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Метка канала" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Вид меток каждого канала" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "Ðудио чаÑтота" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "Радио чаÑтота" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "Ðомер канала" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "Шрифт" #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "шрифт браузера" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "ФикÑ. интервалы" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "РаÑÑтоÑние между каналами 100 Гц" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "ÐÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð°Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ°" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "ÐижнÑÑ Ñ‡Ð°Ñтота внизу ÑпиÑка" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "Позиции от нижнего до выÑшего канала" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "ВоÑпроизводить иÑторию при выборе канала" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "Декодировать аудио иÑторию выбранного Ñигнала" #: src/dialogs/confdialog.cxx:8467 msgid "Detection Level" msgstr "Уровень детектированиÑ" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "Фон" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "Цвет фона ÑˆÑƒÐ¼Ð¾Ð¿Ð¾Ð´Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ñигнала" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "РегулÑтор цвета фона ÑˆÑƒÐ¼Ð¾Ð¿Ð¾Ð´Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ñигнала" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "Браузер цвета" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY Viewer HiLite Color 1" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:8497 msgid "Even" msgstr "Четный" #: src/dialogs/confdialog.cxx:8498 msgid "Even lines" msgstr "Четные линии" #: src/dialogs/confdialog.cxx:8503 msgid "Odd" msgstr "Ðечетный" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "Ðечетные линии" #: src/dialogs/confdialog.cxx:8510 msgid "Select line" msgstr "Выбрать линию" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "ГлавнаÑ" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Показать подÑказки" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "Вкл/выкл подÑказки" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Показать иконки в меню" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "Вкл/выкл меню иконок" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "Вид интерфейÑа" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Изменить внешний вид приложениÑ" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "Видимые режимы" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Выбор режима Ð´Ð»Ñ Ð´Ð¾Ñтупа к меню" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "Язык интерфейÑа" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу при Ñледующем запуÑке программы" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Печать CW / RTTY / THROB / CONTESTIA Ñтрочными" #: src/dialogs/confdialog.cxx:8591 msgid "Transmit lower case text" msgstr "Передавать Ñтрочные " #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "ЗапроÑÑ‹ при выходе" #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "Сохранить измененную конфигурацию" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "ЗапиÑать измененные макроÑÑ‹" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "ЗапиÑать текущий набор макроÑов при выходе из программы" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "Сохранить журнал" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "Сообщить мне о Ñохранении запиÑей журнала" #: src/dialogs/confdialog.cxx:8618 msgid "Confirm exit" msgstr "Подтвердить выход" #: src/dialogs/confdialog.cxx:8625 msgid "Check for updates" msgstr "Проверить наличие обновлений" #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "Проверить наличие обновлений при запуÑке программы" #: src/dialogs/confdialog.cxx:8638 msgid "Show TX timer" msgstr "Показать таймер TX" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "Лог" #: src/dialogs/confdialog.cxx:8658 msgid "QSO" msgstr "QSO" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "Ведение журнала" #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Ñохранение лога при выходе" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "Очищать Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ñле ÑохранениÑ" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "ОчиÑтить Ð¿Ð¾Ð»Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° поÑле ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ макроÑом " #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "Позывной заглавными буквами" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "Позывной преобразовать ЗÐГЛÐÐ’ÐЫМИ" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Ðвтозаполнение Страны и Ðзимута" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Заполнить Страна/азимут Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ cty.dat" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "Сортировать по Date/Time OFF" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "Date time ON == OFF" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "УÑтановить date/time ON == date/time OFF" #: src/dialogs/confdialog.cxx:8698 msgid "Default RST in to 599/59" msgstr "По умолчанию RX RST 599/59" #: src/dialogs/confdialog.cxx:8699 msgid "Clear log controls sets RST in to 599/59" msgstr "ОчиÑтить лог и уÑтановить RST 599/59" #: src/dialogs/confdialog.cxx:8704 msgid "Default RST out to 599/59" msgstr "По умолчанию TX RST 599/59" #: src/dialogs/confdialog.cxx:8705 msgid "Clear log controls sets RST out to 599/59" msgstr "ОчиÑтить Ñлементы ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð° уÑтановить TX RST 599/59" #: src/dialogs/confdialog.cxx:8710 msgid "cty.dat folder" msgstr "Папка Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸" #: src/dialogs/confdialog.cxx:8711 msgid "Enter full path-name for cty.dat folder" msgstr "Введите полный путь папки cty.dat" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "МеÑто cty.dat file" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "По умолчан" #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "Перезагруз" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "Перезагрузить cty.dat" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "Ð’Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ð¼Ð¾Ñ‰Ð½Ð¾Ñть" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "" #: src/dialogs/confdialog.cxx:8751 #, fuzzy msgid "Display logbook read datum at start" msgstr "Показать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° макроÑов при Ñтарте" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° запиÑываетÑÑ Ð² текÑтовой облаÑти RX" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 msgid "Rx Text" msgstr "Rx Text" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "Включить Ð´Ð»Ñ Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð° текÑта в панели Rx одним кликом" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "Ð’ принÑтом текÑте инфо о позывном" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ñле 2 Ñекунды курÑора на позываном" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "Разделители Ñлов" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "ÐмериканÑкие единицы раÑÑтоÑÐ½Ð¸Ñ (QRB)" #: src/dialogs/confdialog.cxx:8801 #, fuzzy msgid "Clear log fields - new CALL" msgstr "ОчиÑтить Ð¿Ð¾Ð»Ñ Ð»Ð¾Ð³Ð°?" #: src/dialogs/confdialog.cxx:8812 msgid "Connect to MacLogger" msgstr "подключитьÑÑ Ðº MacLogger" #: src/dialogs/confdialog.cxx:8817 msgid "Capture Radio Report" msgstr "Перехват рапорта" #: src/dialogs/confdialog.cxx:8823 msgid "Capture Log Report" msgstr "" #: src/dialogs/confdialog.cxx:8828 msgid "Capture Lookup " msgstr "" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 msgid "Enable UDP log file" msgstr "" #: src/dialogs/confdialog.cxx:8848 msgid "UDP data stream" msgstr "" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "ОчиÑтить текÑÑ‚ UDP" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "TCP/IP Поток данных" #: src/dialogs/confdialog.cxx:8868 msgid "Clear text" msgstr "ОчиÑтить текÑÑ‚" #: src/dialogs/confdialog.cxx:8871 msgid "Address" msgstr "ÐдреÑ" #: src/dialogs/confdialog.cxx:8872 msgid "N3FJP Server IP Address" msgstr "N3FJP Server IP Address" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 msgid "Port" msgstr "Порт" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "N3FJP Server IP Port" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" #: src/dialogs/confdialog.cxx:8905 msgid "Enable Data Stream" msgstr "Включить поток данных" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 msgid "Connect" msgstr "СоединитьÑÑ" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 #, fuzzy msgid "Connected" msgstr "СоединитьÑÑ" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "Ð’ рапорт фактичеÑÐºÐ°Ñ Ñ‡Ð°Ñтота передачи" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 #, fuzzy msgid "Contests" msgstr "КонтеÑты" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 #, fuzzy msgid "State QSO Party" msgstr "Дата начала QSO" #: src/dialogs/confdialog.cxx:8980 #, fuzzy msgid "Text capture order" msgstr "Захват текÑта" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Context Notes" msgstr "КонтеÑты" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "Проверка на дубли" #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "вкл/выкл" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Проверить дубли" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Диапазон" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "Диапазоны должны Ñовпадать" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "Режим" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "Режимы должны Ñовпадать" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´ÑƒÐ±Ð»ÐµÐ¹" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "Цвет дублÑ" #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "Левой клик, чтобы выбрать цвет" #: src/dialogs/confdialog.cxx:9029 #, fuzzy msgid "? Dup Color" msgstr "Цвет дублÑ" #: src/dialogs/confdialog.cxx:9030 #, fuzzy msgid "Left click to select possible dup color" msgstr "Левой клик, чтобы выбрать цвет" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "Штат должен Ñовпадать" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "минуты" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "Введите Ð²Ñ€ÐµÐ¼Ñ Ð² минутах" #: src/dialogs/confdialog.cxx:9069 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Contest exchange in" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 msgid "Send" msgstr "Отправить" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° обмена" #: src/dialogs/confdialog.cxx:9087 msgid "RST always 599/59" msgstr "RST вÑегда 599/59" #: src/dialogs/confdialog.cxx:9088 msgid "Force RST in/out to 599/59" msgstr "УÑтановить RST in/out 599/59" #: src/dialogs/confdialog.cxx:9093 msgid "Send CW cut #'s" msgstr "CW короткие 0 и 9" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:9101 #, fuzzy msgid "Start Nbr" msgstr "Старт" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "Стартовый номер" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Цифры" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "КоличеÑтво цифр в Ñерийном номере" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "Ðачать Ñ Ð½ÑƒÐ»ÐµÐ¹" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "Ð’Ñтавить нули в Xmtd Ñерийный номер" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "СброÑ" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "Инициализировать Ð¿Ð¾Ð»Ñ QSO" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "Полевой день" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 msgid "Operator Call" msgstr "Позывной оператора" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" "Позывной в полевом дне\n" "может быть личным позывным оператора" #: src/dialogs/confdialog.cxx:9170 #, fuzzy msgid "My Section" msgstr "Раздел" #: src/dialogs/confdialog.cxx:9171 msgid "Field Day Section" msgstr "Раздел полевого днÑ" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 #, fuzzy msgid "My Class" msgstr "Class" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "Field Day Class" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 #, fuzzy msgid "Scout Operator Name" msgstr "Ð˜Ð¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "УправлÑть макрокнопками мышью" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑ€Ð¾Ñами мышью" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Кол-во и раÑположение кнопок" #: src/dialogs/confdialog.cxx:9282 msgid "Button Height" msgstr "Ð’Ñ‹Ñота кнопок" #: src/dialogs/confdialog.cxx:9283 msgid "Height of macro bar" msgstr "Ð’Ñ‹Ñота полоÑÑ‹ макроÑов" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "1 Ñтрока над Rx/Tx" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" #: src/dialogs/confdialog.cxx:9299 msgid "One above waterfall" msgstr "1 Ñтрока над водопадом" #: src/dialogs/confdialog.cxx:9304 msgid "One below waterfall" msgstr "1 Ñтрока под водопадом" #: src/dialogs/confdialog.cxx:9309 msgid "Two scheme 1" msgstr "Две Ñтроки Ñхема 1" #: src/dialogs/confdialog.cxx:9314 msgid "Two scheme 2" msgstr "Две Ñтроки Ñхема 2" #: src/dialogs/confdialog.cxx:9319 msgid "Two scheme 3" msgstr "Две Ñтроки Ñхема 3" #: src/dialogs/confdialog.cxx:9324 msgid "Two scheme 4" msgstr "Две Ñтроки Ñхема 4" #: src/dialogs/confdialog.cxx:9329 msgid "Two scheme 5" msgstr "Две Ñтроки Ñхема 5" #: src/dialogs/confdialog.cxx:9334 msgid "Two scheme 6" msgstr "Две Ñтроки Ñхема 6" #: src/dialogs/confdialog.cxx:9339 msgid "Two scheme 7" msgstr "Две Ñтроки Ñхема 7" #: src/dialogs/confdialog.cxx:9344 msgid "Two scheme 8" msgstr "Две Ñтроки Ñхема 8" #: src/dialogs/confdialog.cxx:9349 msgid "Two scheme 9" msgstr "Две Ñтроки Ñхема 9" #: src/dialogs/confdialog.cxx:9354 msgid "Two scheme 10" msgstr "Две Ñтроки Ñхема 10" #: src/dialogs/confdialog.cxx:9363 msgid "Load last used macro file at start" msgstr "Загрузить поÑледний иÑпользуемый макрофайл" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - ИÑпользовать поÑледний набор макроÑов\n" "OFF - ИÑпользовать уÑтановки по умолчанию" #: src/dialogs/confdialog.cxx:9369 msgid "Display macro filename at start" msgstr "Показать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° макроÑов при Ñтарте" #: src/dialogs/confdialog.cxx:9385 msgid "Show macro control codes" msgstr "Показывать коды ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑ€Ð¾Ñами" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "Показывать ^! иÑполнÑемые коды в Rx панели" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9405 msgid "WF Ctrls" msgstr "Водопад" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "ПоÑтавить галку, чтобы включить ÑоответÑтвующий контроль" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "Увеличение водопада" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "ÐеÑущаÑ" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "Управление переключателÑми" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "Уровень передачи" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "СкороÑть падениÑ" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "ИÑториÑ" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "МодулÑциÑ" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "ФикÑÐ°Ñ†Ð¸Ñ Ñ‡Ð°Ñтоты" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "Включить вÑÑ‘" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "Выключить вÑÑ‘" #: src/dialogs/confdialog.cxx:9489 msgid "Clrs/Fnts" msgstr "Цвет/Шрифт" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "Rx/Tx" #: src/dialogs/confdialog.cxx:9494 msgid "Rx/Tx Character set" msgstr "Ðабор Ñимволов (Ð”Ð»Ñ ÐšÐ¸Ñ€Ð¸Ð»Ð»Ð¸Ñ†Ñ‹ 1251)" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "Выбрать Rx/Tx набор Ñимволов" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "Rx фон" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "Tx фон" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "Rx шрифт" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "Tx шрифт" #: src/dialogs/confdialog.cxx:9539 msgid "Macro Edit Font" msgstr "Шрифт ред. макроÑов" #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "ТекÑÑ‚ ПодÑвечиваниÑ" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "Символы в облаÑти Rx / Tx" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "Символы ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² облаÑти Rx / Tx" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Пропущенные Ñимволы в панели Tx\n" "(Tx on/off Ð´Ð»Ñ CW)" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "Ðльтернативный цвет Ñимволов в Rx окне" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "Выбор цвета фона Rx Tx панелей" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "СиÑтемный" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "Умолчание" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "Показывать в Rx окне ASCII Ñимволы" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "Шкала/Показометры" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "Шрифт" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "Фон" #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "Цвет цифр" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "СиÑтемный цвет" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "S-meter" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 msgid "Scale Color" msgstr "Цвет шкалы" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 msgid "Meter Color" msgstr "Измритель" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "PWR-meter" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "Шкала мощноÑти" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "Выберите тип FFT фильтра" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¾Ð¼" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 msgid "Report Browser" msgstr "" #: src/dialogs/confdialog.cxx:9721 msgid "Even Lines" msgstr "Четные линии" #: src/dialogs/confdialog.cxx:9726 msgid "Odd Lines" msgstr "Ðечетные линии" #: src/dialogs/confdialog.cxx:9731 msgid "Stream Text" msgstr "" #: src/dialogs/confdialog.cxx:9737 msgid "Bg color" msgstr "Цвет фона" #: src/dialogs/confdialog.cxx:9743 msgid "Alt Color" msgstr "" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "Цвет текÑта Ð´Ð»Ñ Ð¸ÑходÑщего telnet" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "Вкл. цветные кнопки" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Группа 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "Цвет фона Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº группы 1" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Группа 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "Цвет фона Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº группы 2" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Группа 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "Цвет фона Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº группы 3" #: src/dialogs/confdialog.cxx:9783 msgid "Font/Color" msgstr "Шрифт/цвет" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "Закладки" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "Цвет" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "Кнопки" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:9808 msgid "RxID nar" msgstr "" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:9820 msgid "RxID wide" msgstr "" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "Цвет индикаторов на кнопках" #: src/dialogs/confdialog.cxx:9882 #, fuzzy msgid "All Others" msgstr "Прочее" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "Уровни Ñигнала" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "Ðизкий" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "Ð’Ñ‹Ñокий" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "Ðорма" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "Перегруз" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "Цвет ÑƒÑ€Ð¾Ð²Ð½Ñ Ñигнала" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Примечание:\n" "Эти пункты конфигурации полезны Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ fldigi\n" "на уÑтройÑтвах Ñ ÑенÑорным Ñкраном, например планшетах" #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "Кнопки Ñо Ñтрелками - Контроль чаÑтоты" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Право/лево = 1 x LSD\n" "Вверх/вниз= 10 x LSD\n" "Shift - Право/лево = 100 x LSD\n" "Shift - Верх/низ = 1000 x LSD" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Вправо/Влево\n" "Выбрать наименьшее иÑпользуемое чиÑло" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "Rx / Tx Панели" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "Tx выше Rx" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "ПоÑтавить Tx панель выше панели Rx" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "ДиÑплей" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "Цвет и курÑор" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Изменить цвет" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "Загрузить" #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "Загрузить палитру" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Сохранить" #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "Сохранить палитру" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "ПолоÑа пропуÑканиÑ" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "ON" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Цвет" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "Шире" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "Показать полоÑу на водопаде" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "Ð¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "КурÑор в центре линии" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "Дорожка Ñигнала" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "Шкала чаÑтоты" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "Ð’Ñегда показывать аудио чаÑтоту" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "Ðудио или радио чаÑтоты по шкале водопада" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "Выбрать шрифт водопада" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "Передаваемый Ñигнал" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "Монитор передаваемого Ñигнала" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "Показать передаваемый Ñигнал на водопаде" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Уровень Ñигнала" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "УÑтановить уровень Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ проÑмотра" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "FFT обработка" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "Ðижний предел" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "Ðижний предел чаÑтоты в Гц" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "FFT уÑреднение" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "ИÑпользовать уÑÑ€ÐµÐ´Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ ÑˆÑƒÐ¼Ð° водопада" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "Окно функций предварительного FFT" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "ПрÑмоугольноÑть" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "ТреугольноÑть" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "Верхний предел" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "Верхний предел чаÑтоты в Гц" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "Задержка" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "Показать больше или меньше водопада" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "ÐœÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ ÑкороÑть падениÑ" #: src/dialogs/confdialog.cxx:10269 msgid "Normal drop speed / value" msgstr "ÐÐ¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть падениÑ" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "Ð’Ñ‹Ñота водопада в пикÑелÑÑ…" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "Загрузка процеÑÑора увеличиваетÑÑ Ñ Ð²Ñ‹Ñотой водопада" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Мышь" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "Левый или правый клик вÑегда воÑпроизводит аудио иÑторию" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "ВоÑпроизведение аудиотрека" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "ПеретаÑкивать мышкой чаÑтоту водопада" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "Включить перетаÑкивание курÑором шкалы водопада" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "Ð’ÑтавлÑть текÑÑ‚ одним левым кликом" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "ДейÑтвие колеÑа" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Определите как колеÑо мыши\n" "ведет ÑÐµÐ±Ñ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ водопада" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:10374 #, fuzzy msgid "values left/below waterfall" msgstr "1 Ñтрока под водопадом" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10389 #, fuzzy msgid "use" msgstr "Мышь" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "МодулÑции" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "SOM декодирование" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "ОтÑлеживание" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "ÐвтоматичеÑкое отÑлеживание ÑкороÑти Rx" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "ПолоÑовой фильтр" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "ПолоÑовой dsp фильтр CW" #: src/dialogs/confdialog.cxx:10451 #, fuzzy msgid "Matched Filt'" msgstr "ÐаÑтроенный фильтор" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "ÐаÑтроенный полоÑовой" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "ОтÑлеживать ÑкороÑть CW в WPM" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "Ðиже" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "Детектор нижнего порога" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "Выше" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "Детектор верхнего порого" #: src/dialogs/confdialog.cxx:10511 #, fuzzy msgid "Range" msgstr "dB Диапазон" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "Диапазон +/- wpm" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "ÐœÐ¾Ñ ÑкороÑть CW WPM" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "СкороÑть CW по умолчанию" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "Ðе медленнее чем" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "Ðе быÑтрее чем" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Farnsworth" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ QSK" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "Синхронизировать" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "Ð’ÐµÑ (%)" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "Соотношение точек" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "Тире/точек" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 msgid "Edge decrease" msgstr "" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10735 msgid "BPF transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "ЧаÑтота Ñреза ФÐЧ" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "QSK на правом канале" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "Сформировать прÑмоугольный Ñигнал на правом канале" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "ОтправлÑть непрерывно" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "ОтправлÑть непрерывный поток теÑтовых Ñимволов" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "ТеÑтовый Ñимвол" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "ТеÑтовые Ñимволы Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²ÐºÐ¸ QSK" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "Пометки" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 #, fuzzy msgid "Ser. Port" msgstr "Порт" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 msgid "Xcvr serial port" msgstr "" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 msgid "Connect / Disconnect from WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 #, fuzzy msgid "ModeReg" msgstr "Режим" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 #, fuzzy msgid "Enable paddle auto spacing of characters" msgstr "Включите Ñто Ð´Ð»Ñ UTF-8 Ñимволов" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 #, fuzzy msgid "Enable contest character spacing" msgstr "Включите Ñто Ð´Ð»Ñ UTF-8 Ñимволов" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 #, fuzzy msgid "Serial echo" msgstr "Переданный Ñер. номер" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 #, fuzzy msgid "Tone ON" msgstr "Time ON" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 #, fuzzy msgid "WPM Settings" msgstr "УÑтановки" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 #, fuzzy msgid "Min WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 #, fuzzy msgid "Rng WPM" msgstr "Диапазон, WPM" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 #, fuzzy msgid "Cmd WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 #, fuzzy msgid "Timing/Settings" msgstr "УÑтановки" #: src/dialogs/confdialog.cxx:11155 msgid "Ratio" msgstr "" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 #, fuzzy msgid "Sample" msgstr "ЧаÑтота диÑкретизации" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 #, fuzzy msgid "Weight" msgstr "Ð’ÐµÑ (%)" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 #, fuzzy msgid "Bk" msgstr "Ðазад" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 #, fuzzy msgid "WPM setting" msgstr "УÑтановки" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 #, fuzzy msgid " E acute" msgstr "Выполнить" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 msgid "nanoIO serial port" msgstr "" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 msgid "Connect / Disconnect from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 #, fuzzy msgid "Status" msgstr "Штат" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 #, fuzzy msgid "Paddle" msgstr "Диапазон, WPM" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 #, fuzzy msgid "Comp'" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 #, fuzzy msgid "PTT off" msgstr "TX Ñмещение" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "Выключить вÑÑ‘" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "Dom" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "Дополнительный текÑÑ‚" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñ‹" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "ФильтрациÑ" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "ИÑпользовать DSP фильтр до декодера" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "КоÑффициент полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "Ширина полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° по отношению к ширине Ñигнала" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "FEC (прÑмое иÑправление ошибок)" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "Включить Multipsk" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "CWI порог" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "CWI детектирование и подавление" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "Пути (Ñкрытые)" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "" #: src/dialogs/confdialog.cxx:11647 msgid "Hell Transmit Parameters" msgstr "Hell Параметры передачи" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "Передаваемый шрифт" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "Выберите раÑтровый шрифт ТХ" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "Форма импульÑа" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "ПриподнÑтый коÑÐ¸Ð½ÑƒÑ Ñ„Ð°ÐºÑ‚Ð¾Ñ€ формы импульÑа" #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "ПереодичеÑÐºÐ°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° (.) в режиме ожиданиÑ" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 msgid "Range 1...3" msgstr "Диапазон 1 ...3" #: src/dialogs/confdialog.cxx:11706 msgid "Hell Receive Parameters" msgstr "Hell Параметры передачи" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "Ð ÐµÐ²ÐµÑ€Ñ Ð²Ð¸Ð´ÐµÐ¾" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "ДиÑплей RX в Ñ€ÐµÐ²ÐµÑ€Ñ Ð²Ð¸Ð´ÐµÐ¾" #: src/dialogs/confdialog.cxx:11715 msgid "Marquee text" msgstr "Пунктирный текÑÑ‚" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "Множитель ширины Rx" #: src/dialogs/confdialog.cxx:11722 msgid "Range 1...4" msgstr "Диапазон 1 ...4" #: src/dialogs/confdialog.cxx:11734 msgid "Rx Height in pixels" msgstr "Rx Ð’Ñ‹Ñота в пикÑелÑÑ…" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "Может потребоватьÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ размера панели Rx / Tx" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "Ширина приемного фильтра" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "Регулировать ширину полоÑÑ‹ DSP" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "Rx AGC" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - Медленно, 2 - Средне, 3 - БыÑтро" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "FSQ" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "Rx Параметры" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:11791 msgid "Minimum # hits in tone detector" msgstr "" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "Узкий ФÐЧ еÑли изображение шумное" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "Удалить позывной поÑле..." #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "Tx Параметры" #: src/dialogs/confdialog.cxx:11834 #, fuzzy msgid "1.5 baud" msgstr "4.5 baud" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "2 baud" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "3 baud" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "4.5 baud" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "6 baud" #: src/dialogs/confdialog.cxx:11859 msgid "Center freq" msgstr "Центр чаÑтота" #: src/dialogs/confdialog.cxx:11867 msgid "Sounder" msgstr "Звуковой" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "ОтправлÑть маÑк каждый ..." #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "MYCALL вÑегда Ñтрочными" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 msgid "convert operator callsign to lower case" msgstr "Конвертировать позывной в Ñтрочные" #: src/dialogs/confdialog.cxx:11880 msgid "Time out" msgstr "Тайм-аут" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "QTC:" #: src/dialogs/confdialog.cxx:11892 msgid "Enter QTC text" msgstr "ВвеÑти QTC текÑÑ‚" #: src/dialogs/confdialog.cxx:11898 msgid "Message Logging" msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñообщений" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "Добавить отметку даты/времени Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ # полученного ÑообщениÑ" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "Ð’Ñегда добавлÑть в файл(Ñ‹)" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 #, fuzzy msgid "Notify time out" msgstr "ПаÑÑивное времÑ" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "РегиÑтроциÑ" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 msgid "Audit log" msgstr "Ðудит лога" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "Включить" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 msgid "Text Colors" msgstr "Цвет текÑта" #: src/dialogs/confdialog.cxx:11959 msgid "Transmit text" msgstr "Передаваемый текÑÑ‚" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "IFKP" #: src/dialogs/confdialog.cxx:11988 msgid "1/2 speed" msgstr "1/2 ÑкороÑти" #: src/dialogs/confdialog.cxx:11993 msgid "1x speed" msgstr "1x ÑкороÑть" #: src/dialogs/confdialog.cxx:11994 msgid "default" msgstr "Умолчание" #: src/dialogs/confdialog.cxx:11999 msgid "2x speed" msgstr "2x ÑкроÑть" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "Позывной вÑегда Ñтрочными" #: src/dialogs/confdialog.cxx:12011 msgid "convert other callsign to lower case" msgstr "Конвертировать позывные в Ñтрочный" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "ФикÑ. водопад на 1500 Гц" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "Ð’Ñегда передавать в центре 1500 Герц" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "8-разрÑдные Ñимволы (UTF-8)" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "Включите Ñто Ð´Ð»Ñ UTF-8 Ñимволов" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "Включить Ð´Ð»Ñ Ð¾Ñ‡ÐµÐ½ÑŒ Ñлабых Ñигналов" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "Передать нижний начальный тон" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "Передать верхний начальный тон" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "ПродолжительноÑть тона (secs)" #: src/dialogs/confdialog.cxx:12103 #, fuzzy msgid "Low tone at 500 Hz" msgstr "ФикÑ. водопад на 1500 Гц" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 #, fuzzy msgid "Manual tuning" msgstr "Разрешить ручную наÑтройку" #: src/dialogs/confdialog.cxx:12122 msgid "Oliv" msgstr "Oliv" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "Выбрать фильтр" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "Тоны" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "Выбрать номер тона" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "Принимать Ñинхронизатор" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "ИзменÑть ТОЛЬКО Ð´Ð»Ñ ÑкÑпериментов" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "Включить Ñту опцию Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ UTF-8 Ñимволов" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 msgid "Enable this to send start/stop tones" msgstr "Включите Ñту опцию Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Ñтарт/Ñтоп тона" #: src/dialogs/confdialog.cxx:12227 msgid "Cont" msgstr "Cont" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "8-разрÑдное раÑширенние Ñимволов" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "Включите Ñту опцию Ð´Ð»Ñ Ð»Ð°Ñ‚Ð¸Ð½Ñких 1-подчеркнутых Ñимволов" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "AFC режим" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "Диапазон автоподÑтройки (Hz)" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "Захват Ñигнала в Ñтом диапазоне чаÑтот" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "Соотношение S/N (dB)" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "Захват Ñигнала по Ñтому порогу" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "S/N and IMD behavior" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "поÑле" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "Behavior of s/n imd" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "Dim" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "Ñекунд" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "ÐœÐ½Ð¾Ð³Ð¾ÐºÐ°Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° Ñигналов" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "Многоканальный детектор" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" "Отключить на медленных процеÑÑорах еÑли браузер Ñигналов не иÑпользуетÑÑ" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "8 psk" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "Пилот тон" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "Включить кодирование/декодирование Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð½Ð¸Ñ Ð¿Ð¸Ð»Ð¾Ñ‚-тонов Ñигнала" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "Сила пилот-тона (dB)" #: src/dialogs/confdialog.cxx:12439 msgid "Pilot tone power relative to signal" msgstr "Соотношение пилот тона к Ñигналу" #: src/dialogs/confdialog.cxx:12458 msgid "Short Preamble" msgstr "Короткое вÑтупление" #: src/dialogs/confdialog.cxx:12459 #, fuzzy msgid "Enable short preamble for 8PSK transmission" msgstr "Включить Ñту опцию Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ UTF-8 Ñимволов" #: src/dialogs/confdialog.cxx:12472 msgid "TTY" msgstr "TTY" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "AFC ÑкороÑть" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "RX - раÑÑтройка" #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ Ñоветует 1.275\n" "Ставьте 1.5 и морочте голову." #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "Декодировать (CWI подавлÑетÑÑ)" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "Маркер" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "Только маркер" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:12555 msgid "Log RTTY frequency" msgstr "РегиÑтрировать чаÑтоту RTTY" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "ИÑпользовать маркер чаÑтоты" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:12566 msgid "track color" msgstr "ЧаÑтота трека" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "Цвет маркера трека" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:12580 #, fuzzy msgid "Sound Card FSK" msgstr "Ð—Ð²ÑƒÐºÐ¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "Сдвиг неÑущей" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "Выбрать Ñдвиг неÑущей" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "ПользовательÑкий Ñдвиг" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "ВвеÑти Ñдвиг неÑущей" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "СкороÑть передачи данных" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "Выбрать ÑкороÑть передачи данных" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "Биты на Ñимвол" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "Паритет" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "Выбрать паритет" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "Стоп биты" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "Выбрать # Ñтоп биты" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "Ñимволы" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "ИÑпользовать \"cr cr lf\" Ð´Ð»Ñ \"cr lf\"" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "TX - раÑÑтройка" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "Формы Tx" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:12728 msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK - правый канал" #: src/dialogs/confdialog.cxx:12729 msgid "Create keyed square wave on right audio channel" msgstr "Создать ключевой меандр на правом аудиоканале" #: src/dialogs/confdialog.cxx:12736 #, fuzzy msgid "Transceiver FSK" msgstr "Управление транÑивером" #: src/dialogs/confdialog.cxx:12739 #, fuzzy msgid "Mark" msgstr "Только маркер" #: src/dialogs/confdialog.cxx:12740 #, fuzzy msgid "Mark frequency in Hertz" msgstr "ЧаÑтота в MHz" #: src/dialogs/confdialog.cxx:12751 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Сдвиг неÑущей" #: src/dialogs/confdialog.cxx:12766 #, fuzzy msgid "LTRS at start" msgstr "СброÑ" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 #, fuzzy msgid "FSK Interface" msgstr "ИнтерфейÑ" #: src/dialogs/confdialog.cxx:12847 #, fuzzy msgid "Navigator serial port" msgstr "ИÑпользовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:12861 #, fuzzy msgid "FSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12862 msgid "Connect / Disconnect from Nav FSK port" msgstr "" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 #, fuzzy msgid "Navigator configuration port" msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Fldigi" #: src/dialogs/confdialog.cxx:12885 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Ðомер канала" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 #, fuzzy msgid "Channel 2 attenuator" msgstr "Ðомер канала" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 #, fuzzy msgid "RF attenuator" msgstr "PSM Ðттенюатор" #: src/dialogs/confdialog.cxx:12918 #, fuzzy msgid "NavRF Attenuator" msgstr "PSM Ðттенюатор" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 #, fuzzy msgid "Nav FSK baud rate" msgstr "СкороÑть передачи данных" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Стоп биты" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 #, fuzzy msgid "Mark Polarity" msgstr "Только маркер" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 #, fuzzy msgid "Side tone" msgstr "Пилот тон" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 #, fuzzy msgid "Config" msgstr "Подтвердить" #: src/dialogs/confdialog.cxx:13062 msgid "Connect / Disconnect from Nav Config port" msgstr "" #: src/dialogs/confdialog.cxx:13069 msgid "Synop" msgstr "Synop" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "SYNOP в ADIF" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "Декодировать SYNOP (Ex: Deutsche Wetterdienst) в ADIF лог файл" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "SYNOP в KML" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Декодировать SYNOP (Ex: Deutsche Wetterdienst) в KML (Ex: Google Earth)" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "Чередование SYNOP и текÑÑ‚" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 #, fuzzy msgid "Serial Interface" msgstr "ИнтерфейÑ" #: src/dialogs/confdialog.cxx:13158 #, fuzzy msgid "FSK port" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:13206 msgid "Auto CRLF" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 #, fuzzy msgid "Diddle char" msgstr "ТеÑтовый Ñимвол" #: src/dialogs/confdialog.cxx:13239 #, fuzzy msgid "Diddle character" msgstr "Биты на Ñимвол" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 #, fuzzy msgid "Unshift on space" msgstr "RX - раÑÑтройка" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "Включение DSP перед декодером" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "Детектировать вÑтупление" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "Декодировать програмные Ñимволы" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "Декодировать програмные биты" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "ИÑпользовать алгоритм Витерби Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ¹ коррекции ошибок\n" "Лучше вÑего работает Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ поддерживаемых Ñимволов." #: src/dialogs/confdialog.cxx:13402 msgid "Nav" msgstr "Nav" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "РегиÑтрировать Navtex в Adif файл" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "РегиÑтрировать Navtex в KML" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "WFx" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "РегиÑтрировать Wefax в Adif файл" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "Отправленные и полученные факÑÑ‹ запиÑÐ°Ñ‚ÑŒÑ Ð² ADIF." #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "Ð’Ñтроенный Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Wefax" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "ДиÑплей TX и RX в главном окне программы fldigi.\n" "Изменение требует перезагрузки fldigi" #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "Сдвиг чаÑтоты (800 Hz)" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "По умолчанию 800 Hz. Deutsche Wetterdienst 850Hz" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "МакÑимальное чиÑло принимаемых Ñтрок (5000)" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "МакÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ð¾Ð³Ð¾ факÑа." #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "Папка Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ факÑа" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "Папка..." #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "Скрыть окно передачи" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "Скрыть окно передачи по умолчанию." #: src/dialogs/confdialog.cxx:13475 msgid "Save image as monochrome file" msgstr "ЗапиÑать изображение как монохромное" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "Сохранить изображение в виде файла PNG" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "Rig" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 msgid "flrig" msgstr "flrig" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" "\"Отключить РТТ, еÑли неÑколько ÑкземплÑров fldigi (клиент)\n" "подключены к единому flrig (Ñервер)." #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "РТТ от Flrig" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "\" \"" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" "Параметры flrig xmlrpc Ñервера\n" "Эти параметры отобразÑÑ‚ÑÑ Ð²Ð¾ вкладке конфигурации" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 msgid "Addr" msgstr "Addr" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ flrig интерфейÑа\n" "IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn\n" "или имÑ: i.e. localhost" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "IP номер порта" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "Ðажмите еÑли надо изменить адреÑ/порт" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "flrig ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ методом ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñивером" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "Включить flrig xcvr в качеÑтве клиента" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "Отключить, еÑли flrig не иÑпользуетÑÑ." #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "ИÑпользовать RigCAT" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "RigCAT иÑпользовать Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñивером" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "Файл ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñивером:" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "Открыть Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° файла" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "Выберите файл" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Порт:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "Повторы" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "# повторных попыток" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "Интервал повтора (мÑ)" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ повторами в мÑ" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "Задержка запиÑи (ms)" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "ДождитеÑÑŒ ответа на поÑледующие команды" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "СкороÑть порта" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "Стопбиты" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "ÐктивациÑ" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "Инициализировать RigCAT интерфейÑ" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "CAT команды Ð´Ð»Ñ PTT" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "PTT ÑвлÑетÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CAT (не аппаратное обеÑпечение)" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "Переключение RTS Ð´Ð»Ñ PTT" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "RTS Ñто РТТ линиÑ" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "Переключение DTR Ð´Ð»Ñ PTT" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "DTR Ñто РТТ линиÑ" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "ИÑходное ÑоÑтоÑние RTS" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "ИÑходное ÑоÑтоÑние DTR" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "Управление потоком RTS / CTS" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "Rig иÑпользует ÑвÑзку RTS/CTS" #: src/dialogs/confdialog.cxx:13735 #, fuzzy msgid "Restore UART Settings on Close" msgstr "ВоÑÑтановление наÑтроек при Закрытии" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "ВоÑÑтановление наÑтройки поÑледовательного (COM) порта" #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "VSP Включить" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" "Виртуальный ЭмулÑтор ПоÑледовательного порта - отключает ПРЕДУПРЕЖДЕÐИЯ" #: src/dialogs/confdialog.cxx:13747 msgid "Init delay (ms)" msgstr "Задержка начала (мÑ)" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "ДождитеÑÑŒ ответа на первую команду CAT" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "ИÑпользовать Hamlib" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "Hamlib иÑпользуетÑÑ Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñивером" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "Rig:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:13823 msgid "Retry Interval (msec)" msgstr "Интервал повтора (msec)" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "МилиÑекунд между повторами" #: src/dialogs/confdialog.cxx:13840 msgid "Write delay (msec)" msgstr "Задержка начала (msec)" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "МилиÑекунд между поÑледовательными командами" #: src/dialogs/confdialog.cxx:13857 msgid "Post write delay (msec)" msgstr "Задержка поÑле запиÑи (msec)" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "Интервал Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (мÑ) перед чтением ответа" #: src/dialogs/confdialog.cxx:13909 msgid "Polling Interval (msec)" msgstr "Интервал повтора (msec)" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT через Hamlib команды" #: src/dialogs/confdialog.cxx:13929 msgid "PTT using hamlib command" msgstr "PTT иÑпользует hamlib команды" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "Ðудио на вÑпомогательный порт" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "PTT включаетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ иÑточником звука" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "Rig требует ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ°Ð¼Ð¸ RTS/CTS" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "управление потоком XON/XOFF" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "Rig требует ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ°Ð¼Ð¸ Xon/Xoff" #: src/dialogs/confdialog.cxx:13965 msgid "CW is LSB mode" msgstr "CW в LSB режиме" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "Ðажать еÑли LSB Ð´Ð»Ñ CW" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "RTTY в USB режиме" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "Ðажать еÑли USB Ð´Ð»Ñ RTTY" #: src/dialogs/confdialog.cxx:13977 msgid "Mode delay (msec)" msgstr "Режим задержки (msec)" #: src/dialogs/confdialog.cxx:13978 msgid "Delay NN msec after executing mode change" msgstr "Задержка NN мÑек поÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð°" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "Ð‘Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа:" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ:" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "ÐžÐ¿Ñ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ\n" "в формате: param=val ..." #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "Инициализировать hamlib интерфейÑ" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "Hardware PTT" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "PTT тон на правом аудио канале" #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Может иÑпользоватьÑÑ Ð²Ð¼ÐµÑто или в дополнение к другим типам PTT" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "ИÑпользовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "ИÑпользовать параллельный порт PTT" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "ИÑпользовать uHRouter PTT" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "Вкл. RTS" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "RTS Ñто PTT ÑÐ¸Ð³Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "Ðачальное напрÑжение на RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "Вкл. DTR" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "DTR Ñто PTT ÑÐ¸Ð³Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "Ðачальное напрÑжение на DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "Инициализировать H/W PTT Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ " #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "PTT задержки дейÑтвительны Ð´Ð»Ñ Ð²Ñех типов CAT/PTT" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "Задержка PTT перед началом передачи (мÑек)" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "Задержка (мÑек) перед началом аудио" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "Задержка PTT поÑле Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ (мÑек)" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "Задержка NN мÑек перед тем как отпуÑтить PTT" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "GPIO" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "17 00 11" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 msgid "Select pin number" msgstr "Выберите номера контактов" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "18 01 12" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "27 02 13" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "22 03 15" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "23 04 16" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "24 05 18" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "25 06 22" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr " 4 07 7" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr " 5 21 29" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr " 6 22 31" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "13 23 33" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "19 24 35" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "26 25 37" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "12 26 32" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "16 27 36" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "20 28 38" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "21 29 40" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "= 1 (on)" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 msgid "Select PTT on state" msgstr "Выберите ÑоÑтоÑние PTT" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" "Вкл GPIO PTT Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð²Ð¾Ð´Ð°/вывода общего Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (Ð´Ð»Ñ Raspberry Pi)" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "ДлительноÑть импульÑа (мÑ)" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "Set>0, еÑли иÑпользуетÑÑ Ð¸Ð¼Ð¿ÑƒÐ»ÑŒÑный PTT" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "УÑтройÑтва" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "ИÑпользовать OSS audio server" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "Выберите уÑтройÑтво" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "Ðудиопорт" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "ИÑпользовать порт Audio server" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "Передача:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "УÑтройÑтво аудиовхода" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "ВоÑпроизведение:" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "УÑтройÑтво аудиовыхода" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "ИÑпользовать Pulse Audio server" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "ОÑтавьте Ñто поле пуÑтым или обратитеÑÑŒ к\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "УÑтановки" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "ЧаÑтота диÑкретизации" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "Захват" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "СкороÑть диÑкретизации выберите \"Native\", еÑли \"Auto\"\n" "не очень хорошо работает на вашем аудио уÑтройÑтве." #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "Конвертер" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "УÑтановите тип диÑкретизатора Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ð¸ ÑмещениÑ" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "КоррекциÑ" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "RX ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð¹ карты" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "TX ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð¹ карты" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "TX Ñмещение" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Разница между Rx и Tx чаÑтотами" #: src/dialogs/confdialog.cxx:14605 msgid "Right channel" msgstr "Правый канал" #: src/dialogs/confdialog.cxx:14607 msgid "Transmit Usage" msgstr "ИÑпользование передачи" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "Сигнал модема на левый и правый каналы" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "Левый и правый каналы оба Ñодержат аудио Ñигнал" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "РеверÑировать правый/левый каналы" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 msgid "Software reversal of left-right audio channels" msgstr "Программно реверÑировать правый/левый каналы" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Эти ÑредÑтва ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´ÑÑ‚ÑÑ Ð½Ð° других вкладках.\n" "Они копируютÑÑ Ð·Ð´ÐµÑÑŒ Ð´Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва.\n" "..." #: src/dialogs/confdialog.cxx:14627 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Тон 1000 Гц при включенном РТТ\n" "Может быть иÑпользован вмеÑто или в дополнение к другим видам РТТ" #: src/dialogs/confdialog.cxx:14633 msgid "CW QSK signal on right channel" msgstr "CW QSK Ñигнал на правый канал" #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Сформировать 1000 Гц меандр на правом канале" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK на правом канале" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "Создать 1000 Гц меандр на правом канале" #: src/dialogs/confdialog.cxx:14649 msgid "Receive Usage" msgstr "ИÑпользование приема" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "Wav" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "ЧаÑтота диÑкретизации запиÑи" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "Выберите ÑкороÑть передачи данных из ÑпиÑка" #: src/dialogs/confdialog.cxx:14681 msgid "Record both channels" msgstr "ЗапиÑÑŒ обоих каналов" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "" #: src/dialogs/confdialog.cxx:14692 msgid "Regex Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 #, fuzzy msgid "Sound:" msgstr "Звуковой" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 msgid "Test" msgstr "ТеÑÑ‚" #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 #, fuzzy msgid "flmsg interface" msgstr "ИнтерфейÑ" #: src/dialogs/confdialog.cxx:14753 #, fuzzy msgid "flmsg received wav" msgstr "ПринÑтый RST" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "RsID detection" msgstr "RSID reception" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "Только уведомлÑть" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "УÑтановите галку, чтобы получать уведомлениÑ,\n" "когда принÑли RSID не менÑÑ Ð¼Ð¾Ð´ÐµÐ¼ и чаÑтоты" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "Режимы приема" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "ПолоÑа поиÑка" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "ON - поиÑк по вÑему водопаду\n" "OFF - Лимит поиÑка +/- 200 Гц" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "Выключить детектор" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "Отключение дальнейшего Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении RSID" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "Разрешить ошибки" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Low = без ошибок\n" "Medium = 1 ошибка\n" "High = 2 ошибки" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "Средне" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "Открыть шумодав (Ñек)" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "Открыть шумодав через nn Ñек, еÑли RSID обнаружен" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "Отключить диалог предупреждениÑ" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "Ðе показывать диалоговое окно RSID предупреждениÑ" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" "Сохранить чаÑтоту блокировки TX (LK) при переключении RSID на чаÑтоте RX" #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "Отключить изменение чаÑтоты" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "Ðе менÑть автоматичеÑки чаÑтоту RX RSID" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" "Содержание Ñообщений и уведомлений RsID и\n" "характериÑтики диÑÐ¿Ð»ÐµÑ Ð½Ð°ÑтраиваютÑÑ Ð²\n" "наÑтройках диалогового окна \"УведомлениÑ\" ." #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "Ñекунды" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "Режимы передачи" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "Добавить Ñигнал RSID к концу передачи" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "Видео" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "Видео вÑтупление ID" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "Передаваемый режим ID" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "ИÑпользовать маленький шрифт" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "УÑтановите количеÑтво Ñимволов в Ñтроке" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "500 Гц предел" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "Режим Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ ширине" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "Позывной" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "Отправить Позывной в CW в конце каждой передачи" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "СкороÑть (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "Отправить в Ñтом WPM" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "CW ID режимы" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Разное" #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "Медленный процеÑÑор (менее 700 МГц)" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "Включить, еÑли ваш компьютер не правильно декодирует" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Извлечь файл Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ программой \"wrap / flmsg\"" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "Открыть папку Ñообщений" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "ПоÑле уÑпешного захвата открыть папку NBEMS" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "Прием flmsg файлов" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "Открыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ flmsg" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "Открыть Ñообщение Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ flmsg" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "Открыть в браузере" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "Открыть файл в браузере по умолчанию" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "Введите полный путь-Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ flmsg" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "Путь к flmsg" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "Извлечь через NN Ñекунд неактивноÑти." #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "Перевод прÑмо на flmsg" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "Отправить поток данных непоÑредÑтвенно на выполнение flmsg" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "Ðтрибуты почтового Ñервера" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "ÐеÑÑƒÑ‰Ð°Ñ Ñ‡Ð°Ñтота (Гц)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "Диапазон поиÑка (Гц)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "Слушать Ñигналы в пределах Ñтого диапазона" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "Диапазон ÐПЧ (Гц)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "Ограничить движение ÐПЧ в Ñтом диапазоне" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "Ð’ рапорт ARQ Ñреднее значение S/N" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "ÐвтоматичеÑкий Ñпотинг при декодировании позывных" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "Ðнализировать веÑÑŒ входÑщий текÑÑ‚" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "Отправить отчет о приеме при региÑтрации QSO" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "Отправить отчет только тогда, когда QSO региÑтрируетÑÑ" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "ЧаÑтота в рапорт (только при наÑтроенном RIG контроле)" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "Включить чаÑтоту передачи" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Откл Ñпотинг, когда Ñигнал(Ñ‹) в браузере не видны." #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" "Проверьте, чтобы уменьшить нагрузку на центральный процеÑÑор в режимах PSK и " "RTTY." #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "ХоÑтинг:" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "К кому подключаемÑÑ" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "Порт:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "Вкл UDP порт" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "" #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "По умолчанию Ð´Ð»Ñ Ð²Ñех оÑтальных модемов" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "Ð’Ñегда включать новые режимы на Ñтих аудио чаÑтотах" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - Ñтарт по умолчанию\n" "OFF - keep current wf cursor position" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "K3 A1A конфигурациÑ" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "CW в LSB" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Выберите Ð´Ð»Ñ Elecraft К3\n" "Другие радиоÑтанции в Ñтом не нуждаютÑÑ." #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "Ðвто Ñоединение, при отрытии fldigi" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "Захват RX текÑта во внешний файл" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "Вкл текÑтовый поток rx" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "Передать rx текÑÑ‚ в файл: textout.txt" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "Декодировать DTMF тоны" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "Декодировать принÑтые DTMF тоны" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов погоды" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "ID коды METAR Ñтанций" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "Ðапример 1) UUEE 2) 161500Z 3) 07008MPS 4) 9999 5) \n" "DRSN 6) SKC 7) M17/M23 8) Q1028 9) NOSIG 10) RMK 11)" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "Полный рапорт" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "Ð’Ñтавить полныйl METAR рапорт" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "раÑположение METAR Ñтанции" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "Добавить название Ñтанции METAR " #: src/dialogs/confdialog.cxx:15524 msgid "Conditions" msgstr "УÑловиÑ" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "текущие уÑÐ»Ð¾Ð²Ð¸Ñ WX" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "Фаренгейт" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "отчет по Фаренгейту" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "ЦельÑиÑ" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "отчет по ЦельÑию" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "Миль / чаÑ" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "отчет миль в чаÑ" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "км / чаÑ" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "Отчет километров в чаÑ" #: src/dialogs/confdialog.cxx:15554 msgid "Inches Hg." msgstr "Дюймы ртут Ñтолба." #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "дюймов отчет о ртутном Ñтолбе" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "мбар" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "отчет миллибар " #: src/dialogs/confdialog.cxx:15566 msgid "Temperature" msgstr "температура" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "СкороÑть ветра" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "БарометричеÑкое давление" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "ПоиÑк по Ñети" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "ДоÑтуп URL" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "ВвеÑти МЕТÐР данные, URL-адреÑ" #: src/dialogs/confdialog.cxx:15585 msgid "Default URL" msgstr "URL по умолчанию" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "Каталог файлов KML" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "Где ÑохранÑÑŽÑ‚ÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ‹, Ñформированные в формате KML." #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "Сохранение времени в чаÑах (0 без ограничениÑ)" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" "КоличеÑтво чаÑов данных хранитÑÑ Ð½Ð° каждом узле. Ðоль означает, что хранитÑÑ " "вÑе." #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ KML (в Ñекундах)" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Обновить Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи в KML-файл (в Ñекундах)" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:15658 msgid "Command run on KML creation" msgstr "" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Команды Ñтартуют при генерации kml файлов. ПодпроцеÑÑÑ‹ запуÑтить один раз, и " "перезапуÑтить в Ñлучае необходимоÑти." #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "Выполнить команду KML файлов." #: src/dialogs/confdialog.cxx:15669 msgid "Change dir..." msgstr "Изменить папку" #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "Выбрать папку, и Ñохранить документы KML" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "ОчиÑтить данные KML ÑейчаÑ!" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Очичтить KML док. Выгрузить Google Earth диÑплей." #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "ОчиÑтка при запуÑке" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "Выгрузить KML документы при запуÑке." #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "Сервер KML включен (вкл/выкл)" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "Откл еÑли KML не иÑпользуетÑÑ" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "Web" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "ИÑкать позывной" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "ПоиÑк в Web" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "Ðе иÑкать позывной через веб-браузер" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "RTS Ñто РТТ линиÑ" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "ПоÑетить QRZ.com" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "ПоÑетить веб-Ñайт Hamcall" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "ПоÑетить веб-Ñайт hamQTH" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:15750 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15763 #, fuzzy msgid "HamQTH" msgstr "HamQTH....." #: src/dialogs/confdialog.cxx:15776 #, fuzzy msgid "Callook" msgstr "ИÑкать позывной" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "ПоиÑк базы данных" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "Ðе иÑпользовать базы данных позывных" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "ИÑпользовать CD жеÑткий дикÑ" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Вам нужно оплатить уÑлуги\n" "доÑтупа к ÑервиÑу QRZ" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Вам нужно оплатить уÑлуги\n" "доÑтупа к ÑервиÑу Hamcall" #: src/dialogs/confdialog.cxx:15820 #, fuzzy msgid "HamQTH.com" msgstr "HamQTH....." #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "Free service courtesy of OK" #: src/dialogs/confdialog.cxx:15826 #, fuzzy msgid "Callook.info" msgstr "ИÑкать позывной" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Callook.info lookup (беÑплатный ÑÐµÑ€Ð²Ð¸Ñ Ð´Ð»Ñ Ð¡Ð¨Ð)" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Ðе заполнÑйте, чтобы иÑкать базу данных" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "ИмÑ" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "Пароль" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "Показать пароль в виде проÑтого текÑта" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "Добавить Ð°Ð´Ñ€ÐµÑ Ð² поле примечаний" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "очищать данные" #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "eQSL" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "Введите ваш логин" #: src/dialogs/confdialog.cxx:15917 msgid "User ID" msgstr "User ID" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "Ваш логин пароль" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "QTH Nickname" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "Сравнить" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "Сравнить базу данных Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ загрузки eQSL" #: src/dialogs/confdialog.cxx:15971 msgid "Options" msgstr "Опции" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "Отправить в лог (макроÑÑ‹ , )" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð·Ð°ÐºÐ°Ñ‡ÐºÐ° данных" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "ЗапиÑывать в лог date/time off" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "По умолчанию date/time on" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Показать меньше режимов" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 msgid "Default message" msgstr "" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:16010 msgid " {CALL} other ops call sign" msgstr " {CALL} позывной корреÑпондента" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr " {MODE} полный режим/подрежим" #: src/dialogs/confdialog.cxx:16016 msgid "{NAME} other ops name" msgstr "{NAME} Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ñ€ÐµÑпондента" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "Эти теги могут также иÑпользоватьÑÑ Ð² " #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "tqsl:" #: src/dialogs/confdialog.cxx:16030 msgid "Enter full path-filename for tqsl executable" msgstr "ВвеÑти Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° и путь Ð´Ð»Ñ Ð¸ÑполнÑемого файла tqsl" #: src/dialogs/confdialog.cxx:16044 msgid "Your tqsl login password" msgstr "Ваш пароль/логин tqsl" #: src/dialogs/confdialog.cxx:16059 msgid "Use password for tqsl access" msgstr "ИÑпользовать пароль Ð´Ð»Ñ Ð´Ð¾Ñтупа к tqsl" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "Укажите пароль Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ закачки" #: src/dialogs/confdialog.cxx:16065 msgid "Location" msgstr "" #: src/dialogs/confdialog.cxx:16066 msgid "tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 msgid "Locate" msgstr "Путь" #: src/dialogs/confdialog.cxx:16081 msgid "Locate tqsl executable" msgstr "МеÑто tqsl иÑполнÑемого файла" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "Тихий режим [-q], не открывать tqsl диалог" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "УправлÑть tqsl в пакетном режиме" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "Отправить зарегиÑтрированые QSO в LoTW" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "ПредÑтавить каждое QSO, как зарегиÑтрированое" #: src/dialogs/confdialog.cxx:16096 msgid "Export" msgstr "ЭкÑпорт" #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "ЭкÑпортировать отчеты Ð´Ð»Ñ Ð·Ð°ÐºÐ°Ñ‡ÐºÐ¸ LoTW" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 msgid "Check" msgstr "" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "Проверить lotw.adif файл прежде, чем поÑлать Ñ tqsl" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "ПоÑлать lotw.adif через tqsl" #: src/dialogs/confdialog.cxx:16108 #, fuzzy msgid "Export logbook records for LoTW upload" msgstr "ЭкÑпортировать отчеты Ð´Ð»Ñ Ð·Ð°ÐºÐ°Ñ‡ÐºÐ¸ LoTW" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "Редактировать ÑкÑпортируемый LoTW adif файл" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "ПредÑтавить закачку adif файла в LoTW" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" "У Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть уÑтановлена и наÑтроена программа tqsl (http://www.arrl." "org/tqsl-download)" #: src/dialogs/confdialog.cxx:16125 msgid "Use this tqsl station location" msgstr "ИÑпользовать Ñто раÑположение tqsl Ñтанции" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "Сравнить базу данных Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ загрузки LoTW" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "Выбрать запиÑи журнала Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° загрузки LoTW" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "ÐвтоÑтарт ÑовмеÑтно Ñ fldigi" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:16160 msgid "Enter full path-filename for flrig" msgstr "ВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° flrig" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "Путь к flrig" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16178 msgid "Enter full path-filename for flamp" msgstr "ВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° flamp" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "Путь к flamp" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16196 msgid "Enter full path-filename for flnet" msgstr "ВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° flnet" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "Путь к flnet" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16214 msgid "Enter full path-filename for fllog" msgstr "ВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° fllog" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "Путь к fllog" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "Прог 1:" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 msgid "Enter full path-filename for external program" msgstr "ВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° других программ" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "Путь к программе #1" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "Прог 2:" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "Путь к программе #2" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "Прог 3:" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "Путь к программе #3" #: src/dialogs/confdialog.cxx:16285 msgid "" "Enable\n" "-" msgstr "" "Включить\n" "-" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "Включите Ñто при первом запуÑке fldigi" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "Старт flrig" #: src/dialogs/confdialog.cxx:16333 msgid "Start flamp" msgstr "Старт flamp" #: src/dialogs/confdialog.cxx:16337 msgid "Start flnet" msgstr "Старт flnet" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "Старт fllog" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "Старт prog1" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "Старт prog2" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "Старт prog3" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "Блок" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "Разрешить/Запретить изменениÑ" #: src/dialogs/confdialog.cxx:16372 msgid "Enable ARQ" msgstr "Включить ARQ" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "ИÑпользовать Ð´Ð»Ñ PSKmail и набора программ FLDIGI" #: src/dialogs/confdialog.cxx:16380 msgid "Enable KISS" msgstr "Включить KISS" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "ИÑпользовать Ð´Ð»Ñ BPQ32" #: src/dialogs/confdialog.cxx:16388 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Включить ARQ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼, поддерживающих TCP и FLDIGI протокол ARQ .\n" "Включить KISS Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼, поддерживающих TCP/UDP и TNC-2 KISS протоколы.\n" "Может быть активным в любой момент времени только один Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ " "данных.\n" "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² наÑтройках KISS/ARQ/XML требуют перезапуÑка программы." #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ KISS интерфейÑа\n" "IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn\n" "или имÑ: i.e. localhost" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "I/O" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "ИÑходÑщий порт, когда IP Ð°Ð´Ñ€ÐµÑ Ð¸Ñпользован" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "Включить, когда обе программы иÑпользуют один и тот же IP-адреÑ" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 msgid "Restart" msgstr "СброÑ" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "Старт" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "TCP/IP" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "Галка, чтобы включить TCP / IP IO Ñоединение" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "UDP/IP" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "Галка что бы включить UDP/IP IO" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "Монитор Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ TCP." #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "Ðвто Ñоединить/повтор" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "Connect to host program on FLDIGI start up" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "AX25 Декодировать" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "Декодировать пакеты ÐÐ¥25 в читабельной форме" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ ARQ интерфейÑа\n" "IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn\n" "или имÑ: i.e. localhost" #: src/dialogs/confdialog.cxx:16564 msgid "XML" msgstr "XML" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ XMLRPC интерфейÑа\n" "IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn\n" "или имÑ: i.e. localhost" #: src/dialogs/confdialog.cxx:16659 msgid "fllog" msgstr "fllog" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ fllog интерфейÑа\n" "IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn\n" "или имÑ: i.e. localhost" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "Разрешить ТХ поÑле Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñигнала (Ñекунд)" #: src/dialogs/confdialog.cxx:16697 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "Разрешить ТХ поÑле N Ñекунд поÑле Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñигнала" #: src/dialogs/confdialog.cxx:16707 msgid "Enable Busy Channel" msgstr "Вкл канал ЗанÑто" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "таймер ÑброÑа буфера TX (Минут, 0=Выкл)" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" "СбраÑывает буфер TX поÑле периода x, когда канал ЗанÑто оÑтаетÑÑ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼" #: src/dialogs/confdialog.cxx:16726 msgid "Modem Bandwidth Margins " msgstr "отÑтупы от полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ¼Ð° " #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "Мониторить Ñигналы в полоÑе пропуÑÐºÐ°Ð½Ð¸Ñ Ð¿Ð»ÑŽÑ Ð¾Ñ‚Ñтупы" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "Период выборки Ñигнала в миллиÑекундах" #: src/dialogs/confdialog.cxx:16753 msgid "Enable CSMA" msgstr "Включить CSMA" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "Многократный доÑтуп" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "ÐаÑтойчивоÑть" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 msgid "Slot Time" msgstr "" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "Окно запрета повторной передачи" #: src/dialogs/confdialog.cxx:16781 msgid "Transmit Data Delay" msgstr "Задержка передачи данных" #: src/dialogs/confdialog.cxx:16782 msgid "Idle transmit before data sent" msgstr "Задержка передачи данных перед отправкой" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 msgid "MilliSeconds" msgstr "миллиÑекунды" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "Отображение времени в миллиÑекундах" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "Отображать задержку передачи в миллиÑекундах" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "Процент (%)" #: src/dialogs/confdialog.cxx:16809 msgid "Enable Histogram" msgstr "Включить гиÑтограмму" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "Включить мониторинг Ñигнала порога ГиÑтограмма" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "Порог ГиÑтограммы PSM" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "УÑтанавить пороговый уровень Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ… выше ÑƒÑ€Ð¾Ð²Ð½Ñ ÑˆÑƒÐ¼Ð°" #: src/dialogs/confdialog.cxx:16831 msgid "PSM Attenuate" msgstr "PSM Ðттенюатор" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "дробные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ 1 / N регулировки чувÑтвительноÑти" #: src/dialogs/confdialog.cxx:16845 msgid "Default Settings" msgstr "По умолчанию" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "Показать и включить кнопку Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð° (PSM)" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "Отображать PSM в главном диалоге" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "По умолчанию" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "Ð’ÐИМÐÐИЕ - будут перезапиÑаны вÑе наÑтройки" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Цвет шрифта" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Шрифт:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Размер:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Чтение шрифтов ..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "ИÑточники файлов данных" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Обновление файлов данных" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "ИÑточники данных" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "ИÑточник данных" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Хранилище баз данных" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "Обновить выбранные локальные файлы данных из репозиториÑ" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Удалить локальные файлы данных, еÑли выбран." #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Событие" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Включено" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Фильтр" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "DXCC объекты" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Показать объекты DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Ðе работал раньше" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "LotW пользователь" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "eQSL пользователь" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Дубль" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Игнорировать дубли" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "в:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Ð’Ñ€ÐµÐ¼Ñ (Ñек)" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "ДейÑтвие" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ ÑобытиÑми" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Показать окно предупреждениÑ" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Ð’Ñтавить текÑÑ‚ по умолчанию" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Скрыть окно поÑле (Ñек):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Добавить к текÑту RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Добавить к текÑту TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Показать макро редактор" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "ЗапуÑтить программу:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "DXCC клубы" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Ðайти Ñтрану" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "ВернутьÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Ðайти префикÑ" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "УÑтановки ÑкÑпорта" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "Выбрать запиÑÑŒ Ð´Ð»Ñ Ñкпорта" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "Отметить вÑÑ‘" #: src/logbook/lgbook.cxx:622 msgid "Start Date" msgstr "Дата начала" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "Дата начала ÑкÑпорта" #: src/logbook/lgbook.cxx:636 msgid "Stop Date" msgstr "Стоп Дата" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "Стоп-дата включительно" #: src/logbook/lgbook.cxx:650 msgid "select by date" msgstr "выбрать по дате" #: src/logbook/lgbook.cxx:651 #, fuzzy msgid "Enable to select date range" msgstr "Включить, чтобы выбрать диапазон дат" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "Выбор полей Ð´Ð»Ñ ÑкÑпорта" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "ЧаÑтота" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "QSO Date On" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "QSO Date Off" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "Time ON" #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "Time OFF" #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "Ð’Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ð¼Ð¾Ñ‰Ð½Ð¾Ñть" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "RST переданный" #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "RST полученный" #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 msgid "Station Call" msgstr "Позывной корреÑпондента" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 msgid "Station QTH" msgstr "QTH корреÑпондента" #: src/logbook/lgbook.cxx:723 msgid "Station LOC" msgstr "Локатор корреÑпондента" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Примечание" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "Дата Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ QSL" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "Дата отправки QSL" #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "Дата Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ QSL" #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "Дата отправки QSL" #: src/logbook/lgbook.cxx:750 #, fuzzy msgid "LoTW rcvd date" msgstr "Дата Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ QSL" #: src/logbook/lgbook.cxx:753 #, fuzzy msgid "LoTW sent date" msgstr "Дата отправки QSL" #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "QSL через.." #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "ПринÑтый Ñер. номер" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "Переданный Ñер. номер" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "Переданный рапорт" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "FD class" #: src/logbook/lgbook.cxx:795 msgid "FD section" msgstr "FD section" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 msgid "CW SS Check" msgstr "" #: src/logbook/lgbook.cxx:809 #, fuzzy msgid "CW SS Section" msgstr "Раздел" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "Журнал" #: src/logbook/lgbook.cxx:840 msgid "Date On" msgstr "Date On" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "Дата начала QSO" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° QSO" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "Позывной корреÑпондента" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "КорреÑпондент" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "In" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "ПринÑтый RST" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "ЗапиÑи" #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "# ЗапиÑать в журнал" #: src/logbook/lgbook.cxx:913 msgid "Date Off" msgstr "Date Off" #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ QSO" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ†Ð°" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ QSO" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "" #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "ЧаÑтота в MHz" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "ИÑпользуемый режим" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "Pwr" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "ИÑпользовать уÑилитель" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "Сетка Ñтанций" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "Out" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "Переданный RST" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "Сработанные города" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "Сработанные штаты" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "Сработанные провинции" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "Страна работающей Ñтанции" #: src/logbook/lgbook.cxx:1048 msgid "QSL" msgstr "QSL" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "QSL-получено" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "Полученные QSL в Ñту дату" #: src/logbook/lgbook.cxx:1062 msgid "EQSL-rcvd" msgstr "EQSL получено" #: src/logbook/lgbook.cxx:1075 msgid "LOTW-rcvd" msgstr "LOTW получено" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "QSL-отправлено" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "Отправленные QSL в Ñту дату" #: src/logbook/lgbook.cxx:1101 msgid "EQSL-sent" msgstr "EQSL Отправлено" #: src/logbook/lgbook.cxx:1114 msgid "LOTW-sent" msgstr "Отправлено LOTW" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "ÐÐ´Ñ€ÐµÑ QSL бюро" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "ОÑтрова в Ñфире" #: src/logbook/lgbook.cxx:1181 msgid "Cont'" msgstr "Континент" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "Обозначение DXCC" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "ИнтереÑные заметки" #: src/logbook/lgbook.cxx:1236 msgid "My Station" msgstr "ÐœÐ¾Ñ ÑтанциÑ" #: src/logbook/lgbook.cxx:1274 msgid "Station Locator" msgstr "Локатор Ñтанции" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 msgid "Contest seral # sent" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1302 msgid "Exch Out" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "ПринÑтый номер" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "ПринÑтый номер" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "ПринÑтый номер" #: src/logbook/lgbook.cxx:1326 msgid "Exch In" msgstr "ПринÑтый номер" #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "ПринÑтый номер" #: src/logbook/lgbook.cxx:1339 #, fuzzy msgid "Field Day class received" msgstr "Field Day Class" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 #, fuzzy msgid "Field Section received" msgstr "Раздел полевого днÑ" #: src/logbook/lgbook.cxx:1363 #, fuzzy msgid "Operators age received" msgstr "Имена операторов" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 #, fuzzy msgid "Operating band" msgstr "Оператор" #: src/logbook/lgbook.cxx:1399 #, fuzzy msgid "Check value received" msgstr "ПринÑтый номер" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 #, fuzzy msgid "Ser NoR" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 #, fuzzy msgid "Sent troop number" msgstr "Выберите номера контактов" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 #, fuzzy msgid "Received troop number" msgstr "ПринÑтый Ñер. номер" #: src/logbook/lgbook.cxx:1492 #, fuzzy msgid "Name-S" msgstr "ИмÑ" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 #, fuzzy msgid "Name-R" msgstr "ИмÑ" #: src/logbook/lgbook.cxx:1505 #, fuzzy msgid "Received scout name" msgstr "ИÑпользование приема" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "ИÑкать позывной" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "ИÑкать Ñтот позывной" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "Ðайти предыдущее" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "Ðайти далее" #: src/logbook/lgbook.cxx:1549 msgid "Retrieve" msgstr "Извлечь" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "Извлечь Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ¼Ð°" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "ÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ / Сохранить запиÑÑŒ" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "Обновить текущую запиÑÑŒ" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "Удалить текущую запиÑÑŒ" #: src/logbook/lgbook.cxx:1583 msgid "File:" msgstr "Файл:" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "Дата" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "ВремÑ" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "УÑтановки Cabrillo" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "Выберите КонтеÑÑ‚ и Ð¿Ð¾Ð»Ñ Cabrillo" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "QSO Дата" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "ÐаÑтройка управлениÑ\n" #~ "через внешнюю программу\n" #~ "иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ xmlrpc" #~ msgid "Use XML-RPC program" #~ msgstr "ИÑпользовать XML-RPC программу" #~ msgid "Experimental" #~ msgstr "ЭкÑпериментальный" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Инициализировать XML-RPC управление" #~ msgid "" #~ "Delay in seconds between \tLDT in iso-8601 format" #~ msgstr "\tLDT in iso-8601 format" #~ msgid "\tLocal datetime" #~ msgstr "\tÐ›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° и времÑ" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT в формате iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tÐ²Ñ€ÐµÐ¼Ñ Ð² формате UTC" #~ msgid "Operator information" #~ msgstr "Инфо об операторе" #~ msgid "User Interface - Browser" #~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°" #~ msgid "User Interface - General" #~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ - главное" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ - цвет/Шрифт" #~ msgid "User Interface - Contest" #~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ - КонтеÑÑ‚" #~ msgid "User Interface - Macros" #~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ - МакроÑÑ‹" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð¾Ð´Ð¾Ð¿Ð°Ð´Ð°" #~ msgid "Rig Control using xml spec file" #~ msgstr "Управление Rig Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ файла Ñпециального xml файла" #~ msgid "Audio devices" #~ msgstr "Ðудио уÑтройÑтво" #~ msgid "Callsign database" #~ msgstr "База позывных" #~ msgid "Program to Program Communications" #~ msgstr "Программа Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÑƒÐ½Ð¸ÐºÐ°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ программы" #~ msgid "Power Signal Monior" #~ msgstr "Монитор мощноÑти Ñигнала" #~ msgid "Revert" #~ msgstr "ВернутьÑÑ" #~ msgid "Reset rigCAT interface" #~ msgstr "СброÑить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ rigCAT" #~ msgid "Reset hamlib interface" #~ msgstr "СброÑить hamlib интерфейÑ" fldigi-4.1.06/po/POTFILES.in0000664000175000017500000000176413507401434012167 00000000000000# List of source files which contain translatable strings. src/main.cxx src/dialogs/fl_digi.cxx src/dialogs/Viewer.cxx src/globals/globals.cxx src/logbook/adif_io.cxx src/logbook/logbook.cxx src/logbook/logsupport.cxx src/logger/rx_extract.cxx src/logger/speak.cxx src/misc/configuration.cxx src/misc/status.cxx src/misc/debug.cxx src/misc/macroedit.cxx src/misc/macros.cxx src/network/network.cxx src/misc/newinstall.cxx src/mfsk/mfsk-pic.cxx src/waterfall/waterfall.cxx src/rigcontrol/FreqControl.cxx src/rigcontrol/rigsupport.cxx src/rigcontrol/rigxml.cxx src/soundcard/sound.cxx src/soundcard/soundconf.cxx src/spot/notify.cxx src/waterfall/colorbox.cxx src/widgets/FTextRXTX.cxx src/widgets/FTextView.cxx src/widgets/flinput2.cxx src/config_script/run_scripts.cxx src/config_script/script_parsing.cxx src/config_script/create_default_script.cxx # Generated by fluid src/dialogs/confdialog.cxx src/dialogs/font_browser.cxx src/dialogs/record_browse.cxx src/dialogs/notifydialog.cxx src/logbook/lgbook.cxx fldigi-4.1.06/po/de.po0000664000175000017500000066553513515625024011360 00000000000000# German translation file for Fldigi. # Copyright (C) 2013 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the Fldigi package. # Marc Richter df2mr@arrl.net, 2013. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.01\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2013-10-21 13:07+0100\n" "Last-Translator: Marc Richter \n" "Language-Team: German (Marc Richter) \n" "Language: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" "X-Poedit-SourceCharset: iso-8859-1\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "%s Logbuch erstellt am %s" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "" #: src/main.cxx:1710 msgid "Bad frequency" msgstr "" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Lizenz GPLv3+: GNU GPL version 3 oder später \n" "Dies ist freie Software, Sie können sie verändern und weitergeben.\n" "Es gibt KEINE GARANTIE soweit gesetzlich zulässig.\n" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 msgid "Could not make directory " msgstr "Konnte kein Verzeichnis erstellen" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "RX/TX Text aufzeichnen" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "Radio Steuerung" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "Betriebsart" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Weniger Betriebsarten anzeigen" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Zeige alle Betriebssarten" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "Ansicht" #: src/dialogs/fl_digi.cxx:198 #, fuzzy msgid "MFSK Image" msgstr "&MFSK Bilder" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:200 #, fuzzy msgid "IFKP Raw Image" msgstr "&MFSK Bilder" #: src/dialogs/fl_digi.cxx:201 #, fuzzy msgid "Weather Fax Image RX" msgstr "&Wetter Fax Bilder RX" #: src/dialogs/fl_digi.cxx:202 #, fuzzy msgid "Weather Fax Image TX" msgstr "&Wetter Fax Bilder TX" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "Länder" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "GUI" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "Vollständig" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Keine" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "Angedocktes Scope" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "Minimale Steuerungselemente" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "Zeige Kanäle" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "Mit Server verbinden" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "Individuell" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "Geänderte Makros speichern?" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "Abbrechen" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Speichern" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "Nicht speichern" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "Nein" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Ja" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "Kein Dateiname angegeben" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "Nicht unterstützes Format" #: src/dialogs/fl_digi.cxx:2700 msgid "channels != 1" msgstr "Kanäle =! 1" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "Unbekannter wave file Fehler" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "Spotting deaktiviert" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Konnte keinen Web Browser starten:\n" "%s\n" "\n" "Diese Adresse manuell öffnen:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Konnte Adresse nicht öffnen:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Überprüfe auf verfügbare Updates..." #: src/dialogs/fl_digi.cxx:2858 msgid "Update site not available" msgstr "" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "Sie arbeiten bereits mit der neuesten Version" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "Sie arbeiten bereits mit der neuesten Version" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "Version %s ist verfügbar\n" "\n" "%s\n" "Was kann ich für Sie tun?" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "Audiogerät Information nur für PortAudio Backends verfügbar" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "Aufnahmegerät" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "Wiedergabegerät" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Aufnahme- und Wiedergabegerät" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: existiert nicht, soll es (neu) erstellt werden?" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "Log Einträge löschen?" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "Okay" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Bestätigung" #: src/dialogs/fl_digi.cxx:4525 msgid "Save changed configuration?" msgstr "Geänderte Einstellungen speichern?" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 #, fuzzy msgid "Save log entry?" msgstr "Aktuellen Log Eintrag speichern?" #: src/dialogs/fl_digi.cxx:4557 #, fuzzy msgid "Confirm Quit" msgstr "Beenden bestätigen" #: src/dialogs/fl_digi.cxx:4579 #, fuzzy msgid "Confirm quit?" msgstr "Beenden bestätigen" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "Datei" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Ordner" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Fldigi Konfiguration..." #: src/dialogs/fl_digi.cxx:5865 msgid "FLMSG files..." msgstr "FLMSG Dateien..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "NBEMS Dateien..." #: src/dialogs/fl_digi.cxx:5867 msgid "Data files..." msgstr "Daten Dateien..." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "Makros" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Öffnen ..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Speichern ..." #: src/dialogs/fl_digi.cxx:5875 #, fuzzy msgid "Config Scripts" msgstr "Beenden bestätigen" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5877 #, fuzzy msgid "Generate" msgstr "Allgemein" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "Texterfassung" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "Empfangs Mitschnitt" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "Wiedergabe" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Beenden" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "Konfiguration" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "GUI" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "Farben && Schriftart" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "Benutzer" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "GUI" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "Wasserfall" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "Wasserfall Einstellungen" #: src/dialogs/fl_digi.cxx:6146 #, fuzzy msgid "Operating" msgstr "Benutzer" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 #, fuzzy msgid "Active Modem" msgstr "Rx Betriebsarten" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "Soundkarte" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "" #: src/dialogs/fl_digi.cxx:6155 #, fuzzy msgid "CPU speed" msgstr "AFC Geschwindigkeit" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/fl_digi.cxx:6157 #, fuzzy msgid "PSKmail" msgstr "Pskmail" #: src/dialogs/fl_digi.cxx:6158 #, fuzzy msgid "PSK reporter" msgstr "PSK Reporter" #: src/dialogs/fl_digi.cxx:6159 msgid "Sweet spot" msgstr "" #: src/dialogs/fl_digi.cxx:6160 #, fuzzy msgid "Text IO" msgstr "Text I/O" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "DTMF" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "WX" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "KML" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Andere" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "Autostart" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 #, fuzzy msgid "IO" msgstr "IOTA" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Mitteilungen" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 #, fuzzy msgid "PSM" msgstr "PSK" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 #, fuzzy msgid "Test Signals" msgstr "Sendesignal" #: src/dialogs/fl_digi.cxx:6175 #, fuzzy msgid "Contest/Logging" msgstr "Contest Austausch In" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Einstellungen speichern" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Kanäle anzeigen/verbergen" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "Signal Browser" #: src/dialogs/fl_digi.cxx:6190 #, fuzzy msgid "View/Hide 48 macros" msgstr "Kanäle anzeigen/verbergen" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "Oszilloskop" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6205 #, fuzzy msgid "Rig/Log Controls" msgstr "Radio Steuerung" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "&Logbuch" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "Ansicht" #: src/dialogs/fl_digi.cxx:6221 #, fuzzy msgid "Files" msgstr "Datei" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Öffnen" #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Neu" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "Zusammenführen..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "Exportieren..." #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "Reporte" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "Text..." #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6242 #, fuzzy msgid "Field Day Logging" msgstr "Mausrad Aktion" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "&Hilfe" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "Sonnenflecke erstellen" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "Leitfaden für Anfänger" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "Online Dokumentation (Englisch)..." #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Fldigi Webseite..." #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "Empfangsberichte..." #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Befehlszeilenoptionen" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "Audio Gerät Informationen" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "Informationen zur Kompilierung" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "Ereignisprotokoll" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Überprüfe auf Updates..." #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "Über" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "Nur Wasserfall Modus" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "KEIN RUFZEICHEN ANGEGEBEN" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Liste schließen" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Liste öffnen" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "Liste löschen?" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "Bericht" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "Berichte" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "Neueste Aktivität für Grid" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "Signal Browser" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "Oszilloskop" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Erkannter Signalpegel" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Rauschsperren Pegel" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Links Klick: Betiebsart ändern\n" "Rechts Klick: Konfigurieren" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "CW Sendegeschwidigkeit in WPM" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "Standard WPM" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "Tx Dämpfung (dB)" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "AGC" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "Rauschsperre" #: src/dialogs/fl_digi.cxx:8226 msgid "Power Signal Monitor" msgstr "" #: src/dialogs/fl_digi.cxx:9943 #, fuzzy msgid "Delete entry?" msgstr "Aktuellen Log Eintrag speichern?" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Alles" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "Finde" #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Schließen " #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "Löschen" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Klick links um Text zu löschen\n" "Klick rechts für Frequenz reset" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "Rauschsperre für Viewer setzen" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "In CSV Datei exportieren" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "Exportieren in Datei mit festen Feldern" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "In ADIF Datei exportieren" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "Geändertes Logbuch speichern?" #: src/logbook/logsupport.cxx:381 #, fuzzy msgid "Create new logbook file" msgstr "Neues Logbuch erstellen?" #: src/logbook/logsupport.cxx:404 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "%s: existiert nicht, soll es (neu) erstellt werden?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Logbuch Datei öffnen" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Logbuch Datei speichern" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "ADIF Dateien zusammenführen" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "Update" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Eintrag \"%s\" wirklich löschen?" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "Cabrillo Report erzeugen" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "Konnte flmsg nicht starten" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "flmsg Datei finden" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "Ausführbare Datei finden" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:497 msgid "Locate binary" msgstr "" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "*" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Empfangenen Text speichern, Zeichenweise in folgende Datei:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "Radio Modus" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Immer LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Immer USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Alle Einstellungen auf Standard zurücksetzen?\n" "\n" "Reset wird mit dem nächsten Neustart von Fldigi wirksam\n" "Die Dateien: fldigi_def.xml und fldigi.prefs werden gelöscht!\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Bitte bestätigen für Reset" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "Weniger Einträge" #: src/misc/debug.cxx:89 msgid "Error" msgstr "Fehler" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "Warnung" #: src/misc/debug.cxx:89 msgid "Info" msgstr "Information" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "Ausführlich" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "ARQ Steuerung" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:105 #, fuzzy msgid "KISS control" msgstr "Radio Steuerung" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "Log Datei Quelle" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "Log Level ändern" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tMeine Frequenz" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tBetriebsart" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tMein Rufzeichen" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tMein Locator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tMein Name" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tMein QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tMein RST" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy FD class" msgstr "\tMein Rufzeichen" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy state" msgstr "\tMein Name" #: src/misc/macroedit.cxx:81 #, fuzzy msgid "\tmy ST" msgstr "\tMein RST" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:83 #, fuzzy msgid "\tmy CNTY" msgstr "\tMein QTH" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "\tMeine Antenne" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "\tgenutztes Band" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "\tFldigi version" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "\tRufzeichen der andere Station" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "\tName des anderen OP" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "\tQTH der anderen Station" #: src/misc/macroedit.cxx:93 #, fuzzy msgid "\tother State" msgstr "\tRST der anderen Station" #: src/misc/macroedit.cxx:94 #, fuzzy msgid "\tother Province" msgstr "\tName des anderen OP" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "\tLocator der andere Station" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "\tRST der anderen Station" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "\t# Anzahl QSO Einträge" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "\tNächster QSO Eintrag #" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "\tGoogle Karte" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "\tKarte mit Werten darstellen" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "\tEmpfangsbereich löschen" #: src/misc/macroedit.cxx:112 msgid "\tclear TX pane" msgstr "\tSendebereich löschen" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "\tText nach NAME/QTH" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk On, Off, Toggle" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "\tLog Felder löschen" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "\tQSO Daten speichern" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "\tsaveQSO data, append msg to notes" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "\tLoggen mit xmt Zeit" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "\tQSO Daten speichern, und Nachricht anhängen" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "\teQSL loggen" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "\tlogge eQSL mit optionaler Nachricht" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "\tQSO Zeit (SSMM))" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:137 #, fuzzy msgid "\tlocal time, default %H%M" msgstr "\tLokale Zeit SSMM" #: src/misc/macroedit.cxx:138 #, fuzzy msgid "\tzulu time default %H%MZ" msgstr "\tZulu Zeit SSMMz" #: src/misc/macroedit.cxx:139 #, fuzzy msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tLokale Zeit JJJ-MM-TT" #: src/misc/macroedit.cxx:140 #, fuzzy msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tZulu Datum JJJJ-MM-TT Z" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "\tWetterdaten abrufen" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "\tWetterdaten für Station abrufen" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "\tContestzähler" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "\tZähler verringern" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "\tZähler erhöhen" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "\tAustausch erhalten" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "\tAustausch gegeben" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "\tAustausch beginnt" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "\tAustausch endet" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "\tAustaucsh gegeben speichern" #: src/misc/macroedit.cxx:153 #, fuzzy msgid "\tcurrent contest serno" msgstr "\tZähler verringern" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD class" msgstr "\tMein Rufzeichen" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tFD section" msgstr "Empfangene Seriennummer" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "\tcontest class" msgstr "\tMein Rufzeichen" #: src/misc/macroedit.cxx:158 #, fuzzy msgid "
\tARRL section" msgstr "Empfangene Seriennummer" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "\tEmpfang" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "\tSenden" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "\tUmschalten T/R" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "\tSuche aufwärts nach Signal" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "\tSuche abwärts nach Signal" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "\tGehe zu Frequenz NNNN Hz" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "\tLinks Klick QSY Button" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "\tRechts Klick QSY Button" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "\tqsy um kHz, Hz" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "\tGültiger TRX Modus" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "\tGültiger TRX Filter Breite" #: src/misc/macroedit.cxx:174 #, fuzzy msgid "\tvalid xcvr low cutoff filter" msgstr "\tGültiger TRX Filter Breite" #: src/misc/macroedit.cxx:175 #, fuzzy msgid "\tvalid xcvr hi cutoff filter" msgstr "\tGültiger TRX Filter Breite" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "\tQRG in RX Feld einfügen" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "\tTextdatei einfügen" #: src/misc/macroedit.cxx:183 #, fuzzy msgid "\tinsert image file" msgstr "\tMFSK Bild einfügen" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tpause transmit" msgstr "\tSendepause" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "\tRuhesignal für NN.nn sek" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "\tWiederhole alle NN sek" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tAbstimmsignal für NN sek" #: src/misc/macroedit.cxx:191 #, fuzzy msgid "\tdelay xmt for NN.n sec" msgstr "\txmt verzögern für NN sek" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tMakros kontinuierlich wiederholen" #: src/misc/macroedit.cxx:193 #, fuzzy msgid "\tschedule execution" msgstr "\tgeplante Ausführung" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "\tsetze xmt Abschwächer" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "\tCW Kennung" #: src/misc/macroedit.cxx:200 #, fuzzy msgid "\tsend mode ID; TX start only" msgstr "\tSende Betriebsart ID in Video Text" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "\tTX RSID ein, aus, umschalten" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID ein, aus, umschalten" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tSende |NN| aufeinanderfolgende RsID Signale" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "\t[warten][länge](msek)" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "\tCW Anstiegszeit" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "\tCW WPM:Farnswoth" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "\tSende CAT Kommando" #: src/misc/macroedit.cxx:220 #, fuzzy msgid "\tsend CAT cmd" msgstr "\tSende CAT Kommando" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "\tAFC ein, aus, umschalten" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "\tMakro Definitionsdatei ändern" #: src/misc/macroedit.cxx:229 msgid "\tsave current macro file" msgstr "\tGegenwärtiges Makro speichern" #: src/misc/macroedit.cxx:232 #, fuzzy msgid "\tignore all comment text" msgstr "\tnicht gesendeter Text" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:243 #, fuzzy msgid "\tWAV file; spec' file" msgstr "\tTextdatei einfügen" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:247 #, fuzzy msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAFC ein, aus, umschalten" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "Textdatei einfügen" #: src/misc/macroedit.cxx:384 #, fuzzy msgid "Test text file" msgstr "\tTextdatei einfügen" #: src/misc/macroedit.cxx:394 msgid "MFSK image file" msgstr "MFSK Bild laden" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "Wechseln zu Makrodatei" #: src/misc/macroedit.cxx:414 #, fuzzy msgid "Select wav file" msgstr "Gerät auswählen" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "Ausführbare Datei einfügen" #: src/misc/macroedit.cxx:457 msgid "Macro Text" msgstr "Makro Text" #: src/misc/macroedit.cxx:462 msgid "Select Tag" msgstr "Kennzeichnung auswählen" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "Beschriftung für Button" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "Anwenden" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "Makro Editor - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Makrodatei laden" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fldigi Makro Definitions Datei\t*.{mdf}" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "Makrodatei speichern" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Fertig" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Weiter " #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Zurück" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "Dieser Assistent wird Sie durch die grundlegenden Einstellungen führen" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" "Sie können jederzeit eine Seite überspringen oder den Assistenten beenden" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Alle hier getätigten Einstellungen können später auch noch über das " "Konfigurationsmenu geändert werden" #: src/misc/newinstall.cxx:540 msgid "Fldigi configuration wizard" msgstr "Fldigi Konfigurations Assistent" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "Zeitaufwand: " #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "Bild laden" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Bild senden" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Bilddatei laden- oder hierher ziehen\n" "Unterstützte Dateitypen: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "Sende Geschwindigkeit, X1-normal" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "Laden" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "Wasserfall / FFT / Oszilloskop" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Oberer Signalpegel(dB)" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "Signalbereich (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Wasserfall Skala ändern" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "Anzeige auf Signal zentrieren" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "Fallgeschwidigkeit des Wasserfalls" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "Cursor Frequenz einstellen" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Zentrum im Durchlassbereich\n" "Rechte Maustaste macht rückgängig" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Speichere Betriebsart und Frequenz\n" "Rechts Klick für Liste" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Sendefrequenz sperren" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "Umkehren" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Senden/Empfangen" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "AFC Bereich oder BW" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "Signal suche" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "Modem Träger" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "Blättern" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Radio xml Datei öffnen" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fldigi radio xml Definitions Datei" #: src/soundcard/sound.cxx:170 #, fuzzy msgid "Waveform Audio Format\t*.wav\n" msgstr "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Freier Lossless Audio Codec\t*.flac" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "Audio Datei" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "Wiedergabe in Endlosschleife?" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "Mein Rufzeichen de CALL" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "Station zweimal gehört" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "Indivduelle Volltextsuche" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "RSID Empfang" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "Wechseln" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "Entfernen" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Auswählen" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "Kontinent" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "ITU Zone" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "CQ Zone" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "Deaktivieren" #: src/spot/notify.cxx:519 msgid "Add" msgstr "Hinzufügen" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Alles wählen" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "Alles löschen" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "Land" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "Das Feld 'regulärer Ausdruck' darf nicht leer sein." #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "Der reguläre Ausdruck muss gültig sein." #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "Bitte zuerst das Rufzeichen eintragen" #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Programm ausführen" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" "Standard Testreihe ist:\n" " \"" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "Test String eingeben, oder freilassen für Standard" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "Der reguläre Ausdruck für dieses Ereignis ist ungültig" #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "Die Testreihe entspricht nicht dem Suchmuster des Ereignisses" #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "Verfügbare Teilreihen" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "Frequenz" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "Rufzeichen" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Palette öffnen" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "Fldigi Palette\t*.pal" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "Farbpalette speichern" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "Rufzeichen nachschlagen" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "Call" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "Name" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "Staat" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 msgid "County" msgstr "Land" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "Provinz" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "Exchange In" #: src/widgets/FTextRXTX.cxx:161 #, fuzzy msgid "Rx Serial #" msgstr "Seriennummer # eingehend" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 #, fuzzy msgid "Section" msgstr "Aktion" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 #, fuzzy msgid "SS check" msgstr "Alles überprüfen" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 #, fuzzy msgid "SS section" msgstr "Aktion" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 #, fuzzy msgid "QSOp state" msgstr "QSO Startzeit" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 #, fuzzy msgid "QSOp name" msgstr "Benutzer Name" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Markierung einfügen" #: src/widgets/FTextRXTX.cxx:198 #, fuzzy msgid "All entries" msgstr "Wiederholungen" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "Scoll Hinweise" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "Letztes QSO" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Senden" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "Empfangen" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "Abbruch" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Bild senden..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 msgid "A" msgstr "" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 #, fuzzy msgid "E" msgstr "Ex" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "IOTA" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "Nein" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 #, fuzzy msgid "O" msgstr "Okay" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 #, fuzzy msgid "U" msgstr "GUI" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Text einfügen" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Text speichern als" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Kopieren" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Speichern als..." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "Zeilenumbruch" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Ausschneiden" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Einfügen" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Datei einfügen..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Rückgängig" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "Löschen" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, fuzzy, c-format msgid "Executing script file: %s" msgstr "Radio Beschreibungsdatei auswählen" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:394 #, fuzzy msgid "Command Not Found" msgstr "Befehlszeilenoptionen" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:414 #, fuzzy msgid "General Error" msgstr "Allgemein" #: src/config_script/script_parsing.cxx:418 #, fuzzy msgid "No Errors" msgstr "Fehler" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "no" msgstr "Information" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "yes" msgstr "Ja" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Ansicht" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "Fldigi Konfiguration" #: src/dialogs/confdialog.cxx:8227 #, fuzzy msgid "Station / Operator" msgstr "Station zweimal gehört" #: src/dialogs/confdialog.cxx:8230 #, fuzzy msgid "Station Callsign:" msgstr "Benutzer Rufzeichen" #: src/dialogs/confdialog.cxx:8231 #, fuzzy msgid "Station callsign" msgstr "Benutzer Rufzeichen" #: src/dialogs/confdialog.cxx:8244 #, fuzzy msgid "Operator Callsign:" msgstr "Benutzer Rufzeichen" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:8259 #, fuzzy msgid "Operator Name:" msgstr "Benutzer Name" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Name des Benutzers" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "Antenne:" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "Kurzbeschreibung der Antenne" #: src/dialogs/confdialog.cxx:8287 #, fuzzy msgid "Station QTH:" msgstr "Station" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "Benutzer QTH" #: src/dialogs/confdialog.cxx:8301 #, fuzzy msgid "Station Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "Maidenhead Locator wie z.B: JO40hm" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "Browser" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Kanäle; der erste Kanal beginnt an Wasserfall Untergrenze" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "Ändern der # des PSK Betrachters" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "Zeitlimit für Inaktivität" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Text im Kanal nach\n" "# sekunden inaktivität löschen" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Beschriftung / Kanäle" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Ansicht der Kanalbeschriftung" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "Audio Frequenz" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "Radio Frequenz" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "Kanal Nummer" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "Schrift..." #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "Browser Schriftart auswählen" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "Feste Intervalle" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "Kanalabstand auf gerade 100 Hz erzwingen" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "Kontinuierliches Scrollen" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "" #: src/dialogs/confdialog.cxx:8467 msgid "Detection Level" msgstr "Nachweisgrenze" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "Hgrund" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "Hintergrundfarbe des Signalbetrachters / Rauschkontrolle" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "Knopf" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "Browser Linienfarben" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "HiLite1" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY Betrachter Farbe HiLite 1" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "HiLite2" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "PSK/RTTY Betrachter Farbe HiLite 2" #: src/dialogs/confdialog.cxx:8497 msgid "Even" msgstr "Gerade" #: src/dialogs/confdialog.cxx:8498 msgid "Even lines" msgstr "Gerade linien" #: src/dialogs/confdialog.cxx:8503 msgid "Odd" msgstr "Ungerade" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "Ungerade Linien" #: src/dialogs/confdialog.cxx:8510 msgid "Select line" msgstr "Linie auswählen" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "Allgemein" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Tooltipps anzeigen" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "Aktivieren / Deaktivieren der Tooltipps" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Menu Symbole zeigen" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "Aktivieren / Deaktivieren der Symbole in Menüs" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "GUI Schema" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Look and feel der Anwendung ändern" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "Sichtbare Modi" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Modi für Zugriff auf Menü" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "Sprache der Bedienoberfläche" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Änderungen werden erst beim nächsten Programmstart wirksam" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Zeichen bei CW / RTTY / THROB / CONTESTIA in Kleinbuchstaben" #: src/dialogs/confdialog.cxx:8591 #, fuzzy msgid "Transmit lower case text" msgstr "Verwendete Sendeleistung" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "Aufforderung zum Beenden" #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "Prompt Konfiguration speichern" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "Prompt Makro Datei speichern" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "Aktuelle Makros bei Programmende sichern" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "Prompt Log Datei speichern" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "Prompt um Log Datei zu speichern" #: src/dialogs/confdialog.cxx:8618 msgid "Confirm exit" msgstr "Beenden bestätigen" #: src/dialogs/confdialog.cxx:8625 msgid "Check for updates" msgstr "Nach Updates suchen" #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "Bei Programmstart nach Updates suchen" #: src/dialogs/confdialog.cxx:8638 #, fuzzy msgid "Show TX timer" msgstr "Zeige DXCC Datensätze" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "Log" #: src/dialogs/confdialog.cxx:8658 #, fuzzy msgid "QSO" msgstr "QSY" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "QSO Logging" #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "Aufforderung Log Datei speichern" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "Löschen nach speichern" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "Logeinträge löschen nach speichern oder Makro " #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "Rufzeichen in Grossbuchstaben" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "Rufzeichen in Grossbuchstaben erzwingen" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Land und Azimuth automatisch füllen" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Land und Azimuth mit Informationen aus cty.dat Datei füllen" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "Sortieren nach Datum/Zeit aus" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Sortieren nach Datum/Uhrzeit ausgeschaltet - beinflusst alle ADIF / Cabrillo " "Reports" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "Datum/Zeit EIN == AUS" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "Datum/Zeit ON == Datum/Zeit OFF forcieren" #: src/dialogs/confdialog.cxx:8698 #, fuzzy msgid "Default RST in to 599/59" msgstr "Standard RST ist 599" #: src/dialogs/confdialog.cxx:8699 #, fuzzy msgid "Clear log controls sets RST in to 599/59" msgstr "Log Felder mit RST In 599 löschen" #: src/dialogs/confdialog.cxx:8704 #, fuzzy msgid "Default RST out to 599/59" msgstr "Standard Ausgangs RST ist 599" #: src/dialogs/confdialog.cxx:8705 #, fuzzy msgid "Clear log controls sets RST out to 599/59" msgstr "Log Felder mit RST Out 599 löschen" #: src/dialogs/confdialog.cxx:8710 #, fuzzy msgid "cty.dat folder" msgstr "Finde cty.dat Datei" #: src/dialogs/confdialog.cxx:8711 #, fuzzy msgid "Enter full path-name for cty.dat folder" msgstr "Vollständigen Dateinamen/Pfad für cty.dat Datei eingeben" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "Suchen" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "Finde cty.dat Datei" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "Standard" #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "Wiederherstellung des cty.dat Standardordners" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "Neu laden" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "cty.dat erneut laden" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "Sendeleistung" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "Sende Leistung für Logbuch Einträge" #: src/dialogs/confdialog.cxx:8751 #, fuzzy msgid "Display logbook read datum at start" msgstr "Makro Dateiname bei Programmstart anzeigen" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "Der Dateiname wurde in den RX Text Bereich geschrieben" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 #, fuzzy msgid "Rx Text" msgstr "Empfangs Text aufnehmen" #: src/dialogs/confdialog.cxx:8766 #, fuzzy msgid "Single-click to capture" msgstr "Doppelklicken, um zu erfassen" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "Rufzeichen Tooltips in empfangenen Text" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "Popup Info nach 2 sek über dem Rufzeichen schweben" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "Wort Trennzeichen" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:8801 #, fuzzy msgid "Clear log fields - new CALL" msgstr "Log Einträge löschen?" #: src/dialogs/confdialog.cxx:8812 #, fuzzy msgid "Connect to MacLogger" msgstr "Mit Server verbinden" #: src/dialogs/confdialog.cxx:8817 #, fuzzy msgid "Capture Radio Report" msgstr "Cabrillo Report erzeugen" #: src/dialogs/confdialog.cxx:8823 #, fuzzy msgid "Capture Log Report" msgstr "Cabrillo Report erzeugen" #: src/dialogs/confdialog.cxx:8828 #, fuzzy msgid "Capture Lookup " msgstr "Rufzeichen nachschlagen" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 #, fuzzy msgid "Enable UDP log file" msgstr "Alles ein" #: src/dialogs/confdialog.cxx:8848 #, fuzzy msgid "UDP data stream" msgstr "Daten Quelle" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8868 #, fuzzy msgid "Clear text" msgstr "Liste löschen" #: src/dialogs/confdialog.cxx:8871 #, fuzzy msgid "Address" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:8872 #, fuzzy msgid "N3FJP Server IP Address" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 #, fuzzy msgid "Port" msgstr "Port:" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" #: src/dialogs/confdialog.cxx:8905 msgid "Enable Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 #, fuzzy msgid "Connect" msgstr "Erneut Verbinden" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 #, fuzzy msgid "Connected" msgstr "Erneut Verbinden" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 #, fuzzy msgid "Contests" msgstr "Contest" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 #, fuzzy msgid "State QSO Party" msgstr "Startdatum QSO" #: src/dialogs/confdialog.cxx:8980 #, fuzzy msgid "Text capture order" msgstr "Texterfassung" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Context Notes" msgstr "Contest" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "Dublettenprüfung Call plus" #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "Ein/Aus" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Überprüfen auf Dupliakte" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Band" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "Bänder müssen übereinstimmen" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "Betriebsart" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "Modus muss übereinstimmen" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "Zeitspanne um" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "Verbindung darf nicht innerhalb eines Zeitraums von auftreten" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "Duplikate" #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "Linksklick um Farbe für Duplikate zu wählen" #: src/dialogs/confdialog.cxx:9029 #, fuzzy msgid "? Dup Color" msgstr "Duplikate" #: src/dialogs/confdialog.cxx:9030 #, fuzzy msgid "Left click to select possible dup color" msgstr "Linksklick um Farbe für Duplikate zu wählen" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "Bundesstaat muss übereinstimmen" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "Minuten" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "Zeitspanne in Minuten eingeben" #: src/dialogs/confdialog.cxx:9069 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Contest Austausch In" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 #, fuzzy msgid "Send" msgstr "Gesendet:" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "Frei Form Austausch" #: src/dialogs/confdialog.cxx:9087 #, fuzzy msgid "RST always 599/59" msgstr "RST immer 599 senden" #: src/dialogs/confdialog.cxx:9088 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "RST immer 599 für ein/aus forcieren" #: src/dialogs/confdialog.cxx:9093 msgid "Send CW cut #'s" msgstr "" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:9101 #, fuzzy msgid "Start Nbr" msgstr "Start" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "Startnummer" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Ziffern" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "Anzahl der Stellen in Seriennummer" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "Führende Nullen verwenden" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "Führende Nullen in Xmtd Serien Nummer einfügen" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Reset" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "QSO logging Felder initialisieren" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 #, fuzzy msgid "Operator Call" msgstr "Benutzer Name" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:9170 #, fuzzy msgid "My Section" msgstr "Aktion" #: src/dialogs/confdialog.cxx:9171 #, fuzzy msgid "Field Day Section" msgstr "Mausrad Aktion" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 #, fuzzy msgid "Scout Operator Name" msgstr "Benutzer Name" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "Mausrad aktiv bei Makros" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "Mausrad einschalten um Makros zu kontrollieren" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Anzahl und Position der Makroreihen" #: src/dialogs/confdialog.cxx:9282 #, fuzzy msgid "Button Height" msgstr "Knopf" #: src/dialogs/confdialog.cxx:9283 #, fuzzy msgid "Height of macro bar" msgstr "Anzahl und Position der Makroreihen" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" #: src/dialogs/confdialog.cxx:9299 #, fuzzy msgid "One above waterfall" msgstr "Eine Reihe (über dem Wasserfall)" #: src/dialogs/confdialog.cxx:9304 #, fuzzy msgid "One below waterfall" msgstr "Eine Reihe (unter dem Wasserfall)" #: src/dialogs/confdialog.cxx:9309 #, fuzzy msgid "Two scheme 1" msgstr "Zwei Reihen (Schema 1)" #: src/dialogs/confdialog.cxx:9314 #, fuzzy msgid "Two scheme 2" msgstr "Zwei Reihen (Schema 2)" #: src/dialogs/confdialog.cxx:9319 #, fuzzy msgid "Two scheme 3" msgstr "Zwei Reihen (Schema 3)" #: src/dialogs/confdialog.cxx:9324 #, fuzzy msgid "Two scheme 4" msgstr "Zwei Reihen (Schema 4)" #: src/dialogs/confdialog.cxx:9329 #, fuzzy msgid "Two scheme 5" msgstr "Zwei Reihen (Schema 5)" #: src/dialogs/confdialog.cxx:9334 #, fuzzy msgid "Two scheme 6" msgstr "Zwei Reihen (Schema 6)" #: src/dialogs/confdialog.cxx:9339 #, fuzzy msgid "Two scheme 7" msgstr "Zwei Reihen (Schema 1)" #: src/dialogs/confdialog.cxx:9344 #, fuzzy msgid "Two scheme 8" msgstr "Zwei Reihen (Schema 1)" #: src/dialogs/confdialog.cxx:9349 #, fuzzy msgid "Two scheme 9" msgstr "Zwei Reihen (Schema 1)" #: src/dialogs/confdialog.cxx:9354 #, fuzzy msgid "Two scheme 10" msgstr "Zwei Reihen (Schema 1)" #: src/dialogs/confdialog.cxx:9363 #, fuzzy msgid "Load last used macro file at start" msgstr "Laden der zuletzt verwendeten Makro Datei bei Programmstart" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "EIN - Letzten Makrosatz verwenden\n" "AUS - Standardsatz verwenden" #: src/dialogs/confdialog.cxx:9369 #, fuzzy msgid "Display macro filename at start" msgstr "Makro Dateiname bei Programmstart anzeigen" #: src/dialogs/confdialog.cxx:9385 #, fuzzy msgid "Show macro control codes" msgstr "Makro Editor anzeigen" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9405 msgid "WF Ctrls" msgstr "Wasserfall Kontrolle" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "Aktivieren, um entsprechendes Bedienelement anzuzeigen" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "WF Vergrösserung" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "WF Träger" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "WF Modus" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "Alles ein" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "Alles aus" #: src/dialogs/confdialog.cxx:9489 #, fuzzy msgid "Clrs/Fnts" msgstr "Farben/Schrift" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "Rx/Tx" #: src/dialogs/confdialog.cxx:9494 #, fuzzy msgid "Rx/Tx Character set" msgstr "Rx/Tx Zeichensatz auswählen" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "Rx/Tx Zeichensatz auswählen" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "Rx HGrund" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "Tx HGrund" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "Rx Schrift" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "Tx Schrift" #: src/dialogs/confdialog.cxx:9539 #, fuzzy msgid "Macro Edit Font" msgstr "Makro Editor - " #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "Text hervorheben" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "Gesendete Zeichen in Rx/Tx Bereich" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "STRG" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "Control-Zeichen in Rx / Tx Bereich" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "Alternative Zeichenfarbe im Rx Panel" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "Auswahl Hintergrundfarbe in Rx Tx Panel" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "System" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "Standard" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "Schrift" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "HGrundfarbe" #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "Ziffernfarbe" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "Sys Farben" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 #, fuzzy msgid "Scale Color" msgstr "Farbe" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 #, fuzzy msgid "Meter Color" msgstr "Ziffernfarbe" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "FFT Vorfilter wählen" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "Protokoll Bedienelemente" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "Logbuch Dialog" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 #, fuzzy msgid "Report Browser" msgstr "Browser" #: src/dialogs/confdialog.cxx:9721 #, fuzzy msgid "Even Lines" msgstr "Gerade linien" #: src/dialogs/confdialog.cxx:9726 #, fuzzy msgid "Odd Lines" msgstr "Ungerade Linien" #: src/dialogs/confdialog.cxx:9731 #, fuzzy msgid "Stream Text" msgstr "Sekundärer Text" #: src/dialogs/confdialog.cxx:9737 #, fuzzy msgid "Bg color" msgstr "HGrundfarbe" #: src/dialogs/confdialog.cxx:9743 #, fuzzy msgid "Alt Color" msgstr "Farbe" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "F_Tasten" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "Farbige Schaltflächen" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Gruppe 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "Hintergrundfarbe für Funktionstaste Gruppe 1" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Gruppe 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "Hintergrundfarbe für Funktionstaste Gruppe 2" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Gruppe 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "Hintergrundfarbe für Funktionstaste Gruppe 3" #: src/dialogs/confdialog.cxx:9783 #, fuzzy msgid "Font/Color" msgstr "Schriftfarbe" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "Registerkarte" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "Farbe" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "Schaltflächen" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "Rev" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "Abstimmen" #: src/dialogs/confdialog.cxx:9808 #, fuzzy msgid "RxID nar" msgstr "RxID" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:9820 #, fuzzy msgid "RxID wide" msgstr "RxID" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "Farbmarkierte Button" #: src/dialogs/confdialog.cxx:9882 #, fuzzy msgid "All Others" msgstr "Andere" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "Pegel" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "Niedrig" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "Hoch" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "Normal" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "Über" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "Signalpegel Farbe" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "Anzeige" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "Farben und Cursor" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Farbe ändern" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "Laden" #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "Neue Palette laden" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Speichern" #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "Diese Palette speichern" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "Bandbreite" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "Ein" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "Zeige Cursor mit Bandbreitenlinien" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Farbe" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "Breite" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "Bandbreiten Spur im Wasserfall anzeigen" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "Mittellinie" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "Cursor mit Mittellinie zeigen" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "Signalspuren" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "Notch (Kerbfilter)" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "Frequenz Skala" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "Audio Frequenzen immer anzeigen" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "Audio oder HF Frequenzen auf WF Skala" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "Wasserfall Skala Schrift wählen" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "Sendesignal" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "Sendesignal überwachen" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "Sendesignal am Wasserfall zeigen" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Signalpegel" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "Pegel für beste Sicht einstellen" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "FFT Verarbeitung" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "untere Grenze" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "Untere Grenzfrequenz in Hz" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "FFT Mittelung" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "Mittelung verwenden um WF Rauschen zu vermindern" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "FFT Vorfilter Fensterfunktion" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "Rechteck" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "Dreieck" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "obere Grenze" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "Grenzfrequenz in Hz" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "Zeige mehr oder weniger Wasserfall" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "" #: src/dialogs/confdialog.cxx:10269 #, fuzzy msgid "Normal drop speed / value" msgstr "Fallgeschwidigkeit des Wasserfalls" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "Wasserfall Höhe in Pixeln" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "CPU Auslastung steigt mit Höhe der Wasserfall Pixel" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Maus" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "Links/rechts klick ersetzt Audio Historie" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "Ziehen auf Wasserfall Skala ändert Frequenz" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "Einfügen von Text per einfachem Linksklick" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "Mausrad Aktion" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Auswählen wie sich das Mausrad\n" "innerhalb des Wasserfalls verhält" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:10374 #, fuzzy msgid "values left/below waterfall" msgstr "Eine Reihe (unter dem Wasserfall)" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10389 #, fuzzy msgid "use" msgstr "Maus" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "Modems" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "SOM Dekodierung" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "Selbstorganisierende Karte (SOM)" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "Verfolgung" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "Automatisch Rx Geschwindigkeit verfolgen" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "Filter Bandbreite" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "CW DSP Filter Bandbreite" #: src/dialogs/confdialog.cxx:10451 #, fuzzy msgid "Matched Filt'" msgstr "Angepasster Filter" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "Angepasste Filter Bandbreite" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "Unterer" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "Detektor Schwelle niedrig" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "Oberer" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "Detektor Schwelle hoch" #: src/dialogs/confdialog.cxx:10511 #, fuzzy msgid "Range" msgstr "Bereich WPM" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "Bereich +/- wpm" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "Meine Sendegeschwindikgeit WPM" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "Standard CW Geschwindigkeit" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "Nicht langsamer als dieses" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "Nicht schneller als dieses" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "Farnsworth Timing nutzen" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "Timing und QSK" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "Timing" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "Wichtung (%)" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "Flankensteilheit" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "Kantenform" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 #, fuzzy msgid "Edge decrease" msgstr "Kantenform" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10735 #, fuzzy msgid "BPF transmit audio" msgstr "CW Sendegeschwidigkeit in WPM" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "QSK im rechten Audio Kanal" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "Erzeuge ein Rechtecksignal auf dem rechten Kanal" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "Kontinuierlich senden" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "Sende einen kontinuierlichen Datenstrom an Testzeichen" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "Testzeichen" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "Testzeichen für QSK Einstellung" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "'(' nutzen nicht KN" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 #, fuzzy msgid "Ser. Port" msgstr "Port:" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 #, fuzzy msgid "Xcvr serial port" msgstr "Serieller Anschluss/Port" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 #, fuzzy msgid "Connect / Disconnect from WinKeyer" msgstr "Verbinden/Trennen von Talker Socket Server" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 #, fuzzy msgid "ModeReg" msgstr "Betriebsart" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 msgid "Enable paddle auto spacing of characters" msgstr "" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 #, fuzzy msgid "Enable contest character spacing" msgstr "Aktivieren um Datumsbereich auszuwählen" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 #, fuzzy msgid "Serial echo" msgstr "Serielles Gerät" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 #, fuzzy msgid "Tone ON" msgstr "Startzeit" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 #, fuzzy msgid "WPM Settings" msgstr "Einstellungen" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 #, fuzzy msgid "Min WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 #, fuzzy msgid "Rng WPM" msgstr "Bereich WPM" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 #, fuzzy msgid "Cmd WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 #, fuzzy msgid "Timing/Settings" msgstr "Einstellungen" #: src/dialogs/confdialog.cxx:11155 #, fuzzy msgid "Ratio" msgstr "Locator" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 #, fuzzy msgid "Sample" msgstr "Abtastrate" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 #, fuzzy msgid "Weight" msgstr "Wichtung (%)" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 #, fuzzy msgid "Bk" msgstr "Zurück" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 #, fuzzy msgid "WPM setting" msgstr "Einstellungen" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 #, fuzzy msgid "nanoIO serial port" msgstr "Serieller Anschluss/Port" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 #, fuzzy msgid "Connect / Disconnect from nanoIO" msgstr "Verbinden/Trennen von Talker Socket Server" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 #, fuzzy msgid "Status" msgstr "Staat" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 msgid "Paddle" msgstr "" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 #, fuzzy msgid "Comp'" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 #, fuzzy msgid "PTT off" msgstr "TX Offset" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "Alles aus" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "Dom" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "Sekundärer Text" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "Filterung" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "DSP Filter vor dem Dekoder nutzen" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "Filter Bandbreiten Faktor" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "Filter Bandbreite relativ zur Signal Breite" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "MultiPSK kompatible FEC einschalten" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "Pfade (verborgen)" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "Feld" #: src/dialogs/confdialog.cxx:11647 #, fuzzy msgid "Hell Transmit Parameters" msgstr "Sendeleistung" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "Sendeschriftart" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "Sende Rasterschriftart auswählen" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "Pulseform" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 #, fuzzy msgid "Range 1...3" msgstr "Verzeichnis..." #: src/dialogs/confdialog.cxx:11706 #, fuzzy msgid "Hell Receive Parameters" msgstr "Wählen der Betriebsparameter" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "Reverse Video" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "" #: src/dialogs/confdialog.cxx:11715 #, fuzzy msgid "Marquee text" msgstr "Liste löschen" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11722 #, fuzzy msgid "Range 1...4" msgstr "Verzeichnis..." #: src/dialogs/confdialog.cxx:11734 #, fuzzy msgid "Rx Height in pixels" msgstr "Wasserfall Höhe in Pixeln" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "Empfangs Filterbandbreite" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "DSP Bandbreite einstellen" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:11791 #, fuzzy msgid "Minimum # hits in tone detector" msgstr "Multi-Kanal Detektor" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 #, fuzzy msgid "Center freq" msgstr "Mittellinie" #: src/dialogs/confdialog.cxx:11867 #, fuzzy msgid "Sounder" msgstr "Soundkarte" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 #, fuzzy msgid "convert operator callsign to lower case" msgstr "Rufzeichen in Grossbuchstaben" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Time out" msgstr "Timeout" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:11892 #, fuzzy msgid "Enter QTC text" msgstr "Text einfügen" #: src/dialogs/confdialog.cxx:11898 #, fuzzy msgid "Message Logging" msgstr "Logging" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 #, fuzzy msgid "Notify time out" msgstr "Zeitlimit für Inaktivität" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "Logging" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 #, fuzzy msgid "Audit log" msgstr "Audio" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "Einschalten" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 #, fuzzy msgid "Text Colors" msgstr "Ziffernfarbe" #: src/dialogs/confdialog.cxx:11959 #, fuzzy msgid "Transmit text" msgstr "Sende Video Text" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 #, fuzzy msgid "Directed received text" msgstr "DTMF Töne dekodieren" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 #, fuzzy msgid "Undirected received text" msgstr "DTMF Töne dekodieren" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "" #: src/dialogs/confdialog.cxx:11988 #, fuzzy msgid "1/2 speed" msgstr "AFC Geschwindigkeit" #: src/dialogs/confdialog.cxx:11993 #, fuzzy msgid "1x speed" msgstr "AFC Geschwindigkeit" #: src/dialogs/confdialog.cxx:11994 #, fuzzy msgid "default" msgstr "Standard" #: src/dialogs/confdialog.cxx:11999 #, fuzzy msgid "2x speed" msgstr "AFC Geschwindigkeit" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:12011 #, fuzzy msgid "convert other callsign to lower case" msgstr "Rufzeichen in Grossbuchstaben" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "Für sehr schwache Signale einschalten" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 msgid "Manual tuning" msgstr "" #: src/dialogs/confdialog.cxx:12122 #, fuzzy msgid "Oliv" msgstr "Olivia" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "Bandbreite auswählen" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "Töne" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "Anzahl der Töne auswählen" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "Dies NUR zum experimentieren ändern" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 #, fuzzy msgid "Enable this to send start/stop tones" msgstr "Diesen Eintrag aktivieren wenn Fldigi zum ersten Mal startet" #: src/dialogs/confdialog.cxx:12227 #, fuzzy msgid "Cont" msgstr "Cont'" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "AFC Verhalten" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "Signale über diesem Schwellwert erfassen" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "S/N und IMD Verhalten" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "nach" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "Verhalten von s/n imd" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "Dim" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "Sekunden" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "Wird nach dieser Zeit in Sek passieren" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "Multikanal Signal Verarbeitung" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "Multi-Kanal Detektor" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" "Auf sehr langsamen CPUs ausschalten, falls Signal Browser nicht benutzt wird" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12439 #, fuzzy msgid "Pilot tone power relative to signal" msgstr "Filter Bandbreite relativ zur Signal Breite" #: src/dialogs/confdialog.cxx:12458 #, fuzzy msgid "Short Preamble" msgstr "Video Präambel ID" #: src/dialogs/confdialog.cxx:12459 msgid "Enable short preamble for 8PSK transmission" msgstr "" #: src/dialogs/confdialog.cxx:12472 #, fuzzy msgid "TTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "AFC Geschwindigkeit" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "AFC Tracking Geschwindigkeit" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "Filter Formfaktor" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "rcos timing Koeffizient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "RTTY Osztilloskop Anzeige" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "Fadenkreuz verwenden" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "Standard Fadenkreuz" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "XY - Klassisches Scope" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:12555 msgid "Log RTTY frequency" msgstr "RTTY Frequenz loggen" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:12566 msgid "track color" msgstr "Spurfarbe" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "Farbe der Markierungsspur" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:12580 #, fuzzy msgid "Sound Card FSK" msgstr "Soundkarte" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "Trägerverschiebung" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "Trägerverschiebung wählen" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "Benutzerdefinierte Verschiebung" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "Eingang Träger Verschiebung" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "Baudrate" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "Träber Baudrate wählen" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "Bits pro Zeichen" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "Auswählen # bits / Zeichen" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "Parität" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "Parität auswählen" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "Stopbits" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "Stopbits # wählen" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "Automatisch CRLF" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "CRLF nach jeder Seitebreite einfügen" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "Zeichen" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "Auto CRLF Leitungslänge" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Verwende \"cr cr lf\" für \"cr lf\"" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:12728 msgid "Pseudo-FSK - right channel" msgstr "Pseudeo FSK - rechter Kanal" #: src/dialogs/confdialog.cxx:12729 msgid "Create keyed square wave on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:12736 #, fuzzy msgid "Transceiver FSK" msgstr "Transceiver Steuerung" #: src/dialogs/confdialog.cxx:12739 msgid "Mark" msgstr "" #: src/dialogs/confdialog.cxx:12740 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Frequenz in MHz" #: src/dialogs/confdialog.cxx:12751 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Trägerverschiebung" #: src/dialogs/confdialog.cxx:12766 #, fuzzy msgid "LTRS at start" msgstr "Start" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 #, fuzzy msgid "FSK Interface" msgstr "GUI" #: src/dialogs/confdialog.cxx:12847 #, fuzzy msgid "Navigator serial port" msgstr "Serieller Anschluss/Port" #: src/dialogs/confdialog.cxx:12861 #, fuzzy msgid "FSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12862 #, fuzzy msgid "Connect / Disconnect from Nav FSK port" msgstr "Verbinden/Trennen von Talker Socket Server" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 #, fuzzy msgid "Navigator configuration port" msgstr "Fldigi Konfiguration" #: src/dialogs/confdialog.cxx:12885 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Kanal Nummer" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 #, fuzzy msgid "Channel 2 attenuator" msgstr "Kanal Nummer" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 msgid "RF attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12918 msgid "NavRF Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 #, fuzzy msgid "Nav FSK baud rate" msgstr "Baud rate des seriellen ports" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Stopbits" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 #, fuzzy msgid "Mark Polarity" msgstr "Parität" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 #, fuzzy msgid "Config" msgstr "Bestätigung" #: src/dialogs/confdialog.cxx:13062 #, fuzzy msgid "Connect / Disconnect from Nav Config port" msgstr "Verbinden/Trennen von Talker Socket Server" #: src/dialogs/confdialog.cxx:13069 msgid "Synop" msgstr "" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 #, fuzzy msgid "Serial Interface" msgstr "GUI" #: src/dialogs/confdialog.cxx:13158 #, fuzzy msgid "FSK port" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:13206 #, fuzzy msgid "Auto CRLF" msgstr "Automatisch CRLF" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 #, fuzzy msgid "Diddle char" msgstr "Testzeichen" #: src/dialogs/confdialog.cxx:13239 #, fuzzy msgid "Diddle character" msgstr "Bits pro Zeichen" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 msgid "Unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "DSP vor dem Dekoder aktivieren" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "Präamble Erkennung/Detektion" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:13402 #, fuzzy msgid "Nav" msgstr "Wav" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "Navtex Nachrichten nach ADIF loggen" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "Navtex Nachrichten nach KML loggen" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "Wetterfax Nachrichten nach ADIF loggen" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "Gesendete und empfangene faxe nach ADIF loggen" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "Eingebetteter Wefax GUI" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "Anzeige von TX und RX im Fldigi Hauptfenster\n" "Wird nach Neustart aktiv" #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "Frequenzverschiebung (800 Hz)" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "Standard 800 Hz. Deutscher Wetterdienst 850Hz" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "Verzeichnis für Fax Bilder" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "Verzeichnis" #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "Sendefenster verbergen" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "Sendefenster verbergen als Standard" #: src/dialogs/confdialog.cxx:13475 msgid "Save image as monochrome file" msgstr "Bilder monochrome (einfarbig) speichern" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "Fax Bilder als Graustufen PNG Datei speichern" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "Radio" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 #, fuzzy msgid "flrig" msgstr "flrig:" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 #, fuzzy msgid "Addr" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "Erneut Verbinden" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "RigCAT nutzen" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "RigCAT wird für Radio Steuerung verwendet" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "Radio Konfigurations Datei:" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "Öffnen um Beschreibungsdatei zu verwenden" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "Radio Beschreibungsdatei auswählen" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Gerät:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "Wiederholungen" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "# Wiederholungen bevor ich aufgebe ;)" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "Wiederholungs Intervall (ms)" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "Zeit zwischen Wiederholungen in msek" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "Schreibvzg (ms)" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "Baud Rate:" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "Stopbits" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "Initialisieren" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "RigCAT Interface initialisieren" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "Echo Kommando" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "CAT Kommando für PTT" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "PTT ist CAT Kommando (kein Hardware)" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "RTS is PTT Anschluss" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "DTR ist PTT Anschluss" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "RTS +12 V" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "DTR +12V" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "RTS/CTS Flusskontrolle" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "Radio verwendet RTS/CTS Handshake" #: src/dialogs/confdialog.cxx:13735 #, fuzzy msgid "Restore UART Settings on Close" msgstr "Wiederherstellen der Einstellungen bei beenden" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "Zurücksetzen der seriellen (COM) Port-Einstellungen" #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "VSP" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Virtueller Seriell Port Emulator - unterdrückt Warnmeldungen" #: src/dialogs/confdialog.cxx:13747 #, fuzzy msgid "Init delay (ms)" msgstr "Schreibvzg (ms)" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "Hamlib benutzen" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "Hamlib zur Radio Steuerung verwendet" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "# Versuche das Kommando erneut zu senden, dann Aufgabe" #: src/dialogs/confdialog.cxx:13823 #, fuzzy msgid "Retry Interval (msec)" msgstr "Wiederholungsintervall (ms)" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "msek zwischen einem erneuten Versuch" #: src/dialogs/confdialog.cxx:13840 #, fuzzy msgid "Write delay (msec)" msgstr "Schreibvzg (ms)" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:13857 #, fuzzy msgid "Post write delay (msec)" msgstr "Schreibvzg (ms)" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:13909 #, fuzzy msgid "Polling Interval (msec)" msgstr "Wiederholungsintervall (ms)" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT via Hamlib Kommando" #: src/dialogs/confdialog.cxx:13929 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT ist ein Hamlib Kommando" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "RST +12" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "Radio erfordert RTS/CTS Ablaufsteuerung" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "XON/XOFF Ablaufsteuerung" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "Radio erfordert Xon/Xoff Ablaufsteuerung" #: src/dialogs/confdialog.cxx:13965 #, fuzzy msgid "CW is LSB mode" msgstr "CW ist LSB" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:13977 #, fuzzy msgid "Mode delay (msec)" msgstr "Schreibvzg (ms)" #: src/dialogs/confdialog.cxx:13978 #, fuzzy msgid "Delay NN msec after executing mode change" msgstr "NN msek Verzögerung bevor Audio Start" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "Seitenband:" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "Fortgeschrittene Konfiguration" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Optionale Konfiguration\n" "im Format: Parameter=wert ..." #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "Hamlib Interface initialisieren" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "Hardware PTT" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "PTT Ton auf dem rechten Audio Kanal" #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Kann anstelle oder zusätzlich zu anderen PTT Typen verwendet werden" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "H/W PTT Geräte Pin" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "Separaten seriellen Port für PTT" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "Parallel Port für PTT nutzen" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "RTS nutzen" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "RTS ist PTT Signal Anschluss" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "Anfängliche Spanung an RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "DTR nutzen" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "DTR ist PTT Signal Anschluss" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "Anfängliche Spannung an DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "Hardware PTT initialisieren" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "PTT Verzögerung gilt für alle CAT/PTT Typen" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "Start der PTT Übertragungsverzögung" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "NN msek Verzögerung bevor Audio Start" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "PTT Ende Sendeverzögerung" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 #, fuzzy msgid "Select pin number" msgstr "Linie auswählen" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 #, fuzzy msgid "Select PTT on state" msgstr "Linie auswählen" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "Geräte" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "OSS Audio Server verwenden" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "Gerät auswählen" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "PortAudio Server verwenden" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "Aufnahme:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "Audioeingabegerät" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "Wiedergabe:" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "Audioausgabegerät" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "PulseAudio Server verwenden" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "Server String" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Bitte freilassen, oder \n" "http://www.pulseaudio.org/wiki/ServerStrings lesen" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "Nur Datei Ein/Ausgabe" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "KEIN AUDIO GERÄT VERFÜGBAR (oder testen)" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "Einstellungen" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "Abtastrate" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "Aufnahme" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "Konverter" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "Korrekturen" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "RX Soundkarten Korrektur" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "TX Soundkarten Korrektur" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "TX Offset" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Unterschied zwischen Rx && Tx Frequenz (rig Offset)" #: src/dialogs/confdialog.cxx:14605 msgid "Right channel" msgstr "Rechter Kanal" #: src/dialogs/confdialog.cxx:14607 #, fuzzy msgid "Transmit Usage" msgstr "Sendesignal" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "Modem Signal auf dem linken und rechten Kanal" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "Linker und rechter Kanal enthalten Modem Audio" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "Linken/rechten Kanal vertauschen" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 msgid "Software reversal of left-right audio channels" msgstr "Software umkehrung der Audio Kanäle rechts/links" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Diese Einstellungen lassen sich auch\n" "auf anderen Registerkarten ändern\n" "sie wurden der Einfachheit halber auch hier aufgeführt\n" "..." #: src/dialogs/confdialog.cxx:14627 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "1000 Hz Ton falls PTT eingeschaltet\n" "Kann anstelle oder zusätzlich zu anderen PTT Typen verwendet werden" #: src/dialogs/confdialog.cxx:14633 msgid "CW QSK signal on right channel" msgstr "CW QSK Signal auf dem rechten Kanal" #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Erzeuge 1000 Hz Rechtecksignal auf dem rechten Kanal" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo FSK auf dem rechten Audio Kanal" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "1000 Hz Rechtecksignal auf dem rechten Kanal erzeugen" #: src/dialogs/confdialog.cxx:14649 #, fuzzy msgid "Receive Usage" msgstr "Empfangen" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "Wav" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "Wav Abtastrate beim schreiben" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "Baudrate aus Liste auswählen" #: src/dialogs/confdialog.cxx:14681 #, fuzzy msgid "Record both channels" msgstr "Linken/rechten Kanal vertauschen" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "" #: src/dialogs/confdialog.cxx:14692 #, fuzzy msgid "Regex Match in Browser" msgstr "Browser" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 #, fuzzy msgid "Sound:" msgstr "Soundkarte" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 msgid "Test" msgstr "Test" #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 #, fuzzy msgid "flmsg interface" msgstr "GUI" #: src/dialogs/confdialog.cxx:14753 #, fuzzy msgid "flmsg received wav" msgstr "RST empfangen" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "RsID detection" msgstr "RSID Empfang" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "Nur Benachrichtigen" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Diese Option aktivieren um bei RSID Empfang benachrichtigt zu werden\n" "ohne Betriebsart und Frequenz zu ändern" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "Rx Betriebsarten" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "Durchlassbereich durchsuchen" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "Detektor ausschalten" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "Falls RSID aktiviert, weitere Erkennung ausschalten" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "Fehler erlauben" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Gering = 0 Fehler\n" "Mittel = 1 Fehler\n" "Hoch = 2 Fehler" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "Medium" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "Rauschsperre offen (s)" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "Rauschsperre öffnen für nn sek falls RSID erkannt wurde" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "Warnmeldungen ausschalten" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "RsID Warnmeldung nicht anzeigen" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14929 #, fuzzy msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" "Die RsID Benachrichtigung, deren Inhalte und\n" "Anzeige werden konfiguriert unter \"Mitteilungen\"." #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "Sekunden" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "Verwenden um eine PA anzusteuern" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "Sendebetriebsarten" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "Ende der xmt ID" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "RsID Signal an Ende der Übertragung anhängen" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "Video" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "Video Präambel ID" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "Sendebetriebsarten ID" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "Wasserfall Video ID" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "Sende Video Text" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "Wasserfall Video Text" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Beschränkt auf ein paar Zeichen,\n" "wie in CQEM oder IOTA etc." #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "Kleine Schriftart" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "EIN - kleine Schrift\n" "AUS - grosse Schrift" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "Zeichen/Reihe" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "Setzen Sie die Anzahl der Zeichen pro Zeile" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "500 Hz Limit" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "Betriebs Bandbreiten Begrenzung" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "Video ID Modi" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "CW Postamble ID" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "Rufzeichen übertragen (senden)" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "Rufzeichen in CW am Ende jeder Übertragung senden" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "Geschwindigkeit (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "Mit dieser Geschwindigkeit senden" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "CW ID Modi" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Diverses" #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "Langsame CPU (weniger als 700MHz)" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "Einschalten, falls der PC nicht sauber dekodiert" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "NBEMS Datendatei Schnittstelle" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" "Dateien extrahieren um sie mit externem Programm \"wrap / flmsg zu nutzen" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "Nachrichten Ordner öffnen" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "Öffnet NBEMS Dateiordner nach erfolgreichem Empfang" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "Empfang von flmsg Dateien" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "Mit flmsg öffnen" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "Nachricht mit flmsg öffnen" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "Im Browser öffnen" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "Datei mit dem Standard Browser öffnen" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "flmsg finden" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "Timeout (sek)" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "Mail Server Merkmale" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "Trägerfrequenz (Hz)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "Standard Empfangs / Sende Frequenz" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "Suchbereich (Hz)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "Auf Signale aus diesem Bereich hören" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "AFC Bereich (Hz)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "Zurücksetzen auf Träger" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "Wenn kein Signal vorliegt" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "Automatisch Rufzeichen in decodiertem Text suchen" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "Eingehenden Text auswerten" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "Empfangsbericht nur senden wenn QSO geloggt wurde" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "Sendebericht nur wenn QSO geloggt wurde" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Berichte Radio Frequenz (bitte nur benutzen wenn Sie Rigcontrol haben!)" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "Sendefrequenz hinzufügen" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Spotting nur aktivieren, wenn Signale im Browser sichtbar sind." #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Aktivieren um CPU Last bei RTTY und PSK zu reduzieren" #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "Server zu welchem die Verbindung hergestellt wird" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "Verwende UDP Port #" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "Socket Client initialisieren" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "Standard CW Tracking Punkt" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "Standard RTTY Tracking Punkt" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "PSK und andere" #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "Standard für alle anderen Modems" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "Neue Modems (Betriebsarten) immer bei diesen Frequenzen beginnen" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "EIN - mit Standard beginnen\n" "AUS - halte aktuelle WF Cursor Position" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "K3 A1A Konfiguation" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "CW ist LSB" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Dies nur wählen für Elecraft K3\n" "Andere Radios benötigen dies nicht." #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "Text I/O" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "Talker Socket (nur Windows)" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "Verbinden/Trennen von Talker Socket Server" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Automatisch verbinden, wenn Fldigi startet (der Server muss ereichbar sein)" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "Empfangenen Text in eine Datei schreiben" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "DTMF Töne dekodieren" #: src/dialogs/confdialog.cxx:15494 #, fuzzy msgid "Decode received DTMF tones" msgstr "DTMF Töne dekodieren" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "Vollständiger Bericht" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:15524 msgid "Conditions" msgstr "Bedingungen" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "Aktuelle Wetter Bedingungen" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "Melde Fahrenheit" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "Celsius" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "Melde Celsius" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "Meilen pro Stunde" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "Melde Meilen pro Stunde" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "Kilometer pro Stunde" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "Melde Kilometer pro Stunde" #: src/dialogs/confdialog.cxx:15554 msgid "Inches Hg." msgstr "" #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "mbar" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "Millibar berichten" #: src/dialogs/confdialog.cxx:15566 msgid "Temperature" msgstr "Temperatur" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "Wind geschw/ Richtung" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "Luftdruck" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "Suche im Internet" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "Default URL" msgstr "Standard" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "KML Datei Verzeichnis" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "Wo sollen generierte KML Dateien gespeichert werden" #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "KML Wurzel Dateisystem" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "KML Auffrisch Intervall (sekunden)" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:15658 msgid "Command run on KML creation" msgstr "Kommando zur KML File Erstellung" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "Test Kommando" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "Befehl auf KML Datei anwenden" #: src/dialogs/confdialog.cxx:15669 msgid "Change dir..." msgstr "Verzeichnis..." #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "Verzeichnis wählen in dem die KML Dateien gespeichert werden sollen" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "KML Daten jetzt aufräumen" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "KML Dokumente aufräumen, Google Earth Anzeige löschen" #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "Löschen bei Programmstart" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "Bei Programmstart KML Datein leeren" #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "Web" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "Rufzeichen nachschlagen" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "Via Web Browser nachschlagen" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "Rufzeichen Lookup via Web Browser nicht verwenden" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "RTS is PTT Anschluss" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "QRZ Webseite besuchen" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "Hamcall Webseite besuchen" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "HamQTH Webseite besuchen" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:15750 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15763 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15776 #, fuzzy msgid "Callook" msgstr "Rufzeichen nachschlagen" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "In Datenbank nachschlagen" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "Rufzeichen Datenbank nicht verwenden" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "QRZ CDROM" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "CDROM oder Festplatte verwenden" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Sie benötigen einen kostenpflichtigen QRZ online\n" "Zugang um diesen Service zu nutzen" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Sie benötigen ein kostenpflichtiges Hamcall online\n" "Abonnement um diesen Service nutzen zu können" #: src/dialogs/confdialog.cxx:15820 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "Kostenloser Service mit freundlicher Genehmigung von OK" #: src/dialogs/confdialog.cxx:15826 #, fuzzy msgid "Callook.info" msgstr "Rufzeichen nachschlagen" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Callbook.info Abfrage (Kostenloser Service nur für US Rufzeichen)" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "z.B.: /home/dave/CALLBK/ or C:/CALLBK/\n" "Freilassen um nach Datenbank zu suchen" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "Benutzername" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "Passwort" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "Passwort im Klartext anzeigen" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "eQSL" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "Ihr Anmeldename" #: src/dialogs/confdialog.cxx:15917 msgid "User ID" msgstr "Benutzer ID" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "Ihr Anmelde Passwort" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "QTH Spitzname" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:15971 msgid "Options" msgstr "Optionen" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "Senden wenn im Log (log Button, , )" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "Automatischer Daten upload" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "Datum/Zeit off für Logeintrag nutzen" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "Standard nutzt Datum/Zeit an" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Weniger Betriebsarten anzeigen" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 msgid "Default message" msgstr "Standard Nachricht" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "Standard Text der mit dem Makro gesendet wird" #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:16010 #, fuzzy msgid " {CALL} other ops call sign" msgstr "{CALL} Rufzeichen des anderen OM" #: src/dialogs/confdialog.cxx:16013 #, fuzzy msgid " {MODE} full mode / submode" msgstr "{MODE} Hauptmodus / Untermodus" #: src/dialogs/confdialog.cxx:16016 msgid "{NAME} other ops name" msgstr "{NAME} Name des anderen OM" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:16030 #, fuzzy msgid "Enter full path-filename for tqsl executable" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:16044 #, fuzzy msgid "Your tqsl login password" msgstr "Ihr Anmelde Passwort" #: src/dialogs/confdialog.cxx:16059 #, fuzzy msgid "Use password for tqsl access" msgstr "Passwort" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:16065 #, fuzzy msgid "Location" msgstr "Locator" #: src/dialogs/confdialog.cxx:16066 msgid "tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 msgid "Locate" msgstr "finden" #: src/dialogs/confdialog.cxx:16081 #, fuzzy msgid "Locate tqsl executable" msgstr "Ausführbare Datei finden" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:16096 #, fuzzy msgid "Export" msgstr "Exportieren..." #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 #, fuzzy msgid "Check" msgstr "Alles überprüfen" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16108 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:16125 msgid "Use this tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "Folgende Programme automatisch mit Fldigi starten" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:16160 #, fuzzy msgid "Enter full path-filename for flrig" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "Flrig.exe Datei finden" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16178 #, fuzzy msgid "Enter full path-filename for flamp" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "flamp.exe Datei finden" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16196 #, fuzzy msgid "Enter full path-filename for flnet" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "flnet.exe Datei finden" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16214 #, fuzzy msgid "Enter full path-filename for fllog" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "fllog.exe Datei finden" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 #, fuzzy msgid "Enter full path-filename for external program" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "Programmdatei #1 finden" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "Programmdatei #2 finden" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "Programmdatei #3 finden" #: src/dialogs/confdialog.cxx:16285 msgid "" "Enable\n" "-" msgstr "" "Einschalten\n" "-" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "Diesen Eintrag aktivieren wenn Fldigi zum ersten Mal startet" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "Start flrig" #: src/dialogs/confdialog.cxx:16333 msgid "Start flamp" msgstr "Start flamp" #: src/dialogs/confdialog.cxx:16337 msgid "Start flnet" msgstr "Start flnet" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "Start fllog" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "Start prog1" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "Start prog2" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "Start prog3" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "" #: src/dialogs/confdialog.cxx:16372 #, fuzzy msgid "Enable ARQ" msgstr "Einschalten" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "" #: src/dialogs/confdialog.cxx:16380 #, fuzzy msgid "Enable KISS" msgstr "Einschalten" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "" #: src/dialogs/confdialog.cxx:16388 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "Restart" msgstr "Start" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "Start" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16564 #, fuzzy msgid "XML" msgstr "KML" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16659 #, fuzzy msgid "fllog" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16697 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" #: src/dialogs/confdialog.cxx:16707 #, fuzzy msgid "Enable Busy Channel" msgstr "Alles ein" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16726 #, fuzzy msgid "Modem Bandwidth Margins " msgstr "Betriebs Bandbreiten Begrenzung" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16753 #, fuzzy msgid "Enable CSMA" msgstr "Einschalten" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 #, fuzzy msgid "Slot Time" msgstr "Uhrzeit" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16781 #, fuzzy msgid "Transmit Data Delay" msgstr "Sendesignal" #: src/dialogs/confdialog.cxx:16782 #, fuzzy msgid "Idle transmit before data sent" msgstr "Sendefrequenz hinzufügen" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 #, fuzzy msgid "MilliSeconds" msgstr "Sekunden" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16809 #, fuzzy msgid "Enable Histogram" msgstr "Alles ein" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16831 msgid "PSM Attenuate" msgstr "" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16845 #, fuzzy msgid "Default Settings" msgstr "" "Standard Testreihe ist:\n" " \"" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "Std wiederherstellen" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Schriftfarbe" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Schrift:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Größe:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&Okay" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Schriftarten einlesen ..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Quelle für Datendatei" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Datendatei update" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Datenquellen und Tabellen" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Daten Quelle" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Verzeichnis für Daten" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Ereignis" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Eingeschaltet" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filter" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "DXCC Datensätze" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Zeige DXCC Datensätze" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Noch nicht zuvor gearbeitet" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "LoTW Benutzer" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "eQSL Benutzer" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplikate" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Duplikate ignorieren" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "Eingang:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Zeit (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Aktion" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Triggerschwelle (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Minimale Zeit zwischen Ereignissen" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Zeige Alarm Fenster" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Standard Text einfügen" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Fenster nach (s) verbergen:" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "RX Text anhängen" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "TX Text anhängen" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Makro Editor anzeigen" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Programm starten:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "DXCC Datensätze" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Land finden" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Eingabetaste drücken um weiter zu suchen" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Prefix finden:" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "Export Setup" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "Wählen Sie die zu exportierenden Datensätze" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "Alles überprüfen" #: src/logbook/lgbook.cxx:622 msgid "Start Date" msgstr "Startdatum" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "Startdatum für den Export" #: src/logbook/lgbook.cxx:636 msgid "Stop Date" msgstr "Stoppdatum" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "Inclusive Stoppdatum für den Export" #: src/logbook/lgbook.cxx:650 msgid "select by date" msgstr "Auswahl nach Datum" #: src/logbook/lgbook.cxx:651 #, fuzzy msgid "Enable to select date range" msgstr "Aktivieren um Datumsbereich auszuwählen" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "Zu exportierende Felder wählen" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "Freq" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "QSO Datum Start" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "QSO Datum Ende" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "Startzeit" #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "Endzeit" #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "Sendeleistung" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "RST gesendet" #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "RST empfangen" #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 #, fuzzy msgid "Station Call" msgstr "Station" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 #, fuzzy msgid "Station QTH" msgstr "Station" #: src/logbook/lgbook.cxx:723 #, fuzzy msgid "Station LOC" msgstr "Station" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Bemerkungen" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "QSL Empfangsdatum" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "QSL Sendedatum" #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "QSL Empfangsdatum" #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "QSL Sendedatum" #: src/logbook/lgbook.cxx:750 #, fuzzy msgid "LoTW rcvd date" msgstr "QSL Empfangsdatum" #: src/logbook/lgbook.cxx:753 #, fuzzy msgid "LoTW sent date" msgstr "QSL Sendedatum" #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "Seriennummer # eingehend" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "Seriennummer # ausgehend" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "Exchange Out" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:795 #, fuzzy msgid "FD section" msgstr "RSID Empfang" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 #, fuzzy msgid "CW SS Check" msgstr "Alles überprüfen" #: src/logbook/lgbook.cxx:809 #, fuzzy msgid "CW SS Section" msgstr "Aktion" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "Logbuch" #: src/logbook/lgbook.cxx:840 msgid "Date On" msgstr "Datum an" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "Startdatum QSO" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "Startzeit" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "Startzeit QSO" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "Rufzeichen bereits gearbeitet" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "Operator gearbeitet" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "Ein" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "RST empfangen" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "Einträge" #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "# Einträge im Logbuch" #: src/logbook/lgbook.cxx:913 msgid "Date Off" msgstr "Datum off" #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "Datum wann QSO beeendet" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "Endzeit" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "QSO beendet um" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "Frequenz" #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "Frequenz in MHz" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "Verwendete Betriebsart" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "Pwr" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "Verwendete Sendeleistung" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "Locator" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "Grid Square (Planquadrat) der Station" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "Aus" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "RST gesendet" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "Heimatstadt der gearbeiteten Station" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "US Bundesstaat der gearbeiteten Station" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "Provinz der gearbeiteten Station" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "Land der gearbeiteten Station" #: src/logbook/lgbook.cxx:1048 #, fuzzy msgid "QSL" msgstr "eQSL" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "QSL empfangen" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "QSL bekommen an diesem Tag" #: src/logbook/lgbook.cxx:1062 #, fuzzy msgid "EQSL-rcvd" msgstr "QSL empfangen" #: src/logbook/lgbook.cxx:1075 #, fuzzy msgid "LOTW-rcvd" msgstr "QSL empfangen" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "QSL gesendet" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "QSL gesendet an diesem Tag" #: src/logbook/lgbook.cxx:1101 #, fuzzy msgid "EQSL-sent" msgstr "QSL gesendet" #: src/logbook/lgbook.cxx:1114 #, fuzzy msgid "LOTW-sent" msgstr "QSL gesendet" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "Islands on the air (IOTA)" #: src/logbook/lgbook.cxx:1181 msgid "Cont'" msgstr "Cont'" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "DXCC Bezeichner" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "Interessante Hinweise" #: src/logbook/lgbook.cxx:1236 #, fuzzy msgid "My Station" msgstr "Station" #: src/logbook/lgbook.cxx:1274 #, fuzzy msgid "Station Locator" msgstr "Station zweimal gehört" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "SNummer aus" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 #, fuzzy msgid "Contest seral # sent" msgstr "Contest Seriennummer # gesendet" #: src/logbook/lgbook.cxx:1302 #, fuzzy msgid "Exch Out" msgstr "Exchange Out" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "Contest Austausch Information gesendet" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "SNummer ein" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "Contest Seriennummer # empfangen" #: src/logbook/lgbook.cxx:1326 #, fuzzy msgid "Exch In" msgstr "Exchange In" #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "Contest Austausch Information erhalten" #: src/logbook/lgbook.cxx:1339 #, fuzzy msgid "Field Day class received" msgstr "Mausrad Aktion" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 #, fuzzy msgid "Field Section received" msgstr "Mausrad Aktion" #: src/logbook/lgbook.cxx:1363 #, fuzzy msgid "Operators age received" msgstr "Name des Benutzers" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 #, fuzzy msgid "Operating band" msgstr "Benutzer" #: src/logbook/lgbook.cxx:1399 #, fuzzy msgid "Check value received" msgstr "Contest Austausch Information erhalten" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 #, fuzzy msgid "Ser NoR" msgstr "SNummer aus" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 #, fuzzy msgid "Sent troop number" msgstr "Linie auswählen" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 #, fuzzy msgid "Received troop number" msgstr "Empfangene Seriennummer" #: src/logbook/lgbook.cxx:1492 #, fuzzy msgid "Name-S" msgstr "Name" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 #, fuzzy msgid "Name-R" msgstr "Name" #: src/logbook/lgbook.cxx:1505 #, fuzzy msgid "Received scout name" msgstr "Empfangen" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "Rufzeichen Suche" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "Suche nach diesem Rufzeichen" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "Finde vorheriges" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "Finde nächstes" #: src/logbook/lgbook.cxx:1549 #, fuzzy msgid "Retrieve" msgstr "Wiederholungen" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "Abrufen für aktive Modem Nutzung" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "Neuer Eintrag / Eintrag speichern " #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "Aktuellen Eintrag aktualisieren" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "Aktuellen Eintrag löschen" #: src/logbook/lgbook.cxx:1583 #, fuzzy msgid "File:" msgstr "Datei" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "Datum" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "Uhrzeit" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "Cabrillo Einstellungen" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "Cabrillo Contest && Felder auswählen" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "QSO Datum" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Radio Steuerung via externem\n" #~ "Programm über xmlrpc\n" #~ "remote calls" #~ msgid "Use XML-RPC program" #~ msgstr "XML-RPC Programm verwenden" #~ msgid "Experimental" #~ msgstr "Experimentell" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "XML-RPC Radio Steuerung initialisieren" #~ msgid "Enter a CALL !" #~ msgstr "Bitte Rufzeichen eingeben!" #~ msgid "Add current frequency" #~ msgstr "Aktuelle Frequenz hinzufügen" #~ msgid "Clear list" #~ msgstr "Liste löschen" #~ msgid "Delete from list" #~ msgstr "Aus Liste löschen" #~ msgid "Select operating parameters" #~ msgstr "Wählen der Betriebsparameter" #, fuzzy #~ msgid "Frq" #~ msgstr "Freq" #~ msgid "frequency kHz" #~ msgstr "Frequenz kHz" #~ msgid "On" #~ msgstr "On" #~ msgid "Press to update QSO start time" #~ msgstr "Klick um QSO Startzeit zu aktualisieren" #~ msgid "Off" #~ msgstr "Aus" #~ msgid "QSO end time" #~ msgstr "QSO Beendet" #~ msgid "call sign" #~ msgstr "Call" #~ msgid "Op" #~ msgstr "Op" #~ msgid "Azimuth" #~ msgstr "Azimuth" #, fuzzy #~ msgid "QTH City" #~ msgstr "Stadt" #~ msgid "US State" #~ msgstr "US Bundesstaat" #~ msgid "Can. Province" #~ msgstr "Kanadische Provinz" #~ msgid "Maidenhead Locator" #~ msgstr "Maidenhead Locator" #~ msgid "Sent serial number (read only)" #~ msgstr "Sende Fortlaufende Nummer Contest (nur lesen)" #, fuzzy #~ msgid "Received FD class" #~ msgstr "Empfangenes RST" #, fuzzy #~ msgid "Received FD section" #~ msgstr "Empfangene Seriennummer" #, fuzzy #~ msgid "Received CQ zone" #~ msgstr "Rx Betriebsarten" #, fuzzy #~ msgid "Received State/Prov" #~ msgstr "Empfangenes RST" #, fuzzy #~ msgid "Received serno" #~ msgstr "Empfangen" #, fuzzy #~ msgid "SS Check" #~ msgstr "Alles überprüfen" #, fuzzy #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "Klick links - Auswählen\n" #~ "Klick rechts - Zeile löschen" #~ msgid "Press to update" #~ msgstr "Klicken für update" #~ msgid "Other call" #~ msgstr "anderes Rufzeichen" #~ msgid "Received RST" #~ msgstr "Empfangenes RST" #~ msgid "Sent RST" #~ msgstr "Gesendetes RST" #~ msgid "Nm" #~ msgstr "Nm" #~ msgid "Other name" #~ msgstr "Anderer Name" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Klick links - Ausführen\n" #~ "Fkey - Ausführen\n" #~ "Klick rechts - Editieren" #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Links Klick - ausführen\n" #~ "Shift-Fkey - ausführen\n" #~ "Rechts Klick - editieren" #~ msgid "Shift-key macro set" #~ msgstr "Shift-Taste Makro setzen" #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "Klick links - Auswählen\n" #~ "Klick rechts - Zeile löschen" #~ msgid "seek - regular expression" #~ msgstr "Suche - regulärer Ausdruck" #, fuzzy #~ msgid "Select FSQ station" #~ msgstr "Linie auswählen" #, fuzzy #~ msgid "Stations Heard" #~ msgstr "Station zweimal gehört" #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Klick links - Ausführen\n" #~ "Fkey - Ausführen\n" #~ "Klick rechts - Editieren" #~ msgid "Primary macro set" #~ msgstr "Primäres Makro aktivieren" #~ msgid "Aborted" #~ msgstr "Abbruch" #~ msgid "Timed out" #~ msgstr "Timeout" #~ msgid "Serial number" #~ msgstr "Seriennummer" #, fuzzy #~ msgid "Contest Exchanges" #~ msgstr "Contest Austausch Information gesendet" #, fuzzy #~ msgid "Send Xchg" #~ msgstr "Bild senden" #, fuzzy #~ msgid "Contest Logging" #~ msgstr "Contest Austausch In" #, fuzzy #~ msgid "Generic" #~ msgstr "Allgemein" #, fuzzy #~ msgid "Use generic contest fields" #~ msgstr "&Contest Felder" #, fuzzy #~ msgid "Use Field Day Contest Fields" #~ msgstr "Cabrillo Contest && Felder auswählen" #, fuzzy #~ msgid "CQWW RTTY" #~ msgstr "RTTY" #, fuzzy #~ msgid "Single-click to capture Rx word" #~ msgstr "Doppelklicken, um zu erfassen" #~ msgid "Slow (4 msec)" #~ msgstr "Langsam (4 msek)" #~ msgid "Fast (2 msec)" #~ msgstr "Schnell (2 msek)" #~ msgid "HamQTH.com (free service http://www.hamqth.com)" #~ msgstr "HamQTH.com (freier Service http://www.hamqth.com)" #~ msgid "at:" #~ msgstr "at:" #~ msgid "Test Signal - Do NOT use with transmitter" #~ msgstr "Test Signal - nicht mit Tranceiver verwenden" #~ msgid "dB" #~ msgstr "dB" #~ msgid "Noise on" #~ msgstr "Rauschen einschalten" #, fuzzy #~ msgid "freq-offset" #~ msgstr "TX Offset" #~ msgid "FFT filter" #~ msgstr "FFT Filter" #~ msgid "FFT / FIR filter" #~ msgstr "FFT / FIR Filter" #~ msgid "\tLDT in iso-8601 format" #~ msgstr "\tLDT im ISO-8601 Format" #~ msgid "\tLocal datetime" #~ msgstr "\tLokales Datum/Uhrzeit" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT im ISO-8601 Format" #~ msgid "\tUTC datetime" #~ msgstr "\tUTC Datum und Zeit" #~ msgid "Operator information" #~ msgstr "Benutzer Informationen" #, fuzzy #~ msgid "User Interface - Browser" #~ msgstr "GUI" #, fuzzy #~ msgid "User Interface - General" #~ msgstr "GUI" #, fuzzy #~ msgid "User Interface - Colors / Fonts" #~ msgstr "GUI" #, fuzzy #~ msgid "User Interface - Contest" #~ msgstr "GUI" #, fuzzy #~ msgid "User Interface - Macros" #~ msgstr "GUI" #, fuzzy #~ msgid "User Interface - Waterfall controls" #~ msgstr "Wasserfall Einstellungen" #~ msgid "Rig Control using xml spec file" #~ msgstr "Radio Steuerung via xml Spec Datei" #~ msgid "Audio devices" #~ msgstr "Audio Geräte" #~ msgid "Callsign database" #~ msgstr "Rufzeichen Datenbank" #, fuzzy #~ msgid "Program to Program Communications" #~ msgstr "Prompt Konfiguration speichern" #~ msgid "Callsign:" #~ msgstr "Rufzeichen:" #~ msgid "Name:" #~ msgstr "Name:" #~ msgid "QTH:" #~ msgstr "QTH:" #~ msgid "Transmit width" #~ msgstr "Übertragungsbreite" #~ msgid "Halve receive width" #~ msgstr "Halbierte Empfangsbreite" #~ msgid "Revert" #~ msgstr "Zurücksetzen" #~ msgid "Reset rigCAT interface" #~ msgstr "RigCAT Interface zurücksetzen" #~ msgid "Reset hamlib interface" #~ msgstr "Hamlib Interface zurücksetzen" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Seriellen Port auswählen" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-VIA" #~ msgid "Rig control and logging" #~ msgstr "Radio Steuerung und Logging" #~ msgid "Rig control and contest" #~ msgstr "Radio Steuerung und Contest" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Konnte nicht nach Updates suchen:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Adresse im Browser anzeigen" #~ msgid "Copy URL" #~ msgstr "Adresse kopieren" #~ msgid "Controls" #~ msgstr "Bedienelemente" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Leere ADIF Logbuch Datei %s" #~ msgid "Error reading %s" #~ msgstr "Fehler beim lesen von %s" #~ msgid "Quick entry" #~ msgstr "Schneller Eintrag" #~ msgid "Exchanges" #~ msgstr "Austausch" #~ msgid "Transmit all text in lower case" #~ msgstr "Gesamten Text in Kleinbuchstaben senden" #, fuzzy #~ msgid "User Interface - Logging" #~ msgstr "GUI" #~ msgid "Client/Server Logbook" #~ msgstr "Client/Server Logbuch" #~ msgid "Enter URL address of server" #~ msgstr "Adresse des Servers eingeben" #~ msgid "Enter Port # assigned to server" #~ msgstr "Port # des zugewiesenen Servers eingeben" #~ msgid "Prompt to save macro file when closing" #~ msgstr "Aufforderung zum speichern der Makrodatei bei beenden" #~ msgid "Navtex" #~ msgstr "Navtex" #~ msgid "Wefax" #~ msgstr "Wefax" #~ msgid "Mono audio output" #~ msgstr "Mono Audio Ausgabe" #~ msgid "Force output audio to single channel" #~ msgstr "Audio Ausgabe auf einem Kanal erzwingen" #~ msgid "QRZ online via default Internet Browser" #~ msgstr "QRZ online via Standard Internet Browser" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "Hamcall online mit dem Standard Browser" #~ msgid "HamQTH via default Internet Browser" #~ msgstr "HamQTH mit dem Standard Browser" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "Dial" #~ msgstr "Wählen" #~ msgid "\tvideo text" #~ msgstr "\tVideo Text" #~ msgid "cty.dat pathname" #~ msgstr "cty.dat Dateiname" #~ msgid "Really want to quit?" #~ msgstr "Möchten Sie wirklich beenden?" #~ msgid "No rig specified" #~ msgstr "Kein Radio ausgewählt" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Frequenz eingeben oder ändern mit\n" #~ "Links/rechts/hoch/runter/Bild_hoch/Bild_runter" #~ msgid "Enter Xcvr Freq" #~ msgstr "TRX Freq" #~ msgid "" #~ "Exit prompts active only when File/Exit menu item selected.\n" #~ "Not active if window decoration close button pressed." #~ msgstr "" #~ "Aufforderung zum speichern nur aktiv wenn Fldigi via 'Beenden' Menu\n" #~ "geschlossen wird. Nicht aber, wenn das Fenster anderweitig\n" #~ "geschlossen wird" #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Aktivieren, wenn Sie nicht die mittlere Maustaste verwenden können" #~ msgid "Char set" #~ msgstr "Zeichensatz" #~ msgid "Frq Disp" #~ msgstr "Frq Anz" #~ msgid "Label text" #~ msgstr "Label" #~ msgid "FFT latency (scan merging)" #~ msgstr "FFT Latenz (scan merging)" #, fuzzy #~ msgid "Select packet baudrate" #~ msgstr "Träber Baudrate wählen" #, fuzzy #~ msgid "Use cross-hair scope" #~ msgstr "Fadenkreuz verwenden" #, fuzzy #~ msgid "boost Audio input" #~ msgstr "Mono Audio Ausgabe" #~ msgid "Select the rig by name" #~ msgstr "Radio nach Name ausuchen" #, fuzzy #~ msgid "Initialize Memmap interface" #~ msgstr "Hamlib Interface initialisieren" #~ msgid "Mixer" #~ msgstr "Mixer" #~ msgid "OSS Mixer" #~ msgstr "OSS Mixer" #~ msgid "Manage mixer" #~ msgstr "Mischer verwalten" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Mixersteuerungen zu Hauptdialog hinzufügen" #~ msgid "Select Mixer device" #~ msgstr "Mixer Gerät auswählen" #~ msgid "Mic In" #~ msgstr "Mikrofon" #~ msgid "Use microphone input" #~ msgstr "Mikrofon Eingang verwenden" #~ msgid "Line In" #~ msgstr "Line in" #~ msgid "Use Line-In device" #~ msgstr "Line-In Eingang verwenden" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Soundkarten PCM Pegel einstellen" #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "" #~ "Vollen Dateinamen zu externem Programm eingeben\n" #~ "oder einfacher Name des Programms" fldigi-4.1.06/po/fr.po0000664000175000017500000062267413515625024011374 00000000000000# French translations for fldigi package # Traductions françaises du paquet fldigi. # Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Stephane Fillod , 2009-2010. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.01\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2010-03-06 13:04+0200\n" "Last-Translator: Bernard Seront, F4GAR \n" "Language-Team: French\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "%s log démarré le %s" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "Mauvais id modem" #: src/main.cxx:1710 #, fuzzy msgid "Bad frequency" msgstr "Mauvaise Fréquence" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licence GPLv3+: GNU GPL version 3 ou ultérieure \n" "Ceci est un logiciel libre : vous êtes libre de le modifier et de le " "redistribuer.\n" "Ce logiciel n'offre pas d'autre garantie que celle imposée par la loi.\n" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 #, fuzzy msgid "Could not make directory " msgstr "Ne peut pas créer le répertoire" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "Loguer tout le texte RX/TX" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "Contrôle radio" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "&Mode Op" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Montrer moins de modes" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Montrer moins demodes" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "&Vue" #: src/dialogs/fl_digi.cxx:198 #, fuzzy msgid "MFSK Image" msgstr "Image &MFSK" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:200 #, fuzzy msgid "IFKP Raw Image" msgstr "Image &MFSK" #: src/dialogs/fl_digi.cxx:201 #, fuzzy msgid "Weather Fax Image RX" msgstr "Image Fax Météo RX" #: src/dialogs/fl_digi.cxx:202 #, fuzzy msgid "Weather Fax Image TX" msgstr "Image Fax Météo TX" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "Concours" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "Pa&ys" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "Tous" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Aucun" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "Scope permanent" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "Contrôle minimal" #: src/dialogs/fl_digi.cxx:211 #, fuzzy msgid "Show channels" msgstr "Montrer Canaux" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "Connecter au serveur" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "Personnalisé..." #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "Sauvegarder les macros modifiées?" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "Annuler" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Sauvegarder" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "Ne pas sauvegarder" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "Non" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Oui" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "Nom de fichier manquant" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "Format non supporté" #: src/dialogs/fl_digi.cxx:2700 #, fuzzy msgid "channels != 1" msgstr "Canaux" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "Erreur inconue de fichier wave" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "Repérage désactivé" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Ehec de lancement du navigateur web:\n" "%s\n" "\n" "Ouvrez cette url manuellement:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Echec d'ouverture d'url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Recherche des mises à jour..." #: src/dialogs/fl_digi.cxx:2858 #, fuzzy msgid "Update site not available" msgstr "Pas disponible" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "Vous utilisez la dernière version" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "Vous utilisez la dernière version" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "La version %s est disponible chez\n" "\n" "%s\n" "\n" "Que voulez vous faire?" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "Création sunspot en cours!" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Information sur le périphérique audio disponible uniquement pour PortAudio" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "Périph. capture" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "Périph. sortie" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Périph de capture et sortie" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: N'existe pas, créer?" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "Effacer champ de log?" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Confirmer" #: src/dialogs/fl_digi.cxx:4525 #, fuzzy msgid "Save changed configuration?" msgstr "Sauvegarder la nouvelle configuration?" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 #, fuzzy msgid "Save log entry?" msgstr "Sauvegarder le fichier journal" #: src/dialogs/fl_digi.cxx:4557 #, fuzzy msgid "Confirm Quit" msgstr "Confirme la sortie" #: src/dialogs/fl_digi.cxx:4579 #, fuzzy msgid "Confirm quit?" msgstr "Confirmer la sortie?" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "&Fichier" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Dossiers" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Config Fldigi..." #: src/dialogs/fl_digi.cxx:5865 #, fuzzy msgid "FLMSG files..." msgstr "Fichiers FLMSG..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "Fichiers NBEMS..." #: src/dialogs/fl_digi.cxx:5867 #, fuzzy msgid "Data files..." msgstr "Fichiers de données..." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "Macros" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Ouvrir ..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Sauvegarder ..." #: src/dialogs/fl_digi.cxx:5875 #, fuzzy msgid "Config Scripts" msgstr "Control radio" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5877 #, fuzzy msgid "Generate" msgstr "Général" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "Capture le texte" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "Capture RX" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "Génération TX" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "Sortie" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Quitter" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "&Configuration" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "Couleurs && Polices" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "Opérateur" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "Interface Utilisateur" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "Chute d'eau" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "Contrôles chute d'eau" #: src/dialogs/fl_digi.cxx:6146 #, fuzzy msgid "Operating" msgstr "Opérateur" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 #, fuzzy msgid "Active Modem" msgstr "Modes réception" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "Carte Son" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "" #: src/dialogs/fl_digi.cxx:6155 msgid "CPU speed" msgstr "" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "" #: src/dialogs/fl_digi.cxx:6157 #, fuzzy msgid "PSKmail" msgstr "Pskmail" #: src/dialogs/fl_digi.cxx:6158 #, fuzzy msgid "PSK reporter" msgstr "report" #: src/dialogs/fl_digi.cxx:6159 msgid "Sweet spot" msgstr "" #: src/dialogs/fl_digi.cxx:6160 #, fuzzy msgid "Text IO" msgstr "Texte:" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Autre" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "Lancement automatique" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 #, fuzzy msgid "IO" msgstr "IO" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notifications" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 #, fuzzy msgid "PSM" msgstr "PSK" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 msgid "Test Signals" msgstr "" #: src/dialogs/fl_digi.cxx:6175 #, fuzzy msgid "Contest/Logging" msgstr "Contest" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Sauvegarde Config" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Montrer/Cacher canaux" #: src/dialogs/fl_digi.cxx:6188 #, fuzzy msgid "Signal browser" msgstr "Navigateur signal" #: src/dialogs/fl_digi.cxx:6190 #, fuzzy msgid "View/Hide 48 macros" msgstr "Montrer/Cacher canaux" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "Scope flottant" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6205 #, fuzzy msgid "Rig/Log Controls" msgstr "Contrôle radio" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "&Journal" #: src/dialogs/fl_digi.cxx:6219 #, fuzzy msgid "View" msgstr "&Vue" #: src/dialogs/fl_digi.cxx:6221 #, fuzzy msgid "Files" msgstr "&Fichier" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Ouvrir..." #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Nouveau" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:6228 #, fuzzy msgid "Merge..." msgstr "Fusion ..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "" #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "" #: src/dialogs/fl_digi.cxx:6235 #, fuzzy msgid "Text..." msgstr "Texte..." #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "" #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "" #: src/dialogs/fl_digi.cxx:6242 msgid "Field Day Logging" msgstr "" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "&Aide" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "Création sunspots" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "Guide Débutants" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "Documentation en ligne..." #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Site web Fldigi..." #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "Rapport d'écoute..." #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Options de ligne de commande" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "Info périphérique audio" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "Info Build" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "Historique événements" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Rechercher des mises à jour..." #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "À &propos" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "Mode chute d'eau-uniquement" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "PAS D'INDICATIF" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Fermer la Liste" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Ouvrir la Liste" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "Effacer la liste?" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "report" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "reports" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "Activité récente pour le carré" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 #, fuzzy msgid "Signal Browser" msgstr "Navigateur Signal" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "Scope" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Niveau de signal détecté" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Niveau squelch" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Clic Gauche: change mode\n" "Clic Droit: configure" #: src/dialogs/fl_digi.cxx:8141 #, fuzzy msgid "CW transmit WPM" msgstr "WPM Transmission CW" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "WPM par défaut" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "Niveau d'atténuation Tx (dB)" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "Contrôle Automatique de Fréquence" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:8226 msgid "Power Signal Monitor" msgstr "" #: src/dialogs/fl_digi.cxx:9943 #, fuzzy msgid "Delete entry?" msgstr "Sauvegarder le fichier journal" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Tous" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "Cherche: " #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Fermer" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "Effacer" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Clic gauche pour effacer le texte\n" "Clic droit pour reset fréquences" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "Positionne le Squelch Visualiseur" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "Exporter vers un fichier CSV" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "Exporter vers un fichier à champs fixes" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "Export vers fichier ADIF" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "Sauvegarder le journal modifié?" #: src/logbook/logsupport.cxx:381 #, fuzzy msgid "Create new logbook file" msgstr "Nouveau journal" #: src/logbook/logsupport.cxx:404 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "%s: N'existe pas, créer?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Ouvrir le fichier journal" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Sauvegarde le fichier journal" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "Fusion fichier ADIF" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "Mise à jour" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Confirmer la suppression d'enregistrement pour \"%s\"?" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "Créer un rapport Cabrillo" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detecter les occurances de [WRAP:beg] et [WRAP:end]\n" "Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-" "heure, ie:\n" " NBEMS.files \\WRAP\\recv\\extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detecter les occurances de [WRAP:beg] et [WRAP:end]\n" "Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-" "heure, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 #, fuzzy msgid "Could not start flmsg" msgstr "Ne peut pas lancer flmsg" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "Rechercher l'exécutable flmsg" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "Rechercherl'exécutable" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:497 #, fuzzy msgid "Locate binary" msgstr "Rechercher le binaire" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Sauvegarder tout le texte reçu, un charactère àla fois dans le fichier " "suivant:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "Mode Radio" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Toujours LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Toujours USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Réinitialiser toutes les options?\n" "\n" "La réinitialisation des options sera effective au prochain démarrage\n" "Les fichiers: fldigi_def.xml et fldigi.prefs seront effacés!\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Confirmer RESET" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "Calme" #: src/misc/debug.cxx:89 msgid "Error" msgstr "Erreur" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "Avertissement" #: src/misc/debug.cxx:89 msgid "Info" msgstr "Info" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "Débug" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "Contrôle ARQ" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "" #: src/misc/debug.cxx:105 #, fuzzy msgid "KISS control" msgstr "Contrôle KISS" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "Change niveau de log" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tma fréquence" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tmode" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tmon locator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tmon nom" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tmon QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tmon RST" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy FD class" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy state" msgstr "\tmon nom" #: src/misc/macroedit.cxx:81 #, fuzzy msgid "\tmy ST" msgstr "\tmon RST" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:83 #, fuzzy msgid "\tmy CNTY" msgstr "\tmon QTH" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "\tindicatif de l'autre" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "\tnom de l'autre" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "\tQTH de l'autre" #: src/misc/macroedit.cxx:93 #, fuzzy msgid "\tother State" msgstr "\tRST de l'autre" #: src/misc/macroedit.cxx:94 #, fuzzy msgid "\tother Province" msgstr "\tnom de l'autre" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "\tlocator de l'autre" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "\tRST de l'autre" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "" #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "" #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "" #: src/misc/macroedit.cxx:112 #, fuzzy msgid "\tclear TX pane" msgstr "Efface champ de log?" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "" #: src/misc/macroedit.cxx:123 #, fuzzy msgid "\tclear log fields" msgstr "Efface champ de log?" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:137 msgid "\tlocal time, default %H%M" msgstr "" #: src/misc/macroedit.cxx:138 msgid "\tzulu time default %H%MZ" msgstr "" #: src/misc/macroedit.cxx:139 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "" #: src/misc/macroedit.cxx:140 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "" #: src/misc/macroedit.cxx:153 msgid "\tcurrent contest serno" msgstr "" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD class" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tFD section" msgstr "Numéro de série reçu." #: src/misc/macroedit.cxx:157 #, fuzzy msgid "\tcontest class" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:158 #, fuzzy msgid "
\tARRL section" msgstr "Numéro de série reçu." #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "\treçois" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "\ttransmets" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr low cutoff filter" msgstr "" #: src/misc/macroedit.cxx:175 msgid "\tvalid xcvr hi cutoff filter" msgstr "" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "" #: src/misc/macroedit.cxx:183 #, fuzzy msgid "\tinsert image file" msgstr "Enregistrer fichier macros" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 #, fuzzy msgid "\tpause transmit" msgstr "\ttransmets" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "" #: src/misc/macroedit.cxx:200 msgid "\tsend mode ID; TX start only" msgstr "" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:229 #, fuzzy msgid "\tsave current macro file" msgstr "Enregistrer fichier macros" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:243 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:247 msgid "\tAnalysis CSV on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "" #: src/misc/macroedit.cxx:384 msgid "Test text file" msgstr "" #: src/misc/macroedit.cxx:394 #, fuzzy msgid "MFSK image file" msgstr "fichier image MFSK" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "" #: src/misc/macroedit.cxx:414 #, fuzzy msgid "Select wav file" msgstr "Sélectionner la ligne" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "" #: src/misc/macroedit.cxx:457 #, fuzzy msgid "Macro Text" msgstr "Éditeur de macro - " #: src/misc/macroedit.cxx:462 #, fuzzy msgid "Select Tag" msgstr "Sélectionne" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "Éditeur de macro - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Ouvrir fichier macros" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 #, fuzzy msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fichier de définition macro Fldigi\t*.mdf" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "Enregistrer fichier macros" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Fini" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Suivant" #: src/misc/newinstall.cxx:389 #, fuzzy msgid "Back" msgstr "Arrière plan" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "L'assistant vous guidera pour les réglages de base de fldigi" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Vous pouvez sauter une page ou quiter l'assistant à tout moment" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Tous les réglages présents ici peuvent être changés ultérieuremet par le " "menu configuration" #: src/misc/newinstall.cxx:540 #, fuzzy msgid "Fldigi configuration wizard" msgstr "Assistant de Configuration Fldigi" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "Temps nécessaire: " #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "Charge fichier image" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Envoyer image" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "Charge" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Niveau haut de signal (dB)" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "Plage du signal (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Change échelle chute d'eau" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "Centre affichage sur signal" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "Vitesse chute d'eau" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "Ajuste fréquence curseur" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centrer dans la bande passante\n" "Clic droit pour annuler" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Enregistre le mode et la fréquence\n" "Clic droit pour la liste" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Vérouille la fréquence de transmission" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "Inverse" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Transmet/Reçoit" #: src/waterfall/waterfall.cxx:2330 #, fuzzy msgid "AFC range or BW" msgstr "Plage AFC " #: src/waterfall/waterfall.cxx:2331 #, fuzzy msgid "Signal search" msgstr "Recherche du signal" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "Porteuse modem" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "Défiler" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Ouvrir fichier rig xml" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fichier de définition rig xml\t*.xml" #: src/soundcard/sound.cxx:170 msgid "Waveform Audio Format\t*.wav\n" msgstr "" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Codec Audio sans perte libre\t*.flac" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "Fichier audio" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "Mon indicatif de CALL" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "Station enrendue 2 fois" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "Réception RSID" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "Basculer" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "Enlever" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Sélectionner" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "Continent" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "Zone ITU" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "Zone CQ" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "Désélectionne" #: src/spot/notify.cxx:519 msgid "Add" msgstr "Ajoute" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Tout Sélectionner" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "Efface Tout" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "Pays" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "Le champ d'expression régulière ne doit pas être vide" #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "L'expression régulière doit être valide" #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "Merci de configurer votre indicatif en premier" #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Exécuter le prgramme" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" "La phrase test par défaut est:\n" " \"" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "Entrer la phrase test ou laisser vide par défaut" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "L'expression régulière pour cet évennement est invalide" #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "" "La phrase test ne correspond pas au motif de recherche de cet évennement" #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "Sous-phrases disponibles" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "Fréquence" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "Indicatif" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Ouvrir palette" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "Palette Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "Enregistrement palette" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "Recherche indicatif" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "Indicatif" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "Nom" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "État" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 #, fuzzy msgid "County" msgstr "Pays" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "Province" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "Echange" #: src/widgets/FTextRXTX.cxx:161 #, fuzzy msgid "Rx Serial #" msgstr "Périphérique série" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 #, fuzzy msgid "Section" msgstr "Action" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 msgid "SS check" msgstr "" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 #, fuzzy msgid "SS section" msgstr "Action" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 #, fuzzy msgid "QSOp state" msgstr "Heure de départ du QSO" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 #, fuzzy msgid "QSOp name" msgstr "Nom opérateur" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Insère marqueur" #: src/widgets/FTextRXTX.cxx:198 msgid "All entries" msgstr "" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr "" #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "Dernier QSO" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Transmission" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "Réception" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "Annuler" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Envoyer image..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 #, fuzzy msgid "Spec Char" msgstr "Sélectionne" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 msgid "A" msgstr "" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 msgid "E" msgstr "" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "IO" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "Non" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 #, fuzzy msgid "O" msgstr "OK" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 msgid "U" msgstr "" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Insère texte" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Sauvegarder le texte sous" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Copier" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Enregistrer sous..." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Couper" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Coller" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Insèrer fichier..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Annuler" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "Supprimer" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, c-format msgid "Executing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:394 #, fuzzy msgid "Command Not Found" msgstr "Options de ligne de commande" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:414 #, fuzzy msgid "General Error" msgstr "Général" #: src/config_script/script_parsing.cxx:418 #, fuzzy msgid "No Errors" msgstr "Erreur" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "no" msgstr "Info" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "yes" msgstr "Oui" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Montrer" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "Cacher" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "Configuration Fldigi" #: src/dialogs/confdialog.cxx:8227 #, fuzzy msgid "Station / Operator" msgstr "Station enrendue 2 fois" #: src/dialogs/confdialog.cxx:8230 #, fuzzy msgid "Station Callsign:" msgstr "Indiatifs des opérateurs" #: src/dialogs/confdialog.cxx:8231 #, fuzzy msgid "Station callsign" msgstr "Indiatifs des opérateurs" #: src/dialogs/confdialog.cxx:8244 #, fuzzy msgid "Operator Callsign:" msgstr "Indiatifs des opérateurs" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:8259 #, fuzzy msgid "Operator Name:" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Noms des opérateurs" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "Antenne:" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "Courte description de l'antenne" #: src/dialogs/confdialog.cxx:8287 #, fuzzy msgid "Station QTH:" msgstr "Station" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "QTH des opérateurs" #: src/dialogs/confdialog.cxx:8301 #, fuzzy msgid "Station Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "Localisation Maidenhead" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 #, fuzzy msgid "Browser" msgstr "Navigateur" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "" "Canaux, le prmeier canal démarre à la limite inférieure dela chute d'eau" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "Changer le nombre de canaux du visualisateur psk" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "Délai d'inactivité" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Effacer le canal texte après\n" "# secondes d'inactivité" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Etiquette du canal" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Apparence de l'étiquette de chaque canal" #: src/dialogs/confdialog.cxx:8431 #, fuzzy msgid "Audio frequency" msgstr "Fréquence audio" #: src/dialogs/confdialog.cxx:8432 #, fuzzy msgid "Radio frequency" msgstr "Fréquence Radio" #: src/dialogs/confdialog.cxx:8432 #, fuzzy msgid "Channel number" msgstr "Numéro du canal" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "Police..." #: src/dialogs/confdialog.cxx:8438 #, fuzzy msgid "select browser font" msgstr "Sélectionner la police du navigateur" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "Intervalles fixes" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forcer l'espacement des canaux à des incréments uniformes de 100 Hz" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "Défillement continu" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "" #: src/dialogs/confdialog.cxx:8467 #, fuzzy msgid "Detection Level" msgstr "Détecte le niveau de signal" #: src/dialogs/confdialog.cxx:8469 #, fuzzy msgid "Backgnd" msgstr "Arrière plan" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "Bouton" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:8497 #, fuzzy msgid "Even" msgstr "Événement" #: src/dialogs/confdialog.cxx:8498 #, fuzzy msgid "Even lines" msgstr "Historique événements" #: src/dialogs/confdialog.cxx:8503 #, fuzzy msgid "Odd" msgstr "Ajoute" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "Lignes impaires" #: src/dialogs/confdialog.cxx:8510 #, fuzzy msgid "Select line" msgstr "Sélectionner la ligne" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "Général" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Montrer infobulles" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "Afficher / masquer les astuces" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Montrer icônes menu" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "Afficher / masquer les icônes de menus" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "Schéma de l'interface utilisateur" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Changer l'apparence del'application" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "Modes visibles" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Sélectionner les modes accessibles par menu" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "Langue de l'interface utilisateur" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Changements prenent effet lors du prochain redémarrage" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Imprimmer CW / RTTY / THROB / CONTESTIA en minuscules" #: src/dialogs/confdialog.cxx:8591 #, fuzzy msgid "Transmit lower case text" msgstr "Transmettre tout le texte en minuscules" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "" #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "Sauvegarder le jeu de macro actuel à la sortie du programme" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "" #: src/dialogs/confdialog.cxx:8618 #, fuzzy msgid "Confirm exit" msgstr "Confirmer la sortie" #: src/dialogs/confdialog.cxx:8625 #, fuzzy msgid "Check for updates" msgstr "Rechercher des mises à jour..." #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "Rechercher des mises à jour au démarrage du programme" #: src/dialogs/confdialog.cxx:8638 #, fuzzy msgid "Show TX timer" msgstr "Montre les entités DXCC" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "" #: src/dialogs/confdialog.cxx:8658 msgid "QSO" msgstr "" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "" #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "" #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "Convertir l'indicatif en majuscules" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "Forcer le champ indicatif en majuscules" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Remplir automatiquement le pays et l'azimuth" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Remplir le pays et l'azimuth en utilisant l'informaton de cty.dat" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "" #: src/dialogs/confdialog.cxx:8698 #, fuzzy msgid "Default RST in to 599/59" msgstr "Forcer le RST entrée/sortie à 599" #: src/dialogs/confdialog.cxx:8699 msgid "Clear log controls sets RST in to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:8704 #, fuzzy msgid "Default RST out to 599/59" msgstr "Forcer le RST entrée/sortie à 599" #: src/dialogs/confdialog.cxx:8705 msgid "Clear log controls sets RST out to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:8710 msgid "cty.dat folder" msgstr "" #: src/dialogs/confdialog.cxx:8711 msgid "Enter full path-name for cty.dat folder" msgstr "" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "Défaut" #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "" #: src/dialogs/confdialog.cxx:8751 #, fuzzy msgid "Display logbook read datum at start" msgstr "Afficher le nom du fichier de macros au démarrage" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "Le nom de fichier est écrit dans la zone texte de réception" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 #, fuzzy msgid "Rx Text" msgstr "Texte:" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:8801 #, fuzzy msgid "Clear log fields - new CALL" msgstr "Effacer champ de log?" #: src/dialogs/confdialog.cxx:8812 #, fuzzy msgid "Connect to MacLogger" msgstr "Connecter au serveur" #: src/dialogs/confdialog.cxx:8817 #, fuzzy msgid "Capture Radio Report" msgstr "Créer un rapport Cabrillo" #: src/dialogs/confdialog.cxx:8823 #, fuzzy msgid "Capture Log Report" msgstr "Créer un rapport Cabrillo" #: src/dialogs/confdialog.cxx:8828 #, fuzzy msgid "Capture Lookup " msgstr "Capture" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 #, fuzzy msgid "Enable UDP log file" msgstr "Sauvegarde le fichier journal" #: src/dialogs/confdialog.cxx:8848 msgid "UDP data stream" msgstr "" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8868 #, fuzzy msgid "Clear text" msgstr "Effacer Liste" #: src/dialogs/confdialog.cxx:8871 #, fuzzy msgid "Address" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:8872 msgid "N3FJP Server IP Address" msgstr "" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 #, fuzzy msgid "Port" msgstr "Port:" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" #: src/dialogs/confdialog.cxx:8905 msgid "Enable Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 #, fuzzy msgid "Connect" msgstr "ReConnecter" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 #, fuzzy msgid "Connected" msgstr "ReConnecter" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 #, fuzzy msgid "Contests" msgstr "Concours" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 msgid "State QSO Party" msgstr "" #: src/dialogs/confdialog.cxx:8980 #, fuzzy msgid "Text capture order" msgstr "Capture le texte" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Context Notes" msgstr "Concours" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "" #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Vérifier les doublons" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Bande" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "Les bandes doivent correspondre" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "Mode" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "Le mode doit correspondre" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "Un QSO ne doit pas avoir lieu sur une p&riode de temps de" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "Couleur des Dup" #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/dialogs/confdialog.cxx:9029 #, fuzzy msgid "? Dup Color" msgstr "Couleur des Dup" #: src/dialogs/confdialog.cxx:9030 #, fuzzy msgid "Left click to select possible dup color" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "L'état doit correspondre" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "minutes" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "" #: src/dialogs/confdialog.cxx:9069 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Echanges" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 #, fuzzy msgid "Send" msgstr "Envoyer:" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "" #: src/dialogs/confdialog.cxx:9087 #, fuzzy msgid "RST always 599/59" msgstr "RST touours à 599" #: src/dialogs/confdialog.cxx:9088 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "Forcer le RST entrée/sortie à 599" #: src/dialogs/confdialog.cxx:9093 msgid "Send CW cut #'s" msgstr "" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "" #: src/dialogs/confdialog.cxx:9101 #, fuzzy msgid "Start Nbr" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "Numéro de dépard" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Chiffres" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "Nombre de chiffres dans le numéro de série" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Remise à zéro" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 #, fuzzy msgid "Operator Call" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:9170 #, fuzzy msgid "My Section" msgstr "Action" #: src/dialogs/confdialog.cxx:9171 msgid "Field Day Section" msgstr "" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 #, fuzzy msgid "Scout Operator Name" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "La molette de souris est active sur les boutons de macros" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "Activer le controle de la barre de macros par la molette de souris" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Nombre et positions des barres de macros" #: src/dialogs/confdialog.cxx:9282 msgid "Button Height" msgstr "Hauteur des boutons" #: src/dialogs/confdialog.cxx:9283 msgid "Height of macro bar" msgstr "Hauteur de la bare de macros" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "Une au dessus de RX/TX" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" #: src/dialogs/confdialog.cxx:9299 msgid "One above waterfall" msgstr "Uneau dessus de la chute d'eau" #: src/dialogs/confdialog.cxx:9304 msgid "One below waterfall" msgstr "Une en dessous de la chute d'eau" #: src/dialogs/confdialog.cxx:9309 msgid "Two scheme 1" msgstr "" #: src/dialogs/confdialog.cxx:9314 msgid "Two scheme 2" msgstr "" #: src/dialogs/confdialog.cxx:9319 msgid "Two scheme 3" msgstr "" #: src/dialogs/confdialog.cxx:9324 msgid "Two scheme 4" msgstr "" #: src/dialogs/confdialog.cxx:9329 msgid "Two scheme 5" msgstr "" #: src/dialogs/confdialog.cxx:9334 msgid "Two scheme 6" msgstr "" #: src/dialogs/confdialog.cxx:9339 msgid "Two scheme 7" msgstr "" #: src/dialogs/confdialog.cxx:9344 msgid "Two scheme 8" msgstr "" #: src/dialogs/confdialog.cxx:9349 msgid "Two scheme 9" msgstr "" #: src/dialogs/confdialog.cxx:9354 msgid "Two scheme 10" msgstr "" #: src/dialogs/confdialog.cxx:9363 #, fuzzy msgid "Load last used macro file at start" msgstr "Charger le dernier fichier de macros utilisé au démarrage" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON : utiliser le dernier jeu de macros\n" "OFF : utiliser le jeu par défaut" #: src/dialogs/confdialog.cxx:9369 #, fuzzy msgid "Display macro filename at start" msgstr "Afficher le nom du fichier de macros au démarrage" #: src/dialogs/confdialog.cxx:9385 #, fuzzy msgid "Show macro control codes" msgstr "Montre l'éditeur de macro" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9405 #, fuzzy msgid "WF Ctrls" msgstr "Contrôles de la chute d'eau" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "Agrandissement de la chute d'eau" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "" #: src/dialogs/confdialog.cxx:9489 #, fuzzy msgid "Clrs/Fnts" msgstr "Couleurs && Polices" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:9494 msgid "Rx/Tx Character set" msgstr "" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "" #: src/dialogs/confdialog.cxx:9539 #, fuzzy msgid "Macro Edit Font" msgstr "Éditeur de macro - " #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "Système" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "Défauts" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 #, fuzzy msgid "Font" msgstr "Police:" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 #, fuzzy msgid "Bg Color" msgstr "Couleur du fond" #: src/dialogs/confdialog.cxx:9609 #, fuzzy msgid "Digit Color" msgstr "Couleur des chiffres" #: src/dialogs/confdialog.cxx:9612 #, fuzzy msgid "Sys Colors" msgstr "Couleur système" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "S-mètre" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 #, fuzzy msgid "Scale Color" msgstr "Couleur de l'échelle" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 #, fuzzy msgid "Meter Color" msgstr "Couleur de l'afficheur" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "Echelle de puissance" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "Sélectionner le type depré-filtre FFT" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 #, fuzzy msgid "Report Browser" msgstr "Navigateur" #: src/dialogs/confdialog.cxx:9721 #, fuzzy msgid "Even Lines" msgstr "Historique événements" #: src/dialogs/confdialog.cxx:9726 #, fuzzy msgid "Odd Lines" msgstr "Lignes impaires" #: src/dialogs/confdialog.cxx:9731 msgid "Stream Text" msgstr "" #: src/dialogs/confdialog.cxx:9737 #, fuzzy msgid "Bg color" msgstr "Couleur du fond" #: src/dialogs/confdialog.cxx:9743 #, fuzzy msgid "Alt Color" msgstr "Couleur" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Groupe 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Groupe 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Groupe 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "" #: src/dialogs/confdialog.cxx:9783 #, fuzzy msgid "Font/Color" msgstr "Police/Couleur" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:9808 msgid "RxID nar" msgstr "" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "" #: src/dialogs/confdialog.cxx:9820 msgid "RxID wide" msgstr "" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "" #: src/dialogs/confdialog.cxx:9882 #, fuzzy msgid "All Others" msgstr "Autre" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "Affichage" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "Couleurs et curseurs" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "Charge..." #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "Charge une nouvelle palette" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Sauvegarde..." #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Couleur" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "" #: src/dialogs/confdialog.cxx:10269 #, fuzzy msgid "Normal drop speed / value" msgstr "Visitesse chute d'eau" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Souris" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:10374 #, fuzzy msgid "values left/below waterfall" msgstr "Une en dessous de la chute d'eau" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10389 #, fuzzy msgid "use" msgstr "Souris" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "Modems" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10451 #, fuzzy msgid "Matched Filt'" msgstr "Filtre" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:10511 #, fuzzy msgid "Range" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 msgid "Edge decrease" msgstr "" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10735 #, fuzzy msgid "BPF transmit audio" msgstr "WPM Transmission CW" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 #, fuzzy msgid "Ser. Port" msgstr "Port:" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 #, fuzzy msgid "Xcvr serial port" msgstr "Port série" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 msgid "Connect / Disconnect from WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 #, fuzzy msgid "ModeReg" msgstr "Mode" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 msgid "Enable paddle auto spacing of characters" msgstr "" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 msgid "Enable contest character spacing" msgstr "" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 #, fuzzy msgid "Serial echo" msgstr "Périphérique série" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 #, fuzzy msgid "Tone ON" msgstr "Heure ON" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 #, fuzzy msgid "WPM Settings" msgstr "" "La phrase test par défaut est:\n" " \"" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 msgid "Min WPM" msgstr "" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 msgid "Rng WPM" msgstr "" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 msgid "Cmd WPM" msgstr "" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 msgid "Timing/Settings" msgstr "" #: src/dialogs/confdialog.cxx:11155 #, fuzzy msgid "Ratio" msgstr "Locator" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 msgid "Sample" msgstr "" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 msgid "Weight" msgstr "" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 #, fuzzy msgid "Bk" msgstr "Arrière plan" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 msgid "WPM setting" msgstr "" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 #, fuzzy msgid "nanoIO serial port" msgstr "Port série" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 msgid "Connect / Disconnect from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 #, fuzzy msgid "Status" msgstr "État" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 msgid "Paddle" msgstr "" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 msgid "Comp'" msgstr "" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 msgid "PTT off" msgstr "" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "" #: src/dialogs/confdialog.cxx:11647 #, fuzzy msgid "Hell Transmit Parameters" msgstr "Modes transmission" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 #, fuzzy msgid "Range 1...3" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:11706 #, fuzzy msgid "Hell Receive Parameters" msgstr "Sélectionner paramètres opératoires" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "Inverse vidéo" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "" #: src/dialogs/confdialog.cxx:11715 #, fuzzy msgid "Marquee text" msgstr "Effacer Liste" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11722 #, fuzzy msgid "Range 1...4" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:11734 msgid "Rx Height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11790 #, fuzzy msgid "Min Hits" msgstr "Control Radio" #: src/dialogs/confdialog.cxx:11791 msgid "Minimum # hits in tone detector" msgstr "" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 msgid "Center freq" msgstr "" #: src/dialogs/confdialog.cxx:11867 #, fuzzy msgid "Sounder" msgstr "Carte Son" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 #, fuzzy msgid "convert operator callsign to lower case" msgstr "Convertir l'indicatif en majuscules" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Time out" msgstr "Heure ON" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:11892 #, fuzzy msgid "Enter QTC text" msgstr "Insère texte" #: src/dialogs/confdialog.cxx:11898 msgid "Message Logging" msgstr "" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 #, fuzzy msgid "Notify time out" msgstr "Délai d'inactivité" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 #, fuzzy msgid "Audit log" msgstr "Audio" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 #, fuzzy msgid "Enable" msgstr "Activé" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 #, fuzzy msgid "Text Colors" msgstr "Couleur de l'afficheur" #: src/dialogs/confdialog.cxx:11959 #, fuzzy msgid "Transmit text" msgstr "Transmission" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "" #: src/dialogs/confdialog.cxx:11988 msgid "1/2 speed" msgstr "" #: src/dialogs/confdialog.cxx:11993 msgid "1x speed" msgstr "" #: src/dialogs/confdialog.cxx:11994 #, fuzzy msgid "default" msgstr "Défaut" #: src/dialogs/confdialog.cxx:11999 msgid "2x speed" msgstr "" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:12011 #, fuzzy msgid "convert other callsign to lower case" msgstr "Convertir l'indicatif en majuscules" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 msgid "Manual tuning" msgstr "" #: src/dialogs/confdialog.cxx:12122 msgid "Oliv" msgstr "" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "Tons" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "Période d'intégration (FEC blocs)" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 msgid "Enable this to send start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12227 #, fuzzy msgid "Cont" msgstr "Contest" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "Comportement AFC" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "après" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12439 msgid "Pilot tone power relative to signal" msgstr "" #: src/dialogs/confdialog.cxx:12458 msgid "Short Preamble" msgstr "" #: src/dialogs/confdialog.cxx:12459 msgid "Enable short preamble for 8PSK transmission" msgstr "" #: src/dialogs/confdialog.cxx:12472 msgid "TTY" msgstr "" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:12555 #, fuzzy msgid "Log RTTY frequency" msgstr "Ajuste fréquence curseur" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:12566 #, fuzzy msgid "track color" msgstr "Couleur police" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:12580 #, fuzzy msgid "Sound Card FSK" msgstr "Carte Son" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "Parité" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "Stop bits" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:12728 #, fuzzy msgid "Pseudo-FSK - right channel" msgstr "Canaux" #: src/dialogs/confdialog.cxx:12729 #, fuzzy msgid "Create keyed square wave on right audio channel" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:12736 #, fuzzy msgid "Transceiver FSK" msgstr "Contrôle transceiver" #: src/dialogs/confdialog.cxx:12739 msgid "Mark" msgstr "" #: src/dialogs/confdialog.cxx:12740 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Fréquence porteuse (Hz)" #: src/dialogs/confdialog.cxx:12751 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Largeur Chute d'eau en Hz" #: src/dialogs/confdialog.cxx:12766 #, fuzzy msgid "LTRS at start" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 #, fuzzy msgid "FSK Interface" msgstr "Interface Utilisateur" #: src/dialogs/confdialog.cxx:12847 #, fuzzy msgid "Navigator serial port" msgstr "Port série" #: src/dialogs/confdialog.cxx:12861 #, fuzzy msgid "FSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12862 msgid "Connect / Disconnect from Nav FSK port" msgstr "" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 #, fuzzy msgid "Navigator configuration port" msgstr "Configuration Fldigi" #: src/dialogs/confdialog.cxx:12885 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Numéro du canal" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 #, fuzzy msgid "Channel 2 attenuator" msgstr "Numéro du canal" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 msgid "RF attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12918 msgid "NavRF Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 msgid "Nav FSK baud rate" msgstr "" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Stop bits" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 #, fuzzy msgid "Mark Polarity" msgstr "Parité" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 #, fuzzy msgid "Config" msgstr "Confirmer" #: src/dialogs/confdialog.cxx:13062 msgid "Connect / Disconnect from Nav Config port" msgstr "" #: src/dialogs/confdialog.cxx:13069 #, fuzzy msgid "Synop" msgstr "Scope" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 #, fuzzy msgid "Serial Interface" msgstr "Interface Utilisateur" #: src/dialogs/confdialog.cxx:13158 #, fuzzy msgid "FSK port" msgstr "report" #: src/dialogs/confdialog.cxx:13206 msgid "Auto CRLF" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 msgid "Diddle char" msgstr "" #: src/dialogs/confdialog.cxx:13239 msgid "Diddle character" msgstr "" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 msgid "Unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:13402 msgid "Nav" msgstr "" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "" #: src/dialogs/confdialog.cxx:13475 #, fuzzy msgid "Save image as monochrome file" msgstr "Enregistrer fichier macros" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 msgid "flrig" msgstr "" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 #, fuzzy msgid "Addr" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 #, fuzzy msgid "Reconnect" msgstr "ReConnecter" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "Utiliser RigCAT" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Périphérique:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "Bits stop" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "Initialise" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "Initialise interface RigCAT" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "Contrôle de flux RTS/CTS" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "" #: src/dialogs/confdialog.cxx:13735 msgid "Restore UART Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:13741 #, fuzzy msgid "VSP Enable" msgstr "Activé" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" #: src/dialogs/confdialog.cxx:13747 msgid "Init delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "Utilise Hamlib" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "Hamlib utilisé pour contrôle radio" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:13823 #, fuzzy msgid "Retry Interval (msec)" msgstr "Intervalles fixes" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "" #: src/dialogs/confdialog.cxx:13840 msgid "Write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:13857 msgid "Post write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:13909 msgid "Polling Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT par commande Hamlib" #: src/dialogs/confdialog.cxx:13929 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT est un commande hamlib" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "Radio requiert contrôle de flux RTS/CTS" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "Contrôle de flux XON/XOFF" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "Radio requiert contrôle de flux Xon/Xoff" #: src/dialogs/confdialog.cxx:13965 msgid "CW is LSB mode" msgstr "" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:13977 msgid "Mode delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13978 msgid "Delay NN msec after executing mode change" msgstr "" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "Bande latérale:" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "Configuration avancée:" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configuration optionnelle\n" "au format: param=val ..." #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "Initialise interface hamlib" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Peut être utilisé à la place ou en plus d'autres types de PTT" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "Brochage périphérique PTT matériel" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "Utiliser un port série PTT à part" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "Utiliser un port parallèle PTT" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "Utiliser PTT uHRouter" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "Utiliser RTS" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "RTS est la ligne de signal PTT" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "Voltage initial sur RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "Utiliser DTR" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "DTR est la ligne de signal PTT" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "Voltage initial sur DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "Initialise l'interface PTT matérielle" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 #, fuzzy msgid "Select pin number" msgstr "Sélectionner la ligne" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 #, fuzzy msgid "Select PTT on state" msgstr "Sélectionner la ligne" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "Périphériques" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "Capture:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "Périph. audio entrée" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "Sortie:" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "Périph. audio sortie" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "E/S fichier seulement" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "Capture" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "" #: src/dialogs/confdialog.cxx:14605 #, fuzzy msgid "Right channel" msgstr "Canaux" #: src/dialogs/confdialog.cxx:14607 #, fuzzy msgid "Transmit Usage" msgstr "Transmission" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 #, fuzzy msgid "Software reversal of left-right audio channels" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" #: src/dialogs/confdialog.cxx:14627 #, fuzzy msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "Peut être utilisé à la place ou en plus d'autres types de PTT" #: src/dialogs/confdialog.cxx:14633 #, fuzzy msgid "CW QSK signal on right channel" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "" #: src/dialogs/confdialog.cxx:14649 #, fuzzy msgid "Receive Usage" msgstr "Réception" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "" #: src/dialogs/confdialog.cxx:14681 #, fuzzy msgid "Record both channels" msgstr "Montrer Canaux" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "" #: src/dialogs/confdialog.cxx:14692 #, fuzzy msgid "Regex Match in Browser" msgstr "Navigateur" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 #, fuzzy msgid "Sound:" msgstr "Carte Son" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 #, fuzzy msgid "Test" msgstr "Test..." #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 #, fuzzy msgid "flmsg interface" msgstr "Interface Utilisateur" #: src/dialogs/confdialog.cxx:14753 msgid "flmsg received wav" msgstr "" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "RsID detection" msgstr "Réception RSID" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "Modes réception" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:14892 #, fuzzy msgid "Squelch open (sec)" msgstr "Niveau squelch" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:14917 #, fuzzy msgid "Retain tx freq lock" msgstr "Fréquence émission verrouillée" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:14940 #, fuzzy msgid "Seconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "Modes transmission" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr "" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "Vitesse (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Divers" #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" #: src/dialogs/confdialog.cxx:15113 #, fuzzy msgid "Open message folder" msgstr "Ouvrir fichier macros" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15130 #, fuzzy msgid "Open in browser" msgstr "Navigateur PSK" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "Fréquence porteuse (Hz)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "Plage du recherche (Hz)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "Plage AFC (Hz)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "" #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "Hôte:" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "" #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" #: src/dialogs/confdialog.cxx:15445 #, fuzzy msgid "K3 A1A configuation" msgstr "Configuration avancée:" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" #: src/dialogs/confdialog.cxx:15459 #, fuzzy msgid "Text i/o" msgstr "Texte:" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:15524 #, fuzzy msgid "Conditions" msgstr "Options ligne de commande" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "" #: src/dialogs/confdialog.cxx:15554 msgid "Inches Hg." msgstr "" #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "" #: src/dialogs/confdialog.cxx:15566 #, fuzzy msgid "Temperature" msgstr "Génération TX" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "Default URL" msgstr "Défaut" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:15658 #, fuzzy msgid "Command run on KML creation" msgstr "Options ligne de commande" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:15669 #, fuzzy msgid "Change dir..." msgstr "Change couleur" #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "QRZ en ligne" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "" #: src/dialogs/confdialog.cxx:15725 #, fuzzy msgid "HamQTH online" msgstr "QRZ en ligne" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:15750 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15763 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15776 #, fuzzy msgid "Callook" msgstr "Indicatif" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:15820 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:15826 #, fuzzy msgid "Callook.info" msgstr "Indicatif" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "Nom utilisateur" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "Mot de passe" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "" #: src/dialogs/confdialog.cxx:15917 #, fuzzy msgid "User ID" msgstr "Nom utilisateur" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:15971 #, fuzzy msgid "Options" msgstr "Action" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Montrer moins de modes" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 #, fuzzy msgid "Default message" msgstr "Défauts" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:16010 #, fuzzy msgid " {CALL} other ops call sign" msgstr "\tindicatif de l'autre" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:16016 #, fuzzy msgid "{NAME} other ops name" msgstr "\tnom de l'autre" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:16030 msgid "Enter full path-filename for tqsl executable" msgstr "" #: src/dialogs/confdialog.cxx:16044 msgid "Your tqsl login password" msgstr "" #: src/dialogs/confdialog.cxx:16059 #, fuzzy msgid "Use password for tqsl access" msgstr "Mot de passe" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:16065 #, fuzzy msgid "Location" msgstr "Locator" #: src/dialogs/confdialog.cxx:16066 msgid "tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 #, fuzzy msgid "Locate" msgstr "Locator" #: src/dialogs/confdialog.cxx:16081 #, fuzzy msgid "Locate tqsl executable" msgstr "Rechercherl'exécutable" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:16096 #, fuzzy msgid "Export" msgstr "report" #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 msgid "Check" msgstr "" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16108 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:16125 msgid "Use this tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:16160 msgid "Enter full path-filename for flrig" msgstr "" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:16178 msgid "Enter full path-filename for flamp" msgstr "" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:16196 msgid "Enter full path-filename for flnet" msgstr "" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:16214 msgid "Enter full path-filename for fllog" msgstr "" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 msgid "Enter full path-filename for external program" msgstr "" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "" #: src/dialogs/confdialog.cxx:16285 #, fuzzy msgid "" "Enable\n" "-" msgstr "Activé" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "" #: src/dialogs/confdialog.cxx:16333 #, fuzzy msgid "Start flamp" msgstr "Date QSO" #: src/dialogs/confdialog.cxx:16337 #, fuzzy msgid "Start flnet" msgstr "Date QSO" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "" #: src/dialogs/confdialog.cxx:16372 #, fuzzy msgid "Enable ARQ" msgstr "Activé" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "" #: src/dialogs/confdialog.cxx:16380 #, fuzzy msgid "Enable KISS" msgstr "Activé" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "" #: src/dialogs/confdialog.cxx:16388 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "Restart" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16564 msgid "XML" msgstr "" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16659 msgid "fllog" msgstr "" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16697 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" #: src/dialogs/confdialog.cxx:16707 #, fuzzy msgid "Enable Busy Channel" msgstr "Active le canal audio droit" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16726 msgid "Modem Bandwidth Margins " msgstr "" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16753 #, fuzzy msgid "Enable CSMA" msgstr "Activé" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 #, fuzzy msgid "Slot Time" msgstr "Heure" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16781 #, fuzzy msgid "Transmit Data Delay" msgstr "Modes transmission" #: src/dialogs/confdialog.cxx:16782 msgid "Idle transmit before data sent" msgstr "" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 #, fuzzy msgid "MilliSeconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16809 msgid "Enable Histogram" msgstr "" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16831 msgid "PSM Attenuate" msgstr "" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16845 #, fuzzy msgid "Default Settings" msgstr "" "La phrase test par défaut est:\n" " \"" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "Restaure défauts" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Couleur police" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Police:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Taille:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" #: src/dialogs/font_browser.cxx:283 #, fuzzy msgid "Reading fonts..." msgstr "Rechercher des mises à jour..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 #, fuzzy msgid "Data files sources" msgstr "Fichiers NBEMS..." #: src/dialogs/record_browse.cxx:27 #, fuzzy msgid "Data files update" msgstr "Fichiers NBEMS..." #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Événement" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Activé" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtre" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entité DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Montre les entités DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Action" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Montre l'éditeur de macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entités DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Trouve le pays:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Trouve le préfix:" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "" #: src/logbook/lgbook.cxx:622 #, fuzzy msgid "Start Date" msgstr "Date QSO" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:636 #, fuzzy msgid "Stop Date" msgstr "Date QSO" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:650 #, fuzzy msgid "select by date" msgstr "Sélection de la radio par le nom" #: src/logbook/lgbook.cxx:651 #, fuzzy msgid "Enable to select date range" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "Fréq" #: src/logbook/lgbook.cxx:679 #, fuzzy msgid "QSO Date On" msgstr "Date QSO" #: src/logbook/lgbook.cxx:683 #, fuzzy msgid "QSO Date Off" msgstr "Date QSO" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "Heure ON" #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "Heure OFF" #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "RST env." #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "RST reçu" #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 #, fuzzy msgid "Station Call" msgstr "Station" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 #, fuzzy msgid "Station QTH" msgstr "Station" #: src/logbook/lgbook.cxx:723 #, fuzzy msgid "Station LOC" msgstr "Station" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Notes" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "Date QSL reçue" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "Date QSL env." #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "Date QSL reçue" #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "Date QSL env." #: src/logbook/lgbook.cxx:750 #, fuzzy msgid "LoTW rcvd date" msgstr "Date QSL reçue" #: src/logbook/lgbook.cxx:753 #, fuzzy msgid "LoTW sent date" msgstr "Date QSL env." #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "TIUZ" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:795 #, fuzzy msgid "FD section" msgstr "Réception RSID" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 msgid "CW SS Check" msgstr "" #: src/logbook/lgbook.cxx:809 #, fuzzy msgid "CW SS Section" msgstr "Action" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "" #: src/logbook/lgbook.cxx:840 #, fuzzy msgid "Date On" msgstr "Date QSO" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "Heure ON" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "" #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "" #: src/logbook/lgbook.cxx:913 #, fuzzy msgid "Date Off" msgstr "Date QSO" #: src/logbook/lgbook.cxx:914 #, fuzzy msgid "Date QSO Ended" msgstr "Date du QSO" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "Heure OFF" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "Fréq." #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "" #: src/logbook/lgbook.cxx:1048 msgid "QSL" msgstr "" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "QSL-reçu" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "" #: src/logbook/lgbook.cxx:1062 #, fuzzy msgid "EQSL-rcvd" msgstr "QSL-reçu" #: src/logbook/lgbook.cxx:1075 #, fuzzy msgid "LOTW-rcvd" msgstr "QSL-reçu" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "QSL-env." #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "" #: src/logbook/lgbook.cxx:1101 #, fuzzy msgid "EQSL-sent" msgstr "QSL-env." #: src/logbook/lgbook.cxx:1114 #, fuzzy msgid "LOTW-sent" msgstr "QSL-env." #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "" #: src/logbook/lgbook.cxx:1181 #, fuzzy msgid "Cont'" msgstr "Contest" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "" #: src/logbook/lgbook.cxx:1236 #, fuzzy msgid "My Station" msgstr "Station" #: src/logbook/lgbook.cxx:1274 #, fuzzy msgid "Station Locator" msgstr "Station enrendue 2 fois" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 #, fuzzy msgid "Contest seral # sent" msgstr "Champs &Contest" #: src/logbook/lgbook.cxx:1302 msgid "Exch Out" msgstr "" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "" #: src/logbook/lgbook.cxx:1326 #, fuzzy msgid "Exch In" msgstr "Echange" #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "" #: src/logbook/lgbook.cxx:1339 msgid "Field Day class received" msgstr "" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 msgid "Field Section received" msgstr "" #: src/logbook/lgbook.cxx:1363 #, fuzzy msgid "Operators age received" msgstr "Noms des opérateurs" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 #, fuzzy msgid "Operating band" msgstr "Opérateur" #: src/logbook/lgbook.cxx:1399 msgid "Check value received" msgstr "" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 msgid "Ser NoR" msgstr "" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 #, fuzzy msgid "Sent troop number" msgstr "Sélectionner la ligne" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 #, fuzzy msgid "Received troop number" msgstr "Numéro de série reçu." #: src/logbook/lgbook.cxx:1492 #, fuzzy msgid "Name-S" msgstr "Nom" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 #, fuzzy msgid "Name-R" msgstr "Nom" #: src/logbook/lgbook.cxx:1505 #, fuzzy msgid "Received scout name" msgstr "Réception" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "" #: src/logbook/lgbook.cxx:1549 msgid "Retrieve" msgstr "" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "" #: src/logbook/lgbook.cxx:1583 #, fuzzy msgid "File:" msgstr "&Fichier" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "Date" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "Heure" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "Date QSO" #~ msgid "Experimental" #~ msgstr "Expérimental" #~ msgid "Enter a CALL !" #~ msgstr "Entrez un indicatif !" #~ msgid "Toggle smeter / combo controls" #~ msgstr "Basculer les contrôles smètre/combiné" #~ msgid "Add current frequency" #~ msgstr "Ajouter la fréquence courante" #~ msgid "Clear list" #~ msgstr "Effacer Liste" #~ msgid "Delete from list" #~ msgstr "Supprimer de la Liste" #~ msgid "Select operating parameters" #~ msgstr "Sélectionner paramètres opératoires" #, fuzzy #~ msgid "Frq" #~ msgstr "Fréq" #, fuzzy #~ msgid "frequency kHz" #~ msgstr "Fréquence kHz" #~ msgid "On" #~ msgstr "Début" #~ msgid "Press to update QSO start time" #~ msgstr "Cliquer pour mettre à jour l'heure de départdu QSO" #~ msgid "Off" #~ msgstr "Fin" #, fuzzy #~ msgid "QSO end time" #~ msgstr "Heure de fin du QSO" #, fuzzy #~ msgid "call sign" #~ msgstr "Indicatif" #~ msgid "Op" #~ msgstr "Op" #~ msgid "Azimuth" #~ msgstr "Azimuth" #, fuzzy #~ msgid "QTH City" #~ msgstr "Ville" #~ msgid "US State" #~ msgstr "État USA" #~ msgid "Can. Province" #~ msgstr "Province Can." #~ msgid "Maidenhead Locator" #~ msgstr "Locator Maindehead" #~ msgid "Sent serial number (read only)" #~ msgstr "Numéro de série envoyé (lecture seule)" #, fuzzy #~ msgid "Received FD class" #~ msgstr "RST reçu" #, fuzzy #~ msgid "Received FD section" #~ msgstr "Numéro de série reçu." #, fuzzy #~ msgid "Received CQ zone" #~ msgstr "Modes réception" #, fuzzy #~ msgid "Received State/Prov" #~ msgstr "RST reçu" #, fuzzy #~ msgid "Received serno" #~ msgstr "Réception" #, fuzzy #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Clic Droit - efface ligne" #~ msgid "Press to update" #~ msgstr "Cliquer pour mettre à jour" #~ msgid "Other call" #~ msgstr "Autre Indicatif" #~ msgid "Received RST" #~ msgstr "RST reçu" #~ msgid "Sent RST" #~ msgstr "RST envoyé" #~ msgid "Nm" #~ msgstr "Nm" #~ msgid "Other name" #~ msgstr "Autre nom" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Fn - exécute\n" #~ "Clic Droit - édite" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Maj-Fn - exécute\n" #~ "Clic Droit - édite" #, fuzzy #~ msgid "Shift-key macro set" #~ msgstr "Maj-Change le jeux de macro" #, fuzzy #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Clic Droit - efface ligne" #~ msgid "seek - regular expression" #~ msgstr "rechercher - expression régulière" #, fuzzy #~ msgid "Select FSQ station" #~ msgstr "Sélectionner la ligne" #, fuzzy #~ msgid "Stations Heard" #~ msgstr "Station enrendue 2 fois" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Fn - exécute\n" #~ "Clic Droit - édite" #, fuzzy #~ msgid "Primary macro set" #~ msgstr "Jeux de macro principal" #~ msgid "Aborted" #~ msgstr "Annulé" #~ msgid "Serial number" #~ msgstr "Numéro progressif" #, fuzzy #~ msgid "Send Xchg" #~ msgstr "Envoyer image" #, fuzzy #~ msgid "Contest Logging" #~ msgstr "Contest" #, fuzzy #~ msgid "Generic" #~ msgstr "Général" #, fuzzy #~ msgid "Use generic contest fields" #~ msgstr "Champs &Contest" #, fuzzy #~ msgid "Use Field Day Contest Fields" #~ msgstr "Champs &Contest" #~ msgid "at:" #~ msgstr "à:" #~ msgid "Test Signal - Do NOT use with transmitter" #~ msgstr "Signal de test, NE PAS utiliser en transmission" #, fuzzy #~ msgid "ALC on" #~ msgstr "AFC marche/arrêt" #, fuzzy #~ msgid "FFT filter" #~ msgstr "Filtre" #~ msgid "Operator information" #~ msgstr "Information opérateur" #, fuzzy #~ msgid "User Interface - Browser" #~ msgstr "Interface Utilisateur - Navigateur" #, fuzzy #~ msgid "User Interface - General" #~ msgstr "Interface Utilisateur" #, fuzzy #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interface Utilisateur" #, fuzzy #~ msgid "User Interface - Contest" #~ msgstr "Interface Utilisateur - Contest" #, fuzzy #~ msgid "User Interface - Macros" #~ msgstr "Interface Utilisateur - Macros" #, fuzzy #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interface utilisateur - Contrôles chute d'eau" #~ msgid "Rig Control using xml spec file" #~ msgstr "Contrôle Rig grâce à un fichier de spec xml" #~ msgid "Audio devices" #~ msgstr "Périphériques audio" #~ msgid "Callsign database" #~ msgstr "Base de données indicatifs" #~ msgid "Callsign:" #~ msgstr "Indicatif:" #~ msgid "Name:" #~ msgstr "Nom:" #~ msgid "QTH:" #~ msgstr "QTH:" #~ msgid "Revert" #~ msgstr "Inverse" #, fuzzy #~ msgid "Reset rigCAT interface" #~ msgstr "Initialise interface RigCAT" #, fuzzy #~ msgid "Reset hamlib interface" #~ msgstr "Initialise interface hamlib" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Utiliser PTT uHRouter" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Sélection port série" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-reçu" #~ msgid "Rig control and logging" #~ msgstr "Contrôle radio et journal" #~ msgid "Rig control and contest" #~ msgstr "Contrôle radio et concours" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Echec de recherche de mises à jour:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Visiter l'URL" #~ msgid "Copy URL" #~ msgstr "Copier l'URL" #~ msgid "Controls" #~ msgstr "Contrôles" #, fuzzy #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Vider le fichier journal ADIF" #~ msgid "Error reading %s" #~ msgstr "Erreur lecture %s" #~ msgid "Quick entry" #~ msgstr "Entrée rapide" #, fuzzy #~ msgid "User Interface - Logging" #~ msgstr "Interface Utilisateur - logging" #, fuzzy #~ msgid "Client/Server Logbook" #~ msgstr "Logbook client/serveur" #~ msgid "Enter URL address of server" #~ msgstr "Entrer l'adresse URL du serveur" #~ msgid "Enter Port # assigned to server" #~ msgstr "Entrer le n° de port assigné au serveur" #, fuzzy #~ msgid "Mono audio output" #~ msgstr "Périph. audio sortie" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "No rig specified" #~ msgstr "Aucune radio spécifiée" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Entrer fréquence ou changer avec\n" #~ "Gauche/Droite/Haut/Bas/Pg_Haut/Pg_Bas" #, fuzzy #~ msgid "Char set" #~ msgstr "Efface Liste" #, fuzzy #~ msgid "Frq Disp" #~ msgstr "Affichage Freq" #, fuzzy #~ msgid "Select packet baudrate" #~ msgstr "Sélectionne paramètres opératoires" #, fuzzy #~ msgid "boost Audio input" #~ msgstr "Périph. audio sortie" #~ msgid "Select the rig by name" #~ msgstr "Sélection de la radio par le nom" #, fuzzy #~ msgid "Initialize Memmap interface" #~ msgstr "Initialise interface hamlib" #~ msgid "Mixer" #~ msgstr "Mixeur" #, fuzzy #~ msgid "OSS Mixer" #~ msgstr "Mixeur OSS" #~ msgid "Manage mixer" #~ msgstr "Gère le mixeur" #~ msgid "Save image as:" #~ msgstr "Sauvegarde image sous:" #~ msgid "Colors and Fonts" #~ msgstr "Couleurs et Polices" #, fuzzy #~ msgid "Disp" #~ msgstr "Affichage" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Filtre" #, fuzzy #~ msgid "Navtex stations file:" #~ msgstr "Enregistrer fichier macros" #~ msgid "after:" #~ msgstr "après:" #, fuzzy #~ msgid "Displays" #~ msgstr "Affichage" #~ msgid "Save log before exiting?" #~ msgstr "Sauvegarder le log avant de quitter?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Sauvegarder les macros avant de quitter?" #~ msgid "QSO Freq" #~ msgstr "Freq QSO" #~ msgid "Cnty" #~ msgstr "Pays" #~ msgid "View log" #~ msgstr "Voir log" #~ msgid "Text:" #~ msgstr "Texte:" #~ msgid "Callsign DB" #~ msgstr "BdD Indicatifs" #~ msgid "CDROM" #~ msgstr "CDROM" #, fuzzy #~ msgid "On Date" #~ msgstr "Date QSO" #, fuzzy #~ msgid "Off Date" #~ msgstr "Date QSO" #~ msgid "Open logbook..." #~ msgstr "Ouvrir journal..." #~ msgid "Could not write to %s" #~ msgstr "Echec écriture vers %s" #~ msgid "Label:" #~ msgstr "Libellé:" #~ msgid "Rig Not Specified" #~ msgstr "Aucune radio spécifiée" #~ msgid "8" #~ msgstr "8" #~ msgid "Foreground" #~ msgstr "Avant plan" #~ msgid "Oper' Controls" #~ msgstr "Contrôles Oper'" #~ msgid "Viewer" #~ msgstr "Visualiseur" #, fuzzy #~ msgid "No Rig-Log" #~ msgstr "Control Radio" #, fuzzy #~ msgid "Min Rig-Log" #~ msgstr "Control Radio" #~ msgid "Show config" #~ msgstr "Montrer config" #~ msgid "*** DUP ***" #~ msgstr "*** DUP ***" #~ msgid "&Digiscope" #~ msgstr "&Digiscope" #~ msgid "&PSK Browser" #~ msgstr "Navigateur &PSK" #~ msgid "&Call" #~ msgstr "&Indicatif" #~ msgid "&Name" #~ msgstr "&Nom" #~ msgid "QT&H" #~ msgstr "QT&H" #~ msgid "&State" #~ msgstr "&Etat" #~ msgid "&Province" #~ msgstr "&Province" #~ msgid "Countr&y" #~ msgstr "Pa&ys" #~ msgid "&Transmit" #~ msgstr "&Transmet" #~ msgid "&Receive" #~ msgstr "&Reçoit" #~ msgid "&Abort" #~ msgstr "&Annuler" #~ msgid "&Copy" #~ msgstr "&Copier" #~ msgid "C&lear" #~ msgstr "E&ffacer" #~ msgid "Cu&t" #~ msgstr "Cou&per" #~ msgid "&Paste" #~ msgstr "Co&ller" #~ msgid "Non CAT mode" #~ msgstr "Mode hors CAT" #~ msgid "9" #~ msgstr "9" #~ msgid "" #~ "\n" #~ "System: " #~ msgstr "" #~ "\n" #~ "Système: " #~ msgid "Psk Viewer" #~ msgstr "Visualiseur Psk" #~ msgid "No PTT available" #~ msgstr "Aucun PTT dispo" #~ msgid "SQL on/off" #~ msgstr "SQL marche/arrêt" #~ msgid "Waterfall/FFT - Shift click for signal scope" #~ msgstr "Chute d'eau/FFT - Shift clic pour scope signal" #~ msgid "Log File" #~ msgstr "Fichier de Log" #~ msgid "Paths" #~ msgstr "Chemins" #~ msgid "Slow" #~ msgstr "Lent" #~ msgid "Fast" #~ msgstr "Rapide" #~ msgid "X-scope" #~ msgstr "X-ccope" #~ msgid "Qrz" #~ msgstr "Qrz" #~ msgid "H/W ptt" #~ msgstr "H/W ptt" #~ msgid "Xml File" #~ msgstr "Fichier Xml" #~ msgid "SndCrd" #~ msgstr "SndCrd" #~ msgid "Wfall" #~ msgstr "Wfall" fldigi-4.1.06/po/it.po0000664000175000017500000070243613515625024011374 00000000000000# Italian translations for fldigi package. # Copyright (C) 2011 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Pierfrancesco Caci , 2011. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.01\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2011-12-03 13:04+0100\n" "Last-Translator: Pierfrancesco Caci \n" "Language-Team: Italian\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "%s log iniziato il %s" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "" #: src/main.cxx:1710 #, fuzzy msgid "Bad frequency" msgstr "Frequenza radio" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licenza GPLv3+: GNU GPL versione 3 o successiva \n" "Questo e` un programma libero: siete liberi di modificarlo e " "ridistribuirlo.\n" "Questo programma non e` coperto da alcuna garanzia, salvo gli obblighi di " "legge.\n" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 #, fuzzy msgid "Could not make directory " msgstr "Impossibile creare la directory" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "Salva tutto il testo RX/TX" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "Controllo della radio" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "&Modo Op" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Mostra meno modi" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Mostra tutti i modi" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "&Vedi" #: src/dialogs/fl_digi.cxx:198 #, fuzzy msgid "MFSK Image" msgstr "Immagine &MFSK" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:200 #, fuzzy msgid "IFKP Raw Image" msgstr "Immagine &MFSK" #: src/dialogs/fl_digi.cxx:201 #, fuzzy msgid "Weather Fax Image RX" msgstr "Immagine &Fax Meteo" #: src/dialogs/fl_digi.cxx:202 #, fuzzy msgid "Weather Fax Image TX" msgstr "Immagine &Fax Meteo" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "&Paesi" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "Aspetto" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "Tutto" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Nessuno" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "Oscilloscopio incorporato" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "Controlli minimi" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "Mostra canali" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "Altro..." #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "Salvare le macro modificate?" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "Annulla" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Salva" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "Non salvare" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "No" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Sí" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "" #: src/dialogs/fl_digi.cxx:2700 #, fuzzy msgid "channels != 1" msgstr "Mostra canali" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "Spotting disabilitato" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Non ho potuto lanciare un browser web:\n" "%s\n" "\n" "Apri questo URL manualmente:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Non posso aprire l'url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Controllo aggiornamenti in corso..." #: src/dialogs/fl_digi.cxx:2858 #, fuzzy msgid "Update site not available" msgstr "Non disponibile" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "Stai già usando la versione più recente" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "Stai già usando la versione più recente" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "La versione %s è disponible su\n" "\n" "%s\n" "\n" "Cosa vuoi fare?" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "Creazione di macchie solari in corso!" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Le informazioni sul device audio sono disponibili solo per il backend " "PortAudio" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "Periferica di cattura" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "Periferica di riproduzione" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Periferiche di cattura e di uscita" #: src/dialogs/fl_digi.cxx:3017 #, fuzzy, c-format msgid "%s: Do not exist, create?" msgstr "Non esiste, creare?" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "Cancella i campi del log?" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:4525 #, fuzzy msgid "Save changed configuration?" msgstr "Salvare le modifiche alla configurazione prima di uscire?" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 #, fuzzy msgid "Save log entry?" msgstr "Salva il file di log" #: src/dialogs/fl_digi.cxx:4557 #, fuzzy msgid "Confirm Quit" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:4579 #, fuzzy msgid "Confirm quit?" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "&File" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Cartelle" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Configurazioni di Fldigi..." #: src/dialogs/fl_digi.cxx:5865 #, fuzzy msgid "FLMSG files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:5867 #, fuzzy msgid "Data files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "Macro" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Apri..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Salva..." #: src/dialogs/fl_digi.cxx:5875 #, fuzzy msgid "Config Scripts" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5877 #, fuzzy msgid "Generate" msgstr "Generale" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "Cattura testo" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "Cattura RX" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "Genera TX" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "Riproduzione" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Esci" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "&Configura" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "Aspetto" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "Colori && Caratteri" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "Operatore" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "Interfaccia Utente" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "Waterfall" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "Controlli waterfall" #: src/dialogs/fl_digi.cxx:6146 #, fuzzy msgid "Operating" msgstr "Operatore" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 #, fuzzy msgid "Active Modem" msgstr "Modi ricezione" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "Scheda Audio" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "" #: src/dialogs/fl_digi.cxx:6155 #, fuzzy msgid "CPU speed" msgstr "Velocità AFC" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/fl_digi.cxx:6157 #, fuzzy msgid "PSKmail" msgstr "Pskmail" #: src/dialogs/fl_digi.cxx:6158 #, fuzzy msgid "PSK reporter" msgstr "PSK Reporter" #: src/dialogs/fl_digi.cxx:6159 #, fuzzy msgid "Sweet spot" msgstr "Frequenza preferita" #: src/dialogs/fl_digi.cxx:6160 #, fuzzy msgid "Text IO" msgstr "Testo" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Altro" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "ID" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 #, fuzzy msgid "IO" msgstr "IOTA" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notifiche" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 #, fuzzy msgid "PSM" msgstr "PSK" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 #, fuzzy msgid "Test Signals" msgstr "Segnale trasmesso" #: src/dialogs/fl_digi.cxx:6175 #, fuzzy msgid "Contest/Logging" msgstr "Contestia" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Salva Configurazione" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Mostra/nascondi Canali" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "Navigatore segnali" #: src/dialogs/fl_digi.cxx:6190 #, fuzzy msgid "View/Hide 48 macros" msgstr "Mostra/nascondi Canali" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "Finestra oscilloscopio" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6205 #, fuzzy msgid "Rig/Log Controls" msgstr "Controllo della radio" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "&Log" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "&Vedi" #: src/dialogs/fl_digi.cxx:6221 #, fuzzy msgid "Files" msgstr "&File" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Apri..." #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Nuovo" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "Unisci..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "Esporta..." #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6234 #, fuzzy msgid "Reports" msgstr "rapporti" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "Testo..." #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6242 #, fuzzy msgid "Field Day Logging" msgstr "Azione della rotella del mouse" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "&Aiuto" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "Crea macchie solari" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "Guida per principianti" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "Documentazione on-line..." #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Sito web Fldigi..." #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "Rapporti d'ascolto..." #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Opzioni da riga di comando" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "Informazioni sulla scheda audio" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "Informazioni sulla compilazione" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "Log eventi" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Verifica aggiornamenti..." #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "Inform&azioni" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "modalitá solo waterfall" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "NOMINATIVO NON IMPOSTATO" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Chiudi la lista" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Apri la lista" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "Cancella la lista?" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "rapporto" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "rapporti" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "Attivitá recenti per il quadratone" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "Navigatore dei segnali" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "Scope" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Livello del segnale ricevuto" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Livello squelch" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Tasto sinistro: cambia modo\n" "Tasto destro: configura" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "Velocitá di trasmissione CW (WPM)" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "Velocitá predefinita (WPM)" #: src/dialogs/fl_digi.cxx:8188 #, fuzzy msgid "Tx level attenuator (dB)" msgstr "Attenuatore Tx" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "Controllo Automatico di Frequenza" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:8226 #, fuzzy msgid "Power Signal Monitor" msgstr "Tono prima del segnale" #: src/dialogs/fl_digi.cxx:9943 #, fuzzy msgid "Delete entry?" msgstr "Salva il file di log" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Tutto" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "Trova:" #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Chiudi" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "Canc." #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Tasto sinistro per cancellare il testo\n" "Tasto destro per resettare le frequenze" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "Imposta Squelch per il Viewer" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "Esporta in formato CSV" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "Esporta in formato di testo a campi fissi" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "Esporta in formato ADIF" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "Salvare le modifiche al log?" #: src/logbook/logsupport.cxx:381 #, fuzzy msgid "Create new logbook file" msgstr "Salvare le modifiche al log?" #: src/logbook/logsupport.cxx:404 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "Non esiste, creare?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Apri il file di log" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Salva il file di log" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "Unisci file ADIF" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "Aggiorna" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Vuoi veramente cancellare il record per \"%s\"?" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "Crea il log in formato cabrillo" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Rileva la presenza di [WRAP:beg] e [WRAP:end].\n" "Salve le etichette e tutto il testo da esse racchiuso in un file\n" "marcato con data e ora, per es.:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Rileva la presenza di [WRAP:beg] e [WRAP:end].\n" "Salve le etichette e tutto il testo da esse racchiuso in un file\n" "marcato con data e ora, per es.:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "Impossibile avviare flmsg" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "Trova l'eseguibile di flmsg" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:494 #, fuzzy msgid "Locate executable" msgstr "Trova l'eseguibile di flmsg" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:497 #, fuzzy msgid "Locate binary" msgstr "Locator" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Salva tutto il tesxto ricevuto, un carattere alla volta, su questo file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "Modo Radio" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Sempre LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Sempre USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Resetta tutte le opzioni ai loro valori predefiniti?\n" "\n" "Il reset delle opzioni avrà effetto al prossimo riavvio\n" "I file fldigi_def.xml e fldigi.prefs sarabbi cancellati!\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Confermare il RESET" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "Silenzioso" #: src/misc/debug.cxx:89 msgid "Error" msgstr "Errori" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "Avvisi" #: src/misc/debug.cxx:89 msgid "Info" msgstr "Informazioni" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "Verboso" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "Controllo ARQ" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:105 #, fuzzy msgid "KISS control" msgstr "Controllo della radio" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "Origine dei log" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "Cambia livello di log" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tla mia frequenza" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tmodo" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\til mio nominativo" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\til mio locator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\til mio nome" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\til mio QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\til mio RST" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy FD class" msgstr "\til mio nominativo" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy state" msgstr "\til mio nome" #: src/misc/macroedit.cxx:81 #, fuzzy msgid "\tmy ST" msgstr "\til mio RST" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:83 #, fuzzy msgid "\tmy CNTY" msgstr "\til mio QTH" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:85 #, fuzzy msgid "\toperating band" msgstr "\tfine rapporto" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "\\tVersione Fldigi" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "\tnominativo del corrispondente" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "\tnome del corrispondente" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "\tQTH del corrispondente" #: src/misc/macroedit.cxx:93 #, fuzzy msgid "\tother State" msgstr "\tRST del corrispondente" #: src/misc/macroedit.cxx:94 #, fuzzy msgid "\tother Province" msgstr "\tnome del corrispondente" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "\tlocator del corrispondente" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "\tRST del corrispondente" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "\\tS/N ecc." #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "\\tIMD ecc." #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "\tmappa su Google" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "\tmappa con parametri" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "\tcancella la finestra di ricezione" #: src/misc/macroedit.cxx:112 #, fuzzy msgid "\tclear TX pane" msgstr "\tcancella la finestra di ricezione" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "\tdal testo a NOME/QTH" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk On, Off, Toggle" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "\tcancella i campi del log" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "\tsalva i dati del QSO" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "\tmetti a log quando questa macro viene trasmessa" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "\tora del QSO (HHMM)" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:137 #, fuzzy msgid "\tlocal time, default %H%M" msgstr "\tora locale HHMM" #: src/misc/macroedit.cxx:138 #, fuzzy msgid "\tzulu time default %H%MZ" msgstr "\tora zulu (UTC) HHMMZ" #: src/misc/macroedit.cxx:139 #, fuzzy msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tdata locale YYYY-MM-DD" #: src/misc/macroedit.cxx:140 #, fuzzy msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tdata zulu (UTC) YYYY-MM-DD Z" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "\tcontatore per contest" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "\tdecrementa il contatore" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "\tincrementa il contatore" #: src/misc/macroedit.cxx:148 #, fuzzy msgid "\texchange in" msgstr "\tfine rapporto" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "\trapporto dato" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "\tinizio rapporto" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "\tfine rapporto" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "\tsalva rapporto contest" #: src/misc/macroedit.cxx:153 #, fuzzy msgid "\tcurrent contest serno" msgstr "\tdecrementa il contatore" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD class" msgstr "\til mio nominativo" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tFD section" msgstr "Seriale ricevuto" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "\tcontest class" msgstr "\til mio nominativo" #: src/misc/macroedit.cxx:158 #, fuzzy msgid "
\tARRL section" msgstr "Seriale ricevuto" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "\tricevi" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "\ttrasmetti" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "\tscambia T/R" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "\tcerca un segnale a salire" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "\tcerca un segnale a scendere" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "\tritorna alla frequenza preferita" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "\tvai alla freq NNNN" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "\tqsy a kHz, Hz" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "\tcambia modo radio valido" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "\timposta un filtro valido sulla radio" #: src/misc/macroedit.cxx:174 #, fuzzy msgid "\tvalid xcvr low cutoff filter" msgstr "\timposta un filtro valido sulla radio" #: src/misc/macroedit.cxx:175 #, fuzzy msgid "\tvalid xcvr hi cutoff filter" msgstr "\timposta un filtro valido sulla radio" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:183 #, fuzzy msgid "\tinsert image file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 #, fuzzy msgid "\tpause transmit" msgstr "\ttrasmetti" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "\tsegnale idle per NN.nn sec" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "\tripeti ogni NN sec" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tsegnale di accordo per NN sec" #: src/misc/macroedit.cxx:191 #, fuzzy msgid "\tdelay xmt for NN.n sec" msgstr "\tritarda la trasmissione per NN sec" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tripeti la macro continuamente" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "\tidentificazione in CW" #: src/misc/macroedit.cxx:200 #, fuzzy msgid "\tsend mode ID; TX start only" msgstr "\ttrasmetti ID del modo in testo video" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RSID on,off,toggle" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID on,off,toggle" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "\tCW QSK post-timing" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK pre-timing" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "\tCW rise time" #: src/misc/macroedit.cxx:216 #, fuzzy msgid "\tCW WPM:Farnsworth" msgstr "\tCW WPM" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "\tAFC on,off,toggle" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "\tLOCK on,off,toggle" #: src/misc/macroedit.cxx:225 #, fuzzy msgid "\tRev on,off,toggle" msgstr "\tAFC on,off,toggle" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "\tcambia il file delle macro" #: src/misc/macroedit.cxx:229 #, fuzzy msgid "\tsave current macro file" msgstr "Salva file delle macro" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:243 #, fuzzy msgid "\tWAV file; spec' file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:247 #, fuzzy msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAFC on,off,toggle" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "File di testo da inserire" #: src/misc/macroedit.cxx:384 #, fuzzy msgid "Test text file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:394 #, fuzzy msgid "MFSK image file" msgstr "Carica file immagine" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "Modifica al file delle macro" #: src/misc/macroedit.cxx:414 #, fuzzy msgid "Select wav file" msgstr "Seleziona il dispositivo" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "File eseguibile da inserire" #: src/misc/macroedit.cxx:457 #, fuzzy msgid "Macro Text" msgstr "Editor delle macro - " #: src/misc/macroedit.cxx:462 #, fuzzy msgid "Select Tag" msgstr "Seleziona Tag:" #: src/misc/macroedit.cxx:474 #, fuzzy msgid "Macro Button Label" msgstr "Etichetta sul Pulsante Macro:" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "Editor delle macro - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Apri file delle macro" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 #, fuzzy msgid "Fldigi macro definition file\t*.{mdf}" msgstr "File di definizione delle macro per Fldigi\t*.mdf" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "Salva file delle macro" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "" #: src/misc/newinstall.cxx:389 #, fuzzy msgid "Back" msgstr "Sfondo" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" #: src/misc/newinstall.cxx:540 #, fuzzy msgid "Fldigi configuration wizard" msgstr "Configurazione di Fldigi" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "Tempo necessario: " #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "Carica file immagine" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Invia immagine" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Carica o trascina un file immagine\n" "Formati supportati: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "Velocità di trasferimento, X1-normale" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "Carica" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "Waterfall / FFT / Oscilloscopio" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Livello superiore del segnale (dB)" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "Campo di variazione del segnale (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Cambia la scala del waterfall" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "Scorri la porzione visualizzata verso frequenze piú basse" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "Centra la visualizzazione sul segnale" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "Scorri la porzione visualizzata verso frequenze piú alte" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "Velocità del waterfall" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "Aggiusta la frequenza del cursore" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centra nella banda passante\n" "Tasto destro per tornare indietro" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Registra modo e frequenza\n" "Tasto destro per la lista" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Blocca la frequenza di trasmissione" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "Inverti" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Trasmetti/Ricevi" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "Area AFC o banda" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "Ricerca segnali" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "Portante del modo" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "Scorrimento" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Apri file rig xml" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "File di definizione rig xml\t*.xml" #: src/soundcard/sound.cxx:170 #, fuzzy msgid "Waveform Audio Format\t*.wav\n" msgstr "" "Formato audio\t*.wav\n" "AU\t*.{au,snd}\n" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Free Lossless Audio Codec\t*.flac" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "File audio" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "Il mio nominativo de CALL" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "Stazione sentita due volte" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "Ricerca testo personalizzato" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "Ricezione RSID" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "Scambia" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "Rimuovi" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Seleziona" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "Continente" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "Zona ITU" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "Zona CQ" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "Deseleziona" #: src/spot/notify.cxx:519 msgid "Add" msgstr "Aggiungi" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Seleziona tutto" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "Cancella tutto" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "Paese" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "Il campo regular expression non puó essere vuoto." #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "La regular expression deve essere valida." #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "Imposta il tuo nominativo, prima." #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Lancia il programma" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" "Default test string is:\n" " \"" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "Imposta la frase di prova o lascia in bianco per il predefinito:" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "Questa regular expression per gli eventi non è valida." #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "" "La frase di test non corrisponde allo schema di ricerca di questo evento." #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "Sottostringhe disponibili" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "Frequenza" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "Nominativo" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Apri palette" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "Palette Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "Salva palette" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "Cerca nominativo" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "Nominativo" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "Nome" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "Stato" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 #, fuzzy msgid "County" msgstr "Paese" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "Rapporto ricevuto" #: src/widgets/FTextRXTX.cxx:161 #, fuzzy msgid "Rx Serial #" msgstr "Seriale ricevuto" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 #, fuzzy msgid "Section" msgstr "Azione" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 #, fuzzy msgid "SS check" msgstr "Seleziona tutto" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 #, fuzzy msgid "SS section" msgstr "Azione" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 #, fuzzy msgid "QSOp state" msgstr "Data di inizio del QSO" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 #, fuzzy msgid "QSOp name" msgstr "Nomi degli operatori" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Inserisci marker" #: src/widgets/FTextRXTX.cxx:198 #, fuzzy msgid "All entries" msgstr "Tentativi" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "Suggerimenti scorrimento" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "Ultimo QSO" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Transmetti" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "Ricevi" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "Annulla" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Invia image..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 #, fuzzy msgid "Spec Char" msgstr "Seleziona la parità" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 #, fuzzy msgid "A" msgstr "Az" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 #, fuzzy msgid "E" msgstr "Ex" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "IOTA" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "No" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 #, fuzzy msgid "O" msgstr "OK" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 #, fuzzy msgid "U" msgstr "Aspetto" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Inserisci testo" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Salva testo come" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Copia" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Salva come..." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "Vai a capo" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Taglia" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Incolla" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Inserisci file..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Annulla" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "Cancella" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, fuzzy, c-format msgid "Executing script file: %s" msgstr "Seleziona il file con la descrizione della radio" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:394 #, fuzzy msgid "Command Not Found" msgstr "Opzioni da riga di comando" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:414 #, fuzzy msgid "General Error" msgstr "Generale" #: src/config_script/script_parsing.cxx:418 #, fuzzy msgid "No Errors" msgstr "Errori" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "no" msgstr "Informazioni" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "yes" msgstr "Sí" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Mostra" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "Nascondi" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "Configurazione di Fldigi" #: src/dialogs/confdialog.cxx:8227 #, fuzzy msgid "Station / Operator" msgstr "Stazione sentita due volte" #: src/dialogs/confdialog.cxx:8230 #, fuzzy msgid "Station Callsign:" msgstr "Nominativi degli operatori" #: src/dialogs/confdialog.cxx:8231 #, fuzzy msgid "Station callsign" msgstr "Nominativi degli operatori" #: src/dialogs/confdialog.cxx:8244 #, fuzzy msgid "Operator Callsign:" msgstr "Nominativi degli operatori" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:8259 #, fuzzy msgid "Operator Name:" msgstr "Nomi degli operatori" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Nomi degli operatori" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "Antenna:" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "Breve descrizione dell'antenna" #: src/dialogs/confdialog.cxx:8287 #, fuzzy msgid "Station QTH:" msgstr "Stazione" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "QTH degli operatori" #: src/dialogs/confdialog.cxx:8301 #, fuzzy msgid "Station Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "Locator come in JN53rw" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Canali, il primo canale parte al limite inferiore del waterfall" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "Cambia il numero di canali nel visualizzatore psk." #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "Tempo di inattività" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Cancella il testo del canale dopo\n" "# secondi di inattività" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Etichetta del canale" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Aspetto dell'etichetta di ciascun canale" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "Frequenza audio" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "Frequenza radio" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "Numero del canale" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "Caratteri..." #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "Seleziona i caratteri usati nel navigatore" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "Intervalli fissi" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forza la spaziatura dei canali a incrementi regolari di 100 Hz" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "Scorrimento continuo" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "ON - Scorrimento continuo\n" "OFF - Cancella e riparti" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "Frequenza piú bassa in basso nel navigatore" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "Cambia l'ordinamento da alto a basso dei canali" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "Riproduci il buffer audio quando viene selezionato il canale attivo" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "Il buffer audio viene decodificato per il segnale selezionato" #: src/dialogs/confdialog.cxx:8467 #, fuzzy msgid "Detection Level" msgstr "Colori livello decodifica" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "Sfondo" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "Colore di sfondo del controllo squelch del navigatore segnali" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "Pulsante" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "Colore evidenziato del cursore nel controllo squelch del navigatore" #: src/dialogs/confdialog.cxx:8483 #, fuzzy msgid "Browser Line Colors" msgstr "Colori di sistema" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:8497 #, fuzzy msgid "Even" msgstr "Evento" #: src/dialogs/confdialog.cxx:8498 #, fuzzy msgid "Even lines" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:8503 #, fuzzy msgid "Odd" msgstr "Aggiungi" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "" #: src/dialogs/confdialog.cxx:8510 #, fuzzy msgid "Select line" msgstr "Seleziona tutto" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "Generale" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Mostra suggerimenti" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "Abilita / disabilita suggerimenti" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Mostra le icone del menu" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "Abilita / disabilita le icone dei menu" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "Schema" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Cambia l'aspetto del programma" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "Modi visibili" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Seleziona i modi accessibili dal menú" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "Lingua" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Le modifiche avranno effetto al prossimo avvio del programma" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Stampa CW / RTTY / THROB / CONTESTIA in minuscolo" #: src/dialogs/confdialog.cxx:8591 #, fuzzy msgid "Transmit lower case text" msgstr "Trasmetti il tono di avvio basso" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "" #: src/dialogs/confdialog.cxx:8601 #, fuzzy msgid "Prompt to save Configuration" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 #, fuzzy msgid "Prompt to save macro file" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "Annoiami con la richiesta di salvare il log" #: src/dialogs/confdialog.cxx:8618 #, fuzzy msgid "Confirm exit" msgstr "Conferma" #: src/dialogs/confdialog.cxx:8625 #, fuzzy msgid "Check for updates" msgstr "Verifica aggiornamenti..." #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "" #: src/dialogs/confdialog.cxx:8638 #, fuzzy msgid "Show TX timer" msgstr "Mostra le entità DXCC" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 #, fuzzy msgid "Log" msgstr "Loc" #: src/dialogs/confdialog.cxx:8658 #, fuzzy msgid "QSO" msgstr "QSY" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "Log dei QSO" #: src/dialogs/confdialog.cxx:8662 #, fuzzy msgid "Prompt to save log on exit" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "Cancella i campi quando salvi" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "Cancella i campi del log dopo aver salvato o usato la macro " #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "Converti il campo nominativo a maiuscole" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "Forza il campo nominativo a MAIUSCOLE" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Paese e Azimuth automatici" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Riempi i campi Paese / Azimuth con le informazioni dal file cty.dat" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "Ordina per data/ora di fine QSO" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Ordina il log in base all'ora/data di fine QSO\n" "Influisce su tutti i file esportati in ADIF/Cabrillo" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "Data di inizio == fine" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "Forza data e ora di inizio QSO uguali a quelle di fine" #: src/dialogs/confdialog.cxx:8698 #, fuzzy msgid "Default RST in to 599/59" msgstr "RST dato automaticamente 599" #: src/dialogs/confdialog.cxx:8699 #, fuzzy msgid "Clear log controls sets RST in to 599/59" msgstr "Premendo cancella log imposta RST dato automaticamente a 599" #: src/dialogs/confdialog.cxx:8704 #, fuzzy msgid "Default RST out to 599/59" msgstr "RST dato automaticamente 599" #: src/dialogs/confdialog.cxx:8705 #, fuzzy msgid "Clear log controls sets RST out to 599/59" msgstr "Premendo cancella log imposta RST dato automaticamente a 599" #: src/dialogs/confdialog.cxx:8710 #, fuzzy msgid "cty.dat folder" msgstr "Ripristina predefiniti" #: src/dialogs/confdialog.cxx:8711 #, fuzzy msgid "Enter full path-name for cty.dat folder" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:8724 #, fuzzy msgid "Browse" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "Predefinito" #: src/dialogs/confdialog.cxx:8729 #, fuzzy msgid "Restore cty.dat default folder" msgstr "Ripristina predefiniti" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "Potenza trasmissione" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "Potenza Tx usata nei campi del log" #: src/dialogs/confdialog.cxx:8751 #, fuzzy msgid "Display logbook read datum at start" msgstr "Mostra il nome del file delle macro all'avvio" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "Il nome del file viene scritto nell'area del testo Rx" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 msgid "Rx Text" msgstr "Testo Rx" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:8772 #, fuzzy msgid "callsign tooltips in received text" msgstr "Mostra le informazioni sul nominativo nel testo ricevuto" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Tenendo il mouse per piú di due secondi su un nominativo appare popup con " "informazioni" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "Delimitatori di parola" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "L'inserimento dei dati del QSO dal testo ricevuto è delimitato\n" "dai caratteri definiti qui. Tab e a capo sono sempre inclusi." #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:8801 #, fuzzy msgid "Clear log fields - new CALL" msgstr "Cancella i campi del log?" #: src/dialogs/confdialog.cxx:8812 #, fuzzy msgid "Connect to MacLogger" msgstr "Modifica al file delle macro" #: src/dialogs/confdialog.cxx:8817 #, fuzzy msgid "Capture Radio Report" msgstr "Crea il log in formato cabrillo" #: src/dialogs/confdialog.cxx:8823 #, fuzzy msgid "Capture Log Report" msgstr "Crea il log in formato cabrillo" #: src/dialogs/confdialog.cxx:8828 #, fuzzy msgid "Capture Lookup " msgstr "Cattura" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 #, fuzzy msgid "Enable UDP log file" msgstr "Abilita tutto" #: src/dialogs/confdialog.cxx:8848 #, fuzzy msgid "UDP data stream" msgstr "Origine dei log" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8868 #, fuzzy msgid "Clear text" msgstr "Cancella la lista" #: src/dialogs/confdialog.cxx:8871 msgid "Address" msgstr "" #: src/dialogs/confdialog.cxx:8872 msgid "N3FJP Server IP Address" msgstr "" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 #, fuzzy msgid "Port" msgstr "Porta:" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" #: src/dialogs/confdialog.cxx:8905 #, fuzzy msgid "Enable Data Stream" msgstr "Abilita il flusso del testo ricevuto" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 msgid "Connect" msgstr "" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 msgid "Connected" msgstr "" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 #, fuzzy msgid "Contests" msgstr "Contest" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 #, fuzzy msgid "State QSO Party" msgstr "Data di inizio del QSO" #: src/dialogs/confdialog.cxx:8980 #, fuzzy msgid "Text capture order" msgstr "Cattura testo" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Context Notes" msgstr "Contest" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "Controllo duplicati, nominativo piú" #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "On/Off" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Controlla duplicati" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Banda" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "Le banda deve coincidere" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "Modo" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "Il modo deve coincidere" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "Arco di tempo" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "Il QSO non si deve ripetere in un arco di tempo di" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "Colore duplic." #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/confdialog.cxx:9029 #, fuzzy msgid "? Dup Color" msgstr "Colore duplic." #: src/dialogs/confdialog.cxx:9030 #, fuzzy msgid "Left click to select possible dup color" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "il rapporto a campo libero deve coincidere" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "Lo stato deve coincidere" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "minuti" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "Inserisci l'arco temporale in minuti" #: src/dialogs/confdialog.cxx:9069 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Rapporto contest ricevuto" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 #, fuzzy msgid "Send" msgstr "Invia:" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "rapporto a formato libero" #: src/dialogs/confdialog.cxx:9087 #, fuzzy msgid "RST always 599/59" msgstr "RST sempre 599" #: src/dialogs/confdialog.cxx:9088 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "Forza RST tx/rx a 599" #: src/dialogs/confdialog.cxx:9093 #, fuzzy msgid "Send CW cut #'s" msgstr "Abbrevia i numeri in CW" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:9101 #, fuzzy msgid "Start Nbr" msgstr "Parti da" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "Numero di partenza" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Cifre" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "Numero di cifre nel numero progressivo" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "Metti zeri davanti" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "Metti zeri davanti al numero seriale trasmesso" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Azzera" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "Inizializza i campi di log del QSO" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 #, fuzzy msgid "Operator Call" msgstr "Nomi degli operatori" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:9170 #, fuzzy msgid "My Section" msgstr "Azione" #: src/dialogs/confdialog.cxx:9171 #, fuzzy msgid "Field Day Section" msgstr "Azione della rotella del mouse" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 #, fuzzy msgid "Scout Operator Name" msgstr "Nomi degli operatori" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "Rotella del mouse attiva sui pulsanti macro" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "" "Abilita l'uso della rotella del mouse per il controllo della barra delle " "macro" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Numero e posizione delle barre delle macro" #: src/dialogs/confdialog.cxx:9282 #, fuzzy msgid "Button Height" msgstr "Pulsante" #: src/dialogs/confdialog.cxx:9283 #, fuzzy msgid "Height of macro bar" msgstr "Numero e posizione delle barre delle macro" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" #: src/dialogs/confdialog.cxx:9299 #, fuzzy msgid "One above waterfall" msgstr "Una barra (sopra il waterfall)" #: src/dialogs/confdialog.cxx:9304 #, fuzzy msgid "One below waterfall" msgstr "Una barra (sotto il waterfall)" #: src/dialogs/confdialog.cxx:9309 #, fuzzy msgid "Two scheme 1" msgstr "Due barre (schema 1)" #: src/dialogs/confdialog.cxx:9314 #, fuzzy msgid "Two scheme 2" msgstr "Due barre (schema 2)" #: src/dialogs/confdialog.cxx:9319 #, fuzzy msgid "Two scheme 3" msgstr "Due barre (schema 3)" #: src/dialogs/confdialog.cxx:9324 #, fuzzy msgid "Two scheme 4" msgstr "Due barre (schema 4)" #: src/dialogs/confdialog.cxx:9329 #, fuzzy msgid "Two scheme 5" msgstr "Due barre (schema 5)" #: src/dialogs/confdialog.cxx:9334 #, fuzzy msgid "Two scheme 6" msgstr "Due barre (schema 6)" #: src/dialogs/confdialog.cxx:9339 #, fuzzy msgid "Two scheme 7" msgstr "Due barre (schema 1)" #: src/dialogs/confdialog.cxx:9344 #, fuzzy msgid "Two scheme 8" msgstr "Due barre (schema 1)" #: src/dialogs/confdialog.cxx:9349 #, fuzzy msgid "Two scheme 9" msgstr "Due barre (schema 1)" #: src/dialogs/confdialog.cxx:9354 #, fuzzy msgid "Two scheme 10" msgstr "Due barre (schema 1)" #: src/dialogs/confdialog.cxx:9363 #, fuzzy msgid "Load last used macro file at start" msgstr "All'avvio carica l'ultimo file delle macro usato" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - usa l'ultimo file delle macro\n" "OFF - usa il file predefinito" #: src/dialogs/confdialog.cxx:9369 #, fuzzy msgid "Display macro filename at start" msgstr "Mostra il nome del file delle macro all'avvio" #: src/dialogs/confdialog.cxx:9385 #, fuzzy msgid "Show macro control codes" msgstr "Mostra l'editor delle macro" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9405 #, fuzzy msgid "WF Ctrls" msgstr "Controlli WF" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "Abilita le selezioni per mostrare i rispettivi controlli di operatore" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "Ingrandimento WF" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "Portante WF" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "Controlli scorrimento WF" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "Livello di riferimento WF" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "Velocita' verticale WF" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "WF amp span" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "Memorie WF" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "Modo WF" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "Blocca freq trasmissione" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "Abilita tutto" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:9489 #, fuzzy msgid "Clrs/Fnts" msgstr "Colori && Caratteri" #: src/dialogs/confdialog.cxx:9492 #, fuzzy msgid "Rx/Tx" msgstr "Testo Rx/Tx" #: src/dialogs/confdialog.cxx:9494 #, fuzzy msgid "Rx/Tx Character set" msgstr "Seleziona il carattere a scansione per la trasmissione" #: src/dialogs/confdialog.cxx:9495 #, fuzzy msgid "Select Rx/Tx Character Set" msgstr "Seleziona il carattere a scansione per la trasmissione" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "Sfondo Rx" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "Sfondo Tx" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "Caratt. Rx" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "Caratt. Tx" #: src/dialogs/confdialog.cxx:9539 #, fuzzy msgid "Macro Edit Font" msgstr "Editor delle macro - " #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "TRASM" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "Caratteri inviati nelle finestre Rx/Tx" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "Caratteri di controllo nelle finestre Rx/Tx" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "Salta" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Caratteri saltati nella finestra Tx\n" "(Tx on/off in CW)" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "Colore alternativo dei caratteri nella finestra Rx" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "Colore del testo selezionato nelle finestre Rx/Tx" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "Sistema" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "Predefiniti" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "Caratteri" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "Colore Sfondo" #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "Colore delle cifre" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "Colori di sistema" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 #, fuzzy msgid "Scale Color" msgstr "Colore dei Tab" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 #, fuzzy msgid "Meter Color" msgstr "Colore delle cifre" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "Seleziona il tipo di prefiltro FFT" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "" #: src/dialogs/confdialog.cxx:9666 #, fuzzy msgid "Logging Panel Controls" msgstr "Controlli minimi" #: src/dialogs/confdialog.cxx:9686 #, fuzzy msgid "Logbook Dialog" msgstr "Log" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 #, fuzzy msgid "Report Browser" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:9721 #, fuzzy msgid "Even Lines" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:9726 msgid "Odd Lines" msgstr "" #: src/dialogs/confdialog.cxx:9731 #, fuzzy msgid "Stream Text" msgstr "Testo secondario" #: src/dialogs/confdialog.cxx:9737 #, fuzzy msgid "Bg color" msgstr "Colore Sfondo" #: src/dialogs/confdialog.cxx:9743 #, fuzzy msgid "Alt Color" msgstr "Colore" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:9755 #, fuzzy msgid "F_keys" msgstr "Tasti funzione" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "Usa pulsanti colorati" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Gruppo 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "Colore di sfondo per i tasti funzione del gruppo 1" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Gruppo 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "Colore di sfondo per i tasti funzione del gruppo 2" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Gruppo 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "Colore di sfondo per i tasti funzione del gruppo 3" #: src/dialogs/confdialog.cxx:9783 #, fuzzy msgid "Font/Color" msgstr "Colori dei caratteri" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "Tab" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "Colore dei Tab" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "Pulsanti" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "Inverti" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "Accordo" #: src/dialogs/confdialog.cxx:9808 #, fuzzy msgid "RxID nar" msgstr "RxID" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "Blocca" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:9820 #, fuzzy msgid "RxID wide" msgstr "RxID" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "Colori dei pulsanti illuminati selezionati" #: src/dialogs/confdialog.cxx:9882 #, fuzzy msgid "All Others" msgstr "Altro" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 #, fuzzy msgid "Low" msgstr "Loc" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:9925 #, fuzzy msgid "Signal Level Colors" msgstr "Colori livello decodifica" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "Visualizzazione" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "Colori e cursori" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "Carica..." #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "Carica una nuova palette" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Salva..." #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "Salva questa palette" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "Larghezza di banda" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 #, fuzzy msgid "ON" msgstr "CONT" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "Mostra linee che indicano la larghezza di banda del modo sul cursore" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Colore" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "Mostra indicatori della larghezza di banda sul waterfall" #: src/dialogs/confdialog.cxx:10064 #, fuzzy msgid "Center line" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "Mostra il cursore con linea centrale" #: src/dialogs/confdialog.cxx:10088 #, fuzzy msgid "Signal tracks" msgstr "Ricerca segnali" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "Scala di frequenza" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "Mostra sempre le frequenze audio" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "Frequenze audio o RF sulla scala del waterfall" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "Scegli il carattere della scala del waterfall" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "Segnale trasmesso" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "Monitorizza il segnale trasmesso" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "Mostra il segnale trasmesso sul waterfall" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Livello del segnale" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "Imposta il livello per una buona visualizzazione" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "Elaborazione FFT" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "Limite inferiore" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "Limite inferiore di frequenza in Hz" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "Media FFT" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "Usa la media per diminuire il rumore del waterfall" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "Funzione di prefiltro a finestra FFT" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "Rettangolare" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "Triangolare" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "Limite superiore" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "Limite superiore di frequenza in Hz" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "Mostrami piú o meno waterfall" #: src/dialogs/confdialog.cxx:10268 #, fuzzy msgid "Slow drop rate" msgstr "Velocita' verticale WF" #: src/dialogs/confdialog.cxx:10269 #, fuzzy msgid "Normal drop speed / value" msgstr "Velocità del waterfall" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "Altezza del waterfall in pixel" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "L'utilizzo della CPU aumenta con l'altezza del waterfall" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Mouse" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "Click destro o sinistro riascolta la memoria audio" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "Rianalizza i dati audio degli ultimi 2 minuti" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "Trascinare sulla scala del waterfall cambia la frequenza" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "Abilita il trascinamento del cursore sulla scala del waterfall" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "Inserisci testo con un singolo click sinistro" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Inserisci testo speciale nel pannello Rx\n" "quando fai click sul waterfall" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "La stringa viene sostituita\n" "con il modem e la frequenza correnti" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "Azione della rotella del mouse" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Scegli il comportamento della rotella\n" "del mouse all'interno del waterfall" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:10374 #, fuzzy msgid "values left/below waterfall" msgstr "Una barra (sotto il waterfall)" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10389 #, fuzzy msgid "use" msgstr "Mouse" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "Modem" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "Inseguimento" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "Inseguimento automatico velocita' in ricezione" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "Larghezza del filtro" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "Larghezza del filtro dsp CW" #: src/dialogs/confdialog.cxx:10451 #, fuzzy msgid "Matched Filt'" msgstr "Filtro" #: src/dialogs/confdialog.cxx:10452 #, fuzzy msgid "Matched Filter bandwidth" msgstr "Larghezza del filtro" #: src/dialogs/confdialog.cxx:10458 #, fuzzy msgid "Rx WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "Velocita' inseguita in CW (WPM)" #: src/dialogs/confdialog.cxx:10469 #, fuzzy msgid "Lower" msgstr "Limite inferiore" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:10490 #, fuzzy msgid "Upper" msgstr "Limite superiore" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:10511 #, fuzzy msgid "Range" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "" "L'inseguimento avviene tra il valore corrente +/-\n" "il valore impostato in questo campo" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "La mia velocitá di trasmissione in WPM" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "La velocitá predefinita di trasmissione in CW" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "Non piú piano di questo" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "Non piú veloce di questo" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "Usa la spaziatura Farnsworth" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "Temporizzazione e QSK" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "Temporizzazione" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "Peso (%)" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "Rapporto tra punto e punto-spazio" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "Rapporto linea/punto" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "Tempo di salita" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Tempo in ms di salita/discesa dell'impulso" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "" "Forma d'onda\n" "al bordo" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 #, fuzzy msgid "Edge decrease" msgstr "Il tempo di salita riduce la larghezza dell'impulso" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "Il peso diminuisce aumentando il tempo di salita" #: src/dialogs/confdialog.cxx:10735 #, fuzzy msgid "BPF transmit audio" msgstr "Velocitá di trasmissione CW (WPM)" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "Genera un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "Tempo prima dell'impulso (ms)" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "Quanti ms prima dell'impulso viene attivata la linea QSK" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "Tempo dopo l'impulso (ms)" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "Quanti ms dopo l'impulso viene disattivata la linea QSK" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "Invia continuamente" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "Invia un flusso continuo di caratteri di prova" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "Carattere di prova" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "Carattere di prova per la regolazione del QSK" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "Usa '(' come parentesi, non KN" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 #, fuzzy msgid "Ser. Port" msgstr "Porta:" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 #, fuzzy msgid "Xcvr serial port" msgstr "Porta seriale" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 #, fuzzy msgid "Connect / Disconnect from WinKeyer" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 #, fuzzy msgid "ModeReg" msgstr "Modo" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 #, fuzzy msgid "Enable paddle auto spacing of characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 #, fuzzy msgid "Enable contest character spacing" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 #, fuzzy msgid "Serial echo" msgstr "Porta seriale" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 #, fuzzy msgid "Tone ON" msgstr "Ora ON" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 #, fuzzy msgid "WPM Settings" msgstr "Impostazioni" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 #, fuzzy msgid "Min WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 #, fuzzy msgid "Rng WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 #, fuzzy msgid "Cmd WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 #, fuzzy msgid "Timing/Settings" msgstr "Impostazioni" #: src/dialogs/confdialog.cxx:11155 #, fuzzy msgid "Ratio" msgstr "Locator" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 #, fuzzy msgid "Sample" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 #, fuzzy msgid "Weight" msgstr "Peso (%)" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 #, fuzzy msgid "Bk" msgstr "Sfondo" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 #, fuzzy msgid "WPM setting" msgstr "Impostazioni" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 #, fuzzy msgid "nanoIO serial port" msgstr "Porta seriale" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 #, fuzzy msgid "Connect / Disconnect from nanoIO" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 #, fuzzy msgid "Status" msgstr "Stato" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 msgid "Paddle" msgstr "" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 #, fuzzy msgid "Comp'" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 #, fuzzy msgid "PTT off" msgstr "TX offset" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:11553 #, fuzzy msgid "Dom" msgstr "DomEX" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "Testo secondario" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "Testo da inviare durante i tempi morti della tastiera" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "Filtraggio" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "Usa il filtro DSP prima del decodificatore" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "Fattore di larghezza di banda del filtro" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "Larghezza di banda del filtro relativa alla larghezza del segnale" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "Abilita FEC compatibile con MultiPSK" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "Soglia CWI" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "Rilevazione e soppressione CWI" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "Paths (hidden)" #: src/dialogs/confdialog.cxx:11645 #, fuzzy msgid "Feld" msgstr "Feldhell" #: src/dialogs/confdialog.cxx:11647 #, fuzzy msgid "Hell Transmit Parameters" msgstr "Potenza trasmissione" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "Carattere in TX" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "Seleziona il carattere a scansione per la trasmissione" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "Forma dell'impulso" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "Fattore di forma dell'impulso di tipo raised cosine" #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "Trasmetti punti (.) nei tempi morti" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Trasmetti un punto quando non c'è attivitá sulla tastiera" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 #, fuzzy msgid "Range 1...3" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:11706 #, fuzzy msgid "Hell Receive Parameters" msgstr "Seleziona i parametri operativi" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "Inverti il video" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "Mostra il testo ricevuto a colori invertiti" #: src/dialogs/confdialog.cxx:11715 #, fuzzy msgid "Marquee text" msgstr "Cancella la lista" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11722 #, fuzzy msgid "Range 1...4" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:11734 #, fuzzy msgid "Rx Height in pixels" msgstr "Altezza del waterfall in pixel" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "Larghezza di banda del filtro di ricezione" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "Aggiusta la larghezza di banda DSP" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:11791 #, fuzzy msgid "Minimum # hits in tone detector" msgstr "Decodificatore Multicanale" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 #, fuzzy msgid "Center freq" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:11867 #, fuzzy msgid "Sounder" msgstr "Scheda Audio" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 #, fuzzy msgid "convert operator callsign to lower case" msgstr "Converti il campo nominativo a maiuscole" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Time out" msgstr "Tempo scaduto" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:11892 #, fuzzy msgid "Enter QTC text" msgstr "Inserisci testo" #: src/dialogs/confdialog.cxx:11898 #, fuzzy msgid "Message Logging" msgstr "Log dei QSO" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 #, fuzzy msgid "Notify time out" msgstr "Tempo di inattività" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 #, fuzzy msgid "Logging" msgstr "Log dei QSO" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 #, fuzzy msgid "Audit log" msgstr "Audio" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "Abilita" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 #, fuzzy msgid "Text Colors" msgstr "Colore delle cifre" #: src/dialogs/confdialog.cxx:11959 #, fuzzy msgid "Transmit text" msgstr "Trasmetti testo video" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "" #: src/dialogs/confdialog.cxx:11988 #, fuzzy msgid "1/2 speed" msgstr "Velocità AFC" #: src/dialogs/confdialog.cxx:11993 #, fuzzy msgid "1x speed" msgstr "Velocità AFC" #: src/dialogs/confdialog.cxx:11994 #, fuzzy msgid "default" msgstr "Predefinito" #: src/dialogs/confdialog.cxx:11999 #, fuzzy msgid "2x speed" msgstr "Velocità AFC" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:12011 #, fuzzy msgid "convert other callsign to lower case" msgstr "Converti il campo nominativo a maiuscole" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 #, fuzzy msgid "8-bit extended characters (UTF-8)" msgstr "Caratteri estesi a 8 bit" #: src/dialogs/confdialog.cxx:12059 #, fuzzy msgid "Enable this for UTF-8 characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "Integrazione di ricezione lunga" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "Abilitare per segnali molto deboli" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "Trasmetti il tono di avvio basso" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "Trasmetti il tono di avvio alto" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "Durata del tono (secondi)" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 #, fuzzy msgid "Manual tuning" msgstr "Permetti sintonia manuale" #: src/dialogs/confdialog.cxx:12122 #, fuzzy msgid "Oliv" msgstr "Olivia" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "Seleziona la larghezza di banda" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "Toni" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "Seleziona il numero di toni" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "Sincronizzatore di ricezione" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "Margine di sintonia (spaziatura tra i toni)" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "Cambiare SOLO per sperimentare" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "Periodo d'integrazione (FEC blocks)" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 #, fuzzy msgid "Enable this for UTF-8 character transmission" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 msgid "Enable this to send start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:12227 #, fuzzy msgid "Cont" msgstr "Contest" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "Caratteri estesi a 8 bit" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "Comportamento AFC" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "Raggio di ricerca per l'acquisizione (Hz)" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "Cattura i segnali all'interno di questo raggio di frequenza" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "S/N (dB) per l'acquisizione" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "Cattura i segnali oltre questa soglia" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "Comportamento S/N e IMD" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "dopo" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "Comportamento degli indicatori s/n e imd" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "Scurisci" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "secondi" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "Avverrà dopo questo tempo in secondi" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "Elaborazione di segnale multicanale" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "Decodificatore Multicanale" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "Disabilita su CPU molto lente o se il navigatore non è usato" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12439 #, fuzzy msgid "Pilot tone power relative to signal" msgstr "Larghezza di banda del filtro relativa alla larghezza del segnale" #: src/dialogs/confdialog.cxx:12458 #, fuzzy msgid "Short Preamble" msgstr "Preambolo identificativo visuale" #: src/dialogs/confdialog.cxx:12459 #, fuzzy msgid "Enable short preamble for 8PSK transmission" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12472 #, fuzzy msgid "TTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:12476 #, fuzzy msgid "Rx" msgstr "RxID" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "Velocità AFC" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "Velocità di tracciamento AFC" #: src/dialogs/confdialog.cxx:12499 #, fuzzy msgid "RX - unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:12500 #, fuzzy msgid "Revert to unshifted char's on a space" msgstr "Ritorna a caratteri normali (unshifted) dopo uno spazio" #: src/dialogs/confdialog.cxx:12505 #, fuzzy msgid "Filter Shape Factor" msgstr "Fattore di larghezza di banda del filtro" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:12518 #, fuzzy msgid "Decode (CWI suppression)" msgstr "Rilevazione e soppressione CWI" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "Usa oscilloscopio a croce" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "Imposta l'oscilloscopio a croce come predefinito" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:12555 #, fuzzy msgid "Log RTTY frequency" msgstr "Frequenza audio" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:12566 #, fuzzy msgid "track color" msgstr "Colore tracce" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:12577 #, fuzzy msgid "Tx" msgstr "TxID" #: src/dialogs/confdialog.cxx:12580 #, fuzzy msgid "Sound Card FSK" msgstr "Scheda Audio" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "" "Scostamento \n" "della portante" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "Seleziona lo scostamento della portante" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "" "Scostamento \n" "personalizzato" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "Scostamento della portante in ingresso" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "Baud rate" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "Seleziona la velocitá in baud della portante" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "Bit per carattere" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "Seleziona il numero di bit per carattere" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "Parità" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "Seleziona la parità" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "Bit arresto" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "Seleziona il numero di bit d'arresto" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "AutoCRLF" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "Aggiungi CRLF quando raggiungi la larghezza della pagina" #: src/dialogs/confdialog.cxx:12689 #, fuzzy msgid "chars" msgstr "caratteri" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Usa \"cr cr lf\" al posto di \"cr lf\"" #: src/dialogs/confdialog.cxx:12715 #, fuzzy msgid "TX - unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "Ritorna a caratteri normali (unshifted) dopo uno spazio" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:12728 #, fuzzy msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK sul canale audio destro" #: src/dialogs/confdialog.cxx:12729 #, fuzzy msgid "Create keyed square wave on right audio channel" msgstr "Crea un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:12736 #, fuzzy msgid "Transceiver FSK" msgstr "Controllo del ricetrasmettitore" #: src/dialogs/confdialog.cxx:12739 msgid "Mark" msgstr "" #: src/dialogs/confdialog.cxx:12740 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Frequenza in MHz" #: src/dialogs/confdialog.cxx:12751 #, fuzzy msgid "Carrier shift in Hertz" msgstr "" "Scostamento \n" "della portante" #: src/dialogs/confdialog.cxx:12766 #, fuzzy msgid "LTRS at start" msgstr "Parti da" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 #, fuzzy msgid "FSK Interface" msgstr "Interfaccia Utente" #: src/dialogs/confdialog.cxx:12847 #, fuzzy msgid "Navigator serial port" msgstr "Porta seriale" #: src/dialogs/confdialog.cxx:12861 #, fuzzy msgid "FSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12862 #, fuzzy msgid "Connect / Disconnect from Nav FSK port" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 #, fuzzy msgid "Navigator configuration port" msgstr "Configurazione di Fldigi" #: src/dialogs/confdialog.cxx:12885 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Numero del canale" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 #, fuzzy msgid "Channel 2 attenuator" msgstr "Numero del canale" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 msgid "RF attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12918 msgid "NavRF Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 #, fuzzy msgid "Nav FSK baud rate" msgstr "Baud rate della porta seriale" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Bit arresto" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 #, fuzzy msgid "Mark Polarity" msgstr "Parità" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 #, fuzzy msgid "Config" msgstr "Conferma" #: src/dialogs/confdialog.cxx:13062 #, fuzzy msgid "Connect / Disconnect from Nav Config port" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:13069 #, fuzzy msgid "Synop" msgstr "Scope" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 #, fuzzy msgid "Serial Interface" msgstr "Interfaccia Utente" #: src/dialogs/confdialog.cxx:13158 #, fuzzy msgid "FSK port" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:13206 #, fuzzy msgid "Auto CRLF" msgstr "AutoCRLF" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 #, fuzzy msgid "Diddle char" msgstr "Carattere di prova" #: src/dialogs/confdialog.cxx:13239 #, fuzzy msgid "Diddle character" msgstr "Bit per carattere" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 #, fuzzy msgid "Unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "Abilita il DSP prima del decodificatore" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:13402 msgid "Nav" msgstr "" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" #: src/dialogs/confdialog.cxx:13431 #, fuzzy msgid "Frequency shift (800 Hz)" msgstr "Frequenza in MHz" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "" #: src/dialogs/confdialog.cxx:13475 #, fuzzy msgid "Save image as monochrome file" msgstr "Salva file delle macro" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "Radio" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 #, fuzzy msgid "flrig" msgstr "Parti da" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 msgid "Addr" msgstr "" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "Usa RigCAT" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "Usa RigCAT per controllare la radio" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "File con la descrizione della radio" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "Usa Apri per selezionare il file con la descrizione" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "Seleziona il file con la descrizione della radio" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Periferica:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "Tentativi" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "numero di tentativi prima di rinunciare" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "Intervallo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "Tempo in ms tra i tentativi" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "Baud rate:" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "Bit d'arresto" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "Inizializza" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "Inizializza l'interfaccia RigCAT" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "I comandi sono visualizzati" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "La radio o l'interfaccia fa l'eco dei dati seriali" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "Usa CAT per controllare il PTT" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "PTT è un comando CAT (non hardware)" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "Usa RTS per il PTT" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "RTS controlla il PTT" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "Usa DTR per il PTT" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "DTR controlla il PTT" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "Stato iniziale di RTS" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "Stato iniziale di DTR" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "Controllo di flusso RTS/CTS" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "La radio usa handshake RTS/CTS" #: src/dialogs/confdialog.cxx:13735 msgid "Restore UART Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "Abilita VSP" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Emulatore Virtuale di Porte Seriali - sopprimi gli allarmi" #: src/dialogs/confdialog.cxx:13747 #, fuzzy msgid "Init delay (ms)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "Usa Hamlib" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "Hamlib è usata per controllare la radio" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "numero di volte che il comando è ripetuto prima di rinunciare" #: src/dialogs/confdialog.cxx:13823 #, fuzzy msgid "Retry Interval (msec)" msgstr "Tempo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "Tempo in ms tra i tentativi" #: src/dialogs/confdialog.cxx:13840 #, fuzzy msgid "Write delay (msec)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "Tempo in ms tra comandi successivi" #: src/dialogs/confdialog.cxx:13857 #, fuzzy msgid "Post write delay (msec)" msgstr "Ritardo dopo un comando" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "Attenti # ms prima di leggere la risposta" #: src/dialogs/confdialog.cxx:13909 #, fuzzy msgid "Polling Interval (msec)" msgstr "Tempo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT via comando Hamlib" #: src/dialogs/confdialog.cxx:13929 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT è un comando Hamlib" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "La radio richiede controllo di flusso RTS/CTS" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "Controllo di flusso XON/XOFF" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "La radio richiede controllo di flusso Xon/Xoff" #: src/dialogs/confdialog.cxx:13965 #, fuzzy msgid "CW is LSB mode" msgstr "CW è LSB" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:13977 #, fuzzy msgid "Mode delay (msec)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:13978 msgid "Delay NN msec after executing mode change" msgstr "" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "Banda laterale:" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "Configurazione avanzata:" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configurazione opzionale\n" "in formato: param=val ..." #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "Inizializza l'interfaccia hamlib" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "PTT Hardware" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "PTT genera un tono sul canale audio destro " #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Puó essere usato al posto o insieme ad altri tipi di PTT" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "" "Porta e segnale usato \n" "per il PTT hardware" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "Il PTT usa una porta seriale separata" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "Il PTT usa una porta parallela" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "Il PTT usa uHRouter" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "Usa RTS" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "RTS controlla il PTT" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "Tensione iniziale su RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "Usa DTR" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "DTR controlla il PTT" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "Tensione iniziale su DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "Inizializza l'interfaccia PTT hardware" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 #, fuzzy msgid "Select pin number" msgstr "Seleziona tutto" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 #, fuzzy msgid "Select PTT on state" msgstr "Seleziona tutto" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "Dispositivi" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "Usa un server audio OSS" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "Seleziona il dispositivo" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "Usa un server Port Audio" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "Cattura:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "Dispositivo audio d'ingresso" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "Riproduzione:" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "Dispositivo audio d'uscita" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "Usa server Pulse Audio" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "Nome del server" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Lascia in bianco o vedi\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "Solo I/O su file" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "NESSUN DISPOSITIVO AUDIO DISPONIBILE (o test)" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "Impostazioni" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "Cattura" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Forza una velocitá di campionamento specifica. Scegli \"Nativo\"\n" "se \"Auto\" non funziona correttamente con la tua scheda audio." #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "Conversione" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "Scegli il tipo di ricampionatore usato per la correzione dell'offset" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "Correzione" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "Correzione della scheda audio in ricezione" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "Correzione della scheda audio in trasmissione" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "TX offset" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Differenza tra la frequenza Rx e Tx (scostamento della radio)" #: src/dialogs/confdialog.cxx:14605 #, fuzzy msgid "Right channel" msgstr "Mostra canali" #: src/dialogs/confdialog.cxx:14607 #, fuzzy msgid "Transmit Usage" msgstr "Segnale trasmesso" #: src/dialogs/confdialog.cxx:14610 #, fuzzy msgid "Modem signal on left and right channels" msgstr "Genera un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 #, fuzzy msgid "Software reversal of left-right audio channels" msgstr "QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" #: src/dialogs/confdialog.cxx:14627 #, fuzzy msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "Puó essere usato al posto o insieme ad altri tipi di PTT" #: src/dialogs/confdialog.cxx:14633 #, fuzzy msgid "CW QSK signal on right channel" msgstr "QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:14634 #, fuzzy msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Genera un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK sul canale audio destro" #: src/dialogs/confdialog.cxx:14640 #, fuzzy msgid "Create 1000 Hz square wave on right channel" msgstr "Crea un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:14649 #, fuzzy msgid "Receive Usage" msgstr "Ricevi" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:14664 #, fuzzy msgid "Wav write sample rate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "Seleziona una velocitá della porta dalla lista" #: src/dialogs/confdialog.cxx:14681 #, fuzzy msgid "Record both channels" msgstr "Mostra canali" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "" #: src/dialogs/confdialog.cxx:14692 #, fuzzy msgid "Regex Match in Browser" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 #, fuzzy msgid "Sound:" msgstr "Scheda Audio" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 #, fuzzy msgid "Test" msgstr "Test..." #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 #, fuzzy msgid "flmsg interface" msgstr "Interfaccia Utente" #: src/dialogs/confdialog.cxx:14753 #, fuzzy msgid "flmsg received wav" msgstr "RST ricevuto" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "RsID detection" msgstr "Ricezione RSID" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:14845 #, fuzzy msgid "Notify only" msgstr "Solo notifiche" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Scegli questo per essere notificato quando un RSID viene ricevuto\n" "senza cambiare modem o frequenza" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "Modi ricezione" #: src/dialogs/confdialog.cxx:14855 #, fuzzy msgid "Searches passband" msgstr "Decodifica in tutta la banda passante" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "ON - cerca su tutto il waterfall\n" "OFF - limita la ricerca a +/- 200 Hz" #: src/dialogs/confdialog.cxx:14861 #, fuzzy msgid "Mark prev freq/mode" msgstr "Marca la frequenza ed il modo precedente" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Inserisci un marker nel testo ricevuto\n" "prima di cambiare frequenza e modem" #: src/dialogs/confdialog.cxx:14867 #, fuzzy msgid "Disables detector" msgstr "La ricezione disabilita il decodificatore" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "Disabilita ulteriori decodifiche quando viene ricevuto un RSID" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "Apri squelch (sec)" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "Apri lo squelch per nn sec se viene decodificato un RSID" #: src/dialogs/confdialog.cxx:14911 #, fuzzy msgid "Disable alert dialog" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14923 #, fuzzy msgid "Disable freq change" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "Tono prima del segnale" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "Secondi" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "Usalo per permettere a un amplificatore di accorgersi del segnale" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "Modi di trasmissione" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:14956 #, fuzzy msgid "Add RsID signal to end of transmission" msgstr "Trasmetti il nominativo in CW alla fine di ogni trasmissione" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "Preambolo identificativo visuale" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "Trasmetti ID del modo" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "Identificazione video del modo mostrata sul waterfall" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "Trasmetti testo video" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "Testo visualizzato sul waterfall" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Limita a pochi caratteri,\n" "come CQEM o IOTA ecc." #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "Usa caratteri piccoli" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "ON - caratteri piccoli\n" "OFF - caratteri grandi" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "Caratteri/Riga:" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "Imposta il numero di caratteri per riga" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "Limite a 500 Hz" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "" "Limite secondo la \n" "larghezza del modo" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "Modi ID video" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "ID CW a fine trasmissione" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "Trasmetti il nominativo" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "Trasmetti il nominativo in CW alla fine di ogni trasmissione" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "Velocità (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "Invia a questa velocità WPM" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "Modi ID CW" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Misc" #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "CPU lente (meno di 700 MHz)" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "Abilita se il tuo computer non decodifica correttamente" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "interfaccia per file di dati NBEMS" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Estrai i file per l'uso con il programma esterno \"wrap / flmsg\"" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "Apri file dei messaggi" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "Apri la cartella dei file NBEMS dopo una cattura riuscita" #: src/dialogs/confdialog.cxx:15121 #, fuzzy msgid "Reception of flmsg files" msgstr "Ricezione file flmsg" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "Apri con flmsg" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "Apri il messaggio con flmsg" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "Apri col browser" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "Apri il file con il browser di sistema" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "Trova flmsg" #: src/dialogs/confdialog.cxx:15154 #, fuzzy msgid "Timeout (secs)" msgstr "Tempo (s):" #: src/dialogs/confdialog.cxx:15155 #, fuzzy msgid "Extract times out after NN seconds of inactivity." msgstr "" "Cancella il testo del canale dopo\n" "# secondi di inattività" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "Attributi del mail server" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "Frequenza portante (Hz)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "Frequenza predefinita di ascolto / trasmissione" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "Area di ricerca (Hz)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "Cerca segnali all'interno di questa area" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "Area AFC (Hz)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "Limita i movimenti AFC a questa area" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "Reimposta alla portante" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "Quando non ci sono segnali" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "Riporta il S/N medio dei frame ARQ" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "Invia automaticamente lo spot per i nominativi nel testo decodificato" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "Analizza tutto il testo ricevuto" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "Invia il rapporto di ricezione quando metti un QSO a log" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "Invia il rapporto solo quando il QSO è messo a log" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Comunica la frequenza della radio (abilita solo se hai il controllo " "automatico)" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "Includi la frequenza di trasmissione" #: src/dialogs/confdialog.cxx:15314 #, fuzzy msgid "Disable spotting when signal browser(s) are not visible." msgstr "Disabilita su CPU molto lente o se il navigatore non è usato" #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "Verso chi fare la connessione" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "Porta:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "Usa la porta UDP #" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "Inizializza la connessione al server" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "Frequenza preferita" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "Frequenza preferita per la decodifica CW" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "Frequenza preferita per la decodifica RTTY" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "Frequenza preferita per tutti gli altri modem" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "Avvia sempre i nuovi modem su queste frequenze" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - avvia alla frequenza predefinita\n" "OFF - mantieni la posizione attuale del cursore sul waterfall" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "Configurazione A1A per K3" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "CW è LSB" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Attiva la selezione per Elecraft K3\n" "Altre radio non dovrebbero averne bisogno." #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "Testo" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "Talker Socket (MS only)" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Connetti automaticamente all'avvio di fldigi (il server deve essere attivo)" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "Cattura il testo ricevuto su file esterno" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "Abilita il flusso del testo ricevuto" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "Invia il testo ricevuto al file: textout.txt" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:15512 #, fuzzy msgid "Full report" msgstr "rapporto" #: src/dialogs/confdialog.cxx:15513 #, fuzzy msgid "Insert full METAR report" msgstr "Inserisci testo predefinito" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:15524 #, fuzzy msgid "Conditions" msgstr "Opzioni da riga di comando" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "" #: src/dialogs/confdialog.cxx:15537 #, fuzzy msgid "report Celsius" msgstr "rapporti" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "" #: src/dialogs/confdialog.cxx:15554 msgid "Inches Hg." msgstr "" #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:15561 #, fuzzy msgid "report millibars" msgstr "rapporti" #: src/dialogs/confdialog.cxx:15566 #, fuzzy msgid "Temperature" msgstr "Genera TX" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "Default URL" msgstr "Predefinito" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:15625 #, fuzzy msgid "KML refresh interval (seconds)" msgstr "Intervallo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:15658 #, fuzzy msgid "Command run on KML creation" msgstr "Opzioni da riga di comando" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:15665 #, fuzzy msgid "Test command" msgstr "Carattere di prova" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:15669 #, fuzzy msgid "Change dir..." msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:15677 #, fuzzy msgid "Cleanup on startup" msgstr "Cancella i campi quando salvi" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:15707 #, fuzzy msgid "Do not use callsign lookup via web browser" msgstr "Non usare un database di nominativi" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "RTS controlla il PTT" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "Visita il sito web di QRZ" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "Visita il sito web Hamcall" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 #, fuzzy msgid "Visit hamQTH web site" msgstr "Visita il sito web di QRZ" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:15750 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15763 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15776 #, fuzzy msgid "Callook" msgstr "Nominativo" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "Non usare un database di nominativi" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "Usa un CD o un'immagine su HD" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "È necessario un abbonamento a pagamento\n" "per l'accesso online a QRZ" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "È necessario un abbonamento a pagamento\n" "per l'accesso online a Hamcall" #: src/dialogs/confdialog.cxx:15820 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:15826 #, fuzzy msgid "Callook.info" msgstr "Nominativo" #: src/dialogs/confdialog.cxx:15827 #, fuzzy msgid "Callook.info lookup (free service US callsigns only)" msgstr "Consulta Callbook.info (solo nominativi USA)" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "es: /home/dave/CALLBK/ or C:/CALLBK/\n" "Lascia in bianco per cercare un database" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "Utente" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "Password" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "Mostra la password in chiaro" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:15900 #, fuzzy msgid "eQSL" msgstr "utente eQSL" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "Il tuo nome utente per l'accesso" #: src/dialogs/confdialog.cxx:15917 #, fuzzy msgid "User ID" msgstr "Utente" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "La tua password d'accesso" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:15971 #, fuzzy msgid "Options" msgstr "Azione" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Mostra meno modi" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 #, fuzzy msgid "Default message" msgstr "Predefiniti" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:16010 #, fuzzy msgid " {CALL} other ops call sign" msgstr "\tnominativo del corrispondente" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:16016 #, fuzzy msgid "{NAME} other ops name" msgstr "\tnome del corrispondente" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:16030 #, fuzzy msgid "Enter full path-filename for tqsl executable" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:16044 #, fuzzy msgid "Your tqsl login password" msgstr "La tua password d'accesso" #: src/dialogs/confdialog.cxx:16059 #, fuzzy msgid "Use password for tqsl access" msgstr "Password" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:16065 #, fuzzy msgid "Location" msgstr "Locator" #: src/dialogs/confdialog.cxx:16066 msgid "tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 #, fuzzy msgid "Locate" msgstr "Locator" #: src/dialogs/confdialog.cxx:16081 #, fuzzy msgid "Locate tqsl executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:16096 #, fuzzy msgid "Export" msgstr "Esporta..." #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 #, fuzzy msgid "Check" msgstr "Seleziona tutto" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16108 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:16125 msgid "Use this tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:16160 #, fuzzy msgid "Enter full path-filename for flrig" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:16174 #, fuzzy msgid "Locate flrig executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:16178 #, fuzzy msgid "Enter full path-filename for flamp" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:16192 #, fuzzy msgid "Locate flamp executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:16196 #, fuzzy msgid "Enter full path-filename for flnet" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:16210 #, fuzzy msgid "Locate flnet executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:16214 #, fuzzy msgid "Enter full path-filename for fllog" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:16228 #, fuzzy msgid "Locate fllog executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 #, fuzzy msgid "Enter full path-filename for external program" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:16246 #, fuzzy msgid "Locate program #1 executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:16264 #, fuzzy msgid "Locate program #2 executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:16282 #, fuzzy msgid "Locate program #3 executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:16285 #, fuzzy msgid "" "Enable\n" "-" msgstr "Abilita" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:16329 #, fuzzy msgid "Start flrig" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16333 #, fuzzy msgid "Start flamp" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16337 #, fuzzy msgid "Start flnet" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16341 #, fuzzy msgid "Start fllog" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16345 #, fuzzy msgid "Start prog1" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16349 #, fuzzy msgid "Start prog2" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16353 #, fuzzy msgid "Start prog3" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "" #: src/dialogs/confdialog.cxx:16372 #, fuzzy msgid "Enable ARQ" msgstr "Abilita" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "" #: src/dialogs/confdialog.cxx:16380 #, fuzzy msgid "Enable KISS" msgstr "Abilita" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "" #: src/dialogs/confdialog.cxx:16388 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "Restart" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16564 #, fuzzy msgid "XML" msgstr "XML-RPC" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16659 #, fuzzy msgid "fllog" msgstr "Parti da" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16697 #, fuzzy msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" "Cancella il testo del canale dopo\n" "# secondi di inattività" #: src/dialogs/confdialog.cxx:16707 #, fuzzy msgid "Enable Busy Channel" msgstr "Abilita audio sul canale destro" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16726 #, fuzzy msgid "Modem Bandwidth Margins " msgstr "Larghezza di banda" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16753 #, fuzzy msgid "Enable CSMA" msgstr "Abilita" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 #, fuzzy msgid "Slot Time" msgstr "Ora" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16781 #, fuzzy msgid "Transmit Data Delay" msgstr "Segnale trasmesso" #: src/dialogs/confdialog.cxx:16782 #, fuzzy msgid "Idle transmit before data sent" msgstr "Includi la frequenza di trasmissione" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 #, fuzzy msgid "MilliSeconds" msgstr "Secondi" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16809 #, fuzzy msgid "Enable Histogram" msgstr "Abilita il flusso del testo ricevuto" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16831 msgid "PSM Attenuate" msgstr "" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16845 #, fuzzy msgid "Default Settings" msgstr "" "Default test string is:\n" " \"" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "Ripristina predefiniti" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Colori dei caratteri" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Caratteri:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Dimensione:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "Pàstene soppaltate secondo l'articolo 12, abbia pazienza, sennò posterdati, " "per due, anche un pochino antani in prefettura...\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Sto caricando i caratteri..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 #, fuzzy msgid "Data files sources" msgstr "File NBEMS..." #: src/dialogs/record_browse.cxx:27 #, fuzzy msgid "Data files update" msgstr "File NBEMS..." #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 #, fuzzy msgid "Data source" msgstr "Origine dei log" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Evento" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Abilitato" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtro" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entità DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Mostra le entità DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Non lavorato in precedenza" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Utente LoTW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "utente eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicati" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignora duplicati" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "in:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Tempo (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Azione" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Limite attivazione (s)" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Tempo minimo tra eventi" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Mostra la finestra di avviso:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Inserisci testo predefinito" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Nascondi la finestra dopo (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Aggiungi al testo ricevuto:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Aggiungi al testo trasmesso:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Mostra l'editor delle macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Esegui programma:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entità DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Trova il paese:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Premi invio per continuare la ricerca" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Trova il prefisso:" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "Configurazione per l'export" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "Seleziona i record da esportare" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "Seleziona tutto" #: src/logbook/lgbook.cxx:622 #, fuzzy msgid "Start Date" msgstr "Parti da" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:636 #, fuzzy msgid "Stop Date" msgstr "Data QSO" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:650 #, fuzzy msgid "select by date" msgstr "Seleziona la radio per nome" #: src/logbook/lgbook.cxx:651 #, fuzzy msgid "Enable to select date range" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "Seleziona i campi da esportare" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "Freq" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "Data inizio QSO" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "Data fine QSO" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "Ora ON" #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "Ora OFF" #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "Potenza TX" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "RST inv." #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "RST ric." #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "QTH" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "Loc" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 #, fuzzy msgid "Station Call" msgstr "Stazione" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 #, fuzzy msgid "Station QTH" msgstr "Stazione" #: src/logbook/lgbook.cxx:723 #, fuzzy msgid "Station LOC" msgstr "Stazione" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Note" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:750 #, fuzzy msgid "LoTW rcvd date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:753 #, fuzzy msgid "LoTW sent date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "Seriale ricevuto" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "Seriale trasmesso" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "Rapporto dato" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:795 #, fuzzy msgid "FD section" msgstr "Ricezione RSID" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 #, fuzzy msgid "CW SS Check" msgstr "Seleziona tutto" #: src/logbook/lgbook.cxx:809 #, fuzzy msgid "CW SS Section" msgstr "Azione" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "Log" #: src/logbook/lgbook.cxx:840 #, fuzzy msgid "Date On" msgstr "Data inizio QSO" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "Data di inizio del QSO" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "Ora d'inizio" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "Ora inizio QSO" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "Nominativo collegato" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "Operatore collegato" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "Ric." #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "RST ricevuto" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "Rec." #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "Numero di record nel log" #: src/logbook/lgbook.cxx:913 #, fuzzy msgid "Date Off" msgstr "Data fine QSO" #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "Data di fine del QSO" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "Ora di fine" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "Ora di fine del QSO" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "Freq." #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "Frequenza in MHz" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "Modo in uso" #: src/logbook/lgbook.cxx:962 #, fuzzy msgid "Pwr" msgstr "Pr" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "Potenza di trasmissione usata" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "Loc" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "Quadratone della stazione" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "Dato" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "RST inviato" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "Cittá della stazione collegata" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "Stato USA della stazione collegata" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "Provincia della stazione collegata" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "Paese della stazione collegata" #: src/logbook/lgbook.cxx:1048 #, fuzzy msgid "QSL" msgstr "utente eQSL" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "QSL-ric" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:1062 #, fuzzy msgid "EQSL-rcvd" msgstr "QSL-ric" #: src/logbook/lgbook.cxx:1075 #, fuzzy msgid "LOTW-rcvd" msgstr "QSL-ric" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "QSL-inv" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:1101 #, fuzzy msgid "EQSL-sent" msgstr "QSL-inv" #: src/logbook/lgbook.cxx:1114 #, fuzzy msgid "LOTW-sent" msgstr "QSL-inv" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "Islands on the air" #: src/logbook/lgbook.cxx:1181 #, fuzzy msgid "Cont'" msgstr "Contest" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "Designatore DXCC" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 #, fuzzy msgid "Interesting notes" msgstr "Note interessanti (max 80 car.)" #: src/logbook/lgbook.cxx:1236 #, fuzzy msgid "My Station" msgstr "Stazione" #: src/logbook/lgbook.cxx:1274 #, fuzzy msgid "Station Locator" msgstr "Stazione sentita due volte" #: src/logbook/lgbook.cxx:1290 #, fuzzy msgid "Ser out" msgstr "Ser.dato" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 #, fuzzy msgid "Contest seral # sent" msgstr "Numero seriale del contest dato" #: src/logbook/lgbook.cxx:1302 #, fuzzy msgid "Exch Out" msgstr "Rapporto dato" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "Rapporto contest dato" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "Numero seriale del contest ricevuto" #: src/logbook/lgbook.cxx:1326 #, fuzzy msgid "Exch In" msgstr "Rapporto ricevuto" #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "Rapporto contest ricevuto" #: src/logbook/lgbook.cxx:1339 #, fuzzy msgid "Field Day class received" msgstr "Azione della rotella del mouse" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 #, fuzzy msgid "Field Section received" msgstr "Azione della rotella del mouse" #: src/logbook/lgbook.cxx:1363 #, fuzzy msgid "Operators age received" msgstr "Nomi degli operatori" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 #, fuzzy msgid "Operating band" msgstr "Operatore" #: src/logbook/lgbook.cxx:1399 #, fuzzy msgid "Check value received" msgstr "Rapporto contest ricevuto" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 #, fuzzy msgid "Ser NoR" msgstr "Ser.dato" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 #, fuzzy msgid "Sent troop number" msgstr "Seleziona tutto" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 #, fuzzy msgid "Received troop number" msgstr "Seriale ricevuto" #: src/logbook/lgbook.cxx:1492 #, fuzzy msgid "Name-S" msgstr "Nome" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 #, fuzzy msgid "Name-R" msgstr "Nome" #: src/logbook/lgbook.cxx:1505 #, fuzzy msgid "Received scout name" msgstr "Ricevi" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "Cerca Nominativo" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "Cerca questo nominativo" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "Trova precedente" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "Trova successivo" #: src/logbook/lgbook.cxx:1549 #, fuzzy msgid "Retrieve" msgstr "Tentativi" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "" #: src/logbook/lgbook.cxx:1583 #, fuzzy msgid "File:" msgstr "&File" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "Data" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "Ora" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "Impostazione Cabrillo" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "Scegli il Contest e i campi Cabrillo" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "Data QSO" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Controllo della radio tramite \n" #~ "programma esterno che usa \n" #~ "chiamate remote xmlrpc." #~ msgid "Use XML-RPC program" #~ msgstr "Usa un programma XML-RPC" #~ msgid "Experimental" #~ msgstr "Sperimentale" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Inizializza il controllo della radio XML-RPC" #~ msgid "Enter a CALL !" #~ msgstr "Inserisci un NOMINATIVO !" #~ msgid "Add current frequency" #~ msgstr "Aggiungi la frequenza corrente" #~ msgid "Clear list" #~ msgstr "Cancella la lista" #~ msgid "Delete from list" #~ msgstr "Togli dalla lista" #~ msgid "Select operating parameters" #~ msgstr "Seleziona i parametri operativi" #, fuzzy #~ msgid "Frq" #~ msgstr "Freq" #, fuzzy #~ msgid "frequency kHz" #~ msgstr "Frequenza in MHz" #~ msgid "On" #~ msgstr "Inizio" #, fuzzy #~ msgid "Press to update QSO start time" #~ msgstr "Premi per aggiornare" #~ msgid "Off" #~ msgstr "Fine" #, fuzzy #~ msgid "QSO end time" #~ msgstr "Invia immagine" #, fuzzy #~ msgid "call sign" #~ msgstr "Nominativo" #, fuzzy #~ msgid "QTH City" #~ msgstr "Città" #~ msgid "US State" #~ msgstr "Stato USA" #~ msgid "Can. Province" #~ msgstr "Prov. Canadese" #, fuzzy #~ msgid "Maidenhead Locator" #~ msgstr "Locator come in JN53rw" #~ msgid "Sent serial number (read only)" #~ msgstr "Seriale trasmesso (solo lettura)" #, fuzzy #~ msgid "Received FD class" #~ msgstr "RST ricevuto" #, fuzzy #~ msgid "Received FD section" #~ msgstr "Seriale ricevuto" #, fuzzy #~ msgid "Received CQ zone" #~ msgstr "Modi ricezione" #, fuzzy #~ msgid "Received State/Prov" #~ msgstr "RST ricevuto" #, fuzzy #~ msgid "Received serno" #~ msgstr "Ricevi" #, fuzzy #~ msgid "SS Check" #~ msgstr "Seleziona tutto" #, fuzzy #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "Tasto sinistro - seleziona\n" #~ "Tasto destro - cancella la riga" #~ msgid "Press to update" #~ msgstr "Premi per aggiornare" #~ msgid "Other call" #~ msgstr "Altro nominativo" #~ msgid "Received RST" #~ msgstr "RST ricevuto" #~ msgid "Sent RST" #~ msgstr "RST inviato" #~ msgid "Nm" #~ msgstr "Nm" #~ msgid "Other name" #~ msgstr "Altro nome" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Tasto sinistro - esegui\n" #~ "Tasto funzione - esegui\n" #~ "Tasto destro - modifica" #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Tasto sinistro - esegui\n" #~ "Maiusc-Funz - esegui\n" #~ "Tasto destro - modifica" #~ msgid "Shift-key macro set" #~ msgstr "Gruppo di macro accessibile con maiusc" #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "Tasto sinistro - seleziona\n" #~ "Tasto destro - cancella la riga" #~ msgid "seek - regular expression" #~ msgstr "Cerca Regular Expression" #, fuzzy #~ msgid "Select FSQ station" #~ msgstr "Seleziona tutto" #, fuzzy #~ msgid "Stations Heard" #~ msgstr "Stazione sentita due volte" #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Tasto sinistro - esegui\n" #~ "Tasto funzione - esegui\n" #~ "Tasto destro - modifica" #~ msgid "Primary macro set" #~ msgstr "Gruppo di macro principale" #~ msgid "Aborted" #~ msgstr "Annulla" #~ msgid "Timed out" #~ msgstr "Tempo scaduto" #~ msgid "Serial number" #~ msgstr "Numero progressivo" #, fuzzy #~ msgid "Contest Exchanges" #~ msgstr "Rapporto contest dato" #, fuzzy #~ msgid "Send Xchg" #~ msgstr "Invia immagine" #, fuzzy #~ msgid "Contest Logging" #~ msgstr "Contestia" #, fuzzy #~ msgid "Generic" #~ msgstr "Generale" #, fuzzy #~ msgid "Use generic contest fields" #~ msgstr "Campi &Contest" #, fuzzy #~ msgid "Use Field Day Contest Fields" #~ msgstr "Scegli il Contest e i campi Cabrillo" #, fuzzy #~ msgid "CQWW RTTY" #~ msgstr "RTTY" #~ msgid "Slow (4 msec)" #~ msgstr "Lento (4 ms)" #~ msgid "Fast (2 msec)" #~ msgstr "Veloce (2 ms)" #~ msgid "at:" #~ msgstr "a:" #~ msgid "Test Signal - Do NOT use with transmitter" #~ msgstr "Segnale di prova - NON USARE col trasmettitore" #~ msgid "dB" #~ msgstr "dB" #~ msgid "Noise on" #~ msgstr "Genera rumore" #, fuzzy #~ msgid "freq-offset" #~ msgstr "TX offset" #, fuzzy #~ msgid "ALC level" #~ msgstr "Liv.Tx" #, fuzzy #~ msgid "FFT filter" #~ msgstr "Filtro" #~ msgid "\tLDT in iso-8601 format" #~ msgstr "\tLDT in formato iso-8601" #~ msgid "\tLocal datetime" #~ msgstr "\tData e ora locale" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT in formato iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tdata e ora UTC" #~ msgid "Operator information" #~ msgstr "Informazioni sull'operatore" #, fuzzy #~ msgid "User Interface - Browser" #~ msgstr "Interfaccia Utente" #, fuzzy #~ msgid "User Interface - General" #~ msgstr "Interfaccia Utente" #, fuzzy #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interfaccia Utente" #, fuzzy #~ msgid "User Interface - Contest" #~ msgstr "Interfaccia Utente" #, fuzzy #~ msgid "User Interface - Macros" #~ msgstr "Interfaccia Utente" #, fuzzy #~ msgid "User Interface - Waterfall controls" #~ msgstr "Controlli waterfall" #~ msgid "Rig Control using xml spec file" #~ msgstr "Controlla la radio mediante un file di specifica xml" #~ msgid "Audio devices" #~ msgstr "Dispositivi audio" #~ msgid "Callsign database" #~ msgstr "Database nominativi" #, fuzzy #~ msgid "Program to Program Communications" #~ msgstr "Chiedi conferma per salvare il log" #, fuzzy #~ msgid "Power Signal Monior" #~ msgstr "Tono prima del segnale" #~ msgid "Callsign:" #~ msgstr "Nominativo:" #~ msgid "Name:" #~ msgstr "Nome:" #~ msgid "QTH:" #~ msgstr "QTH:" #~ msgid "Transmit width" #~ msgstr "Larghezza di trasmissione" #~ msgid "# of multiple scans / character line" #~ msgstr "# di linee multiple / linea di caratteri" #~ msgid "Halve receive width" #~ msgstr "Dimezza la larghezza RX" #~ msgid "Compress Rx in time" #~ msgstr "Comprimi la ricezione nel tempo" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Xmt Width (hidden)" #~ msgid "Revert" #~ msgstr "Inverti" #, fuzzy #~ msgid "Reset rigCAT interface" #~ msgstr "Inizializza l'interfaccia RigCAT" #, fuzzy #~ msgid "Reset hamlib interface" #~ msgstr "Inizializza l'interfaccia hamlib" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Usa PTT MemMap" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Seleziona la porta seriale" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-ric" #~ msgid "Rig control and logging" #~ msgstr "Controllo della radio e log" #~ msgid "Rig control and contest" #~ msgstr "Controllo della radio e contest" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Non ho potuto controllare la presenza di aggiornamenti:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Visita l'URL" #~ msgid "Copy URL" #~ msgstr "Copia l'URL" #~ msgid "Controls" #~ msgstr "Controlli" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #, fuzzy #~ msgid "Empty ADIF logbook file %s" #~ msgstr "File di log ADIF vuoto" #~ msgid "Quick entry" #~ msgstr "Inserimento rapido" #~ msgid "Exchanges" #~ msgstr "Rapporti" #, fuzzy #~ msgid "Transmit all text in lower case" #~ msgstr "Potenza di trasmissione usata" #, fuzzy #~ msgid "User Interface - Logging" #~ msgstr "Interfaccia Utente" #, fuzzy #~ msgid "Enter Port # assigned to server" #~ msgstr "Usa un server Port Audio" #, fuzzy #~ msgid "Rx Text Capture" #~ msgstr "Cattura testo" #, fuzzy #~ msgid "Prompt to save macro file when closing" #~ msgstr "Chiedi conferma per salvare il log" #, fuzzy #~ msgid "Mono audio output" #~ msgstr "Dispositivo audio d'uscita" #, fuzzy #~ msgid "End of header string:" #~ msgstr "Nome del server" #~ msgid "QRZ online via default Internet Browser" #~ msgstr "Accesso online a QRZ tramite il browser predefinito" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "Accesso online a Hamcall tramite browser predefinito" #, fuzzy #~ msgid "HamQTH via default Internet Browser" #~ msgstr "Accesso online a Hamcall tramite browser predefinito" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "\tvideo text" #~ msgstr "\ttesto video" #~ msgid "Raised cosine = Hanning" #~ msgstr "Raised cosine = Hanning" #~ msgid "No rig specified" #~ msgstr "Nessuna radio specificata" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Inserisci la frequenza o cambia con\n" #~ "Sinistra/Destra/Su/Giù/Pag_su/Pag_giù" #~ msgid "Enter Xcvr Freq" #~ msgstr "Frequenza Radio" #~ msgid "Memory Mapped Rig" #~ msgstr "Radio \"Memory Mapped\"" #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Abilita se non puoi usare il tasto centrale del mouse" #, fuzzy #~ msgid "Char set" #~ msgstr "Cancella la lista" #, fuzzy #~ msgid "Frq Disp" #~ msgstr "Visualizza Freq" #~ msgid "Label text" #~ msgstr "Testo delle etichette" #~ msgid "FFT latency (scan merging)" #~ msgstr "Latenza FFT (aggregazione scansioni)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "La latenza aumenta la risoluzione in frequenza,\n" #~ "diminuisce la risoluzione temporale. 1 = non aggregare le scansioni" #, fuzzy #~ msgid "Select packet baudrate" #~ msgstr "Seleziona la velocitá in baud della portante" #, fuzzy #~ msgid "Use cross-hair scope" #~ msgstr "Usa oscilloscopio a croce" #, fuzzy #~ msgid "boost Audio input" #~ msgstr "Dispositivo audio d'uscita" #~ msgid "Select the rig by name" #~ msgstr "Seleziona la radio per nome" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forza la banda laterale sulla radio. Ha\n" #~ "effetto quando viene cambiato il modo della radio." #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Controllo tramote variabili condivise\n" #~ "a memoria mappata\n" #~ "es.: programma Kachina" #~ msgid "Use Memmap" #~ msgstr "Usa MemMap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Controllo della radio attraverso memoria mappata Kachina" #~ msgid "Initialize Memmap interface" #~ msgstr "Inizializza l'interfaccia MemMap" #~ msgid "Mixer" #~ msgstr "Mixer" #, fuzzy #~ msgid "OSS Mixer" #~ msgstr "Mixer OSS" #~ msgid "Manage mixer" #~ msgstr "Gestisci il mixer" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Aggiungi i controlli del mixer alla finestra principale" #~ msgid "Select Mixer device" #~ msgstr "Seleziona il dispositivo mixer" #~ msgid "Mic In" #~ msgstr "Mic In" #~ msgid "Use microphone input" #~ msgstr "Usa l'ingresso microfono" #~ msgid "Line In" #~ msgstr "Line In" #~ msgid "Use Line-In device" #~ msgstr "Usa l'ingresso Line-In" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Imposta il livello PCM della scheda audio" #, fuzzy #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "Inserisci il percorso completo a flmsg" #~ msgid "Save image as:" #~ msgstr "Salva immagine come:" #~ msgid "Colors and Fonts" #~ msgstr "Colori e Caratteri" #, fuzzy #~ msgid "Disp" #~ msgstr "Visualizzazione" #~ msgid "64-bit (long) interleave" #~ msgstr "Interleave a 64 bit (lunga)" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Larghezza di banda del filtro di ricezione" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Larghezza del filtro" #, fuzzy #~ msgid "Navtex stations file:" #~ msgstr "Salva file delle macro" #~ msgid "Set page width" #~ msgstr "Imposta la larghezza della pagina" #~ msgid "after:" #~ msgstr "dopo:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (hidden)" #, fuzzy #~ msgid "Displays" #~ msgstr "Visualizzazione" #~ msgid "Tx Power" #~ msgstr "Potenza Tx" #~ msgid "Ser# in" #~ msgstr "Ser.ric." #~ msgid "Save log before exiting?" #~ msgstr "Salvare il log prima di uscire?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Salvare le modifiche alle macro prima di uscire?" #~ msgid "QSO Freq" #~ msgstr "Freq QSO" #~ msgid "Cnty" #~ msgstr "Cnty" #~ msgid "#Out" #~ msgstr "Dato" #~ msgid "#In" #~ msgstr "Ric" #~ msgid "Xchg" #~ msgstr "Rapp" #~ msgid "Not an ADIF file" #~ msgstr "File non in formato ADIF" #~ msgid "View log" #~ msgstr "Vedi log" #~ msgid "A message was logged" #~ msgstr "Un messaggio e` stato loggato" #~ msgid "Text:" #~ msgstr "Testo:" #~ msgid "The right audio channel is disabled. Enable it now?" #~ msgstr "Il canale audio destro è disabilitato. Abilitarlo ora?" #~ msgid "Double-click on RX text enters QSO data" #~ msgstr "Doppio click su testo ricevuto riempie i campi del log" #~ msgid "Cursor color" #~ msgstr "Colore del cursore" #~ msgid "Cursor center line" #~ msgstr "Linea centrale" #~ msgid "Bandwidth tracks" #~ msgstr "Tracce largh. banda" #~ msgid "Tracking range (WPM)" #~ msgstr "Ampiezza di inseguimento (WPM)" #~ msgid "Tx Atten (dB)" #~ msgstr "Atten. Tx (dB)" #~ msgid "Callsign DB" #~ msgstr "Callsign DB" #~ msgid "CDROM" #~ msgstr "CDROM" #~ msgid "Paid online subscription" #~ msgstr "Connessione online a pagamento" #~ msgid "On Date" #~ msgstr "Data inizio" #~ msgid "Off Date" #~ msgstr "Data fine" #~ msgid "Freq Analysis" #~ msgstr "Analisi di Frequenza" #~ msgid "Auto Extract files from rx stream" #~ msgstr "Estrai automaticamente i file dal flusso rx" #~ msgid "" #~ "0\n" #~ "1\n" #~ "2" #~ msgstr "" #~ "0\n" #~ "1\n" #~ "2" #~ msgid "Enable detection && extraction" #~ msgstr "Abilita decodifica ed estrazione" #~ msgid "Auto open wrap folder" #~ msgstr "" #~ "Apri automaticamente\n" #~ "la cartella wrap" #~ msgid "Autostart flmsg upon detection of compatible file" #~ msgstr "" #~ "Avvia automaticamente flmsg quando viene rilevato un file compatibile" #~ msgid "Search for reg-exp in browser text(s)" #~ msgstr "Regular expression da usare per la ricerca nel testo del navigatore" fldigi-4.1.06/po/el.po0000664000175000017500000065707013515625024011363 00000000000000# Greek translation file for Fldigi. # Copyright (C) 2017 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Haris Andrianos , 2017. # msgid "" msgstr "" "Project-Id-Version: fldigi 4.0.19.53\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2018-11-10 13:07+0200\n" "Last-Translator: Haris Andrianos \n" "Language-Team: Greek (Haris Andrianos) \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: iso-8859-7\n" "X-Generator: Poedit 2.2\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "" #: src/main.cxx:1710 msgid "Bad frequency" msgstr "" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 msgid "Could not make directory " msgstr "Αδυναμία δημιουÏγίας φακέλου " #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "ΚαταγÏαφή όλου του κειμένου Λήψης/Εκπομπής" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "Έλεγχος Π/Δ" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "&Mode λειτουÏγίας" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Εμφ.λιγότεÏων mode" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Εμφ.όλων των mode" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "ΠÏοβολή" #: src/dialogs/fl_digi.cxx:198 msgid "MFSK Image" msgstr "Εικόνα MFSK" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "THOR εικόνα Raw" #: src/dialogs/fl_digi.cxx:200 msgid "IFKP Raw Image" msgstr "IFKP εικόνα Raw" #: src/dialogs/fl_digi.cxx:201 msgid "Weather Fax Image RX" msgstr "Λήψη εικόνας Weather Fax" #: src/dialogs/fl_digi.cxx:202 msgid "Weather Fax Image TX" msgstr "Αποστολή εικόνας Weather Fax" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "ΧώÏες" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "ΠλήÏες" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "ΜεÏικό" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Κανένα" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "ΣταθεÏÏŒ παλμογÏάφημα" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "ΛιγότεÏα Ïυθμιστικά" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "Εμφ.καναλιών" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "ΣÏνδεση με server" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "ΠÏοσαÏμοσμένο..." #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "Αποθήκευση αλλαγών macros;" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "ΑκÏÏωση" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Αποθήκευση" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "ΧωÏίς αποθήκευση" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "Μετάβαση σε ARQ I/O" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "Όχι" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Îαι" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "Δεν δόθηκε όνομα αÏχείου" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "Format δεν υποστηÏίζεται" #: src/dialogs/fl_digi.cxx:2700 msgid "channels != 1" msgstr "κανάλια != 1" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "Άγνωστο σφάλμα αÏχείου wave" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "ΑπενεÏγ.Spotting" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Δεν ήταν δυνατή η εκτέλεση ενός Ï€ÏογÏάμματος πεÏιήγησης Web:\n" "%s \n" "\n" "Άνοιγμα αυτής της URL με μη αυτόματο Ï„Ïόπο:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Δεν ήταν δυνατό το άνοιγμα της διεÏθυνσης URL:\n" "\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Έλεγχος για ενημεÏώσεις..." #: src/dialogs/fl_digi.cxx:2858 msgid "Update site not available" msgstr "Δεν υπάÏχει διαθέσιμο site ενημεÏώσεων" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "ΤÏέχετε την τελευταία έκδοση" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "" "Πιθανότατα Ï„Ïέχετε μια έκδοση alpha, %s\n" "\n" "Δημοσιευμένη έκδοση: %s" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, c-format msgid "Version %s is available at Source Forge" msgstr "Η έκδοση %s είναι διαθέσιμη στο Source Forge" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "ΠληÏοφοÏίες της συσκευής ήχου είναι διαθέσιμες μόνο για το backend του " "PortAudio" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "Συσκευή εγγÏαφής" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "Συσκευή αναπαÏαγωγής" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Συσκευές εγγÏαφής και αναπαÏαγωγής" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Δεν υπάÏχει, δημιουÏγία;" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "ΚαθαÏισμός πεδίων log;" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Επιβεβ." #: src/dialogs/fl_digi.cxx:4525 msgid "Save changed configuration?" msgstr "Αποθήκευση αλλαγών Ïυθμίσεων;" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 msgid "Save log entry?" msgstr "Αποθήκευση καταχώÏησης log;" #: src/dialogs/fl_digi.cxx:4557 msgid "Confirm Quit" msgstr "Επιβεβαίωση εξόδου" #: src/dialogs/fl_digi.cxx:4579 msgid "Confirm quit?" msgstr "Επιβεβαίωση εξόδου;" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "ΑÏχείο" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Φάκελοι" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Φάκελος Ïυθμ.Fldigi..." #: src/dialogs/fl_digi.cxx:5865 msgid "FLMSG files..." msgstr "ΑÏχεία FLMSG..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "ΑÏχεία NBEMS..." #: src/dialogs/fl_digi.cxx:5867 msgid "Data files..." msgstr "ΑÏχεία δεδομένων..." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Άνοιγμα ..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Αποθήκευση ..." #: src/dialogs/fl_digi.cxx:5875 msgid "Config Scripts" msgstr "Script Ïυθμίσεων" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "Εκτέλεση" #: src/dialogs/fl_digi.cxx:5877 msgid "Generate" msgstr "ΔημιουÏγία" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "ΚαταγÏαφή κειμένου" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Ήχος" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "ΚαταγÏαφή σημάτων Λήψης" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "ΔημιουÏγία σημάτων Εκπομπής" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "ΑναπαÏαγωγή" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Έξοδος" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "ΡÏθμιση" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "ΧÏώματα && ΓÏαμματοσειÏές" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "ΧειÏιστής" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "ΠεÏιβάλλον ΧÏήστη" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "ΚαταÏÏάκτης" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "Ρυθμιστικά καταÏÏάκτη" #: src/dialogs/fl_digi.cxx:6146 msgid "Operating" msgstr "" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 msgid "Active Modem" msgstr "ΕνεÏγό Modem" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "ΚάÏτα ήχου" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "ΔιάφοÏα" #: src/dialogs/fl_digi.cxx:6155 msgid "CPU speed" msgstr "ΤαχÏτητα CPU" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "" #: src/dialogs/fl_digi.cxx:6157 msgid "PSKmail" msgstr "" #: src/dialogs/fl_digi.cxx:6158 msgid "PSK reporter" msgstr "" #: src/dialogs/fl_digi.cxx:6159 msgid "Sweet spot" msgstr "" #: src/dialogs/fl_digi.cxx:6160 msgid "Text IO" msgstr "" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Άλλα" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "Αυτόμ.εκκίν." #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 msgid "IO" msgstr "" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Ειδοποιήσεις" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 msgid "PSM" msgstr "" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 msgid "Test Signals" msgstr "Σήματα δοκιμών" #: src/dialogs/fl_digi.cxx:6175 msgid "Contest/Logging" msgstr "" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Αποθήκευση Ïυθμίσεων" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Εμφ./ΑπόκÏ.καναλιών" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "ΠεÏιηγητής σημάτων" #: src/dialogs/fl_digi.cxx:6190 msgid "View/Hide 48 macros" msgstr "Εμφ./ΑπόκÏ.48 macros" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "ΕλεÏθεÏο παλμογÏάφημα" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "Αναλυτής φάσματος" #: src/dialogs/fl_digi.cxx:6205 msgid "Rig/Log Controls" msgstr "" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "Εμφάνιση" #: src/dialogs/fl_digi.cxx:6221 msgid "Files" msgstr "ΑÏχεία" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Άνοιγμα..." #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Îέο" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "Ένωση..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "Εξαγωγή..." #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "ΑναφοÏές" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "" #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "" #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "" #: src/dialogs/fl_digi.cxx:6242 msgid "Field Day Logging" msgstr "" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "Βοήθεια" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "ΔημιουÏγία sunspots" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "" #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Ιστότοπος Fldigi..." #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "ΑναφοÏές λήψης..." #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Επιλογές γÏαμμής εντολών" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "ΠληÏοφ.συσκευής ήχου" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Έλεγχος για ενημεÏώσεις..." #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "Σχετικά" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "ΔΕΠΕΧΕΙ ΟΡΙΣΤΕΙ CALLSIGN" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Κλείσιμο λίστας" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Άνοιγμα λίστας" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "ΚαθαÏισμός λίστας;" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "αναφοÏά" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "αναφοÏές" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "ΠÏόσφατη δÏαστηÏιότητα για το grid" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "ΠεÏιηγητής σημάτων" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "ΠαλμογÏάφημα" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Επίπεδο ανίχν.σήματος" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Επίπεδο Squelch" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "ΑÏιστεÏÏŒ κλικ: αλλαγή mode\n" "Δεξί κλικ: ÏÏθμιση" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "Εξασθενητής επιπέδου Εκπομπής (dB)" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "" #: src/dialogs/fl_digi.cxx:8226 msgid "Power Signal Monitor" msgstr "" #: src/dialogs/fl_digi.cxx:9943 msgid "Delete entry?" msgstr "ΔιαγÏαφή καταχώÏησης;" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Όλα" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "ΕÏÏεση: " #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Κλείσιμο" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "ΚαθαÏισμός" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "ΑÏιστεÏÏŒ κλικ για καθαÏισμό κειμένου\n" "Δεξί κλικ για επαναφοÏά συχνοτήτων" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "Εξαγωγή σε αÏχείο CSV" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "Εξαγωγή σε αÏχείο σταθεÏών πεδίων" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "Εξαγωγή σε αÏχείο ADIF" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "Αποθήκευση αλλαγών Logbook;" #: src/logbook/logsupport.cxx:381 msgid "Create new logbook file" msgstr "ΔημιουÏγία νέου αÏχείου logbook" #: src/logbook/logsupport.cxx:404 #, c-format msgid "%s exists, overwrite?" msgstr "%s υπάÏχει, αντικατάσταση;" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Άνοιγμα αÏχείου logbook" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Αποθήκευση αÏχείου logbook" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "Συγχώνευση βάσης δεδομένων σε εξέλιξη" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "Ένωση αÏχείων ADIF" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" "Δεν ήταν δυνατή η εÏÏεση του αÏχείου report LoTW.\n" "\n" "Λήψη από τη σελίδα LoTW ARRL μετά τη σÏνδεση στο: \n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "ΑποθηκεÏστε το αÏχείο αναφοÏάς στο φάκελο fldigi LOTW,\n" "\n" "ονομάζοντας το αÏχείο ' lotwreport. adi '" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "ΕνημέÏ." #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "ΔιαγÏαφή καταχώÏησης για \"%s\";" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "ΔημιουÏγία αναφοÏάς cabrillo" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "Λήψη αÏχείου LoTW" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "Αδυναμία έναÏξης flmsg" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "Εντοπισμός εκτελέσιμου flmsg" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "Εντοπισμός εκτελέσιμου" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:497 msgid "Locate binary" msgstr "Εντοπισμός binary" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "Mode Π/Δ" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Πάντα LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Πάντα USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "ΕπαναφοÏά όλων των επιλογών στις αÏχικές τιμές;\n" "\n" "Η επαναφοÏά θα Ï€Ïαγματοποιηθεί στην επόμενη επανεκκίνηση\n" "Τα αÏχεία: fldigi_def.xml και fldigi.prefs θα διαγÏαφοÏν!\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Επιβεβαίωση ΕΠΑÎΑΦΟΡΑΣ" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "" #: src/misc/debug.cxx:89 msgid "Error" msgstr "" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "" #: src/misc/debug.cxx:89 msgid "Info" msgstr "" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "" #: src/misc/debug.cxx:105 msgid "KISS control" msgstr "Έλεγχος KISS" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "" #: src/misc/macroedit.cxx:78 msgid "\tmy FD class" msgstr "" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:80 msgid "\tmy state" msgstr "" #: src/misc/macroedit.cxx:81 msgid "\tmy ST" msgstr "" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:83 msgid "\tmy CNTY" msgstr "" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "" #: src/misc/macroedit.cxx:93 msgid "\tother State" msgstr "" #: src/misc/macroedit.cxx:94 msgid "\tother Province" msgstr "" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "" #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "" #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "" #: src/misc/macroedit.cxx:112 msgid "\tclear TX pane" msgstr "" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:137 msgid "\tlocal time, default %H%M" msgstr "" #: src/misc/macroedit.cxx:138 msgid "\tzulu time default %H%MZ" msgstr "" #: src/misc/macroedit.cxx:139 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "" #: src/misc/macroedit.cxx:140 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "" #: src/misc/macroedit.cxx:153 msgid "\tcurrent contest serno" msgstr "" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:155 msgid "\tFD class" msgstr "" #: src/misc/macroedit.cxx:156 msgid "\tFD section" msgstr "" #: src/misc/macroedit.cxx:157 msgid "\tcontest class" msgstr "" #: src/misc/macroedit.cxx:158 msgid "
\tARRL section" msgstr "" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr low cutoff filter" msgstr "" #: src/misc/macroedit.cxx:175 msgid "\tvalid xcvr hi cutoff filter" msgstr "" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "" #: src/misc/macroedit.cxx:183 msgid "\tinsert image file" msgstr "" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tpause transmit" msgstr "" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "" #: src/misc/macroedit.cxx:200 msgid "\tsend mode ID; TX start only" msgstr "" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:229 msgid "\tsave current macro file" msgstr "" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:243 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:247 msgid "\tAnalysis CSV on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "ΑÏχείο κειμένου για εισαγωγή" #: src/misc/macroedit.cxx:384 msgid "Test text file" msgstr "Δοκιμαστικό αÏχείο κειμένου" #: src/misc/macroedit.cxx:394 msgid "MFSK image file" msgstr "ΑÏχείο εικόνας MFSK" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "" #: src/misc/macroedit.cxx:414 msgid "Select wav file" msgstr "Επιλογή αÏχείου wav" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "Εκτελέσιμο αÏχείο για εισαγωγή" #: src/misc/macroedit.cxx:457 msgid "Macro Text" msgstr "Κείμενο Macro" #: src/misc/macroedit.cxx:462 msgid "Select Tag" msgstr "Επιλογή ετικέτας" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "Ετικέτα ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï macro" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "ΕφαÏμογή" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "ΕπεξεÏγαστής macro - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Άνοιγμα αÏχείου macro" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "Αποθήκευση αÏχείου macro" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Τέλος" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Επόμενο" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Πίσω" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "Ο βοηθός θα σας οδηγήσει για τις βασικές Ïυθμίσεις του fldigi" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "ΜποÏείτε να παÏαλείψετε οποιοδήποτε βήμα του βοηθοÏ" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Όλες οι Ïυθμίσεις που εμφανίζονται μποÏοÏν να αλλάξουν αÏγότεÏα από το Î¼ÎµÎ½Î¿Ï " "Ρυθμίσεων" #: src/misc/newinstall.cxx:540 msgid "Fldigi configuration wizard" msgstr "Βοηθός ÏÏθμισης Fldigi" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "ΧÏόνος που απαιτείται: " #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "ΦόÏτωση αÏχείου εικόνας" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Αποστολή εικόνας" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "ΦοÏτώστε ή σÏÏετε ένα αÏχείο εικόνας\n" "ΥποστηÏιζόμενοι Ï„Ïποι: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "ΤαχÏτητα μεταφοÏάς X1-κανονική" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "ΦόÏτωση" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "ΚαταÏÏάκτης / FFT / ΠαλμογÏάφημα" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Ανώτατη στάθμη σήματος (dB)" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "ΕÏÏος σήματος (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Αλλαγή κλίμακας καταÏÏάκτη" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "ΕπικέντÏωση Ï€Ïοβολής στο σήμα" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "ΤαχÏτητα κÏλισης καταÏÏάκτη" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "ΡÏθμιση συχνότητας κέÏσοÏα" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Αποθήκευση mode και συχνότητας\n" "Δεξί κλικ για λίστα" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Κλείδωμα συχνότητας εκπομπής" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "ΑναστÏοφή" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Εκπομπή/Λήψη" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "Αναζήτ.σήματος" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "ΚÏλιση" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Άνοιγμα αÏχείου Π/Δ xml" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "" #: src/soundcard/sound.cxx:170 msgid "Waveform Audio Format\t*.wav\n" msgstr "" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "ΑÏχείο ήχου" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "Λήψη RSID" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "ΑφαίÏεση" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Επιλογή" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "ΉπειÏος" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "Αποεπιλογή" #: src/spot/notify.cxx:519 msgid "Add" msgstr "ΠÏοσθήκη" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Δοκιμή..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Επιλ.όλων" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "ΚαθαÏ.όλων" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "ΧώÏα" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "" #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "" #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "ΠÏώτα οÏίστε το callsign σας." #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Εκτέλεση Ï€ÏογÏάμματος" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "" #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "" #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "Συχνότητα" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "" #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 msgid "County" msgstr "" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:159 msgid "RST(s)" msgstr "" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "" #: src/widgets/FTextRXTX.cxx:161 msgid "Rx Serial #" msgstr "" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 msgid "Section" msgstr "" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 msgid "SS check" msgstr "" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 msgid "SS section" msgstr "" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp state" msgstr "" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp name" msgstr "" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Εισαγωγή σημαδιοÏ" #: src/widgets/FTextRXTX.cxx:198 msgid "All entries" msgstr "" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr "" #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Εκπομπή" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "Λήψη" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "ΑπόÏÏιψη" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Αποστολή εικόνας..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "Ειδ.χαÏακτ." #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 msgid "A" msgstr "" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 msgid "E" msgstr "" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 msgid "I" msgstr "" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 msgid "N" msgstr "" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 msgid "O" msgstr "" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 msgid "U" msgstr "" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Εισαγωγή κειμένου" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Αποθήκευση κειμένου ως" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "ΑντιγÏαφή" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Αποθήκευση ως..." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "Αναδίπλωση λέξεων" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Αποκοπή" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Επικόλληση" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Εισαγωγή αÏχείου..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "ΑναίÏεση" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "ΔιαγÏαφή" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, c-format msgid "Executing script file: %s" msgstr "Εκτέλεση του αÏχείου script: %s" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "ΟÏισμένες αλλαγές που έγιναν από στο script απαιτοÏν\n" "επανεκκίνηση του Ï€ÏογÏάμματος Ï€Ïιν να γίνουν ενεÏγές." #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "Λείπει η εντολή %s μετά τη γÏαμμή%d" #: src/config_script/script_parsing.cxx:394 msgid "Command Not Found" msgstr "Η εντολή δεν βÏέθηκε" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:414 msgid "General Error" msgstr "" #: src/config_script/script_parsing.cxx:418 msgid "No Errors" msgstr "" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "Δεν βÏέθηκε αÏχείο" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "ΔιαδÏομή φακέλου δεν βÏέθηκε" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "Η παÏάμετÏος δεν είναι έγκυÏη." #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "Εντολή λείπει ':'." #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "Σφάλμα ανάγνωσης αÏχείου" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "ΑπÏοσδιόÏιστο σφάλμα" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "ΓÏαμμή: %d Σφάλμα:%d %s (%s)" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "Αδυναμία ανοίγματος αÏχείου %s" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 msgid "no" msgstr "Όχι" #: src/dialogs/confdialog.cxx:330 msgid "yes" msgstr "Îαι" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Εμφάνιση" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "ΑπόκÏυψη" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "ΡÏθμιση Fldigi" #: src/dialogs/confdialog.cxx:8227 msgid "Station / Operator" msgstr "Σταθμός / ΧειÏιστής" #: src/dialogs/confdialog.cxx:8230 msgid "Station Callsign:" msgstr "Callsign σταθμοÏ:" #: src/dialogs/confdialog.cxx:8231 msgid "Station callsign" msgstr "Callsign σταθμοÏ" #: src/dialogs/confdialog.cxx:8244 msgid "Operator Callsign:" msgstr "Callsign χειÏιστή:" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "Callsign χειÏιστή (εάν είναι διαφοÏετικό από το callsign σταθμοÏ)" #: src/dialogs/confdialog.cxx:8259 msgid "Operator Name:" msgstr "Όνομα χειÏιστή:" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Όνομα χειÏιστή" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "ΚεÏαία:" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "ΣÏντομη πεÏιγÏαφή κεÏαίας" #: src/dialogs/confdialog.cxx:8287 msgid "Station QTH:" msgstr "QTH σταθμοÏ:" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "QTH σταθμοÏ" #: src/dialogs/confdialog.cxx:8301 msgid "Station Locator:" msgstr "Locator σταθμοÏ:" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "ΠεÏιηγητής" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Κανάλια, το Ï€Ïώτο κανάλι ξεκινάει από το κατώτεÏο ÏŒÏιο του καταÏÏάκτη" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "Αλλαγή αÏÎ¹Î¸Î¼Î¿Ï ÎºÎ±Î½Î±Î»Î¹ÏŽÎ½ στον πεÏιηγητή σημάτων" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "ΧÏόνος αδÏάνειας" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "ΚαθαÏισμός του κειμένου καναλιοÏ\n" "μετά από # δευτεÏόλεπτα αδÏάνεια" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Ετικέτα καναλιοÏ" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Εμφάνιση ετικέτας του κάθε καναλιοÏ" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "Συχνότητα ήχου" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "Συχνότητα Π/Δ" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "ΑÏιθ.καναλιοÏ" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "ΓÏαμμ..." #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "επιλογή γÏαμματοσειÏάς πεÏιηγητή" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "Συνεχόμενη κÏλιση" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "ON - Συνεχή κÏλιση κειμένου\n" "OFF - ΚαθαÏισμός & επανεκκίνηση κειμένου" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "ΧαμηλότεÏη συχνότητα στο κάτω μέÏος" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "Αλλαγή θέσεων των χαμηλών Ï€Ïος υψηλών καναλιών" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "ΑναπαÏαγωγή ιστοÏÎ¹ÎºÎ¿Ï ÏŒÏ„Î±Î½ επιλέγεται ενεÏγό κανάλι" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "Το ιστοÏικό Ïοής ήχου αποκωδικοποιείται στο επιλεγμένο σήμα" #: src/dialogs/confdialog.cxx:8467 msgid "Detection Level" msgstr "Επίπεδο εντοπισμοÏ" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "Κουμπί" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "ΧÏώματα γÏαμμών πεÏιηγητή" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:8497 msgid "Even" msgstr "Ζυγές" #: src/dialogs/confdialog.cxx:8498 msgid "Even lines" msgstr "Ζυγές γÏαμμές" #: src/dialogs/confdialog.cxx:8503 msgid "Odd" msgstr "Μονές" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "Μονές γÏαμμές" #: src/dialogs/confdialog.cxx:8510 msgid "Select line" msgstr "Επιλογή γÏαμμής" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "Γενικά" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Εμφ.βοηθ.κειμένου" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "ΕνεÏγοποίηση / ΑπενεÏγοποίηση Î²Î¿Î·Î¸Î·Ï„Î¹ÎºÎ¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Εμφάνιση εικονιδίων μενοÏ" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "ΕνεÏγοποίηση ΑπενεÏγοποίηση εικονιδίων στα μενοÏ" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "Σχέδιο UI" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Αλλαγή όψης και αίσθησης του Ï€ÏογÏάμματος" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "ΟÏατά modes" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Επιλογή modes για Ï€Ïόσβαση στο μενοÏ" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "Γλώσσα πεÏιβ.χÏήστη (UI)" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Οι αλλαγές θα εφαÏμοστοÏν στην επόμενη επανεκκίνηση του Ï€ÏογÏάμματος" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "ΑποτÏπωση CW / RTTY / THROB / CONTESTIA με πεζά" #: src/dialogs/confdialog.cxx:8591 msgid "Transmit lower case text" msgstr "Εκπομπή κειμένου σε πεζά" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "Υπενθυμίσεις εξόδου" #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "ΕÏÏŽÏ„.για αποθήκευση Ïυθμίσεων" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "ΕÏÏŽÏ„.για αποθήκ.αÏχείου macro" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "Αποθήκευση του Ï„Ïέχοντος macro set κατά την έξοδο" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "ΕÏÏŽÏ„.για αποθήκευση log" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "ΕÏώτηση για αποθήκευση καταχώÏησης log" #: src/dialogs/confdialog.cxx:8618 msgid "Confirm exit" msgstr "Επιβεβαίωση εξόδου" #: src/dialogs/confdialog.cxx:8625 msgid "Check for updates" msgstr "Έλεγχος για ενημεÏώσεις" #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "Έλεγχος για ενημεÏώσεις κατά την εκκίνηση του Ï€ÏογÏάμματος" #: src/dialogs/confdialog.cxx:8638 msgid "Show TX timer" msgstr "Εμφάνιση χÏονομέτÏου Εκπομπής" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "ÎŒÏιο χÏόνου Εκπομπής (λεπτά)" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "" #: src/dialogs/confdialog.cxx:8658 msgid "QSO" msgstr "" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "" #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "ΕÏÏŽÏ„.για αποθήκ.log κατά την έξοδο" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "ΚαθαÏισμός κατά την αποθήκευση" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "ΚαθαÏισμός των πεδίων στο log μετά την αποθήκευση της επαφής" #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "ΜετατÏοπή callsign σε ΚΕΦΑΛΑΙΑ" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "ΜετατÏοπή του πεδίου callsign σε ΚΕΦΑΛΑΙΑ" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Αυτόμ.συμπλήÏ.ΧώÏας και Αζιμουθίου" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" "ΣυμπλήÏωση ΧώÏας / Αζιμουθίου χÏησιμοποιώντας πληÏοφοÏίες από το αÏχείο cty." "dat" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "Ταξινόμηση κατά ΗμεÏ/ÎÏα OFF" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Η ταξινόμηση κατά ΗμεÏ/ÎÏα OFF - επηÏεάζει όλες τις αναφοÏές ADIF/Cabrillo" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "ΗμεÏ./ÎÏα ON == OFF" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "ΟÏισμός υποχÏεωτικά ΗμεÏ./ÎÏα ON == ΗμεÏ./ÎÏα OFF" #: src/dialogs/confdialog.cxx:8698 msgid "Default RST in to 599/59" msgstr "RST in 599/59 από Ï€Ïοεπιλογή" #: src/dialogs/confdialog.cxx:8699 msgid "Clear log controls sets RST in to 599/59" msgstr "Αυτόματη συμπλήÏωση του πεδίου RST in με 599/59 κατά την εκκαθάÏιση" #: src/dialogs/confdialog.cxx:8704 msgid "Default RST out to 599/59" msgstr "RST out 599/59 από Ï€Ïοεπιλογή" #: src/dialogs/confdialog.cxx:8705 msgid "Clear log controls sets RST out to 599/59" msgstr "Αυτόματη συμπλήÏωση του πεδίου RST out με 599/59 κατά την εκκαθάÏιση" #: src/dialogs/confdialog.cxx:8710 msgid "cty.dat folder" msgstr "Φάκελος cty.dat" #: src/dialogs/confdialog.cxx:8711 msgid "Enter full path-name for cty.dat folder" msgstr "Εισάγετε πλήÏη διαδÏομή αÏχείου για το cty.dat" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "Εντοπισ." #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "Εντοπισμός αÏχείου cty.dat" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "Επαναφ." #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "ΕπαναφέÏει τον αÏχικό φάκελο του cty.dat" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "ΕπαναφοÏÏ„." #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "ΞαναφοÏτώνει το αÏχείο cty.dat" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "ΙσχÏÏ‚ εκπομπής" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "ΙσχÏÏ‚ εξόδου που χÏησιμοποιείται για καταχωÏήσεις στο log" #: src/dialogs/confdialog.cxx:8751 msgid "Display logbook read datum at start" msgstr "Εμφάνιση ονόματος αÏχείου logbook κατά την εκκίνηση" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "Το όνομα αÏχείου εμφανίζεται στον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 msgid "Rx Text" msgstr "Κείμενο Λήψης" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "Συλλογή κειμένου με μονό κλικ" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "" "ΕνεÏγοποιήστε για αυτόματη συμπλήÏωση πεδίου log με μονό κλικ στον πίνακα " "Λήψης" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "βοηθ.κείμενο του callsign στο λαμβαν.κείμενο" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Αναδυόμενες πληÏοφοÏίες μετά από ένα πέÏασμα 2 δευτεÏολέπτων στο callsign" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "ΔιαχωÏιστικά λέξεων" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "Μονάδες απόστασης ΗΠΑ (QRB)" #: src/dialogs/confdialog.cxx:8801 msgid "Clear log fields - new CALL" msgstr "ΚαθαÏισμός πεδίων log- νέο CALL" #: src/dialogs/confdialog.cxx:8812 msgid "Connect to MacLogger" msgstr "" #: src/dialogs/confdialog.cxx:8817 msgid "Capture Radio Report" msgstr "" #: src/dialogs/confdialog.cxx:8823 msgid "Capture Log Report" msgstr "" #: src/dialogs/confdialog.cxx:8828 msgid "Capture Lookup " msgstr "" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 msgid "Enable UDP log file" msgstr "" #: src/dialogs/confdialog.cxx:8848 msgid "UDP data stream" msgstr "" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8868 msgid "Clear text" msgstr "ΚαθαÏ.κειμένου" #: src/dialogs/confdialog.cxx:8871 msgid "Address" msgstr "ΔιεÏθυνση" #: src/dialogs/confdialog.cxx:8872 msgid "N3FJP Server IP Address" msgstr "" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 msgid "Port" msgstr "ΘÏÏα" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "ΕπιστÏοφή της διεÏθυνση IP και του αÏιθμοÏ\n" "θÏÏας στην Ï€Ïοεπιλεγμένη τιμή." #: src/dialogs/confdialog.cxx:8905 msgid "Enable Data Stream" msgstr "ΕνεÏγοποίηση Ïοής δεδομένων" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 msgid "Connect" msgstr "ΣÏνδεση" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 msgid "Connected" msgstr "Συνδεδεμένο" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 msgid "Contests" msgstr "" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 msgid "State QSO Party" msgstr "" #: src/dialogs/confdialog.cxx:8980 #, fuzzy msgid "Text capture order" msgstr "ΚαταγÏαφή κειμένου" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Context Notes" msgstr "ΕνδιαφέÏουσες σημειώσεις" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "Έλεγχος διπλότυπου CALL συν" #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Έλεγχος για διπλότυπα" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Μπάντα" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "Η μπάντα Ï€Ïέπει να είναι ίδια" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "Το Mode Ï€Ïέπει να είναι ίδιο" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "ΔιαφοÏά ÏŽÏας πάνω από" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "Δεν Ï€Ïέπει να γίνει QSO μέσα σε αυτό το χÏονικά διάστημα" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "ΧÏώμα Dup" #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "ΑÏιστεÏÏŒ κλικ για επιλογή χÏώματος διπλότυπων" #: src/dialogs/confdialog.cxx:9029 #, fuzzy msgid "? Dup Color" msgstr "ΧÏώμα Dup" #: src/dialogs/confdialog.cxx:9030 #, fuzzy msgid "Left click to select possible dup color" msgstr "ΑÏιστεÏÏŒ κλικ για επιλογή χÏώματος διπλότυπων" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "λεπτά" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "Εισαγωγή χÏÎ¿Î½Î¹ÎºÎ¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ σε λεπτά" #: src/dialogs/confdialog.cxx:9069 msgid "Contest Exchange / Serial #" msgstr "Ανταλλαγές Contest / σειÏιακός αÏιθμ." #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 msgid "Send" msgstr "Αποστολή" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "" #: src/dialogs/confdialog.cxx:9087 msgid "RST always 599/59" msgstr "RST πάντα 599/59" #: src/dialogs/confdialog.cxx:9088 msgid "Force RST in/out to 599/59" msgstr "RST out 599/59 από Ï€Ïοεπιλογή" #: src/dialogs/confdialog.cxx:9093 msgid "Send CW cut #'s" msgstr "" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "" #: src/dialogs/confdialog.cxx:9101 msgid "Start Nbr" msgstr "ΑÏχικός αÏιθ." #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "ΑÏχικός αÏιθμός" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Ψηφία" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "ΑÏιθμός ψηφίων στον σειÏιακό αÏιθμό" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "ΧÏήση αÏχικών μηδενικών" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "ΠÏοσθήκη αÏχικών μηδενικών στον εκπεμπόμενο σειÏιακό αÏιθμό" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Επαναφ." #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "ΑÏχικοποίηση των QSO logging πεδίων" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 msgid "Operator Call" msgstr "ΧαÏακτηÏιστικό ΧειÏιστή" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:9170 msgid "My Section" msgstr "" #: src/dialogs/confdialog.cxx:9171 msgid "Field Day Section" msgstr "" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 msgid "Scout Operator Name" msgstr "" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "ΕνεÏγή Ïοδέλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î± κουμπιά macro" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "ΕνεÏγοποίηση της Ïοδέλας Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î± κουμπιά macro" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Πλήθος και θέση των μπαÏών macro" #: src/dialogs/confdialog.cxx:9282 msgid "Button Height" msgstr "Ύψος κουμπιοÏ" #: src/dialogs/confdialog.cxx:9283 msgid "Height of macro bar" msgstr "Ύψος της μπάÏας macro" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "Μία επάνω από Rx/Tx" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Μονή μπάÏα macro κάτω από τον logging πίνακα\n" "μεταβλητό Ïψος" #: src/dialogs/confdialog.cxx:9299 msgid "One above waterfall" msgstr "Μία επάνω από καταÏÏ." #: src/dialogs/confdialog.cxx:9304 msgid "One below waterfall" msgstr "Μία κάτω από καταÏÏ." #: src/dialogs/confdialog.cxx:9309 msgid "Two scheme 1" msgstr "Σχέδιο των δÏο 1" #: src/dialogs/confdialog.cxx:9314 msgid "Two scheme 2" msgstr "Σχέδιο των δÏο 2" #: src/dialogs/confdialog.cxx:9319 msgid "Two scheme 3" msgstr "Σχέδιο των δÏο 3" #: src/dialogs/confdialog.cxx:9324 msgid "Two scheme 4" msgstr "Σχέδιο των δÏο 4" #: src/dialogs/confdialog.cxx:9329 msgid "Two scheme 5" msgstr "Σχέδιο των δÏο 5" #: src/dialogs/confdialog.cxx:9334 msgid "Two scheme 6" msgstr "Σχέδιο των δÏο 6" #: src/dialogs/confdialog.cxx:9339 msgid "Two scheme 7" msgstr "Σχέδιο των δÏο 7" #: src/dialogs/confdialog.cxx:9344 msgid "Two scheme 8" msgstr "Σχέδιο των δÏο 8" #: src/dialogs/confdialog.cxx:9349 msgid "Two scheme 9" msgstr "Σχέδιο των δÏο 9" #: src/dialogs/confdialog.cxx:9354 msgid "Two scheme 10" msgstr "Σχέδιο των δÏο 10" #: src/dialogs/confdialog.cxx:9363 msgid "Load last used macro file at start" msgstr "ΦόÏÏ„.τελευτ.αÏχείου macro κατά την εκκίν." #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - χÏήση του τελευταίου σετ macros\n" "OFF - χÏήση του Ï€ÏοκαθοÏισμένου σετ" #: src/dialogs/confdialog.cxx:9369 msgid "Display macro filename at start" msgstr "ΠÏοβολή αÏχείου macro κατά την εκκίνηση" #: src/dialogs/confdialog.cxx:9385 msgid "Show macro control codes" msgstr "Εμφ.χαÏακτήÏων ελέγχου macro" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "εμφάνιση των ^! συμβόλων εκτέλεσης στον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "4 bar macro κάτω από πίνακα εκπομπ." #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" "Τοποθετεί τις 4 μπάÏες macro κάτω από τον πίνακα Εκπομπής\n" "Η Ï€Ïοεπιλεγμένη ÏÏθμιση είναι επάνω από τον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:9405 msgid "WF Ctrls" msgstr "" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "ΕνεÏγ.επιλογής για την εμφάνιση του αντίστοιχου στοιχείου ελέγχου" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "ΕνεÏγ.όλων" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "ΑπενεÏγ.όλων" #: src/dialogs/confdialog.cxx:9489 msgid "Clrs/Fnts" msgstr "" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:9494 msgid "Rx/Tx Character set" msgstr "Κωδικοποίηση χαÏακτήÏων Rx/Tx" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "" "Επιλογή της κωδικοποίησης χαÏακτήÏων του Λαμβανόμενου και Εκπεμπόμενου " "κειμένου" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "" #: src/dialogs/confdialog.cxx:9539 msgid "Macro Edit Font" msgstr "" #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "Επισήμανση κειμένου" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "Απεσταλμένοι χαÏακτήÏες στους πίνακες Εκπομπής/Λήψης" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "ΧαÏακτήÏες ελέγχου στους πίνακες Λήψης/Εκπομπής" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "ΧαÏακτήÏες που παÏαλείφθηκαν στον πίνακα Εκπομπής\n" "(Tx on/off στο CW)" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "Εναλλακτικό χÏώμα χαÏακτήÏων στον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "ΣÏστημα" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "ΑÏχικές Ïυθμ." #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "Εμφάνιση των λαμβανομένων χαÏακτ.ελέγχου ως ascii string" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "ΓÏαμματ." #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "ΧÏώμα φοντ." #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "ΧÏώμα ψηφίου" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "ΧÏώμ.συστήμ." #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 msgid "Scale Color" msgstr "ΧÏώμα κλίμ." #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 msgid "Meter Color" msgstr "ΧÏώμα μετÏ." #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "ΜετÏητής ισχÏος" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "Κλίμακα ισχÏος" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 msgid "Report Browser" msgstr "" #: src/dialogs/confdialog.cxx:9721 msgid "Even Lines" msgstr "Ζυγές γÏαμ." #: src/dialogs/confdialog.cxx:9726 msgid "Odd Lines" msgstr "Μονές γÏαμ." #: src/dialogs/confdialog.cxx:9731 msgid "Stream Text" msgstr "" #: src/dialogs/confdialog.cxx:9737 msgid "Bg color" msgstr "" #: src/dialogs/confdialog.cxx:9743 msgid "Alt Color" msgstr "" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "ΧÏήση έγχÏ.κουμπιών" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Ομάδα 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "ΧÏώμα φόντου για την Ομάδα 1 των πλήκτÏων F" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Ομάδα 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "ΧÏώμα φόντου για την Ομάδα 2 των πλήκτÏων F" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Ομάδα 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "ΧÏώμα φόντου για την Ομάδα 3 των πλήκτÏων F" #: src/dialogs/confdialog.cxx:9783 msgid "Font/Color" msgstr "ΧÏώμ./ΓÏαμμ." #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "Κουμπιά" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:9808 msgid "RxID nar" msgstr "" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "" #: src/dialogs/confdialog.cxx:9820 msgid "RxID wide" msgstr "" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "ΧÏώματα ενεÏγοποιημένων φωτιζόμενων κουμπιών" #: src/dialogs/confdialog.cxx:9882 msgid "All Others" msgstr "" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "Χαμηλό" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "Υψηλό" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "Κανονικό" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "ΧÏώματα στάθμης σήματος" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Σημείωση:\n" "Αυτές οι Ïυθμίσεις είναι χÏήσιμες αλλά όχι μοναδικές για τη χÏήση του fldigi " "σε μια\n" "συσκευή με οθόνη αφής, όπως ένα tablet." #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "Τα πλήκτÏα με τα βέλη ελέγχουν την εισαγωγή συχνότητας" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "Πίνακες Λήψης/Εκπομπής" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "Εκπομπή πάνω από Λήψη" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "" "ΕνεÏγοποιήστε για τα έχετε τον πίνακα Εκπομπής επάνω από τον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "ΠÏοβολή" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "ΧÏώματα και κέÏσοÏες" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Αλλαγή χÏώματος" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "ΦόÏÏ„..." #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "ΦόÏτωση καινοÏÏιας παλέτας" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Αποθήκ..." #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "Αποθήκευση αυτής της παλέτας" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "ΕÏÏος ζώνης" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "Εμφάνιση κέÏσοÏα με γÏαμμές εÏÏους ζώνης" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "ΧÏώμα" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "ΦαÏδÏ" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "Εμφάνιση ίχνους εÏÏους ζώνης στον καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "ΚεντÏ.ΓÏαμμή" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "Εμφάνιση κέÏσοÏα με κεντÏική γÏαμμή" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "Ίχνη σήματος" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "Αποκοπή" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "Κλίμακα συχνοτήτων" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "Εμφάνιση συχνοτήτων ήχου πάντα" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "Συχνότητες ήχου ή RF στην κλίμακα του καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "Επιλογή γÏαμματοσειÏά κλίμακας καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "Σήμα εκπομπής" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "ΠαÏακολοÏθηση σήματος εκπομπής" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "Îα φαίνεται το εκπεμπόμενο σήμα στον καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Επίπεδο σήματος" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "Κατώτατο ÏŒÏιο" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "Κατώτατο ÏŒÏιο συχνότητας σε Hz" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "Ανώτατο ÏŒÏιο" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "Ανώτατο ÏŒÏιο συχνότητας σε Hz" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "ΚαθυστέÏηση μεταφ." #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "Εμφάνιση μεγαλÏτεÏου ή μικÏότεÏου καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "" #: src/dialogs/confdialog.cxx:10269 msgid "Normal drop speed / value" msgstr "" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "Ύψος καταÏÏάκτη σε pixels" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "Η χÏήση της CPU αυξάνεται με αÏξηση του Ïψους του καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Ποντίκι" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "ΑÏιστεÏÏŒ ή δεξί κλικ αναπαÏάγει πάντα το ιστοÏικό ήχου" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "ΣέÏνοντας την κλίμακα καταÏÏάκτη αλλάζει η συχνότητα" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "ΕνεÏγοποίηση συÏσίματος της κλίμακας καταÏÏάκτη με τον κέÏσοÏα" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "Εισαγωγή κειμένου με μονό αÏιστεÏÏŒ κλικ" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Εισαγωγή ÎµÎ¹Î´Î¹ÎºÎ¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï… στον πίνακα Λήψης\n" "όταν γίνεται κλικ στον καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "ΕνέÏγεια Ïοδέλας" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Επιλέξτε πως θα συμπεÏιφέÏεται η Ïοδέλα\n" "του Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î¿Î½ καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "Αναλυτής φάσματος" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "Αναλυτής φάσματος / ΑλληλεπίδÏαση καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "το αÏιστεÏÏŒ κλικ μεταφέÏει την συχν. στην κεντÏική συχν. του αναλυτή" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "το αÏιστεÏÏŒ κλικ στον καταÏÏάκτη επανακεντÏάÏει τον αναλυτή φάσματος" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "χÏήση τιμών του εÏÏους/οÏίου καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10374 msgid "values left/below waterfall" msgstr "τιμές αÏιστεÏά/κάτω από καταÏÏάκτη" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "Κλίμακα συχνότ. = Î * το εÏÏος του mode" #: src/dialogs/confdialog.cxx:10389 msgid "use" msgstr "χÏήση" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "Κλίμακα αναλυτή φάσματος συνδεδεμένη με το εÏÏος του modem" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "Αποκωδικοπ. SOM" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "Αυτόματη παÏακολ.ταχÏτητας λήψης" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "ΕÏÏος ζώνης φίλτÏου" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10451 msgid "Matched Filt'" msgstr "" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "Κατώτατο" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "Κατώτατο κατώφλι ανιχνευτή" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "Ανώτατο" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "Ανώτατο κατώφλι ανιχνευτή" #: src/dialogs/confdialog.cxx:10511 msgid "Range" msgstr "ΕÏÏος" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "ΕÏÏος +/- wpm" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "Όχι πιο αÏγό από αυτό" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "Όχι γÏηγοÏότεÏο από αυτό" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "ΧÏήση χÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Farnsworth" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "ΧÏονισμός και QSK" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "ΧÏονισμός" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "ΠαÏλα/Τελεία" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "Λόγος παÏλας και τελείας" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 msgid "Edge decrease" msgstr "" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:10735 msgid "BPF transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "QSK στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "ΔημιουÏγία σήμα τετÏÎ±Î³Ï‰Î½Î¹ÎºÎ¿Ï ÎºÏματος στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "Συνεχής αποστολή" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "Αποστολή συνεχοÏÏ‚ Ïοής χαÏακτήÏων δοκιμής" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "ΧαÏακτ.δοκιμής" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 msgid "Ser. Port" msgstr "" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 msgid "Xcvr serial port" msgstr "" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 msgid "Connect / Disconnect from WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 msgid "ModeReg" msgstr "" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 msgid "Enable paddle auto spacing of characters" msgstr "" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 msgid "Enable contest character spacing" msgstr "" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 msgid "Serial echo" msgstr "" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 msgid "Tone ON" msgstr "" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 msgid "WPM Settings" msgstr "" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 msgid "Min WPM" msgstr "" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 msgid "Rng WPM" msgstr "" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" "ΡÏθμιση εÏÏους WPM\n" "ΠÏοκαθοÏισμένο = 25" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 msgid "Cmd WPM" msgstr "" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 msgid "Timing/Settings" msgstr "ΧÏονισμός/Ρυθμίσεις" #: src/dialogs/confdialog.cxx:11155 msgid "Ratio" msgstr "Λόγος" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 msgid "Sample" msgstr "" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 msgid "Weight" msgstr "" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 msgid "Bk" msgstr "" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 msgid "WPM setting" msgstr "" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 msgid "nanoIO serial port" msgstr "" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 msgid "Connect / Disconnect from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 msgid "Status" msgstr "Κατάσταση" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 msgid "Paddle" msgstr "" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 msgid "Comp'" msgstr "" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 msgid "PTT off" msgstr "" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "ΑπενεÏγ.όλων" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 #, fuzzy msgid "" "Range WPM setting\n" "default = 20" msgstr "" "ΡÏθμιση εÏÏους WPM\n" "ΠÏοκαθοÏισμένο = 25" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "ΔευτεÏεÏον κείμενο" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "Κείμενο για αποστολή κατά τη διάÏκεια ηÏεμίας στην πληκτÏολόγηση" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "ΦιλτÏάÏισμα" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "ΧÏήση φίλτÏου DSP Ï€Ïιν τον αποκωδικοποιητή" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "ΕνεÏγοποίηση FEC συμβατό με MultiPSK" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "" #: src/dialogs/confdialog.cxx:11647 msgid "Hell Transmit Parameters" msgstr "ΠαÏάμετÏοι εκπομπής Hell" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "ΓÏαμματοσειÏά εκπομπής" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "Σχήμα παλμοÏ" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "Αποστολή τελείων (.) σε ηÏεμία" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Στέλνει τελείες όταν δεν υπάÏχει δÏαστηÏιότητα πληκτÏολογίου" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 msgid "Range 1...3" msgstr "ΕÏÏος 1...3" #: src/dialogs/confdialog.cxx:11706 msgid "Hell Receive Parameters" msgstr "ΠαÏάμετÏοι λήψης Hell" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "ΑναστÏοφή εικόνας" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "ΠÏοβολή Λήψης σε ανεστÏαμμένη εικόνα" #: src/dialogs/confdialog.cxx:11715 msgid "Marquee text" msgstr "Κυλιόμενο κείμενο" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "ΠÏοβολή Λήψης ως κυλιόμενο κείμενο" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11722 msgid "Range 1...4" msgstr "ΕÏÏος 1...4" #: src/dialogs/confdialog.cxx:11734 msgid "Rx Height in pixels" msgstr "Ύψος Λήψης σε pixels" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "Ίσως απαιτεί αλλαγή μεγέθους των πινάκων Λήψης/Εκπομπής" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "ΕÏÏος φίλτÏου Λήψης" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "ΡÏθμιση του εÏÏους ζώνης του DSP" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "AGC λήψης" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - ΑÏγό, 2 - Μεσαίο, 3 - ΓÏήγοÏο" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "ΠαÏάμετÏοι λήψης" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:11791 msgid "Minimum # hits in tone detector" msgstr "" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "ΠαÏάμετÏοι εκπομπής" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 msgid "Center freq" msgstr "ΚεντÏική συχν." #: src/dialogs/confdialog.cxx:11867 msgid "Sounder" msgstr "" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "Αποστολή beacon κάθε..." #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "MYCALL πάντα σε πεζά" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 msgid "convert operator callsign to lower case" msgstr "" #: src/dialogs/confdialog.cxx:11880 msgid "Time out" msgstr "" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:11892 msgid "Enter QTC text" msgstr "" #: src/dialogs/confdialog.cxx:11898 msgid "Message Logging" msgstr "" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "πάντα Ï€ÏοσάÏτηση σε αÏχείο(α)" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 msgid "Notify time out" msgstr "" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 msgid "Audit log" msgstr "" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "ΕνεÏγοπ." #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 msgid "Text Colors" msgstr "ΧÏώματα κειμένου" #: src/dialogs/confdialog.cxx:11959 msgid "Transmit text" msgstr "Εκπομπή κειμένου" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "" #: src/dialogs/confdialog.cxx:11988 msgid "1/2 speed" msgstr "ταχÏτητα 1/2" #: src/dialogs/confdialog.cxx:11993 msgid "1x speed" msgstr "ταχÏτητα 1x" #: src/dialogs/confdialog.cxx:11994 msgid "default" msgstr "" #: src/dialogs/confdialog.cxx:11999 msgid "2x speed" msgstr "ταχÏτητα 2x" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "CALLSIGN πάντα σε πεζά" #: src/dialogs/confdialog.cxx:12011 msgid "convert other callsign to lower case" msgstr "" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "8-bit εκτεταμένοι χαÏακτήÏες (UTF-8)" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "ΕνεÏγοποιήστε για χαÏακτήÏες UTF-8" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "ΕνεÏγοποιήστε για Ï€Î¿Î»Ï Î±ÏƒÎ¸ÎµÎ½Î® σήματα" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "ΔιάÏκεια τόνου (δευτ.)" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 msgid "Manual tuning" msgstr "ΧειÏοκίνητος συντονισμός" #: src/dialogs/confdialog.cxx:12122 msgid "Oliv" msgstr "" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "Επιλογή εÏÏους ζώνης" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "Τόνοι" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "Επιλογή αÏÎ¹Î¸Î¼Î¿Ï Ï„ÏŒÎ½Ï‰Î½" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "Αλλάξτε ΜΟÎΟ για πειÏαματισμό" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "εκπομπή τόνων έναÏξης/τέλους" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 msgid "Enable this to send start/stop tones" msgstr "ΕνεÏγοπ.για αποστολή τόνων έναÏξης/τέλους" #: src/dialogs/confdialog.cxx:12227 msgid "Cont" msgstr "" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "8-bit εκτεταμένοι χαÏακτήÏες" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "ΣυμπεÏιφοÏά AFC" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "ΣυμπεÏιφοÏά S/N και IMD" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "μετά από" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "ΣυμπεÏιφοÏά του s/n imd" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "δευτεÏόλεπτα" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "Θα συμβεί μετά από τόσα δευτεÏόλεπτα" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "Πολυκάναλη επεξεÏγασία σημάτων" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "Πολυκάναλος ανιχνευτής" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "ΑπενεÏγοποιήστε σε αÏγές CPU ή όταν ο πεÏιηγητής σημάτων δεν χÏησιμ." #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12439 msgid "Pilot tone power relative to signal" msgstr "" #: src/dialogs/confdialog.cxx:12458 msgid "Short Preamble" msgstr "" #: src/dialogs/confdialog.cxx:12459 msgid "Enable short preamble for 8PSK transmission" msgstr "" #: src/dialogs/confdialog.cxx:12472 msgid "TTY" msgstr "" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "ΤαχÏτητα AFC" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "ΤαχÏτητα ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï AFC" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "Μόνο Mark" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "Μόνο Space" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "Εμφάνιση παλμογÏ, RTTY" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:12555 msgid "Log RTTY frequency" msgstr "" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:12566 msgid "track color" msgstr "" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "" #: src/dialogs/confdialog.cxx:12580 msgid "Sound Card FSK" msgstr "" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:12728 msgid "Pseudo-FSK - right channel" msgstr "Ψευδο-FSK σήμα στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:12729 msgid "Create keyed square wave on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:12736 msgid "Transceiver FSK" msgstr "" #: src/dialogs/confdialog.cxx:12739 msgid "Mark" msgstr "" #: src/dialogs/confdialog.cxx:12740 msgid "Mark frequency in Hertz" msgstr "" #: src/dialogs/confdialog.cxx:12751 msgid "Carrier shift in Hertz" msgstr "" #: src/dialogs/confdialog.cxx:12766 msgid "LTRS at start" msgstr "" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 msgid "FSK Interface" msgstr "" #: src/dialogs/confdialog.cxx:12847 msgid "Navigator serial port" msgstr "" #: src/dialogs/confdialog.cxx:12861 msgid "FSK" msgstr "" #: src/dialogs/confdialog.cxx:12862 msgid "Connect / Disconnect from Nav FSK port" msgstr "" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 msgid "Navigator configuration port" msgstr "" #: src/dialogs/confdialog.cxx:12885 msgid "Channel 1 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 msgid "Channel 2 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 msgid "RF attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12918 msgid "NavRF Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 msgid "Nav FSK baud rate" msgstr "" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 msgid "Nav FSK Stop bits" msgstr "" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 msgid "Mark Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 msgid "Config" msgstr "" #: src/dialogs/confdialog.cxx:13062 msgid "Connect / Disconnect from Nav Config port" msgstr "" #: src/dialogs/confdialog.cxx:13069 msgid "Synop" msgstr "" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 #, fuzzy msgid "Serial Interface" msgstr "ΠεÏιβάλλον ΧÏήστη" #: src/dialogs/confdialog.cxx:13158 #, fuzzy msgid "FSK port" msgstr "ΠλήÏης αναφοÏά" #: src/dialogs/confdialog.cxx:13206 msgid "Auto CRLF" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 #, fuzzy msgid "Diddle char" msgstr "ΧαÏακτ.δοκιμής" #: src/dialogs/confdialog.cxx:13239 #, fuzzy msgid "Diddle character" msgstr "8-bit εκτεταμένοι χαÏακτήÏες" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 msgid "Unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "ΧÏήση φίλτÏου DSP Ï€Ïιν τον αποκωδικοποιητή" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:13402 msgid "Nav" msgstr "" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "" #: src/dialogs/confdialog.cxx:13475 msgid "Save image as monochrome file" msgstr "" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "Π/Δ" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 msgid "flrig" msgstr "" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 msgid "Addr" msgstr "" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "ΧÏήση RigCAT" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Συσκευή:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "Εντολή CAT για PTT" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "Η εντολή CAT είναι το PTT" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "Εναλλαγή RTS για PTT" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "Το RTS είναι η εντολή PTT" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "Εναλλαγή DTR για PTT" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "Το DTR είναι η εντολή PTT" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "ΑÏχική κατάσταση του RTS" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "ΑÏχική κατάσταση του DTR" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "Έλεγχος Ïοής RTS/CTS" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "Ο Π/Δ χÏησιμοποιεί έλεγχο Ïοής RTC/CTS" #: src/dialogs/confdialog.cxx:13735 msgid "Restore UART Settings on Close" msgstr "ΕπαναφοÏά Ïυθμίσεων UART στο Κλείσιμο" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "ΕπαναφέÏει τις Ïυθμίσεις της σειÏιακής (COM) θÏÏας" #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" #: src/dialogs/confdialog.cxx:13747 msgid "Init delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "ΧÏήση Hamlib" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "Π/Δ:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:13823 msgid "Retry Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "" #: src/dialogs/confdialog.cxx:13840 msgid "Write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:13857 msgid "Post write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:13909 msgid "Polling Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT μεσώ εντολής hamlib" #: src/dialogs/confdialog.cxx:13929 msgid "PTT using hamlib command" msgstr "PTT με χÏήση εντολής hamlib" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "Ο πομποδέκτης απαιτεί έλεγχο Ïοής RTS/CTS" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "Έλεγχος Ïοής XON/XOFF" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "Ο πομποδέκτης απαιτεί έλεγχο Ïοής Xon/Xoff" #: src/dialogs/confdialog.cxx:13965 msgid "CW is LSB mode" msgstr "Το CW είναι διαμ. LSB" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "Επιλέξτε εάν ο Π/Δ χÏησιμοποιεί LSB για CW" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "Το RTTY είναι διαμ. USB" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "Επιλέξτε εάν ο Π/Δ χÏησιμοποιεί USB για RTTY" #: src/dialogs/confdialog.cxx:13977 msgid "Mode delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13978 msgid "Delay NN msec after executing mode change" msgstr "ΚαθυστέÏηση ÎÎ msec μετά από εκτέλεση αλλαγής mode" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "Τόνος PTT στο δεξί κανάλι ήχου" #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "ΜποÏεί να χÏησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους Ï„Ïόπους PTT" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "ΧÏήση ξεχωÏιστής θÏÏας για PTT" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "Η θÏÏα είναι η δεÏτεÏη συσκευή του SCU-17" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "Ο οδηγός απαιτεί τα stop bits να είναι ΜΗΔΕÎ!" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "ΧÏήση της παÏάλληλης θÏÏας για PTT" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "ΧÏήση RTS" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "Το RTS είναι η γÏαμμή σήματος PTT" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "ΑÏχική τάση στο RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "ΧÏήση DTR" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "Το DTR είναι η γÏαμμή σήματος PTT" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "ΑÏχική τάση στο DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "Οι καθυστεÏήσεις PTT ισχÏουν για όλους τους Ï„Ïόπους CAT/PTT" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "ΚαθυστέÏηση PTT έναÏξης εκμπομπής" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "ΚαθυστέÏηση ÎÎ msec Ï€Ïιν από την έναÏξη του ήχου" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "ΚαθυστέÏηση PTT λήξης εκμπομπής" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "ΚαθυστέÏηση ÎÎ msec Ï€Ïιν από την αποδέσμευση του PTT" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 msgid "Select pin number" msgstr "" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 msgid "Select PTT on state" msgstr "" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "Συσκευές" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "Επιλογή συσκευής" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "ΕγγÏαφή:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "Συσκευή εισόδου ήχου" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "ΑναπαÏαγωγή:" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "Συσκευή εξόδου ήχου" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "ΧÏήση διακομιστή Pulse Audio" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "Είσοδος/Έξοδος μόνο σε αÏχείο" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "ΕΑΠΔΕΠΥΠΑΡΧΕΙ ΔΙΑΘΕΣΙΜΗ ΣΥΣΚΕΥΗ ΗΧΟΥ (ή για δοκιμές)" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "Η συσκευή υποστηÏίζει αμφίδÏομη λειτουÏγία" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "Ρυθμίσεις" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "Ρυθμός δειγματοληψίας" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "ΕγγÏαφή" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "ΜετατÏοπέας" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "ΔιοÏθώσεις" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "" #: src/dialogs/confdialog.cxx:14605 msgid "Right channel" msgstr "Δεξί κανάλι" #: src/dialogs/confdialog.cxx:14607 msgid "Transmit Usage" msgstr "ΧÏήση κατά την Εκπομπή" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "Σήμα του modem σε αÏιστεÏÏŒ και δεξί κανάλι" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "Θα πεÏιέχουν ήχο του modem και τα δÏο κανάλια" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "ΑναστÏοφή ΑÏιστεÏοÏ/Î”ÎµÎ¾Î¹Î¿Ï ÎºÎ±Î½Î±Î»Î¹Î¿Ï" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 msgid "Software reversal of left-right audio channels" msgstr "ΑναστÏοφή αÏιστεÏοÏ-Î´ÎµÎ¾Î¹Î¿Ï ÎºÎ±Î½Î±Î»Î¹Î¿Ï" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Αυτές οι Ïυθμίσεις βÏίσκονται και σε άλλες καÏτέλες.\n" "Î’Ïίσκονται ως αντίγÏαφα εδώ για ευκολία.\n" "ΜποÏείτε να αλλάξετε μια ÏÏθμιση από οποιαδήποτε θέση.\n" "..." #: src/dialogs/confdialog.cxx:14627 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Τόνος 1000 Hz όταν ενεÏγοποιείται το PTT\n" "ΜποÏεί να χÏησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους Ï„Ïόπους PTT" #: src/dialogs/confdialog.cxx:14633 msgid "CW QSK signal on right channel" msgstr "Σήμα CW QSK στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "ΔημιουÏγεί ένα τετÏαγωνικό σήμα 1000 Hz στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "Ψευδο-FSK σήμα στο δεξί κανάλι ήχου" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "ΔημιουÏγεί ένα τετÏαγωνικό σήμα 1000 Hz στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:14649 msgid "Receive Usage" msgstr "ΧÏήση κατά την Λήψη" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "" #: src/dialogs/confdialog.cxx:14681 msgid "Record both channels" msgstr "ΕγγÏαφή και των δÏο καναλιών" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "Ειδοποιήσεις" #: src/dialogs/confdialog.cxx:14692 msgid "Regex Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 msgid "Sound:" msgstr "Ήχος:" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 msgid "Test" msgstr "Δοκιμή" #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 msgid "flmsg interface" msgstr "" #: src/dialogs/confdialog.cxx:14753 msgid "flmsg received wav" msgstr "" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 msgid "RsID detection" msgstr "Ανίχνευση RsID" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "Μόνο ενημέÏωση" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Επιλέξτε το ώστε να ειδοποιείστε όταν ένα σήμα RSID ληφθεί\n" "χωÏίς να αλλάξει η συχνότητα και το modem" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "Αναζήτηση σε όλο το εÏÏος" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "ON - αναζήτηση σε όλο τον καταÏÏάκτη\n" "OFF - πεÏιοÏισμός αναζήτησης σε +/- 200 Hz" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "Σημαδ.Ï€Ïοηγ.συχν./mode" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Εισαγωγή ÏƒÎ·Î¼Î±Î´Î¹Î¿Ï ÏƒÏ„Î¿ κείμενο Λήψης Ï€Ïίν\n" "την αλλαγή συχνότητας και modem" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "ΑπενεÏγοποίηση ανίχνευσης" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "ΑπενεÏγοπoiεί πεÏαιτέÏω ανίχνευση όταν γίνει λήψη ενός RSID" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "ΑπενεÏγ.αλλαγή συχν." #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "ΧωÏίς αυτόματη μετάβαση στην συχνότητα λήψης RsID" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "ΔευτεÏόλεπτα" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr "" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "ΜικÏή γÏαμματ." #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "ΧαÏακτ./γÏαμμή:" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "Εκπομπή callsign" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "Αποστολή του callsign σε CW στο τέλος κάθε εκπομπής" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "ΤαχÏτητα (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Διάφ." #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "ΑÏγός επεξεÏγαστής (μικÏότεÏος από 700MHz)" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "ΕνεÏγοποιήστε εάν ο υπολογιστής σας δεν αποκωδικοποιεί σωστά" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "Άνοιγμα φακέλου μηνυμάτων" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "Άνοιγμα με flmsg" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "Άνοιγμα μηνÏματος με flmsg" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "Εισάγετε πλήÏη διαδÏομή και αÏχείο του flmsg" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "Εντοπ.flmsg" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "Συχνότητα φέÏουσας (Hz)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "ΕÏÏος αναζήτησης (Hz)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "Αναζήτηση για σήματα μέσα στο εÏÏος αυτό" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "ΕÏÏος AFC (Hz)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "ΠεÏιοÏισμός κίνησης AFC στο εÏÏος αυτό" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "Όταν δεν υπάÏχει σήμα" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "Αυτόματο spot χαÏακÏηÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï Î±Ï€ÏŒ το κείμενο Λήψης" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "Ανάλυση όλου του κειμένου Λήψης" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "Αποστολή αναφοÏάς λήψης όταν γίνεται log ένα QSO" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "Αποστολή αναφοÏάς λήψης μόνο όταν γίνεται log το QSO" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "ΑναφοÏά συχν.Π/Δ (ενεÏγ.μόνο εάν έχετε έλεγχο Π/Δ)" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "Îα συμπεÏιλαμβάνεται η συχνότητα εκπομπής" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "ΑπενεÏγοποίηση του spotting όταν δεν είναι οÏατός ο πεÏιηγητής σημάτων" #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Επιλέξτε για μείωση του φόÏτου της CPU σε PSK και RTTY." #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "Σε ποιόν έχει γίνει σÏνδεση" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "ΘÏÏα:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "PSK κλπ." #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "ΚαταγÏαφή κειμένου rx σε εξωτεÏικό αÏχείο" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "ΠλήÏης αναφοÏά" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:15524 msgid "Conditions" msgstr "Συνθήκες" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "Ï„Ïέχουσες καιÏικές συνθήκες" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "να αναφέÏονται βαθμοί Fahrenheit" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "Κελσίου" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "να αναφέÏονται βαθμοί Κελσίου" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "Μίλια / ÎÏα" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "να αναφέÏονται Μίλια ανά ÏŽÏα" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "ΧιλιόμετÏα / ÎÏα" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "να αναφέÏονται ΧιλιόμετÏα ανά ÏŽÏα" #: src/dialogs/confdialog.cxx:15554 msgid "Inches Hg." msgstr "Ίντσες υδÏαÏ.Hg." #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "να αναφέÏονται ίντσες υδÏαÏγÏÏου (Hg)" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "να αναφέÏονται millibars" #: src/dialogs/confdialog.cxx:15566 msgid "Temperature" msgstr "ΘεÏμοκÏασία" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "ΤαχÏτητα/κατευθ.ανέμου" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "ΒαÏομετÏική πίεση" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:15585 msgid "Default URL" msgstr "" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:15658 msgid "Command run on KML creation" msgstr "" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:15669 msgid "Change dir..." msgstr "Αλλ.φακέλου.." #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "Επιλέξτε φάκελο αποθήκευσης των αÏχείων KML" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "ΚαθαÏισμός των δεδομ.KML τώÏα!" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "ΚαθαÏισμός κατά την εκκίνηση" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "Το RTS είναι η εντολή PTT" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "" #: src/dialogs/confdialog.cxx:15750 msgid "Hamcall" msgstr "" #: src/dialogs/confdialog.cxx:15763 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15776 msgid "Callook" msgstr "" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:15820 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:15826 msgid "Callook.info" msgstr "" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "Εμφάνιση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï‰Ï‚ απλό κείμενο" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "εκκαθ.παλιών δεδομ." #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "" #: src/dialogs/confdialog.cxx:15917 msgid "User ID" msgstr "" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "Επιβεβ." #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:15971 msgid "Options" msgstr "Επιλογές" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "αυτόματο ανέβασμα δεδομένων" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "ΧÏήση της ημεÏ./ÏŽÏας off για το log" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "ΧÏήση της ημεÏ./ÏŽÏας on από Ï€Ïοεπιλογή" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Εμφ.λιγότεÏων mode" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 msgid "Default message" msgstr "ΠÏοεπιλεγμένο μήνυμα" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:16010 msgid " {CALL} other ops call sign" msgstr "" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:16016 msgid "{NAME} other ops name" msgstr "" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:16030 msgid "Enter full path-filename for tqsl executable" msgstr "Εισάγετε πλήÏη διαδÏομή και αÏχείο του tqsl" #: src/dialogs/confdialog.cxx:16044 msgid "Your tqsl login password" msgstr "" #: src/dialogs/confdialog.cxx:16059 msgid "Use password for tqsl access" msgstr "" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:16065 msgid "Location" msgstr "Τοποθεσία" #: src/dialogs/confdialog.cxx:16066 msgid "tqsl station location" msgstr "Τοποθεσία ÏƒÏ„Î±Î¸Î¼Î¿Ï tqsl" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 msgid "Locate" msgstr "Εντοπισμός" #: src/dialogs/confdialog.cxx:16081 msgid "Locate tqsl executable" msgstr "Εντοπισμός εκτελέσιμου tqsl" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:16096 msgid "Export" msgstr "Εξαγωγή" #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "Εξαγωγή εγγÏαφών για ανέβασμα στο LoTW" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 msgid "Check" msgstr "Έλεγχος" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16108 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:16125 msgid "Use this tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "Αυτόματη εκκίνηση Ï€ÏογÏαμμάτων με το fldigi" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:16160 msgid "Enter full path-filename for flrig" msgstr "Εισάγετε πλήÏη διαδÏομή και αÏχείο του flrig" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "Εντοπισμός εκτελέσιμου flrig" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:16178 msgid "Enter full path-filename for flamp" msgstr "Εισάγετε πλήÏη διαδÏομή και αÏχείο του flamp" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "Εντοπισμός εκτελέσιμου flamp" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:16196 msgid "Enter full path-filename for flnet" msgstr "Εισάγετε πλήÏη διαδÏομή και αÏχείο του flnet" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "Εντοπισμός εκτελέσιμου flnet" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:16214 msgid "Enter full path-filename for fllog" msgstr "Εισάγετε πλήÏη διαδÏομή και αÏχείο του fllog" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "Εντοπισμός εκτελέσιμου fllog" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "ΠÏογ.1:" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 msgid "Enter full path-filename for external program" msgstr "Εισάγετε πλήÏη διαδÏομή και αÏχείο του εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματος" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "Εντοπισμός εκτελέσιμου program #1" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "ΠÏογ.2:" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "Εντοπισμός εκτελέσιμου program #2" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "ΠÏογ.3:" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "Εντοπισμός εκτελέσιμου program #3" #: src/dialogs/confdialog.cxx:16285 msgid "" "Enable\n" "-" msgstr "" "ΕνεÏγοποίηση\n" "-" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "ΕνεÏγοποίηση αυτής της καταχώÏησης κατά την εκκίνηση του fldigi" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "ΈναÏξη flrig" #: src/dialogs/confdialog.cxx:16333 msgid "Start flamp" msgstr "ΈναÏξη flamp" #: src/dialogs/confdialog.cxx:16337 msgid "Start flnet" msgstr "ΈναÏξη flnet" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "ΈναÏξη fllog" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "Εκκίνηση prog1" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "Εκκίνηση prog2" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "Εκκίνηση prog3" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "Κλείδωμα" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "ΕπιτÏ./απαγοÏ.αλλαγών" #: src/dialogs/confdialog.cxx:16372 msgid "Enable ARQ" msgstr "ΕνεÏγοποίηση ARQ" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "" #: src/dialogs/confdialog.cxx:16380 msgid "Enable KISS" msgstr "ΕνεÏγοποίηση KISS" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "" #: src/dialogs/confdialog.cxx:16388 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 msgid "Restart" msgstr "" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "ΈναÏξη" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16564 msgid "XML" msgstr "" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16659 msgid "fllog" msgstr "" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16697 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" #: src/dialogs/confdialog.cxx:16707 msgid "Enable Busy Channel" msgstr "" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16726 msgid "Modem Bandwidth Margins " msgstr "" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16753 msgid "Enable CSMA" msgstr "" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 msgid "Slot Time" msgstr "" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16781 msgid "Transmit Data Delay" msgstr "" #: src/dialogs/confdialog.cxx:16782 msgid "Idle transmit before data sent" msgstr "" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 msgid "MilliSeconds" msgstr "" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16809 msgid "Enable Histogram" msgstr "" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16831 msgid "PSM Attenuate" msgstr "" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16845 msgid "Default Settings" msgstr "ΠÏοεπ.Ïυθμίσεις" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "Επαν.Ï€Ïοεπιλογών" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "ΠΡΟΣΟΧΗ - αυτή η ενέÏγ.θα αντικαταστήσει ΟΛΕΣ τις Ïυθμίσεις" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "ΧÏώμα γÏαμματοσειÏάς" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "ΓÏαμματοσειÏά:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Μέγεθος:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Ανάγνωση γÏαμματοσειÏών..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "ΕνεÏγοποιημένο" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "ΦίλτÏο" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "ΧÏήστης LoTW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "ΧÏήστης eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Διπλότυπα" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Αγνόηση διπλότυπων" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "ΕνέÏγεια" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Ελάχιστος χÏόνος Î¼ÎµÏ„Î±Î¾Ï Î³ÎµÎ³Î¿Î½ÏŒÏ„Ï‰Î½" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "ΠÏοβολή παÏαθÏÏου ειδοποίησης:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Εισαγωγή Ï€ÏοκαθοÏ.κειμένου" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "ΑπόκÏυψη παÏαθÏÏου μετά από (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "ΠÏοσάÏτηση στο κείμενο RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "ΠÏοσάÏτηση στο κείμενο TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "ΠÏοβολή επεξεÏγασίας macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Εκτέλεση Ï€ÏογÏάμματος:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "ΕÏÏεση χώÏας:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Πιέστε ENTER για να συνεχίσει η αναζήτηση" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "ΕÏÏεση prefix:" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "Ρυθμίσεις εξαγωγής" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "Επιλογή ΕγγÏαφών για Εξαγωγή" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "Επιλογή Όλων" #: src/logbook/lgbook.cxx:622 msgid "Start Date" msgstr "ΗμεÏομ.ΑÏχής" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "ΗμεÏομηνία αÏχής της εξαγωγής" #: src/logbook/lgbook.cxx:636 msgid "Stop Date" msgstr "ΗμεÏομ.τέλους" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "ΗμεÏομηνία τέλους της εξαγωγής" #: src/logbook/lgbook.cxx:650 msgid "select by date" msgstr "επιλογή ανά ημ/νία" #: src/logbook/lgbook.cxx:651 msgid "Enable to select date range" msgstr "ΕνεÏγοποιήστε για επιλογή εÏÏους ημεÏομηνίας" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "Επιλέξτε Πεδία για Εξαγωγή" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "" #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "" #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "ΙσχÏÏ‚ εκμπομπής" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "" #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "" #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 msgid "Station Call" msgstr "Call σταθμοÏ" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 msgid "Station QTH" msgstr "QTH σταθμοÏ" #: src/logbook/lgbook.cxx:723 msgid "Station LOC" msgstr "LOC σταθμοÏ" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Σημειώσεις" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "" #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "QSL ελήφθη την ημεÏομηνία αυτή" #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "QSL απεστάλη την ημεÏομηνία αυτή" #: src/logbook/lgbook.cxx:750 msgid "LoTW rcvd date" msgstr "" #: src/logbook/lgbook.cxx:753 msgid "LoTW sent date" msgstr "" #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:795 msgid "FD section" msgstr "" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 msgid "CW SS Check" msgstr "" #: src/logbook/lgbook.cxx:809 msgid "CW SS Section" msgstr "" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "" #: src/logbook/lgbook.cxx:840 msgid "Date On" msgstr "" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "ΗμεÏομηνία έναÏξης QSO" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "ÎÏα έναÏξης QSO" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "" #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "# εγγÏαφές στο logbook" #: src/logbook/lgbook.cxx:913 msgid "Date Off" msgstr "" #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "ΗμεÏομηνία λήξης QSO" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "ÎÏα λήξης QSO" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "" #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "Συχνότητα σε MHz" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "ΙσχÏÏ‚ εκπομπής που χÏησιμοποιήθηκε" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "Grid square σταθμοÏ" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "Πόλη δουλεμένου σταθμοÏ" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "Πολιτεία ΗΠΑ δουλεμένου σταθμοÏ" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "ΧώÏα δουλεμένου σταθμοÏ" #: src/logbook/lgbook.cxx:1048 msgid "QSL" msgstr "" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "QSL ελήφθη την ημεÏομηνία αυτή" #: src/logbook/lgbook.cxx:1062 msgid "EQSL-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1075 msgid "LOTW-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "QSL απεστάλη την ημεÏομηνία αυτή" #: src/logbook/lgbook.cxx:1101 msgid "EQSL-sent" msgstr "" #: src/logbook/lgbook.cxx:1114 msgid "LOTW-sent" msgstr "" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "" #: src/logbook/lgbook.cxx:1181 msgid "Cont'" msgstr "" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "ΕνδιαφέÏουσες σημειώσεις" #: src/logbook/lgbook.cxx:1236 msgid "My Station" msgstr "Ο σταθμός μου" #: src/logbook/lgbook.cxx:1274 msgid "Station Locator" msgstr "Locator σταθμοÏ" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 msgid "Contest seral # sent" msgstr "" #: src/logbook/lgbook.cxx:1302 msgid "Exch Out" msgstr "" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "" #: src/logbook/lgbook.cxx:1326 msgid "Exch In" msgstr "" #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "" #: src/logbook/lgbook.cxx:1339 msgid "Field Day class received" msgstr "" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 msgid "Field Section received" msgstr "" #: src/logbook/lgbook.cxx:1363 msgid "Operators age received" msgstr "" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 msgid "Operating band" msgstr "" #: src/logbook/lgbook.cxx:1399 msgid "Check value received" msgstr "" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 msgid "Ser NoR" msgstr "" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 msgid "Sent troop number" msgstr "" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 msgid "Received troop number" msgstr "" #: src/logbook/lgbook.cxx:1492 msgid "Name-S" msgstr "" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 msgid "Name-R" msgstr "" #: src/logbook/lgbook.cxx:1505 msgid "Received scout name" msgstr "" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "Αναζήτηση Call" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "Αναζήτηση για αυτό το callsign" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "ΕÏÏεση Ï€ÏογοÏμενου" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "ΕÏÏεση επόμενου" #: src/logbook/lgbook.cxx:1549 msgid "Retrieve" msgstr "Ανάκτηση" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "Ανάκτηση για χÏήση ενεÏÎ³Î¿Ï modem" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "Îέα εγγÏαφή / Αποθήκευση εγγÏαφής" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "ΕνημέÏωση Ï„Ïέχουσας εγγÏαφής" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "ΔιαγÏαφή Ï„Ïέχουσας εγγÏαφής" #: src/logbook/lgbook.cxx:1583 msgid "File:" msgstr "ΑÏχείο:" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "ΗμεÏομηνία" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "ÎÏα" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "Ρυθμίσεις Cabrillo" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "ΗμεÏομηνία QSO" #~ msgid "Experimental" #~ msgstr "ΠειÏαματικό" #~ msgid "Enter a CALL !" #~ msgstr "Εισάγετε ένα CALL!" #~ msgid "Click to set power level" #~ msgstr "Πατήστε για ÏÏθμιση ισχÏος" #~ msgid "Adjust Power Level" #~ msgstr "ΡÏθμιση ισχÏος" #~ msgid "Return to Smeter / Pmeter" #~ msgstr "ΕπιστÏοφή σε Smeter / Pmeter" #~ msgid "Toggle smeter / combo controls" #~ msgstr "Εναλλαγή smeter / combo controls" #~ msgid "Add current frequency" #~ msgstr "ΠÏοσθήκη Ï„Ïέχουσας συχνότητας" #~ msgid "Clear list" #~ msgstr "ΚαθαÏισμός λίστας" #~ msgid "Delete from list" #~ msgstr "ΑφαίÏεση από τη λίστα" #~ msgid "Select operating parameters" #~ msgstr "Επιλογή παÏαμέτÏων λειτουÏγίας" #~ msgid "frequency kHz" #~ msgstr "Συχνότητα kHz" #~ msgid "Press to update QSO start time" #~ msgstr "Πατήστε για ενημέÏωση της ÏŽÏας έναÏξης του QSO" #~ msgid "QSO end time" #~ msgstr "ÎÏα λήξης QSO" #~ msgid "Azimuth" #~ msgstr "ΑζιμοÏθιο" #~ msgid "QTH City" #~ msgstr "Πόλη QTH" #~ msgid "US State" #~ msgstr "Πολιτεία ΗΠΑ" #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "ΑÏιστεÏÏŒ κλικ - αποθήκευση avatar\n" #~ "Δεξί κλικ - αποστολή του avatar μου" #~ msgid "Press to update" #~ msgstr "Πατήστε για ενημέÏωση" #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "ΑÏιστεÏÏŒ κλικ - εκτέλεση\n" #~ "Δεξί κλικ - επεξεÏγασία" #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "ΑÏιστεÏÏŒ κλικ - εκτέλεση\n" #~ "Shift-Fkey - εκτέλεση\n" #~ "Δεξί κλικ - επεξεÏγασία" #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "ΑÏιστεÏÏŒ κλικ - επιλογή\n" #~ "Δεξί κλικ - καθαÏισμός γÏαμμής" #~ msgid "Select FSQ station" #~ msgstr "Επιλογή ÏƒÏ„Î±Î¸Î¼Î¿Ï FSQ" #~ msgid "Stations Heard" #~ msgstr "Σταθμοί που ακοÏστηκαν" #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "ΑÏιστεÏÏŒ κλικ - εκτέλεση\n" #~ "Fkey - εκτέλεση\n" #~ "Δεξί κλικ - επεξεÏγασία" #~ msgid "Single-click to capture Rx word" #~ msgstr "Συλλ.κειμένου με μονό κλικ σε λαμβ.λέξη" #~ msgid "Clear fields with CALL capture" #~ msgstr "ΚαθαÏισμός πεδίων στη συλλογή CALL" #~ msgid "Slow (4 msec)" #~ msgstr "ΑÏγό (4 msec)" #~ msgid "Fast (2 msec)" #~ msgstr "ΓÏήγοÏο (2 msec)" #~ msgid "Initial spectrum range is NN times the modem bw" #~ msgstr "Το αÏχικό εÏÏος του αναλυτή είναι ÎΠφοÏές το εÏÏος του mode" fldigi-4.1.06/po/boldquot.sed0000644000175000017500000000033113472116044012724 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g s/“/“/g s/â€/â€/g s/‘/‘/g s/’/’/g fldigi-4.1.06/po/es.gmo0000664000175000017500000027636513515625024011542 00000000000000Þ•@* T@pAp^p{p€p•p*°pÛpðp q qq"q(q1q5q9q?qAq‚Gq ÊqV×q .r8r =rJr!dr†rˆr!r¯rÄrÉrÎrärérûrs+sAs.Xs)‡s5±s,çs-t)Btltt%št"Àtãtót& u3uRufu"}u u¾u&Ãuêuvv%v+v+0v\vrv"†v+©vÕv év w+w AwMw^wqw‚w‘w w/²wâwúw!x3xPx"mxx¤x#¿x!ãxy"y>y"Ny qy+’y¾yÝyöy z'z;zZzvz-{z©zÉz(çz{ /{P{ c{"q{'”{¼{Á{ Ö{,÷{#$|$H|m|&‹|²|È|Þ|ò|}}} !}.}=} M}W}j}o} s} }‹}‘}¦}Ä}Ë}$Ï}&ô}~&6~]~u~Ž~¦~Cª~ î~û~& 9 DO,mš#£ÇÚí$ó€€D0€ u€€€€*£€΀/â€2([{™¢¾,Ú ‚‚&‚+‚)3‚)]‚)‡‚1±‚ ã‚ ñ‚þ‚ƒ ƒƒ 2ƒ <ƒGƒXƒlƒuƒˆƒƒ—ƒ«ƒ ˃Öƒ ݃ëƒ óƒþƒ„)„@„H„L„U„\„a„ d„p„€„Ÿ„ ·„Á„Ñ„ ï„ý„ …… … )…5…4F…{…8„…½…Ä…Ì…é… ø…#†+=†i†r† ‰†—†Ÿ†&¸† ߆ë† ‡ %‡ F‡ S‡a‡(r‡›‡°‡+LJ ó‡ˆ7ˆ Hˆ Sˆ]ˆrˆ'„ˆ¬ˆWÁˆ/‰I‰'a‰‰‰ ‰·‰5ʉŠ Š0Š AŠ3MŠŠ “СР§Š ²Š¼ŠŠÖŠæŠùŠ‹e*‹‹ ¤‹¯‹ ·‹ Ä‹ Ò‹ ß‹í‹*ÿ‹*Œ0Œ8ŒRŒhŒ‚Œ ‹Œ•ŒªŒÆŒ åŒïŒ ôŒ;2n„Œ¦+­Ù/ð Ž 0Ž=Ž PŽZŽ^ŽcŽ kŽuŽ~Ž•Ž¥ŽªŽ ºŽ ÈŽÔŽæŽ÷Ž  2.@ o{€‰‘ ±ÅË,ä#C>V‚Ù+á ‘'‘ C‘O‘#l‘‘ ‘¼‘Ü‘"å‘#’,’$3’X’r’.{’§ª’¤R“÷“ ””5”L”T”,\” ‰”•”œ”  ”­” ”Δ/â”:•8M•†•˜• •J¼•0–!8–Z–*w– ¢–¯– ³–¾–1Õ– —— ,— 7— B—N—,a—Ž—•—ž—¾— Ø—ã— ÷—˜ ˜+˜ J˜9U˜%˜2µ˜è˜2™8™*N™+y™,¥™ Ò™%ó™7šQšPYšEªš ðš-þš",›"O›"r›"•›"¸›'Û›-œ1œLœRœ Wœbœ hœ rœ ~œ‹œ¥œÜ Èœ Õœâœöœ ):31n ¦ª ¹Çåô û ž:'žbž gž3už©ž°žÄžÕž)íž Ÿ !Ÿ /Ÿ 9Ÿ FŸTŸ[ŸbŸrŸƒŸ˜Ÿ$´ŸÙŸ$& 5 =  B M  U ` bf !É /ë #¡ ?¡`¡|¡¡‡¡ ™¡£¡´¡Ä¡Ý¡ â¡î¡4ö¡,+¢X¢`¢h¢ p¢|¢ƒ¢ Ÿ¢¬¢À¢É¢Ò¢×¢$ð¢£,£1£L£R£V£Y£]£`£e£|£…£Š£œ£Ÿ£²£Ñ£ð£õ£¤¤/¤F¤ ]¤h¤„¤  ¤!Á¤ã¤¥9¥N¥b¥q¥,Š¥ ·¥6Å¥ ü¥ ¦)¦I¦[¦<u¦²¦ŦÙ¦ Þ¦ë¦ï¦@ §J§^§ }§‹§§˜§* §I˧0¨9F¨€¨.Ÿ¨0ΨÏÿ¨Ï© í©2ª$Aªfªiªnªª:‘ª̪Ôªت ߪíª««+« C«P«h«€«˜«µ«Ò«ï«÷«ü«¬ ¬9¬T¬g¬‡¬ 𬦬®¬½¬ŬMܬ*­ C­ P­Z­2^­‘­«­ ±­½­Ý­ó­ ®® ® 3®>®N®U®u® Œ®–® ª®µ®,ήû®¯¯ ¯ '¯4¯3E¯/y¯©¯ůʯ ϯÛ¯ë¯ü¯ °'°8°?°Z°#`°(„°'­°Õ°"ì°±/±F±Z±m±s±±&œ±ñÓ±رܱõ±ú±ý±²$²8²=²D²^²p²xv²ï² õ² ³!³!1³JS³ž³ ³£³(¦³Bϳ ´;3´1o´¡´¥´ ©´³´º´Ê´Þ´ò´ µµ µ&µEµUµgµwµ‹µ £µ°µ(µëµûµ/¶3¶<¶ L¶Z¶/i¶™¶¡¶§¶,«¶ضݶ á¶ î¶ù¶·&7·^·#x· œ·½· Ô· Þ·è·ï·¸¸¸%¸.>¸m¸v¸¸  ¸ª¸/ʸú¸ÿ¸ ¹¹ (¹4¹7¹G¹_¹#r¹0–¹ǹϹ׹߹ü¹º*ºDºMºVºqº!Œº®º ¶º ºͺѺ Õºߺçºðºôº »»7» V»d»z»‚»‹»”» » ª» ¶»*»í»ñ» õ»¼¼ ¼¼¼#¼,¼5¼<¼ D¼N¼W¼n¼~¼“¼˜¼«¼ Á¼̼Ó¼vì¼c½ s½ ”½¢½³½Ò½Ú½ ó½¾'¾>¾W¾p¾ …¾¾ ”¾ ¾µ¾3ʾþ¾¿¿¿2¿;P¿Œ¿”¿*š¿•Å¿[ÀlÀ‹À&œÀ@ÃÀÁÁ Á>Á8RÁ‹ÁÁ—Á ³Á$ÁÁ%æÁ  ÂÂ2Â";Â!^Â"€Â£Â¾ÂÃÂÊ æÂ(ôÂ^Ã|à ÃŽÃ —à £Ã°Ã³ÃÂÃÉÃÒÃÚÃàÃôÃüÃÄÄ Ä'Ä-Ä 3Ä AÄ NÄZÄ_Ä hĪtÄ Å*Å@Å\ÅqÅşűŠÁÅ ÎÅ,ÛÅÆÆ "Æ.Æ4Æ ;ÆHÆaÆpƂƔƣƫƲÆÇÆ ÚÆ åÆÇÇ7ÇRÇ hÇsÇ„ÇœÇ ±Ç7¿Ç ÷ÇÈ È 7ÈEÈ `È<ȾÈ*ÚÈÉ0É+NÉzÉ‹É É ¨É(¶É#ßÉ!Ê0%ÊVÊoÊvÊ ~Ê ŠÊ—ʦʹÊ$ÔÊ3ùÊ-Ë 6Ë@Ë]ËbËuˈË"—Ë ºË ÈËéËÌÌ)ÌHÌXÌ tÌ!‚Ì ¤Ì®ÌµÌÄÌ1ØÌ Í Í&Í 8Í FÍ4T͉͡Í*§Í ÒÍóÍ4ÎHÎdÎsÎ…Î.šÎÉÎ9ßÎ Ï $Ï /Ï<ÏAÏIÏRÏdÏ lÏzÏÏÏ –Ï¡Ï ·Ï ÃÏ ÏÏ ÛÏçÏ Ð Ð Ð'Ð7Ð=ÐNÐbÐ wРЋÐ-”ÐÂÐ ÝÐèÐ îÐùÐÑÑÑ#Ñ *Ñ 6Ñ@ÑGÑ `ÑjÑoÑ„Ñ‹Ñ £Ñ¯Ñ ´Ñ!¾Ñ àÑíÑüÑ ÒÒ"#ÒFÒZÒ'cÒ‹Òq“ÒzÓ€Ó+•Ó/ÁÓ%ñÓBÔ:ZÔ;•Ô/ÑÔ+Õ-Õ2Õ 7ÕAÕJÕRÕ[ÕcÕrÕƒÕ  Õ®Õ½ÕÌÕÓÕâÕÖÖÖ.ÖCÖIÖOÖgÖpÖŠÖ“Ö¢Ö ´ÖÂÖÜÖíÖüÖ×/×?×Y×m×0~× ¯×º×Í×$Ò× ÷× Ø Ø Ø ,Ø 9Ø FØ SØ `Ø mØzØ }؉ؚؒØ!³ØÕØÚØ ÝØ éØóØÙÙ&Ù8-ÙfÙ€Ù †Ù’ÙªÙÅÙÚÙøÙÚÚ 4Ú?ÚNÚ"cÚ†ÚœÚ³Ú »Ú)ÆÚðÚÛÛ+9ÛeÛwÛÛªÛn¹ÛI(Ür܃Ü-¡ÜÏÜÞÜæÜ õÜÿÜ ÝÝ#Ý)Ý8ÝJÝOÝ0bÝ “ݡݸÝËÝáÝêÝûÝ Þ Þ "Þ -Þ:Þ BÞOÞ&RÞ'yÞ-¡ÞÏÞ ×ÞáÞùÞ ß!ß<ßOßdßhß~ßšßžß ±ß,¼ß éßöß) à7à%<àbàqà à'‹à³àÄàÉàÒàèàûà"ÿà5"á1XáŠášá®á±á·á"Íá ðáþáââ#)âMâgâ lâ'vâžâ¥â¬â´âÄâËâÒâ=Ùâã.ãAãGTãœã ã²ã¸ãGÀãäää0äFäaäwäˆää˜ä¬ä+»ä çäóä åås5å%©æ Ïæðæ*õæ" ç7Cç{çç ¨ç³çÃçÌçÓçåçéçíçôçöçˆüç …èQ’è äèîèóèé&$éKéMé0Réƒé—éœé¡é¼éÁé#Üéêê>ê<ZêQ—êOéêL9ë4†ë9»ëõëì%/ì2Uì ˆì!©ì3Ëì+ÿì+í@í*Yí7„í¼í1Áíóíî#î4î:îm?î%­îÓî<îîG+ïsï5ï)Åïïï ðð-ðDðWðfðuð+Œð!¸ðFÚð!ñ@ñ'\ñ)„ñ®ñÇñ$åñ ò1+òA]òŸò'²ò7Úò1ó'Dó"lóó ¢ó7¯ó)çó*ô<ô,Aô2nô3¡ô6Õô# õ.0õ_õvõ?†õ7Æõþõö3ö9Oö/‰ö/¹öéö?÷G÷c÷ƒ÷ž÷¹÷Ô÷Ù÷Ý÷ð÷ÿ÷ ø'øDøIø Mø Yøeømø&†ø­øµø;½ø ùø!ù.<ù kù!Œù®ùÇùUÌù"ú3ú6Lú ƒú ú(›ú7Äúüú'û,ûDû\û+dûû)–û‡ÀûHüYümü4üÂü/áü%ýI7ý-ý¯ý Ïý!Ùý-ûýU)þ þ Šþ«þ²þ4¸þ4íþ4"ÿBWÿšÿ"®ÿÑÿ×ÿëÿúÿ 1Hek} „Ž/£Óð÷ 307hpt}„‰Œœ#µ#Ù ý 6D bns‹I² ü=EN&V},”*Á5ì"+E[j2|¯+¾#ê' 6DT5l¢½?Ú-F? † ’ž$º7ß$a<2ž%Ñ%÷ >Y7l¤ ¬@¹úE "T w ‰   « ± Í ã ö * a@ ¢  º  Æ Ð à û  " 2;  n x $ ¦ (Æ  ï  ù  * %D  j v  } Š © GÆ  ( .  N ;X ” 4® ã ô #3:? GQ Ze}‚• ¤±È ã6,K x… ‹˜¨½Õòø*B YPzVË"9+"e$ˆ­3À"ô&.-U ƒ%%³Ù'à $I2È|ÅE %9Rk s6€·ÀÉ Ñß ñü:nWAÆ&YB4œÑ$ë(9P Va5~ ´'¿ çò20c k+u ¡ ÂÎ é&ö &* Q _.€>¯!î5,Fs'/µ/å0EFŒi•QÿQ:j+¥+Ñ.ý+,+X*„H¯ ø #07KZi*‡²¸!Éë /  M >Y @˜ Ù ß ã õ $!*!-J-)S-…}--.N1.6€.5·.@í.æ./!0*708b0&›0Â0Å0Ì0ä0<ý0 :1D1H1O1^1x1Š1¥1 Á1 Î1Ø1ó1 2 /2 P2 q2}2&†2­2+±2"Ý23'3B3a3s3„3¢3²3DÑ34/4A4Q44V4$‹4°4¹43Ê4þ4#5@5W5]5z5Š5Ÿ5&¦5*Í5 ø56 6*68D6}6ƒ6˜6¨6 °6¾67Ñ61 7;7X7^7 c7o77’7™7*¬7×7 ß78/85782m8 8(¾8&ç89"9>9T9Z9s9R…9Ø9ø9ÿ9: !:+:.:+B:n:€:ˆ::­:Æ:~Í:L;R;a;+u;*¡;EÌ;<<<@<C_<2£<RÖ<\)=†=Š== =§=·=Ì=à=þ=> >,>I>$_>„>›>µ> Í>Ú>7õ>-?=?+F?r?{?Ž?Ÿ?:³?î?÷?ü?5@6@<@ @@ M@;X@;”@:Ð@ A!A*:AeA€A”AœA¤A ÄAÐAÖA*åA5B FB!QBsBB+ŸB]ËB)C0C 8CBCbCuCxCˆC§C*ÀCbëCNDVD^D$fD‹D"¥DÈDäD íD#÷DE&1EXE`E pE{EEƒEŠE’E›E ŸEÀEÐEìEFF1F 9F FF RF \FiFyFHFÖFÚF ÞFìFðFøFüFG GG(G/G 7GAG JGUGmG†G&‹G²G ÍGÙG,àG‘ H ŸH*­H ØHæH/þH.I6I VIbI+vI&¢IÉIèI J J JJ3J1HJzJƒJ”J9J)×JKKMK VK/`K×KhL-L­L5½L9óL-M FM=QMMI®MøMýM-N 4N.BN.qN N¦N"¸NÛN0êN*O+FO%rO˜OžO%¥O ËO.ÙOhPqP vPƒPŒPžP±P ´PÂPÉPÒPÛP+áP QQt2zt ­t¹tÁtÞt!ötu-uDu^ubuzu˜uœu ¸uIÄu,v;v/[v‹v%‘v·v ÊvØv:év$w8w =wKwewxw*{w>¦w:åw x5xDxGx&Px'wx Ÿx¬x´xÄx9ãx&yDyTy>dy£yªy±y¹yÉyÐy×yDÞy&#zJzbzTzzÏzÓz æzðzTøzM{U{p{ Ž{ ¯{Ð{ì{| |!|6|CH|Œ|-’|À|Õ|Ah–TE=u[Š’½|‡·Î:r¹å-¡¼œ¤A}ÍK§ËS@D3yác~i|L{*€ë ÞîÖ¿sô6RP›îªŒØÃó\PU3þ4á§åœå­š_¡¢2¯eËPd¡Ãßjíã¶ššÊ¹“~úÝ,RíoÒw0NðÍ^M·à„*Õ"¬¡¢åï8•(ÁÆeü9«äú¬ã3ï~$Û;âtÞ >Ù/ÐÔÌÉ.©ól5Œyu°yf!H rC…³O4è´äg© b_=-ûI+–æâ'ƒ3øˆáè6‚[‘ªé Ív]?c 9°jƒTŽùÕ@?¾„{ùì\ü‡i¾ÍÅ˜Ê Ž·XÖ@:Ók!>¤9DÒ9y•%í–Y*:‹g,½cºïÓHð!¹¥µ dê˜æÄB(’ìˆ+)¼ós™Ã¨ÅÀÑY´x nÒ,v/–B¥|Î ?)g¸ïáä¦f×ÛsGÔcnn©}ì—Ð4¶6õÚødaÁÂJIõ]<é›òÆ”HtÖñ×qàñºOŸûî`²>~3½ÄÇMsº&‡X…»S=u¨ëE6ÿJ‘¯pÖÍ1 úËÓÆzòô䫊ÄRÇf{<Ôlþ"WÁÚ&+ꑬ>¦8J ˜Z)™ÿ7ìü52\x÷ó8ž¸FSgé—Ñ:>ö}ê³àzÙ§ï°W¹?A)ÝwÇ׿ñ‘;áâv körØ\Ê„‰ÐD®ŒR´m$jÌh•ÿüO®Ø†z"Kz¦%Êyœ=öF#¿—•%€e`æŠ-ð 'MÕâÆÙ$#¤ úÏ!‡I²²V9]v‰ô˜ùÜhtbI$£þ¤¬™¾)BF®5 ¾ÕVð˺à›C¥`8¶â‚.0÷M-ÑZkÁÈ^´_e¦( ‰[ ãÃka±F]çtóRÄGfxªÛÙ%’½¾¿Y÷²WU'"±×GAà,Šõ-‹ú¨ñ£¸Éå<ÛðŸiãa}Ó¨¼Pç¿LŒ@0gçbmû—jø·wK}ö?k«±„ù¹ô¶bTІ#Ý5[ƒh4ÞßLõ.ɦ_ 3ëZòqßþ…2-'!#¢rìçèÑF©5N “Æ»»;uJ‹m&DvØTHÞ÷)Ž%™¤ÂH6cÈ!1£ŽÌˆ‹ 2ºéý.…7Qµ8=@Ýíß9‚Z.°8qÜNXd­X¼0*;P‚+:m¬mNVÂüSÅ„Ê딀ޮW1ö´œ]ž+ø“x°³› Ч†t$³¨Ÿ” [I:hœ%'0õÈD’ÚppÛŒ®Ï¯íž î\ÓýuQÉB /ã‡ÌlJϘ¢L”ñQØ­/L­ 1ý‹ ë¥êªæÌ7þÈ` ø,¼oUd ¡^*i†oa™& KE<耯oU,e 7¥×£02_;ä é÷Oû  蟶GÁC»ž¸­ÑY^¢Ú(šUƒz£WnÀAGÇY¿Ç‚rßC¸ª4ŽQ“X7@  Ü/À1os{pÕ•·û`l~µNÚò|§w&È‘{©çV«±µ#q(ÀÎù'—Ý^2 Ùƒýîi»Üв5.ˆV; 4Â|TýO+B¯ŸÏ#ÃÎ Å"w…”lx"1«Öôa‰Sÿ/êÒ³ÜEšq’½–E›j=À>Å€ÿ Qž<6Cˆn‰ò†ÉfµÔ$±pÄ&KÔÒ?bM*7<ÎÏ(“ZË {CALL} other ops call sign {MODE} full mode / submode in # Records in logbook# retries before giving up# times to resend command before giving up%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&UI&View**.exe... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...0 = T; 9 = N1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types14070.15025 W500 Hz limit8-bit extended characters8-bit extended characters (UTF-8): AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter ignore all comment text modem timing test, spec' file modem timing test, 'n' random 5 char groups modem timing test, string 's' modem char/sec test on nn chars Analysis CSV on,off,toggle CW identifier decrement counter [Wait][Len](ms) log eQSL optional msg log eQSL insert text file valid xcvr filter width rig freq has kbd focus my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot idle signal for NN.nn sec increment counter S/N etc. IMD etc. saveQSO data, append msg to notes log at xmt time other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit CW QSK post-timing CW QSK pre-timing insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously Rev on,off,toggle send CAT cmd valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out schedule execution search DOWN for signal search UP for signal Digitalk On, Off, Toggle repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version WAV file; spec' file WAV file; 'n' random 5 char groups WAV file; string 's' WAV file; internal string CW WPM:Farnsworth get weather data for station get weather data exchange begin exchange end exchange in exchange outADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQARQ controlAX25 DecodeAbortAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdd address to notes fieldAdd geopolitical name of METAR stationAdjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAllow errorsAllow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto CRLF line lengthAuto connect when fldigi opens (server must be up)Auto start programs with fldigiAuto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutostartAvailable substringsBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBad modem idBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowseBrowserBrowser Line ColorsBug me about saving log entriesBuild infoButtonButton HeightButtonsC&ountriesCAT command for PTTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall LookupCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter in passband Right click to undoCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear channel text after # seconds of inactivityClear list?Clear log entries after saving or using macro Clear log fields?Clear on saveCloseClose ListClrs/FntsColorColor of Mark TrackColors && FontsColors and cursorsCommand line optionsCommand run on KML creationCommand started when KML files are generated. Subprocesses are started once, and restarted if needed.Commands are echoedConditionsConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?Connect to serverConnect/disconnect to Talker socket serverCont'ContestContest exchange receivedContest exchange sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate keyed square wave on right audio channelCreate sunspotsCustom shiftCustom text searchCustom...CutDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode (CWI suppression)Decode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault CW tracking pointDefault RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete local data files if selected.Delete the current recordDeselectDetect the THOR preamble Clear the Rx pipelineDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice:DevicesDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory...Disable alert dialogDisable allDisable freq changeDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay RX in reverse videoDisplay tx and rx in main fldigi window. Change requires restart of fldigiDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDot to dot-space ratioDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge shapeEdge timingEmbedded Wefax GuiEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable Busy ChannelEnable CSMAEnable DSP prior to decoderEnable KISSEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable rx text streamEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable to put Tx panel above Rx panelEnable when both programs are using the same IP addressEnabledEnabled - log QSO using Mark frequency Disabled - log QSO using center frequencyEnabled - use Mark/Space filter outputs Disabled - use pseudo signalsEnd of xmt IDEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-name for cty.dat folderEnter test string or leave blank for default:Enter time span in minutesErrorEvenEven linesEventEvent logExchange InExchange OutExecutable file to insertExecute command on KML files.ExitExit promptsExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.F-WPMFECFFT ProcessingFFT averagingFFT prefilter window functionFLMSG files...F_keysFahrenheitFax images destination directoryFeel free to skip any pages or exit the wizard at any timeFeldFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font/ColorFont:Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreq.FreqDisp / MetersFrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)FullFull reportGeneralGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlibHamlib used for rig controlHardware PTTHeight of macro barHiLite 1HiLite 2HideHide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:I/OIDIDsIOIOTAIP Address Port NumberITU zoneITUZIgnore duplicatesInInactivity timeoutInclude the transmit frequencyInclusive stop date for exportInfoInit delay (ms)Initial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Interesting notesInterleave SYNOP and textInterleave text with decoded SYNOP messages, or replacement.Islands on the airK3 A1A configuationKISSKISS controlKMLKML balloon display styleKML balloon in plain text, or HTML, in plain tables or matrices.KML files directoryKML refresh interval (seconds)KML root fileLOCLast QSOLatencyLeading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Listen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocatorLockLock transmit frequencyLogLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog sourcesLogbookLogbook DialogLoggingLogging Panel ControlsLogs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Long receive integrationLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMETAR station ID codeMETAR station locationMFSK image fileMT-63Macro Button LabelMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMark onlyMark prev freq/modeMark-SpaceMatched Filter bandwidthMaximum row number for a received fax image.MediumMerge ADIF fileMerge...Meter ColorMiles / HourMinimal controlsMinimum distance for splitting alias nodes (Meters)Minimum distance for splitting aliases (Meters)Minimum time between eventsMiscModeMode in useMode must matchMode width limitModemModem carrierModem signal on left and right channelsModemsMonitor transmitted signalMouseMouse wheel active on macro buttonsMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Msec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameNewNew record / Save recordNextNoNo faster than thisNo file name givenNo slower than thisNoneNormalNormal drop speed / valueNot worked beforeNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OOKONON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOddOdd linesOn/OffOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator workedOperators QTHOperators nameOptional configuration in format: param=val ...OptionsOtherOutOutput port number when same IP address usedOverPSKPSK ReporterPSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT via Hamlib commandPWR-meterPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPortPort:PortAudioPost-keydown timing (ms)Power scalePrPre-Signal TonePre-keydown timing (ms)Preamble DetectionPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProsignsProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPskmailPulse shapePulseAudioPwrQRZQRZ cdromQRZ.comQRZ/eQSLQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO loggingQSO must not occur within a time period ofQSYQTHQTH NicknameQthQuietRE:RPCRSID receptionRST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Scope DisplayRX - unshift on spaceRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine pulse shape factorRange +/- wpmReading fonts...Really delete record for "%s"?ReceiveReceive filter bandwidthReceive modesReceive synchronizerReceived fax maximum rows number (5000)Recent activity for gridReception of flmsg filesReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Refresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveReplay trackline audioReport ARQ frames average S/NReport rig frequency (enable only if you have rig control!)ReportsResetReset FEC blocks when changing BW or TonesReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetriesRetrieve for active modem useRetry interval (ms)Returns IP Address and port number to the default value.RevReverseReverse Left/Right channelsReverse videoRevert to Unsifted char's on a spaceRevert to unshifted char's on a spaceRigRig controlRig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRight channelRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRsIDRst receivedRst sentRun programRun program:RxRx / Tx PanelsRx WPMRx bkgndRx fontRx/TxRx/Tx Character setS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SYNOP to ADIFSYNOP to KMLSample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save image as monochrome fileSave log entry?Save logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...Scale ColorScopeScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Searches passbandSecondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelf Organizing MappingSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSer inSer outSerial # inSerial # outServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSettingsShaped TxShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:SigLvlSignal BrowserSignal Level ColorsSignal averaging over time 0 - least 4 - greatestSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow CPU (less than 700MHz)Slow drop rateSoft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpace onlySpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!Sweet SpotSynopSys ColorsSystemT/RTX - unshift on spaceTX PowerTX WPMTX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTabular data sourcesTalkerTalker Socket (MS only)TemperatureTestTest charTest character for QSK adjustmentTest commandTest text fileTest...Text CaptureText HighlightingText Tags (tags use {} delimiters)Text file to insertText i/oText to send during keyboard idle timesText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThese tags can also be used in This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimeout (secs)TimingTiming and QSKTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTouchTracked CW speed in WPMTrackingTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):TuneTune margin (tone frequency spacing)Two scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9TxTx above RxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUIUI languageUI schemeUS state of station workedUndoUnsupported formatUpdateUpdate selected local data files with repository contentUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUse uHRouter PTTUse wave shaping on Tx signalUsed For PSKMail and FLDIGI Suite of ProgramsUsed for BPQ32User IDUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVideoVideo ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWF CtrlsWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWXWait for response to first CAT commandWait for response to subsequent commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWavWav write sample rateWeather query specificationWebWeb Browser lookupWeight (%)Weight decreases with increasing edge timingWheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWind speed/dirWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)XMITXMT lockXON/XOFF flow controlXY - classic scopeYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafterautomatic data uploadcallsign tooltips in received textchannels != 1charscty.dat foldercurrent wx conditionsdefault text to send with etcdefault uses date/time oneQSLeQSL userenable mouse wheel control of macro barflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangeh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourmbarsminutesrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportssecondsselect browser fontselect by datesend when logged (log button, , )track colorunknown wave file errorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.22.02 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2014-11-18 22:43-0500 Last-Translator: Pavel Milanes Costa Language-Team: Spanish (Pavel Milanes Costa) Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.4 {CALL} indicativo del otro operador {MODE} modo completo / submodo en Número de entradas en el libro de guardia# de reintentos antes de rendirnos# de veces para reenvío de comandos antes de rendirnos%s log iniciado a %s%s: No existe, ¿crear?&Acerca de&Configuración&ArchivoA&yuda&Libro de guardia&OKI&U&Vista**.exe... Estos controles están en otras pestañas. Solo se duplican aquí por conveniencia. Puedes cambiar su estado en cualquier lugar. ...0 = T; 9 = NTono de audio de 1Khz cuando hay PTT activo Para ser usado en otras formas de PTT14070.15025 WLímite de 500 HzCaracteres extendidos de 8bitsCaracteres extendidos de 8bits (UTF-8): AFC encendido, apagado, alternado mi antena banda de operación indicativo del otro limpiar los campos del log limpiar el panel de RX limpiar el panel de TX contador de concurso ignore todos los textos de comentario archivo de especificación de la prueba de sincronización del módem prueba sincronización de módem , 'n' grupos de 5 caracteres al azar prueba de sincronización de módem, cadena de caracteres 's' prueba módem car/sec en nn caracteres Análisis CSV encendido,apagado, alternado identificador de CW decrementar el contador [Wait][Len](ms) logear un mensaje opcional en eQSL.cc Salvar directo en eQSL.cc insertar archivo de texto ancho del filtro válido para el trx frec radio tiene el teclado en foco mi frecuencia texto a NOMBRE/QTH moverte a la frecuencia NNNN retornar a la frecuencia inicial en la cascada esperar NN.nn segundos por la señal incrementar el contador S/N etc. IMD etc. Guardar los datos del QSO, añadiendo msg a las notas del log, cuando se muestra en el buffer de TX guardar al tiempo que transmite localizador del otro bloqueo (LOCK) encendido, apagado, alternado guardar los datos del QSO, añadiendo msg a las notas del log guardar datos del QSO cambiar el archivo de definición de macros mapearlo por su valor mapearlo en google modo mi indicativo mi localizador mi nombre mi QTH mi RST nombre del otro Transmitir |NN| ráfagas de RsID próximo QSO a guardar # pausar la transmisión (Pasar a RX sin limpiar el panel de TX) CW QSK al final CW QSK al inicio Insertar QRG en el panel de RX # QSO guardados Hora del QSO (HHMM) incr/decr frece xcvr qsy a kHz, Hz clic-derecho QSY a la frecuencia anterior clic-izquierdo QSY a la frecuencia preferida de este modo QTH del otro repetir la macro continuamente Reverso activado, desactivado, alternado enviar comando CAT modo válido para el trx tiempo de subida de CW RST del otro recibir Rx RSID encendido, apagado, alternado guardar el archivo de macro actual guardar intercambio de concurso ejecución programada buscar ABAJO en la cascada por una señal buscar ARRIBA en la cascada por una señal Digitalk Encendido, apagado, alternado repetir cada NN segundos sintonizar la señal por NN segundos alternar Tx/Rx transmitir poner el atenuador de TX del equipo a este valor Tx RSID encendido, apagado, alternado version de Fldigi archivo WAV; archivo de especificación archivo WAV; 'n' grupos de 5 caracteres al azar archivo WAV; cadena de texto 's' archivo WAV; cadena de texto interna CW PPM:Farnsworth obtener datos de clima para una estación específica obtener datos de clima comienzo del intercambio fin del intercambio intercambio entrante intercambio enviadoADIFAFCComportamiento AFCRango AFC (Hz)Rango AFC o Ancho de bandaVel. del AFCVelocidad de rastreo del AFCALTRARQControl ARQDecod. AX25AbortarS/N (dB) de adquisiciónRango de búsqueda y adquisición (Hz)AcciónAñadirAñadir CRLF después del ancho de caracteres de la páginaEnviar RsID al finalizar cada TxAgregar dirección al campo notasPoner nombre geopolítico a la estación METARAjustar la frecuencia del cursorAjustar el ancho de banda del DSPConfiguración avanzada:TodoTodos los ajustes mostrados aquí pueden ser modificados luego en el menú ConfigurarPermitir erroresPermitir/Impedir cambiosColor alternativo de los caracteres en el panel de RxrSiempre LSBSiempre USBSiempre mostrar las frecuencias de audioSiempre iniciar los módems nuevos en estas frecuenciasAntena:Apariencia de la etiqueta de cada canalAñadir al texto de RX:Añadir al texto de TX:AplicarEntrada de frecuencia controlada por flechaAudioInformación de los dispositivos de audioLa información del dispositivo de audio está solo disponible cuando se usa PortAudio como método de comunicación con el dispositivoArchivo de audioFrecuencia de audioDispositivo de entrada de audioFrecuencias de audio o RF en la escala de la cascadaDispositivo de salida de audioHistorial de audio descodificado al seleccionarAjuste automático de línea con CRLFAuto conectar cuando fldigi se ejecute (el servidor debe estar encendido)Iniciar programas automáticamente con fldigiAutocompletar el país y azimutAuto CRLFControl Automático de FrecuenciaSeguimiento automático de la velocidad de RxHacer "spot" automáticamente con los indicativos descodificados en el texto recibidoAutoinicioSub cadenas de texto disponiblesAtrásFondoColor de fondo para el grupo de teclas de función 1Color de fondo para el grupo de teclas de función 2Color de fondo para el grupo de teclas de función 3Color de fondo de control deslizante del silenciador del navegadorFrecuencia erróneaIdentificador incorrecto de módemBandaConcordar en bandasAncho de bandaPresión BarométricaTasa de baudiosTasa de baudios:Guía del principianteComportamiento del S/N y IMDFondoBits por caracterBuscarNavegadorColores de ResaltadoPregunta acerca de grabar los registros del logInformación de compilaciónBotónAltura del botónBotones&PaísesComandos CAT para el PTTCPUEl uso del CPU aumenta con el alto de la cascadaZona CQCQZCR-CR-LFCSV...CTRLCWModos con CW IDPost-ámbulo de ID de CWCW QSK en el canal derecho de audioAncho de banda del filtro DSP de CWCW es LSBWPM en TX de CWDetección y supresión de CWIUmbral de CWIConfiguraciones para CabrilloCabrillo...Ind.Búsqueda de indicativoBuscar IndicativoIndicativo trabajadoBúsqueda en Callbook.info (servicio gratuito solo indicativos de EE.UU.)IndicativoPuede ser usado en vez de o en adición de otros tipos de PTTCancelarCapturaDispositivo de captura y reproducciónDispositivo de capturaCapturar el texto de Rx a un archivo externoCapturar señales por encima de este nivelCapturar señales dentro de este rango de frecuenciasCaptura:Frecuencia portadora (Hz)Salto de la portadoraGrados CelciusCentrar la señalCentrar en el pasabanda Clic derecho para deshacerLínea centralCambiar el número de canales del navegadorCambiar SOLAMENTE para experimentarCambiar la apariencia de la aplicaciónCambiar colorCambiar carpetaCambiar el nivel de logCambiar la posición de los canales de abajo a arribaCambiar a archivo de macroCambiar escala de la cascadaLos cambios serán efectivos en el próximo inicio del programaEtiqueta del canalNúmero del canalCanales, el primer canal comienza en el límite inferior de la cascadaCarac/Fila:Marcar todoComprobar si hay duplicadosComprobar si existen actualizacionesComprobar si hay actualizaciones al iniciar el programaComprobar si existen actualizacionesMarque aquí para ser notificado cuando un RSID es recibido sin cambiar el módem y la frecuenciaMarcar para reducir la carga al CPU en PSK y RTTY.Comprobando si hay actualizaciones...Seleccione directorio de archivos KMLCiudad de la estación trabajada¡Limpiar datos KML ahora!Limpiar al iniciarLiampiar datos KML, limpia la pantalla de Google HearthLimpiarLimpiar todoLimpiar el texto del canal después de N segundos de inactividad¿Limpiar la lista?Limpiar la entradas del log después de guardar o usar la macro ¿Limpiar los campos del registro?Limpiar al grabarCerrarCerrar listaColores/TiposColorColor de cursor en la MarcaColores y tipografíaColores y cursoresOpciones de línea de comandosComando a ejecutar al crear un archivo KMLComando que se ejecuta cuando se genera un archivo KML. Subprocesos se reinician si es requerido.Los comandos tienen ecoCondicionesConfirmarConfirmar SalirConfirmar RESTABLECIMIENTOConfirmar la salida¿Confirmar salir?Conectar con el servidorConectar/desconectar el socket del servidor TalkerContestiaConcursoRecibido el intercambio en concursosIntercambio enviado en Concurso# Recibido como intercambio en concursosConcurso:ContinenteMovimiento contínuoCaracteres de control en el panel de Rx/TxConvertir el indicativo a mayúsculasConvertidorCopiarCorreccionesNo se pudo crear el directorioNo se pudo abrir la URL: %s No se pudo ejecutar un navegador web: %s Abra esta URL manualmente: %sNo se puede iniciar flmsgPaísPaís de la estación trabajadaProvinciaCrear una onda cuadrada en el canal derecho de audio (1Khz)Crear un reporte CabrilloCrear una onda cuadrada en el canal derecho de audioCrear un sunspotSalto ajustadoBusqueda de texto personalizadaPersonalizar...CortarDTMFDTR +12DTR +12 vDTR = +VDTR es PTTDTR es la línea de PTTDXCCIdentificador DXCCEntidades DXCCEntidad DXCCRelación punto a rayaBúsqueda en base de datosUbicación de la fuente de datosArchivos de datosActualización de datos localesArchivos de datos...Horas de retención de datos (0 sin límite)Fuente datosFechaFecha de finFecha de inicioFecha de fin del QSOFecha de inicio del QSOFecha y hora de inicio = finDebugDetección y supresión de CWIDescodifica paquetes AX25 en forma legibleDecodificar tonos DTMFDecodificar tonos DTMF recibidosDecodificar mensajes SYNOP al log ADIF (ejemplo Servicio Meteorológico Alemán)Decodificar mensajes SYNOP al documentos KML (ejemplo Servicio Meteorológico Alemán)OmisiónPredefinido 800 Hz. Servicio Meteorológico Alemán 850HzPunto predefinido de rastreo de CWPunto predefinido de rastreo de RTTYWPM predeterminadoPunto predefinido de rastreo para los otros módemsFrecuencia de RX/TX predeterminadaMensaje predeterminadoLa cadena de prueba por omisión es: "Osciloscopio de hilos cruzados predeterminadoReiniciarRetrasar NN ms antes de soltar el PTTRetrasar la salida del audio en NN msBorrarEliminar datos locales si se seleccionaEliminar el registro actualDeseleccionarDetectar el preámbulo de THOR Limpiando el buffer de recepción de datoDetectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para guardar el texto contenido entre ellas a un archivo con la fecha al estilo: NBEMS.files\WRAP\recv\extract-20110205-201712.wrapDetectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para guardar el texto contenido entre ellas a un archivo con la fecha al estilo: ~/.nbems/WRAP/recv/extraxt-20110205-201712.wrapNivel de señal detectadoDetección de nivelUmbral alto del detectorUmbral bajo del detectorPuerto:DispositivosDiferencias entre frecuencias de Rx y Tx (en el radio)DígitosDígitosAtenuarDirectorio...Desactivar alertaDesactivarDesactivar cambio de frecuenciaDesactivar la detección futura cuando un RSID es recibidoProcesamiento multicanal de la señal desactivado en PCs con CPUs muy lenta y no se usa el navegador de señalActivar spotting solo cuando el navegador de señal está visibleDeshabilitar detectorMostrarMostrar Rx en video inversoMostrar TX y RX en la ventana principal de fldigi. Este cambio requiere reiniciar fldigi.No cambiar automáticamente a la frecuencia del RsIDNo mostrar alerta de RsIDNo usar base de datos de indicativosNo busque indicativos vía navegador webOsciloscopio empotradoDomEXNo guardarRelación punto a punto-rayaAgarrar y arrastar en la cascada cambia la frecuenciaColor Dup.Chequear duplicados, Indicativo más...DuplicadosForma del bordeTiempos de bordeInterfaz embebida para WXFAXLimpiar los documentos KML al inicio del programa.ActivarActivar -Activar / desactivar los iconos en el menúActivar / desactivar sugerenciasActivar ARQActivar det. canal ocupadoActivar CSMAActivar el DSP antes del decodificadorActivar KISSActivar el FEC compatible con MultiPSKActivar todosMarcar para activar cada opciónActivar el arrastrado del cursor en la cascadaHabilitar para capturar el texto del panel Rx con un solo clicActivar para señales muy debilesActivar si tu computadora no decodifica correctamenteActivar el registro del texto de recepción.Activar al iniciar fldigiActivar esto para caracteres acentuadosActivar esto para caracteres acentuados (UTF-8)Activar esto para caracteres acentuados (UTF-8)Activar para poner el panel Tx sobre el panel RxHabilitar cuando ambos programas están usando la misma dirección IPActivadoActivado - Guarda QSO usando la frecuencia de la Marca Desactivado - Guarda QSO usando frecuencia centralActivado - usar filtros de salida Marca/Espacio Desactivado - usar seudo-señales ID al finalizar cada TxEntre la ruta completa del ejecutable del programa externoEntre la ruta completa del ejecutable flmsgEntre la ruta completa del ejecutable fllogEntre la ruta completa del ejecutable de flmsgEntre la ruta completa del ejecutable flnetEntre la ruta completa del ejecutable flrigEntre la ruta completa del archivo cty.datEntre la cadena de prueba, o déjela en blanco para usar la predefinida:Entre rango de tiempo en minutosErrorParLineas paresEventoRegistro de eventosIntercambio RXIntercambio TXArchivo ejecutable a insertarEjecutar un comando sobre los archivos KMLSalirAvisos de salidaConfiguración de la exportaciónExportar a archivo ADIFExportar a un archivo CSVExportar a un archivo de texto con campos fijosExportar...Extraer archivos para usar con programas externos (wrap/flmsg)Limpiar el texto del canal después de N segundos de inactividadF-WPMFECProcesamiento FFTPromedio de FFTFunción de ventana de prefiltro FFTArchivos FLMSG...Teclas de funciónGrados FahrenheitDestino de las imágenes de faxPuedes saltar o salir de cualquiera de estas configuraciones en cualquier momentoFeld-HellSolo E/S desde archivoAutocompletar la información del país y del azimut usando el archivo cty.dat (Lo tienes instalado, ¿cierto?)FiltroFactor de ancho de banda del filtroAncho de banda del filtroFactor de ancho de banda del filtroAncho de banda del filtro relativo al ancho de la señalFiltrajeBuscar país:Buscar el siguienteBuscar prefijo:Buscar el anteriorBuscar:TerminarIntervalos FijadosConfiguración de Fldigi...ConfiguraciónAsistente de configuración de fldigiArchivo de definición de macro para Fldigi *.mdfPaleta Fldigi *.palarchivo de definición de radio xml *.xmlSitio web de Fldigi...Osciloscopio flotanteCarpetasTiposColor de letraTipografíaTipografíaTipografía:Forzar una taza de muestreo específica. Seleccionar "Nativo" si "Auto" no trabaja bien con tu dispositivo de audio.Forzar el campo indicativo a MAYUSCULASForzar el espaciado de los canales a incrementos de 100HzForzar fecha/hora de inicio = fecha/hora de final del QSOCodec de audio libre sin pérdida *.flacServicio gratuito cortesía de OKFrecFrec.Vis. Frec / medidoresFrecuenciaFrecuencia en MHzEscala de frecuenciaSalto de frecuencia (800Hz)CompletoReporte CompletoGeneralGenerar una onda cuadrada en el canal derecho (1Khz)Generar una onda cuadrada en el canal derechoGrupo 1Grupo 2Grupo 3Hamcall.netHamlibUtilice Hamlib para controlar el radioPTT realAltura de la barra de macroHiLite 1HiLite 2EsconderOcultar la ventana de TXOcultar la ventana de TX de forma predeterminadaEsconder después de (s):AltoLímite superior de frecuencia en HzHost:E/SIDIDsE/SIOTANúmero del puertoZona ITUITUZIgnorar duplicadosRecTiempo de inactividadIncluir la frecuencia de TxFecha de fin de la exportación (inclusiva)InfoRetardo inicialización (ms)Estado inicial de DTREstado inicial de RTSVoltaje inicial en DTRVoltaje inicial en RTSInicializarInicializar la interfaz RigCATInicializar la interfaz HamlibInicializar la interfaz de HW para PTTInicializar la cuenta del número serieInicializar el socket clienteSalto de la portadoraInsertar el marcador de texto en el panel de Rx antes de cambiar la frecuencia y el módemInsertar texto predeterminadoInsertar archivo...Insertar reporte METAR completoInsertar ceros a la izquierda en el número de serie enviadoInsertar marcadorInsertar un texto especial en el panel de Rx cuando se da clic en la cascadaInsertar textoInsertar texto en un solo clic izquierdoPeriodo de integración (bloques FEC)Notas interesantes (80 caract. máx.)Intercalar SYNOP y textoIntercalar texto con mensajes SYNOP descodificados, o reemplazosIslas en el aire (IOTA)Configuración de A1A para el Elecraft K3KISScontrol KISSKMLEstilo del globo de KMLKML globo en texto plano, o HTML, en tablas simples o matrices.Directorio de archivos KMLIntervalo de refresco KML (seg)Raíz del archivo KMLLOCÚltimo QSOLatenciaTiempos de subida y bajada del pulso (ms)Deje esto en blanco en Ubuntu con una sola tarjeta de red referirse a http://www.pulseaudio.org/wiki/ServerStrings para más detallesAmbos canales de audio contienen informaciónClic izquierdo para limpiar el texto Clic derecho para restablecer frecuenciasClic izquierdo para seleccionar el color de duplicadosClic izquierdo: cambiar modo Clic derecho: configurarClic derecho o izquierdo siempre reproduce la historia del audioLicencia GPLv3+: GNU GPL versión 3 o posterior Este software es de uso libre: usted es libre de modificarlo y redistribuirlo. No hay NINGUNA GARANTÃA, excepto la permitida por la ley. Colores de los botones iluminadosLimitar el movimiento del AFC a este rangoLimitar a unos pocos caracteres Como en CQEM o IOTA etc.Escuchar señales dentro de este rangoLkCargarCargar una nueva paletaCargar archivo de imagenCargar o descargar una imagen desde archivo (PNG, JPEG, BMP)Cargar...LocBuscarBuscar binarioBuscar el archivo cty.datBuscar ejecutableBuscar el ejecutable flampBuscar el ejecutable fllogBuscar flmsgBuscar...Buscar el ejecutable flnetBuscar el ejecutable flrigBuscar el ejecutable programa #1Buscar el ejecutable programa #2Buscar el ejecutable programa #3CuadrículaBloquearBloquear la frecuencia de transmisiónLogRegistrar mensajes de Navtex a archivo ADIFRegistrar mensajes de Navtex a KMLRegistrar frecuencia RTTYRegistrar mensajes Wefax a archivo ADIFGuardar todo el texto de TX/RXOrígenes de logsLibro de guardiaDiálogo del libro de guardiaRegistro de QSOPaneles de control de registroGuardar mensajes a archivos KML (Google Earth, Marble, Gaia, etc...)Larga integración en RxBuscar indicativoUsuario de LotWBajoLow = cero errores Medium = 1 error High = 2 erroresLímite inferior de frecuencia en HzInferiorlímite inferiorFrecuencia más baja en la parte inferior del visorCódigo de la estación METARLocalización de la estación METARArchivo de imagen MFSKMT-63Etiqueta del botón de macroTexto del macroEditor de macros - MacrosCuadrícula Maindenhead como en FL11ajAtributos del servidor de correo (PSKMAIL)Marca solaMarcar frec./modo previoMarca-EspacioAncho de banda del filtroNúmero máximo de filas para una imagen de fax recibidaMedioMezclar archivo ADIFMezclar ADIF...MedidorMillas / HoraControles mínimosDistancia mínima para nodos alias segmentados (metros)Distancia mínima para alias segmentados (metros)Tiempo mínimo entre eventosMisc.ModoModo en usoConcordar en modoLímite del ModoMódemPortadora del modoAudio del módem en ambos canales de audioMódemsMonitorear la señal transmitidaRatónRueda del ratón activa en los botones de macroPTT es soltado N milisegundos después del pulso realPTT es enviado N milisegundos antes del pulso realMilisegundos entre reintentosMilisegundos entre comandos secuencialesProcesamiento de la señal multi-canalDetector multicanalMi indicativo de INDICATIVOMi velocidad CW (WPM)NBEMSInterface de datos NBEMSArchivos NBEMS...Seleccionar cuando no haya dispositivo de audio disponible o para realizar pruebasNO SE HA DEFINIDO UN INDICATIVONombreNuevoRegistro nuevo / ActualizarSiguienteNoNo más rápido queNo se ha proporcionado un nombre de archivoNo más lento queNingunoNormalTasa de caída normal / valorNo trabajado previamenteMuescaNota: Estos elementos de configuración son útiles para usar fldigi en un dispositivo con pantalla táctil, como una tableta.NotasNotificacionesNotificar solamenteCantidad y posición de las barras de macroNúmero de dígitos en el número de serieHoras de conservación para cada nodo, Cero significa conservar todo.SOKActivoActivado - Estilo marquesina Desactivado - Limpiar y re-comenzarON - Buscar en toda cascada OFF - Limitar la búsqueda a +/- 200 HzOn - Tipografía pequeña OFF - Tipografía grandeON - Iniciar en la predeterminada OFF - Mantener la posición actual en la cascadaActivado - Usar el último conjunto de macros Desactivado - Usar el conjunto pre-establecidoOSSImparLíneas imparesOn/OffUna sobre Rx/TxUna sobre la cascadaUna bajo la cascadaDocumentación en internet...&ModosAbrir...Lista abiertaAbrir archivo en el navegador predeterminadoAbrir en el navegadorAbrir un archivo de libro de guardiaAbrir archivo de macroAbrir carpeta de mensajesAbrir mensaje con flmsgAbrir paletaAbrir archivo xml de radioAbrir el silenciador por nn segundos si se detecta RSIDAbrir con flmsgAbrir...Abrir la carpeta de NBEMS cuando capture okOperadorOperador trabajadoQTH del operadorNombre del operadorConfiguración opcional en el formato: parámetro=valor...OpcionesOtroEnvPuerto de salida cuando se usa la misma dirección IPMuchoPSKPSK ReporterPSK et al.Color 1 para el resaltado de HiLite en el visor de PSK/RTTYColor 2 para el resaltado de HiLite en el visor de PSK/RTTYRetrasos de PTT válidos para todos los tipos de PTT y CATRetraso de fin de PTTEl PTT es un comando CATTono para PTT en el canal derecho de audioPTT como comando de HamlibMedidor de potenciaPaleta:ParidadProcesar todo el texto entranteContraseñaPegarRutas (Oculto)Seleccionar la tasa de baudios de la listaReproducir el historial cuando se selecciona un canalReproducir¿Reproducir en un lazo continuo?Dispositivo de reproducciónReproducción:Por favor especifica tu indicativo primero.Mostrar información de un indicativo después de estar dos segundos con el ratón sobre estePuertoPuerto:PortAudioTiempos posteriores al PTT (ms)Escala de potenciaPrTono pre-señalTiempos anteriores al PTT (ms)Detección de preámbuloPresione enter para continuar la búsquedaImprimir CW / RTTY / THROB / CONTESTIA en minúsculas (Estos modos solo reconocen las mayúsculas)Prog 1:Prog 2:Prog 3:Confirmar para grabar configuraciónConfirmar para grabar logConfirmar si graba el log al salirConfirmar para grabar macroProsignsProvinciaProvincia de la estación trabajadaAFSK en canal derechoSeudo-FSK en el canal derecho de audioPskmailForma del pulsoPulseAudioPotQRZQRZ CDQRZ.comQRZ/eQSLQSKQSK en el canal derecho de audioFecha de RX QSLQSL recibidas en esta fechaQSL route de la estaciónFecha de TX QSLQSL enviadas en esta fechaQSL-VIAQSL-recibidaQSL-enviadaFecha QSOFecha de finFecha de inicioRegistro de los QSOEl QSO no debe ocurrir dentro del período especificado a continuación.QSYQTHApodo del QTHQthCalmadoRE:RPCRecepción con RSIDRST recib.RST env.RST(r)RTS +12RTS +12 vRTS = +VRTS es PTTRTS es la línea de PTTControl de flujo RTS/CTSRTTYConfiguración de Osciloscopio en RTTYNo saltar en el espacio RXCapturar RXRX ppmCorrección de RX en el dispositivo de audioLas entradas de texto de Rx están delimitadas por los caracteres definidos aquí, el tabulador, el espacio y la nueva línea están ya incluidosFrecuencia RFFactor de forma pulsada al coseno elevado Rango +/- wpmleyendo tipografías...¿Está seguro de borrar el registro para "%s"?RecibirAncho de banda del filtro de RxModos de RXSincronizador de RxNúmero máximo de filas para un fax (5000)Actividad reciente para el localizadorRecepción de archivo en flmsgReportes de recepción...ReconectarEnt.RectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Intervalo de refresco de escritura para KML (seg)RecargarRecargar cty.datEliminarReproducir el audio del buffer ante un clic en la cascadaReportar el promedio de S/N de tramas ARQReportar la frecuencia del radio (activar solo si tienes control del radio)ReportesReiniciarReiniciar FEC al cambiar ancho de banda o tonos¿Restablecer todas las opciones a su valores predefinidos? Los efectos de esta acción no se observarán hasta el próximo inicio del programa Se eliminaran los siguientes archivos: fldigi_def.xml and fldigi.prefs Ajustar a la portadoraRestablecer carpeta de cty.dat predeterminadaPredeterminadosRestablecer la configuración del puerto serial (COM)Mantener Tx en la frecuencia al cambiar a RX para RsID.Mantenerse en frecuenciaReintentosSintonizar el módem actual a estos datos (Frecuencia y Modo)Intervalo entre reintento (ms)Establece la dirección IP y el número del puerto al valor por omisión.Inv.InvertirInvertir canales de audio derecho e izquierdoVideo inversoRevertir el salto en espacio de los caracteresRevertir el salto en espacio de los caracteresRadioControl del radioArchivo de descripción del radio:Modo del RadioEl radio o la interfaz repite los datos enviadosEl radio requiere control de flujo RTS/CTSEl radio requiere control de flujo Xon/XoffEl radio usa RTS/CTS para comunicarseRad.:RigCATUsar RigCAT para el control del radioCanal derechoDer/Izq Seleccione Dígito Menos SignificativoDer/Izq = 1 x DMS Arriba/Abajo= 10 x DMS Mayús - Der/Izq = 100 x DMS Mayús - Arriba/Abajo = 1000 x LSDRsIDRST recibidoRST env.Ejecutar programaEjecutar programa:RxPanel Rx / TxRX WPMRx fondoTexto RxRx/TxSeleccionar el conjunto de caracteres Rx/TxMedidor de señalComportamiento del S/N y IMDSELSKIPDescodificación MAOSQL-1SQL-2SYNOP a ADIFSYNOP a KMLTasa de muestreoGuardarGuardar...Guardar configuraciónGuardar todo el texto recibido, un carácter cada vez al siguiente archivo: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Guardar como...¿Guardar el libro de guardia modificado?¿Guardar los cambios en la configuración?¿Guardar macros modificadas?Guardar como imagen monocromática¿Guardar los datos del contacto actual en el registro?Guardar el archivo del libro de guardiaGuardar el archivo de macrosGuardar paletaGuardar texto comoGuardar la imagen de fax como PNG en grisesGuardar esta paletaGuardar...EscalaOsciloscopioDesplazamientoSugerencias de desplazamientoBuscar este indicativoBuscar en la webRango de búsqueda (Hz)Buscar en el pasabandaTexto secundarioSegundosSeleccionaSelecciona el # bits / caracterSeleccionar # de bits de paradaTodosSelecciona los campos de concurso para el registro CabrilloSeleccione los campos a exportarSeleccione las entradas a exportarSeleccionar la tipografía de Rx/TxSeleccionar la tipografía de TxSelecciona la etiquetaSelecciona el ancho de bandaSeleccionar la tasa de baudios de la portadoraSeleccionar el salto de la portadoraSeleccionar dispositivoSelecciona como la rueda del ratón se comporta dentro de la cascadaSeleccionar líneaSeleccionar los modos para acceso desde el menúSeleccionar número de tonosSeleccionar paridadSeleccionar archivo de descripción del radioSeleccionar el tipo de prefiltro de FFTSolo para el Elecraft K3 Otros radios no lo necesitan.Selecciona la escala de la tipografía de la cascadaFondo de color de la selección en los paneles de Rx/TxMapas Auto Organizados (Self Organizing Mapping) Es un algoritmo de inteligencia artificial que mejora la descodificación.Enviar tu indicativo en CW al finalizar cada TxEnviar flujo de los caracteres de pruebaEnviar a este WPMEnviar continuamenteEnviar imagenEnviar imagen...Enviar reporte cuando se llenan los datos del QSOEnviar reporte solo cuando se guardan los datos del QSOEnviar texto rx al archivo: textout.txtRegistrar los fax enviados y recibidosCaracteres enviados en el panel de Rx/TxSer recSer envSerie recibidaSerie enviadaServidor:Establecer el nivel de silenciado (SQL) del visorEstablecer el nivel para una visualización aceptableEstablecer el número de caracteres por filaEstablecer el tipo de re-muestreo usado para correccionesConfiguracionesDar forma al TxDescripción corta de la antenaMostrarMostrar las entidades DXCCMostrar ventana de alerta:Mostrar todos los modosMostrar las pistas de ancho de banda en la cascadaMostrar canalesMostar el cursos con las líneas de ancho de bandaMostrar el cursor con la línea centralMostrar menos modosMostrar el editor de macrosMostrar más o menos cascadaMostrar íconos del menúMostrar clave en texto planoMostrar sugerenciasMostrar la señal transmitida en la cascadaBanda lateral:Nivel de señalNavegador de señalColores de detección de nivelSeñal promedio en el tiempo 0 - mínima 4 - máximaNavegador de señalNivel de señalRango de señal (dB)Búsqueda de señalMarcas de líneaUna barra de macros debajo del panel de registro altura variableClic sencillo para capturarTamaño:Caracteres ignorados en el panel de TX (Tx enc./apag. en CW)Correr la cascada hacia frecuencias más altasCorrer la cascada hacia frecuencias más bajasColor resaltado del deslizante del control del silenciador del navegadorCPU lenta (Menos de 700Mhz)Tasa de caída lentaUsar decodificación suave de bitsDescodificación suave de símbolosInvertir por software los canales de audio (derecho e izquierdo)Ordenar por fecha/hora de finOrdenar por fecha y hora de terminación del QSO Afecta a todos los libros de guardia con formato Cabrillo/ADIFDispositivo de sonidoEspacio soloVelocidad (WPM):SpotSpotterSpottingSpotting deshabilitadoSilenciado (SQL)Nivel de silencio (SQL)Silenciado abierto (s)EsInicioFecha inicioFecha de inicio para exportaciónIniciar flampIniciar fllogIniciar flnetIniciar flrigRetraso de PTT en el inicio de transmisiónIniciar prog 1Iniciar prog 2Iniciar prog 3Número de inicioEstadoConcordar en estado (EE.UU.)Estación escuchada dos vecesCuadrícula de la estaciónFecha de finBits de pardaBits de paradaAlmacenar modo y frecuencia Clic derecho para listar¡Creación de un sunspot en proceso!Frecuencia InicialSynopSistemaSistemaT/RTX - no saltar en el espacioPotenciaTX WPMGenerar TXDif. en TxTX ppmCorrección de TX en el dispositivo de audioColorPestañasFuente de datosTalkerTalker Socket (Solo MS)TemperaturaProbarLetra de pruebaProbar el carácter para ajuste de QSKComando de pruebaArchivo de texto de pruebaProbar...Captura de TextoTexto ResaltadoEtiquetas de texto (use el delimitador {})Archivo de texto a insertarE/S de TextoTexto a enviar durante los períodos de no actividad del teclado (canal secundario)Texto...Jovencillo emponzoñado de whisky: ¡qué figurota exhibe! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~El contenido del mensaje de notificación de RsID y sus características de visualización se configuran en "Notificaciones" en la ventana de configuración.La velocidad predefinida en CWEl nombre de archivo es escrito en el panel de RxEl campo de expresión regular no debe estar vacío.La expresión regular debe ser válida.La cadena es remplazada con el modo actual y la frecuenciaLa cadena de prueba no concuerda con el patrón para este evento.Este diálogo te guiará en las configuraciones básicasEtiquetas para usar en el macro La expresión regular de este evento es inválida.ThorHoraTiempo (s):Hora fin.Hora com.Hora finHora inicioHora de fin del QSOHora de inicio del QSOTiempo entre reintentos (ms)Tiempo necesario:Rango de tiempoTimeout (seg)TemporizaciónTiempos y QSKA quien se hace la conexiónAlternarActivar DTR para PTTActivar RTS para PTTDuración del tono (s)TonosTactoVelocidad de seguimiento en CW (WPM)SeguimientoVelocidad de transferencia, X1-normalTransmitirPotencia TXTransmitir indicativoTipografía de TxTransmitir tono de inicio bajoTransmitir el ID del modoModos de TXTransmitir puntos (...) cuando holgazaneePotencia de transmisión usadaSeñal transmitidaTransmitir tono de inicio altoTransmitir el vídeo textoTransmitir/RecibirTransmitir puntos continuos (.......) cuando no halla que transmitirTriangularTiempo límite (s):Sint.Margen de sintonía (espaciado de los tonos)Dos (Esquema 1)Dos (Esquema 10)Dos (Esquema 2)Dos (Esquema 3)Dos (Esquema 4)Dos (Esquema 5)Dos (Esquema 6)Dos (Esquema 1)Dos (Esquema 8)Dos (Esquema 9)TxIntercambia paneles Tx/RxTx fondoTexto Txatenuación de nivel de TX (dB)Potencia de TX a poner en el logTxIDIUIdioma de la IUEsquema de la InterfazEstado de EE.UU. de la estación trabajadaDeshacerFormato no soportadoActualizarActualizar los datos locales con el contenido onlineActualizar el registro actualSuperiorLímite superiorNivel superior de la señal (dB)Usar "cr cr lf" para "cr lf"Usar '(' en vez de KNUsar el CD o una imagen del CD en el disco duroUsar el filtro DSP antes del decodificadorUse DTRUsar tiempos FarnsworthUsar HamlibUsar frec. MARCAUsar servidor de audio OSSUse Abrir para seleccionar un descriptor de archivoUsar servidor PortAudioUsar servidor PulseAudioUse RTSUse RigCATUsar promedio para disminuir el ruido en la cascadaUsa botones coloreadosUsar osc. de hilos cruzadosGuardar la fecha/hora de fin del QSO en el logUsado para disparar amplificadores que detectan carrierUsar ceros a la izquierdaUtilice un PTT por puerto paraleloPTT por puerto serie separadoUsar tipografía pequeñaUsar descodificación blanda de bit viterbi para mejorar la corrección FEC. Funciona mejor si está activada la opción "Descodificación blanda de símbolos"Usar descodificación blanda de símbolos para la detección también asiste en la descodificación de cada bit.Utilice PTT uHRouterUsar técnica de formación de onda en la señal de TxUsado para PSKMail y el conjunto de programas FLDIGIUsado para BPQ32Nombre de usuarioInterfaz de usuarioNombre de usuarioUsando puerto UDP #VSP ActivadoMás explícitoVideoModos de Video IDPreámbulo de Video IDVistaVer/Ocultar CanalesEmulador serie virtual - Suprimir ADVERTENCIASModos visiblesVisita el sitio web de HamCallVisita el sitio web de QRZVisita el sitio web hamQTHControles de la cascadaAmpliado de la cascadaControles superiores de cascadaAlmacenar frecuenciaAmplitud de la cascadaPortadora de la cascadaVel. de caída de la cascadaModo de la cascadaNivel de referencia de la cascadaWXTiempo de espera para la respuesta al primer comando CATTiempo de espera para la respuesta del comando subsiguienteIntervalo de espera (ms) antes de leer la espuestaAdvertenciaCascadaCascada / FFT / OsciloscopioControles de la cascadaVelocidad de caída de la cascadaAltura de la cascadaVideo ID en la cascadaVideo texto en la cascadaWavTasa de muestreo de wavConsulta específica de climaWebBúsqueda con navegador webPeso (en %)El peso disminuye con el incremento de los tiempos de borde de los pulsosAcción de la rueda del ratón en la cascadaCuando no halla señal presenteDonde se almacenan los documentos KML generadosAnchoOcurrirá después de este tiempo (s)Vel/Dir del vientoDelimitadoresAjuste de líneaGraba el conjunto de macros actuales al cerrar el programaRet. escritura (ms)XMITBloqueo en TxControl de flujo Xon/XoffXY - Osc. clásicoSiEstá utilizando la versión más recienteSe requiere de una subscripción pagada para acceder a HamcallSe requiere de una subscripción pagada para acceder a QRZSu nombre de usuarioSu contraseñaaadespuésEnvío automático de datos a internetMostrar información de los indicativoscanales <> 1caract.archivo cty.datCondiciones actuales del climatexto predeterminado para enviar con una entrada de Predeterminado usa fecha/hora activadoUsuario de eQSLUsuario de eQSLActivar la rueda del ratón como control de la barra de macrosflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:Por ejemplo KMDQ para el Huntsville-Madison Executive Airport, de ALConcordar en el número de intercambioIntercambio predefinidoPin del dispositivo PTTejemplo: /home/co7wt/CALLBK o C:/CALLBK Dejar en blanco para buscar la base de datosen:kilómetros / horamilibaresminutosCoeficiente tiempo de rcos: 1.0 ... 2.0 W1HKJ recomienda 1.275 DO2SMF recomienda 1.5reportereportar en grados Celsiusreportar en grados Fahrenheitreportar en pulgadas de mercurioreportar en kilómetros por horareportar en millas por horaReportar en milibaresreportessegundosSelecciona la letra del navegadorSelecc. por fechaEnviar QSO al guardar un contacto (botón de guardar, , )ColorError desconocido con el archivo de audio wavModo de solo cascada{NAME} nombre del otro operadorfldigi-4.1.06/po/pl.po0000664000175000017500000074525213515625024011376 00000000000000# Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.23.14\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2019-03-06 14:56+0100\n" "Last-Translator: Roman BagiÅ„ski \n" "Language-Team: Polish (Roman BagiÅ„ski) \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: iso-8859-1\n" "X-Generator: Poedit 1.8.6\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "%s log rozpoczÄ™to %s" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "ZÅ‚y id modemu" #: src/main.cxx:1710 msgid "Bad frequency" msgstr "Zla czÄ™stotliwosc" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licencja GPLv3: GNU GPL wersja 3 lub nowsza\n" "To jest wolne oprogramowanie: możesz dowolnie modyfikować i rozpowszechniać " "it.\n" "Nie ma ZADNEJ GWARANCJI, w zakresie dozwolonym przez prawo.\n" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 msgid "Could not make directory " msgstr "Nie udaÅ‚o siÄ™ zrobic katalogu" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "Log tekstowy wszystkich RX/TX" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "Ustaw RIG" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "Emisja" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Pokaz mniej emisji" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Pokaz wszystkie emisje" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "Widok" #: src/dialogs/fl_digi.cxx:198 msgid "MFSK Image" msgstr "Obraz MFSK" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "THOR obraz Raw" #: src/dialogs/fl_digi.cxx:200 msgid "IFKP Raw Image" msgstr "IFKP Raw Obraz" #: src/dialogs/fl_digi.cxx:201 msgid "Weather Fax Image RX" msgstr "Obraz odebranego faksu pogody" #: src/dialogs/fl_digi.cxx:202 msgid "Weather Fax Image TX" msgstr "Obraz nadanego faksu pogody" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "Zawody" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "Kraje" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "&UI" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "Wszystko" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "CzÄ™sciowy" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Brak" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "Dokuj oscyloskop" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "Minimalne kontrole" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "Pokaz multi kanaÅ‚y" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "Polacz z serwerem" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "Wybrane..." #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "Zapisac zmienione makro?" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "Anuluj" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Zapisz" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "Nie zapisuj" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "Przełącz do ARQ I/O" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "Nie" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Tak" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "Nie podano nazwy pliku" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "Format nieobsÅ‚ugiwany" #: src/dialogs/fl_digi.cxx:2700 msgid "channels != 1" msgstr "Kanaly != 1" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "nieznany bÅ‚ad pliku wave" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "Spot wyłączony" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Nie można uruchomic przeglÄ…darki internetowej:\n" "%s\n" "\n" "Otwórz ten adres recznie:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Nie mozna otworzyc url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Sprawdzaj aktualizacje..." #: src/dialogs/fl_digi.cxx:2858 msgid "Update site not available" msgstr "Aktualizacja nie jest dostepna" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "Uzywasz najnowszej wersji" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "" "Prawdopodobnie używasz wersji alfa %s\n" "\n" "WysÅ‚ana wersja: %s" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, c-format msgid "Version %s is available at Source Forge" msgstr "Wersja% s jest dostÄ™pna w Source Forge" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "Tworzenie Sunspota w toku!" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "UrzÄ…dzenie Audio jest dostepne tylko jako dodatkowa usluga PortAudio" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "Przechwyc urzÄ…dzenie" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "UrzÄ…dzenie odtwarzajace" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Urzadzenia do przechwytywania i odtwarzania" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Nie istnieje, utworzyć ?" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "Wyczyscic pola dziennika?" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Zastosuj" #: src/dialogs/fl_digi.cxx:4525 msgid "Save changed configuration?" msgstr "Zapisac zmiany konfiguracji?" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 msgid "Save log entry?" msgstr "Zapisz wpis w dzienniku?" #: src/dialogs/fl_digi.cxx:4557 msgid "Confirm Quit" msgstr "Zamknij" #: src/dialogs/fl_digi.cxx:4579 msgid "Confirm quit?" msgstr "Zamknac?" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "Plik" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Foldery" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Konfiguracja Fldigi..." #: src/dialogs/fl_digi.cxx:5865 msgid "FLMSG files..." msgstr "Pliki FLMSG..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "Pliki NBEMS..." #: src/dialogs/fl_digi.cxx:5867 msgid "Data files..." msgstr "Pliki danych." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "Makra" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Otwórz..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Zapisz..." #: src/dialogs/fl_digi.cxx:5875 msgid "Config Scripts" msgstr "Skrypty konfiguracyjne" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "Wykonaj" #: src/dialogs/fl_digi.cxx:5877 msgid "Generate" msgstr "Generuj" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "Przechwytywanie tekstu" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "Przechwyt RX" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "Generuj TX " #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "Odtwórz" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Wyjdz" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "Konfiguruj" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "IU" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "Kolory && Czcionki" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "Dane Operatora" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "Interfejs uzytkownika" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "Wodospad" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "Ustawienia wodospadu" #: src/dialogs/fl_digi.cxx:6146 msgid "Operating" msgstr "Operator" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 msgid "Active Modem" msgstr "Aktywny modem" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "Winkeyer" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "Karta dzwiekowa" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "Różne" #: src/dialogs/fl_digi.cxx:6155 msgid "CPU speed" msgstr "PrÄ™dkosc CPU" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/fl_digi.cxx:6157 msgid "PSKmail" msgstr "PSKmail" #: src/dialogs/fl_digi.cxx:6158 msgid "PSK reporter" msgstr "PSK reporter" #: src/dialogs/fl_digi.cxx:6159 msgid "Sweet spot" msgstr "Ustalone miejsce" #: src/dialogs/fl_digi.cxx:6160 msgid "Text IO" msgstr "Tekst IO" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "DTMF" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "WX" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "KML" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Inne" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "Autostart" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "Nadaj ID" #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 msgid "IO" msgstr "IO" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Powiadomienia" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 msgid "PSM" msgstr "PSM" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 msgid "Test Signals" msgstr "Sygnal testowy" #: src/dialogs/fl_digi.cxx:6175 msgid "Contest/Logging" msgstr "Zawody/Log" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "Dziennik N3FJP" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "MacLogger" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Zapisz konfiguracje" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Pokaz/ukryj kanaly" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "PrzeglÄ…darka sygnałów" #: src/dialogs/fl_digi.cxx:6190 msgid "View/Hide 48 macros" msgstr "Pokaz/ukryj 48 makr" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "DX Klaster" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "Oscyloskop" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "Zakres spektrum" #: src/dialogs/fl_digi.cxx:6205 msgid "Rig/Log Controls" msgstr "Kontrola Rig/Log" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "Dziennik" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "Widok" #: src/dialogs/fl_digi.cxx:6221 msgid "Files" msgstr "Pliki" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Otwórz..." #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Nowy" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "Scal..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "Eksportuj..." #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "LoTW" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "Raporty" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "Tekst..." #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6242 msgid "Field Day Logging" msgstr "Dziennik Field Day" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "Pomoc" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "Utwórz sunspota" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "Przewodnik dla poczÄ…tkujÄ…cych" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "Dokumentacja online..." #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Fldigi na stronie web..." #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "Raporty z recepcji ..." #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Opcje wiersza poleceÅ„" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "Informacje o urz. audio" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "Informacje o wersji" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "Rejestr zdarzen" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Sprawdz dostÄ™pnosc aktualizacji" #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "O progr." #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "Wodospad- tylko emisje" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "NIE USTAWIONO ZNAKU STACJI" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Zamknij liste" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Otwórz liste" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "Zeruj liste" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "raport" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "raporty" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "Ostatnia aktywnosc lokatora" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "Przegladarka sygnalow" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "Oscyloskop" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Wykryty poziom sygnalu" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Poziom blokady szumu" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Kliknij lpm: zmiana trybu\n" "Kliknij ppm: konfiguruj" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "CW nadawane WPM" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "Domyslny WPM" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "Poziom tÅ‚umienia Tx (dB)" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "Automatyczna regulacja czÄ™stotliwosci" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "Blokada szumu" #: src/dialogs/fl_digi.cxx:8226 msgid "Power Signal Monitor" msgstr "Monitor mocy sygnalu " #: src/dialogs/fl_digi.cxx:9943 msgid "Delete entry?" msgstr "Kasowac pozycje? " #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Wszystko" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "Szukaj:" #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Zamknij" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "Czysc" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Kliknij lpm by wyczyscic tekst\n" "Kliknij ppm, aby zresetowac czÄ™stotliwosci" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "Ustaw poziom blokady szumu" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "Eksport do pliku CSV" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "Eksport do pliku tekstowego" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "Eksport do pliku ADIF" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "Przeglad LoTW" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "Zapisac zmieniony Logbook?" #: src/logbook/logsupport.cxx:381 msgid "Create new logbook file" msgstr "Utworz nowy plik dziennika" #: src/logbook/logsupport.cxx:404 #, c-format msgid "%s exists, overwrite?" msgstr "%s: istnieje, zastapic ?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Otwórz plik dziennika" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Zapisz plik dziennika" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "Trwa łączenie baz danych" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "Scal plik ADIF" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "Brak zapisów na lotw do pobrania" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "Niedopasowane rekordy LoTW" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" "Nie można znaleźć pliku raportu LoTW. .\n" "\n" "Pobierz ze strony LoTW ARRL po zalogowaniu siÄ™ na: \n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Zapisz plik raportu w folderze fldigi LOTW. \n" "\n" "nazywanie pliku \"lotwreport.adi\"" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "Aktualizuj" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Czy na pewno usunac rekord \"%s\"?" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "Utwórz raport Cabrillo " #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "Pobierz plik z LoTW" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Wykryj wystÄ™powanie[WRAP:beg] i [WRAP:end]\n" "Zapisz tagi i wszystko zalaczonego tekstu do daty czasu stemplowania pliku, " "ie:\n" " NBEMS.pliki\\WRAP\\odebr\\wypakuj-20090127-092515.wrap" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Wykryj wystÄ™powanie [WRAP:beg] i [WRAP:end]\n" "Zapisz tagi i wszystko załączonego tekstu do daty czasu stemplowania pliku, " "ie:\n" " ~/.nbems/WRAP/odebr/wypakuj-20090127-092515.wrap" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "Nie mozna uruchomic flmsg" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "Szukaj flmsg exe" #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "Szukaj plik exe" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:497 msgid "Locate binary" msgstr "Szukaj plik binarny" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "*" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Zapisz odebrany tekst, do nastÄ™pujÄ…cego pliku:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "Tryb Rig" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Zawsze LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Zawsze USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Resetuj wszystkie opcje do ich wartosci domyslnych?\n" "\n" "Zresetowane opcje zostanÄ… uwzglÄ™dnione przy nastÄ™pnym uruchomieniu\n" "Pliki: fldigi_def.xml i fldigi.prefs zostana usuniÄ™te\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Wykonaj RESET" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "Cichy" #: src/misc/debug.cxx:89 msgid "Error" msgstr "Blad" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "Uwaga" #: src/misc/debug.cxx:89 msgid "Info" msgstr "Info" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "RozwlekÅ‚y" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "Kontrola ARQ" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "Flrig I/O" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "Wtyczka" #: src/misc/debug.cxx:105 msgid "KISS control" msgstr "Ustaw KISS" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "MacLogger" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "Log podstawowy" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "Zmiana poziomu Logu" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tmoja czestotliwosc" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\temisja" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tmoja stacja" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tmój lokator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tmoje imie" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tmoje QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tmoje RST" #: src/misc/macroedit.cxx:78 msgid "\tmy FD class" msgstr "\tmoja Klasa FD" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "\tmoja sekcja FD" #: src/misc/macroedit.cxx:80 msgid "\tmy state" msgstr "\tmój stan" #: src/misc/macroedit.cxx:81 msgid "\tmy ST" msgstr "\tmoje ST" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "\tmoje hrabstwo" #: src/misc/macroedit.cxx:83 msgid "\tmy CNTY" msgstr "\tmoje CNTY" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "\tmoja antena" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "\tpasmo pracy" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "\twersja Fldigi" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "\temisja cyfrowa (adif)" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "\tinna stacja" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "\tinne imie" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "\tinne QTH" #: src/misc/macroedit.cxx:93 msgid "\tother State" msgstr "\\inne paÅ„stwo" #: src/misc/macroedit.cxx:94 msgid "\tother Province" msgstr "\tinna prowincja" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "\tinny lokator" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "\tinny RST" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "\tS/N itp." #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "\tIMD itp." #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "\t# QSO odebr" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "\tnastÄ™pne QSO odb #" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "\tmapa google" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "\tmapa wedÅ‚ug wartosci" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "\tresetuj panel RX" #: src/misc/macroedit.cxx:112 msgid "\tclear TX pane" msgstr "\tresetuj panel TX" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "\ttekst do IMIE/QTH" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk Wl, Wyl, Przelacz" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "\tczysc pola logu" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "\tzapisz dane QSO" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "\tzapiszQSO danych, dołącz msg do notatek" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "\tloguj czas nadawania" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "\ttzapiszQSO danych, dołącz msg do notatek" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "\tlog eQSL" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "\tlog opcionalny eQSL.cc" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "\tczas QSO (HHMM)" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "\tLDT domyÅ›lnie '%Y-%m-%d %H:%M%z'" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\tLokalna data-godzina domyÅ›lnie'%x %H:%M %Z'" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "\tZDT domyÅ›lnie '%Y-%m-%d %H:%MZ'" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "\tUTC data czas domyÅ›lnie'%x %H:%MZ'" #: src/misc/macroedit.cxx:137 msgid "\tlocal time, default %H%M" msgstr "\tczas lokalny %H%M" #: src/misc/macroedit.cxx:138 msgid "\tzulu time default %H%MZ" msgstr "\tczas zulu %H%MZ" #: src/misc/macroedit.cxx:139 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tlokalna data '%Y-%M-%D'" #: src/misc/macroedit.cxx:140 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tData zulu '%Y-%M-%D Z'" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "\tuzyskaj dane o pogodzie" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "\tuzyskaj dane pogodowe dla stacji" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "\tlicznik zawodów" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "\tLicznik dekrementacji" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "\tzwiÄ™kszamy licznik" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "\tnr. kontrolny Rx" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "\tnr. kontrolny Tx" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "\trozpocznij wymiane" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "\tkoniec wymiany" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "\tzapisz zawody" #: src/misc/macroedit.cxx:153 msgid "\tcurrent contest serno" msgstr "\taktualne zawody serno" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "\\ostatnie wysÅ‚ane serno" #: src/misc/macroedit.cxx:155 msgid "\tFD class" msgstr "\tklasa FD" #: src/misc/macroedit.cxx:156 msgid "\tFD section" msgstr "\tsekcja FD" #: src/misc/macroedit.cxx:157 msgid "\tcontest class" msgstr "\tklasa zawodów" #: src/misc/macroedit.cxx:158 msgid "
\tARRL section" msgstr "
\tARRL sekcja" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "\todbiór" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "\tnadawanie" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "\tprzelacz Tx/Rx" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "\twyszukiwanie w GÓRE sygnalu" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "\twyszukiwanie w DÓL sygnalu" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "\tpowrót do preferowanego polozenia" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "\tprzenies do czest NNNN Hz" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "\tLewym klikiem przycisk QSY" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "\tPrawo klikiem przycisk QSY" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "\tqsy do kHz, Hz" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "\tincr/decr xcvr freq" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "\tobowiazuje tryb xcvr" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "\twazna szerokosc filtru xcvr" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr low cutoff filter" msgstr "\twazne xcvr niskie odciecie filtru" #: src/misc/macroedit.cxx:175 msgid "\tvalid xcvr hi cutoff filter" msgstr "\twazne xcvr odciecia filtru" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "\trig czestotl ma nastawe kbd" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "\twstaw do tekstu Rx QRG" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "\twstaw plik tekstowy" #: src/misc/macroedit.cxx:183 msgid "\tinsert image file" msgstr "\twstaw plik obrazu " #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "\twyslij avatar" #: src/misc/macroedit.cxx:187 msgid "\tpause transmit" msgstr "\twstrzymaj nadawanie" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "\tbezczynny sygnaÅ‚ dla NN.nn sek" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "\tcyklicznie co NN sek" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tSygnaÅ‚ strojenia dla NN sek" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "\topoznij nadawanie NN sek" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tpowtarzaj makro stale" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "\trealizacja harmonogramu" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "\t ustawi tÅ‚umik xmt" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "\tidentyfikator CW" #: src/misc/macroedit.cxx:200 msgid "\tsend mode ID; TX start only" msgstr "\tNadaj ID trybu z rozpoczÄ™ciem TX" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "\ttekst na poczÄ…tku TX" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RSID wl, wyl, przelacz" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID wl, wyl, przelacz" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tWyÅ›lij |NN| kolejne pakiety RsID" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "\t[Czekaj][Len](ms)" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "\talarm za pomocÄ… zewnetrznego pliku wav" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "\tCW QSK post-czas" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK pre-czas" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "\tCzas narastania CW" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "\tCW WPM:Farnsworth" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "\twyÅ›lij CAT cmd" #: src/misc/macroedit.cxx:220 msgid "\tsend CAT cmd" msgstr "\twyÅ›lij CAT cmd" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "\tAFC wl,wyl,przelacz" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "\tLOCK wl, wyl, przelacz" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "\tRev wÅ‚, wyÅ‚, przeÅ‚acz" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "\tzmien plik definicji makro" #: src/misc/macroedit.cxx:229 msgid "\tsave current macro file" msgstr "\tZapisz plik makro" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "\tignoruj caÅ‚y tekst komentarza" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "\tmodem/ test znaków na sek" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "\ttest modemu, 'n' losowe 5 grup znaków" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "\ttest czasowy modemu plik spec" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "\ttest czasowy modemu, ciag 's'" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "\tPik WAV; wewnÄ™trzny wiersz" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "\tPlik WAV; 'n' losowe 5 grup wiersz" #: src/misc/macroedit.cxx:243 msgid "\tWAV file; spec' file" msgstr "\tWAV plik; pliku spec '" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "\tPlik WAV; wiersz 's'" #: src/misc/macroedit.cxx:247 msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAnaliza CSV wl,wyl,przelacz" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "\tkliknij biezacy tryb w stos" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "\tpop biezacy tryb / freq ze stosu" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "Wstaw plik tekstowy" #: src/misc/macroedit.cxx:384 msgid "Test text file" msgstr "Test pliku tekstowego" #: src/misc/macroedit.cxx:394 msgid "MFSK image file" msgstr "Plik obrazu MFSK" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "Zmien plik makro " #: src/misc/macroedit.cxx:414 msgid "Select wav file" msgstr "Wybierz plik wav" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "Wstaw plik exe" #: src/misc/macroedit.cxx:457 msgid "Macro Text" msgstr "Tekst makro" #: src/misc/macroedit.cxx:462 msgid "Select Tag" msgstr "Wybierz Tag" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "Etykieta przycisku makro" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "Zastosuj" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "Edytor makro - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Otwórz plik makro" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Plik definicji makro Fldigi\t*.mdf" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "Zapisz plik makro" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Koniec" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Nastepny" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Koniec" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "Kreator poprowadzi CiÄ™ przez podstawowe ustawienia Fldigi" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Nie pomijaj zadnych stron lub zamknij kreatora w dowolnym momencie" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Ustawienia pokazane tutaj mozna pozniej zmienic za pomoca menu Konfiguracja" #: src/misc/newinstall.cxx:540 msgid "Fldigi configuration wizard" msgstr "kreator konfiguracji Fldigi" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "Wymagany czas:" #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "Zaladuj plik obrazu " #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Nadaj obraz" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "ZaÅ‚aduj lub upusc plik obrazu\n" "pliki (PNG, JPEG, BMP)" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "Szybkosc transferu, X1 -normalna" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "Laduj" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "Wodospad / FFT / Oscyloskop" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Górny poziom sygnalu (dB)" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "Zakres sygnalu (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Zmiana skali wodospadu" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "Wyswietl narastanie nizszych czÄ™stotliwosci" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "Centruj wyswietlacz na sygnale" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "Wyswietl narastanie wyzszych czÄ™stotliwosci" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "Predkosc spadku wodospadu" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "Ustaw kursor czÄ™stotliwosci" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centruj w pasmie przenoszenia\n" "Kliknij ppm, aby cofnac" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Tryb magazynu i czÄ™stotliwosci\n" "Kliknij ppm na liscie" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Blokuj czÄ™stotliwosc nadawania" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "Odwróc" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Nadawanie/Odbiór" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "Zakres AFC lub BW" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "Szukaj sygnalu" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "Modem" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "Przewin" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Otwórz plik rig xml" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fldigi plik definicji rig xml \t*.xml" #: src/soundcard/sound.cxx:170 msgid "Waveform Audio Format\t*.wav\n" msgstr "Waveform Audio Format\t*.wav\n" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "AU\t*.{au,snd}\n" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Darmowy bezstratny Audio Kodek\t*.flac" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "Plik audio" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "Powtarzac odtwarzanie?" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "Mój znak STACJI" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "Stacje sÅ‚yszalem dwukrotnie" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "Wyszukiwanie niestandardowe" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "Odbiór RSID" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "Przelacz" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "Kasuj" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Wybierz" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "Kontynent" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "Strefa ITU" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "Strefa CQ" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "Odznacz" #: src/spot/notify.cxx:519 msgid "Add" msgstr "Dodaj" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Wybierz wszystko" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "Czysc wszystko" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "Kraj" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "Pole wyrazenia regularnego nie moze byc puste." #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "Wyrazenie regularne musi byc wazne" #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "ProszÄ™ ustawić swój znak w pierwszej kolejnosci." #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Uruchom program" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" "CiÄ…g testu domyslnie jest:\n" " \"" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "Wpisz ciÄ…g testu lub zostaw puste - domyslne:" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "Te zdarzenie jest wyrazeniem regularnym nieprawidlowym." #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "Test nie pasuje do tego wydarzenia wzorca wyszukiwania." #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "Dostepne podrzedne" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "CzÄ™stotliwosc" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "Znak stacji" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Otwórz paletÄ™" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "Paleta Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "Paleta:" #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "Zapisz paletÄ™" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "Poszukaj stacji" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "Call" #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "Imie" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "Stan" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 msgid "County" msgstr "Hrabstwo" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "Prowincja" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "Lokator" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:159 msgid "RST(s)" msgstr "RST(s)" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "Nr. kontrolny odbr." #: src/widgets/FTextRXTX.cxx:161 msgid "Rx Serial #" msgstr "Rx Numer #" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "Klasa" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 msgid "Section" msgstr "Sekcja" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "SS ser #" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "SS prec" #: src/widgets/FTextRXTX.cxx:167 msgid "SS check" msgstr "SS Sprawdz" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 msgid "SS section" msgstr "SS Sekcja" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "CQ STAN" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "1010 Nr" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "Wiek dziecka" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "MOC" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp state" msgstr "Stan QSO" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 #, fuzzy msgid "QSOp name" msgstr "ImiÄ™ operatora" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "QSOp Kategoria" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Wstaw znacznik" #: src/widgets/FTextRXTX.cxx:198 msgid "All entries" msgstr "Wszystkie poz" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "Przewijaj podpowiedzi" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr " w" #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "Ostatnie QSO" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Nadawanie" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "Odbiór" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "Przerwij" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Nadaj obraz..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "Znaki specjalne" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 msgid "A" msgstr "A" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 msgid "E" msgstr "E" #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 msgid "I" msgstr "I" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 msgid "N" msgstr "N" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 msgid "O" msgstr "O" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 msgid "U" msgstr "U" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "Y" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Wstaw tekst" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Zapisz tekst jako" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Kopiuj" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Zapisz jako..." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "Zawijanie wierszy" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Wytnij" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Wklej" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Wstaw plik..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Cofnij" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "Kasuj" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "NieprawidÅ‚owy Modem do KISS IO" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "Nazwa pliku skryptu (Å›cieżka) zerowy wskaźnik" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "Nazwa pliku skryptu (Å›cieżka) jest nieprawidÅ‚owa" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "Blad alokacji klasy skryptu podczas analizy (%s)" #: src/config_script/run_scripts.cxx:2787 #, c-format msgid "Executing script file: %s" msgstr "Wykonaj skrypt pliku: %s" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "Problemy zgÅ‚oszone podczas przetwarzania pliku skryptu: %s" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" "Plik skryptu zawiera potencjalne problemy\n" "Szczególowe informacje można znalezc w dokumentacji i / lub pliku dziennika." #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "Niektóre zmiany dokonane przez skrypt wymagajÄ… programu\n" "uruchom ponownie zanim stanÄ… siÄ™ aktywne." #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "Pliki skryptow" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "*.txt" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "BrakujÄ…ce polecenie %s po linii %d" #: src/config_script/script_parsing.cxx:394 msgid "Command Not Found" msgstr "Nie znaleziono polecenia" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "Nie znaleziono pliku skryptu / znacznika" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "NieprawidÅ‚owy parametr" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "Nieprawidlowy parametr funkcji (wewnetrzny bÅ‚ad inny niz skrypt)" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "Brakujace oferty sparowane (\")" #: src/config_script/script_parsing.cxx:414 msgid "General Error" msgstr "Blad Ogólny" #: src/config_script/script_parsing.cxx:418 msgid "No Errors" msgstr "Brak blÄ™dów" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "Znaków nie znaleziono" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "Koniec linii" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "Pliku nie znaleziono" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "Nie znaleziono sciezki katalogu" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "Nieoczekiwany koniec parametru (args[]) lista znalezionych" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "Nieoczekiwany koniec listy wyboru parametrow znalezionych" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "Liczba znaków w args[] parametr przekracza oczekiwania" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "Błąd alokacji pamiÄ™ci (wewnÄ™trzny błąd inny niż skrypt)" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "Podany parametr nie jest oczekiwanego typu." #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "Parametr nie prawidÅ‚owy." #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "Brakuje polecenia ':'." #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "Maksymalny stan dolnego indeksu" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "Wykonanie nie powiodÅ‚o siÄ™ (wewnÄ™trzne)." #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "Nie znaleziono skryptu Å›cieżki urzÄ…dzenia ." #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "OsiÄ…gniÄ™to nieoczekiwany koniec pliku." #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "Błąd odczytu pliku" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "Niezdefiniowany bÅ‚ad" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "Linia: %d Blad:%d %s (%s)" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "Blad alokacji bufora w pliku %s Wiersz %d" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "WywoÅ‚anie zwrotne dla polecenia skryptu %s zgÅ‚osiÅ‚o błąd" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "Polecenie %s ignorowane, notacja dot nie jest obsÅ‚ugiwana" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "Polecenie %s ignorowane, polecenie strukturalne nie jest obsÅ‚ugiwane" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "Nieprawidlowy parametr funkcji 'char *file_name_path' (null)" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "Nie można otworzyć pliku %s" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "1" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "0" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "błąd alokacji cmd_buffer w pobliżu linii %d" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "Nad zapisem funkcji wywoÅ‚ania zwrotnego dla \"%s\"" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "NieprawidÅ‚owy indeks nazwy pliku (NULL) w funkcji %s:%d" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "Nie można utworzyć pliku %s (błąd No=%d) func %s:%d" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" "%s\n" "# Fldigi Wygenerowany Konfig skrypt\n" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "# Utworzono: %s\n" #: src/dialogs/confdialog.cxx:330 msgid "no" msgstr "nie" #: src/dialogs/confdialog.cxx:330 msgid "yes" msgstr "tak" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Pokaz" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "Ukryj" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "Konfiguracja" #: src/dialogs/confdialog.cxx:8227 msgid "Station / Operator" msgstr "Stacja / operator" #: src/dialogs/confdialog.cxx:8230 msgid "Station Callsign:" msgstr "Znak stacji" #: src/dialogs/confdialog.cxx:8231 msgid "Station callsign" msgstr "Znak stacji" #: src/dialogs/confdialog.cxx:8244 msgid "Operator Callsign:" msgstr "Operator stacji:" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "Znak operatora (jeÅ›li jest inny niz znak wywolawczy stacji)" #: src/dialogs/confdialog.cxx:8259 msgid "Operator Name:" msgstr "ImiÄ™ operatora:" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Imiona operatorów" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "Antena:" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "Krótki opis anteny" #: src/dialogs/confdialog.cxx:8287 msgid "Station QTH:" msgstr "QTH Stacji" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "QTH operatorów" #: src/dialogs/confdialog.cxx:8301 msgid "Station Locator:" msgstr "Lokator Stacji:" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "Lokator na przykÅ‚ad JO93xq" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "Skrót dla paÅ„stwa" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "Skrót dla powiatu" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "PrzeglÄ…darka" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "KanaÅ‚y, pierwszy kanal w dolnej granicy wodospadu" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "Zmiana # podglÄ…du kanalów PSK" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "Limit czasu nieaktywnosci" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Skasuj tekst kanalu po\n" "# sekund bezczynnosci" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Etykieta kanalu" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Wyglad etykiety na kazdym kanale" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "Czestotliwosc audio" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "Czestotliwosc RF" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "Numer kanalu" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "Czcionka" #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "Wybierz czcionke przegladarki" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "W odstÄ™pach czasu" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "Odstep kanalów do 100 Hz " #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "CiÄ…gle przewijanie" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "Wl - Styl marquee\n" "Wyl - Wyczysc & restart" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "Najnizsza czÄ™stotliwosc na dole przeglÄ…darki" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "Zmiana pozycji z niskiego do wysokiego kanalu" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "Odtwórz historie, gdy wybrano aktywny kanal " #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "Historia strumienia audio zdekodowanego na wybranym sygnale" #: src/dialogs/confdialog.cxx:8467 msgid "Detection Level" msgstr "Poziom detekcji" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "Tlo" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "Kolor tla podglÄ…du blokady szumów" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "Przycisk" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "Kolor suwaka blokady szumów" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "Kolory linii przeglÄ…darki" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY PrzeglÄ…darka HiLite Kolor 1" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "PSK/RTTY PrzeglÄ…darka HiLite Kolor 2" #: src/dialogs/confdialog.cxx:8497 msgid "Even" msgstr "Parzyste" #: src/dialogs/confdialog.cxx:8498 msgid "Even lines" msgstr "Parzyste linie" #: src/dialogs/confdialog.cxx:8503 msgid "Odd" msgstr "Nie parzyste" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "Nieparzyste linie" #: src/dialogs/confdialog.cxx:8510 msgid "Select line" msgstr "Wybierz linie" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "Ogólne" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Pokaz podpowiedzi" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "Aktywuj / deaktywuj podpowiedzi" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Pokaz ikony menu" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "Aktywuj / deaktywuj ikony w menu" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "UI schemat" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Zmien wyglÄ…d aplikacji" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "Widoczne emisje" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Wybierz tryb dostÄ™pu do menu" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "UI jÄ™zyk" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Zmiany sÄ… uwzglÄ™dniane przy nastÄ™pnym uruchomieniu programu" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Drukuj CW / RTTY / THROB / CONTESTIA malymi literami" #: src/dialogs/confdialog.cxx:8591 msgid "Transmit lower case text" msgstr "Nadaj malymi literami" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "Zamknij podpowiedzi " #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "Monituj o zapisanie konfiguracji" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "Monituj o zapisanie pliku makra" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "Zapisz aktualny zestaw makr przy wyjsciu z programu" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "Monituj o zapisanie dziennika" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "Info o bledach wpisu dziennika" #: src/dialogs/confdialog.cxx:8618 msgid "Confirm exit" msgstr "Zastosuj / zamknij" #: src/dialogs/confdialog.cxx:8625 msgid "Check for updates" msgstr "Aktualizuj" #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "Sprawdz w czasie uruchamiania programu" #: src/dialogs/confdialog.cxx:8638 msgid "Show TX timer" msgstr "Pokaz czas TX" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "TX czas gotowoÅ›ci (min)" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "Dziennik" #: src/dialogs/confdialog.cxx:8658 msgid "QSO" msgstr "QSO" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "Zapis QSO " #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "Monituj o zapis dziennika przy wyjsciu" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "Wyczysc przy zapisie" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "Zeruj wpisy po zapisie lub za pomocÄ… makra " #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "Konwertuj znak stacji na wielkie litery" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "Wymuszaj wielkie litery w polu znak stacji" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Automatycznie wstaw Kraj i Azymut" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "WypeÅ‚nij Kraj / Azymut za pomocÄ… info cty.dat" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "Sortuj wedÅ‚ug Daty/czasu zakonczenia" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "Sortuj wedÅ‚ug daty i czasu zak. - wszystkie raporty ADIF/ Cabrillo" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "Data czas WL/ WYL" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "Ustaw data/czas startu == data/czas zakonczenia" #: src/dialogs/confdialog.cxx:8698 msgid "Default RST in to 599/59" msgstr "Domyslny RST Rx 599/59" #: src/dialogs/confdialog.cxx:8699 msgid "Clear log controls sets RST in to 599/59" msgstr "Wyczysc log i ustaw RST na 599/59" #: src/dialogs/confdialog.cxx:8704 msgid "Default RST out to 599/59" msgstr "Domyslny RST Tx 599/59" #: src/dialogs/confdialog.cxx:8705 msgid "Clear log controls sets RST out to 599/59" msgstr "Wyczysc log i ustaw RST 599/59" #: src/dialogs/confdialog.cxx:8710 msgid "cty.dat folder" msgstr "Folder cty.dat" #: src/dialogs/confdialog.cxx:8711 msgid "Enter full path-name for cty.dat folder" msgstr "Wpisz peÅ‚nÄ… sciezkÄ™, folderu cty.dat" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "PrzeglÄ…daj" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "Szukaj plik cty.dat" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "Domyslne" #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "Domyslny folder cty.dat" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "Przeladuj" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "Przeladuj cty.dat" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "Moc TX" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "Moc nadajnika wykorzystywana do zapisu w logu" #: src/dialogs/confdialog.cxx:8751 msgid "Display logbook read datum at start" msgstr "WyÅ›wietl dziennik, czytaj go na starcie" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "Nazwy pliku sÄ… zapisywane w obszarze tekstu RX" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 msgid "Rx Text" msgstr "Tekst RX" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "Kliknij, aby uchwycic" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "Aktywuj jedno klikniecie - zaznaczenie tekstu w panelu Rx" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "Znak podpowiedzi w otrzymanym tekscie" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "Informacje Popup po 2 sek po najechaniu na znak" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "SÅ‚owa ograniczniki " #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "RX tekst QSO wprowadzanie danych jest ograniczone przez znaki nie-sÅ‚owa\n" "zdefiniowane tutaj. Tabulator i nowa linia sÄ… automatycznie dolaczane" #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "Jednostka odlegÅ‚osci (QRB) USA " #: src/dialogs/confdialog.cxx:8801 msgid "Clear log fields - new CALL" msgstr "Wyczysc pola dziennika" #: src/dialogs/confdialog.cxx:8812 msgid "Connect to MacLogger" msgstr "Polacz z MacLogger" #: src/dialogs/confdialog.cxx:8817 msgid "Capture Radio Report" msgstr "Przechwyc raport " #: src/dialogs/confdialog.cxx:8823 msgid "Capture Log Report" msgstr "Przechwyc dziennik" #: src/dialogs/confdialog.cxx:8828 msgid "Capture Lookup " msgstr "Wyszukaj" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "Przechwyc dodatkowe spoty" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "Przechwyc raport spota" #: src/dialogs/confdialog.cxx:8843 msgid "Enable UDP log file" msgstr "Wlacz plik dziennika UDP" #: src/dialogs/confdialog.cxx:8848 msgid "UDP data stream" msgstr "Transmisja danych UDP" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "Czysc tekst UDP" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "Transmisja danych TCP/IP" #: src/dialogs/confdialog.cxx:8868 msgid "Clear text" msgstr "Wyczysc tekst" #: src/dialogs/confdialog.cxx:8871 msgid "Address" msgstr "Adres" #: src/dialogs/confdialog.cxx:8872 msgid "N3FJP Server IP Address" msgstr "N3FJP Adres IP: " #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 msgid "Port" msgstr "Port" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "Port serwera N3FJP" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Ustawia adres IP i port\n" "numer na wartosc domyslnÄ…." #: src/dialogs/confdialog.cxx:8905 msgid "Enable Data Stream" msgstr "Aktywuj transmisje danych" #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 msgid "Connect" msgstr "Podlacz" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 msgid "Connected" msgstr "Polaczony" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "Centruj DXspot" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "N3FJP DX spots " #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "ZgÅ‚aszanie faktycznej czÄ™stotliwosci modemu RF" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "PTT przez i " #: src/dialogs/confdialog.cxx:8944 #, fuzzy msgid "Contests" msgstr "Zawody" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "Wybierz zapis jako QSO lub konkurs" #: src/dialogs/confdialog.cxx:8964 msgid "State QSO Party" msgstr "PaÅ„stwo QSO Party" #: src/dialogs/confdialog.cxx:8980 msgid "Text capture order" msgstr "Kolejnosc przechwytywania tekstu" #: src/dialogs/confdialog.cxx:8981 msgid "Context Notes" msgstr "Notatki kontekstowe" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "Sprawdzaj duplikaty" #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "Wl/Wyl" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Szukaj duplikatów" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Pasmo" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "Pasma muszÄ… byc zgodne" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "Emisja" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "Emisje muszÄ… byc zgodne" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "Czas ponad" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "QSO nie mozna powtorzyc w okresie" #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "Kolor duplikatu" #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "Kliknij lewym przyciskiem myszy, aby wybrac kolor duplikatu" #: src/dialogs/confdialog.cxx:9029 msgid "? Dup Color" msgstr "Kolor duplikatu?" #: src/dialogs/confdialog.cxx:9030 msgid "Left click to select possible dup color" msgstr "Kliknij lewym aby wybrac kolor duplikatu" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "darmowy formularz 1 musi byc zgodny" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "Panstwo musi siÄ™ zgadzac" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "minut" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "Wpisz zakres czasu w minutach" #: src/dialogs/confdialog.cxx:9069 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Nr. kontrolny w zawodach" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 msgid "Send" msgstr "Wyslij" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "Swobodna forma wymiany" #: src/dialogs/confdialog.cxx:9087 msgid "RST always 599/59" msgstr "RST 599/59" #: src/dialogs/confdialog.cxx:9088 msgid "Force RST in/out to 599/59" msgstr "Ustaw RST odebr/wysl na 599/59" #: src/dialogs/confdialog.cxx:9093 msgid "Send CW cut #'s" msgstr "Nadaj krotkie CW" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:9101 #, fuzzy msgid "Start Nbr" msgstr "Start" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "Numer startowy" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Cyfry" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "Liczba cyfr w numerze kontrolnym" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "Uzyj zer" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "Wstaw zero w nadawanym numerze kontrolnym" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Resetuj" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "Inicjalizacja pól logowania QSO" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "Dzien sportu" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 msgid "Operator Call" msgstr "Operator stacji" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" "Znak Field Day\n" "Może być taki sam jak znak OP" #: src/dialogs/confdialog.cxx:9170 msgid "My Section" msgstr "Moja sekcja" #: src/dialogs/confdialog.cxx:9171 msgid "Field Day Section" msgstr "Sekcja Field Day" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "Moja klasa" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "Field Day Klasa" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "JOTA/SzkoÅ‚a" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "Runda SzkoÅ‚a Up" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "SzkoÅ‚a Round Up - dopuszczalne I, H, O - zobacz zasady" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "Jamboree OTA" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "My Troop" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "My JOTA Troop" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "Scout Op'" #: src/dialogs/confdialog.cxx:9245 msgid "Scout Operator Name" msgstr "Nazwa operatora Skauta" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "Aktywne kółko myszy na przyciskach makr " #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "wlacz sterowanie kółkiem myszy na pasku makro" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Liczba i pozycja pasków makro" #: src/dialogs/confdialog.cxx:9282 msgid "Button Height" msgstr "Wysokosc przycisku" #: src/dialogs/confdialog.cxx:9283 msgid "Height of macro bar" msgstr "Wysokosc paska makro" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "Powyzej okna Rx/Tx" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Pojedyncze makro panelu logowania poniżej paska\n" "zmienna wysokosc" #: src/dialogs/confdialog.cxx:9299 msgid "One above waterfall" msgstr "Powyzej wodospadu" #: src/dialogs/confdialog.cxx:9304 msgid "One below waterfall" msgstr "Ponizej wodospadu" #: src/dialogs/confdialog.cxx:9309 msgid "Two scheme 1" msgstr "Schemat 1" #: src/dialogs/confdialog.cxx:9314 msgid "Two scheme 2" msgstr "Schemat 2" #: src/dialogs/confdialog.cxx:9319 msgid "Two scheme 3" msgstr "Schemat 3" #: src/dialogs/confdialog.cxx:9324 msgid "Two scheme 4" msgstr "Schemat 4" #: src/dialogs/confdialog.cxx:9329 msgid "Two scheme 5" msgstr "Schemat 5" #: src/dialogs/confdialog.cxx:9334 msgid "Two scheme 6" msgstr "Schemat 6" #: src/dialogs/confdialog.cxx:9339 msgid "Two scheme 7" msgstr "Schemat 7" #: src/dialogs/confdialog.cxx:9344 msgid "Two scheme 8" msgstr "Schemat 8" #: src/dialogs/confdialog.cxx:9349 msgid "Two scheme 9" msgstr "Schemat 9" #: src/dialogs/confdialog.cxx:9354 msgid "Two scheme 10" msgstr "Schemat 10" #: src/dialogs/confdialog.cxx:9363 msgid "Load last used macro file at start" msgstr "ZaÅ‚aduj ostatnio uzywane makro" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "WL - wykorzystaj ostatni zestaw makr\n" "WYL - uzywaj zestawu domyslnego" #: src/dialogs/confdialog.cxx:9369 msgid "Display macro filename at start" msgstr "Pokaz nazwe makra przy starcie" #: src/dialogs/confdialog.cxx:9385 msgid "Show macro control codes" msgstr "Pokaz makro z kodami sterowania" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "print ^! wykonaj kody w panelu Rx" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "Ustaw 4 makra poniżej Tx" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" "Ustaw zestaw makr 4 barów pod panelem Tx\n" "DomyÅ›lnie powyżej panelu Rx" #: src/dialogs/confdialog.cxx:9405 msgid "WF Ctrls" msgstr "Wodospad" #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "Wlacz pole wyboru, by pokazac mozliwe sterowanie" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "Powieksz wodospad" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "Nosnik wodospadu" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "Ustaw przesuniecie" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "Poziom referencji wodospadu" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "Szybkosc spadu wodospadu" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "Amplituda wodospadu" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "Zapis wodospadu" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "Wybór trybu wodospadu" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "Blokuj Tx" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "Aktywuj" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "Deaktywuj" #: src/dialogs/confdialog.cxx:9489 msgid "Clrs/Fnts" msgstr "Kolor/Czcionka" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "Rx/Tx" #: src/dialogs/confdialog.cxx:9494 msgid "Rx/Tx Character set" msgstr "Zestaw znaków Rx/Tx" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "Wybierz zestaw znaków Rx/Tx " #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "TÅ‚o Rx" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "TÅ‚o Tx" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "Czcionka Rx" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "Czcionka Tx" #: src/dialogs/confdialog.cxx:9539 msgid "Macro Edit Font" msgstr "Edytor czcionki makr" #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "Podswietl tekst" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "Wysylane znaki w panelu Rx/Tx" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "Znaki sterowania w panelu Rx/Tx " #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "OPUSC" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "PominiÄ™te znaki w panelu Tx\n" "(Tx wl./wyl. w CW)" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "Alternatywne kolory znaków w panelu Rx " #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "WYB" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "Kolor tla w panelach Tx/ Rx" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "Domyslne" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "Domyslne" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "wyswietl znaki ustawien Rx jako ciag znakow ASCII" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "Czestotl./Miernik" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "Czcionka:" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "Kolor tla" #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "Kolor cyfr" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "Kolor systemowy" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "S-metr" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 msgid "Scale Color" msgstr "Skala kolorów" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 msgid "Meter Color" msgstr "Kolor miernika" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "PWR- pomiar" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "Skala mocy" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "Wybierz filtr wstÄ™pny typu FFT " #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "Panel kontrolny Logu" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "Dziennik" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "Okno dialogowe klastra DX" #: src/dialogs/confdialog.cxx:9709 msgid "Report Browser" msgstr "PrzeglÄ…darka raportow" #: src/dialogs/confdialog.cxx:9721 msgid "Even Lines" msgstr "Linie parzyste" #: src/dialogs/confdialog.cxx:9726 msgid "Odd Lines" msgstr "Linie nieparzyste" #: src/dialogs/confdialog.cxx:9731 msgid "Stream Text" msgstr "StrumieÅ„ tekstu" #: src/dialogs/confdialog.cxx:9737 msgid "Bg color" msgstr "Kolor tla" #: src/dialogs/confdialog.cxx:9743 msgid "Alt Color" msgstr "Alt Kolor" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "Kolor wychodzÄ…cego tekstu telnetu" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "F_klucz" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "Stosuj kolorowe przyciski" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Grupa 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 1" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Grupa 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 2" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Grupa 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 3" #: src/dialogs/confdialog.cxx:9783 msgid "Font/Color" msgstr "Kolor /czcionki" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "Karty" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "Kolor kart" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "Przyciski" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "Odebr" #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "Stroj." #: src/dialogs/confdialog.cxx:9808 msgid "RxID nar" msgstr "RxID waski" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:9820 msgid "RxID wide" msgstr "RxID szeroki" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "Aktywne przyciski podswietlane kolorem" #: src/dialogs/confdialog.cxx:9882 msgid "All Others" msgstr "Wszystkie inne" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "Syg/kol" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "Niski" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "Wysoki" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "Normalny" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "Wyzszy" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "Kolor Poziomu SygnaÅ‚u" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "Touch" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Uwaga:\n" "Pozycje te sÄ… przydatne do konfiguracji, ale nie wyjÄ…tkowe do uzycia fldigi " "na\n" "urzÄ…dzeniach z ekranem dotykowym, takich jak tablet." #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "Wprowadzanie czÄ™stotliwosci strzalka" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Prawo/Lewo = 1 x LSD\n" "Góra/Dól= 10 x LSD\n" "Shift - Prawy/Lewy = 100 x LSD\n" "Shift - Góra/Dól = 1000 x LSD" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Prawo / Lewo\n" "Wybierz najmniejszy cyfrowy raster" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "Rx / Tx Panel" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "Tx powyzej Rx" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "Wlacz aby umiescic panel Tx wyzej panelu Rx" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "Wyswietl" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "Kolor i kursor" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Zmien kolor" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "Laduj..." #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "ZaÅ‚aduj nowÄ… paletÄ™" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Zapisz..." #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "Zapisz paletÄ™" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "Przepustowosc" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "WÅ" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "Pokazuj kursor z liniami szerokosci pasma " #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Kolor" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "RozciÄ…gnij" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "Pokazuj przepustowosc sciezki na wodospadzie" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "Centruj linie" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "Pokaz kursor z linia srodkowa" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "Sciezki sygnałów" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "Notch" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "Skala czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "Pokaz czÄ™stotliwosc audio" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "CzÄ™stotliwosc Audio lub RF na skali wodospadu" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "Wybierz czcionkÄ™ skali wodospadu" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "Sygnal nadawania" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "Monitoruj nadawany sygnal" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "Pokaz sygnaÅ‚ nadawania na wodospadzie" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Poziom sygnalu" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "Ustaw poziom dobrego widoku" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "Proces FFT" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "Dolna granica" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "Dolna granica czÄ™stotliwosci w Hz" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "Usrednij FFT" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "Usrednij, zmniejsz szum wodospadu" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "FFT okno funkcji filtru wstÄ™pnego" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "ProstokÄ…tny" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "TrójkÄ…tny" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "Górna granica" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "Górna granica czÄ™stotliwosci w Hz" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "Opóznienie" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" "SygnaÅ‚ z czasem usredniania\n" "0 - najmniej\n" "4 - najwiecej" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "Pokaz mniej lub wiÄ™cej wodospadu" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "Powolny spadek" #: src/dialogs/confdialog.cxx:10269 msgid "Normal drop speed / value" msgstr "PrÄ™dkosc spadku wodospadu / wartosc" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "Wysokosc wodospadu w pikselach" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "Uzycie CPU wzrasta z wysokoscia wodospadu" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Mysz" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "Kliknij lewym lub prawym by uzyskac historie audio" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "Odtwarzanie sciezki dzwiekowej" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "PrzeciÄ…gnij wodospad na skali czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "Aktywuj przeciagniecie kursora na skale wodospadu" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "Wstaw tekst pojedynczym lewym kliknieciem" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Wstaw specjalny tekst w panelu Rx\n" "po kliknieciu wodospadu" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "Opis zostanie zastÄ…piony\n" "obecnym modem i czÄ™stotliwoscia" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "Akcja kólka myszki" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Wybierz sposób wykorzystania rolki myszki\n" "zachowanie wewnÄ…trz wodospadu" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "Widmo" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "Zakres widma/interakcje wodospadu" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" "Lewe klikniÄ™cie przenosi czÄ™stotliwość na czÄ™stotliwość Å›rodkowÄ… zakresu" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "kliknij lewym przyciskiem na zakres spektrofotometru WF" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "Użyj zakresu wodospadu/wartoÅ›ci granicznych" #: src/dialogs/confdialog.cxx:10374 msgid "values left/below waterfall" msgstr "wartoÅ›ci po lewej / poniżej wodospadu" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "skala freq = N * przepustowość modemu" #: src/dialogs/confdialog.cxx:10389 msgid "use" msgstr "Uzyj" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "wyÅ›wietlanie skali widma połączone z przepustowoÅ›ciÄ… modemu" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "Modem" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "Dekodowanie SOM" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "Organizuj Mapowanie" #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "Sledzenie" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "Automatyczna prÄ™dkosc sciezki Rx" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "Przepustowosc filtru" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "Przepustowosc filtru dsp przy CW" #: src/dialogs/confdialog.cxx:10451 msgid "Matched Filt'" msgstr "Dopasowane Filtry" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "Dopasuj filtr pasma" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "Szybkosc CW w WPM" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "Nizszy" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "Niski próg detektora" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "Wyzszy" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "Wysoki próg detektora" #: src/dialogs/confdialog.cxx:10511 msgid "Range" msgstr "Zakres" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "Zakres +/- wpm" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "Atak" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "Zanik" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "Moje nadawanie CW WPM" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "Domyslna szybkosc CW" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "Nie wolniej niz" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "Nie szybciej niz " #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "Zastosuj termin Farnsworth" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "Czas trwania i QSK" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "Koordynacja" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "Waga (%)" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "Stosunek kropki do kropki" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "Kreska /kropka" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "Stosunek kreski do kropki" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "Czas krawÄ™dzi" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "PoczÄ…tkowe i koncowe czasy narastania krawÄ™dzi (msek)" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "KsztaÅ‚t krawÄ™dzi" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" "Hanning/Blackman - Uzyj krawedzi czasu\n" "BPF - uzyj przepustowoÅ›ci" #: src/dialogs/confdialog.cxx:10729 msgid "Edge decrease" msgstr "Zmniejsz szerokość krawedzi" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "Waga maleje wraz wzrostem czasu krawÄ™dzi" #: src/dialogs/confdialog.cxx:10735 msgid "BPF transmit audio" msgstr "BPF transmisja audio" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "Włącz LO/HI bfp z transmisja dzwieku" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "BPF bw" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "Niski filtr odciecia" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "QSK na prawym kanale audio" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "Wygeneruj sygnaÅ‚ prostokÄ…tny na prawym kanale" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "Pre-keydown czas (ms)" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "Msek pre-keydown ( jest wczesniej w czasie)" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "Post-keydown czas (ms)" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "Msek po keydown ( + wczesniej w czasie)" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "WysyÅ‚aj stale" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "Nadaj strumien znaków testowych" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "Testowe znaki" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "Znaki testowe do regulacji QSK" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "Uzyj '(' paren nie KN" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" "Uzyj ich dla WinKeyera\n" "i nanoCW" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "\" RR" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr ".-..-." #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "$ SX" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "...-..-" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "' WG" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr ".----." #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "( KN" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "-.--." #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr ") KK" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "-.--.-" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "+ AR" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr ".-.-." #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "< AR" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "> SK" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "...-.-" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "= BT" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "-...-" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "- DU" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "-....-" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "@@ AC" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr ".--.-." #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 msgid "Ser. Port" msgstr "Port serw." #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 msgid "Xcvr serial port" msgstr "Xcvr Port szeregowy" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 msgid "Connect / Disconnect from WinKeyer" msgstr "Polacz / rozÅ‚acz z WinKeyer" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 msgid "ModeReg" msgstr "Tryb Reg" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "Zamiana" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "Zamien lewe / prawe kontakty klawisza" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "PrzestrzeÅ„ automatyczna" #: src/dialogs/confdialog.cxx:11073 msgid "Enable paddle auto spacing of characters" msgstr "Aktywuj automatyczne odstepy miedzy znakami" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "PrzestrzeÅ„ CT" #: src/dialogs/confdialog.cxx:11078 msgid "Enable contest character spacing" msgstr "Wlacz odstepy miÄ™dzy znakami" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "Paletki Dog" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "Wytnij 0/9" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "Uzyj T/N dla 0/9" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "Echo paddle" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "Echo wiosÅ‚a znaków do panelu RX" #: src/dialogs/confdialog.cxx:11101 msgid "Serial echo" msgstr "Port szeregowy echo" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "Wlacz kluczowanie tonem Winkeyera" #: src/dialogs/confdialog.cxx:11111 msgid "Tone ON" msgstr "Wlacz Ton" #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "Wlacz dźwiÄ™k Winkeyera" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "PTT ON" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "Wlacz wyjscie PTT Winkeyera" #: src/dialogs/confdialog.cxx:11123 msgid "WPM Settings" msgstr "Ustaw WPM" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 msgid "Min WPM" msgstr "Min WPM" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" "Minimalne ustawienie WPM\n" "domyslnie = 10" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 msgid "Rng WPM" msgstr "Zakres WPM" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" "Ustawienie zakresu WPM \n" "domyslnie = 25" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" "Kluczowanie Farnsworth (0 = nic)\n" "domyÅ›lnie = 0" #: src/dialogs/confdialog.cxx:11145 msgid "Cmd WPM" msgstr "Cmd WPM" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" "Szybkość WPM dla ciÄ…gów poleceÅ„ Winkeyer\n" "DomyÅ›lnie = 18" #: src/dialogs/confdialog.cxx:11152 msgid "Timing/Settings" msgstr "Ustaw czas" #: src/dialogs/confdialog.cxx:11155 msgid "Ratio" msgstr "Wspolczynnik" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" "Wspolczynnik kluczowania\n" "domyslnie = 3.0" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" "Kompensacja w milisekundach\n" "domyÅ›lna = 0" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" "Dodatkowy czas trwania do pierwszego dit / dot w milisekundach\n" "domyÅ›lna = 0" #: src/dialogs/confdialog.cxx:11170 msgid "Sample" msgstr "Probka" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" "Próbkowanie Å‚opatkowe (patrz instrukcja Winkeyer)\n" "domyÅ›lnie =50" #: src/dialogs/confdialog.cxx:11175 msgid "Weight" msgstr "Waga" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" "Waga kluczowania\n" "domyslnie = 50" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "wprowadz" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" "Leadin w ms\n" "domyÅ›lnie = 0" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "Ogon" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" "Rozszerz ostatniÄ… dit/dot w ms\n" "domyÅ›lnie = 0" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "Tryb klucza" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "Czekaj" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "SygnaÅ‚ bocznego" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "Dane wyjÅ›ciowe" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "Czekaj" #: src/dialogs/confdialog.cxx:11254 msgid "Bk" msgstr "Bk" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "ZajÄ™ty" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "Klucz" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "Użyj Pot" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "Winkeyer kontrola WPM" #: src/dialogs/confdialog.cxx:11280 msgid "WPM setting" msgstr "Ustaw WPM" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" "Zaznacz aby włączyć kodowanie / dekodowanie znaków\n" "Wybierz jeden znak z każdej grupy" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 msgid "nanoIO serial port" msgstr "nanoIO Port szeregowy" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 msgid "Connect / Disconnect from nanoIO" msgstr "Polacz / rozÅ‚acz z nanoIO" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "Zapisz stan nanoIO do Arduino EEPROM" #: src/dialogs/confdialog.cxx:11419 msgid "Status" msgstr "Status" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "Zapytanie o stan nanoIO" #: src/dialogs/confdialog.cxx:11423 #, fuzzy msgid "Paddle" msgstr "Paletki Dog" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "CW WPM za pomocÄ… Å‚opatki KEYER" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "USB serial I/O" #: src/dialogs/confdialog.cxx:11447 #, fuzzy msgid "Comp'" msgstr "Comp' WPM" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "CiÄ…gi klawiszy CW wpm" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "Keyer" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 #, fuzzy msgid "PTT off" msgstr "TX offset" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "Wylacz PTT" #: src/dialogs/confdialog.cxx:11515 #, fuzzy msgid "Use WPM pot'" msgstr "Użyj Pot" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 #, fuzzy msgid "" "Range WPM setting\n" "default = 20" msgstr "" "Ustawienie zakresu WPM \n" "domyslnie = 25" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "Tlumienie" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "Drugi tekst" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "Tekst do wyslania, podczas bezczynnosci klawiatury" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "Filtracja" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "Uzyj filtru DSP przed dekoderem" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "Wspólczynnik przepustowosci filtru" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "Filtr przepustowosci wzgledem szerokosci sygnaÅ‚u" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "Aktywuj MultiPSK zgodny z FEC" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "Próg CWI " #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "Wykrywanie i tÅ‚umienie CWI" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "Sciezki (ukryte)" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "Panel" #: src/dialogs/confdialog.cxx:11647 msgid "Hell Transmit Parameters" msgstr "Parametry TX Hell" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "Czcionka Tx" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "Wybierz czcionkÄ™ rastra TX " #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "Ksztalt impulsu" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "Podniesiony cosinus ksztaltu impulsu " #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "Wolne (4 ms) | Sred (2 ms) | Szybkie (1 ms) | Trudne kluczowanie" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "Nadawanie kropek (.) w czasie bezczynnosci" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Nadaje Diddle kropkÄ™ gdy nie aktywny klawisz" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "Mnoznik szerokoÅ›ci Tx" #: src/dialogs/confdialog.cxx:11692 msgid "Range 1...3" msgstr "Zakres 1 ... 3" #: src/dialogs/confdialog.cxx:11706 msgid "Hell Receive Parameters" msgstr "Parametry Rx Hell" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "Negatyw Video" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "Wyswietl RX w odwrotnym wideo" #: src/dialogs/confdialog.cxx:11715 msgid "Marquee text" msgstr "Zaznaczony tekst" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "Wyswietl RX jako przewijana markize" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "Rx Mnożnik szerokoÅ›ci" #: src/dialogs/confdialog.cxx:11722 msgid "Range 1...4" msgstr "Zakres 1 ... 4" #: src/dialogs/confdialog.cxx:11734 msgid "Rx Height in pixels" msgstr "Wysokosc Rx w pikselach" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "Moze wymagac zmiany rozmiaru panelu Rx/Tx" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "Szerokosc filtru pasma odbioru " #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "Regulacja pasma DSP " #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "Rx AGC" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - Wolny, 2 - Åšredni, 3 - Szybki" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "Parametry Rx" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "Min. Liczba trafieÅ„" #: src/dialogs/confdialog.cxx:11791 msgid "Minimum # hits in tone detector" msgstr "Minimum # sygnalu detektora" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "Obraz LPF" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "WÄ…skie LPF, gdy obraz zaklocony" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "Filtr wyjÅ›ciowy FFT" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "Stacje sÅ‚yszane" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "Usuwanie rozmowy po..." #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "Parametry TX" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 msgid "Center freq" msgstr "Centruj czestot." #: src/dialogs/confdialog.cxx:11867 msgid "Sounder" msgstr "Sygnalizator akustyczny" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "Nadaj sygnal co..." #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "Nadaj malymi literami" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 msgid "convert operator callsign to lower case" msgstr "Konwertuj znak stacji na wielkie litery" #: src/dialogs/confdialog.cxx:11880 msgid "Time out" msgstr "limit czasu" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "Limit czasu xmt proba w XX sekund" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "QTC:" #: src/dialogs/confdialog.cxx:11892 msgid "Enter QTC text" msgstr "Wstaw QTC tekst" #: src/dialogs/confdialog.cxx:11898 msgid "Message Logging" msgstr "Rejestrowanie komunikatow" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "Dodaj datÄ™ / czas" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "Dodaj do kazdej wiadomosci data/czas" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "zawsze dołącz plik(i)" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "dolacz # dyrektywe msgs do pliku o podanej nazwie" #: src/dialogs/confdialog.cxx:11915 msgid "Notify time out" msgstr "Poinformuj o przekroczeniu czasu" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" "Okno powiadomieÅ„ zamyka siÄ™ po XX sekundach;^j0 == dialog pozostaje otwarty" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "Logowanie" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 msgid "Audit log" msgstr "Log audytu" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "Wlacz" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "Log nasÅ‚uchu" #: src/dialogs/confdialog.cxx:11955 msgid "Text Colors" msgstr "Kolor tekstu" #: src/dialogs/confdialog.cxx:11959 msgid "Transmit text" msgstr "Nadaj tekst" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "SKIEROWANY" #: src/dialogs/confdialog.cxx:11965 msgid "Directed received text" msgstr "Dekoduj odebr. tekst" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "BEZKIERUNKOWY" #: src/dialogs/confdialog.cxx:11971 msgid "Undirected received text" msgstr "Nieukierunkowany odebrany tekst" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "IFKP" #: src/dialogs/confdialog.cxx:11988 msgid "1/2 speed" msgstr "1/2 predkosci" #: src/dialogs/confdialog.cxx:11993 msgid "1x speed" msgstr "1xPrÄ™dkosc" #: src/dialogs/confdialog.cxx:11994 msgid "default" msgstr "domyslne" #: src/dialogs/confdialog.cxx:11999 msgid "2x speed" msgstr "2x PrÄ™dkosc" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "ZNAK zawsze male litery" #: src/dialogs/confdialog.cxx:12011 msgid "convert other callsign to lower case" msgstr "Konwertuj znak stacji na male litery" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "Blokuj WF na 1500 Hz" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "Zawsze nadawaj na czestotl. 1500 Hz" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "8-bitowe znaki rozszerzone (UTF-8)" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "Aktywuj to do znaków UTF-8" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "Dlugi odbiór integracji" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "Wlacz dla bardzo slabych sygnalów" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "Nadaj nizszy ton startu" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "Nadaj wyzszy ton startu" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "Czas trwania tonu (sek)" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "Niski ton przy 500 Hz" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "WyÅ›rodkowane na 1500 Hz (SHARES)" #: src/dialogs/confdialog.cxx:12113 msgid "Manual tuning" msgstr "Strojenie rÄ™czne" #: src/dialogs/confdialog.cxx:12122 msgid "Oliv" msgstr "Oliv" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "Wybierz pasmo" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "DzwiÄ™ki" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "Wybierz liczbe tonów" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "Synchronizuj Rx" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "Margines Strojenia (rozstaw czÄ™stotliwosci sygnalów)" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "Zmiana ta tylko do eksperymentowania" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "Okres integracji (bloki FEC)" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "Zresetuj bloki FEC przy zmianie BW lub tonów" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "Aktywuj transmisje znaków UTF-8 " #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "Ton nadawania start/stop" #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 msgid "Enable this to send start/stop tones" msgstr "Włącz aby wysÅ‚ać ton start/stop" #: src/dialogs/confdialog.cxx:12227 msgid "Cont" msgstr "Kont" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "8-bitowe znaki rozszerzone" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "Ustaw to dla znaków diakrytycznych Latin-1 " #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "Zachowanie AFC" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "Zakres wyszukiwania (Hz)" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "Przechwytywanie sygnalów w tym zakresie czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "Pozyskiwanie S/N (dB)" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "Przechwytywanie sygnalu ponad ten próg" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "Zachowanie S/N i IMD" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "po" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "Zachowanie s/n imd" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "Tlumik" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "sekund" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "NastÄ…pi po upÅ‚ywie tego czasu w sekundach" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "Wielokanalowa obróbka sygnalu" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "WielokanaÅ‚owy detektor" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "Wylacz na bardzo wolnym CPU gdy sygnaÅ‚ przeglÄ…darki nie jest uzywany" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "8 psk" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "Sygnal pilota" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "Wlacz kodowanie/dekodowanie szczatkowego sygnalu pilota" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "Zasilanie pilota (dB)" #: src/dialogs/confdialog.cxx:12439 msgid "Pilot tone power relative to signal" msgstr "Moc sygnaÅ‚u pilota w stosunku do sygnaÅ‚u" #: src/dialogs/confdialog.cxx:12458 msgid "Short Preamble" msgstr "Kr. sekwencja wstÄ™pna" #: src/dialogs/confdialog.cxx:12459 msgid "Enable short preamble for 8PSK transmission" msgstr "Aktywuj transmisje znaków 8PSK" #: src/dialogs/confdialog.cxx:12472 msgid "TTY" msgstr "TTY" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "PrÄ™dkosc AFC" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "Predkosc sledzenia AFC" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "Przesuniecie Rx " #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "Przywróc przesuniecie znaków" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "Wspólczynnik przepustowoÅ›ci filtru" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "współczynnik czasu rcos:\n" "1.0 ... 2.0\n" "W1HKJ najlepsze 1.275\n" "DO2SMF najlepsze 1.500" #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "Dekoduj (tÅ‚umienie CWI)" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "Znak -Spacja" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "Tylko znak" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "Tylko Spacja" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "Zakres wyswietlania RTTY " #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "Ustaw przekroczenie zakresu" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "Domyslnie do przekroczenia oscyloskopu" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "XY - klasyczny zakres" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Aktywuj - uzyj Znak/Spacja filtr wyjsciowy\n" "Deaktywuj- uzyj pseudo sygnalów" #: src/dialogs/confdialog.cxx:12555 msgid "Log RTTY frequency" msgstr "Log czÄ™stotliwosci RTTY" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "Ustaw ZNACZNIK czest'" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Aktywuj - zapis QSO uzywajac znacznika czestotliwosci\n" "Deaktywuj - zapis QSO uzywajac znacznika czestotliwosci" #: src/dialogs/confdialog.cxx:12566 msgid "track color" msgstr "Kolor sciezki" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "Kolor znacznika sciezki" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:12580 msgid "Sound Card FSK" msgstr "Karta dzwiekowa FSK" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "PrzesuniÄ™cie nosnej" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "Wybierz przesuniÄ™cie nosnej" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "Wybrane przesuniecie " #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "Przesuniecie nosnej" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "Szybkosc transmisji" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "Wybierz szybkosc transmisji" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "Bitów na znak" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "Wybierz # bity / znak" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "Parytet" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "Wybierz parytet" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "Bity stopu" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "Wybierz # bity stopu" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "AutoCRLF" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "Dodaj CRLF po stronie szerokosci znaków" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "znaki" #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "Autom. dÅ‚ugość linii CRLF " #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Ustaw \"cr cr lf\" dla \"cr lf\"" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "Przesuniecie Tx " #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "Przywróc przesuniecie znaków" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "Uksztaltowany Tx" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "Uzyj wave na sygnaÅ‚ Tx" #: src/dialogs/confdialog.cxx:12728 msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK prawy kanal" #: src/dialogs/confdialog.cxx:12729 msgid "Create keyed square wave on right audio channel" msgstr "Przebieg prostokÄ…tny na prawym kanale" #: src/dialogs/confdialog.cxx:12736 msgid "Transceiver FSK" msgstr "Transceiver FSK" #: src/dialogs/confdialog.cxx:12739 msgid "Mark" msgstr "Znak" #: src/dialogs/confdialog.cxx:12740 msgid "Mark frequency in Hertz" msgstr "Oznacz czÄ™stotliwość w hercach" #: src/dialogs/confdialog.cxx:12751 msgid "Carrier shift in Hertz" msgstr "Zmiana przesuniecia w hercach" #: src/dialogs/confdialog.cxx:12766 msgid "LTRS at start" msgstr "LTRS na starcie" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "Wstawianie bajtów NRS LTRS na poczÄ…tku każdej transmisji" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "Polaryzacja znaku" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" "Zestaw - znacznik logiczny wysoki\n" "odczyt z nanoIO" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 msgid "FSK Interface" msgstr "Interfejs FSK" #: src/dialogs/confdialog.cxx:12847 msgid "Navigator serial port" msgstr "Port szeregowy nawigatora" #: src/dialogs/confdialog.cxx:12861 msgid "FSK" msgstr "FSK" #: src/dialogs/confdialog.cxx:12862 msgid "Connect / Disconnect from Nav FSK port" msgstr "Połącz / rozłącz z portem Nav FSK" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "Konfiguracja interfejsu" #: src/dialogs/confdialog.cxx:12871 msgid "Navigator configuration port" msgstr "Nawigator konfiguracja portu" #: src/dialogs/confdialog.cxx:12885 msgid "Channel 1 Attenuator" msgstr "TÅ‚umik kanaÅ‚u 1" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "TÅ‚umik kanaÅ‚u nawigacyjnego 1" #: src/dialogs/confdialog.cxx:12901 msgid "Channel 2 attenuator" msgstr "TÅ‚umik kanaÅ‚u 2" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "TÅ‚umik kanalu nawigacyjnego 2" #: src/dialogs/confdialog.cxx:12917 msgid "RF attenuator" msgstr "TÅ‚umik RF" #: src/dialogs/confdialog.cxx:12918 msgid "NavRF Attenuator" msgstr "TÅ‚umik NavRF" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "Jasność LED" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "Jasność NavLED" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "Status CAT LED" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "Dioda stanu NavCAT" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 msgid "Nav FSK baud rate" msgstr "Szybkość transmisji FSK Nav" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 msgid "Nav FSK Stop bits" msgstr "Bity stopu nawigatora FSK" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 msgid "Mark Polarity" msgstr "Znak polaryzacji" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "Nav FSK MARK Polarity" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "Ton boczny" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "Ton boczny FSK nawigatora" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "FSK PTT" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "Nav FSK PTT - powinien zawsze być włączony" #: src/dialogs/confdialog.cxx:13061 msgid "Config" msgstr "Konfiguruj" #: src/dialogs/confdialog.cxx:13062 msgid "Connect / Disconnect from Nav Config port" msgstr "Polacz / rozÅ‚acz z Port Nav Config" #: src/dialogs/confdialog.cxx:13069 msgid "Synop" msgstr "Synop" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "SYNOP do ADIF" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "Dekoduje komunikaty SYNOP (Ex: German Weather Service) do pliku ADIF " #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "SYNOP do KML" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Dekoduje komunikaty SYNOP (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "Przeplot SYNOP i tekstu" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Przeplataj tekst dekodowanej wiadomosci SYNOP, lub wymiany." #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 msgid "Serial Interface" msgstr "Interfejs szeregowy" #: src/dialogs/confdialog.cxx:13158 msgid "FSK port" msgstr "FSK port" #: src/dialogs/confdialog.cxx:13206 msgid "Auto CRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 #, fuzzy msgid "Diddle char" msgstr "Testowe znaki" #: src/dialogs/confdialog.cxx:13239 msgid "Diddle character" msgstr "Diddle znak" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 msgid "Unshift on space" msgstr "Unshift na przestrzeni" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "Wlacz DSP przed dekoderem" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "Wykrywanie preambuÅ‚y" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Wykrywa preambuÅ‚e THOR\n" "Wyczysc potok Rx" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "Dekodowanie symbolów" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Użyj soft-decision dekodowanie do wykrywania symboli\n" "Wspomaga dekodowanie soft-bit" #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "Dekodowanie Soft-bitowe" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Uzyj soft- bit Viterbi dekodowania dla lepszej korekcji bledów\n" "Najlepiej aktywuj z dekodowaniem symboli" #: src/dialogs/confdialog.cxx:13402 msgid "Nav" msgstr "Nav" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "Zapisz info do pliku ADIF" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "Zapisz info NAVTEX do KML" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" "Log komunikatów do JÄ™zyka Znaczników Keyhole (Google Earth, Marble, Gaia, " "itp...)" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "WFx" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "Zapisz info Wefax do pliku Adif" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "WysÅ‚ane i odebrane faksy sÄ… zapisane w pliku Adif" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "Wbudowany Wefax Gui" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "Ustaw TX i RX w oknie glównym fldigi.\n" "Zmiana wymaga restartu fldigi" #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "PrzesuniÄ™cie czÄ™stotliwosci (800 Hz)" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "DomyÅ›lnie 800 Hz. Niemcy 850Hz" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "Odebrano maksymalnÄ… liczbÄ™ wierszy fax (5000)" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "Maksymalna liczba wierszy dla uzyskanego obrazu faksu" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "Katalog docelowy obrazów Faxu" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "Katalog..." #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "Ukryj okno nadawania" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "Ukryj okno nadawania domyslnie" #: src/dialogs/confdialog.cxx:13475 msgid "Save image as monochrome file" msgstr "Zapisz obraz jako plik monochromatyczny" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "Zapisz obraz faksu jako szary plik PNG." #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "Rig" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 msgid "flrig" msgstr "flrig" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" "\"Wylacz klucz PTT modemu, jesli uruchomiono fldigi (klient)\n" "i podłączono do jednego flrig (serwer)." #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "klucz modemu PTT w Flrig" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "\" \"" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" "flrig xmlrpc parametry serwera\n" "formanty te sÄ… dublowane na karcie konfiguracji" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 msgid "Addr" msgstr "Adres" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "Adres IP Numeru portu" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "Podłącz ponownie" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "Nacisnij tylko wtedy, gdy zmienisz adres/port" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "flrig jest to preferowana metoda sterowania tranceivera" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "Włącz sterowanie Tx flrig z fldigi jako klient" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "Wylacz, jesli flrig nie jest uzywany." #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "Uzyj RigCAT" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "RigCAT uzyty do sterowania" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "Plik opisu Rig" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "Uzyj Otwórz, aby wybrac plik deskryptora" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "Wybierz plik deskryptora rig" #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Port:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "Prób" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "# prób przed rezygnacja" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "InterwaÅ‚ ponawiania (ms)" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "Czas miÄ™dzy wycofaniem siÄ™ w msek" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "Opóznienia zapisu (ms)" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "Czekaj na odpowiedz do nastepnego polecenia" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "Szybkosc transmisji:" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "Bity stopu" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "Inicjalizuj" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "Inicjalizuj interfejs RigCAT" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "Polecenia sÄ… echem" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "Rig lub interfejs Echos portu szeregowego" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "Komenda CAT dla PTT" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "PTT jest poleceniem CAT (nie sprzetu)" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "Ustaw RTS dla PTT" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "RTS jest linia PTT" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "Ustaw DTR dla PTT" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "DTR jest linia PTT" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "PoczÄ…tkowy stan RTS" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "PoczÄ…tkowy stan DTR" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "Sterowania przepÅ‚ywem RTS/CTS " #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "Rig korzysta z RTS/CTS" #: src/dialogs/confdialog.cxx:13735 msgid "Restore UART Settings on Close" msgstr "Przywróć ustawienia UART przy zamkniÄ™ciu" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "Przywróc ustawienia portu szeregowego (COM) " #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "Aktywuj VSP" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Wirtualny Emulator Portu Szeregowego - brak ostrzezen" #: src/dialogs/confdialog.cxx:13747 msgid "Init delay (ms)" msgstr "Opóznienia zapisu (ms)" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "Czekaj na odpowiedz CAT" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "Uzyj Hamlib" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "Hamlib do sterowania rig" #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "Rig:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "# razy, aby ponownie wysÅ‚ac komendÄ™" #: src/dialogs/confdialog.cxx:13823 msgid "Retry Interval (msec)" msgstr "InterwaÅ‚ ponawiania (msek)" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "Milisekund miÄ™dzy próbami" #: src/dialogs/confdialog.cxx:13840 msgid "Write delay (msec)" msgstr "Opóznienia zapisu (msek)" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "Milisekund miÄ™dzy kolejnymi komendami" #: src/dialogs/confdialog.cxx:13857 msgid "Post write delay (msec)" msgstr "Napisz post z opóznieniem (msek)" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "Czekaj interwaÅ‚ ( msek ) przed odczytem odpowiedzi" #: src/dialogs/confdialog.cxx:13909 msgid "Polling Interval (msec)" msgstr "InterwaÅ‚ ponawiania (msek)" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT poprzez komendy pakietu hamlib" #: src/dialogs/confdialog.cxx:13929 msgid "PTT using hamlib command" msgstr "Pakiet komend PTT hamlib" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "Audio na Port pomocniczy" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "Zródlo dźwiÄ™ku PTT" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "Rig wymaga ustawienia przeplywu RTS/CTS" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "Ustawienie transmisje Xon/Xoff" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "Rig wymaga Xon/ Xoff" #: src/dialogs/confdialog.cxx:13965 msgid "CW is LSB mode" msgstr "CW jako LSB " #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "Stosuj LSB na CW" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "RTTY jako USB" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "Stosuj USB dla RTTY" #: src/dialogs/confdialog.cxx:13977 msgid "Mode delay (msec)" msgstr "Tryb opóznienia (msek)" #: src/dialogs/confdialog.cxx:13978 msgid "Delay NN msec after executing mode change" msgstr "Opóznienie NN msek po zmianie emisji" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "WstÄ™ga boczna:" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "Zaawansowana konfiguracja:" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "opcjonalna konfiguracja\n" "w formacie: param = val..." #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "Inicjalizacja interfejsu hamlib " #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "Sprzetowe PTT" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "Ton PTT na prawym kanale audio" #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Moga byc stosowane zamiast lub w uzupeÅ‚nieniu na inne rodzaje PTT" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "Sterowanie PTT" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "Uzyj oddzielnego portu szeregowego PTT" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "Uzyj portu równoleglego PTT" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "Ustaw uHRouter PTT" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "Ustaw RTS" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "RTS - sygnal linii PTT" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "WstÄ™pne napiÄ™cie na RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "Ustaw DTR" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "DTR -sygnaÅ‚ linii PTT" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "WstÄ™pne napiÄ™cie na DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "Inicjalizacja H/W interfejsu PTT" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "Opóznienia NIM dla wszystkich typów CAT/PTT" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "RozpoczÄ™cie nadawania - opóznienie PTT" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "Opóznienie NN msek przed rozpoczÄ™ciem audio" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "Koniec nadawania - opóznienie PTT" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "Opóznienie NN msek przed zwolnieniem PTT" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "GPIO" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 msgid "Select pin number" msgstr "Wybierz numer PIN" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 msgid "Select PTT on state" msgstr "Wybierz PTT na stanie" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "Wlacz GPIO PTT (kontrolki specyficzne dla Pi)" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "Szerokosc impulsu (msek)" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "Set >0 jeÅ›li zastosowano pulsacyjny PTT" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "UrzÄ…dzenia" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "Uzyj serwera audio OSS" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "Wybierz urzÄ…dzenie" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "Uzyj portu Audio Server" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "Przechwytywania:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "UrzÄ…dzenie wejsciowe audio" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "Odtwarzanie nagranego dźwiÄ™ku" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "UrzÄ…dzenie wyjsciowe audio" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "Uzyj Pulse Audio Server" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "CiÄ…g znaków serwera" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Pozostaw to pole puste lub odnosi sie do\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "Tylko plik I/O " #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "BRAK URZÄ„DZEN AUDIO (lub testu)" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "Urzadzenie obsÅ‚uguje peÅ‚ny dupleks" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "Ustaw" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "CzÄ™stotliwosc próbkowania" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "Przechwyt" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Wymuszenie okreslonej czÄ™stotliwosci próbkowania Wybierz\"Native\" jeÅ›lii " "\"Auto\"\n" "nie dziaÅ‚a z urzÄ…dzeniami audio." #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "Konwerter" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "Ustawiony typ resampler uzyÅ‚ skorygowania zrównowazenia " #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "Korekta" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "Korekcja karty dzwiÄ™k RX " #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "Korekcja karty dzwiÄ™k TX " #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "TX offset" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Róznica miÄ™dzy czest. Rx & Tx (rig przesuniecie)" #: src/dialogs/confdialog.cxx:14605 msgid "Right channel" msgstr "Prawy kanaÅ‚" #: src/dialogs/confdialog.cxx:14607 msgid "Transmit Usage" msgstr "Nadawanie" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "SygnaÅ‚ modemu na lewym i prawym kanale" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "Lewy i prawy kanaÅ‚ oba zawieraja audio modemu" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "Odwróc lewy/prawy kanal" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 msgid "Software reversal of left-right audio channels" msgstr "Odwrócenie programowe lewy-prawy kanal audio" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Te ustawienia sÄ… na innych kartach.\n" "SÄ… replikowane tutaj dla wygody.\n" "Mozesz zmienic stan z kazdej lokalizacji.\n" "..." #: src/dialogs/confdialog.cxx:14627 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "1000 Hz ton, kiedy PTT wlaczony\n" "Moze być uzywana zamiast lub w uzupeÅ‚nieniu do innych typów PTT" #: src/dialogs/confdialog.cxx:14633 msgid "CW QSK signal on right channel" msgstr "CW QSK sygnaÅ‚ na prawym kanale" #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Utwórz 1000 Hz sygnal prostokÄ…tny na prawym kanale" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK na prawym kanale audio" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "Utwórz 1000 Hz audio prostokÄ…tne w prawym kanale" #: src/dialogs/confdialog.cxx:14649 msgid "Receive Usage" msgstr "Uzyj Odbr." #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "Wav" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "Próbkowanie zapisu Wav" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "Wybierz szybkosc transmisji z listy" #: src/dialogs/confdialog.cxx:14681 msgid "Record both channels" msgstr "Nagraj oba kanaly" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "Alerty" #: src/dialogs/confdialog.cxx:14692 msgid "Regex Match in Browser" msgstr "Dopasowanie Regex w przeglÄ…darce" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "REGEX wykryte wav" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 msgid "Sound:" msgstr "DźwiÄ™k:" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 msgid "Test" msgstr "Test" #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "MYCALL Dopasuj w przeglÄ…darce" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "MYCALL wykryj wav" #: src/dialogs/confdialog.cxx:14750 msgid "flmsg interface" msgstr "Interfejs flmsg" #: src/dialogs/confdialog.cxx:14753 msgid "flmsg received wav" msgstr "odebr. dzwiÄ™k wav" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "flmsg przekroczyl limit czasu wav" #: src/dialogs/confdialog.cxx:14803 msgid "RsID detection" msgstr "Wykryty RSID" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "Alarm dzwiekowy RsID wav" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "Tylko informuj" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Sprawdz to, aby odbierac powiadomienia RSID\n" "bez zmiany modemu i czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "Emisje RX" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "Pasmo przepustowe wyszukiwania" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "WL - przeszukaj caÅ‚y wodospad\n" "WYL- Ogranicz wyszukiwanie do+/- 200 Hz" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "Oznacz ostatnia czÄ™stotliwosc i emisje" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Wstaw znacznik tekstu RX przed\n" "zmianÄ… czÄ™stotliwosci i modemu" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "Wylacz detektor" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "Wylacz wykrywanie RSID" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "Zezwalaj na bledy" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Low = zero bledow\n" "Medium = 1 blad\n" "High = 2 bledy" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "Sredni" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "Otwarcie Squelch (sek)" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "Otworz squelch dla nn sek jeÅ›li RSID jest wykrywane" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "Wylacz okno powiadomienia" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "Nie pokazuj okna ostrzezen RsID" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "Zapisz blokade czest. TX " #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" "Zachowaj czÄ™stotliwosc blokady TX (Lk ) przy zmianie czÄ™stotliwosci RX RsID" #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "WyÅ‚acz zmiane czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "Nie zmienia sie automatycznie na czÄ™stotliwosci RX RsID" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" "Tresc wiadomosci i powiadomien RsID\n" "Parametry wyswietlacza skonfigurowano na\n" "\"Powiadomienia\"." #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "Pre-sygnaÅ‚ dzwiÄ™kowy" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "Sekund" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "Sluzy do wyzwalania nosnika wzmacniacza detekcji" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "Emisje TX" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr "Koniec ID xmt" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "Dodaj sygnaÅ‚ RsID na koncu transmisji" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "Video" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "PreambuÅ‚a wideo ID" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "Nadaj tryb ID" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "Wodospad Video ID" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "Nadaj tekst video" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "Tekst wideo wodospadu" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Ogranicz do kilku znaków\n" "jak w CQEM lub IOTA itp" #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "Uzyj maÅ‚ej czcionki" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "WL - mala czcionka\n" "WYL -duza czcionka" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "Znak/Wiersz:" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "Ustaw liczbÄ™ znaków w wierszu" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "Limit 500 Hz" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "Limit szerokosci emisji" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "Tryb Video ID" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "CW ustawienia ID" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "Nadaj znak stacji" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "Nadaj znak CW na koncu transmisji" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "PrÄ™dkosc (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "Nadawaj jako WPM" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "Tryby CW ID" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Rozne" #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "Powolny CPU ( mniej niż 700MHz )" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "Ustaw gdy komputer nie dekoduje poprawnie" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "Plik danych interfejsu NBEMS " #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Wypakuj pliki do uzycia zewnÄ™trznym programem (wrap/flmsg)" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "Otwórz folder wiadomosci" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "Otwórz folder pliku NBEMS po pomyslnym przechwyceniu" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "Odbior pliku flmsg" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "Otwórz w flmsg" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "Otwórz wiadomosc z flmsg" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "Otwórz w przeglÄ…darce" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "Otwórz plik w domyslnej przeglÄ…darce" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "Wpisz peÅ‚na sciezke, nazwe pliku flmsg" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "Szukaj flmsg" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "Limit czasu ( sek )" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "" "Skasuj tekst kanalu po\n" "sekund bezczynnosci" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" "Transfer bezposredni ma pierszenstwo\n" "przed wszystkimi innymi ustawieniami odbioru flmsg" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "Bezposredni transfer do flmsg" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "Wysylanie strumienia danych bezpoÅ›rednio do flmsg" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "Atrybuty Mail Server" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "CzÄ™stotliwosc nosna (Hz)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "Domyslnie sÅ‚uchaj /czÄ™stotliwosc nadawania" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "Zakres wyszukiwania ( Hz)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "Sluchaj sygnalów w tym zakresie" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "Zakres AFC (Hz)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "Ogranicz AFC do zakresu" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "Ustaw czestotliwosc (nosna)" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "Gdy nie wystÄ™puje sygnaÅ‚" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "Raport ramek ARQ " #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "Automatyczne spoty stacji w zdekodowanym tekscie" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "Analizuj wszystkie przychodzÄ…ce teksty" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "Wyslij raport podczas zapisu QSO" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "Wyslij raport tylko wtedy, gdy zalogowano QSO" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "Sprawdzaj czestotliwosc poprzez rig ( tylko gdy masz Rig!)" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "Obejmuje czestotliwosc nadawania" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Wylacz na wolnym CPU gdy sygnaÅ‚ przeglÄ…darki nie jest uzywany" #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Sprawdz, by zmniejszyc obciÄ…zenie procesora w trybie PSK i RTTY." #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "Zaloguj siÄ™ do pskrep po uruchomieniu fldigi" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "Automatycznie uruchom połączenie z portem psk reportera" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "Z kim polaczenie zostanie nawiÄ…zane" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "Korzystaj z portu UDP #" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "Inicjacja gniazda klienta" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "Ustalone miejsce" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "Domyslnie sledzenie punktu CW" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "Domyslnie sledzenie punktu RTTY" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "Domyslnie dla wszystkich innych modemów" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "Zawsze uruchom nowe modemy na tych czestotliwosciach" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "WL - rozpoczyna domyslnie\n" "WYL - zachowaj aktualna pozycje kursora" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "Konfiguruj Elecraft K3" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "CW jako LSB" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Wybierz te opcje, dla Elecraft K3\n" "Pozostale radia tego nie wymagaja." #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "Tekst i/o" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "Gniazdo gÅ‚osowe (tylko MS)" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "GÅ‚os" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "Polacz / Rozlacz do gniazda serwera GÅ‚osu " #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "Aktywuj podczas startu fldigi (serwer musi byc uruchomiony )" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "Przechwytuj tekst rx do zewnÄ™trznego pliku" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "Aktywuj transmisje tekstu rx" #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "Wyslij tekst rx do pliku: textout.txt" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "Dekoduj sygnaÅ‚y DTMF" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "Dekoduj odebr. sygnaÅ‚y DTMF" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "Specyfikacja zapytania o pogode" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "Kod ID stacji METAR" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "na przykÅ‚ad KMDQ dla \n" "Huntsville-Madison Lotnisko, AL" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "PeÅ‚ny raport" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "Wstaw peÅ‚ny raport METAR" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "METAR stacja lokalizacja" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "Dodaj geopolityczna nazwÄ™ stacji METAR" #: src/dialogs/confdialog.cxx:15524 msgid "Conditions" msgstr "Warunki" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "Obecne warunki wx" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "Celsjusz" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "Celsjusz" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "Mil / Godzina" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "raport mil na godzine" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "kilometry / godzina" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "report kilometrów na godzine" #: src/dialogs/confdialog.cxx:15554 msgid "Inches Hg." msgstr "Cale Hg." #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "raport slupa rteci" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "mbary" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "raport milibary" #: src/dialogs/confdialog.cxx:15566 msgid "Temperature" msgstr "Temperatura" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "PrÄ™dkosc wiatru" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "Cisnienie barometryczne" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "Szukaj w internecie" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "Adres URL " #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "Wprowadz adres URL internet danych METAR" #: src/dialogs/confdialog.cxx:15585 msgid "Default URL" msgstr "Domyslne URL" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "Katalog plików KML" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "Wygenerowane dokumenty KML sÄ… przechowywane." #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "Główny plik KML" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Minimalny dystans dla aliasów podzialu (w metrach)" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Minimalny dystans dla wÄ™złów aliasów ( Metry )" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "Czas retencji danych, w godzinach (0 oznacza brak limitu )" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" "Liczba godzin przechowywania danych dla wÄ™zÅ‚a. Zero oznacza, utrzymuj " "wszystko." #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "KML czÄ™st. odswiezania ( sek )" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Odswiez przedzial czasu zapisu w pliku KML (w sekundach)" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "Styl balonu wyswietlania KML" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" "KML balon w postaci zwykÅ‚ego tekstu lub HTML, w prostych tabelach lub " "macierzach." #: src/dialogs/confdialog.cxx:15658 msgid "Command run on KML creation" msgstr "Komenda tworzenia pliku KML" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Komenda startuje, gdy generowane sÄ… pliki KML. Podprocesy sÄ… uruchamiane " "raz, a w razie potrzeby ponownie." #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "Testuj polecenie" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "Wykonaj polecenie na pliku KML." #: src/dialogs/confdialog.cxx:15669 msgid "Change dir..." msgstr "Zmien kat..." #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "Wybierz katalog do przechowywania dokumentów KML" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "Oczysc dane KML teraz!" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "WyÅ›wietl dokumenty KML, Google Earth." #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "Wyczysc przy starcie" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "Usuwa dokumenty KML podczas uruchamiania programu." #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "Wlaczony serwer KML (On / Off)" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "UsuÅ„ zaznaczenie pola wyboru, jeÅ›li KML nigdy nie jest używany" #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "Internet" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "Wyszukaj Stacje" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "Wyszukaj w internecie" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "Nie uzywaj przeglÄ…darki internetowej do wyszukiwania znaku" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "RTS jest linia PTT" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "Zobacz stronÄ™ internetowÄ… QRZ" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "Zobacz stronÄ™ internetowÄ… Hamcall" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "Zobacz stronÄ™ internetowÄ… hamQTH" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:15750 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15763 #, fuzzy msgid "HamQTH" msgstr "HamQTH....." #: src/dialogs/confdialog.cxx:15776 #, fuzzy msgid "Callook" msgstr "Wyszukaj Stacje" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "Wyszukaj baze danych" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "Nie uzywaj bazy danych" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "Użyj CD lub obrazu dysku CD" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Wymagany platny abonament\n" "na dostÄ™p do QRZ on-line" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Wymagany pÅ‚atny abonament\n" "na dostÄ™p do Hamcall on-line" #: src/dialogs/confdialog.cxx:15820 #, fuzzy msgid "HamQTH.com" msgstr "HamQTH....." #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "Darmowe dziÄ™ki uprzejmoÅ›ci obsÅ‚ugi OK" #: src/dialogs/confdialog.cxx:15826 #, fuzzy msgid "Callook.info" msgstr "Wyszukaj Stacje" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Callook.info wyszukiwanie ( bezplatna usluga tylko dla stacji US )" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ie: /home/co7wt/CALLBK lub C:/CALLBK\n" "Pozostaw puste, aby szukac w bazie" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "Uzytkownik" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "Haslo" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "Pokaz hasÅ‚o jako tekst" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "Dodaj adres do pola notatek" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "Czysc wszystko" #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "eQSL" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "Twój login" #: src/dialogs/confdialog.cxx:15917 msgid "User ID" msgstr "ID Uzytkownika" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "Twoje hasÅ‚o logowania" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "Pseudonim" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "Zweryfikuj" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "Zweryfikuj bazÄ™ danych za pomocÄ… pliku z eQSL" #: src/dialogs/confdialog.cxx:15971 msgid "Options" msgstr "Opcje" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "Wyslij po zalogowaniu (log przycisk, , )" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "automatyczne wysylanie danych" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "Uzyj daty/czas do wpisu w logu" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "domyslnie stosuj data/czas wl" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Pokaz mniej emisji" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 msgid "Default message" msgstr "Komunikat domyslny" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "Domyslny tekst, aby wysÅ‚ac z itp" #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "Tekst Tagów (tagi uzyj {} ograniczniki )" #: src/dialogs/confdialog.cxx:16010 msgid " {CALL} other ops call sign" msgstr "{CALL} inna Stacja" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr "{MODE} emisja/ podtryb pracy" #: src/dialogs/confdialog.cxx:16016 msgid "{NAME} other ops name" msgstr "{NAME} inna nazwa" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "Znaczniki te mogÄ… byc wykorzystywane w " #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "tqsl:" #: src/dialogs/confdialog.cxx:16030 msgid "Enter full path-filename for tqsl executable" msgstr "Wpisz peÅ‚na sciezke, pliku tqsl" #: src/dialogs/confdialog.cxx:16044 msgid "Your tqsl login password" msgstr "Twoje hasÅ‚o do logowania tqsl" #: src/dialogs/confdialog.cxx:16059 msgid "Use password for tqsl access" msgstr "Użyj hasÅ‚a do dostÄ™pu do tqsl" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "Przeslij hasÅ‚o przy kazdym przeslaniu" #: src/dialogs/confdialog.cxx:16065 msgid "Location" msgstr "Lokalizacja" #: src/dialogs/confdialog.cxx:16066 msgid "tqsl station location" msgstr "lokalizacja stacji tqsl" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 msgid "Locate" msgstr "Szukaj" #: src/dialogs/confdialog.cxx:16081 msgid "Locate tqsl executable" msgstr "Zlokalizuj plik wykonywalny tqsl" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "Tryb cichy [-q], nie otwieraj okna dialogowego tqsl" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "Operacja tqsl w trybie wsadowym (bez okna dialogowego)" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "Wysylaj dane QSO do LoTW po zalogowaniu" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "Przeslij kazde QSO jako zalogowane" #: src/dialogs/confdialog.cxx:16096 msgid "Export" msgstr "Eksportuj" #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "Eksportuj zapisy do LoTW" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 msgid "Check" msgstr "Sprawdz" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "Przejrzyj plik lotw.adif przed wyslaniem z tqsl" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "WyÅ›lij lotw.adif przez tqsl" #: src/dialogs/confdialog.cxx:16108 #, fuzzy msgid "Export logbook records for LoTW upload" msgstr "Eksportuj zapisy do LoTW" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "Przejrzyj / edytuj wyeksportowany plik adif LoTW" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "Przeslij plik adif do LoTW" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" "Musisz miec zainstalowany program tqsl i zapisana jego lokalizacje aby " "dzialaly aktualizacje LoTW!" #: src/dialogs/confdialog.cxx:16125 msgid "Use this tqsl station location" msgstr "Użyj tej lokalizacji stacji tqsl " #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "Dopasuj" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "Zweryfikuj baze danych za pomocÄ… pliku z LoTW" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "Dopasuj zapisy w dzienniku z plikiem z LoTW" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "WyÅ›wietl Niedopasowane" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "Programy Auto start z fldigi" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:16160 msgid "Enter full path-filename for flrig" msgstr "Wpisz peÅ‚na sciezke, do pliku flirg" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "Szukaj flrig exe" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16178 msgid "Enter full path-filename for flamp" msgstr "Wpisz peÅ‚na sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "Szukaj flamp exe" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16196 msgid "Enter full path-filename for flnet" msgstr "Wpisz peÅ‚na sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "Szukaj flnet exe" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16214 msgid "Enter full path-filename for fllog" msgstr "Wpisz peÅ‚na sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "Szukaj fllog exe" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 msgid "Enter full path-filename for external program" msgstr "Wpisz peÅ‚na sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "Szukaj program #1 exe" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "Szukaj program #2 exe" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "Szukaj program #3 exe" #: src/dialogs/confdialog.cxx:16285 msgid "" "Enable\n" "-" msgstr "" "Wlacz\n" "-" #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "Włącz przy pierwszym uruchomieniu Fldigi" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "Start flrig" #: src/dialogs/confdialog.cxx:16333 msgid "Start flamp" msgstr "Start flamp" #: src/dialogs/confdialog.cxx:16337 msgid "Start flnet" msgstr "Start flnet" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "Start fllog" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "Start prog1" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "Start prog2" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "Start prog3" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "Wlacz" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "Zezwól/Blokuj Zmiany" #: src/dialogs/confdialog.cxx:16372 msgid "Enable ARQ" msgstr "Wlacz ARQ" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "Uzywany pakiet programów dla PSKMail i fldigi " #: src/dialogs/confdialog.cxx:16380 msgid "Enable KISS" msgstr "Wlacz KISS" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "Uzyte do BPQ32" #: src/dialogs/confdialog.cxx:16388 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "WÅ‚acz ARQ dla programów obsÅ‚ugujÄ…cych protokól TCP i fldigi ARQ\n" "WÅ‚acz KISS dla programów, które wspiera UDP i TNC -2 KISS protokol\n" "Tylko jeden interfejs (ARQ /KISS) może byc aktywny w danym czasie.\n" "Zmiana adresu IP i numeru portu wymaga restartu fldigi." #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "I/O" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "Wyjscie numeru portu, gdy jest ten sam adres IP" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "DP" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "Aktywuj, gdy oba programy uzywajÄ… tego samego adresu IP" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 msgid "Restart" msgstr "Restart" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "Start" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "Powrotne polaczenie KISS TCP IO w nasluchu" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "TCP/IP" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "Odhacz, aby wlaczyc połączenie TCP/IP IO" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "UDP/IP" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "Odhacz, aby wlaczyc UDP/IP IO " #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "SÅ‚uchaj/Powiaz" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "Monitor polaczenia TCP" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "Wstrzymaj 7-bitowy Modem" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "Wstrzymaj 7-bitowy modem na komende użytkownika lub recepcje RSID" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "Auto polacz/ wznow" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "Podłącz do hosta programu przy starcie FLDIGI" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "Dekoduj AX25" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "Dekodowania pakietów AX25 w postaci czytelnej dla czlowieka" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:16564 msgid "XML" msgstr "XML" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:16659 msgid "fllog" msgstr "fllog" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "Nadaj po \"N\" sekund od wykrycia sygnaÅ‚u." #: src/dialogs/confdialog.cxx:16697 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "Nadaj po \"N\" sekund od wykrycia sygnaÅ‚u." #: src/dialogs/confdialog.cxx:16707 msgid "Enable Busy Channel" msgstr "Włącz kanaÅ‚ zajety" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "Wstrzymaj TX na wykrytym sygnale" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "Opróznij bufor TX (Minut, 0 = Wylacz)" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" "Oprózniaj bufor TX po okresie zajetosci kanaÅ‚u gdy zajÄ™ty kanaÅ‚ pozostaje wl " "(TX zablokowany)" #: src/dialogs/confdialog.cxx:16726 msgid "Modem Bandwidth Margins " msgstr "Margines przepustowosci modemu" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "Monitor sygnalu, zakres i marginesy" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "Okres probkowania sygnalow (w milisekundach)" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "Okres probkowania sygnalu w milisekundach" #: src/dialogs/confdialog.cxx:16753 msgid "Enable CSMA" msgstr "Wlacz CSMA" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "Trwalosc" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "Stosowane, aby skorygowac agresywnosc TX" #: src/dialogs/confdialog.cxx:16770 msgid "Slot Time" msgstr "Slot czasowy" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "Widok okna nadawania po okresie nadawania" #: src/dialogs/confdialog.cxx:16781 msgid "Transmit Data Delay" msgstr "Opoznienie transmisji" #: src/dialogs/confdialog.cxx:16782 msgid "Idle transmit before data sent" msgstr "Czas przed wysÅ‚aniem danych" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 msgid "MilliSeconds" msgstr "MiliSekund" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "Wyswietl czas w milisekundach" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "Wyswietl opóznienie nadawania w milisekundach" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "Procent (%)" #: src/dialogs/confdialog.cxx:16809 msgid "Enable Histogram" msgstr "Wlacz Histogram" #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "Wlacz Histogram monitorowania sygnalu" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "Histogram Progu PSM" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "Ustaw poziom na wartość x theshold powyzej poziomu halasu" #: src/dialogs/confdialog.cxx:16831 msgid "PSM Attenuate" msgstr "PSM zÅ‚agodzenie" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "Regulacja czuÅ‚osci przez wartosci ulamkowe 1/N" #: src/dialogs/confdialog.cxx:16845 msgid "Default Settings" msgstr "Ustawienia domyslne" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "Pokaz i włącz przycisk zasilania monitora sygnalu (PSM)" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "Przycisk Display PSM na glowne okno" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "Przywróc domyslne" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "UWAGA - to zresetuje Twoje wszystkie ustawienia" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Kolor czcionki" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Czcionka:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Rozmiar:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "To szalone lis przeskoczyÅ‚ nad psem ponownie!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Odczyt czcionek...." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Zródlo plików danych" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Aktualizacja plikow danych" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Zródla danych tabelarycznych" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Zródlo danych" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Dane repozytorium plików" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "Aktualizuj wybrane pliki danych z repozytorium" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "UsuÅ„ lokalne pliki danych, jesli wybrano." #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Wydarzenie" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Aktywne" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtr" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Podmiot DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Podmioty DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Nie zaliczony" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Uzytkownik LotW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "Uzytkownik eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplikaty" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignoruj duplikaty" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "w:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Czas (y):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Akcja" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Limit wyzwalania (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Minimalny czas miÄ™dzy zdarzeniami" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Pokaz okno alarmu:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Wstaw tekst domyslny" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Ukryj okno po (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Dolacz do tekstu RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Dołącz do tekstu TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Pokaz edytor makro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Uruchom program:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Podmioty DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Znajdz kraj:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Nacisnij przycisk return, aby kontynuowac wyszukiwanie" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Szukaj prefiks:" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "Ustaw Eksport" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "Wybierz Rekordy do eksportu" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "Zaznacz wszystko" #: src/logbook/lgbook.cxx:622 msgid "Start Date" msgstr "Data rozpoczÄ™cia " #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "Data rozpoczecia eksportu" #: src/logbook/lgbook.cxx:636 msgid "Stop Date" msgstr "Data koncowa" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "Ustaw datÄ™ koncowa eksportu" #: src/logbook/lgbook.cxx:650 msgid "select by date" msgstr "Wybierz wedÅ‚ug daty" #: src/logbook/lgbook.cxx:651 msgid "Enable to select date range" msgstr "Wlacz aby wybrac zakres dat" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "Wybierz pole do Eksportu" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "CzÄ™st" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "Data QSO" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "Data zakonczenia QSO" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "Czas rozpocz." #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "Czas zakoncz." #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "Moc Tx" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "RST wysl." #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "RST odebr." #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "Lok" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "Wiek" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 msgid "Station Call" msgstr "Znak Stacji" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 msgid "Station QTH" msgstr "QTH Stacji" #: src/logbook/lgbook.cxx:723 msgid "Station LOC" msgstr "Lok Stacji" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Uwagi" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "Data odebr. QSL" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "Data wysl. QSL" #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "Data odebr. QSL" #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "Data wysl. QSL" #: src/logbook/lgbook.cxx:750 msgid "LoTW rcvd date" msgstr "Data odebr. z LoTW" #: src/logbook/lgbook.cxx:753 msgid "LoTW sent date" msgstr "Data wysl. na LoTW" #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "Numer # odebr." #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "Numer # nadany" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "Nr. kontrolny wyslany" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "Klasa FD" #: src/logbook/lgbook.cxx:795 msgid "FD section" msgstr "Sekcja FD" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 msgid "CW SS Check" msgstr "Sprawdz CW SS" #: src/logbook/lgbook.cxx:809 msgid "CW SS Section" msgstr "Sekcja CW SS" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "Sekcja loterii CW" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "Dziennik" #: src/logbook/lgbook.cxx:840 msgid "Date On" msgstr "Data Roz." #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "Data roz. QSO" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "Czas Startu" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "Czas roz. QSO" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "Stacja zaliczona" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "Operator zaliczony" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "Odbr" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "RST odebr." #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "Liczba QSO" #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "# Zapisy w dzienniku" #: src/logbook/lgbook.cxx:913 msgid "Date Off" msgstr "Data Zak." #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "Data zak. QSO" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "Koniec" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "Koniec QSO" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "Czestotliwosc" #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "Czestotliwosc w MHz" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "Tryb pracy" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "Wat" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "Moc nadawania" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "Lok" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "Siatka kwadratów" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "Wysl" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "RST wyslane" #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "Stacja zaliczona z Miasta " #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "Stacja zaliczona ze stanu USA" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "Stacja zaliczona z Prowincji " #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "Stacja zaliczona z Kraju" #: src/logbook/lgbook.cxx:1048 msgid "QSL" msgstr "QSL" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "QSL-odebr." #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "QSL odebr. w dniu" #: src/logbook/lgbook.cxx:1062 msgid "EQSL-rcvd" msgstr "eQSL-odebr." #: src/logbook/lgbook.cxx:1075 msgid "LOTW-rcvd" msgstr "LoTW-odebr." #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "QSL-wyslana" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "QSL wysylana w dniu" #: src/logbook/lgbook.cxx:1101 msgid "EQSL-sent" msgstr "eQSL-wysÅ‚" #: src/logbook/lgbook.cxx:1114 msgid "LOTW-sent" msgstr "LoTW-wysÅ‚" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "QSL droga laczenia stacji" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "Wyspa" #: src/logbook/lgbook.cxx:1181 msgid "Cont'" msgstr "Kontynent" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "Identyfikator DXCC" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "Notatki" #: src/logbook/lgbook.cxx:1236 msgid "My Station" msgstr "Moja stacja" #: src/logbook/lgbook.cxx:1274 msgid "Station Locator" msgstr "Lokator Stacji" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "Nr wyslany" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 msgid "Contest seral # sent" msgstr "Zawody numer # wysl" #: src/logbook/lgbook.cxx:1302 msgid "Exch Out" msgstr "Nr. kontrolny wyslany" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "Zawody nr. kontrolny Tx" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "Nr odebrany" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "Zawody numer # odebrany" #: src/logbook/lgbook.cxx:1326 msgid "Exch In" msgstr "Nr. kontrolny odbr." #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "Zawody nr. kontrolny Rx" #: src/logbook/lgbook.cxx:1339 msgid "Field Day class received" msgstr "Odebrana klasa Field Day" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "ARRL Sekcja" #: src/logbook/lgbook.cxx:1351 msgid "Field Section received" msgstr "Sekcja Field Day odebrana" #: src/logbook/lgbook.cxx:1363 msgid "Operators age received" msgstr "Wiek operatorów otrzymany" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "Dziesięć z DziesiÄ™ciu otrzymanych numerów" #: src/logbook/lgbook.cxx:1387 msgid "Operating band" msgstr "Pasmo operacyjne" #: src/logbook/lgbook.cxx:1399 msgid "Check value received" msgstr "Sprawdź otrzymanÄ… wartość" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "CW SS" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "Konkurs na loterie CW" #: src/logbook/lgbook.cxx:1415 msgid "Ser NoR" msgstr "Nr NoR" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "PierwszeÅ„stwo" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "JOTA" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "Troop-S" #: src/logbook/lgbook.cxx:1469 msgid "Sent troop number" msgstr "Liczba wysÅ‚ana" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 msgid "Received troop number" msgstr "Odebrany numer" #: src/logbook/lgbook.cxx:1492 msgid "Name-S" msgstr "Imie-S" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "WysÅ‚ano nazwÄ™ scouta" #: src/logbook/lgbook.cxx:1504 msgid "Name-R" msgstr "Imie-R" #: src/logbook/lgbook.cxx:1505 msgid "Received scout name" msgstr "Otrzymano nazwÄ™ scouta" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "Szukaj Stacji" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "Szukaj tego znaku" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "Szukaj poprzedni" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "Szukaj nastepny" #: src/logbook/lgbook.cxx:1549 msgid "Retrieve" msgstr "Kopiuj dane" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "Pobierz dla aktywnego modemu" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "Nowy rekord / Zapisz rekord" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "Aktualizuj aktualny rekord" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "Kasuj aktualny rekord" #: src/logbook/lgbook.cxx:1583 msgid "File:" msgstr "Plik:" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "Data" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "Czas" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "Ustaw Cabrillo" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "Wybierz Cabrillo Zawody & Pola" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "Zawody:" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "Data QSO" #~ msgid "Paddle WPM" #~ msgstr "Åopatki WPM" #~ msgid "Do not send CAT PTT signal" #~ msgstr "Nie wysyÅ‚aj sygnaÅ‚u CAT PTT" #~ msgid "Must be enabled" #~ msgstr "Musi być wlaczony" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Ustawienia Rig przez zewnÄ™trzny\n" #~ "program za pomocÄ… xmlrpc\n" #~ "zdalnej stacji" #~ msgid "Use XML-RPC program" #~ msgstr "Użyj programu XML-RPC" #~ msgid "Experimental" #~ msgstr "Próbny" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Inicjalizuj sterowanie rig XML-RPC " #~ msgid "Mode/BW delay" #~ msgstr "Tryb/BW opóznienie" #~ msgid "" #~ "Delay in seconds between \tLDT in iso-8601 format" #~ msgstr "\tLDT format iso-8601" #~ msgid "\tLocal datetime" #~ msgstr "\tlokalny czas data" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT format iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tczas data UTC" #~ msgid "ALC emulation on" #~ msgstr "Emulacja ALC" #~ msgid "Operator information" #~ msgstr "Operator - informacje" #~ msgid "User Interface - Browser" #~ msgstr "Interfejs uzytkownika - PrzeglÄ…darka" #~ msgid "User Interface - General" #~ msgstr "Interfejs uzytkownika- Ogólne" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interfejs uzytkownika - Kolor / Czcionka" #~ msgid "User Interface - Contest" #~ msgstr "Interfejs uzytkownika -Zawody" #~ msgid "User Interface - Macros" #~ msgstr "Interfejs uzytkownika - Makra" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interfejs uzytkownika - Ustawienia Wodospadu" #~ msgid "Rig Control using xml spec file" #~ msgstr "Sterowanie Rig - plik xml" #~ msgid "Audio devices" #~ msgstr "UrzÄ…dzenia audio" #~ msgid "Callsign database" #~ msgstr "Baza danych Stacji" #~ msgid "Program to Program Communications" #~ msgstr "Program do Programu Komunikacji" #~ msgid "Power Signal Monior" #~ msgstr "Monitor mocy sygnalu" #~ msgid "Field Day Viewer" #~ msgstr "Zobacz Field Day" #~ msgid "Callsign:" #~ msgstr "Znak stacji:" #~ msgid "Name:" #~ msgstr "ImiÄ™:" #~ msgid "QTH:" #~ msgstr "QTH:" #~ msgid "Transmit width" #~ msgstr "Szerokosc transmisji" #~ msgid "# of multiple scans / character line" #~ msgstr "# wiele skanów / linia znaków" #~ msgid "Halve receive width" #~ msgstr "Zmniejsz o poÅ‚owÄ™ szerokość odbioru" #~ msgid "Compress Rx in time" #~ msgstr "Kompresja Rx w czasie" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Xmt Szeroki (ukryty)" #~ msgid "Revert" #~ msgstr "Odwróc" #~ msgid "Reset rigCAT interface" #~ msgstr "Resetuj interfejs RigCAT" #~ msgid "Reset hamlib interface" #~ msgstr "Resetuj interfejs hamlib " #~ msgid "Use GPIO PTT" #~ msgstr "Uzyj GPIO PTT" #~ msgid "Select GPIO port" #~ msgstr "Wybierz port GPIO" #~ msgid "QSL-2" #~ msgstr "QSL-2" #~ msgid "Rig control and logging" #~ msgstr "Ustaw Rig i dziennik" #~ msgid "Rig control and contest" #~ msgstr "Ustaw Rig i zawody" #~ msgid "Visit URL" #~ msgstr "zobacz URL" #~ msgid "Copy URL" #~ msgstr "Kopiuj URL" #~ msgid "Controls" #~ msgstr "Ustawienia" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Nie mozna sprawdzic dostepnosci aktualizacji:\n" #~ "%s" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #~ msgid "Ex" #~ msgstr "Ex" #~ msgid "Monitor KISS Pwr Squelch" #~ msgstr "Monitor KISS Pwr Squelch" #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Pusty plik ADIF dziennika %s" #~ msgid "Error reading %s" #~ msgstr "Błąd odczytu %s" #~ msgid "Quick entry" #~ msgstr "Szybki wpis" #~ msgid "Exchanges" #~ msgstr "Wymiana" #~ msgid "Transmit all text in lower case" #~ msgstr "Nadaj tekst malymi literami" #~ msgid "User Interface - Logging" #~ msgstr "Interfejs uzytkownika- Dziennik" #~ msgid "Client/Server Logbook" #~ msgstr "Klient/Serwer Logbook" #~ msgid "Enter URL address of server" #~ msgstr "Wpisz adres URL serwera" #~ msgid "Enter Port # assigned to server" #~ msgstr "Wpisz Port # przypisany do serwera" #~ msgid "Rx Text Capture" #~ msgstr "Przechwytuj tekst Rx" #~ msgid "Prompt to save macro file when closing" #~ msgstr "Monituj o zapisanie pliku przy zamykaniu makro" #~ msgid "Navtex" #~ msgstr "Navtex" #~ msgid "Wefax" #~ msgstr "Wefax" #, fuzzy #~ msgid "PTT is a hamlib command" #~ msgstr "PTT za pomocÄ… komend pakietu hamlib" #~ msgid "Mono audio output" #~ msgstr "Wyjscie audio mono" #~ msgid "Force output audio to single channel" #~ msgstr "Wyjscie audio siÅ‚a do jednego kanaÅ‚u" #~ msgid "End of header string:" #~ msgstr "Koniec ciÄ…gu znakow" #~ msgid "" #~ "Text defining end of METAR header\n" #~ "Typically 'Connection: close'\n" #~ "Used to search for station name" #~ msgstr "" #~ "Tekst definiowania koniec naglówka METAR\n" #~ "Zazwyczaj 'Polaczenie zamkniete'\n" #~ "Uzywane do wyszukiwania nazwy stacji" #~ msgid "QRZ online via default Internet Browser" #~ msgstr "QRZ online poprzez przeglÄ…darkÄ™ internetowÄ…" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "HamCall poprzez przeglÄ…darkÄ™ internetowÄ…" #~ msgid "HamQTH via default Internet Browser" #~ msgstr "HamQTH przez przeglÄ…darke internetowa" #~ msgid "IP Address format: nnn.nnn.nnn.nnn" #~ msgstr "Adres IP format: nnn.nnn.nnn.nnn" #~ msgid "XMLRPC" #~ msgstr "XMLRPC" #~ msgid "IP Address for KISS interface" #~ msgstr "Adres IP dla interfejsu KISS" #, fuzzy #~ msgid "Continue After (sec)" #~ msgstr "Kontynuuj po (sek)" #~ msgid "Dual Port" #~ msgstr "Podwójny port" #~ msgid "CONT" #~ msgstr "Kontynent" #~ msgid "Dial" #~ msgstr "Dial" #~ msgid "Continue" #~ msgstr "Kontynuuj" #~ msgid "\tvideo text" #~ msgstr "\tvideo tekst" #~ msgid "Raised cosine = Hanning" #~ msgstr "Podniesiony cosinus = Hanning" #~ msgid "No rig specified" #~ msgstr "Nie wybrano rig" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Wprowadz czÄ™stotliwosc lub zmien z\n" #~ "listy." #~ msgid "Enter Xcvr Freq" #~ msgstr "Wpisz xcvr Czest." #~ msgid "cty.dat pathname" #~ msgstr "sciezka cty.dat" #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Wlacz gdy nie mozesz uzyc srodkowego przycisku myszy" #, fuzzy #~ msgid "Frq Disp" #~ msgstr "Ekran czÄ™stotl" #~ msgid "Label text" #~ msgstr "tekst etykiety" #~ msgid "Mixer" #~ msgstr "Mikser" #~ msgid "OSS Mixer" #~ msgstr "OSS Mikser" #~ msgid "Manage mixer" #~ msgstr "ZarzÄ…dzaj mikserem" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Dodaj sterowniki miksera do okna dialogowego" #~ msgid "Select Mixer device" #~ msgstr "Wybierz urzÄ…dzenie Miksera" #~ msgid "Mic In" #~ msgstr "Wej Mik" #~ msgid "Use microphone input" #~ msgstr "Uzyj wejÅ›cia mikrofonowego" #~ msgid "Line In" #~ msgstr "Line In" #~ msgid "Use Line-In device" #~ msgstr "Uzyj urzÄ…dzenia Line-In" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Ustaw poziom karty dzwiÄ™kowej PCM" #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "" #~ "Wpisz peÅ‚na sciezke, nazwe pliku\n" #~ "lub nazwe programu" #~ msgid "" #~ "Exit prompts active only when File/Exit menu item selected.\n" #~ "Not active if window decoration close button pressed." #~ msgstr "" #~ "Wyjscie wyswietlane tylko wtedy, gdy aktywny Plik/Wyjscie z menu " #~ "wybrano.\n" #~ "Nie jest aktywne jesli dekoracja przycisku okna wcisnieta." #, fuzzy #~ msgid "Char set" #~ msgstr "Wyczysc listÄ™" #~ msgid "Select the rig by name" #~ msgstr "Wybierz rig wg nazwy" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Wymuszenie rig wstÄ™gi bocznej. Trwa\n" #~ "efekt, gdy rig zmieni tryb .." #~ msgid "FFT latency (scan merging)" #~ msgstr "FFT opóznienie (skanowanie polaczenia)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "Opóznienie zwiÄ™ksza rozdzielczosc czÄ™stotliwosci\n" #~ "zmniejsza rozdzielczosc czasowÄ…. 1 = bez skanowania polaczenia" #~ msgid "Save image as:" #~ msgstr "Zapisz obraz jako:" #~ msgid "Colors and Fonts" #~ msgstr "Kolory i czcionki" #, fuzzy #~ msgid "Disp" #~ msgstr "Wyswietl" #~ msgid "64-bit (long) interleave" #~ msgstr "64-bitowy (dÅ‚ugi) Przeplot" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Filtr odbiorczy szerokosci pasma" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Przepustowosc filtru" #~ msgid "Navtex stations file:" #~ msgstr "Plik stacji Navtex" #~ msgid "Memory Mapped Rig" #~ msgstr "Pamiec zamapowana Rig" #~ msgid "Set page width" #~ msgstr "Ustaw szerokosc strony" #~ msgid "after:" #~ msgstr "po:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (ukryj)" #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Sterowanie poprzez zmapowane\n" #~ "wspólne zmienne\n" #~ "czyli: program Kachina" #~ msgid "Use Memmap" #~ msgstr "Uzyj Memmap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Kontrola Rig przez Zmapowane Kachina" #~ msgid "Initialize Memmap interface" #~ msgstr "Inicjalizuj interfejs Memmap" #, fuzzy #~ msgid "Displays" #~ msgstr "Wyswietl" #~ msgid "Tx Power" #~ msgstr "Moc Tx" #~ msgid "Ser# in" #~ msgstr "Nr# odebrany" #~ msgid "QSO Freq" #~ msgstr "Czest. QSO" #~ msgid "Cnty" #~ msgstr "Kraj" #~ msgid "#Out" #~ msgstr "RSTw" #~ msgid "#In" #~ msgstr "RSTo" #~ msgid "Xchg" #~ msgstr "Xchg" #~ msgid "File exists. Are you sure you want to overwrite?" #~ msgstr "Plik istnieje. Czy na pewno chcesz go zastÄ…pic?" #~ msgid "Tracking range (WPM)" #~ msgstr "Sledzenie zakresu (WPM)" #~ msgid "DomEX" #~ msgstr "DomEX" #~ msgid "On Date" #~ msgstr "Data rozpoczÄ™cia" #~ msgid "Off Date" #~ msgstr "Data zakonczenia" #~ msgid "Save log before exiting?" #~ msgstr "Zapisz log przed wyjÅ›ciem z programu?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Zapisac zmienione makra przed wyjsciem?" #~ msgid "View log" #~ msgstr "Zobacz log" #~ msgid "A message was logged" #~ msgstr "Wiadomość zostaÅ‚a zalogowana" #~ msgid "The right audio channel is disabled. Enable it now?" #~ msgstr "Prawy kanaÅ‚ audio jest wylaczony. WÅ‚aczyc teraz?" #~ msgid "Gen'" #~ msgstr "Ogolne" #~ msgid "Double-click on RX text enters QSO data" #~ msgstr "Kliknij dwukrotnie na tekst RX wchodzi QSO danych" #~ msgid "Log server" #~ msgstr "Log serwer" #~ msgid "Cursor color" #~ msgstr "Kolor kursora" #~ msgid "Cursor center line" #~ msgstr "Kursor linia Å›rodkowa" #~ msgid "Bandwidth tracks" #~ msgstr "Pasmo Å›cieżki" #~ msgid "Tracks color" #~ msgstr "kolor Å›cieżki" #~ msgid "Wide tracks" #~ msgstr "Szerokie Å›cieżki" #~ msgid "Wide center line" #~ msgstr "Szeroka linia Å›rodkowa" #~ msgid "Wide cursor" #~ msgstr "szeroki kursor" #~ msgid "Tx Atten (dB)" #~ msgstr "Aten. Tx (dB)" #~ msgid "QRZ/etal" #~ msgstr "QRZ/etal" #~ msgid "CDROM" #~ msgstr "CDROM" #~ msgid "Subscriber data" #~ msgstr "Informacje o użytkowniku" #~ msgid "eQSL upload when record logged" #~ msgstr "eQSL przesÅ‚ać gdy zapis zalogowany" #~ msgid "Default message sent with eQSL" #~ msgstr "DomyÅ›lna wiadomość wysÅ‚ana z eQSL" #~ msgid "FH" #~ msgstr "Feld Hell" #~ msgid "Packet" #~ msgstr "Pakiet" #~ msgid "Select packet baudrate" #~ msgstr "Wybierz szybkoÅ›c pakietów" #~ msgid "RX Low Freq Gain" #~ msgstr "RX niski zysk CzÄ™st" #~ msgid "Processing gain to apply to lower tone (in dB)" #~ msgstr "Przetwarzanie wzmocnienia stosuje siÄ™ do niższego tonu (w dB)" #~ msgid "RX High Freq Gain" #~ msgstr "RX Wysoki Zysk CzÄ™st" #~ msgid "Processing gain to apply to higher tone (in dB)" #~ msgstr "Zysk przetwarzania stosuje siÄ™ do wyższego tonu (w dB)" #~ msgid "TX Low Freq Gain" #~ msgstr "Zmniejsz zysk czÄ™st.Tx" #~ msgid "TX High Freq Gain" #~ msgstr "Zysk czÄ™st. Tx" #~ msgid "add RX timestamps" #~ msgstr "dodaj znaczniki czasu RX" #~ msgid "decode Compressed data" #~ msgstr "dekodowanie danych skompresowanych" #~ msgid "Decode received Compressed Position data" #~ msgstr "Dekodowanie oodebranych skompresowanych danych pozycjonowania" #~ msgid "decode Mic-E data" #~ msgstr "dekodowania danych Mic-E" #~ msgid "Decode received Mic-E data" #~ msgstr "Dekodowanie odebranych danych Mic-E" #~ msgid "decode PHG data" #~ msgstr "dekodowania danych PHG" #~ msgid "Decode received PHG data" #~ msgstr "Dekodowania odebranych danych PHG" #~ msgid "use SI units" #~ msgstr "używaj jednostek SI" #~ msgid "Display decoded data values in SI units" #~ msgstr "WyÅ›wietl zdekodowane wartoÅ›ci danych w jednostkach SI" #~ msgid "use English units" #~ msgstr "używaj angielskich jednostek" #~ msgid "Display decoded data in English units" #~ msgstr "WyÅ›wietl zdekodowane dane w jednostkach angielskich" #~ msgid "Use cross-hair scope" #~ msgstr "Użyj oscyloskopu cross-hair" #~ msgid "Defaults to syncscope instead of phase (cross-hair) scope" #~ msgstr "DomyÅ›lnie syncscope zamiast zakres fazy (cross -hair )" #~ msgid "add additional gain to audio input for low-output interfaces" #~ msgstr "" #~ "dodaj dodatkowe wzmocnienie wejÅ›cia audio dla niskich wyjÅ›ciowych " #~ "interfejsów" #~ msgid "Display true frequency in the waterfall" #~ msgstr "WyÅ›wietl prawdziwÄ… czÄ™stotliwość w wodospadzie" #~ msgid "" #~ "Enable to show the true transmit frequency on the waterfall when the " #~ "radio is in CW (A1A) mode" #~ msgstr "" #~ "Włącz, aby pokazać prawdziwy czÄ™stotliwość nadawania na wodospadzie gdy " #~ "radio jest w CW ( A1A ) trybie)" #~ msgid "Corrupt ADIF file" #~ msgstr "Uszkodzony plik ADIF" #~ msgid "Callsign DB" #~ msgstr "Stacja DB" #~ msgid "Paid online subscription" #~ msgstr "PÅ‚atny abonament internetowy" #~ msgid "Text:" #~ msgstr "Tekst:" #~ msgid "\tTx digits string" #~ msgstr "\tTx cyfrowy ciÄ…g DTMF" #~ msgid "Freq Analysis" #~ msgstr "Analiza czÄ™stotliwoÅ›ci" #~ msgid "flmsg specific" #~ msgstr "flmsg specyficzny" #~ msgid "Autostart flmsg upon detection of compatible file" #~ msgstr "Autostart flmsg po wykryciu zgodnego pliku" #~ msgid "Autostart flmsg / browser upon detection of compatible file" #~ msgstr "Autostart flmsg / browser po wykryciu zgodnego pliku" #~ msgid "Auto Extract files from rx stream" #~ msgstr "WyodrÄ™bnia pliki auto z strumienia Rx" #~ msgid "" #~ "0\n" #~ "1\n" #~ "2" #~ msgstr "" #~ "0\n" #~ "1\n" #~ "2" #~ msgid "Enable detection && extraction" #~ msgstr "Włącz pobieranie && wykrywanie" #~ msgid "Auto open wrap folder" #~ msgstr "Auto Otwórz folder Wrap" #~ msgid "Search for reg-exp in browser text(s)" #~ msgstr "Szukaj reg - exp w tekÅ›cie przeglÄ…darki (S)" #, fuzzy #~ msgid "Width (% of panel)" #~ msgstr "Szerokość ( % z panelu)" #, fuzzy #~ msgid "Adjust viewer width as % of panel width" #~ msgstr "Dopasuj szerokość przeglÄ…darki jako procent szerokoÅ›ci panelu" #, fuzzy #~ msgid "1 bar" #~ msgstr "1 Bar" #, fuzzy #~ msgid "2-A" #~ msgstr "2-A" #, fuzzy #~ msgid "2-B" #~ msgstr "2-B" #, fuzzy #~ msgid "2-C" #~ msgstr "2-C" fldigi-4.1.06/po/en@boldquot.header0000644000175000017500000000247113472116043014032 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # fldigi-4.1.06/po/ru.gmo0000664000175000017500000037517313515625025011557 00000000000000Þ•þ 0ü_€€.€ K€ X€ e€r€w€j{€æ€û€,A[ bmsy‚†ŒŽ”‚š‚ ‚,‚.‚ M‚VW‚ ®‚ »‚ È‚ Ò‚ ß‚ ì‚ ù‚ƒƒ ƒ #ƒ 0ƒ =ƒ Jƒ Wƒdƒ iƒ vƒƒƒŒƒ“ƒ œƒ©ƒ°ƒ¶ƒ!Ѓòƒôƒ!ùƒ„0„5„:„P„U„g„„—„­„.Ä„ó„…!…"<…_…o…&ˆ…¯…"Ã…æ…† †&*†+Q†}†˜†±††Ó†*Ù†‡ ‡1"‡)T‡+~‡ª‡"¾‡+ᇠˆ#!ˆ Eˆfˆ |ˆˆˆ™ˆ¯ˆˆÓˆâˆñˆ ‰‰5‰"L‰o‰ƒ‰#ž‰!‰ä‰ŠŠ"-Š)PŠ+zЦŠÅŠ ÕŠ'⊠‹)‹E‹c‹-h‹–‹¶‹(Ô‹ý‹Œ 7ŒXŒ kŒ"yŒ'œŒÄŒÉŒ"ÞŒ&(>Thz-Ž*¼"ç ŽŽŽŽ Ž+Ž:Ž JŽTŽYŽ ]Ž iŽuŽ {ކޛ޹ŽÀŽ&ÄŽëŽ.&5\ai,®Çß ãCï)3 ]8j£&º á ì÷,‘*B‘m‘#v‘š‘­‘À‘$Æ‘ë‘ñ‘D’ H’S’c’v’*Ž’¹’/Í’ ý’“2“O“o““©“,Å“ ò“ü“””)”)H”)r”1œ” Δܔᔠò”ü” • •%•6•J•S•\•o•w•-‹•¹• Ù• ä•ò• ú•– –4–)8–b–k–s–w–€–‡–Œ– –›–º– Ò–Ü–ë–û– —'— 6—B— G— S—_—4p—¥—8®—ç—î—ö— ˜(˜ 7˜#X˜+|˜¨˜±˜И ç˜õ˜ý˜ ™&"™ I™U™ o™ ™ ™«™(¼™å™ú™+š =šKš7Zš8’šËš èšòš›'›A›V›t›W”›$웜/+œ[œ'sœ›œ²œ¸œÏœ5✠(07 h(t)3Çû ž ž&ž ,ž 7žAžGžfžzžŠž.ž4ÌžŸŸ(Ÿe=Ÿ £Ÿ®Ÿ½Ÿ ÅŸ ÒŸ àŸ íŸûŸ * C U Z ` h ‚ ˜ ­ Ç  РÚ ï  ¡ *¡4¡ 9¡E¡_¡;w¡³¡É¡Ñ¡ë¡+ò¡¢/5¢e¢ }¢Š¢ ¢§¢«¢°¢ ¸¢¢Ë¢⢠ò¢ý¢£ £ £,£5£F£\£o£ £.£ ¾£Ê£Ï£Ø£à£ï£¤¤¤,3¤`¤r¤C¤VѤ(¥+0¥\¥u¥¥  ¥ ¬¥¸¥Õ¥ñ¥)ú¥"$¦#G¦k¦ r¦$€¦¥¦¿¦Ȧަ§%§,-§ Z§f§m§q§ Ч—§ ¬§¸§/̧ü§:¨8R¨‹¨¨¥¨Á¨Já¨&,©+S©0©!°©Ò©*ï© ª'ª +ª6ª1Mª ª‰ª ¤ª¯ª ±ª »ªŪ,ت« ««5« O«Z«[¬ o¬{¬—¬&ª¬Ѭ,⬠­­ :­9E­%­)¥­/Ï­2ÿ­2®2O®‚®*˜®+î,ï® ¯$=¯%b¯7ˆ¯À¯ȯܯú¯- °"7°"Z°"}°" °"ð,æ°'±-;±i±„±б ± š±¥± «±µ±½± Ʊ ұ߱ù±²²9² >²K² R²_²~²’²¥² Ų:ϲ1 ³<³B³ K³V³Z³ i³w³•³¤³ ¨³ ³³:Ô³ ´-´G´W´i´{´Š´š´ ´3¦´Ú´á´ò´) µ 4µ >µ Lµ Vµ cµqµxµµµ µµµ$ѵöµ$ ¶0¶C¶ R¶\¶Pq¶¶ʶ ϶Ú¶ â¶í¶ó¶b·!q·/“·#÷ ç·¸$¸)¸ ;¸E¸V¸f¸¸ „¸¸•¸ ¸«¸4´¸,鸹¹&¹ .¹:¹ V¹c¹w¹¹¨¹±¹º¹¿¹$عý¹ºº4º:º<º@ºCºGºLº[º^ºcºWzºXÒºZ+»Y†»Yà»:¼C¼H¼g¼y¼|¼ ¼š¼¹¼ؼݼí¼½½.½ E½P½l½ ˆ½!©½˽ß½ó½¾,¾ H¾ V¾ b¾ƒ¾•¾2¯¾â¾8ü¾65¿l¿~¿-‘¿¿¿Ó¿ Ø¿å¿é¿ý¿À:À >À HÀRÀ[ÀIcÀ0­À9ÞÀÁ.7Á0fÁÏ—Ág …¦Â$ÀÂå êÂö ÃÃ!Ã"1Ã:TÃÃ—à žÃ¬ÃÀÃÒÃêà ÄÄ'Ä?ÄWÄtđĮÄÅÄÍÄÒÄêÄ îÄÅ*Å=Å]Å pÅ|ńŌŠ£Å °ÅºÅ2¾ÅñÅÆÆ #Æ/ÆOÆeÆ |Æ‡Æ—ÆÆ ¶Æ ÁÆËÆÞÆ îÆùÆ ÇÇ0Ç GÇ QÇ \Ç-iÇ—Ç °Ç,ÑÇ$þÇ#È3*È^ÈnÈwÈ ‡È “È  È­È¾ÈÚÈ ßÈÉÉÉ 1É=ÉMÉ^ÉdÉ }É'‹É³ÉºÉ0ÖÉÊ"Ê#(ÊLÊ"cÊ†Ê¦Ê ½ÊÈÊÜÊïÊñÊ Ë Ë)Ë/Ë>ËNËSËmËqËuËŽË“Ë –Ë Ë´ËÇË+ÛËÌ ÌÌ-ÌMÌx_ÌØÌ ÞÌ ìÌ!øÌ!ÍJ<͇͉͌ÍBÍ;ÒÍ1Î@Î DÎ NÎXÎ]ÎdÎtΈΜδνΠÆÎÐÎïÎÿÎÏ!Ï5Ï MÏZÏ(lϕϥÏ/­Ï&ÝÏÐ ÐÐ.Ð6=ÐtÐ „Ð’Ð/¡ÐÑÐÙÐßÐ,ãÐÑÑ Ñ&ÑEÑ IÑWÑ&oÑ"–ѹÑ#ÓÑ ÷ÑÒ1Ò HÒ RÒ\ÒtÒ{Ò“Ò-›ÒÉÒÒÒØÒ çÒ óÒÿÒ Ó##Ó.GÓvÓÓ™Ó ©Ó³ÓÓÓ/ëÓÔ Ô &Ô0ÔHÔ ]ÔiÔ)|Ô#¦Ô0ÊÔûÔÕ ÕÕ0ÕCÕ^ÕxÕÕŠÕ¥Õ!ÀÕâÕ êÕöÕ Ö Ö ÖÖ#Ö,Ö0ÖKÖ OÖ]ÖwÖ –Ö¤ÖºÖÂÖËÖÔÖØÖ áÖ îÖ úÖ× ×× × ×$×(*×S×W×f×x××Š×‘× ™×£×¬×Ã×Ó×è×í×þ× ØØ&Ø?Ø OØ pØ ~Ø ŠØ–Ø§ØÆØ ÎØÜØ õØÙ'Ù@ÙYÙrهٜ٠¡Ù3­ÙáÙèÙ÷ÙþÙÚ+Ú IÚ;jÚ¦Ú®Ú•´ÚJÛRÛ&cÛ@ŠÛËÛÓÛÜÛúÛÜ$Ü,Ü HÜ0VÜ.‡Ü¶Ü ºÜÆÜÜÜ!åÜ"Ý*ÝEÝVÝ[ÝbÝ ~Ý(ŒÝ^µÝÞ Þ&Þ /Þ ;ÞHÞKÞZÞaÞ uÞƒÞ‹Þ’Þ¦Þ¯Þ·Þ½ÞÑÞÙÞîÞòÞ ÷Þß ß ß ß +ß7ß<ß Eß Qß\ßrߎߣßÁßÑßãß óß à, à:àLà Tà `àmàT‹àààá áá-á<áNá`áoáwáá†á ™á ¤áÅáÝáñá â%â ;âFâWâoâ „â7’â ÊâÖâóâ ãã*ã Eã<fã£ã*¿ãêãïã0ÿã!0ä+Rä~ää¥ä,·ä ää ïäýä(å#>å!bå0„åµåÎåÕå Ýå éåöåæ#æ$>æ3cæ8—æÐæ Ùæãæòæçç 'ç5çHç1Wç"‰ç ¬çºç×çèçèè2èBè ^è!lè Žè˜èŸè®èÂè ÑèÞè ðè þè é*é =é^é4~é³éÏéÞéðé.êS4êˆê žê©ê ±ê »êÈêÐêâê êêøê ë ëë 2ë >ë Jë Vëbë ~ë Šë –ë¢ë²ë¸ëÉë Üëéë ûëìì (ì 4ìAìRìfì {ì …ìì-˜ìÆì àì#í$%íJíeíwí }íˆíí“íší­í±í*Çíòíûí î îîî 8îBîGî \îhî mî!wî™î¨î °î ½îÉîÛî'ïîïzïšï+¯ï/Ûï% ð:1ð;lð/¨ð+Øðñ ñ ññ!ñ)ñ2ñ:ñIñZñ wñ…ñŽññ¤ñ³ñÒñÙñìñÿñòò2ò";ò^òxòò•ò¤ò³ò ÅòÓòìòóó&óEóYó iówó‘ó ¢ó ­ó ºó Èó Õó âó ïó üó ô ô #ô0ô 3ô AôMôVô^ôwô|ô~ô…ô ˆô ”ôžô¹ô1Ôôõõ:õJõOõ/oõ,ŸõÌõßõ8æõö9öSö Yöeö}ö˜ö¶öÔöÜö òöýö ÷"!÷D÷Z÷q÷ y÷)„÷®÷Â÷â÷ô÷ ø'øDønSøÂøáø-òø ù/ù7ù FùPù aù*lù—ùŸù'¦ù'Îù'öùú$ú6ú;úOú0bú “ú¡ú¸úËú+áú ûû'û9û Bû MûZû bûoûsû&vû'û-Åûóû ûûüü0üEü`üdüzüü«ü¯ü Âü Íü)Úüý ýý (ý'2ýZýký~ýƒý‡ýý¦ý¨ý"¬ýQÏý5!þ1Wþ‰þ™þ­þÆþÉþÏþèþ"þþ !ÿ/ÿ5ÿ'Dÿ$lÿ‘ÿ ÿ¶ÿ¾ÿ!Øÿ(úÿ# ('2Zagnv†”3šVÎ%=,jG}ÅÉÛîôü$ G2z¢¸Óéú +-Y _kƒ—­6³1ê  ) 6CH¡L"î#5!K.mœ³Ì Õ âï  «Ã ÅÒ8Ô ¬"  Ï  Ü  é  ó     ' ;  B  O  \  i  v  ƒ   •  ¢ ¯ Á È Ñ ç î <ô +1 ] _ ed Ê ê ï &ô  4 +U $ $¦ (Ë Mô $B Og 8· Tð *E4pQ¥÷88M†U‹@á["0~O¯ˆÿ\ˆåZëFDKU>æI%1oW¡Iù$C'h8Éæ 3!UsŠ+7É**,#W\{Ø2òh%$Ž!³Õ&õ=SZT®L&P#wS›Bï42=g¥>ª?é?)Bi)¬/Ö1R8'‹0³Uä:?>YM˜2æA?[U›XñKJ?–(Öÿ    "  A b w |  € Œ ª » Ì 2ì !0!AA!=ƒ!yÁ!7;"s" x"8ƒ"]¼"6#0Q#‚#‰#e#W$[$b{$8Þ$E%]%n%;%_»%?&[&-y&$§&$Ì&ñ&F' K'1V'hˆ'ñ'()(7I(L(+Î(Vú(Q)(e);Ž)/Ê);ú)<6*Is*^½*+%/+ U+`+4g+4œ+4Ñ+=,D,`,2q,#¤,/È,.ø,'-C-Z-n-u-‡-¢-±-PË-M.j.ƒ. . ª.0·.è./c /n/w//ƒ/Œ/“/˜/›/0®/&ß/ 00'08;0t0ƒ0 Ÿ0«0°0Î0-ì0E1`1rq1 ä1 ï1ü1C2#`29„28¾2G÷2?3%Q3$w3œ3¶3+Å3ñ3` 4!l4?Ž4;Î4 5$5*@5Ck5.¯54Þ5i6}6•6<­6Xê6"C7f7~76œ7_Ó7*38$^8%ƒ8 ©8HJ91“9Å9'V:G~:#Æ:ê:/ð:$ ;LE;’;£;»;sÛ;O<:n<b©<f =#s=7—=Ï=ë=ú=>*>83>"l>>ª>kÃ>m/?"?*À?*ë?Ð@ç@ö@A!+A!MA!oA"‘A´A%ËA*ñA*BGBLB_BpBŒB¨BÈBäBíB)C=*C4hCC°CÅC1ØC$ DU/D,…D ²D0¿D ðDDûD"@EUcE&¹E+àE F $F.F?FDF LFVF._FŽF «F¶F»F×FçFûF G&0G,WG.„G ³GSÁGH3H¦Z_åZ@E[a†['è[A\hR\Q»\5 ]WC];›]q×]I^*Z^4…^º^RÖ^:)_:d_CŸ_:ã_:`ZY`7´`jì`+Wa ƒa aaµaÍaÜaøab 4b!@b5bb˜b3«b)ßb c"c7c#FcDjc$¯c#Ôc0øc)da;dCdádçd ðd6ûd2eIe<beŸe®e²eAÅevf~fn–fgg$-gRg$mg ’gœgF¥g ìgùgIhvchÚhïhii7i Wi cini‹iœi&¼i=ãi!j+=jijyj ˆj’jˆ¤j -k 8kCk Ykdk xk'„kµ¬k@bl9£l2Ýl%m6mRm!amƒm’m¨m"Âm åmòm nn n8nNGn_–nönoo #oR/o ‚o*o(ºo(ão ppp&/p?Vp*–pÁp2Ðpqqqqq q%q4q7q{W¸{e|7v|M®|iü|Ïf}36~Kj~&¶~OÝ~-2Nk!~2 QÓŠ%€°€À Ì€Ú€*ò€/ASk}!!±!Ó3õ)‚8‚4A‚v‚4}‚*²‚1Ý‚3ƒ,Cƒpƒ Œƒ™ƒ,°ƒ!݃ÿƒ „G*„ r„0“„Ą̈́3ç„ …-<…j…†…–…&œ… Ã… Î…/Ø…#†,†$B† g†<t†2±†ä† þ† ‡R+‡)~‡L¨‡yõ‡\oˆ ̈`Ùˆ$:‰_‰)q‰›‰®‰À‰'Ù‰?Š AŠ/NŠ6~Š µŠ"ÀŠ#ãŠ,‹34‹h‹En‹´‹FЋŒ**ŒbUŒ8¸ŒñŒ8úŒ23Uf@¼-ý+ŽAŽUŽtŽvŽŽŽ £Ž®Ž´Ž"ÃŽæŽ>íŽ, 09;uˆ£%¾ä;? F4Q0† ·àع‘Α!å‘4’><’”{’“““[“Mt“–“Y”j”†”¢”§”·”(Ó”(ü”%•?• R•^•Cz•"¾•á•(ý•,&–9S––«–TË–& —G—LV—8£—Ü—#í—#˜5˜jO˜º˜Õ˜ì˜R ™ _™ j™w™L{™È™Ù™ Ý™ê™ š š%&šRLšVŸšNöš\E›4¢›.×›$œ +œ5œ/Fœvœ?…œÅœhØœ AN_yŒQ§ù< žLHž•ž2´ž3瞟-;Ÿ&iŸWŸèŸ ñŸûŸ/ 0> o /‹ E» =¡=?¡ }¡ ‰¡ •¡@¡¡â¡C¢4F¢{¢Š¢)¢$Ç¢)좣£0:£k£o£ s£}£…£Ž£"’£µ£¹£+Ù£¤¤/;¤k¤|¤‘¤ª¤ ®¤ »¤ ȤÔ¤ò¤ö¤û¤ ÿ¤ ¥¥E¥_¥c¥r¥Š¥£¥¼¥Ã¥ Ë¥Õ¥.Þ¥ ¦-*¦X¦]¦v¦¦­¦1´¦æ¦N§O§h§€§˜§(¸§á§'ð§.¨G¨-a¨L¨1ܨ©,©&=© d©q©N©ß©"ô©ª-&ª3Tª7ˆªFÀª`« h« t«ù« y¬„¬cœ¬z­{­Š­=™­'×­&ÿ­ &®?3®s®J‹®QÖ®(¯,¯5A¯w¯@ޝAϯ-°?°X°]°Rd°·°_ϰˆ/±¸±½±Ò±%ë±&²8²;²P²#W²{²‘²™²" ² ò ͲÛ²<á²³&³;³?³D³c³i³ o³ }³)г´³ dzÓ³ó³&´,6´7c´E›´ á´µ("µ!Kµ$mµD’µ!×µùµ ¶ ¶B8¶‡{¶;·?·'R·&z·¡·$º·ß·'ù·!¸ 0¸=¸"L¸o¸4…¸-º¸(è¸1¹0C¹3t¹¨¹¾¹=Ú¹(º%Aºcgº˺9åº"»B»0`»‘»*«»oÖ»*F¼3q¼¥¼¸¼UÓ¼A)½Xk½"Ľ.ç½)¾i@¾'ª¾,Ò¾(ÿ¾O(¿bx¿7Û¿WÀ(kÀ”À°À#ÐÀ'ôÀAÁ#^ÁL‚ÁJÏÁcÂp~Âï Ã%Ã.6ÃeÃ$và ›Ã6¼Ã óÃWÄ3lÄ Ä'¾Ä,æÄEÅ,YÅB†Å)ÉÅGóÅ#;ÆL_ƬÆÉÆåÆ$Ç(ÇHÇ$fÇ‹Ç¥Ç ÃÇNÑÇ> È>_ÈRžÈ=ñÈ2/É6bÉ<™ÉTÖɼ+Ê)èÊË.Ë?ËXËpË!x˚˯Ë&ÏË öËÌ&Ì>ÌOÌ`ÌqÌJ‚ÌÍÌÞÌïÌÍÍ('Í!PÍ-rÍ  Í+ÁÍíÍ Î )ÎJÎ^Îo΃ÎίÎÁÎ]ÒÎR0Ï>ƒÏ=ÂÏ4Ð/5Ð'eÐГЯÐÂÐÆÐÍÐìÐðÐB Ñ!MÑoÑvьѠÑ1§ÑÙÑâÑóÑÒ*Ò3ÒAQÒ(“Ò¼ÒÄÒÞÒ%ôÒ1ÓVLÓ £Óä±Ó+–ÔRÂÔ1ÕSGÕw›ÕZÖVnÖ_ÅÖ%× *×5×I×R×Z×p×!ˆ×ª×0Æ×÷ר(Ø HØ!iØ$‹Ø°Ø'ÉØ'ñØ2ÙLÙ1UÙ‡Ù$ Ù8ÅÙþÙ.Ú!>Ú+`ÚŒÚ#Ú&ÁÚ7èÚ& ÛGÛPeÛ+¶Û%âÛ#Ü9,ÜfÜ‚Ü Ü!¾Ü àÜ Ý "Ý CÝ dÝ …Ý ¦Ý ÇÝèÝëÝÞ Þ Þ-(ÞVÞ[Þ]ÞdÞwÞ•Þ!±ÞBÓÞNß!eß3‡ß#»ß ßß@êßM+àgyà*áà ájá3ˆá,¼áéáòá,â2;â3nâ@¢â ãâ%ïâã45ã)jã-”ã.Âã+ñã ä)äcIä#­ä,Ñäþä>åCXå8œå6Õåâ æLïæ%<çObç%²çØçàçóçúçèH#èlè}èLŽèLÛè2(é [é"fé‰é+é$¼é‡áéiê(…ê®ê'ÈêPðêAë%Pë3vëªë¹ëÈëèëûëììD"ìJgìO²ìíí"í#?í0cí1”íÆí6Êí î6"îYî]î oîzîe˜îþîï#ïCïg]ï"Åï%èïððð,7ðdðfð;kðˆ§ðX0ñT‰ñ Þñÿñ#òBò Eò/Pò8€ò=¹ò ÷òóóA0óAró´ó Ñóòó$ô9*ô8dôô¢ô2Àôóôúôõõõõ&õ-õr3õŒ¦õ3öp:ö*«ömÖöD÷ H÷'V÷~÷ ‡÷!”÷J¶÷tø vøø$ ø6Åø)üø&ùDù aù nù{ù—ù:´ùïùõù$ú4ú*Pú†m‘ýýÀMþcëÉåü¹aTÞ 1ÏÍ]ŒÕU˜½Îü¬]L{‡Ë N:T„AžžÊƵ$†5Ï7VR%ÅJ N• æEO_û°ì´ßMöeãäþ3Ú™ÙÎÖ[S³óoÞ­œÌ² ¡âiáâYÏzr3ù¼j1 $Äê3%Q }¥šÚ³«akFºõ†,PûnŠFª;kÉa‰ eŸ†?Ä|Î̉q¡údÊ]#AÞÑf][‡9]fŸé×õÀØ3D)»ð%€ðT} º–“Åÿ}©£ã-á'Æu걊˜ó<äèÉkZ 4ð­W¡˜Ù5îÕ½<cÔ¼×ï¯xÇŠ P¡<òª †m¼äqϹø#UΖ³—0¯:7¢lI{çWµ/W_æ¡EÁ9:<ëýÕ͈õCzP Â@XA!plšOELú¦~ŒXö×àbŒ]ÇÂŽ8÷Sk8t¬ñd6Øo¾ntuv—¯ib¢€Ã©?3ˆ²Þ'Ÿ°Mô©Ž=}Êi§w"›ºK”oU&!È„ ¬“¿‡5-dÝ[½Ï…NÓô¹·”2™4↸ð2t?Ðj´¿Dºïsãq(þ‚6Fij/5C@2øu1ÝóŠ>xÜ9âhð­B£Ø‹q?RmOôÛytäMÚ+ø"‹ˆ[•Ýo°Dî’&ëÛ¸rE¨ÓžGºlr ì{Ö¬éé‹@L&ƒÊâ^B¶„©;Ìă Ù¨ÿ "ýN“ñ²Ow™h¥ë@ üJ}™jlÅc9þ`-¬ËQZÆuü+úø`³Ü}4°®¾óÛ ¢êíù–7ã_Õ§Ú¤wÇPÃY.°yÂnVhSådHŠÿSZä4CÒàì—çGbŒ%Óýoºï[í*NK›kÀèÍÇ—v.SlÔ'ô íÕ’ôûùx¤œ7:YÓ …”V´?¾Êt¨8=H¨¶‹{ë“#Åûv…¯'B|¸»ŽWGJ+^…¤>É"v‘RšQ›3áFý6‰±§M±ÂzÑ&þ^»!hJU´üùhµ~Àã0‚1ÒÛ_ -7¿™ƒ`~Ѫáw ·ÛZBÙÌ\—§Ô¿Ö @õžß»Y‘ßúLô"pmxe\6ù~ÄÅ«‘KŽ”tÖ=™“„U4çâA.•gƒ£Ã¦Áy„÷è`±Ð´ææf:›I6f¨;mÈgÈbÂCà°òޏØaŽÆze‚ ŒñßdI¹^ÉßT>ÿÑåî¥ \£•/­AdŸ–áïÁÜPØçÖÊZ¤Øµ2r"’{˶|nöв*Ã+ÒÞêÔŸ·Ð„W^ÁX¹¯|÷/½Gíƒøn¸D0Ù!´¶àµ|yåÁa8€qsMîÄΛu~{­çwÔw A.ÇspP‰’XVÓ«¾ÏÍ/rE-.\¥§¦À<T%*Ì(-[)îË÷…Gª+±®ª éœH_žóZƒ>©®@ÝbÆW骜õ(Y¿Ð(;›a>f¥gšvÝ•\àp‹N6I‡èö&öy)à©pûbåܧ¸ ïŸ7 H¶ÚnvöUÿüy²èË,½x9Ò/‰ ®Ã9`ˆ¦OO ‚×»ÁÕêI(‡’¦÷cñG…Û|¼mspʼnø1éÞÙñò(óeR¨”~hrîËí¾€Ô«÷ˆXeú•çF2+%е–®¬‡ˆÈBg0¢Ç”‹¦È$ò^ß;“LלV#CJT#8$0¥I';fS!juí0VBÐò¿Îœ˜²Üà ·Ñ­HÍžlð*sšÉïÜ gÌÖk  )˜úQÒ€=½Hj,£×»¾Ezå˜ÄÆ ìÈÍRL ÒDì *’¢c=£ù#Qò–ê`q<ææ·ãKKcz®¡¤,—ŒÓ! &¢$>Q,R¶*=1䯚CDF³i)·±_ÀX «i‚ ¹õ2$Y5¼Ý¤'\)쫂‘xsñÚ€þJè³?ë¼8á:K.4,Ñû5og‘ {CALL} other ops call sign {MODE} full mode / submode 4 07 7 5 21 29 6 22 31 in " ""Disable PTT keys modem if multiple instances of fldigi (client) are connected to a single flrig (server).# Records in logbook# retries before giving up%s exists, overwrite?%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&UI&View**.exe*.txt... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...00 = T; 9 = N11 - Slow, 2 - Medium, 3 - Fast1/2 speed1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351x speed2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 132x speed3 baud4.5 baud500 Hz limit6 baud8 psk8-bit extended characters8-bit extended characters (UTF-8): AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter ignore all comment text CW identifier decrement counter digital mode (adif) log eQSL optional msg log eQSL insert text file valid xcvr filter width my frequency move to freq NNNN Hz return to sweet spot send mode ID; TX start only idle signal for NN.nn sec LDT default '%Y-%m-%d %H:%M%z' insert image file increment counter S/N etc. IMD etc. ZDT default '%Y-%m-%d %H:%MZ' last serno sent Local datetime, default '%x %H:%M %Z' local date, default '%Y-%M-%D' saveQSO data, append msg to notes other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data local time, default %H%M map by value map on google mode my call my FD class my locator my name my QTH my RST my FD section other name next QSO rec # pause transmit insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously valid xcvr hi cutoff filter valid xcvr low cutoff filter valid xcvr mode other RST receive Rx RSID on,off,toggle save current macro file save contest out current contest serno schedule execution search DOWN for signal search UP for signal Digitalk On, Off, Toggle text at start of TX repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version delay xmt for NN.n sec get weather data for station get weather data exchange begin exchange end exchange in exchange out UTC datetime, default '%x %H:%MZ' zulu date, default '%Y-%M-%D Z' zulu time default %H%MZ= 1 (on)AADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedALTRARQARQ controlAX25 DecodeAbortAccess URLAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd RsID signal to end of transmissionAdd address to notes fieldAdd date/time stamp to each # received messageAdd geopolitical name of METAR stationAddrAddressAdjust cursor frequencyAdjust sensitivity by 1/N fractional values.Adjust the DSP bandwidthAdvanced configuration:AllAll entriesAll settings shown here can be changed later via the Configure menuAllow TX After Signal Detection (Seconds)Allow errorsAllow transmits after 'N' seconds of a signal detection.Allow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAlways transmit at 1500 Hertz center freq.Antenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio on Auxiliary PortAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAudit logAuto Connect / RetryAuto connect when fldigi opens (server must be up)Auto start programs with fldigiAuto-fill Country and AzimuthAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutostartAvailable substringsBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBg colorBits per characterBrowserBrowser Line ColorsBuffer allocation Error near File: %s Line %dBug me about saving log entriesBuild infoButton HeightButtonsC&ountriesCALLSIGN always lower caseCAT command for PTTCPUCPU usage increases with waterfall heightCQ STATECQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW is LSB modeCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall LookupCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture Radio ReportCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier Sense Mulitiple AccessCarrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter freqCenter in passband Right click to undoCenter lineChange ONLY to experimentChange application look and feelChange colorChange dir...Change log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitCharacter count in args[] parameter exceeds expectationsCharacter searched not foundCheck AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check if xcvr uses LSB for CWCheck if xcvr uses USB for RTTYCheck this to be notified when an RSID is received without changing modem and frequencyCheck to enable TCP/IP IO ConnectionCheck to enable UDP/IP IOCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedClassCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear UDP textClear channel text after # seconds of inactivityClear list?Clear log controls sets RST in to 599/59Clear log controls sets RST out to 599/59Clear log entries after saving or using macro Clear log fields?Clear on saveClear textCloseClose ListClrs/FntsColorColor for outgoing telnet textColor of Mark TrackColors && FontsColors and cursorsCommand %s ignored, dot notation not supportedCommand %s ignored, structured command not supportedCommand Not FoundCommand line optionsCommand missing ':'.Command started when KML files are generated. Subprocesses are started once, and restarted if needed.ConditionsConfig ScriptsConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?ConnectConnect to MacLoggerConnect to host program on FLDIGI start upConnect to serverContCont'ContestContest exchange receivedContest exchange sentContest seral # sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate keyed square wave on right audio channelCreate new logbook fileCustom shiftCustom text searchCustom...CutDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDX ClusterDXCCDXCC designatorDXCC entitiesDXCC entityDash/DotData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode (CWI suppression)Decode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault RST in to 599/59Default RST out to 599/59Default SettingsDefault URLDefault WPMDefault for all other modemsDefault test string is: "DefaultsDelay NN msec after executing mode changeDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete entry?Delete local data files if selected.Delete the current recordDeselectDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice:DevicesDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory path not foundDirectory...Disable alert dialogDisable allDisable freq changeDisable further detection when RSID is receivedDisable if flrig not used.Disable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay RX in reverse videoDisplay macro filename at startDisplay tx and rx in main fldigi window. Change requires restart of fldigiDisplays the Slot Time in MillisecondsDisplays the Transmit Delay in MillisecondsDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDot to dot-space ratioDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEEQSL-rcvdEQSL-sentEmbedded Wefax GuiEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable ARQ for programs that support TCP and FLDIGI ARQ protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol. Only one interface (ARQ/KISS) can be active at any given time. KISS/ARQ/XML Addr/Port changes require program restart.Enable Busy ChannelEnable CSMAEnable DSP prior to decoderEnable Data StreamEnable GPIO PTT (Pi specific controls)Enable HistogramEnable Histogram threshold signal monitoringEnable KISSEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable encode/decode vestigial pilot toneEnable flrig xcvr control with fldigi as clientEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable rx text streamEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable this to send start/stop tonesEnable to put Tx panel above Rx panelEnable when both programs are using the same IP addressEnabledEnd of line reachedEnter METAR data internet URLEnter QTC textEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-filename for tqsl executableEnter full path-name for cty.dat folderEnter test string or leave blank for default:Enter time span in minutesErrorEvenEven LinesEven linesEventEvent logExch InExch OutExchange InExchange OutExecutable file to insertExecuteExecute command on KML files.Executing script file: %sExitExit promptsExportExport SetupExport records for LoTW uploadExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.F-WPMFD classFD sectionFECFFT ProcessingFFT averagingFFT prefilter window functionFLMSG files...FSQFahrenheitFax images destination directoryFeel free to skip any pages or exit the wizard at any timeField DayField Day Callsign May be same as OP callsignField Day ClassField Day LoggingField Day SectionFile not foundFile read errorFile:FilesFill in Country / Azimuth using cty.dat informationFilterFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFlrig I/OFlrig PTT keys modemFlushes the TX buffer after x period when Busy Channel remains on (TX inhibited)FoldersFontFont colorFont...Font/ColorFont:Force RST in/out to 599/59Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreqDisp / MetersFrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)FullFull reportGPIOGeneralGeneral ErrorGenerateGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlib used for rig controlHardware PTTHeight of macro barHell Receive ParametersHell Transmit ParametersHiLite 1HiLite 2HideHide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:II/OIDIDsIFKPIFKP Raw ImageIOIOTAIP Address Port NumberIP Address for ARQ interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for KISS interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for XMLRPC interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for fllog interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostITU zoneITUZIdle transmit before data sentIgnore duplicatesInInactivity timeoutInches Hg.Include the transmit frequencyInclusive stop date for exportInfoInit delay (ms)Initial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInput carrier shiftInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert textInsert text on single left clickInteresting notesInterleave SYNOP and textInvalid File Name Pointer (NULL) in function %s:%dInvalid Modem for KISS IOInvalid function parameter 'char *file_name_path' (null)Invalid function parameter (internal non-script error)Invalid parameterIslands on the airIssues reported in processing script file: %sK3 A1A configuationKISSKISS controlKMLKML files directoryKML refresh interval (seconds)KML server enabled (On / Off)LOCLOTW-rcvdLOTW-sentLast QSOLatencyLeave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLine: %d Error:%d %s (%s)Listen for signals within this rangeLoTWLoTW ReviewLoTW download fileLoadLoad a new paletteLoad image fileLoad last used macro file at startLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocate tqsl executableLocatorLockLock transmit frequencyLogLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog sourcesLogbookLoggingLogging Panel ControlsLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow filter cutoffLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMETAR station ID codeMETAR station locationMFSK ImageMFSK image fileMT-63MYCALL always lower caseMac LoggerMacLoggerMacro Button LabelMacro Edit FontMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMark onlyMark-SpaceMarquee textMatch logbook records with LoTW download fileMatched Filter bandwidthMaximum open subscripts reached.Maximum row number for a received fax image.May require resizing the Rx/Tx panelMediumMemory Allocation Error (internal non-script error)Merge ADIF fileMerge...Message LoggingMeter ColorMiles / HourMilliSecondsMinimal controlsMinimum time between eventsMiscMissing command %s after line %dMissing paired quotes (")ModeMode delay (msec)Mode in useMode must matchMode width limitModemModem Bandwidth Margins Modem carrierModem signal on left and right channelsModemsMonitor for TCP connection.Monitor signals in modem bandwitdh plus margins.Monitor transmitted signalMouseMouse wheel active on macro buttonsMsec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy StationMy callsign de CALLMy transmit CW WPMNN3FJP Server IP AddressN3FJP Server IP PortN3FJP logsNBEMSNBEMS files...NO CALLSIGN SETNameNarrow LPF if image noisyNavNewNew record / Save recordNextNoNo ErrorsNo faster than thisNo file name givenNo slower than thisNon transmit window after a transmit periodNoneNormalNormal drop speed / valueNot a script file/tag not foundNot worked beforeNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OOKONON - search over entire waterfall OFF - limit search to +/- 200 HzON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOddOdd LinesOdd linesOlivOn/OffOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperate tqsl in batch mode (no dialog)OperatorOperator CallOperator Callsign:Operator Name:Operator callsign (if different than station callsign)Operator workedOperators QTHOperators nameOptional configuration in format: param=val ...OptionsOtherOutOutput port number when same IP address usedOverPSKPSK ReporterPSK/RTTY Viewer HiLite Color 1PSMPSM AttenuatePSM Histogram ThresholdPTT delays valid for all CAT/PTT typesPTT enables auxiliary audio sourcePTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT using hamlib commandPTT via Hamlib commandPWR-meterPalette: Parameter is not valid.ParityParse all incoming textPartialPassed parameter is not of the expected type.PasswordPastePaths (hidden)Percent (%)PersistancePick baud rate from listPilot tonePilot tone power relative to signalPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Polling Interval (msec)Popup info after a 2 second hover on a callsignPortPort:PortAudioPost write delay (msec)Power Signal MonitorPower scalePreamble DetectionPress only if you change the address/portPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProsignsProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPskmailPulse shapePulse width (msec)PwrQRZQRZ cdromQRZ.comQRZ/eQSLQSKQSK on right audio channelQSLQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSOQSO DateQSO Date OffQSO Date OnQSO loggingQSYQTC:QTHQTH NicknameQthQuietQuiet mode [-q], do not open tqsl dialogRPCRSID receptionRST always 599/59RST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY is USB modeRX - unshift on spaceRX captureRX ppmRX sound card correctionRadio frequencyRaised cosine pulse shape factorRange +/- wpmRange 1...3Range 1...4Reading fonts...Really delete record for "%s"?ReceiveReceive UsageReceive filter bandwidthReceive modesReceive synchronizerReceived fax maximum rows number (5000)Recent activity for gridReception of flmsg filesReception reports...Record both channelsRecsRectangularRefresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveRemove call after ...Replay trackline audioReport ARQ frames average S/NReport actual modem RF frequencyReport rig frequency (enable only if you have rig control!)ReportsResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! RestartRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetriesRetrieveRetrieve for active modem useRetry Interval (msec)Retry interval (ms)ReverseReverse Left/Right channelsReverse videoReview / edit the exported LoTW upload adif fileReview lotw.adif file before sending with tqslRigRig controlRig description file:Rig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig/Log ControlsRig:RigCATRigCAT used for rig controlRight channelRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRsIDRst receivedRst sentRun programRun program:RxRx / Tx PanelsRx AGCRx Height in pixelsRx ParametersRx TextRx WPMRx Width MultiplierRx bkgndRx fontRx/TxRx/Tx Character setS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SYNOP to ADIFSYNOP to KMLSample rateSaveSave ...Save ConfigSave as...Save changed Logbook?Save changed configuration?Save changed macros?Save image as monochrome fileSave log entry?Save logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...Scale ColorScript FilesScript device path not found.Script file contains potential issues See documentation and/or Log file for details.Script file name (path) invalidScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Searches passbandSecondary TextSecondsSectionSelectSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect PTT on stateSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect pin numberSelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSendSend CW cut #'sSend Callsign in CW at end of every transmissionSend QSO data to LoTW when loggedSend a continuous stream of test charactersSend at this WPMSend beacon every ...Send continuouslySend data stream directly to executing flmsgSend imageSend image...Send lotw.adif via tqslSend reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSer inSer outSerial # inSerial # outSet >0 if pulsed PTT usedSet Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSets the theshold level to x value above the noise levelSettingsShaped TxShort PreambleShort description of antennaShowShow DXCC entitiesShow TX timerShow alert window:Show all modesShow and enable Power Signal Monitor button (PSM)Show bandwidth tracks on waterfallShow channelsShow cursor with center lineShow fewer modesShow macro control codesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:SigLvlSignal BrowserSignal Level ColorsSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow CPU (less than 700MHz)Slow drop rateSoft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSome changes made by the script requires program restart before they become active.Sort by Date/Time OFFSound CardSounderSpec CharSpeed (WPM):SpotterSpotting disabledSquelchSquelch levelSquelch open (sec)StartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStation / OperatorStation CallStation Callsign:Station LOCStation LocatorStation Locator:Station QTHStation QTH:Station callsignStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSubmit each QSO as loggedSubmit password with each uploadSubmit the upload adif file to LoTWSubscript execution fail (internal).Sunspot creation underway!Switch to ARQ I/OSynopSys ColorsSystemT/RTCP/IPTCP/IP Data StreamTTYTX - unshift on spaceTX Buffer Flush Timer (Minutes, 0=Disable)TX PowerTX WPMTX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTabular data sourcesTemperatureTestTest charTest character for QSK adjustmentTest text fileTest...Text CaptureText ColorsText HighlightingText file to insertText to send during keyboard idle timesText...The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThese tags can also be used in This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time outTime span overTimingTiming and QSKTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTracked CW speed in WPMTrackingTransfer direct to executing flmsgTransfer speed, X1-normalTransmitTransmit Data DelayTransmit PowerTransmit UsageTransmit callsignTransmit fontTransmit lower case textTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit textTransmit upper start toneTransmit/ReceiveTriangularTwo scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9TxTx ParametersTx above RxTx bkgndTx fontTx level attenuator (dB)TxIDUUDP/IPUIUI languageUI schemeUS state of station workedUS units of distance (QRB)Unable to create file %s (Error No=%d) func %s:%dUnable to open file %sUncheck if KML is never usedUndefined errorUndoUnexpected end of file reached.Unexpected end of parameter (args[]) list foundUnexpected end of parameter check list foundUnsupported formatUpdateUpdate selected local data files with repository contentUpdate site not availableUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse averaging to decrease waterfall noiseUse colored buttonsUse date/time off for log entryUse leading zerosUse parallel port PTTUse password for tqsl accessUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse this tqsl station locationUse uHRouter PTTUsed For PSKMail and FLDIGI Suite of ProgramsUsed for BPQ32User IDUser InterfaceUser nameUsing UDP port #VSP EnableValid signal sample period in MillisecondsVerboseVerifyVerify database with LoTW download fileVerify database with eQSL download fileVersion %s is available at Source ForgeVideoVideo Preamble IDViewView/Hide 48 macrosView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWARNING - this will over write ALL settingsWF CtrlsWF MagnificationWF Shift ControlsWF StoreWF carrierWF drop rateWF modeWF ref levelWFxWXWait for response to first CAT commandWait for response to subsequent commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWavWav write sample rateWeather Fax Image RXWeather query specificationWebWeb Browser lookupWeight (%)Wheel actionWhere generated KML documents are stored.WideWind speed/dirWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)Write delay (msec)XMITXMLXMT lockXON/XOFF flow controlYYesYou are running the latest versionYou must have tqsl installed and it's location recorded for LoTW updates to work!You need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordYour tqsl login passwordaaafteralways append to file(s)automatic data uploadcallsign tooltips in received textchannels != 1charsclear old dataconvert operator callsign to lower caseconvert other callsign to lower casecty.dat foldercurrent wx conditionsdefaultdefault uses date/time ondisplay PSM button on main dialogdisplay Rx control chars as ascii stringeQSLeQSL userenable mouse wheel control of macro barflamp:fllogfllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrigflrig is the preferred method of tranceiver controlflrig xmlrpc server parameters these controls are mirrored on the IO configuration tabflrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form exchangeie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourlock WF at 1500 Hzmbarsminutespilot power (dB)print ^! execution codes in Rx panelrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportssecondsselect browser fontselect by datesend when logged (log button, , )tqsl:track colorunknown wave file errorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.23.21.6 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2017-03-14 14:10+0500 Last-Translator: RX9CDR Language-Team: RX9CDR Russia, tnx for help UV7QAE Ukraina Language: ru MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.12 Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); X-Poedit-SourceCharset: UTF-8 {CALL} позывной корреÑпондента {MODE} полный режим/подрежим 4 07 7 5 21 29 6 22 31 in " ""Отключить РТТ, еÑли неÑколько ÑкземплÑров fldigi (клиент) подключены к единому flrig (Ñервер).# ЗапиÑать в журнал# повторных попыток%s exists, overwrite?%sлог Ñтартует на %s%s: Ðе ÑущеÑтвует, Ñоздать?&О программеКонфигурациÑФайлПомощьЖурналИнтерфейÑВид**.exe*.txt... Эти ÑредÑтва ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´ÑÑ‚ÑÑ Ð½Ð° других вкладках. Они копируютÑÑ Ð·Ð´ÐµÑÑŒ Ð´Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва. ...00 = T; 9 = N11 - Медленно, 2 - Средне, 3 - БыÑтро1/2 ÑкороÑтиТон 1000 Гц при включенном РТТ Может быть иÑпользован вмеÑто или в дополнение к другим видам РТТ12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351x ÑкороÑть2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 132x ÑкроÑть3 baud4.5 baud500 Гц предел6 baud8 psk8-разрÑдное раÑширенние Ñимволов8-разрÑдные Ñимволы (UTF-8): Ðвто подÑтройка чаÑтоты, вкл, выкл, переключить Ð¼Ð¾Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½Ð° рабочий диапазон позывной корреÑпондента очиÑтить Ð¿Ð¾Ð»Ñ Ð»Ð¾Ð³Ð° очиÑтить RX окно очиÑтить TX окно контрольный номер Игнорировать вÑе комментарии CW идентификатор уменьшить контрольный номер на единицу Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÑƒÐ»ÑÑ†Ð¸Ñ (Ð´Ð»Ñ adif) Ñохранить QSO в eQSL и добавить Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ñохранить в логе eQSL вÑтавить текÑтовый файл Включить нужный фильтр в транÑивере Ð¼Ð¾Ñ Ñ‡Ð°Ñтота перейти на чаÑтоту NNNN Hz вернутьÑÑ Ð½Ð° Ñвою чаÑтоту Передать идентификатор при Ñтарте передачи задердать передачу на NN.nn sec Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° и Ð²Ñ€ÐµÐ¼Ñ Ð² формате '%Y-%m-%d %H:%M%z' Ð’Ñтавить изображение увеличить контрольный номер на единицу Ð»ÑŽÐ±Ð°Ñ Ð²Ð°Ð¶Ð½Ð°Ñ Ð´Ð»Ñ Ð²Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ. например Ñоотношение Ñигнала к шуму Ð»ÑŽÐ±Ð°Ñ Ð²Ð°Ð¶Ð½Ð°Ñ Ð´Ð»Ñ Ð²Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ. IMD и так далее ЗулуÑÑÐºÐ°Ñ Ð´Ð°Ñ‚Ð° и Ð²Ñ€ÐµÐ¼Ñ Ð² формате '%Y-%m-%d %H:%MZ' предыдущий Ñерийный номер ÑвÑзи Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° и Ð²Ñ€ÐµÐ¼Ñ Ð² формате '%x %H:%M %Z' Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° в формате '%Y-%M-%D' Ñохранить QSO и добавить Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð»Ð¾ÐºÐ°Ñ‚Ð¾Ñ€ корреÑпондента ФикÑ. чаÑтоту ТХ вкл, выкл, переключить Сохранить QSO и добавить Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñать QSO в лог локальное Ð²Ñ€ÐµÐ¼Ñ %H%M координаты на карте карта в google модулÑÑ†Ð¸Ñ Ð¼Ð¾Ð¹ позывной мой клаÑÑ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ Ð´Ð½Ñ Ð¼Ð¾Ð¹ локатор моё Ð¸Ð¼Ñ Ð¼Ð¾Ð¹ QTH мой передаваемый RST Ð¼Ð¾Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ²Ð¾Ð³Ð¾ Ð´Ð½Ñ Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ñ€ÐµÑпондента Ñледующий номер QSO пауза передачи Ð’Ñтавить раÑÑтоÑние между ÑтанциÑми в текÑÑ‚ # номер QSO Ð²Ñ€ÐµÐ¼Ñ QSO в формате (HHMM)) Увеличить/уменьшить рабочую чаÑтоту транÑивера qsy на kHz, Hz правый клик QSY левый клик QSY QTH корреÑпондента повторить Ð¼Ð°ÐºÑ€Ð¾Ñ Ð½ÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð¾ Вкл. ДейÑтвующий ВЧ фильтр транÑивера Вкл. ДейÑтвующий фильтр ÐЧ транÑивера Включить нужный режим транÑивера RST корреÑпондента перейти на прием Принимать RSID вкл, выкл, переключить Сохранить текущий файл макроÑов Ñохранить рапорт в лог текущий Ñерийный номер ÑвÑзи Запланировать Ñкед поиÑк Ñигнала ниже по чаÑтоте поиÑк Ñигнала выше по чаÑтоте Digitalk вкл, выкл, переключить ТекÑÑ‚ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ повторить поÑле NN sec Ñигнал наÑтройкиr NN sec переключитьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ приемом и передачей вÑтать на передачу Вкл ТХ аттенюатор Передавать RSID вкл, выкл, переключить верÑÐ¸Ñ Fldigi задержать передачу на NN.n sec получить данные о погоде Ð´Ð»Ñ Ñтанции получить данные о погоде начало контеÑÑ‚ рапорта Ð´Ð»Ñ Ð»Ð¾Ð³Ð° конец контеÑÑ‚ рапорта Ð´Ð»Ñ Ð»Ð¾Ð³Ð° принимаемый контеÑÑ‚ рапорт (не номер ÑвÑзи) передаваемый контеÑÑ‚ рапорт (не номер ÑвÑзи) UTC дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾ умолчанию '%x %H:%MZ' дата в зулуÑÑком формате '%Y-%M-%D Z' зулуÑÑкое Ð²Ñ€ÐµÐ¼Ñ %H%MZ= 1 (on)AADIFAFCAFC режимДиапазон ÐПЧ (Гц)Спектр ÐЧХ или Ч/БAFC ÑкороÑтьALTRARQARQ controlAX25 ДекодироватьПрерватьДоÑтуп URLСоотношение S/N (dB)Диапазон автоподÑтройки (Hz)ДейÑтвиеДобавитьДобавить Ñигнал RSID к концу передачиДобавить Ð°Ð´Ñ€ÐµÑ Ð² поле примечанийДобавить отметку даты/времени Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ # полученного ÑообщениÑДобавить название Ñтанции METAR AddrÐдреÑОтрегулируйте чаÑтоту курÑорадробные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ 1 / N регулировки чувÑтвительноÑтиРегулировать ширину полоÑÑ‹ DSPРаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ:Ð’ÑеВÑе запиÑиВÑе наÑтройки могут быть изменены через меню наÑтройкиРазрешить ТХ поÑле Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñигнала (Ñекунд)Разрешить ошибкиРазрешить ТХ поÑле N Ñекунд поÑле Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ÑигналаРазрешить/Запретить изменениÑÐльтернативный цвет Ñимволов в Rx окнеВÑегда LSBÐ’Ñегда USBÐ’Ñегда показывать аудио чаÑтотуВÑегда включать новые режимы на Ñтих аудио чаÑтотахВÑегда передавать в центре 1500 ГерцÐнтенна ÑтанцииВид меток каждого каналаДобавить к текÑту RX:Добавить к текÑту TX:ПрименитьКнопки Ñо Ñтрелками - Контроль чаÑтотыÐудиоИнфо о звуковом уÑтройÑÑ‚Ð²ÐµÐ˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± аудио уÑтройÑтве доÑтупна только Ð´Ð»Ñ PortAudioÐудио файлÐудио чаÑтотаУÑтройÑтво аудиовходаÐудио на вÑпомогательный портÐудио или радио чаÑтоты по шкале водопадаУÑтройÑтво аудиовыходаДекодировать аудио иÑторию выбранного ÑигналаÐудит логаÐвто Ñоединить/повторÐвто Ñоединение, при отрытии fldigiÐвтоÑтарт ÑовмеÑтно Ñ fldigiÐвтозаполнение Страны и ÐзимутаÐвтоматичеÑкий контроль чаÑтотыÐвтоматичеÑкое отÑлеживание ÑкороÑти RxÐвтоматичеÑкий Ñпотинг при декодировании позывныхÐвтоÑтартДоÑтупные подÑтрокиÐазадФонЦвет фона Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº группы 1Цвет фона Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº группы 2Цвет фона Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº группы 3Цвет фона ÑˆÑƒÐ¼Ð¾Ð¿Ð¾Ð´Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ ÑÐ¸Ð³Ð½Ð°Ð»Ð°ÐŸÐ»Ð¾Ñ…Ð°Ñ Ñ‡Ð°ÑтотаДиапазонДиапазоны должны ÑовпадатьПолоÑа пропуÑканиÑБарометричеÑкое давлениеСкороÑть передачи данныхСкороÑть портаРуководÑтвоBehavior of s/n imdФонЦвет фонаБиты на ÑимволБраузерБраузер цветаОшибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€Ð° под файл: %s Ñтрока %dСообщить мне о Ñохранении запиÑей журналаИнфо о ÑборкеВыÑота кнопокКнопкиСтраныПозывной вÑегда ÑтрочнымиCAT команды Ð´Ð»Ñ PTTCPUЗагрузка процеÑÑора увеличиваетÑÑ Ñ Ð²Ñ‹Ñотой водопадаCQ STATECQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID режимыCW QSK Ñигнал на правый каналПолоÑовой dsp фильтр CWCW в LSBCW в LSB режимеСкороÑть CWCWI детектирование и подавлениеCWI порогУÑтановки CabrilloCabrillo...CallИÑкать позывнойИÑкать позывнойПозывной корреÑпондентаCallook.info lookup (беÑплатный ÑÐµÑ€Ð²Ð¸Ñ Ð´Ð»Ñ Ð¡Ð¨Ð)ПозывнойМожет иÑпользоватьÑÑ Ð²Ð¼ÐµÑто или в дополнение к другим типам PTTВыйтиЗахватПерехват рапортаЗахват и воÑпроизводÑщие уÑтройÑтваУÑтройÑтво захватаЗахват RX текÑта во внешний файлЗахват Ñигнала по Ñтому порогуЗахват Ñигнала в Ñтом диапазоне чаÑтотПередача:Многократный доÑтупÐеÑÑƒÑ‰Ð°Ñ Ñ‡Ð°Ñтота (Гц)Сдвиг неÑущейЦельÑиÑСигнал в центре диÑплеÑЦентр чаÑтотаВ центре полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ ÐŸÑ€Ð°Ð²Ñ‹Ð¼ кликом вернутьÑÑÐ¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸ÑИзменÑть ТОЛЬКО Ð´Ð»Ñ ÑкÑпериментовИзменить внешний вид приложениÑИзменить цветИзменить папкуУровень изменений логаПозиции от нижнего до выÑшего каналаИзменение файла макроÑовИзменение маÑштаба Ð²Ð¾Ð´Ð¾Ð¿Ð°Ð´Ð°Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу при Ñледующем запуÑке программыМетка каналаÐомер каналаколичеÑтво декодируемых каналовКол-во Ñимволов [] Параметр превоÑходит ожиданиÑСимволы не найденыОтметить вÑёПроверить дублиПроверить наличие обновленийПроверить наличие обновлений при запуÑке программыПроверить обновление...Ðажать еÑли LSB Ð´Ð»Ñ CWÐажать еÑли USB Ð´Ð»Ñ RTTYУÑтановите галку, чтобы получать уведомлениÑ, когда принÑли RSID не менÑÑ Ð¼Ð¾Ð´ÐµÐ¼ и чаÑтотыГалка, чтобы включить TCP / IP IO ÑоединениеГалка что бы включить UDP/IP IOПроверьте, чтобы уменьшить нагрузку на центральный процеÑÑор в режимах PSK и RTTY.Проверить обновлениеВыбрать папку, и Ñохранить документы KMLСработанные городаClassОчиÑтить данные KML ÑейчаÑ!ОчиÑтка при запуÑкеОчичтить KML док. Выгрузить Google Earth диÑплей.ОчиÑтитьОчиÑтить вÑёОчиÑтить текÑÑ‚ UDPОчиÑтить Ñтроки от текÑта поÑле # Ñекунд отÑутÑÑ‚Ð²Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑтиОчиÑтить ÑпиÑок?ОчиÑтить лог и уÑтановить RST 599/59ОчиÑтить Ñлементы ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð° уÑтановить TX RST 599/59ОчиÑтить Ð¿Ð¾Ð»Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° поÑле ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ макроÑом ОчиÑтить Ð¿Ð¾Ð»Ñ Ð»Ð¾Ð³Ð°?Очищать Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ñле ÑохранениÑОчиÑтить текÑтЗакрытьЗакрыть СпиÑокЦвет/ШрифтЦветЦвет текÑта Ð´Ð»Ñ Ð¸ÑходÑщего telnetЦвет маркера трекаЦвета && ШрифтыЦвет и курÑорКоманда %s игнорируетÑÑ, Ñ‚Ð¾Ñ‡ÐµÑ‡Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не поддерживаетÑÑКоманда %s игнорируетÑÑ, Ñтруктура команд не поддерживаетÑÑКоманда не найденаПарам командной ÑтрокиКоманда отÑутÑтвует ':'.Команды Ñтартуют при генерации kml файлов. ПодпроцеÑÑÑ‹ запуÑтить один раз, и перезапуÑтить в Ñлучае необходимоÑти.УÑловиÑКонфиг ÑкриптовПодтвердитьПодтвердить выходПодтвердить ÑброÑПодтвердить выходПодтвердить выход?СоединитьÑÑподключитьÑÑ Ðº MacLoggerConnect to host program on FLDIGI start upСоединитьÑÑ Ñ ÑерверомContКонтинентКонтеÑтыПринÑтый номерПринÑтый номерПереданный номерПринÑтый номерContest:КонтинентÐÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð°Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ°Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ‹ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² облаÑти Rx / TxПозывной заглавными буквамиКонвертерКопироватьКоррекциÑÐе удалоÑÑŒ Ñоздать каталогÐе открываетÑÑ url: %s Браузер не запуÑтилÑÑ: %s откройте URL вручную: %sÐе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить flmsgСтранаСтрана работающей ÑтанцииОкругСоздать 1000 Гц меандр на правом каналеСоздать cabrillo отчетСоздать ключевой меандр на правом аудиоканалеСоздать новый журналПользовательÑкий ÑдвигПоиÑк текÑтаCustom...ВырезатьDTMFDTR +12DTR +12 vDTR = +VDTR Ñто PTT ÑÐ¸Ð³Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸ÑDTR Ñто РТТ линиÑDX ClusterDXCCОбозначение DXCCDXCC клубыDXCC объектыТире/точекПоиÑк базы данныхХранилище баз данныхИÑточники файлов данныхОбновление файлов данныхData files...Сохранение времени в чаÑах (0 без ограничениÑ)ИÑточник данныхДатаDate OffDate OnДата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ QSOДата начала QSODate time ON == OFFОтладкаДекодировать (CWI подавлÑетÑÑ)Декодировать пакеты ÐÐ¥25 в читабельной формеДекодировать DTMF тоныДекодировать принÑтые DTMF тоныДекодировать SYNOP (Ex: Deutsche Wetterdienst) в ADIF лог файлДекодировать SYNOP (Ex: Deutsche Wetterdienst) в KML (Ex: Google Earth)По умолчанПо умолчанию 800 Hz. Deutsche Wetterdienst 850HzПо умолчанию RX RST 599/59По умолчанию TX RST 599/59По умолчаниюURL по умолчаниюDefault WPMПо умолчанию Ð´Ð»Ñ Ð²Ñех оÑтальных модемовПо умолчанию теÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока: "УмолчаниеЗадержка NN мÑек поÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð°Ð—Ð°Ð´ÐµÑ€Ð¶ÐºÐ° NN мÑек перед тем как отпуÑтить PTTЗадержка (мÑек) перед началом аудиоУдалитьУдалить запиÑÑŒ?Удалить локальные файлы данных, еÑли выбран.Удалить текущую запиÑьСнÑтьОпределен уровень ÑигналаУровень детектированиÑДетектор верхнего порогоДетектор нижнего порогаПорт:УÑтройÑтваРазница между Rx и Tx чаÑтотамиЦвет цифрЦифрыDimПуть каталога не найденПапка...Отключить диалог предупреждениÑВыключить вÑёОтключить изменение чаÑтотыОтключение дальнейшего Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении RSIDОтключить, еÑли flrig не иÑпользуетÑÑ.Отключить на медленных процеÑÑорах еÑли браузер Ñигналов не иÑпользуетÑÑОткл Ñпотинг, когда Ñигнал(Ñ‹) в браузере не видны.Выключить детекторДиÑплейДиÑплей RX в Ñ€ÐµÐ²ÐµÑ€Ñ Ð²Ð¸Ð´ÐµÐ¾ÐŸÐ¾ÐºÐ°Ð·Ð°Ñ‚ÑŒ Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° макроÑов при ÑтартеДиÑплей TX и RX в главном окне программы fldigi. Изменение требует перезагрузки fldigiОтображение времени в миллиÑекундахОтображать задержку передачи в миллиÑекундахÐе менÑть автоматичеÑки чаÑтоту RX RSIDÐе показывать диалоговое окно RSID предупреждениÑÐе иÑпользовать базы данных позывныхÐе иÑкать позывной через веб-браузерDocked scopeDomÐе ÑохранÑтьСоотношение точекПеретаÑкивать мышкой чаÑтоту водопадаЦвет дублÑПроверка на дублиДубльEEQSL полученоEQSL ОтправленоВÑтроенный Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ WefaxВыгрузить KML документы при запуÑке.ВключитьВключить -Вкл/выкл меню иконокВкл/выкл подÑказкиВключить ARQВключить ARQ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼, поддерживающих TCP и FLDIGI протокол ARQ . Включить KISS Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼, поддерживающих TCP/UDP и TNC-2 KISS протоколы. Может быть активным в любой момент времени только один Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ данных. Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² наÑтройках KISS/ARQ/XML требуют перезапуÑка программы.Вкл канал ЗанÑтоВключить CSMAВключение DSP перед декодеромВключить поток данныхВкл GPIO PTT Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð²Ð¾Ð´Ð°/вывода общего Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (Ð´Ð»Ñ Raspberry Pi)Включить гиÑтограммуВключить мониторинг Ñигнала порога ГиÑтограммаВключить KISSВключить MultipskВключить вÑёПоÑтавить галку, чтобы включить ÑоответÑтвующий контрольВключить перетаÑкивание курÑором шкалы водопадаВключить кодирование/декодирование Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð½Ð¸Ñ Ð¿Ð¸Ð»Ð¾Ñ‚-тонов ÑигналаВключить flrig xcvr в качеÑтве клиентаВключить Ð´Ð»Ñ Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð° текÑта в панели Rx одним кликомВключить Ð´Ð»Ñ Ð¾Ñ‡ÐµÐ½ÑŒ Ñлабых ÑигналовВключить, еÑли ваш компьютер не правильно декодируетВкл текÑтовый поток rxВключите Ñто при первом запуÑке fldigiВключите Ñту опцию Ð´Ð»Ñ Ð»Ð°Ñ‚Ð¸Ð½Ñких 1-подчеркнутых ÑимволовВключить Ñту опцию Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ UTF-8 ÑимволовВключите Ñто Ð´Ð»Ñ UTF-8 ÑимволовВключите Ñту опцию Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Ñтарт/Ñтоп тонаПоÑтавить Tx панель выше панели RxВключить, когда обе программы иÑпользуют один и тот же IP-адреÑВключеноДоÑтигнут конец ÑтрокиВвеÑти МЕТÐР данные, URL-адреÑВвеÑти QTC текÑтВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° других программВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° flampВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° fllogВведите полный путь-Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ flmsgВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° flnetВвеÑти полный путь Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° flrigВвеÑти Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° и путь Ð´Ð»Ñ Ð¸ÑполнÑемого файла tqslВведите полный путь папки cty.datВведите теÑтовую Ñтроку или оÑтавьте пуÑтым по умолчанию:Введите Ð²Ñ€ÐµÐ¼Ñ Ð² минутахОшибкаЧетныйЧетные линииЧетные линииСобытиеЖурнал ÑобытийПринÑтый номерПереданный номерExchange InПереданный рапортИÑполнÑемый файл Ð´Ð»Ñ Ð²ÑтавкиВыполнитьВыполнить команду KML файлов.Выполнение ÑценариÑ:% sВыходЗапроÑÑ‹ при выходеЭкÑпортУÑтановки ÑкÑпортаЭкÑпортировать отчеты Ð´Ð»Ñ Ð·Ð°ÐºÐ°Ñ‡ÐºÐ¸ LoTWЭкÑпортировать в ADIFЭкÑпортировать в CSVЭкÑпортировать в fixed field textЭкÑпорт...Извлечь файл Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ программой "wrap / flmsg"Извлечь через NN Ñекунд неактивноÑти.F-WPMFD classFD sectionFEC (прÑмое иÑправление ошибок)FFT обработкаFFT уÑреднениеОкно функций предварительного FFTFLMSG files...FSQФаренгейтПапка Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ факÑаМожно пропуÑтить вÑе Ñтраницы или выйти из маÑтера в любое времÑПолевой деньПозывной в полевом дне может быть личным позывным оператораField Day ClassПолевой деньРаздел полевого днÑФайл не найденОшибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¤Ð°Ð¹Ð»:ФайлЗаполнить Страна/азимут Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ cty.datФильтрПолоÑовой фильтрКоÑффициент полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ð¨Ð¸Ñ€Ð¸Ð½Ð° полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° по отношению к ширине ÑигналаФильтрациÑÐайти ÑтрануÐайти далееÐайти префикÑÐайти предыдущееÐайти:КонецФикÑ. интервалыFldigi config...ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ FldigiМаÑтер наÑтройки FldigiFldigi файл Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑ€Ð¾Ñа *.{mdf}Fldigi палитра *.palУÑтановочный XML-файл *.xmlСайт FldigiFloating scopeFlrig I/OРТТ от FlrigСбраÑывает буфер TX поÑле периода x, когда канал ЗанÑто оÑтаетÑÑ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ÐŸÐ°Ð¿ÐºÐ¸Ð¨Ñ€Ð¸Ñ„Ñ‚Ð¦Ð²ÐµÑ‚ шрифтаШрифтШрифт/цветШрифт:УÑтановить RST in/out 599/59СкороÑть диÑкретизации выберите "Native", еÑли "Auto" не очень хорошо работает на вашем аудио уÑтройÑтве.Позывной преобразовать ЗÐГЛÐÐ’ÐЫМИРаÑÑтоÑние между каналами 100 ГцУÑтановить date/time ON == date/time OFFLossless Ðудио кодек *.flacFree service courtesy of OKЧаÑтотаШкала/ПоказометрыЧаÑтотаЧаÑтота в MHzШкала чаÑтотыСдвиг чаÑтоты (800 Hz)ПолныйПолный рапортGPIOГлавнаÑÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÑŒÐ¡Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ 1000 Гц меандр на правом каналеСформировать прÑмоугольный Ñигнал на правом каналеГруппа 1Группа 2Группа 3Hamcall.netHamlib иÑпользуетÑÑ Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½ÑиверомHardware PTTÐ’Ñ‹Ñота полоÑÑ‹ макроÑовHell Параметры передачиHell Параметры передачиHiLite 1HiLite 2СпрÑтатьСкрыть окно передачиСкрыть окно передачи по умолчанию.Скрыть окно поÑле (Ñек):Ð’Ñ‹ÑокийВерхний предел чаÑтоты в ГцХоÑтинг:II/OIDIDsIFKPIFKP Raw ImageIOIOTAIP номер портаIP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ ARQ интерфейÑа IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn или имÑ: i.e. localhostIP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ KISS интерфейÑа IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn или имÑ: i.e. localhostIP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ XMLRPC интерфейÑа IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn или имÑ: i.e. localhostIP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ fllog интерфейÑа IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn или имÑ: i.e. localhostIP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ flrig интерфейÑа IP Ð°Ð´Ñ€ÐµÑ Ð² формате: nnn.nnn.nnn.nnn или имÑ: i.e. localhostITU zoneITUZЗадержка передачи данных перед отправкойИгнорировать дублиInПаÑÑивное времÑДюймы ртут Ñтолба.Включить чаÑтоту передачиСтоп-дата включительноИнфоЗадержка начала (мÑ)ИÑходное ÑоÑтоÑние DTRИÑходное ÑоÑтоÑние RTSÐачальное напрÑжение на DTRÐачальное напрÑжение на RTSÐктивациÑИнициализировать RigCAT интерфейÑИнициализировать hamlib интерфейÑИнициализировать H/W PTT Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ð¿Ð¾Ð»Ñ QSOВвеÑти Ñдвиг неÑущейВÑтавить текÑÑ‚ по умолчаниюВÑтавить файлВÑтавить полныйl METAR рапортВÑтавить нули в Xmtd Ñерийный номерВÑтавить маркерВÑтавить текÑтВÑтавлÑть текÑÑ‚ одним левым кликомИнтереÑные заметкиЧередование SYNOP и текÑÑ‚ÐедопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (NULL) в функции %s:%dÐеверный режим Ð´Ð»Ñ KISS IOÐеверный параметр функцииr 'char *file_name_path' (null)ÐедопуÑтимый параметр функции (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñкрипта)Ðеверный параметрОÑтрова в ÑфиреПроблемы в обработке ÑценариÑ:%sK3 A1A конфигурациÑKISSKISS controlKMLКаталог файлов KMLИнтервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ KML (в Ñекундах)Сервер KML включен (вкл/выкл)LOCLOTW полученоОтправлено LOTWПоÑледнее QSOЗадержкаОÑтавьте Ñто поле пуÑтым или обратитеÑÑŒ к http://www.pulseaudio.org/wiki/ServerStringsЛевый и правый каналы оба Ñодержат аудио Ñигналлевый клик очиÑтить текÑÑ‚ правый клик ÑброÑить чаÑтотуЛевой клик, чтобы выбрать цветLeft click: изменить режим Right click: конфигурациÑЛевый или правый клик вÑегда воÑпроизводит аудио иÑториюLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Цвет индикаторов на кнопкахОграничить движение ÐПЧ в Ñтом диапазонеЛиниÑ: %d Ошибка:%d %s (%s)Слушать Ñигналы в пределах Ñтого диапазонаLoTWКомментарий LoTWУдалить LoTW файлЗагрузитьЗагрузить палитруЗагрузите файл изображениÑЗагрузить поÑледний иÑпользуемый макрофайлЗагрузите или пропуÑтите файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐŸÐ¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ñ‹Ðµ форматы: PNG, JPEG, BMPЗагрузитьПутьLocate binaryМеÑто cty.dat fileÐайти иÑполнÑемый файлПуть к flampПуть к fllogПуть к flmsgLocate flmsg executableПуть к flnetПуть к flrigПуть к программе #1Путь к программе #2Путь к программе #3МеÑто tqsl иÑполнÑемого файлаЛокаторБлокБлокировка чаÑтоты передачиЛогРегиÑтрировать Navtex в Adif файлРегиÑтрировать Navtex в KMLРегиÑтрировать чаÑтоту RTTYРегиÑтрировать Wefax в Adif файлЗагрузить вÑе RX/TX текÑтыИÑточники логаЖурналРегиÑтроциÑПанель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¾Ð¼Ð¡Ð¼Ð¾Ñ‚Ñ€ÐµÑ‚ÑŒ позывнойLotW пользовательÐизкийLow = без ошибок Medium = 1 ошибка High = 2 ошибкиЧаÑтота Ñреза ФÐЧÐижний предел чаÑтоты в ГцÐижеÐижний пределÐижнÑÑ Ñ‡Ð°Ñтота внизу ÑпиÑкаID коды METAR ÑтанцийраÑположение METAR ÑтанцииMFSK ИзображениеMFSK image fileMT-63MYCALL вÑегда ÑтрочнымиMac LoggerMacLoggerÐадпиÑÑŒ на кнопке макроÑаШрифт ред. макроÑовМакро текÑтРедактор макроÑов - МакроÑЛокатор в формате EM64qv (6 Ñимволов)Ðтрибуты почтового ÑервераТолько маркерМаркерПунктирный текÑтВыбрать запиÑи журнала Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° загрузки LoTWÐаÑтроенный полоÑÐ¾Ð²Ð¾Ð¹ÐœÐ°ÐºÑ ÐºÐ¾Ð»-во открытых индекÑов доÑтигнуто.МакÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ð¾Ð³Ð¾ факÑа.Может потребоватьÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ размера панели Rx / TxСреднеРаÑпределение памÑти Error (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñкрипта)Объединить ADIF файлыСлиÑние...РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑообщенийИзмрительМиль / чаÑмиллиÑекундыМинимальный контрольМинимальное Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ ÑобытиÑмиРазноеÐет команды%s поÑле линии%dОтÑутÑтвует парные кавычки (")РежимРежим задержки (msec)ИÑпользуемый режимРежимы должны ÑовпадатьРежим Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ ширинеModemотÑтупы от полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ¼Ð° Модем ноÑителÑСигнал модема на левый и правый каналыМодулÑцииМонитор Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ TCP.Мониторить Ñигналы в полоÑе пропуÑÐºÐ°Ð½Ð¸Ñ Ð¿Ð»ÑŽÑ Ð¾Ñ‚ÑтупыМонитор передаваемого ÑигналаМышьУправлÑть макрокнопками мышьюМилиÑекунд между повторамиМилиÑекунд между поÑледовательными ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ÐœÐ½Ð¾Ð³Ð¾ÐºÐ°Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° ÑигналовМногоканальный Ð´ÐµÑ‚ÐµÐºÑ‚Ð¾Ñ€ÐœÐ¾Ñ ÑтанциÑMy callsign de CALLÐœÐ¾Ñ ÑкороÑть CW WPMNN3FJP Server IP AddressN3FJP Server IP PortN3FJP logsNBEMSNBEMS files...ÐЕ ÐÐБРÐРПОЗЫВÐОЙИмÑУзкий ФÐЧ еÑли изображение шумноеNavÐовыйÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ / Сохранить запиÑьСледующийÐетÐет ошибокÐе быÑтрее чемÐе указано Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°Ðе медленнее чемОкно запрета повторной передачиÐетÐормаÐÐ¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть падениÑÐет ÑценариÑ/тег не найденÐе работал раньшеПримечание: Эти пункты конфигурации полезны Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ fldigi на уÑтройÑтвах Ñ ÑенÑорным Ñкраном, например планшетахПримечаниеУведомлениÑТолько уведомлÑтьКол-во и раÑположение кнопокКоличеÑтво цифр в Ñерийном номереКоличеÑтво чаÑов данных хранитÑÑ Ð½Ð° каждом узле. Ðоль означает, что хранитÑÑ Ð²Ñе.OOKONON - поиÑк по вÑему водопаду OFF - Лимит поиÑка +/- 200 ГцON - Ñтарт по умолчанию OFF - keep current wf cursor positionON - ИÑпользовать поÑледний набор макроÑов OFF - ИÑпользовать уÑтановки по умолчаниюÐечетныйÐечетные линииÐечетные линииOlivвкл/выкл1 Ñтрока над Rx/Tx1 Ñтрока над водопадом1 Ñтрока под водопадомОнлайн помощьМодулÑциÑОткр...Открыть ÑпиÑокОткрыть файл в браузере по умолчаниюОткрыть в браузереОткрыть журналОткрыть файл макроÑовОткрыть папку ÑообщенийОткрыть Ñообщение Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ flmsgОткрыть палитруОткрыть файл rig xmlОткрыть шумодав через nn Ñек, еÑли RSID обнаруженОткрыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ flmsgОткрытьПоÑле уÑпешного захвата открыть папку NBEMSУправлÑть tqsl в пакетном режимеОператорПозывной оператораПозывной Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°Ð˜Ð¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°ÐŸÐ¾Ð·Ñ‹Ð²Ð½Ð¾Ð¹ оператора (еÑли отличаетÑÑ Ð¾Ñ‚ позывного Ñтанции)КорреÑпондентQTH оператораИмена Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²ÐžÐ¿Ñ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð² формате: param=val ...ОпцииПрочееOutИÑходÑщий порт, когда IP Ð°Ð´Ñ€ÐµÑ Ð¸ÑпользованПерегрузPSKPSK ReporterPSK/RTTY Viewer HiLite Color 1PSMPSM ÐттенюаторПорог ГиÑтограммы PSMPTT задержки дейÑтвительны Ð´Ð»Ñ Ð²Ñех типов CAT/PTTPTT включаетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ иÑточником звукаЗадержка PTT поÑле Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ (мÑек)PTT ÑвлÑетÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CAT (не аппаратное обеÑпечение)PTT тон на правом аудио каналеPTT иÑпользует hamlib командыPTT через Hamlib командыPWR-meterПалитра: Параметр не дейÑтвителен.ПаритетÐнализировать веÑÑŒ входÑщий текÑтЧаÑтичныйПередаваемый параметр не ÑоответÑтвует ожидаемому типу.ПарольВÑтавитьПути (Ñкрытые)Процент (%)ÐаÑтойчивоÑтьВыберите ÑкороÑть передачи данных из ÑпиÑкаПилот тонСоотношение пилот тона к ÑигналуВоÑпроизводить иÑторию при выборе каналаВоÑпроизведениеВоÑпроизводить непрерывно?УÑтройÑтво воÑпроизведениÑВоÑпроизведение:УÑтановите Ваш позывной.Интервал повтора (msec)Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ñле 2 Ñекунды курÑора на позываномПортПорт:ÐудиопортЗадержка поÑле запиÑи (msec)Контроль мощноÑти ÑигналаШкала мощноÑтиДетектировать вÑтуплениеÐажмите еÑли надо изменить адреÑ/портВернутьÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸ÑкаПечать CW / RTTY / THROB / CONTESTIA ÑтрочнымиПрог 1:Прог 2:Прог 3:Сохранить измененную конфигурациюСохранить Ð¶ÑƒÑ€Ð½Ð°Ð»Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Ñохранение лога при выходеЗапиÑать измененные макроÑыПометкиПровинциÑСработанные провинцииPseudo-FSK - правый каналPseudo-FSK на правом каналеPskmailФорма импульÑаДлительноÑть импульÑа (мÑ)PwrQRZQRZ cdromQRZ.comQRZ/eQSLQSKQSK на правом каналеQSLДата Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ QSLПолученные QSL в Ñту датуÐÐ´Ñ€ÐµÑ QSL бюроДата отправки QSLОтправленные QSL в Ñту датуQSL через..QSL-полученоQSL-отправленоQSOQSO ДатаQSO Date OffQSO Date OnВедение журналаQSYQTC:QTHQTH NicknameQthТихоТихий режим [-q], не открывать tqsl диалогRPCRSID receptionRST вÑегда 599/59RST полученныйRST переданныйRST(r)RTS +12RTS +12 vRTS = +VRTS Ñто PTT ÑÐ¸Ð³Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸ÑRTS Ñто РТТ линиÑУправление потоком RTS / CTSRTTYRTTY в USB режимеRX - раÑÑтройкаRx захват текÑтаRX ppmRX ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð¹ картыРадио чаÑтотаПриподнÑтый коÑÐ¸Ð½ÑƒÑ Ñ„Ð°ÐºÑ‚Ð¾Ñ€ формы импульÑаДиапазон +/- wpmДиапазон 1 ...3Диапазон 1 ...4Чтение шрифтов ...Удалить запиÑÑŒ Ð´Ð»Ñ "%s"?ПринÑтьИÑпользование приемаШирина приемного фильтраРежимы приемаПринимать ÑинхронизаторМакÑимальное чиÑло принимаемых Ñтрок (5000)ПоÑледние дейÑÑ‚Ð²Ð¸Ñ Ð² ÑеткеПрием flmsg файловpskreporter.infoЗапиÑÑŒ обоих каналовЗапиÑиПрÑмоугольноÑтьОбновить Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи в KML-файл (в Ñекундах)ПерезагрузПерезагрузить cty.datУдалитьУдалить позывной поÑле...ВоÑпроизведение аудиотрекаВ рапорт ARQ Ñреднее значение S/NÐ’ рапорт фактичеÑÐºÐ°Ñ Ñ‡Ð°Ñтота передачиЧаÑтота в рапорт (только при наÑтроенном RIG контроле)pskreporterСброÑСброÑить вÑе параметры на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию? Параметры вÑтупÑÑ‚ в Ñилу при Ñледующем запуÑке Файлы: fldigi _def.xml и fldigi.prefs будут удалены! СброÑПо умолчаниюВоÑÑтановление наÑтройки поÑледовательного (COM) портаСохранить чаÑтоту блокировки TX (LK) при переключении RSID на чаÑтоте RXПовторыИзвлечьИзвлечь Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ¼Ð°Ð˜Ð½Ñ‚ÐµÑ€Ð²Ð°Ð» повтора (msec)Интервал повтора (мÑ)РеверÑРеверÑировать правый/левый ÐºÐ°Ð½Ð°Ð»Ñ‹Ð ÐµÐ²ÐµÑ€Ñ Ð²Ð¸Ð´ÐµÐ¾Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ ÑкÑпортируемый LoTW adif файлПроверить lotw.adif файл прежде, чем поÑлать Ñ tqslRigRIG контрольФайл ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñивером:Rig уÑтановкиRig требует ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ°Ð¼Ð¸ RTS/CTSRig требует ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ°Ð¼Ð¸ Xon/XoffRig иÑпользует ÑвÑзку RTS/CTSRig/Log КонтрольRig:RigCATRigCAT иÑпользовать Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½ÑиверомПравый каналВправо/Влево Выбрать наименьшее иÑпользуемое чиÑлоПраво/лево = 1 x LSD Вверх/вниз= 10 x LSD Shift - Право/лево = 100 x LSD Shift - Верх/низ = 1000 x LSDRsIDПринÑтый RSTПереданный RSTВыполнить программуЗапуÑтить программу:RxRx / Tx ПанелиRx AGCRx Ð’Ñ‹Ñота в пикÑелÑÑ…Rx ПараметрыRx TextRx WPMМножитель ширины RxRx фонRx шрифтRx/TxÐабор Ñимволов (Ð”Ð»Ñ ÐšÐ¸Ñ€Ð¸Ð»Ð»Ð¸Ñ†Ñ‹ 1251)S-meterS/N and IMD behaviorSELSKIPSOM декодированиеSQL-1SQL-2SYNOP в ADIFSYNOP в KMLЧаÑтота диÑкретизацииСохранитьСохр...Сохранить конфигСохранить как..Сохранить изменениÑ?Сохранить конфигурацию?Сохранить измененные макроÑÑ‹?ЗапиÑать изображение как монохромноеСохранить журнал?Сохранить журналЗапиÑать файл макроÑаСохранить палитруСохранить текÑÑ‚ какСохранить изображение в виде файла PNGСохранить палитруСохранитьЦвет шкалыФайл ÑкриптаПуть к уÑтройÑтву Ñкрипта не найден.Файл ÑÑ†ÐµÐ½Ð°Ñ€Ð¸Ñ Ñодержит потенциальные проблемы ОбратитеÑÑŒ к Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ð¸Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (путь) недейÑтвительноПрокруткаВыпадающие подÑказкиИÑкать Ñтот позывнойПоиÑк по ÑетиДиапазон поиÑка (Гц)ПолоÑа поиÑкаДополнительный текÑÑ‚ÑекундыРазделВыбратьВыбрать # Ñтоп битыВыбрать вÑёВыберите КонтеÑÑ‚ и Ð¿Ð¾Ð»Ñ CabrilloВыбор полей Ð´Ð»Ñ ÑкÑпортаВыберите ÑоÑтоÑние PTTВыбрать запиÑÑŒ Ð´Ð»Ñ ÑкпортаВыбрать Rx/Tx набор ÑимволовВыберите раÑтровый шрифт ТХВыбрать Ñ‚ÑгВыбрать фильтрВыбрать ÑкороÑть передачи данныхВыбрать Ñдвиг неÑущейВыберите уÑтройÑтвоОпределите как колеÑо мыши ведет ÑÐµÐ±Ñ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ водопадаВыбрать линиюВыбор режима Ð´Ð»Ñ Ð´Ð¾Ñтупа к менюВыбрать номер тонаВыбрать паритетВыберите номера контактовВыберите файлВыберите тип FFT фильтраВыберите Ð´Ð»Ñ Elecraft К3 Другие радиоÑтанции в Ñтом не нуждаютÑÑ.Выбрать шрифт водопадаВыбор цвета фона Rx Tx панелейОтправитьCW короткие 0 и 9Отправить Позывной в CW в конце каждой передачиОтправить зарегиÑтрированые QSO в LoTWОтправлÑть непрерывный поток теÑтовых ÑимволовОтправить в Ñтом WPMОтправлÑть маÑк каждый ...ОтправлÑть непрерывноОтправить поток данных непоÑредÑтвенно на выполнение flmsgПередать изображениеОтправить изображение...ПоÑлать lotw.adif через tqslОтправить отчет о приеме при региÑтрации QSOОтправить отчет только тогда, когда QSO региÑтрируетÑÑПередать rx текÑÑ‚ в файл: textout.txtОтправленные и полученные факÑÑ‹ запиÑÐ°Ñ‚ÑŒÑ Ð² ADIF.Символы в облаÑти Rx / TxПринÑтый номерПереданный номерПринÑтый Ñер. номерПереданный Ñер. номерSet>0, еÑли иÑпользуетÑÑ Ð¸Ð¼Ð¿ÑƒÐ»ÑŒÑный PTTУÑтановки шумодаваУÑтановить уровень Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ проÑмотраУÑтановите количеÑтво Ñимволов в ÑтрокеУÑтановите тип диÑкретизатора Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ð¸ ÑмещениÑУÑтанавить пороговый уровень Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ… выше ÑƒÑ€Ð¾Ð²Ð½Ñ ÑˆÑƒÐ¼Ð°Ð£ÑтановкиФормы TxКороткое вÑтуплениеКраткое опиÑание антенныПоказатьПоказать объекты DXCCПоказать таймер TXПоказать окно предупреждениÑПоказать вÑе модыПоказать и включить кнопку Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð° (PSM)Показать полоÑу на водопадеПоказать каналыКурÑор в центре линииПоказать меньше режимовПоказывать коды ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑ€Ð¾ÑамиПоказать макро редакторПоказать больше или меньше водопадаПоказать иконки в менюПоказать пароль в виде проÑтого текÑтаПоказать подÑказкиПоказать передаваемый Ñигнал на Ð²Ð¾Ð´Ð¾Ð¿Ð°Ð´ÐµÐ‘Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа:Уровни ÑигналаБраузер ÑигналаЦвет ÑƒÑ€Ð¾Ð²Ð½Ñ ÑигналаБраузер ÑигналовУровень ÑигналаДиапазон Ñигнала (dB)ПоиÑк ÑигналаДорожка ÑигналаРазмер:Пропущенные Ñимволы в панели Tx (Tx on/off Ð´Ð»Ñ CW)Повернуть диÑплей выше по чаÑтотеПовернуть диÑплей ниже по чаÑтотеРегулÑтор цвета фона ÑˆÑƒÐ¼Ð¾Ð¿Ð¾Ð´Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ ÑигналаМедленный процеÑÑор (менее 700 МГц)ÐœÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ ÑкороÑть падениÑДекодировать програмные битыДекодировать програмные ÑимволыПрограммно реверÑировать правый/левый каналыИзменениÑ, Ñделанные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑÑ†ÐµÐ½Ð°Ñ€Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚ программу Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ активны поÑле перезагрузкиСортировать по Date/Time OFFÐ—Ð²ÑƒÐºÐ¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°Ð—Ð²ÑƒÐºÐ¾Ð²Ð¾Ð¹Ð¡Ð¿ÐµÑ†. ÑимволыСкороÑть (WPM):SpotterСпоттинг отключенПодавлениеУровень шумодаваОткрыть шумодав (Ñек)СтартДата началаДата начала ÑкÑпортаСтарт flampСтарт fllogСтарт flnetСтарт flrigЗадержка PTT перед началом передачи (мÑек)Старт prog1Старт prog2Старт prog3Стартовый номерШтатШтат должен ÑÐ¾Ð²Ð¿Ð°Ð´Ð°Ñ‚ÑŒÐ¡Ñ‚Ð°Ð½Ñ†Ð¸Ñ / ОператорПозывной корреÑпондентаПозывной Ñтанции:Локатор корреÑпондентаЛокатор ÑтанцииЛокатор ÑтанцииQTH корреÑпондентаQTH Ñтанции:ПозывнойStation heard twiceСетка ÑтанцийСтоп ДатаСтоп битыСтопбитыЗапомнить моду и чаÑтоту Правый клик Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑмотраПредÑтавить каждое QSO, как зарегиÑтрированоеУкажите пароль Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ закачкиПредÑтавить закачку adif файла в LoTWСубÑкрипт выполнен неудачноСоздание Ñолнечных пÑтен!ПереключитьÑÑ Ð½Ð° ARQ I/OSynopСиÑтемный цветСиÑтемныйT/RTCP/IPTCP/IP Поток данныхTTYTX - раÑÑтройкатаймер ÑброÑа буфера TX (Минут, 0=Выкл)Ð’Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ð¼Ð¾Ñ‰Ð½Ð¾ÑтьTX WPMTX генерациÑTX ÑмещениеTX ppmTX ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð¹ картыЦветЗакладкиИÑточники данныхтемператураТеÑтТеÑтовый ÑимволТеÑтовые Ñимволы Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²ÐºÐ¸ QSKТеÑÑ‚ текÑтового файлаTest...Захват текÑтаЦвет текÑтаТекÑÑ‚ ПодÑвечиваниÑТекÑтовый файл Ð´Ð»Ñ Ð²ÑтавкиТекÑÑ‚ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñ‹Ð¢ÐµÐºÑÑ‚...Содержание Ñообщений и уведомлений RsID и характериÑтики диÑÐ¿Ð»ÐµÑ Ð½Ð°ÑтраиваютÑÑ Ð² наÑтройках диалогового окна "УведомлениÑ" .СкороÑть CW по ÑƒÐ¼Ð¾Ð»Ñ‡Ð°Ð½Ð¸ÑŽÐ˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° запиÑываетÑÑ Ð² текÑтовой облаÑти RXПоле не должно быть пуÑтым.РегулÑрное выражение должно быть допуÑтимым.ТеÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока не ÑоответÑтвует Ñтому Ñобытию в шаблоне поиÑка.МаÑтер проведет Ð²Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· оÑновные наÑтройки fldigiЭти теги могут также иÑпользоватьÑÑ Ð² Выражение Ñтого ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным.ThorВремÑÐ’Ñ€ÐµÐ¼Ñ (Ñек)Time OFFTime ONÐ’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ†Ð°Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ QSOÐ’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° QSOÐ’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ повторами в мÑÐужное времÑТайм-Ð°ÑƒÑ‚Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´ÑƒÐ±Ð»ÐµÐ¹Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÐ¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ QSKК кому подключаемÑÑПереключениеПереключение DTR Ð´Ð»Ñ PTTПереключение RTS Ð´Ð»Ñ PTTПродолжительноÑть тона (secs)ТоныОтÑлеживать ÑкороÑть CW в WPMОтÑлеживаниеПеревод прÑмо на flmsgСкороÑть передачи, X1-нормальноПередатьЗадержка передачи Ð´Ð°Ð½Ð½Ñ‹Ñ…Ð’Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ð¼Ð¾Ñ‰Ð½Ð¾ÑтьИÑпользование передачиПозывнойПередаваемый шрифтПередавать Ñтрочные Передать нижний начальный тонПередаваемый режим IDРежимы передачиПереодичеÑÐºÐ°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° (.) в режиме ожиданиÑИÑпользовать уÑилительПередаваемый ÑигналПередаваемый текÑтПередать верхний начальный тонПередача/ПриемТреугольноÑтьДве Ñтроки Ñхема 1Две Ñтроки Ñхема 10Две Ñтроки Ñхема 2Две Ñтроки Ñхема 3Две Ñтроки Ñхема 4Две Ñтроки Ñхема 5Две Ñтроки Ñхема 6Две Ñтроки Ñхема 7Две Ñтроки Ñхема 8Две Ñтроки Ñхема 9TxTx ПараметрыTx выше RxTx фонTx шрифтУровень аттенюатора Tx (dB)TxIDUUDP/IPИнтерфейÑЯзык интерфейÑаВид интерфейÑаСработанные штатыÐмериканÑкие единицы раÑÑтоÑÐ½Ð¸Ñ (QRB)Ðе удаетÑÑ Ñоздать файл %s (Ошибка No=%d) func %s:%dне открылÑÑ Ñ„Ð°Ð¹Ð» %sОткл еÑли KML не иÑпользуетÑÑÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°ÐазадÐеожиданный конец файла доÑтигнут.Конец параметра (аргумент []) ÑпиÑок найденÐеожиданный конец параметра контрольного ÑпиÑка найденÐе иÑпользуемый форматОбновитьОбновить выбранные локальные файлы данных из репозиториÑСайт обновлений не доÑтупенОбновить текущую запиÑьВышеВерхний пределВерхний уровень ÑигналаИÑпользовать "cr cr lf" Ð´Ð»Ñ "cr lf"ИÑпользовать CD жеÑткий дикÑИÑпользовать DSP фильтр до декодераВкл. DTRÐ¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ FarnsworthИÑпользовать HamlibИÑпользовать маркер чаÑтотыИÑпользовать OSS audio serverОткрыть Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° файлаИÑпользовать порт Audio serverИÑпользовать Pulse Audio serverВкл. RTSИÑпользовать RigCATИÑпользовать уÑÑ€ÐµÐ´Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ ÑˆÑƒÐ¼Ð° водопадаВкл. цветные кнопкиЗапиÑывать в лог date/time offÐачать Ñ Ð½ÑƒÐ»ÐµÐ¹Ð˜Ñпользовать параллельный порт PTTИÑпользовать пароль Ð´Ð»Ñ Ð´Ð¾Ñтупа к tqslИÑпользовать отдельный порт PTTИÑпользовать маленький шрифтИÑпользовать алгоритм Витерби Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ¹ коррекции ошибок Лучше вÑего работает Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ поддерживаемых Ñимволов.ИÑпользовать Ñто раÑположение tqsl ÑтанцииИÑпользовать uHRouter PTTИÑпользовать Ð´Ð»Ñ PSKmail и набора программ FLDIGIИÑпользовать Ð´Ð»Ñ BPQ32User IDИнтерфейÑИмÑВкл UDP портVSP ВключитьПериод выборки Ñигнала в миллиÑекундахПодробноСравнитьСравнить базу данных Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ загрузки LoTWСравнить базу данных Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ загрузки eQSLВерÑÐ¸Ñ %s доÑтупна на Source ForgeВидеоВидео вÑтупление IDВидПоказ/Скрыть 48 макроÑовПоказ/Скрыть КаналыВиртуальный ЭмулÑтор ПоÑледовательного порта - отключает ПРЕДУПРЕЖДЕÐИЯВидимые режимыПоÑетить веб-Ñайт HamcallПоÑетить QRZ.comПоÑетить веб-Ñайт hamQTHÐ’ÐИМÐÐИЕ - будут перезапиÑаны вÑе наÑтройкиВодопадУвеличение водопадаУправление переключателÑмиИÑториÑÐеÑущаÑСкороÑть падениÑМодулÑциÑУровень передачиWFxWXДождитеÑÑŒ ответа на первую команду CATДождитеÑÑŒ ответа на поÑледующие командыИнтервал Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (мÑ) перед чтением ответаВниманиеВодопадВодопад / FFT / ScopeÐаÑтройка водопадаСкороÑть Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð²Ð¾Ð´Ð¾Ð¿Ð°Ð´Ð°Ð’Ñ‹Ñота водопада в пикÑелÑÑ…WavЧаÑтота диÑкретизации запиÑиRX Погодных факÑÐ¾Ð²Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов погодыWebПоиÑк в WebÐ’ÐµÑ (%)ДейÑтвие колеÑаГде ÑохранÑÑŽÑ‚ÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ‹, Ñформированные в формате KML.ШиреСкороÑть ветраРазделители ÑÐ»Ð¾Ð²ÐŸÐµÑ€ÐµÐ½Ð¾Ñ ÑловаЗапиÑать текущий набор макроÑов при выходе из программыЗадержка запиÑи (ms)Задержка начала (msec)XMITXMLФикÑÐ°Ñ†Ð¸Ñ Ñ‡Ð°Ñтотыуправление потоком XON/XOFFYДаВы иÑпользуете поÑледнюю верÑиюУ Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть уÑтановлена и наÑтроена программа tqsl (http://www.arrl.org/tqsl-download)Вам нужно оплатить уÑлуги доÑтупа к ÑервиÑу HamcallВам нужно оплатить уÑлуги доÑтупа к ÑервиÑу QRZВведите ваш логинВаш логин парольВаш пароль/логин tqslaaпоÑлеВÑегда добавлÑть в файл(Ñ‹)ÐвтоматичеÑÐºÐ°Ñ Ð·Ð°ÐºÐ°Ñ‡ÐºÐ° данныхВ принÑтом текÑте инфо о позывномchannels != 1Ñимволыочищать данныеКонвертировать позывной в ÑтрочныеКонвертировать позывные в ÑтрочныйПапка Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸Ñ‚ÐµÐºÑƒÑ‰Ð¸Ðµ уÑÐ»Ð¾Ð²Ð¸Ñ WXУмолчаниеПо умолчанию date/time onОтображать PSM в главном диалогеПоказывать в Rx окне ASCII ÑимволыeQSLeQSL Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÐ£Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑ€Ð¾Ñами мышьюflamp:fllogfllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrigflrig ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ методом ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½ÑиверомПараметры flrig xmlrpc Ñервера Эти параметры отобразÑÑ‚ÑÑ Ð²Ð¾ вкладке конфигурацииflrig:Ðапример 1) UUEE 2) 161500Z 3) 07008MPS 4) 9999 5) DRSN 6) SKC 7) M17/M23 8) Q1028 9) NOSIG 10) RMK 11)Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° обменаie: /home/dave/CALLBK/ or C:/CALLBK/ Ðе заполнÑйте, чтобы иÑкать базу данныхв:км / чаÑФикÑ. водопад на 1500 ГцмбарминутыСила пилот-тона (dB)Показывать ^! иÑполнÑемые коды в Rx панелиrcos timing coefficient: 1.0 ... 2.0 W1HKJ Ñоветует 1.275 Ставьте 1.5 и морочте голову.отчетотчет по ЦельÑиюотчет по Фаренгейтудюймов отчет о ртутном ÑтолбеОтчет километров в чаÑотчет миль в чаÑотчет миллибар отчетыÑекундшрифт браузеравыбрать по датеОтправить в лог (макроÑÑ‹ , )tqsl:ЧаÑтота треканеизвеÑтный Wave файлТолько водопад{NAME} Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ñ€ÐµÑпондентаfldigi-4.1.06/po/de.gmo0000664000175000017500000021471413515625025011512 00000000000000Þ•VÌ"É|E \¡\¦\»\*Ö\]]0] 7]B]H]N]W][]_]e]g]‚m] ð]Vý] T^ ^^k^m^!r^”^©^®^³^É^Î^à^ú^_&_=_R_%k_"‘_´_Ä_&Ý_``"/`R`&W`~`—`¨`¹`¿`+Ä`ð`a+aFa Za {aœa ²a¾aÏaâaóabb/#bSbkb‚b"ŸbÂbÖb!ñbc0cLc"\c+c«cÊcãc óc'd(dGdcdhdˆd(¦dÏd îde "e"0e'Se{e€e•e&³eÚeðeff,f@fEf IfVfef uff’f —f£f©f°f$´f&Ùfgg1gIgCMg ‘g&žg Åg ÐgÛg,ùg&h#/hShfhyhh…hD—h Ühçh÷h* i5iIi2_i’i²iÐiÙiõi,j >jHj]jbj)jj)”j)¾j1èjkk 0k:k Nk Xkcktkˆk‘k¤k«k³kÇk çkòkùk l l l)$lNlVlZlcljlol rl~lŽl­l ÅlÏlßl îlúl ÿl mm4(m]m8fmŸm¦m®mËm Úm#ûmn(n ?nMnUn&nn •n¡nÁn Ûn ün oo(o=o+To €oŽo7o Õo àoêoÿo'p9pWNp/¦pÖp'îpq-qDq5Wqq “q0q Îq3Úqr r.r 4r?rErYrir|r‘r­r ÁrÌr Ôr ârïr*s,s2s:sTsjs„s s—s¬sÈs çsñs östt;4tpt†tŽt¨t+¯tÛtòt uu "u,u0u5u =uGuPuguwu|u Œu šu¦u·uÍuàu òu v vvv"v1vBvVv\vnv+vv¢v¼v Øväv#w%w5wQwqw#zwžw¥w¿wÈwÞwîwxx%x,-x Zxfxmx qx~x “x/Ÿx:Ïx8 yCyUyJ]y!¨yÊy*çy zz #z1.z `zjz …z z ›z§z,ºzçzîz÷z{1{M{ l{9w{±{2Î{*|,| 4|"B|-e|“|®|´| ¹|Ä| Ê| Ô| à|í|}%} *} 7}D}X}k} ‹}:•}Ð}Ö}Ú} é}÷}~$~ +~ 6~:W~’~ —~3¥~Ù~à~ô~) G Q _ i v„‹’¢³È$ä €$€C€V€e€m€ r€}€…€!‹€/­€#Ý€ ">C ISdt ’ž4¦,Û‚‚‚ ‚,‚3‚ O‚\‚e‚n‚$‡‚¬‚ÂÈ‚ã‚é‚ì‚ð‚õ‚þ‚ƒƒƒ+ƒJƒiƒnƒ…ƒ œƒ§ƒà ߃!„"„?„S„g„,v„ £„ ±„ ½„Þ„ð„………/… N…\…`…Ii…0³…9ä…†.=†0l†Ï†m‡2‹‡$¾‡ã‡æ‡ë‡þ‡:ˆIˆQˆUˆ\ˆpˆ‚ˆšˆ ²ˆ¿ˆ׈$‰A‰^‰f‰~‰ ‚‰£‰¾‰щñ‰ ŠŠŠ'Š/Š FŠ SŠ]Š2aДЮР´ŠÀŠЊÖŠ éŠôŠ‹ ‹+‹B‹[‹b‹r‹ {‹ˆ‹™‹µ‹º‹ ¿‹Ë‹Û‹ì‹ ò‹'Œ(Œ/ŒJŒ#PŒtŒ‹Œ«ŒÂŒÖŒéŒïŒ &?OTXqvy ´¹ÀÒØ Þ ì!ø!Ž<Ž?Ž BŽ;cŽ1ŸŽÑŽÕŽ ÙŽãŽêŽ =M_oƒ ›¨(ºãó/û+4 DR/a‘™Ÿ£¨ ¬ ¹Äã&‘)‘#C‘ g‘ˆ‘ Ÿ‘©‘°‘ȑёבæ‘ÿ‘’"’ 2’<’/\’Œ’ ’’œ’Ÿ’#²’0Ö’““““<“O“j“„““¨“!Óå“ í“ ù“”” ”””'”+” F”T” n”|”’”𔣔¬” µ” ” Δ*Ú”• • •••$•(•,•;•D•M•T• \•f•o•†•–•«•°• ÕΕÕ•î• þ• ––<–D– ]–k–„–– ²–¼– Á–Í–â–÷–þ– —;—P—X—•^—ô—˜$˜&5˜\˜d˜‚˜–˜š˜¢˜ ¾˜̘ Иܘò˜!û˜"™@™[™`™g™ ƒ™‘™ –™£™ ¬™ ¸™Å™È™Ï™Ø™à™æ™û™ÿ™ ššš š)š.š 7šªCš îšùš›+›@›^›p› €› ›,š›Ç›Ù›á›ç› î›û›œ#œ5œGœVœ^œeœzœ œ ˜œ¹œÑœêœ &7O d7r ª¶Ó êø ž<4žqž*ž¸ž0О+Ÿ-Ÿ>Ÿ PŸ [Ÿ(iŸ#’Ÿ0¶ŸçŸ      ( 7 J $e Š “ ° µ È Û "ê  ¡ ¡<¡Y¡j¡|¡›¡«¡ Ç¡!Õ¡ ÷¡¢¢¢+¢ :¢G¢ Y¢ g¢u¢{¢.—¢Æ¢9Ü¢ £ !£.£3£;£D£V£ ^£l££‚£ ˆ£“£ ©£ µ£ Á£ Í£Ù£ õ£ ¤ ¤¤)¤/¤@¤T¤ i¤ s¤}¤-†¤ ´¤¿¤ƤʤÓ¤ Ú¤ä¤ë¤ ¥¥¥(¥/¥ G¥S¥ X¥!b¥ „¥‘¥ ™¥¦¥¸¥Ì¥Õ¥qÝ¥O¦+d¦/¦%À¦:æ¦;!§+]§‰§ާ “§§¦§®§·§¿§Χß§ ü§ ¨¨(¨/¨>¨]¨d¨j¨s¨¨–¨¥¨ ·¨ŨÖ¨å¨ù¨ ©© .©9©L©Q©T©]©e©!~© ©¥© ¨© ´©¾©Ù©Þ©ñ©ø©ª ª$ª<ªWªlªŠª¨ª°ª ƪѪ"æª ««6« >«)I«s«‡«œ«+¼«è«ú«¬-¬<¬D¬ S¬]¬ n¬y¬¬‡¬–¬¨¬­¬0À¬ ñ¬ÿ¬­)­?­H­ Y­d­l­o­ w­­™­¬­Á­Ü­ï­®®®"® 5® @®M®)d®Ž®%“®¹®È® Ø®'â® ¯¯ ¯6¯I¯"M¯5p¯1¦¯دè¯ü¯ÿ¯°"° >°L°R°#h°Œ°¦° «°'µ°ݰä°ë°ó°± ±±±+±G>±†±бœ±¢±Gª±ò±ù±²²5²K²\²d²l²€²+² »²Dzß²ó²Ÿ ³©´®´%Å´6ë´"µ3<µpµ vµ„µе‘µšµ µ¤µ¬µ®µ‡´µ <¶hI¶ ²¶ ¼¶ɶ˶(жù¶···1·$6·[· x·™···Í·ß·,ù·0&¸W¸j¸*†¸±¸Ǹ&ู& ¹3¹K¹\¹m¹s¹6x¹¯¹ ɹ+깺(0º/Yº‰ºžº±ºʺߺòº»»6/» f»‡»š»#·»Û»û»!¼8¼X¼w¼*•¼1À¼"ò¼½1½ O½.\½%‹½'±½Ù½#Þ½$¾('¾!P¾#r¾–¾ ­¾%¹¾.ß¾¿¿(¿*E¿p¿‰¿¢¿¹¿Ò¿ë¿ð¿ ô¿ÀÀ'À;ÀXÀ ]ÀkÀsÀ zÀ%†À.¬ÀÛÀöÀÁ/Ák5Á¡Á$±Á ÖÁ àÁêÁ@ ÂKÂTÂr„–Ÿ¥Â>À ÿ ÃÃ%-ÃSÃfÃKÃ1ËÃ$ýÃ"Ä3Ä(7Ä1`Ä ’ĜijĻÄ-ÂÄ-ðÄ-Å8LÅ…ÅŠÅ ªÅ µÅ¿Å ÈÅÓÅìÅ ÆÆÆ&Æ.Æ CÆdƃƉƘƠƶÆ4ºÆïÆ÷ÆûÆÇ ÇÇ ÇÇ#.ÇRÇ kÇvÇ”Ç «Ç·Ç¼ÇÔÇåÇBÈ FÈDQÈ –È È©ÈÈÈ(×È)É *É4ÉIÉ]ÉeÉ?ƒÉ ÃÉ!ÏÉ$ñÉ#Ê :ÊHÊWÊiÊ€Ê<™ÊÖÊ íÊ:úÊ 5ËCËVËqË%…Ë«ËmÆË54Ì&jÌD‘Ì$ÖÌûÌÍ71ÍiÍrÍ3͵Í5ÅÍûÍÎ +Î7ÎHÎNÎhÎ}ÎÎ ¥Î ÆÎ ÔÎ àÎíÎ ÏÏ*3Ï^ÏdÏ&lÏ&“Ï ºÏÛÏ äÏîÏ"Ð+Ð IÐSÐ \Ð!hÐ!ŠÐH¬ÐõÐÑÑ3Ñ58ÑnÑ‡ÑžÑ¾Ñ ØÑ äÑñÑöÑþÑÒÒ-ÒCÒHÒXÒiÒzÒ”Ò«ÒÂÒÔÒ åÒòÒ øÒÓ Ó#Ó2ÓHÓNÓdÓ-mÓ›Ó¶Ó ÓÓ!àÓ"Ô%Ô8ÔSÔgÔ&pÔ—Ô Ô »ÔÈÔÞÔíÔÕÕ&Õ3.Õ bÕoÕwÕ {Õ‡Õ ¡Õ3«ÕLßÕ?,ÖlÖÖE‰ÖÏÖ$ïÖ1×F×X×\×,l× ™×£× ¿× É×Ô×å×#ý× !Ø -Ø/;Ø'kØ“Ø#²Ø ÖØ6àØ&Ù0>Ù<oÙ ¬ÙºÙÊÙ3æÙÚ9Ú@Ú GÚUÚ^Ú pÚ |Ú‰Ú¦ÚÄÚÌÚ åÚòÚ Û'%ÛMÛH\Û¥Û«Û¯Û ÀÛÎÛìÛýÛ ÜÜK-ÜyÜ~Ü<”ÜÑÜØÜêÜüÜ+Ý BÝ LÝXÝhÝw݈ݎݕݦݾÝÓÝ&óÝÞ"/ÞRÞ eÞqÞxÞ €Þ Þ˜Þ'¡Þ(ÉÞ)òÞ"ß7?ßwß|ß…ßŽßžß­ß ËßØß ïß4ùß0.à_àhàqà zà†à$à ²à¿àÇàÏà#æà á&á+á?áEáHáLáQáZá_átáxá”á$®á Óáßáüáâ'âGâgâ!ƒâ¥âÂâßâ÷â0 ã;ãPã+_ã‹ã¡ã»ãÏãÓã"éã ä#ä 'äK3ä.ä@®ä-ïä;å)YåÒƒåVæ<kæ%¨æÎæÑæ׿ êæMõæCçIçQçXçlç†çç ´çÁçÔçëçèè2èJèRèhè#lè"è³è&Èèïèééé.é6éOé géué3}é±éÌé Ôéâéòéøé êê,ê"3êVêkêˆêê¬ê¿êÑê"íêë ë%ë<ëWëwë }ë-‹ë¹ëÀëØëÝë$öëì:ìOìgì†ìŒì«ì*¼ìçìíí" í-í5í:íUíní‰íí–í²í Åí ÑíÞí#òí"î9î>î)BîClî>°îïîóîüî ï"ï 7ï Cï Oï&]ï„ï—ï­ï¾ïÙïõïð9ðWðið4qð¦ð¯ð ÃðÐð5ãðñ"ñ)ñ-ñ3ñ 7ñDñ"Sñ"vñ-™ñÇñ$âñ#ò+ò CòMòVòqò zò„ò–ò ´ò¿òÝò îò%úò3 óTó Zódógó)…ó<¯óìóôóüóô#ô >ô_ô|ô „ô¥ô&Áôèô ðô úôõ õ õõõ(õ,õGõYõtõƒõžõ ¦õ ´õ ÁõËõÚõ êõ=öõ4ö8ö <öJöNö`ödö hö uö ƒöö—ö Ÿö©ö²öÏöäöûö÷÷.÷5÷N÷]÷m÷‡÷ §÷±÷Ë÷Ü÷ù÷ø'ø 8øBøKø`ø uøø ”øGžøæøîø¨ôøù-·ùåù4úù/ú!>ú`ú}úú Šú «ú¹ú¿úÏú ëú'÷ú(û!Hûjûqû*xû £û±û ¶û ÄûÑûåû÷ûúû ü üüü2ü6ü;üKüQü Wü bü lüzüŸ’ü2ýCý#bý†ý'£ýËýãýøýþ-!þOþ gþ qþ }þ‡þ–þ³þÅþÖþóþÿ ÿÿ4ÿ Gÿ%Uÿ{ÿ-›ÿÉÿ!æÿ!7PlB~ÁÒî #BFX Ÿ'À è2 6<!s• «·1Æ'ø. "O r ~Š£ ¼Ê!ê+  8Fck‚–'° Ø"æ 'F"\“± Ä åñ÷ '3 F S`!i1‹½TÛ 0;RW_h }Šžµ¸ ¾É ä ð ü % : F R ^j p‘%© ÏÚã:ì ' 2 9  = K  R \ c |  ‚  ª ±  Í Ø  Ý  é    . ? S \ qd Ö 6ò 4) )^ =ˆ GÆ 9 H M  U _  g q  y ƒ  ’ $   Å  Ó  á ï ö 1 7 @  F  Q r  y ‡ § · Í à  ù '/ DN Q [f%xž£§ Å'Ð ø 'G N[ r“§!Ç éô *8c~ š ¥0³äû% 6Wr!² ÄÐ Ôáõ ù -5=PŽ·Íæû !$ ,7V"o’­Á×Ûùý '63P„&‹²È Ú(è!&?V-Yb‡Tê?Odgl'‡ ¯¼Ä3à1 6.Dsz‰™ §®ÂMÖ$-BGGO— Ÿ­¾Ùñ 4-G uœ±÷ý§ÆƒRÛtÚÐŽ„6§X]í”m¾ù´¯DœÒyžŸÑ'®í< l—*Áuʳiq)-n·¯s©×Ç >ðã´#¨°ñ"m(Æ¢za¦H½½É-|RÀ¸'fÃh†ç}ûúóvtzÔԘϞýV.ݯf¯\<>r­cW¬Þ‡…s²-paàš#E£L'ºœG>Ä…™ Ëi¢õ¹'X ¼ëR9s&Û‡c ‰3†Æ^õB)%•5£ðm6¦_ Ö®ÄNA=2±ÅbžÂ[t©ÍCˆ7HM9Š#MPz9ãü`Jû‹ì1¥‹‘°j¶îÁË“(x;<М QÑèPÛ1ÀœÔÛáûpO .Ì`àƒY©Gÿ §­¸*æÍéLH Al›,6å_!ß’–¶06‘”eT2šFÂP[QÄžH“Œkyl,išè!š¿•Z@Lö/u3;Oö¢¹rìÚuÃa™¶ï¦«Æ&k%˜Mò©¨ kØFè¡#–àNüÕv8 âóº4 Ÿ›k~vñŸ¤F ‚NªÝ;(OZ>53È‘+Íõ^c̉~’g0÷J1¾M8 Q ã®ùŽ×7âÌTçÅèÓä b}¬4%µªñŽeN$›âoíKgüþù*çw£áî6-ÖwÏ ïÈ«cE³¸ Ô´Ü|ªÜÉV²}·S°¡*.UÇU˜ra 夸/Ùþ:/ÒȼSø• +‹ÙI»BƒÉh:+nÃÄÅ;  ôD )?p‚ó !¾(ðe¥]^^ú0R=ÜŒ`@ÝjXä€Ö¡GßYd! ð/;ëù~D”t2ÓAU&‡<¹9?äÙ“)ËJÑ%’åÃ-{nL+hÊfØKF8™5GKíÞ=n‰Jò´)Aÿ¥¬~Ç?PßdØC»‡«ÎŽò³úÕñ£¼EòËSZGøV>Q­ †Õ¿7(á1‹þ„¤æô¨.VåÈ9Ùˆ,…†1<L¿ =ŒàÎlˆ³0çï±E8•!hõƒÂ}Šj™:]g.¾Kø_ü¨HôNb€+|zKO3ګϵˆôº`ÁV¬Ïû—:[J&¢æ5ÀBRä¦C°»ê:é'B¿„{4ìâ"º—Å\ŸfbW7j{ogIP­Y“Þá_$…ý#T¹C€½[W§É"OÎΖÇÐ q$CÀ˜ë$SIo@pé‘Wï€Ø4ÿv@Ó?ÜÕr@2×±· M÷²/—Ò$‚± ÞyµÿxAÖÂZ÷DB²Š\Òö]XDæãóúÌþÁ2ë%„»ê"q¶‰wýx70U5½‚¼ʤdÍI,ÐFuséiª®yê{ÝîÊ?U –*’eQSq\xµ×mîß=›Š&d,EIê3ì8Óø¥4"” Ñ¡wT·YŒÚoö|T  in # Records in logbook# retries before giving up# times to resend command before giving up%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&UI&View**.exe... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...0 = T; 9 = N1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types14070.150500 Hz limit: AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter CW identifier decrement counter [Wait][Len](ms) log eQSL optional msg log eQSL insert text file valid xcvr filter width my frequency text to NAME/QTH move to freq NNNN Hz idle signal for NN.nn sec increment counter S/N etc. IMD etc. saveQSO data, append msg to notes log at xmt time other locator saveQSO data, append msg to notes save QSO data change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit insert QRG into Rx text # QSO recs QSO time (HHMM)) qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously send CAT cmd valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out search DOWN for signal search UP for signal Digitalk On, Off, Toggle repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version CW WPM:Farnsworth get weather data for station get weather data exchange begin exchange end exchange in exchange outADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQ controlAbortActionAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAllow errorsAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAuto CRLF line lengthAuto connect when fldigi opens (server must be up)Auto start programs with fldigiAuto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutostartAvailable substringsBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowseBrowserBrowser Line ColorsBug me about saving log entriesBuild infoButtonButtonsC&ountriesCAT command for PTTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW transmit WPMCabrillo SetupCabrillo...CallCall LookupCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture:Carrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter in passband Right click to undoCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change log levelChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear channel text after # seconds of inactivityClear list?Clear log entries after saving or using macro Clear log fields?Clear on saveCloseClose ListColorColor of Mark TrackColors && FontsColors and cursorsCommand line optionsCommand run on KML creationCommands are echoedConditionsConfirmConfirm RESETConfirm exitConnect to serverConnect/disconnect to Talker socket serverCont'ContestContest exchange receivedContest exchange sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate sunspotsCustom shiftCustom text searchCustom...CutDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityData base lookupData files repositoryData files sourcesData files updateData files...Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode DTMF tonesDefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault CW tracking pointDefault RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec before starting audioDeleteDelete the current recordDeselectDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice:DevicesDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory...Disable alert dialogDisable allDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay tx and rx in main fldigi window. Change requires restart of fldigiDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge shapeEdge timingEmbedded Wefax GuiEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable DSP prior to decoderEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable for very weak signalsEnable if you're computer does not decode properlyEnable this entry when fldigi first startsEnabledEnd of xmt IDEnter full path-filename for flmsgEnter test string or leave blank for default:Enter time span in minutesErrorEvenEven linesEventEvent logExchange InExchange OutExecutable file to insertExecute command on KML files.ExitExit promptsExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programF-WPMFECFFT ProcessingFFT averagingFFT prefilter window functionFLMSG files...F_keysFahrenheitFax images destination directoryFeel free to skip any pages or exit the wizard at any timeFeldFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font:Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreq.FrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)FullFull reportGeneralGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlibHamlib used for rig controlHardware PTTHiLite 1HiLite 2Hide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:IDIDsIOTAITU zoneITUZIgnore duplicatesInInactivity timeoutInclude the transmit frequencyInclusive stop date for exportInfoInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert default textInsert file...Insert leading zeros into Xmtd serial numberInsert markerInsert textInsert text on single left clickInteresting notesIslands on the airK3 A1A configuationKMLKML files directoryKML refresh interval (seconds)KML root fileLOCLast QSOLeave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit to a few characters, as in CQEM or IOTA etc.Listen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocatorLock transmit frequencyLogLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog sourcesLogbookLogbook DialogLoggingLogging Panel ControlsLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLowerLower limitMFSK image fileMT-63Macro Button LabelMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMatched Filter bandwidthMediumMerge ADIF fileMerge...Miles / HourMinimal controlsMinimum time between eventsMiscModeMode in useMode must matchMode width limitModemModem carrierModem signal on left and right channelsModemsMonitor transmitted signalMouseMouse wheel active on macro buttonsMsec's between retriesMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameNewNew record / Save recordNextNoNo faster than thisNo file name givenNo slower than thisNoneNormalNot worked beforeNotchNotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberOKONON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOddOdd linesOn/OffOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator workedOperators QTHOperators nameOptional configuration in format: param=val ...OptionsOtherOutOverPSKPSK ReporterPSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT via Hamlib commandPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPort:PortAudioPrPreamble DetectionPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPskmailPulse shapePulseAudioPwrQRZQRZ cdromQRZ.comQRZ/eQSLQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO loggingQSO must not occur within a time period ofQSYQTHQTH NicknameQthQuietRE:RPCRSID receptionRST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Scope DisplayRX captureRX ppmRX sound card correctionRadio frequencyRange +/- wpmReading fonts...Really delete record for "%s"?ReceiveReceive filter bandwidthReceive modesRecent activity for gridReception of flmsg filesReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)ReloadReload cty.datRemoveReport rig frequency (enable only if you have rig control!)ReportsResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetriesRetrieve for active modem useRetry interval (ms)RevReverseReverse Left/Right channelsReverse videoRigRig controlRig description file:Rig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRight channelRsIDRst receivedRst sentRun programRun program:RxRx WPMRx bkgndRx fontRx/TxS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2Sample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save image as monochrome fileSave logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...ScopeScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Searches passbandSecondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelf Organizing MappingSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSer inSer outSerial # inSerial # outServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSettingsShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:SigLvlSignal BrowserSignal Level ColorsSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSize:Slow CPU (less than 700MHz)Software reversal of left-right audio channelsSort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSys ColorsSystemT/RTX PowerTX WPMTX offsetTX ppmTX sound card correctionTab ColorTabsTabular data sourcesTalkerTalker Socket (MS only)TemperatureTestTest charTest character for QSK adjustmentTest commandTest...Text CaptureText HighlightingText file to insertText i/oText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThis event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimeout (secs)TimingTiming and QSKTo whom the connection is madeToggleTonesTrackingTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit mode IDTransmit modesTransmit power usedTransmit signalTransmit video textTransmit/ReceiveTriangularTrigger limit (s):TuneTxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUIUI languageUI schemeUS state of station workedUndoUnsupported formatUpdateUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUser IDUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVideoVideo ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWF CtrlsWF MagnificationWF carrierWF modeWXWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWavWav write sample rateWebWeb Browser lookupWeight (%)Wheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWind speed/dirWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)XMITXON/XOFF flow controlXY - classic scopeYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafterautomatic data uploadcallsign tooltips in received textchannels != 1charscurrent wx conditionsdefault text to send with etcdefault uses date/time oneQSLeQSL userenable mouse wheel control of macro barflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:free form exchangeh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourmbarsminutesrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport kilometers per hourreport miles per hourreport millibarsreportssecondsselect browser fontselect by datesend when logged (log button, , )track colorunknown wave file errorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.22.01 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2013-10-21 13:07+0100 Last-Translator: Marc Richter Language-Team: German (Marc Richter) Language: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: German X-Poedit-Country: GERMANY X-Poedit-SourceCharset: iso-8859-1 in # Einträge im Logbuch# Wiederholungen bevor ich aufgebe ;)# Versuche das Kommando erneut zu senden, dann Aufgabe%s Logbuch erstellt am %s%s: existiert nicht, soll es (neu) erstellt werden?ÜberKonfigurationDatei&Hilfe&Logbuch&OkayGUIAnsicht**.exe... Diese Einstellungen lassen sich auch auf anderen Registerkarten ändern sie wurden der Einfachheit halber auch hier aufgeführt ...0 = T; 9 = N1000 Hz Ton falls PTT eingeschaltet Kann anstelle oder zusätzlich zu anderen PTT Typen verwendet werden14070.150500 Hz Limit: AFC ein, aus, umschalten Meine Antenne genutztes Band Rufzeichen der andere Station Log Felder löschen Empfangsbereich löschen Sendebereich löschen Contestzähler CW Kennung Zähler verringern [warten][länge](msek) logge eQSL mit optionaler Nachricht eQSL loggen Textdatei einfügen Gültiger TRX Filter Breite Meine Frequenz Text nach NAME/QTH Gehe zu Frequenz NNNN Hz Ruhesignal für NN.nn sek Zähler erhöhen S/N etc. IMD etc. QSO Daten speichern, und Nachricht anhängen Loggen mit xmt Zeit Locator der andere Station saveQSO data, append msg to notes QSO Daten speichern Makro Definitionsdatei ändern Karte mit Werten darstellen Google Karte Betriebsart Mein Rufzeichen Mein Locator Mein Name Mein QTH Mein RST Name des anderen OP Sende |NN| aufeinanderfolgende RsID Signale Nächster QSO Eintrag # Sendepause QRG in RX Feld einfügen # Anzahl QSO Einträge QSO Zeit (SSMM)) qsy um kHz, Hz Rechts Klick QSY Button Links Klick QSY Button QTH der anderen Station Makros kontinuierlich wiederholen Sende CAT Kommando Gültiger TRX Modus CW Anstiegszeit RST der anderen Station Empfang Rx RSID ein, aus, umschalten Gegenwärtiges Makro speichern Austaucsh gegeben speichern Suche abwärts nach Signal Suche aufwärts nach Signal Digitalk On, Off, Toggle Wiederhole alle NN sek Abstimmsignal für NN sek Umschalten T/R Senden setze xmt Abschwächer TX RSID ein, aus, umschalten Fldigi version CW WPM:Farnswoth Wetterdaten für Station abrufen Wetterdaten abrufen Austausch beginnt Austausch endet Austausch erhalten Austausch gegebenADIFAFCAFC VerhaltenAFC Bereich (Hz)AFC Bereich oder BWAFC GeschwindigkeitAFC Tracking GeschwindigkeitALTRARQ SteuerungAbbruchAktionHinzufügenCRLF nach jeder Seitebreite einfügenRsID Signal an Ende der Übertragung anhängenCursor Frequenz einstellenDSP Bandbreite einstellenFortgeschrittene KonfigurationAllesAlle hier getätigten Einstellungen können später auch noch über das Konfigurationsmenu geändert werdenFehler erlaubenAlternative Zeichenfarbe im Rx PanelImmer LSBImmer USBAudio Frequenzen immer anzeigenNeue Modems (Betriebsarten) immer bei diesen Frequenzen beginnenAntenne:Ansicht der KanalbeschriftungRX Text anhängenTX Text anhängenAnwendenAudioAudio Gerät InformationenAudiogerät Information nur für PortAudio Backends verfügbarAudio DateiAudio FrequenzAudioeingabegerätAudio oder HF Frequenzen auf WF SkalaAudioausgabegerätAuto CRLF LeitungslängeAutomatisch verbinden, wenn Fldigi startet (der Server muss ereichbar sein)Folgende Programme automatisch mit Fldigi startenLand und Azimuth automatisch füllenAutomatisch CRLFAGCAutomatisch Rx Geschwindigkeit verfolgenAutomatisch Rufzeichen in decodiertem Text suchenAutostartVerfügbare TeilreihenZurückHgrundHintergrundfarbe für Funktionstaste Gruppe 1Hintergrundfarbe für Funktionstaste Gruppe 2Hintergrundfarbe für Funktionstaste Gruppe 3Hintergrundfarbe des Signalbetrachters / RauschkontrolleBandBänder müssen übereinstimmenBandbreiteLuftdruckBaudrateBaud Rate:Leitfaden für AnfängerVerhalten von s/n imdHGrundfarbeBits pro ZeichenSuchenBrowserBrowser LinienfarbenPrompt um Log Datei zu speichernInformationen zur KompilierungKnopfSchaltflächenLänderCAT Kommando für PTTCPUCPU Auslastung steigt mit Höhe der Wasserfall PixelCQ ZoneCQZCR-CR-LFCSV...STRGCWCW ID ModiCW Postamble IDCW QSK Signal auf dem rechten KanalCW DSP Filter BandbreiteCW ist LSBCW Sendegeschwidigkeit in WPMCabrillo EinstellungenCabrillo...CallRufzeichen nachschlagenRufzeichen SucheRufzeichen bereits gearbeitetCallbook.info Abfrage (Kostenloser Service nur für US Rufzeichen)RufzeichenKann anstelle oder zusätzlich zu anderen PTT Typen verwendet werdenAbbrechenAufnahmeAufnahme- und WiedergabegerätAufnahmegerätEmpfangenen Text in eine Datei schreibenSignale über diesem Schwellwert erfassenAufnahme:Trägerfrequenz (Hz)TrägerverschiebungCelsiusAnzeige auf Signal zentrierenZentrum im Durchlassbereich Rechte Maustaste macht rückgängigMittellinieÄndern der # des PSK BetrachtersDies NUR zum experimentieren ändernLook and feel der Anwendung ändernFarbe ändernVerzeichnis...Log Level ändernWechseln zu MakrodateiWasserfall Skala ändernÄnderungen werden erst beim nächsten Programmstart wirksamBeschriftung / KanäleKanal NummerKanäle; der erste Kanal beginnt an Wasserfall UntergrenzeZeichen/ReiheAlles überprüfenÜberprüfen auf DupliakteNach Updates suchenBei Programmstart nach Updates suchenÜberprüfe auf Updates...Diese Option aktivieren um bei RSID Empfang benachrichtigt zu werden ohne Betriebsart und Frequenz zu ändernAktivieren um CPU Last bei RTTY und PSK zu reduzierenÜberprüfe auf verfügbare Updates...Verzeichnis wählen in dem die KML Dateien gespeichert werden sollenHeimatstadt der gearbeiteten StationKML Daten jetzt aufräumenLöschen bei ProgrammstartKML Dokumente aufräumen, Google Earth Anzeige löschenLöschenAlles löschenText im Kanal nach # sekunden inaktivität löschenListe löschen?Logeinträge löschen nach speichern oder Makro Log Einträge löschen?Löschen nach speichernSchließen Liste schließenFarbeFarbe der MarkierungsspurFarben && SchriftartFarben und CursorBefehlszeilenoptionenKommando zur KML File ErstellungEcho KommandoBedingungenBestätigungBitte bestätigen für ResetBeenden bestätigenMit Server verbindenVerbinden/Trennen von Talker Socket ServerCont'ContestContest Austausch Information erhaltenContest Austausch Information gesendetContest Seriennummer # empfangenContest:KontinentKontinuierliches ScrollenControl-Zeichen in Rx / Tx BereichRufzeichen in GrossbuchstabenKonverterKopierenKorrekturenKonnte kein Verzeichnis erstellenKonnte Adresse nicht öffnen: %s Konnte keinen Web Browser starten: %s Diese Adresse manuell öffnen: %sKonnte flmsg nicht startenLandLand der gearbeiteten StationLand1000 Hz Rechtecksignal auf dem rechten Kanal erzeugenCabrillo Report erzeugenSonnenflecke erstellenBenutzerdefinierte VerschiebungIndivduelle VolltextsucheIndividuellAusschneidenDTMFDTR +12DTR +12VDTR = +VDTR ist PTT Signal AnschlussDTR ist PTT AnschlussDXCCDXCC BezeichnerDXCC DatensätzeDXCC DatensätzeIn Datenbank nachschlagenVerzeichnis für DatenQuelle für DatendateiDatendatei updateDaten Dateien...Daten QuelleDatumDatum offDatum anDatum wann QSO beeendetStartdatum QSODatum/Zeit EIN == AUSDebugDTMF Töne dekodierenStandardStandard 800 Hz. Deutscher Wetterdienst 850HzStandard CW Tracking PunktStandard RTTY Tracking PunktStandard WPMStandard für alle anderen ModemsStandard Empfangs / Sende FrequenzStandard NachrichtStandard Testreihe ist: "Standard FadenkreuzStandardNN msek Verzögerung bevor Audio StartLöschenAktuellen Eintrag löschenDeaktivierenErkannter SignalpegelNachweisgrenzeDetektor Schwelle hochDetektor Schwelle niedrigGerät:GeräteUnterschied zwischen Rx && Tx Frequenz (rig Offset)ZiffernfarbeZiffernDimVerzeichnisWarnmeldungen ausschaltenAlles ausFalls RSID aktiviert, weitere Erkennung ausschaltenAuf sehr langsamen CPUs ausschalten, falls Signal Browser nicht benutzt wirdSpotting nur aktivieren, wenn Signale im Browser sichtbar sind.Detektor ausschaltenAnzeigeAnzeige von TX und RX im Fldigi Hauptfenster Wird nach Neustart aktivRsID Warnmeldung nicht anzeigenRufzeichen Datenbank nicht verwendenRufzeichen Lookup via Web Browser nicht verwendenAngedocktes ScopeDomNicht speichernZiehen auf Wasserfall Skala ändert FrequenzDuplikateDublettenprüfung Call plusDuplikateKantenformFlankensteilheitEingebetteter Wefax GUIBei Programmstart KML Datein leerenEinschaltenEinschalten -Aktivieren / Deaktivieren der Symbole in MenüsAktivieren / Deaktivieren der TooltippsDSP vor dem Dekoder aktivierenMultiPSK kompatible FEC einschaltenAlles einAktivieren, um entsprechendes Bedienelement anzuzeigenFür sehr schwache Signale einschaltenEinschalten, falls der PC nicht sauber dekodiertDiesen Eintrag aktivieren wenn Fldigi zum ersten Mal startetEingeschaltetEnde der xmt IDDateipfad zu flmsg eingebenTest String eingeben, oder freilassen für StandardZeitspanne in Minuten eingebenFehlerGeradeGerade linienEreignisEreignisprotokollExchange InExchange OutAusführbare Datei einfügenBefehl auf KML Datei anwendenBeendenAufforderung zum BeendenExport SetupIn ADIF Datei exportierenIn CSV Datei exportierenExportieren in Datei mit festen FeldernExportieren...Dateien extrahieren um sie mit externem Programm "wrap / flmsg zu nutzenF-WPMFECFFT VerarbeitungFFT MittelungFFT Vorfilter FensterfunktionFLMSG Dateien...F_TastenFahrenheitVerzeichnis für Fax BilderSie können jederzeit eine Seite überspringen oder den Assistenten beendenFeldNur Datei Ein/AusgabeLand und Azimuth mit Informationen aus cty.dat Datei füllenFilterFilter FormfaktorFilter BandbreiteFilter Bandbreiten FaktorFilter Bandbreite relativ zur Signal BreiteFilterungLand findenFinde nächstesPrefix finden:Finde vorherigesFindeFertigFeste IntervalleFldigi Konfiguration...Fldigi KonfigurationFldigi Konfigurations AssistentFldigi Makro Definitions Datei *.{mdf}Fldigi Palette *.palFldigi radio xml Definitions DateiFldigi Webseite...OszilloskopOrdnerSchriftSchriftfarbeSchrift...Schrift:Rufzeichen in Grossbuchstaben erzwingenKanalabstand auf gerade 100 Hz erzwingenDatum/Zeit ON == Datum/Zeit OFF forcierenFreier Lossless Audio Codec *.flacKostenloser Service mit freundlicher Genehmigung von OKFreqFrequenzFrequenzFrequenz in MHzFrequenz SkalaFrequenzverschiebung (800 Hz)VollständigVollständiger BerichtAllgemeinErzeuge 1000 Hz Rechtecksignal auf dem rechten KanalErzeuge ein Rechtecksignal auf dem rechten KanalGruppe 1Gruppe 2Gruppe 3Hamcall.netHamlibHamlib zur Radio Steuerung verwendetHardware PTTHiLite1HiLite2Sendefenster verbergenSendefenster verbergen als StandardFenster nach (s) verbergen:HochGrenzfrequenz in HzHost:IDIDsIOTAITU ZoneITUZDuplikate ignorierenEinZeitlimit für InaktivitätSendefrequenz hinzufügenInclusive Stoppdatum für den ExportInformationAnfängliche Spannung an DTRAnfängliche Spanung an RTSInitialisierenRigCAT Interface initialisierenHamlib Interface initialisierenHardware PTT initialisierenQSO logging Felder initialisierenSocket Client initialisierenEingang Träger VerschiebungStandard Text einfügenDatei einfügen...Führende Nullen in Xmtd Serien Nummer einfügenMarkierung einfügenText einfügenEinfügen von Text per einfachem LinksklickInteressante HinweiseIslands on the air (IOTA)K3 A1A KonfiguationKMLKML Datei VerzeichnisKML Auffrisch Intervall (sekunden)KML Wurzel DateisystemLOCLetztes QSOBitte freilassen, oder http://www.pulseaudio.org/wiki/ServerStrings lesenLinker und rechter Kanal enthalten Modem AudioKlick links um Text zu löschen Klick rechts für Frequenz resetLinksklick um Farbe für Duplikate zu wählenLinks Klick: Betiebsart ändern Rechts Klick: KonfigurierenLinks/rechts klick ersetzt Audio HistorieLizenz GPLv3+: GNU GPL version 3 oder später Dies ist freie Software, Sie können sie verändern und weitergeben. Es gibt KEINE GARANTIE soweit gesetzlich zulässig. Farbmarkierte ButtonBeschränkt auf ein paar Zeichen, wie in CQEM oder IOTA etc.Auf Signale aus diesem Bereich hörenLkLadenNeue Palette ladenBild ladenBilddatei laden- oder hierher ziehen Unterstützte Dateitypen: PNG, JPEG, BMPLadenLocatorfindenFinde cty.dat DateiAusführbare Datei findenflamp.exe Datei findenfllog.exe Datei findenflmsg findenflmsg Datei findenflnet.exe Datei findenFlrig.exe Datei findenProgrammdatei #1 findenProgrammdatei #2 findenProgrammdatei #3 findenLocatorSendefrequenz sperrenLogNavtex Nachrichten nach ADIF loggenNavtex Nachrichten nach KML loggenRTTY Frequenz loggenWetterfax Nachrichten nach ADIF loggenRX/TX Text aufzeichnenLog Datei QuelleLogbuchLogbuch DialogLoggingProtokoll BedienelementeRufzeichen nachschlagenLoTW BenutzerNiedrigGering = 0 Fehler Mittel = 1 Fehler Hoch = 2 FehlerUntere Grenzfrequenz in HzUntereruntere GrenzeMFSK Bild ladenMT-63Beschriftung für ButtonMakro TextMakro Editor - MakrosMaidenhead Locator wie z.B: JO40hmMail Server MerkmaleAngepasste Filter BandbreiteMediumADIF Dateien zusammenführenZusammenführen...Meilen pro StundeMinimale SteuerungselementeMinimale Zeit zwischen EreignissenDiversesBetriebsartVerwendete BetriebsartModus muss übereinstimmenBetriebs Bandbreiten BegrenzungModemModem TrägerModem Signal auf dem linken und rechten KanalModemsSendesignal überwachenMausMausrad aktiv bei Makrosmsek zwischen einem erneuten VersuchMultikanal Signal VerarbeitungMulti-Kanal DetektorMein Rufzeichen de CALLMeine Sendegeschwindikgeit WPMNBEMSNBEMS Datendatei SchnittstelleNBEMS Dateien...KEIN AUDIO GERÄT VERFÜGBAR (oder testen)KEIN RUFZEICHEN ANGEGEBENNameNeuNeuer Eintrag / Eintrag speichern Weiter NeinNicht schneller als diesesKein Dateiname angegebenNicht langsamer als diesesKeineNormalNoch nicht zuvor gearbeitetNotch (Kerbfilter)BemerkungenMitteilungenNur BenachrichtigenAnzahl und Position der MakroreihenAnzahl der Stellen in SeriennummerOkayEinEIN - kleine Schrift AUS - grosse SchriftEIN - mit Standard beginnen AUS - halte aktuelle WF Cursor PositionEIN - Letzten Makrosatz verwenden AUS - Standardsatz verwendenOSSUngeradeUngerade LinienEin/AusOnline Dokumentation (Englisch)...BetriebsartÖffnen ...Liste öffnenDatei mit dem Standard Browser öffnenIm Browser öffnenLogbuch Datei öffnenMakrodatei ladenNachrichten Ordner öffnenNachricht mit flmsg öffnenPalette öffnenRadio xml Datei öffnenRauschsperre öffnen für nn sek falls RSID erkannt wurdeMit flmsg öffnenÖffnenÖffnet NBEMS Dateiordner nach erfolgreichem EmpfangBenutzerOperator gearbeitetBenutzer QTHName des BenutzersOptionale Konfiguration im Format: Parameter=wert ...OptionenAndereAusÜberPSKPSK ReporterPSK und anderePSK/RTTY Betrachter Farbe HiLite 1PSK/RTTY Betrachter Farbe HiLite 2PTT Verzögerung gilt für alle CAT/PTT TypenPTT Ende SendeverzögerungPTT ist CAT Kommando (kein Hardware)PTT Ton auf dem rechten Audio KanalPTT via Hamlib KommandoPalette: ParitätEingehenden Text auswertenPasswortEinfügenPfade (verborgen)Baudrate aus Liste auswählenWiedergabeWiedergabe in Endlosschleife?WiedergabegerätWiedergabe:Bitte zuerst das Rufzeichen eintragenPopup Info nach 2 sek über dem Rufzeichen schwebenPort:PortAudioPrPräamble Erkennung/DetektionEingabetaste drücken um weiter zu suchenZeichen bei CW / RTTY / THROB / CONTESTIA in KleinbuchstabenProg 1:Prog 2:Prog 3:Prompt Konfiguration speichernPrompt Log Datei speichernAufforderung Log Datei speichernPrompt Makro Datei speichernProvinzProvinz der gearbeiteten StationPseudeo FSK - rechter KanalPseudo FSK auf dem rechten Audio KanalPskmailPulseformPulseAudioPwrQRZQRZ CDROMQRZ.comQRZ/eQSLQSKQSK im rechten Audio KanalQSL EmpfangsdatumQSL bekommen an diesem TagQSL SendedatumQSL gesendet an diesem TagQSL-VIAQSL empfangenQSL gesendetQSO DatumQSO Datum EndeQSO Datum StartQSO LoggingVerbindung darf nicht innerhalb eines Zeitraums von auftretenQSYQTHQTH SpitznameQthWeniger EinträgeRE:RPCRSID EmpfangRST empfangenRST gesendetRST(r)RST +12RTS +12 VRTS = +VRTS ist PTT Signal AnschlussRTS is PTT AnschlussRTS/CTS FlusskontrolleRTTYRTTY Osztilloskop AnzeigeEmpfangs MitschnittRX ppmRX Soundkarten KorrekturRadio FrequenzBereich +/- wpmSchriftarten einlesen ...Eintrag "%s" wirklich löschen?EmpfangenEmpfangs FilterbandbreiteRx BetriebsartenNeueste Aktivität für GridEmpfang von flmsg DateienEmpfangsberichte...Erneut VerbindenEinträgeRechteckReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Neu ladencty.dat erneut ladenEntfernenBerichte Radio Frequenz (bitte nur benutzen wenn Sie Rigcontrol haben!)ReporteResetAlle Einstellungen auf Standard zurücksetzen? Reset wird mit dem nächsten Neustart von Fldigi wirksam Die Dateien: fldigi_def.xml und fldigi.prefs werden gelöscht! Zurücksetzen auf TrägerWiederherstellung des cty.dat StandardordnersStd wiederherstellenZurücksetzen der seriellen (COM) Port-EinstellungenWiederholungenAbrufen für aktive Modem NutzungWiederholungs Intervall (ms)RevUmkehrenLinken/rechten Kanal vertauschenReverse VideoRadioRadio SteuerungRadio Konfigurations Datei:Radio ModusRadio erfordert RTS/CTS AblaufsteuerungRadio erfordert Xon/Xoff AblaufsteuerungRadio verwendet RTS/CTS HandshakeRadio:RigCATRigCAT wird für Radio Steuerung verwendetRechter KanalRsIDRST empfangenRST gesendetProgramm ausführenProgramm starten:RxRx WPMRx HGrundRx SchriftRx/TxS/N und IMD VerhaltenSELSKIPSOM DekodierungSQL-1SQL-2AbtastrateSpeichernSpeichern ...Einstellungen speichernEmpfangenen Text speichern, Zeichenweise in folgende Datei: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Speichern als...Geändertes Logbuch speichern?Geänderte Einstellungen speichern?Geänderte Makros speichern?Bilder monochrome (einfarbig) speichernLogbuch Datei speichernMakrodatei speichernFarbpalette speichernText speichern alsFax Bilder als Graustufen PNG Datei speichernDiese Palette speichernSpeichernOszilloskopBlätternScoll HinweiseSuche nach diesem RufzeichenSuche im InternetSuchbereich (Hz)Durchlassbereich durchsuchenSekundärer TextSekundenAuswählenAuswählen # bits / ZeichenStopbits # wählenAlles wählenCabrillo Contest && Felder auswählenZu exportierende Felder wählenWählen Sie die zu exportierenden DatensätzeRx/Tx Zeichensatz auswählenSende Rasterschriftart auswählenKennzeichnung auswählenBandbreite auswählenTräber Baudrate wählenTrägerverschiebung wählenGerät auswählenAuswählen wie sich das Mausrad innerhalb des Wasserfalls verhältLinie auswählenModi für Zugriff auf MenüAnzahl der Töne auswählenParität auswählenRadio Beschreibungsdatei auswählenFFT Vorfilter wählenDies nur wählen für Elecraft K3 Andere Radios benötigen dies nicht.Wasserfall Skala Schrift wählenAuswahl Hintergrundfarbe in Rx Tx PanelSelbstorganisierende Karte (SOM)Rufzeichen in CW am Ende jeder Übertragung sendenSende einen kontinuierlichen Datenstrom an TestzeichenMit dieser Geschwindigkeit sendenKontinuierlich sendenBild sendenBild senden...Empfangsbericht nur senden wenn QSO geloggt wurdeSendebericht nur wenn QSO geloggt wurdeGesendete und empfangene faxe nach ADIF loggenGesendete Zeichen in Rx/Tx BereichSNummer einSNummer ausSeriennummer # eingehendSeriennummer # ausgehendServer StringRauschsperre für Viewer setzenPegel für beste Sicht einstellenSetzen Sie die Anzahl der Zeichen pro ZeileEinstellungenKurzbeschreibung der AntenneAnsichtZeige DXCC DatensätzeZeige Alarm FensterZeige alle BetriebssartenBandbreiten Spur im Wasserfall anzeigenZeige KanäleZeige Cursor mit BandbreitenlinienCursor mit Mittellinie zeigenWeniger Betriebsarten anzeigenMakro Editor anzeigenZeige mehr oder weniger WasserfallMenu Symbole zeigenPasswort im Klartext anzeigenTooltipps anzeigenSendesignal am Wasserfall zeigenSeitenband:PegelSignal BrowserSignalpegel FarbeSignal BrowserSignalpegelSignalbereich (dB)Signal sucheSignalspurenGröße:Langsame CPU (weniger als 700MHz)Software umkehrung der Audio Kanäle rechts/linksSortieren nach Datum/Zeit ausSortieren nach Datum/Uhrzeit ausgeschaltet - beinflusst alle ADIF / Cabrillo ReportsSoundkarteGeschwindigkeit (WPM):SpotSpotterSpottingSpotting deaktiviertRauschsperreRauschsperren PegelRauschsperre offen (s)StStartStartdatumStartdatum für den ExportStart flampStart fllogStart flnetStart flrigStart der PTT ÜbertragungsverzögungStart prog1Start prog2Start prog3StartnummerStaatBundesstaat muss übereinstimmenStation zweimal gehörtGrid Square (Planquadrat) der StationStoppdatumStopbitsStopbitsSpeichere Betriebsart und Frequenz Rechts Klick für ListeSys FarbenSystemT/RSendeleistungTX WPMTX OffsetTX ppmTX Soundkarten KorrekturFarbeRegisterkarteDatenquellen und TabellenTalkerTalker Socket (nur Windows)TemperaturTestTestzeichenTestzeichen für QSK EinstellungTest KommandoTest...TexterfassungText hervorhebenTextdatei einfügenText I/OText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~Standard CW GeschwindigkeitDer Dateiname wurde in den RX Text Bereich geschriebenDas Feld 'regulärer Ausdruck' darf nicht leer sein.Der reguläre Ausdruck muss gültig sein.Die Testreihe entspricht nicht dem Suchmuster des EreignissesDieser Assistent wird Sie durch die grundlegenden Einstellungen führenDer reguläre Ausdruck für dieses Ereignis ist ungültigThorUhrzeitZeit (s):EndzeitStartzeitEndzeitStartzeitQSO beendet umStartzeit QSOZeit zwischen Wiederholungen in msekZeitaufwand: Zeitspanne umTimeout (sek)TimingTiming und QSKServer zu welchem die Verbindung hergestellt wirdWechselnTöneVerfolgungSende Geschwindigkeit, X1-normalSendenSendeleistungRufzeichen übertragen (senden)SendeschriftartSendebetriebsarten IDSendebetriebsartenVerwendete SendeleistungSendesignalSende Video TextSenden/EmpfangenDreieckTriggerschwelle (s):AbstimmenTxTx HGrundTx SchriftTx Dämpfung (dB)Sende Leistung für Logbuch EinträgeTxIDGUISprache der BedienoberflächeGUI SchemaUS Bundesstaat der gearbeiteten StationRückgängigNicht unterstützes FormatUpdateAktuellen Eintrag aktualisierenObererobere GrenzeOberer Signalpegel(dB)Verwende "cr cr lf" für "cr lf"'(' nutzen nicht KNCDROM oder Festplatte verwendenDSP Filter vor dem Dekoder nutzenDTR nutzenFarnsworth Timing nutzenHamlib benutzenOSS Audio Server verwendenÖffnen um Beschreibungsdatei zu verwendenPortAudio Server verwendenPulseAudio Server verwendenRTS nutzenRigCAT nutzenMittelung verwenden um WF Rauschen zu vermindernFarbige SchaltflächenFadenkreuz verwendenDatum/Zeit off für Logeintrag nutzenVerwenden um eine PA anzusteuernFührende Nullen verwendenParallel Port für PTT nutzenSeparaten seriellen Port für PTTKleine SchriftartBenutzer IDGUIBenutzernameVerwende UDP Port #VSPAusführlichVideoVideo ID ModiVideo Präambel IDAnsichtKanäle anzeigen/verbergenVirtueller Seriell Port Emulator - unterdrückt WarnmeldungenSichtbare ModiHamcall Webseite besuchenQRZ Webseite besuchenHamQTH Webseite besuchenWasserfall KontrolleWF VergrösserungWF TrägerWF ModusWXWarnungWasserfallWasserfall / FFT / OszilloskopWasserfall EinstellungenFallgeschwidigkeit des WasserfallsWasserfall Höhe in PixelnWasserfall Video IDWasserfall Video TextWavWav Abtastrate beim schreibenWebVia Web Browser nachschlagenWichtung (%)Mausrad AktionWenn kein Signal vorliegtWo sollen generierte KML Dateien gespeichert werdenBreiteWird nach dieser Zeit in Sek passierenWind geschw/ RichtungWort TrennzeichenZeilenumbruchAktuelle Makros bei Programmende sichernSchreibvzg (ms)XMITXON/XOFF AblaufsteuerungXY - Klassisches ScopeJaSie arbeiten bereits mit der neuesten VersionSie benötigen ein kostenpflichtiges Hamcall online Abonnement um diesen Service nutzen zu könnenSie benötigen einen kostenpflichtigen QRZ online Zugang um diesen Service zu nutzenIhr AnmeldenameIhr Anmelde PasswortaanachAutomatischer Daten uploadRufzeichen Tooltips in empfangenen TextKanäle =! 1ZeichenAktuelle Wetter BedingungenStandard Text der mit dem Makro gesendet wirdStandard nutzt Datum/Zeit aneQSLeQSL BenutzerMausrad einschalten um Makros zu kontrollierenflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:Frei Form AustauschH/W PTT Geräte Pinz.B.: /home/dave/CALLBK/ or C:/CALLBK/ Freilassen um nach Datenbank zu suchenEingang:Kilometer pro StundembarMinutenrcos timing Koeffizient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500BerichtMelde CelsiusMelde FahrenheitMelde Kilometer pro StundeMelde Meilen pro StundeMillibar berichtenBerichteSekundenBrowser Schriftart auswählenAuswahl nach DatumSenden wenn im Log (log Button, , )SpurfarbeUnbekannter wave file FehlerNur Wasserfall Modus{NAME} Name des anderen OMfldigi-4.1.06/po/es.po0000664000175000017500000074343513515625024011373 00000000000000# Spanish translations for fldigi package # Traducción al español para el paquete fldigi # # Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # # Spanish translators: # Pavel Milanes Costa, CO7WT, 2008..2014 # Christian W. Correa, HK4QWC, 2014 # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.02\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2019-07-23 10:39-0500\n" "PO-Revision-Date: 2014-11-18 22:43-0500\n" "Last-Translator: Pavel Milanes Costa \n" "Language-Team: Spanish (Pavel Milanes Costa) \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" #: src/main.cxx:1018 #, c-format msgid "%s log started on %s" msgstr "%s log iniciado a %s" #: src/main.cxx:1703 msgid "Bad modem id" msgstr "Identificador incorrecto de módem" #: src/main.cxx:1710 msgid "Bad frequency" msgstr "Frecuencia errónea" #: src/main.cxx:1845 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licencia GPLv3+: GNU GPL versión 3 o posterior \n" "Este software es de uso libre: usted es libre de modificarlo y " "redistribuirlo. \n" "No hay NINGUNA GARANTÃA, excepto la permitida por la ley.\n" #: src/main.cxx:2074 src/main.cxx:2116 src/main.cxx:2140 src/main.cxx:2154 msgid "Could not make directory " msgstr "No se pudo crear el directorio" #: src/dialogs/fl_digi.cxx:189 msgid "Log all RX/TX text" msgstr "Guardar todo el texto de TX/RX" #: src/dialogs/fl_digi.cxx:190 src/misc/debug.cxx:101 msgid "Rig control" msgstr "Control del radio" #: src/dialogs/fl_digi.cxx:191 src/dialogs/fl_digi.cxx:7534 msgid "Op &Mode" msgstr "&Modos" #: src/dialogs/fl_digi.cxx:192 msgid "Show fewer modes" msgstr "Mostrar menos modos" #: src/dialogs/fl_digi.cxx:193 msgid "Show all modes" msgstr "Mostrar todos los modos" #: src/dialogs/fl_digi.cxx:197 msgid "&View" msgstr "&Vista" #: src/dialogs/fl_digi.cxx:198 #, fuzzy msgid "MFSK Image" msgstr "Imagen &MFSK" #: src/dialogs/fl_digi.cxx:199 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:200 #, fuzzy msgid "IFKP Raw Image" msgstr "Imagen &MFSK" #: src/dialogs/fl_digi.cxx:201 #, fuzzy msgid "Weather Fax Image RX" msgstr "&RX Imagen de Fax meteorológico" #: src/dialogs/fl_digi.cxx:202 #, fuzzy msgid "Weather Fax Image TX" msgstr "&TX Imagen de Fax meteorológico" #: src/dialogs/fl_digi.cxx:203 src/dialogs/confdialog.cxx:8948 #: src/logbook/lgbook.cxx:1288 msgid "Contest" msgstr "Concurso" #: src/dialogs/fl_digi.cxx:204 msgid "C&ountries" msgstr "&Países" #: src/dialogs/fl_digi.cxx:205 msgid "&UI" msgstr "I&U" #: src/dialogs/fl_digi.cxx:206 msgid "Full" msgstr "Completo" #: src/dialogs/fl_digi.cxx:207 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:208 src/waterfall/waterfall.cxx:2330 #: src/dialogs/confdialog.cxx:8431 src/dialogs/confdialog.cxx:15706 #: src/dialogs/confdialog.cxx:15795 msgid "None" msgstr "Ninguno" #: src/dialogs/fl_digi.cxx:209 msgid "Docked scope" msgstr "Osciloscopio empotrado" #: src/dialogs/fl_digi.cxx:210 msgid "Minimal controls" msgstr "Controles mínimos" #: src/dialogs/fl_digi.cxx:211 msgid "Show channels" msgstr "Mostrar canales" #: src/dialogs/fl_digi.cxx:213 msgid "Connect to server" msgstr "Conectar con el servidor" #: src/dialogs/fl_digi.cxx:1023 src/dialogs/fl_digi.cxx:1051 #: src/dialogs/fl_digi.cxx:1061 src/dialogs/fl_digi.cxx:5922 #: src/dialogs/fl_digi.cxx:6007 src/dialogs/fl_digi.cxx:6084 #: src/dialogs/fl_digi.cxx:7561 src/dialogs/fl_digi.cxx:7618 #: src/dialogs/fl_digi.cxx:7663 msgid "Custom..." msgstr "Personalizar..." #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4533 msgid "Save changed macros?" msgstr "¿Guardar macros modificadas?" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:4178 #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 #: src/logbook/logsupport.cxx:1202 src/misc/configuration.cxx:723 #: src/dialogs/font_browser.cxx:137 src/logbook/lgbook.cxx:832 #: src/logbook/lgbook.cxx:1642 msgid "Cancel" msgstr "Cancelar" #: src/dialogs/fl_digi.cxx:1519 src/dialogs/fl_digi.cxx:6223 #: src/logbook/logsupport.cxx:331 src/logbook/logsupport.cxx:1201 #: src/dialogs/confdialog.cxx:11415 src/dialogs/confdialog.cxx:16863 msgid "Save" msgstr "Guardar" #: src/dialogs/fl_digi.cxx:1519 msgid "Don't save" msgstr "No guardar" #: src/dialogs/fl_digi.cxx:1738 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "No" msgstr "No" #: src/dialogs/fl_digi.cxx:1738 src/dialogs/fl_digi.cxx:3017 #: src/dialogs/fl_digi.cxx:4525 src/dialogs/fl_digi.cxx:4533 #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4557 #: src/dialogs/fl_digi.cxx:4566 src/dialogs/fl_digi.cxx:4579 #: src/dialogs/fl_digi.cxx:9943 src/logbook/logsupport.cxx:360 #: src/logbook/logsupport.cxx:405 src/logbook/logsupport.cxx:1818 #: src/misc/configuration.cxx:725 src/soundcard/sound.cxx:360 msgid "Yes" msgstr "Si" #: src/dialogs/fl_digi.cxx:2694 msgid "No file name given" msgstr "No se ha proporcionado un nombre de archivo" #: src/dialogs/fl_digi.cxx:2697 msgid "Unsupported format" msgstr "Formato no soportado" #: src/dialogs/fl_digi.cxx:2700 msgid "channels != 1" msgstr "canales <> 1" #: src/dialogs/fl_digi.cxx:2703 msgid "unknown wave file error" msgstr "Error desconocido con el archivo de audio wav" #: src/dialogs/fl_digi.cxx:2710 msgid "Spotting disabled" msgstr "Spotting deshabilitado" #: src/dialogs/fl_digi.cxx:2758 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "No se pudo ejecutar un navegador web:\n" "%s\n" "\n" "Abra esta URL manualmente:\n" "%s" #: src/dialogs/fl_digi.cxx:2771 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "No se pudo abrir la URL:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2853 msgid "Checking for updates..." msgstr "Comprobando si hay actualizaciones..." #: src/dialogs/fl_digi.cxx:2858 msgid "Update site not available" msgstr "" #: src/dialogs/fl_digi.cxx:2871 msgid "You are running the latest version" msgstr "Está utilizando la versión más reciente" #: src/dialogs/fl_digi.cxx:2875 #, fuzzy msgid "You are probably running an alpha version " msgstr "Está utilizando la versión más reciente" #: src/dialogs/fl_digi.cxx:2876 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2881 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "La versión %s está disponible en\n" "\n" "%s\n" "\n" "¿Qué desea hacer?" #: src/dialogs/fl_digi.cxx:2950 msgid "Sunspot creation underway!" msgstr "¡Creación de un sunspot en proceso!" #: src/dialogs/fl_digi.cxx:2957 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "La información del dispositivo de audio está solo disponible cuando se usa " "PortAudio como método de comunicación con el dispositivo" #: src/dialogs/fl_digi.cxx:2966 msgid "Capture device" msgstr "Dispositivo de captura" #: src/dialogs/fl_digi.cxx:2967 msgid "Playback device" msgstr "Dispositivo de reproducción" #: src/dialogs/fl_digi.cxx:2971 msgid "Capture and playback devices" msgstr "Dispositivo de captura y reproducción" #: src/dialogs/fl_digi.cxx:3017 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: No existe, ¿crear?" #: src/dialogs/fl_digi.cxx:4178 msgid "Clear log fields?" msgstr "¿Limpiar los campos del registro?" #: src/dialogs/fl_digi.cxx:4178 src/misc/configuration.cxx:723 #: src/logbook/lgbook.cxx:829 src/logbook/lgbook.cxx:1639 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4237 src/dialogs/fl_digi.cxx:6581 msgid "Confirm" msgstr "Confirmar" #: src/dialogs/fl_digi.cxx:4525 msgid "Save changed configuration?" msgstr "¿Guardar los cambios en la configuración?" #: src/dialogs/fl_digi.cxx:4541 src/dialogs/fl_digi.cxx:4566 msgid "Save log entry?" msgstr "¿Guardar los datos del contacto actual en el registro?" #: src/dialogs/fl_digi.cxx:4557 msgid "Confirm Quit" msgstr "Confirmar Salir" #: src/dialogs/fl_digi.cxx:4579 msgid "Confirm quit?" msgstr "¿Confirmar salir?" #: src/dialogs/fl_digi.cxx:5861 src/dialogs/fl_digi.cxx:7530 msgid "&File" msgstr "&Archivo" #: src/dialogs/fl_digi.cxx:5863 msgid "Folders" msgstr "Carpetas" #: src/dialogs/fl_digi.cxx:5864 msgid "Fldigi config..." msgstr "Configuración de Fldigi..." #: src/dialogs/fl_digi.cxx:5865 msgid "FLMSG files..." msgstr "Archivos FLMSG..." #: src/dialogs/fl_digi.cxx:5866 msgid "NBEMS files..." msgstr "Archivos NBEMS..." #: src/dialogs/fl_digi.cxx:5867 msgid "Data files..." msgstr "Archivos de datos..." #: src/dialogs/fl_digi.cxx:5870 src/dialogs/confdialog.cxx:9267 msgid "Macros" msgstr "Macros" #: src/dialogs/fl_digi.cxx:5871 msgid "Open ..." msgstr "Abrir..." #: src/dialogs/fl_digi.cxx:5872 msgid "Save ..." msgstr "Guardar..." #: src/dialogs/fl_digi.cxx:5875 #, fuzzy msgid "Config Scripts" msgstr "Confirmar Salir" #: src/dialogs/fl_digi.cxx:5876 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5877 #, fuzzy msgid "Generate" msgstr "General" #: src/dialogs/fl_digi.cxx:5880 msgid "Text Capture" msgstr "Captura de Texto" #: src/dialogs/fl_digi.cxx:5885 src/misc/debug.cxx:99 #: src/dialogs/confdialog.cxx:14403 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5886 msgid "RX capture" msgstr "Capturar RX" #: src/dialogs/fl_digi.cxx:5887 msgid "TX generate" msgstr "Generar TX" #: src/dialogs/fl_digi.cxx:5888 src/dialogs/confdialog.cxx:14514 msgid "Playback" msgstr "Reproducir" #: src/dialogs/fl_digi.cxx:5892 src/dialogs/fl_digi.cxx:7531 msgid "Exit" msgstr "Salir" #: src/dialogs/fl_digi.cxx:6135 src/dialogs/fl_digi.cxx:7692 msgid "&Configure" msgstr "&Configuración" #: src/dialogs/fl_digi.cxx:6137 src/dialogs/confdialog.cxx:8377 msgid "UI" msgstr "IU" #: src/dialogs/fl_digi.cxx:6139 msgid "Colors && Fonts" msgstr "Colores y tipografía" #: src/dialogs/fl_digi.cxx:6140 src/dialogs/confdialog.cxx:8224 #: src/logbook/lgbook.cxx:726 msgid "Operator" msgstr "Operador" #: src/dialogs/fl_digi.cxx:6141 msgid "User Interface" msgstr "Interfaz de usuario" #: src/dialogs/fl_digi.cxx:6142 src/dialogs/fl_digi.cxx:6211 #: src/dialogs/fl_digi.cxx:7693 src/dialogs/confdialog.cxx:9972 msgid "Waterfall" msgstr "Cascada" #: src/dialogs/fl_digi.cxx:6143 msgid "Waterfall controls" msgstr "Controles de la cascada" #: src/dialogs/fl_digi.cxx:6146 #, fuzzy msgid "Operating" msgstr "Operador" #: src/dialogs/fl_digi.cxx:6147 src/dialogs/fl_digi.cxx:7696 #, fuzzy msgid "Active Modem" msgstr "Modos de RX" #: src/dialogs/fl_digi.cxx:6148 msgid "Winkeyer" msgstr "" #: src/dialogs/fl_digi.cxx:6152 src/dialogs/fl_digi.cxx:7695 msgid "Sound Card" msgstr "Dispositivo de sonido" #: src/dialogs/fl_digi.cxx:6154 msgid "Miscellaneous" msgstr "" #: src/dialogs/fl_digi.cxx:6155 #, fuzzy msgid "CPU speed" msgstr "Vel. del AFC" #: src/dialogs/fl_digi.cxx:6156 src/dialogs/confdialog.cxx:15102 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/fl_digi.cxx:6157 #, fuzzy msgid "PSKmail" msgstr "Pskmail" #: src/dialogs/fl_digi.cxx:6158 #, fuzzy msgid "PSK reporter" msgstr "PSK Reporter" #: src/dialogs/fl_digi.cxx:6159 #, fuzzy msgid "Sweet spot" msgstr "Frecuencia Inicial" #: src/dialogs/fl_digi.cxx:6160 #, fuzzy msgid "Text IO" msgstr "E/S de Texto" #: src/dialogs/fl_digi.cxx:6161 src/dialogs/confdialog.cxx:15491 msgid "DTMF" msgstr "DTMF" #: src/dialogs/fl_digi.cxx:6162 src/dialogs/confdialog.cxx:15501 msgid "WX" msgstr "WX" #: src/dialogs/fl_digi.cxx:6163 src/dialogs/confdialog.cxx:15592 msgid "KML" msgstr "KML" #: src/dialogs/fl_digi.cxx:6166 src/misc/debug.cxx:107 #: src/widgets/FTextRXTX.cxx:1927 src/widgets/flinput2.cxx:127 #: src/dialogs/confdialog.cxx:13399 src/logbook/lgbook.cxx:1143 msgid "Other" msgstr "Otro" #: src/dialogs/fl_digi.cxx:6167 src/dialogs/confdialog.cxx:16152 msgid "Autostart" msgstr "Autoinicio" #: src/dialogs/fl_digi.cxx:6168 src/dialogs/fl_digi.cxx:7697 msgid "IDs" msgstr "IDs" # Texto de la pestaña IO en la ventana de configuración Fldigi (@HK4QWC) #: src/dialogs/fl_digi.cxx:6169 src/dialogs/fl_digi.cxx:7698 #: src/dialogs/confdialog.cxx:16360 msgid "IO" msgstr "E/S" #: src/dialogs/fl_digi.cxx:6170 src/dialogs/fl_digi.cxx:7700 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notificaciones" #: src/dialogs/fl_digi.cxx:6171 src/dialogs/fl_digi.cxx:7699 #: src/dialogs/confdialog.cxx:16691 #, fuzzy msgid "PSM" msgstr "PSK" #: src/dialogs/fl_digi.cxx:6172 src/dialogs/fl_digi.cxx:7701 #, fuzzy msgid "Test Signals" msgstr "Señal transmitida" #: src/dialogs/fl_digi.cxx:6175 #, fuzzy msgid "Contest/Logging" msgstr "Contestia" #: src/dialogs/fl_digi.cxx:6176 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:6178 src/dialogs/confdialog.cxx:8861 msgid "N3FJP logs" msgstr "" #: src/dialogs/fl_digi.cxx:6179 src/dialogs/confdialog.cxx:8810 msgid "MacLogger" msgstr "" #: src/dialogs/fl_digi.cxx:6182 src/dialogs/fl_digi.cxx:7702 msgid "Save Config" msgstr "Guardar configuración" #: src/dialogs/fl_digi.cxx:6187 msgid "View/Hide Channels" msgstr "Ver/Ocultar Canales" #: src/dialogs/fl_digi.cxx:6188 msgid "Signal browser" msgstr "Navegador de señal" #: src/dialogs/fl_digi.cxx:6190 #, fuzzy msgid "View/Hide 48 macros" msgstr "Ver/Ocultar Canales" #: src/dialogs/fl_digi.cxx:6192 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6194 msgid "Floating scope" msgstr "Osciloscopio flotante" #: src/dialogs/fl_digi.cxx:6195 src/dialogs/fl_digi.cxx:7713 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6205 #, fuzzy msgid "Rig/Log Controls" msgstr "Control del radio" #: src/dialogs/fl_digi.cxx:6218 msgid "&Logbook" msgstr "&Libro de guardia" #: src/dialogs/fl_digi.cxx:6219 msgid "View" msgstr "Vista" #: src/dialogs/fl_digi.cxx:6221 #, fuzzy msgid "Files" msgstr "&Archivo" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/confdialog.cxx:13583 msgid "Open..." msgstr "Abrir..." #: src/dialogs/fl_digi.cxx:6224 src/logbook/logsupport.cxx:1210 #: src/logbook/lgbook.cxx:1562 msgid "New" msgstr "Nuevo" #: src/dialogs/fl_digi.cxx:6227 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6228 msgid "Merge..." msgstr "Mezclar ADIF..." #: src/dialogs/fl_digi.cxx:6229 msgid "Export..." msgstr "Exportar..." #: src/dialogs/fl_digi.cxx:6232 src/dialogs/confdialog.cxx:16027 #: src/logbook/lgbook.cxx:826 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6234 msgid "Reports" msgstr "Reportes" #: src/dialogs/fl_digi.cxx:6235 msgid "Text..." msgstr "Texto..." #: src/dialogs/fl_digi.cxx:6236 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6237 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6242 #, fuzzy msgid "Field Day Logging" msgstr "Acción de la rueda del ratón en la cascada" #: src/dialogs/fl_digi.cxx:6247 src/dialogs/fl_digi.cxx:7718 msgid "&Help" msgstr "A&yuda" #: src/dialogs/fl_digi.cxx:6250 msgid "Create sunspots" msgstr "Crear un sunspot" #: src/dialogs/fl_digi.cxx:6252 msgid "Beginners' Guide" msgstr "Guía del principiante" #: src/dialogs/fl_digi.cxx:6253 src/dialogs/fl_digi.cxx:7719 msgid "Online documentation..." msgstr "Documentación en internet..." #: src/dialogs/fl_digi.cxx:6254 msgid "Fldigi web site..." msgstr "Sitio web de Fldigi..." #: src/dialogs/fl_digi.cxx:6255 msgid "Reception reports..." msgstr "Reportes de recepción..." #: src/dialogs/fl_digi.cxx:6256 msgid "Command line options" msgstr "Opciones de línea de comandos" #: src/dialogs/fl_digi.cxx:6257 msgid "Audio device info" msgstr "Información de los dispositivos de audio" #: src/dialogs/fl_digi.cxx:6258 msgid "Build info" msgstr "Información de compilación" #: src/dialogs/fl_digi.cxx:6259 src/dialogs/fl_digi.cxx:7720 #: src/misc/debug.cxx:159 msgid "Event log" msgstr "Registro de eventos" #: src/dialogs/fl_digi.cxx:6260 src/dialogs/fl_digi.cxx:7721 msgid "Check for updates..." msgstr "Comprobar si existen actualizaciones" #: src/dialogs/fl_digi.cxx:6261 src/dialogs/fl_digi.cxx:7722 msgid "&About" msgstr "&Acerca de" #: src/dialogs/fl_digi.cxx:6513 msgid "waterfall-only mode" msgstr "Modo de solo cascada" #: src/dialogs/fl_digi.cxx:6515 msgid "NO CALLSIGN SET" msgstr "NO SE HA DEFINIDO UN INDICATIVO" #: src/dialogs/fl_digi.cxx:6540 msgid "Close List" msgstr "Cerrar lista" #: src/dialogs/fl_digi.cxx:6548 msgid "Open List" msgstr "Lista abierta" #: src/dialogs/fl_digi.cxx:6581 msgid "Clear list?" msgstr "¿Limpiar la lista?" #: src/dialogs/fl_digi.cxx:6618 msgid "report" msgstr "reporte" #: src/dialogs/fl_digi.cxx:6618 msgid "reports" msgstr "reportes" #: src/dialogs/fl_digi.cxx:6628 msgid "Recent activity for grid" msgstr "Actividad reciente para el localizador" #: src/dialogs/fl_digi.cxx:7712 src/dialogs/Viewer.cxx:287 msgid "Signal Browser" msgstr "Navegador de señal" #: src/dialogs/fl_digi.cxx:8009 msgid "Scope" msgstr "Osciloscopio" #: src/dialogs/fl_digi.cxx:8104 msgid "Detected signal level" msgstr "Nivel de señal detectado" #: src/dialogs/fl_digi.cxx:8116 src/waterfall/waterfall.cxx:2331 msgid "Squelch level" msgstr "Nivel de silencio (SQL)" #: src/dialogs/fl_digi.cxx:8132 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Clic izquierdo: cambiar modo\n" "Clic derecho: configurar" #: src/dialogs/fl_digi.cxx:8141 msgid "CW transmit WPM" msgstr "WPM en TX de CW" #: src/dialogs/fl_digi.cxx:8150 msgid "Default WPM" msgstr "WPM predeterminado" #: src/dialogs/fl_digi.cxx:8188 msgid "Tx level attenuator (dB)" msgstr "atenuación de nivel de TX (dB)" #: src/dialogs/fl_digi.cxx:8216 msgid "Automatic Frequency Control" msgstr "Control Automático de Frecuencia" #: src/dialogs/fl_digi.cxx:8221 src/dialogs/confdialog.cxx:10531 msgid "Squelch" msgstr "Silenciado (SQL)" #: src/dialogs/fl_digi.cxx:8226 #, fuzzy msgid "Power Signal Monitor" msgstr "Tono pre-señal" #: src/dialogs/fl_digi.cxx:9943 #, fuzzy msgid "Delete entry?" msgstr "¿Guardar los datos del contacto actual en el registro?" #: src/dialogs/fl_digi.cxx:9943 src/spot/notify.cxx:223 src/spot/notify.cxx:229 msgid "All" msgstr "Todo" #: src/dialogs/Viewer.cxx:291 msgid "Find: " msgstr "Buscar:" #: src/dialogs/Viewer.cxx:312 src/logbook/logsupport.cxx:325 #: src/logbook/logsupport.cxx:1057 src/misc/macroedit.cxx:485 #: src/misc/newinstall.cxx:391 src/mfsk/mfsk-pic.cxx:353 #: src/spot/notify.cxx:523 src/spot/notify.cxx:527 #: src/dialogs/confdialog.cxx:16866 msgid "Close" msgstr "Cerrar" #: src/dialogs/Viewer.cxx:320 src/logbook/logsupport.cxx:328 #: src/widgets/FTextView.cxx:485 src/widgets/FTextView.cxx:652 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:12390 msgid "Clear" msgstr "Limpiar" #: src/dialogs/Viewer.cxx:324 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Clic izquierdo para limpiar el texto\n" "Clic derecho para restablecer frecuencias" #: src/dialogs/Viewer.cxx:330 msgid "Set Viewer Squelch" msgstr "Establecer el nivel de silenciado (SQL) del visor" #: src/logbook/logsupport.cxx:161 msgid "Export to CSV file" msgstr "Exportar a un archivo CSV" #: src/logbook/logsupport.cxx:188 msgid "Export to fixed field text file" msgstr "Exportar a un archivo de texto con campos fijos" #: src/logbook/logsupport.cxx:216 msgid "Export to ADIF file" msgstr "Exportar a archivo ADIF" #: src/logbook/logsupport.cxx:318 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:360 msgid "Save changed Logbook?" msgstr "¿Guardar el libro de guardia modificado?" #: src/logbook/logsupport.cxx:381 #, fuzzy msgid "Create new logbook file" msgstr "Crear un nuevo libro de log?" #: src/logbook/logsupport.cxx:404 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "%s: No existe, ¿crear?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Abrir un archivo de libro de guardia" #: src/logbook/logsupport.cxx:471 msgid "Save logbook file" msgstr "Guardar el archivo del libro de guardia" #: src/logbook/logsupport.cxx:928 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:934 msgid "Merge ADIF file" msgstr "Mezclar archivo ADIF" #: src/logbook/logsupport.cxx:971 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1051 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1089 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1211 src/spot/notify.cxx:207 #: src/spot/notify.cxx:521 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1569 msgid "Update" msgstr "Actualizar" #: src/logbook/logsupport.cxx:1817 #, c-format msgid "Really delete record for \"%s\"?" msgstr "¿Está seguro de borrar el registro para \"%s\"?" #: src/logbook/logsupport.cxx:2306 msgid "Create cabrillo report" msgstr "Crear un reporte Cabrillo" #: src/logbook/logsupport.cxx:2545 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:57 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para\n" "guardar el texto contenido entre ellas a un archivo con la fecha al estilo:\n" "\n" " NBEMS.files\\WRAP\\recv\\extract-20110205-201712.wrap" #: src/logger/rx_extract.cxx:62 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para\n" "guardar el texto contenido entre ellas a un archivo con la fecha al estilo:\n" "\n" " ~/.nbems/WRAP/recv/extraxt-20110205-201712.wrap" #: src/logger/rx_extract.cxx:288 src/logger/rx_extract.cxx:318 msgid "Could not start flmsg" msgstr "No se puede iniciar flmsg" #: src/logger/rx_extract.cxx:416 src/logger/rx_extract.cxx:420 #: src/dialogs/confdialog.cxx:15151 msgid "Locate flmsg executable" msgstr "Buscar..." #: src/logger/rx_extract.cxx:416 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:420 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:494 msgid "Locate executable" msgstr "Buscar ejecutable" #: src/logger/rx_extract.cxx:494 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:497 msgid "Locate binary" msgstr "Buscar binario" #: src/logger/rx_extract.cxx:497 msgid "*" msgstr "*" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Guardar todo el texto recibido, un carácter cada vez al siguiente archivo:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:537 msgid "Rig mode" msgstr "Modo del Radio" #: src/misc/configuration.cxx:538 msgid "Always LSB" msgstr "Siempre LSB" #: src/misc/configuration.cxx:539 msgid "Always USB" msgstr "Siempre USB" #: src/misc/configuration.cxx:720 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "¿Restablecer todas las opciones a su valores\n" "predefinidos?\n" "Los efectos de esta acción no se observarán\n" "hasta el próximo inicio del programa\n" "Se eliminaran los siguientes archivos:\n" "fldigi_def.xml and fldigi.prefs\n" #: src/misc/configuration.cxx:725 msgid "Confirm RESET" msgstr "Confirmar RESTABLECIMIENTO" #: src/misc/debug.cxx:89 msgid "Quiet" msgstr "Calmado" #: src/misc/debug.cxx:89 msgid "Error" msgstr "Error" #: src/misc/debug.cxx:89 msgid "Warning" msgstr "Advertencia" #: src/misc/debug.cxx:89 msgid "Info" msgstr "Info" #: src/misc/debug.cxx:89 msgid "Verbose" msgstr "Más explícito" #: src/misc/debug.cxx:89 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:98 msgid "ARQ control" msgstr "Control ARQ" #: src/misc/debug.cxx:100 src/waterfall/waterfall.cxx:2332 msgid "Modem" msgstr "Módem" #: src/misc/debug.cxx:102 msgid "Flrig I/O" msgstr "" #: src/misc/debug.cxx:103 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:104 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:105 msgid "KISS control" msgstr "control KISS" #: src/misc/debug.cxx:106 msgid "Mac Logger" msgstr "" #: src/misc/debug.cxx:163 msgid "Log sources" msgstr "Orígenes de logs" #: src/misc/debug.cxx:168 msgid "Change log level" msgstr "Cambiar el nivel de log" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tmi frecuencia" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tmodo" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tmi localizador" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tmi nombre" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tmi QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tmi RST" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy FD class" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:79 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy state" msgstr "\tmi nombre" #: src/misc/macroedit.cxx:81 #, fuzzy msgid "\tmy ST" msgstr "\tmi RST" #: src/misc/macroedit.cxx:82 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:83 #, fuzzy msgid "\tmy CNTY" msgstr "\tmi QTH" #: src/misc/macroedit.cxx:84 msgid "\tmy antenna" msgstr "\tmi antena" #: src/misc/macroedit.cxx:85 msgid "\toperating band" msgstr "\tbanda de operación" #: src/misc/macroedit.cxx:86 msgid "\tFldigi version" msgstr "\tversion de Fldigi" #: src/misc/macroedit.cxx:87 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother call" msgstr "\tindicativo del otro" #: src/misc/macroedit.cxx:91 msgid "\tother name" msgstr "\tnombre del otro" #: src/misc/macroedit.cxx:92 msgid "\tother QTH" msgstr "\tQTH del otro" #: src/misc/macroedit.cxx:93 #, fuzzy msgid "\tother State" msgstr "\tRST del otro" #: src/misc/macroedit.cxx:94 #, fuzzy msgid "\tother Province" msgstr "\tnombre del otro" #: src/misc/macroedit.cxx:95 msgid "\tother locator" msgstr "\tlocalizador del otro" #: src/misc/macroedit.cxx:96 msgid "\tother RST" msgstr "\tRST del otro" #: src/misc/macroedit.cxx:99 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:100 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:103 msgid "\t# QSO recs" msgstr "\t# QSO guardados" #: src/misc/macroedit.cxx:104 msgid "\tnext QSO rec #" msgstr "\tpróximo QSO a guardar #" #: src/misc/macroedit.cxx:107 msgid "\tmap on google" msgstr "\tmapearlo en google" #: src/misc/macroedit.cxx:108 msgid "\tmap by value" msgstr "\tmapearlo por su valor" #: src/misc/macroedit.cxx:111 msgid "\tclear RX pane" msgstr "\tlimpiar el panel de RX" #: src/misc/macroedit.cxx:112 msgid "\tclear TX pane" msgstr "\tlimpiar el panel de TX" #: src/misc/macroedit.cxx:115 msgid "\ttext to NAME/QTH" msgstr "\ttexto a NOMBRE/QTH" #: src/misc/macroedit.cxx:119 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk Encendido, apagado, alternado" #: src/misc/macroedit.cxx:123 msgid "\tclear log fields" msgstr "\tlimpiar los campos del log" #: src/misc/macroedit.cxx:124 msgid "\tsave QSO data" msgstr "\tguardar datos del QSO" #: src/misc/macroedit.cxx:125 msgid "\tsaveQSO data, append msg to notes" msgstr "" "\tguardar los datos del QSO, añadiendo msg a las notas del log" #: src/misc/macroedit.cxx:126 msgid "\tlog at xmt time" msgstr "\tguardar al tiempo que transmite" #: src/misc/macroedit.cxx:127 msgid "\tsaveQSO data, append msg to notes" msgstr "" "\tGuardar los datos del QSO, añadiendo msg a las notas del log, " "cuando se muestra en el buffer de TX" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL" msgstr "\tSalvar directo en eQSL.cc" #: src/misc/macroedit.cxx:129 msgid "\tlog eQSL optional msg" msgstr "\tlogear un mensaje opcional en eQSL.cc" #: src/misc/macroedit.cxx:132 msgid "\tQSO time (HHMM))" msgstr "\tHora del QSO (HHMM)" #: src/misc/macroedit.cxx:133 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:137 #, fuzzy msgid "\tlocal time, default %H%M" msgstr "\thora local (HHMM)" #: src/misc/macroedit.cxx:138 #, fuzzy msgid "\tzulu time default %H%MZ" msgstr "\thora zulu HHMMZ" #: src/misc/macroedit.cxx:139 #, fuzzy msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tfecha local AAAA-MM-DD" #: src/misc/macroedit.cxx:140 #, fuzzy msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tfecha zulu AAAA-MM-DD Z" #: src/misc/macroedit.cxx:141 msgid "\tget weather data" msgstr "\tobtener datos de clima" #: src/misc/macroedit.cxx:142 msgid "\tget weather data for station" msgstr "\tobtener datos de clima para una estación específica" #: src/misc/macroedit.cxx:145 msgid "\tcontest counter" msgstr "\tcontador de concurso" #: src/misc/macroedit.cxx:146 msgid "\tdecrement counter" msgstr "\tdecrementar el contador" #: src/misc/macroedit.cxx:147 msgid "\tincrement counter" msgstr "\tincrementar el contador" #: src/misc/macroedit.cxx:148 msgid "\texchange in" msgstr "\tintercambio entrante" #: src/misc/macroedit.cxx:149 msgid "\texchange out" msgstr "\tintercambio enviado" #: src/misc/macroedit.cxx:150 msgid "\texchange begin" msgstr "\tcomienzo del intercambio" #: src/misc/macroedit.cxx:151 msgid "\texchange end" msgstr "\tfin del intercambio" #: src/misc/macroedit.cxx:152 msgid "\tsave contest out" msgstr "\tguardar intercambio de concurso" #: src/misc/macroedit.cxx:153 #, fuzzy msgid "\tcurrent contest serno" msgstr "\tdecrementar el contador" #: src/misc/macroedit.cxx:154 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD class" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tFD section" msgstr "Número de serie recibido" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "\tcontest class" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:158 #, fuzzy msgid "
\tARRL section" msgstr "Número de serie recibido" #: src/misc/macroedit.cxx:161 msgid "\treceive" msgstr "\trecibir" #: src/misc/macroedit.cxx:162 msgid "\ttransmit" msgstr "\ttransmitir" #: src/misc/macroedit.cxx:163 msgid "\ttoggle T/R" msgstr "\talternar Tx/Rx" #: src/misc/macroedit.cxx:164 msgid "\tsearch UP for signal" msgstr "\tbuscar ARRIBA en la cascada por una señal" #: src/misc/macroedit.cxx:165 msgid "\tsearch DOWN for signal" msgstr "\tbuscar ABAJO en la cascada por una señal" #: src/misc/macroedit.cxx:166 msgid "\treturn to sweet spot" msgstr "\tretornar a la frecuencia inicial en la cascada" #: src/misc/macroedit.cxx:167 msgid "\tmove to freq NNNN Hz" msgstr "\tmoverte a la frecuencia NNNN" #: src/misc/macroedit.cxx:168 msgid "\tleft-clk QSY button" msgstr "\tclic-izquierdo QSY a la frecuencia preferida de este modo" #: src/misc/macroedit.cxx:169 msgid "\tright-clk QSY button" msgstr "\tclic-derecho QSY a la frecuencia anterior" #: src/misc/macroedit.cxx:170 msgid "\tqsy to kHz, Hz" msgstr "\tqsy a kHz, Hz" #: src/misc/macroedit.cxx:171 msgid "\tincr/decr xcvr freq" msgstr "\tincr/decr frece xcvr" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr mode" msgstr "\tmodo válido para el trx" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr filter width" msgstr "\tancho del filtro válido para el trx" #: src/misc/macroedit.cxx:174 #, fuzzy msgid "\tvalid xcvr low cutoff filter" msgstr "\tancho del filtro válido para el trx" #: src/misc/macroedit.cxx:175 #, fuzzy msgid "\tvalid xcvr hi cutoff filter" msgstr "\tancho del filtro válido para el trx" #: src/misc/macroedit.cxx:176 msgid "\trig freq has kbd focus" msgstr "\tfrec radio tiene el teclado en foco" #: src/misc/macroedit.cxx:179 msgid "\tinsert QRG into Rx text" msgstr "\tInsertar QRG en el panel de RX" #: src/misc/macroedit.cxx:182 msgid "\tinsert text file" msgstr "\tinsertar archivo de texto" #: src/misc/macroedit.cxx:183 #, fuzzy msgid "\tinsert image file" msgstr "\tinsertar imagen de MFSK" #: src/misc/macroedit.cxx:184 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tpause transmit" msgstr "\tpausar la transmisión (Pasar a RX sin limpiar el panel de TX)" #: src/misc/macroedit.cxx:188 msgid "\tidle signal for NN.nn sec" msgstr "\tesperar NN.nn segundos por la señal" #: src/misc/macroedit.cxx:189 msgid "\trepeat every NN sec" msgstr "\trepetir cada NN segundos" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tsintonizar la señal por NN segundos" #: src/misc/macroedit.cxx:191 #, fuzzy msgid "\tdelay xmt for NN.n sec" msgstr "\tretrasar la transmisión por NN segundos" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\trepetir la macro continuamente" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution" msgstr "\tejecución programada" #: src/misc/macroedit.cxx:196 msgid "\t set xmt attenuator" msgstr "\tponer el atenuador de TX del equipo a este valor" #: src/misc/macroedit.cxx:199 msgid "\tCW identifier" msgstr "\tidentificador de CW" #: src/misc/macroedit.cxx:200 #, fuzzy msgid "\tsend mode ID; TX start only" msgstr "\tenviar el ID del modo como video texto" #: src/misc/macroedit.cxx:201 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RSID encendido, apagado, alternado" #: src/misc/macroedit.cxx:204 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID encendido, apagado, alternado" #: src/misc/macroedit.cxx:205 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tTransmitir |NN| ráfagas de RsID" #: src/misc/macroedit.cxx:206 msgid "\t[Wait][Len](ms)" msgstr "\t[Wait][Len](ms)" #: src/misc/macroedit.cxx:209 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:210 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tCW QSK post-timing" msgstr "\tCW QSK al final" #: src/misc/macroedit.cxx:214 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK al inicio" #: src/misc/macroedit.cxx:215 msgid "\tCW rise time" msgstr "\ttiempo de subida de CW" #: src/misc/macroedit.cxx:216 msgid "\tCW WPM:Farnsworth" msgstr "\tCW PPM:Farnsworth" #: src/misc/macroedit.cxx:219 msgid "\tsend CAT cmd" msgstr "\tenviar comando CAT" #: src/misc/macroedit.cxx:220 #, fuzzy msgid "\tsend CAT cmd" msgstr "\tenviar comando CAT" #: src/misc/macroedit.cxx:223 msgid "\tAFC on,off,toggle" msgstr "\tAFC encendido, apagado, alternado" #: src/misc/macroedit.cxx:224 msgid "\tLOCK on,off,toggle" msgstr "\tbloqueo (LOCK) encendido, apagado, alternado" #: src/misc/macroedit.cxx:225 msgid "\tRev on,off,toggle" msgstr "\tReverso activado, desactivado, alternado" #: src/misc/macroedit.cxx:228 msgid "\tchange macro defs file" msgstr "\tcambiar el archivo de definición de macros" #: src/misc/macroedit.cxx:229 msgid "\tsave current macro file" msgstr "\tguardar el archivo de macro actual" #: src/misc/macroedit.cxx:232 msgid "\tignore all comment text" msgstr "\tignore todos los textos de comentario" #: src/misc/macroedit.cxx:235 msgid "\tmodem char/sec test on nn chars" msgstr "\tprueba módem car/sec en nn caracteres" #: src/misc/macroedit.cxx:236 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" "\tprueba sincronización de módem , 'n' grupos de 5 caracteres al " "azar" #: src/misc/macroedit.cxx:237 msgid "\tmodem timing test, spec' file" msgstr "" "\tarchivo de especificación de la prueba de sincronización del " "módem" #: src/misc/macroedit.cxx:238 msgid "\tmodem timing test, string 's'" msgstr "" "\tprueba de sincronización de módem, cadena de caracteres 's'" #: src/misc/macroedit.cxx:241 msgid "\tWAV file; internal string" msgstr "\tarchivo WAV; cadena de texto interna" #: src/misc/macroedit.cxx:242 msgid "\tWAV file; 'n' random 5 char groups" msgstr "\tarchivo WAV; 'n' grupos de 5 caracteres al azar" #: src/misc/macroedit.cxx:243 msgid "\tWAV file; spec' file" msgstr "\tarchivo WAV; archivo de especificación" #: src/misc/macroedit.cxx:244 msgid "\tWAV file; string 's'" msgstr "\tarchivo WAV; cadena de texto 's'" #: src/misc/macroedit.cxx:247 msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAnálisis CSV encendido,apagado, alternado" #: src/misc/macroedit.cxx:250 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:374 msgid "Text file to insert" msgstr "Archivo de texto a insertar" #: src/misc/macroedit.cxx:384 msgid "Test text file" msgstr "Archivo de texto de prueba" #: src/misc/macroedit.cxx:394 msgid "MFSK image file" msgstr "Archivo de imagen MFSK" #: src/misc/macroedit.cxx:404 msgid "Change to Macro file" msgstr "Cambiar a archivo de macro" #: src/misc/macroedit.cxx:414 #, fuzzy msgid "Select wav file" msgstr "Seleccionar dispositivo" #: src/misc/macroedit.cxx:426 msgid "Executable file to insert" msgstr "Archivo ejecutable a insertar" #: src/misc/macroedit.cxx:457 msgid "Macro Text" msgstr "Texto del macro" #: src/misc/macroedit.cxx:462 msgid "Select Tag" msgstr "Selecciona la etiqueta" #: src/misc/macroedit.cxx:474 msgid "Macro Button Label" msgstr "Etiqueta del botón de macro" #: src/misc/macroedit.cxx:482 msgid "Apply" msgstr "Aplicar" #: src/misc/macroedit.cxx:509 msgid "Macro editor - " msgstr "Editor de macros - " #: src/misc/macros.cxx:4408 msgid "Open macro file" msgstr "Abrir archivo de macro" #: src/misc/macros.cxx:4409 src/misc/macros.cxx:4452 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Archivo de definición de macro para Fldigi\t*.mdf" #: src/misc/macros.cxx:4451 msgid "Save macro file" msgstr "Guardar el archivo de macros" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Terminar" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Siguiente" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Atrás" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "Este diálogo te guiará en las configuraciones básicas" #: src/misc/newinstall.cxx:524 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" "Puedes saltar o salir de cualquiera de estas configuraciones en cualquier " "momento" #: src/misc/newinstall.cxx:525 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Todos los ajustes mostrados aquí pueden ser modificados luego en el menú " "Configurar" #: src/misc/newinstall.cxx:540 msgid "Fldigi configuration wizard" msgstr "Asistente de configuración de fldigi" #: src/mfsk/mfsk-pic.cxx:147 src/mfsk/mfsk-pic.cxx:151 #: src/mfsk/mfsk-pic.cxx:316 src/mfsk/mfsk-pic.cxx:319 msgid "Time needed: " msgstr "Tiempo necesario:" #: src/mfsk/mfsk-pic.cxx:181 msgid "Load image file" msgstr "Cargar archivo de imagen" #: src/mfsk/mfsk-pic.cxx:327 msgid "Send image" msgstr "Enviar imagen" #: src/mfsk/mfsk-pic.cxx:334 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Cargar o descargar una imagen\n" "desde archivo (PNG, JPEG, BMP)" #: src/mfsk/mfsk-pic.cxx:338 msgid "Transfer speed, X1-normal" msgstr "Velocidad de transferencia, X1-normal" #: src/mfsk/mfsk-pic.cxx:350 msgid "Load" msgstr "Cargar" #: src/waterfall/waterfall.cxx:1768 msgid "Waterfall / FFT / Scope" msgstr "Cascada / FFT / Osciloscopio" #: src/waterfall/waterfall.cxx:1777 msgid "Upper signal level (dB)" msgstr "Nivel superior de la señal (dB)" #: src/waterfall/waterfall.cxx:1788 msgid "Signal range (dB)" msgstr "Rango de señal (dB)" #: src/waterfall/waterfall.cxx:1794 msgid "Change waterfall scale" msgstr "Cambiar escala de la cascada" #: src/waterfall/waterfall.cxx:1799 msgid "Slew display lower in frequency" msgstr "Correr la cascada hacia frecuencias más bajas" #: src/waterfall/waterfall.cxx:1804 msgid "Center display on signal" msgstr "Centrar la señal" #: src/waterfall/waterfall.cxx:1809 msgid "Slew display higher in frequency" msgstr "Correr la cascada hacia frecuencias más altas" #: src/waterfall/waterfall.cxx:1814 msgid "Waterfall drop speed" msgstr "Velocidad de caída de la cascada" #: src/waterfall/waterfall.cxx:1824 msgid "Adjust cursor frequency" msgstr "Ajustar la frecuencia del cursor" #: src/waterfall/waterfall.cxx:1829 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centrar en el pasabanda\n" "Clic derecho para deshacer" #: src/waterfall/waterfall.cxx:1835 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Almacenar modo y frecuencia\n" "Clic derecho para listar" #: src/waterfall/waterfall.cxx:1845 msgid "Lock transmit frequency" msgstr "Bloquear la frecuencia de transmisión" #: src/waterfall/waterfall.cxx:1854 src/dialogs/confdialog.cxx:9413 msgid "Reverse" msgstr "Invertir" #: src/waterfall/waterfall.cxx:1861 msgid "Transmit/Receive" msgstr "Transmitir/Recibir" #: src/waterfall/waterfall.cxx:2330 msgid "AFC range or BW" msgstr "Rango AFC o Ancho de banda" #: src/waterfall/waterfall.cxx:2331 msgid "Signal search" msgstr "Búsqueda de señal" #: src/waterfall/waterfall.cxx:2332 msgid "Modem carrier" msgstr "Portadora del modo" #: src/waterfall/waterfall.cxx:2332 msgid "Scroll" msgstr "Desplazamiento" #: src/rigcontrol/rigxml.cxx:1115 msgid "Open rig xml file" msgstr "Abrir archivo xml de radio" #: src/rigcontrol/rigxml.cxx:1115 msgid "Fldigi rig xml definition file\t*.xml" msgstr "archivo de definición de radio xml\t*.xml" #: src/soundcard/sound.cxx:170 #, fuzzy msgid "Waveform Audio Format\t*.wav\n" msgstr "" "Forma de onda del audio\t*.wav\n" "AU\t*.{au.snd}\n" #: src/soundcard/sound.cxx:171 msgid "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:173 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Codec de audio libre sin pérdida\t*.flac" #: src/soundcard/sound.cxx:180 src/soundcard/sound.cxx:182 msgid "Audio file" msgstr "Archivo de audio" #: src/soundcard/sound.cxx:360 msgid "Playback continuous loop?" msgstr "¿Reproducir en un lazo continuo?" #: src/spot/notify.cxx:195 msgid "My callsign de CALL" msgstr "Mi indicativo de INDICATIVO" #: src/spot/notify.cxx:196 msgid "Station heard twice" msgstr "Estación escuchada dos veces" #: src/spot/notify.cxx:197 msgid "Custom text search" msgstr "Busqueda de texto personalizada" #: src/spot/notify.cxx:198 msgid "RSID reception" msgstr "Recepción con RSID" #: src/spot/notify.cxx:206 msgid "Toggle" msgstr "Alternar" #: src/spot/notify.cxx:208 src/spot/notify.cxx:520 msgid "Remove" msgstr "Eliminar" #: src/spot/notify.cxx:219 src/dialogs/confdialog.cxx:8509 #: src/dialogs/confdialog.cxx:11939 src/dialogs/confdialog.cxx:11950 #: src/dialogs/confdialog.cxx:12035 src/dialogs/confdialog.cxx:12046 #: src/dialogs/confdialog.cxx:14699 src/dialogs/confdialog.cxx:14728 #: src/dialogs/confdialog.cxx:14757 src/dialogs/confdialog.cxx:14781 #: src/dialogs/confdialog.cxx:14810 msgid "Select" msgstr "Selecciona" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/spot/notify.cxx:574 #: src/logbook/lgbook.cxx:777 src/logbook/lgbook.cxx:1182 msgid "Continent" msgstr "Continente" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 src/logbook/lgbook.cxx:1194 msgid "ITU zone" msgstr "Zona ITU" #: src/spot/notify.cxx:222 src/spot/notify.cxx:228 #: src/widgets/FTextRXTX.cxx:170 src/logbook/lgbook.cxx:1170 msgid "CQ zone" msgstr "Zona CQ" #: src/spot/notify.cxx:225 msgid "Deselect" msgstr "Deseleccionar" #: src/spot/notify.cxx:519 msgid "Add" msgstr "Añadir" #: src/spot/notify.cxx:522 msgid "Test..." msgstr "Probar..." #: src/spot/notify.cxx:525 src/widgets/FTextView.cxx:486 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Todos" #: src/spot/notify.cxx:526 src/logbook/lgbook.cxx:616 #: src/logbook/lgbook.cxx:817 src/logbook/lgbook.cxx:1631 #: src/logbook/lgbook.cxx:1705 msgid "Clear All" msgstr "Limpiar todo" #: src/spot/notify.cxx:573 src/widgets/FTextRXTX.cxx:156 #: src/logbook/lgbook.cxx:732 src/logbook/lgbook.cxx:1034 msgid "Country" msgstr "País" #: src/spot/notify.cxx:1127 msgid "The regular expression field must not be empty." msgstr "El campo de expresión regular no debe estar vacío." #: src/spot/notify.cxx:1133 msgid "The regular expression must be valid." msgstr "La expresión regular debe ser válida." #: src/spot/notify.cxx:1140 msgid "Please set your callsign first." msgstr "Por favor especifica tu indicativo primero." #: src/spot/notify.cxx:1277 msgid "Run program" msgstr "Ejecutar programa" #: src/spot/notify.cxx:1312 msgid "" "Default test string is:\n" " \"" msgstr "" "La cadena de prueba por omisión es:\n" "\"" #: src/spot/notify.cxx:1313 msgid "Enter test string or leave blank for default:" msgstr "" "Entre la cadena de prueba, o déjela en blanco para usar la predefinida:" #: src/spot/notify.cxx:1324 msgid "This event's regular expression is invalid." msgstr "La expresión regular de este evento es inválida." #: src/spot/notify.cxx:1331 msgid "The test string did not match this event's search pattern." msgstr "La cadena de prueba no concuerda con el patrón para este evento." #: src/spot/notify.cxx:1349 msgid "Available substrings" msgstr "Sub cadenas de texto disponibles" #: src/spot/notify.cxx:1432 src/logbook/lgbook.cxx:1612 msgid "Frequency" msgstr "Frecuencia" #: src/spot/notify.cxx:1434 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1609 msgid "Callsign" msgstr "Indicativo" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Abrir paleta" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:127 msgid "Fldigi palette\t*.pal" msgstr "Paleta Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:113 src/waterfall/colorbox.cxx:138 msgid "Palette: " msgstr "Paleta:" #: src/waterfall/colorbox.cxx:127 msgid "Save palette" msgstr "Guardar paleta" #: src/widgets/FTextRXTX.cxx:149 msgid "Look up call" msgstr "Buscar indicativo" #: src/widgets/FTextRXTX.cxx:150 src/logbook/lgbook.cxx:660 #: src/logbook/lgbook.cxx:865 src/logbook/lgbook.cxx:1661 msgid "Call" msgstr "Ind." #: src/widgets/FTextRXTX.cxx:151 src/logbook/lgbook.cxx:664 #: src/logbook/lgbook.cxx:877 src/logbook/lgbook.cxx:1611 msgid "Name" msgstr "Nombre" #: src/widgets/FTextRXTX.cxx:152 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:153 src/dialogs/confdialog.cxx:8315 #: src/dialogs/confdialog.cxx:9044 src/logbook/lgbook.cxx:711 msgid "State" msgstr "Estado" #: src/widgets/FTextRXTX.cxx:154 src/dialogs/confdialog.cxx:8344 #: src/logbook/lgbook.cxx:774 src/logbook/lgbook.cxx:1145 #: src/logbook/lgbook.cxx:1146 msgid "County" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:155 src/logbook/lgbook.cxx:729 msgid "Province" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:157 msgid "Locator" msgstr "Cuadrícula" #: src/widgets/FTextRXTX.cxx:158 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:160 src/dialogs/confdialog.cxx:9038 #: src/logbook/lgbook.cxx:768 src/logbook/lgbook.cxx:1697 msgid "Exchange In" msgstr "Intercambio RX" #: src/widgets/FTextRXTX.cxx:161 #, fuzzy msgid "Rx Serial #" msgstr "Serie recibida" #: src/widgets/FTextRXTX.cxx:162 src/logbook/lgbook.cxx:1338 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:163 src/logbook/lgbook.cxx:1427 #, fuzzy msgid "Section" msgstr "Acción" #: src/widgets/FTextRXTX.cxx:165 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:166 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:167 #, fuzzy msgid "SS check" msgstr "Marcar todo" #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1428 #, fuzzy msgid "SS section" msgstr "Acción" #: src/widgets/FTextRXTX.cxx:171 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:180 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:183 #, fuzzy msgid "QSOp state" msgstr "Hora de inicio del QSO" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:186 #, fuzzy msgid "QSOp name" msgstr "Nombre del operador" #: src/widgets/FTextRXTX.cxx:187 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:190 msgid "Insert marker" msgstr "Insertar marcador" #: src/widgets/FTextRXTX.cxx:198 #, fuzzy msgid "All entries" msgstr "Reintentos" #: src/widgets/FTextRXTX.cxx:200 msgid "Scroll hints" msgstr "Sugerencias de desplazamiento" #: src/widgets/FTextRXTX.cxx:1791 msgid " in " msgstr " en " #: src/widgets/FTextRXTX.cxx:1793 msgid "Last QSO" msgstr "Último QSO" #: src/widgets/FTextRXTX.cxx:1838 src/dialogs/confdialog.cxx:10550 msgid "Transmit" msgstr "Transmitir" #: src/widgets/FTextRXTX.cxx:1839 src/dialogs/confdialog.cxx:10413 #: src/dialogs/confdialog.cxx:12479 msgid "Receive" msgstr "Recibir" #: src/widgets/FTextRXTX.cxx:1840 msgid "Abort" msgstr "Abortar" #: src/widgets/FTextRXTX.cxx:1841 msgid "Send image..." msgstr "Enviar imagen..." #: src/widgets/FTextRXTX.cxx:1850 src/widgets/flinput2.cxx:50 #, fuzzy msgid "Spec Char" msgstr "Juego de caracteres" #: src/widgets/FTextRXTX.cxx:1858 src/widgets/flinput2.cxx:58 #, fuzzy msgid "A" msgstr "Az" #: src/widgets/FTextRXTX.cxx:1874 src/widgets/flinput2.cxx:74 #, fuzzy msgid "E" msgstr "Ex" # Texto de la pestaña IO en la ventana de configuración Fldigi (@HK4QWC) #: src/widgets/FTextRXTX.cxx:1884 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "E/S" #: src/widgets/FTextRXTX.cxx:1894 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "No" #: src/widgets/FTextRXTX.cxx:1898 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16436 msgid "O" msgstr "S" #: src/widgets/FTextRXTX.cxx:1912 src/widgets/flinput2.cxx:112 #, fuzzy msgid "U" msgstr "IU" #: src/widgets/FTextRXTX.cxx:1922 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextView.cxx:296 msgid "Insert text" msgstr "Insertar texto" #: src/widgets/FTextView.cxx:349 msgid "Save text as" msgstr "Guardar texto como" #: src/widgets/FTextView.cxx:484 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Copiar" #: src/widgets/FTextView.cxx:487 msgid "Save as..." msgstr "Guardar como..." #: src/widgets/FTextView.cxx:488 src/widgets/FTextView.cxx:654 msgid "Word wrap" msgstr "Ajuste de línea" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Cortar" #: src/widgets/FTextView.cxx:651 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Pegar" #: src/widgets/FTextView.cxx:653 msgid "Insert file..." msgstr "Insertar archivo..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Deshacer" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1576 msgid "Delete" msgstr "Borrar" #: src/config_script/run_scripts.cxx:935 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2769 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2776 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2783 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2787 #, fuzzy, c-format msgid "Executing script file: %s" msgstr "Seleccionar archivo de descripción del radio" #: src/config_script/run_scripts.cxx:2792 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2793 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2797 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2833 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:350 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:394 #, fuzzy msgid "Command Not Found" msgstr "Opciones de línea de comandos" #: src/config_script/script_parsing.cxx:398 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:402 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:406 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:410 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:414 #, fuzzy msgid "General Error" msgstr "General" #: src/config_script/script_parsing.cxx:418 #, fuzzy msgid "No Errors" msgstr "Errores" #: src/config_script/script_parsing.cxx:422 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:426 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:430 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:434 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:438 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:442 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:446 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:450 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:454 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:458 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:462 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:466 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:470 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:474 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:478 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:482 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:486 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:489 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:957 #: src/config_script/script_parsing.cxx:1084 #: src/config_script/script_parsing.cxx:1797 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1027 #: src/config_script/script_parsing.cxx:1143 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1033 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1147 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1230 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1238 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1426 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1430 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1647 #: src/config_script/script_parsing.cxx:1734 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1748 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "no" msgstr "Info" #: src/dialogs/confdialog.cxx:330 #, fuzzy msgid "yes" msgstr "Si" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 #: src/dialogs/confdialog.cxx:15878 src/dialogs/confdialog.cxx:15948 #: src/dialogs/confdialog.cxx:16121 msgid "Show" msgstr "Mostrar" #: src/dialogs/confdialog.cxx:7409 src/dialogs/confdialog.cxx:7531 msgid "Hide" msgstr "Esconder" #: src/dialogs/confdialog.cxx:8215 msgid "Fldigi configuration" msgstr "Configuración" #: src/dialogs/confdialog.cxx:8227 #, fuzzy msgid "Station / Operator" msgstr "Estación escuchada dos veces" #: src/dialogs/confdialog.cxx:8230 #, fuzzy msgid "Station Callsign:" msgstr "Indicativo del operador" #: src/dialogs/confdialog.cxx:8231 #, fuzzy msgid "Station callsign" msgstr "Indicativo del operador" #: src/dialogs/confdialog.cxx:8244 #, fuzzy msgid "Operator Callsign:" msgstr "Indicativo del operador" #: src/dialogs/confdialog.cxx:8245 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:8259 #, fuzzy msgid "Operator Name:" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:8260 msgid "Operators name" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:8273 msgid "Antenna:" msgstr "Antena:" #: src/dialogs/confdialog.cxx:8274 msgid "Short description of antenna" msgstr "Descripción corta de la antena" #: src/dialogs/confdialog.cxx:8287 #, fuzzy msgid "Station QTH:" msgstr "Estación" #: src/dialogs/confdialog.cxx:8288 msgid "Operators QTH" msgstr "QTH del operador" #: src/dialogs/confdialog.cxx:8301 #, fuzzy msgid "Station Locator:" msgstr "Cuadrícula:" #: src/dialogs/confdialog.cxx:8302 msgid "Maidenhead locator as in EM64qv" msgstr "Cuadrícula Maindenhead como en FL11aj" #: src/dialogs/confdialog.cxx:8332 msgid "Abbreviation for state" msgstr "" #: src/dialogs/confdialog.cxx:8361 msgid "Abbreviation for county" msgstr "" #: src/dialogs/confdialog.cxx:8381 msgid "Browser" msgstr "Navegador" #: src/dialogs/confdialog.cxx:8384 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Canales, el primer canal comienza en el límite inferior de la cascada" #: src/dialogs/confdialog.cxx:8385 msgid "Change # of psk viewer channels" msgstr "Cambiar el número de canales del navegador" #: src/dialogs/confdialog.cxx:8402 msgid "Inactivity timeout" msgstr "Tiempo de inactividad" #: src/dialogs/confdialog.cxx:8403 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:8419 msgid "Channel label" msgstr "Etiqueta del canal" #: src/dialogs/confdialog.cxx:8420 msgid "Appearance of label on each channel" msgstr "Apariencia de la etiqueta de cada canal" #: src/dialogs/confdialog.cxx:8431 msgid "Audio frequency" msgstr "Frecuencia de audio" #: src/dialogs/confdialog.cxx:8432 msgid "Radio frequency" msgstr "Frecuencia RF" #: src/dialogs/confdialog.cxx:8432 msgid "Channel number" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:8437 src/dialogs/confdialog.cxx:10135 msgid "Font..." msgstr "Tipografía" #: src/dialogs/confdialog.cxx:8438 msgid "select browser font" msgstr "Selecciona la letra del navegador" #: src/dialogs/confdialog.cxx:8441 msgid "Fixed Intervals" msgstr "Intervalos Fijados" #: src/dialogs/confdialog.cxx:8442 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forzar el espaciado de los canales a incrementos de 100Hz" #: src/dialogs/confdialog.cxx:8449 msgid "Continuous scrolling" msgstr "Movimiento contínuo" #: src/dialogs/confdialog.cxx:8450 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "Activado - Estilo marquesina\n" "Desactivado - Limpiar y re-comenzar" #: src/dialogs/confdialog.cxx:8455 msgid "Lowest freq on bottom of viewer" msgstr "Frecuencia más baja en la parte inferior del visor" #: src/dialogs/confdialog.cxx:8456 msgid "Change positions of low to high channels" msgstr "Cambiar la posición de los canales de abajo a arriba" #: src/dialogs/confdialog.cxx:8461 msgid "Play back history when active channel selected" msgstr "Reproducir el historial cuando se selecciona un canal" #: src/dialogs/confdialog.cxx:8462 msgid "Audio stream history decoded on selected signal" msgstr "Historial de audio descodificado al seleccionar" #: src/dialogs/confdialog.cxx:8467 msgid "Detection Level" msgstr "Detección de nivel" #: src/dialogs/confdialog.cxx:8469 msgid "Backgnd" msgstr "Fondo" #: src/dialogs/confdialog.cxx:8470 msgid "Background color of signal viewer squelch control" msgstr "" "Color de fondo de control deslizante del\n" "silenciador del navegador" #: src/dialogs/confdialog.cxx:8475 msgid "Button" msgstr "Botón" #: src/dialogs/confdialog.cxx:8476 msgid "Slider hilite color of signal viewer squelch control" msgstr "" "Color resaltado del deslizante del control\n" "del silenciador del navegador" #: src/dialogs/confdialog.cxx:8483 msgid "Browser Line Colors" msgstr "Colores de Resaltado" #: src/dialogs/confdialog.cxx:8485 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:8486 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "Color 1 para el resaltado de HiLite en el visor de PSK/RTTY" #: src/dialogs/confdialog.cxx:8491 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:8492 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "Color 2 para el resaltado de HiLite en el visor de PSK/RTTY" #: src/dialogs/confdialog.cxx:8497 msgid "Even" msgstr "Par" #: src/dialogs/confdialog.cxx:8498 msgid "Even lines" msgstr "Lineas pares" #: src/dialogs/confdialog.cxx:8503 msgid "Odd" msgstr "Impar" #: src/dialogs/confdialog.cxx:8504 msgid "Odd lines" msgstr "Líneas impares" #: src/dialogs/confdialog.cxx:8510 msgid "Select line" msgstr "Seleccionar línea" #: src/dialogs/confdialog.cxx:8521 src/dialogs/confdialog.cxx:8947 #: src/dialogs/confdialog.cxx:10411 src/dialogs/confdialog.cxx:12328 #: src/dialogs/confdialog.cxx:15279 msgid "General" msgstr "General" #: src/dialogs/confdialog.cxx:8525 msgid "Show tooltips" msgstr "Mostrar sugerencias" #: src/dialogs/confdialog.cxx:8526 msgid "Enable / disable tooltips" msgstr "Activar / desactivar sugerencias" #: src/dialogs/confdialog.cxx:8532 msgid "Show menu icons" msgstr "Mostrar íconos del menú" #: src/dialogs/confdialog.cxx:8533 msgid "Enable / disable icons on menus" msgstr "Activar / desactivar los iconos en el menú" #: src/dialogs/confdialog.cxx:8538 msgid "UI scheme" msgstr "Esquema de la Interfaz" #: src/dialogs/confdialog.cxx:8539 msgid "Change application look and feel" msgstr "Cambiar la apariencia de la aplicación" #: src/dialogs/confdialog.cxx:8557 msgid "Visible modes" msgstr "Modos visibles" #: src/dialogs/confdialog.cxx:8558 msgid "Select modes for menu access" msgstr "Seleccionar los modos para acceso desde el menú" #: src/dialogs/confdialog.cxx:8561 msgid "UI language" msgstr "Idioma de la IU" #: src/dialogs/confdialog.cxx:8562 src/dialogs/confdialog.cxx:10281 msgid "Changes take effect on next program startup" msgstr "Los cambios serán efectivos en el próximo inicio del programa" #: src/dialogs/confdialog.cxx:8581 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "" "Imprimir CW / RTTY / THROB / CONTESTIA en minúsculas\n" "(Estos modos solo reconocen las mayúsculas)" #: src/dialogs/confdialog.cxx:8591 #, fuzzy msgid "Transmit lower case text" msgstr "Transmitir tono de inicio bajo" #: src/dialogs/confdialog.cxx:8598 msgid "Exit prompts" msgstr "Avisos de salida" #: src/dialogs/confdialog.cxx:8601 msgid "Prompt to save Configuration" msgstr "Confirmar para grabar configuración" #: src/dialogs/confdialog.cxx:8606 src/dialogs/confdialog.cxx:9375 msgid "Prompt to save macro file" msgstr "Confirmar para grabar macro" #: src/dialogs/confdialog.cxx:8607 src/dialogs/confdialog.cxx:9376 msgid "Write current macro set on program exit" msgstr "Graba el conjunto de macros actuales al cerrar el programa" #: src/dialogs/confdialog.cxx:8612 msgid "Prompt to save log" msgstr "Confirmar para grabar log" #: src/dialogs/confdialog.cxx:8613 src/dialogs/confdialog.cxx:8663 msgid "Bug me about saving log entries" msgstr "Pregunta acerca de grabar los registros del log" #: src/dialogs/confdialog.cxx:8618 msgid "Confirm exit" msgstr "Confirmar la salida" #: src/dialogs/confdialog.cxx:8625 msgid "Check for updates" msgstr "Comprobar si existen actualizaciones" #: src/dialogs/confdialog.cxx:8628 msgid "Check for updates when starting program" msgstr "Comprobar si hay actualizaciones al iniciar el programa" #: src/dialogs/confdialog.cxx:8638 #, fuzzy msgid "Show TX timer" msgstr "Mostrar las entidades DXCC" #: src/dialogs/confdialog.cxx:8643 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:8655 src/dialogs/confdialog.cxx:9664 msgid "Log" msgstr "Log" #: src/dialogs/confdialog.cxx:8658 #, fuzzy msgid "QSO" msgstr "QSY" #: src/dialogs/confdialog.cxx:8659 msgid "QSO logging" msgstr "Registro de los QSO" #: src/dialogs/confdialog.cxx:8662 msgid "Prompt to save log on exit" msgstr "Confirmar si graba el log al salir" #: src/dialogs/confdialog.cxx:8668 msgid "Clear on save" msgstr "Limpiar al grabar" #: src/dialogs/confdialog.cxx:8669 msgid "Clear log entries after saving or using macro " msgstr "" "Limpiar la entradas del log después\n" "de guardar o usar la macro " #: src/dialogs/confdialog.cxx:8674 msgid "Convert callsign to upper case" msgstr "Convertir el indicativo a mayúsculas" #: src/dialogs/confdialog.cxx:8675 msgid "Force callsign field to UPPERCASE" msgstr "Forzar el campo indicativo a MAYUSCULAS" #: src/dialogs/confdialog.cxx:8680 msgid "Auto-fill Country and Azimuth" msgstr "Autocompletar el país y azimut" #: src/dialogs/confdialog.cxx:8681 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" "Autocompletar la información del país y del azimut usando el archivo cty.dat " "(Lo tienes instalado, ¿cierto?)" #: src/dialogs/confdialog.cxx:8686 msgid "Sort by Date/Time OFF" msgstr "Ordenar por fecha/hora de fin" #: src/dialogs/confdialog.cxx:8687 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Ordenar por fecha y hora de terminación del QSO\n" "Afecta a todos los libros de guardia con formato Cabrillo/ADIF" #: src/dialogs/confdialog.cxx:8692 msgid "Date time ON == OFF" msgstr "Fecha y hora de inicio = fin" #: src/dialogs/confdialog.cxx:8693 msgid "Force date/time ON == date/time OFF" msgstr "Forzar fecha/hora de inicio = fecha/hora de final del QSO" #: src/dialogs/confdialog.cxx:8698 #, fuzzy msgid "Default RST in to 599/59" msgstr "RST recibido a 599 por omisión" #: src/dialogs/confdialog.cxx:8699 #, fuzzy msgid "Clear log controls sets RST in to 599/59" msgstr "" "Al limpiar los datos del contacto\n" "pone el RST recibido a 599 por omisión" #: src/dialogs/confdialog.cxx:8704 #, fuzzy msgid "Default RST out to 599/59" msgstr "Poner siempre RST enviado a 599" #: src/dialogs/confdialog.cxx:8705 #, fuzzy msgid "Clear log controls sets RST out to 599/59" msgstr "" "Al limpiar los datos del contacto\n" "pone el RST enviado a 599 por omisión" #: src/dialogs/confdialog.cxx:8710 msgid "cty.dat folder" msgstr "archivo cty.dat" #: src/dialogs/confdialog.cxx:8711 msgid "Enter full path-name for cty.dat folder" msgstr "Entre la ruta completa del archivo cty.dat" #: src/dialogs/confdialog.cxx:8724 msgid "Browse" msgstr "Buscar" #: src/dialogs/confdialog.cxx:8725 msgid "Locate cty.dat file" msgstr "Buscar el archivo cty.dat" #: src/dialogs/confdialog.cxx:8728 src/dialogs/confdialog.cxx:8901 #: src/dialogs/confdialog.cxx:9681 src/dialogs/confdialog.cxx:9701 #: src/dialogs/confdialog.cxx:9718 src/dialogs/confdialog.cxx:9748 #: src/dialogs/confdialog.cxx:10574 src/dialogs/confdialog.cxx:13514 #: src/dialogs/confdialog.cxx:15584 src/dialogs/confdialog.cxx:16398 #: src/dialogs/confdialog.cxx:16549 src/dialogs/confdialog.cxx:16567 #: src/dialogs/confdialog.cxx:16615 src/dialogs/confdialog.cxx:16681 msgid "Default" msgstr "Omisión" #: src/dialogs/confdialog.cxx:8729 msgid "Restore cty.dat default folder" msgstr "Restablecer carpeta de cty.dat predeterminada" #: src/dialogs/confdialog.cxx:8732 msgid "Reload" msgstr "Recargar" #: src/dialogs/confdialog.cxx:8733 msgid "Reload cty.dat" msgstr "Recargar cty.dat" #: src/dialogs/confdialog.cxx:8736 msgid "Transmit Power" msgstr "Potencia TX" #: src/dialogs/confdialog.cxx:8737 msgid "Tx power used for logbook entries" msgstr "Potencia de TX a poner en el log" #: src/dialogs/confdialog.cxx:8751 #, fuzzy msgid "Display logbook read datum at start" msgstr "Mostrar el nombre del archivo de macros al iniciar" #: src/dialogs/confdialog.cxx:8752 src/dialogs/confdialog.cxx:9370 msgid "The filename is written to the RX text area" msgstr "El nombre de archivo es escrito en el panel de Rx" #: src/dialogs/confdialog.cxx:8761 src/dialogs/confdialog.cxx:8763 #, fuzzy msgid "Rx Text" msgstr "Captura de Texto de RX" #: src/dialogs/confdialog.cxx:8766 msgid "Single-click to capture" msgstr "Clic sencillo para capturar" #: src/dialogs/confdialog.cxx:8767 src/dialogs/confdialog.cxx:8796 msgid "Enable for single click capure of text in Rx panel" msgstr "Habilitar para capturar el texto del panel Rx con un solo clic" #: src/dialogs/confdialog.cxx:8772 msgid "callsign tooltips in received text" msgstr "Mostrar información de los indicativos" #: src/dialogs/confdialog.cxx:8773 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Mostrar información de un indicativo después\n" "de estar dos segundos con el ratón sobre este" #: src/dialogs/confdialog.cxx:8778 msgid "Word delimiters" msgstr "Delimitadores" #: src/dialogs/confdialog.cxx:8779 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "Las entradas de texto de Rx están delimitadas por los\n" "caracteres definidos aquí, el tabulador, el espacio y la\n" "nueva línea están ya incluidos" #: src/dialogs/confdialog.cxx:8795 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:8801 #, fuzzy msgid "Clear log fields - new CALL" msgstr "¿Limpiar los campos del registro?" #: src/dialogs/confdialog.cxx:8812 #, fuzzy msgid "Connect to MacLogger" msgstr "Conectar con el servidor" #: src/dialogs/confdialog.cxx:8817 #, fuzzy msgid "Capture Radio Report" msgstr "Crear un reporte Cabrillo" #: src/dialogs/confdialog.cxx:8823 #, fuzzy msgid "Capture Log Report" msgstr "Crear un reporte Cabrillo" #: src/dialogs/confdialog.cxx:8828 #, fuzzy msgid "Capture Lookup " msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:8833 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:8838 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:8843 #, fuzzy msgid "Enable UDP log file" msgstr "Activar todos" #: src/dialogs/confdialog.cxx:8848 #, fuzzy msgid "UDP data stream" msgstr "Fuente datos" #: src/dialogs/confdialog.cxx:8856 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:8863 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:8868 #, fuzzy msgid "Clear text" msgstr "Limpiar lista" #: src/dialogs/confdialog.cxx:8871 #, fuzzy msgid "Address" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:8872 #, fuzzy msgid "N3FJP Server IP Address" msgstr "Dirección IP" #: src/dialogs/confdialog.cxx:8886 src/dialogs/confdialog.cxx:12846 #: src/dialogs/confdialog.cxx:12870 src/dialogs/confdialog.cxx:13101 #: src/dialogs/confdialog.cxx:13534 src/dialogs/confdialog.cxx:16533 #: src/dialogs/confdialog.cxx:16589 src/dialogs/confdialog.cxx:16637 #: src/dialogs/confdialog.cxx:16670 msgid "Port" msgstr "Puerto" #: src/dialogs/confdialog.cxx:8887 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:8902 src/dialogs/confdialog.cxx:13515 #: src/dialogs/confdialog.cxx:16399 src/dialogs/confdialog.cxx:16550 #: src/dialogs/confdialog.cxx:16568 src/dialogs/confdialog.cxx:16616 #: src/dialogs/confdialog.cxx:16682 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Establece la dirección IP y el número\n" "del puerto al valor por omisión." #: src/dialogs/confdialog.cxx:8905 #, fuzzy msgid "Enable Data Stream" msgstr "Activar el registro del texto de recepción." #: src/dialogs/confdialog.cxx:8910 src/dialogs/confdialog.cxx:11059 #: src/dialogs/confdialog.cxx:11411 src/dialogs/confdialog.cxx:12798 #: src/dialogs/confdialog.cxx:13116 #, fuzzy msgid "Connect" msgstr "Reconectar" #: src/dialogs/confdialog.cxx:8915 src/dialogs/confdialog.cxx:15327 #, fuzzy msgid "Connected" msgstr "Reconectar" #: src/dialogs/confdialog.cxx:8921 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:8928 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:8944 #, fuzzy msgid "Contests" msgstr "Concurso" #: src/dialogs/confdialog.cxx:8949 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:8964 #, fuzzy msgid "State QSO Party" msgstr "Fecha de inicio del QSO" #: src/dialogs/confdialog.cxx:8980 #, fuzzy msgid "Text capture order" msgstr "Captura de Texto" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Context Notes" msgstr "Concurso" #: src/dialogs/confdialog.cxx:8993 msgid "Duplicate check, CALL plus" msgstr "Chequear duplicados, Indicativo más..." #: src/dialogs/confdialog.cxx:8996 msgid "On/Off" msgstr "On/Off" #: src/dialogs/confdialog.cxx:8997 msgid "Check for duplicates" msgstr "Comprobar si hay duplicados" #: src/dialogs/confdialog.cxx:9002 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:672 src/logbook/lgbook.cxx:1386 msgid "Band" msgstr "Banda" #: src/dialogs/confdialog.cxx:9003 msgid "Bands must match" msgstr "Concordar en bandas" #: src/dialogs/confdialog.cxx:9008 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:675 src/logbook/lgbook.cxx:950 #: src/logbook/lgbook.cxx:1614 src/logbook/lgbook.cxx:1669 msgid "Mode" msgstr "Modo" #: src/dialogs/confdialog.cxx:9009 msgid "Mode must match" msgstr "Concordar en modo" #: src/dialogs/confdialog.cxx:9014 msgid "Time span over" msgstr "Rango de tiempo" #: src/dialogs/confdialog.cxx:9015 msgid "QSO must not occur within a time period of" msgstr "El QSO no debe ocurrir dentro del período especificado a continuación." #: src/dialogs/confdialog.cxx:9020 msgid "Dup Color" msgstr "Color Dup." #: src/dialogs/confdialog.cxx:9021 msgid "Left click to select dup color" msgstr "Clic izquierdo para seleccionar el color de duplicados" #: src/dialogs/confdialog.cxx:9029 #, fuzzy msgid "? Dup Color" msgstr "Color Dup." #: src/dialogs/confdialog.cxx:9030 #, fuzzy msgid "Left click to select possible dup color" msgstr "Clic izquierdo para seleccionar el color de duplicados" #: src/dialogs/confdialog.cxx:9039 msgid "free form 1 must match" msgstr "Concordar en el número de intercambio" #: src/dialogs/confdialog.cxx:9045 msgid "State must match" msgstr "Concordar en estado (EE.UU.)" #: src/dialogs/confdialog.cxx:9050 msgid "minutes" msgstr "minutos" #: src/dialogs/confdialog.cxx:9051 msgid "Enter time span in minutes" msgstr "Entre rango de tiempo en minutos" #: src/dialogs/confdialog.cxx:9069 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Intercambio de concurso recibido" #: src/dialogs/confdialog.cxx:9072 src/dialogs/confdialog.cxx:16104 #, fuzzy msgid "Send" msgstr "Enviado:" #: src/dialogs/confdialog.cxx:9073 msgid "free form exchange" msgstr "Intercambio predefinido" #: src/dialogs/confdialog.cxx:9087 #, fuzzy msgid "RST always 599/59" msgstr "RST siempre 599" #: src/dialogs/confdialog.cxx:9088 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "Forzar el RST recibido/enviado a 599" #: src/dialogs/confdialog.cxx:9093 #, fuzzy msgid "Send CW cut #'s" msgstr "Enviar números CW (5NN)" #: src/dialogs/confdialog.cxx:9094 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:9101 #, fuzzy msgid "Start Nbr" msgstr "Inicio" #: src/dialogs/confdialog.cxx:9102 msgid "Starting number" msgstr "Número de inicio" #: src/dialogs/confdialog.cxx:9117 msgid "Digits" msgstr "Dígitos" #: src/dialogs/confdialog.cxx:9118 msgid "Number of digits in serial number" msgstr "Número de dígitos en el número de serie" #: src/dialogs/confdialog.cxx:9134 msgid "Use leading zeros" msgstr "Usar ceros a la izquierda" #: src/dialogs/confdialog.cxx:9135 msgid "Insert leading zeros into Xmtd serial number" msgstr "Insertar ceros a la izquierda en el número de serie enviado" #: src/dialogs/confdialog.cxx:9140 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Reiniciar" #: src/dialogs/confdialog.cxx:9141 msgid "Initialize the QSO logging fields" msgstr "Inicializar la cuenta del número serie" #: src/dialogs/confdialog.cxx:9150 src/dialogs/confdialog.cxx:9152 msgid "Field Day" msgstr "" #: src/dialogs/confdialog.cxx:9155 src/logbook/lgbook.cxx:1250 #, fuzzy msgid "Operator Call" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:9156 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:9170 #, fuzzy msgid "My Section" msgstr "Acción" #: src/dialogs/confdialog.cxx:9171 #, fuzzy msgid "Field Day Section" msgstr "Acción de la rueda del ratón en la cascada" #: src/dialogs/confdialog.cxx:9185 src/dialogs/confdialog.cxx:9209 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:9186 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:9204 msgid "JOTA/School" msgstr "" #: src/dialogs/confdialog.cxx:9206 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:9210 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:9226 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:9230 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:9245 #, fuzzy msgid "Scout Operator Name" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:9271 msgid "Mouse wheel active on macro buttons" msgstr "Rueda del ratón activa en los botones de macro" #: src/dialogs/confdialog.cxx:9272 msgid "enable mouse wheel control of macro bar" msgstr "Activar la rueda del ratón como control de la barra de macros" #: src/dialogs/confdialog.cxx:9279 msgid "Number and position of macro bars" msgstr "Cantidad y posición de las barras de macro" #: src/dialogs/confdialog.cxx:9282 msgid "Button Height" msgstr "Altura del botón" #: src/dialogs/confdialog.cxx:9283 msgid "Height of macro bar" msgstr "Altura de la barra de macro" #: src/dialogs/confdialog.cxx:9293 msgid "One above Rx/Tx" msgstr "Una sobre Rx/Tx" #: src/dialogs/confdialog.cxx:9294 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Una barra de macros debajo del panel de registro\n" "altura variable" #: src/dialogs/confdialog.cxx:9299 msgid "One above waterfall" msgstr "Una sobre la cascada" #: src/dialogs/confdialog.cxx:9304 msgid "One below waterfall" msgstr "Una bajo la cascada" #: src/dialogs/confdialog.cxx:9309 msgid "Two scheme 1" msgstr "Dos (Esquema 1)" #: src/dialogs/confdialog.cxx:9314 msgid "Two scheme 2" msgstr "Dos (Esquema 2)" #: src/dialogs/confdialog.cxx:9319 msgid "Two scheme 3" msgstr "Dos (Esquema 3)" #: src/dialogs/confdialog.cxx:9324 msgid "Two scheme 4" msgstr "Dos (Esquema 4)" #: src/dialogs/confdialog.cxx:9329 msgid "Two scheme 5" msgstr "Dos (Esquema 5)" #: src/dialogs/confdialog.cxx:9334 msgid "Two scheme 6" msgstr "Dos (Esquema 6)" #: src/dialogs/confdialog.cxx:9339 msgid "Two scheme 7" msgstr "Dos (Esquema 1)" #: src/dialogs/confdialog.cxx:9344 msgid "Two scheme 8" msgstr "Dos (Esquema 8)" #: src/dialogs/confdialog.cxx:9349 msgid "Two scheme 9" msgstr "Dos (Esquema 9)" #: src/dialogs/confdialog.cxx:9354 msgid "Two scheme 10" msgstr "Dos (Esquema 10)" #: src/dialogs/confdialog.cxx:9363 #, fuzzy msgid "Load last used macro file at start" msgstr "Cargar el último archivo de macro usado en el inicio" #: src/dialogs/confdialog.cxx:9364 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "Activado - Usar el último conjunto de macros\n" "Desactivado - Usar el conjunto pre-establecido" #: src/dialogs/confdialog.cxx:9369 #, fuzzy msgid "Display macro filename at start" msgstr "Mostrar el nombre del archivo de macros al iniciar" #: src/dialogs/confdialog.cxx:9385 #, fuzzy msgid "Show macro control codes" msgstr "Mostrar el editor de macros" #: src/dialogs/confdialog.cxx:9386 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:9396 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:9405 msgid "WF Ctrls" msgstr "Controles de la cascada" # Propuesto por @HK4QWC # Habilite la casilla para mostrar el control de operador correspondiente # Propuesto por @CO7WT # Marcar para activar cada opción #: src/dialogs/confdialog.cxx:9409 msgid "Enable check box to show each respective operator control" msgstr "Marcar para activar cada opción" #: src/dialogs/confdialog.cxx:9419 msgid "WF Magnification" msgstr "Ampliado de la cascada" #: src/dialogs/confdialog.cxx:9425 msgid "WF carrier" msgstr "Portadora de la cascada" #: src/dialogs/confdialog.cxx:9431 msgid "WF Shift Controls" msgstr "Controles superiores de cascada" #: src/dialogs/confdialog.cxx:9437 msgid "WF ref level" msgstr "Nivel de referencia de la cascada" #: src/dialogs/confdialog.cxx:9443 msgid "WF drop rate" msgstr "Vel. de caída de la cascada" #: src/dialogs/confdialog.cxx:9449 msgid "WF amp span" msgstr "Amplitud de la cascada" #: src/dialogs/confdialog.cxx:9455 msgid "WF Store" msgstr "Almacenar frecuencia" #: src/dialogs/confdialog.cxx:9461 msgid "WF mode" msgstr "Modo de la cascada" #: src/dialogs/confdialog.cxx:9467 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:9473 msgid "XMT lock" msgstr "Bloqueo en Tx" #: src/dialogs/confdialog.cxx:9479 msgid "Enable all" msgstr "Activar todos" #: src/dialogs/confdialog.cxx:9482 msgid "Disable all" msgstr "Desactivar" #: src/dialogs/confdialog.cxx:9489 msgid "Clrs/Fnts" msgstr "Colores/Tipos" #: src/dialogs/confdialog.cxx:9492 msgid "Rx/Tx" msgstr "Rx/Tx" #: src/dialogs/confdialog.cxx:9494 msgid "Rx/Tx Character set" msgstr "Seleccionar el conjunto de caracteres Rx/Tx" #: src/dialogs/confdialog.cxx:9495 msgid "Select Rx/Tx Character Set" msgstr "Seleccionar la tipografía de Rx/Tx" #: src/dialogs/confdialog.cxx:9515 msgid "Rx bkgnd" msgstr "Rx fondo" #: src/dialogs/confdialog.cxx:9518 msgid "Tx bkgnd" msgstr "Tx fondo" #: src/dialogs/confdialog.cxx:9527 msgid "Rx font" msgstr "Texto Rx" #: src/dialogs/confdialog.cxx:9530 msgid "Tx font" msgstr "Texto Tx" #: src/dialogs/confdialog.cxx:9539 #, fuzzy msgid "Macro Edit Font" msgstr "Editor de macros - " #: src/dialogs/confdialog.cxx:9542 msgid "Text Highlighting" msgstr "Texto Resaltado" #: src/dialogs/confdialog.cxx:9545 src/dialogs/confdialog.cxx:11958 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:9546 msgid "Sent chars in Rx/Tx pane" msgstr "Caracteres enviados en el panel de Rx/Tx" #: src/dialogs/confdialog.cxx:9551 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:9552 msgid "Control chars in Rx/Tx pane" msgstr "Caracteres de control en el panel de Rx/Tx" #: src/dialogs/confdialog.cxx:9557 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:9558 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Caracteres ignorados en el panel de TX\n" "(Tx enc./apag. en CW)" #: src/dialogs/confdialog.cxx:9563 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:9564 msgid "Alternate character color in Rx panelr" msgstr "Color alternativo de los caracteres en el panel de Rxr" #: src/dialogs/confdialog.cxx:9569 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:9570 msgid "Selection background color in Rx Tx panels" msgstr "Fondo de color de la selección en los paneles de Rx/Tx" #: src/dialogs/confdialog.cxx:9575 src/dialogs/confdialog.cxx:9793 msgid "System" msgstr "Sistema" #: src/dialogs/confdialog.cxx:9578 src/dialogs/confdialog.cxx:9780 #: src/dialogs/confdialog.cxx:11976 src/logbook/lgbook.cxx:823 msgid "Defaults" msgstr "Reiniciar" #: src/dialogs/confdialog.cxx:9583 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "FreqDisp / Meters" msgstr "Vis. Frec / medidores" #: src/dialogs/confdialog.cxx:9594 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:9603 src/dialogs/confdialog.cxx:9678 #: src/dialogs/confdialog.cxx:9698 src/dialogs/confdialog.cxx:9715 #: src/dialogs/confdialog.cxx:9740 msgid "Font" msgstr "Tipos" #: src/dialogs/confdialog.cxx:9606 src/dialogs/confdialog.cxx:9620 #: src/dialogs/confdialog.cxx:9634 src/dialogs/confdialog.cxx:9675 #: src/dialogs/confdialog.cxx:9695 msgid "Bg Color" msgstr "Fondo" #: src/dialogs/confdialog.cxx:9609 msgid "Digit Color" msgstr "Dígitos" #: src/dialogs/confdialog.cxx:9612 msgid "Sys Colors" msgstr "Sistema" #: src/dialogs/confdialog.cxx:9617 msgid "S-meter" msgstr "Medidor de señal" #: src/dialogs/confdialog.cxx:9623 src/dialogs/confdialog.cxx:9637 msgid "Scale Color" msgstr "Escala" #: src/dialogs/confdialog.cxx:9626 src/dialogs/confdialog.cxx:9640 msgid "Meter Color" msgstr "Medidor" #: src/dialogs/confdialog.cxx:9631 msgid "PWR-meter" msgstr "Medidor de potencia" #: src/dialogs/confdialog.cxx:9643 msgid "Power scale" msgstr "Escala de potencia" #: src/dialogs/confdialog.cxx:9644 src/dialogs/confdialog.cxx:10204 msgid "Select the type of FFT prefilter" msgstr "Seleccionar el tipo de prefiltro de FFT" #: src/dialogs/confdialog.cxx:9655 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:9666 msgid "Logging Panel Controls" msgstr "Paneles de control de registro" #: src/dialogs/confdialog.cxx:9686 msgid "Logbook Dialog" msgstr "Diálogo del libro de guardia" #: src/dialogs/confdialog.cxx:9706 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:9709 #, fuzzy msgid "Report Browser" msgstr "Navegador" #: src/dialogs/confdialog.cxx:9721 #, fuzzy msgid "Even Lines" msgstr "Lineas pares" #: src/dialogs/confdialog.cxx:9726 #, fuzzy msgid "Odd Lines" msgstr "Líneas impares" #: src/dialogs/confdialog.cxx:9731 #, fuzzy msgid "Stream Text" msgstr "Texto secundario" #: src/dialogs/confdialog.cxx:9737 #, fuzzy msgid "Bg color" msgstr "Fondo" #: src/dialogs/confdialog.cxx:9743 #, fuzzy msgid "Alt Color" msgstr "Color" #: src/dialogs/confdialog.cxx:9744 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:9755 msgid "F_keys" msgstr "Teclas de función" #: src/dialogs/confdialog.cxx:9757 msgid "Use colored buttons" msgstr "Usa botones coloreados" #: src/dialogs/confdialog.cxx:9762 msgid "Group 1" msgstr "Grupo 1" #: src/dialogs/confdialog.cxx:9763 msgid "Background color for Function key group 1" msgstr "Color de fondo para el grupo de teclas de función 1" #: src/dialogs/confdialog.cxx:9768 msgid "Group 2" msgstr "Grupo 2" #: src/dialogs/confdialog.cxx:9769 msgid "Background color for Function key group 2" msgstr "Color de fondo para el grupo de teclas de función 2" #: src/dialogs/confdialog.cxx:9774 msgid "Group 3" msgstr "Grupo 3" #: src/dialogs/confdialog.cxx:9775 msgid "Background color for Function key group 3" msgstr "Color de fondo para el grupo de teclas de función 3" #: src/dialogs/confdialog.cxx:9783 msgid "Font/Color" msgstr "Tipografía" #: src/dialogs/confdialog.cxx:9788 msgid "Tabs" msgstr "Pestañas" #: src/dialogs/confdialog.cxx:9790 msgid "Tab Color" msgstr "Color" #: src/dialogs/confdialog.cxx:9798 msgid "Buttons" msgstr "Botones" #: src/dialogs/confdialog.cxx:9799 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:9802 msgid "Rev" msgstr "Inv." #: src/dialogs/confdialog.cxx:9805 msgid "Tune" msgstr "Sint." #: src/dialogs/confdialog.cxx:9808 #, fuzzy msgid "RxID nar" msgstr "RxID" #: src/dialogs/confdialog.cxx:9811 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:9814 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:9817 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:9820 #, fuzzy msgid "RxID wide" msgstr "RxID" #: src/dialogs/confdialog.cxx:9823 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:9826 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:9829 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:9879 msgid "Lighted button enabled colors" msgstr "Colores de los botones iluminados" #: src/dialogs/confdialog.cxx:9882 #, fuzzy msgid "All Others" msgstr "Otro" #: src/dialogs/confdialog.cxx:9891 msgid "SigLvl" msgstr "Nivel de señal" #: src/dialogs/confdialog.cxx:9893 src/dialogs/confdialog.cxx:14887 msgid "Low" msgstr "Bajo" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:14887 msgid "High" msgstr "Alto" #: src/dialogs/confdialog.cxx:9909 msgid "Normal" msgstr "Normal" #: src/dialogs/confdialog.cxx:9917 msgid "Over" msgstr "Mucho" #: src/dialogs/confdialog.cxx:9925 msgid "Signal Level Colors" msgstr "Colores de detección de nivel" #: src/dialogs/confdialog.cxx:9933 msgid "Touch" msgstr "Tacto" #: src/dialogs/confdialog.cxx:9935 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Nota:\n" "Estos elementos de configuración son útiles para usar fldigi en un\n" "dispositivo con pantalla táctil, como una tableta." #: src/dialogs/confdialog.cxx:9939 msgid "Arrow Key Control of Frequency Entry" msgstr "Entrada de frecuencia controlada por flecha" #: src/dialogs/confdialog.cxx:9942 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Der/Izq = 1 x DMS\n" "Arriba/Abajo= 10 x DMS\n" "Mayús - Der/Izq = 100 x DMS\n" "Mayús - Arriba/Abajo = 1000 x LSD" #: src/dialogs/confdialog.cxx:9946 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Der/Izq\n" "Seleccione Dígito Menos Significativo" #: src/dialogs/confdialog.cxx:9955 msgid "Rx / Tx Panels" msgstr "Panel Rx / Tx" #: src/dialogs/confdialog.cxx:9958 msgid "Tx above Rx" msgstr "Intercambia paneles Tx/Rx" #: src/dialogs/confdialog.cxx:9959 msgid "Enable to put Tx panel above Rx panel" msgstr "Activar para poner el panel Tx sobre el panel Rx" #: src/dialogs/confdialog.cxx:9977 msgid "Display" msgstr "Mostrar" #: src/dialogs/confdialog.cxx:9979 msgid "Colors and cursors" msgstr "Colores y cursores" #: src/dialogs/confdialog.cxx:9982 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:9997 src/dialogs/confdialog.cxx:10001 #: src/dialogs/confdialog.cxx:10005 src/dialogs/confdialog.cxx:10009 #: src/dialogs/confdialog.cxx:10013 src/dialogs/confdialog.cxx:10017 #: src/dialogs/confdialog.cxx:10021 src/dialogs/confdialog.cxx:10025 #: src/dialogs/confdialog.cxx:10029 src/dialogs/confdialog.cxx:10050 #: src/dialogs/confdialog.cxx:10074 src/dialogs/confdialog.cxx:10098 #: src/dialogs/confdialog.cxx:10116 msgid "Change color" msgstr "Cambiar color" #: src/dialogs/confdialog.cxx:10032 msgid "Load..." msgstr "Cargar..." #: src/dialogs/confdialog.cxx:10033 msgid "Load a new palette" msgstr "Cargar una nueva paleta" #: src/dialogs/confdialog.cxx:10036 msgid "Save..." msgstr "Guardar..." #: src/dialogs/confdialog.cxx:10037 msgid "Save this palette" msgstr "Guardar esta paleta" #: src/dialogs/confdialog.cxx:10040 src/dialogs/confdialog.cxx:12126 #: src/dialogs/confdialog.cxx:12231 msgid "Bandwidth" msgstr "Ancho de banda" #: src/dialogs/confdialog.cxx:10043 src/dialogs/confdialog.cxx:10067 #: src/dialogs/confdialog.cxx:10091 msgid "ON" msgstr "Activo" #: src/dialogs/confdialog.cxx:10044 msgid "Show cursor with bandwidth lines" msgstr "Mostar el cursos con las líneas de ancho de banda" #: src/dialogs/confdialog.cxx:10049 src/dialogs/confdialog.cxx:10073 #: src/dialogs/confdialog.cxx:10097 src/dialogs/confdialog.cxx:10115 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Color" #: src/dialogs/confdialog.cxx:10056 src/dialogs/confdialog.cxx:10080 #: src/dialogs/confdialog.cxx:10104 msgid "Wide" msgstr "Ancho" #: src/dialogs/confdialog.cxx:10057 src/dialogs/confdialog.cxx:10081 #: src/dialogs/confdialog.cxx:10092 src/dialogs/confdialog.cxx:10105 msgid "Show bandwidth tracks on waterfall" msgstr "Mostrar las pistas de ancho de banda en la cascada" #: src/dialogs/confdialog.cxx:10064 msgid "Center line" msgstr "Línea central" #: src/dialogs/confdialog.cxx:10068 msgid "Show cursor with center line" msgstr "Mostrar el cursor con la línea central" #: src/dialogs/confdialog.cxx:10088 msgid "Signal tracks" msgstr "Marcas de línea" #: src/dialogs/confdialog.cxx:10112 msgid "Notch" msgstr "Muesca" #: src/dialogs/confdialog.cxx:10126 msgid "Frequency scale" msgstr "Escala de frecuencia" #: src/dialogs/confdialog.cxx:10129 msgid "Always show audio frequencies" msgstr "Siempre mostrar las frecuencias de audio" #: src/dialogs/confdialog.cxx:10130 msgid "Audio or RF frequencies on waterfall scale" msgstr "Frecuencias de audio o RF en la escala de la cascada" #: src/dialogs/confdialog.cxx:10136 msgid "Select waterfall scale font" msgstr "Selecciona la escala de la tipografía de la cascada" #: src/dialogs/confdialog.cxx:10141 msgid "Transmit signal" msgstr "Señal transmitida" #: src/dialogs/confdialog.cxx:10144 msgid "Monitor transmitted signal" msgstr "Monitorear la señal transmitida" #: src/dialogs/confdialog.cxx:10145 msgid "Show transmit signal on waterfall" msgstr "Mostrar la señal transmitida en la cascada" #: src/dialogs/confdialog.cxx:10150 msgid "Signal level" msgstr "Nivel de señal" #: src/dialogs/confdialog.cxx:10151 msgid "Set level for good viewing" msgstr "Establecer el nivel para una visualización aceptable" #: src/dialogs/confdialog.cxx:10173 msgid "FFT Processing" msgstr "Procesamiento FFT" #: src/dialogs/confdialog.cxx:10177 src/dialogs/confdialog.cxx:10594 msgid "Lower limit" msgstr "límite inferior" #: src/dialogs/confdialog.cxx:10178 msgid "Low frequency limit in Hz" msgstr "Límite inferior de frecuencia en Hz" #: src/dialogs/confdialog.cxx:10197 msgid "FFT averaging" msgstr "Promedio de FFT" #: src/dialogs/confdialog.cxx:10198 msgid "Use averaging to decrease waterfall noise" msgstr "Usar promedio para disminuir el ruido en la cascada" #: src/dialogs/confdialog.cxx:10203 msgid "FFT prefilter window function" msgstr "Función de ventana de prefiltro FFT" #: src/dialogs/confdialog.cxx:10215 msgid "Rectangular" msgstr "Rectangular" #: src/dialogs/confdialog.cxx:10217 msgid "Triangular" msgstr "Triangular" #: src/dialogs/confdialog.cxx:10222 src/dialogs/confdialog.cxx:10606 msgid "Upper limit" msgstr "Límite superior" #: src/dialogs/confdialog.cxx:10223 msgid "High frequency limit in Hz" msgstr "Límite superior de frecuencia en Hz" #: src/dialogs/confdialog.cxx:10242 msgid "Latency" msgstr "Latencia" #: src/dialogs/confdialog.cxx:10243 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" "Señal promedio en el tiempo\n" "0 - mínima\n" "4 - máxima" #: src/dialogs/confdialog.cxx:10265 src/dialogs/confdialog.cxx:10282 msgid "Show me more or less waterfall" msgstr "Mostrar más o menos cascada" #: src/dialogs/confdialog.cxx:10268 msgid "Slow drop rate" msgstr "Tasa de caída lenta" #: src/dialogs/confdialog.cxx:10269 msgid "Normal drop speed / value" msgstr "Tasa de caída normal / valor" #: src/dialogs/confdialog.cxx:10285 msgid "Waterfall height in pixels" msgstr "Altura de la cascada" #: src/dialogs/confdialog.cxx:10286 msgid "CPU usage increases with waterfall height" msgstr "El uso del CPU aumenta con el alto de la cascada" #: src/dialogs/confdialog.cxx:10309 msgid "Mouse" msgstr "Ratón" #: src/dialogs/confdialog.cxx:10313 msgid "Left or right click always replays audio history" msgstr "Clic derecho o izquierdo siempre reproduce la historia del audio" #: src/dialogs/confdialog.cxx:10314 msgid "Replay trackline audio" msgstr "Reproducir el audio del buffer ante un clic en la cascada" #: src/dialogs/confdialog.cxx:10319 msgid "Dragging on the waterfall scale changes frequency" msgstr "Agarrar y arrastar en la cascada cambia la frecuencia" #: src/dialogs/confdialog.cxx:10320 msgid "Enable drag cursor on waterfall scale" msgstr "Activar el arrastrado del cursor en la cascada" #: src/dialogs/confdialog.cxx:10325 msgid "Insert text on single left click" msgstr "Insertar texto en un solo clic izquierdo" #: src/dialogs/confdialog.cxx:10326 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Insertar un texto especial en el panel de Rx\n" "cuando se da clic en la cascada" #: src/dialogs/confdialog.cxx:10332 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "La cadena es remplazada con\n" "el modo actual y la frecuencia" #: src/dialogs/confdialog.cxx:10344 msgid "Wheel action" msgstr "Acción de la rueda del ratón en la cascada" #: src/dialogs/confdialog.cxx:10345 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Selecciona como la rueda del ratón se\n" "comporta dentro de la cascada" #: src/dialogs/confdialog.cxx:10363 msgid "Spectrum" msgstr "" #: src/dialogs/confdialog.cxx:10364 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:10367 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:10368 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:10373 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:10374 #, fuzzy msgid "values left/below waterfall" msgstr "Una bajo la cascada" #: src/dialogs/confdialog.cxx:10379 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10389 #, fuzzy msgid "use" msgstr "Ratón" #: src/dialogs/confdialog.cxx:10390 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10403 msgid "Modems" msgstr "Módems" #: src/dialogs/confdialog.cxx:10408 src/dialogs/confdialog.cxx:15041 #: src/dialogs/confdialog.cxx:15379 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:10416 msgid "SOM decoding" msgstr "Descodificación MAO" #: src/dialogs/confdialog.cxx:10417 msgid "Self Organizing Mapping" msgstr "" "Mapas Auto Organizados (Self Organizing Mapping)\n" "Es un algoritmo de inteligencia artificial que mejora la descodificación." #: src/dialogs/confdialog.cxx:10423 msgid "Tracking" msgstr "Seguimiento" #: src/dialogs/confdialog.cxx:10424 msgid "Automatic Rx speed tracking" msgstr "Seguimiento automático de la velocidad de Rx" #: src/dialogs/confdialog.cxx:10430 msgid "Filter bandwidth" msgstr "Ancho de banda del filtro" #: src/dialogs/confdialog.cxx:10431 msgid "CW dsp filter bandwidth" msgstr "Ancho de banda del filtro DSP de CW" #: src/dialogs/confdialog.cxx:10451 #, fuzzy msgid "Matched Filt'" msgstr "Filtro" #: src/dialogs/confdialog.cxx:10452 msgid "Matched Filter bandwidth" msgstr "Ancho de banda del filtro" #: src/dialogs/confdialog.cxx:10458 msgid "Rx WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:10464 msgid "Tracked CW speed in WPM" msgstr "Velocidad de seguimiento en CW (WPM)" #: src/dialogs/confdialog.cxx:10469 msgid "Lower" msgstr "Inferior" #: src/dialogs/confdialog.cxx:10470 msgid "Detector low threshold" msgstr "Umbral bajo del detector" #: src/dialogs/confdialog.cxx:10490 msgid "Upper" msgstr "Superior" #: src/dialogs/confdialog.cxx:10491 msgid "Detector high threshold" msgstr "Umbral alto del detector" #: src/dialogs/confdialog.cxx:10511 #, fuzzy msgid "Range" msgstr "Rango de señal (dB)" #: src/dialogs/confdialog.cxx:10512 msgid "Range +/- wpm" msgstr "Rango +/- wpm" #: src/dialogs/confdialog.cxx:10534 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:10553 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:10554 src/dialogs/confdialog.cxx:10619 msgid "My transmit CW WPM" msgstr "Mi velocidad CW (WPM)" #: src/dialogs/confdialog.cxx:10575 msgid "The default CW speed" msgstr "La velocidad predefinida en CW" #: src/dialogs/confdialog.cxx:10595 msgid "No slower than this" msgstr "No más lento que" #: src/dialogs/confdialog.cxx:10607 msgid "No faster than this" msgstr "No más rápido que" #: src/dialogs/confdialog.cxx:10618 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:10639 msgid "Use Farnsworth timing" msgstr "Usar tiempos Farnsworth" #: src/dialogs/confdialog.cxx:10648 msgid "Timing and QSK" msgstr "Tiempos y QSK" #: src/dialogs/confdialog.cxx:10651 msgid "Timing" msgstr "Temporización" #: src/dialogs/confdialog.cxx:10654 msgid "Weight (%)" msgstr "Peso (en %)" #: src/dialogs/confdialog.cxx:10655 msgid "Dot to dot-space ratio" msgstr "Relación punto a punto-raya" #: src/dialogs/confdialog.cxx:10674 src/dialogs/confdialog.cxx:11458 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:10675 src/dialogs/confdialog.cxx:11459 msgid "Dash to dot ratio" msgstr "Relación punto a raya" #: src/dialogs/confdialog.cxx:10693 msgid "Edge timing" msgstr "Tiempos de borde" #: src/dialogs/confdialog.cxx:10694 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Tiempos de subida y bajada del pulso (ms)" #: src/dialogs/confdialog.cxx:10712 msgid "Edge shape" msgstr "Forma del borde" #: src/dialogs/confdialog.cxx:10713 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:10729 #, fuzzy msgid "Edge decrease" msgstr "Los bordes de subida y bajada disminuyen el ancho del pulso" #: src/dialogs/confdialog.cxx:10730 msgid "Weight decreases with increasing edge timing" msgstr "" "El peso disminuye con el incremento de los tiempos de borde de los pulsos" #: src/dialogs/confdialog.cxx:10735 #, fuzzy msgid "BPF transmit audio" msgstr "WPM en TX de CW" #: src/dialogs/confdialog.cxx:10736 msgid "Enable LO/HI bfp of transmit audio" msgstr "" #: src/dialogs/confdialog.cxx:10741 msgid "BPF bw" msgstr "" #: src/dialogs/confdialog.cxx:10742 msgid "Low filter cutoff" msgstr "" #: src/dialogs/confdialog.cxx:10763 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:10766 msgid "QSK on right audio channel" msgstr "QSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:10767 msgid "Generate square wave signal on right channel" msgstr "Generar una onda cuadrada en el canal derecho" #: src/dialogs/confdialog.cxx:10772 msgid "Pre-keydown timing (ms)" msgstr "Tiempos anteriores al PTT (ms)" #: src/dialogs/confdialog.cxx:10773 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "PTT es enviado N milisegundos antes del pulso real" #: src/dialogs/confdialog.cxx:10791 msgid "Post-keydown timing (ms)" msgstr "Tiempos posteriores al PTT (ms)" #: src/dialogs/confdialog.cxx:10792 msgid "Msec post-keydown (+ is earlier in time)" msgstr "PTT es soltado N milisegundos después del pulso real" #: src/dialogs/confdialog.cxx:10810 msgid "Send continuously" msgstr "Enviar continuamente" #: src/dialogs/confdialog.cxx:10811 msgid "Send a continuous stream of test characters" msgstr "Enviar flujo de los caracteres de prueba" #: src/dialogs/confdialog.cxx:10816 msgid "Test char" msgstr "Letra de prueba" #: src/dialogs/confdialog.cxx:10817 msgid "Test character for QSK adjustment" msgstr "Probar el carácter para ajuste de QSK" #: src/dialogs/confdialog.cxx:10837 msgid "Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:10842 msgid "Use '(' paren not KN" msgstr "Usar '(' en vez de KN" #: src/dialogs/confdialog.cxx:10847 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:10850 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:10851 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:10853 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:10854 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:10856 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:10857 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:10859 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:10860 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:10862 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:10863 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:10865 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:10866 src/dialogs/confdialog.cxx:10869 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:10868 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:10871 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:10872 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:10874 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:10875 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:10877 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:10878 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:10880 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:10881 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:10887 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10904 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10921 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10938 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10954 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:10988 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11005 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11022 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:11041 msgid "WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:11044 src/dialogs/confdialog.cxx:11396 #: src/dialogs/confdialog.cxx:12784 #, fuzzy msgid "Ser. Port" msgstr "Puerto" #: src/dialogs/confdialog.cxx:11045 src/dialogs/confdialog.cxx:13102 #, fuzzy msgid "Xcvr serial port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:11060 src/dialogs/confdialog.cxx:13117 #, fuzzy msgid "Connect / Disconnect from WinKeyer" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:11064 src/dialogs/confdialog.cxx:11093 #, fuzzy msgid "ModeReg" msgstr "Modo" #: src/dialogs/confdialog.cxx:11067 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:11068 src/dialogs/confdialog.cxx:11303 #: src/dialogs/confdialog.cxx:11309 src/dialogs/confdialog.cxx:11317 #: src/dialogs/confdialog.cxx:11325 src/dialogs/confdialog.cxx:11331 #: src/dialogs/confdialog.cxx:11337 src/dialogs/confdialog.cxx:11345 #: src/dialogs/confdialog.cxx:11351 src/dialogs/confdialog.cxx:11357 #: src/dialogs/confdialog.cxx:11363 src/dialogs/confdialog.cxx:11371 #: src/dialogs/confdialog.cxx:11377 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:11072 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:11073 #, fuzzy msgid "Enable paddle auto spacing of characters" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:11077 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:11078 #, fuzzy msgid "Enable contest character spacing" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:11082 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:11086 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11087 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:11096 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:11097 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:11101 #, fuzzy msgid "Serial echo" msgstr "Dispositivo serie" #: src/dialogs/confdialog.cxx:11106 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11107 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:11111 #, fuzzy msgid "Tone ON" msgstr "Hora com." #: src/dialogs/confdialog.cxx:11112 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:11116 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:11117 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:11123 #, fuzzy msgid "WPM Settings" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:11126 src/dialogs/confdialog.cxx:11523 #, fuzzy msgid "Min WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11127 src/dialogs/confdialog.cxx:11524 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:11135 src/dialogs/confdialog.cxx:11534 #, fuzzy msgid "Rng WPM" msgstr "Rango (WPM)" #: src/dialogs/confdialog.cxx:11136 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:11140 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:11141 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11145 #, fuzzy msgid "Cmd WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11146 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:11152 #, fuzzy msgid "Timing/Settings" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:11155 #, fuzzy msgid "Ratio" msgstr "Cuadrícula" #: src/dialogs/confdialog.cxx:11156 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11165 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:11166 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11170 #, fuzzy msgid "Sample" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:11171 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11175 #, fuzzy msgid "Weight" msgstr "Peso (en %)" #: src/dialogs/confdialog.cxx:11176 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:11181 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11185 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:11194 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:11220 src/dialogs/confdialog.cxx:13190 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:11233 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:11250 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:11254 #, fuzzy msgid "Bk" msgstr "Atrás" #: src/dialogs/confdialog.cxx:11258 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:11262 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:11273 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:11280 #, fuzzy msgid "WPM setting" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:11284 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:11285 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:11294 msgid "Ext. Chars." msgstr "" #: src/dialogs/confdialog.cxx:11297 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:11302 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:11308 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11316 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:11324 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:11336 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11344 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:11362 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:11370 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:11384 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:11397 src/dialogs/confdialog.cxx:12785 #, fuzzy msgid "nanoIO serial port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:11412 src/dialogs/confdialog.cxx:12799 #, fuzzy msgid "Connect / Disconnect from nanoIO" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:11416 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:11419 #, fuzzy msgid "Status" msgstr "Estado" #: src/dialogs/confdialog.cxx:11420 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:11423 #, fuzzy msgid "Paddle" msgstr "Rango (WPM)" #: src/dialogs/confdialog.cxx:11424 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:11434 src/dialogs/confdialog.cxx:12825 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:11447 #, fuzzy msgid "Comp'" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11448 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:11492 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:11507 #, fuzzy msgid "PTT off" msgstr "Dif. en Tx" #: src/dialogs/confdialog.cxx:11508 #, fuzzy msgid "Disable PTT" msgstr "Desactivar" #: src/dialogs/confdialog.cxx:11515 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:11516 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:11535 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:11553 msgid "Dom" msgstr "DomEX" #: src/dialogs/confdialog.cxx:11557 src/dialogs/confdialog.cxx:13298 msgid "Secondary Text" msgstr "Texto secundario" #: src/dialogs/confdialog.cxx:11558 src/dialogs/confdialog.cxx:13299 msgid "Text to send during keyboard idle times" msgstr "" "Texto a enviar durante los períodos de no actividad\n" "del teclado (canal secundario)" #: src/dialogs/confdialog.cxx:11572 src/dialogs/confdialog.cxx:13313 msgid "Filtering" msgstr "Filtraje" #: src/dialogs/confdialog.cxx:11573 msgid "Use DSP filter before decoder" msgstr "Usar el filtro DSP antes del decodificador" #: src/dialogs/confdialog.cxx:11579 src/dialogs/confdialog.cxx:13320 msgid "Filter bandwidth factor" msgstr "Factor de ancho de banda del filtro" #: src/dialogs/confdialog.cxx:11580 src/dialogs/confdialog.cxx:13321 msgid "Filter bandwidth relative to signal width" msgstr "Ancho de banda del filtro relativo al ancho de la señal" #: src/dialogs/confdialog.cxx:11598 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:11599 msgid "Enable MultiPSK-compatible FEC" msgstr "Activar el FEC compatible con MultiPSK" #: src/dialogs/confdialog.cxx:11604 src/dialogs/confdialog.cxx:13339 msgid "CWI threshold" msgstr "Umbral de CWI" #: src/dialogs/confdialog.cxx:11605 src/dialogs/confdialog.cxx:13340 msgid "CWI detection and suppression" msgstr "Detección y supresión de CWI" #: src/dialogs/confdialog.cxx:11621 src/dialogs/confdialog.cxx:13375 msgid "Paths (hidden)" msgstr "Rutas (Oculto)" #: src/dialogs/confdialog.cxx:11645 msgid "Feld" msgstr "Feld-Hell" #: src/dialogs/confdialog.cxx:11647 #, fuzzy msgid "Hell Transmit Parameters" msgstr "Potencia TX" #: src/dialogs/confdialog.cxx:11650 msgid "Transmit font" msgstr "Tipografía de Tx" #: src/dialogs/confdialog.cxx:11651 msgid "Select TX raster font" msgstr "Seleccionar la tipografía de Tx" #: src/dialogs/confdialog.cxx:11667 msgid "Pulse shape" msgstr "Forma del pulso" #: src/dialogs/confdialog.cxx:11668 msgid "Raised cosine pulse shape factor" msgstr "Factor de forma pulsada al coseno elevado " #: src/dialogs/confdialog.cxx:11679 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Transmit periods (.) when idle" msgstr "Transmitir puntos (...) cuando holgazanee" #: src/dialogs/confdialog.cxx:11685 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" "Transmitir puntos continuos (.......)\n" "cuando no halla que transmitir" #: src/dialogs/confdialog.cxx:11691 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11692 #, fuzzy msgid "Range 1...3" msgstr "Cambiar carpeta" #: src/dialogs/confdialog.cxx:11706 #, fuzzy msgid "Hell Receive Parameters" msgstr "Seleccionar los parámetros de configuración" #: src/dialogs/confdialog.cxx:11709 msgid "Reverse video" msgstr "Video inverso" #: src/dialogs/confdialog.cxx:11710 msgid "Display RX in reverse video" msgstr "Mostrar Rx en video inverso" #: src/dialogs/confdialog.cxx:11715 #, fuzzy msgid "Marquee text" msgstr "Limpiar lista" #: src/dialogs/confdialog.cxx:11716 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:11721 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:11722 #, fuzzy msgid "Range 1...4" msgstr "Cambiar carpeta" #: src/dialogs/confdialog.cxx:11734 #, fuzzy msgid "Rx Height in pixels" msgstr "Altura de la cascada" #: src/dialogs/confdialog.cxx:11735 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:11747 msgid "Receive filter bandwidth" msgstr "Ancho de banda del filtro de Rx" #: src/dialogs/confdialog.cxx:11748 msgid "Adjust the DSP bandwidth" msgstr "Ajustar el ancho de banda del DSP" #: src/dialogs/confdialog.cxx:11768 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:11769 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "FSQ" msgstr "" #: src/dialogs/confdialog.cxx:11787 msgid "Rx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11790 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:11791 #, fuzzy msgid "Minimum # hits in tone detector" msgstr "Detector multicanal" #: src/dialogs/confdialog.cxx:11802 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:11803 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:11809 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:11810 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:11822 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:11831 src/dialogs/confdialog.cxx:11985 msgid "Tx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:11834 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11839 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:11844 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:11849 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:11854 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:11859 #, fuzzy msgid "Center freq" msgstr "Línea central" #: src/dialogs/confdialog.cxx:11867 #, fuzzy msgid "Sounder" msgstr "Dispositivo de sonido" #: src/dialogs/confdialog.cxx:11868 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:11874 src/dialogs/confdialog.cxx:12004 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:11875 src/dialogs/confdialog.cxx:12005 #, fuzzy msgid "convert operator callsign to lower case" msgstr "Convertir el indicativo a mayúsculas" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Time out" msgstr "Se ha demorado demasiado" #: src/dialogs/confdialog.cxx:11881 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:11891 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:11892 #, fuzzy msgid "Enter QTC text" msgstr "Insertar texto" #: src/dialogs/confdialog.cxx:11898 #, fuzzy msgid "Message Logging" msgstr "Registro de QSO" #: src/dialogs/confdialog.cxx:11901 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:11902 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:11908 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:11909 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:11915 #, fuzzy msgid "Notify time out" msgstr "Tiempo de inactividad" #: src/dialogs/confdialog.cxx:11916 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:11928 src/dialogs/confdialog.cxx:12024 msgid "Logging" msgstr "Registro de QSO" #: src/dialogs/confdialog.cxx:11931 src/dialogs/confdialog.cxx:12027 #, fuzzy msgid "Audit log" msgstr "Audio" #: src/dialogs/confdialog.cxx:11934 src/dialogs/confdialog.cxx:11945 #: src/dialogs/confdialog.cxx:12030 src/dialogs/confdialog.cxx:12041 #: src/dialogs/confdialog.cxx:14711 src/dialogs/confdialog.cxx:14740 #: src/dialogs/confdialog.cxx:14769 src/dialogs/confdialog.cxx:14796 #: src/dialogs/confdialog.cxx:14822 src/dialogs/confdialog.cxx:15107 msgid "Enable" msgstr "Activar" #: src/dialogs/confdialog.cxx:11942 src/dialogs/confdialog.cxx:12038 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:11955 #, fuzzy msgid "Text Colors" msgstr "Medidor" #: src/dialogs/confdialog.cxx:11959 #, fuzzy msgid "Transmit text" msgstr "Transmitir el vídeo texto" #: src/dialogs/confdialog.cxx:11964 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11965 #, fuzzy msgid "Directed received text" msgstr "Decodificar tonos DTMF recibidos" #: src/dialogs/confdialog.cxx:11970 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:11971 #, fuzzy msgid "Undirected received text" msgstr "Decodificar tonos DTMF recibidos" #: src/dialogs/confdialog.cxx:11983 msgid "IFKP" msgstr "" #: src/dialogs/confdialog.cxx:11988 #, fuzzy msgid "1/2 speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:11993 #, fuzzy msgid "1x speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:11994 #, fuzzy msgid "default" msgstr "Omisión" #: src/dialogs/confdialog.cxx:11999 #, fuzzy msgid "2x speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:12010 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:12011 #, fuzzy msgid "convert other callsign to lower case" msgstr "Convertir el indicativo a mayúsculas" #: src/dialogs/confdialog.cxx:12016 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12017 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:12053 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:12058 src/dialogs/confdialog.cxx:12211 msgid "8-bit extended characters (UTF-8)" msgstr "Caracteres extendidos de 8bits (UTF-8)" #: src/dialogs/confdialog.cxx:12059 msgid "Enable this for UTF-8 characters" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:12065 msgid "Long receive integration" msgstr "Larga integración en Rx" #: src/dialogs/confdialog.cxx:12066 msgid "Enable for very weak signals" msgstr "Activar para señales muy debiles" #: src/dialogs/confdialog.cxx:12076 msgid "Transmit lower start tone" msgstr "Transmitir tono de inicio bajo" #: src/dialogs/confdialog.cxx:12081 msgid "Transmit upper start tone" msgstr "Transmitir tono de inicio alto" #: src/dialogs/confdialog.cxx:12087 msgid "Tone Duration (secs)" msgstr "Duración del tono (s)" #: src/dialogs/confdialog.cxx:12103 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:12108 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:12113 #, fuzzy msgid "Manual tuning" msgstr "Permitir sintonía manual" #: src/dialogs/confdialog.cxx:12122 #, fuzzy msgid "Oliv" msgstr "Olivia" #: src/dialogs/confdialog.cxx:12127 src/dialogs/confdialog.cxx:12232 msgid "Select bandwidth" msgstr "Selecciona el ancho de banda" #: src/dialogs/confdialog.cxx:12143 src/dialogs/confdialog.cxx:12248 msgid "Tones" msgstr "Tonos" #: src/dialogs/confdialog.cxx:12144 src/dialogs/confdialog.cxx:12249 msgid "Select number of tones" msgstr "Seleccionar número de tonos" #: src/dialogs/confdialog.cxx:12160 src/dialogs/confdialog.cxx:12265 msgid "Receive synchronizer" msgstr "Sincronizador de Rx" #: src/dialogs/confdialog.cxx:12163 src/dialogs/confdialog.cxx:12268 msgid "Tune margin (tone frequency spacing)" msgstr "Margen de sintonía (espaciado de los tonos)" #: src/dialogs/confdialog.cxx:12164 src/dialogs/confdialog.cxx:12184 #: src/dialogs/confdialog.cxx:12269 src/dialogs/confdialog.cxx:12288 msgid "Change ONLY to experiment" msgstr "Cambiar SOLAMENTE para experimentar" #: src/dialogs/confdialog.cxx:12183 src/dialogs/confdialog.cxx:12287 msgid "Integration period (FEC blocks)" msgstr "Periodo de integración (bloques FEC)" #: src/dialogs/confdialog.cxx:12203 msgid "Reset FEC blocks when changing BW or Tones" msgstr "Reiniciar FEC al cambiar ancho de banda o tonos" #: src/dialogs/confdialog.cxx:12204 src/dialogs/confdialog.cxx:12212 msgid "Enable this for UTF-8 character transmission" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:12217 src/dialogs/confdialog.cxx:12314 msgid "xmt start/stop tones" msgstr "" # Revisar estilo (@HK4QWC) # @CO7WT De esta forma es más sencillo y al estar en contexto en la interfaz se intuye el significado #: src/dialogs/confdialog.cxx:12218 src/dialogs/confdialog.cxx:12315 #, fuzzy msgid "Enable this to send start/stop tones" msgstr "Activar al iniciar fldigi" #: src/dialogs/confdialog.cxx:12227 #, fuzzy msgid "Cont" msgstr "Contestia" #: src/dialogs/confdialog.cxx:12308 msgid "8-bit extended characters" msgstr "Caracteres extendidos de 8bits" #: src/dialogs/confdialog.cxx:12309 msgid "Enable this for Latin-1 accented characters" msgstr "Activar esto para caracteres acentuados" #: src/dialogs/confdialog.cxx:12324 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:12330 msgid "AFC behavior" msgstr "Comportamiento AFC" #: src/dialogs/confdialog.cxx:12333 msgid "Acquisition search range (Hz)" msgstr "Rango de búsqueda y adquisición (Hz)" #: src/dialogs/confdialog.cxx:12334 msgid "Capture signals within this frequency range" msgstr "Capturar señales dentro de este rango de frecuencias" #: src/dialogs/confdialog.cxx:12353 src/dialogs/confdialog.cxx:15230 msgid "Acquisition S/N (dB)" msgstr "S/N (dB) de adquisición" #: src/dialogs/confdialog.cxx:12354 src/dialogs/confdialog.cxx:15231 msgid "Capture signals over this threshold" msgstr "Capturar señales por encima de este nivel" #: src/dialogs/confdialog.cxx:12375 msgid "S/N and IMD behavior" msgstr "Comportamiento del S/N y IMD" #: src/dialogs/confdialog.cxx:12378 msgid "after" msgstr "después" #: src/dialogs/confdialog.cxx:12379 msgid "Behavior of s/n imd" msgstr "Comportamiento del S/N y IMD" #: src/dialogs/confdialog.cxx:12390 msgid "Dim" msgstr "Atenuar" #: src/dialogs/confdialog.cxx:12395 msgid "seconds" msgstr "segundos" #: src/dialogs/confdialog.cxx:12396 msgid "Will occur after this time in seconds" msgstr "Ocurrirá después de este tiempo (s)" #: src/dialogs/confdialog.cxx:12416 msgid "Multi-Channel Signal Processing" msgstr "Procesamiento de la señal multi-canal" #: src/dialogs/confdialog.cxx:12419 msgid "Multi-channel detector" msgstr "Detector multicanal" #: src/dialogs/confdialog.cxx:12424 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" "Procesamiento multicanal de la señal desactivado en PCs con CPUs\n" "muy lenta y no se usa el navegador de señal" #: src/dialogs/confdialog.cxx:12429 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:12432 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12433 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:12438 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:12439 #, fuzzy msgid "Pilot tone power relative to signal" msgstr "Ancho de banda del filtro relativo al ancho de la señal" #: src/dialogs/confdialog.cxx:12458 #, fuzzy msgid "Short Preamble" msgstr "Preámbulo de Video ID" #: src/dialogs/confdialog.cxx:12459 #, fuzzy msgid "Enable short preamble for 8PSK transmission" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:12472 #, fuzzy msgid "TTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:12476 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:12482 msgid "AFC speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:12483 msgid "AFC tracking speed" msgstr "Velocidad de rastreo del AFC" #: src/dialogs/confdialog.cxx:12499 msgid "RX - unshift on space" msgstr "No saltar en el espacio RX" #: src/dialogs/confdialog.cxx:12500 msgid "Revert to unshifted char's on a space" msgstr "Revertir el salto en espacio de los caracteres" #: src/dialogs/confdialog.cxx:12505 msgid "Filter Shape Factor" msgstr "Factor de ancho de banda del filtro" #: src/dialogs/confdialog.cxx:12506 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "Coeficiente tiempo de rcos:\n" "1.0 ... 2.0\n" "W1HKJ recomienda 1.275\n" "DO2SMF recomienda 1.5" #: src/dialogs/confdialog.cxx:12518 msgid "Decode (CWI suppression)" msgstr "Detección y supresión de CWI" #: src/dialogs/confdialog.cxx:12521 msgid "Mark-Space" msgstr "Marca-Espacio" #: src/dialogs/confdialog.cxx:12526 msgid "Mark only" msgstr "Marca sola" #: src/dialogs/confdialog.cxx:12531 msgid "Space only" msgstr "Espacio solo" #: src/dialogs/confdialog.cxx:12538 msgid "RTTY Scope Display" msgstr "Configuración de Osciloscopio en RTTY" #: src/dialogs/confdialog.cxx:12541 msgid "Use cross hair scope" msgstr "Usar osc. de hilos cruzados" #: src/dialogs/confdialog.cxx:12542 msgid "Default to cross hair digiscope" msgstr "Osciloscopio de hilos cruzados predeterminado" #: src/dialogs/confdialog.cxx:12547 msgid "XY - classic scope" msgstr "XY - Osc. clásico" #: src/dialogs/confdialog.cxx:12548 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Activado - usar filtros de salida Marca/Espacio\n" "Desactivado - usar seudo-señales" #: src/dialogs/confdialog.cxx:12555 msgid "Log RTTY frequency" msgstr "Registrar frecuencia RTTY" #: src/dialogs/confdialog.cxx:12558 msgid "Use MARK freq'" msgstr "Usar frec. MARCA" #: src/dialogs/confdialog.cxx:12559 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Activado - Guarda QSO usando la frecuencia de la Marca\n" "Desactivado - Guarda QSO usando frecuencia central" #: src/dialogs/confdialog.cxx:12566 msgid "track color" msgstr "Color" #: src/dialogs/confdialog.cxx:12567 msgid "Color of Mark Track" msgstr "Color de cursor en la Marca" #: src/dialogs/confdialog.cxx:12577 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:12580 #, fuzzy msgid "Sound Card FSK" msgstr "Dispositivo de sonido" #: src/dialogs/confdialog.cxx:12583 src/dialogs/confdialog.cxx:12750 msgid "Carrier shift" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:12584 msgid "Select carrier shift" msgstr "Seleccionar el salto de la portadora" #: src/dialogs/confdialog.cxx:12599 msgid "Custom shift" msgstr "Salto ajustado" #: src/dialogs/confdialog.cxx:12600 msgid "Input carrier shift" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:12618 src/dialogs/confdialog.cxx:12802 #: src/dialogs/confdialog.cxx:12981 src/dialogs/confdialog.cxx:13126 msgid "Baud rate" msgstr "Tasa de baudios" #: src/dialogs/confdialog.cxx:12619 msgid "Select carrier baudrate" msgstr "Seleccionar la tasa de baudios de la portadora" #: src/dialogs/confdialog.cxx:12635 msgid "Bits per character" msgstr "Bits por caracter" #: src/dialogs/confdialog.cxx:12636 msgid "Select # bits / char" msgstr "Selecciona el # bits / caracter" #: src/dialogs/confdialog.cxx:12651 msgid "Parity" msgstr "Paridad" #: src/dialogs/confdialog.cxx:12652 msgid "Select parity" msgstr "Seleccionar paridad" #: src/dialogs/confdialog.cxx:12667 src/dialogs/confdialog.cxx:12997 #: src/dialogs/confdialog.cxx:13142 msgid "Stop bits" msgstr "Bits de parda" #: src/dialogs/confdialog.cxx:12668 msgid "Select # stop bits" msgstr "Seleccionar # de bits de parada" #: src/dialogs/confdialog.cxx:12683 msgid "AutoCRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:12684 msgid "Add CRLF after page width characters" msgstr "Añadir CRLF después del ancho de caracteres de la página" #: src/dialogs/confdialog.cxx:12689 msgid "chars" msgstr "caract." #: src/dialogs/confdialog.cxx:12690 msgid "Auto CRLF line length" msgstr "Ajuste automático de línea con CRLF" #: src/dialogs/confdialog.cxx:12708 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:12709 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Usar \"cr cr lf\" para \"cr lf\"" #: src/dialogs/confdialog.cxx:12715 msgid "TX - unshift on space" msgstr "TX - no saltar en el espacio" #: src/dialogs/confdialog.cxx:12716 msgid "Revert to Unsifted char's on a space" msgstr "Revertir el salto en espacio de los caracteres" #: src/dialogs/confdialog.cxx:12721 msgid "Shaped Tx" msgstr "Dar forma al Tx" #: src/dialogs/confdialog.cxx:12722 msgid "Use wave shaping on Tx signal" msgstr "Usar técnica de formación de onda en la señal de Tx" #: src/dialogs/confdialog.cxx:12728 msgid "Pseudo-FSK - right channel" msgstr "AFSK en canal derecho" #: src/dialogs/confdialog.cxx:12729 msgid "Create keyed square wave on right audio channel" msgstr "Crear una onda cuadrada en el canal derecho de audio" #: src/dialogs/confdialog.cxx:12736 #, fuzzy msgid "Transceiver FSK" msgstr "Control del transceptor" #: src/dialogs/confdialog.cxx:12739 #, fuzzy msgid "Mark" msgstr "Marca sola" #: src/dialogs/confdialog.cxx:12740 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Frecuencia en MHz" #: src/dialogs/confdialog.cxx:12751 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:12766 #, fuzzy msgid "LTRS at start" msgstr "Inicio" #: src/dialogs/confdialog.cxx:12767 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:12781 msgid "nanoIO Tx" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:12819 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:12820 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:12840 msgid "Navigator" msgstr "" #: src/dialogs/confdialog.cxx:12843 #, fuzzy msgid "FSK Interface" msgstr "Interfaz de usuario" #: src/dialogs/confdialog.cxx:12847 #, fuzzy msgid "Navigator serial port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:12861 #, fuzzy msgid "FSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12862 #, fuzzy msgid "Connect / Disconnect from Nav FSK port" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:12867 src/dialogs/confdialog.cxx:13123 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:12871 #, fuzzy msgid "Navigator configuration port" msgstr "Configuración" #: src/dialogs/confdialog.cxx:12885 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:12886 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12901 #, fuzzy msgid "Channel 2 attenuator" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:12902 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:12917 #, fuzzy msgid "RF attenuator" msgstr "Atenuación KPSQL" #: src/dialogs/confdialog.cxx:12918 #, fuzzy msgid "NavRF Attenuator" msgstr "Atenuación KPSQL" #: src/dialogs/confdialog.cxx:12933 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12934 src/dialogs/confdialog.cxx:13159 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:12949 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12950 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:12965 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:12982 src/dialogs/confdialog.cxx:13127 #, fuzzy msgid "Nav FSK baud rate" msgstr "Tasa de baudios del puerto serie" #: src/dialogs/confdialog.cxx:12998 src/dialogs/confdialog.cxx:13143 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Bits de parda" #: src/dialogs/confdialog.cxx:13013 src/dialogs/confdialog.cxx:13174 #, fuzzy msgid "Mark Polarity" msgstr "Marca sola" #: src/dialogs/confdialog.cxx:13014 src/dialogs/confdialog.cxx:13175 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:13029 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:13030 src/dialogs/confdialog.cxx:13191 #: src/dialogs/confdialog.cxx:13207 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:13061 #, fuzzy msgid "Config" msgstr "Confirmar" #: src/dialogs/confdialog.cxx:13062 #, fuzzy msgid "Connect / Disconnect from Nav Config port" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:13069 msgid "Synop" msgstr "Synop" #: src/dialogs/confdialog.cxx:13072 msgid "SYNOP to ADIF" msgstr "SYNOP a ADIF" #: src/dialogs/confdialog.cxx:13073 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" "Decodificar mensajes SYNOP al log ADIF (ejemplo Servicio Meteorológico " "Alemán)" #: src/dialogs/confdialog.cxx:13079 msgid "SYNOP to KML" msgstr "SYNOP a KML" #: src/dialogs/confdialog.cxx:13080 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Decodificar mensajes SYNOP al documentos KML (ejemplo Servicio Meteorológico " "Alemán)" #: src/dialogs/confdialog.cxx:13087 msgid "Interleave SYNOP and text" msgstr "Intercalar SYNOP y texto" #: src/dialogs/confdialog.cxx:13088 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Intercalar texto con mensajes SYNOP descodificados, o reemplazos" #: src/dialogs/confdialog.cxx:13096 msgid "Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:13098 #, fuzzy msgid "Serial Interface" msgstr "Interfaz de usuario" #: src/dialogs/confdialog.cxx:13158 #, fuzzy msgid "FSK port" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:13206 #, fuzzy msgid "Auto CRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:13222 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:13223 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:13238 #, fuzzy msgid "Diddle char" msgstr "Letra de prueba" #: src/dialogs/confdialog.cxx:13239 #, fuzzy msgid "Diddle character" msgstr "Bits por caracter" #: src/dialogs/confdialog.cxx:13254 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:13255 src/dialogs/confdialog.cxx:13271 #, fuzzy msgid "Unshift on space" msgstr "No saltar en el espacio RX" #: src/dialogs/confdialog.cxx:13270 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:13294 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:13314 msgid "Enable DSP prior to decoder" msgstr "Activar el DSP antes del decodificador" #: src/dialogs/confdialog.cxx:13356 msgid "Preamble Detection" msgstr "Detección de preámbulo" #: src/dialogs/confdialog.cxx:13357 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Detectar el preámbulo de THOR \n" "Limpiando el buffer de recepción de dato" #: src/dialogs/confdialog.cxx:13362 msgid "Soft-symbol decoding" msgstr "Descodificación suave de símbolos" #: src/dialogs/confdialog.cxx:13363 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Usar descodificación blanda de símbolos para la detección\n" "también asiste en la descodificación de cada bit." #: src/dialogs/confdialog.cxx:13368 msgid "Soft-bit decoding" msgstr "Usar decodificación suave de bits" #: src/dialogs/confdialog.cxx:13369 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Usar descodificación blanda de bit viterbi para mejorar la corrección FEC.\n" "Funciona mejor si está activada la opción \"Descodificación blanda de " "símbolos\"" #: src/dialogs/confdialog.cxx:13402 #, fuzzy msgid "Nav" msgstr "Wav" #: src/dialogs/confdialog.cxx:13404 msgid "Log Navtex messages to Adif file" msgstr "Registrar mensajes de Navtex a archivo ADIF" #: src/dialogs/confdialog.cxx:13409 msgid "Log Navtex messages to KML" msgstr "Registrar mensajes de Navtex a KML" #: src/dialogs/confdialog.cxx:13410 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "Guardar mensajes a archivos KML (Google Earth, Marble, Gaia, etc...)" #: src/dialogs/confdialog.cxx:13417 msgid "WFx" msgstr "" #: src/dialogs/confdialog.cxx:13419 msgid "Log Wefax messages to Adif file" msgstr "Registrar mensajes Wefax a archivo ADIF" #: src/dialogs/confdialog.cxx:13420 msgid "Sent and received faxes are logged to Adif file." msgstr "Registrar los fax enviados y recibidos" #: src/dialogs/confdialog.cxx:13425 msgid "Embedded Wefax Gui" msgstr "Interfaz embebida para WXFAX" #: src/dialogs/confdialog.cxx:13426 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "Mostrar TX y RX en la ventana principal de fldigi.\n" "Este cambio requiere reiniciar fldigi." #: src/dialogs/confdialog.cxx:13431 msgid "Frequency shift (800 Hz)" msgstr "Salto de frecuencia (800Hz)" #: src/dialogs/confdialog.cxx:13432 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "Predefinido 800 Hz. Servicio Meteorológico Alemán 850Hz" #: src/dialogs/confdialog.cxx:13446 msgid "Received fax maximum rows number (5000)" msgstr "Número máximo de filas para un fax (5000)" #: src/dialogs/confdialog.cxx:13447 msgid "Maximum row number for a received fax image." msgstr "Número máximo de filas para una imagen de fax recibida" #: src/dialogs/confdialog.cxx:13461 msgid "Fax images destination directory" msgstr "Destino de las imágenes de fax" #: src/dialogs/confdialog.cxx:13466 msgid "Directory..." msgstr "Directorio..." #: src/dialogs/confdialog.cxx:13469 msgid "Hide Transmission window" msgstr "Ocultar la ventana de TX" #: src/dialogs/confdialog.cxx:13470 msgid "Hide transmission window by default." msgstr "Ocultar la ventana de TX de forma predeterminada" #: src/dialogs/confdialog.cxx:13475 msgid "Save image as monochrome file" msgstr "Guardar como imagen monocromática" #: src/dialogs/confdialog.cxx:13476 msgid "Save the fax image as a gray-level PNG file." msgstr "Guardar la imagen de fax como PNG en grises" #: src/dialogs/confdialog.cxx:13493 msgid "Rig" msgstr "Radio" #: src/dialogs/confdialog.cxx:13497 src/dialogs/confdialog.cxx:16612 #, fuzzy msgid "flrig" msgstr "flrig:" #: src/dialogs/confdialog.cxx:13498 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:13502 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:13503 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:13510 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:13518 src/dialogs/confdialog.cxx:16403 #: src/dialogs/confdialog.cxx:16516 src/dialogs/confdialog.cxx:16572 #: src/dialogs/confdialog.cxx:16620 src/dialogs/confdialog.cxx:16662 #, fuzzy msgid "Addr" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:13519 src/dialogs/confdialog.cxx:16621 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" # Aunque el texto en inglés aparece como "IP Address Port Number" considero que la traducción debe ser "Número del puerto" ya que se refiere a la opción del puerto UDP al que se establece la conexión (@HK4QWC) #: src/dialogs/confdialog.cxx:13535 src/dialogs/confdialog.cxx:16421 #: src/dialogs/confdialog.cxx:16534 src/dialogs/confdialog.cxx:16590 #: src/dialogs/confdialog.cxx:16638 src/dialogs/confdialog.cxx:16671 msgid "IP Address Port Number" msgstr "Número del puerto" #: src/dialogs/confdialog.cxx:13549 src/dialogs/confdialog.cxx:16653 #: src/dialogs/confdialog.cxx:16677 msgid "Reconnect" msgstr "Reconectar" #: src/dialogs/confdialog.cxx:13550 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:13555 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:13558 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:13559 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:13568 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:13570 msgid "Use RigCAT" msgstr "Use RigCAT" #: src/dialogs/confdialog.cxx:13571 msgid "RigCAT used for rig control" msgstr "Usar RigCAT para el control del radio" #: src/dialogs/confdialog.cxx:13577 msgid "Rig description file:" msgstr "Archivo de descripción del radio:" #: src/dialogs/confdialog.cxx:13578 msgid "Use Open to select descriptor file" msgstr "Use Abrir para seleccionar un descriptor de archivo" #: src/dialogs/confdialog.cxx:13584 msgid "Select rig descriptor file" msgstr "Seleccionar archivo de descripción del radio" # Config > Control del radio > Hamlib: # Dispositivo queda apretado, propongo traducir por # P. Serie: # Que quedará mejor y se entiende @ CO7WT # También se usa para el dispositivo de audio OSS… entonces mejor usar "Puerto:" @HK4QWC #: src/dialogs/confdialog.cxx:13587 src/dialogs/confdialog.cxx:13791 #: src/dialogs/confdialog.cxx:14053 src/dialogs/confdialog.cxx:14416 msgid "Device:" msgstr "Puerto:" #: src/dialogs/confdialog.cxx:13602 src/dialogs/confdialog.cxx:13806 msgid "Retries" msgstr "Reintentos" #: src/dialogs/confdialog.cxx:13603 msgid "# retries before giving up" msgstr "# de reintentos antes de rendirnos" #: src/dialogs/confdialog.cxx:13619 msgid "Retry interval (ms)" msgstr "Intervalo entre reintento (ms)" #: src/dialogs/confdialog.cxx:13620 msgid "Time between retires in msec" msgstr "Tiempo entre reintentos (ms)" #: src/dialogs/confdialog.cxx:13636 msgid "Write delay (ms)" msgstr "Ret. escritura (ms)" #: src/dialogs/confdialog.cxx:13637 msgid "Wait for response to subsequent command" msgstr "Tiempo de espera para la respuesta del comando subsiguiente" #: src/dialogs/confdialog.cxx:13653 src/dialogs/confdialog.cxx:13874 msgid "Baud rate:" msgstr "Tasa de baudios:" #: src/dialogs/confdialog.cxx:13669 src/dialogs/confdialog.cxx:13890 msgid "Stopbits" msgstr "Bits de parada" #: src/dialogs/confdialog.cxx:13688 src/dialogs/confdialog.cxx:14025 #: src/dialogs/confdialog.cxx:14104 src/dialogs/confdialog.cxx:15362 msgid "Initialize" msgstr "Inicializar" #: src/dialogs/confdialog.cxx:13689 msgid "Initialize RigCAT interface" msgstr "Inicializar la interfaz RigCAT" #: src/dialogs/confdialog.cxx:13692 msgid "Commands are echoed" msgstr "Los comandos tienen eco" #: src/dialogs/confdialog.cxx:13693 msgid "Rig or interface echos serial data" msgstr "El radio o la interfaz repite los datos enviados" #: src/dialogs/confdialog.cxx:13698 msgid "CAT command for PTT" msgstr "Comandos CAT para el PTT" #: src/dialogs/confdialog.cxx:13699 msgid "PTT is a CAT command (not hardware)" msgstr "El PTT es un comando CAT" #: src/dialogs/confdialog.cxx:13705 msgid "Toggle RTS for PTT" msgstr "Activar RTS para PTT" #: src/dialogs/confdialog.cxx:13706 msgid "RTS is ptt line" msgstr "RTS es la línea de PTT" #: src/dialogs/confdialog.cxx:13711 msgid "Toggle DTR for PTT" msgstr "Activar DTR para PTT" #: src/dialogs/confdialog.cxx:13712 msgid "DTR is ptt line" msgstr "DTR es la línea de PTT" #: src/dialogs/confdialog.cxx:13717 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:13718 src/dialogs/confdialog.cxx:13947 msgid "Initial state of RTS" msgstr "Estado inicial de RTS" #: src/dialogs/confdialog.cxx:13723 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:13724 src/dialogs/confdialog.cxx:13941 msgid "Initial state of DTR" msgstr "Estado inicial de DTR" #: src/dialogs/confdialog.cxx:13729 src/dialogs/confdialog.cxx:13952 msgid "RTS/CTS flow control" msgstr "Control de flujo RTS/CTS" #: src/dialogs/confdialog.cxx:13730 msgid "Rig uses RTS/CTS handshake" msgstr "El radio usa RTS/CTS para comunicarse" #: src/dialogs/confdialog.cxx:13735 #, fuzzy msgid "Restore UART Settings on Close" msgstr "Restablecer configuraciones al cerrar" #: src/dialogs/confdialog.cxx:13736 msgid "Restore the serial (COM) port settings" msgstr "Restablecer la configuración del puerto serial (COM)" #: src/dialogs/confdialog.cxx:13741 msgid "VSP Enable" msgstr "VSP Activado" #: src/dialogs/confdialog.cxx:13742 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Emulador serie virtual - Suprimir ADVERTENCIAS" #: src/dialogs/confdialog.cxx:13747 msgid "Init delay (ms)" msgstr "Retardo inicialización (ms)" #: src/dialogs/confdialog.cxx:13748 msgid "Wait for response to first CAT command" msgstr "Tiempo de espera para la respuesta al primer comando CAT" #: src/dialogs/confdialog.cxx:13768 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:13770 msgid "Use Hamlib" msgstr "Usar Hamlib" #: src/dialogs/confdialog.cxx:13771 msgid "Hamlib used for rig control" msgstr "Utilice Hamlib para controlar el radio" # Config > Control del radio > Hamlib: # No cabe Radio, porque está diseñado para Rig, desborda el marco. Incluso al redibujar la interfaz se pierde la palabra… # Se propone # Rad.: # @CO7WT #: src/dialogs/confdialog.cxx:13777 msgid "Rig:" msgstr "Rad.:" #: src/dialogs/confdialog.cxx:13807 msgid "# times to resend command before giving up" msgstr "# de veces para reenvío de comandos antes de rendirnos" #: src/dialogs/confdialog.cxx:13823 #, fuzzy msgid "Retry Interval (msec)" msgstr "Intervalo entre reintento (ms)" #: src/dialogs/confdialog.cxx:13824 msgid "Msec's between retries" msgstr "Milisegundos entre reintentos" #: src/dialogs/confdialog.cxx:13840 #, fuzzy msgid "Write delay (msec)" msgstr "Ret. escritura (ms)" #: src/dialogs/confdialog.cxx:13841 msgid "Msec's between sequential commands" msgstr "Milisegundos entre comandos secuenciales" #: src/dialogs/confdialog.cxx:13857 #, fuzzy msgid "Post write delay (msec)" msgstr "Ret. post-envío (ms)" #: src/dialogs/confdialog.cxx:13858 msgid "Wait interval (msecs) before reading response" msgstr "Intervalo de espera (ms) antes de leer la espuesta" #: src/dialogs/confdialog.cxx:13909 #, fuzzy msgid "Polling Interval (msec)" msgstr "Intervalo entre reintento (ms)" #: src/dialogs/confdialog.cxx:13928 msgid "PTT via Hamlib command" msgstr "PTT como comando de Hamlib" #: src/dialogs/confdialog.cxx:13929 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT es un comando de Hamlib" #: src/dialogs/confdialog.cxx:13934 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:13935 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:13940 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:13946 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:13953 msgid "Rig requires RTS/CTS flow control" msgstr "El radio requiere control de flujo RTS/CTS" #: src/dialogs/confdialog.cxx:13959 msgid "XON/XOFF flow control" msgstr "Control de flujo Xon/Xoff" #: src/dialogs/confdialog.cxx:13960 msgid "Rig requires Xon/Xoff flow control" msgstr "El radio requiere control de flujo Xon/Xoff" #: src/dialogs/confdialog.cxx:13965 #, fuzzy msgid "CW is LSB mode" msgstr "CW es LSB" #: src/dialogs/confdialog.cxx:13966 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:13971 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:13972 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:13977 #, fuzzy msgid "Mode delay (msec)" msgstr "Espera Modo/BW" #: src/dialogs/confdialog.cxx:13978 #, fuzzy msgid "Delay NN msec after executing mode change" msgstr "Retrasar NN ms antes de soltar el PTT" #: src/dialogs/confdialog.cxx:13997 msgid "Sideband:" msgstr "Banda lateral:" #: src/dialogs/confdialog.cxx:14010 msgid "Advanced configuration:" msgstr "Configuración avanzada:" #: src/dialogs/confdialog.cxx:14011 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configuración opcional\n" "en el formato: parámetro=valor..." #: src/dialogs/confdialog.cxx:14026 msgid "Initialize hamlib interface" msgstr "Inicializar la interfaz Hamlib" #: src/dialogs/confdialog.cxx:14033 msgid "Hardware PTT" msgstr "PTT real" #: src/dialogs/confdialog.cxx:14037 src/dialogs/confdialog.cxx:14626 msgid "PTT tone on right audio channel " msgstr "Tono para PTT en el canal derecho de audio" #: src/dialogs/confdialog.cxx:14038 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Puede ser usado en vez de o en adición de otros tipos de PTT" #: src/dialogs/confdialog.cxx:14045 msgid "h/w ptt device-pin" msgstr "Pin del dispositivo PTT" #: src/dialogs/confdialog.cxx:14048 msgid "Use separate serial port PTT" msgstr "PTT por puerto serie separado" #: src/dialogs/confdialog.cxx:14067 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:14068 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:14074 msgid "Use parallel port PTT" msgstr "Utilice un PTT por puerto paralelo" #: src/dialogs/confdialog.cxx:14079 msgid "Use uHRouter PTT" msgstr "Utilice PTT uHRouter" #: src/dialogs/confdialog.cxx:14084 msgid "Use RTS" msgstr "Use RTS" #: src/dialogs/confdialog.cxx:14085 msgid "RTS is PTT signal line" msgstr "RTS es PTT" #: src/dialogs/confdialog.cxx:14089 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:14090 msgid "Initial voltage on RTS" msgstr "Voltaje inicial en RTS" #: src/dialogs/confdialog.cxx:14094 msgid "Use DTR" msgstr "Use DTR" #: src/dialogs/confdialog.cxx:14095 msgid "DTR is PTT signal line" msgstr "DTR es PTT" #: src/dialogs/confdialog.cxx:14099 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:14100 msgid "Initial voltage on DTR" msgstr "Voltaje inicial en DTR" #: src/dialogs/confdialog.cxx:14105 msgid "Initialize the H/W PTT interface" msgstr "Inicializar la interfaz de HW para PTT" #: src/dialogs/confdialog.cxx:14110 msgid "PTT delays valid for all CAT/PTT types" msgstr "Retrasos de PTT válidos para todos los tipos de PTT y CAT" #: src/dialogs/confdialog.cxx:14113 msgid "Start of transmit PTT delay" msgstr "Retraso de PTT en el inicio de transmisión" #: src/dialogs/confdialog.cxx:14114 msgid "Delay NN msec before starting audio" msgstr "Retrasar la salida del audio en NN ms" #: src/dialogs/confdialog.cxx:14123 msgid "PTT end of transmit delay" msgstr "Retraso de fin de PTT" #: src/dialogs/confdialog.cxx:14124 msgid "Delay NN msec before releasing PTT" msgstr "Retrasar NN ms antes de soltar el PTT" #: src/dialogs/confdialog.cxx:14137 msgid "GPIO" msgstr "" #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14381 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:14143 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:14144 src/dialogs/confdialog.cxx:14151 #: src/dialogs/confdialog.cxx:14158 src/dialogs/confdialog.cxx:14165 #: src/dialogs/confdialog.cxx:14172 src/dialogs/confdialog.cxx:14179 #: src/dialogs/confdialog.cxx:14186 src/dialogs/confdialog.cxx:14193 #: src/dialogs/confdialog.cxx:14200 src/dialogs/confdialog.cxx:14207 #: src/dialogs/confdialog.cxx:14214 src/dialogs/confdialog.cxx:14221 #: src/dialogs/confdialog.cxx:14228 src/dialogs/confdialog.cxx:14235 #: src/dialogs/confdialog.cxx:14242 src/dialogs/confdialog.cxx:14249 #: src/dialogs/confdialog.cxx:14256 #, fuzzy msgid "Select pin number" msgstr "Seleccionar línea" #: src/dialogs/confdialog.cxx:14150 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:14157 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:14164 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:14171 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:14178 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:14185 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:14192 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:14199 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:14206 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:14213 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:14227 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:14234 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:14241 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:14248 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:14255 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14269 #: src/dialogs/confdialog.cxx:14276 src/dialogs/confdialog.cxx:14283 #: src/dialogs/confdialog.cxx:14290 src/dialogs/confdialog.cxx:14297 #: src/dialogs/confdialog.cxx:14304 src/dialogs/confdialog.cxx:14311 #: src/dialogs/confdialog.cxx:14318 src/dialogs/confdialog.cxx:14325 #: src/dialogs/confdialog.cxx:14332 src/dialogs/confdialog.cxx:14339 #: src/dialogs/confdialog.cxx:14346 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14360 src/dialogs/confdialog.cxx:14367 #: src/dialogs/confdialog.cxx:14374 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:14263 src/dialogs/confdialog.cxx:14270 #: src/dialogs/confdialog.cxx:14277 src/dialogs/confdialog.cxx:14284 #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14298 #: src/dialogs/confdialog.cxx:14305 src/dialogs/confdialog.cxx:14312 #: src/dialogs/confdialog.cxx:14319 src/dialogs/confdialog.cxx:14326 #: src/dialogs/confdialog.cxx:14333 src/dialogs/confdialog.cxx:14340 #: src/dialogs/confdialog.cxx:14347 src/dialogs/confdialog.cxx:14354 #: src/dialogs/confdialog.cxx:14361 src/dialogs/confdialog.cxx:14368 #: src/dialogs/confdialog.cxx:14375 #, fuzzy msgid "Select PTT on state" msgstr "Seleccionar línea" #: src/dialogs/confdialog.cxx:14385 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:14387 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:14388 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:14407 msgid "Devices" msgstr "Dispositivos" #: src/dialogs/confdialog.cxx:14410 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:14411 msgid "Use OSS audio server" msgstr "Usar servidor de audio OSS" #: src/dialogs/confdialog.cxx:14417 msgid "Select device" msgstr "Seleccionar dispositivo" #: src/dialogs/confdialog.cxx:14425 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:14426 msgid "Use Port Audio server" msgstr "Usar servidor PortAudio" #: src/dialogs/confdialog.cxx:14431 msgid "Capture:" msgstr "Captura:" #: src/dialogs/confdialog.cxx:14432 msgid "Audio input device" msgstr "Dispositivo de entrada de audio" #: src/dialogs/confdialog.cxx:14436 msgid "Playback:" msgstr "Reproducción:" #: src/dialogs/confdialog.cxx:14437 msgid "Audio output device" msgstr "Dispositivo de salida de audio" #: src/dialogs/confdialog.cxx:14445 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:14446 msgid "Use Pulse Audio server" msgstr "Usar servidor PulseAudio" #: src/dialogs/confdialog.cxx:14451 msgid "Server string:" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:14452 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Deje esto en blanco en Ubuntu con una sola tarjeta de red\n" "referirse a http://www.pulseaudio.org/wiki/ServerStrings\n" "para más detalles" #: src/dialogs/confdialog.cxx:14470 msgid "File I/O only" msgstr "Solo E/S desde archivo" #: src/dialogs/confdialog.cxx:14471 src/dialogs/confdialog.cxx:14481 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" "Seleccionar cuando no haya dispositivo de audio disponible o para realizar " "pruebas" #: src/dialogs/confdialog.cxx:14480 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:14492 msgid "Settings" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:14494 msgid "Sample rate" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:14497 msgid "Capture" msgstr "Captura" #: src/dialogs/confdialog.cxx:14498 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Forzar una taza de muestreo específica. Seleccionar \"Nativo\" si \"Auto\"\n" "no trabaja bien con tu dispositivo de audio." #: src/dialogs/confdialog.cxx:14530 msgid "Converter" msgstr "Convertidor" #: src/dialogs/confdialog.cxx:14531 msgid "Set the type of resampler used of offset correction" msgstr "Establecer el tipo de re-muestreo usado para correcciones" #: src/dialogs/confdialog.cxx:14547 msgid "Corrections" msgstr "Correcciones" #: src/dialogs/confdialog.cxx:14550 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:14551 msgid "RX sound card correction" msgstr "Corrección de RX en el dispositivo de audio" #: src/dialogs/confdialog.cxx:14567 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:14568 msgid "TX sound card correction" msgstr "Corrección de TX en el dispositivo de audio" #: src/dialogs/confdialog.cxx:14584 msgid "TX offset" msgstr "Dif. en Tx" #: src/dialogs/confdialog.cxx:14585 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Diferencias entre frecuencias de Rx y Tx (en el radio)" #: src/dialogs/confdialog.cxx:14605 msgid "Right channel" msgstr "Canal derecho" #: src/dialogs/confdialog.cxx:14607 #, fuzzy msgid "Transmit Usage" msgstr "Señal transmitida" #: src/dialogs/confdialog.cxx:14610 msgid "Modem signal on left and right channels" msgstr "Audio del módem en ambos canales de audio" #: src/dialogs/confdialog.cxx:14611 msgid "Left and right channels both contain modem audio" msgstr "Ambos canales de audio contienen información" #: src/dialogs/confdialog.cxx:14616 src/dialogs/confdialog.cxx:14652 msgid "Reverse Left/Right channels" msgstr "Invertir canales de audio derecho e izquierdo" #: src/dialogs/confdialog.cxx:14617 src/dialogs/confdialog.cxx:14653 msgid "Software reversal of left-right audio channels" msgstr "Invertir por software los canales de audio (derecho e izquierdo)" #: src/dialogs/confdialog.cxx:14622 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Estos controles están en otras pestañas.\n" "Solo se duplican aquí por conveniencia.\n" "Puedes cambiar su estado en cualquier lugar.\n" "..." #: src/dialogs/confdialog.cxx:14627 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Tono de audio de 1Khz cuando hay PTT activo\n" "Para ser usado en otras formas de PTT" #: src/dialogs/confdialog.cxx:14633 msgid "CW QSK signal on right channel" msgstr "CW QSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:14634 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Generar una onda cuadrada en el canal derecho (1Khz)" #: src/dialogs/confdialog.cxx:14639 msgid "Pseudo-FSK on right audio channel" msgstr "Seudo-FSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:14640 msgid "Create 1000 Hz square wave on right channel" msgstr "Crear una onda cuadrada en el canal derecho de audio (1Khz)" #: src/dialogs/confdialog.cxx:14649 #, fuzzy msgid "Receive Usage" msgstr "Recibir" #: src/dialogs/confdialog.cxx:14662 msgid "Wav" msgstr "Wav" #: src/dialogs/confdialog.cxx:14664 msgid "Wav write sample rate" msgstr "Tasa de muestreo de wav" #: src/dialogs/confdialog.cxx:14665 msgid "Pick baud rate from list" msgstr "Seleccionar la tasa de baudios de la lista" #: src/dialogs/confdialog.cxx:14681 #, fuzzy msgid "Record both channels" msgstr "Invertir canales de audio derecho e izquierdo" #: src/dialogs/confdialog.cxx:14688 msgid "Alerts" msgstr "" #: src/dialogs/confdialog.cxx:14692 #, fuzzy msgid "Regex Match in Browser" msgstr "Navegador" #: src/dialogs/confdialog.cxx:14695 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14702 src/dialogs/confdialog.cxx:14731 #: src/dialogs/confdialog.cxx:14760 src/dialogs/confdialog.cxx:14784 #: src/dialogs/confdialog.cxx:14813 #, fuzzy msgid "Sound:" msgstr "Dispositivo de sonido" #: src/dialogs/confdialog.cxx:14716 src/dialogs/confdialog.cxx:14745 #: src/dialogs/confdialog.cxx:14774 src/dialogs/confdialog.cxx:14793 #: src/dialogs/confdialog.cxx:14827 src/dialogs/confdialog.cxx:16328 #: src/dialogs/confdialog.cxx:16332 src/dialogs/confdialog.cxx:16336 #: src/dialogs/confdialog.cxx:16340 src/dialogs/confdialog.cxx:16344 #: src/dialogs/confdialog.cxx:16348 src/dialogs/confdialog.cxx:16352 msgid "Test" msgstr "Probar" #: src/dialogs/confdialog.cxx:14721 msgid "MYCALL Match in Browser" msgstr "" #: src/dialogs/confdialog.cxx:14724 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:14750 #, fuzzy msgid "flmsg interface" msgstr "Interfaz de usuario" #: src/dialogs/confdialog.cxx:14753 #, fuzzy msgid "flmsg received wav" msgstr "RST recibido" #: src/dialogs/confdialog.cxx:14777 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "RsID detection" msgstr "Recepción con RSID" #: src/dialogs/confdialog.cxx:14806 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:14841 msgid "RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:14842 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:14845 msgid "Notify only" msgstr "Notificar solamente" #: src/dialogs/confdialog.cxx:14846 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Marque aquí para ser notificado cuando un RSID es recibido\n" "sin cambiar el módem y la frecuencia" #: src/dialogs/confdialog.cxx:14852 msgid "Receive modes" msgstr "Modos de RX" #: src/dialogs/confdialog.cxx:14855 msgid "Searches passband" msgstr "Buscar en el pasabanda" #: src/dialogs/confdialog.cxx:14856 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "ON - Buscar en toda cascada\n" "OFF - Limitar la búsqueda a +/- 200 Hz" #: src/dialogs/confdialog.cxx:14861 msgid "Mark prev freq/mode" msgstr "Marcar frec./modo previo" #: src/dialogs/confdialog.cxx:14862 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Insertar el marcador de texto en el panel de Rx\n" "antes de cambiar la frecuencia y el módem" #: src/dialogs/confdialog.cxx:14867 msgid "Disables detector" msgstr "Deshabilitar detector" #: src/dialogs/confdialog.cxx:14868 msgid "Disable further detection when RSID is received" msgstr "Desactivar la detección futura cuando un RSID es recibido" #: src/dialogs/confdialog.cxx:14875 msgid "Allow errors" msgstr "Permitir errores" #: src/dialogs/confdialog.cxx:14876 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Low = cero errores\n" "Medium = 1 error\n" "High = 2 errores" #: src/dialogs/confdialog.cxx:14887 msgid "Medium" msgstr "Medio" #: src/dialogs/confdialog.cxx:14892 msgid "Squelch open (sec)" msgstr "Silenciado abierto (s)" #: src/dialogs/confdialog.cxx:14893 msgid "Open squelch for nn sec if RSID detected" msgstr "Abrir el silenciador por nn segundos si se detecta RSID" #: src/dialogs/confdialog.cxx:14911 msgid "Disable alert dialog" msgstr "Desactivar alerta" #: src/dialogs/confdialog.cxx:14912 msgid "Do not show RsID alert dialog box" msgstr "No mostrar alerta de RsID" #: src/dialogs/confdialog.cxx:14917 msgid "Retain tx freq lock" msgstr "Mantenerse en frecuencia" #: src/dialogs/confdialog.cxx:14918 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "Mantener Tx en la frecuencia al cambiar a RX para RsID." #: src/dialogs/confdialog.cxx:14923 msgid "Disable freq change" msgstr "Desactivar cambio de frecuencia" #: src/dialogs/confdialog.cxx:14924 msgid "Do not automatically change to RX RsID frequency" msgstr "No cambiar automáticamente a la frecuencia del RsID" #: src/dialogs/confdialog.cxx:14929 msgid "" "The RsID notification message contents and\n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" "El contenido del mensaje de notificación de RsID \n" "y sus características de visualización se configuran\n" "en \"Notificaciones\" en la ventana de configuración." #: src/dialogs/confdialog.cxx:14937 msgid "Pre-Signal Tone" msgstr "Tono pre-señal" #: src/dialogs/confdialog.cxx:14940 msgid "Seconds" msgstr "Segundos" #: src/dialogs/confdialog.cxx:14941 msgid "Use for triggering amplifier carrier detect" msgstr "Usado para disparar amplificadores que detectan carrier" #: src/dialogs/confdialog.cxx:14949 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:14952 msgid "Transmit modes" msgstr "Modos de TX" #: src/dialogs/confdialog.cxx:14955 msgid "End of xmt ID" msgstr " ID al finalizar cada Tx" #: src/dialogs/confdialog.cxx:14956 msgid "Add RsID signal to end of transmission" msgstr "Enviar RsID al finalizar cada Tx" #: src/dialogs/confdialog.cxx:14965 msgid "Video" msgstr "Video" #: src/dialogs/confdialog.cxx:14967 msgid "Video Preamble ID" msgstr "Preámbulo de Video ID" #: src/dialogs/confdialog.cxx:14970 msgid "Transmit mode ID" msgstr "Transmitir el ID del modo" #: src/dialogs/confdialog.cxx:14971 msgid "Waterfall video ID" msgstr "Video ID en la cascada" #: src/dialogs/confdialog.cxx:14975 msgid "Transmit video text" msgstr "Transmitir el vídeo texto" #: src/dialogs/confdialog.cxx:14976 msgid "Waterfall video text" msgstr "Video texto en la cascada" #: src/dialogs/confdialog.cxx:14981 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:14982 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Limitar a unos pocos caracteres\n" "Como en CQEM o IOTA etc." #: src/dialogs/confdialog.cxx:14996 msgid "Use small font" msgstr "Usar tipografía pequeña" #: src/dialogs/confdialog.cxx:14997 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "On - Tipografía pequeña\n" "OFF - Tipografía grande" #: src/dialogs/confdialog.cxx:15003 msgid "Chars/Row:" msgstr "Carac/Fila:" #: src/dialogs/confdialog.cxx:15004 msgid "Set the number of characters per row" msgstr "Establecer el número de caracteres por fila" #: src/dialogs/confdialog.cxx:15024 msgid "500 Hz limit" msgstr "Límite de 500 Hz" #: src/dialogs/confdialog.cxx:15029 msgid "Mode width limit" msgstr "Límite del Modo" #: src/dialogs/confdialog.cxx:15034 msgid "Video ID modes" msgstr "Modos de Video ID" #: src/dialogs/confdialog.cxx:15043 msgid "CW Postamble ID" msgstr "Post-ámbulo de ID de CW" #: src/dialogs/confdialog.cxx:15046 msgid "Transmit callsign" msgstr "Transmitir indicativo" #: src/dialogs/confdialog.cxx:15047 msgid "Send Callsign in CW at end of every transmission" msgstr "Enviar tu indicativo en CW al finalizar cada Tx" #: src/dialogs/confdialog.cxx:15052 msgid "Speed (WPM):" msgstr "Velocidad (WPM):" #: src/dialogs/confdialog.cxx:15053 msgid "Send at this WPM" msgstr "Enviar a este WPM" #: src/dialogs/confdialog.cxx:15073 msgid "CW ID modes" msgstr "Modos con CW ID" #: src/dialogs/confdialog.cxx:15084 msgid "Misc" msgstr "Misc." #: src/dialogs/confdialog.cxx:15088 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:15092 msgid "Slow CPU (less than 700MHz)" msgstr "CPU lenta (Menos de 700Mhz)" #: src/dialogs/confdialog.cxx:15093 msgid "Enable if you're computer does not decode properly" msgstr "Activar si tu computadora no decodifica correctamente" #: src/dialogs/confdialog.cxx:15104 msgid "NBEMS data file interface" msgstr "Interface de datos NBEMS" #: src/dialogs/confdialog.cxx:15108 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Extraer archivos para usar con programas externos (wrap/flmsg)" #: src/dialogs/confdialog.cxx:15113 msgid "Open message folder" msgstr "Abrir carpeta de mensajes" #: src/dialogs/confdialog.cxx:15114 msgid "Opens NBEMS file folder upon successful capture" msgstr "Abrir la carpeta de NBEMS cuando capture ok" #: src/dialogs/confdialog.cxx:15121 msgid "Reception of flmsg files" msgstr "Recepción de archivo en flmsg" #: src/dialogs/confdialog.cxx:15124 msgid "Open with flmsg" msgstr "Abrir con flmsg" #: src/dialogs/confdialog.cxx:15125 msgid "Open message with flmsg" msgstr "Abrir mensaje con flmsg" #: src/dialogs/confdialog.cxx:15130 msgid "Open in browser" msgstr "Abrir en el navegador" #: src/dialogs/confdialog.cxx:15131 msgid "Open file with default browser" msgstr "Abrir archivo en el navegador predeterminado" #: src/dialogs/confdialog.cxx:15136 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:15137 msgid "Enter full path-filename for flmsg" msgstr "Entre la ruta completa del ejecutable de flmsg" #: src/dialogs/confdialog.cxx:15150 msgid "Locate flmsg" msgstr "Buscar flmsg" #: src/dialogs/confdialog.cxx:15154 msgid "Timeout (secs)" msgstr "Timeout (seg)" #: src/dialogs/confdialog.cxx:15155 msgid "Extract times out after NN seconds of inactivity." msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:15168 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:15172 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15173 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:15184 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:15187 msgid "Mail Server Attributes" msgstr "Atributos del servidor de correo (PSKMAIL)" #: src/dialogs/confdialog.cxx:15190 msgid "Carrier frequency (Hz)" msgstr "Frecuencia portadora (Hz)" #: src/dialogs/confdialog.cxx:15191 msgid "Default listen / transmit frequency" msgstr "Frecuencia de RX/TX predeterminada" #: src/dialogs/confdialog.cxx:15210 msgid "Search range (Hz)" msgstr "Rango de búsqueda (Hz)" #: src/dialogs/confdialog.cxx:15211 msgid "Listen for signals within this range" msgstr "Escuchar señales dentro de este rango" #: src/dialogs/confdialog.cxx:15250 msgid "AFC range (Hz)" msgstr "Rango AFC (Hz)" #: src/dialogs/confdialog.cxx:15251 msgid "Limit AFC movement to this range" msgstr "Limitar el movimiento del AFC a este rango" #: src/dialogs/confdialog.cxx:15270 msgid "Reset to Carrier" msgstr "Ajustar a la portadora" #: src/dialogs/confdialog.cxx:15271 msgid "When no signal present" msgstr "Cuando no halla señal presente" #: src/dialogs/confdialog.cxx:15282 msgid "Report ARQ frames average S/N" msgstr "Reportar el promedio de S/N de tramas ARQ" #: src/dialogs/confdialog.cxx:15291 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:15293 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15296 msgid "Automatically spot callsigns in decoded text" msgstr "" "Hacer \"spot\" automáticamente con los\n" "indicativos descodificados en el texto recibido" #: src/dialogs/confdialog.cxx:15297 msgid "Parse all incoming text" msgstr "Procesar todo el texto entrante" #: src/dialogs/confdialog.cxx:15302 msgid "Send reception report when logging a QSO" msgstr "Enviar reporte cuando se llenan los datos del QSO" #: src/dialogs/confdialog.cxx:15303 msgid "Send report only when QSO is logged" msgstr "Enviar reporte solo cuando se guardan los datos del QSO" #: src/dialogs/confdialog.cxx:15308 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Reportar la frecuencia del radio (activar solo si tienes control del radio)" #: src/dialogs/confdialog.cxx:15309 msgid "Include the transmit frequency" msgstr "Incluir la frecuencia de Tx" #: src/dialogs/confdialog.cxx:15314 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Activar spotting solo cuando el navegador de señal está visible" #: src/dialogs/confdialog.cxx:15315 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Marcar para reducir la carga al CPU en PSK y RTTY." #: src/dialogs/confdialog.cxx:15321 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:15322 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:15332 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:15333 msgid "To whom the connection is made" msgstr "A quien se hace la conexión" #: src/dialogs/confdialog.cxx:15347 msgid "Port:" msgstr "Puerto:" #: src/dialogs/confdialog.cxx:15348 msgid "Using UDP port #" msgstr "Usando puerto UDP #" #: src/dialogs/confdialog.cxx:15363 msgid "Initialize the socket client" msgstr "Inicializar el socket cliente" #: src/dialogs/confdialog.cxx:15366 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:15374 msgid "Sweet Spot" msgstr "Frecuencia Inicial" #: src/dialogs/confdialog.cxx:15380 msgid "Default CW tracking point" msgstr "Punto predefinido de rastreo de CW" #: src/dialogs/confdialog.cxx:15398 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:15399 msgid "Default RTTY tracking point" msgstr "Punto predefinido de rastreo de RTTY" #: src/dialogs/confdialog.cxx:15417 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:15418 msgid "Default for all other modems" msgstr "Punto predefinido de rastreo para los otros módems" #: src/dialogs/confdialog.cxx:15436 msgid "Always start new modems at these frequencies" msgstr "Siempre iniciar los módems nuevos en estas frecuencias" #: src/dialogs/confdialog.cxx:15437 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - Iniciar en la predeterminada\n" "OFF - Mantener la posición actual en la cascada" #: src/dialogs/confdialog.cxx:15445 msgid "K3 A1A configuation" msgstr "Configuración de A1A para el Elecraft K3" #: src/dialogs/confdialog.cxx:15449 msgid "CW is LSB" msgstr "CW es LSB" #: src/dialogs/confdialog.cxx:15450 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Solo para el Elecraft K3\n" "Otros radios no lo necesitan." #: src/dialogs/confdialog.cxx:15459 msgid "Text i/o" msgstr "E/S de Texto" #: src/dialogs/confdialog.cxx:15461 msgid "Talker Socket (MS only)" msgstr "Talker Socket (Solo MS)" #: src/dialogs/confdialog.cxx:15464 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:15468 msgid "Connect/disconnect to Talker socket server" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:15471 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Auto conectar cuando fldigi se ejecute (el servidor debe estar encendido)" #: src/dialogs/confdialog.cxx:15478 msgid "Capture rx text to external file" msgstr "Capturar el texto de Rx a un archivo externo" #: src/dialogs/confdialog.cxx:15481 msgid "Enable rx text stream" msgstr "Activar el registro del texto de recepción." #: src/dialogs/confdialog.cxx:15482 msgid "Send rx text to file: textout.txt" msgstr "Enviar texto rx al archivo: textout.txt" #: src/dialogs/confdialog.cxx:15493 msgid "Decode DTMF tones" msgstr "Decodificar tonos DTMF" #: src/dialogs/confdialog.cxx:15494 msgid "Decode received DTMF tones" msgstr "Decodificar tonos DTMF recibidos" #: src/dialogs/confdialog.cxx:15503 msgid "Weather query specification" msgstr "Consulta específica de clima" #: src/dialogs/confdialog.cxx:15506 msgid "METAR station ID code" msgstr "Código de la estación METAR" #: src/dialogs/confdialog.cxx:15507 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "Por ejemplo KMDQ para el\n" "Huntsville-Madison Executive Airport, de AL" #: src/dialogs/confdialog.cxx:15512 msgid "Full report" msgstr "Reporte Completo" #: src/dialogs/confdialog.cxx:15513 msgid "Insert full METAR report" msgstr "Insertar reporte METAR completo" #: src/dialogs/confdialog.cxx:15518 msgid "METAR station location" msgstr "Localización de la estación METAR" #: src/dialogs/confdialog.cxx:15519 msgid "Add geopolitical name of METAR station" msgstr "Poner nombre geopolítico a la estación METAR" #: src/dialogs/confdialog.cxx:15524 msgid "Conditions" msgstr "Condiciones" #: src/dialogs/confdialog.cxx:15525 msgid "current wx conditions" msgstr "Condiciones actuales del clima" #: src/dialogs/confdialog.cxx:15530 msgid "Fahrenheit" msgstr "Grados Fahrenheit" #: src/dialogs/confdialog.cxx:15531 msgid "report Fahrenheit" msgstr "reportar en grados Fahrenheit" #: src/dialogs/confdialog.cxx:15536 msgid "Celsius" msgstr "Grados Celcius" #: src/dialogs/confdialog.cxx:15537 msgid "report Celsius" msgstr "reportar en grados Celsius" #: src/dialogs/confdialog.cxx:15542 msgid "Miles / Hour" msgstr "Millas / Hora" #: src/dialogs/confdialog.cxx:15543 msgid "report miles per hour" msgstr "reportar en millas por hora" #: src/dialogs/confdialog.cxx:15548 msgid "kilometers / hour" msgstr "kilómetros / hora" #: src/dialogs/confdialog.cxx:15549 msgid "report kilometers per hour" msgstr "reportar en kilómetros por hora" #: src/dialogs/confdialog.cxx:15554 #, fuzzy msgid "Inches Hg." msgstr "Pulgadas de Mg" #: src/dialogs/confdialog.cxx:15555 msgid "report inches mercury" msgstr "reportar en pulgadas de mercurio" #: src/dialogs/confdialog.cxx:15560 msgid "mbars" msgstr "milibares" #: src/dialogs/confdialog.cxx:15561 msgid "report millibars" msgstr "Reportar en milibares" #: src/dialogs/confdialog.cxx:15566 msgid "Temperature" msgstr "Temperatura" #: src/dialogs/confdialog.cxx:15569 msgid "Wind speed/dir" msgstr "Vel/Dir del viento" #: src/dialogs/confdialog.cxx:15572 msgid "Barometric pressure" msgstr "Presión Barométrica" #: src/dialogs/confdialog.cxx:15575 msgid "Search on web" msgstr "Buscar en la web" #: src/dialogs/confdialog.cxx:15578 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:15579 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "Default URL" msgstr "Omisión" #: src/dialogs/confdialog.cxx:15594 msgid "KML files directory" msgstr "Directorio de archivos KML" #: src/dialogs/confdialog.cxx:15595 msgid "Where generated KML documents are stored." msgstr "Donde se almacenan los documentos KML generados" #: src/dialogs/confdialog.cxx:15600 msgid "KML root file" msgstr "Raíz del archivo KML" #: src/dialogs/confdialog.cxx:15604 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Distancia mínima para alias segmentados (metros)" #: src/dialogs/confdialog.cxx:15605 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Distancia mínima para nodos alias segmentados (metros)" #: src/dialogs/confdialog.cxx:15615 msgid "Data retention time, in hours (0 for no limit)" msgstr "Horas de retención de datos (0 sin límite)" #: src/dialogs/confdialog.cxx:15616 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "Horas de conservación para cada nodo, Cero significa conservar todo." #: src/dialogs/confdialog.cxx:15625 msgid "KML refresh interval (seconds)" msgstr "Intervalo de refresco KML (seg)" #: src/dialogs/confdialog.cxx:15626 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Intervalo de refresco de escritura para KML (seg)" #: src/dialogs/confdialog.cxx:15642 msgid "KML balloon display style" msgstr "Estilo del globo de KML" #: src/dialogs/confdialog.cxx:15643 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "KML globo en texto plano, o HTML, en tablas simples o matrices." #: src/dialogs/confdialog.cxx:15658 msgid "Command run on KML creation" msgstr "Comando a ejecutar al crear un archivo KML" #: src/dialogs/confdialog.cxx:15659 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Comando que se ejecuta cuando se genera un archivo KML. Subprocesos se " "reinician si es requerido." #: src/dialogs/confdialog.cxx:15665 msgid "Test command" msgstr "Comando de prueba" #: src/dialogs/confdialog.cxx:15666 msgid "Execute command on KML files." msgstr "Ejecutar un comando sobre los archivos KML" #: src/dialogs/confdialog.cxx:15669 msgid "Change dir..." msgstr "Cambiar carpeta" #: src/dialogs/confdialog.cxx:15670 msgid "Choose directory to store KML documents" msgstr "Seleccione directorio de archivos KML" #: src/dialogs/confdialog.cxx:15673 msgid "Cleanup KML data now !" msgstr "¡Limpiar datos KML ahora!" #: src/dialogs/confdialog.cxx:15674 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Liampiar datos KML, limpia la pantalla de Google Hearth" #: src/dialogs/confdialog.cxx:15677 msgid "Cleanup on startup" msgstr "Limpiar al iniciar" #: src/dialogs/confdialog.cxx:15678 msgid "Empties KML documents when starting program." msgstr "Limpiar los documentos KML al inicio del programa." #: src/dialogs/confdialog.cxx:15685 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:15686 msgid "Uncheck if KML is never used" msgstr "" # Considero que debemos dejar este texto como "Web" ya que esta pestaña refiere a la consulta de servicios via web (@HK4QWC) #: src/dialogs/confdialog.cxx:15699 msgid "Web" msgstr "Web" #: src/dialogs/confdialog.cxx:15702 msgid "Call Lookup" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:15703 msgid "Web Browser lookup" msgstr "Búsqueda con navegador web" #: src/dialogs/confdialog.cxx:15707 msgid "Do not use callsign lookup via web browser" msgstr "No busque indicativos vía navegador web" #: src/dialogs/confdialog.cxx:15713 #, fuzzy msgid "QRS on line" msgstr "RTS es la línea de PTT" #: src/dialogs/confdialog.cxx:15714 msgid "Visit QRZ web site" msgstr "Visita el sitio web de QRZ" #: src/dialogs/confdialog.cxx:15719 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:15720 msgid "Visit Hamcall web site" msgstr "Visita el sitio web de HamCall" #: src/dialogs/confdialog.cxx:15725 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:15726 src/dialogs/confdialog.cxx:15732 msgid "Visit hamQTH web site" msgstr "Visita el sitio web hamQTH" #: src/dialogs/confdialog.cxx:15731 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:15737 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:15750 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15763 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15776 #, fuzzy msgid "Callook" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:15777 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:15792 msgid "Data base lookup" msgstr "Búsqueda en base de datos" #: src/dialogs/confdialog.cxx:15796 msgid "Do not use callsign database" msgstr "No usar base de datos de indicativos" #: src/dialogs/confdialog.cxx:15802 msgid "QRZ cdrom" msgstr "QRZ CD" #: src/dialogs/confdialog.cxx:15803 msgid "Use CD or hard drive CD image" msgstr "Usar el CD o una imagen del CD en el disco duro" #: src/dialogs/confdialog.cxx:15808 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:15809 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Se requiere de una subscripción\n" "pagada para acceder a QRZ" #: src/dialogs/confdialog.cxx:15814 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:15815 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Se requiere de una subscripción\n" "pagada para acceder a Hamcall" #: src/dialogs/confdialog.cxx:15820 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "Free service courtesy of OK" msgstr "Servicio gratuito cortesía de OK" #: src/dialogs/confdialog.cxx:15826 #, fuzzy msgid "Callook.info" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:15827 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" "Búsqueda en Callbook.info (servicio gratuito solo indicativos de EE.UU.)" #: src/dialogs/confdialog.cxx:15833 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ejemplo: /home/co7wt/CALLBK o C:/CALLBK\n" "Dejar en blanco para buscar la base de datos" #: src/dialogs/confdialog.cxx:15847 msgid "User name" msgstr "Nombre de usuario" #: src/dialogs/confdialog.cxx:15848 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15862 src/dialogs/confdialog.cxx:15932 #: src/dialogs/confdialog.cxx:16043 msgid "Password" msgstr "Contraseña" #: src/dialogs/confdialog.cxx:15863 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:15879 src/dialogs/confdialog.cxx:15949 #: src/dialogs/confdialog.cxx:16122 msgid "Show password in plain text" msgstr "Mostrar clave en texto plano" #: src/dialogs/confdialog.cxx:15884 msgid "Add address to notes field" msgstr "Agregar dirección al campo notas" #: src/dialogs/confdialog.cxx:15889 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:15900 msgid "eQSL" msgstr "Usuario de eQSL" #: src/dialogs/confdialog.cxx:15902 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:15903 src/dialogs/confdialog.cxx:15918 #: src/dialogs/confdialog.cxx:15953 msgid "Your login name" msgstr "Su nombre de usuario" #: src/dialogs/confdialog.cxx:15917 msgid "User ID" msgstr "Nombre de usuario" #: src/dialogs/confdialog.cxx:15933 msgid "Your login password" msgstr "Su contraseña" #: src/dialogs/confdialog.cxx:15952 msgid "QTH Nickname" msgstr "Apodo del QTH" #: src/dialogs/confdialog.cxx:15967 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:15971 msgid "Options" msgstr "Opciones" #: src/dialogs/confdialog.cxx:15974 msgid "send when logged (log button, , )" msgstr "Enviar QSO al guardar un contacto (botón de guardar, , )" #: src/dialogs/confdialog.cxx:15975 msgid "automatic data upload" msgstr "Envío automático de datos a internet" #: src/dialogs/confdialog.cxx:15980 msgid "Use date/time off for log entry" msgstr "Guardar la fecha/hora de fin del QSO en el log" #: src/dialogs/confdialog.cxx:15981 msgid "default uses date/time on" msgstr "Predeterminado usa fecha/hora activado" #: src/dialogs/confdialog.cxx:15986 src/dialogs/confdialog.cxx:16140 #, fuzzy msgid "Show delivery message" msgstr "Mostrar menos modos" #: src/dialogs/confdialog.cxx:15987 src/dialogs/confdialog.cxx:16141 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:15992 msgid "Default message" msgstr "Mensaje predeterminado" #: src/dialogs/confdialog.cxx:15993 msgid "default text to send with etc" msgstr "texto predeterminado para enviar con una entrada de " #: src/dialogs/confdialog.cxx:16007 msgid "Text Tags (tags use {} delimiters)" msgstr "Etiquetas de texto (use el delimitador {})" #: src/dialogs/confdialog.cxx:16010 msgid " {CALL} other ops call sign" msgstr " {CALL} indicativo del otro operador" #: src/dialogs/confdialog.cxx:16013 msgid " {MODE} full mode / submode" msgstr " {MODE} modo completo / submodo" #: src/dialogs/confdialog.cxx:16016 msgid "{NAME} other ops name" msgstr "{NAME}\tnombre del otro operador" #: src/dialogs/confdialog.cxx:16019 msgid "These tags can also be used in " msgstr "Etiquetas para usar en el macro " #: src/dialogs/confdialog.cxx:16029 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:16030 #, fuzzy msgid "Enter full path-filename for tqsl executable" msgstr "Entre la ruta completa del ejecutable flnet" #: src/dialogs/confdialog.cxx:16044 #, fuzzy msgid "Your tqsl login password" msgstr "Su contraseña" #: src/dialogs/confdialog.cxx:16059 #, fuzzy msgid "Use password for tqsl access" msgstr "Contraseña" #: src/dialogs/confdialog.cxx:16060 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:16065 #, fuzzy msgid "Location" msgstr "Cuadrícula" #: src/dialogs/confdialog.cxx:16066 #, fuzzy msgid "tqsl station location" msgstr "Localización de la estación METAR" #: src/dialogs/confdialog.cxx:16080 src/dialogs/confdialog.cxx:16173 #: src/dialogs/confdialog.cxx:16191 src/dialogs/confdialog.cxx:16209 #: src/dialogs/confdialog.cxx:16227 src/dialogs/confdialog.cxx:16245 #: src/dialogs/confdialog.cxx:16263 src/dialogs/confdialog.cxx:16281 msgid "Locate" msgstr "Buscar" #: src/dialogs/confdialog.cxx:16081 #, fuzzy msgid "Locate tqsl executable" msgstr "Buscar ejecutable" #: src/dialogs/confdialog.cxx:16084 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:16085 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:16090 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:16091 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:16096 #, fuzzy msgid "Export" msgstr "Exportar..." #: src/dialogs/confdialog.cxx:16097 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16100 src/logbook/lgbook.cxx:765 #: src/logbook/lgbook.cxx:1398 src/logbook/lgbook.cxx:1451 #, fuzzy msgid "Check" msgstr "Marcar todo" #: src/dialogs/confdialog.cxx:16101 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16105 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:16108 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:16114 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:16117 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:16125 #, fuzzy msgid "Use this tqsl station location" msgstr "Localización de la estación METAR" #: src/dialogs/confdialog.cxx:16128 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:16129 src/dialogs/confdialog.cxx:16136 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16132 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:16135 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:16156 msgid "Auto start programs with fldigi" msgstr "Iniciar programas automáticamente con fldigi" #: src/dialogs/confdialog.cxx:16159 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:16160 msgid "Enter full path-filename for flrig" msgstr "Entre la ruta completa del ejecutable flrig" #: src/dialogs/confdialog.cxx:16174 msgid "Locate flrig executable" msgstr "Buscar el ejecutable flrig" #: src/dialogs/confdialog.cxx:16177 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16178 msgid "Enter full path-filename for flamp" msgstr "Entre la ruta completa del ejecutable flmsg" #: src/dialogs/confdialog.cxx:16192 msgid "Locate flamp executable" msgstr "Buscar el ejecutable flamp" #: src/dialogs/confdialog.cxx:16195 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16196 msgid "Enter full path-filename for flnet" msgstr "Entre la ruta completa del ejecutable flnet" #: src/dialogs/confdialog.cxx:16210 msgid "Locate flnet executable" msgstr "Buscar el ejecutable flnet" #: src/dialogs/confdialog.cxx:16213 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16214 msgid "Enter full path-filename for fllog" msgstr "Entre la ruta completa del ejecutable fllog" #: src/dialogs/confdialog.cxx:16228 msgid "Locate fllog executable" msgstr "Buscar el ejecutable fllog" #: src/dialogs/confdialog.cxx:16231 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16232 src/dialogs/confdialog.cxx:16250 #: src/dialogs/confdialog.cxx:16268 msgid "Enter full path-filename for external program" msgstr "Entre la ruta completa del ejecutable del programa externo" #: src/dialogs/confdialog.cxx:16246 msgid "Locate program #1 executable" msgstr "Buscar el ejecutable programa #1" #: src/dialogs/confdialog.cxx:16249 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16264 msgid "Locate program #2 executable" msgstr "Buscar el ejecutable programa #2" #: src/dialogs/confdialog.cxx:16267 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16282 msgid "Locate program #3 executable" msgstr "Buscar el ejecutable programa #3" #: src/dialogs/confdialog.cxx:16285 msgid "" "Enable\n" "-" msgstr "" "Activar\n" "-" # Revisar estilo (@HK4QWC) # @CO7WT De esta forma es más sencillo y al estar en contexto en la interfaz se intuye el significado #: src/dialogs/confdialog.cxx:16286 src/dialogs/confdialog.cxx:16293 #: src/dialogs/confdialog.cxx:16299 src/dialogs/confdialog.cxx:16305 #: src/dialogs/confdialog.cxx:16311 src/dialogs/confdialog.cxx:16317 #: src/dialogs/confdialog.cxx:16323 msgid "Enable this entry when fldigi first starts" msgstr "Activar al iniciar fldigi" #: src/dialogs/confdialog.cxx:16329 msgid "Start flrig" msgstr "Iniciar flrig" #: src/dialogs/confdialog.cxx:16333 msgid "Start flamp" msgstr "Iniciar flamp" #: src/dialogs/confdialog.cxx:16337 msgid "Start flnet" msgstr "Iniciar flnet" #: src/dialogs/confdialog.cxx:16341 msgid "Start fllog" msgstr "Iniciar fllog" #: src/dialogs/confdialog.cxx:16345 msgid "Start prog1" msgstr "Iniciar prog 1" #: src/dialogs/confdialog.cxx:16349 msgid "Start prog2" msgstr "Iniciar prog 2" #: src/dialogs/confdialog.cxx:16353 msgid "Start prog3" msgstr "Iniciar prog 3" #: src/dialogs/confdialog.cxx:16366 msgid "Lock" msgstr "Bloquear" #: src/dialogs/confdialog.cxx:16367 msgid "Allow/Disallow Changes" msgstr "Permitir/Impedir cambios" #: src/dialogs/confdialog.cxx:16372 msgid "Enable ARQ" msgstr "Activar ARQ" #: src/dialogs/confdialog.cxx:16373 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "Usado para PSKMail y el conjunto de programas FLDIGI" #: src/dialogs/confdialog.cxx:16380 msgid "Enable KISS" msgstr "Activar KISS" #: src/dialogs/confdialog.cxx:16381 msgid "Used for BPQ32" msgstr "Usado para BPQ32" #: src/dialogs/confdialog.cxx:16388 #, fuzzy msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Habilitar ARQ para programas que soportan TCP y el protocolo FLDIGI ARQ.\n" "Habilitar KISS para programas que soportan UDP y el protocolo KISS TNC-2.\n" "Solamente una interfaz (ARQ/KISS) puede estar activa a la vez.\n" "Los cambios de dirección IP y del número del puerto requieren el reinicio de " "FLDIGI." #: src/dialogs/confdialog.cxx:16395 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16404 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "I/O" msgstr "E/S" #: src/dialogs/confdialog.cxx:16437 msgid "Output port number when same IP address used" msgstr "Puerto de salida cuando se usa la misma dirección IP" #: src/dialogs/confdialog.cxx:16452 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16453 msgid "Enable when both programs are using the same IP address" msgstr "Habilitar cuando ambos programas están usando la misma dirección IP" #: src/dialogs/confdialog.cxx:16459 src/dialogs/confdialog.cxx:16554 #: src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "Restart" msgstr "Inicio" #: src/dialogs/confdialog.cxx:16464 msgid "Start" msgstr "Inicio" #: src/dialogs/confdialog.cxx:16465 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16469 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16476 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16477 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16483 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16484 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16490 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16491 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16497 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16498 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16504 msgid "AX25 Decode" msgstr "Decod. AX25" #: src/dialogs/confdialog.cxx:16505 msgid "Decode AX25 Packets into human readable form" msgstr "Descodifica paquetes AX25 en forma legible" #: src/dialogs/confdialog.cxx:16513 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:16517 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16564 #, fuzzy msgid "XML" msgstr "KML" #: src/dialogs/confdialog.cxx:16573 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16659 #, fuzzy msgid "fllog" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16663 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16696 msgid "Allow TX After Signal Detection (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16697 #, fuzzy msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:16707 msgid "Enable Busy Channel" msgstr "Activar det. canal ocupado" #: src/dialogs/confdialog.cxx:16708 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16714 msgid "TX Buffer Flush Timer (Minutes, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16715 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16726 #, fuzzy msgid "Modem Bandwidth Margins " msgstr "Ancho de banda" #: src/dialogs/confdialog.cxx:16727 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16737 msgid "Valid Signal Sample Period (Milliseconds)" msgstr "" #: src/dialogs/confdialog.cxx:16738 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16753 msgid "Enable CSMA" msgstr "Activar CSMA" #: src/dialogs/confdialog.cxx:16754 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16759 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16770 #, fuzzy msgid "Slot Time" msgstr "Hora" #: src/dialogs/confdialog.cxx:16771 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16781 #, fuzzy msgid "Transmit Data Delay" msgstr "Señal transmitida" #: src/dialogs/confdialog.cxx:16782 #, fuzzy msgid "Idle transmit before data sent" msgstr "Incluir la frecuencia de Tx" #: src/dialogs/confdialog.cxx:16792 src/dialogs/confdialog.cxx:16796 #, fuzzy msgid "MilliSeconds" msgstr "Segundos" #: src/dialogs/confdialog.cxx:16793 src/dialogs/confdialog.cxx:16801 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16797 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16800 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16809 #, fuzzy msgid "Enable Histogram" msgstr "Activar el registro del texto de recepción." #: src/dialogs/confdialog.cxx:16810 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16815 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16816 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16831 #, fuzzy msgid "PSM Attenuate" msgstr "Atenuación KPSQL" #: src/dialogs/confdialog.cxx:16832 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16845 #, fuzzy msgid "Default Settings" msgstr "" "La cadena de prueba por omisión es:\n" "\"" #: src/dialogs/confdialog.cxx:16851 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16852 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16869 msgid "Restore defaults" msgstr "Predeterminados" #: src/dialogs/confdialog.cxx:16870 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Color de letra" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Tipografía:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Tamaño:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" # ¿Qué tal si usamos un pangrama en español como este? (@HK4QWC) #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "Jovencillo emponzoñado de whisky: ¡qué figurota exhibe!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "leyendo tipografías..." # Este es el nombre de la ventana que se abre en el menú Archivo > Carpetas > Archivo de datos… # Lo dejo "Archivo de datos" para que sea consistente con el menú # @HK4QWC #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Archivos de datos" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Actualización de datos locales" # No encuentro un menú específico que use este texto @HK4QWC #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Fuente de datos" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Fuente datos" # No encuentro un menú específico que use este texto @HK4QWC #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Ubicación de la fuente de datos" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "Actualizar los datos locales con el contenido online" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Eliminar datos locales si se selecciona" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Evento" #: src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Activado" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtro" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entidad DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Mostrar las entidades DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "No trabajado previamente" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Usuario de LotW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "Usuario de eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicados" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignorar duplicados" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "en:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Tiempo (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Acción" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Tiempo límite (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Tiempo mínimo entre eventos" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Mostrar ventana de alerta:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Insertar texto predeterminado" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Esconder después de (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Añadir al texto de RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Añadir al texto de TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Mostrar el editor de macros" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Ejecutar programa:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entidades DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Buscar país:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Presione enter para continuar la búsqueda" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Buscar prefijo:" #: src/logbook/lgbook.cxx:610 msgid "Export Setup" msgstr "Configuración de la exportación" #: src/logbook/lgbook.cxx:611 src/logbook/lgbook.cxx:1626 msgid "Select Records to Export" msgstr "Seleccione las entradas a exportar" #: src/logbook/lgbook.cxx:619 src/logbook/lgbook.cxx:820 #: src/logbook/lgbook.cxx:1634 src/logbook/lgbook.cxx:1708 msgid "Check All" msgstr "Marcar todo" #: src/logbook/lgbook.cxx:622 msgid "Start Date" msgstr "Fecha inicio" #: src/logbook/lgbook.cxx:623 msgid "Start date for export" msgstr "Fecha de inicio para exportación" #: src/logbook/lgbook.cxx:636 msgid "Stop Date" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:637 msgid "Inclusive stop date for export" msgstr "Fecha de fin de la exportación (inclusiva)" #: src/logbook/lgbook.cxx:650 msgid "select by date" msgstr "Selecc. por fecha" #: src/logbook/lgbook.cxx:651 #, fuzzy msgid "Enable to select date range" msgstr "Activar para seleccionar rango de fechas" #: src/logbook/lgbook.cxx:657 msgid "Select Fields to Export" msgstr "Seleccione los campos a exportar" #: src/logbook/lgbook.cxx:668 src/logbook/lgbook.cxx:1665 msgid "Freq" msgstr "Frec" #: src/logbook/lgbook.cxx:679 msgid "QSO Date On" msgstr "Fecha de inicio" #: src/logbook/lgbook.cxx:683 msgid "QSO Date Off" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:687 msgid "Time ON" msgstr "Hora com." #: src/logbook/lgbook.cxx:691 src/logbook/lgbook.cxx:1677 msgid "Time OFF" msgstr "Hora fin." #: src/logbook/lgbook.cxx:694 msgid "TX Power" msgstr "Potencia" #: src/logbook/lgbook.cxx:697 src/logbook/lgbook.cxx:1681 msgid "RST sent" msgstr "RST env." #: src/logbook/lgbook.cxx:701 src/logbook/lgbook.cxx:1685 msgid "RST rcvd" msgstr "RST recib." #: src/logbook/lgbook.cxx:705 src/logbook/lgbook.cxx:998 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:708 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:714 src/logbook/lgbook.cxx:1362 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:717 src/logbook/lgbook.cxx:1238 #, fuzzy msgid "Station Call" msgstr "Estación" #: src/logbook/lgbook.cxx:720 src/logbook/lgbook.cxx:1262 #, fuzzy msgid "Station QTH" msgstr "Estación" #: src/logbook/lgbook.cxx:723 #, fuzzy msgid "Station LOC" msgstr "Estación" #: src/logbook/lgbook.cxx:735 src/logbook/lgbook.cxx:1219 msgid "Notes" msgstr "Notas" #: src/logbook/lgbook.cxx:738 msgid "QSL rcvd date" msgstr "Fecha de RX QSL" #: src/logbook/lgbook.cxx:741 msgid "QSL sent date" msgstr "Fecha de TX QSL" #: src/logbook/lgbook.cxx:744 #, fuzzy msgid "eQSL rcvd date" msgstr "Fecha de RX QSL" #: src/logbook/lgbook.cxx:747 #, fuzzy msgid "eQSL sent date" msgstr "Fecha de TX QSL" #: src/logbook/lgbook.cxx:750 #, fuzzy msgid "LoTW rcvd date" msgstr "Fecha de RX QSL" #: src/logbook/lgbook.cxx:753 #, fuzzy msgid "LoTW sent date" msgstr "Fecha de TX QSL" #: src/logbook/lgbook.cxx:756 src/logbook/lgbook.cxx:1127 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:759 src/logbook/lgbook.cxx:1689 msgid "Serial # in" msgstr "Serie recibida" #: src/logbook/lgbook.cxx:762 src/logbook/lgbook.cxx:1693 msgid "Serial # out" msgstr "Serie enviada" #: src/logbook/lgbook.cxx:771 src/logbook/lgbook.cxx:1701 msgid "Exchange Out" msgstr "Intercambio TX" #: src/logbook/lgbook.cxx:780 src/logbook/lgbook.cxx:1169 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:783 src/logbook/lgbook.cxx:1205 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:786 src/logbook/lgbook.cxx:1157 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:789 src/logbook/lgbook.cxx:1193 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:792 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:795 #, fuzzy msgid "FD section" msgstr "Recepción con RSID" #: src/logbook/lgbook.cxx:798 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:799 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:802 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:806 #, fuzzy msgid "CW SS Check" msgstr "Marcar todo" #: src/logbook/lgbook.cxx:809 #, fuzzy msgid "CW SS Section" msgstr "Acción" #: src/logbook/lgbook.cxx:810 src/logbook/lgbook.cxx:814 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:813 src/logbook/lgbook.cxx:1374 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:839 msgid "Logbook" msgstr "Libro de guardia" #: src/logbook/lgbook.cxx:840 msgid "Date On" msgstr "Fecha de inicio" #: src/logbook/lgbook.cxx:841 msgid "Date QSO started" msgstr "Fecha de inicio del QSO" #: src/logbook/lgbook.cxx:853 msgid "Time On" msgstr "Hora inicio" #: src/logbook/lgbook.cxx:854 msgid "Time QSO started" msgstr "Hora de inicio del QSO" #: src/logbook/lgbook.cxx:866 msgid "Call sign worked" msgstr "Indicativo trabajado" #: src/logbook/lgbook.cxx:878 msgid "Operator worked" msgstr "Operador trabajado" #: src/logbook/lgbook.cxx:889 msgid "In" msgstr "Rec" #: src/logbook/lgbook.cxx:890 msgid "Rst received" msgstr "RST recibido" #: src/logbook/lgbook.cxx:901 msgid "Recs" msgstr "Ent." #: src/logbook/lgbook.cxx:902 msgid "# Records in logbook" msgstr "Número de entradas en el libro de guardia" #: src/logbook/lgbook.cxx:913 msgid "Date Off" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:914 msgid "Date QSO Ended" msgstr "Fecha de fin del QSO" #: src/logbook/lgbook.cxx:926 msgid "Time Off" msgstr "Hora fin" #: src/logbook/lgbook.cxx:927 msgid "Time QSO ended" msgstr "Hora de fin del QSO" #: src/logbook/lgbook.cxx:938 msgid "Freq." msgstr "Frec." #: src/logbook/lgbook.cxx:939 msgid "Frequency in MHz" msgstr "Frecuencia en MHz" #: src/logbook/lgbook.cxx:951 msgid "Mode in use" msgstr "Modo en uso" #: src/logbook/lgbook.cxx:962 msgid "Pwr" msgstr "Pot" #: src/logbook/lgbook.cxx:963 msgid "Transmit power used" msgstr "Potencia de transmisión usada" #: src/logbook/lgbook.cxx:974 msgid "Loc" msgstr "Loc" #: src/logbook/lgbook.cxx:975 msgid "Stations grid square" msgstr "Cuadrícula de la estación" #: src/logbook/lgbook.cxx:986 msgid "Out" msgstr "Env" #: src/logbook/lgbook.cxx:987 msgid "Rst sent" msgstr "RST env." #: src/logbook/lgbook.cxx:999 msgid "City of station worked" msgstr "Ciudad de la estación trabajada" #: src/logbook/lgbook.cxx:1010 msgid "St" msgstr "Es" #: src/logbook/lgbook.cxx:1011 msgid "US state of station worked" msgstr "Estado de EE.UU. de la estación trabajada" #: src/logbook/lgbook.cxx:1022 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1023 msgid "Province of station worked" msgstr "Provincia de la estación trabajada" #: src/logbook/lgbook.cxx:1035 msgid "Country of station worked" msgstr "País de la estación trabajada" #: src/logbook/lgbook.cxx:1048 #, fuzzy msgid "QSL" msgstr "Usuario de eQSL" #: src/logbook/lgbook.cxx:1049 msgid "QSL-rcvd" msgstr "QSL-recibida" #: src/logbook/lgbook.cxx:1050 src/logbook/lgbook.cxx:1063 #: src/logbook/lgbook.cxx:1076 msgid "QSL received on this date" msgstr "QSL recibidas en esta fecha" #: src/logbook/lgbook.cxx:1062 #, fuzzy msgid "EQSL-rcvd" msgstr "QSL-recibida" #: src/logbook/lgbook.cxx:1075 #, fuzzy msgid "LOTW-rcvd" msgstr "QSL-recibida" #: src/logbook/lgbook.cxx:1088 msgid "QSL-sent" msgstr "QSL-enviada" #: src/logbook/lgbook.cxx:1089 src/logbook/lgbook.cxx:1102 #: src/logbook/lgbook.cxx:1115 msgid "QSL sent on this date" msgstr "QSL enviadas en esta fecha" #: src/logbook/lgbook.cxx:1101 #, fuzzy msgid "EQSL-sent" msgstr "QSL-enviada" #: src/logbook/lgbook.cxx:1114 #, fuzzy msgid "LOTW-sent" msgstr "QSL-enviada" #: src/logbook/lgbook.cxx:1128 msgid "QSL route of contacted station" msgstr "QSL route de la estación" #: src/logbook/lgbook.cxx:1158 msgid "Islands on the air" msgstr "Islas en el aire (IOTA)" #: src/logbook/lgbook.cxx:1181 msgid "Cont'" msgstr "Contestia" #: src/logbook/lgbook.cxx:1206 msgid "DXCC designator" msgstr "Identificador DXCC" #: src/logbook/lgbook.cxx:1222 src/logbook/lgbook.cxx:1239 #: src/logbook/lgbook.cxx:1251 src/logbook/lgbook.cxx:1263 #: src/logbook/lgbook.cxx:1275 msgid "Interesting notes" msgstr "Notas interesantes (80 caract. máx.)" #: src/logbook/lgbook.cxx:1236 #, fuzzy msgid "My Station" msgstr "Estación" #: src/logbook/lgbook.cxx:1274 #, fuzzy msgid "Station Locator" msgstr "Estación escuchada dos veces" #: src/logbook/lgbook.cxx:1290 msgid "Ser out" msgstr "Ser env" #: src/logbook/lgbook.cxx:1291 src/logbook/lgbook.cxx:1416 #, fuzzy msgid "Contest seral # sent" msgstr "#Serie enviado en concurso" #: src/logbook/lgbook.cxx:1302 #, fuzzy msgid "Exch Out" msgstr "Intercambio TX" #: src/logbook/lgbook.cxx:1303 src/logbook/lgbook.cxx:1440 msgid "Contest exchange sent" msgstr "Intercambio enviado en Concurso" #: src/logbook/lgbook.cxx:1314 msgid "Ser in" msgstr "Ser rec" #: src/logbook/lgbook.cxx:1315 msgid "Contest serial # received" msgstr "# Recibido como intercambio en concursos" #: src/logbook/lgbook.cxx:1326 #, fuzzy msgid "Exch In" msgstr "Intercambio RX" #: src/logbook/lgbook.cxx:1327 src/logbook/lgbook.cxx:1452 msgid "Contest exchange received" msgstr "Recibido el intercambio en concursos" #: src/logbook/lgbook.cxx:1339 #, fuzzy msgid "Field Day class received" msgstr "Acción de la rueda del ratón en la cascada" #: src/logbook/lgbook.cxx:1350 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1351 #, fuzzy msgid "Field Section received" msgstr "Acción de la rueda del ratón en la cascada" #: src/logbook/lgbook.cxx:1363 #, fuzzy msgid "Operators age received" msgstr "Nombre del operador" #: src/logbook/lgbook.cxx:1375 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1387 #, fuzzy msgid "Operating band" msgstr "Operador" #: src/logbook/lgbook.cxx:1399 #, fuzzy msgid "Check value received" msgstr "Recibido el intercambio en concursos" #: src/logbook/lgbook.cxx:1412 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1413 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1415 #, fuzzy msgid "Ser NoR" msgstr "Ser env" #: src/logbook/lgbook.cxx:1439 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1465 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1466 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1468 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1469 #, fuzzy msgid "Sent troop number" msgstr "Seleccionar línea" #: src/logbook/lgbook.cxx:1480 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1481 #, fuzzy msgid "Received troop number" msgstr "Número de serie recibido" #: src/logbook/lgbook.cxx:1492 #, fuzzy msgid "Name-S" msgstr "Nombre" #: src/logbook/lgbook.cxx:1493 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1504 #, fuzzy msgid "Name-R" msgstr "Nombre" #: src/logbook/lgbook.cxx:1505 #, fuzzy msgid "Received scout name" msgstr "Recibir" #: src/logbook/lgbook.cxx:1521 msgid "Call Search" msgstr "Buscar Indicativo" #: src/logbook/lgbook.cxx:1522 msgid "Search for this callsign" msgstr "Buscar este indicativo" #: src/logbook/lgbook.cxx:1534 msgid "Find previous" msgstr "Buscar el anterior" #: src/logbook/lgbook.cxx:1542 msgid "Find next" msgstr "Buscar el siguiente" #: src/logbook/lgbook.cxx:1549 #, fuzzy msgid "Retrieve" msgstr "Reintentos" #: src/logbook/lgbook.cxx:1550 msgid "Retrieve for active modem use" msgstr "Sintonizar el módem actual a estos datos (Frecuencia y Modo)" #: src/logbook/lgbook.cxx:1563 msgid "New record / Save record" msgstr "Registro nuevo / Actualizar" #: src/logbook/lgbook.cxx:1570 msgid "Update the current record" msgstr "Actualizar el registro actual" #: src/logbook/lgbook.cxx:1577 msgid "Delete the current record" msgstr "Eliminar el registro actual" #: src/logbook/lgbook.cxx:1583 #, fuzzy msgid "File:" msgstr "&Archivo" #: src/logbook/lgbook.cxx:1606 msgid "Date" msgstr "Fecha" #: src/logbook/lgbook.cxx:1608 msgid "Time" msgstr "Hora" #: src/logbook/lgbook.cxx:1625 msgid "Cabrillo Setup" msgstr "Configuraciones para Cabrillo" #: src/logbook/lgbook.cxx:1645 msgid "Select Cabrillo Contest & Fields" msgstr "Selecciona los campos de concurso para el registro Cabrillo" #: src/logbook/lgbook.cxx:1648 msgid "Contest:" msgstr "Concurso:" #: src/logbook/lgbook.cxx:1673 msgid "QSO Date" msgstr "Fecha QSO" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Control del radio por un\n" #~ "programa externo\n" #~ "usando XML-RPC" #~ msgid "Use XML-RPC program" #~ msgstr "Usar un programa XML-RPC" #~ msgid "Experimental" #~ msgstr "Experimental" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Inicializar el control por XML-RPC" #~ msgid "Mode/BW delay" #~ msgstr "Espera Modo/BW" #~ msgid "" #~ "Delay in seconds between \tLDT in iso-8601 format" #~ msgstr "\tLDT en formato iso-8601" #~ msgid "\tLocal datetime" #~ msgstr "\tfecha y hora en tiempo local" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT en formato iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tfecha y hora UTC" #~ msgid "Operator information" #~ msgstr "Información del operador" #~ msgid "User Interface - Browser" #~ msgstr "Interfaz de usuario - Navegador" #~ msgid "User Interface - General" #~ msgstr "Interfaz de usuario - General" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interfaz de usuario - Colores / Tipos de letra" #~ msgid "User Interface - Contest" #~ msgstr "Interfaz de usuario - Concurso" #~ msgid "User Interface - Macros" #~ msgstr "Interfaz de usuario - Macros" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interfaz de usuario - Controles de la cascada" #~ msgid "Rig Control using xml spec file" #~ msgstr "Control del radio usando un archivo xml" #~ msgid "Audio devices" #~ msgstr "Dispositivo de audio" #~ msgid "Callsign database" #~ msgstr "Base de datos de indicativos" #~ msgid "Program to Program Communications" #~ msgstr "Comunicación entre aplicaciones" #, fuzzy #~ msgid "Power Signal Monior" #~ msgstr "Tono pre-señal" #~ msgid "Callsign:" #~ msgstr "Indicativo:" #~ msgid "Name:" #~ msgstr "Nombre:" #~ msgid "QTH:" #~ msgstr "QTH:" #~ msgid "Transmit width" #~ msgstr "Ancho de la transmisión" #~ msgid "# of multiple scans / character line" #~ msgstr "# de múltiples exploraciones / lineas de caracteres" #~ msgid "Halve receive width" #~ msgstr "Ancho de Rx a la mitad" #~ msgid "Compress Rx in time" #~ msgstr "Comprimir Rx en el tiempo" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Tx ancho (oculto)" #~ msgid "Revert" #~ msgstr "Revertir" #~ msgid "Reset rigCAT interface" #~ msgstr "Restablecer la interfaz rigCAT" #~ msgid "Reset hamlib interface" #~ msgstr "Restablecer la interfaz Hamlib" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Usar PTT Memmap" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Seleccione el puerto serie" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-VIA" #~ msgid "Rig control and logging" #~ msgstr "Controles del radio y log" #~ msgid "Rig control and contest" #~ msgstr "Controles del radio y concursos" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "No se pudo comprobar si hay actualizaciones:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Visitar la URL" #~ msgid "Copy URL" #~ msgstr "Copiar la URL" #~ msgid "Controls" #~ msgstr "Controles" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #~ msgid "Monitor KISS Pwr Squelch" #~ msgstr "Monitor KPSQL" #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Archivo de libro de guardia vacío (ADIF) %s" #~ msgid "Error reading %s" #~ msgstr "Error leyendo %s" #~ msgid "Quick entry" #~ msgstr "Entrada rápida" #~ msgid "Exchanges" #~ msgstr "Intercambio" #~ msgid "Transmit all text in lower case" #~ msgstr "TX todo en minúsculas" #~ msgid "User Interface - Logging" #~ msgstr "Interfaz de usuario - Registro" #~ msgid "Client/Server Logbook" #~ msgstr "Logs remotos cliente/servidor" #~ msgid "Enter URL address of server" #~ msgstr "Entre la dirección URL del servidor" #~ msgid "Enter Port # assigned to server" #~ msgstr "Número de puerto asignado al servidor" #~ msgid "Prompt to save macro file when closing" #~ msgstr "Confirmar si graba archivo de macros al cerrar" #~ msgid "Navtex" #~ msgstr "Navtex" #~ msgid "Wefax" #~ msgstr "Wefax" #~ msgid "Mono audio output" #~ msgstr "Salida de audio monofónico" #~ msgid "Force output audio to single channel" #~ msgstr "Forzar la salida de audio por un solo canal" #~ msgid "End of header string:" #~ msgstr "Fin de la cabecera:" #~ msgid "" #~ "Text defining end of METAR header\n" #~ "Typically 'Connection: close'\n" #~ "Used to search for station name" #~ msgstr "" #~ "Texto que define el fin de cabecera METAR\n" #~ "Usualmente 'Connection: close'\n" #~ "Usado para detectar nombre de estación." #~ msgid "QRZ online via default Internet Browser" #~ msgstr "QRZ online vía navegador web" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "HamCall en línea vía navegador web" #~ msgid "HamQTH via default Internet Browser" #~ msgstr "Sitio HamQTH vía navegador web" #~ msgid "IP Address format: nnn.nnn.nnn.nnn" #~ msgstr "Formato de dirección IP: nnn.nnn.nnn.nnn" #~ msgid "XMLRPC" #~ msgstr "XMLRPC" #~ msgid "IP Address for KISS interface" #~ msgstr "Dirección IP para la interfaz KISS" #~ msgid "Continue After (sec)" #~ msgstr "Cont. después de (seg)" #~ msgid "Dual Port" #~ msgstr "Puerto dual" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "Dial" #~ msgstr "Sintonizar" #~ msgid "\tvideo text" #~ msgstr "\tvideo texto" #~ msgid "Raised cosine = Hanning" #~ msgstr "Coseno elevado = Hanning" #~ msgid "cty.dat pathname" #~ msgstr "Camino a cty.dat" #~ msgid "Really want to quit?" #~ msgstr "Realmente quieres terminar?" #~ msgid "No rig specified" #~ msgstr "No se ha especificado un radio" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Entre frecuencia o cambie con\n" #~ "Izq./Der../Arriba/Abajo/Pág_Arriba/Pág_Abajo" #~ msgid "Enter Xcvr Freq" #~ msgstr "Frec. del TRCV" #~ msgid "Memory Mapped Rig" #~ msgstr "Radio mapeado en memoria" #~ msgid "" #~ "Exit prompts active only when File/Exit menu item selected.\n" #~ "Not active if window decoration close button pressed." #~ msgstr "" #~ "Están activas solo cuando cierras usando el menú Archivo/Salir.\n" #~ "No se activan cuando das click en el botón de cerrar en la ventana." #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Activalo si no puedes usar el botón del centro del ratón" #~ msgid "Char set" #~ msgstr "Juego de Caracteres" #~ msgid "Frq Disp" #~ msgstr "Frecuencia" #~ msgid "Label text" #~ msgstr "Texto" #~ msgid "FFT latency (scan merging)" #~ msgstr "Latencia de FFT (mezcla de escaneo)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "La latencia incrementa la resolución de frecuencia,\n" #~ "disminuir a 1 para no mezclar" #, fuzzy #~ msgid "Pkt" #~ msgstr "Packet" #~ msgid "Packet" #~ msgstr "Packet" #~ msgid "Select packet baudrate" #~ msgstr "Seleccionar velocidad de packet" #~ msgid "RX Low Freq Gain" #~ msgstr "Gan. Rx en frec. bajas" #~ msgid "Processing gain to apply to lower tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos bajos (en dB)" #~ msgid "RX High Freq Gain" #~ msgstr "Gan. Rx en frec. altas" #~ msgid "Processing gain to apply to higher tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos altos (en dB)" #~ msgid "TX Low Freq Gain" #~ msgstr "Gan. Tx en frec. bajas" #~ msgid "TX High Freq Gain" #~ msgstr "Gan. Tx en frec. altas" #~ msgid "add RX timestamps" #~ msgstr "añadir marcas de tiempo en RX" #~ msgid "decode Compressed data" #~ msgstr "decodificar datos comprimidos" #~ msgid "Decode received Compressed Position data" #~ msgstr "Decodificar datos comprimidos de posición" #~ msgid "decode Mic-E data" #~ msgstr "decodificar datos Mic-E" #~ msgid "Decode received Mic-E data" #~ msgstr "Decodificar datos recibidos Mic-E" #~ msgid "decode PHG data" #~ msgstr "decodificar datos PHG" #~ msgid "Decode received PHG data" #~ msgstr "Decodificar datos PHG recibidos" #~ msgid "use SI units" #~ msgstr "usar unidades del SIU" #~ msgid "Display decoded data values in SI units" #~ msgstr "Mostrar datos decodificados en unidades del SIU (m, Km)" #~ msgid "use English units" #~ msgstr "usar unidades Inglesas" #~ msgid "Display decoded data in English units" #~ msgstr "Mostrar datos decodificados en unidades Inglesas (pies, millas)" #~ msgid "Use cross-hair scope" #~ msgstr "Usar osciloscopio de hilos cruzados" #~ msgid "Defaults to syncscope instead of phase (cross-hair) scope" #~ msgstr "" #~ "Por defecto muestra la sincronía en vez de los hilos cruzados en el " #~ "osciloscopio" #~ msgid "boost Audio input" #~ msgstr "Amplificar entrada de audio" #~ msgid "add additional gain to audio input for low-output interfaces" #~ msgstr "Añadir ganancia adicional a la entrada de audio" #~ msgid "Select the rig by name" #~ msgstr "Seleccione el radio por su nombre" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forzar el lateral del radio. Entra en efecto\n" #~ "cuando el radio cambia de modo." #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Control vía software mapeado\n" #~ "en memoria con variables\n" #~ "compartidas: Kachina" #~ msgid "Use Memmap" #~ msgstr "Usar Memmap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Radio mapeado via memoria (Kachina)" #~ msgid "Initialize Memmap interface" #~ msgstr "Inicializar interface Memmap" #~ msgid "Mixer" #~ msgstr "Mezclador" #~ msgid "OSS Mixer" #~ msgstr "Mezclador OSS" #~ msgid "Manage mixer" #~ msgstr "Manejar el mezclador" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Añadir controles del mezclador a la interface principal" #~ msgid "Select Mixer device" #~ msgstr "Seleccionar dispositivo de mezcla" #~ msgid "Mic In" #~ msgstr "Mic In" #~ msgid "Use microphone input" #~ msgstr "Usar entrada de micrófono" #~ msgid "Line In" #~ msgstr "Line In" #~ msgid "Use Line-In device" #~ msgstr "Usar dispositivo Line-in" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Establecer el volumen PCM de la tarjeta" #~ msgid "Rx fax max rows" #~ msgstr "Rx fax max. cols." #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "" #~ "Entre camino y nombre hasta el ejecutable\n" #~ "o simplemente el nombre del ejecutable" #~ msgid "Enable to reduce CPU load" #~ msgstr "Activar para reducir carga al CPU" #~ msgid "Number of errors allowed in RsID comparison" #~ msgstr "Cantidad de errores permitidos en identificación de RSID" #~ msgid "Save image as:" #~ msgstr "Guardar imagen como..." #~ msgid "Sensitivity" #~ msgstr "Sensibilidad" #~ msgid "" #~ "2 = normal sensitivity / decreased false detection\n" #~ "5 = high sensitivity / increased false detection" #~ msgstr "" #~ "2 = normal sensibilidad / disminuye la detección de falsos\n" #~ "5 = alta sensibilidad / incrementa la detección de falsos" #~ msgid "Navtex stations file:" #~ msgstr "Fichero de log de Navtex:" #~ msgid "Colors and Fonts" #~ msgstr "Colores y tipografía" #~ msgid "Disp" #~ msgstr "Radio" #~ msgid "64-bit (long) interleave" #~ msgstr "Intervalo largo de 64Bits" #~ msgid "Transmit /Receive" #~ msgstr "Transmitir/Recibir" #~ msgid "Filter Quality" #~ msgstr "Calidad del Filtro" #~ msgid "" #~ "Low -> High\n" #~ "DSP filter length\n" #~ "Low reduces load on CPU\n" #~ "High gives best performance" #~ msgstr "" #~ "Low -> High\n" #~ "Longitud del filtro DSP\n" #~ "Low (Bajo) reduce la carga de CPU\n" #~ "High (alto) obtiene mejor desempeño" #~ msgid "Optimum" #~ msgstr "Optimo" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Ancho de banda del filtro de Rx" #~ msgid "Demodulator" #~ msgstr "Demodulador" #~ msgid "" #~ "Select demodulator type\n" #~ "Kahn power detector\n" #~ "Automatic Threshold Correcting" #~ msgstr "" #~ "Selecciona el tipo de demodulador\n" #~ "Detector de potencia de Kahn\n" #~ "Corrección automática de umbral" #~ msgid "" #~ "Enabled - use Kahn power demodulator\n" #~ "Disabled - use ATC demodulator" #~ msgstr "" #~ "Activado - usar demodulador Kahn\n" #~ "Desactivado - usar demodulador ATC" #~ msgid "Set page width" #~ msgstr "Establecer el ancho de la página" #~ msgid "after:" #~ msgstr "después:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (oculto)" #~ msgid "Use UTF-8" #~ msgstr "Usar UTF-8" #~ msgid "Notifications only" #~ msgstr "Solo notificaciones" #~ msgid "Displays" #~ msgstr "Interfaz" #~ msgid "Tx Power" #~ msgstr "Potencia" #~ msgid "Ser# in" #~ msgstr "Ser rec." #~ msgid "QSO Freq" #~ msgstr "Frec QSO" #~ msgid "Cnty" #~ msgstr "País" #~ msgid "#Out" #~ msgstr "#Env." #~ msgid "#In" #~ msgstr "#Recv." #~ msgid "Xchg" #~ msgstr "Xchg" #~ msgid "File exists. Are you sure you want to overwrite?" #~ msgstr "El fichero existe. Estas seguro que lo quieres sobre escribir?" #, fuzzy #~ msgid "2" #~ msgstr "2" #~ msgid "Cntst'" #~ msgstr "Contestia" #, fuzzy #~ msgid "Matched Filter in use" #~ msgstr "Modo en uso" #~ msgid "MT63" #~ msgstr "MT63" #~ msgid "Display true frequency in the waterfall" #~ msgstr "Mostrar la frecuencia real en la cascada" #~ msgid "" #~ "Enable to show the true transmit frequency on the waterfall when the " #~ "radio is in CW (A1A) mode" #~ msgstr "" #~ "Habilitar para mostrar la frecuencia real de transmisión en la cascada " #~ "cuando el radio está en CW (A1A)" #~ msgid "On Date" #~ msgstr "Fecha inicio" #~ msgid "Off Date" #~ msgstr "Fecha Fin" #~ msgid "Save log before exiting?" #~ msgstr "Salvar libro de contactos antes de salir?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Salvar macros modificadas antes de salir?" #~ msgid "View log" #~ msgstr "Ver log" #~ msgid "A message was logged" #~ msgstr "Un mensaje se añadió al log" #~ msgid "Cursor color" #~ msgstr "Color del cursor" #~ msgid "Cursor center line" #~ msgstr "Linea central del cursor" #~ msgid "Bandwidth tracks" #~ msgstr "Pistas de ancho" #~ msgid "Tracks color" #~ msgstr "Color de las pistas" #~ msgid "Wide tracks" #~ msgstr "Pistas anchas" #~ msgid "Wide center line" #~ msgstr "Linea central ancha" #~ msgid "Wide cursor" #~ msgstr "Cursor ancho" #~ msgid "FH" #~ msgstr "FH" #~ msgid "DomEX" #~ msgstr "DomEX" #~ msgid "eQSL upload when record logged" #~ msgstr "Subir a eQSL cuando se graba el contacto" #~ msgid "Default message sent with eQSL" #~ msgstr "Mensaje por defecto para eQSL" fldigi-4.1.06/po/it.gmo0000664000175000017500000017324713515625025011543 00000000000000Þ•“´ÇL9hLiLnLƒL*žLÉLÞL åLðLöLüLM M M M M *M7MQMSM!XMzMM„M‰M›MµMËMâM÷MN&)NPNdN"{NžN¼N&ÁNèNOO#O)O.ODO"XO{O O °OÑO çOóOPP(P7PFP!XPzP—P´P!ÏPñP"Q$QCQ\Q lQ'yQ¡Q½QÂQâQ(R)R HRiR |R'ŠR²R·RÌRâRöR S SS*S :SDSWS \ShSnSƒS¡S¨S$¬SÑSéSTT&T ET PT[T,yT¦T#¯TÓTæTùTÿTDU VUaUqU*„U¯U/ÃU2óU&VDVMViV,…V²VÇV)ÏV)ùV)#W1MWW„W •W ŸW ©W´WÅWÙWâWõWýW X(X/X 7XBXVX)ZX„XŒXX™X X¥X ¨X´XÄX ÜXæXöX Y"Y 1Y=Y BYNY_Y8hY¡Y¨Y°YÍY ÜY#ýY+!ZMZVZ mZ{Z&”Z»ZÛZ õZ [#[(4[][r[+‰[ µ[Ã[7Ò[ \ \\4\WI\¡\¹\Ð\ Ö\0à\ ]3]Q] c]q] w]‚]ˆ]˜]«]À]Ô] Ü]*ê]^^7^M^g^ p^z^^«^ Ê^Ô^ Ù^å^;ý^9_O_W_q_ˆ_ ˜_¥_ ¸_Â_Æ_ Î_Ø_á_ø_` ` ` +`7`I`N`]`n`‚`ˆ``ª` Æ`Ò`#ï`a/aOaXa_a§ha¤bµbËbÓb,Ûb ccc c/+c:[c–cžcºc ×c äcïc1d 8dBd ]d hd sdd†d¦dÀdÜd ûd9e%@efe2ƒe¶e+Ìeøe"f-#fQflfrf xf ‚f Žf›fµf ºfÇfÛfîf g:gSgYg]g lgzg ˜g3¦gÚgágòg) h 4h >h Lh Vh chqhxhˆh™h®h$Ãhèhûh ii i"i*ib0i!“i/µi#åi j*j/j 5j?jPj`jej,mjšj¢jªj ²j¾jÅj ájîjój k%k+k.k2k7k@kEkWkZkmkŒk‘k¦k»kÒk ékôkl ,l!MlolŒl9 lÚlîl,ýl *m68m om {mœm¼mÏmãmçm*ðmIn9enŸn.¾n0ínÏoîo p2-p$`p…pˆpp p:°pëpóp ÷pqq$q~˜½˜ Ó˜ á˜ì˜ò˜ù˜þ˜™ ™ ™ ™'™7™P™R™!W™y™~™ƒ™$ˆ™!­™)Ï™ù™š3š"Rš3uš©šÁš Üš)ýš'›',›T›s›…›—››5¢› Ø›"ù›œ$7œ'\œ„œ œœ¨œÜÚœïœ!4Vs ­Î&ë'ž:žSž pž'|ž!¤žÆž$Ëž"ðž(Ÿ<Ÿ'ZŸ‚Ÿ–Ÿ'¥ŸÍŸÒŸéŸ  * .  @ N  _ m ‹   ž ¦ ) ì ó 8ü !5¡"W¡z¡“¡2™¡ Ì¡ ס â¡.¢2¢(;¢d¢€¢¢£¢Oâ ££.£.K£z£=•£KÓ£¤:¤!C¤.e¤E”¤Ú¤ô¤2û¤2.¥2a¥=”¥Ò¥Ø¥ñ¥ ¦ ¦¦(0¦ Y¦g¦ y¦+„¦°¦ЦÙ¦â¦é¦§8 §E§M§Q§Z§a§f§ i§t§ާ ª§"´§×§ ö§¨ ¨ #¨.¨?¨ T¨9_¨™¨¡¨"©¨̨)â¨% ©;2©n©w©©%«©=Ñ©2ªBªaª €ªŽª/¤ªÔªñª<«L«a«?s«³«ëÓ«ç«b¬#d¬ˆ¬¨¬®¬:½¬ø¬A ­M­g­…­Œ­œ­£­·­È­ã­ÿ­®0®M®U®o®#…®©® ²®½®+Ò®(þ® '¯3¯ 9¯D¯J`¯«¯ů˯ê¯ °°:°W°`°g° o°y°‚°—°¬°±° ° ϰܰñ°ö° ±"±9± ?±(K±*t±Ÿ±-»±/é±²05² f²r² {²È‡²ÄP³´ 2´ >´=J´ˆ´›´¡´ª´>»´=ú´8µ+Hµ#tµ˜µ ²µ!¾µ8൶$(¶ M¶W¶m¶}¶&…¶!¬¶'ζ$ö¶ ·E)·>o·"®·7Ñ·$ ¸+.¸ Z¸&d¸@‹¸$̸ñ¸ø¸ ÿ¸ ¹ ¹*¹F¹K¹g¹¹)–¹ À¹?˹ ººº &º$0ºUºCfºªº±º(ƺAïº 1»<»L»]»p»»ˆ»™»µ»λ!㻼¼/¼ 8¼B¼ W¼ d¼}o¼%í¼>½6R½ ‰½ª½¯½ µ½¿½нã½é½7ò½*¾3¾<¾ E¾Q¾(X¾ ¾޾—¾#¶¾Ú¾à¾ã¾æ¾ë¾ô¾ù¾ ¿¿$$¿ I¿V¿l¿‚¿›¿ ´¿ À¿ á¿&À")À$LÀ&qÀJ˜ÀãÀÿÀ.Á@ÁGQÁ™Á-©Á#×ÁûÁÂ( ,Â*7ÂDbÂN§Â3öÂ3*Ã2^Ãù‘Ã*‹Ä$¶Ä/ÛÄ( Å4Å;ÅBÅ[ÅEpÅ ¶ÅÀÅ ÄÅÐÅìÅ#ôÅÆ3ÆCÆGÆgÆ xÆ#„ƨÆ,¹ÆæÆìÆÇÇÇ9Ç JÇTÇeÇ}Ç‚Ç ‡Ç“Ç%«ÇÑÇ×ÇéÇ ïÇÈ+È7BÈ8zȳÈ"ÏÈ#òÈÉ1É'KÉsÉ"yÉ œÉ-ªÉØÉñÉöÉüÉÿÉÊ2Ê:ÊUÊ ZÊ*dÊ&ʶÊ2¹ÊEìÊ-2Ëc`Ë@ÄËÌ ÌÌ*Ì3Ì ;Ì&IÌpÌ̫̕ÌÂÌ ÞÌëÌ8ýÌ6ÍEÍ9MÍ ‡Í‘ͥ͹Í2ÎÍÎÎ Î Î Î$(Î+MÎyΠΚΠ¢ÎÃÎÌÎÔÎ/ãÎCÏ WÏdÏ Ï!ÏW¯ÏÐ ÐÐ2Ð5ÐLÐ%jÐ1Ð"ÂÐåÐ îÐ"øÐ"Ñ>ÑFÑ YÑdÑhÑpÑtÑѠѰѿÑÎÑÖÑÞÑ çÑõÑ Ò2ÒDÒHÒLÒ PÒ[Ò_ÒcÒrÒ{Ò„Ò‹Ò “ÒÒ¦Ò»ÒÐÒìÒ ñÒüÒ*Ó}.Ó¬Ó3¼ÓUðÓFÔ-cÔ‘Ô*˜ÔÃÔÒÔ#ïÔÕ)Õ .Õ;ÕPÕeÕ-mÕ"›ÕO¾ÕÖ¨Ö¾ÖÖÖ íÖ÷Ö××%×76×n×t×#Š× ®×2¹×-ì×.ØIØhØoØ#vØ šØ §Ø³ØÇØÙØ âØ ìØ÷ØÙÙÙÙ%Ù@ÙFÙOÙ¬dÙ ÚÚ<ÚYÚnÚ …Ú“Ú¤Ú¹ÚÂÚ ÈÚÔÚíÚÛÛ+Û 3Û(=Û$fÛ‹Û$›ÛÀÛßÛ6ÿÛ6Ü-VÜ'„ܬÜIÅÜ&Ý6ÝRÝ0gÝ"˜ÝN»Ý- Þ18Þ<jÞ.§ÞÖÞóÞßß8%ß3^ß,’ß&¿ßæß÷ß àà07à'hàDà Õàâàááá=á8Qá ŠáD˜á$Ýáââ/âNâgâ„â)˜âÂâÒâéâüâ$ã5ã Eã5Qã9‡ã:ÁãCüã@ä\äc|ä àäíäþäå åå*å2åBåUåXåaåtåzå“å®å Èå Ôå3âå%æ<æPæbæjæ næyæ €æ Šæ”æ-›æÉæØæÜæãæûæ-ç<ç DçRçlç5rç¨çDZç.yè5¨è2Þè)éG;éIƒé7Íéê ê êê!ê (ê 4êAêUêdê€ê “ê¡ê±êÇêåêíêëë-ë2ë Rë&_ë †ë‘ë¦ë¾ë Îëïëì#ì>ì\ìnìŽì¤ì;µì ñìýìí+í Hí Rí"]í€í…íí”í"›í¾íÆíÏí"àí"î&îEî*cîŽî–î ³î¾î3Öî ï#ï:ï Bï2Mï€ï–ïA°ïòïð%$ðJð`ðtð‡ðŽð ¡ð­ð µð Ãðäðêð:ñ <ñJñeñññ ©ñ ´ñ ÀñÌñãñëñ)ò/ò 6ò@ò`òtòŒò5«ò áòó0 ó<ó[ó%vóœó ³ó¾óÐóÖóïó ô)ôG:ôC‚ô Æôçôõ õNõaõiõyõ*€õ«õ*ÅõMðõ>öBöIöRö[ö*cöŽöç(ny‹‹¿‘¦_\3Þž|ÔðÓvúV&†‡j„3ñœGê|Ø(y áå @¹Apàz =FŒwÚLA–dU»©Õ·%2V›uTGã[C “÷'ã€ÝO%'²\À Rf‰³›Ú7â48sW¤Ì„} ‚N¾æXÑ;îŒ+h*•7B,]m÷’ÄòÑ^ùOWÒˆo˜™ÐTÌO)l£Ø,Âõ6.èx…";à1±|§ÓXvÎýå ª·iÔ¦†ôò´òQi¨!OZ²ndA+([%‡úÏþâ×CkT£mÅFKºËQ¢‘-ŽÅ ¡¿z /ɵÖwî9 ÄMqŠ€8¡Öø¢TèeS0oÓ$QyÛº/Q¼¶H~Ftf3Ÿ/‘M¶÷š5ìRJ_a>öÌÏC}4ó³ä&7pG-ž±o ®Š¥<§IÈJûŸd×ÂÏ]Ú¸,p$¾HÞ5A~ Pé¬D?¥-Wl@‘Œ=‹bhšj:Wh¿l?ÉN—Ã=x¡\*>PÀ`¯ôù`í5gÈ^Õ׃¦ü…{€Ò8 {‰œÝEÎÙ˜¹1Êk>fødec²8å^gK]ruÁ>)( ÿënÙöˆ±z#ó_xþ½_íöfØ•­Áºí‡YMˆ?é*0ÊÆ2¶߬*ÃŽPUæµU\Zv®b’YeÜ&N%t™$qEu„c½Ÿnð=B ¬w†6@¼z<u 4ªæHB¯20U{S·‡go—3³ÈüIJ ñ»ˆ#V”<GDr4‰õ]­sk‚ƒïª…^îä¢`—j¼Ž+Z-Vþ@ƒyß)tÛ»ÆYÇc+'Ù§lasÔ7m;rq{9[Ö“€Îi ɰø’gËÑâãÞ.C}E#çͽ¤Ð/2[ýKé,Y`Á|Mq •Å9 “ý1£“°vsçñë'~k9mš¤S R"À!©}H:úÄä¹0 jÜõBžSùa r~ïb†ŠŠN)ìô6ßL?”.KÍ…ÿX‚ ’X$Œ«ð–Ë›ê˜i<„üûá5áIPLDÇE6Ê©cÆÇ‹èR:!w¾ÜZÒÐ&1­ ìI¸‚®FÕ!¨ÿ œ¥# ´p"«x.hûÛbLàêŽë¯Ù;ï"‰JD¸:ó«°¨tµÝ̓”´ea– in # Records in logbook# retries before giving up# times to resend command before giving up%s log started on %s&About&Configure&File&Help&Logbook&OK&UI&View0 = T; 9 = N14070.150500 Hz limit8-bit extended characters: AFC on,off,toggle other call clear log fields clear RX pane contest counter CW identifier decrement counter insert text file valid xcvr filter width my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot idle signal for NN.nn sec increment counter S/N etc. IMD etc. log at xmt time other locator LOCK on,off,toggle save QSO data change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name CW QSK post-timing CW QSK pre-timing QSO time (HHMM)) qsy to kHz, Hz other QTH repeat macro continuously valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save contest out search DOWN for signal search UP for signal Digitalk On, Off, Toggle repeat every NN sec tune signal for NN sec toggle T/R transmit Tx RSID on,off,toggle Fldigi version exchange begin exchange end exchange outAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQ controlAbortAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd CRLF after page width charactersAdjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:AudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto connect when fldigi opens (server must be up)Auto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAvailable substringsBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBandBands must matchBandwidthBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowserBug me about saving log entriesBuild infoButtonButtonsC&ountriesCAT command for PTTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW dsp filter bandwidthCW is LSBCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall SearchCall sign workedCallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCenter display on signalCenter in passband Right click to undoChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyChecking for updates...City of station workedClearClear AllClear channel text after # seconds of inactivityClear list?Clear log entries after saving or using macro Clear log fields?Clear on saveCloseClose ListColorColors && FontsColors and cursorsCommand line optionsCommands are echoedConfirmConfirm RESETConnect/disconnect to Talker socket serverContestContest exchange receivedContest exchange sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCreate cabrillo reportCreate sunspotsCustom shiftCustom text searchCustom...CutDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioDateDate QSO EndedDate QSO startedDate time ON == OFFDebugDefaultDefault CW tracking pointDefault RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault test string is: "Default to cross hair digiscopeDefaultsDeleteDeselectDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDevice:DevicesDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDisable allDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisplayDisplay RX in reverse videoDo not use callsign databaseDocked scopeDon't saveDot to dot-space ratioDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge shapeEdge timingEnableEnable / disable icons on menusEnable / disable tooltipsEnable DSP prior to decoderEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for very weak signalsEnable if you're computer does not decode properlyEnable rx text streamEnable this for Latin-1 accented charactersEnabledEnter full path-filename for flmsgEnter test string or leave blank for default:Enter time span in minutesErrorEventEvent logExchange InExchange OutExecutable file to insertExitExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programF-WPMFECFFT ProcessingFFT averagingFFT prefilter window functionFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: Fixed IntervalsFldigi config...Fldigi configurationFldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font:Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree Lossless Audio Codec *.flacFreqFreq.FrequencyFrequency in MHzFrequency scaleFullGeneralGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlibHamlib used for rig controlHardware PTTHideHide window after (s):High frequency limit in HzHost:IDIDsIOTAITU zoneITUZIgnore duplicatesInInactivity timeoutInclude the transmit frequencyInfoInitial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Islands on the airK3 A1A configuationLOCLast QSOLeading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Listen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocate flmsgLocate flmsg executableLocatorLock transmit frequencyLog all RX/TX textLog sourcesLogbookLong receive integrationLook up callLotW userLow frequency limit in HzLower limitLowest freq on bottom of viewerMT-63Macro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMerge ADIF fileMerge...Minimal controlsMinimum time between eventsMiscModeMode in useMode must matchMode width limitModemModem carrierModemsMonitor transmitted signalMouseMouse wheel active on macro buttonsMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Msec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameNewNoNo faster than thisNo slower than thisNoneNot worked beforeNotesNotificationsNumber and position of macro barsNumber of digits in serial numberOKON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOn/OffOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator workedOperators QTHOperators nameOptional configuration in format: param=val ...OtherOutPSKPSK ReporterPSK et al.PTT is a CAT command (not hardware)PTT tone on right audio channel PTT via Hamlib commandPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlay back history when active channel selectedPlaybackPlayback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPort:PortAudioPost-keydown timing (ms)PrPre-Signal TonePre-keydown timing (ms)Press return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercasePrompt to save logProsignsProvinceProvince of station workedPseudo-FSK on right audio channelPskmailPulse shapePulseAudioQRZQRZ.comQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL sent dateQSL sent on this dateQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO loggingQSO must not occur within a time period ofQSYQTHQthQuietRE:RPCRSID receptionRST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine pulse shape factorRange +/- wpmReading fonts...Really delete record for "%s"?ReceiveReceive filter bandwidthReceive modesReceive synchronizerRecent activity for gridReception reports...RecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)RemoveReplay trackline audioReport ARQ frames average S/NReport rig frequency (enable only if you have rig control!)ResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore defaultsRetriesRetry interval (ms)RevReverseReverse videoRevert to Unsifted char's on a spaceRigRig controlRig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRst receivedRst sentRun programRun program:Rx TextRx bkgndRx fontS/N and IMD behaviorSELSKIPSQL-1SQL-2Sample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed macros?Save logbook fileSave macro fileSave paletteSave text asSave this paletteSave...ScopeScrollScroll hintsSearch for this callsignSearch range (Hz)Secondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Records to ExportSelect TX raster fontSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect modes for menu accessSelect number of tonesSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent chars in Rx/Tx paneSerial # inSerial # outServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSettingsShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:Signal BrowserSignal browserSignal levelSignal range (dB)Signal searchSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow CPU (less than 700MHz)Sort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStarting numberStateState must matchStation heard twiceStations grid squareStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!Sweet SpotSys ColorsSystemT/RTX PowerTX WPMTX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTalkerTalker Socket (MS only)Test charTest character for QSK adjustmentTest...Text CaptureText file to insertText i/oText to send during keyboard idle timesText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimingTiming and QSKTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTracked CW speed in WPMTrackingTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):TuneTune margin (tone frequency spacing)Tx bkgndTx fontTx power used for logbook entriesTxIDUIUI languageUI schemeUS state of station workedUndoUpdateUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse uHRouter PTTUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVideo ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWeight (%)Weight decreases with increasing edge timingWheel actionWhen no signal presentWill occur after this time in secondsWord delimitersWord wrapWrite delay (ms)XMITXMT lockXON/XOFF flow controlYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaftereQSL userenable mouse wheel control of macro barflmsg *flmsg.exe *.exeflmsg:free form 1 must matchfree form exchangeh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:minutesreportreportssecondsselect browser fontwaterfall-only modeProject-Id-Version: fldigi 3.22.01 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2011-12-03 13:04+0100 Last-Translator: Pierfrancesco Caci Language-Team: Italian Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); in Numero di record nel lognumero di tentativi prima di rinunciarenumero di volte che il comando è ripetuto prima di rinunciare%s log iniziato il %sInform&azioni&Configura&File&Aiuto&Log&OKAspetto&Vedi0 = T; 9 = N14070.150Limite a 500 HzCaratteri estesi a 8 bit: AFC on,off,toggle nominativo del corrispondente cancella i campi del log cancella la finestra di ricezione contatore per contest identificazione in CW decrementa il contatore inserisci un file di testo imposta un filtro valido sulla radio la mia frequenza dal testo a NOME/QTH vai alla freq NNNN ritorna alla frequenza preferita segnale idle per NN.nn sec incrementa il contatore\tS/N ecc.\tIMD ecc. metti a log quando questa macro viene trasmessa locator del corrispondente LOCK on,off,toggle salva i dati del QSO cambia il file delle macro mappa con parametri mappa su Google modo il mio nominativo il mio locator il mio nome il mio QTH il mio RST nome del corrispondente CW QSK post-timing CW QSK pre-timing ora del QSO (HHMM) qsy a kHz, Hz QTH del corrispondente ripeti la macro continuamente cambia modo radio valido CW rise time RST del corrispondente ricevi Rx RSID on,off,toggle salva rapporto contest cerca un segnale a scendere cerca un segnale a salire Digitalk On, Off, Toggle ripeti ogni NN sec segnale di accordo per NN sec scambia T/R trasmetti Tx RSID on,off,toggle\tVersione Fldigi inizio rapporto fine rapporto rapporto datoAFCComportamento AFCArea AFC (Hz)Area AFC o bandaVelocità AFCVelocità di tracciamento AFCALTRControllo ARQAnnullaS/N (dB) per l'acquisizioneRaggio di ricerca per l'acquisizione (Hz)AzioneAggiungiAggiungi CRLF quando raggiungi la larghezza della paginaAggiusta la frequenza del cursoreAggiusta la larghezza di banda DSPConfigurazione avanzata:TuttoColore alternativo dei caratteri nella finestra RxSempre LSBSempre USBMostra sempre le frequenze audioAvvia sempre i nuovi modem su queste frequenzeAntenna:Aspetto dell'etichetta di ciascun canaleAggiungi al testo ricevuto:Aggiungi al testo trasmesso:AudioInformazioni sulla scheda audioLe informazioni sul device audio sono disponibili solo per il backend PortAudioFile audioFrequenza audioDispositivo audio d'ingressoFrequenze audio o RF sulla scala del waterfallDispositivo audio d'uscitaIl buffer audio viene decodificato per il segnale selezionatoConnetti automaticamente all'avvio di fldigi (il server deve essere attivo)Paese e Azimuth automaticiAutoCRLFControllo Automatico di FrequenzaInseguimento automatico velocita' in ricezioneInvia automaticamente lo spot per i nominativi nel testo decodificatoSottostringhe disponibiliSfondoColore di sfondo per i tasti funzione del gruppo 1Colore di sfondo per i tasti funzione del gruppo 2Colore di sfondo per i tasti funzione del gruppo 3Colore di sfondo del controllo squelch del navigatore segnaliBandaLe banda deve coincidereLarghezza di bandaBaud rateBaud rate:Guida per principiantiComportamento degli indicatori s/n e imdColore SfondoBit per carattereNavigatoreAnnoiami con la richiesta di salvare il logInformazioni sulla compilazionePulsantePulsanti&PaesiUsa CAT per controllare il PTTCPUL'utilizzo della CPU aumenta con l'altezza del waterfallZona CQCQZCR-CR-LFCSV...CTRLCWModi ID CWID CW a fine trasmissioneLarghezza del filtro dsp CWCW è LSBVelocitá di trasmissione CW (WPM)Rilevazione e soppressione CWISoglia CWIImpostazione CabrilloCabrillo...NominativoCerca NominativoNominativo collegatoNominativoPuó essere usato al posto o insieme ad altri tipi di PTTAnnullaCatturaPeriferiche di cattura e di uscitaPeriferica di catturaCattura il testo ricevuto su file esternoCattura i segnali oltre questa sogliaCattura i segnali all'interno di questo raggio di frequenzaCattura:Frequenza portante (Hz)Scostamento della portanteCentra la visualizzazione sul segnaleCentra nella banda passante Tasto destro per tornare indietroCambia il numero di canali nel visualizzatore psk.Cambiare SOLO per sperimentareCambia l'aspetto del programmaCambia coloreCambia livello di logCambia l'ordinamento da alto a basso dei canaliModifica al file delle macroCambia la scala del waterfallLe modifiche avranno effetto al prossimo avvio del programmaEtichetta del canaleNumero del canaleCanali, il primo canale parte al limite inferiore del waterfallCaratteri/Riga:Seleziona tuttoControlla duplicatiVerifica aggiornamenti...Scegli questo per essere notificato quando un RSID viene ricevuto senza cambiare modem o frequenzaControllo aggiornamenti in corso...Cittá della stazione collegataCanc.Cancella tuttoCancella il testo del canale dopo # secondi di inattivitàCancella la lista?Cancella i campi del log dopo aver salvato o usato la macro Cancella i campi del log?Cancella i campi quando salviChiudiChiudi la listaColoreColori && CaratteriColori e cursoriOpzioni da riga di comandoI comandi sono visualizzatiConfermaConfermare il RESETConnetti/disconnetti il socket del server TalkerContestRapporto contest ricevutoRapporto contest datoNumero seriale del contest ricevutoContest:ContinenteScorrimento continuoCaratteri di controllo nelle finestre Rx/TxConverti il campo nominativo a maiuscoleConversioneCopiaCorrezioneNon posso aprire l'url: %s Non ho potuto lanciare un browser web: %s Apri questo URL manualmente: %sImpossibile avviare flmsgPaesePaese della stazione collegataCrea il log in formato cabrilloCrea macchie solariScostamento personalizzatoRicerca testo personalizzatoAltro...TagliaDTR +12DTR +12 vDTR = +VDTR controlla il PTTDTR controlla il PTTDXCCDesignatore DXCCEntità DXCCEntità DXCCRapporto linea/puntoDataData di fine del QSOData di inizio del QSOData di inizio == fineDebugPredefinitoFrequenza preferita per la decodifica CWFrequenza preferita per la decodifica RTTYVelocitá predefinita (WPM)Frequenza preferita per tutti gli altri modemFrequenza predefinita di ascolto / trasmissioneDefault test string is: "Imposta l'oscilloscopio a croce come predefinitoPredefinitiCancellaDeselezionaRileva la presenza di [WRAP:beg] e [WRAP:end]. Salve le etichette e tutto il testo da esse racchiuso in un file marcato con data e ora, per es.: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapRileva la presenza di [WRAP:beg] e [WRAP:end]. Salve le etichette e tutto il testo da esse racchiuso in un file marcato con data e ora, per es.: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapLivello del segnale ricevutoPeriferica:DispositiviDifferenza tra la frequenza Rx e Tx (scostamento della radio)Colore delle cifreCifreScurisciDisabilita tuttoDisabilita ulteriori decodifiche quando viene ricevuto un RSIDDisabilita su CPU molto lente o se il navigatore non è usatoVisualizzazioneMostra il testo ricevuto a colori invertitiNon usare un database di nominativiOscilloscopio incorporatoNon salvareRapporto tra punto e punto-spazioTrascinare sulla scala del waterfall cambia la frequenzaColore duplic.Controllo duplicati, nominativo piúDuplicatiForma d'onda al bordoTempo di salitaAbilitaAbilita / disabilita le icone dei menuAbilita / disabilita suggerimentiAbilita il DSP prima del decodificatoreAbilita FEC compatibile con MultiPSKAbilita tuttoAbilita le selezioni per mostrare i rispettivi controlli di operatoreAbilita il trascinamento del cursore sulla scala del waterfallAbilitare per segnali molto deboliAbilita se il tuo computer non decodifica correttamenteAbilita il flusso del testo ricevutoAbilitare per i caratteri accentati Latin-1AbilitatoInserisci il percorso completo a flmsgImposta la frase di prova o lascia in bianco per il predefinito:Inserisci l'arco temporale in minutiErroriEventoLog eventiRapporto ricevutoRapporto datoFile eseguibile da inserireEsciConfigurazione per l'exportEsporta in formato ADIFEsporta in formato CSVEsporta in formato di testo a campi fissiEsporta...Estrai i file per l'uso con il programma esterno "wrap / flmsg"F-WPMFECElaborazione FFTMedia FFTFunzione di prefiltro a finestra FFTSolo I/O su fileRiempi i campi Paese / Azimuth con le informazioni dal file cty.datFiltroLarghezza del filtroFattore di larghezza di banda del filtroLarghezza di banda del filtro relativa alla larghezza del segnaleFiltraggioTrova il paese:Trova successivoTrova il prefisso:Trova precedenteTrova:Intervalli fissiConfigurazioni di Fldigi...Configurazione di FldigiPalette Fldigi *.palFile di definizione rig xml *.xmlSito web Fldigi...Finestra oscilloscopioCartelleCaratteriColori dei caratteriCaratteri...Caratteri:Forza una velocitá di campionamento specifica. Scegli "Nativo" se "Auto" non funziona correttamente con la tua scheda audio.Forza il campo nominativo a MAIUSCOLEForza la spaziatura dei canali a incrementi regolari di 100 HzForza data e ora di inizio QSO uguali a quelle di fineFree Lossless Audio Codec *.flacFreqFreq.FrequenzaFrequenza in MHzScala di frequenzaTuttoGeneraleGenera un segnale a onda quadra sul canale audio destroGruppo 1Gruppo 2Gruppo 3Hamcall.netHamlibHamlib è usata per controllare la radioPTT HardwareNascondiNascondi la finestra dopo (s):Limite superiore di frequenza in HzHost:IDIDIOTAZona ITUITUZIgnora duplicatiRic.Tempo di inattivitàIncludi la frequenza di trasmissioneInformazioniStato iniziale di DTRStato iniziale di RTSTensione iniziale su DTRTensione iniziale su RTSInizializzaInizializza l'interfaccia RigCATInizializza l'interfaccia hamlibInizializza l'interfaccia PTT hardwareInizializza i campi di log del QSOInizializza la connessione al serverScostamento della portante in ingressoInserisci un marker nel testo ricevuto prima di cambiare frequenza e modemInserisci testo predefinitoInserisci file...Metti zeri davanti al numero seriale trasmessoInserisci markerInserisci testo speciale nel pannello Rx quando fai click sul waterfallInserisci testoInserisci testo con un singolo click sinistroPeriodo d'integrazione (FEC blocks)Islands on the airConfigurazione A1A per K3LocUltimo QSOTempo in ms di salita/discesa dell'impulsoLascia in bianco o vedi http://www.pulseaudio.org/wiki/ServerStringsTasto sinistro per cancellare il testo Tasto destro per resettare le frequenzeTasto sinistro per cambiare il colore dei duplicatiTasto sinistro: cambia modo Tasto destro: configuraClick destro o sinistro riascolta la memoria audioLicenza GPLv3+: GNU GPL versione 3 o successiva Questo e` un programma libero: siete liberi di modificarlo e ridistribuirlo. Questo programma non e` coperto da alcuna garanzia, salvo gli obblighi di legge. Colori dei pulsanti illuminati selezionatiLimita i movimenti AFC a questa areaLimita a pochi caratteri, come CQEM o IOTA ecc.Cerca segnali all'interno di questa areaBloccaCaricaCarica una nuova paletteCarica file immagineCarica o trascina un file immagine Formati supportati: PNG, JPEG, BMPCarica...LocTrova flmsgTrova l'eseguibile di flmsgLocatorBlocca la frequenza di trasmissioneSalva tutto il testo RX/TXOrigine dei logLogIntegrazione di ricezione lungaCerca nominativoUtente LoTWLimite inferiore di frequenza in HzLimite inferioreFrequenza piú bassa in basso nel navigatoreMT-63Editor delle macro - MacroLocator come in JN53rwAttributi del mail serverUnisci file ADIFUnisci...Controlli minimiTempo minimo tra eventiMiscModoModo in usoIl modo deve coincidereLimite secondo la larghezza del modoModemPortante del modoModemMonitorizza il segnale trasmessoMouseRotella del mouse attiva sui pulsanti macroQuanti ms dopo l'impulso viene disattivata la linea QSKQuanti ms prima dell'impulso viene attivata la linea QSKTempo in ms tra i tentativiTempo in ms tra comandi successiviElaborazione di segnale multicanaleDecodificatore MulticanaleIl mio nominativo de CALLLa mia velocitá di trasmissione in WPMNBEMSinterfaccia per file di dati NBEMSFile NBEMS...NESSUN DISPOSITIVO AUDIO DISPONIBILE (o test)NOMINATIVO NON IMPOSTATONomeNuovoNoNon piú veloce di questoNon piú piano di questoNessunoNon lavorato in precedenzaNoteNotificheNumero e posizione delle barre delle macroNumero di cifre nel numero progressivoOKON - Scorrimento continuo OFF - Cancella e ripartiON - cerca su tutto il waterfall OFF - limita la ricerca a +/- 200 HzON - caratteri piccoli OFF - caratteri grandiON - avvia alla frequenza predefinita OFF - mantieni la posizione attuale del cursore sul waterfallON - usa l'ultimo file delle macro OFF - usa il file predefinitoOSSOn/OffDocumentazione on-line...&Modo OpApri...Apri la listaApri il file con il browser di sistemaApri col browserApri il file di logApri file delle macroApri file dei messaggiApri il messaggio con flmsgApri paletteApri file rig xmlApri lo squelch per nn sec se viene decodificato un RSIDApri con flmsgApri...Apri la cartella dei file NBEMS dopo una cattura riuscitaOperatoreOperatore collegatoQTH degli operatoriNomi degli operatoriConfigurazione opzionale in formato: param=val ...AltroDatoPSKPSK ReporterPSK et al.PTT è un comando CAT (non hardware)PTT genera un tono sul canale audio destro PTT via comando HamlibPalette: ParitàAnalizza tutto il testo ricevutoPasswordIncollaPaths (hidden)Seleziona una velocitá della porta dalla listaRiproduci il buffer audio quando viene selezionato il canale attivoRiproduzionePeriferica di riproduzioneRiproduzione:Imposta il tuo nominativo, prima.Tenendo il mouse per piú di due secondi su un nominativo appare popup con informazioniPorta:PortAudioTempo dopo l'impulso (ms)PrTono prima del segnaleTempo prima dell'impulso (ms)Premi invio per continuare la ricercaStampa CW / RTTY / THROB / CONTESTIA in minuscoloChiedi conferma per salvare il logProsignsProvinciaProvincia della stazione collegataPseudo-FSK sul canale audio destroPskmailForma dell'impulsoPulseAudioQRZQRZ.comQSKQSK sul canale audio destroQSL ricevuta ilQSL ricevuta ilQSL inviata ilQSL inviata ilQSL-ricQSL-invData QSOData fine QSOData inizio QSOLog dei QSOIl QSO non si deve ripetere in un arco di tempo diQSYQTHQTHSilenziosoRE:RPCRicezione RSIDRST ric.RST inv.RST(r)RTS +12RTS +12 vRTS = +VRTS controlla il PTTRTS controlla il PTTControllo di flusso RTS/CTSRTTYCattura RXRX ppmCorrezione della scheda audio in ricezioneL'inserimento dei dati del QSO dal testo ricevuto è delimitato dai caratteri definiti qui. Tab e a capo sono sempre inclusi.Frequenza radioFattore di forma dell'impulso di tipo raised cosineL'inseguimento avviene tra il valore corrente +/- il valore impostato in questo campoSto caricando i caratteri...Vuoi veramente cancellare il record per "%s"?RiceviLarghezza di banda del filtro di ricezioneModi ricezioneSincronizzatore di ricezioneAttivitá recenti per il quadratoneRapporti d'ascolto...Rec.RettangolareReed-Solomon ID (Rx)Reed-Solomon ID (Tx)RimuoviRianalizza i dati audio degli ultimi 2 minutiRiporta il S/N medio dei frame ARQComunica la frequenza della radio (abilita solo se hai il controllo automatico)AzzeraResetta tutte le opzioni ai loro valori predefiniti? Il reset delle opzioni avrà effetto al prossimo riavvio I file fldigi_def.xml e fldigi.prefs sarabbi cancellati! Reimposta alla portanteRipristina predefinitiTentativiIntervallo tra tentativi (ms)InvertiInvertiInverti il videoRitorna a caratteri normali (unshifted) dopo uno spazioRadioControllo della radioFile con la descrizione della radioModo RadioLa radio o l'interfaccia fa l'eco dei dati serialiLa radio richiede controllo di flusso RTS/CTSLa radio richiede controllo di flusso Xon/XoffLa radio usa handshake RTS/CTSRadio:RigCATUsa RigCAT per controllare la radioRST ricevutoRST inviatoLancia il programmaEsegui programma:Testo RxSfondo RxCaratt. RxComportamento S/N e IMDSELSaltaSQL-1SQL-2Velocitá di campionamentoSalvaSalva...Salva ConfigurazioneSalva tutto il tesxto ricevuto, un carattere alla volta, su questo file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Salva come...Salvare le modifiche al log?Salvare le macro modificate?Salva il file di logSalva file delle macroSalva paletteSalva testo comeSalva questa paletteSalva...ScopeScorrimentoSuggerimenti scorrimentoCerca questo nominativoArea di ricerca (Hz)Testo secondarioSecondiSelezionaSeleziona il numero di bit per carattereSeleziona il numero di bit d'arrestoSeleziona tuttoScegli il Contest e i campi CabrilloSeleziona i campi da esportareSeleziona i record da esportareSeleziona il carattere a scansione per la trasmissioneSeleziona la larghezza di bandaSeleziona la velocitá in baud della portanteSeleziona lo scostamento della portanteSeleziona il dispositivoScegli il comportamento della rotella del mouse all'interno del waterfallSeleziona i modi accessibili dal menúSeleziona il numero di toniSeleziona la paritàSeleziona il file con la descrizione della radioSeleziona il tipo di prefiltro FFTAttiva la selezione per Elecraft K3 Altre radio non dovrebbero averne bisogno.Scegli il carattere della scala del waterfallColore del testo selezionato nelle finestre Rx/TxTrasmetti il nominativo in CW alla fine di ogni trasmissioneInvia un flusso continuo di caratteri di provaInvia a questa velocità WPMInvia continuamenteInvia immagineInvia image...Invia il rapporto di ricezione quando metti un QSO a logInvia il rapporto solo quando il QSO è messo a logInvia il testo ricevuto al file: textout.txtCaratteri inviati nelle finestre Rx/TxSeriale ricevutoSeriale trasmessoNome del serverImposta Squelch per il ViewerImposta il livello per una buona visualizzazioneImposta il numero di caratteri per rigaScegli il tipo di ricampionatore usato per la correzione dell'offsetImpostazioniBreve descrizione dell'antennaMostraMostra le entità DXCCMostra la finestra di avviso:Mostra tutti i modiMostra indicatori della larghezza di banda sul waterfallMostra canaliMostra linee che indicano la larghezza di banda del modo sul cursoreMostra il cursore con linea centraleMostra meno modiMostra l'editor delle macroMostrami piú o meno waterfallMostra le icone del menuMostra la password in chiaroMostra suggerimentiMostra il segnale trasmesso sul waterfallBanda laterale:Navigatore dei segnaliNavigatore segnaliLivello del segnaleCampo di variazione del segnale (dB)Ricerca segnaliDimensione:Caratteri saltati nella finestra Tx (Tx on/off in CW)Scorri la porzione visualizzata verso frequenze piú alteScorri la porzione visualizzata verso frequenze piú basseColore evidenziato del cursore nel controllo squelch del navigatoreCPU lente (meno di 700 MHz)Ordina per data/ora di fine QSOOrdina il log in base all'ora/data di fine QSO Influisce su tutti i file esportati in ADIF/CabrilloScheda AudioVelocità (WPM):SpotSpotterSpottingSpotting disabilitatoSquelchLivello squelchApri squelch (sec)StParti daNumero di partenzaStatoLo stato deve coincidereStazione sentita due volteQuadratone della stazioneBit arrestoBit d'arrestoRegistra modo e frequenza Tasto destro per la listaCreazione di macchie solari in corso!Frequenza preferitaColori di sistemaSistemaT/RPotenza TXTX WPMGenera TXTX offsetTX ppmCorrezione della scheda audio in trasmissioneColore dei TabTabTalkerTalker Socket (MS only)Carattere di provaCarattere di prova per la regolazione del QSKTest...Cattura testoFile di testo da inserireTestoTesto da inviare durante i tempi morti della tastieraTesto...Pàstene soppaltate secondo l'articolo 12, abbia pazienza, sennò posterdati, per due, anche un pochino antani in prefettura... ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~La velocitá predefinita di trasmissione in CWIl nome del file viene scritto nell'area del testo RxIl campo regular expression non puó essere vuoto.La regular expression deve essere valida.La stringa viene sostituita con il modem e la frequenza correntiLa frase di test non corrisponde allo schema di ricerca di questo evento.Questa regular expression per gli eventi non è valida.ThorOraTempo (s):Ora OFFOra ONOra di fineOra d'inizioOra di fine del QSOOra inizio QSOTempo in ms tra i tentativiTempo necessario: Arco di tempoTemporizzazioneTemporizzazione e QSKVerso chi fare la connessioneScambiaUsa DTR per il PTTUsa RTS per il PTTDurata del tono (secondi)ToniVelocita' inseguita in CW (WPM)InseguimentoVelocità di trasferimento, X1-normaleTransmettiPotenza trasmissioneTrasmetti il nominativoCarattere in TXTrasmetti il tono di avvio bassoTrasmetti ID del modoModi di trasmissioneTrasmetti punti (.) nei tempi mortiPotenza di trasmissione usataSegnale trasmessoTrasmetti il tono di avvio altoTrasmetti testo videoTrasmetti/RiceviTrasmetti un punto quando non c'è attivitá sulla tastieraTriangolareLimite attivazione (s)AccordoMargine di sintonia (spaziatura tra i toni)Sfondo TxCaratt. TxPotenza Tx usata nei campi del logTxIDAspettoLinguaSchemaStato USA della stazione collegataAnnullaAggiornaLimite superioreLivello superiore del segnale (dB)Usa "cr cr lf" al posto di "cr lf"Usa '(' come parentesi, non KNUsa un CD o un'immagine su HDUsa il filtro DSP prima del decodificatoreUsa DTRUsa la spaziatura FarnsworthUsa HamlibUsa un server audio OSSUsa Apri per selezionare il file con la descrizioneUsa un server Port AudioUsa server Pulse AudioUsa RTSUsa RigCATUsa la media per diminuire il rumore del waterfallUsa pulsanti coloratiUsa oscilloscopio a croceUsalo per permettere a un amplificatore di accorgersi del segnaleMetti zeri davantiIl PTT usa una porta parallelaIl PTT usa una porta seriale separataUsa caratteri piccoliIl PTT usa uHRouterInterfaccia UtenteUtenteUsa la porta UDP #Abilita VSPVerbosoModi ID videoPreambolo identificativo visuale&VediMostra/nascondi CanaliEmulatore Virtuale di Porte Seriali - sopprimi gli allarmiModi visibiliVisita il sito web HamcallVisita il sito web di QRZIngrandimento WFControlli scorrimento WFMemorie WFWF amp spanPortante WFVelocita' verticale WFModo WFLivello di riferimento WFAttenti # ms prima di leggere la rispostaAvvisiWaterfallWaterfall / FFT / OscilloscopioControlli waterfallVelocità del waterfallAltezza del waterfall in pixelIdentificazione video del modo mostrata sul waterfallTesto visualizzato sul waterfallPeso (%)Il peso diminuisce aumentando il tempo di salitaAzione della rotella del mouseQuando non ci sono segnaliAvverrà dopo questo tempo in secondiDelimitatori di parolaVai a capoRitardo scritturaTRASMBlocca freq trasmissioneControllo di flusso XON/XOFFSíStai già usando la versione più recenteÈ necessario un abbonamento a pagamento per l'accesso online a HamcallÈ necessario un abbonamento a pagamento per l'accesso online a QRZIl tuo nome utente per l'accessoLa tua password d'accessodopoutente eQSLAbilita l'uso della rotella del mouse per il controllo della barra delle macroflmsg *flmsg.exe *.exeflmsg:il rapporto a campo libero deve coincidererapporto a formato liberoPorta e segnale usato per il PTT hardwarees: /home/dave/CALLBK/ or C:/CALLBK/ Lascia in bianco per cercare un databasein:minutirapportorapportisecondiSeleziona i caratteri usati nel navigatoremodalitá solo waterfallfldigi-4.1.06/po/pl.gmo0000664000175000017500000041263213515625025011534 00000000000000Þ•¾ >W ü{X¥Y¥v¥“¥˜¥œ¥j¡¥ ¦¦0¦*K¦v¦${¦ ¦¶¦˦å¦ ì¦÷¦ý¦§ §§§§§$§)§+§1§7§<§A§G§N§T§[§b§i§o§‚v§ù§¨¨ ¨¨¨ 8¨VB¨™¨ ¡¨«¨´¨¹¨¨ Û¨è¨î¨!©*©,©1©!6©&X©R©Ò©ç©ì©ñ©ªª!ª3ªIªcªyªª.¦ª)Õª5ÿª,5«-b«)«º«Ï«è«%¬")¬L¬\¬o¬ƒ¬&œ¬&ìê¬ ­­"4­W­u­ z­&›­+­î­ ®"®3®D®*J®u®z®1“®)Å®+ﮯ1¯"E¯+h¯”¯#¨¯ ̯ í¯° $°0°A°W°h°}°°¡°°°¿° Ù°æ°ù°/ ±;±S±&j±!‘±³±DZä±1²!3²"U²x²Œ²#§²!˲í² ³&³"6³ Y³+z³)¦³+гü³´4´ D´'Q´y´˜´´´Ë´é´-î´µ<µZµ(kµ”µ¯µ εïµ ¶"¶'3¶[¶`¶u¶"•¶ ¸¶,Ù¶#·$*·O·&m·”·ª·À·Ô·æ·-ú·*(¸"S¸v¸{¸ €¸Œ¸’¸”¸™¸ ¸ª¸¹¸ ɸÓ¸æ¸ë¸ ï¸ û¸¹ ¹ ¹8¹O¹ U¹`¹u¹“¹ š¹§¹$«¹&й÷¹ º. º&Oºvº{ºƒº,›ºȺáºùºýº» » »C»)c» »8š»Ó» ê»&ô» ¼ &¼1¼,O¼*|¼§¼#°¼Ô¼ç¼ú¼$½%½,½2½DD½ ‰½”½¤½·½*Ͻú½/¾ >¾ H¾R¾h¾ }¾2ˆ¾»¾Û¾ù¾¿¿,:¿2g¿ š¿¤¿¹¿À¿Ó¿Ø¿)à¿) À)4À1^À À žÀ«À°À ÁÀËÀ ßÀ éÀôÀÁÁ"Á+Á>ÁAÁHÁPÁ-dÁ’Á ²Á½ÁÂÁ ÉÁ×Á ßÁêÁ ÂÂ' +Â)5Â_ÂhÂpÂtÂ}„ÂÂ’ •¡±ÂР֠âÂðÂà Ã)Ã8ÃOÃ_ÃwÃ‘à ¯Ã½Ã ÌÃØÃ Ýà éÃ1õÃ'Ä48ÄmÄ8vįĶľÄÑÄáÄöÄ ÅÅ9Å HÅ#iÅ+ŹÅÂÅ ÙÅçÅþÅ Æ'Æ @Æ&LÆ sÆÆœÆ¼Æ ÖÆ ÷Æ ÇÇ(#ÇLÇaÇ+xÇ¤Ç¹Ç ÎÇÜÇ7ëÇ8#È\È yÈ„È ŠÈ”È©È'»ÈãÈøÈÉW6É$ŽÉ³ÉLÍÉ/ÊJÊ_Ê'wʟʶʼÊÓÊ5æÊË "Ë,Ë0;Ë lË(xË)¡Ë3ËËÿËÌ -Ì ;ÌFÌ LÌ WÌaÌiÌo̢̲̎Ì.ÅÌ4ôÌ)Í;ÍPÍeÍeÍçÍ ûÍ Î'Î.Î=ÎUÎ ]Î jÎ xÎ …ΓÎ)›Î&ÅÎ"ìÎ Ï0Ï*EÏpÏ*‚Ï ­Ï·Ï¼ÏÂÏÊÏäÏúÏÐ)Ð9Ð BÐ PÐZÐoЋРªÐ´Ð ¹ÐÑÅЗѱÑ;ÉÑÒÒ#Ò=Ò+DÒpÒ/‡Ò·ÒÏÒ ßÒìÒ ÿÒ Ó ÓÓÓ!Ó&Ó .Ó8ÓAÓXÓ hÓsÓ…ÓŠÓ šÓ ¨Ó´ÓÆÓÏÓàÓöÓ Ô Ô.)Ô XÔdÔ€Ô…ÔŽÔ–Ô¥Ô¶ÔÊÔÐÔÖÔ,ïÔÕ.ÕCIÕVÕäÕ+ìÕÖ2ÖKÖeÖÖ ’Ö žÖªÖ#ÇÖëÖûÖ×7×)@×"j×#×±× ¸×$Æ×ëר.ا=ؤåØŠÙ Ù°ÙÈÙßÙûÙÚ Ú,Ú IÚUÚ\Ú`ÚwÚ ÚÚ ²Ú¾Ú/ÒÚÛ:Û8XÛ‘Û£Û!«ÛÍÛ#éÛ ÜJ-Ü&xÜ+ŸÜ0ËÜ!üÜÝ*;Ý fÝsÝ wÝ‚Ý1™Ý ËÝÕÝ ðÝûÝ ýÝ ÞÞ /Þ =Þ HÞTÞ,gÞ”Þ›Þ¤ÞÄÞ ÞÞéÞêß þß à&à&9à`à,qà žà"ªàÍàìàáá6á Rá9]á —á%¸á)Þá/â28âkâ2ˆâ(»âäâ+úâ*&ã+Qã,}ã ªã$Ëã)ðã%ä@ä7\ä”äPœäEíä3å GåUåså-‚å"°å"Óå"öå"æ"<æ,_æ'Œæ-´æâæýæç ç çç $ç.ç6ç ?ç KçXçrçzç˜ç²ç ·çÄç ËçØç÷ç èè >è'Hè3pè:¤è1ßèéé é+é/é >éLéjéyé }é‹é“éœé £é(®é ×é:øé3ê 8ê-Bêpê€ê’ê¤ê½ê Ôêâêñêëë3 ëAëHëZënëë)—ë Áë Ëë Ùë ãë ðëþëì ìì-ìBì$^ìƒì$˜ì½ìÐì ßìéìPþìOíWí \ígí oízí€íb›í!þí/ î#Pî tî•î±î¶î¼î ÎîØîéîùîï ï#ï(ï 0ï>ï4Gï,|ï©ï±ï¹ï ÁïÍïÔïðï:õï 0ð =ð IðSðgðð˜ðð$¶ðÛðòð÷ðññññ!ñ%ñ*ñ9ñ<ñAñWXñX°ñZ òYdòY¾òó!ó&óEó Wóaódó wó‚ó¡óÀó;Åóôô$ô9ôNôeô |ô‡ô£ô ¿ô!àôõõ23õ9fõ õ´õÃõ,Üõ ö6ö Nö Zö{ö›ö­ö<Çö2÷7÷8Q÷6Š÷Á÷Ó÷-æ÷ø ø %ø2øFø KøXø\ø@vø·øËø êøøøùù ù+ùFù aùkùzù ~ù ˆù ’ù ù©ù±ù¸ù*ÓùIþù0Hú9yú³ú'Òú.úú0)ûÏZû*ü Hü2iüœü ¶ü$Äüéüìü ñüýüýý.ý3ýFý"Vý:yý´ý¼ýÀý ÇýÕýéýûýþ +þ8þPþhþ€þþºþ×þîþ÷þÿþÿÿ ÿAÿ\ÿoÿÿ%¢ÿ ÈÿÔÿÜÿëÿóÿM X q ~ˆ2Œ¿Ñëþ  0>T kv†Œ¤½ Ñ Üæù $+K bp uƒ ›¥ ¹ ÄÑ-×  ,,M$zŸ3¦Úêó   )2:K k3Œ/Àð   @Z_ q}ž¦¬ Å'Óû0Oj#p(”'½å"ü?V _ m xƒŒ ³*µàø 8&Gn~ƒŠ‘«¯È!Þ  $ 6 G _ q ‚ Ÿ µ ¹ Ò ×  Ú ä ø  , +@ l q x ’ ² Ä xÊ C FI   ž ª !º !Ü Jþ I K N (Q Bz  ½ ;Þ 1 L P  T  ^ h m t „ ˜ ¬ Ä Í  Ö à ÿ !1E ]j(|¥µ/½&í - 6DW6f ­»Ò/á #,/\'a‰’ – £ ®»Úù +&2"Y|#– ºÛô ' 1 <2H {…¤¼-Äòû  ( A#L.pŸ¨Â ÒÜü/DI OBYœ´Í âîñ ,)7#a0…¶¾ÆÎëþ3<E`!{ ¥± ÄÏÓ ×áéòö #= \j€ˆ‘šž § ´ À*Ì ÷  *.D(Jsw Š˜œ«½ÆÏÖÝ åïø49L] s~…vž %F L Z fr‘—¨Ç ÏÝ ö'AUk„ ²¼Ñ Öâ÷3 @W^mtŠ¡¿ Î;ï+3*9•dú 2Q&b@‰ÊÞæï #278j£§¯ Ë$Ù%þ0$ .U „  ˆ ” ª "³ !Ö "ø !6!G!L!S! o!(}!^¦!" ""'" 6"C" L" X"e"h"w"~" ’"  "¬"´"»"Ï"Ø"à"æ"ú" # ##*#.# 3#@#F#L#U# ]#h# q# #Œ# “#Ÿ#¤# ­#ª¹# d$o$…$¡$¶$Ô$ä$ö$ % %, %M%_% g%s%/ƒ%³% ¹%Ã% ×%)ä%&T,&&$¡&Æ& Í&Ú&ó&''&'5'='E'L'a' t' ' ' ¸'Ù'í'(!( 7(B(S(k( €(7Ž( Æ(Ò(ï( ))&) A)<b)Ÿ)»)*Ë)Uö)L*d*i*0y*!ª*+Ì*ø* ++,1+ ^+ i+w+(+#¸+!Ü+0þ+/,H,X,j,r,y, , ‹, —,¤, µ,Á,(Ð,ù,-&-$A-3f-8š-Ó- Ü-æ-õ-.. *.8.K.1Z."Œ. ¯. ½.Þ.û. /%/7/V/f/ ‚/!/ ²/ ¼/Æ/Ï/Ö/å/1ù/+0 :0G0 Y0 g04u0ª0Â0*È0 ó01441 i14s1¨1Ä1Ó1å1.ú1S)2}29“2 Í2Ø2ç2î2 ö2 3 3&3;3 J3W3\3d3m33 ‡3•3¨3«3 ±3¼3 Ò3 Þ3 ê3 ö34 4 *4 64B4R4X4h4y4 Œ4™4 «4·4Ç4 Ø4 ä4ñ455+5 25 <5F5-O5 }5‰5 £5#Ä5$è5 6(6-6 L6 W6b6t6 z6…6Œ66—6ª6¹6½6*Ó6þ677 (7 47>7E7 ^7h7m7‚7‡7Ž7 ¦7²7Ê7 Ï7 Ü7!æ7 88$8 ,8 98E8W8"_8‚8•8©8'²8Ú8qâ8zT9Ï9+ä9/:%@:Bf::©:;ä:/ ;+P;|;; †;;™;¡;ª;²;Á;Ò; ï;ý;"<)<8<G<N<]<m<Œ<“<¦<¹<Î<Ö<Ü<â<ú<="=6=P=Y=m=|=‹= =«=Ä=Þ=ï=þ=>1> A>O>i>}>0Ž> ¿>Ê>Ý>å>$ê> ? ? *? 7? D? Q? ^? k? x? …?’? •?£? ·?Ã?Ì?Ô?!í?@@@&@-@ 0@ <@ F@Q@l@‡@1–@È@ß@ü@ A%A*A/JA,zA§A¾AÏAâA8éA"BXDXKXRXYX_XxfXßXæXîX ðXýX"ÿX "Yb0Y“Y ›Y ¥Y±Y ¶YÃY ÝYêYðY" Z.Z0Z5Z":Z0]ZOŽZÞZôZùZþZ[([-[@[W[p[‰[¢[:º[)õ[0\,P\%}\*£\Î\æ\]' ]#H]l]|]]¢]*¾])é]#^7^Q^'i^+‘^½^&Â^,é^._E_a_|__ž_-¤_Ò_ ×_8ø_1`4N`ƒ`ž`&±`3Ø` a"a$9a)^aˆa œaªa¿a×aêabb+bËz {{.{ >{3K{7{·{ Î{Û{ã{ô{ |&| 9|Z|k|O|*Ï|ú|Y}As}µ}Ó}1í}~:~@~W~&l~“~™~¨~,¸~ å~!ñ~13e|– «¹ ÁÏÞæ"ì€'€:€:I€E„€Ê€ã€ú€l-š)®Ø àë‚‚#‚ +‚9‚L‚U‚#]‚%‚§‚Ă߂/ò‚"ƒ+4ƒ `ƒjƒ oƒyƒ€ƒ˜ƒ°ƒă ܃çƒïƒ „ „ !„'B„ j„t„{„؃„\…|…R˜…ë…† †#†2,†_†&x†Ÿ†º†ˆá† ý†‡ ‡ ‡%‡(‡-‡ 5‡?‡H‡_‡ r‡}‡—‡œ‡ ¯‡ ½‡ʇä‡ó‡ˆ"ˆ9ˆ Tˆ:bˆˆ¬ˆLj ̈ Öˆ àˆ îˆüˆ‰‰‰<3‰p‰†‰E£‰Yé‰CŠLŠlŠŠŠ¢ŠºŠÚŠ îŠ ûŠ(‹,1‹^‹q‹&‘‹¸‹%Á‹)ç‹-Œ?ŒEŒ*WŒ‚Œ˜Œ( Œ³ÉŒ³}1ŽHŽXŽoŽ$…ŽªŽ °Ž ¼Ž2ÈŽ ûŽ ( HS mw–%­FÓ?Zj#s—(µÞDýB‘.`‘8‘È‘è‘;ÿ‘;’ L’ V’b’.|’«’»’ Ï’Ù’ Û’ ç’!ò’“2“E“T“2h“›“¡“ ©“Ê“ ê“ô“û” ••6•-P•~•%Ž• ´•&¿•æ•––9–!R–t–0|–­–1Ë–7ý–05—9f—" —)×+í—˜6˜*V˜,˜!®˜И#ì˜ ™+1™]™8y™²™mº™K(š tš š(š¸š!Èš"êš! ›'/›!W›$y› ž›'¿›.盜4œ9œBœQœ `œkœ{œœ¥œ¹œÏœÞœæœ% : DRk– ².¿Lî;;ž*wž¢ž¨ž ±ž»ž ¿ž Êž"מúž Ÿ ŸŸ#Ÿ,Ÿ 4Ÿ/?ŸoŸBŽŸÑŸ ן.䟠# 6 G ` z Š Ÿ ´ º /À ð ö $ ¡0¡$E¡1j¡ œ¡ ¦¡³¡áÓ¡ä¡ì¡ó¡¢ ¢*¢!F¢h¢$|¢¡¢ º¢ ŢϢaè¢J£ R£\£k£t£ „£Ž£t­£+"¤N¤/i¤%™¤(¿¤è¤ ï¤ý¤¥¥2¥&H¥o¥ x¥†¥‹¥ “¥ ¥4¨¥/Ý¥ ¦¦¦ %¦1¦8¦Q¦AX¦ 𦍦 ¹¦Ǧܦ§§:§M§#T§x§~§€§„§‡§§•§¤§§§¬§X§X¨Xt¨XͨX&© ©Š©©¬© ¾©È©Í©ç© ð©ª.ªB3ªvªª¨ª½ªÒªìª «« /«!P« r«“«­«;Á«?ý«=¬ R¬`¬)z¬¤¬9³¬ í¬)ù¬#­@­H­;`­8œ­Õ­<õ­A2®t®Œ®;’®ή Ó® à®í®¯ ¯¯¯R5¯ˆ¯œ¯¼¯ίí¯ó¯ ù¯(°.° N° [°i° m° y°„° ”° ¡°­°¶°7ѰU ±._±Jޱ;Ù±(²1>²3p²夲&г±³1ɳû³´ %´F´I´ N´\´p´ƒ´–´œ´³´È´5è´µ'µ+µ2µFµZµjµ{µ Œµ™µªµ»µ̵âµøµ ¶ /¶;¶C¶I¶i¶r¶Œ¶¦¶¿¶ß¶-ý¶+·:·C· L·V·Tk·À·Ù·é·ù·0ÿ·0¸"E¸h¸~¸ …¸.“¸¸Ô¸è¸ ¹ ¹¹#¹B¹X¹ j¹ t¹~¹—¹ ¬¹¸¹ȹι빺ºº!(º Jº'Uº }ºŠº›º+£ºϺáºõº5»)K»u»>|»»»Ê»Ò»ì» û» ¼¼)¼1¼D¼'`¼2ˆ¼3»¼"ï¼½½# ½D½c½j½ ‚½½¦½¾½ǽͽì½'ò½¾ ¾#7¾[¾u¾*z¾'¥¾+;ù¾&¿<¿[¿ s¿ ~¿ Œ¿ ˜¿¤¿­¿¾¿Ô¿Ö¿æ¿÷¿ ÀÀÀ=À LÀmÀˆÀÀ”À ›À¼ÀÀÀàÀ-öÀ$Á>Á\ÁvÁ‰Á¨Á ¹ÁÇÁäÁþÁÂÂ( ,Â:ÂLÂ!cÂ…Â)•¿ÂÄÂ$ÍÂ(ò Ã)Ã/ýÃMÃà ÄÄ .ÄOÄ nÄQÄáÄãÄæÄ)êÄFÅ%[ÅAÅDÃÅÆ ÆÆ+Æ=ÆBÆIÆ\ÆnÆ€Æ—Æ žÆ ©Æ&·ÆÞÆöÆ Ç Ç:ÇTÇdÇ4yÇ®Ç ¾Ç5ÉÇ6ÿÇ6È?ÈPÈ_ÈoÈ€È<‘ÈÎÈáÈñÈ É2ÉRÉXÉ]ÉbÉ/rÉ¢É1©ÉÛÉßÉ ãÉ ðÉ ûÉ&Ê&/ÊVÊ^ÊbÊsʇÊ-ŽÊ¼Ê"ÒÊ&õÊË;ËTË"pË “Ë ŸË «ËB·ËúËÌÌ'$Ì LÌ+W̃̉ÌÌ  Ì¬Ì#µÌ ÙÌ*çÌ-Í@ÍIÍ`ÍyÍ3™ÍÍÍ0éÍÎÎ %ÎG/Î!wΙΰΠÆÎÑÎÔÎëÎÏÏ-&Ï6TÏ5‹ÏÁÏÉÏÑÏ ÙÏúÏ&Ð?Ð_Ð hÐrÐÐ!§ÐÉÐÑÐáÐ úÐÑ Ñ ÑÑÑ(Ñ,ÑGÑKÑ[ÑmÑ‡Ñ–ÑªÑ ²Ñ ½ÑÉÑÍÑÖÑëÑ ôÑ!ÿÑ!Ò0Ò9Ò=ÒBÒ FÒPÒTÒlÒ3rÒ¦ÒªÒ ¼ÒÇÒ ËÒ ØÒ äÒ ïÒùÒÓÓ ÓÓ"Ó9ÓLÓlÓqÓ ‹Ó™Ó ªÓ·Ó¾ÓÙÓiÔ%zÔ Ô§Ô¶ÔÅÔ&ÔÔ ûÔÕ Õ=Õ EÕPÕ pÕzÕ/ŠÕºÕÒÕáÕýÕÖ'Ö:Ö LÖ WÖdÖyÖ8ŽÖ!ÇÖ éÖóÖ× ×"×B×T×0k×:œ×××ß×-çײØÈØäØ+ìØÙ0Ù-CÙMqÙ¿ÙÙÙ ßÙëÙÚ$Ú*>Ú3iÚÚ£Ú«Ú ÅÚÓÚòÚ0Û/BÛrÛ vÛ€ÛÛ)˜Û'ÂÛêÛÿÛÜ'Ü,Ü3Ü NÜ/[Üh‹Ü ôÜÿÜÝ Ý *Ý 5ÝAÝQÝbÝ eÝsÝzÝ ’Ý ŸÝªÝ³ÝºÝÒÝ ÚÝæÝìÝ Þ ÞÞ Þ5Þ9Þ?ÞOÞUÞ [ÞfÞ nÞxÞ Þ ÞœÞ£Þ¿Þ ÆÞÐÞ”äÞy߈ߣßÀß'Ùßàà0àBàQà'cà‹à šà¤à³à7Äà üà áá(á07á.háx—á3â0Dâuâ}â“â¥â¹âÓâ òâþâã ãã*ã?ãPãoã"ˆã«ãÁãÝãûã ä $ä2äNäkäIä Éä×äõä åå-å JåDkå!°åÒåãåWÿåWækæræ"ƒæ'¦æ Îæïæçç2"ç Uçaçpç ç.®ç%Ýç3è7èUèlè|è ƒè è šè¥è´èÃè×èëè1é(3é\éwé“é:³é;îé*ê0êAêXêlê rê €êŽê¡ê9¸ê,òêë*3ë^ë|ëë¯ë!Âëäëõë ì&ì FìQìaìrìzìì7§ìßìøìíí*íA=íí•í/ží,Îí,ûí(î Eî@Rî!“îµîÄîÜî.òîe!ï%‡ïC­ïñïð ðð 7ðDðTð!Zð|ðŒðð¢ðªð³ð ÄðÒðçðþðñññ 4ñ @ñ Lñ Xñ(dñ ñ ™ñ ¥ñ±ñÀñÅñØñòñ ò ò ò'ò6ò Fò Qò \òhò…ò—ò žò «ò ¶ò5Áò÷ò"ó&+óRó+mó™ó´ó%¼óâóóóôô ô0ô9ô=ôDô]ôlôpô&ô¨ô¯ô¶ô Ïô Ûôåôìô õõõ6õ;õAõ ]õ-iõ—õœõ «õ¹õØõéõÿõö ö+ö;ö)Dö nöö £ö2­öàövéö]`÷¾÷/Ó÷.ø"2øAUø7—ø:Ïø; ù7Fù~ùƒù ˆù ’ù  ù®ù µù Áù Ìù#Úùþù ú!ú ;úFú Zúfú yú$„ú©ú²úÄúÖú îúøúûû û#û3û Rû sû}û“û šû¤û ¶ûÂûØû ðû þû*ü 3üAü Rü^üvüˆü-šü ÈüÔüêüòü6ùü 0ý :ý Eý Oý Yý cý mý wý ý ‹ý•ý ˜ý¥ý ¼ýÊý ÒýÞý-øý&þ+þ-þCþJþ Mþ Wþ bþpþ Žþ¯þ7¾þöþAÿVÿlÿŒÿ(“ÿ:¼ÿ9÷ÿ1Lc z.…´Óîõ<R o š µÁ×)î 0: R \h!y›µÑ0ð!* G&hh¤S a"¤·/Ïÿ(7F \g ,‹)¸ â í.ø/''W …“§­ÅÙ5ì"#2V"v/™ÉÒä÷,E\x | †=ÎÑØ+ð3 P V _ {  ª É Û ñ õ  * H d „  £ ¨ )± Û ï -  8 +D p  Š   µ 3Ç û  $/ T Y  ] g † œ ° ² ¶ bÐ 83 3l    ¬ à â å è 12%P v‚ˆ.—'Æ$î"4'=e#ƒ1§ÙÞ/î%+2:J!]–7£OÛ+62#i'¤ÌGÛ#&7:QrÄÙßåûÿ!S7‹’ ›¦¹×íý@FMk2€³Ë Ñßù-þ',Tk„ˆFópr…ûI]VcÔÒw²$_b‹è‚¨RÏp÷†^ÃxégÝð),.ÐWQ^ˆ¼<ýԹ̔ºf´dP-ò˜4ÀÖ¤‚µŒIJI³Š0Àãèüwlvÿý"T3׈|"Ý“YÅ\*X“q´ôUß±#¬¾lº#ÉI´ì–», ~µ³V{#¯Xéºâ™jy£r6·8h&¢Vƒ'±) 稧%~màR Æÿ{<dÛØ÷•bî­L>8í¯‘Qá:C¹~oQW¯a“˳¯bÌÔÁ?^–J 9Ü8ÛÚö¸¼É ëixxTë‰6Qé¬î£<;`Ø}X€’žë’zJûòÓÎge¢D: zç4Dç0­±Ï™>Ÿƒ€µ*x ?|xÍ —“K kámäùèð{»¾ú ù?cAåÍ–€f[Åí,’¼‰øC ”>ˆ h  Y 7JúÇ"È_…ÿ`H.Ý+ܽa<ÐŽŸ9ëuU°aÐ(Ïå €ýwê=t®õ¥+¡Æ…8!Æt·!¦ ‡Š«@®ošÖÚ|Ÿ)OÞ&¿Ç?*v[@1+︤Ղ³¦0z®q‹È&ék»,Ÿ¼,er*ù$Cð qq-^Ù"(i®\‡…"T’.2ÇÉ»]sS›U]„‡^ƒ¾‘y”í x67Œ A8m>E¢î3GŸQÞšn=¥‰>:ÔÌ0'KŽee3Êôªã=`G …Á£¶œL2üº`ãÔZ½ÃcÇ¿ø ½EsbNx_fŽœ7{ ey‡óÊÿd#Ä–]”Ìò›G¨Aòob êûÊ?>H‚CgÙ²¬­ðWFq2j™Rc¬½¸±k@ª#¯+M°›jÎEžµÎ ³L^})i oÔšê~pÓÖÚñÒ¾Ûm§yõþkŽï§Ÿ©•³Eó 'ú8 +WSà™lIv] ´Õ6¼‡iÁ=Ù"çøåN1ìô]ßÒ™!äB×#’Oþ»t6ò=ÃY(¸@íïR +à¹Òƒ5âq»õ©fbŒš´A'ÙÑoP—RF¸Q¡$%&O?ต—pö˜%5%$)£­ál‹J¦Œ×¤³«º§ëUÜôm§ÿ5;n`å²²¶t2âPíÁ¶3N§Ü[5ªnü~Srø„ÃâNÍÂQûDˆDO/P °ä{2#7åñ‚¼˜|f–'gʤkòÉT½ÊÔ8!\Ü/ÿÄ=‘"B£3‹uÛꘔ×Í] Ëõ¬HdàŦ±/@Þ¯ž/æz°9©ˆäqŽN Móï@2øufº‰”Kob,<“—Ò(B[~ŒA‡–‰{4Œ£FY…‘v†¡;<0ú ƒ¶’‹`}5®;œZS²(¤þídìájùMî’ù}͇/+Œ”ÂwOv~%ÏØwôF­Ù‰KÛ·-¸•p>ŒÑË •lXñ_Â|’u¡Ÿ^ÞÖ°<œã6Å[h¢caEMf91‚j-sþYœ:F:KJèæÊ.'©Èµ$ùZœ_Yй:ÞWEÒZ`åaÿïOòŽ*0%&õvF3Ó¿àr~¾:ö¶1eMséžmäÁ–Õü3NÀ¦`ÜjQ°—SeB¿"sÞŠÚøô6ÓÚìÚÖ$ìÍ÷÷47.4ƒt·Xî¦úH‚×ß9†‡×ƱÇÈ­ÜÊSˆOߥu;mÏC¹' dßáªVˆD=wà¤=TÄcJÅ»¡Ä°¹gtšgÙŠÚ) Ì¡ •À4还‘îáÐáJeCiz9\h ”„\€Û_¼µñµ;7WÀb¨çÑ[[WG€-SöN÷ï†d´·,®“rÆ B&Kì„T (zÝ}ŽrÅÛ«!0Z5cË„L—©Zu¹âÐÁA¿ œõêÕ Î?rä%¡¾¥¨\ž+î¼o[¢ê·YúC>UÀa7Mg.þPÝnn¨ØǪG jŠ-O\ý/<×XiªæXÃÒÝ­p$æ80/k!j½²óˆB¥Õ¨ñ€Ìk¤:ÑÏ‹±AÑžnUh#‘GlÝL‹ósL·³^Ãlöm“ÉŠšVý(Ëëh¹ÐILc²Ðpå |VÕfZ© «ÎHRKPU¨˜ðœäôü½ÓVW&/·Õ_¬„ßæ“y9HÓã&Žõ‘ªþ\£›$ýÂ@°› •TÉÀƒ*a‘wlu1'ð«}H,}¥¢)Ö†ÌXûÑ«{d2?!†h©Ö­9¶†|ÄUIÈùÍpö ¢5•%qµ±£™¬Ë÷ ›A¯™´˜;RGí_›Ø4ÓFã÷„«GŠ*²yPéCìáèÆ§âH}Rv†€¯™æ»*@ È)xª…ZÈ(Æø¾.L¾Ë…-‹oðsYħvâg1—¢ûæ EE453ñ ®èzÁM¿šÂÙ¦¥yú¥{ïD .aãtu¶1ëê]ó®IS¤Pºü7!kÎnçØsšž;û6ØéÏBh‚›ÉƒöÞ ½–©B1 «iüþºÇD¦ýñ|-wÑ „žV‰N—´ÎÄiÅtzß2¸çnŸD‰˜TM¬Ky¶ {CALL} other ops call sign {MODE} full mode / submode in " "" RR"Disable PTT keys modem if multiple instances of fldigi (client) are connected to a single flrig (server).# Created: %s # Records in logbook# retries before giving up# times to resend command before giving up$ SX%s # Fldigi Generated Config Script %s exists, overwrite?%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&UI&View' WG( KN) KK**.exe*.txt+ AR- DU-.--.-.--.--...--....-.----..--.-..-.-..-..-.... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ......-.-...-..-00 = T; 9 = N11 - Slow, 2 - Medium, 3 - Fast1/2 speed1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types1010 Nr14070.1501x speed25 W2x speed4 bar macro set below Tx500 Hz limit8 psk8-bit extended characters8-bit extended characters (UTF-8):< AR AFC on,off,toggle alert using external wav file my antenna send avatar operating band other call contest class clear log fields clear RX pane clear TX pane contest counter ignore all comment text modem timing test, spec' file modem timing test, 'n' random 5 char groups modem timing test, string 's' modem char/sec test on nn chars Analysis CSV on,off,toggle CW identifier decrement counter digital mode (adif) [Wait][Len](ms) log eQSL optional msg log eQSL FD class FD section insert text file valid xcvr filter width send CAT cmd rig freq has kbd focus my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot send mode ID; TX start only idle signal for NN.nn sec LDT default '%Y-%m-%d %H:%M%z' insert image file increment counter S/N etc. IMD etc. ZDT default '%Y-%m-%d %H:%MZ' last serno sent Local datetime, default '%x %H:%M %Z' local date, default '%Y-%M-%D' saveQSO data, append msg to notes log at xmt time other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data local time, default %H%M change macro defs file map by value map on google mode my call my FD class my CNTY my county my locator my name my QTH my RST my FD section my ST my state other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit pop current mode/freq from stack CW QSK post-timing other Province CW QSK pre-timing push current mode to stack insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously Rev on,off,toggle send CAT cmd valid xcvr hi cutoff filter valid xcvr low cutoff filter valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out
ARRL section current contest serno schedule execution search DOWN for signal search UP for signal other State Digitalk On, Off, Toggle text at start of TX repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version delay xmt for NN.n sec WAV file; spec' file WAV file; 'n' random 5 char groups WAV file; string 's' WAV file; internal string CW WPM:Farnsworth get weather data for station get weather data exchange begin exchange end exchange in exchange out UTC datetime, default '%x %H:%MZ' zulu date, default '%Y-%M-%D Z' zulu time default %H%MZ= BT> SK? Dup Color@@ ACAADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQARQ controlARRL SectAU *.{au,snd} AX25 DecodeAbbreviation for countyAbbreviation for stateAbortAccess URLAcquisition S/N (dB)Acquisition search range (Hz)ActionActive ModemAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdd address to notes fieldAdd date/timeAdd date/time stamp to each # received messageAdd geopolitical name of METAR stationAddrAddressAdjust cursor frequencyAdjust sensitivity by 1/N fractional values.Adjust the DSP bandwidthAdvanced configuration:AgeAlertsAllAll OthersAll entriesAll settings shown here can be changed later via the Configure menuAllow TX After Signal Detection (Seconds)Allow errorsAllow transmits after 'N' seconds of a signal detection.Allow/Disallow ChangesAlt ColorAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAlways transmit at 1500 Hertz center freq.Antenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAttackAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio on Auxiliary PortAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAudit logAuto CRLFAuto CRLF line lengthAuto Connect / RetryAuto SpaceAuto connect when fldigi opens (server must be up)Auto start programs with fldigiAuto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutomatically start psk reporter socket connectionAutostartAvailable substringsBPF bwBPF transmit audioBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBad modem idBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBg colorBits per characterBkBrowseBrowserBrowser Line ColorsBuffer allocation Error near File: %s Line %dBug me about saving log entriesBuild infoBusyButtonButton HeightButtonsC&ountriesCALLSIGN always lower caseCAT LED stateCAT command for PTTCPUCPU speedCPU usage increases with waterfall heightCQ STATECQ zoneCQZCR-CR-LFCSV...CT spaceCTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW SSCW SS CheckCW SS SectionCW Sweepstakes ContestCW dsp filter bandwidthCW is LSBCW is LSB modeCW sweepstakes sectionCW transmit WPMCW wpm keyboard stringsCW wpm using paddle keyerCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall LookupCall SearchCall back for script command %s reported an ErrorCall sign workedCallook.info lookup (free service US callsigns only)CallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture Log ReportCapture Lookup Capture Radio ReportCapture Spot ReportCapture Spot TuneCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCarrier shift in HertzCelsiusCenter DXspot freq at sweet spotCenter display on signalCenter freqCenter in passband Right click to undoCenter lineCentered at 1500 Hz (SHARES)Change # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel 1 AttenuatorChannel 2 attenuatorChannel labelChannel numberChannels, first channel starts at waterfall lower limitCharacter count in args[] parameter exceeds expectationsCharacter searched not foundChars/Row:CheckCheck AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check if xcvr uses LSB for CWCheck if xcvr uses USB for RTTYCheck this to be notified when an RSID is received without changing modem and frequencyCheck to enable TCP/IP IO ConnectionCheck to enable UDP/IP IOCheck to enable character encode/decode Select one character from each groupCheck to reduce CPU load in PSK and RTTY modes.Check value receivedChecking for updates...Choose directory to store KML documentsCity of station workedClassCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear UDP textClear channel text after # seconds of inactivityClear list?Clear log controls sets RST in to 599/59Clear log controls sets RST out to 599/59Clear log entries after saving or using macro Clear log fields - new CALLClear log fields?Clear on saveClear textCloseClose ListClrs/FntsCmd WPMColorColor for outgoing telnet textColor of Mark TrackColors && FontsColors and cursorsCommand %s ignored, dot notation not supportedCommand %s ignored, structured command not supportedCommand Not FoundCommand line optionsCommand missing ':'.Command run on KML creationCommand started when KML files are generated. Subprocesses are started once, and restarted if needed.Commands are echoedCompensation in msec default = 0ConditionsConfigConfig ScriptsConfiguration InterfaceConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?ConnectConnect / Disconnect from Nav Config portConnect / Disconnect from Nav FSK portConnect / Disconnect from WinKeyerConnect / Disconnect from nanoIOConnect to MacLoggerConnect to host program on FLDIGI start upConnect to serverConnect/disconnect to Talker socket serverConnectedContCont'ContestContest exchange receivedContest exchange sentContest seral # sentContest serial # receivedContest/LoggingContest:Context NotesContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not find LoTW report file. Download from ARRL's LoTW page after logging in at: https://lotw.arrl.org/lotwuser/default Store the report file to the fldigi LOTW folder, naming the file 'lotwreport.adi'Could not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate keyed square wave on right audio channelCreate new logbook fileCreate sunspotsCustom shiftCustom text searchCustom...CutCut 0/9DIRECTEDDPDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDX ClusterDX Cluster DialogDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioDash/DotData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDatabase merger in progressDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecayDecode (CWI suppression)Decode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault CW tracking pointDefault RST in to 599/59Default RST out to 599/59Default RTTY tracking pointDefault SettingsDefault URLDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec after executing mode changeDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete entry?Delete local data files if selected.Delete the current recordDeselectDetect the THOR preamble Clear the Rx pipelineDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice supports full duplexDevice:DevicesDiddle characterDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirected received textDirectory path not foundDirectory...Disable alert dialogDisable allDisable freq changeDisable further detection when RSID is receivedDisable if flrig not used.Disable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay RX as a scrolling marqueeDisplay RX in reverse videoDisplay logbook read datum at startDisplay macro filename at startDisplay tx and rx in main fldigi window. Change requires restart of fldigiDisplays the Slot Time in MillisecondsDisplays the Transmit Delay in MillisecondsDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDot to dot-space ratioDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEEQSL-rcvdEQSL-sentEcho paddle chars to Rx PanelEdge decreaseEdge shapeEdge timingEmbedded Wefax GuiEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable ARQ for programs that support TCP and FLDIGI ARQ protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol. Only one interface (ARQ/KISS) can be active at any given time. KISS/ARQ/XML Addr/Port changes require program restart.Enable Busy ChannelEnable CSMAEnable DSP prior to decoderEnable Data StreamEnable GPIO PTT (Pi specific controls)Enable HistogramEnable Histogram threshold signal monitoringEnable KISSEnable LO/HI bfp of transmit audioEnable MultiPSK-compatible FECEnable UDP log fileEnable Winkeyer PTT outputEnable Winkeyer audio toneEnable Winkeyer tone keyingEnable allEnable check box to show each respective operator controlEnable contest character spacingEnable drag cursor on waterfall scaleEnable encode/decode vestigial pilot toneEnable flrig xcvr control with fldigi as clientEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable paddle auto spacing of charactersEnable rx text streamEnable short preamble for 8PSK transmissionEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable this to send start/stop tonesEnable to inhibit TX on signal DetectionsEnable to put Tx panel above Rx panelEnable to select date rangeEnable when both programs are using the same IP addressEnabledEnabled - log QSO using Mark frequency Disabled - log QSO using center frequencyEnabled - use Mark/Space filter outputs Disabled - use pseudo signalsEnd of line reachedEnd of xmt IDEnter METAR data internet URLEnter QTC textEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-filename for tqsl executableEnter full path-name for cty.dat folderEnter test string or leave blank for default:Enter time span in minutesErrorEvenEven LinesEven linesEventEvent logExch InExch OutExchange InExchange OutExecutable file to insertExecuteExecute command on KML files.Executing script file: %sExitExit promptsExportExport SetupExport records for LoTW uploadExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extend last dit/dot in msec default = 0Extra duration to first dit/dot in msec default = 0Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.F-WPMFD classFD sectionFECFFT ProcessingFFT averagingFFT prefilter window functionFLMSG files...FSKFSK InterfaceFSK PTTFSK portF_keysFahrenheitFarnsworth keying (0 = none) default = 0Fax images destination directoryFeel free to skip any pages or exit the wizard at any timeFeldField DayField Day Callsign May be same as OP callsignField Day ClassField Day LoggingField Day SectionField Day class receivedField Section receivedFile I/O onlyFile not foundFile read errorFile:FilesFill in Country / Azimuth using cty.dat informationFilterFilter FFT outputFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFlrig I/OFlrig PTT keys modemFlushes the TX buffer after x period when Busy Channel remains on (TX inhibited)FoldersFontFont colorFont...Font/ColorFont:Force RST in/out to 599/59Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreq.FreqDisp / MetersFrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)FullFull reportGPIOGeneralGeneral ErrorGenerateGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlibHamlib used for rig controlHangHanning/Blackman - use edge timing BPF - use BPF bandwidthHardware PTTHeard agingHeard logHeight of macro barHell Receive ParametersHell Transmit ParametersHideHide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:II/OIDIDsIFKPIFKP Raw ImageIOIOTAIP Address Port NumberIP Address for ARQ interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for KISS interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for XMLRPC interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for fllog interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostITU zoneITUZIdle transmit before data sentIgnore duplicatesImage LPFInInactivity timeoutInches Hg.Include the transmit frequencyInclusive stop date for exportInfoInhibit 7 bit modem change notice on user or RSID receptionInhibit 7bit ModemInit delay (ms)Initial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert NN LTRS bytes at start of each transmissionInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Interesting notesInterleave SYNOP and textInterleave text with decoded SYNOP messages, or replacement.Invalid File Name Pointer (NULL) in function %s:%dInvalid Modem for KISS IOInvalid function parameter 'char *file_name_path' (null)Invalid function parameter (internal non-script error)Invalid parameterIslands on the airIssues reported in processing script file: %sJOTAJOTA/SchoolJamboree OTAK3 A1A configuationKISSKISS controlKMLKML balloon display styleKML balloon in plain text, or HTML, in plain tables or matrices.KML files directoryKML refresh interval (seconds)KML root fileKML server enabled (On / Off)KeyKeyerKeyer ModeKeying ratio default = 3.0Keying weight default = 50Kid's AgeLED brightnessLOCLOTW-rcvdLOTW-sentLTRS at startLast QSOLatencyLeadinLeadin in msec default = 0Leading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click to select possible dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Line: %d Error:%d %s (%s)Listen / BindListen for signals within this rangeLkLoTWLoTW ReviewLoTW download fileLoTW rcvd dateLoTW sent dateLoadLoad a new paletteLoad image fileLoad last used macro file at startLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocate tqsl executableLocationLocatorLockLock transmit frequencyLogLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog on to pskrep when starting fldigiLog sourcesLogbookLogbook DialogLoggingLogging Panel ControlsLogs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Long receive integrationLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow filter cutoffLow frequency limit in HzLow tone at 500 HzLowerLower limitLowest freq on bottom of viewerMARK polarityMETAR station ID codeMETAR station locationMFSK ImageMFSK image fileMT-63MYCALL Match in BrowserMYCALL always lower caseMYCALL detected wavMac LoggerMacLoggerMacro Button LabelMacro Edit FontMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesManual tuningMarkMark PolarityMark frequency in HertzMark onlyMark prev freq/modeMark-SpaceMarquee textMatchMatch logbook records with LoTW download fileMatched Filt'Matched Filter bandwidthMaximum open subscripts reached.Maximum row number for a received fax image.May require resizing the Rx/Tx panelMediumMemory Allocation Error (internal non-script error)Merge ADIF fileMerge...Message LoggingMeter ColorMiles / HourMilliSecondsMin HitsMin WPMMinimal controlsMinimum # hits in tone detectorMinimum WPM setting default = 10Minimum distance for splitting alias nodes (Meters)Minimum distance for splitting aliases (Meters)Minimum time between eventsMiscMiscellaneousMissing command %s after line %dMissing paired quotes (")ModeMode delay (msec)Mode in useMode must matchMode width limitModeRegModemModem Bandwidth Margins Modem carrierModem signal on left and right channelsModemsMonitor for TCP connection.Monitor signals in modem bandwitdh plus margins.Monitor transmitted signalMouseMouse wheel active on macro buttonsMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Msec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy ClassMy JOTA TroopMy SectionMy StationMy TroopMy callsign de CALLMy transmit CW WPMNN3FJP DX spots centered on mode sweet spotN3FJP Server IP AddressN3FJP Server IP PortN3FJP logsNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameName-RName-SNarrow LPF if image noisyNavNav Channel 1 attenuatorNav FSK MARK PolarityNav FSK PTT - should always be onNav FSK Stop bitsNav FSK baud rateNav FSK side toneNavCAT state LEDNavChannel 2 AttenuatorNavLED brightnessNavRF AttenuatorNavigator configuration portNavigator serial portNewNew record / Save recordNextNoNo ErrorsNo faster than thisNo file name givenNo records in lotw download fileNo slower than thisNon transmit window after a transmit periodNoneNormalNormal drop speed / valueNot a script file/tag not foundNot worked beforeNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotification dialog closes after XX seconds;^j0 == dialog remains openNotificationsNotify onlyNotify time outNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OOKONON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOddOdd LinesOdd linesOlivOn/OffOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperate tqsl in batch mode (no dialog)OperatingOperating bandOperatorOperator CallOperator Callsign:Operator Name:Operator callsign (if different than station callsign)Operator workedOperators QTHOperators age receivedOperators nameOptional configuration in format: param=val ...OptionsOtherOutOutput PInsOutput port number when same IP address usedOverOver writing call back funcion for "%s"POWER(r)PSKPSK ReporterPSK et al.PSK reporterPSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PSKmailPSMPSM AttenuatePSM Histogram ThresholdPTT ONPTT delays valid for all CAT/PTT typesPTT enables auxiliary audio sourcePTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT using hamlib commandPTT via and PTT via Hamlib commandPWR-meterPaddle DogPaddle echoPaddle sampling (see Winkeyer manual) default = 50Palette: Parameter is not valid.ParityParse all incoming textPartialPassed parameter is not of the expected type.PasswordPastePaths (hidden)Percent (%)PersistancePick baud rate from listPilot tonePilot tone power relative to signalPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Polling Interval (msec)Popup info after a 2 second hover on a callsignPortPort:PortAudioPosition the 4 bar macro set below Tx panel Default above Rx panelPost write delay (msec)Post-keydown timing (ms)Power Signal MonitorPower scalePrPre-Signal TonePre-keydown timing (ms)Preamble DetectionPrecedencePress only if you change the address/portPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProsignsProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPskmailPulse shapePulse width (msec)PulseAudioPwrQRZQRZ cdromQRZ.comQRZ/eQSLQSKQSK on right audio channelQSLQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSOQSO DateQSO Date OffQSO Date OnQSO loggingQSO must not occur within a time period ofQSOp categoryQSOp stateQSYQTC:QTHQTH NicknameQthQuery state of nanoIOQuietQuiet mode [-q], do not open tqsl dialogRE:REGEX detected wavRF attenuatorRPCRSID receptionRST always 599/59RST rcvdRST sentRST(r)RST(s)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Scope DisplayRTTY is USB modeRX - unshift on spaceRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine pulse shape factorRangeRange +/- wpmRange 1...3Range 1...4Range WPM setting default = 25RatioReading fonts...Really delete record for "%s"?ReceiveReceive UsageReceive filter bandwidthReceive modesReceive synchronizerReceived fax maximum rows number (5000)Received scout nameReceived troop numberRecent activity for gridReception of flmsg filesReception reports...ReconnectRecord both channelsRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Refresh time interval written in KML file (Seconds)Regex Match in BrowserReloadReload cty.datRemoveRemove call after ...Replay trackline audioReport ARQ frames average S/NReport BrowserReport actual modem RF frequencyReport rig frequency (enable only if you have rig control!)ReportsResetReset FEC blocks when changing BW or TonesReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestartRestore UART Settings on CloseRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetriesRetrieveRetrieve for active modem useRetry Interval (msec)Retry interval (ms)Return KISS TCP IO connection to a Listening stateReturns IP Address and port number to the default value.RevReverseReverse Left/Right channelsReverse videoRevert to Unsifted char's on a spaceRevert to unshifted char's on a spaceReview / edit the exported LoTW upload adif fileReview lotw.adif file before sending with tqslRigRig controlRig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig/Log ControlsRig:RigCATRigCAT used for rig controlRight channelRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRng WPMRsIDRsID audio alert wavRsID detectionRst receivedRst sentRun programRun program:RxRx / Tx PanelsRx AGCRx Height in pixelsRx ParametersRx Serial #Rx TextRx WPMRx Width MultiplierRx bkgndRx fontRx/TxRx/Tx Character setRxID narRxID wideS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SS checkSS precSS sectionSS ser #SYNOP to ADIFSYNOP to KMLSampleSample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save image as monochrome fileSave log entry?Save logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...Scale ColorSchool Round UpSchool Round Up - allowable I, H, O - see rulesScopeScout Op'Scout Operator NameScript FilesScript Parsing Class Allocation Fail (%s)Script device path not found.Script file contains potential issues See documentation and/or Log file for details.Script file name (path) invalidScript file name (path) null pointerScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Searches passbandSecondary TextSecondsSectionSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Logging as QSO or ContestSelect PTT on stateSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect pin numberSelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelect wav fileSelection background color in Rx Tx panelsSelection of transfer direct takes precedence over all other flmsg reception settingsSelf Organizing MappingSendSend CW cut #'sSend Callsign in CW at end of every transmissionSend QSO data to LoTW when loggedSend a continuous stream of test charactersSend at this WPMSend beacon every ...Send continuouslySend data stream directly to executing flmsgSend imageSend image...Send lotw.adif via tqslSend reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSent scout nameSent troop numberSer NoRSer inSer outSer. PortSerial # inSerial # outSerial InterfaceSerial echoServer string:Set - mark logical HIGH Read from nanoIOSet >0 if pulsed PTT usedSet Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSets the theshold level to x value above the noise levelSettingsShaped TxShort PreambleShort description of antennaShowShow DXCC entitiesShow TX timerShow alert window:Show all modesShow and enable Power Signal Monitor button (PSM)Show bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro control codesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSide toneSideband:SidetoneSigLvlSignal BrowserSignal Level ColorsSignal averaging over time 0 - least 4 - greatestSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlot TimeSlow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard KeyingSlow CPU (less than 700MHz)Slow drop rateSoft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSome changes made by the script requires program restart before they become active.Sort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSound Card FSKSound:SounderSpace onlySpec CharSpectrumSpectrum Scope / Waterfall interactionSpectrum scopeSpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState QSO PartyState must matchStation / OperatorStation CallStation Callsign:Station LOCStation LocatorStation Locator:Station QTHStation QTH:Station callsignStation heard twiceStations grid squareStatusStop DateStop bitsStopbitsStore mode and frequency Right click for listStream TextSubmit each QSO as loggedSubmit password with each uploadSubmit the upload adif file to LoTWSubscript execution fail (internal).Sunspot creation underway!SwapSwap left/right keyer contactsSweet SpotSweet spotSwitch to ARQ I/OSynopSys ColorsSystemT/RTCP/IPTCP/IP Data StreamTHOR Raw ImageTTYTX - unshift on spaceTX Buffer Flush Timer (Minutes, 0=Disable)TX PowerTX WPMTX deadmen timeout (mins)TX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTabular data sourcesTailTalkerTalker Socket (MS only)TemperatureTen Ten number receivedTestTest SignalsTest charTest character for QSK adjustmentTest commandTest text fileTest...Text CaptureText ColorsText HighlightingText IOText Tags (tags use {} delimiters)Text capture orderText file to insertText i/oText to send during keyboard idle timesText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThese tags can also be used in This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time outTime out xmt attempt in XX secondsTime span overTimeout (secs)TimingTiming and QSKTiming/SettingsTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)Tone ONTonesTouchTracked CW speed in WPMTrackingTransceiver FSKTransfer direct to executing flmsgTransfer speed, X1-normalTransmitTransmit Data DelayTransmit PowerTransmit UsageTransmit callsignTransmit fontTransmit lower case textTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit textTransmit upper start toneTransmit video textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):Troop-STuneTune margin (tone frequency spacing)Two scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9TxTx ParametersTx Width MultiplierTx above RxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUUDP data streamUDP/IPUIUI languageUI schemeUNDIRECTEDUS state of station workedUS units of distance (QRB)USB serial I/OUnable to create file %s (Error No=%d) func %s:%dUnable to open file %sUncheck if KML is never usedUndefined errorUndirected received textUndoUnexpected end of file reached.Unexpected end of parameter (args[]) list foundUnexpected end of parameter check list foundUnmatched LoTW RecordsUnshift on spaceUnsupported formatUpdateUpdate selected local data files with repository contentUpdate site not availableUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse PotUse Pulse Audio serverUse RTSUse RigCATUse T/N for 0/9Use averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse password for tqsl accessUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUse these for WinKeyer and nanoCWUse this tqsl station locationUse uHRouter PTTUse wave shaping on Tx signalUsed For PSKMail and FLDIGI Suite of ProgramsUsed for BPQ32Used to adjust the aggressiveness of TXUser IDUser InterfaceUser nameUsing UDP port #VSP EnableValid Signal Sample Period (Milliseconds)Valid signal sample period in MillisecondsVerboseVerifyVerify database with LoTW download fileVerify database with eQSL download fileVersion %s is available at Source ForgeVideoVideo ID modesVideo Preamble IDViewView UnmatchedView/Hide 48 macrosView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWARNING - this will over write ALL settingsWF CtrlsWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWFxWPM SettingsWPM settingWPM speed for Winkeyer Command strings default = 18WXWaitWait for response to first CAT commandWait for response to subsequent commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWavWav write sample rateWaveform Audio Format *.wav Weather Fax Image RXWeather Fax Image TXWeather query specificationWebWeb Browser lookupWeightWeight (%)Weight decreases with increasing edge timingWheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWind speed/dirWinkeyerWinkeyer pot controls WPMWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)Write delay (msec)Write state of nanoIO to Arduino EEPROMXMITXMLXMT lockXON/XOFF flow controlXY - classic scopeXcvr serial portYYesYou are running the latest versionYou must have tqsl installed and it's location recorded for LoTW updates to work!You need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordYour tqsl login passwordaaafteralways append to file(s)append # directive msgs to named fileautomatic data uploadcallsign tooltips in received textchannels != 1charsclear old datacmd_buffer allocation error near line %dconvert operator callsign to lower caseconvert other callsign to lower casecty.dat foldercurrent wx conditionsdefaultdefault text to send with etcdefault uses date/time ondisplay PSM button on main dialogdisplay Rx control chars as ascii stringeQSLeQSL userenable mouse wheel control of macro barflamp:fllogfllog:flmsg *flmsg interfaceflmsg received wavflmsg timed out wavflmsg.exe *.exeflmsg:flnet:flrigflrig is the preferred method of tranceiver controlflrig xmlrpc server parameters these controls are mirrored on the IO configuration tabflrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangefreq scale = N * modem bandwidthh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourleft click on WF recenters spectrum scopeleft click transfers frequency to scope center frequencylock WF at 1500 HzmbarsminutesnanoIO serial portnopilot power (dB)print ^! execution codes in Rx panelrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportsscale spectrum display linked to modem bandwidthsecondsselect browser fontselect by datesend when logged (log button, , )tqsl station locationtqsl:track colorunknown wave file erroruseuse waterfall range/limit valuesvalues left/below waterfallwaterfall-only modexmt start/stop tonesyes{NAME} other ops nameProject-Id-Version: fldigi 3.23.14 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2019-03-06 14:56+0100 Last-Translator: Roman Bagiński Language-Team: Polish (Roman Bagiński) Language: pl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: iso-8859-1 X-Generator: Poedit 1.8.6 {CALL} inna Stacja{MODE} emisja/ podtryb pracy w" "" RR"Wylacz klucz PTT modemu, jesli uruchomiono fldigi (klient) i podłączono do jednego flrig (serwer).# Utworzono: %s # Zapisy w dzienniku# prób przed rezygnacja# razy, aby ponownie wysłac komendę$ SX%s # Fldigi Wygenerowany Konfig skrypt %s: istnieje, zastapic ?%s log rozpoczęto %s%s: Nie istnieje, utworzyć ?O progr.KonfigurujPlikPomocDziennik&OK&UIWidok' WG( KN) KK**.exe*.txt+ AR- DU-.--.-.--.--...--....-.----..--.-..-.-..-..-.... Te ustawienia są na innych kartach. Są replikowane tutaj dla wygody. Mozesz zmienic stan z kazdej lokalizacji. ......-.-...-..-00 = T; 9 = N11 - Wolny, 2 - Średni, 3 - Szybki1/2 predkosci1000 Hz ton, kiedy PTT wlaczony Moze być uzywana zamiast lub w uzupełnieniu do innych typów PTT1010 Nr14070.1501xPrędkosc25 W2x PrędkoscUstaw 4 makra poniżej TxLimit 500 Hz8 psk8-bitowe znaki rozszerzone8-bitowe znaki rozszerzone (UTF-8):< AR AFC wl,wyl,przelacz alarm za pomocą zewnetrznego pliku wav moja antena wyslij avatar pasmo pracy inna stacja klasa zawodów czysc pola logu resetuj panel RX resetuj panel TX licznik zawodów ignoruj cały tekst komentarza test czasowy modemu plik spec test modemu, 'n' losowe 5 grup znaków test czasowy modemu, ciag 's' modem/ test znaków na sek Analiza CSV wl,wyl,przelacz identyfikator CW Licznik dekrementacji emisja cyfrowa (adif) [Czekaj][Len](ms) log opcionalny eQSL.cc log eQSL klasa FD sekcja FD wstaw plik tekstowy wazna szerokosc filtru xcvr wyślij CAT cmd rig czestotl ma nastawe kbd moja czestotliwosc tekst do IMIE/QTH przenies do czest NNNN Hz powrót do preferowanego polozenia Nadaj ID trybu z rozpoczęciem TX bezczynny sygnał dla NN.nn sek LDT domyślnie '%Y-%m-%d %H:%M%z' wstaw plik obrazu zwiększamy licznik S/N itp. IMD itp. ZDT domyślnie '%Y-%m-%d %H:%MZ'\ostatnie wysłane serno Lokalna data-godzina domyślnie'%x %H:%M %Z' lokalna data '%Y-%M-%D' tzapiszQSO danych, dołącz msg do notatek loguj czas nadawania inny lokator LOCK wl, wyl, przelacz zapiszQSO danych, dołącz msg do notatek zapisz dane QSO czas lokalny %H%M zmien plik definicji makro mapa według wartosci mapa google emisja moja stacja moja Klasa FD moje CNTY moje hrabstwo mój lokator moje imie moje QTH moje RST moja sekcja FD moje ST mój stan inne imie Wyślij |NN| kolejne pakiety RsID następne QSO odb # wstrzymaj nadawanie pop biezacy tryb / freq ze stosu CW QSK post-czas inna prowincja CW QSK pre-czas kliknij biezacy tryb w stos wstaw do tekstu Rx QRG # QSO odebr czas QSO (HHMM) incr/decr xcvr freq qsy do kHz, Hz Prawo klikiem przycisk QSY Lewym klikiem przycisk QSY inne QTH powtarzaj makro stale Rev wł, wył, przełacz wyślij CAT cmd wazne xcvr odciecia filtru wazne xcvr niskie odciecie filtru obowiazuje tryb xcvr Czas narastania CW inny RST odbiór Rx RSID wl, wyl, przelacz Zapisz plik makro zapisz zawody
ARRL sekcja aktualne zawody serno realizacja harmonogramu wyszukiwanie w DÓL sygnalu wyszukiwanie w GÓRE sygnalu\inne paÅ„stwo Digitalk Wl, Wyl, Przelacz tekst na poczÄ…tku TX cyklicznie co NN sek SygnaÅ‚ strojenia dla NN sek przelacz Tx/Rx nadawanie ustawi tÅ‚umik xmt Tx RSID wl, wyl, przelacz wersja Fldigi opoznij nadawanie NN sek WAV plik; pliku spec ' Plik WAV; 'n' losowe 5 grup wiersz Plik WAV; wiersz 's' Pik WAV; wewnÄ™trzny wiersz CW WPM:Farnsworth uzyskaj dane pogodowe dla stacji uzyskaj dane o pogodzie rozpocznij wymiane koniec wymiany nr. kontrolny Rx nr. kontrolny Tx UTC data czas domyÅ›lnie'%x %H:%MZ' Data zulu '%Y-%M-%D Z' czas zulu %H%MZ= BT> SKKolor duplikatu?@@ ACAADIFAFCZachowanie AFCZakres AFC (Hz)Zakres AFC lub BWPrÄ™dkosc AFCPredkosc sledzenia AFCALTRARQKontrola ARQARRL SekcjaAU *.{au,snd} Dekoduj AX25Skrót dla powiatuSkrót dla paÅ„stwaPrzerwijAdres URL Pozyskiwanie S/N (dB)Zakres wyszukiwania (Hz)AkcjaAktywny modemDodajDodaj CRLF po stronie szerokosci znakówDodaj sygnaÅ‚ RsID na koncu transmisjiDodaj adres do pola notatekDodaj datÄ™ / czasDodaj do kazdej wiadomosci data/czasDodaj geopolityczna nazwÄ™ stacji METARAdresAdresUstaw kursor czÄ™stotliwosciRegulacja czuÅ‚osci przez wartosci ulamkowe 1/NRegulacja pasma DSP Zaawansowana konfiguracja:WiekAlertyWszystkoWszystkie inneWszystkie pozUstawienia pokazane tutaj mozna pozniej zmienic za pomoca menu KonfiguracjaNadaj po "N" sekund od wykrycia sygnaÅ‚u.Zezwalaj na bledyNadaj po "N" sekund od wykrycia sygnaÅ‚u.Zezwól/Blokuj ZmianyAlt KolorAlternatywne kolory znaków w panelu Rx Zawsze LSBZawsze USBPokaz czÄ™stotliwosc audioZawsze uruchom nowe modemy na tych czestotliwosciachZawsze nadawaj na czestotl. 1500 HzAntena:Wyglad etykiety na kazdym kanaleDolacz do tekstu RX:Dołącz do tekstu TX:ZastosujWprowadzanie czÄ™stotliwosci strzalkaAtakAudioInformacje o urz. audioUrzÄ…dzenie Audio jest dostepne tylko jako dodatkowa usluga PortAudioPlik audioCzestotliwosc audioUrzÄ…dzenie wejsciowe audioAudio na Port pomocniczyCzÄ™stotliwosc Audio lub RF na skali wodospaduUrzÄ…dzenie wyjsciowe audioHistoria strumienia audio zdekodowanego na wybranym sygnaleLog audytuAuto CRLFAutom. dÅ‚ugość linii CRLF Auto polacz/ wznowPrzestrzeÅ„ automatycznaAktywuj podczas startu fldigi (serwer musi byc uruchomiony )Programy Auto start z fldigiAutomatycznie wstaw Kraj i AzymutAutoCRLFAutomatyczna regulacja czÄ™stotliwosciAutomatyczna prÄ™dkosc sciezki RxAutomatyczne spoty stacji w zdekodowanym tekscieAutomatycznie uruchom połączenie z portem psk reporteraAutostartDostepne podrzedneBPF bwBPF transmisja audioKoniecTloKolor tla dla klawiszy funkcyjnych grupy 1Kolor tla dla klawiszy funkcyjnych grupy 2Kolor tla dla klawiszy funkcyjnych grupy 3Kolor tla podglÄ…du blokady szumówZla czÄ™stotliwoscZÅ‚y id modemuPasmoPasma muszÄ… byc zgodnePrzepustowoscCisnienie barometryczneSzybkosc transmisjiSzybkosc transmisji:Przewodnik dla poczÄ…tkujÄ…cychZachowanie s/n imdKolor tlaKolor tlaBitów na znakBkPrzeglÄ…dajPrzeglÄ…darkaKolory linii przeglÄ…darkiBlad alokacji bufora w pliku %s Wiersz %dInfo o bledach wpisu dziennikaInformacje o wersjiZajÄ™tyPrzyciskWysokosc przyciskuPrzyciskiKrajeZNAK zawsze male literyStatus CAT LEDKomenda CAT dla PTTCPUPrÄ™dkosc CPUUzycie CPU wzrasta z wysokoscia wodospaduCQ STANStrefa CQCQZCR-CR-LFCSV...PrzestrzeÅ„ CTCTRLCWTryby CW IDCW ustawienia IDCW QSK sygnaÅ‚ na prawym kanaleCW SSSprawdz CW SSSekcja CW SSKonkurs na loterie CWPrzepustowosc filtru dsp przy CWCW jako LSBCW jako LSB Sekcja loterii CWCW nadawane WPMCiÄ…gi klawiszy CW wpmCW WPM za pomocÄ… Å‚opatki KEYERWykrywanie i tÅ‚umienie CWIPróg CWI Ustaw CabrilloCabrillo...CallWyszukaj StacjeSzukaj StacjiWywoÅ‚anie zwrotne dla polecenia skryptu %s zgÅ‚osiÅ‚o błądStacja zaliczonaCallook.info wyszukiwanie ( bezplatna usluga tylko dla stacji US )Znak stacjiMoga byc stosowane zamiast lub w uzupeÅ‚nieniu na inne rodzaje PTTAnulujPrzechwytPrzechwyc dziennikWyszukajPrzechwyc raport Przechwyc raport spotaPrzechwyc dodatkowe spotyUrzadzenia do przechwytywania i odtwarzaniaPrzechwyc urzÄ…dzeniePrzechwytuj tekst rx do zewnÄ™trznego plikuPrzechwytywanie sygnalu ponad ten prógPrzechwytywanie sygnalów w tym zakresie czÄ™stotliwosciPrzechwytywania:CzÄ™stotliwosc nosna (Hz)PrzesuniÄ™cie nosnejZmiana przesuniecia w hercachCelsjuszCentruj DXspotCentruj wyswietlacz na sygnaleCentruj czestot.Centruj w pasmie przenoszenia Kliknij ppm, aby cofnacCentruj linieWyÅ›rodkowane na 1500 Hz (SHARES)Zmiana # podglÄ…du kanalów PSKZmiana ta tylko do eksperymentowaniaZmien wyglÄ…d aplikacjiZmien kolorZmien kat...Zmiana poziomu LoguZmiana pozycji z niskiego do wysokiego kanaluZmien plik makro Zmiana skali wodospaduZmiany sÄ… uwzglÄ™dniane przy nastÄ™pnym uruchomieniu programuTÅ‚umik kanaÅ‚u 1TÅ‚umik kanaÅ‚u 2Etykieta kanaluNumer kanaluKanaÅ‚y, pierwszy kanal w dolnej granicy wodospaduLiczba znaków w args[] parametr przekracza oczekiwaniaZnaków nie znalezionoZnak/Wiersz:SprawdzZaznacz wszystkoSzukaj duplikatówAktualizujSprawdz w czasie uruchamiania programuSprawdz dostÄ™pnosc aktualizacjiStosuj LSB na CWStosuj USB dla RTTYSprawdz to, aby odbierac powiadomienia RSID bez zmiany modemu i czÄ™stotliwosciOdhacz, aby wlaczyc połączenie TCP/IP IOOdhacz, aby wlaczyc UDP/IP IO Zaznacz aby włączyć kodowanie / dekodowanie znaków Wybierz jeden znak z każdej grupySprawdz, by zmniejszyc obciÄ…zenie procesora w trybie PSK i RTTY.Sprawdź otrzymanÄ… wartośćSprawdzaj aktualizacje...Wybierz katalog do przechowywania dokumentów KMLStacja zaliczona z Miasta KlasaOczysc dane KML teraz!Wyczysc przy starcieWyÅ›wietl dokumenty KML, Google Earth.CzyscCzysc wszystkoCzysc tekst UDPSkasuj tekst kanalu po # sekund bezczynnosciZeruj listeWyczysc log i ustaw RST na 599/59Wyczysc log i ustaw RST 599/59Zeruj wpisy po zapisie lub za pomocÄ… makra Wyczysc pola dziennikaWyczyscic pola dziennika?Wyczysc przy zapisieWyczysc tekstZamknijZamknij listeKolor/CzcionkaCmd WPMKolorKolor wychodzÄ…cego tekstu telnetuKolor znacznika sciezkiKolory && CzcionkiKolor i kursorPolecenie %s ignorowane, notacja dot nie jest obsÅ‚ugiwanaPolecenie %s ignorowane, polecenie strukturalne nie jest obsÅ‚ugiwaneNie znaleziono poleceniaOpcje wiersza poleceÅ„Brakuje polecenia ':'.Komenda tworzenia pliku KMLKomenda startuje, gdy generowane sÄ… pliki KML. Podprocesy sÄ… uruchamiane raz, a w razie potrzeby ponownie.Polecenia sÄ… echemKompensacja w milisekundach domyÅ›lna = 0WarunkiKonfigurujSkrypty konfiguracyjneKonfiguracja interfejsuZastosujZamknijWykonaj RESETZastosuj / zamknijZamknac?PodlaczPolacz / rozÅ‚acz z Port Nav ConfigPołącz / rozłącz z portem Nav FSKPolacz / rozÅ‚acz z WinKeyerPolacz / rozÅ‚acz z nanoIOPolacz z MacLoggerPodłącz do hosta programu przy starcie FLDIGIPolacz z serweremPolacz / Rozlacz do gniazda serwera GÅ‚osu PolaczonyKontKontynentZawodyZawody nr. kontrolny RxZawody nr. kontrolny TxZawody numer # wyslZawody numer # odebranyZawody/LogZawody:Notatki kontekstoweKontynentCiÄ…gle przewijanieZnaki sterowania w panelu Rx/Tx Konwertuj znak stacji na wielkie literyKonwerterKopiujKorektaNie można znaleźć pliku raportu LoTW. . Pobierz ze strony LoTW ARRL po zalogowaniu siÄ™ na: https://lotw.arrl.org/lotwuser/default Zapisz plik raportu w folderze fldigi LOTW. nazywanie pliku "lotwreport.adi"Nie udaÅ‚o siÄ™ zrobic kataloguNie mozna otworzyc url: %s Nie można uruchomic przeglÄ…darki internetowej: %s Otwórz ten adres recznie: %sNie mozna uruchomic flmsgKrajStacja zaliczona z KrajuHrabstwoUtwórz 1000 Hz audio prostokÄ…tne w prawym kanaleUtwórz raport Cabrillo Przebieg prostokÄ…tny na prawym kanaleUtworz nowy plik dziennikaUtwórz sunspotaWybrane przesuniecie Wyszukiwanie niestandardoweWybrane...WytnijWytnij 0/9SKIEROWANYDPDTMFDTR +12DTR +12 vDTR = +VDTR -sygnaÅ‚ linii PTTDTR jest linia PTTDX KlasterOkno dialogowe klastra DXDXCCIdentyfikator DXCCPodmioty DXCCPodmiot DXCCStosunek kreski do kropkiKreska /kropkaWyszukaj baze danychDane repozytorium plikówZródlo plików danychAktualizacja plikow danychPliki danych.Czas retencji danych, w godzinach (0 oznacza brak limitu )Zródlo danychTrwa łączenie baz danychDataData Zak.Data Roz.Data zak. QSOData roz. QSOData czas WL/ WYLDebugZanikDekoduj (tÅ‚umienie CWI)Dekodowania pakietów AX25 w postaci czytelnej dla czlowiekaDekoduj sygnaÅ‚y DTMFDekoduj odebr. sygnaÅ‚y DTMFDekoduje komunikaty SYNOP (Ex: German Weather Service) do pliku ADIF Dekoduje komunikaty SYNOP (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DomyslneDomyÅ›lnie 800 Hz. Niemcy 850HzDomyslnie sledzenie punktu CWDomyslny RST Rx 599/59Domyslny RST Tx 599/59Domyslnie sledzenie punktu RTTYUstawienia domyslneDomyslne URLDomyslny WPMDomyslnie dla wszystkich innych modemówDomyslnie sÅ‚uchaj /czÄ™stotliwosc nadawaniaKomunikat domyslnyCiÄ…g testu domyslnie jest: "Domyslnie do przekroczenia oscyloskopuDomyslneOpóznienie NN msek po zmianie emisjiOpóznienie NN msek przed zwolnieniem PTTOpóznienie NN msek przed rozpoczÄ™ciem audioKasujKasowac pozycje? UsuÅ„ lokalne pliki danych, jesli wybrano.Kasuj aktualny rekordOdznaczWykrywa preambuÅ‚e THOR Wyczysc potok RxWykryj wystÄ™powanie[WRAP:beg] i [WRAP:end] Zapisz tagi i wszystko zalaczonego tekstu do daty czasu stemplowania pliku, ie: NBEMS.pliki\WRAP\odebr\wypakuj-20090127-092515.wrapWykryj wystÄ™powanie [WRAP:beg] i [WRAP:end] Zapisz tagi i wszystko załączonego tekstu do daty czasu stemplowania pliku, ie: ~/.nbems/WRAP/odebr/wypakuj-20090127-092515.wrapWykryty poziom sygnaluPoziom detekcjiWysoki próg detektoraNiski próg detektoraUrzadzenie obsÅ‚uguje peÅ‚ny dupleksPort:UrzÄ…dzeniaDiddle znakRóznica miÄ™dzy czest. Rx & Tx (rig przesuniecie)Kolor cyfrCyfryTlumikDekoduj odebr. tekstNie znaleziono sciezki kataloguKatalog...Wylacz okno powiadomieniaDeaktywujWyÅ‚acz zmiane czÄ™stotliwosciWylacz wykrywanie RSIDWylacz, jesli flrig nie jest uzywany.Wylacz na bardzo wolnym CPU gdy sygnaÅ‚ przeglÄ…darki nie jest uzywanyWylacz na wolnym CPU gdy sygnaÅ‚ przeglÄ…darki nie jest uzywanyWylacz detektorWyswietlWyswietl RX jako przewijana markizeWyswietl RX w odwrotnym wideoWyÅ›wietl dziennik, czytaj go na starciePokaz nazwe makra przy starcieUstaw TX i RX w oknie glównym fldigi. Zmiana wymaga restartu fldigiWyswietl czas w milisekundachWyswietl opóznienie nadawania w milisekundachNie zmienia sie automatycznie na czÄ™stotliwosci RX RsIDNie pokazuj okna ostrzezen RsIDNie uzywaj bazy danychNie uzywaj przeglÄ…darki internetowej do wyszukiwania znakuDokuj oscyloskopTlumienieNie zapisujStosunek kropki do kropkiPrzeciÄ…gnij wodospad na skali czÄ™stotliwosciKolor duplikatuSprawdzaj duplikatyDuplikatyEeQSL-odebr.eQSL-wysÅ‚Echo wiosÅ‚a znaków do panelu RXZmniejsz szerokość krawedziKsztaÅ‚t krawÄ™dziCzas krawÄ™dziWbudowany Wefax GuiUsuwa dokumenty KML podczas uruchamiania programu.WlaczWlacz -Aktywuj / deaktywuj ikony w menuAktywuj / deaktywuj podpowiedziWlacz ARQWÅ‚acz ARQ dla programów obsÅ‚ugujÄ…cych protokól TCP i fldigi ARQ WÅ‚acz KISS dla programów, które wspiera UDP i TNC -2 KISS protokol Tylko jeden interfejs (ARQ /KISS) może byc aktywny w danym czasie. Zmiana adresu IP i numeru portu wymaga restartu fldigi.Włącz kanaÅ‚ zajetyWlacz CSMAWlacz DSP przed dekoderemAktywuj transmisje danychWlacz GPIO PTT (kontrolki specyficzne dla Pi)Wlacz HistogramWlacz Histogram monitorowania sygnaluWlacz KISSWłącz LO/HI bfp z transmisja dzwiekuAktywuj MultiPSK zgodny z FECWlacz plik dziennika UDPWlacz wyjscie PTT WinkeyeraWlacz dźwiÄ™k WinkeyeraWlacz kluczowanie tonem WinkeyeraAktywujWlacz pole wyboru, by pokazac mozliwe sterowanieWlacz odstepy miÄ™dzy znakamiAktywuj przeciagniecie kursora na skale wodospaduWlacz kodowanie/dekodowanie szczatkowego sygnalu pilotaWłącz sterowanie Tx flrig z fldigi jako klientAktywuj jedno klikniecie - zaznaczenie tekstu w panelu RxWlacz dla bardzo slabych sygnalówUstaw gdy komputer nie dekoduje poprawnieAktywuj automatyczne odstepy miedzy znakamiAktywuj transmisje tekstu rxAktywuj transmisje znaków 8PSKWłącz przy pierwszym uruchomieniu FldigiUstaw to dla znaków diakrytycznych Latin-1 Aktywuj transmisje znaków UTF-8 Aktywuj to do znaków UTF-8Włącz aby wysÅ‚ać ton start/stopWstrzymaj TX na wykrytym sygnaleWlacz aby umiescic panel Tx wyzej panelu RxWlacz aby wybrac zakres datAktywuj, gdy oba programy uzywajÄ… tego samego adresu IPAktywneAktywuj - zapis QSO uzywajac znacznika czestotliwosci Deaktywuj - zapis QSO uzywajac znacznika czestotliwosciAktywuj - uzyj Znak/Spacja filtr wyjsciowy Deaktywuj- uzyj pseudo sygnalówKoniec liniiKoniec ID xmtWprowadz adres URL internet danych METARWstaw QTC tekstWpisz peÅ‚na sciezke, pliku flmsgWpisz peÅ‚na sciezke, pliku flmsgWpisz peÅ‚na sciezke, pliku flmsgWpisz peÅ‚na sciezke, nazwe pliku flmsgWpisz peÅ‚na sciezke, pliku flmsgWpisz peÅ‚na sciezke, do pliku flirgWpisz peÅ‚na sciezke, pliku tqslWpisz peÅ‚nÄ… sciezkÄ™, folderu cty.datWpisz ciÄ…g testu lub zostaw puste - domyslne:Wpisz zakres czasu w minutachBladParzysteLinie parzysteParzyste linieWydarzenieRejestr zdarzenNr. kontrolny odbr.Nr. kontrolny wyslanyNr. kontrolny odbr.Nr. kontrolny wyslanyWstaw plik exeWykonajWykonaj polecenie na pliku KML.Wykonaj skrypt pliku: %sWyjdzZamknij podpowiedzi EksportujUstaw EksportEksportuj zapisy do LoTWEksport do pliku ADIFEksport do pliku CSVEksport do pliku tekstowegoEksportuj...Rozszerz ostatniÄ… dit/dot w ms domyÅ›lnie = 0Dodatkowy czas trwania do pierwszego dit / dot w milisekundach domyÅ›lna = 0Wypakuj pliki do uzycia zewnÄ™trznym programem (wrap/flmsg)Skasuj tekst kanalu po sekund bezczynnosciF-WPMKlasa FDSekcja FDFECProces FFTUsrednij FFTFFT okno funkcji filtru wstÄ™pnegoPliki FLMSG...FSKInterfejs FSKFSK PTTFSK portF_kluczFahrenheitKluczowanie Farnsworth (0 = nic) domyÅ›lnie = 0Katalog docelowy obrazów FaxuNie pomijaj zadnych stron lub zamknij kreatora w dowolnym momenciePanelDzien sportuZnak Field Day Może być taki sam jak znak OPField Day KlasaDziennik Field DaySekcja Field DayOdebrana klasa Field DaySekcja Field Day odebranaTylko plik I/O Pliku nie znalezionoBłąd odczytu plikuPlik:PlikiWypeÅ‚nij Kraj / Azymut za pomocÄ… info cty.datFiltrFiltr wyjÅ›ciowy FFTWspólczynnik przepustowoÅ›ci filtruPrzepustowosc filtruWspólczynnik przepustowosci filtruFiltr przepustowosci wzgledem szerokosci sygnaÅ‚uFiltracjaZnajdz kraj:Szukaj nastepnySzukaj prefiks:Szukaj poprzedniSzukaj:KoniecW odstÄ™pach czasuKonfiguracja Fldigi...Konfiguracjakreator konfiguracji FldigiPlik definicji makro Fldigi *.mdfPaleta Fldigi *.palFldigi plik definicji rig xml *.xmlFldigi na stronie web...OscyloskopFlrig I/Oklucz modemu PTT w FlrigOprózniaj bufor TX po okresie zajetosci kanaÅ‚u gdy zajÄ™ty kanaÅ‚ pozostaje wl (TX zablokowany)FolderyCzcionka:Kolor czcionkiCzcionkaKolor /czcionkiCzcionka:Ustaw RST odebr/wysl na 599/59Wymuszenie okreslonej czÄ™stotliwosci próbkowania Wybierz"Native" jeÅ›lii "Auto" nie dziaÅ‚a z urzÄ…dzeniami audio.Wymuszaj wielkie litery w polu znak stacjiOdstep kanalów do 100 Hz Ustaw data/czas startu == data/czas zakonczeniaDarmowy bezstratny Audio Kodek *.flacDarmowe dziÄ™ki uprzejmoÅ›ci obsÅ‚ugi OKCzÄ™stCzestotliwoscCzestotl./MiernikCzÄ™stotliwoscCzestotliwosc w MHzSkala czÄ™stotliwosciPrzesuniÄ™cie czÄ™stotliwosci (800 Hz)WszystkoPeÅ‚ny raportGPIOOgólneBlad OgólnyGenerujUtwórz 1000 Hz sygnal prostokÄ…tny na prawym kanaleWygeneruj sygnaÅ‚ prostokÄ…tny na prawym kanaleGrupa 1Grupa 2Grupa 3Hamcall.netHamlibHamlib do sterowania rigCzekajHanning/Blackman - Uzyj krawedzi czasu BPF - uzyj przepustowoÅ›ciSprzetowe PTTStacje sÅ‚yszaneLog nasÅ‚uchuWysokosc paska makroParametry Rx HellParametry TX HellUkryjUkryj okno nadawaniaUkryj okno nadawania domyslnieUkryj okno po (s):WysokiGórna granica czÄ™stotliwosci w HzHost:II/OIDNadaj IDIFKPIFKP Raw ObrazIOIOTAAdres IP Numeru portuIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostStrefa ITUITUZCzas przed wysÅ‚aniem danychIgnoruj duplikatyObraz LPFOdbrLimit czasu nieaktywnosciCale Hg.Obejmuje czestotliwosc nadawaniaUstaw datÄ™ koncowa eksportuInfoWstrzymaj 7-bitowy modem na komende użytkownika lub recepcje RSIDWstrzymaj 7-bitowy ModemOpóznienia zapisu (ms)PoczÄ…tkowy stan DTRPoczÄ…tkowy stan RTSWstÄ™pne napiÄ™cie na DTRWstÄ™pne napiÄ™cie na RTSInicjalizujInicjalizuj interfejs RigCATInicjalizacja interfejsu hamlib Inicjalizacja H/W interfejsu PTTInicjalizacja pól logowania QSOInicjacja gniazda klientaPrzesuniecie nosnejWstawianie bajtów NRS LTRS na poczÄ…tku każdej transmisjiWstaw znacznik tekstu RX przed zmianÄ… czÄ™stotliwosci i modemuWstaw tekst domyslnyWstaw plik...Wstaw peÅ‚ny raport METARWstaw zero w nadawanym numerze kontrolnymWstaw znacznikWstaw specjalny tekst w panelu Rx po kliknieciu wodospaduWstaw tekstWstaw tekst pojedynczym lewym kliknieciemOkres integracji (bloki FEC)NotatkiPrzeplot SYNOP i tekstuPrzeplataj tekst dekodowanej wiadomosci SYNOP, lub wymiany.NieprawidÅ‚owy indeks nazwy pliku (NULL) w funkcji %s:%dNieprawidÅ‚owy Modem do KISS IONieprawidlowy parametr funkcji 'char *file_name_path' (null)Nieprawidlowy parametr funkcji (wewnetrzny bÅ‚ad inny niz skrypt)NieprawidÅ‚owy parametrWyspaProblemy zgÅ‚oszone podczas przetwarzania pliku skryptu: %sJOTAJOTA/SzkoÅ‚aJamboree OTAKonfiguruj Elecraft K3KISSUstaw KISSKMLStyl balonu wyswietlania KMLKML balon w postaci zwykÅ‚ego tekstu lub HTML, w prostych tabelach lub macierzach.Katalog plików KMLKML czÄ™st. odswiezania ( sek )Główny plik KMLWlaczony serwer KML (On / Off)KluczKeyerTryb kluczaWspolczynnik kluczowania domyslnie = 3.0Waga kluczowania domyslnie = 50Wiek dzieckaJasność LEDLokLoTW-odebr.LoTW-wysÅ‚LTRS na starcieOstatnie QSOOpóznieniewprowadzLeadin w ms domyÅ›lnie = 0PoczÄ…tkowe i koncowe czasy narastania krawÄ™dzi (msek)Pozostaw to pole puste lub odnosi sie do http://www.pulseaudio.org/wiki/ServerStringsLewy i prawy kanaÅ‚ oba zawieraja audio modemuKliknij lpm by wyczyscic tekst Kliknij ppm, aby zresetowac czÄ™stotliwosciKliknij lewym przyciskiem myszy, aby wybrac kolor duplikatuKliknij lewym aby wybrac kolor duplikatuKliknij lpm: zmiana trybu Kliknij ppm: konfigurujKliknij lewym lub prawym by uzyskac historie audioLicencja GPLv3: GNU GPL wersja 3 lub nowsza To jest wolne oprogramowanie: możesz dowolnie modyfikować i rozpowszechniać it. Nie ma ZADNEJ GWARANCJI, w zakresie dozwolonym przez prawo. Aktywne przyciski podswietlane koloremOgranicz AFC do zakresuOgranicz do kilku znaków jak w CQEM lub IOTA itpLinia: %d Blad:%d %s (%s)SÅ‚uchaj/PowiazSluchaj sygnalów w tym zakresieLkLoTWPrzeglad LoTWPobierz plik z LoTWData odebr. z LoTWData wysl. na LoTWLadujZaÅ‚aduj nowÄ… paletÄ™Zaladuj plik obrazu ZaÅ‚aduj ostatnio uzywane makroZaÅ‚aduj lub upusc plik obrazu pliki (PNG, JPEG, BMP)Laduj...LokSzukajSzukaj plik binarnySzukaj plik cty.datSzukaj plik exeSzukaj flamp exeSzukaj fllog exeSzukaj flmsgSzukaj flmsg exeSzukaj flnet exeSzukaj flrig exeSzukaj program #1 exeSzukaj program #2 exeSzukaj program #3 exeZlokalizuj plik wykonywalny tqslLokalizacjaLokatorWlaczBlokuj czÄ™stotliwosc nadawaniaDziennikZapisz info do pliku ADIFZapisz info NAVTEX do KMLLog czÄ™stotliwosci RTTYZapisz info Wefax do pliku AdifLog tekstowy wszystkich RX/TXZaloguj siÄ™ do pskrep po uruchomieniu fldigiLog podstawowyDziennikDziennikLogowaniePanel kontrolny LoguLog komunikatów do JÄ™zyka Znaczników Keyhole (Google Earth, Marble, Gaia, itp...)Dlugi odbiór integracjiPoszukaj stacjiUzytkownik LotWNiskiLow = zero bledow Medium = 1 blad High = 2 bledyNiski filtr odcieciaDolna granica czÄ™stotliwosci w HzNiski ton przy 500 HzNizszyDolna granicaNajnizsza czÄ™stotliwosc na dole przeglÄ…darkiPolaryzacja znakuKod ID stacji METARMETAR stacja lokalizacjaObraz MFSKPlik obrazu MFSKMT-63MYCALL Dopasuj w przeglÄ…darceNadaj malymi literamiMYCALL wykryj wavMacLoggerMacLoggerEtykieta przycisku makroEdytor czcionki makrTekst makroEdytor makro - MakraLokator na przykÅ‚ad JO93xqAtrybuty Mail ServerStrojenie rÄ™czneZnakZnak polaryzacjiOznacz czÄ™stotliwość w hercachTylko znakOznacz ostatnia czÄ™stotliwosc i emisjeZnak -SpacjaZaznaczony tekstDopasujDopasuj zapisy w dzienniku z plikiem z LoTWDopasowane FiltryDopasuj filtr pasmaMaksymalny stan dolnego indeksuMaksymalna liczba wierszy dla uzyskanego obrazu faksuMoze wymagac zmiany rozmiaru panelu Rx/TxSredniBłąd alokacji pamiÄ™ci (wewnÄ™trzny błąd inny niż skrypt)Scal plik ADIFScal...Rejestrowanie komunikatowKolor miernikaMil / GodzinaMiliSekundMin. Liczba trafieÅ„Min WPMMinimalne kontroleMinimum # sygnalu detektoraMinimalne ustawienie WPM domyslnie = 10Minimalny dystans dla wÄ™złów aliasów ( Metry )Minimalny dystans dla aliasów podzialu (w metrach)Minimalny czas miÄ™dzy zdarzeniamiRozneRóżneBrakujÄ…ce polecenie %s po linii %dBrakujace oferty sparowane (")EmisjaTryb opóznienia (msek)Tryb pracyEmisje muszÄ… byc zgodneLimit szerokosci emisjiTryb RegModemMargines przepustowosci modemuModemSygnaÅ‚ modemu na lewym i prawym kanaleModemMonitor polaczenia TCPMonitor sygnalu, zakres i marginesyMonitoruj nadawany sygnalMyszAktywne kółko myszy na przyciskach makr Msek po keydown ( + wczesniej w czasie)Msek pre-keydown ( jest wczesniej w czasie)Milisekund miÄ™dzy próbamiMilisekund miÄ™dzy kolejnymi komendamiWielokanalowa obróbka sygnaluWielokanaÅ‚owy detektorMoja klasaMy JOTA TroopMoja sekcjaMoja stacjaMy TroopMój znak STACJIMoje nadawanie CW WPMNN3FJP DX spots N3FJP Adres IP: Port serwera N3FJPDziennik N3FJPNBEMSPlik danych interfejsu NBEMS Pliki NBEMS...BRAK URZÄ„DZEN AUDIO (lub testu)NIE USTAWIONO ZNAKU STACJIImieImie-RImie-SWÄ…skie LPF, gdy obraz zakloconyNavTÅ‚umik kanaÅ‚u nawigacyjnego 1Nav FSK MARK PolarityNav FSK PTT - powinien zawsze być włączonyBity stopu nawigatora FSKSzybkość transmisji FSK NavTon boczny FSK nawigatoraDioda stanu NavCATTÅ‚umik kanalu nawigacyjnego 2Jasność NavLEDTÅ‚umik NavRFNawigator konfiguracja portuPort szeregowy nawigatoraNowyNowy rekord / Zapisz rekordNastepnyNieBrak blÄ™dówNie szybciej niz Nie podano nazwy plikuBrak zapisów na lotw do pobraniaNie wolniej nizWidok okna nadawania po okresie nadawaniaBrakNormalnyPrÄ™dkosc spadku wodospadu / wartoscNie znaleziono pliku skryptu / znacznikaNie zaliczonyNotchUwaga: Pozycje te sÄ… przydatne do konfiguracji, ale nie wyjÄ…tkowe do uzycia fldigi na urzÄ…dzeniach z ekranem dotykowym, takich jak tablet.UwagiOkno powiadomieÅ„ zamyka siÄ™ po XX sekundach;^j0 == dialog pozostaje otwartyPowiadomieniaTylko informujPoinformuj o przekroczeniu czasuLiczba i pozycja pasków makroLiczba cyfr w numerze kontrolnymLiczba godzin przechowywania danych dla wÄ™zÅ‚a. Zero oznacza, utrzymuj wszystko.OOKWÅWl - Styl marquee Wyl - Wyczysc & restartWL - przeszukaj caÅ‚y wodospad WYL- Ogranicz wyszukiwanie do+/- 200 HzWL - mala czcionka WYL -duza czcionkaWL - rozpoczyna domyslnie WYL - zachowaj aktualna pozycje kursoraWL - wykorzystaj ostatni zestaw makr WYL - uzywaj zestawu domyslnegoOSSNie parzysteLinie nieparzysteNieparzyste linieOlivWl/WylPowyzej okna Rx/TxPowyzej wodospaduPonizej wodospaduDokumentacja online...EmisjaOtwórz...Otwórz listeOtwórz plik w domyslnej przeglÄ…darceOtwórz w przeglÄ…darceOtwórz plik dziennikaOtwórz plik makroOtwórz folder wiadomosciOtwórz wiadomosc z flmsgOtwórz paletÄ™Otwórz plik rig xmlOtworz squelch dla nn sek jeÅ›li RSID jest wykrywaneOtwórz w flmsgOtwórz...Otwórz folder pliku NBEMS po pomyslnym przechwyceniuOperacja tqsl w trybie wsadowym (bez okna dialogowego)OperatorPasmo operacyjneDane OperatoraOperator stacjiOperator stacji:ImiÄ™ operatora:Znak operatora (jeÅ›li jest inny niz znak wywolawczy stacji)Operator zaliczonyQTH operatorówWiek operatorów otrzymanyImiona operatorówopcjonalna konfiguracja w formacie: param = val...OpcjeInneWyslDane wyjÅ›cioweWyjscie numeru portu, gdy jest ten sam adres IPWyzszyNad zapisem funkcji wywoÅ‚ania zwrotnego dla "%s"MOCPSKPSK ReporterPSK et al.PSK reporterPSK/RTTY PrzeglÄ…darka HiLite Kolor 1PSK/RTTY PrzeglÄ…darka HiLite Kolor 2PSKmailPSMPSM zÅ‚agodzenieHistogram Progu PSMPTT ONOpóznienia NIM dla wszystkich typów CAT/PTTZródlo dźwiÄ™ku PTTKoniec nadawania - opóznienie PTTPTT jest poleceniem CAT (nie sprzetu)Ton PTT na prawym kanale audioPakiet komend PTT hamlibPTT przez i PTT poprzez komendy pakietu hamlibPWR- pomiarPaletki DogEcho paddlePróbkowanie Å‚opatkowe (patrz instrukcja Winkeyer) domyÅ›lnie =50Paleta:Parametr nie prawidÅ‚owy.ParytetAnalizuj wszystkie przychodzÄ…ce tekstyCzÄ™sciowyPodany parametr nie jest oczekiwanego typu.HasloWklejSciezki (ukryte)Procent (%)TrwaloscWybierz szybkosc transmisji z listySygnal pilotaMoc sygnaÅ‚u pilota w stosunku do sygnaÅ‚uOdtwórz historie, gdy wybrano aktywny kanal OdtwórzPowtarzac odtwarzanie?UrzÄ…dzenie odtwarzajaceOdtwarzanie nagranego dźwiÄ™kuProszÄ™ ustawić swój znak w pierwszej kolejnosci.InterwaÅ‚ ponawiania (msek)Informacje Popup po 2 sek po najechaniu na znakPortPort:PortAudioUstaw zestaw makr 4 barów pod panelem Tx DomyÅ›lnie powyżej panelu RxNapisz post z opóznieniem (msek)Post-keydown czas (ms)Monitor mocy sygnalu Skala mocyPrPre-sygnaÅ‚ dzwiÄ™kowyPre-keydown czas (ms)Wykrywanie preambuÅ‚yPierwszeÅ„stwoNacisnij tylko wtedy, gdy zmienisz adres/portNacisnij przycisk return, aby kontynuowac wyszukiwanieDrukuj CW / RTTY / THROB / CONTESTIA malymi literamiProg 1:Prog 2:Prog 3:Monituj o zapisanie konfiguracjiMonituj o zapisanie dziennikaMonituj o zapis dziennika przy wyjsciuMonituj o zapisanie pliku makraProsignsProwincjaStacja zaliczona z Prowincji Pseudo-FSK prawy kanalPseudo-FSK na prawym kanale audioPskmailKsztalt impulsuSzerokosc impulsu (msek)PulseAudioWatQRZQRZ cdromQRZ.comQRZ/eQSLQSKQSK na prawym kanale audioQSLData odebr. QSLQSL odebr. w dniuQSL droga laczenia stacjiData wysl. QSLQSL wysylana w dniuQSL-VIAQSL-odebr.QSL-wyslanaQSOData QSOData zakonczenia QSOData QSOZapis QSO QSO nie mozna powtorzyc w okresieQSOp KategoriaStan QSOQSYQTC:QTHPseudonimQthZapytanie o stan nanoIOCichyTryb cichy [-q], nie otwieraj okna dialogowego tqslRE:REGEX wykryte wavTÅ‚umik RFRPCOdbiór RSIDRST 599/59RST odebr.RST wysl.RST(r)RST(s)RTS +12RTS +12 vRTS = +VRTS - sygnal linii PTTRTS jest linia PTTSterowania przepÅ‚ywem RTS/CTS RTTYZakres wyswietlania RTTY RTTY jako USBPrzesuniecie Rx Przechwyt RXRX ppmKorekcja karty dzwiÄ™k RX RX tekst QSO wprowadzanie danych jest ograniczone przez znaki nie-sÅ‚owa zdefiniowane tutaj. Tabulator i nowa linia sÄ… automatycznie dolaczaneCzestotliwosc RFPodniesiony cosinus ksztaltu impulsu ZakresZakres +/- wpmZakres 1 ... 3Zakres 1 ... 4Ustawienie zakresu WPM domyslnie = 25WspolczynnikOdczyt czcionek....Czy na pewno usunac rekord "%s"?OdbiórUzyj Odbr.Szerokosc filtru pasma odbioru Emisje RXSynchronizuj RxOdebrano maksymalnÄ… liczbÄ™ wierszy fax (5000)Otrzymano nazwÄ™ scoutaOdebrany numerOstatnia aktywnosc lokatoraOdbior pliku flmsgRaporty z recepcji ...Podłącz ponownieNagraj oba kanalyLiczba QSOProstokÄ…tnyReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Odswiez przedzial czasu zapisu w pliku KML (w sekundach)Dopasowanie Regex w przeglÄ…darcePrzeladujPrzeladuj cty.datKasujUsuwanie rozmowy po...Odtwarzanie sciezki dzwiekowejRaport ramek ARQ PrzeglÄ…darka raportowZgÅ‚aszanie faktycznej czÄ™stotliwosci modemu RFSprawdzaj czestotliwosc poprzez rig ( tylko gdy masz Rig!)RaportyResetujZresetuj bloki FEC przy zmianie BW lub tonówResetuj wszystkie opcje do ich wartosci domyslnych? Zresetowane opcje zostanÄ… uwzglÄ™dnione przy nastÄ™pnym uruchomieniu Pliki: fldigi_def.xml i fldigi.prefs zostana usuniÄ™te Ustaw czestotliwosc (nosna)RestartPrzywróć ustawienia UART przy zamkniÄ™ciuDomyslny folder cty.datPrzywróc domyslnePrzywróc ustawienia portu szeregowego (COM) Zachowaj czÄ™stotliwosc blokady TX (Lk ) przy zmianie czÄ™stotliwosci RX RsIDZapisz blokade czest. TX PróbKopiuj danePobierz dla aktywnego modemuInterwaÅ‚ ponawiania (msek)InterwaÅ‚ ponawiania (ms)Powrotne polaczenie KISS TCP IO w nasluchuUstawia adres IP i port numer na wartosc domyslnÄ….OdebrOdwrócOdwróc lewy/prawy kanalNegatyw VideoPrzywróc przesuniecie znakówPrzywróc przesuniecie znakówPrzejrzyj / edytuj wyeksportowany plik adif LoTWPrzejrzyj plik lotw.adif przed wyslaniem z tqslRigUstaw RIGPlik opisu RigTryb RigRig lub interfejs Echos portu szeregowegoRig wymaga ustawienia przeplywu RTS/CTSRig wymaga Xon/ XoffRig korzysta z RTS/CTSKontrola Rig/LogRig:RigCATRigCAT uzyty do sterowaniaPrawy kanaÅ‚Prawo / Lewo Wybierz najmniejszy cyfrowy rasterPrawo/Lewo = 1 x LSD Góra/Dól= 10 x LSD Shift - Prawy/Lewy = 100 x LSD Shift - Góra/Dól = 1000 x LSDZakres WPMRsIDAlarm dzwiekowy RsID wavWykryty RSIDRST odebr.RST wyslaneUruchom programUruchom program:RxRx / Tx PanelRx AGCWysokosc Rx w pikselachParametry RxRx Numer #Tekst RXRx WPMRx Mnożnik szerokoÅ›ciTÅ‚o RxCzcionka RxRx/TxZestaw znaków Rx/TxRxID waskiRxID szerokiS-metrZachowanie S/N i IMDWYBOPUSCDekodowanie SOMSQL-1SQL-2SS SprawdzSS precSS SekcjaSS ser #SYNOP do ADIFSYNOP do KMLProbkaCzÄ™stotliwosc próbkowaniaZapiszZapisz...Zapisz konfiguracjeZapisz odebrany tekst, do nastÄ™pujÄ…cego pliku: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Zapisz jako...Zapisac zmieniony Logbook?Zapisac zmiany konfiguracji?Zapisac zmienione makro?Zapisz obraz jako plik monochromatycznyZapisz wpis w dzienniku?Zapisz plik dziennikaZapisz plik makroZapisz paletÄ™Zapisz tekst jakoZapisz obraz faksu jako szary plik PNG.Zapisz paletÄ™Zapisz...Skala kolorówRunda SzkoÅ‚a UpSzkoÅ‚a Round Up - dopuszczalne I, H, O - zobacz zasadyOscyloskopScout Op'Nazwa operatora SkautaPliki skryptowBlad alokacji klasy skryptu podczas analizy (%s)Nie znaleziono skryptu Å›cieżki urzÄ…dzenia .Plik skryptu zawiera potencjalne problemy Szczególowe informacje można znalezc w dokumentacji i / lub pliku dziennika.Nazwa pliku skryptu (Å›cieżka) jest nieprawidÅ‚owaNazwa pliku skryptu (Å›cieżka) zerowy wskaźnikPrzewinPrzewijaj podpowiedziSzukaj tego znakuSzukaj w internecieZakres wyszukiwania ( Hz)Pasmo przepustowe wyszukiwaniaDrugi tekstSekundSekcjaWybierzWybierz # bity / znakWybierz # bity stopuWybierz wszystkoWybierz Cabrillo Zawody & PolaWybierz pole do EksportuWybierz zapis jako QSO lub konkursWybierz PTT na stanieWybierz Rekordy do eksportuWybierz zestaw znaków Rx/Tx Wybierz czcionkÄ™ rastra TX Wybierz TagWybierz pasmoWybierz szybkosc transmisjiWybierz przesuniÄ™cie nosnejWybierz urzÄ…dzenieWybierz sposób wykorzystania rolki myszki zachowanie wewnÄ…trz wodospaduWybierz linieWybierz tryb dostÄ™pu do menuWybierz liczbe tonówWybierz parytetWybierz numer PINWybierz plik deskryptora rigWybierz filtr wstÄ™pny typu FFT Wybierz te opcje, dla Elecraft K3 Pozostale radia tego nie wymagaja.Wybierz czcionkÄ™ skali wodospaduWybierz plik wavKolor tla w panelach Tx/ RxTransfer bezposredni ma pierszenstwo przed wszystkimi innymi ustawieniami odbioru flmsgOrganizuj MapowanieWyslijNadaj krotkie CWNadaj znak CW na koncu transmisjiWysylaj dane QSO do LoTW po zalogowaniuNadaj strumien znaków testowychNadawaj jako WPMNadaj sygnal co...WysyÅ‚aj staleWysylanie strumienia danych bezpoÅ›rednio do flmsgNadaj obrazNadaj obraz...WyÅ›lij lotw.adif przez tqslWyslij raport podczas zapisu QSOWyslij raport tylko wtedy, gdy zalogowano QSOWyslij tekst rx do pliku: textout.txtWysÅ‚ane i odebrane faksy sÄ… zapisane w pliku AdifWysylane znaki w panelu Rx/TxWysÅ‚ano nazwÄ™ scoutaLiczba wysÅ‚anaNr NoRNr odebranyNr wyslanyPort serw.Numer # odebr.Numer # nadanyInterfejs szeregowyPort szeregowy echoCiÄ…g znaków serweraZestaw - znacznik logiczny wysoki odczyt z nanoIOSet >0 jeÅ›li zastosowano pulsacyjny PTTUstaw poziom blokady szumuUstaw poziom dobrego widokuUstaw liczbÄ™ znaków w wierszuUstawiony typ resampler uzyÅ‚ skorygowania zrównowazenia Ustaw poziom na wartość x theshold powyzej poziomu halasuUstawUksztaltowany TxKr. sekwencja wstÄ™pnaKrótki opis antenyPokazPodmioty DXCCPokaz czas TXPokaz okno alarmu:Pokaz wszystkie emisjePokaz i włącz przycisk zasilania monitora sygnalu (PSM)Pokazuj przepustowosc sciezki na wodospadziePokaz multi kanaÅ‚yPokazuj kursor z liniami szerokosci pasma Pokaz kursor z linia srodkowaPokaz mniej emisjiPokaz makro z kodami sterowaniaPokaz edytor makroPokaz mniej lub wiÄ™cej wodospaduPokaz ikony menuPokaz hasÅ‚o jako tekstPokaz podpowiedziPokaz sygnaÅ‚ nadawania na wodospadzieTon bocznyWstÄ™ga boczna:SygnaÅ‚ bocznegoSyg/kolPrzegladarka sygnalowKolor Poziomu SygnaÅ‚uSygnaÅ‚ z czasem usredniania 0 - najmniej 4 - najwiecejPrzeglÄ…darka sygnałówPoziom sygnaluZakres sygnalu (dB)Szukaj sygnaluSciezki sygnałówPojedyncze makro panelu logowania poniżej paska zmienna wysokoscKliknij, aby uchwycicRozmiar:PominiÄ™te znaki w panelu Tx (Tx wl./wyl. w CW)Wyswietl narastanie wyzszych czÄ™stotliwosciWyswietl narastanie nizszych czÄ™stotliwosciKolor suwaka blokady szumówSlot czasowyWolne (4 ms) | Sred (2 ms) | Szybkie (1 ms) | Trudne kluczowaniePowolny CPU ( mniej niż 700MHz )Powolny spadekDekodowanie Soft-bitoweDekodowanie symbolówOdwrócenie programowe lewy-prawy kanal audioNiektóre zmiany dokonane przez skrypt wymagajÄ… programu uruchom ponownie zanim stanÄ… siÄ™ aktywne.Sortuj wedÅ‚ug Daty/czasu zakonczeniaSortuj wedÅ‚ug daty i czasu zak. - wszystkie raporty ADIF/ CabrilloKarta dzwiekowaKarta dzwiekowa FSKDźwiÄ™k:Sygnalizator akustycznyTylko SpacjaZnaki specjalneWidmoZakres widma/interakcje wodospaduZakres spektrumPrÄ™dkosc (WPM):SpotWtyczkaSpottingSpot wyłączonyBlokada szumuPoziom blokady szumuOtwarcie Squelch (sek)StStartData rozpoczÄ™cia Data rozpoczecia eksportuStart flampStart fllogStart flnetStart flrigRozpoczÄ™cie nadawania - opóznienie PTTStart prog1Start prog2Start prog3Numer startowyStanPaÅ„stwo QSO PartyPanstwo musi siÄ™ zgadzacStacja / operatorZnak StacjiZnak stacjiLok StacjiLokator StacjiLokator Stacji:QTH StacjiQTH StacjiZnak stacjiStacje sÅ‚yszalem dwukrotnieSiatka kwadratówStatusData koncowaBity stopuBity stopuTryb magazynu i czÄ™stotliwosci Kliknij ppm na liscieStrumieÅ„ tekstuPrzeslij kazde QSO jako zalogowanePrzeslij hasÅ‚o przy kazdym przeslaniuPrzeslij plik adif do LoTWWykonanie nie powiodÅ‚o siÄ™ (wewnÄ™trzne).Tworzenie Sunspota w toku!ZamianaZamien lewe / prawe kontakty klawiszaUstalone miejsceUstalone miejscePrzełącz do ARQ I/OSynopKolor systemowyDomyslneT/RTCP/IPTransmisja danych TCP/IPTHOR obraz RawTTYPrzesuniecie Tx Opróznij bufor TX (Minut, 0 = Wylacz)Moc TxTX WPMTX czas gotowoÅ›ci (min)Generuj TX TX offsetTX ppmKorekcja karty dzwiÄ™k TX Kolor kartKartyZródla danych tabelarycznychOgonGÅ‚osGniazdo gÅ‚osowe (tylko MS)TemperaturaDziesięć z DziesiÄ™ciu otrzymanych numerówTestSygnal testowyTestowe znakiZnaki testowe do regulacji QSKTestuj polecenieTest pliku tekstowegoTest...Przechwytywanie tekstuKolor tekstuPodswietl tekstTekst IOTekst Tagów (tagi uzyj {} ograniczniki )Kolejnosc przechwytywania tekstuWstaw plik tekstowyTekst i/oTekst do wyslania, podczas bezczynnosci klawiaturyTekst...To szalone lis przeskoczyÅ‚ nad psem ponownie! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~Tresc wiadomosci i powiadomien RsID Parametry wyswietlacza skonfigurowano na "Powiadomienia".Domyslna szybkosc CWNazwy pliku sÄ… zapisywane w obszarze tekstu RXPole wyrazenia regularnego nie moze byc puste.Wyrazenie regularne musi byc wazneOpis zostanie zastÄ…piony obecnym modem i czÄ™stotliwosciaTest nie pasuje do tego wydarzenia wzorca wyszukiwania.Kreator poprowadzi CiÄ™ przez podstawowe ustawienia FldigiZnaczniki te mogÄ… byc wykorzystywane w Te zdarzenie jest wyrazeniem regularnym nieprawidlowym.ThorCzasCzas (y):Czas zakoncz.Czas rozpocz.KoniecCzas StartuKoniec QSOCzas roz. QSOCzas miÄ™dzy wycofaniem siÄ™ w msekWymagany czas:limit czasuLimit czasu xmt proba w XX sekundCzas ponadLimit czasu ( sek )KoordynacjaCzas trwania i QSKUstaw czasZ kim polaczenie zostanie nawiÄ…zanePrzelaczUstaw DTR dla PTTUstaw RTS dla PTTCzas trwania tonu (sek)Wlacz TonDzwiÄ™kiTouchSzybkosc CW w WPMSledzenieTransceiver FSKBezposredni transfer do flmsgSzybkosc transferu, X1 -normalnaNadawanieOpoznienie transmisjiMoc TXNadawanieNadaj znak stacjiCzcionka TxNadaj malymi literamiNadaj nizszy ton startuNadaj tryb IDEmisje TXNadawanie kropek (.) w czasie bezczynnosciMoc nadawaniaSygnal nadawaniaNadaj tekstNadaj wyzszy ton startuNadaj tekst videoNadawanie/OdbiórNadaje Diddle kropkÄ™ gdy nie aktywny klawiszTrójkÄ…tnyLimit wyzwalania (s):Troop-SStroj.Margines Strojenia (rozstaw czÄ™stotliwosci sygnalów)Schemat 1Schemat 10Schemat 2Schemat 3Schemat 4Schemat 5Schemat 6Schemat 7Schemat 8Schemat 9TxParametry TXMnoznik szerokoÅ›ci TxTx powyzej RxTÅ‚o TxCzcionka TxPoziom tÅ‚umienia Tx (dB)Moc nadajnika wykorzystywana do zapisu w loguTxIDUTransmisja danych UDPUDP/IPIUUI jÄ™zykUI schematBEZKIERUNKOWYStacja zaliczona ze stanu USAJednostka odlegÅ‚osci (QRB) USA USB serial I/ONie można utworzyć pliku %s (błąd No=%d) func %s:%dNie można otworzyć pliku %sUsuÅ„ zaznaczenie pola wyboru, jeÅ›li KML nigdy nie jest używanyNiezdefiniowany bÅ‚adNieukierunkowany odebrany tekstCofnijOsiÄ…gniÄ™to nieoczekiwany koniec pliku.Nieoczekiwany koniec parametru (args[]) lista znalezionychNieoczekiwany koniec listy wyboru parametrow znalezionychNiedopasowane rekordy LoTWUnshift na przestrzeniFormat nieobsÅ‚ugiwanyAktualizujAktualizuj wybrane pliki danych z repozytoriumAktualizacja nie jest dostepnaAktualizuj aktualny rekordWyzszyGórna granicaGórny poziom sygnalu (dB)Ustaw "cr cr lf" dla "cr lf"Uzyj '(' paren nie KNUżyj CD lub obrazu dysku CDUzyj filtru DSP przed dekoderemUstaw DTRZastosuj termin FarnsworthUzyj HamlibUstaw ZNACZNIK czest'Uzyj serwera audio OSSUzyj Otwórz, aby wybrac plik deskryptoraUzyj portu Audio ServerUżyj PotUzyj Pulse Audio ServerUstaw RTSUzyj RigCATUzyj T/N dla 0/9Usrednij, zmniejsz szum wodospaduStosuj kolorowe przyciskiUstaw przekroczenie zakresuUzyj daty/czas do wpisu w loguSluzy do wyzwalania nosnika wzmacniacza detekcjiUzyj zerUzyj portu równoleglego PTTUżyj hasÅ‚a do dostÄ™pu do tqslUzyj oddzielnego portu szeregowego PTTUzyj maÅ‚ej czcionkiUzyj soft- bit Viterbi dekodowania dla lepszej korekcji bledów Najlepiej aktywuj z dekodowaniem symboliUżyj soft-decision dekodowanie do wykrywania symboli Wspomaga dekodowanie soft-bitUzyj ich dla WinKeyera i nanoCWUżyj tej lokalizacji stacji tqsl Ustaw uHRouter PTTUzyj wave na sygnaÅ‚ TxUzywany pakiet programów dla PSKMail i fldigi Uzyte do BPQ32Stosowane, aby skorygowac agresywnosc TXID UzytkownikaInterfejs uzytkownikaUzytkownikKorzystaj z portu UDP #Aktywuj VSPOkres probkowania sygnalow (w milisekundach)Okres probkowania sygnalu w milisekundachRozwlekÅ‚yZweryfikujZweryfikuj baze danych za pomocÄ… pliku z LoTWZweryfikuj bazÄ™ danych za pomocÄ… pliku z eQSLWersja% s jest dostÄ™pna w Source ForgeVideoTryb Video IDPreambuÅ‚a wideo IDWidokWyÅ›wietl NiedopasowanePokaz/ukryj 48 makrPokaz/ukryj kanalyWirtualny Emulator Portu Szeregowego - brak ostrzezenWidoczne emisjeZobacz stronÄ™ internetowÄ… HamcallZobacz stronÄ™ internetowÄ… QRZZobacz stronÄ™ internetowÄ… hamQTHUWAGA - to zresetuje Twoje wszystkie ustawieniaWodospadPowieksz wodospadUstaw przesuniecieZapis wodospaduAmplituda wodospaduNosnik wodospaduSzybkosc spadu wodospaduWybór trybu wodospaduPoziom referencji wodospaduWFxUstaw WPMUstaw WPMSzybkość WPM dla ciÄ…gów poleceÅ„ Winkeyer DomyÅ›lnie = 18WXCzekajCzekaj na odpowiedz CATCzekaj na odpowiedz do nastepnego poleceniaCzekaj interwaÅ‚ ( msek ) przed odczytem odpowiedziUwagaWodospadWodospad / FFT / OscyloskopUstawienia wodospaduPredkosc spadku wodospaduWysokosc wodospadu w pikselachWodospad Video IDTekst wideo wodospaduWavPróbkowanie zapisu WavWaveform Audio Format *.wav Obraz odebranego faksu pogodyObraz nadanego faksu pogodySpecyfikacja zapytania o pogodeInternetWyszukaj w internecieWagaWaga (%)Waga maleje wraz wzrostem czasu krawÄ™dziAkcja kólka myszkiGdy nie wystÄ™puje sygnaÅ‚Wygenerowane dokumenty KML sÄ… przechowywane.RozciÄ…gnijNastÄ…pi po upÅ‚ywie tego czasu w sekundachPrÄ™dkosc wiatruWinkeyerWinkeyer kontrola WPMSÅ‚owa ograniczniki Zawijanie wierszyZapisz aktualny zestaw makr przy wyjsciu z programuOpóznienia zapisu (ms)Opóznienia zapisu (msek)Zapisz stan nanoIO do Arduino EEPROMXMITXMLBlokuj TxUstawienie transmisje Xon/XoffXY - klasyczny zakresXcvr Port szeregowyYTakUzywasz najnowszej wersjiMusisz miec zainstalowany program tqsl i zapisana jego lokalizacje aby dzialaly aktualizacje LoTW!Wymagany pÅ‚atny abonament na dostÄ™p do Hamcall on-lineWymagany platny abonament na dostÄ™p do QRZ on-lineTwój loginTwoje hasÅ‚o logowaniaTwoje hasÅ‚o do logowania tqslaapozawsze dołącz plik(i)dolacz # dyrektywe msgs do pliku o podanej nazwieautomatyczne wysylanie danychZnak podpowiedzi w otrzymanym tekscieKanaly != 1znakiCzysc wszystkobłąd alokacji cmd_buffer w pobliżu linii %dKonwertuj znak stacji na wielkie literyKonwertuj znak stacji na male literyFolder cty.datObecne warunki wxdomyslneDomyslny tekst, aby wysÅ‚ac z itpdomyslnie stosuj data/czas wlPrzycisk Display PSM na glowne oknowyswietl znaki ustawien Rx jako ciag znakow ASCIIeQSLUzytkownik eQSLwlacz sterowanie kółkiem myszy na pasku makroflamp:fllogfllog:flmsg *Interfejs flmsgodebr. dzwiÄ™k wavflmsg przekroczyl limit czasu wavflmsg.exe *.exeflmsg:flnet:flrigflrig jest to preferowana metoda sterowania tranceiveraflrig xmlrpc parametry serwera formanty te sÄ… dublowane na karcie konfiguracjiflrig:na przykÅ‚ad KMDQ dla Huntsville-Madison Lotnisko, ALdarmowy formularz 1 musi byc zgodnySwobodna forma wymianyskala freq = N * przepustowość modemuSterowanie PTTie: /home/co7wt/CALLBK lub C:/CALLBK Pozostaw puste, aby szukac w baziew:kilometry / godzinakliknij lewym przyciskiem na zakres spektrofotometru WFLewe klikniÄ™cie przenosi czÄ™stotliwość na czÄ™stotliwość Å›rodkowÄ… zakresuBlokuj WF na 1500 HzmbaryminutnanoIO Port szeregowynieZasilanie pilota (dB)print ^! wykonaj kody w panelu Rxwspółczynnik czasu rcos: 1.0 ... 2.0 W1HKJ najlepsze 1.275 DO2SMF najlepsze 1.500raportCelsjuszFahrenheitraport slupa rtecireport kilometrów na godzineraport mil na godzineraport milibaryraportywyÅ›wietlanie skali widma połączone z przepustowoÅ›ciÄ… modemusekundWybierz czcionke przegladarkiWybierz wedÅ‚ug datyWyslij po zalogowaniu (log przycisk, , )lokalizacja stacji tqsltqsl:Kolor sciezkinieznany bÅ‚ad pliku waveUzyjUżyj zakresu wodospadu/wartoÅ›ci granicznychwartoÅ›ci po lewej / poniżej wodospaduWodospad- tylko emisjeTon nadawania start/stoptak{NAME} inna nazwafldigi-4.1.06/po/Rules-quot0000644000175000017500000000337613472116044012415 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header fldigi-4.1.06/po/en@quot.header0000644000175000017500000000226313472116044013171 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # fldigi-4.1.06/po/Makefile.in.in0000644000175000017500000003552513472116044013065 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.17 GETTEXT_MACRO_VERSION = 0.17 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-4.1.06/scripts/0000775000175000017500000000000013515625027011540 500000000000000fldigi-4.1.06/scripts/mkappbundle.sh0000755000175000017500000000641513472116042014317 00000000000000#!/bin/sh ### Script to create the .app structure for osx ### 20080227 Stelios Bounanos M0GLD ### Updated 20080727: enable the .icns support ### Updated 20090525: add flarq ### Updated 20180201: deleted dmg sans dylibs upcase1() { sed 'h; s/\(^.\).*/\1/; y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; G; s/\n.//' } function copy_libs() { list="$1" while test "x$list" != "x"; do change="$list" list="" for obj in $change; do for lib in `otool -L $obj | \ sed -n 's!^.*[[:space:]]\([^[:space:]]*\.dylib\).*$!\1!p' | \ grep -Ev '^/(usr/lib|System)'`; do libfn="`basename $lib`" if ! test -f "Frameworks/$libfn"; then cp "$lib" "Frameworks/$libfn" install_name_tool -id "@executable_path/../Frameworks/$libfn" "Frameworks/$libfn" list="$list Frameworks/$libfn" fi install_name_tool -change "$lib" "@executable_path/../Frameworks/$libfn" "$obj" done done done } function bundle() { appname="${binary}-${appversion}.app" cd "$build" # bundle the binary echo "creating ${build}/$bundle_dir/$appname" $mkinstalldirs "$bundle_dir/$appname/Contents/MacOS" "$bundle_dir/$appname/Contents/Resources" cd "$bundle_dir" $INSTALL_PROGRAM "${build}/$binary" "$appname/Contents/MacOS" test "x$NOSTRIP" = "x" && ${STRIP:-strip} -S "$appname/Contents/MacOS/$binary" $INSTALL_DATA "$icon" "$appname/Contents/Resources" echo "APPL${signature}" > "$appname/Contents/PkgInfo" sed -e "s!%%IDENTIFIER%%!${identifier}!g; s!%%NAME%%!${name}!g;\ s!%%SIGNATURE%%!${signature}!g; s!%%BINARY%%!${binary}!g;\ s!%%VERSION%%!${version}!g; s!%%ICON%%!${icon##*/}!g;" < "$plist" > "$appname/Contents/Info.plist" if grep '%%[A-Z]*%%' "$appname/Contents/Info.plist"; then echo "E: unsubstituted variables in $appname/Contents/Info.plist" >&2 exit 1 fi $mkinstalldirs "$appname/Contents/Frameworks" cd "$appname/Contents" copy_libs "MacOS/$binary" } if [ $# -ne 2 ]; then echo "Syntax: $0 data-dir build-dir" >&2 exit 1 fi if [ -z "$PACKAGE_TARNAME" ]; then echo "E: \$PACKAGE_TARNAME undefined" exit 1 fi PWD=`pwd` data="${PWD}/$1" build="${PWD}/$2" bundle_dir="$APPBUNDLE" for d in "$data" "$build"; do test -d "$d" && continue echo "E: ${d}: not a directory" >&2 exit 1 done if ! test -w "$build"; then echo "E: ${build} is not writeable" >&2 exit 1 fi plist="${data}/mac/Info.plist.in" fldigi_icon="${data}/mac/fldigi.icns" flarq_icon="${data}/mac/flarq.icns" for f in "$plist" "$fldigi_icon" "$flarq_icon"; do test -r "$f" && continue echo "E: ${f}: not readable" >&2 exit 1 done set -e if test "x$WANT_FLDIGI" = "xyes"; then identifier="com.w1hkj.$PACKAGE_TARNAME" name=$(echo "$PACKAGE_TARNAME" | upcase1) # we'll use the first four consonants as the signature signature="$(echo $PACKAGE_TARNAME | sed 's/[aeiouAEIOU]//g; s/\(^....\).*/\1/')" binary="$PACKAGE_TARNAME" icon="$fldigi_icon" version="${FLDIGI_VERSION_MAJOR}.${FLDIGI_VERSION_MINOR}" appversion="$FLDIGI_VERSION" bundle fi if test "x$WANT_FLARQ" = "xyes"; then identifier="com.w1hkj.flarq" name="Flarq" signature="flrq" binary="flarq" icon="$flarq_icon" version="${FLARQ_VERSION_MAJOR}.${FLARQ_VERSION_MINOR}" appversion="$FLARQ_VERSION" bundle fi cd "$build" echo "creating disk image" hdiutil create -ov -srcfolder "$bundle_dir" -format UDZO -tgtimagekey zlib-level=9 "${APPBUNDLE}.dmg" fldigi-4.1.06/scripts/tests/0000775000175000017500000000000013515625027012702 500000000000000fldigi-4.1.06/scripts/tests/config-h.sh0000755000175000017500000000073713472116042014652 00000000000000#!/bin/sh # Check for translation units that don't include config.h r=0 for f in $fldigi_SOURCES $flarq_SOURCES; do base=$(echo $f | sed -n '/\.[cC][cCpPxX]\{1,\}/ { s!.*/\(.*\)\.[^.]*$!\1!p; }') test "x$base" = "x" && continue test -f "fldigi-${base}.${OBJEXT}" || test -f "flarq-${base}.${OBJEXT}" || continue if ! grep "include.*config\.h" "${srcdir}/${f}" >/dev/null; then echo "E: $f does not include config.h" >&2 r=1 fi done exit $r fldigi-4.1.06/scripts/tests/cr.sh0000755000175000017500000000104313472116042013553 00000000000000#!/bin/sh # Check for files with CRLF line terminators r=0 for f in $fldigi_SOURCES $flarq_SOURCES $EXTRA_fldigi_SOURCES $EXTRA_DIST; do base=$(echo $f | sed -n '/\.[cC][cCpPxX]\{1,\}/ { s!.*/\(.*\)\.[^.]*$!\1!p; }') if test "x$base" != "x" && grep " " "${srcdir}/${f}" >/dev/null; then echo "E: $f has CRLF line terminators" >&2 r=1 fi done if [ $r -eq 1 ]; then echo "Please remove the CRs from the above file(s)." 2>&1 echo "You can use something like: sed -i 's/\r$//' FILE1 FILE2 ..." 2>&1 fi exit $r fldigi-4.1.06/scripts/buildmxe.sh0000755000175000017500000000116213472116042013620 00000000000000#!/bin/bash #======================================================================= # make the mxe-mingw32 executable ./configure \ $PKGCFG \ $CROSSCFG \ --without-asciidoc \ --with-ptw32=$PREFIX/i686-w64-mingw32.static \ --with-libiconv-prefix=$PREFIX/iconv \ --enable-static \ --with-libintl-prefix=$PREFIX/gettext \ PTW32_LIBS="-lpthread -lpcreposix -lpcre -lregex" \ FLTK_CONFIG=$PREFIX/bin/i686-w64-mingw32.static-fltk-config \ make $PREFIX/bin/i686-w64-mingw32.static-strip src/fldigi.exe $PREFIX/bin/i686-w64-mingw32.static-strip src/flarq.exe make nsisinst mv src/*setup.exe . ls -l *setup.exe fldigi-4.1.06/scripts/mknsisinst.sh0000755000175000017500000000316213472116042014213 00000000000000#!/bin/sh ### Script to create a win32 installer file ### 20110209 Stelios Bounanos M0GLD if [ $# -ne 2 ]; then echo "Syntax: $0 data-dir build-dir" >&2 exit 1 fi if [ -z "$PACKAGE_TARNAME" ]; then echo "E: \$PACKAGE_TARNAME undefined" exit 1 fi PWD=`pwd` data="${PWD}/$1" build="${PWD}/$2" # more sanity checks for d in "$data" "$build"; do test -d "$d" && continue echo "E: ${d}: not a directory" >&2 exit 1 done if ! test -w "$build"; then echo "E: ${build} is not writeable" >&2 exit 1 fi set -e fldigi_name=Fldigi fldigi_bin=fldigi.exe flarq_name=Flarq flarq_bin=flarq.exe def= if test "x$WANT_FLDIGI" != "xyes" && test "x$WANT_FLARQ" != "xyes"; then echo "E: refusing to create empty installer" >&2 exit 1 fi if test "x$WANT_FLDIGI" = "xyes"; then # test "x$NOSTRIP" = "x" && $STRIP -S "$fldigi_bin" def="$def -DHAVE_FLDIGI -DFLDIGI_NAME=$fldigi_name -DFLDIGI_BINARY=$fldigi_bin -DFLDIGI_VERSION=$PACKAGE_VERSION" fi if test "x$WANT_FLARQ" = "xyes"; then # test "x$NOSTRIP" = "x" && $STRIP -S "$flarq_bin" def="$def -DHAVE_FLARQ -DFLARQ_NAME=$flarq_name -DFLARQ_BINARY=$flarq_bin -DFLARQ_VERSION=$FLARQ_VERSION" fi if test "x$USE_NLS" = "xyes" && make -C "$srcdir/../po" install prefix="$build" >/dev/null; then def="$def -DFLDIGI_LOCALE_PATH=$build/share -DFLDIGI_LOCALE_DIR=locale" fi $MAKENSIS -V2 -NOCD -D"INSTALLER_FILE=$INSTALLER_FILE" -D"LICENSE_FILE=$data/../COPYING" \ -D"SUPPORT_URL=$PACKAGE_HOME" -D"UPDATES_URL=$PACKAGE_DL" -D"FLDIGI_DOCS_URL=$PACKAGE_DOCS" \ -D"FLARQ_DOCS_URL=$FLARQ_DOCS" -D"GUIDE_URL=$PACKAGE_GUIDE" $def "$data/win32/fldigi.nsi" fldigi-4.1.06/scripts/mkhamlibstatic.sh0000755000175000017500000000274613472116042015014 00000000000000#!/bin/sh # This script must be run by make set -e if test "x$PKG_CONFIG" != "x"; then hamlib_dir="$($PKG_CONFIG --variable=libdir hamlib)" if test "x$hamlib_dir" = "x"; then echo "E: Could not determine hamlib \$libdir" >&2 exit 1 fi else hamlib_dir="${HAMLIB_LIBS#*-L}" hamlib_dir="${HAMLIB_LIBS%% *}" if test "x$hamlib_dir" = "x"; then\ hamlib_dir=/usr/lib fi fi hamlib_libs="$hamlib_dir/hamlib-*.a" case "$target_os" in *linux*) AM_LDFLAGS="$AM_LDFLAGS -Wl,--export-dynamic -Wl,--whole-archive $hamlib_libs -Wl,--no-whole-archive" ;; *darwin*) # Apple's ld isn't quite up to this task: there is no way to specify -all_load for # only a subset of the libraries that we must link with. For this reason we resort # to using the "dangerous" -m flag, which turns "multiply defined symbol" errors # into warnings. This will probably not work for ppc64 and x86_64 universal binaries. AM_LDFLAGS="$AM_LDFLAGS -Wl,-all_load -Wl,-m $hamlib_libs" ;; *cygwin*) AM_LDFLAGS="$AM_LDFLAGS -Wl,--export-all-symbols -Wl,--whole-archive $hamlib_libs -Wl,--no-whole-archive" ;; *mingw32*) AM_LDFLAGS="$AM_LDFLAGS -Wl,--export-dynamic -Wl,--allow-multiple-definition -Wl,--whole-archive $hamlib_libs -Wl,--no-whole-archive" ;; *) echo "E: This script does not support $target_os" >&2 exit 1 ;; esac $CXX -o ${1}${EXEEXT} $AM_CXXFLAGS $fldigi_CXXFLAGS $CXXFLAGS $AM_LDFLAGS $fldigi_LDFLAGS $LDFLAGS $fldigi_OBJECTS $fldigi_LDADD fldigi-4.1.06/scripts/builddist.sh0000755000175000017500000000253213472116042013774 00000000000000#!/bin/bash #=============================================================================== # linux binaries no longer created #=============================================================================== #------------------------------------------------------------------------------- # make the mxe-mingw32 executable #------------------------------------------------------------------------------- autoreconf rm -f fldigi*$1* make clean ./configure \ $PKGCFG \ $CROSSCFG \ --without-asciidoc \ --with-ptw32=$PREFIX/i686-w64-mingw32.static \ --with-libiconv-prefix=$PREFIX/iconv \ --enable-static \ --with-libintl-prefix=$PREFIX/gettext \ PTW32_LIBS="-lpthread -lpcreposix -lpcre -lregex" \ FLTK_CONFIG=$PREFIX/bin/i686-w64-mingw32.static-fltk-config \ make $PREFIX/bin/i686-w64-mingw32.static-strip src/fldigi.exe $PREFIX/bin/i686-w64-mingw32.static-strip src/flarq.exe make nsisinst mv src/*setup.exe . ls -l *setup.exe make clean #------------------------------------------------------------------------------- # build the distribution tarball #------------------------------------------------------------------------------- ./configure --without-asciidoc make distcheck make clean git co po/de.po git co po/es.po git co po/fr.po git co po/it.po git co po/pl.po git co po/nl.po git co po/fldigi.pot git co src/dialogs/guide.cxx fldigi-4.1.06/data/0000775000175000017500000000000013515625027010762 500000000000000fldigi-4.1.06/data/fldigi.xpm0000644000175000017500000002016413472116043012662 00000000000000/* XPM */ static const char * fldigi_icon_48_xpm[] = { "48 48 215 2", " c None", ". c #000000", "+ c #BFBFBF", "@ c #050505", "# c #1A1A1A", "$ c #1F1F1F", "% c #C5C5C5", "& c #FEC1C1", "* c #FDC5C5", "= c #FEC2C2", "- c #FFBFBF", "; c #D5C4C4", "> c #0C0C0C", ", c #FE0303", "' c #FB0C0C", ") c #FD0606", "! c #FE0000", "~ c #4F0909", "{ c #D1BFBF", "] c #2F2F2F", "^ c #303030", "/ c #3C3C3C", "( c #838383", "_ c #C7C7C7", ": c #D9D9D9", "< c #D7D7D7", "[ c #C2C2C2", "} c #C4C4C4", "| c #C9C9C9", "1 c #9F9F9F", "2 c #DDDDDD", "3 c #DBDBDB", "4 c #CDCDCD", "5 c #8F8F8F", "6 c #414141", "7 c #343434", "8 c #313131", "9 c #010101", "0 c #292929", "a c #8A8A8A", "b c #A8A8A8", "c c #B6B6B6", "d c #CFCFCF", "e c #DEDEDE", "f c #DFDFDF", "g c #E5E5E5", "h c #E2E2E2", "i c #A0A0A0", "j c #7D7D7D", "k c #1D1D1D", "l c #767676", "m c #888888", "n c #9B9B9B", "o c #D3D3D3", "p c #C6C6C6", "q c #EBEBEB", "r c #DADADA", "s c #AAAAAA", "t c #858585", "u c #747474", "v c #232323", "w c #171717", "x c #818181", "y c #979797", "z c #AEAEAE", "A c #E4E4E4", "B c #D4D4D4", "C c #B5B5B5", "D c #E1E1E1", "E c #BABABA", "F c #9A9A9A", "G c #989898", "H c #030303", "I c #070707", "J c #242424", "K c #C1C1C1", "L c #E0E0E0", "M c #B2B2B2", "N c #363636", "O c #060606", "P c #020202", "Q c #929292", "R c #959595", "S c #C8C8C8", "T c #CECECE", "U c #B0B0B0", "V c #999999", "W c #040404", "X c #151515", "Y c #606060", "Z c #A2A2A2", "` c #CBCBCB", " . c #919191", ".. c #A4A4A4", "+. c #AFAFAF", "@. c #737373", "#. c #181818", "$. c #131313", "%. c #393939", "&. c #C3C3C3", "*. c #454545", "=. c #3A3A3A", "-. c #222222", ";. c #333333", ">. c #484848", ",. c #A1A1A1", "'. c #616161", "). c #0F0F0F", "!. c #C0C0C0", "~. c #808080", "{. c #404040", "]. c #121212", "^. c #191919", "/. c #BDBDBD", "(. c #7E7E7E", "_. c #3F3F3F", ":. c #161616", "<. c #090909", "[. c #212121", "}. c #777777", "|. c #BBBBBB", "1. c #3B3B3B", "2. c #5D5D5D", "3. c #A5A5A5", "4. c #727272", "5. c #272727", "6. c #101010", "7. c #9C9C9C", "8. c #B7B7B7", "9. c #B3B3B3", "0. c #080808", "a. c #262626", "b. c #ADADAD", "c. c #CCCCCC", "d. c #E9E9E9", "e. c #E8E8E8", "f. c #ACACAC", "g. c #2A2A2A", "h. c #323232", "i. c #DCDCDC", "j. c #D1D1D1", "k. c #E7E7E7", "l. c #D2D2D2", "m. c #0E0E0E", "n. c #0D0D0D", "o. c #4A4A4A", "p. c #8C8C8C", "q. c #B9B9B9", "r. c #7A7A7A", "s. c #525252", "t. c #373737", "u. c #7B7B7B", "v. c #E6E6E6", "w. c #A9A9A9", "x. c #6B6B6B", "y. c #141414", "z. c #757575", "A. c #D6D6D6", "B. c #E3E3E3", "C. c #6E6E6E", "D. c #0B0B0B", "E. c #1E1E1E", "F. c #EAEAEA", "G. c #B4B4B4", "H. c #D8D8D8", "I. c #9E9E9E", "J. c #444444", "K. c #ABABAB", "L. c #A6A6A6", "M. c #505050", "N. c #B1B1B1", "O. c #3E3E3E", "P. c #0A0A0A", "Q. c #878787", "R. c #EFEFEF", "S. c #8B8B8B", "T. c #4B4B4B", "U. c #4F4F4F", "V. c #CACACA", "W. c #EEEEEE", "X. c #434343", "Y. c #D5D5D5", "Z. c #7F7F7F", "`. c #5B5B5B", " + c #515151", ".+ c #868686", "++ c #8E8E8E", "@+ c #575757", "#+ c #707070", "$+ c #636363", "%+ c #B8B8B8", "&+ c #909090", "*+ c #252525", "=+ c #8D8D8D", "-+ c #969696", ";+ c #282828", ">+ c #A3A3A3", ",+ c #BCBCBC", "'+ c #A7A7A7", ")+ c #3D3D3D", "!+ c #2E2E2E", "~+ c #353535", "{+ c #D0D0D0", "]+ c #595959", "^+ c #BEBEBE", "/+ c #111111", "(+ c #5E5E5E", "_+ c #383838", ":+ c #939393", "<+ c #464646", "[+ c #2C2C2C", "}+ c #717171", "|+ c #898989", "1+ c #494949", "2+ c #555555", ". . . . . . . . + @ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + # . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + $ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", "% % % % % % % % % % % % % % % % % % % % % & * * * = - - - ; % % % % % % % % % % % % % % % % % % ", "> > > > > > > > > > > > > > > > > > > > > , ' ' ' ) ! ! ! ~ > > > > > > > > > > > > > > > > > > ", "+ + + + + + + + + + + + + + + + + + + + + - - - - - - - - { + + + + + + + + + + + + + + + + + + ", "] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ] ] ] / ( _ : < [ } | 1 2 3 4 5 6 ^ ] ] ] 7 8 ] ] ] ] ] ] ] ] ] ] ", ". . . . . . . . . . . . . . 9 . . . 0 a b c d e f g 2 h } i j 0 9 . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . k l m n o p 3 q h r s t u v . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . 9 w x y z : _ A B C D E F G 0 . . H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . I 9 . J t z % D K L d d r | M ( N 9 . O H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P > 9 . ] Q R S f D L T 4 e } U V 7 9 . H 9 . . . . . . . . . . . . ", ". . . . . P P . . . . . . 9 P W . . X Y Z e ` + .( ..d 3 +.@.#.. . . . O H . . . . . . . . . . ", ". . . . . @ @ . . . . . . W P . . . P $.%.&.*.=.-.k ;.>.,.'.X @ . . . . ).O . . . . . . . . . . ", ". . . . . @ @ . . . . . . P 9 . . . . 9 . !.P . . . . . ~.{.. . . . . . ].I . . . . . . . . . . ", ". . . . . O O . . . . . . . . . . . P O ^./.$.H H H H W (._.P . . . . . :.<.. . . . . . . . . . ", ". . . . . H H . . . . . . . . . . . O [.}.|.Y 1.6 6 1.2.3.4.5.P . . . . 6.I . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 9 . . ).u } A 4 7.8.9.7.: D d ~.W . . . 9 H 9 . . . . . . . . . . ", ". . . . . . . . . . . . . . H 0.. . a.b.&.c.d.o D L L e._ + f.g.9 . 0.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 0.9 . h.F c ` i.j.A e.k.2 l.C Q / 9 9 m.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . n.P . o.p.f.% q.A g e.q e e Z r.s.@ @ m.P . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . 9 . . t.u.+ v.B i.Z w.: L d.|.x.7 O 9 P . I 9 . . . . . . . . . . ", ". . . . . . . . . . . . . H O @ . . y.z.c.v.A.+ b b ,.B.e.[ C.D.9 . . 9 <.9 . . . . . . . . . . ", ". . . . . . . . . . . . . H D.n.. . E.,.o B.e.A.!.z ..F.L 3 Z [.9 . W H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P n.9 . 1.c G.H.g F.k.g e.A ` 9.I.J.W . O W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . W m.. W t.K.1 L.i.2 h i.v.D ..1 +.^ O 9 0.D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H O P > M.5 t p.< g g D d.i.1 Q N.O.O @ ).D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 P.H W o.Q.C p l.v.q R.i.i.d 1 S.T.I 9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O H . U.t +.l.V.V.e.W.k.r } S }.X.<.P W . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . 9 . 1.x U g 2 Y.g g g D 3 l.Z.v H . 9 . D.H . . . . . . . . . . ", ". . . . . 9 9 . . . . . . 9 9 . . . O -.> 4 @.C.`. +C.}.!..+W 0.. . . . w <.. . . . . . . . . . ", ". . . . . W W . . . . . . P 9 . . . . P 9 % y.<.<.0.I m.++@+@ . . . . . :.<.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . H 9 . . . O t.S.f ,.#+j u.$+n c.z +I 9 . . . > @ . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . X ( | H.v.%+D 4 &+v.` d n *+W . 9 9 9 . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . y.=+G.G.h [ F.d.j.A b +.-+;+P . 9 . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . H . . ] >+C U L B.k.e.h k.s b i *.O . 9 W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.P . %.M -+,+o d.i.A q 2 /.3.s +0.W n.0.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H @ 9 . ] '+c V.L e.A 2 D B.S C i )+O 9 H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . O O . . !+f._ l.e.d.g 2 D e.S &.K.s.P.. . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . P . 9 ~+f.E {+h d.e.g g L % !.R ]+D.9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O 9 O h.7.9.l.v.k.L B T 2 T ^+3.J.0.. 9 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . /+I D.X.Q L.e g q v.B.v.D B &.i (+P.W P.9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.I O _+b /.A.2 d.v.F.d.A : %+L.T.0.O /+H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . m.P . ;.Q + 3 f A h F.q d : } :+<+W H m.W . . . . . . . . . . . . ", ". . . . . . . . . . . . . H 9 I 9 . [+a p v.g k.o % e i.B.j.p.J.O . H 9 W P . . . . . . . . . . ", ". . . . . . . . . . . . . I H . . . O 5.}+o |+t 1+X.C..+,+p.8 ).9 . . . y.0.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . P 9 . . . . . . p X D.9 P O <.~.2+. . . . . . :.<.. . . . . . . . . . ", ". . . . . @ @ . . . . . . . . . . . . . . &.I . . . . . ~.T.. . . . . . #.P.. . . . . . . . . . "}; fldigi-4.1.06/data/fldigi-psk.png0000644000175000017500000000730313472116043013435 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ  Å›ÄoPIDATxÚí›Éoe·Æou×Ðóàv·ÛclCœ'bJ(‘ùP Á„Á†+þ tˆ+6°`ÃEB–X (‹0A,l'Ž`;‰‡ÄCÛ=º§ª®®»¸ª’ÛÛ7¾ßw_©]*×ð¼ç<çœç Àâ—eY!x’«Ùï =ìtuuñï´¿ßÿŸ À¿Û–eYÿÑ´µµý¯°´¼L¥­mÛymyyÛ¹Þ¶6*; ÀÃD¦°øCœ÷¥ÿw`hhhLjÇãœ:uŠàñx0M“r¹Ììì,’$ÑßßÏõë×¹zõ*§NB’$\.¹\ŽÉÉI†‡‡Y]]½ë½EÁ², Ãxò. Iõz½á\$á7Þàã?¦^¯ã÷û‰F£!ðz½èºN  ŸÏS.—I$lll°¾¾N*•byy™Ó§OsîÜ9jµZÓ7ÇÝì,mëòz½$ ²Ù,KKKhšÆ¾}ûðûýøý~$IÂívðûý˜¦I¡P`bb‚ùùy.—kGv€T*Åôô4©Tеµ52™ ‡D"Áèè(Åb·ûö¡Z­R©TÐu;wî ( Š¢°¶¶FµZý¿—I’D­VC–ezzze™X,F¹\FQ¢Ñ(±XŒR©ÄÊÊ þù'Á`Z­Æž={Ð4ƒâóù¤ÆWu¹\»Ï¶ò@½^G’$º»»™››ãèÑ£¨ªJ[[Bfggéîîfyy™T*E4ux Z­âõz©T*´µµmã¯×K¡PØ}ƒA666Õ4ÞÞ^òù<õzÓ4B ë:ȲLkk+­­­¨ªJ*•BQÇJΞ=K @Qt]ßÝ.àr¹°, Ó4sÑh”[·nqäÈ~ÿýwgWUU¥»»›jµJµZezzš……:::H§ÓƒAŠÅ"ï½÷ù|¾áž¥Riç$i›ïÝ+•J FGGI§Ó=z”ÞÞ^ü~?Õj•õõuffføöÛo‘e™õõu à ³oß>4Mcyy™¿ÿþ{öo·ÛýX|pOeÙaç{&B Ë2º®o»6ŸÏ366Æ×_Í«¯¾ÊÀÀ§OŸFUUnݺÅââ"£££ÌÌÌÐÞÞÎÔÔš¦ñÁðý÷ß311ÁÜÜÜ?>Ûçóaš&ÍO„TU}`<Ï™¥eYH’Äý2ðU~"‘µZí‘ ±)`›þýÜi«e5+ê<Œ›>BˆÖß¶†©­®´ÙO;::šÀÖ{7•šQ( !Ð4 ]×ùôÓO¹xñ"õzX,F±XÄåráv»©V«(Š‚¦i¬¬¬Ífx_.—ÿñ}jµÚ=Á,µÂںǎ£¿¿Ÿ®®.¾úê+ùí·ßˆD"tww311ßïç•W^¡¥¥€/¿ü’‘‘¾ûî;êõú]¨V«Û"Ä«m—Ù¼#B^ýu>ûì3Âá0@I’XXX`rr’§žzŠ®®..^¼ˆ$I;vÌÙÕb±ÈÊÊ 'OžÜ^m×|\+mj&èr¹Ð4­!$I’Äk¯½F(âöíÛ¨ªJoo/===¨ªŠ×ëŲ,<ˆ¢(ȲL.—cjjŠh4J$áøñãÛÊa¿ßÿÈ¡oG«Á­%«‚––ÆÆÆBP.—©Õj¸\.æææðûýȲL @UUòù¼Ãì¦i2;;ËÀÀÀ6¢ …BMᨦ`šæ6VŽÇã¸\.nܸeYtvv211AµZeÿþý \.—£U«U ÃàÀüý÷ß\»v ŸÏ׬ÏçkJ!´#å°ý1öêéé!—ËQ¯×©T*‹Eæç癟Ÿ':g #˲Ð4µµ5èéé!‘H4\Åbqw–Ãù|¾Á4«Õ*·nÝbïÞ½Äãqºººƒ”Ëe ÃàâÅ‹Œóᇠ1MÓq‡ÁÁA'•Þ*²l®LÓ|dwp73X–µ-&OOO#Ë2ýýýNµ˜Ëå0M“«W¯’Ëå‡Ã\¸pD"A__Ÿ“LOO³ººÊððpC:¾Ù¢Ñ(ëëë ›æ¿ßO h8_(ƒ9r„@ €eYttt8º,˼õÖ[d2._¾ìèÅb‘·ß~›÷ßÃ0¶™¼$I!X[[{¬< i躎EQ¶qÂË/¿L("ŸÏS*•$‰X,ÆÀÀ---ø|>nÞ¼É /¼€,ˆÁÆÆBÂá0'NœptÃÍ€oÍ9‰³€ÿjõzÃ0p»Ý†áød2™ä£>B–eÒé4---†¦i¨ªJkk+²,óüóÏÓÕÕ…‚••Ea||œ;wîøë¯¿œ”Ø®T›!”65 (Šâ$66/”Ëenß¾×ëåÊ•+ÌÍÍQ*•œf†‚J¥‚Ûí¦R©àr¹¸rå 333d³Y:ÄÈÈȶ´¼V«m³¶]‘lll8x½^âñ8étšz½Ž¦i S¯×Éd2¬­­9⨢(Ž Ú××Ç™3gx½^R©ÉdÒyŽm=>ŸïñÃv³\`«",„Àçóqøða$IÂëõ2>>N0¤»»›d2I(B’$EÁçó9¹ÂêêªÃì>ŸMÓ8}ú4Š¢P¯×‰F£T*jµÚc7Kš €½;vbS«ÕˆD"N"sèÐ!öïßÛív>Þ²,"‘Õj•T*åt‰‰SSS˜¦I&“arrÒ±®r¹Œ®ëMé5Õì’Õþx]×Ìpii‰¾¾>4M£««‹3gÎ8Äfš&áp˜|>ªª¤ÓiNœ8Á/¿üâ«m]Š¢4mPªé©p±Xlx9MÓ$‰ŽŽ~úé'dYÆívÓÓÓÃèè(ªªR¯×q¹\ȲL<gaaI’‡Ã?~œ‘‘¢ÑhS…šK…íœÀ^³³³$ *• Ï<ó ÝÝÝT*öìÙãìüêêªS!H&“ìÛ·7nP©TÈd2LLL4¤×›EÑR©ôÈ!±i¸\®»fd³³³”ËeæççùùçŸYXXàÌ™3èºîÌ œ?žýë_hš†‚h4Ê›o¾Éðð0Ÿþ9---wm½Û&„x¬œÀú§CUUKUUë^ר‡⮳,Ëòz½÷¼æ¥—^²,˲’Éä}ï×ÖÖfE£ÑzöÝŽ{ZÀƒ²¬UUï){½^§oÐÙÙ‰a¤R)‡ìž¡,Ë\¸pÁQ}‚Á ù|þ¾ÄûD5A!Ä?0Ø!ï“O>áÝwߥ§§‡T*ÅÒÒ¿þú+ííí$“I¦¦¦ÈçóœÛþÿ{¬®©š â´>!Ä}µCû>–eYýýýVWW—ÕÒÒbI’d–¢(V °‰„s]ggç}ŸH$vN´³¯ûõß-˺¯*»™°²Ù,ëëëÛ¤t]×f„åfšõ¡]Àö­Ç@¸_ßà^k+Hÿ´IÀ¥¬SrùIEND®B`‚fldigi-4.1.06/data/ToR-Stats-SHIP.csv0000644000175000017500000023053213472116043013756 00000000000000June 2012,,,,,,,, CTRY,CALLSIGN,NAME,Observations,N<30,N<60,N<120,N>360,Average (R-O) (mins) , B2M1297, ,1,1,1,1,0,30 , B2M1303, ,17,16,17,17,0,17.9 , BATEU00, ,366,366,366,366,0,5 , BATEU05, ,326,326,326,326,0,5.1 , BAREU00, ,597,587,597,597,0,4.2 , BAREU04, ,543,540,543,543,0,2.8 , BAREU08, ,549,548,549,549,0,1.8 , BAREU11, ,587,489,587,587,0,13.3 , BAREU12, ,328,239,328,328,0,15.8 , BAREU51, ,503,449,503,503,0,8.7 , BAREU54, ,460,460,460,460,0,2.7 , BAREU56, ,366,365,365,365,1,0 , BAREU58, ,414,345,414,414,0,14 , BAREU60, ,334,329,334,334,0,3.4 , BAREU62, ,386,304,386,386,0,15.2 , BAREU63, ,291,290,290,290,1,4.8 , BAREU64, ,366,338,366,366,0,11.7 , BAREU65, ,651,651,651,651,0,0 , BAREU66, ,481,382,481,481,0,15.1 , BATEU02, ,413,413,413,413,0,5.5 , BATEU03, ,232,232,232,232,0,5.7 , BATEU04, ,400,400,400,400,0,5.3 , BATEU08, ,490,490,490,490,0,5.5 , BATEU09, ,470,470,470,470,0,5.3 , BATFR01, ,175,175,175,175,0,4.7 , BATFR02, ,314,314,314,314,0,4.8 , BATFR03, ,478,478,478,478,0,4.5 , BATFR04, ,284,284,284,284,0,4.3 , BATFR05, ,195,195,195,195,0,5.6 , BATFR08, ,590,590,590,590,0,4.8 , BATFR09, ,471,471,471,471,0,4.8 , BATFR10, ,328,328,328,328,0,5.2 , BATFR11, ,234,234,234,234,0,4.7 , BATFR12, ,193,193,193,193,0,4.5 , BATFR13, ,387,387,387,387,0,4.7 , BATFR14, ,346,346,346,346,0,4.8 , BATFR15, ,278,278,278,278,0,4.8 , BATFR16, ,364,364,364,364,0,5 , BATFR17, ,34,34,34,34,0,4 , BATFR18, ,446,446,446,446,0,4.8 , BATFR20, ,310,310,310,310,0,5 , BATFR21, ,370,370,370,370,0,5.2 , BATFR22, ,295,295,295,295,0,4.8 , BATFR23, ,12,12,12,12,0,6.7 , BATFR24, ,571,571,571,571,0,4.9 , BATFR27, ,441,441,441,441,0,4.8 , BATFR28, ,495,495,495,495,0,5.3 , BATFR29, ,471,471,471,471,0,4.9 , BATFR32, ,325,325,325,325,0,3.2 , BATFR33, ,307,307,307,307,0,4.9 , BATFR34, ,260,260,260,260,0,5 , BATFR35, ,301,301,301,301,0,5 , BATFR36, ,320,320,320,320,0,5.8 , BATFR39, ,221,221,221,221,0,5 , BATFR41, ,263,263,263,263,0,5 , BATFR42, ,432,432,432,432,0,5.6 , BATFR44, ,153,153,153,153,0,3.9 , BATFR45, ,239,239,239,239,0,4.4 , BATFR46, ,432,432,432,432,0,5.4 , BATFR47, ,307,307,307,307,0,5.7 , BATFR48, ,201,201,201,201,0,5.6 , BATFR49, ,401,401,401,401,0,4.4 , BATFR52, ,510,510,510,510,0,5.4 , BATFR53, ,60,60,60,60,0,4.1 , BATFR54, ,430,430,430,430,0,5 , BATFR55, ,330,330,330,330,0,5 , BATFR56, ,524,524,524,524,0,4.8 , BATFR58, ,537,537,537,537,0,4.9 , BATFR59, ,80,80,80,80,0,5.4 , BATFR60, ,218,218,218,218,0,4.9 , BATFR61, ,2,2,2,2,0,6 , BATFR62, ,98,98,98,98,0,4.9 , BATFR63, ,180,180,180,180,0,5.4 , MINFR00, ,574,70,212,444,0,86 , MINFR03, ,649,35,131,322,17,141.3 , MINFR09, ,672,65,210,430,6,114.9 , AMOUK01, ,25,25,25,25,0,1.9 , AMOUK02, ,503,502,502,503,0,2 , AMOUK03, ,527,527,527,527,0,1.9 , AMOUK05, ,524,524,524,524,0,1.8 , AMOUK06, ,536,536,536,536,0,1.9 , AMOUK08, ,547,547,547,547,0,1.8 , AMOUK09, ,541,541,541,541,0,1.9 , AMOUK10, ,166,165,165,166,0,2.3 , AMOUK11, ,540,540,540,540,0,1.8 , AMOUK12, ,540,538,538,540,0,2.1 , AMOUK13, ,535,530,530,535,0,2.4 , AMOUK14, ,526,526,526,526,0,1.9 , AMOUK15, ,521,515,519,521,0,2.4 , AMOUK16, ,345,345,345,345,0,1.9 , AMOUK17, ,386,386,386,386,0,1.9 , AMOUK19, ,409,409,409,409,0,1.8 , AMOUK20, ,266,266,266,266,0,1.9 , AMOUK21, ,548,548,548,548,0,1.9 , AMOUK22, ,531,530,530,531,0,2 , AMOUK23, ,526,525,525,526,0,2 , AMOUK24, ,357,357,357,357,0,1.9 , AMOUK25, ,523,522,523,523,0,2.1 , AMOUK26, ,551,551,551,551,0,1.8 , AMOUK27, ,473,473,473,473,0,1.8 , AMOUK28, ,419,362,363,416,0,10.5 , AMOUK29, ,524,522,522,524,0,2.1 , AMOUK30, ,484,457,457,483,0,5.4 , AMOUK31, ,485,451,451,483,0,6.4 , AMOUK33, ,485,485,485,485,0,1.9 , AMOUK34, ,545,545,545,545,0,1.9 , AMOUK35, ,543,539,539,543,0,2.3 , AMOUK36, ,548,547,547,548,0,1.9 , BATEU01, ,493,493,493,493,0,5.1 , BATEU06, ,510,510,510,510,0,5.5 , BATUK01, ,656,654,655,656,0,12.6 , IDDUK02, ,388,361,372,386,0,11.4 , MINUK01, ,706,224,505,679,0,50.4 , MINUK03, ,708,207,478,670,0,54.5 , MINUK05, ,708,235,514,674,0,50.6 , TBWUK03, ,27,9,22,25,0,51.7 , TBWUK04, ,52,46,48,49,0,20.1 , TBWUK05, ,14,6,7,13,0,56.6 , TBWUK06, ,25,11,22,25,0,28.7 , TBWUK08, ,2,2,2,2,0,10 , TBWUK09, ,23,2,11,17,3,373.9 , TBWUK11, ,71,50,63,66,2,54.4 , TBWUK16, ,51,26,44,50,0,41.7 , TBWUK18, ,24,7,14,23,1,122.6 , TBWUK19, ,16,6,9,9,5,198.5 , TBWUK30, ,25,13,19,19,3,92.7 , TBWUK34, ,86,30,72,80,2,76.2 , TBWUK35, ,75,36,65,74,0,41.8 , TBWUK37, ,49,18,45,48,1,45.2 , TBWUK38, ,19,15,18,19,0,21.4 , TBWUK48, ,55,35,53,55,0,22.4 , TBWUK49, ,4,2,3,4,0,29.5 , TBWUK50, ,60,30,54,58,0,39.2 , TBWUK51, ,14,0,6,11,2,218.1 AU , VJD2969, ABURRI,5,1,3,5,0,63.4 AU , 9KWP, AL SHUWAIKH,40,31,40,40,0,22.6 AU , 2ALD3, ANL WANGARATTA,8,4,8,8,0,39.4 AU , 9V7548, ANL WARRAIN,8,2,7,8,0,56.4 AU , 2AJU5, ANL WYONG,18,12,16,18,0,30.4 AU , 9VBX, APL AMAZONITE,8,6,7,8,0,28.6 AU , A8TX8, APL BAHRAIN,5,1,3,5,0,51.6 AU , A8TX9, APL RIYADH,59,31,55,59,0,35.5 AU , VNW6069, ASHMORE GUARDIAN,38,23,26,29,3,106.6 AU , C6HS4, BADER III,30,22,29,30,0,25.5 AU , V7VZ6, CAPE MAAS,61,60,61,61,0,16.2 AU , 9VEY2, CAPITAINE TASMAN,12,4,8,11,0,55.5 AU , VK4041, CHANCE,19,19,19,19,0,10.5 AU , VRWS4, CHEKIANG,12,11,12,12,0,17.8 AU , VRUB2, CHENAN,8,8,8,8,0,15.4 AU , VRSR, CHENGTU,29,28,29,29,0,17.4 AU , VROC, CORAL CHIEF,12,12,12,12,0,18 AU , PBLQ, DIAMANTGRACHT,1,1,1,1,0,15 AU , VNJC, H.M.B. ENDEAVOUR,31,15,27,31,0,36.8 AU , VROB, HIGHLAND CHIEF,26,11,26,26,0,30 AU , VRRB, ISLAND CHIEF,22,21,22,22,0,18.1 AU , VRRD, KOKOPO CHIEF,9,9,9,9,0,15.1 AU , FHZI, L\'ASTROLABE,667,341,667,667,0,30.1 AU , VMAL, LINDESAY CLARK,24,22,23,24,0,18 AU , 9V8207, MAERSK BATUR,2,1,1,2,0,38.5 AU , 9V8208, MAERSK BRANI,48,25,38,44,1,70.5 AU , C6RI4, MAYSORA,47,39,46,47,0,24 AU , VRFN8, MOL EMINENCE,16,9,16,16,0,26.9 AU , VNVZ, NORTHWEST SANDERLING,12,12,12,12,0,11.6 AU , VNVG, NORTHWEST SANDPIPER,16,12,14,16,0,25 AU , ZCAO7, NORTHWEST SHEARWATER,32,6,20,32,0,69.2 AU , VNVS, NORTHWEST SNIPE,20,20,20,20,0,13.1 AU , VNVF, NORTHWEST STORMPETREL,1,1,1,1,0,10 AU , VMQ8808, OCEANIC DISCOVERER,49,34,41,45,2,57.1 AU , VRFS2, OOCL NEW ZEALAND,14,0,12,14,0,62.7 AU , VRDU8, OOCL PANAMA,2,2,2,2,0,22.5 AU , 2AGH7, PACIFIC DAWN,11,11,11,11,0,17.9 AU , MPRZ, PACIFIC JEWEL,3,0,1,1,0,180 AU , GRFP, PACIFIC PEARL,13,11,12,13,0,20.3 AU , ZCDS3, PACIFIC PRINCESS,46,38,45,46,0,18.9 AU , 9HA2479, PACIFIC SUN,671,521,671,671,0,22.1 AU , ELXS8, PACIFIC TRIANGLE,9,9,9,9,0,13.9 AU , VRRC, PAPUAN CHIEF,11,11,11,11,0,16.6 AU , VNVM, PIONEER,8,5,6,8,0,38.9 AU , VNAH, PORTLAND,438,221,438,438,0,30.6 AU , V2OG2, PRINCESS MARY,14,14,14,14,0,15.4 AU , VJRB, RIVER BOYNE,9,7,9,9,0,25.6 AU , MNDC9, SAFMARINE MERU,10,9,10,10,0,19.2 AU , MPJH9, SAFMARINE MULANJE,74,30,52,66,2,72.7 AU , MGYB8, SANTA MONICA,56,52,54,55,1,26.2 AU , VLHJ, SOUTHERN SURVEYOR,114,1,70,105,2,79.5 AU , VNSZ, SPIRIT OF TASMANIA II,703,701,703,703,0,15.6 AU , C6FS9, STADACONA,688,478,688,688,0,24.5 AU , ZCBU6, SUN PRINCESS,7,3,5,6,0,56.1 AU , V7PB5, TANDARA SPIRIT,9,6,8,9,0,36.7 AU , VHAF, TASMANIAN ACHIEVER,18,7,15,18,0,42.1 CA , VOPP, AIVIK,190,188,190,190,0,11.3 CA , VCJM, ALGOMA ENTERPRISE,699,697,699,699,0,11.1 CA , VAAP, ALGOSCOTIA,706,704,706,706,0,11 CA , CGDT, AMUNDSEN,357,357,357,357,0,11 CA , VCLM, ARCTIC,715,710,715,715,0,11.2 CA , VOKJ, AVALON,709,707,709,709,0,11.1 CA , CGDR, BARTLETT,368,366,368,368,0,11.1 CA , VXKF, BLUE PUTTEES,715,713,715,715,0,11.1 CA , CFN3031, C. T. M. A. VACANCIER,184,182,184,184,0,11.3 CA , VCSZ, CABOT,701,699,701,701,0,11.1 CA , VOKF, CAMILLA DESGAGNES,372,370,372,372,0,11.1 CA , VCRG, CTMA MADELEINE,710,705,708,710,0,11.3 CA , VCBW, DARA DESGAGNES,361,361,361,361,0,10.9 CA , CGDX, DES GROSEILLIERS,610,608,610,610,0,11.1 CA , CG2522, DUMIT,602,600,602,602,0,11.1 CA , CG3029, EARL GREY,557,555,557,557,0,11.1 CA , CG2992, ECKALOO,498,496,498,498,0,11.1 CA , CGJV, EDWARD CORNWALLIS,189,189,189,189,0,11 CA , CGCX, GEORGE R. PEARKES,715,713,715,715,0,11 CA , CGBR, GORDON REID,705,703,705,705,0,11.1 CA , CGDS, GRIFFON,655,652,655,655,0,11.1 CA , CGHL, HENRY LARSEN,654,652,654,654,0,11.1 CA , 8PSH, I. T. INTREPID,232,232,232,232,0,14.6 CA , CG2958, JOHN P. TULLY,717,714,717,717,0,11.1 CA , CZ3695, KELLY OVAYUAK,47,47,47,47,0,11 CA , CG2350, LIMNOS,709,707,709,709,0,11.1 CA , VCWL, MARIA DESGAGNES,538,531,535,538,0,11.5 CA , CGCC, MARTHA L. BLACK,609,607,609,609,0,11.1 CA , CZ9742, NAMAO,635,634,635,635,0,11 CA , VCYL, NORDIK EXPRESS,637,635,637,637,0,11.3 CA , CFN5537, NULIAJUK,459,457,459,459,0,11.1 CA , VC6750, NUNAKPUT,653,651,653,653,0,11 CA , VOLG, OCEANEX SANDERLING,555,553,555,555,0,11.1 CA , VRYO3, OOCL MONTREAL,561,561,561,561,0,11 CA , VCBZ, PETER R. CRESSWELL,632,630,632,632,0,11.1 CA , CGSB, PIERRE RADISSON,658,656,658,658,0,11.1 CA , CG2960, SAMUEL RISLEY,671,669,671,671,0,11.1 CA , CGUM, SIR WILLIAM ALEXANDER,601,600,601,601,0,11 CA , CGJK, SIR WILFRID LAURIER,643,642,643,643,0,11 CA , 3FZK3, SKAUBRYN,188,186,188,188,0,11.3 CA , VOFG, STRAIT EXPLORER,603,601,603,603,0,11.1 CA , CGBY, TANU,576,574,576,576,0,11.1 CA , CGTF, TERRY FOX,702,700,702,702,0,11.1 CA , CG2965, W. E. RICKER,713,711,713,713,0,11.1 CA , C6SI6, WESTWOOD VICTORIA,713,708,712,712,1,11.8 CL , CCES, ESMERALDA,52,19,24,32,8,163.1 CL , CCLY, LYNCH,32,1,5,12,16,993.7 DE , C6CN4, ALBATROS,20,4,8,18,0,60.5 DE , A8UG6, ALDEBARAN,28,13,27,27,0,34.8 DE , DDKK2, ALEXANDER VON HUMBOLDT 2,13,11,12,13,0,17.7 DE , 9HXA5, ALGARVE,21,10,18,20,1,104.1 DE , 9VKY3, ALGOL,4,3,4,4,0,18.5 DE , 9VKY2, ALIOTH,12,8,12,12,0,23.2 DE , DBND, ALKOR,646,646,646,646,0,2.6 DE , V2AH1, ALVSBORG BRIDGE,33,3,7,31,0,65.1 DE , DGLM, ANDRE RICKMERS,19,10,15,18,0,38.4 DE , A8HJ2, ANGLIA,4,0,4,4,0,54 DE , A8JM5, ANL BENALLA,19,19,19,19,0,15.3 DE , A8IH2, ANL BINBURRA,25,0,20,25,0,66.8 DE , A8JJ8, ANNABA,24,20,22,23,0,28.3 DE , A8CC4, APL ARABIA,17,15,17,17,0,10.9 DE , V2AJ8, APL ARGENTINA,1,0,0,1,0,71 DE , A8CG6, APL CANADA,30,20,28,30,0,31.5 DE , V2OB8, APL CHILE,12,3,10,11,0,40.2 DE , A8JX9, APL DENMARK,6,3,5,5,1,81 DE , A8BZ6, APL EGYPT,27,12,23,24,1,62.6 DE , A8JX7, APL INDIA,9,6,9,9,0,23.2 DE , A8SZ7, APL MANILA,34,22,33,34,0,30.5 DE , A8JX8, APL SWEDEN,30,27,30,30,0,21.1 DE , A8HJ6, AQUITANIA,6,0,1,6,0,103.8 DE , DBBU, ARKONA,679,678,678,678,1,0 DE , A8HJ8, AS ALICANTIA,10,8,9,9,1,393.2 DE , A8TL9, AS CARELIA,25,20,25,25,0,19.2 DE , A8JT4, AS CARIA,3,2,3,3,0,26.3 DE , ZDKR4, AS CARINTHIA,1,1,1,1,0,11 DE , A8KC9, AS CATALANIA,11,3,5,8,0,69.3 DE , A8CK2, AS SCANDIA,2,1,2,2,0,21.5 DE , A8XD5, AS VALDIVIA,40,34,38,40,0,14.2 DE , A8SO8, AS VALENTIA,31,20,26,31,0,29 DE , A8UA9, AS VENETIA,13,0,10,13,0,68 DE , A8SO7, AS VICTORIA,10,8,10,10,0,10.9 DE , A8VV3, AS VINCENTIA,62,51,59,61,0,21.7 DE , A8SO9, AS VIRGINIA,25,7,16,22,0,58.6 DE , DBBI, ATAIR,210,210,210,210,0,2.8 DE , DILE, ATLANTA EXPRESS,55,50,54,55,0,16.5 DE , A8AD6, BACO-LINER 1,7,7,7,7,0,8 DE , A8AD7, BACO-LINER 2,24,15,20,24,0,26.5 DE , A8SF7, BAHIA,29,23,27,28,0,24.9 DE , A8SF8, BAHIA BLANCA,33,29,32,32,0,19.7 DE , A8SF9, BAHIA CASTILLO,32,11,18,23,2,108.6 DE , A8SG2, BAHIA GRANDE,16,16,16,16,0,11.4 DE , A8SG3, BAHIA LAURA,26,25,26,26,0,7.8 DE , A8ZP9, BALTRUM TRADER,21,1,9,21,0,62.4 DE , DCPY2, BANGKOK EXPRESS,10,4,7,8,1,207.1 DE , DGHX, BERLIN EXPRESS,47,45,47,47,0,15.8 DE , ELVL8, BONAVIA,21,14,18,20,0,31.6 DE , C6JC3, BREMEN,8,2,3,4,1,159.5 DE , DGZL, BREMEN EXPRESS,160,151,155,155,1,25.1 DE , DGWE2, BUDAPEST EXPRESS,12,10,12,12,0,15.2 DE , DCPX2, BUSAN EXPRESS,46,32,43,45,0,29.1 DE , A8UQ2, BUXHILL,7,6,7,7,0,21 DE , DFCW2, CANBERRA EXPRESS,86,55,83,86,0,25 DE , A8PG7, CAP BEAUFORT,10,10,10,10,0,11.7 DE , A8PI5, CAP CASTILLO,18,14,17,18,0,18.9 DE , A8MW8, CAP GABRIEL,23,17,21,23,0,24.8 DE , A8MX4, CAP GREGORY,32,18,30,32,0,28.3 DE , A8RH6, CAP HAMILTON,50,39,46,49,0,21.9 DE , A8RH7, CAP HARALD,9,8,8,8,0,22.8 DE , A8VD8, CAP HARRIET,45,32,40,42,3,112.2 DE , A8VD9, CAP HARRISSON,67,48,66,67,0,23.7 DE , A8VE2, CAP HARVEY,142,124,140,141,0,17.2 DE , A8VE3, CAP HENRI,18,10,14,17,1,112.6 DE , A8VL6, CAP JACKSON,56,44,55,56,0,20.1 DE , A8VL7, CAP JERVIS,20,20,20,20,0,16.5 DE , A8DK4, CAP MELVILLE,2,1,1,2,0,58.5 DE , A8OH4, CAP PALLISER,139,132,139,139,0,9.8 DE , A8DE3, CAP PALMAS,47,40,47,47,0,17 DE , A8MW6, CAP PALMERSTON,45,36,45,45,0,20 DE , A8NQ7, CAP PATTON,44,37,42,42,2,71.9 DE , A8MQ9, CAP PORTLAND,68,48,63,67,0,23.2 DE , DPJK, CAP RICARDA,70,49,66,70,0,20.2 DE , A8IY4, CAP ROBERTA,17,17,17,17,0,10.5 DE , A8RL5, CAP SCOTT,63,58,62,63,0,16.2 DE , DMRG, CAP VALIENTE,63,49,58,62,1,24.5 DE , A8IX9, CAP VERDE,24,17,23,24,0,24.1 DE , V7JM2, CAPE MONDEGO,8,0,5,8,0,75.2 DE , A8AC4, CARLOS FISCHER,14,6,13,14,0,31.1 DE , A8HI8, CARPATHIA,17,10,15,17,0,29.2 DE , A8IG4, CCNI ATENA,36,16,35,36,0,29.2 DE , A8IX5, CHAITEN,14,3,11,14,0,44.6 DE , DCUJ2, CHICAGO EXPRESS,37,27,36,37,0,23.6 DE , A8HJ4, CIMBRIA,3,2,3,3,0,12 DE , D5BB9, CMA CGM ALABAMA,5,3,4,5,0,22.4 DE , DIHN, CMA CGM BALZAC,10,8,10,10,0,22.8 DE , DHSI, CMA CGM BUENOS AIRES,31,15,24,30,0,40.4 DE , A8NO8, CMA CGM BUTTERFLY,28,26,27,27,0,24.5 DE , A8IE8, CMA CGM CARMEN,19,13,17,18,1,79.2 DE , A8SU4, CMA CGM CORNEILLE,1,0,1,1,0,60 DE , A8IE7, CMA CGM DON GIOVANNI,11,9,11,11,0,18.6 DE , A8OF6, CMA CGM ESPERANZA,12,7,12,12,0,20.6 DE , DCTA2, CMA CGM HUGO,45,39,45,45,0,22.4 DE , A8NO9, CMA CGM IVANHOE,11,7,7,9,2,277.5 DE , A8IG2, CMA CGM LAVENDER,3,2,3,3,0,28 DE , A8IF2, CMA CGM MIMOSA,36,0,34,36,0,55.6 DE , A8NO6, CMA CGM ORFEO,77,75,76,76,0,16.7 DE , A8LP6, CMA CGM PARSIFAL,20,17,17,17,3,226.4 DE , A8NO7, CMA CGM PELLEAS,14,0,1,5,1,175.8 DE , DCPQ2, CMA CGM QINGDAO,4,0,2,2,0,171.2 DE , DFUM2, CMA CGM VELA,19,10,17,18,0,47.8 DE , DQXQ, CMA CGM VOLTAIRE,9,6,9,9,0,30.8 DE , DIHC, COLOMBO EXPRESS,73,66,73,73,0,14.6 DE , DDJR2, CONTI ANPING,1,0,1,1,0,52 DE , A8OF7, CONTI ARABELLA,29,12,29,29,0,28.6 DE , ELTN2, CONTI CHIWAN,1,0,1,1,0,32 DE , A8OZ6, CONTI DAPHNE,2,1,1,1,1,321 DE , A8NA3, CONTI ELEKTRA,1,0,0,0,0,130 DE , A8IV9, CONTI EMDEN,10,0,8,10,0,66.5 DE , A8VH7, CONTI ESPERANCE,7,4,4,5,0,71.7 DE , A8QM9, CONTI GREENLAND,5,3,5,5,0,22.2 DE , A8LL8, CONTI SALOME,12,9,11,12,0,21.2 DE , DNHS, CONTI SHANGHAI,20,15,17,19,1,83.2 DE , DNES, CONTI SINGA,20,19,20,20,0,11.7 DE , DCSL2, COSCO CHINA,26,21,25,25,1,33.8 DE , DDDO2, COSCO GERMANY,9,8,9,9,0,25.1 DE , A8HG2, COSCO LONG BEACH,15,11,15,15,0,20.7 DE , DDGK2, COSCO NAPOLI,31,0,23,31,0,67.9 DE , A8GF4, COSCO SHENZHEN,18,17,17,18,0,16.4 DE , A8EO8, COSCO VANCOUVER,27,24,24,26,0,27.4 DE , A8EH3, COSCO YOKOHAMA,12,11,12,12,0,12.1 DE , A8QR9, CS DISCOVERY,3,0,1,3,0,79.7 DE , DQVL, CSAV APPENNINI,22,17,19,20,1,54.2 DE , DBUV, CSAV HOUSTON,26,12,22,26,0,36.7 DE , A8OH7, CSAV ITAJAI,6,4,5,6,0,30.8 DE , A8TI2, CSAV LARAQUETE,14,12,12,12,0,57.7 DE , A8IF5, CSAV PARIS,82,76,82,82,0,13.9 DE , DQVN, CSAV PYRENEES,77,47,73,75,1,33.5 DE , A8WC8, CSAV RIO BUENO,51,46,47,49,1,40.3 DE , A8TC4, CSAV RIO ILLAPEL,23,22,23,23,0,12 DE , A8RH4, CSAV ROMERAL,2,0,1,2,0,82.5 DE , A8QL5, CSAV RUNGUE,29,16,24,25,2,104 DE , A8PA8, CSAV RUPANCO,14,1,3,3,2,225.3 DE , A8IF4, CSAV VALENCIA,13,13,13,13,0,18.5 DE , A8FQ8, DAL KALAHARI,74,66,70,71,0,22.7 DE , DGXS, DALIAN EXPRESS,39,38,38,38,1,19.5 DE , DGAF, DALLAS EXPRESS,40,37,40,40,0,17.5 DE , DBBA, DENEB,632,631,631,631,1,3.5 DE , DMMC, DEUTSCHLAND,11,3,3,7,0,104.8 DE , V2OD5, DOLLART TRADER,11,5,8,10,0,50.6 DE , DHDE, DRESDEN EXPRESS,69,62,69,69,0,16.9 DE , DDSB2, DUBLIN EXPRESS,72,70,72,72,0,13.3 DE , DGDD, DUESSELDORF EXPRESS,45,43,45,45,0,11.7 DE , A8SZ3, E.R. BAVARIA,25,21,25,25,0,14.3 DE , A8VC9, E.R. BAYERN,23,22,23,23,0,21.5 DE , A8UT7, E.R. BAYONNE,18,6,16,18,0,46.6 DE , ELZX2, E.R. BERLIN,1,1,1,1,0,11 DE , A8UU3, E.R. BOSTON,62,13,57,61,0,51.1 DE , A8SZ5, E.R. BRANDENBURG,32,0,31,32,0,55.9 DE , ELYA5, E.R. BRISBANE,24,19,21,24,0,23.6 DE , A8UU2, E.R. BUENOS AIRES,25,23,25,25,0,16.9 DE , A8FL5, E.R. CAEN,5,0,4,5,0,62.2 DE , A8AL5, E.R. FREMANTLE,27,7,23,27,0,55.8 DE , A8CS3, E.R. KINGSTON,15,12,13,15,0,22.1 DE , DADD, E.R. MELBOURNE,47,38,46,46,0,20.2 DE , A8CF3, E.R. NEW YORK,13,11,12,13,0,15.7 DE , DBUQ, E.R. PUSAN,35,21,32,33,0,36.3 DE , DPTL, E.R. STRALSUND,12,4,9,12,0,41.1 DE , A8CS2, E.R. YANTIAN,4,3,4,4,0,14.2 DE , DBEA, ELBE,650,649,649,649,1,0.5 DE , ELWR2, ELBWOLF,49,13,34,38,2,84.6 DE , DBKR, ELISABETH MANN BORGESE,670,669,669,669,1,3.3 DE , A8GA5, EMIRATES GANGES,83,65,78,82,0,25 DE , DHEE, ESSEN EXPRESS,28,22,23,24,3,174.9 DE , DDZJ2, EVER CHAMPION,1,0,1,1,0,41 DE , DDZI2, EVER CHARMING,6,6,6,6,0,13.2 DE , DDZC2, EVER CHIVALRY,33,32,33,33,0,9.7 DE , DDZD2, EVER CONQUEST,11,5,11,11,0,29.1 DE , ELXU2, EYRENE,18,10,14,16,0,39.6 DE , DGZS2, FRANKFURT EXPRESS,30,26,29,30,0,18.1 DE , A8IY8, FRISIA KIEL,124,50,105,122,1,44 DE , A8IY9, FRISIA LISSABON,14,13,14,14,0,21.4 DE , A8IY6, FRISIA WISMAR,38,19,30,35,0,42.4 DE , A8FW3, GASCHEM WESER,8,0,1,3,1,219.4 DE , DDSC2, GLASGOW EXPRESS,90,79,86,89,0,21.1 DE , DHDH, HANJIN AMSTERDAM,26,17,22,25,0,38.3 DE , DHPU, HANJIN BASEL,56,0,0,0,52,950.4 DE , DDZK2, HANJIN BOSTON,9,8,9,9,0,12.9 DE , DCCN2, HANJIN CHICAGO,12,10,11,12,0,18.3 DE , DHDM, HANJIN COPENHAGEN,63,38,55,55,7,187.7 DE , DHZQ, HANJIN GENEVA,1,0,1,1,0,46 DE , DAXJ, HANJIN GOTHENBURG,29,16,26,28,1,80.5 DE , DQVJ, HANJIN HAIPHONG,14,12,13,13,0,35.5 DE , DPUW, HANJIN HELSINKI,1,0,0,1,0,101 DE , DCCM2, HANJIN LISBON,8,2,7,7,1,127.5 DE , DHQS, HANJIN MADRID,1,1,1,1,0,21 DE , DQVH, HANJIN MUNDRA,22,20,22,22,0,19.7 DE , DEDM, HANJIN PALERMO,10,9,10,10,0,7.2 DE , A8CN8, HANJIN PHILADELPHIA,7,4,6,7,0,42.4 DE , A8CN9, HANJIN PHOENIX,21,13,19,21,0,29.6 DE , A8CP6, HANJIN PRETORIA,18,12,18,18,0,21.6 DE , DQVM, HANJIN SAN DIEGO,36,33,34,35,0,20.9 DE , DFHA, HANJIN TAIPEI,1,0,1,1,0,46 DE , DIBZ, HANJIN VIENNA,33,24,29,30,1,50.5 DE , DDYZ2, HANJIN YANTIAN,5,2,5,5,0,29.2 DE , DFGX2, HANOVER EXPRESS,23,22,23,23,0,12 DE , DHAF, HANSA ATLANTIC,14,10,12,14,0,21.4 DE , ELWO6, HANSA BREMEN,74,30,45,57,3,96 DE , A8NG3, HANSA CLOPPENBURG,6,4,5,5,1,104.3 DE , DHHZ, HANSA CONSTITUTION,4,2,3,3,1,371.2 DE , DPTT, HANSA INDIA,23,11,17,22,1,65.7 DE , ELUC5, HANSA LUEBECK,44,17,25,34,1,83.6 DE , ELUA3, HANSA STOCKHOLM,11,5,7,9,1,86.4 DE , DBZT, HANSA VICTORY,16,15,16,16,0,13.8 DE , ELWR5, HANSA VISBY,15,15,15,15,0,8.3 DE , DDZG2, HATSU COURAGE,5,1,5,5,0,37.2 DE , DDZH2, HATSU CRYSTAL,32,22,31,32,0,17.6 DE , A8CG7, HEIKE P,20,13,19,20,0,21.8 DE , DBCK, HEINCKE,634,634,634,634,0,3.3 DE , A8IS6, HELLE RITSCHER,3,1,3,3,0,32.7 DE , DPUA, HELVETIA,1,0,1,1,0,41 DE , DDSE2, HERMANN WULFF,13,13,13,13,0,14 DE , V2CL5, HERMES,32,2,16,29,2,154.8 DE , DHER, HOECHST EXPRESS,18,14,17,18,0,21.3 DE , DHEB, HONG KONG EXPRESS,15,13,14,14,1,111.8 DE , DCCR2, HOUSTON EXPRESS,5,5,5,5,0,0.8 DE , D5AG8, HR RECOGNITION,35,1,1,11,10,388.9 DE , D5AG9, HR RESOLUTION,2,1,1,2,0,39.5 DE , A8GK6, HS BEETHOVEN,14,7,11,12,0,49 DE , DDDI2, HYUNDAI TIANJIN,84,25,48,59,3,104.7 DE , A8GH5, IBN ASAKIR,155,26,147,152,1,41.4 DE , A8RU5, ILSE WULFF,15,2,8,12,1,95.4 DE , A8MM4, INDEPENDENT ACCORD,6,1,5,6,0,39 DE , A8MJ4, INDEPENDENT CONCEPT,9,1,1,4,2,181.9 DE , A8MB5, INDEPENDENT PURSUIT,17,14,14,14,1,64.8 DE , A8CG2, INDEPENDENT VENTURE,8,2,4,7,0,62.2 DE , A8XY2, INDEPENDENT VOYAGER,46,42,45,46,0,14 DE , A8CH8, ISODORA,20,5,18,20,0,44.7 DE , A8ID9, ITAJAI EXPRESS,23,22,23,23,0,13.5 DE , DDZF2, ITAL CONTESSA,3,1,2,2,1,501 DE , A8LN2, ITAL ORIENTE,25,13,21,24,0,45 DE , A8FA5, JANUS,11,5,11,11,0,26.6 DE , A8RV6, JPO DELPHINUS,26,4,15,26,0,68.2 DE , A8RW2, JPO DORADO,1,0,1,1,0,42 DE , A8VF7, JPO GEMINI,24,24,24,24,0,10.2 DE , A8GU4, JPO LEO,26,22,25,25,0,20.5 DE , A8KC6, JPO SCORPIOS,43,37,41,43,0,17.8 DE , A8RW4, JPO TUCANA,14,4,11,14,0,51.2 DE , A8RV7, JPO VELA,16,8,13,14,2,216.6 DE , A8RV9, JPO VIRGO,7,6,7,7,0,14.7 DE , A8RW3, JPO VOLANS,92,66,91,92,0,23.1 DE , A8RW5, JPO VULPECULA,5,3,4,5,0,28.4 DE , DDLK, JULIUS S,13,10,13,13,0,16.5 DE , A8FA6, JUPITER,9,1,4,8,0,73.9 DE , V2NA1, KATHARINA S,28,22,28,28,0,18.6 DE , DEHZ, KIEL EXPRESS,104,85,99,100,1,26.5 DE , DGSE, KOBE EXPRESS,27,27,27,27,0,7.1 DE , A8KJ4, KOLLMAR,1,0,0,0,0,233 DE , ELVZ7, KOTA MAJU,5,1,5,5,0,34.6 DE , ELZY4, KOTA SEGAR,5,1,5,5,0,33.2 DE , DFNB2, KUALA LUMPUR EXPRESS,50,0,46,50,0,57.3 DE , DCPI2, KYOTO EXPRESS,19,19,19,19,0,10.4 DE , DIJY2, LEBLON,26,21,26,26,0,17.1 DE , DEHY, LEVERKUSEN EXPRESS,57,51,52,52,5,134.9 DE , A8AY3, LILY OLDENDORFF,2,0,1,1,1,544.5 DE , DDSD2, LIVERPOOL EXPRESS,48,46,48,48,0,12.7 DE , ELZU3, LIWIA P,18,8,17,18,0,34.2 DE , DPLE, LONDON EXPRESS,131,122,131,131,0,16.6 DE , DCPZ2, LOS ANGELES EXPRESS,17,8,17,17,0,33.2 DE , DDYY2, LT CORTESIA,9,6,6,9,0,41.2 DE , A8GU5, MAERSK DABOU,5,4,5,5,0,26.4 DE , A8EH5, MAERSK DALLAS,19,14,19,19,0,19.3 DE , A8OU4, MAERSK DAMIETTA,10,8,8,9,0,35 DE , A8IJ4, MAERSK DANBURY,57,41,55,57,0,23.8 DE , A8GU6, MAERSK DANVILLE,7,6,7,7,0,19.7 DE , DDBB2, MAERSK DELLYS,65,10,57,63,0,53.9 DE , A8EH2, MAERSK DENVER,35,26,33,34,1,31.7 DE , DDAC2, MAERSK DERINCE,36,26,35,35,0,29.2 DE , A8PX5, MAERSK DHAHRAN,14,4,14,14,0,31.6 DE , A8IY2, MAERSK DIEPPE,39,38,39,39,0,11.1 DE , A8JE6, MAERSK DRURY,32,29,30,32,0,18.2 DE , A8GU8, MAERSK DUNCAN,16,16,16,16,0,10.8 DE , A8IX7, MAERSK DUNEDIN,15,11,14,15,0,27.5 DE , A8PX4, MAERSK JEFFERSON,6,0,2,6,0,65.2 DE , A8PW8, MAERSK KARLSKRONA,28,16,19,25,1,63.1 DE , VREX7, MAERSK NIAMEY,3,3,3,3,0,11.7 DE , VRFO7, MAERSK NIMES,23,13,16,19,0,52.2 DE , VRFW5, MAERSK NITEROI,16,7,12,16,0,34.5 DE , A8MZ9, MAERSK SEMARANG,39,36,39,39,0,13.7 DE , DDJQ2, MAERSK SHEERNESS,19,2,17,19,0,53.9 DE , DDSX2, MAERSK SURABAYA,43,38,42,42,1,47.7 DE , A8SE3, MALLECO,11,3,10,11,0,49.6 DE , V2OS3, MARE GALLICUM,21,6,15,20,1,62 DE , DBBT, MARIA S. MERIAN,686,685,685,685,1,0 DE , ELSP9, MASOVIA,3,0,2,3,0,73.3 DE , A8CC9, MATILDE,64,60,63,64,0,11.4 DE , A8JR5, MCC SHANGHAI,42,32,39,39,0,31.1 DE , DBFX, MEERKATZE,8,0,0,0,0,343.5 DE , DBPG, MELLUM,1,0,0,1,0,102 DE , V2OH7, MENTOR,2,0,0,1,0,131.5 DE , DEIR, MERKUR BAY,8,3,7,7,0,55.8 DE , ELZA5, MERKUR CLOUD,41,36,41,41,0,17.3 DE , DDPH, MERKUR SKY,33,31,31,32,1,37.2 DE , DBBH, METEOR,656,573,606,630,4,29.1 DE , DDJI, MICHAELA S,1,0,1,1,0,42 DE , A8MG8, MIZAR,11,3,10,11,0,34.2 DE , A8RL4, MOL CALEDON,56,56,56,56,0,12.2 DE , A8IX8, MOL CULLINAN,40,33,40,40,0,21.1 DE , V2MH, MOL DREAM,16,13,15,15,1,78.9 DE , A8CH9, MOL SYMPHONY,2,0,0,0,2,518.5 DE , DGOH2, MONTE ACONCAGUA,19,9,19,19,0,33.5 DE , DFWV2, MONTE ALEGRE,16,16,16,16,0,14.9 DE , DFTH2, MONTE AZUL,5,4,5,5,0,16.2 DE , DHTK, MONTE CERVANTES,52,47,52,52,0,15 DE , DAJC, MONTE OLIVIA,25,19,25,25,0,19.4 DE , DNCQ, MONTE PASCOAL,7,7,7,7,0,12.1 DE , DGHJ, MONTE ROSA,18,18,18,18,0,11.7 DE , DCLH2, MONTE SARMIENTO,8,3,8,8,0,36.8 DE , DFKP2, MONTE TAMARO,14,11,13,14,0,21.1 DE , DPOG, MSC ADRIATIC,73,66,72,73,0,15.2 DE , DPMT, MSC ANTARES,25,15,25,25,0,24.2 DE , A8ZU9, MSC BARCELONA,53,37,52,53,0,24.5 DE , A8YD3, MSC BARI,23,12,20,20,3,210.8 DE , A8HS4, MSC BEIJING,38,33,38,38,0,18.9 DE , DIUR2, MSC BENEDETTA,28,22,27,28,0,23 DE , A8IM7, MSC BILBAO,6,2,2,6,0,59.5 DE , A8LK7, MSC BREMEN,30,16,28,29,1,71.9 DE , A8EY5, MSC BRINDISI,7,7,7,7,0,10.4 DE , A8HS3, MSC BRUXELLES,28,20,25,28,0,24.9 DE , A8HR5, MSC BUSAN,9,8,9,9,0,15.6 DE , DDJG2, MSC CAROUGE,12,8,12,12,0,26.6 DE , A8JC5, MSC CHARLESTON,74,66,72,74,0,18.7 DE , A8HS2, MSC CHICAGO,27,26,27,27,0,15.6 DE , D5BU7, MSC CRISTINA,167,107,152,167,0,28.6 DE , A8IG3, MSC DAVOS,3,3,3,3,0,13.3 DE , A8VG3, MSC ENGLAND,30,26,29,30,0,21.9 DE , A8KO3, MSC FIRENZE,1,0,0,1,0,112 DE , DHZR, MSC FLAMINIA,25,5,14,21,1,89 DE , A8GJ5, MSC FLORIDA,17,5,10,13,0,71.6 DE , A8VH6, MSC FUJI,5,3,5,5,0,28.4 DE , DBUT, MSC GEMMA,17,9,16,17,0,29.9 DE , A8UX5, MSC GENOVA,27,8,24,27,0,43 DE , DARU, MSC ILONA,21,18,20,21,0,14 DE , A8LL9, MSC LISBON,18,16,18,18,0,17.8 DE , DIGY2, MSC LIVORNO,11,9,10,11,0,18.9 DE , DPJW, MSC MIRA,37,24,34,35,0,34.2 DE , D5BL4, MSC MONTEREY,8,8,8,8,0,13.8 DE , A8CJ2, MSC PRAGUE,4,3,4,4,0,0 DE , A8KX4, MSC ROMA,54,44,50,53,0,23.5 DE , A8HO3, MSC SHANGHAI,9,7,9,9,0,16.2 DE , DQVI, MSC TANZANIA,18,16,18,18,0,16.6 DE , A8ZE4, MSC TARANTO,82,79,82,82,0,13.4 DE , DCSY2, MSC TEXAS,20,16,18,20,0,24.5 DE , A8JM6, MSC TOKYO,3,2,2,3,0,46.3 DE , DQVK, MSC UGANDA,14,14,14,14,0,3.8 DE , D5BE4, MSC VEGA,42,29,38,40,0,33 DE , A8CI9, MSC VIENNA,16,7,12,16,0,50.5 DE , A8ZV8, MSC VIGO,47,34,43,46,0,24.2 DE , V7LZ9, NADIR,10,6,8,10,0,35.7 DE , DGWD2, NAGOYA EXPRESS,77,47,75,76,1,46.9 DE , A8EG9, NEDLLOYD VALENTINA,13,6,6,6,5,532.8 DE , V7LZ8, NEPTUN,3,1,1,3,0,48.7 DE , DBJM, NEUWERK,691,690,690,690,1,0.3 DE , VSXC9, NEW ORLEANS EXPRESS,11,8,10,10,1,49.6 DE , A8IT6, NILEDUTCH DURBAN,6,5,5,5,0,39.8 DE , A8JK4, NILEDUTCH GUANGHOU,27,15,25,26,0,34.3 DE , A8XA3, NILEDUTCH SHENZHEN,15,12,14,14,1,67.9 DE , DGOS, NORFOLK EXPRESS,43,34,42,43,0,22.9 DE , A8CB7, NORTHERN ENDEAVOUR,19,1,1,5,3,215.8 DE , A8CB9, NORTHERN ENDURANCE,70,45,61,68,0,35.9 DE , A8HA7, NORTHERN ENTERPRISE,6,0,0,2,2,462 DE , D5BI4, NORTHERN RELIANCE,1,0,1,1,0,31 DE , DCQR2, NORTHERN VIVACITY,23,9,18,23,0,45.5 DE , DCSI2, NORTHERN VOLITION,7,5,6,6,1,231.4 DE , DEGI, NOVIA,17,15,17,17,0,16 DE , DDFD2, NYK GALAXY,1,1,1,1,0,30 DE , V2FN, OCEAN,1,0,0,0,0,261 DE , A8LG7, OLIVIA,14,0,10,14,0,70.6 DE , DEGK, OLIVIA,36,28,35,36,0,14.1 DE , V2KA9, OMEGAGAS,4,0,1,2,0,120 DE , 9HA2545, ORION,13,0,13,13,0,43.3 DE , DDVK2, OSAKA EXPRESS,17,13,16,16,0,22.8 DE , A8MV6, PACIFIC FANTASY,21,5,19,20,0,41.4 DE , DCSZ2, PACIFIC LINK,11,9,10,10,1,145.2 DE , DBRE, PARADISE N,11,4,9,11,0,49.1 DE , DIHE, PARIS EXPRESS,21,21,21,21,0,10.7 DE , ZDKS7, PAZIFIK,8,7,8,8,0,16.2 DE , A8CO2, PIRO,33,18,26,29,1,90.5 DE , DBLK, POLARSTERN,186,123,123,146,3,55.6 DE , ELZU7, POMMERN,1,1,1,1,0,30 DE , A8UN3, PORTO,6,4,6,6,0,22.3 DE , DQVO, PORTUGAL,6,6,6,6,0,8 DE , DIOB, POS HONGKONG,31,23,30,30,0,39.2 DE , DBKV, POSEIDON,558,557,557,557,1,0 DE , A8NF2, POSEN,40,22,31,40,0,35.3 DE , ELZU8, POTSDAM,22,0,16,22,0,70.1 DE , ELYS6, POWHATAN,2,2,2,2,0,13 DE , DGZR2, PRAGUE EXPRESS,3,3,3,3,0,10.7 DE , ELYP7, PREMNITZ,26,21,26,26,0,13.9 DE , A8KY7, PUELCHE,19,3,11,16,1,111.8 DE , DQVG, PUSAN,21,19,21,21,0,10.3 DE , A8TH7, RDO CONCERT,37,0,32,36,0,64.4 DE , V7EG5, RICKMERS ANTWERP,2,1,2,2,0,42.5 DE , V7FS3, RICKMERS DALIAN,97,38,60,63,25,259.5 DE , V7FF2, RICKMERS NEW ORLEANS,6,3,5,6,0,35.7 DE , V7EE5, RICKMERS SINGAPORE,13,10,12,13,0,20.8 DE , V7DW6, RICKMERS TOKYO,7,5,7,7,0,25.9 DE , D5BO9, RIO BLANCO,18,16,17,17,0,17 DE , DDID2, RIO DE JANEIRO,22,15,21,22,0,22 DE , DMQN, RIO DE LA PLATA,9,8,9,9,0,12.8 DE , DGUG2, RIO MADEIRA,29,27,29,29,0,14.7 DE , DFVY2, RIO NEGRO,22,3,5,8,8,242.5 DE , A8JR4, RIO TAKU,50,47,50,50,0,13.2 DE , DMRX, ROTTERDAM EXPRESS,69,65,68,69,0,13.4 DE , A8CI8, SAAR N,63,38,46,46,17,228.8 DE , DILS, SAMARIA,39,37,39,39,0,13.9 DE , A8PC8, SAN ADRIANO,64,52,59,64,0,36.5 DE , A8PG8, SAN ALESSIO,13,10,12,13,0,27.4 DE , A8OK6, SAN AMERIGO,11,6,8,11,0,40.7 DE , A8OK7, SAN ANDRES,19,13,14,19,0,39.4 DE , A8PC7, SAN ANTONIO,7,5,7,7,0,23 DE , A8PC9, SAN AURELIO,18,17,18,18,0,14.6 DE , ELVB3, SAN CLEMENTE,29,14,25,29,0,42.2 DE , ELVB6, SAN CRISTOBAL,26,14,24,24,1,88.3 DE , DNEN, SAN FELIPE,31,27,30,30,0,24.3 DE , DIGF, SAN FRANCISCO,26,15,26,26,0,24.1 DE , ELVG8, SAN ISIDRO,1,0,1,1,0,52 DE , ELVG2, SAN VICENTE,23,21,23,23,0,13.2 DE , A8JZ4, SANTA BALBINA,10,7,10,10,0,31.5 DE , ELVF4, SANTA BARBARA,43,26,41,42,0,38.7 DE , A8JZ3, SANTA BELINA,23,7,19,23,0,51.6 DE , A8NQ5, SANTA BETTINA,25,23,25,25,0,13.9 DE , A8OK5, SANTA BIANCA,19,14,19,19,0,22.1 DE , A8YJ9, SANTA CATARINA,26,3,6,12,7,256.2 DE , DAJT, SANTA CLARA,17,11,16,17,0,25.1 DE , A8YW2, SANTA CRUZ,39,37,38,38,1,24.3 DE , A8IR6, SANTA ELENA 1,1,1,1,1,0,10 DE , A8IQ2, SANTA FELICITA,28,21,27,28,0,22.9 DE , DGSR, SANTA FRANCESCA,39,27,38,39,0,25.6 DE , A8IP8, SANTA GIANNINA,86,51,76,84,0,31.5 DE , A8IP9, SANTA GIORGINA,7,4,6,6,1,137.9 DE , DGGH, SANTA GIOVANNA,13,12,12,13,0,14.3 DE , ELYR2, SANTA GIULIANA,21,17,18,21,0,22 DE , DGGE, SANTA GIULIETTA,16,15,16,16,0,13.9 DE , ELVG7, SANTA MONICA,4,4,4,4,0,12 DE , A8IY3, SANTA PAOLA,35,25,32,32,2,48.4 DE , DCDO2, SANTA PELAGIA,60,46,60,60,0,21.2 DE , DCDP2, SANTA PHILIPPA,15,15,15,15,0,13.6 DE , DPRB, SANTA RAFAELA,12,5,5,12,0,44.6 DE , DPGZ, SANTA REBECCA,15,13,15,15,0,15.8 DE , DIOY2, SANTA RITA,32,22,29,30,1,44.8 DE , A8RK9, SANTA ROMANA,16,0,10,16,0,75.8 DE , A8ZS7, SANTA ROSA,19,0,1,6,4,236.9 DE , A8RL2, SANTA ROSANNA,18,16,18,18,0,15.1 DE , A8RL3, SANTA RUFINA,6,2,5,6,0,44.8 DE , D5AH6, SANTA TERESA,26,23,26,26,0,18.4 DE , 5BPA3, SARAH SCHULTE,52,33,49,50,0,28.9 DE , DNDD, SAVANNAH EXPRESS,65,57,65,65,0,14.2 DE , DGOQ, SCHARHOERN,43,20,30,36,2,96.7 DE , A8UE4, SEATTLE EXPRESS,23,18,21,23,0,24.6 DE , DBFC, SEEADLER,457,14,14,14,0,332.2 DE , DBFI, SEEFALKE,416,11,11,11,0,333.7 DE , DHBN, SEOUL EXPRESS,48,36,46,46,0,24.9 DE , A8OO9, SEVILLIA,3,2,3,3,0,30.3 DE , A8PF5, SICILIA,5,3,4,4,1,314.4 DE , DGZT2, SOFIA EXPRESS,75,39,65,75,0,37.4 DE , DBFH, SOLEA,554,553,553,553,1,3.1 DE , DGBE, STUTTGART EXPRESS,36,32,36,36,0,17.5 DE , A8AW2, SUAPE EXPRESS,1,1,1,1,0,21 DE , A8IL9, TABEA,24,14,20,23,0,36.5 DE , V7LZ7, TAURUS,34,0,24,34,0,54.7 DE , A8BS7, TIGER SHARK,1,0,1,1,0,43 DE , A8KI4, TIGER SKY,1,0,0,0,0,323 DE , DGTX, TOKYO EXPRESS,69,50,68,69,0,19.8 DE , A8XZ8, TRAVE TRADER,2,1,1,1,0,78.5 DE , A8OP7, TS KOREA,8,5,8,8,0,31.9 DE , DDYL2, TSINGTAO EXPRESS,52,35,43,48,0,36.9 DE , A8RV8, UASC AJMAN,21,7,10,15,0,94.7 DE , A8KN6, UASC DAMMAM,21,20,21,21,0,12.3 DE , A8UL5, UASC JEDDAH,41,22,37,40,1,40.6 DE , A8UL3, UASC RAMADI,6,5,5,6,0,19.8 DE , DCPL2, UASC SHARJAH,40,36,39,39,1,30.8 DE , A8UL4, UASC SHUAIBA,40,32,38,40,0,22.7 DE , V7MA7, URANUS,44,22,41,44,0,33.1 DE , A8SE8, VALPARAISO EXPRESS,22,22,22,22,0,12.7 DE , A8UE5, VANCOUVER EXPRESS,38,35,37,37,1,56.9 DE , DGWF2, VIENNA EXPRESS,8,4,7,8,0,36.6 DE , A8UJ3, VIONA,30,20,23,28,0,29.4 DE , DBFR, WALTHER HERWIG 3,406,406,406,406,0,0 DE , DBBC, WEGA,611,610,610,610,1,3.6 DE , V7DI2, WEHR ALTONA,1,1,1,1,0,21 DE , V7DT6, WEHR BILLE,12,8,12,12,0,21.6 DE , V7CY4, WEHR BLANKENESE,18,11,15,17,0,31.4 DE , V7DY3, WEHR HAVEL,48,7,15,30,4,141.1 DE , V7DG6, WEHR WESER,48,7,10,48,0,61.3 DE , DFCX2, WELLINGTON EXPRESS,90,88,90,90,0,14.1 DE , DBEB, WESER,621,621,621,621,0,0.3 DE , A8JY5, WESTERDIEK,9,0,7,8,0,80.4 DE , DFRZ, WESTERHAMM,8,5,8,8,0,27.1 DE , A8CH2, WESTERMOOR,12,12,12,12,0,15.2 DE , ELWZ5, WESTWOOD CASCADE,50,22,40,45,3,63.7 DE , A8AJ4, WESTWOOD DISCOVERY,9,7,8,9,0,13.4 DE , DANR, WESTWOOD PACIFIC,21,21,21,21,0,11.7 DE , A8KH9, WIDUKIND,37,32,35,37,0,16.3 DE , A8CG3, WILHELM E,13,0,11,13,0,62.7 DE , DPTS, WOTAN,3,2,3,3,0,11 DE , A8PB2, X-PRESS MAKALU,5,5,5,5,0,5 DE , DPCK, YANTIAN EXPRESS,4,4,4,4,0,11.8 DE , A8VN4, YM KWANG YANG,16,16,16,16,0,16.3 DE , A8FU7, ZIM BEIJING,26,19,22,23,3,160.3 DE , DFZB2, ZIM ONTARIO,19,13,16,18,1,94.3 DE , A8ER9, ZIM SAVANNAH,45,38,44,45,0,15 FR , ROSS, LA LOUISE,294,294,294,294,0,5.1 FR , MNDC9, SAFMARINE MERU (AWS),10,9,10,10,0,19.2 FR , FLAO, VAGABOND (AWS),718,284,555,702,1,45.2 GB , ZCDV2, Adonia,53,40,44,45,2,55.4 GB , PJKV, Agulhas Stream,46,45,45,46,0,13.2 GB , V7PU9, Al Ghuwairiya,82,65,81,82,0,14.4 GB , HZGN, Al Mareekh,25,20,21,24,1,48.8 GB , HZGH, Al Moshtaree,35,31,33,35,0,14.8 GB , HZDD, Al Zohal 1,22,19,22,22,0,16 GB , VQKZ6, Amazonas,43,23,33,39,3,192.4 GB , S6JU, APL Iris,35,29,33,33,2,93.2 GB , 9VVD, APL Jade,22,12,21,21,0,35.3 GB , ZCDN2, Arcadia,54,38,48,51,0,30.9 GB , ZCDW9, Aurora,43,28,33,34,3,73.8 GB , ZCEE2, Azura,59,29,34,36,12,205.5 GB , C6QF6, Barbet Arrow,7,3,4,6,1,192.7 GB , OXVA2, Beaumont,83,46,81,82,1,42.3 GB , PENR, Benguela Stream,163,153,162,162,0,15.9 GB , OZCZ2, Bentonville,16,10,14,16,0,23.2 GB , 3EDI6, Berge Arctic,71,45,71,71,0,22.1 GB , LAIP5, Berge Atlantic,18,15,17,17,0,22.6 GB , MCLJ8, British Beech,14,2,12,14,0,54.9 GB , MGRH9, British Chivalry,32,19,29,32,0,31.1 GB , MPMM5, British Commerce,28,23,27,28,0,18.7 GB , MLJA8, British Confidence,7,1,4,4,0,90.9 GB , MGRX2, British Cormorant,50,38,50,50,0,21.6 GB , MRSA8, British Councillor,2,1,2,2,0,32.5 GB , MNYF6, British Courage,27,14,19,24,0,47.6 GB , MHNL6, British Courtesy,30,26,28,28,1,40.8 GB , MCCW7, British Curlew,63,52,62,63,0,4.3 GB , MGSG6, British Cygnet,50,27,45,50,0,28.6 GB , 2AKI4, British Diamond,63,62,62,62,1,26.2 GB , MGSM5, British Eagle,32,25,28,29,0,39.2 GB , MIBR, British Emerald,1,1,1,1,0,22 GB , MVQP8, British Emissary,39,37,38,39,0,16.4 GB , MMER9, British Ensign,61,27,55,61,0,31.5 GB , MNAN4, British Envoy,60,53,55,56,1,36.5 GB , VQIV8, British Esteem,8,4,4,5,1,147 GB , VQGB2, British Explorer,39,30,38,38,1,22.5 GB , MGRL8, British Falcon,11,11,11,11,0,11 GB , MGRX9, British Gannet,18,16,17,18,0,17.3 GB , MHMZ8, British Harmony,52,45,50,51,0,19 GB , VQFV3, British Hawthorn,25,15,19,25,0,33.7 GB , MCUV3, British Hazel,63,15,48,63,0,44 GB , MCZN2, British Holly,59,36,45,52,5,132.8 GB , VQHO7, British Innovator,70,70,70,70,0,10.7 GB , MGGF9, British Integrity,5,5,5,5,0,10 GB , MGRL4, British Kestrel,25,16,23,24,1,45.4 GB , VQAJ8, British Laurel,37,7,20,29,1,86.5 GB , MFLM9, British Liberty,25,14,24,24,1,44.6 GB , MGPU2, British Mallard,57,51,55,57,0,17.4 GB , VQIB9, British Merchant,69,62,66,68,0,7.4 GB , VQOG5, British Merlin,39,39,39,39,0,4.5 GB , VQKR7, British Oak,116,71,108,116,0,25.4 GB , MCCN6, British Osprey,37,37,37,37,0,11.9 GB , ZQTP2, British Pride,58,44,58,58,0,20.5 GB , MZDL7, British Progress,1,0,1,1,0,52 GB , ZQCP3, British Purpose,3,2,3,3,0,23.7 GB , MGSH7, British Robin,10,3,9,10,0,40.8 GB , 2AKI2, British Ruby,18,13,16,18,0,27.4 GB , 2AKI3, British Sapphire,3,0,2,3,0,73 GB , MEPP3, British Security,24,21,23,24,0,17 GB , MHNO6, British Serenity,4,3,4,4,0,5.5 GB , VQNW6, British Swift,20,14,17,19,1,41.2 GB , MDTE9, British Tenacity,52,11,44,52,0,53.9 GB , ZIPR7, British Trader,36,31,33,33,1,38.1 GB , MHNN5, British Tranquillity,37,17,28,37,0,35.3 GB , MFLQ4, British Unity,53,31,46,52,0,37.7 GB , MDGV9, British Vine,18,15,17,17,1,95.3 GB , VQIC2, British Willow,13,13,13,13,0,11.7 GB , OXVD2, Brownsville,83,49,71,76,2,50.7 GB , ZCBO2, Buccleuch,4,0,0,3,0,128.8 GB , S6OM, Cable Retriever,14,2,13,14,0,42.7 GB , ZCBW2, Cape Carmel,35,32,34,34,0,19 GB , ZCDG8, Caribbean Princess,85,67,77,81,3,47.8 GB , C6KD7, Chiquita Belgie,83,69,82,83,0,18.3 GB , C6VR4, Chiquita Bremen,68,65,67,68,0,14.5 GB , C6KD8, Chiquita Deutschland,29,25,29,29,0,17.6 GB , C6KD5, Chiquita Italia,43,40,42,43,0,18.3 GB , C6KD6, Chiquita Nederland,7,7,7,7,0,12.3 GB , C6VR5, Chiquita Rostock,20,18,20,20,0,16.4 GB , C6KD4, Chiquita Scandinavia,31,30,31,31,0,11.1 GB , C6KD9, Chiquita Schweiz,58,48,58,58,0,17.8 GB , ZCDF4, Coral Princess,50,46,46,48,2,57.4 GB , C6XQ2, Corella Arrow,32,23,27,29,0,42.1 GB , C6IO9, Cormorant Arrow,12,9,11,12,0,19.3 GB , ZCDM6, Crown Princess,41,35,37,39,2,52.8 GB , VRBH6, CSAV Licanten,2,0,0,0,2,1544.5 GB , VRBH4, CSCL Dalian,17,16,17,17,0,2.6 GB , ZCBU2, Dawn Princess,40,33,38,39,1,33.5 GB , ZCDF8, Diamond Princess,25,16,22,22,1,40.9 GB , ZCDP8, Emerald Princess,78,51,64,71,1,47.4 GB , C6OR4, Emu Arrow,80,71,78,79,0,0 GB , ZDLS1, Ernest Shackleton,3,3,3,3,0,0 GB , 2AAY7, FS Aquarius,19,15,15,15,0,53.1 GB , ZCDA9, Golden Princess,33,16,20,30,2,107.7 GB , ZCBU5, Grand Princess,89,79,86,87,0,0 GB , ZQAY4, Grasmere Maersk,90,81,88,89,1,30.8 GB , C6OM7, Grebe Arrow,38,30,36,36,1,30.8 GB , C6JE2, Harefield,14,13,14,14,0,21.2 GB , C6CU6, Ibis Arrow,71,63,69,70,0,23.4 GB , ZCDG4, Island Princess,4,3,4,4,0,14.5 GB , C6RM7, Jaeger Arrow,42,38,38,39,1,13.5 GB , ZDLP, James Clark Ross,99,81,87,90,2,29.4 GB , OYYK2, Jens Maersk,17,12,15,16,0,26.5 GB , MQPF2, Jervis Bay,5,3,4,5,0,35 GB , C6QF4, Kestrel Arrow,1,1,1,1,0,21 GB , PHBO, Klipper Stream,42,35,39,40,0,29.1 GB , E5U2135, Lapponian Reefer,34,32,32,33,1,24.6 GB , OVSB2, Lars Maersk,33,23,26,31,0,27.8 GB , OVZV2, Laust Maersk,47,39,44,46,0,22.3 GB , OYYL2, Lexa Maersk,30,22,26,30,0,24.8 GB , ZCBD3, Lisbon Express,21,11,18,20,0,39.3 GB , ZCDM8, LNG Adamawa,44,21,41,43,1,33 GB , ZCDL9, LNG Akwa Ibom,20,6,13,17,0,68.2 GB , MYJG2, Loch Rannoch,3,3,3,3,0,14.3 GB , OZDA2, Maersk Brooklyn,22,4,20,22,0,37.8 GB , OXVE2, Maersk Buffalo,14,0,7,13,0,73.1 GB , MQYA3, Maersk Dalton,8,7,8,8,0,19.2 GB , MQEC7, Maersk Darlington,1,1,1,1,0,11 GB , MRGU3, Maersk Dartford,38,35,38,38,0,14 GB , MSTM6, Maersk Dauphin,9,8,9,9,0,10.9 GB , MSDM7, Maersk Delano,24,15,24,24,0,33.8 GB , MTFH5, Maersk Delmont,30,28,30,30,0,16.4 GB , VQBW2, Maersk Gateshead,40,27,39,39,0,27.3 GB , MYJU, Maersk Kelso,27,9,21,27,0,54.3 GB , MTDU5, Maersk Kendal,16,14,16,16,0,17.2 GB , VRGJ6, Maersk Kiel,66,50,62,64,0,26.7 GB , ZNQO3, Maersk Kithira,51,24,44,50,0,30.2 GB , VRGM8, Maersk Kyrenia,45,38,42,44,1,25.4 GB , 9V9763, Maersk Laguna,4,2,2,2,1,198 GB , VRJH7, Maersk Lebu,2,1,1,1,1,702.5 GB , A8PK9, Maersk Miami,9,4,8,9,0,35.2 GB , OZDJ2, Maersk Newport,21,16,19,19,0,27.1 GB , OZDK2, Maersk Norfolk,35,26,29,33,0,29.6 GB , A8DH2, Maersk Nottingham,7,7,7,7,0,13.9 GB , MYSU5, Maersk Patras,20,0,1,2,15,1206.4 GB , MZFR9, Maersk Rapier,8,0,6,7,0,54.8 GB , OWIX2, Maersk Rosyth,24,6,19,23,1,103.6 GB , A8KW3, Maersk Saigon,7,6,6,7,0,29.4 GB , A8JS7, Maersk Sana,25,6,22,25,0,48.8 GB , A8JK7, Maersk Santana,27,21,23,25,2,172.4 GB , DDJS2, Maersk Sarnia,49,37,46,46,0,33.4 GB , A8LK3, Maersk Seoul,32,27,32,32,0,17.9 GB , A8LW6, Maersk Singapore,28,10,23,28,0,43.5 GB , A8KW2, Maersk Stralsund,11,0,0,1,4,802.4 GB , DDJU2, Maersk Sydney,5,4,5,5,0,19.4 GB , S6TV, Maersk Wave,15,12,13,14,1,52.7 GB , V7TU9, Maestro Lion,40,40,40,40,0,11.8 GB , C6OA3, Mandarin Arrow,1,0,1,1,0,41 GB , LAMG7, Merlin Arrow,39,36,38,39,0,14.1 GB , ZCDH7, Milan Express,5,2,4,5,0,36.4 GB , C6NI8, Mozu Arrow,50,39,49,50,0,12 GB , ZQDI9, Nedlloyd Drake,73,31,64,73,0,41.9 GB , A8PK8, Nedlloyd Honshu,17,17,17,17,0,13.6 GB , MZER8, Nedlloyd Hudson,88,25,72,86,0,52 GB , A8DG9, Nedlloyd Marita,67,63,67,67,0,13.6 GB , MZFC6, Nedlloyd Tasman,32,24,27,28,1,80.7 GB , ZCDS4, Ocean Princess,32,19,22,24,4,141.5 GB , ZCDN9, Oceana,31,20,29,30,0,21.7 GB , OXKO2, Olivia Maersk,23,2,18,21,0,66.7 GB , VRVQ9, OOCL Belgium,16,12,16,16,0,17.1 GB , ZCDU9, Oriana,7,6,7,7,0,18.4 GB , GDTT, Pacific Guardian,34,21,27,31,1,47.5 GB , VQKZ5, Parana,17,10,16,17,0,28.6 GB , C6JE4, Petersfield,26,12,23,24,1,54.1 GB , C6NZ3, Pine Arrow,40,24,36,38,0,38.3 GB , C6OT4, Plover Arrow,55,54,55,55,0,9 GB , C6TQ3, Poplar Arrow,26,0,1,13,0,121.3 GB , ZCEF2, Queen Elizabeth,40,29,35,37,2,44.4 GB , ZCEF6, Queen Mary 2,47,24,37,40,4,142.6 GB , ZCEF3, Queen Victoria,12,10,10,10,0,53.2 GB , 9HA2950, Quest for Adventure,47,9,22,32,8,199.7 GB , ZCBV4, Quorn,40,27,39,39,0,26.6 GB , A8JR6, Rio Thelon,38,33,38,38,0,16.1 GB , ZCDY2, Ruby Princess,47,35,42,42,2,42.7 GB , 2BLY2, Safmarine Bayete,49,22,35,45,0,50.7 GB , 2BLY5, Safmarine Benguela,28,17,24,27,0,30.6 GB , MGDM, Safmarine Mafadi,37,12,25,26,11,450.4 GB , 2AQK7, Safmarine Nakuru,44,21,40,42,1,64.5 GB , 2ALE5, Safmarine Nile,50,30,44,49,0,32.6 GB , MGJS8, Safmarine Nokwanda,29,8,23,28,0,39.6 GB , MGGK4, Safmarine Nomazwe,10,8,9,9,1,60.6 GB , 2AQK9, Safmarine Nuba,39,24,33,36,0,26.1 GB , 2AJI3, Safmarine Nyassa,26,21,25,26,0,21 GB , 9HA2415, Saga Ruby,6,3,5,6,0,27.3 GB , 9HOF8, SAGA SAPPHIRE,16,11,14,15,0,23.2 GB , ZCDG7, Sapphire Princess,66,31,42,54,6,123.2 GB , ZCBU3, Sea Princess,28,19,27,27,0,23.9 GB , ZCBV6, Snowdon,29,7,23,26,2,120.7 GB , C6SD9, Spruce Arrow,53,16,36,47,0,56 GB , MMHE5, St. Helena,86,36,71,79,1,46.8 GB , ZCDD6, Star Princess,46,42,44,44,2,55.8 GB , MZIU7, Stavros S Niarchos,32,15,32,32,0,25.8 GB , ZCBZ5, Talca,13,2,9,10,2,585.5 GB , MYMY6, Toisa Coral,14,8,12,14,0,16.2 GB , VQHR9, Toisa Independent,6,4,6,6,0,28 GB , C6NR5, Toucan Arrow,21,9,17,20,1,72.3 GB , V7OE6, Umm al Amad,93,69,86,92,0,23.7 GB , ZCBD4, Valencia Express,1,1,1,1,0,21 GB , ZCDT2, Ventura,22,16,21,21,0,19.9 GB , 2AUO5, VOS Pioneer,56,48,50,50,3,46.7 GB , C6JE5, Westfield,21,8,20,21,0,31.7 GB , C6JD7, Wren Arrow,74,34,52,63,3,71.3 HK , VRDW2, Dapeng Moon,38,0,37,38,0,52.9 HK , VQGQ4, Maersk Gairloch,40,0,34,38,0,64.8 HK , VRBQ6, OOCL Asia,25,0,24,25,0,53.7 HK , VRAR6, OOCL Atlanta,12,5,12,12,0,34.8 HK , VRIB3, OOCL Beijing,9,0,8,8,1,131.3 HK , VRFJ6, OOCL Brisbane,23,0,23,23,0,51.2 HK , VRIB2, OOCL Canada,24,1,24,24,0,48.6 HK , VRFX2, OOCL Charleston,37,0,31,37,0,63.6 HK , VRFW9, OOCL Dalian,13,0,10,13,0,63.3 HK , VRBX7, OOCL Europe,12,0,11,12,0,59.3 HK , VRZK9, OOCL Hamburg,4,0,4,4,0,51.2 HK , VRDE7, OOCL Houston,17,4,17,17,0,37.1 HK , VRGO7, OOCL Jakarta,14,0,10,14,0,70.4 HK , VRGE3, OOCL Le Havre,13,0,12,13,0,52.2 HK , VRGO3, OOCL Luxembourg,21,1,14,21,0,54.1 HK , VRZL3, OOCL Ningbo,17,0,14,17,0,61.6 HK , VRZL2, OOCL Qingdao,16,0,15,16,0,55.1 HK , VRZK8, OOCL Rotterdam,1,0,1,1,0,52 HK , VRFU8, OOCL Seoul,13,0,12,13,0,56.7 HK , VRYO2, OOCL Shenzhen,20,1,18,19,0,57.3 HK , VRVL2, OOCL Singapore,1,1,1,1,0,11 HK , VRCU7, OOCL Southampton,10,0,10,10,0,51.4 HK , VRAR7, OOCL TianJin,8,0,7,8,0,58.8 HK , VRCI9, OOCL Tokyo,10,3,10,10,0,37.8 HK , VRDB3, OOCL Yokohama,17,12,16,16,1,48.5 HK , VRCB4, OOCL Zhoushan,8,0,7,8,0,60.9 HK , 3FWP3, Star Pisces,10,0,10,10,0,51.2 HK , 3FCE9, Uni Pacific,5,0,2,4,1,159.6 IE , EIPT, ILV Granuaile,3,2,2,2,1,210.7 IE , C4HP2, ULYSSES,20,20,20,20,0,0 IL , 4XFB, ZIM ASIA,8,0,4,6,1,160.4 IL , 4XIS, ZIM BARZELONA,15,13,15,15,0,13.1 IL , 4XIM, ZIM HAIFA,4,0,0,0,4,1366.2 IL , A8IZ2, ZIM QINGDAO,24,13,18,21,2,68.6 IL , 4XFV, ZIM VIRGINIA,27,23,24,24,3,110 IN , AUBC, Desh Prem,6,5,6,6,0,17.2 IN , AUCT, Desh Shanti,17,12,16,17,0,27.6 IN , ATSF, Gandhar,6,1,4,5,1,283 IN , ATSS, Maharaja Agrasen,17,14,17,17,0,18.7 IN , VVZU, Maharshi Parshuram,6,6,6,6,0,16.7 IN , VTXF, Nanga Parbat,10,1,5,9,0,72.1 IS , TFNA, ARNI FRIDRIKSSON,46,30,35,41,1,68.6 IS , TFEA, BJARNI SAEMUNDSSON,80,69,75,78,1,31 IS , OZ2049, HELGAFELL,22,10,13,19,1,66.9 JP , JBZR, FUKUSHIMA MARU,121,73,120,121,0,35.3 JP , JPBN, KEIFU MARU,467,461,462,462,5,37 JP , JFRO, KOJIMA,55,22,51,55,0,33.7 JP , H9UY, NIKKEI PHOENIX,19,13,19,19,0,32.2 JP , JDVA, OSHORO MARU,63,54,62,63,0,29.7 JP , 7JDK, RHEA LEADER,4,0,0,4,0,91 JP , JGQH, RYOFU MARU,483,478,480,482,0,28.7 JP , JPQG, SHIN SAPPORO MARU,2,0,1,2,0,54 JP , 3EDA4, TRANS FUTURE 5,73,63,70,73,0,25.2 KR , D9TD, HANSIN DAMPIER,4,0,0,0,4,411 KR , D9RV, HYUNDAI CONTINENTAL,1,0,0,0,0,291 KR , 3FIG7, KEOYANG ORIENT,1,0,0,0,1,471 KR , DSEM8, MSC HIGHNESS,2,0,0,0,1,381 KR , 3FHD9, SK SUMMIT,6,0,0,0,6,441 KR , DSPZ2, YK SOVEREIGH,3,0,0,0,0,351 MY , 9MBR8, SS PUTERI DELIMA,10,0,7,10,0,72.4 MY , 9MGF7, SS PUTERI FIRUS SATU,25,0,25,25,0,53.3 MY , 9MBQ6, SS PUTERI INTAN,3,0,0,2,0,156 MY , 9MGJ9, SS PUTERI MUTIARA SATU,14,0,12,14,0,62.5 MY , 9MBW7, SS PUTERI NILAM,4,0,1,4,0,98 , TBWAA05, ,3,1,3,3,0,39.3 , TBWAA10, ,84,75,84,84,0,15.7 NL , PCDE, ADMIRALENGRACHT,32,20,28,32,0,36.6 NL , PCKU, ALEXANDERGRACHT,35,31,33,35,0,14.8 NL , PHIN, AMAZONEBORG,3,3,3,3,0,17 NL , PCPR, AMSTELGRACHT,10,9,10,10,0,17.4 NL , PCGQ, ANJELIERSGRACHT,52,49,52,52,0,16.9 NL , PCSV, APOLLOGRACHT,26,24,25,25,1,72.9 NL , PHHD, ARNEBORG,10,5,10,10,0,27.3 NL , PFPT, AVATAQ,5,4,5,5,0,23.8 NL , 2EZE5, BERGE STAHL,23,21,21,23,0,18.3 NL , A8JH8, BUZZARD BAY,85,84,84,85,0,12.7 NL , PJRH, COLD STREAM,36,35,36,36,0,12.8 NL , A8IP4, COMOROS STREAM,5,2,4,5,0,37.2 NL , PDKK, COOL EXPRESS,6,6,6,6,0,15 NL , PHKM, CORAL FAVIA,4,3,3,3,0,73.8 NL , ELXG9, CORAL PAVONA,53,49,53,53,0,13.6 NL , PBOF, DAMGRACHT,15,13,15,15,0,13.8 NL , PDNN, DANIELLA,22,20,20,20,0,21.4 NL , PBSY, DONAUGRACHT,10,9,9,9,1,76.4 NL , DDIG2, EAGLE BAY,36,30,36,36,0,18.1 NL , PDWZ, EDAMGRACHT,73,70,72,73,0,14.2 NL , OXOR2, EDITH MAERSK,44,37,40,40,1,44.8 NL , PDXQ, EEMSGRACHT,10,10,10,10,0,14.6 NL , PDWT, EGELANTIERSGRACHT,6,6,6,6,0,10.7 NL , PDYI, ELANDSGRACHT,43,43,43,43,0,16.3 NL , OXHY2, ELLY MAERSK,68,37,62,67,0,30.3 NL , A8IO2, ELSEBETH,154,134,152,154,0,18.2 NL , A8IP2, ELVIRA,23,21,23,23,0,17.6 NL , A8IP3, EMERALD,39,34,39,39,0,17.7 NL , OYGR2, EMMA MAERSK,23,20,23,23,0,16.1 NL , PDYX, EMMAGRACHT,9,9,9,9,0,10.7 NL , A8IN8, ESMERALDA,123,97,122,123,0,20.2 NL , PDZS, EUROPA,65,42,61,65,0,24.9 NL , A8QJ7, EVA N,58,26,49,58,0,33.1 NL , OXHV2, EVELYN MAERSK,51,29,43,49,1,59.1 NL , A8JI2, FALCON BAY,1,1,1,1,0,16 NL , PEBT, FLINTERDUIN,29,15,16,18,0,96.9 NL , PBHZ, FLINTERSKY,31,25,31,31,0,16.4 NL , PBEN, FLINTERSUN,22,22,22,22,0,11.3 NL , PEND, HAPPY BUCCANEER,26,19,19,21,0,52 NL , PCER, HAPPY RANGER,29,27,29,29,0,14 NL , PCAW, HAPPY RIVER,8,8,8,8,0,10.4 NL , PCBZ, HAPPY ROVER,49,32,32,47,0,40.9 NL , PHJV, IVER EXACT,22,20,20,22,0,17.5 NL , PCBU, IVER EXCEL,22,18,22,22,0,18.4 NL , PECF, IVER EXPERIENCE,22,22,22,22,0,11.9 NL , PFBF, IVER EXPORTER,81,77,81,81,0,14.2 NL , OWFD2, JOHANNES MAERSK,48,44,47,48,0,17.8 NL , PFFH, JUMBO SPIRIT,26,21,24,25,0,25.1 NL , OWKI2, LAURA MAERSK,29,25,28,28,0,22.9 NL , OWAY2, LICA MAERSK,14,12,14,14,0,17.3 NL , PHPP, MAERSK INNOSHIMA,85,75,78,80,1,30.7 NL , PBDH, MAERSK INVERNESS,67,63,66,66,0,17.4 NL , PHOB, MAERSK IZMIR,56,52,55,55,0,17.2 NL , PDHP, MAERSK KALMAR,34,32,33,33,0,21.6 NL , PFDH, MAERSK KAMPALA,16,14,15,16,0,23.6 NL , PDHO, MAERSK KIMI,18,15,16,18,0,19.9 NL , PDHW, MAERSK PALERMO,80,77,77,79,0,15.4 NL , PDHY, MAERSK PEMBROKE,34,31,34,34,0,17.3 NL , OZDM2, MAERSK SALALAH,8,4,7,8,0,33.1 NL , VRGW2, MAERSK SALINA,51,28,47,51,0,29.5 NL , OZDQ2, MAERSK SAVANNAH,12,7,11,11,0,39.6 NL , VRGW3, MAERSK STOCKHOLM,93,31,69,92,0,40.8 NL , PHKL, NEDLLOYD BARENTSZ,300,266,285,295,0,19.2 NL , PCIM, NEDLLOYD MERCATOR,42,39,41,41,0,22.2 NL , PJHA, NOVA ZEELANDIA,8,4,7,7,0,60.8 NL , PIAG, ORANJEBORG,31,28,31,31,0,13.5 NL , PGQI, PACIFIC,100,99,100,100,0,9.4 NL , PGRQ, PELAGIA,77,75,77,77,0,12.2 NL , PBQK, PLANCIUS,22,21,21,21,1,37.5 NL , D5BR6, POLAR STREAM,26,15,21,26,0,29.8 NL , A8JI5, PRINCE OF SEAS,85,81,82,84,1,22.2 NL , PDUJ, QAMUTIK,8,7,7,8,0,24.6 NL , PDGS, ROTTERDAM,132,106,118,122,5,78.3 NL , PCIH, ROYAL KLIPPER,60,57,58,58,1,41.2 NL , PHCQ, SAIMAAGRACHT,21,20,20,20,0,29.9 NL , PHDL, SAMPOGRACHT,14,11,11,11,0,43.6 NL , A8IP5, SANTA LUCIA,12,11,12,12,0,14.4 NL , A8IN7, SANTA MARIA,72,34,37,39,24,420.3 NL , PCGM, SINGELGRACHT,25,24,25,25,0,11.4 NL , PDBP, SLOTERGRACHT,5,5,5,5,0,14.6 NL , PFBE, SLUISGRACHT,37,32,32,32,1,48.3 NL , PCEO, SPIEGELGRACHT,27,26,27,27,0,15.9 NL , PBBB, SPUIGRACHT,17,17,17,17,0,15 NL , PECA, STAD AMSTERDAM,6,4,5,5,1,126 NL , PHAQ, STATENGRACHT,71,64,70,71,0,17.9 NL , PHQW, STELLA NOVA,15,15,15,15,0,11.9 NL , PCAM, TASMAN SPIRIT,11,3,10,11,0,48.6 NL , PCCL, TASMAN STAR,27,26,26,27,0,13.6 NL , PHAC, TRACER,24,22,24,24,0,22.5 NL , PHAA, TRAMPER,8,7,8,8,0,16.9 NL , PHAL, TRANSPORTER,5,5,5,5,0,11.6 NL , PHAM, TRAVELLER,54,48,49,53,0,17.6 NL , 9LD2206, TRES HOMBRES,16,13,15,16,0,20.2 NL , PFQE, UMIA VUT,1,1,1,1,0,28 NO , LGWS, DR.FRIDTJOF NANSEN,411,409,411,411,0,11.4 NO , LF3F, DRAUGEN,240,240,240,240,0,21.2 NO , LAHV, FF HELMER HANSEN,456,452,454,455,0,12.1 NO , LMEL, G.O. SARS,665,663,665,665,0,11.4 NO , LJIT, HAAKON MOSBY,402,401,402,402,0,11.4 NO , LF3N, HEIDRUN,242,241,242,242,0,21.1 NO , LF4H, HEIMDAL,719,718,719,719,0,10 NO , LDGJ, JOHAN HJORT,377,376,377,377,0,11.4 NO , LF5T, NORNE,177,177,177,177,0,20.8 NO , LF4C, SLEIPNER,239,239,239,239,0,21.2 NO , LF4B, TROLL,705,705,705,705,0,14.7 NZ , V7KA6, ANKING,21,11,16,20,1,84.1 NZ , 3FZR7, ASTRID,3,0,1,3,0,74.3 NZ , V2QD4, BC SAN FRANCISCO,12,4,11,12,0,33.4 NZ , YJYY2, BORAL GAS,21,21,21,21,0,15.5 NZ , ZMGB, GOLDEN BAY,5,4,5,5,0,30 NZ , ZMKA, KAKARIKI,22,4,14,22,0,52.9 NZ , VRDX2, KOTA PERMATA,10,3,5,9,0,65.8 NZ , VRWW8, KWANGSI,10,10,10,10,0,15.3 NZ , VRAE3, KWANGTUNG,29,28,28,28,0,23.2 NZ , VRAE2, KWEICHOW,49,48,49,49,0,16.9 NZ , VRAE4, KWEILIN,13,13,13,13,0,16.5 NZ , 3ECI3, MAEA,32,28,31,31,0,23.5 NZ , V7EM3, NINGHAI,26,15,22,25,0,37.9 NZ , C6TE3, ORION,35,2,27,33,0,49.6 NZ , YJZC5, PACIFIC GAS,9,8,8,9,0,23.8 NZ , ZM2619, RANGATIRA,22,22,22,22,0,15.4 NZ , V2CN5, SOFRANA SURVILLE,33,14,29,33,0,36.7 NZ , A8QY2, SOFRANA TOURVILLE,39,19,33,38,0,39.8 NZ , 9VVN8, SOUTHERN PEARL,37,29,31,36,0,31.9 NZ , ZMENA, SPIRIT OF ENDURANCE AWS,297,56,295,296,1,34.9 NZ , ZMSM, STRAITSMAN,2,2,2,2,0,10 NZ , ZMFR, TANGAROA,412,57,382,412,0,37.6 NZ , ZMIQ, TOREA,27,27,27,27,0,16.6 NZ , 3EAT6, VICTOIRE,27,6,20,25,0,52.8 RU , UGYU, 50 LET POBEDY,6,6,6,6,0,9 RU , UFJC, A.TORCHINOV,29,29,29,29,0,20.4 RU , UDUR, ADMIRAL STARIKOV,73,73,73,73,0,17.1 RU , UCAC, ADMIRAL USHAKOV,60,39,49,55,3,86.6 RU , UBSF2, ALDAN,11,11,11,11,0,20.5 RU , UAST, ATRIA,30,2,26,30,0,47 RU , UANA, FRITOF NANSEN,9,9,9,9,0,10.3 RU , UCFT, GEMMA,22,21,22,22,0,12.3 RU , UBMC, GORNOZAVODSK,13,13,13,13,0,20.3 RU , UFCK, GRUMANT,18,14,17,18,0,22.8 RU , UCUQ, IVAN TORNEV,105,30,43,49,8,187.3 RU , UGOS, KAPITAN ARTYUKH,52,0,27,28,23,208.4 RU , UFEQ, KAPITAN CHUKHCHIN,7,7,7,7,0,12 RU , UIAO, KAPITAN DANILKIN,1,1,1,1,0,11 RU , UFML, KAPITAN GNEZDILOV,27,0,5,20,1,114.3 RU , UFLT, KAPITAN KREMS,18,0,18,18,0,35.7 RU , UFMK, KAPITAN SERGIEVSKY,26,0,12,23,0,69.2 RU , UBLH, KAPITAN TSIRUL,15,0,14,15,0,39 RU , UEYO, KHUDOZHNIK N. RERIKH,42,0,42,42,0,36.6 RU , UDWE, KRASNOGVARDEETS,51,0,50,51,0,36.3 RU , UCJB, KUZMA MININ,3,3,3,3,0,16.3 RU , UFLC, LUTOGA,35,35,35,35,0,20.4 RU , UCAB, MIKHAIL KUTUZOV,7,6,6,6,1,215.1 RU , UCCR, MIKHAIL LUKONIN,4,4,4,4,0,20.5 RU , UCKA, MIKHAIL STREKALOVSKY,6,3,4,4,2,273.2 RU , UGGA, NEREI,36,35,36,36,0,11.5 RU , UIAH, NIKOLAI REPNIKOV,26,17,23,25,0,28.5 RU , UIAC, NOVATOR,69,48,51,56,0,44.5 RU , UFNZ, NOVAYA ZEMLYA,1,1,1,1,0,26 RU , UICO, ODOEVSK,57,55,56,56,0,13.4 RU , UHFW, PAROMAY,9,9,9,9,0,20.3 RU , UCTS, PAVEL KUTAKHOV,42,40,41,41,1,44.5 RU , UGNQ, PERSEI-4,2,2,2,2,0,12 RU , UITJ, PETR VELIKY,40,40,40,40,0,11.9 RU , UIDO, PIONER KHOLMSKA,19,5,18,19,0,38.6 RU , UDOD, PIONER KORSAKOVA,65,59,64,65,0,22.9 RU , UGTV, PIONER ROSSII,4,1,4,4,0,30.8 RU , UCDM, PIONER SAKHALINA,9,9,9,9,0,21 RU , UCDN, PIONER YUZHNO-SAKHALINSKA,11,10,11,11,0,24.9 RU , UBLE7, POMORYE,15,15,15,15,0,11.1 RU , UAKA, PROFESSOR MOLCHANOV,50,0,32,37,3,138.1 RU , UCDL, SAKHALIN-10,11,10,10,11,0,27.7 RU , UERK, SAKHALIN-8,11,10,10,10,1,66 RU , UCEE, SAKHALIN-9,3,1,1,2,0,78 RU , UBVF4, SEVERNAYA ZEMLYA,15,12,14,14,1,117.2 RU , UAEV, TEZEJ,30,27,27,27,3,67 RU , UCSJ, TOR,38,18,30,38,0,37.4 RU , UBNY, VAIGACH,56,56,56,56,0,10.7 RU , UGSI, VASILY BURKHANOV,38,0,34,37,0,44.1 RU , UHOM, VEGA,36,36,36,36,0,11.2 RU , UAVH, VIKTOR MIRONOV,3,0,0,0,3,891 RU , UCJX, VIKTOR TKACHEV,10,10,10,10,0,10.9 RU , UCJT, YAMAL,26,26,26,26,0,12 RU , UDYG, ZAKHAR SOROKIN,30,27,27,29,1,32.1 RU , UHMI, ZEYA,16,14,16,16,0,22.7 SE , SBLI, AIDA,64,61,62,62,2,63.9 SE , SKPE, ATL COMPANION,16,7,8,10,5,456.6 SE , SKUN, ATL COMPASS,41,40,41,41,0,12.9 SE , SKOZ, ATL CONCERT,32,28,31,31,1,66 SE , SCKM, ATL CONVEYOR,11,10,10,10,1,149.7 SE , SMGW, CARMEN,82,76,81,82,0,21.1 SE , 9V8796, DON JUAN,30,13,29,30,0,32.6 SE , SLCO, FALSTAFF,39,34,36,37,2,50.4 SE , SLKQ, FAUST,23,23,23,23,0,17.7 SE , SLKU, FEDORA,36,32,32,33,2,91.9 SE , SLKR, FIDELIO,19,18,19,19,0,20.7 SE , SJCD, MIGNON,47,42,44,45,2,45.1 SE , SMLQ, ODEN,478,30,297,475,3,61 SE , SBLW, OTELLO,57,52,52,52,4,65.8 SE , SKEC, Transpaper,534,0,33,434,2,103.9 SE , SKWI, TRISTAN,21,20,21,21,0,20.1 SE , SBHI, TRITON,48,45,47,47,0,23.4 US , OVYQ2, A. P. MOLLER,48,18,25,35,2,129 US , WDF2728, ACHIEVEMENT,10,3,10,10,0,31.1 US , C6SA3, ADVENTURE OF THE SEAS,144,119,142,143,0,20.8 US , WBN3015, ADVENTURER,4,4,4,4,0,21 US , C6VM6, AL KHUWAIR,22,1,6,8,6,270.7 US , C6VF5, AL MARROUNA,45,17,32,33,11,361.2 US , WSM5364, ALASKA MARINER,20,15,19,20,0,14.2 US , WDB9918, ALASKAN EXPLORER,37,15,19,20,10,450.8 US , WDB7815, ALASKAN FRONTIER,16,2,10,12,0,94.1 US , WDD2074, ALASKAN LEGEND,61,12,36,58,0,54.3 US , WDC6644, ALASKAN NAVIGATOR,51,25,41,45,5,158 US , C6LU3, ALBEMARLE ISLAND,15,13,15,15,0,14.9 US , OUOW2, ALBERT MAERSK,30,20,28,29,1,36 US , WCZ7335, ALERT,14,10,13,14,0,22.4 US , VCPX, ALGOLAKE,16,10,14,14,1,121.5 US , CFK9698, ALGOMA GUARDIAN,35,25,34,35,0,12.9 US , VGMV, ALGOMA NAVIGATOR,12,3,4,4,8,395.1 US , VDRV, ALGOMA PROGRESS,36,23,28,33,1,40.9 US , CYGR, ALGOMA QUEBECOIS,12,1,1,1,2,320.1 US , CFN4309, ALGOMA SPIRIT,17,4,8,8,1,230.1 US , VYNG, ALGORAIL,49,26,49,49,0,23.9 US , VGJD, ALGOSOO,16,7,12,12,4,200.9 US , VDFP, ALGOWAY,6,2,6,6,0,26 US , WKDY, ALLIANCE BEAUMONT,58,24,48,53,0,50.5 US , WRAH, ALLIANCE CHARLESTON,60,11,34,56,1,64.5 US , WGAH, ALLIANCE NORFOLK,18,7,13,16,2,145.2 US , WGAE, ALLIANCE ST LOUIS,14,6,7,8,6,628.4 US , C6XS8, ALLURE OF THE SEAS,28,24,26,28,0,14.9 US , WAV4647, ALPENA,5,0,1,2,2,455 US , WDD2876, AMERICAN CENTURY,242,232,238,238,3,24.5 US , WDD2879, AMERICAN COURAGE,2,1,1,2,0,46.5 US , WDD2875, AMERICAN INTEGRITY,19,15,18,18,1,35.2 US , WQZ7791, AMERICAN MARINER,23,23,23,23,0,7 US , WCX2417, AMERICAN SPIRIT,27,13,18,25,2,111.3 US , PBAD, AMSTERDAM,241,220,236,240,1,18.8 US , VRBK6, ANTWERPEN,211,11,29,70,49,234.1 US , WDE8265, APL AGATE,19,7,7,10,5,421.1 US , 9VKQ3, APL BELGIUM,1,0,0,0,1,741 US , WDB3161, APL CHINA,58,10,14,14,44,1090.3 US , WDF6832, APL CORAL,5,1,1,3,0,122.8 US , 9VDD2, APL ENGLAND,12,10,10,12,0,16.8 US , WDE8288, APL JAPAN,25,9,15,16,8,336 US , WCX8883, APL KOREA,189,127,146,146,42,335.4 US , WDE8264, APL PEARL,55,19,38,51,1,77.9 US , WCX8884, APL PHILIPPINES,33,17,20,20,13,576.9 US , 9VDD3, APL SCOTLAND,28,3,22,28,0,57.4 US , WCX8812, APL SINGAPORE,31,20,24,24,7,338.4 US , VRFH2, APL TEXAS,10,0,10,10,0,53.4 US , WCX8882, APL THAILAND,38,15,26,26,12,469.1 US , 9VVP, APL TOURMOLINE,36,30,31,36,0,20.5 US , VRFD6, APL WASHINGTON,73,42,65,68,5,78.9 US , WBP3396, ARCTIC BEAR,8,0,1,8,0,82.1 US , C6YA7, ARCTURUS VOYAGER,41,20,32,36,5,182.4 US , OXES2, ARNOLD MAERSK,68,31,44,50,1,74.2 US , WE4805, ARTHUR M. ANDERSON,24,10,10,12,0,124.4 US , VRDC6, ATLANTIC BREEZE,9,0,0,0,2,424.4 US , SCKB, ATLANTIC CARTIER,15,10,14,14,0,36.8 US , WDC9417, ATLANTIC EXPLORER (AWS),286,222,229,233,49,502.5 US , VRDT7, ATLANTIC GRACE,411,3,8,17,330,933 US , KAQP, ATLANTIS,677,672,677,677,0,11.3 US , WCZ7337, ATTENTIVE,14,6,9,14,0,31.7 US , WYM9567, AURORA,561,489,558,559,0,6.4 US , WCZ7336, AWARE,1,0,1,1,0,60 US , C6FY5, AXEL SPIRIT,39,8,26,32,1,81 US , 9HOB8, AZAMARA JOURNEY,17,8,17,17,0,25.5 US , 9HOM8, AZAMARA QUEST,35,16,33,35,0,31.6 US , WBD4889, BADGER,83,51,64,67,1,63.3 US , V7QN4, BALTIC BEAR,23,7,19,23,0,36.6 US , A8VG9, BALTIC COVE,12,2,5,11,1,171.8 US , WTC9407, BARBARA ANDRIE,20,14,16,16,1,69.4 US , C6QK, BARRINGTON ISLAND,29,29,29,29,0,9.9 US , WTED, BELL M. SHIMADA,296,293,294,295,1,13.2 US , VRBU6, BERGE NANTONG,21,0,2,17,0,83.2 US , C6KJ5, BERNARDO QUINTANA A.,15,11,14,15,0,24.3 US , WDC7379, BLUEFIN,30,15,20,27,0,49.8 US , WBN4113, BULWARK,33,14,16,33,0,42.3 US , WDC6027, BURNS HARBOR,36,32,35,35,1,25.9 US , WDE5381, CALIFORNIA VOYAGER,5,2,4,4,1,307.2 US , WDE3568, CALUMET,20,8,19,20,0,33.8 US , VCTV, CAPT. HENRY JACKMAN,13,9,11,11,1,137 US , 3FPQ9, CARNIVAL CONQUEST,26,13,26,26,0,28.6 US , C6FN4, CARNIVAL DESTINY,16,9,15,15,0,29.1 US , 3ETA7, CARNIVAL DREAM,66,46,64,66,0,12.8 US , H3GR, CARNIVAL ECSTASY,5,3,5,5,0,17 US , 3FOC5, CARNIVAL ELATION,29,22,28,29,0,16 US , H3GS, CARNIVAL FANTASY,28,25,27,28,0,13.1 US , C6FM9, CARNIVAL FASCINATION,39,30,39,39,0,24.2 US , 3EBL5, CARNIVAL FREEDOM,1,0,1,1,0,41 US , 3FPS9, CARNIVAL GLORY,19,11,19,19,0,23.6 US , C6FN2, CARNIVAL IMAGINATION,43,37,43,43,0,19.3 US , C6FM5, CARNIVAL INSPIRATION,15,10,15,15,0,24.1 US , H3VT, CARNIVAL LEGEND,14,12,14,14,0,13.1 US , HPYE, CARNIVAL LIBERTY,95,71,94,95,0,22.3 US , 3ETA8, CARNIVAL MAGIC,73,38,70,72,0,27.8 US , H3VS, CARNIVAL MIRACLE,40,21,39,40,0,25.6 US , 3FOB5, CARNIVAL PARADISE,19,16,18,19,0,15.1 US , H3VU, CARNIVAL PRIDE,58,45,58,58,0,21.9 US , C6FM8, CARNIVAL SENSATION,37,32,37,37,0,15.7 US , 3FPR9, CARNIVAL SPIRIT,24,15,24,24,0,10.9 US , 3EUS, CARNIVAL SPLENDOR,46,34,46,46,0,17.3 US , C6FN5, CARNIVAL TRIUMPH,87,65,87,87,0,20.4 US , H3VR, CARNIVAL VALOR,15,5,10,10,5,321.6 US , 3FFL8, CARNIVAL VICTORY,4,3,4,4,0,21.2 US , OZWA2, CAROLINE MAERSK,1,0,0,0,1,1271 US , WE4879, CASON J. CALLAWAY,27,22,23,24,1,61.3 US , 9HJI9, CELEBRITY CENTURY,114,85,106,109,1,31.1 US , 9HJB9, CELEBRITY CONSTELLATION,338,143,237,293,20,87.3 US , 9HXC9, CELEBRITY ECLIPSE,346,228,313,330,2,33.9 US , 9HXD9, CELEBRITY EQUINOX,141,94,129,140,0,26.9 US , 9HJD9, CELEBRITY INFINITY,131,83,128,131,0,21.2 US , 9HJF9, CELEBRITY MILLENNIUM,88,59,83,86,0,28.8 US , 9HA2583, CELEBRITY SILHOUETTE,149,100,136,148,0,25.4 US , 9HRJ9, CELEBRITY SOLSTICE,162,94,128,145,10,66.4 US , 9HJC9, CELEBRITY SUMMIT,63,50,62,63,0,19 US , C6JT, CHARLES ISLAND,23,23,23,23,0,9.1 US , WDD6126, CHARLESTON EXPRESS,140,80,112,117,23,257 US , WTF3319, CORWITH CRAMER,10,7,8,8,1,150 US , ICGU, COSTA LUMINOSA,27,19,25,25,2,65 US , IBCF, COSTA MEDITERRANEA,57,17,49,57,0,39.1 US , WDC6907, COURAGE,3,0,0,0,3,1397 US , VRXB2, DARYA SHANTHI,54,12,36,48,1,68 US , V7HD2, DEEPWATER MILLENNIUM,7,1,3,7,0,51.3 US , WBN3016, DEFENDER,20,16,19,20,0,22.3 US , KNBD, DELAWARE II,4,2,3,4,0,38.5 US , NWS0012, DELAWARE II (AWS),110,14,110,110,0,31.5 US , WDE2632, DELIVERANCE,3,2,3,3,0,17.7 US , WUR7250, DIANE H,26,10,17,22,3,85.6 US , V7MO2, DISCOVERER CLEAR LEADER,59,44,56,57,2,58.2 US , V7HC6, DISCOVERER DEEP SEAS,133,94,133,133,0,21.1 US , V7HD3, DISCOVERER ENTERPRISE,12,9,11,12,0,10.9 US , V7MO3, DISCOVERER INSPIRATION,11,7,11,11,0,22.7 US , V7HC8, DISCOVERER SPIRIT,67,49,67,67,0,19 US , C6YR6, DISNEY DREAM,1,0,0,1,0,61 US , C6ZL6, DISNEY FANTASY,11,5,10,10,0,33 US , C6PT7, DISNEY MAGIC,3,2,3,3,0,4 US , C6QM8, DISNEY WONDER,64,50,60,62,1,39.8 US , C6JS, DUNCAN ISLAND,46,43,45,46,0,15.3 US , S6NK2, EAGLE TACOMA,1,0,0,0,1,790 US , S6NK4, EAGLE TRENTON,49,1,4,7,18,333.1 US , WQZ9670, EDGAR B. SPEER,70,50,61,68,0,21.8 US , WXQ4511, EDWIN H. GOTT,85,72,82,84,1,23.7 US , KCGH, EL MORRO,8,5,5,5,3,546.6 US , WGJT, EL YUNQUE,51,32,33,33,18,267 US , KKFW, EMPIRE STATE,119,57,84,97,1,69.3 US , C6FZ7, ENCHANTMENT OF THE SEAS,12,5,12,12,0,24.3 US , WCE5063, ENDEAVOR (AWS),718,696,701,704,6,8.8 US , WDF7523, ENDURANCE,43,23,29,43,0,32 US , WDE9193, EOT SPAR,24,18,18,18,6,359.2 US , A8PQ6, ERNEST N,37,8,28,36,0,43.7 US , PHOS, EURODAM,36,24,30,34,0,35.3 US , A8MH9, EURUS LIMA,3,0,2,2,0,71 US , A8MI2, EURUS LISBON,14,3,14,14,0,32.8 US , A8MH7, EURUS LONDON,22,10,19,22,0,34 US , 9V7951, EVER DAINTY,15,13,13,15,0,13.5 US , 9V7952, EVER DECENT,3,2,3,3,0,30.7 US , 9V7954, EVER DEVOTE,4,1,1,1,0,236 US , 9V7955, EVER DIADEM,27,17,20,23,4,152 US , 3FQS8, EVER DIAMOND,265,170,244,263,0,26.2 US , 9V7956, EVER DIVINE,28,21,27,28,0,18.7 US , VQFS4, EVER ETHIC,12,5,6,9,3,391.1 US , VSXV3, EVER EXCEL,26,8,16,16,10,569.8 US , 3FQO4, EVER REACH,5,4,5,5,0,27.2 US , 3FYB3, EVER REWARD,572,550,567,572,0,9.4 US , MJKZ4, EVER SHINE,3,1,1,2,1,504.7 US , 3EKU3, EVER SUMMIT,24,12,21,22,1,67.2 US , C6FY8, EVEREST SPIRIT,49,20,42,46,2,88.3 US , WDE4430, EVERGREEN STATE,1,0,0,0,0,141 US , ONCE, EXCALIBUR,57,19,19,19,38,942.7 US , ONAI, EXCEL,78,20,20,20,57,1055.3 US , ONDY, EXCELERATE,62,33,39,43,19,459.8 US , ONFY, EXPEDIENT,39,8,10,11,8,405.6 US , WBN7618, EXPLORER,18,17,18,18,0,17.1 US , ONFE, EXPLORER,54,31,45,50,4,133.6 US , C6SE4, EXPLORER OF THE SEAS,13,8,13,13,0,24.4 US , WDB5604, FAIRWEATHER,17,6,12,15,2,105.1 US , WTEB, FAIRWEATHER (AWS),188,168,186,186,1,24.6 US , 8POF, FEDERAL SCHELDE,9,3,3,7,0,67.2 US , VRXL7, FEDERAL VENTURE,9,0,1,5,1,186.9 US , WDF4764, FLORIDA VOYAGER,8,2,5,5,3,560.4 US , WDB5483, FREEDOM,48,11,27,38,6,140.4 US , C6UZ7, FREEDOM OF THE SEAS,18,12,18,18,0,20.2 US , A8LC2, FREJA DANIA,18,4,11,17,0,53.7 US , WCV7620, G. L. OSTRANDER,104,37,42,50,45,550.1 US , S6AJ8, GARDEN CITY RIVER,16,9,12,14,0,42.4 US , WBN6511, GAUNTLET,1,1,1,1,0,11 US , V7SY6, GENCO CLAUDIUS,46,0,27,45,0,79.5 US , VRDR8, GENCO CONSTANTINE,48,0,5,14,14,273.6 US , V7QN8, GENCO HADRIAN,12,0,0,0,2,306.1 US , V7LZ4, GENCO THUNDER,5,1,2,4,0,63.2 US , WTAU, GENERAL RUDDER,13,7,11,12,1,203.3 US , ZCDJ7, GENOA EXPRESS,18,3,3,18,0,65.1 US , A8PQ5, GEORGE N,14,3,7,10,0,95.3 US , NMRY, GOLDEN BEAR,52,36,46,48,3,92.7 US , WTEO, GORDON GUNTER (AWS),409,363,373,377,21,78.6 US , C6SE3, GRANDEUR OF THE SEAS,13,2,5,12,0,65.4 US , WDF7994, GREAT REPUBLIC,14,11,13,14,0,20.3 US , WDD9433, GREEN BAY,5,0,1,4,0,85.2 US , WCZ5238, GREEN DALE,16,5,12,15,0,45.3 US , WDDI, GREEN LAKE,5,5,5,5,0,11 US , WZZF, GREEN RIDGE,18,15,17,18,0,18.1 US , WDC9138, GRETCHEN H,13,5,8,13,0,39.3 US , YJUF7, GSF GRAND BANKS,178,93,137,149,9,69.9 US , WDA5598, GULF TITAN,3,0,1,3,0,64 US , C6CL6, H A SKLENAR,99,80,91,96,1,35.6 US , WZD2465, H. LEE WHITE,17,8,14,15,0,42.1 US , WTDF, HENRY B. BIGELOW (AWS),499,481,486,494,0,14 US , YJQN7, HENRY GOODRICH,184,91,140,154,12,72.9 US , WL3972, HERBERT C. JACKSON,15,8,9,10,1,94.6 US , WTEY, HI\'IALAKAI (AWS),159,39,159,159,0,27.4 US , WL3108, HON. JAMES L. OBERSTAR,56,13,18,22,12,204.2 US , WDC6923, HONOR,17,14,17,17,0,12.8 US , KGTX, HORIZON ANCHORAGE,139,49,85,87,52,553.7 US , WZJC, HORIZON CHALLENGER,66,36,65,66,0,22.2 US , WZJD, HORIZON DISCOVERY,43,34,41,42,1,38.2 US , KRGB, HORIZON ENTERPRISE,33,5,6,6,27,1177.7 US , KGTZ, HORIZON KODIAK,39,3,6,6,33,1221.5 US , WPGK, HORIZON NAVIGATOR,186,131,136,138,48,382 US , WSRL, HORIZON PACIFIC,46,23,38,40,6,212.4 US , WJBJ, HORIZON PRODUCER,188,134,153,158,17,99.7 US , WFLH, HORIZON RELIANCE,79,65,78,78,0,11.5 US , WFLG, HORIZON SPIRIT,66,63,64,66,0,3.3 US , KGTY, HORIZON TACOMA,36,16,22,24,0,87.8 US , 9VAW8, HOSANGER,21,13,13,15,4,386.1 US , KCDK, HOUSTON,35,28,32,34,1,44.3 US , WBN3744, HUNTER,75,67,75,75,0,11.8 US , WGAX, INDEPENDENCE II,43,15,17,20,23,781.7 US , C6WW4, INDEPENDENCE OF THE SEAS,9,6,9,9,0,21.7 US , WXN3191, INDIANA HARBOR,30,27,29,30,0,9 US , WDD7905, INTEGRITY,70,65,67,69,0,19.4 US , WDC6925, INTEGRITY,43,20,30,36,0,53.2 US , WDC6588, ISLAND SCOUT,14,0,4,14,0,70.8 US , WDF7020, JAMES L. KUBER,91,90,91,91,0,0 US , WYP8657, JAMES R. BARKER,269,139,176,200,15,89.7 US , WDC3786, JEAN ANNE,14,10,14,14,0,18.9 US , A8PQ7, JENNY N,16,11,15,15,0,31.4 US , VCYP, JOHN B. AIRD,27,10,19,19,2,205 US , WE3806, JOHN G. MUNSON,145,124,139,142,1,10.7 US , WZE4539, JOHN J. BOLAND,1,1,1,1,0,0 US , WXY6216, JOSEPH L. BLOCK,695,1,392,449,119,231.9 US , WTEU, KA'IMIMOANA (AWS),386,337,344,350,20,57 US , WBS5272, KAREN ANDRIE,318,154,190,202,84,238.8 US , WTK2245, KATRINA EM,9,5,6,9,0,28.6 US , C6WK2, KAVERI SPIRIT,24,2,10,20,0,73.8 US , WCY2920, KENNICOTT,23,14,23,23,0,19.6 US , WDA7827, KILO MOANA,14,2,2,2,12,1227.8 US , KAO107, KIYI,18,14,17,18,0,24.4 US , KCEJ, KNORR,720,682,702,717,0,14.1 US , KQXZ, KODIAK,18,14,17,18,0,11.5 US , VRWJ7, KOTA JATI,58,32,41,47,1,65 US , WCX7445, LAURENCE M. GOULD (AWS),599,597,599,599,0,11.1 US , 3FJY6, LAVENDER PASSAGE,4,2,4,4,0,26.2 US , WUR8857, LEE A. TREGURTHA,3,2,2,2,1,211.3 US , WHIA, LIBERTY EAGLE,66,34,51,58,0,39.8 US , WADP, LIBERTY GLORY,27,17,26,27,0,25.3 US , WADN, LIBERTY GRACE,22,15,19,21,0,36.1 US , KRAU, LIBERTY PRIDE,33,25,28,32,0,15.5 US , WCOB, LIBERTY SUN,25,11,17,18,7,422 US , ZCDV9, LIVORNO EXPRESS,20,14,20,20,0,26.5 US , V7BW9, LNG GEMINI,55,17,40,41,13,365.7 US , C6XQ5, LNG JUPITER,14,4,12,13,1,140.4 US , V7BX2, LNG LEO,13,2,5,6,7,791.6 US , ONFP, LOWLANDS ORCHID,47,1,2,47,0,69.6 US , V7QK3, LYLA,101,6,29,39,27,242.4 US , PFRO, MAASDAM,134,107,115,121,1,39.6 US , WBDS, MAERSK CAROLINA,21,4,11,20,1,77.1 US , WAHP, MAERSK GEORGIA,34,1,23,30,1,79.4 US , WKPM, MAERSK IDAHO,59,9,30,55,0,62.2 US , KABL, MAERSK IOWA,49,10,26,32,16,504 US , WKPY, MAERSK KENTUCKY,58,33,38,53,0,52.6 US , WAHV, MAERSK MISSOURI,13,10,13,13,0,19.3 US , WCDP, MAERSK MONTANA,9,7,8,8,1,148.3 US , KABP, MAERSK OHIO,52,14,21,27,25,713.7 US , WHKM, MAERSK PEARY,44,6,25,37,0,74.7 US , WKAB, MAERSK UTAH,68,33,50,60,2,58 US , WAHK, MAERSK VIRGINIA,23,5,18,23,0,39.7 US , 3FCC4, MAERSK WAKAYAMA,5,4,4,5,0,0 US , WKPN, MAERSK WISCONSIN,49,14,38,47,0,49.8 US , WKPF, MAERSK WYOMING,75,35,69,73,0,32 US , WHRN, MAHIMAHI,12,10,11,11,1,135.8 US , WYX2079, MAIA H,2,2,2,2,0,0 US , C6FZ8, MAJESTY OF THE SEAS,23,20,23,23,0,14.3 US , KBGK, MAJOR BERNARD F. FISHER,53,38,42,44,9,235.2 US , WDB6831, MANISTEE,26,19,25,25,1,37.8 US , WDE3569, MANITOWOC,85,83,85,85,0,10.4 US , KDBG, MANOA,17,9,15,15,2,185.6 US , WRGD, MANUKAI,14,4,4,4,10,923.5 US , WECH, MANULANI,13,3,5,5,8,781.6 US , C6TF8, MAPLE 2,39,5,19,21,11,317.6 US , OUIY2, MARCHEN MAERSK,37,34,36,36,1,53.6 US , WDC6698, MARCUS G. LANGSETH (AWS),733,707,713,714,15,31.9 US , OUJI2, MAREN MAERSK,24,15,23,24,0,25.6 US , 3FHX2, MARINE EXPRESS,12,0,4,11,0,99 US , KSDF, MARY ANN HUDSON,72,50,66,72,0,23.3 US , WN4201, MATANUSKA,2,0,1,2,0,60.5 US , WSLH, MAUI,38,14,14,14,24,914.1 US , KFMV, MAUNALEI,48,30,37,37,11,345.3 US , WGEB, MAUNAWILI,19,4,5,5,14,967.4 US , WECB, MELVILLE,596,547,558,560,28,51.8 US , WYQ4356, MESABI MINER,45,13,16,24,6,175.9 US , WAHG, MIDNIGHT SUN,8,4,7,7,1,199.6 US , ONAR, MINERAL BEIJING,11,1,2,7,1,119.6 US , VRKF5, MINERAL BELGIUM,9,1,1,3,0,136.2 US , ONFW, MINERAL DALIAN,19,0,0,0,15,618.2 US , ONAN, MINERAL NOBLE,25,1,4,19,0,96.3 US , ONBF, MINERAL TIANJIN,2,0,0,2,0,71 US , WNRD, MOKIHANA,47,26,38,38,9,296.3 US , C6FZ9, MONARCH OF THE SEAS,20,10,19,20,0,31.4 US , WCX9104, MONITOR,14,13,14,14,0,14.4 US , VDWC, MONTREALAIS,8,8,8,8,0,0 US , A8AT8, MORNING GLORY VIII,105,13,28,58,10,148 US , TCZF2, MUSTAFA DAYI,6,0,0,6,0,86.2 US , WDE7904, NACHIK,1,0,0,1,0,71 US , WTER, NANCY FOSTER (AWS),296,284,289,293,0,14.8 US , WBP3210, NATHANIEL B. PALMER (AWS),328,327,328,328,0,11.1 US , C6FU4, NAVIGATOR OF THE SEAS,1,0,0,1,0,67 US , VRBK5, NEW DELHI EXPRESS,9,4,8,9,0,35.3 US , WKWB, NEW HORIZON,96,96,96,96,0,11 US , PBWQ, NIEUW AMSTERDAM,32,17,27,28,4,183.7 US , A8UD3, NOBLE GLOBETROTTER I,18,17,18,18,0,8.1 US , KRPP, NOBLE STAR,18,6,7,8,10,809.1 US , PHET, NOORDAM,62,22,38,42,11,199.7 US , KIYI, NORTH STAR,129,89,124,125,4,65.6 US , C6FT7, NORWEGIAN DAWN,437,182,239,308,20,93.3 US , C6XP7, NORWEGIAN EPIC,27,7,11,24,0,66.6 US , C6VG8, NORWEGIAN GEM,69,26,39,55,3,83.4 US , C6WK7, NORWEGIAN JADE,232,118,196,219,3,44.6 US , C6TX6, NORWEGIAN JEWEL,58,18,30,48,0,62.1 US , C6VG7, NORWEGIAN PEARL,520,474,510,514,2,21.1 US , C6PZ8, NORWEGIAN SKY,135,122,131,135,0,15.5 US , C6TQ6, NORWEGIAN SPIRIT,37,28,34,37,0,26.9 US , C6FR3, NORWEGIAN STAR,92,72,92,92,0,15.1 US , C6RN3, NORWEGIAN SUN,7,6,7,7,0,3.3 US , HOJY, NYK LIBRA,28,24,27,28,0,18.5 US , 3FJM9, NYK ROSA,8,1,3,5,1,260.8 US , 9V7645, NYK RUMINA,29,7,14,18,1,110.6 US , 3FUL2, NYK TRITON,60,4,17,42,0,92.8 US , C6XS7, OASIS OF THE SEAS,58,28,58,58,0,28.6 US , V7DZ8, OCEAN CLIPPER,37,22,31,35,0,26.8 US , WDF9323, OCEAN FREEDOM,37,10,25,31,6,263.7 US , WBO5471, OCEAN HARVESTER,1,0,0,1,0,111 US , WCF3990, OCEAN MARINER,33,18,25,33,0,33 US , WTDH, OKEANOS EXPLORER (AWS),309,300,305,309,0,4.8 US , WDF7019, OLIVE L. MOORE,144,136,143,143,0,6.8 US , VRWE8, OOCL AMERICA,36,23,29,34,1,38 US , VRDN3, OOCL BUSAN,11,0,4,10,0,70.7 US , VRFX8, OOCL NAGOYA,53,18,50,52,0,40.8 US , PBKH, OOSTERDAM,29,13,17,25,0,62.1 US , 9VAR2, OPTIMANA,136,0,0,3,105,861.3 US , A8HY8, ORANGE SUN,6,4,4,4,2,487.3 US , WTDO, OREGON II (AWS),462,428,442,451,2,22.1 US , WDF2960, OREGON VOYAGER,2,1,1,1,1,730.5 US , VRAC9, ORIENTAL QUEEN,14,1,4,12,0,70.3 US , WTEP, OSCAR DYSON,610,593,604,609,0,3.9 US , WTEE, OSCAR ELTON SETTE (AWS),57,48,49,50,3,73.5 US , NWS0015, OSCAR ELTON SETTE (AWS),231,230,231,231,0,1.4 US , ELPP9, OURO DO BRASIL,7,3,5,5,2,432.6 US , V7HP2, OVERSEAS ALCESMAR,6,0,2,4,0,102.3 US , KCHV, OVERSEAS ANACORTES,22,11,21,21,1,91.3 US , V7HP4, OVERSEAS ANDROMAR,36,17,30,35,0,44.4 US , WJBU, OVERSEAS BOSTON,67,22,42,42,25,549.3 US , WOAG, OVERSEAS CASCADE,12,8,10,10,2,198.9 US , WWAA, OVERSEAS HOUSTON,7,4,5,5,1,255.4 US , V7NV4, OVERSEAS JOYCE,89,83,88,88,0,14.9 US , WAAT, OVERSEAS LONG BEACH,15,3,8,8,6,598.1 US , WABS, OVERSEAS LOS ANGELES,181,90,108,109,70,561.2 US , WDC7070, OVERSEAS LUXMAR,14,7,10,13,0,49.7 US , WDC6975, OVERSEAS MAREMAR,49,9,23,40,5,106.8 US , WDBH, OVERSEAS NIKISKI,5,1,4,4,1,318.8 US , WHED, OVERSEAS TEXAS CITY,6,1,4,6,0,50.8 US , WDD9283, PACIFIC FREEDOM,6,0,3,6,0,55.8 US , WDD9285, PARAGON,2,0,0,2,0,70.5 US , WBN3014, PATRIARCH,4,4,4,4,0,0 US , WQVY, PATRIOT,10,0,0,1,0,181.6 US , C6TH9, PAUL GAUGUIN,237,78,123,174,0,72.9 US , WYR4481, PAUL R. TREGURTHA,68,37,40,42,14,255.4 US , WDC6736, PHILADELPHIA EXPRESS,196,79,119,122,74,556.8 US , WE3592, PHILIP R. CLARKE,50,42,43,43,6,145.1 US , WTDL, PISCES (AWS),529,521,525,527,1,14.1 US , WAZV, POLAR ADVENTURE,13,12,13,13,0,7.8 US , WDF5296, POLAR CLOUD,32,2,15,25,2,114.4 US , WACW, POLAR DISCOVERY,76,15,68,76,0,41.2 US , WDG2085, POLAR ENDURANCE,12,4,5,12,0,54.8 US , WRTF, POLAR ENTERPRISE,33,9,33,33,0,28.8 US , WDC8652, POLAR RANGER,1,0,0,1,0,111 US , WDJK, POLAR RESOLUTION,241,134,236,239,1,30.5 US , WRYW, PRESIDENT ADAMS,48,28,36,41,7,232.9 US , WRYC, PRESIDENT JACKSON,46,21,32,35,11,363.5 US , WRYD, PRESIDENT POLK,40,17,30,35,5,210.5 US , WNDP, PRESIDENT TRUMAN,29,11,20,20,9,461.6 US , WZE4928, PRESQUE ISLE,10,0,0,0,0,251 US , WNBE, PRIDE OF AMERICA,32,24,32,32,0,13.4 US , WUW2120, PRIDE OF BALTIMORE II,3,2,3,3,0,21 US , PBGH, PRINSENDAM,7,3,4,7,0,42 US , WBM5092, PT. THOMPSON,7,7,7,7,0,15.3 US , WRJP, R. J. PFEIFFER,49,23,29,29,20,598.5 US , KGCJ, R. M. THORSTENSON,3,0,1,3,0,87.3 US , C6SE7, RADIANCE OF THE SEAS,45,30,42,43,0,33.1 US , WTEF, RAINIER,119,108,118,119,0,14.1 US , WCW7977, REBECCA LYNN,29,18,27,28,0,23 US , WDD2451, REDOUBT,5,1,2,3,2,282.6 US , WCZ5535, RESOLVE,41,14,22,26,13,448 US , C6UA2, RHAPSODY OF THE SEAS,53,41,49,53,0,24.9 US , WDA4486, ROBERT C. SEAMANS,1,0,1,1,0,41 US , WSQ2674, ROBERT GORDON SPROUL (AWS),239,233,235,235,1,15.4 US , CFN4934, ROBERT S. PIERSON,8,4,7,8,0,27.2 US , WZP8164, ROGER BLOUGH,157,115,139,146,4,51 US , KAOU, ROGER REVELLE,704,663,667,669,29,46.7 US , A8PQ3, RONALD N,2,1,2,2,0,31 US , PHFV, RYNDAM,32,25,30,32,0,21.1 US , KAWM, S/R AMERICAN PROGRESS,34,14,27,34,0,32.2 US , MRWF2, SAFMARINE MAKUTU,20,12,19,19,1,93.7 US , VRZQ9, SAGA MONAL,22,8,13,17,0,62.6 US , VRDA4, SAGA NAVIGATOR,1,0,0,1,0,91 US , VRXO6, SAGA VIKING,24,0,15,22,0,64.2 US , C6NO5, SAIPEM 7000,57,48,55,57,0,12.3 US , WZC7602, SAM LAUD,26,10,12,25,1,90.3 US , WDC8307, SAMUEL DE CHAMPLAIN,13,6,11,11,1,112.5 US , MGYB8, SANTA MONICA,56,52,54,55,1,26.2 US , HZRX, SAUDI ABHA,3,3,3,3,0,10.7 US , HZZB, SAUDI DIRIYAH,26,22,25,25,1,46.1 US , HZZD, SAUDI TABUK,34,12,13,13,21,493 US , WYT8569, SEA PRINCE,10,10,10,10,0,20 US , WCX9106, SEA VOYAGER,56,28,35,56,0,33.2 US , WKAU, SEA-LAND CHAMPION,20,0,4,15,0,99.2 US , WDB9948, SEA-LAND CHARGER,35,29,32,35,0,17.7 US , WDB9950, SEA-LAND COMET,50,45,50,50,0,12.7 US , WKAE, SEA-LAND EAGLE,44,29,36,41,3,79.5 US , WDB9949, SEA-LAND INTREPID,33,16,21,23,9,372.8 US , WDB9986, SEA-LAND LIGHTNING,45,18,28,28,17,556.1 US , WKAW, SEA-LAND MERCURY,60,20,41,42,18,450.4 US , WDB9951, SEA-LAND METEOR,50,12,37,49,0,45.5 US , WKAP, SEA-LAND RACER,61,34,51,58,3,98.7 US , WCY7054, SEABULK ARCTIC,14,4,4,5,8,595.3 US , KNJK, SEABULK TRADER,37,4,27,36,0,52.1 US , WBN3013, SENTRY,18,18,18,18,0,12.9 US , C6VV8, SEVEN SEAS MARINER,44,38,43,44,0,15.8 US , C6SW3, SEVEN SEAS VOYAGER,4,3,3,4,0,27.2 US , WDE2542, SHEILA MCDEVITT,32,20,28,31,0,24.2 US , WSNB, SIERRA,10,8,10,10,0,9.9 US , WCQ6174, SIKU,14,0,4,14,0,73.1 US , 9VAH, SIRANGER,46,12,33,35,0,84.1 US , OYOS2, SKAGEN MAERSK,26,15,21,25,0,36.5 US , ELQQ4, SOL DO BRASIL,16,12,15,15,1,109.4 US , C6TZ9, SPLENDOUR OF THE SEAS,193,127,181,193,0,27.5 US , WDD3825, ST LOUIS EXPRESS,363,62,67,72,291,1158.1 US , WZA4027, ST. CLAIR,4,3,3,4,0,13.5 US , WYL4909, STACEY FOSS,10,0,2,10,0,76.8 US , LAVV4, STAR AMERICA,13,10,11,11,2,238.4 US , LAYG5, STAR ATLANTIC,19,19,19,19,0,9.4 US , LAWO2, STAR EAGLE,33,16,19,21,12,538.8 US , LAHE2, STAR EVVIVA,12,4,6,9,3,384.2 US , LAVW4, STAR FLORIDA,37,34,36,36,1,18.6 US , LAVY4, STAR FRASER,15,10,12,13,0,34.1 US , LAVX4, STAR FUJI,18,1,4,7,7,316.3 US , LADR4, STAR GRAN,27,27,27,27,0,8.5 US , LAXP4, STAR HANSA,33,26,28,31,2,97 US , LAVD4, STAR HERDLA,2,2,2,2,0,6 US , LAVN4, STAR HIDRA,47,37,41,45,1,30.3 US , LAOX5, STAR ISFJORD,21,20,20,20,1,77.8 US , LANT5, STAR ISMENE,9,6,8,8,1,176.7 US , LAMP5, STAR ISTIND,4,4,4,4,0,9.2 US , LAJS6, STAR JAVA,31,27,27,30,0,12.2 US , LAZU5, STAR JUVENTAS,28,17,25,26,2,167.4 US , LAJK7, STAR KVARVEN,9,2,3,9,0,62 US , WCAH, STATE OF MAINE,44,29,33,34,2,92.5 US , PHSG, STATENDAM,19,19,19,19,0,14.9 US , WDC6055, STEWART J. CORT,23,4,6,7,10,692.5 US , WDC8583, STIKINE,4,1,4,4,0,33.5 US , WDG2051, STIMSON,24,8,14,19,0,66.2 US , WDE4432, SUNSHINE STATE,7,6,7,7,0,21.9 US , C6DM2, SUPERSTAR LIBRA,101,81,99,100,0,3 US , VRCQ2, SYLVIE,2,0,2,2,0,36.5 US , LAOW5, TALISMAN,10,8,10,10,0,18.8 US , C6XC2, TANGGUH HIRI,89,62,83,88,0,23.6 US , KTDQ, THOMAS G. THOMPSON,9,8,8,9,0,13.3 US , WTEA, THOMAS JEFFERSON,364,359,362,363,0,11.8 US , VGPY, TIM S. DOOL,54,27,46,51,3,107.1 US , WCX2255, TIME BANDIT,1,0,1,1,0,31 US , WDC9555, TRIUMPH,1,1,1,1,0,30 US , J8PE3, TROPIC CARIB,23,20,23,23,0,21 US , J8PR3, TROPIC DAWN,1,0,0,0,1,810 US , HO7723, TROPIC EXPRESS,20,20,20,20,0,16.8 US , J8NY, TROPIC JADE,13,1,5,5,8,893 US , J8PD, TROPIC LURE,25,7,24,24,1,87.2 US , J8NX, TROPIC NIGHT,21,14,19,19,2,158.9 US , J8NW, TROPIC OPAL,40,40,40,40,0,11.1 US , J8PB, TROPIC PALM,21,10,21,21,0,31 US , J8AZ2, TROPIC SUN,12,11,12,12,0,22.9 US , J8PE4, TROPIC UNITY,22,20,21,21,1,83.4 US , WDE8761, TUG DOROTHY ANN,77,68,69,74,2,47.6 US , WDF5483, TUG SPARTAN,214,112,133,140,52,338.9 US , WNGW, TUSTUMENA,221,169,218,219,0,13 US , V7DI7, TYCO DECISIVE,90,59,82,82,8,148.8 US , V7DI8, TYCO DURABLE,8,3,5,5,3,554.6 US , P3GY9, UBC SAIKI,19,5,15,16,0,58.2 US , 5BDK2, UBC SANTA MARTA,1,0,0,1,0,102 US , VRCV5, UNIQUE CARRIER,56,27,38,46,0,52.1 US , VRGT8, UNIQUE EXPLORER,11,2,6,7,0,76.1 US , VRWV4, UNIQUE SUNSHINE,12,4,9,12,0,38.6 US , ELYB2, UNITED SPIRIT,1,1,1,1,0,1 US , PHEO, VEENDAM,33,29,32,33,0,14.8 US , WDE2719, VIGILANT,38,26,33,38,0,19.2 US , KSPH, VIRGINIAN,63,41,43,43,20,465.2 US , C6SE8, VISION OF THE SEAS,7,2,6,7,0,40.6 US , PCHM, VOLENDAM,221,195,206,211,5,38.1 US , C6SE5, VOYAGER OF THE SEAS,1,0,1,1,0,41 US , WXU3434, WALTER J. MCCARTHY JR.,66,49,55,57,2,53.2 US , WDD3826, WASHINGTON EXPRESS,87,39,51,52,35,591.6 US , WDF8784, WENDY O.,24,3,6,21,1,99.7 US , 3EMK6, WEST SIRIUS,5,3,4,5,0,34.8 US , PINX, WESTERDAM,36,34,36,36,0,9.5 US , C6SI4, WESTWOOD COLUMBIA,31,0,3,30,0,85.1 US , C6UB2, WESTWOOD OLYMPIA,42,33,38,38,4,153.9 US , WC5932, WILFRED SYKES,696,0,515,566,37,108.3 US , WCY2270, WOLSTAD,4,0,1,4,0,75.8 US , ELWG7, WORLD SPIRIT,48,30,46,46,0,28.6 US , VRET5, YM ANTWERP,27,10,18,19,7,186.7 US , VREX8, YM BUSAN,2,2,2,2,0,20.5 US , WDD6127, YORKTOWN EXPRESS,27,12,15,17,7,395.3 US , H9TE, YUHSAN,319,42,75,144,29,204.1 US , PDAN, ZAANDAM,72,48,55,58,9,116.6 US , A8SI3, ZIM LOS ANGELES,16,15,16,16,0,13.5 US , A8SI5, ZIM NINGBO,29,26,27,29,0,12.6 US , VRGA6, ZIM SHANGHAI,5,1,5,5,0,36.6 US , PBIG, ZUIDERDAM,115,89,95,102,8,113.4 ZZ , GHJV, Lord Nelson,16,11,14,14,0,18.9 ZZ , ZQHM2, TENACIOUS,1,0,0,0,0,173 ZZ , 3EPD8, TRINITY ARROW,21,12,20,21,0,31.2 ZZ , 3FMV6, TRINITY GLORY,37,17,28,36,0,40.6 fldigi-4.1.06/data/fldigi.desktop0000644000175000017500000000031113472116043013517 00000000000000[Desktop Entry] Name=Fldigi GenericName=Amateur Radio Digital Modem Comment=Amateur Radio Sound Card Communications Exec=fldigi Icon=fldigi Terminal=false Type=Application Categories=Network;HamRadio; fldigi-4.1.06/data/flarq.desktop0000644000175000017500000000027213472116043013374 00000000000000[Desktop Entry] Name=Flarq GenericName=Fldigi ARQ Utility Comment=Amateur Radio Data Transfer with ARQ Exec=flarq Icon=flarq Terminal=false Type=Application Categories=Network;HamRadio; fldigi-4.1.06/data/fldigi-rtty.png0000644000175000017500000000054113472116043013637 00000000000000‰PNG  IHDR00Wù‡ pHYs  šœIDAThí™M 1…Í0«. ]uÕ›ÎM{» L'èà…Bã3šŽÙ´' % h³#Úsá¾ °Ò…ÒeJoãäièÕ+ m¬Ôø<î1¯·AøûHùœ¾_µ[y^DíŠÎú=ð]®ØÅý&Ü l©À˯\rü(–“§£YV`E'¢°(ý=0Xbö dóc AÐ& h– ¸NÔ äž;{¯¡ž² Nc˜ž‰Ϲ0;& Ú„ml œ+¶ po üWâ ÷j€Œ±”<·.!¥—6÷K( h³“Fݵ¾'òô+Àyô<´bßcÍ„xÄK½&ýƒÌî+´ùý%²~Ÿé„IEND®B`‚fldigi-4.1.06/data/NAVTEX_Stations.csv0000644000175000017500000002665613472116043014320 00000000000000Azores;AZR;490.0;J;CTH;Horta;38 32 N;28 38 W;II;PP Canada;CAN;490.0;D;VCK;Riviere-au-Renard, OC;50 11 N;66 07 W;IV;FF Canada;CAN;490.0;J;VOO;Sydney, NS;46 11 N;59 54 W;IV;FF Canada;CAN;490.0;S;VFF;Iqaluit, NU;63 44 N;68 33 W;IV;FF Canada;CAN;490.0;V;VAR-3;Fundy, NB;43 45 N;66 10 W;IV;FF Canary Isles;CNR;490.0;A;EAL;Las Palmas;28 09 N;15 25 W;II;SS Cape Verde;CPV;490.0;P;D4A;Sao Vicente;16 51 N;25 00 W;II;EE Ecuador;EOA;490.0;A;;Ayora;00 45 S;90 19 W;XII;SS England;ENG;490.0;T;GNI;Niton;50 35 N;01 18 W;I;FF England;ENG;490.0;I;GNI;Niton;50 35 N;01 18 W;I;EE England;ENG;490.0;U;GOC;Cullercoats;55 04 N;01 28 W;I;EE France;FRA;490.0;E;FRC;CROSS Corsen;48 24 N;05 03 W;II;FF France;FRA;490.0;S;FRL;CROSS La Garde;43 06 N;05 59 E;III;FF Germany;DEU;490.0;L;DDH47;Pinneberg;53 43 N;09 55 E;I;DD Iceland;ISL;490.0;R;TFA;Reykiavik;64 05 N;21 51 W;I;IS Italy;ICH;490.0;I;IAR;La Maddalena;41 13 N;09 25 E;III;II Italy;IQM;490.0;E;IAR;Mondolfo;43 45 N;13 05 E;III;II Italy;ICI;490.0;W;IAR;Sellia Marina;38 54 N;16 44 E;III;II Portugal;POR;490.0;G;CTV;Monsanto;38 44 N;09 11 W;II;PP Romania;ROU;490.0;L;YOI;Constanta;44 12 N;28 40 E;III;RO Scotland;SCT;490.0;C;GPK;Portpatrick;54 51 N;05 07 W;I;EE South Korea;KOR;490.0;J;;Chukpyon;37 03 N;129 26 E;XI;KO South Korea;KOR;490.0;K;;Pyonsan;35 36 N;126 29 E;XI;KO Spain;ESP;490.0;M;EAV;Valencia (Cabo de la Nao);39 27 N;00 20 W;III;SS Spain;ESP;490.0;T;EAC;Tarifa;36 01 N;05 35 W;II;SS Spain;ESP;490.0;W;EAR;Coruna;43 22 N;08 27 W;II;SS Taiwan;TWN;490.0;V;;Lintou;23 33 N;119 38 E;XI;CC Taiwan;TWN;490.0;X;XSY;Yenliaoken;23 54 N;121 36 E;XI;CC Turkey;TUR;490.0;A;TAF;Samsun;41 17 N;36 20 E;III;TT Turkey;TUR;490.0;B;TAH;Istanbul;41 04 N;28 57 E;III;TT Turkey;TUR;490.0;C;TAN;Izmir;38 22 N;26 36 E;III;TT Turkey;TUR;490.0;D;TAL;Antalya;36 53 N;30 42 E;III;TT Uruguay;URG;490.0;A;CWM27;La Paloma;34 40 S;54 09 W;VI;SS Alaska;ALS;518.0;J;NOJ;Kodiak (east of);57 46 N;152 34 W;XII;EE Alaska;ALS;518.0;X;NOJ;Kodiak (west of);57 46 N;152 34 W;XII;EE Algeria;ALG;518.0;B;7TA;Alger Radio;36 40 N;03 18 E;III;EE Argentina;ARG;518.0;A;L3K;Ushuaia;54 48 S;68 18 W;VI;SS Argentina;ARG;518.0;B;L3D;Rio Gallegos;51 37 S;69 03 W;VI;SS Argentina;ARG;518.0;C;L2W;Comodoro Rivadavia;45 51 S;67 25 W;VI;SS Argentina;ARG;518.0;D;L2l;Bahia Blanca;38 43 S;62 6 W;VI;SS Argentina;ARG;518.0;E;L2P;Mar del Plata;38 03 S;57 32 W;VI;SS Argentina;ARG;518.0;H;L2B;Buenos Aires;34 27 S;58 37 W;VI;SS Argentina;ARG;518.0;M;L3K;Ushuaia;54 48 S;68 18 W;VI;EE Argentina;ARG;518.0;N;L3D;Rio Gallegos;51 37 S;69 03 W;VI;EE Argentina;ARG;518.0;O;L2W;Comodoro Rivadavia;45 51 S;67 25 W;VI;EE Argentina;ARG;518.0;P;L2l;Bahia Blanca;38 43 S;62 6 W;VI;EE Argentina;ARG;518.0;O;L2P;Mar del Plata;38 03 S;57 32 W;VI;EE Argentina;ARG;518.0;R;L2B;Buenos Aires;34 27 S;58 37 W;VI;EE Azores;AZR;518.0;F;CTH;Horta;38 32 N;28 38 W;II;EE Bahrain;BHR;518.0;B;A9M;Amala;26 13 N;50 39 E;IX;EE Belgium;BEL;518.0;M;OST;Oostende (Thames);51 11 N;02 48 E;I;EE Belgium;BEL;518.0;T;OST;Oostende;51 11 N;02 48 E;I;EE Bermuda;BER;518.0;B;ZBM;Bermuda Harbour;32 23 N;64 41 W;IV;EE Bulgaria;BUL;518.0;J;LZW;Varna;43 04 N;27 46 E;III;EE Canada;CAN;518.0;C;VOK;Riviere-au-Renard, OC;50 11 N;66 07 W;IV;EE Canada;CAN;518.0;D;VAJ;Prince Rupert, BC;54 18 N;130 25 W;XII;EE Canada;CAN;518.0;H;XMJ;329 Prescott, ON;45 42 N;125 32 W;IV;EE Canada;CAN;518.0;H;XLK835;Tofino, BC;48 56 N;125 32 W;XII;EE Canada;CAN;518.0;O;VON;St. Johns, NL;47 37 N;52 40 W;IV;EE Canada;CAN;518.0;P;XLJ;895 Thunder Bay, ON;48 26 N;89 13 W;IV;EE Canada;CAN;518.0;O;VCO;Sydney, NS;46 11 N;59 54 W;IV;EE Canada;CAN;518.0;T;VFF;Iqaluit, NT;63 44 N;68 33 W;IV;EE Canada;CAN;518.0;U;VAR-3;Fundy, NB;45 14 N;65 59 W;IV;EE Canada;CAN;518.0;X;VOK;Labrador, NL;53 18 N;60 33 W;IV;EE Canary Isles;CNR;518.0;I;EAL;Las Palmas;28 09 N;15 25 W;II;EE Cape Verde;CPV;518.0;U;D4A;San Vicente;16 51 N;25 00 W;II;EE Chile;CHL;518.0;I;CBV;Valparaiso;32 48 S;71 29 W;XV;SS Chile;CHL;518.0;A;CBA;Antofgasta;23 40 S;70 25 W;XV;EE Chile;CHL;518.0;B;CBV;Valparaiso;32 48 S;71 29 W;XV;EE Chile;CHL;518.0;C;CBT;Talcahuano;36 42 S;73 6 W;XV;EE Chile;CHL;518.0;D;CBP;Puerto Montt;41 29 S;72 57 W;XV;EE Chile;CHL;518.0;E;CBM;Magallenes;52 56 S;70 54 W;XV;EE Chile;CHL;518.0;H;CBA;Antofgasta;23 40 S;70 25 W;XV;SS Chile;CHL;518.0;J;CBT;Talcahuano;36 42 S;73 06 W;XV;SS Chile;CHL;518.0;K;CBP;Puerto Montt;41 29 S;72 57 W;XV;EE Chile;CHL;518.0;L;CBM;Magallenes;52 56 S;70 54 W;XV;SS China;CHN;518.0;L;VRX;Hong Kong;22 13 N;114 15 E;XI;EE China;CHN;518.0;M;XSI;Sanya;18 14 N;109 30 E;XI;EE/CC China;CHN;518.0;N;XSO;Guangzhou;23 09 N;113 29 E;XI;EE/CC China;CHN;518.0;O;XSL;Foochow;26 02 N;119 18 E;XI;EE China;CHN;518.0;O;XSG;Shanghai;31 07 N;121 33 E;XI;EE China;CHN;518.0;R;XSZ;Dalian;38 52 N;121 31 E;XI;EE Croatia;HRV;518.0;O;9AS;Split;43 30 N;16 29 E;III;EE Cyprus;CYP;518.0;M;5BA;Cyprus;35 02 N;33 17 E;III;EE Easter Island;PAO;518.0;G;CBY;Isla de Pascua;27 09 S;109 23 W;XV;SS Easter Island;PAO;518.0;H;CBY;Isla de Easter;27 09 S;109 23 W;XV;EE Egypt;EGY;518.0;N;SUH;Alexandria;31 12 N;29 52 E;III;EE Egypt;EGY;518.0;V;SUK;Kosseir;26 06 N;34 17 E;IX;EE Egypt;EGY;518.0;X;SUZ;Serapeum (Ismailia);30 35 N;32 17 E;IX;EE England;ENG;518.0;E;GNI;Niton;50 35 N;01 18 W;I;EE England;ENG;518.0;G;GOC;Cullercoats;55 04 N;01 28 W;I;EE England;ENG;518.0;K;GNI;Niton (Northern France);50 35 N;01 18 W;I;EE Equador;EOA;518.0;L;;Aycra;00 45 S;90 19 W;XII;EE Equador;EOA;518.0;M;HOG;Guayaquil;02 17 S;72 01 W;XII;EE Estonia;EST;518.0;U;ESA;Tallinn;59 30 N;24 30 E;I;EE Faroes;FRO;518.0;D;OXJ;Torshavn;62 00 N;06 47 W;I;EE France;FRA;518.0;A;FRC;CROSS Corsen;48 24 N;05 03 W;II;EE France;FRA;518.0;W;FRL;CROSS La Garde;43 06 N;05 59 E;III;EE Germany;DEU;518.0;L;DEU;Germany;53 43 N;09 55 E;I;EE Greece;GRC;518.0;H;SVH;Irakleio (Crete);35 20 N;25 07 E;III;EE/GK Greece;GRC;518.0;K;SVK;Kerkyra;39 45 N;19 52 E;III;EE/GK Greece;GRC;518.0;L;SVL;Limnos;39 52 N;25 04 E;III;EE/GK Greenland;GRL;518.0;W;OXI;Nuuk (Kook Island);64 04 N;52 02 W;IV;EE Guam;GUM;518.0;V;NRV;Guam;13 29 N;144 50 E;XI;EE Hawaii;HWA;518.0;O;NMO;Honolulu;21 22 N;158 09 W;XII;EE Iceland;ISL;518.0;R;TFA;Reykiavik;64 05 N;21 51 W;I;EE Iceland;ISL;518.0;X;TFA;Reykiavik;64 05 N;21 51 W;I;EE India;IND;518.0;G;WNB;Bombay;19 05 N;72 50 E;VIII;EE India;IND;518.0;P;VWM;Madras;13 05 N;80 17 E;VIII;EE Indonesia;INS;518.0;A;PNK;Jayapura;02 31 S;140 43 E;XI;EE Indonesia;INS;518.0;B;PKE;Ambon;03 42 S;128 12 E;XI;EE Indonesia;INS;518.0;D;PKF;Makassar;05 06 S;119 26 W;XI;EE Indonesia;INS;518.0;E;PKX;Jakarta;06 07 S;106 52 E;XI;EE Iran;IRN;518.0;A;EQM;Bushehr;28 58 N;50 50 E;IX;EE Iran;IRN;518.0;H;EOI;Bandar Abbas;27 08 N;57 04 E;IX;EE Ireland;IRL;518.0;O;EJM;Malin Head Coastguard;55 22 N;07 21 W;I;EE Ireland;IRL;518.0;W;EJK;Valentia Coastguard;51 27 N;09 49 W;I;EE Israel;ISR;518.0;P;4XO;Haifa;32 49 N;35 00 E;III;EE Italy;ICH;518.0;R;IAR;La Maddalena;41 13 N;09 25 E;III;EE Italy;IQM;518.0;U;IAR;Mondolfo;43 45 N;13 05 E;III;EE Italy;ICI;518.0;V;IAR;Sellia Marina;38 54 N;16 44 E;III;EE Japan;JPN;518.0;G;JNB;Naha;26 09 N;127 46 E;XI;EE Japan;JPN;518.0;H;JNR;Moji;33 52 N;130 36 E;XI;EE Japan;JPN;518.0;I;JGC;Yokohama;35 22 N;118 43 E;XI;EE Japan;JPN;518.0;J;JNL;Otaru;43 12 N;141 00 E;XI;EE Japan;JPN;518.0;K;JNX;Kushiro;42 59 N;144 23 E;XI;EE Malaysia;MLA;518.0;S;9WH 21;Sandakan;05 54 N;118 00 E;XI;EE Malaysia;MLA;518.0;T;9WW;Miri;04 28 N;114 01 E;XI;EE Malaysia;MLA;518.0;U;9MG;Penang;05 25 N;100 24 E;XI;EE Malta;MLT;518.0;O;9HD;Malta;35 49 N;14 32 E;III;EE Mauritius;MAU;518.0;C;MAU;Mauritius;20 10 S;57 28 E;II;EE Morocco;MRC;518.0;M;CNP;Casablanca;33 36 N;07 38 W;II;EE Namibia;NMB;518.0;B;V5W;Walvis Bay;23 03 S;14 37 E;VII;EE Netherland;ATN;518.0;H;JPC;Curacao;12 10 N;68 52 W;IV;EE Netherlands;HOL;518.0;P;PBK;Netherlands Coast Guard;52 06 N;04 15 E;I;EE Norway;NOR;518.0;B;LGP;Bode;67 16 N;14 23 E;I;EE Norway;NOR;518.0;L;LGO;Rogaland;58 39 N;05 36 E;I;EE Norway;NOR;518.0;N;LGD;Orlandet;63 40 N;09 33 E;I;EE Norway;NOR;518.0;V;LGV;Varde;70 22 N;31 06 E;;EE Oman;OMA;518.0;M;A4M;Muscat;23 37 N;58 31 E;IX;EE Pakistan;PAK;518.0;P;ASK;Karachi;24 51 N;67 03 E;IX;EE Peru;PRU;518.0;S;OBY2;Paita;05 05 S;81 07 W;XV;EE/SS Peru;PRU;518.0;U;OBC3;Callao;12 3 S;77 09 W;XV;EE/SS Peru;PRU;518.0;W;OBF4;Matarani;17 01 S;72 01 W;XV;EE/SS Philipines;PHL;518.0;I;;Puerto Princesa;09 44 N;121 03 E;XI;EE Philipines;PHL;518.0;J;DZS;Manila;14 35 N;121 03 E;XI;EE Philipines;PHL;518.0;K;;Davao;07 04 N;125 36 E;XI;EE Portugal;POR;518.0;R;CTV-;Monsanto;38 44 N;09 11 W;II;EE Puerto Rico;PTR;518.0;R;NMR;Isabella - San Juan, PR;18 28 N;67 04 W;IV;EE Russia;RSE;518.0;A;UIK;Vladivostok;43 23 N;131 54 E;XI;II;EE Russia;RSE;518.0;C;UBA2;Petropavlovsk;53 15 N;158 25 E;XI;II;EE Russia;RSE;518.0;D;UIB;Magadan;59 41 N;150 09 E;XI;II;EE Russia;RSE;518.0;G;;Okhotsk;59 22 N;143 12 E;XI;II;EE Russia;RUS;518.0;A;UDN;Novorossiysk;44 43 N;37 47 E;III;EE Russia;RSE;518.0;B;UFO;Kholmsk;47 02 N;142 03 E;XIII;EE Russia;RUS;518.0;C;UHS;Murmansk;68 46 N;32 58 E;;EE Russia;RUS;518.0;H;UGE;Arkhangelsk;64 33 N;40 32 E;;EE Russia (Caspian);RUS;518.0;W;UJB;Astrakhan;46 18 N;47 58 E;III;EE Sardinia;SAR;518.0;T;IDC;Cagliari;39 14 N;09 14 E;III;EE Saudi Arabia;ARS;518.0;H;HZH;Jeddah;21 23 N;39 11 E;IX;EE Scotland;SCT;518.0;O;GPK;Portpatrick;54 51 N;05 07 W;I;EE Sicily;SCY;518.0;V;IQA;Augusta;37 14 N;15 14 E;III;EE Singapore;SNG;518.0;C;9VG;Singapore;01 20 N;103 42 E;XI;EE South Africa;AFS;518.0;C;ZSC;Cape Town;33 41 S;18 43 E;VII;EE South Africa;AFS;518.0;I;ZSO;Port Elizabeth;33 57 S;25 31 E;VII;EE South Africa;AFS;518.0;O;ZSD;Durban;29 48 S;30 49 E;VII;EE South Korea;KOR;518.0;V;;Chukpyon;37 03 N;129 26 E;XI;EE South Korea;KOR;518.0;W;;Pyonsan;35 36 N;126 29 E;XI;EE Spain;ESP;518.0;D;EAR;Coruna;43 21 N;08 27 W;II;EE Spain;ESP;518.0;G;EAC;Tarifa;36 01 N;05 35 W;II;EE Spain;ESP;518.0;X;EAV;Valencia (Cabo de la Nao);38 43 N;00 09 W;III;EE Svalbard;SVB;518.0;A;LGS;Svalbard;78 04 N;13 36 E;;EE Sweden;SWE;518.0;H;SAH;Bjuroklubb;64 28 N;21 36 E;I;EE Sweden;SWE;518.0;I;SAG;Grimeton;57 06 N;12 23 E;I;EE Sweden;SWE;518.0;J;SAA;Gisovshammar;55 29 N;14 19 E;I;EE Taiwan;TWN;518.0;P;;Lintou;23 33 N;119 38 E;XI;EE Taiwan;TWN;518.0;P;;Yenliaoken;23 54 N;121 36 E;XI;EE Thailand;THA;518.0;H;HAS;Bangkok (Nonthaburi);13 01 N;100 01 E;XI;EE Turkey;TUR;518.0;D;TAH;Istanbul;41 04 N;28 57 E;III;EE Turkey;TUR;518.0;H;TAF;Samsun;41 17 N;36 20 E;III;EE Turkey;TUR;518.0;H;TAL;Antalya;36 35 N;30 42 E;III;EE Turkey;TUR;518.0;I;TAN;Izmir;38 21 N;26 35 E;III;EE Ukraine;UKR;518.0;B;UTW;Kerch;44 23 N;36 28 E;III;EE Ukraine;UKR;518.0;C;UTT;Odessa;46 29 N;30 44 E;III;EE United States;USA;518.0;A;NMA;Miami, FL;25 30 N;80 23 W;IV;EE United States;USA;518.0;C;NMC;San Francisco (Point;37 55 N;122 42 W;XII;EE United States;USA;518.0;H;NMB;Savannah, GA;32 08 N;81 42 W;IV;EE United States;USA;518.0;H;NMF;Boston, MA;41 43 N;70 31 W;IV;EE United States;USA;518.0;G;NMG;New Orleans, LA;29 53 N;89 55 W;IV;EE United States;USA;518.0;N;NMN;Portsmouth, VA;36 44 N;76 01 W;IV;EE United States;USA;518.0;O;NMO;Long Beach, CA (Cambria);35 31 N;121 03 W;XII;EE United States;USA;518.0;W;NMW;Astoria, OR;46 10 N;123 49 W;XII;EE Uruguay;URG;518.0;H;CWM27;La Paloma;34 40 S;54 09 W;VI;EE Vietnam;VTN;518.0;K;XVT;Danang;16 05 N;108 13 E;XI;EE Vietnam;VTN;518.0;W;XVG;Haiphong;20 44 N;106 44 E;XI;EE Vietnam;VTN;518.0;X;XVS;Ho Chi Minh-Ville;10 47 N;106 40 E;XI;EE Egypt;EGY;4209.5;X;SUZ;Serapeum (Ismalia);30 28 N;32 15 E;IX;EE Taiwan;TWN;4209.5;P;;Ohi-lung (Keelung);25 08 N;121 45 E;XI;EE Taiwan;TWN;4209.5;P;;Linyuan;22 29 N;120 25 E;XI;EE Taiwan;TWN;4209.5;V;XSX;Chi-lung (Keelung);25 08 N;121 45 E;XI;CC Taiwan;TWN;4209.5;X;;Linyuan;22 29 N;120 25 E;XI;CC Turkey;TUR;4209.5;M;TAH;Istanbul;41 04 N;28 57 E;III;TT Vietnam;VTN;4209.5;W;;Haiphong;20 44 N;106 44 E;XI; fldigi-4.1.06/data/win32/0000775000175000017500000000000013515625027011724 500000000000000fldigi-4.1.06/data/win32/flarq.ico0000644000175000017500000132262613472116043013452 00000000000000 ( f€€ (Ž @@ (B¶(00 ¨%Þj  ¨† h.¡( q‘Ìq‘Ì0q‘ÌYq‘ÌŒq‘̾q‘Ìäq‘Ìýq‘Ìÿq‘Ìúq‘ÌÑq‘Ì”q‘ÌKq‘Ì q‘Ìq‘Ì q‘Ìeq‘̪q‘ÌÕq‘Ìôq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìçq‘Ì’q‘Ìq‘Ìq‘Ì4q‘Ì‹q‘ÌÙq‘Ìùq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìþq‘Ì­q‘Ìq‘Ìq‘Ì%q‘ÌŠq‘ÌÞq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìûq‘Ì”q‘Ì q‘Ìq‘Ìq‘Ìq‘ÌOq‘ÌÎq‘Ìþq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìõq‘Ìcq‘Ìq‘Ìq‘Ìq‘Ìq‘Ìq‘Ìq‘Ì q‘Ìq‘Ìq‘Ìq‘Ìq‘Ì!q‘ÌLq‘Ìxq‘Ìœq‘Ìœq‘Ìq‘ÌRq‘Ì#q‘Ìq‘ÌIq‘Ìßq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘ÌÒq‘Ì7q‘Ì;q‘̉q‘̹q‘ÌËq‘ÌÓq‘ÌÓq‘ÌÓq‘ÌÔq‘ÌÎq‘ÌÁq‘ÌŸq‘Ìcq‘Ì q‘Ì q‘ÌAq‘Ì‘q‘ÌÑq‘Ìùq‘Ìýq‘Ìÿq‘Ìÿq‘Ìþq‘Ìùq‘ÌÕq‘ÌŽq‘Ì5q‘Ìq‘Ìq‘Ì·q‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìüq‘ÌÓq‘Ìçq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìûq‘ÌÎq‘Ìnq‘Ìq‘Ìq‘Ì9q‘Ì¥q‘Ìèq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘ÌÝq‘Ì€q‘Ìq‘Ì.q‘Ìàq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ì÷q‘Ì©q‘Ì*q‘Ìq‘Ì…q‘Ìãq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìûq‘Ì·q‘Ìlq‘Ìãq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿr’Íÿs’Íÿs’Íÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘ÌÁq‘Ì.q‘Ìq‘ÌCq‘Ì¿q‘Ìüq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìíq‘Ìöq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿr’Ìÿs“Íÿt“Íÿu”Íÿv•Îÿw•Îÿs“Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìþq‘ÌÁq‘Ì&q‘Ìq‘Ìaq‘ÌÞq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿr’Ìÿr’Íÿs“Íÿt”Íÿu”Îÿv•Îÿw–Îÿx—Ïÿy—Ïÿz˜Ïÿx—Îÿr’Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìþq‘Ì¡q‘Ìq‘Ì q‘Ìvq‘Ìïq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr‘Ìÿr’Ìÿr’Ìÿt”Íÿt”Íÿu•Îÿv•Îÿw–Îÿx—Îÿy˜Ïÿz˜Ïÿ{™Ïÿ|šÐÿ}›Ðÿ~›Ðÿu”Íÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìøq‘Ìtq‘Ìq‘Ìq‘Ìbq‘Ìïq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿr’Íÿs’Íÿt“Íÿu”Îÿv•Îÿw–Îÿw–Îÿy—Ïÿy˜Ïÿz™Ðÿ{™Ðÿ|šÐÿ}›Ñÿ~œÑÿÑÿ€ÒÿžÒÿ}›Ðÿr’Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìàq‘Ì8q‘Ì+q‘ÌÜq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿs’Ìÿt“Íÿu”Íÿv•Íÿw–Îÿx–Îÿy—Îÿy˜Ïÿ{™Ïÿ{™Ïÿ}šÐÿ}›Ðÿ~›ÐÿœÑÿ€ÑÿžÑÿ‚žÒÿƒŸÒÿ„ Òÿ…¡ÓÿƒŸÒÿu•Íÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìr’Ì q‘Ì q‘Ìq‘Ìq‘Ìq‘Ìq‘Ìsq‘Ìüq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿs“Ìÿu”Íÿv”Îÿw–Îÿx–Îÿy—Ïÿz˜Ïÿ{˜Ïÿ|™Ðÿ|šÐÿ~›Ñÿ~›ÑÿœÑÿ€ÑÿžÒÿ‚žÒÿƒŸÓÿ„ Óÿ…¡Óÿ†¡Óÿ‡¢Ôÿˆ£Ôÿˆ¤Ôÿ{™Ïÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿr’Ìés“ÎSs”Î$t“Í>t“ÍDt”Í?u”Í#u”Ît•Î „q‘Ìq‘Ì?q‘Ìpq‘Ìžq‘ÌÀq‘ÌËq‘̶q‘ÌŒq‘ÌPq‘Ìq‘Ì}q‘Ìýq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿt“Ìÿw–Îÿy—Îÿz˜Ïÿ{™Ïÿ|šÏÿ}šÐÿ~›Ðÿ€Ñÿ€ÑÿžÑÿžÑÿ‚ŸÒÿƒŸÒÿ„ Óÿ…¡Óÿ†¢Óÿ‡¢Ôÿˆ£Ôÿ‰¤ÔÿŠ¥Õÿ‹¦ÕÿŒ§ÕÿŸÒÿr‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿr’Ìÿr’Íÿr’ÍÿoŒÅës’Ëìt“Íót“Íôt”Íóu”Íîv•ÎÑv•Σv•Î`w–Î’ùq‘Ìq‘Ì,q‘Ìwq‘̼q‘Ìåq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìïq‘̲q‘ÌFq‘Ìq‘ÌYq‘Ìöq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿt”Íÿu”Íÿx—Îÿ|šÐÿ}›Ðÿ~›ÑÿœÑÿ‚ŸÒÿ†¢Óÿˆ£Ôÿ‡£Ôÿ†¢Ôÿ†¢Ôÿ†¢Óÿ†¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¥ÕÿŠ¥Õÿ‹¦ÕÿŒ§Öÿ§Öÿލ×ÿ©×ÿˆ¤Ôÿt“Íÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿr’Ìÿr’Íÿs“Íÿs“Íÿt“ÍÿrÉÿi„¹ÿs’Êÿu”Îÿu•Îÿv•Îÿv•Îÿw–Îÿw–Îÿw–Îöw–ÎÈx—Ïby–Ï Žøÿq‘Ìq‘Ì=ÿ##"ÿ%$$ÿ$$#ÿ$##ÿ##"ÿ"""ÿ""!ÿ!!!ÿ!! ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿZZÿÆÄÃÿÈÇÆÿÈÇÆÿÉÈÇÿÉÈÇÿÊÈÇÿÅÆÊÿž²Õÿ‘¬Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”­Ùÿ”­Ùÿ”®Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜°Úÿ˜±Úÿ˜±Úÿ™±Ûÿ™±Ûÿ™±Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿœ´ÜÿµÜÿµÜÿžµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¹Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÆÖëÿ¬Ááÿª×ÿŒ§Öÿ¨Öÿލ×ÿލ×ÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ”¬Öÿ­°·ÿ³°¯ÿ²°¯ÿ²°¯ÿ±¯¯ÿ±¯®ÿ±®®ÿ°®­ÿ°®­ÿ¯­¬ÿ¯­¬ÿ¯­¬ÿ±®®ÿŽŒ‹ÿ/.-ÿ&&%ÿ&&%ÿ&%%ÿ%%$ÿ%$$ÿ$$#ÿ###ÿ#""ÿ"""ÿ"!!ÿ!!!ÿ! ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿlÿ»®®ÿÊÉÈÿÊÈÇÿÊÈÈÿÊÉÈÿËÉÉÿËÊÉÿ³¾Ïÿ”­Øÿ”­Ùÿ”®Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜°Úÿ˜±Úÿ˜±Úÿ™±Ûÿ™±Ûÿ™²Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿ´ÜÿµÜÿµÜÿžµÝÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈØìÿÆÖëÿ­Áâÿ‘«Øÿ¨×ÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ’¬Øÿ“­Ùÿ“­Ùÿ”®Ùÿ™®Óÿ°±¶ÿ´²±ÿ´±±ÿ³±°ÿ³±°ÿ²°¯ÿ²°¯ÿ²°¯ÿ±¯¯ÿ±¯®ÿ±®®ÿ°®­ÿ°®­ÿxvuÿ*)(ÿ))(ÿ(('ÿ(''ÿ''&ÿ'&&ÿ&&%ÿ&%%ÿ%%$ÿ%$$ÿ$$#ÿ$##ÿ##"ÿ"""ÿ"!!ÿ!! ÿ!! ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ]ÿ˜ooÿËÊÉÿÊÉÈÿËÉÈÿËÉÉÿÌÊÉÿÍÊÉÿÆÇÌÿ¡´Õÿ”®Ùÿ•®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜°Úÿ˜°Úÿ˜±Úÿ™±Ûÿ™±Ûÿ™²Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿ´ÜÿµÜÿµÜÿžµÝÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ§½àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈØìÿÉØìÿÅÕëÿ©¾áÿ‘«Øÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ•®ÙÿŸ°Îÿ³³µÿµ³²ÿ´²²ÿ´²±ÿ´±±ÿ³±°ÿ³±°ÿ²°¯ÿ²°¯ÿ²°¯ÿ±¯¯ÿ±¯®ÿ¯¬¬ÿ][[ÿ*))ÿ***ÿ*))ÿ)))ÿ)((ÿ(('ÿ(''ÿ''&ÿ&&%ÿ&&%ÿ&%%ÿ%%$ÿ$$#ÿ$##ÿ###ÿ#""ÿ"""ÿ"!!ÿ!!!ÿ! ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿv11ÿÀµµÿÌËËÿÌÊÊÿÌËÊÿÌËÊÿÍÌËÿÍÌËÿ¶¿Ñÿ—¯Ùÿ–¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜°Úÿ˜°Úÿ˜±Úÿ˜±Úÿ™±Ûÿ™±Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿ´Üÿ´ÜÿµÜÿžµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒêÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÆÖëÿ©¾àÿ‘«Øÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ’¬Øÿ“­Ùÿ“­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ—°Ûÿ¥²Êÿ¶´´ÿ¶´³ÿ¶´³ÿµ³²ÿµ³²ÿµ³²ÿ´²²ÿ´²±ÿ´±±ÿ³±°ÿ³±°ÿ²°¯ÿ©§§ÿHGGÿ,++ÿ,,,ÿ,++ÿ+++ÿ+**ÿ**)ÿ*))ÿ))(ÿ(('ÿ(('ÿ(''ÿ''&ÿ&&%ÿ&%%ÿ%%$ÿ%$$ÿ$$$ÿ$##ÿ###ÿ#""ÿ"""ÿ"!!ÿ!!!ÿ ÿ ÿ ÿÿÿÿÿÿÿÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ`ÿ¦……ÿÍÌÌÿÌËÊÿÍËËÿÍÌËÿÎÌÌÿÎÌÌÿÉÊÎÿ¢¶×ÿ–¯Úÿ—°Úÿ˜°Úÿ˜°Úÿ˜±Úÿ˜±Úÿ™±Ûÿ™±Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿ´Üÿ´ÜÿµÜÿžµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿª¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÃÔëÿ¥»ßÿ’¬Øÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—¯Úÿ—°Úÿ˜±Úÿ™±Ûÿ«´Åÿ¸µ´ÿ·µ´ÿ¶´´ÿ¶´³ÿ¶´³ÿµ³²ÿµ³²ÿµ³²ÿ´²²ÿ´²±ÿ´±±ÿ´²±ÿ—•”ÿ=<<ÿ..-ÿ..-ÿ.--ÿ--,ÿ-,,ÿ,++ÿ++*ÿ+**ÿ**)ÿ*))ÿ))(ÿ)((ÿ(('ÿ''&ÿ''&ÿ&&%ÿ&&%ÿ%%$ÿ%%$ÿ$$#ÿ$##ÿ##"ÿ#""ÿ""!ÿ"!!ÿ!! ÿ! ÿ ÿÿÿÿÿÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿBAÿÉÄÃÿÎÌÌÿÎÌÌÿÎÍÌÿÏÍÍÿÏÎÍÿÐÎÍÿ¹ÂÓÿ™±Úÿ˜±Úÿ™±Ûÿ™±Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿ´Üÿ´ÜÿžµÜÿžµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¾áÿª¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ­Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Äãÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿÂÒêÿ¤ºßÿ’«Øÿ’¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ³Ùÿ¯¶Âÿ¹·µÿ¸¶µÿ¸¶µÿ¸¶µÿ·µµÿ·µ´ÿ¶´´ÿ¶´³ÿ¶´³ÿµ³²ÿµ³²ÿ·µ´ÿ‚€ÿ665ÿ100ÿ00/ÿ0//ÿ//.ÿ/..ÿ..-ÿ.--ÿ--,ÿ-,,ÿ,,+ÿ+++ÿ++*ÿ**)ÿ))(ÿ))(ÿ(('ÿ(('ÿ''&ÿ''&ÿ&&%ÿ&&%ÿ%%$ÿ%%$ÿ$$#ÿ$$#ÿ##"ÿ#""ÿ""!ÿ!!!ÿ!!!ÿ ÿ ÿÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿeÿ²››ÿÐÏÎÿÎÍÌÿÏÎÍÿÏÎÍÿÐÎÎÿÑÏÎÿËÌÐÿ¥¸Øÿ˜±Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿ´Üÿ´ÜÿžµÜÿžµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¾áÿª¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ­Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔëÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉØìÿÉØìÿÊÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿÌÛíÿ¿Ðèÿ ·Ýÿ“¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Üÿ ´×ÿ´·¾ÿº··ÿ¹·¶ÿ¹·¶ÿ¸¶µÿ¸¶µÿ¸¶µÿ·µµÿ·µ´ÿ¶´´ÿ¶´³ÿ¶´³ÿµ³²ÿlkjÿ100ÿ221ÿ211ÿ110ÿ100ÿ00/ÿ0//ÿ//.ÿ/..ÿ.--ÿ.--ÿ-,,ÿ-,,ÿ,++ÿ++*ÿ***ÿ*))ÿ)))ÿ)((ÿ(('ÿ(''ÿ''&ÿ'&&ÿ&&%ÿ&%%ÿ%%$ÿ%$$ÿ$$#ÿ$##ÿ##"ÿ"""ÿ"!!ÿ!!!ÿ! ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ‹VUÿÌÉÈÿÐÏÎÿÐÏÎÿÑÏÏÿÑÐÏÿÑÐÏÿÒÑÐÿºÄÕÿœ³Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈ×ìÿÉØìÿÉØìÿÉØìÿÊÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿËÚíÿ»ÍçÿžµÜÿ”­Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´Üÿ´ÜÿµÝÿ¤¶Öÿ¸¹¼ÿ»¹¸ÿ»¹¸ÿº¸¸ÿº¸·ÿ¹··ÿ¹·¶ÿ¹·¶ÿ¸¶µÿ¸¶µÿ¸¶µÿ¸¶µÿ¬ª©ÿZYXÿ433ÿ544ÿ443ÿ433ÿ332ÿ322ÿ221ÿ110ÿ110ÿ00/ÿ0//ÿ/..ÿ/..ÿ.--ÿ--,ÿ-,,ÿ,,+ÿ,++ÿ++*ÿ+**ÿ**)ÿ*))ÿ)((ÿ)((ÿ(('ÿ''&ÿ'&&ÿ&&%ÿ&%%ÿ%%$ÿ%$$ÿ$$#ÿ$##ÿ##"ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿkÿ¼««ÿÒÒÑÿÑÐÏÿÑÐÐÿÒÐÐÿÒÑÐÿÒÑÑÿÎÏÒÿ§ºÚÿ›³Üÿœ´Üÿ´Üÿ´ÜÿµÜÿµÜÿžµÜÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡·Ýÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºÞÿ¤ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦»ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ©¾àÿ©¾áÿ©¿áÿª¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Àáÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ´Çäÿ´Çäÿ´Çåÿ´ÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éåÿ·Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¹Ëæÿ¹Ëæÿ¹Ìçÿ¹ÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ»Íçÿ¼Îçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÑéÿÁÒéÿÁÒéÿÂÒêÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔêÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖëÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿËÚíÿËÚíÿÌÛíÿÌÛíÿÍÜîÿËÚíÿ·Éåÿš²Ûÿ•®Ùÿ•®Ùÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿ™²Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿµÜÿžµÝÿž¶Þÿ¨¸Óÿ¼ººÿ¼ººÿ¼º¹ÿ»¹¹ÿ»¹¸ÿº¸¸ÿº¸·ÿº¸·ÿ¹·¶ÿ¹·¶ÿ¹·¶ÿº¸·ÿ£¡ ÿFEEÿ766ÿ766ÿ665ÿ655ÿ544ÿ443ÿ433ÿ322ÿ322ÿ211ÿ211ÿ100ÿ100ÿ//.ÿ/..ÿ/.-ÿ..-ÿ.-,ÿ-,,ÿ,,+ÿ,++ÿ++*ÿ***ÿ**)ÿ))(ÿ))(ÿ(('ÿ''&ÿ''&ÿ&&%ÿ&&%ÿ%%$ÿ%%$ÿ$$#ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿšnnÿÒÑÐÿÒÑÐÿÒÑÑÿÒÑÑÿÓÒÑÿÓÒÒÿÔÓÒÿ½ÆÖÿžµÜÿµÜÿžµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÍÛîÿÍÜîÿÍÜîÿÊÙíÿ±Åãÿ™±Ûÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Þÿ­ºÏÿ½¼»ÿ½¼»ÿ½»ºÿ¼»ºÿ¼ººÿ¼º¹ÿ»¹¹ÿ»¹¹ÿ»¹¸ÿº¸¸ÿº¸·ÿº¸¸ÿ‘ÿ<<;ÿ:99ÿ988ÿ887ÿ877ÿ766ÿ665ÿ655ÿ554ÿ544ÿ433ÿ433ÿ322ÿ322ÿ211ÿ110ÿ100ÿ00/ÿ0//ÿ/..ÿ..-ÿ.--ÿ--,ÿ-,,ÿ,,+ÿ+++ÿ++*ÿ***ÿ*))ÿ))(ÿ)((ÿ(('ÿ(''ÿ''&ÿ'&&ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿs+*ÿǽ¼ÿÓÒÒÿÓÒÒÿÓÒÒÿÔÓÒÿÔÔÓÿÕÔÓÿÏÐÔÿª¼ÚÿžµÝÿŸ¶ÝÿŸ·ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ¦¼àÿ§¼àÿ§½àÿ¨½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿ©¿áÿª¿áÿª¿áÿªÀáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ®Ããÿ¯Ããÿ°Äãÿ¯Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ³Æäÿ³Çäÿ´Çåÿ´Çåÿ´ÈåÿµÈåÿµÈåÿ¶Èåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¸Ëæÿ¹Ëçÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈ×ìÿÉØìÿÈØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÚíÿÌÛíÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÇÖëÿ¬Ááÿ˜±Úÿ—°Úÿ˜±Úÿ™±Ûÿ™²Ûÿš²Ûÿš³Ûÿ›³Ûÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ£¹Þÿ³¼Ëÿ¿½½ÿ¿½¼ÿ¾¼¼ÿ¾¼¼ÿ¾¼»ÿ½¼»ÿ½»ºÿ¼»ºÿ¼ººÿ¼º¹ÿ»¹¹ÿº¸¸ÿ{yyÿ<<;ÿ<;;ÿ;::ÿ;::ÿ:99ÿ998ÿ988ÿ887ÿ877ÿ776ÿ665ÿ665ÿ544ÿ443ÿ443ÿ332ÿ322ÿ221ÿ211ÿ110ÿ100ÿ0//ÿ0//ÿ/..ÿ/..ÿ.--ÿ.--ÿ,,,ÿ,++ÿ,++ÿ+**ÿ**)ÿ*))ÿ))(ÿ)((ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿ` ÿ§„„ÿÕÔÔÿÔÓÒÿÔÓÓÿÕÔÓÿÕÔÓÿÖÔÔÿÖÕÔÿ¿ÉØÿ ¸Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ§½àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈØìÿÈØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛíÿÍÛîÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÎÜîÿÏÜîÿÂÒêÿ¥¼ßÿ™±Úÿ˜±Úÿ™±Ûÿ™²Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¥ºÞÿ¹½ÈÿÀ¾¾ÿÀ¾½ÿ¿½½ÿ¿½¼ÿ¾¼¼ÿ¾¼¼ÿ¾¼»ÿ½¼»ÿ½»ºÿ¼»ºÿ¼ººÿ¹··ÿbbaÿ=<<ÿ>=<ÿ=<<ÿ<<;ÿ<;:ÿ;;:ÿ;:9ÿ:99ÿ998ÿ988ÿ887ÿ877ÿ766ÿ665ÿ554ÿ544ÿ443ÿ433ÿ332ÿ322ÿ221ÿ211ÿ110ÿ00/ÿ00/ÿ//.ÿ/..ÿ..-ÿ.--ÿ-,,ÿ,,+ÿ,++ÿ++*ÿ+**ÿ**)ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿ>>ÿÌÄÄÿÖÕÔÿÖÔÔÿÖÕÔÿÖÕÕÿ×ÖÕÿ×ÖÕÿÑÒÖÿ¬¾Üÿ ¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒêÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÎÜïÿ¼Íèÿ¡·Þÿ˜±Úÿš²Ûÿš³Ûÿ›³Üÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÜÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¨¼Ýÿ½¿ÅÿÂÀ¿ÿÁÀ¿ÿÁ¿¾ÿÁ¿¾ÿÀ¾¾ÿÀ¾½ÿ¿½½ÿ¿½¼ÿ¾¼¼ÿ¾¼¼ÿ¾¼»ÿ®­¬ÿUTSÿ?>>ÿ@@?ÿ??>ÿ?>>ÿ>==ÿ>==ÿ=<;ÿ=<;ÿ<;;ÿ;::ÿ::9ÿ:99ÿ998ÿ988ÿ877ÿ776ÿ766ÿ665ÿ655ÿ544ÿ544ÿ433ÿ433ÿ322ÿ221ÿ110ÿ110ÿ00/ÿ0//ÿ//.ÿ/..ÿ..-ÿ.--ÿ--,ÿ,,,ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿa ÿ´ššÿ×ÖÖÿÖÕÕÿÖÕÕÿ×ÖÕÿ×ÖÖÿ×ÖÖÿØ×ÖÿÂÊÙÿ£¹Þÿ¢¹Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Áâÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Äãÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒêÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿËÚíÿ³ÇäÿžµÝÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÜÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ§¼àÿ¬¾Úÿ¿ÀÅÿÃÁÀÿÂÀÀÿÁÀ¿ÿÁÀ¿ÿÁ¿¾ÿÁ¿¾ÿÀ¾¾ÿÀ¾½ÿ¿½½ÿ¿½¼ÿÀ¾¾ÿ›™™ÿMLKÿBA@ÿBA@ÿA@@ÿA@?ÿ@??ÿ??>ÿ?>=ÿ>>=ÿ=<<ÿ=<<ÿ<<;ÿ<;:ÿ;::ÿ;:9ÿ:99ÿ988ÿ887ÿ877ÿ776ÿ766ÿ665ÿ554ÿ554ÿ433ÿ433ÿ332ÿ322ÿ211ÿ211ÿ100ÿ00/ÿ0//ÿ/..ÿ/..ÿ.--ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿŠQQÿÕÒÒÿ×ÖÖÿØ×ÖÿØ×ÖÿØ××ÿÙØ×ÿÙØØÿÒÔØÿ®¿Ýÿ¢¹ßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¾áÿª¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ­Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Äãÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ´Çåÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÚíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÆÕëÿ«Àáÿœ³Ûÿ›³Üÿœ´Üÿ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ¨¾áÿ±ÀØÿÂÃÅÿÄÂÂÿÄÂÂÿÃÂÁÿÃÁÁÿÂÁÀÿÂÀÀÿÁÀ¿ÿÁÀ¿ÿÁ¿¿ÿÁ¿¾ÿÂÀ¿ÿ‰ˆ‡ÿFEDÿEDCÿDDCÿDCBÿCBAÿBAAÿBA@ÿA@@ÿ@@?ÿ@?>ÿ??>ÿ?>=ÿ>==ÿ==<ÿ=<;ÿ<<;ÿ<;:ÿ;::ÿ::9ÿ998ÿ988ÿ887ÿ877ÿ776ÿ665ÿ665ÿ554ÿ544ÿ443ÿ433ÿ332ÿ322ÿ221ÿ110ÿ100ÿ0//ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿjÿ¿¬¬ÿÙÙØÿØ××ÿÙØ×ÿÙØ×ÿÙØØÿÚÙØÿÚÙØÿÀËÜÿ¥»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¾áÿª¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ­Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉØìÿÉØìÿÊÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÎÜîÿ½Îèÿ¤ºßÿ›´Üÿ´Üÿ´ÜÿžµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ¤ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¦»ßÿ¦¼ßÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿµÁÕÿÅÄÄÿÅÃÃÿÅÃÃÿÄÂÂÿÄÂÂÿÃÂÁÿÃÁÁÿÂÁÀÿÂÀÀÿÁÀ¿ÿÂÀÀÿ¼»ºÿussÿFEDÿGFEÿFFEÿFEDÿEEDÿEDCÿDCCÿCBBÿCBBÿBAAÿBA@ÿA@?ÿ@??ÿ??>ÿ?>>ÿ>>=ÿ==<ÿ=<<ÿ<;;ÿ<;;ÿ;::ÿ;:9ÿ:99ÿ:98ÿ988ÿ887ÿ776ÿ766ÿ655ÿ554ÿ544ÿ443ÿ433ÿ322ÿ322ÿ211ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ™jjÿØ×ÖÿÚÙØÿÚÙØÿÚÙÙÿÚÚÙÿÛÚÙÿÛÚÚÿÔÖÚÿ®ÁÞÿ¥¼ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¾áÿª¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ­Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈ×ìÿÉØìÿÉØìÿÉØìÿÊÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÊÙìÿ³Çäÿ ·ÝÿµÜÿžµÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Áâÿ¹ÃÓÿÇÅÄÿÇÅÄÿÆÅÄÿÆÄÃÿÅÄÃÿÅÃÃÿÅÃÃÿÄÂÂÿÄÂÂÿÃÂÁÿÄÂÂÿ´³²ÿa`_ÿIIHÿIHGÿHHGÿHGFÿGGFÿGFEÿFEEÿEDDÿEDDÿDCCÿDCBÿCBAÿBAAÿAA@ÿA@@ÿ@@?ÿ??>ÿ?>>ÿ>==ÿ>==ÿ=<<ÿ=<;ÿ<;;ÿ<;:ÿ;::ÿ::9ÿ998ÿ988ÿ877ÿ776ÿ766ÿ665ÿ655ÿ544ÿ544ÿ433ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿp%%ÿɼ»ÿÛÛÚÿÚÙÙÿÛÚÙÿÛÚÚÿÛÚÚÿÜÛÚÿÜÜÛÿÃÍÞÿ§½àÿ§½àÿ§½àÿ¨½àÿ¨¾àÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿºÍçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈ×ìÿÉØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝïÿÁÒêÿª¿àÿž¶ÝÿžµÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ®Âáÿ¿ÅÑÿÈÆÅÿÇÅÅÿÇÅÅÿÇÅÄÿÆÅÄÿÆÄÃÿÅÄÃÿÅÃÃÿÅÃÃÿÄÃÂÿÅÄÃÿª©¨ÿSRQÿLKJÿKJJÿKJIÿJIIÿJIHÿIHGÿIHGÿGFFÿGFFÿFFEÿFEDÿEDCÿEDCÿDCBÿCBBÿBBAÿBA@ÿAA@ÿA@?ÿ@??ÿ??>ÿ?>>ÿ>=<ÿ>=<ÿ=<<ÿ<;;ÿ;;:ÿ;::ÿ::9ÿ:98ÿ988ÿ887ÿ877ÿ776ÿ766ÿ655ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ]ÿ¨ƒƒÿÛÜÛÿÛÚÚÿÜÛÛÿÜÛÛÿÝÜÛÿÝÜÜÿÝÜÜÿÖØÜÿ²Ãßÿ¨¾àÿ©¾áÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÊÚíÿ¶Êæÿ£ºßÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ§½àÿ§½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ±ÄàÿÂÇÏÿÉÈÇÿÉÇÇÿÈÇÆÿÈÆÆÿÈÆÆÿÇÅÅÿÇÅÅÿÇÅÄÿÆÅÄÿÆÄÃÿÅÄÃÿ–•”ÿQPOÿONMÿNMLÿMLKÿLKKÿLKJÿKJJÿKJIÿJIHÿJIHÿIHGÿHGGÿGGFÿGFFÿFFEÿFEDÿEDDÿDCCÿCCBÿCBAÿBBAÿBA@ÿA@@ÿ@@?ÿ@??ÿ??>ÿ?>=ÿ>==ÿ>=<ÿ=<<ÿ<;;ÿ<;:ÿ;::ÿ:99ÿ998ÿ988ÿ887ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿ|99ÿÓÌÌÿÝÜÜÿÜÛÛÿÝÜÛÿÝÜÜÿÞÝÜÿÞÝÝÿÞÝÝÿÅÏßÿª¿áÿ©¿áÿ©¿áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÞïÿÃÓêÿ¬Ááÿ ·ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾àÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ®Ããÿ¯Ããÿ°Äãÿ´ÅàÿÆÈÎÿÊÉÈÿÊÈÈÿÉÈÇÿÉÇÇÿÈÇÆÿÈÆÆÿÈÆÆÿÇÅÅÿÇÅÅÿÇÅÄÿÆÅÄÿ€ÿQPOÿQPOÿOONÿOONÿONMÿNMLÿMLKÿMLKÿLKJÿKJJÿJJIÿJIIÿIIHÿIHGÿHGFÿHFFÿGFEÿFEDÿFEDÿEDCÿDCCÿCBBÿCBBÿBAAÿBA@ÿA@?ÿA@?ÿ@?>ÿ??>ÿ>>=ÿ>=<ÿ==<ÿ<;;ÿ<;;ÿ;;:ÿ;:9ÿ:99ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿcÿ³––ÿßßßÿÞÝÜÿÞÝÝÿÞÞÝÿÞÞÝÿßÞÞÿßÞÞÿØÚÞÿ´ÅàÿªÀáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¾Ðèÿ¿Ðéÿ¿ÑéÿÀÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈØìÿÉØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛíÿÍÛîÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÌÚîÿ¹Ëæÿ¥»ßÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ¯Ããÿ¯Äãÿ¯Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ·ÇßÿÊËÌÿÌÊÊÿËÊÉÿËÊÉÿÊÉÈÿÊÉÈÿÊÈÈÿÉÈÇÿÉÇÇÿÈÇÆÿÈÇÆÿÀ¿¾ÿonmÿRQPÿSRQÿRQPÿRQPÿQPOÿPPOÿPONÿOONÿONMÿNMLÿMLKÿLKKÿKKJÿKKJÿJJIÿJIHÿIHGÿHGGÿHGFÿGFFÿGFEÿFEDÿFEDÿEDCÿDCCÿCCBÿCBAÿBA@ÿBA@ÿA@?ÿ@??ÿ??>ÿ?>=ÿ>>=ÿ>=<ÿ=<<ÿ<<;ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿŠOOÿÙÔÓÿßÞÝÿßÞÝÿßÞÞÿßÞÞÿàßÞÿàßßÿàßßÿÈÑàÿ¬Ááÿ¬Áâÿ¬Áâÿ­Áâÿ­Áâÿ­Ââÿ®Ââÿ®Ââÿ®Ãâÿ¯Ããÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ°Äãÿ±Åãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çäÿ´Çåÿ´ÈåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ»Íèÿ·Êæÿ°Äãÿ«Àáÿ¦¼ßÿ¦¼ßÿ§¼àÿ¦¼àÿ§½àÿ§½àÿ®Âãÿ°Äãÿ´Çäÿ¸Êæÿ½ÏèÿÁÑéÿÂÓêÿÃÓêÿÃÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔêÿÄÔêÿÅÕëÿÅÕëÿÅÕëÿÆÕëÿÆÖëÿÆÖëÿÇÖëÿÇ×ìÿÇ×ìÿÈ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛíÿÍÛîÿÍÛîÿÎÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÅÔëÿ¯Ãâÿ¢¸Þÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥¼ßÿ¦¼àÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Åãÿ±Åãÿ±Åäÿ²Åäÿ²Æäÿ³ÆäÿºÈÞÿÍÌÌÿÍËËÿÌËÊÿÌËÊÿËÊÉÿËÊÉÿËÉÉÿÊÉÈÿÊÈÈÿÉÈÇÿÊÉÈÿ³±±ÿfedÿUTSÿUTSÿTSRÿTSRÿSRQÿSRQÿRQPÿQQPÿQOOÿPONÿONNÿONMÿNMLÿMMKÿLKJÿLKJÿKJIÿJIIÿJIHÿIHHÿIHGÿHGFÿHGFÿGFEÿFEEÿEEDÿEDCÿDCCÿDBBÿBBAÿBBAÿAA@ÿA@?ÿ@@?ÿ@?>ÿ?>>ÿ>>=ÿ[f[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿeÿ®®ÿàààÿàßÞÿàßßÿàßßÿáàßÿáààÿááàÿÚÝàÿ¶Çâÿ¬Áâÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ¸Êæÿ§½àÿ“­Øÿˆ¤Ôÿ„¡ÓÿžÒÿ€Ñÿ€ÒÿžÒÿžÒÿžÒÿ‚ŸÒÿ…¡Ôÿ‡£Ôÿ‰¥ÕÿŒ§Öÿª×ÿ˜°Ûÿ¨½àÿ¶ÉæÿÀÑéÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÌÛíÿºÌçÿ§½àÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ®Ââÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¿ÊÜÿÏÍÎÿÏÍÍÿÎÌÌÿÎÌÌÿÍÌËÿÍËËÿÌËÊÿÌÊÊÿËÊÉÿËÊÉÿÌËÊÿ¢¡ ÿ]\[ÿXWVÿXWVÿWVUÿVUTÿUUTÿUTSÿTSRÿTSRÿSRQÿRQPÿQPPÿQPOÿPOOÿPONÿONMÿONMÿNMLÿMLKÿLKKÿKKJÿKJJÿJIHÿJIHÿIHGÿHGGÿGGFÿGFFÿFFEÿFEDÿEDDÿDCCÿDCCÿCBBÿCBAÿBA@ÿBA@ÿ@@?ÿ[e[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ—eeÿáßßÿáàßÿáààÿáààÿâáàÿâááÿââáÿãâáÿÊÓâÿ®Ããÿ¯Ããÿ¯Äãÿ¯Ããÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Åäÿ²Æäÿ³Æäÿ²Æäÿ³Çäÿ³Çåÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Èåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹Ëçÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Îèÿ¾Ïèÿ°Äãÿª×ÿ~œÑÿ|šÐÿ|šÐÿ}›Ðÿ}›Ñÿ~œÑÿ~œÑÿœÑÿ€Ñÿ€ÒÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒŸÓÿƒ Óÿ„ Óÿ†¢ÔÿŒ§Öÿž´ÝÿµÈåÿÄÔëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÚíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÎÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÇÖëÿ±Äãÿ£ºßÿ£¹Þÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿªÀáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·ÊæÿÄÍÚÿÑÏÏÿÐÏÏÿÐÎÎÿÏÎÎÿÏÍÍÿÏÍÍÿÎÌÌÿÎÌÌÿÍÌËÿÍËËÿËÊÉÿ‘ÿZYXÿ[ZYÿZYXÿYXWÿYXWÿXWVÿWVUÿVVUÿVUTÿUUTÿUTSÿTSRÿTSRÿSRQÿRQQÿQQPÿQPOÿPONÿONMÿONMÿNMLÿMLLÿLLKÿLKKÿKKJÿKJIÿJIHÿJIHÿIHGÿHHGÿHGFÿGFEÿFEEÿEDDÿEDDÿDCCÿDCBÿCBAÿ[T[ò[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿq%%ÿ˼»ÿâãâÿâááÿâááÿââáÿãâáÿãââÿäãâÿÝßãÿ¹Éãÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ³ÇäÿŒ¦Õÿ|šÐÿ}›Ñÿ~œÑÿ~œÑÿœÑÿ€Ñÿ€ÒÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒŸÓÿƒ Óÿ„ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£ÔÿŽ©×ÿ¤»Þÿ¿ÐéÿÇ×ìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÚíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÍÛîÿ¼Ïèÿª¿áÿ¤ºßÿ¥»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¹ËæÿÉÏØÿÒÑÐÿÑÐÐÿÑÏÏÿÐÏÏÿÐÎÎÿÏÎÎÿÏÍÍÿÏÍÍÿÎÌÌÿÎÍÌÿÆÅÄÿ~}ÿ]\[ÿ]\[ÿ\[Zÿ[ZZÿ[ZYÿZYXÿZYXÿYXWÿXWVÿWVUÿWVUÿVUTÿUUTÿUTSÿTTSÿTSRÿSRQÿRQPÿQPPÿPPOÿPONÿOONÿONMÿNMLÿMLKÿMLKÿLKJÿKKJÿKJIÿJJIÿJIHÿIHGÿHGGÿGGFÿGFEÿFEDÿFEDÿEDCÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ¥}|ÿâááÿãââÿãââÿäãâÿäããÿäããÿääãÿäääÿÌÕäÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¾ÐèÿžµÜÿ~œÑÿœÑÿÑÿ€ÒÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒŸÓÿƒ Óÿ„ Óÿ„¡Óÿ…¡Óÿ…¢Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Õÿ‰¤Õÿ‰¥ÕÿŠ¥ÕÿŠ¥Õÿ‹¦Õÿš²Ûÿ¹ÌçÿÈØìÿÉØìÿÉØìÿÊÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÈ×ìÿ³Æåÿ¦¼ßÿ¤»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÍçÿÍÑ×ÿÓÒÒÿÓÒÑÿÒÑÑÿÒÑÑÿÑÐÐÿÑÐÐÿÑÏÏÿÐÏÏÿÐÎÎÿÐÏÎÿÀ¾¾ÿlkjÿ`_^ÿ`_^ÿ_^]ÿ^]\ÿ]\[ÿ\[[ÿ\[Zÿ[ZZÿ[ZYÿZYXÿYXWÿXWVÿXWVÿWVUÿVVUÿVUTÿUUTÿUTSÿTSRÿSRQÿRQQÿRQPÿQPPÿQPOÿPONÿONMÿNMLÿNMLÿMLKÿLLKÿLKJÿKKIÿKJIÿJIHÿIHHÿHHGÿHGGÿGGFÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿ{44ÿ×ÍÍÿäããÿäãâÿäããÿäããÿåääÿåääÿæåäÿßáäÿ»Ëäÿ±Åäÿ²Æäÿ³Æäÿ³Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿºÍçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿºÌçÿª×ÿœÑÿ€ÒÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒŸÓÿ„ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Õÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ¦ÖÿŒ§ÖÿŒ§Öÿ•®ÙÿµÈåÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÍÜîÿ¿Ñéÿ¬Áâÿ¥»ßÿ¦¼ßÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿ»Íçÿ¾ÎæÿÐÒ×ÿÔÓÓÿÔÓÒÿÓÒÒÿÓÒÑÿÒÑÑÿÒÑÑÿÑÐÐÿÑÐÐÿÑÏÏÿÑÐÐÿ±°°ÿgfeÿba`ÿba`ÿa`_ÿ`_^ÿ`_^ÿ_^]ÿ^]\ÿ]\[ÿ]\[ÿ\[Zÿ[ZZÿ[ZYÿZYXÿYXWÿYXWÿXWVÿWVUÿVUTÿUUTÿUTSÿTTSÿTSRÿSRQÿSRQÿRQPÿQPPÿPPOÿPONÿONMÿONMÿNMLÿMLKÿLKKÿKKJÿKJJÿJJIÿJIHÿIHGÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿbÿ·——ÿåææÿåääÿåääÿååäÿæååÿæååÿææåÿæææÿÏ×åÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿ¸ËæÿЦÕÿžÒÿ‚ŸÒÿƒŸÓÿƒ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§ÖÿŒ§Öÿ§Öÿ¨Öÿލ×ÿލ×ÿ©×ÿލ×ÿ–¯Ùÿ·ÊæÿÊÙíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÉÙìÿ¶Éåÿ¨½àÿ¦½àÿ§½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½ÏèÿÂÐäÿÒÔ×ÿÖÕÔÿÕÔÔÿÕÔÓÿÕÔÓÿÔÓÓÿÔÓÒÿÓÒÒÿÓÒÑÿÒÑÑÿÒÑÑÿœ›ÿfedÿedcÿdcbÿcbaÿcbaÿba`ÿa`_ÿa`_ÿ`_^ÿ_^]ÿ^]\ÿ^]\ÿ]\[ÿ\[[ÿ\[Zÿ[ZZÿ[ZYÿZYXÿYXWÿXWVÿXWVÿVVUÿVVUÿVUTÿUTSÿTSRÿTSRÿSRQÿRQQÿQQPÿQPPÿPPOÿPONÿONMÿNMLÿNMLÿLLKÿLLKÿLKJÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ]ÿ]ÿ‹KKÿàÜÛÿææåÿæååÿæååÿææåÿææåÿçææÿèçæÿáãæÿ¾Íåÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÂÓêÿ¹ËçÿŒ¦ÖÿƒŸÓÿ„ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§ÖÿŒ§Öÿ§Öÿ¨Öÿލ×ÿލ×ÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ—°Úÿ¸ËæÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÎÜîÿÁÒéÿ®Ãâÿ¨½àÿ§½àÿ¨¾àÿ©¾àÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Èåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾ÐèÿÆÒäÿÖÖØÿ×ÖÕÿÖÕÕÿÖÕÔÿÖÕÔÿÕÔÓÿÕÔÓÿÔÓÓÿÔÓÒÿÓÒÒÿÑÐÐÿŒ‹Šÿgfeÿgfeÿgfeÿfedÿedcÿdcbÿdcbÿcbaÿba`ÿba`ÿa`_ÿa`_ÿ`_^ÿ`_]ÿ^]\ÿ]\\ÿ]\[ÿ\[Zÿ[ZYÿZYYÿZYXÿYXWÿYXWÿXWVÿWWVÿWVUÿVUTÿUTSÿUTSÿTSRÿSRRÿRRQÿRQPÿQPOÿPOOÿPONÿONMÿONMÿNMLÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ^ÿ_ÿ_ÿ`ÿlÿè¨ÿèééÿçææÿçææÿççæÿèççÿèèçÿèèçÿéèèÿÑÙæÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÄÔêÿºÌçÿލÖÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥ÕÿŠ¥Õÿ‹¦Öÿ‹¦ÖÿŒ§ÖÿŒ¨Öÿ¨Öÿލ×ÿލ×ÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ’¬Øÿ“­Ùÿ“­Ùÿ›³Ûÿ½ÏèÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿËÚíÿ¹ËæÿªÀáÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ½Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÉÔãÿØØÙÿÙØ×ÿØ××ÿØ×Öÿ×ÖÖÿ×ÖÕÿÖÕÕÿÖÕÔÿÖÕÔÿÖÕÔÿÇÆÅÿ~}ÿihgÿjihÿihgÿhgfÿhfeÿgfeÿfedÿfedÿedcÿdcbÿcbaÿcbaÿba`ÿba`ÿa`_ÿ`_^ÿ_^]ÿ_^]ÿ^]\ÿ]\[ÿ\[Zÿ[ZZÿ[ZYÿZYXÿZYXÿYXWÿXWWÿXWVÿWVUÿVUTÿVUTÿUTSÿTSRÿSSRÿSRQÿRQPÿQPPÿQPOÿPONÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ]ÿ^ÿ_ÿ_ÿaÿaÿcÿbÿœbbÿäââÿçççÿèççÿèççÿèèçÿéèèÿéèèÿêéèÿãåèÿÀÏæÿ¶Éæÿ·Êæÿ¸Êæÿ¸Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿ¼Îèÿ‘«Øÿ†¢Ôÿ‡£Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥ÕÿŠ¥Õÿ‹¦Öÿ‹¦ÖÿŒ§Öÿ§Öÿ¨Öÿލ×ÿލ×ÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ ·ÝÿÄÔêÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝïÿÃÓêÿ±Åãÿª¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒéÿÁÒêÿÍÖãÿÚÙÙÿÚØØÿÙØØÿØ××ÿØ××ÿØ×Öÿ×ÖÖÿ×ÖÕÿÖÕÕÿØ×Öÿº¹¸ÿvutÿmlkÿlkjÿlkjÿkjiÿjihÿihgÿigfÿhgfÿhfeÿgfeÿfedÿedcÿdcbÿdcbÿcbaÿba`ÿa`_ÿa`_ÿ`_^ÿ`_^ÿ_^]ÿ^]\ÿ^]\ÿ]\[ÿ\[Zÿ[ZYÿZYYÿZYXÿZYXÿYXWÿXWVÿWVUÿVUTÿVUTÿUTSÿTTSÿTSRÿSSRÿSRQÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ]ÿ]ÿ^ÿ_ÿ`ÿaÿbÿcÿdÿeÿeÿwÿÔÃÂÿéééÿéèèÿéèèÿééèÿêééÿêééÿêêêÿëêêÿÓÜèÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔêÿÄÔëÿÅÕëÿÁÒêÿ›²Ûÿ‡£Ôÿ‰¤Õÿ‰¥ÕÿŠ¥ÕÿŠ¥Õÿ‹¦Öÿ‹¦ÖÿŒ§ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ’¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ—¯Úÿ—°Úÿ—°Úÿª¿áÿÊÚíÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿËÚíÿ»Íçÿ­Áâÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ®Ââÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÐØâÿÜÛÚÿÛÚÚÿÛÚÚÿÚÙÙÿÚÙÙÿÙØØÿÙØØÿØ××ÿØ××ÿÙØ×ÿ­¬«ÿponÿponÿonmÿonmÿnmlÿmlkÿlkjÿkjiÿjihÿjhgÿihgÿigfÿhgfÿgfeÿgfeÿfedÿedcÿdcbÿdcbÿcbaÿba`ÿba`ÿa`_ÿ`_^ÿ_^]ÿ_^]ÿ^]\ÿ]\[ÿ\[Zÿ\[Zÿ[ZYÿ[ZYÿZYXÿYXWÿYXWÿWVUÿWVUÿVUTÿUUTÿUTSÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ^ÿ^ÿ`ÿaÿbÿcÿdÿeÿfÿhÿiÿlÿ¬yxÿéééÿéèèÿêééÿêééÿêêéÿêêêÿëêêÿìëëÿåçêÿÂÑçÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÆÖëÿÆÖëÿ¨½àÿ‰¥ÕÿŠ¥ÕÿŠ¥Õÿ‹¦Öÿ‹¦ÖÿŒ§Öÿ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ™±Úÿ™±Ûÿ›³Üÿ´ÇåÿÎÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝïÿÅÕêÿ³Çäÿ«Àáÿ«Àáÿ«Àáÿ¬Áâÿ­Áâÿ­Áâÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ³Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËæÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ïèÿ¿ÐéÿÀÐéÿÀÑéÿÁÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÆÕëÿÕÚâÿÝÜÛÿÜÛÛÿÜÛÛÿÛÚÚÿÛÚÚÿÚÙÙÿÚÙÙÿÙØØÿÙØØÿÖÕÔÿ›šÿrpoÿsqpÿrpoÿqpnÿponÿonmÿnmlÿmlkÿmlkÿlkjÿkjiÿjihÿjihÿihgÿigfÿhgfÿhfeÿgfeÿfedÿedcÿdcbÿcbaÿba`ÿba`ÿa`_ÿa`_ÿ`_^ÿ`_^ÿ_^]ÿ^]\ÿ]\[ÿ]\[ÿ\[Zÿ[ZYÿZYYÿZYXÿYXWÿXWVÿXWVÿWVUÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ]ÿ^ÿ_ÿ`ÿaÿbÿcÿdÿeÿfÿhÿiÿkÿlÿkÿŠ75ÿÜÐÏÿëìëÿëêêÿëêêÿëëëÿìëëÿìëëÿìììÿìììÿÕÞêÿ»Íçÿ»Íçÿ»Íçÿ¼Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿºÌçÿ“¬Øÿ‹§Öÿ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’«Øÿ“¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Üÿœ³Üÿ ·ÞÿÀÑéÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿËÚíÿ¼Îèÿ®Ãâÿ¬Áâÿ¬Áâÿ­Áâÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÈ×ëÿÙÜâÿßÞÝÿÞÝÝÿÞÝÜÿÝÜÜÿÝÜÛÿÜÛÛÿÜÛÛÿÛÚÚÿÛÚÚÿÓÒÑÿ‹Š‰ÿtsrÿusrÿtrqÿtrqÿsqpÿrpoÿqpoÿponÿponÿonmÿnmlÿmlkÿmlkÿlkjÿkjiÿjihÿjhgÿihgÿigfÿhgfÿgfeÿfedÿedcÿedcÿdcbÿcbaÿba`ÿba`ÿa`_ÿa`_ÿ`_^ÿ_^]ÿ^]\ÿ]\[ÿ]\[ÿ\[Zÿ[ZZÿ[ZYÿZYYÿZYXÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ]ÿ]ÿ^ÿ_ÿ`ÿaÿbÿcÿdÿeÿgÿhÿiÿkÿlÿmÿnÿoÿtÿ½“’ÿìíìÿëëëÿëëëÿììëÿììëÿíììÿííìÿîíìÿèéìÿÅÓèÿ»Íçÿ¼Îçÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔêÿÅÕëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈ×ìÿÈ×ìÿ«Àáÿ©×ÿ©×ÿª×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’«Øÿ’«Øÿ“¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Úÿ•¯Ùÿ–¯Úÿ—¯Úÿ—°Úÿ—°Úÿ˜±Úÿ™±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿœ³Ûÿœ´Üÿ´ÜÿµÝÿµÜÿ¨¾àÿÇ×ëÿÐÞïÿÑßïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝîÿÄÔëÿ³Çäÿ­Áâÿ­Áâÿ­Ââÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Ääÿ°Ääÿ±Åäÿ±Åäÿ²Æäÿ³Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Ëçÿ¸Ëçÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íèÿ¼Îçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïéÿ¾Ðèÿ¿Ðéÿ¿ÑéÿÀÑéÿÀÑêÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÔëÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖìÿÆÖëÿÇ×ìÿÇ×ìÿËØëÿÜÞâÿàßßÿßÞÞÿßÞÞÿÞÝÝÿÞÝÜÿÝÜÜÿÝÜÛÿÜÛÛÿÝÜÛÿÊÉÈÿ~}ÿxwvÿwvuÿvutÿvtsÿusrÿtrqÿsrqÿsqpÿrqpÿqpoÿqonÿpomÿonmÿnmlÿnmlÿmlkÿlkjÿkjiÿkihÿjihÿihgÿhgfÿhfeÿgfeÿfedÿfedÿedcÿdcbÿcbaÿcbaÿba`ÿa`_ÿa`_ÿ`_^ÿ_^]ÿ^]\ÿ^]\ÿ]\[ÿ\[[ÿ\[Zÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ]ÿ]ÿ_ÿ_ÿ`ÿaÿbÿcÿeÿeÿgÿhÿiÿkÿlÿnÿoÿqÿqÿsÿtÿ—DAÿæàßÿìììÿìììÿííìÿííìÿîííÿîííÿîîíÿïîîÿØßëÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈ×ìÿÉØìÿÉØìÿÉØìÿÊÙíÿÄÔëÿ©¾áÿ¥»ßÿ¦¼ßÿ¡·ÝÿµÜÿ´Üÿ›´Ûÿ›³Ûÿš²Ûÿ™²Ûÿ˜°Úÿ–¯Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´Üÿ´ÜÿžµÜÿžµÝÿŸ¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿª¿áÿºÍçÿÂÓèÿÊÙìÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÉÙìÿºÍçÿ¯Ããÿ­Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Æäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÍÚëÿààâÿááàÿáààÿàßßÿàßßÿàßßÿßÞÞÿßÞÝÿÞÝÝÿßÞÝÿ¹¸·ÿ~}|ÿzyxÿzyxÿyxwÿxwvÿwvuÿvutÿvutÿutsÿusrÿtrqÿsqpÿrqoÿrqoÿqpnÿponÿonmÿonmÿnmlÿmlkÿlkjÿkjiÿkjiÿjihÿjhgÿihgÿhgfÿgfeÿgfeÿfedÿedcÿdcbÿdcbÿcbaÿba`ÿba`ÿa`_ÿa`_ÿ`_^ÿ_^]ÿ^]\ÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ]ÿ^ÿ_ÿ`ÿaÿbÿcÿdÿeÿfÿgÿhÿjÿkÿlÿnÿoÿqÿrÿtÿuÿwÿxÿ‚ÿͬ«ÿîîîÿííìÿîííÿîîíÿïîîÿïîîÿïïîÿððïÿçêîÿÅÔéÿ¾Ïéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈ×ìÿÉØìÿÈØìÿÉØìÿÉØíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÅÕëÿ®Ââÿ³Æäÿ¼Íçÿ¹ËæÿµÈåÿ²Æäÿ¯Ããÿ¬Áâÿ©¾áÿ¦¼ßÿ ·Ýÿ™±Ûÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¸Þÿ£ºßÿ‘§Îÿž²ÕÿºÌçÿÃÓêÿËÚíÿÏÝïÿÐÞïÿÑÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÌÛîÿÀÑéÿ³Æäÿ­Ââÿ®Ââÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ½Ïèÿ¾Ðèÿ¾Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒêÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÄÕëÿÅÕëÿÅÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÑÜëÿãããÿããâÿââáÿââáÿâááÿáààÿáààÿàßßÿàßßÿßÞÞÿ§¦¥ÿ}|{ÿ}|zÿ}|zÿ|{yÿ{zyÿzyxÿyxwÿxwvÿwvuÿwvuÿvutÿvtsÿusrÿusrÿtrqÿsrpÿrqpÿrqoÿqpoÿponÿonmÿnmlÿmlkÿlkjÿlkjÿkjiÿkihÿjihÿjhgÿihgÿhgfÿgfeÿgfeÿfedÿedcÿdcbÿcbaÿcbaÿba`ÿba`ÿa`_ÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ^ÿ_ÿ`ÿaÿaÿcÿcÿeÿfÿgÿhÿjÿkÿlÿmÿoÿqÿrÿtÿuÿwÿxÿzÿ{ÿ}ÿª_\ÿëææÿïîîÿîîîÿïîîÿïïïÿðïïÿðïïÿððïÿðððÿ×àìÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÃÔêÿÄÔëÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈ×ìÿÉØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÍÜîÿÄÔëÿ«Àáÿ¸ËæÿÃÓêÿÀÑéÿ½ÏçÿºÌçÿ·Êåÿ´Çäÿ±Åãÿ­Ââÿ¢¹ßÿ™²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´Üÿ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¥»ßÿ•¬Òÿƒ™Äÿ¦¼ßÿ©¾áÿ®ÂâÿµÉåÿ¾ÐèÿÆÖëÿËÚíÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÌÛîÿÃÓêÿ¶Éæÿ¯Äãÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈØìÿÈØìÿÉØìÿÉÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÔÞëÿäääÿäããÿäããÿããâÿãââÿââáÿâááÿááàÿáààÿÚÙÙÿš˜˜ÿ}|ÿ€~}ÿ~|ÿ~}{ÿ}|zÿ|{yÿ{zyÿ{zyÿzyxÿyxwÿxwvÿxwvÿwvuÿvutÿutsÿutsÿtsrÿtrqÿsqpÿrqoÿqpoÿponÿponÿonmÿnmlÿmlkÿmlkÿlkjÿkjiÿjihÿjihÿihgÿihgÿhgfÿgfeÿfedÿedcÿedcÿdcbÿcbaÿba`ÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ]ÿ^ÿ_ÿ`ÿaÿbÿcÿdÿeÿfÿhÿhÿjÿkÿmÿnÿoÿpÿrÿtÿuÿwÿxÿzÿ|ÿ~ÿÿ€ÿÿÙ¿¾ÿðòòÿðïïÿðïïÿððïÿñððÿññðÿñññÿñññÿêìðÿÇÖêÿÁÒéÿÁÒêÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈØìÿÉØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛíÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÝîÿÁÒéÿ§½àÿ»ÌçÿÊÚíÿÈ×ìÿÄÕëÿÁÒéÿ¾Ðéÿ»Íçÿ¸Ëæÿ²Æäÿ ¸Ýÿœ´Üÿ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ¡·Ûÿ€–ÁÿŸµÙÿ¨¾áÿ¨¾àÿ©¾àÿª¿áÿ¬Áâÿ³ÆäÿºÌçÿ¿ÐèÿÇÖëÿÉÙíÿÆÖìÿ¿Ðéÿ¶Éæÿ°Äãÿ¯Ããÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ³Çäÿ´Çåÿ´ÈåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ½Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔëÿÄÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÎÝîÿÏÝïÿÙàëÿæææÿæååÿæååÿåääÿåääÿäããÿäããÿããâÿäããÿÑÐÏÿ’ÿ‚€ÿ‚€ÿ‚€ÿ~ÿ€}ÿ~|ÿ~}{ÿ~}{ÿ}|zÿ|{zÿ{zyÿ{zyÿzyxÿyxwÿxwvÿwvuÿvutÿvutÿutsÿusrÿtrqÿsrpÿsqpÿrqoÿqpoÿponÿponÿonmÿnmlÿmlkÿlkjÿkjiÿkjiÿjihÿjhgÿihgÿhgfÿhgfÿgfeÿfedÿedcÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ^ÿ_ÿ`ÿ`ÿbÿcÿdÿeÿfÿhÿiÿjÿkÿmÿnÿpÿpÿrÿtÿvÿxÿyÿ{ÿ|ÿ~ÿ€ÿ‚ÿƒÿ…ÿ‡ÿºvrÿïîíÿððïÿðððÿñððÿñññÿñññÿòññÿòòñÿòññÿÚâîÿÂÓêÿÂÓêÿÂÓêÿÃÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÄÔëÿÅÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈØìÿÈØìÿÉØìÿÉÙíÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛíÿÍÛîÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿ»Íèÿ¢¹Þÿ¸ËæÿÍÜíÿÎÜîÿËÚíÿÉÙìÿÆÖëÿÃÔëÿÁÒéÿ°Åãÿž¶ÝÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ§½àÿ¨½àÿ§½àÿ‡Æÿ”ªÐÿ«Àâÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ¬Ââÿ®Ââÿ±Åäÿ²Æäÿ±Åäÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÜãëÿçççÿççæÿææåÿæååÿæååÿåääÿåääÿäããÿæååÿÆÅÄÿ‰ˆ‡ÿ…„ƒÿ…ƒ‚ÿ„‚ÿƒ€ÿƒ€ÿ‚€ÿ~ÿ€~}ÿ~|ÿ}|ÿ~}{ÿ}|zÿ|{yÿ|{yÿ{zxÿzyxÿyxwÿxwvÿwvuÿwvuÿvutÿutsÿusrÿtrqÿtrqÿsqpÿrqoÿqpoÿqpnÿponÿonmÿnmlÿmlkÿlkjÿkjiÿkjiÿjihÿjhgÿihgÿigfÿhgfÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ^ÿ^ÿ_ÿ`ÿaÿbÿcÿdÿeÿfÿhÿiÿjÿkÿmÿnÿpÿqÿsÿtÿvÿwÿyÿ{ÿ|ÿ~ÿÿ‚ÿƒÿ…ÿ‡ÿ‰ÿŠÿŸ1+ÿåÕÔÿñññÿñññÿòññÿòòñÿòòòÿóòòÿóòòÿôóóÿëíñÿÊØëÿÃÓêÿÄÔêÿÄÔêÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÇ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛíÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÎÝîÿ´Èåÿž¶Üÿ´ÇäÿËÚíÿÐÞïÿÐÞïÿÏÝîÿÍÜîÿËÚíÿÄÔêÿ§½àÿŸ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ£ºÞÿ£ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ§½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿ«Àâÿ“¨Ïÿ‹ Éÿ«Àáÿ¬Áâÿ­Áâÿ­Ââÿ®Ããÿ®Ããÿ¯Äãÿ°Äãÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔêÿÄÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿßäëÿêééÿéèèÿèèçÿèççÿççæÿçææÿçææÿæååÿåääÿ¹¸·ÿˆ‡†ÿˆ‡†ÿ‡†…ÿ‡…„ÿ†„ƒÿ†„ƒÿ…ƒ‚ÿ„‚ÿƒ€ÿ‚€ÿ~ÿ€}ÿ€}ÿ~|ÿ~}{ÿ}|zÿ}|zÿ|{yÿ{zyÿzyxÿzyxÿyxwÿxwvÿwvuÿvutÿvtsÿusrÿusrÿtrqÿsrpÿrqpÿrqoÿqpoÿponÿonmÿnmlÿnmlÿmlkÿlkjÿkjiÿkihÿjihÿ[L[ë[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ]ÿ_ÿ_ÿ`ÿaÿbÿcÿeÿeÿgÿhÿjÿkÿlÿnÿoÿqÿrÿtÿuÿwÿxÿzÿ{ÿ}ÿÿ€ÿ‚ÿ„ÿ†ÿ‡ÿ‰ÿ‹ÿÿÿ“ ÿÊÿóóôÿòññÿòòòÿóòòÿóòòÿóóóÿóóóÿôôóÿôôôÿÛäïÿÄÕêÿÄÕëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÌÛîÿ¬ÁâÿµÜÿ¬ÀâÿÃÓêÿÎÜîÿÐÞïÿÐÞïÿÐÞïÿÍÜîÿ²Åãÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¦»ßÿ¦¼ßÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿª¿áÿ«Àáÿ¬ÁâÿŸ´Øÿ…›Äÿª¾àÿ®Ââÿ®Ââÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ³Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËæÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ïèÿ¿ÐéÿÀÐéÿÀÑéÿÁÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇÖëÿÇÖìÿÈ×ìÿÈ×ìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÍÛîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿäçëÿëêéÿêêéÿéééÿéèèÿèèèÿèççÿççæÿççæÿãââÿ©¨§ÿ‹Šˆÿ‹Š‰ÿЉˆÿ‰‰ˆÿˆ‡†ÿˆ†…ÿ‡…„ÿ†„ƒÿ†„ƒÿ…ƒ‚ÿ…ƒ‚ÿ„ÿƒ€ÿ‚€ÿ‚€ÿ~ÿ€~}ÿ}|ÿ}{ÿ}|zÿ|{zÿ{zyÿzyxÿzyxÿyxwÿxxwÿwwvÿwvuÿvutÿvttÿusrÿtsrÿtrqÿsqpÿrpoÿqpnÿponÿonmÿonmÿnmlÿmmlÿlkjÿ[L[ë[ÿ[ÿ[ÿ[ÿ\ÿ\ÿ]ÿ^ÿ_ÿ_ÿaÿaÿbÿcÿeÿfÿgÿhÿjÿkÿlÿnÿoÿqÿrÿtÿuÿwÿxÿzÿ{ÿ}ÿÿÿƒÿ„ÿ†ÿˆÿŠÿ‹ÿÿÿ‘ÿ“ÿ”ÿ°FAÿëßßÿôôôÿóóóÿôóóÿôôóÿôôôÿôôôÿõõôÿõõôÿíðóÿÌÚìÿÆÖëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÚíÿÌÛîÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÇÖëÿ§½àÿžµÜÿ¤»ßÿ®Ââÿ²Æäÿ·Êæÿ´Çåÿ°Äãÿ¨½àÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿªÀáÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ®Ââÿ«Ààÿ‚˜Âÿ¨¼Ýÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÛíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿæéíÿíìëÿìëëÿëëêÿëêêÿêêéÿêééÿééèÿéèèÿàßßÿ›š˜ÿŽ‹ÿŽ‹ÿŒŠÿŒ‹Šÿ‹ŠˆÿЉˆÿ‰ˆ‡ÿˆ‡†ÿˆ‡†ÿ‡†…ÿ‡…„ÿ†„ƒÿ…„ƒÿ„ƒ‚ÿ„‚ÿƒ€ÿƒ€ÿ‚€ÿ~ÿ€~}ÿ~|ÿ~}{ÿ}|zÿ}|zÿ|{yÿ{zyÿzyxÿzywÿyxvÿxwvÿwvuÿwvuÿvutÿutsÿtsrÿsrqÿsrpÿrqoÿrpoÿqonÿponÿonmÿ[L[ë[ÿ[ÿ[ÿ\ÿ]ÿ^ÿ_ÿ_ÿaÿaÿcÿcÿeÿfÿhÿhÿjÿkÿmÿnÿoÿqÿrÿtÿuÿwÿyÿzÿ|ÿ~ÿÿÿ‚ÿ„ÿ‡ÿˆÿŠÿŒÿŽÿÿ’ÿ“ÿ•ÿ˜ÿšÿŸ ÿÙ«©ÿõööÿôóóÿôôôÿôôôÿõôôÿõõôÿõõõÿõõõÿööõÿÞæðÿÇ×ëÿÇÖìÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÈØìÿÉØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÚíÿÌÛîÿÌÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿ¿Ðèÿ£ºÞÿ ·Ýÿ ¸Þÿ¢¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¦»ßÿ¦¼ßÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿ«¿áÿ«Àáÿ«Àáÿ¬Áâÿ­Áâÿ­Áâÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ‡œÅÿ¡µØÿ±Åäÿ±Åäÿ²Åäÿ³Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËæÿºËçÿºÌçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÛíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÔàïÿéëíÿíííÿíììÿìììÿìëëÿëëêÿëëêÿêêéÿëêêÿÒÒÑÿ–•“ÿ‘ŽÿÿŽŒÿŽŒÿŽ‹ÿŒŠÿŒ‹‰ÿ‹Š‰ÿ‹ŠˆÿЉˆÿ‰ˆ‡ÿˆ‡†ÿˆ‡†ÿ‡†…ÿ†…„ÿ†„ƒÿ…ƒ‚ÿ„‚ÿ„‚ÿƒ€ÿ‚€ÿ~ÿ€~}ÿ€~}ÿ}|ÿ~}{ÿ}|zÿ}|zÿ|{yÿ{zxÿzyxÿyxwÿxwvÿxwvÿwvuÿvutÿutsÿtsrÿtsrÿsrqÿsqpÿrpoÿ[L[ë\ÿ]ÿ]ÿ^ÿ_ÿ`ÿaÿbÿcÿdÿeÿfÿhÿiÿjÿkÿmÿnÿpÿqÿrÿtÿuÿwÿyÿ{ÿ|ÿ~ÿÿÿ‚ÿ…ÿ†ÿˆÿ‹ÿŒÿŽÿÿ’ÿ”ÿ–ÿ˜ÿšÿœÿžÿ ÿ¾YSÿòíìÿõôôÿõõõÿõõõÿöõõÿöööÿöööÿöööÿ÷÷÷ÿîñõÿÏÜîÿÇ×ìÿÉØìÿÉØìÿÉØìÿÊÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÎÜîÿµÈåÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ¥Ëÿ›°Ôÿ³Çåÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ËçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿËÚíÿÌÛíÿÌÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿ×âïÿìíïÿïïïÿïîîÿîîíÿîííÿííìÿíììÿììëÿíììÿÃÂÁÿ•”’ÿ”“‘ÿ“’ÿ’‘ÿ’‘ÿ‘ŽÿÿŽŒÿŽ‹ÿŒŠÿŒ‹ŠÿŒ‹Šÿ‹Š‰ÿЉˆÿ‰ˆ‡ÿ‰ˆ‡ÿˆ‡†ÿ‡†…ÿ‡…„ÿ†…„ÿ†„ƒÿ…ƒ‚ÿ„‚ÿƒ€ÿ‚€ÿ~ÿ~ÿ€~}ÿ~|ÿ~}{ÿ~}{ÿ}|zÿ|{yÿ{zyÿ{zxÿzyxÿyxwÿxwvÿwvuÿvutÿutsÿutsÿtsrÿ\L\ë]ÿ^ÿ^ÿ`ÿaÿbÿcÿdÿeÿfÿhÿiÿkÿkÿmÿnÿpÿqÿsÿuÿvÿxÿyÿ{ÿ|ÿ~ÿ€ÿ‚ÿƒÿ…ÿ†ÿ‰ÿŠÿŒÿÿÿ’ÿ”ÿ–ÿ˜ÿšÿœÿžÿ ÿ£ÿ¤ÿ¯"ÿäÁ¾ÿö÷÷ÿöõõÿöõõÿöööÿöööÿ÷ööÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿßèòÿÉÙìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿÉØíÿ¬Áâÿ¤»ßÿ¥»ßÿ¥»ßÿ¦¼ßÿ§¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ®Ââÿ®Ââÿ¯Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ”¨Íÿš¯ÒÿµÈåÿ´ÇåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÙãïÿîïðÿðððÿðïïÿðïïÿïïîÿîîîÿîîíÿíííÿìëëÿ¶µµÿ•”’ÿ–•“ÿ–•“ÿ•”’ÿ”“‘ÿ“’ÿ“’ÿ’‘ÿ‘ŽÿÿŽŒÿŽ‹ÿŒŠÿŒŠÿŒ‹‰ÿ‹Š‰ÿЉˆÿЉˆÿ‰ˆ‡ÿˆ‡†ÿ‡†…ÿ††…ÿ†…„ÿ…„ƒÿ…ƒ‚ÿ„‚ÿƒ€ÿ‚€ÿ‚€ÿ~ÿ€~}ÿ}|ÿ}|ÿ~|{ÿ}|zÿ|{yÿ{zxÿ{zxÿzywÿyxwÿxwvÿwvuÿvutÿ^L^ë_ÿ`ÿaÿbÿcÿdÿfÿfÿhÿiÿkÿlÿmÿnÿpÿqÿsÿtÿvÿxÿyÿ{ÿ|ÿÿ€ÿ‚ÿƒÿ…ÿ‡ÿ‰ÿ‹ÿÿŽÿ‘ÿ“ÿ”ÿ—ÿ™ÿ›ÿÿŸÿ¡ÿ£ÿ¥ÿ§ ÿ© ÿ« ÿÎupÿõññÿö÷÷ÿ÷ööÿ÷÷÷ÿ÷÷÷ÿøø÷ÿøøøÿøøøÿùùøÿñô÷ÿÑÞîÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÌÛîÿÌÛîÿÍÜîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿ¾Ðéÿ§½àÿ§½àÿ§½àÿ¨¾àÿ¨¾áÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ³Çäÿ´Çåÿ³ÇäÿŠŸÆÿ¤¸Øÿ·Éæÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒêÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÄÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÞïÿÜäðÿññòÿòòòÿòññÿñññÿñððÿðððÿðïïÿðððÿåääÿ­¬ªÿ™˜–ÿ™˜–ÿ™˜–ÿ—–”ÿ—–”ÿ–•“ÿ•”’ÿ”“‘ÿ“’ÿ“’ÿ’‘ÿ‘ŽÿÿÿŽŒÿŽ‹ÿŒŠÿŒŠÿ‹Š‰ÿ‹Š‰ÿЉˆÿ‰ˆ‡ÿˆ‡†ÿ‡†…ÿ‡†…ÿ†…„ÿ†„ƒÿ…ƒ‚ÿ…ƒ‚ÿ„‚ÿƒ€ÿ‚€ÿ‚€ÿ€~}ÿ€~}ÿ~|ÿ~}{ÿ}|zÿ|{yÿ|{yÿ{zxÿzyxÿyxwÿ`L`ëaÿbÿcÿdÿeÿgÿhÿiÿkÿlÿmÿnÿpÿqÿsÿtÿvÿwÿyÿ{ÿ}ÿÿ€ÿ‚ÿƒÿ…ÿ‡ÿ‰ÿ‹ÿÿÿ‘ÿ’ÿ”ÿ–ÿ˜ÿ›ÿœÿŸÿ¡ÿ£ÿ¥ÿ§ ÿ© ÿ¬ ÿ® ÿ° ÿ¼,#ÿìÑÏÿøùùÿ÷÷÷ÿ÷÷÷ÿøø÷ÿùùøÿøøøÿùùøÿùùùÿùùùÿãêóÿÌÚíÿËÚíÿÌÛíÿÍÛîÿÍÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÎÝîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÌÛíÿ¯Ããÿ¨¾àÿ©¾àÿ©¿áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ­Áâÿ­Ââÿ­Âãÿ®Ãâÿ¯Ããÿ¯Ããÿ°Äãÿ°Ääÿ±Åãÿ±Åäÿ²Æäÿ³Æäÿ³Çäÿ´Çäÿ´ÈåÿµÈåÿ¶Éæÿ¬¿Þÿ…šÃÿ°Ãáÿ¸Êæÿ¸Êæÿ¸Ëçÿ¹ËçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïéÿ¾Ðèÿ¿ÐéÿÀÑéÿÀÑéÿÁÑêÿÁÒêÿÂÒêÿÂÓêÿÃÓêÿÃÔëÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖìÿÇÖëÿÇ×ìÿÈ×ìÿÈ×ìÿÉØíÿÉØìÿÊÙíÿÊÙíÿËÚíÿËÚîÿÌÚíÿÍÛîÿÍÛîÿÎÜîÿÎÜïÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÞïÿßçñÿôôóÿóóóÿóóòÿòòòÿòòñÿñññÿññðÿòòòÿÞÝÜÿ¥¤¢ÿœ›™ÿœ›™ÿ›š˜ÿš™—ÿš™—ÿ˜—•ÿ˜—•ÿ—–”ÿ–•“ÿ•”’ÿ”“‘ÿ”“‘ÿ“’ÿ’‘ÿ‘Žÿ‘ŽÿÿŽŒÿŽ‹ÿŽ‹ÿŒ‹ŠÿŒ‹‰ÿ‹Š‰ÿЉˆÿ‰ˆ‡ÿˆ‡†ÿˆ‡†ÿ‡†…ÿ‡…„ÿ†„ƒÿ…„ƒÿ…ƒ‚ÿ„‚ÿƒ€ÿ‚€ÿ€~ÿ€}ÿ€~}ÿ}|ÿ~}{ÿ}|zÿ}|zÿ|{yÿbLbëcÿeÿeÿgÿhÿiÿkÿlÿnÿoÿqÿqÿsÿuÿwÿxÿzÿ{ÿ}ÿÿ€ÿ‚ÿ„ÿ†ÿ‡ÿ‰ÿ‹ÿÿÿ‘ÿ“ÿ•ÿ—ÿ™ÿ›ÿÿŸÿ¡ÿ£ÿ¦ÿ¨ ÿª ÿ¬ ÿ® ÿ± ÿ³ ÿµ ÿ¸ ÿÜŠÿøùøÿøøøÿøøøÿùùøÿùùùÿùùùÿúúùÿúúúÿûúúÿóõøÿÔàðÿÌÛîÿÍÜîÿÎÜîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïüÐÞïèÐÞïåÐÞïäÐÞïçÐÞïöÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝïÿºÌçÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ¯Ããÿ¯Ããÿ¯Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ”¨Íÿ”¨Íÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉØìÿÉÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÞïÿâêòÿööõÿõõõÿõôôÿôôôÿôóóÿóóóÿóóòÿóóòÿÓÒÑÿ ŸÿŸžœÿž›ÿž›ÿœšÿœ›™ÿ›š˜ÿ›š˜ÿš™—ÿ™˜–ÿ˜—•ÿ—–”ÿ—–”ÿ–•“ÿ•”’ÿ”“‘ÿ“’ÿ’‘ÿ’‘ÿ‘ŽÿÿŽŒÿŽŒÿŽ‹ÿŒŠÿŒ‹Šÿ‹Š‰ÿ‹Š‰ÿЉˆÿ‰ˆ‡ÿˆ‡†ÿ‡†…ÿ‡…„ÿ†…„ÿ†„ƒÿ…ƒ‚ÿ„‚ÿƒ€ÿƒ€ÿ‚€ÿ~ÿ€~}ÿ€~}ÿ}|ÿdLeëfÿgÿhÿjÿkÿlÿnÿoÿqÿrÿtÿuÿwÿxÿzÿ{ÿ}ÿÿÿƒÿ„ÿ†ÿˆÿŠÿŒÿŽÿÿ’ÿ“ÿ–ÿ˜ÿšÿ›ÿžÿ ÿ¢ÿ¤ÿ¦ ÿ© ÿ« ÿ­ ÿ¯ ÿ± ÿ´ ÿ¶ ÿ¸ ÿ» ÿ¼ÿËA8ÿôæåÿùúùÿùùùÿúúùÿúúúÿúúúÿûûúÿûûúÿûûûÿûûûÿäëôÿÎÜîÿÏÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïøÐÞïÅÐÞïtÐÞïDÐÞï=ÐÞï=ÐÞïBÐÞï]ÐÞïxÐÞïžÐÞïÁÐÞïêÐÞïùÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿ¿Ñéÿ¬Àâÿ­Áâÿ­Ââÿ®Ããÿ®Ããÿ¯Äãÿ¯Äãÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿª½Üÿ„™Áÿ¯Âßÿ»Íèÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ½Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÄÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑÞïÿæìôÿøø÷ÿ÷÷÷ÿ÷ööÿöööÿöõõÿõõõÿõôôÿòòòÿÆÅÄÿ¢¡Ÿÿ¢¡Ÿÿ¡ žÿ¡ žÿ ŸÿŸžœÿž›ÿœšÿœ›™ÿ›š˜ÿ›š˜ÿš™—ÿ™˜–ÿ˜—•ÿ˜—•ÿ—–”ÿ–•“ÿ•”’ÿ•”’ÿ”“‘ÿ“’ÿ’‘ÿ‘ŽÿÿŽŒÿŽŒÿŽ‹ÿŒ‹ÿŒ‹ŠÿŒ‹Šÿ‹Š‰ÿЉˆÿ‰ˆ‡ÿ‰ˆ‡ÿˆ‡†ÿˆ†…ÿ‡…„ÿ†„ƒÿ…ƒ‚ÿ„‚ÿ„‚ÿƒ€ÿ‚€ÿ~ÿfLgëhÿjÿkÿlÿmÿoÿqÿrÿtÿuÿwÿxÿzÿ{ÿ~ÿÿÿ‚ÿ„ÿ†ÿˆÿŠÿŒÿŽÿÿ‘ÿ“ÿ•ÿ—ÿšÿ›ÿžÿ ÿ¢ÿ¤ÿ¦ ÿ¨ ÿª ÿ­ ÿ¯ ÿ± ÿ´ ÿ¶ ÿ¸ ÿ» ÿ½ ÿ¿ ÿÁ ÿÇÿ訣ÿúüüÿúúúÿúúúÿúúúÿûûúÿûûûÿûûûÿüûûÿüüüÿõ÷úÿÖâðÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïðÐÞïµÐÞïYÐÞïÐÞï ÐÞïÐÞï(ÐÞïTÐÞïŒÐÞï¾ÐÞïÝÐÞïùÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿÁÒéÿ­Áâÿ®Ââÿ¯Ããÿ¯Äãÿ°Äãÿ°Äãÿ±Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹Ìçÿ¶ÈäÿŒ Æÿ±Òÿ¼Îèÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔêÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛíÿÍÛîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïóÐÞïíÐÞïàÒßïÝìñöñùùøÿøøøÿø÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöõõÿðññÿ¸·¶ÿ¥¤¢ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¢¡Ÿÿ¡ žÿ ŸÿŸžœÿž›ÿœšÿœ›™ÿœ›™ÿ›š˜ÿš™—ÿ™˜–ÿ™˜–ÿ˜—•ÿ—–”ÿ–•“ÿ–•“ÿ•”’ÿ”“‘ÿ“’ÿ’‘ÿ‘ŽÿÿÿŽŒÿŽ‹ÿŒŠÿŒŠÿŒ‹‰ÿ‹Š‰ÿЉˆÿЉˆÿ‰ˆ‡ÿˆ‡†ÿ‡†…ÿ‡…„ÿ†„ƒÿ…ƒ‚ÿ…ƒ‚ÿ„‚ÿiLjëkÿmÿnÿoÿpÿrÿtÿuÿwÿxÿzÿ|ÿ~ÿÿÿƒÿ…ÿ†ÿˆÿŠÿŒÿÿÿ’ÿ”ÿ–ÿ˜ÿšÿœÿžÿ ÿ£ÿ¥ÿ§ ÿ© ÿ« ÿ­ ÿ¯ ÿ² ÿ´ ÿ¶ ÿ¹ ÿ» ÿ½ ÿÀ ÿ ÿÄ ÿÆ ÿÉ ÿÚYOÿøììÿûüûÿûûûÿûûûÿüûûÿüüüÿüüüÿüüüÿüüüÿüýüÿæíõÿÐÞïÿÐÞïÿÐÞïÿÐÞïûÐÞïÂÐÞï]ÐÞïÐÞï ÐÞï3ÐÞï_ÐÞï’ÐÞïÍÐÞïñÐÞïýÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿÂÓêÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»ÍçÿºÌçÿ–ªÎÿ£ÉÿºÍçÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞï÷ÐÞïìÐÞïÔÐÞïÁÐÞï®ÐÞï£ÐÞïŽÐÞï…ÐÞïnÐÞïeÐÞïRÐÞïJÐÞï7Õáð3÷ùú„ûûû÷úúúÿúùùÿùùùÿùøøÿøøøÿøøøÿêêêÿ²°®ÿ¨§¥ÿ¨§¥ÿ§¥£ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ ŸÿŸžœÿŸžœÿž›ÿœšÿœ›™ÿœ›™ÿš™—ÿš™—ÿ™˜–ÿ˜—•ÿ—–”ÿ—–”ÿ–•“ÿ•”’ÿ”“‘ÿ“’ÿ“’ÿ’‘ÿ‘ŽÿÿÿŽ‹ÿŽ‹ÿŒ‹ÿŒ‹Šÿ‹Š‰ÿЉˆÿЉˆÿ‰ˆ‡ÿˆ‡†ÿˆ†…ÿ‡†…ÿ‡…„ÿlLmënÿpÿpÿrÿtÿvÿxÿyÿ{ÿ|ÿ~ÿ€ÿ‚ÿƒÿ…ÿ‡ÿ‰ÿ‹ÿÿŽÿÿ“ÿ”ÿ—ÿ™ÿ›ÿÿŸÿ¡ÿ£ÿ¥ÿ¨ ÿª ÿ¬ ÿ® ÿ° ÿ³ ÿ´ ÿ· ÿ¹ ÿ¼ ÿ¾ ÿÀ ÿà ÿÅ ÿÇ ÿÊ ÿÌ ÿÏ ÿÔÿñÀ½ÿûýýÿûûûÿüüüÿüüüÿüüüÿüüüÿýýýÿýýýÿþþýÿöøûÿ×ãñÿÐÞïÿÔáññÓàðƒÐÞïÐÞïÐÞïÐÞï;ÐÞï}ÐÞï·ÐÞïÜÐÞïýÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿÂÓêÿ°Ääÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ´Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Êæÿ¹ËæÿºËçÿºÌçÿ»Íçÿ»Íçÿ¼Íçÿ¼Îèÿ¡´ÕÿˆÄÿ´Æáÿ¿Ñéÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÛíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïùÐÞïÐÐÞï—ÐÞï[ÐÞï+ÐÞïÐÞïÐÞïÐÞï ÐÞïÐÞïýýüüüüŠüûû÷ûûûÿûúúÿúúúÿùùùÿúúúÿÞÝÜÿ±¯¬ÿ¬ª¨ÿ«©§ÿª¨¦ÿª¨¦ÿ¨¦¤ÿ¨¦¤ÿ§¥£ÿ¦¤¢ÿ¤£¡ÿ£¢ ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ Ÿÿ ŸÿŸžœÿž›ÿœšÿœšÿ›š˜ÿ›š˜ÿš™—ÿ™˜–ÿ˜—•ÿ—–”ÿ—–”ÿ–•“ÿ•”’ÿ”“‘ÿ”“‘ÿ“’ÿ’‘ÿ‘Žÿ‘ŽÿŽŒÿŽŒÿŽŒÿŒ‹ÿŒ‹Šÿ‹Š‰ÿ‹Š‰ÿЉˆÿ‰ˆ‡ÿˆ‡†ÿoLpëqÿsÿtÿvÿwÿyÿ{ÿ}ÿÿÿ‚ÿ„ÿ†ÿ‡ÿ‰ÿ‹ÿÿŽÿÿ’ÿ”ÿ—ÿ˜ÿ›ÿÿŸÿ¡ÿ£ÿ¥ÿ¨ ÿ© ÿ¬ ÿ® ÿ° ÿ³ ÿµ ÿ· ÿ¹ ÿ¼ ÿ¾ ÿÀ ÿà ÿÅ ÿÈ ÿÊ ÿÌ ÿÏ ÿÑÿÔÿ× ÿçqhÿüúùÿüüüÿýýýÿýýýÿýýýÿýýýÿþþýÿþþþÿþþþÿþþþÿèî÷ÿßèôÿô÷ûìþþÿGÐÞï ÐÞï2ÐÞïgÐÞï¢ÐÞïÞÐÞï÷ÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿÄÔêÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëæÿ¹ËçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ½Îçÿ›¯Ðÿ®ÁÞÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿËÚíÿÌÛíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïñÐÞï´ÐÞïbÐÞï$üüüüüü‹ýýý÷üüüÿüüüÿûûûÿûûûÿÒÑÏÿ®¬ªÿ®¬ªÿ®¬ªÿ­«©ÿ¬ª¨ÿ«©§ÿ«©§ÿª¨¦ÿ©§¥ÿ¨¦¤ÿ§¥£ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ¡ žÿ ŸÿŸžœÿž›ÿž›ÿœšÿœ›™ÿ›š˜ÿš™—ÿš™—ÿ™˜–ÿ˜—•ÿ—–”ÿ–•“ÿ•”’ÿ•”’ÿ”“‘ÿ“’ÿ’‘ÿ’‘ÿ‘ŽÿÿŽŒÿŽ‹ÿŽ‹ÿŒŠÿŒ‹Šÿ‹Š‰ÿsLtëuÿwÿxÿzÿ{ÿ}ÿÿ€ÿ‚ÿ„ÿ†ÿ‡ÿ‰ÿ‹ÿÿÿ‘ÿ“ÿ•ÿ—ÿ™ÿ›ÿÿŸÿ¡ÿ£ÿ¦ÿ¨ ÿª ÿ­ ÿ¯ ÿ± ÿ³ ÿµ ÿ¸ ÿº ÿ¼ ÿ¾ ÿÁ ÿà ÿÆ ÿÈ ÿË ÿÍ ÿÐ ÿÒ ÿÔÿ×ÿÚÿÜ ÿã1$ÿ÷ÑÎÿýÿÿÿýýýÿýýýÿþþýÿþþýÿþþþÿþþþÿþþþÿÿÿÿÿýýþÿüýþÿÿÿÿÛÿÿÿGÐÞï ÐÞï"ÐÞïaÐÞïŸÐÞïÎÐÞï÷ÐÞïÿÐÞïÿÐÞïÿÉØìÿ·Éæÿ´ÇåÿµÈåÿ¶Éåÿ¶Éåÿ·Êæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿Ðéÿ¾ÏçÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïïÐÞï§ÐÞïLÐÞïþþþ þþþ‰ýýý÷ýýýÿýýýÿøøøÿÉÈÆÿ±¯­ÿ²°®ÿ±¯­ÿ°®¬ÿ°®¬ÿ¯­«ÿ®¬ªÿ¬ª¨ÿ¬ª¨ÿ«©§ÿª¨¦ÿ©¨¦ÿ¨§¥ÿ¨¦¤ÿ§¥£ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ£¢ ÿ¢¡Ÿÿ¡ žÿŸžœÿŸžœÿž›ÿœšÿœšÿœ›™ÿ›š˜ÿš™—ÿš™—ÿ™˜–ÿ˜—•ÿ—–”ÿ—–”ÿ–•“ÿ”“‘ÿ“’ÿ’‘ÿ’‘ÿ‘Žÿ‘ŽÿÿŽŒÿŽ‹ÿvLwëxÿzÿ{ÿ}ÿÿÿƒÿ„ÿ†ÿˆÿŠÿ‹ÿÿÿ‘ÿ“ÿ•ÿ—ÿ™ÿ›ÿÿŸÿ¡ÿ¤ÿ¦ ÿ¨ ÿª ÿ¬ ÿ® ÿ± ÿ³ ÿµ ÿ· ÿº ÿ¼ ÿ¾ ÿÁ ÿà ÿÆ ÿÈ ÿÊ ÿÍ ÿÏ ÿÒÿÕÿ×ÿÚÿÜÿßÿáÿäÿòŒ„ÿþüûÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿÿ¢ÿÿÿ5ÿÿÿÐÞïÐÞï$ÐÞïRÐÞï–ÐÞï×ÐÞïõÏÝïÿÂÓêÿ·Êæÿ·Êæÿ·Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ½Ïèÿ¾Ðèÿ¾Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÄÕëÿÅÕëÿÅÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïñÐÞï³ÐÞïQÐÞï þþþþþþŠÿÿÿöÿÿÿÿòòñÿÁ¿½ÿµ³±ÿ´²°ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ±¯­ÿ°®¬ÿ¯­«ÿ®¬ªÿ­«©ÿ¬ª¨ÿ«©§ÿ«©§ÿª¨¦ÿ©§¥ÿ¨¦¤ÿ§¦¤ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ ŸÿŸžœÿž›ÿž›ÿœšÿœ›™ÿ›š˜ÿ›š˜ÿš™—ÿ™˜–ÿ˜—•ÿ˜—•ÿ—–”ÿ–•“ÿ•”’ÿ”“‘ÿ“’ÿ’‘ÿ’‘ÿ‘ŽÿzLzë|ÿ~ÿÿÿ‚ÿ„ÿ‡ÿˆÿŠÿŒÿŽÿÿ’ÿ“ÿ•ÿ˜ÿšÿ›ÿžÿ ÿ¢ÿ¤ÿ¦ÿ¨ ÿ« ÿ­ ÿ¯ ÿ± ÿ³ ÿ¶ ÿ¸ ÿ» ÿ¼ ÿ¿ ÿ ÿÄ ÿÆ ÿÈ ÿË ÿÎ ÿÐ ÿÓ ÿÕÿØÿÚÿÝÿßÿâÿåÿçÿéÿï=0ÿüäãÿþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÿÿÿbÿÿÿ ÐÞïÐÞïÐÞï^ÐÞï¡ÎÝî×ÄÔêûºÍçÿ¹Ëçÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒêÿÁÒêÿÂÓêÿÂÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÎÜîÿÎÜîÿÏÝîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïøÐÞï¾ÐÞïUÐÞïÿÿÿ ÿÿÿ‰ÿÿÿöëëêÿ»¹¸ÿ¸¶´ÿ·µ³ÿ·µ³ÿµ³±ÿµ³±ÿ´²°ÿ³±¯ÿ²°®ÿ²°®ÿ±¯­ÿ°®¬ÿ¯­«ÿ®¬ªÿ®¬ªÿ­«©ÿ¬ª¨ÿ«©§ÿ«©§ÿ©§¥ÿ©§¥ÿ§¦¤ÿ§¥£ÿ¥¤¢ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ¡ žÿ ŸÿŸžœÿž›ÿž›ÿœ›™ÿœ›™ÿ›š˜ÿš™—ÿ™˜–ÿ˜—•ÿ˜—•ÿ—–”ÿ–•“ÿ•”’ÿ•”’ÿ”“‘ÿ}L~ëÿÿ‚ÿ…ÿ†ÿˆÿ‹ÿŒÿŽÿÿ’ÿ”ÿ–ÿ˜ÿšÿœÿžÿ ÿ£ÿ¥ÿ§ ÿ© ÿ« ÿ® ÿ¯ ÿ² ÿ´ ÿ¶ ÿ¹ ÿ» ÿ½ ÿÀ ÿ ÿÄ ÿÇ ÿÉ ÿÌ ÿÎ ÿÐÿÓÿÕÿØÿÚÿÝÿàÿâÿåÿçÿêÿíÿïÿòÿû¥žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿ—ÿÿÿ*ÿÿÿÐÞïÐÞï*ÍÛíeÃÓêÚ½Ïèÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÉÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïõÐÞïÆÐÞïbÐÞïÿÿÿþþþˆßßÞô»º¸ÿ»¹¸ÿº¸¶ÿ¹·¶ÿ¸¶´ÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿµ³±ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ°®¬ÿ¯­«ÿ¯­«ÿ®¬ªÿ­«©ÿ¬ª¨ÿ¬ª¨ÿ«©§ÿª¨¦ÿ¨§¥ÿ¨§¥ÿ§¦¤ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¢¡Ÿÿ¡ žÿ ŸÿŸžœÿŸžœÿž›ÿœšÿœ›™ÿ›š˜ÿ›š˜ÿš™—ÿ™˜–ÿ˜—•ÿ—–”ÿ–•“ÿL‚ëƒÿ…ÿ†ÿ‰ÿŠÿŒÿÿÿ’ÿ”ÿ–ÿ˜ÿšÿœÿžÿ ÿ£ÿ¤ÿ§ÿ© ÿ« ÿ® ÿ° ÿ² ÿ´ ÿ¶ ÿ¹ ÿ» ÿ½ ÿÀ ÿ ÿÅ ÿÇ ÿÊ ÿÌ ÿÏ ÿÑ ÿÓÿÖÿÙÿÛÿÞÿàÿãÿæÿèÿëÿíÿðÿóÿöÿøÿüXJÿÿñïÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÊÿÿÿVÿÿÿ ¾ÏèG½ÏèÓ½Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÄÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÈ×ìÿÈ×ìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛîÿÍÛîÿÎÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïýÐÞïáÐÞï­ÐÞïaÐÞïýýü ÖÔÓa¿½»§¾¼ºí½»¹ÿ¼»¹ÿ»¹¸ÿº¹·ÿ¹·¶ÿ¹·µÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿµ³±ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ°®¬ÿ°®¬ÿ¯­«ÿ®¬ªÿ­«©ÿ­«©ÿ¬ª¨ÿ«©§ÿª¨¦ÿ©§¥ÿ¨§¥ÿ§¦¤ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ Ÿÿ ŸÿŸžœÿž›ÿœšÿœ›™ÿœ›™ÿ›š˜ÿš™—ÿ™˜–ÿ„L†ë‡ÿ‰ÿ‹ÿÿÿ‘ÿ“ÿ”ÿ—ÿ™ÿ›ÿÿŸÿ¡ÿ£ÿ¥ÿ§ ÿ© ÿ¬ ÿ® ÿ° ÿ³ ÿµ ÿ· ÿ¹ ÿ» ÿ¾ ÿÀ ÿà ÿÅ ÿÈ ÿÊ ÿÍ ÿÏ ÿÒÿÔÿ×ÿÙÿÛÿÞÿàÿäÿæÿéÿìÿîÿñÿóÿöÿùÿûÿýÿÿ%ÿÿº´ÿÿÿÿÿÿÿÿëÿÿÿŠÿÿÿ$¼Ðé¾Ïè7¿ÐéÀ¿ÐéýÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÓêÿÃÔêÿÄÔêÿÅÕëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉØìÿÊÙíÿÊÙíÿËÙíÿËÚíÿÌÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïûÐÞïçÐÞïËÐÞï˜ÐÞï_ÐÞï/ÐÞïÀ¾¼ ¿½»A¿½»—¿¾¼Þ¾½»ý¾¼ºÿ¼»¹ÿ»º¸ÿº¹·ÿº¸¶ÿ¹·µÿ¸¶´ÿ·µ³ÿ¶´²ÿ¶´²ÿµ³±ÿ´²°ÿ³±¯ÿ³±¯ÿ²°®ÿ±¯­ÿ°®¬ÿ¯­«ÿ®¬ªÿ®¬ªÿ­«©ÿ¬ª¨ÿ«©§ÿª¨¦ÿª¨¦ÿ¨§¥ÿ¨¦¤ÿ¦¥£ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ Ÿÿ ŸÿŸžœÿž›ÿœšÿœšÿœ›™ÿˆLŠë‹ÿÿÿ‘ÿ’ÿ”ÿ—ÿ˜ÿ›ÿœÿŸÿ¡ÿ£ÿ¥ÿ§ ÿ© ÿ¬ ÿ® ÿ° ÿ² ÿµ ÿ· ÿ¹ ÿ» ÿ¾ ÿÀ ÿà ÿÅ ÿÈ ÿÊ ÿÍ ÿÏ ÿÑ ÿÔÿ×ÿÙÿÜÿÞÿáÿäÿæÿéÿëÿîÿñÿôÿöÿùÿûÿýÿþÿÿÿÿÿÿmaýÿõô¿ÿÿÿPÿÿÿÀÑé ÁÑéÁÒéçÂÓêÿÃÓêÿÄÔêÿÄÔëÿÄÕêÿÄÔëÿÅÕëÿÅÕëÿÇÖìÿÇÖëÿÇ×ìÿÈ×ìÿÈ×ìÿÉØíÿÉØìÿËÙíÿÊÙíÿËÚíÿËÛíÿÌÚíÿÌÛíÿÍÛîÿÍÜîÿÏÝïÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïýÐÞïñÐÞïÉÐÞï›ÐÞïmÐÞï>ÐÞïÐÞïÂÀ¾Á¿½.À¾¼‚À¾¼ÓÀ¾¼ü¿½»ÿ½¼ºÿ½»¹ÿ¼º¸ÿ»¹·ÿº¸·ÿ¹·µÿ¸·µÿ·µ³ÿ·µ³ÿ¶´²ÿµ³±ÿ´²°ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ°®¬ÿ¯­«ÿ®¬ªÿ®¬ªÿ­«©ÿ¬ª¨ÿ«©§ÿ«©§ÿª¨¦ÿ©§¥ÿ§¦¤ÿ§¦¤ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ¡ žÿ ŸÿŸžœÿž›ÿŒLŽëÿ‘ÿ“ÿ•ÿ—ÿ™ÿ›ÿÿŸÿ¡ÿ£ÿ¦ÿ¨ ÿª ÿ­ ÿ® ÿ± ÿ³ ÿµ ÿ¸ ÿº ÿ¼ ÿ¾ ÿÁ ÿà ÿÅ ÿÈ ÿË ÿÍ ÿÐ ÿÒÿÕÿ×ÿÙÿÜÿßÿáÿäÿæÿéÿìÿïÿñÿôÿ÷ÿùÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿ òÿ[NGÃÓë ÂÓê9ÄÔê‡ÄÔë¿ÅÕëÙÅÕëìÆÖëûÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿËÚíÿÌÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïþÐÞïâÐÞï»ÐÞïuÐÞï;ÐÞïÐÞïÆÄÂÁ¿½$ÂÀ¾qÂÀ¾ÃÁ¿½óÀ¾¼ÿ¿½»ÿ¾¼ºÿ½¼ºÿ¼º¹ÿ»º¸ÿº¸·ÿº¸¶ÿ¸¶µÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿµ³±ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ±¯­ÿ°®¬ÿ¯­«ÿ®¬ªÿ®¬ªÿ¬ª¨ÿ¬ª¨ÿ«©§ÿª¨¦ÿ©§¥ÿ©§¥ÿ§¦¤ÿ¦¥£ÿ¥¤¢ÿ¤£¡ÿ¤£¡ÿ£¢ ÿ¢¡Ÿÿ¡ žÿ‘L’ë“ÿ–ÿ˜ÿšÿœÿžÿ ÿ¢ÿ¤ÿ¦ ÿ© ÿ« ÿ­ ÿ¯ ÿ² ÿ´ ÿ¶ ÿ¸ ÿ» ÿ½ ÿ¿ ÿ ÿÄ ÿÆ ÿÉ ÿË ÿÎ ÿÐÿÓÿÕÿØÿÚÿÝÿßÿâÿäÿçÿéÿìÿïÿñÿõÿ÷ÿúÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ‚ÉÙêÆÖë ÆÖë)ÆÖëJÇÖìeÇ×ì|È×ì‘ÉØì§ÉØì»ÉÙíÓÊÙíàÌÛíôÌÛîöÍÛîøÍÜîûÎÜîþÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïûÐÞïÉÐÞïzÐÞï8ÐÞï ÃÁ¿ÂÀ¾]ÂÀ¾³ÂÀ¾òÁ¿½ÿÀ¾¼ÿ¿½»ÿ¿½»ÿ½¼ºÿ½»¹ÿ»º¸ÿ»¹¸ÿº¸¶ÿ¹·¶ÿ¸¶´ÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿ´²°ÿ³±¯ÿ²°®ÿ²°®ÿ±¯­ÿ°®¬ÿ¯­«ÿ¯­«ÿ®¬ªÿ­«©ÿ¬ª¨ÿ¬ª¨ÿ«©§ÿ©¨¦ÿ©§¥ÿ¨¦¤ÿ§¥£ÿ¥¤¢ÿ¥¤¢ÿ¤£¡ÿ”L–ë—ÿšÿ›ÿžÿ ÿ¢ÿ¤ÿ¦ ÿ¨ ÿª ÿ­ ÿ¯ ÿ± ÿ´ ÿ¶ ÿ¸ ÿ» ÿ½ ÿ¿ ÿÁ ÿÄ ÿÇ ÿÉ ÿÌ ÿÎ ÿÐ ÿÓÿÕÿØÿÛÿÝÿàÿâÿåÿèÿêÿíÿïÿòÿõÿ÷ÿúÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿØÿkÿÊÙìËÙí ÊÙíÊÙíËÚí#ÌÛí*ÌÛî=ÎÛîPÎÜîlÏÝïƒÏÝï¢ÐÞï¿ÐÞïÕÐÞïñÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïúÐÞïÉÐÞïjÐÞïÃÁ¿ÄÂÀDÄÂÀ¢ÃÁ¿áÂÀ¾ÿÁ¿½ÿÀ¾¼ÿÀ¾¼ÿ¿½»ÿ¾¼ºÿ¼»¹ÿ¼»¹ÿ»¹¸ÿº¸·ÿ¹·¶ÿ¹·µÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿ´²°ÿ³±¯ÿ³±¯ÿ²°®ÿ±¯­ÿ°®¬ÿ°®¬ÿ¯­«ÿ®¬ªÿ­«©ÿ¬ª¨ÿ¬ª¨ÿª¨¦ÿª¨¦ÿ©§¥ÿ¨¦¤ÿ§¥£ÿ™Lšëœÿžÿ ÿ£ÿ¥ÿ§ ÿ© ÿ« ÿ­ ÿ¯ ÿ² ÿ´ ÿ¶ ÿ¹ ÿ» ÿ½ ÿÀ ÿ ÿÄ ÿÆ ÿÊ ÿÌ ÿÎ ÿÑÿÓÿÕÿØÿÛÿÞÿàÿãÿåÿèÿêÿíÿðÿóÿõÿøÿúÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿƒÿ-ÿÔâôÐÞïÐÞï'ÐÞïOÐÞï‚ÐÞïÂÐÞïóÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïþÐÞïÕÐÞïwÐÞïÆÄÂÄÂÀ:ÄÂÀ‰ÄÂÀÜÃÁ¿üÃÁ¿ÿÂÀ¾ÿÁ¿½ÿÀ¾¼ÿ¿½»ÿ¾¼ºÿ¾¼ºÿ¼»¹ÿ»º¸ÿº¹·ÿ¹·¶ÿ¹·µÿ¸¶´ÿ·µ³ÿ¶´²ÿ¶´²ÿµ³±ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ±¯­ÿ°®¬ÿ¯­«ÿ®¬ªÿ­«©ÿ­«©ÿ¬ª¨ÿ«©§ÿª¨¦ÿžLŸë¡ÿ£ÿ¥ÿ¨ ÿª ÿ¬ ÿ® ÿ° ÿ³ ÿ´ ÿ· ÿ¹ ÿ¼ ÿ¾ ÿÀ ÿà ÿÅ ÿÇ ÿÊ ÿÌ ÿÏ ÿÑÿÔÿÖÿÙÿÛÿÞÿàÿãÿæÿéÿëÿíÿðÿóÿöÿøÿûÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿ“ÿ2ÿÐÞïÐÞïÐÞïCÐÞï‘ÐÞïÊÐÞïõÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÜÐÞïˆÐÞï(ÐÞïÆÄÂÅÃÁ*ÅÃÁ{ÅÃÁÉÄÂÀ÷ÄÂÀÿÃÁ¿ÿÂÀ¾ÿÁ¿½ÿÁ¿½ÿ¿¾¼ÿ¿½»ÿ¾¼ºÿ¼»¹ÿ¼º¸ÿº¹·ÿº¸·ÿ¹·µÿ¸¶µÿ·µ³ÿ·µ³ÿ¶´²ÿµ³±ÿ´²°ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ°®¬ÿ°®¬ÿ®¬ªÿ®¬ªÿ­«©ÿ¢L£ë¥ÿ¨ ÿ© ÿ¬ ÿ® ÿ° ÿ³ ÿµ ÿ· ÿ¹ ÿ¼ ÿ¾ ÿÀ ÿà ÿÆ ÿÈ ÿÊ ÿÌ ÿÏ ÿÒÿÔÿ×ÿÙÿÜÿÞÿàÿäÿæÿéÿìÿîÿñÿóÿöÿùÿûÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿ¡ÿ>ÿÐÞïÐÞïVÐÞïžÐÞïÞÐÞï÷ÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïûÐÞïßÐÞï‰ÐÞï2ÐÞïÅÃÁÅÃÁbÅÃÁ¾ÅÃÁòÅÃÁÿÄÂÀÿÃÁ¿ÿÂÀ¾ÿÂÀ¾ÿÁ¿½ÿ¿¾¼ÿ¿½»ÿ¾¼ºÿ½»ºÿ¼º¸ÿ»º¸ÿº¸·ÿ¹¸¶ÿ¸¶µÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿ´²°ÿ´²°ÿ³±¯ÿ²°®ÿ±¯­ÿ±¯­ÿ¯­«ÿ§ L¨ ëª ÿ­ ÿ¯ ÿ± ÿ³ ÿµ ÿ¸ ÿº ÿ¼ ÿ¾ ÿÁ ÿà ÿÆ ÿÈ ÿË ÿÍ ÿÐ ÿÒ ÿÔÿ×ÿÚÿÜÿßÿáÿäÿæÿéÿìÿïÿñÿôÿ÷ÿùÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ¬ÿAÿ ÐÞï ÐÞï"ÐÞïaÐÞï¡ÐÞïÏÐÞïôÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïìÐÞï½ÐÞïuÐÞï)ÐÞïÅÃÁÅÃÁRÅÃÁ¦ÅÃÁëÅÃÁÿÄÂÀÿÄÂÀÿÄÂÀÿÃÁ¿ÿÂÀ¾ÿÁ¿½ÿÁ¿½ÿ¿¾¼ÿ¿½»ÿ¾¼ºÿ½»ºÿ¼º¹ÿ»¹¸ÿº¸·ÿº¸¶ÿ¹·µÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿ´²°ÿ´²°ÿ³±¯ÿ« L¬ ë® ÿ± ÿ³ ÿµ ÿ· ÿº ÿ¼ ÿ¾ ÿÁ ÿà ÿÆ ÿÉ ÿË ÿÎ ÿÐ ÿÓÿÕÿØÿÚÿÜÿßÿáÿäÿæÿêÿìÿïÿòÿôÿ÷ÿùÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿ¶ÿPÿÐÞïÐÞï%ÐÞïGÐÞïlÐÞïŽÐÞï™ÐÞï™ÐÞïŽÐÞïiÐÞïAÐÞïÅÃÁ ÅÃÁBÅÃÁ”ÅÃÁáÅÃÁýÅÃÁÿÅÃÁÿÄÂÀÿÃÁ¿ÿÄÂÀÿÂÀ¾ÿÂÀ¾ÿÁ¿½ÿÀ¾¼ÿ¿½»ÿ¾½»ÿ½¼ºÿ¼»¹ÿ»º¸ÿº¹·ÿº¸¶ÿ¸·µÿ¸¶´ÿ·µ³ÿ¶´²ÿµ³±ÿ° L± ë³ ÿ¶ ÿ¸ ÿ» ÿ½ ÿ¿ ÿ ÿÄ ÿÆ ÿÈ ÿË ÿÎ ÿÐ ÿÓ ÿÕÿØÿÚÿÝÿßÿâÿåÿçÿéÿìÿïÿñÿõÿ÷ÿúÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿ¼ÿ^ÿÐÞïÐÞïÐÞïÐÞïÅÃÁÅÃÁ/ÅÃÁ„ÅÃÁÎÅÃÁüÅÃÁÿÅÃÁÿÅÃÁÿÄÂÀÿÄÂÀÿÃÁ¿ÿÃÁ¿ÿÂÀ¾ÿÁ¿½ÿÀ¾¼ÿÀ¾¼ÿ¿½»ÿ¾¼ºÿ½»¹ÿ»º¸ÿ»¹¸ÿº¸¶ÿ¹·µÿ¸¶´ÿ¶ L· ë¹ ÿ» ÿ½ ÿÀ ÿ ÿÄ ÿÇ ÿÉ ÿÌ ÿÎ ÿÐÿÓÿÖÿØÿÛÿÝÿàÿâÿåÿèÿêÿíÿïÿóÿôÿ÷ÿúÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÌÿiÿÅÃÁÅÃÁ%ÅÃÁmÅÃÁÅÅÃÁóÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÄÂÀÿÄÂÀÿÃÁ¿ÿÃÁ¿ÿÂÀ¾ÿÁ¿½ÿÀ¾¼ÿ¾½»ÿ¾½»ÿ½»¹ÿ¼º¹ÿ»¹¸ÿº L» ë½ ÿÀ ÿ ÿÅ ÿÇ ÿÊ ÿÌ ÿÏ ÿÑ ÿÓÿÖÿÙÿÛÿÞÿáÿãÿæÿèÿëÿîÿðÿóÿöÿøÿûÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÔÿsÿÅÃÁÅÃÁ[ÅÃÁ°ÅÃÁðÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÄÂÀÿÄÂÀÿÃÁ¿ÿÃÁ¿ÿÂÀ¾ÿÁ¿½ÿÀ¾¼ÿÀ¾¼ÿ¾¼ºÿ¿ LÁ ëà ÿÅ ÿÈ ÿÊ ÿÍ ÿÏ ÿÒÿÔÿ×ÿÙÿÛÿÞÿàÿäÿæÿéÿìÿîÿñÿóÿöÿùÿûÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙÿ|ÿ(ÿÅÃÁÅÃÁEÅÃÁ¤ÅÃÁäÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÄÂÀÿÄÂÀÿÃÁ¿ÿÂÀ¾ÿÁ¿½ÿÅ LÆ ëÈ ÿÊ ÿÍ ÿÏ ÿÒ ÿÔÿ×ÿÙÿÜÿÞÿáÿäÿæÿéÿìÿîÿñÿôÿ÷ÿùÿûÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿ‹ÿ0ÿÅÃÁÅÃÁ8ÅÃÁŠÅÃÁÛÅÃÁþÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÄÂÀÿÃÁ¿ÿÊ HË èÍ ÿÐ ÿÒÿÕÿ×ÿÙÿÜÿßÿáÿäÿæÿéÿìÿïÿòÿôÿ÷ÿùÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÿ™ÿ5ÿÅÃÁÅÃÁ*ÅÃÁyÅÃÁÌÅÃÁöÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÏ 5ÐÙÓÿÕÿØÿÚÿÝÿßÿâÿäÿçÿéÿìÿïÿòÿõÿøÿúÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿ£ÿ>ÿÅÃÁÅÃÁeÅÃÁºÅÃÁôÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÕ2ÖÖØÿÛÿÝÿàÿâÿåÿèÿêÿíÿïÿòÿõÿøÿúÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿ®ÿIÿ ÅÃÁÅÃÁRÅÃÁ©ÅÃÁçÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÚ2ÛÖÞÿàÿãÿåÿèÿêÿíÿðÿóÿõÿøÿúÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿ¸ÿYÿÅÃÁ ÅÃÁBÅÃÁ•ÅÃÁãÅÃÁýÅÃÁÿà2áÖãÿæÿéÿëÿíÿðÿóÿöÿøÿûÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÅÿbÿÅÃÁÅÃÁ+ÅÃÁ†ÅÃÁÌå2æÖéÿìÿîÿñÿóÿöÿùÿûÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÐÿiÿÅÃÁÅÃÁ ë2ìÖïÿñÿôÿ÷ÿùÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÿvÿ!ñ2òÖôÿ÷ÿùÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿ†ÿ)ö2øÖúÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿ“ÿ/ÿü2ýÖþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿ™ÿ8ÿÿ2ÿÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ¦ÿDÿÿ2ÿÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿ³ÿQÿ ÿ2ÿÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÀÿYÿÿ2ÿÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿËÿbÿÿ2ÿÖÿÿÿÿÿÿÿÿÿÿÿýÿÍÿpÿÿ2ÿÖÿÿÿÿÿÿÿþÿÖÿÿ#ÿ2ÿÖÿÿÿþÿâÿŒÿ)ÿÿ2ÿÖÿçÿ’ÿ2ÿÿ+ÿˆÿJÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏø ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿàøÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿ8ÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿü?ÿÿÿÿÿÿþÿÿÿÿÿÿÿÿüÿÿÿÿÿÿþÿÿÿÿÿÿÿÿüÿÿÿÿÿÿüÿÿÿÿÿÿÿÿøÿÿÿÿÿøÿÿÿÿÿÿÿÿøÿÿÿÿÿøÿÿÿÿÿÿÿÿøÿÿÿÿÿðÿÿÿÿÿÿÿÿøÿÿÿÿÿàÿÿÿÿÿÿÿÿüÿÿÿÿÿàÿÿÿÿÿÿþüÿÿÿÿÀÿÿÿÿÿÿøüÿÿÿÿ€ÿÿÿÿÿÿà~?ÿÿÿÿ€ÿÿÿÿÿÿÀ>?ÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþ€ÿÿÿþÿÿÿÿüÀÿÿÿüÿÿÿÿü€ÿÿÿø?ÿÿÿÿøÿÿÿø?ÿÿÿÿø ÿÿÿð?ÿÿÿÿðÿÿÿðÿÿÿÿðÿÿàÿÿÿÿð?ÿÿàÿÿÿÿðÿÿÀÿÿÿÿðÿÿÀÿÿÿÿðÿÿ€ÿÿÿÿðÿÿ€ÿÿÿÿðÿÿÿÿÿÿðÿÿÿÿÿÿðÿþÿÿÿÿøÿþ?ÿÿÿøÿþÿÿÿøÿàÿÿÿøøÿÿÿüàÿÿÿø@ÿÿà€?ÿÿÀ€ÿÿ€ÿþ€ÿø€ÿð€ÿÀ€ÿ€€þ€ü€ð€`€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€þ€ÿà€ÿþÀ€ÿÿàÿà€?ÿÿüÿð€?ÿÿÿ€ÿÿø€ÿÿÿðÿÿü€ÿÿÿÿþÿÿþ€ÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿàÿÿÿÿÀ€ÿÿÿÿÿðÿÿÿÿð€ÿÿÿÿÿøÿÿÿÿÿü€ÿÿÿÿÿÿþÿÿÿÿÿÿ€€ÿÿÿÿÿÿøÿÿÿÿÿÿà€ÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿø€ÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÀ€ÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿð€ÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿü€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(€ q‘Ìq‘Ì5q‘Ìq‘Ì¿q‘Ìëq‘Ìþq‘Ìòq‘̹q‘ÌAq‘Ìq‘Ì9q‘ÌŸq‘Ìäq‘Ìýq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘ÌÚq‘Ì:q‘Ìq‘Ì>q‘ÌVq‘Ì@q‘Ìq‘Ìq‘Ìbq‘Ìæq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘̾q‘Ì3q‘ÌWq‘Ìuq‘Ì{q‘Ìvq‘Ì_q‘Ì-q‘Ìq‘Ìq‘Ìwq‘ÌÊq‘Ìòq‘Ìûq‘Ìòq‘ÌÊq‘Ìhq‘Ì*q‘ÌÕq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìüq‘Ìæq‘Ìûq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìþq‘Ìäq‘Ì…q‘Ìq‘Ìq‘ÌQq‘ÌËq‘Ìþq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìùq‘ÌÄq‘Ìðq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿs“Íÿt”Íÿr’Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìýq‘Ì£q‘Ìq‘Ìq‘Ìuq‘Ìíq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿt“Íÿv•Íÿw–Îÿy—Ïÿ{™Ïÿw–Îÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìüq‘Ì…q‘Ìq‘Ìq‘Ì`q‘Ìôq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿs“Íÿt”Íÿv•Îÿx—Îÿz˜Ïÿ|šÐÿ~›ÐÿÑÿ‚žÒÿ€Òÿs“Íÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìíq‘ÌBq‘Ìq‘Ì q‘ÌOq‘Ìoq‘Ì\q‘Ì#q‘Ìq‘Ì­q‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿw•Îÿy—Ïÿz™Ïÿ}›ÐÿœÑÿ€Ñÿ‚ŸÒÿ„ Óÿ…¢Óÿ‡£Ôÿ‰¤Õÿx—Ïÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr’ÌÿqÊÅs’Ët“Í•u”Í~v•ÎLw–Î {q‘Ìq‘ÌAq‘Ì™q‘ÌÛq‘Ìùq‘Ìÿq‘Ìüq‘ÌÙq‘Ìlq‘Ìq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿs“Íÿv•Îÿ{™ÐÿœÑÿ…¡Óÿ‹¦ÕÿŠ¥Õÿ‰¤Ôÿ‰¤ÕÿŠ¥Õÿ‹§Öÿ¨Öÿª×ÿ€Ñÿq‘Ìÿq‘Ìÿq‘Ìÿr’Ìÿs’Íÿs“Íÿt“Íÿn‹Âÿt“Ëÿv•Îÿw–Îÿw–Îõx—Ϲy˜Ï5‚øq‘Ìq‘Ì™q‘Ìïq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìõq‘ÌÒq‘Ìüq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿs“Íÿu•Íÿx—Îÿ|šÐÿœÑÿ„¡Óÿ“­Ùÿ™±Úÿ—°Úÿ•®Ùÿ”­Øÿ’¬Øÿ’¬Øÿ”­Ùÿ–¯Ùÿ†¢Óÿq’Ìÿr’Íÿs“Íÿt”Íÿu”Íÿv•ÎÿrÇÿqŽÄÿw–Îÿx—Ïÿy—Ïÿy˜Ïÿz˜Ïÿ{™ÐÍ|šÐ+dóÿ[q‘Ìq‘̹q‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿs“Íÿw–Îÿz˜Ïÿ|šÐÿ~œÑÿ‚žÒÿ…¡Óÿ‰¥ÕÿµÜÿ¥»ßÿ£ºÞÿ¢¸Ýÿ ·ÝÿŸ¶Üÿ›³Ûÿš²Ûÿ´Üÿˆ¤Ôÿs“Íÿu”Îÿu•Îÿv•Îÿw–ÎÿsÇÿpŒÂÿx–Íÿz˜Ïÿz™Ïÿ{™Ðÿ|šÐÿ|šÐÿ}›Ðÿ~›Ñ·~œÑ=äÿÿ[u[ q‘Ìq‘Ì‹q‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq’Ìÿs“Íÿv•Îÿv•Îÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿs“Íÿx—Ïÿˆ¤Ôÿ©×ÿ¨Öÿ‰¤Ôÿ…¡Óÿ‡£Ôÿ‹¥ÕÿލÖÿ£¹Þÿ²Åäÿ°Äãÿ®Ãâÿ­Áâÿ¬Àáÿ©¾àÿ¢¹Þÿ¢¸Þÿ†¢Ôÿv•Îÿw–Îÿx—Ïÿw•ÌÿrŽÄÿrŽÄÿy—Îÿ{™Ðÿ|šÐÿ}šÐÿ}›Ðÿ~›Ñÿ~œÑÿœÑÿ€Ñý€žÒ”žÒÃÿÿÿ[¼[Cq‘Ì!q‘ÌÜq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr‘Ìÿs“Íÿu•Îÿx—Îÿ{™Ðÿ}›Ñÿv•Îÿq‘Ìÿr‘Ìÿs“Íÿv•Îÿy˜Ïÿ“¬Øÿ¤ºßÿ ¸Ýÿ´Üÿ™²Ûÿ“­ØÿލÖÿª×ÿ’¬Øÿ£¹Þÿ¼Îçÿ¼Îçÿ»Íçÿ¹Ëæÿ¸Êæÿ²Åäÿ©¾àÿ¢¹ÞÿÑÿx—Ïÿy—Îÿu’ÈÿqÃÿv“Éÿ|™Ðÿ}šÐÿ}›Ðÿ~›Ñÿ~œÑÿœÑÿ€Ñÿ€ÒÿžÒÿ‚ŸÒÿ‚ŸÒõ„ Óe†¢Ô†¡ÔŽþÿÿÿ[Ñ[›[q‘ÌHq‘Ìøq‘Ìÿq‘Ìÿq‘Ìÿq‘Ìÿr‘Ìÿs’Íÿu•Íÿx—Îÿz™Ïÿ}›Ðÿ€Ñÿ‚ŸÒÿ€Ñÿt”Íÿv•Îÿy—Ïÿ|™Ðÿƒ Òÿ«Àáÿ²Åãÿ®Ââÿª¿áÿ§¼ßÿ£¹Þÿœ´Üÿ—°Úÿ˜±Úÿ ·ÝÿÁÒéÿÉØìÿÈ×ìÿÄÔêÿ¹Ëæÿ®Ââÿ­Ââÿ–¯Ùÿz˜Ïÿw•ËÿsŽÄÿt‘Æÿ{™Ïÿ}›Ñÿ~›Ñÿ~œÑÿœÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„ ÒÿžÐ뇢ÔÇ£Ô°ˆ¤Ôˆ¤Õ<ˆ¥ÔOðÿÿÿÿ[Ï[ä[*q‘ÌXq‘Ìüq‘Ìÿq‘Ìÿr’Ìÿs“Íÿu”Íÿx–Îÿ|šÐÿ~œÑÿ~œÑÿœÑÿƒ Óÿ‡£Ôÿ‰¤ÕÿœÑÿ{™Ðÿ~œÑÿžÒÿŠ¥Õÿ¸Ëæÿ¿Ðéÿ¼Íçÿ¸Êæÿ´Çäÿ°Äãÿ¬Áâÿ£ºÞÿžµÝÿ¢¸Þÿ¸ËæÿÈ×ìÿÂÒêÿ·Êæÿ±Åãÿ±Åäÿ£¹ÞÿžÒÿu’ÈÿsÄÿz—Ìÿ~œÑÿœÑÿœÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ~šËÿ€œÍÿˆ¤Õÿ‰¤Õÿ‰¥ÕÿŠ¥Õ틦֗Œ§ÖÈÿÿÿÿÿ[Í[þ[}[r‘Ì|™Ïy—Ïs’Ìq‘ÌFq‘Ì÷r’Ìÿs’Íÿu•Íÿx—Îÿz˜Ïÿ‚ŸÒÿލÖÿŒ§Öÿ‡£ÔÿƒŸÒÿƒ Òÿ‹¦Öÿ©×ÿ‹¥ÕÿžÒÿ„¡Óÿ‡£ÔÿŒ§Öÿ»ÍçÿÍÛîÿÉØìÿÅÕëÿÂÓéÿ¾Ðèÿ¸Ëæÿ¨½àÿ¤ºÞÿ§¼àÿ­Ââÿ²Æäÿ²Æäÿ²Æäÿ«Àáÿ˜±ÚÿƒŸÒÿ}šÐÿ|™Îÿ~›ÐÿÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ‡¢Ôÿˆ£ÔÿÎÿ~šËÿ‰¥ÕÿŠ¥Õÿ‹¦ÕÿŒ¦ÖÿŒ§Öÿ¨Öÿލ׫ީׄýÿÿÿÿÿ[Í[ÿ[Ð[†¢Ô ¨ÖP‹¦Õ£„¡ÓËz˜ÏÎr’̰q‘Ìfq‘Ìq’Ì!s’ÍÝu”Íÿx–Îÿz˜Ïÿ}šÐÿ€Ñÿ—°ÚÿŸ·Ýÿš²Ûÿ–®Ùÿ‘ª×ÿŒ§Öÿ©×ÿ”­Ùÿ“­Øÿ„ Òÿ‰¤Õÿ§Öÿ©×ÿ«ÀáÿÏÝïÿÐÞïÿÏÝïÿÎÜîÿÈØìÿ´Çåÿ§½àÿ«¿áÿ£¹Þÿލ×ÿ—¯Úÿ˜°Úÿª×ÿ„ Óÿ~›Ñÿ~œÑÿœÑÿ€ÒÿžÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¥Õÿ„ Ðÿ~šÊÿ‰¥ÔÿŒ§ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×û‘«ØoªÖ:èÿÿÿÿÿÿ[Í[ÿ[ú[b—¯Ú ·Ý™£¹Þô™±Úÿ…¡Óÿy—Ïÿr’Ìÿq‘Ìüq‘̶q‘Ì"t”Íx–Γz˜Ïÿ}šÐÿœÑÿ‚žÒÿ‡£Ôÿ¨½àÿ®Ââÿ¨¾àÿ¤ºÞÿŸ¶Ýÿš²Ûÿ–¯Úÿ˜±Úÿ›³Ûÿ‡£Ôÿ‚ŸÒÿ’¬Øÿ–®Ùÿœ´ÜÿÀÒéÿÑßïÿÏÝïÿÇ×ìÿ¶ÉåÿªÀáÿ­Áâÿ¯Äãÿ”­Ùÿ|šÐÿ}šÐÿ}›Ðÿ~›ÑÿœÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤ÕÿŠ¥Õÿ‹¦Öÿ‡¢Òÿ~šÉÿŠ¥Ôÿ¨×ÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ“¬ØÓ“­Ù «ÿÿÿÿÿÿÿ[Í[ÿ[ÿ[º[ µÜ ¸Ýª´Çäþ¯Ââÿ‘ª×ÿ€Ñÿy—Ïÿs“Íÿq‘Ìÿq‘Ìÿq‘Ì™pÌ|šÐ$œÑÍ‚ŸÒÿ„ Óÿ‡¢Ôÿ‹¦Õÿ¯Ããÿ¼Îçÿ¶Éåÿ²Åäÿ­Ââÿ¨¾àÿ£ºÞÿ ·Ýÿ ¸Ýÿ•¯Ùÿy—Ïÿ‡£Ôÿš²ÛÿžµÜÿª¿áÿÀÑéÿ¸Ëæÿ­Ââÿ¬Áâÿ°Äãÿ³Çäÿ¨½àÿƒ Óÿ~œÑÿÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„ Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤ÕÿŠ¥ÕÿŠ¥Õÿ‹¦ÕÿŒ§Öÿ‰¤Óÿ›ËÿŠ¥Óÿ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’¬Øÿ“¬Øÿ“­Øÿ”­Ùÿ•®Ùü•®ÙlVõÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ó[H§¼ß¡¸Þ­Ââý¿Ðéÿ¤ºÞÿˆ¤ÔÿžÒÿz˜Ïÿs“Íÿq‘Ìÿq‘Ìÿq‘ÌØq‘ÌžÒI…¡Ó퉤ÕÿŒ¦ÖÿލÖÿ«¿áÿÉØìÿÅÕëÿÀÑéÿ¼ÎçÿµÈåÿ­Ââÿ§¼àÿ¦¼ßÿŸ·Ýÿ|šÐÿy˜Ïÿ‰¤ÕÿŸ¶Ýÿ§½àÿªÀáÿ¬Áâÿ¯Ããÿ²Æäÿ·Éåÿ¯Ããÿ¨Öÿ€ÑÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§Öÿ§Öÿލ×ÿФÓÿ›Ëÿ‹¥Óÿª×ÿ«×ÿ‘«Øÿ’¬Øÿ“¬Ùÿ“­Ùÿ”®Ùÿ•®Ùÿ•¯Úÿ–¯Úÿ—°Úÿ˜°Ú´™²ÛÅÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[¡[©¾áK¤ºßð´Çäÿ¹Ëæÿ–¯Ùÿˆ¤Õÿ‚žÒÿ{™Ðÿt“Íÿq‘Ìÿq‘Ìÿq‘ÌÛq‘Ìq‘Ì/q‘Ìžy˜Ïõ‹¦Õÿ‘«Øÿ’¬Øÿ¡¸ÝÿËÚíÿÐÝïÿÉØìÿºÌçÿ¬Àáÿ§¼àÿ¨½àÿ«Àáÿ¢¸Þÿ~›Ñÿ{™Ðÿ{šÐÿ…¡Óÿš²Ûÿª¿áÿ±Äãÿ³Æäÿ±Åãÿ¥»ßÿŒ§ÖÿžÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Õÿ‰¥ÕÿŠ¥ÕÿЦÖÿ‹¦ÖÿŒ§Öÿ§Öÿ¨×ÿŽ©×ÿ©×ÿФÒÿœËÿŒ¦Ôÿ’«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”®Ùÿ•®Ùÿ•¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ˜±Úÿ“«Õß—¯Ø3”°Øoûÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[è[2¯Äã«Àá§¥»ßÿ¤»ßÿµÜÿ«×ÿ‰¥Õÿ‚ŸÒÿ{™Ðÿt”Íÿq‘Ìÿq‘Ìÿq‘ÌÑq‘̃q‘ÌÞr’Ìÿr’Íÿ}›Ðÿ’¬Øÿ™±Úÿ´Üÿ¾ÐéÿÀÑéÿ®Ãâÿ¦¼ßÿ§¼àÿª¿áÿ¬Áâÿ°Äãÿ˜±Úÿ|šÐÿ}›Ðÿ~›Ñÿ~›Ñÿ€Ñÿˆ¤Ôÿª×ÿª×ÿŠ¥Õÿƒ Óÿ‚ŸÒÿ„ Óÿ„¡Óÿ…¡Ôÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Õÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§Öÿ§Öÿ¨×ÿŽ©×ÿ©×ÿª×ÿª×ÿˆ¢ÐÿƒËÿ©Õÿ“­Øÿ“­Ùÿ”­Ùÿ•®Ùÿ•®Úÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ”¬ÕÿŠ¢Íýœ³Üݵ݄ž¶Ý Ôÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[†[°Äã¬ÁâÔ¦¼ßÿŸ¶Ýÿ—°Úÿ‘«ØÿŠ¥ÕÿƒŸÓÿ|šÐÿu”Íÿq‘Ìÿq‘Ìÿr’Ìùs’Íýs“Íÿt“Íÿu”Íÿu”Îÿ€Ñÿ˜°Úÿ ·Ýÿ¦½àÿ¦¼ßÿ¦¼ßÿª¿áÿ¬Áâÿ¯Ããÿ²Æäÿª¿áÿ†¢Ôÿ~›ÑÿœÑÿ€Ñÿ€ÒÿžÒÿžÒÿžÒÿ‚ŸÒÿƒ Óÿ„¡Óÿ…¡Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£Ôÿ‰¤Õÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§Öÿ§Öÿ¨ÖÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ‹¥Òÿ†¡Îÿ’¬×ÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Üÿœ´Üÿ›³ÛÿŠ¡Ìÿ˜°×ÿŸ¶ÝÿŸ¶Ýþ ·Ý¼¡¸Þ'ýÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[×[±Åä#­Ââá§¼àÿ ·Ýÿ™±Úÿ’«Øÿ‹¦Õÿ„ Óÿ}šÐÿv•Îÿq‘Ìÿq‘Ìÿt“Íÿu”Íÿu•Îÿv•Îÿw–Îÿw–Îÿx—Ïÿ‚ŸÒÿœ´Üÿ¨½àÿ©¿áÿ¬Áâÿ¯Ãâÿ±Åäÿ´Èåÿ®ÂâÿŽ©×ÿÑÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§Öÿ§Öÿ¨Öÿލ×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ“¬Øÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´ÜÿµÜÿŸ¶Ýÿ‘¨Ñÿ¨Ñÿ ·Þÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þ±¤ºß%Ûÿÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[ü[k±Åä ®Ââß§½àÿ ·Ýÿ™²Ûÿ“¬Øÿ‹¦Öÿ„¡Óÿ~›Ðÿv•Îÿr’Ìÿu”Íÿv•Îÿw–Îÿx–Îÿx—Ïÿy—Ïÿz˜Ïÿz™Ïÿ{™Ðÿƒ Óÿœ´Üÿ¬Áâÿ±Åãÿ´Çäÿ³Æäÿ¦¼ßÿŒ§ÖÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§Öÿ§Öÿލ×ÿލ×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿŸ¶Ýÿ ·Ýÿ™°×ÿŒ¢ÌÿŸ¶Ýÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¥»ßù¥¼ßYþÿÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[ÿ[ÂR²Æã®ÂãѨ¾àÿ¡¸Ýÿš²Ûÿ“­ØÿŒ§Öÿ„ Óÿ|šÐÿw–Îÿw–Îÿx–Îÿx—Ïÿy—Ïÿz˜Ïÿz™Ïÿ{™Ðÿ|šÐÿ|šÐÿ}›Ðÿ}›ÑÿžÒÿ§Öÿ–¯Úÿ—°ÚÿŽ©×ÿ„¡Óÿ‚ŸÒÿƒ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Öÿ‹¦ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡¸ÞÿžµÜÿŒ£Ìÿœ²Ùÿ¤ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ§½àœ©¾á"Ùÿÿÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[ÿ[øII‰·¹¸*³Æå®Ãã´©¾àÿ¢¹Þÿ›³Ûÿ‘«Øÿ„ Óÿ{™Ïÿx—Îÿx—Ïÿy—Ïÿz˜Ïÿz™Ïÿ{™Ðÿ|šÐÿ}šÐÿ}›Ðÿ~›Ñÿ~œÑÿœÑÿ€Ñÿ€Òÿ€ÒÿžÒÿ‚ŸÒÿ‚ŸÒÿ„ Óÿ…¡Óÿ…¢Ôÿ†¢Ôÿ‡£Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ•¯Ùÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ¡¸Ýÿ¦Îÿ˜¯Õÿ¥¼àÿ¥»ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áĪ¿á nüÿÿÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[ÿZÿy<;ÿ±¬«ß´³²|´²±¯Ãâ…ª¿áÿ ·ÝÿލÖÿ~›Ñÿy—Ïÿy—Ïÿz˜Ïÿz™Ïÿ{™Ðÿ|šÐÿ}šÐÿ}›Ñÿ~›Ñÿ~œÑÿœÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„¡Óÿ…¢Ôÿ†¢Ôÿ‡£Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§Öÿ¨Öÿ¨Öÿލ×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™²Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ¤ºßÿ£¹Þÿ‘¨Ðÿ—­Ôÿ¦¼ßÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àáá­Ââ$•“’•’‘ •’‘;–“’L}zyWÈÿÿÿÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[ÿ[ÿb ÿ ŠŠÿµ´³ý´²±¸´²±/£¹ÞXš³Ûú„ Óÿz˜Ïÿy˜Ïÿz™Ïÿ{™Ðÿ|šÐÿ|šÐÿ}›Ðÿ~›ÑÿœÑÿœÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„ Óÿ…¡Óÿ…¡Óÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦ÕÿŒ¦ÖÿŒ§Öÿ¨Öÿ¨ÖÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤»ßÿ¥¼ßÿ¢¸Üÿ‘§Ïÿ˜®Ôÿ¨½àÿ¨¾àÿ©¾áÿª¿áÿª¿áÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââ÷¥»ßRtŽ¿ –““G–“’ª•’‘Þ•’‘ñ–“’÷{yxú þÿÿÿÿÿÿÿÿÿÿÿÿ[Í[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿ‚NMÿ´±°ÿ´²±ÿ´²±Ð´²±;y—Îy˜ÏL{™ÐÈ|šÐþz˜Ïÿ{™Ðÿ|šÐÿ}šÐÿ}›Ðÿ~›Ñÿ~œÑÿœÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„ Óÿ…¡Óÿ†¡Óÿ†¢Ôÿ‡£Ôÿ‡£Ôÿˆ¤Ôÿ‰¤ÕÿŠ¥ÕÿŠ¥Õÿ‹¦ÕÿŒ§ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“­Ùÿ”­Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ™±Úÿ™²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿ´ÜÿµÜÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡¸Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ¤ºÞÿ¤ºßÿ¥»ßÿ¦¼ßÿ§½àÿžµÚÿ¦Îÿ²×ÿ©¿áÿª¿áÿªÀáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°ÄãÿªØÞ}‘·»—””é—”“ÿ–“’ÿ–“’ÿ˜•”ÿgeeÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[Â[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿgÿ§˜—ÿµ´³ÿ´²±ÿ´²±Ó´²±3{™Ðz™ÏŒ{™Ïî{™Ðÿ|šÐÿ}šÐÿ}›Ðÿ~›ÑÿœÑÿœÑÿ€Ñÿ€žÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦ÕÿŒ§ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ“¬Øÿ“­Øÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ™±Úÿ™²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡¸Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ¤ºßÿ¤ºßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨¾àÿ›±Öÿ‘§Îÿ£¹Üÿ«Àâÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ±Äãÿ±Åäÿ³Çäÿ’«ÕÿŒ“¥ÿ™–”ÿ˜•”ÿ—•”ÿ—”“ÿ˜•”ÿKJIÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ‹aaÿµ´³ÿ´²±ÿ´²±ÿ´²±Â´²±{™Ï|šÐI|šÐÆ|šÐÿ}šÐÿ}›Ðÿ~›ÑÿœÑÿœÑÿ€ÑÿžÒÿžÒÿ‚ŸÒÿƒŸÒÿƒ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¤ÕÿŠ¥ÕÿŠ¥Õÿ‹¦ÕÿŒ§ÖÿŒ§Öÿ§Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ“¬Øÿ“­Øÿ”­Ùÿ•®Ùÿ•®Ùÿ–¯Ùÿ–¯Úÿ—°Úÿ˜°Úÿ™±Úÿ™²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¿áÿ™¯Õÿ•«Ñÿ¨½ßÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ±Äãÿ±Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÈæÿšªÇÿ—–˜ÿš—–ÿ™–•ÿ™–•ÿ™–•ÿ”‘ÿ0/.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿm%%ÿ¬£¢ÿµ³²ÿ´²±ÿ´²±þ´²±š´²± }›Ð}šÐ‡}›Ñì}›Ñÿ~œÑÿœÑÿ€Ñÿ€ÒÿžÒÿžÒÿ‚ŸÒÿƒ Óÿƒ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Ôÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿ‘«×ÿ‘«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”­Ùÿ•®Ùÿ•¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ™±Ûÿ™²Ûÿš²Ûÿ›³Üÿœ´Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Ýÿ¢¸Þÿ¢¹Þÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Áâÿ µÙÿ•ªÐÿ«Àáÿ®Ââÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ³Æäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ²Æãÿ›¢±ÿ›˜—ÿ›˜˜ÿ›˜—ÿš——ÿ›˜—ÿ‰†…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ]ÿ•tsÿµ´³ÿ´²±ÿ´²±ÿ´²±õµ³²[|›Ñ~œÑC~›ÑÀ~œÑþœÑÿ€Ñÿ€ÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Õÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§Öÿ§Öÿ¨×ÿލ×ÿŽ©×ÿ©×ÿª×ÿ«Øÿ‘«Øÿ’¬Øÿ“¬Ùÿ“­Ùÿ”­Ùÿ•®Ùÿ•¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ™±Ûÿ™²Ûÿš²Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àâÿ¬Áâÿ«¿àÿ•ªÐÿ©½Þÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ³Æäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Ëçÿ¦¸×ÿš›¢ÿš™ÿš™ÿœ™™ÿœ™˜ÿ›šÿurrÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿu55ÿ±«ªÿµ³²ÿµ³²ÿ¶´³ÿ·µ´Î¾¸±{›ÓœÑ{œÑèÑÿ€ÒÿžÒÿ‚ŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ†¢Ôÿ‡£Ôÿˆ£Ôÿˆ¤Õÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§Öÿ§Öÿ¨×ÿލ×ÿ©×ÿ©×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”®Ùÿ•®Ùÿ•¯Úÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àâÿ¬Áâÿ­Áâÿ­Ââÿ¯Ããÿ µØÿž³Öÿ±Åäÿ±Åäÿ±Åäÿ²Æäÿ³Æäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸ËæÿºÌçÿ°Ääÿ‘¢ÂÿžœœÿŸœ›ÿž›šÿž›šÿššÿžœ›ÿZYYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ` ÿŸ†…ÿ·¶µÿ·µ´ÿ¸¶µÿ¹¶µý¥®¿Ò³€ÒûžÒÿžÒÿ‚ŸÒÿƒ Óÿ„ Óÿ„¡Óÿ…¡Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ£Ôÿ‰¤Õÿ‰¥ÕÿŠ¥ÕÿЦÕÿ‹¦ÖÿŒ§Öÿ§Öÿ¨×ÿŽ©×ÿ©×ÿ©×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ“¬Øÿ“­Ùÿ”­Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ—°Úÿ—°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àâÿ¬Áâÿ­Áâÿ­Ââÿ®Âãÿ¯Ããÿ¯Äãÿ¯Äãÿ™®Òÿ«¿ßÿ³Æäÿ³Çäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËçÿºÌçÿ»Íçÿ¸Ëæÿ‘«Øÿ›²ÿ¡žÿ ÿ œÿŸœœÿŸœ›ÿœš™ÿ@?>ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿ€IHÿ·´³ÿ¹·¶ÿ¹··ÿ¥®Áÿ‡¡ÏÿŸÒÿ‚ŸÒÿƒ Óÿ„ Óÿ…¡Óÿ…¡Ôÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§ÖÿŒ§Öÿ¨Öÿލ×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Æäÿ­Áàÿ›¯Óÿ³Çäÿ´ÇåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ¼ÎçÿžµÝÿ€›ÎÿšŸªÿ£ Ÿÿ¢ŸŸÿ¡Ÿžÿ¡žžÿ¡žžÿ”’‘ÿ)((ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿeÿª™˜ÿ¼»ºÿ»º¹ÿž¬Çÿ‚ŸÓÿ„ Óÿ„¡Óÿ…¡Óÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§Öÿ§Öÿ¨Öÿލ×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿœ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ¬Àâÿ¬Áâÿ­Áâÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ´Èåÿ¬Àßÿ¤¸Ùÿ·Êåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïéÿ§½àÿ‚ŸÓÿ†Èÿ¢¢¦ÿ¥¢¡ÿ¤¡ ÿ£¡ ÿ£ Ÿÿ¤¡¡ÿƒ€ÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿŒ^^ÿ½¼»ÿ¾¼ºÿµ¸ÀÿŒ¥Ñÿ†¢Ôÿ‡¢Ôÿ‡£Ôÿˆ¤Ôÿ‰¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§Öÿ¨Öÿލ×ÿލ×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ“­Ùÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶ÉåÿµÈåÿ¶Èåÿ¸Êæÿ¸Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¿ÐéÿÀÑéÿ¯Ããÿˆ£Ôÿ€žÓÿ¡Áÿ§¤¤ÿ¦¤£ÿ¦£¢ÿ¥£¢ÿ¤¢¡ÿ¦££ÿljjÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿm"!ÿ´©¨ÿÀ¿¾ÿÀ¿½ÿ¢°Êÿ‡£Ôÿˆ¤Õÿ‰¥ÕÿŠ¥Õÿ‹¦Õÿ‹¦ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ‘«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ ¸Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ðèÿ¿Ðéÿ¿ÑéÿÀÑéÿÁÒêÿ´Çäÿ§Öÿƒ Óÿ…¡Ôÿ™¥ºÿ©§¥ÿ¨¦¥ÿ¨¥¤ÿ§¤£ÿ¦¤£ÿ¦£¢ÿRQQÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ™vuÿÃÂÁÿÃÁ¿ÿ¸¼Äÿ¨ÓÿЦÖÿ‹¦ÖÿŒ§Öÿ¨Öÿލ×ÿŽ©×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ•¯Ùÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ¸Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ðèÿ¿Ðéÿ¿ÑéÿÀÑéÿÁÒéÿÂÒêÿÃÓêÿ¸Êæÿ‘«Øÿ…¡Ôÿ‡£ÔÿФÓÿ¢¨´ÿ«¨§ÿª¨§ÿ©§¦ÿ©¦¥ÿ©¦¥ÿ žÿ<;:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿv33ÿ½·¶ÿÄÃÂÿÄÃÂÿ¥³ÎÿŒ§Öÿ¨Öÿލ×ÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ“¬Øÿ”­Ùÿ”®Ùÿ•®Ùÿ–¯Úÿ–¯Úÿ—°Úÿ˜°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤»ßÿ¥»ßÿ¦»ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿª¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ³Æäÿ³Çäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÄÔëÿ¹Ìçÿ•®Ùÿˆ£Ôÿ‰¥ÕÿЦÖÿ§Ðÿ©ª°ÿ­«©ÿ¬ª©ÿ«©¨ÿ«¨¨ÿ«©¨ÿ“ÿ,++ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ` ÿ¦‹‹ÿÇÇÆÿÇÅÄÿ½ÀÈÿ•¬Õÿª×ÿª×ÿ‘«Øÿ’¬Øÿ“¬Øÿ“­Øÿ”­Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ™±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Üÿœ´Üÿ´ÜÿµÜÿž¶ÝÿŸ¶ÝÿŸ¶Ýÿ ·Ýÿ¡¸Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºÞÿ¤ºßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿª¿áÿªÀáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ±Äãÿ±Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ¾Ïèÿ¾Ïèÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÄÔêÿÄÕëÿÆÕëÿ»Íçÿ—°ÚÿŠ¥Õÿ‹¦ÖÿŒ§Öÿ¨×ÿ—ªÍÿ®­¯ÿ¯­¬ÿ®¬«ÿ®««ÿ­«ªÿ®¬«ÿ~||ÿ$$#ÿ! ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿ‚GGÿÅÃÂÿÉÇÆÿÉÇÇÿª¸Ðÿ‘«Øÿ’¬Øÿ“­Ùÿ”­Ùÿ•®Ùÿ•®Ùÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ™±Úÿ™±Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿ´ÜÿµÜÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡¸Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ¤ºÞÿ¤ºßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿª¿áÿªÀáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ±Åãÿ±Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ïèÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÄÔêÿÄÕëÿÅÕëÿÆÖëÿÇ×ìÿ¼Îèÿ™±ÚÿŒ§Öÿލ×ÿ©×ÿª×ÿ«ØÿŸ­Èÿ²°¯ÿ±¯®ÿ°®­ÿ°­­ÿ¯­¬ÿ°­­ÿfedÿ$$#ÿ$$#ÿ##"ÿ"""ÿ!!!ÿ ÿÿÿÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿeÿ´¡ ÿÌËÊÿËÉÈÿÁÅÌÿš±×ÿ”®Ùÿ•®Úÿ–¯Úÿ—¯Úÿ—°Úÿ˜°Úÿ™±Úÿ™²Ûÿš²Ûÿ›³Ûÿ›³Ûÿœ´Üÿ´ÜÿµÜÿžµÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡¸Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ¤ºßÿ¤ºßÿ¥»ßÿ¦¼ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾áÿ©¾áÿª¿áÿªÀáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ±Äãÿ±Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðèÿ¿ÐéÿÀÑéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÄÔêÿÄÕëÿÅÕëÿÆÖëÿÇÖëÿÇ×ìÿÈØìÿ¼Îèÿš³ÛÿŽ©×ÿª×ÿ‘«Øÿ’¬Øÿ“­Ùÿ”­Ùÿ¦°Ãÿµ²±ÿ³±°ÿ²°°ÿ²¯¯ÿ±¯®ÿ¬ª©ÿPONÿ''&ÿ(('ÿ''&ÿ&&%ÿ%%$ÿ$$#ÿ##"ÿ""!ÿ! ÿÿÿÿÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿ_^ÿÌËÊÿÍËËÿÍÌÌÿ¯¼Ôÿ–¯Úÿ—°Úÿ˜±Úÿ™±Ûÿš²Ûÿš²Ûÿ›³Ûÿœ´Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶ÝÿŸ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£ºßÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨¾àÿ¨¾áÿ©¿áÿª¿áÿªÀáÿ«Àâÿ¬Áâÿ­Ââÿ­Ââÿ®Âãÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ³Æäÿ³Çåÿ´ÇåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËçÿºÌçÿºÌçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉÙíÿ»Íçÿš²Ûÿ‘ª×ÿ’¬Øÿ”­Ùÿ•®Ùÿ–¯Ùÿ—¯Úÿ™±Ùÿ®´¿ÿ·µ³ÿµ´³ÿµ³²ÿ´²±ÿµ³²ÿ¢  ÿ@?>ÿ,,+ÿ,++ÿ+**ÿ*))ÿ)((ÿ(''ÿ'&&ÿ%%%ÿ$$$ÿ##"ÿ""!ÿ!! ÿ ÿÿÿÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿm ÿ¿³²ÿÐÏÎÿÐÎÍÿÆÉÐÿŸ´Ùÿ™²Ûÿš²Ûÿ›³Üÿœ´Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¡¸Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿªÀáÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ³Æäÿ´Çåÿ´ÇåÿµÈåÿµÈåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉÙíÿÊÙíÿËÚíÿ¹Ëæÿ™²Ûÿ“¬Øÿ•®Ùÿ–¯Ùÿ—°Úÿ˜°Úÿ™±Ûÿš²Ûÿž´Øÿ´·½ÿ¹·¶ÿ¸¶µÿ·µ´ÿ¶´´ÿ·µµÿ‘ÿ766ÿ100ÿ0//ÿ/..ÿ---ÿ,,,ÿ++*ÿ**)ÿ))(ÿ(('ÿ''&ÿ&%%ÿ%$$ÿ$##ÿ#""ÿ"!!ÿ! ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿžvvÿÒÒÑÿÑÐÏÿÒÑÐÿ´À×ÿ›³Üÿœ´ÜÿµÜÿžµÝÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¸Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ§¼àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àâÿ¬Áâÿ¬Áâÿ­Ââÿ®Âãÿ®Ããÿ¯Äãÿ°Äãÿ±Åäÿ±Åäÿ²Æäÿ³Æäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ·Êæÿ¸Ëæÿ¹ËçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇÖìÿÇ×ìÿÈ×ìÿÉØìÿÉÙíÿÊÙíÿËÚíÿÌÚíÿËÚíÿµÈäÿ™±Ûÿ•®Ùÿ—°Úÿ˜±Úÿ™±Ûÿš²Ûÿ›³Üÿœ´ÜÿµÝÿ£·Öÿ¹º¼ÿ»¹¸ÿº¸¸ÿ¹··ÿ¸¶¶ÿ¹··ÿ{yyÿ554ÿ544ÿ433ÿ221ÿ110ÿ00/ÿ//.ÿ..-ÿ--,ÿ,++ÿ+**ÿ*))ÿ(('ÿ''&ÿ&&%ÿ%%$ÿ$$$ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿw10ÿÊÃÂÿÓÓÒÿÔÓÒÿÊÎÔÿ¤¹Üÿž¶ÝÿŸ¶Ýÿ ·Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ¦¼àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àâÿ¬Áâÿ­Áâÿ­Ââÿ®Âãÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ²Æäÿ²Æäÿ³Çäÿ´Çåÿ´ÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈ×ìÿÉØìÿÉÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÊÙíÿ°Äãÿ™±Ûÿ—°Úÿ™²Ûÿš²Ûÿ›³Üÿœ´ÜÿžµÜÿŸ¶Ýÿ ·Ýÿ ·ÞÿªºÔÿ½¼½ÿ½»»ÿ¼»ºÿ»º¹ÿ»¹¹ÿ¸¶µÿfddÿ887ÿ988ÿ877ÿ665ÿ554ÿ443ÿ332ÿ221ÿ100ÿ0//ÿ..-ÿ--,ÿ,,+ÿ++*ÿ**)ÿ))(ÿ(''ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ_ÿ­ÿ×ÖÖÿÖÔÔÿÖÕÕÿ¸ÅÙÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ§½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ¬Àâÿ¬Áâÿ­Áâÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ËçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇ×ìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÏÝîÿÇÖëÿª¿áÿ™²Ûÿš²Ûÿœ´Üÿ´ÜÿžµÜÿŸ¶Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ£ºßÿ±½ÑÿÁ¿¾ÿÀ¾½ÿ¿½½ÿ¾¼¼ÿ¾¼¼ÿ±¯¯ÿTTSÿ==<ÿ==<ÿ<<;ÿ;::ÿ998ÿ887ÿ776ÿ655ÿ544ÿ433ÿ221ÿ110ÿ0//ÿ/..ÿ.--ÿ,,,ÿ+++ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿƒFEÿÓÏÏÿ××ÖÿÙ×ÖÿÎÒØÿ¨¼Ýÿ£ºßÿ¤ºßÿ¥»ßÿ¥»ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Æäÿ´Çåÿ´ÇåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÆÕëÿÆÖëÿÇÖìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÝïÿÁÒéÿ¥»ßÿ›³Ûÿ´ÜÿžµÜÿŸ¶Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£ºÞÿ¤ºßÿ¥»ßÿ¦¼àÿ§½àÿ·ÀÏÿÃÂÁÿÂÁÀÿÁÀ¿ÿÁ¿¾ÿÂÀ¿ÿ£¢¡ÿKJJÿCBAÿBA@ÿ@@?ÿ??>ÿ>==ÿ=<<ÿ<;:ÿ::9ÿ988ÿ877ÿ665ÿ554ÿ433ÿ322ÿ211ÿ100ÿ0//ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿdÿ¼¦¥ÿÛÛÚÿÚÙØÿÚÙÙÿ»ÈÝÿ¥»ßÿ¦¼àÿ§½àÿ¨½àÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ«Àáÿ¬Áâÿ­Áâÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ´Çåÿ´ÇåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÆÖëÿÆÖëÿÇÖìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÛíÿÌÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÍÛîÿ·Êæÿ¡¸ÞÿµÜÿŸ¶Ýÿ ·Ýÿ¡¸Þÿ¢¹Þÿ£ºÞÿ¤»ßÿ¥»ßÿ¦¼àÿ§½àÿ¨¾àÿ©¿áÿ«Àáÿ¾ÃÍÿÆÄÃÿÅÃÃÿÄÂÂÿÃÁÁÿÄÂÂÿŽÿHHGÿGFFÿFEDÿEDCÿCCBÿBAAÿA@@ÿ??>ÿ>>=ÿ=<<ÿ<;;ÿ;:9ÿ998ÿ877ÿ766ÿ554ÿ443ÿ332ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿ’^]ÿÚÙÙÿÛÚÚÿÝÜÛÿÒÕÜÿ¬Ààÿ¨¾àÿ©¾áÿ©¿áÿª¿áÿ«Àáÿ¬Áâÿ¬Áâÿ­Áâÿ­Ââÿ®Ããÿ¯Ããÿ¯Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¸Ëæÿ¹ËçÿºÌçÿºÍçÿ»Íçÿ¼Îèÿ½Îèÿ½Ïèÿ¾Ïèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÆÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÆÖëÿ®ÂâÿŸ·Ýÿ ¶Ýÿ¡·Ýÿ¢¸Þÿ£ºÞÿ¤»ßÿ¥»ßÿ¦¼àÿ§½àÿ¨¾àÿª¿áÿ«Àáÿ¬Áâÿ­Áâÿ°ÂàÿÃÆÌÿÈÆÅÿÇÅÅÿÇÅÄÿÆÄÃÿÄÃÂÿ|{zÿKJJÿLKJÿJJIÿIHGÿHGFÿFFEÿEDDÿDCCÿCBAÿAA@ÿ@??ÿ?>=ÿ==<ÿ<;;ÿ;::ÿ:99ÿ887ÿ776ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿZÿlÿÉ»»ÿÞÞÞÿÞÝÝÿÞÞÝÿÀÌßÿª¿áÿ«Àáÿ¬Áâÿ¬Áâÿ­Ââÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ°Äãÿ±Åäÿ²Åäÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ¶Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ËçÿºÍçÿ»Îèÿ»Íçÿ¼Íèÿ¼Îèÿ½Ïèÿ¾Ðèÿ¿ÐéÿÀÑéÿÁÒéÿÁÒéÿÂÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÆÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑÞïÿÎÜîÿ»Íçÿ¦¼ßÿ¡·Þÿ¢¸Þÿ£¹Þÿ¤ºßÿ¥»ßÿ¦¼àÿ¨½àÿ©¾àÿª¿áÿ«Àáÿ¬Áâÿ­Áâÿ®Ââÿ¯Ããÿ°Äãÿ´ÆàÿÈÉÌÿÊÉÈÿÊÈÈÿÉÇÇÿÈÇÆÿÀ¾½ÿljiÿPOOÿPONÿONMÿMMLÿLKJÿKJIÿJIHÿHGGÿGFFÿFEDÿDDCÿCBBÿBAAÿA@?ÿ??>ÿ>==ÿ=<<ÿ;;:ÿ[½[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ¢wwÿàààÿàßÞÿáàßÿÖÚàÿ±Äâÿ­Áâÿ®Ââÿ®Ããÿ¯Ããÿ°Äãÿ±Äãÿ±Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇäÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ²Æäÿ¢¹Þÿ™±Ûÿ•®Ùÿ•¯Ùÿ—°Úÿ›³Üÿ ·Ýÿ¨¾àÿµÈåÿÁÒéÿÄÔëÿÄÕëÿÅÕëÿÅÕëÿÆÖëÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿËÙíÿËÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÇ×ëÿ±Åäÿ£ºÞÿ£¹Þÿ¤ºßÿ¥»ßÿ¦¼àÿ§½àÿ¨¾àÿª¿áÿ«Àáÿ¬Áâÿ­Ââÿ®Ââÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ³ÇäÿºÉàÿÌÌÍÿÍÌËÿÌËÊÿËÊÉÿÌÊÊÿµ³³ÿa`_ÿVUTÿUTSÿSRRÿRQPÿQPOÿOONÿNMMÿMLKÿLKJÿJIIÿIHGÿGGFÿFEEÿEDCÿDCBÿBBAÿAA@ÿ@??ÿ[µ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿv..ÿÕÌÌÿâââÿâááÿâââÿÅÐãÿ¯Ããÿ°Äãÿ±Äãÿ±Åäÿ²Æäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Ëæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Ïèÿ©¿àÿ†¢Óÿ}›Ñÿ}›ÑÿœÑÿ€ÒÿžÒÿ‚ŸÒÿƒ Óÿ…¡Óÿ‹¦Öÿœ´Üÿ¸ËæÿÇÖëÿÇ×ìÿÈ×ìÿÈØìÿÉØìÿÊÙíÿËÚíÿËÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑÞïÿÎÜîÿ¾Ïèÿ©¿áÿ¤ºßÿ¥»ßÿ¦¼àÿ§½àÿ©¾àÿª¿áÿ«Àáÿ¬Àáÿ­Ââÿ®Ââÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ³Çäÿ´Èåÿ¶Èåÿ¶ÉæÿÀÌßÿÐÏÐÿÐÎÎÿÏÍÍÿÎÍÌÿÏÍÍÿ¥¤£ÿ]\[ÿZYYÿYXWÿXWVÿWVUÿUTSÿTSRÿSRQÿQPOÿPONÿONMÿMMLÿLKJÿKJIÿIIHÿHGFÿFFEÿEEDÿDCCÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ^ÿ²‘‘ÿåååÿäããÿåääÿÛÞäÿ¶Èäÿ²Åäÿ³Æäÿ³Çäÿ´ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Îèÿ¾Ïèÿ¾Ðèÿ»ÍçÿŽ©×ÿ~œÑÿÒÿ‚žÒÿƒ Óÿ„ Óÿ…¡Óÿ†¢Ôÿ‡£Ôÿˆ¤Õÿ‰¥ÕÿŠ¥Õÿ’¬Øÿ²ÅäÿÉØìÿÊÙíÿËÙíÿËÚíÿÌÛíÿÍÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÉØìÿ´Èåÿ§½àÿ¦¼àÿ¨½àÿ©¾áÿª¿áÿ«Àáÿ¬Áâÿ­Ââÿ®Ââÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ³ÇåÿµÈåÿ¶Èåÿ·Éæÿ¸Êæÿ¹Ëæÿ¹ÌçÿÆÏÞÿÓÒÒÿÒÑÑÿÒÐÐÿÑÏÏÿÐÏÏÿ“’‘ÿ`_^ÿ`_^ÿ^]\ÿ]\[ÿ\[ZÿZYXÿYXWÿWVUÿVUTÿUTSÿSRRÿRQPÿPPOÿONMÿNMLÿLLKÿKJIÿJIHÿIHGÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ[ÿ†CCÿàÛÛÿæææÿæååÿçææÿÉÔåÿ³ÇåÿµÈåÿµÈåÿ¶Éåÿ·Éæÿ·Êæÿ¸Êæÿ¹Ëæÿ¹ÌçÿºÌçÿ»Íçÿ»Íçÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒéÿ¹Ìçÿ‹¦Õÿ‚ŸÒÿ„ Óÿ…¡Óÿ†¢Ôÿ‡£Ôÿˆ¤Õÿ‰¥Õÿ‹¦Õÿ‹§Öÿ§Öÿލ×ÿ©×ÿ“­Ùÿ³ÇäÿÌÚíÿÍÛîÿÍÜîÿÎÝîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝîÿÁÒéÿ®Ââÿ§½àÿ©¾àÿª¿áÿ«Àáÿ¬Áâÿ­Ââÿ®Ããÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ´ÇåÿµÈåÿ¶Éåÿ·Éæÿ¸Êæÿ¹ËçÿºÌçÿ»Íçÿ¼Îèÿ½ÏèÿËÓÞÿÖÕÔÿÕÔÔÿÔÓÓÿÔÓÒÿÎÍÍÿƒ‚ÿdcbÿdcbÿcbaÿba`ÿ`_^ÿ_^]ÿ]\[ÿ\[Zÿ[ZYÿYXXÿXWVÿVVUÿUTSÿSSRÿRQQÿQPOÿPONÿNNMÿMLKÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ]ÿ^ÿ_ÿi ÿÅ«ªÿéééÿèççÿéèèÿßâèÿ»Ìæÿ·Éæÿ¸Êæÿ¸Ëæÿ¹Ëçÿ¹ÌçÿºÌçÿ»Íçÿ»Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒêÿÂÓêÿÃÓêÿ¼Íçÿލ×ÿ†¢Ôÿˆ£Ôÿ‰¤ÕÿŠ¥Õÿ‹¦ÖÿŒ§Öÿ¨ÖÿŽ©×ÿ©×ÿª×ÿ’«Øÿ“¬Øÿ“¬Øÿ˜°ÚÿºÌçÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÊÙíÿ¸ËæÿªÀáÿª¿áÿ«Àáÿ­Áâÿ®Ââÿ¯Ããÿ°Äãÿ±Åãÿ²Åäÿ³Æäÿ´ÇåÿµÈåÿ¶Éåÿ·Êæÿ¸ËæÿºÌçÿ»Íçÿ¼Íçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒéÿÒÖÞÿÙØØÿØ××ÿ×ÖÖÿ×ÖÖÿÆÅÄÿxwvÿjihÿihgÿhgfÿgfeÿedcÿcbaÿba`ÿa`_ÿ`_^ÿ^]\ÿ]\[ÿ[ZZÿZYXÿXWVÿWVUÿVUTÿTSRÿSRQÿRQPÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ]ÿ^ÿ`ÿbÿdÿeÿœ]\ÿèææÿêééÿêêéÿêêêÿÎØèÿ¸ËçÿºÌçÿºÌçÿ»Íçÿ¼Îèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðéÿ¿ÐéÿÀÑéÿÁÑéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÂÓêÿ˜°Úÿ‰¤Õÿ‹¦ÕÿŒ§Öÿ¨ÖÿŽ©×ÿª×ÿªØÿ’«Øÿ“¬Øÿ”­Ùÿ•®Ùÿ–¯Ùÿ—°Úÿ—°Úÿ ·ÝÿÅÕëÿÑßïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝïÿÄÔêÿ±Åäÿ«Àáÿ¬Áâÿ®Ââÿ¯Ããÿ°Äãÿ±Åãÿ²Æäÿ³Æäÿ´ÇåÿµÈåÿ¶Éåÿ·Êæÿ¸Ëæÿ¹ÌæÿºÍçÿ¼Îçÿ½Ïèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÅÕêÿ×ÚßÿÜÛÚÿÛÚÚÿÚÙÙÿÛÚÙÿ¹¸¸ÿtsrÿpomÿnmlÿmkjÿkjiÿjihÿhgfÿgfeÿfedÿdcbÿcbaÿa`_ÿ`_^ÿ^]\ÿ]\[ÿ\[ZÿZYXÿYXWÿWVUÿVUTÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ]ÿ_ÿaÿbÿeÿgÿjÿkÿ|ÿÖÂÁÿíííÿììëÿííìÿãæëÿÀÐèÿ»Íèÿ¼Îèÿ½Ïèÿ¾Ïèÿ¾Ðéÿ¿ÐéÿÀÑéÿÀÑéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇÖìÿÇ×ìÿ¯Äãÿ©×ÿª×ÿª×ÿ‘«Øÿ’«Øÿ’¬Øÿ”­Ùÿ•®Ùÿ–¯Úÿ—°Úÿ˜°Úÿ™±Ûÿš²Ûÿ›³Üÿœ´Üÿ«ÀáÿËÚíÿÑßïÿÑßïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿËÚíÿ»Íçÿ®Ââÿ­Áâÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ³Æäÿ´ÇåÿµÈåÿ¶Éæÿ·Êæÿ¸Ëæÿ¹ÌçÿºÌçÿ¼Íçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÄÕëÿÅÕëÿÆÖëÿÉØëÿÛÝáÿßÞÝÿÞÝÝÿÝÜÜÿÝÜÛÿª©¨ÿvtsÿusrÿsrqÿrqoÿponÿonmÿmlkÿlkjÿkihÿihgÿhgfÿfedÿedcÿcbaÿba`ÿ`_^ÿ_^]ÿ^]\ÿ\[Zÿ[ZYÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ^ÿ_ÿaÿcÿeÿhÿjÿmÿpÿrÿuÿ³xvÿíîíÿíííÿîîíÿîîîÿÒÛëÿ½Ïèÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÒéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇÖìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÇ×ìÿ°Äãÿ«Àáÿª¿áÿ¦¼ßÿ¢¹ÞÿµÜÿ—°Úÿ˜°Úÿ™±Ûÿš²Ûÿ›³Üÿœ´ÜÿµÜÿŸ¶ÝÿŸ¶Ýÿ¡¸Þÿ«Àáÿ±ÃßÿÅÕêÿÌÛîÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÎÜîÿÂÓêÿ³Çäÿ®Ããÿ°Äãÿ±Åäÿ²Æäÿ³Æäÿ´ÇåÿµÈåÿ¶Éæÿ·Êæÿ¹ËæÿºÌçÿ»Ìçÿ¼Íçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÄÕëÿÅÕëÿÇÖìÿÈ×ìÿÉØìÿÉÙíÿÎÛëÿàáâÿâáàÿáààÿàßßÿÜÛÛÿ›š˜ÿzywÿzywÿxwvÿwutÿutsÿtsrÿsqpÿqpoÿpnmÿnmlÿmljÿkjiÿjihÿhgfÿgfeÿedcÿdcbÿba`ÿa`_ÿ`_^ÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ^ÿ_ÿaÿcÿfÿhÿkÿmÿpÿsÿvÿyÿ|ÿ”.*ÿãÕÔÿðððÿðïïÿñððÿæêïÿÄÓêÿÀÑéÿÁÒêÿÂÓêÿÃÓêÿÃÔêÿÄÔëÿÅÕëÿÆÖëÿÆÖëÿÇ×ìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÍÛîÿÉØìÿ·Êåÿ¿ÐèÿÂÓêÿ»ÍçÿµÈåÿ¥»ßÿ›³Ûÿœ´ÜÿžµÜÿŸ¶Ýÿ ·Ýÿ¡·Ýÿ¢¸Þÿ£¹Þÿ¤ºßÿ¤ºßÿ’¨Ðÿ¤¹Üÿ°Äãÿ¸ËæÿÁÒéÿÈ×ìÿÊÙíÿÃÔêÿ¸Êæÿ±Åãÿ°Åãÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿ¶Éæÿ¸Êæÿ¹ËæÿºÌçÿ»Íçÿ¼Íçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÓêÿÄÕëÿÅÖëÿÇÖìÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÜîÿÓÞìÿääåÿåääÿäããÿãââÿ×ÖÖÿŽÿ€~}ÿ~|ÿ~|{ÿ|{yÿzyxÿyxwÿwvuÿvutÿusrÿsrqÿrqoÿponÿonmÿmlkÿkjiÿjihÿihgÿgfeÿfedÿedcÿ[¨[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ^ÿ`ÿbÿdÿfÿiÿkÿnÿqÿsÿwÿzÿ}ÿÿ„ÿ‰ÿÉ•’ÿòóóÿñññÿòòñÿòòòÿÕßíÿÂÒêÿÃÔêÿÄÔëÿÅÕëÿÅÕëÿÆÖëÿÇÖìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÎÜîÿÏÝïÿÇ×ìÿ±ÅãÿÃÓêÿÍÛîÿÊÙíÿ¿Ðèÿ£ºÞÿŸ·Ýÿ¡¸Þÿ¢¹Þÿ£¹Þÿ¤ºßÿ¥»ßÿ¦¼àÿ§½àÿ©¿áÿš°Õÿœ²Öÿ¬Áâÿ¬Áâÿ®Ââÿ±Åãÿ³Æäÿ±Åäÿ²Æäÿ³Çäÿ´ÇåÿµÈåÿ¶Éåÿ·Êæÿ¹ËæÿºÌçÿ»Íçÿ¼Îèÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÄÔëÿÅÕëÿÆÖëÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÜîÿÎÜîÿÏÝïÿÏÞïÿØáíÿèçèÿççæÿææåÿçææÿÎÍÌÿŒŠ‰ÿ†„ƒÿ„ƒ‚ÿƒ€ÿ‚€ÿ€~}ÿ~}{ÿ}{zÿ{zyÿzywÿxwvÿwvuÿutsÿtrqÿrqpÿqonÿonmÿnmlÿlkjÿkjiÿjhgÿ[¨[ÿ[ÿ[ÿ\ÿ^ÿ`ÿbÿdÿfÿiÿlÿnÿqÿtÿwÿzÿ~ÿÿ…ÿˆÿŒÿÿ­D@ÿîæåÿóóóÿôóóÿõôôÿêîòÿÉØìÿÅÖëÿÆÖëÿÇÖìÿÇ×ìÿÈØìÿÉØìÿÊÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÑßïÿÁÒéÿ¨½àÿ¸ËæÿÁÒéÿ¾Ðèÿ¨¾àÿ¢¹Þÿ¤ºßÿ¥»ßÿ¦¼àÿ§½àÿ¨¾àÿ©¿áÿª¿áÿ¬Áâÿ¥ºÜÿ™®Óÿ¯Äãÿ°Äãÿ±Åäÿ²Æäÿ³Æäÿ´ÇåÿµÈåÿ¶Éæÿ·Êæÿ¸ËæÿºÌçÿ»Íçÿ¼Îèÿ½Ïèÿ¾Ðèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÄÕëÿÅÕëÿÆÖëÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÜîÿÎÜîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÛãíÿëëêÿêêéÿééèÿêééÿÀÀ¿ÿŒ‹Šÿ‹Š‰ÿ‰ˆ‡ÿˆ†…ÿ†…„ÿ…ƒ‚ÿ„‚ÿ‚€ÿ~ÿ~|ÿ}|{ÿ|{yÿzyxÿyxwÿwvuÿvtsÿtsrÿsqpÿqpoÿponÿnmlÿ[¨[ÿ]ÿ^ÿ`ÿbÿdÿgÿiÿlÿoÿqÿuÿxÿ{ÿ~ÿ‚ÿ…ÿ‰ÿÿ‘ÿ•ÿ˜ÿ¡ ÿܯ­ÿö÷÷ÿõõôÿöõõÿõööÿÙãðÿÇÖìÿÈØìÿÉØìÿÉÙíÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿ¹Ëæÿ¢¹Þÿ¤ºßÿ¤»ßÿ¥»ßÿ¦¼àÿ§½àÿ¨¾àÿ©¿áÿ«Àáÿ«Àáÿ­Áâÿ®Ââÿ¯Ããÿ¬Áàÿš®Óÿ±Åãÿ³Çäÿ´ÇåÿµÈåÿ¶Éæÿ¸Êæÿ¹ËæÿºÌçÿ»Íçÿ¼Íçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÄÕëÿÆÖëÿÇÖëÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÛîÿÎÜîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿßæïÿïîîÿíííÿììëÿêêéÿ³²±ÿÿÿŽŒÿŒŠÿ‹Š‰ÿЉˆÿ‰‡†ÿ‡†…ÿ†„ƒÿ„ƒ‚ÿƒ€ÿ€~ÿ€~}ÿ~}{ÿ|{zÿ{zxÿyxwÿxwuÿvutÿusrÿtrqÿ]¨_ÿ`ÿcÿeÿgÿiÿlÿoÿrÿuÿxÿ{ÿÿ‚ÿ†ÿŠÿÿ‘ÿ•ÿ™ÿÿ¢ÿ¥ÿÅ^Yÿõñðÿö÷÷ÿ÷÷÷ÿøø÷ÿîñõÿÍÛîÿÊÙíÿËÚíÿÌÚíÿÌÛîÿÍÜîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÌÛîÿ°Äãÿ¦¼àÿ§½àÿ©¾àÿª¿áÿ«Àáÿ¬Áâÿ­Áâÿ®Ââÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ¯Ãâÿœ°Óÿ´Èäÿ·Éæÿ¸Êæÿ¹ËæÿºÌçÿ»Íçÿ¼Íçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒéÿÂÓêÿÃÔêÿÅÕëÿÆÖëÿÇÖìÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÜîÿÎÜîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿäêðÿòññÿðððÿðïïÿèççÿ©¨¦ÿ–•“ÿ•”’ÿ”“‘ÿ’‘ÿ‘ŽÿŽŒÿŽ‹ÿŒ‹‰ÿЉˆÿ‰ˆ‡ÿˆ†…ÿ†…„ÿ…ƒ‚ÿ„‚ÿ‚€ÿ€~}ÿ~}{ÿ}|zÿ{zyÿzyxÿxwvÿa¨cÿeÿgÿjÿlÿoÿsÿvÿyÿ|ÿ€ÿƒÿ†ÿŠÿŽÿ’ÿ–ÿšÿžÿ¢ÿ§ ÿ« ÿ¯ÿºÿëÇÅÿùúúÿøøøÿùùùÿùùùÿÞçòÿÌÛíÿÍÜîÿÎÜîÿÎÝîÿÏÝïÿÐÞïðÐÞïæÐÞïíÐÞïúÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑÞïÿÀÑéÿª¿áÿ«Àáÿ¬Áâÿ­Ââÿ®Ââÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ³Çäÿ´Èåÿ¶Éæÿ¨¼Ûÿ£¶×ÿ¹ÌçÿºÌçÿ»Íçÿ¼Îçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÄÔëÿÆÖëÿÇ×ìÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿéíóÿõôôÿóóóÿóóóÿáààÿ¤£¡ÿœ›™ÿ›š˜ÿ™˜–ÿ˜—•ÿ–•“ÿ•”’ÿ“’ÿ’‘ÿÿŽŒÿŒŠÿ‹Š‰ÿЉ‡ÿˆ‡†ÿ‡…„ÿ…„ƒÿ„‚ÿ‚ÿ~ÿ~|ÿ~}{ÿf¨hÿjÿmÿpÿsÿvÿzÿ}ÿ€ÿ„ÿ‡ÿ‹ÿÿ“ÿ–ÿ›ÿŸÿ£ÿ§ÿ¬ ÿ° ÿµ ÿ¹ ÿ½ ÿÜ{uÿùúúÿúúúÿúúúÿüûûÿñôùÿÓßðÿÏÝïÿÐÞïÿÐÞïÜÐÞï‰ÐÞï<ÐÞï+ÐÞï4ÐÞïQÐÞï{ÐÞï¬ÐÞïÚÐÞïöÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÑÞïÿÇ×ìÿ®Ââÿ®Ââÿ¯Ããÿ°Äãÿ±Åäÿ²Æäÿ³Çäÿ´ÈåÿµÈåÿ¶Éåÿ¸ËæÿµÈäÿœ°ÒÿµÇãÿ¼Îèÿ½Ïèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÄÔëÿÆÕëÿÇÖëÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïýÐÞïúÐÞïöÐÞïìÒàïäïòöùø÷÷ÿöööÿöööÿÖÖÕÿ¥£¡ÿ¢¡Ÿÿ ŸÿŸžœÿœšÿœ›™ÿš™—ÿ™˜–ÿ—–”ÿ•”’ÿ”“‘ÿ’‘ÿ‘ŽÿŽŒÿŽ‹ÿŒ‹‰ÿЉˆÿ‰‡†ÿ‡†…ÿ†„ƒÿ…ƒ‚ÿƒ€ÿl¨nÿpÿsÿvÿzÿ}ÿÿ„ÿˆÿ‹ÿÿ“ÿ—ÿ›ÿŸÿ¤ÿ¨ ÿ¬ ÿ± ÿµ ÿº ÿ¿ ÿà ÿÈ ÿÔ1&ÿöÝÛÿüýýÿüüüÿüüüÿüüýÿâêõÿÒßðùÒßð—ÐÞï)ÐÞïÐÞïÐÞïIÐÞïƒÐÞï¿ÐÞïêÐÞïÿÐÞïÿÐÞïÿÑÞïÿÈ×ìÿ±Åãÿ±Åäÿ²Æäÿ³Çåÿ´Èåÿ¶Èåÿ·Éæÿ¸Êæÿ¹ËæÿºÌçÿºÌçÿ¢µÖÿ­¿Ýÿ¿Ðéÿ¿ÐéÿÀÑéÿÁÒêÿÂÓêÿÄÔêÿÄÕëÿÆÖëÿÇÖìÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛîÿÍÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞï÷ÐÞïÍÐÞï—ÐÞïsÐÞï`ÐÞïPÐÞï?ÐÞï2Öâñ)ùùú…úúúøùùùÿøøøÿËÊÉÿ©§¥ÿ¨§¥ÿ¦¥£ÿ¥£¡ÿ£¢ ÿ¡ žÿ Ÿÿž›ÿœšÿ›š˜ÿ™˜–ÿ˜—•ÿ–•“ÿ•”’ÿ“’ÿ‘ŽÿÿŽ‹ÿŒ‹Šÿ‹Šˆÿ‰ˆ‡ÿˆ‡†ÿr¨tÿwÿzÿ~ÿÿ…ÿˆÿŒÿÿ”ÿ—ÿœÿ ÿ¤ÿ¨ ÿ­ ÿ² ÿ¶ ÿ» ÿ¿ ÿÄ ÿÉ ÿÎ ÿÓ ÿØÿï—‘ÿýÿÿÿýýýÿþþþÿÿþþÿ÷ùüÿñõúàúüý+ÐÞï ÐÞï3ÐÞïoÐÞï³ÐÞïäÐÞïþÊÙíÿ¶Éåÿ´Èåÿ¶Éåÿ·Éæÿ¸Êæÿ¹ËæÿºÌçÿ»Íçÿ¼Îèÿ½Ïèÿ¼Îçÿ³ÅàÿÀÑéÿÂÓêÿÃÓêÿÄÔëÿÅÕëÿÆÖëÿÇ×ìÿÈ×ìÿÉØìÿÊÙíÿÌÚíÿÍÛîÿÎÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïóÐÞï°ÐÞïSÐÞïÐÞïÿþþ ýýý…üüüøøø÷ÿÂÁ¿ÿ¯­«ÿ®¬ªÿ¬ª¨ÿ«©§ÿ©§¥ÿ§¦¤ÿ¥¤¢ÿ¤¢ ÿ¢¡Ÿÿ ŸÿŸžœÿœšÿœ›™ÿš™—ÿ˜—•ÿ–•“ÿ•”’ÿ“’ÿ’‘ÿÿŽŒÿŒ‹ÿx¨{ÿ~ÿÿ…ÿ‰ÿÿÿ”ÿ™ÿÿ¡ÿ¥ ÿª ÿ® ÿ² ÿ· ÿ¼ ÿÀ ÿÅ ÿÊ ÿÏ ÿÔÿÙÿÞÿã ÿíG:ÿüíìÿþþþÿÿÿÿÿÿÿÿýÿÿÿ¾ÿÿÿEÿÿÿÐÞïÐÞï*ÐÞïiÏÝï³ÂÒêè¹Ëæÿ¹Ìçÿ»Ìçÿ¼Íçÿ½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÑéÿÂÒêÿÃÔêÿÄÕëÿÅÕëÿÆÖëÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÛîÿÎÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞï÷ÐÞï¶ÐÞïOÐÞï ÿÿÿ ÿÿÿ„òòòø¾¼»ÿµ³±ÿ³±¯ÿ²°®ÿ°®¬ÿ¯­«ÿ­«©ÿ¬ª¨ÿª¨¦ÿ¨¦¤ÿ¦¥£ÿ¤£¡ÿ£¢ ÿ¡ žÿ Ÿÿž›ÿœ›™ÿš™—ÿ™˜–ÿ—–”ÿ–•“ÿ”“‘ÿ“’ÿ€¨‚ÿ†ÿ‰ÿÿ‘ÿ•ÿ™ÿÿ¡ÿ¦ ÿª ÿ¯ ÿ³ ÿ· ÿ¼ ÿÁ ÿÆ ÿË ÿÏ ÿÔÿÚÿßÿäÿéÿïÿôÿý³­ÿÿÿÿÿÿÿÿåÿÿÿ{ÿÿÿÒàð ÌÚí4¾Ðè³½Îèÿ¾Ïèÿ¿ÐéÿÀÑéÿÁÒêÿÂÒêÿÃÓêÿÄÔëÿÅÕëÿÆÖëÿÈ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÛîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïýÐÞïéÐÞï¶ÐÞïXÐÞïÿÿÿ äãâx¾½»Ø»¹·ý¹·µÿ·µ´ÿ¶´²ÿ´²°ÿ²°®ÿ±¯­ÿ¯­«ÿ®¬ªÿ¬ª¨ÿ«©§ÿ©§¥ÿ§¥£ÿ¥¤¢ÿ£¢ ÿ¡ žÿ Ÿÿž›ÿœšÿ›š˜ÿ™˜–ÿ˜—•ÿ‡¨ŠÿŽÿ’ÿ•ÿšÿžÿ¢ÿ¦ ÿ« ÿ¯ ÿ³ ÿ¸ ÿ½ ÿÁ ÿÆ ÿË ÿÐ ÿÕÿÛÿßÿåÿêÿðÿõÿúÿýÿÿ^Qûÿôó´ÿÿÿ:ÿÿÿ½Ïè¿Ðé•ÁÒêíÂÓêÿÃÔêÿÄÔëÿÅÕëÿÆÖëÿÇ×ìÿÉØìÿÊÙíÿËÚíÿÌÛíÿÍÛîÿÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïïÐÞïÍÐÞïÐÞïdÐÞï1ÐÞï ¿¾¼!¿½»n¾½»Ç½»ºù¼º¸ÿº¸¶ÿ¸¶´ÿ¶´³ÿµ³±ÿ³±¯ÿ²°®ÿ°®¬ÿ¯­«ÿ­«©ÿ«©§ÿ©¨¦ÿ§¦¤ÿ¦¤¢ÿ¤£¡ÿ¢¡Ÿÿ¡ žÿŸžœÿž›ÿ¨’ÿ–ÿšÿžÿ¢ÿ§ ÿ« ÿ° ÿ´ ÿ¹ ÿ½ ÿ ÿÇ ÿÌ ÿÑÿÖÿÛÿàÿæÿëÿðÿöÿúÿþÿÿÿÿÿÿõÿ9)CÄÔêÃÓê<ÄÕëuÅÕëŸÇÖë¹È×ìÌÊÙíÝËÚíêÌÚíñÍÛîúÎÜîÿÏÝïÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïùÐÞïÄÐÞïzÐÞï:ÐÞïÐÞïÂÀ¾Á¿½[Á¿½¶À¾¼ò¾¼»ÿ¼»¹ÿ»¹·ÿ¹·µÿ·µ´ÿ¶´²ÿ´²°ÿ³±¯ÿ±¯­ÿ°­«ÿ®«©ÿ¬ª¨ÿª¨¦ÿ©§¥ÿ§¥£ÿ¥¤¢ÿ£¢ ÿ˜¨›ÿŸÿ¤ÿ¨ ÿ¬ ÿ± ÿµ ÿº ÿ¾ ÿà ÿÈ ÿÍ ÿÒÿ×ÿÜÿáÿæÿìÿñÿöÿûÿþÿÿÿÿÿÿÿÿìÿ›ÿ"ÍÛëÊÙíÊÙíËÚíÌÛí*ÍÜî<ÏÝïSÐÞïtÐÞï©ÐÞïÞÐÞïüÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïüÐÞïÄÐÞï\ÐÞïÄÂÀ ÃÁ¿GÃÁ¿¢ÂÀ¾éÁ¿½ÿ¿½¼ÿ½¼ºÿ»º¸ÿº¸¶ÿ¸¶´ÿ¶´³ÿµ³±ÿ³±¯ÿ±¯­ÿ°®¬ÿ®¬ªÿ­«©ÿ«©§ÿ©§¥ÿ¡¨¤ÿ¨ ÿ­ ÿ± ÿ¶ ÿº ÿ¿ ÿÄ ÿÉ ÿÎ ÿÓÿØÿÝÿâÿçÿìÿòÿ÷ÿûÿþÿÿÿÿÿÿÿÿñÿ¨ÿ?ÿÐÞïÐÞï$ÐÞïdÐÞï°ÐÞïçÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïùÐÞïËÐÞïjÐÞïÇÅÃÅÃÁ6ÄÂÀŽÄÂÀÝÃÁ¿ÿÂÀ¾ÿÀ¾¼ÿ¾¼»ÿ¼»¹ÿº¹·ÿ¸·µÿ·µ³ÿµ³±ÿ´²°ÿ²°®ÿ±¯­ÿ¯­«ÿª ¨­ ÿ² ÿ· ÿ» ÿÀ ÿÄ ÿÉ ÿÎ ÿÓÿØÿÝÿãÿèÿíÿóÿøÿüÿþÿÿÿÿÿÿÿÿöÿ³ÿJÿÐÞï ÐÞï/ÐÞïkÐÞï¢ÐÞï½ÐÞï½ÐÞïžÐÞïYÐÞïÊÈÆÅÃÁ'ÅÃÁyÅÃÁÐÄÂÀûÃÂÀÿÂÀ¾ÿÁ¿½ÿ¿½»ÿ½»¹ÿ»¹·ÿ¹·¶ÿ·¶´ÿ¶´²ÿ´²°ÿ´ ¨· ÿ¼ ÿÁ ÿÅ ÿÊ ÿÏ ÿÔÿÙÿÞÿäÿéÿîÿóÿùÿüÿþÿÿÿÿÿÿÿÿùÿ¾ÿUÿ ÐÞïÐÞï ÐÞï ÐÞïÅÃÁÅÃÁdÅÃÁ¿ÅÃÁõÅÃÁÿÄÂÀÿÃÁ¿ÿÁ¿½ÿ¿½¼ÿ½¼ºÿ»º¸ÿº¸¶ÿ¾ ¨Á ÿÆ ÿË ÿÐ ÿÕÿÚÿßÿäÿêÿïÿôÿùÿýÿÿÿÿÿÿÿÿÿÿüÿÈÿbÿÅÃÁÅÃÁPÅÃÁ¬ÅÃÁîÅÃÁÿÅÃÁÿÄÂÀÿÃÁ¿ÿÂÀ¾ÿÀ¾¼ÿÈ ¥Ì ÿÑ ÿÖÿÛÿàÿåÿêÿðÿõÿúÿýÿÿÿÿÿÿÿÿÿÿþÿÒÿnÿÅÃÁÅÃÁ>ÅÃÁ˜ÅÃÁãÅÃÁÿÅÃÁÿÅÃÁÿÅÃÁÿÓ•ÖÿÛÿáÿæÿëÿñÿöÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÚÿ{ÿÅÃÁÅÃÁ/ÅÃÁ„ÅÃÁÖÅÃÁþÅÃÁÿÞ“âÿçÿìÿòÿ÷ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿâÿ‡ÿ'ÅÃÁ ÅÃÁpÅÃÁÂé“íÿòÿøÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿéÿ“ÿ/ÿÅÃÁõ“øÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿ ÿ9ÿþ“ÿÿÿÿÿÿÿÿÿÿÿÿÿóÿ¬ÿBÿÿ“ÿÿÿÿÿÿÿÿÿ÷ÿ·ÿOÿ ÿ“ÿÿÿÿÿûÿÁÿ[ÿÿ”ÿûÿËÿeÿÿ{ÿ„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ?ÿÿÿÿÿÿÿÿÿÿÿÿþ ?ÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿà@?ÿÿÿüÿÿÿÿÿ€ÿÿÿüÿÿÿÿÿÿÿÿøÿÿÿÿþÿÿÿðÿÿÿþÿÿÿà?ÿÿÿþÿÿà?ÿÿÿþÿÿÀ?ÿÿÿþÿÿ€ÿÿþÿÿ€ÿÿøÿÿÿÿðÿÿÿÿà€ÿþÿÿàÿþÿÿÀÿüÿÿÀüÿÿÀ?øÿÿÀ?ðÿÿÀðÿÿÀðÿÀàÿàÿÀÿþøðà€?ðøÿüÿÿà?þÿÿøÿÿ€ÿÿüÿÿàÿÿÿ€ÿÿøÿÿÿÿ€ÿÿÿþ?ÿÿÿÿðÿÿÿÿ€ÿÿÿÿÿþÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(@€ @q‘Ìq‘Ì€q‘ÌÓq‘Ìùq‘Ìêq‘ÌdpÌq‘Ìq‘Ìq‘Ìq‘Ì[q‘Ì—q‘Ì€q‘Ì==ÿ;;:ÿ988ÿ766ÿ443ÿ221ÿ[â[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ¦€ÿßßÞÿÆÏÞÿª¿áÿ«Àáÿ¬Áâÿ®Ââÿ¯Ããÿ°Äãÿ²Åäÿ³Çäÿ´Èåÿ¶Éåÿ·Êæÿ¹Ëçÿ¸Ëæÿ¸ËæÿºÌçÿ½ÎèÿÀÑéÿÁÒêÿÂÓêÿÃÔêÿÅÕëÿÆÖëÿÈ×ìÿÉØìÿÊÙíÿÌÛíÿÍÜîÿÎÝîÿÏÝïÿÐÞïÿÈ×ìÿ°Åãÿ¢¹Þÿ£¹Þÿ¥»ßÿ§½àÿª¿áÿ¬Áâÿ®Âãÿ¼ÆÖÿÉÇÆÿÉÈÇÿ˜—–ÿONMÿLKJÿIHHÿGFEÿDDCÿAA@ÿ?>>ÿ=<;ÿ::9ÿ[à[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿYÿz44ÿØÒÑÿÜÞáÿ·Èâÿ¯Ããÿ±Äãÿ²Æäÿ³ÇäÿµÈåÿ¶Éåÿ·Êæÿ¹ËæÿºÌçÿ»Íçÿ¦¼àÿ‘ª×ÿލ×ÿ«Øÿ—°Úÿ§½àÿ¿ÐéÿÇ×ìÿÈ×ìÿÉØìÿËÙíÿÌÛíÿÍÜîÿÏÝîÿÏÝïÿÐÞïÿÐÞïÿÏÝîÿ¿Ðéÿª¿áÿ¥»ßÿ¨½àÿª¿áÿ¬Áâÿ®Ãâÿ°Äãÿ²Æäÿ´ÈåÿÅÌ×ÿÏÍÌÿÌËÊÿˆ‡†ÿVUTÿUTSÿRQQÿPONÿMLKÿJJIÿHGFÿEDDÿCBAÿ[Ø[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ`ÿºœœÿçèçÿÏØåÿ³ÇäÿµÈåÿ¶Éåÿ¸Êæÿ¹ËçÿºÌçÿ¼Íçÿ½Îèÿ¿Ðéÿ¹Ìçÿ‹¦ÕÿžÒÿ„¡Óÿ†¢Ôÿˆ¤Õÿ‹¦ÖÿµÜÿÁÒêÿÌÛîÿÍÜîÿÎÝîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÊÙíÿ¶Éæÿ©¾áÿ©¿áÿ¬Áâÿ®Ããÿ°Äãÿ³ÆäÿµÈåÿ·Êæÿ¹Ëçÿ¼ÍçÿÎÒÙÿÔÓÒÿÌËÊÿ|{zÿ`_^ÿ^]]ÿ\[ZÿYXWÿVUTÿSSRÿQPOÿNMMÿLKJÿ[Ø[ÿ[ÿ[ÿ[ÿ[ÿ[ÿ\ÿ^ÿ_ÿMLÿæãâÿåæéÿÁÐçÿ¸ËæÿºÌçÿ¼Íçÿ½Ïèÿ¾ÐèÿÀÑéÿÁÒéÿÃÓêÿ¾Ïèÿ‘«Øÿˆ¤Õÿ‹¦Öÿލ×ÿª×ÿ’¬Øÿ”­Ùÿ¥»ßÿÊÙíÿÑßïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÝïÿÃÓêÿ±Åäÿ¬Áâÿ®Ããÿ°Åãÿ³ÆäÿµÈåÿ·Êæÿ¹Ëçÿ»Íçÿ½ÏèÿÀÑéÿÃÓéÿÖØÝÿÚÙÙÿÆÅÅÿwvuÿjihÿhgfÿedcÿba`ÿ`_^ÿ]\[ÿZYXÿWVUÿUTSÿ[Ø[ÿ[ÿ[ÿ[ÿ\ÿ^ÿbÿfÿkÿzÿÒ¹¸ÿïðïÿØßëÿ½Ïèÿ¾ÐèÿÀÑéÿÁÒêÿÂÓêÿÄÔêÿÅÕëÿÇÖìÿÈ×ìÿ¯ÃâÿµÜÿœ´Üÿ—°Úÿ—°Úÿ™±Ûÿ›³ÛÿµÜÿ±ÄãÿÃÓéÿÍÜîÿÐÞïÿÐÞïÿÊÙíÿ»Íçÿ°Äãÿ°Äãÿ³ÆäÿµÈåÿ·Êæÿ¹Ìçÿ»Íèÿ¾ÏèÿÀÑéÿÂÓêÿÄÔêÿÆÖìÿËÙëÿÝÞáÿàßßÿ¼»ºÿzxwÿutsÿrqpÿonmÿlkjÿihgÿfedÿdcbÿa`_ÿ^]\ÿ[Ø[ÿ[ÿ\ÿ_ÿbÿgÿlÿrÿxÿ~ÿ´khÿñðïÿìîðÿÊØëÿÂÓêÿÄÔëÿÅÕëÿÇÖìÿÈØìÿÊÙíÿËÚíÿÍÛîÿÌÚíÿ½Ïèÿ¾Ðèÿ¶Éåÿ ·ÝÿŸ·Ýÿ¢¹Þÿ¤ºßÿ¤ºÞÿ µÙÿ²Æäÿ»Íçÿ½ÎèÿµÈåÿ³ÆäÿµÈåÿ·Êæÿ¹Ìçÿ¼Íçÿ¾ÏèÿÀÑéÿÂÓêÿÄÕëÿÆÖëÿÈØìÿËÚíÿÌÛîÿÓÞíÿäåæÿåääÿ±°¯ÿ€ÿ€~}ÿ}{zÿyxwÿvutÿsrqÿponÿmlkÿkihÿhgfÿ[Ø]ÿ_ÿcÿhÿmÿsÿyÿ€ÿ‡ÿŽÿ¢%ÿçÒÑÿö÷öÿàçñÿÇ×ìÿÈØìÿÊÙíÿËÚíÿÌÛîÿÎÜîÿÏÝïÿÐÞïÿÐÞïÿÊÙíÿ´Çåÿ²Åäÿ§¼àÿ¦¼àÿ¨¾àÿ«Àáÿ­Ââÿ£¸Úÿ®Ââÿ³ÆäÿµÈåÿ·ÊæÿºÌçÿ¼Îèÿ¾ÏèÿÀÑéÿÂÓêÿÅÕëÿÇÖìÿÉØìÿËÚíÿÍÜîÿÏÝîÿÐÞïÿÐÞïÿØâîÿëììÿèççÿ¨§¦ÿ‹Š‰ÿЉ‡ÿ‡…„ÿ„‚ÿ~ÿ~|{ÿ{yxÿwvuÿusrÿrqpÿ`Ødÿiÿnÿtÿzÿÿˆÿÿ˜ÿ ÿ©ÿ׋†ÿùúúÿôõ÷ÿÓßïÿÌÛîÿÎÜîýÏÝîèÐÞïìÐÞïûÐÞïÿÐÞïÿÐÞïÿÑßïÿÁÒéÿ©¾áÿ«Àáÿ­Áâÿ¯Ããÿ±Åäÿ³Æäÿ¨»ÜÿµÈäÿºÌçÿ¼Îèÿ¾ÐèÿÀÑéÿÃÓêÿÅÕëÿÇ×ìÿÉØìÿËÚíÿÍÜîÿÏÝîÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÏÞïÿÝæðÿóòóÿæååÿ¥¤¢ÿ—–”ÿ•”’ÿ‘ŽÿŽ‹ÿ‹Šˆÿˆ‡…ÿ…ƒ‚ÿ‚ÿ}|ÿ|{yÿjØoÿuÿ{ÿ‚ÿ‰ÿ‘ÿ™ÿ¢ÿª ÿ³ ÿ»ÿÐ=3ÿ÷èæÿüýýÿèîöÿÒßðÜÐÞïjÐÞï*ÐÞï/ÐÞïTÐÞï‹ÐÞïÄÐÞïîÐÞïÿÊÙíÿ²Åäÿ±Åäÿ´Çäÿ¶Éåÿ¸Ëæÿ²Åáÿ°Ãàÿ¿ÐéÿÀÑéÿÃÓêÿÅÕëÿÇ×ìÿÉØíÿËÚíÿÍÜîÿÏÝîÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïãÐÞï¹ÐÞï£ÏÞïæìô¢úúùøáààÿ¨§¥ÿ£¡ŸÿŸžœÿœ›™ÿ™˜–ÿ–•“ÿ“’ÿŽÿŒ‹Šÿ‰ˆ‡ÿ‡…„ÿwØ|ÿƒÿŠÿ’ÿšÿ¢ÿ« ÿ´ ÿ¾ ÿÇ ÿÑ ÿÜÿô«¥ÿÿÿÿÿûüýáñõúXÐÞïÐÞï6ÐÞïuÌÛÌçð¸ËæÿºÌçÿ¼Îèÿ¿Ðéÿ½ÎçÿÁÒéÿÅÕëÿÇ×ìÿÉØìÿËÚíÿÎÜîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÝÐÞïÐÞï)ÐÞïÐÞïÿÿÿ þþþ‚ÙØ×÷±¯­ÿ®­«ÿ«©§ÿ¨¦¤ÿ¤£¡ÿ¡ žÿžœšÿš™—ÿ—–”ÿ”“‘ÿ‘Žÿ†ØŒÿ“ÿœÿ¤ÿ­ ÿ¶ ÿ¿ ÿÉ ÿÒÿÝÿçÿñÿûVIýÿðï®ÿÿÿ3ÿÿÿÑÞï ÀÑéM¾ÐèÏÁÒéúÃÔêÿÅÕëÿÈ×ìÿÊÙíÿÌÚíÿÎÜîÿÏÝïÿÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïûÐÞïàÐÞïµÐÞïwÐÞï(ÿÿÿ ËÊÈa»¹·À¹¸¶÷·µ³ÿ³±¯ÿ°®¬ÿ¬«©ÿ©§¥ÿ¦¤¢ÿ¢¡ŸÿŸžœÿœ›™ÿ–Øÿ¥ÿ® ÿ· ÿÀ ÿÊ ÿÔÿÞÿéÿóÿûÿþÿÿÊÿ@0%ÃÓêÅÕëNÇ×ìlÊÙíƒÌÛî™ÏÝî½ÐÞïéÐÞïÿÐÞïÿÐÞïÿÐÞïÿÐÞïùÐÞï»ÐÞï\ÐÞï"ÐÞïÂÀ¾À¿½QÀ¾¼­¾¼ºï»¹¸ÿ¸¶´ÿ´²°ÿ±¯­ÿ®¬ªÿ«©§ÿ§¦¤ÿ¨ د ÿ¹ ÿ ÿÌ ÿÖÿàÿëÿôÿûÿÿÿÿÜÿ|ÿÿÑßð ÐÞï0ÐÞïuÐÞï·ÐÞïÏÐÞï±ÐÞïZÐÞïÈÆÄÄÂÀ>ÃÁ¿™ÂÀ¾åÀ¾¼ÿ½»¹ÿ¹·µÿ¶´²ÿ³±¯ÿ¼ ØÃ ÿÍ ÿ×ÿáÿìÿöÿüÿÿÿÿãÿˆÿ'ÐÞïÐÞïÐÞïÌÉÇÆÄÂ.ÅÃÁ„ÄÂÀØÃÁ¿þÁ¿½ÿ¾¼ºÿÐ ÓÙÿãÿîÿ÷ÿýÿÿÿÿêÿ•ÿ0ÿÅÃÁ ÅÃÁoÅÃÁÉÅÃÁøçÏïÿøÿýÿÿÿÿïÿ¢ÿ9ÿÅÃÁÅÃÁRúÏþÿÿÿÿôÿ­ÿDÿÿÑÿ÷ÿ¸ÿOÿ ÿ§ÿjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿÿÿÿÿÀ?ÿÿÿÿÿ€?ÿÿÿÿøÿþÿÿðÿüÿàÿüÿà?ø?þ0?ð?üð?øàøàøÀøÀøðÀ€xÿ€àÿàøÿüÿþÿÿãÿÿ€ÿÿÿÿÿàÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(0` $q‘Ìq‘Ìq‘Ì q‘Ì7q‘̰q‘Ìðq‘Ìñq‘Ìqq‘Ì)q‘Ì+q‘Ì q‘Ì8q‘̪q‘ÌÚq‘̳q‘ÌÍq‘Ìÿq‘Ìÿr’Ìÿs“Íðr’Ìâq‘Ìäq‘̪q‘Ìq‘Ìq‘Ì q‘Ì º[Gq‘ÌWq‘Ìúq‘Ìÿr’Ìÿw–Îÿx–Ïÿs’Íÿ~›Ñÿ˜°Úÿ”­Ùÿª×ÿª¿áÿ¸Ëæÿ®Ââÿ©×ÿv”Ëÿw”Ëÿ{™Ïÿ~œÑÿ€Ñÿ‚žÒÎ… ÓEˆ¤Õ žÿ[®[Š¥Õ}›Ð)q‘Ì q‘Ìvs’Ìÿx—Ïÿ„¡Óÿ„¡Óÿˆ£ÔÿžÒÿ”­ÙÿÀÑéÿºÌçÿ¨½àÿª¿áÿ´Çäÿ ·Ýÿ‚žÑÿ|™Îÿ€Ñÿ‚ŸÒÿ„ Óÿ…¡ÓÿƒŸÐÿˆ¤ÔôŒ§ÖÐŽ¨×K]öÿ[è[W«Àá?µÜÅ|šÐèq‘Ì®u”ÍS}›Ð劥ÕÿªÀáÿ£ºÞÿœ³Ûÿ¨Öÿ”­Ùÿ½Ïèÿ¾Ðèÿ­ÂâÿŽ©×ÿ…¡Óÿ‚ŸÒÿ‚ŸÒÿ„¡Óÿ†¢Ôÿˆ£Ôÿ‰¥Õÿ‡¢ÒÿŠ¥Ôÿ©×ÿ‘«Øÿ“¬ÙË•®ÚÒÿÿ[ó[³[ §½à«¿áΙ²Ûÿ|™Ðÿq‘Ìùq‘Ì}}›ÐÑ’¬ØÿºÌçÿ¶Éåÿ«Àáÿ“­Ùÿ‚ŸÒÿš²Ûÿ¤»ßÿ–¯Úÿƒ Óÿ„ Óÿ†¢Ôÿˆ¤ÔÿŠ¥ÕÿŒ§Öÿ§ÖÿФÓÿލÕÿ“­Ùÿ•®Ùÿ—°Úÿ–¯Ùø—®Øl ·Þ „þÿÿ[ð[ñZ?­ÁâE£¹Þù‘«×ÿ~›Ðÿr’Ìýt“Í÷v•Îÿ†¢Ôÿ¤ºßÿ­Ââÿ§½àÿ‰¤Õÿ€Òÿƒ Óÿ†¢Ôÿ†¢Ôÿˆ¤ÕÿŠ¥ÕÿŒ§Öÿލ×ÿª×ÿ‘«Øÿ‘«×ÿ“¬×ÿ—°Úÿ™±Ûÿš³Ûÿœ³Ûÿ–®ÖÿžµÜõ£¹Þƒ¥»ß-ãÿÿÿ[ï[ÿc©¨›š°Äã;¤ºßóލÖÿ|šÐÿx—Îÿz˜Ïÿ|šÐÿ~›Ñÿˆ¤Ôÿ’¬ØÿŠ¥Õÿ…¡Óÿ‡£Ôÿˆ¤ÕÿŠ¥ÕÿŒ§Öÿލ×ÿª×ÿ’«Øÿ“­Ùÿ•®Ùÿ—°Úÿ™±Ûÿ›³Üÿ´ÜÿŸ¶Ýÿ ·Ýÿ›±ØÿŸ¶Ûÿ¦¼àÿ§½àá­Ã哆t{yx Žÿÿÿÿ[ï[ÿcý¡‹‹Ï·¸·I‹¦ÕAŒ¦Öë~›Ñÿ|šÐÿ~›Ñÿ€ÑÿžÒÿƒ Óÿ…¡Óÿ†¢Ôÿˆ¤ÕÿЦÕÿŒ§ÖÿŽ©×ÿª×ÿ’¬Øÿ”­Ùÿ•¯Ùÿ—°Úÿ™²Ûÿ›³Ûÿ´ÜÿŸ¶Ýÿ ·Þÿ¢¹Þÿ£¹Þÿž´Ùÿ¢¸Üÿª¿áÿ«Àâÿ­Âã÷›¬Ê–”“–†ƒƒÃðÿÿÿÿ[ë[ÿZÿ‡WWÿ´³²ã´²±B|šÐ |šÐi}šÐÜ}›Ñþ€Ñÿ‚ŸÒÿƒ Óÿ…¢Óÿ‡£Ôÿ‰¤Õÿ‹¦Öÿ§ÖÿŽ©×ÿª×ÿ’¬Øÿ”­Ùÿ–¯Úÿ˜°Úÿ™²Ûÿ›³ÛÿµÜÿŸ¶Ýÿ¡¸Þÿ¢¹Þÿ¤»ßÿ¦¼àÿ§¼ßÿ ¶Úÿ§¼Þÿ®Ââÿ¯Äãÿ±Åäÿ²Åäÿ›¥¶þš—–ÿywvÿ ÿÿÿÿÿ[ê[ÿZÿiÿªžÿ¶µ´Å‘¥ÈEœÑ©€Òù‚ŸÒÿ„ Óÿ†¢Ôÿ‡£Ôÿ‰¥Õÿ‹¦Öÿ¨Öÿ©×ÿ‘«Øÿ’¬Øÿ”­Ùÿ–¯Úÿ˜±Úÿš²Ûÿœ³ÜÿµÜÿŸ¶Ýÿ¡¸Þÿ£¹Þÿ¥»ßÿ¦¼àÿ¨¾àÿª¿áÿ¬Áâÿ¦»Ýÿ«¿àÿ²Æäÿ³ÇäÿµÈåÿ¸Êæÿ­¿ÜÿŸ¥ÿŸœ›ÿa`_ÿÿÿÿÿÿ[ê[ÿ[ÿ[ÿ‘ihÿ²¶¾ý‰¢Ðð„ Óÿ†¢Ôÿˆ£ÔÿŠ¥Õÿ‹¦Öÿ¨Öÿ©×ÿ‘«Øÿ“¬Øÿ•®Ùÿ–¯Úÿ˜±Úÿš²Ûÿœ´ÜÿžµÜÿŸ·Ýÿ¡¸Þÿ£ºÞÿ¥»ßÿ§½àÿ©¾áÿ«¿áÿ¬Áâÿ®Âãÿ°Äãÿ±Åãÿ¬¿ßÿµÈåÿ·Êæÿ¹Ëçÿ»Íèÿ´Çæÿ–¨Éÿ¡ ¡ÿ¢ŸžÿIHGÿ ÿ ÿ ÿÿÿ[ê[ÿ[ÿZÿq*)ÿµ¯±ÿ–«Ðÿ‰¥ÕÿŒ§Öÿ¨Öÿª×ÿ‘«Øÿ“¬Øÿ•®Ùÿ—¯Úÿ˜±Úÿš²Ûÿœ´ÜÿžµÝÿ ·Ýÿ¡¸Þÿ£ºßÿ¥»ßÿ§½àÿ©¾áÿ«Àáÿ¬Áâÿ®Ããÿ°Äãÿ²Æäÿ´Çåÿ¶Éåÿ·Êæÿ¹Ëæÿ»Íçÿ½Ïèÿ¿Ðéÿ»Ìçÿ–¯Úÿ•£¾ÿ©¦¥ÿžœ›ÿ554ÿÿÿÿ ÿ ÿ[ê[ÿ[ÿ[ÿ]ÿ¢‚ÿ´¾Îÿ‘ª×ÿ‘«Øÿ“­Ùÿ•®Ùÿ—°Úÿ™±Ûÿš³Ûÿœ´Üÿž¶Ýÿ ·Ýÿ¢¹Þÿ¤ºßÿ¥¼ßÿ§½àÿ©¿áÿ«Àáÿ­Áâÿ®Ããÿ°Äãÿ²Æäÿ´Çåÿ¶Éåÿ¸Êæÿ¹Ìçÿ»Íçÿ½Ïèÿ¿ÐéÿÁÒéÿÃÔêÿ¾ÐèÿµÜÿŒ§Õÿ£«»ÿ°­«ÿ“‘‘ÿ++*ÿÿÿÿÿÿ[ê[ÿ[ÿ[ÿYÿ}<<ÿÅÂÄÿ¤·Öÿ–¯Úÿ™±Ûÿ›³Ûÿ´Üÿž¶Ýÿ ·Ýÿ¢¹Þÿ¤ºßÿ¦¼ßÿ¨½àÿ©¿áÿ«Àáÿ­Ââÿ¯Ããÿ±Åãÿ²Æäÿ´Èåÿ¶Éåÿ¸ÊæÿºÌçÿ¼Íçÿ½Ïèÿ¿ÐéÿÁÒéÿÃÓêÿÅÕëÿÇ×ìÿÁÒéÿ¡¸Þÿ’«Øÿ—¯×ÿ¯²ºÿ¶´²ÿƒ€ÿ++*ÿ''&ÿ$$$ÿ"!!ÿÿÿ[ê[ÿ[ÿ[ÿ[ÿa ÿ´›šÿÁÊ×ÿžµÜÿŸ¶Ýÿ ·Ýÿ¢¹Þÿ¤»ßÿ¦¼ßÿ¨½àÿª¿áÿ¬Àâÿ­Ââÿ¯Ããÿ±Åãÿ³ÆäÿµÈåÿ¶Éæÿ¸ËæÿºÌçÿ¼Îçÿ¾ÏèÿÀÑéÿÁÒêÿÃÔêÿÅÕëÿÇ×ìÿÉØìÿËÚíÿÀÑéÿ¢¹Þÿ˜°Úÿ›³Üÿ¢¶×ÿ¹¹½ÿ»¸·ÿponÿ322ÿ211ÿ/..ÿ,++ÿ)((ÿ&&%ÿ[ê[ÿ[ÿ[ÿ[ÿYÿ‹RRÿÔÓÔÿ±ÂÝÿ¤ºßÿ¦¼àÿ¨¾àÿª¿áÿ¬Áâÿ®Ââÿ¯Ããÿ±Åäÿ³ÇäÿµÈåÿ·Êæÿ¹Ëçÿ»Íçÿ¼Îèÿ¾ÏèÿÀÑéÿÂÒêÿÃÔêÿÅÕëÿÇ×ìÿÉØìÿËÚíÿÍÜîÿÍÛîÿ¼Îçÿ£¹ÞÿžµÜÿ¡¸Þÿ¤»ßÿ®¾ØÿÂÁÁÿ»¹¹ÿba`ÿ?>=ÿ=<<ÿ:98ÿ765ÿ332ÿ00/ÿ[ê[ÿ[ÿ[ÿ[ÿZÿgÿÆ´´ÿÎÕàÿ¬Àáÿ¬Áâÿ®Ââÿ°Äãÿ±Åäÿ³ÇäÿµÈåÿ·Êæÿ·Êæÿ²Æäÿ²Æäÿ¶Éåÿ¾ÏèÿÂÓêÿÄÔêÿÅÕëÿÇ×ìÿÉØíÿËÚíÿÍÛîÿÎÝîÿÐÞïÿÉÙìÿ³Çäÿ¤ºßÿ¤»ßÿ¨½àÿªÀáÿ­ÂãÿºÆÙÿÊÈÈÿ¶´³ÿ\[ZÿLKJÿIHGÿEEDÿBAAÿ?>=ÿ<;:ÿ[æ[ÿ[ÿ[ÿ[ÿ[ÿZÿœlkÿáâãÿ¿Íãÿ±Åäÿ´ÇåÿµÈåÿ·Êæÿ¹Ëçÿ»Íçÿ½ÎèÿŸ·Ýÿ‡£Ôÿˆ¤Õÿ¨Öÿœ´Üÿ¼ÎèÿÊÙíÿËÚíÿÍÜîÿÎÝîÿÏÞïÿÐÞïÿÏÝïÿÁÒéÿ­Ââÿ¨½àÿ«Àáÿ®Ââÿ±Åãÿ´Çåÿ¶ÉæÿÅÎÛÿÒÑÐÿ«ª©ÿ_^]ÿYXWÿUTTÿRQPÿNMLÿKJIÿGGFÿ[ã[ÿ[ÿ[ÿ[ÿ\ÿ]ÿv##ÿÙÌËÿÚáéÿ¹Ëæÿ¹Ëçÿ»Íçÿ½Ïèÿ¿ÐéÿÁÒéÿÁÒêÿ™²Ûÿ‡£Ôÿ‹¦ÕÿŽ©×ÿªØÿž¶ÝÿÅÕëÿÑßïÿÐÞïÿÐÞïÿÐÞïÿËÚíÿ¹Ìæÿ­Ââÿ®Ââÿ±Åäÿ´Çåÿ·ÊæÿºÌçÿ½ÎèÿÀÑéÿÐÖßÿÙØ×ÿŸžÿhgfÿfedÿba`ÿ^]\ÿ[ZYÿWVUÿTSRÿ[ã[ÿ[ÿ\ÿ^ÿcÿiÿqÿ»ˆ‡ÿíïðÿÌØêÿ¾ÐéÿÁÒéÿÃÓêÿÄÕëÿÆÖëÿÉØìÿ¹Ëæÿ¥»ßÿ¢¹Þÿ™²Ûÿš³ÛÿµÜÿª¿áÿ½ÎçÿÉÙíÿÌÛîÿÃÓêÿµÈåÿ±Åäÿ´Èåÿ·ÊæÿºÌçÿ½ÏèÿÀÑéÿÃÓêÿÆÖëÿÉØìÿÛßäÿÝÜÛÿ—–•ÿvusÿtrqÿpnmÿljiÿhgfÿdcbÿ`_^ÿ[ã\ÿ_ÿdÿkÿrÿ{ÿ‚ÿ£95ÿíâáÿåëòÿÇÖëÿÆÖìÿÈØìÿÊÙíÿÌÛîÿÎÜîÿÏÝîÿÂÓêÿ¹Ëçÿ¨¾àÿ£ºÞÿ§¼àÿ¨½àÿ£¸Ûÿ²Æäÿ¶ÉæÿµÈåÿ·Êæÿ»Íçÿ½ÏèÿÀÑéÿÃÔêÿÆÖëÿÉØìÿÌÛíÿÎÜîÿÑÞïÿåèëÿÜÛÛÿ•”“ÿ…ƒ‚ÿ‚€ÿ}|{ÿyxwÿutsÿqpoÿnmlÿaãeÿlÿtÿ|ÿ†ÿÿšÿ§ ÿߦ£ÿ÷úûÿÙãñÿËÚíÿÎÜîèÏÝïàÐÞïóÐÞïÿÐÞïÿÍÜîÿ³Æäÿª¿áÿ­Áâÿ°Äãÿ±Åãÿ«¾Þÿ·Êæÿ»Íçÿ¾ÏèÿÁÒéÿÄÔêÿÇÖëÿÉÙìÿÌÛîÿÎÜîÿÏÝïÿÐÞïÿÐÞïÿÔáðÿïðòÿØØ×ÿ›š˜ÿ”“‘ÿÿŒŠ‰ÿˆ†…ÿ„‚ÿ~}ÿ|zyÿoãuÿ~ÿˆÿ’ÿÿ¨ ÿ´ ÿÀÿÚTKÿûôóÿñõùÿØãò¢ÐÞï.ÐÞïÐÞï>ÐÞïrÐÞï°ÐÞïã¿Ðéý²Æäÿ¶Éåÿ¹Ëçÿ¶Èäÿ¸ÉäÿÁÒêÿÄÔëÿÇ×ìÿÊÙíÿÌÛîÿÎÝîÿÐÞïÿÐÞïÿÐÞïúÐÞïÇÐÞï†ÐÞïjÙäñbùùúÅÔÓÒÿ§¦¤ÿ£¢ ÿŸžœÿš™—ÿ–•“ÿ’‘ÿŽ‹ÿЉ‡ÿã‰ÿ”ÿŸÿª ÿ¶ ÿà ÿÐ ÿÝÿìÿü»¶îÿÿÿ‡ÿÿÿÐÞïÑßï'ÃÔêi¼ÎçÖ¿ÐéþÂÒêÿÄÔëÿÈ×ìÿÊÙíÿÍÛîÿÏÝîÿÐÞïÿÐÞïÿÐÞïüÐÞïåÐÞï¸ÐÞïaÐÞïþýý'ËÉÈ©¶´²ï³±¯ÿ¯­«ÿª¨¦ÿ¥¤¢ÿ¡ žÿ›™ÿ˜—•ÿ—ã¡ÿ­ ÿ¹ ÿÅ ÿÓÿàÿîÿøÿþìÿ9)uÿÿÿÁÒê%ÄÔë^È×ìzËÚíÎÝîµÐÞïæÐÞïÿÐÞïÿÐÞïöÐÞï¸ÐÞï]ÐÞï'ÐÞï ¸µ³¿½¼=¾½»–½»¹â¹¸¶ÿµ³±ÿ±¯­ÿ¬ª¨ÿ¨¦¤ÿ± ã» ÿÈ ÿÕÿãÿðÿúÿþïÿ£ÿ<ÿÒàðÐÞï,ÐÞïgÐÞï€ÐÞïNÐÞïØÖÓÅÃÁ*ÃÁ¿}ÂÀ¾Ñ¿½¼ü¼º¸ÿ¸¶´ÿÌ áØÿæÿòÿûÿÿòÿ«ÿCÿÆÄÂÅÃÁdÄÂÁ¾ÃÁ¿óëÝôÿüÿÿõÿ²ÿJÿ ÆÄÂÅÃÁDþßÿöÿ¸ÿPÿ ÿ°ÿfÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿàÿÿÿÿ?þÿþüþüâø?Âð?ÀðÀàÀ€€ ð~?þÿ€ÿïÿðÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ q‘Ì1q‘ÌXq‘Ìaq‘Ì×q‘Ìõq‘Ì’q‘Ìmq‘Ì0q‘Ì q‘Ì+q‘ÌRq‘ÌÜq‘Ìøq‘Ìót”Íÿy—Ïÿ|šÐþs“Íýq‘ÌÎs’ÌJw–Î[ q‘Ìq‘Ì­q‘Ìés’Íéq‘Ìÿw–ÎÿœÑÿŠ¥ÕÿŸ¶Ýÿ™±Úÿz˜Ïÿt“Ëÿy—Îö}›Ñ»žÒ#œ[b[ލÖ|šÐq‘ÌTs“Íý}›Ðÿ‚ŸÒÿœÑÿš²Ûÿ²Åäÿ¤ºßÿ±Åãÿœ´Ûÿ}šÎÿ~›Ðÿ‚ŸÒÿƒ Òÿ†¢ÓÏŒ§Ö~©× tú[Ä[¬Áâ!žµÜµz™ÏÞr’ÌžÒߤºßÿ¨½àÿ”­Ùÿš²Ûÿ¸Êæÿ ·Ýÿ‡£Ôÿ„ Óÿ…¡Óÿˆ¤Õÿ‰¤ÔÿŠ¥Óÿ©×ÿ“¬Øû”­Ø\-áÿ[ó[h©¾áq˜±Úÿz˜Ïÿs’Íâ}šÐó¡·Ýÿ®Ââÿ”­ÙÿƒŸÓÿ¨Öÿ‰¥Õÿˆ£Ôÿ‹¦Öÿލ×ÿª×ÿªÖÿ•®Ùÿ™±Ûÿ™±Úÿ›²ÙÚ£ºßF˜ÿÿ[øb ÒŸˆ‡BÏå壺ÞqŽ©×ÿ{™Ðÿ{™Ðÿ}›Ñÿ…¢ÔÿލÖÿ‡£Ôÿˆ¤Õÿ‹¦Õÿލ×ÿ‘«Øÿ“­Ùÿ–¯Úÿ™±Ûÿœ´ÜÿŸ¶ÝÿŸ¶Üÿž´Úÿ¦¼ßÿ¨¾á°šœ¢&IGF]ëÿÿ[ó^ÿ•uu鸺¸W“ º}šÐ>ÑÁÑÿ€žÒÿƒ Óÿ†¢Ôÿ‰¤Õÿ‹¦ÖÿŽ©×ÿ‘«Øÿ”­Ùÿ—¯Úÿ™²Ûÿœ´ÜÿŸ¶Ýÿ¢¸Þÿ¥»ßÿ¤ºÞÿ¤¹Üÿ«Àáÿ°Ääÿª¼Ù󚛟âZXWùÿÿÿ[ñZÿy;:ÿ±®¯ÛŠ£Î‘žÒè„ Óÿ†¢Ôÿ‰¥ÕÿŒ§Öÿ©×ÿ’«Øÿ”®Ùÿ—°Úÿš²Ûÿ´ÜÿŸ¶Ýÿ¢¹Þÿ¥»ßÿ§½àÿª¿áÿ¬Áâÿ©¾Þÿ²ÅãÿµÈåÿ·Êçÿ¤±Çÿž››ÿCBAÿÿÿÿ[ñ[ÿa ÿ¡’ÿ’ªÓÿ‰¥ÕÿŒ§Öÿ©×ÿ’¬Øÿ•®Ùÿ—°Úÿš²ÛÿµÜÿ ·Ýÿ¢¹Þÿ¥»ßÿ¨¾àÿ«Àáÿ­Ââÿ°Äãÿ³ÆäÿµÈåÿ¶Éåÿ»Íçÿ¾Ïèÿ¦¼àÿœ¥¹ÿš™ÿ211ÿÿ ÿ ÿ[ñ[ÿYÿ‡QPÿ­¸Íÿ’¬Øÿ•®Ùÿ˜°Úÿ›³ÛÿµÜÿ ·Ýÿ£¹Þÿ¥¼ßÿ¨¾àÿ«Àáÿ®Ââÿ°Äãÿ³Çäÿ¶Éåÿ¹Ëæÿ»Íçÿ¾ÐèÿÁÒêÿÃÔêÿ®Ããÿ“«Öÿ©®¸ÿ•“‘ÿ-,,ÿÿÿÿ[ñ[ÿZÿhÿ¶©®ÿ¥ºÜÿµÝÿ ·Ýÿ£ºÞÿ¦¼ßÿ©¾àÿ«Àâÿ®Ãâÿ±Åãÿ´Çåÿ¶Éæÿ¹Ëçÿ¼Îçÿ¿ÐéÿÁÒêÿÄÔëÿÇ×ìÿÇ×ìÿ±Åäÿš²Ûÿž³×ÿ¸¹½ÿˆ††ÿ221ÿ-,,ÿ(((ÿ$$$ÿ[ñ[ÿ[ÿZÿšlkÿÂÍÝÿ¦¼àÿ©¾áÿ¬Áâÿ®Ããÿ±Åäÿ´Èåÿ¶Éåÿ¹Ëæÿ½Îèÿ¿ÐéÿÂÒêÿÄÕëÿÇ×ìÿÊÙíÿÍÛîÿÇ×ìÿ°Äãÿ¡¸Þÿ¤ºßÿ¯¿ÚÿÃÂÃÿ|zzÿA@?ÿ==<ÿ887ÿ443ÿ[ï[ÿ[ÿZÿq%%ÿÍÅÉÿ¹Êäÿ±Åäÿ´Èåÿ·ÊæÿºÍçÿ¬Áâÿ•®Ùÿ™±Ûÿ­ÁâÿÆÖëÿËÚíÿÍÛîÿÏÝïÿÎÝîÿÁÒéÿ­Ââÿ©¾áÿ®Ââÿ²Æäÿ¿ËÞÿÉÈÇÿutsÿSRRÿOONÿJIIÿEEDÿ[í[ÿ[ÿ]ÿcÿ¶‹ŠÿÖßëÿºÌçÿ½ÏèÿÀÑéÿÃÔêÿ¬Áâÿ©×ÿª×ÿ–¯Ùÿ´ÈåÿÍÛíÿÐÞïÿËÚíÿ»Íçÿ°Äãÿ²Æäÿ·Êæÿ»Íçÿ¿ÑéÿÏ×äÿÊÈÈÿxwvÿhgfÿcbaÿ]\[ÿXWVÿ[í^ÿcÿmÿwÿŸ=9ÿçàâÿÌÚíÿÅÕëÿÈØìÿËÚíÿÊÙíÿ¹Ìçÿ¨½àÿ¢¸Þÿ¦¼ßÿ¯Ãáÿ¼Îèÿ¸Ëæÿ·Êæÿ¼ÎèÿÀÑéÿÅÕëÿÉØìÿÌÛîÿÞäìÿÇÆÅÿ„ƒ‚ÿ}|zÿwvuÿqpoÿljiÿfíoÿ{ÿ‰ÿ˜ÿ¬ÿå­©ÿçðøÿÎÜî×ÏÝî§ÐÞïÄÑÞïëÇ×ìÿ¯Ããÿ°Äãÿ±Åãÿ²Äâÿ¼ÎèÿÁÒéÿÅÕëÿÉÙìÿÍÛîÿÏÝïÿÐÞïèÐÞïÕéîóêÆÅÄÿ˜—•ÿ’‘ÿŒ‹‰ÿ†…ƒÿ€~ÿíŒÿœÿ­ ÿ¿ ÿÓ ÿîYNÿûñòºæîö/×äòÐÞï ÐÞï0ËÚím»ÍçȽÏèùÀÑéÿÅÕëÿÊÙíÿÍÜîÿÏÝïÿÐÞïòÐÞïÎÐÞï|ÐÞï,ÑÞïõö÷DÅÃÂȯ®¬úª¨¦ÿ£¡Ÿÿœ›™ÿ–•“ÿ¡í° ÿà ÿ×ÿêÿ÷ðý  ÿwkÂÓêÅÕëJÊÙíbÏÝïŒÐÞïËÐÞïÚÐÞï–ÐÞï>ÐÞï¾¼º¾¼º\¼»¹·¹·µó´²°ÿ®¬ªÿÉ ìÛÿîÿùóþ¬ÿDÿÐÞïÐÞïÐÞïÊÈÆ ÅÃÁEÃÁ¿ Á¿½äóëûôÿ²ÿKÿ ËÉÇÆÄÂ)ÿ·ÿ`ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÀþÿÀþ~|~8>øÀÿðÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(  nŽËpÌkp‘Ì·w–Îìx–ÎÈr‘Ìfu”Í [“­Ø u”Î4y—ÏÈ}›ÐôŽ©×ÿ›³Ûÿ‰¤Ôÿ{™Ïôƒ Ò£Œ§Ö*u\}9™±Ú…z˜ÏÏŽ©×ò›³Ûÿ˜°Úÿ’¬ØÿŠ¥ÕÿŒ§Öÿ‘«×ÿ—°ÙÀ°Êô>ëa æ’mlfŠ©×"ˆ¤ÔÈÑÿ†¢Ôÿލ×ÿލ×ÿ“­Ùÿ™±Ûÿž¶Ýÿ¡¸Ýÿ¨½àþ£®Ã¬$##Èÿ[û…X[ï¨ÒÖ‰¤Õý©×ÿ”®Ùÿš²ÛÿŸ·Ýÿ¥»ßÿªÀáÿ¯Ããÿ´Çäÿ²Åãÿ™ž©ÿ+*)ÿÿZøn$%ÿ¡§Áÿ›´Ýÿ ·Ýÿ¦¼ßÿ¬Áâÿ±Åäÿ¶Éåÿ¼ÎèÿÂÒêÿ¼Îèÿ¥¹Ûÿ•—žÿ210ÿÿ[ø\ÿ ˆÿ³Çåÿ±Åäÿ±Åäÿ§¼àÿ¹ËæÿÈ×ìÿÊÙíÿ¿Ðéÿ­Áâÿ³Äßÿš›œÿJIHÿ@?>ÿ\÷aÿ’><ÿÎÑßÿÃÔëÿÀÑéÿ¢¹Þÿ§½àÿÁÒéÿ¿Ðéÿ¹Ëçÿ¿ÑéÿÏÚéÿ¥¤£ÿnmlÿedcÿz÷“ÿº ÿ禤áÔãóuÐÞï|½ÏèÁ¶Éåñ¿ÐèþÇ×ìþÌÛîàÎÝïžÜä튵³²àš™—ÿÿ ùÝòñ­ü:+;ÃÓêÇÖë6ÏÝï`ÑÞïdÑßï#Õãò¾¼º*º¸¶~¶´²Ì÷½ÿYÿ ÊÈÆÿÿÿÿÿÿþ?øà` þÿÿÿÿÿfldigi-4.1.06/data/win32/fldigi.ico0000644000175000017500000001307613472116043013576 00000000000000@@((@€ÿÿÿÿ€€€@@@ÀÀÀ   ààà___÷ÐÐÐ///°°°oooðððPPPèèèØØØ'''ÈÈÈ777¸¸¸HHH¨¨¨˜˜˜gggˆˆˆwwwWWW  õõõììì äääÜÜÜÔÔÔ###ÌÌÌÄÄÄ;;;¼¼¼DDD´´´LLL¬¬¬¤¤¤œœœccc”””kkkŒŒŒsss„„„{{{,,,222SSS\\\òòòîîîêêê æææ âââÞÞÞÚÚÚÖÖÖÒÒÒ!!!ÎÎÎ%%%ÊÊÊ)))ÆÆÆÂ¾¾¾999ººº¶¶¶FFF²²²JJJ®®®NNNªªª¦¦¦UUU¢¢¢žžžšššaaa–––’’’iiiŽŽŽmmmŠŠŠqqq†††uuu‚‚‚yyy~~~ôôôñññïïïííí ëëë éééçççåååãããáááßßßÝÝÝÛÛÛÙÙÙ×××ÕÕÕ$$$ÓÓÓ&&&ÑÑÑÏÏÏÍÍÍËËË111ÉÉÉÇÇÇÅÅÅ888ÃÃÃ<<<ÁÁÁ¿¿¿???½½½AAA»»»EEE¹¹¹GGG···IIIµµµKKK³³³±±±¯¯¯QQQ­­­RRR«««VVV©©©§§§¥¥¥]]]£££^^^¡¡¡ŸŸŸbbb›››™™™hhh———lll•••nnn“““‘‘‘ttt‹‹‹xxx‰‰‰zzz‡‡‡|||………}}}ƒƒƒþ}}I‰>>(Q(vvv v+Q(w{I‘‡wv=2³Hº_ºi¾¶½3²;°–>‰…v{EvÙ7N€'‚‚,TdF†'‚TÄÉ{E‰EƒcÅ’ŒN‚Ž„~«P¢o<EKyG¹9RN FP|%Š*\·Ò‡KKG…41ZPR‚FD'FŠš3\͘‘Ev((…?Ã;3ŒJ„D‚FD† §À5?>I>&‡½ÎZ•ˆ€H’‚§'J-³×‡Evv{IÌ_1 €H|© •L¯Z©Myvvv>v‹ÂY\œ†ŽDFF€D€›« Ìkyv}}‡•-T‚„F„F’~N§ž§s }}>ƒVY§‚N€]'‚Žf¤¯ÅOyvKÄ\¿TŸ‚„„zJ€ž41¼‹>wKy‹¤]F‚PL„~~ºXÈ«ÎU…GEv“sR¹gJF†~'„D s_¹“yEybR_¿H†—'CL*~—/`Ev¬,»ºHg‚$ŒX% ØZ¬Gw¡ž*Š€„a'½FŒ—Ž¢¡K>vvvyy(Ô›%”Zh±oÔ¢)/q…y}>>v}˜S(Kƒ‰Uƒ‹K v¡O‡>v=ˆÃÈkÑ2ÎÈjzÒ(wO‡–¾5¤%'LL†)„ˆ'L~œ7K {¬r4jTZ\CF‚„ ]”5? v&E¦:Ñ”ž'À€Šx„'™J1Ÿ Ô}vw>y{£pf¯¤Ÿ„€FxF*ŒX×gÙ‹wwy{>wK´l»n< ‚%%)DˆZ×Êq{v‹Gy&uTÊÉ—™FH| ¹”£˜}K vvK Ï¥•%†„ˆ''z½­5›´I}{vƒw·XLŒ~FH€%D 3ÀÕ‡yI(>u”šŒF%N«Hp¥DŠNŸ´y&wIªŽ‚±dk9‚HHN­IwvwvIk F›V¥¿Ë½\)ˆzm6‡&‹>wv@È›€)—F Ù‚'~±tyvyv…E[ÌÕ­TÄž|„HF~ˆ”HÓ8ÆOyI>gÓ¥’­„Ž)F‚NLÃÐ>&>}yù§ˆD1‚„HHŠŽ1¤ n ‘y>’¥X„€—ŽJ’Œ|_-—^yIvvwv^VN„‚,fXˆ3aFH'’YGvvvwwv¸¿†1BnÏ 8»|BywI vI u‰G…G|vv‰…}}EES‡ ww{( vvKI v{v¨ÙÕ9ÇAnÎÈD¼‡www £·1L†—/¥]„€ º.y>>v‘n§ÖŸR%H\ž% ¢¥i>>…yÎÓ­§N†„ŒŒH™”¯±n{IwwÇÈ«’€¿JV¯/J)ZµcÁIwwb1s5¤F-HH c€ ½Î_`w>{®ÈÖV'_R„ŒŽž×ÕÕ¦v=ÉcËĤ›ˆŽ%„H†šÂØØA wK!\-P”ŠN™)ž15^y¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦e3PŒ)— _•a×N)Œ de¦¦¦¦¦¦ª0¦¦¦¦¦¦¦¦¦¦¦¦¦¦ÚÚÚÚÚ" #WWQfldigi-4.1.06/data/win32/fldigi.nsi0000644000175000017500000002057113472116043013613 00000000000000# -*- conf -*- # NSIS installer script based on example2.nsi from the nsis-2.44 distribution. # Copyright (c) 2009 Stelios Bounanos, M0GLD. # License: GPLv3+: GNU GPL version 3 or later. # Variables !define FLDIGI_DESCRIPTION "${FLDIGI_NAME} ${FLDIGI_VERSION}" !define FLDIGI_STRING "${FLDIGI_NAME}-${FLDIGI_VERSION}" !define FLARQ_DESCRIPTION "${FLARQ_NAME} ${FLARQ_VERSION}" !define FLARQ_STRING "${FLARQ_NAME}-${FLARQ_VERSION}" !ifdef HAVE_FLDIGI !define PRODUCT_BINARY "${FLDIGI_BINARY}" !define PRODUCT_NAME "${FLDIGI_NAME}" !define PRODUCT_VERSION "${FLDIGI_VERSION}" !define PRODUCT_STRING "${FLDIGI_STRING}" !define PRODUCT_DESCRIPTION "${FLDIGI_DESCRIPTION}" !else ifdef HAVE_FLARQ !define PRODUCT_BINARY "${FLARQ_BINARY}" !define PRODUCT_NAME "${FLARQ_NAME}" !define PRODUCT_VERSION "${FLARQ_VERSION}" !define PRODUCT_STRING "${FLARQ_STRING}" !define PRODUCT_DESCRIPTION "${FLARQ_DESCRIPTION}" !else !error "Either HAVE_FLDIGI or HAVE_FLARQ must be defined" !endif # Compression options SetCompressor /SOLID lzma # This function is called before displaying the first installer page. # It aborts the installation if the Windows version is too old. !include WinVer.nsh Function .onInit ${IfNot} ${AtLeastWin2000} MessageBox MB_ICONSTOP "Sorry, your Windows version is too old.$\n${PRODUCT_NAME} requires Windows 2000 or later." Abort ${EndIf} FunctionEnd # The name of the installer Name "${PRODUCT_DESCRIPTION}" # The file to write OutFile ${INSTALLER_FILE} # The default installation directory InstallDir $PROGRAMFILES\${PRODUCT_STRING} # Registry key to check for directory (so if you install again, it will # overwrite the old one automatically) !define INSTALL_DIR_REG_KEY SOFTWARE\${PRODUCT_STRING} InstallDirRegKey HKLM "${INSTALL_DIR_REG_KEY}" "Install_Dir" # Request application privileges for Windows Vista RequestExecutionLevel admin # License LicenseText "${PRODUCT_NAME} is distributed under the GNU GPL as detailed \ below. You must abide by the terms of this license if you modify or \ redistribute the program." "Continue" LicenseData "${LICENSE_FILE}" SubCaption 0 ": License Information" # Other options BrandingText " " InstProgressFlags smooth VIAddVersionKey ProductName "${PRODUCT_NAME}" VIAddVersionKey ProductVersion "${PRODUCT_VERSION}" VIAddVersionKey FileVersion "${PRODUCT_VERSION}" VIAddVersionKey FileDescription "${FLDIGI_DESCRIPTION} installer" VIAddVersionKey LegalCopyright "Fldigi developers" VIAddVersionKey OriginalFilename "${INSTALLER_FILE}" VIProductVersion "3.0.0.0" WindowIcon off XPStyle on # Installer pages Page license Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles # Registry uninstall path !define REG_UNINSTALL_PATH Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_STRING} # This is a hidden section and is always selected. It writes the uninstall # registry keys and uninstaller binary. Section -install # Set output path to the installation directory. SetOutPath $INSTDIR # Write the installation paths into the registry WriteRegStr HKLM "${INSTALL_DIR_REG_KEY}" "Install_Dir" "$INSTDIR" # Write the uninstall keys for Windows WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "DisplayName" "${PRODUCT_DESCRIPTION}" WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "DisplayIcon" '"$INSTDIR\${PRODUCT_BINARY}"' WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "HelpLink" "${SUPPORT_URL}" WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "Publisher" "Fldigi developers" WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "URLUpdateInfo" "${UPDATES_URL}" WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKLM "${REG_UNINSTALL_PATH}" "QuietUninstallString" '"$INSTDIR\uninstall.exe" /S' WriteRegDWORD HKLM "${REG_UNINSTALL_PATH}" "NoModify" 1 WriteRegDWORD HKLM "${REG_UNINSTALL_PATH}" "NoRepair" 1 WriteUninstaller "uninstall.exe" SectionEnd !ifdef HAVE_FLDIGI Var WANT_FLDIGI !endif !ifdef HAVE_FLARQ Var WANT_FLARQ !endif # This section is present (and required) if the installer contains fldigi. !ifdef HAVE_FLDIGI Section "Fldigi" SectionIn RO SetOutPath $INSTDIR File "${FLDIGI_BINARY}" !ifdef FLDIGI_LOCALE_DIR File /r "${FLDIGI_LOCALE_PATH}/${FLDIGI_LOCALE_DIR}" !endif StrCpy $WANT_FLDIGI "true" SectionEnd !endif # This section is present if the installer contains flarq. It is optional if # the installer also contains fldigi. !ifdef HAVE_FLARQ Section "Flarq" !ifndef HAVE_FLDIGI SectionIn RO !endif SetOutPath $INSTDIR File "${FLARQ_BINARY}" StrCpy $WANT_FLARQ "true" SectionEnd !endif # Start Menu path !define SM_PATH_BASE $SMPROGRAMS\${PRODUCT_NAME} !define SM_PATH ${SM_PATH_BASE}\${PRODUCT_STRING} # The following sections are optional Section "Start Menu Shortcuts" CreateDirectory "${SM_PATH}" !ifdef HAVE_FLDIGI ${If} $WANT_FLDIGI == 'true' CreateShortCut "${SM_PATH}\${FLDIGI_NAME}.lnk" "$INSTDIR\${FLDIGI_BINARY}" "" "$INSTDIR\${FLDIGI_BINARY}" 0 CreateShortCut "${SM_PATH}\${FLDIGI_NAME} Beginners' Guide.lnk" "${GUIDE_URL}" CreateShortCut "${SM_PATH}\${FLDIGI_NAME} Documentation.lnk" "${FLDIGI_DOCS_URL}" ${EndIf} !endif !ifdef HAVE_FLARQ ${If} $WANT_FLARQ == 'true' CreateShortCut "${SM_PATH}\${FLARQ_NAME}.lnk" "$INSTDIR\${FLARQ_BINARY}" "" "$INSTDIR\${FLARQ_BINARY}" 0 CreateShortCut "${SM_PATH}\${FLARQ_NAME} Documentation.lnk" "${FLARQ_DOCS_URL}" ${EndIf} !endif CreateShortCut "${SM_PATH}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 SectionEnd Section "Desktop Shortcuts" !ifdef HAVE_FLDIGI ${If} $WANT_FLDIGI == 'true' CreateShortCut "$DESKTOP\${FLDIGI_DESCRIPTION}.lnk" "$INSTDIR\${FLDIGI_BINARY}" "" \ "$INSTDIR\${FLDIGI_BINARY}" 0 ${EndIf} !endif !ifdef HAVE_FLARQ ${If} $WANT_FLARQ == 'true' CreateShortCut "$DESKTOP\${FLARQ_DESCRIPTION}.lnk" "$INSTDIR\${FLARQ_BINARY}" "" \ "$INSTDIR\${FLARQ_BINARY}" 0 ${EndIf} !endif SectionEnd # This is unselected by default Section /o "Quick Launch Shortcuts" !ifdef HAVE_FLDIGI ${If} $WANT_FLDIGI == 'true' CreateShortCut "$QUICKLAUNCH\${FLDIGI_DESCRIPTION}.lnk" "$INSTDIR\${FLDIGI_BINARY}" "" \ "$INSTDIR\${FLDIGI_BINARY}" 0 ${EndIf} !endif !ifdef HAVE_FLARQ ${If} $WANT_FLARQ == 'true' CreateShortCut "$QUICKLAUNCH\${FLARQ_DESCRIPTION}.lnk" "$INSTDIR\${FLARQ_BINARY}" "" \ "$INSTDIR\${FLARQ_BINARY}" 0 ${EndIf} !endif SectionEnd # Uninstaller Section "Uninstall" # Remove registry keys DeleteRegKey HKLM "${REG_UNINSTALL_PATH}" DeleteRegKey HKLM "${INSTALL_DIR_REG_KEY}" # Remove files and uninstaller !ifdef HAVE_FLDIGI Delete /REBOOTOK $INSTDIR\${FLDIGI_BINARY} !ifdef FLDIGI_LOCALE_DIR RMDir /r /REBOOTOK $INSTDIR\${FLDIGI_LOCALE_DIR} !endif !endif !ifdef HAVE_FLARQ Delete /REBOOTOK $INSTDIR\${FLARQ_BINARY} !endif Delete /REBOOTOK $INSTDIR\uninstall.exe # Remove shortcuts, if any Delete "${SM_PATH}\*.*" !ifdef HAVE_FLDIGI Delete "$DESKTOP\${FLDIGI_DESCRIPTION}.lnk" Delete "$QUICKLAUNCH\${FLDIGI_DESCRIPTION}.lnk" !endif !ifdef HAVE_FLARQ Delete "$DESKTOP\${FLARQ_DESCRIPTION}.lnk" Delete "$QUICKLAUNCH\${FLARQ_DESCRIPTION}.lnk" !endif # Remove directories used RMDir "${SM_PATH}" RMDir "${SM_PATH_BASE}" RMDir "$INSTDIR" SectionEnd # Offer to reboot the machine if the reboot flag is nonzero. This flag is set by # commands that specify the /REBOOTOK switch if the BINARY_* files were in use # during uninstallation. Stupid Windows. Function un.onGUIEnd IfRebootFlag 0 noreboot MessageBox MB_YESNO|MB_ICONQUESTION \ "A reboot is required to finish removing ${PRODUCT_NAME}. Do you wish to reboot now?" IDNO noreboot Reboot noreboot: FunctionEnd # Tell the user if we could not reboot for some reason. Function un.onRebootFailed MessageBox MB_OK|MB_ICONSTOP "Reboot failed. Please reboot manually." /SD IDOK FunctionEnd fldigi-4.1.06/data/station_table.txt0000644000175000017500000101433613472116043014274 00000000000000# STATION_ID | OWNER | TTYPE | HULL | NAME | PAYLOAD | LOCATION | TIMEZONE | FORECAST | NOTE # 0y2w3|CG|Weather Station||Sturgeon Bay CG Station, WS||44.794 N 87.313 W (44°47'40" N 87°18'47" W)|C| | 13001|PR|Atlas Buoy|PM-595|NE Extension||12.000 N 23.000 W (12°0'0" N 23°0'0" W)|| | 13002|PR|Atlas Buoy||NE Extension||21.000 N 23.000 W (21°0'0" N 23°0'0" W)|| | 13008|PR|Atlas Buoy|PM-531|Reggae||15.000 N 38.000 W (15°0'0" N 38°0'0" W)|| | 13009|PR|Atlas Buoy|PM-533|Lambada||8.000 N 38.000 W (8°0'0" N 38°0'0" W)|| | 13010|PR|Atlas Buoy|PM-590|Soul||0.000 N 0.000 E (0°0'0" N 0°0'0" E)|| | 15001|PR|Atlas Buoy|PM-597|Gavotte||10.000 S 10.000 W (10°0'0" S 10°0'0" W)|| | 15002|PR|Atlas Buoy|PM-591|Java||0.000 N 10.000 W (0°0'0" N 10°0'0" W)|| | 15006|PR|Atlas Buoy|PM-593|Valse||6.000 S 10.000 W (6°0'0" S 10°0'0" W)|| | 15007|PR|Atlas Buoy|PM-605A|SE Extension||6.000 S 8.000 E (6°0'0" S 8°0'0" E)|| | 15319|CT|Fixed Drilling Platform||Sanha - WANE 25947||5.583 S 11.833 E (5°35'0" S 11°50'0" E)|?| | 21178|JM|Buoy||South of Shikoku||33.120 N 133.620 E (33°7'12" N 133°37'12" E)|?| | 21401|HY|STB - SAIC Tsunami Buoy||250NM Southeast of Iturup Island|STB payload|42.617 N 152.583 E (42°37'0" N 152°35'0" E)|?| |This station was established on 11/08/2010. 21413|N|2.6-meter discus buoy|2.6D20|690 NM Southeast of Tokyo, Japan|DART II payload|30.515 N 152.117 E (30°30'55" N 152°7'1" E)|?| | 21414|N|2.6-meter discus buoy|2.6D49|NW Pacific|DART II payload|48.948 N 178.263 E (48°56'54" N 178°15'48" E)|?| | 21415|N|2.6-meter discus buoy|2.6D06|175 NM S of Attu AK|DART II payload|50.183 N 171.847 E (50°11'0" N 171°50'48" E)|?| | 21416|N|2.6-meter discus buoy|2.6D33|240NM SE of Kamchatka Peninsula|DART II payload|48.058 N 163.505 E (48°3'30" N 163°30'18" E)|?| | 21417|N|2.6-meter discus buoy|26D38|290NM SE of the Kuril Islands|DART II payload|43.192 N 157.142 E (43°11'30" N 157°8'30" E)|?| |

Station 21417 has been disestablished 7/05/2009, replaced by station 21419 92NM to the Northeast.

21418|N|2.6-meter discus buoy|26D42|450 NM NE of Tokyo, Japan|DART II payload|38.711 N 148.694 E (38°42'38" N 148°41'37" E)|?| |DART station 21418 has been declared inoperative as of 9/1/2012 due to spiking issues. It will be entered into the maintenance schedule for service. 21419|N|2.6-meter discus buoy|2.6D21|209NM SE of KURIL ISLANDS|DART II payload|44.455 N 155.736 E (44°27'18" N 155°44'8" E)|P| | 21595|JM|Drifting Buoy||Drifter||36.700 N 132.167 W (36°42'0" N 132°10'0" W)|?| | 21597|JM|Drifting Buoy||Drifter||32.800 N 155.200 E (32°48'0" N 155°12'0" E)|?| | 21598|JM|Drifting Buoy||Drifter||31.300 N 152.700 E (31°18'0" N 152°42'0" E)|?| | 21600|JM|Drifting Buoy||Drifter||40.700 N 154.500 E (40°42'0" N 154°30'0" E)|?| | 21636|JM|Drifting Buoy||Drifter||31.500 N 127.400 E (31°30'0" N 127°24'0" E)|?| | 21637|JM|Drifting Buoy||Drifter||29.300 N 141.250 E (29°18'0" N 141°15'0" E)|?| | 21640|JM|Drifting Buoy||Drifter||28.300 N 135.500 E (28°18'0" N 135°30'0" E)|?| | 21707|JM|Drifting Buoy||||25.000 N 136.000 E (25°0'0" N 136°0'0" E)|?| | 22101|KO|Buoy||||37.230 N 126.020 E (37°13'48" N 126°1'12" E)|?| | 22102|KO|Buoy||||34.800 N 125.770 E (34°48'0" N 125°46'12" E)|?| | 22103|KO|Buoy||||34.000 N 127.500 E (34°0'0" N 127°30'0" E)|?| | 22104|KO|Buoy||||34.770 N 128.900 E (34°46'12" N 128°54'0" E)|?| | 22105|KO|Buoy||||37.530 N 130.000 E (37°31'48" N 130°0'0" E)|?| | 22106|KO|Buoy||||36.350 N 129.780 E (36°21'0" N 129°46'48" E)|?| | 22107|KO|Buoy||||33.080 N 126.030 E (33°4'48" N 126°1'48" E)|?| | 22108|KO|Buoy||||36.250 N 125.750 E (36°15'0" N 125°45'0" E)|?| | 23020|KA|Buoy|2.8DX1|Red Sea|WAMDAS payload|22.162 N 38.500 E (22°9'43" N 38°30'0" E)|?| | 23227|IS|STB - SAIC Tsunami Buoy||Bay of Bengal|SAIC Tsunami Buoy (STB) with DART II BPR|6.255 N 88.792 E (6°15'17" N 88°47'31" E)|?| | 23228|IS|STB - SAIC Tsunami Buoy||Arabian Sea|SAIC Tsunami Buoy (STB) with DART II BPR|20.799 N 65.347 E (20°47'55" N 65°20'48" E)|?| | 23401|TH|STB - SAIC Tsunami Buoy||600 NM West-Northwest of Phuket, Thailand|DART II payload|8.905 N 88.540 E (8°54'18" N 88°32'24" E)|?| | 28401|PM|Buoy||Kuroshio Extension Observatory (KEO)||32.400 N 144.600 E (32°24'0" N 144°36'0" E)|?| | 28900|UW|Sea Glider||SG168||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28901|UW|Sea Glider||SG169||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28902|UW|Sea Glider||SG176||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28903|UW|Sea Glider||SG182||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28904|UW|Sea Glider||SG140||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28905|UW|Sea Glider||SG122||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 31001|PR|Atlas Buoy|PM-527|Samba||0.000 N 35.000 W (0°0'0" N 35°0'0" W)|| | 31002|PR|Atlas Buoy|PM-541|Frevo||4.000 N 38.000 W (4°0'0" N 38°0'0" W)|| | 31003|PR|Atlas Buoy|PM-542|SW Extension||8.000 S 30.000 W (8°0'0" S 30°0'0" W)|| | 31004|PR|Atlas Buoy|PM-543|SW Extension||14.000 S 32.000 W (14°0'0" S 32°0'0" W)|| | 31005|PR|Atlas Buoy|PM-544|SW Extension||19.000 S 34.000 W (19°0'0" S 34°0'0" W)|| | 31006|PR|Atlas Buoy|PM-598|NE Extension||4.000 N 23.000 W (4°0'0" N 23°0'0" W)|| | 31007|PR|Atlas Buoy|PM-599|Jazz||0.000 N 23.000 W (0°0'0" N 23°0'0" W)|| | 31201|R|Waverider Buoy||Floripa, Brazil (109)||27.705 S 48.134 W (27°42'17" S 48°8'2" W)|?| | 31260|HC|Buoy||||23.031 S 43.088 W (23°1'52" S 43°5'17" W)|| |This buoy was removed from its old location near 28.485S  47.522W and was re-deployed on 1/14/2010 near 23.031S  43.088W. 31261|IP|Buoy||||31.538 S 49.862 W (31°32'17" S 49°51'43" W)|| | 31478|IP|Buoy||||22.882 S 43.132 W (22°52'55" S 43°7'54" W)|| | 32012|WH|2.4-meter discus buoy|24DX2|Woods Hole Stratus Wave Station |WAMDAS payload|19.691 S 85.567 W (19°41'28" S 85°34'1" W)|C| |

For meteorological data at this station, see 32ST0.

32066|IR|2.6-meter discus buoy||Ecuador INOCAR|EBM22TS (MSM Tsunami Warning System, Compatible with NOAA payload)|1.130 S 81.769 W (1°7'47" S 81°46'7" W)|?| | 32301|N|3-meter discus buoy|||DACT payload|9.900 S 105.200 W (9°54'0" S 105°12'0" W)|C| | 32302|N|3-meter discus buoy|||DACT payload|18.000 S 85.100 W (18°0'0" S 85°5'59" W)|C| | 32401|E|2.6-meter discus buoy||260 NM West-Southwest of Arica Chile|DART II payload|19.297 S 74.746 W (19°17'50" S 74°44'44" W)|?| |

This station is operative as of 12/2/2011

32411|N|2.6-meter discus buoy|2.6D46|710 NM West-Southwest of Panama City, Panama|DART II payload|4.999 N 90.841 W (4°59'58" N 90°50'27" W)|?| |Station 32411 has stopped transmitting water column height and event data since 5/12/12. It will be restored to service when it can be worked into the Maintenance Schedule . 32412|N|2.6-meter discus buoy|2.6D47|630 NM Southwest of Lima, Peru|DART II payload|17.975 S 86.392 W (17°58'30" S 86°23'30" W)|| | 32413|N|2.6-meter discus buoy|2.6D77|1000 NM WestNorthwest of Lima, Peru|DART II payload|7.397 S 93.500 W (7°23'48" S 93°30'0" W)|| |

This station was established 8/23/2010 which replaces 51406 in the DART array.

32487|DC|Offshore Buoy||Buenaventura, Colombia||3.517 N 77.737 W (3°31'0" N 77°44'13" W)|E| | 32488|DC|Offshore Buoy||Bahia Solano, Colombia||6.258 N 77.511 W (6°15'27" N 77°30'40" W)|E| | 32745|N|Drifting Buoy||TAO Buoy Adrift||2.109 N 95.316 W (2°6'33" N 95°18'59" W)|?| | 32746|N|Buoy||TAO Buoy Adrift||5.000 S 110.000 W (5°0'0" S 110°0'0" W)|?| |Buoy was recovered on 11/14/2008. 32st0|WH|Ocean Reference Station||Stratus||19.713 S 85.585 W (19°42'46" S 85°35'7" W)|?| |For wave data at this station, see 32012. 41001|N|3-meter discus buoy|3DV10|150 NM East of Cape HATTERAS|ARES payload|34.561 N 72.631 W (34°33'40" N 72°37'50" W)|E|FZNT22.KWBC | 41002|N|3-meter discus buoy|3D70|S HATTERAS - 250 NM East of Charleston, SC|AMPS payload|31.862 N 74.835 W (31°51'42" N 74°50'6" W)|E|FZNT22.KWBC |



 

41003|N|6-meter NOMAD buoy|||MVXII payload|30.400 N 80.100 W (30°23'60" N 80°5'60" W)|E| |(formerly eb05) 41004|N|3-meter discus buoy|3D37|EDISTO - 41 NM Southeast of Charleston, SC|AMPS payload|32.501 N 79.099 W (32°30'2" N 79°5'58" W)|E|FZUS52.KCHS FZNT22.KWBC|
  41005|N|6-meter NOMAD buoy|||GSBP payload|31.700 N 79.700 W (31°41'60" N 79°42'0" W)|E| | 41006|N|6-meter NOMAD buoy|||GSBP payload|29.300 N 77.400 W (29°18'0" N 77°24'0" W)|E| | 41007|N|3-meter discus buoy|||DACT payload|34.200 N 76.500 W (34°12'0" N 76°30'0" W)|E| | 41008|N|3-meter discus buoy|3D36|GRAYS REEF - 40 NM Southeast of Savannah, GA|AMPS payload|31.402 N 80.869 W (31°24'9" N 80°52'9" W)|E|FZUS52.KCHS |

This buoy is located in Gray's Reef National Marine Sanctuary

The southern third of NOAA's 22-square mile Gray's Reef National Marine Sanctuary has be designated a research area specifically designed for conducting controlled scientific studies where human activities cannot affect the results. Fishing and diving will be prohibited in the lightly used, 8-square mile research area. Vessels are permitted to travel through it without stopping. For complete information, go the Gray's Reef website at graysreef.noaa.gov  

LINK TO PMEL's pCO2 SITE for their data on this Station: http://www.pmel.noaa.gov/co2/coastal/NDBC_41008/data_081w_14d.htm

NDBC ADCPs are now quality controlled using automated methods. Historical and forty-five day files beginning 1 June 2010 are available in a new format that contains more QC information.  The forty-five day files in the old format will be resident until approximately 31 July 2010. 

41009|N|6-meter NOMAD buoy|6N23|CANAVERAL 20 NM East of Cape Canaveral, FL|ARES payload|28.519 N 80.166 W (28°31'9" N 80°9'59" W)|E|FZUS52.KMLB |Station 41009 went adrift on 06/25/2012 and the last report from its moored position was at 21Z. It has been retrieved as of 12Z, 6/29/12. This buoy will be restored to service when it can be worked into the schedule. When the service date is known, it will be posted in the  maintenance report. 
Going to Oculina Bank? Please review Oculina fishing regulations

Right whales are active off FL. Speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the U.S. East Coast.  It is illegal to approach right whales within 500 yards.  To learn more about right whales and rules protecting them, go to: http://www.nmfs.noaa.gov/pr/shipstrike/ 41010|N|6-meter NOMAD buoy|6N26|CANAVERAL EAST 120NM East of Cape Canaveral|ARES payload|28.906 N 78.471 W (28°54'22" N 78°28'16" W)|E|FZNT23.KNHC |
  41011|N|6-meter NOMAD buoy|||DACT payload|28.200 N 80.100 W (28°11'60" N 80°5'60" W)|E| | 41012|N|3-meter discus buoy|3D72|St. Augustine, FL 40NM ENE of St Augustine, FL|AMPS payload|30.042 N 80.534 W (30°2'32" N 80°32'1" W)|E|FZUS52.KJAX |NDBC ADCPs are now quality controlled using automated methods. Historical and forty-five day files beginning 1 June 2010 are available in a new format that contains more QC information.  The forty-five day files in the old format will be resident until approximately 31 July 2010.

Right whales are active off FL. Speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the U.S. East Coast.  It is illegal to approach right whales within 500 yards.  To learn more about right whales and rules protecting them, go to: http://www.nmfs.noaa.gov/pr/shipstrike/ 41013|N|3-meter discus buoy|3D55|Frying Pan Shoals, NC Buoy|AMPS payload|33.436 N 77.743 W (33°26'11" N 77°44'35" W)|E|FZUS52.KILM FZUS52.KMHX|
  41015|N|3-meter discus buoy|||DACT payload|35.400 N 75.300 W (35°23'60" N 75°17'60" W)|E| | 41016|N|12-meter discus buoy|||GSBP payload|24.600 N 76.500 W (24°36'0" N 76°30'0" W)|E| | 41017|N|3-meter discus buoy|||DACT payload|35.400 N 75.100 W (35°23'60" N 75°5'60" W)|E| | 41018|N|3-meter discus buoy|||DACT payload|15.000 N 75.000 W (15°0'0" N 75°0'0" W)|E| | 41021|N|3-meter discus buoy|48|Olympic Northeast|VEEP payload|31.920 N 80.850 W (31°55'12" N 80°50'60" W)|E| | 41022|N|3-meter discus buoy|52|Olympic Southwest|VEEP payload|31.890 N 80.860 W (31°53'24" N 80°51'36" W)|E| | 41023|N|3-meter discus buoy|52|Olympic Southwest|VEEP payload|31.920 N 80.930 W (31°55'12" N 80°55'48" W)|E| | 41024|A|Offshore Buoy||Sunset Nearshore (SUN 2)||33.848 N 78.489 W (33°50'52" N 78°29'21" W)|E|FZUS52.KILM |
  41025|N|3-meter discus buoy|3D42|Diamond Shoals|ARES payload|35.006 N 75.402 W (35°0'22" N 75°24'7" W)|E|FZUS52.KMHX |This buoy is located in the Monitor National Marine Sanctuary.

41026|PR|Atlas Buoy|PM-529|Forro||12.000 N 38.000 W (12°0'0" N 38°0'0" W)|| | 41027|A|Offshore Buoy||Sunset Mid-Shelf (SUN 3)||33.302 N 78.137 W (33°18'7" N 78°8'14" W)|E|FZUS52.KILM FZNT22.KWBC|
  41029|A|Offshore Buoy||Capers Nearshore (CAP 2)||32.810 N 79.630 W (32°48'36" N 79°37'48" W)|E|FZUS52.KCHS |
  41030|A|Offshore Buoy||Capers Mid-Shelf (CAP 3)||32.520 N 79.340 W (32°31'12" N 79°20'24" W)|E|FZUS52.KCHS |
  41033|A|Offshore Buoy||Fripp Nearshore (FRP 2)||32.280 N 80.410 W (32°16'48" N 80°24'36" W)|E|FZUS52.KCHS |
  41035|N|3-meter discus buoy|3D85|Onslow Bay Inner, NC|ARES payload|34.476 N 77.280 W (34°28'34" N 77°16'47" W)|E|FZUS52.KMHX |


The buoy at station 41035 has been recovered and dis-established as of 8/22/11. See station 41036 that is moored 23NM to the south and east for data in the Onslow Bay area.


 

41036|N|3-meter discus buoy|3D49|Onslow Bay Outer, NC|AMPS payload|34.207 N 76.949 W (34°12'25" N 76°56'56" W)|E|FZUS52.KMHX |
  41037|CR|Offshore Buoy||ILM3 - 27 miles SE of Wrightsville Beach, NC||33.991 N 77.360 W (33°59'26" N 77°21'35" W)|E| |
  41038|CR|Offshore Buoy||ILM2 - 5 miles SE of Wrightsville Beach, NC||34.141 N 77.715 W (34°8'27" N 77°42'53" W)|E| |
  41040|N|6-meter NOMAD buoy|6N57|West Atlantic|ARES payload|14.477 N 53.008 W (14°28'38" N 53°0'28" W)|?|FZNT23.KNHC | 41041|N|6-meter NOMAD buoy|6N58|Middle Atlantic|ARES payload|14.175 N 45.998 W (14°10'30" N 45°59'53" W)|?|FZNT02.KNHC | 41043|N|3-meter discus buoy|3D29|South Western Atlantic|AMPS payload|21.061 N 64.966 W (21°3'39" N 64°57'59" W)|N|FZNT23.KNHC | 41044|N|6-meter NOMAD buoy|6N50|South Atlantic|ARES 4.4 payload|21.639 N 58.614 W (21°38'20" N 58°36'50" W)|N|FZNT02.KNHC |On 5/07/12, the buoy was re-deployed about 4 nm east-southeast of its previous location.
41046|N|6-meter NOMAD buoy|6N59|E Bahamas|ARES 4.4 payload|23.838 N 68.333 W (23°50'17" N 68°19'59" W)|E|FZNT02.KNHC |The previous moored position for 41046 was 23*52'01"N, 70*52'12"W or 75 nm west of its present position.
41047|N|3-meter discus buoy|3DV24|NE Bahamas|AMPS payload|27.517 N 71.483 W (27°31'0" N 71°29'0" W)|E|FZNT02.KNHC |

NOTICE:  In addition to the 3 meter hull for station 41047, an  old 12 meter hull is in standby mode for the station and is located at position  27.469N,71.491W (27*28'10"N 71*29'28" W)

41048|N|3-meter discus buoy|3D20|W Bermuda|AMPS payload|31.950 N 69.497 W (31°57'0" N 69°29'48" W)|E|FZNT01.KWBC |

NOTICE:  In  addition to the 3 meter hull for station 41048, an  old 12 meter hull is in standby mode for the  station and is located at position  31.978N,69.649W (31*58'42"N 69*38'56" W)


 

41049|N|3-meter discus buoy|3D51|Atlantic (South)|ARES 4.4 payload|27.500 N 63.000 W (27°30'0" N 63°0'0" W)|?|FZNT02.KNHC | 41052|CI|2.5-meter ODAS buoy||South of St. John, Virgin Islands||18.251 N 64.763 W (18°15'2" N 64°45'45" W)|N| |http://www.caricoos.org/drupal/ 41053|CI|2.5-meter ODAS buoy||San Juan, PR||18.476 N 66.099 W (18°28'33" N 66°5'58" W)|N| |http://www.caricoos.org/drupal/ 41060|WH|2.4-meter discus buoy||Woods Hole Northwest Tropical Atlantic Wave Station||11.436 N 54.829 W (11°26'10" N 54°49'44" W)|?| |For meteorological data at this station, see 41NT0. 41096|F|Buoy||North of Guadeloupe||16.533 N 61.404 W (16°31'59" N 61°24'14" W)|?| | 41097|F|Buoy||Fort-de-France, Martinique||14.480 N 61.096 W (14°28'48" N 61°5'46" W)|?| | 41098|F|Buoy||North of Martinique||14.894 N 61.113 W (14°53'38" N 61°6'47" W)|?| | 41100|F|Buoy||East of Guadeloupe||15.900 N 57.883 W (15°54'0" N 57°53'0" W)|?| | 41101|F|Buoy||East of Martinique||14.600 N 56.201 W (14°36'0" N 56°12'2" W)|?| | 41109|R|Waverider Buoy||New River Inlet, NC - 190||34.483 N 77.300 W (34°29'0" N 77°18'0" W)|E| | 41110|CR|Waverider Buoy||Masonboro Inlet, NC||34.141 N 77.709 W (34°8'28" N 77°42'31" W)|E| | 41112|R|Waverider Buoy||Offshore Fernandina Beach, FL (132)||30.719 N 81.293 W (30°43'7" N 81°17'34" W)|E| |
  41113|R|Waverider Buoy||Cape Canaveral Nearshore, FL (143)||28.400 N 80.530 W (28°23'59" N 80°31'48" W)|E| |
  41114|R|Waverider Buoy||Fort Pierce, FL (134)||27.551 N 80.225 W (27°33'5" N 80°13'31" W)|E| |Going to Oculina Bank? Please review Oculina fishing regulations  41115|CI|Waverider Buoy||Rincon, Puerto Rico (181)||18.376 N 67.280 W (18°22'35" N 67°16'48" W)|N| |Data provided by Scripps Institution of Oceanography
CDIP station
41139|PR|Atlas Buoy||||20.000 N 38.000 W (20°0'0" N 38°0'0" W)|| | 41140|R|Waverider Buoy||Christiansted, St. Croix, Virgin Islands||17.769 N 64.723 W (17°46'7" N 64°43'24" W)|N| |Station 41140 was disestablished November 2, 2010. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 41141|R|Waverider Buoy||Fareham, St. Croix, Virgin Islands||17.684 N 64.635 W (17°41'2" N 64°38'6" W)|N| |Station 41141 was disestablished April 13, 2011. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 41193|DC|Offshore Buoy||Puerto Bolivar, Colombia||12.351 N 72.218 W (12°21'4" N 72°13'4" W)|E| | 41194|DC|Offshore Buoy||Barranquilla, Colombia||11.161 N 74.681 W (11°9'41" N 74°40'51" W)|E| | 41420|N|2.6-meter discus buoy|2.6D71|690 NM East of Miami, FL|DART II payload|23.490 N 67.325 W (23°29'25" N 67°19'29" W)|?| | 41421|N|2.6-meter discus buoy|2.6D09|320 NM North of San Juan, PR|DART II payload|23.415 N 63.967 W (23°24'55" N 63°58'2" W)|?| |

Station 41421 was re established with a new hull 2.6D70 on 5/9/2012. Buoy hull 2.6D70 from DART station 42421 went adrift after 5/12/2012 01Z. Last report from its moored position was 5/11/2012 1315Z. The buoy was recovered on 8/4/2012, and will be restored into service when it can be recovered and then worked into the maintenance schedule. 

Buoy hull 2.6D09 went adrift at 1/17/2012. It has been renamed 41X21.   Click here to see the latest positions.

41424|N|2.6-meter discus buoy|2.6D15|370 NM East of Charleston, SC|DART II payload|32.922 N 72.466 W (32°55'18" N 72°27'57" W)|?| |

Hull 2.6D15 from the previous deployment went adrift 1/09/2012 has been renamed 41X24 and is still adrift. Click here to see the latest positions.


41554|AO|Drifting Buoy||||18.078 N 64.743 W (18°4'42" N 64°44'36" W)|?| | 41670|AO|Drifting Buoy||||24.710 N 28.420 W (24°42'36" N 28°25'12" W)|?| | 41852|AO|Drifting Buoy||||23.240 N 24.020 W (23°14'24" N 24°1'12" W)|?| | 41904|AO|Drifting Buoy||||3.017 N 90.900 E (3°1'0" N 90°54'0" E)|?| | 41933|AO|Drifting Buoy||||44.950 N 12.800 W (44°57'0" N 12°48'0" W)|?| | 41nt0|WH|Ocean Reference Station||NTAS - Northwest Tropical Atlantic||14.825 N 51.017 W (14°49'30" N 51°1'3" W)|?| |41NT0 has gone adrift.  Data is no longer being posted to this webpage.
42001|N|3-meter discus buoy|3DV14|MID GULF 180 nm South of Southwest Pass, LA|AMPS payload|25.888 N 89.658 W (25°53'16" N 89°39'27" W)|C|FZNT24.KNHC |
42002|N|10-meter discus buoy|10D10|W GULF 207 NM East of Brownsville, TX|ARES payload|25.790 N 93.666 W (25°47'24" N 93°39'58" W)|C|FZNT24.KNHC |Station 42002 is transmitting intermittently since 04/18/2012. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

42002 was re-established at the above location on 2/8/2008.  

Previously the station was positioned at  25* 10' 00" N 094* 25' 00" W.

42003|N|3-meter discus buoy|3D25|E GULF 208 nm West of Naples, FL|AMPS payload|26.044 N 85.612 W (26°2'38" N 85°36'42" W)|C|FZNT24.KNHC | 42004|N|12-meter discus buoy|||MVXII payload|27.500 N 85.500 W (27°30'0" N 85°30'0" W)|C| | 42005|N|12-meter discus buoy|||MVXII payload|30.000 N 85.900 W (30°0'0" N 85°54'0" W)|C| | 42006|N|6-meter NOMAD buoy|||MVXII payload|26.500 N 96.000 W (26°30'0" N 96°0'0" W)|C| | 42007|N|3-meter discus buoy|3D36|BILOXI 22 nm SSE of Biloxi, MS|ARES 4.4 payload|30.090 N 88.769 W (30°5'25" N 88°46'7" W)|C|FZUS54.KLIX |42007 has been disestablished.  Station 42040 has been re-established approximately 60 NM south of 42007's nominal position
42008|N|Platform BTA||||28.700 N 95.300 W (28°42'0" N 95°18'0" W)|C| | 42009|N|10-meter discus buoy|||GSBP payload|29.300 N 87.500 W (29°18'0" N 87°30'0" W)|C| | 42010|N|Platform BTA||||29.700 N 93.400 W (29°42'0" N 93°24'0" W)|C| | 42011|N|Platform BTA||||29.700 N 93.500 W (29°42'0" N 93°30'0" W)|C| | 42012|N|3-meter discus buoy|3D12|Orange Beach, AL Buoy|ARES 4.4 payload|30.065 N 87.555 W (30°3'55" N 87°33'19" W)|C|FZUS54.KMOB |  42013|P|Offshore Buoy||C10 - Navy-2||27.169 N 82.926 W (27°10'9" N 82°55'34" W)|E|FZUS52.KTBW | 42014|P|Offshore Buoy||C17 - W. FL Sea-Coos||25.254 N 82.220 W (25°15'16" N 82°13'11" W)|E|FZUS52.KKEY | 42015|N|3-meter discus buoy|||DACT payload|30.100 N 88.200 W (30°6'0" N 88°12'0" W)|E| | 42016|N|3-meter discus buoy|||DACT payload|30.200 N 88.100 W (30°11'60" N 88°5'60" W)|C| | 42017|N|3-meter discus buoy|||DACT payload|27.900 N 90.900 W (27°53'60" N 90°54'0" W)|C| | 42018|N|3-meter discus buoy|||DACT payload|30.000 N 88.200 W (30°0'0" N 88°12'0" W)|C| | 42019|N|3-meter discus buoy|3D58|Freeport, TX 60 NM South of Freeport, TX|AMPS payload|27.913 N 95.353 W (27°54'48" N 95°21'10" W)|C|FZNT24.KNHC FZUS54.KHGX|

Station 42019 failed on 3/1/2012.  It will berestored to service when it can be worked into the schedule.  When thedate is known it will be posted in the Weekly Maintenance Report.

42020|N|3-meter discus buoy|3DV11|Corpus Christi, TX 50NM Southeast of Corpus Christi, TX|ARES payload|26.966 N 96.695 W (26°57'59" N 96°41'42" W)|C|FZNT24.KNHC FZUS54.KBRO| 42021|P|Offshore Buoy||C14 - Pasco County Buoy, FL||28.311 N 83.306 W (28°18'40" N 83°18'22" W)|E|FZUS52.KTBW | 42022|P|Offshore Buoy||C12 - West Florida Central Buoy||27.498 N 83.722 W (27°29'54" N 83°43'18" W)|E|FZUS52.KTBW | 42023|P|Offshore Buoy||C13 - West Florida South Buoy||26.064 N 83.074 W (26°3'49" N 83°4'25" W)|E|FZUS52.KTBW | 42024|P|Offshore Buoy||C16 - W. FL MERHAB||27.464 N 84.219 W (27°27'50" N 84°13'8" W)|E|FZNT24.KNHC | 42025|N|1.8-meter discus buoy|||VEEP payload|24.900 N 80.400 W (24°53'60" N 80°24'0" W)|C| | 42035|N|3-meter discus buoy|3D54|GALVESTON 22NM East of Galveston, TX|ARES 4.4 payload|29.232 N 94.413 W (29°13'54" N 94°24'46" W)|C|FZUS54.KHGX FZUS54.KLCH| 42036|N|3-meter discus buoy|3D73|W. TAMPA 106NM West Northwest of Tampa, FL|ARES 4.4 payload|28.500 N 84.517 W (28°30'0" N 84°31'0" W)|E|FZUS52.KTBW FZNT24.KNHC| 42037|N|2.4-meter discus buoy|||DACT payload|24.500 N 81.400 W (24°30'0" N 81°24'0" W)|E| |Buoy disestablished. 42038|N|3-meter discus buoy|3D35|North Mid Gulf of Mexico|ARES payload|27.421 N 92.555 W (27°25'15" N 92°33'17" W)|C|FZNT24.KNHC |Station 42038 failed and was disestablished May 9, 2006. The station had been part of an externally funded Minerals Management Service program that has ended. Use the "Observations from Nearby Stations and Ships" link below to see a listing of the nearest stations. The historical data will remain available. The station page is accessible via our historical map, or you can always just put the station ID in the Station ID Search box. 42039|N|3-meter discus buoy|3D15|PENSACOLA - 115NM East Southeast of Pensacola, FL|ARES payload|28.791 N 86.008 W (28°47'28" N 86°0'29" W)|C|FZUS52.KTAE FZNT24.KNHC|

Station 42039 stopped transmitting 06/10/2012. This buoy will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 

Buoy hull 3D15 has gone adrift 8/28/12 by 2130Z. Click here for latest position.

42040|N|10-meter discus buoy|10D08|LUKE OFFSHORE TEST PLATFORM 64 nm South of Dauphin Island, AL|ARES 4.4 payload|29.212 N 88.207 W (29°12'45" N 88°12'27" W)|C|FZUS54.KLIX FZNT24.KNHC|

Station 42040 was re-established on 4/1/2010.

Previously the station was positioned at 29° 12' 19"N 88° 12' 19"W.

Station 42040 is transmitting sporadically since 8/7/12. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

42041|N|3-meter discus buoy| 24|North Mid Gulf 110NM South of Grand Isle, LA|MARS payload|27.504 N 90.462 W (27°30'14" N 90°27'44" W)|C|FZUS54.KLIX |Station 42041 was disestablished March 16, 2005. The station had been part of an externally funded Minerals Management Service program that has ended. Use the "Observations from Nearby Stations and Ships" link below to see a listing of the nearest stations. The historical data will remain available. The station page is accessible via our historical map, or you can always just put the station ID in the Station ID Search box. 42042|N|3-meter discus buoy| 28|Pascagoula|MARS payload|29.880 N 88.320 W (29°52'48" N 88°19'12" W)|C| | 42043|T|TABS II||GA-252 TABS B||28.982 N 94.919 W (28°58'55" N 94°55'7" W)|C|FZUS54.KHGX | 42044|T|TABS II||PS-1126 TABS J||26.191 N 97.051 W (26°11'29" N 97°3'3" W)|C|FZUS54.KBRO | 42045|T|TABS II||PI-745 TABS K||26.217 N 96.500 W (26°13'0" N 96°29'59" W)|C|FZNT24.KNHC | 42046|T|TABS II||HI-A595 TABS N||27.890 N 94.037 W (27°53'23" N 94°2'12" W)|C|FZNT24.KNHC | 42047|T|TABS II||HI-A389 TABS V||27.897 N 93.597 W (27°53'48" N 93°35'50" W)|C|FZNT24.KNHC | 42048|T|TABS II||TABS D||27.940 N 96.843 W (27°56'23" N 96°50'35" W)|C|FZNT24.KNHC |

NOTICE:  In addition  to  the  3  meter hull  for  station  41048, an  old  12  meter  hull  is in  standby  mode  for the  station  and  is  located  at  position 31.978N, 69.649W (31*58'42"N 69*38'56"W)

42049|T|TABS II||TABS W||28.351 N 96.006 W (28°21'3" N 96°0'21" W)|C|FZNT24.KNHC | 42050|T|TABS II||TABS F||28.843 N 94.242 W (28°50'33" N 94°14'30" W)|C|FZNT24.KNHC | 42051|T|TABS II||TABS R||29.635 N 93.642 W (29°38'6" N 93°38'30" W)|C|FZNT24.KNHC | 42053|N|12-meter discus buoy| LNB11|Pascagoula South|MARS payload|29.550 N 88.500 W (29°33'0" N 88°30'0" W)|C| | 42054|N|12-meter discus buoy| LNB06|East Gulf|MARS payload|26.000 N 87.730 W (26°0'0" N 87°43'48" W)|C|FZNT24.KNHC |Buoy 42054 was a short term project that has ended. 42055|N|3-meter discus buoy|3DV12|Bay of Campeche|AMPS payload|22.203 N 94.000 W (22°12'10" N 94°0'1" W)|C|FZNT24.KNHC |

 NOTICE:  In addition to the 3 meter hull for station 42055, an old 12 meter hull is located at position 22.017N, 94.046W (22*01'02"N 94 *02'45" W) and is non-functional.



42056|N|3-meter discus buoy|3D39| Yucatan Basin|AMPS payload|19.802 N 84.857 W (19°48'6" N 84°51'24" W)|C|FZNT23.KNHC |NOTICE:  In addition to the 3 meter hull for station 42056, an old 12 meter hull is in standby mode for the station and is located at position19.877N, 85.059W (19*52'37"N 85*03'32" W) 42057|N|3-meter discus buoy|3D80|Western Caribbean|AMPS payload|17.002 N 81.501 W (17°0'8" N 81°30'2" W)|E|FZNT23.KNHC |

NOTICE:  In addition  to  the  3  meter hull  for  station  42057, an  old  10  meter  hull  is in  standby  mode  for the  station  and  is  located  at  position 16.834N, 81.501W (16*50'01"N 81*30'02"W)

42058|N|3-meter discus buoy|3D59|Central Caribbean|ARES 4.4 payload|14.923 N 74.918 W (14°55'23" N 74°55'4" W)|E|FZNT23.KNHC | 42059|N|6-meter NOMAD buoy|6N43|Eastern Caribbean|ARES payload|15.054 N 67.472 W (15°3'14" N 67°28'19" W)|N|FZNT23.KNHC |
  42060|N|6-meter NOMAD buoy|6N56|Eastern Caribbean|AMPS payload|16.333 N 63.500 W (16°19'59" N 63°30'1" W)|N|FZNT23.KNHC | 42065|N|2.3-meter NOOSS buoy|2.3D09|Near 42058 Central Caribbean|AMPS payload|14.926 N 75.046 W (14°55'35" N 75°2'45" W)|E|FZNT23.KNHC |Buoy at station 42065 went adrift on 12/7/11 and has since been recovered. 

42067|US|3-meter discus buoy||USM3M02||30.043 N 88.649 W (30°2'36" N 88°38'57" W)|C|FZUS54.KLIX | 42080|N|1.8-meter discus buoy|1.8D008|Offshore Sand Key, FL|WAMDAS payload|24.396 N 81.934 W (24°23'44" N 81°56'2" W)|E|FZUS52.KKEY |Other weather data for this area are available at SANF1.

Station 42080 has been disestablished

42085|CI|2.5-meter ODAS buoy||Southeast of Ponce, PR||17.860 N 66.524 W (17°51'37" N 66°31'26" W)|N| |http://www.caricoos.org/drupal/ 42099|R|Waverider Buoy||Offshore St. Petersburg, FL (144)||27.340 N 84.245 W (27°20'25" N 84°14'42" W)|E| | 42360|PB|Buoy||BW Pioneer buoy - Walker Ridge 249||26.700 N 90.460 W (26°42'0" N 90°27'36" W)|C| |Anemometers are located at 3 meters above sea level but they are corrected to 10 meters by the owner. 42361|SH|Fixed Drilling Platform||Auger - Garden Banks 426||27.550 N 92.490 W (27°33'0" N 92°29'24" W)|C| | 42362|SH|Fixed Drilling Platform||Brutus - Green Canyon 158||27.800 N 90.670 W (27°48'0" N 90°40'12" W)|C| | 42363|SH|Fixed Drilling Platform||Mars - Mississippi Canyon 807||28.160 N 89.220 W (28°9'36" N 89°13'12" W)|C| | 42364|SH|Fixed Drilling Platform||Ram-Powell - Viosca Knoll 956||29.060 N 88.090 W (29°3'36" N 88°5'24" W)|C| | 42365|SH|Fixed Drilling Platform||Ursa - Mississippi Canyon 809||28.200 N 89.120 W (28°12'0" N 89°7'12" W)|C| | 42366|KM|Fixed Drilling Platform||Red Hawk - Garden Banks 877||27.122 N 91.959 W (27°7'18" N 91°57'31" W)|C| | 42367|TO|Fixed Drilling Platform||Matterhorn - Mississippi Canyon 243||28.743 N 88.826 W (28°44'33" N 88°49'32" W)|C| | 42368|CO|Fixed Drilling Platform||Magnolia - Garden Banks 783||27.204 N 92.203 W (27°12'14" N 92°12'9" W)|C| | 42369|BP|Fixed Drilling Platform||Mad Dog - Green Canyon 782||27.189 N 90.269 W (27°11'19" N 90°16'7" W)|C| | 42370|BP|Fixed Drilling Platform||Holstein - Green Canyon 645||27.321 N 90.536 W (27°19'17" N 90°32'8" W)|C| | 42371|CT|Fixed Drilling Platform||Typhoon - Green Canyon 237||27.732 N 91.111 W (27°43'54" N 91°6'40" W)|C| |This station was disestablished in 2005 and no longer produces data. The historical data remain available. 42372|CT|Fixed Drilling Platform||Genesis - Green Canyon 205||27.779 N 90.519 W (27°46'46" N 90°31'7" W)|C| | 42373|KM|Fixed Drilling Platform||Boomvang - East Breaks 643||27.354 N 94.625 W (27°21'13" N 94°37'31" W)|C| | 42374|BP|Fixed Drilling Platform||Horn Mountain - Mississippi Canyon 126 and 127||28.866 N 88.056 W (28°51'58" N 88°3'23" W)|C| | 42375|BP|Fixed Drilling Platform||Na Kika - Mississippi Canyon 474||28.521 N 88.289 W (28°31'15" N 88°17'20" W)|C| | 42376|BP|Fixed Drilling Platform||Marlin - Viosca Knoll 915||29.108 N 87.944 W (29°6'27" N 87°56'37" W)|C| | 42377|KM|Fixed Drilling Platform||Constitution - Green Canyon 680||27.293 N 90.968 W (27°17'33" N 90°58'5" W)|C| | 42379|AN|Fixed Drilling Platform||Marco Polo - Green Canyon 608||27.362 N 90.181 W (27°21'43" N 90°10'53" W)|C| | 42380|WI|Fixed Drilling Platform||Devil's Tower - Mississippi Canyon 773||28.209 N 88.738 W (28°12'32" N 88°44'15" W)|C| | 42381|AT|Fixed Drilling Platform||Innovator - Mississippi Canyon 711||28.221 N 89.616 W (28°13'15" N 89°36'56" W)|C| | 42382|KM|Mobile Offshore Drilling Unit||Gunnison - Garden Banks 668||27.304 N 93.538 W (27°18'14" N 93°32'18" W)|C| | 42383|BH|Fixed Drilling Platform||Neptune - Green Canyon 613||27.370 N 89.924 W (27°22'12" N 89°55'26" W)|C| | 42384|EP|Fixed Drilling Platform||Prince TLP - Ewing Bank 1003||27.993 N 90.326 W (27°59'34" N 90°19'33" W)|C| | 42385|CT|Fixed Drilling Platform||Blind Faith - Mississippi Canyon 696||28.340 N 88.266 W (28°20'24" N 88°15'56" W)|C| | 42386|CT|Fixed Drilling Platform||Tahiti - Green Canyon 641||27.326 N 90.714 W (27°19'34" N 90°42'51" W)|C| | 42387|MU|Fixed Drilling Platform||Thunderhawk - Mississippi Canyon 734||28.267 N 88.399 W (28°16'2" N 88°23'56" W)|C| | 42388|HE|Mobile Offshore Drilling Unit||Producer 1 - Green Canyon 237||27.730 N 91.109 W (27°43'47" N 91°6'31" W)|C| | 42390|SH|Fixed Drilling Platform||Perdido Host - Alaminos Canyon 857||26.129 N 94.898 W (26°7'44" N 94°53'53" W)|C| | 42391|AT|Fixed Drilling Platform||Titan - Mississippi Canyon 941||28.034 N 89.101 W (28°2'2" N 89°6'4" W)|C| | 42392|BP|Fixed Drilling Platform||Atlantis - Green Canyon ###||27.196 N 90.027 W (27°11'44" N 90°1'37" W)|C| | 42393|BH|Fixed Drilling Platform||Shenzi - Green Canyon 653||27.301 N 90.135 W (27°18'2" N 90°8'6" W)|C| | 42407|N|2.6-meter discus buoy|2.6D03|230 NM South of San Juan, PR|DART II payload|15.289 N 68.215 W (15°17'22" N 68°12'54" W)|?| | 42408|N|2.6-meter discus buoy|D22|310 NM South-Southeast of New Orleans, LA|DART II payload|25.200 N 87.000 W (25°12'0" N 87°0'0" W)|?| |Buoy 42408 has gone adrift on 12/11/2008 and was recovered 12/19/2008. It is not reporting any water column heights or tsunami event messages since 12/11/2008. It has been replaced by 42409 located approximately 100NM to the NE. Station has been disestablished. 42409|N|2.6-meter discus buoy|2.6D22|295 NM Southeast of New Orleans, LA|DART II payload|27.080 N 85.714 W (27°4'49" N 85°42'50" W)|E| |

Station 42409 has stopped transmitting water column height and tsunami data as of 4/28/2012. It will be serviced when it can be worked into the maintenance schedule.

Last reported position was 4/19/2012 and it was on station at that time.  Hull 2.6D22 stopped transmitting position data as of 4/19/2012.  However, during service visit on 5/24/2012, the buoy was not on station and is now presumed adrift.

42429|N||NDBC2|DART GLIDER TEST STATION |DART II payload|27.401 N 85.671 W (27°24'4" N 85°40'17" W)|| |

This station is a DART Test station and is NOT an operational station.

This test station is being used to test the Mid Frequency BPR  and the DART Glider (NDBC2).

42430|N|Test station||DART Test Station||27.000 N 86.000 W (27°0'0" N 86°0'0" W)|E| |This is a DART TEST station only. It is NOT an operational station. 42534|N|Drifting Buoy||Moored Drifter||29.643 N 93.839 W (29°38'34" N 93°50'20" W)|C| |Station 42534 has  failed. 42851|SH|Mobile Offshore Drilling Unit||Globetrotter 1 - Walker Ridge 95||26.863 N 91.587 W (26°51'48" N 91°35'12" W)|C| | 42852|LL|Mobile Offshore Drilling Unit||Who Dat - Mississippi Canyon 547||28.501 N 89.769 W (28°30'4" N 89°46'8" W)|C| | 42861|SH|Mobile Offshore Drilling Unit||Deepwater Nautilus - Mississippi Canyon 348||28.634 N 87.982 W (28°38'4" N 87°58'56" W)|C| | 42862|SH|Mobile Offshore Drilling Unit||Jim Thompson - Green Canyon 158||27.800 N 90.670 W (27°48'0" N 90°40'12" W)|C| | 42863|AT|Mobile Offshore Drilling Unit||Ocean Victory - Green Canyon 300 #2||27.486 N 90.191 W (27°29'9" N 90°11'26" W)|C| | 42864|NF|Mobile Offshore Drilling Unit||Noble Max Smith - Mississippi Canyon 754||28.195 N 89.636 W (28°11'42" N 89°38'9" W)|C| | 42865|EN|Mobile Offshore Drilling Unit||Celtic Sea - Green Canyon 517||27.466 N 90.305 W (27°27'56" N 90°18'18" W)|C| | 42866|EN|Mobile Offshore Drilling Unit||Transocean Amirante - Mississippi Canyon 460||28.491 N 88.997 W (28°29'27" N 88°59'51" W)|C| | 42867|CT|Mobile Offshore Drilling Unit||DeepSeas - Green Canyon 640||27.317 N 90.754 W (27°19'0" N 90°45'14" W)|C| | 42868|BP|Mobile Offshore Drilling Unit||Discoverer Enterprise - Green Canyon 699||27.262 N 89.998 W (27°15'42" N 89°59'54" W)|C| | 42869|AT|Mobile Offshore Drilling Unit||Ocean Confidence - Mississippi Canyon 305||28.695 N 87.931 W (28°41'43" N 87°55'50" W)|C| | 42870|ME|Mobile Offshore Drilling Unit||Ocean America - Green Canyon 505||27.458 N 90.867 W (27°27'30" N 90°52'2" W)|C| | 42871|BH|Mobile Offshore Drilling Unit||C R Luigs - Green Canyon 654||27.309 N 90.072 W (27°18'32" N 90°4'20" W)|C| | 42872|BP|Mobile Offshore Drilling Unit||Deepwater Horizon||28.738 N 88.366 W (28°44'17" N 88°21'57" W)|C| |Station disestablished on 4/21/2010.
42873|AT|Mobile Offshore Drilling Unit||Ocean Quest - Mississippi Canyon 711||28.252 N 89.622 W (28°15'6" N 89°37'18" W)|C| | 42874|AN|Mobile Offshore Drilling Unit||DeepWater Millennium - Garden Banks 877||27.121 N 91.922 W (27°7'16" N 91°55'19" W)|C| | 42875|LL|Mobile Offshore Drilling Unit||Amos Runner - Mississippi Canyon 431||28.567 N 88.257 W (28°34'3" N 88°15'27" W)|C| | 42876|NF|Mobile Offshore Drilling Unit||Ocean Star - Garden Banks 293||27.676 N 92.534 W (27°40'34" N 92°32'4" W)|C| | 42877|SH|Mobile Offshore Drilling Unit||Cajun Express - Mississippi Canyon 762||28.180 N 89.290 W (28°10'48" N 89°17'24" W)|C| | 42878|MO|Mobile Offshore Drilling Unit||Paul Romano - Green Canyon 244||27.726 N 90.730 W (27°43'32" N 90°43'49" W)|C| | 42879|CT|Mobile Offshore Drilling Unit||ENSCO 7500 - Atwater Valley 138||27.801 N 89.642 W (27°48'5" N 89°38'32" W)|C| | 42880|NF|Mobile Offshore Drilling Unit||Ocean Voyager - Mississippi Canyon 29||28.936 N 88.543 W (28°56'10" N 88°32'34" W)|C| | 42881|EN|Mobile Offshore Drilling Unit||Transocean Marianas - Atwater Valley 428||27.554 N 88.361 W (27°33'13" N 88°21'38" W)|C| | 42882|AN|Mobile Offshore Drilling Unit||Ocean Valiant - East Breaks 646||27.339 N 94.470 W (27°20'20" N 94°28'13" W)|C| | 42883|TN|Mobile Offshore Drilling Unit||Ocean Concord - Ewing Bank 301||27.678 N 94.151 W (27°40'41" N 94°9'5" W)|C| | 42884|PB|Mobile Offshore Drilling Unit||Falcon 100 - Garden Banks 244||27.735 N 92.740 W (27°44'7" N 92°44'25" W)|C| | 42885|BP|Mobile Offshore Drilling Unit||Development Driller II - Mississippi Canyon 727||28.249 N 88.828 W (28°14'57" N 88°49'40" W)|C| | 42886|AN|Mobile Offshore Drilling Unit||Discoverer Spirit - Green Canyon 770||27.223 N 90.836 W (27°13'24" N 90°50'11" W)|C| | 42887|BP|Fixed Drilling Platform||Thunder Horse - Mississippi Canyon 778||28.191 N 88.496 W (28°11'27" N 88°29'44" W)|C| | 42888|NX|Mobile Offshore Drilling Unit||Arctic 1 - Green Canyon 243||27.712 N 90.786 W (27°42'43" N 90°47'11" W)|C| | 42889|MU|Mobile Offshore Drilling Unit||Medusa - Mississippi Canyon 582||28.394 N 89.465 W (28°23'40" N 89°27'54" W)|C| | 42890|MU|Mobile Offshore Drilling Unit||Front Runner - Green Canyon 338||27.625 N 90.441 W (27°37'29" N 90°26'28" W)|C| | 42891|WO|Mobile Offshore Drilling Unit||Ocean Lexington||27.617 N 92.086 W (27°37'1" N 92°5'11" W)|C| |This system is not currently recording data. Historical data remain available. 42892|AH|Mobile Offshore Drilling Unit||Ocean Baroness - Garden Banks 386||27.599 N 92.298 W (27°35'57" N 92°17'54" W)|C| | 42893|KM|Mobile Offshore Drilling Unit||Therald Martin - East Breaks 588||27.410 N 94.464 W (27°24'37" N 94°27'50" W)|C| |This system is not currently recording data. Historical data remain available. 42894|LL|Mobile Offshore Drilling Unit||Lorris Bouzigard - Mississippi Canyon 199||28.770 N 88.834 W (28°46'13" N 88°50'2" W)|C| | 42895|RS|Mobile Offshore Drilling Unit||Stena DrillMAX - Keathley Canyon 872||26.133 N 92.176 W (26°7'57" N 92°10'35" W)|C| |This is the second usage of this WMO ID.  The previous drilling unit failed during 2006. 42896|BP|Mobile Offshore Drilling Unit||Glomar Explorer - Mississippi Canyon 862||28.271 N 88.853 W (28°16'14" N 88°51'11" W)|C| | 42897|BH|Mobile Offshore Drilling Unit||Development Driller 1 - Atwater Valley 617||27.331 N 89.860 W (27°19'52" N 89°51'36" W)|C| | 42898|WO|Mobile Offshore Drilling Unit||Ocean New Era - Ewing Bank 878||28.092 N 89.964 W (28°5'33" N 89°57'50" W)|C| | 42899|EX|Mobile Offshore Drilling Unit||Ocean Endeavor - Keathley Canyon 919||27.066 N 92.060 W (27°3'59" N 92°3'35" W)|C| | 42900|LL|Mobile Offshore Drilling Unit||Ocean Saratoga - Garden Banks 339||27.632 N 92.420 W (27°37'54" N 92°25'11" W)|C| | 42901|EX|Mobile Offshore Drilling Unit||Eirik Raude - Walker Ridge 584||26.384 N 91.366 W (26°23'2" N 91°21'59" W)|C| | 42902|SH|Mobile Offshore Drilling Unit||Clyde Boudreaux - Alaminos Canyon 857||26.130 N 94.900 W (26°7'48" N 94°54'0" W)|C| | 42903|MO|Mobile Offshore Drilling Unit||Henry Goodrich - Green Canyon 244||27.726 N 90.731 W (27°43'33" N 90°43'52" W)|C| | 42904|AN|Mobile Offshore Drilling Unit||Independence Hub - Mississippi Canyon 920||28.085 N 87.986 W (28°5'6" N 87°59'9" W)|C| | 42905|AN|Mobile Offshore Drilling Unit||Belford Dolphin - Green Canyon 561||27.396 N 90.305 W (27°23'47" N 90°18'17" W)|C| | 42906|PE|Mobile Offshore Drilling Unit||Petrolia - Block Chapabil-1||19.633 N 92.483 W (19°38'0" N 92°29'0" W)|C| | 42907|WO|Mobile Offshore Drilling Unit||Ocean Ambassador - Ewing Bank 1006||27.975 N 90.150 W (27°58'29" N 90°9'1" W)|C| | 42908|BP|Mobile Offshore Drilling Unit||West Sirius - Keathley Canyon 292||26.679 N 92.573 W (26°40'43" N 92°34'23" W)|C| | 42909|AN|Mobile Offshore Drilling Unit||ENSCO 8500 - Walker Ridge 793||26.157 N 91.873 W (26°9'26" N 91°52'24" W)|C| | 42910|SH|Mobile Offshore Drilling Unit||Frontier Driller - Green Canyon 248||27.721 N 90.577 W (27°43'16" N 90°34'37" W)|C| | 42911|MO|Mobile Offshore Drilling Unit||Ocean Monarch - Garden Banks 515||27.464 N 92.433 W (27°27'51" N 92°25'59" W)|C| | 42912|CT|Mobile Offshore Drilling Unit||Discoverer Clear Leader - WR758||26.208 N 91.443 W (26°12'28" N 91°26'34" W)|C| | 42913|NE|Mobile Offshore Drilling Unit||ENSCO 8501 - Green Canyon 723||27.245 N 90.245 W (27°14'43" N 90°14'43" W)|C| | 42914|SL|Mobile Offshore Drilling Unit||Discoverer Americas - Walker Ridge 543||26.442 N 91.190 W (26°26'30" N 91°11'24" W)|C| | 42915|MD|Mobile Offshore Drilling Unit||Maersk Developer - LL400||27.555 N 87.278 W (27°33'19" N 87°16'41" W)|C| | 42916|BP|Mobile Offshore Drilling Unit||Development Driller 3 - Green Canyon 743||27.267 N 90.033 W (27°16'1" N 90°1'59" W)|C| | 42917|CT|Mobile Offshore Drilling Unit||Discoverer Inspiration - Walker Ridge 677||26.298 N 91.093 W (26°17'52" N 91°5'35" W)|C| | 42918|SH|Mobile Offshore Drilling Unit||Noble Danny Adkins - Alaminos Canyon 859||26.133 N 94.800 W (26°7'59" N 94°47'60" W)|C| | 42919|AH|Mobile Offshore Drilling Unit||Stenna Forth - Green Canyon 469||27.504 N 90.532 W (27°30'13" N 90°31'56" W)|C| | 42921|MU|Mobile Offshore Drilling Unit||Deepwater Pathfinder - Mississippi Canyon 734||28.241 N 88.468 W (28°14'28" N 88°28'4" W)|C| | 42922|MU|Mobile Offshore Drilling Unit||Noble Jim Day - DeSoto Canyon 134||28.827 N 87.851 W (28°49'36" N 87°51'4" W)|C| | 42923|LL|Mobile Offshore Drilling Unit||Ensco 8502 - MC761||28.219 N 89.295 W (28°13'8" N 89°17'43" W)|| | 42924|CY|Mobile Offshore Drilling Unit||Ensco 8503 - Green Canyon 814||27.149 N 90.861 W (27°8'57" N 90°51'41" W)|| | 42925|PB|Mobile Offshore Drilling Unit||Ensco 5 - Walker Ridge 250||26.736 N 90.492 W (26°44'8" N 90°29'30" W)|C| | 42926|CT|Mobile Offshore Drilling Unit||Discoverer India - Walker Ridge 29||26.933 N 90.520 W (26°55'57" N 90°31'12" W)|C| | 42927|SH|Mobile Offshore Drilling Unit||Noble Bully 1 - Green Canyon 434||27.555 N 90.070 W (27°33'19" N 90°4'13" W)|C| | 42928|AN|Mobile Offshore Drilling Unit||ENSCO 8505 - Walker Ridge 54||26.927 N 91.564 W (26°55'38" N 91°33'51" W)|C| | 42929|CT|Mobile Offshore Drilling Unit||Pacific Santa Ana - Walker Ridge 98||26.846 N 91.438 W (26°50'47" N 91°26'16" W)|C| | 42930|EX|Mobile Offshore Drilling Unit||Deepwater Champion - Keathley Canyon 918||26.080 N 92.063 W (26°4'47" N 92°3'48" W)|C| | 42otp|N|3-meter discus buoy|19|OSM/NOSIC Test Buoy|ARES payload|30.073 N 88.750 W (30°4'24" N 88°45'0" W)|C|FZUS54.KLIX |This is a test station for the Ocean Sensor Module (OSM) integrated with the NDBC Oceanographic Sensor Interface Controller (NOSIC). 43412|N|2.6-meter discus buoy|2.6D59|240 NM Southwest of Manzanillo, Mexico|DART II payload|16.069 N 106.996 W (16°4'10" N 106°59'47" W)|?| |DART station 43412 has been declared inoperative. No water column height or tsunami data has been received since 12/24/2011. 43413|N|2.6-meter discus buoy|2.6D48|360 NM South-Southwest of Acapulco, Mexico|DART II payload|11.065 N 99.853 W (11°3'54" N 99°51'12" W)|?| | 44001|N|6-meter NOMAD buoy|||MVXI payload|38.700 N 73.600 W (38°42'0" N 73°35'60" W)|E| |(formerly eb41) 44003|N|6-meter NOMAD buoy|||MVXII payload|40.800 N 68.500 W (40°47'60" N 68°30'0" W)|E| |(formerly eb63) 44004|N|6-meter NOMAD buoy|3D06|HOTEL 200NM East of Cape May,NJ|ARES payload|38.484 N 70.433 W (38°29'2" N 70°25'57" W)|E|FZNT22.KWBC |

Station 44004 went adrift on 03/08/2008 and the last report from its moored position was at 2000Z.  The buoy was recovered on 05/18/09. When redeployed the station will be moved approximately 120 nm northwest of its former position, to the outer continental shelf near the Hudson Canyon.  This is to fill the data gap that presently exists along the outer shelf in that area.  This station has since been disestablished and replaced by buoy 44066.

 

 

44005|N|3-meter discus buoy|6N16|GULF OF MAINE 78 NM EAST OF PORTSMOUTH, NH|AMPS payload|43.204 N 69.128 W (43°12'13" N 69°7'40" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike

44006|N|3-meter discus buoy|||GSBP payload|36.300 N 75.400 W (36°17'60" N 75°24'0" W)|E| | 44007|N|3-meter discus buoy|3DV04|PORTLAND 12 NM Southeast of Portland,ME|ARES 4.4 payload|43.531 N 70.144 W (43°31'53" N 70°8'39" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike 44008|N|3-meter discus buoy|3D71|NANTUCKET 54NM Southeast of Nantucket|ARES 4.4 payload|40.502 N 69.247 W (40°30'9" N 69°14'48" W)|E|FZNT21.KWBC |

Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

44009|N|3-meter discus buoy|3D47|DELAWARE BAY 26 NM Southeast of Cape May, NJ|ARES payload|38.464 N 74.702 W (38°27'49" N 74°42'7" W)|E|FZUS51.KPHI FZUS51.KLWX|


 

44010|N|3-meter discus buoy|||GSBP payload|36.900 N 75.700 W (36°53'59" N 75°41'59" W)|E| | 44011|N|3-meter discus buoy|3D75|GEORGES BANK 170 NM East of Hyannis, MA|ARES payload|41.105 N 66.600 W (41°6'18" N 66°36'0" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike 
44012|N|USCG Large Navigational Buoy|||DACT payload|38.800 N 74.600 W (38°47'60" N 74°35'60" W)|E| | 44013|N|3-meter discus buoy|3D85|BOSTON 16 NM East of Boston, MA|ARES 4.4 payload|42.346 N 70.651 W (42°20'44" N 70°39'4" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

44014|N|3-meter discus buoy|3D87|VIRGINIA BEACH 64 NM East of Virginia Beach, VA|ARES 4.4 payload|36.611 N 74.842 W (36°36'41" N 74°50'31" W)|E|FZNT22.KWBC |
  44015|N|3-meter discus buoy|||DACT payload|37.500 N 73.400 W (37°30'0" N 73°24'0" W)|E| | 44017|N|3-meter discus buoy|3DV08|23 Nautical Miles Southwest of Montauk Point, NY|AMPS payload|40.692 N 72.048 W (40°41'32" N 72°2'52" W)|E|FZNT21.KWBC |

Station 44017 stopped transmitting 08/20/11. This buoy was recovered 11/10/11, and will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.


 

44018|N|3-meter discus buoy|3DV02|East of Cape Cod 17NM East-Northeast of Provincetown, MA|AMPS payload|42.126 N 69.630 W (42°7'34" N 69°37'49" W)|E| |

Station 44018 hull 3DV02  went adrift on 3/6/2012. The buoy was recovered on 3/14/12 and will be restored to service when it can be worked into the schedule. When service data is known, it will be posted in the maintenance report.

Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike 

For area forecasts and warnings, select: Boston WFO

On 11/13/11, Buoy 44018 was relocated to a new location approximately 17 nautical miles east-northeast of Provincetown, MA.

44019|N|3-meter discus buoy|||VEEP payload|36.400 N 75.200 W (36°23'60" N 75°12'0" W)|E| | 44020|N|3-meter discus buoy|3D84|NANTUCKET SOUND|ARES 4.4 payload|41.443 N 70.186 W (41°26'35" N 70°11'11" W)|E|FZUS51.KBOX |

Caution: Right whales may be active in northeast waters year-round.  NOAA recommends vessels reduce speeds below 10 knots, when consistent with safe navigation. For latest sightings, go to: http://rwhalesightings.nefsc.noaa.gov/

For area forecasts and warnings, select: Boston WFO

44021|NC|Moored Buoy||Buoy D - New Meadows River||43.782 N 69.888 W (43°46'57" N 69°53'16" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
44022|Y|2.4-meter foam hull buoy||Execution Rocks||40.880 N 73.730 W (40°52'48" N 73°43'48" W)|E|FZUS51.KOKX | 44023|N|3-meter discus buoy|||DACT payload|37.500 N 74.400 W (37°30'0" N 74°24'0" W)|E| | 44024|NC|2-meter discus buoy||Buoy N - Northeast Channel||42.312 N 65.927 W (42°18'42" N 65°55'36" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44025|N|3-meter discus buoy|3DV18|LONG ISLAND 33 NM South of Islip, NY|AMPS payload|40.250 N 73.167 W (40°15'0" N 73°10'0" W)|E|FZUS51.KOKX FZUS51.KPHI|


 

44026|N|3-meter discus buoy|||DACT payload|36.000 N 73.500 W (36°0'0" N 73°30'0" W)|E| | 44027|N|3-meter discus buoy|3D65|Jonesport, Maine|AMPS payload|44.273 N 67.314 W (44°16'21" N 67°18'51" W)|E|FZUS51.KCAR FZNT21.KWBC|Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike

44028|N|USCG Large Navigational Buoy|09|Buzzard's Bay|DACT payload|41.400 N 71.080 W (41°23'60" N 71°4'48" W)|E| |Caution: Right whales may be active in northeast waters year-round. NOAA recommends vessels reduce speeds below 10 knots, when consistent with safe navigation. For latest sightings, go to: http://rwhalesightings.nefsc.noaa.gov/





For area forecasts and warnings, select: Boston WFO

44029|NC|2-meter discus buoy||Buoy A0102 - Mass. Bay/Stellwagen||42.520 N 70.570 W (42°31'12" N 70°34'12" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

44030|NC|2-meter discus buoy||Buoy B0102 - Western Maine Shelf||43.183 N 70.418 W (43°11'0" N 70°25'4" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44031|NC|2-meter discus buoy||Buoy C0201 - Casco Bay||43.570 N 70.060 W (43°34'12" N 70°3'36" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44032|NC|2-meter discus buoy||Buoy E0104 - Central Maine Shelf||43.715 N 69.358 W (43°42'53" N 69°21'28" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike   44033|NC|2-meter discus buoy||Buoy F0103 - West Penobscot Bay||44.060 N 69.000 W (44°3'36" N 69°0'0" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44034|NC|2-meter discus buoy||Buoy I0103 - Eastern Maine Shelf||44.110 N 68.110 W (44°6'36" N 68°6'36" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44035|NC|2-meter discus buoy||Buoy J0201 - Cobscook Bay||44.890 N 67.020 W (44°53'24" N 67°1'12" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44036|NC|2-meter discus buoy||Buoy K0102 - Saint John||45.200 N 66.020 W (45°12'0" N 66°1'12" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44037|NC|2-meter discus buoy||Buoy M0102 - Jordan Basin||43.484 N 67.883 W (43°29'2" N 67°53'0" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44038|NC|2-meter discus buoy||Buoy L0102 - Scotian Shelf||43.633 N 66.550 W (43°38'0" N 66°33'0" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44039|Y|2.4-meter foam hull buoy||Central Long Island Sound||41.138 N 72.655 W (41°8'15" N 72°39'18" W)|E|FZUS51.KOKX | 44040|Y|Buoy||Western Long Island Sound||40.956 N 73.580 W (40°57'21" N 73°34'48" W)|E|FZUS51.KOKX | 44041|CB|Moored Buoy||Jamestown, VA||37.204 N 76.777 W (37°12'15" N 76°46'38" W)|E| | 44042|CB|Moored Buoy||Potomac, MD||38.033 N 76.336 W (38°1'59" N 76°20'8" W)|E| | 44043|CB|CBOS Station||Patapsco, MD||39.152 N 76.391 W (39°9'7" N 76°23'28" W)|E| | 44044|B|Moored Buoy||Patuxent River Buoy||38.389 N 76.526 W (38°23'19" N 76°31'35" W)|E| | 44052|VM|Marine Observation Buoy||Goodwin Islands||37.236 N 76.399 W (37°14'11" N 76°23'56" W)|E| | 44053|VM|Marine Observation Buoy||Gloucester Point||37.244 N 76.500 W (37°14'40" N 76°30'1" W)|E| | 44054|DW|Moored Buoy||Lower Delaware Bay Buoy||38.883 N 75.183 W (38°53'0" N 75°11'0" W)|E| |


 

44055|DW|Moored Buoy||Central Delaware Bay||39.122 N 75.256 W (39°7'20" N 75°15'20" W)|E| | 44056|AC|Waverider Buoy||Duck FRF, NC||36.200 N 75.714 W (36°12'0" N 75°42'51" W)|E| | 44057|CB|Moored Buoy||Susquehanna, MD||39.544 N 76.075 W (39°32'37" N 76°4'29" W)|E| | 44058|CB|Moored Buoy||Stingray Point, VA||37.552 N 76.251 W (37°33'6" N 76°15'5" W)|E| | 44059|CB|Moored Buoy||Norfolk, VA||36.846 N 76.298 W (36°50'44" N 76°17'53" W)|E| | 44060|Y|2.4-meter foam hull buoy||Eastern Long Island Sound||41.263 N 72.067 W (41°15'48" N 72°4'0" W)|E|FZUS51.KOKX | 44061|CB|Moored Buoy||Upper Potomac, MD||38.785 N 77.036 W (38°47'6" N 77°2'8" W)|E| | 44062|CB|Moored Buoy||Gooses Reef, MD||38.556 N 76.415 W (38°33'23" N 76°24'53" W)|E| | 44063|CB|Buoy||Annapolis||38.963 N 76.448 W (38°57'47" N 76°26'51" W)|E| | 44064|CB|Moored Buoy||FIRST LANDING||36.979 N 76.043 W (36°58'46" N 76°2'36" W)|E| | 44065|N|3-meter discus buoy|3D46|Entrance to New York Harbor|ARES payload|40.369 N 73.703 W (40°22'10" N 73°42'10" W)|E|FZUS51.KOKX FZUS51.KPHI| 44066|N|3-meter discus buoy|3D17|Texas Tower #4|ARES 4.4 payload|42.175 N 36.202 W (42°10'30" N 36°12'6" W)|E|FZNT22.KWBC |Station 44066 went adrift on 01/09/2012 and the last report from its moored position was at 0742Z. It ceased transmitting on 2/26/12, and resumed transmitting on 7/10/12 with no position data. This buoy will be restored to service when it can be worked into the schedule. When the service date is known, it will be posted in the  maintenance report. 44067|IN|Buoy||Potomac River, Near HWY 301||38.368 N 76.996 W (38°22'5" N 76°59'45" W)|E| | 44070|N|1.8-meter discus buoy|18D13|Buzzards Bay MA. Offshore|WAMDAS payload|41.392 N 71.004 W (41°23'33" N 71°0'13" W)|E| |

For area forecasts and warnings, select: Boston WFO

Met data for this area are available at BUZM3.

Station 44070 has been disestablished 

44095|R|Waverider Buoy||Oregon Inlet, NC - 192||35.750 N 75.330 W (35°45'0" N 75°19'48" W)|E| | 44096|R|Waverider Buoy||Cape Charles, VA - 186||37.023 N 75.810 W (37°1'23" N 75°48'35" W)|E| | 44097|R|Waverider Buoy||Block Island, RI (154)||40.981 N 71.117 W (40°58'52" N 71°7'1" W)|E| | 44098|NH|Waverider Buoy||Jeffrey's Ledge, NH (160)||42.801 N 70.169 W (42°48'3" N 70°10'7" W)|E| | 44099|R|Waverider Buoy||Cape Henry, VA (147)||36.901 N 75.720 W (36°54'5" N 75°43'12" W)|E| | 44100|R|Waverider Buoy||Duck FRF 26m, NC (430)||36.258 N 75.591 W (36°15'28" N 75°35'29" W)|E| | 44137|C|Canadian NOMAD buoy||East Scotia Slope||42.230 N 62.020 W (42°13'47" N 62°1'12" W)|N| | 44138|C|Canadian NOMAD buoy||SW Grand Banks||44.250 N 53.633 W (44°15'0" N 53°38'0" W)|N| | 44139|C|Canadian NOMAD buoy||Banqureau Banks||44.240 N 57.101 W (44°14'24" N 57°6'5" W)|N| | 44140|C|Canadian NOMAD buoy||Tail of the Bank||42.870 N 51.470 W (42°52'11" N 51°28'11" W)|N| | 44141|C|Canadian NOMAD buoy||Laurentian Fan||42.990 N 57.960 W (42°59'24" N 57°57'36" W)|N| | 44142|C|Canadian NOMAD buoy||La Have Bank||42.500 N 64.033 W (42°30'0" N 64°2'0" W)|N| | 44150|C|3-meter discus buoy||La Have Bank||42.500 N 64.020 W (42°30'0" N 64°1'12" W)|N| | 44172|R|Waverider Buoy||Halifax Harbor, NS, Canada - 176||44.500 N 63.408 W (44°30'0" N 63°24'29" W)|N| | 44174|C|Buoy||Anticosti||49.060 N 60.860 W (49°3'36" N 60°51'36" W)|?| | 44175|C|Buoy||iles de la Madeleine||46.880 N 62.000 W (46°52'48" N 62°0'0" W)|?| | 44235|C|Waverider Buoy||South Ramea Island, Newfoundland (170)||47.263 N 57.341 W (47°15'45" N 57°20'26" W)|N| | 44251|C|Canadian NOMAD buoy||Nickerson Bank||46.440 N 53.390 W (46°26'23" N 53°23'24" W)|N| | 44255|C|Canadian NOMAD buoy||NE Burgeo Bank||47.270 N 57.340 W (47°16'12" N 57°20'24" W)|N| | 44258|C|Canadian NOMAD buoy||Halifax Harbour||44.500 N 63.400 W (44°30'0" N 63°24'0" W)|N| | 44401|N|2.6-meter discus buoy|2.6D76|790 NM NE of Bermuda|DART II payload|37.922 N 50.010 W (37°55'21" N 50°0'37" W)|?| |

Current station has hull 2.6D76.

Old hull 2.6D52 has gone adrift from station 44401 at 4/16/2011 and has been been renamed 444X1. Position data only can be found here

44402|N|2.6-meter discus buoy|2.6D72|136NM SE of Fire Island, NY.|DART II payload|39.399 N 70.942 W (39°23'58" N 70°56'30" W)|?| | 44585|N|Drifting Buoy||Drifting Buoy||43.354 N 67.635 W (43°21'14" N 67°38'6" W)|?| |Wind speed corrected to the 10-meter height. 45001|N|3-meter discus buoy|3DV15|MID SUPERIOR 60NM North Northeast Hancock, MI|AMPS payload|48.064 N 87.777 W (48°3'49" N 87°46'37" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45002|N|2.4-meter discus buoy|2.4DV04|N MICHIGAN- Halfway between North Manitou and Washington Islands.|ARES payload|45.344 N 86.411 W (45°20'40" N 86°24'41" W)|C| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS

45003|N|2.4-meter discus buoy|2.4DV03|N HURON 37NM Northeast of Alpena, MI|ARES payload|45.351 N 82.840 W (45°21'3" N 82°50'23" W)|E| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45004|N|2.4-meter discus buoy|2.4DV05|78NM Northeast of Marquette, MI|ARES payload|47.584 N 86.587 W (47°35'3" N 86°35'12" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS 45005|N|3-meter discus buoy|3DV22|W ERIE 28NM Northwest of Cleveland, OH|AMPS payload|41.677 N 82.398 W (41°40'36" N 82°23'54" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
45006|N|3-meter discus buoy|3DV20|W SUPERIOR 48NM North of Ironwood, MI|AMPS payload|47.335 N 89.793 W (47°20'5" N 89°47'34" W)|C| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45007|N|3-meter discus buoy|3DV19|S MICHIGAN 43NM East Southeast of Milwaukee, WI|AMPS payload|42.674 N 87.026 W (42°40'25" N 87°1'34" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS




45008|N|3-meter discus buoy|3D41|S HURON 43NM East of Oscoda, MI|ARES 4.4 payload|44.283 N 82.416 W (44°17'0" N 82°24'59" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45009|N|3-meter discus buoy|||DACT payload|41.600 N 82.000 W (41°36'0" N 82°0'0" W)|E| | 45010|N|2.4-meter discus buoy|||DACT payload|43.000 N 87.800 W (43°0'0" N 87°47'60" W)|E| | 45011|N|3-meter discus buoy|02|Grand Haven Michigan|VEEP payload|43.020 N 86.270 W (43°1'12" N 86°16'12" W)|E| | 45012|N|2.4-meter foam hull buoy|2.4DV06|Lake Ontario Buoy - 20NM North Northeast of Rochester, NY|ARES payload|43.619 N 77.405 W (43°37'9" N 77°24'18" W)|E| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


 


45013|WM|Buoy||Atwater Park, WI||43.098 N 87.850 W (43°5'54" N 87°50'59" W)|C| | 45014|WM|Buoy||Central Green Bay, WI||44.795 N 87.759 W (44°47'41" N 87°45'32" W)|C| | 45015|CH|Buoy||Calumet Beach||41.714 N 87.527 W (41°42'52" N 87°31'38" W)|C| | 45016|CH|Buoy||Sixth-third St Beach||41.783 N 87.573 W (41°46'58" N 87°34'23" W)|| | 45017|CH|Buoy||Oak St Beach||41.903 N 87.622 W (41°54'12" N 87°37'20" W)|C| | 45018|CH|Buoy||Montrose Ave Beach||41.968 N 87.637 W (41°58'4" N 87°38'14" W)|C| | 45019|CH|Buoy||Foster Ave. Beach||41.979 N 87.649 W (41°58'45" N 87°38'55" W)|C| | 45020|MI|Moored Buoy||Grand Traverse Bay Observing System Station 1||44.789 N 85.604 W (44°47'20" N 85°36'16" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS. 45021|MI|Moored Buoy||Traverse Bay #3, MI||45.048 N 85.493 W (45°2'53" N 85°29'35" W)|E| | 45022|MI|Moored Buoy||Little Traverse Bay, MI||45.403 N 85.088 W (45°24'11" N 85°5'16" W)|E| | 45023|MT|Moored Buoy||Portage Canal||47.279 N 88.611 W (47°16'44" N 88°36'38" W)|E| | 45024|MI|Moored Buoy||Ludington, MI||43.977 N 86.560 W (43°58'36" N 86°33'36" W)|E| | 45025|MT|Buoy||South Entrance to Keweenaw Waterway, MI||46.950 N 88.409 W (46°57'1" N 88°24'34" W)|C| | 45026|LT|Buoy||St. Joseph, MI||41.983 N 86.617 W (41°58'57" N 86°37'0" W)|E| | 45027|MN|Buoy||North of Duluth, MN||46.864 N 91.929 W (46°51'52" N 91°55'45" W)|C| | 45028|MN|||Western Lake Superior||46.812 N 91.835 W (46°48'42" N 91°50'6" W)|C| | 45029|LT|Buoy||Holland, MI||42.801 N 86.264 W (42°48'2" N 86°15'51" W)|E| | 45132|C|Canadian NOMAD buoy||Port Stanley||42.470 N 81.220 W (42°28'12" N 81°13'12" W)|E| | 45135|C|Canadian NOMAD buoy||Prince Edward Pt||43.790 N 76.870 W (43°47'24" N 76°52'12" W)|E| | 45136|C|Canadian NOMAD buoy||Slate Island||48.530 N 86.950 W (48°31'48" N 86°57'0" W)|E| | 45137|C|Canadian NOMAD buoy||Georgian Bay||45.540 N 81.010 W (45°32'24" N 81°0'36" W)|E| | 45138|C|Canadian NOMAD buoy||Mount Louis||49.540 N 65.760 W (49°32'23" N 65°45'36" W)|E| | 45139|C|Canadian NOMAD buoy||West Lake Ontario - Grimsby||43.260 N 79.540 W (43°15'36" N 79°32'24" W)|E| | 45140|C|Canadian NOMAD buoy||Lake Winnipeg S. Basin||50.790 N 96.730 W (50°47'23" N 96°43'48" W)|C| | 45142|C|Canadian NOMAD buoy||Port Colborne||42.740 N 79.290 W (42°44'24" N 79°17'24" W)|E| | 45143|C|||South Georgian Bay||44.940 N 80.630 W (44°56'24" N 80°37'48" W)|E| | 45144|C|Canadian NOMAD buoy||Lake Winnipeg North||53.230 N 98.290 W (53°13'47" N 98°17'24" W)|C| | 45145|C|Canadian NOMAD buoy||Lake Winnipeg Narrows||51.867 N 96.970 W (51°52'0" N 96°58'11" W)|C| | 45147|C|Canadian NOMAD buoy||Lake St Clair||42.430 N 82.680 W (42°25'48" N 82°40'48" W)|E| | 45148|C|Canadian NOMAD buoy||Lake of the Woods||49.660 N 94.520 W (49°39'35" N 94°31'11" W)|C| | 45149|C|Canadian NOMAD buoy||Southern Lake Huron||43.540 N 82.070 W (43°32'23" N 82°4'12" W)|E| | 45151|C|Canadian NOMAD buoy||Lake Simcoe||44.500 N 79.370 W (44°30'0" N 79°22'12" W)|E| | 45152|C|Canadian NOMAD buoy||Lake Nipissing||46.230 N 79.720 W (46°13'48" N 79°43'12" W)|E| | 45154|C|Canadian NOMAD buoy||North Channel East||46.050 N 82.640 W (46°3'0" N 82°38'24" W)|E| | 45159|C|Canadian NOMAD buoy||NW Lake Ontario Ajax||43.770 N 78.980 W (43°46'12" N 78°58'48" W)|E| | 45160|C|Canadian NOMAD buoy||16-Mile Creek||43.417 N 79.633 W (43°25'1" N 79°38'0" W)|E| |Experimental buoy no longer operating. 45161|G|Buoy||Muskegon, MI||43.179 N 86.336 W (43°10'43" N 86°20'11" W)|E| | 45162|G|Buoy||Alpena, MI||44.984 N 83.269 W (44°59'3" N 83°16'7" W)|E| | 45163|G|Buoy||Saginaw Bay, MI||43.988 N 83.599 W (43°59'17" N 83°35'56" W)|E| | 45164|G|Buoy||Cleveland, OH||41.734 N 81.698 W (41°44'1" N 81°41'54" W)|E| | 46001|N|6-meter NOMAD buoy|6N25|GULF OF AK 175NM South East of Kodiak, AK|ARES 4.4 payload|56.304 N 147.920 W (56°18'16" N 147°55'13" W)|A|FZAK61.PAFC | 46002|N|3-meter discus buoy|3D30|OREGON - 275NM West of Coos Bay OR|AMPS payload|42.589 N 130.474 W (42°35'21" N 130°28'28" W)|P|FZPN25.KWBC | 46003|N|6-meter NOMAD buoy| 21|S ALEUTIANS|DACT payload|51.831 N 155.850 W (51°49'53" N 155°51'1" W)|A| |Buoy 46003 disestablished in 1999. Buoy 46066 was established nearby. 46004|C|Canadian NOMAD buoy||Middle Nomad||50.930 N 136.100 W (50°55'47" N 136°6'0" W)|P| | 46005|N|3-meter discus buoy|3D77|WASHINGTON 315NM West of Aberdeen, WA|AMPS payload|46.100 N 131.001 W (46°5'59" N 131°0'5" W)|P|FZPN25.KWBC | 

Station 46005 stopped transmitting 07/01/12. It will be restored to service when it can be worked into the schedule. When the service date is known, it will be posted in the maintenancereport.

46006|N|3-meter discus buoy|3D08|SE PAPA - 600NM West of Eureka, CA|ARES 4.4 payload|40.754 N 137.464 W (40°45'16" N 137°27'51" W)|P|FZPN01.KWBC | 46007|N|6-meter NOMAD buoy|||MVXI payload|59.200 N 152.700 W (59°12'0" N 152°41'60" W)|A| |(formerly eb39) 46008|N|12-meter discus buoy|||MVXII payload|57.100 N 151.700 W (57°6'0" N 151°42'0" W)|A| |(formerly eb72) 46009|N|6-meter NOMAD buoy|||MVXI payload|60.200 N 146.800 W (60°12'0" N 146°48'0" W)|A| |(formerly eb45) 46010|N|USCG Large Navigational Buoy|||GSBP payload|46.200 N 124.200 W (46°12'0" N 124°12'0" W)|P| | 46011|N|3-meter discus buoy|3D68|SANTA MARIA - 21 NM Northwest of Point Arguello, CA|AMPS payload|35.000 N 120.992 W (35°0'0" N 120°59'30" W)|P|FZUS56.KLOX FZUS56.KMTR| 46012|N|3-meter discus buoy|3D13|HALF MOON BAY - 24NM South Southwest of San Francisco, CA|AMPS payload|37.363 N 122.881 W (37°21'45" N 122°52'52" W)|P|FZUS56.KMTR |

Station 46012 is transmitting intermittently since 8/19/12. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

"Potential Explosion Hazard Exists for this Buoy"

46013|N|3-meter discus buoy|3D48|Bodega Bay - 48NM North Northwest of San Francisco, CA|AMPS payload|38.242 N 123.301 W (38°14'31" N 123°18'2" W)|P|FZUS56.KMTR |
"Potential Explosion Hazard Exist for this Buoy"

46014|N|3-meter discus buoy|3D44|PT ARENA - 19NM North of Point Arena, CA|AMPS payload|39.235 N 123.974 W (39°14'6" N 123°58'26" W)|P|FZUS56.KEKA FZUS56.KMTR|"Potential Explosive Hazard Exists for this Buoy"
46015|N|3-meter discus buoy|3DV03|Port Orford - 16 NM West of Port Orford, OR|AMPS payload|42.764 N 124.832 W (42°45'52" N 124°49'57" W)|P|FZUS56.KMFR | 46016|N|Platform EXXON||||63.283 N 170.300 W (63°17'0" N 170°18'0" W)|A| | 46017|N|Platform EXXON 6||||60.283 N 172.300 W (60°17'0" N 172°18'0" W)|A| | 46018|N|MAREX||||60.283 N 177.000 W (60°17'0" N 177°0'0" W)|A| | 46019|N|Platform||||57.200 N 170.300 W (57°12'0" N 170°18'0" W)|A| | 46020|N|MAREX||||55.883 N 168.000 W (55°53'0" N 168°0'0" W)|A| | 46021|N|MAREX||||57.700 N 160.000 W (57°42'0" N 160°0'0" W)|A| | 46022|N|3-meter discus buoy|3D69|EEL RIVER - 17NM West-Southwest of Eureka, CA|ARES 4.4 payload|40.724 N 124.578 W (40°43'25" N 124°34'41" W)|P|FZUS56.KEKA | 46023|N|10-meter discus buoy|10D04| PT ARGUELLO - 17NM West Northwest of Point Arguello, CA|DACT payload|34.714 N 120.967 W (34°42'50" N 120°58'0" W)|P|FZUS56.KLOX |This station has been disestablished as of 9/8/10. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.

In the absence of the station, the NOAA-NDBC directs the user to station  46011 (Santa Maria, CA) which is currently located eleven (11) nautical miles from the disestablished station.

46024|N|10-meter discus buoy|||GSBP payload|33.000 N 119.200 W (33°0'0" N 119°12'0" W)|P| | 46025|N|3-meter discus buoy|3D57|Santa Monica Basin - 33NM West Southwest of Santa Monica, CA|ARES payload|33.749 N 119.053 W (33°44'58" N 119°3'10" W)|P|FZUS56.KLOX |

"Potential Explosion Hazard Exists for this Buoy"

Station 46025 failed on 4/11/2012.  It will be restored to service when it can be worked into the schedule.  When the date is known it will be posted in the Weekly Maintenance Report.

46026|N|3-meter discus buoy|3D60|SAN FRANCISCO - 18NM West of San Francisco, CA|AMPS payload|37.759 N 122.833 W (37°45'32" N 122°50'0" W)|P|FZUS56.KMTR |"Potential Explosion Hazard Exists for this Buoy"

46027|N|3-meter discus buoy|3D28|ST GEORGES - 8NM West Northwest of Crescent City, CA|AMPS payload|41.850 N 124.381 W (41°51'1" N 124°22'52" W)|P|FZUS56.KMFR FZUS56.KEKA|

"Potential Explosion Hazard Exists for this Buoy"

46028|N|3-meter discus buoy|3D53|CAPE SAN MARTIN - 55NM West Northwest of Morro Bay, CA|ARES payload|35.741 N 121.884 W (35°44'29" N 121°53'3" W)|P|FZUS56.KMTR |
46029|N|3-meter discus buoy|3D86|COL RIVER BAR - 20NM West of Columbia River Mouth|ARES 4.4 payload|46.159 N 124.514 W (46°9'32" N 124°30'52" W)|P|FZUS56.KPQR | 46030|N|3-meter discus buoy| 56|BLUNTS REEF|VEEP payload|40.423 N 124.525 W (40°25'22" N 124°31'31" W)|P|FZUS56.KEKA |This station was dis established during 2002. The National Weather Service decided to move the station location to Southern Oregon, where it is identified as 46015. The closest buoy is now 46022. 46031|N|Platform||||55.500 N 161.683 W (55°30'0" N 161°41'0" W)|P| | 46032|N|MAREX||||54.200 N 165.800 W (54°12'0" N 165°48'0" W)|A| | 46033|N|MAREX||||55.783 N 159.800 W (55°47'0" N 159°48'0" W)|P| | 46034|N|MAREX||||55.100 N 163.100 W (55°6'0" N 163°5'60" W)|A| | 46035|N|12-meter discus buoy|12D02|BERING SEA 310 NM North of Adak, AK|ARES 4.4 payload|57.067 N 177.750 W (57°4'0" N 177°45'0" W)|A|FZAK62.PAFC | 46036|C|Canadian NOMAD buoy||South Nomad||48.351 N 133.940 W (48°21'5" N 133°56'23" W)|P| | 46037|N|3-meter discus buoy|||DACT payload|48.300 N 133.800 W (48°17'60" N 133°48'0" W)|P| | 46038|N|ELB|||DACT payload|41.900 N 124.400 W (41°53'60" N 124°24'0" W)|P| | 46039|N|ATON|||DACT payload|48.200 N 123.400 W (48°12'0" N 123°24'0" W)|P| | 46040|N|3-meter discus buoy|||DACT payload|44.800 N 124.300 W (44°47'60" N 124°17'60" W)|P| | 46041|N|3-meter discus buoy|3D19|CAPE ELIZABETH- 45NM Northwest of Aberdeen, WA|AMPS payload|47.349 N 124.708 W (47°20'58" N 124°42'30" W)|P|FZUS56.KSEW |"Potential Explosion Hazard Exists for this Buoy" 46042|N|3-meter discus buoy|3D69|MONTEREY - 27NM West of Monterey Bay, CA|ARES payload|36.785 N 122.469 W (36°47'7" N 122°28'9" W)|P|FZUS56.KMTR |"Potential Explosion Hazard Exists for this Buoy" 46043|N|ELB|||DACT payload|46.900 N 124.200 W (46°53'60" N 124°12'0" W)|P| | 46044|MB|2.3-meter NOOSS buoy|2.3DV05||AMPS payload|36.751 N 122.335 W (36°45'5" N 122°20'6" W)|| |NDBC/MBARI Co-op Effort

This site is currently in test. This is NOT an operational weather station.

Subsurface Conductivity and Temperature data are available at 46B44. 46045|N|3-meter discus buoy|V08|REDONDO BEACH|DACT payload|33.840 N 118.450 W (33°50'24" N 118°27'0" W)|P|FZUS56.KLOX | 46047|N|3-meter discus buoy|3D27|TANNER BANK - 121NM West of San Diego, CA|ARES 4.4 payload|32.403 N 119.536 W (32°24'11" N 119°32'8" W)|P|FZUS56.KSGX FZPN26.KWBC| 46048|N|10-meter discus buoy|||VEEP payload|32.900 N 117.900 W (32°53'60" N 117°54'0" W)|P| | 46050|N|3-meter discus buoy|3D05|STONEWALL BANK - 20NM West of Newport, OR|AMPS payload|44.639 N 124.534 W (44°38'20" N 124°32'2" W)|P|FZUS56.KPQR |


46051|N|3-meter discus buoy|41|Harvest Experiment Platform|DACT payload|34.480 N 120.690 W (34°28'48" N 120°41'24" W)|P|FZUS56.KLOX | 46053|N|3-meter discus buoy|3D10|E. SANTA BARBARA - 12NM Southwest of Santa Barbara, CA|ARES 4.4 payload|34.248 N 119.841 W (34°14'52" N 119°50'28" W)|P|FZUS56.KLOX | 46054|N|3-meter discus buoy|3D26|SANTA BARBARA W 38 NM West of Santa Barbara, CA|ARES payload|34.274 N 120.459 W (34°16'28" N 120°27'34" W)|P|FZUS56.KLOX |

Station 46054 is transmitting intermittently.   This buoy will be restored to servicewhen it can be worked into the schedule.  When the service date is known,it will be posted in the maintenancereport.

46059|N|3-meter discus buoy|3D09|CALIFORNIA - 357NM West of San Francisco, CA|AMPS payload|38.047 N 129.969 W (38°2'49" N 129°58'8" W)|P|FZPN26.KWBC |

Station 46059 went adrift on 05/19/2012 and the last report from its moored position was at 1000Z.  The buoy was recovered on 6/5/12, and will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

Click here to see the latest positions.

46060|N|3-meter discus buoy|3D52|West Orca Bay 36NM South Southwest of Valdez, AK|AMPS payload|60.584 N 146.784 W (60°35'1" N 146°47'1" W)|A|FZAK51.PAFC |

Station 46060 has been re established with hull 3D52. The previous hull 3D61 is still adrift/aground.

46061|N|6-meter NOMAD buoy|6N18|Seal Rocks 55NM South of Valdez, AK|ARES 4.4 payload|60.233 N 146.834 W (60°13'58" N 146°50'1" W)|A|FZAK51.PAFC | 46062|N|3-meter discus buoy|06|Pt. San Luis, CA - 18 NM South Southwest of Morro Bay, CA|ARES payload|35.101 N 121.010 W (35°6'3" N 121°0'36" W)|P|FZUS56.KLOX |Station 46062 was disestablished on November 21, 2004. 46063|N|3-meter discus buoy|3D60|Pt.Conception, CA - 50NM West of Santa Barbara, CA|ARES 4.4 payload|34.273 N 120.699 W (34°16'21" N 120°41'55" W)|P|FZUS56.KLOX |This station has been disestablished.

The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.   In the absence of the station, the NOAA-NDBC directs the user to station 46054 (Santa Barbara, CA) which is currently located eleven (11) nautical miles from the disestablished station. 46066|N|6-meter NOMAD buoy|6N42|S Aleutians 380NM Southwest of Kodiak, AK|ARES payload|52.737 N 154.961 W (52°44'14" N 154°57'40" W)|A|FZPN01.KWBC | Station 46066 stopped transmitting 10/25/11. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 46069|N|3-meter discus buoy|3D89|South Santa Rosa Island, CA|AMPS payload|33.670 N 120.200 W (33°40'13" N 120°12'0" W)|P|FZUS56.KLOX |
  46070|N|6-meter NOMAD buoy|6N49|S.W. Bering Sea|ARES payload|55.083 N 175.270 E (55°5'0" N 175°16'12" E)|A| |

For area forecasts and warnings, select: Anchorage WFO.


46071|N|6-meter NOMAD buoy|6N44|Western Aleutians|ARES payload|51.141 N 179.119 E (51°8'28" N 179°7'9" E)|A|FZAK52.PAFC |

NOTICE:  In addition  to  the  present 6  meter  hull  for  station  46071, the  old  6  meter  hull  forthe station  is  still located  at  position 51.155N, 179.001E (51*09'17"N 179*00'02"E)

46072|N|6-meter NOMAD buoy|6N32|Central Aleutians 230NM Southwest of Dutch Harbor|ARES 4.4 payload|51.663 N 172.162 W (51°39'46" N 172°9'43" W)|A|FZAK52.PAFC |


46073|N|12-meter discus buoy|12D01|Southeast Bering Sea|MARS payload|55.011 N 171.981 W (55°0'40" N 171°58'50" W)|A|FZAK52.PAFC |Station 46073 stopped transmitting 04/07/11. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.  46075|N|6-meter NOMAD buoy|6N46|Shumagin Islands, AK|ARES payload|53.911 N 160.806 W (53°54'39" N 160°48'21" W)|A|FZAK52.PAFC | 46076|N|6-meter NOMAD buoy|6N61|Cape Cleare AK|ARES payload|59.498 N 147.983 W (59°29'54" N 147°58'59" W)|A|FZAK51.PAFC | 46077|N|6-meter NOMAD buoy|6N52|Shelikof Strait, AK|ARES payload|57.892 N 154.291 W (57°53'32" N 154°17'26" W)|A| |CAUTION....This buoy is protected from northwest winds. Northwest winds may be much stronger in other parts of Shelikof Strait.
46078|N|6-meter NOMAD buoy|6N54|Albatross Banks AK|ARES payload|56.074 N 152.572 W (56°4'25" N 152°34'20" W)|A|FZAK51.PAFC |

Station 46078 stopped transmitting on 1/18/12. Station 46078 was discovered to not have an O&I Light 6/19/12. Buoy damaged beyond repair. This buoy will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.  

46079|N|6-meter NOMAD buoy|34|Barren Island|DACT payload|59.050 N 152.230 W (59°3'0" N 152°13'48" W)|N|FZAK51.PAFC |Buoy 46079 has failed. 46080|N|6-meter NOMAD buoy|6N41|Northwest Gulf 57NM East of Kodiak, AK|ARES payload|58.036 N 149.985 W (58°2'10" N 149°59'5" W)|A|FZAK61.PAFC |
  46081|N|6-meter NOMAD buoy|6N35|Western Prince William Sound|ARES 4.4 payload|60.794 N 148.285 W (60°47'40" N 148°17'5" W)|A|FZAK51.PAFC |

Station 46081 stopped transmitting 12/04/11. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

Funding to support water measurements of the velocity profile, temperature, and salinity is provided by the Prince William Sound Science Center.

NDBC ADCPs are now quality controlled using automated methods. Historical and forty-five day files beginning 1 June 2010 are available in a new format that contains more QC information.  The forty-five day files in the old format will be resident until approximately 31 July 2010.

46082|N|6-meter NOMAD buoy|6N47|Cape Suckling 84NM Southeast of Cordova, AK|ARES 4.4 payload|59.668 N 143.392 W (59°40'6" N 143°23'32" W)|A|FZAK52.PAJK FZAK51.PAJK| 46083|N|6-meter NOMAD buoy|6N31|Fairweather Grounds 92NM Southeast of Yakutat, AK|ARES 4.4 payload|58.237 N 137.986 W (58°14'13" N 137°59'8" W)|A|FZAK52.PAJK FZAK51.PAJK|
46084|N|6-meter NOMAD buoy|6N14|Cape Edgecumbe Buoy AK|ARES 4.4 payload|56.612 N 136.065 W (56°36'44" N 136°3'55" W)|A|FZAK52.PAJK FZAK51.PAJK|

Station 46084 went adrift on 08/25/2012 and the last report from its moored position was at 0600Z. The buoy was recovered on 8/31/12, and will be restored to service when it can be worked into the schedule. When service date is known, it will be posted int he maintenance report.

46085|N|6-meter NOMAD buoy|6N21|Central Gulf of Alaska Buoy|ARES 4.4 payload|55.868 N 142.492 W (55°52'5" N 142°29'31" W)|A|FZAK52.PAJK FZAK51.PAJK|Station 46085 stopped transmitting on 6/23/12. This buoy will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 46086|N|3-meter discus buoy|3D20|San Clemente Basin|ARES 4.4 payload|32.491 N 118.034 W (32°29'27" N 118°2'4" W)|P|FZUS56.KSGX | 46087|N|3-meter discus buoy|3D16|Neah Bay, WA (Traffic Separation Lighted Buoy)|AMPS payload|48.494 N 124.728 W (48°29'37" N 124°43'39" W)|P|FZUS56.KSEW | 46088|N|3-meter discus buoy|3D90|New Dungeness, WA (Hein Bank)|AMPS payload|48.333 N 123.167 W (48°20'0" N 123°10'0" W)|P|FZUS56.KSEW |Pressure Tendency is not normally reported for this station. 46089|N|3-meter discus buoy|3D62|Tillamook, OR - 85 NM WNW of Tillamook, OR|AMPS payload|45.893 N 125.819 W (45°53'36" N 125°49'9" W)|P|FZUS56.KPQR |Station 46089 stopped transmitting 08/12/2012. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 46091|MB|Buoy||MBM0||36.835 N 121.899 W (36°50'6" N 121°53'55" W)|P|FZUS56.KMTR | 46092|MB|Buoy||MBM1||36.750 N 122.020 W (36°45'0" N 122°1'12" W)|P|FZUS56.KMTR | 46093|MB|Buoy||MBM2||36.690 N 122.410 W (36°41'24" N 122°24'36" W)|P|FZUS56.KMTR | 46094|OR|Moored Buoy||West of Newport NH-10, OR||44.633 N 124.304 W (44°38'0" N 124°18'13" W)|P| | 46096|CM|Buoy||Columbia River Entrance - SATURN Station #02 Offshore||46.173 N 124.127 W (46°10'24" N 124°7'38" W)|P| | 46105|N|1.8-meter discus buoy|1.8D06|South Cook Inlet AK|WAMDAS payload|59.049 N 152.233 W (59°2'55" N 152°14'0" W)|A|FZAK51.PAFC |

Station 46105 ceased transmitting on 1/16/12.

 

46106|N|1.8-meter discus buoy||Central Cook Inlet AK|WAMDAS payload|59.760 N 152.090 W (59°45'36" N 152°5'24" W)|A|FZAK58.PAVW FZAK51.PAFC|

Other weather data for this area are available at FILA2.

Station 46106 stopped transmitting 2/25/2010, went adrift on 05/17/2010, and was recovered to port on 5/21/10.

This station has been disestablished as of 5/6/11. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.

Another buoy, owned and operated by the Scripps CDIP program has been established on this location and is providing data as station 46108.

46107|N|1.8-meter discus buoy|1.8D09|Montague Strait|WAMDAS payload|59.925 N 147.992 W (59°55'30" N 147°59'31" W)|A|FZAK51.PAJK |This station has been disestablished as of 2/12/11. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. 46108|R|Waverider Buoy||Central Cook Inlet - 175||59.760 N 152.090 W (59°45'36" N 152°5'24" W)|A| |This buoy is deployed on the same location previously operated by NDBC as Station 46106. 46109|IN|Buoy||Port Angeles Buoy||48.123 N 123.395 W (48°7'23" N 123°23'42" W)|P| | 46110|IN|Buoy||Sequim Buoy||48.115 N 123.032 W (48°6'56" N 123°1'54" W)|P| | 46111|IN|Buoy||Fort Worden Buoy||48.131 N 122.748 W (48°7'51" N 122°44'54" W)|P| | 46112|IN|Buoy||Marrowstone Buoy||48.100 N 122.730 W (48°5'59" N 122°43'48" W)|P| | 46113|IN|Buoy||Poulsbo Buoy||47.730 N 122.646 W (47°43'47" N 122°38'45" W)|P| | 46114|N|Waverider Buoy|30743|West Monterey Bay, CA|An industry-supplied payload|36.710 N 122.342 W (36°42'35" N 122°20'32" W)|P| | 46115|N|12-meter discus buoy||Bering Sea|ARES 4.4 payload|57.069 N 177.750 W (57°4'10" N 177°45'0" W)|?| |For area forecasts and warnings, select: Anchorage WFO

Hourly air temperature, wind  and wave data from another payload system on this deployed buoy are available using this link: 46035

Data from station 46035 will be restored to full service when it can be worked into the schedule.  When the date is known, it will be posted in the Maintenance Report.
46120|WA|Buoy||Pt Wells, WA (U of Wash)||47.761 N 122.397 W (47°45'40" N 122°23'50" W)|P| | 46121|WA|Buoy||Carr Inlet, WA (U of Wash) ||47.280 N 122.730 W (47°16'48" N 122°43'48" W)|P| | 46122|WA|Buoy||Dabob Bay, WA (U of Wash)||47.803 N 122.803 W (47°48'12" N 122°48'10" W)|P| | 46123|WA|Buoy||Twanoh - Hood Canal, WA (U of Wash)||47.375 N 123.008 W (47°22'30" N 123°0'30" W)|P| | 46124|WA|Buoy||Hoodsport - Hood Canal, WA (U of Wash)||47.422 N 123.112 W (47°25'18" N 123°6'45" W)|P| | 46125|WA|Buoy||Hansville - Hood Canal, WA||47.907 N 122.627 W (47°54'26" N 122°37'37" W)|P| | 46131|C|Canadian NOMAD buoy||Sentry Shoal||49.910 N 124.990 W (49°54'35" N 124°59'23" W)|P| | 46132|C|Canadian NOMAD buoy||South Brooks||49.740 N 127.930 W (49°44'24" N 127°55'48" W)|P| | 46134|C|Canadian NOMAD buoy||Pat Bay||48.650 N 123.500 W (48°38'59" N 123°30'0" W)|P| | 46138|C|Waverider Buoy||South Hecate Strait, Canada (174)||52.437 N 129.795 W (52°26'12" N 129°47'42" W)|A| | 46139|C|Waverider Buoy||La Perouse Bank DWR, Canada (215)||48.840 N 126.000 W (48°50'24" N 126°0'0" W)|P| |To view data from a nearby buoy 46206.
46145|C|Canadian NOMAD buoy||Central Dixon Entrance Buoy||54.370 N 132.420 W (54°22'11" N 132°25'11" W)|P| | 46146|C|Canadian NOMAD buoy||Halibut Bank||49.340 N 123.730 W (49°20'24" N 123°43'48" W)|P| | 46147|C|Canadian NOMAD buoy||South Moresby||51.830 N 131.220 W (51°49'47" N 131°13'11" W)|P| | 46181|C|Canadian NOMAD buoy||Nanakwa Shoal||53.830 N 128.830 W (53°49'47" N 128°49'47" W)|P| | 46183|C|Canadian NOMAD buoy||North Hecate Strait||53.620 N 131.100 W (53°37'11" N 131°6'0" W)|P| | 46184|C|Canadian NOMAD buoy||North Nomad||53.910 N 138.850 W (53°54'35" N 138°51'0" W)|P| | 46185|C|Canadian NOMAD buoy||South Hecate Strait||52.420 N 129.790 W (52°25'12" N 129°47'23" W)|P| | 46204|C|Canadian NOMAD buoy||West Sea Otter||51.370 N 128.750 W (51°22'11" N 128°45'0" W)|P| | 46205|C|Canadian NOMAD buoy||West Dixon Entrance||54.160 N 134.280 W (54°9'35" N 134°16'48" W)|P| | 46206|C|Canadian NOMAD buoy||La Perouse Bank||48.840 N 126.000 W (48°50'24" N 126°0'0" W)|P| |To view data from a nearby buoy 46139. 46207|C|Canadian NOMAD buoy||East Dellwood||50.870 N 129.920 W (50°52'11" N 129°55'11" W)|P| | 46208|C|Canadian NOMAD buoy||West Moresby||52.520 N 132.690 W (52°31'12" N 132°41'23" W)|P| | 46211|R|Waverider Buoy||Grays Harbor, WA (036)||46.857 N 124.244 W (46°51'24" N 124°14'40" W)|P| | 46212|R|Waverider Buoy||Humboldt Bay South Spit, CA (128)||40.753 N 124.313 W (40°45'12" N 124°18'48" W)|P|FZUS56.KEKA | 46213|R|Waverider Buoy||Cape Mendocino, CA (094)||40.294 N 124.740 W (40°17'38" N 124°44'25" W)|P|FZUS56.KEKA | 46214|R|Waverider Buoy||Point Reyes, CA (029)||37.945 N 123.470 W (37°56'43" N 123°28'11" W)|P|FZUS56.KMTR | 46215|R|Waverider Buoy||Diablo Canyon, CA (076)||35.204 N 120.860 W (35°12'13" N 120°51'36" W)|P|FZUS56.KLOX | 46216|R|Waverider Buoy||Goleta Point, CA (107)||34.334 N 119.804 W (34°20'1" N 119°48'13" W)|P|FZUS56.KLOX | 46217|R|Waverider Buoy||Anacapa Passage, CA (111)||34.167 N 119.435 W (34°10'2" N 119°26'5" W)|P|FZUS56.KLOX | 46218|R|Waverider Buoy||Harvest, CA (071)||34.451 N 120.769 W (34°27'2" N 120°46'7" W)|P|FZUS56.KLOX | 46219|R|Waverider Buoy||San Nicolas Island, CA (067)||33.221 N 119.882 W (33°13'17" N 119°52'55" W)|P|FZUS56.KLOX | 46220|R|Waverider Buoy||El Porto, CA (125)||33.897 N 118.446 W (33°53'48" N 118°26'45" W)|P|FZUS56.KLOX |

Station 46220 was disestablished October 5, 2004. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box.

46221|R|Waverider Buoy||Santa Monica Bay, CA (028)||33.854 N 118.633 W (33°51'16" N 118°37'59" W)|P|FZUS56.KLOX | 46222|R|Waverider Buoy||San Pedro, CA (092)||33.618 N 118.317 W (33°37'4" N 118°19'1" W)|P|FZUS56.KLOX | 46223|R|Waverider Buoy||Dana Point, CA (096)||33.458 N 117.767 W (33°27'30" N 117°46'0" W)|P|FZUS56.KLOX | 46224|R|Waverider Buoy||Oceanside Offshore, CA (045)||33.179 N 117.471 W (33°10'46" N 117°28'17" W)|P|FZUS56.KSGX | 46225|R|Waverider Buoy||Torrey Pines Outer, CA (100)||32.930 N 117.393 W (32°55'49" N 117°23'33" W)|P|FZUS56.KSGX | 46226|R|Waverider Buoy||Point La Jolla, CA (095)||32.848 N 117.353 W (32°50'53" N 117°21'12" W)|P|FZUS56.KSGX FZUS56.KLOX|

Station 46226 was disestablished October 4, 2005. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box.

46227|R|Waverider Buoy||Point Loma, CA (091)||32.632 N 117.444 W (32°37'55" N 117°26'40" W)|P|FZUS56.KSGX |This was a seasonal buoy: February - July.

Station 46227 was disestablished August 27, 2005.  Use the "Observations from Nearby Stations and Ships" link below to see a listing of the nearest stations. The historical data will remain available. The station page is accessible via our historical map, or you can always just put the station ID in the Station ID Search box.


46228|R|Waverider Buoy||Pitas Point, CA (130)||34.317 N 119.417 W (34°19'0" N 119°25'0" W)|P|FZUS56.KLOX |Station 46228 was disestablished September 2, 2005. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46229|R|Waverider Buoy||UMPQUA OFFSHORE, OR (139)||43.769 N 124.551 W (43°46'10" N 124°33'2" W)|P| | 46230|R|Waverider Buoy||Huntington Beach Nearshore, CA (172)||33.623 N 118.012 W (33°37'23" N 118°0'43" W)|P|FZUS56.KLOX |Station 46230 was disestablished November 17, 2006. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46231|R|Waverider Buoy||Mission Bay, CA (093)||32.748 N 117.370 W (32°44'52" N 117°22'11" W)|P|FZUS56.KSGX | 46232|R|Waverider Buoy||Point Loma South, CA (191)||32.530 N 117.431 W (32°31'49" N 117°25'52" W)|P|FZUS56.KSGX | 46233|SC|Offshore Buoy||SCCOOS San Diego Mooring||32.936 N 117.320 W (32°56'10" N 117°19'11" W)|P|FZUS56.KSGX | 46234|R|Waverider Buoy||Port Hueneme Nearshore, CA (141)||34.100 N 119.168 W (34°6'0" N 119°10'3" W)|P|FZUS56.KLOX |Station 46234 was disestablished March 4, 2009. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46235|R|Waverider Buoy||Imperial Beach Nearshore, CA (155)||32.572 N 117.167 W (32°34'18" N 117°10'0" W)|P|FZUS56.KSGX |Station 46235 was disestablished January 14, 2010. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46236|R|Waverider Buoy||Monterey Canyon Outer, CA (156)||36.761 N 121.947 W (36°45'38" N 121°56'48" W)|P|FZUS56.KMTR | 46237|R|Waverider Buoy||San Francisco Bar, CA (142)||37.781 N 122.599 W (37°46'53" N 122°35'56" W)|P| | 46238|R|Waverider Buoy||San Nicolas Island North, CA (167)||33.499 N 119.490 W (33°29'57" N 119°29'23" W)|P| | 46239|R|Waverider Buoy||Point Sur, CA (157)||36.338 N 122.101 W (36°20'16" N 122°6'5" W)|P| | 46240|R|Waverider Buoy||Cabrillo Point, Monterey Bay, CA (158)||36.626 N 121.907 W (36°37'35" N 121°54'26" W)|P| | 46241|R|Waverider Buoy||San Elijo Nearshore, CA (161)||33.003 N 117.292 W (33°0'10" N 117°17'30" W)|P| | 46242|R|Waverider Buoy||Camp Pendleton Nearshore, CA (043)||33.220 N 117.440 W (33°13'12" N 117°26'23" W)|P| | 46243|R|Waverider Buoy||Clatsop Spit, OR - 162||46.216 N 124.128 W (46°12'56" N 124°7'41" W)|P| | 46244|R|Waverider Buoy||Humboldt Bay, North Spit, CA||40.888 N 124.357 W (40°53'18" N 124°21'24" W)|P| | 46245|R|Waverider Buoy||Ventura Nearshore, CA - 169||34.251 N 119.308 W (34°15'3" N 119°18'28" W)|P| |Station 46245 was disestablished February 9, 2011. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46246|R|Waverider Buoy||Ocean Station PAPA (166)||49.985 N 145.089 W (49°59'7" N 145°5'20" W)|P| | 46247|R|Waverider Buoy||San Francisco Offshore, CA (180)||37.753 N 122.833 W (37°45'12" N 122°50'0" W)|P| | 46248|R|Waverider Buoy||Astoria Canyon, OR (179)||46.133 N 124.667 W (46°8'0" N 124°40'2" W)|P| | 46249|R|Waverider Buoy||Santa Cruz Island South, CA (182)||33.821 N 119.708 W (33°49'17" N 119°42'30" W)|P| | 46250|R|Waverider Buoy||Point Mugu Offshore, CA - 184||34.034 N 119.090 W (34°2'3" N 119°5'24" W)|P| |Station 46250 was disestablished September 14, 2011. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46270|N|6-meter NOMAD buoy|6N49|S.W. Bering Sea|ARES payload|55.003 N 175.284 E (55°0'11" N 175°17'2" E)|?| |For area forecasts and warnings, select: Anchorage WFO

Hourly data, without winds, from another payload system on this deployed buoy are available using this link: 46070.

Data transmissions from this station are sporadic.  Data from station 46070 will be restored to full service when it can be worked into the schedule.  When the date is known, it will be posted in the Maintenance Report.
46290|N|2.3-meter NOOSS buoy|2.3D03|NOOSS Optimization Buoy||32.659 N 120.630 W (32°39'32" N 120°37'48" W)|| |Station 46290 stopped transmitting 10/16/08, and has gone adrift.  Click here to see the latest positions on the adrift buoy.  46401|N|2.6-meter discus buoy||East of ADAK, AK|DART I payload|46.638 N 170.790 W (46°38'15" N 170°47'24" W)|?| |DART Station 46401 was disestablished on 23 July 2006. 46402|N|2.6-meter discus buoy|2.6D14|240 NM South of Dutch Harbor, AK|DART II payload|51.068 N 164.020 W (51°4'6" N 164°1'12" W)|?| |

Station 46402 has been serviced and is back in operation.

46403|N|2.6-meter discus buoy|2.6D41|230 NM Southeast of Shumagin Island, AK|DART II payload|52.650 N 156.943 W (52°38'59" N 156°56'34" W)|?| | 46404|N|2.6-meter discus buoy|2.6D16|230 NM West of Astoria, OR|DART II payload|45.858 N 128.768 W (45°51'29" N 128°46'4" W)|?| |Buoy hull 2.6D16 from station 46404 went adrift on 12/26/2011 and is no longer providing water column or tsunami event data. This buoy is recovered 2/01/2012. It will be restored into service when it can be recovered and then worked into the maintenance schedule.  Click here to see the latest positions.
46405|N|2.6-meter discus buoy||325 NM West-Southwest of Newport, OR|DART I payload|42.903 N 130.909 W (42°54'11" N 130°54'32" W)|?| |46405 has been disestablished and a new station has been established at 46407
46406|N|2.6-meter discus buoy||2,900 NM Southeast of Hawaii|DART I payload|8.491 S 125.022 W (8°29'26" S 125°1'21" W)|?| |Station data from DART 46406 was placed in test on September 1, 2006 in preparation for a buoy exchange. Data from this DART location resumed on Tuesday, September 5, 2006 as DART station 51406. 46407|N|2.6-meter discus buoy|2.6D74|210 NM West of Coos Bay, OR|DART II payload|42.605 N 128.897 W (42°36'18" N 128°53'49" W)|?| |

Buoy hull 2.6D74 went adrift from station 46407 before 5/1/12 0113Z and is no longer providing water column height  or tsunami event data. It will be restored into service when it can be recovered and then worked into the maintenance schedule.  

Click  here  to see latest positions.

46408|N|2.6-meter discus buoy|26D39|NW Pacific S AK|DART II payload|49.626 N 169.855 W (49°37'34" N 169°51'17" W)|?| |

DART station 46408 data is showing low level spiking in the 30-45mm range due to unknown causes. Tsunami threshhold has been increased to 50mm.

46409|N|2.6-meter discus buoy|2.6D51|240 NM Southeast of Kodiak, AK|DART II payload|55.300 N 148.515 W (55°18'1" N 148°30'55" W)|?| | 46410|N|2.6-meter discus buoy|2.6D12|330 NM Southeast of Anchorage, AK|DART II payload|57.635 N 143.786 W (57°38'5" N 143°47'8" W)|?|FZAK67.PAJK FZAK61.PAJK| 46411|N|2.6-meter discus buoy|2.6D20|260 NM Northwest of San Francisco, CA|DART II payload|39.349 N 127.021 W (39°20'55" N 127°1'15" W)|?| | 46412|N|2.6-meter discus buoy|2.6D58|190 NM West-Southwest of San Diego, CA|DART II payload|32.456 N 120.558 W (32°27'22" N 120°33'29" W)|?| | 46413|N|2.6-meter discus buoy|D01|East of ADAK, AK|DART II payload|48.305 N 174.212 W (48°18'18" N 174°12'42" W)|?| | 46419|N|2.6-meter discus buoy|2.6D32|300 NM West-Northwest of Seattle, WA|DART II payload|48.766 N 129.633 W (48°45'59" N 129°37'57" W)|?| | 46490|N|Moored Buoy|2.3D02|NOOSS Optimization Buoy |DART II payload|32.455 N 120.557 W (32°27'19" N 120°33'25" W)|P| | 46499|N|2.6-meter discus buoy||DART Special Test |DART II payload|40.000 N 150.000 W (40°0'0" N 150°0'0" W)|P| |

This is a special test identifier. 

The buoy is not deployed.  Data are canned data.  Disregard all event data. 

This is a special test identifier.

46518|AK|Drifting Buoy||Drifting Buoy||44.500 N 170.000 W (44°30'0" N 170°0'0" W)|?| | 46531|AK|Drifting Buoy||Drifting Buoy||41.000 N 165.000 W (41°0'0" N 165°0'0" W)|?| | 46534|AK|Drifting Buoy||Drifting Buoy||48.000 N 165.000 W (48°0'0" N 165°0'0" W)|?| | 46537|C|Drifting Buoy||Drifting Buoy||51.000 N 165.000 W (51°0'0" N 165°0'0" W)|?| | 46538|AK|Drifting Buoy||Drifting Buoy||24.140 N 127.900 W (24°8'24" N 127°54'0" W)|?| | 46551|N|Drifting Buoy||Drifting Buoy||53.033 N 161.810 W (53°2'0" N 161°48'36" W)|?| | 46553|N|Drifting Buoy||Drifting Buoy||54.540 N 165.440 W (54°32'24" N 165°26'24" W)|?| | 46559|C|Drifting Buoy||Drifting Buoy||29.550 N 177.580 W (29°33'0" N 177°34'48" W)|?| | 46561|C|Drifting Buoy||Drifting Buoy||28.390 N 171.290 W (28°23'24" N 171°17'24" W)|?| | 46562|C|Drifting Buoy||Drifting Buoy||35.910 N 133.150 W (35°54'36" N 133°9'0" W)|?| | 46563|C|Drifting Buoy||Drifting Buoy||50.440 N 144.940 W (50°26'24" N 144°56'24" W)|?| | 46564|C|Drifting Buoy||Drifting Buoy||27.180 N 159.010 W (27°10'48" N 159°0'36" W)|?| | 46565|AK|Drifting Buoy||Drifting Buoy||44.500 N 170.000 W (44°30'0" N 170°0'0" W)|?| | 46632|C|Drifting Buoy||Drifting Buoy||47.300 N 168.100 W (47°17'60" N 168°5'60" W)|?| | 46633|C|Drifting Buoy||Drifting Buoy||47.120 N 144.690 W (47°7'12" N 144°41'24" W)|?| | 46634|C|Drifting Buoy||Drifting Buoy||45.750 N 146.880 W (45°45'0" N 146°52'48" W)|?| | 46635|C|Drifting Buoy||Drifting Buoy||47.640 N 126.580 W (47°38'24" N 126°34'48" W)|?| | 46636|C|Drifting Buoy||Drifting Buoy||47.090 N 123.110 W (47°5'24" N 123°6'36" W)|?| | 46637|C|Drifting Buoy||Drifting Buoy||45.500 N 164.800 W (45°30'0" N 164°48'0" W)|?| | 46638|C|Drifting Buoy||Drifting Buoy||53.280 N 130.180 W (53°16'48" N 130°10'48" W)|?| | 46639|C|Drifting Buoy||Drifting Buoy||58.480 N 143.540 W (58°28'48" N 143°32'24" W)|?| | 46640|C|Drifting Buoy||Drifting Buoy||45.100 N 167.500 W (45°6'0" N 167°30'0" W)|?| | 46641|C|Drifting Buoy||Drifting Buoy||47.400 N 168.300 W (47°23'60" N 168°18'0" W)|?| | 46642|C|Drifting Buoy||Drifting Buoy||25.610 N 155.060 W (25°36'36" N 155°3'36" W)|?| | 46643|C|Drifting Buoy||Drifting Buoy||48.200 N 168.000 W (48°12'0" N 168°0'0" W)|?| | 46651|C|Drifting Buoy||Drifting Buoy||45.630 N 151.350 W (45°37'48" N 151°21'0" W)|?| | 46652|C|Drifting Buoy||Drifting Buoy||23.570 N 120.820 W (23°34'12" N 120°49'12" W)|?| | 46657|C|Drifting Buoy||Drifting Buoy||50.000 N 170.000 W (50°0'0" N 170°0'0" W)|?| | 46660|C|Drifting Buoy||Drifting Buoy||48.800 N 161.900 W (48°47'60" N 161°54'0" W)|?| | 46661|C|Drifting Buoy||Drifting Buoy||49.950 N 127.430 W (49°57'0" N 127°25'48" W)|?| | 46692|C|Drifting Buoy||Drifting Buoy||42.900 N 162.700 W (42°53'60" N 162°41'60" W)|?| | 46695|C|Drifting Buoy||Drifting Buoy||35.030 N 128.410 W (35°1'48" N 128°24'36" W)|?| | 46698|C|Drifting Buoy||Drifting Buoy||54.450 N 156.330 W (54°27'0" N 156°19'48" W)|?| | 46700|C|Drifting Buoy||Drifting Buoy||54.480 N 130.870 W (54°28'48" N 130°52'12" W)|?| | 46701|C|Drifting Buoy||Drifting Buoy||41.600 N 165.800 W (41°36'0" N 165°48'0" W)|?| | 46702|C|Drifting Buoy||Drifting Buoy||58.410 N 152.870 W (58°24'36" N 152°52'12" W)|?| | 46705|C|Drifting Buoy||Drifting Buoy||41.370 N 129.080 W (41°22'12" N 129°4'48" W)|?| | 46707|C|Drifting Buoy||Drifting Buoy||46.520 N 144.520 W (46°31'12" N 144°31'12" W)|?| | 46710|C|Drifting Buoy||Drifting Buoy||22.240 N 136.000 W (22°14'24" N 136°0'0" W)|?| | 46779|N|Drifting Buoy||Drifting Buoy||57.000 N 149.000 W (57°0'0" N 149°0'0" W)|?| | 46780|N|Drifting Buoy||Drifting Buoy||56.040 N 167.140 W (56°2'24" N 167°8'24" W)|?| |Wind speed corrected to the 10 meter height. 46781|N|Drifting Buoy||Drifting Buoy||54.634 N 177.948 W (54°38'2" N 177°56'53" W)|?| |Wind speed corrected to the 10 meter height. 46782|N|Drifting Buoy||Drifting Buoy||56.040 N 167.140 W (56°2'24" N 167°8'24" W)|?| | 46785|N|Drifting Buoy||Drifting Buoy||55.000 N 173.000 W (55°0'0" N 173°0'0" W)|?| | 46x84|N|6-meter NOMAD buoy|6N33|Old 46084 (Adrift)|ARES payload|56.625 N 136.148 W (56°37'30" N 136°8'54" W)|A|FZAK52.PAJK FZAK51.PAJK|On 05/23/2010, a new buoy was deployed at station 46084.  The previously-deployed buoy went adrift on 12/26/08, and went aground on 01/15/09. Positions have not transmitted since 08/27/09. If the buoy ever resumes transmits, click here to see the latest positions on the adrift buoy.  47559|C|Drifting Buoy||||78.911 N 105.294 W (78°54'40" N 105°17'38" W)|?| | 47560|C|Drifting Buoy||||79.549 N 103.459 W (79°32'56" N 103°27'32" W)|?| | 48011|N|3-meter discus buoy|42|Red Dog Mine|DACT payload|67.582 N 164.185 W (67°34'54" N 164°11'6" W)|P|FZPN01.KWBC |Buoy retrieved 48400|PM|Buoy||Ocean Climate Station Papa||50.000 N 145.000 W (50°0'0" N 145°0'0" W)|P| |http://www.pmel.noaa.gov/stnP/ 48677|SH|Drifting Buoy||||72.568 N 177.610 W (72°34'5" N 177°36'36" W)|?| | 48678|SH|Drifting Buoy||||74.076 N 172.987 W (74°4'34" N 172°59'13" W)|?| | 48679|SH|Drifting Buoy||||75.778 N 159.890 W (75°46'41" N 159°53'24" W)|?| | 48680|SH|Drifting Buoy||||74.776 N 157.236 W (74°46'34" N 157°14'10" W)|?| | 48708|SM|Drifting Buoy||Drifting Ice Buoy||81.000 N 133.000 W (81°0'0" N 133°0'0" W)|| | 48900|RU|Slocum Glider||(R21)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48901|P|Slocum Glider||(SAM)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48902|UW|Sea Glider||(SG515)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48903|UD|Slocum Glider||(UD_134)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48904|RU|Slocum Glider||(RU23)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48905|P|Slocum Glider||(BASS)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48906|MM|Slocum Glider||(WALDO)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48907|RU|Slocum Glider||(COOK)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48908|V|Sea Glider||(SG135)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48909|V|Sea Glider||(SG137)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48910|R|Spray Glider||(SPRAY40)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48911|SH|Sea Glider||SG553||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 51000|N|3-meter discus buoy|3DV21|Northern Hawaii|AMPS payload|23.546 N 154.056 W (23°32'47" N 154°3'20" W)|H|FZHW50.PHFO | 51001|N|3-meter discus buoy|3DXX|NW HAWAII 170 NM West Northwest of Kauai Island|ARES payload|23.445 N 162.279 W (23°26'42" N 162°16'43" W)|H|FZHW50.PHFO |

Station 51001 stopped transmitting 12/25/09 and was retrieved 03/23/2011.  This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

51002|N|3-meter discus buoy|3D31|SW HAWAII 215 NM South SouthWest of Hilo, HI|AMPS payload|17.094 N 157.808 W (17°5'39" N 157°48'27" W)|H|FZHW50.PHFO |
51003|N|3-meter discus buoy|3D73|W HAWAII 205 NM Southwest of Honolulu, HI|ARES payload|19.018 N 160.582 W (19°1'6" N 160°34'54" W)|H|FZHW50.PHFO | 51004|N|3-meter discus buoy|3D88|SE HAWAII 185 NM Southeast of Hilo, HI|AMPS payload|17.525 N 152.382 W (17°31'31" N 152°22'55" W)|H|FZHW50.PHFO | 51005|N|3-meter discus buoy|||DACT payload|20.400 N 156.100 W (20°23'60" N 156°5'60" W)|H| | 51026|N|3-meter discus buoy| 17|Northern Molokai|DACT payload|21.350 N 156.930 W (21°21'0" N 156°55'48" W)|H| | 51027|N|3-meter discus buoy|||DACT payload|20.400 N 157.100 W (20°23'60" N 157°5'60" W)|H| | 51028|N|3-meter discus buoy|3D30|Christmas Island |ARES 4.4 payload|0.000 N 153.913 W (0°0'1" N 153°54'46" W)|H|FZPN40.PHFO |

Station 51028 has failed and stopped transmitting at 00Z, 03/11/2009. 

This station has been disestablished as of 6/1/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.

51100|N|3-meter discus buoy|3D83|Northern Hawaii|AMPS payload|23.558 N 153.900 W (23°33'30" N 153°54'0" W)|H|FZHW50.PHFO | 51101|N|3-meter discus buoy|3D02|NW Hawaii|AMPS payload|24.321 N 162.058 W (24°19'15" N 162°3'30" W)|H|FZHW50.PHFO | 51167|PF|||French Frigate Shoals (FFS Ocean 006)||23.856 N 166.275 W (23°51'23" N 166°16'31" W)|?| | 51168|PF|||East Tutuilla Island, American Samoa (TUT 001)||14.284 S 170.562 W (14°17'1" S 170°33'44" W)|?| | 51169|PF|||Jarvis Island (JAR 016)||0.379 S 159.978 W (0°22'46" S 159°58'42" W)|?| | 51170|PF|||Johnston Atoll (JOH 005)||16.759 N 169.500 W (16°45'34" N 169°29'59" W)|?| | 51171|PF|||Kingman Reef (KIN 001)||6.393 N 162.342 W (6°23'33" N 162°20'32" W)|?| | 51172|PF|||Kure Atoll (KUR 008)||28.418 N 178.343 W (28°25'5" N 178°20'36" W)|?| | 51173|PF|||Litsianski Island (LIS 001)||25.968 N 173.916 W (25°58'4" N 173°54'58" W)|?| | 51174|PF|||Ofu Island, American Samoa (OFU 008)||14.181 S 169.652 W (14°10'50" S 169°39'7" W)|?| | 51175|PF|||Palmyra Atoll (PAL 015)||5.874 N 162.041 W (5°52'28" N 162°2'26" W)|?| | 51176|PF|||Pearl and Hermes Reef (PHR 001)||27.837 N 175.816 W (27°50'12" N 175°48'58" W)|?| | 51177|PF|||Rose Atoll (ROS 002)||14.551 S 168.160 W (14°33'5" S 168°9'36" W)|?| | 51178|PF|||Tau Island, American Samoa (TAU 004)||14.244 S 169.509 W (14°14'38" S 169°30'33" W)|?| | 51179|PF|||Southwestern Tutuila Island, American Samoa (TUT 002)||14.328 S 170.833 W (14°19'42" S 170°50'0" W)|?| | 51180|PF|||Western Tutuila Island, American Samoa (TUT 034)||14.281 S 170.725 W (14°16'53" S 170°43'29" W)|?| | 51181|PF|||Southern Tutuila Island, American Samoa (TUT 029)||14.363 S 170.764 W (14°21'48" S 170°45'50" W)|?| | 51200|R|Waverider Buoy||Barbers Point, HI (164)||21.096 N 158.303 W (21°5'47" N 158°18'10" W)|H| |Station 51200 was disestablished November 13, 2010. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 51201|PO|Waverider Buoy||Waimea Bay, HI (106)||21.673 N 158.116 W (21°40'22" N 158°6'57" W)|H|FZHW50.PHFO | 51202|PO|Waverider Buoy||Mokapu Point, HI (098)||21.417 N 157.668 W (21°25'1" N 157°40'4" W)|H|FZHW50.PHFO | 51203|PO|Waverider Buoy||Kaumalapau, HI (146)||20.788 N 157.010 W (20°47'16" N 157°0'35" W)|H|FZHW50.PHFO | 51204|PO|Waverider Buoy||Barbers Point, HI #2 (165)||21.281 N 158.124 W (21°16'53" N 158°7'25" W)|H| | 51205|PO|Waverider Buoy||Pauwela, Maui, HI (187)||21.019 N 156.427 W (21°1'10" N 156°25'38" W)|H| | 51206|PO|Waverider Buoy||Hilo, Hawaii, HI - 188||19.780 N 154.970 W (19°46'48" N 154°58'12" W)|H| | 51406|N|2.6-meter discus buoy|2.6D50|2,900 NM Southeast of Hawaii|DART II payload|8.480 S 125.027 W (8°28'49" S 125°1'36" W)|?| |

Station 51406 was formerly known as 46406.

This station is no longer being maintained but will continue to provide data until it becomes non-operational.

51407|N|2.6-meter discus buoy|2.6D68|140 NM Southeast of Honolulu, HI|DART II payload|19.591 N 156.585 W (19°35'26" N 156°35'7" W)|?| | 51425|N|2.6-meter discus buoy|26D40|370 NM NW of Apia|DART II payload|9.510 S 176.241 W (9°30'37" S 176°14'26" W)|| | 51426|N|2.6-meter discus buoy|2.6D03|400NM Southeast of Tonga|DART II payload|22.993 S 168.133 W (22°59'34" S 168°7'58" W)|| |

Buoy hull 2.6D45 from DART station 51426 (in the SW Pacific) has gone adrift between 11/1/11 1305Z and 11/2/11 0113Z and is no longer providing water column height or Tsunami event data . It will be restored into service when it can be recovered  and worked into the maintenance schedule .

click here to see the latest positions

51542|N|Drifting Buoy||TAO Buoy Adrift||0.018 N 179.903 W (0°1'6" N 179°54'12" W)|?| | 51wh0|WH|Ocean Reference Station||WHOTS - Woods Hole Ocean Time-series||22.667 N 157.950 W (22°40'0" N 157°57'0" W)|H| | 52009|N|3-meter discus buoy|||DACT payload|13.729 N 144.668 W (13°43'46" N 144°40'4" W)|?| | 52200|PO|Waverider Buoy||Ipan, Guam (121)||13.354 N 144.789 E (13°21'15" N 144°47'20" E)|?| | 52201|PO|Waverider Buoy||Kalo, Majuro, Marshall Islands - 163||7.092 N 171.395 E (7°5'30" N 171°23'42" E)|?| | 52243|PF|||Wake Island (WAK 002)||19.308 N 166.622 E (19°18'27" N 166°37'20" E)|?| | 52244|PF|||Maug Islands (MAU 002)||20.029 N 145.232 E (20°1'45" N 145°13'55" E)|?| | 52245|PF|||Pagan Island (PAG 001)||18.127 N 145.757 E (18°7'38" N 145°45'27" E)|?| | 52246|PF|||Saipan Island (SAI 008)||15.172 N 145.695 E (15°10'19" N 145°41'41" E)|?| | 52247|PF|||Rota Island (ROT 002)||14.128 N 145.164 E (14°7'42" N 145°9'49" E)|?| | 52248|PF|||Guam (GUA 003)||13.529 N 144.801 E (13°31'44" N 144°48'2" E)|?| | 52249|PF|||Kimbe, New Britain, PNG (KIM 001)||5.157 S 150.299 E (5°9'25" S 150°17'57" E)|?| | 52401|N|2.6-meter discus buoy|2.6D35|610 NM Northeast of Saipan|DART II payload|19.261 N 155.771 E (19°15'38" N 155°46'16" E)|?| | 52402|N|2.6-meter discus buoy|2.6D18|790 NM Northwest of Kwajalein|DART II payload|11.869 N 154.039 E (11°52'7" N 154°2'19" E)|?| |.
52403|N|2.6-meter discus buoy|2.6D62|430 NM Southwest of Truk|DART II payload|4.052 N 145.592 E (4°3'8" N 145°35'31" E)|?| |DART station 52403 has serviced and is back in operation. 52404|N|2.6-meter discus buoy|2.6D55|760 NM Northeast of Manila, Philippines|DART II payload|20.949 N 132.314 E (20°56'56" N 132°18'49" E)|?| |

Station 52404 has been serviced and now operational.

52405|N|2.6-meter discus buoy|26D57|740 NM West of Agana, Guam|DART II payload|12.881 N 132.333 E (12°52'50" N 132°20'0" E)|?| | 52406|N|2.6-meter discus buoy|D54|450 NM Northeast of the Guadalcanal|DART II payload|5.293 S 165.002 E (5°17'36" S 165°0'6" E)|| | 52834|AO|Drifting Buoy||||14.000 N 154.953 E (14°0'0" N 154°57'10" E)|?| | 52837|AO|Drifting Buoy||||9.777 N 137.000 E (9°46'38" N 137°0'0" E)|?| | 52838|AO|Drifting Buoy||||7.774 N 140.000 E (7°46'28" N 140°0'0" E)|?| | 52839|AO|Drifting Buoy||||5.758 N 143.000 E (5°45'28" N 143°0'0" E)|?| | 52840|AO|Drifting Buoy||||8.731 N 151.000 E (8°43'51" N 151°0'0" E)|?| | 52841|AO|Drifting Buoy||||5.943 N 149.000 E (5°56'34" N 149°0'0" E)|?| | 52842|AO|Drifting Buoy||||6.759 N 150.000 E (6°45'34" N 150°0'0" E)|?| | 52843|AO|Drifting Buoy||||11.761 N 134.000 E (11°45'38" N 134°0'0" E)|?| | 52849|AO|Drifting Buoy||||16.000 N 155.256 E (16°0'0" N 155°15'21" E)|?| | 52858|AO|Drifting Buoy||||14.000 N 154.953 E (14°0'0" N 154°57'10" E)|?| | 52862|AO|Drifting Buoy||||16.000 N 155.256 E (16°0'0" N 155°15'21" E)|?| | 52901|AO|Drifting Buoy||||15.000 N 155.104 E (15°0'0" N 155°6'14" E)|?| | 53046|AU|ETD||South Bali|ETD payload|11.445 S 113.607 E (11°26'42" S 113°36'25" E)|?| | 53401|ID|2.6-meter discus buoy|2.6D36|Indonesia|DART II payload|0.050 N 91.899 E (0°3'1" N 91°53'58" E)|| |This station failed 3/15/2008. 54401|N|2.6-meter discus buoy|2.6D25|640NM Northeast of Auckland, New Zealand|DART II payload|33.005 S 172.985 W (33°0'19" S 172°59'6" W)|| |

Buoy hull 2.6D37 from DART station 54401 went adrift after 4/3/2012 1305Z. Last report from its moored position was 4/3/2012 1315Z. It is no longer providing water column height or tsunami event data. It will be restored into service when it can be recovered and then worked into the maintenance schedule.

See here for latest positions

55012|AU|STB - SAIC Tsunami Buoy||Coral Sea 1 - 1285km ENE of Townsville|STB payload|15.799 S 158.400 E (15°47'56" S 158°24'1" E)|?| | 55013|AU|2.6-meter discus buoy||TASMAN SEA 3 - 1160km ESE of Hobart|DART II payload|46.665 S 161.001 E (46°39'55" S 161°0'5" E)|| | 55015|AU|STB - SAIC Tsunami Buoy||TASMAN SEA 1 - 1110km ESE of Hobart|SAIC Tsunami Buoy (STB) with DART II BPR|46.840 S 160.254 E (46°50'24" S 160°15'16" E)|?| | 55016|AU|ETD||ETD Fiji Basin|ETD payload|26.000 S 176.000 E (26°0'0" S 176°0'0" E)|?| |The Australian ETD buoy went adrift 1/4/2011. The buoy has been recovered as of 2/8/2011.  Until it is re-deployed, there will be no water column height data from this station. 55023|AU|ETD||Coral Sea 2 - 870km NE of Townsville|ETD payload|14.800 S 153.580 E (14°48'0" S 153°34'47" E)|?| | 55039|ES|Waverider Buoy||||38.360 S 148.110 E (38°21'36" S 148°6'36" E)|?| |Data from this station are not quality controlled by NDBC 55042|AU|2.6-meter discus buoy||Tasman Sea 2 - 1175km ESE of Hobart|ETD payload|44.853 S 161.728 E (44°51'10" S 161°43'41" E)|| | 55401|AU|2.6-meter discus buoy||600 NM Southeast of Hobart, Tasmania|DART II payload|46.922 S 160.562 E (46°55'20" S 160°33'44" E)|?| | 56001|AU|STB - SAIC Tsunami Buoy||Indian Ocean 1 - 1025km NW of Dampier|STB payload|13.985 S 110.005 E (13°59'7" S 110°0'17" E)|?| | 56003|AU|STB - SAIC Tsunami Buoy||Indian Ocean 2 - 630km NNE of Dampier|STB payload|15.021 S 117.989 E (15°1'17" S 117°59'22" E)|?| |Data from buoy was interrupted during service from 17 to 21 Nov 2011. 58900|UW|Sea Glider||SG177||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58901|UW|Sea Glider||SG167||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58902|UW|Sea Glider||SG166||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58903|UW|Sea Glider||SG181||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58904|UW|Sea Glider||SG170||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58905|UW|Sea Glider||SG165||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58951|IO|Sea Glider||SG997||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58952|IO|Sea Glider||SG998||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58953|IO|Sea Glider||SG999||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 61001|F|Buoy||Nice Buoy||43.400 N 7.800 E (43°24'0" N 7°48'0" E)|?| | 61002|F|Buoy||Lion Buoy||42.102 N 4.703 E (42°6'9" N 4°42'9" E)|?| | 62001|U|Buoy||Gascogne Buoy||45.201 N 5.000 W (45°12'2" N 5°0'0" W)|?| | 62027|SJ|Buoy||Jersey Buoy, English Channel - 5 nm south of Jersey, UK||49.082 N 2.218 W (49°4'56" N 2°13'6" W)|?| | 62028|U|Buoy||Weymouth Bay, UK||50.590 N 2.300 W (50°35'24" N 2°18'0" W)|?| | 62029|U|Buoy||K1 Buoy||48.701 N 12.401 W (48°42'2" N 12°24'2" W)|?| | 62052|F|Buoy||||48.500 N 5.600 W (48°30'0" N 5°36'0" W)|?| | 62081|U|Buoy||K2 Buoy||51.000 N 13.301 W (51°0'0" N 13°18'4" W)|?| | 62090|W|2.5-meter ODAS buoy||M1 - 50 NM West of Aran Islands||53.127 N 11.200 W (53°7'36" N 11°12'0" W)|?| | 62091|W|2.5-meter ODAS buoy||M2 - 20 NM East of Lambay||53.469 N 5.418 W (53°28'8" N 5°25'5" W)|?| | 62092|W|2.5-meter ODAS buoy||M3 - 30 NM Southwest of Mizen Head||51.217 N 10.550 W (51°13'0" N 10°33'0" W)|?| | 62093|W|2.5-meter ODAS buoy||M4 - Donegal Bay||55.000 N 10.000 W (55°0'0" N 10°0'0" W)|?| | 62094|W|2.5-meter ODAS buoy||M5 - South East||51.690 N 6.704 W (51°41'24" N 6°42'14" W)|?| | 62095|W|2.5-meter ODAS buoy||M6 - West Coast||53.056 N 15.924 W (53°3'22" N 15°55'28" W)|?| | 62103|U|Lightship||Channel Lightship||49.900 N 2.900 W (49°54'0" N 2°54'0" W)|?| | 62105|U|Buoy||K4 Buoy||55.400 N 12.200 W (55°24'0" N 12°12'0" W)|?| | 62107|U|Lightship||Sevenstones Lightship||50.103 N 6.100 W (50°6'9" N 6°6'0" W)|?| | 62108|U|Buoy||K3 Buoy||53.500 N 19.500 W (53°30'0" N 19°30'0" W)|?| | 62114|X|Oil Platform||North Sea||58.300 N 0.100 E (58°18'0" N 0°6'0" E)|?| | 62121|X|Oil Platform||||53.500 N 2.700 E (53°30'0" N 2°42'0" E)|?| | 62125|X|Oil Platform||||53.800 N 3.500 W (53°48'0" N 3°30'0" W)|?| | 62126|X|Oil Platform||||53.900 N 3.600 W (53°54'0" N 3°36'0" W)|?| | 62127|X|Oil Platform||||54.000 N 0.700 E (54°0'0" N 0°42'0" E)|?| | 62130|X|Oil Platform||||53.000 N 1.700 E (53°0'0" N 1°42'0" E)|?| | 62135|X|Oil Platform||||54.000 N 3.800 W (54°0'0" N 3°48'0" W)|?| | 62142|X|Oil Platform||North Sea||53.000 N 2.101 E (53°0'0" N 2°6'5" E)|?| | 62144|X|Oil Platform||North Sea||53.400 N 1.700 E (53°24'0" N 1°42'0" E)|?| | 62145|X|Oil Platform||North Sea||53.103 N 2.800 E (53°6'9" N 2°48'0" E)|?| | 62146|X|Oil Platform||||53.800 N 2.800 E (53°48'0" N 2°48'0" E)|?| | 62147|X|Oil Platform||North Sea||57.603 N 1.700 E (57°36'9" N 1°42'0" E)|?| | 62148|X|Oil Platform||||53.600 N 1.500 E (53°36'0" N 1°30'0" E)|?| | 62149|X|Oil Platform||||53.700 N 1.100 E (53°42'0" N 1°6'0" E)|?| | 62150|X|Oil Platform||||53.600 N 0.700 E (53°36'0" N 0°42'0" E)|?| | 62163|U|Buoy||Brittany Buoy||47.500 N 8.500 W (47°30'0" N 8°30'0" W)|?| | 62164|X|Oil Platform||North Sea||57.201 N 0.500 E (57°12'2" N 0°30'0" E)|?| | 62165|X|Oil Platform||||54.000 N 1.100 E (54°0'0" N 1°6'0" E)|?| | 62166|X|Oil Platform||North Sea||57.201 N 0.500 E (57°12'2" N 0°30'0" E)|?| | 62301|U|Buoy||Aberporth Buoy||52.300 N 4.500 W (52°18'0" N 4°30'0" W)|?| | 62303|U|Buoy||Pembroke Buoy||51.603 N 5.100 W (51°36'9" N 5°6'0" W)|?| | 62304|U|Lightship||Sandettie Lightship||51.103 N 1.800 E (51°6'9" N 1°48'0" E)|?| | 62305|U|Lightship||Greenwich Lightship||50.400 N 0.000 E (50°24'0" N 0°0'0" E)|?| | 63105|X|Oil Platform||North Sea||61.000 N 1.700 E (61°0'0" N 1°42'0" E)|?| | 63110|X|Oil Platform||North Sea||59.500 N 1.500 E (59°30'0" N 1°30'0" E)|?| | 63112|X|Oil Platform||North Sea||61.103 N 0.000 E (61°6'9" N 0°0'0" E)|?| | 63113|X|Oil Platform||North Sea||61.000 N 1.700 E (61°0'0" N 1°42'0" E)|?| | 63117|X|Oil Platform||North Sea||61.400 N 1.200 E (61°24'0" N 1°12'0" E)|?| | 64045|U|Buoy||K5 Buoy||59.100 N 11.401 W (59°6'0" N 11°24'2" W)|?| | 64046|U|Buoy||K7 Buoy||60.701 N 4.500 W (60°42'2" N 4°30'0" W)|?| | 78900|UW|Sea Glider||SG502||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 78901|UW|Sea Glider||SG503||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 91204|N|C-MAN Station||Ulithi Is., Caroline|WAAP (POES reporting) payload|9.900 N 139.700 E (9°54'0" N 139°41'60" E)|?| | 91222|N|C-MAN Station||Pagan Is.,Mariana|WAAP (POES reporting) payload|18.130 N 145.770 E (18°7'48" N 145°46'12" E)|?| |Station Failed. 91251|N|C-MAN Station||Enewetak, MarShall|VEEP payload|11.430 N 162.350 E (11°25'48" N 162°20'60" E)|?| |Station Failed. 91328|N|C-MAN Station||Ulul Atoll, Caroline|WAAP (POES reporting) payload|8.600 N 149.670 E (8°35'60" N 149°40'12" E)|?| | 91338|N|C-MAN Station||Satawan Atoll, Caro.|WAAP (POES reporting) payload|5.280 N 153.650 E (5°16'48" N 153°39'0" E)|?| |Station Failed 91343|N|C-MAN Station||Oroluk, Caroline|VEEP payload|7.630 N 155.160 E (7°37'48" N 155°9'36" E)|?| | 91352|N|C-MAN Station||Pingelap, Caroline|WAAP (POES reporting) payload|6.210 N 160.700 E (6°12'36" N 160°41'60" E)|?| | 91355|N|C-MAN Station||Kosrae, Caroline|VEEP payload|5.360 N 162.960 E (5°21'36" N 162°57'36" E)|?| |Station Failed 91356|N|C-MAN Station||Kosrae, Caroline|VEEP payload|5.360 N 162.960 E (5°21'36" N 162°57'36" E)|?| |Station Failed 91365|N|C-MAN Station||Ujae Atoll, Marshall|DACT payload|8.930 N 165.750 E (8°55'48" N 165°45'0" E)|?| |This station was destroyed by Typhoon Gay in December 1992. 91374|N|C-MAN Station||Maloelap, Marshall|VEEP payload|8.700 N 171.200 E (8°41'60" N 171°11'60" E)|?| | 91377|N|C-MAN Station||Mili, Marshalls Is.|WAAP (POES reporting) payload|6.100 N 172.100 E (6°5'60" N 172°5'60" E)|?| | 91411|N|C-MAN Station||Ngulu Atoll, Caroline|WAAP (POES reporting) payload|8.300 N 137.500 E (8°18'0" N 137°30'0" E)|?| | 91442|N|C-MAN Station||Ebon Atoll, Caroline|VEEP payload|4.600 N 168.700 E (4°35'60" N 168°41'60" E)|?| | aamc1|O|Water Level Observation Network||9414750 - Alameda, CA||37.772 N 122.298 W (37°46'18" N 122°17'54" W)|P|FZUS56.KMTR | aban6|N|C-MAN Station||Alexandria Bay, NY|MARS payload|44.333 N 75.933 W (44°20'0" N 75°56'0" W)|E|FZUS61.KBUF |This station has been disestablished as of 9/30/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. acmn4|J|Shorebased Tower||Atlantic City Marina, NJ||39.380 N 74.420 W (39°22'48" N 74°25'12" W)|E| |


 

acqs1|NR|NERRS Water Quality Station||St. Pierre, Ace Basin Reserve, SC||32.523 N 80.357 W (32°31'24" N 80°21'24" W)|E| | acxs1|NR|NERRS Weather Station||ACE Basin Reserve, SC||32.559 N 80.454 W (32°33'34" N 80°27'13" W)|E| |Water Quality data for this Reserve are available at....
ACQS1 -- St. Pierre


acyn4|O|Water Level Observation Network||8534720 - Atlantic City, NJ||39.355 N 74.418 W (39°21'18" N 74°25'6" W)|E|FZUS51.KPHI |


 

adka2|O|Water Level Observation Network||9461380 - Adak Island, AK||51.863 N 176.632 W (51°51'48" N 176°37'54" W)|A|FZAK52.PAFC | agcm4|O|Weather Station||Algonac, MI - 9014070||42.621 N 82.527 W (42°37'16" N 82°31'37" W)|E| | agmw3|CE|Weather Station||Algoma City Marina WI||44.608 N 87.433 W (44°36'29" N 87°25'59" W)|C|FZUS53.KGRB |NOTE: WINDS FREQUENTLY DROP TO ZERO DUE TO WINTER FREEZING. alia2|O|Water Level Observation Network||9457804 - Alitak, AK||56.898 N 154.247 W (56°53'53" N 154°14'49" W)|A| | alrf1|N|C-MAN Station||Alligator Reef||24.900 N 80.600 W (24°53'59" N 80°35'59" W)|E| | alsn6|N|C-MAN Station||Ambrose Light, NY|ARES 4.4 payload|40.450 N 73.800 W (40°27'0" N 73°48'0" W)|E|FZUS51.KOKX FZUS51.KPHI|

On 7/28/08, Ambrose Light Tower was decommissioned. No data will be available from this station from 7/28/08 until a suitable replacement is established.


 

alxn6|O|Water Level Observation Network||8311062 - Alexandria Bay, NY||44.330 N 75.933 W (44°19'48" N 75°55'59" W)|E| | amaa2|N|C-MAN Station||East Amatuli Station Light, AK|ARES payload|58.915 N 151.952 W (58°54'54" N 151°57'6" W)|A|FZAK51.PAFC | amps1|N|Test station||Payload Test (LAB Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amps2|N|2.4-meter discus buoy||Payload Test (BUOY Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amps3|N|Test station||Payload Test (C-MAN Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amps4|N|Test station||Payload Test (PSI Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amrl1|O|Water Level Observation Network||8764227 - Amerada Pass, LA||29.450 N 91.338 W (29°26'59" N 91°20'17" W)|C| | ancf1|P|Shorebased Tower||Anclote Gulf Park, FL||28.193 N 82.789 W (28°11'34" N 82°47'19" W)|E|FZUS52.KTBW | anmf1|P|Shorebased Tower||ANM - Anna Maria, FL||27.550 N 82.750 W (27°33'0" N 82°45'0" W)|E|FZUS52.KTBW | anmn6|NR|NERRS Weather Station||Hudson River Reserve, NY||42.018 N 73.917 W (42°1'5" N 73°55'1" W)|E| |Water Quality data for this Reserve are available at....
ANRN6 -- Tivoli South
HUQN6 -- Tivoli North
anrn6|NR|NERRS Water Quality Station||Tivoli South, Hudson River Reserve, NY||42.027 N 73.926 W (42°1'37" N 73°55'33" W)|E| | anta2|O|Water Level Observation Network||9455920 - Anchorage, AK||61.238 N 149.890 W (61°14'18" N 149°53'24" W)|A|FZAK52.PAFC | anvc1|O|Water Level Observation Network||9416841 - Arena Cove, CA||38.913 N 123.708 W (38°54'48" N 123°42'30" W)|P|FZUS56.KEKA | apam2|O|Water Level Observation Network||8575512 - Annapolis, MD||38.983 N 76.480 W (38°59'0" N 76°28'48" W)|E|FZUS51.KLWX | apcf1|O|Water Level Observation Network||8728690 - Apalachicola, FL||29.727 N 84.982 W (29°43'36" N 84°58'54" W)|E|FZUS52.KTAE | apnm4|G|C-MAN Station||Alpena Harbor Light, MI||45.060 N 83.424 W (45°3'35" N 83°25'25" W)|E|FZUS53.KAPX | apqf1|NR|NERRS Water Quality Station||East Bay, Apalachicola Reserve, FL||29.786 N 84.875 W (29°47'9" N 84°52'31" W)|E| | aprp7|O|Water Level Observation Network||1630000 - Apra Harbor, Guam||13.442 N 144.653 E (13°26'31" N 144°39'10" E)|?| | apxf1|NR|NERRS Weather Station||Apalachicola Reserve, FL||29.791 N 84.883 W (29°47'27" N 84°53'0" W)|E| |Water Quality data for this Reserve are available at....
APQF1 -- East Bay
arop4|PN|Water Level Observation Network||9757809 - Arecibo, PR||18.480 N 66.702 W (18°28'48" N 66°42'7" W)|N| | arpf1|P|Shorebased Tower||APK - Aripeka, FL||28.433 N 82.667 W (28°25'59" N 82°40'0" W)|E|FZUS52.KTBW | asto3|O|Water Level Observation Network||9439040 - Astoria, OR||46.208 N 123.767 W (46°12'30" N 123°46'0" W)|P|FZUS56.KPQR | atgm1|O|Water Level Observation Network||8413320 - Bar Harbor, ME||44.392 N 68.205 W (44°23'30" N 68°12'18" W)|E| | atka2|O|Water Level Observation Network||9461710 - Atka, AK||52.232 N 174.173 W (52°13'55" N 174°10'23" W)|A| | audp4|O|Water Level Observation Network||9759412 - Aquadilla, PR||18.458 N 67.164 W (18°27'29" N 67°9'50" W)|N| | auga2|N|C-MAN Station||Augustine Island, AK|MARS payload|59.378 N 153.348 W (59°22'42" N 153°20'54" W)|A|FZAK51.PAFC | avan4|J|Shorebased Tower||Avalon, NJ||39.090 N 74.720 W (39°5'24" N 74°43'12" W)|E| |


 

babt2|K|Shorebased Tower||8776604 - Baffin Bay; Point of Rocks, TX||27.301 N 97.416 W (27°18'4" N 97°24'59" W)|C| | bara9|O|Water Level Observation Network||9761115 - Barbuda, Barbuda||17.591 N 61.821 W (17°35'27" N 61°49'14" W)|N| | barn6|EA|GLOS Weather Station||Barcelona Harbor, NY||42.346 N 79.596 W (42°20'45" N 79°35'44" W)|E| | batn6|O|Water Level Observation Network||8518750 - The Battery, NY||40.700 N 74.015 W (40°42'0" N 74°0'54" W)|E|FZUS51.KOKX | bdrn4|O|Water Level Observation Network||8539094 - Burlington, Delaware River, NJ||40.082 N 74.872 W (40°4'55" N 74°52'19" W)|E| |For area forecasts and warnings, select: Philadelphia WFO bdvf1|NP|Water Quality Station||Broad River, FL||25.476 N 80.990 W (25°28'35" N 80°59'24" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bepb6|O|Water Level Observation Network||2695540 - Bermuda Esso Pier||32.373 N 64.703 W (32°22'22" N 64°42'10" W)|E| | bftn7|O|Water Level Observation Network||8656483 - Beaufort, NC||34.720 N 76.670 W (34°43'12" N 76°40'12" W)|E|FZUS52.KMHX |
  bgcf1|P|Shorebased Tower||Big Carlos Pass, FL||26.404 N 81.881 W (26°24'16" N 81°52'52" W)|E|FZUS52.KTBW | bgnn4|O|Water Level Observation Network||8519483 - Bergen Point West Reach, NJ||40.640 N 74.147 W (40°38'24" N 74°8'48" W)|E|FZUS51.KOKX | bgxn3|NR|NERRS Weather Station||Great Bay Reserve, NH||43.059 N 70.830 W (43°3'32" N 70°49'49" W)|| |Water Quality data for this Reserve are available at....
GBQN3 -- Oyster River
bhbm3|O|Water Level Observation Network||8443970 - Boston, MA||42.355 N 71.052 W (42°21'18" N 71°3'6" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike 

For area forecasts and warnings, select: Boston WFO

bhrc3|I|Long Island Ferry||Bridgeport Terminal, CT||41.175 N 73.185 W (41°10'31" N 73°11'6" W)|E|FZUS51.KOKX | bhri3|CE|GLOS Weather Station||Burns Harbor, IN||41.647 N 87.147 W (41°38'48" N 87°8'49" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS bigm4|CE|GLOS Weather Station||Big Bay, MI||46.830 N 87.730 W (46°49'47" N 87°43'47" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS bism2|O|Water Level Observation Network||8571421 - Bishops Head, MD||38.220 N 76.038 W (38°13'12" N 76°2'17" W)|E| |For area forecasts and warnings, select: Philadelphia WFO blia2|N|C-MAN Station||Bligh Reef Light, AK|Sutron XPERT payload|60.840 N 146.880 W (60°50'24" N 146°52'48" W)|A|FZAK58.PAVW FZAK51.PAFC| blta2|AK|C-MAN Station||Bartlett Cove AK||58.455 N 135.888 W (58°27'18" N 135°53'18" W)|A| | bltm2|O|Water Level Observation Network||8574680 - Baltimore, MD||39.267 N 76.578 W (39°16'0" N 76°34'42" W)|E|FZUS51.KLWX | bltm3|O|Water Level Observation Network||8447387 - Borden Flats Light at Fall River, MA||41.705 N 71.173 W (41°42'18" N 71°10'24" W)|E| |For area forecasts and warnings, select: Boston WFO bnkf1|NP|Water Quality Station||Butternut Key, FL||25.087 N 80.519 W (25°5'12" N 80°31'9" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bobf1|NP|Water Quality Station||Bob Allen, FL||25.027 N 80.681 W (25°1'36" N 80°40'53" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bphf1|TC|Water Quality Station||BISHOP HARBOR, FL||27.611 N 82.571 W (27°36'39" N 82°34'16" W)|E| | brbn4|J|Shorebased Tower||Brant Beach, NJ||39.610 N 74.200 W (39°36'36" N 74°12'0" W)|E| |


 

brhc3|O|Water Level Observation Network||8467150 - Bridgeport, CT||41.173 N 73.182 W (41°10'24" N 73°10'54" W)|E|FZUS51.KOKX | brim2|NR|NERRS Water Quality Station||Railroad, Chesapeake Bay Reserve, MD||38.781 N 76.714 W (38°46'53" N 76°42'49" W)|E| | brnd1|O|Water Level Observation Network||8555889 - Brandywine Shoal Light, DE||38.987 N 75.113 W (38°59'13" N 75°6'47" W)|E| |For area forecasts and warnings, select: Philadelphia WFO bsbm4|CE|GLOS Weather Station||Big Sable Point, MI||44.055 N 86.514 W (44°3'17" N 86°30'50" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS bsca1|DI|Water Quality Station||Bon Secour, AL||30.329 N 87.829 W (30°19'44" N 87°49'45" W)|C| | bslm2|NR|NERRS Weather Station||Chesapeake Bay, MD||38.781 N 76.708 W (38°46'51" N 76°42'29" W)|E| |Water Quality data for this Reserve are available at....
BRIM2 -- Railroad
LTQM2 -- Otter Point Creek
bufn6|O|Water Level Observation Network||9063020 - Buffalo, NY||42.877 N 78.890 W (42°52'36" N 78°53'24" W)|E|FZUS51.KBUF | burl1|N|C-MAN Station||Southwest Pass, LA|ARES 4.4 payload|28.905 N 89.428 W (28°54'18" N 89°25'42" W)|C|FZUS54.KLIX |

Possible lightning strike on 4/4/2012 caused all data except wind speed to fail at this station.  BURL1 will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenancereport.

busl1|N|C-MAN Station||Bullwinkle Block 65|An industry-supplied payload|27.883 N 90.900 W (27°53'0" N 90°54'0" W)|C| | buzm3|N|C-MAN Station||Buzzards Bay, MA|MARS payload|41.397 N 71.033 W (41°23'48" N 71°2'0" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike

For area forecasts and warnings, select: Boston WFO

bvqw1|NR|NERRS Water Quality Station||Bayview Channel - Padilla Bay, WA||48.496 N 122.501 W (48°29'47" N 122°30'2" W)|P| | bwsf1|NP|Water Quality Station||Blackwater Sound, FL||25.178 N 80.438 W (25°10'42" N 80°26'18" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bygl1|O|Water Level Observation Network||8762482 - Bayou Gauche, LA||29.789 N 90.420 W (29°47'20" N 90°25'12" W)|C|FZUS54.KLIX | bzbm3|O|Water Level Observation Network||8447930 - Woods Hole, MA||41.523 N 70.672 W (41°31'24" N 70°40'18" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

c58w3|CG|Weather Station||Two Rivers CG Station, WI||44.146 N 87.563 W (44°8'46" N 87°33'47" W)|C| | camf1|P|Shorebased Tower||Campbell Park, FL||27.765 N 82.649 W (27°45'54" N 82°38'56" W)|E|FZUS52.KTBW | camm2|O|Water Level Observation Network||8571892 - Cambridge, MD||38.573 N 76.068 W (38°34'24" N 76°4'6" W)|E|FZUS51.KLWX | canf1|NP|Water Quality Station||Cane Patch, FL||25.420 N 80.943 W (25°25'12" N 80°56'33" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. capl1|O|Water Level Observation Network||8768094 - Calcasieu Pass, LA||29.768 N 93.343 W (29°46'5" N 93°20'34" W)|C|FZUS54.KLCH | caro3|N|C-MAN Station||Cape Arago, OR|MARS payload|43.342 N 124.375 W (43°20'30" N 124°22'30" W)|P|FZUS56.KMFR FZUS56.KPQR| casm1|O|Water Level Observation Network||8418150 - Portland, ME||43.657 N 70.247 W (43°39'24" N 70°14'48" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  cbbv2|O|Water Level Observation Network||8638863 - Chesapeake Bay Bridge Tunnel, VA||36.967 N 76.113 W (36°58'0" N 76°6'48" W)|E|FZUS51.KAKQ |


 

cbim2|B|Coastal Marine Station||Chesapeake Biological Laboratory Weather Station MD||38.321 N 76.452 W (38°19'16" N 76°27'7" W)|E|FZUS51.KLWX | cblo1|EA|GLOS Weather Station||Conneaut Breakwater Light, OH||41.981 N 80.555 W (41°58'50" N 80°33'19" W)|E| | cbrw3|CE|GLOS Weather Station||Chambers Island, WI||45.198 N 87.360 W (45°11'54" N 87°21'35" W)|C| | ccuf1|O|Water Level Observation Network||8726413 - C-Cut, St. Petersburg, FL||27.663 N 82.618 W (27°39'47" N 82°37'5" W)|E| | cdea2|AK|Weather Station||Cape Decision, AK||56.002 N 134.133 W (56°0'7" N 134°8'0" W)|A| |For area forecasts and warnings, select: Juneau WFO cdrf1|N|C-MAN Station||Cedar Key, FL|MARS payload|29.136 N 83.029 W (29°8'10" N 83°1'45" W)|E|FZUS52.KTAE FZUS52.KTBW|
cecc1|O|Water Level Observation Network||9419750 - Crescent City, CA||41.745 N 124.183 W (41°44'42" N 124°11'0" W)|P|FZUS56.KEKA | cfwm1|O|Water Level Observation Network||Cutler Farris Wharf, ME (8411060)||44.657 N 67.210 W (44°39'24" N 67°12'36" W)|E| | chao3|O|Water Level Observation Network||9432780 - Charleston, OR||43.345 N 124.322 W (43°20'42" N 124°19'18" W)|P|FZUS56.KMFR | chav3|O|Water Level Observation Network||9751639 - Charlotte Amalie, VI||18.335 N 64.920 W (18°20'6" N 64°55'12" W)|N|FZCA52.TJSJ | chcm2|O|Water Level Observation Network||8573927 - Chesapeake City, MD||39.527 N 75.810 W (39°31'36" N 75°48'36" W)|E|FZUS51.KLWX | chds1|EA|Weather Station||Strom Thurmond Dam, SC||33.662 N 82.200 W (33°39'44" N 82°11'59" W)|E| | chii2|G|C-MAN Station||Chicago, IL||42.000 N 87.500 W (42°0'0" N 87°30'0" W)|C|FZUS53.KLOT | chlv2|N|C-MAN Station||Chesapeake Light, VA|DACT payload|36.910 N 75.710 W (36°54'35" N 75°42'35" W)|E|FZUS51.KLWX FZUS51.KAKQ|


 

chno3|NR|NERRS Weather Station||South Slough Reserve, OR ||43.345 N 124.329 W (43°20'42" N 124°19'43" W)|P| |Water Quality data for this Reserve are available at....
SOQO3 -- Valino Island
CWQO3 -- Charleston Bridge
chqo3|NR|NERRS Water Quality Station||Winchester Arm - South Slough, OR||43.282 N 124.320 W (43°16'56" N 124°19'13" W)|P| | chsv3|O|Water Level Observation Network||9751364 - Christiansted Harbor, Virgin Islands||17.748 N 64.699 W (17°44'53" N 64°41'56" W)|N| | chyv2|O|Water Level Observation Network||8638999 - Cape Henry, VA||36.930 N 76.007 W (36°55'48" N 76°0'25" W)|E| |For area forecasts and warnings, select: Wakefield WFO chyw1|O|Water Level Observation Network||9449424 - Cherry Point, WA||48.863 N 122.758 W (48°51'48" N 122°45'30" W)|P|FZUS56.KSEW | clbp4|O|Water Level Observation Network||9752235 - Culebra, PR||18.301 N 65.302 W (18°18'3" N 65°18'9" W)|N| | clkn7|N|C-MAN Station||Cape Lookout, NC|MARS payload|34.622 N 76.525 W (34°37'18" N 76°31'30" W)|E|FZUS52.KMHX |


 

cllt2|K|Shorebased Tower||8770933 - Clear Lake, TX||29.563 N 95.067 W (29°33'48" N 95°4'0" W)|C| | clsm4|CE|GLOS Weather Station||St. Clair Shores, MI||42.471 N 82.877 W (42°28'16" N 82°52'36" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
cman4|O|Water Level Observation Network||8536110 - Cape May, NJ||38.968 N 74.960 W (38°58'6" N 74°57'36" W)|E|FZUS51.KPHI |
  cmti2|O|Water Level Observation Network||9087044 - Calumet, IL||41.730 N 87.538 W (41°43'48" N 87°32'18" W)|C|FZUS53.KLOT | cnbf1|NP|Water Quality Station||Cannon Bay, FL||25.700 N 81.186 W (25°42'0" N 81°11'9" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. cndo1|O|Water Level Observation Network||9063063 - Cleveland, OH||41.540 N 81.635 W (41°32'24" N 81°38'6" W)|E| |For area forecasts and warnings, select: Cleveland WFO cnii2|CE|GLOS Weather Station||Northerly Island, IL||41.856 N 87.609 W (41°51'21" N 87°36'34" W)|C| | covm2|O|Water Level Observation Network||8577018 - Cove Point LNG Pier, MD||38.404 N 76.386 W (38°24'14" N 76°23'8" W)|E| | cpnt2|K|Water Level Observation Network||Copano Bay, TX - 8774513||28.118 N 97.022 W (28°7'6" N 97°1'18" W)|C| | cptr1|O|Water Level Observation Network||8452944 - Conimicut Light, RI||41.717 N 71.343 W (41°43'0" N 71°20'36" W)|E| |For area forecasts and warnings, select: Boston WFO cpxc1|CP|CICORE water quality station||Cal Poly Pier, CA||35.170 N 120.741 W (35°10'12" N 120°44'28" W)|P| | crta1|DI|C-MAN Station||Cedar Point, AL||30.308 N 88.140 W (30°18'30" N 88°8'22" W)|C| | crva2|O|Water Level Observation Network||9454050- Cordova, AK||60.557 N 145.755 W (60°33'27" N 145°45'19" W)|A| | cryv2|O|Water Level Observation Network||8638595 - South Craney Island, VA||36.888 N 76.338 W (36°53'17" N 76°20'17" W)|E| |For area forecasts and warnings, select: Wakefield WFO csbf1|N|C-MAN Station||Cape San Blas, FL|MARS payload|29.672 N 85.357 W (29°40'18" N 85°21'24" W)|E|FZUS52.KTAE |Station CSBF1 has been replaced with Station SGOF1 cspa2|AK|Weather Station||Cape Spencer, AK||58.199 N 136.639 W (58°11'56" N 136°38'19" W)|A| |For area forecasts and warnings, select: Juneau WFO ctgm1|O|Water Level Observation Network||8411250 - Cutler, ME||44.642 N 67.297 W (44°38'30" N 67°17'48" W)|E| | cvqv2|NR|NERRS Water Quality Station||Sweet Hall, Chesapeake Bay Reserve, VA||37.571 N 76.884 W (37°34'17" N 76°53'3" W)|E| | cwaf1|NP|Water Quality Station||Clear Water Pass, FL ||25.295 N 81.013 W (25°17'41" N 81°0'47" W)|E| | cwbf1|O|Water Level Observation Network||8726724 - Clearwater Beach, FL||27.977 N 82.832 W (27°58'36" N 82°49'54" W)|E|FZUS52.KTBW | cwqo3|NR|NERRS Water Quality Station||Charleston Bridge, South Slough Reserve, OR||43.338 N 124.321 W (43°20'16" N 124°19'14" W)|P| | cygm4|CE|GLOS Weather Station||Cheybogan, MI||45.651 N 84.472 W (45°39'4" N 84°28'19" W)|E| | darth|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only darti|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |

Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only.

dartj|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartk|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartl|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartm|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartn|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. darto|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartp|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartq|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartr|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. darts|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartt|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartu|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only dbln6|N|C-MAN Station||Dunkirk, NY|MARS payload|42.493 N 79.353 W (42°29'36" N 79°21'12" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS dbqs1|NR|NERRS Water Quality Station||Debidue Creek - North Inlet - Winyah Bay, SC||33.360 N 79.168 W (33°21'37" N 79°10'3" W)|E| | deld1|O|Water Level Observation Network||8551762 - Delaware City, DE||39.582 N 75.590 W (39°34'55" N 75°35'24" W)|E| |For area forecasts and warnings, select: Philadelphia WFO demo2|LR|Test station||NDBC Demo Glider #2||40.122 N 71.270 W (40°7'20" N 71°16'12" W)|E| |Glider data are not quality controlled by NDBC.

Click  here  to see latest positions.
deqd1|NR|NERRS Water Quality Station||Lebanon Landing, Delaware Reserve, DE||39.114 N 75.499 W (39°6'52" N 75°29'57" W)|E| | desw1|N|C-MAN Station||Destruction Island, WA|MARS payload|47.675 N 124.485 W (47°40'30" N 124°29'6" W)|C|FZUS56.KSEW | disw3|N|C-MAN Station||Devils Island, WI|Sutron XPERT payload|47.080 N 90.728 W (47°4'48" N 90°43'42" W)|C| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS.

dkcm6|O|Water Level Observation Network||8741501 - Dock C, Pascagoula, MS||30.355 N 88.567 W (30°21'18" N 88°34'1" W)|C| | dkkf1|NP|Water Quality Station||Duck Key, FL||25.180 N 80.490 W (25°10'48" N 80°29'24" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. dmbc1|EB|CICORE water quality station||Dumbarton Bridge at Newark, CA||37.507 N 122.117 W (37°30'25" N 122°7'0" W)|P| | domv2|O|Water Level Observation Network||8638511 - Dominion Terminal Association, VA||36.962 N 76.425 W (36°57'43" N 76°25'29" W)|E| | dpha1|DI|Coastal Marine Station||Dauphin Island, AL||30.251 N 88.078 W (30°15'5" N 88°4'40" W)|C| | dpia1|N|C-MAN Station||Dauphin Island, AL|Sutron XPERT payload|30.248 N 88.073 W (30°14'54" N 88°4'24" W)|C|FZUS54.KMOB | dpxc1|O|||9415141 - Davis Point, San Pablo Bay, CA||38.057 N 122.259 W (38°3'24" N 122°15'34" W)|| | drfa2|N|C-MAN Station||Drift River Terminal, AK|MARS payload|60.553 N 152.137 W (60°33'12" N 152°8'12" W)|A|FZAK58.PAVW FZAK51.PAFC| drsd1|NR|NERRS Weather Station||Delaware Reserve, DE||39.089 N 75.437 W (39°5'20" N 75°26'13" W)|E| |Water Quality data for this Reserve are available at....
DEQD1 -- Lebanon Landing
SCLD1 -- Scotton Landing
dryf1|N|C-MAN Station||Dry Tortugas, FL|MARS payload|24.638 N 82.862 W (24°38'18" N 82°51'42" W)|E|FZUS52.KKEY |Station DRYF1 failed on September 21, 2005. It has been replaced with a station installed nearby at Pulaski Shoal Light, PLSF1 dsln7|N|C-MAN Station||Diamond Shls Lt., NC|DACT payload|35.153 N 75.297 W (35°9'12" N 75°17'48" W)|E|FZUS52.KMHX |Station 41025, the replacement station for DSLN7, was deployed on March 28, 2003. dtlm4|O|Water Level Observation Network||9075099 - De Tour Village, MI||45.992 N 83.897 W (45°59'30" N 83°53'48" W)|E|FZUS53.KAPX | ducn7|N|C-MAN Station||Duck Pier, NC|ARES payload|36.184 N 75.745 W (36°11'3" N 75°44'43" W)|E|FZUS52.KMHX |Station DUCN7 failed on 07/31/2008. Meteorological data for this location is available at DUKN7.

  dukn7|O|Water Level Observation Network||Duck Pier, NC - 8651370||36.183 N 75.747 W (36°11'0" N 75°44'48" W)|E| | dulm5|O|Water Level Observation Network||9099064 - Duluth, MN||46.775 N 92.093 W (46°46'30" N 92°5'36" W)|C|FZUS53.KDLH | eb01|N|12-meter discus buoy||||36.500 N 73.500 W (36°30'0" N 73°30'0" W)|| | eb10|N|12-meter discus buoy|||EEP payload|27.500 N 88.000 W (27°30'0" N 88°0'0" W)|C| | eb31|N|12-meter discus buoy|||LCB payload|27.000 N 86.000 W (27°0'0" N 86°0'0" W)|| | eb32|N|12-meter discus buoy|||LCB payload|27.000 N 84.300 W (27°0'0" N 84°17'60" W)|| | eb33|N|6-meter NOMAD buoy|||MVXI payload|58.500 N 141.000 W (58°30'0" N 141°0'0" W)|A| | eb35|N|6-meter NOMAD buoy|||MVXI payload|55.300 N 157.000 W (55°17'60" N 157°0'0" W)|A| | eb36|N|USCG Large Navigational Buoy|||LCB payload|26.000 N 84.800 W (26°0'0" N 84°47'60" W)|?| | eb43|N|6-meter NOMAD buoy|||MVXI payload|59.800 N 142.000 W (59°47'60" N 142°0'0" W)|A| | eb52|N|USCG Large Navigational Buoy||||38.400 N 74.300 W (38°23'60" N 74°17'60" W)|| | eb53|N|USCG Large Navigational Buoy|||DACT payload|28.900 N 88.300 W (28°53'60" N 88°17'60" W)|E| | eb61|N|GE|||LCB payload|26.900 N 84.600 W (26°53'60" N 84°35'60" W)|?| | eb62|N|USCG Large Navigational Buoy|||DACT payload|29.000 N 85.600 W (29°0'0" N 85°35'60" W)|E| | eb70|N|12-meter discus buoy|||MVXII payload|59.500 N 142.300 W (59°30'0" N 142°18'0" W)|A| | eb90|N|12-meter discus buoy| 02|BERING SEA|DACT payload|47.000 N 130.900 W (47°0'0" N 130°54'0" W)|A|FZAK61.PAFC | eb91|N|USCG Large Navigational Buoy|||DACT payload|38.400 N 74.300 W (38°23'60" N 74°17'60" W)|E| | eb92|N|USCG Large Navigational Buoy|||DACT payload|28.500 N 90.000 W (28°30'0" N 90°0'0" W)|E| | ebsw1|O|Water Level Observation Network||9447130 - Seattle, WA||47.605 N 122.338 W (47°36'18" N 122°20'18" W)|P|FZUS56.KSEW | egkf1|P|Shorebased Tower||EGK - Egmont Key, FL||27.601 N 82.760 W (27°36'4" N 82°45'36" W)|E|FZUS52.KTBW | elfa2|O|Water Level Observation Network||9452634 - Elfin Cove, AK||58.193 N 136.343 W (58°11'35" N 136°20'35" W)|A| | elqc1|NR|NERRS Water Quality Station||South Marsh, Elkhorn Slough Reserve, CA||36.818 N 121.739 W (36°49'5" N 121°44'22" W)|P| | elxc1|NR|NERRS Weather Station||Elkhorn Slough Reserve, CA||36.815 N 121.738 W (36°48'55" N 121°44'17" W)|P| |Water Quality data for this Reserve are available at....
ELQC1 -- South Marsh
eptt2|O|Water Level Observation Network||8771013 - Eagle Point, TX||29.480 N 94.918 W (29°28'48" N 94°55'6" W)|C|FZUS54.KHGX | erkc1|HU|CICORE water quality station||Dock B Eureka, CA||40.801 N 124.182 W (40°48'5" N 124°10'54" W)|P| | eroa2|AK|Weather Station||Eldred Rock, AK||58.971 N 135.220 W (58°58'16" N 135°13'11" W)|A| |For area forecasts and warnings, select: Juneau WFO ertf1|O|Water Level Observation Network||8726669 - Berth 223 Met, FL||27.917 N 82.443 W (27°55'1" N 82°26'34" W)|E| | espp4|O|Water Level Observation Network||9752695 - Esperanza, PR||18.094 N 65.471 W (18°5'38" N 65°28'17" W)|N| | faio1|O|Water Level Observation Network||9063053 - Fairport, OH||41.760 N 81.281 W (41°45'35" N 81°16'52" W)|E| | farp2|N|C-MAN Station||Faraulep, Carolines Island|DACT payload|8.583 N 144.583 E (8°35'0" N 144°35'0" E)|?| | fbis1|N|C-MAN Station||Folly Island, SC|MARS payload|32.685 N 79.888 W (32°41'6" N 79°53'18" W)|E|FZUS52.KCHS |


 

fbps1|NS|Coastal Marine Station||Folly Beach Pier, SC||32.652 N 79.938 W (32°39'7" N 79°56'17" W)|E|FZUS52.KCHS |
  fcgt2|O|Water Level Observation Network||8772447 - USCG Freeport, TX||28.943 N 95.303 W (28°56'36" N 95°18'9" W)|C| | ffia2|N|C-MAN Station||Five Finger, AK|Sutron XPERT payload|57.272 N 133.630 W (57°16'18" N 133°37'48" W)|A| |For area forecasts and warnings, select: Juneau WFO fgbl1|Q|Fixed Structure Weather Station||High Island 334||28.118 N 93.670 W (28°7'6" N 93°40'12" W)|C|FZUS54.KLCH FZNT24.KNHC| fhpf1|P|Shorebased Tower||Fred Howard Park, FL||28.153 N 82.801 W (28°9'12" N 82°48'4" W)|E|FZUS52.KTBW | fila2|N|C-MAN Station||Flat Island Light, AK|ARES payload|59.332 N 151.995 W (59°19'54" N 151°59'42" W)|A|FZAK58.PAVW FZAK51.PAFC|Wave data for this area were available at 46106.

fmoa1|O|Water Level Observation Network||8734673 - Fort Morgan, AL||30.228 N 88.025 W (30°13'41" N 88°1'30" W)|C| | fmrf1|O|Water Level Observation Network||8725520 - Fort Myers, FL||26.647 N 81.872 W (26°38'48" N 81°52'18" W)|E|FZUS52.KTBW | foxr1|O|Water Level Observation Network||8454000 - Providence, RI||41.807 N 71.402 W (41°48'24" N 71°24'6" W)|E| |For area forecasts and warnings, select: Boston WFO fpkg1|O|Water Level Observation Network||8670870 - Fort Pulaski, GA||32.033 N 80.902 W (32°2'0" N 80°54'6" W)|E|FZUS52.KCHS | fpsn7|N|C-MAN Station||Frying Pan Shoals, NC|DACT payload|33.485 N 77.590 W (33°29'6" N 77°35'24" W)|E|FZUS52.KMHX FZUS52.KILM|The CMAN station at FPSN7 has been disestablished.  For local data, please refer to buoy 41013.


  fptm4|CE|GLOS Weather Station||Fairport, MI||45.619 N 86.659 W (45°37'8" N 86°39'34" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS fptt2|O|Water Level Observation Network||8772440 - Freeport, TX||28.948 N 95.308 W (28°56'54" N 95°18'30" W)|C|FZUS54.KHGX | frdf1|O|Water Level Observation Network||8720030 - Fernandina Beach, FL||30.672 N 81.465 W (30°40'18" N 81°27'54" W)|E|FZUS52.KJAX |
  frdp4|PN|Water Level Observation Network||9753216 - Fajardo, PR||18.335 N 65.631 W (18°20'6" N 65°37'52" W)|N| | frdw1|O|Water Level Observation Network||9449880 - Friday Harbor, WA||48.547 N 123.010 W (48°32'48" N 123°0'36" W)|P|FZUS56.KSEW | frkf1|TC|Shorebased Tower||Frog Creek, FL||27.591 N 82.552 W (27°35'28" N 82°33'7" W)|E| | frps1|O|Water Level Observation Network||8668498 - Fripps Inlet, SC||32.340 N 80.460 W (32°20'24" N 80°27'36" W)|E| |For area forecasts and warnings, select: Charleston WFO


  frvm3|O|Water Level Observation Network||8447386 - Fall River, MA||41.705 N 71.163 W (41°42'18" N 71°9'48" W)|E| |For area forecasts and warnings, select: Boston WFO frwl1|O|Water Level Observation Network||8766072 - Fresh Water Canal Locks, LA||29.555 N 92.305 W (29°33'18" N 92°18'18" W)|C|FZUS54.KLCH | fskm2|O|Water Level Observation Network||8574728 - Francis Scott Key Bridge, MD||39.219 N 76.528 W (39°13'9" N 76°31'42" W)|E|FZUS51.KLWX | fsti2|CH|C-MAN Station||Foster Ave Chicago, IL (CPD)||41.976 N 87.648 W (41°58'35" N 87°38'51" W)|C| | ftgm4|O|Water Level Observation Network||9014098 - Fort Gratiot, MI||43.007 N 82.423 W (43°0'24" N 82°25'24" W)|E|FZUS53.KDTX |For area marine forecasts, select: Great Lakes Forecasts ftpc1|O|Water Level Observation Network||9414290 - San Francisco, CA||37.807 N 122.465 W (37°48'24" N 122°27'54" W)|P|FZUS56.KMTR | fwic3|I|Long Island Ferry||Fayerweather Island, CT||41.150 N 73.172 W (41°9'0" N 73°10'19" W)|E|FZUS51.KOKX | fwyf1|N|C-MAN Station||Fowey Rocks, FL|MARS payload|25.591 N 80.097 W (25°35'26" N 80°5'49" W)|E|FZUS52.KMFL FZUS52.KKEY| gbcl1|N|C-MAN Station||Garden Banks||27.800 N 93.100 W (27°48'0" N 93°6'0" W)|C| | gbif1|NP|Water Quality Station||Gunboat Island, FL||25.376 N 81.029 W (25°22'35" N 81°1'46" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. gblw3|CE|Weather Station||Green Bay Entrance Light WI||44.655 N 87.902 W (44°39'18" N 87°54'6" W)|C|FZUS53.KGRB |NOTE: WINDS FREQUENTLY DROP TO ZERO DUE TO WINTER FREEZING.
gbqn3|NR|NERRS Water Quality Station||Oyster River, Great Bay Reserve, NH||43.134 N 70.911 W (43°8'2" N 70°54'40" W)|E| | gbtf1|NP|Water Quality Station||Garfield Bight, FL||25.170 N 80.797 W (25°10'13" N 80°47'48" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. gdil1|N|C-MAN Station||Grand Isle, LA|MARS payload|29.267 N 89.957 W (29°16'0" N 89°57'24" W)|C|FZUS54.KLIX |The Coast Guard building where this station is located sustained extensive damage during Hurricane Katrina. Because of this, we anticipate a lengthy station outage. For comparable local weather and water level observations, see Station GISL1. gdiv2|VM|Marine Observation Station||Goodwin Island Met Station||37.222 N 76.404 W (37°13'20" N 76°24'14" W)|E| | gdmm5|O|Water Level Observation Network||9099090 - Grand Marais, MN||47.748 N 90.342 W (47°44'54" N 90°20'30" W)|C|FZUS53.KDLH | gdqm6|NR|NERRS Water Quality Station||Bangs Lake, Grand Bay Reserve, MS||30.357 N 88.463 W (30°21'26" N 88°27'46" W)|C| | gdwv2|NR|NERRS Water Quality Station||Goodwin Island, Chesapeake Bay Reserve, VA||37.218 N 76.395 W (37°13'3" N 76°23'43" W)|E| | gdxm6|NR|NERRS Weather Station||Grand Bay Reserve, MS||30.359 N 88.420 W (30°21'33" N 88°25'12" W)|C| |Water Quality data for this Reserve are available at....
GDQM6 -- Bangs Lake
gelo1|EA|GLOS Weather Station||Geneva on the Lake, OH||41.860 N 80.974 W (41°51'35" N 80°58'26" W)|E| | gisl1|O|Water Level Observation Network||8761724 - Grand Isle, LA||29.263 N 89.957 W (29°15'48" N 89°57'24" W)|C|FZUS54.KLIX | glln6|N|C-MAN Station||Galloo Island, NY|VEEP payload|43.890 N 76.450 W (43°53'24" N 76°27'0" W)|E|FZUS61.KBUF |Station GLLN6 was disestablished on September 30, 2002 glpt2|K|Shorebased Tower||021: Galveston Pleasure Pier; Gulf of Mexico||29.300 N 94.794 W (29°17'59" N 94°47'38" W)|C|FZUS54.KHGX |Station disestablished. Refer to Station GPST2 for current data. gnjt2|O|Water Level Observation Network||8771341 - Galveston Bay (North Jetty), TX||29.357 N 94.723 W (29°21'24" N 94°43'24" W)|C| | gpom6|O|Water Level Observation Network||8744707 - Gulfport Outer Range, MS||30.230 N 88.982 W (30°13'48" N 88°58'55" W)|C| | gpst2|O|Water Level Observation Network||8771510 - Galveston Pleasure Pier, TX||29.285 N 94.788 W (29°17'6" N 94°47'18" W)|C|FZUS54.KHGX | gptw1|CM|Water Quality Station||Grays Point, WA||46.273 N 123.767 W (46°16'23" N 123°46'1" W)|P| | grmm4|CE|GLOS Weather Station||Grand Marais, MI||46.680 N 85.970 W (46°40'47" N 85°58'11" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS gslm4|CE|Weather Station||Gravelly Shoals Light MI||44.018 N 83.537 W (44°1'6" N 83°32'14" W)|E|FZUS53.KDTX | gtbm4|MI|Coastal Marine Station||Grand Traverse Bay Observing System Station 2||44.767 N 85.606 W (44°46'0" N 85°36'21" W)|E| |For Great Lakes marine forecast, selec: GREAT LAKES FORECAST

gtlm4|CE|GLOS Weather Station||Grand Traverse Light, MI||45.211 N 85.550 W (45°12'38" N 85°33'1" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS gtot2|O|Water Level Observation Network||8771450 - Galveston Pier 21, TX||29.310 N 94.793 W (29°18'36" N 94°47'36" W)|C|FZUS54.KHGX | gtqf1|NR|NERRS Water Quality Station||Pellicer Creek, Guan Tolomato Matanzas Reserve, FL||29.669 N 81.256 W (29°40'9" N 81°15'22" W)|E| | gtrm4|CE|GLOS Weather Station||Superior Grand Traverse Bay, MI||47.179 N 88.242 W (47°10'44" N 88°14'30" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS gtxf1|NR|NERRS Weather Station||Guana Tolomato Matanzas Reserve, FL||29.658 N 81.220 W (29°39'28" N 81°13'13" W)|E| |

Water Quality data for this Reserve are available at....
GTQF1 -- Pellicer Creek

 




gwpm6|O|Water Level Observation Network||8745651 - West Pier, Gulfport, MS||30.348 N 89.087 W (30°20'53" N 89°5'13" W)|C| | hbyc1|O|Water Level Observation Network||9418767 - North Spit, CA||40.767 N 124.217 W (40°46'0" N 124°13'0" W)|P|FZUS56.KEKA | hcef1|NP|Water Quality Station||Highway Creek, FL||25.254 N 80.444 W (25°15'15" N 80°26'39" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. hcgn7|O|Water Level Observation Network||8654467 - Hatteras, NC||35.208 N 75.703 W (35°12'29" N 75°42'11" W)|E| | hhlo1|EA|GLOS Weather Station||Huron Light, OH||41.401 N 82.545 W (41°24'2" N 82°32'43" W)|E| | hlnm4|O|Water Level Observation Network||9087031 - Holland, MI||42.773 N 86.213 W (42°46'24" N 86°12'46" W)|E| | hmno3|CM|||Hammond Tide Gauge, OR||46.203 N 123.767 W (46°12'10" N 123°46'1" W)|P| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. hmra2|NR|NERRS Weather Station||Kachemak Bay Reserve, AK||59.601 N 151.416 W (59°36'5" N 151°24'58" W)|A| |

Water Quality data for this Reserve are available at....

KCHA2 -- Homer Deep

SEQA2 -- Seldovia

hplm2|HP|CBOS Station||Horn Point Weather Station MD||38.590 N 76.133 W (38°35'24" N 76°8'0" W)|E|FZUS51.KLWX | hrbm4|O|Water Level Observation Network||9075014 - Harbor Beach, MI||43.847 N 82.643 W (43°50'48" N 82°38'36" W)|E|FZUS53.KDTX | hssf1|P|Offshore Tower||HOM - Homosassa, FL||28.772 N 82.707 W (28°46'20" N 82°42'26" W)|E|FZUS52.KTBW | huqn6|NR|NERRS Water Quality Station||Tivoli North, Hudson River Reserve, NY||42.037 N 73.925 W (42°2'12" N 73°55'31" W)|E| | icac1|O|Water Level Observation Network||9410840 - Santa Monica Pier||34.008 N 118.500 W (34°0'30" N 118°30'0" W)|P|FZUS56.KLOX |The Station ID prior to 18z, on 1/22/2010 was SMOC1. iiwc1|O|Water Level Observation Network||9410172 - USS Midway South Navy Pier, San Diego, CA||32.714 N 117.175 W (32°42'50" N 117°10'31" W)|P| | ildl1|Z|Shorebased Tower||Isle Dernieres, LA / CSI05||29.053 N 90.533 W (29°3'12" N 90°32'0" W)|C|FZUS54.KLIX | iloh1|O|Water Level Observation Network||1617760 - Hilo, HI||19.730 N 155.055 W (19°43'48" N 155°3'18" W)|H| | iosn3|N|C-MAN Station||Isle of Shoals, NH|Sutron XPERT payload|42.967 N 70.623 W (42°58'0" N 70°37'24" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
irdt2|K|Shorebased Tower||8776139 - South Bird Island, TX||27.485 N 97.318 W (27°29'5" N 97°19'5" W)|C| | jaki2|CH|C-MAN Station||63rd ST, Chicago, IL (CPD)||41.781 N 87.573 W (41°46'50" N 87°34'23" W)|| | jcqn4|NR|NERRS Water Quality Station||Chestnut Neck, Jacques Cousteau Reserve, NJ||39.548 N 74.461 W (39°32'52" N 74°27'41" W)|E| | jcrn4|NR|NERRS Weather Station||Jacques Cousteau Reserve, NJ||39.535 N 74.464 W (39°32'6" N 74°27'49" W)|E| |Water Quality data for this Reserve are available at....
JCQN4 -- Chestnut Neck
JCTN4 -- Buoy 126
jctn4|NR|NERRS Water Quality Station||Buoy 126, Jacques Cousteau Reserve, NJ||39.508 N 74.338 W (39°30'29" N 74°20'18" W)|E| | jkyf1|NP|Water Quality Station||Johnson Key, FL||25.050 N 80.904 W (25°3'1" N 80°54'16" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. jmpn7|O|Water Level Observation Network||8658163 - Johnny Mercer Pier, Wrightsville Beach, NC||34.210 N 77.795 W (34°12'36" N 77°47'42" W)|E| |

For area forecasts and warnings, select: Wilmington WFO


 

jnea2|O|Water Level Observation Network||9452210 - Juneau, AK||58.298 N 134.412 W (58°17'54" N 134°24'42" W)|A| | joqp4|NR|NERRS Water Quality Station||Station 20, Jobos Bay Reserve, Puerto Rico||17.930 N 66.211 W (17°55'49" N 66°12'41" W)|N| | joxp4|NR|NERRS Weather Station||Jobos Bay Reserve, Puerto Rico||17.956 N 66.239 W (17°57'23" N 66°14'19" W)|N| |Water Quality data for this Reserve are available at....
JOQP4 -- Station 20
jtaw1|CM|Water Quality Station||Jetty A, USCG Station Disappointment||46.269 N 124.037 W (46°16'10" N 124°2'15" W)|P| | kata1|DI|C-MAN Station||Katrina Cut, AL||30.258 N 88.213 W (30°15'30" N 88°12'47" W)|C| | katp|FA|Oil Platform||Green Canyon 787 / Atlantis (BP)||27.195 N 90.027 W (27°11'42" N 90°1'37" W)|C| |Data from this station are not quality controlled by NDBC kbbf|FA|Oil Platform||Brazos 133B (Apache Corp)||28.058 N 95.872 W (28°3'29" N 95°52'19" W)|C| |Data from this station are not quality controlled by NDBC kbqx|FA|Oil Platform||Brazos 451 (Medco Energi)||28.493 N 95.724 W (28°29'35" N 95°43'26" W)|C| |Data from this station are not quality controlled by NDBC kcha2|NR|NERRS Water Quality Station||Homer Deep, Kachemak Bay Reserve, AK||59.603 N 151.408 W (59°36'10" N 151°24'29" W)|A| | kcmb|FA|Oil Platform||East Cameron 47JP (Apache Corp)||29.441 N 92.979 W (29°26'28" N 92°58'44" W)|C| |Data from this station are not quality controlled by NDBC kcrh|FA|Oil Platform||West Cameron 368A (Century Exploration)||28.909 N 93.302 W (28°54'32" N 93°18'7" W)|C| |Data from this station are not quality controlled by NDBC kdaa2|O|Water Level Observation Network||9457292- Kodiak Island, AK||57.730 N 152.514 W (57°43'49" N 152°30'50" W)|A| | kdlp|FA|Oil Platform||West Delta 27A (AngloSuisse Offshore Partners)||29.121 N 89.547 W (29°7'16" N 89°32'49" W)|C| |Data from this station are not quality controlled by NDBC keca2|O|Water Level Observation Network||9450460 - Ketchikan, AK||55.333 N 131.625 W (55°19'59" N 131°37'30" W)|A| | kehc|FA|Oil Platform||East Cameron 278B (Apache Corp)||28.429 N 92.878 W (28°25'44" N 92°52'41" W)|C| |Data from this station are not quality controlled by NDBC keir|FA|Oil Platform||Eugene Island 215 (McMoRan Oil & Gas)||28.634 N 91.489 W (28°38'2" N 91°29'20" W)|C| |Data from this station are not quality controlled by NDBC kemk|FA|Oil Platform||East Breaks 165 (SandRidge Energy)||27.819 N 94.323 W (27°49'8" N 94°19'23" W)|C| |Data from this station are not quality controlled by NDBC kgbk|FA|Oil Platform||Garden Banks 783 / Magnolia TLP (ConocoPhillips)||27.204 N 92.203 W (27°12'14" N 92°12'11" W)|C| |Data from this station are not quality controlled by NDBC kgca2|O|Water Level Observation Network||9459881 - King Cove, AK||55.062 N 162.327 W (55°3'42" N 162°19'36" W)|A| | kghb|FA|Oil Platform||Garden Banks 172 / Salsa (Shell E & P)||27.840 N 91.988 W (27°50'24" N 91°59'17" W)|C| |Data from this station are not quality controlled by NDBC kgna|CE|Weather Station||Bay of Grand Marais, MN||47.745 N 90.346 W (47°44'43" N 90°20'44" W)|C| |Data from this station are not quality controlled by NDBC kgry|FA|Oil Platform||Green Canyon 338 / Front Runner (Murphy E&P)||27.625 N 90.441 W (27°37'30" N 90°26'28" W)|C| |Data from this station are not quality controlled by NDBC kgul|FA|Oil Platform||Garden Banks 668 / Gunnison Spar (Anadarko)||27.304 N 93.538 W (27°18'14" N 93°32'17" W)|C| |Data from this station are not quality controlled by NDBC kgvx|FA|Oil Platform||Galveston 424C (Nippon Oil Exploration)||28.577 N 94.976 W (28°34'37" N 94°58'34" W)|C| |Data from this station are not quality controlled by NDBC khhv|FA|Oil Platform||Alaminos Canyon 25 / Hoover-Diana (ExxonMobile Corp)||26.939 N 94.689 W (26°56'20" N 94°41'20" W)|C| |Data from this station are not quality controlled by NDBC khqi|FA|Oil Platform||High Island 376B (Apache)||27.934 N 93.669 W (27°56'2" N 93°40'8" W)|C| |Data from this station are not quality controlled by NDBC kipn|FA|Oil Platform||Mississippi Canyon 920 / Independence Hub (Anadarko / Enterprise)||28.085 N 87.986 W (28°5'6" N 87°59'10" W)|C| |Data from this station are not quality controlled by NDBC klih1|O|Water Level Observation Network||1615680 - Kahului Bay, Maui, HI||20.898 N 156.472 W (20°53'54" N 156°28'18" W)|H|FZHW50.PHFO | kmdj|FA|Oil Platform||Mississippi Canyon 311A (Apache Corp)||28.643 N 89.794 W (28°38'35" N 89°47'38" W)|C| |Data from this station are not quality controlled by NDBC kmis|FA|Oil Platform||MP 140B AWOS (Apache Corp)||29.296 N 88.842 W (29°17'46" N 88°50'31" W)|C| |Data from this station are not quality controlled by NDBC kmiu|FA|Oil Platform||Mustang Island A31B (Merit Energy)||27.289 N 96.736 W (27°17'20" N 96°44'10" W)|C| |Data from this station are not quality controlled by NDBC kmyt|FA|Oil Platform||Mississippi Canyon 711 / ATP Innovator (ATP Oil & Gas)||28.221 N 89.615 W (28°13'16" N 89°36'54" W)|C| |Data from this station are not quality controlled by NDBC kmzg|FA|Oil Platform||Mustang Island A85A (Apache Corp)||27.727 N 96.191 W (27°43'37" N 96°11'28" W)|C| |Data from this station are not quality controlled by NDBC knoh1|UH|Platform||Kilo Nalu Observatory, Hawaii||21.288 N 157.865 W (21°17'18" N 157°51'54" W)|H| |Sensors located at 11.5 meters below mean sea level. knsw3|CE|C-MAN Station||Kenosha, WI||42.589 N 87.809 W (42°35'20" N 87°48'31" W)|C|FZUS53.KMKX | kopm|FA|Oil Platform||North Padre Island 975 (Peregrine Oil & Gas)||26.833 N 96.940 W (26°49'59" N 96°56'24" W)|C| |Data from this station are not quality controlled by NDBC kp53|CE|Weather Station||Munising Lake Shore, MI||46.417 N 86.650 W (46°25'0" N 86°39'0" W)|E| |Data from this station are not quality controlled by NDBC kp58|CE|Weather Station||Port Hope, MI||44.017 N 82.800 W (44°1'0" N 82°48'0" W)|E| |Data from this station are not quality controlled by NDBC kp59|CE|Weather Station||Copper Harbor, MI||47.467 N 87.883 W (47°28'0" N 87°53'0" W)|E| |Data from this station are not quality controlled by NDBC kptn6|O|Water Level Observation Network||8516945 - Kings Point, NY||40.810 N 73.765 W (40°48'36" N 73°45'54" W)|E|FZUS51.KOKX | kptv2|O|Water Level Observation Network||8632200 - Kiptopeke, VA||37.167 N 75.988 W (37°10'0" N 75°59'18" W)|E|FZUS51.KAKQ |


 

kscf|FA|Oil Platform||South Marsh 268A (Apache Corp)||29.116 N 91.871 W (29°6'58" N 91°52'16" W)|C| |Data from this station are not quality controlled by NDBC kspr|FA|Oil Platform||Ship Shoal 178 (Apache Corp)||28.599 N 91.206 W (28°35'56" N 91°12'22" W)|C| |Data from this station are not quality controlled by NDBC kstz|FA|Oil Platform||South Timballer 301B / Popeye (Shell E & P)||28.160 N 90.666 W (28°9'36" N 90°39'58" W)|C| |Data from this station are not quality controlled by NDBC ktnf1|N|C-MAN Station||Keaton Beach, FL|MARS payload|29.817 N 83.592 W (29°49'2" N 83°35'30" W)|E|FZUS52.KTAE |
kvaf|FA|Oil Platform||East Breaks 643 / Boomvang Spar (Anadarko)||27.354 N 94.625 W (27°21'14" N 94°37'30" W)|C| |Data from this station are not quality controlled by NDBC kvbs|FA|Oil Platform||Sabine Pass 13B (Nippon Oil Exploration)||29.478 N 93.638 W (29°28'41" N 93°38'17" W)|C| |Data from this station are not quality controlled by NDBC kvky|FA|Oil Platform||Main Pass 289C (Apache Corp.)||29.248 N 88.441 W (29°14'53" N 88°26'28" W)|C| |Data from this station are not quality controlled by NDBC kvnp|FA|Oil Platform||Vermillion 26 (Mariner Energy)||29.467 N 92.368 W (29°28'1" N 92°22'5" W)|C| |Data from this station are not quality controlled by NDBC kvoa|FA|Oil Platform||Vissco Knoll 786 / Petronius (Chevron)||29.229 N 87.781 W (29°13'44" N 87°46'52" W)|C| |Data from this station are not quality controlled by NDBC kvqt|FA|Oil Platform||Vermillon 331A (ERT / Helix)||28.270 N 92.264 W (28°16'12" N 92°15'50" W)|C| |Data from this station are not quality controlled by NDBC kwjp8|O|Water Level Observation Network||1820000 - Kwajalein Island||8.737 N 167.737 E (8°44'12" N 167°44'12" E)|?| | kwnw3|O|Water Level Observation Network||9087069- Kewaunee, WI||44.465 N 87.496 W (44°27'54" N 87°29'45" W)|C| |

To visit the CO-OPS web site:

For Meteorological data: Station = 9087069

For nearby Water Level data: Station = 9087068

kxih|FA|Oil Platform||High Island 179A AWOS (Apache Corp)||29.180 N 94.521 W (29°10'48" N 94°31'16" W)|C| |Data from this station are not quality controlled by NDBC kxpy|FA|Weather Station||Fourchon Heliport (Era Helicopters)||29.123 N 90.202 W (29°7'23" N 90°12'7" W)|C| |Data from this station are not quality controlled by NDBC kywf1|O|Water Level Observation Network||8724580 - Key West, FL||24.553 N 81.808 W (24°33'12" N 81°48'30" W)|E|FZUS52.KKEY | labl1|O|Water Level Observation Network||8762372 - Bayou LaBranch, LA||30.050 N 90.368 W (30°3'0" N 90°22'6" W)|C|FZUS54.KLIX | lapw1|O|Water Level Observation Network||9442396 - La Push, WA||47.913 N 124.637 W (47°54'47" N 124°38'13" W)|P| |For area forecasts and warnings, select: Seattle WFO lbrf1|NP|Water Quality Station||Broad River Lower, FL||25.484 N 81.111 W (25°29'4" N 81°6'40" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lbsf1|NP|Water Quality Station||Little Blackwater, FL||25.214 N 80.432 W (25°12'52" N 80°25'56" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lciy2|IC|Fixed Structure Weather Station||Little Cayman Research Centre, Cayman Islands||19.699 N 80.061 W (19°41'56" N 80°3'38" W)|E| | lcll1|O|Water Level Observation Network||8767816 - Lake Charles, LA||30.223 N 93.222 W (30°13'24" N 93°13'18" W)|C| | lcna2|AK|Weather Station||Lincoln Rock, AK||56.057 N 132.696 W (56°3'25" N 132°41'46" W)|A| |For area forecasts and warnings, select: Juneau WFO ldlc3|Y|Weather Station||New London Ledge CT - Ledge Light Weather Station||41.305 N 72.077 W (41°18'18" N 72°4'36" W)|E|FZUS51.KOKX | ldtm4|O|Water Level Observation Network||9087023 - Ludington, MI||43.947 N 86.442 W (43°56'48" N 86°26'30" W)|E|FZUS53.KGRR | ljac1|O|Water Level Observation Network||9410230 - La Jolla, CA||32.867 N 117.258 W (32°52'0" N 117°15'30" W)|P|FZUS56.KSGX | ljpc1|R|C-MAN Station||La Jolla, CA (073)||32.867 N 117.257 W (32°52'0" N 117°15'24" W)|P|FZUS56.KSGX | lkpl1|L|Shorebased Tower||Western Lake Pontchartrain, LA||30.315 N 90.281 W (30°18'54" N 90°16'50" W)|C|FZUS54.KLIX | lkwf1|O|Water Level Observation Network||8722670 - Lake Worth, FL||26.612 N 80.033 W (26°36'42" N 80°2'0" W)|E|FZUS52.KMFL | llbp7|IC|Water Quality Station||Lao Lao Bay, Saipan, CNMI||15.157 N 145.770 E (15°9'24" N 145°46'11" E)|?| | lmbv4|EM|Weather Station||La Mancha Beach, Mexico|Sutron XPERT payload|19.594 N 96.379 W (19°35'38" N 96°22'44" W)|C| | lmdf1|NP|Water Quality Station||Little Madeira, FL||25.174 N 80.632 W (25°10'26" N 80°37'56" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lmfs1|EA|C-MAN Station||Lake Murray SC||34.107 N 81.271 W (34°6'26" N 81°16'14" W)|E| | lmrf1|NP|Water Quality Station||Lostmans River, FL||25.554 N 81.169 W (25°33'15" N 81°10'7" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lmss1|EA|C-MAN Station||Lake Marion, SC||33.552 N 80.501 W (33°33'7" N 80°30'5" W)|E| | lndc1|O|Water Level Observation Network||9414763 - Oakland, CA||37.795 N 122.288 W (37°47'42" N 122°17'17" W)|P| | lnel1|N|C-MAN Station||Lena||28.200 N 89.100 W (28°12'0" N 89°6'0" W)|C| | lonf1|N|C-MAN Station||Long Key, FL|MARS payload|24.843 N 80.862 W (24°50'36" N 80°51'42" W)|E|FZUS52.KKEY | lopl1|LP|Oil Platform||Louisiana Offshore Oil Port, LA||28.885 N 90.024 W (28°53'7" N 90°1'28" W)|C| | lopw1|O|Water Level Observation Network||9440422 - Longview, WA||46.108 N 122.957 W (46°6'30" N 122°57'24" W)|P| | lpnm4|O|Water Level Observation Network||Alpena, MI - 9075065||45.063 N 83.428 W (45°3'48" N 83°25'42" W)|E| | lpoi1|N|C-MAN Station||Lake Pend Oreille, ID|VEEP payload|48.060 N 116.500 W (48°3'36" N 116°30'0" W)|P| |The C-Man station at LPOI1 has been disestablished. lprp4|IC|Fixed Structure Weather Station||Media Luna, La Parguera, PR||17.939 N 67.052 W (17°56'19" N 67°3'7" W)|N| | lrif1|NP|Water Quality Station||Lane River, FL ||25.284 N 80.894 W (25°17'4" N 80°53'38" W)|E| | lrkf1|NP|Water Quality Station||Little Rabbit Key, FL||24.979 N 80.826 W (24°58'46" N 80°49'33" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lscm4|N|C-MAN Station||Lake St Clair, MI|VEEP payload|42.465 N 82.755 W (42°27'54" N 82°45'18" W)|E| |This station was disestablished on 5/16/2011. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.
Station LSCM4 is transmitting intermittently due to power issues. Usable data will be posted until the station fails again. 
For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS lsnf1|NP|Water Quality Station||Long Sound, FL||25.233 N 80.457 W (25°14'0" N 80°27'27" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. ltbv3|O|Water Level Observation Network||9751401 - Lime Tree Bay, VI||17.697 N 64.753 W (17°41'48" N 64°45'12" W)|N|FZCA52.TJSJ | ltqm2|NR|NERRS Water Quality Station||Otter Point Creek, Chesapeake Bay Reserve, MD||39.451 N 76.275 W (39°27'3" N 76°16'29" W)|E| | ltrm4|O|Water Level Observation Network||9076032 - Little Rapids, MI||46.485 N 84.300 W (46°29'6" N 84°18'0" W)|E| |For area forecasts and warnings, select: Gaylord WFO luml1|L|Shorebased Tower||LUMCON Marine Center, LA||29.253 N 90.663 W (29°15'12" N 90°39'48" W)|C|FZUS54.KLIX | lwsd1|O|Water Level Observation Network||8557380 - Lewes, DE||38.782 N 75.120 W (38°46'54" N 75°7'12" W)|E|FZUS51.KPHI |


 

lwtv2|O|Water Level Observation Network||8635750 - Lewisetta, VA||37.995 N 76.465 W (37°59'42" N 76°27'54" W)|E|FZUS51.KLWX | macm4|O|Water Level Observation Network||9075080 - Mackinaw City, MI||45.778 N 84.725 W (45°46'40" N 84°43'31" W)|E| | maqt2|NR|NERRS Water Quality Station||Mission-Aransas Reserve, TX||27.980 N 97.029 W (27°58'47" N 97°1'43" W)|C| |The previous position listed on this site, 28 4' 11''N 97 12' 11''W, was in error.  The correct position is now posted on this webpage.
maxt2|NR|NERRS Weather Station||Mission-Aransas Reserve, TX||28.132 N 97.034 W (28°7'56" N 97°2'4" W)|C| |Water Quality data for this Reserve are available at....
MAQT2 -- Mission-Aransas mbla1|DI|Coastal Marine Station||Middle Bay Light, AL||30.437 N 88.012 W (30°26'12" N 88°0'42" W)|C| | mbrm4|O|Water Level Observation Network||9014090 - Mouth of the Black River, MI ||42.974 N 82.420 W (42°58'26" N 82°25'13" W)|E| | mcga1|O|Water Level Observation Network||8736897 - Coast Guard Sector Mobile, AL||30.648 N 88.058 W (30°38'53" N 88°3'29" W)|C| | mcgm4|O|Water Level Observation Network||9099018 - Marquette C.G., MI||46.545 N 87.378 W (46°32'42" N 87°22'42" W)|E|FZUS53.KMQT | mcyf1|O|Water Level Observation Network||8726667 - McKay Bay Entrance, FL||27.913 N 82.425 W (27°54'48" N 82°25'30" W)|E|FZUS52.KTBW | mcyi3|G|C-MAN Station||Michigan City, IN||41.729 N 86.913 W (41°43'43" N 86°54'45" W)|C|FZUS53.KLOT | mdrm1|N|C-MAN Station||Mt Desert Rock, ME|MARS payload|43.968 N 68.128 W (43°58'6" N 68°7'42" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike 

meem4|CE|GLOS Weather Station||Manistee Harbor, MI||44.248 N 86.346 W (44°14'51" N 86°20'44" W)|E| | mgip4|O|Water Level Observation Network||9759110 - Magueyes Islands, PR||17.972 N 67.047 W (17°58'18" N 67°2'48" W)|N|FZCA52.TJSJ | mgpt2|O|Water Level Observation Network||8770613 - Morgans Point, TX||29.682 N 94.985 W (29°40'54" N 94°59'6" W)|C|FZUS54.KHGX | mgzp4|PN|Water Level Observation Network||9759394 - Mayaguez, PR||18.218 N 67.159 W (18°13'5" N 67°9'32" W)|N| | mhpa1|DI|Coastal Marine Station||Meaher Park, AL||30.667 N 87.936 W (30°40'2" N 87°56'11" W)|C| | misc3|I|Long Island Ferry||North Middle Sound, CT||41.074 N 73.134 W (41°4'27" N 73°8'2" W)|E|FZUS51.KOKX | mism1|N|C-MAN Station||Matinicus Rock, ME|MARS payload|43.783 N 68.855 W (43°47'0" N 68°51'18" W)|E|FZUS51.KCAR FZUS51.KGYX|Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
misn6|I|Long Island Ferry||South Middle Sound, NY||41.049 N 73.121 W (41°2'56" N 73°7'16" W)|E|FZUS51.KOKX | misp4|O|Water Level Observation Network||9759938 - Mona Island, PR||18.090 N 67.939 W (18°5'24" N 67°56'19" W)|N| | mkgm4|G|C-MAN Station||Muskegon, MI||43.228 N 86.339 W (43°13'40" N 86°20'20" W)|E|FZUS53.KGRR | mlrf1|N|C-MAN Station||Molasses Reef, FL|MARS payload|25.012 N 80.376 W (25°0'42" N 80°22'35" W)|E|FZUS52.KKEY |Ocean temperature and salinity data are provided by Integrated Coral Observing Network (ICON)  mlsc1|ML|CICORE water quality station||Moss Landing, South Harbor, CA||36.807 N 121.788 W (36°48'24" N 121°47'16" W)|P| | mlto3|D|C-MAN Station||Marsh Island, OR||46.214 N 123.620 W (46°12'51" N 123°37'12" W)|P|FZUS56.KPQR | mlww3|G|C-MAN Station||Milwaukee, WI||43.046 N 87.879 W (43°2'44" N 87°52'44" W)|C|FZUS53.KMKX | mnmm4|O|Water Level Observation Network||9087088 - Menominee, MI||45.096 N 87.590 W (45°5'45" N 87°35'24" W)|C| | mnpv2|O|Water Level Observation Network||8639348 - Money Point, VA||36.778 N 76.302 W (36°46'42" N 76°18'6" W)|E|FZUS51.KAKQ |Water temperatures at this station may be higher than normally expected due to near-by industrial activity sites and the physical location of the sensor.  mokh1|O|Water Level Observation Network||1612480 - Mokuoloe, HI||21.432 N 157.790 W (21°25'55" N 157°47'24" W)|H| | mpcl1|N|C-MAN Station||Main Pass||29.400 N 88.600 W (29°24'0" N 88°36'0" W)|C| | mqtt2|O|Water Level Observation Network||8775870 - Malaquite Beach (Corpus Christi), TX||27.580 N 97.217 W (27°34'48" N 97°13'0" W)|C|FZUS54.KCRP | mrcp1|O|Water Level Observation Network||8540433 - Marcus Hook, PA||39.812 N 75.410 W (39°48'43" N 75°24'36" W)|E| | mrho1|O|Water Level Observation Network||9063079 - Marblehead, OH||41.545 N 82.732 W (41°32'42" N 82°43'54" W)|E|FZUS51.KCLE | mrka2|N|C-MAN Station||Middle Rock Light, AK|Sutron XPERT payload|61.082 N 146.662 W (61°4'54" N 146°39'42" W)|A|FZAK58.PAVW FZAK51.PAFC| mros1|O|Water Level Observation Network||8661070 - Springmaid Pier, SC||33.655 N 78.918 W (33°39'18" N 78°55'6" W)|E|FZUS52.KILM |This station is co-located with the University of South Carolina station SMBS1.


  mrsl1|Z|Shorebased Tower||Marsh Island, LA / CSI03||29.440 N 92.061 W (29°26'25" N 92°3'41" W)|C|FZUS54.KLCH | mtbf1|P|Offshore Tower||Middle Tampa Bay||27.661 N 82.594 W (27°39'40" N 82°35'38" W)|E|FZUS52.KTBW | mtkn6|O|Water Level Observation Network||8510560 - Montauk, NY||41.048 N 71.960 W (41°2'54" N 71°57'36" W)|E|FZUS51.KOKX |


 

mtyc1|O|Water Level Observation Network||9413450 - Monterey, CA||36.605 N 121.888 W (36°36'18" N 121°53'18" W)|P|FZUS56.KMTR | mukf1|NP|Water Quality Station||Murray Key, FL||25.104 N 80.942 W (25°6'15" N 80°56'32" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. mypf1|O|Water Level Observation Network||8720218 - Mayport (Bar Pilots Dock), FL||30.397 N 81.430 W (30°23'48" N 81°25'48" W)|E|FZUS52.KJAX |
  mzxc1|O|||9415102 - Martinez-Amorco CA||38.033 N 122.125 W (38°1'59" N 122°7'30" W)|| | nabm4|CE|GLOS Weather Station||Naubinway, MI||46.087 N 85.443 W (46°5'13" N 85°26'35" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS naqr1|NR|NERRS Water Quality Station||T-Wharf Bottom, Narragansett Bay Reserve, RI||41.579 N 71.321 W (41°34'44" N 71°19'17" W)|E| | naxr1|NR|NERRS Weather Station||Narragansett Bay Reserve, RI||41.639 N 71.339 W (41°38'20" N 71°20'22" W)|E| |Water Quality data for this Reserve are available at....
NAQR1 -- T-Wharf Bottom
nblp1|O|Water Level Observation Network||8548989 - Newbold, PA||40.137 N 74.750 W (40°8'13" N 74°45'0" W)|E| |For area forecasts and warnings, select: Philadelphia WFO ncht2|K|Weather Station||8770777 - Manchester, TX ||29.726 N 95.266 W (29°43'35" N 95°15'56" W)|C| | ncsc3|I|Long Island Ferry||North Central Sound, CT||41.099 N 73.147 W (41°5'58" N 73°8'49" W)|E|FZUS51.KOKX | ndbc1|N|Test station||NDBC Glider #1||36.810 N 122.320 W (36°48'37" N 122°19'11" W)|P| |Glider data are not quality controlled by NDBC.
ndbc2|N|Test station||NDBC Glider #2||27.500 N 84.500 W (27°30'0" N 84°30'0" W)|E| | neaw1|O|Water Level Observation Network||9443090 - Neah Bay, WA||48.368 N 124.617 W (48°22'6" N 124°37'0" W)|P|FZUS56.KSEW | nfbf1|P|Offshore Tower||NFB - Northwest Florida Bay, FL||25.084 N 81.096 W (25°5'4" N 81°5'45" W)|E|FZUS52.KKEY | nglt2|K|Shorebased Tower||8775283 - Port Ingleside, TX||27.822 N 97.203 W (27°49'18" N 97°12'12" W)|C| | nian6|O|Water Level Observation Network||9063012 - Niagara Intake, NY||43.077 N 79.013 W (43°4'36" N 79°0'48" W)|E| | niqs1|NR|NERRS Water Quality Station||Oyster Landing, North Inlet-Winyah Bay Reserve, SC||33.349 N 79.193 W (33°20'58" N 79°11'34" W)|E| | niws1|NR|NERRS Weather Station||North Inlet-Winyah Bay Reserve, SC||33.349 N 79.193 W (33°20'58" N 79°11'34" W)|E| |

Water Quality data for this Reserve are available at....
NIQS1 -- Oyster Landing

DBQS1 -- Debidue Creek, North Inlet


nkta2|O|Water Level Observation Network||9455760 - Nikiski, AK||60.683 N 151.398 W (60°41'0" N 151°23'54" W)|A|FZAK51.PAFC | nlec1|EB|CICORE water quality station||San Leandro Marina, CA||37.696 N 122.192 W (37°41'45" N 122°11'32" W)|P| | nlnc3|O|Water Level Observation Network||8461490 - New London, CT||41.355 N 72.087 W (41°21'18" N 72°5'12" W)|E|FZUS51.KOKX | nmta2|O|Water Level Observation Network||9468756 - Nome, Norton Sound, AK||64.500 N 165.430 W (64°30'0" N 165°25'48" W)|A|FZAK51.PAFC | noqn7|NR|NERRS Water Quality Station||Research Creek, North Carolina Reserve, NC||34.156 N 77.850 W (34°9'22" N 77°51'0" W)|E| | nosc3|I|Long Island Ferry||Northern Open Sound, CT||41.125 N 73.159 W (41°7'29" N 73°9'32" W)|E|FZUS51.KOKX | noxn7|NR|NERRS Weather Station||North Carolina Reserve, NC||34.156 N 77.851 W (34°9'20" N 77°51'3" W)|E| |

Water Quality data for this Reserve are available at....
NOQN7 -- Research Creek

ZBQN7 -- Zeke's Basin


npdw3|CE|Weather Station||Northport Pier at Death's Door WI||45.290 N 86.978 W (45°17'25" N 86°58'40" W)|C|FZUS53.KGRB | npsf1|O|Water Level Observation Network||8725110 - Naples, FL||26.130 N 81.807 W (26°7'48" N 81°48'24" W)|E|FZUS52.KMFL | nstp6|O|Water Level Observation Network||1770000 - Pago Pago||14.280 S 170.688 W (14°16'48" S 170°41'17" W)|?| |For area forecasts and warnings, select: NWS Pago Pago Site ntbc1|O|Water Level Observation Network||Santa Barbara, CA - 9411340||34.408 N 119.685 W (34°24'30" N 119°41'6" W)|P| | ntkm3|O|Water Level Observation Network||8449130 - Nantucket Island, MA||41.285 N 70.097 W (41°17'6" N 70°5'48" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

nwcl1|O|Water Level Observation Network||8761927 - New Canal, LA||30.027 N 90.113 W (30°1'37" N 90°6'47" W)|C| | nwhc3|O|Water Level Observation Network||8465705 - New Haven, CT||41.283 N 72.908 W (41°17'0" N 72°54'30" W)|E|FZUS51.KOKX | nwpo3|N|C-MAN Station||Newport, OR|MARS payload|44.613 N 124.067 W (44°36'48" N 124°4'0" W)|P|FZUS56.KPQR | nwpr1|O|Water Level Observation Network||8452660 - Newport, RI||41.505 N 71.327 W (41°30'18" N 71°19'36" W)|E| |For area forecasts and warnings, select: Boston WFO nwst2|K|Shorebased Tower||098: NWS Weather Station 1; Gulf of Mexico||27.750 N 96.768 W (27°45'0" N 96°46'6" W)|C|FZUS54.KCRP | nwwh1|O|Water Level Observation Network||1611400 - Nawiliwili, HI||21.953 N 159.355 W (21°57'11" N 159°21'18" W)|H| | obgn6|O|Water Quality Station||8311030 - Ogdensburg, NY||44.703 N 75.495 W (44°42'11" N 75°29'42" W)|E| | obla1|O|Water Level Observation Network||8737048 - Mobile State Docks, AL||30.708 N 88.043 W (30°42'29" N 88°2'35" W)|C| | ocgn4|J|Shorebased Tower||Ocean Grove, NJ||40.209 N 74.004 W (40°12'32" N 74°0'14" W)|E| | ocim2|O|Water Level Observation Network||8570283 - Ocean City Inlet, MD||38.328 N 75.092 W (38°19'41" N 75°5'31" W)|E| | ocpn7|CR|||OCP1 - Ocean Crest Pier, NC||33.908 N 78.148 W (33°54'29" N 78°8'53" W)|E| |


 

ofpn6|I|Long Island Ferry||Old Field Island, NY||40.973 N 73.083 W (40°58'23" N 73°4'59" W)|E|FZUS51.KOKX | ohbc1|O|Water Level Observation Network||9410660 - Los Angeles, CA||33.720 N 118.272 W (33°43'12" N 118°16'18" W)|P|FZUS56.KLOX | oksi2|CH|C-MAN Station||Oak ST, Chicago, IL (CPD)||41.912 N 87.624 W (41°54'44" N 87°37'25" W)|C| | okxc1|O|||9414776 - Oakland (Berth 34), CA||37.811 N 122.333 W (37°48'38" N 122°19'59" W)|| | olcn6|EA|GLOS Weather Station||Olcott Harbor, NY||43.341 N 78.719 W (43°20'26" N 78°43'10" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
olsa2|O|Water Level Observation Network||9462450 - Nokolski, AK||52.941 N 168.871 W (52°56'26" N 168°52'17" W)|A| | omhc1|O|C-MAN Station||9414769 - Oakland Middle Harbor Met, CA||37.800 N 122.330 W (37°48'0" N 122°19'48" W)|P| | oouh1|O|Water Level Observation Network||1612340 - Honolulu, HI||21.307 N 157.867 W (21°18'24" N 157°52'0" W)|H|FZHW50.PHFO | optf1|O|Water Level Observation Network||8726607 - Old Port Tampa, FL||27.858 N 82.553 W (27°51'29" N 82°33'11" W)|E| |For area forecasts and warnings, select: Tampa Bay WFO orin7|O|Water Level Observation Network||8652587 - Oregon Inlet Marina, NC||35.795 N 75.548 W (35°47'42" N 75°32'54" W)|E|FZUS52.KMHX |
  osgn6|O|Water Level Observation Network||9052030 - Oswego, NY||43.463 N 76.512 W (43°27'48" N 76°30'42" W)|E|FZUS51.KBUF | ostf1|N|Test station||Stennis Test Facility|ARES 4.4 payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. otnm4|CE|GLOS Weather Station||Ontonagon, MI||46.874 N 89.329 W (46°52'25" N 89°19'45" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS ovia2|O|Water Level Observation Network||9455500 - Seldovia, AK||59.440 N 151.720 W (59°26'24" N 151°43'12" W)|A| | owqo1|NR|NERRS Water Quality Station||Lower Estuary, Old Woman Creek Reserve, OH||41.382 N 82.514 W (41°22'55" N 82°30'51" W)|E| | owxo1|NR|NERRS Weather Station||Old Woman Creek, OH||41.378 N 82.508 W (41°22'40" N 82°30'29" W)|E| |Water Quality data for this Reserve are available at....
OWQO1 -- OL pacf1|O|Water Level Observation Network||8729108 - Panama City, FL||30.152 N 85.667 W (30°9'7" N 85°40'1" W)|C| | pact2|K|Shorebased Tower||8775792 - Packery Channel, TX||27.633 N 97.237 W (27°37'59" N 97°14'13" W)|C| | pbfw1|NR|NERRS Weather Station||Padilla Bay Reserve, WA||48.464 N 122.468 W (48°27'51" N 122°28'5" W)|P| |

Water Quality data for this Reserve are available at....
PBLW1 -- Joe Leary Slough

BVQW1 -- Bayview Channel

pblw1|NR|NERRS Water Quality Station||Joe Leary Slough, Padilla Bay Reserve, WA||48.556 N 122.530 W (48°33'23" N 122°31'47" W)|P| | pbpa2|AK|Weather Station||Point Bishop, AK||58.203 N 134.148 W (58°12'9" N 134°8'52" W)|A| |For area forecasts and warnings, select: Juneau WFO pcbf1|O|Water Level Observation Network||8729210 - Panama City Beach, FL||30.213 N 85.880 W (30°12'48" N 85°52'48" W)|E|FZUS52.KTAE | pcgt2|K|Weather Station||8779748 - South Padre Island CGS, TX ||26.077 N 97.177 W (26°4'36" N 97°10'36" W)|C| | pclf1|O|Water Level Observation Network||8729840 - Pensacola, FL||30.403 N 87.212 W (30°24'12" N 87°12'42" W)|C|FZUS54.KMOB | pclm4|CE|GLOS Weather Station||Portage Canal, MI||47.276 N 88.528 W (47°16'32" N 88°31'40" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS pcnt2|K|Shorebased Tower||8773701 - Matagorda Bay; Port O'Connor, TX||28.452 N 96.388 W (28°27'6" N 96°23'18" W)|C| | pcoc1|O|Water Level Observation Network||9415144 - Port Chicago, CA||38.057 N 122.038 W (38°3'24" N 122°2'18" W)|P|FZUS56.KMTR | pgbp7|O|Water Level Observation Network||1631428 - Pago Bay, Guam||13.428 N 144.797 E (13°25'41" N 144°47'49" E)|| | phbp1|O|Water Level Observation Network||8545240 - Philadelphia, PA||39.933 N 75.142 W (39°56'0" N 75°8'30" W)|E|FZUS51.KPHI | pila2|N|C-MAN Station||Pilot Rock, AK|MARS payload|59.742 N 149.470 W (59°44'30" N 149°28'12" W)|A|FZAK58.PAVW FZAK51.PAFC|

pill1|O|Water Level Observation Network||8760721 - Pilot Town, LA||29.178 N 89.258 W (29°10'42" N 89°15'30" W)|C| | pilm4|N|C-MAN Station||Passage Island, MI|MARS payload|48.223 N 88.367 W (48°13'24" N 88°22'0" W)|E| | For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS

pkyf1|NP|Water Quality Station||Peterson Key, FL||24.917 N 80.746 W (24°55'0" N 80°44'46" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. plsf1|N|C-MAN Station||Pulaski Shoals Light, FL|ARES payload|24.693 N 82.773 W (24°41'36" N 82°46'23" W)|E|FZUS52.KKEY |Station PLSF1 stopped transmitting on 07/10/2012. This station will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in themaintenance report.
Replacement for the failed Dry Tortugas station DRYF1.

plsp4|PN|Water Level Observation Network||9758053 - Penuelas, PR||17.973 N 66.762 W (17°58'23" N 66°45'43" W)|A| | plxa2|O|Water Level Observation Network||9451054 - Port Alexander, AK||56.247 N 134.647 W (56°14'48" N 134°38'48" W)|A| | pmaf1|O|Water Level Observation Network||8726384 - Port Manatee, FL||27.637 N 82.563 W (27°38'13" N 82°33'47" W)|E| |For area forecasts and warnings, select: Tampa Bay WFO pngw3|CE|GLOS Weather Station||Port Wing, WI||46.792 N 91.386 W (46°47'32" N 91°23'10" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS pnlm4|O|Water Level Observation Network||9087096 - Port Inland, MI||45.970 N 85.871 W (45°58'12" N 85°52'16" W)|E|FZUS53.KAPX | pnlm6|O|Water Level Observation Network||8741533 - Pascagoula NOAA Lab, MS||30.358 N 88.567 W (30°21'29" N 88°34'1" W)|C| | poro3|O|Water Level Observation Network||9431647 - Port Orford, OR||42.740 N 124.497 W (42°44'24" N 124°29'48" W)|P|FZUS56.KMFR | port2|K|Shorebased Tower||8770475 - Port Arthur, TX||29.867 N 93.930 W (29°52'1" N 93°55'48" W)|C| | pota2|N|C-MAN Station||Potato Point, AK|Sutron XPERT payload|61.060 N 146.700 W (61°3'36" N 146°42'0" W)|A|FZAK58.PAVW FZAK51.PAFC| ppta1|DI|Water Quality Station||Perdido Pass, AL||30.279 N 87.556 W (30°16'45" N 87°33'22" W)|C| | pptm2|O|Water Level Observation Network||8578240 - Piney Point, MD||38.133 N 76.533 W (38°7'59" N 76°31'59" W)|E| |For area forecasts and warnings, select: Baltimore-Washington WFO ppxc1|O|||9414847 - Richmond (Point Potrero), CA||37.906 N 122.365 W (37°54'20" N 122°21'54" W)|| | prda2|O|Water Level Observation Network||9497645 - Prudhoe Bay, AK||70.400 N 148.527 W (70°24'0" N 148°31'36" W)|A|FZAK51.PAFC | prim4|CE|GLOS Weather Station||Presque Isle Light, MI||45.356 N 83.492 W (45°21'22" N 83°29'31" W)|E| | prta2|AK|Weather Station||Point Retreat, AK||58.412 N 134.953 W (58°24'42" N 134°57'11" W)|A| |For area forecasts and warnings, select: Juneau WFO prto3|CM|Water Quality Station||SATURN River Station #06 at Portland||45.519 N 122.667 W (45°31'7" N 122°40'0" W)|P| | pryc1|O|Water Level Observation Network||9415020 - Point Reyes, CA||37.997 N 122.975 W (37°59'48" N 122°58'30" W)|P|FZUS56.KMTR | psbc1|O|||9415115 - Pittsburg (Suisun Bay), CA||38.042 N 121.887 W (38°2'30" N 121°53'12" W)|| | psbm1|O|Water Level Observation Network||8410140 - Eastport, ME||44.903 N 66.985 W (44°54'12" N 66°59'6" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  pscm4|CE|GLOS Weather Station||Port Sanilac, MI||43.422 N 82.536 W (43°25'21" N 82°32'9" W)|E| | pslc1|O|Water Level Observation Network||9412110 - Port San Luis, CA||35.177 N 120.760 W (35°10'36" N 120°45'36" W)|P|FZUS56.KMTR | pstl1|O|Water Level Observation Network||8760922 - Pilot's Station East, SW Pass, LA||28.932 N 89.407 W (28°55'55" N 89°24'25" W)|C| |For area forecasts and warnings, select: Slidell WFO pstn6|O|Water Level Observation Network||9063028 - Sturgeon Point, NY||42.691 N 79.047 W (42°41'29" N 79°2'50" W)|E| | ptac1|N|C-MAN Station||Point Arena, CA|MARS payload|38.955 N 123.740 W (38°57'18" N 123°44'24" W)|P|FZUS56.KMTR |
  ptat2|N|C-MAN Station||Port Aransas, TX|MARS payload|27.828 N 97.050 W (27°49'42" N 97°3'0" W)|C|FZUS54.KCRP |
ptaw1|O|Water Level Observation Network||9444090 - Port Angeles, WA||48.125 N 123.440 W (48°7'30" N 123°26'24" W)|P|FZUS56.KSEW | ptbm6|O|Water Level Observation Network||8741003 - Petit Bois Island, MS||30.213 N 88.500 W (30°12'47" N 88°30'0" W)|C| | ptcr1|O|Water Level Observation Network||8452951 - Potter Cove, Prudence Island, RI||41.637 N 71.339 W (41°38'14" N 71°20'21" W)|E| |For area forecasts and warnings, select: Boston WFO ptgc1|N|C-MAN Station||Point Arguello, CA|MARS payload|34.577 N 120.648 W (34°34'36" N 120°38'54" W)|P|FZUS56.KLOX |
ptim4|O|Water Level Observation Network||9099004 - Point Iroquois, MI||46.485 N 84.632 W (46°29'6" N 84°37'54" W)|E|FZUS53.KAPX | ptit2|O|Water Level Observation Network||8779770 - Port Isabel, TX||26.060 N 97.215 W (26°3'36" N 97°12'54" W)|C|FZUS54.KBRO | ptjn6|I|Long Island Ferry||Port Jefferson, NY||40.948 N 73.070 W (40°56'52" N 73°4'12" W)|E|FZUS51.KOKX | ptrf1|P|Shorebased Tower||PAS -Port Richey, FL||28.285 N 82.733 W (28°17'6" N 82°43'57" W)|E|FZUS52.KTBW | ptww1|O|Water Level Observation Network||9444900 - Port Townsend, WA||48.112 N 122.758 W (48°6'42" N 122°45'30" W)|P|FZUS56.KSEW | pvgf1|IC|Fixed Structure Weather Station||Port Everglades Channel, FL||26.092 N 80.109 W (26°5'33" N 80°6'32" W)|E| | pwaw3|CE|GLOS Weather Station||Port Washington, WI||43.388 N 87.868 W (43°23'15" N 87°52'4" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS pxoc1|O|||9414311 - San Francisco (Pier 1), CA||37.798 N 122.393 W (37°47'52" N 122°23'34" W)|P| | qptr1|O|Water Level Observation Network||8454049 - Quonset Point, RI||41.585 N 71.408 W (41°35'6" N 71°24'30" W)|E| |For area forecasts and warnings, select: Boston WFO rarm6|O|Water Level Observation Network||8741094 - Range A rear, Pascagoula, MS||30.343 N 88.512 W (30°20'35" N 88°30'43" W)|C| | rckm4|O|Water Level Observation Network||9076024 - Rock Cut, MI||46.265 N 84.192 W (46°15'54" N 84°11'30" W)|E|FZUS53.KAPX | rcmc1|O|Water Level Observation Network||9414863 - Richmond, CA||37.928 N 122.400 W (37°55'42" N 122°24'0" W)|P|FZUS56.KMTR | rcpt2|O|Water Level Observation Network||8774770 - Rockport, TX||28.022 N 97.047 W (28°1'19" N 97°2'49" W)|C| | rcrn6|O|Water Level Observation Network||9052058 - Rochester, NY||43.268 N 77.625 W (43°16'6" N 77°37'30" W)|E| | rdda2|O|Water Level Observation Network||9491094 - Red Dog Dock, AK||67.577 N 164.065 W (67°34'37" N 164°3'54" W)|A| |For area forecasts and warnings, select: Alaska Marine Forecasts rdyd1|O|Water Level Observation Network||8551910 - Reedy Point, DE||39.558 N 75.573 W (39°33'30" N 75°34'24" W)|E|FZUS51.KPHI | rkqf1|NR|NERRS Water Quality Station||Lower Henderson, Rockery Bay Reserve, FL||26.026 N 81.733 W (26°1'33" N 81°44'0" W)|E| | rkxf1|NR|NERRS Weather Station||Rookery Bay Reserve, FL||26.050 N 81.701 W (26°2'59" N 81°42'4" W)|E| |Water Quality data for this Reserve are available at....
RKQF1 -- Lower Henderson
rlot2|K|Shorebased Tower||8770971 - Rollover Pass, TX||29.515 N 94.513 W (29°30'54" N 94°30'48" W)|C| | roam4|N|C-MAN Station||Rock of Ages, MI|MARS payload|47.867 N 89.313 W (47°52'0" N 89°18'48" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS robn4|O|Water Level Observation Network||8530973 - Robins Reef, NJ||40.657 N 74.065 W (40°39'25" N 74°3'53" W)|E| | rplv2|O|Water Level Observation Network||8632837 - Rappahannock Light, VA||37.538 N 76.015 W (37°32'18" N 76°0'54" W)|E|FZUS51.KAKQ | rprn6|EA|GLOS Weather Station||Rochester, NY||43.258 N 77.592 W (43°15'27" N 77°35'32" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS rsjt2|K|Shorebased Tower||8777812 - Rincon del San Jose; Potrero Lopeno SW, TX||26.801 N 97.483 W (26°48'4" N 97°28'59" W)|C| | rtat2|K|Shorebased Tower||8775237 - Port Aransas, TX||27.840 N 97.073 W (27°50'23" N 97°4'22" W)|C| | rtot2|K|Offshore Tower||100: RTNS Offshore, TX||27.753 N 96.967 W (27°45'9" N 96°58'2" W)|C|FZUS54.KCRP | rtyc1|O|Water Level Observation Network||9414523 - Redwood City, CA||37.507 N 122.210 W (37°30'24" N 122°12'36" W)|P|FZUS56.KMTR | sacv4|EM|Weather Station||Sacrifice Island, Mexico|Sutron XPERT payload|19.174 N 96.093 W (19°10'27" N 96°5'34" W)|C| | sanf1|N|C-MAN Station||Sand Key, FL|MARS payload|24.454 N 81.877 W (24°27'14" N 81°52'39" W)|E|FZUS52.KKEY |Station SANF1 is transmitting intermittent data. This station will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. sapf1|O|Water Level Observation Network||8726520 - St. Petersburg, FL||27.760 N 82.627 W (27°45'36" N 82°37'36" W)|E|FZUS52.KTBW | saqg1|NR|NERRS Water Quality Station||Lower Duplin, Sapelo Island Reserve, GA||31.418 N 81.296 W (31°25'4" N 81°17'46" W)|E| | sauf1|N|C-MAN Station||St. Augustine, FL|MARS payload|29.857 N 81.265 W (29°51'24" N 81°15'54" W)|E|FZUS52.KJAX |Station SAUF1 stopped transmitting on 06/12/2012. This station will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. saxg1|NR|NERRS Weather Station||Sapelo Island Reserve, GA||31.418 N 81.295 W (31°25'4" N 81°17'43" W)|E| |Water Quality data for this Reserve are available at....
SAQG1 -- Lower Duplin sbeo3|O|Water Level Observation Network||9435380 - South Beach, OR||44.625 N 124.043 W (44°37'30" N 124°2'36" W)|P|FZUS56.KPQR | sbio1|N|C-MAN Station||South Bass Island, OH|MARS payload|41.628 N 82.842 W (41°37'42" N 82°50'30" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
sblf1|O|Water Level Observation Network||8726673 - Seabulk, Tampa, FL||27.923 N 82.445 W (27°55'23" N 82°26'42" W)|E| | sblm4|CE|GLOS Weather Station||Saginaw Bay Light #1, MI||43.806 N 83.719 W (43°48'21" N 83°43'8" W)|E| | sbpt2|O|Water Level Observation Network||8770570 - Sabine Pass North, TX||29.730 N 93.870 W (29°43'48" N 93°52'12" W)|C|FZUS54.KLCH | scis1|O|Water Level Observation Network||8664941 - South Capers Island, SC||32.857 N 79.707 W (32°51'24" N 79°42'24" W)|E| |For area forecasts and warnings, select: Charleston WFO


  scld1|NR|NERRS Water Quality Station||Scotton Landing, Delaware Reserve, DE||39.085 N 75.461 W (39°5'6" N 75°27'38" W)|E| | scqc1|NR|NERRS Water Quality Station||China Camp, San Francisco Bay Reserve, CA||38.001 N 122.460 W (38°0'5" N 122°27'37" W)|P| | scsn6|I|Long Island Ferry||South Central Sound, NY||41.024 N 73.108 W (41°1'25" N 73°6'29" W)|E|FZUS51.KOKX | sdbc1|O|Water Level Observation Network||9410170 - San Diego, CA||32.713 N 117.173 W (32°42'48" N 117°10'24" W)|P|FZUS56.KSGX | sdhn4|O|Water Level Observation Network||8531680 - Sandy Hook, NJ||40.467 N 74.010 W (40°28'0" N 74°0'36" W)|E|FZUS51.KPHI |


 

sdia2|AK|Weather Station||South Douglas, AK||58.277 N 134.389 W (58°16'38" N 134°23'21" W)|A| |For area forecasts and warnings, select: Juneau WFO sdrt2|K|Shorebased Tower||8773037 - Seadrift, TX||28.407 N 96.712 W (28°24'26" N 96°42'44" W)|C| | secg1|H|C-MAN Station||U.S. Navy Tower R4 GA||30.800 N 80.316 W (30°48'0" N 80°18'58" W)|E|FZUS52.KJAX FZNT23.KNHC|
  sefo3|CM|Water Quality Station||SATURN Estuary Station #04 at Mott Basin||46.204 N 123.759 W (46°12'13" N 123°45'31" W)|P| | seqa2|NR|NERRS Water Quality Station||Katchemak Bay near Seldovia, AK||59.441 N 151.719 W (59°26'28" N 151°43'7" W)|A| | seto3|CM|Water Quality Station||SATURN Estuary Station #03||46.200 N 123.940 W (46°11'59" N 123°56'24" W)|P| | sfxc1|NR|NERRS Weather Station||San Francisco Bay Reserve, CA||38.223 N 122.026 W (38°13'21" N 122°1'32" W)|P| |Water Quality data for this Reserve are available at....
SCQC1 -- China Camp
sgnw3|N|C-MAN Station||Sheboygan, WI|Sutron XPERT payload|43.750 N 87.692 W (43°45'0" N 87°41'30" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS sgof1|N|C-MAN Station||Tyndall AFB Tower C (N4), FL|MARS payload|29.407 N 84.863 W (29°24'24" N 84°51'48" W)|E|FZUS52.KTAE |Station SGOF1 is transmitting intermittently since 06/30/2012. This C-Man will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. sgrn4|J|Shorebased Tower||Sea Girt, NJ||40.120 N 74.030 W (40°7'12" N 74°1'48" W)|E|FZUS51.KOKX |


 

shbl1|O|Water Level Observation Network||8761305 - Shell Beach, LA||29.868 N 89.673 W (29°52'5" N 89°40'23" W)|C| | shpf1|P|Shorebased Tower||SHP - Shell Point, FL||30.060 N 84.291 W (30°3'36" N 84°17'26" W)|E|FZUS52.KTAE | sipm6|Z|Shorebased Tower||Ship Island Pass, MS / CSI13||30.267 N 89.017 W (30°16'0" N 89°1'0" W)|C|FZUS54.KLIX | sisa2|AK|Weather Station||Sisters Island, AK||58.171 N 135.256 W (58°10'15" N 135°15'23" W)|A| |For area forecasts and warnings, select: Juneau WFO sisw1|N|C-MAN Station||Smith Island, WA|MARS payload|48.318 N 122.843 W (48°19'6" N 122°50'36" W)|P|FZUS56.KSEW |
  sjlf1|N|C-MAN Station||St. John's Light||30.400 N 81.400 W (30°24'0" N 81°24'0" W)|E| | sjnp4|O|Water Level Observation Network||9755371 - San Juan, PR||18.462 N 66.117 W (18°27'42" N 66°7'0" W)|N|FZCA52.TJSJ | sjom4|CE|GLOS Weather Station||St. Joseph, MI||42.099 N 86.494 W (42°5'56" N 86°29'39" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS sjsn4|O|Water Level Observation Network||8537121 - Ship John Shoal, NJ||39.305 N 75.375 W (39°18'17" N 75°22'30" W)|E| |For area forecasts and warnings, select: Philadelphia WFO skmg1|S|C-MAN Station||U.S. Navy Tower M2R6 GA||31.534 N 80.236 W (31°32'1" N 80°14'9" W)|E|FZUS52.KCHS |
  skta2|O|Water Level Observation Network||9452400 - Skagway, AK||59.450 N 135.327 W (59°27'0" N 135°19'36" W)|A| | slim2|O|Water Level Observation Network||8577330 - Solomons Island, MD||38.317 N 76.450 W (38°19'0" N 76°27'0" W)|E|FZUS51.KLWX | slpl1|Z|Shorebased Tower||Salt Point, LA / CSI14||29.517 N 91.550 W (29°31'0" N 91°33'0" W)|C|FZUS54.KLCH | slvm5|CE|GLOS Weather Station||Silver Bay, MN||47.269 N 91.252 W (47°16'8" N 91°15'6" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS smbs1|NS|Coastal Marine Station||Springmaid pier, SC||33.655 N 78.918 W (33°39'18" N 78°55'6" W)|E| |This station is co-located with the NOS station MROS1.
smkf1|N|C-MAN Station||Sombrero Key, FL|MARS payload|24.628 N 81.111 W (24°37'39" N 81°6'40" W)|E|FZUS52.KKEY | smoc1|O|Water Level Observation Network||9410840 - Santa Monica, CA||34.008 N 118.500 W (34°0'30" N 118°30'0" W)|P|FZUS56.KLOX |As of 1800 UTC, January 22, 2010; observations for this location will be under Station ID ICAC1. snda2|O|Water Level Observation Network||9459450 - Sand Point, AK||55.337 N 160.502 W (55°20'12" N 160°30'6" W)|A| | sndp5|O|Water Level Observation Network||1619910 - Sand Island, Midway Islands||28.212 N 177.360 W (28°12'42" N 177°21'36" W)|?| | snsn7|A|Weather Station||8659897 - Sunset Beach, NC||33.865 N 78.507 W (33°51'54" N 78°30'24" W)|E|FZUS52.KILM |
  soqo3|NR|NERRS Water Quality Station||Valino Island, South Slough Reserve, OR||43.317 N 124.322 W (43°19'2" N 124°19'18" W)|P| |

Water Quality data for this Reserve are available at...

CHQO3 -- Winchester Arm

sosn6|I|Long Island Ferry||Southern Open Sound, NY||40.998 N 73.095 W (40°59'54" N 73°5'42" W)|E|FZUS51.KOKX | spag1|S|C-MAN Station||U.S. Navy Tower R2 GA||31.375 N 80.567 W (31°22'30" N 80°34'1" W)|E|FZUS52.KCHS |
  spgf1|N|C-MAN Station||Settlement Point, GBI|MARS payload|26.704 N 78.994 W (26°42'16" N 78°59'40" W)|E|FZUS52.KMFL | spll1|Z|Shorebased Tower||South Timbalier Block 52, LA / CSI06||28.867 N 90.483 W (28°52'0" N 90°29'0" W)|C|FZUS54.KLIX | sptm4|CE|GLOS Weather Station||Sturgeon Point Light, MI||44.713 N 83.273 W (44°42'47" N 83°16'23" W)|E| | srbv3|IC|Fixed Structure Weather Station||Salt River Bay, St. Croix, U.S. Virgin Islands||17.784 N 64.762 W (17°47'2" N 64°45'42" W)|N| | srfw1|CM|Water Quality Station||SATURN River Station #05||46.184 N 123.188 W (46°11'4" N 123°11'15" W)|P| | srst2|N|C-MAN Station||Sabine Pass, TX|MARS payload|29.683 N 94.033 W (29°41'0" N 94°2'0" W)|C|FZUS54.KLCH FZUS54.KHGX| ssbn7|CR|||Sunset Beach Nearshore Waves||33.842 N 78.476 W (33°50'31" N 78°28'34" W)|E| |Right whales are active off NC. Speed restrictions of 10 knots apply to vessels 65 feet or greater within the vicinity of this station. To learn more about right whales and rules protecting them, go to: http://www.nmfs.noaa.gov/pr/shipstrike/ stdm4|N|C-MAN Station||Stannard Rock, MI|Sutron XPERT payload|47.183 N 87.225 W (47°11'0" N 87°13'30" W)|E| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS

supn6|N|C-MAN Station||Superior Shoals, NY|VEEP payload|44.467 N 75.800 W (44°28'0" N 75°48'0" W)|E|FZUS61.KBUF |This station has been disestablished as of 11/16/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. svls1|N|C-MAN Station||Savannah Light, GA|DACT payload|31.950 N 80.680 W (31°57'0" N 80°40'48" W)|E| |Savannah Light was destroyed by a collision with the 800-foot container ship Neptune Jade on the evening of November 27, 1996. svnm4|G|C-MAN Station||South Haven, MI||42.401 N 86.289 W (42°24'5" N 86°17'20" W)|E|FZUS53.KGRR | swla2|O|Water Level Observation Network||9455090- Seward, AK||60.120 N 149.427 W (60°7'12" N 149°25'36" W)|A| | swpm4|O|Water Level Observation Network||9076070 - S.W. Pier, MI||46.502 N 84.373 W (46°30'6" N 84°22'24" W)|E|FZUS53.KAPX | swpv2|O|Water Level Observation Network||8638610 - Sewells Point, VA||36.947 N 76.330 W (36°56'48" N 76°19'48" W)|E|FZUS51.KAKQ | sxhw3|CE|GLOS Weather Station||Saxon Harbor, WI||46.563 N 90.440 W (46°33'45" N 90°26'24" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS syww3|CE|Weather Station||Yacht Works Sister Bay WI||45.202 N 87.121 W (45°12'8" N 87°7'15" W)|C|FZUS53.KGRB |NOTE: WINDS FREQUENTLY DROP TO ZERO DUE TO WINTER FREEZING. taml1|L|Shorebased Tower||Tambour Bay, LA||29.188 N 90.665 W (29°11'15" N 90°39'55" W)|C|FZUS54.KLIX | tano3|CM|Water Quality Station||Tansy Point, OR||46.189 N 123.919 W (46°11'20" N 123°55'10" W)|P| | taqt2|K|Weather Station||8775296 - Texas State Aquarium, TX||27.812 N 97.390 W (27°48'42" N 97°23'24" W)|C| | tarf1|P|Shorebased Tower||TAS - Tarpon Springs, FL||28.156 N 82.758 W (28°9'20" N 82°45'29" W)|E|FZUS52.KTBW | tawm4|CE|GLOS Weather Station||Tawas City, MI||44.256 N 83.443 W (44°15'22" N 83°26'35" W)|E| | tcbm2|O|Water Level Observation Network||8573364 - Tolchester Beach, MD||39.213 N 76.245 W (39°12'48" N 76°14'42" W)|E|FZUS51.KLWX | tcmw1|O|Water Level Observation Network||9446482 - Tacoma Met, WA||47.276 N 122.418 W (47°16'34" N 122°25'5" W)|P| | tcnw1|O|Water Level Observation Network||9446484 - Tacoma, WA||47.267 N 122.413 W (47°16'0" N 122°24'48" W)|P|FZUS56.KSEW | tcvf1|NP|Water Quality Station||Trout Cove, FL||25.209 N 80.533 W (25°12'34" N 80°32'0" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. tdpc1|HU|CICORE water quality station||Trinidad Pier Trinidad, CA||41.055 N 124.147 W (41°3'19" N 124°8'50" W)|P| | tesl1|O|C-MAN Station||Tesoro Marine Terminal - 8764044 - Berwick, LA||29.667 N 91.237 W (29°40'0" N 91°14'12" W)|C| | tfblk|IM|Buoy||10.0 nm WNW on Blakknes, Iceland||65.698 N 24.778 W (65°41'52" N 24°46'41" W)|?| | thin6|N|C-MAN Station||Thousand I. Brdg., NY|MARS payload|44.300 N 75.983 W (44°18'0" N 75°59'0" W)|E|FZUS61.KBUF |This station has been disestablished as of 9/17/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. thlo1|G|C-MAN Station||Toledo Light No. 2 OH||41.826 N 83.194 W (41°49'32" N 83°11'37" W)|E|FZUS61.KCLE | thro1|O|Water Level Observation Network||9063085 - Toledo, OH||41.693 N 83.472 W (41°41'36" N 83°28'18" W)|E|FZUS51.KCLE | tibc1|SF|Environmental Monitoring Station||Tiburon Pier, San Francisco Bay, CA||37.891 N 122.447 W (37°53'29" N 122°26'48" W)|P| |For area forecasts and warnings, select: San Francisco/Monterey WFO tiqc1|NR|NERRS Water Quality Station||Oneonta Slough, Tijuana River Reserve, CA||32.568 N 117.131 W (32°34'5" N 117°7'52" W)|P| | tixc1|NR|NERRS Weather Station||Tijuana River Reserve, CA||32.574 N 117.127 W (32°34'28" N 117°7'37" W)|P| |Water Quality data for this Reserve are available at....
TIQC1 -- Oneonta Slough
tkea2|MA|Fixed Structure Weather Station||Tenakee Springs, AK||57.779 N 135.219 W (57°46'45" N 135°13'9" W)|A| | tlbo3|O|Water Level Observation Network||9437540 - Garibaldi, Tillamook Bay, OR||45.555 N 123.912 W (45°33'18" N 123°54'43" W)|P| |For area forecasts and warnings, select: Portland WFO tnso3|CM|Water Quality Station||Tenasillahe Island USFW Dock, OR||46.238 N 123.468 W (46°14'15" N 123°28'6" W)|P| | tokw1|O|Water Level Observation Network||9440910 - Toke Point, WA||46.708 N 123.965 W (46°42'30" N 123°57'54" W)|P|FZUS56.KPQR | tpaf1|O|Water Level Observation Network||8726694 - TPA Cruise Terminal 2, Tampa, FL||27.933 N 82.433 W (27°55'59" N 82°25'59" W)|E| | tpbn4|O|Water Level Observation Network||8538886 - Tacony-Palmyra Bridge, NJ||40.012 N 75.042 W (40°0'42" N 75°2'30" W)|E| | tpef1|NP|Water Quality Station||Tarpon Bay East, FL||25.408 N 80.964 W (25°24'30" N 80°57'52" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. tplm2|N|C-MAN Station||Thomas Point, MD|MARS payload|38.898 N 76.437 W (38°53'54" N 76°26'12" W)|E|FZUS51.KLWX | trbl1|L|Shorebased Tower||Terrebonne Bay, LA||29.167 N 90.583 W (29°10'0" N 90°35'0" W)|C|FZUS54.KLIX | trdf1|O|Water Level Observation Network||8721604 - Trident Pier, FL||28.415 N 80.593 W (28°24'54" N 80°35'36" W)|E|FZUS52.KMLB |
  trrf1|NP|Water Quality Station||Taylor River, FL||25.223 N 80.653 W (25°13'23" N 80°39'11" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. tshf1|O|Water Level Observation Network||8726667 - East Bay Causeway, FL||27.928 N 82.425 W (27°55'42" N 82°25'30" W)|E| | ttiw1|N|C-MAN Station||Tatoosh Island, WA|DACT payload|48.392 N 124.735 W (48°23'30" N 124°44'6" W)|P|FZUS56.KSEW | txpt2|O|Water Level Observation Network||Texas Point, TX - 8770822||29.689 N 93.842 W (29°41'21" N 93°50'31" W)|C| | tybg1|S|C-MAN Station||U.S. Navy Tower R8 GA||31.633 N 79.925 W (31°37'59" N 79°55'29" W)|E|FZUS52.KCHS |
  ulam6|O|Water Level Observation Network||8741041 - Dock E. Port of Pascagoula, MS||30.348 N 88.505 W (30°20'53" N 88°30'18" W)|C| | unla2|O|Water Level Observation Network||9462620- Unalaska, AK||53.879 N 166.540 W (53°52'45" N 166°32'25" W)|A| | vakf1|O|Water Level Observation Network||8723214 - Virginia Key, FL||25.732 N 80.162 W (25°43'54" N 80°9'42" W)|E|FZUS52.KMFL | vcaf1|O|Water Level Observation Network||8723970 - Vaca Key, FL||24.712 N 81.105 W (24°42'42" N 81°6'18" W)|E|FZUS52.KKEY | vcat2|K|||8773259 - Port Lavaca, TX ||28.640 N 96.595 W (28°38'24" N 96°35'42" W)|C| | vdza2|O|Water Level Observation Network||9454240 - Valdez, AK||61.125 N 146.362 W (61°7'30" N 146°21'42" W)|A| | venf1|N|C-MAN Station||Venice, FL|ARES payload|27.070 N 82.450 W (27°4'12" N 82°27'0" W)|E|FZUS52.KTBW | verv4|EM|Weather Station||Veracruz Harbor, Mexico|Sutron XPERT payload|19.202 N 96.113 W (19°12'6" N 96°6'46" W)|C| | vmsv2|VM|Marine Observation Station||VIMS Pier||37.246 N 76.500 W (37°14'45" N 76°30'0" W)|E| | vqsp4|PN|Water Level Observation Network||9752619 - Isabel Segunda, Vieques, PR||18.153 N 65.444 W (18°9'11" N 65°26'38" W)|N| | wahv2|O|Water Level Observation Network||8631044 - Wachapreague, VA||37.607 N 75.687 W (37°36'24" N 75°41'12" W)|E|FZUS51.KAKQ |


 

wakp8|O|Water Level Observation Network||1890000 - Wake Island||19.290 N 166.618 E (19°17'24" N 166°37'6" E)|?| | waqm3|NR|NERRS Water Quality Station||Menauhant, Waquoit Bay Reserve, MA||41.552 N 70.549 W (41°33'9" N 70°32'55" W)|E| | wasd2|O|Water Level Observation Network||8594900 - Washington, DC||38.870 N 77.020 W (38°52'12" N 77°1'12" W)|E|FZUS51.KLWX | wats1|EA|Weather Station||Lake Wateree, SC||34.335 N 80.702 W (34°20'7" N 80°42'8" W)|E| | wavm6|O|Water Level Observation Network||8747766 - Waveland, MS||30.282 N 89.367 W (30°16'54" N 89°22'0" W)|C|FZUS54.KLIX | waxm3|NR|NERRS Weather Station||Waquoit Bay Reserve, MA||41.582 N 70.525 W (41°34'54" N 70°31'30" W)|E| |

Water Quality data for this Reserve are available at....
WAQM3 -- Wacquoit Bay (Not operational)

wdel1|SH|Offshore Tower||Shell West Delta 143||28.662 N 89.551 W (28°39'43" N 89°33'4" W)|C| | wdsv2|O|Water Level Observation Network||8638614 - Willoughby Deguassing Station, VA||36.982 N 76.322 W (36°58'55" N 76°19'19" W)|E| | wdyo3|CM|Water Quality Station||Woody Island, OR||46.252 N 123.534 W (46°15'8" N 123°32'3" W)|P| | welm1|O|Water Level Observation Network||8419317 - Wells, ME||43.320 N 70.563 W (43°19'12" N 70°33'47" W)|E| |For area forecasts and warnings, select: Gray/Portland WFO

Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
weqm1|NR|NERRS Water Quality Station||Skinner Mill, Wells Reserve, ME||43.345 N 70.549 W (43°20'41" N 70°32'57" W)|E| | wexm1|NR|NERRS Weather Station||Wells Reserve, ME||43.338 N 70.550 W (43°20'15" N 70°33'0" W)|E| |Water Quality data for this Reserve are available at....
WEQM1 -- Skinner Mill
wfpm4|CE|GLOS Weather Station||Whitefish Point, MI||46.762 N 84.966 W (46°45'43" N 84°57'58" W)|E| | whoi2|WH|2.4-meter discus buoy||Woods Hole Wave Test Station #2||41.339 N 70.555 W (41°20'19" N 70°33'17" W)|E| | whri2|CE|GLOS Weather Station||Waukegan Harbor, IL||42.361 N 87.813 W (42°21'38" N 87°48'48" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS wiwf1|NP|Water Quality Station||Willy Willy, FL||25.619 N 81.044 W (25°37'8" N 81°2'39" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. wkqa1|NR|NERRS Water Quality Station||Fish River, Weeks Bay Reserve, AL||30.416 N 87.823 W (30°24'58" N 87°49'22" W)|C| | wkxa1|NR|NERRS Weather Station||Weeks Bay Reserve, AL||30.421 N 87.829 W (30°25'16" N 87°49'43" W)|C| |Water Quality data for this Reserve are available at....
WKQA1 -- Fish River
wndv2|O|Water Level Observation Network||8636580 - Windmill Point, VA||37.615 N 76.290 W (37°36'54" N 76°17'24" W)|E|FZUS51.KAKQ | wnem4|O|Water Level Observation Network||9076027 - West Neebish, MI||46.283 N 84.205 W (46°16'59" N 84°12'18" W)|E| | wplf1|NP|Water Quality Station||Watson Place, FL||25.708 N 81.248 W (25°42'28" N 81°14'53" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. wpow1|N|C-MAN Station||West Point, WA|MARS payload|47.662 N 122.436 W (47°39'44" N 122°26'9" W)|P|FZUS56.KSEW | wptw1|O|Water Level Observation Network||9441102 - Westport, WA||46.904 N 124.105 W (46°54'16" N 124°6'18" W)|P| | wrbf1|NP|Water Quality Station||Whipray Basin, FL||25.077 N 80.728 W (25°4'36" N 80°43'39" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. wwef1|NP|Water Quality Station||White Water -West, FL||25.230 N 80.939 W (25°13'47" N 80°56'19" W)|| | wycm6|O|Water Level Observation Network||8747437 - Bay Waveland Yacht Club, MS||30.326 N 89.326 W (30°19'34" N 89°19'34" W)|C| | yabp4|PN|Water Level Observation Network||9754228 - Yabucoa Harbor, PR||18.055 N 65.833 W (18°3'18" N 65°49'59" W)|N| | yata2|O|Water Level Observation Network||9453220- Yakutat, AK||59.548 N 139.733 W (59°32'55" N 139°44'0" W)|A| | ygnn6|EA|GLOS Weather Station||Niagara Coast Guard Station, NY||43.261 N 79.064 W (43°15'41" N 79°3'51" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES
FORECASTS

ykrv2|O|Water Level Observation Network||8637611 - York River East Rear Range Light, VA||37.250 N 76.333 W (37°15'0" N 76°19'59" W)|E| |For area forecasts and warnings, select: Wakefield WFO yktv2|O|Water Level Observation Network||8637689 - Yorktown, VA||37.227 N 76.478 W (37°13'36" N 76°28'42" W)|E|FZUS51.KAKQ | yrsv2|NR|NERRS Weather Station||Chesapeake Bay,VA||37.414 N 76.713 W (37°24'51" N 76°42'45" W)|E| |Water Quality data for this Reserve are available at....
CVQV2 -- Sweet Hall
GDWV2 -- Goodwin Island
zbqn7|NR|NERRS Water Quality Station||Zeke's Basin, North Carolina||33.955 N 77.935 W (33°57'17" N 77°56'6" W)|E| | fldigi-4.1.06/data/flarq.xpm0000644000175000017500000001632413472116043012534 00000000000000/* XPM */ static char * flarq_xpm[] = { "48 48 157 2 ", " c #010101", ". c #0B0B0B", "X c #0F1010", "o c #131414", "O c #1B1C1C", "+ c #242525", "@ c #2B2B2C", "# c #2F3030", "$ c #333334", "% c #3B3C3D", "& c #00005B", "* c #000163", "= c #0D0D62", "- c #00026C", "; c #131365", ": c #1B1B69", "> c #010373", ", c #00047C", "< c #292A71", "1 c #232376", "2 c #3C3C7D", "3 c #444445", "4 c #474849", "5 c #4A4B4C", "6 c #535455", "7 c #575859", "8 c #5B5C5D", "9 c #5E5F60", "0 c #5F6061", "q c #626364", "w c #666768", "e c #6B6C6D", "r c #6E6F70", "t c #6F7071", "y c #727475", "u c #767779", "i c #777879", "p c #7B7C7D", "a c #CC9272", "s c #CF9778", "d c #CF997B", "f c #D09A7D", "g c #000483", "h c #000589", "j c #000693", "k c #00079A", "l c #00089E", "z c #030BA4", "x c #0009AA", "c c #000AB4", "v c #000BBA", "b c #3539A3", "n c #575787", "m c #52528B", "M c #686991", "N c #6B6C9C", "B c #000BC3", "V c #000DCA", "C c #000ED3", "Z c #000EDB", "A c #000FE0", "S c #0010E5", "D c #0011ED", "F c #0E1EEC", "G c #0011F2", "H c #0013FE", "J c #4B54DA", "K c #7F8082", "L c #828285", "P c #858688", "I c #87898A", "U c #8A8C8D", "Y c #8D8F90", "T c #8F9192", "R c #939495", "E c #969799", "W c #97999A", "Q c #9B9C9E", "! c #A59F9D", "~ c #BAA498", "^ c #8687A2", "/ c #9E9FA2", "( c #9D9EAA", ") c #8788BB", "_ c #9A9BB4", "` c #9EA0A1", "' c #A2A3A4", "] c #A5A6A9", "[ c #A6A8AA", "{ c #A9ABAD", "} c #BBABA3", "| c #BAB2AF", " . c #ACAEB1", ".. c #B1AFB5", "X. c #AFB1B3", "o. c #B2B4B6", "O. c #BEB6B2", "+. c #B4B6B8", "@. c #B7B8BA", "#. c #BABBBC", "$. c #D29E81", "%. c #D3A185", "&. c #D5A58A", "*. c #D7A98E", "=. c #C9A896", "-. c #CAAC9B", ";. c #D6AB92", ":. c #D9AD94", ">. c #DAB097", ",. c #DCB39C", "<. c #D7B7A3", "1. c #DDB7A0", "2. c #DEBAA3", "3. c #DCBFAD", "4. c #CEBEB4", "5. c #E0BDA7", "6. c #E1BEA9", "7. c #D9C6BA", "8. c #DDC2B1", "9. c #E2C1AD", "0. c #E4C6B2", "q. c #E5C9B6", "w. c #E7CCBA", "e. c #E8CFBD", "r. c #E9D0BF", "t. c #B4B4C6", "y. c #A3A6DF", "u. c #B6BBFC", "i. c #BFC1C3", "p. c #C2C2C4", "a. c #C8C9CB", "s. c #D7CAC1", "d. c #DBCEC5", "f. c #CBCCD9", "g. c #D2D2D3", "h. c #DFD6D0", "j. c #D7D8D9", "k. c #DBDCDD", "l. c #EAD4C3", "z. c #E0D5CE", "x. c #ECD7C8", "c. c #EDDBCC", "v. c #EFDED0", "b. c #E4DFDB", "n. c #E9E1DA", "m. c #F0E1D4", "M. c #F2E3D9", "N. c #EBE8E5", "B. c #E2E2E7", "V. c #F0EFED", "C. c #F2EBE5", "Z. c #F2F0EF", "A. c #F9F5F1", "S. c #FBFAF7", "D. c #FDFCFC", "F. c #F3F4FB", "G. c None", /* pixels */ "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "D G H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "V Z S G H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.p.p.", "c v V C A G H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.v.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.i.i.#.+.", "k z x v B C A D H H G.G.G.G.G.G.G.G.G.G.G.G.G.x.c.v.v.c.v.v.G.G.G.G.G.G.G.G.G.G.G.i.#.+.o.X.{ ' ", ", h j l x c B V Z F u.D.G.G.G.G.G.G.G.G.e.r.x.x.c.c.c.c.v.v.v.v.v.G.G.G.G.G.G.a.+.X.X.' ! ! W W ", "- > h h j l z c B J F.A.M.G.G.G.G.v.v.r.0.q.w.q.q.x.x.x.x.c.c.v.v.v.v.v.G.G.D.g.{ ` ` W W T U I ", "* * - > , h j l z y.S.M.c.v.v.v.v.v.c.0.9.9.9.9.3.0.e.e.r.x.x.c.c.v.c.v.m.m.V.j.W T Y I P P M p ", "& & * * - - > h b B.C.x.x.x.x.c.c.c.x.w.9.2.5.5.2.9.q.q.q.w.r.r.x.x.x.x.c.v.N.k.R L K p i y t r ", "& & & & & * - > ) Z.c.r.r.r.x.x.c.w.2.1.>.,.,.9.w.c.c.x.q.9.q.q.e.e.e.x.x.x.n.k.R u t r w w q 9 ", "& & & & & & & 1 f.n.r.q.r.r.r.x.r.,.%.*.&.*.,.x.m.c.m.v.c.q.9.9.0.0.q.w.w.x.z.g./ w w 0 8 8 7 6 ", "& & & & & & & N B.w.9.q.9.q.q.r.e.,.*.%.*.,.e.c.c.c.c.v.v.c.x.9.6.6.9.0.0.w.s.g.{ 9 7 6 6 5 4 4 ", "& & & & & & ; t.z.9.9.9.9.9.q.q.q.q.0.0.q.r.x.r.x.x.x.x.c.v.v.x.0.5.2.6.6.6.7.a.o.8 5 4 3 3 % % ", "& & & & & & m g.8.2.3.2.5.9.9.9.9.q.q.q.w.w.e.r.r.r.x.x.x.x.x.v.c.w.2.,.2.2.3.p.#.0 % % % $ $ $ ", "& & & & & = _ s.,.,.,.5.5.5.5.5.9.9.9.9.0.q.q.w.w.e.r.r.r.x.x.x.x.c.l.,.,.,.1.#.@.r $ $ @ @ + + ", "& & & & & 2 p.2.>.,.,.,.1.,.5.5.5.6.9.9.9.9.0.0.q.q.q.w.w.e.r.r.e.x.x.x.1.;.:.| o.K @ + + + O O ", "& & & & & ^ 4.;.*.>.>.>.,.>.,.1.1.1.5.5.5.9.9.9.9.9.9.q.w.w.w.r.e.l.l.x.w.,.&.} { R @ O O o o o ", "& & & & < o.=.*.*.*.*.*.:.>.>.>.,.,.,.1.1.1.1.9.9.9.9.9.9.9.9.q.w.w.w.w.l.w.:.~ ] Q $ o o o X . ", "& & & & M 4.$.%.%.%.%.*.*.*.*.:.:.:.>.,.,.,.1.1.,.9.9.9.9.9.9.9.0.6.0.q.w.e.0.=.` / 4 . . . . ", "& & & : ( o.G.f f %.%.%.%.&.*.*.*.:.:.:.:.,.,.,.,.,.,.2.,.9.9.9.6.2.6.0.0.0.e.3.! Q 9 . ", "& & & n .G.G.G.G.f f %.f *.f *.*.:.*.*.*.:.:.:.>.>.,.,.,.,.9.2.5.5.1.5.9.0.0.0.~ R i . ", "& & ; ^ G.G.G.G.G.G.*.f f f f f f f f *.&.*.*.*.:.:.:.>.,.,.,.,.1.1.5.,.1.6.6.9.-.R P o ", "& & = G.G.G.G.G.G.G.1.*.f s s s f f :.*.&.&.&.*.&.*.:.:.:.>.,.>.1.>.1.1.,.,.5.6.G.G.G. ", "& & G.G.G.G.G.G.G.G.5.:.f s s s *.5.9.5.*.f f f &.&.&.&.*.&.:.:.=.,.,.,.,.:.,.3.G.G.G.G. ", "& & G.G.G.G.G.G.G.G.9.,.f a G.f *.e.0.6.:.$.>.5.:.%.%.%.*.*.*.*.%.=.:.:.:.:.G.G.G.G.G.G. ", "& G.G.G.G.G.G.G.G.G.G.,.f a G.f *.6.5.,.&.:.e.e.9.*.%.f $.%.$.%.*.$.*.*.:.:.G.G.G.G.G.G.G. ", "& G.G.G.G.G.G.G.G.G.G.G.G.G.G.a f %.%.%.%.:.r.e.5.6.q.,.$.s $.$.$.%.$.%.*.G.G.G.G.G.G.G.G.G. ", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a s a f ,.:.*.9.e.9.;.a s d f $.$.G.G.G.G.G.G.G.G.G.G.G. ", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a a a a a $.:.:.:.*.a a a d f G.G.G.G.G.G.G.G.G.G.G.G.G. ", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a a a a f %.f a a a G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a a a a a a a a G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", "G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G." }; fldigi-4.1.06/data/mac/0000775000175000017500000000000013515625027011522 500000000000000fldigi-4.1.06/data/mac/fldigi.icns0000644000175000017500000011072713472116043013557 00000000000000icns‘×it32QÇŽ€4”¾‘/€±€3”¿”3€­€3”À–6€±€3”¿”3€­€2“›=€±€3”¿”3€œŽ € 5•ŤJ± €8–Á–8€ œ’+ŧKº/‘¾‘/¶ƒ¾¡@º†µ†¶"È«Jº'¿'¡Ž16,"[±àÈy7")23210122/(!†  !(.2216+"^³Ù³^",63œ1Ž’ •†ŠªÜøé¼–‰Ž“’ “””ˆ€||~…~}}~~}||€‡””“•…Š­ÝóÝ­Š…•”œ’ŽÊ ËÉÇÈÐÜãßÔËÈÉ”ÊÉÈÈÍÔÜàß…ÝÞßÞßááÜÕÍÉÈÊËÉÇÈÐÜâÜÐÈÇÉËÊœ ž˜‘–›“œŸ™“’«×’ÿÚ®•“š€ž˜‘‘˜žŸœŽ- ,-/.)!&,..“-3)M õÿ÷§R#+10/.)!!)./-,-´ sÞ€ÿ÷ûÿÿ€þ‚ÿü€ÿá|­’*‚Ýÿÿýöúþÿþüûýÿ÷€ÿߊ1€€™’ˆ‰Š‹Š‰“ˆ ‰ˆ‡‡~so‹¼î€ÿýˆÿü€ÿïÀuu€ˆ‰ˆˆ‰Š‹Š‰¡ˆ®Ï&ÎÍÏÐÔÙâîøþþûøõòñóöøöðëëðöûýý÷îâÚÕÒÐÎÏÏÐ…ÏÐÐÑÐИϭ»&¹¸¸ÂÓêüÿþõðîíçÝÔÑ×áçàÐÀÁÐäïñðóûÿúéÕû¹º†»½¾¿¾½˜»ªc,dcc`ah€£ÊåîìäááßØË¾»ÃÑÙи£¤¹ÕåæããëêàÄ¡~iaacdd‚cdfghge˜c£€‚+*P~«ÅÏÑÒÖ×ÖÑÉÁ¾ÄÐ×Ϲ¦§»ÔâàÛÓÒÉ»›sF%ƒ˜® N¤´¶·¿ÈÎÐÓ€ÔÖÛßÚÍÃÄÑÝãÜÒù¬¡ˆf9Ù#2c©­¦¢¬ºÆÍÕÝãäãäççäââææãÖÆ±¢–’…mFØ%=l’¥¡–š®ÂÎÖÚÜÞâæëîîïííèßηžŽ…†€pN( §«,4`…˜“†~‹¥ÂÓ×ÒÌÎØäíðîìèèãÛŪ||jH$ Ï€) &S|“Žw…£ÅÚÜÏÂÃÒåððçßÚÞßÙ¤ˆ}€‰ƒlD¢ª€*M}˜”ƒz‡¦ÈÞßÐÂÄÔçïèØËÈÔÞÜÆ¨Œ…Œš”wF€Ë€#Pƒ¡Ÿ‘Š–¯ÍààÑÄÈØæçÙõ¸ÌÞáÏ´›•›«¦‡O€Ë€$&Y‡£§¤£«¼ÔâÝÌÀÇØãÝʶ­µÊÞä×­¥§²¬Y$€Å€$ 3c‡©³¹¾ÉÛåÛÇ»ÄÖÞÕź¸ÀÏÝãÛͼ³¬« ‰]-‚ Ä€$AoŠ˜¤´ÀÅÎÝæÜÉ¿ÈÙáÚÎÊÍÑÖÚÝÖÍÀ¸« _6‚ Ä €$Jy˜œ§´ÀÌÚâÞÒËÑÞåà×Ô×ÚÛÙÖÎÆ½¶§™‰{`9‚ Ä  ‚$K~¤œœ¦¹ÌÛäæäáâèêåÛÕ×ÜâàÙ̹´¬§›ˆc7€Ä %Avž¬£›¤½ÒßåêíëçâÜÕÍÈÊÔàäÞÒǽº¶º¯”a-€€Å %0c“°²­´ÊÞèîðóïäÓÁ¸¶¼ÄÑáëëâØËÅÂÅ·“W!€±€‘€% Dsš¯»ÇÕßâãáàÙÈ­’ˆ£³ÂÑÝåæäØÌº¯™uAƒ¦Ž‚% 'Jr•´ÌÖÓȽº°œ}_Vd•¦±»ÈÖãÝÆŸeJ) ‡ ¦‡"!:]Ž½Ìº–~wxq_G0)4L`puw…¥ÎÕ´tB)‡  ¦ˆ!!^¦Â¢`4,55) *75-9l°É¡M‡ ¦ˆ€ <—½“8 €  =˜À”5€‡  ¦ˆ€)¾’,Œ)½‘.€‡ ¥Ž‰€'ŽÃ9Œ.“À•3€‡ ¥œ €)ŽÄ¡Aˆ€/“¿“1€‡ ¥ ›€<–Àš@€„€+º.€‡ ¥ › V¤¹‹7ˆ€'‡´‰(€‡ ¥›€ 4yµºŒH C“·:‡ ¥›"(Z—ÆÆ¤uTD:0-5?B9/,:DEQz²Ç§c-€„  ¥€œ!1X…³ÔÙ˱šƒl[[l~‚r_Wg~‘£º×ÛÈtM) €ƒ Ê! /]±ÊÝæèÞ̲—…‰Ÿµ¹¥Œ€®ÊÝåìåßÍ´ƒF€„¿!OлӨÜäîîãϹ«±ÅØÛȱ¦´ÏèóðèÝàâÛ­f €ƒÀ€'*k¬×á×ÑÖäîìÞÎÄÉØåæÙÉÃÍáñóæÖÈÑàèÅ5€Ã€# ;»Ø×ÉÀÆ×éîæ×ÏÒÞæçàÙØÞèïêÙŶ¾ÑàÉ”Nƒ À$GŠºËÆ»·¾Ñèòé×ÌÐÝæçãáãåéêäÔ¿°µÄÒÛ^)‚  À$NŠ­·µ¶»ÂÐãîçÕÉÌÚäçååçæåãßÕǹ¸º¿³—f3 ‚Ä€$VŠ¡¤¨¶ÄÉËÔßáØÎÐÜèìêèèåáÝÛØÓǼ­¨Ÿj9 Ä %*^ˆ––Ÿ·ËÌÁ¾È×ÝÜÛâëïîêèåáÚÙÜßÓ¼œŠ‰pC€ Ä % 7g‰‘š¶ÌÊ·«´ÍãëéèêíîîìêåÛÙÞåÚ»z}Š|R€  Å ->h†Ž‘ž¹Îͺ¬±ÊäñìáÙÚâêðïéÞÜàçÞÀ“z{Š[( Æ€.=a|‡’¥¿Ô×ʼ¼ÍãïåÍ·¶ÈáñóëàÞãëãÈ€yxX* Ç€€'0Mh|’¬ÈÝãÜÏÊÑßäÓ³•’©ÍæìæÞàæïæÍ¤„qk]C!€ È' 2Nl²ÐäêåØÐÐÔѾ …‚—·ÎÙÚÙáêóèΤdN8$€ ½…' =f”»×çêåÚÒÌǾ®‘’𦝼ÊÖäíóæÎ«‰c> „ ½„!9n¤ÊÞççäÝÖÍÀ°¥¤ª®¥—Ÿ¼ØéïðãÖÀ¦yB€ƒ ½ ƒ!H…»ØáããæäàÖۧ°ÂÆ®Œ|’»ßîìèßàÛÍŸ]€€€½ ‚##aŸÍààßáèëêãÓ¼²¾ÐÏ®‡{˜ÆèñêãÝæêä»{6 €Á  ‚$;}´ÔÚ××ÝæìîëâÐÆÍÙÒ´–“²ØîïæßÚààÜ¿‘V%‚à ‚$Q“ÀÐÍËÑÜåéìîìáÚÜáÚŵ¹ÑèîèßÝÙÕɲ›o=‚ Ä ‚$!\ÃȽºÅÖàäèíïëçæçäÜÖÛèðéÜÓÓÐÆ´­¨yF‚Ä  ‚ZœÄÆ´«´ÉØàåêíìêéèìñòåÒÄÁ¾¸­­ªšp=‚à ‚ P“ÀÈ´ ž°ÇÙâåäããåçëðñåϹ«£¦®¼´•]-  'K‰ºÊµ•ƒ‘°ÐáâÞÝßßÙÖÙàèíñéÔ´—‡“±ÍÂ’Q#€  Á €2 )N®À®ˆmwÈßàÛÛßÝÔÏÓÞéíðìÙµu…­ÑÈ—U&   Á;"9V{Ÿ¯Ÿ|bm“ÂÞåââãà×ÒØâìíîëÛ¹t}¡ÇÈ¥g1  Á/)B[x’ ”~o{›ÂÞëìêéåàßâçëèèåÚÁ¡†‚”³À¯z>€  Á/'BZtŠ™˜“™¬ÄÛëòñíêêëìéåààÞÛϺ ŽŠ¯­„H€ Ã.  Ê€(Q†¢ª«´ÀÍ×áéìéâÞâæàÏ¿¼ÇÖàãÜο»½Ä¹m;Ê1 (Y‡™›Ÿ±ÇÖÞãéëêãßáäßÓÇÇÑÝããÜÓÇþ¾µ¢zIÆ6  3bŠ•’–­ÈÜãåçéêèåääâÜ×ÙàæåàÙÔÏɼµ­¥ˆ[) Æ6 7e™—˜¬ÇÛâãäæêëëéèæååèëëåÞ×ÕÒʺ°©¥Œc2  Ç3b¥§¥²ÅÖÜÞàåêíìë€êëíîíçàÛ×ÏÅ·²¬¤†^1Ç6  (\’¯µ´¼ÉÓÕ×ÝæëëèçéêêééëìéåàÚÌÀ¶·±¡|P(  Å €-!Z’¯µ·ÃÐÔÑÓÛæëèãâæëíëéèçååâÛÌÀ·¹²žtF Å €$ Z¡£¬Ä×ÚÒÑÚåèãÝÜâéííëäÝØÙÜÛÐÅ·³©–pA€ Ä  €$$_—•£ÅÞáØ×ßæèäáâèíñôñçØÎÐÖÜ×ͼ°¢“qE€  Ä  €&_Š’‘¡ÅâçàÝâææäãæ€éëìå×ËËÓÝÝÖÁ°žqH À  €%#Wƒ“œ°ÐèìççìïïëééçߨÚãéæÞÜÞåäÞ˸¡ŽpI€ ¼ €%@iƒ›·ÖêìçåéîîæÛÒɾ³·ÉàëéææëèßȲ—€a>‚» ‚€% $Daƒ©ÏåçÞÔÖÜÞл¨™Ž…¦ÈÜÝÛÞéæ×¶˜zcG+… » †$ 1Nu§ÐÜË­ £¨š€iYRNYr“¤¢¢´ÔÜÅcF7'† º ˆ! 3o³Ï·€]YbYC/# !+™Å¨X !  A˜Æ§Nˆ  ¦‰€'ŒÁŸB€„€'‹Â¢DŒ  ¥€)ŽÁ=Œ(¡B€‡  ¥€1’Â>€ƒ€0’ßA€‡  ¥€5•Ü?€€€€5•Ü?€‡  —Ž€4”¾‘/€±€3”¿”3€­€3”À–6€±€3”¿”3€­€2“›=€±€3”¿”3€œŽ € 5•ŤJ± €8–Á–8€ œ’+ŧKº/‘¾‘/¶ƒ¾¡@º†µ†¶"È«Jº'¿'¡Ž16,"[±àÈy7")232•1232†12„34321 6,"^³Ù³^",63œ1Ž’ •†ŠªÜøé¼–‰Ž““’““”““„’““†”““€’ •…Š­ÝóÝ­Š…•”œ’ŽÊ ËÉÇÈÐÜãßÔËÈÉ—ÊÉÇÆÇÉ„ÊÉÇÆ„ÅÆÇÉÊ ÉÇÈÐÜâÜÐÈÇÉËÊœ ž˜‘–›•œ(™”‘”™œ›œš•ŽŽ•šœ›œž˜‘‘˜žŸœŽ- ,-/.)!&,..”-+/11-&#&-220/012.'!'.11.--/.)!!)./-,-ý’"     €€€™’ˆ‰Š‹Š‰“ˆ+‰ˆ‡„}{z{{zyyz{||{zz{~€€~{zz{{z{|~‚…‡ˆˆ‰Š‹Š‰¡ˆ®Ï&ÎÍÎÑÖÛßááàßÝÛØÕÔÖÙÛÚÖÒÒÖÜàââáàÞÛ×ÒÏÎÎÏÐ…ÏÐÐÑÐИϭ»¹¸¸ÂÓèúƒÿ üóêçì÷ýöæ×׿úƒÿùèÕÄ»¹º†»½¾¿¾½˜»ªc,dcc`ah£Èãñöö÷÷ôìßÓÐ׿îäÍ·¸Íéúûùõõíß iaacdd‚cdfghge˜c£€‚+*P~ªÅÏÒÕÙÛÙÕÌÄÂÇÓÚÒ¼¨ª¾×åãÞÖÔÉ»›rF%ƒ˜® N¤´µ´ºÂÈËÍ€ÏÐÕÙÔȽ¾ËØÝÖ̾¶«¡‰g9Ù#2cª­¦¡©·ÃÊÒÚàáàáääáßßããßÓ®¡–’…mFØ%=l’¥¡–š®ÂÎÖÚÜÞâæëîîïííèßηžŽ…†€pN( §«,4`…˜“†~‹¥ÂÓ×ÒÌÎØäíðîìèèãÛŪ||jH$ Ï€) &S|“Žw…£ÅÚÜÏÂÃÒåððçßÚÞßÙ¤ˆ}€‰ƒlD¢ª€*M}˜”ƒz‡¦ÈÞßÐÂÄÔçïèØËÈÔÞÜÆ¨Œ…Œš”wF€Ë€#Pƒ¡Ÿ‘Š–¯ÍààÑÄÈØæçÙõ¸ÌÞáÏ´›•›«¦‡O€Ë€$&Y‡£§¤£«¼ÔâÝÌÀÇØãÝʶ­µÊÞä×­¥§²¬Y$€Å€$ 3c‡©³¹¾ÉÛåÛÇ»ÄÖÞÕź¸ÀÏÝãÛͼ³¬« ‰]-‚ Ä€$AoŠ˜¤´ÀÅÎÝæÜÉ¿ÈÙáÚÎÊÍÑÖÚÝÖÍÀ¸« _6‚ Ä €$Jy˜œ§´ÀÌÚâÞÒËÑÞåà×Ô×ÚÛÙÖÎÆ½¶§™‰{`9‚ Ä  ‚$K~¤œœ¦¹ÌÛäæäáâèêåÛÕ×ÜâàÙ̹´¬§›ˆc7€Ä %Avž¬£›¤½ÒßåêíëçâÜÕÍÈÊÔàäÞÒǽº¶º¯”a-€€Å %0c“°²­´ÊÞèîðóïäÓÁ¸¶¼ÄÑáëëâØËÅÂÅ·“W!€±€‘€% Dsš¯»ÇÕßâãáàÙÈ­’ˆ£³ÂÑÝåæäØÌº¯™uAƒ¦Ž‚% 'Jr•´ÌÖÓȽº°œ}_Vd•¦±»ÈÖãÝÆŸeJ) ‡ ¦‡"!:]Ž½Ìº–~wxq_G0)4L`puw…¥ÎÕ´tB)‡  ¦ˆ!!^¦Â¢`4,55) *75-9l°É¡M‡ ¦ˆ€ <—½“8 €  =˜À”5€‡  ¦ˆ€)¾’,Œ)½‘.€‡ ¥Ž‰€'ŽÃ9Œ.“À•3€‡ ¥œ €)ŽÄ¡Aˆ€/“¿“1€‡ ¥ ›€<–Àš@€„€+º.€‡ ¥ › V¤¹‹7ˆ€'‡´‰(€‡ ¥›€ 4yµºŒH C“·:‡ ¥›"(Z—ÆÆ¤uTD:0-5?B9/,:DEQz²Ç§c-€„  ¥€œ!1X…³ÔÙ˱šƒl[[l~‚r_Wg~‘£º×ÛÈtM) €ƒ Ê! /]±ÊÝæèÞ̲—…‰Ÿµ¹¥Œ€®ÊÝåìåßÍ´ƒF€„¿!OлӨÜäîîãϹ«±ÅØÛȱ¦´ÏèóðèÝàâÛ­f €ƒÀ€'*k¬×á×ÑÖäîìÞÎÄÉØåæÙÉÃÍáñóæÖÈÑàèÅ5€Ã€# ;»Ø×ÉÀÆ×éîæ×ÏÒÞæçàÙØÞèïêÙŶ¾ÑàÉ”Nƒ À$GŠºËÆ»·¾Ñèòé×ÌÐÝæçãáãåéêäÔ¿°µÄÒÛ^)‚  À$NŠ­·µ¶»ÂÐãîçÕÉÌÚäçååçæåãßÕǹ¸º¿³—f3 ‚Ä€$VŠ¡¤¨¶ÄÉËÔßáØÎÐÜèìêèèåáÝÛØÓǼ­¨Ÿj9 Ä %*^ˆ––Ÿ·ËÌÁ¾È×ÝÜÛâëïîêèåáÚÙÜßÓ¼œŠ‰pC€ Ä % 7g‰‘š¶ÌÊ·«´ÍãëéèêíîîìêåÛÙÞåÚ»z}Š|R€  Å ->h†Ž‘ž¹Îͺ¬±ÊäñìáÙÚâêðïéÞÜàçÞÀ“z{Š[( Æ€.=a|‡’¥¿Ô×ʼ¼ÍãïåÍ·¶ÈáñóëàÞãëãÈ€yxX* Ç€€'0Mh|’¬ÈÝãÜÏÊÑßäÓ³•’©ÍæìæÞàæïæÍ¤„qk]C!€ È' 2Nl²ÐäêåØÐÐÔѾ …‚—·ÎÙÚÙáêóèΤdN8$€ ½…' =f”»×çêåÚÒÌǾ®‘’𦝼ÊÖäíóæÎ«‰c> „ ½„!9n¤ÊÞççäÝÖÍÀ°¥¤ª®¥—Ÿ¼ØéïðãÖÀ¦yB€ƒ ½ ƒ!H…»ØáããæäàÖۧ°ÂÆ®Œ|’»ßîìèßàÛÍŸ]€€€½ ‚##aŸÍààßáèëêãÓ¼²¾ÐÏ®‡{˜ÆèñêãÝæêä»{6 €Á  ‚$;}´ÔÚ××ÝæìîëâÐÆÍÙÒ´–“²ØîïæßÚààÜ¿‘V%‚à ‚$Q“ÀÐÍËÑÜåéìîìáÚÜáÚŵ¹ÑèîèßÝÙÕɲ›o=‚ Ä ‚$!\ÃȽºÅÖàäèíïëçæçäÜÖÛèðéÜÓÓÐÆ´­¨yF‚Ä  ‚ZœÄÆ´«´ÉØàåêíìêéèìñòåÒÄÁ¾¸­­ªšp=‚à ‚ P“ÀÈ´ ž°ÇÙâåäããåçëðñåϹ«£¦®¼´•]-  'K‰ºÊµ•ƒ‘°ÐáâÞÝßßÙÖÙàèíñéÔ´—‡“±ÍÂ’Q#€  Á €2 )N®À®ˆmwÈßàÛÛßÝÔÏÓÞéíðìÙµu…­ÑÈ—U&   Á;"9V{Ÿ¯Ÿ|bm“ÂÞåââãà×ÒØâìíîëÛ¹t}¡ÇÈ¥g1  Á/)B[x’ ”~o{›ÂÞëìêéåàßâçëèèåÚÁ¡†‚”³À¯z>€  Á/'BZtŠ™˜“™¬ÄÛëòñíêêëìéåààÞÛϺ ŽŠ¯­„H€ Ã.  Ê€(Q†¢ª«´ÀÍ×áéìéâÞâæàÏ¿¼ÇÖàãÜο»½Ä¹m;Ê1 (Y‡™›Ÿ±ÇÖÞãéëêãßáäßÓÇÇÑÝããÜÓÇþ¾µ¢zIÆ6  3bŠ•’–­ÈÜãåçéêèåääâÜ×ÙàæåàÙÔÏɼµ­¥ˆ[) Æ6 7e™—˜¬ÇÛâãäæêëëéèæååèëëåÞ×ÕÒʺ°©¥Œc2  Ç3b¥§¥²ÅÖÜÞàåêíìë€êëíîíçàÛ×ÏÅ·²¬¤†^1Ç6  (\’¯µ´¼ÉÓÕ×ÝæëëèçéêêééëìéåàÚÌÀ¶·±¡|P(  Å €-!Z’¯µ·ÃÐÔÑÓÛæëèãâæëíëéèçååâÛÌÀ·¹²žtF Å €$ Z¡£¬Ä×ÚÒÑÚåèãÝÜâéííëäÝØÙÜÛÐÅ·³©–pA€ Ä  €$$_—•£ÅÞáØ×ßæèäáâèíñôñçØÎÐÖÜ×ͼ°¢“qE€  Ä  €&_Š’‘¡ÅâçàÝâææäãæ€éëìå×ËËÓÝÝÖÁ°žqH À  €%#Wƒ“œ°ÐèìççìïïëééçߨÚãéæÞÜÞåäÞ˸¡ŽpI€ ¼ €%@iƒ›·ÖêìçåéîîæÛÒɾ³·ÉàëéææëèßȲ—€a>‚» ‚€% $Daƒ©ÏåçÞÔÖÜÞл¨™Ž…¦ÈÜÝÛÞéæ×¶˜zcG+… » †$ 1Nu§ÐÜË­ £¨š€iYRNYr“¤¢¢´ÔÜÅcF7'† º ˆ! 3o³Ï·€]YbYC/# !+™Å¨X !  A˜Æ§Nˆ  ¦‰€'ŒÁŸB€„€'‹Â¢DŒ  ¥€)ŽÁ=Œ(¡B€‡  ¥€1’Â>€ƒ€0’ßA€‡  ¥€5•Ü?€€€€5•Ü?€‡  —Ž€4”¾‘/€±€3”¿”3€­€3”À–6€±€3”¿”3€­€2“›=€±€3”¿”3€œŽ € 5•ŤJ± €8–Á–8€ œ’+ŧKº/‘¾‘/¶ƒ¾¡@º†µ†¶"È«Jº'¿'¡Ž16,"[±àÈy7")232•1232†12„34321 6,"^³Ù³^",63œ1Ž’ •†ŠªÜøé¼–‰Ž““’““”““„’““†”““€’ •…Š­ÝóÝ­Š…•”œ’ŽÊ ËÉÇÈÐÜãßÔËÈÉ—ÊÉÇÆÇÉ„ÊÉÇÆ„ÅÆÇÉÊ ÉÇÈÐÜâÜÐÈÇÉËÊœ ž˜‘–›•œ(™”‘”™œ›œš•ŽŽ•šœ›œž˜‘‘˜žŸœŽ- ,-/.)!&,..”-+/11-&#&-220/012.'!'.11.--/.)!!)./-,-ý’"     €€€™’ˆ‰Š‹Š‰“ˆ+‰ˆ‡„}{z{{zyyz{||{zz{~€€~{zz{{z{|~‚…‡ˆˆ‰Š‹Š‰¡ˆ®Ï&ÎÍÎÑÖÛßááàßÝÛØÕÔÖÙÛÚÖÒÒÖÜàââáàÞÛ×ÒÏÎÎÏÐ…ÏÐÐÑÐИϭ»¹¸¸ÂÓèúƒÿ üóêçì÷ýöæ×׿úƒÿùèÕÄ»¹º†»½¾¿¾½˜»ªc,dcc`ah£Èãñöö÷÷ôìßÓÐ׿îäÍ·¸Íéúûùõõíß iaacdd‚cdfghge˜c£€‚+*P~ªÅÏÒÕÙÛÙÕÌÄÂÇÓÚÒ¼¨ª¾×åãÞÖÔÉ»›rF%ƒ˜® N¤´µ´ºÂÈËÍ€ÏÐÕÙÔȽ¾ËØÝÖ̾¶«¡‰g9Ù#2cª­¦¡©·ÃÊÒÚàáàáääáßßããßÓ®¡–’…mFØ%=l’¥¡–š®ÂÎÖÚÜÞâæëîîïííèßηžŽ…†€pN( §«,4`…˜“†~‹¥ÂÓ×ÒÌÎØäíðîìèèãÛŪ||jH$ Ï€) &S|“Žw…£ÅÚÜÏÂÃÒåððçßÚÞßÙ¤ˆ}€‰ƒlD¢ª€*M}˜”ƒz‡¦ÈÞßÐÂÄÔçïèØËÈÔÞÜÆ¨Œ…Œš”wF€Ë€#Pƒ¡Ÿ‘Š–¯ÍààÑÄÈØæçÙõ¸ÌÞáÏ´›•›«¦‡O€Ë€$&Y‡£§¤£«¼ÔâÝÌÀÇØãÝʶ­µÊÞä×­¥§²¬Y$€Å€$ 3c‡©³¹¾ÉÛåÛÇ»ÄÖÞÕź¸ÀÏÝãÛͼ³¬« ‰]-‚ Ä€$AoŠ˜¤´ÀÅÎÝæÜÉ¿ÈÙáÚÎÊÍÑÖÚÝÖÍÀ¸« _6‚ Ä €$Jy˜œ§´ÀÌÚâÞÒËÑÞåà×Ô×ÚÛÙÖÎÆ½¶§™‰{`9‚ Ä  ‚$K~¤œœ¦¹ÌÛäæäáâèêåÛÕ×ÜâàÙ̹´¬§›ˆc7€Ä %Avž¬£›¤½ÒßåêíëçâÜÕÍÈÊÔàäÞÒǽº¶º¯”a-€€Å %0c“°²­´ÊÞèîðóïäÓÁ¸¶¼ÄÑáëëâØËÅÂÅ·“W!€±€‘€% Dsš¯»ÇÕßâãáàÙÈ­’ˆ£³ÂÑÝåæäØÌº¯™uAƒ¦Ž‚% 'Jr•´ÌÖÓȽº°œ}_Vd•¦±»ÈÖãÝÆŸeJ) ‡ ¦‡"!:]Ž½Ìº–~wxq_G0)4L`puw…¥ÎÕ´tB)‡  ¦ˆ!!^¦Â¢`4,55) *75-9l°É¡M‡ ¦ˆ€ <—½“8 €  =˜À”5€‡  ¦ˆ€)¾’,Œ)½‘.€‡ ¥Ž‰€'ŽÃ9Œ.“À•3€‡ ¥œ €)ŽÄ¡Aˆ€/“¿“1€‡ ¥ ›€<–Àš@€„€+º.€‡ ¥ › V¤¹‹7ˆ€'‡´‰(€‡ ¥›€ 4yµºŒH C“·:‡ ¥›"(Z—ÆÆ¤uTD:0-5?B9/,:DEQz²Ç§c-€„  ¥€œ!1X…³ÔÙ˱šƒl[[l~‚r_Wg~‘£º×ÛÈtM) €ƒ Ê! /]±ÊÝæèÞ̲—…‰Ÿµ¹¥Œ€®ÊÝåìåßÍ´ƒF€„¿!OлӨÜäîîãϹ«±ÅØÛȱ¦´ÏèóðèÝàâÛ­f €ƒÀ€'*k¬×á×ÑÖäîìÞÎÄÉØåæÙÉÃÍáñóæÖÈÑàèÅ5€Ã€# ;»Ø×ÉÀÆ×éîæ×ÏÒÞæçàÙØÞèïêÙŶ¾ÑàÉ”Nƒ À$GŠºËÆ»·¾Ñèòé×ÌÐÝæçãáãåéêäÔ¿°µÄÒÛ^)‚  À$NŠ­·µ¶»ÂÐãîçÕÉÌÚäçååçæåãßÕǹ¸º¿³—f3 ‚Ä€$VŠ¡¤¨¶ÄÉËÔßáØÎÐÜèìêèèåáÝÛØÓǼ­¨Ÿj9 Ä %*^ˆ––Ÿ·ËÌÁ¾È×ÝÜÛâëïîêèåáÚÙÜßÓ¼œŠ‰pC€ Ä % 7g‰‘š¶ÌÊ·«´ÍãëéèêíîîìêåÛÙÞåÚ»z}Š|R€  Å ->h†Ž‘ž¹Îͺ¬±ÊäñìáÙÚâêðïéÞÜàçÞÀ“z{Š[( Æ€.=a|‡’¥¿Ô×ʼ¼ÍãïåÍ·¶ÈáñóëàÞãëãÈ€yxX* Ç€€'0Mh|’¬ÈÝãÜÏÊÑßäÓ³•’©ÍæìæÞàæïæÍ¤„qk]C!€ È' 2Nl²ÐäêåØÐÐÔѾ …‚—·ÎÙÚÙáêóèΤdN8$€ ½…' =f”»×çêåÚÒÌǾ®‘’𦝼ÊÖäíóæÎ«‰c> „ ½„!9n¤ÊÞççäÝÖÍÀ°¥¤ª®¥—Ÿ¼ØéïðãÖÀ¦yB€ƒ ½ ƒ!H…»ØáããæäàÖۧ°ÂÆ®Œ|’»ßîìèßàÛÍŸ]€€€½ ‚##aŸÍààßáèëêãÓ¼²¾ÐÏ®‡{˜ÆèñêãÝæêä»{6 €Á  ‚$;}´ÔÚ××ÝæìîëâÐÆÍÙÒ´–“²ØîïæßÚààÜ¿‘V%‚à ‚$Q“ÀÐÍËÑÜåéìîìáÚÜáÚŵ¹ÑèîèßÝÙÕɲ›o=‚ Ä ‚$!\ÃȽºÅÖàäèíïëçæçäÜÖÛèðéÜÓÓÐÆ´­¨yF‚Ä  ‚ZœÄÆ´«´ÉØàåêíìêéèìñòåÒÄÁ¾¸­­ªšp=‚à ‚ P“ÀÈ´ ž°ÇÙâåäããåçëðñåϹ«£¦®¼´•]-  'K‰ºÊµ•ƒ‘°ÐáâÞÝßßÙÖÙàèíñéÔ´—‡“±ÍÂ’Q#€  Á €2 )N®À®ˆmwÈßàÛÛßÝÔÏÓÞéíðìÙµu…­ÑÈ—U&   Á;"9V{Ÿ¯Ÿ|bm“ÂÞåââãà×ÒØâìíîëÛ¹t}¡ÇÈ¥g1  Á/)B[x’ ”~o{›ÂÞëìêéåàßâçëèèåÚÁ¡†‚”³À¯z>€  Á/'BZtŠ™˜“™¬ÄÛëòñíêêëìéåààÞÛϺ ŽŠ¯­„H€ Ã.  Ê€(Q†¢ª«´ÀÍ×áéìéâÞâæàÏ¿¼ÇÖàãÜο»½Ä¹m;Ê1 (Y‡™›Ÿ±ÇÖÞãéëêãßáäßÓÇÇÑÝããÜÓÇþ¾µ¢zIÆ6  3bŠ•’–­ÈÜãåçéêèåääâÜ×ÙàæåàÙÔÏɼµ­¥ˆ[) Æ6 7e™—˜¬ÇÛâãäæêëëéèæååèëëåÞ×ÕÒʺ°©¥Œc2  Ç3b¥§¥²ÅÖÜÞàåêíìë€êëíîíçàÛ×ÏÅ·²¬¤†^1Ç6  (\’¯µ´¼ÉÓÕ×ÝæëëèçéêêééëìéåàÚÌÀ¶·±¡|P(  Å €-!Z’¯µ·ÃÐÔÑÓÛæëèãâæëíëéèçååâÛÌÀ·¹²žtF Å €$ Z¡£¬Ä×ÚÒÑÚåèãÝÜâéííëäÝØÙÜÛÐÅ·³©–pA€ Ä  €$$_—•£ÅÞáØ×ßæèäáâèíñôñçØÎÐÖÜ×ͼ°¢“qE€  Ä  €&_Š’‘¡ÅâçàÝâææäãæ€éëìå×ËËÓÝÝÖÁ°žqH À  €%#Wƒ“œ°ÐèìççìïïëééçߨÚãéæÞÜÞåäÞ˸¡ŽpI€ ¼ €%@iƒ›·ÖêìçåéîîæÛÒɾ³·ÉàëéææëèßȲ—€a>‚» ‚€% $Daƒ©ÏåçÞÔÖÜÞл¨™Ž…¦ÈÜÝÛÞéæ×¶˜zcG+… » †$ 1Nu§ÐÜË­ £¨š€iYRNYr“¤¢¢´ÔÜÅcF7'† º ˆ! 3o³Ï·€]YbYC/# !+™Å¨X !  A˜Æ§Nˆ  ¦‰€'ŒÁŸB€„€'‹Â¢DŒ  ¥€)ŽÁ=Œ(¡B€‡  ¥€1’Â>€ƒ€0’ßA€‡  ¥€5•Ü?€€€€5•Ü?€‡  —t8mk@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfldigi-4.1.06/data/mac/Info.plist.in0000664000175000017500000000232113507402064014010 00000000000000 CFBundleInfoDictionaryVersion 6.0 CFBundleIdentifier %%IDENTIFIER%% CFBundleName %%NAME%% CFBundlePackageType APPL CFBundleSignature %%SIGNATURE%% CFBundleDevelopmentRegion English CFBundleExecutable %%BINARY%% CFBundleVersion %%VERSION%% CFBundleShortVersionString %%VERSION%% CFBundleLongVersionString %%VERSION%% CFBundleIconFile %%ICON%% NSAppleScriptEnabled No NSHumanReadableCopyright Copyright (c) 2006-2008 Dave Freese W1HKJ and others NSPrincipalClass NSApplication NSMicrophoneUsageDescription Allow for using Sound input devices fldigi-4.1.06/data/mac/flarq.icns0000644000175000017500000024443313472116043013430 00000000000000icnsIis32鬯€+êë€ïròº¶² ¤óïèåèìîïí²—<ßëéÞàééçéé£lcˆåääàæìíéâßœH>%ÁÝÝßâäåèêèÛž0[ÒÕ×ÙÛÝßáãäã©) l×ÔÑÔ××ÙÛÝÝàÃ#ÚÏ×ÛÚØÕÖ×Ùô‚ ØÎÏÐ×ÛÔÏÒÖ…ËÌÌÎÎÌͱ‰È :ÓÖÝÞß㼸´¦ãÞÏÉÐ×ÛÝä³™>ÑÔѹ½ÒÐËÑÚ¤mdÇÅżË×ÙÐÁÄ›I?$§´·¼ÁÅÉÎÒι—1X¨¤©®²·»ÀÃÇÅž* m©¤¢¨¨­±¶¸½®#±˜©³°¬¥§«°Ê ­”—›©³¤™ §…Ž‘––‘”±÷ÿÿ‰ÊÂÝñüÃÇÏÑÑÕ¾º¶z“ºçÔн¶¿ÇÌÎܵš\a’ÎÃÀ¢§Á¿¹¿Ï¥ne[\ ³±±§¹ÈÊ¿­³šJ@Zn¡› ¦¬±¶¼Â¼¥•2[…‰”šŸ¥ª¯´²™+a’Šˆ†ŽŽ“™ž¡¨£$\9™zŽ›˜’ŠŒ‘—° [“uy}Ž›‰{ƒŒ…nppwxru±s8mk½Y ùò­;6`d#*~Ì÷ÿÿáu|ÁñþþàžŠàÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûïÖýÿÿÿÿÿÿÿÿÿÿÿÿæf"Èÿÿÿÿÿÿÿÿþ¬Èÿ}…ÏòÿÿÿÿÿÿÀ>ë 4Èôÿÿÿô£*uk·ìÈf il32bÿ¹ÇÂŽ€ï…ÆÁ¿½ƒ k‚êëíƒïºº¹µ°ªƒ Nòöòïïíçèéëíîƒï÷¬¦Ÿ™“‚©øîîïïì€ãâèéëìî€ïóÄ•‰ƒ~‚9âíëìííçàÞßáèææèéëìîìÅ‚zuoiŠëçèéêâ××ÙåíïíçãäæçéäÈvfa[V%ÉääåæçâÙÛâëíîïîéâáâäÞÇsRNID€kÝàáâãäååæèéêëìíîìãÞßÚÃz?<73€®ÜÝÝÞßàââãåæççéêëììäÛ×½†1,($€zPÍØÙÚÛÜÝÞßàáâãäåæçèêêãÖ¸‘, ’ÓÕÖרÙÚÛÜÝÞßàáâãäååçè๙1 :¯ÎÒÓÔÕÖרÙÚÛÜÝÞßàáâÞãåçÇ›Au¸ºÐÑÑÒÓÔÕÖרÙÚÛÜÝÞßÞÜáäÙŸW€ ‡åÞ×ÐÐÑÔÖÔÕÕרÙÚÛÜÝÜÚßá¢F…áÚÏÍÐÝâÙÓÖÕÔÖ××ÖÙÛÚÙ߈âÜÏÌÒßàÙÛæÝÔÓÓÕÔÓ×ØØŠÖÐÌÍÐÒÑÛäßãÛÎÐÒÒÓÖ׌€Ì ÍÌÎÑÕÝÚÏËÎÑÒƒÌÍÏÐÍÌÌΓ…ÌÿÆý€š€–ÉÄ ‡€Þ… ÈÃÁ¿ w‚ÓÕÙ݂޼¼»·²¬ YñîäÞÞÚÍÏÑÕÙÜÝ‚ÞFö›•­ðÜÝÞÞ×ÃÄÅÄÎÒÕÙÛÝÞÞîÅ—‘‹…=àÚÕØÚÙ̽¸¼ÃÎËÊÎÑÕØÛäÆƒ|vpj‹ßÌÏÑÔÁ©ª¯ÈÛÞÚÍÄÆÊÍÑ×Èwgb\W%ÅÊÅÈÊÍÁ®±ÁÖÚÛÝÝÒÂ¾ÂÆËÈtROIE€lͼ¾ÁÃÅÈÉËÎÐÒÕ×ÙÛ×ĸº¿Âz@=84€©ºµ·º¼¾ÀÃÅÇÉËÎÐÒÔ××Ų³¹†2,($€zQ¸¬®°³µ·¹¼¾ÀÂÄÇÉËÍÐÒÔ뮓, ª¥§©¬®°²µ·¹»¾ÀÂÄÆÈÉÍϼ¥š1 ;®£ž ¢¥§©«®°²´¶¹»½¿Á¾ÅÈʱ›Buº šž ¢¤¦©«­¯²´¶¸»º¹Àļ›X€ˆåº©™™›¢¨£¤¦¨«­¯±´¶¶´¼¾œG…¾±˜’š·Â­Ÿ¨¥£¦¨ªª®±±²ºˆÁµ™’žº½­²Ê·£ ¡¤¤¥©¬­Š¨š‘“›Ÿœ²ÅºÅ´š›Ÿ ¢§©Œ€‘ ’‘–œ¥¶±˜“—›žƒ‘”—š“‘’–“…‘ÿÆý€ÿšóû€ÿ–ËÆÉÛîùþÿÿ‡€Ð… ÊÅÃÁ¡°Ã×ê÷ýÿ‚ÂÅÊςо¾¼¹´®Œœ­¿Óîûæ×ÐÐË»½ÀÅÊÍÏÐGÑõůª£œ–fo{‰˜¬åçÎÏÐÑǯ°±²¼ÁÅÉÍÏÐÐéÆ˜’Œ†€[^cmwŸçÌÅÈËʹ¨¢¦¯¼¸·¼ÀÅÉÌÞÇ„}wql€[]c¶Öº½Àì–´ÍÐË»°²·»¿ÏÊxhc]X€[Zq͹±´·º¬•™­ÆËÍÏÎÁ­©®²¿ÉuSOJE€[ZšÂ¦©¬®±´¶¹½¿ÂÄÇÊÍǰ¡¤¯Ã|A=84[[Zh¶¥ £¦©«®±´¶¹¼¿ÁÄÇÇ±šž¸ˆ2-($[[Y‡­’•˜› £¥¨«®°³¶¹»¾Áî“©•-[[a¡’‰Œ’•—š ¢¥¨«­°³µ¶»¾¦œ2 [Zy^±Š„†‰Œ’”—šŸ¢¥§ª¬©²µ·¤žC[^•¸“}€ƒ†‰‹Ž‘”—™œŸ¢¥¤¤«°ªšZ[bŸÏ£Ž{{}…އˆ‹Ž‘“–™œŸŸž¦¨šI[[©˜zs}¡®”ƒ‰ˆ‹Ž•™™›£‚[[¬žzr¤¨”š¸ ‡„…ˆ‰Š“”ƒ[[‚Ž|qs}‚𲤱œ}~‚ƒ†Œƒ[…€q sqwŠŸ™zty}ƒqty|sqsw“…qÿÆl8mk·` ëô²K )ìÿÿó¬D E äíÿÿÿÿð JbŒËÚ–>\·óÿÿíÿÿÿÿÿÿº/ 0mÈùÿÿÿÿÿòÎ|,DÈúÿÿÿÿíÿÿÿÿÿÿÿ×§ÄëÿÿÿÿÿÿÿÿÿÿÿèÕêÿÿÿÿÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÛ‘èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿéW>ÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóâùÿÿÿøÒBqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°&]ëÿÿóhqÿÿâóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚF˜ÿÿÄ!µÞßÿÿÿÿÿÿÿÿÿÿÿÿÿû\-áÿbTýÿÿÿÿÿÿÿÿÿÿÿÿÏ~ tú ­ééÿÿÿÿÿÿÿÿö»#œ +RÜøóÿÿþýÎJ1Xa×õ’m0ih32 $ÿÿÿÕÂÁ©ÂÁÁ¿•ð‚ïˆÓÁ¿¾¼¸´‡)ÿ…êëìíî…¼»¹¶±­¨¤†¶ÿÿ ïïêçéêëìíîî„ï€ ýȲ¯«¦¢ž™•†Kóùòƒï éäåçääêëìíîîƒï ñúÒ¤ œ—“‹‡…£ûñíîïîäáâããÞæçèéêëìîî€ï ðòט‘‰…}y…5áòëììí€îêçàÞààÛäæåæçèéêëìíîïëÛ“‚{wsol„(‡ðêééêëëìæßÞÛÛÜáçíîêåäåæçèéêëìäÛ•sqmifb^„#ËéæççèééêÛÔÕרÝëïíæââäåæçèéß×fd`\YUR„kããäååæççèÝÔÕÖÜèííîî€ïéâàáâãåæÛЩ]WTPLIFƒ)´àáââãääåææääåèêêëìííîîïìäßßàáãÙȳZJGDA=:ƒ)RÔÝßààáââãääåæççèèéêêëììíîîçÞÜÞߨÁ¹`=<852/‚* š×ÜÝÝÞßßàáââããäåææççèéêêëììíéÞÚÜ×½·n21.+(%‚*<ÄÖÚÛÛÜÝÝÞßßàááâããäååæççèééêëìéÞØ×º²€*&$!+ÎרÙÙÚÛÛÜÝÝÞßßàááâããäååæççèééêèÜÕ»«‘*+)±ÐÕÖÖרØÙÚÚÛÜÝÝÞßßàááâããäååææçèéçÚ¾¥›4 €h¾ÐÓÔÔÕÖÖרØÙÚÚÛÜÜÝÞÞßàááâ€ãßåæçèæÉ¡žG €,´ÈÑÒÒÓÔÔÕÖÖרØÙÚÚÛÜÜÝÞÞßààáâÝàääåæÜ¥›_€W²±€Ð!ÑÑÒÓÓÔÕÖÖ×רÙÚÚÛÛÜÝÞÞßàßÚÞâãää¶–v ƒ‹·ÕÖÑÐÑÑÒÓÓÔÕÕÖ×רÙÙÚÛÛÜÝ€ÞÙÜáâãÊ“ƒƒš‚"ãßÖÐÎÏÐÑÔØÕÓÔÕÕÖ×רÙÙÚÛÜÜÝÝØÛààåtxŠâÞ×ÐÌÍÎÔßâàÕÒÓÔÔÕÕÖ×ר××Ú€ÛÖÜÞßàáÛÐÌÌÐØçåáÙÒÛßÚÓÓÔÔÕÖÖÓÕÙÙÚÙØÞáÜÐÌÍÐÕáÞÛÖÙèèâ×ÓÒÒÓÔÔÕÒÔרÙÚ‘ÕЀÌÏÓÓÔÒÙéçàáäÝÑÎÑÒÓÓÐÔÖוÌÎÏÍÑÚÙ×áæâ×ËËÏÑÑÒÓÕ–…Ì ÍÎÑØÙÙÕÍÌÊÎÐЙ†Ì ÍÏÐÒÐÌÌËÌΞ…ÌÍÌ¡ˆÌÿÿÿˆÿÿÉ€ª‚¨‚¤Äà ‚  ÄÃÂÁ €‹à‚ÞˆÖÃÁÀ½º¶ 9ÿ…ÒÔ×ÚÝ…Þƒµ½½»¸³¯ª¦ »ÿÿ ÞßÔÎÐÒÔ×ÙÛ݄ހýÉ´±­¨¤ ›— TôõãƒÞ ÐÆÉËÈÉÒÔ×ÙÛ݃ÞäùÓ¦¢ž™•‘‰ ¦úãÚÜÝ€ÞÜÆ¿ÁÄžÊÍÏÒÔÖÙÛÜÝÞÞáðØš“Š†‚~z€,9âëÖÖØÙÛÜÝÓ˾º¼½¸ÆÉÈÊÍÏÑÔÖØÛÜÞèÛ”ƒ€|xtpm‚*ˆïØÐÒÓÕÖØË»¹²³µ¿ÎÙÛÓÈÅÈÊÌÏÑÓÖØßÜ–urnjgc_„#ÌáËËÍÏÐÒÒ²£¦©ª¶Õ߀ÞÚÌÂÂÅÇÊÌÎÑÖØžgea]ZVS„(lâÍÅÇÈÊËÍ磤¨´ÎÙÚÜÝÞÞÝÒ½ÀÂÅÇÉÎѪ^XTQMJGƒ)´ÕÀÁÂÄÅÇÈÊÊÆÆÉÏÓÔÕרÚÛÝÞÙǺ»½ÀÂÆÈ´[KHEA>;ƒ)RÓº¼¾¿ÁÂÃÅÇÈÊËÍÎÏÑÒÔÕרÚÜÛιµ¸»¾Á¹a><9630‚* ›Êµ¶·¹»¼½¿ÀÂÃÅÆÈÉËÌÎÏÑÒÔÕרÚѹ°³¶¹¸o21.+(&‚*<·¯±³´¶·¹º¼½¿ÀÂÃÅÆÈÉÊÌÍÏÐÒÓÕ×Ò¸«¯²´+'$!+‚¾ª«­®°±³´¶·¹º¼½¿ÀÁÃÄÆÇÉÊÌÍÏÐÒÔе§«­‘++*¯«¥§¨ª«¬®¯±²´µ·¸º»½¾ÀÁÃÄÆÇÉÊËÍÏÐ̯£¦œ5 €,i¶¢ ¢£¥¦¨©«¬®¯±²´µ·¸º»½¾¿ÁÂÄÅ¿ÈÊËÍǨ ŸH €,žµ¥œŸ ¢£¥¦¨©«¬­¯±²³µ¶¸¹»¼¾¿Á»¿ÆÇÈÊ¿Ÿœ`€W³²€š"›Ÿ ¢£¤¦§©ª¬­¯°²³µ¶¸¹»¼¼¶¼ÂÄÅÅ¥—w ‚‹¸"¦¦›š›ž ¡¢¤¦§©ª¬­¯°²³´¶·¹¹´¸¿À¬”ƒƒ›‚"娚—˜š›¤¬¥¡£¤¥§¨ª«­®°±³´¶·±¶¼½Ã†yŠÁ¹«›’“•¢ºÂ½¤ ¢¢¤¥§¨ª««¬°±³³®µ¹»½¿²™‘‘›¬ÌÉÀ­Ÿ²»¯  ¢¤¥§§¤¨­®°¯®·Àµš‘”›¥Àº³¨­ÏЩ¡ŸŸ¡¢£¥¢¥©«¬®‘¥›‘‘’—¡¡£ž­Ñ̽¿Ç·ž™Ÿ ¡Ÿ¤§¨•€‘’––’›°­ª¿Ë©””™œž ¤–…‘ “–¬¯®¥““‘—™›™†‘“—šž™€‘”–ž„‘’“’€‘¡ˆ‘ÿÿÿˆÿÿÉ€ÿªþÿ¨ëôüÿ¤ÆÅÌØæòûÿ  ÆÅÄñ»ÈÕãðúþ€ÿŠÒ‚ЈØÅÿ¼¸—¡­¹ÅÓàîøþÿÿ…ÁÄÈË΅Ѓ¸¿¾½¹µ±¬¨‰”Ÿª¶ÃÐÝìüÿÿ ÐÑü¿ÂÄÈÊÍτЀþ˶³¯ª¥¡˜ou~ˆ’¨´ÀÚûñ؃Р¿²¶¹¶¸ÁÄÇÊÌ΃ÐÙùÔ§£Ÿš–’ŽŠaelt|†š§ß÷ÙËÎÏ€ÐMͳª­°±«·»¾ÁÄÇÉÌÎÏÐÐÔïØ›”Œˆ„|[\_dkr{‚£íåÇÆÈÊÌÎϹ¨£§¨£²¶µ·»½ÀÃÆÉÌÎÑåÜ•…‚}yuqn€[,\^ciq»í̾ÁÃįɹ¥¢™šª½ÉÌõ±´·º½ÀÃÆÉÛÝ—vtplhd`‚[\]vÙÚ¹¹»½¿ÁÁ™‡‹ŽžÅÑ€Ð˹­®±´·º½ÀÐÙŸhfb^[WTƒ[)Zœá¿±´µ·¹»½Ÿ‡ˆœ¼ÊËÍÎÏÐÏÁ­¨«®±´¶ÅÒ«_YURNKG‚[*ZgÆÎ¬¬®°±³µ··²²¶¾ÂÄÅÇÉËÍÎÐɳ¤¤¨ª­ºÊ¶\LIEB?<‚[*Y‹Ô±¤¦¨ª¬®¯±³µ·¹»¼¾ÀÂÃÅÇÉËÍͼ£ž¡¤®Â»b?=:730‚[*a´ÁžŸ ¢¤¦¨ª¬­¯±³µ¶¸º¼¾ÀÁÃÅÇÉËÀ¢˜›¢¹»p32/,)&[+Y}Ť–™›ž ¢¤¦¨©«­¯±²´¶¸º¼½¿ÁÃÅÇÁ¡’—¯¶ƒ+'$"[+]¢´‘‘“•—™šœž ¢¤¥§©«­®°²´¶¸¹»½¿ÁþŒ£°“+€[,Zqµ–‰Œ‘“•—˜šœž ¡£¥§©«¬®°²´¶·¹»½¿»–•©ž5 [‘²‰„†ˆŠ‹‘“•–˜šœžŸ¡£¥§©«¬®°±¬µ·¹»´–¡¢I [[Ziª¶‘€‚„†‡‰‹‘’”–˜šœŸ¡£¥¦¨ª¬¦«²³µ¸­Ÿa[[Z‡´´||}}€‚ƒ…‡‰‹Ž’”–˜™›Ÿ¡¢¤¦§ §®¯±²›šy €[[c¡·"‹Œ~|~€ƒ…†ˆŠŒŽ’”•—™›Ÿ ¢£ž¢ª«­›–†[[c¨‚"°¤Ž|xz|~ˆ’Š…‡ˆŠŒŽ’“•—™›Ÿ ›Ÿ¦§­“{[[Zƒ­£‘~rtv†¤­§‰€ƒ††ˆŠŒŽ‘‘“—™šœ–ž£¥„€[ƒ§«™|qq}’º¶«“‚š¤–ƒ„†ˆŠŒŠŽ“•—–— …[[…«|qu}Šª£œ”½¾­Ž…‚‚„†ˆ‰‡Š‘“•†[[†Š}qqsx„„ˆ”Àº¨ª´ ‚|€‚„…ƒˆŒŽ‡[Š€qrwxs~˜”ª¸®vw{~€‚…ˆˆ[Š…q tx€“–•Šsttx{}™†qtx|{€quwž„qrsr€q¡ˆqÿÿÿˆh8mk °fßö¸P Ýÿÿõ²J Dáÿÿÿÿò«Cd¾óãÿÿÿÿÿÿï£<,g€N*}Ñüÿÿãÿÿÿÿÿÿÿÿìu%^zµæÿÿö¸]' =–âÿÿÿÿÿãÿÿÿÿÿÿÿÿÿî‡'iÖþÿÿÿÿÿÿÿÿüå¸a'©ïÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿ¢.>r°ãýÿÿÿÿÿÿÿÿÿÿÿÿÿúdžjbÅÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿèàóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿýðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÅE©ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿãB iÜþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿïÿýÏIAëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷–Ãðÿÿÿÿïÿ©;óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá Žÿÿÿÿðñ?Eùÿÿý÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõƒ-ãÿÿÿó³ Îÿÿù}Ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøl „þÿÿèW?Åè®SåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÒÿÿ®) vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÐK]öÿGWúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎE žÿ }ÛóÛ÷ÿÿÿÿÿÿÿÿÿÿÿÿúÕ> º <9Õÿÿÿÿÿÿÿÿÿÿÿ§L#8ªÚ³Íÿÿÿðâäª 7°ðñq)+ it32KçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÁú€Á÷ƒÁõ…ÁóƒÁÀ¿¾¼Ä廬ÁÀ¿½¼º¸¶Á†ï¡Æ€Á ÀÀ¾½»¹·¶´²°¾‹ïÃÁÀÀ¿¾¼»¹·µ³±°®­«¶ëíîï™À¿¿¾½¼º¸¶´³±¯­¬ª©§¥˜)–êê€ëì€íîî‘½½¼»¹·µ´²°¯­«©¨¦¥£¢ ˜Qóÿÿ“èé€ê€ëìì€íîî‘»»º¸¶´³±¯®¬«©§¦¤¢¡Ÿžœ›—­ÿðí€èéé€ê€ëìì€íîîïŠÿâ»·µ´²°®­«ª¨§¥£¢ ž›š˜–•—:ìþ‚ÿ‹ïêæ€çèè€éêê€ëìì€í€îŽï‡ÿÿò»±¯®¬«©¨¦¤£¡ ž›™—–”“‘–‘ÿýþþüúýˆƒïí€å€æççèèçàéêê€ë€ìíí€îŽïƒþýü÷¿«ª¨§¥¤¢ Ÿœš™—•“’Œ‹– &Ûýüüýõððïìãää€å€æççÖÝ€é€êëë€ìíí€îïñúúùøÉ¥¥£¡ ž›š˜–•“’Ž‹Šˆ‡†–u€úûùðïìââãã€ä€åæäÒã€èéé€ê€ëìì€íîîŽïö÷ööÕ¡Ÿœš™—–”’‘ŽŒ‹‰ˆ†…ƒ‚€•Åúøùùòí€îïéáá€âãã€äåæÛ×çèèéé€êëë€ì€íîî‹ïóôóóà¡™˜–•“’ŒŠ‰‡†„ƒ~|{•Yð€÷õî€íî‰ïîã€àáá€âããääâÓ䀿€çèè€éêêëë€ì€íîîˆïðñðï禓’‘ŽŒ‹‰ˆ‡…„‚}{zyxv” ­÷ôõöð€ìíî†ïæÞ€ß€à€áââãàÓãäå倿€çèèéé€ê€ëìì€íîî†ïîíëé±ŒŠ‰ˆ†…ƒ‚€~}{zxwutrq”@åóóôòìëëìíî‚ïéàæéèàÞß߀àááâÜÓãã€äå倿çç€èéé€ê€ëìì€íîî‚ïíêéè鿊‰‡…„‚~|{yxwusrponl“’óññòíêêëìíîïìãêîíèÞÝ€ÞßßààáÕÖ€âãä€åææçç€èéé€ê€ëìì€íîîïïíèæåæÌ‰ƒ‚€}{zywvusqpnmljig“*Ôðïðïêéêëìí îìåèêçåßÛÜÜ€ÝÞÞßßÐÜãæéìíêæããääå倿€çèèéé€êëë€ì€íîìåäãâÖŽ}|{yxwutrqonmkihgedc’v€íîëèéêëì íìãááßÞÜÚÚÛÛ€ÜÝÝÞáßêî‚ïîêäãã€äå倿€çèèéé€êëë€ìíëâààßÛ˜wwvtsrpomljihfecb`_^’Áíëìë‚èéêëììã€×€ØÙÙ€ÚÛÛÜÜáí‡ïíçââãã€äå倿€çèèéé€êëáÝÝÜÛ¨srqonmkjhgfdca`^]\ZY’\æééêèçèéê ëëêÚÕÕÖÖ×׀؀ÙÚÚÝëŠïêäáââ€ãää€å€æççèèééêßÚÚÙÙ¸rmljihfedba_^\[ZXWUT‘ ªéçèèæçèé€êç×ÔÔÕÕ€Ö€×€ØÚçŒïíæ€áââ€ãää€åææ€çèè€éÞØ×ÖÖÄvhgfeca`_^\[ZXVUTRQP‘CÛæåæ‚åæçè€éçÕÒÓÓÔÔ€ÕÖÖ××Ùäí€îŠïîéâààááââ€ãää€åææ€çèèÞÔÔÓÒÍbba`^][ZYXVUSRQONMK‘åãƒäåæçèç×ÑÒÒ€ÓÔÔ€ÕØäìíîˆïìå€à€á€âããää€å€æçÞÒÑÐÏÏ‘^^\[ZXWUTSRPOMLKIHG.ÌâáâãäåæçèèàӀрÒÓÓÖÜæëìíî†ïîèáß߀à€áââãã€äååæßÐÎÍÌÍ£[YWVUSRQONMLJIHFEDCwàÞßà€âã‚ä€åæç äÞÛÙÙÚÜÝàåé‚ëìíî…ïëäÞÞß߀àáá€âãã€äàÍËÊÉʳ_TSRPONMKJIGFECBA@?»ÞÝÝßááâãäåæççèçèéêëìíîƒïîç߀Þß߀àáá€âããàÌÈÈÇÆ½iONMLJIHGFDCBA?>=<:]ÙÚÛÜààáâãäåæçèéêëìíî‚ïëâ€ÝÞÞß߀àááââàÌÅÅÄÃÂzJJIGFEDCA@?=<;:976Ž¥ÚØÙÝßà‚á€âãäåæçèéêëìíî€ïîæÞÜÝÝ€Þß߀àááÍÃÃÂÁÂŽGFDCBA@>=<;9876432ŽEÏÖÖØÝßà‚á€âãäåæçèéêëìíîïïéßÛÜÜÝÝ€ÞßßààÏÁÀ¿¾¿¡JA@?>=<:987543210/ÖÔÕÙÝ€ÞßàáâãäåæçèéêëìíîëáÛÛ€ÜÝÝ€ÞßѾ½½¼¼¯S<<;:87654310/.-,+0ÂÒÒÔÜÝÞ€ßàáâãäåæçèéêëìíîîíãÛÚÛÛ€ÜÝÝÞÔ½»º¹¹µd787543210/-,+*)('ŒvÑÏÐ׀܂ÝÞ€ßàáâãäåæçèéêëì‚í"äÛÙÚÚÛÛÜÜÝÖ¼¸¸·¶·y44310/.-,+*)'&%$$Œ²ÎÍÐÙÛÛÜ‚ÝÞ€ßà‚á€âãäåæçèéêëì€í!æÛØÙÙÚÚÛÛØ½¶µ´´µ60/.-,*)('&%$#"! Œ^ÊËÌÔ€Úۀ܂݀ÞßàáâãäåæçèéêëìíçÛר€ÙÚÙ¿³³²±² >++*)('&%$"! ‹ ÊÈÌ×ÙƒÚۀ܂݀Þ߀à‚áâãäåæçèéêë!ììèÛ×רØÙÙñ°°¯®©N&'&%$#"! ‹GÂÆÇÐØØÙ‚Úۀ܂ÝÞ€ßàáâãäåæçèéê€ëìèÚÖ€×ØÈ¯®­­¬­d##""! Š ‹ÆÄÈÕ×ר€Ù‚Ú€ÛÜ‚ÝÞ€ßàáâãäåæçèéêëëçÚÕÖÖ×ͯ¬««ª«|# Š3¶ÂÂÎÖÖר€Ù‚Ú€Û܂݀Þßà‚á€âãäåæçèé€ê ëçÙÔÕÖа©©€¨+‰uÁ¿ÄÓւרÙÚۀ܂݀ÞßàáâãäåæçèéêêæØÔÔÓ´§§¦¥¥:€  ‰!¨¾½ÊÔՀւר€Ù‚Úۀ܂݀Þßàáâãäåæçè€éêäÖÓÔº¥¥¤££¢Q ˆ^»ºÀÑÔÕ€Ö‚×€ØÙ‚Úۀ܂ÝÞ€ßàáâãäƒåææçèééãÔÓÁ¤£¢¢¡£j ˆ˜º¹ÇÓÔÕÖר€Ù‚Ú€ÛÜ‚ÝÞ€ßàáâãäåßÙåæç€èéàÓȦ¡  Ÿ¡€ ˆH³¶·ÁÏÒÒ€Ó‚ÔÕÖר€Ù‚Ú€Û܂݀ÞßàáâãääàÓä€åæçèçÝΪŸŸ€ž‘( ‡ …µ´µµ¿‚Ò€Ó‚ÔՀւרÙÚۀ܂݀ÞßàáâãÒßää忀çæØ²œœ›™> ‡5ª²²³´±Ó€ÑÒÓÔՀւר€Ù‚Úۀ܂݀ÞßàáâãØÖ‚äåæç䜛€š ›Y€†s³€±²ƒÑÒÓÔÕ€Ö‚×€ØÙ‚Úۀ܂ÝÞ€ßàáââàÐÞ€ãäåææç×¢€™ ˜šr €‰%¢²±ÐЂÑÒÓ‚Ô€Õւ׀؀قڀÛ܃ÝÞÞßà€áâÙÐáâãäåã±—˜€—…Œa³±ƒÏ‚ÐÑÒ€Ó‚ÔՀւרÙÚÛ€ÜÝÞßàáÕÑßâãäæÇ˜–€•.—³€±†ÐÏÏÐÑÒ€Ó‚ÔՀւר€Ù‚Úۀ܂݀Þ߀àÖÎÜâáâãääÕ¥€”“”I’M°€±ˆÎÏÐÐÏÐÑÒÓÔÕ€Ö‚×€ØÙ‚Úۀ܂ÝÞ€ßàÚÎ×áâ€ãØ·”“’’”e г±±‹ÞÛÓ€ÏÐÑÒÓÔÕÖ×€ØÙ‚Ú€ÛÜ‚ÝÞßßÜÏÔààáâß¿“’‘‘’x ;«²±ŒâáÝÖÑπЂÑÒ€Ó‚ÔÕÖר€Ù‚Ú€Û܂݀ÞßÞÐÔ߀à‚áâ’‘‘’yI¸åãàÞÛØÓÏÎÏÐÑ‚ÒÓÓ‚ÔՀւרÙÚÛ€ÜÝ€ÞÝÎÕàßà€áªããàÝÛØÖÓЀÎÏÐÑÒÖÚÚ×ÓÒÓÔ€Õւר€Ù‚ÚÛ€ÜÝÞÜÌÙ߀à᪠äâàÝÛØÖÓÐÎÌÍ€ÎÏÐÓÜâãääßÖ€ÒÓÔÕ€Ö‚×€ØÙ‚Úۀ܀Ý×Ì݀ހ߫ äâàÝÚØÕÓÐÎÌÌÍÍÎ ÏÒÜàáââäåâ×ÑÒÓÔÕÖרÙØÙ‚Ú€ÛÜÝÑÑÞÝ€Þß« ãâßÝÚØÕÓÐÍ€ÌÍ ÎÑÚÝàßßáâãäáԀтÒÓÓ‚ÔÕÖרØÒÎ×ÙÙ‚Ú€ÛÜÜÛÌ×€ÝÞ¬ ãáßßÜ×ÕÒÐ̓ÌÍÐØÚÜééâßàáâãÚÐЀÑÔ××ÕÓÒÓÓ‚ÔÕ€Ö‚×ÐËÕØ€Ù‚Ú€ÛÕÍÜÝÝ®áßäæÙÕÒÐ̓ÌÏÕØØÝíïìçáààáÞÑÐÐÓÛáãäãßÖÒÒÓÔ€ÕÖ€×ÒËԀ؀كÚÕØØ¯ßÞâéÞÔÒÏÍÌÒÓÕÖÖáìëéçåâàßÝÐÏÕÝàáâãäåãÖÑ€ÒÓ‚Ô€Õ€Ö×ÓËÓ×רØÙÚÛ±ÜÝäâ×ÑÏÍÌÐÑÒÓÔÕãçåäâàÞÝÝÙÏÔÛÜáéæââãäàÓ€ÑÒ€Ó‚ÔÕÖÓËÓר€Ù³ÚÝÞÚÓÏÌÍÎÏÐÑÒÔàâàÞÝÛÚÚÛÔÒØÙÜéïïìåáâãـЀÑÒ€Ó‚ÔÕÕÖÒÉԃ׀ØÙ´ÔÖÕÓÏ€ÌÌÍÍÎÏÐÑÚÝÛÙ×Ö×ÙØÒÕÖ×á€ï îìåàáÞ×ÚÚ×ӀтҀӂÔÕÐÊÔ€ÖרֶÌÏÏÌ€€ÌÍÍÎÏÒÖÖÔÒÒÖ×ÕÒÓÔÖçîìëéèæàÞàâ€äáÚÒÐÎÐÑÑÒÓ€ÔÎË€Õ€Ö××¾‚ÌÍÍÎЀÑÓÔÕÑÐÑÒÕæéçæäãâÞÝÞæìêæãäÞÒÈÄÌÑÒÓÔËÍÕÖÖ¿„Ì#ÍÍÎÏÐÑÒÑÍÎÏÐÒáãâáßÞÜÚÚÝéììêæââÙÏËÄÆÏ‚ÑÒÓÓÒЀÔÕÔÀ†ÌÍÎÎÐÑÎÌÌÍÎÏØßÝÜÛØÖ×ØÞ€ç ææäàÞÑÏÎÈÃÉ€ÐÑÒÓÔÔÈÌÍÎ΂ÌÍÏÔ×ÖÔÓÔÕÖÞäãââáàÞÞÔÎÎÏÌÄÄÎÐÑÒÒÆ‘ÌÍÎÏÐÑÒÓÕÜßÞÝÝÜÛÛÜÔÍÎÇÂÍÏÏÐÑÑÈ’Ì ÍÍÎÐÑÓÙÚÚÙ€ØÙÙÓÌÍÎÇÄÎÏÐÐÊ“Ì ÍÎÐÑÓÕÕÔÕÕÖÖ×ÑÌ€ÍÂË€ÎÏÏÍ“Ì ÎÏÏÐÑÑÒÓÓÔÕÏ„ÌÊËÍÍÎÎÔŽÌ ÍÍÎÎÏÐÐÑÒÒÍ…ÌÚ‘ÌÍÍÎÏÏΆÌÛ“ÌÍ͆ÌÞ›Ìá‚Ì’Ìé‰Ìó†ÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ€ú‚ø„ö†ôˆòˆð‡íÆê€Ã†åƒÃ †á…à †݃ÃÂÁÀ¾ †¬Þ¦‚ÃÂÁ¿½¼º¸ †§†Þ¡È€ÃÂÂÀ¿½»¹·¶´² …¢‹Þ%ÅÃÂÂÁÀ¾¼»¹·µ³²°¯­ ƒ™ÛÙÙÚÛÜÝŽÞ™*ÂÁÁÀ¿½¼º¸¶´³±¯®¬«©§ €9– ÔÓÕÕÖ×ÙÚÚÛÜÝÝÞ“3À¿¿¾¼»¹·µ´²±¯­«ª¨§¥¤¢ ^ôÿÿ“ÏÐÒÓÔÔÕÖרÙÚÛÛÜÝÝÞŽ2¾½½»º¸¶´³±°®­«©¨¦¤£¡ ž ³ÿàÚÐÎÏÐÑÒÒÓÔÕÖרÙÚÛÛÜÝÝŽÞŠÿã½¹·µ´²°¯­¬ª©§¥¤¢ Ÿœš˜—€  Gíþ‚ÿ‹€ÞÝÒËÌÌÍÎÏÐÑÑÒÔÕÕÖרÙÚÛÛÜÝÝÞ‡ÿÿò¼³±°®­«ª¨¦¥£¢ Ÿ›™˜–•“’€€ € —ÿýþþùõüˆƒÞÙÉÈÉÉÊËÌÍÎÏÎÅÑÓÓÔÕÖ×רÙÚÛÜÝÝÞƒþýüøÁ­¬ª©§¦¤¢¡Ÿžœ›™—•”’‘ŽŒ€€€ 1Ýý€üêßßÞƒ‡Þ×ÅÅÆÇÈÈÉÊËÌ̵¿ÐÐÑÒÓÔÕÖÖרÙÚÛÜÝÝÞâùúùøÊ§§¥£¢ Ÿœš˜—•”’‹Šˆ‡€€€€ {€úûôßÝÞ!×ÂÂÃÄÅÆÇÈÈÉËȰÇÎÏÏÐÑÒÓÔÔÕÖרÙÚÛÜÝÝŒÞàò÷ööÖ£¡Ÿžœ›™˜–”“‘Ž‹‰‡†„ƒ€€€€ ÇúøùùçÛÜÜÝÝŒÞ$Ñ¿ÀÁÂÂÃÄÅÆÇÈɼ¶ÌÌÍÎÎÏÐÑÒÓÔÔÖ×רÙÚÛÜÝÝŠÞíôóóà£›š˜—•”’‘ŒŠ‰‡…„‚~}€€€^ñ÷÷øñÛÙÚÚÛÜÜÝ݈Þ(Ûļ½¾¿ÀÁÁÂÃÄÅÆÃ°ÈÉÊËÌÍÍÎÏÐÑÒÓÔÕÖÖרÙÚÛÜÜ݇Þêñðï稕”“‘Ž‹‰ˆ†…ƒ‚€~}|zyw€€€¯÷õõöãÖØØÙÙÚÚÛÜÜÝÝ…Þ+˹º»»¼½¾¿ÀÀÁÂÃÁ®ÅÇÇÈÉÊËÌÍÍÎÏÐÑÒÓÔÕÖÖרÙÚÛÛÜÝ„Þæîíì겎ŒŠ‰‡†„ƒ€~}{zxwusrƒ€ DæóóôîØ€Ö ×ØØÙÙÚÚÛÜÜÝÝ€Þ0ßÒ½ËÒо¹º»¼½¾¿¿Áº®ÄÄÅÆÆÇÈÉÊËÌÍÎÏÐÐÑÒÓÔÕÕÖרÙÚÛÜÜÝÞãëêééÀ‹Šˆ†…ƒ‚€~|{yxvtsqpom…€•óñòòßÒÔÔÕÕÖÖרØÙÙÚÚÛ€ÜPÝ×ÅÓÛÙк·¸¹¹º»¼½¿°²ÁÁÂÅÆÅÆÇÇÈÉÊËÌÍÎÎÏÐÑÒÓÔÔÕÖרÙÚÛÜÜÝÞáççææÍŠ„ƒ€~}{zywvtrqonmkjh‡‚€€j.ÕðïðêÓÑÒÓÓÔÔÕÖÖ×רØÙÙÚÚÛØÊÐÓÍÈ»³´µ¶··¸¹ºº¨¹ÄËÒ×ÙÔÊÅÅÆÇÇÈÉÊËÌÍÍÎÏÐÑÒÓÓÕÖÖרÙÚÛÜÞääãâÖ~~|{yxvusrqonljihfedŠ€.xîíîîÛÏÐÐÑÒÒÓÓÔÔÕÕÖÖרØÙ×ÄÀ¿¼¹µ°°±²³´µ¶¶¸ÀÃÕÛ‚Þ7ÜÓÇÃÄÅÆÆÇÈÉÊËÌÌÍÎÏÐÑÒÓÔÕÕÖרÙÛááàßÛšyywutsqpnmljigfdca`_Œ.ÂíìíæÐÍÎÏÏÐÐÑÑÒÓÓÔÔÕÕÖÖ×Ä©ªª««¬­®¯°°±²³´ÀÚßß…Þ5ÚÍÂÁÃÄÅÆÆÇÈÉÊËÌÌÍÎÏÐÑÒÓÔÕÕÖØÝÞÝÜÜ©tsrqonlkihgedba_^][ZŽ€+]æéêêØËÌÌÍÎÎÏÏÐÐÑÑÒÓÓÔÔÕÓ°¤¦§¨©ªª«¬­®¯°°·Õ߈Þ4ÝÔÅÀÁÂÃÄÅÆÆÇÈÉÊËÌÍÎÏÏÐÑÒÓÔÕÚÛÚÙÚ¸somkjigfecb`_]\[YXVU, «éçèâÌÉÊËËÌÌÍÎÎÏÏÐÐÑÑÒÓÓͨ¢£¤¥¦§¨©©ª«¬¬°ÌÝÝŠÞ2ÙËÀ¿ÀÁÂÃÄÅÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÖØ×ÖÖÅwihgfdba`_]\ZYWVUSRQ‘CÛæåæÔÇÈÈÉÉÊÊËÌÌÍÍ΀ÏÐÑÒ̦Ÿ ¡¢£¤¥¦§§¨©­ÇÚÛ܀݈Þ1ÝÒ½¾¿ÀÁÂÃÃÄÅÆÇÈÉÉÊËÌÍÎÏÓÕÔÓÓÍ‚ccba_^\[ZXWVTSQPONL2‘åãäÞÈÅÆÇÇÈÈÉÉÊÊËÌÌÍÍÎÎÏÐÍ©œž  ¡¢£¤¥¥¬ÅØÙÙÚÛÛÜÜÝ݇Þ/ØÈ½¼½¾¿ÀÁÂÂÃÄÅÆÇÈÈÉÊËÌÏÒÑÐÏÏ’__]\[YXVUTRQPNMLJIH5.ÌâáâÐÃÄÄÅÆÆÇÇÈÈÉÉÊËËÌÌÍÍÎÏ¿¢››œžŸ ¡¦´ËÖ×רØÙÚÚÛÛÜÜÝÝ…ÞÜÏ¿º»¼½¾¿ÀÀÂÂÃÄÅÆÇÈÈÉÌÏ΀ͤ\YXWVTSRPONMKJIGFEC(wàßàÚÄÁÂÃÃÄÄÅÆÆÇÇÈÈÉÉÊËËÌÌÍÍÆ¹±®¯°³·¾ÈÒÔ€Õ Ö×רØÙÙÚÛÛÜÜÝÝ„Þ,ן¹º»¼½¾¿ÀÁÂÂÃÄÅÆÇÉÌÌËÊʳ`UTRQPOMLKIHGEDCBA?%»ÞÝÞÌ¿ÀÁÁÂÂÃÃÄÄÅÅÆÇÇÈÈÉÉÊÊËËÍÎÍÍÎÏÐÐÑ€ÒÓÓÔÔÕÖÖ×רØÙÙÚÚÛÜÜÝÝ‚Þ+Üͼ·¸¹º»¼½¾¿ÀÁÁÂÃÄÆÉÉÈÇǾjOONMKJIGFEDBA@?=<; ^ÙÚÜÕÀ¾¾¿¿À€Á1ÂÃÃÄÄÅÅÆÇÇÈÈÉÉÊÊËËÌÍÍÎÎÏÏÐÐÑÒÒÓÓÔÔÕÖÖ×רØÙÙÚÚÛÜÜÝÝÞ)Ö·¶·¸º»»¼½¾¿ÀÁÁÂÆÆÅÅÄÃ{JKJHGFDCBA?>=;:987ަÛÙÙÈ»¼½½¾¾¿¿ÀÀÁÁÂÃÃÄÄÅÅÆ€ÇÈÉÉÊÊËÌÌÍÍÎÎÏÏÐÐÑÒÒÓÓÔÔÕ€Ö6רØÙÙÚÛÛÜÜÝÝÞÞÛʸµ¶·¸¹º»»¼½¾¿ÀÃÄÃÂÁÂHFEDCA@?><;:976543ŽDFÏ××Ò¼ºº»»¼½½¾¾¿¿ÀÀÁÂÂÃÃÄÄÅÅÆÆÇÇÈÉÉÊÊËÌÌÍÍÎÎÏÏÐÐÑÒÒÓÓÔÔÕÕÖÖרØÙÙÚÚÛÜÜ€Ý&Ò»³´µ¶·¸¹ºº»¼½ÀÂÁÀ¿À¢JBA@?=<;:87653210/oÖÔÕÅ·¸¹¹ºº»»¼½½¾¾¿¿ÀÀÁÁÂÃÃÄÄÅÅÆÆÇÈÈÉÉÊÊËËÌÍÍÎÎÏÏÐÐÑÒÒÓÓÔÔÕÕÖ×רØÙÙÚÚÛÜÜÝÖ¿²²´´µ¶·¸¹¹º½¿¾½¼¼¯T==<:98754321/.-,+@1ÃÓÓι¶¶··¸¹¹ºº»»¼¼½¾¾¿¿ÀÀÁÁÂÂÃÄÄÅÆÆÇÇÈÈÉÉÊÊËËÌÍÍÎÎÏÏÐÐÑÒÒÓÓÔÔÕÖÖ€×+ØÙÙÚÚÛÜÙı°²²³´µ¶··º¼»»º¹¶d887654320/.-,+*)'ŒJvÒÐÑÀ³´µµ¶¶··¸¸¹ºº»»¼¼½¾¾¿¿ÀÀÁÁÂÂÃÄÄÅÅÆÆÇÈÈÉÉÊÊËËÌÍÍÎÎÏÏÐÐÑÑÒÓÓÔÔÕÕÖÖ×רÙÙ€Ú"ȱ®°±±²³´µ·º¹¸·¶·y543210/.-+*)('&%$Œp ³ÏÎÉ´²²³´´µµ¶¶··¸¸¹ºº»»¼¼½¾¾¿¿ÀÀÁÁÂÃÃÄÄÅÅÆÆÇÇÈÈÉÊÊËËÌÍÍÎÎÏÏÐÐÑÑÒÓÓÔÔÕÕÖÖ×רÙÙÚ˲¬®¯°°±²´··¶µ´µ60/.-,+*)('%$#"! Œ$_ËË̼¯°±±²²³´´µµ¶¶··¸¸¹ºº»»¼¼½¾¾¿¿ÀÀÁ€ÂHÃÄÄÅÅÆÆÇÇÈÉÉÊÊËËÌÌÍÎÎÏÏÐÐÑÑÒÓÓÔÔÕÕÖÖ×רÙͲª¬­®¯¯±´µ´³²³ ?,+*)('&%$#"! ‹q¡ËÉű®®¯¯°°±²²³³´´µµ¶··¸¸¹¹ºº»¼¼½½¾¾¿ÀÀÁÁÂÂÃÃÄÄÅÆÆÇÇÈÈÉÉÊÊËÌÌÍÍÎÏÏÐÐÑÑÒÒÓÓÔÕÕÖÖ×ØÎ³©ª«¬­­°²±°¯¯ªO'('&%$#" ‹CGÃÇǸ«¬­­®®¯¯°°±±²³³´´µ¶¶··¸¸¹¹ºº»¼¼½½¾¾¿ÀÀÁÁÂÂÃÃÄÅÅÆÆÇÇÈÈÉÉÊÊËÌÌÍÍ΀ÏÐÑÑÒÒÓÓÔÕÕÖ×᧨©ª«­°¯®€­e$$#"! Š ‹ÇÅÀ¬ªª«¬¬­­®®¯¯°°±±²³³´´µ€¶T·¸¸¹¹ºº»¼¼½½¾¾¿ÀÀÁÁÂÂÃÃÄÄÅÆÆÇÇÈÈÉÉÊËËÌÌÍÍÎÎÏÏÐÑÑÒÒÓÓÔÕÕͰ¥¦§¨ª­­¬««¬|$ Š&3·Ã󧨨©ªª««¬¬­®®¯¯°°±±²³³´´µµ¶¶··¸¹¹º€»H¼½½¾¾¿¿ÀÀÁÂÂÃÃÄÄÅÅÆÇÇÈÈÉÉÊÊËÌÌÍÍÎÎÏÏÐÑÑÒÒÓÓÔÌ®£¥¦§ª«ª©¨©+‰\vÂÁ¼¨¦¦§¨¨©©ªª««¬¬­®®¯¯°°±±²³³´´µµ¶¶·¸¸¹¹ºº»»¼½½¾¾¿¿ÀÁÁÂÂÃÃÄÄÅÅÆÇÇÈÈÉÉÊÊËÌÌÍÍÎÎÏÐÐÑÑÒÒÓÊ«¡£¤€¨§¦¦ž; ‰s"©¿¿°£¤¥¥¦¦§¨¨©©ªª««¬¬­®®¯¯°°±±²³³´´µµ¶··¸¸¹¹ºº»»¼½½¾¾¿¿ÀÁÁÂÂÃÃÄÄÅÆÆÇÇÈÈÉÉÊÊËÌÌÍÍÎÎÏÐÐÑÑÒǧ ¡¥§¦¥¤¤£Q ˆ^¼¼¸¥¢¢£¤¤¥¥¦¦§€¨©ªª««¬­­®®¯¯°°±±²²³´´µµ¶€·¸¹¹ºº»»¼½½¾¾¿¿À€Á4ÂÃÃÄÄÅÅÆÇÇÈÈÉÈÈÊËÌÌÍÍÎÎÏÏÐÑãž¡¤¤££¢£j ˆt™»º¬Ÿ ¡¡¢¢£¤¤¥¥¦¦§§¨¨©ªª««¬¬­®®¯¯°°±±²³³´´µµ¶¶··¸¹¹ºº»»¼½½¾¾¿¿ÀÀÁÁÂÃÃÄÄÅÅÆÇÈÀ¸ÊÉÊÊËÌÌÍÍÎÎÏϽŸ¢¢¡¡ ¡ ˆtI´··®¡ŸŸ  ¡¡¢¢£¤¤¥¥¦¦§§¨¨©ªª««¬¬­®®¯¯°°±±²³³´´µµ¶¶··¸¹¹ºº»»¼½½¾¾¿¿ÀÁÁÂÂÃÃÄÄÅÆÁ¯ÇÇÈÉÉÊÊËÌÌÍÍÎε›Ÿ ŸŸžž’( ‡ †¶µ¶¶®žžŸ  ¡¡¢¢££¤¥¥¦¦§§¨€©Vª««¬¬­­®®¯°°±±²²³´´µµ¶¶··¸¸¹ºº»»¼¼½¾¾¿¿ÀÀÁÁÂÂÃÄÄ®¿ÆÇÇÈÈÉÉÊÊËËÌÍË«›žœœš? ‡P5«³³´µ¸›œœžŸŸ  ¡¡¢¢££¤¥¥¦¦§§¨¨©©ª««¬¬­®®¯¯°°±±²²³³´µµ¶¶··¸¸¹ºº»»¼¼½¾¾¿¿ÀÀÁÁÂõ³€ÅÆÆÇÈÈÉÉÊÊËÌÄ¢œœ››šœY€†t´€²f³›œ›œœžŸŸ  ¡¡¢¢££¤¥¥¦¦§§¨¨©©ª««¬¬­­®¯¯°°±±²²³´´µµ¶¶··¸¸¹ºº»»¼¼½¾¾¿¿ÀÀÁ¿ª½ÃÄÄÅÅÆÆÇÈÈÉÉÊ˸›šš™™›r €‰%£³²W›š››œœžžŸ  ¡¡¢¢££¤¥¥¦¦§§¨¨©©ª««¬¬­­®¯¯°°±±²²³´´µµ¶¶··¸¸¹ºº»»¼¼½¾¾¿¿ÁµªÀÂÃÃÄÄÅÅÆÆÇÈÈÉÆ¢€˜—˜†€‹a´²ƒ™š››œœžžŸŸ ¡¡¢¢££¤¤¥¥¦€§;¨©©ªª««¬­­®®¯¯°°±²²³³´´µµ¶¶·¸¸¹ºº»»¼¼½½¾¿¯«½ÁÁÂÂÃÃÄÄÅÆÆÇȪ–—€–‘/€Ž˜´€²†™Wšš››œœžžŸŸ ¡¡¢¢££¤¤¥¥¦§§¨¨©©ªª««¬­­®®¯¯°°±²²³³´´µµ¶··¸¸¹¹ºº»¼¼½¾±§¹ÀÀÁÁÂÂÃÃÄÄÅÇ«“–••”•J’N±€²ˆ[—˜™š˜™šš››œœžžŸŸ  ¡¡¢££¤¤¥¥¦§§¨¨©©ªª««¬­­®®¯¯°°±²²³³´´µ¶¶··¸¸¹¹ºº»¼½µ¦²¿¿ÀÀÁÁÂÂÃÃĪ‘””““•e Š´²²‹:¹³ ˜˜™™šš››œœžžŸŸ  ¡¡¢¢£¤¤¥¥¦¦§¨¨©©ªª««¬­­®®¯¯°°±±²³³´´µµ¶€·¸¹¹º»¼¸§®½¾¾¿¿ÀÁÁÂÂ»Ž““’’“y <¬³²Œ"ÿ·¨›——˜™™šš››œœžžŸŸ  ¡¢¢££¤¤¥¥¦¦§€¨3©ªª««¬¬­®®¯¯°°±²²³³´´µµ¶¶··¸¹¹º¹¨­¼½½¾¾¿¿ÀÀ“’’“zI¹ÆÃ¾¹³« ™€—˜™™šš››œœ€;žŸŸ ¡¢¢££¤¤¥¥¦¦§¨¨©©ªª««¬¬­®®¯¯°°±±²³³´´µµ¶¶·¸¸¹¸¦¯¼»¼½½¾¾¿¿ªÆÂ¾¸²­§ š€–F——˜™™šš››ž§¯°©¡Ÿ  ¡¡¢¢£¤¤¥¥¦¦§¨¨©©ªª««¬¬­®®¯¯°°±±²³³´´µµ¶··¸µ£²ºº»»¼½½¾ªQŽ·²¬¦¡›•’”•––——˜™™ ´ÁÅÇÆ¼§žŸŸ  ¡¡¢¢£¤¤¥¥¦¦§§¨¨©ªª««¬­­®®¯¯°°±±²²³´´µµ¶·°¢¶¹¹ºº»¼«Qż·±«¦ š•‘‘“”••––—Ÿ´½¿ÁÃÅÈ©žžŸŸ  ¡¡¢¢£¤¤¥¥¦¦§§¨¨©ªª««¬¬­¬®¯¯°°±±²³³´´µ¶¨¨··¸¹¹º«!ÄÁ¼¶°«¥Ÿš”‘‘’’““””°·½¼¼¿ÁÃÆ¿¢›œ€ž+Ÿ ¡¡¢¢££¤¥¥¦¦§§¨©©ªª««¥¡¬®®¯¯°°±±²²³´³¡°¶¶·¸¬ ÄÀ»»µ«¥Ÿ™”‚‘’’›¬±´ÐÑü¼¿Áıš€›¤ªª¥ Ÿ ¡¡¢¢££¤¥¥¦¦§§¨©©ªª¢©€­ ®®¯°°±±²³¬¢³µ¶®¾ºÇ˯¤ž™“ƒ‘>˜¦«¬¸ÚÝØÌÀ¼½À¸›™š¡²¿ÄÆÅ»§žŸ  ¡¡¢¢££¤¥¥¦¦§§¨©©¤œ¦«¬¬­®®¯¯°°±±«¯°¯¼¸Âк¤ž˜“‘?ž¡¤¦¨¿ØÕÑÎȼ¼·š˜¤¶½ÀÁÃÆÉ螟Ÿ  ¡¡¢¢££¤¥¥¦¦§§¨¤›¥ª««¬¬­®®¯¯°°²±µ¸Çª—“€‘?šœŸ ¢¦ÃÎÉžº·¸¯—£²µ¿ÑËÂÁÄǽ œžžŸŸ  ¡¢¢££¤¤¥¥¦§¤›¥©©ªª«¬¬­­®®³¯·¹±¡—’€‘?”–˜šœž£½Â¾º¶²¯±³£Ÿ¬®´ÒßÝ×ÉÀÁÄ­šš››œžžŸŸ ¡¡¢¢££¤¤¥¦¢š¥¨¨©©ªª««¬­´H¢¨¦¡˜’‘‘’’”–˜š°·²®ª§©­­ ¤§©ÀÝÞÝÜØÇ½¿¹¨¯°ª ›œœžžŸŸ ¡¡¢¢££¤¥ š¥§§¨¨©©ª«ª¶‘™—’€‘‘’’•—˜Ÿ¨§£Ÿ ¦©¥ž¡£§ÍÛØÕÓÐ˽º¼Â€ÆÀ±Ÿš™›žžŸŸ  ¡¡¢¢£š¥¥¦¦§¨¨©¾‘’“”–š€œ £¤œ™œž¥ËÐÍÊÇÄÁºµ¸Ë×ÒÊÅŹž’—€œžžŸŸ  ¡¡¢šœ¤¤¥¥¦§¿„‘,’•—™›Ÿ”•—™ ÀÅ¿¼¹´°±·ÒØ×Ô˯˜•Ž‘™››œœžžŸŸ€ ž¢£¤¤¥À†‘0“•—™›•‘‘“•˜¬º¸´²­¨ª¬¹ÎÎÍËÊž¹——’“™š››œœžŸŸ ¢¡Ã‡‘’“••‚‘$“—¤©¨¤¡£¥¨¹ÅÄÃÁÀ¾¹¸¢•–—•ŽŽ—™šš››œœžžÆ‘‘!“–˜šœž¡¥µ»º¸·¶³²´¤“”••–Œ–˜™™šš››œÈ’‘“•—šœ¡­±°®­¬¬­¯¢’’“””•Ž–——˜˜™šÊ“‘ “•™œ¡¦¥¤¤¥§¨ª€‘ ’’““‹“•––—˜Í’‘ ’•—™›œŸ ¢£¤—ƒ‘’’“”•–Ô‘ ’“”•—˜š›ž“…‘Ú‘’“•–—™–†‘Û’‘’“”’…‘Þ›‘á‚‘’‘鉑ó†‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ€ÿú‚ÿø„ÿö†ÿôþ‡ÿòõøü‡ÿðéíòøüþ†ÿíÅÞâçìò÷ûþ…ÿê€Å ÓÖÛáæëñöûþ…ÿåƒÅ ÈÌÑÖÛàåêðõúý…ÿá…Å ¾ÁÆËÐÕÚßäêïôùý…ÿ݃ÅÄÃÂÀ´·¼ÁÅÊÏÔÙÞäéîóùüþ„ÿ¬Ð¦‚ÅÄÃÁ¿½»ºª­²·»ÀÄÉÎÓØÝãèíóøüþ„ÿ§†Ð¡Ê€ÅÄÃÂÁ¿½»¹·¶´¡¤¨­±¶º¿ÄÉÎÓØÝâçìò÷ûþ„ÿ¢‹Ð'ÇÅÄÄÃÂÀ¾¼º¸·µ´²±¯˜›Ÿ¤¨¬±µº¾ÃÈÍÒ×Üáæìñöûþƒÿ™ÍÊÊËÌÍώЙ+ÄÃÃÂÁ¿½»º¸¶µ³±°®­«©’–šž¢§«°´¹½ÂÇÌÑÖÛàæëðöúþÿ– ÄÃÄÅÇÈÊËÌÍÎÏÏГ/ÂÁÁÀ¾¼»¹·¶´³±°®¬ª©§¥£‡ŠŽ’•šž¢¦«¯³¸½ÁÆËÐÕÛßåêðõúýÿ“½¿ÁÂÃÄÅÆÇÉÊËÌÍÎÏÏÐŽ2¿¿¾½¼º¸¶µ³²°¯­«©§¦¤¢¡Ÿž€‚†‰‘•™¡¦ª¯³·¼ÁÆËÏÔÚßäéïôýÿÒ̾½¾¿ÀÁÂÃÄÅÆÈÉÊËÌÍÎÏώЊ5ÿä¾»¹·¶´²±¯®¬«©§¥£¡ ž›™˜x{~…‰”™¡¥ª®²·¼ÀÅÊÏÔÙÞãíüþ‚ÿ‹€ÐϹ¹»¼½¾¿ÀÁÂÃÄÅÆÈÉÊËÌÍÎÏÏЇ;ÿÿò¾µ³²°¯­¬ª¨¦¤£¡ žœš™—–”“rtwz~…ˆŒ”—œ ¤¨­²¶»¿ÄÉÎÓØïýýþÿ÷ñúˆƒÐʶ´¶·¸¹º»¼½¼³ÀÂÃÄÅÆÇÈÉÊÌÍÎÎÏЃ5ÿýüøÂ¯®¬«©§¥¤¢ Ÿœš˜–•“’lnpsvz}„ˆ‹“—›Ÿ¤¨¬±µº¿ÃÈÔöüâÒÒЃ†ÐÑȱ±²³´¶·¸¹ºº¢­¿¿ÀÁÂÄÄÆÇÈÉÊËÌÍÎÏÐ<ÖùúùøË©¨¦¥£¡ ž›™˜–•“‘ŽŒ‹‰ˆfhjmpsvz}€„‡‹“–›Ÿ£§¬°µ¹½ÜùúúüñÓÏŽÐ"ÑÇ®®¯°±²³´µ¶¸µœµ¼½¾¿ÀÁÂÃÄÆÇÈÉÊËÌÍÎÏŒÐ?ÒïøööÖ¥¢ Ÿœš™—•”’‘ŽŒŠ‰‡†…ƒacegjlosvy|€ƒ†ŠŽ’–šž¢§«¯ºëùøùùÞÌÍÎÎÏ‹Ð%ÑÀª«¬­®¯°±²³´¶¨£¹º»¼½¾¿ÀÁÂÃÄÆÇÈÉÊËÌÍÎÏŠÐAéõóóᤜ›™˜–•“’Ž‹Šˆ‡…„‚~]_`cegilorux{‚†Š‘•™¢¥Åõö÷øîÍÊËÌÌÍÎÏψÐ(̰¦§©ª«¬­®¯°±²¯œ´·¸¹º»¼½¾¿ÀÁÂÃÅÆÇÈÉÊËÌÍÎχÐDäòððè©–•”’‘ŽŒŠ‰ˆ†…„‚€~}{zx[[]^`bdgiloqux{~‚…‰‘•˜¡ÜöõöõÙÇÈÉÉÊËÌÌÍÎÏÏ…Ð+¹¢¤¤¥¦§¨©««­®¯¬š±³´µ¶¸¹º»¼½¾¿ÀÁÂÃÄÆÇÈÉÊËÌÍÎÏ„Ðßïíìê³‹Š‰‡†„ƒ€~|{yxvut[(\^`bdfilnqtwz~…ˆŒ­îóôõêÉÅÆÇÇÈÉÊÊËÌÌÍÎÏÏ€Ð0ÑÁ¨¸Á¾¨¢¤¥¦§¨©ª¬¥™¯°±²³´µ¶·¸º»¼½¾¿ÀÁÂÃÄÅÆÈÉÊËÌÍÎÏÐÛëêéêÀŒ‹‰ˆ†…„‚}|zywvtsqpnƒ[y\^`bdfiknqswz}„‰ÉòñòòÕÂÃÄÅÅÆÇÇÈÉÊÊËÌÌÍÎÎÏDZÃÍÊ¿£Ÿ¡¢£¤¥¦§©šœ¬¬®±³±²³´µ¶·¹º»¼½¾¿ÀÁÂÃÄÅÆÈÉÊËÌÍÎÏÏØèçæçÎŒ†„ƒ‚€~}{zxwutrqonlkj…[w\^_acfhkmpsvy|”ãððñæÄÀÁÂÃÃÄÅÆÆÇÇÈÉÊÊËÌÍÉ·¿Â»µ¥›œžŸ ¡¢£¤¤’¤°¸ÁÈÊø±°²³´µ¶¸¹º»¼½¾¿ÀÁÂÃÄÅÇÈÉÊËÌÍÓäåäã×€~|zywvusrpomkjigfe‡[8\^_acehjmpru³ííîîÒ½¿¿ÀÁÁÂÃÃÄÅÅÆÇÇÈÉÊǰ«ª¦¢—˜™š›œŸŸ¡«±ÅÌ‚Ð7γ®°±²³´µ¶·¹º»¼½¾¿ÀÁÂÃÄÅÇÈÉÉÎàâáàÜ›zzxwutsqpnmkjhgedba`‰[5\]_abegjk|ÖíìíãÀ»¼½¾¾¿ÀÀÁÂÃÃÄÅÅÆÇǯ‘’’”•–—˜™š›œ«ËÑÑ…Ð4Ë»®­¯°±²³´µ¶·¸¹º¼½¾¿ÀÁÂÃÄÅÆÉÛßÞÝݪvusrpomlkihfecb`_^\Œ[\]^`bdeœè€ê%θºº»¼¼½¾¾¿ÀÁÁÂÃÃÄ؉‹ŒŽ’“”•–—— ÅшÐ4Ïı«¬®¯°±²³´µ¶·¸¹º¼½¾¿ÀÁÂÃÅ×ÜÛÚÛ¹tpnmkjhgfdca`^]\ZYWV[/\]^_iÅéèéß»·¸¸¹¹º»»¼½¾¾¿ÀÁÁÂÃ¼Ž†ˆ‰Š‹ŒŽ’““˜ºÏÏŠÐ2ʸªª«­®¯°±²³´µ¶·¸º»¼½¾¿ÀÁÒÙØ×ׯxjihgecba`^][ZXWVTSR[0\[†àææçɳµµ¶··¸¹¹º»»¼½¾¾¿ÀÁ¹‹‚„…†‡ˆ‰‹‹Ž“³ÌÍÍÎÏψÐ1ÏÁ®§©ª«¬­®¯°±²´µ¶·¸¹º»¼½ËÖÕÔÔ΃ddcb`_]\[YXVUSRQPNM[2^²åäåÛ¶²³³´µµ¶··¸¹¹º»»¼½¾¾»Ž~‚ƒ„…†‡ˆ‰Š’²ÉÊËËÌÍÍÎÏχÐ/É´§¦¨©ª«¬­®¯°±²³µ¶·¸¹¹ÆÓÒÒÑГ``^]\ZYWVUSRPONLKJI[YvÕ€â0ů°±±²³³´µµ¶··¸¹¹º»»¼½©†}}€‚ƒ…‹œ¸ÇÇÈÈÉÊËËÌÍÍÎÏÏ„Ð/Ñ¥¦§©ª«¬­®¯°±²³´¶¶ÀÐÐÏÎÏ¥]ZYXWUTSQPOMLKIHFED[8¢ààáÖ±­®®¯°±±²³³´µµ¶··¸¹¹º»»²¢™••—› ¨µÁÄÄÅÅÆÇÈÈÉÊËËÌÍÍÎÏÏ„Ð,DZ££¤¥¦§¨ª«¬­®¯°±²³ºÌÍÌË̵aVUSRQONMLJIGFEDBA@Ž[ZlÉ€Þ7Àª«¬¬­­®¯°°±²²³´µµ¶¶·¸¹¹º»»¼¼½¾¿ÀÁÁÂÂÃÃÄÅÆÆÇÇÈÉÊÊËÌÌÍÎÎÏÐ,Ñλ¦¡¢£¤¥¦¨©ª«¬­®¯°´ÈÊÊÉÈÀlPPOMLKJHGFDCBA?>=;Ž[@Y’ÚÛÝÒ¬¨©©ª«¬¬­­®¯¯°±²²³´µµ¶¶·¸¸¹ºº»¼½½¾¿¿ÀÁÁÂÃÃÄÅÆÆÇÇÈÉÊÊËÌÌÍÎÏÏÐ)Æ®Ÿ ¡¢£¤¥¦§¨ª«¬­°ÃÈÇÇÆÄ|KLJIHFEDCA@?=<;:87Ž[nd¼ÛÚÚ»¥¦§¨¨©©ª««¬­­®¯°°±²²³´´µ¶¶·¸¹¹ºº»¼½½¾¿¿ÀÁÁÂÃÃÄÅÆÆÇÇÈÉÊÊËÌÌÍÎÏÏÐÐÍ·¡Ÿ ¡¢£¤¥¦§¨©«¾ÆÅÄÃÄHGFECBA?>=<;987543[oYƒÓ×ÙΨ£¤¥¥¦§¨¨©©ª««¬­­®¯°°±²²³´´µ¶¶·¸¹¹ºº»¼½½¾¿¿ÀÁÂÂÃÃÄÅÆÆÇÇÈÉÊÊËÌÌÍÎÏÏÐÁ¥›žŸ ¡¢£¤¥¦§·ÃÂÁÁ£KCB@?>=<:986543210[o_­×ÖÖ¸ ¡¢££¤¥¥¦§§¨©©ª«¬¬­­®¯°°±²²³´µµ¶¶·¸¹¹ºº»¼¼½¾¿¿ÀÁÂÂÃÃÄÅÅÆÇÇÈÉÊÊËÌÌÍÎÏǪ™šœžŸ ¡¢££±ÁÀ¿¾¾±T==<;987654210/.,+Œ[pZwÊÓÔʤžŸ  ¡¢¢£¤¥¥¦¦§¨©©ª««¬­­®¯¯°±²²³´´µ¶¶·¸¸¹ºº»¼¼½¾¿¿ÀÁÁÂÃÃÄÅÅÆÇÇÈÉÉÊËÌÌÍʰ™—™š›œžŸ  ª½½¼»»¸f8986543210.-,+*)(Œ[p\žÒÑÒ´›œžžŸ  ¡¢¢£¤¤¥¦§§¨©©ª««¬¬­®®¯°±±²³´´µ¶¶··¸¹ºº»¼¼½¾¾¿ÀÀÁÂÃÃÄÅÅÆÇÇÈÉÉÊËÌ˵™•—˜™š›œ£¹»º¹¸¹{554210/.-,+*('&%$‹[qZm¿ÐÐÆŸ™š›œœžžŸ  ¡¡¢£¤¤¥¦§§¨©©ªª«¬¬­®¯¯°±±²³´´µµ¶·¸¸¹ºº»¼¼½¾¾¿ÀÁÁÂÃÃÄÅÅÆÇÇÈÉÉÊ˹™“•–—˜™šž´¹¸·¶·‘710/-,+*)('&%$#"!‹[qZÌÍͯ–—˜™šš›œœžžŸŸ ¡¢¢£¤¤¥¦§§¨¨©ªª«¬­­®¯¯°±±²³³´µ¶¶·¸¸¹ºº»¼¼½¾¾¿ÀÁÁÂÃÃÄÅÅÆÇÇÈÉɻ𑒔•–—™®·µµ´µ¢@,,+*)('%$#"! Š[rZe´ÌËÁ𔕖——˜™™š››œžŸŸ ¡¡¢£¤¤¥¦¦§¨¨©ªª«¬¬­®®¯°±±²³³´µµ¶··¸¹¹º»»¼½¾¾¿ÀÀÁÂÂÃÄÄÅÆÇÇÈ¼šŽ‘’“”¦µ³²²±¬P'('&%$#"!Š[rY‚ÅÉɪ‘’“”••–——˜™™š››œžŸŸ ¡¡¢£¤¤¥¦¦§¨¨©ªª«¬¬­®®¯°±±²³³´µµ¶··¸¹¹º»»¼½¾¾¿ÀÀÁÂÂÃÄÄÅÆÇ¼™ŒŽŸ²±°°¯°f$$#"! Š[r`¦Çǽ•‘’““”••–——˜™™š››œžŸŸ ¡¡¢££¤¥¦¦§¨¨©ªª«¬¬­®®¯°±±²³³´µµ¶··¸¹¹º»»¼½¾¾¿ÀÀÁÂÂÃÄÄÆ»—Š‹Œ—®¯®®­®~$! ‰[_Yv½ÄÄ¥ŒŽ‘’’“””•––—˜˜™š››œžŸŸ  ¡¢££¤¥¦¦§¨¨©ªª««¬­®®¯°°±²³³´´µ¶··¸¹¹º»»¼½½¾¿ÀÀÁÂÂÃĹ•ˆ‰Š©­¬€«“,‰[_\™ÃÃ¸Š‹ŒŽŽ‘’’“””••–—˜˜™š››œœžžŸ  ¡¢££¤¥¥¦§§¨©©ª«¬¬­­®¯°°±²²³´µµ¶¶·¸¹¹ºº»¼½½¾¿¿ÀÁÂø‘…‡Š¢«ª€© < ˆ[tZm´ÀÀ¢‡ˆ‰Š‹‹ŒŽŽ‘‘’“””•––—˜˜™š››œœžŸŸ  ¡¢££¤¥¥¦§§¨©©ª«¬¬­­®¯°°±²²³´µµ¶¶·¸¹¹ºº»¼½½¾¿¿ÀÁ´ƒ…™©¨¨§¦¦R ‰[sŒ½¾µŒ†‡‡ˆ‰‰Š‹‹ŒŽŽ‘‘’“””•––—˜˜™šš›œœžŸŸ  ¡¢££¤¥¥¦§¨¨©©ª«¬¬­­®¯°°±²²³´µµ¶µ¶¸¸¹ºº»¼½½¾¿À¯ˆ€§¦¦¥¤¦l ‡[uZeª¼»ž‚„„…†‡‡ˆ‰‰Š‹‹ŒŽ‘’’“””•––—˜˜™š››œœžŸŸ  ¡¢¢£¤¥¥¦§¨¨©©ª«¬¬­­®¯°°±²²³´¬¤·¶·¸¹¹ºº»¼½½¾§‚†¢¥¤££¤ƒ ‡[bZ€·¹¹¥‡‚ƒ„……†‡‡ˆ‰‰Š‹‹ŒŒŽ‘’’“””•––—˜˜™š››œœžŸŸ  ¡¢££¤¥¥¦§¨¨©©ª«¬¬­­®¯°°±²­›³´µ¶¶·¸¹¹ºº»¼¼ž€š£¢€¡”)€ ‡[K`Ÿ··¸¹¥€‚ƒ„„…†‡‡ˆ‰‰ŠŠ‹ŒŽ‘‘’““”••–——˜™šš›œœžžŸ  ¡¢¢£¤¤¥¦§§¨©©ª««¬­­®€¯&™«³³´´µ¶¶·¸¸¹º»¸‘¡  ŸŸœ@ †[Zu±µµ¶·¾{€E€‚‚ƒ„„…††‡ˆˆ‰ŠŠ‹ŒŽ‘‘’““”••–——˜™šš››œžžŸ  ¡¢¢£¤¤¥¦¦§¨©©ª««¬­­¯ ž€±²³´´µ¶¶·¸¸º°‘žŸžžžZ€€†[]•µ€´µ|€~_€€‚‚ƒ„„…††‡ˆˆ‰ŠŠ‹ŒŽŽ‘’““”••–——˜™™š›œœžžŸ  ¡¢¢£¤¤¥¦§§¨©©ª««¬«•©¯¯°±±²³´´µ¶¶·¸¦šœœu €€…[Zm¬µ´}R~€€‚ƒƒ„…††‡ˆˆ‰ŠŠ‹ŒŒŽŽ‘‘’““”••–——˜™™š›œœžžŸ  ¡¢¢£¤¤¥¦§§¨©©ª« •«®®¯¯°±±²³´´µ¶²›š›‰€ƒ†[‹µ´ƒ{€|T}}~€‚ƒƒ„…††‡ˆˆ‰ŠŠ‹ŒŒŽŽ‘’““”••––—˜™™š››œžŸŸ ¡¡¢£¤¤¥¦¦§¨¨©™•¨¬¬­®®¯°±±²³³´š—š€™”0€†„[Zg§µ€´†[{z{{|}}~€€‚ƒƒ„…††‡ˆˆ‰‰Š‹ŒŒŽŽ‘’““””•–——˜™™š››œžŸŸ ¡¡¢£¤¤¥¦¦§¨›‘£««¬¬­®®¯°±±³’Œ™˜——˜KŠ„[Z‚´ˆ[yy{|z{|}}~~€‚ƒƒ„…††‡‡ˆ‰ŠŠ‹ŒŒŽŽ‘’’“”••–——˜™™š››œžŸŸ ¡¡¢£¤¤¥¦§ž©ªª«¬¬­®®¯°}——––˜g‰„[b µ´´‹Y£š„zyz{||}~€‚ƒƒ„……†‡‡ˆ‰‰Š‹ŒŒŽ‘’’“””•––—˜˜™š››œžŸŸ ¡¡¢££¤¥¢‘˜¨¨©ªª«¬¬­­¥t––••–{ ‰ƒ[Zy±´´ŒS¯ª Ž~yyzz{|}}~~€‚‚ƒ„„…†‡‡ˆ‰‰Š‹‹ŒŽ‘’’“””•––—˜˜™š››œœžŸŸ  ¡¢£¤£‘—¦§¨¨©©ª««­€•–}‰„[·³®©¢›‘„{xxyzz{|}}~~€€;‚‚„……†‡‡ˆ‰‰Š‹‹ŒŽŽ‘’’“””••–—˜˜™š››œœžžŸ ¡¡¢¡˜¥¥¦§¨¨©©ª‘„[RŽR²®¨¡š“Œ„|wwxxyzz{||}}–—Ž„‚ƒ„……†‡‡ˆ‰‰Š‹‹ŒŽŽ‘’’“””•––—˜˜™š››œœžŸŸ ¡žŒœ¤¤¥¥¦§§©‘„[Q±®§ ™“‹„~vruvwxxyzz{ƒœ¬±´³¦Œ‚‚ƒ„……†‡‡ˆ‰‰Š‹‹ŒŽŽ‘‘’“””•––—˜˜™šš›œœžŸ ™ŒŸ¢££¤¥¥’„[Q±­§ ™’‹„}vqqtuuvwwx‚œ¨©¬¯±´®Ž‚‚ƒ„„…†‡‡ˆ‰‰Š‹‹ŒŽ‘’’“”“•––—˜˜™š››œœŸ‘  ¡¢£¤’„[°¬¦Ÿ—‘Šƒ|uqqrsstuu€˜ €¦ ª¬¯²ª†~€€€+‚ƒ„…†‡‡ˆ‰‰ŠŠ‹ŒŽ‘‘‹†’”•––——˜™šš›œ›Š˜ŸŸ ¡“ƒ[ ¯«¥¤‰‚{t‚q@rr}’™¾À®¦§ª¬°˜|}~~€ˆŠƒ‚„„…††‡ˆˆ‰ŠŠ‹ŒŽˆƒ““”••–——˜™š›”Šœž”ƒ[‘©¤´¹–ˆ‚{tƒq>y‹‘’¡ËÐɺ¬§¨«¢~{{…šª±³±¥Œ‚ƒ„„…††‡ˆˆ‰ŠŠ‹ŒŽŠŒ’’““”••–——˜˜“—”•‚[’§¡­¿¤ˆzsq?…‰ŒŽ«ÉÅÀ¼µ­§¦Ÿ|y‰Ÿ§ª¬¯²·¯€‚‚ƒ„„…††‡ˆˆ‰ŠŠ‹ŒŽŠ‹‘’““”••–—˜™–‚[“ ´¯‘€ys€q?p|‚„‡‹¯¼¶²­¨£  •y‡šžªÀ¸­¬°³¨ƒ~€‚ƒƒ„…††‡ˆˆ‰ŠŠ‹Œ‰Š‘’““”••—[•— £™…yr€q?txz}‚‡¨®¨¤Ÿš–˜›‡‚’–œÀÑÏǶª­¯”|}}~€‚ƒƒ„…††‡ˆˆ‰Š‹‡~ŠŽŽ‘’““—[–H†‹„zrqqqsuxz}€—Ÿš–‘Œ”“„‰«ÏÐÏÎÈ´§«£Ž—˜„~~€‚ƒƒ„…††‡ˆˆ‰„~‰ŒŒŽŽ‘—[˜r|ys€qqrsuxz‚ŽŒ‡ƒƒ‹‹„‡Œ»ÍÉž¸¨¤§­€²«˜ƒ}|~€‚ƒƒ„……†‡ˆ~‰Š‹ŒŒŽŽ˜€[ q9rsux|~~ƒ‡‰{~Џ¿¼¸´°¬£ž¢¸È·±±£usz~€‚‚ƒ„……†~€ˆ‰‰Š‹Œ™€[ ƒq3rsuxz}€‚€tvy|ƒ«²®ª§£œ—˜ ÁÉÈĹ®­–zwst{}~~€‚‚ƒ„„‡‡€ˆš[[¡…q1rsux{}vqrsvy“¤ ™“Ž’£¼¼»¹¸²©¢xyuqv|}}~~€€‚‚„††[[¡ˆqsvv‚q$sxˆ‰…‡‹Ž£²°®­¬©¢¢†vwxwrry{|}}~~€€Ÿ[£ˆqr…q!swz|~‚…‰¥£¢ Ÿ›šˆsuuvwspxzz{||}~~È’qsux|„“™—•”’’”–†qrstuvrqwxyyz{|Ê“q sv{…‹Š‰‰Š‹€€q rsstntvwwxyÍ’q rwyz}€‚„…‡‰xƒqrqstuvwÔq rstvxz|~‚€s…qÚqrtvwy{w†qÛ’qrstr…qÞ›qá‚q’qé‰qó†qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒt8mk@{„”ûËe“ÿÿûÁ[“ÿÿÿÿ÷·O “ÿÿÿÿÿÿó¬B“ÿÿÿÿÿÿÿÿî 9“ÿÿÿÿÿÿÿÿÿÿé“/“ÿÿÿÿÿÿÿÿÿÿÿÿâ‡' p•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ{/„Öþÿ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÒn>˜ãÿÿÿÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÈbP¬îÿÿÿÿÿÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù¾U  d¿õÿÿÿÿÿÿÿÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö³J /k¢½½žY'yÐûÿÿÿÿÿÿÿÿÿÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ¨?$d°çÿÿÿÿÿùËj6ŽÝÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì›"*V@bæÿÿÿÿÿÿÿÿÿ¾3Wu{v_-9ŸäýÿÿÿÿÿÚ:5¿ëþò¹Aic08™ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿd#Creator: JasPer Version 1.900.1ÿR ÿ\@@HHPHHPHHPHHPHHPÿ]@@HHPHHPHHPHHPHHPÿ]@@HHPHHPHHPHHPHHPÿ]@@HHPHHPHHPHHPHHPÿ ˜\ÿ“ß‚@'/@u²fr±^6,0æ—å:Èpı×2qÙÞ&‹Co%ÿ EÎ#£Ï¯ŠÀ7߃(è1Æö½ Å3këU2FæK>¤¯ß‚01xw  ¶“Ö}ávŽ·ßS²Ý‰GgGƒYo2X–º‰õ) Ð$úíTüÿK‚µl憽!Òèé5qˆ^#ELÄêß‚H„OGÃXE];O²íÙž´ëóžG±"¾’$IÄ/omKX›€é¹ÖSÿrÞ€|‘$Ü¢JFÓ±9fbÁžÍ‘Õå-€å^B•îß‚0 *µ£Ú+÷Æ…Øá€Ü,å¦sP&CÆ ÀYð’)ÈôêðÔÖIÍ¥Úð‘ÊÈiÛŒS7["ð™«òÍ qÇÜÿ„,s”\(CÏÀÚ~ø€;=˜ÝgŽÆCGNé;Q~4H¤2¸é#EÌ[ë׋uŸ´LC_¬´Ìs½g%‘¯¬U_,$±[äA#–± ’ÁÕk:4rY,ëGQbGƒEð(Xk~iôk™žå€ÄÚ ç×:ztÑ ¨sŠÕæ¡¿§ç|—È Ù©Ž™‚­fR@zj1qMx€¯)¿ÃV]¼¾Ý;F_½½N"Ó»½i °~‘È3ó[ájå»ÃXÌ=¢õV¿BÛÕw•ÆÙfË{cÒ½#Ò0m2xȃÈDPâ(HjDk´MÖ¯ Bºƒ›«`o w=ºŠ3…k 3RÁ×°9£©œê'{éF «C˜,ØÜpìSžwZǼÂé4²×ÇÈn¥ÀO{Û,ôÉñþ^ËØèq^•ÚÈ¢µ¸þ9>§B­8ÈiÉÐ=¹ö~™ :55Á6Vñ4$òLÝä×vl€7à üGJ&¾…ExÖ$Ô!ÊÖ¼'ñõQ·ç)@¤ÙÀºô‹ {áÏÏa!C¯»Ð&±¦°ó/³ÛFŠà/wE„‘>0 ¿hq(!Ó½'«®mQÚ³ýË^VïÒ¿›[”n°ô^S™´¯­?Øé‡U÷`#Mu&±çoHR}<ħ± jü6z£m³×š›)ºŒ'jn=-Ž^mX É2Ó vªëLaDßjg,.½~N¿HZôí¿Ï“Ÿ……0o~Ví @Œ±E›$l^ùß|b…‘–R¡¾D ¾¢Iˆ¶¼Ô&ÑH€äŸv¦Ø|ª‡9 f8|̺?ÿU`ü/g†øV_ÇDWåØ{û 1V‘Y°îFu|-ëíÛ ˜}hÅÑ îĪ^¾w¿.·ìta_©n’!Ë®hbXVw.é`Ýî$ÄzºÓ(Ô†ø4øbC˜,ÙP‘¥3Aë¢Xp (dEL ¿}{¯¯á<£ŒŸX÷®hbU/o9Ö÷·?÷Ή_ÞsCªu w¾€ 6NI’¼Š9€³ÝçBàŸ~àò'µñDCtµe­ñkð[vT¡µëì—°U©  îAxPƒï•®[Òêº ’:¾,A†ßïÏœŸ…7…:qÊFÒIp +R«éKÌ®.ÿ …w;’Ž1ˆƒ…ëõìÆ¦2ÈØŸCÞø>x¡9ѤɪýÅ2b Ùz #vJG(|#ÃUjFÿV±ûfK‘Íðé9ئ¯Õïìþ¢…¿ ‡¢©¬ÎØ5°hè£B~×MÜláué—ˆœõ¢yaD@_OF©÷Ø'ñúЂîl¾êË Š1w¦Õ¥±Úc0'EâļWo‰‹­›<ÃIå~UÔ¾Ã2 *~ÁBÕŸ-sxï¹8ð)$šËx´g]é6LJñ§PH$©Ûzý—µÓ—0 Gq¸'ç´cUkJ4µLQÃØ†ía0“ñþ.„}>ÙÒü?¦V®g8AW Ç‚r.Fð¿­aZå©’Õû÷ÿ/øg!ɈP';ΣŽîò»“`¶‘Æ™Z;ñÉ;1Ÿ^æÊD¯æEdÄrɇÿv$™ç 3/Ú©ŠÏÒ“;»³›† è©OgÛ(›Ò~EÒ©í.­¸<|»[Ù;FoS/käÎ2-I(ôNÏP%E×òßχŸƒôüè@Wq<1O»áä‘^Ô|uVîoxP›…¿H l¨+âú»‹Ç2ÍS»Ÿ¸ö¼TQÔæ·=%´em Ç‹Ô½J÷Ö´” šñMDšÇ²©“¦QÒ9@Ví«ÖмÝLFó&Ÿ>‰¯( ˆþô¯ÃWû´ªÊz &ç·U ‡¢©¼A¿•›ºo¿Îµ%Êñ›ì«WÇwb1¿›cQ÷´ûæÜæµ²Ï?À\tüRì¹›Àp1ç@\¶n\ÅŸ‰ºÏIdý ¬({ l òæ_³ˆGš^ѬZ&` idY0¥ýÌ$BãÈÜÃzTñµ| Ÿ6²tŽ<€¢m“Û0CC#4±FáÅ%ŠžÖÚq&¢ µÄ“e„äÍš´ï Ö¿Ì$ÆÞó2¾–wß‚&`M[œLC²ÅR²9ÑÁ¢þ®.¼;ç Þì2rc~x«IU„×áò{¦šÞp„³RÑä-¤W‹qš6üJöû>–K²ÏÃX§á«ñøk¨³ëo3xåOÚš9 ÔÃ;òДŸË~ÓüÐéªÂO`±%äìPÕñÃo±%*!¬% ž^yðy’G–Œï/û 6¶Æõ˜Èí †ŽqÑØ¸´Ï'×K0‰ [^±;­ÇÎËÞ†}û¬4nî,—âßq­²‘qš YRð=ò‘eýÙ–Tcrà {À~ÿ*a«*³Jä¾z~¸N<ì.Pz24nΖÉ#\-›TF72ÍÜ™4c{¸U|s^öúLísuèE´pR†-„†CKOKÎ…XSÁã'0°K™|¹Ÿ"×PäTË~nv…—”¦·¥\e™Müyð ±CÁ]°é.¼¤ý˜•Ÿa«XKå"2aÔýª@õ6â®G:v"í^”hCµ:ãhœ=7ÊRAÁðäßÛ³_CcÃàc†ofÄ9!–ˆ\ŒXœ8ª_>¬p—%·ô¦9ÀRõÁUCž§RbœäiÈ­=°ŽÜ#–Üò6‡8½¢yd¿ðëMapV„¶Î†yŒäŠN-©ñ9'$ƒ½JÙ¡blÁ=½)l¹;ŠF/7ˆ¬ær¸(Ù_i]ãŒP¯¦PÞ}Ýgyz¢?¢×®?£gFn“ |ÐËÇëÇŠí*×ñíYÌdÇ…ž«ãöã·òѾïiÿD'Ÿ,šM±…Û¯Vv¬¾üu™ “p²Dæ1ߥ¾Æ÷6:@x0¬„²Þ‘Ý×¶>*mè¼DM¸Ý½‡{€‡D4úÓ!¸ Yàs©Ó‘†»µÐ}Ã^&m dÅ/oXˆô—¸%Kúg¿mÿ.8±½Ûl ªï~øpVX[VU:*òÃ75>‚@-¬ýÓØ£ 0¸÷oðëŒ_?ÐS¶’+cÎnC)æÇF´«÷zÜÿqy>°R ðy’Z®äµ?­Í7=° =C5§ÐAko¿&п7øòÛ>¿ÑÕá(>2Qyró;h÷9ù ¥‘˜‡ƒeÞ@?ð-^b·m„ !LòÄ>’PH¥L¶Å4«=ŽwõõÉP©Ï4yÙËyCÚØPfLh–‹‚,üÜ\Gà×–I¹DPUÎ.¹Ú»§† hµ”8?§P½YÐ|ãGçùÜRQiÆ'Ây!J‚ƒBæ“ÅçIÊ&´tò5… Æji•Pvwýr…ÃÌFëeåÐö.Ž—eoF-a:éccg{9 BÍZô,íM9ŽXoØvr KkÒÂÑñTê·E‚¸öR à˜¡T×㡇 î7U¼-! êÖ°éÁ½#3¶dæÛƒˆ6¶´Øn¤7.û;+=ÀÛ”3þ!—ù&ÚðJV]EÆžIDÀacá÷G›`ºèš5ý’©r²¡¿feö#4w¡h®.Q¬’]'ü¬6Ϙ<(XÇ䨿‡X…?îäa?ÏÃ_gá®ñølh³ëo3q×Ëô{5ášó¯ú\Ë·æz‚y7Ù)î÷F/Þáî†dˆªiKÓ¸¥C3,°…$äxì‘C#ÿ6PÂB‰ØDj ½~åáqˆÚ_ù$ö÷ˆìkS+þ(@“kÒì!ç5°›pQÿô4è'|†Oi“aµ—–.*OÎæÔÜ KÔƒÚXm٣ÒFgâ,áÜÀñzØ'¿J‘ 0j ¤š D5:Õ1‘öÜœ­W“ƒ˜8R«ªvö#{ Fî·é¹æël)¨…p×Íò˜†ÂK Èån¢+~ôLÝ0¸(äºéõŒq9ÎŽs!®¡±A˜*½E=>°G™ ¼4 ³/d8\AË”°þN嫽¥½òc@z¬žY]vÁ®s£ ?ù ŒN›Ì‡GœøÛ ÝÐÓüe¼‡6¥ìڲɾC07íàEÙç°?ô'Œ™ÆÝ^÷¯Zƒ×Û~†ÈÔ:Æ"FLÓª@sßX#§A÷I s€¨àj³šØ /´Ž~ô#I¡àö*È@_Ì™Qëà쯹Öð7wÅ®#IWÕ7ï6Õ¤.?~qÑŠ.y9Þ³P¬v¾`‹½ŒƒÏ¢ª %†Óë4Ü÷ÑQÞ¸"›zÇ ®ªî¢ë:I…Å'µ| >£”è¤anGÄó¡ <k߉8ý)ã4º}۩Ɖ•„ƒä'ÕÛ¢›ð2ì¬UWPÑÁ2Ò;Œþâ"Ëœ{ o:vlmÏÃcgá±ñømÖÀBÛà_בLÕ*ì#Ò$ntiþ;IÇz9Ê{£íÀòÞvÆ:¨-‰b¯ˆ‚T&….‘sµÇŸ` @Þj­€ÌÁm±ÅÙ¼Îã&Á9v?¤Rßã„8n^—L»bȈÎü⛬òb±^ÅpÈ€ÒFe?<IY³Boñ*ÑÁ0™`k¯ypž&ª"»×À!ìOöaBF3N^Ã_Œåú¯‘ø8bÐPºªÝB™*ÞGÀ4•ªÑ”¿ù~p#Ry5¿ðt Õî½ÓÉÙ™’ù±¥±ÌþNb¾åê¢e"ycïcñA)ÌtÚ·•´1¿3 „üz%/  Õß¹ïKr×ó¬_«L/Ûn!þUEŽ_D„‘ÉŸì–/\:z=GJÑ ŸNæÖ*|b˾VÌI.FçMP—4xw(zfšÕ„Þ›¯’”ÜDýOTõ»†î®“«né1Œ“ŽÄŒWÆyIåšm&ŸÖA¦Ø…|õ©†±ZÊí€I£tŠ0ìø.ë`Uaõ‘R„1Cಥ,ÃoÈ))»é´…ùÛÔ&Ý>£ ­e³qE)Žá§VŒ:Áö÷‰b1)-gÚýòá—§iZ¾üêø!R¾¿á]»Pâôí-&~`ÜÊÉõ{§òÔË5ùutÿS¬Íò%™óȼLJ¯KåÖM«O¦/:G¯7•-¤Nž˜6;„DT¥ÜÝÆ -=ÓÄ\®³x’­àõ¯HŸ.¼GV$“ObÙ÷>Q™Iôm”B³ªzq^}#»~'ê(ý!å‚ Ô¶± ¦‘Ia…Xߢ+ÎE•Î '†iÑ–æÁÿbK÷;§7ÍãRÝ]MbOW­c /a´ìå­úƒ&¢|]ý¦”¾¸šû?'[‚‰6¹@éì©#ŸSÎ̘œä;at“7=r ñwö­é[€ U¶ '… †Œ•8Dº‰0uœ™‰¾¥ÍFl3›¸GóØ†ˆd2g;.¼Ä£Ð¼Šg0½uYÁ•Ž~“Ûà«Ó¼û}*o¸-Ї„ƒ¦²e| [«TA‘wù™Pù†°îHÆoÕW{ÂÜ©Jë‘äîœ4ä—ƒ,îjÃׄk8DÊë';ECPª¾zgæÓýó1áónãÅ¿ËÙ…ØÓëÅ÷$2i.3š‰æÒ ˆ‹énÕLÄ l®öd°Rçk&æ¾­”Q.*[äwØ\ òª€‰Ñ°ò…0ÇÃÎëa–ÃõLO•ï/ꩲñ†WðW\1$¦’×5qÌôÏÃD'á ³óЀŒ'ƒ4T j^c6=jhìÀ3h¹˜f›XåýÀYáÏ_I“P»WsuŽÐ5’R~7€_°‹Häܹ"»ª;j)ÊÀ攕Wûœn¼I<á+á•?Ç<‰X ´ehžÊ›½Ù:¨ŠÔ@âoþݓޥlT,—ƒÚ×”Õi脽@ä1Yøªáq§‡`b•õ·VþK7Ül´¨6XäíA©¥keÌx{Lt1¾„> ìîUw­š=ÅÅŸG>[iWëœaEþG³Û‚ÙûÜDh¯Ú·þ%TÀåÑâWøz«Às(½ô•„Uz-tvŸóG¡mÔ‰xÕW+<'È\%Ò1œÛ)#C/4ÇYs¢—$röRý hÑ–[=½ã!2W4=&ÑÜÏ}¡0,XÕïÐï[•`ë¬x–L‰ºôÀŠhœ…Òf<4šÐÙöU¶Ã„7Ö5²®^7x£)¯ =Žàªc©6¢G®ÔÖD-f~ »ÿzíÐþl`ë©Ii²Àè Ñ˜¿Êø­—ŠUÏ’y'ïG˜Ur7í¿dŽ2€‘-{3»O }¨¢§oD)ù(¤²+Ø]ÉYûSÁ/ªh{Ôü?‘·[J&òÁÚRÈòôq¬ö‡QäÝ gCx,ªŸU<#[ÁÞêžÀ…u¡ÅZ±BÁ@îgv¥‡!Z=?ázæ~â—…D¢È±UþÌÙ@‹c÷Å;Cž’üB}Bóß²øéçßÎAqkìA[›Ó4LY!±k´EC¹¢ÙÕ6A-¸ÿ%(d:͉ 6kØëm¼ªLëóËýK«~ôXÓnà<ô!®ÂÙ`£ QkêLÆTk=oRxÞÛ¦o «1%VíI>Xɤ¹$Ÿµ8Ìu?C¼‰˜ïèdkU0Ã$X–®èÃÌ”ŽÑ§Ü‰y?iSò?YNx-›Skî[¤ÝFwu•'°W“@*Êé{WÄ÷üËŠÆ3€96v³E·˜çl¯›9˜Qœõ:ìÌÛDj m5i_5¸Àí×b/«‚ßÏø™øv«‡vàä«-#ÁT¢L•°€è  LHŠ IbZ†:Е¥¯0t¢F§¿f‰ÂEĤã:,SàFèBæ½_ø ™×;ÙôK=b϶Íw´TGÒ‘.b±ÎmC ½üIËŒC‡Ò˜åÂ[$1¤ üösh½Ù.=+—©ÖVÐdµ öÞ¾/ΰ­°ÔBaL“úԱ«þ3„±uß«D›Dk곬™³;èèV*ØtOÍòƒß!Œ'̶‚$Íl»yGÕü/Ýàõ†¡\ª›ƒ§ø÷XèÛzÐ{ïl;Ø¡GU‡öѶ@uþ¸€‚¤Â4Ë1$7ã…4Z†vùùRîTRrv,Õ®”F""c‘:x¢Ðx–økvqÀ%Y›ã(•aÎÍÞÑõ­ã¬f'¡<³,¡—þÒ£›@]c)oŸq7TCu˜:Øp¨$–P SÌ*gٱ逊b' …²a_ép‚]t jÜEý•œèUå€8[’Èo]öÌ.,ÇÉŸÚçEbwÙ­PTÿB"öiIN—’Nggˆ‘.üÂÄb=“¶©iWô@•={x$zkÿ1 ë_ßúxÍ€‚jÀãÂ\ÌM#ÝÛÜõÏåßC'Úy¼u@X£eJÊ%Þ=zŠüÿp”ÄÛ‰<“t´%ªn37“v–ËQjMm¸Rl(á¤jÁˆÍhxS£»QHåáG&sÛÄZTÈÜ8­MLÚIt:åj ºXkǨ¦²Ã?†ÑÕÛ#‡¸pAdV›S“Ç-±W¤†!æ³3êäO˜øÕw‡zÖOâv±øÙ>pmÙ.Ô§ …’Aò¨a¨¬.Á…„ÿ"Æþ× äZiß¶;_”MOª%5TÉ)»Ç s §2|!¯WŸjÐÆáV6ÉÌÉT݉0R"høòÐþ'¥m$³3wé¨ð¼ ©>¹0¨ì–ö>c}n­­+»’T;=N¢˜bÿBIëâ;ŸãH|¾‰XK?›9fcö‡ÊàT}Fá°‘HÂlmwïXº‚Ù™„”KfÒ'|3Ì“º–½V5f‡¤°“ç'ÿV(®¦zT›ðÓ0ô¶Ï²œÏ"?ýð:ò…©Œ@ÑÌb$žß°®é»? =ªhƒ¤ÿ&¨Œ’—WÕ°p,PtÈ,ÍÔt@‹pÈ·wìXçJû*¨ëÍǕǡóš£*±Œ>ÂU’B{áŒBx¿3ÓiJäÔ§ÂŒ¡àå"kbo(pT8K¿h7ÎJ¹¶ÜN¢ËQTÜæü7¡^R@ëC¬”|v¥1¡Fâõ‘ý+~„ÝúëXœ°¡BÚk严b͘@¡{û”bÒÕ†U%Ï]üÑ­&ÓÁSY;æEóô'¨¯Lù$Beôî.Çòxhvuë2eré­™˜¡ÿP~1¹>çÛe!ï ÌŽ¾n)'GZ3ò Ä³NŸ˜ >7¾šÁ*#¾ë7úuÚô¦®€Ú#tb¬ÐŸZÀÕ?…–;™Îj €¶`Ö0Œ…$ —3VÏ*›p,¹>âÆ¿¤ýu@Ó¶¯I”~žzÛÜ’1$Ãyîë-¯çhCן¢öÅн·²¢ìuXàÒ]I‡l^óƒvINȸÿQ8cœ_Óú;¼À(Y¡)•ßk¥ò¼ˆ‚Ÿ1r7È\ Ñ®Xb_W wŒ1’Ä.Y5T^œ­\“2Âòm®ŒTwÀAÙÊepêo…úP$pNJ/¦šOÿz"ÃѨ¡£œwt÷+ç¨ÜKK´€]¥';À ®ñCKÑhÃ@á>‡ãM¸R{Ö¹ÈAeýþPÞwþ×tÛ`Ÿõ)¿ãàZ†NbÓafED¹9+“þdÍM\”ot*›K»6Â`PϾ´eÔ.‘u¢†­foÆKÖ܉±4ŠN¨Š[aÖ¡“àµ0ÜÙƒ†Î©UßäÈ­«PÈ›ˆ3³^®½×÷Ïc×ù·_‡óÉÕfj >4óH>»î­Ua'8¤ýO, ¥¢ÊÞÞ²@'b¶4­ê.ž-¥{‰mr7ôùð.w®L^:¾`Z¾JBB:XÞ»ª|m_L¹—¨ã‡wq<\€š÷xÅ´•…ƒìµÚ"aÕ‹¸«Ä=pâ…ýÿ „ïi¸—ÆWκ똢§ØWæˆó×~¦ƒÊÎðÝ>»-¾_)W4‚6*XöìNžßMB8¢¤¯QtÚÓl•w55—ÓRå¡¥g*[8œ§ÒΕÌôV³5Õ&DQÇý#­…ê€è¡ç›'‰ EÎYÍ€J¼†òѲ˜Œ,ô5Øã›E^?P oRí 2¥Ï4Òv›oceX3lY“à‘…AAoPñ25šÜº®aÑ(ÇÄE¾×Ä‹µ¶²‚Ö’¢ˆ+ï,¶Õ²6s&åöØÛfAù8xLùÖ õþX®îÕmv?¿­,ùo±"'Ðq¥ ^´¸Íð(de´“°œ ÚtŸÉò£ Ï3÷.MäQ…óÁÔœfôñ-¾`Qö‚ŒÃ†ì‚ãÇ&Öê Û'“nRìÔó SM•iîç lT4¨+ ¶–IâU/ªnѸ÷«Q‹ÕÛ¿ðóÀ ;×þU5-‚ùuž¿ k¸#.ÜšÀ-hÛå+hb‚¦¡?ˆ•S{Ú÷°r'hY^-r8?„S€¦CW%%RºFWMƒ‰8”Ž*Š—ÄI+s.œ‚l{,}Hp0sC¸?¦ý)³Ò*NÊv‚ºÍ`1‰-©(0Ï‘ÜýòW+|mqm°ØO†šJø}WCÌ&Óô sÒ¦€/eE FØ\sbšÊ‚™KÅÐÃÝøÉÌdŽB3O=ê‘AT:—dLåœca#tNu+=ܹ§É&­Ñ)ЇxjÃåfÎ)¿Øi±Uålçò~¶Þô€‚÷¯þñj<@C «Åç#—ÌF[õƒ ¡kú ñ¬Ueð%Њ„kÏš–µÃµSkœŒnÉ@àòI lkU#œÌæ9eÄé×µfÞ/’bp`­€ÆÙÖ4àÓ æfô‡?në>N>o–Lw²ìü›°Ú••¡,”³Vãå7`ÕSÌý±¸¬Lv±×*Cў̰fW¼¤ò­ZF…n¥€¾úi>i¬mB›a «8˜— ṵ̀å®B\¨·žÜžæÕ*Â(/¨!`KP=øG"T6BsLçÒ&€Ð­´dØhf µ·µŽç?V÷¾X!r@¢;ƒâוßõýn Çôõx¼b<ëuI¼ŒË5XWÒ4­Q¿áœ«)±˜/*Ó ˆ&p™¶Š?øÎHzCâÑ%œㄜ#òØÈŸªq:¿ã4KÀ$È(eRäØ*ð¿ ®íá›tÛ !2¢Xº×Œe¨f5z F¶öW¥8Š5µ!(vs×üÖë¢ÒpÕ´÷>„0ëñJ6bUÈ–v!ˆ'%yñT±TYŠ™N½Ùõ寶î¤Àï7ARÆªêæ Y¸Éžû1] ÉBÛ%ÊÍ|­¤b^ç©Ê0ÀåÕ*çoÀo‚©TËó‘ š±¥ÝåÉ…)"¤èd7sÊÔ€‹µó´9ª4\²7jë–¯{Àž#´à~•å+¦¾:î 0#ÓDßef½©7¡wÐ" x"\Ÿ'Œ¶ŸB«…të¥[×ïcU~\Þ©»-} £õ>g Uƒ¦¯« ZÕŽ²Ü6j±uÆs+ý̾p)QžžÚô5—B ÿ †M€tj:`wl&าï_&3ò@`Š8díÿȦ2ÔŽO¨OTûõÝ)÷—wºç*¾ºAâ'çݞЂ®<üÐìYyÏpÍ|Û?ÁõÆ ÿ|!œ,õÏ!Ç Î “úZýé3H‡åŽ óûI$°Qtðž$ã†Æ¼ö0âÙÌÌ,$?qÈÏLWz?„à®þw%åCÖ F¡[aß!)ýÇ}ÊÀr¾q_Ô$sòˆ‡™Êx ú6‰nCCÍ8`G)~pM2B(o²Ùð¥çÃÄ@ ž(lúŽ]E“m¸n“@MàÙÞ§½ûÉBº­=SóÿÂ(ã›=¥þ+þ<h>›Í'˜Ñr„J¹f㻘rªäß¼¯:”7¾štoè#'|h–%Âzå'CͲ]2}o©66èÄÿ?²X²Ç æ«•ƒ”é´³K¾T¿Û,Wž¿¸;dèGðv{·Ò.,Ë[Õ7šµ¹ ªåq‘͑lj êրҨߗþaå+Û†Ö=FÁWÊ\;ÚÚ*CkÀø¤ô±»jm¨^ïú´5¼u%ÍÚáñ¨~ËHMø!v‰oK†J'ü?,•—(¡¹}rMÉ[pvRõ£®_Ó“ã™Tþ3»Bsï±Ka`$¾&ÏÊ$…&Ý•¢x>KªŠA#¯‹Æ&ÁvиFE&A,ßÞ©•û¬`[HEªO‹, „(˜}Àn¬Gï>××g†Å½ ½jß@”,%ãàZ†NbÔ¿÷•ô®Òñ§­´\;™P&|ÝÍÝ; ]°™ ¸QeÏ’qóôC±› #fãb>€ýÆ“•‡¢¹8B$¬ ©,?«92†Ÿl²TDãWKïîNìœ:4Õ-ï㬖¨àÔg»ß E³põÚ 4ÈÜMäZ£Q§\Z„§ØÁ™Zѵ) Ì${|vìmf`Eµ­Ü‹9²ZG eÉ1…ÿvÕ÷gùŽ>]nÙGmÉä–=ùÌ¡z%Ú2›bkmß% K±¡T»ã KÆ´~>íŽòý]äåYƒYª-ø„Ýx¬óÑ®ÐÓjØ9@Íð.¸g¯õ$Äàþ ^^g÷€u$B›¢þn–°š¡+.^ÒX{ÂUäò`©6²fÞ»Ó¨8´øW#Q#ëÿ;y|F*ç.´/½S\«UÛ¨ÿ…B¨UÙÉ·ª'ûM•.ªržá!×AéÎ+‰¦FR¾—u0æpnþÒ&ÅNïZ·‚¿Ôò_’eN8½h1=¥èÖö?cË‹ïÚÑ2 Ó±Õ&„1 ';ß ”M;¤'ùAaeÕ-= )K‹´Ä‡^J¹’¿³Ötùƒ×ƒËy÷üÿUCK®ã/íeÐ8Uª’½K)-†¨ †òU‡_>QDÓàÄteÍéÄwÈ+zu[÷“hÆ8^•Ö<¦8ÝÊ7–q®jX71ÁÇ·c0ãÝ+ný’娤œò HÚXŠêíרK· ;––‰^ ­‰Ôž¶î;7N5û1?,+ÃÆd ¹…ϪáÎlÓXÓ“¶bøð|w»ª³÷VMÚ{ë|˜í q÷#k²TßÙ+QsMwè³ìVÎlÁðg‰é=ÛÂõùƒ2îAÖve§ZñA¡êR†s”ª‹ý1Ò JrRdÖžx·v?µ³H ZW8æŠYOé`h÷9mÔY ák¿-kŒ¤¨IJÞr^7jÀoÛšrÉóê“Ø ÇÕwcliêä¡ÌõÇÏ=èj7ixú¶Åœ€û<ùUiO9uôøã[TÓ= xq10BÃtúõ°ÂMM¤œ8‡ŸKÎI@ TÀq‚º×óû§*bŸ†°¼›åK|“#äs{€&»-,%Þ×IÎÑ×ÉØ è«L*×{HÕ—„FÅÝŽ[S],#l;ú^‘´â/‚¶W­LiÙêìݶŽ}4§:‰ü¼î¨)Ä "2" þföºCèžcM°…úÇÞ€L]íwŽªæø"Ð&ðÌSÖ3» ¨%°li°ÕÓŠõH3_0@ÞŒ†×,a$?ÏÃÐ*~íGáèä«¡?÷¼øL6;¼iúÿ\N¢æ¨Ó$Œ‰4z $¨›œ‰5Âg`Èy\ʧrŸ_ Rs¼ÌkH0u.ÜJ°]Éo°R8J@5ðWìQÕçO–úQ ¸×µãêñ‡S|‹.ßÚáà ¥Ð•¤á>×ú«0 9<ŸãZÎX®¹â%?èÕ‡”âÁ 6!}•}/´\3’î#ºNÌ 9qÜŽ—:l€&Ô7Ê ¹&¸÷eVçˆÏœ´7ƒ‚2D8ÔdöA›o;,=—y‘€Ë>­ÑOÈ )ýPO… «À—¾Ûhßa5·Zg”i«;o™¿Œ°‘®UºTV,´Ó}K›†±õŸKÐa½¹ ÎHJ›–ŽW`;{T’õrô»ÁÂU(BrgøÈÿM?Þ8ræ/PE÷??¬†ßˆ§M—~¸ÚŠ §J¥­–¯‡5¿„“½ÀN…µ´§Rý >™0,ìÔ¸Tq‰ýÃËX.í›õ©¿áÆäÜ$U»çù†„*z>ó›±S*GŽÑÎ=œU=MÞA†£‘¶kÌCÁß mA/9‡Sw®—Pµw©¨öÅë÷H…-KG5;†ç9 &‘ݬ/kbþ– bNò>ÀJèe‰5S|%©)Á2W3³wälébA¡Ó[†§A-NðE™¹À³Û»09,‰ÄÞ…ùæ×UÇý…ž¸ÿ%>Óú¼9Ϲ}ÔtàÏ— $„·ÆNÅb56Îfž›ÆK+þ º(>àA¢uƽ™ÑÖÌf;&VߤåüüVÒ×'™¶®Jh5îÃÇâ±6 GbmE¨²{&Óã©rÈÝ!rpBè Kž†7eLd$ìc§ ´CÛ70 …p)˜#ù˜šæÕÈâðÆðók<1¥†Š`»ìƒäälšCŒ†¨.¤ ò¾Xgrh®)TïZ×Ús4~ÆR’Ap…ˆägEö4bªA{ëdíâb\Ô=fË ô‘“+f^w‘IÿQåìEÿ¯ O1- ×V£&D¡ëÊ•–,ݶ?7ÃgÿJ£mBO°ÖÜ@FÈ—P¨' oõQ'jTKÄ¿ýM¦w‹u0}=g`3ßbwiA'9òEtÆò¡ªeƒãÆíAuÄZ’ÏÂÔEZ‚2†˜|BCf…èÞ”éIFx>«ÄqDÛÒ™s¬O½Y.µßØdØ÷Ž»@bÃéP`ßåž™gòª|öËIÇøäëQ„ÈÕÚùßVÿAcÓ0ˆ/½ö‹,P/à[*%sù©Îf~"õÍšN¤ùxë9¦J|³ncfe¢äñÐy9n[ÌGÌžN|:rТ–ITÔDêTÑÑ k@É"iÿmôšéUøÙsf³fÐá÷ô'³@çf4š0­Ã3-LµšR JkeD"cÁH­GhéžûzÓzåá'¥ÔWê  ¹¯žZèü‚ò¿kmξ´_LeŒVÙ03— \#¹nƒšV /9i‹wû Æ5·»ocÒhˆù:£#¤Í+öfZ÷*xö”|´Rìwâ$þH’lS` E9T/bŠKÎÃ|ÑݽëÀ‰ÿ:b1ŸŒÕrx»Õâ-®2ìøÿÞØCž8ÑŸ=‚_m²Ý&6*”ß~ÁyÒ)ÿu™Ç…„W”Žãû7ÚfÔ„ïÐc)ÏR¡Ú‚ê”ð¬ÃsqÒ}”'Þ½t˜Í”„˜—Ûn×¹MŸ;MEp³gÏÍüîN}]äë‘´© ?5ê¤ÛWbµº½ûtàœÈÙÀäRx(£]¼GD›2ÙŒÒ0oB…AÞ‚Ýác`­ñi¯A #¹Ý$v6 Ò±¶ì=ò((¿lÚ a¿å®®Ƴ ´TéN3ë÷¡…û^}F#n‘·Z#öd}„t¨\´\­ (Wy ´,šÄ Ë$G#m†«RéþK{| ¯7ɬ9l};¹7*¨`™Ép’gø·ñLe$Ó.{üà[Ü¡&òxqdª}'ùÚŸüA±ÀTí{2f´øhé"Ù¢*]l§B©b`wX÷aYWîÔðOù•qî7߈‚µPÏ•sÃe_[,7öü†àxD 6Hžæ¾Ô#±\«©cFd–¼ŠÄ¯õØ@ÀwS}þzECr>«Ë¥¦Ù—Qï·ŸzÕŠ!(˜h4j*á7`0ƒ‹1©›8E5­xí_níPÏÇ 5i´j.õ„À÷B9¬Ìµòl¾R…½CIæpòO*&yšcoÚñð&ˆ—”§™óà@å8“?k®tªÝyÉ5ÎòD‡Ï½³*g2> ïÆ Ë‘±­³%WgL9[Þ½S®€Ú”|æ–óKkÙçÔDç±Ôe8³v1¬<bøÔúÐã¾ùI5÷–þšðÈvf4/„ÇPQ©ù\ ø¤}EÈÍßégÊf(‚©®@¯ê¾‰û“xÉõJÿh†¶_%.6ŠèïôìÂO‰iV”MJ1~ÂØœÐEœ„m21XÊ¢k#ÇÂ(¡¯—F~k¢PzAˆ o\†KáÀü_íF„DãëÓ&Â^¡cÌ7\È¥ùýÈ mw…²xв©…lÃÛ9ÕÕÜ¥#Ïÿ3™Ÿô÷—ÇÎcšÁW$úï¤ôc ƒÙ©ÇÖ/9Ef8eÌ×\0;b1 $tŽÌ•Ç ÇTšÙ¿>x:8¼M9¶|£3\0MŠÃÓÖìœõèÚ$j6ùò‹3´‹‰D®8þìЋ¦ë bb ü¶‚Ù…»ï,tâFÚf® ª'¤*êuTt eᆦ¥õH’Š´¸ø¡ ΡRÛUšÆ*‰Îî¾»}C¥Jµò±-Ölå"„;{ÑÃUÙÏÎX’;$1i°êª89š¿ñ *Œø%~ÓÊ ”Qä:‹eÁi˜‚pÍâÓj¸mŬ!‹üBÈÔ._CRë¹2ôêý'ÎÁ¤[LÒ%¹ÌrZªYè $ È’¾Xie‰E÷}èpmòP`0ǧ ¢£š^ZëÞýb䵫±‚Ú½Å÷<ÛÅFg·Iðç™nD/Ý›Rrñ‘|!#r•7}îa[o¬BDd™‚Y¥åxÔ 9ìßYøj‘à÷¸ÁýbqX|µ÷£ðþ~BCrþg¿(,K0¾À.K¶NÁ„:Ó]}ªÚ¨‹¦>+r,ÉmI# æ ¤­W‡•·rm1H|0£«W]²ŽW¯EЉÈ%Àމ­AíÂß7ÁÀÝfs #J’Cþ ×–L^!ËÓ<€{9M¡}Tñ(ù`ï””$Ì[˜%4G}{Òéùƒ ôY'ÍéMf§s·Ñ–ÒÀlX/³i5>ŽÃ·Ë2Ë…=Z¹±¦ (EÝ P@6 q7$¡ú†¼(xQYÿþÏ·ª¢„o@•°ÀàÄ/ÄÜ4™§—ðV—w–õðWçŽÊænlø Þüß›-«*[0h§rEWD éÝ×¹•`V†¹$ÊêZÃic¯é!ŠêΨøq"S9)€MëÌi›‹—jܺ¸@¡Yf÷À&øÆ¿ø=ÅσÊלác½!u<¤v§Ü=ÙVN"p…ºZ{ žqŸn.Ï\Q«qfB´ñ$ÔKáãVÏζ¤…­F/‰Ç¥åEQš-`HÄÔ‡ÛIÆŸõÕDMg*š÷š@?d´G&R'ú 2§ÎÙ=ú6Gðq“)Ÿ‚ͼ @Ë(¸šýš3µ®-•þ ¼D"äi¦£q"Oöýb´wñ/ÛúøE¹ŸMÊ|JÂùB˜æfÏXå?7› ŽÎ8@¨ììºÑxÙHÅ-óVç!Í@­B‹ía xc”¨Ò.Õž»Ûå[™Ù´1t;º–kœâ‡@ð·è:afÛãolÖ!Ÿƒò³$‹ÑóÔ:·×ûºáÕ@NKÀ×1W¨ ÒÅ"Ä*&t­#žÛ¾¢š”M@^=Ú¨Ô œ¾3¡é,Ûè:(è OÏà øo¬~¾ó¶ªfõ˜Ú/ÀeG16;äsH¶Åvõ¬å„H®œ7¼4~l®Ì{ž¹y{ªœüv5ïk¨Ö–ú}†LÑeaä»nN#±Ù¶bIÜ.MÀQ( þ©ø‹õ†EàGf?ôázù0 y‹L¬u%pcû ]P%¶Î†=9Cs•7p-•üFw_´Hé³¹ÓEòaÕ)àüë4§u2¤?v‹c+a™"DL¬õLHö4Þ½t9¢Ä’‚E5ù†ÿ‘p7ö: {<µn}P€ò{1äÅãp•âùbòé;œñËDEîÖáʘqÂÝV)7qØ*#‡´£ÛAã´šÖ}qÁ[Ÿ9 P5>$ù#@vê$‘& !êf›•!ÿqf¥¤‚oáÌŒUŲ?%C1» øb(À÷Y?ECÁ:^±mZÀ”})¡%E‚‡êyú8ò°i‚–˜¸Ä>ò@ª_÷9ßè‹:‹b€;.U©4¿Œ4 ·Ð/#»Œè jŠ€tx¤*öóÚhׄLܨØð5—ýh*ÈÖ&‡üc£ éy’É·WËü™VŒÓ,Æ!‘–ÀPûÉ~î#ë1ª[7µ±¶®Ý Ø¡Ó)•³R¤ž ‘sœÿ¼BÆ÷ü<~Šƒ/|æf/4<78öœ±_2¹JYqf Šò>WÙ÷ô°K%ÓÒ'5ÖPÒ‡åGö5ó“ÛegÎ$ˆyòEϘ.þ*AøT+PëÐÁ›ÇŠDŠZ}“š8ı…á¢,¹g÷»¹ì—È2f6ì¦ÛÀ¸ËÓ©é.–(ú¶ìÇV½½¦Ö¿É'ãŠÙO!¢´ìÒtЯ¸µp,º^ ´ÂnÃ}ï…w=Áº”ÿ?$Œ^ÆÐ·ZõÿT¼SGh¾ÞVf4Y¡`Um?Õñ2%Ÿ1DØ',5&¸­BÄ**KÉÿz|³Ì(>y%Uêš‹ƒ};ÏÈ.”X~0r=yØòå¿ðC*ˆC ãzsš±^ÖªƒªM¤)_?ÞZ©Ù‰‰ËR¼Èø0ß•Äë÷S߆*˜Ãàíº„4–@Š#ô³<┑l§ †Ä¾\•f›OAiVuß¡~Êè̶ÓÅPˆÒz„¶4Mºåo[Ó]a*MãJŽ} |íáîóÓ[“±oH1x…ßö€¶µÂ“K~ó·a‹pû™Y).–32ü+æ¥OÁ‰]·U׳×ûÌð®›sýv¨IQ­õ ¿åöëõöô-ü:¾Þ3øl/ðß¿á¿?âì _þ‹ü7øo¸ñ¸SF¶…Í\Œ®ù•(¿ü¨,.—½ç¬V݃á–»ŽõRÇÛTz mpŠ^­“ièªûâEeM’5)ɸÍ|QÖˆU|°XÇŒUù-Ñêc»x—ÜsŠž¨ÄiJ›…•ÜãŒ3%ÏRž6‘èñ¢ä PWÇ=½Mó…h£ ÜEð¯)¬Ýº?lV>H°izíß‹^¡)H1æ³ ]6;çÚƒùÝ •@_G…uBa,ˆfóVü*ˆlç–‚Xœ3›Å?yûh"– •<‰PzºMŠ6O4‚ˆ dÅiI–àå¡Ý¨ÈIŽ0€m¤²#ú°ù\Aï—Éámí¤ uMb…¾àz'`úëK¢“ft’K`óÆ,J°ÖájØÏ-Ð 5bÞð€öwaÿ{â+çÁÜØ| jW1‰1‘ævóH¹:an©3Ý„%û¯7CQð30æ2¹IZ¯$¼Aø^ Z|0î—_ï´K§à:,èª4Ï„÷Á aäמ[ëîGyD±>}2¯b ê9Ò她8{sù9’:O NÏâ‡>q6¦5@;"9½úvn‰Ó®€"'PEn"ÕÚÐ[0ÄÒ!`¦³ºlК*ÉÞ¨¬óku}Mò±1„àáaÕ)zºÓt¼-j ¨ˆ¿ï¬‚F¿Oý»UCv))­Â¾\ñ%2ƒ} :ë@u! £-ˆÉëÍà@¨?@û;Q¼mNcØÄ<àŒðB› w" šŸÊݱíÈû¤Ðæï¶^z)ƒç›‹ë×p ;ßÍâªX» qõjoù‘¥²î )µÖæDݵp÷9©Å÷_ ™KÈ¢÷•UG*üø K‹Mr!*}WlM¼ÕPáÿ$FÄýËê×S‚OêAטQçü•‰ìƒ!b5»Ó-Õ.žõ&öËUŸ4Š.Tv7Q!G Rú§B· uŒ{ ëfNW³=ˆ“š(ùù. Cª«‰/®ý«ÿ ^°·ÙTÉt&ßÕ§Îï'· A#0Rzç~§2d—¹ î{­öØöcú1)žh!¼’AŠˆÀç}-Š0úNÜÖÝ ÏF8 ïï‹ö`Ì\L:ÂŽmY`ÿP,|½¹Áœ:&l0Ó>?AÍáF/öEp Ú,sò¦;‘F®<íæÐ2à:`å·Ý Qå;:Z¹%@ ß’¸×ôʽ q×¾‰Ûylï¢GIïr§>Y»‚BfŒH`GùV”¹‚™®ÝCÌ¥ŠH9¬*OTßÀZøó"ÜŠ§¼¨ìBx ÇíU1¹àðÓóœ§ÝÝ”€k€-Êœ¹xݼ² KAB.’â“@㑬`4KA! £á•?±®¨‰$y¼0_ÎðôSräRÁõä^P½²`FìÐC Õþ…²" 'L`*#¨¬Ó˜^É ½a`."à„ñ˜ñ~BTÀˆq]nð¨ÃÚè•wtƒÈZ|¤X4,e°[¯Þp0%}a@ö†ÊtÔ÷Ñ!ºðü†šyÂ]mwx¶í þ\UÏá? ÃZ„‹¤´X®°eàÍXrè$°â«”LP~]´|C»iü¬C‘þA!þÊ™éw#öÃçóZ¹èSiÅÍ¥SÕ•]UmsµNáßqØ{gâ4ð¾䢩WC`P\tœãD/9šlüA´‚®}ã2UíKžÕì0蘹Ôô$çLØöB3<”c ¯Ûżq8œð¹¾áš8ÍÉkÂMȱ/ Af 6Âמ®¿w™wò„–ÿ wPd2P“V_suz¶×Ý |ª¼M:9à¨ÆžSâp”8c€†“Ÿ:«ðÊéZ\?¿©+:<ÚpPŸæ^>m@¤mƒ |³|>C*Ò‚üÆàsÄ™“tÎÏݹ .šóòÏg1ê@çŸ!gñ꧸ ú¼ÒÅ”+¯m!¥õ1‘Ú~؆¸œõ‹Ú·‡è&MWŠÆçƒsxzŸÂ—’ Mƒ›ùËÆ¬î£ ËÃ%DÌ£xÅÊÜ ï„ŸÍ£.{\Dªª!=rå†:Fv¿øw¸ãk ³ÐRWÝéR8 ² RÀE‰ºÖÆ N\üouìf"÷•´  ùŽϾ î „8Šþ^nrþ²:óìHZùSNSœ#D8¥o’}ÀAgb<’ßñ¨ø>%Èeä’¨×÷±Þ`^ ÌWá.­ºÈœâÆö´—SÈDj6z'è:ßÒõÇІÁ\äúàô^U‰ËQï¥WZpI…„—¤Kïw[)÷‚E¼%m\È1M`†¥‰R$‡ Æçý¦©¬%mã$”"22 ãä ŸÇ\ÅCŠ»·fiÅæf½—ʤI|ì0ûú@õÓOI?â)íz|ø‚Wž‹¥ÐÀ»fþFÀ€:0—œ?B4¤Kw\XÊ×¥Np³d\%¾ûžô33GAµJÁ¥‹hÁCø'I6²Â~¡ïy¬`BU‚{Zβ¡Û37v¼¦OÃL€--úâ „Tvñ¼ãjpÚÿzx„&K°9¢ïÈ×Û½×+¿°µ…vµ”¢*êr’©Õ±ÞãýxZ“‰°‚kEΟrP܃çÝ¢]ˆ1z1Ÿ§…r‹'èKkõy}^JÀ®.R³8{ŠVÌßÙ¼f´o_žIB‰wk…ìøËl*Ü7ÉFi–Q@ìäGSg؇ÁfäЈij(; Û«soQ\(û† U­OdLn}g”°¯¡¤ø Ô¿“Ý­\YdµÝÁ"ƒ2”¯à±0c«2äø!›Šã$ÐåC™à7 ¸ï9}9ìw¾…üÕþ_Šü-H ƒ·#äÒÞœ9Ë 6=èß lx8ïËÌâңˆ ºùÃ{²š^a½õyp±õ_оÌϰ ‰T£^¬æÃï5í €ê*•¼'XÍÈ6Î7¯k/âÊqUA.Ò’uÚ[HۥϽª3™oVp«±íDÉéÖlÏ·¤ë\þ¨UpíÈvô â$£„eßÿjÛ¬y¢Aû¿ïµ¦ð›Æß•ÛAcÒ‹ýïõHŠ.Höôèv¹¼Mä-ñå8é¿KCdrÁ÷YúCV“¼†tmrrñYWp·%wý³¬â‰£”T N…í@«3^É‘ˆ‹VŽ…?o²$¶¢_[ߥ[ÈÇ8‚-(Ë—Ê—Ý @ª o6>ê^LûvÜåBªÅc½§Ü–O$(µ•ðK¡1ä>EÕ¿p\K3ç0¡Sæ–jfk§²Š¡¼ç„ã{–¬´8î†YÑX;‚Â/&dE;t‚‰O¯K)QéÜm[ÉãÊãÊ ‹VñÁ–ýØÏT*‹¡'(¦JC¶ ƒ P@Ò"¶ÿjz!•‰5SfR¡Ê¨ y‚öU1(ðaþ›êÑ‹q öõ¬x ä8¤Eé/ž;Y¸$±–ö#èã°˜nÍ…ÇèàÆ{ÑîÆ ¹=¸*Vn;Èi™HÏe¡¸£`çPý%“ü1äŸzqÒɈÏÂlªà½É‚ᢷuîùœÁKM–¯µEØx‰Èóc-x8ø‡âå0¿Ãõ­ïÓet×ù¼k蘸1 ÆøÝ {܀ʺ‹äÄšs±*ý]0ëv8•‹é§’MM Å×ì©Ð³Ûæ0Î\,¥6¤Û¨\¹€Q@¾q!ϲmØ5Ìp†4;ZîˆcgÜ—`üÜŸî…»CK½®¬YùwÆ¥wLåîñ«Ô_n³ð%isÞ:äs†ÕT¸f¤‡Ï ¼ {Î㤵¡˜Ù{â½—N5™Ä¨™‹ÒT‡Ìº¤CcØÌŒÑ\¯ ¹k‰†}D·ÍS‰, "Ù’3ÜòÇé¦T1‘²r¶-$A ØÛÀˆ“ig–YÀäë²nt'3c•CŸ¶­¸ùuÚa£oÞëüçß…´8’׫†ñýW‘fA¸1KnÔ_0œn]ÁídÍÌÀàJÀJ½K—0)ú©ÍØ›ñ\„_÷œNrz§µkSëÖqç‘ì”ÊßÅÔðý§áæ (d^ˆ—ÄU.)”U`ÞÅŒ® p × mÞ.’À8EÝ2æ‡i·fV%_ñ1ÞÓÂ#i¯_"Àª¯zB£Ð)”¾ à¸ûô—¹"ôNÓùY½8öïœÇ:k¸—FÔ}ì×rPTŠŠK|ssµSÛã4”¯’Ê(X‚èD¡WSE fŽFy Cú^ë¼úŠ^„©¡ýoÍAT È·A ø‡²¬Ýd’—ô»éä9VŒL[*? bÀq e-—“«]—¼:ñ {lO8nÒû>@m‹½¾$”Žëw`…CÀµýàX ž‡ I Íò¿âÙS¯Ä—V³ð¡½–Hë>°`V‰°â¾¹çÇ 0cdæ)•Ê©)®“t:ìlÖ¸ðÿp2šf­ò~£]iåÑ‘ü',øë"½qÞP¥¯I3¼½‚äöJt)ëaøðnŠðÜpCrÏJÜ]PË1 ÅØ XcB3€ WûxHÕíò­< C±›…fIþÕ6ý¯Qgþò«Ógæß«] ¥Ý‹÷ìùªxÀÁz±“gÛ&²€Æ·Î4tù×lÏB퓾C¬°MCy¸ã`¥ÄV †!ŠöhbLû‹åîC§_®iÛ^àkÂ&ÉE`r˜¹z@É/—:y½‰ê`Ë2½lp+6("éið/R`‘“žCøüZÐð\#Ö½q‚Är 5&£ }<¹­æ§|-Ȩ۠ƒ^ã¦ù"A„eQ}mY¯EÈßœG.ˆªxP¼ŽF`×Λ'okÍþ ²¦zúQLRÅœëB~—·óå=i5‘Ű2B-Ðái/þØùÚ ½qûo°PìïEeý¨ê+«YÿvÁ·†#ž6*ø³LaßN’¬©Ï¬ÐÎ0°,‡¸!‘¯½Á¶Ã0Ä‚º_B._×€"Ôl=dP¤,‚¼!0+h^£ßÖi«Š¯Sô¹&‰à&¯iÍ“7ƒíik<‘®×Ïd» Ú-£½ëÇsÁ~Ý´+ÔVÊãÕ|…Ž]œžŽ‰\OA½o3íýé·I»ŠbÔ»úýnw…Ÿñ¹Há¿_V§ÃµôÏ œÄ*|ë÷B£Á ˜u÷ØŠ#ŸÎçø§½Öaàô¦ÿÞAˆR{¦!ç𯀙d<õ-/GØm[2Þ¢ï •ØnñÓµ88¾¼b,EÛÅÎÍj.o’`£rYjôCk@Î!áͦ1Š£»ŠFö¹²Û­Ã1¶0ó¾ß¹µ|Ô8·†-,²×<5ß—Y h>¹Ô»m(hÊ _;%ð‹S¾Ý©Ž}%úÏeÓækX耂´½{ƒòävˆ˜òê¤"RÛ`¨þ¾TQ=Ff>¯ÂáÍ`ÛKÈx?ðÅ7 „Úâ…Ýâ[§!Œã)h¶Ápi÷µ \SòØÁ]ŸHo ήýYªëÎCoR%¼‡óþý³â¸Y8kÔRUäæ…Ôû›Ê;"ÊSqúT3Ë[†v‰/{e¨üî_Ù÷Ÿ _Oƒ8öÔ¹Gñå ÙÏRýÚÂG\‹dÁ4„-N…Ãl³Õ…©2i×Q:“Û'cW:Ó”f@H( j8µáÑ™8³¾ý®óš?þ¸Ì@Ð1[ì–}Sß(¿^A§|pœ½>iÓaÑÀ\”Èt¹a¯‹cÍœ›AØÊ\™5ôªâ,Š&VѾÿK¹±Þ߀øŒ•@–¼öbìD’³ÁÝ/cóÏzˆ’ç½;¦£Úˆ©_ü× /A^Ý^¦¶%ÀBš§]oš¸¯¼/£+tŒØ“m*µZ84àÌŸ¹ß2ÿN–¼Dö_†øf½ç¡Ã a€Êeöo ½úi­ÆˆA²³¯ËN?èÆºô^|C\¶qn¾d'ÕÚ×'o¹¬=)v“-à…€ÞÚ’ü /Âo Ï’D)+„”æŒõf©µÖˆ¾²Š~Z:î1 Çœ9naözÃN]ö§¸ÊERSúWptmmðéÆô’ˆ6Í¥ws?H о.øÎÂÈp¹d2W¤†µœí•¸åÖ™ŸQÓWÅnÂ1›¥¨¥“ÓècÏZÔ‹‚Žr‡Xû¥öÓ¾±oÔFÈ3PY$‹ÖwBÖ£6 иªßÃ*µUÁÄ!ž•žÔ"šávJZ¹¿˜uiäò«Q@ÉЇŽól”ŸVa”½—®,‰Á )¬E©ÎM¯(¡Jé±ÏC Œ»a›šg¥@ûôÄ:ˆQ³9m-­Åú=N×?ôKmhèà™ Yà °ï}j´çu‹ýÒG =‚ŒÖ4ƒ„-w’»t­œ¸³ã¾À!™ål2¬£+Q’éQUÒ;e)*êË^çKnÞ¤B†£Õ4è91™€TµÆ- ®ËÊì?ôN·3½ N\‘xVQ›~ è-Õ$œgŸòÜ"«¿AšŸþmóöâò/2A§:6Ùš±",êØt/ ½ N³™×z±’Žž’å¼øþ*ûêï3k¼ò µtÏí­™­i7Šå©/ì‰ ô߈¾Å0ì×V^ß?ª7ÿMÁ2òì²jfÕ¯§É–nÆ †‘;hG©¡ßÉ;à mÆ«¹ŒåÁÒ{ËĺDœ¹ ìvë ˆªhq3Ò*0Ò–(˜®(׺½³M›pØS×ó[‰@ê'·Òš“†íGÇÿM-m€©0ÿ !£µðçRèd#ÝÑ©Œ¹ø}g;Éóí©eâSÒk{üŸE~ü!F¤{B³–Ávn~'$ìš¹ü?•3U`TB©P¢»/¢z’;·™çþPwÚb¤p.­?õ‚¼àhƒZÖõ3v¤({å–ì °BJÍ{Œo®‚¢7½½§±L^ŸçÕÄ¿P@’•…ß°­‹î œ²ÑÃP¾U› ¥ÓË4¾54—êxšäS{Õi묶cc‚Ý×ýúÐø_eÀéë6;°3¸¿O­¢Ýêm˜†AZ±xèf°·5·*v¹W+Výòòõ¤X<ôwí~Ýd¯ÚíYí'CyzÏ#—Ã@¾}/H¢R,?¶¯ó䊑K† ¿Î4evn[åTˆ¸áI :fªqšÃå,7 Ô¶·ç“*«¯Ðˆë´©CÛð#dýÑÉ«ÔÜ9ÚÁJåBPtϱ¦C½–û ~¢}Îk9>Hò¸®f¯á÷tˆm¿ÿ È:Æp#ùmøDôäÊFòt–¦(œöŸ‹#ÛÄsîË«EÏ©²[€?ÿn3êX‡(Á Ú-”›ðÞáUÜßZÙ0êS¯°òyÙJp§W`yXRëEÈîù³næä8ÐþZ%ñí6º¥j™”Ebš>éÖ¤‘Ø—ÿdxÏ4Ý~ ·öÜZ 5¢ñL-³ ÛVå"){ªå±x)¬ÿ5n8cÁy–…éß­˜'˜jÚÚ××Y¢Ž'ÛùâûrñÓÌ)7ä"ð O1u‰‡·Iýš–5vA!‰4Y*^ïµã׉¨)Ù–j£ xœ0ÜtXA‚q8Ÿ•®Ï9ÚÚ}ð“M¾ΓúZcrø ü@º‰¶cÔ„S£Ê´"ûÛþq]6¼àäævžÛpÁ®9€!à–ÄžnA6`ÁêzˆvdoëÓItî€Hš¤r¡†‡˜´‚ .ìu<«wYbè6oÝ~‚ïâ”V4íÿ(·<Ó‚¨Y-P¿3n¦¿ñŲ֌j­ .–Åêú—Û1¶gt»&÷åDªJäPoy±õÆúÜP ’a)ÍÞѹoÈq¤W˜ºI628ñu4Å1ßHJEÒ°/3j(jÍ"ÆÈZ7Û+x×)lù&,FÄõö†K/ÈÖQO´-ÍÃ3l ƒ€;à/²íNÞxèÝèí¤ú®³ßÞ°gHCT[yüï+—yèì8x:6wiæéNæGkö•1@YÀ»;ÀW%Ô ÊKcï{js’8Ü^wªÆ`‚þWµ“ÑïšÀ+Ýé|Ç,-øIïzf»Ýáã.'ÉáN™&ÁÕúÇÜ­¶žƒ^»÷üÓa" $ç â¡Ý´g±úKǨéº\Sþ«4EÎA׆-Xšû †{ú½’Ã¥šÉP,B=>™nVÓQ×dÃò'ò¥—¥HVžQÙ^•§[֚Ţì÷¼ƒ˜„jN^ùiÞ.\r”œ ¼ZXÛ#gXTSEç^Qû“áè• 5âDwN|VQ‹GVð*Á{ÃV|ê=u†ùá®}² ;4ÊëHKlUÿ'(bÞÔ0æw¤bÕ«1–+‹äå2á’Öïõ± ‡]S(eŒ;eª>t#íDÑ”`áÐþoEY*ˆgràì&*0ïÊ¢ÄñK¹B±J—™8¥ç·qmF&R$S‹ ×Þû Ëoæ¬Ò^>yj=&¯˜¤íuHPAï{$´ÃY æ^>m@ ”æÑqþæÏÛ 3¾gã÷‚cµ!Îÿ}S½ùCüï¶ì}¸#h\@¶‘ÐoJM`m¨mjÉüs Ü­;+ÑýÆ74¡§:RÞL…\D“bMš»8ímk§¡/9 ß> »<ͦnK#)RçÖ¼«6$t}²×FE^‚}¦ãñÞ‚äœe!Ô¸°M\ ŠlJ ÜÄß7ÿ`æGêµςϾË›tª†´S VÐzT¦Dš²ôëh 6Á¤R7š·tI¾Vµ’@yqñÇûÜ­Ñ¢÷4¢XØÄö™z@3/lƒÄ¡Õæ`aŠƒ!at¤úüðæd7ãµðFiÕh_~bò±˜M&"òi¡»ÆþÁûѰñý€†¶²-¯µE1š¯]Àd†û neȦñ!>ÌäeE•ŽÌ|í½8´ˆ)à\Pª°åJî ‹vÚ¤oN¹ŒäêíÛú¥•nŸ·âáf¸=Xf)RjUÀ®ëÇâC*Ú˘™1£Ø‰„Âù+•ƒcˆ}’ÙáëÙá_3c4•Ø>Šê€_æHÃk šÜþ‘­¡x-¢¸ÿ¯*Q+3[^ôf¸ŽÆ“Á~Ý  ñ HèeÕµ˜î}(NÊ.¨~\éËëØ1U¡©!aëxö“2Š¨Ú† ]íâ.ò웄YüDKp¡ÄŠ\´[™;á}¨3èõHÕ½»¢tÌ>HRíàáDbf3ñ¼ãk)±Ÿ©tÍ2T$Z‰©“íbPðËq Ÿ˜ÏÕB!¿— ë Ê<ˆ2_^í$Èl-nãUzQã1AîU!ê;½àâbáŠÈì€5õ«ZWv]ÔþÆÚ%ªÚm°ªb!JQ¡4‰'Ω[ô¡À¾ãg±® zuq¸A 2‚Ö¦KÊC¤7(Wìªt7áÎ|ÀAŒãyþ÷4ׄ÷À\¡©ÂzŸ±)XZÃ;iŒ/² ¸^k â7äü ¬„µK5·]|?Ú µj×?‹þCE[Úd4ä”*ijN;ÑçNâ§á>»ìåš%Õ9C=a*Ë¢,0dF«“÷:ÿq.WSd8K(tûäÞ'ÝÜ‹„¨­µÿÙõ..h•Å#~ìa‹+‘T‘’á°}á%`í\_°dcˆoS K-]œ‚wÇ€„ò*ÁÔ8¥Z»Êq!˜€°6qŒ•-N¿Ø%ÚQŠª«u›Ñ¡ CS÷tS²€îjƒëz_‘N“å'X¸í“=.ÀK±¯w’2žøÈ•Ýu±KØF‡ ‰‡kKÍÇ£#ÀºÏ¥zE[GlŸ–R0ùí^Ô?;%B⳿mQbI ™‚F•²2b5t0øȦÑìKL¸’‰^úìcÉx¯Vv»kiÊây=ŸÒ]’¾Ëô1W™@Dÿ)© °•2©)EÎﵨ®%?±ã!†\$˜—®œàsÛilvz¼‡oƒ¦NÏ[H‡_C™ÌOô~ŸÝ+!0NQk¡ÀêÛd0'ˆ‘®ó“ø*ËyOåy ’æ…ùŠÏE[´—¸?°À¦çå‹(Hfèj˜ ‘Âp¸|^bJŸ ˆäà§i'Y  ôŒöüåv’$ä|ÔKN²ÁHT匫õ^AÑò|~qbÆ3}采zŠÐ7ò$Ñ ­œ×"vÜf~X’6ÙZvXÍE´=nPƒû“sÅØ¡“–BsýÓŸí14Á2Šù"g¼9-®Ò„Ô¾9“¶d-ÍnKû®y+¥r‚v»í‡Ï‚rJ±=,ño±‘->µŽ;êòÇÒàÐTÍhæ¹k-mwÓ+Hb§ Ùü¥õ¹ŒXO¦©æ¡Zãp³¥ƒ¡ho¯TèÜŒâãl¸|eÞ”"‰&/üÇà–­ámÀ©8*„µ]®i–]«1²"Öú‘Á³ÃÞ’PRÊ}Ì„Ôjƒ+Z—¥v 0•9-!ÙªX¯bˆÚï/f€•¾ËK´·èzŸûN¦h¯µ~ë€,áô³1ÓG*4’àtŒÙ/¶T÷I‡ÕÑ&NåZe|þ‰›ý~L¿î…WÛ¡Brd³ò¹Ï¨bæ¨ïÊIXcŸÜ}ãß;)côD  d7×$x0Ts4«¯\èpu ôºù[W_á4 SŽ|yPWè[ý2‚Ó%µ!i.ËÂ!ÁÃu=áï%pËú)‹?T+`Xi0:’óíò?ŒqLˆt檿fƒ¢‡`£*âFH¯Ú¢sÂaOyõ}ü·;ÛüMÇ=Îq[5Æa³—Ö?ùD'‡ îwM¡óÞ©y ¼kn‚p’YŽÐô’î›Ì3£-?ÁòsÙÓá1ò@¤|PLÕ6Ê$×8Öà¾Àˆ ïù¬wóïÀÝPpTÿ!²xŽÑ ©‰€™¹¶L)d…"³Á„ëgt|iyÀr­Íþ"½v'! vxP‚ÝÞ¸UD–—ª…IúDŠCI@ôGÊêÅÐ(Z3¾¥qWºøÎïR¢“XöÄ1%i×.Ÿô¿7ï¿É†[cRqÁÆÔϼØûçmO@ê· ¥e‘”˜¡ ‹weg¥ë0W»Ca˜€ªÍ•¾ˆÀȵó:|My´‚ÈDHÝò%ñ\Â3KÆÓÛm¡4¬$;‰ã+zT¨M 6tël¢QNý7úŸ½ÅG¡ûë&? c:W=¸}ÅB‘ä[ãäîyuØõvñÂdzþÏJÝç‹xædDZ‘dk­ò£À¥ZQ Æ©v›Ö dèªÑY)Œy™²²™µgaƒŒÚw}O»6àí]âäìC×/×\øäŠõÒ™¬°ÿ=ÈO¶' ê‘CiAGSÁ¡%NΆ×ÍõÛyGx=˜‘ñJƒëßÒÅó£fY»ãÔAÆæËB77É–©JÌø*ß ÜùùJ Êa—'» ¥4“šzà/ÏÒMMF3úhQª‹,d³?ÖæÅRÏâYr¹NH !¨ÕJ ¬ b±la ;©#—Ž_[¼µ·æÉžÚóPBå€1ç7£Væ"¦˜¨_Û'nG}ü­ ¨ÿP3zJ_”zÁËH¼,=®¸­Ü[Ct(•“A=üá}]õ¶Eú® ¾nØØS^×Úq«‰ùØÕåIc|Qš—T(ö†£Ô>µê¿¶‰—[Ç(.BèjÎz‰šäá–“¼«‹†m@ööEAŒûxEŠùkšñ½T´tz‚°)Ÿ?ŠX=ÉEý.+J©?îÒ}V˜¨×î,Ÿ$U8ðWΤ ã+{cˆýÈÍ_~oºŠ×„óÝHÿeV–Ù±U$Õ@$Ѩó{íybï( ø™“bO ôRÅÀ¬õæ‡= í™`ßl„*g² ]Øâq¢ëΜ† ¹•úeã £ä"Êñ¹Há¿_V§ÃµôÏ œÄ*|ë÷B£Á ˜u÷ØŠ#ŸÐ¯è.¹K ðdM‚¢UºƒbSßüD„ñ‡BO áº+òmÒ¿)÷¡êDk¹ÝgÑfRHÊm Ò¨?Å„ è  ¤^0ˆü/Š,ÌÅÒöïª,Éc·ø>8 Ê¿Æ+ª(•0ÚmH.«ÔqÄJpÁ]zÙ¡r›¢º:_«‰Íš±‹ÄG›ù&«Kå[âæì'VÇ·‹£ÔaþCÉ9/X¤þnoˆþvMïirÇèYüÄ®êTñX%Cµ¹VÇQ=OóÕˈ²ršD4N\Æ_þùJQyÑ•`#Ѩü4~ý¹kN,§qˆ½j[ΆZåÖYŒŠp•g³„ÂyÊ߃ˆ3mÙ~q&×C‘`.ƒþÈn]{/±ê1Ù V _ÙÊìõ è ðp½ÏÜ7ÏéËÜ/¢¤ZdÉS¶GuЪìÄÃÚ§G(’“:}4ôRö zmmõ§Þt‡•AbA‡…îéE§a`hC[Ä…¥›ßŒ`i8Üä ÙzÜŒ¢8Ë ·ª5Ì{ƒ­‘p^æB:EÉMû‚ú¼² çnÀ+ôEœ„-c!II¯ïFÆt+¹ uPS,èMãå•r¿ÙSµXã6;f²÷´üê²~íP÷H¼K¡ò‰EâÛ«Ì ®ŠÝÜÀ°³W!n¡ÃG @ÕPnÛÇîŽP‰ãŸñå ÙÏRýÚÂG\‹dÁ4„-N…Ãl³Õ…©2i×Q:“Û'cW:Ó”f@H( j8µáÑ™8³¾ý®óš?þ¹&´ìÑ©ÿz‡ˆè^yOžÅc€ ¾îæÒtóæ„[!hß-7(¥6'a5êu´X&…5/n.Šêõ‰ KwW þÅ‘ÎÅ2_ú¾èl Ñ%bê®m2n‰®¢«xB9dõöl°)EýùàøäƒbBeª¯ÄõŸí?Èn²´øÑŸ·¸;T²c‹W#;ñ³:ŸºB³e'ezI×T6‰d¨#Š]¶sîüW.ø×þð­° —ü°ë{7ˆï@nÒ߆–¢­š1ë³óãªR×jabg'ú]Ý…tëXUG£–óÈ=3! £…(YGà DÜ©]qïzGýÏG³YÌÏ«…¢ zÁÁ¡ øãâ†2‡öVhÚŸ½|ïµôl£¾.­á‡°¤#¹u7Àð”@ÑØ)Ïg€êRá4—¸¦ Y UPЃ!`^cr{Úc_>6ËsÆâ*ãø=· @ÙUÚ|nYlÜÓªó"Ò—Ó;ýIY¢*ôTO0}Tú þ>9üкöE·^ÆFOE¦õ¯ˆSYÌ‘Sr•IxÓÎÙmÄй3fŪÔjß;‰¾ø²à¹…ÕÎ?úµtçof7äWbúJ‡4& +ÂðMV¶þ¸(‰'ñ¾÷L§S­ïë,Iç²EÃ2÷Bñàê}ËÒ×8ì8Žäk@§Nc7í; ä4ðZ3Q{/\hAcú&·ñçƒCÛ¼'á‰1Ntö({½ïº˜éÑ2®ç"Ò‹»CÌZk]Õ˜—*8@<faéUo²! Ô = ¤Uô‰5|¥Æíˆ o†z ÆÜ¨†aõ?˜™ x’X&ÛUteYëᡌ¬~ß^sÙ ýœ vk‹ú„“DgMF\÷õóÞ÷‚Kpbm #ù'×8ÔHs’æÇèbú2,:Ž'SŸÝ0›¸èªKlÕJŽtyœ©¼öŸèw*%ÕjK'°öšû¨¶Ç…’¤Õ‰ÿüHQ/~PíIzãïÉZ\¼‹È¦ÙÀ¶:œO¿$1^@Ä|YŽߺ®™KP (œ„AtQZù¡8(¥ÉÈ£Ê|m4¤‡ úY]ÆÇ˜PÂ&V1¨á¦¿œ¤º/ŒÅY©&ÙĬLèóÔj}I©ËÀ0á#‡rôÕšì÷ÞèNdı°óŸDäZ½.ÙêúÎ8 ’×Veð֘ϧLƒ—É€«âŒæ9½!]¹z![†{&j«‡[†EÇxã…èØ6”Äj*Žrð*éôA÷én/¥íØ<0m”`ÄU\ÔÔª\¹ˆugù†Toi½CiËþwUfx±¨tÖž]ò÷ño0[:‹é¨sÈ ZcxåJMR#ÉyWš$YÞ ¨a>ÐAQ‰iÄJ…EÃØèÚ0hWLúC»xF/ ¬°Œú·Ëµ¾Ý6+¾3pbϘn7!ÿû±C(‰ŽçAZ©™r.ŽÄFg…ÿr¹ÅjŠ«cFvº vïE††°í¿È¡Ãá4@ Š˜F7,ÝAF³¤ pßH×¾íµó)ìº(!.Ê0Œ¿6?xÛ(œÊiãèf_p)pªqF±€ºìÞ©ÿ‚7=—}– „ ‡_û2( Ò1T9½À¦8H¶ˆF…“„#uœåCŒ­¸µ³\‰¹$èïËÕòˆé®L%<Ä»OKsC—Ä: Aêufvèñúc“œR°×WÑ›íï9°ý ƒìr*¥ܳ  TÐêÚ¤çx®Â@ý7D³ž kðºiñèGæ¨ PšöK"!`Zz÷ ^“£-†FI8°€²7&XH+—ãáX¨ÊzPå'˜KfˆÁŽ:ÿx¤ž!R™^Qˆ‹7Yűû:I; PPcf‹ñ5ïþ`µ:–hŸs“ó£sà†ë§&é4ÐX[ÃÇØÔË„q„e<Œ¹óHš nKcmZ¶PXx lŒü“ÜȸƒDÑï´K§à:,èª4Ï„÷Á aäמ[ëîGyD±>}/H¢R,?¶¯ó䊑K† ¿Î4evn[åTˆ¸áI :fªqšÃå,7 l’{ ÇkÛÃBU+2³“¤>ôˆ2ÈÆ6Ê%þr᥼²Ì/µ¤ŸÈG­$I}¢î1*œ„EÈ5ì [ {“_8”ÿ­sÛÑ‹ø 1ó‚ѵë|½F„¡ÅÏï}3Læé#/ÊÀËòpR¨ƒ«~Ô¥Q¼‚¬¢CÄMÜ/ñ _Ô²Ú'>þÿgjDœø£»ò¸^|€^«®{ãfoä!o™Jè®GÞ`Še‘ÅåþÈšÝò(°>„CšZ½¯ÞÃ4Û~ Bðsù~ù»YŒ§¼)j4Õ">¡TÊð$!U0I9pñø@ÙSØJžtÈ^r€45ŒÝ¡qH:y¾#(“@¥0/ÈäÕ\æ´tôÛ»ÏÖ Ë·,Y4ž^RŸl^á—ð¥Ãm‚“b$BdôB¸Â¢€Ó%êSB Õ ª“œ·ˆ¨d“3C<Öºv!Ü@·LíOQÅc!eÞso0ñ|Cò¿dóÚ íÀ£ÅTÈ¡åsÌ–×c×Ud…ªè:™C)òégqÝç]Ò`¬£0LxVmÁ|•»µ;ÇÜfä>W.øîLàê|Rž£Ëq¬{U–пeHÓYè?qZ±{ßœùÙ¾tŽõ˜ÝÖ#jáœþáO9ÿæ^>mbG#¬×S»Ù:[K²D¥‹±ŽËo{.€ûõâ%òÃìÖóõñª¡,ä¶Þ æK™+kHqîMiCý¼?ÄcÿYýÚ"²ƒk4›ËÕýµ¢VX('€$Ï97úÀ0Ô¼þ\e<`L¬ šŒ;"éZ^µü¡§‡<Ð|›œõ;Ùn‚Û€Ðí-]Zëÿ,ˆ~†Ùœ\˜WÚÄÏíjZ$ÃyÕâ…%~q­pWZãƪ˜E÷¶¯_°öú 2Ë% e«^kŠ‘ ¬»fR/*ò—·'wf(ø—&ˆZŽénk# åÀJ°p¹˜ÉÌ8â|L™è›³sW›)*Cp‚̧høáHùÝØDЗLÑ,=>­z÷²(}ËÂÁš6F‘UáÔý,¼*÷¢z‰¨ ´%·5¾¸tN²RÒ{@Éqÿ0ÚñugÔ-gÏC‘¿+A­x¢^E‰ó4s‹—VÿW­ki:/kfžúˆädrßï‘$´=ó$ûmKjj~ðpþ½æäŽ`Ç0.¤&…ÖŽN49ƺ錔?)¯ª'º´VÄúœB^S*0U+X&TÌOÚØL¸²€"2ma:Æ_£ö›õ"!»Š\Ê0ÃV{mÀÕ'HRÔ½U°m/@·tæ‡Ü›F†ÆlR\—ï)ÞfJjÑVÞ*Ù>]_Š˜Äb¡7Žÿ㤦yö$È$"Eüœixú¿HŒËòÀŸ^Ç~ˆ·€ŽÕcX¢ÆR¡{1žV{oMÈ~8ެeÆÐã8(ã×(•±¦†Å=I;Ä6»2}5vê1Œm[êéœGÖ®O …õÎ7Î.þ²˜Ç<£¤Z2ˆŠK•*'ÖŒš–»w;9åÿ‹ëð=ÿ|ÿc.ºœ‰Bœ)žö–¦*d<9™ŸÕ$Ö,^£¾=ô¯ï ˜²Xÿi³ÖÖmN{°<-^êÉ=ÎÀ/þðá@hDbp&ÙVþƒušZD™À<×?JZŽÏ˜Ÿ~¦xÜÙ¥ ]Îqÿ€£ÄÑ€²NÏä?£ám”Ãkÿ}f\ œŠ @جÇâj5`'êDªãõý.Òi åýŠPe#çÆÆ‘vJ™Íé¨]s*Á!Í{lR £¥‰º÷gÚˆ.¨±G¾*rêu2žäšºv$Üz¸¼ñÇhç`jaá>8´Q„ïQ»e(³§óáéïN­ê›ÐÍÓmÆÑÉáñ=5X)ÆçÆ}d iº=§âjm™8+°¶æÏ»*8x¯6ësâ–xž `Çp`{c{` ÅLcÿ*[Ò•[©Ñè"¤¸iî2Zˆï©òh¿Øx®wq“ÕMHqc®,®T‰À`+E·” ¿˜¡çfÁ "éôwÙvËÆõM,‡«Np†wÓëÓYI¨ QkÒsÂH”€ﵨ®%?±ã!†\$˜—®œàsÛilvz¼‡oƒ¦NÏ[H‡_C™ÌOô~ŸòXÕ\ÈSÙ5–m¹Nƒ'[yûç¶À´-Év;A¬Æ B-Z>…¨„qÔô›è­îûg˜R*y´o¼@]‹'µÞ }†oûÛÿ &.åV¯nïEH6ËÏôléðXq¸¼M€É!®áØr%ŒÎ òÌs–2^'?-ÑïéˆÝ¿Ã*ísÎ*¯Ìs'f=ü›ùغ9q¢·¾ƒ¹¦=fŒ¬g»Á#d¡óV4^žGu{NhéÒ´¤jý¯â5¡s"χK˜ šÉæ.ùJøASú §©ÁH^A¤&cwˆŸSŒXÞÄØÔ÷™AšVˆ©2X•ƒù{\46-Â^—t{®[¹;QNÒ„}aÌšÒ¢?Ë´ŽbÚŠÇJEœúˆŽ] é~⬯xÜ<í³—ªÌ7>t¹„ÏÍ´2þgÀw[=IŽˆåžŽP¤â™–‘U>žþåJåûó¹•î>+ÌíÑ©e-Ó˜mP àªž ÊÂâ¯?Èã€Ñsúw+³ãµnÀjLÍåbš;kI­‰••Fô(5¿Ï™òÇ‚¸–ÑÕé>dK`þ”óÉåðPÎß·_V÷´MÖS" ÿdºöjÓéµËlrÓñï›òàd÷U¯]s¶¥ýÐí©dÚÊ?§ôqÞ¥ha^m}þ/‘ã^ ¶8)÷ÍünU‰P/ÿpf¡üêä=‘ n«L.Ý—°€Ã•Û ˜mÀv6læIâU£›q­,tå€ÇêyïIbÿ^NÐNù|‡òV ûTÒQQKÎvŽÅÄû½ðëžÙ¬°;üCì›õ-þPeÿ I£Õ ûªD0ÓÜhesÒm?×ò“óØIpŽôÕs@ò˜¾2ƶqRH*ùq¥pç |ÿPU¯F¨$ nͧ¡†É¬ì+ûŒyí³²x íàï³Êàwº î¡bIêòǃՅ]¿^/wôj{uß é\LKõ’òæ÷ÕAA%+5u½îè¾!pïfq×öS‡È°Šg£ËarÖƒîâvF›ñI* Ëô×}%xaŠOä²!T‘_7‚~•now»™²–EU6­s¶´ ÷ÙóÐÀ=c…²Iá&b3Ý}¾lcN ?Õn5ÊzÖÏÄÃ:Íc¯J¡7¼ö®8luÜ·Äaø‘¥–­z4m ;ZÕ—Ðßd“aú4(6PÕÑ)/ẨüŸñå ÙÏL&HdtqÉR>Î}äÈ>})ø >]SŒf^ \ë†ÍýZ´¥_°êÙ"?ßÖs= X`@Ç…ðx_ûVΦiª‡HhüÃKɰ–[õÔÍAÙ«bÝcÛ|A/2Þ ­ Ój‹ºŸº¶yÜ )Ðæ|ƸF-¥€bµ”A8ô“n¦îäKÍõÐùÊÉÞ² ž)½ÑJ¤nJô9š”ÞB?Tv!hJ;ÑpÄå ‚ƒ¼Yz .O^˜%‰hG¯K›nÏ•-Y¬À+F½”‘ûâe ¢×ÝûnåÞð¯-ŸÒ¿¢Âë1ø©SÚf¯y5wïîéÚ?ÂÅŒ w?¼ŽÅ&%kNˆ\ùÏ8Æ÷PùéW!”ë”ù+ò¸ñ 3ÄK¸}±N,[M1ZÑ׎ýæ1vñ»›J<ÛË´øÌuù¯C• Ôº4rÄý_´ýb S|ò¿Íƒ–œ)Š`}Ï&â¨~BÈÖù«3ørè!ɯFµ:@T¢šÃe—ÑHhaй3fŸ¥ëõ½õÊò²¶¯º”KJqÞºm Ø®þCA¾FÑ’Ñ·7†bkòš0ôê:•M?©RêdO)±BWЀ5:Út)áŸ!ø÷ÉApÕ rÜ2 óÉ_¦Ÿx樌0ÉtüM(óˆÁæ›àínaûYOkezçú!þ9¼ÝâÊ“,å›Ò•¼û‘ê­É'Ö+³€Z´Þ-È{ô·kˆš¨Fˆq{%²0wÀÌâVmæïffUý³kPÇ$…†6(ƒ^/oœ*¹{k'¶ôþ}ÅTy¤-‘pÒLüÇÍ*ª¿·7@˜á¡Ç#sž›Äã„&8z5z0¾Â±äæ1þ–Mî´IbÿnÖQû$¦Ù„-Ϫ¶_k‡ôÏ+¤}XáM¾[|¿äeãxÏ£õY£sÊHÞý0<…"ãþoÚ 274»²mŽkái€v©ŽMæ@’ÏWR…U|iŒ- ãVH^>Œn×{-du‹CÚS7¾\dñ6£šmãN6 *ô.7“KÌñܰ™Å§ú¯-†è›ïs¾ÂB"pM‘±ìù¤X°þë8Š`k¬¹oˆø£xr—ýérol®‘"íð1°W‘»œ¨ Nͳù7é%Óìå5yÛ/=ìDªÌ!ð$ÔRÅ}X$váÓ¼`¸ˆ¤(<5ÝË·:v{Ôm–Ý×Ý#õõíA­ýˆa±w‡ŽlJ.I¨’ŸJUº­?é¶W:ÏdÒ›ª;»ãu"‘Á$ž°öG¦²ØŸ"~[¾fzGâSÐ ƒ’g|å‚$5ÁíßŸŽ x+B=`¢÷AÐCk–ml–ž¯•&å¬ÿî¥Æ%ɲ“IÖ>ç]TJ¥÷b9:Ÿ5¶šî=c»-±™úž‡×ê²Øÿ4é[TêzýC<ÓvÀ$!Ö7€ÅÒÉhÒJ978t‚ÌwN3JeÁHtÛfvs˜’4ÏCÔ\z‡âŽÓ§^ž¹ÕÒJîÙBe”—`àuí’€ƒ±lm3?¿ÄÁú¹Z)Àu%R¼n–ÊË@µì·z>µšßEýP ‘½Š¯kv Pr/÷uÈZPMî>‘€uqå|Ë.ѳè(bÆ+¥zìî¾]kF^´jˆÂ?pøtX–bìcµ@vÔi‚HK¾Ý£rŠø‘YPKtèpáuAWÍ©ÌAŠÖ§ôÜLÐsÒ*4' þë¤p[J­DG¦æ9ä€ïÝÆ·}ú ýDhôª~He€ø«}ª‹î…: `ÞÆ—¡ßäÀw½h÷FÈC 5Î<²Òá¦7þY"„Íþáí ®‚ò)„\·©²Ò©Y«êeV§ß 'z·pÚÀÌjLˆð厖¸ÇÞq¤‹•¾Ÿ4 I}Dê+™Ú“†Jms¡yNŒR诟'N2ÏL&œk裩2eIp+IÂÆ{Ÿ“[»ë,¨fŽ:ïüà?†Jk›Ê¥"©¤¨dßHXº¤× 1\Öʲ$Ag[Z:_wyI þ”—Џ:G`7éæ«¸÷^­ i棓P„çÔñD7Yù‰Õk¤ŠÁg°Å‹¹©Ì_åöÚÓê§¿†Ÿ_mÍÛ_~Ú·öéí»ð¾ªžúªÛ ×Õd€ã¡ªÝzö–AmãFA‚Ã7qD7 9D¦§‹ØQ"ã‹ÈÂXFâÆnf•è>ş׺FîÓ1ëa›6X"7ŸAЇ!ÑýåBdEÒ—„k,õ¬¨Á$ŽfðŠíø‡ÿ*{IÝÃW&Š;Èü|[·Pþ(Î’¤*‚è ¯XƒœÊèçiÐôMþf– ħtßu [_™Q_ƽԮøY…î‘WH¬NƒŸA’EúØ#Ø™ü‡”c ‹½Ój‹ý9F E¸Àõ9H•4sÈ Bi ¦ô•ð$2LÒÖ`.§•#Ð<1ûehÌÝÄ6R³³“.ö Zt¶Ùð ;„øáê—Ç€ø4d! àÎQõ¦'“€,{„ ½h(4°÷©©fXÝ89_LßðÀ´Á‘áár4°ìõö‚^æö öÐVnäyRT¦BÓ‘á²ú–¼3;Xe ©éyØR4‡ Ž%°-CÉ&ÄŽO=›»ñ3e ËÄ Â >îo1Uª7˜ÝŠ8î0S*L ÒN éÿ ûX(‹ÝÆ,HòOþ‚~O5 ;LJàŽ*N²-lï~á6r§xËb‡Õˆa“ˆÛ7]x¾Ä'ê)ÙS¡°SÙ‰íô*j|™žêR}ˆ®IøûÈh”01ªýÖQ¾¥8m@£º ˆÿ€IP`èõÁ©= pNõÊ.í %ÊZp³KO¨ŸŠÊ‘ÒYþ«ò|¹{pi ÿeÛXÒ×èP²íó‚iÔäâ=ÛÜi%ªú4©LŒ9âÂEÓ÷Ò3JˆÜ;œ¬]gcG\.@xÛoã¼AAKþ³ÄÅûèŸ$+“T¾rö^ÀQ4ÏO8PW=px£eœÇc=ÞªËESÁ÷ÏH ¢$Sgå~’@ ƒ‰õ­ ‹¼éÜßæX”š‡k€ñ8‘ù{,¹w¯—íýiÖ[q{»t<5´”ù×ui«?'ØMT6o™m°~D,ÊÂ4aá$õã2"@–’¼‚÷”Îô¹¼\¢p×m ±ö¯"w%WHux“8žiƒ# :ÄÁBñp†‰gyBs‚bÙúNÉàÌZ±ä†ášoA r.¤`EçÒ’«ºÖn??têÙ§ÁÇ\º5³çú?IÒp*}&’ Xô•ž[ âÁ3•‚£¥§±×Á‹©yØîZlH×µv3ŒgZ µËRHCa7Àe=sîšý…–~7ãÂa¢…ɾÂÑçÖsãŠMyîpóêß:P?üH ¨NMoûueSSIà±ÍòÂFÔ­uS|Çî-,³ôÆÞ¡JxŽ©–¯§ÞµPÖ¦AvgÁûØ"> Ú'–´b° Önî†Dnº "Þs2S‰²u“¦ñS„f%ˆŒæÿ}xÁn0 ÷ ?ãþÂ’·*§°­+ÐeÞᑲÓÕú9>Nç\%-äň•½å¶ºîÓ#ÿï³úñÁÂ`ú0–M,{ˆ‰N÷6‚Ì“õ÷;ÒÕs˜ê7 Rþ÷Ú‘«ÿ«°°@ò€óh0?ms¥4…2”Oàï'•M23§ yqvû™1™}xÒ¿“y©¢ ÍÖ½Qžt8Ö]î˜Õ0ª9¼…t-ßžu´‹›8Ö¾˜]ÎBúû5ÂLaÞÌÕ#—PÔ##fêäÎ+~ë'ß“£ ]‡2:G;ÖŒ á+š ÞC&@ye3ë[ ë¡--ðžÔ _<^GFwÖÌD­Söõéå‘û5Vÿ!2K+Ý'Øë£ÍìB6ëý"jñŽ·C-m<ŸÓ4hõjɈcKö­O6{ZÓ„P¥ÞŠž?¢3ßbi'òÖÀù£SÃ2L²'d³*O:V2VO¯œ Ú”ëÃewóv¶D«¯ã]yøÉQÒh°»~#ay1Ü·Á©·®×˜/J ³7€7×ÿá®?ÂWm³yëŠâWFÏÆl7¼)rKhØcѦ@áó󽓪ÏgE·h\¾iªcñ~ʯ\ççÎ Öî2Å;oyCŸ¯’®Z}²Ø#’—G`yÛ/饪żÚòªÊ¢âÁUA œÈyô3o|Ú­YÝfaW}ù[ªXŠÛÿ+ö@ª¯„ëÎE/0XC; v[å*'%P½¼ Ä@`ò8çÒGB{ŽyêÅeùÀÆ&âzn‚{µÀå¸bLŽÀÛ=­˜ˆ]<ªàPò…]p(È;FóHALbª¾ .˜„`‹‡¤!û\ðÿm¤´0=ƒ(zòŒ'vߌMú2Ò‚y{™¿šÍ,ø’’ÃXÅø‡- h¯RýQ: ÞœìGö[šõ'tF>ÖâZ¸Æîñ+^•âeÊs¦[X7 ·þ ðÔu¤ê±ûôø©«Údøùƽʎ71j;¿âY^l°‹Æ*«÷Øs 9ðD‹¢NsƧž¥q8-ô³àð©Jùî§Ã8„4BÇ~Ã,ºTœÐGgõÿ}ÊŠðNE9(/§§*þQÑS.£ÕÕv„Œ‹¿ Ï1D7s void *g(void *d) { return NULL; }]], [[pthread_t t; pthread_create(&t, NULL, g, NULL);]] ) ], [thread_CXXFLAGS="$flag"] ) if test "x$thread_CXXFLAGS" != "xfailed"; then break fi done CXXFLAGS="$chktls_save_CXXFLAGS" if test "x$thread_CXXFLAGS" != "xfailed"; then CXXFLAGS="$thread_CXXFLAGS $chktls_save_CXXFLAGS" AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include __thread int a; static int *a_in_other_thread; static void *thread_func(void *arg) { a_in_other_thread = &a; return (void *)0; }]], [[pthread_t thread; void *thread_retval; int *a_in_main_thread; if (pthread_create(&thread, (pthread_attr_t *)0, thread_func, (void *)0)) return 0; a_in_main_thread = &a; if (pthread_join (thread, &thread_retval)) return 0; return (a_in_other_thread == a_in_main_thread);]] ) ], [ac_cv_tls=yes], [ac_cv_tls=no] ) CXXFLAGS="$chktls_save_CXXFLAGS" fi], [ac_cv_tls=no], [AC_LINK_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])], [ac_cv_tls=yes], [ac_cv_tls=no])] ) AC_LANG_POP(C++) AC_MSG_RESULT([$ac_cv_tls]) ]) AC_DEFUN([AC_FLDIGI_TLS], [ AC_ARG_ENABLE([tls], AC_HELP_STRING([--enable-tls], [enable use of TLS @<:@autodetect@:>@]), [case "${enableval}" in yes|no) ac_cv_want_tls="${enableval}" ;; *) AC_MSG_ERROR([bad value "${enableval}" for --enable-tls]) ;; esac], [ac_cv_want_tls=check]) if test "x$target_mingw32" = "xyes"; then ac_cv_want_tls=no fi if test "x$ac_cv_want_tls" = "xno"; then AC_DEFINE(USE_TLS, 0, [Defined if we are using TLS]) ac_cv_tls=no AC_MSG_CHECKING([for TLS support]) AC_MSG_RESULT([disabled]) else CHECK_TLS() if test "x$ac_cv_want_tls" = "xcheck"; then if test "x$ac_cv_tls" = "xyes"; then AC_DEFINE(USE_TLS, 1, [Defined if we are using TLS]) else AC_DEFINE(USE_TLS, 0, [Defined if we are using TLS]) fi else # $ac_cv_want_tls is yes if test "x$ac_cv_tls" = "xno"; then AC_MSG_FAILURE([--enable-tls was given, but TLS is not supported]) else AC_DEFINE(USE_TLS, 1, [Defined if we are using TLS]) fi fi fi ]) fldigi-4.1.06/m4/bind.m40000644000175000017500000000454213472116043011465 00000000000000dnl Look for a working std::bind or std::tr1::bind. m4_define([_AX_CXX_COMPILE_STDCXX_11_BIND_testbody], [[ #include void f(void) { } int main(int argc, char **argv) { std::bind(f)(); return 0; } ]]) m4_define([_AX_CXX_COMPILE_STDCXX_11_TR1_BIND_testbody], [[ #include void f(void) { } int main(int argc, char **argv) { std::tr1::bind(f)(); return 0; } ]]) AC_DEFUN([AC_FLDIGI_BIND], [ AC_LANG_PUSH([C++])dnl AC_CACHE_CHECK(for std::bind in , ax_cv_std_bind, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_BIND_testbody])], [ac_cv_std_bind=yes], [ac_cv_std_bind=no])]) ac_success=no if test "x$ac_cv_std_bind" = "xyes"; then ac_success=yes AC_DEFINE(HAVE_STD_BIND, 1, [Defined 1 if we have std::bind in ]) else AC_DEFINE(HAVE_STD_BIND, 0, [Defined 0 if we do not have std::bind in ]) fi if test x$ac_success = xno; then AC_CACHE_CHECK(for std::tr1::bind in , ax_cv_std_tr1_bind, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_TR1_BIND_testbody])], [ac_cv_std_tr1_bind=yes], [ac_cv_std_tr1_bind=no])]) if test "x$ac_cv_std_tr1_bind" = "xyes"; then ac_success=yes AC_DEFINE(HAVE_STD_TR1_BIND, 1, [Defined 1 if we have std::tr1::bind in ]) else AC_DEFINE(HAVE_STD_TR1_BIND, 0, [Defined 0 if we do not have std::tr1::bind in ]) fi fi if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_std_bind_$switch]) AC_CACHE_CHECK(for $CXX supports std::bind() feature with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_BIND_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_cv_std_bind=yes ac_success=yes break fi done fi AC_LANG_POP([C++]) if test "x$ac_success" = "xno"; then AC_MSG_ERROR([Could not find std::bind or std::tr1::bind]) fi ]) fldigi-4.1.06/m4/np-compat.m40000644000175000017500000000337213472116043012447 00000000000000AC_DEFUN([AC_FLDIGI_NP_COMPAT], [ AC_REQUIRE([AC_FLDIGI_MACOSX]) AC_REQUIRE([AC_FLDIGI_WIN32]) AC_ARG_WITH([clock_gettime], AC_HELP_STRING([--without-clock_gettime], [Do not use clock_gettime lib]), [case "${withval}" in yes|no) ac_cv_with_clock_gettime="${withval}" ;; *) AC_MSG_ERROR([bad value ${withval} for --without-clock_gettime]) ;; esac], [ac_cv_with_clock_gettime=yes]) if test "x$ac_cv_with_clock_gettime" = "xyes"; then AC_FLDIGI_SEARCH_LIBS([clock_gettime], [rt], [$other_libs]) fi if test "x$target_mingw32" = "xyes"; then # Newer versions of mingw32 comes with pthread. sem_libs="pthreadGC2 pthread" # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no AC_DEFINE([HAVE_REGEX_H], 0, [Define to 1 if you have the header file.]) else sem_libs="pthread rt" fi AM_CONDITIONAL([COMPAT_REGEX], [test "x$ac_cv_header_regex_h" != "xyes"]) other_libs="" if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS_saved="$CFLAGS" LDFLAGS_saved="$LDFLAGS" EXTRA_LIBS_saved="$EXTRA_LIBS" CFLAGS="$CFLAGS $PTW32_CFLAGS" LDFLAGS="$LDFLAGS $PTW32_LIBS" other_libs=-lws2_32 fi AC_FLDIGI_SEARCH_LIBS([dlopen], [dl], [$other_libs]) AC_FLDIGI_SEARCH_LIBS([sem_unlink], [$sem_libs], [$other_libs]) AC_FLDIGI_SEARCH_LIBS([sem_timedwait], [$sem_libs], [$other_libs]) if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS="$CFLAGS_saved" LDFLAGS="$LDFLAGS_saved" EXTRA_LIBS="$EXTRA_LIBS_saved" fi AC_SUBST([EXTRA_LIBS]) AM_CONDITIONAL([COMPAT_STRCASESTR], [test "x$ac_cv_func_strcasestr" != "xyes"]) ]) fldigi-4.1.06/m4/funcs.m40000644000175000017500000000243513472116043011666 00000000000000# args: function, search-libs, other-libraries AC_DEFUN([AC_FLDIGI_SEARCH_LIBS], [ m4_define([FUNC_NAME_UC], m4_translit([$1], [a-z], [A-Z])) LIBS_search_libs_save="$LIBS" LIBS="" AC_SEARCH_LIBS($1, $2, [ac_cv_have_func_[]$1=1], [ac_cv_have_func_[]$1=0], $3) if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi AC_DEFINE_UNQUOTED([HAVE_]FUNC_NAME_UC, $ac_cv_have_func_[]$1, [Define to 1 if we have $1]) LIBS="$LIBS_search_libs_save" ]) # --------------------------------------------------------------------------- # Macro: FCNTL_FLAGS # --------------------------------------------------------------------------- AC_DEFUN([AC_FCNTL_FLAGS], [ AC_CACHE_CHECK([for O_CLOEXEC], [ac_cv_o_cloexec], [ AC_LANG_PUSH([C]) save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -I${srcdir}" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include ], [ int flags= O_CLOEXEC])], [ac_cv_o_cloexec="yes"], [ac_cv_o_cloexec="no"]) AC_LANG_POP ]) AS_IF([test "x$ac_cv_o_cloexec" = "xyes"],[ AC_DEFINE(HAVE_O_CLOEXEC, 1, [Define to 1 if you have O_CLOEXEC defined])]) ]) # --------------------------------------------------------------------------- # End Macro: FCNTL_FLAGS # --------------------------------------------------------------------------- fldigi-4.1.06/m4/c++11.m40000644000175000017500000000526613472116043011267 00000000000000m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; ]]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], [$2], [optional], [ax_cxx_compile_cxx11_required=false], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" CXX11_SWITCH="$switch" AC_SUBST(CXX11_SWITCH) ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ac_success = xno; then HAVE_CXX11=0 AC_MSG_NOTICE([No compiler with C++11 support was found]) AC_DEFINE(HAVE_CXX11,0, [define if the compiler supports basic C++11 syntax]) if test x$ax_cxx_compile_cxx11_required = xtrue; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else HAVE_CXX11=1 AC_DEFINE(HAVE_CXX11,1, [define if the compiler supports basic C++11 syntax]) fi ]) fldigi-4.1.06/m4/win32.m40000644000175000017500000000414213472116043011507 00000000000000AC_DEFUN([AC_FLDIGI_WIN32], [ case "$target_os" in *mingw*) target_win32="yes" target_mingw32="yes" ;; *cygwin*|*win32*|*w32*) target_win32="yes" ;; *) target_win32="no" ;; esac if test "x$target_win32" = "xyes"; then AC_CHECK_PROG([WINDRES], [${ac_tool_prefix}windres], [${ac_tool_prefix}windres]) if [ test "x$WINDRES" = "x" ]; then AC_MSG_WARN([The windres utility could not be found]) fi AC_DEFINE([__WOE32__], 1, [Define to 1 if we are building on cygwin or mingw]) AC_DEFINE([__MINGW32__], 1, [Define to 1 if we are building on cygwin or mingw]) AC_DEFINE([_WINDOWS], 1, [Define to 1 if we are building on cygwin or mingw]) fi if test "x$target_mingw32" = "xyes"; then AC_CHECK_PROG([MAKENSIS], [makensis], [makensis]) fi AC_SUBST([WINDRES]) AM_CONDITIONAL([HAVE_WINDRES], [test "x$WINDRES" != "x"]) AC_SUBST([MAKENSIS]) AM_CONDITIONAL([HAVE_NSIS], [test "x$MAKENSIS" != "x"]) AM_CONDITIONAL([WIN32], [test "x$target_win32" = "xyes"]) AM_CONDITIONAL([MINGW32], [test "x$target_mingw32" = "xyes"]) AC_ARG_VAR([PTW32_CFLAGS], [C compiler flags for pthreads-w32]) AC_ARG_VAR([PTW32_LIBS], [linker flags for pthreads-w32]) AC_ARG_WITH([ptw32], AC_HELP_STRING([--with-ptw32@<:@=DIR@:>@], [search for pthreads-w32 in DIR/include and DIR/lib @<:@mingw32 only@:>@]), [ac_cv_want_ptw32="$withval"], [ac_cv_want_ptw32=no]) if test "x$ac_cv_want_ptw32" != "xno"; then if test "x$ac_cv_want_ptw32" != "xyes"; then # set -I and -L switches ptw32_default_cflags="-I${ac_cv_want_ptw32}/include" ptw32_default_libs="-L${ac_cv_want_ptw32}/lib" fi ptw32_default_libs="$ptw32_default_libs -lpthreadGC2 -lws2_32" # don't override the user-specified vars PTW32_CFLAGS="${PTW32_CFLAGS:-$ptw32_default_cflags}" PTW32_LIBS="${PTW32_LIBS:-$ptw32_default_libs}" ac_cv_want_ptw32="yes" else if test "x$target_mingw32" = "xyes"; then PTW32_LIBS="-lpthread -lwsock32 -lws2_32" fi fi AC_SUBST([PTW32_CFLAGS]) AC_SUBST([PTW32_LIBS]) ]) fldigi-4.1.06/m4/ax_compare_version.m40000644000175000017500000001461213472116043014433 00000000000000# =========================================================================== # http://autoconf-archive.cryp.to/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LAST MODIFICATION # # 2008-04-12 # # COPYLEFT # # Copyright (c) 2008 Tim Toolan # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. dnl ######################################################################### AC_DEFUN([AX_COMPARE_VERSION], [ AC_REQUIRE([AC_PROG_AWK]) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. AS_VAR_PUSHDEF([A],[ax_compare_version_A]) A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` AS_VAR_PUSHDEF([B],[ax_compare_version_B]) B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary dnl # then the first line is used to determine if the condition is true. dnl # The sed right after the echo is to remove any indented white space. m4_case(m4_tolower($2), [lt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [gt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [le],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` ], [ge],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` ],[ dnl Split the operator from the subversion count if present. m4_bmatch(m4_substr($2,2), [0],[ # A count of zero means use the length of the shorter version. # Determine the number of characters in A and B. ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` # Set A to no more than B's length and B to no more than A's length. A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` ], [[0-9]+],[ # A count greater than zero means use only that many subversions A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` ], [.+],[ AC_WARNING( [illegal OP numeric parameter: $2]) ],[]) # Pad zeros at end of numbers to make same length. ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" B="$B`echo $A | sed 's/./0/g'`" A="$ax_compare_version_tmp_A" # Check for equality or inequality as necessary. m4_case(m4_tolower(m4_substr($2,0,2)), [eq],[ test "x$A" = "x$B" && ax_compare_version=true ], [ne],[ test "x$A" != "x$B" && ax_compare_version=true ],[ AC_WARNING([illegal OP parameter: $2]) ]) ]) AS_VAR_POPDEF([A])dnl AS_VAR_POPDEF([B])dnl dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. if test "$ax_compare_version" = "true" ; then m4_ifvaln([$4],[$4],[:])dnl m4_ifvaln([$5],[else $5])dnl fi ]) dnl AX_COMPARE_VERSION fldigi-4.1.06/m4/pkg-config.m40000644000175000017500000000266513472116043012601 00000000000000# name, version, show-in-help?, optional?, help-text, [am-cond] AC_DEFUN([AC_FLDIGI_PKG_CHECK], [ m4_define([PKG_NAME_UC], m4_translit([$1], [a-z], [A-Z])) m4_if([$3], [yes], [ AC_ARG_WITH($1, AC_HELP_STRING([--with-[]$1], [$5]), [case "${withval}" in yes|no) ac_cv_want_[]$1="${withval}" ;; *) AC_MSG_ERROR([bad value "${withval}" for --with-[]$1]) ;; esac], [ac_cv_want_[]$1=check]) ]) m4_if([$4], [no], [ac_cv_want_[]$1=yes]) test "x$ac_cv_want_[]$1" = "x" && ac_cv_want_[]$1="check" case "x$ac_cv_want_[]$1" in "xno") ac_cv_[]$1=no ;; "xcheck") PKG_CHECK_MODULES(PKG_NAME_UC, [$2], [ac_cv_[]$1=yes], [ac_cv_[]$1=no]) ;; "xyes") PKG_CHECK_MODULES(PKG_NAME_UC, [$2]) # if we get here the test has succeeded ac_cv_[]$1=yes ;; esac if test "x$ac_cv_[]$1" = "xyes"; then AC_DEFINE([USE_]PKG_NAME_UC, 1, [Define to 1 if we are using $1]) pkg_[]$1_version=`$PKG_CONFIG --modversion "$2" 2>/dev/null` else AC_DEFINE([USE_]PKG_NAME_UC, 0, [Define to 1 if we are using $1]) pkg_[]$1_version="" fi AC_SUBST(PKG_NAME_UC[_CFLAGS]) AC_SUBST(PKG_NAME_UC[_LIBS]) AC_DEFINE_UNQUOTED(PKG_NAME_UC[_BUILD_VERSION], ["$pkg_[]$1_version"], [$1 version]) m4_ifval([$6], [ AM_CONDITIONAL([$6], [test "x$ac_cv_[]$1" = "xyes"]) ], [:]) ]) fldigi-4.1.06/m4/opt.m40000644000175000017500000000155413472116043011353 00000000000000AC_DEFUN([AC_FLDIGI_OPT], [ AC_ARG_ENABLE([optimizations], AC_HELP_STRING([--enable-optimizations], [use x86 optimizations (none|sse|sse2|sse3|native) @<:@none@:>@]), [case "${enableval}" in none|sse|sse2|sse3|native) ac_cv_opt="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-optimizations]) ;; esac], [ac_cv_opt=none]) OPT_CFLAGS="-O2" case "$ac_cv_opt" in sse) OPT_CFLAGS="$OPT_CFLAGS -msse -mfpmath=sse" ;; sse2) OPT_CFLAGS="$OPT_CFLAGS -msse2 -mfpmath=sse" ;; sse3) OPT_CFLAGS="$OPT_CFLAGS -msse3 -mfpmath=sse" ;; native) OPT_CFLAGS="$OPT_CFLAGS -march=native -mfpmath=sse" ;; none) ;; esac AC_SUBST([OPT_CFLAGS]) ]) fldigi-4.1.06/m4/hash.m40000644000175000017500000000621113472116043011467 00000000000000dnl Look for a working std::hash or std::tr1::hash. dnl test for gcc ge 4.1 m4_define([_AX_CXX_COMPILE_STDCXX_11_HASH_testbody], [[ #include void f(void) { } int main(int argc, char **argv) { std::hash()(1); return 0; } ]]) m4_define([_AX_CXX_COMPILE_STDCXX_11_TR1_HASH_testbody], [[ #include void f(void) { } int main(int argc, char **argv) { std::tr1::hash()(1); return 0; } ]]) AC_DEFUN([AC_FLDIGI_HASH], [ AC_LANG_PUSH([C++])dnl AC_CACHE_CHECK(for std::hash in , ax_cv_std_hash, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_HASH_testbody])], [ac_cv_std_hash=yes], [ac_cv_std_hash=no])]) ac_success=no if test "x$ac_cv_std_hash" = "xyes"; then ac_success=yes AC_DEFINE(HAVE_STD_HASH, 1, [Defined 1 if we have std::hash in ]) else AC_DEFINE(HAVE_STD_HASH, 0, [Defined 0 if we do not have std::bind in ]) fi if test x$ac_success = xno; then AC_CACHE_CHECK(for std::tr1::hash in , ax_cv_std_tr1_hash, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_TR1_HASH_testbody])], [ac_cv_std_tr1_hash=yes], [ac_cv_std_tr1_hash=no])]) if test "x$ac_cv_std_tr1_hash" = "xyes"; then ac_success=yes AC_DEFINE(HAVE_STD_TR1_HASH, 1, [Defined 1 if we have std::tr1::hash in ]) else AC_DEFINE(HAVE_STD_TR1_HASH, 0, [Defined 0 if we do not have std::tr1::hash in ]) fi fi if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_std_hash_$switch]) AC_CACHE_CHECK(for $CXX supports std::hash() feature with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_HASH_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_cv_std_hash=yes ac_success=yes break fi done fi if test "x$ac_cv_std_hash" = "xyes"; then ac_success=yes AC_DEFINE(HAVE_STD_HASH, 1, [Defined 1 if we have std::hash in ]) else AC_DEFINE(HAVE_STD_HASH, 0, [Defined 0 if we do not have std::bind in ]) fi gcc_dver=$($CXX -dumpversion) gcc_minver=4.1.0 AC_MSG_CHECKING([for $CXX version >= $gcc_minver]) AX_COMPARE_VERSION([$gcc_dver], [ge], [$gcc_minver], [AC_MSG_RESULT([yes ($gcc_dver)])]; GCCVER="ok", [AC_MSG_RESULT([no ($gcc_dver)])]; GCCVER="bad") if test "y$GCCVER" = "yok"; then AC_DEFINE(GCC_VER_OK, 1, [Define to 1 if gcc >= 4.1.0]) else AC_DEFINE(GCC_VER_OK, 0, [Define to 0 if gcc < 4.1.0]) fi AC_LANG_POP([C++]) if test "x$ac_success" = "xno"; then AC_MSG_ERROR([Could not find std::hash or std::tr1::hash]) fi ]) fldigi-4.1.06/m4/macosx.m40000644000175000017500000000333513472116043012042 00000000000000AC_DEFUN([AC_FLDIGI_MACOSX], [ case "$target_os" in darwin*) target_darwin="yes" ;; *) target_darwin="no" ;; esac if test "$target_darwin" = "yes"; then AC_MSG_NOTICE([using bundled GNU regex on $target_os]) # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no AC_DEFINE([HAVE_REGEX_H], 0, [Define to 1 if you have the header file.]) fi AC_ARG_ENABLE([mac-universal], AC_HELP_STRING([--enable-mac-universal], [build a universal binary on Mac OS X @<:@no@:>@]), [case "${enableval}" in yes|no) ac_cv_mac_universal="${enableval}" ;; *) AC_MSG_ERROR([bad value "${enableval}" for --enable-mac-universal]) ;; esac], [ac_cv_mac_universal=no]) if test "x$target_darwin" = "xyes" && test "x$ac_cv_mac_universal" = "xyes"; then mac_minversion="-mmacosx-version-min=10.4" case "$target_os" in darwin8*) mac_arches="-arch i386 -arch ppc" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.4u.sdk" ;; darwin9*) mac_arches="-arch i386 -arch ppc -arch x86_64 -arch ppc64" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.5.sdk" ;; darwin10*) mac_arches="-arch i386 -arch x86_64" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.6.sdk" ;; *) mac_arches="" mac_sysroot="" ;; esac MAC_UNIVERSAL_CFLAGS="$mac_arches $mac_sysroot $mac_minversion" MAC_UNIVERSAL_LDFLAGS="$mac_arches" fi AC_SUBST([MAC_UNIVERSAL_CFLAGS]) AC_SUBST([MAC_UNIVERSAL_LDFLAGS]) AM_CONDITIONAL([DARWIN], [test "x$target_darwin" = "xyes"]) ]) fldigi-4.1.06/m4/progs.m40000644000175000017500000000157113472116043011702 00000000000000AC_DEFUN([AC_FLDIGI_PROGRAMS], [ AC_ARG_ENABLE([fldigi], AC_HELP_STRING([--disable-fldigi], [do not build fldigi]), [case "${enableval}" in yes|no) ac_cv_want_fldigi="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --disable-fldigi]) ;; esac], [ac_cv_want_fldigi=yes]) AM_CONDITIONAL([WANT_FLDIGI], [test "x$ac_cv_want_fldigi" = "xyes"]) AC_ARG_ENABLE([flarq], AC_HELP_STRING([--disable-flarq], [do not build flarq]), [case "${enableval}" in yes|no) ac_cv_want_flarq="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --disable-flarq]) ;; esac], [ac_cv_want_flarq=yes]) AM_CONDITIONAL([WANT_FLARQ], [test "x$ac_cv_want_flarq" = "xyes"]) ]) fldigi-4.1.06/m4/static.m40000644000175000017500000000062413472116043012035 00000000000000AC_DEFUN([AC_FLDIGI_STATIC], [ AC_ARG_ENABLE([static], AC_HELP_STRING([--enable-static], [enable static linking for some libraries]), [case "${enableval}" in yes|no) ac_cv_static="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-static]) ;; esac], [ac_cv_static=no]) ]) fldigi-4.1.06/m4/benchmark.m40000644000175000017500000000130513472116043012475 00000000000000AC_DEFUN([AC_FLDIGI_BENCHMARK], [ AC_ARG_ENABLE([benchmark], AC_HELP_STRING([--enable-benchmark], [build for benchmark-only operation]), [case "${enableval}" in yes|no) ac_cv_benchmark="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-benchmark]) ;; esac], [ac_cv_benchmark=no]) if test "x$ac_cv_benchmark" = "xyes"; then AC_DEFINE(BENCHMARK_MODE, 1, [Defined if we are building for benchmarking]) else AC_DEFINE(BENCHMARK_MODE, 0, [Defined if we are building for benchmarking]) fi AM_CONDITIONAL([ENABLE_BENCHMARK], [test "x$ac_cv_benchmark" = "xyes"]) ]) fldigi-4.1.06/m4/oss.m40000644000175000017500000000305013472116043011346 00000000000000AC_DEFUN([AC_FLDIGI_OSS], [ AC_REQUIRE([AC_FLDIGI_MACOSX]) AC_REQUIRE([AC_FLDIGI_WIN32]) if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then AC_ARG_ENABLE([oss], AC_HELP_STRING([--disable-oss], [disable support for OSS @<:@autodetect@:>@]), [case "${enableval}" in yes|no) ac_cv_want_oss="${enableval}" ;; *) AC_MSG_ERROR([bad value "${enableval}" for --disable-oss]) ;; esac], [ac_cv_want_oss=check]) else AC_MSG_NOTICE([disabling OSS driver on $target_os]) ac_cv_want_oss=no fi ac_cv_oss=no if test "x$ac_cv_want_oss" = "xno"; then AC_DEFINE(USE_OSS, 0, [Defined if we are using OSS]) else AC_CHECK_HEADER( [sys/soundcard.h], [ac_cv_oss=yes], [AC_CHECK_HEADER([machine/soundcard.h], [ac_cv_oss=yes], [AC_CHECK_HEADER([soundcard.h], [ac_cv_oss=yes], [])])]) if test "x$ac_cv_want_oss" = "xcheck"; then if test "x$ac_cv_oss" = "xyes"; then AC_DEFINE(USE_OSS, 1, [Defined if we are using OSS]) else AC_MSG_NOTICE([disabling OSS driver]) AC_DEFINE(USE_OSS, 0, [Defined if we are using OSS]) fi else # $ac_cv_want_oss is yes if test "x$ac_cv_oss" = "xno"; then AC_MSG_FAILURE([--enable-oss was given, but test for OSS failed]) else AC_DEFINE(USE_OSS, 1, [Defined if we are using OSS]) fi fi fi ]) fldigi-4.1.06/m4/libintl.m40000644000175000017500000000050013472116043012174 00000000000000AC_DEFUN([AC_FLDIGI_INTL], [ AC_ARG_VAR([INTL_CFLAGS], [C compiler flags for libintl, overriding gettext macros]) AC_ARG_VAR([INTL_LIBS], [linker flags for libintl, overriding gettext macros]) if test "x$INTL_LIBS" = "x"; then INTL_LIBS="$LIBINTL" fi AC_SUBST([INTL_CFLAGS]) AC_SUBST([INTL_LIBS]) ]) fldigi-4.1.06/m4/docs.m40000644000175000017500000000317313472116043011500 00000000000000AC_DEFUN([AC_FLDIGI_DOCS], [ AC_ARG_WITH([asciidoc], AC_HELP_STRING([--with-asciidoc], [build documentation using asciidoc @<:@autodetect@:>@]), [case "${withval}" in yes|no) ac_cv_want_asciidoc="${withval}" ;; *) AC_MSG_ERROR([bad value "${withval}" for --with-asciidoc]) ;; esac], [ac_cv_want_asciidoc=check]) if test "x$ac_cv_want_asciidoc" != "xno"; then AC_PATH_PROG([ASCIIDOC], [asciidoc]) asciidoc_min=8.2.0 if test "x$ASCIIDOC" != "x"; then AC_MSG_CHECKING([for asciidoc >= $asciidoc_min]) asciidoc_ver=$($ASCIIDOC --version | sed -n '1 s/.* //; p') AX_COMPARE_VERSION([$asciidoc_ver], [ge], [$asciidoc_min], [AC_MSG_RESULT([yes ($asciidoc_ver)])], [AC_MSG_RESULT([no ($asciidoc_ver)]); ASCIIDOC=""]) fi if test "x$ASCIIDOC" != "x"; then AC_PATH_PROG([A2X], [a2x]) AX_COMPARE_VERSION([$asciidoc_ver], [ge], [8.3.0], [no_xmllint=yes], [no_xmllint=no]) fi if test "x$ac_cv_want_asciidoc" = "xyes"; then if test "x$ASCIIDOC" = "x" -o "x$A2X" = "x"; then AC_MSG_FAILURE([--with-asciidoc was given, but check for asciidoc failed]) elif test "x$A2X" = "x"; then AC_MSG_FAILURE([--with-asciidoc was given, but check for a2x failed]) fi fi fi AC_SUBST([ASCIIDOC]) AC_SUBST([A2X]) AM_CONDITIONAL([HAVE_ASCIIDOC], [test "x$ASCIIDOC" != "x" -a "x$A2X" != "x"]) AM_CONDITIONAL([HAVE_ASCIIDOC_NO_XMLLINT], [test "$no_xmllint" = "yes"]) ]) fldigi-4.1.06/m4/debug.m40000644000175000017500000000744513472116043011644 00000000000000AC_DEFUN([AC_FLDIGI_RDYNAMIC], [ LDFLAGS_saved="$LDFLAGS" LDFLAGS="$LDFLAGS -rdynamic" AC_MSG_CHECKING([whether $CC supports -rdynamic]) # don't try this on win32; it succeeds but emits a warning at link time if test "x$target_win32" != "xyes"; then AC_TRY_LINK([], [], [ac_cv_rdynamic=yes], [ac_cv_rdynamic=no]) else ac_cv_rdynamic=no fi AC_MSG_RESULT([$ac_cv_rdynamic]) AC_LANG_PUSH(C++) AC_MSG_CHECKING([whether $CXX supports -rdynamic]) if test "x$target_win32" != "xyes"; then AC_TRY_LINK([], [], [ac_cv_rdynamic=yes], [ac_cv_rdynamic=no]) else ac_cv_rdynamic=no fi AC_LANG_POP(C++) AC_MSG_RESULT([$ac_cv_rdynamic]) LDFLAGS="$LDFLAGS_saved" ]) AC_DEFUN([AC_FLDIGI_DEBUG], [ AC_REQUIRE([AC_FLDIGI_OPT]) AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug], [turn on debugging]), [case "${enableval}" in yes|no) ac_cv_debug="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; esac], [ac_cv_debug=no]) AC_ARG_VAR([BFD_CFLAGS], [C compiler flags for libbfd]) AC_ARG_VAR([BFD_LIBS], [linker flags for libbfd]) AC_ARG_WITH([bfd], AC_HELP_STRING([--with-bfd@<:@=DIR@:>@], [search for libbfd in DIR/include and DIR/lib @<:@mingw32 only@:>@]), [ac_cv_want_bfd="$withval"], [ac_cv_want_bfd=yes]) if test "x$ac_cv_debug" = "xyes" && test "x$ac_cv_want_bfd" != "xno" && \ test "x$target_mingw32" = "xyes"; then if test "x$ac_cv_want_bfd" != "xyes"; then # set -I and -L switches bfd_default_cflags="-I${ac_cv_want_bfd}/include" bfd_default_libs="-L${ac_cv_want_bfd}/lib" fi # don't override the user-specified vars BFD_CFLAGS="${BFD_CFLAGS:-$bfd_default_cflags}" BFD_LIBS="${BFD_LIBS:-$bfd_default_libs}" ac_cv_want_bfd="yes" CPPFLAGS_saved="$CPPFLAGS" LDFLAGS_saved="$LDFLAGS" CPPFLAGS="$CPPFLAGS $BFD_CFLAGS" LDFLAGS="$LDFLAGS $BFD_LIBS" AC_CHECK_HEADER([bfd.h], [ac_cv_have_bfd="yes"], [ac_cv_have_bfd="no"]) if test "x$ac_cv_have_bfd" = "xyes"; then bfd_other_libs="-liberty -lpsapi -limagehlp" AC_CHECK_LIB([bfd], [bfd_set_format], [ac_cv_have_bfd="yes"], [ac_cv_have_bfd="no"], [$bfd_other_libs]) fi CPPFLAGS="$CPPFLAGS_saved" LDFLAGS="$LDFLAGS_saved" if test "x$ac_cv_have_bfd" = "xyes"; then BFD_LIBS="$BFD_LIBS -lbfd $bfd_other_libs" fi fi if test "x$ac_cv_debug" = "xyes"; then AC_MSG_CHECKING([for debug info flag]) if test "x$GXX" = "xyes"; then if test "x$target_mingw32" = "xyes"; then gflag="-gstabs" else gflag="-ggdb3" fi else gflag="-g" fi AC_MSG_RESULT([$gflag]) DEBUG_CFLAGS="-O0 -fno-inline-functions $gflag -Wall" AC_FLDIGI_RDYNAMIC if test "x$ac_cv_rdynamic" = "xyes"; then RDYNAMIC=-rdynamic fi CXXFLAGS="" CFLAGS="$CXXFLAGS" AC_MSG_NOTICE([debugging enabled; overriding CXXFLAGS]) if test "x$target_darwin" = "xyes"; then ac_cv_compat_stack=yes AC_DEFINE([HAVE_DBG_STACK], 1, [Define to 1 if we have dbg::stack]) elif test "x$target_mingw32" = "xyes" && test "x$ac_cv_have_bfd" = "xyes"; then ac_cv_compat_stack=yes AC_DEFINE([HAVE_DBG_STACK], 1, [Define to 1 if we have dbg::stack]) else ac_cv_compat_stack=no AC_DEFINE([HAVE_DBG_STACK], 0, [Define to 0 if not using dbg::stack]) fi fi AM_CONDITIONAL([ENABLE_DEBUG], [test "x$ac_cv_debug" = "xyes"]) AC_SUBST([DEBUG_CFLAGS]) AC_SUBST([RDYNAMIC]) AM_CONDITIONAL([COMPAT_STACK], [test "x$ac_cv_compat_stack" = "xyes"]) ]) fldigi-4.1.06/m4/build.m40000664000175000017500000001452313507401434011652 00000000000000AC_DEFUN([AC_FLDIGI_SH_DQ], [ ac_sh_dq="\"`$1 | sed 's/"/\\\\"/g'`\"" ]) AC_DEFUN([AC_FLDIGI_BUILD_INFO], [ # Define build flags and substitute in Makefile.in # CPPFLAGS FLDIGI_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include \ -I\$(srcdir)/irrxml \ -I\$(srcdir)/libtiniconv \ -I\$(srcdir)/fileselector" if test "x$ac_cv_flxmlrpc" != "xyes"; then FLDIGI_BUILD_CPPFLAGS="$FLDIGI_BUILD_CPPFLAGS -I\$(srcdir)/xmlrpcpp" fi if test "x$ac_cv_libmbedtls" != "xyes"; then FLDIGI_BUILD_CPPFLAGS="$FLDIGI_BUILD_CPPFLAGS -I\$(srcdir)/mbedtls" fi # CXXFLAGS FLDIGI_BUILD_CXXFLAGS="\ $PORTAUDIO_CFLAGS $FLTK_CFLAGS $X_CFLAGS \ $SNDFILE_CFLAGS $SAMPLERATE_CFLAGS $PULSEAUDIO_CFLAGS \ $HAMLIB_CFLAGS $PNG_CFLAGS $XMLRPC_CFLAGS $MAC_UNIVERSAL_CFLAGS \ $LIBMBEDTLS_CFLAGS \ $INTL_CFLAGS $PTW32_CFLAGS $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" # CFLAGS FLDIGI_BUILD_CFLAGS="$LIBMBEDTLS_CFLAGS -pipe -Wall -fexceptions" if test "x$target_darwin" = "xno"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS --param=max-vartrack-size=0" fi if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="-mthreads $FLDIGI_BUILD_CXXFLAGS" fi if test "x$ac_cv_flxmlrpc" != "xyes"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -I\$(srcdir)/xmlrpcpp" fi # LDFLAGS FLDIGI_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_LDFLAGS="-mthreads $FLDIGI_BUILD_LDFLAGS" fi # LDADD FLDIGI_BUILD_LDADD="\ $PORTAUDIO_LIBS $FLTK_LIBS $X_LIBS \ $SNDFILE_LIBS $SAMPLERATE_LIBS $PULSEAUDIO_LIBS \ $HAMLIB_LIBS $PNG_LIBS $XMLRPC_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS \ $EXTRA_LIBS $FLXMLRPC_LIBS $LIBMBEDTLS_LIBS" # CPPFLAGS FLARQ_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include -I\$(srcdir)/fileselector \ -I\$(srcdir)/flarq-src -I\$(srcdir)/flarq-src/include" if test "x$target_darwin" = "xno"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS --param=max-vartrack-size=0" fi if test "x$ac_cv_flxmlrpc" != "xyes"; then FLARQ_BUILD_CPPFLAGS="$FLARQ_BUILD_CPPFLAGS -I\$(srcdir)/xmlrpcpp" fi # CXXFLAGS FLARQ_BUILD_CXXFLAGS="$FLTK_CFLAGS $X_CFLAGS $MAC_UNIVERSAL_CFLAGS $INTL_CFLAGS $PTW32_CFLAGS \ $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_CXXFLAGS="-mthreads $FLARQ_BUILD_CXXFLAGS" fi if test "x$ac_cv_flxmlrpc" != "xyes"; then FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -I\$(srcdir)/xmlrpcpp" fi if test "x$ac_cv_libmbedtls" == "xyes"; then FLDIGI_BUILD_LDADD="$FLDIGI_BUILD_LDADD $LIBMBEDTLS_LDFLAGS" fi # LDFLAGS FLARQ_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_LDFLAGS="-mthreads $FLARQ_BUILD_LDFLAGS" fi # LDADD FLARQ_BUILD_LDADD="$FLTK_LIBS $X_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS $FLXMLRPC_LIBS" if test "x$ac_cv_debug" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -UNDEBUG" FLDIGI_BUILD_LDFLAGS="$FLDIGI_BUILD_LDFLAGS $RDYNAMIC" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -UNDEBUG" FLARQ_BUILD_LDFLAGS="$FLARQ_BUILD_LDFLAGS $RDYNAMIC" else FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -DNDEBUG" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -DNDEBUG" fi AC_SUBST([FLDIGI_BUILD_CPPFLAGS]) AC_SUBST([FLDIGI_BUILD_CXXFLAGS]) AC_SUBST([FLDIGI_BUILD_CFLAGS]) AC_SUBST([FLDIGI_BUILD_LDFLAGS]) AC_SUBST([FLDIGI_BUILD_LDADD]) AC_SUBST([FLARQ_BUILD_CPPFLAGS]) AC_SUBST([FLARQ_BUILD_CXXFLAGS]) AC_SUBST([FLARQ_BUILD_LDFLAGS]) AC_SUBST([FLARQ_BUILD_LDADD]) #define build variables for config.h AC_DEFINE_UNQUOTED([BUILD_BUILD_PLATFORM], ["$build"], [Build platform]) AC_DEFINE_UNQUOTED([BUILD_HOST_PLATFORM], ["$host"], [Host platform]) AC_DEFINE_UNQUOTED([BUILD_TARGET_PLATFORM], ["$target"], [Target platform]) test "x$LC_ALL" != "x" && LC_ALL_saved="$LC_ALL" LC_ALL=C export LC_ALL AC_FLDIGI_SH_DQ([echo $ac_configure_args]) AC_DEFINE_UNQUOTED([BUILD_CONFIGURE_ARGS], [$ac_sh_dq], [Configure arguments]) # Allow BUILD_DATE, BUILD_USER, BUILD_HOST to be externally overridden by # environment variables. ac_sh_dq="\"$BUILD_DATE\"" test "x$BUILD_DATE" = "x" && AC_FLDIGI_SH_DQ([date]) AC_DEFINE_UNQUOTED([BUILD_DATE], [$ac_sh_dq], [Build date]) ac_sh_dq="\"$BUILD_USER\"" test "x$BUILD_USER" = "x" && AC_FLDIGI_SH_DQ([whoami]) AC_DEFINE_UNQUOTED([BUILD_USER], [$ac_sh_dq], [Build user]) ac_sh_dq="\"$BUILD_HOST\"" test "x$BUILD_HOST" = "x" && AC_FLDIGI_SH_DQ([hostname]) AC_DEFINE_UNQUOTED([BUILD_HOST], [$ac_sh_dq], [Build host]) AC_FLDIGI_SH_DQ([$CXX -v 2>&1 | tail -1]) AC_DEFINE_UNQUOTED([BUILD_COMPILER], [$ac_sh_dq], [Compiler]) AC_FLDIGI_SH_DQ([echo $FLDIGI_BUILD_CPPFLAGS $FLDIGI_BUILD_CXXFLAGS]) AC_DEFINE_UNQUOTED([FLDIGI_BUILD_CXXFLAGS], [$ac_sh_dq], [Fldigi cpp compiler flags]) AC_DEFINE_UNQUOTED([FLDIGI_BUILD_CFLAGS], [$ac_sh_dq], [Fldigi cc compiler flags]) AC_FLDIGI_SH_DQ([echo $FLDIGI_BUILD_LDFLAGS $FLDIGI_BUILD_LDADD]) AC_DEFINE_UNQUOTED([FLDIGI_BUILD_LDFLAGS], [$ac_sh_dq], [Fldigi linker flags]) AC_FLDIGI_SH_DQ([echo $FLARQ_BUILD_CPPFLAGS $FLARQ_BUILD_CXXFLAGS]) AC_DEFINE_UNQUOTED([FLARQ_BUILD_CXXFLAGS], [$ac_sh_dq], [Flarq compiler flags]) AC_FLDIGI_SH_DQ([echo $FLARQ_BUILD_LDFLAGS $FLARQ_BUILD_LDADD]) AC_DEFINE_UNQUOTED([FLARQ_BUILD_LDFLAGS], [$ac_sh_dq], [Flarq linker flags]) if test "x$LC_ALL_saved" != "x"; then LC_ALL="$LC_ALL_saved" export LC_ALL fi ]) # This macro defines SILENT_CMDS, which is @expanded@ in # {src,doc}/Makefile.am to define a function that generates custom build # command output depending on the values of the variables # $(AM_DEFAULT_VERBOSITY) and $(V). These variables affect the custom # command output in the same way as they do for automake's build rules. AC_DEFUN([AC_FLDIGI_BUILD_RULES_SILENT], [ m4_ifdef([AM_SUBST_NOTMAKE], [AM_SUBST_NOTMAKE([SILENT_CMDS])]) AC_SUBST([SILENT_CMDS], ['silent_cmd = @echo " $(1)" $(2); ifeq ($(AM_DEFAULT_VERBOSITY),0) silent = $(if $(subst 0,,$(V)),,$(silent_cmd)) else ifeq ($(V),0) silent = $(silent_cmd) endif endif']) ]) AC_DEFUN([AC_FLDIGI_BUILD_RULES], [m4_ifdef([AM_SILENT_RULES], [AC_FLDIGI_BUILD_RULES_SILENT], [AC_SUBST([SILENT_CMDS], [])])]) fldigi-4.1.06/m4/intl/0000775000175000017500000000000013515625023011333 500000000000000fldigi-4.1.06/m4/intl/gettext.m40000644000175000017500000003561513472116043013210 00000000000000# gettext.m4 serial 66 (gettext-0.18.2) dnl Copyright (C) 1995-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value '$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ]])], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ]])], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ]])], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) fldigi-4.1.06/m4/intl/lib-ld.m40000644000175000017500000000653113472116043012662 00000000000000# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) fldigi-4.1.06/m4/intl/nls.m40000644000175000017500000000226613472116043012314 00000000000000# nls.m4 serial 3 (gettext-0.15) dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) fldigi-4.1.06/m4/intl/lib-prefix.m40000644000175000017500000001503613472116042013557 00000000000000# lib-prefix.m4 serial 5 (gettext-0.15) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl the basename of the libdir, either "lib" or "lib64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. The current dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl libraries go under $prefix/lib. We determine the compiler's default dnl mode by looking at the compiler's library search path. If at least dnl of its elements ends in /lib64 or points to a directory whose absolute dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl default, namely "lib". acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ]) fldigi-4.1.06/m4/intl/po.m40000644000175000017500000004456213472116043012143 00000000000000# po.m4 serial 15 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) fldigi-4.1.06/m4/intl/iconv.m40000644000175000017500000001375313472116042012640 00000000000000# iconv.m4 serial AM6 (gettext-0.17) dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) fldigi-4.1.06/m4/intl/lib-link.m40000644000175000017500000007205513472116043013224 00000000000000# lib-link.m4 serial 13 (gettext-0.17) dnl Copyright (C) 2001-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ(2.54) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Autoconf >= 2.61 supports dots in --with options. define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], [ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIB[]NAME[]_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) fldigi-4.1.06/m4/fltk.m40000644000175000017500000000507713472116043011515 00000000000000AC_DEFUN([AC_FLDIGI_FLTK], [ AC_ARG_VAR([FLTK_CONFIG], [Path to fltk-config utility]) AC_ARG_VAR([FLTK_CFLAGS], [C compiler flags for FLTK, overriding fltk-config]) AC_ARG_VAR([FLTK_LIBS], [linker flags for FLTK, overriding fltk-config]) if test "x$FLTK_CFLAGS" = "x" && test "x$FLTK_LIBS" = "x"; then if test "x$FLTK_CONFIG" = "x"; then AC_PATH_PROG([FLTK_CONFIG], [fltk-config], [no]) else AC_MSG_CHECKING([for fltk-config]) AC_MSG_RESULT([$FLTK_CONFIG]) fi if test "$FLTK_CONFIG" = "no"; then AC_MSG_ERROR([ *** The fltk-config script could not be found. Please install the development *** headers and libraries for FLTK 1.1.x, or set PATH to the directory that *** contains fltk-config. ]) fi HAVE_FLTK_API_VERSION=no FLTK_API_VERSION="`$FLTK_CONFIG --version`" if test $? -ne 0; then AC_MSG_ERROR([$FLTK_CONFIG failed]) fi if test -n "$(expr $FLTK_API_VERSION : '1\.1[3]')"; then HAVE_FLTK_API_VERSION=yes fi FLDIGI_FLTK_API_MAJOR=${FLTK_API_VERSION%%.*} FLDIGI_FLTK_API_MINOR=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_MINOR=${FLDIGI_FLTK_API_MINOR%%.*} FLDIGI_FLTK_API_PATCH=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_PATCH=${FLDIGI_FLTK_API_PATCH#*.}; if test "${HAVE_FLTK_API_VERSION}" = "no"; then AC_MSG_ERROR([ *** The version of FLTK found on your system provides API version $FLTK_API_VERSION. *** To build $PACKAGE you need a FLTK version that provides API 1.1, 1.2 or 1.3. ]) fi if test $FLDIGI_FLTK_API_MINOR -gt 3; then AC_MSG_WARN([$PACKAGE_TARNAME may not work with FLTK $FLTK_API_VERSION]) fi FLTK_CFLAGS=`$FLTK_CONFIG --cxxflags` if test "x$ac_cv_static" != "xyes"; then FLTK_LIBS=`$FLTK_CONFIG --ldflags --use-images` else FLTK_LIBS=`$FLTK_CONFIG --ldstaticflags --use-images` fi else AC_MSG_NOTICE([not checking for FLTK]) fi AC_SUBST([FLTK_CFLAGS]) AC_SUBST([FLTK_LIBS]) AC_DEFINE_UNQUOTED([FLTK_BUILD_VERSION], ["`$FLTK_CONFIG --version`"], [FLTK version]) AC_DEFINE_UNQUOTED([FLDIGI_FLTK_API_MAJOR], [$FLDIGI_FLTK_API_MAJOR], [FLTK API major version]) AC_DEFINE_UNQUOTED([FLDIGI_FLTK_API_MINOR], [$FLDIGI_FLTK_API_MINOR], [FLTK API minor version]) AC_DEFINE_UNQUOTED([FLDIGI_FLTK_API_PATCH], [$FLDIGI_FLTK_API_PATCH], [FLTK API patch]) AC_ARG_VAR([FLUID], [Fast Light User-Interface Designer]) AC_CHECK_PROG([FLUID], [fluid], [fluid]) AM_CONDITIONAL([HAVE_FLUID], [test -n "$FLUID"]) ]) fldigi-4.1.06/INSTALL0000664000175000017500000000323413502576511011023 00000000000000Installation Instructions for fldigi ************************************ To compile fldigi you will need: * A recent C++ compiler. The GNU C++ compilers in the 4.x series are known to work. * Version 1.3.4 or later of the Fast Light Tool Kit (FLTK), with its development library and headers. FLTK's multi-threading support is required. * The samplerate (a.k.a. secret rabbit code) library. * The PNG library. * The libxft library. You should read and follow the instructions for building on various OS platforms that are on the fldigi wiki: http://www.w1hkj.com/doku/doku.php?id=howtos The simplest way to compile this package on Linux is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. fldigi-4.1.06/README0000664000175000017500000000444513502576536010666 00000000000000Fldigi is a software modem for Amateur Radio use. It is a sound card based program that is used for both transmitting and receiving data in any of the following modes: BPSK and QPSK 31, 63, 125, 250 (both), and 63F and 500 (BPSK only) PSKR 125, 250, and 500 CW speeds from 5 to 200 wpm DominoEX 4, 5, 8, 11, 16 and 22; also with FEC FSQ Hellschreiber Feld Hell, Slow Hell, Hell x5/x9, FSKHell(-105) and Hell 80 IFKP MFSK 4, 8, 11, 16, 22, 31, 32 and 64; most with image support MT63 500, 1000 and 2000 OLIVIA various tones and bandwidths RTTY various baud rates, shifts, nbr. of data bits, etc. THOR 4, 5, 8, 11, 16 and 22 Throb and ThrobX 1, 2, and 4 WWV receive only - calibrate your sound card to WWV Frequency Analysis receive only - measure the frequency of a carrier Fldigi can also control a transceiver using Hamlib or RigCAT I/O, perform online or cdrom QRZ queries, log QSOs with the built-in logbook or Xlog, and send reception reports to the PSK Automatic Propagation Reporter. The latest version can always be found at: http://www.w1hkj.com/ Visit this page for extensive documentation and an archive of XML files for transceivers supported by RigCAT. The wiki page contains FAQs and HOWTOs, as well as links to all Fldigi resources: https://fedorahosted.org/fldigi/ The GIT repository can be found at: https://sourceforge.net/p/fldigi/fldigi/ci/master/tree/ For support, news and updates, join one or more of the following mailing lists and Yahoo groups. Stable releases are announced to all lists and groups; test (alpha) releases are announced to fldigi-alpha and fldigi-announce. * linuxham group General discussion on fldigi, related software and other ham radio topics https://groups.io/g/linuxham * win-fldigi group For Windows users of fldigi http://groups.yahoo.com/group/win-fldigi/ * NBEMSham group Special focus on NBEMS operation https://groups.io/g/nbems * fldigi-alpha list Discussion of fldigi testing and related subjects https://sourceforge.net/p/fldigi/mailman/fldigi-alpha/ * fldigi-devel list Fldigi development topics https://sourceforge.net/p/fldigi/mailman/fldigi-devel/ fldigi-4.1.06/Makefile.in0000664000175000017500000007011713515623766012054 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/intl/gettext.m4 \ $(top_srcdir)/m4/intl/iconv.m4 $(top_srcdir)/m4/intl/lib-ld.m4 \ $(top_srcdir)/m4/intl/lib-link.m4 \ $(top_srcdir)/m4/intl/lib-prefix.m4 \ $(top_srcdir)/m4/intl/nls.m4 $(top_srcdir)/m4/intl/po.m4 \ $(top_srcdir)/m4/intl/progtest.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/benchmark.m4 $(top_srcdir)/m4/bind.m4 \ $(top_srcdir)/m4/build.m4 $(top_srcdir)/m4/c++11.m4 \ $(top_srcdir)/m4/debug.m4 $(top_srcdir)/m4/docs.m4 \ $(top_srcdir)/m4/fltk.m4 $(top_srcdir)/m4/funcs.m4 \ $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/libintl.m4 \ $(top_srcdir)/m4/macosx.m4 $(top_srcdir)/m4/np-compat.m4 \ $(top_srcdir)/m4/opt.m4 $(top_srcdir)/m4/oss.m4 \ $(top_srcdir)/m4/pkg-config.m4 $(top_srcdir)/m4/progs.m4 \ $(top_srcdir)/m4/static.m4 $(top_srcdir)/m4/tls.m4 \ $(top_srcdir)/m4/win32.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/compile \ $(top_srcdir)/build-aux/config.guess \ $(top_srcdir)/build-aux/config.rpath \ $(top_srcdir)/build-aux/config.sub \ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/missing ABOUT-NLS AUTHORS COPYING \ ChangeLog INSTALL NEWS README build-aux/compile \ build-aux/config.guess build-aux/config.rpath \ build-aux/config.sub build-aux/depcomp build-aux/install-sh \ build-aux/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print A2X = @A2X@ ACLOCAL = @ACLOCAL@ AC_CONFIG_ARGS = @AC_CONFIG_ARGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CFLAGS = @BFD_CFLAGS@ BFD_LIBS = @BFD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11_SWITCH = @CXX11_SWITCH@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_CFLAGS = @DEBUG_CFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_LIBS = @EXTRA_LIBS@ FLARQ_AUTHORS = @FLARQ_AUTHORS@ FLARQ_BUILD_CPPFLAGS = @FLARQ_BUILD_CPPFLAGS@ FLARQ_BUILD_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ FLARQ_BUILD_LDADD = @FLARQ_BUILD_LDADD@ FLARQ_BUILD_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ FLARQ_DOCS = @FLARQ_DOCS@ FLARQ_VERSION = @FLARQ_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLDIGI_AUTHORS = @FLDIGI_AUTHORS@ FLDIGI_BUILD_CFLAGS = @FLDIGI_BUILD_CFLAGS@ FLDIGI_BUILD_CPPFLAGS = @FLDIGI_BUILD_CPPFLAGS@ FLDIGI_BUILD_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ FLDIGI_BUILD_LDADD = @FLDIGI_BUILD_LDADD@ FLDIGI_BUILD_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ FLDIGI_VERSION = @FLDIGI_VERSION@ FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLTK_CFLAGS = @FLTK_CFLAGS@ FLTK_CONFIG = @FLTK_CONFIG@ FLTK_LIBS = @FLTK_LIBS@ FLUID = @FLUID@ FLXMLRPC_CFLAGS = @FLXMLRPC_CFLAGS@ FLXMLRPC_LIBS = @FLXMLRPC_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HAMLIB_CFLAGS = @HAMLIB_CFLAGS@ HAMLIB_LIBS = @HAMLIB_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_CFLAGS = @INTL_CFLAGS@ INTL_LIBS = @INTL_LIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBMBEDTLS_CFLAGS = @LIBMBEDTLS_CFLAGS@ LIBMBEDTLS_LIBS = @LIBMBEDTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAC_UNIVERSAL_CFLAGS = @MAC_UNIVERSAL_CFLAGS@ MAC_UNIVERSAL_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKENSIS = @MAKENSIS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DL = @PACKAGE_DL@ PACKAGE_DOCS = @PACKAGE_DOCS@ PACKAGE_GUIDE = @PACKAGE_GUIDE@ PACKAGE_HOME = @PACKAGE_HOME@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NEWBUG = @PACKAGE_NEWBUG@ PACKAGE_PROJ = @PACKAGE_PROJ@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ PORTAUDIO_CFLAGS = @PORTAUDIO_CFLAGS@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PTW32_CFLAGS = @PTW32_CFLAGS@ PTW32_LIBS = @PTW32_LIBS@ PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ RDYNAMIC = @RDYNAMIC@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 -I m4/intl # AC_CONFIG_MACRO_DIR([m4]) SUBDIRS = po doc src EXTRA_DIST = build-aux/config.rpath all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile @HAVE_FLUID_TRUE@flgen: @HAVE_FLUID_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) @DARWIN_TRUE@appbundle: @DARWIN_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) @HAVE_NSIS_TRUE@nsisinst: @HAVE_NSIS_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@hamlib-static: @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-4.1.06/ChangeLog0000664000175000017500000035155013515623732011555 00000000000000 =Version 4.1.06= 2019-07-10 David Freese e7a984ae3: nanoIO 2e98f532e: FD server disconnect f37b133c5: Calendar 1d3a06f83: Warnings etal =Version 4.1.05= a593ddbb8: LoTW fllog 1a42952e4: Modem macro 5a36610d1: Close Logbook 33177695b: eQSL =Version 4.1.04= 2019-06-07 Davide Gerhard IV3CVE e5b05e2a4: MacOS high-DPI e25078f24: timeops 2019-06-07 David Freese 2c03575b4: log server d681ab54b: xmlrpc 99a4aa776: LoTW delivery 762fd869b: Apple kill button 83d115356: main dialog title 296295fe1: Warnings 5080d85e3: Contestia/Olivia ea39851b6: Log reports f7c376723: Documentation update 8d25f53d9: 7qp multi 867ded47b: n3fjp ebab17a2b: wfonly controls ef2d55e22: Read log debugging 2928a9b97: New Modem Macro 90b021222: DE QSO Party =Version 4.1.03= a6923d198: wf updates 377a7fa74: WinKeyer emulators 53a06da1e: New install macros 9a0124d6c: MACRO 6c19a624d: Greek translation update 2018-01-24 David Freese dc384c6ad: Alert timeouts af0412731: video =Version 4.0.15= e87f41ad0: ARQ server 5ab691499: Signal gain =Version 4.0.14= f799522a1: linux shutdown 29593c8e5: remote logbook 4e87d16ac: ARQ exit seg fault 2018-01-09 Stelian Pop e09d16704: WEFAX auto center behavior be342208d: WEFAX phasing change button 2dee90e84: RTTY configure initializers 2018-01-07 David Freese a5e88afcd: File aging f02815925: OS X shutdown 38b294a1d: PSK IMD a7d67d8fe: Spectrum Display daa6d4317: Warnings in sound.cxx eb0caa457: OS X app paradigm =Version 4.0.13= 4c5c168b8: Language Translation 13ef81d49: cw t/r - doc update c4099e156: Spectrum Analyzer 2e7f681a6: TS990 tune feedback 43cc1b227: OS X CW 8d156c6e9: FSQ/IFKP clear tx panel f62c96a5e: deadman 80f52a80b: Image transmit fb4797bab: flrig race 1b0127654: CW Sweepstakes 5ef93f45b: CW no tx char a044193e3: timeops =Version 4.0.12= abb522dbf: Farnsworth timing 408a01b3f: PSK sinc filter 8cfc154e0: ACL interface 792b15267: Text capture dd2c8ef8f: OSX start process =Version 4.0.11= 3302f0d4a: Text Capture 35387dbb2: FreeBSD mod 6e94d54d0: Documentation update e4abdbf29: PSK filter cd36a4681: Audio Stream 5a9322f22: printf cleanup e8651ed3d: CW Multichannel 89b520723: QSY multi =Version 4.0.10= 949ed873f: WX HamQth bug fix 0142116ad: win7 mingw build fixes 6ed0b70bb: wefax ui mods c1c7ebfb8: wefax_map 170769139: auto start =Version 4.0.9= 26a1f8cd1: doc update cc95f0a16: clock_gettime 5d4008a20: spectrum display 6021e181e: Test Signal Dialog ccd3a2e60: dxcluster fonts 08aa8f7af: smod 6c05fe969: Spot buffer deb439283: Winkeyer clones ee3d420da: PSK s/n imd 2017-07-25 Matt Roberts ba2305c26: RX Text capture 2017-07-23 David Freese 322958194: PSK viewer =Version 4.0.8= 38b65ea66: Executable pathname 2a3c38bbc: rigCAT metering 37d78b1ff: OS X autostart 0006904c8: RigCAT i/o c0bf2f242: Doxygen build 6e4f04cd6: Analysis modem c438ba69d: XMLRPC rx stream 2017-07-13 Matt Roberts KK5YJ 4a6e7ce15: RX text paste 2017-07-12 David Freese ef36e76bf: FSQ triggers 851745139: FSQ image =Version 4.0.7= 2f7b7b90e: SCU-17 ptt 9fc06d6fd: bindUDP =Version 4.0.6= 094ac3c2f: Documentation 171574967: flmsg alert b3dd76d13: Time Macros a3f27d283: Require PortAudio =Version 4.0.5= 254e71788: Documentation update 6164c26b7: TELNET timeout 8922c5d35: FD macros b0928a083: N3FJP PTT dcca1204b: Rx/Tx open/close a49cf1872: xmlrpc configuration 36a7fcedd: FSQ macros 6aaec3400: Consistency check fail 7bcd89cbc: Audio Alerts 5f65d2e49: Restore defaults a9346cd6d: cw variable squelch 8460fba4b: INSTALL/README/NEWS c2c9f38de: CW Extended char set ad8e33ead: County field 64b397faf: autostart on os x 43b37fe71: Rx Context Menu 3aea3cae6: Port Audio on Linux f994b6a42: NEWS update =Version 4.0.4= e71dcfbfc: LOG area controls 1da156254: CALL field size dc9532c7f: CW QSY 8fab96305: Sound Card Output 240f52a5a: cw scanner =Version 4.0.3= 2be82c9df: CW code update a311139bc: OS X Wizard 7e552c49f: CW wait =Version 4.0.2= 2017-04-14 keith bellairs 7432793ee: Lotw Match 2017-04-13 David Freese ed5850e99: flrigi bw synch 972397247: Clang 8.1.0 97024a9f9: Sound card 15491930f: Revert "wefax" c85b75ebc: IFKP image processing ef3974350: Macro Save 4396c43e8: CW end-of-transmit 2f1d7094b: Font Initialization a1d4122a4: OS X socket connect 835d82364: Winkeyer exit process =Version 4.0.1= f40e79d7c: Socket connect =Version 4.0.0= 7efc9b2ec: OS X 10.12 build ffd6f0985: STATION_CALLSIGN f0f376375: Free BSD mods b1636058e: Logbook mods 167f0641f: ru-po-update 535481286: Default Tx Audio fac5963f8: remove sprintf a9db86638: Documentation update b52258175: n3fjp logger search c565b0355: fopen -> fl_fopen abd9554c6: 48 bar macro 5f5776c69: CW decoder 9c0f90671: DX cluster 016799a7d: Logbook support b4e227ba3: WinKeyer 1fe26c146: fsq ifkp s/n computation d576fd804: fltk version update 2a1a8c356: Macro Date Time Formats 2017-02-24 Keith Bellairs 627eb31f8: lotw addition 2017-02-23 David Freese 050711035: THOR/IFKP Image transfers 2017-02-23 Giuseppe Ciaccio 95b51b6e3: OSS bug fix 2017-02-21 David Freese f462dd755: ifkp s/n update 376f7f5a1: PSKMAIL PTT fault protection bcec5aa70: Logbook File Handling cbdea293a: n3fjp contest update fccb4ebd2: fsq s/n update 1786a5eb2: README update 67bc122e7: Russian UTF-8 translation 9decf048b: Tooltips 2017-01-30 Jae Stutzman fef4e9352: Hamlib/RigCAT/XMLRPC Interface =Version 3.23.21= 2017-01-23 David Freese 880720b80: Documentation 228950fa7: Logbook update 35d74af79: kml auto_ptr deprecated 2042371cc: build flags a3bc5e3ee: PSKMAIL beacon faults 5b970ccc1: N3FJP record rejections =Version 3.23.20= 5c456322e: N3FJP Winter FD 3119c9297: FELD raster display ca8daf3ce: ARQ PTT 2016-12-25 John Phelps de339d750: NEW micro modes 2016-12-24 David Freese 1a8f98265: Socket connect 6219ac94f: pskreporter query =Version 3.23.19= 0b3ad4a03: DX cluster improvements e06d6f2ed: Text highlight 5dae2123c: N3FJP generic contest =Version 3.23.18= 782204c03: DXcluster sort 73c2d1ea7: LoTW dc9c1071a: Socket Connect State =Version 3.23.17= e0eaaefaa: dxcluster update a81372aab: GPIO update 99b0d1bcf: LoTW documentation 214a7828c: Time Of Day Clock 839eb0fc2: FSQ Heard parser =Version 3.23.16= df67d85f9: N3FJP rounding dd5dc22f6: GPIO PTT 03b95b5e5: lotw/eqsl interface 360209bed: Resident help 4e905b663: ARQ Client vector 66a62fc1a: Rx Extract =Version 3.23.15= 436c6f8ce: Translation file 153ae9a55: N3FJP command sequencing 300624a89: BARTG vice BART 0ac4bb39c: speed test 047626711: XP fault on failure c4266493c: Default Logbook widget sizing e58b039be: Mono / Stereo wav file 7cacca673: ARQ thread 2016-10-05 w1hkj 2937696ad: N3FJP logged frequency 2016-10-04 David Freese bdb408d77: update check 005f10af5: DX cluster 72d0f38e2: CQWW zone/state 914b60c77: Contest fields 79fa4c8d7: OSX Clang build 9db7e7b62: flrig default =Version 3.23.14= 9e6e34a90: Documentation update 6c5ad4b4d: PSK IMD Emulator e6980a645: Wave file ff2265b24: trx inhibit 0fc2f5e10: Log Reports 01bd3674a: N3FJP application interface ccbd5e884: Field Day 4fc8b1260: UTF8 file access c6e1f297d: logbook merge 570d3bf17: Initialize Macros d9d12f4a4: NOAA wx access 0552fc622: Revert "logbook read" =Version 3.23.13= f4988a290: flmsg auto start efc46400c: Documentation Update 2016-08-06 Robert Stiles 0f237ba0c: KPSQL PSM 2016-08-06 David Freese e6b174346: m4 updates 352006569: xmlrpc mod fafaa7c6b: Main User Interface 360d6a202: fl_digi.cxx whitespace bdb3afbd4: xmlrpc tx queue 33be65ff0: QRUNNER BUG FIX f02228e91: logbook read 1f6d966c6: flrig xmlrpc client 4ddae1fb5: Title bar 9777cfaf9: Macro tag PUSH/POP 73ea18b98: G4 build warnings e8e3b899d: winsock2 error flag 8f8d6beff: xmlrpc error warnings 302fca55b: Port Audio Index 988ee57c2: Squeeze Play a9d3ec145: Documentation 8fa2f9208: FSQ allcall relay 2016-07-04 Kamal Mostafa 055a180e4: FTextTX: fix menu_cb default case behavior 93ca23774: status: fix override_data_io_enabled behavior 10eaf9df4: logbook: do not write empty string to ADIF 560941522: wefax d43951eb3: fix warnings: misleading-indentation (no functional changes) 1ecf952a8: fix warning: unused variable 'call_file' 9e9139e97: fix warning: C11 requires spaces around string macro 0531e5cee: fix warning: format '%d' vs size_t 1e888d113: XmlRpc tm_mday fix =Version 3.23.12= 2016-06-21 David Freese fa831b22d: xmlrpc add_tx 177a8f1f1: mfsk xmt filter 2b5755689: FSQ msg append de187d904: FSQ IFKP heard lists 76cf0e6ca: waterfall group 5f762f058: thor image 8cd6f830a: RxID button =Version 3.23.11= 198f6452c: RxID color changes b65722700: flmsg-arq autostart c6ac0f156: Resize bug 3c7392ec8: Hell Raster Display 4841f1098: Exit processing 2016-05-29 Roman Bagiñski 274d50087: Polish translation update 2016-05-28 David Freese 9c959afcd: xmlrpc add tx text 01245fe7b: Native Select Save-As dialogs 2016-05-26 Robert Stiles 520928643: FLDIGI User Manual Update 4b2005e7f: KISS IO Bug fixes/Additions and C++11 Test =Version 3.23.10= 2016-05-23 David Freese e14bbb60a: logger 19e7bad77: Restore focus 0a99bef13: RsID button aa6592c59: flmsg interface 5b367fb63: 4bars b4b8df4ac: ASCII ctl chars 759e6cfb0: Suppress dockable macros 065ead7de: Packet Prep 2016-04-13 Edouard Lafargue W6ELA 505c8b384: Portaudio Mono 2016-04-13 David Freese 68d9b3228: FSQ message files 2016-04-12 Robert Stiles 4ab48d41e: KISS, 8PSK, FLARQ icon Modifications 2016-04-12 David Freese 76ab77cd0: FLARQ 9c04f0787: focus behavior 2a3f4d4a1: PTT delays =Version 3.23.09= fc97b4af8: FSQ variable Rx 58b394025: Export ADIF_NAME 91ddd6c99: WF only 92c3c3681: DnD Image 0ebcc2a98: Frequencies2 use string 20ac527b9: Documentation 8eb05e63d: View noise 7cd0d8d52: About 9ed6cc333: NAVTEX update 2016-03-07 Kamal Mostafa 6da8d51d6: Sanitize tile_x, tile_y startup values 2016-03-05 David Freese b1d12b844: RxID enhancement f7662dfa8: TX timer 4e055b4da: rigcat mod 4c9f1404c: PSK IMD =Version 3.23.08= 2016-02-21 Rik van Riel f80745e5f: NAVTEX update 2016-02-16 David Freese 5b2edad9f: Save Logbook 1c8e0e95c: Analysis mode 0f650e9cc: flrig PTT 106e3e2a6: flrig waiting 71fa2248c: COM port close dd1165a36: fsq repeat last fb0fd4ce4: Mac Logger 2016-02-04 Jonathan Wakely 813b58ad0: GCC 6 build 2016-02-01 David Freese d8089777f: CALL capture bea9cfe23: Scope View 8bcc9e84b: RigCAT modifications =Version 3.23.07= 10266d2ec: Exit delays e821e49c5: Contest fields ebc00ed17: OS-X start_process f5e3186dd: LOG RECORD exports c0281eea3: HAMLIB CW RTTY ddb084c59: PSKR metric 68c5a6a08: PSKR/8 397f57066: Audio adjust 42809036b: WEB query 8af53b665: Mode Set e756d9355: Tab key docs 2fb5648f2: hamlib PTT_ON_DATA 22514a577: Macro Tool Bar 94f83626f: XmlRpc client update 265238703: Log Notes e9e8b3650: Misc Updates 78baf6cde: Set Frequency 14a2618bf: Rx SaveAs 16ede0800: flrig xmlrpc =Version 3.23.06= 3f577d977: WO woes 482d0606c: Smeter PWRmeter e08e40375: ARQ shutdown 2015-11-20 John Phelps 0b5b329d9: Developer Doxygen and BerliOS clean - Cleaned and Fixed developer Doxygen files - Added GitStats to the Dev Doxygen info -- run ./scripts/doxygen/gen_doxygen_docs.sh 2015-11-20 David Freese b19fff8d6: Documentation 55e0d31b8: Compiler warnings =Version 3.23.05= c86ec8033: dock macros 9b210f742: kml disable 2e2c9e90f: ADIF record repairs 93342e4dd: gpio ptt d6a34a40f: NAVTEX/SYNOP/KML 2015-10-19 John Phelps 51535ff23: Add 8PSK 125FL 250FL =Version 3.23.04= 2015-10-15 David Freese 251635627: CW filter 7f23f3f54: Update Check 4862141aa: fsq abort 3bed0e3f2: log merge =Version 3.23.03= 551d10556: thor-image c3b610bb5: FSQ trigger bug =Version 3.23.02= 04247643e: fsq cqcqcq 198c5a01b: fsq sounder/heard-aging dbb169be5: FSQ directive d47b1e355: rigcat delayed startup e6ebe7085: OS-X serial 2015-09-23 Kamal Mostafa f75b92a76: asciidoc timezone =Version 3.23.01= 2015-09-22 David Freese 8ad0a8b3f: WX configure 0caa5ea1e: PA debug 838e11237: WFALL-ONLY f472a1764: Logbook read 7cb4c6665: ifkp avatar depth ea189427d: IFKP image slant =Version 3.23.00= f78aa389a: Clear Tx Panel cbff7c3f1: Olivia/Contestia start stop tones 37175e2ca: macro bug 3d6e0b916: FSQ updates ed3b09d2b: ifkp modem c82de8e39: MXE update 7b42e019e: Macros 0606d1a34: Doxygen help d4b6308ab: QSO rec 2df24b8f6: MS Read logbook 30ad2a95c: WEFAX hang on INFO 670479756: Nu opBW combos db696170c: LSB modes =Version 3.22.13= 7bdf051c3: FSQ bug fix 93196764e: XMLRPC commands =Version 3.22.12= 1579ef60c: FSQ heard parser f61f7d7cc: fsq modem dfb931831: FreqControl focus e477621cf: trx exit =Version 3.22.11= 7d881bf76: flrig xmlrpc update 2015-06-07 Kamal Mostafa 40a6dcbaa: BUILD_{DATE,USER,HOST} =Version 3.22.10= 2015-06-01 David Freese dfc430ff3: FTextView styles bug =Version 3.22.09= 2015-05-28 Kamal Mostafa dac5bf4dd: Fl_Text_Display 2015-04-28 David Freese c34a613d7: Cabrillo/Export dialogs =Version 3.22.08= 2bda963bb: Analysis 967e7c553: rx/tx queues b5aa6a3e0: flxmlrpc 2015-04-16 Dave Freese 28839d70a: call focus 2015-04-14 David Freese a4d4faabd: 599 update 41beca007: US units 91ab73f91: olivia cxx a45006dad: fldigi-shell ee1966873: Write log 8d4f0efaa: Config dialog =Version 3.22.07= b78b683e5: Macro edit 06515a896: Multi-psk ae560e7b3: Vista SignaLink driver c79bfd73c: Image update 3c264e286: Command line 68f88eed6: SSB default signal 5ca7182bb: Digiscope resize b522d833c: FSF address =Version 3.22.06= 2015-03-21 Robert Stiles fe27da926: UTF-8 Rx display 2015-03-21 David Freese 15ca51252: 8psk modes e48c2fe5d: Macro Editor Fonts 2424904ee: R-L channel input e5148c0be: QSY documentation f2198122e: Sound File Generate 35ef2ed3f: devices_text mutex 2015-02-18 Robert Stiles aedc628d9: Bug fixes/Comments cbc9975bd: Check IO and delay prior to autoexec prgs 003707f81: Rename local variables 2015-02-17 David Freese edee64aa4: pa names 4ba7b78b7: Main dialog resize 279115cf2: Rig Viewer Frame 3eb8e41d8: Code merge/PortAudio Script return error b15f5d98b: Update translation files 31e231bee: Exit trx loop 2015-02-08 Robert Stiles 1155d8d0c: Documentation Update 814bed31f: Configure Script Engine 2015-02-08 David Freese ad52857f2: Macros fffc57c18: French po 375e98f65: CW QSK Tune 3ebf3dbb4: flrig xml client 423ac70ad: TimeOn button 3041a20c4: QSY clickable =Version 3.22.05= 2c9b493ce: TX Lock 7c9582228: video ID b93ea4ebc: fftfilt ed4f49d70: Port audio index 645e7f9d4: CW output level 7cc119ddc: Documentation 93d2da8ae: MFSK squelch 9c8d5153d: Rx display b1ac562a5: Log fields d67d1ab13: Native file chooser 6d11c02a8: ADIF temp log =Version 3.22.04= 2c3b965ef: xmlrpc =Version 3.22.03= d47ef8ab7: Berlios b986d9d55: CW configuration 3ff230128: DTMF 0a8f4a3b7: FFT filter 3c7b69ef8: CW xmt filter 2014-12-17 Robert Stiles 5dc3851b3: ARQ/KISS IO state conflict (part 2) * Ensure all state flags reflect selected mode. * Toggle IO mode in software. 2014-12-17 David Freese fa582c966: Window title 103c03915: Xmt Audio Stream 6947d3348: RX Text 0612ec9e5: OpenBSD d344fac9d: LOGGER EXPORT d5e257d37: Documentation b767b4856: LOG lookup 1359a591f: Lion/Yosemite madness e77aafe44: MT63 Olivia Peak signal 3a00dfcd7: HTML strings 311925bab: rtty xmt shape 4298f2d02: es nl pl files 54917d2f9: WIN32 error reports 2014-11-15 Robert Stiles c3e87f0da: KPQSL / SQL state conflict a488e72a9: Documentation Update =Version 3.22.02= 2014-11-11 David Freese 18c20d785: Freq Control 36ba34162: CW 68ba89b93: PO files 3060d42e1: fltk-1.3.3 compatibility 068f0302d: RTTY 75c2f795e: nu rigctl area 2e2ce974b: channel width 1fb74a1da: cty.dat confusion ac1befb8d: KISS log overflow 8c49c64e3: New install crash 4371ed350: EmComm 8PSK modes bf41f9091: MT63 doc 55ff39095: viewers 91674b8ad: psk pskr squelch 3dfbfbadf: Listbox initializers 2014-10-29 Arvo Järve 411878336: Info Macro Tags 2014-10-27 David Freese 9293e556f: Analysis update 90dd8f110: v21 v22 synch 10cc3c572: Modem tests da27f0b93: Button colors b16672fc3: Modes Menu cba4a0162: Delayed Bandwidth 29af73c7c: embedded browser =Version 3.22.01= 263257a6a: RX single click 9bbef877c: Macro Buttons b123fc102: Thumb drive 01bc010f8: Power Squelch e7de40b25: Documentation update 287e692f7: TxID control via xmlrpc 880df3d57: Analysis modem 2014-10-17 John Phelps 91bda2bf9: Gray-mapped 8PSK and soft-decision - Upgraded 8psk to Gray mapped constellation - Implemented Soft-Decision decoder based on Gray constellation - Even when the received phase is distorted by +- 1 phase-position: - One of the bits is still known with 100% certianty. - Only up to 1 bit can be in error. - Increased gain for noisy/weak/HF channels 2014-10-16 Robert Stiles 60c78c0d7: XMLRPC Character measurement issues with 8PSK modems 2014-10-16 David Freese 50402241c: View/Hide Smeter d10320995: CW matched filter ea853a87c: flarq update e7d9cc472: 8PSK/16PSK modes 6fcf11ddd: KISS interface =Version 3.22.00= a798037fc: Remove Mixer controls f3f8c9a63: FTextDisplay 674da9c6f: Freq Control bfb001b86: Touch Screen UI d7bb247ce: UI macrobars cad1c86f3: VSP boolean 2014-10-06 Robert Stiles c4bfed962: Tabulated Widgets Font/Font Size Changes 80dc81bca: Documentation 2014-10-06 David Freese 1dd39cc77: PACKAGE_PROJ 98cd7afea: Win32 warnings 93b76d4bc: UI tweaks ec3177b8a: Hide Packet Modem 9f2b358b6: Record loader bbce20ed3: Delta macro 38d9bab0f: MEMMAP 3ef04331b: WF drop rate 7448535a3: RsID time out 03ef90360: Wizard crash fix 2014-10-06 Stelios Bounanos d7fe2970f: Fix log format string warnings 382452a53: Build system fixes 2014-10-06 David Freese 4ad79672c: Default font 632eb8af3: Power meter 1bf6f495d: Smeter 73cdc07fb: regex.c fix eb3eb2509: fft-scan 5176ffb87: home directory 830a1cb7e: Analysis modem 38d158951: TRX limit check a0f43c981: Win32 Socket::close cf16c3ac5: SITORB tx issue 2014-08-29 Robert Stiles 67a744b21: Doxygen Inclusion 2014-08-29 David Freese 82aeba5cb: ARQ stx handshake 4503c990b: Virtual ports d40998f1c: New User Exit Behavior 7d683d39d: hash-fix a94a13b8a: RnA Analysis a1c3f7a93: Phase accumulator 947ebc9ff: Base Directories 913bb5256: WF Height/Speed f272e8311: RX Only 515b54f34: RTTY mem leak 65af71677: Olivia/Contestia custom 4cc2ee5fb: ARQ abort a64d62303: RTTY Custom Shift 1ae51434a: Spotter seg fault 129afe6cc: TX monitor 13e1cd566: Audio selectors for PORTAUDIO 9e555aa18: M4 tr1 detect bb91c8a2e: ttyACMxx identification 5ee22c866: Olivia critical section 50045163a: MT63 critical section 0a79e207e: Logbook fields f294b580c: Hamlib selector 0fd3cc445: Combobox Add to List 2efdf5c79: RTTY macro 0421813b7: clang compatibility ea5bcb9d8: FreeBSD nitems da7a43a53: Cabrillo time off df3c010aa: Change Fl_ListBox eaafc9173: Restore Fl_Choice 9a7dfe5bb: Olivia select fix 4bbf42787: fluid update 04808d20f: ComboBox c056cc883: RigCAT initialize 37bd0d28b: Modem cleanup e5fed0979: Missing build script 6762423be: Choice-->ListBox 8fef9bbc7: combobox-listbox 481be5c0d: FreeBSD One More Time 309988df7: RTTY normalize bd42895f9: Sound.cxx cleanup 2add98886: Portaudio ring buffer d24494792: Headers update c9f6df04a: Portaudio error reporting 2014-01-31 Kamal Mostafa 8a1d12f07: Avoid nitems fltk kfreebsd collision 2014-01-31 David Freese 5f7d52164: XMLRPC seg fault 5754566f7: Mailing address 2014-01-31 John Phelps a1d20d551: 64 bit stacktrace 2014-01-31 David Freese 86bffb95b: Developer update 678f66b46: modem timing test 2ca21dd9b: CW timing 1bcc31c5d: SKED macro 92ab4b619: FreeBSD issues a987fe5ac: PSKR softbits 50018ff19: WF max size 4cbabee12: packet update f967edf26: Waterfall correction 2013-11-16 Arvo Järve 1f77efbf5: RigCAT close 2013-11-16 Andrej Lajovic d9030901e: CharsetDistiller ab0a464b1: UTF-8 2013-11-16 Arvo Järve 80b09022c: Save Wordwrap 2013-11-16 David Freese 6313bf7e6: ARQ timeouts 37affbc39: Deutsch 42ccd2acc: fldigi.pot update e4398dab5: DTMF affa91928: WF latency 07652b190: Load preferences 2013-10-29 John Phelps 45fc67910: MFSK HF Long Modes * Added MFSK64L and MFSL128L new modes * 6.25 Second interleaver for very-robust HF reception * Assigned new RSIDs * Mode MFSK-64L : 1026 * Mode MFSK-128L : 1029 2013-10-29 David Freese f7ea783c0: Waterfall race condition 35a6486a2: Waterfall improvements 2013-10-29 Remi Chateauneu fc8abd4cb: Fix test_process on MacOS e52626b28: Various speed-ups, fixes and cleanups 2013-10-19 David Freese 200db3bc4: Multi-channel decode 1a89352d4: Cfft removal 5c9f5a258: fft filter 59b16c4c8: rsid fft da36c7bd9: WF fft b8f424213: g_fft 1afceb0ea: Autostart programs 2013-09-22 Kamal Mostafa 7515787f2: Avoid-nitems-fltk-kfreebsd-collision.patch 2013-09-22 David Freese 2112e85e6: RsID Error Control 863375dcb: Macro tag Image f5215cbf4: MFSKpic improvements 06424bd90: ADIF log database 5c1ee46d2: MFSK update 0e1e201b9: Thor update 87f110bd1: AMP end of text 5b8dae64b: ARQ mode character set 97ffdb05f: RsID, Macro Queue, DTMF transmit management 13120c8f7: Xmlrpc method signatures 034bc3e16: RsID fo computation a038411ff: xmlrpcpp methods fa9de7047: Error exit 262053bb9: RSID update 108ffd453: Sound File d5f460c89: fltk 1.1.x d73fc93bb: initialize active_modem a5f657dc2: CW Farnsworth 9ea6687fd: XML parser 2cb46f407: 64 bit compile warnings 177470784: Automake bug 5972d94b5: qrunner mod 706df570d: Pskmail-test 42b2b3ffa: Rigcat Thread 2013-08-02 John Phelps 39e8532f9: Doxygen for fldigi * Added scripts to generate Doxygen documentation from fldigi git repository / source * Also executes "cppcheck" and includes those results on Doxygen page (if installed on system) * Generates patches and log for the last 125 commits: includes links on Doxygen page 2013-08-02 David Freese ba3dad0c5: CPPcheck errors 6e66d2cd9: Modem class 607a696ba: Missing header a4a1ee755: fldigi-shell d9de4b67c: Fl::focus on OS X 5394ffb1c: KML thread a6f8accba: Data files eb287d6e5: Fl::flush d3e0feb2c: ADIF_RW thread 1a9a42db2: trx semaphore bb7ce32cb: Digiscope buffer 2013-08-02 Robert Stiles 957a1b49b: Portaudio exceptions 2013-08-02 David Freese f13f26c35: mxe-win32 regex 1ff3a7f7a: Thor update b66a887b8: record_loader fix 2013-08-02 Remi Chateauneu 2b9f6af61: KML/Synop/RTTY/Navtex 2013-08-02 David Freese 32b0543b8: PSKMAIL/ARQ socket 9bde2c60e: Code cleanup 04bcbf94f: Pskmail Notify RsID 1e77d1e90: MFSK shut down 2013-08-02 Robert Stiles f9267b922: Cwidth test for zero 2013-08-02 David Freese f3863c477: Packet timeops 366103119: MXE compile 3777182ad: XMLRPC 2013-08-02 Stefan Fendt b5f77b612: RTTY decoder 2013-08-02 Dennis Engdahl 24b9c70dd: RigCAT user commands 2013-08-02 David Freese 96b8a49fb: TX state 009b118ec: pskmail events aca2b0bf2: * Changed extended rsid iaw doc/rsid_codes.gnumeric 2013-08-02 Remi Chateauneu 2886b9fa7: Port to MXE / MingW 833f56152: QSL VIA 633674c07: XML parser 2013-08-02 David Freese 1b9f1d016: ARQ support changes fd56e1046: xmlrpcpp 5a9287760: PortAudio 5539f2cd7: SysV ARQ interface 9a63e0aff: RsID 8b8444391: METAR format 2140c90cf: RSID logic ffcdeb18a: PSKMAIL b03bde83d: RsID Timeout 9e259e667: Colors/Fonts Dialog 5b184a0c7: Developer List 4adb556f8: About update c83642041: ARQ server 4729da187: Wavefile generate ac8302195: MT63 mode selection 2013-05-20 Remi Chateauneu c64826361: xmlrpc-c removal 2013-05-20 David Freese 61314269d: Signal Browser Colors 97c2c1946: QRZ query 7bad5213c: Rigsupport 0ac919971: eQSL url cc11225c5: PSKMAIL 799444f41: Contestia/Olivia 848481b0f: Tabs Colors 2013-05-20 Arvo Järve fe315583d: Double Click bug fix 2013-05-20 David Freese 9dd563a8a: RTTY update fe1e10a48: Fltk backward compatibility b168ea7e5: Compiler warning fix 2013-05-20 Kamal Mostafa 3fcac6e08: Fix glob_t usage 2013-05-20 David Freese 417ce51a3: RTTY filters d6fc193a4: RTTY tx symbol shaper c5c4b1139: Spotting 8fb7b8028: ADIF case b7dcd8747: QSO NBR/NXT macro tag 2c5f42255: TX lower case 3d33980fd: WX parser f636509a5: Signal Browser af77a5292: Compiler Warnings ab422bb9b: Free BSD mods 3ed409964: Serial by-id 860444bca: Misc NBEMS mods 2013-05-19 Arvo Järve 8c5581152: CRC16 and ANSII char set 2013-05-19 David Freese 75a8e0900: High Speed Playback 9d791d28d: flstring 793c1cbfe: RTTY config tab 63b4eb3d4: RTTY stop bits 4dc9bc95f: RTTY FSK modem 1444a633c: PSK viewer 65c53fba6: Contest fields dc65247a8: RigCAT INIT/CLOSE 5a2412115: Olivia FEC reset 4ad148bf3: Status / Tx Level Controls 664286641: Macros 6063b56f4: File Selector dc6b08498: CW modem 14329e533: High Speed / Multi-Carrier Modems ce1d5c210: User configurable items 2012-12-26 Makoto Fujiwara 2a22c31ec: NetBSD compile error 2012-12-15 David Freese 6fe5feef9: Dup Cty lookup 2a3d1aee6: Get RX buffer 200434328: Util.h mod 1884f2f2f: Capture Alt-F4 2719b0fc4: Macros LOG LNW EXEC 2012-12-03 Remi Chateauneu 836c5c331: Progress widget 2012-11-25 David Freese 2252cab1d: ARQ Socket 5b9e09fc8: NBEMS modes cb82ed888: Escape aborts 2012-10-31 John Phelps 51db482d9: Allow xmit of EOT character 2012-10-29 Andrej Lajovic 87afa66b0: UTF-8 overhaul 2012-10-26 David Freese 600db9e24: Thumbdrive 0fa939647: TLF arq 5ac506504: Logbook Dialogs c17590efb: ARQ rx/tx 9006fdeaf: View browser 2a0f09d8e: FLAMP interface fix 2012-10-04 Andrej Lajovic 7bdf0353e: UTF-8 wide characters 6706da00c: flarq bug fix 1d7f8c25d: Add_tx_char 2012-10-03 David Freese d43f564de: UI update caac75744: Code merge fixes 2012-10-02 Kamal Mostafa e203c4e52: Fix crash if no OSS mixer support 2012-10-02 David Freese 1880cfe8e: Logbook Call width 2012-09-29 Andrej Lajovic 2a391bcfe: Log file update 3e0dac76f: UTF-8 char echo e84c5ce3a: Hamlib sideband menu 2012-09-11 David Freese 14346a7c5: flmsg/flamp stream processing 1bfdfeecc: flmsg cmd line params 6142046a0: DominoEX varicode d02f71487: WRAP binary files 2012-08-31 Andrej Lajovic e6ee942a8: Backspaces patch 2012-08-31 Daniel F1RMB 6d6c7b33a: UI enhancements 2012-08-31 David Freese 4cb619d4f: Combo update ad43c7383: Extract timeout 22ad2be6e: ASCII tables 4cf9425b3: Socket send on Linux 2012-08-07 Kamal Mostafa db7866108: fix spelling error 2012-08-04 David Freese 57801e992: Logbook dialog initial size ede0fd89d: RsID Multiple 2012-08-02 David J Vanecek 9025bea6e: Open BSD fixes 2012-07-12 David Freese 07d5d89b5: Restore post signal rsid 2012-07-08 Kamal Mostafa dae167edd: Tango icon: Restore missing weather_clear_icon 2012-07-07 David Freese b36a5e8ea: RTTY metric 143cb1c0b: Logbook Colors-Fonts 9f5250f77: RX Text backspace 55c0372dd: HAMQTH Session ID 2012-06-29 Kamal Mostafa 24b8bcc42: Tango icon pixmaps update to version 0.8.90 (public domain) 2012-06-28 David Freese 47b5bf6c8: Merge log records 2012-06-26 Leonardo ff063eb16: Wavefile playback 2012-06-14 David Freese 0dbf248cd: Polish translation 91cdbe403: file-chooser b7200d6e3: HamQTH 909f3fabb: Main Panel Controls Colors-Fonts 6280de9c9: WEFAX/NAVTEX config 9b3dabd85: Fork open file descriptors e9587fed1: Logbook Update 686e8b5df: Wefax/Navtex f47119c7f: CW decoder update ff25baebc: Rigio thread 52f27c8c3: WEFAX mingw32 fixes 2012-05-10 Remi Chateauneu a3435a73b: sfft speedup 2012-05-08 John Phelps 93e0a1b0f: DominoEX-THOR mods 2012-05-03 Remi Chateauneu 350f83eb5: Viterbi and filter speed-up. 42000367a: Wefax 2012-04-06 David Freese 7041a5e57: FreqControl paste ede22f5c7: Base directory 5c71fdfb0: Check for updates cd04cad41: Notch indicator color ca5ff4970: ARQ Parse Mode c3f315bb9: Path separator a7169ea22: Debug changes 39edf75c2: Clear sent text 1abbedf2e: Control-Z fault 0d3265f04: Notch 7f2cfbef5: EXEC macro 2012-03-02 Remi Chateauneu e2eb292f5: Wefax fixes, AFC, speedup. 2012-03-02 David Freese 23e315b31: Save Macro - Windows 331ff2e7c: About copyright date c9df72646: MFSK pic dnd 4a0833efa: Merge record logic error 2012-02-19 Remi Chateauneu 490058b58: Wefax bin images + debugging. 2012-02-15 David Freese d2d254e5d: Weather report 2012-02-13 Remi Chateauneu ccee94d94: Wefax AFC. 2012-02-12 David Freese eae67baba: OSX Lion shutdown dedc82ac1: OSX Lion shutdown b609cb64d: Config Dialog 2012-02-08 Remi Chateauneu 548f94124: Navtex AFC * Automatic Frequency Control. * Now the input frequency can be changed. 2012-02-06 David Freese 0d287c667: Cyrillic-UTF8 chars 2012-02-05 Remi Chateauneu 268d0f3cf: Wefax AFC and GUI 2012-02-05 David Freese fbca133ea: QSK test 2012-02-01 Remi Chateauneu f2268b884: Navtex enhancements. 2012-02-01 David Freese 7c60aa866: Weather report e78677c19: Control sizing 9d12f24af: eQSL 9882ad411: OS X file chooser 9df33700f: WX international 46e446814: Macro filename 4a7468fcd: Callsign query afc9487f6: WX Celsius 60bac3cdb: Weather tag 56fb06773: Inline tags 418721504: OS-X native file chooser 48998ff31: rigcat serial test 19d9b1a5c: Macro load display 03c289c4a: File-dir selection e0d4f89e0: Rx text wrap dc190c4d4: UTF-8 rx suppress 92f313d92: Get WX 2012-01-18 Remi Chateauneu 25b4499a6: WEFAX windows show/hide bug fix. 2012-01-18 Pavel Milanes Costa 16856e004: es.po update 2012-01-17 David Freese dd1416d77: Update to fltk.m4 7a0ffda17: GCC-4.7 fixes 2012-01-15 Remi Chateauneu 2989baf2d: WEFAX : Noise reduction, less disk space. 2012-01-13 David Freese bcc5e9fe6: Missing files f8d7da3e0: RX last line e3d80a619: Debug text b3e675c18: View browser find control 419a23657: Find chars fwd/back 444eb6b17: Corner controls 2012-01-08 Remi Chateauneu 6b7067ed7: Wefax b/w fix 2012-01-08 David Freese 23b9a177d: Fltk-1.3.0 2012-01-06 Remi Chateauneu ae363526e: Wefax GUI enhancement. 2012-01-06 David Freese e1c991fe6: Rig cat close 14d24d696: OpBrowser font fd602017c: Tune abort faff48997: VAC PTT delay ca82dac56: Mono audio 9409d6c14: NAVTEX check-TESTS 2011-12-11 Remi Chateauneu acd15ca0d: Navtex code cleanup and warnings. cf895e9fd: Added Navtex deviation in waterfall. 2011-12-09 David Freese 773c413e4: Right Channel audio 8d54e2886: NAVTEX modem 0c064c64a: WEFAX update 87cc9d43a: WARN status colors 2011-12-03 Remi Chateauneu ee1ab43ae: Modem class update 8d647fc31: QsoRec comparisons 2011-12-02 David Freese 6ac3b345b: Cty.dat 0c2b4fc09: Contestia 64/1000 3dd38d17d: Call lookups 0263d0a76: Compile warnings ce6c39945: ver2int 14fb48054: UI changes b9686471d: Main thread hang f575215a8: Merge dups 4dd27c23d: Logbook dirty boolean ac9c15b07: Tx Attenuator Control 25036db5a: HamQTH app ident 6d4326d4a: eQSL QTH nickname 972cba1d1: Merge Logs update 7d95b7b39: Merge Logs fe6268185: ADIF i/o tweaks e0bf1284f: Call lookup 9eca86a63: ADIF/EQSL thread shutdown 7b04a17a9: Ignore slash postamble f50c79fe1: Log Export by date 48f71f19b: ADIF integrity check d35ed7dc7: Logbook menu c29719895: Log r/w 3e970b99e: ADIF write_log 2011-11-15 Remi Chateauneu 4103a0729: WEFAX error logging fix 2011-11-15 David Freese ff34b3cdb: Restore Log Sort 4aca1f1b5: eQSL update 389ce71e9: eQSL thread 2011-11-12 Remi Chateauneu dab85dc13: Wefax enhancements. 21bcc183f: Use Logbook record 2011-11-12 David Freese 7f30f2912: eQSL 2dae98df1: eQSL b0e37af39: Exec macro 3288d8d3d: QRZ on-line lookup bf8812752: HamQTH update 15ff024ba: HamQTH b5e788e6b: Auto-send 2d1d4844e: RSID defaults db2803d7e: NBEMS-FLMSG Directories 9fd70bc17: Resize fault bcdc9cff2: RSID limit fault ece4fb7a7: DTMF debug 0b041f682: Multi QSY bug fix cb5ddcdaf: Multi QSY f63a77ada: Common QSY 8630feb2b: Revert qsy patch 6bc6fc804: HamQTH lookup f96fb2557: Packet debug cf3bed318: REV macro tag 39ebd8bb6: RTTY bandwidth 5c0da523e: MFSK soft decode 2011-10-06 Remi Chateauneu 7542ae98f: Multi-QSY 2011-10-06 David Freese ee1747d35: MACRO code cleanup 153e1e812: ddab268c3: ... 0388d6a09: !Queue reset fdf5fe016: Timer delay 3df6c3a9e: Olivia tone/bw choices e3e270350: Macro Edit 58c1bd8ca: Macro Editor 6b39f526b: WWV xmt mode 1c8cfca97: Scheduled Macro ca4c595ac: RTTY baud bf7ff417c: CW/RTTY init fault 75aa9a85a: NULL modem 502e62e6a: 7b2ecb6ee: PACKET long blobs 2011-09-09 David Freese 1f6398ed0: Delayed macro timing 9a2698501: Log Server lookup 6a03241f3: Delayed Tags 2011-09-06 Chris Sylvain 31bfb989c: PACKET max level 2011-09-05 David Freese 563d667ca: Inline macro tags 7184fb894: DTMF decoder d6eae02ba: CW Prosign defaults 2011-08-30 Remi Chateauneu 3f08ee997: Macros code cleanup 2011-08-30 David Freese ff3b0b203: DTMF class 3113c68de: DTMF encoder 2011-08-16 Chris Sylvain 4942a0b2d: Packet audio boost 2011-08-14 David Freese 8826d4fbb: Wide Cursor Tracks 4f0acd03a: Log resort add record fd8d86f78: New Macro Tags 447816527: RTTY MARK coloring 60947aa21: RTTY MARK frequency 381b809f6: QSY macros 2011-07-13 Remi Chateauneu f9a459ab5: Added wefax::adjust_metric method. 1da9ed17e: modem::display_metric now sets the member modem::m 2011-07-10 David Freese 07c12e07a: TX Attenuator 2011-06-29 Pierfrancesco Caci 12714ebe0: CW Offset optional 2011-06-29 David Freese c2d0b93c6: Pkt compile warnings 2011-06-29 Remi Chateauneu dc9edc10b: WEFAX compiler warnings 406a5eaea: Wefax improvements 732f12de2: Wefax fixes cfbfe22ed: Added XML-RPC functions for Wefax 2011-06-27 David Freese f77b48a94: XMLRPC linking error 2011-06-26 Pierfrancesco Caci eda79c406: Swap mode/frequency change from frequency list 2011-06-18 David Freese b0c694177: XLOG save with xmllog 13819f590: Logbook server 360eedb67: Logbook client 27b16f2d9: Logbook County 2011-06-11 Kamal Mostafa 6e0cd5f9b: Mode_info table restrictions 2011-06-06 Pierfrancesco Caci af057a4eb: K3 CW-QSY 2011-06-06 David Freese 64406547b: TX attenuator 2b89e69ab: LOG.ADIF export ec6104e27: Duplicate #defines 2011-05-23 Kamal Mostafa 8c066afe6: GNU/Hurd build fix 2011-05-23 David Freese ff3e16244: Spot-notifier 2011-05-23 John Phelps, KL4YFD ab1602b75: High baud rate Dom/Thor 2011-05-23 Chris Sylvain 4931d1d15: Packet Modem 2011-03-23 David Freese b74102f9c: Config defaults 485a6339b: No rig mode selection f6bb40317: wo save status e04d5f6a7: flmsg auto start 91d93856a: Wrap File reception c054ee63e: EXEC win32 macro tag 2011-03-06 Stelios Bounanos e987c66c8: Fix socket/getaddrinfo support =Version 3.21.4= 2011-03-01 David Freese b1f141f01: LOGBOOK date-order 6daba19c0: GRIDSQUARE on reports =Version 3.21.3= a15a9c3a5: PO updates 6eb644b85: Waterfall Only =Version 3.21.2= 2011-02-18 Stelios Bounanos 211ea4c97: Update NEWS 2011-02-18 Pavel Milanes Costa c01c28ef3: es.po update 2011-02-17 David Freese 13fce24d0: Olivia Tone displacement =Version 3.21.1= 2011-02-15 Pavel Milanes Costa ef8b122d2: es.po update 2011-02-14 Leigh L. Klotz Jr 3cc9e5ecb: Add RX frequency tag for search macros 2011-02-13 Stelios Bounanos 8ad76850a: Adjust notify dialog 2011-02-11 Pierfrancesco Caci 3634a1198: it.po update 2011-02-11 David Freese d24ee90e1: Macro 0ad002e71: Enable NLS on woe32 2011-02-09 David Freese 23eacc5d2: Cosmetic adjustment 2011-02-07 Pierfrancesco Caci 5bc6b100a: PO update 2011-02-07 David Freese 9d2098875: Psk_browser seek_re 451b63ff3: MT63 Waterfall Cursors 2011-02-04 Stelios Bounanos 37369b0c1: Update i18n 7ee39dcc7: Update copyright 3b11a86ed: Update About dialog box 9d68a57fe: Make wf mouse wheel action strings translatable 2011-02-04 Pierfrancesco Caci 355f77683: Add Italian l10n 8cefce036: Make more strings translatable 2011-02-04 Pavel Milanes Costa 919a99fbf: Add Spanish l10n 2011-02-03 David Freese cfd0d027a: MT63 2 tone fix 7cf8bcd4c: MT63 manual tune mod 2011-01-31 Stelios Bounanos 2d474d938: Config dialog clean ups 81a464ee1: Remove macro config images 2011-01-25 David Freese 91d62b88c: exist b30b31405: mvgroup size restore 857cd2f34: Macro Bar positions b68ae5fa8: Main Dialog Cosmetics 30e882704: Panel Widget 2c6043b0e: Compiler warning in trx.cxx c2f5364e0: VTgroup position cfacc550a: Fl_Text_Display_mod 70b57ff5a: Viewer Width adjuster e78f3e0ca: Viewer status 5d8e05098: View slider color 949a11262: Macro bdb3ea623: Maximize window error 141218737: Signal Browser Cosmetic 12f0f4be4: Logbook Server Connection Disabled 9ec791a8a: PSK browser mod 6a24e154c: Code cleanup f97218bde: Convenience features 29074053f: Signal Viewer History 3bc947bc7: Mixer Frame 809338917: Channel Number 2011-01-02 Pierfrancesco Caci 7e4c1ab27: RX-TX log file 2011-01-02 David Freese 98b4cb0d8: PSK detector mod 0dd124939: Browser Channel Order c33a85dc9: Tile_Check fix 30d8c5898: IPC Date report 03390bbc7: Load Macros 3b967fd13: RTTY visible timeout bce4760d1: Browser start frequency 8e7629668: Macro Bar Configure 0c66bd78f: RTTY adjacenies 3b55c6977: PSK AFC 0c5e8a3d1: PSK Browser-WF data 714e5738f: Waterfall Only mods 75c8e77e7: RTTY BROWSER 040c13f2e: Browser reformat 04f107e21: PSK browser mod 75c9112da: ADIF format fault 7767ff1d9: PSK browser update c7c3a43c7: RTTY viewer 4344d5369: Macro Button Bars dc6a6b1f5: CONTESTIA 99f977cd2: Dual Macro Bar 685ffc38c: PSK browser detection 425c6bf4c: pskBrowser class 2010-12-21 Dan Ankers 09c9569b4: IARU Maidenhead 2010-12-07 David Freese fa165cc76: Countries List 9b8fdd864: Check for updates 81ebe8173: Carrier Squelch eb0afbbc3: Call Lookup d6583d8fe: RSID new mode 1f8a59fb6: Logbook Menu 49cae5f9c: DATE_TIME sorting a5f2f7f1c: Log Client 2010-11-19 Stelios Bounanos ca7d30f79: Embed xmlrpc++ 2010-11-19 David Freese f2b39b1ed: Reversion of commit 2a957966c1ebda93647a789a75f83aba6af5f98a afeccbb9a: DigiTalk ef188fd73: QSO_DB sort order c372640fa: Macros 2010-11-05 Terry Embry 9c8e837eb: VSP patch 2010-10-20 David Freese c29ee471d: CALLOOK lookup 2010-10-13 Fernando M. Maresca 80e1bcf36: QSO_DATE_OFF field implementation 2010-10-13 David Freese 7e1c6cdb2: Build correction 2010-10-13 Remi Chateauneu a2c9e048f: WEFAX bug fixes 2010-09-23 David Freese c5ea3ce06: FLMSG open NBEMS/WRAP/recv folder f46016f38: ESC action restore 0ac873fb5: Hamlib Tests e645b565b: RigCat Width 0f52da398: Goertzel filter update 1ad7f164d: CONFIG dialog aa4bee2b8: Abort ARQ 2010-08-30 Chris Sylvain 6cbd20061: RTTY-PSKSCOPE e6d43d4e3: Goertzel Filter 2010-08-30 David Freese a0cca984c: Time Macros 0c14c51ef: Logbook Field Sizes 72d78b1e1: Macro Mode Change 70ef8dbc6: Combo widget bea2d29d0: TX file insertion 6c6f6e005: RsID b24fe8588: Xmlrpc Raw data a9815cdbe: Log Sort 1110fe470: Xmlrpc BS char 9e6d0f3d2: Logger bc70438d7: Compile Warnings a7ee2aff8: ThrobX dd0d489ea: Post RsID 809b218b1: Revert "RSID silence period" 2a957966c: MultiUser Logbook 4a77c0301: Contestia Olivia info 7f7aeab2b: RSID silence period e7d9cd128: Logbook Save 0af649bb2: '^' Parser 2010-07-13 Fer Maresca, LU2DFM abafe0d42: change 2010-07-02 David Freese 0faeecb0c: RX-TX Select e1cfec01c: RTS-DTR ptt 9064f150a: REPEAT Macro e2ec2391e: Mode prefs 6e6b67242: Morse Prosigns 2010-06-21 Chris Sylvain 62335f9af: RTTY class 8e26ee4d0: video text mod 773e0ede3: PSK Browser modes 40204caa9: Beginners Guide update 2010-06-15 David Freese 4d1c449d9: PH Cabrillo report fd7ca52e1: QRZ xml service 5c0eea9a4: CWID e37116b09: RTTY 75 baud edf6b4b97: Read Config 629a4040c: VIDEO ID d9a2e53c8: CTY.DAT-KG4 e5d878577: PA flush c5f12bbb1: RSID code base a7f6d8563: RSID new codes 870bfa6fd: WEFAX time 6e617cf2f: TX Wrap disable d46b8a410: RSID squelch 03f1ba743: RSID tx suppression 079035048: Pulse audio 2010-05-15 Remi Chateauneu f6f0ea930: WEFAX bug fixes 669ee37ec: WEFAX additions e9d7520f9: WEFAX image size 2010-05-15 David Freese d7d19f07b: PSK RSID c3fbd31a8: RSID DomEX-FEC 2010-05-13 Stelios Bounanos e36afb030: Implement CLOCK_MONOTONIC on OS X 2010-05-13 David Freese 1387fbed9: WEFAX MINGW32 2010-05-03 Remi Chateauneu 2508852b0: WEFAX addition 2010-05-02 David Freese ed574fbf9: Configure.ac update =Version 3.20.11= ff47cc4ac: XCVR Freq 5186a7490: FLARQ 4.3.1 =Version 3.20.1= 55eec2a8b: MAP macro update e17ccfb6c: LOCK macro 917b5bd14: Freq Browser Select 4474bd497: MAP macro 2da1e5588: ARQ auto file 54a056907: Freq Control Font 2010-04-22 Stelios Bounanos 5b7e83905: Disable sprintf re-declaration c5f34c684: Fix compiler warnings 1733f1f1d: Add preliminary support for FLTK-1.3 2010-04-16 David Freese ab092a6f1: psk reporter mode 6c15ddde0: Psk Viewer Min Width 2bc610505: Revert "SC Time Out" 2010-04-12 Stelios Bounanos 5da5ba6e5: Update NEWS 2010-04-12 David Freese aaaec180f: WARNINGS 8df121a46: SC Time Out 45654eab6: PSKR fec metrics faf5e6c6b: Pause-Break 975f4a9c7: RX lowercase option 2010-04-12 Stelios Bounanos d551f2eff: Disable Czech l10n f1762d7c5: Fix more widget labels 4f8056578: Update QSO frequency 2010-04-08 David Freese 3754c63d8: Tx Pane Min Height 717c15167: Modem Init 0469895e2: Contest Menu 8f76576fe: AFC-SQL check buttons 5dcf5cb1c: ADIF Export 1b5f56f6b: Olivia-Contestia bandwidth 0d77c1bed: SSB modem 586e3d5ea: QPSK dcd postamble 1aae11e61: RX_ONLY Modem type d29495f18: QSY Lock disable 02767b0ba: Contestia c10ee739a: Freq Analysis Init 2010-04-04 Stelios Bounanos 391167c14: Add time functions 80572f5e6: Improve monitoring of transmitted signal 2010-03-25 David Freese c517a1ef2: NBEMS files b794fb14e: Rx Contest Popup Menu 09c77b568: Olivia bug fix b6b6d76ad: Contest Rig/Log View 4000fe03b: CW Xmt WPM 35826a3bc: Cabrillo Report 3b63d8f33: XBEG-XEND macro tags 2010-03-20 Giuseppe Ciaccio 1fb42ac9c: CW Decoder improvement 2010-03-20 Stelios Bounanos e0c62c243: Add new modem macro cdd4457f0: Fix counter widgets cff61120b: Fix Olivia pre/postamble 2010-03-20 David Freese 269152ef1: AFC-SQL Lighted button 876697918: QSOTIME 2010-03-18 Stelios Bounanos 2715366c6: Fix label sizes 4ed6c1c0e: Add PSK browser font change support 735dba219: Cosmetic changes the PSK browser 5a1cf7dd8: Add font browser filter bdcca8c39: Add mouse wheel handling 2010-03-17 David Freese b66e4565b: LSB modes - no rig 40ae07fd4: Macro Idle b1702af92: User Config Tab 6639fef3d: macro 48552e1c7: Light Button Colors 2010-03-10 Stelios Bounanos f7d5af9cf: Fix status load 97c65e103: Add scroll hints menu item 2010-03-10 Stephane Fillod 7369f4454: Update i18n 2010-03-09 David Freese e9ec047e7: DigiTalk 2010-03-05 Сергей И. Королев 127380fc8: Add custom RTTY shift option 2010-03-05 Stelios Bounanos a8e4f818e: Add XML-RPC methods for Olivia d2df10a5f: Modify FText add() methods 92a8fd674: Fix bandwidth marker 2010-03-04 David Freese 82eaead78: Olivia Pre/Postamble visibility on waterfall a454879c9: Empty Call Nag e3c7a7694: Initial Configuration 551d11875: Textout.txt on MS 2010-03-02 Stelios Bounanos 2f48f0731: Add release notes cc957f37c: Update copyright headers a9b976a7b: Delete unused code 2010-03-01 David Freese 2e78ec6bb: NBEMS folder access 995c34e41: fix dcbfb7d59: Add option to specify non-word characters 2010-03-01 John Douyere 8cea906f7: Extended Pskmail messaging 2010-02-26 Stelios Bounanos ed30b5b0f: Add new WriteARQsocket function 2010-02-25 David Freese 5a3d0abc7: RSID detect 2010-02-24 Stelios Bounanos df7caff4c: Fix name_to_device 2010-02-22 Vitaliy Berdinskikh 9c846a19d: Remove png_infopp_NULL from picture::save_png 2010-02-22 David Freese 9b80c2c93: Portaudio stream persistence mod 445c24a9f: Win32 init_stream patch 933af6c24: Serial bug fix 2010-02-16 Stelios Bounanos ccaaa1eb0: Add RX text scrollbar hints 5c82c352c: Fix RX text context menu 0459067e0: Log excluded ID modes b3eda4503: Add init_modem frequency argument 2010-02-13 David Freese 51700d79a: TX ^r ^R parsing b1c5fa9fa: Startup Fix 3f3ddc0c5: FELD improvement 3acb7f25e: Wizard Fix 2010-02-11 Stelios Bounanos e74201b8f: Fix sound initialisation 2010-02-09 David Freese 872f52cca: WF_ONLY height fix 64b192197: fix 617f4590e: ARQ abort 2010-02-06 Stelios Bounanos bb37cc1c6: Fix -iconic option handling 2c55a62fe: Improve audio initialisation bde818b18: Fix OSS compilation on NetBSD 7ac0fd568: Remove -fomit-frame-pointer flag 96419d75e: Update manual pages 75e0eba8c: Fix main window title modification 0467a4183: Fix PulseAudio backend b8d160d33: Fix compiler warnings 2010-01-31 David Freese c5ca09a24: Configure Dialog 03eedc4ab: Olivia Divide by Zero Error 33335854f: DUP indicator b895c1a34: Olivia Noise Estimator d4540c06a: Waterfall Offset 5c3dd0913: Diamond Indicators 2010-01-28 Stelios Bounanos 37ffd696e: Update command line argument handling 2010-01-28 Chris Sylvain 80ca36a55: Make CPU speed check information available upon demand 0936615db: Fix llabs() namespace ambiguity 2010-01-28 Stelios Bounanos 78b515c6b: Add verbose log level 25e2c82ba: Rig control frame tweaks 2f9a0a271: Add rig.get_name b23f5d543: Fix table widget 3bbb6ea23: Fix wizard crash on OS X 2010-01-27 David Freese 6b40f6b76: RTTY demodulator eb9a38567: Rig control changes e87b9df75: Logbook empty record 29e891ece: Config Dialog Cosmetics 6354484e1: RTTY mods 2010-01-25 John Douyere 33075e386: PSKR DCD detector 2010-01-22 David Freese a06bf9354: S/N evaluators d84b06052: RTTY decoder mods 93bedef1c: RSID fft processing afd3adcd5: HELL AGC improvement 2010-01-12 Stelios Bounanos 5b9ea76e4: Add rig control XML-RPC methods ec51533bb: Disable frequency locking in qsy 5d3732cf3: Add wizard af78f3465: Improve RSID QSY functionality 2010-01-08 David Freese 86bbd55e2: Initial UI 56610a9a7: NOLOG alternate Callsign entry 2010-01-08 Stelios Bounanos 239ff98f5: Adjust View menu 2010-01-08 David Freese 276e76944: Xchg In capture 4cd90d30c: WF freq limit eea028767: Auto file transmit c762969d2: CSV Export 75be29e6b: Debug code removal ddc5790b7: Modem Initialization 6552c16d2: CSV Export 2010-01-06 Stelios Bounanos edb217c94: Change waterfall focus handling df5c3ff8b: Improve mode cycling 2010-01-06 Chris Sylvain 0aa643b3c: Add keyboard shortcuts 2e476a39b: Open PSK Browser only when last mode is a PSK mode 2010-01-06 Stelios Bounanos bf235e26d: Update INSTALL bb537ed6d: Update README 2010-01-06 David Freese 9f9e73880: UI adjustments ca0e9a8ac: MS Excel compatibility 2010-01-02 Stelios Bounanos 0ec66d1c7: Add ID mode exceptions 2010-01-01 David Freese 4bf78c634: CW Squelch d494b8af2: QPSK Reverse 5d4ac2d44: ARQ parser afc5861de: Olivia Mods 2009-12-30 Stelios Bounanos 4380a1590: Fix xmlrpc locking c7eb9acec: Clean up xmlrpc 2009-12-30 David Freese 6bb2a5c11: Revert "XMLRPC set_freq bug fix" b751b9d49: THOR soft decoding 087b4aa2b: XMLRPC set_freq bug fix 8e8b41868: Auto Extraction bug fix 2009-12-18 Stelios Bounanos 56afe38a6: Add new RSID codes 4eb51bad9: Fix rig mode menu 8af1511ed: Improve rig control methods 2a14309ac: Fix Fl_ComboBox 80a6ad4b7: Add new XML-RPC methods b5edfc277: Improve XML-RPC log.get_rx method 38f76f703: Save PSK Browser search string 613ecfaa3: Store old event logs fdc2cdf77: Lower slow CPU speed test threshold 2009-12-18 John Douyere 645b74c84: THOR squelch adjustment 58d86f6fa: PSKR - PSK63F - new modem types 2009-12-08 Stelios Bounanos d4e0a6d08: Add support for persistent xmlrpc connections 2009-12-08 David Freese f5d3e4660: Gaussian Noise Generator 2009-11-29 Stelios Bounanos d952ad492: Fix pkg-config error 2009-11-28 David Freese 69cb51295: RxID Save b4dba6f9d: Callsign field size mod 2009-11-27 Stelios Bounanos 53a1e6bb6: Change arq class member types 78d5e4dfb: Disable win32 snprintf workaround aaaef29ca: Remove unused variables ab0d77f1c: Add missing USE_X checks b3d02658b: Update crash handler 483b53735: Fix LDFLAGS 7e3959921: Fix custom pkg-config macro b06339d24: Fix conditional pkg check 2009-11-18 David Freese c226978a1: Hamlib build fix 04992b1eb: Rig CAT mods 72959b65d: RigCat Mods 53659c424: Hamlib mod fix b6a7cb66a: Hamlib-RigCAT mods 306e6c163: Minimalist GUI d85b974e3: Hamlib mod 2009-11-06 Stelios Bounanos 0997c47b4: Distribute common resource file 52caf9b60: Fix guide generation 2009-11-05 David Freese 04a9bfc13: Macro Tags 2009-11-05 Stelios Bounanos 5c856a9d0: Restrict FLTK API version check 2009-11-04 David Freese ade6427de: WAIT macro d02a3c83d: RSID Macro Tags 18f4af14b: Flarq email folder d60d6d996: Macro Save Log b99366d04: No Rig Save 2009-10-26 Joe Veldhuis 917353752: Base Rig 2009-10-26 John Douyere db836ccf4: PSK500 Addition 2009-10-24 David Freese 65f70cd1f: WF Limits 4fa12df98: ARQ RSID controls 6e4737de4: RST Out clear bug 55168db43: wfdisp-mod 05a62fa20: PSK250-AFC 856b5ed2d: Rx/Tx Menu abedc7c1b: Waterfall background df226c9e1: Min-Rig-Log Panel c9560eaf8: Macro Timer ff7d94152: Flarq mods 262521251: Log save bug d1fe5435d: GUI adjustment c092d628e: Rx Contest Popup Menu 3d9952ed7: Contest Logging e62b52f1e: ENTER bug fix 3e464b85a: Docked Scope 0ecc89915: Macro Timer 11b82cd3b: Stop Timer Bug 5333ee259: Focus Mod 45239f476: Internationalization cc780450c: Minimal UI 273622cec: UI - minimized 7163ecb65: RigCAT dialog bc78904a2: KISS update 159ba1e74: KISS update 6440fa5e6: KISS 9faebb19c: Flarq Directory Structure 9d9d56b6e: Talker Socket 2009-10-14 Stelios Bounanos c574685a9: Update win32 resource files 1d2f5788a: Fix threads/exceptions bugs on mingw32 ecc297b0a: Revert "Hamlib Exception Handling" 2009-10-09 David Freese 526c22235: Macro bug fix 5733c106c: Macro bug d6fc376dc: Wrap Extract 536e251c8: Macro TUNE ab565fb1b: Feld Hell Mod 615dd3450: Text file out a5e17e8da: Logbook read bug e0f86c745: TX Control Code fix 05ff91e7a: NBEMS 8a97f6b21: Hamlib Exception Handling 7fb9639ef: RigCAT mods 2009-09-30 Stelios Bounanos e4e1af2f9: Fix silent rules 2009-09-23 David Freese fc18f874a: Browser Discovery 2009-09-22 Stelios Bounanos 5626e1c90: Add silent build rules 8ae5b2225: Do not use -rdynamic on win32 2009-09-22 David Freese a31852210: Code cleanup d373c26c5: Thor squelch mod 2009-09-17 Stelios Bounanos 0f96bc714: Fix llabs call 07bf0c45d: Only set stop_bits for serial port rigs 67ff72102: Fix format string 2009-09-16 David Freese 60ca5f033: rigCAT bug fix 4e19f0349: rigCAT mods f9423b45b: Serial i/o Stopbits 765c6d91b: Dom/Thor mod fbcd1603a: QRZ lookup d36b5ded2: ARQ / RSID mod 2009-09-08 Stephane Fillod a06482d5f: Some more work on french l10n 4287bd0b7: More i18n 2009-09-04 Stelios Bounanos 71f2531f4: Remove g++-3 support via boost ed74dfb4b: Update README 2009-09-02 David Freese 5e35ec064: Menu bar ui mods da2cc3bf6: RSID ui mod df650031b: RSID eot change 2009-09-01 Stelios Bounanos e39fc6a1c: Improve RSID notifications b09cea25f: Enable concurrent RSID decoding 4de96c9b3: Clean up RSID code a434afb97: Handle nested qrunner calls 854803512: Fix notifier TX text handling 78d87d744: Fix log/manual spotting b862f1ac4: Change transmit-lock marker width a3edac857: Add missing include 2009-08-31 David Freese 779bf2316: PSK post DCD signal 2009-08-20 Stelios Bounanos 3c2a7a646: Add config doc strings b7d5d6ee0: Add transmit-lock marker 2009-08-19 Chris Sylvain 652f43f9a: Add LOCK macro 2009-08-19 Stelios Bounanos 0a09039c6: Misc UI changes 2009-08-18 David Freese 9bda6ed2a: flarq mod 2009-08-18 Stelios Bounanos 29715401b: Fix benchmark mode output 788489b32: Fix notifier event checks c0d08efd1: Use bundled GNU regex on OS X cdf46da23: Fix PSK Browser RE search 2009-08-14 David Freese 65000dba3: arq_io seg fault bug fix 18b870269: Olivia 8/1000 standard mode 62608ea68: PKS mailserver mod bf164ebe9: rigMEM modification 3e6a5c48f: WRAP file extract f2b29cb16: RigCAT bug fix 5897cf790: Hamlib exit message eba91fff4: Secondary text TX but in DominoEX-FEC and Thor 2009-07-26 Stelios Bounanos e1daa1dba: Fix DnD file insert on OS X 5925ec30d: Fix sound file selector ce4c179fb: Correctly populate RigCAT menu on OS X 2009-07-26 Leigh L. Klotz, Jr 5f1658c87: Macro variable bug fix 2009-07-25 David Freese b72cfd505: MT63 mod 2009-07-25 Stelios Bounanos 4fff1160d: Add missing include d1c206b98: Restore MT-63 options dfab290dd: Initialise pthreads/win32 in flarq ecf1f101a: Restore two channel capture a8a734cb9: Fix millisleep function 2009-07-23 David Freese cf4c6710f: MT63 transmit bug fix =Version 3.12= 2009-07-13 Stelios Bounanos 3537f6278: Add RSID notifications 2a4cd6852: Improve frequency display kb entry 2009-07-11 David Freese 9c291a872: Enable XMLRPC QSY capability 2009-07-06 Stelios Bounanos deea0f674: Add ITU zone to countries list d54a2ca07: Fix compilation on glibc 2.10 2009-07-02 David Freese 9de9eb532: Xmlrpc mods 07a01b155: Logbook bug fix 2009-07-01 Stelios Bounanos 42b638df6: Fix socket fd leak 58c2f8b0f: Fix compilation error and warnings on 64bit archs c07ec21fc: Add generic notifier 88bedac61: Add dragging to table widget 757a8f8d0: Simplify RE classes cbf0d871a: Extend macro editor 53a2820a2: Improve dxcc, spot, pskrep performance 9648c3036: Remove handling for REs without backref support 1b474a236: Fix config input field labels d6d597477: Add Fl_Input2 mouse wheel handling bf4cea41e: Add automatic FText text_area resizing e803fcd82: Improve FText drag and drop ec26eb633: Add band to RX text tooltip 828383312: Add string join and split functions d70ea6925: Print build info in crash handler f25b5d1c7: Fix azimuth_long_path d11f6fe0e: Add frequency display text paste support 2009-06-30 David Freese 3bad2d4b7: xmlrpc mods 2009-06-12 Stelios Bounanos 419123c17: Fix text echo functions 2a83da3c8: Remove FText text colour adjustment 7a87b0bc5: Always set the FText cursor colour 2009-06-12 David Freese a8dfa58cb: Logbook bug fix 9b7786f76: RigCAT mods 2009-06-01 Stelios Bounanos 9f7b00255: Fix Contest Country Files callsign lookup 2009-06-01 David Freese b539c1cdf: ADIF_2.2.3 compliance 8fc582e48: Cut number mod for CW 2009-05-26 dave 7690a1c65: FLARQ 2009-05-26 Stelios Bounanos d4b1a038a: Merge flarq 91a1425e1: Move setup_nls function 9543fa7b1: Move make_pixmap function ada43f4a5: Add new FText classes bf6a2c318: Add thread id logging 8207c62c7: Prefer ALSA default devices d04b780d7: Fix initial window sizes 4f90ecf51: Fix format strings 2009-05-16 David Freese 6b6cad9bd: PSK search algorithm 2009-05-12 Stelios Bounanos b95b8e165: Add win32 installer support d626273fc: Fix VPATH builds 2009-05-05 David Freese b4112dedc: Added , macro tags 7ae826f67: RTTY pseudo output, corrected stop bit inversion 2009-05-02 Stelios Bounanos ae5b9ca57: Add more PNG text comments 974e1ec9e: Remove JPEG write support 44eceae21: Fix xmlrpc-c m4 macro 2009-05-02 David Freese b030b4b56: Fix OS dependent compile error abc11f7c0: Updated memory mapped rig contol 2009-04-26 Stelios Bounanos 31e19021a: Add missing includes 6b2260caf: Macro changes 8f3739919: Fix possible trx_startup deadlock edca45216: Fix Makefile DEBUG flag 2009-04-25 David Freese affae099b: CW default WPM (numeric keypad *) bug fix 2009-04-23 Stelios Bounanos f7309ef24: Make the combo box popup modal ed0ae5ce5: Fix OS X native file selector 88b3fd75b: Fix uHRouter and parport PTT 9c63531cd: Fix format string 2009-04-23 David Freese 89441983e: CW replay bug fc50717d5: CW Farnsworth timing addition 63ccc2f24: MinGW serial i/o, hamlib, rigcat mods 2009-04-18 Stelios Bounanos 206f8159d: Fix build without hamlib 2009-04-18 David Freese a9c21e513: Escape key bug fix d2674d54f: Macro parse error fix 2009-04-17 Stelios Bounanos 9e060b868: Update version output 77bc96640: Use band functions in logbook 21247913e: Add functions to set the socket buffer size 4b1292ca7: Improve logging and error notification d73c8fd31: Add OS X and MinGW stack tracing e192d1d4d: Add preliminary support for MinGW 01fd3d991: Change set_log macro 9d566564c: Clean up headers b4bf47ffe: Distribute cr.sh test script =Version 3.11= 8646ccb72: Fix rigMEM compilation on OS X 8fe2028d8: Fix uHRouter log message 2009-04-10 David Freese e94628c2b: Man page correction 2009-04-06 Stelios Bounanos c8981312b: Add documentation 88d067da4: Disable SysV IPC on OS X d039aab5f: Add missing include 2009-04-06 David Freese e4d3f6a71: updated i18n b1ff3f58a: Status prefs mod 5249bd9ef: FFT processing - prefilter recognition f8c06f4ba: Waterfall FFT fix fb2c4d9c1: RigCAT code cleanup 0437cc7de: Update i18n c261af319: Beginner Help bdf8ffbe3: XMLRPC mod 038868e7b: Logfile logic change aa40d40b8: RigCAT mod a04d47502: Hamlib mod 43d0e8df5: update i18n 3c7d0045c: Miscellaneous fixes c8d1e1eb6: update i18n a49228469: Beginners Help update cc73610e4: HamLib PTT bug fix 3993b5b7d: Hamlib DTR / RTS state efc4259d6: Logger32 default folder change a1c6d7541: Mods Logbook 0bb3f8fe2: Modification to logbook file processing 4dfb2c596: Mod - RSID propability of detection improvements 6c0d3777b: RSID decoder bug fix d77b8cc7b: Cosmetic change to adif_io.cxx code 2009-03-18 Stephane Fillod 53e631b86: Update i18n 292933672: Czech l10n by Josef Klimosz, OK2WO 2009-03-16 Stelios Bounanos 3a65fa108: Fix hex/bin string output 2009-03-14 David Freese 228a4bd67: Hamlib modification 35fe37b48: QSO logging date-time 867ee123e: Rig Control modifications 2009-03-12 Stelios Bounanos 1155b533f: Modify variable-width font warning 2009-03-12 David Freese 6b4a4f6d5: CQ decoder improvement 2009-03-11 Stelios Bounanos c054a5b66: Fix hamlib RTS/CTS callback 36952a12b: Add fldigi-shell pskrqsy command ee69ba371: Reduce PSK reporter re-spot interval 2009-03-10 David Freese fc4a43601: CW shape modification 6d92b4d73: Change to FreqControl behavior 2391e67e5: Bug fix - missing inpNotes 787c67cf1: CW / QSK 2009-03-08 Stelios Bounanos 6e513f5b2: Fix hamlib sideband check 2009-03-07 David Freese b93ac73e1: Fixed rounding errors in CW encoder symbollen timing 2009-03-07 Stelios Bounanos 09230eef8: Add reset config button f391c9358: Update config UI 95bd6bd4c: Add hamlib sideband override c879f550c: Add frequency list clear confirmation 2009-03-07 David Freese 2b54b0e29: CW / QSK modification b5dc666d8: Palette mod 6148d035e: Cosmetic change to config dialog 2009-02-25 Stelios Bounanos a2fc0c8db: Add better support for proportional fonts f6466f2ab: Fix font name/number compatibility code eb1ec8ac8: Fix printf format string 2009-02-25 David Freese afc4e0b89: Added right audio channel PTT signal 5417cf2b9: Restore pre 1/29 FTextView.cxx, Fl_Text_Display_mod .cxx, Fl_Text_Dislay_mod.H 529cd68b9: Cosmetic change to font_browser Exception handling fix for portaudio Thread shutdown bug fix for win32 Cosmetic change to colorsfonts dialog Change to FTextView family revert to character counting for proportional fonts 2009-02-19 Stelios Bounanos e1c4b0b0f: Set LC_CTYPE to C 9cc42368b: Add SINC_BEST_QUALITY warning e8309d017: Add optimisation flag e037b215e: Fix ptt deletion 2009-02-18 David Freese a0c9a45fa: Added new palette, fldigi.pal d2094f46b: Bug fix ... error in extracting font_number from font_name 2009-02-18 Stelios Bounanos 4b719fc0c: Close PTT when exiting e4e65fa8b: Add locator tooltip b9699d14f: Remove bad sample rate converters 6d173bcad: Improve font handling 1ac52d78f: Initialise hamlib's RTS +12 setting 2009-02-17 David Freese 77d0b4ece: Olivia pulse shape changes 4181ca882: Bug fix RTTY cpu usage 2009-02-15 Stelios Bounanos 56d7f0eac: Fix va_args calls b8d267ab8: OS X fixes 6ff0e6965: Fix fetch_http_gui timeout check 2009-02-14 David Freese 529956762: Added RTTY x-y scope extinguish on loss of signal Added PSK modes set_sigsearch(...) on modem change to any psk mode. c8d68a775: Added DSP filter width adjustment to RTTY 396a51e93: Bug fix for Feld FM modes 8a8317ef2: Added FEC_snr and FEC_freq_offset displays to status bar e5bdb1a1a: Cosmetic changes to mt63 source - increase white space for easier reading 5f224546d: Olivia decoder/encoder improvements removed all extraneous double/integer/double conversions added new signal/noise computation method 8c8f59cb9: Bug fix - PTT via rigCAT serial h/w RTS/DTR was inaccessible Bug fix - Xlog stream; suppress newlines in Notes field Added binary string format to display bit fields, ie: RTS / DTR state Changed 'Comments' to 'Notes' in all references re: logbook Comments ADIF field is single line character Notes ADIF field is multi-line character Converts all ADIF comment fields to Notes; backward compatibility bef4f92d2: Added sub-directores "wrap" and "talk" to the files directory Fixed missing quick-pick pop up menus edeb401ee: Fix hamlib RTTY/RTTYR sideband inversion 2009-02-04 Stelios Bounanos 718522277: Add LoTW and eQSL hints to dxcc popup f134124dd: Add benchmark and batch decoding switches 3ab8df2b6: Fix uhrouter support 362d88bed: Fix cygwin gcc-4 compilation cb4b2f8f2: Fix local strcasestr 0b7d62d1b: Fix new version check 4ee758d90: Add PSK reporter activity text field d6a88f429: Add new quick_choice popups 3e19c4d90: Add fetch_http_gui ee82e29d1: Update guide b50f92a83: Update platform ifdefs 798834d41: Fix open URL function 0913a74ae: Fix compilation error with --without-hamlib 2009-02-03 David Freese cc880d993: Bug fix to wf_audioscale waterfall scale changes 23d8c7bd6: Added Rx text output to temporary text file. Intended use: text to speech conversion for blind operators 069099fcf: Deleted all references to afcIND 995d4715a: Changed waterfall event behavior for disabling operation b89635e38: Fixed PSKnnn ADIF naming convention to comply with adif 2.0 spec 31c05ea41: Added logbook save to file after every change to the logbook 4f307c791: Added Cabrillo field defaults per Contest selection e28d1d834: Modified Cabrillo report line QSO: format 184ce5ae5: Bug fix, Cabrillo report generator ca5bb8cd5: Modified contest exchange fill-in; appends if field partially filled Reversed #Out and #In fields for contest log af6b8dc52: Added Cabrillo report writer for logbook / contest use Removed free form Exchange fields #2 and #3 Renamed Exchange field #1 to Exchange Out Added Exchange In field to the logbook 39721ce55: Added rx stream file extraction Extracts all text between and including [WRAP:beg]...[WRAP:end] 01b916c1b: Add stop macro timer to all waterfall events 40dc19889: Corrected adif strings for modes BPSK31...QPSK250 c6f5d658b: Bug fix to correct rig xml 3586c220d: Fix version comparison bb44e467a: Fix memory leaks 2009-01-09 David Freese 993e74ead: Update i18n 689d679b5: KDE refocus to QSO logging widgets Moving between desktops on KDE caused all QSO log widgets to be refocused. Caused QSO log to appear as changed when no change had occured. 2009-01-09 Stelios Bounanos b48fbdc35: Cosmetic UI changes 51d015f3d: Remove extraneous includes f4c006331: Fix PSK reporter RE matching f71661c29: Revert "Changes to spotting regex parsing" 2009-01-08 David Freese 615ff4a09: Update to i18n fbca00494: Changes to spotting regex parsing Windows does not recognize '\2' reference tag in regular expression defined in pskrep.cxx. Changed to combination of regexec and string find processing for required result. Added modem frequency to spotting call when logging or forcing a spot report. 495ac85df: ADIF import Relaxed the test for accepting adi/adif file as valid ADIF too many other logbook programs not in compliance. Minimal test is for file to contain at least one adif field as " 821407927: Add log sources afb8d9e1a: Add parallel port PTT 2009-01-03 David Freese c826c1a8d: Update i18n 9b18d81f0: Clean up preparation for release 3.1 Added "Echo" configuration item for rigCAT removed ... parsing of rig.xml files Suppressed clearing Country, Loc and Azimuth fields by a call sign database query when the db does not support those fields Added missing tooltips to all configuration items da55bec4a: Update i18n d13421419: Added missing fields to log.adi export (Windows only) Corrected logic associated with duplicate checking. 7e4c4b7d9: Update i18n e32279969: Various bug fixes Restore fldigi.adif Windows logger file Fix missing in util.h Fix missing Country field fill-in in lookupcall Fix logic errors in keyboard / auto entry of callsign in qso log field 444633db3: Update i18n a193ebab5: MT63 receiver buffer flush Added rx_flush to MT63 modem class. Allows immediate transition from Rx to Tx after remote station ceases transmission. No loss in Rx characters 2009-01-01 Stelios Bounanos 3833fd815: Add microHam keyer PTT support via uH Router 62627ec45: Fix restore_signals 83736b570: Add hex print functions 56927d00f: Fix compiler warnings 39decae4a: Simplify FText dxcc lookup ef055bf23: Fix OS X compilation b7926ba9e: Fix directory creation f3a8e554b: Update FTextView context menu 238997956: Simplify cb_call 6a061c828: Update build system 2009-01-01 David Freese 435b93731: Remove logbook font number/size specifiers Allows system font specificatin via command line switch 6e5b077ac: Restore MT63 cursor Force MT63 wf cursor to fixed tracking points; 750, 1000, 1500 for MT63-500/1000/2000 respectively 122653e42: Remove AFC indicator Commented all lines in fl_digi.cxx relevant to AFCindicator This is a control that is useful during modem decoder development but no for the casual user 68fd70298: Olivia bug fix Changed bandwidth, preamble, postamble tones to be consistent with other popular Olivia implementations, ie: MultiPsk ec652059c: Update i18n 3daf3d9a1: Changed show callsign behavior Popup now shows the Name, Last QSO date, Azimuth & Distance based on logbook record if the station was previously worked Otherwise the cty.dat file is used if present. fccba5c6d: Bug fix IOTA not clearing Added clear IOTA field when QSO log saved to logbook Added comments to locator.c 2008-12-29 Dave Freese 568f5c555: Fix qrb function 2008-12-27 David Freese e50a5ae25: Update i18n fba9fb283: Macro tag modification Changed nn AND nn to and respectively 4468f1026: Increased average Olivia power Balanced tone power between pre/post amble tones and the mfsk tones 8e4029646: update i18n fa90e92a4: Delete last log entry bug fix 60e909bd3: Update i18n 1ec4341da: Add missing qso fields to adif export TX_PWR, COUNTRY missing from export Simplified the export function eb09b3f04: Update i18n b12640993: Restored log IPC output to xlog etal. Added additional fields now supported by internal fldigi logbook Added configuration item for Tx Power a8b704313: update i18n 4b5b4f67d: Rx text quick pick menu change Moved Call from quick pick to normal menu listing 46d15d070: Additional fix for TimeOn logic 36c3ab337: update i18n edda7b09e: New logbook fields added TX_PWR, DXCC and IOTA to logbook renamed Notes to Comment to be consistent between main dialog and logbook dialog 79f61b505: Update Rx/Tx popup menus Changed logic for restoring Rx/Tx menu status to status.cxx e187ecc1b: update i18n 179e8de57: Bug fix - TimeOn TimeOn was being reset every time fl_digi received focus Fixed in fl_digi.cxx 6595e7f14: Fix compile warning in confdialog.cxx 9c0a78bc3: update i18n bd1cf1c1a: Additional state variables Save & restore state of: ReceiveText quick entry, ReceiveText word wrap and TransmitText word wrap b5933cd5f: Bug fixes - 3.04BM Fixed --config-dir failure on MS Changed qso clear to only clear the search field on logbook dialog 12011e61e: Update i18n 53910187a: Organize HomeDir contents Create HomeDir Create HomeDir/rigs Create HomeDir/scripts Create HomeDir/palettes Create HomeDir/logs Create HomeDir/images Create HomeDir/help Create HomeDir/macros Create HomeDir/temp and populate with default files. 63c9f9495: Fix qso clear button bug Clear would only work with NagMe set. Corrected logic a821c17f4: Merge commit 'berlios/pu/sb' 0d8f8bf3a: Logbook text i/o bug fixes Changed all logbook text out to use CRLF convention in MS Fixed "-30" bug in text output for comment field 2008-12-22 Stelios Bounanos b1054cbe8: More focus fixes 0b1daf6f9: Fix logbook update fd277d664: Fix PSK browser crash 2008-12-21 David Freese b93112405: Clear logbook fields with clear qso fields Clear both qso fields & logbook fields when the clear button is pressed. eeb334c04: Display Macro-Loaded message Modified the Load Macro message behavior to display whenever a Macro file is loaded or a new one created - dependent on the state of the associated configuration item 75096a904: QSO log focus fixes Fixed Enter refocus inhibit for Loc field Fixed refocus inhibit under certain conditions for Call field 554d5e1ec: Logbook browser focus Restore focus to the logbook dialog browser whenever a button control on that dialog is pressed. 37022f7d3: Save modified Macros Added test to save modified macros before opening a new file 75b3a5afe: RTTY bug fix Fixed improper echo of Unshift-On-Space characters 3cb070943: Correct logbook-table-widget focus 2afd96a2b: Fix restore focus from log fields Create configuration item for upper case call field 2008-12-18 Stelios Bounanos 8353e8d43: Update i18n 1909b7558: Miscellaneous UI changes f524c3fc6: Change FText menu handling a9459df7b: Remove contest menu 433a3c562: Fix PSK viewer crash 708ac48c3: Fix logbook update 54aad83fa: Fix ADIF format check a0efbd227: Fix waterfall cursor and marker 97339202c: Add FLDIGI_BROWSER check e767b68a8: Fix logbook selection colour 8e1ef5a7f: Fix QRZ lookup type enum fc55afb7e: Auto-update log fields 5a57c5f81: Fix callsign info tooltip 17530a428: Add locator functions 2d7b21e8a: Add missing va_end 99aa2cc84: Update po files 7f77ba6e1: Add FText country information tooltip f7fee0bfb: Add preliminary contest country file support eef48e7b6: Add Fl_Input2 up/downcase key bindings e7a6812fd: Fix mode status button 7e368b2c6: Change Olivia status fields f498b19f7: Fix log timer 2008-12-10 David Freese 98e63fc54: Modifed search routines for psk viewer 2712de8ba: QRZ callback modification 9728d0d86: Add fixed field text report generator for logbook b51ef6c3f: Add .,;| to white space characters for word capture in Rx pane 5d305c971: Macro tag changes 5af4ad7e0: Logbook field transfer bd3a8a292: Logbook file open/close changes c2764f021: Changed logbook text export to tab delimited format 924b2b76e: Added time_on field to the logbook 88e0ad0c2: Split state/county into state country fields 6cffd9a97: Replaced Olivia Freq: nn.n with Tones/Bw in status2 widget d3cbe49e6: Changed fldigi.log to fldigiYYYYMMDD.log, always append 6a3908ecd: Added macro tag - clar Rx pane b92ea214b: Added dup field, time-span in minutes to duplicate QSO testing 154952f14: Add rudimentary contest functionality 163acfea1: Use global confirm-save option for logbook 59984e766: Use filename in logbook window title 83b453f41: Invert logbook search 7c0e2831a: Add logbook status preferences 2008-12-04 Stelios Bounanos c609e29b9: Add FText double-click option 2008-11-29 David Freese 585493163: Add tab color configuration item 2008-11-29 Stelios Bounanos 08776759c: UI update 2008-11-29 David Freese 9333ae1f5: Fix waterfall buttons 4b53a7c84: Fix QRZ lookup 2008-11-26 Stelios Bounanos 80f43f679: Delete carriage returns 2008-11-26 David Freese aef541e3e: Add fl_logbook 2008-11-26 Stelios Bounanos 2b79053f9: Update fldigi-shell 3d6f7bbf8: Add Fl_Input2 5077ca624: Hamlic changes 0aa3c19d9: Improve make_pixmap 6013b1533: XML-RPC update c3814bc1a: Add NLS support cc3677694: Merge with upstream 1f6e9c670: Upstream version 3.04BE dea0ee902: Upstream version 3.04BD 690daadf5: Add spotting c8a6ae11e: Add UDP socket support 984bf8b65: Add simpler RE class 91cf6d14c: Merge with upstream edc3049ef: Upstream version 3.04BC 8960485c2: Upstream version 3.04BB 2b19fba6e: Upstream version 3.04BA 315a3aff2: Upstream version 3.04AZ fca79b415: Upstream version 3.04AY 047e8bb9f: Improve hamlib support d32a86e8b: RE class changes 3eeb6391c: Fl_ComboBox changes 15e7c2ff3: Toggle menu icons at runtime 37b38e176: Fix MFSK image menu item 5639f4b97: Fix FTextView text lookup 71b9b489c: Clean up callsign search code 7013c6258: Frequency list fixes 73e082bd3: Add icons option 64cbeebe7: Merge with upstream 6b1c29756: Upstream version 3.04AX 9a0fadc49: Fix wfall/rxtext links 704cfd62b: Fix IZDT time format c452607e5: Restore wfall wheel/qsy step 853658791: Add QSO data mouse binding 5eda8b607: Add RX text and waterfall links a0af30f20: Add more icons 685f7dfa9: Fix combo browser label 47a624967: Merge with upstream d8211853c: Upstream version 3.04AW 1ed76f0cc: Upstream version 3.04AV 2114401ab: Upstream version 3.04AU 9461dc670: Upstream version 3.04AT dfa8465b9: Upstream version 3.04AS a5062ae24: Upstream version 3.04AR 40555942a: Upstream version 3.04AQ f22ce6538: Upstream version 3.04AP 9a161f100: Upstream version 3.04AO 096e1eb1b: Upstream version 3.04AN 21f16cb4a: Improve config performance fa4ff95e6: Fix window resizing on OS X 2d9f7bb05: Fix a memory leak 3bc4b6e1a: Merge with upstream 4709ddb4c: Upstream version 3.04AM ce8c6385f: Simplify xml config 7d2ea0d44: Merge with upstream 09b75d7ae: Upstream version 3.04AL e8ecf2a0c: Update ChangeLog 0c5b18ca7: Add log format check Fix some LOG calls that were passing the wrong type/number of args dd121fcba: Rewrite xml config 00af73035: Add scope dock option c41749c83: Handle deprecated args better Also remove unused --experimental switch 731c7a537: Fix signal handling * Add generic functions to save and restore the disposition of all signals, and use these to remove the handlers installed by xmlrpc's abyss server. e9ddc8f2a: Add licence notices (thanks to Stephance F8CFE for the reminder) Tweak About dialog html 62b901f7b: Rewrite change_modem_param Add new config menu for waterfall mouse-1 handling 09fde4d7a: Add default qsy arg b4a7e3216: Add mode group ids 61f04d6ef: Merge with upstream 53e71e80a: Upstream version 3.04AK 87aa9d5da: Upstream version 3.04AJ 685298dc4: Add fldigi-shell time command f0195d40a: Unclutter title bar cd5a338ac: Reduce min window height ec83b170d: Add thread checks 1c9f450f6: Fix log clear Ask confirmation when trying to exit without saving the log 629014d98: Fix wfall cursor freq dae8995bc: Change winapi precedence 5e3df23e2: Add update check aa7d7bf5f: Fix XML-RPC error handling 5553466ab: Add HTTP URL fetching 0bc58ae3c: Fix re_t substring matching Delete extra copy of adjust_port() Remove includes from serial.h 9e71ac0b3: Merge with upstream b4460881a: Upstream version 3.04AI 8421e4943: Upstream version 3.04AH 00fab81d8: Upstream version 3.04AG 70e44b57e: Upstream version 3.04AF 69f4c90b6: Upstream version 3.04AE fbbcae1b4: Upstream version 3.04AD 448b34b24: Add wfall mouse options d4af3d6c2: Add qsy function 2d6799419: Add rig control freq entry 322af76d6: Merge with upstream af5d499fe: Upstream version 3.04AC e759dc7ab: Qrunner updates Read from pipe/socket before executing queued callbacks; improves performance and avoids some recursive dequeueing with REQ_FLUSH Change REQ_FLUSH to take a thread argument Flush the trx thread in init_modem_sync e944abb6b: Remove fl_thread wrappers 667f67248: Add thread signal handling Send SIGUSR2 to interrupt xmlrpc and arq_socket threads Restore the default signal disposition for various signals handled by xmlrpc-c's abyss server 3c560ae5a: Add simple XML-RPC access control Also add --xmlrpc-list switch 84b105230: Simplify XML-RPC error handling 5332a87ed: XML-RPC fixes Use REQ in Main_set_sb and Log_set_call e23803ae1: Merge with upstream 5476c0e6a: Upstream version 3.04AB 9cfa07997: Upstream version 3.04AA eda3c5298: Upstream version 3.03 03be0d1bb: Upstream version 3.03AP 94606ed69: Upstream version 3.03AO 69c8fad53: Revert "Use fl_open_uri" a428fc4d5: Sound fixes 8496ca758: Merge with upstream 2b352bc8f: Upstream version 3.03AN 78c6ec92f: Use arg in src speed test baeac6a35: XML-RPC fixes d71a69d88: Fix FLTK m4 macro 64de50dc5: Merge with upstream 28abb21cf: Upstream version 3.03AM 4975a5d6e: Upstream version 3.03AL b2401dc0d: Fix SoundPort log message 1044be3ab: Leave room for OS X resize handle 2008-09-08 Leigh L. Klotz, Jr d4c7b8798: Add history replay option 2008-09-07 Stelios Bounanos 4d3d1892f: Improve serial port discovery a46526a0e: Merge with upstream aff666dd7: Upstream version 3.03AK 91eac1e15: Upstream version 3.03AJ f395464c3: Add default event handler 82296f10b: Disable mouse cursor hiding f3d895ef6: Increase default window width d70089bc0: Use fl_open_uri bcbd70128: Update build system Rename OS X app bundle directories Use correct ld switch to link hamlib statically on Linux 1d42855a2: Use REQ in start_tx 4b41ce093: Merge with upstream eab55d521: Upstream version 3.03AI 3cdd28273: Upstream version 3.03AH 3e3c2d135: Don't leak fds 0508eb7ba: Use regex class in PSK viewer c862e8220: Update regex class 4c1620c8c: Save MT63 settings 70faa1246: Minor sound fixes Fix "device not found" message On Linux, a PortAudio device has zero channels if it's busy; omit that check for other platforms. efe814026: Merge with upstream db64583e9: Upstream version 3.03AG 67bec3df8: Upstream version 3.03AF ba3a9eadf: Fix FTextLog menu handler 581aad22a: Display mixer slider values b653a7b4e: Redo colours/fonts dialog Add colorsfonts.fl Change font browser to use colour chooser Correctly set text attributes to handle dark backgrounds 05fecac6a: Merge with upstream fba29c03c: Upstream version 3.03AE 6af1a4b50: Upstream version 3.03AD f72c72789: Fix MFSK TXspp assignment 0427298fe: Set tooltip font 6561c6e31: Update build scripts dd548b244: Socket fixes 035df1ea6: Sound fixes 97535c2d6: Event log changes 8e7d12313: Merge with upstream cf0942386: Upstream version 3.03AC ab26ef2d5: Upstream version 3.03AB 0e26dc97d: Upstream version 3.03AA cb7f27e0d: Use event logging 5a8db7fe5: Add event logging 079be642f: Fix FLTK detection 9ef33900e: Merge with upstream a0418bc62: Upstream version 3.02 8137b8bb0: Upstream version 3.02AC 61bfa8140: Upstream version 3.02AB a7f4c6131: Fix OS X help menu Also set font used by fl_message e0e49d0ef: Convert serial port names on win32 49c28760c: Add simple regex class 8edc6a5cc: Update build scripts Add a script and Makefile target to relink fldigi with a static hamlib c7255803e: Merge with upstream 594e70d47: Upstream version 3.02AA 05dc2476d: XMLRPC updates Add an rpc method to call macros Add the fldigi-shell Perl client c6c32aaa2: Replace some sem calls e4a45bae3: Merge with upstream 2c52ee864: Upstream version 3.01 b615c8a64: OS X compatibility Use 127.0.0.1 instead of localhost Define AI_NUMERICSERV to 0 if undefined Do not use the non-POSIX MSG_NOSIGNAL send flag 20689b8fc: Merge with upstream 3f7b2d6c5: Upstream version 3.0 95d5786ac: FText updates a5a71ae46: ARQ fixes 985ce14bb: Fix image library detection 1b38e5354: Merge with upstream 9b6c05b6a: Upstream version 3.0rc2 57853724a: Upstream version 3.0rc1 becd3f772: Add arq/tcp cmdline switches 9b3f7fa23: Merge with upstream 00b140e12: Upstream version 3.0preAD 316e53697: Repo maintenance 238b61b39: Repo maintenance bb1c1707e: Upstream version 3.0preAC 3238fc421: Socket fixes c9cbbf556: Switch to Socket 1c69e5196: Add new socket class a89024284: Add fake sem_timedwait Also, use named semaphores on OS X 9444527fb: Add fake clock_gettime 49097a590: Add new search_libs m4 macro d8ac50778: OS X build fixes 16132045e: Merge with upstream 940642e7b: Upstream version 3.0preAB 1813c0074: Upstream version 3.0preAA 785c504ee: Plug memory leaks 487ad6619: Merge with upstream e08fd3031: Upstream version 3.0preZ 325bdde26: Upstream version 3.0preY 45294abde: Upstream version 3.0preX e3fe8af6d: Improve clock_gettime detection Also use the monotonic clock, if available, in the samplerate speed test function. 6e7ea86d9: Merge with upstream 29d5fe68e: Upstream version 3.0preW ba91adf7d: Upstream version 3.0preV 9e7aa563b: Fix FText kb focus d92e346e8: MFSK fixes e30e06c79: Merge with upstream b15f821ab: Upstream version 3.0preU 7675123a8: Add image drag/drop support Also fix a couple of memory allocation bugs 64a30ca88: Merge with upstream 697650aba: Upstream version 3.0preT 467a05720: FText drag/drop 350a099cc: Update RSID f8fcfa6f1: Fix xmlrpc logging 5c2d8f4a6: Deactivate AFC/Rev buttons 58fcf3b2f: Modem cleanups 93bd60595: Merge with upstream 9da69cb0b: Upstream version 3.0preS 9f8298afa: Upstream version 3.0preR 7205cac93: Upstream version 3.0preQ a577acc3a: Upstream version 3.0preP 818465181: Update help 200444697: Fix sample rate menu update 7468baa67: Fix Store button 7a21d600a: Convert trx REQ_SYNC calls d7a25cb19: Delete old textview code 4c5839dfb: Add some missing changes 466529dca: Merge with upstream ea4bb7db2: Upstream version 3.0preO 38e9249fa: Upstream version 3.0preN cd32c9d42: Fix kf_cut/copy/paste calls de1a0a14c: Merge with upstream fb1d570e7: Upstream version 3.0preM d7a6eb5d4: Upstream version 3.0preL 04f81ee50: Add Show Config menu item 70f558cd6: Cosmetic GUI changes 47cbab320: No PSK snr/imd clearing 1ec31cb3f: XML-RPC updates for RSID 730c8e242: RSID fixes f613c0406: Fix tune audio glitch c8fe0037c: Change AFC/SQL toggle buttons 2676fdb6c: Add speed test 194a18e03: Merge with upstream 09a5ed91d: Upstream version 3.0preK 1beac0a36: Upstream version 3.0preJ 84e495e99: Update INSTALL d77816192: Cache waterfall cursor type 40b91286d: Disable FLAC on win32 96cb8469e: Fix distcheck dbf6efce5: Merge with upstream dd8dd9e23: Upstream version 3.0preI 38c152ab1: Upstream version 3.0preH 78ed492b8: Use one channel capture 4591980c3: Update configure summary 9c06cc28f: Sound config updates 610016b84: Merge with upstream a684c4161: Upstream version 3.0preG d6976e377: Hamlib fixes 0f9fe520f: Add waterfall PAUSE speed ed2224f9e: Add waterfall scope lines 78e443450: Merge with upstream 56542508d: Upstream version 3.0preF 3a76af9f6: Upstream version 3.0preE 8fdb1e2d8: Upstream version 3.0preD b9a4d5e45: Warn about invalid REs Colour the Find field text red if the pattern is not a valid regular expression 6f36cdcfa: Merge with upstream 21d352f18: Upstream version 3.0preC 4cc73f064: Upstream version 3.0preB 6a79318f1: Upstream version 3.0preA 69039e405: Fix Ftext ASCII char insertion 0fc80b3a7: Html help corrections 7bea959b6: Use conditional for xmlrpc args 5bf2a9346: Merge with upstream f379ad5ea: Upstream version 3.0pre1 1c7bb9bd2: Misc. speedups c7cd457d6: Simplify qrunner 7237b8941: Merge with upstream 92ebc3e93: Upstream version 2.11AU f1c4906ab: Add status dimming 838fd3fd2: Safely resize audio buffers Add a pause state for the stream_process, and also rewrite its state handling code 4baeaffe6: Correctly handle audio timeouts The samplerate API specifies that the read callback must return 0 to indicate that there are no more frames, but it seems that the frames pointer must also be set to NULL. f8fcb0e8d: Delete redundant sound_update calls 021237f11: Default to PortAudio b33829fcf: Simplify the status timeout callbacks 306ad4430: Fix generation of html audio info 5208be634: Fix mode status cycle order Move THOR mode_info definition below RTTY in order to be consistent with the Op Mode menu. Comment out TSOR enum to restore correct cycle order in both directions. 3f3e3a0f1: Arg handling fixes Correctly check for the option argument being part of the option name. Gracefully shut down when --exit-after is given. Remove string_wrap, which is no longer required. 7dd4259b1: Merge with upstream 04962dd6f: Upstream version 2.11AT 7f835d1c1: Upstream version 2.11AS 411e1c831: Upstream version 2.11AR 416670d0a: Fix sample rate probing It seems that PortAudio/ALSA streams may misbehave when Pa_IsFormatSupported is called for a device that has already been opened for I/O. Probe for supported sample rates in both directions for each device and cache the results. ca7f9c3e4: Merge with upstream e1bdfc510: Upstream version 2.11AQ 7e4a7f50a: Upstream version 2.11AP fc13288c9: Upstream version 2.11AO 3fc69d9c4: Upstream version 2.11AN 1887bd8df: Upstream version 2.11AM 08bb92705: Upstream version 2.11AL 582f275a6: Delete unused modem instances a7010f88b: Merge with upstream 2dedd020e: Revert changeset 3e3e5628512e cab9ff86a: Upstream version 2.11AK eb5bd6f51: Upstream version 2.11AJ a3a1775cd: Fix a cxx error and warning cdb43fa08: Make PortAudio the default backend ee5471d30: Use conditionals for audio backends 699c2dcd7: Default to medium src converter e5a719313: Improve audio device info Show supported sample rates in Audio device info help text Only show supported rates in sample rate menus 6203c6f47: Add audio info help ea2597855: Fix mfsk error w/o jpeg support 852f585a3: More XML-RPC fixes 2b9d7388c: Update XML-RPC Check for bind errors and don't try to start the server if the address is already in use. Call REQ directly inside methods to avoid two REQ calls. Add a modem.get_names method. f43b23c18: Update m4 macros Simplify pkg-config.m4 and make sure that pkg-config can be overridden by setting CFLAGS & LIBS variables. Likewise for xmlrpc.m4. Also add static switches around xmlrpc linker flags when --enable-static has been specified. ba1dcae09: Merge with upstream 713f7e18e: Upstream version 2.11AI 3de19b668: Undo Thor damage 1232776ed: Merge with upstream 6b81b3747: Upstream version 2.11AH e3ab3bdcc: Add xml-rpc support 63bc32a02: Update README 7ecc8de08: Save rigctl window size e48851b61: FText CR/LF fixes Add CRs to saved files on win32. Use a more efficient way of stripping CRs when loading a file. 29b714732: Update file selector Allocate File Chooser object on the heap to get the right font size. Use a new thread on win32 to avoid blocking FLTK. 2eaf50447: Retouch confirmation dialogs 58a1021c1: Remember phasescope mode a96e72abc: Merge with upstream ff356e0b1: Upstream version 2.11AG bbcea9db3: Upstream version 2.11AF ed054eb00: Upstream version 2.11AE 6aa0e8a3b: Upstream version 2.11AD 7a0668b78: Fix pkg-config m4 macro a3f783739: Merge with upstream 66da44c68: Upstream version 2.11AC ffc692c17: Upstream version 2.11AB 625e8b088: Fix crash with missing mixer device b20213516: MFSK fixes Initialise stopflag. Clear txpic widget before loading a new picture. 850524f35: Fix DominoEX/DEX warnings Also use std::map for MuPskSec2Pri lookup 9fa082363: Merge with upstream 7c2464d22: Upstream version 2.11AA 6958a8897: Update fileselector Remember, and default to, directory of previous open/saveas call. 8f0239b99: Use fileselect filter values 709afd28f: Use the src callback API 632e1f455: Update PulseAudio code 713c49366: Use PortAudio extensions f9e1da57d: Stacktrace updates Don't print the stack and version information twice when a signal is caught. Cosmetic changes to the output text. c013c16d5: Use Fl_Preferences for the status 4828cbc80: Merge tags 34adb843b: Add tags f75b4126f: Merge with upstream 8954ca2db: Upstream version 2.11Z 621e0501b: Upstream version 2.11Y d15cb1ba0: Upstream version 2.11X 6e4a8bea5: Upstream version 2.11W 717adb328: Upstream version 2.11V 6f2d342a6: End all threads before exiting ed339d938: Use unnamed semaphores Also check for zoh/linear converters by enum name 92fa4ad9e: Merge with upstream fb87343eb: Upstream version 2.11U 967748da7: Upstream version 2.11T e8ccd4cdf: Merge with upstream 92268e341: Upstream version 2.11S d970311e2: Merge with upstream fffcb8256: Upstream version 2.11R 1ffd2406a: Upstream version 2.11Q c4a07cae1: Upstream version 2.11P 754dd4b4f: Fix image flags 23d04eaba: Merge with upstream 388a805c6: Upstream version 2.11O 057ce3e89: Sound callback d27136da0: MFSK and images changes 7fc3d5d1c: Close handler changes 8a61ea744: Add resampler options 34b82fad6: Adjust cmdline args 9b82166b3: GUI fixes e6a86f84d: Merge with upstream 22aef1b34: Upstream version 2.11N d5b8fecd6: Upstream version 2.11M 226e560cb: Add PNG save support c85ee8da3: GUI updates 6f289ee57: Merge with upstream ded087d8f: Upstream version 2.11L fd25a6220: Redirect streams on win32 f1e86c8a6: Fix online help on win32 56e2643be: Add optimisation switches c0bd551cb: Merge with upstream 2f3f30ad0: Upstream version 2.11J 03f25698a: Upstream version 2.11I a3cc8f8e9: Upstream version 2.11H 35e95f330: Merge with upstream 21dab8322: Upstream version 2.11G e927d0dbe: Merge with upstream fd4a64465: Upstream version 2.11F 0ffc020cc: Sound file i/o fixes 00add7273: trx/sound fixes 8764fa62c: Add check for jpeg header Also update the INSTALL file ceb418cb1: New file chooser 19514d354: Merge updates 674a4c41e: Merge with upstream 067cda025: Upstream version 2.11E 3085c2601: Close PA/MME devices after TX 8449e4f44: New sound_init 897e3faa4: Add cygwin support 43f3252ea: Merge with upstream ecb383b79: Upstream version 2.11D b58de4ff8: Update EXEC macro Delete the trailing new line of the external program's output Add the scripts dir to the front of PATH 7cd2cddfa: Add macro bar mwheel handling 23a8a17cc: Merge with upstream 3c662b8d2: Upstream version 2.11C ccaf1c489: Delete fast text widgets a0e78c03c: Delete libsamplerate 48ec6e181: Fix sound_init crash This would happen with an empty progdefaults.OSSdevice (e.g. new install) on a system without OSS devices. 2088a09a3: Fix MODEM macro hang in tx Also remove unnecessary REQ_FLUSH in btnMem_cb() ab887adcb: Add EXEC macro 2865170a3: Merge with upstream d725f0941: Upstream version 2.11B 090c39fd7: Upstream version 2.11A cf7ed309b: Correctly calculate src_ratio 267e0ccaf: Merge with upstream 6d97a4e93: Upstream version 2.10 5bf735c18: Sound fixes Call Close() before returning from trx receive exception handler Use same code to calculate receive src_ratio in resample() and src_data_reset() 998814396: Merge with upstream 122cac96e: Upstream version 2.10Z 78fc91593: Upstream version 2.10Y fbf2bf4dd: Add shortcut to cancel xmit 3b1e08453: MODEM macro fix Add REQ_FLUSH call to make sure that waterfall::opmode has been run before returning from init_modem_sync. dc33a16e6: Use region in rx menu dbc40df69: Merge with upstream cdb15b024: Merge with upstream 768e50958: Upstream version 2.10X 6a33924ac: Merge with upstream 202f5e275: Upstream version 2.10W bca62e671: Upstream version 2.10V a8806092c: Fix MODEM macro 9a5ba8cfe: Use correct squelch var d2855a20c: Merge with upstream 86956a231: Upstream version 2.10U 08792eb5b: Wfall/viewer freq paste 659331f9e: RMB audio history playback Also prevent playback when dragging, and restore kb focus to the transmit text widget f1da5bbca: Adjust FText styles f7bc45e5b: Correct Olivia defaults 080d1bebd: Enable extended chars 403025325: Sound init error checking Also restore Close() calls for OSS 0bd57961c: Hide mixer frame correctly eead0fc9d: Viewer freq paste shortcuts e03925125: Merge with upstream ec3aa3820: Upstream version 2.10T 68936c6e8: repo maintenance 82fd85744: Merge with upstream c2dab0af3: Upstream version 2.10S ae0441596: Merge with upstream 92d6b342f: Upstream version 2.10R 42ca1787e: TX font config 3c4499f1b: Alt. macro button 366a2e26a: repo maintenance 2463e328a: Merge with upstream 91c260f91: Upstream version 2.10Q 6f162db3f: Merge with upstream cdcdc6c32: Upstream version 2.10P 45138e988: Add missing config.h include Also add a missing xclass call and test script 0d2312d5a: Fix arg parsing bc04b0766: Merge with upstream 63c4ec355: Upstream version 2.10o 7d8684b34: Merge with upstream 2b68f1100: Upstream version 2.10N cce24a106: Stream init fixes 18007fe2e: Add OS X app bundling support Also add support for building OS X universal binaries, define version macros and variables, and update the INSTALL file. f4f7fd0ec: Merge with upstream b4bd00695: Upstream version 2.10M 9cb988133: Merge with upstream b295c0f87: Upstream version 2.10L 8bd46f1e9: Merge with upstream 28718230c: Upstream version 2.10K e5476cb2b: Separate in/out snd dev support Also add a SoundNull backend and rework sound configuration c6d01b554: Callsign query clean-ups 018d0a788: Merge with upstream ac64df569: Upstream version 2.10J d3f234b2c: Merge with upstream f30ffbf5a: Upstream version 2.10I a867b0f66: Merge with upstream 8261f9808: Upstream version 2.10H f80acc92c: Merge with upstream 4177365bd: Upstream version 2.10G d66621498: Sound interface changes 981bedf53: Correctly calculate ncount 13d3c248b: Merge with upstream 6aac6bc05: Upstream version 2.10F 3dce149bb: Refactor configure.ac 6bea09319: Add PulseAudio support 501fa5eeb: Add REQ_DROP bc4ff951a: Use default audio dev Also remove the deprecated --sample-rate switch 8a755f9d4: Merge with upstream 2e12ab418: Upstream version 2.10E 352a2cb67: Merge with upstream a458af58a: Upstream version 2.10D 923a0b02f: Add macro to change modem Also rearrange the macro list in the editor into groups and add separator lines. d5934f0be: Merge with upstream 7e3d8b2f2: Merge with upstream 66bbde241: Upstream version 2.10C ccd970fe7: Upstream version 2.10B d91b5915c: Add check for -rdynamic support Also add calls for the build, target, host macros. 38eb18def: Correctly calculate number of samples ea3260118: Resolve name clashes on OSX (2) Rename sound classes to avoid a conflict with an enum named cSound and defined in a system header on OSX: cSound -> SoundBase, cSoundOSS -> SoundOSS, cSoundPA -> SoundPort cMixer -> MixerBase, cMixerOSS -> MixerOSS Also enable MixerBase ctor & virtual dtor, and delete some old comments in the SoundPort declaration. f8a2c08ad: Resolve name clashes on OSX (1) de237390c: Rename Config files Config.{fl,h,cxx} -> confdialog{fl,h,cxx}. This ensures that there will be no ambiguity between Config.h and the autogenerated config.h on case-insensitive but case-preserving filesystems. 7b5254de7: Add fluid target 2fc36599e: Disable pixmap icon on OSX fc9477a0f: Make OSS optional Split cMixer into base class and OSS implementation. Add configure.ac macros to detect OSS and disable cMixerOSS and cSoundOSS. Hide volume sliders if OSS is disabled, or if we are not managing the mixer. cffd639e0: Use HAVE_REGEX_H in psk viewer d8304ae60: Use a rb for audio history 3248b7685: Merge with upstream a137030ce: Upstream version 2.10A 2599113a4: Merge with upstream a915633f3: Upstream version 2.09 575c17f57: Upstream version 2.09K 83a8d00e0: Upstream version 2.09J 12b1d6807: Fix argument handling Long arguments without a space (--opt=arg) now work correctly. Also, move sound initialisation to a separate function, add an undocumented --exit-after SECONDS argument, and update mkversions.sh to include CXXFLAGS in the --version output. 795ac21e5: Merge with upstream e2083f2f0: Upstream version 2.09I 1c8dac9bb: Merge with upstream bf19d9d6f: Upstream version 2.09H 1a7896785: Merge with upstream 41519882c: Upstream version 2.09G a60ca6ed9: Merge with upstream c836b738c: Upstream version 2.09F 4c06b8317: Merge with upstream c57b41130: Add regex support Add a beep button. Insert "@." when resizing Set inpSeek to constant width font Extend character range to include { | } ~ ad9f2d6a3: sprintf considered harmful Also fix a bug in putadif() where strings longer than the max field size would be truncated to one less than that size. Add a configure-time check for snprintf and vsnprintf because flstring.h looks for HAVE_SNPRINTF and HAVE_VSNPRINTF c40dccc5b: Upstream version 2.09E 58839a1a4: Adjust PSK Viewer colours Also set window class and insert end-of-formatting char 2eecd2e93: Upstream version 2.09D 41e003e38: Merge with upstream bcecfe43e: Use sndfile C API Also add .au support ead061ffd: Fix unchecked retval warnings c3d55a6ce: Fix for sync AM rig modes These are new in hamlib 1.2.6. We could require >= 1.2.6 in configure.ac, but then we would make packaging difficult on Debian stable (etch) for no good reason. c5a706477: Upstream version 2.09C f5582953c: Upstream version 2.09B b18ab16eb: Upstream version 2.09A 2736cb79b: Upstream version 2.09 (alpha) d4ad63770: Upstream version 2.08 398f3a3bb: Enable std-options With this automake option, "make distcheck" will also require the binary to write text to stdout and exit with code 0 when called with --version and --help. This way we get a free (but fairly basic) runtime check. Also, use the AC_COPYRIGHT macro instead of a comment. 9d5187bbd: HTML/cmdline help changes 0bb60b2a8: Makefile freebsd compat. On FreeBSD include files for portaudio-1 are in /usr/local/include/portaudio include files for portaudio-2 are in /usr/local/portaudio2 similarly for the libs. 4d72d2b4e: Merge with upstream 34f68be95: Upstream version 2.08G 1d0eee36b: Remove freqlist hscrollbar bd87ef5e3: Rigdialog changes Make the window shrinkable, and also add a mouse shortcut to replace items in the frequency list. Update tooltip. ed02583c7: Clean up min/max macros 70de915ac: Merge with upstream 3756b2e15: Upstream version 2.08F c410ff866: Remove .desktop Encoding 505518045: Fix freq/mode selection Setting some rig modes may also change the frequency; set the rig mode first c2f76891d: Retry PA/OSS errors 67c2c691a: Audio playback fix Do not apply the receive mixer volume to the audio samples read from files when the mixer is disabled. 0a0e32247: Rig dialog changes Display saved rig mode, digital mode, and wfall carrier in the rigcontrol window frequency list 2ecb92289: DominoEX bug fix Fix a decodesymbol() loop that was accessing memory below the start of symbolbuf 86d89d0e0: Use correct check for OSS This only affects error printing when PortAudio/OSS returns with an "Unanticipated Host Error" c77b1e66b: Add some help items 8d8760761: Cosmetic changes to rx menu 3f10b9ff7: Squeeze wfall controls 7e7e2aa03: Hide QRZ password 15ee11a2f: Clean up QSO frame 5f366be46: FTextEdit paste fix f673947a2: Update INSTALL file 792b6b53e: Merge with upstream 580cc2110: Upstream version 2.08d 73fde2af9: Use execvp 4cbfa4bd9: Add Olivia settings ba64201e7: PSK bug fix Initialise s/n and imd variables 99c0d578d: Throb bug fix Plug a memory leak caused by using the wrong delete operator e6a0caaa6: CW fix Initialise usedefaultWPM in ctor to avoid valgrind warning about conditional jump depending on access to uninitialised memory 220c41f54: MFSK bug fixes Set some variables to avoid accessing uninitialised memory. Initialise interleave table with 0s; the original gmfsk code used g_new0 to do this. This avoids another access to random bits. Fix memory leak by creating the small syms array on the stack. Initialise symbolpair[] with 0s in ctor to avoid vargrind warnings a30e84f63: Olivia bug fixes Set smargin and sinteg to avoid access to uninitialised memory Also set lastfreq to 0 in ctor to avoid valgrind warnings d3ff0adf9: Fix key bindings loop 642e63629: Add debug_exec 8cb6ccbc4: Print host API errors 0d934eec1: Stacktrace updates Kill a newline in Aborting... message Skip pstack's own frame when printing stack trace 904e7f4fc: Add selectFreq delay f2bdf7a3e: Add #if USE_PORTAUDIO check 5f4ea0646: Merge with upstream 60d3b3d71: Upstream version 2.08c e1e230774: Mention Native sample rate 09e25894f: Add .desktop, move icons to data/ configure.ac updates Thanks to Steve Conklin for the .desktop file and the Makefile.am patch 8a89e6417: Set locale only for LC_TIME 37cddb39f: Update README fb86586f9: Set default cursor for popup f88e55979: Merge with upstream 5eeb18464: Upstream version 2.08b 24a1f89bf: Remove mention of TLS 4ac6ad074: Upstream version 2.08a 341dd6c52: No sigsearch on RMB release ce52dd17d: Add Native sample rate 0dc1e2357: Use std::bind if available d3849ae87: Switch cSoundPA to the C API d32954878: Merge with upstream b237fd655: Copy CXXFLAGS to CFLAGS 9662164e8: Correctly initialise CW modem e3d1e1647: New ringbuffer, misc. utilities 635f3d1fa: Add TLS autodetection 3f0701cca: Upstream version 2.07 6843d6917: Merge with upstream 0a1dab204: qrunner updates Rename QUEUE to REQ and delete CMP_CB 7ed427426: Merge with upstream 93ded34b7: Upstream version 2.06 cda31bdcc: Merge with upstream 3cc681c35: Upstream version 2.066 c7088d960: rigsupport.cxx fixes 60c9060d7: Merge with upstream f03625945: Upstream version 2.065 b7dd1c0ca: Move Audio under Files 77e315cb3: hamlib.cxx fixes 05f035b33: Default to NONE when adding new freqs 5c8680a38: Merge with upstream 4e2827447: Upstream version 2.064 5ce658afb: Add more date macros 50c99e9e7: Merge with upstream fbe33b9a2: Add digiscope mwheel handling 14939ae3a: Remove adjuster widget 67889b78f: More tweaks 2605fca04: Set opMODE in selectFreq 74f384232: Don't copy freqlist to cout c8633a838: Upstream version 2.062 133664eff: Add cast to adjFreq callback e33f12f74: New stacktrace code 8dae0d958: Rigcontrol dialog changes 023e1f391: Fix g++-4.3 errors and warnings 38a677e79: Fix new assertions 80f6f30cc: Remove extra includes 606a047ce: Merge with upstream 17e5dc5c2: Upstream version 2.06 (alpha) a78544851: Compiler fixes e7795ef50: Merge with upstream 131f09c38: Upstream version 2.05 4aba0d51f: Upstream version 2.05d 13f5c8807: Add M clear shortcut 4b322bc17: More status button tweaks The mouse wheel now cycles through the modems in the same order as they appear in the main Op Mode menu 5b44ca282: Analysis: put_MODEstatus in rx_init caa3e3ed2: Merge with upstream e229f2849: Upstream version 2.05c 161112b8a: Fix btnMem mouse2 handling 72099f442: Fix waterfall marker drawing The markers may wrap around the other end of the waterfall if the AFC search range is large enough Also narrow the AFC search range and reduce the squelch threshold when the mouse wheel is scrolled down 614e601f3: Add a sample rate config menu Change get_best_srate to try the modem sample rate and device sample rate only Print exception messages to the status bar e5549c5f9: Add a waterfall Mem button Also add a mode_info structure and hence delete the modem init functions. Add a new init_modem_sync and QUEUE_FLUSH. Tweak the status button menu. 85173b9d4: Get rid of CRs 90ee5d594: Fix FText event handler c068900a7: Add an INSTALL file d1f6a29ed: configure.ac fixes 57b8fb9be: Merge with upstream d30f0b382: Delete debugging message 4a59d66cd: Fall back to bundled samplerate 868452150: Make sndfile optional 4dec0c20b: PA args should depend on USE_PORTAUDIO bf547e849: Upstream version 2.05b-exp 41f65cdd0: autoconfiscate e67229514: Upstream version 2.05b fe9d142f9: Reset sq label; reverse mwheel direction 14f1019e6: Squelch label 9dad9b9ee: Fix cc warnings; print src version e9d1cd8c4: Merge with upstream 0ddcf6b92: Upstream version 2.05a 6b6bd5bc7: Makefile updates e28b57b60: Clean up; add copyright headers 8e949e899: sample-rate and frames-per-buf switches ea37d3044: FLAC and sndfile comments 53b6c206a: Keep the audio stream open aa71760df: More waterfall hacks 4cf9874ff: Add clear_sent method Use this instead of clear when encountering a ^r 434634eaf: Merge with upstream 11af06016: Upstream version 2.04e 7580a6e37: Use pkg-config where possible be35436ac: Merge with upstream 9d1d3def6: Upstream version 2.04d 1d7380da2: Merge with upstream a28f2f871: Upstream version 2.04c 5031bbae8: Merge with upstream 587711a78: Fix AFC shortcut handling 896894229: Upstream version 2.04b d23ca917e: Upstream version 2.04a 2dab69f7a: Upstream version 2.04 (rc) c222a6600: Upstream version 2.03 7de4d361b: Upstream version 2.02 d00fa6942: Upstream version 2.01 c075bd101: Upstream version 2.0 25b4b87eb: Upstream version 2.0 (rc) a9831c865: Upstream version 2.0pre2 f9e982066: Upstream version 2.0pre 436e90ea4: Upstream version 1.38.15 94355bf93: Upstream version 1.38.14 3aee619ba: Upstream version 1.38.11 5872467d8: Upstream version 1.38.10 1e5172cb3: Upstream version 1.38.09 3ae308a60: Upstream version 1.38.08 3c922de1f: Upstream version 1.38.07 6a161c8ef: Upstream version 1.38.06 50d02cc50: Upstream version 1.38.05 c71808d3d: Upstream version 1.38.04 fc4caa167: Upstream version 1.38.03 fc457abab: Upstream version 1.38.02 23b6edc85: Upstream version 1.38.01 4d5b9e7a3: Upstream version 1.37U d4621401d: Upstream version 1.37S 5ab32c854: Upstream version 1.37R ecd9157d4: Upstream version 1.37Q 48ad45edf: Upstream version 1.37p 04b32dc4f: Upstream version 1.37o 6d4e6e7c0: Upstream version 1.37n cbae4492e: Upstream version 1.37L 6f058a284: Upstream version 1.37k 819904b72: Upstream version 1.37j 6d7eb5c09: Upstream version 1.37i 23860fbd0: Upstream version 1.37h e1efe8c81: Upstream version 1.37f-exp 087232221: Upstream version 1.37e-exp c3d146d1b: Upstream version 1.37c-exp 52e0bb1f3: Upstream version 1.37a-exp df27a2376: Upstream version 1.37exp 81f00f665: Upstream version 1.36e a4c5c49d9: Upstream version 1.36c f2e8c9a21: Upstream version 1.36b 54de891c5: Upstream version 1.35R ffb63c1c9: Upstream version 1.35q a140f8460: Upstream version 1.35o dcf89d532: Upstream version 1.35N 3be91c169: Upstream version 1.35M 33f4b4910: Upstream version 1.35L e37ebe13a: Upstream version 1.35J 962179007: Upstream version 1.34 4d5c3d476: Upstream version 1.33 fldigi-4.1.06/configure0000775000175000017500000153271313515623765011723 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for fldigi 4.1.06. # # Report bugs to . # # Copyright (C) 2007, 2008, 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: fldigi-devel@sourceforge.net about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='fldigi' PACKAGE_TARNAME='fldigi' PACKAGE_VERSION='4.1.06' PACKAGE_STRING='fldigi 4.1.06' PACKAGE_BUGREPORT='fldigi-devel@sourceforge.net' PACKAGE_URL='' ac_unique_file="src/main.cxx" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gt_needs= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS SILENT_CMDS FLARQ_BUILD_LDADD FLARQ_BUILD_LDFLAGS FLARQ_BUILD_CXXFLAGS FLARQ_BUILD_CPPFLAGS FLDIGI_BUILD_LDADD FLDIGI_BUILD_LDFLAGS FLDIGI_BUILD_CFLAGS FLDIGI_BUILD_CXXFLAGS FLDIGI_BUILD_CPPFLAGS HAVE_ASCIIDOC_NO_XMLLINT_FALSE HAVE_ASCIIDOC_NO_XMLLINT_TRUE HAVE_ASCIIDOC_FALSE HAVE_ASCIIDOC_TRUE A2X ASCIIDOC INTL_LIBS INTL_CFLAGS ENABLE_LIBMBEDTLS_FALSE ENABLE_LIBMBEDTLS_TRUE LIBMBEDTLS_LIBS LIBMBEDTLS_CFLAGS ENABLE_FLXMLRPC_FALSE ENABLE_FLXMLRPC_TRUE FLXMLRPC_LIBS FLXMLRPC_CFLAGS X_LIBS X_CFLAGS NEED_HAMLIB_LOCATOR_FALSE NEED_HAMLIB_LOCATOR_TRUE ENABLE_HAMLIB_FALSE ENABLE_HAMLIB_TRUE HAMLIB_LIBS HAMLIB_CFLAGS PULSEAUDIO_LIBS PULSEAUDIO_CFLAGS PORTAUDIO_LIBS PORTAUDIO_CFLAGS SNDFILE_LIBS SNDFILE_CFLAGS SAMPLERATE_LIBS SAMPLERATE_CFLAGS PNG_LIBS PNG_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG HAVE_FLUID_FALSE HAVE_FLUID_TRUE FLUID FLTK_LIBS FLTK_CFLAGS FLTK_CONFIG ENABLE_BENCHMARK_FALSE ENABLE_BENCHMARK_TRUE COMPAT_STACK_FALSE COMPAT_STACK_TRUE RDYNAMIC DEBUG_CFLAGS ENABLE_DEBUG_FALSE ENABLE_DEBUG_TRUE BFD_LIBS BFD_CFLAGS OPT_CFLAGS COMPAT_STRCASESTR_FALSE COMPAT_STRCASESTR_TRUE EXTRA_LIBS COMPAT_REGEX_FALSE COMPAT_REGEX_TRUE PTW32_LIBS PTW32_CFLAGS MINGW32_FALSE MINGW32_TRUE WIN32_FALSE WIN32_TRUE HAVE_NSIS_FALSE HAVE_NSIS_TRUE HAVE_WINDRES_FALSE HAVE_WINDRES_TRUE MAKENSIS WINDRES DARWIN_FALSE DARWIN_TRUE MAC_UNIVERSAL_LDFLAGS MAC_UNIVERSAL_CFLAGS WANT_FLARQ_FALSE WANT_FLARQ_TRUE WANT_FLDIGI_FALSE WANT_FLDIGI_TRUE USE_NLS_FALSE USE_NLS_TRUE POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS POW_LIB LIBOBJS CXX11_SWITCH EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX FLARQ_DOCS PACKAGE_GUIDE PACKAGE_DOCS PACKAGE_NEWBUG PACKAGE_PROJ PACKAGE_DL PACKAGE_HOME FLARQ_AUTHORS FLDIGI_AUTHORS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build AC_CONFIG_ARGS FLARQ_VERSION FLARQ_VERSION_PATCH FLARQ_VERSION_MINOR FLARQ_VERSION_MAJOR FLDIGI_VERSION FLDIGI_VERSION_PATCH FLDIGI_VERSION_MINOR FLDIGI_VERSION_MAJOR target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix enable_fldigi enable_flarq enable_mac_universal with_ptw32 with_clock_gettime enable_static enable_optimizations enable_debug with_bfd enable_benchmark enable_tls enable_oss with_sndfile with_pulseaudio with_hamlib with_flxmlrpc with_libmbedtls with_asciidoc ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PTW32_CFLAGS PTW32_LIBS BFD_CFLAGS BFD_LIBS FLTK_CONFIG FLTK_CFLAGS FLTK_LIBS FLUID PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PNG_CFLAGS PNG_LIBS SAMPLERATE_CFLAGS SAMPLERATE_LIBS SNDFILE_CFLAGS SNDFILE_LIBS PORTAUDIO_CFLAGS PORTAUDIO_LIBS PULSEAUDIO_CFLAGS PULSEAUDIO_LIBS HAMLIB_CFLAGS HAMLIB_LIBS X_CFLAGS X_LIBS FLXMLRPC_CFLAGS FLXMLRPC_LIBS LIBMBEDTLS_CFLAGS LIBMBEDTLS_LIBS INTL_CFLAGS INTL_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures fldigi 4.1.06 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/fldigi] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of fldigi 4.1.06:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build Optional Features and Packages: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --disable-nls do not use Native Language Support --with-gnu-ld assume the C compiler uses GNU ld default=no --disable-rpath do not hardcode runtime library paths --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --disable-fldigi do not build fldigi --disable-flarq do not build flarq --enable-mac-universal build a universal binary on Mac OS X [no] --with-ptw32[=DIR] search for pthreads-w32 in DIR/include and DIR/lib [mingw32 only] --without-clock_gettime Do not use clock_gettime lib --enable-static enable static linking for some libraries --enable-optimizations use x86 optimizations (none|sse|sse2|sse3|native) [none] --enable-debug turn on debugging --with-bfd[=DIR] search for libbfd in DIR/include and DIR/lib [mingw32 only] --enable-benchmark build for benchmark-only operation --enable-tls enable use of TLS [autodetect] --disable-oss disable support for OSS [autodetect] --with-sndfile enable reading/writing of audio files via libsndfile [autodetect] --with-pulseaudio enable support for PulseAudio [autodetect] --with-hamlib use hamradio control libraries [autodetect] --with-flxmlrpc use external flxmlrpc library [autodetect] --with-libmbedtls use mbedtls libraries [autodetect] --with-asciidoc build documentation using asciidoc [autodetect] Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PTW32_CFLAGS C compiler flags for pthreads-w32 PTW32_LIBS linker flags for pthreads-w32 BFD_CFLAGS C compiler flags for libbfd BFD_LIBS linker flags for libbfd FLTK_CONFIG Path to fltk-config utility FLTK_CFLAGS C compiler flags for FLTK, overriding fltk-config FLTK_LIBS linker flags for FLTK, overriding fltk-config FLUID Fast Light User-Interface Designer PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path PNG_CFLAGS C compiler flags for PNG, overriding pkg-config PNG_LIBS linker flags for PNG, overriding pkg-config SAMPLERATE_CFLAGS C compiler flags for SAMPLERATE, overriding pkg-config SAMPLERATE_LIBS linker flags for SAMPLERATE, overriding pkg-config SNDFILE_CFLAGS C compiler flags for SNDFILE, overriding pkg-config SNDFILE_LIBS linker flags for SNDFILE, overriding pkg-config PORTAUDIO_CFLAGS C compiler flags for PORTAUDIO, overriding pkg-config PORTAUDIO_LIBS linker flags for PORTAUDIO, overriding pkg-config PULSEAUDIO_CFLAGS C compiler flags for PULSEAUDIO, overriding pkg-config PULSEAUDIO_LIBS linker flags for PULSEAUDIO, overriding pkg-config HAMLIB_CFLAGS C compiler flags for HAMLIB, overriding pkg-config HAMLIB_LIBS linker flags for HAMLIB, overriding pkg-config X_CFLAGS C compiler flags for X, overriding pkg-config X_LIBS linker flags for X, overriding pkg-config FLXMLRPC_CFLAGS C compiler flags for FLXMLRPC, overriding pkg-config FLXMLRPC_LIBS linker flags for FLXMLRPC, overriding pkg-config LIBMBEDTLS_CFLAGS C compiler flags for LIBMBEDTLS, overriding pkg-config LIBMBEDTLS_LIBS linker flags for LIBMBEDTLS, overriding pkg-config INTL_CFLAGS C compiler flags for libintl, overriding gettext macros INTL_LIBS linker flags for libintl, overriding gettext macros Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF fldigi configure 4.1.06 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright (C) 2007, 2008, 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to fldigi-devel@sourceforge.net ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by fldigi $as_me 4.1.06, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # substitute in Makefiles FLDIGI_VERSION_MAJOR=4 FLDIGI_VERSION_MINOR=1 FLDIGI_VERSION_PATCH=.06 FLDIGI_VERSION=4.1.06 FLARQ_VERSION_MAJOR=4 FLARQ_VERSION_MINOR=3 FLARQ_VERSION_PATCH=.7 FLARQ_VERSION=4.3.7 # define in config.h $as_echo "#define FLDIGI_VERSION_MAJOR 4" >>confdefs.h $as_echo "#define FLDIGI_VERSION_MINOR 1" >>confdefs.h $as_echo "#define FLDIGI_VERSION_PATCH \".06\"" >>confdefs.h $as_echo "#define FLARQ_VERSION_MAJOR 4" >>confdefs.h $as_echo "#define FLARQ_VERSION_MINOR 3" >>confdefs.h $as_echo "#define FLARQ_VERSION_PATCH \".7\"" >>confdefs.h $as_echo "#define FLDIGI_VERSION \"4.1.06\"" >>confdefs.h $as_echo "#define FLARQ_VERSION \"4.3.7\"" >>confdefs.h AC_CONFIG_ARGS=$ac_configure_args ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # define build, build_cpu, build_vendor, build_os # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac # define host, host_cpu, host_vendor, host_os { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # define target, target_cpu, target_vendor, target_os { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='fldigi' VERSION='4.1.06' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_headers="$ac_config_headers src/config.h" FLDIGI_AUTHORS="Dave Freese, Stelios Bounanos, and others" FLARQ_AUTHORS="Dave Freese, Robert Stiles, and others" PACKAGE_HOME="http://www.w1hkj.com/Fldigi.html" PACKAGE_DL="http://www.w1hkj.com/download.html" PACKAGE_PROJ="http://sourceforge.net/projects/fldigi/files/" PACKAGE_NEWBUG="https://fedorahosted.org/fldigi/newticket" PACKAGE_DOCS="http://www.w1hkj.com/FldigiHelp/index.html" PACKAGE_GUIDE="http://www.w1hkj.com/beginners.html" FLARQ_DOCS="http://www.w1hkj.com/FlarqHelpFiles/flarq.html" cat >>confdefs.h <<_ACEOF #define FLDIGI_AUTHORS "$FLDIGI_AUTHORS" _ACEOF cat >>confdefs.h <<_ACEOF #define FLARQ_AUTHORS "$FLARQ_AUTHORS" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_HOME "$PACKAGE_HOME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_DL "$PACKAGE_DL" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_PROJ "$PACKAGE_PROJ" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_NEWBUG "$PACKAGE_NEWBUG" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_DOCS "$PACKAGE_DOCS" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_GUIDE "$PACKAGE_GUIDE" _ACEOF cat >>confdefs.h <<_ACEOF #define FLARQ_DOCS "$FLARQ_DOCS" _ACEOF FLDIGI_AUTHORS=$FLDIGI_AUTHORS FLARQ_AUTHORS=$FLARQ_AUTHORS PACKAGE_HOME=$PACKAGE_HOME PACKAGE_DL=$PACKAGE_DL PACKAGE_PROJ=$PACKAGE_PROJ PACKAGE_NEWBUG=$PACKAGE_NEWBUG PACKAGE_DOCS=$PACKAGE_DOCS PACKAGE_GUIDE=$PACKAGE_GUIDE FLARQ_DOCS=$FLARQ_DOCS # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h #Check for C++11 compliance ax_cxx_compile_cxx11_required=false ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" CXX11_SWITCH="$switch" ac_success=yes break fi done fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test x$ac_success = xno; then HAVE_CXX11=0 { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 $as_echo "$as_me: No compiler with C++11 support was found" >&6;} $as_echo "#define HAVE_CXX11 0" >>confdefs.h if test x$ax_cxx_compile_cxx11_required = xtrue; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else HAVE_CXX11=1 $as_echo "#define HAVE_CXX11 1" >>confdefs.h fi # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi for ac_header in arpa/inet.h execinfo.h fcntl.h limits.h memory.h netdb.h netinet/in.h regex.h stdint.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h sys/utsname.h termios.h unistd.h values.h linux/ppdev.h dev/ppbus/ppi.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" case $ac_cv_c_int8_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int8_t $ac_cv_c_int8_t _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if ${ac_cv_c_volatile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi # Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if ${ac_cv_func_closedir_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if ${ac_cv_lib_error_at_line+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then case " $LIBOBJS " in *" error.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS error.$ac_objext" ;; esac fi if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 $as_echo_n "checking for working strtod... " >&6; } if ${ac_cv_func_strtod+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_strtod=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifndef strtod double strtod (); #endif int main() { { /* Some versions of Linux strtod mis-parse strings with leading '+'. */ char *string = " +69"; char *term; double value; value = strtod (string, &term); if (value != 69 || term != (string + 4)) return 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strtod=yes else ac_cv_func_strtod=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 $as_echo "$ac_cv_func_strtod" >&6; } if test $ac_cv_func_strtod = no; then case " $LIBOBJS " in *" strtod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; esac ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" if test "x$ac_cv_func_pow" = xyes; then : fi if test $ac_cv_func_pow = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 $as_echo_n "checking for pow in -lm... " >&6; } if ${ac_cv_lib_m_pow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); int main () { return pow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_pow=yes else ac_cv_lib_m_pow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 $as_echo "$ac_cv_lib_m_pow" >&6; } if test "x$ac_cv_lib_m_pow" = xyes; then : POW_LIB=-lm else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 $as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} fi fi fi for ac_func in getaddrinfo gethostbyname hstrerror gmtime_r localtime_r memmove memset mkdir select setenv snprintf socket socketpair strcasecmp strcasestr strchr strdup strerror strlcpy strncpy strncmp strnlen strncasecmp strrchr strstr strtol uname unsetenv vsnprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Check for O_CLOEXEC { $as_echo "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5 $as_echo_n "checking for O_CLOEXEC... " >&6; } if ${ac_cv_o_cloexec+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -I${srcdir}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int flags= O_CLOEXEC ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_o_cloexec="yes" else ac_cv_o_cloexec="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_o_cloexec" >&5 $as_echo "$ac_cv_o_cloexec" >&6; } if test "x$ac_cv_o_cloexec" = "xyes"; then : $as_echo "#define HAVE_O_CLOEXEC 1" >>confdefs.h fi ### Internationalization { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.17 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBICONV_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBINTL_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" if test "x$USE_NLS" = "xyes"; then USE_NLS_TRUE= USE_NLS_FALSE='#' else USE_NLS_TRUE='#' USE_NLS_FALSE= fi ### Programs # Determine if fldigi and flarq have been requested and can be built # Set ac_cv_want_fldigi and ac_cv_want_flarq to yes/no # Set WANT_FLDIGI and WANT_FLARQ Makefile conditionals # Check whether --enable-fldigi was given. if test "${enable_fldigi+set}" = set; then : enableval=$enable_fldigi; case "${enableval}" in yes|no) ac_cv_want_fldigi="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --disable-fldigi" "$LINENO" 5 ;; esac else ac_cv_want_fldigi=yes fi if test "x$ac_cv_want_fldigi" = "xyes"; then WANT_FLDIGI_TRUE= WANT_FLDIGI_FALSE='#' else WANT_FLDIGI_TRUE='#' WANT_FLDIGI_FALSE= fi # Check whether --enable-flarq was given. if test "${enable_flarq+set}" = set; then : enableval=$enable_flarq; case "${enableval}" in yes|no) ac_cv_want_flarq="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --disable-flarq" "$LINENO" 5 ;; esac else ac_cv_want_flarq=yes fi if test "x$ac_cv_want_flarq" = "xyes"; then WANT_FLARQ_TRUE= WANT_FLARQ_FALSE='#' else WANT_FLARQ_TRUE='#' WANT_FLARQ_FALSE= fi ###### OS support ### OSX # Set ac_cv_mac_universal to yes/no # Set DARWIN Makefile conditional # Substitute MAC_UNIVERSAL_CFLAGS and MAC_UNIVERSAL_LDFLAGS in Makefile case "$target_os" in darwin*) target_darwin="yes" ;; *) target_darwin="no" ;; esac if test "$target_darwin" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: using bundled GNU regex on $target_os" >&5 $as_echo "$as_me: using bundled GNU regex on $target_os" >&6;} # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no $as_echo "#define HAVE_REGEX_H 0" >>confdefs.h fi # Check whether --enable-mac-universal was given. if test "${enable_mac_universal+set}" = set; then : enableval=$enable_mac_universal; case "${enableval}" in yes|no) ac_cv_mac_universal="${enableval}" ;; *) as_fn_error $? "bad value \"${enableval}\" for --enable-mac-universal" "$LINENO" 5 ;; esac else ac_cv_mac_universal=no fi if test "x$target_darwin" = "xyes" && test "x$ac_cv_mac_universal" = "xyes"; then mac_minversion="-mmacosx-version-min=10.4" case "$target_os" in darwin8*) mac_arches="-arch i386 -arch ppc" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.4u.sdk" ;; darwin9*) mac_arches="-arch i386 -arch ppc -arch x86_64 -arch ppc64" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.5.sdk" ;; darwin10*) mac_arches="-arch i386 -arch x86_64" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.6.sdk" ;; *) mac_arches="" mac_sysroot="" ;; esac MAC_UNIVERSAL_CFLAGS="$mac_arches $mac_sysroot $mac_minversion" MAC_UNIVERSAL_LDFLAGS="$mac_arches" fi if test "x$target_darwin" = "xyes"; then DARWIN_TRUE= DARWIN_FALSE='#' else DARWIN_TRUE='#' DARWIN_FALSE= fi ### win32 # Set WIN32 Makefile conditional # Set HAVE_WINDRES Makefile conditional # Substitute WINDRES in Makefile case "$target_os" in *mingw*) target_win32="yes" target_mingw32="yes" ;; *cygwin*|*win32*|*w32*) target_win32="yes" ;; *) target_win32="no" ;; esac if test "x$target_win32" = "xyes"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$WINDRES" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The windres utility could not be found" >&5 $as_echo "$as_me: WARNING: The windres utility could not be found" >&2;} fi $as_echo "#define __WOE32__ 1" >>confdefs.h $as_echo "#define __MINGW32__ 1" >>confdefs.h $as_echo "#define _WINDOWS 1" >>confdefs.h fi if test "x$target_mingw32" = "xyes"; then # Extract the first word of "makensis", so it can be a program name with args. set dummy makensis; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MAKENSIS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MAKENSIS"; then ac_cv_prog_MAKENSIS="$MAKENSIS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MAKENSIS="makensis" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MAKENSIS=$ac_cv_prog_MAKENSIS if test -n "$MAKENSIS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKENSIS" >&5 $as_echo "$MAKENSIS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$WINDRES" != "x"; then HAVE_WINDRES_TRUE= HAVE_WINDRES_FALSE='#' else HAVE_WINDRES_TRUE='#' HAVE_WINDRES_FALSE= fi if test "x$MAKENSIS" != "x"; then HAVE_NSIS_TRUE= HAVE_NSIS_FALSE='#' else HAVE_NSIS_TRUE='#' HAVE_NSIS_FALSE= fi if test "x$target_win32" = "xyes"; then WIN32_TRUE= WIN32_FALSE='#' else WIN32_TRUE='#' WIN32_FALSE= fi if test "x$target_mingw32" = "xyes"; then MINGW32_TRUE= MINGW32_FALSE='#' else MINGW32_TRUE='#' MINGW32_FALSE= fi # Check whether --with-ptw32 was given. if test "${with_ptw32+set}" = set; then : withval=$with_ptw32; ac_cv_want_ptw32="$withval" else ac_cv_want_ptw32=no fi if test "x$ac_cv_want_ptw32" != "xno"; then if test "x$ac_cv_want_ptw32" != "xyes"; then # set -I and -L switches ptw32_default_cflags="-I${ac_cv_want_ptw32}/include" ptw32_default_libs="-L${ac_cv_want_ptw32}/lib" fi ptw32_default_libs="$ptw32_default_libs -lpthreadGC2 -lws2_32" # don't override the user-specified vars PTW32_CFLAGS="${PTW32_CFLAGS:-$ptw32_default_cflags}" PTW32_LIBS="${PTW32_LIBS:-$ptw32_default_libs}" ac_cv_want_ptw32="yes" else if test "x$target_mingw32" = "xyes"; then PTW32_LIBS="-lpthread -lwsock32 -lws2_32" fi fi ### Non-POSIX compatibility (i.e. mingw32) # Sets various Makefile conditionals; see m4/np-compat.m4 # Check whether --with-clock_gettime was given. if test "${with_clock_gettime+set}" = set; then : withval=$with_clock_gettime; case "${withval}" in yes|no) ac_cv_with_clock_gettime="${withval}" ;; *) as_fn_error $? "bad value ${withval} for --without-clock_gettime" "$LINENO" 5 ;; esac else ac_cv_with_clock_gettime=yes fi if test "x$ac_cv_with_clock_gettime" = "xyes"; then LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 $as_echo_n "checking for library containing clock_gettime... " >&6; } if ${ac_cv_search_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF for ac_lib in '' rt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_clock_gettime=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_clock_gettime+:} false; then : break fi done if ${ac_cv_search_clock_gettime+:} false; then : else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 $as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_clock_gettime=1 else ac_cv_have_func_clock_gettime=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_CLOCK_GETTIME $ac_cv_have_func_clock_gettime _ACEOF LIBS="$LIBS_search_libs_save" fi if test "x$target_mingw32" = "xyes"; then # Newer versions of mingw32 comes with pthread. sem_libs="pthreadGC2 pthread" # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no $as_echo "#define HAVE_REGEX_H 0" >>confdefs.h else sem_libs="pthread rt" fi if test "x$ac_cv_header_regex_h" != "xyes"; then COMPAT_REGEX_TRUE= COMPAT_REGEX_FALSE='#' else COMPAT_REGEX_TRUE='#' COMPAT_REGEX_FALSE= fi other_libs="" if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS_saved="$CFLAGS" LDFLAGS_saved="$LDFLAGS" EXTRA_LIBS_saved="$EXTRA_LIBS" CFLAGS="$CFLAGS $PTW32_CFLAGS" LDFLAGS="$LDFLAGS $PTW32_LIBS" other_libs=-lws2_32 fi LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 $as_echo_n "checking for library containing dlopen... " >&6; } if ${ac_cv_search_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF for ac_lib in '' dl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_dlopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_dlopen+:} false; then : break fi done if ${ac_cv_search_dlopen+:} false; then : else ac_cv_search_dlopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 $as_echo "$ac_cv_search_dlopen" >&6; } ac_res=$ac_cv_search_dlopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_dlopen=1 else ac_cv_have_func_dlopen=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_DLOPEN $ac_cv_have_func_dlopen _ACEOF LIBS="$LIBS_search_libs_save" LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_unlink" >&5 $as_echo_n "checking for library containing sem_unlink... " >&6; } if ${ac_cv_search_sem_unlink+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sem_unlink (); int main () { return sem_unlink (); ; return 0; } _ACEOF for ac_lib in '' $sem_libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sem_unlink=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sem_unlink+:} false; then : break fi done if ${ac_cv_search_sem_unlink+:} false; then : else ac_cv_search_sem_unlink=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_unlink" >&5 $as_echo "$ac_cv_search_sem_unlink" >&6; } ac_res=$ac_cv_search_sem_unlink if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_sem_unlink=1 else ac_cv_have_func_sem_unlink=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_SEM_UNLINK $ac_cv_have_func_sem_unlink _ACEOF LIBS="$LIBS_search_libs_save" LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_timedwait" >&5 $as_echo_n "checking for library containing sem_timedwait... " >&6; } if ${ac_cv_search_sem_timedwait+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sem_timedwait (); int main () { return sem_timedwait (); ; return 0; } _ACEOF for ac_lib in '' $sem_libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sem_timedwait=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sem_timedwait+:} false; then : break fi done if ${ac_cv_search_sem_timedwait+:} false; then : else ac_cv_search_sem_timedwait=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_timedwait" >&5 $as_echo "$ac_cv_search_sem_timedwait" >&6; } ac_res=$ac_cv_search_sem_timedwait if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_sem_timedwait=1 else ac_cv_have_func_sem_timedwait=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_SEM_TIMEDWAIT $ac_cv_have_func_sem_timedwait _ACEOF LIBS="$LIBS_search_libs_save" if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS="$CFLAGS_saved" LDFLAGS="$LDFLAGS_saved" EXTRA_LIBS="$EXTRA_LIBS_saved" fi if test "x$ac_cv_func_strcasestr" != "xyes"; then COMPAT_STRCASESTR_TRUE= COMPAT_STRCASESTR_FALSE='#' else COMPAT_STRCASESTR_TRUE='#' COMPAT_STRCASESTR_FALSE= fi ### static flag # Set ac_cv_static to yes/no # Substitute RTLIB in Makefile # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; case "${enableval}" in yes|no) ac_cv_static="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-static" "$LINENO" 5 ;; esac else ac_cv_static=no fi ### optimizations # Set ac_cv_opt to arg # Substitute OPT_FLAGS in Makefile # Check whether --enable-optimizations was given. if test "${enable_optimizations+set}" = set; then : enableval=$enable_optimizations; case "${enableval}" in none|sse|sse2|sse3|native) ac_cv_opt="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-optimizations" "$LINENO" 5 ;; esac else ac_cv_opt=none fi OPT_CFLAGS="-O2" case "$ac_cv_opt" in sse) OPT_CFLAGS="$OPT_CFLAGS -msse -mfpmath=sse" ;; sse2) OPT_CFLAGS="$OPT_CFLAGS -msse2 -mfpmath=sse" ;; sse3) OPT_CFLAGS="$OPT_CFLAGS -msse3 -mfpmath=sse" ;; native) OPT_CFLAGS="$OPT_CFLAGS -march=native -mfpmath=sse" ;; none) ;; esac ### debug flag # Set ac_cv_debug to yes/no # Override CXXFLAGS # Set ENABLE_DEBUG Makefile conditional # Substitute RDYNAMIC in Makefile # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes|no) ac_cv_debug="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else ac_cv_debug=no fi # Check whether --with-bfd was given. if test "${with_bfd+set}" = set; then : withval=$with_bfd; ac_cv_want_bfd="$withval" else ac_cv_want_bfd=yes fi if test "x$ac_cv_debug" = "xyes" && test "x$ac_cv_want_bfd" != "xno" && \ test "x$target_mingw32" = "xyes"; then if test "x$ac_cv_want_bfd" != "xyes"; then # set -I and -L switches bfd_default_cflags="-I${ac_cv_want_bfd}/include" bfd_default_libs="-L${ac_cv_want_bfd}/lib" fi # don't override the user-specified vars BFD_CFLAGS="${BFD_CFLAGS:-$bfd_default_cflags}" BFD_LIBS="${BFD_LIBS:-$bfd_default_libs}" ac_cv_want_bfd="yes" CPPFLAGS_saved="$CPPFLAGS" LDFLAGS_saved="$LDFLAGS" CPPFLAGS="$CPPFLAGS $BFD_CFLAGS" LDFLAGS="$LDFLAGS $BFD_LIBS" ac_fn_c_check_header_mongrel "$LINENO" "bfd.h" "ac_cv_header_bfd_h" "$ac_includes_default" if test "x$ac_cv_header_bfd_h" = xyes; then : ac_cv_have_bfd="yes" else ac_cv_have_bfd="no" fi if test "x$ac_cv_have_bfd" = "xyes"; then bfd_other_libs="-liberty -lpsapi -limagehlp" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bfd_set_format in -lbfd" >&5 $as_echo_n "checking for bfd_set_format in -lbfd... " >&6; } if ${ac_cv_lib_bfd_bfd_set_format+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbfd $bfd_other_libs $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bfd_set_format (); int main () { return bfd_set_format (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bfd_bfd_set_format=yes else ac_cv_lib_bfd_bfd_set_format=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bfd_bfd_set_format" >&5 $as_echo "$ac_cv_lib_bfd_bfd_set_format" >&6; } if test "x$ac_cv_lib_bfd_bfd_set_format" = xyes; then : ac_cv_have_bfd="yes" else ac_cv_have_bfd="no" fi fi CPPFLAGS="$CPPFLAGS_saved" LDFLAGS="$LDFLAGS_saved" if test "x$ac_cv_have_bfd" = "xyes"; then BFD_LIBS="$BFD_LIBS -lbfd $bfd_other_libs" fi fi if test "x$ac_cv_debug" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for debug info flag" >&5 $as_echo_n "checking for debug info flag... " >&6; } if test "x$GXX" = "xyes"; then if test "x$target_mingw32" = "xyes"; then gflag="-gstabs" else gflag="-ggdb3" fi else gflag="-g" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gflag" >&5 $as_echo "$gflag" >&6; } DEBUG_CFLAGS="-O0 -fno-inline-functions $gflag -Wall" LDFLAGS_saved="$LDFLAGS" LDFLAGS="$LDFLAGS -rdynamic" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -rdynamic" >&5 $as_echo_n "checking whether $CC supports -rdynamic... " >&6; } # don't try this on win32; it succeeds but emits a warning at link time if test "x$target_win32" != "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_rdynamic=yes else ac_cv_rdynamic=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else ac_cv_rdynamic=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_rdynamic" >&5 $as_echo "$ac_cv_rdynamic" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports -rdynamic" >&5 $as_echo_n "checking whether $CXX supports -rdynamic... " >&6; } if test "x$target_win32" != "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_rdynamic=yes else ac_cv_rdynamic=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else ac_cv_rdynamic=no fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_rdynamic" >&5 $as_echo "$ac_cv_rdynamic" >&6; } LDFLAGS="$LDFLAGS_saved" if test "x$ac_cv_rdynamic" = "xyes"; then RDYNAMIC=-rdynamic fi CXXFLAGS="" CFLAGS="$CXXFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: debugging enabled; overriding CXXFLAGS" >&5 $as_echo "$as_me: debugging enabled; overriding CXXFLAGS" >&6;} if test "x$target_darwin" = "xyes"; then ac_cv_compat_stack=yes $as_echo "#define HAVE_DBG_STACK 1" >>confdefs.h elif test "x$target_mingw32" = "xyes" && test "x$ac_cv_have_bfd" = "xyes"; then ac_cv_compat_stack=yes $as_echo "#define HAVE_DBG_STACK 1" >>confdefs.h else ac_cv_compat_stack=no $as_echo "#define HAVE_DBG_STACK 0" >>confdefs.h fi fi if test "x$ac_cv_debug" = "xyes"; then ENABLE_DEBUG_TRUE= ENABLE_DEBUG_FALSE='#' else ENABLE_DEBUG_TRUE='#' ENABLE_DEBUG_FALSE= fi if test "x$ac_cv_compat_stack" = "xyes"; then COMPAT_STACK_TRUE= COMPAT_STACK_FALSE='#' else COMPAT_STACK_TRUE='#' COMPAT_STACK_FALSE= fi ### benchmark mode # Set ac_cv_benchmark to yes/no # Define BENCHMARK_MODE in config.h # Set ENABLE_BENCHMARK Makefile conditional # Check whether --enable-benchmark was given. if test "${enable_benchmark+set}" = set; then : enableval=$enable_benchmark; case "${enableval}" in yes|no) ac_cv_benchmark="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-benchmark" "$LINENO" 5 ;; esac else ac_cv_benchmark=no fi if test "x$ac_cv_benchmark" = "xyes"; then $as_echo "#define BENCHMARK_MODE 1" >>confdefs.h else $as_echo "#define BENCHMARK_MODE 0" >>confdefs.h fi if test "x$ac_cv_benchmark" = "xyes"; then ENABLE_BENCHMARK_TRUE= ENABLE_BENCHMARK_FALSE='#' else ENABLE_BENCHMARK_TRUE='#' ENABLE_BENCHMARK_FALSE= fi ### TLS flag # Set ac_cv_tls to yes/no # Define USE_TLS in config.h # Check whether --enable-tls was given. if test "${enable_tls+set}" = set; then : enableval=$enable_tls; case "${enableval}" in yes|no) ac_cv_want_tls="${enableval}" ;; *) as_fn_error $? "bad value \"${enableval}\" for --enable-tls" "$LINENO" 5 ;; esac else ac_cv_want_tls=check fi if test "x$target_mingw32" = "xyes"; then ac_cv_want_tls=no fi if test "x$ac_cv_want_tls" = "xno"; then $as_echo "#define USE_TLS 0" >>confdefs.h ac_cv_tls=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TLS support" >&5 $as_echo_n "checking for TLS support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 $as_echo "disabled" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TLS support" >&5 $as_echo_n "checking for TLS support... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __thread int a; int b; int main() { return a = b; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_tls=yes else ac_cv_tls=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __thread int a; int b; int main() { return a = b; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : chktls_save_CXXFLAGS="$CXXFLAGS" thread_CXXFLAGS=failed for flag in "" "-pthread" "-lpthread"; do CXXFLAGS="$flag $chktls_save_CXXFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void *g(void *d) { return NULL; } int main () { pthread_t t; pthread_create(&t, NULL, g, NULL); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : thread_CXXFLAGS="$flag" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "x$thread_CXXFLAGS" != "xfailed"; then break fi done CXXFLAGS="$chktls_save_CXXFLAGS" if test "x$thread_CXXFLAGS" != "xfailed"; then CXXFLAGS="$thread_CXXFLAGS $chktls_save_CXXFLAGS" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include __thread int a; static int *a_in_other_thread; static void *thread_func(void *arg) { a_in_other_thread = &a; return (void *)0; } int main () { pthread_t thread; void *thread_retval; int *a_in_main_thread; if (pthread_create(&thread, (pthread_attr_t *)0, thread_func, (void *)0)) return 0; a_in_main_thread = &a; if (pthread_join (thread, &thread_retval)) return 0; return (a_in_other_thread == a_in_main_thread); ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_tls=yes else ac_cv_tls=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CXXFLAGS="$chktls_save_CXXFLAGS" fi else ac_cv_tls=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 $as_echo "$ac_cv_tls" >&6; } if test "x$ac_cv_want_tls" = "xcheck"; then if test "x$ac_cv_tls" = "xyes"; then $as_echo "#define USE_TLS 1" >>confdefs.h else $as_echo "#define USE_TLS 0" >>confdefs.h fi else # $ac_cv_want_tls is yes if test "x$ac_cv_tls" = "xno"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--enable-tls was given, but TLS is not supported See \`config.log' for more details" "$LINENO" 5; } else $as_echo "#define USE_TLS 1" >>confdefs.h fi fi fi ### std::bind or alternatives # Set ac_cv_std_bind or ac_cv_std_tr1_bind to yes/no # Define HAVE_STD_BIND or HAVE_STD_TR1_BIND in config.h # Substitute BOOST_CPPFLAGS and BOOST_LDFLAGS in Makefile # if falling back to Boost ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::bind in " >&5 $as_echo_n "checking for std::bind in ... " >&6; } if ${ax_cv_std_bind+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main(int argc, char **argv) { std::bind(f)(); return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_std_bind=yes else ac_cv_std_bind=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_std_bind" >&5 $as_echo "$ax_cv_std_bind" >&6; } ac_success=no if test "x$ac_cv_std_bind" = "xyes"; then ac_success=yes $as_echo "#define HAVE_STD_BIND 1" >>confdefs.h else $as_echo "#define HAVE_STD_BIND 0" >>confdefs.h fi if test x$ac_success = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::tr1::bind in " >&5 $as_echo_n "checking for std::tr1::bind in ... " >&6; } if ${ax_cv_std_tr1_bind+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main(int argc, char **argv) { std::tr1::bind(f)(); return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_std_tr1_bind=yes else ac_cv_std_tr1_bind=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_std_tr1_bind" >&5 $as_echo "$ax_cv_std_tr1_bind" >&6; } if test "x$ac_cv_std_tr1_bind" = "xyes"; then ac_success=yes $as_echo "#define HAVE_STD_TR1_BIND 1" >>confdefs.h else $as_echo "#define HAVE_STD_TR1_BIND 0" >>confdefs.h fi fi if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_std_bind_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX supports std::bind() feature with $switch" >&5 $as_echo_n "checking for $CXX supports std::bind() feature with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main(int argc, char **argv) { std::bind(f)(); return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_cv_std_bind=yes ac_success=yes break fi done fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$ac_success" = "xno"; then as_fn_error $? "Could not find std::bind or std::tr1::bind" "$LINENO" 5 fi ### std::hash or alternatives # Set ac_cv_std_hash or ac_cv_std_tr1_hash to yes/no # Define HAVE_STD_HASH or HAVE_STD_TR1_HASH in config.h # Substitute BOOST_CPPFLAGS and BOOST_LDFLAGS in Makefile # if falling back to Boost ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::hash in " >&5 $as_echo_n "checking for std::hash in ... " >&6; } if ${ax_cv_std_hash+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main(int argc, char **argv) { std::hash()(1); return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_std_hash=yes else ac_cv_std_hash=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_std_hash" >&5 $as_echo "$ax_cv_std_hash" >&6; } ac_success=no if test "x$ac_cv_std_hash" = "xyes"; then ac_success=yes $as_echo "#define HAVE_STD_HASH 1" >>confdefs.h else $as_echo "#define HAVE_STD_HASH 0" >>confdefs.h fi if test x$ac_success = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::tr1::hash in " >&5 $as_echo_n "checking for std::tr1::hash in ... " >&6; } if ${ax_cv_std_tr1_hash+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main(int argc, char **argv) { std::tr1::hash()(1); return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_std_tr1_hash=yes else ac_cv_std_tr1_hash=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_std_tr1_hash" >&5 $as_echo "$ax_cv_std_tr1_hash" >&6; } if test "x$ac_cv_std_tr1_hash" = "xyes"; then ac_success=yes $as_echo "#define HAVE_STD_TR1_HASH 1" >>confdefs.h else $as_echo "#define HAVE_STD_TR1_HASH 0" >>confdefs.h fi fi if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_std_hash_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX supports std::hash() feature with $switch" >&5 $as_echo_n "checking for $CXX supports std::hash() feature with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main(int argc, char **argv) { std::hash()(1); return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_cv_std_hash=yes ac_success=yes break fi done fi if test "x$ac_cv_std_hash" = "xyes"; then ac_success=yes $as_echo "#define HAVE_STD_HASH 1" >>confdefs.h else $as_echo "#define HAVE_STD_HASH 0" >>confdefs.h fi gcc_dver=$($CXX -dumpversion) gcc_minver=4.1.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX version >= $gcc_minver" >&5 $as_echo_n "checking for $CXX version >= $gcc_minver... " >&6; } # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$gcc_dver" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "$gcc_minver" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($gcc_dver)" >&5 $as_echo "yes ($gcc_dver)" >&6; }; GCCVER="ok" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no ($gcc_dver)" >&5 $as_echo "no ($gcc_dver)" >&6; }; GCCVER="bad" fi if test "y$GCCVER" = "yok"; then $as_echo "#define GCC_VER_OK 1" >>confdefs.h else $as_echo "#define GCC_VER_OK 0" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$ac_success" = "xno"; then as_fn_error $? "Could not find std::hash or std::tr1::hash" "$LINENO" 5 fi ### FLTK # Substitute FLTK_CFLAGS and FLTK_LIBS in Makefile # Set FLUID variable # Set HAVE_FLUID Makefile conditional if test "x$FLTK_CFLAGS" = "x" && test "x$FLTK_LIBS" = "x"; then if test "x$FLTK_CONFIG" = "x"; then # Extract the first word of "fltk-config", so it can be a program name with args. set dummy fltk-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FLTK_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $FLTK_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_FLTK_CONFIG="$FLTK_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FLTK_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_FLTK_CONFIG" && ac_cv_path_FLTK_CONFIG="no" ;; esac fi FLTK_CONFIG=$ac_cv_path_FLTK_CONFIG if test -n "$FLTK_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLTK_CONFIG" >&5 $as_echo "$FLTK_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fltk-config" >&5 $as_echo_n "checking for fltk-config... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLTK_CONFIG" >&5 $as_echo "$FLTK_CONFIG" >&6; } fi if test "$FLTK_CONFIG" = "no"; then as_fn_error $? " *** The fltk-config script could not be found. Please install the development *** headers and libraries for FLTK 1.1.x, or set PATH to the directory that *** contains fltk-config. " "$LINENO" 5 fi HAVE_FLTK_API_VERSION=no FLTK_API_VERSION="`$FLTK_CONFIG --version`" if test $? -ne 0; then as_fn_error $? "$FLTK_CONFIG failed" "$LINENO" 5 fi if test -n "$(expr $FLTK_API_VERSION : '1\.13')"; then HAVE_FLTK_API_VERSION=yes fi FLDIGI_FLTK_API_MAJOR=${FLTK_API_VERSION%%.*} FLDIGI_FLTK_API_MINOR=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_MINOR=${FLDIGI_FLTK_API_MINOR%%.*} FLDIGI_FLTK_API_PATCH=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_PATCH=${FLDIGI_FLTK_API_PATCH#*.}; if test "${HAVE_FLTK_API_VERSION}" = "no"; then as_fn_error $? " *** The version of FLTK found on your system provides API version $FLTK_API_VERSION. *** To build $PACKAGE you need a FLTK version that provides API 1.1, 1.2 or 1.3. " "$LINENO" 5 fi if test $FLDIGI_FLTK_API_MINOR -gt 3; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $PACKAGE_TARNAME may not work with FLTK $FLTK_API_VERSION" >&5 $as_echo "$as_me: WARNING: $PACKAGE_TARNAME may not work with FLTK $FLTK_API_VERSION" >&2;} fi FLTK_CFLAGS=`$FLTK_CONFIG --cxxflags` if test "x$ac_cv_static" != "xyes"; then FLTK_LIBS=`$FLTK_CONFIG --ldflags --use-images` else FLTK_LIBS=`$FLTK_CONFIG --ldstaticflags --use-images` fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not checking for FLTK" >&5 $as_echo "$as_me: not checking for FLTK" >&6;} fi cat >>confdefs.h <<_ACEOF #define FLTK_BUILD_VERSION "`$FLTK_CONFIG --version`" _ACEOF cat >>confdefs.h <<_ACEOF #define FLDIGI_FLTK_API_MAJOR $FLDIGI_FLTK_API_MAJOR _ACEOF cat >>confdefs.h <<_ACEOF #define FLDIGI_FLTK_API_MINOR $FLDIGI_FLTK_API_MINOR _ACEOF cat >>confdefs.h <<_ACEOF #define FLDIGI_FLTK_API_PATCH $FLDIGI_FLTK_API_PATCH _ACEOF # Extract the first word of "fluid", so it can be a program name with args. set dummy fluid; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FLUID+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$FLUID"; then ac_cv_prog_FLUID="$FLUID" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_FLUID="fluid" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FLUID=$ac_cv_prog_FLUID if test -n "$FLUID"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLUID" >&5 $as_echo "$FLUID" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -n "$FLUID"; then HAVE_FLUID_TRUE= HAVE_FLUID_FALSE='#' else HAVE_FLUID_TRUE='#' HAVE_FLUID_FALSE= fi ### OSS # Set ac_cv_oss to yes/no # Define USE_OSS in config.h if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then # Check whether --enable-oss was given. if test "${enable_oss+set}" = set; then : enableval=$enable_oss; case "${enableval}" in yes|no) ac_cv_want_oss="${enableval}" ;; *) as_fn_error $? "bad value \"${enableval}\" for --disable-oss" "$LINENO" 5 ;; esac else ac_cv_want_oss=check fi else { $as_echo "$as_me:${as_lineno-$LINENO}: disabling OSS driver on $target_os" >&5 $as_echo "$as_me: disabling OSS driver on $target_os" >&6;} ac_cv_want_oss=no fi ac_cv_oss=no if test "x$ac_cv_want_oss" = "xno"; then $as_echo "#define USE_OSS 0" >>confdefs.h else ac_fn_c_check_header_mongrel "$LINENO" "sys/soundcard.h" "ac_cv_header_sys_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_sys_soundcard_h" = xyes; then : ac_cv_oss=yes else ac_fn_c_check_header_mongrel "$LINENO" "machine/soundcard.h" "ac_cv_header_machine_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_machine_soundcard_h" = xyes; then : ac_cv_oss=yes else ac_fn_c_check_header_mongrel "$LINENO" "soundcard.h" "ac_cv_header_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_soundcard_h" = xyes; then : ac_cv_oss=yes fi fi fi if test "x$ac_cv_want_oss" = "xcheck"; then if test "x$ac_cv_oss" = "xyes"; then $as_echo "#define USE_OSS 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: disabling OSS driver" >&5 $as_echo "$as_me: disabling OSS driver" >&6;} $as_echo "#define USE_OSS 0" >>confdefs.h fi else # $ac_cv_want_oss is yes if test "x$ac_cv_oss" = "xno"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--enable-oss was given, but test for OSS failed See \`config.log' for more details" "$LINENO" 5; } else $as_echo "#define USE_OSS 1" >>confdefs.h fi fi fi ### libpng # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_png to yes/no (not used) # Define USE_PNG in config.h (as above) # Substitute PNG_CFLAGS and PNG_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi ac_cv_want_png=yes test "x$ac_cv_want_png" = "x" && ac_cv_want_png="check" case "x$ac_cv_want_png" in "xno") ac_cv_png=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` else PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 ac_cv_png=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_png=no else PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_png=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` else PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpng >= 1.2.8) were not met: $PNG_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_png=yes ;; esac if test "x$ac_cv_png" = "xyes"; then $as_echo "#define USE_PNG 1" >>confdefs.h pkg_png_version=`$PKG_CONFIG --modversion "libpng >= 1.2.8" 2>/dev/null` else $as_echo "#define USE_PNG 0" >>confdefs.h pkg_png_version="" fi cat >>confdefs.h <<_ACEOF #define PNG_BUILD_VERSION "$pkg_png_version" _ACEOF : fi ### libsamplerate # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_samplerate to yes/no (not used) # Define USE_SAMPLERATE in config.h (as above) # Substitute SAMPLERATE_CFLAGS and SAMPLERATE_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then ac_cv_want_samplerate=yes test "x$ac_cv_want_samplerate" = "x" && ac_cv_want_samplerate="check" case "x$ac_cv_want_samplerate" in "xno") ac_cv_samplerate=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SAMPLERATE" >&5 $as_echo_n "checking for SAMPLERATE... " >&6; } if test -n "$SAMPLERATE_CFLAGS"; then pkg_cv_SAMPLERATE_CFLAGS="$SAMPLERATE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_CFLAGS=`$PKG_CONFIG --cflags "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SAMPLERATE_LIBS"; then pkg_cv_SAMPLERATE_LIBS="$SAMPLERATE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_LIBS=`$PKG_CONFIG --libs "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` else SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SAMPLERATE_PKG_ERRORS" >&5 ac_cv_samplerate=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_samplerate=no else SAMPLERATE_CFLAGS=$pkg_cv_SAMPLERATE_CFLAGS SAMPLERATE_LIBS=$pkg_cv_SAMPLERATE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_samplerate=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SAMPLERATE" >&5 $as_echo_n "checking for SAMPLERATE... " >&6; } if test -n "$SAMPLERATE_CFLAGS"; then pkg_cv_SAMPLERATE_CFLAGS="$SAMPLERATE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_CFLAGS=`$PKG_CONFIG --cflags "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SAMPLERATE_LIBS"; then pkg_cv_SAMPLERATE_LIBS="$SAMPLERATE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_LIBS=`$PKG_CONFIG --libs "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` else SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SAMPLERATE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (samplerate >= 0.1.1) were not met: $SAMPLERATE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SAMPLERATE_CFLAGS and SAMPLERATE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables SAMPLERATE_CFLAGS and SAMPLERATE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else SAMPLERATE_CFLAGS=$pkg_cv_SAMPLERATE_CFLAGS SAMPLERATE_LIBS=$pkg_cv_SAMPLERATE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_samplerate=yes ;; esac if test "x$ac_cv_samplerate" = "xyes"; then $as_echo "#define USE_SAMPLERATE 1" >>confdefs.h pkg_samplerate_version=`$PKG_CONFIG --modversion "samplerate >= 0.1.1" 2>/dev/null` else $as_echo "#define USE_SAMPLERATE 0" >>confdefs.h pkg_samplerate_version="" fi cat >>confdefs.h <<_ACEOF #define SAMPLERATE_BUILD_VERSION "$pkg_samplerate_version" _ACEOF : fi ### libsndfile # Set ac_cv_sndfile to yes/no # Define USE_SNDFILE in config.h # Substitute SNDFILE_CFLAGS and SNDFILE_LIBS in Makefile # Check whether --with-sndfile was given. if test "${with_sndfile+set}" = set; then : withval=$with_sndfile; case "${withval}" in yes|no) ac_cv_want_sndfile="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-sndfile" "$LINENO" 5 ;; esac else ac_cv_want_sndfile=check fi test "x$ac_cv_want_sndfile" = "x" && ac_cv_want_sndfile="check" case "x$ac_cv_want_sndfile" in "xno") ac_cv_sndfile=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 $as_echo_n "checking for SNDFILE... " >&6; } if test -n "$SNDFILE_CFLAGS"; then pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SNDFILE_LIBS"; then pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` else SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SNDFILE_PKG_ERRORS" >&5 ac_cv_sndfile=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_sndfile=no else SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_sndfile=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 $as_echo_n "checking for SNDFILE... " >&6; } if test -n "$SNDFILE_CFLAGS"; then pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SNDFILE_LIBS"; then pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` else SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SNDFILE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (sndfile >= 1.0.10) were not met: $SNDFILE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SNDFILE_CFLAGS and SNDFILE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables SNDFILE_CFLAGS and SNDFILE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_sndfile=yes ;; esac if test "x$ac_cv_sndfile" = "xyes"; then $as_echo "#define USE_SNDFILE 1" >>confdefs.h pkg_sndfile_version=`$PKG_CONFIG --modversion "sndfile >= 1.0.10" 2>/dev/null` else $as_echo "#define USE_SNDFILE 0" >>confdefs.h pkg_sndfile_version="" fi cat >>confdefs.h <<_ACEOF #define SNDFILE_BUILD_VERSION "$pkg_sndfile_version" _ACEOF : ### portaudio # Set ac_cv_portaudio to yes/no # Define USE_PORTAUDIO in config.h # Substitute PORTAUDIO_CFLAGS and PORTAUDIO_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then ac_cv_want_portaudio=yes test "x$ac_cv_want_portaudio" = "x" && ac_cv_want_portaudio="check" case "x$ac_cv_want_portaudio" in "xno") ac_cv_portaudio=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PORTAUDIO" >&5 $as_echo_n "checking for PORTAUDIO... " >&6; } if test -n "$PORTAUDIO_CFLAGS"; then pkg_cv_PORTAUDIO_CFLAGS="$PORTAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_CFLAGS=`$PKG_CONFIG --cflags "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PORTAUDIO_LIBS"; then pkg_cv_PORTAUDIO_LIBS="$PORTAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_LIBS=`$PKG_CONFIG --libs "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` else PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PORTAUDIO_PKG_ERRORS" >&5 ac_cv_portaudio=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_portaudio=no else PORTAUDIO_CFLAGS=$pkg_cv_PORTAUDIO_CFLAGS PORTAUDIO_LIBS=$pkg_cv_PORTAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_portaudio=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PORTAUDIO" >&5 $as_echo_n "checking for PORTAUDIO... " >&6; } if test -n "$PORTAUDIO_CFLAGS"; then pkg_cv_PORTAUDIO_CFLAGS="$PORTAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_CFLAGS=`$PKG_CONFIG --cflags "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PORTAUDIO_LIBS"; then pkg_cv_PORTAUDIO_LIBS="$PORTAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_LIBS=`$PKG_CONFIG --libs "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` else PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PORTAUDIO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (portaudio-2.0 >= 19) were not met: $PORTAUDIO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PORTAUDIO_CFLAGS and PORTAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PORTAUDIO_CFLAGS and PORTAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PORTAUDIO_CFLAGS=$pkg_cv_PORTAUDIO_CFLAGS PORTAUDIO_LIBS=$pkg_cv_PORTAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_portaudio=yes ;; esac if test "x$ac_cv_portaudio" = "xyes"; then $as_echo "#define USE_PORTAUDIO 1" >>confdefs.h pkg_portaudio_version=`$PKG_CONFIG --modversion "portaudio-2.0 >= 19" 2>/dev/null` else $as_echo "#define USE_PORTAUDIO 0" >>confdefs.h pkg_portaudio_version="" fi cat >>confdefs.h <<_ACEOF #define PORTAUDIO_BUILD_VERSION "$pkg_portaudio_version" _ACEOF : fi ### pulseaudio # Set ac_cv_pulseaudio to yes/no # Define USE_PULSEAUDIO in config.h # Substitute PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS in Makefile # Check whether --with-pulseaudio was given. if test "${with_pulseaudio+set}" = set; then : withval=$with_pulseaudio; case "${withval}" in yes|no) ac_cv_want_pulseaudio="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-pulseaudio" "$LINENO" 5 ;; esac else ac_cv_want_pulseaudio=check fi test "x$ac_cv_want_pulseaudio" = "x" && ac_cv_want_pulseaudio="check" case "x$ac_cv_want_pulseaudio" in "xno") ac_cv_pulseaudio=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSEAUDIO" >&5 $as_echo_n "checking for PULSEAUDIO... " >&6; } if test -n "$PULSEAUDIO_CFLAGS"; then pkg_cv_PULSEAUDIO_CFLAGS="$PULSEAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_CFLAGS=`$PKG_CONFIG --cflags "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PULSEAUDIO_LIBS"; then pkg_cv_PULSEAUDIO_LIBS="$PULSEAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_LIBS=`$PKG_CONFIG --libs "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` else PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PULSEAUDIO_PKG_ERRORS" >&5 ac_cv_pulseaudio=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_pulseaudio=no else PULSEAUDIO_CFLAGS=$pkg_cv_PULSEAUDIO_CFLAGS PULSEAUDIO_LIBS=$pkg_cv_PULSEAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_pulseaudio=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSEAUDIO" >&5 $as_echo_n "checking for PULSEAUDIO... " >&6; } if test -n "$PULSEAUDIO_CFLAGS"; then pkg_cv_PULSEAUDIO_CFLAGS="$PULSEAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_CFLAGS=`$PKG_CONFIG --cflags "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PULSEAUDIO_LIBS"; then pkg_cv_PULSEAUDIO_LIBS="$PULSEAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_LIBS=`$PKG_CONFIG --libs "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` else PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PULSEAUDIO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpulse-simple >= 0.9.7) were not met: $PULSEAUDIO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PULSEAUDIO_CFLAGS=$pkg_cv_PULSEAUDIO_CFLAGS PULSEAUDIO_LIBS=$pkg_cv_PULSEAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_pulseaudio=yes ;; esac if test "x$ac_cv_pulseaudio" = "xyes"; then $as_echo "#define USE_PULSEAUDIO 1" >>confdefs.h pkg_pulseaudio_version=`$PKG_CONFIG --modversion "libpulse-simple >= 0.9.7" 2>/dev/null` else $as_echo "#define USE_PULSEAUDIO 0" >>confdefs.h pkg_pulseaudio_version="" fi cat >>confdefs.h <<_ACEOF #define PULSEAUDIO_BUILD_VERSION "$pkg_pulseaudio_version" _ACEOF : if test "x$ac_cv_oss" = "xno" && \ test "x$ac_cv_portaudio" = "xno" && \ test "x$ac_cv_pulseaudio" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** $PACKAGE will be compiled without audio device support ***" >&5 $as_echo "$as_me: WARNING: *** $PACKAGE will be compiled without audio device support ***" >&2;} fi ### hamlib # Set ac_cv_hamlib to yes/no # Define USE_HAMLIB in config.h # Substitute HAMLIB_CFLAGS and HAMLIB_LIBS in Makefile # Set ENABLE_HAMLIB Makefile conditional # Check whether --with-hamlib was given. if test "${with_hamlib+set}" = set; then : withval=$with_hamlib; case "${withval}" in yes|no) ac_cv_want_hamlib="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-hamlib" "$LINENO" 5 ;; esac else ac_cv_want_hamlib=check fi test "x$ac_cv_want_hamlib" = "x" && ac_cv_want_hamlib="check" case "x$ac_cv_want_hamlib" in "xno") ac_cv_hamlib=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HAMLIB" >&5 $as_echo_n "checking for HAMLIB... " >&6; } if test -n "$HAMLIB_CFLAGS"; then pkg_cv_HAMLIB_CFLAGS="$HAMLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_CFLAGS=`$PKG_CONFIG --cflags "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$HAMLIB_LIBS"; then pkg_cv_HAMLIB_LIBS="$HAMLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_LIBS=`$PKG_CONFIG --libs "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then HAMLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` else HAMLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$HAMLIB_PKG_ERRORS" >&5 ac_cv_hamlib=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_hamlib=no else HAMLIB_CFLAGS=$pkg_cv_HAMLIB_CFLAGS HAMLIB_LIBS=$pkg_cv_HAMLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_hamlib=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HAMLIB" >&5 $as_echo_n "checking for HAMLIB... " >&6; } if test -n "$HAMLIB_CFLAGS"; then pkg_cv_HAMLIB_CFLAGS="$HAMLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_CFLAGS=`$PKG_CONFIG --cflags "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$HAMLIB_LIBS"; then pkg_cv_HAMLIB_LIBS="$HAMLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_LIBS=`$PKG_CONFIG --libs "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then HAMLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` else HAMLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$HAMLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (hamlib >= 1.2.4) were not met: $HAMLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables HAMLIB_CFLAGS and HAMLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables HAMLIB_CFLAGS and HAMLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else HAMLIB_CFLAGS=$pkg_cv_HAMLIB_CFLAGS HAMLIB_LIBS=$pkg_cv_HAMLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_hamlib=yes ;; esac if test "x$ac_cv_hamlib" = "xyes"; then $as_echo "#define USE_HAMLIB 1" >>confdefs.h pkg_hamlib_version=`$PKG_CONFIG --modversion "hamlib >= 1.2.4" 2>/dev/null` else $as_echo "#define USE_HAMLIB 0" >>confdefs.h pkg_hamlib_version="" fi cat >>confdefs.h <<_ACEOF #define HAMLIB_BUILD_VERSION "$pkg_hamlib_version" _ACEOF if test "x$ac_cv_hamlib" = "xyes"; then ENABLE_HAMLIB_TRUE= ENABLE_HAMLIB_FALSE='#' else ENABLE_HAMLIB_TRUE='#' ENABLE_HAMLIB_FALSE= fi # We compile our own copy of hamlib's locator.c if hamlib is not available # or if it is version <= 1.2.9, which has a broken azimuth_long_path function # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$pkg_hamlib_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "1.2.9" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then need_locator_c=yes else need_locator_c=no fi if test "$need_locator_c" = "yes"; then NEED_HAMLIB_LOCATOR_TRUE= NEED_HAMLIB_LOCATOR_FALSE='#' else NEED_HAMLIB_LOCATOR_TRUE='#' NEED_HAMLIB_LOCATOR_FALSE= fi ### X11 # Set ac_cv_x to yes/no # Define USE_X in config.h # Substitute X_CFLAGS and X_LIBS in Makefile if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then test "x$ac_cv_want_x" = "x" && ac_cv_want_x="check" case "x$ac_cv_want_x" in "xno") ac_cv_x=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } if test -n "$X_CFLAGS"; then pkg_cv_X_CFLAGS="$X_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_CFLAGS=`$PKG_CONFIG --cflags "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$X_LIBS"; then pkg_cv_X_LIBS="$X_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_LIBS=`$PKG_CONFIG --libs "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then X_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "x11" 2>&1` else X_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "x11" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$X_PKG_ERRORS" >&5 ac_cv_x=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_x=no else X_CFLAGS=$pkg_cv_X_CFLAGS X_LIBS=$pkg_cv_X_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_x=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } if test -n "$X_CFLAGS"; then pkg_cv_X_CFLAGS="$X_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_CFLAGS=`$PKG_CONFIG --cflags "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$X_LIBS"; then pkg_cv_X_LIBS="$X_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_LIBS=`$PKG_CONFIG --libs "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then X_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "x11" 2>&1` else X_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "x11" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$X_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (x11) were not met: $X_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables X_CFLAGS and X_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables X_CFLAGS and X_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else X_CFLAGS=$pkg_cv_X_CFLAGS X_LIBS=$pkg_cv_X_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_x=yes ;; esac if test "x$ac_cv_x" = "xyes"; then $as_echo "#define USE_X 1" >>confdefs.h pkg_x_version=`$PKG_CONFIG --modversion "x11" 2>/dev/null` else $as_echo "#define USE_X 0" >>confdefs.h pkg_x_version="" fi cat >>confdefs.h <<_ACEOF #define X_BUILD_VERSION "$pkg_x_version" _ACEOF : fi ### libflxmlrpc # Set ac_cv_flxmlrpc to yes/no # Define USE_FLXMLRPC in config.h # Substitute FLXMLRPC_CFLAGS and FLXMLRPC_LIBS in Makefile # Check whether --with-flxmlrpc was given. if test "${with_flxmlrpc+set}" = set; then : withval=$with_flxmlrpc; case "${withval}" in yes|no) ac_cv_want_flxmlrpc="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-flxmlrpc" "$LINENO" 5 ;; esac else ac_cv_want_flxmlrpc=check fi test "x$ac_cv_want_flxmlrpc" = "x" && ac_cv_want_flxmlrpc="check" case "x$ac_cv_want_flxmlrpc" in "xno") ac_cv_flxmlrpc=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLXMLRPC" >&5 $as_echo_n "checking for FLXMLRPC... " >&6; } if test -n "$FLXMLRPC_CFLAGS"; then pkg_cv_FLXMLRPC_CFLAGS="$FLXMLRPC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flxmlrpc >= 0.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "flxmlrpc >= 0.1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLXMLRPC_CFLAGS=`$PKG_CONFIG --cflags "flxmlrpc >= 0.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FLXMLRPC_LIBS"; then pkg_cv_FLXMLRPC_LIBS="$FLXMLRPC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flxmlrpc >= 0.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "flxmlrpc >= 0.1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLXMLRPC_LIBS=`$PKG_CONFIG --libs "flxmlrpc >= 0.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FLXMLRPC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "flxmlrpc >= 0.1.0" 2>&1` else FLXMLRPC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "flxmlrpc >= 0.1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FLXMLRPC_PKG_ERRORS" >&5 ac_cv_flxmlrpc=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_flxmlrpc=no else FLXMLRPC_CFLAGS=$pkg_cv_FLXMLRPC_CFLAGS FLXMLRPC_LIBS=$pkg_cv_FLXMLRPC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_flxmlrpc=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLXMLRPC" >&5 $as_echo_n "checking for FLXMLRPC... " >&6; } if test -n "$FLXMLRPC_CFLAGS"; then pkg_cv_FLXMLRPC_CFLAGS="$FLXMLRPC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flxmlrpc >= 0.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "flxmlrpc >= 0.1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLXMLRPC_CFLAGS=`$PKG_CONFIG --cflags "flxmlrpc >= 0.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FLXMLRPC_LIBS"; then pkg_cv_FLXMLRPC_LIBS="$FLXMLRPC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flxmlrpc >= 0.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "flxmlrpc >= 0.1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLXMLRPC_LIBS=`$PKG_CONFIG --libs "flxmlrpc >= 0.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FLXMLRPC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "flxmlrpc >= 0.1.0" 2>&1` else FLXMLRPC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "flxmlrpc >= 0.1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FLXMLRPC_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (flxmlrpc >= 0.1.0) were not met: $FLXMLRPC_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FLXMLRPC_CFLAGS and FLXMLRPC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FLXMLRPC_CFLAGS and FLXMLRPC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FLXMLRPC_CFLAGS=$pkg_cv_FLXMLRPC_CFLAGS FLXMLRPC_LIBS=$pkg_cv_FLXMLRPC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_flxmlrpc=yes ;; esac if test "x$ac_cv_flxmlrpc" = "xyes"; then $as_echo "#define USE_FLXMLRPC 1" >>confdefs.h pkg_flxmlrpc_version=`$PKG_CONFIG --modversion "flxmlrpc >= 0.1.0" 2>/dev/null` else $as_echo "#define USE_FLXMLRPC 0" >>confdefs.h pkg_flxmlrpc_version="" fi cat >>confdefs.h <<_ACEOF #define FLXMLRPC_BUILD_VERSION "$pkg_flxmlrpc_version" _ACEOF if test "x$ac_cv_flxmlrpc" = "xyes"; then ENABLE_FLXMLRPC_TRUE= ENABLE_FLXMLRPC_FALSE='#' else ENABLE_FLXMLRPC_TRUE='#' ENABLE_FLXMLRPC_FALSE= fi ### libmbedtls # Set ac_cv_mbedtls to yes/no # Define USE_LIBMBEDTLS in config.h # Substitute LIBMBEDTLS_CFLAGS and LIBMBEDTLS_LIBS in Makefile # Check whether --with-libmbedtls was given. if test "${with_libmbedtls+set}" = set; then : withval=$with_libmbedtls; case "${withval}" in yes|no) ac_cv_want_libmbedtls="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-libmbedtls" "$LINENO" 5 ;; esac else ac_cv_want_libmbedtls=check fi test "x$ac_cv_want_libmbedtls" = "x" && ac_cv_want_libmbedtls="check" case "x$ac_cv_want_libmbedtls" in "xno") ac_cv_libmbedtls=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBMBEDTLS" >&5 $as_echo_n "checking for LIBMBEDTLS... " >&6; } if test -n "$LIBMBEDTLS_CFLAGS"; then pkg_cv_LIBMBEDTLS_CFLAGS="$LIBMBEDTLS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmbedtls >= 2.16.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libmbedtls >= 2.16.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBMBEDTLS_CFLAGS=`$PKG_CONFIG --cflags "libmbedtls >= 2.16.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBMBEDTLS_LIBS"; then pkg_cv_LIBMBEDTLS_LIBS="$LIBMBEDTLS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmbedtls >= 2.16.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libmbedtls >= 2.16.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBMBEDTLS_LIBS=`$PKG_CONFIG --libs "libmbedtls >= 2.16.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBMBEDTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libmbedtls >= 2.16.0" 2>&1` else LIBMBEDTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libmbedtls >= 2.16.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBMBEDTLS_PKG_ERRORS" >&5 ac_cv_libmbedtls=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_libmbedtls=no else LIBMBEDTLS_CFLAGS=$pkg_cv_LIBMBEDTLS_CFLAGS LIBMBEDTLS_LIBS=$pkg_cv_LIBMBEDTLS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_libmbedtls=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBMBEDTLS" >&5 $as_echo_n "checking for LIBMBEDTLS... " >&6; } if test -n "$LIBMBEDTLS_CFLAGS"; then pkg_cv_LIBMBEDTLS_CFLAGS="$LIBMBEDTLS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmbedtls >= 2.16.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libmbedtls >= 2.16.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBMBEDTLS_CFLAGS=`$PKG_CONFIG --cflags "libmbedtls >= 2.16.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBMBEDTLS_LIBS"; then pkg_cv_LIBMBEDTLS_LIBS="$LIBMBEDTLS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmbedtls >= 2.16.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libmbedtls >= 2.16.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBMBEDTLS_LIBS=`$PKG_CONFIG --libs "libmbedtls >= 2.16.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBMBEDTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libmbedtls >= 2.16.0" 2>&1` else LIBMBEDTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libmbedtls >= 2.16.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBMBEDTLS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libmbedtls >= 2.16.0) were not met: $LIBMBEDTLS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBMBEDTLS_CFLAGS and LIBMBEDTLS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBMBEDTLS_CFLAGS and LIBMBEDTLS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBMBEDTLS_CFLAGS=$pkg_cv_LIBMBEDTLS_CFLAGS LIBMBEDTLS_LIBS=$pkg_cv_LIBMBEDTLS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_libmbedtls=yes ;; esac if test "x$ac_cv_libmbedtls" = "xyes"; then $as_echo "#define USE_LIBMBEDTLS 1" >>confdefs.h pkg_libmbedtls_version=`$PKG_CONFIG --modversion "libmbedtls >= 2.16.0" 2>/dev/null` else $as_echo "#define USE_LIBMBEDTLS 0" >>confdefs.h pkg_libmbedtls_version="" fi cat >>confdefs.h <<_ACEOF #define LIBMBEDTLS_BUILD_VERSION "$pkg_libmbedtls_version" _ACEOF if test "x$ac_cv_libmbedtls" = "xyes"; then ENABLE_LIBMBEDTLS_TRUE= ENABLE_LIBMBEDTLS_FALSE='#' else ENABLE_LIBMBEDTLS_TRUE='#' ENABLE_LIBMBEDTLS_FALSE= fi ### libintl # Substitute INTL_CFLAGS in Makefile # Substitute INTL_LIBS in Makefile # (default to LIBINTL) if test "x$INTL_LIBS" = "x"; then INTL_LIBS="$LIBINTL" fi ### asciidoc # substitute ASCIIDOC and A2X in doc/Makefile # set HAVE_ASCIIDOC Makefile conditional # Check whether --with-asciidoc was given. if test "${with_asciidoc+set}" = set; then : withval=$with_asciidoc; case "${withval}" in yes|no) ac_cv_want_asciidoc="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-asciidoc" "$LINENO" 5 ;; esac else ac_cv_want_asciidoc=check fi if test "x$ac_cv_want_asciidoc" != "xno"; then # Extract the first word of "asciidoc", so it can be a program name with args. set dummy asciidoc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ASCIIDOC+:} false; then : $as_echo_n "(cached) " >&6 else case $ASCIIDOC in [\\/]* | ?:[\\/]*) ac_cv_path_ASCIIDOC="$ASCIIDOC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ASCIIDOC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ASCIIDOC=$ac_cv_path_ASCIIDOC if test -n "$ASCIIDOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ASCIIDOC" >&5 $as_echo "$ASCIIDOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi asciidoc_min=8.2.0 if test "x$ASCIIDOC" != "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for asciidoc >= $asciidoc_min" >&5 $as_echo_n "checking for asciidoc >= $asciidoc_min... " >&6; } asciidoc_ver=$($ASCIIDOC --version | sed -n '1 s/.* //; p') # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$asciidoc_ver" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "$asciidoc_min" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($asciidoc_ver)" >&5 $as_echo "yes ($asciidoc_ver)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no ($asciidoc_ver)" >&5 $as_echo "no ($asciidoc_ver)" >&6; }; ASCIIDOC="" fi fi if test "x$ASCIIDOC" != "x"; then # Extract the first word of "a2x", so it can be a program name with args. set dummy a2x; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_A2X+:} false; then : $as_echo_n "(cached) " >&6 else case $A2X in [\\/]* | ?:[\\/]*) ac_cv_path_A2X="$A2X" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_A2X="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi A2X=$ac_cv_path_A2X if test -n "$A2X"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $A2X" >&5 $as_echo "$A2X" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$asciidoc_ver" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "8.3.0" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then no_xmllint=yes else no_xmllint=no fi fi if test "x$ac_cv_want_asciidoc" = "xyes"; then if test "x$ASCIIDOC" = "x" -o "x$A2X" = "x"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-asciidoc was given, but check for asciidoc failed See \`config.log' for more details" "$LINENO" 5; } elif test "x$A2X" = "x"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-asciidoc was given, but check for a2x failed See \`config.log' for more details" "$LINENO" 5; } fi fi fi if test "x$ASCIIDOC" != "x" -a "x$A2X" != "x"; then HAVE_ASCIIDOC_TRUE= HAVE_ASCIIDOC_FALSE='#' else HAVE_ASCIIDOC_TRUE='#' HAVE_ASCIIDOC_FALSE= fi if test "$no_xmllint" = "yes"; then HAVE_ASCIIDOC_NO_XMLLINT_TRUE= HAVE_ASCIIDOC_NO_XMLLINT_FALSE='#' else HAVE_ASCIIDOC_NO_XMLLINT_TRUE='#' HAVE_ASCIIDOC_NO_XMLLINT_FALSE= fi ### build info # Define various build variables in config.h # Define build flags and substitute in Makefile.in # CPPFLAGS FLDIGI_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include \ -I\$(srcdir)/irrxml \ -I\$(srcdir)/libtiniconv \ -I\$(srcdir)/fileselector" if test "x$ac_cv_flxmlrpc" != "xyes"; then FLDIGI_BUILD_CPPFLAGS="$FLDIGI_BUILD_CPPFLAGS -I\$(srcdir)/xmlrpcpp" fi if test "x$ac_cv_libmbedtls" != "xyes"; then FLDIGI_BUILD_CPPFLAGS="$FLDIGI_BUILD_CPPFLAGS -I\$(srcdir)/mbedtls" fi # CXXFLAGS FLDIGI_BUILD_CXXFLAGS="\ $PORTAUDIO_CFLAGS $FLTK_CFLAGS $X_CFLAGS \ $SNDFILE_CFLAGS $SAMPLERATE_CFLAGS $PULSEAUDIO_CFLAGS \ $HAMLIB_CFLAGS $PNG_CFLAGS $XMLRPC_CFLAGS $MAC_UNIVERSAL_CFLAGS \ $LIBMBEDTLS_CFLAGS \ $INTL_CFLAGS $PTW32_CFLAGS $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" # CFLAGS FLDIGI_BUILD_CFLAGS="$LIBMBEDTLS_CFLAGS -pipe -Wall -fexceptions" if test "x$target_darwin" = "xno"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS --param=max-vartrack-size=0" fi if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="-mthreads $FLDIGI_BUILD_CXXFLAGS" fi if test "x$ac_cv_flxmlrpc" != "xyes"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -I\$(srcdir)/xmlrpcpp" fi # LDFLAGS FLDIGI_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_LDFLAGS="-mthreads $FLDIGI_BUILD_LDFLAGS" fi # LDADD FLDIGI_BUILD_LDADD="\ $PORTAUDIO_LIBS $FLTK_LIBS $X_LIBS \ $SNDFILE_LIBS $SAMPLERATE_LIBS $PULSEAUDIO_LIBS \ $HAMLIB_LIBS $PNG_LIBS $XMLRPC_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS \ $EXTRA_LIBS $FLXMLRPC_LIBS $LIBMBEDTLS_LIBS" # CPPFLAGS FLARQ_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include -I\$(srcdir)/fileselector \ -I\$(srcdir)/flarq-src -I\$(srcdir)/flarq-src/include" if test "x$target_darwin" = "xno"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS --param=max-vartrack-size=0" fi if test "x$ac_cv_flxmlrpc" != "xyes"; then FLARQ_BUILD_CPPFLAGS="$FLARQ_BUILD_CPPFLAGS -I\$(srcdir)/xmlrpcpp" fi # CXXFLAGS FLARQ_BUILD_CXXFLAGS="$FLTK_CFLAGS $X_CFLAGS $MAC_UNIVERSAL_CFLAGS $INTL_CFLAGS $PTW32_CFLAGS \ $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_CXXFLAGS="-mthreads $FLARQ_BUILD_CXXFLAGS" fi if test "x$ac_cv_flxmlrpc" != "xyes"; then FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -I\$(srcdir)/xmlrpcpp" fi if test "x$ac_cv_libmbedtls" == "xyes"; then FLDIGI_BUILD_LDADD="$FLDIGI_BUILD_LDADD $LIBMBEDTLS_LDFLAGS" fi # LDFLAGS FLARQ_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_LDFLAGS="-mthreads $FLARQ_BUILD_LDFLAGS" fi # LDADD FLARQ_BUILD_LDADD="$FLTK_LIBS $X_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS $FLXMLRPC_LIBS" if test "x$ac_cv_debug" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -UNDEBUG" FLDIGI_BUILD_LDFLAGS="$FLDIGI_BUILD_LDFLAGS $RDYNAMIC" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -UNDEBUG" FLARQ_BUILD_LDFLAGS="$FLARQ_BUILD_LDFLAGS $RDYNAMIC" else FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -DNDEBUG" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -DNDEBUG" fi #define build variables for config.h cat >>confdefs.h <<_ACEOF #define BUILD_BUILD_PLATFORM "$build" _ACEOF cat >>confdefs.h <<_ACEOF #define BUILD_HOST_PLATFORM "$host" _ACEOF cat >>confdefs.h <<_ACEOF #define BUILD_TARGET_PLATFORM "$target" _ACEOF test "x$LC_ALL" != "x" && LC_ALL_saved="$LC_ALL" LC_ALL=C export LC_ALL ac_sh_dq="\"`echo $ac_configure_args | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_CONFIGURE_ARGS $ac_sh_dq _ACEOF # Allow BUILD_DATE, BUILD_USER, BUILD_HOST to be externally overridden by # environment variables. ac_sh_dq="\"$BUILD_DATE\"" test "x$BUILD_DATE" = "x" && ac_sh_dq="\"`date | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_DATE $ac_sh_dq _ACEOF ac_sh_dq="\"$BUILD_USER\"" test "x$BUILD_USER" = "x" && ac_sh_dq="\"`whoami | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_USER $ac_sh_dq _ACEOF ac_sh_dq="\"$BUILD_HOST\"" test "x$BUILD_HOST" = "x" && ac_sh_dq="\"`hostname | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_HOST $ac_sh_dq _ACEOF ac_sh_dq="\"`$CXX -v 2>&1 | tail -1 | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_COMPILER $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLDIGI_BUILD_CPPFLAGS $FLDIGI_BUILD_CXXFLAGS | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLDIGI_BUILD_CXXFLAGS $ac_sh_dq _ACEOF cat >>confdefs.h <<_ACEOF #define FLDIGI_BUILD_CFLAGS $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLDIGI_BUILD_LDFLAGS $FLDIGI_BUILD_LDADD | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLDIGI_BUILD_LDFLAGS $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLARQ_BUILD_CPPFLAGS $FLARQ_BUILD_CXXFLAGS | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLARQ_BUILD_CXXFLAGS $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLARQ_BUILD_LDFLAGS $FLARQ_BUILD_LDADD | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLARQ_BUILD_LDFLAGS $ac_sh_dq _ACEOF if test "x$LC_ALL_saved" != "x"; then LC_ALL="$LC_ALL_saved" export LC_ALL fi ### silent build rules SILENT_CMDS='silent_cmd = @echo " $(1)" $(2); ifeq ($(AM_DEFAULT_VERBOSITY),0) silent = $(if $(subst 0,,$(V)),,$(silent_cmd)) else ifeq ($(V),0) silent = $(silent_cmd) endif endif' ### output ac_config_files="$ac_config_files Makefile src/Makefile po/Makefile.in doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_NLS_TRUE}" && test -z "${USE_NLS_FALSE}"; then as_fn_error $? "conditional \"USE_NLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WANT_FLDIGI_TRUE}" && test -z "${WANT_FLDIGI_FALSE}"; then as_fn_error $? "conditional \"WANT_FLDIGI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WANT_FLARQ_TRUE}" && test -z "${WANT_FLARQ_FALSE}"; then as_fn_error $? "conditional \"WANT_FLARQ\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DARWIN_TRUE}" && test -z "${DARWIN_FALSE}"; then as_fn_error $? "conditional \"DARWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WINDRES_TRUE}" && test -z "${HAVE_WINDRES_FALSE}"; then as_fn_error $? "conditional \"HAVE_WINDRES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_NSIS_TRUE}" && test -z "${HAVE_NSIS_FALSE}"; then as_fn_error $? "conditional \"HAVE_NSIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then as_fn_error $? "conditional \"WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MINGW32_TRUE}" && test -z "${MINGW32_FALSE}"; then as_fn_error $? "conditional \"MINGW32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COMPAT_REGEX_TRUE}" && test -z "${COMPAT_REGEX_FALSE}"; then as_fn_error $? "conditional \"COMPAT_REGEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COMPAT_STRCASESTR_TRUE}" && test -z "${COMPAT_STRCASESTR_FALSE}"; then as_fn_error $? "conditional \"COMPAT_STRCASESTR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_DEBUG_TRUE}" && test -z "${ENABLE_DEBUG_FALSE}"; then as_fn_error $? "conditional \"ENABLE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COMPAT_STACK_TRUE}" && test -z "${COMPAT_STACK_FALSE}"; then as_fn_error $? "conditional \"COMPAT_STACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_BENCHMARK_TRUE}" && test -z "${ENABLE_BENCHMARK_FALSE}"; then as_fn_error $? "conditional \"ENABLE_BENCHMARK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_FLUID_TRUE}" && test -z "${HAVE_FLUID_FALSE}"; then as_fn_error $? "conditional \"HAVE_FLUID\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_HAMLIB_TRUE}" && test -z "${ENABLE_HAMLIB_FALSE}"; then as_fn_error $? "conditional \"ENABLE_HAMLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NEED_HAMLIB_LOCATOR_TRUE}" && test -z "${NEED_HAMLIB_LOCATOR_FALSE}"; then as_fn_error $? "conditional \"NEED_HAMLIB_LOCATOR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FLXMLRPC_TRUE}" && test -z "${ENABLE_FLXMLRPC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FLXMLRPC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_LIBMBEDTLS_TRUE}" && test -z "${ENABLE_LIBMBEDTLS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_LIBMBEDTLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ASCIIDOC_TRUE}" && test -z "${HAVE_ASCIIDOC_FALSE}"; then as_fn_error $? "conditional \"HAVE_ASCIIDOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ASCIIDOC_NO_XMLLINT_TRUE}" && test -z "${HAVE_ASCIIDOC_NO_XMLLINT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ASCIIDOC_NO_XMLLINT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by fldigi $as_me 4.1.06, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ fldigi config.status 4.1.06 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ### summary { $as_echo "$as_me:${as_lineno-$LINENO}: result: Configuration summary: Version ..................... $VERSION Static linking .............. $ac_cv_static CPU optimizations ........... $ac_cv_opt Debugging ................... $ac_cv_debug fldigi ...................... $ac_cv_want_fldigi flarq ....................... $ac_cv_want_flarq i18n ........................ $USE_NLS " >&5 $as_echo " Configuration summary: Version ..................... $VERSION Static linking .............. $ac_cv_static CPU optimizations ........... $ac_cv_opt Debugging ................... $ac_cv_debug fldigi ...................... $ac_cv_want_fldigi flarq ....................... $ac_cv_want_flarq i18n ........................ $USE_NLS " >&6; } ac_xmlrpc_report="internal lib"; if test "x$ac_cv_flxmlrpc" = "xyes"; then ac_xmlrpc_report="external lib"; fi ac_mbedtls_report="internal lib"; if test "x$ac_cv_libmbedtls" = "xyes"; then ac_mbedtls_report="external lib"; fi if test "x$ac_cv_want_fldigi" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: fldigi build options: sndfile ..................... $ac_cv_sndfile oss ......................... $ac_cv_oss portaudio ................... $ac_cv_portaudio pulseaudio .................. $ac_cv_pulseaudio libmbedtls .................. $ac_mbedtls_report flxmlrpc .................... $ac_xmlrpc_report hamlib ...................... $ac_cv_hamlib " >&5 $as_echo " fldigi build options: sndfile ..................... $ac_cv_sndfile oss ......................... $ac_cv_oss portaudio ................... $ac_cv_portaudio pulseaudio .................. $ac_cv_pulseaudio libmbedtls .................. $ac_mbedtls_report flxmlrpc .................... $ac_xmlrpc_report hamlib ...................... $ac_cv_hamlib " >&6; } fi fldigi-4.1.06/doc/0000775000175000017500000000000013515625025010614 500000000000000fldigi-4.1.06/doc/flarq.10000644000175000017500000000003513472115742011721 00000000000000.TH "NOT-BUILT" "1" "" "" "" fldigi-4.1.06/doc/asciidoc.conf0000644000175000017500000000003313472115742013155 00000000000000[miscellaneous] newline=\n fldigi-4.1.06/doc/Makefile.am0000644000175000017500000000435313472115742012575 00000000000000# Copyright (C) 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # License: GPLv3+: GNU GPL version 3 or later. ASCIIDOC_CONF = asciidoc.conf ASCIIDOC_SRC = fldigi.1.txt flarq.1.txt guide.txt ASCIIDOC_MAN_DIST = fldigi.1 flarq.1 ASCIIDOC_MAN_INST = ASCIIDOC_HTML = if WANT_FLDIGI ASCIIDOC_MAN_INST += fldigi.1 ASCIIDOC_HTML += guide.html endif if WANT_FLARQ ASCIIDOC_MAN_INST += flarq.1 endif EXTRA_DIST = $(ASCIIDOC_CONF) $(ASCIIDOC_SRC) $(ASCIIDOC_MAN_DIST) man_MANS = $(ASCIIDOC_MAN_INST) MOSTLYCLEANFILES = *.xml DISTCLEANFILES = $(ASCIIDOC_HTML) MAINTAINERCLEANFILES = $(ASCIIDOC_MAN_INST) A2X_ARGS = --format=manpage if HAVE_ASCIIDOC_NO_XMLLINT A2X_ARGS += --no-xmllint endif .SECONDEXPANSION: # Define the custom silent rule function @SILENT_CMDS@ %.1: $$@.txt $(ASCIIDOC_CONF) if HAVE_ASCIIDOC $(call silent,ADOC ,$@)TZ=0 $(A2X) $(A2X_ARGS) $< else $(call silent,ADOC ,$@)echo '.TH "NOT-BUILT" "1" "" "" ""' > $@ endif # Without .SECONDEXPANSION we would use something like this: #$(ASCIIDOC_MAN_INST): asciidoc.conf # a2x $(A2X_ARGS) $@.txt #fldigi.1: fldigi.1.txt # The rest of the Makefile is enabled only if we have asciidoc if HAVE_ASCIIDOC # Try to discover the correct iconsdir. Use the first one that # contains an entry matching `tip.*'. ASCIIDOC_ICONS_DIRS := /etc/asciidoc/icons /etc/asciidoc/images /etc/asciidoc/images/icons /etc/asciidoc/images/../icons \ /usr/share/asciidoc/icons /usr/share/asciidoc/images /usr/share/asciidoc/images/icons ASCIIDOC_ICONS_DIR ?= $(dir $(firstword $(strip $(foreach f,$(addsuffix /tip*,$(ASCIIDOC_ICONS_DIRS)),$(wildcard $(f)))))) # Additional attributes are defined in guide.conf ASCIIDOC_ARGS = --unsafe -a toc -a data-uri -a badges -a icons -a iconsdir=$(ASCIIDOC_ICONS_DIR) %.html: $$*.txt $(ASCIIDOC_CONF) @if ! test -d $(ASCIIDOC_ICONS_DIR); then \ echo " *** The default asciidoc icons directory, \"$(ASCIIDOC_ICONS_DIR)\", does not exist." >&2; \ echo " *** Please rerun make with the correct ASCIIDOC_ICONS_DIR, e.g.:" >&2; \ echo " *** make ASCIIDOC_ICONS_DIR=/path/to/icons" >&2; \ false; \ fi $(call silent,ADOC ,$@)TZ=0 $(ASCIIDOC) $(ASCIIDOC_ARGS) --out-file $@ $< all-local: $(ASCIIDOC_MAN_DIST) $(ASCIIDOC_HTML) endif fldigi-4.1.06/doc/fldigi.10000664000175000017500000004421713507124765012072 00000000000000'\" t .\" Title: fldigi .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.79.1 .\" Date: 07/03/2019 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" .TH "FLDIGI" "1" "07/03/2019" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" fldigi \- digital modem program for hamradio operators .SH "SYNOPSIS" .sp \fBfldigi\fR [\fIOPTIONS\fR] .SH "DESCRIPTION" .sp \fBFldigi\fR is a cross\-platform multi\-modem program for most of the digital modes used by radio amateurs today: CW, PSK, MFSK, MT\-63, RTTY, Hellschreiber, DominoEX, Olivia, THOR and Throb are all supported\&. It can also help calibrate a sound card to a time signal and do on\-air frequency measurement tests\&. Fldigi features basic rig control, logging, and contest operation, \(lqpanoramic\(rq PSK decoding, a PSK Reporter client, and remote control via XML\-RPC\&. .SH "OPTIONS" .sp Long options begin with two hyphens and are handled by fldigi\&. The option names may be abbreviated to any unambiguous substring, and the option argument may be separated from the name by a space or equals sign, as per getopt(3)\&. .sp Short options begin with a single hyphen and are passed directly to FLTK\&. They may be abbreviated only as indicated\&. .PP \fB\-\-config\-dir\fR \fIDIRECTORY\fR .RS 4 Look for and store configuration files in directory \fIDIRECTORY\fR, which is created if it does not exist\&. Defaults to \(lq$HOME/\&.fldigi\(rq\&. .RE .PP \fB\-\-rx\-ipc\-key\fR \fIKEY\fR .RS 4 Set the receive message queue key\&. May be given in hex if prefixed with \(lq0x\(rq\&. Defaults to \(lq9876\(rq or \(lq0x2694\(rq\&. .RE .PP \fB\-\-tx\-ipc\-key\fR \fIKEY\fR .RS 4 Set the transmit message queue key\&. May be given in hex if prefixed with \(lq0x\(rq\&. Defaults to \(lq6789\(rq or \(lq0x1a85\(rq\&. .RE .PP \fB\-\-arq\-server\-address\fR \fIHOSTNAME\fR .RS 4 Set the ARQ TCP server address\&. Defaults to \(lq127\&.0\&.0\&.1\(rq\&. \fIHOSTNAME\fR may be any \fInode name\fR string accepted by getaddrinfo(3)\&. .RE .PP \fB\-\-arq\-server\-port\fR \fIPORT\fR .RS 4 Set the ARQ TCP server port\&. Defaults to \(lq7322\(rq\&. \fIPORT\fR may be any \fIservice name\fR string accepted by getaddrinfo(3)\&. .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .sp The \fI\-\-xmlrpc\-*\fR options are only available if fldigi was built with XML\-RPC support\&. .sp .5v .RE .PP \fB\-\-xmlrpc\-server\-address\fR \fIHOSTNAME\fR .RS 4 Set the XML\-RPC server address\&. Defaults to \(lq127\&.0\&.0\&.1\(rq\&. .RE .PP \fB\-\-xmlrpc\-server\-port\fR \fIPORT\fR .RS 4 Set the XML\-RPC server port\&. Defaults to \(lq7362\(rq\&. .RE .PP \fB\-\-xmlrpc\-allow\fR \fIREGEX\fR .RS 4 Allow only the methods whose names match \fIREGEX\fR\&. \fIREGEX\fR is a POSIX extended regular expression\&. .RE .PP \fB\-\-xmlrpc\-deny\fR \fIREGEX\fR .RS 4 Allow only the methods whose names do not match \fIREGEX\fR\&. .RE .PP \fB\-\-xmlrpc\-list\fR .RS 4 List all available XML\-RPC methods and exit\&. May be preceded by the \fI\-\-xmlrpc\-allow\fR or \fI\-\-xmlrpc\-deny\fR options to verify their effect\&. .RE .PP \fB\-\-cpu\-speed\-test\fR .RS 4 Perform the CPU speed test that is normally done when fldigi is run without an existing configuration directory\&. Results are shown in the event log and options may be changed to the recommended values for the measured CPU speed\&. .RE .PP \fB\-\-noise\fR .RS 4 Unhide controls for adding noise to the transmitted signal\&. .RE .PP \fB\-\-wfall\-only\fR .RS 4 Hide all main window widgets except the menu bar and waterfall (with its associated controls)\&. Meant to be used with external programs that control fldigi with XML\-RPC\&. .RE .PP \fB\-\-debug\-level\fR \fILEVEL\fR .RS 4 Set the event log verbosity\&. \fILEVEL\fR is clamped to the range [0,5]; for \fIQuiet\fR, \fIError\fR, \fIWarning\fR, \fIInfo\fR, \fIVerbose\fR and \fIDebug\fR\&. Defaults to \(lq3\(rq (\fIInfo\fR)\&. .RE .PP \fB\-\-version\fR .RS 4 Print version information and exit\&. .RE .PP \fB\-\-build\-info\fR .RS 4 Print build information and exit\&. .RE .PP \fB\-\-help\fR .RS 4 Print options summary and exit\&. .RE .SS "Standard FLTK options" .PP \fB\-bg, \-background\fR \fICOLOUR\fR .RS 4 Set the background colour\&. .RE .PP \fB\-bg2, \-background2\fR \fICOLOUR\fR .RS 4 Set the secondary (text) background colour\&. .RE .PP \fB\-di, \-display\fR \fIDISPLAY\fR .RS 4 Specifies the X server to connect to; see X(7)\&. .RE .PP \fB\-dn, \-dnd\fR or \fB\-nodn, \-nodnd\fR .RS 4 Enable or disable drag and drop copy and paste in text fields\&. .RE .PP \fB\-fg, \-foreground\fR \fICOLOUR\fR .RS 4 Set the foreground colour\&. .RE .PP \fB\-g, \-geometry\fR \fIGEOMETRY\fR .RS 4 Set the initial window size and position\&. \fBFldigi may not honour this option\fR\&. .RE .PP \fB\-i, \-iconic\fR .RS 4 Start fldigi in iconified state\&. \fBFldigi may not honour this option\fR\&. .RE .PP \fB\-k, \-kbd\fR or \fB\-nok, \-nokbd\fR .RS 4 Enable or disable visible keyboard focus in non\-text widgets\&. .RE .PP \fB\-na, \-name\fR \fICLASSNAME\fR .RS 4 Set the window class\&. Defaults to \(lqFldigi\(rq\&. .RE .PP \fB\-ti, \-title\fR \fIWINDOWTITLE\fR .RS 4 Set the window title\&. Defaults to \(lqfldigi \- \(rq\&. .RE .SS "Additional UI options" .PP \fB\-\-font\fR \fIFONT[:SIZE]\fR .RS 4 Set the widget font and (optionally) size\&. Defaults to \(lqsans:12\(rq\&. .RE .SS "Options useful to developers" .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .sp The \-\-benchmark\-* options are only enabled if fldigi was built (exclusively) for benchmarking and batch decoding\&. .sp .5v .RE .PP \fB\-\-benchmark\-modem\fR \fIID\fR .RS 4 Specify the modem\&. Defaults to \(lq25\(rq (\(lqBPSK31\(rq)\&. .RE .PP \fB\-\-benchmark\-frequency\fR \fIFREQ\fR .RS 4 Set the modem frequency in Hz\&. Defaults to \(lq1000\(rq\&. .RE .PP \fB\-\-benchmark\-afc\fR \fIBOOLEAN\fR .RS 4 Enable or disable modem AFC\&. Defaults to \(lqfalse\(rq\&. .RE .PP \fB\-\-benchmark\-squelch\fR \fIBOOLEAN\fR .RS 4 Enable or disable modem squelch\&. Defaults to \(lqfalse\(rq\&. .RE .PP \fB\-\-benchmark\-squelch\-level\fR \fILEVEL\fR .RS 4 Set the modem squelch level (1\(em100%)\&. Defaults to \(lq0\&.0\(rq\&. .RE .PP \fB\-\-benchmark\-input\fR \fIINPUT\fR .RS 4 Specify the input\&. Must be a positive integer indicating the number of samples of silence to generate as the input, or, if fldigi was linked with libsndfile, the name of the input audio file\&. The filename must contain non\-digit characters\&. .RE .PP \fB\-\-benchmark\-output\fR \fIFILE\fR .RS 4 Specify the output data file\&. Non\-textual output (i\&.e\&. Hellschreiber or MFSK images) cannot be saved\&. Default: decoder output is discarded\&. .RE .PP \fB\-\-benchmark\-src\-ratio\fR \fIRATIO\fR .RS 4 Specify the sample rate conversion ratio\&. Defaults to \(lq1\&.0\(rq (input is not resampled)\&. .RE .PP \fB\-\-benchmark\-src\-type\fR \fITYPE\fR .RS 4 Set the sample rate conversion type\&. TYPE is an integer in the range [0,4]\&. Defaults to \(lq2\(rq (\(lqFastest SINC Interpolator\(rq)\&. .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .sp \fBThe following options should not be relied upon\&. They are listed here only for the sake of completeness, and may be replaced by GUI settings or removed altogether in a future version\&.\fR .sp .5v .RE .PP \fB\-\-wfall\-width\fR \fIWIDTH\fR .RS 4 Set the waterfall width\&. .RE .PP \fB\-\-wfall\-height\fR \fIHEIGHT\fR .RS 4 Set the waterfall height\&. .RE .PP \fB\-\-window\-width\fR \fIWIDTH\fR .RS 4 Set the minimum window width\&. .RE .PP \fB\-\-window\-height\fR \fIHEIGHT\fR .RS 4 Set the minimum window height\&. .RE .PP \fB\-\-exit\-after\fR \fISECONDS\fR .RS 4 Run for approximately \fISECONDS\fR seconds\&. .RE .PP \fB\-\-frames\-per\-buffer\fR \fIFRAMES\fR .RS 4 Set frames per buffer option to \fIFRAMES\fR when creating PortAudio streams\&. Defaults to \(lq0\(rq (let PortAudio choose)\&. .RE .SH "ENVIRONMENT" .sp Fldigi uses several environment variables, mainly set for child processes created by the macro and the notifier\&. .SS "General variables" .PP FLDIGI_BROWSER .RS 4 The web browser to use for http and file URIs\&. Overrides $BROWSER and xdg\-open(1)\&. .RE .SS "Macro variables" .sp The following variables are created in the environment of the child process that is forked by the \fI\fR macro\&. They are empty if values are not available\&. .PP FLDIGI_RX_IPC_KEY .RS 4 The receive message queue key\&. .RE .PP FLDIGI_TX_IPC_KEY .RS 4 The transmit message queue key\&. .RE .PP FLDIGI_XMLRPC_ADDRESS .RS 4 The XML\-RPC server address string\&. .RE .PP FLDIGI_XMLRPC_PORT .RS 4 The XML\-RPC server port string\&. .RE .PP FLDIGI_ARQ_ADDRESS .RS 4 The ARQ server address string\&. .RE .PP FLDIGI_ARQ_PORT .RS 4 The ARQ server port string\&. .RE .PP FLDIGI_VERSION .RS 4 The version string\&. .RE .PP FLDIGI_PID .RS 4 The process ID of the parent fldigi process\&. .RE .PP FLDIGI_CONFIG_DIR .RS 4 The configuration directory\&. .RE .PP FLDIGI_MY_CALL .RS 4 The operator\(cqs callsign\&. .RE .PP FLDIGI_MY_NAME .RS 4 The operator\(cqs name\&. .RE .PP FLDIGI_MY_LOCATOR .RS 4 The operator\(cqs IARU (Maidenhead) locator\&. .RE .PP FLDIGI_MODEM .RS 4 The short modem name\&. .RE .PP FLDIGI_MODEM_LONG_NAME .RS 4 The long modem name\&. .RE .PP FLDIGI_DIAL_FREQUENCY .RS 4 The rig (radio) frequency\&. .RE .PP FLDIGI_AUDIO_FREQUENCY .RS 4 The modem (audio) centre frequency\&. .RE .PP FLDIGI_FREQUENCY .RS 4 The actual receive/transmit frequency, i\&.e\&. the sum of rig and modem frequencies taking into account the rig sideband\&. .RE .PP FLDIGI_LOG_FREQUENCY .RS 4 The text (frequency in MHz) contained in the \fIQSO Freq\fR log field\&. .RE .PP FLDIGI_LOG_TIME_ON .RS 4 The text (QSO start time) contained in the (time) \fIOn\fR log field\&. .RE .PP FLDIGI_LOG_TIME_OFF .RS 4 The text (QSO end time) contained in the (time) \fIOff\fR log field\&. .RE .PP FLDIGI_LOG_CALL .RS 4 The text (other station\(cqs callsign) contained in the \fICall\fR log field\&. .RE .PP FLDIGI_LOG_NAME .RS 4 The text (other station\(cqs name) contained in the \fIName\fR log field\&. .RE .PP FLDIGI_LOG_RST_IN .RS 4 The text (received RST) contained in the (RST) \fIIn\fR log field\&. .RE .PP FLDIGI_LOG_RST_OUT .RS 4 The text (sent RST) contained in the (RST) \fIOut\fR log field\&. .RE .PP FLDIGI_LOG_QTH .RS 4 The text (other station\(cqs QTH) contained in the \fIQTH\fR log field\&. .RE .PP FLDIGI_LOG_LOCATOR .RS 4 The text (other station\(cqs Maidenhead locator) contained in the \fILoc\fR log field\&. .RE .PP FLDIGI_LOG_NOTES .RS 4 The text (free\-form notes) contained in the \fINotes\fR log field\&. .RE .PP FLDIGI_AZ .RS 4 The text (azimuth in degrees to other station) contained in the \fIAz\fR log field\&. .RE .SS "Notifier variables" .sp The following variables are created in the environment of child processes created by the notifier\&. .PP FLDIGI_NOTIFY_STRi .RS 4 These variables (i in [0,9]) contain substrings matched by capturing groups in the event\(cqs regular expression\&. 0 contains the whole matched text\&. .RE .PP FLDIGI_NOTIFY_STR_NUM .RS 4 The number of substrings available\&. .RE .PP FLDIGI_NOTIFY_CALLSIGN .RS 4 Builtin event types that match callsigns will place the callsign in this variable\&. .RE .PP FLDIGI_NOTIFY_TEXT .RS 4 The complete string that matched the event\(cqs regular expression\&. .RE .PP FLDIGI_NOTIFY_AUDIO_FREQUENCY .RS 4 The modem frequency\&. .RE .PP FLDIGI_NOTIFY_EVENT .RS 4 The event type\&. .RE .PP FLDIGI_NOTIFY_COUNTRY .RS 4 The station\(cqs country name (for events of type "station heard twice")\&. .RE .SS "Debugging variables" .sp The following variables are only used if fldigi was built with debugging support (\fI\-\-enable\-debug\fR), or they are only useful when debugging specific modules\&. .PP FLDIGI_NO_EXEC .RS 4 If set, this variable disables glibc\(cqs malloc debugging, which fldigi enables by default when built for debugging\&. .RE .PP FLDIGI_TRACE_LOCKS .RS 4 Traces \fIFl::lock()\fR calls\&. .RE .PP FLDIGI_HAMLIB_DEBUG .RS 4 Initialises hamlib in debug mode\&. .RE .SH "RESTRICTIONS" .sp Fldigi is licensed under the GNU GPL, which grants you the right to run the program for any purpose (freedom 0)\&. However, permission to use it for the transmission of radio signals can only be obtained from the communications authority of your country\&. When given, this permission almost always comes in the form of an amateur radio license\&. .sp If you do not have an amateur radio license you can still have fun using fldigi as a shortwave listener\&. One way to do so is by using the builtin PSK Reporter client to submit realtime spots of transmitting stations; see RESOURCES below\&. All you need is a computer, homebrew SDR receiver, and simple wire antenna! .SH "FILES" .sp Various files and subdirectories are created in $HOME/\&.fldigi\&. Some of the most interesting ones are listed below\&. .PP fldigi_def\&.xml .RS 4 The main settings file\&. .RE .PP fldigi\&.prefs .RS 4 The \(lqstatus\(rq file\&. Stores window geometries, button states, current modem, current audio frequency, squelch level, and so on\&. .RE .PP status_log\&.txt .RS 4 The event log\&. .RE .PP macros/macros\&.mdf .RS 4 The default macro file\&. .RE .PP palettes/ .RS 4 This directory contains waterfall palettes\&. .RE .PP scripts/ .RS 4 This directory is added to the PATH environment variable of the child process that runs macros\&. .RE .PP logs/ .RS 4 This directory contains logged received and sent text (when such logging is enabled), including the default logbook database, logbook\&.adif\&. .RE .PP images/ .RS 4 Received MFSK images are automatically saved in this directory\&. .RE .PP freqanalysis\&.csv .RS 4 This file is written by the frequency analysis modem\&. The fields are dial frequency, audio frequency, and offset\&. See documentation for details\&. .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .sp The following files are used if present\&. They must be downloaded and copied to ~/\&.fldigi/ by the user\&. .sp .5v .RE .PP cty\&.dat .RS 4 List of DXCC entities and callsign prefixes; used to display tooltips in the received text buffer, and also to auto\-fill the Country, Locator and Azimuth log fields\&. Available at http://www\&.country\-files\&.com/cty/\&. .RE .PP lotw1\&.txt .RS 4 List of known LOTW users (one callsign per line); used for the received text tooltips\&. Available at http://www\&.hb9bza\&.net/lotw/\&. .RE .PP AGMemberList\&.txt or eqsl\&.txt .RS 4 List of \(lqAuthenticity Guaranteed\(rq eQSL users (one callsign per line); used for the received text tooltips\&. Available at http://www\&.eqsl\&.cc/QSLcard/Programming\&.cfm\&. .RE .SH "EXAMPLES" .PP fldigi \-\-wfall\-height 144 \-\-font sans:11 \-fg "#c0c0c0" \-bg "#5f5f63" \-bg2 "#19213b" .RS 4 This is how the author of this document invokes fldigi\&. .RE .PP fldigi \-\-xmlrpc\-deny "main\&.(tx|tune|run_macro)" .RS 4 Unregister XML\-RPC methods that may transmit\&. .RE .PP ssh \-L 7362:localhost:7362 remote\-host xvfb\-run fldigi \-display :99 .RS 4 Start fldigi on \fIremote\-host\fR under a \(lqfake\(rq X server\&. (The xvfb\-run(1) utility is available on Debian systems)\&. The remote \(lqheadless\(rq fldigi is then controlled via XML\-RPC on port 7362, i\&.e from flrig, flamp etc\&. .RE .PP fldigi \-\-benchmark\-input 480000 \-\-benchmark\-modem 1 .RS 4 Benchmark the DominoEX\-4 modem with 480K audio samples\&. .RE .PP fldigi \-\-benchmark\-input audio\&.wav \-\-benchmark\-modem 25 \-\-benchmark\-frequency 1500 \-\-benchmark\-afc 1 \-\-benchmark\-squelch 1 \-\-benchmark\-squelch\-level 5\&.0 \-\-benchmark\-output out\&.txt .RS 4 Read \fIaudio\&.wav\fR (whose sample rate must be 8000Hz in this case) and decode BPSK\-31 signals at 1500Hz\&. AFC is enabled and the squelch is set to 5%\&. Decoded text is saved to \fIout\&.txt\fR\&. .RE .SH "BUGS" .sp Yes\&. .SH "SEE ALSO" .sp fldigi\-shell(1), gmfsk(1), gpsk31(1), grig(1), rigctl(1), xlog(1), getaddrinfo(3), getopt(3), regex(7), X(7) .SH "RESOURCES" .sp Main web site: http://www\&.w1hkj\&.com/Fldigi\&.html .sp Sourceforge project page: http://sourceforge\&.net/projects/fldigi/ .sp Wiki and bug tracker: https://fedorahosted\&.org/fldigi/ .sp More information on MFSK16, DominoEX and other digital modes can be found at http://www\&.qsl\&.net/zl1bpu/ and http://www\&.w1hkj\&.com/FldigiHelp/Modes/index\&.htm .sp The PSK Automatic Propagation Reporter site can be found at http://www\&.pskreporter\&.info/ .SH "AUTHORS" .PP Fldigi was written by .RS 4 .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} David Freese, W1HKJ\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Stelios Bounanos, M0GLD\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Leigh L\&. Klotz, Jr\&., WA5ZNU\&. .RE .PP Fldigi also includes code written by others\&. Among them are .RS 4 .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Tomi Manninen, OH2BNS\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Pawel Jalocha, SP9VRC\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Hamish Moffatt, VK3SB\&. .RE .sp This manual page was written by Stelios Bounanos \&. .SH "COPYING" .sp License GPLv3+: GNU GPL version 3 or later\&. fldigi-4.1.06/doc/flarq.1.txt0000644000175000017500000000726513472115742012553 00000000000000FLARQ(1) ========= == NAME == flarq - ARQ data transfer utility for fldigi == SYNOPSIS == *flarq* ['OPTIONS'] == DESCRIPTION == *Flarq* (fast light automatic repeat request) is a file transfer application that is based on the ARQ specification developed by Paul Schmidt, K9PS. It is capable of transmitting and receiving frames of ARQ data via fldigi, as well as MultiPSK on Windows. == OPTIONS == Long options begin with two hyphens and are handled by flarq. The option names may be abbreviated to any unambiguous substring, and the option argument may be separated from the name by a space or equals sign, as per +getopt(3)+. Short options begin with a single hyphen and are passed directly to FLTK. They may be abbreviated only as indicated. *--arq-protocol* 'TYPE':: Set the ARQ protocol. May be either ``fldigi'' or ``multipsk''. Defaults to ``fldigi''. *--arq-server-address* 'HOSTNAME':: Set the ARQ TCP server address. Defaults to ``127.0.0.1''. 'HOSTNAME' may be any 'node name' string accepted by +getaddrinfo(3)+. *--arq-server-port* 'PORT':: Set the ARQ TCP server port. Defaults to ``7322''. 'PORT' may be any 'service name' string accepted by +getaddrinfo(3)+. *--debug*:: Enable debugging messages. *--version*:: Print version information and exit. *--build-info*:: Print build information and exit. *--help*:: Print options summary and exit. === Standard FLTK options === *-bg, -background* 'COLOUR':: Set the background colour. *-bg2, -background2* 'COLOUR':: Set the secondary (text) background colour. *-di, -display* 'DISPLAY':: Specifies the X server to connect to; see +X(7)+. *-dn, -dnd* or *-nodn, -nodnd*:: Enable or disable drag and drop copy and paste in text fields. *-fg, -foreground* 'COLOUR':: Set the foreground colour. *-g, -geometry* 'GEOMETRY':: Set the initial window size and position. *Flarq may not honour this option*. *-i, -iconic*:: Start flarq in iconified state. *Flarq may not honour this option*. *-k, -kbd* or *-nok, -nokbd*:: Enable or disable visible keyboard focus in non-text widgets. *-na, -name* 'CLASSNAME':: Set the window class. Defaults to ``Flarq''. *-ti, -title* 'WINDOWTITLE':: Set the window title. Defaults to ``flarq - ''. === Additional UI options === *--font* 'FONT[:SIZE]':: Set the widget font and (optionally) size. Defaults to ``sans:12''. == FILES == $HOME/.flarq:: The main settings file. The following directories are used to interface with MUAs such as Sylpheed: $HOME/Mail/ARQin:: Stores incoming email messages. $HOME/Mail/ARQout:: Stores outgoing email messages. $HOME/Mail/ARQsent:: Stores sent email messages. The following directories are used for ARQ file transfer: $HOME/ARQrecv:: Stores received files. $HOME/ARQsend:: Stores files to be transmitted. $HOME/ARQfiles/logfile.txt:: Stores transfer logs. == BUGS == * There are no command line arguments to override the default configuration file and ARQ and Mail directories. == SEE ALSO == fldigi(1), getaddrinfo(3), getopt(3), X(7) == RESOURCES == Flarq web site: http://www.w1hkj.com/flarq_main.html Fldigi web site: http://www.w1hkj.com/Fldigi.html Sourceforge project page: http://sourceforge.net/projects/fldigi/ ARQ specification by Paul Schmidt, K9PS: http://www.w1hkj.com/FlarqHelpFiles/ARQ2.pdf == AUTHORS == Flarq was written by David Freese, +W1HKJ+. This manual page was written by Stelios Bounanos . == COPYING == License GPLv3+: GNU GPL version 3 or later. //////////////////////////////////////////////////////////////////////////////// // Emacs settings // Local Variables: // mode: doc // End: //////////////////////////////////////////////////////////////////////////////// fldigi-4.1.06/doc/fldigi.1.txt0000644000175000017500000003625213472115742012702 00000000000000FLDIGI(1) ========= == NAME == fldigi - digital modem program for hamradio operators == SYNOPSIS == *fldigi* ['OPTIONS'] == DESCRIPTION == *Fldigi* is a cross-platform multi-modem program for most of the digital modes used by radio amateurs today: CW, PSK, MFSK, MT-63, RTTY, Hellschreiber, DominoEX, Olivia, THOR and Throb are all supported. It can also help calibrate a sound card to a time signal and do on-air frequency measurement tests. Fldigi features basic rig control, logging, and contest operation, ``panoramic'' PSK decoding, a PSK Reporter client, and remote control via XML-RPC. == OPTIONS == Long options begin with two hyphens and are handled by fldigi. The option names may be abbreviated to any unambiguous substring, and the option argument may be separated from the name by a space or equals sign, as per +getopt(3)+. Short options begin with a single hyphen and are passed directly to FLTK. They may be abbreviated only as indicated. *--config-dir* 'DIRECTORY':: Look for and store configuration files in directory 'DIRECTORY', which is created if it does not exist. Defaults to ``$HOME/.fldigi''. *--rx-ipc-key* 'KEY':: Set the receive message queue key. May be given in hex if prefixed with ``0x''. Defaults to ``9876'' or ``0x2694''. *--tx-ipc-key* 'KEY':: Set the transmit message queue key. May be given in hex if prefixed with ``0x''. Defaults to ``6789'' or ``0x1a85''. *--arq-server-address* 'HOSTNAME':: Set the ARQ TCP server address. Defaults to ``127.0.0.1''. 'HOSTNAME' may be any 'node name' string accepted by +getaddrinfo(3)+. *--arq-server-port* 'PORT':: Set the ARQ TCP server port. Defaults to ``7322''. 'PORT' may be any 'service name' string accepted by +getaddrinfo(3)+. [NOTE] ================================================================================ The '--xmlrpc-*' options are only available if fldigi was built with XML-RPC support. ================================================================================ *--xmlrpc-server-address* 'HOSTNAME':: Set the XML-RPC server address. Defaults to ``127.0.0.1''. *--xmlrpc-server-port* 'PORT':: Set the XML-RPC server port. Defaults to ``7362''. *--xmlrpc-allow* 'REGEX':: Allow only the methods whose names match 'REGEX'. 'REGEX' is a POSIX extended regular expression. *--xmlrpc-deny* 'REGEX':: Allow only the methods whose names do not match 'REGEX'. *--xmlrpc-list*:: List all available XML-RPC methods and exit. May be preceded by the '--xmlrpc-allow' or '--xmlrpc-deny' options to verify their effect. *--cpu-speed-test*:: Perform the CPU speed test that is normally done when fldigi is run without an existing configuration directory. Results are shown in the event log and options may be changed to the recommended values for the measured CPU speed. *--noise*:: Unhide controls for adding noise to the transmitted signal. *--wfall-only*:: Hide all main window widgets except the menu bar and waterfall (with its associated controls). Meant to be used with external programs that control fldigi with XML-RPC. *--debug-level* 'LEVEL':: Set the event log verbosity. 'LEVEL' is clamped to the range [0,5]; for 'Quiet', 'Error', 'Warning', 'Info', 'Verbose' and 'Debug'. Defaults to ``3'' ('Info'). *--version*:: Print version information and exit. *--build-info*:: Print build information and exit. *--help*:: Print options summary and exit. === Standard FLTK options === *-bg, -background* 'COLOUR':: Set the background colour. *-bg2, -background2* 'COLOUR':: Set the secondary (text) background colour. *-di, -display* 'DISPLAY':: Specifies the X server to connect to; see +X(7)+. *-dn, -dnd* or *-nodn, -nodnd*:: Enable or disable drag and drop copy and paste in text fields. *-fg, -foreground* 'COLOUR':: Set the foreground colour. *-g, -geometry* 'GEOMETRY':: Set the initial window size and position. *Fldigi may not honour this option*. *-i, -iconic*:: Start fldigi in iconified state. *Fldigi may not honour this option*. *-k, -kbd* or *-nok, -nokbd*:: Enable or disable visible keyboard focus in non-text widgets. *-na, -name* 'CLASSNAME':: Set the window class. Defaults to ``Fldigi''. *-ti, -title* 'WINDOWTITLE':: Set the window title. Defaults to ``fldigi - ''. === Additional UI options === *--font* 'FONT[:SIZE]':: Set the widget font and (optionally) size. Defaults to ``sans:12''. === Options useful to developers === [NOTE] ================================================================================ The --benchmark-* options are only enabled if fldigi was built (exclusively) for benchmarking and batch decoding. ================================================================================ *--benchmark-modem* 'ID':: Specify the modem. Defaults to ``25'' (``BPSK31''). *--benchmark-frequency* 'FREQ':: Set the modem frequency in Hz. Defaults to ``1000''. *--benchmark-afc* 'BOOLEAN':: Enable or disable modem AFC. Defaults to ``false''. *--benchmark-squelch* 'BOOLEAN':: Enable or disable modem squelch. Defaults to ``false''. *--benchmark-squelch-level* 'LEVEL':: Set the modem squelch level (1--100%). Defaults to ``0.0''. *--benchmark-input* 'INPUT':: Specify the input. Must be a positive integer indicating the number of samples of silence to generate as the input, or, if fldigi was linked with libsndfile, the name of the input audio file. The filename must contain non-digit characters. *--benchmark-output* 'FILE':: Specify the output data file. Non-textual output (i.e. Hellschreiber or MFSK images) cannot be saved. Default: decoder output is discarded. *--benchmark-src-ratio* 'RATIO':: Specify the sample rate conversion ratio. Defaults to ``1.0'' (input is not resampled). *--benchmark-src-type* 'TYPE':: Set the sample rate conversion type. TYPE is an integer in the range [0,4]. Defaults to ``2'' (``Fastest SINC Interpolator''). [WARNING] ================================================================================ *The following options should not be relied upon. They are listed here only for the sake of completeness, and may be replaced by GUI settings or removed altogether in a future version.* ================================================================================ *--wfall-width* 'WIDTH':: Set the waterfall width. *--wfall-height* 'HEIGHT':: Set the waterfall height. *--window-width* 'WIDTH':: Set the minimum window width. *--window-height* 'HEIGHT':: Set the minimum window height. *--exit-after* 'SECONDS':: Run for approximately 'SECONDS' seconds. *--frames-per-buffer* 'FRAMES':: Set frames per buffer option to 'FRAMES' when creating PortAudio streams. Defaults to ``0'' (let PortAudio choose). == ENVIRONMENT == Fldigi uses several environment variables, mainly set for child processes created by the macro and the notifier. === General variables === FLDIGI_BROWSER:: The web browser to use for http and file URIs. Overrides +$BROWSER+ and +xdg-open(1)+. === Macro variables === The following variables are created in the environment of the child process that is forked by the '' macro. They are empty if values are not available. FLDIGI_RX_IPC_KEY:: The receive message queue key. FLDIGI_TX_IPC_KEY:: The transmit message queue key. FLDIGI_XMLRPC_ADDRESS:: The XML-RPC server address string. FLDIGI_XMLRPC_PORT:: The XML-RPC server port string. FLDIGI_ARQ_ADDRESS:: The ARQ server address string. FLDIGI_ARQ_PORT:: The ARQ server port string. FLDIGI_VERSION:: The version string. FLDIGI_PID:: The process ID of the parent fldigi process. FLDIGI_CONFIG_DIR:: The configuration directory. FLDIGI_MY_CALL:: The operator's callsign. FLDIGI_MY_NAME:: The operator's name. FLDIGI_MY_LOCATOR:: The operator's IARU (Maidenhead) locator. FLDIGI_MODEM:: The short modem name. FLDIGI_MODEM_LONG_NAME:: The long modem name. FLDIGI_DIAL_FREQUENCY:: The rig (radio) frequency. FLDIGI_AUDIO_FREQUENCY:: The modem (audio) centre frequency. FLDIGI_FREQUENCY:: The actual receive/transmit frequency, i.e. the sum of rig and modem frequencies taking into account the rig sideband. FLDIGI_LOG_FREQUENCY:: The text (frequency in MHz) contained in the 'QSO Freq' log field. FLDIGI_LOG_TIME_ON:: The text (QSO start time) contained in the (time) 'On' log field. FLDIGI_LOG_TIME_OFF:: The text (QSO end time) contained in the (time) 'Off' log field. FLDIGI_LOG_CALL:: The text (other station's callsign) contained in the 'Call' log field. FLDIGI_LOG_NAME:: The text (other station's name) contained in the 'Name' log field. FLDIGI_LOG_RST_IN:: The text (received RST) contained in the (RST) 'In' log field. FLDIGI_LOG_RST_OUT:: The text (sent RST) contained in the (RST) 'Out' log field. FLDIGI_LOG_QTH:: The text (other station's QTH) contained in the 'QTH' log field. FLDIGI_LOG_LOCATOR:: The text (other station's Maidenhead locator) contained in the 'Loc' log field. FLDIGI_LOG_NOTES:: The text (free-form notes) contained in the 'Notes' log field. FLDIGI_AZ:: The text (azimuth in degrees to other station) contained in the 'Az' log field. === Notifier variables === The following variables are created in the environment of child processes created by the notifier. FLDIGI_NOTIFY_STRi:: These variables (i in [0,9]) contain substrings matched by capturing groups in the event's regular expression. 0 contains the whole matched text. FLDIGI_NOTIFY_STR_NUM:: The number of substrings available. FLDIGI_NOTIFY_CALLSIGN:: Builtin event types that match callsigns will place the callsign in this variable. FLDIGI_NOTIFY_TEXT:: The complete string that matched the event's regular expression. FLDIGI_NOTIFY_AUDIO_FREQUENCY:: The modem frequency. FLDIGI_NOTIFY_EVENT:: The event type. FLDIGI_NOTIFY_COUNTRY:: The station's country name (for events of type "station heard twice"). === Debugging variables === The following variables are only used if fldigi was built with debugging support ('--enable-debug'), or they are only useful when debugging specific modules. FLDIGI_NO_EXEC:: If set, this variable disables glibc's malloc debugging, which fldigi enables by default when built for debugging. FLDIGI_TRACE_LOCKS:: Traces 'Fl::lock()' calls. FLDIGI_HAMLIB_DEBUG:: Initialises hamlib in debug mode. == RESTRICTIONS == Fldigi is licensed under the GNU GPL, which grants you the right to run the program for any purpose (freedom 0). However, permission to use it for the transmission of radio signals can only be obtained from the communications authority of your country. When given, this permission almost always comes in the form of an amateur radio license. If you do not have an amateur radio license you can still have fun using fldigi as a shortwave listener. One way to do so is by using the builtin PSK Reporter client to submit realtime spots of transmitting stations; see RESOURCES below. All you need is a computer, homebrew SDR receiver, and simple wire antenna! == FILES == Various files and subdirectories are created in $HOME/.fldigi. Some of the most interesting ones are listed below. fldigi_def.xml:: The main settings file. fldigi.prefs:: The ``status'' file. Stores window geometries, button states, current modem, current audio frequency, squelch level, and so on. status_log.txt:: The event log. macros/macros.mdf:: The default macro file. palettes/:: This directory contains waterfall palettes. scripts/:: This directory is added to the PATH environment variable of the child process that runs macros. logs/:: This directory contains logged received and sent text (when such logging is enabled), including the default logbook database, logbook.adif. images/:: Received MFSK images are automatically saved in this directory. freqanalysis.csv:: This file is written by the frequency analysis modem. The fields are dial frequency, audio frequency, and offset. See documentation for details. [NOTE] ================================================================================ The following files are used if present. They must be downloaded and copied to ~/.fldigi/ by the user. ================================================================================ cty.dat:: List of DXCC entities and callsign prefixes; used to display tooltips in the received text buffer, and also to auto-fill the Country, Locator and Azimuth log fields. Available at http://www.country-files.com/cty/. lotw1.txt:: List of known LOTW users (one callsign per line); used for the received text tooltips. Available at http://www.hb9bza.net/lotw/. AGMemberList.txt or eqsl.txt:: List of ``Authenticity Guaranteed'' eQSL users (one callsign per line); used for the received text tooltips. Available at http://www.eqsl.cc/QSLcard/Programming.cfm. == EXAMPLES == +fldigi --wfall-height 144 --font sans:11 -fg "#c0c0c0" -bg "#5f5f63" -bg2 "#19213b"+:: This is how the author of this document invokes fldigi. +fldigi --xmlrpc-deny "main.(tx|tune|run_macro)"+:: Unregister XML-RPC methods that may transmit. +ssh -L 7362:localhost:7362 remote-host xvfb-run fldigi -display :99+:: Start fldigi on 'remote-host' under a ``fake'' X server. (The +xvfb-run(1)+ utility is available on Debian systems). The remote ``headless'' fldigi is then controlled via XML-RPC on port 7362, i.e from flrig, flamp etc. +fldigi --benchmark-input 480000 --benchmark-modem 1+:: Benchmark the DominoEX-4 modem with 480K audio samples. +fldigi --benchmark-input audio.wav --benchmark-modem 25 --benchmark-frequency 1500 --benchmark-afc 1 --benchmark-squelch 1 --benchmark-squelch-level 5.0 --benchmark-output out.txt+:: Read 'audio.wav' (whose sample rate must be 8000Hz in this case) and decode BPSK-31 signals at 1500Hz. AFC is enabled and the squelch is set to 5%. Decoded text is saved to 'out.txt'. == BUGS == Yes. == SEE ALSO == fldigi-shell(1), gmfsk(1), gpsk31(1), grig(1), rigctl(1), xlog(1), getaddrinfo(3), getopt(3), regex(7), X(7) == RESOURCES == Main web site: http://www.w1hkj.com/Fldigi.html Sourceforge project page: http://sourceforge.net/projects/fldigi/ Wiki and bug tracker: https://fedorahosted.org/fldigi/ More information on MFSK16, DominoEX and other digital modes can be found at http://www.qsl.net/zl1bpu/ and http://www.w1hkj.com/FldigiHelp/Modes/index.htm The PSK Automatic Propagation Reporter site can be found at http://www.pskreporter.info/ == AUTHORS == Fldigi was written by:: ________________________________________________________________________________ * David Freese, +W1HKJ+. * Stelios Bounanos, +M0GLD+. * Leigh L. Klotz, Jr., +WA5ZNU+. ________________________________________________________________________________ Fldigi also includes code written by others. Among them are::: ________________________________________________________________________________ * Tomi Manninen, +OH2BNS+. * Pawel Jalocha, +SP9VRC+. * Hamish Moffatt, +VK3SB+. ________________________________________________________________________________ +++ +++ This manual page was written by Stelios Bounanos . == COPYING == License GPLv3+: GNU GPL version 3 or later. //////////////////////////////////////////////////////////////////////////////// // Emacs settings // Local Variables: // mode: doc // End: //////////////////////////////////////////////////////////////////////////////// fldigi-4.1.06/doc/Makefile.in0000664000175000017500000005104413515623766012617 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # License: GPLv3+: GNU GPL version 3 or later. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @WANT_FLDIGI_TRUE@am__append_1 = fldigi.1 @WANT_FLDIGI_TRUE@am__append_2 = guide.html @WANT_FLARQ_TRUE@am__append_3 = flarq.1 @HAVE_ASCIIDOC_NO_XMLLINT_TRUE@am__append_4 = --no-xmllint subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/intl/gettext.m4 \ $(top_srcdir)/m4/intl/iconv.m4 $(top_srcdir)/m4/intl/lib-ld.m4 \ $(top_srcdir)/m4/intl/lib-link.m4 \ $(top_srcdir)/m4/intl/lib-prefix.m4 \ $(top_srcdir)/m4/intl/nls.m4 $(top_srcdir)/m4/intl/po.m4 \ $(top_srcdir)/m4/intl/progtest.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/benchmark.m4 $(top_srcdir)/m4/bind.m4 \ $(top_srcdir)/m4/build.m4 $(top_srcdir)/m4/c++11.m4 \ $(top_srcdir)/m4/debug.m4 $(top_srcdir)/m4/docs.m4 \ $(top_srcdir)/m4/fltk.m4 $(top_srcdir)/m4/funcs.m4 \ $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/libintl.m4 \ $(top_srcdir)/m4/macosx.m4 $(top_srcdir)/m4/np-compat.m4 \ $(top_srcdir)/m4/opt.m4 $(top_srcdir)/m4/oss.m4 \ $(top_srcdir)/m4/pkg-config.m4 $(top_srcdir)/m4/progs.m4 \ $(top_srcdir)/m4/static.m4 $(top_srcdir)/m4/tls.m4 \ $(top_srcdir)/m4/win32.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AC_CONFIG_ARGS = @AC_CONFIG_ARGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CFLAGS = @BFD_CFLAGS@ BFD_LIBS = @BFD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11_SWITCH = @CXX11_SWITCH@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_CFLAGS = @DEBUG_CFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_LIBS = @EXTRA_LIBS@ FLARQ_AUTHORS = @FLARQ_AUTHORS@ FLARQ_BUILD_CPPFLAGS = @FLARQ_BUILD_CPPFLAGS@ FLARQ_BUILD_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ FLARQ_BUILD_LDADD = @FLARQ_BUILD_LDADD@ FLARQ_BUILD_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ FLARQ_DOCS = @FLARQ_DOCS@ FLARQ_VERSION = @FLARQ_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLDIGI_AUTHORS = @FLDIGI_AUTHORS@ FLDIGI_BUILD_CFLAGS = @FLDIGI_BUILD_CFLAGS@ FLDIGI_BUILD_CPPFLAGS = @FLDIGI_BUILD_CPPFLAGS@ FLDIGI_BUILD_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ FLDIGI_BUILD_LDADD = @FLDIGI_BUILD_LDADD@ FLDIGI_BUILD_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ FLDIGI_VERSION = @FLDIGI_VERSION@ FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLTK_CFLAGS = @FLTK_CFLAGS@ FLTK_CONFIG = @FLTK_CONFIG@ FLTK_LIBS = @FLTK_LIBS@ FLUID = @FLUID@ FLXMLRPC_CFLAGS = @FLXMLRPC_CFLAGS@ FLXMLRPC_LIBS = @FLXMLRPC_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HAMLIB_CFLAGS = @HAMLIB_CFLAGS@ HAMLIB_LIBS = @HAMLIB_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_CFLAGS = @INTL_CFLAGS@ INTL_LIBS = @INTL_LIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBMBEDTLS_CFLAGS = @LIBMBEDTLS_CFLAGS@ LIBMBEDTLS_LIBS = @LIBMBEDTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAC_UNIVERSAL_CFLAGS = @MAC_UNIVERSAL_CFLAGS@ MAC_UNIVERSAL_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKENSIS = @MAKENSIS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DL = @PACKAGE_DL@ PACKAGE_DOCS = @PACKAGE_DOCS@ PACKAGE_GUIDE = @PACKAGE_GUIDE@ PACKAGE_HOME = @PACKAGE_HOME@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NEWBUG = @PACKAGE_NEWBUG@ PACKAGE_PROJ = @PACKAGE_PROJ@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ PORTAUDIO_CFLAGS = @PORTAUDIO_CFLAGS@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PTW32_CFLAGS = @PTW32_CFLAGS@ PTW32_LIBS = @PTW32_LIBS@ PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ RDYNAMIC = @RDYNAMIC@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASCIIDOC_CONF = asciidoc.conf ASCIIDOC_SRC = fldigi.1.txt flarq.1.txt guide.txt ASCIIDOC_MAN_DIST = fldigi.1 flarq.1 ASCIIDOC_MAN_INST = $(am__append_1) $(am__append_3) ASCIIDOC_HTML = $(am__append_2) EXTRA_DIST = $(ASCIIDOC_CONF) $(ASCIIDOC_SRC) $(ASCIIDOC_MAN_DIST) man_MANS = $(ASCIIDOC_MAN_INST) MOSTLYCLEANFILES = *.xml DISTCLEANFILES = $(ASCIIDOC_HTML) MAINTAINERCLEANFILES = $(ASCIIDOC_MAN_INST) A2X_ARGS = --format=manpage $(am__append_4) # Without .SECONDEXPANSION we would use something like this: #$(ASCIIDOC_MAN_INST): asciidoc.conf # a2x $(A2X_ARGS) $@.txt #fldigi.1: fldigi.1.txt # The rest of the Makefile is enabled only if we have asciidoc # Try to discover the correct iconsdir. Use the first one that # contains an entry matching `tip.*'. @HAVE_ASCIIDOC_TRUE@ASCIIDOC_ICONS_DIRS := /etc/asciidoc/icons /etc/asciidoc/images /etc/asciidoc/images/icons /etc/asciidoc/images/../icons \ @HAVE_ASCIIDOC_TRUE@ /usr/share/asciidoc/icons /usr/share/asciidoc/images /usr/share/asciidoc/images/icons # Additional attributes are defined in guide.conf @HAVE_ASCIIDOC_TRUE@ASCIIDOC_ARGS = --unsafe -a toc -a data-uri -a badges -a icons -a iconsdir=$(ASCIIDOC_ICONS_DIR) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am @HAVE_ASCIIDOC_FALSE@all-local: all-am: Makefile $(MANS) all-local installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ cscopelist-am ctags-am distclean distclean-generic distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 .PRECIOUS: Makefile .SECONDEXPANSION: # Define the custom silent rule function @SILENT_CMDS@ %.1: $$@.txt $(ASCIIDOC_CONF) @HAVE_ASCIIDOC_TRUE@ $(call silent,ADOC ,$@)TZ=0 $(A2X) $(A2X_ARGS) $< @HAVE_ASCIIDOC_FALSE@ $(call silent,ADOC ,$@)echo '.TH "NOT-BUILT" "1" "" "" ""' > $@ @HAVE_ASCIIDOC_TRUE@ASCIIDOC_ICONS_DIR ?= $(dir $(firstword $(strip $(foreach f,$(addsuffix /tip*,$(ASCIIDOC_ICONS_DIRS)),$(wildcard $(f)))))) @HAVE_ASCIIDOC_TRUE@%.html: $$*.txt $(ASCIIDOC_CONF) @HAVE_ASCIIDOC_TRUE@ @if ! test -d $(ASCIIDOC_ICONS_DIR); then \ @HAVE_ASCIIDOC_TRUE@ echo " *** The default asciidoc icons directory, \"$(ASCIIDOC_ICONS_DIR)\", does not exist." >&2; \ @HAVE_ASCIIDOC_TRUE@ echo " *** Please rerun make with the correct ASCIIDOC_ICONS_DIR, e.g.:" >&2; \ @HAVE_ASCIIDOC_TRUE@ echo " *** make ASCIIDOC_ICONS_DIR=/path/to/icons" >&2; \ @HAVE_ASCIIDOC_TRUE@ false; \ @HAVE_ASCIIDOC_TRUE@ fi @HAVE_ASCIIDOC_TRUE@ $(call silent,ADOC ,$@)TZ=0 $(ASCIIDOC) $(ASCIIDOC_ARGS) --out-file $@ $< @HAVE_ASCIIDOC_TRUE@all-local: $(ASCIIDOC_MAN_DIST) $(ASCIIDOC_HTML) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-4.1.06/doc/guide.txt0000644000175000017500000011171313472115742012376 00000000000000Beginners' Guide to Fldigi ========================== // Uncomment the section below to enable the hand written TOC and avoid some // javascript security warnings with brain-dead browsers. Remember to update // when changing the sections. //////////////////////////////////////////////////////////////////////////////// .Table of Contents <> <> <> <> <> // <> //////////////////////////////////////////////////////////////////////////////// :revision: 3.11 // Aliases :docsurl: http://www.w1hkj.com/FldigiHelp/index.html //:docszip: http://www.w1hkj.com/files/fldigi/fldigi-help.zip :docszip: https://sourceforge.net/projects/fldigi/files/fldigi-help.zip/download/ :docs: {docsurl}[Online Documentation] :home: http://www.w1hkj.com/Fldigi.html // This used to be a subsection titled "Where can I find detailed instructions // for Fldigi?" ******************************************************************************** Of necessity, this Beginners' Guide contains only as much as you need to know to get started. You should learn how to make best use of the program by reading the {docs}. You can also access it from within the Fldigi program from the 'Help' menu item. You can install the entire html help system by downloading from Source Forge: {docszip} Unzip the downloaded file into the same folder as this document. The menu item "Help / Online documentation..." will then open the local copy of the fldigi help system. ******************************************************************************** [[ref-beginners-q-a]] == Beginners' Questions Answered == === What is Fldigi? === {home}[Fldigi] is a computer program intended for Amateur Radio Digital Modes operation using a PC (Personal Computer). Fldigi operates (as does most similar software) in conjunction with a conventional HF SSB radio transceiver, and uses the PC sound card as the main means of input from the radio, and output to the radio. These are audio-frequency signals. The software also controls the radio by means of another connection, typically a serial port. Fldigi is multi-mode, which means that it is able to operate many popular digital modes without switching programs, so you only have one program to learn. Fldigi includes all the popular modes, such as DominoEX, MFSK16, PSK31, and RTTY. Unusually, Fldigi is available for multiple computer operating systems; FreeBSD(TM); Linux(TM), OS X(TM) and Windows(TM). === What is a Digital Mode? === Digital Modes are a means of operating Amateur radio from the computer keyboard. The computer acts as 'modem' (modulator - demodulator), as well as allowing you to type, and see what the other person types. It also controls the transmitter, changes modes as required, and provides various convenient features such as easy tuning of signals and prearranged messages. In this context, we are talking about modes used on the HF (high frequency) bands, specifically 'chat' modes, those used to have a regular conversation in a similar way to voice or Morse, where one operator 'talks' for a minute or two, then another does the same. These chat modes allow multiple operators to take part in a 'net'. Because of sophisticated digital signal processing which takes place inside the computer, digital modes can offer performance that cannot be achieved using voice (and in some cases even Morse), through reduced bandwidth, improved signal-to-noise performance and reduced transmitter power requirement. Some modes also offer built-in automatic error correction. Digital Mode operating procedure is not unlike Morse operation, and many of the same abbreviations are used. Software such as Fldigi makes this very simple as most of the procedural business is set up for you using the Function Keys at the top of the keyboard. These are easy to learn. === Why all the different modes? === HF propagation is very dependent on the ionosphere, which reflects the signals back to earth. There are strong interactions between different signals arriving from different paths. Experience has shown that particular modulation systems, speeds and bandwidths suit different operating conditions. Other factors such as available band space, operating speed and convenience, noise level, signal level and available power also affect the choice of mode. While in many cases several different modes might be suitable, having a choice adds to the operating pleasure. It is difficult to advise which mode is best for each particular occasion, and experience plays an important role. footnote:[To gain a good insight into each mode and its capabilities, you might consider purchasing 'Digital Modes for All Occasions' (ISBN 1-872309-82-8) by Murray Greenman ZL1BPU, published by the RSGB and also available from FUNKAMATEUR and CQ Communications; or the ARRL's 'HF Digital Handbook' (ISBN 0-87259-103-4) by Steve Ford, WB8IMY.] === How do I recognise and tune in the signals? === Recognising the different modes comes with experience. It is a matter of listening to the signal, and observing the appearance of the signal on the tuning display. You can also practise transmitting with the transceiver disconnected, listening to the sound of the signals coming from the computer. There is also (see later paragraph) an automatic tuning option which can recognise and tune in most modes for you. The software provides a tuning display which shows the radio signals that are receivable within the transceiver passband. Using a 'point and click' technique with the mouse, you can click on the centre of a signal to select it, and the software will tune it in for you. Some modes require more care than others, and of course you need to have the software set for the correct mode first — not always so easy! The <> (automatic mode detection and tuning) feature uses a special sequence of tones transmitted at the beginning of each transmission to identify and tune in the signals received. For this feature to work, not only do you need to enable the feature in the receiver, but in addition the stations you are wishing to tune in need to have this feature enabled on transmission. Other programs also offer this RSID feature as an option. [[ref-setting-up]] == Setting Up == === Fldigi settings === .Essentials * Use the menu +Configure->Operator+ item to set the operator name, callsign, locator and so on. * If you have more than one sound card, use the menu +Configure->Sound Card+, +Audio Devices+ tab, to select the sound card you wish to use. You can ignore the other tabs for now. .Rig Control * Use the menu +Configure->Rig Control+ item to set how you will control the rig. If you will key the rig via a serial port, in the +Hardware PTT+ tab select 'Use serial port PTT', the device name you will use, and which line controls PTT. If in doubt, check both 'RTS' and 'DTR'. You *must* then press the +Initialize+ button. * If you plan to use CAT control of the rig via the COM port, check 'Use Hamlib' in the +Hamlib+ tab. Select your rig model from the drop-down menu and set the serial port device name, baud rate, and RTS/CTS options as needed. If in addition you wish to use PTT control via CAT, also check 'PTT via Hamlib command'. You *must* then press the +Initialize+ button. [NOTE] ================================================================================ If your rig is CAT-capable but not yet supported by http://www.hamlib.org/[Hamlib], it may still be possible to control it via Fldigi's +RigCAT+ system. Refer to the {docs} for details. ================================================================================ // The above paragraph & note replace this one: //////////////////////////////////////////////////////////////////////////////// * If you plan to use CAT control of the rig via the COM port, check 'Use RigCAT' in the RigCAT tab. If in addition you wish to use PTT control via CAT, also then check 'PTT via CAT command'. You *must* then press the +Initialize+ button. //////////////////////////////////////////////////////////////////////////////// .CPU Speed * When you start Fldigi for the very first time, it makes a series of measurements to determine your computer's processing speed. Although these measurements are usually accurate, if you have a very slow processor (under 700MHz), you should verify that 'Slow CPU' under +Configure->Misc->CPU+ has been enabled. The receiver decoding strategy of certain modems uses fewer processor cycles in this mode. .Modems * Each of the modems can be individually set up from the +Configure->Modems+ multi-tabbed dialog. You need not change anything here to start with, although it might be a good idea to set the 'secondary text' for DominoEX and THOR to something useful, such as your call and locator. footnote:[Secondary text is transmitted when the text you type does not keep up with the typing speed of the mode — this handy text appears in a small window at the very bottom of the screen.] Note that this set of tabs is also where you set the RTTY modem speed and shift, although the default values should be fine for normal operation. .Other settings * Use the menu +Configure->UI+, +Restart+ tab, to set the aspect ratio of the waterfall display and whether or not you want to dock a second digiscope to the main window. * Use the menu +Configure->IDs+ item to set whether you wish to transmit RSID data at the start of each over (this is for the benefit of others and does not affect RSID reception). If you plan to regularly use the RSID feature on receive, you should deselect the option that starts new modems at the ``sweet spot'' frequencies in +Misc->Sweet Spot+. Finally, use the menu item +Configure->Save Config+ to save the new configuration. === Sound Card Mixer === * Use your sound card 'Master Volume' applet to select the sound card, the Wave output and set the transmit audio level. You can check the level using the <> button, top right, beyond the Menu. * On Windows, the 'Volume' applet can usually be opened by clicking +Start->Run…+ and entering +sndvol32+, or from the Control Panel. * Use your sound card 'Recording Control' applet to select the sound card, the Line or Mic input and set the receiver audio level. Watch the waterfall display for receiver noise when setting the level. If you see any dark blue noise, you have the right input and about the right level. The actual setting is not very important, provided you see blue noise. If the audio level is too high, the little diamond shaped indicator (bottom right) will show red. The waterfall may also show red bands. Performance will be degraded if the level is too high. * On Windows, the 'Record' applet can usually be opened by clicking +Start->Run…+ and entering +sndvol32+, or from the Control Panel. If opened from the Control Panel, you'll end up with the Master Volume applet, and need to switch using +Options->Properties+, and selecting the +Recording+ radio button. [[ref-guided-tour]] == Guided Tour == The main window consists of three main panes. Study it carefully as you read these notes. From top to bottom, these are the Receive pane (navajo white), the Transmit pane (light cyan), and the Waterfall pane (black). At the top is the collection of entry items which form the Log Data, and at the very top, a conventional drop-down Menu system, with entries for File, Op Mode, Configure, View and Help. Between the Transmit and the Waterfall panes is a line of boxes (buttons) which represent the Function Keys F1 - F12. This is the Macro group. Below the Waterfall pane is another line of boxes (buttons), which provide various control features. This is the Controls group. The program and various buttons can mostly be operated using the mouse or the keyboard, and users generally find it convenient to use the mouse while tuning around, and the keyboard and function keys during a QSO. [[ref-receive-pane]] === Receive Pane === This is where the text from decoded incoming signals is displayed, in black text. When you transmit, the transmitted text is also displayed here, but in red, so the Receive pane becomes a complete record of the QSO. The information in this pane can also be logged to a file. The line at the bottom of this pane can be dragged up and down with the mouse. You might prefer to drag it down a bit to enlarge the Receive pane and reduce the size of the Transmit pane. === Transmit Pane === This is where you type what you want to transmit. The mouse must click in here before you type (to obtain 'focus') otherwise your text will go nowhere. You can type in here while you are receiving, and when you start transmitting, the text already typed will be sent first. This trick is a cool way to impress others with your typing speed! As the text is transmitted, the text colour changes from black to red. At the end of the over, all the transmitted text (and any as yet not transmitted) will be deleted. === Waterfall Pane === This is the main tuning facility. There are three modes, Waterfall, FFT and Signal, selected by a button in the Control group. For now, leave it in Waterfall mode, as this is the easiest to tune with, and gives the best identification of the signal. [horizontal] *+WF+* (Waterfall):: A spectrogram display of signal strength versus frequency over passing time. The receiver passband is analysed and displayed with lower frequencies to the left, higher to the right. Weak signals and background noise are dark while stronger signals show as brighter colours. As time passes (over a few seconds), the historic signals move downwards like a waterfall. *+FFT+* (Fast Fourier Transform):: A spectrum display of the mean signal strength versus frequency. Again frequency is displayed from left to right, but now the vertical direction shows signal strength and there is no brightness or historic information. *+SIG+* (Signal):: An oscilloscope type of display showing the raw audio being captured by the sound card. At the top of the pane is a scale of frequency in Hz, which corresponds to the frequency displayed immediately below it. This scale can be moved around and zoomed using buttons in the Control group. As you move the mouse around in this pane you will see a yellow group of tuning marks following the mouse pointer. Tuning is achieved by left-clicking on a signal displayed by the waterfall in this pane. Use these yellow marks to exactly straddle the signal and then left-click on the centre of the signal. The tuning marks change to red. The red vertical lines will show the approximate width of the active signal area (the expected signal bandwidth), while a red horizontal bar above will indicate the receiver software's active decoding range. When you left-click, the red marks move to where you clicked, and will attempt to auto-track the signal from there. [TIP] .Audio history and ``casual tuning'' ================================================================================ You can temporarily ``monitor'' a different signal by right-clicking on it. As long as you hold the mouse button down, the signal under it will be decoded; as soon as you release the mouse, decoding will revert to the previously tuned spot (where the red marks are). If you also hold the +Control+ key down before right-clicking, Fldigi will first decode all of its buffered audio at that frequency. ================================================================================ === Log Data === Fldigi provides two QSO entry views, one for casual QSO logging and the second for contesting. The +View->Contest fields+ menu item switches between the two modes. The 'Frequency', 'Time Off', and (when in contest mode) '#Out' fields are filled by the program. All the others can be populated by manual keyboard entry or by selection from the <>. The 'Time Off' field is continuously updated with the current GMT time. The 'Time On' field will be filled in when the 'Call' is updated, but can be modified later by the operator. A right click on the Receive pane brings up a context sensitive menu that will reflect which of the two QSO capture views you have open. If you highlight text in the Receive pane then the menu selection will operate on that text. If you simply point to a word of text and right click then the menu selection will operate on the single word. [TIP] .Quick log entry ================================================================================ Certain fields ('Call', 'Name', 'RST In', 'QTH' and 'Locator') may also be populated semi-automatically. Point to a word in the Receive pane and either double-left-click or hold a Shift key down and left-click. The program will then use some simple heuristics to decide which log field will receive the text. ================================================================================ It is generally not possible to distinguish between Operator and QTH names. For this reason, Fldigi will use the first non-Call and non-Locator word to fill the 'Name' field, and subsequent clicks will send text to the 'QTH' field. Likewise, a text string may be both a valid callsign and a valid http://en.wikipedia.org/wiki/Maidenhead_Locator_System[IARU (Maidenhead) locator]. For best results, you should attempt to fill the log fields in the order in which they appear on the main window, and clear the log fields after logging the QSO. Of course, text can always be manually typed or pasted into any of the log fields! You can query online and local (e.g. CD) database systems for data regarding a callsign. You make the query by either clicking on the globe button, or selecting 'Look up call' from the popup menu. The latter will also move the call to the 'Call' field. When the 'Call' field is filled in, the logbook will be searched for the most recent QSO with that station and, if an entry is found, the 'Name', 'QTH' and other fields will be pre-filled. If the logbook dialog is open, that last QSO will also be selected for viewing in the logbook. You open the logbook by selecting from the View menu; +View->Logbook+. The logbook title bar will show you which logbook you currently have open. Fldigi can maintain an unlimited (except for disk space) number of logbooks. === Menu === At the very top of the program window is a conventional drop-down menu. If you click on any of the items, a list of optional functions will appear. Keyboard menu selection is also provided. Where underscored characters are shown in the menu, you can select these menu items from the keyboard using the marked character and +Alt+ at the same time, then moving around with the +up+/+down+/+left+/+right+ keys. Press +Esc+ to quit from the menu with no change. ==== Menu functions ==== .File Allows you to open or save Macros (we won't get into that here), turn on/off logging to file, record/play audio samples, and exit the program. You can also exit the program by clicking on the +X+ in the top right corner of the window, in the usual manner. .Op Mode This is where you select the operating modem used for transmission and reception. Some modes only have one option. Where more are offered, drag the mouse down the list and sideways following the arrow to a secondary list, before releasing it. When you start the program next time, it will remember the last mode you used. Not all the modes are widely used, so choose a mode which _(a)_ maximises your chance of a QSO, and _(b)_ is appropriate for the band, conditions, bandwidth requirements and permissions relevant to your operating licence. At the bottom of the list are two ``modes'' which aren't modes at all, and do not transmit (see {docs} for details). 'WWV' mode allows you to receive a standard time signal so the beeps it transmits can be used for sound card calibration. 'Freq Analysis' provides just a waterfall display with a very narrow cursor, and a frequency meter which indicates the received frequency in Hz to two decimal places. This is useful for on-air frequency measurement. .Configure This is where you set up the program to suit your computer, yourself and your operating preferences. The operating settings of the program are grouped into several categories and there are menu items in which you enter your personal information, or define your computer sound card, for example. Modems can be individually changed, each having different adjustments. The Modems dialog has multiple tabs, so you can edit any one of them. Don't fool with the settings until you know what you are doing! The final item, +Save Config+ allows you to save the altered configuration for next time you start the program (otherwise changes are temporary). .View This menu item allows you to open extra windows. Most will be greyed out, but two that are available are the Digiscope, and the PSK Browser. The Digiscope provides a mode-specific graphical analysis of the received signal, and can have more than one view (left click in the new window to change the view), or maybe none at all. The PSK Browser is a rather cool tool that allows you to monitor several PSK31 signals all at the same time! These windows can be resized to suit. .Help Brings up the Online Documentation, the Fldigi Home Page, and various information about the program. ==== Other controls ==== [[ref-rsid]] .RSID The RxID button turns on the receive RSID (automatic mode detection and tuning) feature. When in use, the button turns yellow and no text reception is possible until a signal is identified, or the feature is turned off again. If you plan to use the RSID feature on receive, you must leave the 'Start New Modem at Sweet Spot' item in the menu +Configure->Defaults->Misc+ tab unchecked. [[ref-tune]] .TUNE This button transmits a continuous tone at the current audio frequency. The tone level will be at the maximum signal level for any modem, which makes this function useful for adjusting your transceiver's output power. === Macro buttons === This line of buttons provides user-editable QSO features. For example, the first button on the left sends CQ for you. Both the function of these buttons (we call them Macros) and the label on each button, can be changed. Select each button to use it by pressing the corresponding Function Key (F1 - F12, you'll notice the buttons are grouped in patterns four to a group, just as the Function Keys are). You can also select them with a left-click of the mouse. If you right-click on the button, you are able to edit the button's label and its function. A handy dialog pops up to allow this to be done. There are many standard shortcuts, such as ++, which you can use within the Macros. Notice that the buttons also turn the transmitter on and off as necessary. You can just about hold a complete QSO using these buttons from left to right (but please don't!). Notice that at the right are two spare buttons you can set as you wish, and then a button labelled +1+. Yes, this is the first set of _four_ sets of Macros, and you can access the others using this button, which changes to read +2+, +3+, +4+ then +1+ again (right-click to go backwards), or by pressing +Alt+ and the corresponding number (1-4, not F1-F4) at the same time. [NOTE] ================================================================================ If you _really_ mess up the Macros and can't see how to fix them, just close the program without saving them, and reopen it. ================================================================================ === Controls === The line of buttons under the waterfall is used to control the program (as opposed to the QSO). If you hover the mouse over these buttons, you'll see a little yellow hint box appear which tells you what each button does. The first button switches between Waterfall, FFT and Scope modes. The next two buttons adjust the signal level over which the waterfall works. The default range is from 0dB downwards 70dB (i.e. to -70dB). Both of these values can be adjusted to suit your sound card and receiver audio level. The next button sets the scale zoom factor (visible display width, ×1, ×2 or ×4), and the next three buttons move the visible waterfall area in relation to the bandwidth cursor. The next button selects the waterfall speed. NORM or SLOW setting is best unless you have a very fast computer. The next four buttons (two on either side of a number, the audio frequency in Hz) control the receiving frequency (they move the red cursor lines). The +QSY+ button moves the signal under the bandwidth cursor to a preset audio frequency (typically, the centre of the transceiver's passband). The Store button allows you to store or recall the current frequency and mode. See the {docs} for details on these functions. The +Lk+ button locks the transmit frequency (and illuminates a green marker), and the +Rv+ button turns the signal decoding upside down (some modes are sideband sensitive, and if they are the wrong way up, can't be received correctly). Remember to turn this one off when you're done, or you won't receive anything! If every signal you hear is upside down, check your transceiver sideband setting. The +T/R+ button forces the transmitter on or off. [CAUTION] ================================================================================ Use the +T/R+ button with care, as it will stop transmission immediately, losing whatever is in the buffer (what you have typed in the Transmit pane), or start it immediately, even if nothing is ready to transmit. ================================================================================ There are two further controls in the bottom right corner of the program, to the right of the Status line: +AFC+ (AFC) control:: When this button is pressed, an indicator on the button turns yellow, and the program will automatically retune to drifting signals. When the button is again pressed, AFC is off, and the tuning will stay where you leave it. +SQL+ (Squelch) control:: When off (no coloured indicator on the button), the receiver displays all ``text'' received, even if there is no signal present, and the receiver is simply attempting to decode noise. When activated by pressing the button, the indicator turns yellow. If the incoming signal strength exceeds that set by the adjacent slider control (above the +SQL+ button), the indicator turns green and the incoming signal is decoded and printed. The signal strength is indicated on the green bar beside the Squelch level slider. If nothing seems to be printing, the first thing to do is check the Squelch! === Status Line === At the very bottom line of the Fldigi window is a row of useful information. At the left is the current operating mode. Next (some modes) is the measured signal-to-noise ratio at the receiver, and (in some modes) the measured signal intermodulation level (IMD). The larger central box shows (in DominoEX and THOR modes) the received 'Secondary Text'. This is information (such as station identification) which is transmitted automatically whenever the transmitter has completed all user text that is available to send. It is transmitted using special characters, and is automatically directed to this special window. Secondary text you transmit is also shown here. This box changes size when you enlarge the program window. [[ref-operating]] == Operating == === Procedure === Operating procedure for digital modes is similar to that for Morse. Some of the same abbreviations are used. For example, at the beginning of an over, you might send +VK3XYZ de WB8ABC+ or just +RR Jack+ and so on. At the end of an over, it is usual to send +ZL1ABC de AA3AR K+, and at the end of a QSO +73 F3XYZ de 3D2ZZ SK+. When operating in a group or net it is usual to sign +AA3AE es gp de ZK8WW K+. It is also considered a courtesy to send a blank line or two (press +Enter+) before any text at the start of an over, and following the last text at the end of an over. You can also place these in the macros. The purpose is to separate your text from the previous text, and especially from any rubbish that was printed between overs. Fldigi does all of this for you. The Function Keys are set up to provide these start and end of over facilities, and can be edited to suit your preferences. In order that the other station's callsign can appear when these keys are used, you need to set the other station's callsign in the log data — it does not matter if you use the log facility or not. [NOTE] .Macro symbols ================================================================================ Some Function Key Macro buttons have graphic symbols on them which imply the following: [horizontal] *+>>+*:: The transmitter comes on and stays on when you use this button/macro. *+||+*:: The transmitter goes off when the text from this button/macro has been sent. *+>|+*:: The transmitter comes on, sends the text from this button/macro, and goes off when the text from this button/macro has been sent. ================================================================================ The Macros are set up to control the transmitter as necessary, but you can also switch the transmitter on at the start of an over with +Ctrl+ and +T+ or the TX macro button, and off again with +Ctrl+ and +R+ or the RX macro button. If you have Macros copied into or text already typed in the Transmit pane when you start the transmitter, this is sent first. Calling another station you have tuned in is as simple as pushing a button. Put his callsign into the log data (right click, select Call) and press the +ANS+ Macro button (or F2) when you are ready. If he replies, you are in business! Then press +QSO+ (F3) to start each over, and +BTU+ (F4) to end it, and +SK+ (F5) to sign off. [NOTE] ================================================================================ When typing text, the correct use of upper and lower case is important: * Modes such as RTTY and THROB have no lower case capability. * In most other modes, excessive use of upper case is considered impolite, like SHOUTING! * Modes such as PSK31, MFSK16, DominoEX and THOR use character sets which are optimised for lower case. You should use lower case as much as possible in these modes to achieve maximum text speed. In these modes upper case characters are noticeably slower to send and also slightly more prone to errors. ================================================================================ === Adjustment === Most digital modes do not require much transmitter power, as the receiver software is very sensitive. Many modes (PSK31, THROB, MT63) also require very high transmitter linearity, which is another reason to keep transmitter power below 30% of maximum. Some modes (Hellschreiber, Morse) have high peak power output, which may not indicate well on the conventional power meter, another reason to keep the average transmitted power low to prevent a very broad signal being transmitted. Adjust the transmitter output power using the TUNE button, top right, beyond the Menu. The output will be the same as the peak power in other modes. Adjust the master Volume applet Wave Out and Master Volume controls to achieve the appropriate power. Use of excessive drive will result in distortion (signal difficult to tune in, and often poorer reception) and a very broad signal. Some multi-carrier modes (MT63 for example) may require individual adjustment as the average power may be rather low. [TIP] ================================================================================ Where possible, use the area above 1200Hz on the waterfall. * Below 1200Hz the second harmonic of the transmitted audio will pass through the transmitter filters. * When using lower frequency tones, adjust the transmitter and audio level with great care, as the second (and even third) harmonic will appear in the transmitter passband, causing excessive signal width. * A narrow (CW) filter in the rig is no help in this regard, as it is only used on receive. When you do use a narrow filter, this will restrict the area over which the receiver and transmitter will operate (without retuning of course). Try adjusting the passband tuning (if available). * Keep the sound card audio level to a minimum and set the transmitter gain to a similar level used for SSB. ================================================================================ === Waterfall Tuning === When using this program, as with most other digital modes programs, tuning is generally accomplished by leaving the transceiver VFO at a popular spot (for example 14.070MHz, USB), and performing all the 'tuning' by moving around within the software. The Fldigi software has a second ``VFO'' which is tuned by clicking on the waterfall. On a busy band, you may see many signals at the same time (especially with PSK31 or Morse), and so you can click with the mouse on any one of these signals to tune it in, receive it, and if the opportunity allows, reply to the station. The software ``VFO'' operates in a transceive mode, so the transmitter signal is automatically and exactly tuned to the received frequency. If you click correctly on the signal, your reply will always be in tune with the other station. [IMPORTANT] ================================================================================ You *must not* use RIT (Clarifier) when using digital modes. * With RIT on, you will probably have to retune after every over. * Use of the RIT will also cause the other station to change frequency, and you will chase each other across the band. * Older transceivers without digital synthesis may have an unwanted offset (frequency difference) between transmit and receive frequencies. Such rigs should not be used for digital modes. ================================================================================ Wider digital modes (MT63, Olivia) can be tuned using the rig if necessary, as tuning is not at all critical. The software tuning still operates, but because the signal is so wide, there is limited ability to move around in the waterfall tuning. [[ref-special-keys]] == Special Keys == Several special keyboard controls are provided to make operating easier. .Start Transmission Press +Ctrl+ and +T+ to start transmission if there is text ready in the transmit buffer. .Pause Transmission Press +Pause+ or +Break+ while in receive, and the program will switch to transmit mode. It will continue with the text in the transmit buffer (the Transmit pane text) from the current point, i.e. where the red (previously sent) text ends and the black (yet to be sent) text begins. If the buffer only contains unsent text, then it will begin at the first character in the buffer. If the buffer is empty, the program will switch to transmit mode, and depending on the mode of operation, will send idle characters or nothing at all until characters are entered into the buffer. If you press +Pause+ or +Break+ while in transmit mode, the program will return to receive mode. There may be a slight delay for some modes like MFSK, PSK and others, that requires the transmitter to send a postamble at the end of a transmission. The transmit text buffer stays intact, ready for the +Pause+/+Break+ key to return you to the transmit mode . Pressing +Alt+ or +Meta+ and +R+ has the same effect as +Pause+/+Break+. You could think of the +Pause+/+Break+ key as a software break-in capability. .Escape Pressing +Esc+ while transmitting will abort the transmission. Transmission stops as soon as possible, (any necessary postamble is sent), and the program returns to receive. Any unsent text in the transmit buffer will be lost. [TIP] ================================================================================ If you press +Esc Esc+ (i.e. twice in quick succession), transmission stops immediately, without sending any postamble, and the program returns to receive. Any unsent text in the transmit buffer will be lost. Use this feature as an *emergency stop*. ================================================================================ .Return to Receive Press +Ctrl+ and +R+ to insert the +^r+ command in the transmit buffer at the current typing point. When transmission reaches this point, transmission will stop. .Move Typing Cursor Press +Tab+ to move the cursor (typing insertion point) to the end of the transmit buffer. This will also pause transmission. A +Tab+ press at that position moves the cursor back to the character following the last one transmitted. Morse operation is slightly different. See the {docs} for CW. .Send Any ASCII Character Press +Ctrl+ and (at the same time) any three-digit number (on the numeric keypad or the normal numeric keys) to insert the ASCII character designated by that entry value into the transmit buffer. For example, +Ctrl 177+ is ``±'' (plus/minus) and +Ctrl 176+ is ``°'' (degree). If you press a key other than the numeric keypad's 0-9 the sequence will be discarded. [[ref-credits]] [float] == Credits == Copyright (C) 2008 Murray Greenman, +ZL1BPU+. Copyright (C) 2008-2009 David Freese, +W1HKJ+. Copyright (C) 2009 Stelios Bounanos, +M0GLD+. License GPLv3+: http://www.gnu.org/licenses/gpl.html[GNU GPL version 3 or later]. //////////////////////////////////////////////////////////////////////////////// // Emacs settings // Local Variables: // mode: doc // End: //////////////////////////////////////////////////////////////////////////////// fldigi-4.1.06/src/0000775000175000017500000000000013515625027010640 500000000000000fldigi-4.1.06/src/misc/0000775000175000017500000000000013515625027011573 500000000000000fldigi-4.1.06/src/misc/stack.cxx0000644000175000017500000003143613472115773013355 00000000000000// Copyright 2007 Edd Dawson. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include "stack.h" #if defined(_WIN32) #include #include #if defined(__MINGW32__) #include // link against libbfd and libiberty #include // link against psapi #include #endif #elif defined(__GNUC__) #include #include #endif namespace { #if defined(__GNUC__) std::string demangle(const char *name) { int status = 0; char *d = 0; std::string ret = name; try { if ((d = abi::__cxa_demangle(name, 0, 0, &status))) ret = d; } catch(...) { } free(d); return ret; } #endif #if defined(_WIN32) class uncopyable { public: uncopyable() { } private: uncopyable(const uncopyable &); // remains undefined uncopyable &operator= (const uncopyable &); // remains undefined }; #if defined(__MINGW32__) class bfd_context : uncopyable { private: struct find_data { std::string func; asymbol **symbol_table; bfd_vma counter; }; public: bfd_context() : abfd_(0), sec_(0), symbol_table_(0) { char procname[MAX_PATH]; GetModuleFileNameEx(GetCurrentProcess(), NULL, procname, sizeof procname); bfd_init(); abfd_ = bfd_openr(procname, 0); if (!abfd_) throw dbg::stack_error("Failed to parse object data for the executable"); char **formats = 0; bool b1 = bfd_check_format(abfd_, bfd_object); bool b2 = bfd_check_format_matches(abfd_, bfd_object, &formats); bool b3 = bfd_get_file_flags(abfd_) & HAS_SYMS; if (!(b1 && b2 && b3)) { bfd_close(abfd_); free(formats); throw dbg::stack_error("Failed to parse object data for the executable"); } free(formats); // Load symbol table unsigned dummy = 0; if (bfd_read_minisymbols(abfd_, FALSE, (void **)&symbol_table_, &dummy) == 0 && bfd_read_minisymbols(abfd_, TRUE, (void **)&symbol_table_, &dummy) < 0) { free(symbol_table_); bfd_close(abfd_); throw dbg::stack_error("Failed to parse object data for the executable"); } } ~bfd_context() { free(symbol_table_); bfd_close(abfd_); } std::string get_function_name(DWORD offset) { find_data data; data.symbol_table = symbol_table_; data.counter = offset; bfd_map_over_sections(abfd_, &find_function_name_in_section, &data); return data.func; } private: static void find_function_name_in_section(bfd *abfd, asection *sec, void *opaque_data) { assert(sec); assert(opaque_data); find_data &data = *static_cast(opaque_data); if (!data.func.empty()) return; // already found it if (!(bfd_get_section_flags(abfd, sec) & SEC_ALLOC)) return; bfd_vma vma = bfd_get_section_vma(abfd, sec); if (data.counter < vma || vma + bfd_get_section_size(sec) <= data.counter) return; const char *func = 0; const char *file = 0; unsigned line = 0; if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) data.func = demangle(func); } private: bfd *abfd_; asection *sec_; asymbol **symbol_table_; }; #endif // __MINGW32__ class auto_cast_function_ptr { public: template explicit auto_cast_function_ptr(FuncPtr f) : fptr_(reinterpret_cast(f)) { } template operator FuncPtr() const { return reinterpret_cast(fptr_); } private: void (*fptr_)(void); }; class windows_dll : uncopyable { public: explicit windows_dll(const std::string &libname) : name_(libname), lib_(LoadLibrary(name_.c_str())) { if (!lib_) throw dbg::stack_error("Failed to load dll " + name_); } ~windows_dll() { FreeLibrary(lib_); } const std::string &name() const { return name_; } auto_cast_function_ptr function(const std::string &func_name) const { FARPROC proc = GetProcAddress(lib_, func_name.c_str()); if (!proc) throw dbg::stack_error("failed to load function " + func_name + " from library " + name_); return auto_cast_function_ptr(proc); } private: std::string name_; HMODULE lib_; }; class symbol_context : uncopyable { public: symbol_context() { SymInitialize(GetCurrentProcess(), 0, true); } ~symbol_context() { SymCleanup(GetCurrentProcess()); } }; class mutex : uncopyable { public: mutex() { InitializeCriticalSection(&cs_); } ~mutex() { DeleteCriticalSection(&cs_); } void lock() { EnterCriticalSection(&cs_); } void unlock() { LeaveCriticalSection(&cs_); } private: CRITICAL_SECTION cs_; }; class scoped_lock : uncopyable { public: scoped_lock(mutex &m) : m_(m) { m_.lock(); } ~scoped_lock() { m_.unlock(); } private: mutex &m_; }; mutex fill_frames_mtx_; void fill_frames(std::list &frames, dbg::stack::depth_type limit) { scoped_lock lk(fill_frames_mtx_); #if defined(__MINGW32__) static bfd_context bfdc; #endif symbol_context sc; STACKFRAME frame; std::memset(&frame, 0, sizeof frame); CONTEXT context; std::memset(&context, 0, sizeof(CONTEXT)); context.ContextFlags = CONTEXT_FULL; windows_dll kernel32("kernel32.dll"); void (WINAPI *RtlCaptureContext_) (CONTEXT*) = kernel32.function("RtlCaptureContext"); RtlCaptureContext_(&context); frame.AddrPC.Offset = context.Eip; frame.AddrPC.Mode = AddrModeFlat; frame.AddrStack.Offset = context.Esp; frame.AddrStack.Mode = AddrModeFlat; frame.AddrFrame.Offset = context.Ebp; frame.AddrFrame.Mode = AddrModeFlat; HANDLE process = GetCurrentProcess(); HANDLE thread = GetCurrentThread(); dbg::stack::depth_type skip = 0; bool has_limit = limit != 0; char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; char module_name_raw[MAX_PATH]; while(StackWalk(IMAGE_FILE_MACHINE_I386, process, thread, &frame, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 )) { if (skip < 1) { ++skip; continue; } if (has_limit && limit-- == 0) break; IMAGEHLP_SYMBOL *symbol = reinterpret_cast(symbol_buffer); symbol->SizeOfStruct = (sizeof *symbol) + 255; symbol->MaxNameLength = 254; DWORD module_base = SymGetModuleBase(process, frame.AddrPC.Offset); std::string module_name = "[unknown module]"; if( module_base && GetModuleFileName(reinterpret_cast(module_base), module_name_raw, MAX_PATH)) module_name = module_name_raw; #if defined(__MINGW32__) std::string func = bfdc.get_function_name(frame.AddrPC.Offset); if (func.empty()) { DWORD displacement = 0; // dummy variable BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); func = got_symbol ? symbol->Name : "[unknown function]"; } #else DWORD displacement = 0; // dummy variable BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); std::string func = got_symbol ? symbol->Name : "[unknown function]"; #endif dbg::stack_frame f(reinterpret_cast(frame.AddrPC.Offset), func + " in " + module_name); frames.push_back(f); } } #elif defined(__GNUC__) #if defined(__i386__) || defined(__x86_64__) void fill_frames(std::list &frames, dbg::stack::depth_type limit) { // Based on code found at: // http://www.tlug.org.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV Dl_info info; void **frame = static_cast(__builtin_frame_address(0)); void **bp = static_cast(*frame); void *ip = frame[1]; bool has_limit = limit != 0; dbg::stack::depth_type skip = 0; while(bp && ip && dladdr(ip, &info)) { if (skip < 1) ++skip; else { if (has_limit && limit-- == 0) break; frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); if(info.dli_sname && !strcmp(info.dli_sname, "main")) break; } ip = bp[1]; bp = static_cast(bp[0]); } } #elif defined(__ppc__) void fill_frames(std::list &frames, dbg::stack::depth_type limit) { // Based on code found at: // http://www.informit.com/articles/article.aspx?p=606582&seqNum=4&rl=1 void *ip = __builtin_return_address(0); void **frame = static_cast(__builtin_frame_address(1)); bool has_limit = limit != 0; Dl_info info; do { if (has_limit && limit-- == 0) break; if (dladdr(ip, &info)) frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); if (frame && (frame = static_cast(*frame))) ip = *(frame + 2); } while (frame && ip); } #else // GNU, but neither x86 or PPC #error "Sorry but dbg::stack is not supported on this architecture" #endif #else // Unsupported compiler #error "Sorry but dbg::stack is not supported on this compiler" #endif } namespace dbg { stack_error::stack_error(const std::string &what) : what_(what) { } stack_error::~stack_error() throw() { } const char *stack_error::what() const throw() { return what_.c_str(); } stack_frame::stack_frame(const void *instruction, const std::string &function) : instruction_(instruction), function_(function) { } const void *stack_frame::instruction() const { return instruction_; } const std::string &stack_frame::function() const { return function_; } std::ostream &operator<< (std::ostream &out, const stack_frame &frame) { return out << frame.instruction() << ": " << frame.function(); } stack::stack(depth_type limit) { fill_frames(frames_, limit); } stack::const_iterator stack::begin() const { return frames_.begin(); } stack::const_iterator stack::end() const { return frames_.end(); } stack::depth_type stack::depth() const { return frames_.size(); } } // close namespace dbg fldigi-4.1.06/src/misc/pixmaps_tango.cxx0000644000175000017500000032652113472115773015123 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include // This file contains pixmap versions of icons from the Tango Icon Library // (version 0.8.90) at http://tango.freedesktop.org/Tango_Icon_Library // which was released into the Public Domain. This file was prepared by // Kamal Mostafa , and is likewise released into the // Public Domain. // These #define's map the (new) Tango icon names (named after their source // files) to the pixmap identifier names used throughout the fldigi source: #define tango_x_office_address_book address_book_icon #define tango_applications_system applications_system_icon #define tango_internet_group_chat chat_icon #define tango_dialog_information dialog_information_icon #define tango_edit_clear edit_clear_icon #define tango_edit_copy edit_copy_icon #define tango_edit_cut edit_cut_icon #define tango_edit_paste edit_paste_icon #define tango_edit_select_all edit_select_all_icon #define tango_edit_undo edit_undo_icon #define tango_emblem_system emblems_system_icon #define tango_application_x_executable executable_icon #define tango_document_open file_open_icon #define tango_folder_open folder_open_icon #define tango_help_browser help_browser_icon #define tango_image_x_generic image_icon #define tango_go_previous left_arrow_icon #define tango_system_log_out log_out_icon #define tango_list_remove minus_icon #define tango_multimedia_player multimedia_player_icon #define tango_internet_web_browser net_icon #define tango_list_add plus_icon #define tango_preferences_desktop_font preferences_desktop_font_icon #define tango_process_stop process_stop_icon #define tango_view_refresh refresh_icon #define tango_go_next right_arrow_icon #define tango_document_save_as save_as_icon #define tango_document_save save_icon #define tango_system_shutdown shutdown_icon #define tango_start_here start_here_icon #define tango_system_software_update system_software_update_icon #define tango_system_users system_users_icon #define tango_accessories_text_editor text_editor_icon #define tango_text_x_generic text_icon #define tango_x_office_calendar time_icon #define tango_user_trash trash_icon #define tango_utilities_system_monitor utilities_system_monitor_icon #define tango_utilities_terminal utilities_terminal_icon #define tango_weather_clear weather_clear_icon #define tango48_dialog_information dialog_information_48_icon #define tango48_dialog_warning dialog_warning_48_icon // --------------------------------------------------------------------- // Tango icons // --------------------------------------------------------------------- /* mimetypes/x-office-address-book.png */ /* XPM */ const char *tango_x_office_address_book[] = { /* width height ncolors chars_per_pixel */ "16 16 125 2", /* colors */ " c #000000", " . c #C0D2E4", " X c #ACC3DA", " o c #A78AB1", " O c #9DB029", " + c #C3CFE0", " @ c #9AA5C5", " # c #D8E4F1", " $ c #A7BFD8", " % c #D7E4F0", " & c #99A7C7", " * c #A9B8D0", " = c #D2DEEB", " - c #ABB0BE", " ; c #A887AE", " : c #9CA2C3", " > c #AC80A8", " , c #CBD8E7", " < c #A789B0", " 1 c #617296", " 2 c #AB82AA", " 3 c #C3D0E2", " 4 c #AA84AC", " 5 c #B7CBE0", " 6 c #A9B3CF", " 7 c #8290AC", " 8 c #7E8CA8", " 9 c #ACB1BE", " 0 c #95B1CF", " q c #CEDBE9", " w c #99A580", " e c #7E8CAB", " r c #AAACC9", " t c #B5B5B6", " y c #A491B6", " u c #7B8AA8", " i c #7A88A7", " p c #9BA3C4", " a c #727E0A", " s c #DEDEDE", " d c #AB92B6", " f c #8F9FB8", " g c #96AECC", " h c #B1C0D6", " j c #AA83AB", " k c #A2AB7B", " l c #FCE94F", " z c #808DA9", " x c #C7D7E8", " c c #8F9E86", " v c #95B0CE", " b c #CC0000", " n c #A5BDD7", " m c #A8B8D0", " M c #D1DEEB", " N c #D0DCEA", " B c #CFDCE9", " V c #CEDAE8", " C c #A8AEBC", " Z c #A889AF", " A c #AC80A9", " S c #9BA2C3", " D c #CFDCEC", " F c #9DB7D2", " G c #6F6384", " H c #5A7AA4", " J c #A78BB1", " K c #67837F", " L c #9AA4C5", " P c #AFBAC9", " I c #B9CBE0", " U c #B4B9C4", " Y c #9E9DBF", " T c #BCC8D9", " R c #828EAA", " E c #95AFCD", " W c #9FABC3", " Q c #D7E3F0", " ! c #D3DFEC", " ~ c #A9B9D0", " ^ c #9D9FC1", " / c #B4C9DE", " ( c #AFB5C2", " ) c #ABB1BE", " _ c #EDD400", " ` c #C1C1C3", " ' c #9CA1C3", " ] c #698373", " [ c #A7ADBD", " { c #A9C1D9", " } c #A8BFD8", " | c #A9ACB8", ". c #AA85AC", ".. c #9D9EC0", ".X c #B7CAE0", ".o c #818FAB", ".O c #808DAA", ".+ c #AC8BB1", ".@ c #A987AE", ".# c #8B96AE", ".$ c #CFDCEA", ".% c #6C7CA0", ".& c #785977", ".* c #A889B0", ".= c #AC82AA", ".- c #DDDDDD", ".; c #CCDAEA", ".: c #9AA6C6", ".> c #BACDE2", "., c #B8CBE0", ".< c #9E9DC0", ".1 c #8390AC", ".2 c #EF2929", ".3 c #C6D6E7", ".4 c #95AFCE", ".5 c #A58DB3", ".6 c #A986AD", ".7 c #BFCCE0", ".8 c #A9B9D1", ".9 c #CFDBE9", ".0 c #B9B9B9", ".q c #CEDBE8", ".w c #B7B7B7", ".e c #CBD7E5", ".r c None", /* pixels */ ".r H H H H H H H H H H H H H.r.r", " H.% =.3.> / n n $ $ } } F c _.r", " H T N 3 D { L < A. .< 0 X c l _", " H +.$ h.; 6 4 p.4 & ; S X w l _", " H.e B m.; d ^ Y 2 j & o X k l _", " H M.9 m.;.= g 4...6 E A X ] O a", " H Q q *.; A E A '.@ : Z X ] O a", " H #.q ~.;.+ L y.*.5 4.: X K O a", " H #.q.8.; r ; & v 0 0 0 X G.2 b", " H % V.7.; { @ J >.6 0 0 X G.2 b", " H Q ! D x ..X 5 5.,.,., I G.2 b", " H , e R z 8 i u.o 7.1.O 1.& b.r", " H W t.w.w.w.w.w.w.w.0 P H H.r.r", " H f `.-.-.-.-.- s s s U H H.r.r", " H H.# [ ( - - ) ) 9 9 C | H.r.r", ".r H H H H H H H H H H H H H.r.r" }; /* categories/applications-system.png */ /* XPM */ const char *tango_applications_system[] = { /* width height ncolors chars_per_pixel */ "16 16 19 1", /* colors */ " c #000000", ". c #7CA1CF", "X c #497CBA", "o c #3F638F", "O c #6490C7", "+ c #467ABA", "@ c #395578", "# c #436FA5", "$ c #BCCDE3", "% c #5682B7", "& c #86A7D2", "* c #82A5D1", "= c #4C7FBD", "- c #426B9C", "; c #5686C3", ": c #9DB8DA", "> c #457ABE", ", c #8FAED5", "< c None", /* pixels */ "<<<<<<<<<<<<<<<<", "<<<<<<>>><<<<<<<", "<<<>><>$><>><<<<", "<<>$&>O:O>&$><<<", "<<>&:::::::&><<<", "<<<>:.+;+*:><<<<", "<>>O:+-><<", "<>$::;<<<;::$><<", "<>>O:=%<#+:O>><<", "<<<>$.=;+,:><<<<", "<<>&:::::::&><<<", "<<>$&>O:O>&$><<<", "<<<>><>$><>><<<<", "<<<<<<>>><<<<<<<", "<<<<<<<<<<<<<<<<", "<<<<<<<<<<<<<<<<" }; /* apps/internet-group-chat.png */ /* XPM */ const char *tango_internet_group_chat[] = { /* width height ncolors chars_per_pixel */ "16 16 23 1", /* colors */ " c #000000", ". c #9D9D9D", "X c #F2F2F2", "o c #F0F0F0", "O c #EEEEEE", "+ c #ECECEC", "@ c #EAEAEA", "# c #2D2D2D", "$ c #767774", "% c #888A85", "& c #858682", "* c #797A76", "= c #C6C6C4", "- c #FFFFFF", "; c #F1F1F1", ": c #EFEFEF", "> c #EDEDED", ", c #EBEBEB", "< c #E9E9E9", "1 c #343434", "2 c #2A2A2A", "3 c #868884", "4 c None", /* pixels */ "4444%%%%%%%%%%%4", "444%-----------%", "444%-,@<<<<<<<-%", "4%%%%%%%%%%%=<-%", "%-----------%<-%", "%-<<<<<<<@,-%@-%", "%-<<<<<@,++-%,-%", "%-<<<<@,+>O-%--%", "%-<<@,+>O::-%-%4", "%-@,++>O:o;-%-%4", "%-,+>O::o;X-%%%4", "%--O:-------%4%4", "4%-:-%%%%%%%.444", "4%--%44444444444", "4%%%444444444444", "4%44444444444444" }; /* status/dialog-information.png */ /* XPM */ const char *tango_dialog_information[] = { /* width height ncolors chars_per_pixel */ "16 16 127 2", /* colors */ " c #000000", " . c #394B7A", " X c #E8EFF4", " o c #4A577A", " O c #CBD9E8", " + c #40507A", " @ c #E3E6BA", " # c #F5F8FA", " $ c #80805C", " % c #C8D7E8", " & c #C5D5E5", " * c #3B4C78", " = c #3A4A77", " - c #D4E0ED", " ; c #C1CCD7", " : c #E0E9F2", " > c #546083", " , c #394A79", " < c #EBF0F6", " 1 c #475780", " 2 c #EBEDC1", " 3 c #46557F", " 4 c #F7F9FB", " 5 c #C5D2E1", " 6 c #5988B9", " 7 c #3D4D76", " 8 c #D9E3EE", " 9 c #495985", " 0 c #595942", " q c #B5C7DB", " w c #586383", " e c #9BAEC8", " r c #A9C0D9", " t c #3C4D78", " y c #F3F7FA", " u c #3B4B77", " i c #5382B6", " p c #D3DFEB", " a c #EDEFF4", " s c #E2EAF3", " d c #393936", " f c #5E8DBA", " g c #F5F8CA", " h c #A5BED8", " j c #616471", " k c #384977", " l c #EEF3F8", " z c #D0DDEB", " x c #CEDBE9", " c c #4F5873", " v c #FAFCFD", " b c #779DC5", " n c #485883", " m c #E8EFF5", " M c #ABB198", " N c #B5C6DA", " B c #E2E7EF", " V c #AAC1D9", " C c #3E4E79", " Z c #E0E5ED", " A c #DDDFAB", " S c #435177", " D c #8C9BB8", " F c #C3D3E4", " G c #98A4BD", " H c #B5CAE0", " J c #D0D5E0", " K c #DFE7F2", " L c #DEE7F1", " P c #91AECD", " I c #384A79", " U c #41517B", " Y c #8A8B66", " T c #E0E6EC", " R c #5E5E3E", " E c #B9C4D6", " W c #5E6880", " Q c #8D9CB8", " ! c #3A4B77", " ~ c #EFF3F7", " ^ c #9AA5BE", " / c #FCFCFD", " ( c #A6AC98", " ) c #789DC4", " _ c #C1D2E4", " ` c #F3F6C9", " ' c #3A4B7A", " ] c #C0D0E3", " [ c #384978", " { c #87A8CC", " } c #ECF1F7", " | c #4B7EB2", ". c #45547E", ".. c #CCD9E8", ".X c #D3D5B0", ".o c #3D4C76", ".O c #D8E2ED", ".+ c #4A5A86", ".@ c #D4E0EC", ".# c #5281B5", ".$ c #7E90B2", ".% c #FFFFFF", ".& c #A7AD98", ".* c #608EBC", ".= c #C2D3E4", ".- c #464646", ".; c #4B5B83", ".: c #EBF0F5", ".> c #FAFBFD", "., c #A4ADC3", ".< c #303030", ".1 c #C9D6E7", ".2 c #C7D6E5", ".3 c #F4F7FA", ".4 c #C2D0E0", ".5 c #D6E1ED", ".6 c #9DB9D6", ".7 c #7E91B1", ".8 c #B7C2D5", ".9 c #59627C", ".0 c #A6BED8", ".q c #A8AA84", ".w c #D2DAE2", ".e c #DFE8F2", ".r c #5C89BA", ".t c #5B89B9", ".y c None", /* pixels */ ".y.y.y.y.y u = [ I !.o.y.y.y.y.y", ".y.y.y.y *., a / 4 B ^ C.y.y.y.y", ".y.y.y t J # X s 8 p.O E U.y.y.y", ".y.y 7., # ~.3 <.e -.= & Q S.y.y", ".y.y + a m y v } K z _ ) 5 3.y.y", ".y.y ,.> : l.%.%.%.% ;.y x ..y.y", ".y.y '.3.5 L.%.: T.w P.y.1 ..y.y", ".y.y. Z O %.% ] H.6.y.* q n.y.y", ".y.y o G.@.0.% h {.y | V.7 >.y.y", ".y.y.y 1.8 F b.%.y f r e 9.y.y.y", ".y.y.y.y 1 D.4...2 N.$.+.y.y.y.y", ".y.y.y.y.y w.; (.& M W.y.y.y.y.y", ".y.y.y.y.y.y R 2 g A R.y.y.y.y.y", ".y.y.y.y.y.y R $.q Y R.y.y.y.y.y", ".y.y.y.y.y.y R @ `.X R.y.y.y.y.y", ".y.y.y.y.y.y.y d.-.<.y.y.y.y.y.y" }; /* actions/edit-clear.png */ /* XPM */ const char *tango_edit_clear[] = { /* width height ncolors chars_per_pixel */ "16 16 113 2", /* colors */ " c #E7D75B", " . c #EED723", " X c #AB1B0D", " o c #C86D33", " O c #BBA529", " + c #FDEC6D", " @ c #C5B536", " # c #DCC407", " $ c #EDDA46", " % c #A08E01", " & c #9F8E00", " * c #CDBD41", " = c #E8DA6C", " - c #D7B162", " ; c #E6D656", " : c #E1D35B", " > c #CCBD43", " , c #FDE952", " < c #E7D018", " 1 c #9C8800", " 2 c #C6B633", " 3 c #C5B432", " 4 c #BC7A0F", " 5 c #FDEA5F", " 6 c #CFC149", " 7 c #A29009", " 8 c #A19008", " 9 c #FDEB6C", " 0 c #D2C34F", " q c #DCC610", " w c #AE9E1B", " e c #F8EA88", " r c #AB6D0B", " t c #C17D10", " y c #F3E365", " u c #B2760B", " i c #9E8D01", " p c #E4D249", " a c #ECDC68", " s c #E7D96D", " d c #BB4A28", " f c #9F8F05", " g c #F6D861", " h c #9A8500", " j c #FDEC6B", " k c #FDEB61", " l c #EBDD77", " z c #804E01", " x c #DAC203", " c c #9F8E01", " v c #AB9B1A", " b c #E2D467", " n c #9F8E04", " m c #EADC72", " M c #A12400", " N c #B8381D", " B c #876400", " V c #FDEA63", " C c #DDCF5E", " Z c #FDEF84", " A c #A08F01", " S c #9F8D00", " D c #D8C84F", " F c #E3CB11", " G c #A96B0A", " H c #C6B530", " J c #BEAE32", " K c #FDEE7D", " L c #B2720C", " P c #9C8B00", " I c #9C7F00", " U c #A6690A", " Y c #FDEF8A", " T c #E5D44E", " R c #B06917", " E c #F3DB2A", " W c #DCC510", " Q c #FBED8B", " ! c #A18801", " ~ c #D6C856", " ^ c #7B4A00", " / c #FBEA84", " ( c #FFFFFF", " ) c #9D8C00", " _ c #FCE53C", " ` c #A03600", " ' c #E4D34C", " ] c #DCCD58", " [ c #DFCA26", " { c #784800", " } c #EBDE77", " | c #B1A01D", ". c #C0B02F", ".. c #DBC304", ".X c #F6DE2F", ".o c #AD4213", ".O c #E7D85F", ".+ c #A59411", ".@ c #FBE437", ".# c #7C4B00", ".$ c #9F8D01", ".% c #9E8D00", ".& c #E5CD14", ".* c #FBE544", ".= c #DCC615", ".- c #FDE63C", ".; c #865203", ".: c #845201", ".> c #A08F05", "., c #CDBE45", ".< c #794900", ".1 c #8A6900", ".2 c None", /* pixels */ ".2.# ^.2.2.2.2.2.2.2.2.2.2.2.2.2", " ^ U r ^.2.2.2.2.2.2.2.2.2.2.2.2", " ^ L t G ^.2 P.2.2.2.2.2.2.2.2.2", ".2.; 4 t.: h P.2.2.2.2.2.2.2.2.2", ".2 ^ z u ! J |.2.2.2.2.2.2.2.2.2", ".2.2 B 1 * } R ` A.2.2.2.2.2.2.2", ".2.2 i D a o X - m > 7 c.2.2.2.2", ".2.2.% O d N g V 9 K e., f &.2.2", ".2.2.2 M.o / j Z + ,.* y l 6 w )", ".2.2.2.2. Y 5 k ,.- E < q p b.$", ".2.2.2.2.+ Q _.@.X ..&.. x ; 2 &", ".2.2.2.2 % C $ < F # x x ' ] n.2", ".2.2.2.2.2 v = W x x.= ~.>.2.2", ".2.2.2.2.2 & @.O [ T s 3.%.2.2.2", ".2.2.2.2.2.2.% 0 : H 8 S.2.2.2.2", ".2.2.2.2.2.2.2 ).%.%.2.2.2.2.2.2" }; /* actions/edit-copy.png */ /* XPM */ const char *tango_edit_copy[] = { /* width height ncolors chars_per_pixel */ "16 16 44 1", /* colors */ " c #000000", ". c #E3E4E2", "X c #9A9B97", "o c #8D8F8A", "O c #898B86", "+ c #C8C8C7", "@ c #C6C6C5", "# c #C4C4C3", "$ c #8F908B", "% c #FEFEFE", "& c #FAFAFA", "* c #F4F4F4", "= c #F2F2F2", "- c #EEEEEE", "; c #ECECEC", ": c #EAEAEA", "> c #8E9189", ", c #D4D4D4", "< c #C3C4C3", "1 c #F7F7F6", "2 c #F3F3F2", "3 c #EFEFEE", "4 c #EDEDEC", "5 c #E3E3E2", "6 c #989A95", "7 c #8C8E89", "8 c #8A8C87", "9 c #888A85", "0 c #C7C7C6", "q c #FFFFFF", "w c #FBFBFB", "e c #F9F9F9", "r c #F3F3F3", "t c #EBEBEB", "y c #989A96", "u c #FEFEFD", "i c #FCFCFB", "p c #FAFAF9", "a c #F8F8F7", "s c #F6F6F5", "d c #F4F4F3", "f c #F0F0EF", "g c #EEEEED", "h c None", /* pixels */ "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhX9999999999o", "hhhh8qqqqqqqqqq9", "hhhhOqffffffffq9", "hhhh8qf000000fq9", "hhhhOqffffffffq9", "hhhh8qf00000ffq9", "hhhhOqfffffff&r9", "hhhh8qf00000-1<9", "hhhh8qfffff77779", "hhhhOuffff&6&a.9", "hhhhOpfff&&6&599", "hhhhO*1siw,y.9hh", "hhhh7O9999999hhh" }; /* actions/edit-cut.png */ /* XPM */ const char *tango_edit_cut[] = { /* width height ncolors chars_per_pixel */ "16 16 94 2", /* colors */ " c #000000", " . c #AA0909", " X c #A80707", " o c #959792", " O c #939590", " + c #91938E", " @ c #AB0D0D", " # c #90918D", " $ c #8F918C", " % c #A90B0B", " & c #8D8F8A", " * c #8B8D88", " = c #CB1F1F", " - c #9C2F2C", " ; c #B3B2AF", " : c #C01514", " > c #A80403", " , c #A70202", " < c #AB1313", " 1 c #AA0808", " 2 c #A80606", " 3 c #E1E1DF", " 4 c #AE1919", " 5 c #B70F0E", " 6 c #CE1E1E", " 7 c #A90A0A", " 8 c #D2D3D0", " 9 c #AA0E0E", " 0 c #DB2727", " q c #F5F6F5", " w c #AE1818", " e c #EFF0EF", " r c #D01F1F", " t c #CE1D1D", " y c #CD1D1C", " u c #898984", " i c #CCCEC9", " p c #C6C8C3", " a c #AA0D0D", " s c #B8BAB5", " d c #AB1111", " f c #B6B8B3", " g c #B5B6B2", " h c #F7F7F6", " j c #D42222", " k c #AAACA7", " l c #A60202", " z c #D22020", " x c #B80D0D", " c c #9FA09C", " v c #A70606", " b c #9A9C97", " n c #92948F", " m c #C91A1A", " M c #AA0C0C", " N c #8E908B", " B c #8C8E89", " V c #8A8C87", " C c #AB1010", " Z c #D62323", " A c #A80303", " S c #A60101", " D c #A90707", " F c #AF1A1A", " G c #A40502", " H c #AB1616", " J c #DBDCD9", " K c #CD1D1D", " L c #CA1B1A", " P c #AA0B0B", " I c #D2D4D0", " U c #CDCECB", " Y c #C5C6C3", " T c #C01513", " R c #B5B6B3", " E c #F7F7F7", " W c #AD1717", " Q c #D12020", " ! c #A34A45", " ~ c #B50B0B", " ^ c #A60606", " / c #A00A00", " ( c #C71A19", " ) c #BABBB7", " _ c #B3B5B0", " ` c #AEAFAB", " ' c #D52323", " ] c #D32121", " [ c #A8A9A5", " { c #D11F1F", " } c #AB1414", " | c #CF1D1D", ". c #E7E8E6", ".. c None", /* pixels */ "........ * O........ * $........", "...... N E *........ # 8 $......", "...... * I e n...... k p &......", "...... & _ h *.... N i ` *......", "........ * J e + B f U *........", "........ & g E * c R s *........", ".......... * 3 q b [ *..........", ".......... & ). k N V..........", "............ u Y ; -............", "........ w H ^ ! l ( W w........", "...... D z 6 5 G > m Q = 7......", ".... 2 r A : S.... y T A K v....", ".. } '.... t 7.... A L.... Q }..", ".. @ |.. ~ ] M.... . Z x.. { d..", ".. < 0 r t X........ 1 j | t <..", ".... 9 C H............ a P %...." }; /* actions/edit-paste.png */ /* XPM */ const char *tango_edit_paste[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #000000", ". c #6A6C68", "X c #666864", "o c #C68827", "O c #6E4602", "+ c #6D4401", "@ c #C08424", "# c #7F7F7C", "$ c #EFEFED", "% c #EDEDEB", "& c #EBEBE9", "* c #E9E9E7", "= c #E7E7E5", "- c #676964", "; c #DBDBD9", ": c #B2B4B4", "> c #6E6C64", ", c #CCCDCA", "< c #6B4301", "1 c #FEFEFE", "2 c #F2F2F2", "3 c #EDEEED", "4 c #BA7F23", "5 c #D8D8D5", "6 c #E0E0E0", "7 c #A77D3B", "8 c #5C5C5B", "9 c #6C4401", "0 c #C1C2BE", "q c #B9BAB6", "w c #6B4403", "e c #B37B22", "r c #EFEFEE", "t c #EDEDEC", "y c #EBEBEA", "u c #C58726", "i c #97978A", "p c #6E4502", "a c #80807D", "s c #7E7E7B", "d c #ECECEA", "f c #EAEAE8", "g c #716F64", "h c #E8E8E6", "j c #706D63", "k c #DADAD8", "l c #6F4602", "z c #B97F23", "x c #B3B5B5", "c c #6E6D64", "v c #CDCECB", "b c #A17C40", "n c #5E5E5E", "m c #5C5C5C", "M c #6A4200", "N c #C28628", "B c #FFFFFF", "V c #E7E7E4", "C c #F1F1F1", "Z c #D9D9D6", "A c #B1B2B2", "S c #C58727", "D c #5F5F5E", "F c #959589", "G c #6C4301", "H c #6B4300", "J c #B9B9B6", "K c #B8B9B5", "L c #FEFEFD", "P c #B7B7B4", "I c #736F64", "U c #BBBBBB", "Y c #F0F0EF", "T c #EEEEED", "R c #A47E3E", "E c #A37C3D", "W c #ECECEB", "Q c #706D64", "! c None", /* pixels */ "!!!!!DmmmmD!!!!!", "!!+9w8FiiF8w99!!", "!+@RQn#aasn>bzG!", "!logC6UUUU62cSM!", "!loXBYYYYYYB-NM!", "!luXBYxxxxrB-NM!", "!luXBYYYY$%B-NM!", "!OuXBYxx:AfB-NM!", "!OuXBYrtyf;B-NM!", "!OuXBTW&*k,B-NM!", "!OuXBdfhvqKB-NM!", "!puXB*=ZJBBB-NM!", "!puXBV50PBB-SNM!", "!puj3111rL-SSSM!", "!G47I.....EEEe c #F2F2F2", ", c #F0F0F0", "< c #EEEEEE", "1 c #ECECEC", "2 c #8B8D89", "3 c #B2C8E0", "4 c #B0C6DE", "5 c #AEC4DC", "6 c #ACC2DA", "7 c #AAC0D8", "8 c #8C8E89", "9 c #A8BED6", "0 c #888A85", "q c #8298B0", "w c #FFFFFF", "e c #FDFDFD", "r c #FBFBFB", "t c #F9F9F9", "y c #F7F7F7", "u c #F5F5F5", "i c #EBEBEB", "p c None", /* pixels */ "p20000000000008p", "p0e&&ee**rr==t$p", "p0e9##77+++++-$p", "p0&#%%%%6%%%6-$p", "p0e7%%%%OOOOO-$p", "p0e7%%%%O555i-$p", "p0*+%%%%5%%o1-$p", "p0*66O5oo444<-$p", "p0*6O5oo44XX,-$p", "p0r6%%%%%%%3>y$p", "p0rO5o44 3 .:y$p", "p0=O5o4X3 u;;y$p", "p0tOqqqq3 y-yy$p", "p0tO5o4X3 yt-y$p", "p0------ - ---$p", "p8000000000000@p" }; /* actions/edit-undo.png */ /* XPM */ const char *tango_edit_undo[] = { /* width height ncolors chars_per_pixel */ "16 16 70 1", /* colors */ " c #000000", ". c #F3E56A", "X c #F4DF2C", "o c #F1DB29", "O c #F9EA69", "+ c #DFC80A", "@ c #BB9F15", "# c #F6E131", "$ c #EBDC6F", "% c #C4A000", "& c #EFE276", "* c #D6C004", "= c #C19E00", "- c #BBA11B", "; c #EEE16E", ": c #FAEC73", "> c #BCA015", ", c #F8E232", "< c #DAC304", "1 c #F5E02F", "2 c #C1A313", "3 c #7D7905", "4 c #FAEB6F", "5 c #DFC90F", "6 c #BEA113", "7 c #ECD936", "8 c #E3CD16", "9 c #BF9D00", "0 c #C1A319", "q c #DBC443", "w c #C8AC02", "e c #BCA114", "r c #F7DD05", "t c #FBED76", "y c #DFC80B", "u c #FBED79", "i c #B99900", "p c #7C7A06", "a c #D8C207", "s c #E9DA5D", "d c #CBAA0E", "f c #F7E86E", "g c #F2E469", "h c #E8D21D", "j c #C0A41A", "k c #F7E232", "l c #FBF3AD", "z c #C1A314", "x c #F6E769", "c c #FBE425", "v c #C5AB1B", "b c #C4A71A", "n c #C0A623", "m c #E1CD40", "M c #C2A611", "N c #BDA116", "B c #C2A211", "V c #FAE320", "C c #BFA31B", "Z c #EADB66", "A c #C3A618", "S c #F7E86C", "D c #F2E788", "F c #E3CE41", "G c #F5E66D", "H c #F6E02F", "J c #D8C543", "K c #7E7905", "L c #C4A901", "P c None", /* pixels */ "PPPPPP%PPPPPPPPP", "PPPPP%%PPPPPPPPP", "PPPP%l%PPPPPPPPP", "PPP%lc%%6@-PPPPP", "PP%l#V:4fSezPPPP", "P%lHko1o87xF2PPP", "%lH,kk1ohhh7mNPP", "P%u,X***hhhy.v>P", "PP%t c #979993", ", c #C0C0BE", "< c None", /* pixels */ "<<<<<<<<<<<<<<<<", "<<<<<<---<<<<<<<", "<<<--<-:-<--<<<<", "<<-:,-@&@-,:-<<<", "<<-,&&&&&&&,-<<<", "<<<-&O+>+;&-<<<<", "<--@&+%<*#&@--<<", "<-:&&><<<>&&:-<<", "<--@&oX<$+&@--<<", "<<<-:Oo>+.&-<<<<", "<<-,&&&&&&&,-<<<", "<<-:,-@&@-,:-<<<", "<<<--<-:-<--<<<<", "<<<<<<---<<<<<<<", "<<<<<<<<<<<<<<<<", "<<<<<<<<<<<<<<<<" }; /* mimetypes/application-x-executable.png */ /* XPM */ const char *tango_application_x_executable[] = { /* width height ncolors chars_per_pixel */ "16 16 70 1", /* colors */ " c #000000", ". c #9BABC3", "X c #8790B6", "o c #ADB8CE", "O c #ABB6CC", "+ c #5F7A9F", "@ c #7F90B1", "# c #A5B2C9", "$ c #A4B2C8", "% c #9197BC", "& c #9FAEC6", "* c #8991B7", "= c #AFB9CF", "- c #AEB9CE", "; c #BFC4D8", ": c #7382AB", "> c #95A2BF", ", c #949ABE", "< c #7D89B1", "1 c #7C89B0", "2 c #8D9EBA", "3 c #8E9CBB", "4 c #A0AFC6", "5 c #B0BACF", "6 c #9D9FC3", "7 c #C1C5D9", "8 c #7483AB", "9 c #99A3C2", "0 c #858EB5", "q c #AAB6CC", "w c #8F9BBB", "e c #9099BC", "r c #A2AEC7", "t c #A1AAC6", "y c #7786AD", "u c #8895B7", "i c #ACB7CD", "p c #7182AA", "a c #566F99", "s c #7A87AF", "d c #ACB0CC", "f c #8394B4", "g c #A8B4CB", "h c #A7B4CA", "j c #A7B2CA", "k c #50688F", "l c #A5B0C8", "z c #C8CADD", "x c #546C96", "c c #7C8EB0", "v c #7C8CB0", "b c #7B88AF", "n c #8D9FBA", "m c #7A88AE", "M c #B2BBD1", "N c #B1BBD0", "B c #516A96", "V c #7584AC", "C c #364878", "Z c #858FB5", "A c #98A2C1", "S c #ABB5CD", "D c #A9B5CB", "F c #A9B3CB", "G c #A7B1C9", "H c #486490", "J c #A3B1C8", "K c #B3BCD1", "L c #C3C7DA", "P c None", /* pixels */ "PPPPPPPCPPPPPPPP", "PPPPPPCLCPPPPPPP", "PPPPPCL.+CPPPPPP", "PPPPCL&4nHCPPPPP", "PPPCLJ$#2BaCPPPP", "PPCLhgDqcf@aCPPP", "PCLOio-rv>FpaCPP", "CL=5NMj3SKy:VaCP", "PCLGlwu8t9b c #969796", " , c #BFD2E9", " < c #7EA7D4", " 1 c #98B9DD", " 2 c #BBD2E8", " 3 c #797979", " 4 c #737373", " 5 c #3768A5", " 6 c #3666A4", " 7 c #C5D7EB", " 8 c #5689C0", " 9 c #85ACD7", " 0 c #9FA09E", " q c #656565", " w c #5F5F5F", " e c #C1D5EA", " r c #5B5B5B", " t c #555555", " y c #7FA8D4", " u c #515151", " i c #FEFEFE", " p c #FCFCFC", " a c #8AAFD8", " s c #494949", " d c #FAFAFA", " f c #95B8DC", " g c #EAEAEA", " h c #E8E8E8", " j c #E6E6E6", " k c #E2E2E2", " l c #E0E0E0", " z c #DEDEDE", " x c #77A2D2", " c c #DCDCDC", " v c #3667A6", " b c #DADADA", " n c #3465A4", " m c #5B5E5A", " M c #D2D2D2", " N c #81A9D5", " B c #D0D0D0", " V c #4B7EB7", " C c #3265A5", " Z c #8BB0D8", " A c #C4C4C4", " S c #96B7DC", " D c #3968A5", " F c #B0B0B0", " G c #B9D0E7", " H c #AEAEAE", " J c #ACACAC", " K c #AAAAAA", " L c #79A3D3", " P c #92B5DB", " I c #A6A6A6", " U c #5F615D", " Y c #3666A5", " T c #3566A4", " R c #5D5F5B", " E c #5B5D59", " W c #595B57", " Q c #D5D5D4", " ! c #575955", " ~ c #83AAD6", " ^ c #82AAD5", " / c #555753", " ( c #9BBADD", " ) c #C0D5EA", " _ c #C1C1C0", " ` c #7A7A7A", " ' c #787878", " ] c #3767A5", " [ c #A5A5A4", " { c #6E6E6E", " } c #5B5C58", " | c #5588BF", ". c #6A6A6A", ".. c #9C9D9B", ".X c #3567A6", ".o c #8FB2DA", ".O c #8EB2D9", ".+ c #939392", ".@ c #3465A5", ".# c #C1D6EA", ".$ c #565656", ".% c #B1C9E4", ".& c #4C4C4C", ".* c #FDFDFD", ".= c #FBFBFB", ".- c #484848", ".; c #F9F9F9", ".: c #F7F7F7", ".> c #7BA5D3", "., c #95B7DC", ".< c #94B5DB", ".1 c #3868A5", ".2 c #EBEBEB", ".3 c #E9E9E9", ".4 c #E7E7E7", ".5 c #E5E5E5", ".6 c #E3E3E3", ".7 c #B8CEE7", ".8 c #DFDFDF", ".9 c #DDDDDD", ".0 c #3566A5", ".q c #3466A4", ".w c #D9D9D9", ".e c #D3D3D3", ".r c #D0D1D0", ".t c #9ABADD", ".y c #CFCFCF", ".u c #CDCDCD", ".i c #C9C9C9", ".p c #C7C7C7", ".a c #C5C5C5", ".s c #A5C1E1", ".d c #7DA6D4", ".f c #BDBDBD", ".g c #95B6DB", ".h c #B7B7B7", ".j c #454A51", ".k c #B3B3B3", ".l c None", /* pixels */ ".l.l.l.l = ! = ! ! W * U.l.l.l.l", " ` 3 3 3 =.:.; d.=.= p $ }.l.l.l", " '.i.p A / b.e.e M.y.u i.+ m.l.l", " 4.a F J / c - - - - Q i.* > E.l", " { _ J K = k.8 z z.9 l.3.5 B R.l", ". .f o + = j 0.......9.6.6.r E.l", " q.h I & !.2 g g.3.3 h h.4.w %.l", " w.k X.1.1 5 Y Y.0 T T T n n n O", " r H.0 ) ) ) ) ) ) e.#.#.#.# 2.@", ".$ o T # P P P P P P P P P f G.q", " u [ 6 7 1 1 1 1 1 1 1 1 1.,.7.0", ".& & ] , (.t.t.t.t.t.t S.o Z.%.0", ".- ;.1.s.O a 9 ~ N < L x x.>.g.X", " s : D.< ^.d.d.d.d.d.d.d.d y Y", ".- . D | 8 8 8 8 8 8 8 8 8 8 V v", ".j n n n n n n n n n n n n n @.l" }; /* status/folder-open.png */ /* XPM */ const char *tango_folder_open[] = { /* width height ncolors chars_per_pixel */ "16 16 123 2", /* colors */ " c #000000", " . c #ADADAD", " X c #ABABAB", " o c #A9A9A9", " O c #92B6DB", " + c #92B4DB", " @ c #A7A7A7", " # c #3667A5", " $ c #A5A5A5", " % c #A3A3A3", " & c #A1A1A1", " * c #9F9F9F", " = c #9DBDDF", " - c #9D9D9D", " ; c #9B9B9B", " : c #B5CDE6", " > c #999999", " , c #7EA7D4", " < c #3968A4", " 1 c #484849", " 2 c #797979", " 3 c #757575", " 4 c #94B7DC", " 5 c #737373", " 6 c #93B5DB", " 7 c #6D6D6D", " 8 c #86AED8", " 9 c #6B6B6B", " 0 c #B7CEE7", " q c #656565", " w c #5F5F5F", " e c #C1D5EA", " r c #5B5B5B", " t c #7FA8D4", " y c #515151", " u c #B1CAE4", " i c #4779B4", " p c #494949", " a c #A2BFDF", " s c #86ABD4", " d c #95B8DC", " f c #AEC8E4", " g c #4971A5", " h c #B8CFE7", " j c #3567A5", " k c #4F79AE", " l c #3465A4", " z c #81A9D5", " x c #9BBBDE", " c c #3C6AA5", " v c #CACACA", " b c #C8C8C8", " n c #8CB0D9", " m c #C4C4C4", " M c #C0C0C0", " N c #BABABA", " B c #3968A5", " V c #3766A3", " C c #88AED8", " Z c #B2B2B2", " A c #B0B0B0", " S c #AEAEAE", " D c #ACACAC", " F c #AAAAAA", " G c #92B5DB", " H c #3868A7", " J c #A6A6A6", " K c #3666A5", " L c #A4A4A4", " P c #C4D7EB", " I c #A0A0A0", " U c #9E9E9E", " Y c #82AAD5", " T c #9C9C9C", " R c #9A9A9A", " E c #406DA8", " W c #6A7F99", " Q c #8EB3DA", " ! c #C1C1C0", " ~ c #808080", " ^ c #7A7A7A", " / c #787878", " ( c #454F5D", " ) c #747474", " _ c #94B6DC", " ` c #93B6DB", " ' c #A5A5A4", " ] c #598CC3", " [ c #6E6E6E", " { c #3463A2", " } c #6C6C6C", " | c #6A6A6A", ". c #84ABD6", ".. c #B7CFE7", ".X c #606060", ".o c #608FC3", ".O c #3465A5", ".+ c #565656", ".@ c #B3CBE6", ".# c #8F949B", ".$ c #FFFFFF", ".% c #4C4C4C", ".& c #8BB0D9", ".* c #484848", ".= c #688FBD", ".- c #3868A5", ".; c #85ACD6", ".: c #B7CEE6", ".> c #68809F", "., c #91B5DB", ".< c #3768A7", ".1 c #3566A5", ".2 c #B4CCE6", ".3 c #C9C9C9", ".4 c #8DB1DA", ".5 c #C7C7C7", ".6 c #C5C5C5", ".7 c #BED3E9", ".8 c #BDBDBD", ".9 c #5C8EC4", ".0 c #B7B7B7", ".q c #B3B3B3", ".w c None", /* pixels */ ".w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w", " ^ 2 2 2 2 2 2.w.w.w.w.w.w.w.w.w", " /.3.5.6 m m Z 3.w.w.w.w.w.w.w.w", " 5.6 A . X F F ^ 7 } 9 9 | [.w.w", " [ ! D F @ $ L o N.6 b v M q.w.w", " |.8 o J % & I * * I & % % w.w.w", " q.0 J % I - T ; R ; T U U r.w.w", " w.q % g B B B B B B B B B V K.<", " r S I.-.2 0 0...:.:.:.:.:.: u.O", ".+ o U <.7 O., G O O O O ` d.@.1", " y ' T c e 4 4 4 4 4 4 4 Q 8 :.1", ".% & ; E P x x x x x _.& C.4 h.1", ".* ;.# k f 6 + n.; t , , , Y a #", " p >.>.= =.& Y z z z z z z. s H", " 1 W B.o.9 ] ] ] ] ] ] ] ] ] i j", " ( l l l l l l l l l l l l l l.w" }; /* apps/help-browser.png */ /* XPM */ const char *tango_help_browser[] = { /* width height ncolors chars_per_pixel */ "16 16 153 2", /* colors */ " c #7497C1", " . c #D6DEE9", " X c #466DA1", " o c #8BA5C7", " O c #2F5891", " + c #E6EBF2", " @ c #E4E9F0", " # c #4B6E9F", " $ c #8CA2C1", " % c #6B8FBB", " & c #567CAD", " * c #5278A9", " = c #829DC1", " - c #AABAD1", " ; c #EDF0F5", " : c #FDFDFE", " > c #6387B6", " , c #4B72A5", " < c #345D95", " 1 c #6482AD", " 2 c #335B94", " 3 c #617EAA", " 4 c #BAC9DD", " 5 c #CDDAE9", " 6 c #E8ECF3", " 7 c #2E558F", " 8 c #2D558E", " 9 c #E6EAF1", " 0 c #C8D4E4", " q c #7296C1", " w c #C2CEDE", " e c #4D6FA0", " r c #A0B9D7", " t c #5A7FB0", " y c #728FB7", " u c #5B7AA7", " i c #2A538E", " p c #7999C1", " a c #F2F5F9", " s c #F0F3F7", " d c #365C93", " f c #BDCADC", " g c #FEFEFE", " h c #597AA8", " j c #6D8BB5", " k c #6B89B3", " l c #6987B1", " z c #6286B4", " x c #4D73A6", " c c #386098", " v c #214B88", " b c #6381AB", " n c #EDF1F7", " m c #315891", " M c #E9EDF3", " N c #6C8DB7", " B c #2D5690", " V c #86A1C3", " C c #5C7BA7", " Z c #9BB2D1", " A c #C9D7E7", " S c #6C88B0", " D c #6587B3", " F c #BDC9DB", " G c #547AAC", " H c #3B639A", " J c #6B88B2", " K c #244E8A", " L c #234C89", " P c #224C88", " I c #8FA8C8", " U c #6582AC", " Y c #CBD6E5", " T c #6085B4", " R c #94A9C6", " E c #5E83B2", " W c #325B94", " Q c #E5EAF1", " ! c #3B6096", " ~ c #C0CCDD", " ^ c #8CA1C1", " / c #6A8EBA", " ( c #5978A6", " ) c #5878A5", " _ c #3C649A", " ` c #264F8B", " ' c #254F8A", " ] c #94ADCC", " [ c #6284B2", " { c #F1F5F9", " } c #F0F3F8", " | c #EFF3F7", ". c #A9B9D0", ".. c #496FA3", ".X c #345C95", ".o c #335C94", ".O c #E8EDF3", ".+ c #B7C6DA", ".@ c #E7EBF2", ".# c #2C548D", ".$ c #A6B9D3", ".% c #7093BF", ".& c #42699F", ".* c #40679D", ".= c #5176A7", ".- c #27508B", ".; c #6A86AF", ".: c #ADBCD3", ".> c #F1F4F8", "., c #7594BD", ".< c #EFF2F6", ".1 c #A0B5D0", ".2 c #FFFFFF", ".3 c #678BB9", ".4 c #9BAFCB", ".5 c #6589B7", ".6 c #4C72A5", ".7 c #204A87", ".8 c #6482AC", ".9 c #A7B8D0", ".0 c #E9EEF3", ".q c #2F578F", ".w c #2D558D", ".e c #CAD6E5", ".r c #F9FBFC", ".t c #C6D2E1", ".y c #7396C1", ".u c #90A5C3", ".i c #6F92BD", ".p c #456CA1", ".a c #9FB7D5", ".s c #436A9F", ".d c #5D7CA8", ".f c #718DB5", ".g c #E3E8F0", ".h c #385E94", ".j c #9DB7D6", ".k c #D1DBE8", ".l c #47699C", ".z c #A0B4CF", ".x c #3A6299", ".c c #254F8B", ".v c #386097", ".b c #234D89", ".n c #224B88", ".m c #EFF3F8", ".M c #7191BB", ".N c #EBEFF4", ".B c #89A1C2", ".V c #CCD7E6", ".C c #FBFCFD", ".Z c #789BC5", ".A c None", /* pixels */ ".A.A.A.A.A.7.7.7.7.7.7.A.A.A.A.A", ".A.A.A.A.# ^ F.N.N F $.#.A.A.A.A", ".A.A.7 u.g. U ! ! U - @ C.7.A.A", ".A.A 3.@ (.l w s 9.9 e 1.O.d.A.A", ".A 8 Q ).7 S : ..<.2 f c k +.w.A", ".7.u. .7.7 # e W h.2.C X.s.+ R.7", ".7 ~ U.7.- B.X.x.B.2 6 , x V.t L", ".7 ; d ' B < H j.r g = G & N | v", ".7 ;.h i 2.x.&.O.2.1 t E T., }.n", ".7 ~.; O.v.*.= 0.e z >.3 / Z.V K", ".7.u.:.o _.p * I ].5 %.%.y A.z v", ".A 8 + l.*.. [.2.2.i q.Z.j n.q.A", ".A.A b.0 y.6 D.2.2 .Z r { J.A.A", ".A.A.7.8 M 4 o.M p.a 5.m.f `.A.A", ".A.A.A.A 7.4 Y.> a.k.$ m.A.A.A.A", ".A.A.A.A.A.7.b P P.c v.A.A.A.A.A" }; /* mimetypes/image-x-generic.png */ /* XPM */ const char *tango_image_x_generic[] = { /* width height ncolors chars_per_pixel */ "16 16 87 1", /* colors */ " c #6583AF", ". c #95A8C7", "X c #6381AD", "o c #617FAB", "O c #A5B5D0", "+ c #738EB6", "@ c #3F516F", "# c #384151", "$ c #3D4F6D", "% c #5B7BA8", "& c #45546E", "* c #7A8698", "= c #5475A4", "- c #98ABC9", "; c #67758F", ": c #A8B8D2", "> c #9CA7B9", ", c #839ABE", "< c #6180AD", "1 c #D1DCB1", "2 c #8691A3", "3 c #A4B8A9", "4 c #515151", "5 c #FEFEFE", "6 c #485773", "7 c #E2EBBE", "8 c #5778A6", "9 c #9AACCA", "0 c #7D899D", "q c #F6F6F6", "w c #9EA8BA", "e c #7892B9", "r c #A8B7D1", "t c #374762", "y c #818A9A", "u c #93A6C6", "i c #A2B3CE", "p c #8099BD", "a c #FFFFFE", "s c #405374", "d c #889EC1", "f c #869CBF", "g c #455672", "h c #435470", "j c #96A9C8", "k c #A6B6D1", "l c #33476A", "z c #FEFEF9", "x c #3D4E6D", "c c #888A85", "v c #3B4C6B", "b c #B6C5B2", "n c #8CA1C1", "m c #6D89B3", "M c #415474", "N c #C4D1AF", "B c #EEF3CB", "V c #475773", "C c #818DA2", "Z c #2F4262", "A c #DCE5B9", "S c #384C6E", "D c #A7B7D1", "F c #7590B7", "G c #34486A", "H c #9DAFC7", "J c #5072A3", "K c #6884AA", "L c #233659", "P c #8FA6AF", "I c #FDFDFD", "U c #6986B1", "Y c #819AB8", "T c #9FA9BB", "R c #9EA9BA", "E c #5F7EAA", "W c #B3C2B7", "Q c #728DB6", "! c #A1B3C3", "~ c #FCFDEE", "^ c #8EA3C4", "/ c #F7FADF", "( c #495973", ") c #C5D1B1", "_ c #3D5071", "` c #718DA7", "' c None", /* pixels */ "cccccccccccccccc", "c55555555555555c", "cI*tttttttttt*qc", "c5@oXK`E%8==Jtqc", "cIh+PAB3mU 44ytqc", "cItx$$xvZL44#tqc", "cItMs_SGl4444tqc", "cItC;;;;;;;;;tqc", "cI*tttttttttt*qc", "c5qqqqqqqqqqqqIc", "cccccccccccccccc" }; /* actions/go-previous.png */ /* XPM */ const char *tango_go_previous[] = { /* width height ncolors chars_per_pixel */ "16 16 99 2", /* colors */ " c #65A827", " . c #6EC915", " X c #C6DEAE", " o c #C2DCAA", " O c #52891E", " + c #3B7504", " @ c #CAE0B5", " # c #7CC833", " $ c #67C111", " % c #AACF88", " & c #97DA54", " * c #97BD72", " = c #6BA236", " - c #A0C37E", " ; c #55A409", " : c #61B70E", " > c #A9D480", " , c #60B50D", " < c #87B65B", " 1 c #3C7604", " 2 c #C7DFB1", " 3 c #9DC477", " 4 c #87BB54", " 5 c #3A7405", " 6 c #82B74F", " 7 c #A5DC6E", " 8 c #457C13", " 9 c #88BB58", " 0 c #60A420", " q c #B8D69B", " w c #90BF63", " e c #B3D296", " r c #3D7904", " t c #A6CF7F", " y c #C5DEAE", " u c #8DC459", " i c #96CA65", " p c #3A7304", " a c #59AC0B", " s c #598B29", " d c #578927", " f c #41790E", " g c #ACD881", " h c #5EA31D", " j c #70AD35", " k c #6EA23D", " l c #7FB947", " z c #C4DDAC", " x c #7AB742", " c c #4E9A06", " v c #3B7604", " b c #4D8419", " n c #3B7404", " m c #A5D576", " M c #A3CA7E", " N c #5AAD0B", " B c #AEDB82", " V c #65B519", " C c #A9D77D", " Z c #5A8C2C", " A c #7DA855", " S c #8BBD5C", " D c #61B60E", " F c #71B035", " G c #7BB642", " H c #66AF20", " J c #BFDAA6", " K c #75B23C", " L c #B0DE83", " P c #3F790A", " I c #A7CD84", " U c #FFFFFF", " Y c #A5C982", " T c #80B64D", " R c #5D8D2E", " E c #7FA956", " W c #56A609", " Q c #8ABC5A", " ! c #89BC59", " ~ c #87BA57", " ^ c #91C064", " / c #68A92B", " ( c #BDD9A3", " ) c #519E07", " _ c #5EB30D", " ` c #94C26A", " ' c #C8DFB1", " ] c #A3D572", " [ c #69C211", " { c #66AC22", " } c #3A7404", " | c #5CAD0E", ". c #7DB549", ".. c #58A90A", ".X c #437A10", ".o c #62AF17", ".O c #85B954", ".+ c #B5D497", ".@ c None", /* pixels */ ".@.@.@.@.@.@.@.@.@.@ +.@.@.@.@.@", ".@.@.@.@.@.@.@.@ n s p.@.@.@.@.@", ".@.@.@.@.@.@.@ } E ' p.@.@.@.@.@", ".@.@.@.@.@.@.X - ( @ p.@.@.@.@.@", ".@.@.@.@ n R e % ^ 2 v p p p p }", ".@.@.@ 5 A.+ ` ~ S z y X y z o p", ".@.@ 8 * I T. 6.O 9 ! Q ! 9 J p", " + Z Y w j K G l x F h 0 / q p", " + d 3 4 { H.o | a.. ; ) c c M p", ".@.@ f < i V , : D _ N W ) c M p", ".@.@.@ + k m # [ $ B g > t M M p", ".@.@.@.@ v O ] & . L r p p p p }", ".@.@.@.@.@.@ P u 7 L p.@.@.@.@.@", ".@.@.@.@.@.@.@ 1 = C p.@.@.@.@.@", ".@.@.@.@.@.@.@.@ v b p.@.@.@.@.@", ".@.@.@.@.@.@.@.@.@.@ +.@.@.@.@.@" }; /* actions/system-log-out.png */ /* XPM */ const char *tango_system_log_out[] = { /* width height ncolors chars_per_pixel */ "16 16 186 2", /* colors */ " c #E26E6E", " . c #D94141", " X c #E5E6E4", " o c #ECE3E1", " O c #AFAFAF", " + c #ADADAD", " @ c #ABABAB", " # c #A9A9A9", " $ c #A7A7A7", " % c #E88E8E", " & c #A5A5A5", " * c #A3A3A3", " = c #5C5E5A", " - c #A1A1A1", " ; c #A20E0E", " : c #585A56", " > c #9D9D9D", " , c #565854", " < c #D23D3D", " 1 c #999999", " 2 c #979797", " 3 c #959595", " 4 c #939393", " 5 c #AC1111", " 6 c #919191", " 7 c #8F8F8F", " 8 c #8D8D8D", " 9 c #8B8B8B", " 0 c #898989", " q c #EA9696", " w c #E16969", " e c #F1F1EF", " r c #858585", " t c #A50000", " y c #EFEFED", " u c #645F5E", " i c #7F7F7F", " p c #EB9A9A", " a c #797979", " s c #A60404", " d c #757575", " f c #A11616", " g c #E88D8D", " h c #6F6F6F", " j c #D9DBD7", " k c #A61111", " l c #D7D9D5", " z c #656565", " x c #D23C3C", " c c #989897", " v c #DB4848", " b c #D21B1B", " n c #5D5D5D", " m c #C7C9C5", " M c #C6C9C4", " N c #595959", " B c #B02121", " V c #898A88", " C c #EA9595", " Z c #CF0E0E", " A c #878886", " S c #EDD4D3", " D c #FAFAFA", " F c #E78888", " G c #A60303", " H c #CD6161", " J c #686A67", " K c #D32525", " L c #9A9B98", " P c #D73636", " I c #D79292", " U c #929390", " Y c #8A6464", " T c #C6C8C3", " R c #B12221", " E c #8D8F8B", " W c #DD5656", " Q c #B51B1B", " ! c #C42D2D", " ~ c #D0D2D0", " ^ c #F3F1EF", " / c #D63838", " ( c #7F817D", " ) c #FBFBFA", " _ c #D52D2D", " ` c #BEBEBE", " ' c #F3F3F2", " ] c #BABABA", " [ c #737571", " { c #EFEFEE", " } c #DB4D4D", " | c #AC1515", ". c #C46C6B", ".. c #E4E5E3", ".X c #686966", ".o c #656763", ".O c #DC5151", ".+ c #646562", ".@ c #AAAAAA", ".# c #C58886", ".$ c #61635F", ".% c #CE0808", ".& c #A6A6A6", ".* c #5F615D", ".= c #A4A4A4", ".- c #A2A2A2", ".; c #5B5D59", ".: c #C5C7C1", ".> c #A0A0A0", "., c #595B57", ".< c #9E9E9E", ".1 c #575955", ".2 c #9C9C9C", ".3 c #555753", ".4 c #9A9A9A", ".5 c #989898", ".6 c #969696", ".7 c #949494", ".8 c #BC2424", ".9 c #929292", ".0 c #867979", ".q c #8C8C8C", ".w c #F4F4F2", ".e c #888888", ".r c #868686", ".t c #858685", ".y c #F0F0EE", ".u c #DB4C4C", ".i c #BC3E3E", ".p c #828282", ".a c #808080", ".s c #7E7E7E", ".d c #767676", ".f c #707070", ".g c #7E6A6A", ".h c #6E6E6E", ".j c #D8DAD6", ".k c #C53636", ".l c #A2A3A1", ".z c #6C6C6C", ".x c #AC2524", ".c c #D6D8D4", ".v c #AA0B0B", ".b c #D4D6D2", ".n c #B01E1E", ".m c #686868", ".M c #646464", ".N c #DA9696", ".B c #606060", ".V c #B72828", ".C c #A51413", ".Z c #D11A1A", ".A c #C3C6C1", ".S c #8B7373", ".D c #BC3030", ".F c #FFFFFF", ".G c #FBFBFB", ".H c #F9F9F9", ".J c #D43A3A", ".K c #ECA7A7", ".L c #C76565", ".P c #696B68", ".I c #C6C9C3", ".U c #A90C0C", ".Y c #BEC1BB", ".T c #CE0C0C", ".R c #D33535", ".E c #DB4A4A", ".W c #C45151", ".Q c #C3C3C3", ".! c #F8F8F7", ".~ c #F6F6F5", ".^ c #BB4948", "./ c #CF1010", ".( c #F4F4F3", ".) c #BDBDBD", "._ c #BBBBBB", ".` c #B64543", ".' c #A50101", ".] c #EDEEEC", ".[ c #D26565", ".{ c #B93C3C", ".} c #6D6E6B", ".| c #A28988", "X c #D55E5E", "X. c None", /* pixels */ ".;.3.3.3.3.3.3.3 , =.+.X J.o.}X.", ".3.& r a.h z n N y e.(.~.~.] (X.", ".3 +.q i d.z.M.B y '.! ).G.H LX.", ".3 ] 3 0.s d.h.m {.w.H I.i D.lX.", ".3._ >.7 0 i.d.f.y ^.L.W | S.|X.", ".3.).> 2 7.r.s.d o.{ H.K.D.V R.'", ".3 `.-.4 6.e.a.g B.[ F % C q p.'", ".3 `.=.2 4 9 Y kX w v.E.u } g G", ".3 ` $.<.6 8 f.k W _ K.Z./ b s", ".3 ` # -.5 7.S ; ! P.%.T.T Z.O.'", ".3 `.@ *.4.9 0.0.x.8 / ..J x < t", ".3 `.@ & > 3 7.p u.^ Q.R s.n.C.v", ".3 `.@ # - 1 h V ~... 5.U X AX.", ".3 ` @ O.t E m.b l.j j.#.`.c [X.", ".3.Q c U.Y.A T.I M M M M M.:.$X.", ".;.P ,.1 : : : :.,.,.,.,., :.*X." }; /* actions/list-remove.png */ /* XPM */ const char *tango_list_remove[] = { /* width height ncolors chars_per_pixel */ "16 16 20 1", /* colors */ " c #000000", ". c #7DA6D7", "X c #86ADD9", "o c #9FBEE0", "O c #B6CCE6", "+ c #83AAD8", "@ c #BBD1E7", "# c #7FA8D7", "$ c #94B6DB", "% c #3465A4", "& c #95B7DB", "* c #B5CCE6", "= c #B4CCE5", "- c #92B4DA", "; c #B6CDE6", ": c #B7CEE6", "> c #90B3DA", ", c #C0D3E8", "< c #BCD1E7", "1 c None", /* pixels */ "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "11%%%%%%%%%%%%11", "11%,@<::::;*O%11", "11%=&$->X+#.o%11", "11%%%%%%%%%%%%11", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111" }; /* devices/multimedia-player.png */ /* XPM */ const char *tango_multimedia_player[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #666864", ". c #626460", "X c #858782", "o c #80817D", "O c #7E7F7B", "+ c #7D7F7A", "@ c #7C7D79", "# c #7B7D78", "$ c #CBCFAC", "% c #7A7B77", "& c #696B66", "* c #CBD0A5", "= c #676964", "- c #C9D0A3", "; c #A4A6A3", ": c #D1D6AE", "> c #5B5B58", ", c #BDC58D", "< c #B2B796", "1 c #C3C996", "2 c #8A8C89", "3 c #B8B9B6", "4 c #A5A7A3", "5 c #989996", "6 c #C3C79F", "7 c #BFC59B", "8 c #C5C9A4", "9 c #838581", "0 c #7C7D7A", "q c #AEAEAB", "w c #A8AAA5", "e c #6E6F6C", "r c #A2A49F", "t c #BEC496", "y c #969893", "u c #92948F", "i c #91928E", "p c #BBC096", "a c #555753", "s c #535551", "d c #888A85", "f c #80827D", "g c #B8BCAA", "h c #CFD4B0", "j c #7E807B", "k c #7C7E79", "l c #7A7C77", "z c #787A75", "x c #747671", "c c #70726D", "v c #6E706B", "b c #6C6E69", "n c #6A6C67", "m c #686A65", "M c #9B9D9A", "N c #939592", "B c #C3CA96", "V c #B6B6B4", "C c #B4B5A8", "Z c #BBC291", "A c #ADAEAB", "S c #A5A6A3", "D c #A4A6A2", "F c #9FA09D", "G c #696968", "H c #B8BCA8", "J c #B3BC78", "K c #B6BAA6", "L c #898A87", "P c #C4CAA3", "I c #C5CB9A", "U c #B9B9B6", "Y c #C9CEAB", "T c #787A76", "R c #767874", "E c #BBC286", "W c #747672", "Q c #A6A7A3", "! c None", /* pixels */ "saaaaaaaaaaaaaaa", "aRQQQ444444S;DRa", "a5i%%%@@@@@Ood5a", "a5N<68Y$P7tZh25a", "a5rpBI-*1,EJ:y5a", "a5uCgHHHHHHKKX5a", "a5vbbnbvbnnbnn5a", "a5&=m==&m==&=m5a", "a5zqMwAWxWc>. 5a", "a5L3DVU+++TG0e5a", "a5+++++++++9fj5a", "a5kkkkkkkkkkkk5a", "a5#F#F########5a", "a5llllllllllll5a", "aR555555555555Ra", "aaaaaaaaaaaaaaaa" }; /* apps/internet-web-browser.png */ /* XPM */ const char *tango_internet_web_browser[] = { /* width height ncolors chars_per_pixel */ "16 16 167 2", /* colors */ " c #000000", " . c #56719D", " X c #6984A9", " o c #DCE1E5", " O c #F1F2F3", " + c #8BA7C7", " @ c #84A6CA", " # c #DFEFFF", " $ c #93B6DC", " % c #EDEEEF", " & c #5A79A4", " * c #5979A3", " = c #5877A2", " - c #BCC4CC", " ; c #B1C0D5", " : c #E3E4E5", " > c #5685B7", " , c #B1CEEC", " < c #627CA5", " 1 c #B3C1D0", " 2 c #F0F4F8", " 3 c #B5BEC8", " 4 c #CCDDEF", " 5 c #DBDEE0", " 6 c #7591B4", " 7 c #759FCB", " 8 c #BED4EB", " 9 c #F8F9F9", " 0 c #B7C2CD", " q c #BECFE1", " w c #BCCDDF", " e c #5B7AA4", " r c #B5C5D8", " t c #5978A2", " y c #93ABC7", " u c #C6CFD8", " i c #D4DDE9", " p c #A3B8D0", " a c #A0B4CD", " s c #BEC7D0", " d c #CAD5DF", " f c #5988BC", " g c #E0E3E4", " h c #DFE1E3", " j c #83A7CE", " k c #637FA8", " l c #617FA6", " z c #FEFEFE", " x c #D7D9DB", " c c #DCE4ED", " v c #F6F6F6", " b c #5E7DA6", " n c #628FC1", " m c #CCD9E7", " M c #E6EBF0", " N c #C0C6CE", " B c #57759F", " V c #DBE4EF", " C c #E2E2E2", " Z c #80A7D1", " A c #E0E0E0", " S c #B7C8DC", " D c #B1C2D6", " F c #DCE3E9", " G c #6B96C6", " H c #7A95B7", " J c #BABFC4", " K c #A9BCD1", " L c #D9E1E9", " P c #CED0D1", " I c #6983A6", " U c #C8CFD5", " Y c #7591B5", " T c #9DA6AE", " R c #6D90B7", " E c #D2E5F9", " W c #819ABA", " Q c #DEE2E7", " ! c #D6DFE9", " ~ c #A3B6CE", " ^ c #DAEAFA", " / c #CFD9E2", " ( c #5A7AA4", " ) c #5C8ABD", " _ c #A2BDDA", " ` c #D5DFEB", " ' c #A5B7C9", " ] c #CCD7E2", " [ c #C3D2E3", " { c #5686BA", " } c #E3F1FF", " | c #C8CED4", ". c #E2EFFE", ".. c #7792B6", ".X c #516994", ".o c #9BB2CC", ".O c #9AB0CB", ".+ c #839BBB", ".@ c #C9E1F9", ".# c #F4F4F5", ".$ c #CED1D3", ".% c #E0EFFF", ".& c #4F80B6", ".* c #CEDBEA", ".= c #5D7DA6", ".- c #5A79A3", ".; c #5877A1", ".: c #E0E5EB", ".> c #94ACC8", "., c #7E97B9", ".< c #6C96C5", ".1 c #BECBDA", ".2 c #E6EBF4", ".3 c #DAEBFC", ".4 c #D4E5F6", ".5 c #E4E6E8", ".6 c #E2E4E6", ".7 c #9CBDE0", ".8 c #6380A8", ".9 c #C7CDD2", ".0 c #ACCAE9", ".q c #BBC9DA", ".w c #9DB3CD", ".e c #5E7AA3", ".r c #FDFDFD", ".t c #BCD7F2", ".y c #FBFBFB", ".u c #5A769F", ".i c #F9F9F9", ".p c #58749D", ".a c #AABED3", ".s c #F5F5F5", ".d c #E1F0FF", ".f c #EFEFEF", ".g c #BECAD6", ".h c #BCC8D4", ".j c #5876A0", ".k c #719BC9", ".l c #B5D1EE", ".z c #B8BFC6", ".x c #576F95", ".c c #D5DFE9", ".v c #DEEEFF", ".b c #B8C9DD", ".n c #627BA3", ".m c #101221", ".M c #AEB5BC", ".N c #AFBFD4", ".B c #4B6189", ".V c #D3D3D3", ".C c #D1D1D1", ".Z c #7994B6", ".A c #DCDDDF", ".S c #B4C7DC", ".D c #9FB4CE", ".F c #A4B5C9", ".G c #9CB2CB", ".H c #708AAD", ".J c #CCE3FA", ".K c #ABBDD3", ".L c #B3CCE8", ".P c #E2F1FF", ".I c #617FA8", ".U c #DEEDFB", ".Y c #D5E8FC", ".T c #5977A0", ".R c None", /* pixels */ ".R.R.R.R.R.j e ( t =.R.R.R.R.R.R", ".R.R.R.e.+.q c.2 ` D., *.R.R.R.R", ".R.R l ;.: / J.1 8.g L ~.-.R.R.R", ".R X.N Q.$. .U.4.h N 5 M a (.R.R", ".n W 2 : d.P } ^ u x.#.y.c.Z.R.R", ".H r g 4.%.d.d.3.9 s.F 3.5 p (.R", ".8 i.a.J.v # #.*.r z.r.6.A w (.R", " e V.0.t.@.Y E U z z z.i.M [ (.R", " b m 0 |.L.l , K 9 O z.f P.b (.R", " k.K o z h _.7 $ @ +.s C T.w (.R", " < H ! z z % j Z 7.< A.V ' Y.R.R", ".R.I.G F v.z.k G n f.C -.> (.R.R", ".R.R.=.O ] R ) {.& > 1 y *.R.R.R", ".R.R.R I...D S q.S.o 6.T.R.R.R.R", ".R.R.R.R.x.u.- & t.p.R.R.R.R.R.R", ".R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R" }; /* actions/list-add.png */ /* XPM */ const char *tango_list_add[] = { /* width height ncolors chars_per_pixel */ "16 16 20 1", /* colors */ " c #000000", ". c #7DA6D7", "X c #86ADD9", "o c #9FBEE0", "O c #B6CCE6", "+ c #83AAD8", "@ c #BBD1E7", "# c #7FA8D7", "$ c #94B6DB", "% c #3465A4", "& c #95B7DB", "* c #B5CCE6", "= c #B4CCE5", "- c #92B4DA", "; c #B6CDE6", ": c #B7CEE6", "> c #90B3DA", ", c #C0D3E8", "< c #BCD1E7", "1 c None", /* pixels */ "1111111111111111", "1111111111111111", "111111%%%%111111", "111111%::%111111", "111111%::%111111", "111111%::%111111", "11%%%%%::%%%%%11", "11%,@<::::;*O%11", "11%=&$->X+#.o%11", "11%%%%%XX%%%%%11", "111111%:X%111111", "111111%:X%111111", "111111%::%111111", "111111%%%%111111", "1111111111111111", "1111111111111111" }; /* apps/preferences-desktop-font.png */ /* XPM */ const char *tango_preferences_desktop_font[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #000000", ". c #B1B1B1", "X c #ADADAD", "o c #A7A7A7", "O c #797979", "+ c #EAEBEB", "@ c #E9E9EA", "# c #E8E9E9", "$ c #5F5F5F", "% c #4D4D4D", "& c #4B4B4B", "* c #FCFCFC", "= c #494949", "- c #FAFAFA", "; c #474747", ": c #F8F8F8", "> c #F6F6F6", ", c #F4F4F4", "< c #F2F2F2", "1 c #F0F0F0", "2 c #EEEEEE", "3 c #ECECEC", "4 c #E8E8E8", "5 c #E6E6E6", "6 c #E5E6E5", "7 c #E4E4E4", "8 c #E2E2E2", "9 c #2F2F2F", "0 c #CECECE", "q c #050505", "w c #EAE9E9", "e c #010101", "r c #E8E7E7", "t c #E7E7E6", "y c #8A8C87", "u c #888A85", "i c #828282", "p c #7C7C7C", "a c #767676", "s c #747474", "d c #E4E4E5", "f c #666666", "g c #626262", "h c #565656", "j c #FFFFFF", "k c #FDFDFD", "l c #4A4A4A", "z c #FBFBFB", "x c #484848", "c c #F9F9F9", "v c #F7F7F7", "b c #F5F5F5", "n c #F3F3F3", "m c #F1F1F1", "M c #EFEFEF", "N c #EDEDED", "B c #ECEDEC", "V c #ECEBEC", "C c #EBEBEB", "Z c #EAEBEA", "A c #E9E9E9", "S c #E6E7E6", "D c #343434", "F c #E4E5E4", "G c #E4E3E4", "H c #E3E3E3", "J c #2E2E2E", "K c #2C2C2C", "L c #DBDBDB", "P c #222222", "I c #D3D3D3", "U c #202020", "Y c #BFBFBF", "T c #B8B9B8", "R c #060606", "E c #ECECEB", "W c #040404", "Q c #EBEAEA", "! c None", /* pixels */ "!uuuuuuuuuuuuuu!", "ujjjjjjjjjjjjjju", "ujHoi99H5555HHku", "ujH8L09H4A44HHku", "ujH.9s95S56dGHku", "ujH9IY9AAw#r5Fzu", "uj7999T&9BV+Atzu", "uj53N2M;K1M2E@:u", "uj4NM1mxUD eg<>u", "ujwM1=RmzI aMu", "uj+<,>vl Ov$ XMu", "ujQ<,>:hJPW %vMu", "uj******--->>>Mu", "!uuuuuuuuuuuuuu!" }; /* actions/process-stop.png */ /* XPM */ const char *tango_process_stop[] = { /* width height ncolors chars_per_pixel */ "16 16 136 2", /* colors */ " c #000000", " . c #BF0000", " X c #EB4C4C", " o c #F68888", " O c #D89292", " + c #E8BCBC", " @ c #FCF7F7", " # c #EF6A6A", " $ c #DB3C3C", " % c #ED4747", " & c #DF2C2C", " * c #B22424", " = c #B82323", " - c #D75F5F", " ; c #D52F2F", " : c #F58383", " > c #C41B1B", " , c #B41F1F", " < c #F26969", " 1 c #C10101", " 2 c #CC0F0F", " 3 c #E4AAAA", " 4 c #E9A5A5", " 5 c #F68787", " 6 c #D22F2F", " 7 c #C70000", " 8 c #BF1919", " 9 c #F78B8B", " 0 c #E6A5A5", " q c #D13131", " w c #DF2B2B", " e c #BF0505", " r c #D85C5C", " t c #CF2F2F", " y c #BD0303", " u c #E83737", " i c #E6E0E0", " p c #C92929", " a c #FEFEFE", " s c #880000", " d c #CC2F2F", " f c #DB4141", " g c #C10000", " h c #E6ABAB", " j c #E6D9D9", " k c #DA6464", " l c #ECECEC", " z c #EA3F3F", " x c #E8E8E8", " c c #D75757", " v c #DACDCD", " b c #EB4343", " n c #D85B5B", " m c #ED5252", " M c #BD0202", " N c #D31111", " B c #BC1818", " V c #E6DFDF", " C c #E63434", " Z c #B32626", " A c #AF2222", " S c #DB4040", " D c #B41D1D", " F c #EC6161", " G c #EF5A5A", " H c #890303", " J c #D65F5F", " K c #ED6565", " L c #D85A5A", " P c #D65858", " I c #DA3B3B", " U c #E39696", " Y c #E5A5A5", " T c #BE0505", " R c #CE2F2F", " E c #C30000", " W c #D01010", " Q c #E73737", " ! c #B01818", " ~ c #D21F1F", " ^ c #890202", " / c #CB0101", " ( c #870000", " ) c #E83B3B", " _ c #CE2828", " ` c #F17575", " ' c #EE6868", " ] c #BD0000", " [ c #F3EDED", " { c #F68A8A", " } c #DB5F5F", " | c #C70303", ". c #B12222", ".. c #BE0404", ".X c #D75B5B", ".o c #E5DFDF", ".O c #E94545", ".+ c #C71D1D", ".@ c #B72121", ".# c #F9F9F9", ".$ c #DC4242", ".% c #B11B1B", ".& c #F1F1F1", ".* c #9E3333", ".= c #EDEDED", ".- c #F58585", ".; c #F38383", ".: c #DFDFDF", ".> c #DA6767", "., c #DBDBDB", ".< c #F68989", ".1 c #D23131", ".2 c #A43F3F", ".3 c #D02F2F", ".4 c #C50000", ".5 c #D93B3B", ".6 c #D53737", ".7 c #DE9292", ".8 c #DF2D2D", ".9 c #F06F6F", ".0 c #890000", ".q c #C51A1A", ".w c #B11A1A", ".e c #D63B3B", ".r c #D52323", ".t c #EC4A4A", ".y c #E2DEDE", ".u c #D89999", ".i c #DEACAC", ".p c #B82424", ".a c #D76060", ".s c #D53030", ".d c #DAD6D6", ".f c #880202", ".g c #860000", ".h c None", /* pixels */ ".h.h.h.h.0.g.g.g.g.g.g.0.h.h.h.h", ".h.h.h.0 A o 9 9 { 5 : =.0.h.h.h", ".h.h.0. .;.$ ; ; ; ; $ ` ,.0.h.h", ".h.0 *.;.$.6 ; ; ; ;.6 I.9.%.0.h", ".0 Z.; f c v - ; ; r j }.5 # !.0", ".f.< S ; O.,.d.a L i.= Y 6.e '.f", " H o ; ;.s.u.:.y V l h.1.3 R K ^", " H o ; ; ;.s.i x l + q t R d F ^", " H o ; ; ; n V l.& [ k R d p.O ^", " H.- ; ;.X.o l 3 0.# @.>.q M u ^", ".f <.r ~.7 l 3.3 _ 4 a U ] y C ^", ".0.p G N / P |.4 E 1 J M.. w.+ (", ".h.0.@ m W 7.4 E g . ] T & > s.h", ".h.h.0 D X 2 E g . ] e.8 8 s.h.h", ".h.h.h.0.w.t % b z ) Q B s.h.h.h", ".h.h.h.h.0.g.g.g.g.g.g s.h.h.h.h" }; /* actions/view-refresh.png */ /* XPM */ const char *tango_view_refresh[] = { /* width height ncolors chars_per_pixel */ "16 16 100 2", /* colors */ " c #9DBDDC", " . c #6990C0", " X c #3767A6", " o c #3667A5", " O c #3565A4", " + c #DDE8F3", " @ c #8AACD3", " # c #99B9DB", " $ c #B4CBE5", " % c #D8E4F1", " & c #5783BB", " * c #537FB7", " = c #4B77AF", " - c #A0BEDE", " ; c #3868A6", " : c #3768A5", " > c #4C79B3", " , c #769DCF", " < c #5580B5", " 1 c #97B6D8", " 2 c #8FACD0", " 3 c #E4ECF5", " 4 c #4E7AB1", " 5 c #C8D8EA", " 6 c #4C78AF", " 7 c #8FB0D3", " 8 c #6D94C2", " 9 c #6891C7", " 0 c #3C6BA9", " q c #3A69A7", " w c #3969A6", " e c #C6D8EB", " r c #4774AD", " t c #C1D2E6", " y c #6890C0", " u c #CDDBEB", " i c #3465A4", " p c #6188B9", " a c #DBE6F2", " s c #BFD2E7", " d c #84A6CE", " f c #E5EDF5", " g c #C9D9EA", " h c #8FADD2", " j c #A1BEDD", " k c #3A6AA6", " l c #E2EBF5", " z c #88A7CE", " x c #3768A6", " c c #95B2D4", " v c #3566A4", " b c #C4D7EB", " n c #4371AB", " m c #A1BBD9", " M c #E7EEF6", " N c #BFD3E9", " B c #5F87B9", " V c #7298C5", " C c #5D85B7", " Z c #6C95C9", " A c #82A5CE", " S c #9CB7D7", " D c #C9DAEC", " F c #E3ECF5", " G c #4C78B0", " H c #8EAED3", " J c #4F7CB6", " K c #3969A7", " L c #3869A6", " P c #3767A5", " I c #A8C2DF", " U c #93B1D4", " Y c #4170AB", " T c #CCDDEE", " R c #B0C9E3", " E c #E5EDF6", " W c #E4EDF5", " Q c #FFFFFF", " ! c #4D79B0", " ~ c #C7D7E9", " ^ c #4C77AF", " / c #5B84B7", " ( c #D5E2F0", " ) c #3C6CA9", " _ c #3A6AA7", " ` c #E0E9F4", " ' c #A8C1DE", " ] c #8CADD3", " [ c #B4CAE3", " { c #3566A5", " } c #7299CD", " | c #88ABD2", ". c #CCDCED", ".. c #E6EEF6", ".X c #BCD1E7", ".o c #7EA4D5", ".O c #3D6DA9", ".+ c #3C6BA8", ".@ c #3B6BA7", ".# c None", /* pixels */ ".#.#.#.# q _ o K _.#.#.#.#.#.#.#", ".#.#.# ; y 7 I ' U B P.#.#.# i.#", ".#.# w ] j $ N T ( s = o n v.#", ".# K . V.+ v _ C m % a + z 5 _.#", ".# ; Y ) _.#.#.# L p u l.... _.#", ".# O _ 9 P.#.#.#.#.# v ~ e F k.#", ".# i.#.#.#.#.#.#.# ; 2 M a.. k.#", ".#.#.#.#.#.#.#.# i i r ^ ^ 6 i.#", ".# i i i i i i i.#.#.#.#.#.#.#.#", ".# i f E 3 S x.#.#.#.#.#.#.# i.#", ".# v.. b g i.#.#.#.#.# { Z * i.#", ".# P.. F W t ! L.#.#.# 0 J _ :.#", ".# ; % c ` +. h G { w w.O G _.#", ".# P / o 4 [ D.X R - | A H ;.#.#", ".# i o.#.# X < d 1 # @ 8 ;.#.#.#", ".# i.#.#.#.#.# _ L v _.@.#.#.#.#" }; /* actions/go-next.png */ /* XPM */ const char *tango_go_next[] = { /* width height ncolors chars_per_pixel */ "16 16 101 2", /* colors */ " c #8BBB5D", " . c #78B63D", " X c #9CD267", " o c #A7D17F", " O c #B7D49C", " + c #6EAC33", " @ c #C3DCAB", " # c #9EC976", " $ c #C2DCAA", " % c #66B817", " & c #8AC255", " * c #CBE0B6", " = c #3B7504", " - c #5AAC0B", " ; c #66BF10", " : c #5F8F31", " > c #5E8F30", " , c #82AB5A", " < c #6FBA26", " 1 c #9CC37A", " 2 c #54A408", " 3 c #89C350", " 4 c #61B70E", " 5 c #BBD99F", " 6 c #6CBF1C", " 7 c #C0DBA7", " 8 c #74AF3B", " 9 c #4F9C06", " 0 c #3C7804", " q c #3C7604", " w c #4D8418", " e c #A4CC7E", " r c #8BC158", " t c #AFD48C", " y c #CEE3BB", " u c #3A7405", " i c #598C2A", " p c #467C14", " a c #B1D291", " s c #88BB58", " d c #ABD781", " f c #A4C684", " g c #91C164", " h c #5FB20E", " j c #C7DEB0", " k c #C6DEAF", " l c #40790A", " z c #3A7304", " x c #568926", " c c #9BCA6D", " v c #81AB5A", " b c #52A007", " n c #A5D773", " m c #C5DDAD", " M c #4E9A06", " N c #3B7604", " B c #3B7404", " V c #A3CA7E", " C c #427A0E", " Z c #80BE44", " A c #8BBD5C", " S c #64BA11", " D c #AAD581", " F c #82BE49", " G c #92D352", " H c #6BAC2F", " J c #538B1E", " K c #A8DA78", " L c #5BAE0B", " P c #6CBA1F", " I c #8DC25A", " U c #FFFFFF", " Y c #8CBE5C", " T c #8BBC5B", " R c #ABD681", " E c #62B90E", " W c #B9D79C", " Q c #71A63E", " ! c #A0D56C", " ~ c #68A92B", " ^ c #9DC873", " / c #BDD9A3", " ( c #99C46F", " ) c #5EB30D", " _ c #7FCB34", " ` c #8CC358", " ' c #CBE1B7", " ] c #3A7404", " [ c #8DC15C", " { c #57A709", " } c #437A10", " | c #64BC0F", ". c #88C44D", ".. c #AACE89", ".X c #85B954", ".o c #84C249", ".O c #A6D37B", ".+ c #8FC161", ".@ c #6AA136", ".# c #8DC655", ".$ c None", /* pixels */ ".$.$.$.$.$ =.$.$.$.$.$.$.$.$.$.$", ".$.$.$.$.$ z i ].$.$.$.$.$.$.$.$", ".$.$.$.$.$ z ' , ].$.$.$.$.$.$.$", ".$.$.$.$.$ z y @ f }.$.$.$.$.$.$", " ] z z z z N * ( a O : B.$.$.$.$", " z 7 $ m k j j g.+ ^ 5 v u.$.$.$", " z /.X s T A Y [ I & ` t 1 p.$.$", " z W 8 + ~ H . F 3. .o Z c.. > =", " z V M M M b { L h % P <.# # x =", " z V M M 9 2 - ) E | 6 X C.$.$", " z V V V e o D 4 ; _ K Q N.$.$.$", " ] z z z z 0 R S G n J q.$.$.$.$", ".$.$.$.$.$ z d ! r l.$.$.$.$.$.$", ".$.$.$.$.$ z.O.@ q.$.$.$.$.$.$.$", ".$.$.$.$.$ z w N.$.$.$.$.$.$.$.$", ".$.$.$.$.$ =.$.$.$.$.$.$.$.$.$.$" }; /* actions/document-save-as.png */ /* XPM */ const char *tango_document_save_as[] = { /* width height ncolors chars_per_pixel */ "16 16 101 2", /* colors */ " c #000000", " . c #739FC0", " X c #6C8577", " o c #81ADD1", " O c #DFE2DE", " + c #DCDCDB", " @ c #8FB3CE", " # c #96BBD8", " $ c #4A7180", " % c #95A9AF", " & c #B7B8B6", " * c #4E6A7D", " = c #3D698A", " - c #AFB0AE", " ; c #AEB0AD", " : c #ACCBE3", " > c #ABCBE2", " , c #EDEDEE", " < c #E9E9EA", " 1 c #A2A4A1", " 2 c #6B716E", " 3 c #9BC2DF", " 4 c #38678B", " 5 c #6E99B6", " 6 c #FCFCFC", " 7 c #FAFAFA", " 8 c #6B7F88", " 9 c #F4F4F4", " 0 c #F3F4F3", " q c #F2F2F2", " w c #CED4C8", " e c #F0F0F0", " r c #EFEEEF", " t c #EEEEEE", " y c #EDEEED", " u c #ECECEC", " i c #627075", " p c #3F6C8E", " a c #719FBF", " s c #E4E4E4", " d c #79A7CA", " f c #DCDCDC", " g c #DBDCDB", " h c #C9D6DD", " j c #DDE1D6", " k c #D5DFE5", " l c #AEB0AE", " z c #44789F", " x c #5186AF", " c c #7798B0", " v c #ACBCC3", " b c #DCDBDB", " n c #C5DBEC", " m c #3D6B8E", " M c #58787A", " N c #C1D9EB", " B c #6A7F5A", " V c #3B6B8F", " C c #9EBFD9", " Z c #E2E6DD", " A c #9AAEB4", " S c #ABC8DF", " D c #6E706B", " F c #92A6AC", " G c #EEEEEF", " H c #EDEEEE", " J c #427092", " K c #EBECEC", " L c #688BA0", " P c #D0DFEF", " I c #6296BB", " U c #DBDCDC", " Y c #72756B", " T c #92B7D3", " R c #667173", " E c #98BFDC", " W c #FFFFFF", " Q c #FDFDFD", " ! c #FCFBFC", " ~ c #F9F9F9", " ^ c #F7F7F7", " / c #AFB0AD", " ( c #F3F3F3", " ) c #F1F1F1", " _ c #41749A", " ` c #EFEFEF", " ' c #EEEFEE", " ] c #CACFC4", " [ c #EDEDED", " { c #EAE9EA", " } c #A3A4A1", " | c #C5CBBF", ". c #4A6D85", ".. c #436E88", ".X c #E3E3E3", ".o c #DCDBDC", ".O c #5892BD", ".+ c #B1CEE6", ".@ c #4D7991", ".# c #547D9B", ".$ c None", /* pixels */ ".$.$.$ 4 4 4 = $ M.$.$.$.$.$.$.$", ".$.$.$.+ P n 3 L...$.$.$.$.$.$.$", " 8 R i. _ z C N x * D D D D D D", " 2 Z W j h 5 4 > T.# k W W W 9 D", " Y Q t [ O c 4 d @ m v , H y 0 D", " D ! K 4 4 4 4 d.O 4 4 4 4 u ( D", " D 7 < ] 4 E a a a . # 4 % { q D", " D ~ 7 s | 4 E . . S 4 F s 9 ) D", " D ~ t 7 s | 4 : E V F s 7 t ) D", " D ^.X t 7 7 w p 4 A 7 6 t.X e D", " D } 1 } } } } } } } } } } } } D", " D f b + f.o +.o f g U + U f D", " D ` / l - ; / / / / r ' G r D", " D W & & & & & & & & W W W W D", " D W W W W W W W W W W W W W D", " D D D D D D D D D D D D D D D D" }; /* actions/document-save.png */ /* XPM */ const char *tango_document_save[] = { /* width height ncolors chars_per_pixel */ "16 16 114 2", /* colors */ " c #000000", " . c #739FC0", " X c #AFAFAF", " o c #6C8577", " O c #81ADD1", " + c #DFE2DE", " @ c #A9A9A9", " # c #A8A7A8", " $ c #8FB3CE", " % c #9F9F9F", " & c #96BBD8", " * c #4A7180", " = c #95A9AF", " - c #B7B6B6", " ; c #4E6A7D", " : c #3D698A", " > c #AAAAA9", " , c #ACCBE3", " < c #ABCBE2", " 1 c #EDEDEE", " 2 c #E9E9EA", " 3 c #6B716E", " 4 c #9BC2DF", " 5 c #38678B", " 6 c #6E99B6", " 7 c #FEFEFE", " 8 c #FCFCFC", " 9 c #FAFAFA", " 0 c #6B7F88", " q c #F4F4F4", " w c #F3F4F3", " e c #F2F2F2", " r c #CED4C8", " t c #F0F0F0", " y c #EEEEEE", " u c #EDEEED", " i c #ECECEC", " p c #627075", " a c #3F6C8E", " s c #719FBF", " d c #E4E4E4", " f c #79A7CA", " g c #DCDCDC", " h c #D6D6D6", " j c #C9D6DD", " k c #D2D2D2", " l c #D0D0D0", " z c #CECECE", " x c #DDE1D6", " c c #CACACA", " v c #C8C8C8", " b c #C4C4C4", " n c #C2C2C2", " m c #BCBCBC", " M c #D5DFE5", " N c #B4B4B4", " B c #44789F", " V c #5186AF", " C c #7798B0", " Z c #ACBCC3", " A c #C5DBEC", " S c #3D6B8E", " D c #58787A", " F c #C1D9EB", " G c #6A7F5A", " H c #3B6B8F", " J c #9EBFD9", " K c #E2E6DD", " L c #9AAEB4", " P c #ABC8DF", " I c #6E706B", " U c #92A6AC", " Y c #A8A7A7", " T c #EDEEEE", " R c #427092", " E c #EBECEC", " W c #688BA0", " Q c #D0DFEF", " ! c #6296BB", " ~ c #72756B", " ^ c #92B7D3", " / c #667173", " ( c #98BFDC", " ) c #FFFFFF", " _ c #FDFDFD", " ` c #FCFBFC", " ' c #F9F9F9", " ] c #F7F7F7", " [ c #F3F3F3", " { c #F1F1F1", " } c #41749A", " | c #CACFC4", ". c #EDEDED", ".. c #EBEBEB", ".X c #EAE9EA", ".o c #C5CBBF", ".O c #4A6D85", ".+ c #436E88", ".@ c #E3E3E3", ".# c #DDDDDD", ".$ c #D5D5D5", ".% c #D1D1D1", ".& c #CFCFCF", ".* c #CDCDCD", ".= c #CBCBCB", ".- c #C9C9C9", ".; c #5892BD", ".: c #C5C5C5", ".> c #C3C3C3", "., c #B1CEE6", ".< c #4D7991", ".1 c #B9B9B9", ".2 c #547D9B", ".3 c None", /* pixels */ ".3.3.3 5 5 5 : * D.3.3.3.3.3.3.3", ".3.3.3., Q A 4 W.+.3.3.3.3.3.3.3", " 0 / p.O } B J F V ; I I I I I I", " 3 K ) x j 6 5 < ^.2 M ) ) ) q I", " ~ _ y. + C 5 f $ S Z 1 T u w I", " I ` E 5 5 5 5 f.; 5 5 5 5 i [ I", " I 9 2 | 5 ( s s s . & 5 =.X e I", " I ' 9 d.o 5 ( . . P 5 U d q { I", " I ' y 9 d.o 5 , ( H U d 9 y { I", " I ].@ y 9 9 r a 5 L 9 8 y.@ t I", " I 7 ) ) ) ) ) ) ) q q.....@ t I", " I z.-.-.-.-.:.-.-.:.:.:.:.: h I", " I z.: % X m b v l @ k @ k.1 c I", " I.*.> > N n b v.= #.% Y.% - c I", " I.# g g g.$.$.&.&.&.&.&.&.& c I", " I I I I I I I I I I I I I I I I" }; /* actions/system-shutdown.png */ /* XPM */ const char *tango_system_shutdown[] = { /* width height ncolors chars_per_pixel */ "16 16 66 1", /* colors */ " c #ABABAB", ". c #A9A9A9", "X c #8F8F8F", "o c #858585", "O c #7D7D7D", "+ c #6F6F6F", "@ c #6D6D6D", "# c #656565", "$ c #616161", "% c #5F5F5F", "& c #555555", "* c #515151", "= c #F6F6F6", "- c #F4F4F4", "; c #F0F0F0", ": c #EEEEEE", "> c #ECECEC", ", c #EAEAEA", "< c #E8E8E8", "1 c #E6E6E6", "2 c #E4E4E4", "3 c #E2E2E2", "4 c #E0E0E0", "5 c #2D2D2D", "6 c #DEDEDE", "7 c #2B2B2B", "8 c #272727", "9 c #D8D8D8", "0 c #D4D4D4", "q c #D2D2D2", "w c #CCCCCC", "e c #C2C2C2", "r c #BCBCBC", "t c #A6A6A6", "y c #A2A2A2", "u c #A0A0A0", "i c #888A85", "p c #8E8E8E", "a c #848484", "s c #808080", "d c #7A7A7A", "f c #6C6C6C", "g c #606060", "h c #F7F7F7", "j c #F5F5F5", "k c #F3F3F3", "l c #F1F1F1", "z c #EFEFEF", "x c #EDEDED", "c c #EBEBEB", "v c #E9E9E9", "b c #E7E7E7", "n c #E5E5E5", "m c #E3E3E3", "M c #E1E1E1", "N c #DFDFDF", "B c #282828", "V c #C9C9C9", "C c #C7C7C7", "Z c #C5C5C5", "A c #C3C3C3", "S c #C1C1C1", "D c #BBBBBB", "F c #B9B9B9", "G c #B3B3B3", "H c None", /* pixels */ "HiiiiiiiiiiiiiiH", "immmmmmmmmmmmmmi", "i3mz=hhhhhhh=1mi", "imz=jjjjjjjjjk2i", "in-kkwaooop;kkbi", "i1-ll*****B3lli", "ix,22dC>>m%22m:i", "i:<33O6jjj+63Mzi", "iz144oyeeDO946;i", "iz,66wf@$f q6Nli", "izlcMM6rSZV0M;li", "illlllllllllllli", "HiiiiiiiiiiiiiiH" }; /* places/start-here.png */ /* XPM */ const char *tango_start_here[] = { /* width height ncolors chars_per_pixel */ "16 16 53 1", /* colors */ " c #6593C6", ". c #5080B8", "X c #3869A7", "o c #3667A5", "O c #2F5F9E", "+ c #4474AF", "@ c #4272AD", "# c #234E8B", "$ c #214C89", "% c #204A88", "& c #507FB7", "* c #3A6AA8", "= c #295694", "- c #3868A6", "; c #5E8CC1", ": c #214B88", "> c #25518F", ", c #2C5B99", "< c #3667A6", "1 c #3465A4", "2 c #4070AC", "3 c #25508E", "4 c #24508D", "5 c #6492C5", "6 c #2A5896", "7 c #4E7DB6", "8 c #3768A6", "9 c #3566A4", "0 c #3162A0", "q c #30609F", "w c #729FCF", "e c #5B8ABF", "r c #4575B0", "t c #244F8C", "y c #214B89", "u c #204B88", "i c #6895C8", "p c #6795C7", "a c #5180B8", "s c #285593", "d c #31619F", "f c #2F5F9D", "g c #5D8BC0", "h c #FFFFFF", "j c #6B98CA", "k c #6996C8", "l c #5483BA", "z c #204A87", "x c #3D6EAA", "c c #2D5C9A", "v c #3566A5", "b c #234F8C", "n c None", /* pixels */ "nnnnnnnnnn%z:nnn", "nno9-nnnnn#d6unn", "nnxklunn", "nn2 ronnnnzzunnn", "nnvv c #B1CEEC", " , c #607AA3", " < c #B3C1D0", " 1 c #B5BEC8", " 2 c #5B6D94", " 3 c #5A6B93", " 4 c #CCDDEF", " 5 c #DBDEE0", " 6 c #7591B4", " 7 c #759FCB", " 8 c #BED4EB", " 9 c #F8F9F9", " 0 c #B7C2CD", " q c #BECFE1", " w c #BCCDDF", " e c #506A96", " r c #5978A2", " t c #93ABC7", " y c #B4BCCD", " u c #C6CFD8", " i c #A3B8D0", " p c #843345", " a c #A0B4CD", " s c #516790", " d c #BEC7D0", " f c #CAD5DF", " g c #5988BC", " h c #DFE1E3", " j c #83A7CE", " k c #AFB8CB", " l c #FEFEFE", " z c #D7D9DB", " x c #5C77A1", " c c #DCE4ED", " v c #F6F6F6", " b c #6B7B9F", " n c #628FC1", " m c #E6EBF0", " M c #C0C6CE", " N c #768BAD", " B c #E2E2E2", " V c #80A7D1", " C c #E0E0E0", " Z c #B7C8DC", " A c #B1C2D6", " S c #DCE3E9", " D c #6B96C6", " F c #705472", " G c #9E080B", " H c #7A95B7", " J c #656588", " K c #4E648F", " L c #6F5674", " P c #BABFC4", " I c #A9BCD1", " U c #D9E1E9", " Y c #CED0D1", " T c #6983A6", " R c #C8CFD5", " E c #8593B1", " W c #546E98", " Q c #A40000", " ! c #D9DCDF", " ~ c #9DA6AE", " ^ c #6D90B7", " / c #686284", " ( c #991116", " ) c #D2E5F9", " _ c #ADB9CE", " ` c #D6DFE9", " ' c #A3B6CE", " ] c #DAEAFA", " [ c #CFD9E2", " { c #5A7AA4", " } c #5C8ABD", " | c #A2BDDA", ". c #597199", ".. c #D5DFEB", ".X c #A5B7C9", ".o c #CCD7E2", ".O c #C3D2E3", ".+ c #5686BA", ".@ c #E3F1FF", ".# c #C8CED4", ".$ c #E2EFFE", ".% c #7792B6", ".& c #516994", ".* c #9BB2CC", ".= c #9AB0CB", ".- c #9EADC5", ".; c #C9E1F9", ".: c #F4F4F5", ".> c #CED1D3", "., c #E0EFFF", ".< c #4F80B6", ".1 c #CEDBEA", ".2 c #405583", ".3 c #5D7DA6", ".4 c #5A79A3", ".5 c #94ACC8", ".6 c #7E97B9", ".7 c #6C96C5", ".8 c #BECBDA", ".9 c #C4CAD6", ".0 c #E6EBF4", ".q c #DAEBFC", ".w c #D4E5F6", ".e c #E4E6E8", ".r c #E2E4E6", ".t c #9CBDE0", ".y c #6E5471", ".u c #95A7C2", ".i c #C7CDD2", ".p c #ACCAE9", ".a c #9DB3CD", ".s c #FDFDFD", ".d c #BCD7F2", ".f c #FBFBFB", ".g c #5A769F", ".h c #F9F9F9", ".j c #58749D", ".k c #AABED3", ".l c #F5F5F5", ".z c #E1F0FF", ".x c #EFEFEF", ".c c #BECAD6", ".v c #BCC8D4", ".b c #719BC9", ".n c #B5D1EE", ".m c #B8BFC6", ".M c #364878", ".N c #576F95", ".B c #D5DFE9", ".V c #DEEEFF", ".C c #B8C9DD", ".Z c #101221", ".A c #AEB5BC", ".S c #4B6189", ".D c #D3D3D3", ".F c #D1D1D1", ".G c #7994B6", ".H c #DCDDDF", ".J c #931821", ".K c #B4C7DC", ".L c #9FB4CE", ".P c #A4B5C9", ".I c #9CB2CB", ".U c #CCE3FA", ".Y c #B3CCE8", ".T c #E2F1FF", ".R c #617FA8", ".E c #DEEDFB", ".W c #D5E8FC", ".Q c None", /* pixels */ ".Q.M.M.M.M.M.M.M r =.Q.Q.Q.Q.Q.Q", ".Q.Q.M.M.M b c.0.. A.6 *.Q.Q.Q.Q", ".Q.Q W 3 y [ P.8 8.c U '.4.Q.Q.Q", ".Q. 3.9.>.$.E.w.v M 5 m a {.Q.Q", " K.M k ; f.T.@ ] u z.:.f.B.G.Q.Q", " s 2 ! 4.,.z.z.q.i d.P 1.e i {.Q", ".2 E.k.U.V @ @.1.s l.s.r.H w /.Q", ".M _.p.d.;.W ) R l l l.h.A.O F.Q", " e.- 0.#.Y.n > I 9 o l.x Y.C L.Q", " x.u X l h |.t # + O.l B ~.a p Q", " , H ` l l $ j V 7.7 C.D.X N ( Q", ".Q.R.I S v.m.b D n g.F -.5 % Q.Q", ".Q.Q.3.=.o ^ }.+.< : < t J G.Q.Q", ".Q.Q.Q T.%.L Z q.K.* 6.y G.Q.Q.Q", ".Q.Q.Q.Q.N.g.4 & r.j.J Q Q Q.Q.Q", ".Q.Q.Q.Q.Q.Q.Q.Q Q Q Q Q Q Q Q.Q" }; /* apps/system-users.png */ /* XPM */ const char *tango_system_users[] = { /* width height ncolors chars_per_pixel */ "16 16 147 2", /* colors */ " c #000000", " . c #F3BE71", " X c #ECBD74", " o c #4071AF", " O c #E6AA4D", " + c #868F41", " @ c #4A78B2", " # c #7E6040", " $ c #AF7D2E", " % c #E3A340", " & c #3263A1", " * c #547FB5", " = c #905841", " - c #616519", " ; c #797F37", " : c #B99355", " > c #6C3F3B", " , c #E3A23C", " < c #EBAA5B", " 1 c #4172AF", " 2 c #F6CB8A", " 3 c #E5A255", " 4 c #D1A55F", " 5 c #C0934B", " 6 c #6D4A0A", " 7 c #9F5203", " 8 c #6A692B", " 9 c #8BA6C9", " 0 c #D08F4A", " q c #723C51", " w c #3E558E", " e c #E3A256", " r c #F3C680", " t c #5C3B59", " y c #3466A5", " u c #895443", " i c #C2893C", " p c #6087B9", " a c #5A3464", " s c #C16710", " d c #3568A9", " f c #DDA053", " g c #AF8033", " h c #BC8E43", " j c #ECB868", " k c #C29142", " l c #8B6B58", " z c #8E5105", " x c #5A85B9", " c c #614D7E", " v c #687214", " b c #90563F", " n c #DAAE6D", " m c #D8994A", " M c #5F86B7", " N c #E6A251", " B c #645370", " V c #E0992A", " C c #D6DBE3", " Z c #E5A746", " A c #3467A7", " S c #E09B2D", " D c #BF6C10", " F c #767B35", " G c #829FC5", " H c #32629E", " J c #B78940", " K c #616B09", " L c #F1BD6F", " P c #864F06", " I c #5E83B2", " U c #386DB1", " Y c #3D538B", " T c #C77D28", " R c #485F99", " E c #3364A2", " W c #3264A1", " Q c #E1A23E", " ! c #6F7131", " ~ c #955104", " ^ c #6D712F", " / c #E8AA5C", " ( c #B88530", " ) c #624F0D", " _ c #C16404", " ` c #BA5C11", " ' c #E5AE5C", " ] c #D9AC64", " [ c #DDAB5E", " { c #815107", " } c #AA7722", " | c #A9A3B9", ". c #F9C780", ".. c #A0B6D1", ".X c #C4680A", ".o c #6B8BB4", ".O c #8DA7C8", ".+ c #B68134", ".@ c #C38F44", ".# c #E2B369", ".$ c #596921", ".% c #465440", ".& c #CC5E01", ".* c #C49A52", ".= c #6A6A2B", ".- c #CC5E04", ".; c #B98633", ".: c #5C3566", ".> c #DCA552", "., c #A35403", ".< c #55315F", ".1 c #4576B2", ".2 c #965435", ".3 c #B4C1D3", ".4 c #EFC075", ".5 c #885106", ".6 c #366BAD", ".7 c #BC7625", ".8 c #32629F", ".9 c #30609D", ".0 c #EBBC74", ".q c #5680B5", ".w c #DF8E3A", ".e c #D56402", ".r c #3466A4", ".t c #3364A3", ".y c #CB9A51", ".u c #685D14", ".i c #6E771D", ".p c #3B6EAE", ".a c #815330", ".s c #B0B6CB", ".d c #4F649A", ".f c #C99C66", ".g c #3568A8", ".h c #9E5807", ".j c #B85410", ".k c #E6AD54", ".l c #5981B4", ".z c #844240", ".x c #366AAC", ".c c #D16604", ".v c #A6ACC4", ".b c #CF9D51", ".n c #F0CE99", ".m c #CD5C00", ".M c None", /* pixels */ ".M.M.M.M P ~ z.,.M.M.M.M.M.M.M.M", ".M.M.M.c m 4.b.@ 7.M.M.M.M.M.M.M", ".M.M.h f.* 5.;.7 s.m.&.m.M.M.M.M", ".M.M.5.y h : T.X N 2 . /.m.M.M.M", ".M.M { k ( J D < r.0 O.4.w.m.M.M", ".M.M ) i g }.e. X.n.k , '.m.M.M", ".M.M >.a.+ $ _ L Z.# S Q.>.m.M.M", ".M.% ^ - # 6.u 3 j V % ] 0.j.M.M", ".% F.i + + 8 q = e [ n.f b.z.M.M", ".% F v +.=.: 9 B l.- `.2 u p.:.:", ".% F v v.:.O.x U.s c |.v.g W p.:", ".% F.$ K t p A.6.. C x G y.9.p.:", ".% F ; !.: M.t A d.3.l.r & &.p.:", ".M.%.%.%.: I.t w E.o & H Y.8.p.:", ".M.M.M.M.:.q *.d @ o o o R 1.1.:", ".M.M.M.M.<.:.:.:.:.:.:.:.:.:.: a" }; /* apps/accessories-text-editor.png */ /* XPM */ const char *tango_accessories_text_editor[] = { /* width height ncolors chars_per_pixel */ "16 16 52 1", /* colors */ " c #000000", ". c #B1B1B1", "X c #705B39", "o c #9D9D9D", "O c #C89F64", "+ c #C4A000", "@ c #8F8F8F", "# c #A08457", "$ c #CFAD71", "% c #D2AC6A", "& c #757575", "* c #EBB13D", "= c #717171", "- c #A48757", "; c #636363", ": c #A08356", "> c #EEEEEE", ", c #ECECEC", "< c #EAEAEA", "1 c #EEEAC6", "2 c #EDE6C5", "3 c #DADADA", "4 c #D6D6D6", "5 c #CCCCCC", "6 c #CACACA", "7 c #C2AB8A", "8 c #C4C4C4", "9 c #BCBCBC", "0 c #B8B8B8", "q c #B2B2B2", "w c #AEAEAE", "e c #F9E8C6", "r c #EDE5C4", "t c #4C4226", "y c #A18355", "u c #888A85", "i c #8C8C8C", "p c #868686", "a c #6B5736", "s c #FFFFFF", "d c #EBEBEB", "f c #E9E9E9", "g c #A38555", "h c #CFAA69", "j c #CEA668", "k c #EFEBC7", "l c #DBDBDB", "z c #D3D3D3", "x c #CBCBCB", "c c #8F5902", "v c #B7B7B7", "b c None", /* pixels */ "bbbbbbbbbbbbbbbb", "bbb+b+b+b+b+bbbb", "bb+e+e+e+e+e+bbb", "bu+*+*+*+*+*+ccb", "bud+9+0+0+0+c1$c", "bus,,,,,,,zck%yc", "busl55555vck%-cb", "bus,,,,,zc1h:cbb", "busl555vc2j#cubb", "bus,,,dcrO-c=ubb", "busl5x&X7gc@pubb", "bus,,fctaco4wubb", "buslx8 c;i63qubb", "bus,d<qqqqqqq.qqubb", "buuuuuuuuuuuuubb" }; /* mimetypes/text-x-generic.png */ /* XPM */ const char *tango_text_x_generic[] = { /* width height ncolors chars_per_pixel */ "16 16 22 1", /* colors */ " c #000000", ". c #EDEDE5", "X c #999999", "o c #959595", "O c #818181", "+ c #F2F2F2", "@ c #F0F0F0", "# c #EEEEEE", "$ c #ECECEC", "% c #EAEAEA", "& c #EDEDE6", "* c #C8C8C8", "= c #C6C6C6", "- c #C4C4C4", "; c #FFFFFF", ": c #F1F1F1", "> c #EFEFEF", ", c #EDEDED", "< c #EBEBEB", "1 c #C7C7C7", "2 c #C5C5C5", "3 c None", /* pixels */ "XOOOOOOOOOOOO333", "O;;;;;;;;;;;;O33", "O;$%%<<<$$,@;O33", "O;%-22====1@;O33", "O;%<<$$$,,#@;O33", "O;<2======1@;O33", "O;<<$$,,.$#@;O33", "O;<====##&#@;O33", "O;$$,,##>>>@;O33", "O;$===11***@;O33", "O;$,##>>@:::;O33", "O;,=11***::+;O33", "O;,,#>>@@:++;O33", "O;;;;;;;;;;;;O33", "oOOOOOOOOOOOOo33", "3333333333333333" }; /* mimetypes/x-office-calendar.png */ /* XPM */ const char *tango_x_office_calendar[] = { /* width height ncolors chars_per_pixel */ "16 16 61 1", /* colors */ " c #000000", ". c #686A66", "X c #646662", "o c #818485", "O c #CACAC9", "+ c #C3C4C2", "@ c #959798", "# c #C2C4C4", "$ c #9B9C9A", "% c #4D5254", "& c #3B4042", "* c #393E40", "= c #C9C9CA", "- c #B0B1AE", "; c #AAABA8", ": c #EEEEEE", "> c #ECECEC", ", c #E6E6E6", "< c #E4E4E4", "1 c #E2E2E2", "2 c #E0E0E0", "3 c #939591", "4 c #D6D6D6", "5 c #D2D2D2", "6 c #CDCECD", "7 c #C8C8C8", "8 c #FBFBFA", "9 c #E3E3E2", "0 c #636561", "q c #61635F", "w c #B0B2B3", "e c #555753", "r c #898C86", "t c #888A85", "y c #4A5052", "u c #A0A2A3", "i c #7C7E79", "p c #C2C3C1", "a c #404648", "s c #383E40", "d c #B8B9B7", "f c #C8C9CA", "g c #32383A", "h c #2E3436", "j c #4C5153", "k c #414748", "l c #FFFFFF", "z c #FDFDFD", "x c #C5C6C6", "c c #F3F3F3", "v c #F1F1F1", "b c #E9E9E9", "n c #E7E7E7", "m c #E3E3E3", "M c #E1E1E1", "N c #DFDFDF", "B c #D9D9D9", "V c #CECFCE", "C c #CACBCA", "Z c #6E706C", "A c None", /* pixels */ "AAttAAAtAAAtAAAA", "AtttttttttttttAA", "tlt+llt4zzt4zltA", "tlt3,,tt9,tt,ltA", "tl4B,,44<,444ltA", "il,:v,VCdc-$XA", "Xlllllllllll;ZXA", "0qqqqqqqqqqqqqXA", "AhteeeeeeeeeehAA", "AhhhhhhhhhhhhhAA" }; /* places/user-trash.png */ /* XPM */ const char *tango_user_trash[] = { /* width height ncolors chars_per_pixel */ "16 16 135 2", /* colors */ " c #000000", " . c #6A6C68", " X c #D6DBC8", " o c #686A66", " O c #CCD29D", " + c #D3D8BB", " @ c #5E605C", " # c #A9B260", " $ c #959E49", " % c #BCC662", " & c #8A915C", " * c #CDD2A1", " = c #AAB264", " - c #5D6329", " ; c #BAC36D", " : c #B1B4AD", " > c #7F865E", " , c #6B6D68", " < c #545B23", " 1 c #D4D9BB", " 2 c #989A94", " 3 c #D2D7B9", " 4 c #61635E", " 5 c #B5BB82", " 6 c #C3CA89", " 7 c #A0A956", " 8 c #CCD19F", " 9 c #C8CEA5", " 0 c #A8AD75", " q c #A1A76E", " w c #BDC765", " e c #909946", " r c #D1D793", " t c #98A247", " y c #666D2D", " u c #B8BE84", " i c #BDC675", " p c #939A59", " a c #494D4C", " s c #81893A", " d c #8C9548", " f c #646663", " g c #4E541F", " h c #B2B881", " j c #B6BBA6", " k c #9FA46B", " l c #A5AE49", " z c #D0D691", " x c #788134", " c c #9AA252", " v c #8C9162", " b c #929C4A", " n c #ACB27E", " m c #545B21", " M c #797B77", " N c #757773", " B c #737571", " V c #737B32", " C c #6D6F6B", " Z c #CAD184", " A c #C7CC8B", " S c #919A4C", " D c #8A9259", " F c #B8C065", " G c #767B77", " H c #D4D9BC", " J c #636561", " K c #D3D9BB", " L c #61682A", " P c #879042", " I c #6F7731", " U c #969F4A", " Y c #BDC763", " T c #BBC561", " R c #9FA956", " E c #7A8235", " W c #B5C051", " Q c #A9B259", " ! c #ADB17E", " ~ c #787A75", " ^ c #798237", " / c #BCC286", " ( c #B8C257", " ) c #CDD590", " _ c #B7BE81", " ` c #70726D", " ' c #575E26", " ] c #535A22", " [ c #686A65", " { c #666863", " } c #62645F", " | c #C4CB9E", ". c #A7AF67", ".. c #A9AD94", ".X c #5C5E59", ".o c #BCC661", ".O c #A8B154", ".+ c #8B9348", ".@ c #CBD09E", ".# c #4C521E", ".$ c #8B943E", ".% c #A5AC72", ".& c #AEB75D", ".* c #ADB75C", ".= c #AAB263", ".- c #565D21", ".; c #A6AF55", ".: c #B2BB64", ".> c #767F33", "., c #CCD28E", ".< c #B2BD50", ".1 c #C3CA99", ".2 c #5B6129", ".3 c #96A04F", ".4 c #888E69", ".5 c #C9D181", ".6 c #BBC469", ".7 c #BBC55F", ".8 c #B9C35D", ".9 c #899245", ".0 c #6C732F", ".q c #BFC687", ".w c #B3BD5A", ".e c #A3AB72", ".r c #B3BE50", ".t c #98A150", ".y c #C7D07E", ".u c #9CA64D", ".i c #727470", ".p c #DBE0D7", ".a c #70726E", ".s c #C9D18D", ".d c #ADB757", ".f c #949D4F", ".g c None", /* pixels */ ".g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g", ".g.g < < < < < < < < < < < <.g.g", ".g >.p.p.p.p.p.p.p.p.p.p.p.p.4.g", " <.p G.X @ 4 J { o , C `.i :.p <", " <.p a } f [ . C.a B N ~ M 2.p <", " < j.p.p.p.p.p.p.p.p.p.p.p.p.. <", " < < p E x.> V I.0 y L -.2 ' < ]", ".g <.y W W.r l.; = t.$ s ^ D <.g", ".g <.y W W.< F X X.@ 7 $ d & <.g", ".g <.5 W W O ;.: 8 * R c.f k <.g", ".g < Z (.o 1 X.* Q # _.t S.% <.g", ".g < z w Y K i.& 9.= 3.3.+ 0 <.g", ".g < r % T.6 *.1 H +. b.9.e <.g", ".g < ).7.8.w.d.O |.u U e P q <.g", ".g < !.,.s A 6.q / u 5 h n v <.g", ".g.g < < < < < < < < < < < <.g.g" }; /* apps/utilities-system-monitor.png */ /* XPM */ const char *tango_utilities_system_monitor[] = { /* width height ncolors chars_per_pixel */ "16 16 116 2", /* colors */ " c #000000", " . c #8199BA", " X c #DEE0DD", " o c #EDEAB0", " O c #F6F8FB", " + c #F5F8FA", " @ c #316696", " # c #4280AD", " $ c #407EAB", " % c #316A99", " & c #7D7D7A", " * c #2F6697", " = c #F1F6F9", " - c #2C6294", " ; c #3772A2", " : c #BFCFA0", " > c #97B893", " , c #E7E8B0", " < c #E4E5E2", " 1 c #E2E3E0", " 2 c #DFE1DD", " 3 c #BBC774", " 4 c #265987", " 5 c #D7D9D5", " 6 c #D5D7D3", " 7 c #4D8DB7", " 8 c #98C0D9", " 9 c #CCCFCA", " 0 c #EEE788", " q c #4D8FBA", " w c #D7E5EF", " e c #3D79A7", " r c #3D77A7", " t c #4A8DB7", " y c #7792B5", " u c #FEFEFE", " i c #F9FAF9", " p c #B6C496", " a c #829B7A", " s c #90AF8B", " d c #89A584", " f c #85A180", " g c #E9F1F6", " h c #C9CCC6", " j c #5294BE", " k c #346A9A", " l c #D8E6EF", " z c #316697", " x c #4D8EB9", " c c #D6E4ED", " v c #2C6292", " b c #3A74A3", " n c #4584B1", " m c #346E9D", " M c #B4B6B1", " N c #316A9A", " B c #F9F9F8", " V c #EFF4F8", " C c #F4F5F3", " Z c #8CAA86", " A c #89A483", " S c #87A481", " D c #E5E7E4", " F c #829C7C", " G c #2C5D8E", " H c #DCDDDB", " J c #5495BF", " K c #BAD1E1", " L c #4887B3", " P c #7E7E7B", " I c #3D7BA8", " U c #F0F5F8", " Y c #BECE9F", " T c #DBDCD9", " R c #DADCD8", " E c #D3D6D1", " W c #D0D2CE", " Q c #2C6090", " ! c #CBCEC9", " ~ c #4280AC", " ^ c #488AB5", " / c #3772A1", " ( c #FFFFFF", " ) c #34709E", " _ c #4284AF", " ` c #346E9E", " ' c #316C9B", " ] c #FAFBFA", " [ c #96B691", " { c #F8F9F8", " } c #3D7CAA", " | c #94B48F", ". c #F6F7F6", ".. c #93B28E", ".X c #849E7C", ".o c #204A87", ".O c #91B08C", ".+ c #90AE8B", ".@ c #8EAC89", ".# c #8BAA86", ".$ c #D5DBA7", ".% c #D3D9A5", ".& c #85A280", ".* c #D6E3ED", ".= c #3D77A6", ".- c #4587B1", ".; c #4283AE", ".: c #B4B7B1", ".> c #96B590", "., c #F0F5F9", ".< c #EEEEED", ".1 c #8BA785", ".2 c #BACA9C", ".3 c #E9EAE8", ".4 c #B7C699", ".5 c None", /* pixels */ " P P P P P P P P P P P P P P P &", " P B { ( ( ( ( ( ( ( ( u ] ] ] P", " P B y.o.o.o.o.o.o.o.o.o.o y H P", " P u.o 4 G - a F ' N % @ v.o D P", " P u.o Q z.X o.& b b ; ) k.o 1 P", " P u.o * ` p V.4.1 } I.= /.o X P", " P u.o m S.% K c.@ n.; $ e.o T P", " P u.o f d.*.2 w.O 3 s.@.#.o 5 P", " P u.o + O.$.O l Y 0 =., U.o E P", " P u.o A Z.+.. : g 8 |.O.@.o W P", " P u.o r # L x [ , >.> 7 n.o 9 P", " P u.o.= ~.- t | J j q ^ _.o h P", " P B ..o.o.o.o.o.o.o.o.o.o y M P", " P B. i C.<.3 < 2 R 6 W !.:.: P", " P P P P P P P P P P P P P P P &", ".5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5" }; /* apps/utilities-terminal.png */ /* XPM */ const char *tango_utilities_terminal[] = { /* width height ncolors chars_per_pixel */ "16 16 163 2", /* colors */ " c #000000", " . c #A0A19D", " X c #8E9F74", " o c #8C9D72", " O c #9A9B97", " + c #989995", " @ c #DDDEDC", " # c #849074", " $ c #939590", " % c #D7D8D6", " & c #8F918C", " * c #374525", " = c #8D8F8A", " - c #CDCECC", " ; c #81837E", " : c #E0E3DB", " > c #ACBC94", " , c #0A0B09", " < c #090908", " 1 c #657C41", " 2 c #AABA92", " 3 c #192011", " 4 c #070706", " 5 c #4F6332", " 6 c #ECEDEA", " 7 c #A5B68D", " 8 c #B2B4B1", " 9 c #DBDBD9", " 0 c #29331D", " q c #26311A", " w c #91928D", " e c #D7D7D5", " r c #364423", " t c #555952", " y c #46572C", " u c #8B8C87", " i c #7E807A", " p c #7D8079", " a c #6A7559", " s c #0F100D", " d c #C0C1BE", " f c #787C74", " g c #777A73", " h c #747870", " j c #A9B990", " k c #6A6E66", " l c #B0B1AE", " z c #D3D6CD", " x c #B1BF9B", " c c #646860", " v c #5F625B", " b c #29341C", " n c #28341B", " m c #828E70", " M c #92958D", " N c #27321A", " B c #374523", " V c #8C8F87", " C c #46562B", " Z c #888B83", " A c #989996", " S c #DDDEDD", " D c #4E5E36", " F c #D7D8D7", " G c #A8B88E", " H c #A3A69D", " J c #B4B6B1", " K c #AFBE98", " L c #F2F3F1", " P c #747772", " I c #768560", " U c #536537", " Y c #182011", " T c #060706", " R c #3C4C27", " E c #4E6132", " W c #3B4A26", " Q c #4C5A3A", " ! c #273119", " ~ c #020302", " ^ c #808D6D", " / c #343633", " ( c #90A076", " ) c #CFD3CB", " _ c #DDDDDC", " ` c #969893", " ' c #616A55", " ] c #4C563D", " [ c #94A27D", " { c #D6D7D5", " } c #8A8C87", " | c #657152", ". c #647151", ".. c #CCCDCB", ".X c #848681", ".o c #131412", ".O c #A2B387", ".+ c #0D0E0C", ".@ c #0B0C0A", ".# c #080807", ".$ c #070806", ".% c #758954", ".& c #4F6232", ".* c #D9DED4", ".= c #7F8C6B", ".- c #2F312D", ".; c #636660", ".: c #73825F", ".> c #27321B", "., c #5A5E57", ".< c #364523", ".1 c #364323", ".2 c #545851", ".3 c #878983", ".4 c #868782", ".5 c #616E4D", ".6 c #82857E", ".7 c #81837D", ".8 c #7E817A", ".9 c #7D7F79", ".0 c #797D75", ".q c #7A846C", ".w c #767972", ".e c #6F736B", ".r c #A3A69E", ".t c #7E8B69", ".y c #7C8967", ".u c #9DA098", ".i c #798764", ".p c #656961", ".a c #999C94", ".s c #CED1C8", ".d c #99A38A", ".f c #62655E", ".g c #979A92", ".h c #859869", ".j c #29351C", ".k c #3B4A27", ".l c #28331B", ".z c #27311A", ".x c #92A279", ".c c #8D9088", ".v c #878A82", ".b c #97A681", ".n c #83867E", ".m c #95A47F", ".M c #232423", ".N c #737D64", ".B c #B7B9B4", ".V c #A4B58A", ".C c #A2A59C", ".Z c #7B8865", ".A c #697850", ".S c #AEBD97", ".D c #CDD2C6", ".F c #181F11", ".G c #060606", ".H c #849071", ".J c #3C4B27", ".K c #28321A", ".L c #273019", ".P c #010201", ".I c None", /* pixels */ ".I.u.a M.c Z.n.8.0 h.e k.p.f.,.I", " H J e S @ _ _ _ _ _ _ 9.. 8 P t", " H { /.#.#.#.#.#.#.#.# 4 4.- A t", ".C F s x K.S > 2 j G 7.V.O O.2", ".C F.+ #.H m ^.=.t.y.Z.i I `.2", ".C F.@.b.m [.x ( X o.h.% 1 $.2", ".C F , a.*.q |. .5 D C C y w.2", ".C F <.:.d :.D.A U E.&.& 5 =.2", ".C F.$ ] ' ) z *.1 r r.< B }.2", ".C F 4 Q.s.N.k W W W.J.J R .3.2", ".C F 4 0.z.L ! L L L 6.K.K .X.2", ".C F T q N.>.>.l.l n b b.j .7.2", ".C F.G.F.F.F.F.F.F.F Y 3 3 i.2", " H %.M ~.P.P.P.P.P.P.P.P.P.o.w t", ".r.B - d l . + $ & u.4 ;.9 g.; t", ".I.u.g M V.v.6 p f h.e k c v.,.I" }; /* status/weather-clear.png */ /* XPM */ const char *tango_weather_clear[] = { /* width height ncolors chars_per_pixel */ "16 16 82 1", /* colors */ " c #000000", ". c #FBBD5B", "X c #FDF4AC", "o c #FCF4AB", "O c #FDF3A2", "+ c #FEFCEF", "@ c #FCB23E", "# c #FCB03E", "$ c #FBAE3D", "% c #FBB94A", "& c #FCE34E", "* c #FAB43F", "= c #FCEB65", "- c #FBBA57", "; c #FCE768", ": c #FCEF82", "> c #FEF8D0", ", c #FEFEFB", "< c #FBB13F", "1 c #FDCD83", "2 c #FEF8E7", "3 c #FDF5B1", "4 c #FCED71", "5 c #FDF6BE", "6 c #FCE55D", "7 c #FCD549", "8 c #FDE6C1", "9 c #FEF9CF", "0 c #FDEAAD", "q c #FEFCF0", "w c #FCB43F", "e c #FCB23F", "r c #FDF4B0", "t c #FCE459", "y c #FCC66D", "u c #FCC470", "i c #FDF08B", "p c #FEF8CE", "a c #FDF0A2", "s c #FBC168", "d c #FCB33E", "f c #FCB13E", "g c #FCAF3E", "h c #FBAF3D", "j c #FBC16E", "k c #FCEC68", "l c #FDE6BF", "z c #FDF3A1", "x c #FAB545", "c c #FBD349", "v c #FCEA57", "b c #FDF4AE", "n c #FCF4AD", "m c #FEF9D0", "M c #FEFCF1", "N c #FCE86E", "B c #FBB43F", "V c #FEF9E7", "C c #FCCC82", "Z c #FBAE3F", "A c #FCEA5A", "S c #FCBC57", "D c #FCD964", "F c #FDF089", "G c #FDECB4", "H c #FDF1AA", "J c #FDF08C", "K c #FEFAE3", "L c #FCE956", "P c #FCEF81", "I c #FCB953", "U c #FEFDF0", "Y c #FCB33F", "T c #FBB13E", "R c #FBDB6C", "E c #FCE959", "W c #FCEF84", "Q c #FCCD84", "! c #FEF9DF", "~ c #FCEF87", "^ c #FCC570", "/ c None", /* pixels */ "////////////////", "///////#f///////", "///////ff///////", "///ge/1CuI/@g///", "///@ylVq!0-Ye///", "////8,+prnax////", "///12UU9XF~Dd///", "/ffQM>m5zPk;Tf#/", "/#f^K3bOJ4Et c #B4C9E2", " , c #7DA3CD", " < c #C5C7A0", " 1 c #D8DAAC", " 2 c #A7A472", " 3 c #C6D6ED", " 4 c #ABC2E3", " 5 c #C5D4EC", " 6 c #717168", " 7 c #8EAED7", " 8 c #C3D4EA", " 9 c #BDC4CD", " 0 c #BCBEA1", " q c #F7FAFC", " w c #DCE6F2", " e c #DDE4F3", " r c #A2AEC3", " t c #626677", " y c #505037", " u c #C0D2E7", " i c #616676", " p c #DBE4F1", " a c #BFD2E6", " s c #868997", " d c #89ACD2", " f c #D9E4EF", " g c #88ACD1", " h c #85A7D8", " j c #848795", " k c #63636E", " l c #A4A686", " z c #4A4A31", " x c #DFE0E1", " c c #B4C9E5", " v c #EEF0F3", " b c #EAEDF9", " n c #7EA3D1", " m c #B3C9E4", " M c #4B4B28", " N c #C6CDCF", " B c #CCDBEC", " V c #CBDBEB", " C c #CBD9EB", " Z c #AFC7E0", " A c #CAD9EA", " S c #E4EDF3", " D c #EBEDBB", " F c #AEC5DF", " G c #1A1A0F", " H c #9EB1CC", " J c #E9EBB9", " K c #C4C698", " L c #DBDC9E", " P c #A7C0E2", " I c #E7E9B7", " U c #C2C496", " Y c #686841", " T c #A8A862", " R c #8BACD7", " E c #A0A499", " W c #8D8D8D", " Q c #F4F7C7", " ! c #D7E4F0", " ~ c #9EA497", " ^ c #626570", " / c #D7E2F0", " ( c #E5E7E0", " ) c #D6E2EF", " _ c #F0F4F8", " ` c #9FBCDA", " ' c #9FBADA", " ] c #B6C9EA", " [ c #83A8CF", " { c #4D4D2D", " } c #73767A", " | c #A7ABAD", ". c #799ED9", ".. c #DBDEE0", ".X c #ECEEF4", ".o c #B7BA8B", ".O c #E4EDF6", ".+ c #C8D9EB", ".@ c #84887A", ".# c #57573A", ".$ c #C7D9EA", ".% c #E2EBF4", ".& c #C7D7EA", ".* c #C6D7E9", ".= c #8FB1D4", ".- c #AAC3DE", ".; c #C5D5E8", ".: c #8FAFD4", ".> c #656976", "., c #B9C4CF", ".< c #7098D0", ".1 c #636774", ".2 c #C0C2C2", ".3 c #616572", ".4 c #606371", ".5 c #D5E0F1", ".6 c #9EBADC", ".7 c #777777", ".8 c #D2E0EE", ".9 c #D1DEED", ".0 c #B6CAE3", ".q c #7FA4CE", ".w c #F8FADB", ".e c #B2B7BE", ".r c #727C93", ".t c #C8CDC3", ".y c #CBD6E7", ".u c #B5B782", ".i c #A7BEE8", ".p c #8FAFD7", ".a c #C4D5EA", ".s c #DEE9F3", ".d c #7098D3", ".f c #6D6D6D", ".g c #DDE7F2", ".h c #A7C1DE", ".j c #C2D3E8", ".k c #DDE5F2", ".l c #F7F9FB", ".z c #C1D3E7", ".x c #8BADD3", ".c c #616775", ".v c #3F3F22", ".b c #616575", ".n c #606574", ".m c #9C9C70", ".M c #A3A359", ".N c #4B4B31", ".B c #515123", ".V c #F0F1F4", ".C c #D5D7BF", ".Z c #CEDEED", ".A c #4C4C28", ".S c #CDDCEC", ".D c #CCDAEB", ".F c #ECEDF0", ".G c #B0C8E0", ".H c #CBDAEA", ".J c #7AA2CC", ".K c #95B4D6", ".L c #6B6E78", ".P c #98AED9", ".I c #C6D5EF", ".U c #79A0CB", ".Y c #B2C5D8", ".T c #6F98D5", ".R c #5B5B5B", ".E c #BABFA1", ".W c #ABAC5A", ".Q c #7099CC", ".! c #595959", ".~ c #DAE5F2", ".^ c #86A8DB", "./ c #D9E5F1", ".( c #ABBCDB", ".) c #A3BFDD", "._ c #BDD1E6", ".` c #D8E3F0", ".' c #A2BDDC", ".] c #80A3DF", ".[ c #D7E3EF", ".{ c #A1BDDB", ".} c #F1F5F8", ".| c #606042", "X c #555555", "X. c #D6E1EE", "XX c #91927C", "Xo c #F2F4C4", "XO c #686A61", "X+ c #F1F4C3", "X@ c #535353", "X# c #83A7CE", "X$ c #555580", "X% c #858459", "X& c #7A9FD9", "X* c #CDCE99", "X= c #7D8290", "X- c #D2D5BF", "X; c #EBEEBD", "X: c #84854E", "X> c #C9DAEB", "X, c #C9D8EB", "X< c #929494", "X1 c #C8D8EA", "X2 c #696C79", "X3 c #464625", "X4 c #C7D8E9", "X5 c #E2EAF3", "X6 c #91B2D5", "X7 c #ACC4DF", "X8 c #C0C2A0", "X9 c #C6D6E8", "X0 c #759ECA", "Xq c #474747", "Xw c #636673", "Xe c #626672", "Xr c #96977A", "Xt c #A8A85A", "Xy c #616471", "Xu c #EFF5F9", "Xi c #BEBE8A", "Xp c #9CB9D9", "Xa c #B7CBE3", "Xs c #D4D68F", "Xd c #81A5CF", "Xf c #9BB9D8", "Xg c #80A5CE", "Xh c #F0F0F0", "Xj c #555744", "Xk c #BFC3AC", "Xl c #A4AFA2", "Xz c #AFC6E5", "Xx c #96AEDD", "Xc c #686C7B", "Xv c #676C7A", "Xb c #A6AC9A", "Xn c #DCDFCF", "Xm c #C4D6E9", "XM c #D9DBA1", "XN c #DDE8F1", "XB c #636876", "XV c #C1D4E6", "XC c #8BAED2", "XZ c #C1D2E6", "XA c #626675", "XS c #9FB8E9", "XD c #DBE4EF", "XF c #A1A495", "XG c #52512D", "XH c #313131", "XJ c #75744C", "XK c #6C7282", "XL c #EBF1F8", "XP c #CFDFED", "XI c #DADFE4", "XU c #CFDDED", "XY c #CEDDEC", "XT c #98B7D8", "XR c #B3C9E2", "XE c #97B7D7", "XW c #CDDBEB", "XQ c #96B5D6", "X! c #494924", "X~ c #749CCF", "X^ c #81837C", "X/ c #BCC6CD", "X( c #626878", "X) c #DBE6F2", "X_ c #C6CBB9", "X` c #BFD2E7", "X' c #DFE5EC", "X] c #A4BEDD", "X[ c #BED2E6", "X{ c #A3BEDC", "X} c #D8E4EF", "X| c #51512F", "o c #B9CBEB", "o. c #828594", "oX c #F1F3C2", "oo c #EAEDFA", "oO c #DDDFAB", "o+ c #E6EDF6", "o@ c #5D5E34", "o# c #CBD9EC", "o$ c #CAD9EB", "o% c #EBEDBC", "o& c #AEC7E0", "o* c #B6B688", "o= c #C9D9EA", "o- c #8DABE4", "o; c #AEC5E0", "o: c #C8D9E9", "o> c #E6EAEC", "o, c #E5E8EB", "o< c #C0C3CA", "o1 c #646773", "o2 c #9EB9E4", "o3 c #626571", "o4 c #BFC4BF", "o5 c #C0C0C0", "o6 c #60656F", "o7 c #D5E2EF", "o8 c #9FBCDB", "o9 c #D4E0EE", "o0 c #C9CFD6", "oq c #C5CCDC", "ow c #9EBADA", "oe c #D7DFE7", "or c #9BB8D7", "ot c #848785", "oy c #AEBCC2", "ou c #7E8289", "oi c #BAB985", "op c #95ADDB", "oa c #E3E9F6", "os c #E2E9F5", "od c #C6D7EA", "of c #303018", "og c #B2BAB2", "oh c #E0E9F3", "oj c #6C7995", "ok c #AAC3DF", "ol c #DFE9F2", "oz c #879AC0", "ox c #7D817E", "oc c #C4D5E8", "ov c #DEE9F1", "ob c #AAB0BE", "on c #C3D5E7", "om c #DEE7F1", "oM c #85A7DF", "oN c #626774", "oB c #B0B0B0", "oV c #616573", "oC c #616373", "oZ c #D5E0F2", "oA c #EDEECE", "oS c #9AB5E3", "oD c #D1E0EE", "oF c #72747D", "oG c #B6CCE4", "oH c #D1DEEE", "oJ c #D0DEED", "oK c #CFDEEC", "oL c #B3B595", "oP c #CFDCEC", "oI c #8F94A0", "oU c #B3CAE1", "oY c #B4B461", "oT c #98B6D7", "oR c #B2CAE0", "oE c #B3C8E1", "oW c #D8DCE1", "oQ c #57573E", "o! c #A1A276", "o~ c #DEE9F4", "o^ c #D5D7A9", "o/ c #F3F4D7", "o( c #DCE7F2", "o) c #8999BB", "o_ c #626777", "o` c #BFD1E6", "o' c #89ABD2", "o] c #51522E", "o[ c #64646F", "o{ c #A2BDDA", "o} c #DCE4E8", "o| c #9C9C9C", "O c #9FB6E1", "O. c #ECEEFB", "OX c #808491", "Oo c #C4C7AC", "OO c #EEF1F3", "O+ c #4C4C29", "O@ c #A0B3D8", "O# c #D8DCE4", "O$ c #C3C9D6", "O% c #C9CB9D", "O& c #CCDCEC", "O* c #686D80", "O= c #CCDAEC", "O- c #CBDAEB", "O; c #9B9E87", "O: c #CADAEA", "O> c #E5ECF4", "O, c #94B4D6", "O< c #AFC6E0", "O1 c #919266", "O2 c #94B2D6", "O3 c #E4EAF3", "O4 c #5B5B31", "O5 c #78A0CB", "O6 c #59592F", "O7 c #E3E6F2", "O8 c #E6E8B6", "O9 c #C8CBB3", "O0 c #F2F5FA", "Oq c #61666F", "Ow c #F1F5F9", "Oe c #D6E1EF", "Or c #9CB8E1", "Ot c #D5E1EE", "Oy c #9FBBDA", "Ou c #CCD1CE", "Oi c #E9EEFB", "Op c #CDCE9A", "Oa c #BDBC87", "Os c #E8ECFA", "Od c #878B7D", "Of c #769DD6", "Og c #CACA97", "Oh c #C9D8EC", "Oj c #C8D8EB", "Ok c #C7D8EA", "Ol c #949162", "Oz c #C8C895", "Ox c #E1EAF3", "Oc c #595932", "Ov c #C6D6E9", "Ob c #E0EAF2", "On c #9B9B80", "Om c #BBC3D1", "OM c #8FB0D4", "ON c #666677", "OB c #424222", "OV c #646875", "OC c #8DAED2", "OZ c #919480", "OA c #616472", "OS c #D3E1EF", "OD c #646436", "OF c #D4DDF0", "OG c #D2DFEE", "OH c #EDF1F8", "OJ c #D1DFED", "OK c #99976A", "OL c #B6CBE3", "OP c #D0DDEC", "OI c #9AB7D8", "OU c #CFDDEB", "OY c #7BA0D4", "OT c #A8B09D", "OR c #759BD8", "OE c #8890A2", "OW c #C6C9CB", "OQ c #8EADE0", "O! c #98ADD6", "O~ c #9FA4A8", "O^ c #7D8AAB", "O/ c #F4F5D7", "O( c #DEE8F3", "O) c #ABBEE2", "O_ c #DDE8F2", "O` c #7E8BA2", "O' c #F2F3D5", "O] c #636877", "O[ c #C1D4E7", "O{ c #626876", "O} c #F6FAFA", "O| c #C1D2E7", "+ c #626676", "+. c #DBE6F0", "+X c #9FB8EA", "+o c #8AAED2", "+O c #626276", "++ c #686868", "+@ c #8B895C", "+# c #3C3C1F", "+$ c #828592", "+% c #888559", "+& c #B1B9CA", "+* c #EAF1F8", "+= c #4D4D29", "+- c #CEDDED", "+; c #606035", "+: c #B9C8DF", "+> c #CDDBEC", "+, c #CCDBEB", "+< c #CBDBEA", "+1 c #666C7D", "+2 c #94B3D5", "+3 c #6B6A43", "+4 c #E8EAEC", "+5 c #E2E9F0", "+6 c #626879", "+7 c #93A9D4", "+8 c #DAE6F2", "+9 c #535332", "+0 c #8C8B60", "+q c #585858", "+w c #5D6874", "+e c #292916", "+r c #D8E4F0", "+t c #F4F7C6", "+y c #BDD0E6", "+u c #9B9972", "+i c #65643D", "+p c #3C3C22", "+a c #BCD0E5", "+s c #565656", "+d c #636370", "+f c #61656E", "+g c #D6E2EE", "+h c #85A8D0", "+j c #BACEE3", "+k c #80A5D5", "+l c #E8EDF9", "+z c #B8BA8B", "+x c #505050", "+c c #CDD9EF", "+v c #6C6F7C", "+b c #8CA2C3", "+n c #E7EBF8", "+m c #B4B9BC", "+M c #CAD9EC", "+N c #FFFFFF", "+B c #AFC5E2", "+V c #C9D9EB", "+C c #C8D9EA", "+Z c #B1B38E", "+A c #939460", "+S c #E2EBF3", "+D c #92B1D6", "+F c #ACC5DF", "+G c #C7D7E9", "+H c #E2E9F3", "+J c #B8C3D7", "+K c #D6D8DA", "+L c #90B1D4", "+P c #80804A", "+I c #CFD5DD", "+U c #56562E", "+Y c #464646", "+T c #7A7D79", "+R c #636373", "+E c #616571", "+W c #606370", "+Q c #B9CEE5", "+! c #D4E0EF", "+~ c #DEE2E5", "+^ c #83A8D1", "+/ c #9EBADB", "+( c #D3E0EE", "+) c #EEF2F8", "+_ c #798499", "+` c #9DBADA", "+' c #D2E0ED", "+] c #96B2E7", "+[ c #B6CCE2", "+{ c #71747A", "+} c #909074", "+| c #80A4CE", "@ c #7CA1D4", "@. c #E6EBFA", "@X c #B4B45F", "@o c #474729", "@O c #99B2D6", "@+ c #ACC3E2", "@@ c #E0E9F4", "@# c #E5EAEF", "@$ c #D6D9A8", "@% c #C4D5E9", "@& c #A1A074", "@* c #F9FBFC", "@= c #C3D5E8", "@- c #646977", "@; c #DDE7F1", "@: c #A7C1DD", "@> c #C2D3E7", "@, c #636776", "@< c #719BC9", "@1 c #8CADD3", "@2 c #626775", "@3 c #8D9AB3", "@4 c #C1CFE6", "@5 c #A1BAE1", "@6 c #F4F5F7", "@7 c #64646D", "@8 c #EDEECF", "@9 c #9A9A6D", "@0 c #B8CCE7", "@q c #F2F3F5", "@w c #D1DEEF", "@e c #4E4E29", "@r c #C7CBD8", "@t c #D0DEEE", "@y c #CFDEED", "@u c #ACAFA3", "@i c #99B6D9", "@p c #6A6F80", "@a c #CEDCEC", "@s c #EAECF7", "@d c #CDDCEB", "@f c #2C2C2C", "@g c #759CDA", "@h c #7CA2CD", "@j c #BCC6D7", "@k c #B3B6B7", "@l c #8199C8", "@z c #BCC5CD", "@x c #DEE5F5", "@c c #C2C4C9", "@v c #626778", "@b c #DBE7F2", "@n c #616777", "@m c #DBE5F2", "@M c #DAE5F1", "@N c #AABED9", "@B c #F5F8C6", "@V c #BED1E6", "@C c #D9E3F0", "@Z c #646470", "@A c #BDCFE5", "@S c #B0C0CB", "@D c #BBCFE3", "@F c #F1F4C2", "@G c #DFE1E2", "@H c #D0DCF1", "@J c #EFF1F5", "@K c #E8F2F8", "@L c #EFF2C0", "@P c #1C1C1C", "@I c #DDDFE0", "@U c #DEE0AC", "@Y c #E8EEF8", "@T c #D6D8B8", "@R c #CCDCED", "@E c #1A1A1A", "@W c #92A2BE", "@Q c #B2C4E4", "@! c #E6ECF6", "@~ c #B0C6E2", "@^ c #CADAEB", "@/ c #CFDBE6", "@( c #CAD8EB", "@) c #AEC6E0", "@_ c #C8D8E9", "@` c #DCE5F6", "@' c #6F778B", "@] c #F2F7FB", "@[ c #F3F6C7", "@{ c #D6E3F0", "@} c #626471", "@| c #B2BCD0", "# c #D6E1F0", "#. c #626271", "#X c #E0E3E6", "#o c #D5E1EF", "#O c #6B7387", "#+ c #D4E1EE", "#@ c #98B3E8", "## c #EFF3F8", "#$ c #515128", "#% c #9EBBDA", "#& c #B9CDE4", "#* c #9B996A", "#= c #B8CDE3", "#- c #D3DFED", "#; c #CED09C", "#: c #CCCFCF", "#> c #6B707D", "#, c #ADC3EC", "#< c #B9B9B9", "#1 c #CAD8EE", "#2 c #686C7A", "#3 c #E2EAF5", "#4 c #ACC4E1", "#5 c #AFB28E", "#6 c #C6D6EA", "#7 c #C5D6E9", "#8 c #B1C1DC", "#9 c #C4D6E8", "#0 c #DFE8F2", "#q c #A9C2DE", "#w c #8DAED3", "#e c #C2D4E6", "#r c #DDE6F0", "#t c None", /* pixels */ "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t.b+6o_oVoVo_+6.c#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@n#Oo)O@O) ]o @Q.(@W@'@n#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@2O*O!#,oS.^@ X~X~ n R P.I#8XK@2#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tXAO^.iOQ.d+k.p+/o;oG+F.'@1X0.6+c@3XA#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t+1+7XS. h c.*.&X1Ok.&+GOv.;o`.: [ 5+:@p#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t iopo-X& 4#6X4.$X1o=+CX1X1+GX9oc@AXdO5@+@4+ #t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t+ @l#@OR oodOk.&o=o= A@^o$@^o=Ok#7@=X7 ,.U 3 H+ #t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#toj+X@gXz.a.*+GX1 C@^ B B B VO:o=@_X9.z+h.q+h@`+_#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t .Xx.]Or 8Xm#7X4+VO-O=XW@a.S@d+>.D A.XQ+^+|owOF.1#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t.r+].T@0O[@%X4+C@^+,oPoK &.9XU+-@aO&X,Ok.{ d+h+|@HOE#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#tX(ozoMOYX`.j#9.*X>XWXY &oJoD.8OJ.9OP -.So: $OMXC+h@~+JO{#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t@v.POf 7@VO[#7X1.H@a@yOJ#-o9#+OtOtOGoJXU.*XTO,.=+o+D e@,#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#tXAO .<+Lo`@>#6+VO-@y ##-#o )@{ / /# .8 # u 'orO,OMo'OsoN#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t.1o2.QX# a@=.* A.S@t+(#o /@C@M./ fX}X.OU@).)OyOIO2OC@..>#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#toV@5@@=+y+[O#tXV+QXRoZO$XB#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t@2 r#4XE `#q.0Xu+<#t#t#t#t#t#t#t q#t#tXmX[Oh+n#>#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#tXv@| mo{X7 =oh p#t#t#t#t#t#tOwO0#t#t#t@wooOX#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#2@joE FOLXP+5#t#t#t#t#t#t@J#t#t#t#tO.+$#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tX=o#o;+[#e+I#t#t#t#t#t#t+K#t#t#toa@r#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@-oq >#&O[@z 9#t#t#t#t#t#t#t#t#t+l j#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tobO|#&XV.,O~#t#t#t#tX<#t#t#t#t b+v#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t s.5.Y@SoyoxXboL#5On 6#t#t#t#3O7o1#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tOVOmX/XlOT.@OZ.EX8Xr+}+Z l E@soI#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tX2o0 Nog ~OdXkOoO; 0@T.C@Go c #999999", " , c #E06565", " < c #D73838", " 1 c #979797", " 2 c #DBC6C6", " 3 c #9F0101", " 4 c #D21C1C", " 5 c #DFD7D7", " 6 c #CA3535", " 7 c #940000", " 8 c #DA5F5F", " 9 c #D85D5D", " 0 c #8D8D8D", " q c #800000", " w c #B31B1B", " e c #D02727", " r c #D83C3C", " t c #CF0F0F", " y c #C02B2B", " u c #C84040", " i c #D43838", " p c #A50000", " a c #7F7F7F", " s c #910000", " d c #DE5C5C", " f c #D52F2F", " g c #CC0202", " h c #7D7D7D", " j c #D94040", " k c #D01313", " l c #DCB6B6", " z c #ECE0E0", " x c #CE1111", " c c #777777", " v c #690000", " b c #DFDDDD", " n c #A20000", " m c #DF6060", " M c #D63333", " N c #CD0606", " B c #B72525", " V c #B52323", " C c #D02D2D", " Z c #E16F6F", " A c #D75858", " S c #676767", " D c #BE2F2F", " F c #636363", " G c #E4C4C4", " H c #E06464", " J c #D73737", " K c #CE0A0A", " L c #A10202", " P c #D53535", " I c #9F0000", " U c #C53939", " Y c #AC1010", " T c #D13131", " R c #5B5B5B", " E c #A80C0C", " W c #E1B7B7", " Q c #C42E2E", " ! c #DB5555", " ~ c #A40808", " ^ c #CF0E0E", " / c #4F4F4F", " ( c #BC2626", " ) c #DB6262", " _ c #9C0000", " ` c #4B4B4B", " ' c #DE5B5B", " ] c #D52E2E", " [ c #CC0101", " { c #D78C8C", " } c #474747", " | c #B21C1C", ". c #434343", ".. c #D85555", ".X c #E06A6A", ".o c #D88383", ".O c #DF8080", ".+ c #E1DEDE", ".@ c #F0F0F0", ".# c #D56969", ".$ c #D45151", ".% c #DB4E4E", ".& c #AC1616", ".* c #EEEEEE", ".= c #D13737", ".- c #ECECEC", ".; c #990000", ".: c #CE1D1D", ".> c #DF5F5F", "., c #D63232", ".< c #CD0505", ".1 c #DAC0C0", ".2 c #EAEAEA", ".3 c #E8E8E8", ".4 c #AB0B0B", ".5 c #DED1D1", ".6 c #850000", ".7 c #E6E6E6", ".8 c #E16E6E", ".9 c #E4E4E4", ".0 c #E2E2E2", ".q c #D9B5B5", ".w c #E0E0E0", ".e c #BC2C2C", ".r c #AA0000", ".t c #DEDEDE", ".y c #D03939", ".u c #D84E4E", ".i c #CE0909", ".p c #A10101", ".a c #B01313", ".s c #DCDCDC", ".d c #EEE7E7", ".f c #D01818", ".g c #CE1616", ".h c #A80B0B", ".j c #DD5656", ".k c #D83A3A", ".l c #CD0B0B", ".z c #A00303", ".x c #E9D8D8", ".c c #DD6363", ".v c #D34C4C", ".b c #171717", ".n c #C12020", ".m c #0D0000", ".M c #C6C6C6", ".N c #D52D2D", ".B c #CC0000", ".V c #D24141", ".C c #DA5656", ".Z c #E06969", ".A c #D65252", ".S c #E1DDDD", ".D c #DB4D4D", ".F c #D22020", ".G c #D24E4E", ".H c #AA1313", ".J c #DF5E5E", ".K c #CD0404", ".L c #CE4A4A", ".P c #010101", ".I c #DC7272", ".U c #B31F1F", ".Y c #DC5151", ".T c #D32424", ".R c #AD1919", ".E c #DFC7C7", ".W c #D23A3A", ".Q c #BA2929", ".! c #D15050", ".~ c #E06262", ".^ c #D73535", "./ c #A10000", ".( c #CE1515", ".) c #DD5555", "._ c #D42828", ".` c #FF0000", ".' c #D45656", ".] c #989898", ".[ c #CD0A0A", ".{ c #A00202", ".} c #CD3838", ".| c #9E0000", "X c #D46363", "X. c #DB6060", "XX c #DA4848", "Xo c #D11B1B", "XO c #DDBEBE", "X+ c #D14949", "X@ c #A90E0E", "X# c #C73232", "X$ c #DE5959", "X% c #A70C0C", "X& c #8C8C8C", "X* c #DD9D9D", "X= c #DBC9C9", "X- c #DB4C4C", "X; c #D21F1F", "X: c #AA1212", "X> c #DA9090", "X, c #808080", "X< c #D04B4B", "X1 c #DF5D5D", "X2 c #D63030", "X3 c #CD0303", "X4 c #E16C6C", "X5 c #DF6A6A", "X6 c #CD1010", "X7 c #E2E0E0", "X8 c #DC5050", "X9 c #747474", "X0 c #D35151", "Xq c #BA2828", "Xw c #D96464", "Xe c #CC0505", "Xr c #6E6E6E", "Xt c #D33030", "Xy c #D35E5E", "Xu c #D94343", "Xi c #686868", "Xp c #D65757", "Xa c #DD5454", "Xs c #D42727", "Xd c #A60707", "Xf c #D33D3D", "Xg c #DB5252", "Xh c #A40505", "Xj c #B31717", "Xk c #A20303", "Xl c #A00101", "Xz c #D11A1A", "Xx c #5A5A5A", "Xc c #DE5858", "Xv c #D52B2B", "Xb c #CF2525", "Xn c #AE1515", "Xm c #DFABAB", "XM c #D44E4E", "XN c #DC6363", "XB c #FFFFFF", "XV c #DB4B4B", "XC c #D21E1E", "XZ c #CF3232", "XA c #B72121", "XS c #DABDBD", "XD c #BE1E1E", "XF c #D83E3E", "XG c #DCCCCC", "XH c #424242", "XJ c #D75454", "XK c #DF6969", "XL c #CD0F0F", "XP c #D78282", "XI c #D43A3A", "XU c #DC4F4F", "XY c #EFEFEF", "XT c #A30000", "XR c #EDEDED", "XE c #EBEBEB", "XW c #D53131", "XQ c #E9E9E9", "X! c #8F0000", "X~ c #090000", "X^ c #D67777", "X/ c #B42121", "X( c #E7E7E7", "X) c #D94242", "X_ c #D01515", "X` c #E5E5E5", "X' c #B71A1A", "X] c #E3E3E3", "X[ c #DD5353", "X{ c #E1E1E1", "X} c #DFDFDF", "X| c #A20202", "o c #DDDDDD", "o. c #A00000", "oX c #D54B4B", "oo c #C31F1F", "oO c #DA4646", "o+ c #D11919", "o@ c #D95C5C", "o# c #C03333", "o$ c #DAA2A2", "o% c #D3D3D3", "o& c #A50808", "o* c #E06666", "o= c #D99797", "o- c #181818", "o; c #9D0000", "o: c #DB4A4A", "o> c #C7C7C7", "o, c #DDD6D6", "o< c #CC4545", "o1 c #D25858", "o2 c #E16A6A", "o3 c #D83D3D", "o4 c #C02C2C", "o5 c #DD6666", "o6 c #D32121", "o7 c #AD1616", "o8 c #DEDADA", "o9 c #CF1D1D", "o0 c #CC0303", "oq c #D67676", "ow c None", /* pixels */ "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowow./././ nowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowow nX/ 8XNXq nowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowX% Z._X;X4X@owowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowXT.L o.B.B .B.Bo1o o o .t.#.B.Bo: (o.owowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowow.p ).F.B $ 2o o .t.t.5XL.B O.CX|owowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowow.eXc.B.BX o o .t.tX}X}oq.B.B j y./owowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowXko5Xz.B.lXGo .t.tX}X}X} 5.(.B ^ !Xhowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowo.o#.Y.B.B ;o .t.tX}X}X}.w.w.o.B.B < Q./owowowowowowowowowowowowowow", "owowowowowowowowowowowowowow :XK O.BX6 =.t.t 1 h h.].wX{.So9.B.iXgo&owowowowowowowowowowowowowow", "owowowowowowowowowowowowow./ Uo:.B.BX^.t.tX}XH . X{X{.0X>.B.B fX#./owowowowowowowowowowowowow", "owowowowowowowowowowowowow ~X5 t.B.go,.tX}X} / /X{.0.0X7 e.B N.%.howowowowowowowowowowowowow", "owowowowowowowowowowowow n uXu.B.BXP.tX}X}.wXx R.0.0.0X]X*.B.BXs 6./owowowowowowowowowowowow", "owowowowowowowowowowowow E.X K.B.:o8X}X}.w.w S Xi.0.0X].9.9 T.BX3XX Yowowowowowowowowowowowow", "owowowowowowowowowowow no< r.B.B {X}X}.w.w.wX9 X9X]X].9.9X`Xm.B.B.F.}./owowowowowowowowowowow", "owowowowowowowowowowowX:.Z $.BXb bX}.w.w.wX{ a X,X].9.9X`X`.7Xf.B [X).aowowowowowowowowowowow", "owowowowowowowowowow./X<.^.B.Bo=X}.w.w.wX{X{X& 0.9.9X`X`.7.7 W.B.Bo+.y./owowowowowowowowowow", "owowowowowowowowowow.&o*.K.B CX}.w.w.wX{X{.0.] >.9X`X`.7.7X(X(oX.B.B.kXjowowowowowowowowowow", "owowowowowowowowow./X0 ].B.Bo$.w.w.wX{X{.0.0 % %X`X`.7.7X(X(.3 Go0.B k.W.powowowowowowowowow", "owowowowowowowowow | # g.B.=.w.w.wX{X{.0.0X].M F Fo>X`.7.7X(X(.3XQXQ A.B.B MX'o.owowowowowowowow", "owowowowowowowow./XpXs.B.B @.w.wX{X{.0.0X]X].9.Mo>X`.7.7X(X(.3XQXQ.2 X N.B ^XI Lowowowowowowowow", "owowowowowowowow V d [.B.V.w.wX{X{.0.0X]X].9Xr .PX9.7X(.3.3XQXQ.2.2XEXw.B.BXv ../owowowowowowow", "owowowowowowow.po@o6.B [ l.wX{X{.0.0X]X].9.9.b o-X(.3.3XQXQ.2.2XEXE.x.[.B.i iXkowowowowowowow", "owowowowowowow.Q.).B.B.v.wX{X{.0.0X]X].9.9X` ` }.3.3XQXQ.2.2XEXE.-.-.I.B.B.TXD nowowowowowow", "owowowowowowX|X.Xo.Bo0XOX{X{.0.0X]X].9.9X`X`o% c co%.3XQXQ.2.2XEXE.-.-XR z x.B N P :owowowowowow", "owowowowow./ DXU.B.B.'X{X{.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*.O.B.BXC.n./owowowowow", "owowowowowXk.cX_.B N.EX{.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*XY.d.f.BX3XWXdowowowowow", "owowowow 7o4X-.B.B C.+.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*XYXY.@.u.B.BXzooo.owowowow", "owowowow.| A 4.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.KXto.owowowow", "owowowow _.$ f.<.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B g t +o.owowowow", "owowowow qo7XJ.~ , # m.JX1 'X$Xc.j.)X[.YX8XU.DXVo:XXoO *XuX) jXFo3 r.k < J.^ M.,X2 +.4 sowowowow", "owowowowow.6o; I 3.z.z.z.z.z.z.z.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{XlXlXl 3 I IX!owowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow" }; // --------------------------------------------------------------------- // end of Tango icons // --------------------------------------------------------------------- fldigi-4.1.06/src/misc/utf8file_io.cxx0000644000175000017500000001002613472115773014455 00000000000000// ---------------------------------------------------------------------------- // utf8file_io.cxx // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "utf8file_io.h" #include "icons.h" #define linelen 1024 //---------------------------------------------------------------------- // filter that produces, from an input stream fed by reading from fp, // a UTF-8-encoded output stream written in buffer. // Input can be UTF-8. If it is not, it is decoded with CP1252. // Output is UTF-8. // *input_was_changed is set to true if the input was not strict UTF-8 // so output differs from input. //---------------------------------------------------------------------- #include static int utf8_read_( char *buffer, int buflen, char *line, int sline, char *endline, FILE *fp, bool *input_was_changed ) { char *p, *q, multibyte[5]; int l, lp, lq, r; unsigned u; p = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } l = fl_utf8len1(*p); if (p + l > endline) { memmove(line, p, endline - p); endline -= (p - line); r = fread(endline, 1, sline - (endline - line), fp); endline += r; p = line; if (endline - line < l) break; } while ( l > 0) { u = fl_utf8decode(p, p+l, &lp); lq = fl_utf8encode(u, multibyte); if (lp != l || lq != l) *input_was_changed = true; if (q + lq > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } memcpy(q, multibyte, lq); q += lq; p += lp; l -= lp; } } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } static const char file_encoding_warning_message[] = "Input file was not UTF-8 encoded.\n" "Text has been converted to UTF-8."; //---------------------------------------------------------------------- // Read text from a file. // utf8_input_filter accepts UTF-8 or CP1252 as input encoding. // Output is always UTF-8 encoded std::string //---------------------------------------------------------------------- int UTF8_readfile(const char *file, std::string &output) { FILE *fp; if (!(fp = fl_fopen(file, "r"))) return 1; char buffer[2 * linelen + 1], line[linelen]; char *endline = line; int l; bool input_file_was_transcoded = false; while (true) { l = utf8_read_( buffer, linelen * 2 + 1, line, linelen, endline, fp, &input_file_was_transcoded); if (l == 0) break; buffer[l] = 0; output.append(buffer); } int e = ferror(fp) ? 2 : 0; fclose(fp); if ( (!e) && input_file_was_transcoded) fl_alert2("%s", file_encoding_warning_message); return e; } //---------------------------------------------------------------------- // Write text std::string to file. // Unicode safe. //---------------------------------------------------------------------- int UTF8_writefile( const char *file, std::string &text ) { FILE *fp; if (!(fp = fl_fopen(file, "w"))) return 1; int buflen = text.length(); int r = fwrite( text.c_str(), 1, buflen, fp ); int e = (r != buflen) ? 1 : ferror(fp) ? 2 : 0; fclose(fp); return e; } fldigi-4.1.06/src/misc/ascii.cxx0000644000175000017500000001507213472115773013336 00000000000000// ---------------------------------------------------------------------------- // ascii.cxx -- ASCII table // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "ascii.h" const char *ascii[256] = { "", "", "", "", "", "", "", "", "\b", "\t", "\n", "", "", "\r", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; const char *ascii2[256] = { "", "", "", "", "", "", "", "", "\b", "\t", "\n", "", "", "\r", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-" }; const char *ascii3[256] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; fldigi-4.1.06/src/misc/macros.cxx0000664000175000017500000034756613507402064013543 00000000000000// ---------------------------------------------------------------------------- // macros.cxx // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Chris Sylvain, KB3CS // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "macros.h" #include "gettext.h" #include "main.h" #include "misc.h" #include "fl_digi.h" #include "timeops.h" #include "configuration.h" #include "confdialog.h" #include "logger.h" #include "newinstall.h" #include "globals.h" #include "debug.h" #include "status.h" #include "trx.h" #include "modem.h" #include "qrunner.h" #include "waterfall.h" #include "rigsupport.h" #include "network.h" #include "logsupport.h" #include "icons.h" #include "weather.h" #include "utf8file_io.h" #include "xmlrpc.h" #include "rigio.h" #include "strutil.h" #include #include #include "fileselect.h" #include #include #include #include #include #include #include #include #ifdef __WIN32__ #include "speak.h" #endif #include "audio_alert.h" #include #include "re.h" //using namespace std; struct CMDS { std::string cmd; void (*fp)(std::string); }; static queue Tx_cmds; static queue Rx_cmds; // following used for debugging and development void push_txcmd(CMDS cmd) { LOG_INFO("%s, # = %d", cmd.cmd.c_str(), (int)Tx_cmds.size()); Tx_cmds.push(cmd); } void push_rxcmd(CMDS cmd) { LOG_INFO("%s, # = %d", cmd.cmd.c_str(), (int)Rx_cmds.size()); Rx_cmds.push(cmd); } // these variables are referenced outside of this file MACROTEXT macros; CONTESTCNTR contest_count; std::string qso_time = ""; std::string qso_exchange = ""; std::string exec_date = ""; std::string exec_time = ""; std::string exec_string = ""; std::string info1msg = ""; std::string info2msg = ""; std::string text2repeat = ""; size_t repeatchar = 0; bool macro_idle_on = false; bool macro_rx_wait = false; static float idleTime = 0; static bool TransmitON = false; static bool ToggleTXRX = false; static int mNbr; static std::string text2send = ""; static size_t xbeg = 0, xend = 0; static bool save_xchg; static bool expand; static bool GET = false; static bool timed_exec = false; static bool within_exec = false; void rx_que_continue(void *); static void postQueue(std::string s) { if (!progdefaults.macro_post) return; if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->addstr(s, FTextBase::CTRL); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(s, FTextBase::CTRL); else ReceiveText->addstr(s, FTextBase::CTRL); } static const char cutnumbers[] = "T12345678N"; static std::string cutstr; static std::string cut_string(const char *s) { cutstr = s; if (!progdefaults.cutnbrs || active_modem != cw_modem) return cutstr; for (size_t i = 0; i < cutstr.length(); i++) if (cutstr[i] >= '0' && cutstr[i] <= '9') cutstr[i] = cutnumbers[cutstr[i] - '0']; return cutstr; } static size_t mystrftime( char *s, size_t max, const char *fmt, const struct tm *tm) { return strftime(s, max, fmt, tm); } static std::string CPSstring = "\ =============================================\n\ ABCDEFGHIJKLMN OPQRSTUVWXYZ\n\ abcdefghijklmn opqrstuvwxyz\n\ 0123456789 9876543210\n\ !@#$%&*()_+-=[]{}\\|;:'\",.<>/?\n\ =============================================\n\ \n\ The Jaberwocky\n\ \n\ 'Twas brillig, and the slithy toves\n\ Did gyre and gimble in the wabe;\n\ All mimsy were the borogoves,\n\ And the mome raths outgrabe.\n\ \n\ \"Beware the Jabberwock, my son!\n\ The jaws that bite, the claws that catch!\n\ Beware the Jubjub bird, and shun\n\ The frumious Bandersnatch!\"\n\ \n\ He took his vorpal sword in hand:\n\ Long time the manxome foe he sought-\n\ So rested he by the Tumtum tree,\n\ And stood awhile in thought.\n\ \n\ And as in uffish thought he stood,\n\ The Jabberwock, with eyes of flame,\n\ Came whiffling through the tulgey wood,\n\ And burbled as it came!\n\ \n\ One, two! One, two! and through and through\n\ The vorpal blade went snicker-snack!\n\ He left it dead, and with its head\n\ He went galumphing back.\n\ \n\ \"And hast thou slain the Jabberwock?\n\ Come to my arms, my beamish boy!\n\ O frabjous day! Callooh! Callay!\"\n\ He chortled in his joy.\n\ \n\ 'Twas brillig, and the slithy toves\n\ Did gyre and gimble in the wabe;\n\ All mimsy were the borogoves,\n\ And the mome raths outgrabe.\n"; static std::string ccode = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; bool PERFORM_CPS_TEST = false; int num_cps_chars = 0; string testfilename; void CPS_report(int samples, int prepost) { char results[1000]; string strout; double xmttime = 1.0 * samples / active_modem->get_samplerate(); double overhead = 1.0 * prepost / active_modem->get_samplerate(); num_cps_chars--; snprintf(results, sizeof(results), "\n\ CPS test\n\ text: %s\n\ mode: %s\n\ # chars: %d\n\ overhead: %f sec\n\ xmt time: %f sec\n\ xmt samples: %d\n\ sample rate: %d\n\ chars/sec: %f", testfilename.c_str(), mode_info[active_modem->get_mode()].name, num_cps_chars, overhead, xmttime - overhead, samples, active_modem->get_samplerate(), num_cps_chars / (xmttime - overhead)); LOG_INFO("%s", results); strcat(results, "\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(results, FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(results, FTextBase::ALTR); else ReceiveText->add(results, FTextBase::ALTR); PERFORM_CPS_TEST = false; } static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr("Mode not supported", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+10, endbracket - i - 10); s.clear(); int n; if (buffer.empty()) n = 10; sscanf(buffer.c_str(), "%d", &n); if (n <= 0) n = 10; if (n > 100) n = 100; // sample count with 'n' characters int s1[256]; for (int i = 0; i < 256; i++) s1[i] = 0; // converstion from sample count to milliseconds double k = 1000.0 / (active_modem->get_samplerate() * n); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); // sample count for characters ' ' through '~' for(int j = 0; j < 256; j++) { s1[j] = number_of_samples(string(n, j)) - s0; } PERFORM_CPS_TEST = false; // report generator char results[200]; string line_out; snprintf(results, sizeof(results), "\nCPS test\nMode : %s\n", mode_info[active_modem->get_mode()].name); line_out = results; snprintf(results, sizeof(results), "Based on %d character string\n", n); line_out.append(results); snprintf(results, sizeof(results), "Overhead = %.3f msec\n", 1000.0 * s0 / active_modem->get_samplerate()); line_out.append(results); for (int j = 0, ln = 0; j < 256; j++ ) { snprintf(results, sizeof(results), "%2x%8.2f", j, k * s1[j]); line_out.append(results); ln++; if (ln && (ln % 4 == 0)) line_out.append("\n"); else line_out.append(" | "); } if (!line_out.empty()) { LOG_INFO("%s", line_out.c_str()); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(line_out.c_str(), FTextBase::ALTR); if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(line_out.c_str(), FTextBase::ALTR); else ReceiveText->add(line_out.c_str(), FTextBase::ALTR); } return; } static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string fname = s.substr(i+10, endbracket - i - 10); if (fname.length() > 0 && !within_exec) { FILE *toadd = fl_fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.clear(); fclose(toadd); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); testfilename = fname; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); num_cps_chars = 0; CPS_report(number_of_samples(buffer), s0); PERFORM_CPS_TEST = false; } else { string resp = "Could not locate "; resp.append(fname).append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); PERFORM_CPS_TEST = false; } } else { PERFORM_CPS_TEST = false; s.clear(); } } static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+12, endbracket - i - 12); std::string txtbuf = buffer; s.clear(); size_t p = buffer.find("\\n"); while (p != string::npos) { buffer.replace(p,2,"\n"); p = buffer.find("\\n"); } if (buffer.length()) { if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); num_cps_chars = 0; testfilename = txtbuf; CPS_report(number_of_samples(buffer), s0); PERFORM_CPS_TEST = false; } else { string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } static void pCPS_N(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+7, endbracket - i - 7); s.clear(); if (buffer.empty()) return; int numgroups, wc, cc, cl; cl = ccode.length(); sscanf(buffer.c_str(), "%d", &numgroups); if (numgroups <= 0 || numgroups > 100000) numgroups = 100; srand(time(0)); buffer.clear(); for (wc = 1; wc <= numgroups; wc++) { for (cc = 0; cc < 5; cc++) { buffer += ccode[ rand() % cl ]; } if (wc % 10 == 0) buffer += '\n'; else buffer += ' '; } if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); num_cps_chars = 0; testfilename = "Random group test"; CPS_report(number_of_samples(buffer), s0); PERFORM_CPS_TEST = false; return; } static void pWAV_TEST(std::string &s, size_t &i, size_t endbracket) { s.clear(); trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); return; } testfilename = "internal string"; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(CPSstring); PERFORM_CPS_TEST = false; } static void pWAV_N(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+7, endbracket - i - 7); s.clear(); if (buffer.empty()) return; int numgroups, wc, cc, cl; cl = ccode.length(); sscanf(buffer.c_str(), "%d", &numgroups); if (numgroups <= 0 || numgroups > 100000) numgroups = 100; srand(time(0)); buffer.clear(); for (wc = 1; wc <= numgroups; wc++) { for (cc = 0; cc < 5; cc++) { buffer += ccode[ rand() % cl ]; } if (wc % 10 == 0) buffer += '\n'; else buffer += ' '; } if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(buffer); PERFORM_CPS_TEST = false; return; } static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string fname = s.substr(i+10, endbracket - i - 10); if (fname.length() > 0 && !within_exec) { FILE *toadd = fl_fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.clear(); fclose(toadd); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); testfilename = fname; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(buffer); PERFORM_CPS_TEST = false; } else { string resp = "Could not locate "; resp.append(fname).append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); PERFORM_CPS_TEST = false; } } else { PERFORM_CPS_TEST = false; s.clear(); } } static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+12, endbracket - i - 12); std::string txtbuf = buffer; s.clear(); size_t p = buffer.find("\\n"); while (p != string::npos) { buffer.replace(p,2,"\n"); p = buffer.find("\\n"); } if (buffer.length()) { if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); testfilename = txtbuf; number_of_samples(buffer); PERFORM_CPS_TEST = false; } else { string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } static void pCOMMENT(std::string &s, size_t &i, size_t endbracket) { s.replace(i, endbracket - i + 1, ""); if (s[i] == '\n') i++; } static void pFILE(std::string &s, size_t &i, size_t endbracket) { std::string fname = s.substr(i+6, endbracket - i - 6); if (fname.length() > 0 && !within_exec) { FILE *toadd = fl_fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.replace(i, endbracket - i + 1, buffer); fclose(toadd); } else { LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); } } else s.replace(i, endbracket - i + 1, ""); } static void pTIMER(std::string &s, size_t &i, size_t endbracket) { int number; std::string sTime = s.substr(i+7, endbracket - i - 7); if (sTime.length() > 0 && !within_exec) { sscanf(sTime.c_str(), "%d", &number); progStatus.timer = number; progStatus.timerMacro = mNbr; } s.replace(i, endbracket - i + 1, ""); } static void pREPEAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progStatus.repeatMacro = mNbr; s.replace(i, endbracket - i + 1, ""); text2repeat = s; repeatchar = 0; s.insert(i, "[REPEAT]"); } static void pWPM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number; std::string snumber = s.substr(i+5, endbracket - i - 5); if (snumber.length() > 0) { // first value = WPM sscanf(snumber.c_str(), "%d", &number); if (number < 5) number = 5; if (number > 200) number = 200; progdefaults.CWspeed = number; sldrCWxmtWPM->value(number); // second value = Farnsworth WPM size_t pos; if ((pos = snumber.find(":")) != std::string::npos) { snumber.erase(0, pos+1); if (snumber.length()) sscanf(snumber.c_str(), "%d", &number); if (number < 15) number = 15; if (number > 200) number = 200; progdefaults.CWfarnsworth = number; sldrCWfarnsworth->value(number); } } s.replace(i, endbracket - i + 1, ""); } static void pRISETIME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWrisetime = number; cntCWrisetime->value(number); } s.replace(i, endbracket - i + 1, ""); } static void pPRE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWpre = number; cntPreTiming->value(number); } s.replace(i, endbracket - i + 1, ""); } static void pPOST(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < -20) number = -20; if (number > 20) number = 20; progdefaults.CWpost = number; cntPostTiming->value(number); } s.replace(i, endbracket - i + 1, ""); } static void setwpm(int d) { sldrCWxmtWPM->value(d); cntCW_WPM->value(d); que_ok = true; } static void setfwpm(int d) { sldrCWfarnsworth->value(d); progdefaults.CWusefarnsworth = true; btnCWusefarnsworth->value(1); que_ok = true; } static void doWPM(std::string s) { int number; std::string snumber = s.substr(6); if (snumber.length() > 0) { // first value = WPM sscanf(snumber.c_str(), "%d", &number); if (number < 5) number = 5; if (number > 200) number = 200; progdefaults.CWspeed = number; REQ(setwpm, number); // second value = Farnsworth WPM size_t pos; if ((pos = snumber.find(":")) != std::string::npos) { snumber.erase(0, pos+1); if (snumber.length()) sscanf(snumber.c_str(), "%d", &number); if (number < 15) number = 15; if (number > 200) number = 200; progdefaults.CWfarnsworth = number; REQ(setfwpm, number); } } } static void pTxQueWPM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doWPM }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } struct STRpush { string smode; int freq; STRpush() { smode = ""; freq = -1; } }; stack mf_stack; //static string mf_stack = ""; static void mMODEM(std::string s) { trx_mode m; s = ucasestr(s); for (m = 0; m < NUM_MODES; m++) if (s == ucasestr(mode_info[m].sname)) break; if (m == NUM_MODES) { return; } if (active_modem->get_mode() != mode_info[m].mode) init_modem_sync(mode_info[m].mode); } static void mFREQ(int f) { active_modem->set_freq(f); } static void doPOP(std::string s) { if (!mf_stack.empty()) { STRpush psh = mf_stack.top(); mf_stack.pop(); LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); if (psh.freq != -1) mFREQ(psh.freq); if (!psh.smode.empty()) mMODEM(psh.smode); } else LOG_INFO("%s", "stack empty"); que_ok = true; } static void pPOP(std::string &s, size_t &i, size_t endbracket) { if (!mf_stack.empty()) { STRpush psh = mf_stack.top(); mf_stack.pop(); LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); if (psh.freq != -1) mFREQ(psh.freq); if (!psh.smode.empty()) mMODEM(psh.smode); } else LOG_INFO("%s", "stack empty"); s.replace(i, endbracket - i + 1, ""); } static void pTxQuePOP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPOP }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQuePOP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPOP }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void doPUSHmode(std::string s) { STRpush psh; if (s[5] == '>') { psh.smode = mode_info[active_modem->get_mode()].sname; psh.freq = active_modem->get_freq(); } else { if (s[5] == ':') { if (s[6] == 'm' || s[7] == 'm') psh.smode = mode_info[active_modem->get_mode()].sname; if (s[6] == 'f' || s[7] == 'f') psh.freq = active_modem->get_freq(); } } LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); mf_stack.push(psh); que_ok = true; } static void pTxQuePUSH(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPUSHmode }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQuePUSH(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPUSHmode }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pPUSH(std::string &s, size_t &i, size_t endbracket) { STRpush psh; if (s[5] == '>') { psh.smode = mode_info[active_modem->get_mode()].sname; psh.freq = active_modem->get_freq(); } else { if (s[5] == ':') { if (s[6] == 'm' || s[7] == 'm') psh.smode = mode_info[active_modem->get_mode()].sname; if (s[6] == 'f' || s[7] == 'f') psh.freq = active_modem->get_freq(); } } LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); mf_stack.push(psh); s.replace(i, endbracket - i + 1, ""); return; } static void pDIGI(std::string &s, size_t &i, size_t endbracket) { s.replace(i, endbracket - i + 1, mode_info[active_modem->get_mode()].adif_name); } string macrochar = ""; static void doTxDIGI(std::string s) { macrochar = mode_info[active_modem->get_mode()].adif_name; que_ok = true; } static void pTxDIGI(std::string &s, size_t &i, size_t endbracket) { struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTxDIGI }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void doTxFREQ(std::string s) { macrochar = inpFreq->value(); que_ok = true; } static void pTxFREQ(std::string &s, size_t &i, size_t endbracket) { struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTxFREQ }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setRISETIME(int d) { cntCWrisetime->value(d); que_ok = true; } static void doRISETIME(std::string s) { float number; std::string sVal = s.substr(7, s.length() - 8); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWrisetime = number; REQ(setRISETIME, number); } } static void pTxQueRISETIME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRISETIME }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setPRE(int d) { cntPreTiming->value(d); que_ok = true; } static void doPRE(std::string s) { float number; std::string sVal = s.substr(6, s.length() - 7); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWpre = number; REQ(setPRE, number); } } static void pTxQuePRE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPRE }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setPOST(int d) { cntPostTiming->value(d); que_ok = true; } static void doPOST(std::string s) { float number; std::string sVal = s.substr(7, s.length() - 8); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < -20) number = -20; if (number > 20) number = 20; progdefaults.CWpost = number; REQ(setPOST, number); } } static void pTxQuePOST(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPOST }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setTXATTEN(float v) { int d = (int)(v * 10); v = d / 10.0; v = clamp(v, -30.0, 0.0); progdefaults.txlevel = v; cntTxLevel->value(progdefaults.txlevel);; que_ok = true; } static void pTXATTEN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+9, endbracket - i - 9); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); setTXATTEN(number); } s.replace(i, endbracket - i + 1, ""); } static void doTXATTEN(std::string s) { float number; std::string sVal = s.substr(10); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); REQ(setTXATTEN, number); } } static void pTxQueTXATTEN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTXATTEN }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pIDLE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); macro_idle_on = true; idleTime = number; } s.replace(i, endbracket - i + 1, ""); } static int idle_time = 0; // in 0.1 second increments static int idle_count = 0; static void doneIDLE(void *) { idle_count++; if ((idle_count % 100) == 0) REQ(postQueue, "|"); else if ((idle_count % 50) == 0) REQ(postQueue, ":"); else if ((idle_count % 10) == 0) REQ(postQueue, "."); if (idle_count == idle_time) { Qidle_time = 0; que_ok = true; idle_time = idle_count = 0; REQ(postQueue, " done\n"); return; } Fl::repeat_timeout(0.1, doneIDLE); } static void doIDLE(std::string s) { std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { float ftime; if (sscanf(sTime.c_str(), "%f", &ftime) != 1) ftime = 1.0; idle_time = 10 * ftime; Qidle_time = 1; Fl::add_timeout(0.1, doneIDLE); } else { Qidle_time = 0; } } static void pTxQueIDLE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doIDLE }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static bool useTune = false; static float tuneTime = 0; static void pTUNE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%d", &number); useTune = true; tuneTime = number; } s.replace(i, endbracket - i + 1, ""); } static void pQSONBR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } char szqsonbr[10]; snprintf(szqsonbr, sizeof(szqsonbr), "%d", qsodb.nbrRecs()); s.replace(i, endbracket - i + 1, szqsonbr); } static void pNXTNBR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } char szqsonbr[20]; snprintf(szqsonbr, sizeof(szqsonbr), "%d", qsodb.nbrRecs() + 1); s.replace(i, endbracket - i + 1, szqsonbr); } static void pNRSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number = 0; std::string sNumber = s.substr(i+7, endbracket - i - 7); if (sNumber.length() > 0) { sscanf(sNumber.c_str(), "%d", &number); progStatus.n_rsids = number; } s.replace(i, endbracket - i + 1, ""); } static bool useWait = false; static float waitTime = 0; static void pWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); useWait = true; waitTime = number; } s.replace(i, endbracket - i + 1, ""); } static void doneWAIT(void *) { Qwait_time = 0; start_tx(); que_ok = true; } static void doWAIT(std::string s) { float number; std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); Qwait_time = number; Fl::add_timeout (number, doneWAIT); } else Qwait_time = 0; } static void pTxQueWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doWAIT }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void doRxWAIT(std::string s) { float number = 0; std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); macro_rx_wait = true; Fl::add_timeout(number, rx_que_continue); } } static void pRxQueWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRxWAIT }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pINFO1(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, info1msg ); } static void pINFO2(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, info2msg ); } static void pCLRRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, "" ); trx_mode md = active_modem->get_mode(); if (md == MODE_IFKP) ifkp_rx_text->clear(); else if (md == MODE_FSQ) fsq_rx_text->clear(); else if ((md >= MODE_FELDHELL) && (md <= MODE_HELL80)) FHdisp->clear(); else ReceiveText->clear(); } static void pCLRTX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, "" ); queue_reset(); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); } static void pFOCUS(std::string &s, size_t &i, size_t endbracket) { if (!within_exec) { if (qsoFreqDisp->is_reversed_colors()) { qsoFreqDisp->restore_colors(); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->take_focus(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->take_focus (); else TransmitText->take_focus(); } else { qsoFreqDisp->take_focus(); qsoFreqDisp->reverse_colors(); } } s.replace( i, 7, "" ); } static void pQSYPLUS(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int rf = 0; float rfd = 0; std::string sIncrFreq = s.substr(i+6, endbracket - i - 6); // no frequency(s) specified if (sIncrFreq.length() == 0) { s.replace(i, endbracket-i+1, ""); return; } // rf first value sscanf(sIncrFreq.c_str(), "%f", &rfd); if (rfd != 0) { rf = wf->rfcarrier() + (int)(1000*rfd); qsy(rf, active_modem ? active_modem->get_freq() : 1500); } s.replace(i, endbracket - i + 1, ""); } static void pCALL(std::string &s, size_t &i, size_t endbracket) { string call = inpCall->value(); if (active_modem->get_mode() == MODE_IFKP && progdefaults.ifkp_lowercase_call) for (size_t n = 0; n < call.length(); n++) call[n] = tolower(call[n]); s.replace( i, 6, call ); } static void pGET(std::string &s, size_t &i, size_t endbracket) { s.erase( i, 9 ); GET = true; } static void pFREQ(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inpFreq->value() ); } static void pBAND(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, band_name( band( wf->rfcarrier() ) ) ); } static void pLOC(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, inpLoc->value() ); } static void pMODE(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, active_modem->get_mode_name()); } static void pNAME(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inpName->value() ); } static void pQTH(std::string &s, size_t &i, size_t endbracket) { s.replace( i,5, inpQth->value() ); } static void pST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 4, inpState->value() ); } static void pPR(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 4, inpVEprov->value() ); } static void pQSOTIME(std::string &s, size_t &i, size_t endbracket) { qso_time = inpTimeOff->value(); s.replace( i, 9, qso_time.c_str() ); } static void pRST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, cut_string(inpRstOut->value())); } static void pMYCALL(std::string &s, size_t &i, size_t endbracket) { string call = inpMyCallsign->value(); if (active_modem->get_mode() == MODE_IFKP && progdefaults.ifkp_lowercase) for (size_t n = 0; n < call.length(); n++) call[n] = tolower(call[n]); s.replace( i, 8, call ); } static void pMYLOC(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpMyLocator->value() ); } static void pMYNAME(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, inpMyName->value() ); } static void pMYQTH(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpMyQth->value() ); } static void pMYRST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpRstIn->value() ); } static void pANTENNA(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, progdefaults.myAntenna.c_str() ); } static void pMYCLASS(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, progdefaults.my_FD_class.c_str() ); } static void pMYSECTION(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 11, progdefaults.my_FD_section.c_str() ); } static void pMYSTATE(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, listbox_states->value() ); } static void pMYST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inp_QP_state_short->value() ); } static void pMYCOUNTY(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 10, listbox_counties->value() ); } static void pMYCNTY(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, inp_QP_short_county->value() ); } static void pLDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%x %H:%M %Z"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 4) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pILDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d %H:%M%z"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 5) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pZDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%x %H:%MZ"; std::string timefmt = s.substr(i, endbracket - i); size_t p = timefmt.find(":"); if (p == 4) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pIZDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d %H:%MZ"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 5) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pLT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%H%ML"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pZT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%H%MZ"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pLD(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d"; std::string timefmt = s.substr(i, endbracket - i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pZD(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d"; std::string timefmt = s.substr(i, endbracket - i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void p_ID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progdefaults.macroid = true; s.replace( i, 4, ""); } static void pTEXT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progdefaults.macrotextid = true; s.replace( i, 6, ""); } static void pCWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progdefaults.macroCWid = true; s.replace( i, 6, ""); } static void doDTMF(std::string s) { progdefaults.DTMFstr = s.substr(6, s.length() - 8); que_ok = true; } static void pDTMF(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } CMDS cmd = {s.substr(i, endbracket - i + 1), doDTMF}; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pALERT(std::string &s, size_t &i, size_t endbracket) { if (trx_state != STATE_RX) { s.replace(i, endbracket - i + 1, ""); return; } if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string cmd = s.substr(i+7, endbracket - i - 7); if (audio_alert) try { audio_alert->alert(cmd); } catch (...) { } s.replace(i, endbracket - i + 1, ""); } static void pPAUSE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace (i, 7, "^p"); } static void pRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace (i, 4, "^r"); } static void pTX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, 4); if (rx_only) TransmitON = false; else TransmitON = true; } static void pTXRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, 7); if (rx_only) ToggleTXRX = false; else ToggleTXRX = true; } /* static std::string hexstr(std::string &s) { static std::string hex; static char val[3]; hex.clear(); for (size_t i = 0; i < s.length(); i++) { snprintf(val, sizeof(val), "%02x", s[i] & 0xFF); hex.append("<").append(val).append(">"); } return hex; } */ static void doRIGCAT(std::string s) { size_t start = s.find(':'); std::string buff; LOG_INFO("!RIGCAT %s", s.substr(start + 1, s.length() - start + 1).c_str()); size_t val = 0; int retnbr = 0; char c, ch; bool asciisw = false; bool valsw = false; for (size_t j = start+1 ; j <= s.length() ; j++) { ch = s[j]; if (ch == '\"') { asciisw = !asciisw; continue; } // accumulate ascii string if (asciisw) { if (isprint(ch)) buff += ch; continue; } // following digits is expected size of CAT response from xcvr if (ch == ':' && s[j+1] != '>') { sscanf(&s[j+1], "%d", &retnbr); } // accumulate hex string values if ((ch == ' ' || ch == '>' || ch == ':') && valsw) { c = char(val); // LOG_INFO("c=%02x, val=%d", c, val); buff += c; val = 0; valsw = false; } else { val *= 16; ch = toupper(ch); if (isdigit(ch)) val += ch - '0'; else if (ch >= 'A' && ch <= 'F') val += ch - 'A' + 10; valsw = true; } if (ch == ':') break; } add_to_cmdque("RIGCAT macro", buff, retnbr, progdefaults.RigCatWait); que_ok = true; } static void pTxQueRIGCAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGCAT }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueRIGCAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGCAT }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pRIGCAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } LOG_INFO("cat cmd:retnbr %s", s.substr(i, endbracket - i + 1).c_str()); size_t start = s.find(':', i); std::basic_string buff; size_t val = 0; int retnbr = 0; char c, ch; bool asciisw = false; bool valsw = false; for (size_t j = start+1 ; j <= endbracket ; j++) { ch = s[j]; if (ch == '\"') { asciisw = !asciisw; continue; } // accumulate ascii string if (asciisw) { if (isprint(ch)) buff += ch; continue; } // following digits is expected size of CAT response from xcvr if (ch == ':' && s[j+1] != '>') { sscanf(&s[j+1], "%d", &retnbr); } // accumulate hex string values if ((ch == ' ' || ch == '>' || ch == ':') && valsw) { c = char(val); // LOG_INFO("c=%02x, val=%d", c, val); buff += c; val = 0; valsw = false; } else { val *= 16; ch = toupper(ch); if (isdigit(ch)) val += ch - '0'; else if (ch >= 'A' && ch <= 'F') val += ch - 'A' + 10; valsw = true; } if (ch == ':') break; } add_to_cmdque( "RIGCAT macro", buff, retnbr, progdefaults.RigCatWait); s.replace(i, endbracket - i + 1, ""); } static void doFLRIG(std::string s) { size_t start = s.find(':'); std::string cmd = s.substr(start + 1, s.length() - start + 1); LOG_INFO("!FLRIG %s", cmd.c_str()); xmlrpc_send_command(cmd); que_ok = true; } static void pTxQueFLRIG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFLRIG }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueFLRIG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFLRIG }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pFLRIG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } LOG_INFO("flrig CAT cmd: %s", s.substr(i, endbracket - i + 1).c_str()); size_t start = s.find(':'); std::string cmd = s.substr(start + 1, s.length() - start - 2); xmlrpc_send_command(cmd); s.replace(i, endbracket - i + 1, ""); } static void doVIDEO(string s) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { return; } size_t start = s.find(':') + 1; size_t end = s.find('>'); active_modem->macro_video_text = s.substr(start, end - start); que_ok = true; } static void pVIDEO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doVIDEO }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pVER(std::string &s, size_t &i, size_t endbracket) { std::string progname; progname = "Fldigi "; progname.append(PACKAGE_VERSION); s.replace( i, 5, progname ); } static void pSERNO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int contestval; contestval = atoi(outSerNo->value()); if (contestval) { char serstr[10]; contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(serstr, sizeof(serstr), contest_count.fmt.c_str(), contestval); s.replace (i, 7, cut_string(serstr)); } else s.replace (i, 7, ""); } static void pLASTNO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int contestval; contestval = atoi(outSerNo->value()) - 1; if (contestval) { char serstr[10]; contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(serstr, sizeof(serstr), contest_count.fmt.c_str(), contestval); s.replace (i, 8, cut_string(serstr)); } else s.replace (i, 8, ""); } static void pCNTR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int contestval; contestval = contest_count.count; if (contestval) { contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(contest_count.szCount, sizeof(contest_count.szCount), contest_count.fmt.c_str(), contestval); s.replace (i, 6, cut_string(contest_count.szCount)); } else s.replace (i, 6, ""); } static void pDECR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } contest_count.count--; if (contest_count.count < 0) contest_count.count = 0; s.replace (i, 6, ""); updateOutSerNo(); } static void pINCR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } contest_count.count++; s.replace (i, 6, ""); updateOutSerNo(); } static void pXIN(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, inpXchgIn->value() ); } static void pXOUT(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, cut_string(progdefaults.myXchg.c_str())); } static void pXBEG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 6, ""); xbeg = i; } static void pXEND(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 6, ""); xend = i; } static void pSAVEXCHG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } save_xchg = true; s.replace( i, 10, ""); } static void pFD_CLASS(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, inpClass->value() ); } static void pFD_SECTION(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, inpSection->value() ); } static void pCLASS(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpClass->value() ); } static void pSECTION(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, inpSection->value() ); } static void pLOG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(':', i); if (start != std::string::npos) { string msg = inpNotes->value(); if (!msg.empty()) msg.append("\n"); msg.append(s.substr(start + 1, endbracket-start-1)); inpNotes->value(msg.c_str()); } s.replace(i, endbracket - i + 1, ""); qsoSave_cb(0, 0); } static void pLNW(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(':', i); if (start != std::string::npos) { string msg = inpNotes->value(); if (!msg.empty()) msg.append("\n"); msg.append(s.substr(start + 1, endbracket-start-1)); inpNotes->value(msg.c_str()); } s.replace(i, endbracket - i + 1, "^L"); } static void pCLRLOG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace(i, 10, "^C"); } static void pMODEM_compSKED(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t j, k, len = s.length(); std::string name; if ((j = s.find('>', i)) == std::string::npos) return; while (++j < len) if (!isspace(s[j])) break; k = j; while (++k < len) if (isspace(s[k]) || s[k] == '<') break; name = ucasestr(s.substr(j, k - j)); for (int m = 0; m < NUM_MODES; m++) { if (name == ucasestr(mode_info[m].sname)) { if (active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); break; } } s.erase(i, k-i); } static void doIMAGE(std::string s) { if (s.length() > 0) { bool Greyscale = false; size_t p = string::npos; string fname = s.substr(7); p = fname.find(">"); fname.erase(p); p = fname.find("G,"); if (p == string::npos) p = fname.find("g,"); if (p != string::npos) { Greyscale = true; fname.erase(p,2); } while (fname[0] == ' ') fname.erase(0,1); trx_mode active_mode = active_modem->get_mode(); if ((active_mode == MODE_MFSK16 || active_mode == MODE_MFSK32 || active_mode == MODE_MFSK64 || active_mode == MODE_MFSK128) && active_modem->get_cap() & modem::CAP_IMG) { Greyscale ? active_modem->send_Grey_image(fname) : active_modem->send_color_image(fname); } else if (active_mode >= MODE_THOR_FIRST && active_mode <= MODE_THOR_LAST) { thor_load_scaled_image(fname, Greyscale); } else if (active_mode == MODE_IFKP) { ifkp_load_scaled_image(fname, Greyscale); } } que_ok = true; } static void pTxQueIMAGE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } string Tx_cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { Tx_cmdstr, doIMAGE }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void doINSERTIMAGE(std::string s) { if (s.length() > 0) { bool Greyscale = false; size_t p = string::npos; string fname = s.substr(7); p = fname.find(">"); fname.erase(p); p = fname.find("G,"); if (p == string::npos) p = fname.find("g,"); if (p != string::npos) { Greyscale = true; fname.erase(p,2); } while (fname[0] == ' ') fname.erase(0,1); if (s.empty()) return; trx_mode md = active_modem->get_mode(); if ((md == MODE_MFSK16 || md == MODE_MFSK32 || md == MODE_MFSK64 || md == MODE_MFSK128) && active_modem->get_cap() & modem::CAP_IMG) { Greyscale ? active_modem->send_Grey_image(fname) : active_modem->send_color_image(fname); } else if (md == MODE_IFKP) ifkp_load_scaled_image(fname, Greyscale); else if (md >= MODE_THOR_FIRST && md <= MODE_THOR_LAST) thor_load_scaled_image(fname, Greyscale); } que_ok = true; } void TxQueINSERTIMAGE(std::string s) { trx_mode active_mode = active_modem->get_mode(); if (! (active_mode == MODE_MFSK16 || active_mode == MODE_MFSK32 || active_mode == MODE_MFSK64 || active_mode == MODE_MFSK128 || active_mode == MODE_IFKP || (active_mode >= MODE_THOR_FIRST && active_mode <= MODE_THOR_LAST) ) && active_modem->get_cap() & modem::CAP_IMG) return; string scmd = ""; scmd.insert(7,s); struct CMDS cmd = { scmd, doINSERTIMAGE }; push_txcmd(cmd); string itext = s; size_t p = itext.rfind("\\"); if (p == string::npos) p = itext.rfind("/"); if (p != string::npos) itext.erase(0, p+1); p = itext.rfind("."); if (p != string::npos) itext.erase(p); itext.insert(0, "\nImage: "); itext.append(" ^!"); if (active_mode == MODE_IFKP) ifkp_tx_text->add_text(itext); else if (active_mode == MODE_FSQ) fsq_tx_text->add_text(itext); else TransmitText->add_text(itext); } static void doAVATAR(std::string s) { if (active_modem->get_mode() == MODE_IFKP) active_modem->m_ifkp_send_avatar(); que_ok = true; } static void pTxQueAVATAR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doAVATAR }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void doMODEM(std::string s) { static fre_t re("", REG_EXTENDED); std::string tomatch = s; for (int i = 2; i < 7; i++) s[i] = toupper(s[i]); if (!re.match(tomatch.c_str())) { que_ok = true; return; } const std::vector& o = re.suboff(); std::string name = ucasestr(tomatch.substr(o[1].rm_so, o[1].rm_eo - o[1].rm_so)); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (name == ucasestr(mode_info[m].sname)) break; // do we have arguments and a valid modem? if (o.size() == 2 || m == NUM_MODES) { que_ok = true; return; } // parse arguments vector args; args.reserve(8); char* end; double d; for (const char* p = s.c_str() + o[2].rm_so + 1; *p; p++) { errno = 0; d = strtod(p, &end); if (!errno && p != end) { args.push_back(d); p = end; } else // push an invalid value args.push_back(DBL_MIN); } try { switch (m) { case MODE_RTTY: // carrier shift, baud rate, bits per char if (args.at(0) != DBL_MIN) set_rtty_shift((int)args[0]); if (args.at(1) != DBL_MIN) set_rtty_baud((float)args[1]); if (args.at(2) != DBL_MIN) set_rtty_bits((int)args[2]); break; case MODE_CONTESTIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; switch (tones) { case 4 : if (bw == 125) m = MODE_CONTESTIA_4_125; if (bw == 250) m = MODE_CONTESTIA_4_250; if (bw == 500) m = MODE_CONTESTIA_4_500; if (bw == 1000) m = MODE_CONTESTIA_4_1000; if (bw == 2000) m = MODE_CONTESTIA_4_2000; break; case 8 : if (bw == 125) m = MODE_CONTESTIA_8_125; if (bw == 250) m = MODE_CONTESTIA_8_250; if (bw == 500) m = MODE_CONTESTIA_8_500; if (bw == 1000) m = MODE_CONTESTIA_8_1000; if (bw == 2000) m = MODE_CONTESTIA_8_2000; break; case 16 : if (bw == 500) m = MODE_CONTESTIA_16_500; if (bw == 1000) m = MODE_CONTESTIA_16_1000; if (bw == 2000) m = MODE_CONTESTIA_16_2000; break; case 32 : if (bw == 1000) m = MODE_CONTESTIA_32_1000; if (bw == 2000) m = MODE_CONTESTIA_32_2000; break; case 64 : if (bw == 500) m = MODE_CONTESTIA_64_500; if (bw == 1000) m = MODE_CONTESTIA_64_1000; if (bw == 2000) m = MODE_CONTESTIA_64_2000; break; default : set_contestia_bw(bw); set_contestia_tones(tones); } } break; case MODE_OLIVIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; switch (tones) { case 4 : if (bw == 125) m = MODE_OLIVIA_4_125; if (bw == 250) m = MODE_OLIVIA_4_250; if (bw == 500) m = MODE_OLIVIA_4_500; if (bw == 1000) m = MODE_OLIVIA_4_1000; if (bw == 2000) m = MODE_OLIVIA_4_2000; break; case 8 : if (bw == 125) m = MODE_OLIVIA_8_125; if (bw == 250) m = MODE_OLIVIA_8_250; if (bw == 500) m = MODE_OLIVIA_8_500; if (bw == 1000) m = MODE_OLIVIA_8_1000; if (bw == 2000) m = MODE_OLIVIA_8_2000; break; case 16 : if (bw == 500) m = MODE_OLIVIA_16_500; if (bw == 1000) m = MODE_OLIVIA_16_1000; if (bw == 2000) m = MODE_OLIVIA_16_2000; break; case 32 : if (bw == 1000) m = MODE_OLIVIA_32_1000; if (bw == 2000) m = MODE_OLIVIA_32_2000; break; case 64 : if (bw == 500) m = MODE_OLIVIA_64_500; if (bw == 1000) m = MODE_OLIVIA_64_1000; if (bw == 2000) m = MODE_OLIVIA_64_2000; break; default : set_olivia_bw(bw); set_olivia_tones(tones); } } break; default: break; } } catch (const exception& e) { } if (active_modem->get_mode() != mode_info[m].mode) { init_modem_sync(mode_info[m].mode); } que_ok = true; } static void pTxQueMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } string Tx_cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { Tx_cmdstr, doMODEM }; if (Tx_cmdstr.find("SSB") != string::npos || Tx_cmdstr.find("ANALYSIS") != string::npos) { LOG_ERROR("Disallowed: %s", Tx_cmdstr.c_str()); size_t nextbracket = s.find('<', endbracket); if (nextbracket != string::npos) s.erase(i, nextbracket - i - 1); else s.clear(); } else { push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } } static void pRxQueMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } string rx_cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { rx_cmdstr, doMODEM }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } static fre_t re("", REG_EXTENDED); std::string testmode = s.substr(i, endbracket - i + 1); for (int i = 2; i < 7; i++) testmode[i] = toupper(testmode[i]); std::string name = testmode; name.erase(0,7); name.erase(name.length() - 1); name = ucasestr(name); // test for exact match on mode name (ignore case) for (trx_mode m = 0; m < NUM_MODES; m++) { if (name == ucasestr(mode_info[m].sname)) { init_modem(mode_info[m].mode); s.erase(i, endbracket - i + 1); int count = 500; while ((active_modem->get_mode() != mode_info[m].mode) && --count) MilliSleep(10); return; } } if (!re.match(testmode.c_str())) { s.erase(i, endbracket - i + 1); return; } const std::vector& o = re.suboff(); name = ucasestr(testmode.substr(o[1].rm_so, o[1].rm_eo - o[1].rm_so)); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (name == ucasestr(mode_info[m].sname)) break; // do we have arguments and a valid modem? if (o.size() == 2 || m == NUM_MODES) { if (m < NUM_MODES && active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); s.erase(i, o[0].rm_eo - i); int count = 500; while ((active_modem->get_mode() != mode_info[m].mode) && --count) MilliSleep(10); return; } // parse arguments vector args; args.reserve(8); char* end; double d; for (const char* p = testmode.c_str() + o[2].rm_so + 1; *p; p++) { errno = 0; d = strtod(p, &end); if (!errno && p != end) { args.push_back(d); p = end; } else // push an invalid value args.push_back(DBL_MIN); } try { switch (m) { case MODE_RTTY: // carrier shift, baud rate, bits per char if (args.at(0) != DBL_MIN) set_rtty_shift((int)args[0]); if (args.at(1) != DBL_MIN) set_rtty_baud((float)args[1]); if (args.at(2) != DBL_MIN) set_rtty_bits((int)args[2]); break; case MODE_CONTESTIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; switch (tones) { case 4 : if (bw == 125) m = MODE_CONTESTIA_4_125; if (bw == 250) m = MODE_CONTESTIA_4_250; if (bw == 500) m = MODE_CONTESTIA_4_500; if (bw == 1000) m = MODE_CONTESTIA_4_1000; if (bw == 2000) m = MODE_CONTESTIA_4_2000; break; case 8 : if (bw == 125) m = MODE_CONTESTIA_8_125; if (bw == 250) m = MODE_CONTESTIA_8_250; if (bw == 500) m = MODE_CONTESTIA_8_500; if (bw == 1000) m = MODE_CONTESTIA_8_1000; if (bw == 2000) m = MODE_CONTESTIA_8_2000; break; case 16 : if (bw == 500) m = MODE_CONTESTIA_16_500; if (bw == 1000) m = MODE_CONTESTIA_16_1000; if (bw == 2000) m = MODE_CONTESTIA_16_2000; break; case 32 : if (bw == 1000) m = MODE_CONTESTIA_32_1000; if (bw == 2000) m = MODE_CONTESTIA_32_2000; break; case 64 : if (bw == 500) m = MODE_CONTESTIA_64_500; if (bw == 1000) m = MODE_CONTESTIA_64_1000; if (bw == 2000) m = MODE_CONTESTIA_64_2000; break; default : set_contestia_bw(bw); set_contestia_tones(tones); } } break; case MODE_OLIVIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; switch (tones) { case 4 : if (bw == 125) m = MODE_OLIVIA_4_125; if (bw == 250) m = MODE_OLIVIA_4_250; if (bw == 500) m = MODE_OLIVIA_4_500; if (bw == 1000) m = MODE_OLIVIA_4_1000; if (bw == 2000) m = MODE_OLIVIA_4_2000; break; case 8 : if (bw == 125) m = MODE_OLIVIA_8_125; if (bw == 250) m = MODE_OLIVIA_8_250; if (bw == 500) m = MODE_OLIVIA_8_500; if (bw == 1000) m = MODE_OLIVIA_8_1000; if (bw == 2000) m = MODE_OLIVIA_8_2000; break; case 16 : if (bw == 500) m = MODE_OLIVIA_16_500; if (bw == 1000) m = MODE_OLIVIA_16_1000; if (bw == 2000) m = MODE_OLIVIA_16_2000; break; case 32 : if (bw == 1000) m = MODE_OLIVIA_32_1000; if (bw == 2000) m = MODE_OLIVIA_32_2000; break; case 64 : if (bw == 500) m = MODE_OLIVIA_64_500; if (bw == 1000) m = MODE_OLIVIA_64_1000; if (bw == 2000) m = MODE_OLIVIA_64_2000; break; default : set_olivia_bw(bw); set_olivia_tones(tones); } } break; default: break; } } catch (const exception& e) { } if (active_modem->get_mode() != mode_info[m].mode) { init_modem(mode_info[m].mode); int count = 500; while ((active_modem->get_mode() != mode_info[m].mode) && --count) MilliSleep(10); } s.replace(i, endbracket - i + 1, ""); } static void pAFC(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnAFC->value(1); else if (sVal.compare(0,3,"off") == 0) btnAFC->value(0); else if (sVal.compare(0,1,"t") == 0) btnAFC->value(!btnAFC->value()); btnAFC->do_callback(); } s.replace(i, endbracket - i + 1, ""); } static void pREV(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) wf->btnRev->value(1); else if (sVal.compare(0,3,"off") == 0) wf->btnRev->value(0); else if (sVal.compare(0,1,"t") == 0) wf->btnRev->value(!wf->btnRev->value()); wf->btnRev->do_callback(); } s.replace(i, endbracket - i + 1, ""); } // static void pHS(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+4, endbracket - i - 4); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) bHighSpeed = 1; else if (sVal.compare(0,3,"off") == 0) bHighSpeed = 0; else if (sVal.compare(0,1,"t") == 0) bHighSpeed = !bHighSpeed; } s.replace(i, endbracket - i + 1, ""); } static void pLOCK(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) wf->xmtlock->value(1); else if (sVal.compare(0,3,"off") == 0) wf->xmtlock->value(0); else if (sVal.compare(0,1,"t") == 0) wf->xmtlock->value(!wf->xmtlock->value()); wf->xmtlock->damage(); wf->xmtlock->do_callback(); } s.replace(i, endbracket - i + 1, ""); } static void pTX_RSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+8, endbracket - i - 8); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnTxRSID->value(1); else if (sVal.compare(0,3,"off") == 0) btnTxRSID->value(0); else if (sVal.compare(0,1,"t") == 0) btnTxRSID->value(!btnTxRSID->value()); btnTxRSID->do_callback(); } s.replace(i, endbracket - i + 1, ""); } static void doTXRSID(std::string s) { if (s.find("on") != std::string::npos) { btnTxRSID->value(1); btnTxRSID->do_callback(); } else if (s.find("off") != std::string::npos) { btnTxRSID->value(0); btnTxRSID->do_callback(); } else if (s.find("t") != std::string::npos) { btnTxRSID->value(!btnTxRSID->value()); btnTxRSID->do_callback(); } que_ok = true; } static void pRxQueTXRSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTXRSID }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pRX_RSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+8, endbracket - i - 8); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnRSID->value(1); else if (sVal.compare(0,3,"off") == 0) btnRSID->value(0); else if (sVal.compare(0,1,"t") == 0) btnRSID->value(!btnRSID->value()); btnRSID->do_callback(); } s.replace(i, endbracket - i + 1, ""); } static void pCSV(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off [ON, OFF] if (sVal.compare(0,2,"on") == 0) set_CSV(1); else if (sVal.compare(0,3,"off") == 0) set_CSV(0); else if (sVal.compare(0,1,"t") == 0) set_CSV(2); } s.replace(i, endbracket - i + 1, ""); } #ifdef __WIN32__ static void pTALK(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { // sVal = on|off [ON, OFF] if (sVal.compare(0,2,"on") == 0) open_talker(); else if (sVal.compare(0,3,"off") == 0) close_talker(); else if (sVal.compare(0,1,"t") == 0) toggle_talker(); } s.replace(i, endbracket - i + 1, ""); } #endif static void pSRCHUP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 8, ""); active_modem->searchUp(); if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } static void pSRCHDN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 8, ""); active_modem->searchDown(); if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } static void pGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 8, ""); if (active_modem == cw_modem) active_modem->set_freq(progdefaults.CWsweetspot); else if (active_modem == rtty_modem) active_modem->set_freq(progdefaults.RTTYsweetspot); else active_modem->set_freq(progdefaults.PSKsweetspot); } static void doGOHOME(std::string s) { if (active_modem == cw_modem) active_modem->set_freq(progdefaults.CWsweetspot); else if (active_modem == rtty_modem) active_modem->set_freq(progdefaults.RTTYsweetspot); else active_modem->set_freq(progdefaults.PSKsweetspot); que_ok = true; } static void pTxQueGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOHOME }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOHOME }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number; std::string sGoFreq = s.substr(i+8, endbracket - i - 8); if (sGoFreq.length() > 0) { sscanf(sGoFreq.c_str(), "%d", &number); if (number < progdefaults.LowFreqCutoff) number = progdefaults.LowFreqCutoff; if (number > progdefaults.HighFreqCutoff) number = progdefaults.HighFreqCutoff; active_modem->set_freq(number); } s.replace(i, endbracket - i + 1, ""); } static void doGOFREQ(std::string s) { int number; std::string sGoFreq = s.substr(9, s.length() - 10); if (sGoFreq.length() > 0) { sscanf(sGoFreq.c_str(), "%d", &number); if (number < progdefaults.LowFreqCutoff) number = progdefaults.LowFreqCutoff; if (number > progdefaults.HighFreqCutoff) number = progdefaults.HighFreqCutoff; active_modem->set_freq(number); } que_ok = true; } static void pTxQueGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOFREQ }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOFREQ }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pQRG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string prefix = "\n"; prefix.append(s.substr(i+5, endbracket - i - 5)); if (prefix.length()) note_qrg ( false, prefix.c_str(), "\n" ); s.replace(i, endbracket - i + 1, ""); } static void pQSYTO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, ""); do_qsy(true); } static void pQSYFM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, ""); do_qsy(false); } struct rfafmd { int rf; int af; std::string mdname; rfafmd(int a, int b, std::string nm) { rf = a; af = b; mdname = nm;} rfafmd(int a, int b) {rf = a; af = b; mdname = active_modem->get_mode_name();} rfafmd(){rf = af = 0; mdname = active_modem->get_mode_name();} }; static queue fpairs; static void pQSY(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string mdname = active_modem->get_mode_name(); int rf = 0; int af = 0; float rfd = 0; std::string sGoFreq = s.substr(i+5, endbracket - i - 5); // no frequency(s) specified if (sGoFreq.length() == 0) { s.replace(i, endbracket-i+1, ""); return; } if (fpairs.empty()) { std::string triad; size_t pos; while (!sGoFreq.empty()) { pos = sGoFreq.find(";"); if (pos == std::string::npos) triad = sGoFreq; else triad = sGoFreq.substr(0, pos); sGoFreq.erase(0, triad.length()+1); sscanf(triad.c_str(), "%f", &rfd); if (rfd > 0) rf = (int)(1000*rfd); if ((pos = triad.find(":")) != std::string::npos) { triad.erase(0,pos+1); if (triad.length()) sscanf(triad.c_str(), "%d", &af); if (af < 0) af = 0; if (af < progdefaults.LowFreqCutoff) af = progdefaults.LowFreqCutoff; if (af > progdefaults.HighFreqCutoff) af = progdefaults.HighFreqCutoff; } else af = active_modem->get_freq(); if ((pos = triad.find(":")) != std::string::npos) { triad.erase(0, pos+1); strtrim(triad); fpairs.push(rfafmd(rf, af, triad)); } else fpairs.push(rfafmd(rf,af, mdname)); } } struct rfafmd fpair; fpair = fpairs.front(); rf = fpair.rf; af = fpair.af; if (fpair.mdname != mdname) { for (int m = 0; m < NUM_MODES; m++) { if (fpair.mdname == mode_info[m].sname) { init_modem_sync(mode_info[m].mode); break; } } } fpairs.pop(); if (rf && rf != wf->rfcarrier()) qsy(rf, af); else active_modem->set_freq(af); s.replace(i, endbracket - i + 1, ""); } static void doQSY(std::string s) { int rf = 0; int audio = 0; float rfd = 0; std::string sGoFreq; sGoFreq = s.substr(6, s.length() - 7); // no frequency(s) specified if (sGoFreq.length() == 0) { que_ok = true; return; } // rf first value sscanf(sGoFreq.c_str(), "%f", &rfd); if (rfd > 0) rf = (int)(1000*rfd); size_t pos; if ((pos = sGoFreq.find(":")) != std::string::npos) { // af second value sGoFreq.erase(0, pos+1); if (sGoFreq.length()) sscanf(sGoFreq.c_str(), "%d", &audio); if (audio < 0) audio = 0; if (audio < progdefaults.LowFreqCutoff) audio = progdefaults.LowFreqCutoff; if (audio > progdefaults.HighFreqCutoff) audio = progdefaults.HighFreqCutoff; } if (rf && rf != wf->rfcarrier()) qsy(rf, audio); else active_modem->set_freq(audio); que_ok = true; } static void pTxQueQSY(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doQSY }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } float wait_after_mode_change = 0.0; static string sFILWID; static void delayedFILWID(void *) { qso_opBW->value(sFILWID.c_str()); cb_qso_opBW(); wait_after_mode_change = 0.0; } static void pFILWID(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sWidth = s.substr(i+8, endbracket - i - 8); sFILWID = sWidth; Fl::add_timeout(wait_after_mode_change, delayedFILWID); s.replace(i, endbracket - i + 1, ""); } static void doFILWID(std::string s) { std::string sWID = s.substr(9, s.length() - 10); qso_opBW->value(sWID.c_str()); cb_qso_opBW(); que_ok = true; } static void pTxQueFILWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueFILWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pRIGMODE(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sMode = s.substr(i+9, endbracket - i - 9); qso_opMODE->value(sMode.c_str()); cb_qso_opMODE(); s.replace(i, endbracket - i + 1, ""); if ((s.find("FILWID") != string::npos) || (s.find("RIGLO") != string::npos) || (s.find("RIGHI") != string::npos) ) wait_after_mode_change = progdefaults.mbw; else wait_after_mode_change = 0; } static void doRIGMODE(std::string s) { std::string sMode = s.substr(10, s.length() - 11); qso_opMODE->value(sMode.c_str()); cb_qso_opMODE(); que_ok = true; } static void pTxQueRIGMODE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGMODE }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueRIGMODE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGMODE }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static string sRIGLO; static void delayedRIGLO(void *) { qso_opBW2->value(sRIGLO.c_str()); cb_qso_opBW2(); wait_after_mode_change = 0.0; } static void pRIGLO(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sLO = s.substr(i+7, endbracket - i - 7); sRIGLO = sLO; if (wait_after_mode_change) Fl::add_timeout(wait_after_mode_change, delayedRIGLO); else { qso_opBW2->value(sLO.c_str()); cb_qso_opBW2(); } s.replace(i, endbracket - i + 1, ""); } static void doRIGLO(std::string s) { std::string sLO = s.substr(8, s.length() - 9); qso_opBW2->value(sLO.c_str()); cb_qso_opBW2(); que_ok = true; } static void pTxQueRIGLO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGLO }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueRIGLO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGLO }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static string sRIGHI; static void delayedRIGHI(void *) { qso_opBW1->value(sRIGHI.c_str()); cb_qso_opBW1(); wait_after_mode_change = 0.0; } static void pRIGHI(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sHI = s.substr(i+7, endbracket - i - 7); sRIGHI = sHI; if (wait_after_mode_change) Fl::add_timeout(wait_after_mode_change, delayedRIGHI); else { qso_opBW1->value(sHI.c_str()); cb_qso_opBW1(); } s.replace(i, endbracket - i + 1, ""); } static void doRIGHI(std::string s) { std::string sHI = s.substr(8, s.length() - 9); qso_opBW1->value(sHI.c_str()); cb_qso_opBW1(); que_ok = true; } static void pTxQueRIGHI(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGHI }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRxQueRIGHI(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGHI }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } static void pWX(std::string &s, size_t &i, size_t endbracket) { string wx; getwx(wx); s.replace(i, 4, wx); } // static void pWX2(std::string &s, size_t &i, size_t endbracket) { string wx; getwx(wx, s.substr(i+4, endbracket - i - 4).c_str()); s.replace(i, endbracket - i + 1, wx); } void set_macro_env(void) { enum { #ifndef __WOE32__ pSKEDH, FLDIGI_RX_IPC_KEY, FLDIGI_TX_IPC_KEY, #endif FLDIGI_XMLRPC_ADDRESS, FLDIGI_XMLRPC_PORT, FLDIGI_ARQ_ADDRESS, FLDIGI_ARQ_PORT, FLDIGI_VERSION_ENVVAR, FLDIGI_PID, FLDIGI_CONFIG_DIR, FLDIGI_MY_CALL, FLDIGI_MY_NAME, FLDIGI_MY_LOCATOR, FLDIGI_MODEM, FLDIGI_MODEM_LONG_NAME, FLDIGI_MODEM_ADIF_NAME, FLDIGI_DIAL_FREQUENCY, FLDIGI_AUDIO_FREQUENCY, FLDIGI_FREQUENCY, FLDIGI_MACRO_FILE, FLDIGI_LOG_FILE, FLDIGI_LOG_FREQUENCY, FLDIGI_LOG_DATE, FLDIGI_LOG_DATE_OFF, FLDIGI_LOG_TIME_ON, FLDIGI_LOG_TIME_OFF, FLDIGI_LOG_CALL, FLDIGI_LOG_NAME, FLDIGI_LOG_RST_IN, FLDIGI_LOG_RST_OUT, FLDIGI_LOG_QTH, FLDIGI_LOG_LOCATOR, FLDIGI_LOG_NOTES, FLDIGI_LOG_STATE, FLDIGI_LOG_COUNTRY, FLDIGI_LOG_COUNTY, FLDIGI_LOG_SERNO_IN, FLDIGI_LOG_SERNO_OUT, FLDIGI_XCHG_IN, FLDIGI_XCGH_OUT, FLDIGI_CLASS_IN, FLDIGI_ARRL_SECTION_IN, FLDIGI_VE_PROV, FLDIGI_AZ, FLDIGI_LOGBOOK_CALL, FLDIGI_LOGBOOK_NAME, FLDIGI_LOGBOOK_DATE, FLDIGI_LOGBOOK_TIME_ON, FLDIGI_LOGBOOK_DATE_OFF, FLDIGI_LOGBOOK_TIME_OFF, FLDIGI_LOGBOOK_RST_IN, FLDIGI_LOGBOOK_RST_OUT, FLDIGI_LOGBOOK_FREQUENCY, FLDIGI_LOGBOOK_MODE, FLDIGI_LOGBOOK_STATE, FLDIGI_LOGBOOK_VE_PROV, FLDIGI_LOGBOOK_COUNTRY, FLDIGI_LOGBOOK_SERNO_IN, FLDIGI_LOGBOOK_SERNO_OUT, FLDIGI_LOGBOOK_XCHG_IN, FLDIGI_LOGBOOK_XCHG_OUT, FLDIGI_LOGBOOK_CLASS_IN, FLDIGI_LOGBOOK_SECTION_IN, FLDIGI_LOGBOOK_QTH, FLDIGI_LOGBOOK_LOCATOR, FLDIGI_LOGBOOK_QSL_R, FLDIGI_LOGBOOK_QSL_S, FLDIGI_LOGBOOK_NOTES, FLDIGI_LOGBOOK_TX_PWR, FLDIGI_LOGBOOK_COUNTY, FLDIGI_LOGBOOK_IOTA, FLDIGI_LOGBOOK_DXCC, FLDIGI_LOGBOOK_QSL_VIA, FLDIGI_LOGBOOK_CONTINENT, FLDIGI_LOGBOOK_CQZ, FLDIGI_LOGBOOK_ITUZ, FLDIGI_LOGBOOK_SS_SERNO, FLDIGI_LOGBOOK_SS_PREC, FLDIGI_LOGBOOK_SS_CHK, FLDIGI_LOGBOOK_SS_SEC, ENV_SIZE }; struct { const char* var; const char* val; } env[] = { #ifndef __WOE32__ { "pSKEDH", "" }, { "FLDIGI_RX_IPC_KEY", "" }, { "FLDIGI_TX_IPC_KEY", "" }, #endif { "FLDIGI_XMLRPC_ADDRESS", progdefaults.xmlrpc_address.c_str() }, { "FLDIGI_XMLRPC_PORT", progdefaults.xmlrpc_port.c_str() }, { "FLDIGI_ARQ_ADDRESS", progdefaults.arq_address.c_str() }, { "FLDIGI_ARQ_PORT", progdefaults.arq_port.c_str() }, { "FLDIGI_VERSION", PACKAGE_VERSION }, { "FLDIGI_PID", "" }, { "FLDIGI_CONFIG_DIR", HomeDir.c_str() }, { "FLDIGI_MY_CALL", progdefaults.myCall.c_str() }, { "FLDIGI_MY_NAME", progdefaults.myName.c_str() }, { "FLDIGI_MY_LOCATOR", progdefaults.myLocator.c_str() }, { "FLDIGI_MODEM", mode_info[active_modem->get_mode()].sname }, { "FLDIGI_MODEM_LONG_NAME", mode_info[active_modem->get_mode()].name }, { "FLDIGI_MODEM_ADIF_NAME", mode_info[active_modem->get_mode()].adif_name }, { "FLDIGI_DIAL_FREQUENCY", "" }, { "FLDIGI_AUDIO_FREQUENCY", "" }, { "FLDIGI_FREQUENCY", "" }, // logging frame { "FLDIGI_MACRO_FILE", progStatus.LastMacroFile.c_str() }, { "FLDIGI_LOG_FILE", progdefaults.logbookfilename.c_str() }, { "FLDIGI_LOG_FREQUENCY", inpFreq->value() }, { "FLDIGI_LOG_DATE", inpDate_log->value() }, { "FLDIGI_LOG_DATE_OFF", inpDateOff_log->value() }, { "FLDIGI_LOG_TIME_ON", inpTimeOn->value() }, { "FLDIGI_LOG_TIME_OFF", inpTimeOff->value() }, { "FLDIGI_LOG_CALL", inpCall->value() }, { "FLDIGI_LOG_NAME", inpName->value() }, { "FLDIGI_LOG_RST_IN", inpRstIn->value() }, { "FLDIGI_LOG_RST_OUT", inpRstOut->value() }, { "FLDIGI_LOG_QTH", inpQth->value() }, { "FLDIGI_LOG_LOCATOR", inpLoc->value() }, { "FLDIGI_LOG_NOTES", inpNotes->value() }, { "FLDIGI_LOG_STATE", inpState->value() }, { "FLDIGI_LOG_COUNTRY", cboCountry->value() }, { "FLDIGI_LOG_COUNTY", inpCounty->value() }, { "FLDIGI_LOG_SERNO_IN", inpSerNo->value() }, { "FLDIGI_LOG_SERNO_OUT", outSerNo->value() }, { "FLDIGI_XCHG_IN", inpXchgIn->value() }, { "FLDIGI_XCHG_OUT", inpSend1->value() }, { "FLDIGI_CLASS_IN", inpClass->value() }, { "FLDIGI_ARRL_SECTION_IN", inpSection->value() }, { "FLDIGI_VE_PROV", inpVEprov->value() }, { "FLDIGI_AZ", inpAZ->value() }, { "FLDIGI_LOGBOOK_CALL", inpCall_log->value() }, { "FLDIGI_LOGBOOK_NAME", inpName_log->value () }, { "FLDIGI_LOGBOOK_DATE", inpDate_log->value() }, { "FLDIGI_LOGBOOK_TIME_ON", inpTimeOn_log->value() }, { "FLDIGI_LOGBOOK_DATE_OFF", inpDateOff_log->value() }, { "FLDIGI_LOGBOOK_TIME_OFF", inpTimeOff_log->value() }, { "FLDIGI_LOGBOOK_RST_IN", inpRstR_log->value() }, { "FLDIGI_LOGBOOK_RST_OUT", inpRstS_log->value() }, { "FLDIGI_LOGBOOK_FREQUENCY", inpFreq_log->value() }, { "FLDIGI_LOGBOOK_BAND", inpBand_log->value() }, { "FLDIGI_LOGBOOK_MODE", inpMode_log->value() }, { "FLDIGI_LOGBOOK_STATE", inpState_log->value() }, { "FLDIGI_LOGBOOK_VE_PROV", inpVE_Prov_log->value() }, { "FLDIGI_LOGBOOK_COUNTRY", inpCountry_log->value() }, { "FLDIGI_LOGBOOK_SERNO_IN", inpSerNoIn_log->value() }, { "FLDIGI_LOGBOOK_SERNO_OUT", inpSerNoOut_log->value() }, { "FLDIGI_LOGBOOK_XCHG_IN", inpXchgIn_log->value() }, { "FLDIGI_LOGBOOK_XCHG_OUT", inpMyXchg_log->value() }, { "FLDIGI_LOGBOOK_CLASS_IN", inpClass_log->value() }, { "FLDIGI_LOGBOOK_ARRL_SECT_IN", inpSection_log->value() }, { "FLDIGI_LOGBOOK_QTH", inpQth_log->value() }, { "FLDIGI_LOGBOOK_LOCATOR", inpLoc_log->value() }, { "FLDIGI_LOGBOOK_QSL_R", inpQSLrcvddate_log->value() }, { "FLDIGI_LOGBOOK_QSL_S", inpQSLsentdate_log->value() }, { "FLDIGI_LOGBOOK_TX_PWR", inpTX_pwr_log->value() }, { "FLDIGI_LOGBOOK_COUNTY", inpCNTY_log->value() }, { "FLDIGI_LOGBOOK_IOTA", inpIOTA_log->value() }, { "FLDIGI_LOGBOOK_DXCC", inpDXCC_log->value() }, { "FLDIGI_LOGBOOK_QSL_VIA", inpQSL_VIA_log->value() }, { "FLDIGI_LOGBOOK_CONTINENT", inpCONT_log->value() }, { "FLDIGI_LOGBOOK_CQZ", inpCQZ_log->value() }, { "FLDIGI_LOGBOOK_ITUZ", inpITUZ_log->value() }, { "FLDIGI_LOGBOOK_SS_SERNO", inp_log_cwss_serno->value() }, { "FLDIGI_LOGBOOK_SS_PREC", inp_log_cwss_prec->value() }, { "FLDIGI_LOGBOOK_SS_CHK", inp_log_cwss_chk->value() }, { "FLDIGI_LOGBOOK_SS_SEC", inp_log_cwss_sec->value() }, { "FLDIGI_LOGBOOK_NOTES", inpNotes_log->value() } }; #ifndef __WOE32__ // pSKEDH static std::string pSKEDh = ScriptsDir; pSKEDh.erase(pSKEDh.length()-1,1); const char* p; if ((p = getenv("pSKEDH"))) pSKEDh.append(":").append(p); env[pSKEDH].val = pSKEDh.c_str(); // IPC keys char key[2][8]; snprintf(key[0], sizeof(key[0]), "%d", progdefaults.rx_msgid); env[FLDIGI_RX_IPC_KEY].val = key[0]; snprintf(key[1], sizeof(key[1]), "%d", progdefaults.tx_msgid); env[FLDIGI_TX_IPC_KEY].val = key[1]; #endif // pid char pid[6]; snprintf(pid, sizeof(pid), "%d", getpid()); env[FLDIGI_PID].val = pid; // frequencies char dial_freq[20]; snprintf(dial_freq, sizeof(dial_freq), "%ld", (long)wf->rfcarrier()); env[FLDIGI_DIAL_FREQUENCY].val = dial_freq; char audio_freq[6]; snprintf(audio_freq, sizeof(audio_freq), "%d", active_modem->get_freq()); env[FLDIGI_AUDIO_FREQUENCY].val = audio_freq; char freq[20]; snprintf(freq, sizeof(freq), "%ld", (long)(wf->rfcarrier() + (wf->USB() ? active_modem->get_freq() : -active_modem->get_freq()))); env[FLDIGI_FREQUENCY].val = freq; // debugging vars #if !defined(NDEBUG) && !defined(__WOE32__) unsetenv("FLDIGI_NO_EXEC"); unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); #endif string temp; size_t pch; // for (size_t j = 0; j < ENV_SIZE; j++) { // temp = env[j].val; // while ((pch = temp.find("\n")) != string::npos) temp[pch] = ';'; // setenv(env[j].var, temp.c_str(), 1); // } for (size_t j = 0; j < sizeof(env) / sizeof (*env); j++) { temp = env[j].val; while ((pch = temp.find("\n")) != string::npos) temp[pch] = ';'; setenv(env[j].var, temp.c_str(), 1); } string path = getenv("PATH"); string mypath = ScriptsDir; if (mypath[mypath.length()-1] == '/') mypath.erase(mypath.length()-1, 1); mypath.append(":"); path.insert(0,mypath); setenv("PATH", path.c_str(), 1); } // this is only for the case where the user tries to nest ... // as in // ... ... // which is not permitted static void pEND_EXEC(std::string &s, size_t &i, size_t endbracket) { s.replace(i, endbracket - i + 1, ""); return; } #ifndef __MINGW32__ static void pEXEC(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(">", i); size_t end = s.find("", start); if (start == std::string::npos || end == std::string::npos) { i++; return; } std::string execstr = s.substr(start+1, end-start-1); within_exec = true; MACROTEXT m; execstr = m.expandMacro(execstr, true); // execstr.insert(0,ScriptsDir); within_exec = false; int pfd[2]; if (pipe(pfd) == -1) { LOG_PERROR("pipe"); return; } pid_t pid; switch (pid = fork()) { case -1: LOG_PERROR("fork"); return; case 0: // child close(pfd[0]); if (dup2(pfd[1], STDOUT_FILENO) != STDOUT_FILENO) { LOG_PERROR("dup2"); exit(EXIT_FAILURE); } close(pfd[1]); set_macro_env(); execl("/bin/sh", "sh", "-c", execstr.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } // parent close(pfd[1]); // give child process time to complete MilliSleep(50); FILE* fp = fdopen(pfd[0], "r"); if (!fp) { LOG_PERROR("fdopen"); close(pfd[0]); return; } s.erase(i, end - i + strlen("")); char ln[BUFSIZ]; string lnbuff = ""; while (fgets(ln, sizeof(ln), fp)) { lnbuff.append(ln); } // remove all trailing end-of-lines while (lnbuff[lnbuff.length()-1] == '\n') lnbuff.erase(lnbuff.length()-1,1); if (!lnbuff.empty()) { lnbuff = m.expandMacro(lnbuff, false); s.insert(i, lnbuff); i += lnbuff.length(); } else i++; fclose(fp); close(pfd[0]); } #else // !__MINGW32__ static void pEXEC(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start, end; if ((start = s.find('>', i)) == std::string::npos || (end = s.rfind("")) == std::string::npos) { i++; return; } start++; std::string execstr = s.substr(start, end-start); within_exec = true; MACROTEXT m; execstr = m.expandMacro(execstr, true); within_exec = false; char* cmd = strdup(execstr.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); s.erase(i, end + strlen("") - i); } #endif // !__MINGW32__ static void pEQSL(std::string& s, size_t& i, size_t endbracket) { if (within_exec || progdefaults.eqsl_when_logged) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(':', i); std::string msg = ""; if (start != std::string::npos) msg = s.substr(start + 1, endbracket-start-1); makeEQSL(msg.c_str()); s.replace(i, endbracket - i + 1, ""); return; } static void MAPIT(int how) { float lat = 0, lon = 0; std::string sCALL = inpCall->value(); std::string sLOC = inpLoc->value(); std::string url = "http://maps.google.com/maps?q="; if (how > 1 && !lookup_country.empty()) { url.append(lookup_addr1).append(",").append(lookup_addr2).append(","); url.append(lookup_state).append(",").append(lookup_country); } else { if (how > 0 && (!lookup_latd.empty() && !lookup_lond.empty())) { url.append(lookup_latd).append(","); url.append(lookup_lond); } else { if (sLOC.empty()) return; if (sLOC.length() < 4) return; if (sLOC.length() < 6) sLOC.append("aa"); for (size_t i = 0; i < 6; i++) sLOC[i] = toupper(sLOC[i]); if (sLOC[0] -'A' > 17 || sLOC[4] - 'A' > 23 || sLOC[1] -'A' > 17 || sLOC[5] - 'A' > 23 || !isdigit(sLOC[2]) || !isdigit(sLOC[3])) return; lon = -180.0 + (sLOC[0] - 'A') * 20 + (sLOC[2] - '0') * 2 + (sLOC[4] - 'A' + 0.5) / 12; lat = -90.0 + (sLOC[1] - 'A') * 10 + (sLOC[3] - '0') + (sLOC[5] - 'A' + 0.5) / 24; char sdata[20]; snprintf(sdata, sizeof(sdata),"%10.6f", lat); url.append(sdata).append(","); snprintf(sdata, sizeof(sdata),"%10.6f", lon); url.append(sdata); } } if (!sCALL.empty()) url.append("(").append(sCALL).append(")"); else url.append("(nocall)"); url.append("&t=p&z=10"); cb_mnuVisitURL(NULL, (void*)url.c_str()); } static void pMAPIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i + 7, endbracket - i - 7); if (sVal.length() > 0) { if (sVal.compare(0,3,"adr") == 0) REQ(MAPIT,2); else if (sVal.compare(0,6,"latlon") == 0) REQ(MAPIT,1); else if (sVal.compare(0,3,"loc") == 0) REQ(MAPIT,0); else REQ(MAPIT,2); } else REQ(MAPIT,2); s.erase(i, s.find('>', i) + 1 - i); expand = false; } static void pSTOP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, s.find('>', i) + 1 - i); expand = false; } static void pCONT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, s.find('>', i) + 1 - i); expand = true; } static void pSKED(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string data = s.substr(i+6, endbracket - i - 6); size_t p = data.find(":"); if (p == std::string::npos) { exec_date = zdate(); exec_time = data; if (exec_time.empty()) exec_time = ztime(); } else { exec_time = data.substr(0, p); exec_date = data.substr(p+1); } if (exec_time.length() == 4) exec_time.append("00"); timed_exec = true; s.replace(i, endbracket - i + 1, ""); } void queue_reset() { if (!Tx_cmds.empty()) { Fl::remove_timeout(post_queue_execute); Fl::remove_timeout(queue_execute_after_rx); Fl::remove_timeout(doneIDLE); Fl::remove_timeout(doneWAIT); while (!Tx_cmds.empty()) Tx_cmds.pop(); } while (!Rx_cmds.empty()) Rx_cmds.pop(); while (!mf_stack.empty()) mf_stack.pop(); Qwait_time = 0; Qidle_time = 0; que_ok = true; tx_queue_done = true; } // execute an in-line macro tag // occurs during the Tx state void Tx_queue_execute() { if (Tx_cmds.empty()) { Qwait_time = 0; Qidle_time = 0; tx_queue_done = true; return; } CMDS cmd = Tx_cmds.front(); Tx_cmds.pop(); LOG_INFO("%s", cmd.cmd.c_str()); REQ(postQueue, cmd.cmd); cmd.fp(cmd.cmd); return; } bool queue_must_rx() { // return true if current command is not a member 'must_rx' static std::string must_rx = " macro tag int time_out = 400; void Rx_queue_execution(void *) { if (trx_state != STATE_RX) { if (time_out-- == 0) { while (!Rx_cmds.empty()) Rx_cmds.pop(); LOG_ERROR("%s", "failed"); time_out = 200; return; } Fl::repeat_timeout( .050, Rx_queue_execution ); return; } LOG_INFO("action delayed by %4.2f seconds", (400 - time_out)*.050); time_out = 400; CMDS cmd; while (!Rx_cmds.empty()) { cmd = Rx_cmds.front(); Rx_cmds.pop(); LOG_INFO("%s", cmd.cmd.c_str()); REQ(postQueue, cmd.cmd); cmd.cmd.erase(0,2); cmd.cmd.insert(0,"", pCALL}, {"", pFREQ}, {"", pBAND}, {"", pLOC}, {"", pMODE}, {"", pNAME}, {"", pQTH}, {"", pRST}, {"", pST}, {"", pPR}, {"", pMYCALL}, {"", pMYLOC}, {"", pMYNAME}, {"", pMYQTH}, {"", pMYRST}, {"", pMYCLASS}, {"", pMYSECTION}, {"", pMYSTATE}, {"", pMYST}, {"", pMYCOUNTY}, {"", pMYCNTY}, {"", pANTENNA}, {"", pQSOTIME}, {"", pQSONBR}, {"", pNXTNBR}, {"", pINFO1}, {"", pINFO2}, {"", pLDT}, {"", pZDT}, {"", pLD}, {"", pZD}, {"", p_ID}, {"", pTEXT}, {"", pCWID}, {"", pVER}, {"", pCNTR}, {"", pDECR}, {"", pINCR}, {"", pXOUT}, {"", pXIN}, {"", pXOUT}, {"", pFD_CLASS}, {"", pFD_SECTION}, {"", pCLASS}, {"
", pSECTION}, {"", pXBEG}, {"", pXEND}, {"", pSAVEXCHG}, {"", pSERNO}, {"", pLASTNO}, {"", pCLRLOG}, {"", pMODEM_compSKED}, {"", pEXEC}, {"", pEND_EXEC}, {"", pSTOP}, {"", pCONT}, {"", pPAUSE}, {"", pGET}, {"", pCLRRX}, {"", pCLRTX}, {"", pFOCUS}, {"", pSRCHUP}, {"", pSRCHDN}, {"", pGOHOME}, {"", pQSYTO}, {"", pQSYFM}, {"", pMAPIT}, {"", pREPEAT}, {"", pPOP}, {"", pDIGI}, {"", pWX}, {"", pTxQueAVATAR}, // Tx Delayed action {"", pTxQueGOHOME}, {"", pTxQuePOP}, {"", pTxDIGI}, {"", pTxFREQ}, // Rx After action {"<@MODEM:", pRxQueMODEM}, {"<@RIGCAT:", pRxQueRIGCAT}, {"<@FLRIG:", pRxQueFLRIG}, {"<@GOFREQ:", pRxQueGOFREQ}, {"<@GOHOME>", pRxQueGOHOME}, {"<@RIGMODE:", pRxQueRIGMODE}, {"<@FILWID:", pRxQueFILWID}, {"<@RIGHI:", pRxQueRIGHI}, {"<@RIGLO:", pRxQueRIGLO}, {"<@TXRSID:", pRxQueTXRSID}, {"<@WAIT:", pRxQueWAIT}, {"<@PUSH", pRxQuePUSH}, {"<@POP>", pRxQuePOP}, {"", pRX}, {"", pTX}, {"", pTXRX}, {0, 0} }; int MACROTEXT::loadMacros(const std::string& filename) { std::string mLine; std::string mName; std::string mDef; int mNumber = 0; unsigned long int crlf; // 64 bit cpu's char szLine[4096]; bool convert = false; ifstream mFile(filename.c_str()); if (!mFile) { create_new_macros(); } else { mFile.getline(szLine, 4095); mLine = szLine; if (mLine.find("//fldigi macro definition file") != 0) { mFile.close(); return -2; } if (mLine.find("extended") == std::string::npos) { convert = true; changed = true; } // clear all of the macros for (int i = 0; i < MAXMACROS; i++) { name[i] = ""; text[i] = ""; } while (!mFile.eof()) { mFile.getline(szLine,4095); mLine = szLine; if (mLine.find("//") == 0) // skip over all comment lines continue; if (mLine.find("/$") == 0) { int idx = mLine.find_first_not_of("0123456789", 3); sscanf((mLine.substr(3, idx - 3)).c_str(), "%d", &mNumber); if (mNumber < 0 || mNumber > (MAXMACROS - 1)) break; if (convert && mNumber > 9) mNumber += 2; name[mNumber] = mLine.substr(idx+1); continue; } while ((crlf = mLine.find("\\n")) != std::string::npos) { mLine.erase(crlf, 2); mLine.append("\n"); } text[mNumber] = text[mNumber] + mLine; } mFile.close(); } return 0; } void MACROTEXT::loadDefault() { int erc; std::string Filename = MacrosDir; Filename.append("macros.mdf"); LOG_INFO("macro file name: %s", progStatus.LastMacroFile.c_str()); if (progdefaults.UseLastMacro == true) { if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) Filename.assign(progStatus.LastMacroFile); else Filename.assign(MacrosDir).append(progStatus.LastMacroFile); } LOG_INFO("loading: %s", Filename.c_str()); progStatus.LastMacroFile = Filename; if ((erc = loadMacros(Filename)) != 0) #ifndef __WOE32__ LOG_ERROR("Error #%d loading %s\n", erc, Filename.c_str()); #else ; #endif showMacroSet(); if (progdefaults.DisplayMacroFilename) { LOG_INFO("%s", progStatus.LastMacroFile.c_str()); string Macroset; Macroset.assign("\ \n================================================\n\ Read macros from: ").append(progStatus.LastMacroFile).append("\ \n================================================\n"); #ifdef __WOE32__ size_t p = string::npos; while ( (p = Macroset.find("/")) != string::npos) Macroset[p] = '\\'; #endif if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->addstr(Macroset); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(Macroset); else ReceiveText->addstr(Macroset); } } void MACROTEXT::openMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); const char *p = FSEL::select( _("Open macro file"), _("Fldigi macro definition file\t*.{mdf}"), deffilename.c_str()); if (p && *p) { loadMacros(p); progStatus.LastMacroFile = p; showMacroSet(); if (progdefaults.DisplayMacroFilename) { string Macroset; Macroset.assign("\nLoaded macros: ").append(progStatus.LastMacroFile).append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->addstr(Macroset); if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(Macroset); else ReceiveText->addstr(Macroset); } } } void MACROTEXT::writeMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); saveMacros(deffilename.c_str()); } void MACROTEXT::saveMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); const char *p = FSEL::saveas( _("Save macro file"), _("Fldigi macro definition file\t*.{mdf}"), deffilename.c_str()); if (!p) return; if (!*p) return; string sp = p; if (sp.empty()) return; if (sp.rfind(".mdf") == string::npos) sp.append(".mdf"); saveMacros(sp.c_str()); progStatus.LastMacroFile = sp; } void MACROTEXT::savecurrentMACROS(std::string &s, size_t &i, size_t endbracket) { writeMacroFile(); s.replace(i, endbracket - i + 1, ""); } void MACROTEXT::loadnewMACROS(std::string &s, size_t &i, size_t endbracket) { std::string fname = s.substr(i+8, endbracket - i - 8); if (fname.length() > 0) { loadMacros(fname); progStatus.LastMacroFile = fl_filename_name(fname.c_str()); } s.replace(i, endbracket - i + 1, ""); showMacroSet(); } std::string MACROTEXT::expandMacro(std::string &s, bool recurse = false) { size_t idx = 0; expand = true; if (!recurse || rx_only) { TransmitON = false; ToggleTXRX = false; } expanded = s; const MTAGS *pMtags; xbeg = xend = -1; save_xchg = false; progStatus.repeatMacro = -1; text2repeat.clear(); idleTime = 0; waitTime = 0; tuneTime = 0; while ((idx = expanded.find('<', idx)) != std::string::npos) { size_t endbracket = expanded.find('>',idx); if (ufind(expanded, "", idx) == idx) pCONT(expanded, idx, endbracket); if (!expand) { idx++; continue; } pMtags = mtags; while (pMtags->mTAG != 0) { if (ufind(expanded, pMtags->mTAG, idx) == idx) { pMtags->fp(expanded,idx, endbracket); break; } pMtags++; } if (pMtags->mTAG == 0) idx++; } if (GET) { size_t pos1 = ufind(expanded, "$NAME"); size_t pos2 = ufind(expanded, "$QTH"); size_t pos3 = ufind(expanded, "$LOC"); if (pos1 != std::string::npos && pos2 != std::string::npos) { pos1 += 5; inpName->value(expanded.substr(pos1, pos2 - pos1).c_str()); } if (pos2 != std::string::npos) { pos2 += 4; inpQth->value(expanded.substr(pos2, pos3 - pos2).c_str()); } if (pos3 != std::string::npos) { pos3 += 4; inpLoc->value(expanded.substr(pos3).c_str()); } GET = false; return ""; } if (xbeg != std::string::npos && xend != std::string::npos && xend > xbeg) { qso_exchange = expanded.substr(xbeg, xend - xbeg); } else if (save_xchg) { qso_exchange = expanded; save_xchg = false; } // force "^r" to be last tag in the expanded std::string if ((idx = expanded.find("^r")) != std::string::npos) { expanded.erase(idx, 2); expanded.append("^r"); } if (!TransmitON && !Rx_cmds.empty()) Fl::add_timeout(0, rx_que_continue); return expanded; } void idleTimer(void *) { macro_idle_on = false; } static void continueMacro(void *) { if (rx_only) TransmitON = false; else if ( TransmitON) { active_modem->set_stopflag(false); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); start_tx(); TransmitON = false; } text2send.clear(); } static void finishTune(void *) { trx_receive(); // delay to allow tx/rx loop to change state Fl::add_timeout(0.5, continueMacro); } static void finishWait(void *) { if (rx_only) { TransmitON = false; useTune = false; return; } if (useTune && tuneTime > 0) { trx_tune(); Fl::add_timeout(tuneTime, finishTune); useTune = false; return; } if ( TransmitON ) { active_modem->set_stopflag(false); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); start_tx(); TransmitON = false; } } static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } void MACROTEXT::timed_execute() { queue_reset(); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); if (!rx_only) { text2send = expandMacro(exec_string); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->add_text(text2send); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->add_text( text2send ); else TransmitText->add_text(text2send); exec_string.clear(); active_modem->set_stopflag(false); start_tx(); } } bool wait_execute = false; void MACROTEXT::execute(int n) { while (wait_execute) { MilliSleep(10); } wait_execute = true; mNbr = n; text2send = expandMacro(text[n]); if (timed_exec) { progStatus.repeatMacro = -1; exec_string = text[n]; timed_exec = false; startTimedExecute(name[n]); wait_execute = false; return; } trx_mode mode = active_modem->get_mode(); if (!rx_only) { if (progStatus.repeatMacro == -1) { if (mode == MODE_IFKP) ifkp_tx_text->add_text( text2send ); else if (mode == MODE_FSQ) fsq_tx_text->add_text( text2send ); else TransmitText->add_text( text2send ); } else { size_t p = std::string::npos; text2send = text[n]; while ((p = text2send.find('<')) != std::string::npos) text2send[p] = '['; while ((p = text2send.find('>')) != std::string::npos) text2send[p] = ']'; if (mode == MODE_IFKP) ifkp_tx_text->add_text( text2send ); else if (mode == MODE_FSQ) fsq_tx_text->add_text( text2send ); else TransmitText->add_text( text2send ); } } text2send.clear(); if (ToggleTXRX) { text2send.clear(); if (!wf->xmtrcv->value()) { REQ(set_button, wf->xmtrcv, true); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); } else REQ(set_button, wf->xmtrcv, false); wait_execute = false; return; } if (useWait && waitTime > 0) { Fl::add_timeout(waitTime, finishWait); useWait = false; wait_execute = false; return; } if (useTune && tuneTime > 0) { trx_tune(); Fl::add_timeout(tuneTime, finishTune); useTune = false; wait_execute = false; return; } if ( TransmitON ) { if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); active_modem->set_stopflag(false); start_tx(); TransmitON = false; } wait_execute = false; } void MACROTEXT::repeat(int n) { expandMacro(text[n]); LOG_WARN("%s",text2repeat.c_str()); macro_idle_on = false; if (idleTime) progStatus.repeatIdleTime = idleTime; } MACROTEXT::MACROTEXT() { changed = false; char szname[5]; for (int i = 0; i < MAXMACROS; i++) { snprintf(szname, sizeof(szname), "F-%d", i+1); name[i] = szname;//""; text[i] = ""; } } static std::string mtext = "//fldigi macro definition file extended\n\ // This file defines the macro structure(s) for the digital modem program, fldigi\n\ // It also serves as a basis for any macros that are written by the user\n\ //\n\ // The top line of this file should always be the first line in every macro \n\ // definition file (.mdf) for the fldigi program to recognize it as such.\n\ //\n\ "; void MACROTEXT::saveMacros(const std::string& fname) { std::string work; std::string output; char temp[200]; output.assign(mtext); for (int i = 0; i < MAXMACROS; i++) { snprintf(temp, sizeof(temp), "\n//\n// Macro # %d\n/$ %d %s\n", i+1, i, macros.name[i].c_str()); output.append(temp); work = macros.text[i]; size_t pos; pos = work.find('\n'); while (pos != std::string::npos) { work.insert(pos, "\\n"); pos = work.find('\n', pos + 3); } output.append(work).append("\n"); } UTF8_writefile(fname.c_str(), output); changed = false; } fldigi-4.1.06/src/misc/misc.cxx0000644000175000017500000001240313472115773013174 00000000000000// ---------------------------------------------------------------------------- // misc.cxx -- Miscellaneous helper functions // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "misc.h" #include // ---------------------------------------------------------------------------- /* * Hamming weight (number of bits that are ones). */ unsigned long hweight32(unsigned long w) { w = (w & 0x55555555) + ((w >> 1) & 0x55555555); w = (w & 0x33333333) + ((w >> 2) & 0x33333333); w = (w & 0x0F0F0F0F) + ((w >> 4) & 0x0F0F0F0F); w = (w & 0x00FF00FF) + ((w >> 8) & 0x00FF00FF); w = (w & 0x0000FFFF) + ((w >> 16) & 0x0000FFFF); return w; } unsigned short int hweight16(unsigned short int w) { w = (w & 0x5555) + ((w >> 1) & 0x5555); w = (w & 0x3333) + ((w >> 2) & 0x3333); w = (w & 0x0F0F) + ((w >> 4) & 0x0F0F); w = (w & 0x00FF) + ((w >> 8) & 0x00FF); return w; } unsigned char hweight8(unsigned char w) { w = (w & 0x55) + ((w >> 1) & 0x55); w = (w & 0x33) + ((w >> 2) & 0x33); w = (w & 0x0F) + ((w >> 4) & 0x0F); return w; } // ---------------------------------------------------------------------------- /* * Parity function. Return one if `w' has odd number of ones, zero otherwise. */ int parity(unsigned long w) { return hweight32(w) & 1; } // ---------------------------------------------------------------------------- /* * Reverse order of bits. */ unsigned long rbits32(unsigned long w) { w = ((w >> 1) & 0x55555555) | ((w << 1) & 0xAAAAAAAA); w = ((w >> 2) & 0x33333333) | ((w << 2) & 0xCCCCCCCC); w = ((w >> 4) & 0x0F0F0F0F) | ((w << 4) & 0xF0F0F0F0); w = ((w >> 8) & 0x00FF00FF) | ((w << 8) & 0xFF00FF00); w = ((w >> 16) & 0x0000FFFF) | ((w << 16) & 0xFFFF0000); return w; } unsigned short int rbits16(unsigned short int w) { w = ((w >> 1) & 0x5555) | ((w << 1) & 0xAAAA); w = ((w >> 2) & 0x3333) | ((w << 2) & 0xCCCC); w = ((w >> 4) & 0x0F0F) | ((w << 4) & 0xF0F0); w = ((w >> 8) & 0x00FF) | ((w << 8) & 0xFF00); return w; } unsigned char rbits8(unsigned char w) { w = ((w >> 1) & 0x55) | ((w << 1) & 0xFF); w = ((w >> 2) & 0x33) | ((w << 2) & 0xCC); w = ((w >> 4) & 0x0F) | ((w << 4) & 0xF0); return w; } // ---------------------------------------------------------------------------- // Integer base-2 logarithm unsigned int log2u(unsigned int x) { int y = 0; x >>= 1; while (x) { x >>= 1; y++; } return y; } // ---------------------------------------------------------------------------- // Gray encoding and decoding (8 bit) unsigned char grayencode(unsigned char data) //unsigned char graydecode(unsigned char data) { unsigned char bits = data; bits ^= data >> 1; bits ^= data >> 2; bits ^= data >> 3; bits ^= data >> 4; bits ^= data >> 5; bits ^= data >> 6; bits ^= data >> 7; return bits; } unsigned char graydecode(unsigned char data) //unsigned char grayencode(unsigned char data) { return data ^ (data >> 1); } // ---------------------------------------------------------------------------- // Rectangular - no pre filtering of data array void RectWindow(double *array, int n) { for (int i = 0; i < n; i++) array[i] = 1.0; } // Hamming - used by gmfsk void HammingWindow(double *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = hamming((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Hanning - used by winpsk void HanningWindow(double *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = hanning((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Best lob suppression - least in band ripple void BlackmanWindow(double *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = blackman((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Simple about effective as Hamming or Hanning void TriangularWindow(double *array, int n) { double pwr = 0.0; for (int i = 0; i < n; i++) array[i] = 1.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n / 4; i++) { array[i] = 4.0 * (double)i * inv_n ; array[n-i] = array[i]; } for (int i = 0; i < n; i++) pwr += array[i] * array[i]; pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } fldigi-4.1.06/src/misc/charsetdistiller.cxx0000644000175000017500000001503313472115773015610 00000000000000// ---------------------------------------------------------------------------- // charsetdistiller.cxx -- input charset cleaning and conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "debug.h" #include "charsetdistiller.h" #include "tiniconv.h" using namespace std; /* CharsetDistiller This class implements a charset "distiller" that receives input data one byte at a time and converts this data stream from a particular character set into UTF-8. Invalid input data is treated as if it was encoded in CP1252. Character set conversion is performed as soon as possible, i.e., when enough input is received to constitute a valid character in the input character set, this character is immediatly converted into UTF-8 and made available at the output. */ /* The constructor. Look up tiniconv.h for the list of possible values of charset_in. */ CharsetDistiller::CharsetDistiller(const int charset_in) { bufptr = buf; nutf8 = 0; tiniconv_init(charset_in, TINICONV_CHARSET_UTF_8, 0, &ctx); tiniconv_init(TINICONV_CHARSET_CP1252, TINICONV_CHARSET_UTF_8, TINICONV_OPTION_IGNORE_IN_ILSEQ, &ctx1252); } /* Change the input encoding. Look up tiniconv.h for the list of possible values of charset_in. Returns 0 if successful or -1 in case of error. */ int CharsetDistiller::set_input_encoding(const int charset_in) { flush(); return tiniconv_init(charset_in, TINICONV_CHARSET_UTF_8, 0, &ctx); } /* Receive a single byte of input data and make an immediate conversion attempt. */ void CharsetDistiller::rx(const unsigned char c) { *bufptr++ = c; process_buffer(); } /* Receive a zero-terminated string of input data. This is a convenience method: it merely feeds the string into the distiller one byte at a time. */ void CharsetDistiller::rx(const unsigned char *c) { const unsigned char *ptr; for (ptr = c; *ptr != 0; ptr++) rx(*ptr); } /* Examine the input buffer and decide on the possible actions (construct an UTF-8 character, interpret the bytes as invalid input etc.) */ void CharsetDistiller::process_buffer(void) { bool again = true; while (again) { if (bufptr == buf) { // the buffer is empty return; } int convert_status; int consumed_in; int consumed_out; unsigned char outbuf[6]; convert_status = tiniconv_convert(&ctx, buf, (bufptr - buf), &consumed_in, outbuf, sizeof(outbuf), &consumed_out); if (consumed_out) { // Append the converted data to the output string. outdata.append(reinterpret_cast(outbuf), consumed_out); // Count the number of converted UTF-8 characters (by counting the // number of bytes that are not continuation bytes). for (unsigned char *iptr = outbuf; iptr < outbuf + consumed_out; iptr++) { if ((*iptr & 0xc0) != 0x80) nutf8++; } // If not all input was consumed, move the remaining data to the // beginning of the buffer if (bufptr - buf > consumed_in) { memmove(buf, buf + consumed_in, bufptr - buf - consumed_in); bufptr -= consumed_in; } else bufptr = buf; } again = false; if (convert_status == TINICONV_CONVERT_OK) { // Successful conversion, nothing else to do. return; } else if (convert_status == TINICONV_CONVERT_IN_TOO_SMALL) { // Partial data left in the input buffer. We can't proceed with the // conversion until we get more input. return; } else if (convert_status == TINICONV_CONVERT_IN_ILSEQ) { // Invalid sequence in input; spit out the offending byte and try again. shift_first_out(); again = true; } else if (convert_status == TINICONV_CONVERT_OUT_TOO_SMALL) { // More characters were available than could be converted in one // go. Have another round. again = true; } // The following two cases should never happen. else if (convert_status == TINICONV_CONVERT_OUT_ILSEQ) { LOG_ERROR("Character not representable in UTF-8? Is this possible?"); bufptr = buf; return; } else { LOG_ERROR("Unknown tiniconv return value %d.", convert_status); bufptr = buf; return; } } } /* Convert the first byte of the input buffer; treat it as if it was encoded in CP1252 */ void CharsetDistiller::shift_first_out(void) { int consumed_in; int consumed_out; unsigned char outbuf[6]; tiniconv_convert(&ctx1252, buf, 1, &consumed_in, outbuf, sizeof(outbuf), &consumed_out); outdata.append(reinterpret_cast(outbuf), consumed_out); nutf8++; memmove(buf, buf+1, (bufptr - buf - 1)); bufptr--; } /* Flush input. Recode the input data left in the buffer in whatever way necessary to make the buffer empty. */ void CharsetDistiller::flush(void) { while (bufptr > buf) shift_first_out(); } /* Reset input buffer. All data still waiting in the input buffer is lost. Data already converted and waiting at the output is not affected. */ void CharsetDistiller::reset(void) { bufptr = buf; } /* Clear the output buffer. */ void CharsetDistiller::clear(void) { outdata.clear(); nutf8 = 0; } /* Return the number of bytes available in the output buffer. */ int CharsetDistiller::data_length(void) { return outdata.length(); } /* Return the number of UTF-8 characters in the output buffer. */ int CharsetDistiller::num_chars(void) { return nutf8; } /* Return a reference to the output buffer. */ const string &CharsetDistiller::data(void) { return outdata; } fldigi-4.1.06/src/misc/charsetlist.cxx0000644000175000017500000000535013472115773014571 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include "charsetlist.h" #include "tiniconv.h" const struct charset_info charset_list[] = { { "ASCII", TINICONV_CHARSET_ASCII }, { "CP1250", TINICONV_CHARSET_CP1250 }, { "CP1251", TINICONV_CHARSET_CP1251 }, { "CP1252", TINICONV_CHARSET_CP1252 }, { "CP1253", TINICONV_CHARSET_CP1253 }, { "CP1254", TINICONV_CHARSET_CP1254 }, { "CP1255", TINICONV_CHARSET_CP1255 }, { "CP1256", TINICONV_CHARSET_CP1256 }, { "CP1257", TINICONV_CHARSET_CP1257 }, { "CP1258", TINICONV_CHARSET_CP1258 }, { "CP936", TINICONV_CHARSET_CP936 }, { "GB2312", TINICONV_CHARSET_GB2312 }, { "GBK", TINICONV_CHARSET_GBK }, { "ISO-2022-JP", TINICONV_CHARSET_ISO_2022_JP }, { "ISO-8859-1", TINICONV_CHARSET_ISO_8859_1 }, { "ISO-8859-2", TINICONV_CHARSET_ISO_8859_2 }, { "ISO-8859-3", TINICONV_CHARSET_ISO_8859_3 }, { "ISO-8859-4", TINICONV_CHARSET_ISO_8859_4 }, { "ISO-8859-5", TINICONV_CHARSET_ISO_8859_5 }, { "ISO-8859-6", TINICONV_CHARSET_ISO_8859_6 }, { "ISO-8859-7", TINICONV_CHARSET_ISO_8859_7 }, { "ISO-8859-8", TINICONV_CHARSET_ISO_8859_8 }, { "ISO-8859-9", TINICONV_CHARSET_ISO_8859_9 }, { "ISO-8859-10", TINICONV_CHARSET_ISO_8859_10 }, { "ISO-8859-11", TINICONV_CHARSET_ISO_8859_11 }, { "ISO-8859-13", TINICONV_CHARSET_ISO_8859_13 }, { "ISO-8859-14", TINICONV_CHARSET_ISO_8859_14 }, { "ISO-8859-15", TINICONV_CHARSET_ISO_8859_15 }, { "ISO-8859-16", TINICONV_CHARSET_ISO_8859_16 }, { "CP866", TINICONV_CHARSET_CP866 }, { "KOI8-R", TINICONV_CHARSET_KOI8_R }, { "KOI8-RU", TINICONV_CHARSET_KOI8_RU }, { "KOI8-U", TINICONV_CHARSET_KOI8_U }, { "MACCYRILLIC", TINICONV_CHARSET_MACCYRILLIC }, { "UCS-2", TINICONV_CHARSET_UCS_2 }, { "UTF-7", TINICONV_CHARSET_UTF_7 }, { "UTF-8", TINICONV_CHARSET_UTF_8 }, { "CHINESE", TINICONV_CHARSET_CHINESE }, { "BIG5", TINICONV_CHARSET_BIG5 }, }; const unsigned int number_of_charsets = sizeof(charset_list)/sizeof(struct charset_info); fldigi-4.1.06/src/misc/kiss_io.cxx0000644000175000017500000032116413472115773013710 00000000000000// ---------------------------------------------------------------------------- // kiss_io.cxx // // support for KISS interface // // Copyright (c) 2014, 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #if !defined(__MINGW32__) && !defined(__APPLE__) # include # include #endif #include #include "config.h" #ifdef __MINGW32__ # include "compat.h" #endif #include "main.h" #include "configuration.h" #include "fl_digi.h" #include "trx.h" #include "kiss_io.h" #include "globals.h" #include "threads.h" #include "socket.h" #include "debug.h" #include "qrunner.h" #include "data_io.h" #include "status.h" #include "psm/psm.h" #include #include #include #include "confdialog.h" #include "configuration.h" #include "status.h" LOG_FILE_SOURCE(debug::LOG_KISSCONTROL); //#define EXTENED_DEBUG_INFO //#undef EXTENED_DEBUG_INFO using namespace std; //====================================================================== // Socket KISS i/o used on all platforms //====================================================================== #define KISSLOOP_TIMING 100 // msec #define KISSLOOP_FRACTION 10 // msec static string errstring; // ===================================================================== static pthread_t kiss_thread; static pthread_t kiss_rx_socket_thread; static pthread_t kiss_watchdog_thread; static pthread_cond_t kiss_watchdog_cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t from_host_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t from_radio_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_bc_frame_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_frame_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t to_host_arq_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t to_host_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t to_radio_mutex = PTHREAD_MUTEX_INITIALIZER; //static pthread_mutex_t external_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t restart_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_encode_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_loop_exit_mutex = PTHREAD_MUTEX_INITIALIZER; bool kiss_enabled = false; bool kiss_exit = false; bool kiss_rx_exit = false; bool allow_kiss_socket_io = false; bool kiss_loop_running = false; bool kiss_rx_loop_running = false; bool kiss_watchdog_exit = false; bool kiss_watchdog_running = false; bool kiss_tcp_ip_connected = false; bool tcpip_reset_flag = false; static bool smack_crc_enabled = false; static int crc_mode = CRC16_CCITT; static std::string default_kiss_modem = "BPSK250"; static std::string kiss_modem = ""; static unsigned int transmit_buffer_flush_timeout = 0; unsigned int duplex = KISS_HALF_DUPLEX; // Default half duplex unsigned int kiss_port_no = 0; // Default is 0 /// Any access to shared variables must be protected. static std::string from_host = ""; static std::string from_radio = ""; static std::string from_radio_parsed = ""; static std::string kiss_bc_frame = ""; static std::string kiss_frame = ""; static std::string kiss_ip_address = ""; static std::string kiss_ip_io_port = ""; static std::string kiss_ip_out_port = ""; static std::string kiss_one_frame = ""; static std::string to_arq_host = ""; static std::string to_host = ""; static std::string to_radio = ""; static std::string translated_frame = ""; static int pText = 0; bool bcast_tx_buffer_empty_flag = false; bool kiss_bcast_rsid_reception = false; bool kiss_bcast_trx_toggle = false; bool kiss_text_available = false; static bool kiss_reset_flag = false; static int retry_count = KISS_CONNECT_RETRY_COUNT; #define HISTO_COUNT 256 #define HISTO_THRESH_HOLD 48 // In seconds #define HISTO_RESET_TX_TIME 3 static int histogram[HISTO_COUNT]; static bool init_hist_flag = true; // static double threshold = 5.0; // time_t inhibit_tx_seconds = 0; time_t temp_disable_tx_inhibit = 0; time_t temp_disable_tx_duration = DISABLE_TX_INHIBIT_DURATION; static int kpsql_pl = 0; static double kpsql_threshold = 0.0; extern int IMAGE_WIDTH; Socket *kiss_socket = 0; int data_io_enabled = DISABLED_IO; int data_io_type = DATA_IO_UDP; //program_start_time bool program_started_flag = 0; extern const struct mode_info_t mode_info[]; extern void abort_tx(); // Storage for modem list allowed for KISS use. static std::vector availabe_kiss_modems; static int kiss_raw_enabled = KISS_RAW_DISABLED; std::string host_name_string; inline std::string uppercase_string(std::string str); inline void set_tx_timeout(void); size_t hdlc_decode(char *src, size_t src_size, char **dst); size_t hdlc_encode(char *src, size_t src_size, char **dst); size_t kiss_decode(char *src, size_t src_size, char **dst); size_t kiss_encode(char *src, size_t src_size, char **dst); static bool kiss_queue_frame(KISS_QUEUE_FRAME * frame, std::string cmd); static int calc_ccitt_crc(char *buf, int n); static int calc_fcs_crc(char *buf, int n); static int calc_xor_crc(char *buf, int n); static KISS_QUEUE_FRAME * encap_kiss_frame(std::string data, int frame_type, int port); static KISS_QUEUE_FRAME *encap_kiss_frame(char *buffer, size_t buffer_size, int frame_type, int port); static size_t decap_hdlc_frame(char *buffer, size_t data_count); static size_t encap_hdlc_frame(char *buffer, size_t data_count); static void *kiss_loop(void *args); static void *ReadFromHostSocket(void *args); static void *tcpip_watchdog(void *args); static void exec_hardware_command(std::string cmd, std::string arg); static void host_name(char *arg); static void kiss_tcp_disconnect(char *arg); static void parse_hardware_frame(std::string frame); static void parse_kiss_frame(std::string frame_segment); static void ReadFromHostBuffered(void); static void reply_active_modem_bw(char * arg); static void reply_active_modem(char * arg); static void reply_busy_channel_duration(char * arg); static void reply_busy_channel_on_off(char * arg); static void reply_busy_state(char * arg); static void reply_crc_mode(char *arg); static void reply_csma_mode(char *arg); static void reply_fldigi_stat(char *arg); static void reply_kiss_raw_mode(char * arg); static void reply_kpsql_fraction_gain(char *arg); static void reply_kpsql_on_off(char * arg); static void reply_kpsql_pwr_level(char * arg); static void reply_kpsql_squelch_level(char * arg); static void reply_modem_list(char * arg); static void reply_psm_on_off(char * arg); static void reply_psm_pwr_level(char * arg); static void reply_psm_squelch_level(char * arg); static void reply_rsid_bc_mode(char * arg); static void reply_rsid_mode_state(char * arg); static void reply_rsid_rx_state(char * arg); static void reply_rsid_tx_state(char * arg); static void reply_sql_level(char * arg); static void reply_sql_on_off(char * arg); static void reply_sql_pwr_level(char * arg); static void reply_tnc_name(char * arg); static void reply_trx_state(char * arg); static void reply_trxs_bc_mode(char * arg); static void reply_tx_buffer_count(char * arg); static void reply_txbe_bc_mode(char * arg); static void reply_waterfall_bw(char * arg); static void reply_wf_freq_pos(char * arg); static void send_disconnect_msg(void); static void set_busy_channel_duration(char * arg); static void set_busy_channel_inhibit(char *arg); static void set_busy_channel_on_off(char * arg); static void set_button(Fl_Button * button, bool value); static void set_counter(Fl_Counter * counter, int value); static void set_crc_mode(char * arg); static void set_csma_mode(char * arg); static void set_default_kiss_modem(void); static void set_kiss_modem(char * arg); static void set_kiss_raw_mode(char * arg); static void set_kpsql_on_off(char * arg); static void set_kpsql_squelch_level(char * arg); static void set_psm_fraction_gain(char *arg); static void set_psm_on_off(char * arg); static void set_psm_squelch_level(char * arg); static void set_reply_tx_lock(char * arg); static void set_rsid_bc_mode(char * arg); static void set_rsid_mode(char *arg); static void set_rsid_rx(char *arg); static void set_rsid_tx(char * arg); static void set_sql_level(char * arg); static void set_sql_on_off(char * arg); static void set_trxs_bc_mode(char * arg); static void set_txbe_bc_mode(char * arg); static void set_wf_cursor_pos(char * arg); static void WriteToHostARQBuffered(void); static void WriteToHostBuffered(const char *data, size_t size); static void WriteToRadioBuffered(const char *data, size_t size); std::string kiss_decode(std::string frame); std::string kiss_encode(std::string frame); std::string unencap_kiss_frame(char *buffer, size_t buffer_size, int *frame_type, int *kiss_port_no); std::string unencap_kiss_frame(std::string package, int *frame_type, int *kiss_port_no); void kiss_main_thread_close(void *ptr); void kiss_main_thread_retry_open(void *ptr); void kiss_reset_buffers(void); void kiss_reset(void); void ReadFromRadioBuffered(void); void WriteKISS(const char *data, size_t size); void WriteKISS(const char *data); void WriteKISS(const char data); void WriteKISS(std::string data); void WriteToHostBCastFramesBuffered(void); void WriteToHostSocket(void); /********************************************************************************** * Not all modems are created equal. Translate! * There must be at least HDLC_CNT_OFFSET count offset (+/-, but still in range) * between real values and translated values. **********************************************************************************/ static int not_allowed[256] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 48 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // 128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 240 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 // 256 }; /********************************************************************************** * KISS hardware frame commands strings and calling functions **********************************************************************************/ EXEC_HARDWARE_CMD_MATCH exec_match[] = { { (char *) "BCHN", set_busy_channel_on_off }, { (char *) "BCHNS", set_busy_channel_duration }, { (char *) "BUSY", reply_busy_state }, { (char *) "CSMA", set_csma_mode }, { (char *) "DISC", kiss_tcp_disconnect }, { (char *) "FLSTAT", reply_fldigi_stat }, { (char *) "HOST", host_name }, { (char *) "IBCHN", set_busy_channel_inhibit }, { (char *) "KISSCRCM", set_crc_mode }, { (char *) "KISSRAW", set_kiss_raw_mode }, { (char *) "KPSATT", set_psm_fraction_gain }, // Depreciated { (char *) "PSMATT", set_psm_fraction_gain }, { (char *) "PSM", set_psm_on_off }, { (char *) "PSMP", reply_psm_pwr_level }, { (char *) "PSMS", set_psm_squelch_level }, { (char *) "KPSQL", set_kpsql_on_off }, // Depreciated { (char *) "KPSQLP", reply_kpsql_pwr_level }, // Depreciated { (char *) "KPSQLS", set_kpsql_squelch_level }, // Depreciated { (char *) "MODEM", set_kiss_modem }, { (char *) "MODEMBW", reply_active_modem_bw }, { (char *) "MODEML", reply_modem_list }, { (char *) "RSIDBCAST", set_rsid_bc_mode }, { (char *) "RSIDM", set_rsid_mode }, { (char *) "RSIDRX", set_rsid_rx }, { (char *) "RSIDTX", set_rsid_tx }, { (char *) "SQL", set_sql_on_off }, { (char *) "SQLP", reply_sql_pwr_level }, { (char *) "SQLS", set_sql_level }, { (char *) "TNC", reply_tnc_name }, { (char *) "TRXS", reply_trx_state }, { (char *) "TRXSBCAST", set_trxs_bc_mode }, { (char *) "TXBEBCAST", set_txbe_bc_mode }, { (char *) "TXBUF", reply_tx_buffer_count }, { (char *) "TXLOCK", set_reply_tx_lock }, { (char *) "WFBW", reply_waterfall_bw }, { (char *) "WFF", set_wf_cursor_pos }, { (char *) 0, 0 } }; #ifdef USE_NOCTRL static std::string noctrl(string src); static const char *asc[128] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "" }; /********************************************************************************** * **********************************************************************************/ static string noctrl(string src) { static string retstr; retstr.clear(); char hexstr[10]; int c; for (size_t i = 0; i < src.length(); i++) { c = src[i]; if ( c > 0 && c < 128) retstr.append(asc[c]); else { snprintf(hexstr, sizeof(hexstr), "<%0X>", c & 0xFF); retstr.append(hexstr); } } return retstr; } #endif // USE_NOCTRL /********************************************************************************** * For SMACK CRC validation **********************************************************************************/ static int calc_ccitt_crc(char *buf, int n) { static int crc_table[] = { 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0xcc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040 }; int crc; crc = 0; while (--n >= 0) crc = ((crc >> 8) & 0xff) ^ crc_table[(crc ^ *buf++) & 0xff]; return crc; } /********************************************************************************** * For SMACK CRC validation (BPQ XOR CRC implimentation). **********************************************************************************/ static int calc_xor_crc(char *buf, int n) { int crc; crc = 0; while (--n >= 0) crc ^= (*buf++ & 0xff); return crc; } /********************************************************************************** * For FCS CRC. **********************************************************************************/ static int calc_fcs_crc(char *buf, int n) { static int fcstab[256] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; int crc; crc = 0xFFFF; while (--n >= 0) crc = ((crc >> 8) & 0xff) ^ fcstab[(crc ^ *buf++) & 0xff]; return crc; } /********************************************************************************** * **********************************************************************************/ static void set_button(Fl_Button * button, bool value) { button->value(value); button->do_callback(); } /********************************************************************************** * **********************************************************************************/ static void set_counter(Fl_Counter * counter, int value) { counter->value(value); counter->do_callback(); } /********************************************************************************** * **********************************************************************************/ static void set_slider2(Fl_Slider2 * sider, int value) { sider->value(value); sider->do_callback(); } /********************************************************************************** * **********************************************************************************/ bool valid_kiss_modem(std::string _modem) { if(_modem.empty()) return false; int index = 0; int count = availabe_kiss_modems.size(); std::string _tmp_str; if(count < 1) { for(index = 0; index < NUM_MODES; index++) { if(mode_info[index].iface_io & KISS_IO) { _tmp_str = uppercase_string(mode_info[index].sname); availabe_kiss_modems.push_back(_tmp_str); } } count = availabe_kiss_modems.size(); } std::string cmp_str = ""; index = 0; _modem = uppercase_string(_modem); while(index < count) { cmp_str = availabe_kiss_modems[index]; if(cmp_str.empty()) return false; if(_modem.compare(cmp_str) == 0) { return true; } index++; } return false; } /********************************************************************************** * **********************************************************************************/ void check_kiss_modem(void) { int mode = active_modem->get_mode(); std::string modem_name; modem_name.assign(mode_info[mode].sname); bool valid = valid_kiss_modem(modem_name); if(!valid) set_default_kiss_modem(); } /********************************************************************************** * **********************************************************************************/ static void set_default_kiss_modem(void) { set_kiss_modem((char *) default_kiss_modem.c_str()); } /********************************************************************************** * **********************************************************************************/ inline std::string uppercase_string(std::string str) { int index = 0; int count = str.size(); std::string ret_str = ""; if(!count) return ret_str; ret_str.reserve(count + 1); ret_str.clear(); for(index = 0; index < count; index++) ret_str += toupper(str[index]); return ret_str; } /********************************************************************************** * MODEM: **********************************************************************************/ static void set_kiss_modem(char * arg) { if(!arg) return; std::string _modem = ""; std::string _cmp_modem = ""; _modem.assign(arg); if(_modem.empty()) { return reply_active_modem(arg); } bool valid = valid_kiss_modem(_modem); _modem = uppercase_string(_modem); if(valid) { for (size_t i = 0; i < NUM_MODES; i++) { _cmp_modem = uppercase_string(mode_info[i].sname); if (_modem == _cmp_modem) { REQ_SYNC(init_modem_sync, i, 0); kiss_modem.assign(_modem); break; } } return; } if(!valid) LOG_INFO("Modem %s invalid for KISS use. Must support 8bit.", _modem.c_str()); return; } /********************************************************************************** * DISC: Disconnect TCP/IP connection. **********************************************************************************/ static void kiss_tcp_disconnect(char *arg) { if(kiss_socket && data_io_type == DATA_IO_TCP) { Fl::awake(kiss_main_thread_close, (void *) 0); } } /********************************************************************************** * Send a Disconnect message to the HOST called from the main thread only. **********************************************************************************/ static void send_disconnect_msg(void) { if(kiss_socket && data_io_type == DATA_IO_TCP) { std::string package = ""; std::string cmd = "DISC:"; package.assign(cmd); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } } /********************************************************************************** * FLSTAT:, **********************************************************************************/ static void reply_fldigi_stat(char *arg) { std::string package = ""; std::string cmd = "FLSTAT:"; unsigned int hours = 0; unsigned int mins = 0; unsigned int secs = 0; time_t current_time = time(0); time_t diff_time = 0; char buffer[64]; package.assign(cmd); if(program_started_flag) { package.append("OK"); } else { package.append("INIT"); program_started_flag = true; } if(program_start_time == 0) program_start_time = time(0); diff_time = current_time - program_start_time; hours = (unsigned int) (diff_time / 3600); diff_time -= (time_t) (hours * 3600); mins = (unsigned int)(diff_time / 60); diff_time -= (time_t) (mins * 60); secs = (unsigned int) diff_time; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, ",%02u:%02u:%02u", hours, mins, secs); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * CSMA: **********************************************************************************/ static void set_csma_mode(char * arg) { if(!arg) return; std::string rsid_tx_state = ""; rsid_tx_state.assign(arg); if(rsid_tx_state.empty()) return reply_csma_mode(arg); std::string state = uppercase_string(rsid_tx_state); if(state.find("ON") != std::string::npos) { REQ(set_button, btnEnable_csma, 1); return; } if(state.find("OFF") != std::string::npos) { REQ(set_button, btnEnable_csma, 0); return; } } /********************************************************************************** * CSMA: **********************************************************************************/ static void reply_csma_mode(char *arg) { std::string package = ""; std::string cmd = "CSMA:"; package.assign(cmd); if(progdefaults.csma_enabled) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * IBCHN:I // Inhibit busy channel temporarily. 'I' (character) * IBCHN: // Set Inhibit busy channel duration to N seconds * IBCHN:0 // Resets temporary duration to default setting (5). * IBCHN: // Returns IBCHN: **********************************************************************************/ static void set_busy_channel_inhibit(char *arg) { std::string argstr = ""; time_t temp = 0; if(arg) { argstr.assign(arg); if(!argstr.empty()) { if(argstr[0] == 'I' || argstr[0] == 'i') { if(progdefaults.enableBusyChannel && inhibit_tx_seconds) { temp_disable_tx_inhibit = time(0) + temp_disable_tx_duration; } } else if(isdigit(argstr[0])) { sscanf(arg, "%lu", &temp); if(temp == 0) temp_disable_tx_duration = DISABLE_TX_INHIBIT_DURATION; else temp_disable_tx_duration = temp; } return; } } std::string cmd = "IBCHN:"; std::string package = ""; char buff[32]; package.assign(cmd); memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff)-1, "%lu", temp_disable_tx_duration); package.append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KPSATT: // Set the fractional ratio gain value (1/value) **********************************************************************************/ static void set_psm_fraction_gain(char *arg) { if(!arg) return; std::string args; args.assign(arg); if(args.empty()) return reply_kpsql_fraction_gain(arg); unsigned int value = 0; sscanf(args.c_str(), "%u", &value); update_kpsql_fractional_gain(value); REQ(set_counter, cntKPSQLAttenuation, progdefaults.kpsql_attenuation); } /********************************************************************************** * KPSQLG: // Return the fractional ratio gain value (1/value) **********************************************************************************/ static void reply_kpsql_fraction_gain(char *arg) { std::string package = ""; std::string cmd = "KPSATT:"; char buffer[128]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", progdefaults.kpsql_attenuation); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * WFF: Move TXRX cursor to Frequency. **********************************************************************************/ static void set_wf_cursor_pos(char * arg) { if(!arg) return; std::string wf_cursor_pos = ""; wf_cursor_pos.assign(arg); if(wf_cursor_pos.empty()) return reply_wf_freq_pos(arg); int cursor = 0; int mode_bw = active_modem->get_bandwidth(); sscanf(wf_cursor_pos.c_str(), "%d", &cursor); mode_bw >>= 1; if((cursor - mode_bw) < 0) cursor = mode_bw; if((cursor + mode_bw) >= IMAGE_WIDTH) cursor = IMAGE_WIDTH - mode_bw; active_modem->set_freq((double) cursor); } /********************************************************************************** * RSIDTX: **********************************************************************************/ static void set_rsid_tx(char * arg) { if(!arg) return; std::string rsid_tx_state = ""; rsid_tx_state.assign(arg); if(rsid_tx_state.empty()) return reply_rsid_tx_state(arg); std::string state = uppercase_string(rsid_tx_state); if(state.find("ON") != std::string::npos) { REQ(set_button, btnTxRSID, 1); return; } if(state.find("OFF") != std::string::npos) { REQ(set_button, btnTxRSID, 0); return; } } /********************************************************************************** * RSIDRX: **********************************************************************************/ static void set_rsid_rx(char *arg) { if(!arg) return; std::string rsid_rx_state = ""; rsid_rx_state.assign(arg); if(rsid_rx_state.empty()) return reply_rsid_rx_state(arg); std::string state = uppercase_string(rsid_rx_state); if(state.find("ON") != std::string::npos) { REQ(set_button, btnRSID, 1); return; } if(state.find("OFF") != std::string::npos) { REQ(set_button, btnRSID, 0); return; } } /********************************************************************************** * RSIDM: **********************************************************************************/ static void set_rsid_mode(char *arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_rsid_mode_state(arg); std::string state = uppercase_string(strarg); if(state.find("BANDPASS") != std::string::npos) { REQ(set_button, chkRSidWideSearch, 1); } if(state.find("MODEM") != std::string::npos) { REQ(set_button, chkRSidWideSearch, 0); } if(state.find("NOTIFY") != std::string::npos) { REQ(set_button, chkRSidNotifyOnly, 1); } if(state.find("ACTIVE") != std::string::npos) { REQ(set_button, chkRSidNotifyOnly, 0); } } /********************************************************************************** * RSIDBCAST: **********************************************************************************/ static void set_rsid_bc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_rsid_bc_mode(arg); std::string state = uppercase_string(strarg); if(state.find("ON") != std::string::npos) { kiss_bcast_rsid_reception = true; return; } if(state.find("OFF") != std::string::npos) { kiss_bcast_rsid_reception = false; return; } } /********************************************************************************** * RSIDBCAST: **********************************************************************************/ static void reply_rsid_bc_mode(char * arg) { std::string package = ""; std::string cmd = "RSIDBCAST:"; package.assign(cmd); if(kiss_bcast_rsid_reception) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TRXSBCAST: **********************************************************************************/ static void set_trxs_bc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_trxs_bc_mode(arg); std::string state = uppercase_string(strarg); if(state.find("ON") != std::string::npos) { kiss_bcast_trx_toggle = true; return; } if(state.find("OFF") != std::string::npos) { kiss_bcast_trx_toggle = false; return; } } /********************************************************************************** * TRXSBCAST: **********************************************************************************/ static void reply_trxs_bc_mode(char * arg) { std::string package = ""; std::string cmd = "TRXSBCAST:"; package.assign(cmd); if(kiss_bcast_trx_toggle) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * SET TXBEBCAST: **********************************************************************************/ static void set_txbe_bc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_txbe_bc_mode(arg); std::string state = uppercase_string(strarg); if(state.find("ON") != std::string::npos) { bcast_tx_buffer_empty_flag = true; return; } if(state.find("OFF") != std::string::npos) { bcast_tx_buffer_empty_flag = false; return; } } /********************************************************************************** * REPLY TXBEBCAST: **********************************************************************************/ static void reply_txbe_bc_mode(char * arg) { std::string package = ""; std::string cmd = "TXBEBCAST:"; package.assign(cmd); if(bcast_tx_buffer_empty_flag) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TNC: FLDIGI returns TNC:FLDIGI **********************************************************************************/ static void reply_tnc_name(char * arg) { std::string package = ""; std::string cmd = "TNC:"; package.assign(cmd).append("FLDIGI ").append(PACKAGE_VERSION); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TRXS: FLDIGI returns TRXSQ: **********************************************************************************/ static void reply_trx_state(char * arg) { std::string package = ""; std::string cmd = "TRXS:"; package.assign(cmd); if((trx_state == STATE_TX) || (trx_state == STATE_TUNE)) package.append("TX"); else package.append("RX"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDRX: FLDIGI returns RSIDRXQ: **********************************************************************************/ static void reply_rsid_rx_state(char * arg) { std::string package = ""; std::string cmd = "RSIDRX:"; package.assign(cmd); if(progdefaults.rsid) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDTX: FLDIGI returns RSIDTXQ: **********************************************************************************/ static void reply_rsid_tx_state(char * arg) { std::string package = ""; std::string cmd = "RSIDTX:"; package.assign(cmd); if(progdefaults.TransmitRSid) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TXLOCK: FLDIGI TXLOCK: or without arg return lock state. **********************************************************************************/ static void set_reply_tx_lock(char * arg) { if(!arg) return; std::string strarg = ""; std::string package = ""; std::string cmd = "TXLOCK:"; strarg.assign(arg); if(strarg.empty()) { package.assign(cmd); if (!active_modem) package.append("INOP"); else if(active_modem->freqlocked()) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); return; } if (!active_modem) return; if(strarg.find("ON") != std::string::npos) { active_modem->set_freqlock(true); REQ(set_button, (Fl_Button *) wf->xmtlock, 1); return; } if(strarg.find("OFF") != std::string::npos) { active_modem->set_freqlock(false); REQ(set_button, (Fl_Button *) wf->xmtlock, 0); return; } } /********************************************************************************** * WFF: FLDIGI returns WFFQ: (0-4000) Current waterfall limit **********************************************************************************/ static void reply_wf_freq_pos(char * arg) { std::string package = ""; std::string cmd = "WFF:"; char buff[32]; package.assign(cmd); memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff) - 1, "%d", (int) active_modem->get_txfreq()); package.append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDM: FLDIGI returns RSIDMQ:, **********************************************************************************/ static void reply_rsid_mode_state(char * arg) { std::string package = ""; std::string cmd = "RSIDM:"; package.assign(cmd); if(progdefaults.rsidWideSearch) package.append("BANDPASS,"); else package.append("MODEM,"); if(progdefaults.rsid_notify_only) package.append("NOTIFY"); else package.append("ACTIVE"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * MODEM: FLDIGI returns MODEMQ: // Current Modem **********************************************************************************/ static void reply_active_modem(char * arg) { std::string package = ""; std::string cmd = "MODEM:"; int mode = active_modem->get_mode(); package.assign(cmd); package.append(mode_info[mode].sname); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * HOST: Sent from FLDIGI to instuct the HOST program to return it's name and * version number. **********************************************************************************/ static void host_name(char *arg) { if(arg) { if(*arg) { host_name_string.assign(arg); LOG_INFO("%s", host_name_string.c_str()); } } } /********************************************************************************** * MODEMBW: FLDIGI returns MODEMBWQ: // Current Modem Bandwidth **********************************************************************************/ static void reply_active_modem_bw(char * arg) { std::string package = ""; std::string cmd = "MODEMBW:"; char buff[32]; memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff) - 1, "%d", (int) active_modem->get_bandwidth()); package.assign(cmd).append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * WFBW: FLDIGI returns WFBWQ:, **********************************************************************************/ static void reply_waterfall_bw(char * arg) { std::string package = ""; std::string cmd = "WFBW:"; char buff[32]; memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff) - 1, "%d,%d", (int) progdefaults.LowFreqCutoff, progdefaults.HighFreqCutoff ); package.assign(cmd).append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * MODEML: FLDIGI returns MODEML:Modem1,Modem2,... * A List of comma delimited modem ID strings. **********************************************************************************/ static void reply_modem_list(char * arg) { int index = 0; int count = 0; std::string package = ""; std::string cmd = "MODEML:"; package.assign(cmd); count = availabe_kiss_modems.size(); for(index = 0; index < count - 1; index++) package.append(availabe_kiss_modems[index]).append(","); package.append(availabe_kiss_modems[index]); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TXBUF: FLDIGI returns TXBUFQ: **********************************************************************************/ static void reply_tx_buffer_count(char * arg) { char *buffer = (char *)0; unsigned int buffer_size = 64; unsigned tx_buffer_count = 0; std::string package = ""; std::string cmd = "TXBUF:"; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("%s", "Buffer allocation Error"); return; } { guard_lock to_radio_lock(&to_radio_mutex); tx_buffer_count = to_radio.size(); } memset(buffer, 0, buffer_size); snprintf(buffer, buffer_size - 1, "%u", tx_buffer_count); package.assign(cmd).append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); if(buffer) delete [] buffer; } /********************************************************************************** * SQL: // SQL On/Off **********************************************************************************/ static void set_sql_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_sql_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnSQL, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnSQL, 0); return; } } /********************************************************************************** * SQL: FLDIGI returns SQLQ: **********************************************************************************/ static void reply_sql_on_off(char * arg) { std::string package = ""; std::string cmd = "SQL:"; package.assign(cmd); if(progStatus.sqlonoff) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * SQLP:<0-100> // Current Symbol Quality Level **********************************************************************************/ static void reply_sql_pwr_level(char * arg) { std::string package = ""; std::string cmd = "SQLP:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.squelch_value); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * SQLS:<0-100> // Set SQL Level (percent) **********************************************************************************/ static void set_sql_level(char * arg) { if(!arg) return; int value = 0; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_sql_level(arg); sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; if(value > 100) value = 100; progStatus.sldrSquelchValue = value; if(!progStatus.kpsql_enabled) REQ(set_slider2, sldrSquelch, value); } /********************************************************************************** * SQLS: FLDIGI returns SQLSQ:<0-100> // Set SQL Level Query (percent) **********************************************************************************/ static void reply_sql_level(char * arg) { std::string package = ""; std::string cmd = "SQLS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.sldrSquelchValue); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * BCHN: // Busy Channel On/Off **********************************************************************************/ static void set_busy_channel_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_busy_channel_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnEnableBusyChannel, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnEnableBusyChannel, 0); return; } } /********************************************************************************** * BCHN: FLDIGI returns BCHNQ: // Busy Channel State On/Off Query **********************************************************************************/ static void reply_busy_channel_on_off(char * arg) { std::string package = ""; std::string cmd = "BCHN:"; package.assign(cmd); if(progdefaults.enableBusyChannel) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * BCHNS<0-999> // Busy Channel Wait Duration (seconds) **********************************************************************************/ static void set_busy_channel_duration(char * arg) { if(!arg) return; int value = 0; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_busy_channel_duration(arg); sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; REQ(set_counter, cntBusyChannelSeconds, value); } /********************************************************************************** * BCHNS: FLDIGI returns BCHNSQ:<0-999> // Busy Channel Wait Duration Query (seconds) **********************************************************************************/ static void reply_busy_channel_duration(char * arg) { std::string package = ""; std::string cmd = "BCHNS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%d", progdefaults.busyChannelSeconds); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * BUSY: FLDIGI returns BUSY: // Modem band pass signal presents **********************************************************************************/ static void reply_busy_state(char * arg) { std::string package = ""; std::string cmd = "BUSY:"; package.assign(cmd); if((trx_state == STATE_TX) || \ (kpsql_pl > kpsql_threshold) || \ (inhibit_tx_seconds)) { package.append("T"); } else { package.append("F"); } kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KPSQL: Depreciated **********************************************************************************/ static void set_kpsql_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_kpsql_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnPSQL, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnPSQL, 0); return; } } /********************************************************************************** * PSM: **********************************************************************************/ static void set_psm_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_psm_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnPSQL, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnPSQL, 0); return; } } /********************************************************************************** * KPSQL: Depreciated **********************************************************************************/ static void reply_kpsql_on_off(char * arg) { std::string package = ""; std::string cmd = "KPSQL:"; package.assign(cmd); if(progStatus.kpsql_enabled) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSM: **********************************************************************************/ static void reply_psm_on_off(char * arg) { std::string package = ""; std::string cmd = "PSM:"; package.assign(cmd); if(progStatus.kpsql_enabled) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KPSQLP:<0-100> Depreciated **********************************************************************************/ static void reply_kpsql_pwr_level(char * arg) { std::string package = ""; std::string cmd = "KPSQLP:"; char buffer[64]; float plevel = 0; float scale = 100.0 / ((float) HISTO_COUNT); package.assign(cmd); if(kpsql_pl > (double) HISTO_COUNT) { plevel = HISTO_COUNT; } else { plevel = kpsql_pl; } plevel *= scale; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) plevel); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSMP:<0-100> **********************************************************************************/ static void reply_psm_pwr_level(char * arg) { std::string package = ""; std::string cmd = "PSMP:"; char buffer[64]; float plevel = 0; float scale = 100.0 / ((float) HISTO_COUNT); package.assign(cmd); if(kpsql_pl > (double) HISTO_COUNT) { plevel = HISTO_COUNT; } else { plevel = kpsql_pl; } plevel *= scale; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) plevel); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSMS:<0-100> **********************************************************************************/ static void set_psm_squelch_level(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_psm_squelch_level(arg); int value = 0; sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; if(value > 100) value = 100; progStatus.sldrPwrSquelchValue = value; if(progStatus.kpsql_enabled) REQ(set_slider2, sldrSquelch, value); } /********************************************************************************** * KPSQLS:<0-100> Depreciated **********************************************************************************/ static void set_kpsql_squelch_level(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_kpsql_squelch_level(arg); int value = 0; sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; if(value > 100) value = 100; progStatus.sldrPwrSquelchValue = value; if(progStatus.kpsql_enabled) REQ(set_slider2, sldrSquelch, value); } /********************************************************************************** * KPSQLS: Depreciated **********************************************************************************/ static void reply_kpsql_squelch_level(char * arg) { std::string package = ""; std::string cmd = "KPSQLS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.sldrPwrSquelchValue); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSMS: **********************************************************************************/ static void reply_psm_squelch_level(char * arg) { std::string package = ""; std::string cmd = "PSMS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.sldrPwrSquelchValue); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KISSRAW: // Enable RAW unaltered data over KISS **********************************************************************************/ static void set_kiss_raw_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_kiss_raw_mode(arg); // Longer compares first if(strarg.find("ONLY") != std::string::npos) { kiss_raw_enabled = KISS_RAW_ONLY; return; } if(strarg.find("ON") != std::string::npos) { kiss_raw_enabled = KISS_RAW_ON; return; } if(strarg.find("OFF") != std::string::npos) { kiss_raw_enabled = KISS_RAW_DISABLED; return; } } /********************************************************************************** * KISSRAW: // Enable RAW unaltered data over KISS **********************************************************************************/ static void reply_kiss_raw_mode(char * arg) { std::string package = ""; std::string cmd = "KISSRAW:"; package.assign(cmd); switch(kiss_raw_enabled) { case KISS_RAW_ONLY: package.append("ONLY"); break; case KISS_RAW_ON: package.append("ON"); break; case KISS_RAW_DISABLED: package.append("OFF"); break; default: return; } kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KISSCRCM: **********************************************************************************/ static void set_crc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_crc_mode(arg); if(strarg.find("SMACK") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC16_CCITT; return; } if(strarg.find("CCITT") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC16_CCITT; return; } if(strarg.find("FCS") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC16_FCS; return; } if(strarg.find("XOR") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC8_XOR; return; } if(strarg.find("NONE") != std::string::npos) { smack_crc_enabled = false; return; } } /********************************************************************************** * KISSCRCM:, **********************************************************************************/ static void reply_crc_mode(char *arg) { std::string package = ""; std::string cmd = "KISSCRCM:"; package.assign(cmd); if(smack_crc_enabled) package.append("SMACK,"); else package.append("NONE,"); switch(crc_mode) { case CRC16_NONE: package.append("NONE"); break; case CRC16_CCITT: package.append("CCITT"); break; case CRC16_FCS: package.append("FCS"); break; case CRC8_XOR: package.append("XOR"); break; default: package.append("UNDEFINED"); } kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDN:NEW_WF_OFFSET,NEW_MODEM,OLD_WF_OFFSET,OLD_MODEM, **********************************************************************************/ bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify) { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); char buffer[256]; char old_modem_name[64]; char new_modem_name[64]; char *notify_str = (char *) ""; KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; std::string package = ""; if(new_mode >= NUM_MODES || old_mode >= NUM_MODES) return false; if(new_mode < 0 || old_mode < 0) return false; if(!(mode_info[new_mode].iface_io & KISS_IO)) return false; if(old_mode != new_mode || new_wf_pos != old_wf_pos) { psm_reset_histogram(); } if(!kiss_bcast_rsid_reception) return true; if(new_wf_pos == 0) { new_wf_pos = old_wf_pos; notify = RSID_KISS_USER; } switch(notify) { case RSID_KISS_NOTIFY: notify_str = (char *) "NOTIFY"; break; case RSID_KISS_ACTIVE: notify_str = (char *) "ACTIVE"; break; case RSID_KISS_USER: notify_str = (char *) "USER"; break; default: LOG_DEBUG("%s", "Unknown KISS frame RSID BC Source"); return false; } // Send all modem names in capital letters memset(old_modem_name, 0, sizeof(old_modem_name)); strncpy(old_modem_name, mode_info[old_mode].sname, sizeof(old_modem_name) - 1); for(size_t i = 0; i < sizeof(old_modem_name); i++) { if(old_modem_name[i]) old_modem_name[i] = toupper(old_modem_name[i]); else break; } memset(new_modem_name, 0, sizeof(new_modem_name)); strncpy(new_modem_name, mode_info[new_mode].sname, sizeof(new_modem_name) - 1); for(size_t i = 0; i < sizeof(new_modem_name); i++) { if(new_modem_name[i]) new_modem_name[i] = toupper(new_modem_name[i]); else break; } memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "RSIDN:%d,%s,%d,%s,%s", new_wf_pos, new_modem_name, \ old_wf_pos, old_modem_name, notify_str); package.assign(buffer); frame = encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no); if(!frame) { LOG_DEBUG("%s", "Broadcast Hardware Frame Assembly Failure"); return true; } kiss_bc_frame.append((const char *) frame->data, (size_t) frame->size); if(frame->data) delete [] frame->data; if(frame) delete frame; return true; } /********************************************************************************** * TRXS: // Transmit to HOST during a state change between RX/TX or TX/RX. **********************************************************************************/ void bcast_trxs_kiss_frame(int state) { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; std::string package; package.assign("TRXS:"); switch(state) { case STATE_RX: package.append("RX") ; break; case STATE_TUNE: case STATE_TX: package.append("TX") ; break; default: LOG_DEBUG("%s", "Unknown Transmit State"); return; } frame = encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no); if(!frame) { LOG_DEBUG("%s", "Broadcast Hardware Frame Assembly Failure"); return; } kiss_bc_frame.append((const char *) frame->data, (size_t) frame->size); if(frame->data) delete [] frame->data; if(frame) delete frame; } /********************************************************************************** * TXBE: // Broadcast empty transmit buffer state **********************************************************************************/ void bcast_tx_buffer_empty_kiss_frame(void) { if(!bcast_tx_buffer_empty_flag) return; guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; std::string package; package.assign("TXBE:"); frame = encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no); if(!frame) { LOG_DEBUG("%s", "Broadcast Hardware Frame Assembly Failure"); return; } kiss_bc_frame.append((const char *) frame->data, (size_t) frame->size); if(frame->data) delete [] frame->data; if(frame) delete frame; } /********************************************************************************** * **********************************************************************************/ static void exec_hardware_command(std::string cmd, std::string arg) { if(cmd.empty()) return; if(kiss_reset_flag) return; int pos = 0; int a = 0; int b = 0; int comp_size = 0; int index = 0; int count = sizeof(exec_match) / sizeof(EXEC_HARDWARE_CMD_MATCH); string cmp = ""; for(index = 0; index < count; index++) { if(exec_match[index].cmd == (char *)0) return; cmp.assign(exec_match[index].cmd); if((pos = cmp.find(cmd)) != (int)(string::npos)) { a = cmp.size(); b = cmd.size(); if(a > b) comp_size = a; else comp_size = b; if(cmd.compare(pos, comp_size, cmp) == 0) { if(exec_match[index].cmd_func) (*exec_match[index].cmd_func)((char *) arg.c_str()); return; } } } } /********************************************************************************** * **********************************************************************************/ static bool kiss_queue_frame(KISS_QUEUE_FRAME * frame, std::string cmd) { if(!frame) { LOG_DEBUG("Null frame (%s)", cmd.c_str()); return false; } if(frame->size == 0 || frame->data == (char *)0) { LOG_DEBUG("Frame null content (%s)", cmd.c_str()); if(frame->data) delete[] frame->data; delete frame; return false; } WriteToHostBuffered((const char *) frame->data, (size_t) frame->size); delete[] frame->data; delete frame; return true; } /********************************************************************************** * **********************************************************************************/ size_t kiss_encode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; char *buffer = (char *)0; buffer_size = (src_size * KISS_BUFFER_FACTOR) + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; buffer[count++] = KISS_FEND; for(index = 0; index < src_size; index++) { byte = (int) src[index] & 0xFF; switch(byte) { case KISS_FESC: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFESC; break; case KISS_FEND: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFEND; break; default: buffer[count++] = byte; } } buffer[count++] = KISS_FEND; *dst = (char *) buffer; return count; } /********************************************************************************** * **********************************************************************************/ size_t kiss_decode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; int last_byte = 0; char *buffer = (char *)0; buffer_size = src_size + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; last_byte = KISS_INVALID; for(index = 0; index < src_size; index++) { byte = src[index] & 0xFF; switch(byte) { case KISS_FEND: continue; case KISS_FESC: break; case KISS_TFEND: if(last_byte == KISS_FESC) buffer[count++] = KISS_FEND; else buffer[count++] = byte; break; case KISS_TFESC: if(last_byte == KISS_FESC) buffer[count++] = KISS_FESC; else buffer[count++] = byte; break; default: buffer[count++] = byte; } last_byte = byte; } *dst = (char *) buffer; return count; } #if 0 /********************************************************************************** * **********************************************************************************/ std::string kiss_decode(std::string frame) { int count = 0; int frame_size = 0; char *dst = (char *)0; static std::string ret_str = ""; if(frame.empty()) return frame; frame_size = frame.size(); ret_str.clear(); ret_str.reserve(frame_size + BUFFER_PADDING); count = kiss_decode((char *) frame.c_str(), frame.size(), &dst); if(count && dst) { ret_str.assign(dst, count); dst[0] = 0; delete [] dst; } return ret_str; } #endif // 0 /********************************************************************************** * **********************************************************************************/ std::string kiss_encode(std::string frame) { int count = 0; int frame_size = 0; char *dst = (char *)0; static std::string ret_str = ""; if(frame.empty()) return frame; frame_size = frame.size(); ret_str.clear(); ret_str.reserve((frame_size * 2) + BUFFER_PADDING); count = kiss_encode((char *) frame.c_str(), frame.size(), &dst); if(count && dst) { ret_str.assign(dst, count); dst[0] = 0; delete [] dst; } return ret_str; } /********************************************************************************** * **********************************************************************************/ size_t hdlc_encode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; char *buffer = (char *)0; buffer_size = (src_size * HDLC_BUFFER_FACTOR) + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; buffer[count++] = ' '; buffer[count++] = KISS_FEND; for(index = 0; index < src_size; index++) { byte = (int) src[index] & 0xFF; if(not_allowed[byte]) { buffer[count++] = HDLC_CNT; if((byte + HDLC_CNT_OFFSET) > 255) buffer[count++] = ((byte - HDLC_CNT_OFFSET) & 0xFF); else buffer[count++] = ((byte + HDLC_CNT_OFFSET) & 0xFF); continue; } switch(byte) { case KISS_FESC: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFESC; break; case KISS_FEND: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFEND; break; case HDLC_CNT: buffer[count++] = KISS_FESC; buffer[count++] = HDLC_TCNT; break; default: buffer[count++] = byte; } } buffer[count++] = KISS_FEND; buffer[count++] = ' '; *dst = (char *) buffer; return count; } /********************************************************************************** * **********************************************************************************/ size_t hdlc_decode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; int last_byte = 0; int check_byte = 0; char *buffer = (char *)0; buffer_size = src_size + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; last_byte = KISS_INVALID; for(index = 0; index < src_size; index++) { byte = src[index] & 0xFF; if(last_byte == HDLC_CNT) { check_byte = byte - HDLC_CNT_OFFSET; if((check_byte > -1) && (check_byte < 256) && not_allowed[check_byte]) { buffer[count++] = check_byte; last_byte = byte; continue; } check_byte = byte + HDLC_CNT_OFFSET; if((check_byte > -1) && (check_byte < 256) && not_allowed[check_byte]) { buffer[count++] = check_byte; } last_byte = byte; continue; } switch(byte) { case KISS_FEND: continue; case KISS_FESC: case HDLC_CNT: last_byte = byte; continue; case KISS_TFEND: if(last_byte == KISS_FESC) byte = KISS_FEND; break; case KISS_TFESC: if(last_byte == KISS_FESC) byte = KISS_FESC; break; case HDLC_TCNT: if(last_byte == KISS_FESC) byte = HDLC_CNT; break; } last_byte = buffer[count++] = byte; } *dst = (char *) buffer; return count; } /********************************************************************************** * Buffer must be at least twice the size of the data provided + BUFFER_PADDING * data_count: Number of bytes in the buffer to be converted. * Return is the converted byte count. Buffer is overwritten with converted data. **********************************************************************************/ static size_t encap_hdlc_frame(char *buffer, size_t data_count) { if(!buffer || !data_count) { LOG_DEBUG("%s", "Parameter Data Error [NULL]"); return false; } size_t count = 0; unsigned int crc_value = 0; char *kiss_encap = (char *)0; if(progdefaults.ax25_decode_enabled) { ax25_decode((unsigned char *) buffer, data_count, true, true); } crc_value = calc_fcs_crc(buffer, (int) data_count); buffer[data_count++] = CRC_LOW(crc_value); buffer[data_count++] = CRC_HIGH(crc_value); count = hdlc_encode(buffer, data_count, &kiss_encap); if(kiss_encap && count) { memcpy(buffer, kiss_encap, count); #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, count); #endif delete [] kiss_encap; } else { LOG_DEBUG("%s", "Kiss Encode Memory Allocation Error"); return 0; } return count; } /********************************************************************************* * Buffer is presently larger then what will be returned. * data_count: Number of bytes in the buffer to process. * Returns the converted byte count. Buffer is over written with converted data. *********************************************************************************/ static size_t decap_hdlc_frame(char *buffer, size_t data_count) { if(!buffer || !data_count) { LOG_DEBUG("%s", "Parameter Data Error/NULL"); return false; } size_t count = 0; // size_t index = 0; unsigned int crc_value = 0; unsigned int calc_crc_value = 0; char *kiss_decap = (char *)0; count = hdlc_decode(buffer, data_count, &kiss_decap); #ifdef EXTENED_DEBUG_INFO if(data_count && buffer) LOG_HEX(buffer, data_count); if(count && kiss_decap) LOG_HEX(kiss_decap, count); #endif do { if(count > data_count || !kiss_decap) { LOG_DEBUG("%s", "Kiss decode error"); count = 0; break; } if(count > 2) count -= 2; if(count) { calc_crc_value = calc_fcs_crc(kiss_decap, (int) count); } else { LOG_DEBUG("%s", "Kiss decode error"); count = 0; break; } crc_value = CRC_LOW_HIGH(kiss_decap[count], kiss_decap[count + 1]); if(crc_value != calc_crc_value) { count = 0; break; } temp_disable_tx_inhibit = time(0) + DISABLE_TX_INHIBIT_DURATION; // valid packet, disable busy channel inhitbit for x duration. kiss_decap[count] = kiss_decap[count + 1] = 0; memcpy(buffer, kiss_decap, count); if(progdefaults.ax25_decode_enabled) { ax25_decode((unsigned char *) buffer, count, true, false); } break; } while(1); if(kiss_decap) { kiss_decap[0] = 0; delete [] kiss_decap; } return count; } /********************************************************************************** * **********************************************************************************/ static KISS_QUEUE_FRAME *encap_kiss_frame(char *buffer, size_t buffer_size, int frame_type, int port) { guard_lock kfenc(&kiss_encode_mutex); if(!buffer || buffer_size < 1) { LOG_DEBUG("%s", "KISS encap argument 'data' contains no data"); return (KISS_QUEUE_FRAME *)0; } if(port > 0xF || port < 0) { LOG_DEBUG("Invalid KISS port number (%d)", port); return (KISS_QUEUE_FRAME *)0; } switch(frame_type) { case KISS_DATA: case KISS_RAW: case KISS_TXDELAY: case KISS_PERSIST: case KISS_SLOTTIME: case KISS_TXTAIL: case KISS_DUPLEX: case KISS_HARDWARE: break; default: LOG_DEBUG("Invalid KISS frame type (%d)", frame_type); return (KISS_QUEUE_FRAME *)0; } int size = 0; int index = 0; unsigned int crc_value = 0; KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; frame = new KISS_QUEUE_FRAME; if(!frame) { LOG_DEBUG("%s", "KISS struct frame memory allocation error"); return (KISS_QUEUE_FRAME *)0; } size = (buffer_size * KISS_BUFFER_FACTOR) + BUFFER_PADDING; // Resulting data space could be 2 fold higher. frame->data = (char *) new char[size]; if(!frame->data) { delete frame; LOG_DEBUG("%s", "KISS buffer frame memory allocation error"); return (KISS_QUEUE_FRAME *)0; } memset(frame->data, 0, size); size = buffer_size; frame->data[0] = SET_KISS_TYPE_PORT(frame_type, port); memcpy(&frame->data[1], buffer, size); size++; if((frame_type == KISS_DATA) || (frame_type == KISS_RAW)) { if(smack_crc_enabled) { frame->data[0] = SMACK_CRC_ASSIGN(frame->data[0]); switch(crc_mode) { case CRC16_CCITT: crc_value = calc_ccitt_crc((char *) frame->data, size); frame->data[size++] = CRC_LOW(crc_value); frame->data[size++] = CRC_HIGH(crc_value); break; case CRC16_FCS: crc_value = calc_fcs_crc((char *) frame->data, size); frame->data[size++] = CRC_LOW(crc_value); frame->data[size++] = CRC_HIGH(crc_value); break; case CRC8_XOR: crc_value = calc_xor_crc((char *) frame->data, size); frame->data[size++] = CRC_LOW(crc_value); break; default: break; } } } char *tmp = (char *)0; index = kiss_encode((char *) frame->data, size, &tmp); if(tmp) { #ifdef EXTENED_DEBUG_INFO LOG_HEX(tmp, index); #endif frame->data[0] = 0; delete [] frame->data; frame->data = (char *) tmp; frame->size = index; } else { LOG_DEBUG("KISS encode allocation error near line %d", __LINE__); delete [] frame->data; delete frame; frame = (KISS_QUEUE_FRAME *)0; } return frame; } /********************************************************************************** * **********************************************************************************/ static KISS_QUEUE_FRAME * encap_kiss_frame(std::string data, int frame_type, int port) { if(data.empty()) return (KISS_QUEUE_FRAME *)0; return encap_kiss_frame((char *) data.c_str(), (size_t) data.size(), frame_type, port); } /********************************************************************************** * **********************************************************************************/ std::string unencap_kiss_frame(char *buffer, size_t buffer_size, int *frame_type, int *kiss_port_no) { if(!buffer || buffer_size < 1 || !frame_type || !kiss_port_no) return std::string(""); char *decoded_buffer = (char *)0; size_t count = 0; unsigned int crc_extracted = 0; unsigned int crc_calc = 0; unsigned int port = 0; unsigned int ftype = 0; static std::string ret_str = ""; ret_str.clear(); #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, buffer_size); #endif count = kiss_decode(buffer, buffer_size, &decoded_buffer); if(!count || !decoded_buffer) { LOG_DEBUG("Kiss decoder memory allocation error near line %d", __LINE__); return ret_str; } ftype = KISS_CMD(decoded_buffer[0]); port = KISS_PORT(decoded_buffer[0]); if((ftype == KISS_DATA) || (ftype == KISS_RAW)) { smack_crc_enabled = SMACK_CRC(port); port = SMACK_CRC_MASK(port); if(smack_crc_enabled) { switch(crc_mode) { case CRC16_CCITT: count -= 2; if(count > 2) { crc_calc = calc_ccitt_crc(decoded_buffer, count); crc_extracted = CRC_LOW_HIGH(decoded_buffer[count], decoded_buffer[count + 1]); } else { crc_calc = crc_extracted + 1; // Force a fail } break; case CRC16_FCS: count -= 2; if(count > 2) { crc_calc = calc_fcs_crc(decoded_buffer, count); crc_extracted = CRC_LOW_HIGH(decoded_buffer[count], decoded_buffer[count + 1]); } else { crc_calc = crc_extracted + 1; } break; case CRC8_XOR: count -= 1; if(count > 1) { crc_calc = CRC_LOW(calc_fcs_crc(decoded_buffer, count)); crc_extracted = CRC_LOW(decoded_buffer[count]); } else { crc_calc = crc_extracted + 1; } break; default: LOG_DEBUG("CRC type not found %d", crc_mode); } if(crc_calc != crc_extracted) { if(frame_type) *frame_type = ftype; if(kiss_port_no) *kiss_port_no = port; if(decoded_buffer) delete [] decoded_buffer; ret_str.clear(); return ret_str; } } } if(count > 0) count--; #ifdef EXTENED_DEBUG_INFO LOG_HEX(&decoded_buffer[1], count); #endif ret_str.assign(&decoded_buffer[1], count); if(frame_type) *frame_type = ftype; if(kiss_port_no) *kiss_port_no = port; if(decoded_buffer) delete [] decoded_buffer; return ret_str; } /********************************************************************************** * **********************************************************************************/ std::string unencap_kiss_frame(std::string package, int *frame_type, int *kiss_port_no) { if(package.empty() || !frame_type || !kiss_port_no) return std::string(""); return unencap_kiss_frame((char *) package.c_str(), (size_t) package.size(), frame_type, kiss_port_no); } /********************************************************************************** * **********************************************************************************/ static void parse_hardware_frame(std::string frame) { if(frame.empty()) return; string cmd = ""; string arg = ""; static char buffer[512]; string parse_frame = ""; char bofmsg[] = "Temp Buffer overflow"; size_t count = frame.size(); size_t index = 0; size_t pos = 0; size_t j = 0; parse_frame.assign(frame); #ifdef EXTENED_DEBUG_INFO LOG_HEX(frame.c_str(), frame.size()); #endif do { if(kiss_reset_flag) return; pos = parse_frame.find(":"); if(pos == string::npos) return; j = 0; memset(buffer, 0, sizeof(buffer)); for(index = 0; index < pos; index++) { if(parse_frame[index] <= ' ') continue; buffer[j++] = toupper(parse_frame[index]); if(j >= sizeof(buffer)) { LOG_DEBUG("%s", bofmsg); return; } } cmd.assign(buffer); j = 0; memset(buffer, 0, sizeof(buffer)); for(index = pos + 1; index < count; index++) { if(parse_frame[index] <= ' ') break; buffer[j++] = parse_frame[index]; if(j >= sizeof(buffer)) { LOG_DEBUG("%s", bofmsg); return; } } arg.assign(buffer); if(cmd.empty()) return; exec_hardware_command(cmd, arg); if(index > count) index = count; parse_frame.erase(0, index); count = parse_frame.size(); } while(count > 0); } /********************************************************************************** * **********************************************************************************/ static void parse_kiss_frame(std::string frame_segment) { guard_lock kiss_rx_lock(&kiss_frame_mutex); unsigned int cur_byte = KISS_INVALID; unsigned int frame_size = 0; unsigned int index = 0; unsigned int fend_count = 0; unsigned int cmsa_data = 0; int buffer_size = 0; int port_no = KISS_INVALID; int frame_type = KISS_INVALID; int data_count = 0; bool process_one_frame = false; char *buffer = (char *)0; kiss_frame.append(frame_segment); while(1) { if(kiss_frame.empty()) return; frame_size = kiss_frame.size(); process_one_frame = false; fend_count = 0; kiss_one_frame.clear(); for(index = 0; index < frame_size; index++) { cur_byte = kiss_frame[index] & 0xFF; if(cur_byte == KISS_FEND) { fend_count++; } if(fend_count) { kiss_one_frame += cur_byte; } if(fend_count == 2) { kiss_frame.erase(0, index); process_one_frame = true; break; } } if(!process_one_frame) return; frame_size = kiss_one_frame.size(); if(frame_size < 3) { continue; // Invalid Frame size } kiss_one_frame = unencap_kiss_frame(kiss_one_frame, &frame_type, &port_no); if(kiss_one_frame.empty()) continue; if(port_no != (int)kiss_port_no) { continue; } switch(frame_type) { case KISS_TXDELAY: case KISS_PERSIST: case KISS_SLOTTIME: case KISS_TXTAIL: case KISS_DUPLEX: cmsa_data = kiss_one_frame[0] & 0xFF; break; case KISS_DATA: if(kiss_raw_enabled == KISS_RAW_ONLY) continue; break; case KISS_RAW: if(kiss_raw_enabled == KISS_RAW_DISABLED) continue; break; case KISS_HARDWARE: break; default: continue; // Unreconized frame_type. } switch(frame_type) { case KISS_DATA: buffer_size = (frame_size * HDLC_BUFFER_FACTOR) + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("%s", "Buffer Allocation Error"); return; } data_count = kiss_one_frame.size(); memset(buffer, 0, buffer_size); memcpy(buffer, kiss_one_frame.c_str(), data_count); data_count = encap_hdlc_frame(buffer, data_count); WriteToRadioBuffered((const char *) buffer, (size_t) data_count); buffer[0] = 0; delete [] buffer; buffer = 0; break; case KISS_RAW: WriteToRadioBuffered((const char *) kiss_one_frame.c_str(), (size_t) kiss_one_frame.size()); break; case KISS_TXDELAY: progStatus.csma_transmit_delay = cmsa_data; progdefaults.csma_transmit_delay = cmsa_data; REQ(update_csma_io_config, (int) CSMA_TX_DELAY); break; case KISS_PERSIST: progStatus.csma_persistance = cmsa_data; progdefaults.csma_persistance = cmsa_data; REQ(update_csma_io_config, (int) CSMA_PERSISTANCE); break; case KISS_SLOTTIME: progStatus.csma_slot_time = cmsa_data; progdefaults.csma_slot_time = cmsa_data; REQ(update_csma_io_config, (int) CSMA_SLOT_TIME); break; case KISS_TXTAIL: break; case KISS_DUPLEX: if(cmsa_data) duplex = KISS_FULL_DUPLEX; else duplex = KISS_HALF_DUPLEX; break; case KISS_HARDWARE: parse_hardware_frame(kiss_one_frame); break; } } // while(1) } /********************************************************************************** * **********************************************************************************/ static void WriteToHostBuffered(const char *data, size_t size) { guard_lock to_host_lock(&to_host_mutex); to_host.append(data, size); } /********************************************************************************** * **********************************************************************************/ static void WriteToRadioBuffered(const char *data, size_t size) { guard_lock to_radio_lock(&to_radio_mutex); if(!data || size < 1) return; set_tx_timeout(); to_radio.append(data, size); } /********************************************************************************** * Must be call in WriteToRadioBuffered() and no other. **********************************************************************************/ inline void set_tx_timeout(void) { if(to_radio.empty()) { transmit_buffer_flush_timeout = time(0) + TX_BUFFER_TIMEOUT; } } /********************************************************************************** * **********************************************************************************/ void flush_kiss_tx_buffer(void) { int data_count = 0; { guard_lock to_host_lock(&to_radio_mutex); kiss_text_available = false; pText = 0; data_count = to_radio.size(); if(data_count) to_radio.clear(); } if(data_count) bcast_tx_buffer_empty_kiss_frame(); } /********************************************************************************** * **********************************************************************************/ static void WriteToHostARQBuffered(void) { std::string arq_data = ""; { guard_lock to_host_arq_lock(&to_host_arq_mutex); int data_available = to_arq_host.size(); if(kiss_raw_enabled == KISS_RAW_DISABLED) { if(data_available) { to_arq_host.clear(); } return; } if(data_available < 1) return; #ifdef EXTENED_DEBUG_INFO LOG_HEX(to_arq_host.c_str(), to_arq_host.size()); #endif arq_data.assign(to_arq_host); to_arq_host.clear(); } kiss_queue_frame(encap_kiss_frame(arq_data, KISS_RAW, kiss_port_no), string("ARQ")); } /********************************************************************************** * **********************************************************************************/ static void *ReadFromHostSocket(void *args) { if(!kiss_socket) return (void *)0; static char buffer[2048]; string str_buffer; size_t count = 0; Socket *tmp_socket = (Socket *)0; memset(buffer, 0, sizeof(buffer)); str_buffer.reserve(sizeof(buffer)); if(progStatus.kiss_tcp_io && progStatus.kiss_tcp_listen) { tmp_socket = kiss_socket->accept2(); kiss_socket->shut_down(); kiss_socket->close(); if(tmp_socket) kiss_socket = tmp_socket; tmp_socket = 0; } LOG_INFO("%s", "Kiss RX loop started. "); kiss_rx_exit = false; kiss_rx_loop_running = true; while(!kiss_rx_exit) { memset(buffer, 0, sizeof(buffer)); try { if(progStatus.kiss_tcp_io) count = kiss_socket->recv((void *) buffer, sizeof(buffer) - 1); else count = kiss_socket->recvFrom((void *) buffer, sizeof(buffer) - 1); } catch (...) { if (errno) LOG_INFO("recv/recvFrom Socket Error %d", errno); count = 0; if(!tcpip_reset_flag) { kiss_tcp_disconnect((char *)""); } break; } if(count && (data_io_enabled == KISS_IO)) { #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, count); #endif guard_lock from_host_lock(&from_host_mutex); from_host.append(buffer, count); } } LOG_INFO("%s", "Kiss RX loop exit. "); kiss_rx_loop_running = false; return (void *)0; } extern Fl_Slider2 *sldrSquelch; extern Progress *pgrsSquelch; /********************************************************************************** * **********************************************************************************/ static void *kiss_loop(void *args) { SET_THREAD_ID(KISS_TID); int old_trx_state = STATE_TX; LOG_INFO("%s", "Kiss loop started. "); kiss_loop_running = true; while(!kiss_exit){ MilliSleep(100); if(data_io_enabled != KISS_IO) { kiss_text_available = false; kiss_reset_buffers(); continue; } if(old_trx_state != trx_state) { if(kiss_bcast_trx_toggle) { switch(trx_state) { case STATE_TX: case STATE_RX: case STATE_TUNE: bcast_trxs_kiss_frame(trx_state); default : break; } } old_trx_state = trx_state; } ReadFromHostBuffered(); ReadFromRadioBuffered(); WriteToHostBCastFramesBuffered(); WriteToHostARQBuffered(); WriteToHostSocket(); if(!to_radio.empty()) { kiss_text_available = true; active_modem->set_stopflag(false); trx_transmit(); } } kiss_loop_running = false; // exit the kiss thread return NULL; } /********************************************************************************** * **********************************************************************************/ void WriteKISS(const char data) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); from_radio += data; } if(kiss_raw_enabled != KISS_RAW_DISABLED) { guard_lock to_host_arq_lock(&to_host_arq_mutex); to_arq_host += data; } } /********************************************************************************** * **********************************************************************************/ void WriteKISS(const char *data) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); if(data) from_radio.append(data); } { guard_lock to_host_arq_lock(&to_host_arq_mutex); if(data && (kiss_raw_enabled != KISS_RAW_DISABLED)) to_arq_host.append(data); } } /********************************************************************************** * **********************************************************************************/ void WriteKISS(const char *data, size_t size) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); if(data && size) { from_radio.append(data, size); } } { guard_lock to_host_arq_lock(&to_host_arq_mutex); if(data && size && (kiss_raw_enabled != KISS_RAW_DISABLED)) { to_arq_host.append(data, size); } } } /********************************************************************************** * **********************************************************************************/ void WriteKISS(std::string data) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); if(!data.empty()) { from_radio.append(data); } } { guard_lock to_host_arq_lock(&to_host_arq_mutex); if(!data.empty() && (kiss_raw_enabled != KISS_RAW_DISABLED)) { to_arq_host.append(data); } } } /********************************************************************************** * **********************************************************************************/ void WriteToHostSocket(void) { guard_lock to_host_lock(&to_host_mutex); size_t count = 0; if(to_host.empty()) return; if(kiss_socket && data_io_enabled == KISS_IO) { try { if(progStatus.kiss_tcp_io) count = kiss_socket->send(to_host.c_str(), to_host.size()); else count = kiss_socket->sendTo(to_host.c_str(), to_host.size()); #ifdef EXTENED_DEBUG_INFO LOG_HEX(to_host.c_str(), to_host.size()); #endif } catch (...) { if(kiss_reset_flag == false) { kiss_tcp_disconnect((char *)""); } LOG_INFO("Write error error to KISS socket: %d", static_cast(count)); } } to_host.clear(); } /********************************************************************************** * **********************************************************************************/ static void ReadFromHostBuffered(void) { if(!kiss_socket) return; guard_lock from_host_lock(&from_host_mutex); if(from_host.empty()) return; #ifdef EXTENED_DEBUG_INFO LOG_HEX(from_host.c_str(), from_host.size()); #endif parse_kiss_frame(from_host); from_host.clear(); } /********************************************************************************** * **********************************************************************************/ void ReadFromRadioBuffered(void) { if(kiss_reset_flag) return; guard_lock from_radio_lock(&from_radio_mutex); if(from_radio.empty()) return; int pos = 0; int pos2 = 0; // unsigned int crc = 0; KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; static char frame_marker[2] = { (char)(KISS_FEND), 0 }; std::string one_frame = ""; pos = from_radio.find(frame_marker); if(pos == (int)(std::string::npos)) { from_radio.clear(); return; } if(pos != 0) { from_radio.erase(0, pos); pos = 0; } pos2 = from_radio.find(frame_marker, pos + 1); if(pos2 != (int)(std::string::npos)) { one_frame.assign(from_radio, pos, pos2 - pos + 1); } else { if(from_radio.size() > MAX_TEMP_BUFFER_SIZE) from_radio.clear(); return; } char *buffer = (char *)0; size_t buffer_size = one_frame.size() + BUFFER_PADDING; buffer = new char [buffer_size]; if(!buffer) { LOG_DEBUG("Memory Allocation Error Near Line No. %d", __LINE__); goto EXIT; } memset(buffer, 0, buffer_size); buffer_size = one_frame.size(); memcpy(buffer, one_frame.c_str(), buffer_size); #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, buffer_size); #endif buffer_size = decap_hdlc_frame(buffer, buffer_size); if(buffer_size) { from_radio.erase(pos, pos2 - pos + 1); if(kiss_raw_enabled != KISS_RAW_ONLY) { frame = encap_kiss_frame(buffer, buffer_size, KISS_DATA, kiss_port_no); if(!frame || !frame->data) { LOG_DEBUG("Frame Allocation Error Near Line %d", __LINE__); goto EXIT; } WriteToHostBuffered((const char *) frame->data, (size_t) frame->size); } } else { from_radio.erase(pos, pos + 1); } EXIT:; if(frame) { if(frame->data) { frame->data[0] = 0; delete [] frame->data; } delete frame; } if(buffer) { buffer[0] = 0; delete [] buffer; } } /********************************************************************************** * **********************************************************************************/ void WriteToHostBCastFramesBuffered(void) { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); if(kiss_bc_frame.empty()) return; WriteToHostBuffered((const char *) kiss_bc_frame.c_str(), (size_t) kiss_bc_frame.size()); #ifdef EXTENED_DEBUG_INFO LOG_HEX(kiss_bc_frame.c_str(), (size_t) kiss_bc_frame.size()); #endif kiss_bc_frame.clear(); } /********************************************************************************** * **********************************************************************************/ bool tcp_init(bool connect_flag) { if(progdefaults.kiss_address.empty() || progdefaults.kiss_io_port.empty()) { LOG_DEBUG("%s", "KISS IP Address or Port null"); return false; } kiss_ip_address.assign(progdefaults.kiss_address); kiss_ip_io_port.assign(progdefaults.kiss_io_port); kiss_ip_out_port.assign(progdefaults.kiss_out_port); try { kiss_socket = new Socket(Address(kiss_ip_address.c_str(), kiss_ip_io_port.c_str(), "tcp")); kiss_socket->set_autoclose(true); kiss_socket->set_nonblocking(false); if(progdefaults.kiss_tcp_listen) kiss_socket->bind(); } catch (const SocketException& e) { LOG_ERROR("Could not resolve %s: %s", kiss_ip_address.c_str(), e.what()); if(kiss_socket) { kiss_socket->shut_down(); kiss_socket->close(); delete kiss_socket; kiss_socket = 0; kiss_enabled = 0; } return false; } if(connect_flag) { if(kiss_socket->connect1() == false) { LOG_INFO("Connection Failed: Host program present?"); kiss_socket->shut_down(); kiss_socket->close(); delete kiss_socket; kiss_socket = 0; kiss_enabled = 0; return false; } } return true; } /********************************************************************************** * **********************************************************************************/ bool udp_init(void) { if(progdefaults.kiss_address.empty() || progdefaults.kiss_io_port.empty()) { LOG_DEBUG("%s", "KISS IP Address or Port null"); return false; } kiss_ip_address.assign(progdefaults.kiss_address); kiss_ip_io_port.assign(progdefaults.kiss_io_port); kiss_ip_out_port.assign(progdefaults.kiss_out_port); try { kiss_socket = new Socket(Address(kiss_ip_address.c_str(), kiss_ip_io_port.c_str(), "udp")); kiss_socket->dual_port(&progdefaults.kiss_dual_port_enabled); kiss_socket->set_dual_port_number(kiss_ip_out_port); kiss_socket->set_autoclose(true); kiss_socket->set_nonblocking(false); if(progdefaults.kiss_tcp_listen) // Listen flag indcates server mode. kiss_socket->bindUDP(); } catch (const SocketException& e) { LOG_ERROR("Could not resolve %s: %s", kiss_ip_address.c_str(), e.what()); if(kiss_socket) { kiss_socket->shut_down(); kiss_socket->close(); delete kiss_socket; kiss_socket = 0; kiss_enabled = 0; } return false; } return true; } /********************************************************************************** * **********************************************************************************/ void kiss_reset_buffers(void) { { guard_lock to_host_lock(&to_host_mutex); if(!to_host.empty()) to_host.clear(); } { guard_lock to_host_lock(&from_radio_mutex); if(!from_radio.empty()) from_radio.clear(); } { guard_lock to_host_lock(&to_radio_mutex); pText = 0; kiss_text_available = false; if(!to_radio.empty()) to_radio.clear(); } { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); if(!kiss_bc_frame.empty()) kiss_bc_frame.clear(); } } /********************************************************************************** * **********************************************************************************/ void kiss_reset(void) { kiss_reset_flag = true; kiss_text_available = false; duplex = KISS_HALF_DUPLEX; crc_mode = CRC16_NONE; smack_crc_enabled = false; pText = 0; if(data_io_enabled == KISS_IO) data_io_enabled = DISABLED_IO; MilliSleep(1000); kiss_reset_buffers(); if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); } kiss_reset_flag = false; if(data_io_enabled == DISABLED_IO) data_io_enabled = KISS_IO; } /********************************************************************************** * **********************************************************************************/ void kiss_init(bool connect_flag) { kiss_enabled = false; kiss_exit = false; tcpip_reset_flag = false; // progStatus.data_io_enabled (widget state), data_io_enabled (program state) if(progStatus.data_io_enabled == KISS_IO) { if(!(active_modem->iface_io() & KISS_IO)) { set_default_kiss_modem(); } } if(init_hist_flag) { memset(histogram, 0, sizeof(histogram)); init_hist_flag = false; } srand(time(0)); // For CSMA persistance update_kpsql_fractional_gain(progdefaults.kpsql_attenuation); data_io_type = DATA_IO_NA; if(progStatus.kiss_tcp_io) { if(retry_count > KISS_CONNECT_RETRY_COUNT) retry_count = KISS_CONNECT_RETRY_COUNT; if(progStatus.kiss_tcp_listen) connect_flag = false; do { if(tcp_init(connect_flag)) break; if(progStatus.kiss_tcp_listen) return; MilliSleep(KISS_RETRY_WAIT_TIME); if(retry_count-- > 0) continue; else return; } while(1); LOG_INFO("%s", "TCP Init - OK"); } else { if(!udp_init()) return; LOG_INFO("%s", "UDP Init - OK"); } Fl::awake(kiss_io_set_button_state, (void *) IO_START_STR); kiss_loop_running = false; if (pthread_create(&kiss_thread, NULL, kiss_loop, NULL) < 0) { LOG_ERROR("KISS kiss_thread: pthread_create failed"); return; } kiss_rx_loop_running = false; if (pthread_create(&kiss_rx_socket_thread, NULL, ReadFromHostSocket, NULL) < 0) { LOG_ERROR("KISS kiss_rx_socket_thread: pthread_create failed"); kiss_exit = true; pthread_join(kiss_thread, NULL); return; } if(progStatus.kiss_tcp_io) { data_io_type = DATA_IO_TCP; kiss_watchdog_running = false; if (pthread_create(&kiss_watchdog_thread, NULL, tcpip_watchdog, NULL) < 0) { LOG_ERROR("KISS kiss_watchdog_thread: pthread_create failed"); } } else { data_io_type = DATA_IO_UDP; } Fl::awake(kiss_io_set_button_state, (void *) IO_STOP_STR); if(progdefaults.data_io_enabled == KISS_IO) data_io_enabled = KISS_IO; kiss_enabled = true; allow_kiss_socket_io = true; } /********************************************************************************** * **********************************************************************************/ static void *tcpip_watchdog(void *args) { kiss_watchdog_running = true; kiss_watchdog_exit = false; struct timespec timeout; struct timeval tp; std::string package = ""; std::string cmd = "HOST:"; package.assign(cmd); memset(&timeout, 0, sizeof(timeout)); LOG_INFO("%s", "TCP/IP watch dog started"); kiss_watchdog_running = true; while(!kiss_watchdog_exit) { gettimeofday(&tp, NULL); timeout.tv_sec = tp.tv_sec + TEST_INTERVAL_SECONDS; timeout.tv_nsec = tp.tv_usec * 1000; pthread_mutex_lock(&kiss_loop_exit_mutex); pthread_cond_timedwait(&kiss_watchdog_cond, &kiss_loop_exit_mutex, &timeout); pthread_mutex_unlock(&kiss_loop_exit_mutex); // Send somthing every once in awhile to check if other side is still connected. // Data transfer fail handled by the data transfer routines. if(kiss_socket && !tcpip_reset_flag) if(kiss_socket->is_connected()) kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } kiss_watchdog_running = false; LOG_INFO("%s", "TCP/IP watch dog stopped"); return (void *)0; } /********************************************************************************** * **********************************************************************************/ void kiss_main_thread_close(void *ptr) { kiss_close(true); } /********************************************************************************** * Only called from the main thread. **********************************************************************************/ void kiss_close(bool override_flag) { int max_loops = 100; int loop_delay_ms = 10; if(tcpip_reset_flag && !override_flag) return; if(kiss_socket) { if(kiss_socket->is_connected()) { kiss_reset_buffers(); send_disconnect_msg(); MilliSleep(500); // Wait a short period for outstanding // messages to be sent. } } else { return; } tcpip_reset_flag = true; kiss_text_available = false; allow_kiss_socket_io = false; if(data_io_type == DATA_IO_TCP && kiss_watchdog_running) { kiss_watchdog_exit = true; pthread_cond_signal(&kiss_watchdog_cond); for(int i = 0; i < max_loops; i++) { if(kiss_watchdog_running == false) break; MilliSleep(loop_delay_ms); } if(!kiss_watchdog_running) { pthread_join(kiss_watchdog_thread, NULL); LOG_INFO("%s", "kiss_watchdog_running - join"); } else { CANCEL_THREAD(kiss_watchdog_thread); LOG_INFO("%s", "kiss_watchdog_running - cancel"); } } if(data_io_enabled == KISS_IO) { data_io_enabled = DISABLED_IO; data_io_type = DATA_IO_NA; } kiss_rx_exit = true; if(kiss_socket) { kiss_socket->shut_down(); kiss_socket->close(); } for(int i = 0; i < max_loops; i++) { if(kiss_rx_loop_running == false) break; MilliSleep(loop_delay_ms); } if(!kiss_rx_loop_running) { pthread_join(kiss_rx_socket_thread, NULL); LOG_INFO("%s", "kiss_rx_loop_running - join"); } else { CANCEL_THREAD(kiss_rx_socket_thread); LOG_INFO("%s", "kiss_rx_loop_running - cancel"); } kiss_exit = 1; for(int i = 0; i < max_loops; i++) { if(kiss_loop_running == false) break; MilliSleep(loop_delay_ms); } if(!kiss_loop_running) { pthread_join(kiss_thread, NULL); LOG_INFO("%s", "kiss_loop_running - join"); } else { CANCEL_THREAD(kiss_thread); LOG_INFO("%s", "kiss_loop_running - cancel"); } LOG_INFO("%s", "Kiss loop terminated. "); kiss_socket = 0; kiss_enabled = false; kiss_loop_running = false; kiss_rx_loop_running = false; kiss_watchdog_running = false; Fl::awake(kiss_io_set_button_state, (void *) IO_START_STR); tcpip_reset_flag = false; if((retry_count > 0) && progStatus.kiss_tcp_io) Fl::awake(kiss_main_thread_retry_open, (void *) 0); } /********************************************************************************** * **********************************************************************************/ void kiss_main_thread_retry_open(void *ptr) { if(!progStatus.kiss_tcp_listen) MilliSleep(KISS_RETRY_WAIT_TIME); connect_to_kiss_io(false); } /********************************************************************************** * **********************************************************************************/ void connect_to_kiss_io(bool user_requested) { guard_lock external_lock(&restart_mutex); if(kiss_socket) { if(user_requested) retry_count = 0; kiss_close(true); if(user_requested) return; } if(user_requested || progStatus.kiss_tcp_listen) retry_count = KISS_CONNECT_RETRY_COUNT; if(retry_count > 0) { retry_count--; kiss_init(progdefaults.kiss_tcp_listen ? false : true); } } /********************************************************************************** * **********************************************************************************/ bool kiss_thread_running(void) { return (bool) kiss_enabled; } /********************************************************************************** * **********************************************************************************/ int kiss_get_char(void) { /// Mutex is unlocked when returning from function guard_lock to_radio_lock(&to_radio_mutex); int c = 0; static bool toggle_flag = 0; if (kiss_text_available) { if (pText != (int)to_radio.length()) { c = to_radio[pText++] & 0xFF; toggle_flag = true; } else { kiss_text_available = false; to_radio.clear(); pText = 0; c = GET_TX_CHAR_ETX; if(toggle_flag) { bcast_tx_buffer_empty_kiss_frame(); toggle_flag = 0; } } } return c; } fldigi-4.1.06/src/misc/re.cxx0000644000175000017500000000707413472115773012657 00000000000000// ---------------------------------------------------------------------------- // re.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "re.h" using namespace std; re_t::re_t(const char* pattern_, int cflags_) : pattern(pattern_), cflags(cflags_), eflags(0), error(false) { compile(); } re_t::re_t(const re_t& re) : pattern(re.pattern), cflags(re.cflags), eflags(re.eflags), suboffsets(re.suboffsets), substrings(re.substrings) { compile(); } re_t::~re_t() { if (!error) regfree(&preg); } re_t& re_t::operator=(const re_t& rhs) { if (&rhs == this) return *this; pattern = rhs.pattern; cflags = rhs.cflags; eflags = rhs.eflags; suboffsets = rhs.suboffsets; substrings = rhs.substrings; if (!error) regfree(&preg); compile(); return *this; } void re_t::recompile(const char* pattern_) { pattern = pattern_; if (!error) regfree(&preg); compile(); } void re_t::compile(void) { error = regcomp(&preg, pattern.c_str(), cflags); if (!error && !(cflags & REG_NOSUB) && preg.re_nsub > 0) suboffsets.resize(preg.re_nsub + 1); } bool re_t::match(const char* str, int eflags_) { if (error) return false; eflags = eflags_; bool nosub = cflags & REG_NOSUB || preg.re_nsub == 0; bool found = !regexec(&preg, str, (nosub ? 0 : preg.re_nsub+1), (nosub ? NULL : &suboffsets[0]), eflags_); substrings.clear(); if (found && !nosub) { size_t n = suboffsets.size(); substrings.resize(n); for (size_t i = 0; i < n; i++) if (suboffsets[i].rm_so != -1) substrings[i].assign(str + suboffsets[i].rm_so, suboffsets[i].rm_eo - suboffsets[i].rm_so); } return found; } const string& re_t::submatch(size_t n) const { return substrings[n]; } void re_t::suboff(size_t n, int* start, int* end) const { if (n < nsub()) { if (start) *start = suboffsets[n].rm_so; if (end) *end = suboffsets[n].rm_eo; } else { if (start) *start = -1; if (end) *end = -1; } } #if HAVE_STD_HASH # include #elif HAVE_STD_TR1_HASH # include #else # error "No std::hash or std::tr1::hash support" #endif size_t re_t::hash(void) const { #if HAVE_STD_HASH size_t h = std::hash()(pattern); return h ^ (std::hash()(cflags) + 0x9e3779b9 + (h << 6) + (h >> 2)); #elif HAVE_STD_TR1_HASH size_t h = tr1::hash()(pattern); return h ^ (tr1::hash()(cflags) + 0x9e3779b9 + (h << 6) + (h >> 2)); #endif } // ------------------------------------------------------------------------ fre_t::fre_t(const char* pattern_, int cflags_) : re_t(pattern_, cflags_) { } bool fre_t::match(const char* str, int eflags_) { if (error) return false; bool nosub = cflags & REG_NOSUB || preg.re_nsub == 0; return !regexec(&preg, str, (nosub ? 0 : preg.re_nsub+1), (nosub ? NULL : &suboffsets[0]), eflags_); } fldigi-4.1.06/src/misc/debug.cxx0000664000175000017500000002034513507402064013324 00000000000000// ---------------------------------------------------------------------------- // debug.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "timeops.h" #include "icons.h" #include "gettext.h" #include "threads.h" #ifndef FLARQ_VERSION # include "fl_digi.h" #endif static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t debug_hd_mutex = PTHREAD_MUTEX_INITIALIZER; extern Fl_Double_Window *fl_digi_main; extern void update_main_title(); using namespace std; #define MAX_LINES 65536 static FILE* wfile = 0; static FILE* rfile = 0; static int rfd; static bool tty; static Fl_Double_Window* window; static Fl_Browser* btext; static string linebuf; debug* debug::inst = 0; debug::level_e debug::level = debug::INFO_LEVEL; uint32_t debug::mask = ~0u; bool debug_pskmail = false; bool debug_audio = false; static const char* prefix[] = { _("Quiet"), _("Error"), _("Warning"), _("Info"), _("Verbose"), _("Debug") }; static void slider_cb(Fl_Widget* w, void*); static void src_menu_cb(Fl_Widget* w, void*); static void clear_cb(Fl_Widget *w, void*); Fl_Menu_Item src_menu[] = { { _("ARQ control"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Audio"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Modem"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Rig control"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Flrig I/O"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("RPC"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Spotter"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("KISS control"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Mac Logger"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE | FL_MENU_DIVIDER }, { _("Other"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { 0 } }; #include void rotate_log(std::string filename) { FILE *fp; std::string oldfn, newfn; const char *ext[] = {".5", ".4", ".3", ".2", ".1"}; for (int i = 0; i < 4; i++) { newfn.assign(filename).append(ext[i]); oldfn.assign(filename).append(ext[i+1]); if ((fp = fopen(oldfn.c_str(), "r")) == NULL) continue; fclose(fp); rename(oldfn.c_str(), newfn.c_str()); } newfn.assign(filename).append(ext[4]); char buffer[65536]; FILE *original = fopen(filename.c_str(), "rb"); if (original) { FILE *backup = fopen(newfn.c_str(), "wb"); if (backup) { size_t n; while (1) { memset(buffer, 0, sizeof(buffer)); n = fread(buffer, 1, sizeof(buffer), original); n = fwrite(buffer, 1, n, backup); if (feof(original)) { break; } } fflush(backup); fclose(backup); } fclose(original); } } void debug::start(const char* filename) { if (debug::inst) return; rotate_log(filename); inst = new debug(filename); window = new Fl_Double_Window(800, 400, _("Event log")); window->xclass(PACKAGE_TARNAME); int pad = 2; Fl_Menu_Button* button = new Fl_Menu_Button(pad, pad, 128, 22, _("Log sources")); button->menu(src_menu); button->callback(src_menu_cb); Fl_Slider* slider = new Fl_Slider(button->x() + button->w() + pad, pad, 128, 22, prefix[level]); slider->tooltip(_("Change log level")); slider->align(FL_ALIGN_RIGHT); slider->type(FL_HOR_NICE_SLIDER); slider->range(0.0, LOG_NLEVELS - 1); slider->step(1.0); slider->value(level); slider->callback(slider_cb); Fl_Button* clearbtn = new Fl_Button(window->w() - 64, pad, 60, 22, "clear"); clearbtn->callback(clear_cb); btext = new Fl_Browser(pad, slider->h()+pad, window->w()-2*pad, window->h()-slider->h()-2*pad, 0); btext->textfont(FL_HELVETICA); btext->textsize(14); window->resizable(btext); window->end(); } void debug::stop(void) { guard_lock debug_lock(&debug_mutex); if (window) { window->hide(); delete window; window = 0; } if (inst) { delete inst; inst = 0; } } static char fmt[1024]; static char dtext[32768]; void debug::log(level_e level, const char* func, const char* srcf, int line, const char* format, ...) { guard_lock debug_lock(&debug_mutex); if (!inst) return; // always annotate with date/time & line number time_t t = time(NULL); struct tm stm; (void)localtime_r(&t, &stm); snprintf(fmt, sizeof(fmt), "%c: [%02d:%02d:%02d] %s : %d : %s\n %s\n", *prefix[level], stm.tm_hour, stm.tm_min, stm.tm_sec, srcf, line, func, format); va_list args; va_start(args, format); intptr_t nt = vsnprintf(dtext, sizeof(dtext), fmt, args); va_end(args); fprintf(wfile, "%s", dtext); if (tty) { if (level <= DEBUG_LEVEL && level > QUIET_LEVEL) { fprintf(stderr, "%s", dtext); } } #ifdef __MINGW32__ fflush(wfile); #endif linebuf.append(dtext); Fl::awake(sync_text, (void*)nt); } void debug::hex_dump(const char* func, const char * data, int length) { guard_lock debug_lock(&debug_hd_mutex); char cbuff[32]; char hbuff[64]; char tbuff[32]; int index = 0; int data_index = 0; int count = length; unsigned int c = 0; int hi = 0; int step = 16; if(!func) func = "Unassigned"; if(!data || length < 0) return; while(count > 0) { memset(cbuff, 0, sizeof(cbuff)); memset(hbuff, 0, sizeof(hbuff)); memset(tbuff, 0, sizeof(tbuff)); hi = 0; for(index = 0; index < step; index++) { if(data_index < length) { c = ((unsigned int) data[data_index]) & 0xFF; if(c >= ' ' && c <= 0xff) { cbuff[index] = c; } else { cbuff[index] = '.'; } snprintf(tbuff, sizeof(tbuff) - 1, "%02X", c); hbuff[hi++] = tbuff[0]; hbuff[hi++] = tbuff[1]; hbuff[hi++] = ' '; } else { break; } data_index++; } if (debug::inst) LOG_DEBUG("%s: %s %s", func, cbuff, hbuff); count -= step; } } void debug::elog(const char* func, const char* srcf, int line, const char* text) { if (debug::inst) log(ERROR_LEVEL, func, srcf, line, "%s: %s", text, strerror(errno)); } void debug::show(void) { btext->bottomline(btext->size()); window->show(); } void debug::sync_text(void* arg) { guard_lock debug_lock(&debug_mutex); if (!window) return; size_t p1 = 0, p2 = linebuf.find("\n"); while (p2 != string::npos) { btext->add(linebuf.substr(p1, p2 - p1).c_str()); p1 = p2 + 1; p2 = linebuf.find("\n", p1); } btext->redraw(); btext->bottomline(btext->size()); linebuf.clear(); return; } debug::debug(const char* filename) { if ((wfile = fl_fopen(filename, "w")) == NULL) throw strerror(errno); setvbuf(wfile, (char*)NULL, _IOLBF, 0); set_cloexec(fileno(wfile), 1); if ((rfile = fl_fopen(filename, "r")) == NULL) throw strerror(errno); rfd = fileno(rfile); set_cloexec(rfd, 1); #ifndef __MINGW32__ int f; if ((f = fcntl(rfd, F_GETFL)) == -1) throw strerror(errno); if (fcntl(rfd, F_SETFL, f | O_NONBLOCK) == -1) throw strerror(errno); #endif tty = isatty(fileno(stderr)); linebuf.clear(); } debug::~debug() { if (wfile) fclose(wfile); if (rfile) fclose(rfile); } static void slider_cb(Fl_Widget* w, void*) { debug::level = (debug::level_e)((Fl_Slider*)w)->value(); w->label(prefix[debug::level]); w->parent()->redraw(); } static void src_menu_cb(Fl_Widget* w, void*) { debug::mask ^= 1 << ((Fl_Menu_*)w)->value(); } static void clear_cb(Fl_Widget* w, void*) { guard_lock debug_lock(&debug_mutex); btext->clear(); linebuf.clear(); } fldigi-4.1.06/src/misc/strutil.cxx0000664000175000017500000001474013507402064013746 00000000000000// ---------------------------------------------------------------------------- // strutil.cxx // // Copyright (C) 2009-2012 // Stelios Bounanos, M0GLD // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "re.h" #include "strutil.h" using namespace std; vector split(const char* re_str, const char* str, unsigned max_split) { vector v; size_t n = strlen(re_str); string s; s.reserve(n + 2); s.append(1, '(').append(re_str, n).append(1, ')'); fre_t re(s.c_str(), REG_EXTENDED); bool ignore_trailing_empty = false; if (max_split == 0) { max_split = UINT_MAX; ignore_trailing_empty = true; } s = str; const vector& sub = re.suboff(); while (re.match(s.c_str())) { if (unlikely(sub.empty() || ((max_split != UINT_MAX) && --max_split == 0))) break; else { s[sub[0].rm_so] = '\0'; v.push_back(s.c_str()); s.erase(0, sub[0].rm_eo); } } if (!(ignore_trailing_empty && s.empty())) v.push_back(s); return v; } /// Builds a string out of a printf-style formatted vararg list. string strformat( const char * fmt, ... ) { static const int sz_buf = 512 ; char buf_usual[sz_buf]; va_list ap; va_start(ap, fmt); int res = vsnprintf( buf_usual, sz_buf, fmt, ap); va_end(ap); if( res < 0 ) throw runtime_error(__FUNCTION__); if( res < sz_buf ) return buf_usual ; string str( res, ' ' ); va_start(ap, fmt); res = vsnprintf( &str[0], res + 1, fmt, ap); va_end(ap); if( res < 0 ) throw runtime_error(__FUNCTION__); return str ; } /// Removes leading spaces and tabs. static std::string & strtriml(std::string &str) { str.erase(str.begin(), std::find_if(str.begin(), str.end(), std::not1(std::ptr_fun(std::isspace)))); return str; } /// Removes trailing spaces and tabs. static std::string & strtrimr(std::string &str) { str.erase(std::find_if(str.rbegin(), str.rend(), std::not1(std::ptr_fun(std::isspace))).base(), str.end()); return str; } /// Removes leading trailing spaces and tabs. void strtrim(std::string &str) { strtriml(strtrimr(str)); } void strcapitalize(std::string &str) { bool isStart = true ; for( size_t i = 0; i < str.size(); ++i ) { const char tmpC = str[i]; if( isalpha( tmpC ) ) { if( isStart ) { str[ i ] = toupper( tmpC ); isStart = false ; } else { str[ i ] = tolower( tmpC ); } } else { isStart = true ; } } } std::string strreplace( const std::string & inp, const std::string & from, const std::string & to ) { size_t from_sz=from.size(); std::string tmp ; for( size_t old_curr = 0 ; ; ) { size_t new_curr = inp.find( from, old_curr ); if( new_curr == std::string::npos ) { tmp.append( inp, old_curr, std::string::npos ); break ; } else { tmp.append( inp, old_curr, new_curr - old_curr ); tmp.append( to ); old_curr = new_curr + from_sz ; } } return tmp ; } /// Edit distance. Not the fastest implementation. size_t levenshtein(const string & source, const string & target) { const size_t n = source.size(); const size_t m = target.size(); if (n == 0) return m; if (m == 0) return n; typedef std::vector< std::vector > Tmatrix; Tmatrix matrix(n+1); for (size_t i = 0; i <= n; i++) { matrix[i].resize(m+1); } for (size_t i = 0; i <= n; i++) { matrix[i][0]=i; } for (size_t j = 0; j <= m; j++) { matrix[0][j]=j; } for (size_t i = 1; i <= n; i++) { char s_i = source[i-1]; for (size_t j = 1; j <= m; j++) { char t_j = target[j-1]; size_t cost = (s_i == t_j) ? 0 : 1 ; size_t above = matrix[i-1][j]; size_t left = matrix[i][j-1]; size_t diag = matrix[i-1][j-1]; size_t cell = std::min( above + 1, std::min(left + 1, diag + cost)); // Step 6A: Cover transposition, in addition to deletion, // insertion and substitution. This step is taken from: // Berghel, Hal ; Roach, David : "An Extension of Ukkonen's // Enhanced Dynamic Programming ASM Algorithm" // (http://www.acm.org/~hlb/publications/asm/asm.html) if (i>2 && j>2) { size_t trans=matrix[i-2][j-2]+1; if (source[i-2]!=t_j) trans++; if (s_i!=target[j-2]) trans++; if (cell>trans) cell=trans; } matrix[i][j]=cell; } } return matrix[n][m]; } /// Converts a string to ucasestr. std::string ucasestr( string str ) { string resu ; for( size_t i = 0 ; i < str.size(); ++i ) { resu += static_cast( toupper( str[i] ) ); } return resu ; } std::string ucasestr(const char *str) { string resu ; for( size_t i = 0 ; i < strlen(str); ++i ) { resu += static_cast( toupper( str[i] ) ); } return resu ; } size_t ufind(std::string s1, std::string s2, size_t idx) { std::string up1 = ucasestr(s1); std::string up2 = ucasestr(s2); return up1.find(up2, idx); } // ---------------------------------------------------------------------------- /// Just reads all chars until the delimiter. bool read_until_delim( char delim, std::istream & istrm ) { istrm.ignore ( std::numeric_limits::max(), delim ); if(istrm.eof()) return true ; return istrm.bad() ? false : true ; } /// Reads a char up to the given delimiter, or returns the default value if there is none. bool read_until_delim( char delim, std::istream & istrm, char & ref, const char dflt ) { if(istrm.eof()) { ref = dflt ; return true ; } ref = istrm.get(); if( istrm.bad() ) return false; if( ref == delim ) { ref = dflt ; return true ; } char tmpc = istrm.get(); if( istrm.eof() ) return true; if( tmpc == delim ) return true ; if( tmpc == '\n' ) return true ; if( tmpc == '\r' ) return true ; return false; } fldigi-4.1.06/src/misc/configuration.cxx0000664000175000017500000006627013507402064015114 00000000000000// ---------------------------------------------------------------------------- // configuration.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2008 // Leigh L. Klotz, Jr., WA5ZNU // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "configuration.h" #include "confdialog.h" #include "xmlreader.h" #include "soundconf.h" #include "fl_digi.h" #include "main.h" #include "gettext.h" #include "nls.h" #include "icons.h" #include "rigsupport.h" #include "contest.h" #if USE_HAMLIB #include "hamlib.h" #include "rigclass.h" #endif #include "rigio.h" #include "rigxml.h" #include "nanoIO.h" #include "debug.h" #include #include #include #include #include #include #ifdef __linux__ # include # include # include # include #endif #ifdef __APPLE__ # include #endif #ifndef __CYGWIN__ # include #else # include #endif // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include using namespace std; const char *szBaudRates[] = { "", "300","600","1200","2400", "4800","9600","19200","38400", "57600","115200","230400","460800"}; const char *szBands[] = { "", "1830", "3580", "7030", "7070", "10138", "14070", "18100", "21070", "21080", "24920", "28070", "28120", 0}; ostream& operator<<(ostream& out, const RGB& rgb) { return out << (int)rgb.R << ' ' << (int)rgb.G << ' ' << (int)rgb.B; } istream& operator>>(istream& in, RGB& rgb) { int i; in >> i; rgb.R = i; in >> i; rgb.G = i; in >> i; rgb.B = i; return in; } ostream& operator<<(ostream& out, const RGBI& rgbi) { return out << (int)rgbi.R << ' ' << (int)rgbi.G << ' ' << (int)rgbi.B; } istream& operator>>(istream& in, RGBI& rgbi) { int i; in >> i; rgbi.R = i; in >> i; rgbi.G = i; in >> i; rgbi.B = i; return in; } // This allows to put tag elements into containers class tag_base { public: tag_base(const char* t, const char* d = "") : tag(t), doc(d) { } virtual void write(ostream& out) const = 0; virtual void read(const char* data) = 0; virtual ~tag_base() { } const char* tag; const char* doc; }; // This will handle every type that has << and >> stream operators template class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, T& v) : tag_base(t, d), var(v) { } void write(ostream& out) const { out << "\n" << '<' << tag << '>' << var << "\n\n"; } void read(const char* data) { istringstream iss(data); iss >> var; } T& var; }; // Instantiate an explicit tag_elem for types that require unusual handling. // Special handling for strings template <> class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, string& s) : tag_base(t, d), str(s) { } void write(ostream& out) const { string s = str; string s2 = doc; string::size_type i = s.find('&'); while (i != string::npos) { s.replace(i, 1, "&"); i = s.find('&', i + 1); } while ((i = s.find('<')) != string::npos) s.replace(i, 1, "<"); while ((i = s.find('>')) != string::npos) s.replace(i, 1, ">"); while ((i = s.find('"')) != string::npos) s.replace(i, 1, """); while ((i = s.find('\'')) != string::npos) s.replace(i, 1, "'"); i = s2.find('&'); while (i != string::npos) { s2.replace(i, 1, "&"); i = s2.find('&', i + 1); } while ((i = s2.find('<')) != string::npos) s2.replace(i, 1, "<"); while ((i = s2.find('>')) != string::npos) s2.replace(i, 1, ">"); while ((i = s2.find('"')) != string::npos) s2.replace(i, 1, """); while ((i = s2.find('\'')) != string::npos) s2.replace(i, 1, "'"); out << "\n" << '<' << tag << '>' << s << "\n\n"; } void read(const char* data) { str = data; } string& str; }; // Special handling for mode bitsets template <> class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, mode_set_t& m) : tag_base(t, d), modes(m) { } void write(ostream& out) const { out << "\n" << '<' << tag << '>'; for (size_t i = 0; i < modes.size(); i++) { if (!modes.test(i)) out << mode_info[i].name << ','; } out << ",\n\n"; } void read(const char* data) { string sdata = data, smode, tstmode; modes.set(); size_t p = sdata.find(","); while ((p != string::npos) && (p != 0)) { smode = sdata.substr(0, p); for (size_t i = 0; i < modes.size(); i++) { tstmode = mode_info[i].name; if (smode == tstmode) { modes.set(i,0); break; } } sdata.erase(0, p+1); p = sdata.find(","); } } mode_set_t& modes; }; // By redefining the ELEM_ macro, we can control what the CONFIG_LIST macro // will expand to, and accomplish several things: // 1) Declare "struct configuration". See ELEM_DECLARE_CONFIGURATION // in configuration.h. // 2) Define progdefaults, the configuration struct that is initialised with // fldigi's default options #define ELEM_PROGDEFAULTS(type_, var_, tag_, doc_, ...) __VA_ARGS__, // 3) Define an array of tag element pointers #define ELEM_TAG_ARRAY(type_, var_, tag_, doc_, ...) \ (*tag_ ? new tag_elem(tag_, "type: " #type_ "; default: " #__VA_ARGS__ "\n" doc_, \ progdefaults.var_) : 0), // First define the default config #undef ELEM_ #define ELEM_ ELEM_PROGDEFAULTS configuration progdefaults = { CONFIG_LIST }; void configuration::writeDefaultsXML() { string deffname(HomeDir); deffname.append("fldigi_def.xml"); string deffname_backup(deffname); deffname_backup.append("-old"); remove(deffname_backup.c_str()); rename(deffname.c_str(), deffname_backup.c_str()); ofstream f(deffname.c_str()); if (!f) { LOG_ERROR("Could not write %s", deffname.c_str()); return; } // create an array #undef ELEM_ #define ELEM_ ELEM_TAG_ARRAY tag_base* tag_list[] = { CONFIG_LIST }; // write all variables with non-empty tags to f f << "\n\n"; for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) { if (tag_list[i]) { tag_list[i]->write(f); delete tag_list[i]; } } f << "\n"; f.close(); } static void log_excluded_modes(void) { return; struct { mode_set_t* modes; const char* msgstr; } excluded[] = { { &progdefaults.rsid_rx_modes, "RSID (rx)" }, { &progdefaults.rsid_tx_modes, "RSID (tx)" }, { &progdefaults.cwid_modes, "CWID" }, { &progdefaults.videoid_modes, "VIDEOID" } }; string buf; for (size_t i = 0; i < sizeof(excluded)/sizeof(*excluded); i++) { size_t n = excluded[i].modes->size(); if (excluded[i].modes->count() == n) continue; buf.erase(); for (size_t j = 0; j < n; j++) { if (!excluded[i].modes->test(j)) { if (!buf.empty()) buf += ' '; buf += mode_info[j].sname; } } LOG(debug::QUIET_LEVEL, debug::LOG_OTHER, "%-10s: %s", excluded[i].msgstr, buf.c_str()); } } bool configuration::readDefaultsXML() { // Decode all RSID modes rsid_rx_modes.set(); // Don't transmit RSID or VideoID for CW, PSK31, RTTY rsid_tx_modes.set().reset(MODE_CW).reset(MODE_PSK31).reset(MODE_RTTY); videoid_modes = rsid_tx_modes; // Don't transmit CWID for CW cwid_modes.set().reset(MODE_CW); // Show all op modes visible_modes.set(); string deffname = HomeDir; deffname.append("fldigi_def.xml"); ifstream f(deffname.c_str()); if (!f) return false; string xmlbuf; f.seekg(0, ios::end); xmlbuf.reserve(f.tellg()); // reserve some space to avoid reallocations f.seekg(0, ios::beg); char line[2048]; while (f.getline(line, sizeof(line))) xmlbuf.append(line).append("\n"); f.close(); IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(xmlbuf)); if (!xml) return false; // create a TAG_NAME -> ELEMENT map typedef map tag_map_t; tag_map_t tag_map; tag_base* tag_list[] = { CONFIG_LIST }; for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) if (tag_list[i]) tag_map[tag_list[i]->tag] = tag_list[i]; // parse the xml buffer tag_map_t::const_iterator i = tag_map.end(); while(xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: if (i != tag_map.end()) // do we know about this tag? i->second->read(xml->getNodeData()); break; case EXN_ELEMENT_END: i = tag_map.end(); // ignore the next EXN_CDATA break; case EXN_ELEMENT: i = tag_map.find(xml->getNodeName()); break; case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } delete xml; // delete the tag objects for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) delete tag_list[i]; log_excluded_modes(); return true; } void configuration::loadDefaults() { // RTTY selShift->index(rtty_shift); if (progdefaults.rtty_shift == selShift->lsize() - 1) { selCustomShift->activate(); selCustomShift->value(rtty_custom_shift); } else selCustomShift->deactivate(); selBaud->index(rtty_baud); selBits->index(rtty_bits); selParity->index(rtty_parity); // chkMsbFirst->value(rtty_msbfirst); selStopBits->index(rtty_stop); btnCRCRLF->value(rtty_crcrlf); btnAUTOCRLF->value(rtty_autocrlf); cntrAUTOCRLF->value(rtty_autocount); chkPseudoFSK->value(PseudoFSK); chkUOSrx->value(UOSrx); chkUOStx->value(UOStx); i_listbox_rtty_afc_speed->index(rtty_afcspeed); btnPreferXhairScope->value(PreferXhairScope); // OLIVIA i_listbox_olivia_tones->index(oliviatones); i_listbox_olivia_bandwidth->index(oliviabw); cntOlivia_smargin->value(oliviasmargin); cntOlivia_sinteg->value(oliviasinteg); btnOlivia_8bit->value(olivia8bit); // CONTESTIA i_listbox_contestia_tones->index(contestiatones); i_listbox_contestia_bandwidth->index(contestiabw); cntContestia_smargin->value(contestiasmargin); cntContestia_sinteg->value(contestiasinteg); btnContestia_8bit->value(contestia8bit); chkDominoEX_FEC->value(DOMINOEX_FEC); Fl_Tooltip::enable(tooltips); // contest settings for state qso parties adjust_for_contest(0); UI_select(); set_log_colors(); clear_log_fields(); clearQSO(); } void configuration::saveDefaults() { ENSURE_THREAD(FLMAIN_TID); memcpy(&cfgpal0, &palette[0], sizeof(cfgpal0)); memcpy(&cfgpal1, &palette[1], sizeof(cfgpal1)); memcpy(&cfgpal2, &palette[2], sizeof(cfgpal2)); memcpy(&cfgpal3, &palette[3], sizeof(cfgpal3)); memcpy(&cfgpal4, &palette[4], sizeof(cfgpal4)); memcpy(&cfgpal5, &palette[5], sizeof(cfgpal5)); memcpy(&cfgpal6, &palette[6], sizeof(cfgpal6)); memcpy(&cfgpal7, &palette[7], sizeof(cfgpal7)); memcpy(&cfgpal8, &palette[8], sizeof(cfgpal8)); RxFontName = Fl::get_font_name(RxFontnbr); TxFontName = Fl::get_font_name(TxFontnbr); WaterfallFontName = Fl::get_font_name(WaterfallFontnbr); ViewerFontName = Fl::get_font_name(ViewerFontnbr); FreqControlFontName = Fl::get_font_name(FreqControlFontnbr); MacroEditFontName = Fl::get_font_name(MacroEditFontnbr); MacroBtnFontName = Fl::get_font_name(MacroBtnFontnbr); DXC_textname = Fl::get_font_name(DXC_textfont); DXfontname = Fl::get_font_name(DXfontnbr); LOGGINGfontname = Fl::get_font_name(LOGGINGtextfont); LOGBOOKtextname = Fl::get_font_name(LOGBOOKtextfont); #if ENABLE_NLS && defined(__WOE32__) set_ui_lang(listbox_language->index()); #endif writeDefaultsXML(); changed = false; } #if USE_HAMLIB static int fill_hamlib_menu(const char* rigname) { cboHamlibRig->add(rigname); return 1; } #endif int configuration::setDefaults() { ENSURE_THREAD(FLMAIN_TID); #if USE_HAMLIB hamlib_get_rigs(); hamlib_get_rig_str(fill_hamlib_menu); if (HamRigModel == 0 && !HamRigName.empty()) { // compatibility with < 3.04 HamRigModel = hamlib_get_rig_model_compat(HamRigName.c_str()); LOG_VERBOSE("Found rig model %d for \"%s\"", HamRigModel, HamRigName.c_str()); } #endif inpMyCallsign->value(myCall.c_str()); inpMyName->value(myName.c_str()); inpMyQth->value(myQth.c_str()); inpMyLocator->value(myLocator.c_str()); inpMyAntenna->value(myAntenna.c_str()); UseLeadingZeros = btnUseLeadingZeros->value(); ContestStart = (int)nbrContestStart->value(); ContestDigits = (int)nbrContestDigits->value(); txtSecondary->value(secText.c_str()); txtTHORSecondary->value(THORsecText.c_str()); valTHOR_BW->value(THOR_BW); valTHOR_FILTER->value(THOR_FILTER); valTHOR_PATHS->value(THOR_PATHS); valThorCWI->value(ThorCWI); valTHOR_PREAMBLE->value(THOR_PREAMBLE); valTHOR_SOFTSYMBOLS->value(THOR_SOFTSYMBOLS); valTHOR_SOFTBITS->value(THOR_SOFTBITS); valDominoEX_BW->value(DOMINOEX_BW); valDominoEX_FILTER->value(DOMINOEX_FILTER); chkDominoEX_FEC->value(DOMINOEX_FEC); valDominoEX_PATHS->value(DOMINOEX_PATHS); valDomCWI->value(DomCWI); btnRigCatCMDptt->value(RigCatCMDptt); btnTTYptt->value(TTYptt); btnUsePPortPTT->value(progdefaults.UsePPortPTT); btnUseUHrouterPTT->value(progdefaults.UseUHrouterPTT); #if USE_HAMLIB listbox_sideband->add(_("Rig mode")); listbox_sideband->add(_("Always LSB")); listbox_sideband->add(_("Always USB")); listbox_sideband->index(HamlibSideband); btnHamlibCMDptt->value(HamlibCMDptt); inpRIGdev->show(); listbox_baudrate->show(); cboHamlibRig->show(); cboHamlibRig->value(HamRigName.c_str()); #else tabHamlib->parent()->remove(*tabHamlib); #endif btnRTSptt->value(RTSptt); btnDTRptt->value(DTRptt); btnRTSplusV->value(RTSplus); btnDTRplusV->value(DTRplus); inpTTYdev->value(PTTdev.c_str()); chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); if (chkUSEHAMLIBis) chkUSEHAMLIB->value(1); if (chkUSERIGCATis) chkUSERIGCAT->value(1); if (!XmlRigFilename.empty()) readRigXML(); inpRIGdev->value(HamRigDevice.c_str()); listbox_baudrate->index(HamRigBaudrate); inpXmlRigDevice->value(XmlRigDevice.c_str()); listbox_xml_rig_baudrate->index(XmlRigBaudrate); select_nanoIO_CommPort->value(nanoIO_serial_port_name.c_str()); select_nanoCW_CommPort->value(nanoIO_serial_port_name.c_str()); select_USN_FSK_port->value(Nav_FSK_port.c_str()); select_Nav_config_port->value(Nav_config_port.c_str()); valCWsweetspot->value(CWsweetspot); valRTTYsweetspot->value(RTTYsweetspot); valPSKsweetspot->value(PSKsweetspot); btnWaterfallHistoryDefault->value(WaterfallHistoryDefault); btnWaterfallQSY->value(WaterfallQSY); inpWaterfallClickText->input_type(FL_MULTILINE_INPUT); inpWaterfallClickText->value(WaterfallClickText.c_str()); if (!WaterfallClickInsert) inpWaterfallClickText->deactivate(); for (size_t i = 0; i < sizeof(waterfall::wf_wheel_action)/sizeof(*waterfall::wf_wheel_action); i++) listboxWaterfallWheelAction->add(waterfall::wf_wheel_action[i]); listboxWaterfallWheelAction->index(WaterfallWheelAction); btnStartAtSweetSpot->value(StartAtSweetSpot); btnPSKmailSweetSpot->value(PSKmailSweetSpot); cntSearchRange->value(SearchRange); cntServerOffset->value(ServerOffset); cntACQsn->value(ACQsn); btnCursorBWcolor->color( fl_rgb_color(cursorLineRGBI.R, cursorLineRGBI.G, cursorLineRGBI.B) ); btnCursorCenterLineColor->color( fl_rgb_color(cursorCenterRGBI.R, cursorCenterRGBI.G, cursorCenterRGBI.B) ); btnBwTracksColor->color( fl_rgb_color(bwTrackRGBI.R, bwTrackRGBI.G, bwTrackRGBI.B) ); cntCWweight->value(CWweight); sldrCWxmtWPM->value(CWspeed); cntCWdefWPM->value(defCWspeed); sldrCWbandwidth->value(CWbandwidth); btnCWrcvTrack->value(CWtrack); cntCWrange->value(CWrange); cntCWlowerlimit->value(CWlowerlimit); cntCWupperlimit->value(CWupperlimit); cntCWlowerlimit->maximum(CWupperlimit - 20); cntCWupperlimit->minimum(CWlowerlimit + 20); cntCWrisetime->value(CWrisetime); cntCWdash2dot->value(CWdash2dot); i_listboxQSKshape->index(QSKshape); sldrCWxmtWPM->minimum(CWlowerlimit); sldrCWxmtWPM->maximum(CWupperlimit); btnQSK->value(QSK); cntPreTiming->value(CWpre); cntPostTiming->value(CWpost); btnCWID->value(CWid); listboxHellFont->index(feldfontnbr); btnFeldHellIdle->value(HellXmtIdle); btnTxRSID->value(TransmitRSid); btnRSID->value(rsid); chkRSidWideSearch->value(rsidWideSearch); chkSlowCpu->value(slowcpu); Fl_Button* qrzb = btnQRZXMLnotavailable; Fl_Button* qrzb2 = btnQRZWEBnotavailable; switch (QRZXML) { case QRZCD: qrzb = btnQRZcdrom; break; case QRZNET: qrzb = btnQRZsub; break; case HAMCALLNET: qrzb = btnHamcall; break; case CALLOOK: qrzb = btnCALLOOK; break; case HAMQTH: qrzb = btnHamQTH; break; case QRZXMLNONE: default : break; } switch (QRZWEB) { case QRZHTML: qrzb2 = btnQRZonline; break; case HAMCALLHTML: qrzb2 = btnHAMCALLonline; break; case HAMQTHHTML: qrzb2 = btnHamQTHonline; break; case QRZWEBNONE: default : break; } set_qrzxml_buttons(qrzb); set_qrzweb_buttons(qrzb2); txtQRZpathname->value(QRZpathname.c_str()); btnsendid->value(sendid); btnsendvideotext->value(sendtextid); chkID_SMALL->value(ID_SMALL); wf->setPrefilter(wfPreFilter); btnWFaveraging->value(WFaveraging); memcpy(&palette[0], &cfgpal0, sizeof(palette[0])); memcpy(&palette[1], &cfgpal1, sizeof(palette[1])); memcpy(&palette[2], &cfgpal2, sizeof(palette[2])); memcpy(&palette[3], &cfgpal3, sizeof(palette[3])); memcpy(&palette[4], &cfgpal4, sizeof(palette[4])); memcpy(&palette[5], &cfgpal5, sizeof(palette[5])); memcpy(&palette[6], &cfgpal6, sizeof(palette[6])); memcpy(&palette[7], &cfgpal7, sizeof(palette[7])); memcpy(&palette[8], &cfgpal8, sizeof(palette[8])); wf->setcolors(); setColorButtons(); #if !HAVE_UHROUTER btnUseUHrouterPTT->hide(); #endif #if !HAVE_PARPORT btnUsePPortPTT->hide(); #endif #if ENABLE_NLS && defined(__WOE32__) ostringstream ss; for (lang_def_t* p = ui_langs; p->lang; p++) { ss.str(""); ss << p->native_name; listbox_language->add(ss.str().c_str()); } listbox_language->index(get_ui_lang()); listbox_language->show(); #else listbox_language->hide(); #endif return 1; } void configuration::resetDefaults(void) { if (!fl_choice2(_("\ Reset all options to their default values?\n\n\ Reset options will take effect at the next start\n\ Files: fldigi_def.xml and fldigi.prefs will be deleted!\n"), _("OK"), _("Cancel"), NULL) && Fl::event_key() != FL_Escape) { if (!fl_choice2(_("Confirm RESET"), _("Yes"), _("No"), NULL) && Fl::event_key() != FL_Escape) { reset(); atexit(reset); } } } void configuration::reset(void) { remove(string(HomeDir).append("fldigi_def.xml").c_str()); remove(string(HomeDir).append("fldigi.prefs").c_str()); } #include "rigio.h" void configuration::initInterface() { ENSURE_THREAD(FLMAIN_TID); // close down any possible rig interface threads #if USE_HAMLIB hamlib_close(); // MilliSleep(100); #endif rigCAT_close(); // MilliSleep(100); RigCatCMDptt = btnRigCatCMDptt->value(); TTYptt = btnTTYptt->value(); RTSptt = btnRTSptt->value(); DTRptt = btnDTRptt->value(); RTSplus = btnRTSplusV->value(); DTRplus = btnDTRplusV->value(); PTTdev = inpTTYdev->value(); #if USE_HAMLIB chkUSEHAMLIBis = chkUSEHAMLIB->value(); HamlibCMDptt = btnHamlibCMDptt->value(); #endif chkUSERIGCATis = chkUSERIGCAT->value(); #if USE_HAMLIB if (*cboHamlibRig->value() == '\0') // no selection at start up cboHamlibRig->index(hamlib_get_index(HamRigModel)); else HamRigModel = hamlib_get_rig_model(cboHamlibRig->index()); HamRigDevice = inpRIGdev->value(); HamRigBaudrate = listbox_baudrate->index(); #else cboHamlibRig->hide(); inpRIGdev->hide(); listbox_baudrate->hide(); #endif if (connected_to_flrig) { LOG_INFO("%s", "using flrig xcvr control"); wf->setQSY(1); } else if (chkUSERIGCATis) { // start the rigCAT thread if (rigCAT_init()) { LOG_INFO("%s", "using rigCAT xcvr control"); wf->USB(true); wf->setQSY(1); rigCAT_get_pwrlevel(); } else { LOG_INFO("%s", "defaulting to no xcvr control"); noCAT_init(); wf->USB(true); wf->setQSY(0); chkUSERIGCATis = false; } #if USE_HAMLIB } else if (chkUSEHAMLIBis) { // start the hamlib thread if (hamlib_init(HamlibCMDptt)) { LOG_INFO("%s", "using HAMLIB xcvr control"); btnInitHAMLIB->deactivate(); wf->USB(true); wf->setQSY(1); } else { LOG_INFO("%s", "defaulting to no xcvr control"); noCAT_init(); wf->USB(true); wf->setQSY(0); } #endif } else { LOG_INFO("%s", "No xcvr control selected"); noCAT_init(); wf->USB(true); wf->setQSY(0); } build_frequencies2_list(); if (HamlibCMDptt && chkUSEHAMLIBis) push2talk->reset(PTT::PTT_HAMLIB); else if ((RigCatCMDptt || RigCatRTSptt || RigCatDTRptt) && chkUSERIGCATis) push2talk->reset(PTT::PTT_RIGCAT); else if (TTYptt) push2talk->reset(PTT::PTT_TTY); else if (UsePPortPTT) push2talk->reset(PTT::PTT_PARPORT); else if (UseUHrouterPTT) push2talk->reset(PTT::PTT_UHROUTER); else push2talk->reset(PTT::PTT_NONE); wf->setRefLevel(); wf->setAmpSpan(); cntLowFreqCutoff->value(LowFreqCutoff); } const char* configuration::strBaudRate() { return (szBaudRates[HamRigBaudrate + 1]); } int configuration::nBaudRate(const char *szBR) { for (size_t i = 1; i < sizeof(szBaudRates); i++) if (strcmp(szBaudRates[i], szBR) == 0) return i - 1; return 0; } int configuration::BaudRate(size_t n) { if (n > sizeof(szBaudRates) + 1) return 1200; return (atoi(szBaudRates[n + 1])); } #ifdef __WOE32__ static bool open_serial(const char* dev) { bool ret = false; #ifdef __CYGWIN__ int fd = fl_open(dev, O_RDWR | O_NOCTTY | O_NDELAY | O_CLOEXEC); if (fd != -1) { close(fd); ret = true; } #elif defined(__MINGW32__) HANDLE fd = CreateFile(dev, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (fd != INVALID_HANDLE_VALUE) { CloseHandle(fd); ret = true; } #endif return ret; } #endif // __WOE32__ void configuration::testCommPorts() { inpTTYdev->clear(); inpRIGdev->clear(); inpXmlRigDevice->clear(); #ifndef PATH_MAX # define PATH_MAX 1024 #endif #ifndef __WOE32__ struct stat st; #endif #ifndef __APPLE__ char ttyname[PATH_MAX + 1]; #endif const char* tty_fmt[] = { #if defined(__linux__) "/dev/ttyS%u", "/dev/ttyUSB%u", "/dev/usb/ttyUSB%u", "/dev/ttyACM%u", "/dev/usb/ttyACM%u", "/dev/rfcomm%u", "/opt/vttyS%u" #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) "/dev/tty%2.2u" #elif defined(__CYGWIN__) "/dev/ttyS%u" #elif defined(__MINGW32__) "//./COM%u" #elif defined(__APPLE__) "/dev/cu.*", "/dev/tty.*" #endif }; #if defined(__WOE32__) # define TTY_MAX 255 #elif defined(__OpenBSD__) || defined(__NetBSD__) # define TTY_MAX 4 #else # define TTY_MAX 8 #endif #ifdef __linux__ glob_t gbuf; glob("/dev/serial/by-id/*", 0, NULL, &gbuf); for (size_t j = 0; j < gbuf.gl_pathc; j++) { if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) || strstr(gbuf.gl_pathv[j], "modem") ) continue; LOG_INFO("Found serial port %s", gbuf.gl_pathv[j]); inpTTYdev->add(gbuf.gl_pathv[j]); # if USE_HAMLIB inpRIGdev->add(gbuf.gl_pathv[j]); # endif inpXmlRigDevice->add(gbuf.gl_pathv[j]); select_nanoIO_CommPort->add(gbuf.gl_pathv[j]); select_nanoCW_CommPort->add(gbuf.gl_pathv[j]); select_WK_CommPort->add(gbuf.gl_pathv[j]); select_WKFSK_CommPort->add(gbuf.gl_pathv[j]); } globfree(&gbuf); #endif for (size_t i = 0; i < sizeof(tty_fmt)/sizeof(*tty_fmt); i++) { #ifndef __APPLE__ for (unsigned j = 0; j < TTY_MAX; j++) { snprintf(ttyname, sizeof(ttyname), tty_fmt[i], j); # ifndef __WOE32__ if ( !(stat(ttyname, &st) == 0 && S_ISCHR(st.st_mode)) ) continue; # else // __WOE32__ LOG_DEBUG("Testing serial port %s", ttyname); if (!open_serial(ttyname)) continue; # ifdef __CYGWIN__ snprintf(ttyname, sizeof(ttyname), "COM%u", j+1); # else snprintf(ttyname, sizeof(ttyname), "COM%u", j); # endif # endif // __WOE32__ LOG_VERBOSE("Found serial port %s", ttyname); inpTTYdev->add(ttyname); # if USE_HAMLIB inpRIGdev->add(ttyname); # endif inpXmlRigDevice->add(ttyname); select_nanoIO_CommPort->add(ttyname); select_nanoCW_CommPort->add(ttyname); select_WK_CommPort->add(ttyname); select_WKFSK_CommPort->add(ttyname); } #else // __APPLE__ glob_t gbuf; glob(tty_fmt[i], 0, NULL, &gbuf); for (size_t j = 0; j < gbuf.gl_pathc; j++) { int ret1 = !stat(gbuf.gl_pathv[j], &st); int ret2 = S_ISCHR(st.st_mode); if (ret1) { LOG_INFO("Serial port %s", gbuf.gl_pathv[j]); LOG_INFO(" device mode: %X", st.st_mode); LOG_INFO(" char device? %s", ret2 ? "Y" : "N"); } else LOG_INFO("%s does not return stat query", gbuf.gl_pathv[j]); if ( (ret1 && ret2 ) || strstr(gbuf.gl_pathv[j], "modem") ) inpTTYdev->add(gbuf.gl_pathv[j]); else continue; # if USE_HAMLIB inpRIGdev->add(gbuf.gl_pathv[j]); # endif inpXmlRigDevice->add(gbuf.gl_pathv[j]); select_nanoIO_CommPort->add(gbuf.gl_pathv[j]); select_nanoCW_CommPort->add(gbuf.gl_pathv[j]); select_USN_FSK_port->add(gbuf.gl_pathv[j]); select_Nav_config_port->add(gbuf.gl_pathv[j]); select_WK_CommPort->add(gbuf.gl_pathv[j]); select_WKFSK_CommPort->add(gbuf.gl_pathv[j]); } globfree(&gbuf); #endif // __APPLE__ } #if HAVE_UHROUTER if (stat(UHROUTER_FIFO_PREFIX "Read", &st) != -1 && S_ISFIFO(st.st_mode) && stat(UHROUTER_FIFO_PREFIX "Write", &st) != -1 && S_ISFIFO(st.st_mode)) inpTTYdev->add(UHROUTER_FIFO_PREFIX); #endif // HAVE_UHROUTER } Fl_Font font_number(const char* name) { int n = (int)Fl::set_fonts(0); for (int i = 0; i < n; i++) { if (strcmp(Fl::get_font_name((Fl_Font)i), name) == 0) return (Fl_Font)i; } return FL_HELVETICA; } void configuration::initFonts(void) { RxFontnbr = TxFontnbr = WaterfallFontnbr = ViewerFontnbr = FreqControlFontnbr = MacroBtnFontnbr = MacroEditFontnbr = DXC_textfont = DXfontnbr = LOGGINGtextfont = LOGBOOKtextfont = FL_HELVETICA; if (!RxFontName.empty()) RxFontnbr = font_number(RxFontName.c_str()); if (!TxFontName.empty()) TxFontnbr = font_number(TxFontName.c_str()); if (!WaterfallFontName.empty()) WaterfallFontnbr = font_number(WaterfallFontName.c_str()); if (!ViewerFontName.empty()) ViewerFontnbr = font_number(ViewerFontName.c_str()); if (!FreqControlFontName.empty()) FreqControlFontnbr = font_number(FreqControlFontName.c_str()); if (!MacroEditFontName.empty()) MacroEditFontnbr = font_number(MacroEditFontName.c_str()); if (!MacroBtnFontName.empty()) MacroBtnFontnbr = font_number(MacroBtnFontName.c_str()); if (!DXC_textname.empty()) DXC_textfont = font_number(DXC_textname.c_str()); if (!DXfontname.empty()) DXfontnbr = font_number(DXfontname.c_str()); if (!LOGGINGfontname.empty()) LOGGINGtextfont = font_number(LOGGINGfontname.c_str()); if (!LOGBOOKtextname.empty()) LOGBOOKtextfont = font_number(LOGBOOKtextname.c_str()); } fldigi-4.1.06/src/misc/benchmark.cxx0000644000175000017500000001706113472115773014200 00000000000000// ---------------------------------------------------------------------------- // benchmark.cxx // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #ifndef __MINGW32__ # include #else # include "compat.h" #endif #if USE_SNDFILE # include #endif #include "fl_digi.h" #include "modem.h" #include "trx.h" #include "timeops.h" #include "configuration.h" #include "status.h" #include "debug.h" #include "benchmark.h" using namespace std; struct benchmark_params benchmark = { MODE_PSK31, 1000, false, false, 0.0, 1.0, SRC_SINC_FASTEST }; int setup_benchmark(void) { ENSURE_THREAD(FLMAIN_TID); if (benchmark.input.empty()) { LOG_ERROR("Missing input"); return 1; } else { char* p; benchmark.samples = (size_t)strtol(benchmark.input.c_str(), &p, 10); if (*p != '\0') { // invalid char in input string #if USE_SNDFILE // treat as filename benchmark.samples = 0; #else LOG_ERROR("Bad input string, \"%s\"", benchmark.input.c_str()); return 1; #endif } } if (!benchmark.output.empty()) benchmark.buffer.reserve(BUFSIZ); progdefaults.rsid = false; progdefaults.StartAtSweetSpot = false; if (benchmark.modem != NUM_MODES) progStatus.lastmode = benchmark.modem; if (benchmark.freq) progStatus.carrier = benchmark.freq; progStatus.afconoff = benchmark.afc; progStatus.sqlonoff = benchmark.sql; progStatus.sldrSquelchValue = benchmark.sqlevel; debug::level = debug::INFO_LEVEL; TRX_WAIT(STATE_ENDED, trx_start(); init_modem(progStatus.lastmode)); if (!benchmark.output.empty()) { ofstream out(benchmark.output.c_str()); if (out) out << benchmark.buffer; } return 0; } #if USE_SNDFILE SNDFILE* infile = 0; #endif static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]); static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]); void do_benchmark(void) { ENSURE_THREAD(TRX_TID); stringstream info; if (benchmark.src_ratio != 1.0) info << "modem=" << active_modem->get_mode() << " (" << mode_info[active_modem->get_mode()].sname << ")" << " rate=" << active_modem->get_samplerate() << " ratio=" << benchmark.src_ratio << " converter=" << benchmark.src_type << " (" << src_get_name(benchmark.src_type) << ")"; else info << "modem=" << active_modem->get_mode() << " (" << mode_info[active_modem->get_mode()].sname << ")" << " rate=" << active_modem->get_samplerate(); LOG_INFO("%s", info.str().c_str()); #if USE_SNDFILE if (!benchmark.samples) { SF_INFO info = { 0, 0, 0, 0, 0, 0 }; if ((infile = sf_open(benchmark.input.c_str(), SFM_READ, &info)) == NULL) { LOG_ERROR("Could not open input file \"%s\"", benchmark.input.c_str()); return; } } #endif struct rusage ru[2]; struct timespec wall_time[2]; size_t nproc, nrx; if (benchmark.src_ratio == 1.0) nrx = nproc = do_rx(ru, wall_time); else { nproc = do_rx_src(ru, wall_time); nrx = (size_t)(nproc * benchmark.src_ratio); } ru[1].ru_utime -= ru[0].ru_utime; wall_time[1] -= wall_time[0]; #if USE_SNDFILE if (infile) { sf_close(infile); infile = 0; } #endif info << "processed: " << nproc << " samples (decoded " << nrx << ") in " << precision(3) << wall_time[1].tv_sec + wall_time[1].tv_nsec / 1e9 << " seconds"; LOG_INFO("%s", info.str().c_str()); double speed = nproc / (ru[1].ru_utime.tv_sec + ru[1].ru_utime.tv_usec / 1e6); info << "cpu time : " << width(10) << (intmax_t)ru[1].ru_utime.tv_sec << "." << width(3) << fill('0') << (intmax_t)ru[1].ru_utime.tv_usec / 1000 << "; speed=" << speed << "/s; factor=" << speed / active_modem->get_samplerate(); LOG_INFO("%s", info.str().c_str()); } // ---------------------------------------------------------------------------- static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]) { size_t nread; size_t inlen = 1 << 19; double* inbuf = new double[inlen]; #if USE_SNDFILE if (infile) { nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); for (size_t n; (n = sf_readf_double(infile, inbuf, inlen)); nread += n) active_modem->rx_process(inbuf, n); } else #endif { memset(inbuf, 0, sizeof(double) * inlen); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); for (nread = benchmark.samples; nread > inlen; nread -= inlen) active_modem->rx_process(inbuf, inlen); if (nread) active_modem->rx_process(inbuf, nread); nread = benchmark.samples; } getrusage(RUSAGE_SELF, &ru[1]); clock_gettime(CLOCK_MONOTONIC, &wall_time[1]); delete [] inbuf; return nread; } size_t inlen = 1 << 19; static float* inbuf = 0; static long src_read(void* arg, float** data) { *data = inbuf; return inlen; } #if USE_SNDFILE static long src_readf(void* arg, float** data) { long n = (long)sf_readf_float(infile, inbuf, inlen); *data = n ? inbuf : 0; return n; } #endif static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]) { int err; SRC_STATE* src_state; #if USE_SNDFILE if (infile) src_state = src_callback_new(src_readf, benchmark.src_type, 1, &err, NULL); else #endif src_state = src_callback_new(src_read, benchmark.src_type, 1, &err, NULL); if (!src_state) { LOG_ERROR("src_callback_new error %d: %s", err, src_strerror(err)); return 0; } inbuf = new float[inlen]; size_t outlen = (size_t)floor(inlen * benchmark.src_ratio); float* outbuf = new float[outlen]; double* rxbuf = new double[outlen]; long n; size_t nread; #if USE_SNDFILE if (infile) { // read until src returns 0 nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); while ((n = src_callback_read(src_state, benchmark.src_ratio, outlen, outbuf))) { for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); nread += n; } nread = (size_t)round(nread * benchmark.src_ratio); } else #endif { // read benchmark.samples * benchmark.src_ratio nread = (size_t)round(benchmark.samples * benchmark.src_ratio); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); while (nread > outlen) { if ((n = src_callback_read(src_state, benchmark.src_ratio, outlen, outbuf)) == 0) break; for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); nread -= (size_t)n; } if (nread) { if ((n = src_callback_read(src_state, benchmark.src_ratio, nread, outbuf))) { for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); } } nread = benchmark.samples; } getrusage(RUSAGE_SELF, &ru[1]); clock_gettime(CLOCK_MONOTONIC, &wall_time[1]); delete [] inbuf; delete [] outbuf; delete [] rxbuf; return nread; } fldigi-4.1.06/src/misc/ax25_decode.cxx0000644000175000017500000006625313472115773014337 00000000000000// --------------------------------------------------------------------- // ax25_decode.cxx -- AX25 Packet disassembler. // // This file is a proposed part of fldigi. Adapted very liberally from // rtty.cxx, with many thanks to John Hansen, W2FS, who wrote // 'dcc.doc' and 'dcc2.doc', GNU Octave, GNU Radio Companion, and finally // Bartek Kania (bk.gnarf.org) whose 'aprs.c' expository coding style helped // shape this implementation. // // Copyright (C) 2010, 2014 // Dave Freese, W1HKJ // Chris Sylvain, KB3CS // Robert Stiles, KK5VD // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #include "fl_digi.h" #include "modem.h" #include "misc.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "timeops.h" #include "debug.h" #include "qrunner.h" #include "threads.h" #include "ax25_decode.h" static PKT_MicE_field MicE_table[][12][5] = { { { Zero, Zero, South, P0, East }, { One, Zero, South, P0, East }, { Two, Zero, South, P0, East }, { Three, Zero, South, P0, East }, { Four, Zero, South, P0, East }, { Five, Zero, South, P0, East }, { Six, Zero, South, P0, East }, { Seven, Zero, South, P0, East }, { Eight, Zero, South, P0, East }, { Nine, Zero, South, P0, East }, { Invalid, Null, Null, Null, Null }, { Invalid, Null, Null, Null, Null } }, { // ['A'..'K'] + 'L' { Zero, One, Null, Null, Null }, // custom A/B/C msg codes { One, One, Null, Null, Null }, { Two, One, Null, Null, Null }, { Three, One, Null, Null, Null }, { Four, One, Null, Null, Null }, { Five, One, Null, Null, Null }, { Six, One, Null, Null, Null }, { Seven, One, Null, Null, Null }, { Eight, One, Null, Null, Null }, { Nine, One, Null, Null, Null }, { Space, One, Null, Null, Null }, { Space, Zero, South, P0, East } }, { // ['P'..'Z'] { Zero, One, North, P100, West }, // standard A/B/C msg codes { One, One, North, P100, West }, { Two, One, North, P100, West }, { Three, One, North, P100, West }, { Four, One, North, P100, West }, { Five, One, North, P100, West }, { Six, One, North, P100, West }, { Seven, One, North, P100, West }, { Eight, One, North, P100, West }, { Nine, One, North, P100, West }, { Space, One, North, P100, West }, { Invalid, Null, Null, Null, Null } } }; static PKT_PHG_table PHG_table[] = { { "Omni", 4 }, { "NE", 2 }, { "E", 1 }, { "SE", 2 }, { "S", 1 }, { "SW", 2 }, { "W", 1 }, { "NW", 2 }, { "N", 1 } }; static unsigned char rxbuf[MAXOCTETS+4]; int mode = FTextBase::RECV; #define put_rx_char put_rx_local_char inline void put_rx_local_char(char value) { put_rx_processed_char(value, mode); } inline void put_rx_hex(unsigned char c) { char v[3]; snprintf(&v[0], 3, "%02x", c); put_rx_char(v[0]); put_rx_char(v[1]); } inline void put_rx_const(const char s[]) { unsigned char *p = (unsigned char *) &s[0]; for( ; *p; p++) put_rx_char(*p); } static void expand_Cmp(unsigned char *cpI) { // APRS Spec 1.0.1 Chapter 9 - Compressed Position Report format unsigned char *cp, tc, cc; unsigned char Cmpbuf[96], *bp = &Cmpbuf[0]; unsigned char *tbp = bp; double Lat, Lon, td; bool sign; cp = cpI+1; // skip past Symbol Table ID char // Latitude as base91 number tc = *cp++ - 33; Lat = tc * 91 * 91 * 91; // fourth digit ==> x * 91^3 tc = *cp++ - 33; Lat += tc * 91 * 91; // third digit ==> x * 91^2 tc = *cp++ - 33; Lat += tc * 91; // second digit ==> x * 91^1 tc = *cp++ - 33; Lat += tc; // units digit ==> x * 91^0 Lat = 90.0 - Lat / 380926.0; // - ==> S, + ==> N // Longitude as base91 number tc = *cp++ - 33; Lon = tc * 91 * 91 * 91; // 4th digit tc = *cp++ - 33; Lon += tc * 91 * 91; // 3rd digit tc = *cp++ - 33; Lon += tc * 91; // 2nd digit tc = *cp++ - 33; Lon += tc; // units digit Lon = -180.0 + Lon / 190463.0; // - ==> W, + ==> E if (Lat < 0) { sign = 1; // has sign (is negative) Lat *= -1; } else sign = 0; td = Lat - floor(Lat); cc = snprintf((char *)bp, 3, "%2.f", (Lat - td)); // DD bp += cc; cc = snprintf((char *)bp, 6, "%05.2f", td*60); // MM.MM bp += cc; if (sign) *bp++ = 'S'; else *bp++ = 'N'; *bp++ = ' '; if (Lon < 0) { sign = 1; Lon *= -1; } else sign = 0; td = Lon - floor(Lon); cc = snprintf((char *)bp, 4, "%03.f", (Lon - td)); // DDD bp += cc; cc = snprintf((char *)bp, 6, "%5.2f", td*60); // MM.MM bp += cc; if (sign) *bp++ = 'W'; else *bp++ = 'E'; cp += 1; // skip past Symbol Code char if (*cp != ' ') { // still more if ((*(cp + 2) & 0x18) == 0x10) { // NMEA source = GGA sentence // compressed Altitude uses chars in the same range // as CSE/SPD but the Compression Type ID takes precedence // when it indicates the NMEA source is a GGA sentence. // so check on this one first and CSE/SPD last. double Altitude; tc = *cp++ - 33; // 2nd digit Altitude = tc * 91; tc = *cp++ - 33; Altitude += tc; // this compressed posit field is not very useful as spec'ed, // since it cannot produce a possible negative altitude! // the NMEA GGA sentence is perfectly capable of providing // a negative altitude value. Mic-E gets this right. // Since the example given in the APRS 1.0.1 Spec uses a value // in excess of 10000, this field should be re-spec'ed as a // value in meters relative to 10km below mean sea level (just // as done in Mic-E). Altitude = pow(1.002, Altitude); if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 11, " %-.1fm", Altitude*0.3048); else // units per Spec cc = snprintf((char *)bp, 12, " %-.1fft", Altitude); bp += cc; } else if (*cp == '{') { // pre-calculated radio range double Range; cp += 1; // skip past ID char tc = *cp++ - 33; // range Range = pow(1.08, (double)tc) * 2; if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 24, " Est. Range = %-.1fkm", Range*1.609); else // units per Spec cc = snprintf((char *)bp, 24, " Est. Range = %-.1fmi", Range); bp += cc; } else if (*cp >= '!' && *cp <= 'z') { // compressed CSE/SPD int Speed; tc = *cp++ - 33; // course cc = snprintf((char *)bp, 8, " %03ddeg", tc*4); bp += cc; tc = *cp++ - 33; // speed Speed = (int)floor(pow(1.08, (double)tc) - 1); // 1.08^tc - 1 kts if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 8, " %03dkph", (int)floor(Speed*1.852+0.5)); else if (progdefaults.PKT_unitsEnglish) cc = snprintf((char *)bp, 8, " %03dmph", (int)floor(Speed*1.151+0.5)); else // units per Spec cc = snprintf((char *)bp, 8, " %03dkts", Speed); bp += cc; } } if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [Cmp] "); for(; tbp < bp; tbp++) put_rx_char(*tbp); put_rx_char('\r'); if (debug::level >= debug::VERBOSE_LEVEL) { cp = cpI+12; // skip to Compression Type ID char if (*(cp - 2) != ' ') { // Cmp Type ID is valid tbp = bp = &Cmpbuf[0]; tc = *cp - 33; // T cc = snprintf((char *)bp, 4, "%02x:", tc); bp += cc; strcpy((char *)bp, " GPS Fix = "); bp += 11; if ((tc & 0x20) == 0x20) { strcpy((char *)bp, "old"); bp += 3; } else { strcpy((char *)bp, "current"); bp += 7; } strcpy((char *)bp, ", NMEA Source = "); bp += 16; switch (tc & 0x18) { case 0x00: strcpy((char *)bp, "other"); bp += 5; break; case 0x08: strcpy((char *)bp, "GLL"); bp += 3; break; case 0x10: strcpy((char *)bp, "GGA"); bp += 3; break; case 0x18: strcpy((char *)bp, "RMC"); bp += 3; break; default: strcpy((char *)bp, "\?\?"); bp += 2; break; } strcpy((char *)bp, ", Cmp Origin = "); bp += 15; switch (tc & 0x07) { case 0x00: strcpy((char *)bp, "Compressed"); bp += 10; break; case 0x01: strcpy((char *)bp, "TNC BText"); bp += 9; break; case 0x02: strcpy((char *)bp, "Software (DOS/Mac/Win/+SA)"); bp += 26; break; case 0x03: strcpy((char *)bp, "[tbd]"); bp += 5; break; case 0x04: strcpy((char *)bp, "KPC3"); bp += 4; break; case 0x05: strcpy((char *)bp, "Pico"); bp += 4; break; case 0x06: strcpy((char *)bp, "Other tracker [tbd]"); bp += 19; break; case 0x07: strcpy((char *)bp, "Digipeater conversion"); bp += 21; break; default: strcpy((char *)bp, "\?\?"); bp += 2; break; } if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [CmpType] "); for(; tbp < bp; tbp++) put_rx_char(*tbp); put_rx_char('\r'); } } } static void expand_PHG(unsigned char *cpI) { // APRS Spec 1.0.1 Chapter 6 - Time and Position format // APRS Spec 1.0.1 Chapter 7 - PHG Extension format bool hasPHG = false; unsigned char *cp, tc, cc; unsigned char PHGbuf[64], *bp = &PHGbuf[0]; unsigned char *tbp = bp; switch (*cpI) { case '!': case '=': // simplest posits cp = cpI+1; // skip past posit ID char if (*cp != '/') { // posit not compressed cp += 19; // skip past posit data } else { // posit is compressed cp += 1; // skip past compressed posit ID char cp += 12; // skip past compressed posit data } if (strncmp((const char *)cp, "PHG", 3) == 0) { // strings match unsigned char ndigits; int power, height; double gain, range; cp += 3; // skip past Data Extension ID chars // get span of chars in cp which are only digits ndigits = strspn((const char *)cp, "0123456789"); switch (ndigits) { //case 1: H might be larger than '9'. code below will work. // must also check that P.GD are all '0'-'9' //break; case 4: // APRS Spec 1.0.1 Chapter 7 page 28 case 5: // PHGR proposed for APRS Spec 1.2 hasPHG = true; tc = *cp++ - '0'; // P power = tc * tc; // tc^2 cc = snprintf((char *)bp, 5, "%dW,", power); bp += cc; tc = *cp++ - '0'; // H *bp++ = ' '; if (tc < 30) { // constrain Height to signed 32bit value height = 10 * (1 << tc); // 10 * 2^tc if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 11, "%dm", (int)floor(height*0.3048+0.5)); else // units per Spec cc = snprintf((char *)bp, 12, "%dft", height); bp += cc; } else { height = 0; strcpy((char *)bp, "-\?\?-"); bp += 4; } strcpy((char *)bp, " HAAT,"); bp += 6; tc = *cp++; // G gain = pow(10, ((double)(tc - '0') / 10)); cc = snprintf((char *)bp, 6, " %cdB,", tc); bp += cc; tc = *cp++ - '0'; // D *bp++ = ' '; if (tc < 9) { strcpy((char *)bp, PHG_table[tc].s); bp += PHG_table[tc].l; } else { strcpy((char *)bp, "-\?\?-"); bp += 4; } *bp++ = ','; range = sqrt(2 * height * sqrt(((double)power / 10) * (gain / 2))); if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 24, " Est. Range = %-.1fkm", range*1.609); else // units per Spec cc = snprintf((char *)bp, 24, " Est. Range = %-.1fmi", range); bp += cc; if (ndigits == 5 && *(cp + 1) == '/') { // PHGR: http://www.aprs.org/aprs12/probes.txt // '1'-'9' and 'A'-'Z' are actually permissible. // does anyone send 10 ('A') or more beacons per hour? strcpy((char *)bp, ", "); bp += 2; tc = *cp++; // R cc = snprintf((char *)bp, 14, "%c beacons/hr", tc); bp += cc; } break; default: // switch(ndigits) break; } } break; default: // switch(*cpI) break; } if (hasPHG) { if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [PHG] "); for(; tbp < bp; tbp++) put_rx_char(*tbp); put_rx_char('\r'); } } static void expand_MicE(unsigned char *cpI, unsigned char *cpE) { // APRS Spec 1.0.1 Chapter 10 - Mic-E Data format bool isMicE = true; bool msgstd = false, msgcustom = false; // decoding starts at first AX.25 dest addr unsigned char *cp = &rxbuf[1], tc, cc; unsigned char MicEbuf[64], *bp = &MicEbuf[0]; unsigned char *tbp = bp; unsigned int msgABC = 0; PKT_MicE_field Lat = North, LonOffset = Zero, Lon = West; for (int i = 0; i < 3; i++) { // remember: AX.25 dest addr chars are shifted left by one tc = *cp++ >> 1; switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc < 12) { bool t = MicE_table[1][cc][1]-'0'; if (t) { msgABC |= t << (2-i); msgcustom = true; } else msgABC &= ~(1 << (2-i)); *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { msgABC |= (MicE_table[2][cc][1]-'0') << (2-i); msgstd = true; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } } for (int i = 3; i < 6; i++) { // remember: AX.25 dest addr chars are shifted left by one tc = *cp++ >> 1; switch (i) { case 3: switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { Lat = MicE_table[0][cc][2]; *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc == 11) { Lat = MicE_table[1][cc][2]; *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { Lat = MicE_table[2][cc][2]; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } break; case 4: switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { LonOffset = MicE_table[0][cc][3]; *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc == 11) { LonOffset = MicE_table[1][cc][3]; *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { LonOffset = MicE_table[2][cc][3]; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } break; case 5: switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { Lon = MicE_table[0][cc][4]; *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc == 11) { Lon = MicE_table[1][cc][4]; *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { Lon = MicE_table[2][cc][4]; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } break; default: // Invalid isMicE = false; break; } } if (isMicE) { int Speed = 0, Course = 0; if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [Mic-E] "); if (msgstd && msgcustom) put_rx_const("Unknown? "); else if (msgcustom) { put_rx_const("Custom-"); put_rx_char((7 - msgABC)+'0'); put_rx_const(". "); } else { switch (msgABC) { // APRS Spec 1.0.1 Chapter 10 page 45 case 0: put_rx_const("Emergency"); break; case 1: put_rx_const("Priority"); break; case 2: put_rx_const("Special"); break; case 3: put_rx_const("Committed"); break; case 4: put_rx_const("Returning"); break; case 5: put_rx_const("In Service"); break; case 6: put_rx_const("En Route"); break; case 7: put_rx_const("Off Duty"); break; default: put_rx_const("-\?\?-"); break; } if (msgABC) put_rx_char('.'); else put_rx_char('!'); // Emergency! put_rx_char(' '); } for (; tbp < bp; tbp++) { put_rx_char(*tbp); if (tbp == (bp - 3)) put_rx_char('.'); } if (Lat == North) put_rx_char('N'); else if (Lat == South) put_rx_char('S'); else put_rx_char('\?'); put_rx_char(' '); cp = cpI+1; // one past the Data Type ID char // decode Lon degrees - APRS Spec 1.0.1 Chapter 10 page 48 tc = *cp++ - 28; if (LonOffset == P100) tc += 100; if (tc > 179 && tc < 190) tc -= 80; else if (tc > 189 && tc < 200) tc -= 190; cc = snprintf((char *)bp, 4, "%03d", tc); bp += cc; // decode Lon minutes tc = *cp++ - 28; if (tc > 59) tc -= 60; cc = snprintf((char *)bp, 3, "%02d", tc); bp += cc; // decode Lon hundredths of a minute tc = *cp++ - 28; cc = snprintf((char *)bp, 3, "%02d", tc); bp += cc; for (; tbp < bp; tbp++) { put_rx_char(*tbp); if (tbp == (bp - 3)) put_rx_char('.'); } if (Lon == East) put_rx_char('E'); else if (Lon == West) put_rx_char('W'); else put_rx_char('\?'); // decode Speed and Course - APRS Spec 1.0.1 Chapter 10 page 52 tc = *cp++ - 28; // speed: hundreds and tens if (tc > 79) tc -= 80; Speed = tc * 10; tc = *cp++ - 28; // speed: units and course: hundreds Course = (tc % 10); // remainder from dividing by 10 tc -= Course; tc /= 10; // tc is now quotient from dividing by 10 Speed += tc; if (Course > 3) Course -= 4; Course *= 100; tc = *cp++ - 28; // course: tens and units Course += tc; if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 8, " %03dkph", (int)floor(Speed*1.852+0.5)); else if (progdefaults.PKT_unitsEnglish) cc = snprintf((char *)bp, 8, " %03dmph", (int)floor(Speed*1.151+0.5)); else // units per Spec cc = snprintf((char *)bp, 8, " %03dkts", Speed); bp += cc; cc = snprintf((char *)bp, 8, " %03ddeg", Course); bp += cc; for (; tbp < bp; tbp++) { put_rx_char(*tbp); } cp += 2; // skip past Symbol and Symbol Table ID chars if (cp <= cpE) { // still more if (*cp == '>') { cp += 1; put_rx_const(" TH-D7"); } else if (*cp == ']' && *cpE == '=') { cp += 1; cpE -= 1; put_rx_const(" TM-D710"); } else if (*cp == ']') { cp += 1; put_rx_const(" TM-D700"); } else if (*cp == '\'' && *(cpE - 1) == '|' && *cpE == '3') { cp += 1; cpE -= 2; put_rx_const(" TT3"); } else if (*cp == '\'' && *(cpE - 1) == '|' && *cpE == '4') { cp += 1; cpE -= 2; put_rx_const(" TT4"); } else if (*cp == '`' && *(cpE - 1) == '_' && *cpE == ' ') { cp += 1; cpE -= 2; put_rx_const(" VX-8"); } else if (*cp == '`' && *(cpE - 1) == '_' && *cpE == '#') { cp += 1; cpE -= 2; put_rx_const(" VX-8D/G"); // VX-8G for certain. guessing. } else if (*cp == '`' && *(cpE - 1) == '_' && *cpE == '\"') { cp += 1; cpE -= 2; put_rx_const(" FTM-350"); } else if ((*cp == '\'' || *cp == '`') && *(cp + 4) == '}') { cp += 1; // tracker? rig? ID codes are somewhat ad hoc. put_rx_const(" MFR\?"); } if (cp < cpE) { if (*(cp + 3) == '}') { // station altitude as base91 number int Altitude = 0; tc = *cp++ - 33; // third digit ==> x * 91^2 Altitude = tc * 91 * 91; tc = *cp++ - 33; // second digit ==> x * 91^1 ==> x * 91 Altitude += tc * 91; tc = *cp++ - 33; // unit digit ==> x * 91^0 ==> x * 1 Altitude += tc; Altitude -= 10000; // remove offset from datum *bp++ = ' '; if (Altitude >= 0) *bp++ = '+'; if (progdefaults.PKT_unitsEnglish) cc = snprintf((char *)bp, 12, "%dft", (int)floor(Altitude*3.281+0.5)); else // units per Spec cc = snprintf((char *)bp, 11, "%dm", Altitude); bp += cc; for (; tbp < bp; tbp++) { put_rx_char(*tbp); } cp += 1; // skip past '}' } } if (cp < cpE) put_rx_char(' '); for (; cp <= cpE; cp++) put_rx_char(*cp); } put_rx_char('\r'); } } static void do_put_rx_char(unsigned char *cp, size_t count) { int i, j; unsigned char c; bool isMicE = false; unsigned char *cpInfo; for (i = 8; i < 14; i++) { // src callsign is second in AX.25 frame c = rxbuf[i] >> 1; if (c != ' ') put_rx_char(c); // skip past padding (if any) } // bit 7 = command/response bit // bits 6,5 = 1 // bits 4-1 = src SSID // bit 0 = last callsign flag c = (rxbuf[14] & 0x7f) >> 1; if (c > 0x30) { put_rx_char('-'); if (c < 0x3a) put_rx_char(c); else { put_rx_char('1'); put_rx_char(c-0x0a); } } put_rx_char('>'); for (i = 1; i < 7; i++) { // dest callsign is first in AX.25 frame c = rxbuf[i] >> 1; if (c != ' ') put_rx_char(c); } c = (rxbuf[7] & 0x7f) >> 1; if (c > 0x30) { put_rx_char('-'); if (c < 0x3a) put_rx_char(c); else { put_rx_char('1'); put_rx_char(c-0x0a); } } j=8; if ((rxbuf[14] & 0x01) != 1) { // check last callsign flag do { put_rx_char(','); j += 7; for (i = j; i < (j+6); i++) { c = rxbuf[i] >> 1; if (c != ' ') put_rx_char(c); } c = (rxbuf[j+6] & 0x7f) >> 1; if (c > 0x30) { put_rx_char('-'); if (c < 0x3a) put_rx_char(c); else { put_rx_char('1'); put_rx_char(c-0x0a); } } } while ((rxbuf[j+6] & 0x01) != 1); if (rxbuf[j+6] & 0x80) // packet gets no more hops put_rx_char('*'); } if (debug::level < debug::VERBOSE_LEVEL) { // skip past CTRL and PID to INFO bytes when I_FRAME // puts buffer pointer in FCS when U_FRAME and S_FRAME // (save CTRL byte for possible MicE decoding) j += 7; c = rxbuf[j]; j += 2; } else { // show more frame info when .ge. VERBOSE debug level j += 7; put_rx_char(';'); c = rxbuf[j]; // CTRL present in all frames if ((c & 0x01) == 0) { // I_FRAME unsigned char p = rxbuf[j+1]; // PID present only in I_FRAME if (debug::level == debug::DEBUG_LEVEL) { put_rx_hex(c); put_rx_char(' '); put_rx_hex(p); put_rx_char(';'); } put_rx_const("I/"); put_rx_hex( (c & 0xE0) >> 5 ); // AX.25 v2.2 para 2.3.2.1 if (c & 0x10) put_rx_char('*'); // P/F bit else put_rx_char('.'); put_rx_hex( (c & 0x0E) >> 1 ); put_rx_char('/'); switch (p) { // AX.25 v2.2 para 2.2.4 case 0x01: put_rx_const("X.25PLP"); break; case 0x06: put_rx_const("C-TCPIP"); break; case 0x07: put_rx_const("U-TCPIP"); break; case 0x08: put_rx_const("FRAG"); break; case 0xC3: put_rx_const("TEXNET"); break; case 0xC4: put_rx_const("LQP"); break; case 0xCA: put_rx_const("ATALK"); break; case 0xCB: put_rx_const("ATALK-ARP"); break; case 0xCC: put_rx_const("ARPA-IP"); break; case 0xCD: put_rx_const("ARPA-AR"); break; case 0xCE: put_rx_const("FLEXNET"); break; case 0xCF: put_rx_const("NET/ROM"); break; case 0xF0: put_rx_const("NO-L3"); break; case 0xFF: put_rx_const("L3ESC="); put_rx_hex(rxbuf[++j]); break; default: if ((p & 0x30) == 0x10) put_rx_const("L3V1"); else if ((p & 0x30) == 0x20) put_rx_const("L3V2"); else put_rx_const("L3-RSVD"); put_rx_char('='); put_rx_hex(p); break; } } else if ((c & 0x03) == 0x01) { // S_FRAME if (debug::level == debug::DEBUG_LEVEL) { put_rx_hex(c); put_rx_char(';'); } put_rx_const("S/"); put_rx_hex( (c & 0xE0) >> 5 ); if (c & 0x10) put_rx_char('*'); else put_rx_char('.'); put_rx_char('/'); switch (c & 0x0C) { // AX.25 v2.2 para 2.3.4.2 case 0x00: put_rx_const("RR"); break; case 0x04: put_rx_const("RNR"); break; case 0x08: put_rx_const("REJ"); break; case 0x0C: default: put_rx_const("UNK"); break; } } else if ((c & 0x03) == 0x03) { // U_FRAME if (debug::level == debug::DEBUG_LEVEL) { put_rx_hex(c); put_rx_char(';'); } put_rx_char('U'); if (c & 0x10) put_rx_char('*'); else put_rx_char('.'); switch (c & 0xEC) { // AX.25 v2.2 para 2.3.4.3 case 0x00: put_rx_const("UI"); break; case 0x0E: put_rx_const("DM"); break; case 0x1E: put_rx_const("SABM"); break; case 0x20: put_rx_const("DISC"); break; case 0x30: put_rx_const("UA"); break; case 0x81: put_rx_const("FRMR"); break; default: put_rx_const("UNK"); break; } } j+=2; } put_rx_char(':'); // ptr to first info field char cpInfo = &rxbuf[j]; if ((c & 0x03) == 0x03 && (c & 0xEC) == 0x00 && (*cpInfo == '\'' || *cpInfo == '`' || *cpInfo == 0x1C || *cpInfo == 0x1D) && (cp - cpInfo) > 7) { /* Mic-E must have at least 8 info chars + Data Type ID char cp - (cpInfo - 1) > 8 ==> cp - cpInfo > 7 */ // this is very probably a Mic-E encoded packet isMicE = true; } // offset between last info char (not FCS) and bufhead //i = (cp - &rxbuf[0]); // (cp - &rxbuf[1]) + 1 ==> (cp - &rxbuf[0]) i = count; // (cp - &rxbuf[1]) + 1 ==> (cp - &rxbuf[0]) while (j < i) put_rx_char(rxbuf[j++]); if (*(cp-1) != '\r') put_rx_char('\r'); // only for packets not ending with // cp points to FCS, so (cp-X) is last info field char if ((progdefaults.PKT_expandMicE || debug::level >= debug::VERBOSE_LEVEL) && isMicE) expand_MicE(cpInfo, (*(cp-1) == '\r' ? cp-2 : cp-1)); // need to deal with posits having timestamps ('/' and '@' leading char) if (*cpInfo == '!' || *cpInfo == '=') { if ((progdefaults.PKT_expandCmp || debug::level >= debug::VERBOSE_LEVEL) && (*(cpInfo + 1) == '/' || *(cpInfo + 1) == '\\')) // compressed posit expand_Cmp(cpInfo+1); if (progdefaults.PKT_expandPHG || debug::level >= debug::VERBOSE_LEVEL) // look for PHG data expand_PHG(cpInfo); } if (*(cp-1) == '\r') put_rx_char('\r'); // for packets ending with : show it on-screen } extern bool PERFORM_CPS_TEST; static pthread_mutex_t decode_lock_mutex = PTHREAD_MUTEX_INITIALIZER; void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag) { guard_lock decode_lock(&decode_lock_mutex); if(!buffer && !count) return; if(count > MAXOCTETS) count = MAXOCTETS; memset(rxbuf, 0, sizeof(rxbuf)); if(pad) { rxbuf[0] = 0xfe; memcpy(&rxbuf[1], buffer, count); count++; } else { memcpy(rxbuf, buffer, count); } if(tx_flag) { mode = FTextBase::XMIT; } else { mode = FTextBase::RECV; } do_put_rx_char(&rxbuf[count], count); } fldigi-4.1.06/src/misc/outputencoder.cxx0000644000175000017500000001013013472115773015134 00000000000000// ---------------------------------------------------------------------------- // outputencoder.cxx -- output charset conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "config.h" #include "debug.h" using namespace std; /* OutputEncoder accepts UTF-8 strings at input, converts them to the selected encoding and outputs them one character at a time. */ /* Constructor. Look up tiniconv.h for the list of possible values of charset_in. */ OutputEncoder::OutputEncoder(const int charset_out, unsigned int buffer_size) { this->buffer_size = buffer_size; buffer = new unsigned char[buffer_size]; encoding_ptr = buffer; pop_ptr = buffer; set_output_encoding(charset_out); } /* Destructor. */ OutputEncoder::~OutputEncoder(void) { delete[] buffer; } /* Set output encoding. Look up tiniconv.h for the list of possible values of charset_in. */ void OutputEncoder::set_output_encoding(const int charset_out) { tiniconv_init(TINICONV_CHARSET_UTF_8, charset_out, TINICONV_OPTION_IGNORE_OUT_ILSEQ, &ctx); } /* Push input data into the encoder. */ void OutputEncoder::push(string s) { int available = buffer_size - (encoding_ptr - buffer); int consumed_in; int consumed_out; int status = tiniconv_convert(&ctx, (unsigned char*)s.data(), s.length(), &consumed_in, encoding_ptr, available, &consumed_out); if (status != TINICONV_CONVERT_OK) { LOG_ERROR("Error %s", status == TINICONV_CONVERT_IN_TOO_SMALL ? "input too small" : status == TINICONV_CONVERT_OUT_TOO_SMALL ? "output too small" : status == TINICONV_CONVERT_IN_ILSEQ ? "input illegal sequence" : status == TINICONV_CONVERT_OUT_ILSEQ ? "output illegal sequence" : "unknown error"); return; } encoding_ptr += consumed_out; if (consumed_in < (int)s.length()) { // All input data was not consumed, possibly because the // output buffer was too small. Try to vacuum the buffer, // i.e., remove the data that was already pop()ed. memmove(buffer, pop_ptr, buffer + buffer_size - pop_ptr); encoding_ptr -= (pop_ptr - buffer); pop_ptr = buffer; // Now try again; fingers crossed. We don't check for // success anymore, because there is nothing that we can do // if the buffer is still too small. int available = buffer_size - (encoding_ptr - buffer); tiniconv_convert(&ctx, (unsigned char*)s.data()+consumed_in, s.length()-consumed_in, &consumed_in, encoding_ptr, available, &consumed_out); encoding_ptr += consumed_out; } } /* Pop a single character of the encoded data. Returns -1 in case there is no data available. */ const unsigned int OutputEncoder::pop(void) { if (pop_ptr == encoding_ptr) return(-1); unsigned int c = *pop_ptr++; // Note that by only advancing pop_ptr, we leave stale data at the // beginning of the buffer, so sooner or later it will clutter up. // If there is no data left to send, both encoding_ptr and pop_ptr // can be safely reset to the beginning of the buffer; we handle // this trivial case here. More thorough vacuuming will be performed // in push() if the need arises. if (pop_ptr == encoding_ptr) pop_ptr = encoding_ptr = buffer; return(c); } // return next character to be pop'd, do not advance pointers; const unsigned int OutputEncoder::peek(void) { if (pop_ptr == encoding_ptr) return -1; return *pop_ptr; } fldigi-4.1.06/src/misc/stacktrace.cxx0000644000175000017500000001025613472115773014371 00000000000000// ---------------------------------------------------------------------------- // stacktrace.cxx: portable stack trace and error handlers // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #if HAVE_DBG_STACK # include #endif #include #include #include #include #include #ifdef BUILD_FLDIGI # include "main.h" # include "debug.h" #else # include "flarq.h" #endif using namespace std; static volatile sig_atomic_t signum = 0; #if !HAVE_DBG_STACK static void pstack(int fd, unsigned skip = 0); #else static void pstack(ostream& out, unsigned skip = 0); #endif void diediedie(void) { #ifndef __MINGW32__ // If this environment variable is set, creates a core dump. if( getenv("FLDIGI_COREDUMP") ) { signal(SIGSEGV, SIG_DFL); kill(getpid(), SIGSEGV); } #endif static bool print_trace = true; if (!print_trace) exit(128 + (signum ? signum : SIGABRT)); #define CRASH_HEADER "\nAborting " PACKAGE_TARNAME " due to a fatal error.\n" \ "Please report this to: " PACKAGE_BUGREPORT \ "\nor file a bug report at: " PACKAGE_NEWBUG \ "\n\n****** Stack trace:\n" #ifndef __MINGW32__ if (isatty(STDERR_FILENO)) #endif { if (signum) cerr << "\nCaught signal " << signum; cerr << CRASH_HEADER; #if !HAVE_DBG_STACK pstack(STDERR_FILENO); #else pstack(cerr); #endif extern string version_text, build_text; cerr << "\n****** Version information:\n" << version_text << "\n****** Build information:\n" << build_text; string stfname; #ifdef BUILD_FLDIGI stfname.assign(DebugDir).append("stacktrace.txt"); rotate_log(stfname); #else stfname = Logfile; #endif #if !HAVE_DBG_STACK FILE* stfile = fl_fopen(stfname.c_str(), "w"); if (stfile) { pstack(fileno(stfile), 1); fprintf(stfile, "%s\n****** Version information:\n%s\n****** Build information:%s\n", CRASH_HEADER, version_text.c_str(), build_text.c_str()); } #else ofstream stfile(stfname.c_str()); if (stfile) { stfile << CRASH_HEADER; pstack(stfile, 1); stfile << "\n****** Version information:\n" << version_text; stfile << "\n****** Build information:\n" << build_text; } #endif } print_trace = false; exit(128 + (signum ? signum : SIGABRT)); } #if !HAVE_DBG_STACK # if HAVE_EXECINFO_H # include # define MAX_STACK_FRAMES 64 void pstack(int fd, unsigned skip) { void* stack[MAX_STACK_FRAMES]; ++skip; backtrace_symbols_fd(stack + skip, backtrace(stack, MAX_STACK_FRAMES) - skip, fd); } # else void pstack(int fd, unsigned skip) { } # endif #else # include # include # include "stack.h" static void pstack(ostream& out, unsigned skip) { dbg::stack s; dbg::stack::const_iterator start = s.begin(), end = s.end(); while (skip-- && ++start != end); copy(start, end, ostream_iterator(out, "\n")); } #endif void pstack_maybe(void) { static bool trace = getenv("FLDIGI_TRACE_LOCKS"); if (trace) #if !HAVE_DBG_STACK pstack(STDERR_FILENO, 1); #else pstack(cerr, 1); #endif } void handle_unexpected(void) { cerr << "Uncaught exception. Not again!\n"; abort(); } // this may not give us anything useful, but we can try... void handle_signal(int s) { if (s != SIGUSR2) { signum = s; diediedie(); } } fldigi-4.1.06/src/misc/arq_io.cxx0000664000175000017500000005753013507401434013516 00000000000000// ---------------------------------------------------------------------------- // arq_io.cxx // // support for ARQ server/client system such as pskmail and fl_arq // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008-2013 // Stelios Bounanos, M0GLD // Copyright (C) 2009-2013 // John Douyere, VK2ETA // Copyright (c) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #if !defined(__WIN32__) && !defined(__APPLE__) # include # include #endif #include #include "main.h" #include "configuration.h" #include "fl_digi.h" #include "trx.h" #include "arq_io.h" #include "threads.h" #include "socket.h" #include "debug.h" #include "qrunner.h" #include #include LOG_FILE_SOURCE(debug::LOG_ARQCONTROL); using namespace std; // ===================================================================== static pthread_t arq_thread; static pthread_mutex_t arq_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t arq_rx_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t tosend_mutex = PTHREAD_MUTEX_INITIALIZER; static void *arq_loop(void *args); static bool arq_exit = false; static bool arq_enabled; static bool abort_flag = false; /// Any access to shared variables must be protected. static string tosend = ""; // Protected by tosend_mutex //static string enroute = ""; // Protected by tosend_mutex static string arqtext = ""; // Protected by arq_rx_mutex static string txstring = ""; // Protected by arq_rx_mutex bool arq_text_available = false; // Protected by arq_rx_mutex // Beware 'arq_text_available' is accessed by other modules. // ===================================================================== static const char *asc[128] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "" }; string noctrl(string src) { static string retstr; retstr.clear(); char hexstr[10]; int c; for (size_t i = 0; i < src.length(); i++) { c = src[i]; if ( c > 0 && c < 128) retstr.append(asc[c]); else { snprintf(hexstr, sizeof(hexstr), "<%0X>", c & 0xFF); retstr.append(hexstr); } } return retstr; } //====================================================================== extern void parse_arqtext(string &toparse); static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } void ParseMode(string src) { LOG_INFO("%s", src.c_str()); if ((src.find("XMTTUNE") != string::npos) || (src.find("PTTTUNE") != string::npos)) { int msecs = 100; if (src.length() > 7) { int ret = sscanf( src.substr(7, src.length() - 7).c_str(), "%d", &msecs); if (ret != 1 || msecs < 10 || msecs > 20000) msecs = 100; } // if (debug_pskmail) LOG_INFO("%s %5.2f sec", "ARQ set ptt-tune on", msecs/1000.0); REQ_SYNC(&waterfall::set_XmtRcvBtn, wf, true); REQ_SYNC(trx_tune); MilliSleep(msecs); // if (debug_pskmail) LOG_INFO("%s", "ARQ set ptt-tune off"); REQ_SYNC(&waterfall::set_XmtRcvBtn, wf, false); REQ_SYNC(trx_receive); } else for (size_t i = 0; i < NUM_MODES; ++i) { if (strlen(mode_info[i].pskmail_name) > 0) { if (src == mode_info[i].pskmail_name) { if (active_modem->get_mode() == mode_info[i].mode) { LOG_INFO("Active modem already set to %s", src.c_str()); } else { REQ_SYNC(init_modem_sync, mode_info[i].mode, 0); MilliSleep(100); // AbortARQ(); // if (debug_pskmail) LOG_INFO("Modem set to %s", mode_info[i].pskmail_name); } break; } } } WriteARQ('\002'); } void ParseRSID(string src) { if (src == "ON") { // if (debug_pskmail) LOG_INFO("%s", "RsID turned ON"); REQ(set_button, btnRSID, 1); } if (src == "OFF") { // if (debug_pskmail) LOG_INFO("%s", "RsID turned OFF"); REQ(set_button, btnRSID, 0); } } void ParseTxRSID(string src) { if (src == "ON") { // if (debug_pskmail) LOG_INFO("%s", "TxRsID turned ON"); REQ(set_button, btnTxRSID, 1); } if (src == "OFF") { // if (debug_pskmail) LOG_INFO("%s", "TxRsID turned OFF"); REQ(set_button, btnTxRSID, 0); } } void parse_arqtext(string &toparse) { static string strCmdText; static string strSubCmd; unsigned long int idxCmd, idxCmdEnd, idxSubCmd, idxSubCmdEnd; if (toparse.empty()) return; LOG_VERBOSE("parsing: %s", noctrl(toparse).c_str()); idxCmd = toparse.find(""); idxCmdEnd = toparse.find(""); while ( idxCmd != string::npos && idxCmdEnd != string::npos && idxCmdEnd > idxCmd ) { LOG_VERBOSE("Parsing: %s", noctrl(toparse.substr(idxCmd, idxCmdEnd - idxCmd + 6)).c_str()); strCmdText = toparse.substr(idxCmd + 5, idxCmdEnd - idxCmd - 5); if (strCmdText == "server" && mailserver == false && mailclient == false) { mailserver = true; mailclient = false; string PskMailLogName; PskMailLogName.assign(PskMailDir); PskMailLogName.append("gMFSK.log"); Maillogfile = new cLogfile(PskMailLogName.c_str()); Maillogfile->log_to_file_start(); REQ(set_button, wf->xmtlock, 1); if (progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); active_modem->set_freqlock(true); LOG_INFO("%s", "ARQ is set to pskmail server"); } else if (strCmdText == "client" && mailclient == false && mailserver == false) { mailclient = true; mailserver = false; string PskMailLogName; PskMailLogName.assign(PskMailDir); PskMailLogName.append("gMFSK.log"); Maillogfile = new cLogfile(PskMailLogName.c_str()); Maillogfile->log_to_file_start(); REQ(set_button, wf->xmtlock, 0); active_modem->set_freqlock(false); LOG_INFO("%s", "ARQ is set to pskmail client"); } else if (strCmdText == "normal") { mailserver = false; mailclient = false; if (Maillogfile) { delete Maillogfile; Maillogfile = 0; } REQ(set_button, wf->xmtlock, 0); active_modem->set_freqlock(false); LOG_INFO("%s", "ARQ is reset to normal ops"); } else if ((idxSubCmd = strCmdText.find("")) != string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6); LOG_INFO("%s %s", "ARQ mode ", strSubCmd.c_str()); ParseMode(strSubCmd); } } else if ((idxSubCmd = strCmdText.find("")) != string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6); ParseRSID(strSubCmd); LOG_INFO("%s %s", "ARQ rsid ", strSubCmd.c_str()); } } else if ((idxSubCmd = strCmdText.find("")) != string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 8, idxSubCmdEnd - idxSubCmd - 8); ParseTxRSID(strSubCmd); LOG_INFO("%s %s", "ARQ txrsid ", strSubCmd.c_str()); } } else if (strCmdText == "abort") { LOG_INFO("%s", "Abort current ARQ ops"); abort_flag = true; } toparse.erase(idxCmd, idxCmdEnd - idxCmd + 6); while (toparse[0] == '\n' || toparse[0] == '\r') toparse.erase(0, 1); idxCmd = toparse.find(""); idxCmdEnd = toparse.find(""); } if (!toparse.empty()) LOG_VERBOSE("Remaining text: %s", noctrl(toparse).c_str()); } #define TIMEOUT 180 // 3 minutes //====================================================================== // Gmfsk ARQ file i/o used only on Linux //====================================================================== // checkTLF // look for files named // TLFfldigi ==> tlfio is true and // ==> mailclient is true // in $HOME void checkTLF() { static string TLFfile; static string TLFlogname; ifstream testFile; tlfio = mailserver = mailclient = false; TLFfile.assign(PskMailDir); TLFfile.append("TLFfldigi"); testFile.open(TLFfile.c_str()); if (testFile.is_open()) { testFile.close(); mailclient = true; tlfio = true; TLFlogname.assign(PskMailDir); TLFlogname.append("gMFSK.log"); Maillogfile = new cLogfile(TLFlogname.c_str()); Maillogfile->log_to_file_start(); } } static bool TLF_arqRx() { /// The mutex is automatically unlocked when returning. #if defined(__WIN32__) || defined(__APPLE__) return false; #else time_t start_time, prog_time; static char mailline[1000]; static string sAutoFile(""); sAutoFile.assign(PskMailDir); sAutoFile.append("gmfsk_autofile"); ifstream autofile(sAutoFile.c_str()); if(autofile) { time(&start_time); while (!autofile.eof()) { memset(mailline, 0, sizeof(mailline)); autofile.getline(mailline, 998); // leave space for "\n" and null byte txstring.append(mailline); txstring.append("\n"); time(&prog_time); if (prog_time - start_time > TIMEOUT) { LOG_ERROR("TLF file I/O failure"); autofile.close(); std::remove (sAutoFile.c_str()); return false; } } autofile.close(); std::remove (sAutoFile.c_str()); parse_arqtext(txstring); if (abort_flag) { AbortARQ(); abort_flag = false; return true; } if (!txstring.empty()) { guard_lock arq_rx_lock(&arq_rx_mutex); if (arqtext.empty()) { arqtext = txstring; if (mailserver && progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); arq_text_available = true; active_modem->set_stopflag(false); start_tx(); } else { arqtext.append(txstring); active_modem->set_stopflag(false); } txstring.clear(); } } return true; #endif } //====================================================================== // Auto transmit of file contained in WRAP_auto_dir //====================================================================== bool WRAP_auto_arqRx() { time_t start_time, prog_time; static char mailline[1000]; static string sAutoFile(""); ifstream autofile; if (sAutoFile.empty()) { sAutoFile.assign(FLMSG_WRAP_auto_dir); sAutoFile.append("wrap_auto_file"); autofile.open(sAutoFile.c_str()); if (!autofile) { sAutoFile.assign(WRAP_auto_dir); sAutoFile.append("wrap_auto_file"); autofile.open(sAutoFile.c_str()); } } else autofile.open(sAutoFile.c_str()); if(autofile) { /// Mutex is unlocked when leaving the block. guard_lock arq_rx_lock(&arq_rx_mutex); txstring.clear(); time(&start_time); while (!autofile.eof()) { memset(mailline,0,1000); autofile.getline(mailline, 998); // leave space for "\n" and null byte txstring.append(mailline); txstring.append("\n"); time(&prog_time); if (prog_time - start_time > TIMEOUT) { LOG_ERROR("autowrap file I/O failure"); autofile.close(); std::remove (sAutoFile.c_str()); return false; } } autofile.close(); std::remove (sAutoFile.c_str()); if (!txstring.empty()) { arqtext.assign("\n....start\n"); arqtext.append(txstring); arqtext.append("\n......end\n"); arq_text_available = true; LOG_DEBUG("%s", arqtext.c_str()); start_tx(); txstring.clear(); return true; } } return false; } //====================================================================== // Socket ARQ i/o used on all platforms //====================================================================== #define ARQLOOP_TIMING 50 // 100 // msec #define CLIENT_TIMEOUT 5 // timeout after 5 secs struct ARQCLIENT { Socket sock; time_t keep_alive; }; static string errstring; static pthread_t* arq_socket_thread = 0; ARQ_SOCKET_Server* ARQ_SOCKET_Server::inst = 0; static std::vector arqclient; // Protected by arq_mutex void arq_run(Socket); ARQ_SOCKET_Server::ARQ_SOCKET_Server() { server_socket = new Socket; arq_socket_thread = new pthread_t; run = true; } ARQ_SOCKET_Server::~ARQ_SOCKET_Server() { run = false; if (arq_socket_thread) { CANCEL_THREAD(*arq_socket_thread); pthread_join(*arq_socket_thread, NULL); delete arq_socket_thread; arq_socket_thread = 0; } delete server_socket; } bool ARQ_SOCKET_Server::start(const char* node, const char* service) { if (inst) return false; inst = new ARQ_SOCKET_Server; try { inst->server_socket->open(Address(node, service)); inst->server_socket->bind(); #ifdef __WIN32__ inst->server_socket->listen(); inst->server_socket->set_timeout(0.1); #endif } catch (const SocketException& e) { errstring.assign("Could not start ARQ server ("); errstring.append(e.what()).append(")"); if (e.error() == EADDRINUSE) errstring.append("\nMultiple instances of fldigi??"); LOG_ERROR("%s", errstring.c_str()); delete arq_socket_thread; arq_socket_thread = 0; delete inst; inst = 0; return false; } return !pthread_create(arq_socket_thread, NULL, thread_func, NULL); } bool server_stopped = false; void ARQ_SOCKET_Server::stop(void) { if (!inst) return; inst->run = false; SET_THREAD_CANCEL(); MilliSleep(50); #if !defined(__WOE32__) && !defined(__APPLE__) int timeout = 10; while(!server_stopped) { MilliSleep(100); Fl::awake(); if (--timeout == 0) break; } #endif delete inst; inst = 0; } void* ARQ_SOCKET_Server::thread_func(void*) { SET_THREAD_ID(ARQSOCKET_TID); SET_THREAD_CANCEL(); // On POSIX we block indefinitely and are interrupted by a signal. // On WIN32 we block for a short time and test for cancellation. while (inst->run) { try { #ifdef __WIN32__ if (inst->server_socket->wait(0)) arq_run(inst->server_socket->accept()); #else arq_run(inst->server_socket->accept()); TEST_THREAD_CANCEL(); #endif } catch (const SocketException& e) { if (e.error() != EINTR) { errstring = e.what(); LOG_ERROR("%s", errstring.c_str()); break; } } catch (...) { break; } } { /// Mutex is unlocked when leaving the block. guard_lock arq_lock(&arq_mutex); if (!arqclient.empty()) { for (vector::iterator p = arqclient.begin(); p < arqclient.end(); p++) { (*p)->sock.close(); arqclient.erase(p); } } } inst->server_socket->close(); server_stopped = true; return NULL; } void arq_reset() { /// Mutex is unlocked when returning from function guard_lock arq_rx_lock(&arq_rx_mutex); arqmode = mailserver = mailclient = false; // txstring.clear(); // arqtext.clear(); } void arq_run(Socket s) { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); struct timeval t = { 0, 20000 }; s.set_timeout(t); s.set_nonblocking(); ARQCLIENT *client = new ARQCLIENT; client->sock = s; client->keep_alive = time(0); arqclient.push_back(client); arqmode = true; vector::iterator p = arqclient.begin(); ostringstream outs; outs << "Clients: "; while (p != arqclient.end()) { outs << (*p)->sock.fd() << " "; p++; } LOG_INFO("%s", outs.str().c_str()); } void WriteARQsocket(unsigned char* data, size_t len) { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return; static string instr; instr.clear(); string outs = ""; for (unsigned int i = 0; i < len; i++) outs += asc[data[i] & 0x7F]; LOG_INFO("%s", outs.c_str()); vector::iterator p; for (p = arqclient.begin(); p < arqclient.end(); p++) { try { (*p)->sock.wait(1); (*p)->sock.send(data, len); (*p)->keep_alive = time(0); p++; } catch (const SocketException& e) { LOG_INFO("closing socket fd %d %s", (*p)->sock.fd(), e.what()); try { (*p)->sock.close(); } catch (const SocketException& e) { LOG_ERROR("Socket error on # %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } if (arqclient.empty()) arq_reset(); } void test_arq_clients() { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return; static string instr; instr.clear(); vector::iterator p; p = arqclient.begin(); time_t now; size_t ret; while (p < arqclient.end()) { if (difftime(now = time(0), (*p)->keep_alive) > CLIENT_TIMEOUT) { try { (*p)->sock.wait(1); ret = (*p)->sock.send("\0", 1); if (ret <= 0) { LOG_INFO("closing inactive socket %d", (int)((*p)->sock.fd())); (*p)->sock.close(); arqclient.erase(p); // sets p to next iterator } else { (*p)->keep_alive = now; p++; } } catch (const SocketException& e) { LOG_INFO("socket %d timed out, error %d, %s", (*p)->sock.fd(), e.error(), e.what()); try { (*p)->sock.close(); } catch (const SocketException& e) { LOG_ERROR("Socket error on # %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } else { p++; } } if (arqclient.empty()) arq_reset(); } bool Socket_arqRx() { { /// Mutex is unlocked when leaving block guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return false; static string instr; vector::iterator p = arqclient.begin(); size_t n = 0; instr.clear(); while (p != arqclient.end()) { try { (*p)->sock.wait(0); while ( (n = (*p)->sock.recv(instr)) > 0) { txstring.append(instr); LOG_VERBOSE("%s", txstring.c_str()); } p++; } catch (const SocketException& e) { txstring.clear(); LOG_INFO("closing socket fd %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); try { (*p)->sock.close(); } catch (const SocketException& e) { LOG_ERROR("socket error on # %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } if (arqclient.empty()) arq_reset(); } if (!txstring.empty()) parse_arqtext(txstring); if (abort_flag) { AbortARQ(); abort_flag = false; return true; } { /// Mutex is unlocked when leaving block guard_lock arq_rx_lock(&arq_rx_mutex); if (txstring.empty()) return false; arqtext.append(txstring); if (mailserver && progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); if (trx_state != STATE_TX) start_tx(); txstring.clear(); arq_text_available = true; active_modem->set_stopflag(false); } return true; } //====================================================================== // Implementation using thread vice the fldigi timeout facility //====================================================================== void WriteARQ(unsigned char data) { if (active_modem->get_mode() == MODE_FSQ) return; guard_lock tosend_lock(&tosend_mutex); tosend += data; } void WriteARQ(const char *data) { if (active_modem->get_mode() == MODE_FSQ) return; guard_lock tosend_lock(&tosend_mutex); tosend.append(data); } static void *arq_loop(void *args) { SET_THREAD_ID(ARQ_TID); for (;;) { /* see if we are being canceled */ if (arq_exit) break; test_arq_clients(); { /// Mutex is unlocked when exiting block guard_lock tosend_lock(&tosend_mutex); // enroute.clear(); if (!tosend.empty()) { // enroute = tosend; WriteARQsocket((unsigned char*)tosend.c_str(), tosend.length()); tosend.clear(); } // if (!enroute.empty()) { // WriteARQsocket((unsigned char*)enroute.c_str(), enroute.length()); // } } if (arq_exit) break; // order of precedence; Socket, Wrap autofile, TLF autofile if (!Socket_arqRx()) if (!WRAP_auto_arqRx()) TLF_arqRx(); MilliSleep(ARQLOOP_TIMING); } // exit the arq thread return NULL; } bool arq_state(void) { return arq_enabled; } void arq_init() { arq_enabled = false; txstring.clear(); arqclient.clear(); if (!ARQ_SOCKET_Server::start( progdefaults.arq_address.c_str(), progdefaults.arq_port.c_str() )) { arq_enabled = false; return; } if (pthread_create(&arq_thread, NULL, arq_loop, NULL) < 0) { LOG_ERROR("arq init: pthread_create failed"); arq_enabled = false; return; } arq_enabled = true; } void arq_close(void) { if (!arq_enabled) return; ARQ_SOCKET_Server::stop(); // tell the arq thread to kill it self { guard_lock arqclose(&tosend_mutex); arq_exit = true; } // and then wait for it to die pthread_join(arq_thread, NULL); arq_enabled = false; LOG_INFO("ARQ closed"); if(data_io_enabled == ARQ_IO) data_io_enabled = DISABLED_IO ; arq_exit = false; } int arq_get_char() { /// Mutex is unlocked when returning from function guard_lock arq_rx_lock(&arq_rx_mutex); int c = 0; if (arq_text_available) { if (!arqtext.empty()) { c = arqtext[0] & 0xFF; arqtext.erase(0,1); } else { arq_text_available = false; c = GET_TX_CHAR_ETX; } } return c; } void flush_arq_tx_buffer(void) { guard_lock arq_rx_lock(&arq_rx_mutex); arq_text_available = false; // arqtext.clear(); } //====================================================================== // following function used if the T/R button is pressed to stop a transmission // that is servicing the ARQ text buffer. It allows the ARQ client to reset // itself properly //====================================================================== void AbortARQ() { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_rx_mutex); arqtext.clear(); txstring.clear(); arq_text_available = false; } //====================================================================== // Special notification for PSKMAIL: new mode marked only, in following // format: "", with = '0x12'. //====================================================================== void pskmail_notify_rsid(trx_mode mode) { static char buf[64]; memset(buf, 0, sizeof(buf)); int n = snprintf(buf, sizeof(buf), "\x12\n", mode_info[mode].name); if (n > 0 && n < (int)sizeof(buf)) { WriteARQ((const char *)buf); REQ(&FTextBase::addstr, ReceiveText, buf, FTextBase::CTRL); LOG_INFO("%s", buf); } } //====================================================================== // Special notification for PSKMAIL: signal to noise measured by decoder // format "" // where CC = count, A.a = average s/n, D.d = Std dev of s/n //====================================================================== void pskmail_notify_s2n(double s2n_ncount, double s2n_avg, double s2n_stddev) { static char buf[64]; memset(buf, 0, sizeof(buf)); int n = snprintf(buf, sizeof(buf), "\x12\n", s2n_ncount, s2n_avg, s2n_stddev); if (n > 0 && n < (int)sizeof(buf)) { WriteARQ((const char *)buf); REQ(&FTextBase::addstr, ReceiveText, buf, FTextBase::CTRL); LOG_INFO("%s", buf); } } fldigi-4.1.06/src/misc/log.cxx0000644000175000017500000000570313472115773013027 00000000000000// ---------------------------------------------------------------------------- // log.cxx -- Received text logging for fldigi // // Copyright (C) 2007-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include "log.h" #include "trx.h" #include "fl_digi.h" #include "timeops.h" #include "ascii.h" using namespace std; static const char *lognames[] = { "RX", "TX", "", "" }; cLogfile::cLogfile(const string& fname) : retflag(true), logtype(LOG_RX) { if ((logfile = fl_fopen(fname.c_str(), "a"))) { setvbuf(logfile, (char*)NULL, _IOLBF, 0); set_cloexec(fileno(logfile), 1); } } cLogfile::~cLogfile() { if (logfile) fclose(logfile); } void cLogfile::log_to_file(log_t type, const string& s) { if (!logfile || ferror(logfile) || s.empty()) return; char timestr[64]; struct tm tm; time_t t; if (type == LOG_RX || type == LOG_TX) { if (retflag || type != logtype) { if (type != logtype) fprintf(logfile, "\n"); time(&t); gmtime_r(&t, &tm); strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%MZ", &tm); char freq[20]; snprintf(freq, sizeof(freq), "%d", static_cast( wf->rfcarrier() + (wf->USB() ? active_modem->get_freq() : -active_modem->get_freq() ) ) ); const char *logmode = mode_info[active_modem->get_mode()].adif_name; fprintf(logfile, "%s %s : %s (%s): ", lognames[type], freq, logmode, timestr); } for (size_t i = 0; i < s.length(); i++) fprintf(logfile, "%s", ascii3[s[i] & 0xFF]); // if (s[i] == '\n' || (unsigned char)s[i] >= ' ') fprintf(logfile, "%c", s[i]); retflag = *s.rbegin() == '\n'; if (!retflag) fflush(logfile); } else { time(&t); gmtime_r(&t, &tm); strftime(timestr, sizeof(timestr), "%a %b %e %H:%M:%S %Y UTC", &tm); fprintf(logfile, "\n--- Logging %s at %s ---\n", s.c_str(), timestr); } logtype = type; } void cLogfile::log_to_file_start() { log_to_file(LOG_START, "started"); } void cLogfile::log_to_file_stop() { log_to_file(LOG_STOP, "stopped"); } /* ---------------------------------------------------------------------- */ fldigi-4.1.06/src/misc/coordinate.cxx0000644000175000017500000001564513472115773014403 00000000000000// ---------------------------------------------------------------------------- // coordinate.cxx -- Handling of longitude and latitude. // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "config.h" #include "coordinate.h" #include "locator.h" void CoordinateT::Check(void) const { if( m_is_lon ) { if( ( m_angle >= -180.0 ) && ( m_angle <= 180.0 ) ) return ; } else { if( ( m_angle >= -90.0 ) && ( m_angle <= 90.0 ) ) return ; } std::stringstream strm ; strm << "Invalid m_angle=" << m_angle << " m_is_lon=" << m_is_lon ; throw std::runtime_error(strm.str()); } CoordinateT::CoordinateT( double degrees, bool is_lon ) : m_angle( fmod(degrees, 360.0 ) ), m_is_lon(is_lon) { if( m_angle > 180.0 ) m_angle -= 360.0 ; Check(); }; // Longitude East and Latitude North are positive. void CoordinateT::Init( char direction, double angle_degrees ) { m_angle = angle_degrees ; switch( direction ) { case 'W': case 'w': m_angle = -m_angle ; case 'E': case 'e': if( ( angle_degrees < -180 ) || ( angle_degrees > 180 ) ) throw std::runtime_error("Invalid longitude degree"); m_is_lon = true ; break ; case 'S': case 's': m_angle = -m_angle ; case 'N': case 'n': if( ( angle_degrees < -90 ) || ( angle_degrees > 90 ) ) throw std::runtime_error("Invalid latitude degree"); m_is_lon = false ; break ; default: throw std::runtime_error("Invalid direction"); } Check(); } CoordinateT::CoordinateT( char direction, double angle_degrees ) { Init( direction, angle_degrees ); } CoordinateT::CoordinateT( char direction, int degree, int minute, int second ) { // std::cout << "ctor d=" << direction << " " << degree << " " << minute << " " << second << "\n"; if( ( degree < 0 ) || ( degree > 180 ) ) throw std::runtime_error("Invalid degree"); if( ( minute < 0 ) || ( minute >= 60 ) ) throw std::runtime_error("Invalid minute"); if( ( second < 0 ) || ( second >= 60 ) ) throw std::runtime_error("Invalid second"); double angle_degrees = (double)degree + (double)minute / 60.0 + (double)second / 3600.0 ; Init( direction, angle_degrees ); } // Specific for reading from the file of navtex or wmo stations. // Navtex: "57 06 N" // Wmo : "69-36N", "013-27E", "009-25E" ou floating-point degrees: "12.34 E". // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds // and H is N for northern hemisphere or S for southern hemisphere or // E for eastern hemisphere or W for western hemisphere. // The seconds value is omitted for those stations where the seconds value is unknown. std::istream & operator>>( std::istream & istrm, CoordinateT & ref ) { if( ! istrm ) return istrm ; std::stringstream sstrm ; char direction ; while( true ) { // istrm >> direction ; direction = (char)istrm.get(); if( ! istrm ) return istrm ; switch( direction ) { case 'e': case 'E': case 'w': case 'W': case 's': case 'S': case 'n': case 'N': break; case '0' ... '9' : case '.' : case '-' : case '+' : case ' ' : case '\t' : sstrm << direction ; continue; default: istrm.setstate(std::ios::eofbit); return istrm ; } break; } // TODO: Check that the direction is what we expect. std::string tmpstr = sstrm.str(); // std::cout << "READ:" << tmpstr << ":" << direction << "\n"; const char * tmpPtr = tmpstr.c_str(); int i_degree, i_minute, i_second ; if( ( 3 == sscanf( tmpPtr, "%d-%d-%d", &i_degree, &i_minute, &i_second ) ) || ( 3 == sscanf( tmpPtr, "%d %d %d", &i_degree, &i_minute, &i_second ) ) ) { ref = CoordinateT( direction, i_degree, i_minute, i_second ); return istrm; } if( ( 2 == sscanf( tmpPtr, "%d-%d", &i_degree, &i_minute ) ) || ( 2 == sscanf( tmpPtr, "%d %d", &i_degree, &i_minute ) ) ) { ref = CoordinateT( direction, i_degree, i_minute, 0 ); return istrm; } double d_degree ; if( 1 == sscanf( tmpPtr, "%lf", &d_degree ) ) { ref = CoordinateT( direction, d_degree ); return istrm; } istrm.setstate(std::ios::eofbit); return istrm ; } std::ostream & operator<<( std::ostream & ostrm, const CoordinateT & ref ) { bool sign = ref.m_angle > 0 ; double ang = sign ? ref.m_angle : -ref.m_angle; ostrm << std::setfill('0') << std::setw( ref.m_is_lon ? 3 : 2 ) << (int)ang << "°" << std::setfill('0') << std::setw(2) << ( (int)( 0.5 + ang * 60.0 ) % 60 ) << "'" << std::setfill('0') << std::setw(2) << (int)fmod( ang * 3600.0, 60 ) << "''" << " "; ostrm << ( ref.m_is_lon ? sign ? 'E' : 'W' : sign ? 'N' : 'S' ); return ostrm; } CoordinateT::Pair::Pair( const CoordinateT & coo1, const CoordinateT & coo2 ) : m_lon( coo1.is_lon() ? coo1 : coo2 ) , m_lat( coo2.is_lon() ? coo1 : coo2 ) { if( ! ( coo1.is_lon() ^ coo2.is_lon() ) ) { throw std::runtime_error("Internal inconsistency"); } } CoordinateT::Pair::Pair( double lon, double lat ) : m_lon( CoordinateT( lon, true ) ) , m_lat( CoordinateT( lat, false ) ) {} CoordinateT::Pair::Pair( const std::string & locator ) { double lon, lat ; int res = QRB::locator2longlat( &lon, &lat, locator.c_str() ); if( res != QRB::QRB_OK ) { throw std::runtime_error("Cannot decode Maidenhead locator:" + locator ); }; m_lon = CoordinateT( lon, true ); m_lat = CoordinateT( lat, false ); } double CoordinateT::Pair::distance( const Pair & a ) const { double dist, azimuth ; int res = QRB::qrb( longitude().angle(), latitude().angle(), a.longitude().angle(), a.latitude().angle(), &dist, &azimuth ); if( res != QRB::QRB_OK) { std::stringstream sstrm ; sstrm << "Bad qrb result:" << *this << " <-> " << a ; throw std::runtime_error(sstrm.str()); } return dist ; } std::string CoordinateT::Pair::locator(void) const { char buf[64]; int ret = QRB::longlat2locator( longitude().angle(), latitude().angle(), buf, 3 ); if( ret == QRB::QRB_OK ) { return buf ; } return std::string(); } std::ostream & operator<<( std::ostream & ostrm, const CoordinateT::Pair & ref ) { ostrm << ref.latitude() << "/" << ref.longitude(); return ostrm; } std::istream & operator>>( std::istream & istrm, CoordinateT::Pair & ref ) { istrm >> ref.latitude() >> ref.longitude(); return istrm; } fldigi-4.1.06/src/misc/util.cxx0000644000175000017500000003566413472115773013234 00000000000000// ---------------------------------------------------------------------------- // util.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Dave Freese, W1HKJ // Copyright (C) 2013 // Remi Chateauneu, F4ECW // Copyright (C) 2015 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "config.h" #include "util.h" #ifdef __MINGW32__ # include "compat.h" #endif /** ******************************************************************** * Return the smallest power of 2 not less than n ***********************************************************************/ uint32_t ceil2(uint32_t n) { --n; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n + 1; } /** ******************************************************************** * Return the largest power of 2 not greater than n ***********************************************************************/ /// Return the largest power of 2 not greater than n uint32_t floor2(uint32_t n) { n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n - (n >> 1); } #include /** ******************************************************************** * Transforms the version, as a string, into an integer, so comparisons * are possible. ***********************************************************************/ unsigned long ver2int(const char* version) { unsigned long v = 0L; const char* p = version; while (*p) { if (isdigit(*p)) v = v*10 + *p - '0'; p++; } return v; } /** ******************************************************************** * from git 1.6.1.2 compat/strcasestr.c ***********************************************************************/ #if !HAVE_STRCASESTR # include char *strcasestr(const char *haystack, const char *needle) { int nlen = strlen(needle); int hlen = strlen(haystack) - nlen + 1; int i; for (i = 0; i < hlen; i++) { int j; for (j = 0; j < nlen; j++) { unsigned char c1 = haystack[i+j]; unsigned char c2 = needle[j]; if (toupper(c1) != toupper(c2)) goto next; } return (char *) haystack + i; next: ; } return NULL; } #endif // !HAVE_STRCASESTR /** ******************************************************************** * from git 1.6.1.2 compat/strcasestr.c ***********************************************************************/ #if !HAVE_STRLCPY size_t strlcpy(char *dest, const char *src, size_t size) { size_t ret = strlen(src); if (size) { size_t len = (ret >= size) ? size - 1 : ret; memcpy(dest, src, len); dest[len] = '\0'; } return ret; } #endif // !HAVE_STRLCPY /** ******************************************************************** * ***********************************************************************/ #if !HAVE_STRNLEN size_t strnlen(const char *s, size_t maxlen) { if((!s) || (maxlen < 1)) return 0; size_t count = 0; while(*s++ && (maxlen-- > 0)) count++; return count; } #endif // !HAVE_STRNLEN /** ******************************************************************** * ***********************************************************************/ #if !HAVE_STRNCPY char * strncpy(char *dst, const char *src, size_t maxlen) { if((!dst) || (!src) || (maxlen < 1)) return dst; char *_dst = dst; while(*src && *_dst && (--maxlen > 0)) *_dst++ = *src++; *_dst = 0; return dst; } #endif // !HAVE_STRNCPY /** ******************************************************************** * ***********************************************************************/ #if !HAVE_STRNCMP int strncmp(const char *s1, const char *s2, size_t maxlen) { if((!s1) || (!s2) || (maxlen < 1)) return 0; unsigned char *u1 = (unsigned char *)s1; unsigned char *u2 = (unsigned char *)s2; int dif = 0; while(*u1 && *u2 && (maxlen-- > 0)) { dif = *u1++ - *u2++; if(dif) break; } return dif; } #endif // !HAVE_STRNCMP /** ******************************************************************** * from git 1.6.3.1 compat/setenv.c ***********************************************************************/ #if !HAVE_SETENV int setenv(const char *name, const char *value, int replace) { int out; size_t namelen, valuelen; char *envstr; if (!name || !value) return -1; if (!replace) { char *oldval = NULL; oldval = getenv(name); if (oldval) return 0; } namelen = strlen(name); valuelen = strlen(value); envstr = (char*)malloc((namelen + valuelen + 2)); if (!envstr) return -1; memcpy(envstr, name, namelen); envstr[namelen] = '='; memcpy(envstr + namelen + 1, value, valuelen); envstr[namelen + valuelen + 1] = 0; out = putenv(envstr); /* putenv(3) makes the argument string part of the environment, * and changing that string modifies the environment --- which * means we do not own that storage anymore. Do not free * envstr. */ return out; } #endif /*********************************************************************** * from git 1.6.3.1 compat/setenv.c ***********************************************************************/ #if !HAVE_UNSETENV int unsetenv(const char *name) { extern char **environ; int src, dst; size_t nmln; nmln = strlen(name); for (src = dst = 0; environ[src]; ++src) { size_t enln; enln = strlen(environ[src]); if (enln > nmln) { /* might match, and can test for '=' safely */ if (0 == strncmp (environ[src], name, nmln) && '=' == environ[src][nmln]) /* matches, so skip */ continue; } environ[dst] = environ[src]; ++dst; } environ[dst] = NULL; return 0; } #endif /** ******************************************************************** * ***********************************************************************/ #ifdef __MINGW32__ int set_cloexec(int fd, unsigned char v) { return 0; } #else # include # include int set_cloexec(int fd, unsigned char v) { int f = fcntl(fd, F_GETFD); return f == -1 ? f : fcntl(fd, F_SETFD, (v ? f | FD_CLOEXEC : f & ~FD_CLOEXEC)); } #endif // __MINGW32__ /** ******************************************************************** * ***********************************************************************/ int set_nonblock(int fd, unsigned char v) { #ifndef __MINGW32__ int f = fcntl(fd, F_GETFL); return f == -1 ? f : fcntl(fd, F_SETFL, (v ? f | O_NONBLOCK : f & ~O_NONBLOCK)); #else // __MINGW32__ u_long v_ = (u_long)v; errno = 0; if (ioctlsocket(fd, FIONBIO, &v_) == SOCKET_ERROR) { errno = WSAGetLastError(); return -1; } else return 0; #endif // __MINGW32__ } #ifndef __MINGW32__ # include # include # include # include #endif /** ******************************************************************** * ***********************************************************************/ int set_nodelay(int fd, unsigned char v) { int val = v; return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val)); } #ifdef __MINGW32__ # include #endif /** ******************************************************************** * ***********************************************************************/ int get_bufsize(int fd, int dir, int* len) { socklen_t optlen = sizeof(*len); return getsockopt(fd, SOL_SOCKET, (dir == 0 ? SO_RCVBUF : SO_SNDBUF), (char*)len, &optlen); } /** ******************************************************************** * ***********************************************************************/ int set_bufsize(int fd, int dir, int len) { return setsockopt(fd, SOL_SOCKET, (dir == 0 ? SO_RCVBUF : SO_SNDBUF), (const char*)&len, sizeof(len)); } #ifndef __MINGW32__ #include #include #ifndef NSIG # define NSIG 64 #endif static size_t nsig = 0; static struct sigaction* sigact = 0; static pthread_mutex_t sigmutex = PTHREAD_MUTEX_INITIALIZER; #endif /** ******************************************************************** * ***********************************************************************/ void save_signals(void) { #ifndef __MINGW32__ pthread_mutex_lock(&sigmutex); if (!sigact) sigact = new struct sigaction[NSIG]; for (nsig = 1; nsig <= NSIG; nsig++) if (sigaction(nsig, NULL, &sigact[nsig-1]) == -1) break; pthread_mutex_unlock(&sigmutex); #endif } /** ******************************************************************** * ***********************************************************************/ void restore_signals(void) { #ifndef __MINGW32__ pthread_mutex_lock(&sigmutex); for (size_t i = 1; i <= nsig; i++) sigaction(i, &sigact[i-1], NULL); delete [] sigact; sigact = 0; nsig = 0; pthread_mutex_unlock(&sigmutex); #endif } /** ******************************************************************** * ***********************************************************************/ uint32_t simple_hash_data(const unsigned char* buf, size_t len, uint32_t code) { for (size_t i = 0; i < len; i++) code = ((code << 4) | (code >> (32 - 4))) ^ (uint32_t)buf[i]; return code; } /** ******************************************************************** * ***********************************************************************/ uint32_t simple_hash_str(const unsigned char* str, uint32_t code) { while (*str) code = ((code << 4) | (code >> (32 - 4))) ^ (uint32_t)*str++; return code; } #include #include static const char hexsym[] = "0123456789ABCDEF"; static std::vector* hexbuf; /** ******************************************************************** * ***********************************************************************/ const char* str2hex(const unsigned char* str, size_t len) { if (unlikely(len == 0)) return ""; if (unlikely(!hexbuf)) { hexbuf = new std::vector; hexbuf->reserve(192); } if (unlikely(hexbuf->size() < len * 3)) hexbuf->resize(len * 3); char* p = &(*hexbuf)[0]; size_t i; for (i = 0; i < len; i++) { *p++ = hexsym[str[i] >> 4]; *p++ = hexsym[str[i] & 0xF]; *p++ = ' '; } *(p - 1) = '\0'; return &(*hexbuf)[0]; } /** ******************************************************************** * ***********************************************************************/ const char* str2hex(const char* str, size_t len) { return str2hex((const unsigned char*)str, len ? len : strlen(str)); } static std::vector* binbuf; /** ******************************************************************** * ***********************************************************************/ const char* uint2bin(unsigned u, size_t len) { if (unlikely(len == 0)) len = sizeof(u) * CHAR_BIT; if (unlikely(!binbuf)) { binbuf = new std::vector; binbuf->reserve(sizeof(u) * CHAR_BIT); } if (unlikely(binbuf->size() < len + 1)) binbuf->resize(len + 1); for (size_t i = 0; i < len; i++) { (*binbuf)[len - i - 1] = '0' + (u & 1); u >>= 1; } (*binbuf)[len] = '\0'; return &(*binbuf)[0]; } /** ******************************************************************** * ***********************************************************************/ void MilliSleep(long msecs) { #ifndef __MINGW32__ struct timespec tv[2] = { {msecs / 1000L, msecs % 1000L * 1000000L} }; nanosleep(&tv[0], &tv[1]); #else Sleep(msecs); #endif } /** ******************************************************************** * Returns 0 if a process is running, 0 if not there and -1 if the * test cannot be made. ***********************************************************************/ int test_process(int pid) { #ifdef __MINGW32__ HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); DWORD ret = WaitForSingleObject(process, 0); CloseHandle(process); return ret == WAIT_TIMEOUT; #elif defined(__linux__) /// This is dependent on procfs. char buf[32]; snprintf(buf, sizeof(buf), "/proc/%d/cmdline",pid); FILE * tmpF = fl_fopen( buf, "r" ); if( tmpF != NULL ) { fclose(tmpF); return 1 ; } return 0 ; #else // This would work on Linux also. int ret = kill(pid,0); if(ret == 0) return 1; if(errno == ESRCH) return 0; fprintf(stderr,"kill pid=%d failed r=%d e=%d %s\n", pid, ret, errno, strerror(errno) ); return -1 ; #endif } #ifdef __MINGW32__ /// This includes Windows.h #include /** ******************************************************************** * Retrieve the system error message for the last-error code ***********************************************************************/ static const char * WindowsError(DWORD dw) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); /// BEWARE, this is NOT reentrant ! static char buffer[2048]; strcpy( buffer, (const char *)lpMsgBuf ); LocalFree(lpMsgBuf); return buffer ; } #endif /** ******************************************************************** * Starts a process and returns its pid, and -1 if error. Returns 0 if * this cannot be made. ***********************************************************************/ int fork_process( const char * cmd ) { #ifdef __MINGW32__ char* cmd_local = strdup(cmd); STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); PROCESS_INFORMATION pi; memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd_local, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) fprintf(stderr,"CreateProcess failed: %s", WindowsError(GetLastError()) ); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd_local); return pi.dwProcessId ; #else pid_t newpid = fork(); switch(newpid) { case -1: return -1 ; case 0: execl("/bin/sh", "sh", "-c", cmd, NULL ); fprintf(stderr,"execl failed with %s", strerror(errno) ); /// Ideally we should warn the main process. exit(EXIT_FAILURE); } return newpid ; #endif } /** ******************************************************************** * Returns true if OK. Beware, the error case is not reentrant. ***********************************************************************/ const char * create_directory( const char * dir ) { if ( mkdir(dir, 0777) == -1 ) if( errno != EEXIST ) return strerror(errno); return NULL ; } fldigi-4.1.06/src/misc/pixmaps.cxx0000644000175000017500000015275313472115773013737 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include // This file contains custom icons, icons from gtk, and possibly other sources. /* XPM */ const char *waterfall_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 5 1", " c None", ". c #124188", "+ c #788D9B", "@ c #ABCBE2", "# c #204A87", " ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " "}; // audio-card from gnome icon theme /* XPM */ const char *audio_card_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 102 2", " c #3A3E00", ". c #3A3F00", "X c #3B3F00", "o c #2F3536", "O c #303634", "+ c #303735", "@ c #303637", "# c #363D32", "$ c #323835", "% c #313836", "& c #333936", "* c #323937", "= c #343936", "- c #383E31", "; c #3B4000", ": c #3D4104", "> c #3E4206", ", c #657000", "< c #677300", "1 c #687400", "2 c #687502", "3 c #687505", "4 c #6B7704", "5 c #6B7901", "6 c #6C7900", "7 c #6C7801", "8 c #6D7A00", "9 c #6C7A02", "0 c #6F7D01", "q c #707E02", "w c #707E07", "e c #404630", "r c #3D5B50", "t c #38595E", "y c #38595F", "u c #395A5F", "i c #365761", "p c #405C4F", "a c #545650", "s c #545652", "d c #555753", "f c #565852", "g c #565853", "h c #565854", "j c #575955", "k c #585A56", "l c #5A5C58", "z c #5D5E5B", "x c #5E5F5C", "c c #426050", "v c #426251", "b c #646662", "n c #656663", "m c #666864", "M c #676965", "N c #696A67", "B c #696B67", "V c #6E6F6D", "C c #6E706C", "Z c #6F716D", "A c #758201", "S c #748202", "D c #798708", "F c #7F8839", "G c #A3B31A", "H c #A4B31A", "J c #A4B419", "K c #AABA1A", "L c #858E39", "P c #848D3B", "I c #878F3D", "U c #87903B", "Y c #8A9539", "T c #8C9638", "R c #919C38", "E c #949E39", "W c #959F3A", "Q c #959F3B", "! c #929D3C", "~ c #939E3C", "^ c #959F3D", "/ c #95A03C", "( c #96A03C", ") c #97A03C", "_ c #97A13C", "` c #97A23D", "' c #D8EB31", "] c #DBEF33", "[ c #DFF234", "{ c #E0F338", "} c #E4F839", "| c #E8FB38", " . c #EBFF39", ".. c #EFFF65", "X. c #B7B9B5", "o. c #C4C6C2", "O. c #C6C8C4", "+. c #C7C9C5", "@. c #C8CAC6", "#. c #D0D2CE", "$. c #D4D6D2", "%. c None", /* pixels */ "%.%.%.%.%.%.%.%.%.%.%.%.j k j %.", "%.%.%.%.%.%.%.%.%.%.%.d O.#.X.d ", "X a $.d d %.", " E W W W Q Q ( ( ( ^ f $.d %.%.", " ` e * * % % + # c v f $.d l x ", " ` + V Z Z Z C & y u f $.d o.d ", " ` + Z d d d N = 3 8 f $.d h g ", " _ + B M m n b $ p t f $.d %.%.", " ) - @ o o o o O r i f $.d k z ", " / A q 0 9 5 2 1 < , f $.d @.d ", " ~ K S J 6 H 7 G U I f $.d d h ", " ! { D ' 4 ] w [ P : a $.d %.%.", " T ..R } L | Y .F > s $.d %.%.", "; X X X X X X . . . . s +.d %.%.", "%.%.%.%.%.%.%.%.%.%.%.d d d %.%.", "%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%." }; // help-about from gnome /* XPM */ const char *help_about_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 76 1", " c #C4A001", ". c #C5A101", "X c #C5A102", "o c #C6A202", "O c #C6A203", "+ c #C7A403", "@ c #C7A404", "# c #C7A405", "$ c #C7A406", "% c #C7A407", "& c #C7A507", "* c #C8A508", "= c #C9A70B", "- c #C9A80D", "; c #CAA80C", ": c #C9A810", "> c #CCAC12", ", c #CCAC14", "< c #CDAE1B", "1 c #CFB11C", "2 c #D0B11F", "3 c #CFB021", "4 c #D2B522", "5 c #D3B62C", "6 c #D2B62F", "7 c #F6E132", "8 c #F6E235", "9 c #F5E038", "0 c #F7E23A", "q c #F8E33C", "w c #F8E43E", "e c #D9C04A", "r c #E4CE4C", "t c #E4CE4F", "y c #E7D041", "u c #E7D247", "i c #EBD755", "p c #EBD756", "a c #ECD85A", "s c #F8E441", "d c #F9E644", "f c #F6E349", "g c #FBE74A", "h c #F9E74D", "j c #F7E75F", "k c #F8E75A", "l c #FBE95C", "z c #E9D668", "x c #EAD86C", "c c #F6E664", "v c #F6E667", "b c #F8E864", "n c #F8E865", "m c #F9E96B", "M c #FAEB71", "N c #F9EB73", "B c #F8EA7B", "V c #FAEC7C", "C c #F9EC7F", "Z c #EEDF83", "A c #EEDF85", "S c #F7E981", "D c #F8EC88", "F c #F9ED89", "G c #FAED8B", "H c #F8EB8F", "J c #F9EE9B", "K c #FBF097", "L c #FCF2A6", "P c #FCF3AA", "I c #FDF6BC", "U c #FCF7CF", "Y c #FDF8D1", "T c #FDF9DF", "R c #FEFCEE", "E c None", /* pixels */ "EEEEEEE.EEEEEEEE", "EEEEEE@e@EEEEEEE", "EEEEEE3TEEEEEEE", "EEEEEE&4&EEEEEEE", "EEEEEEE EEEEEEEE", "EEEEEEEEEEEEEEEE" }; // insert link icon from gnome /* XPM */ const char *insert_link_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 97 2", " c #2E3436", ". c #2F3536", "X c #363C3D", "o c #373D3E", "O c #464A48", "+ c #464B4C", "@ c #4F524F", "# c #545652", "$ c #555753", "% c #575955", "& c #585A56", "* c #595B57", "= c #5A5B57", "- c #5A5C58", "; c #5B5D58", ": c #5C5D59", "> c #62645F", ", c #656763", "< c #6B6D69", "1 c #6E6F6B", "2 c #6F716D", "3 c #71726F", "4 c #767773", "5 c #777875", "6 c #7C7E79", "7 c #7C7F79", "8 c #CF5F04", "9 c #D06106", "0 c #D86605", "q c #D86706", "w c #F47A03", "e c #F47A04", "r c #F47D0B", "t c #E97910", "y c #E97911", "u c #7E807D", "i c #EA9D4C", "p c #F4B15E", "a c #F5B364", "s c #FDC97D", "d c #838580", "f c #8A8C87", "g c #979B96", "h c #989B95", "j c #9FA19D", "k c #B3B4B0", "l c #B4B7B0", "z c #B7B7B1", "x c #B5B7B2", "c c #B5B8B2", "v c #BABDB6", "b c #BBBEB7", "n c #BBBEB8", "m c #BDBEBB", "M c #C0C0BC", "N c #C2C3BF", "B c #FBD7AA", "V c #FBD9AE", "C c #C4C6C0", "Z c #C5C7C1", "A c #CBCEC8", "S c #CCCEC9", "D c #D0D1CE", "F c #D1D3CE", "G c #D4D4D0", "H c #D6D7D6", "J c #D9DAD8", "K c #DBDCDB", "L c #DEDEDA", "P c #DFDFDD", "I c #FDE6C4", "U c #FEE9CA", "Y c #FEEACC", "T c #E0E0DC", "R c #E0E0DD", "E c #E2E3E2", "W c #E4E4E1", "Q c #E6E6E4", "! c #E7E8E6", "~ c #E9E9E6", "^ c #E8E9E8", "/ c #EDEDEB", "( c #EDEDEC", ") c #EDEEED", "_ c #EEEEEC", "` c #EFF0EE", "' c #F1F1F0", "] c #F3F3F1", "[ c #F3F3F2", "{ c #F4F5F4", "} c #F5F5F4", "| c #F6F6F5", " . c #F6F6F6", ".. c #F8F8F7", "X. c #F9F9F9", "o. c #FDFDFD", "O. c None", /* pixels */ "O.# # # # ; O.O.O.O.O.O.O.O.; # ", "O. .{ [ ` J u - O.O.O.O.- H ) o.", "O.v v v b C F < # $ $ # 5 / A n ", "O.# * $ * 7 b h 1 m m 1 x Z 6 % ", "O.O.& R Q 2 $ $ $ $ $ $ $ $ 3 K ", "O.O.: z L ] } ...X.| ' ( ^ ! E ", "O.O @ 4 M G T W ~ _ P D N k j f ", "O.S c d , = $ $ $ $ $ $ $ $ & > ", "O.v v v l g + X O.O.O.O.X + g l ", "O. . o O.O.O.O.O.O.O.O.o . ", "O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", "O.O.O.O.O.w e r r r r r e w O.O.", "O.O.O.O.O.O.y V Y I U B t O.O.O.", "O.O.O.O.O.O.O.q a s p 0 O.O.O.O.", "O.O.O.O.O.O.O.O.9 i 9 O.O.O.O.O.", "O.O.O.O.O.O.O.O.O.8 O.O.O.O.O.O." }; // close icon from default gtk theme /* XPM */ const char *close_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 74 1", " c #5A5C58", ". c #5C5E5B", "X c #5C5F5B", "o c #5D5F5B", "O c #5E5F5B", "+ c #5E5F5C", "@ c #5D605A", "# c #5D605B", "$ c #5C615B", "% c #5F605A", "& c #5E615B", "* c #5E605C", "= c #5F605C", "- c #5E615C", "; c #5F615C", ": c #5E605D", "> c #5E615D", ", c #5F625C", "< c #5F625D", "1 c #5F615E", "2 c #5F625E", "3 c #60615B", "4 c #60625D", "5 c #60615E", "6 c #60625E", "7 c #61625E", "8 c #61645F", "9 c #7D807A", "0 c #7E817B", "q c #80827B", "w c #80837E", "e c #82847D", "r c #82857E", "t c #838680", "y c #848681", "u c #848781", "i c #868983", "p c #878983", "a c #868984", "s c #888A85", "d c #898C86", "f c #898D86", "g c #8A8C86", "h c #8A8D88", "j c #8D9089", "k c #8E908A", "l c #8E918B", "z c #8F928C", "x c #8F928D", "c c #91938E", "v c #92948F", "b c #949590", "n c #949691", "m c #959892", "M c #959992", "N c #969994", "B c #979B95", "V c #B1B4AC", "C c #B4B7AF", "Z c #B8BBB3", "A c #B9BCB4", "S c #BABDB5", "D c #BDC0B8", "F c #BDC1B9", "G c #BFC3BB", "H c #C1C4BC", "J c #C3C6BE", "K c #C3C7BF", "L c #C4C8C0", "P c #C5C9C1", "I c #CACEC6", "U c #CBCEC6", "Y c #CDD1C9", "T c None", /* pixels */ "TTTTTTTTTTTTTTTT", "TTTTTTTTTTTTTTTT", "TT681TTTTTT ,5TT", "TT5Ll2TTTT=wZ:TT", "TT4fUx7TT4aDu;TT", "TTT3jYz<;dHs+TTT", "TTTT>kINmJh=TTTT", "TTTTT>BPKM*TTTTT", "TTTTT-vHGc+TTTTT", "TTTT-uFnbSr.TTTT", "TTT=eAg%#iCq$TTT", "TT:9Cp@TTXyV0;TT", "TT;Vp@TTTTOtVoTT", "TT44&TTTTTT&O4TT", "TTTTTTTTTTTTTTTT", "TTTTTTTTTTTTTTTT" }; // gtk apply icon /* XPM */ const char *apply_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 88 1", " c #498D07", ". c #498A0D", "X c #519412", "o c #529612", "O c #559815", "+ c #579B16", "@ c #589B17", "# c #579818", "$ c #599C1B", "% c #5A9D1B", "& c #59991C", "* c #5B9C1D", "= c #5C9D1E", "- c #5D9E1F", "; c #5D9C21", ": c #5E9D22", "> c #60A023", ", c #60A222", "< c #66A52C", "1 c #6AA92F", "2 c #6AA730", "3 c #6BA931", "4 c #6FAB36", "5 c #71AC38", "6 c #74AF3A", "7 c #74AE3D", "8 c #75B13D", "9 c #76B13E", "0 c #7DB648", "q c #7FB749", "w c #8EE03E", "e c #81B84D", "r c #83B950", "t c #88BF53", "y c #89BE57", "u c #95DF4D", "i c #8CC259", "p c #8FC55B", "a c #91E145", "s c #98E152", "d c #99E054", "f c #9BE355", "g c #9DE25A", "h c #9EE459", "j c #A1E55E", "k c #92C660", "l c #93C661", "z c #95C863", "x c #96C965", "c c #97C867", "v c #9FD16F", "b c #A1D073", "n c #A1D372", "m c #A4D475", "M c #A6D777", "N c #A7DC75", "B c #A8DA77", "V c #A6D678", "C c #ABDB7C", "Z c #ABDA7E", "A c #ACDC7C", "S c #A0E360", "D c #A4E366", "F c #A5E566", "G c #A7E66A", "H c #A7E26E", "J c #A8E56C", "K c #A7E868", "L c #A9E470", "P c #ABE672", "I c #AFE877", "U c #ADE279", "Y c #ADE07A", "T c #AEE47A", "R c #B0E77B", "E c #B3EB7D", "W c #B4EB7C", "Q c #ACD980", "! c #ADDC80", "~ c #AEDC81", "^ c #B3E583", "/ c #B3E187", "( c #B4E684", ") c #B8EB87", "_ c #BBE98E", "` c #BCE990", "' c #C2F094", "] c None", /* pixels */ "]]]]]]]]]]]->]]]", "]]]]]]]]]]%bBq@]", "]]]]]]]]]]yTGZ>]", "]]]]]]]]]3AgHi]]", "]]]]]]]]ocPdm#]]", "]]]]]]]]7(uU5]]]", "]] ]]]]&ZSFl]]]]", "]5b0o]]iRsN<]]]]", "%V'`z:4/fPe]]]]]", "+p_W)Z~Ggv-]]]]]", "]+e/EKjaU7]]]]]]", "]]]2MIwFz]]]]]]]", "]]]]*l^~:]]]]]]]", "]]]]].81]]]]]]]]", "]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]" }; // enter key icon from KDE's crystal theme /* XPM */ const char *enter_key_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 91 1", " c #5C5C5C", ". c #626262", "X c #666666", "o c #696969", "O c #6B6B6B", "+ c #6C6C6C", "@ c #6E6E6E", "# c #6F6F6F", "$ c #717171", "% c #737373", "& c #747474", "* c #838383", "= c #8D8D8D", "- c #92928F", "; c #939393", ": c #A3A3A2", "> c #A7A7A5", ", c #A7A7A6", "< c #A7A7A7", "1 c #A9A9A8", "2 c #A9A9A9", "3 c #AEAEAD", "4 c #B0B0AE", "5 c #B1B1AF", "6 c #B2B2B0", "7 c #B4B4B2", "8 c #B5B5B3", "9 c #B7B7B6", "0 c #B7B7B7", "q c #B9B9B7", "w c #BABAB9", "e c #BBBBBB", "r c #BCBCBB", "t c #BEBEBC", "y c #C2C2C1", "u c #C4C4C0", "i c #C4C4C4", "p c #C5C5C5", "a c #C6C6C4", "s c #C7C7C7", "d c #C9C9C6", "f c #CBCBC8", "g c #CACACA", "h c #CFCFCD", "j c #D0D0CE", "k c #D1D1CF", "l c #D0D0D0", "z c #D1D1D1", "x c #D2D2D0", "c c #D3D3D1", "v c #D2D2D2", "b c #D3D3D2", "n c #D3D3D3", "m c #D4D4D3", "M c #D4D4D4", "N c #D5D5D5", "B c #D7D7D6", "V c #D7D7D7", "C c #D8D8D8", "Z c #D9D9D8", "A c #D9D9D9", "S c #DADAD9", "D c #DADADA", "F c #DCDCDC", "G c #DDDDDD", "H c #DEDEDE", "J c #DFDFDF", "K c #E0E0E0", "L c #E2E2E2", "P c #E3E3E3", "I c #E4E4E4", "U c #E5E5E5", "Y c #E7E7E7", "T c #E8E8E8", "R c #E9E9E9", "E c #EBEBEB", "W c #ECECEC", "Q c #EDEDED", "! c #EFEFEF", "~ c #F0F0F0", "^ c #F3F3F3", "/ c #F4F4F4", "( c #F5F5F5", ") c #F6F6F6", "_ c #F7F7F7", "` c #F8F8F8", "' c #F9F9F9", "] c #FAFAFA", "[ c #FCFCFC", "{ c #FDFDFD", "} c None", /* pixels */ "}}}}}}}}}}}}}}}}", "}}}}}}fSFFFFFSd}", "}}}}}}c{[[[[['a}", "}}}}}}x]_`'`_`t}", "}}}}}}x)^(p`^/r}", "}}}}}}k^!!%'!!w}", "}}}}}}j~WQ#`EWq}", "}}}}}}yWTR@(TR9}", "}Z)))_/YIU+~PI8}", "}BLHKH,,,,,,,,,:-}", "}}}}}}}}}}}}}}}}" }; // question icon from default gtk theme /* XPM */ const char *dialog_question_48_icon[] = { "48 48 215 2", " c None", ". c #3768A6", "+ c #3968A7", "@ c #3A6AA7", "# c #386BA6", "$ c #3968A5", "% c #A7BEDA", "& c #F4F7FB", "* c #F4F8FB", "= c #A5BDD9", "- c #3769A6", "; c #3869A6", "> c #BBCEE4", ", c #FFFFFF", "' c #FEFEFF", ") c #BBCDE3", "! c #F9FBFD", "~ c #98B9DC", "{ c #99B9DC", "] c #729FCF", "^ c #97B8DB", "/ c #BACDE3", "( c #719ECE", "_ c #709DCD", ": c #709DCE", "< c #6F9CCD", "[ c #6F9CCC", "} c #95B6DA", "| c #B9CDE3", "1 c #6E9CCC", "2 c #6E9BCC", "3 c #6D9BCC", "4 c #6D9ACB", "5 c #94B5D9", "6 c #B9CCE3", "7 c #78A2D0", "8 c #709CCC", "9 c #6C9ACB", "0 c #6C99CA", "a c #6B99CA", "b c #93B4D8", "c c #B9CCE2", "d c #739FCE", "e c #A1BEDE", "f c #C9DAEC", "g c #EBF1F8", "h c #FAFCFD", "i c #E7EEF6", "j c #B7CDE6", "k c #759FCE", "l c #6B98CA", "m c #6A98C9", "n c #6A97C9", "o c #92B3D8", "p c #B9CBE2", "q c #80A8D3", "r c #E8EFF7", "s c #6997C9", "t c #6996C8", "u c #6896C8", "v c #91B2D7", "w c #B8CBE2", "x c #7FA7D2", "y c #FDFDFE", "z c #E9F0F7", "A c #EFF4F9", "B c #BBD0E7", "C c #6895C8", "D c #6795C7", "E c #6794C7", "F c #8FB1D6", "G c #B8CBE1", "H c #7EA6D1", "I c #F2F6FA", "J c #ADC6E1", "K c #749FCD", "L c #6A98CA", "M c #AFC7E2", "N c #E1EAF4", "O c #6694C7", "P c #6694C6", "Q c #6593C6", "R c #8EAFD5", "S c #B7CBE1", "T c #96B7DA", "U c #6C99CB", "V c #709CCB", "W c #719DCC", "X c #7FA5D0", "Y c #6693C6", "Z c #6592C6", "` c #6492C5", " . c #6391C5", ".. c #8DAFD4", "+. c #B0C7E2", "@. c #CBDBEC", "#. c #6391C4", "$. c #6290C4", "%. c #8CADD3", "&. c #B7CAE1", "*. c #3768A5", "=. c #396AA7", "-. c #A4BCD8", ";. c #96B6D8", ">. c #FDFEFE", ",. c #85A9D2", "'. c #6290C3", "). c #618FC3", "!. c #608EC3", "~. c #8BADD3", "{. c #A0B8D6", "]. c #3768A7", "^. c #FEFFFF", "/. c #99B8DA", "(. c #A4BFDD", "_. c #608EC2", ":. c #5F8DC2", "<. c #5F8DC1", "[. c #8AABD2", "}. c #3868A6", "|. c #396AA6", "1. c #87AAD2", "2. c #FBFCFE", "3. c #A1BDDC", "4. c #5F8EC2", "5. c #5E8DC1", "6. c #5E8CC1", "7. c #89AAD1", "8. c #3767A6", "9. c #3969A6", "0. c #92B4D8", "a. c #D0DEEE", "b. c #B1C8E2", "c. c #5D8CC1", "d. c #5D8BC0", "e. c #87AAD1", "f. c #F9FAFD", "g. c #79A0CC", "h. c #5C8BC0", "i. c #87A9D0", "j. c #F9FAFC", "k. c #B6C9E0", "l. c #3767A5", "m. c #90B2D6", "n. c #6B97C7", "o. c #6C97C8", "p. c #6C97C7", "q. c #6C96C7", "r. c #5C8AC0", "s. c #5B8ABF", "t. c #87A8D0", "u. c #3668A4", "v. c #8FB0D6", "w. c #5C8ABF", "x. c #5B89BF", "y. c #86A8D0", "z. c #B6CAE1", "A. c #8DAFD5", "B. c #ECF1F8", "C. c #5A89BF", "D. c #5A89BE", "E. c #85A7CF", "F. c #F8FAFC", "G. c #B6CAE0", "H. c #BACDE2", "I. c #8BADD4", "J. c #F6F8FB", "K. c #5A88BE", "L. c #5988BE", "M. c #5987BD", "N. c #84A7CE", "O. c #89ABD3", "P. c #EBF1F7", "Q. c #5887BD", "R. c #84A6CE", "S. c #88ABD1", "T. c #5886BD", "U. c #5786BC", "V. c #83A6CE", "W. c #82A5CE", "X. c #3667A4", "Y. c #85A8D0", "Z. c #5785BC", "`. c #5685BC", " + c #82A4CD", ".+ c #B6C8E0", "++ c #3767A3", "@+ c #85A8CF", "#+ c #5685BB", "$+ c #5584BB", "%+ c #3667A3", "&+ c #B8CAE1", "*+ c #5684BB", "=+ c #81A4CC", "-+ c #B5C8E0", ";+ c #3566A2", ">+ c #82A5CD", ",+ c #5483BA", "'+ c #B7C9E0", ")+ c #81A4CD", "!+ c #5382BA", "~+ c #80A3CB", "{+ c #B5C8DF", "]+ c #80A3CC", "^+ c #5382B9", "/+ c #7FA2CB", "(+ c #B4C8DF", "_+ c #9DB5D3", ":+ c #F1F5F9", "<+ c #F0F4F9", "[+ c #9CB4D3", "}+ c #3565A1", "|+ c #305D95", "1+ c #3666A3", "2+ c #305D96", " ", " ", " . + @ # ", " $ % & * = - ", " ; > , ' ' , ) ; ", " ; > , ! ~ { ! , ) ; ", " ; > , ! ~ ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ] ] ] ] ~ ! , ) - ", " ; > , ! ~ ] ] ] ] ] ] ] ] ] ] ^ ! , / - ", " ; > , ! ~ ] ] ] ] ] ] ] ] ] ( ( _ ^ ! , / - ", " ; > , ! ~ ] ] ] ] ] ] ] ( ( : _ < < [ } ! , | - ", " ; > , ! ~ ] ] ] ] ] ] ( ( _ _ < < 1 2 3 4 5 ! , 6 - ", " ; > , ! ~ ] ] ] ] ( ( : _ < 7 8 2 2 4 4 9 0 a b ! , c - ", " ; > , ! ~ ] ] ] ( ( d e f g h , ' i j k a a l m n o ! , p - ", " ; > , ! ~ ] ( ( : _ < q , , , , , , , , r k n n s t u v ! , w - ", " ; > , ! ~ ( ( _ _ < < 1 x , , y z A , , , , B t u u C D E F ! , G - ", " ; > , ! ^ : _ < < [ 2 2 4 H I J K l L M , , , N C D D O P Q Q R ! , S - ", " ; > , ! T _ < < 1 2 3 4 9 U V W l m n s X , , , i E O Y Q Z ` ` ...! , S - ", " $ > , ! } < [ 2 2 4 4 9 0 a l L n n s t u +., , , @.Q Q Z ` ` .#.$.$.%.! , &.*. ", " =.-., ! } 1 2 3 4 9 U 0 a l m n s t u u C ;.>., , >.,.` ` .#.$.$.'.).).!.~.! , {.]. ", " . & ^.} 2 4 4 9 0 a l L n n s t u C D D /.y , , ^.(.` .#.$.$.).).)._._.:.<.[.' I }. ", " |.& ^.5 9 U 0 a l m n s t u u C D E O 1.2., , ^.3.#.$.$.'.).).!._.4.:.5.6.6.7.' I 8. ", " 9.-., ! 0.l L n n s t u C D D O P Q Q a., , , b.$.$.).).)._._.:.<.6.6.c.d.e.f., {.8. ", " *./ , ! v s t u u C D E O Y Q Q ` ` r , , , g.).).!._.4.:.5.6.6.d.d.h.i.j., k.l. ", " - ) , ! m.C D D O P Q Q Z ` ` .#.n.o.p.q.'._._.:.<.6.6.c.d.h.r.s.t.j., k.u. ", " - ) , ! v.O Y Q Q ` ` .#.$.$.'.).).!._.4.:.5.6.6.d.d.h.w.s.x.y.j., z.u. ", " - / , ! A.Z ` ` .#.$.$.'.).).B.& & & 6.6.c.d.h.r.s.x.C.D.E.F., G.u. ", " - H., ! I.#.$.$.'.).).!._.4.J., , , d.d.h.w.s.x.C.D.K.E.F., k.u. ", " - c , ! ~.'.).)._._.:.<.6.J., , , r.s.x.x.D.K.L.M.N.F., k.u. ", " - c , ! O._.4.:.5.6.6.d.P.& & & x.C.D.K.L.M.Q.R.F., k.u. ", " - p , ! S.5.6.c.d.h.r.s.x.x.D.K.L.M.Q.T.U.V.F., k.u. ", " l.w , f.i.d.h.w.s.x.C.D.K.L.M.Q.T.U.U.W.F., k.X. ", " l.G , f.Y.x.x.D.K.L.M.Q.T.U.U.Z.`. +F., .+X. ", " ++G , j.@+K.L.M.Q.T.U.U.`.#+$+ +F., .+%+ ", " %+&+, F.V.T.U.U.Z.`.*+$+$+=+F., -+%+ ", " ;+&., F.>+`.#+$+$+,+,+=+F., -+;+ ", " ;+'+, F.)+$+,+,+!+~+F., {+;+ ", " ;+k., F.]+!+^+/+F., {+;+ ", " ;+k., F./+~+F., (+;+ ", " %+k., ^.^., (+%+ ", " ;+_+:+<+[+}+ ", " |+}+1+2+ ", " ", " ", " ", " " }; /* XPM */ const char *clear_sq_icon[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }; const char *clear_row_icon[] = { "16 1 1 1", " c None", " " }; // The lightning bolt icons are based on gmfsk's rx.xpm and tx.xpm /* XPM */ const char *rx1_icon[] = { "16 16 4 1", " c None", ". c #0F1F01", "+ c #4E9A06", "@ c #888A85", " ", " ......... ", " .++++++.@ ", " .++++++.@ ", " .+++++.@ ", " .+++++.@ ", " .++++..... ", " .++++++++.@ ", " .....+++.@ ", " @@.+++.@ ", " .++.@ ", " .++.@ ", " .+.@ ", " .+.@ ", " ..@ ", " " }; /* XPM */ const char *tx1_icon[] = { "16 16 4 1", " c None", ". c #210000", "+ c #A40000", "@ c #888A85", " ", " ......... ", " .++++++.@ ", " .++++++.@ ", " .+++++.@ ", " .+++++.@ ", " .++++..... ", " .++++++++.@ ", " .....+++.@ ", " @@.+++.@ ", " .++.@ ", " .++.@ ", " .+.@ ", " .+.@ ", " ..@ ", " " }; /* XPM */ const char *rx2_icon[] = { "16 16 3 1", " c None", ". c #0F1F01", "+ c #4E9A06", " ", " ......... ", " .++++++. ", " .++++++. ", " .+++++. ", " .+++++. ", " .++++..... ", " .++++++++. ", " .....+++. ", " .+++. ", " .++. ", " .++. ", " .+. ", " .+. ", " .. ", " " }; /* XPM */ const char *tx2_icon[] = { "16 16 3 1", " c None", ". c #210000", "+ c #A40000", " ", " ......... ", " .++++++. ", " .++++++. ", " .+++++. ", " .+++++. ", " .++++..... ", " .++++++++. ", " .....+++. ", " .+++. ", " .++. ", " .++. ", " .+. ", " .+. ", " .. ", " " }; /* XPM */ const char *rx_icon[] = { "16 16 38 1", " c None", ". c #0F1F01", "+ c #64B517", "@ c #62B315", "# c #61B014", "$ c #5EAE12", "% c #5CAC11", "& c #5AA90F", "* c #68BA1B", "= c #66B719", "- c #65B517", "; c #63B315", "> c #60B014", ", c #5EAD13", "' c #6ABD1C", ") c #69BA1A", "! c #66B718", "~ c #64B418", "{ c #6FC11F", "] c #6CBF1E", "^ c #6ABC1C", "/ c #70C421", "( c #6CBE1E", "_ c #6BBC1C", ": c #75C824", "< c #72C622", "[ c #6EC11F", "} c #6CBE1D", "| c #67B819", "1 c #6DBF1E", "2 c #73C622", "3 c #70C321", "4 c #74C924", "5 c #72C522", "6 c #79CD27", "7 c #76CA26", "8 c #7ACF28", "9 c #7FD42B", " ", " ......... ", " .+@#$%&. ", " .*=-;>,. ", " .')!~@. ", " .{]^)=. ", " ./{(_..... ", " .: c #B90C0B", ", c #C81313", "' c #C10F10", ") c #CC1617", "! c #CA1515", "~ c #C71313", "{ c #CF1818", "] c #CC1616", "^ c #D41A1A", "/ c #D11819", "( c #CF1718", "_ c #C71414", ": c #CA1514", "< c #C81413", "[ c #D21919", "} c #CF1817", "| c #CD1616", "1 c #D11818", "2 c #D81D1D", "3 c #D61B1B", "4 c #DB1E1E", "5 c #E02121", " ", " ......... ", " .+@#$%&. ", " .*=-@;>. ", " .,*='@. ", " .)!~*=. ", " .{]!,..... ", " .^/(]!_*=. ", " .....]:<. ", " .[}|. ", " .^1. ", " .23. ", " .4. ", " .5. ", " .. ", " "}; // pskreporter.info "favicon" /* XPM */ const char *pskr_icon[] = { "16 16 3 1", " c None", ". c #FF0000", "+ c #FFFF00", " .. ", " ... ", " ..... ", " .....+.. ", ". ...++++... ", ".. ..+++++. .. ", "....++++++..+. ", "..+++++++++++.. ", "..+++++++.++++. ", "....+++++..++.. ", ".. ..+++++.... ", ". ..+++++.. ", " ...+... ", " .... ", " .. ", " . "}; /* XPM */ const char *fldigi_icon[] = { "48 48 215 2", " c None", ". c #000000", "+ c #BFBFBF", "@ c #050505", "# c #1A1A1A", "$ c #1F1F1F", "% c #C5C5C5", "& c #FEC1C1", "* c #FDC5C5", "= c #FEC2C2", "- c #FFBFBF", "; c #D5C4C4", "> c #0C0C0C", ", c #FE0303", "' c #FB0C0C", ") c #FD0606", "! c #FE0000", "~ c #4F0909", "{ c #D1BFBF", "] c #2F2F2F", "^ c #303030", "/ c #3C3C3C", "( c #838383", "_ c #C7C7C7", ": c #D9D9D9", "< c #D7D7D7", "[ c #C2C2C2", "} c #C4C4C4", "| c #C9C9C9", "1 c #9F9F9F", "2 c #DDDDDD", "3 c #DBDBDB", "4 c #CDCDCD", "5 c #8F8F8F", "6 c #414141", "7 c #343434", "8 c #313131", "9 c #010101", "0 c #292929", "a c #8A8A8A", "b c #A8A8A8", "c c #B6B6B6", "d c #CFCFCF", "e c #DEDEDE", "f c #DFDFDF", "g c #E5E5E5", "h c #E2E2E2", "i c #A0A0A0", "j c #7D7D7D", "k c #1D1D1D", "l c #767676", "m c #888888", "n c #9B9B9B", "o c #D3D3D3", "p c #C6C6C6", "q c #EBEBEB", "r c #DADADA", "s c #AAAAAA", "t c #858585", "u c #747474", "v c #232323", "w c #171717", "x c #818181", "y c #979797", "z c #AEAEAE", "A c #E4E4E4", "B c #D4D4D4", "C c #B5B5B5", "D c #E1E1E1", "E c #BABABA", "F c #9A9A9A", "G c #989898", "H c #030303", "I c #070707", "J c #242424", "K c #C1C1C1", "L c #E0E0E0", "M c #B2B2B2", "N c #363636", "O c #060606", "P c #020202", "Q c #929292", "R c #959595", "S c #C8C8C8", "T c #CECECE", "U c #B0B0B0", "V c #999999", "W c #040404", "X c #151515", "Y c #606060", "Z c #A2A2A2", "` c #CBCBCB", " . c #919191", ".. c #A4A4A4", "+. c #AFAFAF", "@. c #737373", "#. c #181818", "$. c #131313", "%. c #393939", "&. c #C3C3C3", "*. c #454545", "=. c #3A3A3A", "-. c #222222", ";. c #333333", ">. c #484848", ",. c #A1A1A1", "'. c #616161", "). c #0F0F0F", "!. c #C0C0C0", "~. c #808080", "{. c #404040", "]. c #121212", "^. c #191919", "/. c #BDBDBD", "(. c #7E7E7E", "_. c #3F3F3F", ":. c #161616", "<. c #090909", "[. c #212121", "}. c #777777", "|. c #BBBBBB", "1. c #3B3B3B", "2. c #5D5D5D", "3. c #A5A5A5", "4. c #727272", "5. c #272727", "6. c #101010", "7. c #9C9C9C", "8. c #B7B7B7", "9. c #B3B3B3", "0. c #080808", "a. c #262626", "b. c #ADADAD", "c. c #CCCCCC", "d. c #E9E9E9", "e. c #E8E8E8", "f. c #ACACAC", "g. c #2A2A2A", "h. c #323232", "i. c #DCDCDC", "j. c #D1D1D1", "k. c #E7E7E7", "l. c #D2D2D2", "m. c #0E0E0E", "n. c #0D0D0D", "o. c #4A4A4A", "p. c #8C8C8C", "q. c #B9B9B9", "r. c #7A7A7A", "s. c #525252", "t. c #373737", "u. c #7B7B7B", "v. c #E6E6E6", "w. c #A9A9A9", "x. c #6B6B6B", "y. c #141414", "z. c #757575", "A. c #D6D6D6", "B. c #E3E3E3", "C. c #6E6E6E", "D. c #0B0B0B", "E. c #1E1E1E", "F. c #EAEAEA", "G. c #B4B4B4", "H. c #D8D8D8", "I. c #9E9E9E", "J. c #444444", "K. c #ABABAB", "L. c #A6A6A6", "M. c #505050", "N. c #B1B1B1", "O. c #3E3E3E", "P. c #0A0A0A", "Q. c #878787", "R. c #EFEFEF", "S. c #8B8B8B", "T. c #4B4B4B", "U. c #4F4F4F", "V. c #CACACA", "W. c #EEEEEE", "X. c #434343", "Y. c #D5D5D5", "Z. c #7F7F7F", "`. c #5B5B5B", " + c #515151", ".+ c #868686", "++ c #8E8E8E", "@+ c #575757", "#+ c #707070", "$+ c #636363", "%+ c #B8B8B8", "&+ c #909090", "*+ c #252525", "=+ c #8D8D8D", "-+ c #969696", ";+ c #282828", ">+ c #A3A3A3", ",+ c #BCBCBC", "'+ c #A7A7A7", ")+ c #3D3D3D", "!+ c #2E2E2E", "~+ c #353535", "{+ c #D0D0D0", "]+ c #595959", "^+ c #BEBEBE", "/+ c #111111", "(+ c #5E5E5E", "_+ c #383838", ":+ c #939393", "<+ c #464646", "[+ c #2C2C2C", "}+ c #717171", "|+ c #898989", "1+ c #494949", "2+ c #555555", ". . . . . . . . + @ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + # . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + $ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", "% % % % % % % % % % % % % % % % % % % % % & * * * = - - - ; % % % % % % % % % % % % % % % % % % ", "> > > > > > > > > > > > > > > > > > > > > , ' ' ' ) ! ! ! ~ > > > > > > > > > > > > > > > > > > ", "+ + + + + + + + + + + + + + + + + + + + + - - - - - - - - { + + + + + + + + + + + + + + + + + + ", "] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ] ] ] / ( _ : < [ } | 1 2 3 4 5 6 ^ ] ] ] 7 8 ] ] ] ] ] ] ] ] ] ] ", ". . . . . . . . . . . . . . 9 . . . 0 a b c d e f g 2 h } i j 0 9 . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . k l m n o p 3 q h r s t u v . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . 9 w x y z : _ A B C D E F G 0 . . H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . I 9 . J t z % D K L d d r | M ( N 9 . O H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P > 9 . ] Q R S f D L T 4 e } U V 7 9 . H 9 . . . . . . . . . . . . ", ". . . . . P P . . . . . . 9 P W . . X Y Z e ` + .( ..d 3 +.@.#.. . . . O H . . . . . . . . . . ", ". . . . . @ @ . . . . . . W P . . . P $.%.&.*.=.-.k ;.>.,.'.X @ . . . . ).O . . . . . . . . . . ", ". . . . . @ @ . . . . . . P 9 . . . . 9 . !.P . . . . . ~.{.. . . . . . ].I . . . . . . . . . . ", ". . . . . O O . . . . . . . . . . . P O ^./.$.H H H H W (._.P . . . . . :.<.. . . . . . . . . . ", ". . . . . H H . . . . . . . . . . . O [.}.|.Y 1.6 6 1.2.3.4.5.P . . . . 6.I . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 9 . . ).u } A 4 7.8.9.7.: D d ~.W . . . 9 H 9 . . . . . . . . . . ", ". . . . . . . . . . . . . . H 0.. . a.b.&.c.d.o D L L e._ + f.g.9 . 0.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 0.9 . h.F c ` i.j.A e.k.2 l.C Q / 9 9 m.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . n.P . o.p.f.% q.A g e.q e e Z r.s.@ @ m.P . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . 9 . . t.u.+ v.B i.Z w.: L d.|.x.7 O 9 P . I 9 . . . . . . . . . . ", ". . . . . . . . . . . . . H O @ . . y.z.c.v.A.+ b b ,.B.e.[ C.D.9 . . 9 <.9 . . . . . . . . . . ", ". . . . . . . . . . . . . H D.n.. . E.,.o B.e.A.!.z ..F.L 3 Z [.9 . W H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P n.9 . 1.c G.H.g F.k.g e.A ` 9.I.J.W . O W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . W m.. W t.K.1 L.i.2 h i.v.D ..1 +.^ O 9 0.D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H O P > M.5 t p.< g g D d.i.1 Q N.O.O @ ).D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 P.H W o.Q.C p l.v.q R.i.i.d 1 S.T.I 9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O H . U.t +.l.V.V.e.W.k.r } S }.X.<.P W . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . 9 . 1.x U g 2 Y.g g g D 3 l.Z.v H . 9 . D.H . . . . . . . . . . ", ". . . . . 9 9 . . . . . . 9 9 . . . O -.> 4 @.C.`. +C.}.!..+W 0.. . . . w <.. . . . . . . . . . ", ". . . . . W W . . . . . . P 9 . . . . P 9 % y.<.<.0.I m.++@+@ . . . . . :.<.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . H 9 . . . O t.S.f ,.#+j u.$+n c.z +I 9 . . . > @ . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . X ( | H.v.%+D 4 &+v.` d n *+W . 9 9 9 . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . y.=+G.G.h [ F.d.j.A b +.-+;+P . 9 . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . H . . ] >+C U L B.k.e.h k.s b i *.O . 9 W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.P . %.M -+,+o d.i.A q 2 /.3.s +0.W n.0.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H @ 9 . ] '+c V.L e.A 2 D B.S C i )+O 9 H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . O O . . !+f._ l.e.d.g 2 D e.S &.K.s.P.. . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . P . 9 ~+f.E {+h d.e.g g L % !.R ]+D.9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O 9 O h.7.9.l.v.k.L B T 2 T ^+3.J.0.. 9 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . /+I D.X.Q L.e g q v.B.v.D B &.i (+P.W P.9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.I O _+b /.A.2 d.v.F.d.A : %+L.T.0.O /+H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . m.P . ;.Q + 3 f A h F.q d : } :+<+W H m.W . . . . . . . . . . . . ", ". . . . . . . . . . . . . H 9 I 9 . [+a p v.g k.o % e i.B.j.p.J.O . H 9 W P . . . . . . . . . . ", ". . . . . . . . . . . . . I H . . . O 5.}+o |+t 1+X.C..+,+p.8 ).9 . . . y.0.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . P 9 . . . . . . p X D.9 P O <.~.2+. . . . . . :.<.. . . . . . . . . . ", ". . . . . @ @ . . . . . . . . . . . . . . &.I . . . . . ~.T.. . . . . . #.P.. . . . . . . . . . "}; /* XPM */ const char *flarq_icon[] = { /* columns rows colors chars-per-pixel */ "48 35 924 2", " c None", ". c #5B1E0E", "+ c #7F381B", "@ c #A7624B", "# c #A8624E", "$ c #652012", "% c #90555F", "& c #AA7A86", "* c #D4B5BE", "= c #5E231C", "- c #540900", "; c #AC5D55", "> c #B4644F", ", c #CF7F58", "' c #FCAD85", ") c #FBB18F", "! c #BA7057", "~ c #965140", "{ c #4F1509", "] c #3B1314", "^ c #45151B", "/ c #895156", "( c #AB8687", "_ c #D7C6C1", ": c #FFFFFD", "< c #FFFFFE", "[ c #A58088", "} c #945D68", "| c #642D34", "1 c #AC6352", "2 c #A45C49", "3 c #A35B46", "4 c #CC8C74", "5 c #F4B8A0", "6 c #FAC5A8", "7 c #FFD4B3", "8 c #FFD8B8", "9 c #FFDCBD", "0 c #FFCFAC", "a c #E7A380", "b c #A2563C", "c c #984D37", "d c #A2787A", "e c #997474", "f c #AA8B91", "g c #D1C0C6", "h c #CAB3BD", "i c #FBE6F1", "j c #F9FFFF", "k c #F8FAFA", "l c #FEFFFF", "m c #F3F2EF", "n c #E9D7D9", "o c #AC9092", "p c #AC8C8D", "q c #926A6E", "r c #9A737B", "s c #9B747C", "t c #9E573C", "u c #98543D", "v c #9A5F47", "w c #BF8469", "x c #E9AE90", "y c #FFCAA8", "z c #FFD9B6", "A c #FFDFBA", "B c #FDE1BA", "C c #FDDEB8", "D c #FEDBBB", "E c #FBDBC3", "F c #F8DBC5", "G c #FFDCC3", "H c #FFD1AF", "I c #FBB891", "J c #E79B74", "K c #9A4E30", "L c #9B5644", "M c #7D4F54", "N c #D0BCBE", "O c #F5EDE7", "P c #FCF4EE", "Q c #FFFAFC", "R c #FFFFFF", "S c #C7BDC6", "T c #C4B0BD", "U c #F4F3F8", "V c #FDFCFF", "W c #FFFDFF", "X c #F7FFFF", "Y c #DEDCDC", "Z c #E6E1E1", "` c #FFFAF9", " . c #FFF3F5", ".. c #FFF4F7", "+. c #E2D9DA", "@. c #C1AEB5", "#. c #C5A3AF", "$. c #7B5057", "%. c #7D2F24", "&. c #C87559", "*. c #EA9464", "=. c #FFA873", "-. c #FFB886", ";. c #FFC193", ">. c #FBBD92", ",. c #FBBE92", "'. c #F9B98A", "). c #FAB784", "!. c #F8AE77", "~. c #F9AC76", "{. c #F3A97B", "]. c #F3BB97", "^. c #FDD7BD", "/. c #FEDCC3", "(. c #FFDBB4", "_. c #FED2A6", ":. c #FEBF94", "<. c #E89574", "[. c #D07355", "}. c #C06F4F", "|. c #C09581", "1. c #F0F1E9", "2. c #E8FBF4", "3. c #EEF9F3", "4. c #FDFDFE", "5. c #FDF8FE", "6. c #EFE7ED", "7. c #A6969F", "8. c #F2E9EF", "9. c #F7F9F9", "0. c #FEFDFF", "a. c #B2A3AC", "b. c #CBBFC7", "c. c #FCFBFE", "d. c #F9F6F8", "e. c #F5F8F7", "f. c #F6FFFF", "g. c #69302D", "h. c #5D0100", "i. c #A0402C", "j. c #CC7D59", "k. c #BF6F4E", "l. c #C16645", "m. c #F6996A", "n. c #FCA264", "o. c #F8995F", "p. c #F3925E", "q. c #F29968", "r. c #F29F71", "s. c #E79469", "t. c #C26640", "u. c #CF6A43", "v. c #FD9366", "w. c #FF9B68", "x. c #F99B63", "y. c #F19F6E", "z. c #EEAB80", "A. c #F8C59B", "B. c #FBD3AB", "C. c #FCD2AA", "D. c #FCD9B1", "E. c #F8D1AA", "F. c #F9C596", "G. c #FFB371", "H. c #FEAC6B", "I. c #D69B78", "J. c #EAD5D1", "K. c #ECF6FA", "L. c #F1FAFB", "M. c #FFFBFF", "N. c #FDF4FB", "O. c #FDFAFB", "P. c #D3CACE", "Q. c #D8C7CE", "R. c #F6FAF8", "S. c #FEFCFF", "T. c #C4B4C0", "U. c #D3C8D3", "V. c #FAFBFF", "W. c #FBFBFF", "X. c #FBFDFF", "Y. c #F7FEFF", "Z. c #F8DEDA", "`. c #B76C57", " + c #D76E4E", ".+ c #F89463", "++ c #F9A36A", "@+ c #FFB783", "#+ c #F5A27A", "$+ c #D0744E", "%+ c #EB9060", "&+ c #E68655", "*+ c #EA8855", "=+ c #F1935B", "-+ c #F0975D", ";+ c #D27B43", ">+ c #E18450", ",+ c #E98B5A", "'+ c #DD7C50", ")+ c #D07242", "!+ c #F9A06A", "~+ c #FFA771", "{+ c #F6A26B", "]+ c #EE9D67", "^+ c #EEA26D", "/+ c #F2AA77", "(+ c #ECA776", "_+ c #EDAC7B", ":+ c #EEB17D", "<+ c #F1A55D", "[+ c #FFA45C", "}+ c #DC855E", "|+ c #D9A3A2", "1+ c #F5F0FC", "2+ c #E9F7FA", "3+ c #F6FDFE", "4+ c #FDFBFE", "5+ c #F8F9F9", "6+ c #D1CFD0", "7+ c #CCB9C0", "8+ c #F9FAF9", "9+ c #FBFAFC", "0+ c #F7F0F5", "a+ c #D7C6D1", "b+ c #E7E0EB", "c+ c #EAF4FB", "d+ c #F1F9FD", "e+ c #F9FEFF", "f+ c #F2FCFB", "g+ c #F6F5F5", "h+ c #CA9E8E", "i+ c #F4A27A", "j+ c #FAA77A", "k+ c #F6B280", "l+ c #F5C896", "m+ c #FED8AD", "n+ c #FFCFAB", "o+ c #FFCCA8", "p+ c #F8C39B", "q+ c #F5BC9C", "r+ c #F2B48F", "s+ c #ECA878", "t+ c #F3A86C", "u+ c #FCAA68", "v+ c #FAA664", "w+ c #F9A76A", "x+ c #EC9B65", "y+ c #D38048", "z+ c #E69056", "A+ c #E0874E", "B+ c #FAA26B", "C+ c #FAA470", "D+ c #F5A06F", "E+ c #F59E6A", "F+ c #FA9C62", "G+ c #F99A5D", "H+ c #F49E6C", "I+ c #F89E63", "J+ c #FF9D5E", "K+ c #ED8F64", "L+ c #B67466", "M+ c #F5EBF0", "N+ c #E4F6F9", "O+ c #EAFCFA", "P+ c #FDFFFF", "Q+ c #F5F8F8", "R+ c #E6E6E7", "S+ c #BEAAB2", "T+ c #E9E2E6", "U+ c #FCF9FB", "V+ c #DFCFD2", "W+ c #C4AEB7", "X+ c #FAF0F9", "Y+ c #EAF0F6", "Z+ c #F3F8FC", "`+ c #FBFEFF", " @ c #F8F9F8", ".@ c #EADFDD", "+@ c #B47A60", "@@ c #E99560", "#@ c #F3BB8E", "$@ c #FDD8B6", "%@ c #FFDDC1", "&@ c #FDCFB2", "*@ c #FECEAD", "=@ c #FBD0A7", "-@ c #F7D3A7", ";@ c #FAD1AA", ">@ c #F9CAA1", ",@ c #F8C392", "'@ c #FAB179", ")@ c #F9A468", "!@ c #F9A166", "~@ c #F69F67", "{@ c #F9A470", "]@ c #FDA56E", "^@ c #F69A5A", "/@ c #D37536", "(@ c #D1753D", "_@ c #EF9868", ":@ c #F8A67A", "<@ c #F39F71", "[@ c #FB9E68", "}@ c #FF9D60", "|@ c #FA9C65", "1@ c #FAA06B", "2@ c #FA9C63", "3@ c #FDA26C", "4@ c #D5926E", "5@ c #F2DFDA", "6@ c #F0F3FD", "7@ c #EDF3F8", "8@ c #FEFCFC", "9@ c #F9FAFA", "0@ c #F3F4F6", "a@ c #A2929B", "b@ c #C0B1BA", "c@ c #C4B0B0", "d@ c #AC9398", "e@ c #FEF1F8", "f@ c #EEF2F7", "g@ c #F2F3F8", "h@ c #FEF9FB", "i@ c #FBF2F0", "j@ c #EFD9D8", "k@ c #E09D81", "l@ c #F0A268", "m@ c #F9CCA1", "n@ c #FDD3B7", "o@ c #F2B094", "p@ c #F3A377", "q@ c #F5A66E", "r@ c #F4A873", "s@ c #F3A476", "t@ c #F4A66D", "u@ c #F6A367", "v@ c #F9A269", "w@ c #FBA169", "x@ c #FD9F69", "y@ c #FC9F69", "z@ c #FC9F68", "A@ c #F99F65", "B@ c #F4A471", "C@ c #F9B385", "D@ c #F6A36E", "E@ c #F19359", "F@ c #D1743D", "G@ c #E3905E", "H@ c #F5A370", "I@ c #F59F69", "J@ c #FAA062", "K@ c #FBA05E", "L@ c #F8A26B", "M@ c #F9A46F", "N@ c #FAA160", "O@ c #EA9C62", "P@ c #C3998A", "Q@ c #F7EBFA", "R@ c #EEEAF8", "S@ c #F6F4F6", "T@ c #FCFEFF", "U@ c #F4F4F7", "V@ c #E4DCE3", "W@ c #D4C1CD", "X@ c #F2F5FA", "Y@ c #AEA19F", "Z@ c #C2B0B5", "`@ c #F9F8FC", " # c #E5F2F8", ".# c #EAF5FB", "+# c #F0F5F5", "@# c #F9F7F7", "## c #D3B3A9", "$# c #DF916B", "%# c #FAA76E", "&# c #F3B787", "*# c #F0AE84", "=# c #EE9D6B", "-# c #F6A15D", ";# c #F7A559", "># c #F9A160", ",# c #FE9B68", "'# c #FD9D67", ")# c #FC9F67", "!# c #FA9F69", "~# c #F9A06C", "{# c #F69F6A", "]# c #F5A067", "^# c #F9A464", "/# c #F5A35C", "(# c #E9A779", "_# c #F8D5C1", ":# c #FFCEAA", "<# c #FAB079", "[# c #E1884B", "}# c #CD713A", "|# c #F39961", "1# c #FAA56C", "2# c #F8A668", "3# c #FFA864", "4# c #EF9965", "5# c #E59462", "6# c #FBA360", "7# c #F49958", "8# c #BE8469", "9# c #E7DAE0", "0# c #EFF2FB", "a# c #EBF0F3", "b# c #FBFEFE", "c# c #F6F6FA", "d# c #FAF3FA", "e# c #B7A0AF", "f# c #C4C0C8", "g# c #D4CECD", "h# c #DED5DD", "i# c #EEF5FC", "j# c #E4F0FD", "k# c #E6F2FC", "l# c #EBF5FB", "m# c #EAE0E9", "n# c #B67A69", "o# c #ED8F5B", "p# c #FCA368", "q# c #F59E66", "r# c #F9A067", "s# c #F9A165", "t# c #F99F66", "u# c #FAA069", "v# c #FAA169", "w# c #FAA166", "x# c #F8A264", "y# c #F7A262", "z# c #F9A162", "A# c #F59E5E", "B# c #FCA464", "C# c #F0A172", "D# c #F8C7AA", "E# c #FFDFBE", "F# c #F7D7AF", "G# c #F7C497", "H# c #F19C6B", "I# c #DC7947", "J# c #E48552", "K# c #DD8553", "L# c #BF6033", "M# c #E28B60", "N# c #E99B6D", "O# c #F2A367", "P# c #FA9F60", "Q# c #E89874", "R# c #E2CBBF", "S# c #E9F6F7", "T# c #EAF1FA", "U# c #F6F6FB", "V# c #FAF9FC", "W# c #F9F1FA", "X# c #BBABB5", "Y# c #BDAEB7", "Z# c #DDCBCC", "`# c #FBF1F9", " $ c #EFEAF7", ".$ c #E9EFFC", "+$ c #EAF0FC", "@$ c #F1F6FE", "#$ c #E2CDCB", "$$ c #D28869", "%$ c #FFA26B", "&$ c #F99F64", "*$ c #FAA065", "=$ c #FAA167", "-$ c #FAA168", ";$ c #F9A066", ">$ c #F7A168", ",$ c #F7A167", "'$ c #F7A165", ")$ c #F9A163", "!$ c #FB9F63", "~$ c #FA9E65", "{$ c #F89D64", "]$ c #FEA667", "^$ c #F4B072", "/$ c #FBD2AB", "($ c #FBDFCB", "_$ c #F9DECA", ":$ c #FBCBAA", "<$ c #EFA579", "[$ c #D3764B", "}$ c #AE4621", "|$ c #EA865A", "1$ c #F8A674", "2$ c #F8A16F", "3$ c #FAA66A", "4$ c #E38A65", "5$ c #D5AFA0", "6$ c #F1FDFF", "7$ c #E9EFFF", "8$ c #EEEDFC", "9$ c #F5F4FD", "0$ c #F0EDF6", "a$ c #F5E9EF", "b$ c #C6AFB4", "c$ c #A28385", "d$ c #FFF7FE", "e$ c #F1E8F9", "f$ c #EBEFF9", "g$ c #EBEFFA", "h$ c #F0EFF8", "i$ c #D5B09E", "j$ c #ED9B6E", "k$ c #FDA168", "l$ c #F89F66", "m$ c #F89F65", "n$ c #F6A066", "o$ c #F5A166", "p$ c #F6A065", "q$ c #F8A065", "r$ c #F9A167", "s$ c #FCA06A", "t$ c #F99B68", "u$ c #DA7F51", "v$ c #E88B52", "w$ c #F9A15D", "x$ c #F1AF7D", "y$ c #F8D0B1", "z$ c #FBDCC7", "A$ c #FDDEC9", "B$ c #FED4B9", "C$ c #FBBC9A", "D$ c #E58C65", "E$ c #DB794C", "F$ c #F69F61", "G$ c #FF9F61", "H$ c #FD9D60", "I$ c #FAA163", "J$ c #F79C6E", "K$ c #DCA289", "L$ c #EAE3E3", "M$ c #ECF2FF", "N$ c #E7F0FB", "O$ c #E7F3FA", "P$ c #E7EFF2", "Q$ c #FEF7F9", "R$ c #B49DA0", "S$ c #C0A5A8", "T$ c #F7F6FB", "U$ c #E9EAFB", "V$ c #E9F0F8", "W$ c #E9F0FA", "X$ c #F5F1FA", "Y$ c #DBAD8E", "Z$ c #EF975E", "`$ c #FBA16A", " % c #F7A065", ".% c #F6A165", "+% c #F6A067", "@% c #F6A570", "#% c #F4A673", "$% c #EC9A6C", "%% c #D1794A", "&% c #E68752", "*% c #FDA26F", "=% c #F2A374", "-% c #F9C29B", ";% c #FFE0C1", ">% c #FDDDBC", ",% c #F4C29D", "'% c #E09266", ")% c #D67F46", "!% c #FB9E5C", "~% c #FF9D63", "{% c #FBA972", "]% c #CE805C", "^% c #C8A39D", "/% c #F2F5FD", "(% c #EAF1F4", "_% c #E6F2F3", ":% c #E6F5F4", "<% c #E7F1F1", "[% c #EAEDED", "}% c #E6E0E3", "|% c #E7F3F7", "1% c #DEF1FD", "2% c #E7F2FB", "3% c #EBF3FB", "4% c #E7D7DC", "5% c #D5916A", "6% c #FCA265", "7% c #F89E68", "8% c #F8A066", "9% c #F29F67", "0% c #EFA56E", "a% c #FBC490", "b% c #F6BC8A", "c% c #E9A26E", "d% c #D8834F", "e% c #E58456", "f% c #FF9B6E", "g% c #FAA16D", "h% c #EDB075", "i% c #F3C790", "j% c #FCD7AD", "k% c #FED4B6", "l% c #F6BB94", "m% c #CE8350", "n% c #D6854A", "o% c #FBA16F", "p% c #F39F6D", "q% c #F1A86D", "r% c #E89568", "s% c #D79F8D", "t% c #F4EDEE", "u% c #F0EEF8", "v% c #ECEEF6", "w% c #ECEFF9", "x% c #ECEDF7", "y% c #F1F0FC", "z% c #F0F4FA", "A% c #E6F2F5", "B% c #DCF5FD", "C% c #E3EBF7", "D% c #F9FBFF", "E% c #C19A96", "F% c #D57E55", "G% c #FDA366", "H% c #F99F67", "I% c #F99F63", "J% c #FA9F63", "K% c #F99E64", "L% c #F8A86F", "M% c #F1A66F", "N% c #F8B985", "O% c #FDD4A2", "P% c #F2BD89", "Q% c #F5A971", "R% c #E28955", "S% c #D97847", "T% c #F69962", "U% c #F4A66A", "V% c #E9A46A", "W% c #F2AA79", "X% c #F9AE84", "Y% c #F6AB7C", "Z% c #EA9B63", "`% c #E49159", " & c #FFA572", ".& c #FBA36B", "+& c #F8A363", "@& c #FFA66F", "#& c #CE7F5A", "$& c #E9CAC3", "%& c #F2F3FF", "&& c #EBEDFD", "*& c #F1EFFF", "=& c #F8F1FF", "-& c #FAEFFE", ";& c #FDF8FF", ">& c #FCF4F9", ",& c #F4F9FA", "'& c #F9F7FF", ")& c #FDE9EB", "!& c #D99781", "~& c #F59668", "{& c #F8A165", "]& c #F8A164", "^& c #F7A063", "/& c #F9A164", "(& c #FBA069", "_& c #D98350", ":& c #DA8954", "<& c #E79A68", "[& c #FAB887", "}& c #F6B181", "|& c #F5A46D", "1& c #F4A15F", "2& c #E6914E", "3& c #D37D41", "4& c #EA9569", "5& c #F8A078", "6& c #FC9E6C", "7& c #FE9D5C", "8& c #FF9F5B", "9& c #FFA46B", "0& c #E58B5F", "a& c #F09769", "b& c #F39562", "c& c #F09762", "d& c #EF9A6A", "e& c #D67F58", "f& c #BB8678", "g& c #F6F6FF", "h& c #F7F4FF", "i& c #EADFE9", "j& c #D8C4CE", "k& c #DABEC8", "l& c #E3C8DB", "m& c #E9CAD1", "n& c #ECD7D4", "o& c #EEDFE4", "p& c #B98787", "q& c #D9805B", "r& c #F9A266", "s& c #F6A360", "t& c #F79E64", "u& c #F6A466", "v& c #F6A465", "w& c #F9A065", "x& c #FD9E67", "y& c #DC7E4D", "z& c #C7693C", "A& c #ED9167", "B& c #F4976B", "C& c #FBA160", "D& c #FFAC67", "E& c #F49B60", "F& c #D6784A", "G& c #E5895F", "H& c #F09662", "I& c #FFA866", "J& c #FFAD6E", "K& c #E07F5D", "L& c #7B2B1B", "M& c #853D24", "N& c #963E27", "O& c #8D472B", "P& c #824730", "Q& c #843A2A", "R& c #712A23", "S& c #BA9092", "T& c #DABABA", "U& c #8B6E6B", "V& c #4D3232", "W& c #5D2D3D", "X& c #68353A", "Y& c #734744", "Z& c #6A4A4C", "`& c #663235", " * c #934833", ".* c #DF8766", "+* c #F99766", "@* c #FB9E61", "#* c #FFA66E", "$* c #FCA16D", "%* c #F99E69", "&* c #F7A169", "** c #F3A266", "=* c #F4A365", "-* c #FB9F68", ";* c #F6A16A", ">* c #F6A16B", ",* c #FCA06C", "'* c #FC9D69", ")* c #FF9D6B", "!* c #FF9E6C", "~* c #F69563", "{* c #D67949", "]* c #D47348", "^* c #F79567", "/* c #FA9F68", "(* c #F9A265", "_* c #FFA166", ":* c #FC9B65", "<* c #E98D5B", "[* c #C4683A", "}* c #BE6339", "|* c #B06D4E", "1* c #732F25", "2* c #64201E", "3* c #8B463B", "4* c #B6573A", "5* c #D06B39", "6* c #D37A42", "7* c #F4986B", "8* c #FC9C73", "9* c #F99F6C", "0* c #F4A766", "a* c #F1A561", "b* c #F49E63", "c* c #FB9E6B", "d* c #F7A069", "e* c #F9A16A", "f* c #FCA16C", "g* c #FE9F6C", "h* c #FFA06C", "i* c #FBA468", "j* c #F49D5F", "k* c #ED925B", "l* c #C86A3A", "m* c #DF8653", "n* c #FBA26F", "o* c #F9A369", "p* c #FFA673", "q* c #F6936D", "r* c #7C1705", "s* c #7C3625", "t* c #C76E51", "u* c #DE7B53", "v* c #CA693D", "w* c #BF633B", "x* c #E88C57", "y* c #E98E54", "z* c #F9A267", "A* c #FEA86F", "B* c #F4A167", "C* c #F6A362", "D* c #F19C5B", "E* c #DD8848", "F* c #E89255", "G* c #E68F53", "H* c #F49D63", "I* c #FEA76D", "J* c #FCA36A", "K* c #FAA466", "L* c #F29B5B", "M* c #EC8E5C", "N* c #DB8154", "O* c #D6874F", "P* c #E79659", "Q* c #FFA778", "R* c #D07B64", "S* c #6E1913", "T* c #6C1F18", "U* c #963729", "V* c #EC9366", "W* c #FFB374", "X* c #E98F56", "Y* c #B24C23", "Z* c #ED8661", "`* c #E78B58", " = c #FAA561", ".= c #F8A262", "+= c #F6A164", "@= c #F7A466", "#= c #E49459", "$= c #C16E36", "%= c #E08C58", "&= c #E1895C", "*= c #EF9265", "== c #FFA372", "-= c #FEA36A", ";= c #F5A268", ">= c #F6AA6A", ",= c #DC8545", "'= c #D47440", ")= c #C87153", "!= c #69241A", "~= c #AB5E46", "{= c #E88666", "]= c #E37B53", "^= c #D26E43", "/= c #F4996C", "(= c #CC6C39", "_= c #E5834A", ":= c #F39462", "<= c #FA9F6F", "[= c #F6A16D", "}= c #F49F6B", "|= c #F69E6D", "1= c #DD7F55", "2= c #C7653C", "3= c #E7825E", "4= c #E4895D", "5= c #F1A364", "6= c #FFAC66", "7= c #FEA067", "8= c #CD7151", "9= c #6E2215", "0= c #7F2427", "a= c #902F20", "b= c #E5895A", "c= c #FFB175", "d= c #F2915D", "e= c #B7522B", "f= c #C05D34", "g= c #D67649", "h= c #F69E68", "i= c #FDA46B", "j= c #FCA069", "k= c #FFA46E", "l= c #F49460", "m= c #EB8E5D", "n= c #D06F41", "o= c #C9683C", "p= c #D67D55", "q= c #A55135", "r= c #682616", "s= c #8F4C2E", "t= c #DE8C68", "u= c #CA6E51", "v= c #C4654C", "w= c #FFA579", "x= c #F09360", "y= c #CC7345", "z= c #DA844C", "A= c #EE9556", "B= c #F59D5E", "C= c #FFB174", "D= c #FFB075", "E= c #FFB073", "F= c #FFA472", "G= c #B85D49", "H= c #6C1515", "I= c #8B5446", "J= c #73251B", "K= c #95402C", "L= c #E48F68", "M= c #FFAA79", "N= c #F59D70", "O= c #EB9061", "P= c #E48A59", "Q= c #C57046", "R= c #B26340", "S= c #B16947", "T= c #B36943", "U= c #A65D40", "V= c #7B3629", "W= c #6A230D", "X= c #BA6848", "Y= c #D57C5E", "Z= c #D1745E", "`= c #CE7260", " - c #923C2D", ".- c #84382F", "+- c #813F39", "@- c #7B423B", " ", " ", " ", " ", " . + @ # $ % & * ", " = - ; > , ' ) ! ~ { ] ^ / ( _ : < ", "[ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l ", "m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W ", "X Y Z ` ...+.@.#.$. %.&.*.=.-.;.>.,.'.).!.~.{.].^./.9 (._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.", "R a.b.c.d.e.f.R W g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.", "R T.U.V.W.X.Y.V Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+", "0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+", "V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@R ", "c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@", "Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#", "g#h#i#j#k#l#m#n#o#p#~@q#r#s#s#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#", "Z#`# $.$+$@$#$$$%$&$&$*$=$-$r#r#;$>$,$'$)$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$~@3$4$5$6$7$8$9$0$a$b$", "c$d$e$f$g$h$i$j$k$A@;$=$;$;$l$m$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$", "S$T$U$V$W$X$Y$Z$`$;$=$;$=$=$;$;$;$ % %.% %+%@%#%$%%%&%*%=%-%D ;%>%,%'%)%!%~%t#{%]%^%/%(%_%:%<%[%", "}%|%1%2%3%4%5%6%7%r#=$m$;$;$=$;$8%&$&$q$+%9%0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%", "z%A%B%C%D%E%F%G%H%=$=$;$;$;$=$;$m$I%J%K%v@L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&-&", ";&>&,&'&)&!&~&{&]&;$;$;$;$;$;$;$;$^&/&K%(&_&:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&", "l&m&n&o&p&q&=.r&s&t&t&r$;$;$m$;$r$u&v&w&x&t$y&z&A&B&x@C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V& ", "W&X&Y&Z&`& *.*+*@*#*$*%*&***=*A@-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*1* 2* ", " 3*4*5*6*7*8*9*0*a*b*c*d*e*f*g*h*z@i*j*k*l*m*n*8%o*p*q*r* ", " s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S* ", " T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*===-=;=>=,='=)=!= ", " ~={=]=^=/=(=_=:=<=n*[=}=|=1=2=3=4=5=6=7=8=9= ", " 0=a=b=c=d=e=f=g=o%h=i=j=k=l=m=n=o=p=q=r= ", " s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H= ", " I=J=K=L=M=N=O=P=Q=R=S=T=U=V= ", " W=X=Y=Z=`= -.-+-@- ", " ", " ", " "}; /* actions/view-refresh.png */ /* XPM */ const char *tango_view_refresh[] = { /* width height ncolors chars_per_pixel */ "16 16 100 2", /* colors */ " c #9DBDDC", " . c #6990C0", " X c #3767A6", " o c #3667A5", " O c #3565A4", " + c #DDE8F3", " @ c #8AACD3", " # c #99B9DB", " $ c #B4CBE5", " % c #D8E4F1", " & c #5783BB", " * c #537FB7", " = c #4B77AF", " - c #A0BEDE", " ; c #3868A6", " : c #3768A5", " > c #4C79B3", " , c #769DCF", " < c #5580B5", " 1 c #97B6D8", " 2 c #8FACD0", " 3 c #E4ECF5", " 4 c #4E7AB1", " 5 c #C8D8EA", " 6 c #4C78AF", " 7 c #8FB0D3", " 8 c #6D94C2", " 9 c #6891C7", " 0 c #3C6BA9", " q c #3A69A7", " w c #3969A6", " e c #C6D8EB", " r c #4774AD", " t c #C1D2E6", " y c #6890C0", " u c #CDDBEB", " i c #3465A4", " p c #6188B9", " a c #DBE6F2", " s c #BFD2E7", " d c #84A6CE", " f c #E5EDF5", " g c #C9D9EA", " h c #8FADD2", " j c #A1BEDD", " k c #3A6AA6", " l c #E2EBF5", " z c #88A7CE", " x c #3768A6", " c c #95B2D4", " v c #3566A4", " b c #C4D7EB", " n c #4371AB", " m c #A1BBD9", " M c #E7EEF6", " N c #BFD3E9", " B c #5F87B9", " V c #7298C5", " C c #5D85B7", " Z c #6C95C9", " A c #82A5CE", " S c #9CB7D7", " D c #C9DAEC", " F c #E3ECF5", " G c #4C78B0", " H c #8EAED3", " J c #4F7CB6", " K c #3969A7", " L c #3869A6", " P c #3767A5", " I c #A8C2DF", " U c #93B1D4", " Y c #4170AB", " T c #CCDDEE", " R c #B0C9E3", " E c #E5EDF6", " W c #E4EDF5", " Q c #FFFFFF", " ! c #4D79B0", " ~ c #C7D7E9", " ^ c #4C77AF", " / c #5B84B7", " ( c #D5E2F0", " ) c #3C6CA9", " _ c #3A6AA7", " ` c #E0E9F4", " ' c #A8C1DE", " ] c #8CADD3", " [ c #B4CAE3", " { c #3566A5", " } c #7299CD", " | c #88ABD2", ". c #CCDCED", ".. c #E6EEF6", ".X c #BCD1E7", ".o c #7EA4D5", ".O c #3D6DA9", ".+ c #3C6BA8", ".@ c #3B6BA7", ".# c None", /* pixels */ ".#.#.#.# q _ o K _.#.#.#.#.#.#.#", ".#.#.# ; y 7 I ' U B P.#.#.# i.#", ".#.# w ] j $ N T ( s = o n v.#", ".# K . V.+ v _ C m % a + z 5 _.#", ".# ; Y ) _.#.#.# L p u l.... _.#", ".# O _ 9 P.#.#.#.#.# v ~ e F k.#", ".# i.#.#.#.#.#.#.# ; 2 M a.. k.#", ".#.#.#.#.#.#.#.# i i r ^ ^ 6 i.#", ".# i i i i i i i.#.#.#.#.#.#.#.#", ".# i f E 3 S x.#.#.#.#.#.#.# i.#", ".# v.. b g i.#.#.#.#.# { Z * i.#", ".# P.. F W t ! L.#.#.# 0 J _ :.#", ".# ; % c ` +. h G { w w.O G _.#", ".# P / o 4 [ D.X R - | A H ;.#.#", ".# i o.#.# X < d 1 # @ 8 ;.#.#.#", ".# i.#.#.#.#.# _ L v _.@.#.#.#.#" }; fldigi-4.1.06/src/misc/kmlserver.cxx0000664000175000017500000016676713507402064014273 00000000000000// ---------------------------------------------------------------------------- // kmlserver.cxx -- KML Server // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "kmlserver.h" #include "gettext.h" #include "debug.h" #include "threads.h" #include "strutil.h" #include "configuration.h" #include "fl_digi.h" #include "irrXML.h" #include "timeops.h" /** Some platforms have problems with condition variables apparently. * When cancelling a thread which waits in pthread_cond_timedwait, * the thread is stuck. * We replace it by an unconditional wait, and a test on a boolean * which indicates if data was saved in the internal buffers. * The consequence is that data are not immediately saved in KML files, * and the user has to wait until the end of the delay. */ #if !defined(__APPLE__) # define FLDIGI_KML_CONDITION_VARIABLE 1 #endif // ---------------------------------------------------------------------------- static const char * KmlSrvUnique = "Permanent"; /// This must follow a specific ISO format so it can be serialized in KML files. static void KmlTimestamp( std::ostream &ostrm, time_t tim ) { if(tim == KmlServer::UniqueEvent) { ostrm << KmlSrvUnique; return; } tm objTm = *gmtime(&tim); char bufTm[40]; // See http://www.w3.org/TR/xmlschema-2/#isoformats snprintf( bufTm, sizeof(bufTm), "%4d-%02d-%02dT%02d:%02dZ", objTm.tm_year + 1900, objTm.tm_mon + 1, objTm.tm_mday, objTm.tm_hour, objTm.tm_min ); ostrm << bufTm ; } /// For debugging purpose. static std::string KmlTimestamp( time_t tim ) { std::stringstream strm ; KmlTimestamp( strm, tim ); return strm.str(); } /// Deserialize a timestamp, inverse of KmlTimestamp. static time_t KmlFromTimestamp( const char * ts ) { if(ts == NULL ) throw std::runtime_error("Null timestamp"); if( 0 == strcmp( ts, KmlSrvUnique ) ) return KmlServer::UniqueEvent ; /// So all fields are initialised with correct default values. time_t timNow = time(NULL); tm objTm = *gmtime( &timNow ); int r = sscanf( ts, "%4d-%02d-%02dT%02d:%02dZ", &objTm.tm_year, &objTm.tm_mon, &objTm.tm_mday, &objTm.tm_hour, &objTm.tm_min ); if( r != 5 ) throw std::runtime_error("Cannot read timestamp from " + std::string(ts) ); objTm.tm_year -= 1900; objTm.tm_mon -= 1; objTm.tm_sec = 0; time_t res = mktime( &objTm ); if( res < 0 ) throw std::runtime_error("Cannot make timestamp from " + std::string(ts) ); return res; } // ---------------------------------------------------------------------------- /// Some chars are forbidden in HTML documents. This replaces them by HTML entities. // We do not need to create a temporary copy of the transformed string. // See Html entities here: http://www.w3schools.com/tags/ref_entities.asp static void StripHtmlTags( std::ostream & ostrm, const char * beg, bool newLines = false ) { const char * ptr = NULL; // TODO: Consider   ¢ £ ¥ € § © ® ™ for( const char * it = beg ; ; ++it ) { /** Other characters are filtered: * U+0009, U+000A, U+000D: these are the only C0 controls accepted in XML 1.0; * U+0020–U+D7FF, U+E000–U+FFFD: */ char ch = *it ; switch( ch ) { case 0x01 ... 0x08 : // case 0x09 : // case 0x0A : case 0x0B ... 0x0C : // case 0x0D : case 0x0E ... 0x0F : ptr = " "; break; case '"' : ptr = """; break; case '\'' : ptr = "'"; break; case '&' : ptr = "&" ; break; case '<' : ptr = "<" ; break; case '>' : ptr = ">" ; break; case '\0' : break ; case '\n' : if(newLines) // Should we replace new lines by "
" ? { ptr = "
" ; break; } // Otherwise we print the newline char like the other chars. default : continue ; } if( it != beg ) { ostrm.write( beg, it - beg ); } if( ch == '\0' ) break ; assert(ptr); ostrm << ptr ; beg = it + 1 ; } } /// Some values such as Navtex messages may contain newline chars. static void StripHtmlTagsNl( std::ostream & ostrm, const std::string & beg ) { StripHtmlTags( ostrm, beg.c_str(), true ); } static void StripHtmlTags( std::ostream & ostrm, const std::string & beg ) { StripHtmlTags( ostrm, beg.c_str() ); } // ---------------------------------------------------------------------------- /// Also used when reloading a KML file. void KmlServer::CustomDataT::Push( const char * k, const std::string & v ) { push_back( value_type( k, v ) ); } // ---------------------------------------------------------------------------- /// Different sorts of KML datas. This list is hardcoded but they are processed identically. static const char * categories[] = { "User", "Synop", "Navtex" }; static const size_t nb_categories = sizeof(categories) / sizeof(*categories); /// Written at the beginning of each KML document. static void KmlHeader( std::ostream & ostrm, const std::string & title ) { ostrm << "\n" "\n" "\n" "" << title << "\n" ; } /// Appended at the end of each KML document. static const char KmlFooter[] = "\n" "\n" ; /// Contains for example GIF images, and all the styles. Can be customised by the user. static const std::string namStyles = "styles.kml"; /** Used to code the data for reloading. The description tag is too complicated * to parse and its serialization might not be reversible. * We use preprocessor constants instead of char arrays so they can be concatenated at compile-time. * The tags must be as short as possible but the values easy to deserialize. * */ #define FLDIGI_TAG_ITM "fldigi:itm" #define FLDIGI_TAG_EVT "fldigi:evt" #define FLDIGI_TAG_KEY "k" #define FLDIGI_TAG_VAL "v" #define FLDIGI_TIMESTAMP "ts" /// Global singleton of all KML-related things. class KmlSrvImpl : public KmlServer { volatile bool m_loaded ; /// Set when ready for operation. std::string m_kml_dir; /// Where kml files are saved. std::string m_command; /// Started each time KML files are saved. int m_pid_command; /// Process id of the running commend for KML files. double m_merge_dist; /// Below this, placemark with same name are merged. int m_retention_delay; /// Purge old data. int m_refresh_interval; /// In seconds, written in KML files. int m_balloon_style; /// Display style in KML balloons: Lines, matrices, plain text. pthread_t m_writer_thread ; /// Periodically woken up to write things to the KML file. /// Models a KML placemark. It contains events indexed my a timestamp. /// We need an ordered container in order to remove old data in one erase. class PlacemarkT : public std::multimap< time_t, CustomDataT > { CoordinateT::Pair m_coord; double m_altitude; std::string m_styleNam; // The icon. std::string m_kmlId ; // Unique KML id for the placemark. std::string m_descrTxt ;// KML snippet. /// Serialize the internal data to XML so they can be easily read. void SerializeForReading( std::ostream & ostrm ) const { /// Custom data elements for reading the content when restarting. ostrm << "\n"; /// Print from the most recent event, which is at the end. for( const_iterator itEvt = begin(), enEvt = end(); itEvt != enEvt; ++itEvt ) { ostrm << "<" FLDIGI_TAG_EVT " " FLDIGI_TIMESTAMP "=\""; KmlTimestamp(ostrm,itEvt->first); ostrm << "\">\n" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { ostrm << "<" FLDIGI_TAG_ITM " " FLDIGI_TAG_KEY "=\"" << it->first << "\" " FLDIGI_TAG_VAL "=\""; StripHtmlTags(ostrm,it->second); ostrm << "\" />"; } ostrm << "\n" ; } /// Dumps all events in natural order ostrm << "\n"; } public: /// Constructor called by "Broadcast", not from reading a KML file. PlacemarkT( const CoordinateT::Pair & refCoo, double altitude, const std::string & styleNam, const std::string & kmlNam ) : m_coord( refCoo ) , m_altitude( altitude ) , m_styleNam( styleNam ) { /// The unique key is indeed the name and the time, /// because an object such as a ship might move and come back to the same place. /// We add a counter because during tests, the timestamps are too close. static int dummyCnt = 0 ; std::stringstream strm ; /// No need to store the kml name because it is the multimap key. StripHtmlTags(strm,kmlNam); strm << ':' << Tm2Time() << ':' << ++dummyCnt ; m_kmlId = strm.str(); } /// Constructor for deserialization. Strings comes from the KML file. PlacemarkT() : m_altitude(0.0) {} void Clear() { m_styleNam.clear(); m_kmlId.clear(); m_descrTxt.clear(); clear(); } /// Used when reading a KML file. Read coordinates and altitude from a string when reloading a KML file. void SetCoordinates( const char * str ) { double lon, lat ; if( str == NULL ) { throw std::runtime_error("Null coordinates text"); } int r = sscanf( str, "%lf,%lf,%lf", &lon, &lat, &m_altitude ); if( r != 3 ) { static const std::string msg("Cannot read coordinates and altitude:"); throw std::runtime_error(msg+str); } m_coord = CoordinateT::Pair( lon, lat ); } /// Used when reading a KML file. HTML entities are already removed. "+1" is for the "#". void SetStyle( const char * str ) { if(str == NULL ) throw std::runtime_error("Null input style"); size_t sz = namStyles.size(); // If the strings are equal, then strlen(str) >= sz, and str[sz] == '\0' if equality. if( ( 0 == strncmp( str, namStyles.c_str(), sz ) ) && ( str[sz] == '#' ) ) { m_styleNam = str + sz + 1; } else { if (bMOREINFO) LOG_INFO("Inconsistent URL style:%s",str ); m_styleNam = str ; } } /// Used when reading a KML file. void SetKmlId( const char * str ) { std::stringstream strm ; // The KML deserializer irrXML transforms the HTML entities // into normal chars. We must do the reverse transformation. StripHtmlTags(strm,str); m_kmlId = strm.str(); } /// Just add the events without suppressing duplicate information. void AppendEvent( time_t evtTim, const std::string & descrTxt, const CustomDataT & custDat ) { if( m_descrTxt.empty() ) m_descrTxt = descrTxt ; else if( ! descrTxt.empty() ) { // We want to ensure that it is not a miscommunication. if( NULL == strstr( m_descrTxt.c_str(), descrTxt.c_str() ) ) { m_descrTxt += "," + descrTxt ; } } /// Default time is now. evtTim might have another special value. if(evtTim == 0) { evtTim = time(NULL); } insert( value_type( evtTim, custDat ) ); } const CoordinateT::Pair & coordinates() const { return m_coord;} double altitude(void) const { return m_altitude;} const std::string & style(void) const { return m_styleNam; } const std::string & KmlId(void) const { return m_kmlId; } /// When writing the style to the KML file. void styleToKml(std::ostream & ostrm) const { ostrm << namStyles << '#'; StripHtmlTags(ostrm,m_styleNam); } /// Used when several PlacemarkT with the same kmlNam but different styles. Keep the first only. void style(const std::string & styl) { m_styleNam = styl; } /// This is NOT the Euclidian distance but tries to reflect a position change on a 3D map. double distance_to( const PlacemarkT & refOther ) const { double delta_altitude_km = fabs( m_altitude - refOther.m_altitude ) * 0.001 ; // Big coefficient for the altitude, to show on the map what happens. double horiz_dist = m_coord.distance( refOther.m_coord ); return horiz_dist + 10 * delta_altitude_km ; } /// Adds the events of another placemark. Manages events enforced to be unique. void concatenate( const PlacemarkT & refOther ) { if( refOther.empty() ) return ; time_t firstTm = refOther.begin()->first ; if( firstTm == KmlServer::UniqueEvent ) { clear(); /// We keep this special time_t value to enforce unicity of CustomDataT. insert( *refOther.begin() ); } else { insert( refOther.begin(), refOther.end() ); } } // PlacemarkT::concatenate /// This transforms our coordinates into KML ones. void WriteCooSub( std::ostream & ostrm ) const { ostrm << m_coord.longitude().angle() << ',' << m_coord.latitude().angle() << ',' << m_altitude ; } /// Writes the placemark to a KML stream. void Serialize( std::ostream & ostrm, const std::string & kmlNam, int balloon_style ) const { // Range of events which occured at this place. const_reverse_iterator beEvt = rbegin(), enEvt = rend(); // There should be at least one event. if( beEvt == enEvt ) { if (bMOREINFO) LOG_WARN("Inconsistency: No event kmlId=%s",m_kmlId.c_str() ); return ; } // The unique key is indeed the name and the time, // because an object such as a ship might move and come back to the same place. // We add a counter because during tests, the timestamps are too close. ostrm << "\n"; // Beware of the sign of longitude. ostrm << "" ; WriteCooSub( ostrm ); ostrm << "\n"; if( kmlNam.empty() ) ostrm << "No name\n"; else { // Looks like there is a bug in KML when displaying a placemark ID containing an hyphen. ostrm << ""; StripHtmlTags(ostrm,kmlNam); ostrm << "\n"; } ostrm << ""; styleToKml(ostrm); ostrm << "\n"; // More information here: http://freegeographytools.com/2007/putting-time-data-into-a-kml-file // 1944-06-06T06:00:00 See http://www.w3.org/TR/xmlschema-2/#isoformats // We do not add the timestamps because it is not very ergonomic. Should be added to the linestrings too. static const bool withTimestamp = false ; if( withTimestamp ) { // Last update time is last argument. ostrm << ""; KmlTimestamp(ostrm,enEvt->first); ostrm << "\n"; } /// Whats is displayed on the margin. Must be short. ostrm << ""; StripHtmlTags(ostrm,m_descrTxt); ostrm << "\n"; /** * Unfortunately it is not possible to use CSS in Google-maps, due to "content scrubbing": * http://stackoverflow.com/questions/8421260/styling-kml-with-css-in-google-maps-v3 * Scrubbing the contents is a security measure to prevent malicious code from executing. * It removes JavaScript, CSS, iframe, embed and object tags. */ static const char * colorTime = "#0099CC"; static const char * colorKey = "#FF9933"; ostrm << ""; /// Data can be displayed into one big matrix, or several tables, one per event. switch( balloon_style ) { case 0: /// Plain text, for example for GPX conversion. for( const_reverse_iterator itEvt = beEvt; itEvt != enEvt; ++itEvt ) { ostrm << "Timestamp:" << Tm2Time(itEvt->first) << "\n" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { StripHtmlTags(ostrm,it->first); ostrm << ":"; /// Do not insert
tags. StripHtmlTags(ostrm,it->second); ostrm << "\n" ; } ostrm << "\n" ; } break; case 1: // One distinct HTML table per event. ostrm << ""; // Print from the most recent event, which is at the end. for( const_reverse_iterator itEvt = beEvt; itEvt != enEvt; ++itEvt ) { ostrm << ""; ostrm << "" << Tm2Time(itEvt->first) << "" "" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { ostrm << "" ""; StripHtmlTags(ostrm,it->first); ostrm << "" ""; StripHtmlTagsNl(ostrm,it->second); ostrm << "" "" ; } } ostrm << "]]>\n"; break; case 2 : { /// Transposition of the html matrix. typedef std::vector TitleT ; TitleT titles ; typedef std::vector< std::string > RowT ; const_iterator beCol = begin(), enCol = end(); for( const_iterator itCol = beCol; itCol != enCol; ++itCol ) { titles.push_back( itCol->first ); } size_t nbCols = titles.size(); typedef std::map< std::string, RowT > MtxT; MtxT mtx ; size_t iCols = 0; for( const_iterator itCol = beCol; itCol != enCol; ++itCol, ++iCols ) { const CustomDataT & refCust = itCol->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { MtxT::iterator itMtx = mtx.find( it->first ); if( itMtx == mtx.end() ) { itMtx = mtx.insert( mtx.end(), MtxT::value_type( it->first, RowT() ) ); itMtx->second.resize(nbCols); } itMtx->second[iCols] = it->second ; } } ostrm << ""; ostrm << ""; for( size_t iCols = 0; iCols < nbCols; ++iCols ) { ostrm << "" << Tm2Time(titles[iCols]) << ""; } ostrm << "" ; for( MtxT::const_iterator itMtx = mtx.begin(), enMtx = mtx.end(); itMtx != enMtx; ++itMtx ) { ostrm << ""; ostrm << ""; StripHtmlTags(ostrm,itMtx->first); ostrm << ""; // TODO: Do not write twice the same value if it is not numeric (Starting with a digit) // or longer than N characters. for( RowT::const_iterator itRow = itMtx->second.begin(), enRow = itMtx->second.end(); itRow != enRow; ++itRow ) { ostrm << ""; StripHtmlTags(ostrm,*itRow); ostrm << ""; } ostrm << "" ; } ostrm << "]]>\n"; break; } } ostrm << "
\n"; // TODO: Other dsplay style: All elements on a one single table. Removal of duplicate text values etc... SerializeForReading( ostrm ); ostrm << "
\n"; } // PlacemarkT::Serialize }; // PlacemarkT /** The placemark name is unique wrt to the application. It might map to several PlaceMark, each having distinct coordinates. It is not really possible to sort the different locations by coordinates, because it is a list created by the object trajectory. class PlacesMapT : public std::multimap< std::string, PlacemarkT > */ class PlacesMapT : public std::multimap< std::string, PlacemarkT > { /// Written to by the main thread with lock protection, read (and emptied) /// by the sub thread which is later in charge of writing things to disk. typedef std::list< value_type > PlacemarkListT ; /// A separate queue helps for performance because the insertion in the main container /// might take time and the main thread may lose data. PlacemarkListT m_queue_to_insert ; /// This is not set when inserting at load time, but when emptying /// the queue, and when data are ready for writing to disk. mutable bool m_must_save ; public: PlacesMapT() : m_must_save(false) {} /// Finds an object with the same name and close enough. /// If an object with the same name exists but is distant, creates a new one, /// plus a path between the two. /// Called by the main thread at startup when loading the previous KML files. Then later /// called by the subthread in charge of flushing PlacemarkT to the KML file. void DirectInsert( const value_type & refVL, double merge_dist ) { /// Not needed to use equal_range because we need the last placemark matching /// this key, and this iterator is forward_iterator only. iterator it = find( refVL.first ), en = end() ; if( it == en ) { if (bMOREINFO) LOG_INFO("Cannot find '%s'", refVL.first.c_str() ); it = insert( end(), refVL ); return; } /// Searches for the last element with the same key. iterator last = it, next = it ; ++next ; while( next != en && next->first == refVL.first ) { last = next; ++next ; } double dist = last->second.distance_to( refVL.second ); /// We can reuse the last element because it is not too far from our coordinates. if( 1000 * dist < merge_dist ) { /// LOG_INFO("Reusing '%s' merge_dist=%lf", refVL.first.c_str(), dist ); /** There will be one event only if adding a new received event, otherwise several if reloading from a file. The new events will be inserted based on their timestamp. */ // last->second.insert( refVL.second.begin(), refVL.second.end() ); last->second.concatenate( refVL.second ); return ; } if (bMOREINFO) LOG_INFO("Inserted '%s' merge_dist=%lf", refVL.first.c_str(), dist ); /// The object is inserted at the end of all elements with the same key. iterator ret = insert( next, refVL ); /// Runtime check of an assumption. { iterator tst = last ; ++tst ; if( tst != ret ) { LOG_WARN("Iterators assumption is wrong (1): %s", refVL.first.c_str() ); } ++tst ; if( tst != next ) { LOG_WARN("Iterators assumption is wrong (2): %s", refVL.first.c_str() ); } } /// They must have the same style otherwise they will be in different folders. if( refVL.second.style() != last->second.style() ) { LOG_WARN("Correcting style discrepancy %s: %s != %s", refVL.first.c_str(), refVL.second.style().c_str(), last->second.style().c_str() ); ret->second.style( last->second.style() ); } } // DirectInsert /// Enqueues a new placemark for insertion by the subthread. Called by the main thread /// each time a Broadcast of a new PlacemarkT is done. void Enqueue( const std::string & kmlNam, const PlacemarkT & refPM ) { /// So we will save to a file, because something changed. m_queue_to_insert.push_back( value_type( kmlNam, refPM ) ); } /// Called by the subthread. It can merge data of placemarks with the same name /// and different positions due to a move. This has to be very fast because under lock protection. void FlushQueue(double merge_dist) { if (bMOREINFO) LOG_INFO("FlushQueue nbelts %d sz=%d", static_cast(m_queue_to_insert.size()), static_cast(size()) ); if( m_queue_to_insert.empty() ) return ; for( PlacemarkListT::iterator itPL = m_queue_to_insert.begin(), enPL = m_queue_to_insert.end(); itPL != enPL; ++ itPL ) { DirectInsert( *itPL, merge_dist ); } if (bMOREINFO) LOG_INFO("Flushed into sz=%d", static_cast(size()) ); // TODO: If lock contention problems, we might swap this list with another one owned by this // objet. This would later be merged into the container before saving data to disk. m_queue_to_insert.clear(); m_must_save = true ; } /// Removes obsolete data for one category only. void PruneKmlFile( int retention_delay ) { /// By convention, it means keeping all data. if( retention_delay <= 0 ) return ; /// Called only once per hour, instead of at every call. Saves CPU. static time_t prev_call_tm = 0 ; time_t now = time(NULL); static const int seconds_per_hour = 60 * 60 ; /// First call of this function, always do the processing. if( prev_call_tm != 0 ) { /// If this was called for less than one hour, then return. if( prev_call_tm > now - seconds_per_hour ) return ; } prev_call_tm = now ; /// Cleanup all data older than this. time_t limit_time = now - retention_delay * seconds_per_hour ; if (bMOREINFO) LOG_INFO("sz=%d retention=%d hours now=%s limit=%s", (int)size(), retention_delay, KmlTimestamp(now).c_str(), KmlTimestamp(limit_time).c_str() ); size_t nbFullErased = 0 ; size_t nbPartErased = 0 ; for( iterator itMap = begin(), nxtMap = itMap, enMap = end() ; itMap != enMap; itMap = nxtMap ) { PlacemarkT & refP = itMap->second ; ++nxtMap ; /// Erases all elements older than the limit, or the whole element. PlacemarkT::iterator itP = refP.upper_bound( limit_time ); if( itP == refP.end() ) { erase( itMap ); ++nbFullErased ; } else if( itP != refP.begin() ) { refP.erase( refP.begin(), itP ); ++nbPartErased ; } } // Maybe the container only lost data because of data expiration, so it must be saved. bool must_save_now = m_must_save || ( nbFullErased > 0 ) || ( nbPartErased > 0 ) ; if (bMOREINFO) LOG_INFO("Sz=%d FullyErased=%d PartialErased=%d m_must_save=%d must_save_now=%d", (int)size(), (int)nbFullErased, (int)nbPartErased, m_must_save, must_save_now ); m_must_save = must_save_now ; } /// This is not efficient because we reopen the file at each access, but it ensures /// that the file is consistent and accessible at any moment. bool RewriteKmlFileOneCategory( const std::string & category, const std::string & kmlFilNam, int balloon_style ) const { // Normally, it is stable when we insert an element with a duplicate key. typedef std::multiset< PlacesMapT::const_iterator, PlacesMapIterSortT > PlacesMapItrSetT ; PlacesMapItrSetT plcMapIterSet ; /// If there is nothing to save, not needed to create a file. if( false == m_must_save ) return false ; /// For safety purpose, we do not empty the file. It might be an error. if( empty() ) { if (bMOREINFO) LOG_INFO("Should empty KML file %s. Grace period.", kmlFilNam.c_str() ); return false ; } m_must_save = false ; for( const_iterator itPlcMap = begin(), en = end(); itPlcMap != en ; ++itPlcMap ) { plcMapIterSet.insert( itPlcMap ); } int nbPlacemarks = plcMapIterSet.size(); // This file must be atomic because it is periodically read. // TODO: Checks if another process has locked the ".tmp" file. // If so , we should reread the KML file and merge our data with it. // This would allow to have several fldigi sessions simultaneously running // on the same KML files. On the other hand, it should already work if these // processes are updating different categories, which is more probable. AtomicRenamer ar( kmlFilNam ); KmlHeader(ar, category) ; // This will easily allow hierarchical folders. std::string lastStyle ; for( PlacesMapItrSetT::const_iterator itStyl = plcMapIterSet.begin(), enStyl = plcMapIterSet.end(); itStyl != enStyl; ) { ar << ""; // Hyphen: No idea why, but the string "10-meter discus buoy:W GULF 207 NM " just displays as "10-" ar << ""; StripHtmlTags( ar,(*itStyl)->second.style() ); ar << ""; // Several placemarks with the same name: A single object has moved. PlacesMapItrSetT::const_iterator itStylNext = itStyl ; for(;;) { // TODO: Objects with the same name and different coordinates must be signaled so. (*itStylNext)->second.Serialize( ar, (*itStylNext)->first, balloon_style); ++itStylNext ; if( itStylNext == enStyl ) break ; if( (*itStyl)->second.style() != (*itStylNext)->second.style() ) break ; } // Now, in the same loop, we draw the polylines between placemarks with the same name. for( PlacesMapItrSetT::const_iterator itNamBeg = itStyl, itNamLast = itNamBeg; itNamLast != itStylNext ; ) { PlacesMapItrSetT::const_iterator itNamNxt = itNamLast; ++itNamNxt ; if( ( itNamNxt == itStylNext ) || ( (*itNamNxt)->first != (*itNamLast)->first ) ) { // No point tracing a line with one point only. if( *itNamBeg != *itNamLast ) { DrawPolyline( ar, category, *itNamBeg, *itNamLast ); } itNamBeg = itNamNxt ; } itNamLast = itNamNxt ; } itStyl = itStylNext ; ar << ""; } ar << KmlFooter ; if (bMOREINFO) LOG_INFO("Saved %s: %d placemarks to %s", category.c_str(), nbPlacemarks, kmlFilNam.c_str() ); return true ; } // KmlSrvImpl::PlacesMapT::RewriteKmlFileOneCategory }; // KmlSrvImpl::PlacesMapT /// There is a very small number of categories: Synop, Navtex etc... struct PlacemarksCacheT : public std::map< std::string, PlacesMapT > { const PlacesMapT * FindCategory( const std::string & category ) const { const_iterator it = find( category ); if( it == end() ) return NULL ; return &it->second; } PlacesMapT * FindCategory( const std::string & category ) { iterator it = find( category ); if( it == end() ) it = insert( end(), value_type( category, PlacesMapT() ) ); return &it->second ; } }; /// At startup, should be reloaded from the various KML files. PlacemarksCacheT m_placemarks ; /// Used for signaling errors. void close_throw( FILE * ofil, const std::string & msg ) const { if( ofil ) fclose( ofil ); throw std::runtime_error( strformat( "%s:%s", msg.c_str(), strerror(errno) ) ); } /// This points to the specific KML file of the category. void CategoryNetworkLink( std::ostream & strm, const std::string & category ) const { strm << "\n" " " << category << "\n" " \n" " " << category << ".kml\n" " onInterval\n" " " << m_refresh_interval << "\n" " \n" "\n"; } // KmlSrvImpl::CategoryNetworkLink /// This file copy does not need to be atomic because it happens once only. void CopyStyleFileIfNotExists(void) { /// Where the installed file is stored and never moved from. Used as default. std::string namSrc = PKGDATADIR "/kml/" + namStyles ; /// The use might customize its styles file: It will not be altered. std::string namDst = m_kml_dir + namStyles ; /// Used to copy the master file to the user copy if needed. FILE * filSrc = NULL; FILE * filDst = fl_fopen( namDst.c_str(), "r" ); /// If the file is there, leave as it is because it is maybe customize. if( filDst ) { if (bMOREINFO) LOG_INFO("Style file %s not altered", namDst.c_str() ); goto close_and_quit ; } filDst = fl_fopen( namDst.c_str(), "w" ); if( filDst == NULL ) { if (bMOREINFO) LOG_INFO("Cannot open destination style file %s", namDst.c_str() ); goto close_and_quit ; } filSrc = fl_fopen( namSrc.c_str(), "r" ); if( filSrc == NULL ) { if (bMOREINFO) LOG_INFO("Cannot open source style file %s", namSrc.c_str() ); goto close_and_quit ; } /// Transient buffer to copy the file. char buffer[BUFSIZ]; size_t n; while ((n = fread(buffer, sizeof(char), sizeof(buffer), filSrc)) > 0) { if (fwrite(buffer, sizeof(char), n, filDst) != n) { LOG_WARN("Error %s copying style file %s to %s", strerror(errno), namSrc.c_str(), namDst.c_str() ); goto close_and_quit ; } } if (bMOREINFO) LOG_INFO("Style file %s copied to %s", namSrc.c_str(), namDst.c_str() ); close_and_quit: if( filDst ) fclose(filDst); if( filSrc ) fclose(filSrc); } /// This creates a KML file with links to the categories such as Synop and Navtex. void CreateMainKmlFile(void) { // This is the file, that the user must click on. std::string baseFil = m_kml_dir + "fldigi.kml" ; if (bMOREINFO) LOG_INFO("Creating baseFil=%s", baseFil.c_str() ); /// We do not need to make this file atomic because it is read once only. AtomicRenamer ar( baseFil ); KmlHeader( ar, "Fldigi"); for( size_t i = 0; i < nb_categories; ++i ) CategoryNetworkLink( ar, categories[i] ); ar << KmlFooter ; } // TODO: Consider hierarchical categories: "Synop/buoy/Inmarsat" /// A specific name is chosen so we can later update this line. static void DrawPolyline( std::ostream & ostrm, const std::string & category, PlacesMapT::const_iterator beg, PlacesMapT::const_iterator last ) { /// The polyline gets an id based on the beginning of the path, which will never change. ostrm << "second.KmlId() << ":Path\">" "" << beg->second.KmlId() << "" "" "clampToGround1\n" "\n"; double dist = 0.0 ; int nbStops = 0 ; // "135.2, 35.4, 0. for(;;) { beg->second.WriteCooSub( ostrm ); ostrm << "\n"; if( beg == last ) break ; PlacesMapT::const_iterator next = beg ; ++next ; ++nbStops; dist += beg->second.coordinates().distance( next->second.coordinates() ); beg = next ; }; ostrm << "" "" "" << dist << " " << _("kilometers") << " in " << nbStops << " " << _("stops") << "" "" "\n"; } // DrawPolyline /// Similar to a std::ofstream but atomically updated by renaming a temp file. struct AtomicRenamer : public std::ofstream { /// Target file name. std::string m_filnam ; /// Temporary file name. Renamed to the target when closed. std::string m_filtmp ; public: /// This opens a temporary file when all the writing is done. AtomicRenamer( const std::string & filnam ) : m_filnam( filnam ) , m_filtmp( filnam + ".tmp" ) { if (bMOREINFO) LOG_INFO("AtomicRenamer opening tmp %s", filnam.c_str() ); open( m_filtmp.c_str() ); if( bad() ) { LOG_WARN("Cannot open %s", m_filtmp.c_str() ); } } /// Atomic because rename is an atomic too, and very fast if in same directory. ~AtomicRenamer() { close(); /// This is needed on Windows. int ret_rm = remove( m_filnam.c_str() ); if( ( ret_rm != 0 ) && ( errno != ENOENT ) ) { LOG_WARN("Cannot remove %s: %s", m_filnam.c_str(), strerror(errno) ); } int ret_mv = rename( m_filtmp.c_str(), m_filnam.c_str() ); if( ret_mv ) { LOG_WARN("Cannot rename %s to %s:%s", m_filtmp.c_str(), m_filnam.c_str(), strerror(errno) ); } } }; /// The KML filename associated to a category. std::string CategFile( const std::string & category ) const { return m_kml_dir + category + ".kml"; } /// Resets the files. Called from the test program and the GUI. void CreateNewKmlFile( const std::string & category ) const { // This file must be atomic because it is periodically read. AtomicRenamer ar( CategFile( category ) ); KmlHeader( ar, category); ar << KmlFooter ; } /// Template parameters should not be local types. struct PlacesMapIterSortT { // This sort iterators on placemarks, based on the style name then the placemark name. bool operator()( const PlacesMapT::const_iterator & it1, const PlacesMapT::const_iterator & it2 ) const { int res = it1->second.style().compare( it2->second.style() ); if( res == 0 ) res = it1->first.compare( it2->first ); return res < 0 ; } }; /// Various states of the KML reader. #define KMLRD_NONE 1 #define KMLRD_FOLDER 2 #define KMLRD_FOLDER_NAME 3 #define KMLRD_FOLDER_PLACEMARK 4 #define KMLRD_FOLDER_PLACEMARK_NAME 5 #define KMLRD_FOLDER_PLACEMARK_POINT 6 #define KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES 7 #define KMLRD_FOLDER_PLACEMARK_STYLEURL 8 #define KMLRD_FOLDER_PLACEMARK_SNIPPET 9 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA 10 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT 11 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT_FLDIGIITEM 12 #define KMLRD_FOLDER_PLACEMARK_UNDEFINED 13 #define KMLRD_FOLDER_UNDEFINED 14 /// Debugging purpose only. static const char * KmlRdToStr( int kmlRd ) { #define KMLRD_CASE(k) case k : return #k ; switch(kmlRd) { KMLRD_CASE(KMLRD_NONE) KMLRD_CASE(KMLRD_FOLDER) KMLRD_CASE(KMLRD_FOLDER_NAME) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_NAME) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_POINT) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_STYLEURL) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_SNIPPET) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_UNDEFINED) KMLRD_CASE(KMLRD_FOLDER_UNDEFINED) default : return "Unknown KMLRD code"; } #undef KMLRD_CASE } /// Loads a file of a previous session. The mutex should be locked at this moment. void ReloadSingleKmlFile( const std::string & category ) { std::string kmlFilNam = CategFile( category ); if (bMOREINFO) LOG_INFO("kmlFilNam=%s m_merge_dist=%lf", kmlFilNam.c_str(), m_merge_dist ); PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); FILE * filKml = fl_fopen( kmlFilNam.c_str(), "r" ); if( filKml == NULL ) { LOG_ERROR("Could not open %s. Creating one.", kmlFilNam.c_str() ); CreateNewKmlFile( category ); return ; } /// The destructor ensures the file will be closed if an exception is thrown. struct FilCloserT { FILE * m_file ; ~FilCloserT() { fclose(m_file); } } Closer = { filKml }; irr::io::IrrXMLReader * xml = irr::io::createIrrXMLReader( Closer.m_file ); if( xml == NULL ) { LOG_ERROR("Could not parse %s", kmlFilNam.c_str() ); return ; } using namespace irr::io ; int currState = KMLRD_NONE ; std::string currFolderName ; std::string currPlcmrkName ; time_t currTimestamp = 0; std::string currPlacemarkDescr ; CustomDataT currCustData ; PlacemarkT currPM; bool currIsPoint = false ; std::string avoidNode ; /// Stores the unique nodes which are misplaced. typedef std::set< std::string > UnexpectedNodesT ; UnexpectedNodesT unexpectedNodes ; // ship // 146.8,-19.2,0 // Ship:AUP06 // styles.kml#ship // 2012-09-24 12:00read()) { switch(xml->getNodeType()) { case EXN_TEXT: { if( ! avoidNode.empty() ) break ; const char * msgTxt = xml->getNodeData(); LOG_DEBUG( "getNodeData=%s currState=%s", msgTxt, KmlRdToStr(currState) ); switch(currState) { case KMLRD_FOLDER_NAME : currFolderName = msgTxt ? msgTxt : "NullFolder"; break; case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : currPM.SetCoordinates(msgTxt); break; case KMLRD_FOLDER_PLACEMARK_NAME : currPlcmrkName = msgTxt ? msgTxt : "NullPlacemarkName"; break; case KMLRD_FOLDER_PLACEMARK_SNIPPET : currPlacemarkDescr = msgTxt ? msgTxt : "NullSnippet"; break; case KMLRD_FOLDER_PLACEMARK_STYLEURL : currPM.SetStyle(msgTxt); break; default: break; } break; } case EXN_ELEMENT: { if( ! avoidNode.empty() ) break ; const char *nodeName = xml->getNodeName(); if (bMOREINFO) LOG_INFO( "getNodeName=%s currState=%s", nodeName, KmlRdToStr(currState) ); // TODO: Have a hashmap for each case. switch(currState) { case KMLRD_NONE : if (!strcmp("Folder", nodeName)) { currState = KMLRD_FOLDER ; } else { /// These tags are not meaningful for us. if( strcmp( "kml", nodeName ) && strcmp( "Document", nodeName ) && strcmp( "name", nodeName ) ) { if (bMOREINFO) LOG_INFO("Unexpected %s in document %s. currState=%s", nodeName, category.c_str(), KmlRdToStr(currState) ); } } break; case KMLRD_FOLDER : if (!strcmp("name", nodeName)) { currState = KMLRD_FOLDER_NAME ; } else if (!strcmp("Placemark", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK ; currPM.Clear(); const char * strId = xml->getAttributeValue("id"); currPM.SetKmlId( strId ); } else { avoidNode = nodeName ; currState = KMLRD_FOLDER_UNDEFINED ; if (bMOREINFO) LOG_INFO("Unexpected %s in folder %s. currState=%s", nodeName, currFolderName.c_str(), KmlRdToStr(currState) ); } break; case KMLRD_FOLDER_PLACEMARK : // There are different sorts of Placemark such as Point or LineString. if (!strcmp("Point", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT ; currIsPoint = true ; } else if (!strcmp("name", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_NAME ; } else if (!strcmp("Snippet", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_SNIPPET ; } else if (!strcmp("styleUrl", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_STYLEURL ; } else if (!strcmp("ExtendedData", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA ; } else if (!strcmp("description", nodeName)) { // We do not care about this tag, but it is always here. currState = KMLRD_FOLDER_PLACEMARK_UNDEFINED ; } else { avoidNode = nodeName ; currState = KMLRD_FOLDER_PLACEMARK_UNDEFINED ; /// At the same time, it is detected and inserted. std::pair< UnexpectedNodesT::iterator, bool > pr = unexpectedNodes.insert( nodeName ); // Other occurences of the same nodes will not be signaled. if( pr.second ) { if (bMOREINFO) LOG_INFO("Unexpected %s in placemark id=%s name=%s. currState=%s", nodeName, currPM.KmlId().c_str(), currPlcmrkName.c_str(), KmlRdToStr(currState) ); } } break; case KMLRD_FOLDER_PLACEMARK_POINT : if (!strcmp("coordinates", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES ; } else { if (bMOREINFO) LOG_INFO("Unexpected %s in coordinates. currState=%s", nodeName, KmlRdToStr(currState) ); } break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA: if (!strcmp(FLDIGI_TAG_EVT, nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT ; currTimestamp = KmlFromTimestamp( xml->getAttributeValue(FLDIGI_TIMESTAMP) ); currCustData.clear(); } else if (bMOREINFO) LOG_INFO("Unexpected %s in extended data. currState=%s", nodeName, KmlRdToStr(currState) ); break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT: // http://irrlicht.sourceforge.net/forum/viewtopic.php?t=10532 // The Parser irrXml will not call "EXN_ELEMENT_END" because the tag // has a trailing slash. Therefore we stay in the same state. // We could call irr::io::IIrrXMLReader<...>::isEmptyElement() to check that. if (!strcmp(FLDIGI_TAG_ITM, nodeName)) { assert( xml->isEmptyElement() ); const char * strKey = xml->getAttributeValue(FLDIGI_TAG_KEY); if(strKey == NULL ) { if (bMOREINFO) LOG_INFO("Null item key"); break ; } const char * strVal = xml->getAttributeValue(FLDIGI_TAG_VAL); if(strVal == NULL ) { if (bMOREINFO) LOG_INFO("Null item value"); break ; } currCustData.Push( strKey, strVal ); } else if (bMOREINFO) LOG_INFO("Unexpected %s in event. currState=%s", nodeName, KmlRdToStr(currState) ); break; default: break; } break; } case EXN_ELEMENT_END: { if( ! avoidNode.empty() ) { const char * msgTxt = xml->getNodeData(); if( avoidNode == msgTxt ) { if (bMOREINFO) LOG_INFO("Leaving forbidden element %s. currState=%s", avoidNode.c_str(), KmlRdToStr(currState) ); // We can leave the quarantine. avoidNode.clear(); } else { if (bMOREINFO) LOG_INFO("Still in forbidden element %s, leaving %s. currState=%s", avoidNode.c_str(), msgTxt, KmlRdToStr(currState) ); break ; } } // We should check that this string matches wuth the state expects, but this is much // faster to use only integers. if (bMOREINFO) LOG_INFO("End of %s currState=%s", xml->getNodeData(), KmlRdToStr(currState) ); switch(currState) { case KMLRD_FOLDER : currState = KMLRD_NONE ; break; case KMLRD_FOLDER_PLACEMARK : // Loads only "Point" placemarks. Do not load "Linestring". if( ( ! currPlcmrkName.empty() ) && currIsPoint ) { ptrMap->DirectInsert( PlacesMapT::value_type( currPlcmrkName, currPM ), m_merge_dist ); } currTimestamp = -1 ; currPlacemarkDescr.clear(); currPlcmrkName.clear(); currIsPoint = false ; currState = KMLRD_FOLDER ; break; case KMLRD_FOLDER_NAME : case KMLRD_FOLDER_UNDEFINED : currState = KMLRD_FOLDER ; break; case KMLRD_FOLDER_PLACEMARK_NAME : case KMLRD_FOLDER_PLACEMARK_POINT : case KMLRD_FOLDER_PLACEMARK_STYLEURL : case KMLRD_FOLDER_PLACEMARK_SNIPPET : case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA : case KMLRD_FOLDER_PLACEMARK_UNDEFINED : currState = KMLRD_FOLDER_PLACEMARK ; break; case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : currState = KMLRD_FOLDER_PLACEMARK_POINT ; break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT : currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA ; // TODO: As soon as possible, use std::move for performance. currPM.AppendEvent( currTimestamp, currPlacemarkDescr, currCustData ); currCustData.clear(); break; case KMLRD_NONE: break; default: LOG_ERROR("Should not happen %s", KmlRdToStr(currState)); break; } if (bMOREINFO) LOG_INFO("currState=%s", KmlRdToStr(currState) ); break; } case EXN_NONE: case EXN_COMMENT: case EXN_CDATA: case EXN_UNKNOWN: break; default: // LOG_INFO( "Default NodeType=%d", xml->getNodeType()); break; } } // And of course delete it delete xml; if (bMOREINFO) LOG_INFO("kmlFilNam=%s loaded sz=%d", kmlFilNam.c_str(), (int)ptrMap->size() ); } // KmlSrvImpl::ReloadSingleKmlFile /// Rewrites only the categories which have changed. bool RewriteKmlFileFull(void) { bool wasSaved = false ; if (bMOREINFO) LOG_INFO("nb_categories=%d", static_cast(nb_categories) ); for( size_t i = 0; i < nb_categories; ++i ) { const char * category = categories[i]; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); if( ptrMap == NULL ) { if (bMOREINFO) LOG_INFO("Category %s undefined", category ); continue; } ptrMap->PruneKmlFile( m_retention_delay ); wasSaved |= ptrMap->RewriteKmlFileOneCategory( category, CategFile( category ), m_balloon_style ); } return wasSaved ; } // KmlSrvImpl::RewriteKmlFileFull #ifdef FLDIGI_KML_CONDITION_VARIABLE /// This is signaled when geographic data is broadcasted. pthread_cond_t m_cond_queue ; #else /// This is set to true when geographic data is broadcasted. bool m_bool_queue ; /// This tells that the subthread must leave at the first opportunity. bool m_kml_must_leave; #endif pthread_mutex_t m_mutex_write ; typedef std::list< PlacemarkT > PlacemarkListT ; PlacemarkListT m_queues[ nb_categories ]; /// Called in a subthread. Woken up by a timed condition to save content to a KML file. void * ThreadFunc(void) { MilliSleep(2000); // Give time enough to load data. int r ; // This is normally the default behaviour. r = pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL ); if( r != 0 ) { LOG_ERROR("pthread_setcancelstate %s", strerror(errno) ); return NULL; } r = pthread_setcanceltype( PTHREAD_CANCEL_DEFERRED, NULL ); if( r != 0 ) { LOG_ERROR("pthread_setcanceltype %s", strerror(errno) ); return NULL; } int refresh_delay = m_refresh_interval ; // Endless loop until end of program, which cancels this subthread. for(;;) { #ifdef FLDIGI_KML_CONDITION_VARIABLE struct timespec tmp_tim; { guard_lock myGuard( &m_mutex_write ); // It does not need to be very accurate. tmp_tim.tv_sec = time(NULL) + refresh_delay; tmp_tim.tv_nsec = 0 ; //LOG_INFO("About to wait %d seconds", refresh ); r = pthread_cond_timedwait( &m_cond_queue, &m_mutex_write, &tmp_tim ); if( ( r != ETIMEDOUT ) && ( r != 0 ) ) { LOG_ERROR("pthread_cond_timedwait %s d=%d", strerror(errno), m_refresh_interval ); return (void *)"Error in pthread_cond_timed_wait"; } #else /// On the platforms where pthread_cond_timedwait has problems, everything behaves // as if there was a timeout when data is saved. refresh_delay is never changed. for( int i = 0; i < refresh_delay; ++i ) { MilliSleep( 1000 ); if( m_kml_must_leave ) { if (bMOREINFO) LOG_INFO("Exit flag detected. Leaving"); return (void *)"Exit flag detected"; } } { guard_lock myGuard( &m_mutex_write ); r = m_bool_queue ? ETIMEDOUT : 0 ; m_bool_queue = false; #endif // Except if extremely slow init, the object should be ready now: Files loaded etc... if( ! m_loaded ) { static int nb_retries = 3 ; if( nb_retries == 0 ) { static const char * error_message = "KML server could not start. Leaving"; LOG_ERROR("%s", error_message ); return (void *)error_message ; } --nb_retries ; if (bMOREINFO) LOG_INFO("KML server not ready yet. Cnt=%d. Restarting.",nb_retries); MilliSleep(1000); // Give time to load data. continue ; } // We might have missed the condition signal so a quick check will not do any harm. for( size_t i = 0; i < nb_categories; ++i ) { PlacesMapT *ptrMap = m_placemarks.FindCategory( categories[i] ); if( ptrMap == NULL ) { if (bMOREINFO) LOG_INFO("Category %s undefined", categories[i] ); continue; } // TODO: If there are contention problems, internally swap the queue // with a fresh empty one. ptrMap->FlushQueue( m_merge_dist ); } if (bMOREINFO) LOG_INFO("Releasing lock" ); } if( r == ETIMEDOUT ) { //LOG_INFO("Saving after wait=%d", refresh ); bool wasSaved = RewriteKmlFileFull(); // Maybe a user process must be created to process these KML files. if(wasSaved) { SpawnCommand(); } // Reset the interval to the initial value. refresh_delay = m_refresh_interval ; #ifdef FLDIGI_KML_CONDITION_VARIABLE } else { refresh_delay = tmp_tim.tv_sec - time(NULL); if( refresh_delay <= 0 ) refresh_delay = 1 ; //LOG_INFO("Interrupted when waiting. Restart with wait=%d", refresh ); #endif } } // Endless loop. return NULL ; } // ThreadFunc /// The C-style function called by pthread. static void * ThreadFunc( void * ptr ) { return static_cast< KmlSrvImpl *>(ptr)->ThreadFunc(); }; public: /// When setting or changing core parameters. void InitParams( const std::string & kml_command, const std::string & kml_dir, double kml_merge_distance, int kml_retention_delay, int kml_refresh_interval, int kml_balloon_style) try { /// The thread should NOT access anything at this moment. guard_lock myGuard( &m_mutex_write ); /// If the string is empty, no command is executed. m_command = kml_command; strtrim( m_command ); m_merge_dist = kml_merge_distance ; m_retention_delay = kml_retention_delay ; static const int min_refresh = 10 ; if( kml_refresh_interval < min_refresh ) { LOG_WARN("Refresh interval too small %d minimum is %d", kml_refresh_interval, min_refresh ); kml_refresh_interval = min_refresh ; } m_refresh_interval = kml_refresh_interval ; m_balloon_style = kml_balloon_style ; if (bMOREINFO) LOG_INFO("dir=%s merge_distance=%lf retention_delay=%d refresh_interval=%d balloon_style=%d", kml_dir.c_str(), kml_merge_distance, kml_retention_delay, kml_refresh_interval, kml_balloon_style ); m_kml_dir = kml_dir ; /// This enforces that the directory name always ends with a slash. if( m_kml_dir[ m_kml_dir.size() - 1 ] != '/' ) m_kml_dir += '/' ; const char * resdir = create_directory( m_kml_dir.c_str() ); if ( resdir ) { throw std::runtime_error( strformat( "Cannot create %s:%s", m_kml_dir.c_str(), resdir ) ); } CreateMainKmlFile(); CopyStyleFileIfNotExists(); } catch (const std::exception & exc) { // We assume that the calling program has no try/catch handler. LOG_ERROR("Caught exception:%s", exc.what() ); } catch (...) { LOG_ERROR("Caught unknown exception"); } virtual void ReloadKmlFiles() { /// The thread should NOT access anything at this moment. guard_lock myGuard( &m_mutex_write ); // This loads placemarks without the subthread, because it is simpler. for( size_t i = 0; i < nb_categories; ++i ) { try { ReloadSingleKmlFile( categories[i] ); } catch( const std::exception & exc ) { LOG_ERROR("Category %s. Caught %s", categories[i], exc.what() ); } } // Now the object is usable. Theoretically should be protected by a mutex. LOG_DEBUG("Object ready"); /// Even if an exception was thrown when loading the previous file, it does not /// prevent to overwrite the old files with new and clean ones. m_loaded = true ; } /// Invalid values everywhere, intentionnaly. KmlSrvImpl() : m_loaded(false) , m_pid_command(-1) , m_merge_dist(-1.0) , m_retention_delay(-1) , m_refresh_interval(-1) , m_balloon_style(0) { LOG_DEBUG("Creation"); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_init( &m_cond_queue, NULL ); #else m_bool_queue = false; m_kml_must_leave = false; #endif pthread_mutex_init( &m_mutex_write, NULL ); /// TODO: Add this thread to the other fldigi threads stored in cbq[]. if( pthread_create( &m_writer_thread, NULL, ThreadFunc, this ) ) { /// It is not urgent because this does not interact with the main thread. LOG_ERROR("pthread_create %s", strerror(errno) ); } } /** We cannot use KML updates with a local file: * "I want to know if it exists any solution to put relative paths in a * targetHref to load upload files in a directory in my computer simply * without any server running." * "Unfortunately, no, the security restrictions around prevent * this explicitly." */ /// iconNam: wmo automated fixed other dart buoy oilrig tao void Broadcast( const std::string & category, time_t evtTim, const CoordinateT::Pair & refCoo, double altitude, const std::string & kmlNam, const std::string & styleNam, const std::string & descrTxt, const CustomDataT & custDat ) { /// Hyphen: No idea why, but the string "10-meter discus buoy:W GULF 207 NM " just displays as "10-" std::string tmpKmlNam = strreplace( kmlNam, "-", " "); PlacemarkT currPM( refCoo, altitude, styleNam, tmpKmlNam ); currPM.AppendEvent( evtTim, descrTxt, custDat ); guard_lock myGuard( &m_mutex_write ); ++KmlServer::m_nb_broadcasts; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); if(ptrMap == NULL ) { LOG_ERROR("Category %s undefined", category.c_str()); } ptrMap->Enqueue( tmpKmlNam, currPM ); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_signal( &m_cond_queue ); #else m_bool_queue = true; #endif if (bMOREINFO) LOG_INFO("'%s' sz=%d time=%s nb_broad=%d m_merge_dist=%lf", descrTxt.c_str(), (int)ptrMap->size(), KmlTimestamp(evtTim).c_str(), KmlServer::m_nb_broadcasts,m_merge_dist ); } /// It flushes the content to disk. ~KmlSrvImpl() { { /// This will not be killed in the middle of the writing. if (bMOREINFO) LOG_INFO("Cancelling writer thread"); guard_lock myGuard( &m_mutex_write ); #ifdef FLDIGI_KML_CONDITION_VARIABLE if (bMOREINFO) LOG_INFO("Cancelling subthread"); int r = pthread_cancel( m_writer_thread ); if( r ) { if (bMOREINFO) LOG_ERROR("pthread_cancel %s", strerror(errno) ); return ; } #else if (bMOREINFO) LOG_INFO("Setting exit flag."); m_kml_must_leave = true ; #endif } if (bMOREINFO) LOG_INFO("Joining subthread"); void * retPtr; int r = pthread_join( m_writer_thread, &retPtr ); if( r ) { LOG_ERROR("pthread_join %s", strerror(errno) ); return ; } const char * msg = (retPtr == NULL) ? "Null" : (retPtr == PTHREAD_CANCELED) ? "Canceled thread" : static_cast(retPtr); if (bMOREINFO) LOG_INFO("Thread stopped. Message:%s", msg ); /// Here we are sure that the subthread is stopped. The subprocess is not called. RewriteKmlFileFull(); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_destroy( &m_cond_queue ); #endif pthread_mutex_destroy( &m_mutex_write ); } /// Empties the generated files. void Reset(void) { for( size_t i = 0; i < nb_categories; ++i ) { CreateNewKmlFile(categories[i]); } ResetCounter(); } /// This is called when KML files are saved, or on demand from the configuration tab. void SpawnCommand() { if( m_command.empty() ) return ; /** This stores the process id so the command is not restarted if still running. This allows to start for example Google Earth only once. But this allows also to run GPS_Babel for each new set of files, as soon as they are created. */ int is_proc_still_running = test_process( m_pid_command ); if( is_proc_still_running == -1 ) return ; if( ( m_pid_command <= 0 ) || ( is_proc_still_running == 0 ) ) { m_pid_command = fork_process( m_command.c_str() ); if (bMOREINFO) LOG_INFO("%s: Pid=%d Command=%s", __FUNCTION__, m_pid_command, m_command.c_str() ); } } }; // KmlSrvImpl /// Singleton. It must be destroyed at the end. static KmlServer * g_inst = NULL; static KmlSrvImpl * Pointer() { if( NULL == g_inst ) { g_inst = new KmlSrvImpl(); } KmlSrvImpl * p = dynamic_cast< KmlSrvImpl * >( g_inst ); if( p == NULL ) { LOG_ERROR("Null pointer"); throw std::runtime_error("KmlServer not initialised"); } return p ; } std::string KmlServer::Tm2Time( time_t tim ) { char bufTm[40]; tm tmpTm; gmtime_r( &tim, & tmpTm ); snprintf( bufTm, sizeof(bufTm), "%4d-%02d-%02d %02d:%02d", tmpTm.tm_year + 1900, tmpTm.tm_mon + 1, tmpTm.tm_mday, tmpTm.tm_hour, tmpTm.tm_min ); return bufTm; } /// Returns current time. std::string KmlServer::Tm2Time( ) { return Tm2Time( time(NULL) ); } /// One singleton for everyone. KmlServer * KmlServer::GetInstance(void) { return Pointer(); } /// This creates a process running the user command. void KmlServer::SpawnProcess() { Pointer()->SpawnCommand(); } /// Called by thr main program, clean exit. void KmlServer::Exit(void) { // We assume that the calling program has no try/catch handler. if (bMOREINFO) LOG_INFO("Exiting"); try { KmlServer * pKml = Pointer(); if( pKml ) { delete pKml; } } catch (const std::exception & exc) { LOG_ERROR("Caught exception:%s",exc.what() ); } catch (...) { LOG_ERROR("Caught unknown exception"); } } fldigi-4.1.06/src/misc/status.cxx0000644000175000017500000012764413472115773013602 00000000000000// ---------------------------------------------------------------------------- // status.cxx // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "gettext.h" #include "main.h" #include "globals.h" #include "status.h" #include "configuration.h" #include "confdialog.h" #include "fl_digi.h" #include "waterfall.h" #include "modem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "rtty.h" #include "olivia.h" #include "dominoex.h" #include "feld.h" #include "throb.h" #include "wwv.h" #include "analysis.h" #include "rigsupport.h" #include "Viewer.h" #include "lgbook.h" #include "logsupport.h" #include "qso_db.h" #include "dx_dialog.h" #include "contest.h" #include "misc.h" #include "data_io.h" #include "psm/psm.h" #include "spectrum_viewer.h" #define STATUS_FILENAME "status" status progStatus = { MODE_PSK31, // trx_mode lastmode; mode_info[MODE_PSK31].sname, // lastmode_name 50, // int mainX; 50, // int mainY; WMIN, // int mainW; HMIN, // int mainH; false, // bool WF_UI; false, // bool NO_RIGLOG; false, // bool Rig_Log_UI; false, // bool Rig_Contest_UI; false, // bool DOCKEDSCOPE; false, // bool tbar_is_docked; 50, // int RxTextHeight; WMIN/2, // int tiled_group_x; false, // bool show_channels; 50, // int rigX; 50, // int rigY; 560, // int rigW 80, // int rigH 1000, // int carrier; 14070000, // int noCATfreq; "USB", // string noCATmode; "3000", // string noCATwidth; 1, // int mag; 0, // int offset; NORMAL, // WFdisp::WFspeed -20, // reflevel -70, // ampspan 30, // uint VIEWERnchars 50, // uint VIEWERxpos 50, // uint VIEWERypos 200, // uint VIEWERwidth 400, // uint VIEDWERheight 3.0, // double VIEWER_psksquelch -6.0, // double VIEWER_rttysquelch 3.0, // double VIEWER_cwsquelch false, // bool VIEWERvisible 50, // unsigned int fsqMONITORxpos; 50, // unsigned int fsqMONITORypos; 600, // unsigned int fsqMONITORwidth; 400, // unsigned int fsqMONITORheight; 100, // int tile_x 200, // int tile_w; 90, // int tile_y; 150, // int tile_h; 0.5, // double tile_y_ratio; 0.5, // double fsq_ratio; 0.5, // double ifkp_ratio; false, // bool LOGenabled 5.0, // double sldrSquelchValue 5.0, // double sldrPwrSquelchValue true, // bool afconoff true, // bool sqlonoff 50, // int scopeX; 50, // int scopeY; false, // bool scopeVisible; 172, // int scopeW; 172, // int scopeH; 10, // int svX; 10, // int svY; 550, // int svW; 400, // int svH; false, // bool x_graticule; false, // bool y_graticule; true, // bool xy_graticule; -1, // int repeatMacro; 0, // float repeatIdleTime; 0, // int timer 0, // int timerMacro "macros.mdf", // string LastMacroFile; 0, // int n_rsids false, // bool spot_recv false, // bool spot_log false, // bool contest false, // bool quick_entry true, // bool rx_scroll_hints; true, // bool rx_word_wrap true, // bool tx_word_wrap false, // bool cluster_connected; // not saved 50, // int logbook_x; 50, // int logbook_y; 590, // int logbook_w; 490, // int logbook_h; false, // bool logbook_reverse; 85, // int logbook_browser_col_0; 47, // int logbook_browser_col_1; 100, // int logbook_browser_col_2; 110, // int logbook_browser_col_3; 120, // int logbook_browser_col_4; 103, // int logbook_browser_col_5; 50, // int dxdialog_x; 50, // int dxdialog_y; 625, // int dxdialog_w; 395, // int dxdialog_h; progdefaults.contestiatones, progdefaults.contestiabw, progdefaults.contestiasmargin, progdefaults.contestiasinteg, progdefaults.contestia8bit, progdefaults.oliviatones, progdefaults.oliviabw, progdefaults.oliviasmargin, progdefaults.oliviasinteg, progdefaults.olivia8bit, progdefaults.rtty_shift, progdefaults.rtty_custom_shift, progdefaults.rtty_baud, progdefaults.rtty_bits, progdefaults.rtty_parity, progdefaults.rtty_stop, progdefaults.rtty_reverse, progdefaults.rtty_crcrlf, progdefaults.rtty_autocrlf, progdefaults.rtty_autocount, progdefaults.rtty_afcspeed, false, // bool rtty_filter_changed progdefaults.useFSKkeyline, progdefaults.useFSKkeylineDTR, progdefaults.FSKisLSB, progdefaults.useUART, progdefaults.PreferXhairScope, progdefaults.PseudoFSK, true, // bool shaped_rtty progdefaults.UOSrx, progdefaults.UOStx, DEFAULT_XMLPRC_IP_ADDRESS, DEFAULT_XMLRPC_IP_PORT, DEFAULT_ARQ_IP_ADDRESS, DEFAULT_ARQ_IP_PORT, DEFAULT_KISS_IP_ADDRESS, DEFAULT_KISS_IP_IO_PORT, DEFAULT_KISS_IP_OUT_PORT, progdefaults.kiss_dual_port_enabled, progdefaults.data_io_enabled, progdefaults.ax25_decode_enabled, progdefaults.enableBusyChannel, progdefaults.busyChannelSeconds, progdefaults.kpsql_attenuation, progdefaults.csma_enabled, progdefaults.kiss_tcp_io, progdefaults.kiss_tcp_listen, progdefaults.kpsql_enabled, progdefaults.csma_persistance, progdefaults.csma_slot_time, progdefaults.csma_transmit_delay, progdefaults.psm_flush_buffer_timeout, progdefaults.psm_minimum_bandwidth, progdefaults.psm_minimum_bandwidth_margin, progdefaults.psm_use_histogram, progdefaults.psm_histogram_offset_threshold, progdefaults.psm_hit_time_window, progdefaults.tx_buffer_timeout, progdefaults.kiss_io_modem_change_inhibit, true, 0.0, progdefaults.psk8DCDShortFlag, "CQ", // string browser_search; false, // meters false, // fsq_rx_abort false, // ifkp_rx_abort //---------------------------------------------------------------------- // winkeyer status values //---------------------------------------------------------------------- "NONE", // string WK_serial_port_name; 1200, // int WK_comm_baudrate; 2, // int WK_stopbits; 2, // int WK_comm_retries; 5, // int WK_comm_wait; 50, // int WK_comm_timeout; false, // bool WK_comm_echo; // wkeyer defaults 0xC4, // unsigned char WK_mode_register; 18, // unsigned char WK_speed_wpm; 6, // unsigned char WK_sidetone; 50, // unsigned char WK_weight; 0, // unsigned char WK_lead_in_time; 0, // unsigned char WK_tail_time; 10, // unsigned char WK_min_wpm; 25, // unsigned char WK_max_wpm; 0, // unsigned char WK_first_extension; 0, // unsigned char WK_key_compensation; 0, // unsigned char WK_farnsworth_wpm; 50, // unsigned char WK_paddle_setpoint; 50, // unsigned char WK_dit_dah_ratio; 7, // unsigned char WK_pin_configuration; 255, // unsigned char WK_dont_care; false, // bool WK_cut_zeronine; 18, // unsigned char WK_cmd_wpm; false, // bool WK_use_pot false, // bool WK_online; 2, // int WK_version; 0, // int WKFSK_mode; 0, // int WKFSK_baud; 0, // int WKFSK_stopbits; 0, // int WKFSK_ptt; 0, // int WKFSK_polarity; 0, // int WKFSK_sidetone; 0, // int WKFSK_auto_crlf; 0, // int WKFSK_diddle; 0, // int WKFSK_diddle_char; 0, // int WKFSK_usos; 1, // int WKFSK_monitor; false, // bool Nav_online; false, // bool Nav_config_online; false, // bool nanoCW_online; false, // bool nanoFSK_online; //---------------------------------------------------------------------- false // bool bLastStateRead; }; void status::saveLastState() { int mX = fl_digi_main->x(); int mY = fl_digi_main->y(); if (mX >= 0 && mX >= 0) { mainX = mX; mainY = mY; } mainW = fl_digi_main->w(); mainH = fl_digi_main->h(); carrier = wf->Carrier(); mag = wf->Mag(); offset = wf->Offset(); speed = wf->Speed(); reflevel = progdefaults.wfRefLevel; ampspan = progdefaults.wfAmpSpan; logbook_x = dlgLogbook->x(); logbook_y = dlgLogbook->y(); logbook_w = dlgLogbook->w(); logbook_h = dlgLogbook->h(); logbook_reverse = cQsoDb::reverse; logbook_col_0 = wBrowser->columnWidth(0); logbook_col_1 = wBrowser->columnWidth(1); logbook_col_2 = wBrowser->columnWidth(2); logbook_col_3 = wBrowser->columnWidth(3); logbook_col_4 = wBrowser->columnWidth(4); logbook_col_5 = wBrowser->columnWidth(5); dxdialog_x = dxcluster_viewer->x(); dxdialog_y = dxcluster_viewer->y(); dxdialog_w = dxcluster_viewer->w(); dxdialog_h = dxcluster_viewer->h(); if (!bWF_only) { RxTextHeight = (ReceiveText->h() * 100) / text_panel->h();//VTgroup->h(); quick_entry = ReceiveText->get_quick_entry(); rx_scroll_hints = ReceiveText->get_scroll_hints(); rx_word_wrap = ReceiveText->get_word_wrap(); tx_word_wrap = TransmitText->get_word_wrap(); tile_w = text_panel->w(); tile_y = progdefaults.rxtx_swap ? TransmitText->h() : ReceiveText->h(); tile_h = text_panel->h(); tile_y_ratio = 1.0 * tile_y / text_group->h(); if (text_panel->w() != ReceiveText->w()) tile_x = mvgroup->w(); fsq_ratio = 1.0 * fsq_rx_text->h() / fsq_group->h(); ifkp_ratio = 1.0 * ifkp_rx_text->h() / ifkp_group->h(); } VIEWERvisible = dlgViewer->visible(); VIEWERnchars = brwsViewer->numchars(); if (VIEWERvisible) { VIEWERxpos = dlgViewer->x(); VIEWERypos = dlgViewer->y(); VIEWERwidth = dlgViewer->w(); VIEWERheight = dlgViewer->h(); } scopeVisible = scopeview->visible(); scopeX = scopeview->x(); scopeY = scopeview->y(); scopeW = scopeview->w(); scopeH = scopeview->h(); if (spectrum_viewer) { svX = spectrum_viewer->x(); svY = spectrum_viewer->y(); svW = spectrum_viewer->w(); svH = spectrum_viewer->h(); } contestiatones = progdefaults.contestiatones; contestiabw = progdefaults.contestiabw; contestiamargin = progdefaults.contestiasmargin; contestiainteg = progdefaults.contestiasinteg; contestia8bit = progdefaults.contestia8bit; oliviatones = progdefaults.oliviatones; oliviabw = progdefaults.oliviabw; oliviamargin = progdefaults.oliviasmargin; oliviainteg = progdefaults.oliviasinteg; olivia8bit = progdefaults.olivia8bit; rtty_shift = progdefaults.rtty_shift; rtty_custom_shift = progdefaults.rtty_custom_shift; rtty_baud = progdefaults.rtty_baud; rtty_bits = progdefaults.rtty_bits; rtty_parity = progdefaults.rtty_parity; rtty_stop = progdefaults.rtty_stop; rtty_reverse = progdefaults.rtty_reverse; rtty_crcrlf = progdefaults.rtty_crcrlf; rtty_autocrlf = progdefaults.rtty_autocrlf; rtty_autocount = progdefaults.rtty_autocount; rtty_afcspeed = progdefaults.rtty_afcspeed; useFSKkeyline = progdefaults.useFSKkeyline; useFSKkeylineDTR = progdefaults.useFSKkeylineDTR; FSKisLSB = progdefaults.FSKisLSB; useUART = progdefaults.useUART; PreferXhairScope = progdefaults.PreferXhairScope; PseudoFSK = progdefaults.PseudoFSK; UOSrx = progdefaults.UOSrx; UOStx = progdefaults.UOStx; xmlrpc_address = progdefaults.xmlrpc_address; xmlrpc_port = progdefaults.xmlrpc_port; arq_address = progdefaults.arq_address; arq_port = progdefaults.arq_port; kiss_address = progdefaults.kiss_address; kiss_io_port = progdefaults.kiss_io_port; kiss_out_port = progdefaults.kiss_out_port; kiss_dual_port_enabled = progdefaults.kiss_dual_port_enabled; data_io_enabled = progdefaults.data_io_enabled; ax25_decode_enabled = progdefaults.ax25_decode_enabled; enableBusyChannel = progdefaults.enableBusyChannel; busyChannelSeconds = progdefaults.busyChannelSeconds; kpsql_attenuation = progdefaults.kpsql_attenuation; csma_enabled = progdefaults.csma_enabled; kiss_tcp_io = progdefaults.kiss_tcp_io; kiss_tcp_listen = progdefaults.kiss_tcp_listen; kpsql_enabled = progdefaults.kpsql_enabled; csma_persistance = progdefaults.csma_persistance; csma_slot_time = progdefaults.csma_slot_time; csma_transmit_delay = progdefaults.csma_transmit_delay; psm_flush_buffer_timeout = progdefaults.psm_flush_buffer_timeout; psm_minimum_bandwidth = progdefaults.psm_minimum_bandwidth; psm_minimum_bandwidth_margin = progdefaults.psm_minimum_bandwidth_margin; psm_use_histogram = progdefaults.psm_use_histogram; psm_histogram_offset_threshold = progdefaults.psm_histogram_offset_threshold; psm_hit_time_window = progdefaults.psm_hit_time_window; tx_buffer_timeout = progdefaults.tx_buffer_timeout; kiss_io_modem_change_inhibit = progdefaults.kiss_io_modem_change_inhibit; squelch_value = 0; Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME); spref.set("version", PACKAGE_VERSION); spref.set("dual_channels", "YES"); spref.set("mode_name", mode_info[lastmode].sname); spref.set("squelch_enabled", sqlonoff); spref.set("squelch_level", sldrSquelchValue); spref.set("pwr_squelch_level", sldrPwrSquelchValue); spref.set("afc_enabled", afconoff); spref.set("psk8DCDShortFlag", psk8DCDShortFlag); spref.set("log_enabled", LOGenabled); spref.set("wf_carrier", carrier); spref.set("wf_mag", mag); spref.set("wf_offset", offset); spref.set("wf_speed", speed); spref.set("wf_reflevel", reflevel); spref.set("wf_ampspan", ampspan); spref.set("noCATfreq", noCATfreq); spref.set("noCATmode", noCATmode.c_str()); spref.set("noCATwidth", noCATwidth.c_str()); spref.set("main_x", mainX); spref.set("main_y", mainY); spref.set("main_w", mainW); if (!bWF_only) { spref.set("main_h", mainH); spref.set("rx_text_height", RxTextHeight); spref.set("tiled_group_x", tiled_group_x); spref.set("show_channels", show_channels); } spref.set("wf_ui", WF_UI); spref.set("riglog_ui", Rig_Log_UI); spref.set("rigcontest_ui", Rig_Contest_UI); spref.set("noriglog", NO_RIGLOG); spref.set("docked_scope", DOCKEDSCOPE); spref.set("tbar_is_docked", tbar_is_docked); spref.set("rigctl_x", rigX); spref.set("rigctl_y", rigY); spref.set("rigctl_w", rigW); spref.set("rigctl_h", rigH); spref.set("viewer_visible", VIEWERvisible); spref.set("viewer_x", static_cast(VIEWERxpos)); spref.set("viewer_y", static_cast(VIEWERypos)); spref.set("viewer_w", static_cast(VIEWERwidth)); spref.set("viewer_h", static_cast(VIEWERheight)); spref.set("viewer_psksq", VIEWER_psksquelch); spref.set("viewer_rttysq", VIEWER_rttysquelch); spref.set("viewer_cwsq", VIEWER_cwsquelch); spref.set("viewer_nchars", static_cast(VIEWERnchars)); spref.set("fsq_monitor_x", static_cast(fsqMONITORxpos)); spref.set("fsq_monitor_y", static_cast(fsqMONITORypos)); spref.set("fsq_monitor_w", static_cast(fsqMONITORwidth)); spref.set("fsq_monitor_h", static_cast(fsqMONITORheight)); spref.set("tile_x", tile_x); spref.set("tile_y", tile_y); spref.set("tile_w", tile_w); spref.set("tile_h", tile_h); spref.set("tile_y_ratio", tile_y_ratio); spref.set("fsq_ratio", fsq_ratio); spref.set("ifkp_ratio", ifkp_ratio); spref.set("scope_visible", scopeVisible); spref.set("scope_x", scopeX); spref.set("scope_y", scopeY); spref.set("scope_w", scopeW); spref.set("scope_h", scopeH); spref.set("svX", svX); spref.set("svY", svY); spref.set("svW", svW); spref.set("svH", svH); spref.set("x_graticule", x_graticule); spref.set("y_graticule", y_graticule); spref.set("xy_graticule", xy_graticule); spref.set("last_macro_file", LastMacroFile.c_str()); spref.set("spot_recv", spot_recv); spref.set("spot_log", spot_recv); spref.set("contest", contest); spref.set("quick_entry", quick_entry); spref.set("rx_scroll_hints", rx_scroll_hints); spref.set("rx_word_wrap", rx_word_wrap); spref.set("tx_word_wrap", tx_word_wrap); spref.set("logbook_x", logbook_x); spref.set("logbook_y", logbook_y); spref.set("logbook_w", logbook_w); spref.set("logbook_h", logbook_h); spref.set("logbook_reverse", logbook_reverse); spref.set("logbook_col_0", logbook_col_0); spref.set("logbook_col_1", logbook_col_1); spref.set("logbook_col_2", logbook_col_2); spref.set("logbook_col_3", logbook_col_3); spref.set("logbook_col_4", logbook_col_4); spref.set("logbook_col_5", logbook_col_5); spref.set("dxdialog_x", dxdialog_x); spref.set("dxdialog_y", dxdialog_y); spref.set("dxdialog_w", dxdialog_w); spref.set("dxdialog_h", dxdialog_h); spref.set("contestiatones", contestiatones); spref.set("contestiabw", contestiabw); spref.set("contestiamargin", contestiamargin); spref.set("contestiainteg", contestiainteg); spref.set("contestia8bit", contestia8bit); spref.set("oliviaiatones", oliviatones); spref.set("oliviaiabw", oliviabw); spref.set("oliviaiamargin", oliviamargin); spref.set("oliviaiainteg", oliviainteg); spref.set("oliviaia8bit", olivia8bit); spref.set("rtty_shift", rtty_shift); spref.set("rtty_custom_shift", rtty_custom_shift); spref.set("rtty_baud", rtty_baud); spref.set("rtty_bits", rtty_bits); spref.set("rtty_parity", rtty_parity); spref.set("rtty_stop", rtty_stop); spref.set("rtty_reverse", rtty_reverse); spref.set("rtty_crcrlf", rtty_crcrlf); spref.set("rtty_autocrlf", rtty_autocrlf); spref.set("rtty_autocount", rtty_autocount); spref.set("rtty_afcspeed", rtty_afcspeed); spref.set("rtty_useFSKkeyline", useFSKkeyline); spref.set("rtty_useFSK_DTR", useFSKkeylineDTR); spref.set("rtty_FSKisLSB", FSKisLSB); spref.set("rtty_useUART", useUART); spref.set("preferxhairscope", PreferXhairScope); spref.set("psaudofsk", PseudoFSK); spref.set("shaped_rtty", shaped_rtty); spref.set("uosrx", UOSrx); spref.set("uostx", UOStx); if(!xmlrpc_address_override_flag) { spref.set("xmlrpc_address", xmlrpc_address.c_str()); spref.set("xmlrpc_port", xmlrpc_port.c_str()); } if(!arq_address_override_flag) { spref.set("arq_address", arq_address.c_str()); spref.set("arq_port", arq_port.c_str()); } if(!kiss_address_override_flag) { spref.set("kiss_address", kiss_address.c_str()); spref.set("kiss_io_port", kiss_io_port.c_str()); spref.set("kiss_out_port", kiss_out_port.c_str()); spref.set("kiss_dual_port_enabled", kiss_dual_port_enabled); } if(!override_data_io_enabled) spref.set("data_io_enabled", data_io_enabled); spref.set("ax25_decode_enabled", ax25_decode_enabled); spref.set("enableBusyChannel", enableBusyChannel); spref.set("busyChannelSeconds", busyChannelSeconds); spref.set("kpsql_attenuation", kpsql_attenuation); spref.set("csma_enabled", csma_enabled); spref.set("kiss_tcp_io", kiss_tcp_io); spref.set("kiss_tcp_listen", kiss_tcp_listen); spref.set("kpsql_enabled", kpsql_enabled); spref.set("csma_persistance", csma_persistance); spref.set("csma_slot_time", csma_slot_time); spref.set("csma_transmit_delay", csma_transmit_delay); spref.set("psm_flush_buffer_timeout", psm_flush_buffer_timeout); spref.set("psm_minimum_bandwidth", psm_minimum_bandwidth); spref.set("psm_minimum_bandwidth_margin", psm_minimum_bandwidth_margin); spref.set("psm_use_histogram", psm_use_histogram); spref.set("psm_histogram_offset_threshold", psm_histogram_offset_threshold); spref.set("psm_hit_time_window", psm_hit_time_window); spref.set("tx_buffer_timeout", tx_buffer_timeout); spref.set("kiss_io_modem_change_inhibit", kiss_io_modem_change_inhibit); spref.set("browser_search", browser_search.c_str()); spref.set("meters", meters); //---------------------------------------------------------------------- // WinKeyer prefs set spref.set("WK_serial_port_name", WK_serial_port_name.c_str()); spref.set("WK_mode_register", WK_mode_register); spref.set("WK_speed_wpm", WK_speed_wpm); spref.set("WK_cut_zeronine", WK_cut_zeronine); spref.set("WK_cmd_wpm", WK_cmd_wpm); spref.set("WK_sidetone", WK_sidetone); spref.set("WK_weight", WK_weight); spref.set("WK_lead_in_time", WK_lead_in_time); spref.set("WK_tail_time", WK_tail_time); spref.set("WK_min_wpm", WK_min_wpm); spref.set("WK_rng_wpm", WK_rng_wpm); spref.set("WK_1st_ext", WK_first_extension); spref.set("WK_key_comp", WK_key_compensation); spref.set("WK_farnsworth", WK_farnsworth_wpm); spref.set("WK_paddle_set", WK_paddle_setpoint); spref.set("WK_dit_dah_ratio", WK_dit_dah_ratio); spref.set("WK_pin_config", WK_pin_configuration); spref.set("WK_use_pot", WK_use_pot); spref.set("WK_online", WK_online); spref.set("WK_version", WK_version); spref.set("WKFSK_mode", WKFSK_mode); spref.set("WKFSK_baud", WKFSK_baud); spref.set("WKFSK_stopbits", WKFSK_stopbits); spref.set("WKFSK_ptt", WKFSK_ptt); spref.set("WKFSK_polarity", WKFSK_polarity); spref.set("WKFSK_sidetone", WKFSK_sidetone); spref.set("WKFSK_auto_crlf", WKFSK_auto_crlf); spref.set("WKFSK_diddle", WKFSK_diddle); spref.set("WKFSK_diddle_char", WKFSK_diddle_char); spref.set("WKFSK_usos", WKFSK_usos); spref.set("WKFSK_monitor", WKFSK_monitor); spref.set("Nav_online", Nav_online); spref.set("Nav_config_online", Nav_config_online); spref.set("nanoCW_online", nanoCW_online); spref.set("nanoFSK_online", nanoFSK_online); } void status::loadLastState() { Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME); int i; char strbuff[1000]; char version[64]; version[sizeof(version)-1] = '\0'; // Skip loading the rest of the status variables if we didn't read a // version name/value pair; or this is not a file that supports dual // channel browsers. bLastStateRead = spref.get("version", version, "", sizeof(version)-1); if (!bLastStateRead) return; bLastStateRead = spref.get("dual_channels", version, "", sizeof(version) - 1); if (!bLastStateRead) return; memset(strbuff, 0, sizeof(strbuff)); spref.get("mode_name", strbuff, mode_info[MODE_PSK31].sname, sizeof(strbuff) - 1); mode_name = strbuff; lastmode = MODE_PSK31; for (i = 0; i < NUM_MODES;i++) { if (mode_name == mode_info[i].sname) { lastmode = (trx_mode) i; break; } } spref.get("squelch_enabled", i, sqlonoff); sqlonoff = i; spref.get("squelch_level", i, sldrSquelchValue); sldrSquelchValue = i; spref.get("pwr_squelch_level", i, sldrPwrSquelchValue); sldrPwrSquelchValue = i; spref.get("afc_enabled", i, afconoff); afconoff = i; spref.get("rx_text_height", RxTextHeight, RxTextHeight); spref.get("tiled_group_x", tiled_group_x, tiled_group_x); spref.get("show_channels", i, show_channels); show_channels = i; spref.get("log_enabled", i, LOGenabled); LOGenabled = i; spref.get("wf_carrier", carrier, carrier); spref.get("wf_mag", mag, mag); spref.get("wf_offset", offset, offset); spref.get("wf_speed", speed, speed); spref.get("wf_reflevel", reflevel, reflevel); progdefaults.wfRefLevel = reflevel; spref.get("wf_ampspan", ampspan, ampspan); progdefaults.wfAmpSpan = ampspan; spref.get("noCATfreq", noCATfreq, noCATfreq); memset(strbuff, 0, sizeof(strbuff)); spref.get("noCATmode", strbuff, "USB", sizeof(strbuff) - 1); noCATmode = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("noCATwidth", strbuff, "3000", sizeof(strbuff) - 1); noCATwidth = strbuff; spref.get("main_x", mainX, mainX); if (mainX > Fl::w()) mainX = 0; spref.get("main_y", mainY, mainY); if (mainY > Fl::h()) mainY = 0; spref.get("main_w", mainW, mainW); if (mainW < WMIN) mainW = WMIN; if (mainW > Fl::w()) mainW = Fl::w(); spref.get("main_h", mainH, mainH); // if (mainH < HMIN) mainH = HMIN; if (mainH > Fl::w()) mainH = Fl::h(); spref.get("wf_ui", i, WF_UI); WF_UI = i; spref.get("riglog_ui", i, Rig_Log_UI); Rig_Log_UI = i; spref.get("rigcontest_ui", i, Rig_Contest_UI); Rig_Contest_UI = i; spref.get("noriglog", i, NO_RIGLOG); NO_RIGLOG = i; spref.get("docked_scope", i, DOCKEDSCOPE); DOCKEDSCOPE = i; spref.get("tbar_is_docked", i, tbar_is_docked); tbar_is_docked = i; spref.get("rigctl_x", rigX, rigX); spref.get("rigctl_y", rigY, rigY); spref.get("rigctl_w", rigW, rigW); spref.get("rigctl_h", rigH, rigH); spref.get("viewer_visible", i, VIEWERvisible); VIEWERvisible = i; spref.get("viewer_x", i, VIEWERxpos); VIEWERxpos = i; spref.get("viewer_y", i, VIEWERypos); VIEWERypos = i; spref.get("viewer_w", i, VIEWERwidth); VIEWERwidth = i; spref.get("viewer_h", i, VIEWERheight); VIEWERheight = i; spref.get("viewer_psksq", VIEWER_psksquelch, VIEWER_psksquelch); spref.get("viewer_rttysq", VIEWER_rttysquelch, VIEWER_rttysquelch); spref.get("viewer_cwsq", VIEWER_cwsquelch, VIEWER_cwsquelch); spref.get("viewer_nchars", i, VIEWERnchars); VIEWERnchars = i; spref.get("fsq_monitor_x", i, fsqMONITORxpos); fsqMONITORxpos = i; spref.get("fsq_monitor_y", i, fsqMONITORypos); fsqMONITORypos = i; spref.get("fsq_monitor_w", i, fsqMONITORwidth); fsqMONITORwidth = i; spref.get("fsq_monitor_h", i, fsqMONITORheight); fsqMONITORheight = i; spref.get("tile_x", tile_x, tile_x); spref.get("tile_y", tile_y, tile_y); spref.get("tile_w", tile_w, tile_w); spref.get("tile_h", tile_h, tile_h); spref.get("tile_y_ratio", tile_y_ratio, tile_y_ratio); spref.get("fsq_ratio", fsq_ratio, fsq_ratio); spref.get("ifkp_ratio", ifkp_ratio, ifkp_ratio); spref.get("scope_visible", i, scopeVisible); scopeVisible = i; spref.get("scope_x", scopeX, scopeX); spref.get("scope_y", scopeY, scopeY); spref.get("scope_w", scopeW, scopeW); spref.get("scope_h", scopeH, scopeH); spref.get("svX", svX, svX); spref.get("svY", svY, svY); spref.get("svW", svW, svW); spref.get("svH", svH, svH); spref.get("x_graticule", i, x_graticule); x_graticule = i; spref.get("y_graticule", i, y_graticule); y_graticule = i; spref.get("xy_graticule",i, xy_graticule); xy_graticule = i; memset(strbuff, 0, sizeof(strbuff)); spref.get("last_macro_file", strbuff, "macros.mdf", sizeof(strbuff) - 1); LastMacroFile = strbuff; spref.get("spot_recv", i, spot_recv); spot_recv = i; spref.get("spot_log", i, spot_log); spot_log = i; spref.get("contest", i, contest); contest = i; spref.get("quick_entry", i, quick_entry); quick_entry = i; spref.get("rx_scroll_hints", i, rx_scroll_hints); rx_scroll_hints = i; spref.get("rx_word_wrap", i, rx_word_wrap); rx_word_wrap = i; spref.get("tx_word_wrap", i, tx_word_wrap); tx_word_wrap = i; spref.get("logbook_x", logbook_x, logbook_x); spref.get("logbook_y", logbook_y, logbook_y); spref.get("logbook_w", logbook_w, logbook_w); spref.get("logbook_h", logbook_h, logbook_h); spref.get("logbook_reverse", i, logbook_reverse); logbook_reverse = i; spref.get("logbook_col_0", logbook_col_0, logbook_col_0); spref.get("logbook_col_1", logbook_col_1, logbook_col_1); spref.get("logbook_col_2", logbook_col_2, logbook_col_2); spref.get("logbook_col_3", logbook_col_3, logbook_col_3); spref.get("logbook_col_4", logbook_col_4, logbook_col_4); spref.get("logbook_col_5", logbook_col_5, logbook_col_5); spref.get("dxdialog_x", dxdialog_x, dxdialog_x); spref.get("dxdialog_y", dxdialog_y, dxdialog_y); spref.get("dxdialog_w", dxdialog_w, dxdialog_w); spref.get("dxdialog_h", dxdialog_h, dxdialog_h); spref.get("contestiatones", contestiatones, contestiatones); spref.get("contestiabw", contestiabw, contestiabw); spref.get("contestiamargin", contestiamargin, contestiamargin); spref.get("contestiainteg", contestiainteg, contestiainteg); spref.get("contestia8bit", i, contestia8bit); contestia8bit = i; spref.get("oliviaiatones", oliviatones, oliviatones); spref.get("oliviaiabw", oliviabw, oliviabw); spref.get("oliviaiamargin", oliviamargin, oliviamargin); spref.get("oliviaiainteg", oliviainteg, oliviainteg); spref.get("oliviaia8bit", i, olivia8bit); olivia8bit = i; spref.get("rtty_shift", rtty_shift, rtty_shift); spref.get("rtty_custom_shift", rtty_custom_shift, rtty_custom_shift); spref.get("rtty_baud", rtty_baud, rtty_baud); spref.get("rtty_bits", rtty_bits, rtty_bits); spref.get("rtty_parity", rtty_parity, rtty_parity); spref.get("rtty_stop", rtty_stop, rtty_stop); spref.get("rtty_reverse", i, rtty_reverse); rtty_reverse = i; spref.get("rtty_crcrlf", i, rtty_crcrlf); rtty_crcrlf = i; spref.get("rtty_autocrlf", i, rtty_autocrlf); rtty_autocrlf = i; spref.get("rtty_autocount", rtty_autocount, rtty_autocount); spref.get("rtty_afcspeed", rtty_afcspeed, rtty_afcspeed); spref.get("rtty_useFSKkeyline", i, useFSKkeyline); useFSKkeyline = i; spref.get("rtty_useFSK_DTR", i, useFSKkeylineDTR); useFSKkeylineDTR = i; spref.get("rtty_FSKisLSB", i, FSKisLSB); FSKisLSB = i; spref.get("rtty_useUART", i, useUART); useUART = i; spref.get("preferxhairscope", i, PreferXhairScope); PreferXhairScope = i; spref.get("psaudofsk", i, PseudoFSK); PseudoFSK = i; spref.get("shaped_rtty", i, shaped_rtty); shaped_rtty = i; spref.get("uosrx", i, UOSrx); UOSrx = i; spref.get("uostx", i, UOStx); UOStx = i; if(!xmlrpc_address_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("xmlrpc_address", strbuff, xmlrpc_address.c_str(), sizeof(strbuff) - 1); xmlrpc_address = strbuff; } if (!xmlrpc_port_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("xmlrpc_port", strbuff, xmlrpc_port.c_str(), sizeof(strbuff) - 1); xmlrpc_port = strbuff; } if(!arq_address_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("arq_address", strbuff, arq_address.c_str(), sizeof(strbuff) - 1); arq_address = strbuff; } if(!arq_port_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("arq_port", strbuff, arq_port.c_str(), sizeof(strbuff) - 1); arq_port = strbuff; } if(!kiss_address_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("kiss_address", strbuff, kiss_address.c_str(), sizeof(strbuff) - 1); kiss_address = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("kiss_io_port", strbuff, kiss_io_port.c_str(), sizeof(strbuff) - 1); kiss_io_port = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("kiss_out_port", strbuff, kiss_out_port.c_str(), sizeof(strbuff) - 1); kiss_out_port = strbuff; spref.get("kiss_dual_port_enabled", i, kiss_dual_port_enabled); kiss_dual_port_enabled = i; } if(!override_data_io_enabled) { spref.get("data_io_enabled", i, data_io_enabled); data_io_enabled = i; } spref.get("ax25_decode_enabled", i, ax25_decode_enabled); ax25_decode_enabled = i; spref.get("enableBusyChannel", i, enableBusyChannel); enableBusyChannel = i; spref.get("busyChannelSeconds", i, busyChannelSeconds); busyChannelSeconds = i; spref.get("kpsql_attenuation", i, kpsql_attenuation); kpsql_attenuation = i; spref.get("csma_enabled", i, csma_enabled); csma_enabled = i; spref.get("kiss_tcp_io", i, kiss_tcp_io); kiss_tcp_io = i; spref.get("kiss_tcp_listen", i, kiss_tcp_listen); kiss_tcp_listen = i; spref.get("kpsql_enabled", i, kpsql_enabled); kpsql_enabled = i; spref.get("csma_persistance", i, csma_persistance); csma_persistance = i; spref.get("csma_slot_time", i, csma_slot_time); csma_slot_time = i; spref.get("csma_transmit_delay", i, csma_transmit_delay); csma_transmit_delay = i; spref.get("psm_flush_buffer_timeout", i, psm_flush_buffer_timeout); psm_flush_buffer_timeout = i; spref.get("psm_minimum_bandwidth", i, psm_minimum_bandwidth); psm_minimum_bandwidth = i; spref.get("psm_minimum_bandwidth_margin", i, psm_minimum_bandwidth_margin); psm_minimum_bandwidth_margin = i; spref.get("psm_use_histogram", i, psm_use_histogram); psm_use_histogram = i; spref.get("psm_histogram_offset_threshold", i, psm_histogram_offset_threshold); psm_histogram_offset_threshold = i; spref.get("psm_hit_time_window", i, psm_hit_time_window); psm_hit_time_window = i; spref.get("tx_buffer_timeout", i, tx_buffer_timeout); tx_buffer_timeout = i; spref.get("kiss_io_modem_change_inhibit", i, kiss_io_modem_change_inhibit); kiss_io_modem_change_inhibit = i; spref.get("psk8DCDShortFlag", i, psk8DCDShortFlag); psk8DCDShortFlag = i; memset(strbuff, 0, sizeof(strbuff)); spref.get("browser_search", strbuff, browser_search.c_str(), sizeof(strbuff) - 1); browser_search = strbuff; seek_re.recompile(browser_search.c_str()); spref.get("meters", i, meters); meters = i; //---------------------------------------------------------------------- // WinKeyer prefs get //---------------------------------------------------------------------- spref.get("WK_serial_port_name", strbuff, "NONE", 199); WK_serial_port_name = strbuff; if (WK_serial_port_name.find("tty") == 0) WK_serial_port_name.insert(0, "/dev/"); spref.get("WK_mode_register", i, WK_mode_register); WK_mode_register = i; spref.get("WK_speed_wpm", i, WK_speed_wpm); WK_speed_wpm = i; spref.get("WK_cmd_wpm", i, WK_cmd_wpm); WK_cmd_wpm = i; spref.get("WK_cut_zeronine", i, WK_cut_zeronine); WK_cut_zeronine = i; spref.get("WK_sidetone", i, WK_sidetone); WK_sidetone = i; spref.get("WK_weight", i, WK_weight); WK_weight = i; spref.get("WK_lead_in_time", i, WK_lead_in_time); WK_lead_in_time = i; spref.get("WK_tail_time", i, WK_tail_time); WK_tail_time = i; spref.get("WK_min_wpm", i, WK_min_wpm); WK_min_wpm = i; spref.get("WK_rng_wpm", i, WK_rng_wpm); WK_rng_wpm = i; spref.get("WK_1st_ext", i, WK_first_extension); WK_first_extension = i; spref.get("WK_key_comp", i, WK_key_compensation); WK_key_compensation = i; spref.get("WK_farnsworth", i, WK_farnsworth_wpm); WK_farnsworth_wpm = i; spref.get("WK_paddle_set", i, WK_paddle_setpoint); WK_paddle_setpoint = i; spref.get("WK_dit_dah_ratio", i, WK_dit_dah_ratio); WK_dit_dah_ratio = i; spref.get("WK_pin_config", i, WK_pin_configuration); WK_pin_configuration = i; spref.get("WK_use_pot", i, WK_use_pot); WK_use_pot = i; spref.get("WK_online", i, WK_online); WK_online = i; spref.get("WK_version", WK_version, WK_version); spref.get("WKFSK_mode", WKFSK_mode, WKFSK_mode); spref.get("WKFSK_baud", WKFSK_baud, WKFSK_baud); spref.get("WKFSK_stopbits", WKFSK_stopbits, WKFSK_stopbits); spref.get("WKFSK_ptt", WKFSK_ptt, WKFSK_ptt); spref.get("WKFSK_polarity", WKFSK_polarity, WKFSK_polarity); spref.get("WKFSK_sidetone", WKFSK_sidetone, WKFSK_sidetone); spref.get("WKFSK_auto_crlf", WKFSK_auto_crlf, WKFSK_auto_crlf); spref.get("WKFSK_diddle", WKFSK_diddle, WKFSK_diddle); spref.get("WKFSK_diddle_char", WKFSK_diddle_char, WKFSK_diddle_char); spref.get("WKFSK_diddle_char", WKFSK_diddle_char, WKFSK_diddle_char); spref.get("WKFSK_monitor", WKFSK_monitor, WKFSK_monitor); spref.get("Nav_online", i, Nav_online); Nav_online = i; spref.get("Nav_config_online", i, Nav_config_online); Nav_config_online = i; spref.get("nanoCW_online", i, nanoCW_online); nanoCW_online = i; spref.get("nanoFSK_online", i, nanoFSK_online); nanoFSK_online = i; } void status::initLastState() { if (!bLastStateRead) loadLastState(); // RTTY if (lastmode == MODE_RTTY ) { progdefaults.rtty_shift = rtty_shift; selShift->index(progdefaults.rtty_shift); if (rtty_shift == selShift->lsize() - 1) { selCustomShift->deactivate(); } else { // Custom shift selCustomShift->activate(); } selBaud->index((progdefaults.rtty_baud = rtty_baud)); selBits->index((progdefaults.rtty_bits = rtty_bits)); selParity->index((progdefaults.rtty_parity = rtty_parity)); selStopBits->index((progdefaults.rtty_stop = rtty_stop)); btnCRCRLF->value(progdefaults.rtty_crcrlf = rtty_crcrlf); btnAUTOCRLF->value(progdefaults.rtty_autocrlf = rtty_autocrlf); cntrAUTOCRLF->value(progdefaults.rtty_autocount = rtty_autocount); chkPseudoFSK->value(progdefaults.PseudoFSK = PseudoFSK); chkUOSrx->value(progdefaults.UOSrx = UOSrx); chkUOStx->value(progdefaults.UOStx = UOStx); // chkXagc->value(progdefaults.Xagc = Xagc); i_listbox_rtty_afc_speed->index(progdefaults.rtty_afcspeed = rtty_afcspeed); btnPreferXhairScope->value(progdefaults.PreferXhairScope = PreferXhairScope); if (mvsquelch) { //printf("init rtty squelch %f\n", VIEWER_rttysquelch); mvsquelch->range(-12.0, 6.0); mvsquelch->value(VIEWER_rttysquelch); } if (sldrViewerSquelch) { sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->value(VIEWER_rttysquelch); } } if (lastmode >= MODE_PSK_FIRST && lastmode <= MODE_PSK_LAST) { if (mvsquelch) { mvsquelch->range(-3.0, 6.0); mvsquelch->value(VIEWER_psksquelch); } if (sldrViewerSquelch) { sldrViewerSquelch->range(-3.0, 6.0); sldrViewerSquelch->value(VIEWER_psksquelch); } } // OLIVIA if (lastmode == MODE_OLIVIA) { i_listbox_olivia_tones->index(progdefaults.oliviatones = oliviatones); i_listbox_olivia_bandwidth->index(progdefaults.oliviabw = oliviabw); cntOlivia_smargin->value(progdefaults.oliviasmargin = oliviamargin); cntOlivia_sinteg->value(progdefaults.oliviasinteg = oliviainteg); btnOlivia_8bit->value(progdefaults.olivia8bit = olivia8bit); } // CONTESTIA if (lastmode == MODE_CONTESTIA) { i_listbox_contestia_tones->index(progdefaults.contestiatones = contestiatones); i_listbox_contestia_bandwidth->index(progdefaults.contestiabw = contestiabw); cntContestia_smargin->value(progdefaults.contestiasmargin = contestiamargin); cntContestia_sinteg->value(progdefaults.contestiasinteg = contestiainteg); btnContestia_8bit->value(progdefaults.contestia8bit = contestia8bit); } init_modem_sync(lastmode); wf->opmode(); wf->Mag(mag); wf->Offset(offset); wf->Speed(speed); wf->setRefLevel(); wf->setAmpSpan(); btnAFC->value(afconoff); if(override_data_io_enabled != DISABLED_IO) { data_io_enabled = override_data_io_enabled; progdefaults.data_io_enabled = data_io_enabled; data_io_enabled = data_io_enabled; } if(data_io_enabled == KISS_IO) { data_io_enabled = KISS_IO; progdefaults.data_io_enabled = KISS_IO; } else { data_io_enabled = ARQ_IO; progdefaults.data_io_enabled = ARQ_IO; data_io_enabled = ARQ_IO; kpsql_enabled = false; } btnSQL->value(sqlonoff); btnPSQL->value(kpsql_enabled); if(kpsql_enabled) sldrSquelch->value(sldrPwrSquelchValue); else sldrSquelch->value(sldrSquelchValue); if (arq_address_override_flag) arq_address = progdefaults.arq_address = override_arq_address; if (arq_port_override_flag) arq_port = progdefaults.arq_port = override_arq_port; if(kiss_address_override_flag) { if(!override_kiss_address.empty()) kiss_address = progdefaults.kiss_address = override_kiss_address; if(!override_kiss_io_port.empty()) kiss_io_port = progdefaults.kiss_io_port = override_kiss_io_port; if(!override_kiss_out_port.empty()) kiss_out_port = progdefaults.kiss_out_port = override_kiss_out_port; if(override_kiss_dual_port_enabled > -1) kiss_dual_port_enabled = progdefaults.kiss_dual_port_enabled = override_kiss_dual_port_enabled; } if (xmlrpc_address_override_flag) xmlrpc_address = progdefaults.xmlrpc_address = override_xmlrpc_address; if (xmlrpc_port_override_flag) xmlrpc_port = progdefaults.xmlrpc_port = override_xmlrpc_port; txtArq_ip_address->value(arq_address.c_str()); txtArq_ip_port_no->value(arq_port.c_str()); txtXmlrpc_ip_address->value(xmlrpc_address.c_str()); txtXmlrpc_ip_port_no->value(xmlrpc_port.c_str()); txtKiss_ip_address->value(kiss_address.c_str()); txtKiss_ip_io_port_no->value(kiss_io_port.c_str()); txtKiss_ip_out_port_no->value(kiss_out_port.c_str()); btnEnable_dual_port->value(kiss_dual_port_enabled); progdefaults.kiss_dual_port_enabled = kiss_dual_port_enabled; btnEnable_csma->value(csma_enabled); progdefaults.csma_enabled = csma_enabled; btnEnable_ax25_decode->value(ax25_decode_enabled); progdefaults.ax25_decode_enabled = ax25_decode_enabled; cntKPSQLAttenuation->value(kpsql_attenuation); progdefaults.kpsql_attenuation = kpsql_attenuation; kiss_io_set_button_state(0); if (bWF_only) fl_digi_main->resize(mainX, mainY, mainW, Hmenu + Hwfall + Hstatus); else { fl_digi_main->resize(mainX, mainY, mainW, mainH); set_macroLabels(); UI_select(); } if (VIEWERvisible) openViewer(); if (scopeview) { scopeview->resize(scopeX, scopeY, scopeW, scopeH); digiscope->resize(0,0,scopeW,scopeH); if (scopeVisible) scopeview->show(); } cQsoDb::reverse = logbook_reverse; if (cQsoDb::reverse) { qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } dlgLogbook->resize(logbook_x, logbook_y, logbook_w, logbook_h); wBrowser->columnWidth(0, logbook_col_0); wBrowser->columnWidth(1, logbook_col_1); wBrowser->columnWidth(2, logbook_col_2); wBrowser->columnWidth(3, logbook_col_3); wBrowser->columnWidth(4, logbook_col_4); wBrowser->columnWidth(5, logbook_col_5); dxcluster_viewer->resize(dxdialog_x, dxdialog_y, dxdialog_w, dxdialog_h); ReceiveText->set_all_entry(quick_entry); ReceiveText->set_scroll_hints(rx_scroll_hints); ReceiveText->set_word_wrap(rx_word_wrap, true); TransmitText->set_word_wrap(tx_word_wrap, true); disable_config_p2p_io_widgets(); update_csma_io_config(CSMA_ALL); // config_WK choice_WK_keyer_mode->add("Iambic B"); choice_WK_keyer_mode->add("Iambic A"); choice_WK_keyer_mode->add("Ultimatic"); choice_WK_keyer_mode->add("Bug Mode"); choice_WK_keyer_mode->index((WK_mode_register & 0x30) >> 4); choice_WK_output_pins->add("Key 1"); choice_WK_output_pins->add("Key 2"); choice_WK_output_pins->add("Key 1 & 2"); choice_WK_output_pins->index(((WK_pin_configuration & 0x06) >> 2) - 1); choice_WK_sidetone->add("4000"); choice_WK_sidetone->add("2000"); choice_WK_sidetone->add("1333"); choice_WK_sidetone->add("1000"); choice_WK_sidetone->add("800"); choice_WK_sidetone->add("666"); choice_WK_sidetone->add("571"); choice_WK_sidetone->add("500"); choice_WK_sidetone->add("444"); choice_WK_sidetone->add("400"); choice_WK_sidetone->index((WK_sidetone & 0x0F) - 1); choice_WK_hang->add("Wait 1.0"); choice_WK_hang->add("Wait 1.33"); choice_WK_hang->add("Wait 1.66"); choice_WK_hang->add("Wait 2.0"); choice_WK_hang->index((WK_pin_configuration & 0x30) >> 4); cntr_WK_tail->minimum(0); cntr_WK_tail->maximum(250); cntr_WK_tail->step(10); cntr_WK_tail->value(WK_tail_time); cntr_WK_leadin->minimum(0); cntr_WK_leadin->maximum(250); cntr_WK_leadin->step(10); cntr_WK_leadin->value(WK_lead_in_time); cntr_WK_weight->minimum(10); cntr_WK_weight->maximum(90); cntr_WK_weight->step(1); cntr_WK_weight->value(WK_weight); cntr_WK_sample->minimum(10); cntr_WK_sample->maximum(90); cntr_WK_sample->step(1); cntr_WK_sample->value(WK_paddle_setpoint); cntr_WK_first_ext->minimum(0); cntr_WK_first_ext->maximum(250); cntr_WK_first_ext->step(1); cntr_WK_first_ext->value(WK_first_extension); cntr_WK_comp->minimum(0); cntr_WK_comp->maximum(250); cntr_WK_comp->step(1); cntr_WK_comp->value(WK_key_compensation); cntr_WK_ratio->minimum(2.0); cntr_WK_ratio->maximum(4.0); cntr_WK_ratio->step(0.1); cntr_WK_ratio->value(WK_dit_dah_ratio * 3 / 50.0); cntr_WK_cmd_wpm->minimum(10); cntr_WK_cmd_wpm->maximum(30); cntr_WK_cmd_wpm->step(1); cntr_WK_cmd_wpm->value(WK_cmd_wpm); cntr_WK_farnsworth->minimum(10); cntr_WK_farnsworth->maximum(99); cntr_WK_farnsworth->step(1); cntr_WK_farnsworth->value(WK_farnsworth_wpm); cntr_WK_rng_wpm->minimum(10); cntr_WK_rng_wpm->maximum(40); cntr_WK_rng_wpm->step(1); cntr_WK_rng_wpm->value(WK_rng_wpm); cntr_WK_min_wpm->minimum(5); cntr_WK_min_wpm->maximum(89); cntr_WK_min_wpm->step(1); cntr_WK_min_wpm->value(WK_min_wpm); btn_WK_sidetone_on->value(WK_sidetone); btn_WK_cut_zeronine->value(WK_cut_zeronine); btn_WK_ptt_on->value((WK_pin_configuration & 0x01) == 0x01); btn_WK_tone_on->value((WK_pin_configuration & 0x02) == 0x02); btn_WK_ct_space->value((WK_mode_register & 0x01) == 0x01); btn_WK_auto_space->value((WK_mode_register & 0x02) == 0x02); btn_WK_serial_echo->value((WK_mode_register & 0x04) == 0x04); btn_WK_swap->value((WK_mode_register & 0x08) == 0x08); btn_WK_paddle_echo->value((WK_mode_register & 0x40) == 0x40); btn_WK_paddledog->value((WK_mode_register & 0x80) == 0x80); select_WK_CommPort->value(WK_serial_port_name.c_str()); } fldigi-4.1.06/src/misc/estrings.cxx0000644000175000017500000004775613472115773014122 00000000000000#include "estrings.h" #ifdef __MINGW32__ static std::string unknown = "UNKNOWN ERROR"; ESTRINGS emap[] = { {NO_ERROR, "NO ERROR"}, {ERROR_INVALID_FUNCTION, "INVALID_FUNCTION"}, {ERROR_FILE_NOT_FOUND, "FILE_NOT_FOUND"}, {ERROR_PATH_NOT_FOUND, "PATH_NOT_FOUND"}, {ERROR_TOO_MANY_OPEN_FILES, "TOO_MANY_OPEN_FILES"}, {ERROR_ACCESS_DENIED, "ACCESS_DENIED"}, {ERROR_INVALID_HANDLE, "INVALID_HANDLE"}, {ERROR_ARENA_TRASHED, "ARENA_TRASHED"}, {ERROR_NOT_ENOUGH_MEMORY, "NOT_ENOUGH_MEMORY"}, {ERROR_INVALID_BLOCK, "INVALID_BLOCK"}, {ERROR_BAD_ENVIRONMENT, "BAD_ENVIRONMENT"}, {ERROR_BAD_FORMAT, "BAD_FORMAT"}, {ERROR_INVALID_ACCESS, "INVALID_ACCESS"}, {ERROR_INVALID_DATA, "INVALID_DATA"}, {ERROR_OUTOFMEMORY, "OUTOFMEMORY"}, {ERROR_INVALID_DRIVE, "INVALID_DRIVE"}, {ERROR_CURRENT_DIRECTORY, "CURRENT_DIRECTORY"}, {ERROR_NOT_SAME_DEVICE, "NOT_SAME_DEVICE"}, {ERROR_NO_MORE_FILES, "NO_MORE_FILES"}, {ERROR_WRITE_PROTECT, "WRITE_PROTECT"}, {ERROR_BAD_UNIT, "BAD_UNIT"}, {ERROR_NOT_READY, "NOT_READY"}, {ERROR_BAD_COMMAND, "BAD_COMMAND"}, {ERROR_CRC, "CRC"}, {ERROR_BAD_LENGTH, "BAD_LENGTH"}, {ERROR_SEEK, "SEEK"}, {ERROR_NOT_DOS_DISK, "NOT_DOS_DISK"}, {ERROR_SECTOR_NOT_FOUND, "SECTOR_NOT_FOUND"}, {ERROR_OUT_OF_PAPER, "OUT_OF_PAPER"}, {ERROR_WRITE_FAULT, "WRITE_FAULT"}, {ERROR_READ_FAULT, "READ_FAULT"}, {ERROR_GEN_FAILURE, "GEN_FAILURE"}, {ERROR_SHARING_VIOLATION, "SHARING_VIOLATION"}, {ERROR_LOCK_VIOLATION, "LOCK_VIOLATION"}, {ERROR_WRONG_DISK, "WRONG_DISK"}, {ERROR_SHARING_BUFFER_EXCEEDED, "SHARING_BUFFER_EXCEEDED"}, {ERROR_HANDLE_EOF, "HANDLE_EOF"}, {ERROR_HANDLE_DISK_FULL, "HANDLE_DISK_FULL"}, {ERROR_NOT_SUPPORTED, "NOT_SUPPORTED"}, {ERROR_REM_NOT_LIST, "REM_NOT_LIST"}, {ERROR_DUP_NAME, "DUP_NAME"}, {ERROR_BAD_NETPATH, "BAD_NETPATH"}, {ERROR_NETWORK_BUSY, "NETWORK_BUSY"}, {ERROR_DEV_NOT_EXIST, "DEV_NOT_EXIST"}, {ERROR_TOO_MANY_CMDS, "TOO_MANY_CMDS"}, {ERROR_ADAP_HDW_ERR, "ADAP_HDW_ERR"}, {ERROR_BAD_NET_RESP, "BAD_NET_RESP"}, {ERROR_UNEXP_NET_ERR, "UNEXP_NET_ERR"}, {ERROR_BAD_REM_ADAP, "BAD_REM_ADAP"}, {ERROR_PRINTQ_FULL, "PRINTQ_FULL"}, {ERROR_NO_SPOOL_SPACE, "NO_SPOOL_SPACE"}, {ERROR_PRINT_CANCELLED, "PRINT_CANCELLED"}, {ERROR_NETNAME_DELETED, "NETNAME_DELETED"}, {ERROR_NETWORK_ACCESS_DENIED, "NETWORK_ACCESS_DENIED"}, {ERROR_BAD_DEV_TYPE, "BAD_DEV_TYPE"}, {ERROR_BAD_NET_NAME, "BAD_NET_NAME"}, {ERROR_TOO_MANY_NAMES, "TOO_MANY_NAMES"}, {ERROR_TOO_MANY_SESS, "TOO_MANY_SESS"}, {ERROR_SHARING_PAUSED, "SHARING_PAUSED"}, {ERROR_REQ_NOT_ACCEP, "REQ_NOT_ACCEP"}, {ERROR_REDIR_PAUSED, "REDIR_PAUSED"}, {ERROR_FILE_EXISTS, "FILE_EXISTS"}, {ERROR_CANNOT_MAKE, "CANNOT_MAKE"}, {ERROR_FAIL_I24, "FAIL_I24"}, {ERROR_OUT_OF_STRUCTURES, "OUT_OF_STRUCTURES"}, {ERROR_ALREADY_ASSIGNED, "ALREADY_ASSIGNED"}, {ERROR_INVALID_PASSWORD, "INVALID_PASSWORD"}, {ERROR_INVALID_PARAMETER, "INVALID_PARAMETER"}, {ERROR_NET_WRITE_FAULT, "NET_WRITE_FAULT"}, {ERROR_NO_PROC_SLOTS, "NO_PROC_SLOTS"}, {ERROR_TOO_MANY_SEMAPHORES, "TOO_MANY_SEMAPHORES"}, {ERROR_EXCL_SEM_ALREADY_OWNED, "EXCL_SEM_ALREADY_OWNED"}, {ERROR_SEM_IS_SET, "SEM_IS_SET"}, {ERROR_TOO_MANY_SEM_REQUESTS, "TOO_MANY_SEM_REQUESTS"}, {ERROR_INVALID_AT_INTERRUPT_TIME, "INVALID_AT_INTERRUPT_TIME"}, {ERROR_SEM_OWNER_DIED, "SEM_OWNER_DIED"}, {ERROR_SEM_USER_LIMIT, "SEM_USER_LIMIT"}, {ERROR_DISK_CHANGE, "DISK_CHANGE"}, {ERROR_DRIVE_LOCKED, "DRIVE_LOCKED"}, {ERROR_BROKEN_PIPE, "BROKEN_PIPE"}, {ERROR_OPEN_FAILED, "OPEN_FAILED"}, {ERROR_BUFFER_OVERFLOW, "BUFFER_OVERFLOW"}, {ERROR_DISK_FULL, "DISK_FULL"}, {ERROR_NO_MORE_SEARCH_HANDLES, "NO_MORE_SEARCH_HANDLES"}, {ERROR_INVALID_TARGET_HANDLE, "INVALID_TARGET_HANDLE"}, {ERROR_INVALID_CATEGORY, "INVALID_CATEGORY"}, {ERROR_INVALID_VERIFY_SWITCH, "INVALID_VERIFY_SWITCH"}, {ERROR_BAD_DRIVER_LEVEL, "BAD_DRIVER_LEVEL"}, {ERROR_CALL_NOT_IMPLEMENTED, "CALL_NOT_IMPLEMENTED"}, {ERROR_SEM_TIMEOUT, "SEM_TIMEOUT"}, {ERROR_INSUFFICIENT_BUFFER, "INSUFFICIENT_BUFFER"}, {ERROR_INVALID_NAME, "INVALID_NAME"}, {ERROR_INVALID_LEVEL, "INVALID_LEVEL"}, }; /* ERROR_NO_VOLUME_LABEL 125L ERROR_MOD_NOT_FOUND 126L ERROR_PROC_NOT_FOUND 127L ERROR_WAIT_NO_CHILDREN 128L ERROR_CHILD_NOT_COMPLETE 129L ERROR_DIRECT_ACCESS_HANDLE 130L ERROR_NEGATIVE_SEEK 131L ERROR_SEEK_ON_DEVICE 132L ERROR_IS_JOIN_TARGET 133L ERROR_IS_JOINED 134L ERROR_IS_SUBSTED 135L ERROR_NOT_JOINED 136L ERROR_NOT_SUBSTED 137L ERROR_JOIN_TO_JOIN 138L ERROR_SUBST_TO_SUBST 139L ERROR_JOIN_TO_SUBST 140L ERROR_SUBST_TO_JOIN 141L ERROR_BUSY_DRIVE 142L ERROR_SAME_DRIVE 143L ERROR_DIR_NOT_ROOT 144L ERROR_DIR_NOT_EMPTY 145L ERROR_IS_SUBST_PATH 146L ERROR_IS_JOIN_PATH 147L ERROR_PATH_BUSY 148L ERROR_IS_SUBST_TARGET 149L ERROR_SYSTEM_TRACE 150L ERROR_INVALID_EVENT_COUNT 151L ERROR_TOO_MANY_MUXWAITERS 152L ERROR_INVALID_LIST_FORMAT 153L ERROR_LABEL_TOO_LONG 154L ERROR_TOO_MANY_TCBS 155L ERROR_SIGNAL_REFUSED 156L ERROR_DISCARDED 157L ERROR_NOT_LOCKED 158L ERROR_BAD_THREADID_ADDR 159L ERROR_BAD_ARGUMENTS 160L ERROR_BAD_PATHNAME 161L ERROR_SIGNAL_PENDING 162L ERROR_MAX_THRDS_REACHED 164L ERROR_LOCK_FAILED 167L ERROR_BUSY 170L ERROR_CANCEL_VIOLATION 173L ERROR_ATOMIC_LOCKS_NOT_SUPPORTED 174L ERROR_INVALID_SEGMENT_NUMBER 180L ERROR_INVALID_ORDINAL 182L ERROR_ALREADY_EXISTS 183L ERROR_INVALID_FLAG_NUMBER 186L ERROR_SEM_NOT_FOUND 187L ERROR_INVALID_STARTING_CODESEG 188L ERROR_INVALID_STACKSEG 189L ERROR_INVALID_MODULETYPE 190L ERROR_INVALID_EXE_SIGNATURE 191L ERROR_EXE_MARKED_INVALID 192L ERROR_BAD_EXE_FORMAT 193L ERROR_ITERATED_DATA_EXCEEDS_64k 194L ERROR_INVALID_MINALLOCSIZE 195L ERROR_DYNLINK_FROM_INVALID_RING 196L ERROR_IOPL_NOT_ENABLED 197L ERROR_INVALID_SEGDPL 198L ERROR_AUTODATASEG_EXCEEDS_64k 199L ERROR_RING2SEG_MUST_BE_MOVABLE 200L ERROR_RELOC_CHAIN_XEEDS_SEGLIM 201L ERROR_INFLOOP_IN_RELOC_CHAIN 202L ERROR_ENVVAR_NOT_FOUND 203L ERROR_NO_SIGNAL_SENT 205L ERROR_FILENAME_EXCED_RANGE 206L ERROR_RING2_STACK_IN_USE 207L ERROR_META_EXPANSION_TOO_LONG 208L ERROR_INVALID_SIGNAL_NUMBER 209L ERROR_THREAD_1_INACTIVE 210L ERROR_LOCKED 212L ERROR_TOO_MANY_MODULES 214L ERROR_NESTING_NOT_ALLOWED 215L ERROR_EXE_MACHINE_TYPE_MISMATCH 216L ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY 217L ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY 218L ERROR_BAD_PIPE 230L ERROR_PIPE_BUSY 231L ERROR_NO_DATA 232L ERROR_PIPE_NOT_CONNECTED 233L ERROR_MORE_DATA 234L ERROR_VC_DISCONNECTED 240L ERROR_INVALID_EA_NAME 254L ERROR_EA_LIST_INCONSISTENT 255L WAIT_TIMEOUT 258L ERROR_NO_MORE_ITEMS 259L ERROR_CANNOT_COPY 266L ERROR_DIRECTORY 267L ERROR_EAS_DIDNT_FIT 275L ERROR_EA_FILE_CORRUPT 276L ERROR_EA_TABLE_FULL 277L ERROR_INVALID_EA_HANDLE 278L ERROR_EAS_NOT_SUPPORTED 282L ERROR_NOT_OWNER 288L ERROR_TOO_MANY_POSTS 298L ERROR_PARTIAL_COPY 299L ERROR_OPLOCK_NOT_GRANTED 300L ERROR_INVALID_OPLOCK_PROTOCOL 301L ERROR_DISK_TOO_FRAGMENTED 302L ERROR_DELETE_PENDING 303L ERROR_MR_MID_NOT_FOUND 317L ERROR_SCOPE_NOT_FOUND 318L ERROR_INVALID_ADDRESS 487L ERROR_ARITHMETIC_OVERFLOW 534L ERROR_PIPE_CONNECTED 535L ERROR_PIPE_LISTENING 536L ERROR_EA_ACCESS_DENIED 994L ERROR_OPERATION_ABORTED 995L ERROR_IO_INCOMPLETE 996L ERROR_IO_PENDING 997L ERROR_NOACCESS 998L ERROR_SWAPERROR 999L ERROR_STACK_OVERFLOW 1001L ERROR_INVALID_MESSAGE 1002L ERROR_CAN_NOT_COMPLETE 1003L ERROR_INVALID_FLAGS 1004L ERROR_UNRECOGNIZED_VOLUME 1005L ERROR_FILE_INVALID 1006L ERROR_FULLSCREEN_MODE 1007L ERROR_NO_TOKEN 1008L ERROR_BADDB 1009L ERROR_BADKEY 1010L ERROR_CANTOPEN 1011L ERROR_CANTREAD 1012L ERROR_CANTWRITE 1013L ERROR_REGISTRY_RECOVERED 1014L ERROR_REGISTRY_CORRUPT 1015L ERROR_REGISTRY_IO_FAILED 1016L ERROR_NOT_REGISTRY_FILE 1017L ERROR_KEY_DELETED 1018L ERROR_NO_LOG_SPACE 1019L ERROR_KEY_HAS_CHILDREN 1020L ERROR_CHILD_MUST_BE_VOLATILE 1021L ERROR_NOTIFY_ENUM_DIR 1022L ERROR_DEPENDENT_SERVICES_RUNNING 1051L ERROR_INVALID_SERVICE_CONTROL 1052L ERROR_SERVICE_REQUEST_TIMEOUT 1053L ERROR_SERVICE_NO_THREAD 1054L ERROR_SERVICE_DATABASE_LOCKED 1055L ERROR_SERVICE_ALREADY_RUNNING 1056L ERROR_INVALID_SERVICE_ACCOUNT 1057L ERROR_SERVICE_DISABLED 1058L ERROR_CIRCULAR_DEPENDENCY 1059L ERROR_SERVICE_DOES_NOT_EXIST 1060L ERROR_SERVICE_CANNOT_ACCEPT_CTRL 1061L ERROR_SERVICE_NOT_ACTIVE 1062L ERROR_FAILED_SERVICE_CONTROLLER_CONNECT 1063L ERROR_EXCEPTION_IN_SERVICE 1064L ERROR_DATABASE_DOES_NOT_EXIST 1065L ERROR_SERVICE_SPECIFIC_ERROR 1066L ERROR_PROCESS_ABORTED 1067L ERROR_SERVICE_DEPENDENCY_FAIL 1068L ERROR_SERVICE_LOGON_FAILED 1069L ERROR_SERVICE_START_HANG 1070L ERROR_INVALID_SERVICE_LOCK 1071L ERROR_SERVICE_MARKED_FOR_DELETE 1072L ERROR_SERVICE_EXISTS 1073L ERROR_ALREADY_RUNNING_LKG 1074L ERROR_SERVICE_DEPENDENCY_DELETED 1075L ERROR_BOOT_ALREADY_ACCEPTED 1076L ERROR_SERVICE_NEVER_STARTED 1077L ERROR_DUPLICATE_SERVICE_NAME 1078L ERROR_DIFFERENT_SERVICE_ACCOUNT 1079L ERROR_CANNOT_DETECT_DRIVER_FAILURE 1080L ERROR_CANNOT_DETECT_PROCESS_ABORT 1081L ERROR_NO_RECOVERY_PROGRAM 1082L ERROR_SERVICE_NOT_IN_EXE 1083L ERROR_NOT_SAFEBOOT_SERVICE 1084L ERROR_END_OF_MEDIA 1100L ERROR_FILEMARK_DETECTED 1101L ERROR_BEGINNING_OF_MEDIA 1102L ERROR_SETMARK_DETECTED 1103L ERROR_NO_DATA_DETECTED 1104L ERROR_PARTITION_FAILURE 1105L ERROR_INVALID_BLOCK_LENGTH 1106L ERROR_DEVICE_NOT_PARTITIONED 1107L ERROR_UNABLE_TO_LOCK_MEDIA 1108L ERROR_UNABLE_TO_UNLOAD_MEDIA 1109L ERROR_MEDIA_CHANGED 1110L ERROR_BUS_RESET 1111L ERROR_NO_MEDIA_IN_DRIVE 1112L ERROR_NO_UNICODE_TRANSLATION 1113L ERROR_DLL_INIT_FAILED 1114L ERROR_SHUTDOWN_IN_PROGRESS 1115L ERROR_NO_SHUTDOWN_IN_PROGRESS 1116L ERROR_IO_DEVICE 1117L ERROR_SERIAL_NO_DEVICE 1118L ERROR_IRQ_BUSY 1119L ERROR_MORE_WRITES 1120L ERROR_COUNTER_TIMEOUT 1121L ERROR_FLOPPY_ID_MARK_NOT_FOUND 1122L ERROR_FLOPPY_WRONG_CYLINDER 1123L ERROR_FLOPPY_UNKNOWN_ERROR 1124L ERROR_FLOPPY_BAD_REGISTERS 1125L ERROR_DISK_RECALIBRATE_FAILED 1126L ERROR_DISK_OPERATION_FAILED 1127L ERROR_DISK_RESET_FAILED 1128L ERROR_EOM_OVERFLOW 1129L ERROR_NOT_ENOUGH_SERVER_MEMORY 1130L ERROR_POSSIBLE_DEADLOCK 1131L ERROR_MAPPED_ALIGNMENT 1132L ERROR_SET_POWER_STATE_VETOED 1140L ERROR_SET_POWER_STATE_FAILED 1141L ERROR_TOO_MANY_LINKS 1142L ERROR_OLD_WIN_VERSION 1150L ERROR_APP_WRONG_OS 1151L ERROR_SINGLE_INSTANCE_APP 1152L ERROR_RMODE_APP 1153L ERROR_INVALID_DLL 1154L ERROR_NO_ASSOCIATION 1155L ERROR_DDE_FAIL 1156L ERROR_DLL_NOT_FOUND 1157L ERROR_NO_MORE_USER_HANDLES 1158L ERROR_MESSAGE_SYNC_ONLY 1159L ERROR_SOURCE_ELEMENT_EMPTY 1160L ERROR_DESTINATION_ELEMENT_FULL 1161L ERROR_ILLEGAL_ELEMENT_ADDRESS 1162L ERROR_MAGAZINE_NOT_PRESENT 1163L ERROR_DEVICE_REINITIALIZATION_NEEDED 1164L ERROR_DEVICE_REQUIRES_CLEANING 1165L ERROR_DEVICE_DOOR_OPEN 1166L ERROR_DEVICE_NOT_CONNECTED 1167L ERROR_NOT_FOUND 1168L ERROR_NO_MATCH 1169L ERROR_SET_NOT_FOUND 1170L ERROR_POINT_NOT_FOUND 1171L ERROR_NO_TRACKING_SERVICE 1172L ERROR_NO_VOLUME_ID 1173L ERROR_UNABLE_TO_REMOVE_REPLACED 1175L ERROR_UNABLE_TO_MOVE_REPLACEMENT 1176L ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 1177L ERROR_JOURNAL_DELETE_IN_PROGRESS 1178L ERROR_JOURNAL_NOT_ACTIVE 1179L ERROR_POTENTIAL_FILE_FOUND 1180L ERROR_JOURNAL_ENTRY_DELETED 1181L ERROR_BAD_DEVICE 1200L ERROR_CONNECTION_UNAVAIL 1201L ERROR_DEVICE_ALREADY_REMEMBERED 1202L ERROR_NO_NET_OR_BAD_PATH 1203L ERROR_BAD_PROVIDER 1204L ERROR_CANNOT_OPEN_PROFILE 1205L ERROR_BAD_PROFILE 1206L ERROR_NOT_CONTAINER 1207L ERROR_EXTENDED_ERROR 1208L ERROR_INVALID_GROUPNAME 1209L ERROR_INVALID_COMPUTERNAME 1210L ERROR_INVALID_EVENTNAME 1211L ERROR_INVALID_DOMAINNAME 1212L ERROR_INVALID_SERVICENAME 1213L ERROR_INVALID_NETNAME 1214L ERROR_INVALID_SHARENAME 1215L ERROR_INVALID_PASSWORDNAME 1216L ERROR_INVALID_MESSAGENAME 1217L ERROR_INVALID_MESSAGEDEST 1218L ERROR_SESSION_CREDENTIAL_CONFLICT 1219L ERROR_REMOTE_SESSION_LIMIT_EXCEEDED 1220L ERROR_DUP_DOMAINNAME 1221L ERROR_NO_NETWORK 1222L ERROR_CANCELLED 1223L ERROR_USER_MAPPED_FILE 1224L ERROR_CONNECTION_REFUSED 1225L ERROR_GRACEFUL_DISCONNECT 1226L ERROR_ADDRESS_ALREADY_ASSOCIATED 1227L ERROR_ADDRESS_NOT_ASSOCIATED 1228L ERROR_CONNECTION_INVALID 1229L ERROR_CONNECTION_ACTIVE 1230L ERROR_NETWORK_UNREACHABLE 1231L ERROR_HOST_UNREACHABLE 1232L ERROR_PROTOCOL_UNREACHABLE 1233L ERROR_PORT_UNREACHABLE 1234L ERROR_REQUEST_ABORTED 1235L ERROR_CONNECTION_ABORTED 1236L ERROR_RETRY 1237L ERROR_CONNECTION_COUNT_LIMIT 1238L ERROR_LOGIN_TIME_RESTRICTION 1239L ERROR_LOGIN_WKSTA_RESTRICTION 1240L ERROR_INCORRECT_ADDRESS 1241L ERROR_ALREADY_REGISTERED 1242L ERROR_SERVICE_NOT_FOUND 1243L ERROR_NOT_AUTHENTICATED 1244L ERROR_NOT_LOGGED_ON 1245L ERROR_CONTINUE 1246L ERROR_ALREADY_INITIALIZED 1247L ERROR_NO_MORE_DEVICES 1248L ERROR_NO_SUCH_SITE 1249L ERROR_DOMAIN_CONTROLLER_EXISTS 1250L ERROR_ONLY_IF_CONNECTED 1251L ERROR_OVERRIDE_NOCHANGES 1252L ERROR_BAD_USER_PROFILE 1253L ERROR_NOT_SUPPORTED_ON_SBS 1254L ERROR_SERVER_SHUTDOWN_IN_PROGRESS 1255L ERROR_HOST_DOWN 1256L ERROR_NON_ACCOUNT_SID 1257L ERROR_NON_DOMAIN_SID 1258L ERROR_APPHELP_BLOCK 1259L ERROR_ACCESS_DISABLED_BY_POLICY 1260L ERROR_REG_NAT_CONSUMPTION 1261L ERROR_CSCSHARE_OFFLINE 1262L ERROR_PKINIT_FAILURE 1263L ERROR_SMARTCARD_SUBSYSTEM_FAILURE 1264L ERROR_DOWNGRADE_DETECTED 1265L SEC_E_SMARTCARD_CERT_REVOKED 1266L SEC_E_ISSUING_CA_UNTRUSTED 1267L SEC_E_REVOCATION_OFFLINE_C 1268L SEC_E_PKINIT_CLIENT_FAILUR 1269L SEC_E_SMARTCARD_CERT_EXPIRED 1270L ERROR_MACHINE_LOCKED 1271L ERROR_CALLBACK_SUPPLIED_INVALID_DATA 1273L ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED 1274L ERROR_DRIVER_BLOCKED 1275L ERROR_INVALID_IMPORT_OF_NON_DLL 1276L ERROR_ACCESS_DISABLED_WEBBLADE 1277L ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER 1278L ERROR_RECOVERY_FAILURE 1279L ERROR_ALREADY_FIBER 1280L ERROR_ALREADY_THREAD 1281L ERROR_STACK_BUFFER_OVERRUN 1282L ERROR_PARAMETER_QUOTA_EXCEEDED 1283L ERROR_DEBUGGER_INACTIVE 1284L ERROR_NOT_ALL_ASSIGNED 1300L ERROR_SOME_NOT_MAPPED 1301L ERROR_NO_QUOTAS_FOR_ACCOUNT 1302L ERROR_LOCAL_USER_SESSION_KEY 1303L ERROR_NULL_LM_PASSWORD 1304L ERROR_UNKNOWN_REVISION 1305L ERROR_REVISION_MISMATCH 1306L ERROR_INVALID_OWNER 1307L ERROR_INVALID_PRIMARY_GROUP 1308L ERROR_NO_IMPERSONATION_TOKEN 1309L ERROR_CANT_DISABLE_MANDATORY 1310L ERROR_NO_LOGON_SERVERS 1311L ERROR_NO_SUCH_LOGON_SESSION 1312L ERROR_NO_SUCH_PRIVILEGE 1313L ERROR_PRIVILEGE_NOT_HELD 1314L ERROR_INVALID_ACCOUNT_NAME 1315L ERROR_USER_EXISTS 1316L ERROR_NO_SUCH_USER 1317L ERROR_GROUP_EXISTS 1318L ERROR_NO_SUCH_GROUP 1319L ERROR_MEMBER_IN_GROUP 1320L ERROR_MEMBER_NOT_IN_GROUP 1321L ERROR_LAST_ADMIN 1322L ERROR_WRONG_PASSWORD 1323L ERROR_ILL_FORMED_PASSWORD 1324L ERROR_PASSWORD_RESTRICTION 1325L ERROR_LOGON_FAILURE 1326L ERROR_ACCOUNT_RESTRICTION 1327L ERROR_INVALID_LOGON_HOURS 1328L ERROR_INVALID_WORKSTATION 1329L ERROR_PASSWORD_EXPIRED 1330L ERROR_ACCOUNT_DISABLED 1331L ERROR_NONE_MAPPED 1332L ERROR_TOO_MANY_LUIDS_REQUESTED 1333L ERROR_LUIDS_EXHAUSTED 1334L ERROR_INVALID_SUB_AUTHORITY 1335L ERROR_INVALID_ACL 1336L ERROR_INVALID_SID 1337L ERROR_INVALID_SECURITY_DESCR 1338L ERROR_BAD_INHERITANCE_ACL 1340L ERROR_SERVER_DISABLED 1341L ERROR_SERVER_NOT_DISABLED 1342L ERROR_INVALID_ID_AUTHORITY 1343L ERROR_ALLOTTED_SPACE_EXCEEDED 1344L ERROR_INVALID_GROUP_ATTRIBUTES 1345L ERROR_BAD_IMPERSONATION_LEVEL 1346L ERROR_CANT_OPEN_ANONYMOUS 1347L ERROR_BAD_VALIDATION_CLASS 1348L ERROR_BAD_TOKEN_TYPE 1349L ERROR_NO_SECURITY_ON_OBJECT 1350L ERROR_CANT_ACCESS_DOMAIN_INFO 1351L ERROR_INVALID_SERVER_STATE 1352L ERROR_INVALID_DOMAIN_STATE 1353L ERROR_INVALID_DOMAIN_ROLE 1354L ERROR_NO_SUCH_DOMAIN 1355L ERROR_DOMAIN_EXISTS 1356L ERROR_DOMAIN_LIMIT_EXCEEDED 1357L ERROR_INTERNAL_DB_CORRUPTION 1358L ERROR_INTERNAL_ERROR 1359L ERROR_GENERIC_NOT_MAPPED 1360L ERROR_BAD_DESCRIPTOR_FORMAT 1361L ERROR_NOT_LOGON_PROCESS 1362L ERROR_LOGON_SESSION_EXISTS 1363L ERROR_NO_SUCH_PACKAGE 1364L ERROR_BAD_LOGON_SESSION_STATE 1365L ERROR_LOGON_SESSION_COLLISION 1366L ERROR_INVALID_LOGON_TYPE 1367L ERROR_CANNOT_IMPERSONATE 1368L ERROR_RXACT_INVALID_STATE 1369L ERROR_RXACT_COMMIT_FAILURE 1370L ERROR_SPECIAL_ACCOUNT 1371L ERROR_SPECIAL_GROUP 1372L ERROR_SPECIAL_USER 1373L ERROR_MEMBERS_PRIMARY_GROUP 1374L ERROR_TOKEN_ALREADY_IN_USE 1375L ERROR_NO_SUCH_ALIAS 1376L ERROR_MEMBER_NOT_IN_ALIAS 1377L ERROR_MEMBER_IN_ALIAS 1378L ERROR_ALIAS_EXISTS 1379L ERROR_LOGON_NOT_GRANTED 1380L ERROR_TOO_MANY_SECRETS 1381L ERROR_SECRET_TOO_LONG 1382L ERROR_INTERNAL_DB_ERROR 1383L ERROR_TOO_MANY_CONTEXT_IDS 1384L ERROR_LOGON_TYPE_NOT_GRANTED 1385L ERROR_NT_CROSS_ENCRYPTION_REQUIRED 1386L ERROR_NO_SUCH_MEMBER 1387L ERROR_INVALID_MEMBER 1388L ERROR_TOO_MANY_SIDS 1389L ERROR_LM_CROSS_ENCRYPTION_REQUIRED 1390L ERROR_NO_INHERITANCE 1391L ERROR_FILE_CORRUPT 1392L ERROR_DISK_CORRUPT 1393L ERROR_NO_USER_SESSION_KEY 1394L ERROR_LICENSE_QUOTA_EXCEEDED 1395L ERROR_WRONG_TARGET_NAME 1396L ERROR_MUTUAL_AUTH_FAILED 1397L ERROR_TIME_SKEW 1398L ERROR_CURRENT_DOMAIN_NOT_ALLOWED 1399L ERROR_INVALID_WINDOW_HANDLE 1400L ERROR_INVALID_MENU_HANDLE 1401L ERROR_INVALID_CURSOR_HANDLE 1402L ERROR_INVALID_ACCEL_HANDLE 1403L ERROR_INVALID_HOOK_HANDLE 1404L ERROR_INVALID_DWP_HANDLE 1405L ERROR_TLW_WITH_WSCHILD 1406L ERROR_CANNOT_FIND_WND_CLASS 1407L ERROR_WINDOW_OF_OTHER_THREAD 1408L ERROR_HOTKEY_ALREADY_REGISTERED 1409L ERROR_CLASS_ALREADY_EXISTS 1410L ERROR_CLASS_DOES_NOT_EXIST 1411L ERROR_CLASS_HAS_WINDOWS 1412L ERROR_INVALID_INDEX 1413L ERROR_INVALID_ICON_HANDLE 1414L ERROR_PRIVATE_DIALOG_INDEX 1415L ERROR_LISTBOX_ID_NOT_FOUND 1416L ERROR_NO_WILDCARD_CHARACTERS 1417L ERROR_CLIPBOARD_NOT_OPEN 1418L ERROR_HOTKEY_NOT_REGISTERED 1419L ERROR_WINDOW_NOT_DIALOG 1420L ERROR_CONTROL_ID_NOT_FOUND 1421L ERROR_INVALID_COMBOBOX_MESSAGE 1422L ERROR_WINDOW_NOT_COMBOBOX 1423L ERROR_INVALID_EDIT_HEIGHT 1424L ERROR_DC_NOT_FOUND 1425L ERROR_INVALID_HOOK_FILTER 1426L ERROR_INVALID_FILTER_PROC 1427L ERROR_HOOK_NEEDS_HMOD 1428L ERROR_GLOBAL_ONLY_HOOK 1429L ERROR_JOURNAL_HOOK_SET 1430L ERROR_HOOK_NOT_INSTALLED 1431L ERROR_INVALID_LB_MESSAGE 1432L ERROR_SETCOUNT_ON_BAD_LB 1433L ERROR_LB_WITHOUT_TABSTOPS 1434L ERROR_DESTROY_OBJECT_OF_OTHER_THREAD 1435L ERROR_CHILD_WINDOW_MENU 1436L ERROR_NO_SYSTEM_MENU 1437L ERROR_INVALID_MSGBOX_STYLE 1438L ERROR_INVALID_SPI_VALUE 1439L ERROR_SCREEN_ALREADY_LOCKED 1440L ERROR_HWNDS_HAVE_DIFF_PARENT 1441L ERROR_NOT_CHILD_WINDOW 1442L ERROR_INVALID_GW_COMMAND 1443L ERROR_INVALID_THREAD_ID 1444L ERROR_NON_MDICHILD_WINDOW 1445L ERROR_POPUP_ALREADY_ACTIVE 1446L ERROR_NO_SCROLLBARS 1447L ERROR_INVALID_SCROLLBAR_RANGE 1448L ERROR_INVALID_SHOWWIN_COMMAND 1449L ERROR_NO_SYSTEM_RESOURCES 1450L ERROR_NONPAGED_SYSTEM_RESOURCES 1451L ERROR_PAGED_SYSTEM_RESOURCES 1452L ERROR_WORKING_SET_QUOTA 1453L ERROR_PAGEFILE_QUOTA 1454L ERROR_COMMITMENT_LIMIT 1455L ERROR_MENU_ITEM_NOT_FOUND 1456L ERROR_INVALID_KEYBOARD_HANDLE 1457L ERROR_HOOK_TYPE_NOT_ALLOWED 1458L ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION 1459L ERROR_TIMEOUT 1460L ERROR_INVALID_MONITOR_HANDLE 1461L ERROR_EVENTLOG_FILE_CORRUPT 1500L ERROR_EVENTLOG_CANT_START 1501L ERROR_LOG_FILE_FULL 1502L ERROR_EVENTLOG_FILE_CHANGED 1503L ERROR_INSTALL_SERVICE_FAILURE 1601L ERROR_INSTALL_USEREXIT 1602L ERROR_INSTALL_FAILURE 1603L ERROR_INSTALL_SUSPEND 1604L ERROR_UNKNOWN_PRODUCT 1605L ERROR_UNKNOWN_FEATURE 1606L ERROR_UNKNOWN_COMPONENT 1607L ERROR_UNKNOWN_PROPERTY 1608L ERROR_INVALID_HANDLE_STATE 1609L ERROR_BAD_CONFIGURATION 1610L ERROR_INDEX_ABSENT 1611L ERROR_INSTALL_SOURCE_ABSENT 1612L ERROR_INSTALL_PACKAGE_VERSION 1613L ERROR_PRODUCT_UNINSTALLED 1614L ERROR_BAD_QUERY_SYNTAX 1615L ERROR_INVALID_FIELD 1616L ERROR_DEVICE_REMOVED 1617L ERROR_INSTALL_ALREADY_RUNNING 1618L ERROR_INSTALL_PACKAGE_OPEN_FAILED 1619L ERROR_INSTALL_PACKAGE_INVALID 1620L ERROR_INSTALL_UI_FAILURE 1621L ERROR_INSTALL_LOG_FAILURE 1622L ERROR_INSTALL_LANGUAGE_UNSUPPORTED 1623L ERROR_INSTALL_TRANSFORM_FAILURE 1624L ERROR_INSTALL_PACKAGE_REJECTED 1625L ERROR_FUNCTION_NOT_CALLED 1626L ERROR_FUNCTION_FAILED 1627L ERROR_INVALID_TABLE 1628L ERROR_DATATYPE_MISMATCH 1629L ERROR_UNSUPPORTED_TYPE 1630L ERROR_CREATE_FAILED 1631L ERROR_INSTALL_TEMP_UNWRITABLE 1632L ERROR_INSTALL_PLATFORM_UNSUPPORTED 1633L ERROR_INSTALL_NOTUSED 1634L ERROR_PATCH_PACKAGE_OPEN_FAILED 1635L ERROR_PATCH_PACKAGE_INVALID 1636L ERROR_PATCH_PACKAGE_UNSUPPORTED 1637L ERROR_PRODUCT_VERSION 1638L ERROR_INVALID_COMMAND_LINE 1639L ERROR_INSTALL_REMOTE_DISALLOWED 1640L ERROR_SUCCESS_REBOOT_INITIATED 1641L ERROR_PATCH_TARGET_NOT_FOUND 1642L ERROR_PATCH_PACKAGE_REJECTED 1643L ERROR_INSTALL_TRANSFORM_REJECTED 1644L ERROR_INSTALL_REMOTE_PROHIBITED 1645L */ static int esize = static_cast(sizeof(emap) / sizeof(ESTRINGS)); std::string &win_error_string(long err) { int mark = -1; for (int i = 0; i < esize; i++) { if (emap[i].ecode == err) { mark = i; break; } } if (mark == -1) return unknown; return emap[mark].estring; } #endif fldigi-4.1.06/src/misc/newinstall.cxx0000664000175000017500000003400313507402064014412 00000000000000// ---------------------------------------------------------------------------- // // newinstall.cxx // // Copyright (C) 2007-2014 Dave Freese, W1HKJ // Copyright (C) 2010 Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "macros.h" #include "main.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "record_browse.h" #include "logger.h" #include #include #include #include #include using namespace std; static string label[24]; static string text[24]; void newmacros() { label[0] = "RsID CQ"; text[0] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de pse k\n\ <@TXRSID:off>"; label[1] = "ANS @>|"; text[1] = "\ de kn\n\ "; label[2] ="QSO @>>"; text[2] = "\n\ de "; label[3] = "KN @||"; text[3] = " btu de k\n\ "; label[4] = "SK @||"; text[4] = "\n\ tnx fer QSO , 73, God bless.\n\ de sk\n\ "; label[5] = "Me/Qth"; text[5] = "\n\ op: \n\ qth: \n\ loc: \n"; label[6] = "Brag"; text[6] = "\n\ << , >>\n\ Age: \n\ Rig: \n\ Pwr: \n\ Ant: \n\ OS: \n\ Soft: \n\ Web: \n\ Email: "; label[7] = ""; text[7] = ""; label[8] = "T/R"; text[8] = ""; label[9] = "Tx @>>"; text[9] = ""; label[10] = "Rx @||"; text[10] = ""; label[11] = "TX @>|"; text[11] = "\n\ de k\n\ "; label[12] = "C Ans @>|"; text[12] = "de "; label[13] = "C rpt @>|"; text[13] = " QSL DE K\n\ "; label[14] = "C Rep @>|"; text[14] = "\n\ RR NBR TU DE K\n\ "; label[15] = "C Incr"; text[15] = ""; label[16] = "C Decr"; text[16] = ""; label[17] = "Log QSO"; text[17] = ""; label[18] = "CW-CQ @>|"; text[18] = "CQ CQ CQ DE CQ CQ CQ DE K"; label[19] = ""; text[19] = ""; label[20] = "CQ @-3+"; text[20] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de k"; label[21] = "CQ-ID @>|"; text[21] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de K\n\ "; label[22] = ""; text[22] = ""; label[23] = ""; text[23] = ""; for (int i = 0; i < 24; i++) { macros.text[i] = text[i]; macros.name[i] = label[i]; } for (int i = 24; i < MAXMACROS; i++) { macros.text[i] = ""; macros.name[i] = ""; } } struct paldata { const char *fname; const char *rgbstr0; const char *rgbstr1; const char *rgbstr2; const char *rgbstr3; const char *rgbstr4; const char *rgbstr5; const char *rgbstr6; const char *rgbstr7; const char *rgbstr8; }; paldata palfiles[] = { { "banana.pal", " 0; 0; 0", " 59; 59; 27","119;119; 59","179;179; 91","227;227;123", "235;235;151","239;239;183","247;247;219","255;255;255" }, { "blue1.pal"," 0; 0; 2", " 0; 0; 64"," 7; 11;128"," 39; 47;192"," 95;115;217", "151;179;231","187;203;239","219;227;247","255;255;255" }, { "blue2.pal"," 3; 3; 64", " 7; 11;128"," 39; 47;192"," 95;115;217","151;179;231", "187;203;239","219;227;247","255;255;255","255;253;108" }, { "blue3.pal"," 0; 0; 0", " 31; 31; 31"," 63; 63; 63"," 91; 91;167","119;119;191", "155;155;219","191;191;191","223;223;223","255;255;255" }, { "brown.pal"," 0; 0; 0", "107; 63; 11","175; 95; 31","199;119; 43","215;163; 63", "231;211; 87","243;247;111","247;251;179","255;255;255" }, { "cyan1.pal"," 0; 0; 0", " 5; 10; 10"," 22; 42; 42"," 52; 99; 99"," 94;175;175", "131;209;209","162;224;224","202;239;239","255;255;255" }, { "cyan2.pal"," 0; 0; 0", " 35; 51; 51"," 75;103;103","115;159;159","155;211;211", "183;231;231","203;239;239","227;247;247","255;255;255" }, { "cyan3.pal"," 0; 0; 0", " 94;114;114","138;162;162","171;201;201","199;232;232", "216;243;243","228;247;247","241;251;251","255;255;255" }, { "default.pal", " 0; 0; 0", " 0; 6;136"," 0; 19;198"," 0; 32;239","172;167;105", "194;198; 49","225;228;107","255;255; 0","255; 51; 0" }, { "digipan.pal"," 0; 0; 0", " 0; 0; 64"," 0; 0;128"," 0; 0;217","150;147; 92", "183;186; 46","225;228;107","255;255; 0","255; 51; 0" }, { "fldigi.pal"," 0; 0; 0", " 0; 0;177"," 3;110;227"," 0;204;204","223;223;223", " 0;234; 0","244;244; 0","250;126; 0","244; 0; 0" }, { "gmfsk.pal"," 0; 0;256", " 0; 62;194"," 0;126;130"," 0;190; 66"," 0;254; 2", " 62;194; 0","126;130; 0","190; 66; 0","254; 2; 0" }, { "gray1.pal"," 0; 0; 0", " 69; 69; 69"," 99; 99; 99","121;121;121","140;140;140", "157;157;157","172;172;172","186;186;186","199;199;199" }, { "gray2.pal"," 0; 0; 0", " 88; 88; 88","126;126;126","155;155;155","179;179;179", "200;200;200","220;220;220","237;237;237","254;254;254" }, { "green1.pal"," 0; 0; 0", " 0; 32; 0"," 0; 64; 0"," 0; 96; 0"," 0;128; 0", " 0;160; 0"," 0;192; 0"," 0;224; 0","255;255;255" }, { "green2.pal"," 0; 0; 0", " 0; 60; 0"," 0;102; 0"," 0;151; 0"," 0;242; 0", "255;255; 89","240;120; 0","255;148; 40","255; 0; 0" }, { "jungle.pal"," 0; 0; 0", "107; 67; 0","223;143; 0","255;123; 27","255; 91; 71", "255;195; 95","195;255;111","151;255;151","255;255;255" }, { "negative.pal","255;255;255", "223;223;223","191;191;191","159;159;159","127;127;127", " 95; 95; 95"," 63; 63; 63"," 31; 31; 31"," 0; 0; 0" }, { "orange.pal"," 0; 0; 0", " 63; 27; 0","131; 63; 0","199; 95; 0","251;127; 11", "251;155; 71","251;187;131","251;219;191","255;255;255" }, { "pink.pal"," 0; 0; 0", " 63; 35; 35","135; 75; 75","203;111;111","255;147;147", "255;175;175","255;199;199","255;227;227","255;255;255" }, { "rainbow.pal"," 0; 0;163", " 0; 87;191"," 0;207;219"," 0;247;139"," 0;255; 23", " 95;255; 0","219;255; 0","255;171;155","255;255;255" }, { "scope.pal"," 0; 0; 0", " 0; 0;167"," 0; 79;255"," 0;239;255"," 0;255; 75", " 95;255; 0","255;255; 0","255;127; 0","255; 0; 0" }, { "sunburst.pal"," 0; 0; 0", " 0; 0; 59"," 0; 0;123","131; 0;179","235; 0; 75", "255; 43; 43","255;215;111","255;255;183","255;255;255" }, { "vk4bdj.pal"," 0; 0; 0", " 0; 32; 0"," 0;154; 0"," 0;161; 0"," 0;177; 0", "156;209;144","192;185;183","214;222;224","255;255;255" }, { "yellow1.pal", " 0; 0; 0", " 31; 31; 0"," 63; 63; 0"," 95; 95; 0","127;127; 0", "159;159; 0","191;191; 0","223;223; 0","255;255; 0" }, { "yellow2.pal", " 0; 0; 0", " 39; 39; 0"," 75; 75; 0","111;111; 0","147;147; 0", "183;183; 0","219;219; 0","255;255; 0","255;255;255" }, { "yl2kf.pal"," 0; 0; 0", " 0; 0;119"," 7; 11;195"," 39; 47;159"," 95;115;203", "151;179;255","187;203;255","219;227;255","255;255; 5" }, { 0,0, 0,0,0,0, 0,0,0,0 } }; void create_new_palettes() { paldata *pd = palfiles; string Filename; while (pd->fname) { Filename = PalettesDir; Filename.append(pd->fname); ofstream pfile(Filename.c_str()); pfile << pd->rgbstr0 << endl; pfile << pd->rgbstr1 << endl; pfile << pd->rgbstr2 << endl; pfile << pd->rgbstr3 << endl; pfile << pd->rgbstr4 << endl; pfile << pd->rgbstr5 << endl; pfile << pd->rgbstr6 << endl; pfile << pd->rgbstr7 << endl; pfile << pd->rgbstr8 << endl; pfile.close(); pd++; } } void create_new_macros() { string Filename = MacrosDir; Filename.append("macros.mdf"); newmacros(); macros.saveMacros(Filename); } // ============================================================================= #include #include #include #include #include #include #include #include "configuration.h" #include "confdialog.h" #include "icons.h" #include "gettext.h" class Wizard : public Fl_Window { public: struct wizard_tab { Fl_Group* tab; Fl_Group* parent; int position; int x, y, w, h; }; Wizard(int w, int h, const char* l = 0) : Fl_Window(w, h, l), pad(4) { create_wizard(); } ~Wizard() { destroy_wizard(); } private: void create_wizard(void); Fl_Group* make_intro(void); void destroy_wizard(void); void place_buttons(void); static void wizard_cb(Fl_Widget* w, void* arg); int pad; Fl_Wizard *wizard; Fl_Button *cancel, *prev, *next, *done; typedef vector tab_t; tab_t tabs; Fl_Group* header; Fl_Box* title; }; void Wizard::create_wizard(void) { callback(wizard_cb, this); xclass(PACKAGE_TARNAME); int btn_w = 100, btn_h = 22, icon_pad = 16; wizard = new Fl_Wizard(0, 0, w(), h() - btn_h - 2 * pad); wizard->end(); // create the buttons fl_font(FL_HELVETICA, FL_NORMAL_SIZE); struct { Fl_Button** button; const char* label; int align; } buttons[] = { { &done, icons::make_icon_label(_("Finish"), apply_icon), FL_ALIGN_LEFT }, { &next, icons::make_icon_label(_("Next"), right_arrow_icon), FL_ALIGN_RIGHT }, { &prev, icons::make_icon_label(_("Back"), left_arrow_icon), FL_ALIGN_LEFT }, // { &cancel, icons::make_icon_label(_("Cancel"), process_stop_icon), FL_ALIGN_LEFT } { &cancel, icons::make_icon_label(_("Close"), close_icon), FL_ALIGN_LEFT } }; for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { Fl_Button* b = *buttons[i].button = new Fl_Button(0, wizard->y() + wizard->h() + pad, btn_w, btn_h, buttons[i].label); b->callback(wizard_cb, this); icons::set_icon_label(b); b->align(buttons[i].align | FL_ALIGN_INSIDE); b->size(static_cast(fl_width(icons::get_icon_label_text(b)) + icon_pad * 2), b->h()); } icons::set_active(prev, false); done->hide(); place_buttons(); end(); position(MAX(0, fl_digi_main->x() + (fl_digi_main->w() - w()) / 2), MAX(0, fl_digi_main->y() + (fl_digi_main->h() - h()) / 2)); // populate the Fl_Wizard group struct wizard_tab tabs_[] = { { NULL }, { tabOperator }, { tabSoundCard }, { tabRig }, { tabDataFiles }, }; tabs.resize(sizeof(tabs_)/sizeof(*tabs_)); memcpy(&tabs[0], tabs_, sizeof(tabs_)); for (tab_t::iterator i = tabs.begin() + 1; i != tabs.end(); ++i) { i->parent = i->tab->parent(); i->position = i->parent->find(i->tab); i->x = i->tab->x(); i->y = i->tab->y(); i->w = i->tab->w(); i->h = i->tab->h(); } tabs[0].tab = make_intro(); for (tab_t::iterator i = tabs.begin(); i != tabs.end(); ++i) wizard->add(i->tab); wizard->value(tabs[0].tab); } void Wizard::destroy_wizard(void) { // re-parent tabs for (tab_t::const_iterator i = tabs.begin() + 1; i != tabs.end(); ++i) { i->parent->insert(*i->tab, i->position); i->tab->resize(i->x, i->y, i->w, i->h); i->parent->init_sizes(); } Fl_Button* b[] = { cancel, prev, next, done }; for (size_t i = 0; i < sizeof(b)/sizeof(*b); i++) icons::free_icon_label(b[i]); header->parent()->remove(header); delete header; } void Wizard::place_buttons(void) { Fl_Button* buttons[] = { next->visible() ? next : done, prev, cancel }; int x = wizard->x() + wizard->w(); for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { buttons[i]->position(x - buttons[i]->w() - pad, buttons[i]->y()); x = buttons[i]->x(); } } void Wizard::wizard_cb(Fl_Widget* w, void* arg) { Wizard* wiz = static_cast(arg); if (w == wiz || w == wiz->cancel || w == wiz->done) { delete wiz; return; } if (w == wiz->prev) wiz->wizard->prev(); else if (w == wiz->next) wiz->wizard->next(); Fl_Group* cur = static_cast(wiz->wizard->value()); // insert header group in current tab, relabel title cur->insert(*wiz->header, 0); const char* text = cur->tooltip(); if (!text || !*text) text = cur->label(); wiz->title->label(text); // modify buttons if (cur == wiz->tabs[0].tab) icons::set_active(wiz->prev, false); else if (cur == wiz->tabs[1].tab) icons::set_active(wiz->prev, true); else if (cur == wiz->tabs.back().tab) { wiz->done->show(); wiz->next->hide(); wiz->place_buttons(); } else { wiz->done->hide(); wiz->next->show(); wiz->place_buttons(); } } Fl_Group* Wizard::make_intro(void) { int hdr_h = 20, ttl_w = 300, ttl_y = 2, hlp_h = 200; Fl_Group* intro = new Fl_Group(wizard->x(), wizard->y(), wizard->w(), wizard->h(), label()); header = new Fl_Group(0, 0, wizard->w(), hdr_h); title = new Fl_Box(0, ttl_y, ttl_w, header->h()); title->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); title->labelfont(FL_HELVETICA_BOLD); title->labelsize(FL_NORMAL_SIZE + 1); title->label(intro->label()); header->end(); ostringstream help_; help_ << '\n' << _("The wizard will guide you through the basic fldigi settings") << ":\n\n"; help_ << "\t- Operator\n"; help_ << "\t- Sound Card Interface\n"; help_ << "\t- Transceiver control\n"; help_ << "\t- Miscellaneous Data Files\n"; help_ << '\n' << _("Feel free to skip any pages or exit the wizard at any time") << ". " << _("All settings shown here can be changed later via the Configure menu") << '.'; Fl_Box* help = new Fl_Box(pad, header->y() + header->h() + pad, intro->w() - 2 * pad, hlp_h); help->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_WRAP); help->copy_label(help_.str().c_str()); intro->end(); return intro; } void show_wizard(int argc, char** argv) { Wizard* w = new Wizard(dlgConfig->w(), dlgConfig->h(), _("Fldigi configuration wizard")); if (argc && argv) w->show(argc, argv); else { w->show(); w->set_modal(); } first_use = true; } fldigi-4.1.06/src/misc/icons.cxx0000644000175000017500000001466413472115773013367 00000000000000// ---------------------------------------------------------------------------- // icons.cxx // // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "icons.h" #include #include #include #include #if USE_IMAGE_LABELS # include # include # include # include # include # include #endif using namespace std; namespace icons { #if USE_IMAGE_LABELS typedef map imap_t; static imap_t* imap = 0; #endif #define FL_EMPTY_LABEL FL_FREE_LABELTYPE static void draw_empty(const Fl_Label*, int, int, int, int, Fl_Align) { } static void measure_empty(const Fl_Label*, int& w, int& h) { w = h = 0; } // The following functions create image+text menu item labels. // You've had too much FLTK if you already know how to do that. // Return a multi_label pointer, cast to a string, for `text' and // `pixmap'. This goes into the label pointer of a widget or menu // item. The text label is copied if we are using multi labels. You must // call set_icon_label on the widget or menu item before its draw() // function is called for the first time. // // A NULL pixmap means that the caller wants an empty, transparent, icon. const char* make_icon_label(const char* text, const char** pixmap) { #if USE_IMAGE_LABELS static imap_t* imap_ = 0; if (unlikely(!imap_)) { imap = imap_ = new imap_t; Fl::set_labeltype(FL_EMPTY_LABEL, draw_empty, measure_empty); } // Create a multi label and associate it with an Fl_Image* array Fl_Multi_Label* mlabel = new Fl_Multi_Label; Fl_Image** images = new Fl_Image*[2]; images[0] = new Fl_Pixmap(pixmap ? pixmap : clear_row_icon); images[1] = 0; // we create this on demand // set_icon_label_ will set mlabel->labela later mlabel->typea = _FL_IMAGE_LABEL; if (!text) text = ""; size_t len = strlen(text); char* s = new char[len + 2]; s[0] = ' '; memcpy(s + 1, text, len + 1); mlabel->labelb = s; mlabel->typeb = FL_NORMAL_LABEL; (*imap)[mlabel] = images; return (const char*)mlabel; #else return text; #endif } #if USE_IMAGE_LABELS // Find the item's label, which should be something that was returned by // make_icon_label, and set the active or inactive image. template void set_icon_label_(T* item) { imap_t::iterator j = imap->find((Fl_Multi_Label*)(item->label())); if (j == imap->end()) return; Fl_Multi_Label* mlabel = j->first; Fl_Image** images = j->second; unsigned char i = !item->active(); if (!images[i]) { // create inactive version of other image images[i] = images[!i]->copy(); images[i]->inactive(); } if (mlabel->typea == _FL_IMAGE_LABEL) mlabel->labela = (const char*)images[i]; else mlabel->labelb = (const char*)images[i]; item->image(images[i]); mlabel->label(item); item->labeltype(_FL_MULTI_LABEL); } #endif void set_icon_label(Fl_Menu_Item* item) { #if USE_IMAGE_LABELS set_icon_label_(item); #else // this isn't needed but it simplifies fldigi's UI setup code if (item->labeltype() == _FL_MULTI_LABEL) item->labeltype(FL_NORMAL_LABEL); #endif } void set_icon_label(Fl_Widget* w) { #if USE_IMAGE_LABELS set_icon_label_(w); w->image(0); #else if (w->labeltype() == _FL_MULTI_LABEL) w->labeltype(FL_NORMAL_LABEL); #endif } void toggle_icon_labels(void) { #if USE_IMAGE_LABELS for (imap_t::iterator i = imap->begin(); i != imap->end(); ++i) { // swap sublabels const char* l = i->first->labela; i->first->labela = i->first->labelb; i->first->labelb = l; if (i->first->typea == _FL_IMAGE_LABEL) { i->first->typea = FL_NORMAL_LABEL; i->first->typeb = FL_EMPTY_LABEL; i->first->labela++; } else { i->first->typea = _FL_IMAGE_LABEL; i->first->typeb = FL_NORMAL_LABEL; i->first->labelb--; } } #endif } template const char* get_icon_label_text_(T* item) { #if USE_IMAGE_LABELS if (item->labeltype() == _FL_MULTI_LABEL) { imap_t::iterator i = imap->find((Fl_Multi_Label*)(item->label())); if (i == imap->end()) return 0; if (i->first->typeb == FL_NORMAL_LABEL) return i->first->labelb + 1; else // disabled icons return i->first->labela; } else #endif return item->label(); } const char* get_icon_label_text(Fl_Menu_Item* item) { return get_icon_label_text_(item); } const char* get_icon_label_text(Fl_Widget* w) { return get_icon_label_text_(w); } template void free_icon_label_(T* item) { #if USE_IMAGE_LABELS if (item->labeltype() == FL_NORMAL_LABEL) { delete [] item->label(); item->label(0); return; } imap_t::iterator i = imap->find((Fl_Multi_Label*)item->label()); if (i == imap->end()) return; item->label(0); // delete the images delete i->second[0]; delete i->second[1]; delete [] i->second; // delete the multi label delete [] ((i->first->typeb == FL_NORMAL_LABEL) ? i->first->labelb : i->first->labela-1); delete i->first; imap->erase(i); #endif } void free_icon_label(Fl_Menu_Item* item) { free_icon_label_(item); } void free_icon_label(Fl_Widget* w) { free_icon_label_(w); } template void set_active_(T* t, bool v) { if (v) t->activate(); else t->deactivate(); if (t->labeltype() == _FL_MULTI_LABEL) set_icon_label(t); } void set_active(Fl_Menu_Item* item, bool v) { set_active_(item, v); } void set_active(Fl_Widget* w, bool v) { set_active_(w, v); } static Fl_Image* msg_icon; void set_message_icon(const char** pixmap) { if (msg_icon && msg_icon->data() == pixmap) return; delete msg_icon; Fl_Widget* msg = fl_message_icon(); msg->label(""); msg->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE); msg->color(msg->parent()->color()); msg->box(FL_NO_BOX); msg->image(msg_icon = new Fl_Pixmap(pixmap)); } } // icons fldigi-4.1.06/src/misc/threads.cxx0000644000175000017500000000627613472115773013706 00000000000000// ---------------------------------------------------------------------------- // threads.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "threads.h" THREAD_ID_TYPE thread_id_; #include "timeops.h" #if !HAVE_SEM_TIMEDWAIT # include # include # include # include int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout) { int r; for (;;) { r = sem_trywait(sem); if (r == 0 || (r == -1 && errno != EAGAIN)) return r; if (abs_timeout->tv_nsec < 0 || abs_timeout->tv_nsec >= 1000000000L) { errno = EINVAL; return -1; } struct timespec now; clock_gettime(CLOCK_REALTIME, &now); if (now == *abs_timeout || now > *abs_timeout) { errno = ETIMEDOUT; return -1; } usleep(100); } } #endif // !HAVE_SEM_TIMEDWAIT int sem_timedwait_rel(sem_t* sem, double rel_timeout) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); t = t + rel_timeout; return sem_timedwait(sem, &t); } int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); t = t + rel_timeout; return pthread_cond_timedwait(cond, mutex, &t); } #ifndef NDEBUG bool thread_in_list(int id, const int* list) { while (*list != INVALID_TID) if (id == *list++) return true; return false; } #endif #ifdef __linux__ # ifndef _GNU_SOURCE # define _GNU_SOURCE # endif # include # include # include "debug.h" void linux_log_tid(void) { LOG_DEBUG(PACKAGE_TARNAME " thread %" PRIdPTR " is LWP %ld", GET_THREAD_ID(), syscall(SYS_gettid)); } #endif // Synchronization objects. guard_lock::guard_lock(pthread_mutex_t* m) : mutex(m) { pthread_mutex_lock(mutex); } guard_lock::~guard_lock(void) { pthread_mutex_unlock(mutex); } syncobj::syncobj() { pthread_mutex_init( & m_mutex, NULL ); pthread_cond_init( & m_cond, NULL ); } syncobj::~syncobj() { pthread_mutex_destroy( & m_mutex ); pthread_cond_destroy( & m_cond ); } void syncobj::signal() { int rc = pthread_cond_signal( &m_cond ); if( rc ) { throw std::runtime_error(strerror(rc)); } } bool syncobj::wait( double seconds ) { int rc = pthread_cond_timedwait_rel( &m_cond, &m_mutex, seconds ); switch( rc ) { case 0 : return true ; default : throw std::runtime_error(strerror(rc)); case ETIMEDOUT: return false ; } } fldigi-4.1.06/src/misc/dxcc.cxx0000644000175000017500000003004613472115773013165 00000000000000// ---------------------------------------------------------------------------- // dxcc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "fileselect.h" #include "gettext.h" #include "dxcc.h" #include "debug.h" #include "configuration.h" #include "confdialog.h" #include "main.h" using namespace std; #if HAVE_STD_HASH # include using std::unordered_map; #elif HAVE_STD_TR1_HASH # include using tr1::unordered_map; #else # error "No std::hash or std::tr1::hash support" #endif dxcc::dxcc(const char* cn, int cq, int itu, const char* ct, float lat, float lon, float tz) : country(cn), cq_zone(cq), itu_zone(itu), latitude(lat), longitude(lon), gmt_offset(tz) { if (*ct) { continent[0] = ct[0]; continent[1] = ct[1]; } continent[2] = '\0'; } typedef unordered_map dxcc_map_t; typedef vector dxcc_list_t; static dxcc_map_t* cmap = 0; static dxcc_list_t* clist = 0; static vector* cnames = 0; static list lnames; string cbolist; static void add_prefix(string& prefix, dxcc* entry); extern std::string s_ctydat; // comparison, not case sensitive. static bool compare_nocase (const std::string& first, const std::string& second) { unsigned int i=0; while ( (i tolower(second[i])) return false; ++i; } return ( first.length() < second.length() ); } bool dxcc_internal_data() { std::string tempfname = HomeDir; tempfname.append("/temp/ctydat.txt"); ofstream out(tempfname.c_str()); if (!out) { LOG_INFO("Could not write temp file %s", tempfname.c_str()); return false; } out << s_ctydat; out.close(); ifstream in(tempfname.c_str()); if (!in) { LOG_INFO("Could not read temp file %s", tempfname.c_str()); return false; } LOG_INFO("Using internal cty.dat data"); cmap = new dxcc_map_t; cnames = new vector; // this MUST be greater than the actual number of dcxx entities or // the Windows gcc string library will move all of the strings and // destroy the integrity of the cmap c_str() pointer to the country // string in cnames cnames->reserve(500); // approximate number of dxcc entities clist = new dxcc_list_t; clist->reserve(500); dxcc* entry; string record; unsigned nrec = 0; while (getline(in, record, ';')) { istringstream is(record); entry = new dxcc; nrec++; // read country name cnames->resize(cnames->size() + 1); clist->push_back(entry); getline(is, cnames->back(), ':'); entry->country = cnames->back().c_str(); lnames.push_back(entry->country); // cq zone (is >> entry->cq_zone).ignore(); // itu zone (is >> entry->itu_zone).ignore(); // continent (is >> ws).get(entry->continent, 3).ignore(); // latitude (is >> entry->latitude).ignore(); // longitude (is >> entry->longitude).ignore(); // gmt offset (is >> entry->gmt_offset).ignore(256, '\n'); // prefixes and exceptions int c; string prefix; while ((c = is.peek()) == ' ' || c == '\n') { is >> ws; while (getline(is, prefix, ',')) { add_prefix(prefix, entry); if ((c = is.peek()) == '\n') break; } } if (cnames->back() == "United States") { dxcc *usa_entry = new dxcc( "USA", entry->cq_zone, entry->itu_zone, entry->continent, entry->latitude, entry->longitude, entry->gmt_offset ); nrec++; cnames->resize(cnames->size() + 1); clist->push_back(usa_entry); lnames.push_back("USA"); } in >> ws; } lnames.sort(compare_nocase); cbolist.clear(); list::iterator p = lnames.begin(); while (p != lnames.end()) { cbolist.append(*p); p++; if (p != lnames.end()) cbolist.append("|"); } stringstream info; info << "\nLoaded " << cmap->size() << " prefixes for " << nrec << " countries from internal cty.dat\n" << "You should download the latest from http://www.country-files.com"; LOG_INFO("%s", info.str().c_str()); remove(tempfname.c_str()); return true; } bool dxcc_open(const char* filename) { if (cmap) { LOG_INFO("cty.dat already loaded"); return true; } ifstream in(filename); if (!in) { LOG_INFO("Could not read contest country file \"%s\"", filename); return dxcc_internal_data(); } cmap = new dxcc_map_t; cnames = new vector; // this MUST be greater than the actual number of dcxx entities or // the Windows gcc string library will move all of the strings and // destroy the integrity of the cmap c_str() pointer to the country // string in cnames cnames->reserve(500); // approximate number of dxcc entities clist = new dxcc_list_t; clist->reserve(500); dxcc* entry; string record; unsigned nrec = 0; while (getline(in, record, ';')) { istringstream is(record); entry = new dxcc; nrec++; // read country name cnames->resize(cnames->size() + 1); clist->push_back(entry); getline(is, cnames->back(), ':'); entry->country = cnames->back().c_str(); lnames.push_back(entry->country); // cq zone (is >> entry->cq_zone).ignore(); // itu zone (is >> entry->itu_zone).ignore(); // continent (is >> ws).get(entry->continent, 3).ignore(); // latitude (is >> entry->latitude).ignore(); // longitude (is >> entry->longitude).ignore(); // gmt offset (is >> entry->gmt_offset).ignore(256, '\n'); // prefixes and exceptions int c; string prefix; while ((c = is.peek()) == ' ' || c == '\r' || c == '\n') { is >> ws; while (getline(is, prefix, ',')) { add_prefix(prefix, entry); if ((c = is.peek()) == '\r' || c == '\n') break; } } if (cnames->back() == "United States") { dxcc *usa_entry = new dxcc( "USA", entry->cq_zone, entry->itu_zone, entry->continent, entry->latitude, entry->longitude, entry->gmt_offset ); nrec++; cnames->resize(cnames->size() + 1); clist->push_back(usa_entry); lnames.push_back("USA"); } in >> ws; } lnames.sort(compare_nocase); cbolist.clear(); list::iterator p = lnames.begin(); while (p != lnames.end()) { cbolist.append(*p); p++; if (p != lnames.end()) cbolist.append("|"); } stringstream info; info << "Loaded " << cmap->size() << " prefixes for " << nrec << " countries"; LOG_VERBOSE("%s", info.str().c_str()); return true; } bool dxcc_is_open(void) { return cmap; } void dxcc_close(void) { if (!cmap) return; delete cnames; cnames = 0; map rm; for (dxcc_map_t::iterator i = cmap->begin(); i != cmap->end(); ++i) if (rm.insert(make_pair(i->second, true)).second) delete i->second; delete cmap; cmap = 0; delete clist; clist = 0; } const vector* dxcc_entity_list(void) { return clist; } const dxcc* dxcc_lookup(const char* callsign) { if (!cmap || !callsign || !*callsign) return NULL; string sstr; sstr.resize(strlen(callsign) + 1); transform(callsign, callsign + sstr.length() - 1, sstr.begin() + 1, static_cast(toupper)); // first look for a full callsign (prefixed with '=') sstr[0] = '='; dxcc_map_t::const_iterator entry = cmap->find(sstr); if (entry != cmap->end()) { return entry->second; } // erase the '=' and do a longest prefix search sstr.erase(0, 1); size_t len = sstr.length(); // accomodate special case for KG4... calls // all two letter suffix KG4 calls are Guantanamo // all others are US non Guantanamo if (sstr.find("KG4") != string::npos) { if (len == 4 || len == 6) { sstr = "K"; len = 1; } } do { sstr.resize(len--); if ((entry = cmap->find(sstr)) != cmap->end()) { return entry->second; } } while (len); return NULL; } static void add_prefix(string& prefix, dxcc* entry) { string::size_type i = prefix.find_first_of("([<{"); if (likely(i == string::npos)) { (*cmap)[prefix] = entry; return; } string::size_type j = i, first = i; do { entry = new struct dxcc(*entry); switch (prefix[i++]) { // increment i past opening bracket case '(': if ((j = prefix.find(')', i)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->cq_zone = atoi(prefix.data() + i); break; case '[': if ((j = prefix.find(']', i)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->itu_zone = atoi(prefix.data() + i); break; case '<': if ((j = prefix.find('/', i)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->latitude = atof(prefix.data() + i); if ((j = prefix.find('>', j)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->longitude = atof(prefix.data() + i); break; case '{': if ((j = prefix.find('}', i)) == string::npos) { delete entry; return; } memcpy(entry->continent, prefix.data() + i, 2); break; } } while ((i = prefix.find_first_of("([<{", j)) != string::npos); prefix.erase(first); (*cmap)[prefix] = entry; } typedef unordered_map qsl_map_t; static qsl_map_t* qsl_calls; static unsigned char qsl_open_; const char* qsl_names[] = { "LoTW", "eQSL" }; bool qsl_open(const char* filename, qsl_t qsl_type) { ifstream in(filename); if (!in) return false; if (!qsl_calls) qsl_calls = new qsl_map_t; size_t n = qsl_calls->size(); string::size_type p; string s; s.reserve(32); while (getline(in, s)) { if ((p = s.rfind('\r')) != string::npos) s.erase(p); (*qsl_calls)[s] |= (1 << qsl_type); } stringstream info; info << "Added " << qsl_calls->size() - n << " " << qsl_names[qsl_type] << " callsigns from \"" << filename << "\""; LOG_VERBOSE("%s", info.str().c_str()); qsl_open_ |= (1 << qsl_type); return true; } unsigned char qsl_is_open(void) { return qsl_open_; } void qsl_close(void) { delete qsl_calls; qsl_calls = 0; qsl_open_ = 0; } unsigned char qsl_lookup(const char* callsign) { if (qsl_calls == 0) return 0; string str; str.resize(strlen(callsign)); transform(callsign, callsign + str.length(), str.begin(), static_cast(toupper)); qsl_map_t::const_iterator i = qsl_calls->find(str); return i == qsl_calls->end() ? 0 : i->second; } void reload_cty_dat() { dxcc_close(); dxcc_open(string(progdefaults.cty_dat_pathname).append("cty.dat").c_str()); qsl_close(); qsl_open(string(progdefaults.cty_dat_pathname).append("lotw1.txt").c_str(), QSL_LOTW); if (!qsl_open(string(progdefaults.cty_dat_pathname).append("eqsl.txt").c_str(), QSL_EQSL)) qsl_open(string(progdefaults.cty_dat_pathname).append("AGMemberList.txt").c_str(), QSL_EQSL); } void default_cty_dat_pathname() { progdefaults.cty_dat_pathname = HomeDir; txt_cty_dat_pathname->value(progdefaults.cty_dat_pathname.c_str()); } void select_cty_dat_pathname() { string deffilename = progdefaults.cty_dat_pathname; const char *p = FSEL::select(_("Locate cty.dat folder"), _("cty.dat\t*"), deffilename.c_str()); if (p) { string nupath = p; size_t ptr; //crappy win32 again ptr = nupath.find("\\"); while (ptr != string::npos) { nupath[ptr] = '/'; ptr = nupath.find("\\"); } size_t endslash = nupath.rfind("/"); if ((endslash != string::npos) && (endslash != (nupath.length()-1))) nupath.erase(endslash + 1); progdefaults.cty_dat_pathname = nupath; progdefaults.changed = true; txt_cty_dat_pathname->value(nupath.c_str()); } } fldigi-4.1.06/src/misc/timeops.cxx0000664000175000017500000001247713507402064013725 00000000000000// ---------------------------------------------------------------------------- // timeops.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "timeops.h" #ifdef __MINGW32__ # include "compat.h" #endif #if !HAVE_CLOCK_GETTIME # ifdef __APPLE__ # include # define CLOCK_REALTIME 0 # define CLOCK_MONOTONIC 6 # endif # if TIME_WITH_SYS_TIME # include # endif # include int clock_gettime(clockid_t clock_id, struct timespec* tp) { if (clock_id == CLOCK_REALTIME) { struct timeval t; if (unlikely(gettimeofday(&t, NULL) != 0)) return -1; tp->tv_sec = t.tv_sec; tp->tv_nsec = t.tv_usec * 1000; } else if (clock_id == CLOCK_MONOTONIC) { #if defined(__WOE32__) int32_t msec = GetTickCount(); tp->tv_sec = msec / 1000; tp->tv_nsec = (msec % 1000) * 1000000; #elif defined(__APPLE__) static mach_timebase_info_data_t info = { 0, 0 }; if (unlikely(info.denom == 0)) mach_timebase_info(&info); uint64_t t = mach_absolute_time() * info.numer / info.denom; tp->tv_sec = t / 1000000000; tp->tv_nsec = t % 1000000000; #endif } else { errno = EINVAL; return -1; } return 0; } #endif // !HAVE_CLOCK_GETTIME struct timespec operator+(const struct timespec &t0, const double &t) { struct timespec r; r.tv_sec = t0.tv_sec + static_cast(t); r.tv_nsec = t0.tv_nsec + static_cast((t - static_cast(t)) * 1e9); if (r.tv_nsec > 1000000000) { r.tv_nsec -= 1000000000; r.tv_sec++; } return r; } struct timespec operator-(const struct timespec &t0, const struct timespec &t1) { struct timespec r = t0; if (r.tv_nsec < t1.tv_nsec) { --r.tv_sec; r.tv_nsec += 1000000000L; } r.tv_sec -= t1.tv_sec; r.tv_nsec -= t1.tv_nsec; return r; } struct timespec& operator-=(struct timespec &t0, const struct timespec &t1) { if (t0.tv_nsec < t1.tv_nsec) { --t0.tv_sec; t0.tv_nsec += 1000000000L; } t0.tv_sec -= t1.tv_sec; t0.tv_nsec -= t1.tv_nsec; return t0; } bool operator>(const struct timespec &t0, const struct timespec &t1) { if (t0.tv_sec == t1.tv_sec) return t0.tv_nsec > t1.tv_nsec; else if (t0.tv_sec > t1.tv_sec) return true; else return false; } bool operator==(const struct timespec &t0, const struct timespec &t1) { return t0.tv_sec == t1.tv_sec && t0.tv_nsec == t1.tv_nsec; } struct timeval operator+(const struct timeval &t0, const double &t) { struct timeval r; r.tv_sec = t0.tv_sec + static_cast(t); r.tv_usec = t0.tv_usec + static_cast((t - static_cast(t)) * 1e9); if (r.tv_usec > 1000000) { r.tv_usec -= 1000000; r.tv_sec++; } return r; } struct timeval operator-(const struct timeval &t0, const struct timeval &t1) { struct timeval r = t0; if (r.tv_usec < t1.tv_usec) { --r.tv_sec; r.tv_usec += 1000000; } r.tv_sec -= t1.tv_sec; r.tv_usec -= t1.tv_usec; return r; } struct timeval& operator-=(struct timeval &t0, const struct timeval &t1) { if (t0.tv_usec < t1.tv_usec) { --t0.tv_sec; t0.tv_usec += 1000000L; } t0.tv_sec -= t1.tv_sec; t0.tv_usec -= t1.tv_usec; return t0; } bool operator>(const struct timeval &t0, const struct timeval &t1) { if (t0.tv_sec == t1.tv_sec) return t0.tv_usec > t1.tv_usec; else if (t0.tv_sec > t1.tv_sec) return true; else return false; } bool operator==(const struct timeval &t0, const struct timeval &t1) { return t0.tv_sec == t1.tv_sec && t0.tv_usec == t1.tv_usec; } #ifndef HAVE_GMTIME_R #include "threads.h" static pthread_mutex_t gmtime_r_mutex = PTHREAD_MUTEX_INITIALIZER; struct tm *gmtime_r(const time_t *_Time, struct tm *_Tm) { pthread_mutex_lock (&gmtime_r_mutex); struct tm *p = gmtime(_Time); if (p && _Tm) memcpy (_Tm, p, sizeof (struct tm)); pthread_mutex_unlock (&gmtime_r_mutex); return p; } static pthread_mutex_t gmtime_local_mutex = PTHREAD_MUTEX_INITIALIZER; struct tm *localtime_r(const time_t *_Time,struct tm *_Tm) { pthread_mutex_lock (&gmtime_local_mutex); struct tm *p = localtime(_Time); if (p && _Tm) memcpy (_Tm, p, sizeof (struct tm)); pthread_mutex_unlock (&gmtime_local_mutex); return p; } #endif fldigi-4.1.06/src/misc/locator.cxx0000644000175000017500000004200113472115773013701 00000000000000/** * \addtogroup utilities * @{ */ /** * \file src/locator.cxx * \brief locator and bearing conversion interface * \author Stephane Fillod and the Hamlib Group * \date 2000-2006 * * Hamlib Interface - locator, bearing, and conversion calls */ /* * Hamlib Interface - locator and bearing conversion calls * Copyright (c) 2001-2006 by Stephane Fillod * Copyright (c) 2003 by Nate Bargmann * Copyright (c) 2003 by Dave Hines * * $Id$ * * Code to determine bearing and range was taken from the Great Circle, * by S. R. Sampson, N5OWK. * Ref: "Air Navigation", Air Force Manual 51-40, 1 February 1987 * Ref: "ARRL Satellite Experimenters Handbook", August 1990 * * Code to calculate distance and azimuth between two Maidenhead locators, * taken from wwl, by IK0ZSN Mirko Caserta. * * New bearing code added by N0NB was found at: * http://williams.best.vwh.net/avform.htm#Crs * * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA. * */ /*! \page hamlib Hamlib general purpose API * * Here are grouped some often used functions, like locator conversion * routines. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "configuration.h" #include "locator.h" namespace QRB { #define RADIAN (180.0 / M_PI) /* arc length for 1 degree, 60 Nautical Miles * 109.728 Kilometers * 68.182 statute miles * arc length for 1 radian, 6286.951 Km * 3437.746 Nm * 3906.41 Sm */ #define ARC_IN_KM 6372.5639 #define ARC_IN_NM 3484.5603 #define ARC_IN_SM 3959.7276 /* The following is contributed by Dave Hines M1CXW * * begin dph */ /* * These are the constants used when converting between Maidenhead grid * locators and longitude/latitude values. MAX_LOCATOR_PAIRS is the maximum * number of locator character pairs to convert. This number MUST NOT exceed * the number of pairs of values in loc_char_range[]. * Setting MAX_LOCATOR_PAIRS to 3 will convert the currently defined 6 * character locators. A value of 4 will convert the extended 8 character * locators described in section 3L of "The IARU region 1 VHF managers * handbook". Values of 5 and 6 will extent the format even more, to the * longest definition I have seen for locators, see * http://www.btinternet.com/~g8yoa/geog/non-ra.html * Beware that there seems to be no universally accepted standard for 10 & 12 * character locators. * * The ranges of characters which will be accepted by locator2longlat, and * generated by longlat2locator, are specified by the loc_char_range[] array. * This array may be changed without requiring any other code changes. * * For the fifth pair to range from aa to xx use: * const static int loc_char_range[] = { 18, 10, 24, 10, 24, 10 }; * * For the fifth pair to range from aa to yy use: * const static int loc_char_range[] = { 18, 10, 24, 10, 25, 10 }; * * MAX_LOCATOR_PAIRS now sets the limit locator2longlat() will convert and * sets the maximum length longlat2locator() will generate. Each function * properly handles any value from 1 to 6 so MAX_LOCATOR_PAIRS should be * left at 6. MIN_LOCATOR_PAIRS sets a floor on the shortest locator that * should be handled. -N0NB */ const static int loc_char_range[] = { 18, 10, 24, 10, 24, 10 }; #define MAX_LOCATOR_PAIRS 6 #define MIN_LOCATOR_PAIRS 1 /** * \brief Convert DMS to decimal degrees * \param degrees Degrees, whole degrees * \param minutes Minutes, whole minutes * \param seconds Seconds, decimal seconds * \param sw South or West * * Convert degree/minute/second angle to decimal degrees angle. * \a degrees >360, \a minutes > 60, and \a seconds > 60.0 are allowed, * but resulting angle won't be normalized. * * When the variable sw is passed a value of 1, the returned decimal * degrees value will be negative (south or west). When passed a * value of 0 the returned decimal degrees value will be positive * (north or east). * * \return The angle in decimal degrees. * * \sa dec2dms() */ double dms2dec(int degrees, int minutes, double seconds, int sw) { double st; if (degrees < 0) degrees = abs(degrees); if (minutes < 0) minutes = abs(minutes); if (seconds < 0) seconds = fabs(seconds); st = (double)degrees + (double)minutes / 60. + seconds / 3600.; if (sw == 1) return -st; else return st; } /** * \brief Convert D M.MMM notation to decimal degrees * \param degrees Degrees, whole degrees * \param minutes Minutes, decimal minutes * \param sw South or West * * Convert a degrees, decimal minutes notation common on * many GPS units to its decimal degrees value. * * \a degrees > 360, \a minutes > 60.0 are allowed, but * resulting angle won't be normalized. * * When the variable sw is passed a value of 1, the returned decimal * degrees value will be negative (south or west). When passed a * value of 0 the returned decimal degrees value will be positive * (north or east). * * \return The angle in decimal degrees. * * \sa dec2dmmm() */ double dmmm2dec(int degrees, double minutes, int sw) { double st; if (degrees < 0) degrees = abs(degrees); if (minutes < 0) minutes = fabs(minutes); st = (double)degrees + minutes / 60.; if (sw == 1) return -st; else return st; } /** * \brief Convert decimal degrees angle into DMS notation * \param dec Decimal degrees * \param degrees Pointer for the calculated whole Degrees * \param minutes Pointer for the calculated whole Minutes * \param seconds Pointer for the calculated decimal Seconds * \param sw Pointer for the calculated SW flag * * Convert decimal degrees angle into its degree/minute/second * notation. * * When \a dec < -180 or \a dec > 180, the angle will be normalized * within these limits and the sign set appropriately. * * Upon return dec2dms guarantees 0 >= \a degrees <= 180, * 0 >= \a minutes < 60, and 0.0 >= \a seconds < 60.0. * * When \a dec is < 0.0 \a sw will be set to 1. When \a dec is * >= 0.0 \a sw will be set to 0. This flag allows the application * to determine whether the DMS angle should be treated as negative * (south or west). * * \retval -QRB_EINVAL if any of the pointers are NULL. * \retval QRB_OK if conversion went OK. * * \sa dms2dec() */ int dec2dms(double dec, int *degrees, int *minutes, double *seconds, int *sw) { int deg, min; double st; /* bail if NULL pointers passed */ if (!degrees || !minutes || !seconds || !sw) return -QRB_EINVAL; /* reverse the sign if dec has a magnitude greater * than 180 and factor out multiples of 360. * e.g. when passed 270 st will be set to -90 * and when passed -270 st will be set to 90. If * passed 361 st will be set to 1, etc. If passed * a value > -180 || < 180, value will be unchanged. */ if (dec >= 0.0) st = fmod(dec + 180, 360) - 180; else st = fmod(dec - 180, 360) + 180; /* if after all of that st is negative, we want deg * to be negative as well except for 180 which we want * to be positive. */ if (st < 0.0 && st != -180) *sw = 1; else *sw = 0; /* work on st as a positive value to remove a * bug introduced by the effect of floor() when * passed a negative value. e.g. when passed * -96.8333 floor() returns -95! Also avoids * a rounding error introduced on negative values. */ st = fabs(st); deg = (int)floor(st); st = 60. * (st - (double)deg); min = (int)floor(st); st = 60. * (st - (double)min); *degrees = deg; *minutes = min; *seconds = st; return QRB_OK; } /** * \brief Convert a decimal angle into D M.MMM notation * \param dec Decimal degrees * \param degrees Pointer for the calculated whole Degrees * \param minutes Pointer for the calculated decimal Minutes * \param sw Pointer for the calculated SW flag * * Convert a decimal angle into its degree, decimal minute * notation common on many GPS units. * * When passed a value < -180 or > 180, the value will be normalized * within these limits and the sign set apropriately. * * Upon return dec2dmmm guarantees 0 >= \a degrees <= 180, * 0.0 >= \a minutes < 60.0. * * When \a dec is < 0.0 \a sw will be set to 1. When \a dec is * >= 0.0 \a sw will be set to 0. This flag allows the application * to determine whether the D M.MMM angle should be treated as negative * (south or west). * * \retval -QRB_EINVAL if any of the pointers are NULL. * \retval QRB_OK if conversion went OK. * * \sa dmmm2dec() */ int dec2dmmm(double dec, int *degrees, double *minutes, int *sw) { int r, min; double sec; /* bail if NULL pointers passed */ if (!degrees || !minutes || !sw) return -QRB_EINVAL; r = dec2dms(dec, degrees, &min, &sec, sw); if (r != QRB_OK) return r; *minutes = (double)min + sec / 60; return QRB_OK; } /** * \brief Convert Maidenhead grid locator to Longitude/Latitude * \param longitude Pointer for the calculated Longitude * \param latitude Pointer for the calculated Latitude * \param locator The Maidenhead grid locator--2 through 12 char + nul string * * Convert Maidenhead grid locator to Longitude/Latitude (decimal degrees). * The locator should be in 2 through 12 chars long format. * \a locator2longlat is case insensitive, however it checks for * locator validity. * * Decimal long/lat is computed to center of grid square, i.e. given * EM19 will return coordinates equivalent to the southwest corner * of EM19mm. * * \retval -QRB_EINVAL if locator exceeds RR99xx99xx99 or exceeds length * limit--currently 1 to 6 lon/lat pairs. * \retval QRB_OK if conversion went OK. * * \bug The fifth pair ranges from aa to xx, there is another convention * that ranges from aa to yy. At some point both conventions should be * supported. * * \sa longlat2locator() */ /* begin dph */ int locator2longlat(double *longitude, double *latitude, const char *locator) { int x_or_y, paircount; int locvalue, pair; int divisions; double xy[2], ordinate; /* bail if NULL pointers passed */ if (!longitude || !latitude) return -QRB_EINVAL; paircount = strlen(locator) / 2; /* verify paircount is within limits */ if (paircount > MAX_LOCATOR_PAIRS) paircount = MAX_LOCATOR_PAIRS; else if (paircount < MIN_LOCATOR_PAIRS) return -QRB_EINVAL; /* For x(=longitude) and y(=latitude) */ for (x_or_y = 0; x_or_y < 2; ++x_or_y) { ordinate = -90.0; divisions = 1; for (pair = 0; pair < paircount; ++pair) { locvalue = locator[pair*2 + x_or_y]; /* Value of digit or letter */ locvalue -= (loc_char_range[pair] == 10) ? '0' : (isupper(locvalue)) ? 'A' : 'a'; /* Check range for non-letter/digit or out of range */ if ((locvalue < 0) || (locvalue >= loc_char_range[pair])) return -QRB_EINVAL; divisions *= loc_char_range[pair]; ordinate += locvalue * 180.0 / divisions; } /* Center ordinate in the Maidenhead "square" or "subsquare" */ ordinate += 90.0 / divisions; xy[x_or_y] = ordinate; } *longitude = xy[0] * 2.0; *latitude = xy[1]; return QRB_OK; } /* end dph */ /** * \brief Convert longitude/latitude to Maidenhead grid locator * \param longitude Longitude, decimal degrees * \param latitude Latitude, decimal degrees * \param locator Pointer for the Maidenhead Locator * \param pair_count Precision expressed as lon/lat pairs in the locator * * Convert longitude/latitude (decimal degrees) to Maidenhead grid locator. * \a locator must point to an array at least \a pair_count * 2 char + '\\0'. * * \retval -QRB_EINVAL if \a locator is NULL or \a pair_count exceeds * length limit. Currently 1 to 6 lon/lat pairs. * \retval QRB_OK if conversion went OK. * * \bug \a locator is not tested for overflow. * \bug The fifth pair ranges from aa to yy, there is another convention * that ranges from aa to xx. At some point both conventions should be * supported. * * \sa locator2longlat() */ /* begin dph */ int longlat2locator(double longitude, double latitude, char *locator, int pair_count) { int x_or_y, pair, locvalue, divisions; double square_size, ordinate; if (!locator) return -QRB_EINVAL; if (pair_count < MIN_LOCATOR_PAIRS || pair_count > MAX_LOCATOR_PAIRS) return -QRB_EINVAL; for (x_or_y = 0; x_or_y < 2; ++x_or_y) { ordinate = (x_or_y == 0) ? longitude / 2.0 : latitude; divisions = 1; /* The 1e-6 here guards against floating point rounding errors */ ordinate = fmod(ordinate + 270.000001, 180.0); for (pair = 0; pair < pair_count; ++pair) { divisions *= loc_char_range[pair]; square_size = 180.0 / divisions; locvalue = (int) (ordinate / square_size); ordinate -= square_size * locvalue; locvalue += (loc_char_range[pair] == 10) ? '0':'A'; locator[pair * 2 + x_or_y] = locvalue; } } locator[pair_count * 2] = '\0'; return QRB_OK; } /* end dph */ /** * \brief Calculate the distance and bearing between two points. * \param lon1 The local Longitude, decimal degrees * \param lat1 The local Latitude, decimal degrees * \param lon2 The remote Longitude, decimal degrees * \param lat2 The remote Latitude, decimal degrees * \param distance Pointer for the distance, km * \param azimuth Pointer for the bearing, decimal degrees * * Calculate the QRB between \a lon1, \a lat1 and \a lon2, \a lat2. * * This version will calculate the QRB to a precision sufficient * for 12 character locators. Antipodal points, which are easily * calculated, are considered equidistant and the bearing is * simply resolved to be true north (0.0°). * * \retval -QRB_EINVAL if NULL pointer passed or lat and lon values * exceed -90 to 90 or -180 to 180. * \retval QRB_OK if calculations are successful. * * \return The distance in kilometers and azimuth in decimal degrees * for the short path are stored in \a distance and \a azimuth. * * \sa distance_long_path(), azimuth_long_path() */ int qrb(double lon1, double lat1, double lon2, double lat2, double *distance, double *azimuth) { double delta_long, tmp, arc, az; /* bail if NULL pointers passed */ if (!distance || !azimuth) return -QRB_EINVAL; if ((lat1 > 90.0 || lat1 < -90.0) || (lat2 > 90.0 || lat2 < -90.0)) return -QRB_EINVAL; if ((lon1 > 180.0 || lon1 < -180.0) || (lon2 > 180.0 || lon2 < -180.0)) return -QRB_EINVAL; /* Prevent ACOS() Domain Error */ if (lat1 == 90.0) lat1 = 89.999999999; else if (lat1 == -90.0) lat1 = -89.999999999; if (lat2 == 90.0) lat2 = 89.999999999; else if (lat2 == -90.0) lat2 = -89.999999999; /* Convert variables to Radians */ lat1 /= RADIAN; lon1 /= RADIAN; lat2 /= RADIAN; lon2 /= RADIAN; delta_long = lon2 - lon1; tmp = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(delta_long); if (tmp > .999999999999999) { /* Station points coincide, use an Omni! */ *distance = 0.0; *azimuth = 0.0; return QRB_OK; } if (tmp < -.999999) { /* * points are antipodal, it's straight down. * Station is equal distance in all Azimuths. * So take 180 Degrees of arc times 60 nm, * and you get 10800 nm, or whatever units... */ *distance = M_PI * ARC_IN_KM; *azimuth = 0.0; return QRB_OK; } arc = acos(tmp); /* * One degree of arc is 60 Nautical miles * at the surface of the earth, 111.2 km, or 69.1 sm * This method is easier than the one in the handbook */ *distance = arc * ARC_IN_KM; /* Short Path */ /* Change to azimuth computation by Dave Freese, W1HKJ */ az = RADIAN * atan2(sin(lon2 - lon1) * cos(lat2), (cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1))); az = fmod(360.0 + az, 360.0); if (az < 0.0) az += 360.0; else if (az >= 360.0) az -= 360.0; *azimuth = floor(az + 0.5); return QRB_OK; } /** * \brief Calculate the long path distance between two points. * \param distance The shortpath distance * * Calculate the long path (respective of the short path) * of a given distance. * * \return the distance in kilometers for the opposite path. * * \sa qrb() */ double distance_long_path(double distance) { return (ARC_IN_KM * 2.0 * M_PI) - distance; } /** * \brief Calculate the long path bearing between two points. * \param azimuth The shortpath bearing * * Calculate the long path (respective of the short path) * of a given bearing. * * \return the azimuth in decimal degrees for the opposite path. * * \sa qrb() */ double azimuth_long_path(double azimuth) { return azimuth + (azimuth <= 180.0 ? 180.0 : -180.0); } } // namespace QRB /*! @} */ fldigi-4.1.06/src/misc/record_loader.cxx0000664000175000017500000003343113507401434015042 00000000000000// ---------------------------------------------------------------------------- // record_loader.cxx // // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #ifdef __MINGW32__ # include "compat.h" #endif #include "record_loader.h" #include "record_browse.h" #include "debug.h" #include "main.h" #include "icons.h" #include "fl_digi.h" #include "strutil.h" #include "gettext.h" #include "network.h" #include #include #include #include #include "FL/Fl_Double_Window.H" #include "FL/Fl_Output.H" #include "FL/fl_ask.H" #include "FL/Fl_Check_Button.H" Fl_Double_Window *dlgRecordLoader = (Fl_Double_Window *)0; /// Loads a file and stores it for later lookup. int RecordLoaderInterface::LoadAndRegister() { Clear(); std::string filnam = storage_filename().first; time_t cntTim = time(NULL); if (bMOREINFO) LOG_INFO("Opening:%s", filnam.c_str()); std::ifstream ifs( filnam.c_str() ); /// Reuse the same string for each new record. std::string input_str ; size_t nbRec = 0 ; while( ! ifs.eof() ) { if( ! std::getline( ifs, input_str ) ) break; /// Comments are legal with # as first character. if( input_str[0] == '#' ) continue; imemstream str_strm( input_str ); try { if( ReadRecord( str_strm ) ) { ++nbRec; } else { LOG_WARN( "Cannot process '%s'", input_str.c_str() ); } } catch(const std::exception & exc) { LOG_WARN( "%s: Caught <%s> when reading '%s'", base_filename().c_str(), exc.what(), input_str.c_str() ); return -1 ; } } ifs.close(); if (bMOREINFO) LOG_INFO( "Read:%s with %d records in %d seconds", filnam.c_str(), static_cast(nbRec), static_cast( time(NULL) - cntTim ) ); return nbRec ; } // ---------------------------------------------------------------------------- struct Row { Fl_Output * m_timestamp ; Fl_Check_Button * m_select ; Fl_Output * m_content_size ; Fl_Output * m_nb_rows ; Fl_Button * m_url ; RecordLoaderInterface * m_itf ; bool UpdateRow() { const std::string str = m_itf->Timestamp(); m_timestamp->value(str.c_str()); const std::string & strSz = m_itf->ContentSize(); m_content_size->value(strSz.c_str()); int nb_recs = m_itf->LoadAndRegister(); char nb_recs_str[64]; bool isGood = ( nb_recs >= 0 ); if( isGood ) snprintf( nb_recs_str, sizeof(nb_recs_str), "%6d", nb_recs ); else strcpy( nb_recs_str, " N/A" ); m_nb_rows->value(nb_recs_str); const char * strurl = m_itf->Url(); if( strurl != NULL ) { const std::string strnam = m_itf->base_filename(); m_url->tooltip( strurl ); } if (dlgRecordLoader) dlgRecordLoader->damage(); return isGood ; } }; /// Array all data loaders. It is setup at start time. static Row * all_recs = NULL ; /// Number of data loaders, it is a very small integer. static int dataloader_nb = 0 ; static const int nb_cols = 5 ; // ---------------------------------------------------------------------------- /// This is a virtual class, therefore it must have a default constructor. RecordLoaderInterface::RecordLoaderInterface() { ++dataloader_nb ; /// We prefer tp use realloc because it is ready before main() is called. all_recs = (Row *)realloc( all_recs, dataloader_nb * sizeof( Row ) ); all_recs[ dataloader_nb - 1 ].m_itf = this ; } /// This happens very rarely, so performance is not an issue. RecordLoaderInterface::~RecordLoaderInterface() { for( int i = 0; i < dataloader_nb; ++i ) { if( all_recs[i].m_itf == this ) { memmove( all_recs + i, all_recs + i + 1, sizeof( Row ) * ( dataloader_nb - i - 1 ) ); --dataloader_nb ; return ; } } LOG_ERROR("Inconsistent %d", dataloader_nb ); } /// This takes only the filename from the complete HTTP or FTP URL, or file path. std::string RecordLoaderInterface::base_filename() const { const char * pFil = strrchr( Url(), '/' ); if( pFil == NULL ) pFil = Url(); else ++pFil ; /// This might be an URL so we take only the beginning. const char * quest = strchr( pFil, '?' ); if( quest == NULL ) quest = pFil + strlen(pFil); return std::string( pFil, quest ); } std::pair< std::string, bool > RecordLoaderInterface::storage_filename(bool create_dir) const { /// We check if it is changed, it is not performance-critical. if( create_dir ) { if( ask_dir_creation( DATA_dir ) ) { const char * err = create_directory( DATA_dir.c_str() ); if( err ) { fl_alert("Error:%s",err); } } } std::string filnam_data = DATA_dir; filnam_data.append(base_filename()); if( create_dir ) { return std::make_pair( filnam_data, false ); } /// This is for a read access. std::ifstream ifs( filnam_data.c_str() ); if( ifs ) { ifs.close(); return std::make_pair( filnam_data, false ); } if( errno != ENOENT ) { LOG_WARN( "Cannot read '%s': %s", filnam_data.c_str(), strerror(errno) ); } // Second try with a file maybe installed by "make install". std::string filnam_inst = PKGDATADIR "/" + base_filename(); if (bMOREINFO) LOG_INFO("Errno=%s with %s. Trying %s", strerror(errno), filnam_data.c_str(), filnam_inst.c_str() ); ifs.open( filnam_inst.c_str() ); if( ifs ) { ifs.close(); return std::make_pair( filnam_inst, true ); } /// But the file is not there. return std::make_pair( filnam_data, false ); } std::string RecordLoaderInterface::Timestamp() const { std::string filnam = storage_filename().first; struct stat st; if (stat(filnam.c_str(), &st) == -1 ) return "N/A"; struct tm tmLastMod = *localtime( & st.st_mtime ); char buf[64]; snprintf(buf, sizeof(buf), "%d/%d/%d %02d:%02d", tmLastMod.tm_year + 1900, tmLastMod.tm_mon + 1, tmLastMod.tm_mday, tmLastMod.tm_hour, tmLastMod.tm_min ); return buf ; } std::string RecordLoaderInterface::ContentSize() const { /// It would be faster to cache this result in the object. std::string filnam = storage_filename().first; struct stat st; if (stat(filnam.c_str(), &st) == -1 ) return " N/A"; std::stringstream buf; buf.width(9); buf.fill(' '); buf << st.st_size; return buf.str(); } // ---------------------------------------------------------------------------- static void cb_record_url(Fl_Widget *w, void* ptr) { const RecordLoaderInterface * it = static_cast< const RecordLoaderInterface * >(ptr); cb_mnuVisitURL( NULL, const_cast< char * >( it->Url() ) ); } void DerivedRecordLst::AddRow( int row ) { Row * ptRow = all_recs + row ; int X,Y,W,H; int col=0; { col_width( col, 110 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_timestamp = new Fl_Output(X,Y,W,H); ptRow->m_timestamp->tooltip( _("Data file creation date") ); } ++col; { col_width( col, 16 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_select = new Fl_Check_Button(X,Y,W,H); ptRow->m_select->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); ptRow->m_select->value(1); } ++col; { col_width( col, 80 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_content_size = new Fl_Output(X,Y,W,H); ptRow->m_content_size->tooltip( _("Size in bytes") ); } ++col; { col_width( col, 50 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_nb_rows = new Fl_Output(X,Y,W,H); ptRow->m_nb_rows->tooltip( _("Number of lines in data file") ); } ++col; { col_width( col, 166 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); const char * strurl = ptRow->m_itf->Url(); ptRow->m_url = NULL ; if( strurl != NULL ) { const std::string strnam = ptRow->m_itf->base_filename(); ptRow->m_url = new Fl_Button(X,Y,W,H, strdup(strnam.c_str()) ); ptRow->m_url->tooltip( strurl ); ptRow->m_url->callback(cb_record_url, ptRow->m_itf); } } ptRow->UpdateRow(); } DerivedRecordLst::DerivedRecordLst(int x, int y, int w, int h, const char *title) : Fl_Table(x,y,w,h,title) { col_header(1); col_resize(1); col_header_height(25); row_header(1); row_resize(0); row_header_width(105); rows(dataloader_nb); cols(nb_cols); begin(); // start adding widgets to group { for( int row = 0; row < dataloader_nb; ++row ) { AddRow( row ); } } end(); } DerivedRecordLst::~DerivedRecordLst() { } // Handle drawing all cells in table void DerivedRecordLst::draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H) { switch ( context ) { case CONTEXT_STARTPAGE: fl_font(FL_HELVETICA, 12); // font used by all headers break; case CONTEXT_RC_RESIZE: { int X, Y, W, H; int index = 0; for ( int r = 0; r= children() ) break; find_cell(CONTEXT_TABLE, r, c, X, Y, W, H); child(index++)->resize(X,Y,W,H); } } init_sizes(); // tell group children resized return; } case CONTEXT_ROW_HEADER: fl_push_clip(X, Y, W, H); { RecordLoaderInterface * it = ( (R >= 0) && ( R < dataloader_nb ) ) ? all_recs[ R ].m_itf : NULL; if( it == NULL ) { LOG_ERROR("R=%d",R); return; } const char * str = it ? it->Description() : "Unknown" ; fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, row_header_color()); fl_color(FL_BLACK); fl_draw(str, X, Y, W, H, FL_ALIGN_CENTER); } fl_pop_clip(); return; case CONTEXT_COL_HEADER: fl_push_clip(X, Y, W, H); { static const char * col_names[nb_cols] = { _("Timestamp"), _(" "), _("Size"), _("# recs"), _("WWW"), }; const char * title = ( ( C >= 0 ) && ( C < nb_cols ) ) ? col_names[C] : "?" ; fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color()); fl_color(FL_BLACK); fl_draw(title, X, Y, W, H, FL_ALIGN_CENTER); } fl_pop_clip(); return; case CONTEXT_CELL: // fl_push_clip(X, Y, W, H); return; // fltk handles drawing the widgets default: return; } } void DerivedRecordLst::cbGuiUpdate() { std::string server = inpDataSources->value(); if( server.empty() ) { fl_alert(_("No server selected")); return ; } if( server[server.size()-1] != '/' ) server += '/' ; for( int row = 0; row < dataloader_nb; ++row ) { Row * ptrRow = all_recs + row; if( ! ptrRow->m_select->value() ) continue ; RecordLoaderInterface * it = ptrRow->m_itf; std::string url = server + it->base_filename(); std::string reply ; // double timeout=5.0; // Consider truncating the HTTP header. // int res = get_http_gui(url, reply, timeout ); int res = get_http(url, reply, 5.0); if (bMOREINFO) LOG_INFO("Loaded %s : %d chars. res=%d", url.c_str(), (int)reply.size(), res ); if (reply.empty()) { int ok = fl_choice2( _("Could not download %s"), _("Continue"), _("Stop"), NULL, url.c_str() ); if( ok == 1 ) break ; continue ; } static const char *notFound404 = "HTTP/1.1 404 Not Found"; if( 0 == strncmp( reply.c_str(), notFound404, strlen(notFound404) ) ) { int ok = fl_choice2( _("Non-existent URL: %s"), _("Continue"), _("Stop"), NULL, url.c_str() ); if( ok == 1 ) break ; continue ; } /// This creates the directory if necessary; std::string filnam = it->storage_filename(true).first; std::ofstream ofstrm( filnam.c_str() ); if( ofstrm ) ofstrm.write( &reply[0], reply.size() ); if( ! ofstrm ) { int ok = fl_choice2( _("Error saving %s to %s:%s"), _("Continue"), _("Stop"), NULL, url.c_str(), filnam.c_str(), strerror(errno) ); if( ok == 1 ) break ; continue ; } ofstrm.close(); bool isGood = all_recs[row].UpdateRow(); if( ! isGood ) { int ok = fl_choice2( _("Error loading %s to %s: %s."), _("Continue"), _("Stop"), NULL, url.c_str(), filnam.c_str(), strerror(errno) ); if( ok == 0 ) break ; continue ; } } btnDataSourceUpdate->value(0); } void DerivedRecordLst::cbGuiReset() { fprintf(stderr, "%s\n", __FUNCTION__ ); for( int row = 0; row < dataloader_nb; ++row ) { Row * ptrRow = all_recs + row; if( ! ptrRow->m_select->value() ) continue ; RecordLoaderInterface * it = ptrRow->m_itf; std::pair< std::string, bool > stofil_pair = it->storage_filename(true); it->Clear(); const char * stofil = stofil_pair.first.c_str() ; if( stofil_pair.second ) { fl_alert("Cannot erase installed data file %s", stofil ); continue ; } else { if (bMOREINFO) LOG_INFO("Erasing %s", stofil ); int res = ::remove( stofil ); if( ( res != 0 ) && ( res != ENOENT ) ) { fl_alert("Error erasing data file %s:%s", stofil, strerror(errno) ); continue ; } all_recs[row].UpdateRow(); } } } // ---------------------------------------------------------------------------- /// Necessary because in a Fl_Menu, a slash has a special meaning. static std::string fl_escape( const char * str ) { std::string res ; for( char ch ; ( ch = *str ) != '\0' ; ++str ) { if( ch == '/' ) res += '\\'; res += ch ; } return res ; } static void fl_input_add( const char * str ) { inpDataSources->add( fl_escape( str ).c_str() ); } void createRecordLoader() { if (dlgRecordLoader) return; dlgRecordLoader = make_record_loader_window(); fl_input_add("http://www.w1hkj.com/support_files/"); inpDataSources->value(0); } // ---------------------------------------------------------------------------- fldigi-4.1.06/src/misc/nls.cxx0000644000175000017500000000704113472115773013037 00000000000000// ---------------------------------------------------------------------------- // nls.cxx // // Copyright (C) 2008 // Stéphane Fillod, F8CFE // // Copyright (C) 2011 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "nls.h" #include "gettext.h" #ifndef PATH_MAX # define PATH_MAX 4096 #endif #ifdef __WOE32__ # include # include // TODO: figure out the percentage automatically; hopefully not in a horribly kludgy way struct lang_def_t ui_langs[] = { { "en", "en_US", "English"}, { "de", "de_DE", "Deutsch (German)"}, { "nl", "nl_NL", "Nederlands (Dutch)"}, { "es", "es_ES", "Espa\361ol (Spanish)"}, { "fr", "fr_FR", "Fran\347ais (French)"}, { "it", "it_IT", "Italiano (Italian)"}, { "pl", "pl_PL", "JÄ™zyk (Polish)"}, { "ru", "ru_RU", "PуÑÑкий (Russian)"}, { "el", "el_EL", "Ελληνικά (Greek)"}, { NULL, NULL, NULL } }; static std::string get_win32_lang_dir(const char* homedir = NULL) { std::string lang_fn; if (!homedir) { if (!(homedir = getenv("USERPROFILE"))) return lang_fn; lang_fn.assign(homedir).append("\\fldigi.files\\"); } return lang_fn.append("lang.txt"); } int get_ui_lang(const char* homedir) { std::string lang = get_win32_lang_dir(homedir); std::ifstream in(lang.c_str()); if (!in) return 0; std::string::size_type u = std::string::npos; while (in >> lang) { if ( (lang[0] != '\n') & (lang[0] != '#') && ( (u = lang.find('_')) != std::string::npos) ) break; } in.close(); if (u != std::string::npos) for (lang_def_t* p = ui_langs; p->lang; p++) if (lang == p->lang_region) return (int)(p - ui_langs); return 0; } void set_ui_lang(int lang, const char* homedir) { if ((size_t)lang >= sizeof(ui_langs)/sizeof(*ui_langs) - 1) return; std::string langfn = get_win32_lang_dir(homedir); std::ofstream f(langfn.c_str()); if (f) { f << "# Autogenerated file, do not edit\r\n" << ui_langs[lang].lang_region << "\r\n"; f.close(); } } #endif int setup_nls(void) { static int nls_set_up = 0; if (nls_set_up) return nls_set_up; setlocale (LC_MESSAGES, ""); setlocale (LC_CTYPE, "C"); setlocale (LC_TIME, ""); // setting LC_NUMERIC might break the config read/write routines const char* ldir; char buf[PATH_MAX]; if (!(ldir = getenv("FLDIGI_LOCALE_DIR"))) { if (getcwd(buf, sizeof(buf) - strlen("/locale") - 1)) { #ifdef __WOE32__ int lang = get_ui_lang(); setenv("LANGUAGE", ui_langs[lang].lang_region, 1); #endif strcpy(buf + strlen(buf), "/locale"); struct stat s; if (stat(buf, &s) != -1 && S_ISDIR(s.st_mode)) ldir = buf; else ldir = LOCALEDIR; } } bindtextdomain(PACKAGE, ldir); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(PACKAGE); return nls_set_up = 1; } fldigi-4.1.06/src/misc/macroedit.cxx0000644000175000017500000003740613472115773014222 00000000000000// ---------------------------------------------------------------------------- // macroedit.cxx // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #ifndef __MINGW32__ # include #endif #include #include #include #include #include #include "macros.h" #include "macroedit.h" #include "globals.h" #include "status.h" #include "fileselect.h" #include "fl_lock.h" #include "fl_digi.h" #include "main.h" #include "gettext.h" #include "pixmaps.h" #include "configuration.h" using namespace std; Fl_Double_Window *MacroEditDialog = (Fl_Double_Window *)0; Fl_Button *btnMacroEditApply = (Fl_Button *)0; Fl_Button *btnMacroEditClose = (Fl_Button *)0; Fl_Button *btnInsertMacro = (Fl_Button *)0; Fl_Input2 *macrotext = (Fl_Input2 *)0; Fl_Input2 *labeltext = (Fl_Input2 *)0; static int widths[] = {150, 0}; Fl_Hold_Browser *macroDefs=(Fl_Hold_Browser *)0; static int iMacro, iType; static Fl_Input* iInput; // fl_color(0) is always the foreground colour #define LINE_SEP "@B0" void loadBrowser(Fl_Widget *widget) { Fl_Browser *w = (Fl_Browser *)widget; /* Do not translate the tags lefthand-side */ w->add(_("\tmy frequency")); w->add(_("\tmode")); w->add(_("\tmy call")); w->add(_("\tmy locator")); w->add(_("\tmy name")); w->add(_("\tmy QTH")); w->add(_("\tmy RST")); w->add(_("\tmy FD class")); w->add(_("\tmy FD section")); w->add(_("\tmy state")); w->add(_("\tmy ST")); w->add(_("\tmy county")); w->add(_("\tmy CNTY")); w->add(_("\tmy antenna")); w->add(_("\toperating band")); w->add(_("\tFldigi version")); w->add(_("\tdigital mode (adif)")); w->add(LINE_SEP); w->add(_("\tother call")); w->add(_("\tother name")); w->add(_("\tother QTH")); w->add(_("\tother State")); w->add(_("\tother Province")); w->add(_("\tother locator")); w->add(_("\tother RST")); w->add(LINE_SEP); w->add(_("\tS/N etc.")); w->add(_("\tIMD etc.")); w->add(LINE_SEP); w->add(_("\t# QSO recs")); w->add(_("\tnext QSO rec #")); w->add(LINE_SEP); w->add(_("\tmap on google")); w->add(_("\tmap by value")); w->add(LINE_SEP); w->add(_("\tclear RX pane")); w->add(_("\tclear TX pane")); w->add(LINE_SEP); w->add(_("\ttext to NAME/QTH")); #ifdef __WIN32__ w->add(LINE_SEP); w->add(_("\tDigitalk On, Off, Toggle")); #endif w->add(LINE_SEP); w->add(_("\tclear log fields")); w->add(_("\tsave QSO data")); w->add(_("\tsaveQSO data, append msg to notes")); w->add(_("\tlog at xmt time")); w->add(_("\tsaveQSO data, append msg to notes")); w->add(_("\tlog eQSL")); w->add(_("\tlog eQSL optional msg")); w->add(LINE_SEP); w->add(_("\tQSO time (HHMM))")); w->add(_("\tLDT default '%Y-%m-%d %H:%M%z'")); w->add(_("\tLocal datetime, default '%x %H:%M %Z'")); w->add(_("\tZDT default '%Y-%m-%d %H:%MZ'")); w->add(_("\tUTC datetime, default '%x %H:%MZ'")); w->add(_("\tlocal time, default %H%M")); w->add(_("\tzulu time default %H%MZ")); w->add(_("\tlocal date, default '%Y-%M-%D'")); w->add(_("\tzulu date, default '%Y-%M-%D Z'")); w->add(_("\tget weather data")); w->add(_("\tget weather data for station")); w->add(LINE_SEP); w->add(_("\tcontest counter")); w->add(_("\tdecrement counter")); w->add(_("\tincrement counter")); w->add(_("\texchange in")); w->add(_("\texchange out")); w->add(_("\texchange begin")); w->add(_("\texchange end")); w->add(_("\tsave contest out")); w->add(_("\tcurrent contest serno")); w->add(_("\tlast serno sent")); w->add(_("\tFD class")); w->add(_("\tFD section")); w->add(_("\tcontest class")); w->add(_("
\tARRL section")); w->add(LINE_SEP); w->add(_("\treceive")); w->add(_("\ttransmit")); w->add(_("\ttoggle T/R")); w->add(_("\tsearch UP for signal")); w->add(_("\tsearch DOWN for signal")); w->add(_("\treturn to sweet spot")); w->add(_("\tmove to freq NNNN Hz")); w->add(_("\tleft-clk QSY button")); w->add(_("\tright-clk QSY button")); w->add(_("\tqsy to kHz, Hz")); w->add(_("\tincr/decr xcvr freq")); w->add(_("\tvalid xcvr mode")); w->add(_("\tvalid xcvr filter width")); w->add(_("\tvalid xcvr low cutoff filter")); w->add(_("\tvalid xcvr hi cutoff filter")); w->add(_("\trig freq has kbd focus")); w->add(LINE_SEP); w->add(_("\tinsert QRG into Rx text")); w->add(LINE_SEP); w->add(_("\tinsert text file")); w->add(_("\tinsert image file")); w->add(_("\tsend avatar")); w->add(LINE_SEP); w->add(_("\tpause transmit")); w->add(_("\tidle signal for NN.nn sec")); w->add(_("\trepeat every NN sec")); w->add(_("\ttune signal for NN sec")); w->add(_("\tdelay xmt for NN.n sec")); w->add(_("\trepeat macro continuously")); w->add(_("\tschedule execution")); w->add(LINE_SEP); w->add(_("\t set xmt attenuator")); w->add(LINE_SEP); w->add(_("\tCW identifier")); w->add(_("\tsend mode ID; TX start only")); w->add(_("\ttext at start of TX")); w->add(_("add(_("\tTx RSID on,off,toggle")); w->add(_("\tRx RSID on,off,toggle")); w->add(_("\tTransmit |NN| successive RsID bursts")); w->add(_("\t[Wait][Len](ms)")); w->add(LINE_SEP); w->add(_("")); w->add(_("\talert using external wav file")); w->add(LINE_SEP); w->add(_("\tCW QSK post-timing")); w->add(_("\tCW QSK pre-timing")); w->add(_("\tCW rise time")); w->add(_("\tCW WPM:Farnsworth")); w->add(LINE_SEP); w->add(_("\tsend CAT cmd")); w->add(_("\tsend CAT cmd")); w->add(LINE_SEP); w->add(_("\tAFC on,off,toggle")); w->add(_("\tLOCK on,off,toggle")); w->add(_("\tRev on,off,toggle")); w->add(LINE_SEP); w->add(_("\tchange macro defs file")); w->add(_("\tsave current macro file")); w->add(LINE_SEP); w->add(_("\tignore all comment text")); w->add(LINE_SEP); w->add(_("\tmodem char/sec test on nn chars")); w->add(_("\tmodem timing test, 'n' random 5 char groups")); w->add(_("\tmodem timing test, spec' file")); w->add(_("\tmodem timing test, string 's'")); w->add(LINE_SEP); w->add(_("\tWAV file; internal string")); w->add(_("\tWAV file; 'n' random 5 char groups")); w->add(_("\tWAV file; spec' file")); w->add(_("\tWAV file; string 's'")); w->add(LINE_SEP); w->add(_("\tAnalysis CSV on,off,toggle")); w->add(LINE_SEP); w->add(_("\tpush current mode to stack")); w->add(_("add(_("\tpop current mode/freq from stack")); w->add(LINE_SEP); assert(MODE_CONTESTIA < MODE_OLIVIA); char s[256]; for (trx_mode i = 0; i <= MODE_CONTESTIA; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } // add some Contestia macros const char* contestia[] = { "250:8", "500:8", "500:16", "1000:8", "1000:16" }; for (size_t i = 0; i < sizeof(contestia)/sizeof(*contestia); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_CONTESTIA].sname, contestia[i]); w->add(s); } for (trx_mode i = MODE_CONTESTIA + 1; i <= MODE_OLIVIA; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } assert(MODE_OLIVIA < MODE_RTTY); // add some Olivia macros const char* olivia[] = { "250:8", "500:8", "500:16", "1000:8", "1000:32" }; for (size_t i = 0; i < sizeof(olivia)/sizeof(*olivia); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_OLIVIA].sname, olivia[i]); w->add(s); } for (trx_mode i = MODE_OLIVIA + 1; i <= MODE_RTTY; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } // add some RTTY macros const char* rtty[] = { "170:45.45:5", "170:50:5", "850:75:5" }; for (size_t i = 0; i < sizeof(rtty)/sizeof(*rtty); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_RTTY].sname, rtty[i]); w->add(s); } for (trx_mode i = MODE_RTTY + 1; i < NUM_MODES; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } #ifndef __MINGW32__ glob_t gbuf; glob(string(ScriptsDir).append("*").c_str(), 0, NULL, &gbuf); if (gbuf.gl_pathc == 0) { globfree(&gbuf); return; } w->add(LINE_SEP); struct stat st; # if defined(__OpenBSD__) for (int i = 0; i < gbuf.gl_pathc; i++) { # else for (size_t i = 0; i < gbuf.gl_pathc; i++) { # endif if (!(stat(gbuf.gl_pathv[i], &st) == 0 && S_ISREG(st.st_mode) && (st.st_mode & S_IXUSR))) continue; const char* p; if ((p = strrchr(gbuf.gl_pathv[i], '/'))) { snprintf(s, sizeof(s), "%s", p+1); w->add(s); } } globfree(&gbuf); #else w->add("\tlaunch a program"); #endif } void cbMacroEditOK(Fl_Widget *w, void *) { if (w == btnMacroEditClose) { MacroEditDialog->hide(); return; } if (iType == MACRO_EDIT_BUTTON) { update_macro_button(iMacro, macrotext->value(), labeltext->value()); } else if (iType == MACRO_EDIT_INPUT) iInput->value(macrotext->value()); } void update_macro_button(int iMacro, const char *text, const char *name) { macros.text[iMacro].assign(text); macros.name[iMacro].assign(name); if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (iMacro < NUMMACKEYS) { btnMacro[iMacro]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro]->redraw_label(); } else if ((iMacro / NUMMACKEYS) == altMacros) { btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->redraw_label(); } } else { btnMacro[iMacro % NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro % NUMMACKEYS]->redraw_label(); } btnDockMacro[iMacro]->label(macros.name[iMacro].c_str()); btnDockMacro[iMacro]->redraw_label(); macros.changed = true; } void cbInsertMacro(Fl_Widget *, void *) { int nbr = macroDefs->value(); if (!nbr) return; string edittext = macrotext->value(); string text = macroDefs->text(nbr); size_t tab = text.find('\t'); if (tab != string::npos) text.erase(tab); if (text == LINE_SEP) return; if (text == "") { string filters = "Text\t*.txt"; const char* p = FSEL::select( _("Text file to insert"), filters.c_str(), HomeDir.c_str()); if (p && *p) { text.insert(6, p); } else text = ""; } else if ((text == "") || (text == "")) { string filters = "Text\t*.txt"; const char* p = FSEL::select( _("Test text file"), filters.c_str(), HomeDir.c_str()); if (p && *p) { text.insert(10, p); } else text = ""; } else if (text == "") { string filters = "*.{png,jpg,bmp}\t*.png"; const char *p = FSEL::select( _("MFSK image file"), filters.c_str(), PicsDir.c_str()); if (p && *p) { text.insert(7, p); } else text = ""; } else if (text == "") { string filters = "Macrost\t*.mdf"; const char* p = FSEL::select( _("Change to Macro file"), filters.c_str(), MacrosDir.c_str()); if (p && *p) { text.insert(8, p); } else text = ""; } else if (text == "") { string filters = "Wav file\t*.wav"; const char* p = FSEL::select( _("Select wav file"), filters.c_str(), HomeDir.c_str()); if (p && *p) { text.insert(7, p); } else text = ""; } #ifdef __MINGW32__ else if (text == "") { string filters = "Exe\t*.exe"; const char* p = FSEL::select( _("Executable file to insert"), filters.c_str(), HomeDir.c_str()); if (p && *p) { string exefile = p; exefile.append(""); text.insert(6, exefile); } else text = ""; } #endif macrotext->insert(text.c_str()); macrotext->take_focus(); } #include Fl_Double_Window* make_macroeditor(void) { Fl_Double_Window* w = new Fl_Double_Window(800, 190, ""); Fl_Group *grpA = new Fl_Group(0, 0, 800, 22); Fl_Group *grpB = new Fl_Group(450, 0, 350, 22); btnInsertMacro = new Fl_Button(450, 2, 40, 20); btnInsertMacro->image(new Fl_Pixmap(left_arrow_icon)); btnInsertMacro->callback(cbInsertMacro); grpB->end(); grpA->end(); Fl_Group *grpC = new Fl_Group(0, 22, 800, 140); Fl_Tile *tile = new Fl_Tile(0,22,800,140); macrotext = new Fl_Input2(0, 22, 450, 140, _("Macro Text")); macrotext->type(FL_MULTILINE_INPUT); macrotext->textfont(FL_HELVETICA); macrotext->align(FL_ALIGN_TOP); macroDefs = new Fl_Hold_Browser(450, 22, 350, 140, _("Select Tag")); macroDefs->column_widths(widths); macroDefs->align(FL_ALIGN_TOP); Fl_Box *minbox = new Fl_Box(200, 22, 400, 140); minbox->hide(); tile->end(); tile->resizable(minbox); grpC->end(); Fl_Group *grpD = new Fl_Group(0, 164, 452, 24); Fl_Box *box3a = new Fl_Box(0, 164, 327, 24, ""); labeltext = new Fl_Input2(337, 164, 115, 24, _("Macro Button Label")); labeltext->textfont(FL_HELVETICA); grpD->end(); grpD->resizable(box3a); Fl_Group *grpE = new Fl_Group(452, 164, 348, 24); Fl_Box *box4a = new Fl_Box(452, 164, 92, 24, ""); btnMacroEditApply = new Fl_Button(544, 164, 80, 24, _("Apply")); btnMacroEditApply->callback(cbMacroEditOK); btnMacroEditClose = new Fl_Button(626 , 164, 80, 24, _("Close")); btnMacroEditClose->callback(cbMacroEditOK); grpE->end(); grpE->resizable(box4a); w->end(); w->resizable(grpC); w->size_range( 600, 120); w->xclass(PACKAGE_NAME); loadBrowser(macroDefs); return w; } void editMacro(int n, int t, Fl_Input* in) { if (!MacroEditDialog) MacroEditDialog = make_macroeditor(); if (t == MACRO_EDIT_BUTTON) { string editor_label; editor_label.append(_("Macro editor - ")).append(progStatus.LastMacroFile); if (editor_label != MacroEditDialog->label()) MacroEditDialog->copy_label(editor_label.c_str()); macrotext->value(macros.text[n].c_str()); labeltext->value(macros.name[n].c_str()); labeltext->show(); } else if (t == MACRO_EDIT_INPUT) { MacroEditDialog->label(in->label()); macrotext->value(in->value()); labeltext->hide(); } macrotext->textfont(progdefaults.MacroEditFontnbr); macrotext->textsize(progdefaults.MacroEditFontsize); iMacro = n; iType = t; iInput = in; MacroEditDialog->show(); } void update_macroedit_font() { if (!MacroEditDialog) return; if (!MacroEditDialog->visible()) return; macrotext->textfont(progdefaults.MacroEditFontnbr); macrotext->textsize(progdefaults.MacroEditFontsize); MacroEditDialog->redraw(); } fldigi-4.1.06/src/fldigirc.rc0000644000175000017500000000041613472116001012655 00000000000000#define BUILD_FLDIGI 1 #include "config.h" #define IDI_ICON 101 IDI_ICON ICON DISCARDABLE "fldigi.ico" #define RC_FILE_VERSION_QUAD FLDIGI_VERSION_MAJOR,FLDIGI_VERSION_MINOR,0,0 #define RC_FILE_DESCRIPTION "Fast Light Digital Modem Application" #include "common.rc" fldigi-4.1.06/src/throb/0000775000175000017500000000000013515625027011756 500000000000000fldigi-4.1.06/src/throb/throb.cxx0000644000175000017500000004660513472115775013557 00000000000000// ---------------------------------------------------------------------------- // throb.cxx -- throb modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // ThrobX additions by Joe Veldhuis, KD8ATU // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "throb.h" #include "ascii.h" #include "configuration.h" #include "fl_digi.h" #include "status.h" #define MAX_TONES 15 #undef CLAMP #define CLAMP(x,low,high) (((x)>(high))?(high):(((x)<(low))?(low):(x))) char throbmsg[80]; void throb::tx_init() { preamble = 4; reset_syms(); videoText(); } void throb::rx_init() { rxcntr = rxsymlen; waitsync = 1; deccntr = 0; symptr = 0; shift = 0; lastchar = '\0'; reset_syms(); put_MODEstatus(mode); } void throb::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::SCOPE); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } throb::~throb() { if (hilbert) delete hilbert; if (syncfilt) delete syncfilt; if (fftfilter) delete fftfilter; if (snfilter) delete snfilter; if (scope_data) delete [] scope_data; if (txpulse) delete [] txpulse; if (outbuf) delete[] outbuf; for (int i = 0; i < num_tones; i++) if (rxtone[i]) delete [] rxtone[i]; } void throb::flip_syms() //call this whenever a space or idle is sent or received { switch(mode) { case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: if (idlesym == 0) { idlesym = 1; spacesym = 0; } else { idlesym = 0; spacesym = 1; } break; default: //if we're not running a ThrobX mode, do nothing break; } } void throb::reset_syms() //call when switching from TX to RX or vice versa { switch(mode) { case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: idlesym = 0; spacesym = 1; break; default: //paranoia idlesym = 0; spacesym = 44; break; } } throb::throb(trx_mode throb_mode) : modem() { cap |= CAP_AFC | CAP_REV; double bw; double *fp = 0; mode = throb_mode; switch (mode) { case MODE_THROB1: symlen = SYMLEN_1; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / THROB_SAMPLE_RATE; break; case MODE_THROB2: symlen = SYMLEN_2; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / THROB_SAMPLE_RATE; break; case MODE_THROB4: default: symlen = SYMLEN_4; txpulse = mk_full_pulse(symlen); fp = mk_full_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsWid[i]; bw = 72.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX1: symlen = SYMLEN_1; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsNar[i]; bw = 47.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX2: symlen = SYMLEN_2; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsNar[i]; bw = 47.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX4: //NONSTANDARD symlen = SYMLEN_4; txpulse = mk_full_pulse(symlen); fp = mk_full_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsWid[i]; bw = 94.0 / THROB_SAMPLE_RATE; break; } outbuf = new double[symlen]; rxsymlen = symlen / DOWN_SAMPLE; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); fftfilter = new fftfilt(0, bw, FilterFFTLen); syncfilt = new C_FIR_filter(); syncfilt->init(symlen / DOWN_SAMPLE, 1, fp, NULL); delete [] fp; snfilter = new Cmovavg(16); for (int i = 0; i < num_tones; i++) rxtone[i] = mk_rxtone(freqs[i], txpulse, symlen); reverse = 0; samplerate = THROB_SAMPLE_RATE; fragmentsize = symlen; bandwidth = freqs[num_tones - 1] - freqs[0]; syncpos = 0.5; scope_data = new double [SCOPE_DATA_LEN]; phaseacc = 0.0; metric = 0.0; symptr = 0; for (int i = 0; i < MAX_RX_SYMLEN; i++) syncbuf[i] = dispbuf[i] = 0.0; // init(); } //===================================================================== // receive processing //===================================================================== // Make a 32 times down sampled cmplx prototype tone for rx. cmplx *throb::mk_rxtone(double freq, double *pulse, int len) { cmplx *tone; double x; int i; tone = new cmplx [len / DOWN_SAMPLE]; for (i = 0; i < len; i += DOWN_SAMPLE) { x = -2.0 * M_PI * freq * i / THROB_SAMPLE_RATE; tone[i / DOWN_SAMPLE] = cmplx ( pulse[i] * cos(x), pulse[i] * sin(x) ); } return tone; } cmplx throb::mixer(cmplx in) { double f; cmplx z (cos(phaseacc), sin(phaseacc)); z = z * in; f = frequency; phaseacc -= 2.0 * M_PI * f / THROB_SAMPLE_RATE; if (phaseacc < 0) phaseacc += TWOPI; return z; } int throb::findtones(cmplx *word, int &tone1, int &tone2) { double max1, max2; int maxtone, i; max1 = 0; tone1 = 0; for (i = 0; i < num_tones; i++) { if ( abs(word[i]) > max1 ) { max1 = abs(word[i]); tone1 = i; } } maxtone = tone1; max2 = 0; tone2 = 0; for (i = 0; i < num_tones; i++) { if (i == tone1) continue; if ( abs(word[i]) > max2) { max2 = abs(word[i]); tone2 = i; } } //handle single-tone symbols (Throb only) if (mode == MODE_THROB1 || mode == MODE_THROB2 || mode == MODE_THROB4) if (max1 > max2 * 2) tone2 = tone1; if (tone1 > tone2) { i = tone1; tone1 = tone2; tone2 = i; } signal = noise = 0.0; for (i = 0; i < num_tones; i++) { if ( i == tone1 || i == tone2) signal += abs(word[i]) / 2.0; else noise += abs(word[i]) / (num_tones - 2.0); } metric = snfilter->run( signal / (noise + 1e-6)); s2n = CLAMP( 10.0*log10( metric ) - 3.0, 0.0, 100.0); return maxtone; } void throb::show_char(int c) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); } void throb::decodechar(int tone1, int tone2) { int i; switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: if (shift == true) { if (tone1 == 0 && tone2 == 8) show_char('?'); if (tone1 == 1 && tone2 == 7) show_char('@'); if (tone1 == 2 && tone2 == 6) show_char('='); if (tone1 == 4 && tone2 == 4) show_char('\n'); shift = false; return; } if (tone1 == 3 && tone2 == 5) { shift = true; return; } for (i = 0; i < num_chars; i++) { if (ThrobTonePairs[i][0] == tone1 + 1 && ThrobTonePairs[i][1] == tone2 + 1) { show_char(ThrobCharSet[i]); break; } } break; //ThrobX mode. No shifted case, but idle and space symbols alternate default: for (i = 0; i < num_chars; i++) { if (ThrobXTonePairs[i][0] == tone1 + 1 && ThrobXTonePairs[i][1] == tone2 + 1) { if (i == spacesym || i == idlesym) { if (lastchar != '\0' && lastchar != ' ') { show_char(ThrobXCharSet[1]); lastchar = ' '; } else { lastchar = '\0'; } flip_syms(); } else { show_char(ThrobXCharSet[i]); lastchar = ThrobXCharSet[i]; } } } break; } return; } void throb::rx(cmplx in) { cmplx rxword[MAX_TONES]; int i, tone1, tone2, maxtone; symbol[symptr] = in; if (rxcntr > 0.0) return; // correlate against all tones for (i = 0; i < num_tones; i++) rxword[i] = cmac(rxtone[i], symbol, symptr + 1, rxsymlen); // find the strongest tones maxtone = findtones(rxword, tone1, tone2); // decode if (reverse) decodechar (num_tones - 1 - tone2, num_tones - 1 - tone1); else decodechar (tone1, tone2); if (progStatus.afconoff == true && (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false)) { cmplx z1, z2; double f; z1 = rxword[maxtone]; z2 = cmac(rxtone[maxtone], symbol, symptr + 2, rxsymlen); f = arg( conj(z1) * z2 ) / (2 * DOWN_SAMPLE * M_PI / THROB_SAMPLE_RATE); f -= freqs[maxtone]; set_freq(frequency + f / (num_tones - 1)); } /* done with this symbol, start over */ rxcntr = rxsymlen; waitsync = 1; snprintf(throbmsg, sizeof(throbmsg), "S/N: %3d dB", (int)(floor(s2n))); put_Status1(throbmsg); display_metric(metric); } void throb::sync(cmplx in) { double f, maxval = 0; double mag; int i, maxpos = 0; /* "rectify", filter and store input */ mag = abs(in); syncfilt->Irun( mag, f); syncbuf[symptr] = f; /* check counter if we are waiting for sync */ if (waitsync == 0 || rxcntr > (rxsymlen / 2.0)) return; for (i = 0; i < rxsymlen; i++) { f = syncbuf[(i + symptr + 1) % rxsymlen]; dispbuf[i] = f; } for (i = 0; i < rxsymlen; i++) { if (dispbuf[i] > maxval) { maxpos = i; maxval = dispbuf[i]; } } /* correct sync */ rxcntr += (maxpos - rxsymlen / 2) / (num_tones - 1); waitsync = 0; if (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false) set_scope(dispbuf, rxsymlen); else { dispbuf[0] = 0.0; set_scope(dispbuf, 1); } dispbuf.next(); // change buffers } int throb::rx_process(const double *buf, int len) { cmplx z, *zp; int i, n; while (len-- > 0) { z = cmplx( *buf, *buf ); buf++; hilbert->run(z, z); z = mixer(z); n = fftfilter->run(z, &zp); /* DOWN_SAMPLE by 32 and push to the receiver */ for (i = 0; i < n; i++) { if (++deccntr >= DOWN_SAMPLE) { rxcntr -= 1.0; /* do symbol sync */ sync(zp[i]); /* decode */ rx(zp[i]); symptr = (symptr + 1) % rxsymlen; deccntr = 0; } } } return 0; } //===================================================================== // transmit processing //===================================================================== double *throb::mk_semi_pulse(int len) { double *pulse, x; int i, j; pulse = new double [len]; for (i = 0; i < len; i++) { if (i < len / 5) { x = M_PI * i / (len / 5.0); pulse[i] = 0.5 * (1 - cos(x)); } if (i >= len / 5 && i < len * 4 / 5) pulse[i] = 1.0; if (i >= len * 4 / 5) { j = i - len * 4 / 5; x = M_PI * j / (len / 5.0); pulse[i] = 0.5 * (1 + cos(x)); } } return pulse; } double *throb::mk_full_pulse(int len) { double *pulse; int i; pulse = new double [len]; for (i = 0; i < len; i++) pulse[i] = 0.5 * (1 - cos(2 * M_PI * i / len)); return pulse; } void throb::send(int symbol) { int tone1, tone2; double w1, w2; int i; if (symbol < 0 || symbol >= num_chars) return; switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: tone1 = ThrobTonePairs[symbol][0] - 1; tone2 = ThrobTonePairs[symbol][1] - 1; break; default: tone1 = ThrobXTonePairs[symbol][0] -1; tone2 = ThrobXTonePairs[symbol][1] -1; break; } if (reverse) { tone1 = (num_tones - 1) - tone1; tone2 = (num_tones - 1) - tone2; } w1 = 2.0 * M_PI * (get_txfreq_woffset() + freqs[tone1]) / THROB_SAMPLE_RATE; w2 = 2.0 * M_PI * (get_txfreq_woffset() + freqs[tone2]) / THROB_SAMPLE_RATE; for (i = 0; i < symlen; i++) outbuf[i] = txpulse[i] * (sin(w1 * i) + sin(w2 * i)) / 2.0; ModulateXmtr(outbuf, symlen); } int throb::tx_process() { modem::tx_process(); int i, c, sym; if (preamble > 0) { send(idlesym); /* send idle throbs */ flip_syms(); preamble--; return 0; } c = get_tx_char(); // end of transmission if (c == GET_TX_CHAR_ETX || stopflag) { send(idlesym); // reset_syms(); //prepare RX. idle/space syms always start as 0 and 1, respectively. cwid(); return -1; } // TX buffer empty if (c == GET_TX_CHAR_NODATA) { send(idlesym); /* send idle throbs */ flip_syms(); return 0; } switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: /* handle the special cases first, if we're doing regular Throb */ switch (c) { case '?': send(5); /* shift */ send(20); put_echo_char(c); return 0; case '@': send(5); /* shift */ send(13); put_echo_char(c); return 0; case '-': send(5); /* shift */ send(9); put_echo_char(c); return 0; case '\r': return 0; case '\n': send(5); /* shift */ send(0); put_echo_char(c); return 0; default: break; } break; default: //If we're doing ThrobX, no need to handle shifts break; } /* map lower case character to upper case */ if (islower(c)) c = toupper(c); /* see if the character can be found in our character set */ switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: for (sym = -1, i = 0; i < num_chars; i++) if (c == ThrobCharSet[i]) sym = i; break; default: for (sym = -1, i = 0; i < num_chars; i++) if (c == ThrobXCharSet[i]) sym = i; break; } // send a space for unknown chars if (sym == -1) c = ' '; // handle spaces for throbx if (c == ' ') { sym = spacesym; flip_syms(); } send(sym); put_echo_char(progdefaults.rx_lowercase ? tolower(c) : c); return 0; } //===================================================================== // throb static declarations //===================================================================== int throb::ThrobTonePairs[45][2] = { {5, 5}, /* idle... no print */ {4, 5}, /* A */ {1, 2}, /* B */ {1, 3}, /* C */ {1, 4}, /* D */ {4, 6}, /* SHIFT (was E) */ {1, 5}, /* F */ {1, 6}, /* G */ {1, 7}, /* H */ {3, 7}, /* I */ {1, 8}, /* J */ {2, 3}, /* K */ {2, 4}, /* L */ {2, 8}, /* M */ {2, 5}, /* N */ {5, 6}, /* O */ {2, 6}, /* P */ {2, 9}, /* Q */ {3, 4}, /* R */ {3, 5}, /* S */ {1, 9}, /* T */ {3, 6}, /* U */ {8, 9}, /* V */ {3, 8}, /* W */ {3, 3}, /* X */ {2, 2}, /* Y */ {1, 1}, /* Z */ {3, 9}, /* 1 */ {4, 7}, /* 2 */ {4, 8}, /* 3 */ {4, 9}, /* 4 */ {5, 7}, /* 5 */ {5, 8}, /* 6 */ {5, 9}, /* 7 */ {6, 7}, /* 8 */ {6, 8}, /* 9 */ {6, 9}, /* 0 */ {7, 8}, /* , */ {7, 9}, /* . */ {8, 8}, /* ' */ {7, 7}, /* / */ {6, 6}, /* ) */ {4, 4}, /* ( */ {9, 9}, /* E */ {2, 7} /* space */ }; int throb::ThrobXTonePairs[55][2] = { {6, 11}, /* idle (initially) */ {1, 6}, /* space (initially) */ {2, 6}, /* A */ {2, 5}, /* B */ {2, 7}, /* C */ {2, 8}, /* D */ {5, 6}, /* E */ {2, 9}, /* F */ {2, 10}, /* G */ {4, 8}, /* H */ {4, 6}, /* I */ {2, 11}, /* J */ {3, 4}, /* K */ {3, 5}, /* L */ {3, 6}, /* M */ {6, 9}, /* N */ {6, 10}, /* O */ {3, 7}, /* P */ {3, 8}, /* Q */ {3, 9}, /* R */ {6, 8}, /* S */ {6, 7}, /* T */ {3, 10}, /* U */ {3, 11}, /* V */ {4, 5}, /* W */ {4, 7}, /* X */ {4, 9}, /* Y */ {4, 10}, /* Z */ {1, 2}, /* 1 */ {1, 3}, /* 2 */ {1, 4}, /* 3 */ {1, 5}, /* 4 */ {1, 7}, /* 5 */ {1, 8}, /* 6 */ {1, 9}, /* 7 */ {1, 10}, /* 8 */ {2, 3}, /* 9 */ {2, 4}, /* 0 */ {4, 11}, /* , */ {5, 7}, /* . */ {5, 8}, /* ' */ {5, 9}, /* / */ {5, 10}, /* ) */ {5, 11}, /* ( */ {7, 8}, /* # */ {7, 9}, /* " */ {7, 10}, /* + */ {7, 11}, /* - */ {8, 9}, /* ; */ {8, 10}, /* : */ {8, 11}, /* ? */ {9, 10}, /* ! */ {9, 11}, /* @ */ {10, 11}, /* = */ {1, 11} /* cr */ //FIXME: !!COMPLETELY NONSTANDARD!! }; unsigned char throb::ThrobCharSet[45] = { '\0', /* idle */ 'A', 'B', 'C', 'D', '\0', /* shift */ 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '\'', '/', ')', '(', 'E', ' ' }; unsigned char throb::ThrobXCharSet[55] = { '\0', /* idle (initially) */ ' ', /* space (initially) */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '\'', '/', ')', '(', '#', '"', '+', '-', ';', ':', '?', '!', '@', '=', '\n' }; double throb::ThrobToneFreqsNar[9] = {-32, -24, -16, -8, 0, 8, 16, 24, 32}; double throb::ThrobToneFreqsWid[9] = {-64, -48, -32, -16, 0, 16, 32, 48, 64}; double throb::ThrobXToneFreqsNar[11] = {-39.0625, -31.25, -23.4375, -15.625, -7.8125, 0, 7.8125, 15.625, 23.4375, 31.25, 39.0625}; double throb::ThrobXToneFreqsWid[11] = {-78.125, -62.5, -46.875, -31.25, -15.625, 0, 15.625, 31.25, 46.875, 62.5, 78.125}; fldigi-4.1.06/src/mfsk/0000775000175000017500000000000013515625027011600 500000000000000fldigi-4.1.06/src/mfsk/mfskvaricode.cxx0000644000175000017500000002570313472115777014736 00000000000000// ---------------------------------------------------------------------------- // // MFSKvaricode.cxx -- MFSK Varicode // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "mfskvaricode.h" /* * The IZ8BLY MFSK Varicode as defined in * http://www.qsl.net/zl1bpu/MFSK/Varicode.html */ static const char *varicode[] = { "11101011100", /* 000 - */ "11101100000", /* 001 - */ "11101101000", /* 002 - */ "11101101100", /* 003 - */ "11101110000", /* 004 - */ "11101110100", /* 005 - */ "11101111000", /* 006 - */ "11101111100", /* 007 - */ "10101000", /* 008 - */ "11110000000", /* 009 - */ "11110100000", /* 010 - */ "11110101000", /* 011 - */ "11110101100", /* 012 - */ "10101100", /* 013 - */ "11110110000", /* 014 - */ "11110110100", /* 015 - */ "11110111000", /* 016 - */ "11110111100", /* 017 - */ "11111000000", /* 018 - */ "11111010000", /* 019 - */ "11111010100", /* 020 - */ "11111011000", /* 021 - */ "11111011100", /* 022 - */ "11111100000", /* 023 - */ "11111101000", /* 024 - */ "11111101100", /* 025 - */ "11111110000", /* 026 - */ "11111110100", /* 027 - */ "11111111000", /* 028 - */ "11111111100", /* 029 - */ "100000000000", /* 030 - */ "101000000000", /* 031 - */ "100", /* 032 - */ "111000000", /* 033 - ! */ "111111100", /* 034 - '"' */ "1011011000", /* 035 - # */ "1010101000", /* 036 - $ */ "1010100000", /* 037 - % */ "1000000000", /* 038 - & */ "110111100", /* 039 - ' */ "111110100", /* 040 - ( */ "111110000", /* 041 - ) */ "1010110100", /* 042 - * */ "111100000", /* 043 - + */ "10100000", /* 044 - , */ "111011000", /* 045 - - */ "111010100", /* 046 - . */ "111101000", /* 047 - / */ "11100000", /* 048 - 0 */ "11110000", /* 049 - 1 */ "101000000", /* 050 - 2 */ "101010100", /* 051 - 3 */ "101110100", /* 052 - 4 */ "101100000", /* 053 - 5 */ "101101100", /* 054 - 6 */ "110100000", /* 055 - 7 */ "110000000", /* 056 - 8 */ "110101100", /* 057 - 9 */ "111101100", /* 058 - : */ "111111000", /* 059 - ; */ "1011000000", /* 060 - < */ "111011100", /* 061 - = */ "1010111100", /* 062 - > */ "111010000", /* 063 - ? */ "1010000000", /* 064 - @ */ "10111100", /* 065 - A */ "100000000", /* 066 - B */ "11010100", /* 067 - C */ "11011100", /* 068 - D */ "10111000", /* 069 - E */ "11111000", /* 070 - F */ "101010000", /* 071 - G */ "101011000", /* 072 - H */ "11000000", /* 073 - I */ "110110100", /* 074 - J */ "101111100", /* 075 - K */ "11110100", /* 076 - L */ "11101000", /* 077 - M */ "11111100", /* 078 - N */ "11010000", /* 079 - O */ "11101100", /* 080 - P */ "110110000", /* 081 - Q */ "11011000", /* 082 - R */ "10110100", /* 083 - S */ "10110000", /* 084 - T */ "101011100", /* 085 - U */ "110101000", /* 086 - V */ "101101000", /* 087 - W */ "101110000", /* 088 - X */ "101111000", /* 089 - Y */ "110111000", /* 090 - Z */ "1011101000", /* 091 - [ */ "1011010000", /* 092 - \ */ "1011101100", /* 093 - ] */ "1011010100", /* 094 - ^ */ "1010110000", /* 095 - _ */ "1010101100", /* 096 - ` */ "10100", /* 097 - a */ "1100000", /* 098 - b */ "111000", /* 099 - c */ "110100", /* 100 - d */ "1000", /* 101 - e */ "1010000", /* 102 - f */ "1011000", /* 103 - g */ "110000", /* 104 - h */ "11000", /* 105 - i */ "10000000", /* 106 - j */ "1110000", /* 107 - k */ "101100", /* 108 - l */ "1000000", /* 109 - m */ "11100", /* 110 - n */ "10000", /* 111 - o */ "1010100", /* 112 - p */ "1111000", /* 113 - q */ "100000", /* 114 - r */ "101000", /* 115 - s */ "1100", /* 116 - t */ "111100", /* 117 - u */ "1101100", /* 118 - v */ "1101000", /* 119 - w */ "1110100", /* 120 - x */ "1011100", /* 121 - y */ "1111100", /* 122 - z */ "1011011100", /* 123 - { */ "1010111000", /* 124 - | */ "1011100000", /* 125 - } */ "1011110000", /* 126 - ~ */ "101010000000", /* 127 - */ "101010100000", /* 128 - */ "101010101000", /* 129 - */ "101010101100", /* 130 - */ "101010110000", /* 131 - */ "101010110100", /* 132 - */ "101010111000", /* 133 - */ "101010111100", /* 134 - */ "101011000000", /* 135 - */ "101011010000", /* 136 - */ "101011010100", /* 137 - */ "101011011000", /* 138 - */ "101011011100", /* 139 - */ "101011100000", /* 140 - */ "101011101000", /* 141 - */ "101011101100", /* 142 - */ "101011110000", /* 143 - */ "101011110100", /* 144 - */ "101011111000", /* 145 - */ "101011111100", /* 146 - */ "101100000000", /* 147 - */ "101101000000", /* 148 - */ "101101010000", /* 149 - */ "101101010100", /* 150 - */ "101101011000", /* 151 - */ "101101011100", /* 152 - */ "101101100000", /* 153 - */ "101101101000", /* 154 - */ "101101101100", /* 155 - */ "101101110000", /* 156 - */ "101101110100", /* 157 - */ "101101111000", /* 158 - */ "101101111100", /* 159 - */ "1011110100", /* 160 - */ "1011111000", /* 161 - ¡ */ "1011111100", /* 162 - ¢ */ "1100000000", /* 163 - £ */ "1101000000", /* 164 - ¤ */ "1101010000", /* 165 - ¥ */ "1101010100", /* 166 - ¦ */ "1101011000", /* 167 - § */ "1101011100", /* 168 - ¨ */ "1101100000", /* 169 - © */ "1101101000", /* 170 - ª */ "1101101100", /* 171 - « */ "1101110000", /* 172 - ¬ */ "1101110100", /* 173 - ­ */ "1101111000", /* 174 - ® */ "1101111100", /* 175 - ¯ */ "1110000000", /* 176 - ° */ "1110100000", /* 177 - ± */ "1110101000", /* 178 - ² */ "1110101100", /* 179 - ³ */ "1110110000", /* 180 - ´ */ "1110110100", /* 181 - µ */ "1110111000", /* 182 - ¶ */ "1110111100", /* 183 - · */ "1111000000", /* 184 - ¸ */ "1111010000", /* 185 - ¹ */ "1111010100", /* 186 - º */ "1111011000", /* 187 - » */ "1111011100", /* 188 - ¼ */ "1111100000", /* 189 - ½ */ "1111101000", /* 190 - ¾ */ "1111101100", /* 191 - ¿ */ "1111110000", /* 192 - À */ "1111110100", /* 193 - Á */ "1111111000", /* 194 -  */ "1111111100", /* 195 - à */ "10000000000", /* 196 - Ä */ "10100000000", /* 197 - Å */ "10101000000", /* 198 - Æ */ "10101010000", /* 199 - Ç */ "10101010100", /* 200 - È */ "10101011000", /* 201 - É */ "10101011100", /* 202 - Ê */ "10101100000", /* 203 - Ë */ "10101101000", /* 204 - Ì */ "10101101100", /* 205 - Í */ "10101110000", /* 206 - Î */ "10101110100", /* 207 - Ï */ "10101111000", /* 208 - Ð */ "10101111100", /* 209 - Ñ */ "10110000000", /* 210 - Ò */ "10110100000", /* 211 - Ó */ "10110101000", /* 212 - Ô */ "10110101100", /* 213 - Õ */ "10110110000", /* 214 - Ö */ "10110110100", /* 215 - × */ "10110111000", /* 216 - Ø */ "10110111100", /* 217 - Ù */ "10111000000", /* 218 - Ú */ "10111010000", /* 219 - Û */ "10111010100", /* 220 - Ü */ "10111011000", /* 221 - Ý */ "10111011100", /* 222 - Þ */ "10111100000", /* 223 - ß */ "10111101000", /* 224 - à */ "10111101100", /* 225 - á */ "10111110000", /* 226 - â */ "10111110100", /* 227 - ã */ "10111111000", /* 228 - ä */ "10111111100", /* 229 - å */ "11000000000", /* 230 - æ */ "11010000000", /* 231 - ç */ "11010100000", /* 232 - è */ "11010101000", /* 233 - é */ "11010101100", /* 234 - ê */ "11010110000", /* 235 - ë */ "11010110100", /* 236 - ì */ "11010111000", /* 237 - í */ "11010111100", /* 238 - î */ "11011000000", /* 239 - ï */ "11011010000", /* 240 - ð */ "11011010100", /* 241 - ñ */ "11011011000", /* 242 - ò */ "11011011100", /* 243 - ó */ "11011100000", /* 244 - ô */ "11011101000", /* 245 - õ */ "11011101100", /* 246 - ö */ "11011110000", /* 247 - ÷ */ "11011110100", /* 248 - ø */ "11011111000", /* 249 - ù */ "11011111100", /* 250 - ú */ "11100000000", /* 251 - û */ "11101000000", /* 252 - n */ "11101010000", /* 253 - ý */ "11101010100", /* 254 - þ */ "11101011000" /* 255 - ÿ */ }; /* * The same in a format more suitable for decoding. */ static const unsigned int varidecode[] = { 0x75C, 0x760, 0x768, 0x76C, 0x770, 0x774, 0x778, 0x77C, 0x0A8, 0x780, 0x7A0, 0x7A8, 0x7AC, 0x0AC, 0x7B0, 0x7B4, 0x7B8, 0x7BC, 0x7C0, 0x7D0, 0x7D4, 0x7D8, 0x7DC, 0x7E0, 0x7E8, 0x7EC, 0x7F0, 0x7F4, 0x7F8, 0x7FC, 0x800, 0xA00, 0x004, 0x1C0, 0x1FC, 0x2D8, 0x2A8, 0x2A0, 0x200, 0x1BC, 0x1F4, 0x1F0, 0x2B4, 0x1E0, 0x0A0, 0x1D8, 0x1D4, 0x1E8, 0x0E0, 0x0F0, 0x140, 0x154, 0x174, 0x160, 0x16C, 0x1A0, 0x180, 0x1AC, 0x1EC, 0x1F8, 0x2C0, 0x1DC, 0x2BC, 0x1D0, 0x280, 0x0BC, 0x100, 0x0D4, 0x0DC, 0x0B8, 0x0F8, 0x150, 0x158, 0x0C0, 0x1B4, 0x17C, 0x0F4, 0x0E8, 0x0FC, 0x0D0, 0x0EC, 0x1B0, 0x0D8, 0x0B4, 0x0B0, 0x15C, 0x1A8, 0x168, 0x170, 0x178, 0x1B8, 0x2E8, 0x2D0, 0x2EC, 0x2D4, 0x2B0, 0x2AC, 0x014, 0x060, 0x038, 0x034, 0x008, 0x050, 0x058, 0x030, 0x018, 0x080, 0x070, 0x02C, 0x040, 0x01C, 0x010, 0x054, 0x078, 0x020, 0x028, 0x00C, 0x03C, 0x06C, 0x068, 0x074, 0x05C, 0x07C, 0x2DC, 0x2B8, 0x2E0, 0x2F0, 0xA80, 0xAA0, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xAE8, 0xAEC, 0xAF0, 0xAF4, 0xAF8, 0xAFC, 0xB00, 0xB40, 0xB50, 0xB54, 0xB58, 0xB5C, 0xB60, 0xB68, 0xB6C, 0xB70, 0xB74, 0xB78, 0xB7C, 0x2F4, 0x2F8, 0x2FC, 0x300, 0x340, 0x350, 0x354, 0x358, 0x35C, 0x360, 0x368, 0x36C, 0x370, 0x374, 0x378, 0x37C, 0x380, 0x3A0, 0x3A8, 0x3AC, 0x3B0, 0x3B4, 0x3B8, 0x3BC, 0x3C0, 0x3D0, 0x3D4, 0x3D8, 0x3DC, 0x3E0, 0x3E8, 0x3EC, 0x3F0, 0x3F4, 0x3F8, 0x3FC, 0x400, 0x500, 0x540, 0x550, 0x554, 0x558, 0x55C, 0x560, 0x568, 0x56C, 0x570, 0x574, 0x578, 0x57C, 0x580, 0x5A0, 0x5A8, 0x5AC, 0x5B0, 0x5B4, 0x5B8, 0x5BC, 0x5C0, 0x5D0, 0x5D4, 0x5D8, 0x5DC, 0x5E0, 0x5E8, 0x5EC, 0x5F0, 0x5F4, 0x5F8, 0x5FC, 0x600, 0x680, 0x6A0, 0x6A8, 0x6AC, 0x6B0, 0x6B4, 0x6B8, 0x6BC, 0x6C0, 0x6D0, 0x6D4, 0x6D8, 0x6DC, 0x6E0, 0x6E8, 0x6EC, 0x6F0, 0x6F4, 0x6F8, 0x6FC, 0x700, 0x740, 0x750, 0x754, 0x758 }; const char *varienc(int c) { if (c >= 0 && c < 256) return varicode[c]; return varicode[0]; } int varidec(unsigned int symbol) { int i; for (i = 0; i < 256; i++) if (symbol == varidecode[i]) return i; return -1; } fldigi-4.1.06/src/mfsk/interleave.cxx0000644000175000017500000000466313472115777014421 00000000000000// ---------------------------------------------------------------------------- // interleave.cxx -- MFSK (de)interleaver // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "interleave.h" // ---------------------------------------------------------------------- interleave::interleave (int _size, int _depth, int dir) { size = _size; depth = _depth; direction = dir; len = size * size * depth; table = new unsigned char [len]; flush(); } interleave::~interleave () { delete [] table; } void interleave::init() { if(table) { len = size * size * depth; flush(); } } void interleave::symbols(unsigned char *psyms) { int i, j, k; for (k = 0; k < depth; k++) { for (i = 0; i < size; i++) for (j = 0; j < size - 1; j++) *tab(k, i, j) = *tab(k, i, j + 1); for (i = 0; i < size; i++) *tab(k, i, size - 1) = psyms[i]; for (i = 0; i < size; i++) { if (direction == INTERLEAVE_FWD) psyms[i] = *tab(k, i, size - i - 1); else psyms[i] = *tab(k, i, i); } } } void interleave::bits(unsigned int *pbits) { unsigned char syms[size]; int i; for (i = 0; i < size; i++) syms[i] = (*pbits >> (size - i - 1)) & 1; symbols(syms); for (*pbits = i = 0; i < size; i++) *pbits = (*pbits << 1) | syms[i]; } void interleave::flush(void) { // Fill entire RX interleaver with punctures or 0 depending on whether // Rx or Tx if (direction == INTERLEAVE_REV) memset(table, PUNCTURE, len); else memset(table, 0, len); } // ---------------------------------------------------------------------- fldigi-4.1.06/src/mfsk/mfsk.cxx0000664000175000017500000006114113507401434013202 00000000000000// ---------------------------------------------------------------------------- // mfsk.cxx -- mfsk modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "mfsk.h" #include "modem.h" #include "misc.h" #include "main.h" #include "fl_digi.h" #include "configuration.h" #include "status.h" #include "trx.h" #include "ascii.h" #include "fileselect.h" #include "qrunner.h" #include "debug.h" #define SOFTPROFILE false using namespace std; // MFSKpic receive start delay value based on a viterbi length of 45 // 44 nulls at 8 samples per pixel // 88 nulls at 4 samples per pixel // 176 nulls at 2 samples per pixel struct TRACEPAIR { int trace; int delay; TRACEPAIR( int a, int b) { trace = a; delay = b;} }; TRACEPAIR tracepair(45, 352); // enable to limit within band signal sidebands // not really needed static bool xmt_filter = false; //============================================================================= char mfskmsg[80]; //============================================================================= #include "mfsk-pic.cxx" void mfsk::tx_init() { txstate = TX_STATE_PREAMBLE; bitstate = 0; double factor = 1.5; double bw2 = factor*(numtones + 1) * samplerate / symlen / 2.0; double flo = (get_txfreq_woffset() - bw2);// / samplerate; if (flo <= 100) flo = 100; double fhi = (get_txfreq_woffset() + bw2);// / samplerate; if (fhi >= samplerate/2 - 100) fhi = samplerate/2 - 100; xmtfilt->init_bandpass (255, 1, flo/samplerate, fhi/samplerate); videoText(); } void mfsk::rx_init() { rxstate = RX_STATE_DATA; synccounter = 0; symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; RXspp = 8; for (int i = 0; i < 2 * symlen; i++) { for (int j = 0; j < 32; j++) pipe[i].vector[j] = cmplx(0,0); } reset_afc(); s2n = 0.0; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; put_MODEstatus(mode); syncfilter->reset(); staticburst = false; s2n_valid = false; } void mfsk::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::SCOPE); // picture mode init setpicture_link(this); TXspp = txSPP; RXspp = 8; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } void mfsk::shutdown() { } mfsk::~mfsk() { stopflag = true; int msecs = 200; while(--msecs && txstate != TX_STATE_PREAMBLE) MilliSleep(1); // do not destroy picTxWin or picRxWin as there may be pending updates // in the UI request queue if (picTxWin) picTxWin->hide(); activate_mfsk_image_item(false); if (bpfilt) delete bpfilt; if (xmtfilt) delete xmtfilt; if (rxinlv) delete rxinlv; if (txinlv) delete txinlv; if (dec2) delete dec2; if (dec1) delete dec1; if (enc) delete enc; if (pipe) delete [] pipe; if (hbfilt) delete hbfilt; if (binsfft) delete binsfft; for (int i = 0; i < SCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; } mfsk::mfsk(trx_mode mfsk_mode) : modem() { cap |= CAP_AFC | CAP_REV; double bw, cf, flo, fhi; mode = mfsk_mode; depth = 10; // CAP_IMG is set in cap iff image transfer supported switch (mode) { case MODE_MFSK4: samplerate = 8000; symlen = 2048; symbits = 5; depth = 5; basetone = 256; numtones = 32; preamble = 107; // original mfsk modes break; case MODE_MFSK8: samplerate = 8000; symlen = 1024; symbits = 5; depth = 5; basetone = 128; numtones = 32; preamble = 107; // original mfsk modes break; case MODE_MFSK31: samplerate = 8000; symlen = 256; symbits = 3; depth = 10; basetone = 32; numtones = 8; preamble = 107; // original mfsk modes break; case MODE_MFSK32: samplerate = 8000; symlen = 256; symbits = 4; depth = 10; basetone = 32; numtones = 16; preamble = 107; // original mfsk modes cap |= CAP_IMG; break; case MODE_MFSK64: samplerate = 8000; symlen = 128; symbits = 4; depth = 10; basetone = 16; numtones = 16; preamble = 180; cap |= CAP_IMG; break; case MODE_MFSK128: samplerate = 8000; symlen = 64; symbits = 4; depth = 20; basetone = 8; numtones = 16; cap |= CAP_IMG; preamble = 214; break; case MODE_MFSK64L: samplerate = 8000; symlen = 128; symbits = 4; depth = 400; preamble = 2500; basetone = 16; numtones = 16; break; case MODE_MFSK128L: samplerate = 8000; symlen = 64; symbits = 4; depth = 800; preamble = 5000; basetone = 8; numtones = 16; break; case MODE_MFSK11: samplerate = 11025; symlen = 1024; symbits = 4; depth = 10; basetone = 93; numtones = 16; preamble = 107; break; case MODE_MFSK22: samplerate = 11025; symlen = 512; symbits = 4; depth = 10; basetone = 46; numtones = 16; preamble = 107; break; case MODE_MFSK16: default: samplerate = 8000; symlen = 512; symbits = 4; depth = 10; basetone = 64; numtones = 16; preamble = 107; cap |= CAP_IMG; break; } tonespacing = (double) samplerate / symlen; basefreq = 1.0 * samplerate * basetone / symlen; binsfft = new sfft (symlen, basetone, basetone + numtones ); hbfilt = new C_FIR_filter(); hbfilt->init_hilbert(37, 1); syncfilter = new Cmovavg(8); for (int i = 0; i < SCOPESIZE; i++) vidfilter[i] = new Cmovavg(16); pipe = new rxpipe[ 2 * symlen ]; enc = new encoder (NASA_K, POLY1, POLY2); dec1 = new viterbi (NASA_K, POLY1, POLY2); dec2 = new viterbi (NASA_K, POLY1, POLY2); dec1->settraceback (tracepair.trace); dec2->settraceback (tracepair.trace); dec1->setchunksize (1); dec2->setchunksize (1); txinlv = new interleave (symbits, depth, INTERLEAVE_FWD); rxinlv = new interleave (symbits, depth, INTERLEAVE_REV); bw = (numtones - 1) * tonespacing; cf = basefreq + bw / 2.0; flo = (cf - bw/2 - 2 * tonespacing) / samplerate; fhi = (cf + bw/2 + 2 * tonespacing) / samplerate; bpfilt = new C_FIR_filter(); bpfilt->init_bandpass (127, 1, flo, fhi); xmtfilt = new C_FIR_filter(); scopedata.alloc(symlen * 2); fragmentsize = symlen; bandwidth = (numtones - 1) * tonespacing; startpic = false; abortxmt = false; stopflag = false; bitshreg = 0; bitstate = 0; phaseacc = 0; pipeptr = 0; metric = 0; prev1symbol = prev2symbol = 0; symbolpair[0] = symbolpair[1] = 0; // picTxWin and picRxWin are created once to support all instances of mfsk if (!picTxWin) createTxViewer(); if (!picRxWin) createRxViewer(); activate_mfsk_image_item(true); afcmetric = 0.0; datashreg = 1; for (int i = 0; i < 128; i++) prepost[i] = 0; } //===================================================================== // receive processing //===================================================================== void mfsk::s2nreport(void) { modem::s2nreport(); s2n_valid = false; } bool mfsk::check_picture_header(char c) { char *p; if (c >= ' ' && c <= 'z') { memmove(picheader, picheader + 1, PICHEADER - 1); picheader[PICHEADER - 2] = c; } picW = 0; picH = 0; color = false; p = strstr(picheader, "Pic:"); if (p == NULL) return false; p += 4; if (*p == 0) return false; while ( *p && isdigit(*p)) picW = (picW * 10) + (*p++ - '0'); if (*p++ != 'x') return false; while ( *p && isdigit(*p)) picH = (picH * 10) + (*p++ - '0'); if (*p == 'C') { color = true; p++; } if (*p == ';') { if (picW == 0 || picH == 0 || picW > 4095 || picH > 4095) return false; RXspp = 8; return true; } if (*p == 'p') p++; else return false; if (!*p) return false; RXspp = 8; if (*p == '4') RXspp = 4; if (*p == '2') RXspp = 2; p++; if (!*p) return false; if (*p != ';') return false; if (picW == 0 || picH == 0 || picW > 4095 || picH > 4095) return false; return true; } void mfsk::recvpic(cmplx z) { int byte; picf += arg( conj(prevz) * z) * samplerate / TWOPI; prevz = z; if ((counter % RXspp) == 0) { picf = 256 * (picf / RXspp - basefreq) / bandwidth; byte = (int)CLAMP(picf, 0.0, 255.0); if (reverse) byte = 255 - byte; if (color) { pixelnbr = rgb + row + 3*col; REQ(updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; row += 3 * picW; } } } else { for (int i = 0; i < 3; i++) REQ(updateRxPic, byte, pixelnbr++); } picf = 0.0; int n = picW * picH * 3; if (pixelnbr % (picW * 3) == 0) { snprintf(mfskmsg, sizeof(mfskmsg), "Rx pic: %3.1f%%", (100.0f * pixelnbr) / n); put_status(mfskmsg); } } } void mfsk::recvchar(int c) { if (c == -1 || c == 0) return; put_rx_char(c); if (check_picture_header(c) == true) { counter = tracepair.delay; switch (mode) { case MODE_MFSK16: if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK32: if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK64: counter = 4956; if (symbolbit % 2 == 0) counter += symlen; break; case MODE_MFSK128: counter = 1824; if (symbolbit % 2 == 0) counter += symlen; break; case MODE_MFSK31: counter = 5216; if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK4: case MODE_MFSK8: case MODE_MFSK11: case MODE_MFSK22: default: break; }; rxstate = RX_STATE_PICTURE_START; picturesize = RXspp * picW * picH * (color ? 3 : 1); pixelnbr = 0; col = 0; row = 0; rgb = 0; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; return; } else counter = 0; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { if ((c == SOH) && !s2n_valid) { // starts collecting s2n from first SOH in stream (since start of RX) s2n_valid = true; s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } if (s2n_valid) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if (c == EOT) s2nreport(); } } return; } void mfsk::recvbit(int bit) { int c; datashreg = (datashreg << 1) | !!bit; if ((datashreg & 7) == 1) { c = varidec(datashreg >> 1); recvchar(c); datashreg = 1; } } void mfsk::decodesymbol(unsigned char symbol) { int c, met; symbolpair[0] = symbolpair[1]; symbolpair[1] = symbol; symcounter = symcounter ? 0 : 1; // only modes with odd number of symbits need a vote if (symbits == 5 || symbits == 3) { // could use symbits % 2 == 0 if (symcounter) { if ((c = dec1->decode(symbolpair, &met)) == -1) return; met1 = decayavg(met1, met, 50);//32); if (met1 < met2) return; metric = met1; } else { if ((c = dec2->decode(symbolpair, &met)) == -1) return; met2 = decayavg(met2, met, 50);//32); if (met2 < met1) return; metric = met2; } } else { if (symcounter) return; if ((c = dec2->decode(symbolpair, &met)) == -1) return; met2 = decayavg(met2, met, 50);//32); metric = met2; } if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { // s2n reporting: re-calibrate s2n_metric = metric * 4.5 - 42; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } // Re-scale the metric and update main window metric -= 60.0; metric *= 0.5; metric = CLAMP(metric, 0.0, 100.0); display_metric(metric); if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; recvbit(c); } void mfsk::softdecode(cmplx *bins) { double binmag, sum=0, avg=0, b[symbits]; unsigned char symbols[symbits]; int i, j, k, CWIsymbol; static int CWIcounter[MAX_SYMBOLS] = {0}; static const int CWI_MAXCOUNT=6; // this is the maximum number of repeated tones which is valid for the modem ( 0 excluded ) for (i = 0; i < symbits; i++) b[i] = 0.0; // Calculate the average signal, ignoring CWI tones for (i = 0; i < numtones; i++) { if ( CWIcounter[i] < CWI_MAXCOUNT ) sum += abs(bins[i]); } avg = sum / numtones; // avoid divide by zero later if ( sum < 1e-10 ) sum = 1e-10; // dynamic CWI avoidance: use harddecode() result (currsymbol) for CWI detection if (reverse) CWIsymbol = (numtones - 1) - currsymbol; else CWIsymbol = currsymbol; // Add or subtract the CWI counters based on harddecode result // avoiding tone #0 by starting at 1 for (i = 1; i < numtones ; i++) { if (reverse) k = (numtones - 1) - i; else k = i; if ( k == CWIsymbol) CWIcounter[k]++; else CWIcounter[k]--; // bounds-check the counts to keep the values sane if (CWIcounter[k] < 0) CWIcounter[k] = 0; if (CWIcounter[k] > CWI_MAXCOUNT) CWIcounter[k] = CWI_MAXCOUNT + 1; } // Grey decode and form soft decision samples for (i = 0; i < numtones; i++) { j = graydecode(i); if (reverse) k = (numtones - 1) - i; else k = i; // Avoid CWI. This never affects tone #0 if ( CWIcounter[k] > CWI_MAXCOUNT ) { binmag = avg; // soft-puncture to the average signal-level } else if ( CWIsymbol == k ) binmag = 2.0f * abs(bins[k]); // give harddecode() a vote in softdecode's decision. else binmag = abs(bins[k]); for (k = 0; k < symbits; k++) b[k] += (j & (1 << (symbits - k - 1))) ? binmag : -binmag; } #if SOFTPROFILE LOG_INFO("harddecode() symbol = %d", CWIsymbol ); #endif // shift to range 0...255 for (i = 0; i < symbits; i++) { unsigned char softbits; if (staticburst) softbits = 128; // puncturing else softbits = (unsigned char)clamp(128.0 + (b[i] / (sum) * 256.0), 0, 255); symbols[i] = softbits; #if SOFTPROFILE LOG_INFO("softbits = %3u", softbits); #endif } rxinlv->symbols(symbols); for (i = 0; i < symbits; i++) { symbolbit = i + 1; decodesymbol(symbols[i]); if (counter) return; } } cmplx mfsk::mixer(cmplx in, double f) { cmplx z; // Basetone is a nominal 1000 Hz f -= tonespacing * basetone + bandwidth / 2; z = in * cmplx( cos(phaseacc), sin(phaseacc) ); phaseacc -= TWOPI * f / samplerate; if (phaseacc < 0) phaseacc += TWOPI; return z; } // finds the tone bin with the largest signal level // assumes that will be the present tone received // with NO CW inteference int mfsk::harddecode(cmplx *in) { double x, max = 0.0, avg = 0.0; int i, symbol = 0; int burstcount = 0; for (int i = 0; i < numtones; i++) avg += abs(in[i]); avg /= numtones; if (avg < 1e-20) avg = 1e-20; for (i = 0; i < numtones; i++) { x = abs(in[i]); if ( x > max) { max = x; symbol = i; } if (x > 2.0 * avg) burstcount++; } staticburst = (burstcount == numtones); if (!staticburst) afcmetric = 0.95*afcmetric + 0.05 * (2 * max / avg); else afcmetric = 0.0; return symbol; } void mfsk::update_syncscope() { int j; int pipelen = 2 * symlen; memset(scopedata, 0, 2 * symlen * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) for (unsigned int i = 0; i < SCOPESIZE; i++) { j = (pipeptr + i * pipelen / SCOPESIZE + 1) % (pipelen); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } set_scope(scopedata, SCOPESIZE); scopedata.next(); // change buffers snprintf(mfskmsg, sizeof(mfskmsg), "s/n %3.0f dB", 20.0 * log10(s2n)); put_Status1(mfskmsg); } void mfsk::synchronize() { int i, j; double syn = -1; double val, max = 0.0; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; j = pipeptr; for (i = 0; i < 2 * symlen; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % (2 * symlen); } syn = syncfilter->run(syn); synccounter += (int) floor((syn - symlen) / numtones + 0.5); update_syncscope(); } void mfsk::reset_afc() { freqerr = 0.0; syncfilter->reset(); return; } void mfsk::afc() { cmplx z; cmplx prevvector; double f, f1; double ts = tonespacing / 4; if (sigsearch) { reset_afc(); sigsearch = 0; } if (staticburst || !progStatus.afconoff) return; if (metric < progStatus.sldrSquelchValue) return; if (afcmetric < 3.0) return; if (currsymbol != prev1symbol) return; if (pipeptr == 0) prevvector = pipe[2*symlen - 1].vector[currsymbol]; else prevvector = pipe[pipeptr - 1].vector[currsymbol]; z = conj(prevvector) * currvector; f = arg(z) * samplerate / TWOPI; f1 = tonespacing * (basetone + currsymbol); if ( fabs(f1 - f) < ts) { freqerr = decayavg(freqerr, (f1 - f), 32); set_freq(frequency - freqerr); } } void mfsk::eval_s2n() { sig = abs(pipe[pipeptr].vector[currsymbol]); noise = (numtones -1) * abs(pipe[pipeptr].vector[prev2symbol]); if (noise > 0) s2n = decayavg ( s2n, sig / noise, 64 ); } int mfsk::rx_process(const double *buf, int len) { cmplx z; cmplx* bins = 0; while (len-- > 0) { // create analytic signal... z = cmplx( *buf, *buf ); buf++; hbfilt->run ( z, z ); // shift in frequency to the base freq z = mixer(z, frequency); // bandpass filter around the shifted center frequency // with required bandwidth bpfilt->run ( z, z ); // copy current vector to the pipe binsfft->run (z, pipe[pipeptr].vector, 1); bins = pipe[pipeptr].vector; if (rxstate == RX_STATE_PICTURE_START) { if (--counter == 0) { counter = picturesize; rxstate = RX_STATE_PICTURE; REQ( showRxViewer, picW, picH ); } } if (rxstate == RX_STATE_PICTURE) { if (--counter == 0) { rxstate = RX_STATE_DATA; put_status(""); string autosave_dir = PicsDir; picRx->save_png(autosave_dir.c_str()); rx_init(); } else recvpic(z); continue; } // copy current vector to the pipe // binsfft->run (z, pipe[pipeptr].vector, 1); // bins = pipe[pipeptr].vector; if (--synccounter <= 0) { synccounter = symlen; currsymbol = harddecode(bins); currvector = bins[currsymbol]; softdecode(bins); // symbol sync synchronize(); // frequency tracking afc(); eval_s2n(); prev2symbol = prev1symbol; prev2vector = prev1vector; prev1symbol = currsymbol; prev1vector = currvector; } pipeptr = (pipeptr + 1) % (2 * symlen); } return 0; } //===================================================================== // transmit processing //===================================================================== void mfsk::transmit(double *buf, int len) { if (xmt_filter) for (int i = 0; i < len; i++) xmtfilt->Irun(buf[i], buf[i]); ModulateXmtr(buf, len); } void mfsk::sendsymbol(int sym) { double f, phaseincr; f = get_txfreq_woffset() - bandwidth / 2; sym = grayencode(sym & (numtones - 1)); if (reverse) sym = (numtones - 1) - sym; phaseincr = TWOPI * (f + sym*tonespacing) / samplerate; for (int i = 0; i < symlen; i++) { outbuf[i] = cos(phaseacc); phaseacc -= phaseincr; if (phaseacc < 0) phaseacc += TWOPI; } transmit (outbuf, symlen); } void mfsk::sendbit(int bit) { int data = enc->encode(bit); for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == symbits) { txinlv->bits(&bitshreg); sendsymbol(bitshreg); bitstate = 0; bitshreg = 0; } } } void mfsk::sendchar(unsigned char c) { const char *code = varienc(c); while (*code) sendbit(*code++ - '0'); put_echo_char(c); } void mfsk::sendidle() { sendchar(0); sendbit(1); // extended zero bit stream for (int i = 0; i < 32; i++) sendbit(0); } void mfsk::flushtx(int nbits) { // flush the varicode decoder at the other end sendbit(1); // flush the convolutional encoder and interleaver //VK2ETA high speed modes for (int i = 0; i < 107; i++) //W1HKJ for (int i = 0; i < preamble; i++) for (int i = 0; i < nbits; i++) sendbit(0); bitstate = 0; } void mfsk::sendpic(unsigned char *data, int len) { double *ptr; double f; int i, j; ptr = outbuf; for (i = 0; i < len; i++) { if (txstate == TX_STATE_PICTURE) REQ(updateTxPic, data[i]); if (reverse) f = get_txfreq_woffset() - bandwidth * (data[i] - 128) / 256.0; else f = get_txfreq_woffset() + bandwidth * (data[i] - 128) / 256.0; for (j = 0; j < TXspp; j++) { *ptr++ = cos(phaseacc); phaseacc += TWOPI * f / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; } } transmit (outbuf, TXspp * len); } // ----------------------------------------------------------------------------- // send prologue consisting of tracepair.delay 0's void mfsk::flush_xmt_filter(int n) { double f1 = get_txfreq_woffset() - bandwidth / 2.0; double f2 = get_txfreq_woffset() + bandwidth / 2.0; for (int i = 0; i < n; i++) { outbuf[i] = cos(phaseacc); phaseacc += TWOPI * (reverse ? f2 : f1) / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; } transmit (outbuf, tracepair.delay); } void mfsk::send_prologue() { flush_xmt_filter(tracepair.delay); } void mfsk::send_epilogue() { flush_xmt_filter(64); } static bool close_after_transmit = false; void mfsk::clearbits() { int data = enc->encode(0); for (int k = 0; k < preamble; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == symbits) { txinlv->bits(&bitshreg); bitstate = 0; bitshreg = 0; } } } } int mfsk::tx_process() { // filter test set to 1 #if 0 double *ptr; double f; char msg[100]; for (int i = 100; i < 3900; i++) { ptr = outbuf; f = 1.0 * i; snprintf(msg, sizeof(msg), "freq: %.0f", f); put_status(msg); for (int j = 0; j < 32; j++) { *ptr++ = cos(phaseacc); phaseacc += TWOPI * f / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; } transmit (outbuf, 32); } return -1; #endif int xmtbyte; switch (txstate) { case TX_STATE_PREAMBLE: clearbits(); if (mode != MODE_MFSK64L && mode != MODE_MFSK128L ) for (int i = 0; i < preamble / 3; i++) sendbit(0); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r'); sendchar(2); // STX sendchar('\r'); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: xmtbyte = get_tx_char(); if(active_modem->XMLRPC_CPS_TEST) { if(startpic) startpic = false; if(xmtbyte == 0x05) { sendchar(0x04); // 0x4 has the same symbol count as 0x5 break; } } if (xmtbyte == 0x05 || startpic == true) { put_status("Tx pic: start"); int len = (int)strlen(picheader); for (int i = 0; i < len; i++) sendchar(picheader[i]); flushtx(preamble); startpic = false; txstate = TX_STATE_PICTURE_START; } else if ( xmtbyte == GET_TX_CHAR_ETX || stopflag) txstate = TX_STATE_FLUSH; else if (xmtbyte == GET_TX_CHAR_NODATA) sendidle(); else sendchar(xmtbyte); break; case TX_STATE_FLUSH: sendchar('\r'); sendchar(4); // EOT sendchar('\r'); flushtx(preamble); rxstate = RX_STATE_DATA; txstate = TX_STATE_PREAMBLE; stopflag = false; cwid(); return -1; case TX_STATE_PICTURE_START: send_prologue(); txstate = TX_STATE_PICTURE; break; case TX_STATE_PICTURE: int i = 0; int blocklen = 128; stop_deadman(); while (i < xmtbytes) { if (stopflag || abortxmt) break; if (i + blocklen < xmtbytes) sendpic( &xmtpicbuff[i], blocklen); else sendpic( &xmtpicbuff[i], xmtbytes - i); if ( (100 * i / xmtbytes) % 2 == 0) { snprintf(mfskmsg, sizeof(mfskmsg), "Tx pic: %3.1f%%", (100.0f * i) / xmtbytes); put_status(mfskmsg); } i += blocklen; } flushtx(preamble); start_deadman(); REQ_FLUSH(GET_THREAD_ID()); txstate = TX_STATE_DATA; put_status("Tx pic: done"); FL_LOCK_E(); btnpicTxSendAbort->hide(); btnpicTxSPP->show(); btnpicTxSendColor->show(); btnpicTxSendGrey->show(); btnpicTxLoad->show(); btnpicTxClose->show(); if (close_after_transmit) picTxWin->hide(); close_after_transmit = false; abortxmt = false; rxstate = RX_STATE_DATA; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; FL_UNLOCK_E(); break; } return 0; } void mfsk::send_color_image(std::string s) { if (load_image(s.c_str())) { close_after_transmit = true; pic_TxSendColor(); } } void mfsk::send_Grey_image(std::string s) { if (load_image(s.c_str())) { close_after_transmit = true; pic_TxSendGrey(); } } fldigi-4.1.06/src/mfsk/mfsk-pic.cxx0000644000175000017500000002717013472115777013772 00000000000000// ---------------------------------------------------------------------------- // mfsk-pic.cxx -- mfsk support functions // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "gettext.h" Fl_Double_Window *picRxWin = (Fl_Double_Window *)0; picture *picRx = (picture *)0; Fl_Double_Window *picTxWin = (Fl_Double_Window *)0; picture *picTx = (picture *)0; picbox *picTxBox = 0; Fl_Button *btnpicTxSPP = (Fl_Button *)0; Fl_Button *btnpicTxSendColor = (Fl_Button *)0; Fl_Button *btnpicTxSendGrey = (Fl_Button *)0; Fl_Button *btnpicTxSendAbort = (Fl_Button *)0; Fl_Button *btnpicTxLoad = (Fl_Button *)0; Fl_Button *btnpicTxClose = (Fl_Button *)0; Fl_Shared_Image *TxImg = (Fl_Shared_Image *)0; unsigned char *xmtimg = (unsigned char *)0; unsigned char *xmtpicbuff = (unsigned char *)0; mfsk *serviceme = 0; int txSPP = 8; char txclr_tooltip[24]; char txgry_tooltip[24]; void updateRxPic(unsigned char data, int pos) { picRx->pixel(data, pos); } void createRxViewer() { FL_LOCK_D(); picRxWin = new Fl_Double_Window(200, 140); picRxWin->xclass(PACKAGE_NAME); picRxWin->begin(); picRx = new picture(2, 2, 136, 104); picRxWin->end(); FL_UNLOCK_D(); } void showRxViewer(int W, int H) { FL_LOCK_E(); if (!picRxWin) createRxViewer(); int winW, winH; int picX, picY; winW = W < 136 ? 140 : W + 4; winH = H + 4; picX = (winW - W) / 2; picY = 2; picRxWin->size(winW, winH); picRx->resize(picX, picY, W, H); picRx->clear(); picRxWin->show(); FL_UNLOCK_E(); } int load_image(const char *n) { if (serviceme != active_modem) { return 0; } int W, H, D; unsigned char *img_data; if (TxImg) { TxImg->release(); TxImg = 0; } TxImg = Fl_Shared_Image::get(n); if (!TxImg) return 0; if (TxImg->count() > 1) { TxImg->release(); TxImg = 0; return 0; } img_data = (unsigned char *)TxImg->data()[0]; W = TxImg->w(); H = TxImg->h(); D = TxImg->d(); if (xmtimg) delete [] xmtimg; xmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(xmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; xmtimg[j] = img_data[k]; xmtimg[j+1] = img_data[k+1]; xmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; xmtimg[j] = xmtimg[j+1] = xmtimg[j+2] = img_data[i]; } } else return 0; TxViewerResize(W, H); char* label = strdup(n); picTxWin->copy_label(basename(label)); free(label); picTxBox->label(0); // load the picture widget with the rgb image FL_LOCK_D(); picTx->show(); picTx->clear(); picTxWin->redraw(); picTx->video(xmtimg, W * H * 3); if (print_time_left( (W * H * 3) * 0.000125 * serviceme->TXspp, txclr_tooltip, sizeof(txclr_tooltip), _("Time needed: ")) > 0) btnpicTxSendColor->tooltip(txclr_tooltip); btnpicTxSendColor->activate(); if (print_time_left( (W * H) * 0.000125 * serviceme->TXspp, txgry_tooltip, sizeof(txgry_tooltip), _("Time needed: ")) > 0) btnpicTxSendGrey->tooltip(txgry_tooltip); btnpicTxSendGrey->activate(); FL_UNLOCK_D(); return 1; } void updateTxPic(unsigned char data) { if (serviceme != active_modem) return; if (serviceme->color) { serviceme->pixelnbr = serviceme->rgb + serviceme->row + 3*serviceme->col; picTx->pixel(data, serviceme->pixelnbr); if (++serviceme->col == TxImg->w()) { serviceme->col = 0; if (++serviceme->rgb == 3) { serviceme->rgb = 0; serviceme->row += 3 * TxImg->w(); } } } else { picTx->pixel( data, serviceme->pixelnbr++ ); picTx->pixel( data, serviceme->pixelnbr++ ); picTx->pixel( data, serviceme->pixelnbr++ ); } } void cb_picTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Portable Network Graphics\t*.png\n" "Independent JPEG Group\t*.{jpg,jif,jpeg,jpe}\n" "Graphics Interchange Format\t*.gif", PicsDir.c_str()); if (!fn) return; if (!*fn) return; load_image(fn); } void cb_picTxClose( Fl_Widget *w, void *) { FL_LOCK_D(); picTxWin->hide(); FL_UNLOCK_D(); } void pic_TxSendColor() { int W, H, rowstart; W = TxImg->w(); H = TxImg->h(); if (xmtpicbuff) delete [] xmtpicbuff; xmtpicbuff = new unsigned char [W*H*3]; unsigned char *outbuf = xmtpicbuff; unsigned char *inbuf = xmtimg; int iy, ix, rgb; for (iy = 0; iy < H; iy++) { rowstart = iy * W * 3; for (rgb = 0; rgb < 3; rgb++) for (ix = 0; ix < W; ix++) outbuf[rowstart + rgb*W + ix] = inbuf[rowstart + rgb + ix*3]; } if (serviceme->TXspp == 8) snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dC;", W, H); else snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dCp%d;", W, H,serviceme->TXspp); serviceme->xmtbytes = W * H * 3; serviceme->color = true; serviceme->rgb = 0; serviceme->col = 0; serviceme->row = 0; serviceme->pixelnbr = 0; FL_LOCK_D(); btnpicTxSPP->hide(); btnpicTxSendColor->hide(); btnpicTxSendGrey->hide(); btnpicTxLoad->hide(); btnpicTxClose->hide(); btnpicTxSendAbort->show(); picTx->clear(); FL_UNLOCK_D(); if (!picTxWin->visible()) picTxWin->show(); // start the transmission start_tx(); serviceme->startpic = true; } void cb_picTxSendColor( Fl_Widget *w, void *) { if (serviceme != active_modem) return; pic_TxSendColor(); } void pic_TxSendGrey() { int W, H; W = TxImg->w(); H = TxImg->h(); if (xmtpicbuff) delete [] xmtpicbuff; xmtpicbuff = new unsigned char [W*H]; unsigned char *outbuf = xmtpicbuff; unsigned char *inbuf = xmtimg; for (int i = 0; i < W*H; i++) outbuf[i] = ( 31 * inbuf[i*3] + 61 * inbuf[i*3 + 1] + 8 * inbuf[i*3 + 2])/100; if (serviceme->TXspp == 8) snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%d;", W, H); else snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dp%d;", W, H,serviceme->TXspp); serviceme->xmtbytes = W * H; serviceme->color = false; serviceme->col = 0; serviceme->row = 0; serviceme->pixelnbr = 0; FL_LOCK_D(); btnpicTxSPP->hide(); btnpicTxSendColor->hide(); btnpicTxSendGrey->hide(); btnpicTxLoad->hide(); btnpicTxClose->hide(); btnpicTxSendAbort->show(); picTx->clear(); FL_UNLOCK_D(); // start the transmission if (!picTxWin->visible()) picTxWin->show(); start_tx(); serviceme->startpic = true; } void cb_picTxSendGrey( Fl_Widget *w, void *) { if (serviceme != active_modem) return; pic_TxSendGrey(); } void cb_picTxSendAbort( Fl_Widget *w, void *) { if (serviceme != active_modem) return; serviceme->abortxmt = true; // reload the picture widget with the rgb image FL_LOCK_D(); picTx->video(xmtimg, TxImg->w() * TxImg->h() * 3); FL_UNLOCK_D(); } void cb_picTxSPP( Fl_Widget *w, void *) { if (serviceme != active_modem) return; Fl_Button *b = (Fl_Button *)w; if (serviceme->TXspp == 8) serviceme->TXspp = 4; else if (serviceme->TXspp == 4) serviceme->TXspp = 2; else serviceme->TXspp = 8; if (serviceme->TXspp == 8) b->label("X1"); else if (serviceme->TXspp == 4) b->label("X2"); else b->label("X4"); b->redraw_label(); txSPP = serviceme->TXspp; if (TxImg == 0) return; if (TxImg->w() > 0 && TxImg->h() > 0) { if (print_time_left( (TxImg->w() * TxImg->h() * 3) * 0.000125 * serviceme->TXspp, txclr_tooltip, sizeof(txclr_tooltip), _("Time needed: ")) > 0) btnpicTxSendColor->tooltip(txclr_tooltip); if (print_time_left( (TxImg->w() * TxImg->h()) * 0.000125 * serviceme->TXspp, txgry_tooltip, sizeof(txgry_tooltip), _("Time needed: ")) > 0) btnpicTxSendGrey->tooltip(txgry_tooltip); } } void createTxViewer() { FL_LOCK_D(); picTxWin = new Fl_Double_Window(290, 180, _("Send image")); picTxWin->xclass(PACKAGE_NAME); picTxWin->begin(); picTx = new picture (2, 2, 286, 150); picTx->hide(); picTxBox = new picbox(picTxWin->x(), picTxWin->y(), picTxWin->w(), picTxWin->h(), _("Load or drop an image file\nSupported types: PNG, JPEG, BMP")); picTxBox->labelfont(FL_HELVETICA_ITALIC); btnpicTxSPP = new Fl_Button(5, 180 - 26, 40, 24, "X1"); btnpicTxSPP->tooltip(_("Transfer speed, X1-normal")); btnpicTxSPP->callback( cb_picTxSPP, 0); btnpicTxSendColor = new Fl_Button(45, 180 - 26, 60, 24, "XmtClr"); btnpicTxSendColor->callback(cb_picTxSendColor, 0); btnpicTxSendGrey = new Fl_Button(105, 180 - 26, 60, 24, "XmtGry"); btnpicTxSendGrey->callback( cb_picTxSendGrey, 0); btnpicTxSendAbort = new Fl_Button(84, 180 - 26, 122, 24, "Abort Xmt"); btnpicTxSendAbort->callback(cb_picTxSendAbort, 0); btnpicTxLoad = new Fl_Button(165, 180 - 26, 60, 24, _("Load")); btnpicTxLoad->callback(cb_picTxLoad, 0); btnpicTxClose = new Fl_Button(225, 180 - 26, 60, 24, _("Close")); btnpicTxClose->callback(cb_picTxClose, 0); btnpicTxSendAbort->hide(); btnpicTxSendColor->deactivate(); btnpicTxSendGrey->deactivate(); picTxWin->end(); FL_UNLOCK_D(); } void TxViewerResize(int W, int H) { int winW, winH; int picX, picY; winW = W < 286 ? 290 : W + 4; winH = H < 180 ? 210 : H + 30; picX = (winW - W) / 2; picY = (winH - 26 - H) / 2; FL_LOCK_D(); picTxWin->size(winW, winH); picTx->resize(picX, picY, W, H); picTx->clear(); picTxBox->size(winW, winH); btnpicTxSPP->resize(winW/2 - 140, winH - 26, 40, 24); btnpicTxSendColor->resize(winW/2 - 100, winH - 26, 60, 24); btnpicTxSendGrey->resize(winW/2 - 40, winH - 26, 60, 24); btnpicTxSendAbort->resize(winW/2 - 61, winH - 26, 122, 24); btnpicTxLoad->resize(winW/2 + 20, winH - 26, 60, 24); btnpicTxClose->resize(winW/2 + 80, winH - 26, 60, 24); FL_UNLOCK_D(); } void showTxViewer(int W, int H) { if (picTxWin) { picTxWin->show(); return; } int winW, winH; int picX, picY; winW = W < 288 ? 290 : W + 4; winH = H < 180 ? 180 : H + 30; picX = (winW - W) / 2; picY = (winH - 26 - H) / 2; FL_LOCK_D(); picTxWin->size(winW, winH); picTx->resize(picX, picY, W, H); btnpicTxSPP->resize(winW/2 - 140, winH - 26, 40, 24); btnpicTxSendColor->resize(winW/2 - 100, winH - 26, 60, 24); btnpicTxSendGrey->resize(winW/2 - 40, winH - 26, 60, 24); btnpicTxSendAbort->resize(winW/2 - 61, winH - 26, 122, 24); btnpicTxLoad->resize(winW/2 + 20, winH - 26, 60, 24); btnpicTxClose->resize(winW/2 + 80, winH - 26, 60, 24); btnpicTxSPP->show(); btnpicTxSendColor->show(); btnpicTxSendGrey->show(); btnpicTxLoad->show(); btnpicTxClose->show(); btnpicTxSendAbort->hide(); picTxWin->show(); FL_UNLOCK_D(); } void deleteTxViewer() { picTxWin->hide(); if (picTx) delete picTx; delete [] xmtimg; xmtimg = 0; delete [] xmtpicbuff; xmtpicbuff = 0; delete picTxWin; picTxWin = 0; serviceme = 0; } void deleteRxViewer() { picRxWin->hide(); if (picRx) { delete picRx; picRx = 0; } delete picRxWin; picRxWin = 0; serviceme = 0; } int print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } void setpicture_link(mfsk *me) { serviceme = me; } fldigi-4.1.06/src/mt63/0000775000175000017500000000000013515625027011431 500000000000000fldigi-4.1.06/src/mt63/mt63base.cxx0000644000175000017500000011615213472115775013533 00000000000000/* * mt63base.cxx -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * base class for use by fldigi * modified from original * excluded CW_ID which is a part of the base modem class for fldigi * changed all floats to double and removed all float functions/methods * changed from int* to double* for all sound card buffer transfers * * Modified base class for rx and tx to allow variable center frequency * for baseband signal * * based on mt63 code by Pawel Jalocha * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #include #include // only for control printf's // #include #include #include "dsp.h" #include "mt63base.h" #include "symbol.dat" // symbol shape #include "mt63intl.dat" // interleave patterns // W1HKJ // fixed filter shapes replaced by maximally flat blackman3 filters // that are generated as required as signal center frequency is changed //#include "alias_k5.dat" // anti-alias filter shapes //#include "alias_1k.dat" // for 500, 1000 and 2000 Hz modes //#include "alias_2k.dat" // ========================================================================== // MT63 transmitter code MT63tx::MT63tx() { TxVect = NULL; dspPhaseCorr = NULL; } MT63tx::~MT63tx() { free(TxVect); free(dspPhaseCorr); } void MT63tx::Free(void) { free(TxVect); TxVect = NULL; free(dspPhaseCorr); dspPhaseCorr = NULL; Encoder.Free(); FFT.Free(); Window.Free(); Comb.Free(); WindowBuff.Free(); } // W1HKJ // added freq paramter to Preset int MT63tx::Preset(double freq, int BandWidth, int LongInterleave) { int i, p, step, incr, mask; // W1HKJ // values used to computer the blackman3 passband filter shape double hbw = 1.5*BandWidth / 2; double omega_low = (freq - hbw); double omega_high = (freq + hbw); if (omega_low < 100) omega_low = 100; if (omega_high > 4000) omega_high = 4000; omega_low *= (M_PI / 4000); omega_high *= (M_PI / 4000); mask = FFT.Size - 1; DataCarriers = 64; switch(BandWidth) { case 500: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 256 / 500 + .5); AliasFilterLen = 128; DecimateRatio = 8; break; case 1000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 128 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 4; break; case 2000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 64 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 2; break; default: return -1; } WindowLen = SymbolLen; TxWindow = SymbolShape; TxAmpl = 4.0 / DataCarriers; // for maximum undistorted output CarrMarkCode = 0x16918BBEL; CarrMarkAmpl = 0; if (LongInterleave) { DataInterleave = 64; InterleavePattern = LongIntlvPatt; } else { DataInterleave = 32; InterleavePattern = ShortIntlvPatt; } if (dspRedspAllocArray(&TxVect, DataCarriers)) goto Error; if (dspRedspAllocArray(&dspPhaseCorr, DataCarriers)) goto Error; if (WindowBuff.EnsureSpace(2 * WindowLen)) goto Error; WindowBuff.Len = 2 * WindowLen; if (Encoder.Preset(DataCarriers, DataInterleave, InterleavePattern, 1)) goto Error; if (FFT.Preset(WindowLen)) goto Error; if (Window.Preset(WindowLen, SymbolSepar / 2, TxWindow)) goto Error; // W1HKJ // Preset the combining instance, NULL pointers in lieu of fixed filter shapes // blackman3 filter provides flat passband and sufficient out-of-band rejection // to insure that all unwanted FFT components (periodic signal) are suppressed // by 70 dB or more if ( Comb.Preset( AliasFilterLen, NULL, NULL, DecimateRatio ) ) goto Error; // compute new combining filter shape Comb.ComputeShape(omega_low, omega_high, dspWindowBlackman3); // Preset the initial dspPhase for each data carrier. // Here we only compute indexes to the FFT twiddle factors // so the actual vector is FFT.Twiddle[TxVect[i]] for (step = 0, incr = 1, p = 0, i = 0; i < DataCarriers; i++) { TxVect[i] = p; step += incr; p = (p + step) & mask; } // compute dspPhase correction between successive FFTs separated by SymbolSepar // Like above we compute indexes to the FFT.Twiddle[] incr = (SymbolSepar * DataCarrSepar) & mask; for (p = (SymbolSepar * FirstDataCarr) & mask, i = 0; i < DataCarriers; i++) { dspPhaseCorr[i] = p; p = (p + incr) & mask; } return 0; Error: Free(); return -1; } // W1HKJ // SendTune and ProcessTxVect are both modified to allow the FirstDataCarr // to be other than WindowLen / 2 as in the original design // The peridocity of the FFT is taken advantage of by computing the positions // of the bit indices modulo FFT.size, i.e. r = FFT.BitRevIdx[c & (FFT.Size - 1)] int MT63tx::SendTune(bool twotones) { int i, c, r, mask; double Ampl; mask = FFT.Size - 1; Ampl = TxAmpl * sqrt(DataCarriers / 2); for (i = 0; i < DataCarriers; i++) TxVect[i] = (TxVect[i] + dspPhaseCorr[i]) & mask; for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im = WindowBuff.Data[i].re = 0.0; // W1HKJ // first tone at the lowest most MT63 carrier i = 0; c = FirstDataCarr; r = FFT.BitRevIdx[c & mask]; WindowBuff.Data[r].re = Ampl * FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-Ampl) * FFT.Twiddle[TxVect[i]].im; // W1HKJ // 2nd tone at the highest most MT63 carrier + 1 // MT63 is specified as 500, 1000 and 2000 Hz wide signal format, but in // fact are narrower by one carrier spacing, i.e. 0 to N-1 carriers where // N = 64 if (twotones) { i = DataCarriers - 1; c = (FirstDataCarr + i * DataCarrSepar); r = WindowLen + FFT.BitRevIdx[c & mask]; WindowBuff.Data[r].re = Ampl * FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-Ampl) * FFT.Twiddle[TxVect[i]].im; } // inverse FFT: WindowBuff is already scrambled FFT.CoreProc(WindowBuff.Data); FFT.CoreProc(WindowBuff.Data + WindowLen); // negate the imaginary part for the IFFT for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im *= (-1.0); // process the FFT values to produce a complex time domain vector Window.Process(&WindowBuff); // W1HKJ // convert the complex time domain vector to a real time domain signal // suitably filtered by the anti-alias filter used in the combiner Comb.Process(&Window.Output); return 0; } int MT63tx::SendChar(char ch) { int i,mask,flip; Encoder.Process(ch); // encode and interleave the character // print the character and the DataBlock being sent // printf("0x%02x [%c] => ", ch, ch>=' ' ? ch : '.'); // for (i=0; i only dspPhase correction if (Encoder.Output[i]) TxVect[i] = (TxVect[i] + dspPhaseCorr[i]) & mask; // data bit = 0 => dspPhase flip + dspPhase correction else TxVect[i] = (TxVect[i] + dspPhaseCorr[i] + flip) & mask; } ProcessTxVect(); return 0; } int MT63tx::SendJam(void) { int i,mask,left,right; int j = 0; mask = FFT.Size-1; left = FFT.Size / 4; right = 3 * (FFT.Size / 4); for (i = 0; i < DataCarriers; i++) { j = i & mask; if (rand() & 0x100) // turn left 90 degrees TxVect[j] = (TxVect[j] + dspPhaseCorr[j] + left) & mask; else // turn right 90 degrees TxVect[j] = (TxVect[j] + dspPhaseCorr[j] + right) & mask; } ProcessTxVect(); return 0; } // W1HKJ // principal change from original is modulo arithmetic used to creat // WindowBuff.Data vectors int MT63tx::ProcessTxVect(void) { int i, c, r, mask; mask = FFT.Size - 1; for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im = WindowBuff.Data[i].re = 0.0; for ( i = 0, c = FirstDataCarr; i < DataCarriers; i++, c += DataCarrSepar) { r = FFT.BitRevIdx[c & mask] + WindowLen * (i & 1); WindowBuff.Data[r].re = TxAmpl*FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-TxAmpl)*FFT.Twiddle[TxVect[i]].im; } FFT.CoreProc(WindowBuff.Data); FFT.CoreProc(WindowBuff.Data + WindowLen); // negate the imaginary part for the IFFT for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im *= (-1.0); Window.Process(&WindowBuff); // W1HKJ // audio output to be sent out is in Comb.Output Comb.Process(&Window.Output); return 0; } int MT63tx::SendSilence(void) { Window.ProcessSilence(2); Comb.Process(&Window.Output); return 0; } // ========================================================================== // Character encoder and block interleave for the MT63 modem MT63encoder::MT63encoder() { IntlvPipe = NULL; WalshBuff = NULL; Output = NULL; IntlvPatt=NULL; } MT63encoder::~MT63encoder() { free(IntlvPipe); free(WalshBuff); free(Output); free(IntlvPatt); } void MT63encoder::Free() { free(IntlvPipe); free(WalshBuff); free(Output); free(IntlvPatt); IntlvPipe = NULL; WalshBuff = NULL; Output = NULL; IntlvPatt = NULL; } int MT63encoder::Preset(int Carriers, int Intlv, int *Pattern, int PreFill) { int i, p; if (!dspPowerOf2(Carriers)) goto Error; DataCarriers = Carriers; IntlvLen = Intlv; IntlvSize = IntlvLen * DataCarriers; if (IntlvLen) { if (dspRedspAllocArray(&IntlvPipe, IntlvSize)) goto Error; if (PreFill) for (i = 0; i < IntlvSize; i++) IntlvPipe[i] = rand() & 1; else dspClearArray(IntlvPipe,IntlvSize); if (dspRedspAllocArray(&IntlvPatt, DataCarriers)) goto Error; IntlvPtr = 0; } if (dspRedspAllocArray(&WalshBuff, DataCarriers)) goto Error; if (dspRedspAllocArray(&Output, DataCarriers)) goto Error; CodeMask = 2 * DataCarriers - 1; for (p = 0, i = 0; i < DataCarriers; i++) { IntlvPatt[i] = p * DataCarriers; p += Pattern[i]; if (p >= IntlvLen) p -= IntlvLen; } return 0; Error: Free(); return -1; } int MT63encoder::Process(char code) // encode an ASCII character "code" { int i, k; code &= CodeMask; for (i = 0; i < DataCarriers; i++) WalshBuff[i] = 0; if (code < DataCarriers) WalshBuff[(int)code] = 1.0; else WalshBuff[code-DataCarriers] = (-1.0); dspWalshInvTrans(WalshBuff, DataCarriers); if (IntlvLen) { for (i = 0; i < DataCarriers; i++) IntlvPipe[IntlvPtr + i] = (WalshBuff[i] < 0.0); for (i = 0; i < DataCarriers; i++) { k = IntlvPtr + IntlvPatt[i]; if (k >= IntlvSize) k -= IntlvSize; Output[i] = IntlvPipe[k+i]; } IntlvPtr += DataCarriers; if (IntlvPtr >= IntlvSize) IntlvPtr -= IntlvSize; } else for (i = 0; i < DataCarriers; i++) Output[i] = (WalshBuff[i] < 0.0); return 0; } // After encoding the "Output" array contains the bits to be transmitted // ========================================================================== // MT63 decoder and deinterleaver MT63decoder::MT63decoder() { IntlvPipe = NULL; IntlvPatt = NULL; WalshBuff = NULL; DecodeSnrMid = NULL; DecodeSnrOut = NULL; DecodePipe = NULL; } MT63decoder::~MT63decoder() { free(IntlvPipe); free(IntlvPatt); free(WalshBuff); free(DecodeSnrMid); free(DecodeSnrOut); free(DecodePipe); } void MT63decoder::Free() { free(IntlvPipe); IntlvPipe = NULL; free(IntlvPatt); IntlvPatt = NULL; free(WalshBuff); WalshBuff = NULL; free(DecodeSnrMid); free(DecodeSnrOut); DecodeSnrMid = NULL; DecodeSnrOut = NULL; free(DecodePipe); DecodePipe = NULL; } int MT63decoder::Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ) { int i,p; if (!dspPowerOf2(Carriers)) goto Error; DataCarriers = Carriers; ScanLen = 2 * Margin + 1; ScanSize = DataCarriers + 2 * Margin; dspLowPass2Coeff(Integ,W1,W2,W5); DecodeLen = Integ / 2; DecodeSize = DecodeLen * ScanLen; if (dspRedspAllocArray(&DecodePipe, DecodeSize)) goto Error; dspClearArray(DecodePipe, DecodeSize); DecodePtr = 0; IntlvLen = Intlv; // printf("%d:",IntlvLen); if (dspRedspAllocArray(&IntlvPatt, DataCarriers)) goto Error; for (p = 0, i = 0; i < DataCarriers; i++) { IntlvPatt[i] = p * ScanSize; // printf(" %2d",p); p += Pattern[i]; if (p >= IntlvLen) p -= IntlvLen; } // printf("\n"); IntlvSize = (IntlvLen + 1) * ScanSize; if (dspRedspAllocArray(&IntlvPipe, IntlvSize)) goto Error; dspClearArray(IntlvPipe, IntlvSize); IntlvPtr = 0; if (dspRedspAllocArray(&WalshBuff, DataCarriers)) goto Error; if (dspRedspAllocArray(&DecodeSnrMid, ScanLen)) goto Error; if (dspRedspAllocArray(&DecodeSnrOut, ScanLen)) goto Error; dspClearArray(DecodeSnrMid, ScanLen); dspClearArray(DecodeSnrOut, ScanLen); SignalToNoise = 0.0; CarrOfs = 0; return 0; Error: Free(); return -1; } int MT63decoder::Process(double *data) { int s, i, k; double Min, Max, Sig, Noise, SNR; int MinPos,MaxPos,code; dspCopyArray(IntlvPipe + IntlvPtr, data, ScanSize); // printf("Decoder [%d/%d/%d]: \n",IntlvPtr,IntlvSize,ScanSize); for (s = 0; s < ScanLen; s++) { // printf(" %2d:",s); for (i = 0; i < DataCarriers; i++) { k = IntlvPtr - ScanSize - IntlvPatt[i]; if (k < 0) k += IntlvSize; if ((s & 1) && (i & 1)) { k += ScanSize; if (k >= IntlvSize) k-=IntlvSize; } WalshBuff[i] = IntlvPipe[k + s + i]; // printf(" %4d",k/ScanSize); } // printf("\n"); dspWalshTrans(WalshBuff, DataCarriers); Min = dspFindMin(WalshBuff, DataCarriers, MinPos); Max = dspFindMax(WalshBuff, DataCarriers, MaxPos); if (fabs(Max) > fabs(Min)) { code = MaxPos + DataCarriers; Sig = fabs(Max); WalshBuff[MaxPos] = 0.0; } else { code = MinPos; Sig = fabs(Min); WalshBuff[MinPos] = 0.0; } Noise = dspRMS(WalshBuff, DataCarriers); if (Noise > 0.0) SNR = Sig/Noise; else SNR = 0.0; dspLowPass2(SNR, DecodeSnrMid[s], DecodeSnrOut[s], W1, W2, W5); // printf("%2d: %02x => %c, %5.2f/%5.2f=>%5.2f <%5.2f>\n", // s,code,code<' ' ? '.' : (char)code, // Sig,Noise,SNR,DecodeSnrOut[s]); DecodePipe[DecodePtr+s]=code; } IntlvPtr += ScanSize; if (IntlvPtr >= IntlvSize) IntlvPtr = 0; DecodePtr += ScanLen; if (DecodePtr >= DecodeSize) DecodePtr = 0; Max = dspFindMax(DecodeSnrOut, ScanLen, MaxPos); Output = DecodePipe[DecodePtr + MaxPos]; SignalToNoise = Max; CarrOfs = MaxPos - (ScanLen - 1) / 2; /* code=Output; if ((code>=' ')||(code=='\n')||(code=='\r')) printf("%c",code); else if (code!='\0') printf("<%02X>",code); */ return 0; } // ========================================================================== // MT63 receiver code MT63rx::MT63rx() { int s; FFTbuff = NULL; FFTbuff2 = NULL; for (s = 0; s < 4; s++) SyncPipe[s] = NULL; SyncPhCorr = NULL; for (s = 0; s < 4; s++) { CorrelMid[s] = NULL; CorrelOut[s] = NULL; } dspPowerMid = NULL; dspPowerOut = NULL; for (s = 0; s < 4; s++) CorrelNorm[s] = NULL; for (s = 0; s < 4; s++) CorrelAver[s] = NULL; SymbFit = NULL; SymbPipe = NULL; FreqPipe = NULL; RefDataSlice = NULL; DataPipeLen = 0; DataPipe = NULL; DataPwrMid = NULL; DataPwrOut = NULL; DataSqrMid = NULL; DataSqrOut = NULL; DataVect = NULL; DatadspPhase = NULL; DatadspPhase2 = NULL; SpectradspPower = NULL; } MT63rx::~MT63rx() { int s; free(FFTbuff); free(FFTbuff2); for (s = 0; s < 4; s++) free(SyncPipe[s]); free(SyncPhCorr); for (s = 0; s < 4; s++) { free(CorrelMid[s]); free(CorrelOut[s]); } free(dspPowerMid); free(dspPowerOut); for (s = 0; s < 4; s++) free(CorrelNorm[s]); for (s = 0; s < 4; s++) free(CorrelAver[s]); free(SymbFit); free(SymbPipe); free(FreqPipe); free(RefDataSlice); dspFreeArray2D(DataPipe, DataPipeLen); // for (s=0; s 4000) omega_high = 4000; omega_low *= (M_PI / 4000); omega_high *= (M_PI/ 4000); switch(BandWidth) { case 500: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 256 / 500 + 0.5); AliasFilterLen = 128; DecimateRatio = 8; break; case 1000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 128 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 4; break; case 2000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 64 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 2; break; default: return -1; } DataCarriers = 64; // 64 carriers WindowLen = SymbolLen; // the symbol length RxWindow = SymbolShape; // the symbol shape // RxWindow, WindowLen, SymbolSepar, DataCarrSepar are tuned one for another // to minimize inter-symbol interference (ISI) and one should not change // them independently or ISI will increase. CarrMarkCode = 0x16918BBEL; IntegLen = Integ; // sync. integration period SymbolDiv = 4; // don't change this ScanMargin = 8; // we look 8 data carriers up and down SyncStep = SymbolSepar/SymbolDiv; ProcdspDelay = IntegLen * SymbolSepar; TrackPipeLen = IntegLen; if (LongInterleave) { DataInterleave = 64; InterleavePattern = LongIntlvPatt; } else { DataInterleave = 32; InterleavePattern = ShortIntlvPatt; } DataScanMargin = 8; err = FFT.Preset(WindowLen); if (err) goto Error; if (dspRedspAllocArray(&FFTbuff, WindowLen)) goto Error; if (dspRedspAllocArray(&FFTbuff2, WindowLen)) goto Error; WindowLenMask = WindowLen - 1; // W1HKJ // InpSplit is the anti-aliasing filter that converts a real time domain // signal into a complex time domain signal with pre-filtering. // the black3man3 filter provides very sharp skirts with a flat // passband. err = InpSplit.Preset(AliasFilterLen, NULL, NULL, DecimateRatio); if (err) goto Error; err = InpSplit.ComputeShape(omega_low, omega_high, dspWindowBlackman3); if (err) goto Error; err = TestOfs.Preset(-0.25 * (2.0 * M_PI / WindowLen)); // for decoder tests only if (err) goto Error; err = ProcLine.Preset(ProcdspDelay + WindowLen + SymbolSepar); if (err) goto Error; SyncProcPtr = 0; ScanFirst = FirstDataCarr - ScanMargin * DataCarrSepar; // first FFT bin to scan if (ScanFirst < 0) ScanFirst += WindowLen; ScanLen = (DataCarriers + 2 * ScanMargin) * DataCarrSepar; // number of FFT bins to scan for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&SyncPipe[s], ScanLen)) goto Error; dspClearArray(SyncPipe[s], ScanLen); } SyncPtr = 0; if (dspRedspAllocArray(&SyncPhCorr, ScanLen)) goto Error; for (c = (ScanFirst * SymbolSepar) & WindowLenMask, i = 0; i < ScanLen; i++) { SyncPhCorr[i].re = FFT.Twiddle[c].re * FFT.Twiddle[c].re - FFT.Twiddle[c].im * FFT.Twiddle[c].im; SyncPhCorr[i].im = 2 * FFT.Twiddle[c].re * FFT.Twiddle[c].im; c = (c + SymbolSepar) & WindowLenMask; } for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelMid[s], ScanLen)) goto Error; dspClearArray(CorrelMid[s], ScanLen); if (dspRedspAllocArray(&CorrelOut[s], ScanLen)) goto Error; dspClearArray(CorrelOut[s], ScanLen); } dspLowPass2Coeff(IntegLen, W1, W2, W5); if (dspRedspAllocArray(&dspPowerMid, ScanLen)) goto Error; dspClearArray(dspPowerMid, ScanLen); if (dspRedspAllocArray(&dspPowerOut, ScanLen)) goto Error; dspClearArray(dspPowerOut, ScanLen); dspLowPass2Coeff(IntegLen * SymbolDiv, W1p, W2p, W5p); for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelNorm[s], ScanLen)) goto Error; } FitLen = 2 * ScanMargin * DataCarrSepar; for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelAver[s], FitLen)) goto Error; } if (dspRedspAllocArray(&SymbFit, FitLen)) goto Error; if (dspRedspAllocArray(&SymbPipe, TrackPipeLen)) goto Error; dspClearArray(SymbPipe, TrackPipeLen); if (dspRedspAllocArray(&FreqPipe, TrackPipeLen)) goto Error; dspClearArray(FreqPipe, TrackPipeLen); TrackPipePtr = 0; SymbFitPos = ScanMargin * DataCarrSepar; SyncLocked = 0; SyncSymbConf = 0.0; SyncFreqOfs = 0.0; SyncFreqDev = 0.0; SymbPtr = 0; SyncSymbShift = 0.0; SyncHoldThres = 1.5 * sqrt(1.0 / (IntegLen * DataCarriers)); SyncLockThres = 1.5 * SyncHoldThres; DataProcPtr = (-ProcdspDelay); DataScanLen = DataCarriers + 2 * DataScanMargin; DataScanFirst = FirstDataCarr - DataScanMargin * DataCarrSepar; if (dspRedspAllocArray(&RefDataSlice, DataScanLen)) goto Error; dspClearArray(RefDataSlice, DataScanLen); dspFreeArray2D(DataPipe, DataPipeLen); DataPipeLen = IntegLen / 2; dspLowPass2Coeff(IntegLen, dW1, dW2, dW5); if (dspAllocArray2D(&DataPipe, DataPipeLen, DataScanLen)) { DataPipeLen = 0; goto Error; } dspClearArray2D(DataPipe, DataPipeLen, DataScanLen); DataPipePtr = 0; if (dspRedspAllocArray(&DataPwrMid, DataScanLen)) goto Error; dspClearArray(DataPwrMid, DataScanLen); if (dspRedspAllocArray(&DataPwrOut, DataScanLen)) goto Error; dspClearArray(DataPwrOut, DataScanLen); if (dspRedspAllocArray(&DataSqrMid, DataScanLen)) goto Error; dspClearArray(DataSqrMid, DataScanLen); if (dspRedspAllocArray(&DataSqrOut, DataScanLen)) goto Error; dspClearArray(DataSqrOut, DataScanLen); if (dspRedspAllocArray(&DataVect, DataScanLen)) goto Error; if (dspRedspAllocArray(&DatadspPhase, DataScanLen)) goto Error; if (dspRedspAllocArray(&DatadspPhase2, DataScanLen)) goto Error; err = Decoder.Preset(DataCarriers, DataInterleave, InterleavePattern, DataScanMargin, IntegLen); if (err) goto Error; SpectraDisplay = Display; if (SpectraDisplay) { if (dspRedspAllocArray(&SpectradspPower, WindowLen)) goto Error; } return 0; Error: Free(); return -1; } int MT63rx::Process(double_buff *Input) { int s1,s2; // TestOfs.Omega+=(-0.005*(2.0*M_PI/512)); // simulate frequency drift Output.Len = 0; // W1HKJ // convert the real data input into a complex time domain signal, // anti-aliased using the blackman3 filter // subsequent rx signal processing takes advantage of the periodic nature // of the resultant FFT of the anti-aliased input signal. Actual decoding // is at baseband. InpSplit.Process(Input); ProcLine.Process(&InpSplit.Output); // TestOfs.Process(&InpSplit.Output); // ProcLine.Process(&TestOfs.Output); // printf("New input, Len=%d/%d\n",Input->Len,ProcLine.InpLen); while((SyncProcPtr+WindowLen) < ProcLine.InpLen) { SyncProcess(ProcLine.InpPtr + SyncProcPtr); // printf("SyncSymbConf=%5.2f, SyncLock=%d, SyncProcPtr=%d, SyncPtr=%d, SymbPtr=%d, SyncSymbShift=%5.1f, SyncFreqOfs=%5.2f =>", // SyncSymbConf,SyncLocked,SyncProcPtr,SyncPtr,SymbPtr,SyncSymbShift,SyncFreqOfs); if (SyncPtr == SymbPtr) { s1 = SyncProcPtr - ProcdspDelay + ((int)SyncSymbShift - SymbPtr * SyncStep); s2 = s1 + SymbolSepar / 2; // printf(" Sample at %d,%d (SyncProcPtr-%d), time diff.=%d\n",s1,s2,SyncProcPtr-s1,s1-DataProcPtr); DataProcess(ProcLine.InpPtr + s1, ProcLine.InpPtr + s2, SyncFreqOfs, s1 - DataProcPtr); DataProcPtr = s1; } // printf("\n"); SyncProcPtr += SyncStep; } SyncProcPtr -= ProcLine.InpLen; DataProcPtr -= ProcLine.InpLen; return 0; } void MT63rx::DoCorrelSum(dspCmpx *Correl1, dspCmpx *Correl2, dspCmpx *Aver) { dspCmpx sx; int i, s, d; s = 2 * DataCarrSepar; d = DataCarriers * DataCarrSepar; sx.re = sx.im = 0.0; for (i = 0; i < d; i+=s) { sx.re += Correl1[i].re; sx.im += Correl1[i].im; sx.re += Correl2[i].re; sx.im += Correl2[i].im; } Aver[0].re = sx.re / DataCarriers; Aver[0].im = sx.im / DataCarriers; for (i = 0; i < (FitLen-s); ) { sx.re -= Correl1[i].re; sx.im -= Correl1[i].im; sx.re -= Correl2[i].re; sx.im -= Correl2[i].im; sx.re += Correl1[i+d].re; sx.im -= Correl1[i+d].im; sx.re += Correl2[i+d].re; sx.im -= Correl2[i+d].im; i += s; Aver[i].re = sx.re / DataCarriers; Aver[i].im = sx.im / DataCarriers; } } void MT63rx::SyncProcess(dspCmpx *Slice) { int i, j, k, r, s, s2; double pI, pQ; dspCmpx Correl; dspCmpx *PrevSlice; double I, Q; double dI, dQ; double P,A; double w0, w1; double Fl, F0, Fu; dspCmpx SymbTime; double SymbConf, SymbShift, FreqOfs; double dspRMS; // int Loops; int Incl; SyncPtr = (SyncPtr + 1) & (SymbolDiv - 1); // increment the correlators pointer for (i = 0; i < WindowLen; i++) { r = FFT.BitRevIdx[i]; FFTbuff[r].re = Slice[i].re * RxWindow[i]; FFTbuff[r].im = Slice[i].im * RxWindow[i]; } FFT.CoreProc(FFTbuff); if (SpectraDisplay) { for ( i = 0, j = FirstDataCarr + (DataCarriers / 2) * DataCarrSepar - WindowLen / 2; (i < WindowLen) && ( j 0.0) { dI = (I * I - Q * Q) / A; dQ = (2 * I * Q) / A; } else { dI = dQ = 0.0; } dspLowPass2(P, dspPowerMid[i], dspPowerOut[i], W1p, W2p, W5p); pI = PrevSlice[i].re * SyncPhCorr[i].re - PrevSlice[i].im * SyncPhCorr[i].im; pQ = PrevSlice[i].re * SyncPhCorr[i].im + PrevSlice[i].im * SyncPhCorr[i].re; Correl.re = dQ * pQ + dI * pI; Correl.im = dQ * pI - dI * pQ; dspLowPass2(&Correl, CorrelMid[SyncPtr] + i, CorrelOut[SyncPtr] + i, W1, W2, W5); PrevSlice[i].re = dI; PrevSlice[i].im = dQ; } if (SyncPtr == (SymbPtr^2)) { for (s = 0; s < SymbolDiv; s++) { // normalize the correlations for (i = 0; i < ScanLen; i++) { if (dspPowerOut[i] > 0.0) { CorrelNorm[s][i].re = CorrelOut[s][i].re / dspPowerOut[i]; CorrelNorm[s][i].im = CorrelOut[s][i].im / dspPowerOut[i]; } else CorrelNorm[s][i].im = CorrelNorm[s][i].re = 0.0; } } /* // another way to normalize - a better one ? for (i=0; i0.0) { for (s=0; s 1) j -= (k - 1) * DataCarrSepar; else if (k < (-1)) j -= (k + 1) * DataCarrSepar; SymbFitPos = j; // printf(" => %2d",j); if (P > 0.0) { SymbConf = dspAmpl(SymbFit[j]) + 0.5 * (dspAmpl(SymbFit[j + 1]) + dspAmpl(SymbFit[j - 1])); SymbConf *= 0.5; I = SymbFit[j].re + 0.5 * (SymbFit[j - 1].re + SymbFit[j + 1].re); Q = SymbFit[j].im + 0.5 * (SymbFit[j - 1].im + SymbFit[j + 1].im); SymbTime.re = I; SymbTime.im = Q; SymbShift = (dspPhase(SymbTime) / (2 * M_PI)) * SymbolDiv; if (SymbShift < 0) SymbShift += SymbolDiv; // for (i=j-1; i<=j+1; i++) printf(" [%+5.2f,%+5.2f]",SymbFit[i].re,SymbFit[i].im); // make first estimation of FreqOfs // printf(" -> [%+5.2f,%+5.2f] =>",I,Q); // for (i=j-2; i<=j+2; i++) printf(" %+6.3f",I*SymbFit[i].re+Q*SymbFit[i].im); pI = dspScalProd(I, Q, SymbFit[j]) + 0.7 * dspScalProd(I, Q, SymbFit[j - 1]) + 0.7 * dspScalProd(I, Q, SymbFit[j + 1]); pQ = 0.7 * dspScalProd(I, Q, SymbFit[j + 1]) - 0.7 * dspScalProd(I, Q, SymbFit[j - 1]) + 0.5 * dspScalProd(I, Q, SymbFit[j + 2]) - 0.5 * dspScalProd(I, Q, SymbFit[j - 2]); FreqOfs = j + dspPhase(pI, pQ) / (2.0 * M_PI / 8); /* SYNC TEST */ // refine the FreqOfs i = (int)floor(FreqOfs + 0.5); s = (int)floor(SymbShift); s2 = (s + 1) & (SymbolDiv - 1); // printf(" [%5.2f,%2d,%d,%d] ",FreqOfs,i,s,s2); w0 = (s + 1 - SymbShift); w1 = (SymbShift - s); // printf(" [%4.2f,%4.2f] ",w0,w1); A = (0.5 * WindowLen) / SymbolSepar; I = w0 * CorrelAver[s][i].re + w1 * CorrelAver[s2][i].re; Q = w0 * CorrelAver[s][i].im + w1 * CorrelAver[s2][i].im; // printf(" [%5.2f,%2d] -> [%+5.2f,%+5.2f]",FreqOfs,i,I,Q); // FreqOfs=i+dspPhase(I,Q)/(2.0*M_PI)*0.5*A; // printf(" => %5.2f",FreqOfs); F0 = i + dspPhase(I, Q) / (2.0 * M_PI) * A - FreqOfs; Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? Fu : Fl; else FreqOfs += (fabs(Fu) < fabs(F0)) ? Fu : F0; // printf(" => (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else { SymbTime.re = SymbTime.im = 0.0; SymbConf = 0.0; SymbShift = 0.0; FreqOfs = 0.0; } // here we have FreqOfs and SymbTime.re/im // printf("FreqOfs=%5.2f",FreqOfs); if (SyncLocked) { // flip the SymbTime if it doesn't agree with the dspAverage if (dspScalProd(SymbTime, AverSymb) < 0.0) { SymbTime.re = (-SymbTime.re); SymbTime.im = (-SymbTime.im); FreqOfs -= DataCarrSepar; } // reduce the freq. offset towards the dspAverage offset A = 2 * DataCarrSepar; k = (int)floor((FreqOfs - AverFreq) / A + 0.5); FreqOfs -= k * A; /* SYNC TEST */ A = (0.5 * WindowLen) / SymbolSepar; F0 = FreqOfs - AverFreq; // correct freq. auto-correlator wrap Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? A : -A; else FreqOfs += (fabs(Fu) < fabs(F0)) ? A : 0.0; // printf(" => (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else { // of if (SyncLocked) // flip SymbTime if it doesn't agree with the previous if (dspScalProd(SymbTime, SymbPipe[TrackPipePtr]) < 0.0) { SymbTime.re = (-SymbTime.re); SymbTime.im = (-SymbTime.im); FreqOfs -= DataCarrSepar; } // reduce the FreqOfs towards zero A = 2 * DataCarrSepar; k = (int)floor(FreqOfs / A + 0.5); FreqOfs -= k * A; /* SYNC TEST */ F0 = FreqOfs - FreqPipe[TrackPipePtr]; Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? A : -A; else FreqOfs += (fabs(Fu) < fabs(F0)) ? A : 0.0; } // printf(" => [%+5.2f,%+5.2f], %5.2f",SymbTime.re,SymbTime.im,FreqOfs); TrackPipePtr += 1; if (TrackPipePtr >= TrackPipeLen) TrackPipePtr -= TrackPipeLen; SymbPipe[TrackPipePtr] = SymbTime; // put SymbTime and FreqOfs into pipes FreqPipe[TrackPipePtr] = FreqOfs; // for averaging // find dspAverage symbol time // Loops = dspSelFitAver( SymbPipe, TrackPipeLen, (double)3.0, 4, AverSymb, dspRMS, Incl); // printf(" AverSymb=[%+5.2f,%+5.2f], dspRMS=%5.3f/%2d", // AverSymb.re,AverSymb.im,dspRMS,Incl); // find dspAverage freq. offset // Loops = dspSelFitAver( FreqPipe, TrackPipeLen, (double)2.5, 4, AverFreq, dspRMS, Incl); SyncFreqDev = dspRMS; // printf(" AverFreq=%+5.2f, dspRMS=%5.3f/%2d",AverFreq,dspRMS,Incl); SymbConf = dspAmpl(AverSymb); SyncSymbConf = SymbConf; SyncFreqOfs = AverFreq; if (SymbConf > 0.0) { SymbShift = dspPhase(AverSymb) / (2 * M_PI) * SymbolSepar; if (SymbShift < 0.0) SymbShift += SymbolSepar; SymbPtr = (int)floor((dspPhase(AverSymb) / (2 * M_PI)) * SymbolDiv); if (SymbPtr < 0) SymbPtr += SymbolDiv; SyncSymbShift = SymbShift; } if (SyncLocked) { if ((SyncSymbConf < SyncHoldThres) || (SyncFreqDev > 0.250)) SyncLocked = 0; } else { if ((SyncSymbConf > SyncLockThres) && (SyncFreqDev < 0.125)) SyncLocked = 1; } SyncSymbConf *= 0.5; // printf(" => SyncLocked=%d, SyncSymbShift=%5.1f, SymbPtr=%d", // SyncLocked,SyncSymbShift,SymbPtr); // printf("\n"); } // enf of if (SyncPtr==(SymbPtr^2)) } void MT63rx::DataProcess(dspCmpx *EvenSlice, dspCmpx *OddSlice, double FreqOfs, int TimeDist) { int i, c, r; dspCmpx Freq, Phas; int incr, p; double I, Q, P; dspCmpx Dtmp; dspCmpx Ftmp; // double Aver,dspRMS; int Loops,Incl; // Here we pickup a symbol in the data history. The time/freq. synchronizer // told us where it is in time and at which frequency offset (FreqOfs) // TimeDist is the distance in samples from the symbol we analyzed // in the previous call to this routine // FreqOfs=0.0; // for DEBUG only ! // printf("DataProcess: FreqOfs=%5.3f, TimeDist=%d, Locked=%d\n", // FreqOfs,TimeDist,SyncLocked); P = (-2 * M_PI * FreqOfs) / WindowLen; // make ready for frequency correction Freq.re = cos(P); Freq.im = sin(P); Phas.re = 1.0; Phas.im = 0.0; for (i = 0; i < WindowLen; i++) { // prepare slices for the FFT r = FFT.BitRevIdx[i]; // multiply by window and pre-scramble // if (i==2*ScanMargin) // printf("%3d: [%5.2f,%5.2f] [%5.2f,%5.2f]\n", // i, dspPhase.re,dspPhase.im, EvenSlice[i].re,EvenSlice[i].im); CdspcmpxMultAxB(I, Q, EvenSlice[i], Phas); FFTbuff[r].re = I * RxWindow[i]; FFTbuff[r].im = Q * RxWindow[i]; CdspcmpxMultAxB(I, Q, OddSlice[i], Phas); FFTbuff2[r].re = I * RxWindow[i]; FFTbuff2[r].im = Q * RxWindow[i]; CdspcmpxMultAxB(Dtmp, Phas, Freq); Phas = Dtmp; } FFT.CoreProc(FFTbuff); FFT.CoreProc(FFTbuff2); /* printf("FFTbuff [%3d...]:",FirstDataCarr-16); for (i=FirstDataCarr-16; i<=FirstDataCarr+32; i++) printf(" %+3d/%4.2f",i-FirstDataCarr,dspAmpl(FFTbuff[i])); printf("\n"); printf("FFTbuff2[%3d...]:",FirstDataCarr-16); for (i=FirstDataCarr-16; i<=FirstDataCarr+32; i++) printf(" %+3d/%4.2f",i-FirstDataCarr,dspAmpl(FFTbuff2[i])); printf("\n"); */ // printf(" FreqOfs=%5.2f: ",FreqOfs); // printf("Symbol vectors:\n"); incr = (TimeDist * DataCarrSepar) & WindowLenMask; // correct FFT dspPhase shift p = (TimeDist * DataScanFirst) & WindowLenMask; // due to time shift by for (c = DataScanFirst, i = 0; i < DataScanLen; ) { // TimeDist // printf("%2d,%3d:",i,c); // printf(" [%6.3f,%6.3f] [%6.3f,%6.3f]", // FFTbuff[c].re,FFTbuff[c].im, // FFTbuff2[c+DataCarrSepar].re,FFTbuff2[c+DataCarrSepar].im); // printf(" [%6.3f,%6.3f]/[%6.3f,%6.3f]", // FFTbuff2[c].re,FFTbuff2[c].im, // FFTbuff[c+DataCarrSepar].re,FFTbuff[c+DataCarrSepar].im); // printf(" %5.3f/%5.3f",dspAmpl(FFTbuff[c]),dspAmpl(FFTbuff[c+DataCarrSepar])); // printf(" %5.3f/%5.3f",dspAmpl(FFTbuff2[c+DataCarrSepar]),dspAmpl(FFTbuff2[c])); // printf("\n"); Phas = FFT.Twiddle[p]; CdspcmpxMultAxB(Dtmp, RefDataSlice[i], Phas); CdspcmpxMultAxBs(DataVect[i], FFTbuff[c], Dtmp); // printf("%3d,%2d: [%8.5f,%8.5f] / %8.5f\n", // c,i,FFTbuff[c].re,FFTbuff[c].im,DataPwrOut[i]); dspLowPass2( dspPower(FFTbuff[c]), DataPwrMid[i], DataPwrOut[i], dW1, dW2, dW5); RefDataSlice[i++] = FFTbuff[c]; c = (c + DataCarrSepar) & WindowLenMask; p = (p + incr) & WindowLenMask; Phas = FFT.Twiddle[p]; CdspcmpxMultAxB(Dtmp, RefDataSlice[i], Phas); CdspcmpxMultAxBs(DataVect[i], FFTbuff2[c], Dtmp); // printf("%3d,%2d: [%8.5f,%8.5f] / %8.5f\n", // c,i,FFTbuff2[c].re,FFTbuff2[c].im,DataPwrOut[i]); dspLowPass2( dspPower(FFTbuff2[c]), DataPwrMid[i], DataPwrOut[i], dW1, dW2, dW5); RefDataSlice[i++] = FFTbuff2[c]; c = (c + DataCarrSepar) & WindowLenMask; p = (p + incr) & WindowLenMask; } P = (-TimeDist * 2 * M_PI * FreqOfs) / WindowLen; Freq.re = cos(P); Freq.im = sin(P); for (i = 0; i < DataScanLen; i++) { CdspcmpxMultAxB(Ftmp, DataVect[i], Freq); // dspLowPass2(dspPower(Ftmp),DataPwrMid[i],DataPwrOut[i],dW1,dW2,dW5); // CdspcmpxMultAxB(Dtmp,Ftmp,Ftmp); // Dtmp.re=Ftmp.re*Ftmp.re-Ftmp.im*Ftmp.im; Dtmp.im=2*Ftmp.re*Ftmp.im; // dspLowPass2(&Dtmp,DataSqrMid+i,DataSqrOut+i,dW1,dW2,dW5); DataVect[i] = DataPipe[DataPipePtr][i]; DataPipe[DataPipePtr][i] = Ftmp; } DataPipePtr += 1; if (DataPipePtr >= DataPipeLen) DataPipePtr = 0; for (i = 0; i < DataScanLen; i++) { if (DataPwrOut[i] > 0.0) { P = DataVect[i].re / DataPwrOut[i]; if (P > 1.0) P = 1.0; else if (P < (-1.0)) P = (-1.0); DatadspPhase[i] = P; } else DatadspPhase[i] = 0.0; } Decoder.Process(DatadspPhase); Output.EnsureSpace(Output.Len + 1); Output.Data[Output.Len] = Decoder.Output; Output.Len += 1; /* printf("Demodulator output vectors:\n"); for (i=0; i %8.5f\n", i,DataVect[i].re,DataVect[i].im,DataPwrOut[i], DatadspPhase[i]); } */ /* for (i=0; i0.0) P=dspPhase(DataVect[i]); else P=0.0; DatadspPhase[i]=P; P*=2; if (P>M_PI) P-=2*M_PI; else if (P<(-M_PI)) P+=2*M_PI; DatadspPhase2[i]=P; printf("%2d: %6.3f [%6.3f,%6.3f] [%8.5f,%8.5f], %5.2f, %5.2f", i, DataPwrOut[i], DataSqrOut[i].re,DataSqrOut[i].im, DataVect[i].re,DataVect[i].im, DatadspPhase[i],DatadspPhase2[i]); if (DataPwrOut[i]>0.0) printf(" %6.3f",dspAmpl(DataSqrOut[i])/DataPwrOut[i]); printf("\n"); } Loops=dspSelFitAver(DatadspPhase2,DataScanLen,(double)2.5,4,Aver,dspRMS,Incl); printf("Aver=%5.2f, dspRMS=%5.2f, Incl=%d\n",Aver,dspRMS,Incl); */ } int MT63rx::SYNC_LockStatus(void) { return SyncLocked; } double MT63rx::SYNC_Confidence(void) { return SyncSymbConf <= 1.0 ? SyncSymbConf : 1.0; } double MT63rx::SYNC_FreqOffset(void) { return SyncFreqOfs / DataCarrSepar; } double MT63rx::SYNC_FreqDevdspRMS(void) { return SyncFreqDev / DataCarrSepar; } double MT63rx::SYNC_TimeOffset(void) { return SyncSymbShift / SymbolSepar; } double MT63rx::FEC_SNR(void) { return Decoder.SignalToNoise; } int MT63rx::FEC_CarrOffset(void) { return Decoder.CarrOfs; } double MT63rx::TotalFreqOffset(void) { return ( SyncFreqOfs + DataCarrSepar * Decoder.CarrOfs) * (8000.0 / DecimateRatio) / WindowLen; } fldigi-4.1.06/src/mt63/morse.dat0000644000175000017500000000760513472115775013204 00000000000000// computer readable Morse code table // // For a given character you should pick up a 31-bit code from the table. // Bits should be taken starting from the LSB. // Bit equal 1 means carrier ON, bit 0 means carrier off // Each code includes one quiet dot at the start and two at the end. // The code should be read until the last '1', // but this last '1' must not be transmitted // const int MorseTableSize=128; long MorseTable[MorseTableSize] = { 0x00000004L , // 0x00 0x00000004L , // 0x01 0x00000004L , // 0x02 0x00000004L , // 0x03 0x00000004L , // 0x04 0x00000004L , // 0x05 0x00000004L , // 0x06 0x00000004L , // 0x07 0x00000004L , // 0x08 0x00000004L , // 0x09 0x00000004L , // 0x0A 0x00000004L , // 0x0B 0x00000004L , // 0x0C 0x00000004L , // 0x0D 0x00000004L , // 0x0E 0x00000004L , // 0x0F 0x00000004L , // 0x10 0x00000004L , // 0x11 0x00000004L , // 0x12 0x00000004L , // 0x13 0x00000004L , // 0x14 0x00000004L , // 0x15 0x00000004L , // 0x16 0x00000004L , // 0x17 0x00000004L , // 0x18 0x00000004L , // 0x19 0x00000004L , // 0x1A 0x00000004L , // 0x1B 0x00000004L , // 0x1C 0x00000004L , // 0x1D 0x00000004L , // 0x1E 0x00000004L , // 0x1F 0x00000004L , // 0x20 = ' ' 0x00000004L , // 0x21 = '!' 0x00000004L , // 0x22 = '"' 0x00000004L , // 0x23 = '#' 0x0013ABAAL , // 0x24 = '$' 0x00000004L , // 0x25 = '%' 0x00000004L , // 0x26 = '&' 0x004BBBBAL , // 0x27 = ''' 0x0004BBAEL , // 0x28 = '(' 0x004EBBAEL , // 0x29 = ')' 0x0004BABAL , // 0x2A = '*' 0x00012EBAL , // 0x2B = '+' 0x004EEAEEL , // 0x2C = ',' 0x0004EAAEL , // 0x2D = '-' 0x0013AEBAL , // 0x2E = '.' 0x00012EAEL , // 0x2F = '/' 0x004EEEEEL , // 0x30 = '0' 0x0013BBBAL , // 0x31 = '1' 0x0004EEEAL , // 0x32 = '2' 0x00013BAAL , // 0x33 = '3' 0x00004EAAL , // 0x34 = '4' 0x000012AAL , // 0x35 = '5' 0x00004AAEL , // 0x36 = '6' 0x00012AEEL , // 0x37 = '7' 0x0004AEEEL , // 0x38 = '8' 0x0012EEEEL , // 0x39 = '9' 0x0012AEEEL , // 0x3A = ':' 0x0012EBAEL , // 0x3B = ';' 0x00000004L , // 0x3C = '<' 0x00013AAEL , // 0x3D = '=' 0x00000004L , // 0x3E = '>' 0x0004AEEAL , // 0x3F = '?' 0x00000004L , // 0x40 = '@' 0x0000013AL , // 0x41 = 'A' 0x000012AEL , // 0x42 = 'B' 0x00004BAEL , // 0x43 = 'C' 0x000004AEL , // 0x44 = 'D' 0x00000012L , // 0x45 = 'E' 0x000012EAL , // 0x46 = 'F' 0x000012EEL , // 0x47 = 'G' 0x000004AAL , // 0x48 = 'H' 0x0000004AL , // 0x49 = 'I' 0x00013BBAL , // 0x4A = 'J' 0x000013AEL , // 0x4B = 'K' 0x000012BAL , // 0x4C = 'L' 0x000004EEL , // 0x4D = 'M' 0x0000012EL , // 0x4E = 'N' 0x00004EEEL , // 0x4F = 'O' 0x00004BBAL , // 0x50 = 'P' 0x00013AEEL , // 0x51 = 'Q' 0x000004BAL , // 0x52 = 'R' 0x0000012AL , // 0x53 = 'S' 0x0000004EL , // 0x54 = 'T' 0x000004EAL , // 0x55 = 'U' 0x000013AAL , // 0x56 = 'V' 0x000013BAL , // 0x57 = 'W' 0x00004EAEL , // 0x58 = 'X' 0x00013BAEL , // 0x59 = 'Y' 0x00004AEEL , // 0x5A = 'Z' 0x00000004L , // 0x5B = '[' 0x00000004L , // 0x5C = '\' 0x00000004L , // 0x5D = ']' 0x00000004L , // 0x5E = '^' 0x0013AEEAL , // 0x5F = '_' 0x00000004L , // 0x60 = '`' 0x0000013AL , // 0x61 = 'a' 0x000012AEL , // 0x62 = 'b' 0x00004BAEL , // 0x63 = 'c' 0x000004AEL , // 0x64 = 'd' 0x00000012L , // 0x65 = 'e' 0x000012EAL , // 0x66 = 'f' 0x000012EEL , // 0x67 = 'g' 0x000004AAL , // 0x68 = 'h' 0x0000004AL , // 0x69 = 'i' 0x00013BBAL , // 0x6A = 'j' 0x000013AEL , // 0x6B = 'k' 0x000012BAL , // 0x6C = 'l' 0x000004EEL , // 0x6D = 'm' 0x0000012EL , // 0x6E = 'n' 0x00004EEEL , // 0x6F = 'o' 0x00004BBAL , // 0x70 = 'p' 0x00013AEEL , // 0x71 = 'q' 0x000004BAL , // 0x72 = 'r' 0x0000012AL , // 0x73 = 's' 0x0000004EL , // 0x74 = 't' 0x000004EAL , // 0x75 = 'u' 0x000013AAL , // 0x76 = 'v' 0x000013BAL , // 0x77 = 'w' 0x00004EAEL , // 0x78 = 'x' 0x00013BAEL , // 0x79 = 'y' 0x00004AEEL , // 0x7A = 'z' 0x00000004L , // 0x7B = '{' 0x00000004L , // 0x7C = '|' 0x00000004L , // 0x7D = '}' 0x00000004L , // 0x7E = '~' 0x00000004L // 0x7F = '' } ; fldigi-4.1.06/src/mt63/dsp.cxx0000644000175000017500000016661413472115775012705 00000000000000/* * dsp.cc -- various DSP algorithms * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Please note, that you should not rely on the correctness // of these routines. They generally work well, but you may find // differences in respect to the mathematical formulas: signs flipped, // orders swapped, etc. #include #include // only when we do some control printf's #include #include #include "dsp.h" // ---------------------------------------------------------------------------- double dspPower(double *X, int Len) { double Sum; for(Sum = 0.0; Len; Len--,X++) Sum += (*X)*(*X); return Sum; } double dspPower(double *I, double *Q, int Len) { double Sum; for(Sum = 0.0; Len; Len--,I++,Q++) Sum += (*I)*(*I) + (*Q)*(*Q); return Sum; } double dspPower(dspCmpx *X, int Len) { double Sum; for(Sum = 0.0; Len; Len--,X++) Sum += (X->re)*(X->re) + (X->im)*(X->im); return Sum; } // ---------------------------------------------------------------------------- // dspAverage, extremes, fitting double dspAverage(double *Data, int Len) { double Sum; int i; for(Sum = 0.0,i = 0; i < Len; i++) Sum += Data[i]; return Sum/Len; } int dspCountInRange(double *Data, int Len, double Low, double Upp) { int count, i; double D; for(count = i = 0; i Max) Max = Pwr; } return Max; } double dspFindMaxdspPower(dspCmpx *Data, int Len, int &MaxPos) { double Max, Pwr; int i, pos; Max = dspPower(Data[0]); pos = 0; for (i = 1; i < Len; i++) { Pwr = dspPower(Data[i]); if (Pwr > Max) { Max = Pwr; pos = i; } } MaxPos = pos; return Max; } double dspFitPoly1(double *Data, int Len, double &A, double &B) { double Sum; int i; A = (Data[Len-1] - Data[0])/(Len - 1); for (Sum = 0.0,i = 0; i < Len; i++) Sum += Data[i] - A*i; B = Sum/Len; for (Sum = 0.0, i = 0; i < Len; i++) Sum += dspPower(Data[i] - (A*i + B)); return sqrt(Sum/Len); } double dspFitPoly2(double *Data, int Len, double &A, double &B, double &C) { double Sum; int i; A = ((Data[Len - 1] - Data[Len - 2]) - (Data[1] - Data[0]))/(Len - 2)/2; B = (Data[Len - 1] - A*(Len - 1)*(Len - 1) - Data[0])/(Len - 1); for (Sum = 0.0, i = 0; i < Len; i++) Sum += Data[i] - (A*i*i + B*i); C = Sum/Len; for (Sum = 0.0, i = 0; i < Len; i++) Sum += dspPower(Data[i] - (A*i*i + B*i + C)); return sqrt(Sum/Len); } void dspFitPoly2(double Data[3], double &A, double &B, double &C) { C = Data[0]; A = (Data[0]- 2*Data[1] + Data[2])/2; B = (Data[1] - Data[0]) - A; } // ---------------------------------------------------------------------------- // various window shapes (for the FFT and FIR filters) // these functions are supposed to be called with the argument "dspPhase" // between -PI and +PI. Most (or even all) will return zero for input // euqal -PI or +PI. double WindowHamming(double dspPhase) { return cos(dspPhase/2); } // not exactly ... double dspWindowHanning(double dspPhase) { return (1.0 + cos(dspPhase))/2; } double WindowBlackman2(double dspPhase) // from Freq 5.1 FFT analyzer { return 0.42 + 0.5*cos(dspPhase) + 0.08*cos(2*dspPhase); } double dspWindowBlackman3(double dspPhase) // from the Motorola BBS { return 0.35875 + 0.48829*cos(dspPhase) + 0.14128*cos(2*dspPhase) + 0.01168*cos(3*dspPhase); } // ---------------------------------------------------------------------------- // FIR shape calculation for a flat response from FreqLow to FreqUpp void dspWinFirI( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift) { int i; double time, dspPhase, shape; // printf("dspWinFirI: %5.3f %5.3f %d\n",LowOmega,UppOmega,Len); for (i = 0; i < Len; i++) { time = i + (1.0 - shift) - (double)Len/2; dspPhase = 2*M_PI*time/Len; if (time == 0) shape = UppOmega - LowOmega; else shape = (sin(UppOmega*time) - sin(LowOmega*time))/time; // printf("%2d %5.1f %5.2f %7.4f %7.4f\n",i,time,dspPhase,shape,(*Window)(dspPhase)); Shape[i] = shape*(*Window)(dspPhase)/M_PI; } } void WinFirQ( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift) { int i; double time, dspPhase, shape; // printf("WinFirQ: %5.3f %5.3f %d\n",LowOmega,UppOmega,Len); for (i = 0; i < Len; i++) { time = i + (1.0 - shift) - (double)Len/2; dspPhase = 2*M_PI*time/Len; if (time == 0) shape=0.0; else shape = (-cos(UppOmega*time) + cos(LowOmega*time))/time; // printf("%2d %5.1f %5.2f %7.4f %7.4f\n",i,time,dspPhase,shape,(*Window)(dspPhase)); Shape[i] = (-shape)*(*Window)(dspPhase)/M_PI; } } // we put minus for the Q-part because the FIR shapes must be placed // in reverse order for simpler indexing // ---------------------------------------------------------------------------- // convert 16-bit signed or 8-bit unsigned into doubles void dspConvS16todouble(dspS16 *dspS16, double *dble, int Len, double Gain) { for (; Len; Len--) (*dble++) = (*dspS16++)*Gain; } int dspConvS16todouble(short int *dspS16, double_buff *dble, int Len, double Gain) { int err = dble->EnsureSpace(Len); if (err) return -1; dspConvS16todouble(dspS16, dble->Data, Len, Gain); dble->Len = Len; return 0; } void dspConvdoubleTodspS16(double *dble, dspS16 *dspS16, int Len, double Gain) { double out; for (; Len; Len--) { out = (*dble++)*Gain; if (out > 32767.0) out = 32767.0; else if (out < (-32767.0)) out = (-32767.0); (*dspS16++) = (short int)floor(out+0.5); } } // we could count the over/underflows ? void dspConvU8todouble(unsigned char *U8, double *dble, int Len, double Gain) { for (; Len; Len--) (*dble++) = ((int)(*U8++) - 128)*Gain; } int dspConvU8todouble(unsigned char *U8, double_buff *dble, int Len, double Gain) { int err = dble->EnsureSpace(Len); if (err) return -1; dspConvU8todouble(U8, dble->Data, Len, Gain); dble->Len = Len; return 0; } // ---------------------------------------------------------------------------- // other converts void dspConvCmpxTodspPower(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = dspPower(*Inp++); } int dspConvCmpxTodspPower(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if (err) return err; dspConvCmpxTodspPower(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } void dspConvCmpxTodspAmpl(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = sqrt(dspPower(*Inp++)); } int dspConvCmpxTodspAmpl(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if(err) return err; dspConvCmpxTodspAmpl(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } void dspConvCmpxTodspPhase(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = dspPhase(*Inp++); } int dspConvCmpxTodspPhase(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if(err) return err; dspConvCmpxTodspPhase(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Pulse noise limiter dspPulseLimiter::dspPulseLimiter() { Tap = NULL; } dspPulseLimiter::~dspPulseLimiter() { free(Tap); } void dspPulseLimiter::Free(void) { free(Tap); Tap = NULL; } int dspPulseLimiter::Preset(int TapLen, double LimitThres) { Len = TapLen; Thres = LimitThres*LimitThres; if (dspRedspAllocArray(&Tap, Len)) return -1; dspClearArray(Tap, Len); Ptr = 0; PwrSum = 0.0; return 0; } int dspPulseLimiter::Process(double *Inp, int InpLen, double *Out) { int i, o; double Lim; for (i = 0; i < InpLen; i++) { PwrSum -= Tap[Ptr]*Tap[Ptr]; Tap[Ptr++] = Inp[i]; PwrSum += Inp[i]*Inp[i]; if (Ptr >= Len) Ptr -= Len; o = Ptr + (Len/2); if (o >= Len) o -= Len; Lim = Thres*PwrSum/Len; if (Tap[o]*Tap[o] <= Lim) Out[i] = Tap[o]; else { if (Tap[o] > 0.0) Out[i] = sqrt(Lim); else Out[i] = (-sqrt(Lim)); } } for (PwrSum = 0.0, i = 0; i < Len; i++) PwrSum += Tap[i]*Tap[i]; dspRMS = sqrt(PwrSum/Len); return 0; } int dspPulseLimiter::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Signal level monitor dspLevelMonitor::dspLevelMonitor() { } dspLevelMonitor::~dspLevelMonitor() { } int dspLevelMonitor::Preset(double Integ, double Range) { dspLowPass2Coeff(Integ, W1, W2, W5); MaxSqr = Range*Range; PwrMid = 0.0; PwrOut = 0.0; dspRMS = 0.0; OutOfRangeMid = 0.0; OutOfRange = 0.0; return 0; } int dspLevelMonitor::Process(double *Inp, int Len) { int i, Out; double Sqr, Sum; if (Len <= 0) return 0; for (Sum = 0.0, Out = 0,i = 0; i < Len; i++) { Sum += Sqr = Inp[i]*Inp[i]; Out += (Sqr > MaxSqr); } dspLowPass2(Sum/Len, PwrMid, PwrOut, W1, W2, W5); dspLowPass2((double)Out/Len, OutOfRangeMid, OutOfRange, W1, W2, W5); if (OutOfRange < 0.0) OutOfRange = 0.0; if (PwrOut <= 0.0) dspRMS = 0.0; else dspRMS = sqrt(PwrOut); return 0; } int dspLevelMonitor::Process(double_buff *Input) { return Process(Input->Data,Input->Len); } // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer dspMixerAutoLevel::dspMixerAutoLevel() { MinMS = 0.01; MaxMS = 0.05; IntegLen = 8000; PeakHold = 4000; MinHold = 800; MinLevel = 0; MaxLevel = 100; AdjStep = 1; Level = 75; Hold = (-IntegLen); AvedspRMS = 0.0; } int dspMixerAutoLevel::Process(double *Inp, int InpLen) { double MS = dspPower(Inp, InpLen) / IntegLen; double W = 1.0 - ((double)InpLen) / IntegLen; AvedspRMS = AvedspRMS*W + MS; Hold += InpLen; if (Hold < MinHold) return 0; if(AvedspRMS>MaxMS) { Level -= AdjStep; if (Level < MinLevel) Level = MinLevel; Hold=0; return 1; } if (Hold < PeakHold) return 0; if (AvedspRMS < MinMS) { Level += AdjStep; if (Level > MaxLevel) Level = MaxLevel; Hold = 0; return 1; } return 0; } // ---------------------------------------------------------------------------- void dspLowPass2(dspCmpx *Inp, dspCmpx *Mid, dspCmpx *Out, double W1, double W2, double W5) { double Sum, Diff; // printf("\n[dspLowPass2] %6.3f %6.3f %6.3f",Inp->re,Mid->re,Out->re); Sum = Mid->re + Out->re; Diff = Mid->re - Out->re; Mid->re += W2*Inp->re - W1*Sum; Out->re += W5*Diff; // printf(" => %6.3f %6.3f\n",Mid->re,Out->re); Sum = Mid->im + Out->im; Diff = Mid->im - Out->im; Mid->im += W2*Inp->im - W1*Sum; Out->im += W5*Diff; } // ---------------------------------------------------------------------------- // periodic low pass dspPeriodLowPass2::dspPeriodLowPass2() { TapMid = NULL; TapOut = NULL; } dspPeriodLowPass2::~dspPeriodLowPass2() { free(TapMid); free(TapOut); Output.Free(); } void dspPeriodLowPass2::Free(void) { free(TapMid); TapMid = NULL; free(TapOut); TapOut = NULL; } int dspPeriodLowPass2::Preset(int Period, double IntegLen) { int i; Len = Period; if (dspRedspAllocArray(&TapMid, Len)) goto Error; if (dspRedspAllocArray(&TapOut, Len)) goto Error; for (i = 0; i < Len; i++) { TapMid[i] = 0.0; TapOut[i] = 0.0; } TapPtr = 0; dspLowPass2Coeff(IntegLen, W1, W2, W5); return 0; Error: Free(); return -1; } int dspPeriodLowPass2::Process(double Inp, double &Out) { dspLowPass2(Inp, TapMid[TapPtr], TapOut[TapPtr], W1, W2, W5); Out = TapOut[TapPtr++]; if(TapPtr >= Len) TapPtr = 0; return 0; } int dspPeriodLowPass2::Process(double *Inp, int InpLen, double *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { dspLowPass2(*Inp++, TapMid[TapPtr], TapOut[TapPtr], W1, W2, W5); (*Out++) = TapOut[TapPtr++]; } if (TapPtr >= Len) TapPtr = 0; } return 0; } int dspPeriodLowPass2::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but complexity very low // and independent on the integration time dspBoxFilter::dspBoxFilter() { Tap = NULL; } dspBoxFilter::~dspBoxFilter() { free(Tap); } void dspBoxFilter::Free(void) { free(Tap); Tap = NULL; Output.Free(); } int dspBoxFilter::Preset(int BoxLen) { int i; if (dspRedspAllocArray(&Tap, BoxLen)) return -1; for (i = 0; i < BoxLen; i++) Tap[i] = 0; Len = BoxLen; TapPtr = 0; Sum = 0; return 0; } int dspBoxFilter::Process(double *Inp, int InpLen, double *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { Sum -= Tap[TapPtr]; Out[i] = (Sum += Tap[TapPtr++] = Inp[i]); } if (TapPtr >= Len) TapPtr = 0; } for (Sum = 0, i = 0; i < Len; i++) Sum += Tap[i]; return InpLen; } void dspBoxFilter::Recalibrate() { int i; for (Sum = 0, i = 0; i < Len; i++) Sum += Tap[i]; } int dspBoxFilter::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } dspCmpxBoxFilter::dspCmpxBoxFilter() { Tap = NULL; } dspCmpxBoxFilter::~dspCmpxBoxFilter() { free(Tap); } void dspCmpxBoxFilter::Free(void) { free(Tap); Tap = NULL; Output.Free(); } int dspCmpxBoxFilter::Preset(int BoxLen) { int i; if (dspRedspAllocArray(&Tap, BoxLen)) return -1; for (i = 0; i < BoxLen; i++) Tap[i].re = Tap[i].im = 0.0; Len = BoxLen; TapPtr = 0; Sum.re = 0.0; Sum.im = 0.0; return 0; } int dspCmpxBoxFilter::Process(dspCmpx *Inp, int InpLen, dspCmpx *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { Sum.re -= Tap[TapPtr].re; Sum.im -= Tap[TapPtr].im; Tap[TapPtr] = Inp[i]; Sum.re += Inp[i].re; Sum.im += Inp[i].im; Out[i].re = Sum.re; Out[i].im = Sum.im; } if (TapPtr >= Len) TapPtr = 0; } for (Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Tap[i].re; Sum.im += Tap[i].im; } return InpLen; } void dspCmpxBoxFilter::Recalibrate() { int i; for (Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Tap[i].re; Sum.im += Tap[i].im; } } int dspCmpxBoxFilter::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // FIR filter with a given shape dspFirFilter::dspFirFilter() { Tap = NULL; ExternShape = 1; } dspFirFilter::~dspFirFilter() { free(Tap); if (!ExternShape) free(Shape); } void dspFirFilter::Free(void) { free(Tap); Tap = NULL; if (!ExternShape) free(Shape); Shape = NULL; Output.Free(); } int dspFirFilter::Preset(int FilterLen, double *FilterShape) { int i; if (dspRedspAllocArray(&Tap, FilterLen)) return -1; for (i = 0; i < FilterLen; i++) Tap[i] = 0; Len = FilterLen; TapPtr = 0; if (!ExternShape) free(Shape); Shape = FilterShape; return 0; } int dspFirFilter::ComputeShape( double LowOmega, double UppOmega, double (*Window)(double)) { if (ExternShape) { Shape = NULL; ExternShape = 0; } if (dspRedspAllocArray(&Shape, Len)) return -1; dspWinFirI(LowOmega, UppOmega, Shape, Len, Window); return 0; } int dspFirFilter::Process(double *Inp, int InpLen, double *Out) { int i, s, t; double Sum; if(InpLenLen); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // a pair of FIR filters. for quadrature split & decimate // the decimation rate must be an integer dspQuadrSplit::dspQuadrSplit() { ExternShape = 1; } dspQuadrSplit::~dspQuadrSplit() { if (!ExternShape) { free(ShapeI); free(ShapeQ); } } void dspQuadrSplit::Free(void) { Tap.Free(); if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = NULL; ShapeQ = NULL; Output.Free(); } int dspQuadrSplit::Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate) { Len = FilterLen; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = FilterShape_I; ShapeQ = FilterShape_Q; ExternShape = 1; Tap.EnsureSpace(Len); Tap.Len = Len; dspClearArray(Tap.Data, Tap.Len); Rate = DecimateRate; return 0; } int dspQuadrSplit::ComputeShape(double LowOmega,double UppOmega, double (*Window)(double)) { if (ExternShape) { ShapeI = NULL; ShapeQ = NULL; ExternShape = 0; } if (dspRedspAllocArray(&ShapeI, Len)) return -1; if (dspRedspAllocArray(&ShapeQ, Len)) return -1; dspWinFirI(LowOmega, UppOmega, ShapeI, Len, Window); WinFirQ(LowOmega, UppOmega, ShapeQ, Len, Window); return 0; } int dspQuadrSplit::Process(double_buff *Input) { int err, i, s, t, o, l; double SumI, SumQ; double *Inp; dspCmpx *Out; int InpLen; InpLen = Input->Len; err = Tap.EnsureSpace(Tap.Len + InpLen); if (err) return err; dspCopyArray(Tap.Data+Tap.Len, Input->Data, InpLen); // printf("dspQuadrSplit: InpLen=%d, Tap.Len=%d",InpLen,Tap.Len); Tap.Len += InpLen; Inp = Tap.Data; // printf(" -> %d",Tap.Len); err = Output.EnsureSpace( InpLen / Rate + 2); if (err) return err; Out = Output.Data; for (l = Tap.Len-Len,o = 0, i = 0; i < l; i += Rate) { for (SumI = SumQ = 0.0, s = i,t = 0; t < Len; t++,s++) { SumI += Inp[s] * ShapeI[t]; SumQ += Inp[s] * ShapeQ[t]; } Out[o].re=SumI; Out[o++].im=SumQ; } Tap.Len -= i; dspMoveArray(Tap.Data,Tap.Data+i,Tap.Len); Output.Len = o; // printf(" => Tap.Len=%d\n",Tap.Len); return 0; } // ---------------------------------------------------------------------------- // reverse of dspQuadrSplit: interpolates and combines the I/Q // back into 'real' signal. dspQuadrComb::dspQuadrComb() { Tap = NULL; ExternShape = 1; } dspQuadrComb::~dspQuadrComb() { free(Tap); if (!ExternShape) { free(ShapeI); free(ShapeQ); } } void dspQuadrComb::Free(void) { free(Tap); Tap = NULL; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = NULL; ShapeQ = NULL; Output.Free(); } int dspQuadrComb::Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate) { int i; Len = FilterLen; if (dspRedspAllocArray(&Tap, Len)) return -1; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = FilterShape_I; ShapeQ = FilterShape_Q; ExternShape = 1; for (i = 0; i < FilterLen; i++) Tap[i] = 0.0; TapPtr = 0; Rate = DecimateRate; return 0; } int dspQuadrComb::ComputeShape( double LowOmega,double UppOmega, double (*Window)(double)) { if (ExternShape) { ShapeI = NULL; ShapeQ = NULL; ExternShape = 0; } if (dspRedspAllocArray(&ShapeI, Len)) return -1; if (dspRedspAllocArray(&ShapeQ, Len)) return -1; dspWinFirI(LowOmega, UppOmega, ShapeI, Len, Window); WinFirQ(LowOmega, UppOmega, ShapeQ, Len, Window); return 0; } int dspQuadrComb::Process(dspCmpx_buff *Input) { int err, i, o, r, t, len; dspCmpx *Inp; double *Out; int InpLen; double I, Q; InpLen = Input->Len; err = Output.EnsureSpace(InpLen*Rate); if (err) return err; Inp = Input->Data; Out = Output.Data; Output.Len = InpLen*Rate; for(o=0,i=0; i= 2*M_PI) dspPhase -= 2*M_PI; } return InpLen; } int dspCmpxMixer::ProcessFast(dspCmpx *Inp, int InpLen, dspCmpx *Out) { int i; double dI, dQ, I, Q, nI, nQ, N; dI = cos(Omega); dQ = sin(Omega); I = cos(dspPhase); Q = sin(dspPhase); for (i = 0; i < InpLen; i++) { Out[i].re = I*Inp[i].re + Q*Inp[i].im; Out[i].im = I*Inp[i].im - Q*Inp[i].re; nI = I*dI - Q*dQ; nQ = Q*dI + I*dQ; I = nI; Q = nQ; } dspPhase += InpLen*Omega; N = floor(dspPhase/(2*M_PI)); dspPhase -= N*2*M_PI; return InpLen; } int dspCmpxMixer::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } int dspCmpxMixer::ProcessFast(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; ProcessFast(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // FM demodulator (dspPhase rotation speed meter) dspFMdemod::dspFMdemod() { PrevdspPhase = 0.0; RefOmega = 0.0; } int dspFMdemod::Preset(double CenterOmega) { RefOmega = CenterOmega; return 0; } int dspFMdemod::Process(double *InpI, double *InpQ, int InpLen, double *Out) { int i; double dspPhase, dspPhaseDiff; for (i = 0; i < InpLen; i++) { if ((InpI[i] == 0.0) && (InpQ[i] == 0.0)) dspPhase = 0; else dspPhase = atan2(InpQ[i], InpI[i]); dspPhaseDiff = dspPhase - PrevdspPhase - RefOmega; if (dspPhaseDiff >= M_PI) dspPhaseDiff -= 2*M_PI; else if (dspPhaseDiff < (-M_PI)) dspPhaseDiff += 2*M_PI; Out[i] = dspPhaseDiff; PrevdspPhase = dspPhase; } return InpLen; } int dspFMdemod::Process(dspCmpx *Inp, int InpLen, double *Out) { int i; double dspPhase, dspPhaseDiff; for (i = 0; i < InpLen; i++) { if ((Inp[i].re == 0.0) && (Inp[i].im == 0.0)) dspPhase = PrevdspPhase; else dspPhase = atan2(Inp[i].im, Inp[i].re); dspPhaseDiff = dspPhase - PrevdspPhase - RefOmega; if (dspPhaseDiff >= M_PI) dspPhaseDiff -= 2*M_PI; else if (dspPhaseDiff < (-M_PI)) dspPhaseDiff += 2*M_PI; Out[i] = dspPhaseDiff; PrevdspPhase = dspPhase; } return InpLen; } int dspFMdemod::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. // note: in fldigi these rate converters are not used. // libsamplerate is the preferred solution dspRateConvLin::dspRateConvLin() { PrevSample = 0; OutdspPhase = 0; OutStep = 1.0; } void dspRateConvLin::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvLin::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvLin::Process(double_buff *Input) { int err, i, o; double *Inp, *Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep) + 2); if (err) return err; Out = Output.Data; for (o = 0; OutdspPhase < 0; ) { Out[o++] = Inp[0]*(1.0 + OutdspPhase) - OutdspPhase*PrevSample; OutdspPhase += OutStep; } for (i = 0; i < (InpLen-1); ) { if (OutdspPhase >= 1.0) { OutdspPhase -= 1.0; i++; } else { Out[o++] = Inp[i]*(1.0 - OutdspPhase) + Inp[i+1]*OutdspPhase; OutdspPhase += OutStep; } } Output.Len = o; PrevSample = Inp[i]; OutdspPhase -= 1.0; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 dspRateConvQuadr::dspRateConvQuadr() { int i; for (i = 0; i < 4; i++) Tap[i] = 0; OutStep = 1.0; OutdspPhase = 0; TapPtr = 0; } void dspRateConvQuadr::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvQuadr::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvQuadr::Process( double *Inp, int InpLen, double *Out, int MaxOutLen, int *OutLen) { int i, o, t; double Ref0, Ref1, Diff0, Diff1; for (o = i = 0; (i < InpLen) && (o < MaxOutLen); ) { if (OutdspPhase >= 1.0) { Tap[TapPtr] = (*Inp++); i++; TapPtr = (TapPtr + 1) & 3; OutdspPhase -= 1.0; } else { t = TapPtr; Diff0 = (Tap[t^2] - Tap[t]) / 2; Ref1 = Tap[t^2]; t = (t + 1) & 3; Diff1 = (Tap[t^2] - Tap[t]) / 2; Ref0 = Tap[t]; (*Out++) = Ref0 * (1.0 - OutdspPhase) + Ref1*OutdspPhase // linear piece -(Diff1-Diff0)*OutdspPhase*(1.0-OutdspPhase)/2; // quadr. piece o++; OutdspPhase += OutStep; } } (*OutLen) = o; return i; } int dspRateConvQuadr::Process(double_buff *Input) { int err, i, o, t; double Ref0, Ref1, Diff0, Diff1; double *Inp,*Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen / OutStep) + 2); if (err) return err; Out = Output.Data; for (o = i = 0; i < InpLen; ) { if (OutdspPhase >= 1.0) { Tap[TapPtr] = (*Inp++); i++; TapPtr = (TapPtr + 1) & 3; OutdspPhase -= 1.0; } else { t = TapPtr; Diff0 = (Tap[t^2] - Tap[t]) / 2; Ref1 = Tap[t^2]; t = (t + 1) & 3; Diff1 = (Tap[t^2] - Tap[t]) / 2; Ref0 = Tap[t]; (*Out++) = Ref0 * (1.0 - OutdspPhase) + Ref1*OutdspPhase // linear piece -(Diff1 - Diff0)*OutdspPhase*(1.0 - OutdspPhase)/2; // quadr. piece o++; OutdspPhase += OutStep; } } Output.Len = o; return 0; } // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters dspRateConvBL::dspRateConvBL() { Tap = NULL; Shape = NULL; ExternShape = 1; } dspRateConvBL::~dspRateConvBL() { Free(); } void dspRateConvBL::Free(void) { int s; free(Tap); Tap = NULL; if (ExternShape) return; if (Shape) { for (s = 0; s < ShapeNum; s++) free(Shape[s]); free(Shape); Shape = NULL; } } int dspRateConvBL::Preset(int FilterLen, double **FilterShape, int FilterShapeNum) { int i; Free(); Len = FilterLen; if (dspRedspAllocArray(&Tap, Len)) return -1; TapSize = Len; for (i = 0; i < Len; i++) Tap[i] = 0.0; Shape = FilterShape; ShapeNum = FilterShapeNum; ExternShape = 1; OutStep = 1.0; OutdspPhase = 0.0; return 0; } int dspRateConvBL::ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)) { int idx; if (ExternShape) { if (dspAllocArray(&Shape, ShapeNum)) return -1; for (idx = 0; idx < ShapeNum; idx++) { if (dspAllocArray(&Shape[idx], Len)) return -1; } ExternShape = 0; } for (idx = 0; idx < ShapeNum; idx++) dspWinFirI(LowOmega, UppOmega, Shape[idx], Len, Window, (double)idx/ShapeNum); return 0; } void dspRateConvBL::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvBL::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvBL::Process(double_buff *Input) { int i, o, idx, t, err; double *shape; double Sum; double *Inp, *Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if (err) return err; Out = Output.Data; if ((Len + InpLen) > TapSize) { Tap = (double*)realloc(Tap, (Len+InpLen)*sizeof(double)); if (Tap == NULL) return -1; TapSize = Len + InpLen; } memcpy(Tap + Len, Inp, InpLen*sizeof(double)); for(o=i=0; i= 1.0) { OutdspPhase -= 1.0; i++; } else { idx = (int)floor(OutdspPhase*ShapeNum); shape = Shape[idx]; for (Sum = 0.0, t = 0; t < Len; t++) Sum += Tap[i + t]*shape[t]; Out[o++] = Sum; OutdspPhase += OutStep; } } Output.Len = o; memmove(Tap, Tap + InpLen, Len*sizeof(double)); return 0; } int dspRateConvBL::ProcessLinI(double_buff *Input) { int i, o, idx, t, err; double *Inp, *Out; int InpLen; double Sum0, Sum1; double *shape; double d; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if (err) return err; Out = Output.Data; if ((Len + InpLen) > TapSize) { Tap = (double*)realloc(Tap, (Len + InpLen)*sizeof(double)); if (Tap == NULL) return -1; TapSize = Len + InpLen; } memcpy(Tap + Len, Inp, InpLen*sizeof(double)); for (o = i = 0; i < InpLen; ) { if (OutdspPhase >= 1.0) { OutdspPhase -= 1.0; i++; } else { idx = (int)floor(OutdspPhase*ShapeNum); d = OutdspPhase*ShapeNum - idx; shape = Shape[idx]; for (Sum0 = 0.0, t = 0; t < Len; t++) Sum0 += Tap[i+t]*shape[t]; idx += 1; if (idx >= ShapeNum) { idx = 0; i++; } shape = Shape[idx]; for (Sum1 = 0.0, t = 0; t < Len; t++) Sum1 += Tap[i + t]*shape[t]; if (idx == 0) i--; Out[o++] = (1.0 - d)*Sum0 + d*Sum1; OutdspPhase += OutStep; } } Output.Len = o; memmove(Tap, Tap + InpLen, Len*sizeof(double)); return 0; } // ---------------------------------------------------------------------------- // Sliding window (for FFT input) dspCmpxSlideWindow::dspCmpxSlideWindow() { Buff = NULL; Window = NULL; ExternWindow = 1; } dspCmpxSlideWindow::~dspCmpxSlideWindow() { free(Buff); if (!ExternWindow) free(Window); } void dspCmpxSlideWindow::Free(void) { free(Buff); Buff = NULL; if (!ExternWindow) free(Window); Window = NULL; } int dspCmpxSlideWindow::Preset(int WindowLen, int SlideDist, double *WindowShape) { int i; if (SlideDist > WindowLen) return -1; Len = WindowLen; Dist = SlideDist; if (dspRedspAllocArray(&Buff, Len)) return -1; for (i = 0; i < Len; i++) Buff[i].re = Buff[i].im = 0.0; Ptr = 0; if (!ExternWindow) free(Window); Window = WindowShape; ExternWindow = 1; return 0; } int dspCmpxSlideWindow::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } if (dspRedspAllocArray(&Window, Len)) return -1; for (idx = 0; idx < Len; idx++) Window[idx] = (*NewWindow)(2*M_PI*(idx - Len/2 + 0.5)/Len)*Scale; return 0; } int dspCmpxSlideWindow::Process(dspCmpx_buff *Input) { dspCmpx *Inp = Input->Data; int InpLen = Input->Len; int i, len, err; Output.Len = 0; while (InpLen > 0) { len = dspIntmin(Len - Ptr, InpLen); memcpy(Buff + Ptr, Inp, len*sizeof(dspCmpx)); Ptr += len; Inp += len; InpLen -= len; if (Ptr >= Len) { len = Output.Len; err = Output.EnsureSpace(len + Len); if(err) return err; if (Window == NULL) memcpy(Output.Data, Buff, Len*sizeof(dspCmpx)); else for (i = 0; i < Len; i++) { Output.Data[len + i].re = Buff[i].re*Window[i]; Output.Data[len + i].im = Buff[i].im*Window[i]; } Output.Len += Len; memmove(Buff, Buff + Dist, (Len - Dist)*sizeof(dspCmpx)); Ptr -= Dist; } } return 0; } // ---------------------------------------------------------------------------- // Overlaping window (for IFFT output) dspCmpxOverlapWindow::dspCmpxOverlapWindow() { Buff = NULL; Window = NULL; ExternWindow = 1; } dspCmpxOverlapWindow::~dspCmpxOverlapWindow() { free(Buff); if (!ExternWindow) free(Window); } void dspCmpxOverlapWindow::Free(void) { free(Buff); Buff=NULL; if (!ExternWindow) free(Window); Window = NULL; } int dspCmpxOverlapWindow::Preset(int WindowLen, int SlideDist, double *WindowShape) { int i; if (SlideDist > WindowLen) return -1; Len = WindowLen; Dist = SlideDist; if (dspRedspAllocArray(&Buff, Len)) return -1; for (i = 0; i < Len; i++) Buff[i].re = Buff[i].im = 0.0; if (!ExternWindow) free(Window); Window = WindowShape; ExternWindow = 1; return 0; } int dspCmpxOverlapWindow::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } if (dspRedspAllocArray(&Window, Len)) return -1; for (idx = 0; idx < Len; idx++) Window[idx] = (*NewWindow)(2*M_PI*(idx - Len/2 + 0.5)/Len)*Scale; return 0; } int dspCmpxOverlapWindow::Process(dspCmpx_buff *Input) { int i, err; Output.Len = 0; for (i = 0; i < Input->Len; i += Len) { err = Output.EnsureSpace(Output.Len + Dist); if (err) return err; Process(Input->Data + i, Output.Data + Output.Len); Output.Len += Dist; } return 0; } int dspCmpxOverlapWindow::Process(dspCmpx *Input) { int err; err = Output.EnsureSpace(Dist); if (err) return err; Process(Input, Output.Data); Output.Len = Dist; return 0; } void dspCmpxOverlapWindow::Process(dspCmpx *Inp, dspCmpx *Out) { int i; if(Window == NULL) { for (i = 0; i < Dist; i++) { Out[i].re = Buff[i].re + Inp[i].re; Out[i].im = Buff[i].im + Inp[i].im; } for ( ; i < Len - Dist; i++) { Buff[i - Dist].re = Buff[i].re + Inp[i].re; Buff[i - Dist].im = Buff[i].im + Inp[i].im; } for ( ; i < Len; i++) { Buff[i - Dist].re = Inp[i].re; Buff[i - Dist].im = Inp[i].im; } } else { for (i = 0; i < Dist; i++) { Out[i].re = Buff[i].re + Inp[i].re*Window[i]; Out[i].im = Buff[i].im + Inp[i].im*Window[i]; } for ( ; i < Len - Dist; i++) { Buff[i - Dist].re = Buff[i].re + Inp[i].re*Window[i]; Buff[i - Dist].im = Buff[i].im + Inp[i].im*Window[i]; } for ( ; i < Len; i++) { Buff[i - Dist].re = Inp[i].re*Window[i]; Buff[i - Dist].im = Inp[i].im*Window[i]; } } } int dspCmpxOverlapWindow::ProcessSilence(int Slides) { int err, slide; err = Output.EnsureSpace(Slides*Dist); if (err) return err; Output.Len = 0; for (slide = 0; slide < Slides; slide++) { memcpy(Output.Data + Output.Len, Buff, Dist*sizeof(dspCmpx)); memcpy(Buff, Buff + Dist, (Len - Dist)*sizeof(dspCmpx)); Output.Len += Dist; } return 0; } // ---------------------------------------------------------------------------- // FFT dspPhase corrector dspFFT_TimeShift::dspFFT_TimeShift() { FreqTable = NULL; } dspFFT_TimeShift::~dspFFT_TimeShift() { free(FreqTable); } void dspFFT_TimeShift::Free(void) { free(FreqTable); FreqTable = NULL; } int dspFFT_TimeShift::Preset(int FFTlen, int Backwards) { int i; double p; dspPhase = 0; Len = FFTlen; LenMask = FFTlen - 1; if ((LenMask^Len) != (2*Len - 1)) return -1; if (dspRedspAllocArray(&FreqTable, Len)) return -1; for (i = 0; i < Len; i++) { p = (2*M_PI*i)/Len; if (Backwards) p = (-p); FreqTable[i].re = cos(p); FreqTable[i].im = sin(p); } return 0; } int dspFFT_TimeShift::Process(dspCmpx *Data, int Time) { double nI, nQ; int i, p; dspPhase = (dspPhase + Time) & LenMask; for (p = i = 0; i < Len; i++) { nI = Data[i].re*FreqTable[i].re - Data[i].im*FreqTable[i].im; nQ = Data[i].re*FreqTable[i].im + Data[i].im*FreqTable[i].re; Data[i].re = nI; Data[i].im = nQ; p = (p + dspPhase) & LenMask; } return 0; } // ---------------------------------------------------------------------------- // bit synchronizer, the bit rate is the input rate divided by four dspDiffBitSync4::dspDiffBitSync4(int IntegBits) { int i; IntegLen = IntegBits; InpTapLen = 4*IntegLen + 8; InpTap = (double*)malloc(InpTapLen*sizeof(double)); for (i = 0; i < InpTapLen; i++) InpTap[i] = 0; InpTapPtr = 0; for (i = 0; i < 4; i++) { DiffInteg[i] = DiffInteg0[i] = 0.0; } DiffTapPtr = 0; BitPtr = 0; SyncdspPhase = 0.0; SyncDrift = SyncDrift0 = 0; SyncConfid = 0.0; dspLowPass2Coeff((double)IntegLen*2, W1, W2, W5); } dspDiffBitSync4::~dspDiffBitSync4() { free(InpTap); } void dspDiffBitSync4::Free() { free(InpTap); InpTap=NULL; } int dspDiffBitSync4::Process( double *Inp, int InpLen, double *BitOut, double *IbitOut, int MaxOutLen, int *OutLen) { int i, o, t, step; double diff; double Sum, SumI, SumQ, dspPhase; for (step = 0,o = i = 0; (i < InpLen) && (o < MaxOutLen); i++) { diff = (-InpTap[InpTapPtr++]); if (InpTapPtr >= InpTapLen) InpTapPtr = 0; diff += (InpTap[InpTapPtr] = (*Inp++)); DiffTapPtr = (DiffTapPtr + 1) & 3; dspLowPass2(diff*diff, DiffInteg0[DiffTapPtr], DiffInteg[DiffTapPtr], W1, W2, W5); if (DiffTapPtr == BitPtr) { for (Sum = 0, t = 0; t < 4; t++) Sum += DiffInteg[t]; t = DiffTapPtr; SumI = DiffInteg[t] - DiffInteg[t^2]; t = (t + 1) & 3; SumQ = DiffInteg[t] - DiffInteg[t^2]; if ((Sum == 0.0) || ((SyncConfid = (SumI*SumI + SumQ*SumQ)/(Sum*Sum)) == 0.0)) { (*BitOut++) = 0; (*IbitOut++) = 0; o++; continue; } dspPhase = atan2(-SumQ, -SumI)*(4/(2*M_PI)); dspLowPass2(dspPhase - SyncdspPhase, SyncDrift0, SyncDrift, W1, W2, W5); SyncdspPhase = dspPhase; if (dspPhase > 0.52) { step = 1; SyncdspPhase -= 1.0; } else if (dspPhase < (-0.52)) { step = (-1); SyncdspPhase += 1.0; } else step = 0; double Samp[5], bit, ibit, dx; int p; p = InpTapPtr - 4*IntegLen - 2; if (p < 0) p += InpTapLen; for (t = 0; t < 5; t++) { Samp[t] = InpTap[p++]; if (p >= InpTapLen) p = 0; } dx = dspPhase-0.5; // bit=Samp[2]+dx*(Samp[2]-Samp[1]); // linear interpolation bit = Samp[2]*(1.0 + dx) - Samp[1]*dx // or quadratic + ((Samp[3] - Samp[1]) - (Samp[2] - Samp[0]))/2*dx*(1.0 + dx)/2; ibit = Samp[4] + dx*(Samp[4] - Samp[3]); //linear interpolation is enough (*BitOut++) = bit; (*IbitOut++) = ibit; o++; } else if (DiffTapPtr == (BitPtr^2)) { BitPtr = (BitPtr + step) & 3; step = 0; } } (*OutLen) = o; return i; } double dspDiffBitSync4::GetSyncConfid() { return 4*SyncConfid; } double dspDiffBitSync4::GetSyncDriftRate() { return SyncDrift/4; } // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter dspBitSlicer::dspBitSlicer(int IntegBits) { int i; TapLen = IntegLen = IntegBits; Tap = (double *)malloc(TapLen*sizeof(double)); for (i = 0; i < TapLen; i++) Tap[i] = 0; TapPtr = 0; for (i = 0; i < 2; i++) { Sum[i] = Sum0[i] = 0.0; SumSq[i] = SumSq0[i] = 0.0; TimeAsym = TimeAsym0 = 0.0; dspAmplAsym = dspAmplAsym0 = 0.0; Noise[i] = 0; } dspLowPass2Coeff((double)IntegLen*2, W1, W2, W5); PrevBit = PrevIBit = 0.0; OptimThres = 0.0; } dspBitSlicer::~dspBitSlicer() { free(Tap); } int dspBitSlicer::Process(double *Bits, double *IBits, int InpLen, double *OutBits) { int i, l; double Bit, soft; for (i = 0; i < InpLen; i++) { Bit = Bits[i]; l = Bit > 0; dspLowPass2(Bit, Sum0[l], Sum[l], W1, W2, W5); dspLowPass2(Bit*Bit, SumSq0[l], SumSq[l], W1, W2, W5); Noise[l] = sqrt(SumSq[l] - Sum[l]*Sum[l]); if (Noise[0] + Noise[1] <= 0) OptimThres = 0; else OptimThres = (Sum[0]*Noise[1] + Sum[1]*Noise[0]) / (Noise[0] + Noise[1]); soft = Tap[TapPtr] - OptimThres; // we could do a better soft-decision if (Bit*PrevBit < 0) { dspLowPass2(PrevIBit, dspAmplAsym0, dspAmplAsym, W1, W2, W5); if (Bit > 0) PrevIBit = (-PrevIBit); dspLowPass2(PrevIBit, TimeAsym0, TimeAsym, W1, W2, W5); } (*OutBits++) = soft; PrevBit = Bit; PrevIBit = IBits[i]; Tap[TapPtr] = Bit; TapPtr++; if (TapPtr >= TapLen) TapPtr = 0; } return InpLen; } double dspBitSlicer::GetSigToNoise() { return Noise[1]>0 ? (Sum[1]-OptimThres)/Noise[1] : 0.0; } double dspBitSlicer::GetdspAmplAsym() { double Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*dspAmplAsym/Sweep : 0.0; } double dspBitSlicer::GetTimeAsym() { double Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*TimeAsym/Sweep : 0.0; } // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. dspHDLCdecoder::dspHDLCdecoder( int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)) { MinLen = minlen; MaxLen = maxlen; RxDiff = diff; RxInvert = invert; ChanId = chan; FrameHandler = handler; Buff = (char *)malloc(MaxLen); Len = (-1); PrevLev = 0; ShiftReg = 0; BitCount = 0; Count1s = 0; AllFrameCount = 0; BadFrameCount = 0; } dspHDLCdecoder::~dspHDLCdecoder() { free(Buff); } int dspHDLCdecoder::Process(double *Inp, int InpLen) { int i, lev, bit, Flag; for (i = 0; i < InpLen; i++) { lev = Inp[i] > 0; bit = (lev^(PrevLev & RxDiff))^RxInvert; PrevLev = lev; ShiftReg = (ShiftReg >> 1) | (bit << 7); BitCount += 1; Flag = 0; if (bit) Count1s += 1; else { if (Count1s >= 7) Len = (-1); else if (Count1s == 6) Flag = 1; else if (Count1s == 5) { ShiftReg <<= 1; BitCount -= 1; } Count1s = 0; } if (Flag) { if ((Len >= MinLen) && (BitCount == 8)) (*FrameHandler)(ChanId, Buff, Len); Len = 0; BitCount = 0; } else if (Len >= 0) { if (BitCount == 8) { if (Len < MaxLen) Buff[Len++] = (char)ShiftReg; else Len = (-1); BitCount = 0; } } } return InpLen; } // ---------------------------------------------------------------------------- // AX.25 CRC, adress decoding, etc. short unsigned int dspAX25CRCtable[256] = { 0U, 4489U, 8978U, 12955U, 17956U, 22445U, 25910U, 29887U, 35912U, 40385U, 44890U, 48851U, 51820U, 56293U, 59774U, 63735U, 4225U, 264U, 13203U, 8730U, 22181U, 18220U, 30135U, 25662U, 40137U, 36160U, 49115U, 44626U, 56045U, 52068U, 63999U, 59510U, 8450U, 12427U, 528U, 5017U, 26406U, 30383U, 17460U, 21949U, 44362U, 48323U, 36440U, 40913U, 60270U, 64231U, 51324U, 55797U, 12675U, 8202U, 4753U, 792U, 30631U, 26158U, 21685U, 17724U, 48587U, 44098U, 40665U, 36688U, 64495U, 60006U, 55549U, 51572U, 16900U, 21389U, 24854U, 28831U, 1056U, 5545U, 10034U, 14011U, 52812U, 57285U, 60766U, 64727U, 34920U, 39393U, 43898U, 47859U, 21125U, 17164U, 29079U, 24606U, 5281U, 1320U, 14259U, 9786U, 57037U, 53060U, 64991U, 60502U, 39145U, 35168U, 48123U, 43634U, 25350U, 29327U, 16404U, 20893U, 9506U, 13483U, 1584U, 6073U, 61262U, 65223U, 52316U, 56789U, 43370U, 47331U, 35448U, 39921U, 29575U, 25102U, 20629U, 16668U, 13731U, 9258U, 5809U, 1848U, 65487U, 60998U, 56541U, 52564U, 47595U, 43106U, 39673U, 35696U, 33800U, 38273U, 42778U, 46739U, 49708U, 54181U, 57662U, 61623U, 2112U, 6601U, 11090U, 15067U, 20068U, 24557U, 28022U, 31999U, 38025U, 34048U, 47003U, 42514U, 53933U, 49956U, 61887U, 57398U, 6337U, 2376U, 15315U, 10842U, 24293U, 20332U, 32247U, 27774U, 42250U, 46211U, 34328U, 38801U, 58158U, 62119U, 49212U, 53685U, 10562U, 14539U, 2640U, 7129U, 28518U, 32495U, 19572U, 24061U, 46475U, 41986U, 38553U, 34576U, 62383U, 57894U, 53437U, 49460U, 14787U, 10314U, 6865U, 2904U, 32743U, 28270U, 23797U, 19836U, 50700U, 55173U, 58654U, 62615U, 32808U, 37281U, 41786U, 45747U, 19012U, 23501U, 26966U, 30943U, 3168U, 7657U, 12146U, 16123U, 54925U, 50948U, 62879U, 58390U, 37033U, 33056U, 46011U, 41522U, 23237U, 19276U, 31191U, 26718U, 7393U, 3432U, 16371U, 11898U, 59150U, 63111U, 50204U, 54677U, 41258U, 45219U, 33336U, 37809U, 27462U, 31439U, 18516U, 23005U, 11618U, 15595U, 3696U, 8185U, 63375U, 58886U, 54429U, 50452U, 45483U, 40994U, 37561U, 33584U, 31687U, 27214U, 22741U, 18780U, 15843U, 11370U, 7921U, 3960U } ; short unsigned int dspAX25CRC(char *Data, int Len) { int i, idx; short unsigned int CRC; for (CRC = 0xFFFF, i = 0; i < Len; i++) { idx = (unsigned char)CRC^(unsigned char)Data[i]; CRC = (CRC>>8)^dspAX25CRCtable[idx]; } CRC ^= 0xFFFF; return CRC; } // ---------------------------------------------------------------------------- // radix-2 FFT // constructor dsp_r2FFT::dsp_r2FFT() { BitRevIdx = NULL; Twiddle = NULL; /* Window=NULL; */ } // destructor: free twiddles, bit-reverse lookup and window tables dsp_r2FFT::~dsp_r2FFT() { free(BitRevIdx); free(Twiddle); /* free(Window); */ } void dsp_r2FFT::Free(void) { free(BitRevIdx); BitRevIdx = NULL; free(Twiddle); Twiddle = NULL; } // .......................................................................... // a radix-2 FFT bufferfly inline void dsp_r2FFT::FFTbf(dspCmpx &x0, dspCmpx &x1, dspCmpx &W) { dspCmpx x1W; x1W.re = x1.re*W.re + x1.im*W.im; // x1W.re=x1.re*W.re-x1.im*W.im; x1W.im = (-x1.re*W.im) + x1.im*W.re; // x1W.im=x1.re*W.im+x1.im*W.re; x1.re = x0.re - x1W.re; x1.im = x0.im - x1W.im; x0.re = x0.re + x1W.re; x0.im = x0.im + x1W.im; } // 2-point FFT inline void dsp_r2FFT::FFT2(dspCmpx &x0, dspCmpx &x1) { dspCmpx x1W; x1W.re = x1.re; x1W.im = x1.im; x1.re = x0.re - x1.re; x1.im = x0.im - x1.im; x0.re += x1W.re; x0.im += x1W.im; } // 4-point FFT // beware: these depend on the convention for the twiddle factors ! inline void dsp_r2FFT::FFT4(dspCmpx &x0, dspCmpx &x1, dspCmpx &x2, dspCmpx &x3) { dspCmpx x1W; x1W.re = x2.re; x1W.im = x2.im; x2.re = x0.re - x1W.re; x2.im = x0.im - x1W.im; x0.re = x0.re + x1W.re; x0.im = x0.im + x1W.im; x1W.re = x3.im; x1W.im = (-x3.re); x3.re = x1.re - x1W.re; x3.im = x1.im - x1W.im; x1.re = x1.re + x1W.re; x1.im = x1.im + x1W.im; } // .......................................................................... // bit reverse (in place) the dspSequence (before the actuall FFT) void dsp_r2FFT::Scramble(dspCmpx x[]) { int idx, ridx; dspCmpx tmp; for (idx = 0; idx < Size; idx++) if ((ridx = BitRevIdx[idx]) > idx) { tmp = x[idx]; x[idx] = x[ridx]; x[ridx] = tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } // Preset for given processing size int dsp_r2FFT::Preset(int size) { int err, idx, ridx, mask, rmask; double dspPhase; if (!dspPowerOf2(size)) goto Error; Size = size; err = dspRedspAllocArray(&BitRevIdx, Size); if (err) goto Error; err = dspRedspAllocArray(&Twiddle, Size); if (err) goto Error; //printf("size, %d\n\n", size); //printf("idx,dspPhase,Twiddle.re,Twiddle.im\n"); for (idx = 0; idx < Size; idx++) { dspPhase = (2*M_PI*idx)/Size; Twiddle[idx].re = cos(dspPhase); Twiddle[idx].im = sin(dspPhase); //printf("%2d,%6.4f,%6.4f,%6.4f\n", idx,dspPhase,Twiddle[idx].re,Twiddle[idx].im); } //printf("\n\nidx,BitRevIdx\n"); for (ridx = 0, idx = 0; idx < Size; idx++) { for (ridx = 0, mask = Size/2, rmask = 1; mask; mask >>= 1, rmask <<= 1) { if (idx & mask) ridx |= rmask; } BitRevIdx[idx] = ridx; //printf("%d,%d\n",idx,ridx); } // free(Window); Window=NULL; WinInpScale=1.0/Size; WinOutScale=0.5; return 0; Error: Free(); return -1; } // .......................................................................... // radix-2 FFT: the first and the second pass are by hand // looks like there is no gain by separating the second pass // and even the first pass is in question ? void dsp_r2FFT::CoreProc(dspCmpx x[]) { int Groups, GroupHalfSize, Group, Bf, TwidIdx; int HalfSize = Size/2; for (Bf = 0; Bf < Size; Bf += 2) FFT2(x[Bf], x[Bf+1]); // first pass // for(Bf=0; Bf>= 1, GroupHalfSize <<= 1) for (Group = 0, Bf = 0; Group < Groups; Group++, Bf += GroupHalfSize) for (TwidIdx = 0; TwidIdx < HalfSize; TwidIdx += Groups, Bf++) { FFTbf(x[Bf], x[Bf + GroupHalfSize], Twiddle[TwidIdx]); /* printf("%2d %2d %2d\n",Bf,Bf+GroupHalfSize,TwidIdx); */ } } // .......................................................................... // separate the result of "two reals at one time" processing void dsp_r2FFT::SeparTwoReals(dspCmpx Buff[], dspCmpx Out0[], dspCmpx Out1[]) { int idx, HalfSize = Size/2; // for(idx=0; idxoutput dspDelay longer. dspSlideWinFFT::dspSlideWinFFT() { SlideBuff = NULL; FFTbuff = NULL; Window = NULL; ExternWindow = 1; } dspSlideWinFFT::~dspSlideWinFFT() { free(SlideBuff); free(FFTbuff); if (!ExternWindow) free(Window); } void dspSlideWinFFT::Free(void) { free(SlideBuff); SlideBuff = NULL; free(FFTbuff); FFTbuff = NULL; if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; Output.Free(); } int dspSlideWinFFT::Preset(int size, int step, double *window) { int err,i; Size = size; SizeMask = Size - 1; err = FFT.Preset(Size); if (err) goto Error; if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; err = dspRedspAllocArray(&FFTbuff, Size); if (err) goto Error; err = dspRedspAllocArray(&SlideBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) SlideBuff[i] = 0.0; SlidePtr = 0; Slide = 0; Dist = step; Left = Dist; return 0; Error: Free(); return -1; } int dspSlideWinFFT::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx, err; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } err = dspRedspAllocArray(&Window, Size); if (err) return -1; for (idx = 0; idx < Size; idx++) Window[idx] = Scale*(*NewWindow)(2*M_PI*(idx - Size/2 + 0.5)/Size); return 0; } int dspSlideWinFFT::Preset( int size, int step, double (*NewWindow)(double dspPhase), double Scale) { int err; err = Preset(size, step, (double *)NULL); if (err) return -1; err = SetWindow(NewWindow, Scale); if (err) { Free(); return -1; } return 0; } int dspSlideWinFFT::SetWindow(double *window) { if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; return 0; } int dspSlideWinFFT::Process(double_buff *Input) { int err, len, i, t; int InpLen; double *Inp; Inp = Input->Data; InpLen = Input->Len; Output.Len = 0; while (InpLen) { for (i = len = dspIntmin(InpLen, Left); i; i--) { SlideBuff[SlidePtr++] = (*Inp++); SlidePtr &= SizeMask; } InpLen -= len; Left -= len; if(Left==0) { Slide ^= 1; Left = Dist; if (Slide) { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++, i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; } else { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); len = Output.Len; err = Output.EnsureSpace(len + Size); if (err) return -1; FFT.SeparTwoReals(FFTbuff, Output.Data + len, Output.Data + len + Size/2); Output.Len += Size; } } } return 0; } // ---------------------------------------------------------------------------- // Overlapping IFFT to convert sliced spectra into time-domain output // ---------------------------------------------------------------------------- // Sliding window FFT for spectral processing // input: real-valued signal // in the middle you are given a chance to process // the complex-valued Fourier Transform (SpectraProc() routine). // output: real-valued signal // If you don't touch the spectra in SpectralProc() // the output will be an exact copy (only dspDelayed) of the input. dspSlideWinFFTproc::dspSlideWinFFTproc() { SlideBuff = NULL; OvlapBuff = NULL; FFTbuff = NULL; Spectr[0] = NULL; Spectr[1] = NULL; Window = NULL; ExternWindow = 1; } dspSlideWinFFTproc::~dspSlideWinFFTproc() { free(SlideBuff); free(OvlapBuff); free(FFTbuff); free(Spectr[0]); free(Spectr[1]); if (!ExternWindow) free(Window); } void dspSlideWinFFTproc::Free(void) { int i; free(SlideBuff); SlideBuff=NULL; free(OvlapBuff); OvlapBuff=NULL; free(FFTbuff); FFTbuff = NULL; for (i = 0; i < 2; i++) { free(Spectr[0]); Spectr[0] = NULL; } if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; Output.Free(); } int dspSlideWinFFTproc::Preset( int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double *window) { int err, i; Size = size; SizeMask = Size - 1; err = FFT.Preset(Size); if (err) goto Error; if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; dspRedspAllocArray(&FFTbuff, Size); if (err) goto Error; for (i = 0; i < 2; i++) { err = dspRedspAllocArray(&Spectr[i], Size/2); if (err) goto Error; } err = dspRedspAllocArray(&SlideBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) SlideBuff[i] = 0.0; SlidePtr = 0; Slide = 0; Dist = step; Left = Dist; err = dspRedspAllocArray(&OvlapBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) OvlapBuff[i] = 0.0; OvlapPtr = 0; SpectraProc = proc; return 0; Error: Free(); return -1; } int dspSlideWinFFTproc::Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double (*NewWindow)(double dspPhase), double Scale) { int err; err = Preset(size, step, proc, (double *)NULL); if (err) return -1; err = SetWindow(NewWindow, Scale); if (err) { Free(); return -1; } return 0; } int dspSlideWinFFTproc::SetWindow(double *window) { if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; return 0; } int dspSlideWinFFTproc::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx, err; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } err = dspRedspAllocArray(&Window, Size); if (err) return -1; if (Scale == 0.0) Scale = sqrt(0.5/Size); for (idx = 0; idx < Size; idx++) Window[idx] = Scale*(*NewWindow)(2*M_PI*(idx - Size/2 + 0.5)/Size); return 0; } int dspSlideWinFFTproc::Process(double_buff *Input) { int err, len, i, t; int InpLen; double *Inp, *Out; Inp = Input->Data; InpLen = Input->Len; Output.Len = 0; while (InpLen) { for (i = len = dspIntmin(InpLen, Left); i; i--) { SlideBuff[SlidePtr++] = (*Inp++); SlidePtr &= SizeMask; } InpLen -= len; Left -= len; if (Left == 0) { Slide ^= 1; Left = Dist; if (Slide) { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; } else { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); FFT.SeparTwoReals(FFTbuff, Spectr[0], Spectr[1]); for (i = 0; i < 2; i++) (*SpectraProc)(Spectr[i], Size); FFT.JoinTwoReals(Spectr[0], Spectr[1], FFTbuff); FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); err = Output.EnsureSpace(Output.Len + 2*Dist); if (err) return -1; Out = Output.Data + Output.Len; for (t = 0, i = OvlapPtr; i < Size; t++,i++) OvlapBuff[i] += Window[t]*FFTbuff[t].re; for (i = 0; t < Size; t++, i++) OvlapBuff[i] += Window[t]*FFTbuff[t].re; for (i = 0; i < Dist; i++) { (*Out++) = OvlapBuff[OvlapPtr]; OvlapBuff[OvlapPtr++] = 0.0; OvlapPtr &= SizeMask; } for (t = 0, i = OvlapPtr; i < Size; t++,i++) OvlapBuff[i] -= Window[t]*FFTbuff[t].im; for (i = 0; t < Size; t++,i++) OvlapBuff[i] -= Window[t]*FFTbuff[t].im; for (i = 0; i < Dist; i++) { (*Out++) = OvlapBuff[OvlapPtr]; OvlapBuff[OvlapPtr++] = 0.0; OvlapPtr &= SizeMask; } Output.Len += 2*Dist; } } } return 0; } // ---------------------------------------------------------------------------- // Walsh (Hadamard ?) transform. void dspWalshTrans(double *Data, int Len) // Len must be 2^N { int step, ptr, ptr2; double bit1, bit2; for (step = 1; step < Len; step *= 2) { for (ptr = 0; ptr < Len; ptr += 2*step) { for (ptr2 = ptr; (ptr2 - ptr) < step; ptr2 += 1) { bit1 = Data[ptr2]; bit2 = Data[ptr2 + step]; // Data[ptr2]=(bit1+bit2); Data[ptr2+step]=(bit1-bit2); Data[ptr2] = (bit1 + bit2); Data[ptr2 + step] = (bit2 - bit1); } } } } void dspWalshInvTrans(double *Data, int Len) // Len must be 2^N { int step, ptr, ptr2; double bit1, bit2; for (step = Len/2; step; step /= 2) { for (ptr = 0; ptr < Len; ptr += 2*step) { for (ptr2 = ptr; (ptr2 - ptr) < step; ptr2 += 1) { bit1 = Data[ptr2]; bit2 = Data[ptr2 + step]; // Data[ptr2]=(bit1+bit2); Data[ptr2+step]=(bit1-bit2); Data[ptr2] = (bit1 - bit2); Data[ptr2 + step] = (bit1 + bit2); } } } } // ---------------------------------------------------------------------------- fldigi-4.1.06/src/mt63/alias_2k.dat0000644000175000017500000001042413472115775013535 00000000000000/* * alias_2k.dat -- Anti-alias filter 2000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=2500.0 // PassBandLow=375.0 PassBandUpp=2625.0 StopBandLow=0.0 StopBandUpp=3000.0 // => PeakInStopBand=-89.35 dB // Programmers's scale factor: 1.000000 // Programmers's comments: Anti-alias filter 2000 Hz bandwidth, decimation by 2 const int Alias_2k_Len=64; double Alias_2k_I[Alias_2k_Len] = { +0.00007244 , // 0 +0.00002831 , // 1 -0.00031179 , // 2 -0.00027704 , // 3 +0.00026218 , // 4 -0.00057780 , // 5 -0.00083336 , // 6 +0.00119188 , // 7 +0.00014945 , // 8 -0.00077327 , // 9 +0.00360739 , // 10 +0.00224833 , // 11 -0.00032116 , // 12 +0.00696821 , // 13 +0.00439713 , // 14 -0.00157675 , // 15 +0.00906983 , // 16 +0.00372045 , // 17 -0.00786599 , // 18 +0.00735339 , // 19 -0.00253048 , // 20 -0.02189728 , // 21 +0.00134354 , // 22 -0.01477966 , // 23 -0.04434362 , // 24 -0.00479913 , // 25 -0.03000591 , // 26 -0.07609801 , // 27 +0.00258946 , // 28 -0.04271980 , // 29 -0.14710769 , // 30 +0.14198817 , // 31 +0.42372962 , // 32 +0.14198817 , // 33 -0.14710769 , // 34 -0.04271980 , // 35 +0.00258946 , // 36 -0.07609801 , // 37 -0.03000591 , // 38 -0.00479913 , // 39 -0.04434362 , // 40 -0.01477966 , // 41 +0.00134354 , // 42 -0.02189728 , // 43 -0.00253048 , // 44 +0.00735339 , // 45 -0.00786599 , // 46 +0.00372045 , // 47 +0.00906983 , // 48 -0.00157675 , // 49 +0.00439713 , // 50 +0.00696821 , // 51 -0.00032116 , // 52 +0.00224833 , // 53 +0.00360739 , // 54 -0.00077327 , // 55 +0.00014945 , // 56 +0.00119188 , // 57 -0.00083336 , // 58 -0.00057780 , // 59 +0.00026218 , // 60 -0.00027704 , // 61 -0.00031179 , // 62 +0.00002831 // 63 } ; double Alias_2k_Q[Alias_2k_Len] = { -0.00000000 , // 0 -0.00015159 , // 1 -0.00014608 , // 2 +0.00036770 , // 3 +0.00010339 , // 4 -0.00031581 , // 5 +0.00128580 , // 6 +0.00120582 , // 7 -0.00051862 , // 8 +0.00225671 , // 9 +0.00226918 , // 10 -0.00216340 , // 11 +0.00181728 , // 12 +0.00176390 , // 13 -0.00692361 , // 14 -0.00105199 , // 15 -0.00081355 , // 16 -0.01498960 , // 17 -0.00512332 , // 18 -0.00331671 , // 19 -0.02395357 , // 20 -0.00602102 , // 21 -0.00049919 , // 22 -0.02943663 , // 23 +0.00351421 , // 24 +0.01576926 , // 25 -0.02737092 , // 26 +0.03572558 , // 27 +0.06272088 , // 28 -0.01659059 , // 29 +0.15254255 , // 30 +0.33394426 , // 31 -0.00000000 , // 32 -0.33394426 , // 33 -0.15254255 , // 34 +0.01659059 , // 35 -0.06272088 , // 36 -0.03572558 , // 37 +0.02737092 , // 38 -0.01576926 , // 39 -0.00351421 , // 40 +0.02943663 , // 41 +0.00049919 , // 42 +0.00602102 , // 43 +0.02395357 , // 44 +0.00331671 , // 45 +0.00512332 , // 46 +0.01498960 , // 47 +0.00081355 , // 48 +0.00105199 , // 49 +0.00692361 , // 50 -0.00176390 , // 51 -0.00181728 , // 52 +0.00216340 , // 53 -0.00226918 , // 54 -0.00225671 , // 55 +0.00051862 , // 56 -0.00120582 , // 57 -0.00128580 , // 58 +0.00031581 , // 59 -0.00010339 , // 60 -0.00036770 , // 61 +0.00014608 , // 62 +0.00015159 // 63 } ; fldigi-4.1.06/src/mt63/mt63intl.dat0000644000175000017500000000246413472115775013535 00000000000000/* * mt63intl.dat -- interleave patterns * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // interleave pattern for the original MT63ASC (short interleave) int ShortIntlvPatt[64] = { 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7 } ; // interleave pattern for doubled interleave int LongIntlvPatt[64] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0 } ; fldigi-4.1.06/src/mt63/alias_1k.dat0000644000175000017500000001042413472115775013534 00000000000000/* * alias_1k.dat -- Anti-alias filter 1000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1500.0 // PassBandLow=375.0 PassBandUpp=1625.0 StopBandLow=0.0 StopBandUpp=2000.0 // => PeakInStopBand=-90.99 dB // Programmers's scale factor: 2.000000 // Programmers's comments: Anti-alias filter 1000 Hz bandwidth, decimation by 4 const int Alias_1k_Len=64; double Alias_1k_I[Alias_1k_Len] = { +0.00003605 , // 0 +0.00001835 , // 1 -0.00022227 , // 2 -0.00079785 , // 3 -0.00099442 , // 4 +0.00032296 , // 5 +0.00276603 , // 6 +0.00365685 , // 7 +0.00128973 , // 8 -0.00107943 , // 9 +0.00195568 , // 10 +0.00914871 , // 11 +0.01100689 , // 12 +0.00254789 , // 13 -0.00580382 , // 14 -0.00014844 , // 15 +0.01341757 , // 16 +0.01123057 , // 17 -0.01328109 , // 18 -0.03176715 , // 19 -0.01791993 , // 20 +0.00579429 , // 21 -0.00986091 , // 22 -0.06425601 , // 23 -0.08967807 , // 24 -0.04429128 , // 25 +0.00513920 , // 26 -0.04459511 , // 27 -0.16886923 , // 28 -0.19065374 , // 29 +0.01930718 , // 30 +0.34486939 , // 31 +0.50345887 , // 32 +0.34486939 , // 33 +0.01930718 , // 34 -0.19065374 , // 35 -0.16886923 , // 36 -0.04459511 , // 37 +0.00513920 , // 38 -0.04429128 , // 39 -0.08967807 , // 40 -0.06425601 , // 41 -0.00986091 , // 42 +0.00579429 , // 43 -0.01791993 , // 44 -0.03176715 , // 45 -0.01328109 , // 46 +0.01123057 , // 47 +0.01341757 , // 48 -0.00014844 , // 49 -0.00580382 , // 50 +0.00254789 , // 51 +0.01100689 , // 52 +0.00914871 , // 53 +0.00195568 , // 54 -0.00107943 , // 55 +0.00128973 , // 56 +0.00365685 , // 57 +0.00276603 , // 58 +0.00032296 , // 59 -0.00099442 , // 60 -0.00079785 , // 61 -0.00022227 , // 62 +0.00001835 // 63 } ; double Alias_1k_Q[Alias_1k_Len] = { -0.00000000 , // 0 -0.00009527 , // 1 -0.00023082 , // 2 +0.00005162 , // 3 +0.00123007 , // 4 +0.00255193 , // 5 +0.00207549 , // 6 -0.00064302 , // 7 -0.00244045 , // 8 +0.00005205 , // 9 +0.00410793 , // 10 +0.00211830 , // 11 -0.00729235 , // 12 -0.01359800 , // 13 -0.00757272 , // 14 +0.00172023 , // 15 -0.00460378 , // 16 -0.02559228 , // 17 -0.03408530 , // 18 -0.01416468 , // 19 +0.00731461 , // 20 -0.00712536 , // 21 -0.04328548 , // 22 -0.04099291 , // 23 +0.01821691 , // 24 +0.06428190 , // 25 +0.02790538 , // 26 -0.03602086 , // 27 +0.01583703 , // 28 +0.22015579 , // 29 +0.40003327 , // 30 +0.32856209 , // 31 -0.00000000 , // 32 -0.32856209 , // 33 -0.40003327 , // 34 -0.22015579 , // 35 -0.01583703 , // 36 +0.03602086 , // 37 -0.02790538 , // 38 -0.06428190 , // 39 -0.01821691 , // 40 +0.04099291 , // 41 +0.04328548 , // 42 +0.00712536 , // 43 -0.00731461 , // 44 +0.01416468 , // 45 +0.03408530 , // 46 +0.02559228 , // 47 +0.00460378 , // 48 -0.00172023 , // 49 +0.00757272 , // 50 +0.01359800 , // 51 +0.00729235 , // 52 -0.00211830 , // 53 -0.00410793 , // 54 -0.00005205 , // 55 +0.00244045 , // 56 +0.00064302 , // 57 -0.00207549 , // 58 -0.00255193 , // 59 -0.00123007 , // 60 -0.00005162 , // 61 +0.00023082 , // 62 +0.00009527 // 63 } ; fldigi-4.1.06/src/mt63/symbol.dat0000644000175000017500000003431313472115775013360 00000000000000/* * symbol.dat -- Symbol shape for the MT63 modem, taken directly * from the MT63ASC code for the EVM56K. * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ const int SymbolLen=512; // the shape's length const int SymbolSepar=200; // the distance in samples between symbols on a carrier const int DataCarrSepar=4; // carriers must be spaced by 4 FFT bins // (complex FFT length equals to SymbolLen) double SymbolShape[SymbolLen] = { -0.00000000 , // 0 +0.00000665 , // 1 +0.00002657 , // 2 +0.00005975 , // 3 +0.00010613 , // 4 +0.00016562 , // 5 +0.00023810 , // 6 +0.00032341 , // 7 +0.00042134 , // 8 +0.00053162 , // 9 +0.00065389 , // 10 +0.00078773 , // 11 +0.00093261 , // 12 +0.00108789 , // 13 +0.00125283 , // 14 +0.00142653 , // 15 +0.00160798 , // 16 +0.00179599 , // 17 +0.00198926 , // 18 +0.00218628 , // 19 +0.00238542 , // 20 +0.00258487 , // 21 +0.00278264 , // 22 +0.00297662 , // 23 +0.00316452 , // 24 +0.00334394 , // 25 +0.00351232 , // 26 +0.00366701 , // 27 +0.00380526 , // 28 +0.00392424 , // 29 +0.00402109 , // 30 +0.00409288 , // 31 +0.00413671 , // 32 +0.00414969 , // 33 +0.00412898 , // 34 +0.00407182 , // 35 +0.00397555 , // 36 +0.00383764 , // 37 +0.00365574 , // 38 +0.00342767 , // 39 +0.00315145 , // 40 +0.00282534 , // 41 +0.00244787 , // 42 +0.00201781 , // 43 +0.00153424 , // 44 +0.00099653 , // 45 +0.00040435 , // 46 -0.00024231 , // 47 -0.00094314 , // 48 -0.00169753 , // 49 -0.00250453 , // 50 -0.00336293 , // 51 -0.00427118 , // 52 -0.00522749 , // 53 -0.00622977 , // 54 -0.00727569 , // 55 -0.00836272 , // 56 -0.00948809 , // 57 -0.01064886 , // 58 -0.01184193 , // 59 -0.01306405 , // 60 -0.01431189 , // 61 -0.01558198 , // 62 -0.01687083 , // 63 -0.01817486 , // 64 -0.01949051 , // 65 -0.02081416 , // 66 -0.02214223 , // 67 -0.02347113 , // 68 -0.02479733 , // 69 -0.02611728 , // 70 -0.02742752 , // 71 -0.02872457 , // 72 -0.03000504 , // 73 -0.03126551 , // 74 -0.03250262 , // 75 -0.03371298 , // 76 -0.03489320 , // 77 -0.03603988 , // 78 -0.03714954 , // 79 -0.03821868 , // 80 -0.03924367 , // 81 -0.04022079 , // 82 -0.04114620 , // 83 -0.04201589 , // 84 -0.04282570 , // 85 -0.04357126 , // 86 -0.04424801 , // 87 -0.04485118 , // 88 -0.04537575 , // 89 -0.04581648 , // 90 -0.04616787 , // 91 -0.04642421 , // 92 -0.04657955 , // 93 -0.04662769 , // 94 -0.04656225 , // 95 -0.04637665 , // 96 -0.04606414 , // 97 -0.04561786 , // 98 -0.04503082 , // 99 -0.04429599 , // 100 -0.04340631 , // 101 -0.04235475 , // 102 -0.04113436 , // 103 -0.03973834 , // 104 -0.03816006 , // 105 -0.03639316 , // 106 -0.03443155 , // 107 -0.03226956 , // 108 -0.02990192 , // 109 -0.02732385 , // 110 -0.02453112 , // 111 -0.02152012 , // 112 -0.01828789 , // 113 -0.01483216 , // 114 -0.01115146 , // 115 -0.00724508 , // 116 -0.00311317 , // 117 +0.00124328 , // 118 +0.00582236 , // 119 +0.01062127 , // 120 +0.01563627 , // 121 +0.02086273 , // 122 +0.02629504 , // 123 +0.03192674 , // 124 +0.03775043 , // 125 +0.04375787 , // 126 +0.04993995 , // 127 +0.05628681 , // 128 +0.06278780 , // 129 +0.06943159 , // 130 +0.07620621 , // 131 +0.08309914 , // 132 +0.09009732 , // 133 +0.09718730 , // 134 +0.10435526 , // 135 +0.11158715 , // 136 +0.11886870 , // 137 +0.12618560 , // 138 +0.13352351 , // 139 +0.14086819 , // 140 +0.14820561 , // 141 +0.15552198 , // 142 +0.16280389 , // 143 +0.17003841 , // 144 +0.17721311 , // 145 +0.18431620 , // 146 +0.19133661 , // 147 +0.19826401 , // 148 +0.20508896 , // 149 +0.21180289 , // 150 +0.21839823 , // 151 +0.22486845 , // 152 +0.23120806 , // 153 +0.23741270 , // 154 +0.24347919 , // 155 +0.24940549 , // 156 +0.25519079 , // 157 +0.26083547 , // 158 +0.26634116 , // 159 +0.27171067 , // 160 +0.27694807 , // 161 +0.28205857 , // 162 +0.28704860 , // 163 +0.29192571 , // 164 +0.29669855 , // 165 +0.30137684 , // 166 +0.30597130 , // 167 +0.31049362 , // 168 +0.31495636 , // 169 +0.31937292 , // 170 +0.32375741 , // 171 +0.32812465 , // 172 +0.33249001 , // 173 +0.33686936 , // 174 +0.34127898 , // 175 +0.34573545 , // 176 +0.35025554 , // 177 +0.35485613 , // 178 +0.35955412 , // 179 +0.36436627 , // 180 +0.36930915 , // 181 +0.37439902 , // 182 +0.37965170 , // 183 +0.38508250 , // 184 +0.39070609 , // 185 +0.39653642 , // 186 +0.40258662 , // 187 +0.40886890 , // 188 +0.41539446 , // 189 +0.42217341 , // 190 +0.42921470 , // 191 +0.43652603 , // 192 +0.44411383 , // 193 +0.45198311 , // 194 +0.46013753 , // 195 +0.46857925 , // 196 +0.47730896 , // 197 +0.48632585 , // 198 +0.49562756 , // 199 +0.50521021 , // 200 +0.51506840 , // 201 +0.52519520 , // 202 +0.53558220 , // 203 +0.54621950 , // 204 +0.55709582 , // 205 +0.56819849 , // 206 +0.57951351 , // 207 +0.59102568 , // 208 +0.60271860 , // 209 +0.61457478 , // 210 +0.62657574 , // 211 +0.63870210 , // 212 +0.65093366 , // 213 +0.66324951 , // 214 +0.67562817 , // 215 +0.68804763 , // 216 +0.70048553 , // 217 +0.71291922 , // 218 +0.72532590 , // 219 +0.73768272 , // 220 +0.74996688 , // 221 +0.76215572 , // 222 +0.77422687 , // 223 +0.78615828 , // 224 +0.79792836 , // 225 +0.80951602 , // 226 +0.82090079 , // 227 +0.83206287 , // 228 +0.84298315 , // 229 +0.85364335 , // 230 +0.86402598 , // 231 +0.87411443 , // 232 +0.88389296 , // 233 +0.89334677 , // 234 +0.90246195 , // 235 +0.91122553 , // 236 +0.91962547 , // 237 +0.92765062 , // 238 +0.93529073 , // 239 +0.94253642 , // 240 +0.94937916 , // 241 +0.95581122 , // 242 +0.96182562 , // 243 +0.96741616 , // 244 +0.97257728 , // 245 +0.97730410 , // 246 +0.98159233 , // 247 +0.98543825 , // 248 +0.98883864 , // 249 +0.99179079 , // 250 +0.99429241 , // 251 +0.99634163 , // 252 +0.99793696 , // 253 +0.99907728 , // 254 +0.99976178 , // 255 +0.99999000 , // 256 +0.99976178 , // 257 +0.99907728 , // 258 +0.99793696 , // 259 +0.99634163 , // 260 +0.99429241 , // 261 +0.99179079 , // 262 +0.98883864 , // 263 +0.98543825 , // 264 +0.98159233 , // 265 +0.97730410 , // 266 +0.97257728 , // 267 +0.96741616 , // 268 +0.96182562 , // 269 +0.95581122 , // 270 +0.94937916 , // 271 +0.94253642 , // 272 +0.93529073 , // 273 +0.92765062 , // 274 +0.91962547 , // 275 +0.91122553 , // 276 +0.90246195 , // 277 +0.89334677 , // 278 +0.88389296 , // 279 +0.87411443 , // 280 +0.86402598 , // 281 +0.85364335 , // 282 +0.84298315 , // 283 +0.83206287 , // 284 +0.82090079 , // 285 +0.80951602 , // 286 +0.79792836 , // 287 +0.78615828 , // 288 +0.77422687 , // 289 +0.76215572 , // 290 +0.74996688 , // 291 +0.73768272 , // 292 +0.72532590 , // 293 +0.71291922 , // 294 +0.70048553 , // 295 +0.68804763 , // 296 +0.67562817 , // 297 +0.66324951 , // 298 +0.65093366 , // 299 +0.63870210 , // 300 +0.62657574 , // 301 +0.61457478 , // 302 +0.60271860 , // 303 +0.59102568 , // 304 +0.57951351 , // 305 +0.56819849 , // 306 +0.55709582 , // 307 +0.54621950 , // 308 +0.53558220 , // 309 +0.52519520 , // 310 +0.51506840 , // 311 +0.50521021 , // 312 +0.49562756 , // 313 +0.48632585 , // 314 +0.47730896 , // 315 +0.46857925 , // 316 +0.46013753 , // 317 +0.45198311 , // 318 +0.44411383 , // 319 +0.43652603 , // 320 +0.42921470 , // 321 +0.42217341 , // 322 +0.41539446 , // 323 +0.40886890 , // 324 +0.40258662 , // 325 +0.39653642 , // 326 +0.39070609 , // 327 +0.38508250 , // 328 +0.37965170 , // 329 +0.37439902 , // 330 +0.36930915 , // 331 +0.36436627 , // 332 +0.35955412 , // 333 +0.35485613 , // 334 +0.35025554 , // 335 +0.34573545 , // 336 +0.34127898 , // 337 +0.33686936 , // 338 +0.33249001 , // 339 +0.32812465 , // 340 +0.32375741 , // 341 +0.31937292 , // 342 +0.31495636 , // 343 +0.31049362 , // 344 +0.30597130 , // 345 +0.30137684 , // 346 +0.29669855 , // 347 +0.29192571 , // 348 +0.28704860 , // 349 +0.28205857 , // 350 +0.27694807 , // 351 +0.27171067 , // 352 +0.26634116 , // 353 +0.26083547 , // 354 +0.25519079 , // 355 +0.24940549 , // 356 +0.24347919 , // 357 +0.23741270 , // 358 +0.23120806 , // 359 +0.22486845 , // 360 +0.21839823 , // 361 +0.21180289 , // 362 +0.20508896 , // 363 +0.19826401 , // 364 +0.19133661 , // 365 +0.18431620 , // 366 +0.17721311 , // 367 +0.17003841 , // 368 +0.16280389 , // 369 +0.15552198 , // 370 +0.14820561 , // 371 +0.14086819 , // 372 +0.13352351 , // 373 +0.12618560 , // 374 +0.11886870 , // 375 +0.11158715 , // 376 +0.10435526 , // 377 +0.09718730 , // 378 +0.09009732 , // 379 +0.08309914 , // 380 +0.07620621 , // 381 +0.06943159 , // 382 +0.06278780 , // 383 +0.05628681 , // 384 +0.04993995 , // 385 +0.04375787 , // 386 +0.03775043 , // 387 +0.03192674 , // 388 +0.02629504 , // 389 +0.02086273 , // 390 +0.01563627 , // 391 +0.01062127 , // 392 +0.00582236 , // 393 +0.00124328 , // 394 -0.00311317 , // 395 -0.00724508 , // 396 -0.01115146 , // 397 -0.01483216 , // 398 -0.01828789 , // 399 -0.02152012 , // 400 -0.02453112 , // 401 -0.02732385 , // 402 -0.02990192 , // 403 -0.03226956 , // 404 -0.03443155 , // 405 -0.03639316 , // 406 -0.03816006 , // 407 -0.03973834 , // 408 -0.04113436 , // 409 -0.04235475 , // 410 -0.04340631 , // 411 -0.04429599 , // 412 -0.04503082 , // 413 -0.04561786 , // 414 -0.04606414 , // 415 -0.04637665 , // 416 -0.04656225 , // 417 -0.04662769 , // 418 -0.04657955 , // 419 -0.04642421 , // 420 -0.04616787 , // 421 -0.04581648 , // 422 -0.04537575 , // 423 -0.04485118 , // 424 -0.04424801 , // 425 -0.04357126 , // 426 -0.04282570 , // 427 -0.04201589 , // 428 -0.04114620 , // 429 -0.04022079 , // 430 -0.03924367 , // 431 -0.03821868 , // 432 -0.03714954 , // 433 -0.03603988 , // 434 -0.03489320 , // 435 -0.03371298 , // 436 -0.03250262 , // 437 -0.03126551 , // 438 -0.03000504 , // 439 -0.02872457 , // 440 -0.02742752 , // 441 -0.02611728 , // 442 -0.02479733 , // 443 -0.02347113 , // 444 -0.02214223 , // 445 -0.02081416 , // 446 -0.01949051 , // 447 -0.01817486 , // 448 -0.01687083 , // 449 -0.01558198 , // 450 -0.01431189 , // 451 -0.01306405 , // 452 -0.01184193 , // 453 -0.01064886 , // 454 -0.00948809 , // 455 -0.00836272 , // 456 -0.00727569 , // 457 -0.00622977 , // 458 -0.00522749 , // 459 -0.00427118 , // 460 -0.00336293 , // 461 -0.00250453 , // 462 -0.00169753 , // 463 -0.00094314 , // 464 -0.00024231 , // 465 +0.00040435 , // 466 +0.00099653 , // 467 +0.00153424 , // 468 +0.00201781 , // 469 +0.00244787 , // 470 +0.00282534 , // 471 +0.00315145 , // 472 +0.00342767 , // 473 +0.00365574 , // 474 +0.00383764 , // 475 +0.00397555 , // 476 +0.00407182 , // 477 +0.00412898 , // 478 +0.00414969 , // 479 +0.00413671 , // 480 +0.00409288 , // 481 +0.00402109 , // 482 +0.00392424 , // 483 +0.00380526 , // 484 +0.00366701 , // 485 +0.00351232 , // 486 +0.00334394 , // 487 +0.00316452 , // 488 +0.00297662 , // 489 +0.00278264 , // 490 +0.00258487 , // 491 +0.00238542 , // 492 +0.00218628 , // 493 +0.00198926 , // 494 +0.00179599 , // 495 +0.00160798 , // 496 +0.00142653 , // 497 +0.00125283 , // 498 +0.00108789 , // 499 +0.00093261 , // 500 +0.00078773 , // 501 +0.00065389 , // 502 +0.00053162 , // 503 +0.00042134 , // 504 +0.00032341 , // 505 +0.00023810 , // 506 +0.00016562 , // 507 +0.00010613 , // 508 +0.00005975 , // 509 +0.00002657 , // 510 +0.00000665 // 511 } ; fldigi-4.1.06/src/mt63/mt63.cxx0000644000175000017500000002216513472115775012700 00000000000000// ---------------------------------------------------------------------------- // mt63.cxx -- MT63 modem for fldigi // // Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC // Copyright (c) 2007-2011 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "configuration.h" #include "fl_digi.h" #include "status.h" #include "mt63.h" //------------------------------------------------------------------------------ #include "threads.h" static pthread_mutex_t mt63_mutex = PTHREAD_MUTEX_INITIALIZER; //------------------------------------------------------------------------------ using namespace std; bool startflag = true; void mt63::tx_init() { guard_lock dsp_lock(&mt63_mutex); Tx->Preset(get_txfreq_woffset(), (int)bandwidth, Interleave == 64 ? 1 : 0); flush = Tx->DataInterleave; videoText(); startflag = true; } void mt63::rx_init() { guard_lock dsp_lock(&mt63_mutex); Rx->Preset( frequency, (int)bandwidth, Interleave == 64 ? 1 : 0, long_integral ? 32 : 16 ); InpLevel->Preset(64.0, 0.75); escape = 0; } int mt63::tx_process() { rx_flush(); // do not put above rx_flush() modem::tx_process(); guard_lock dsp_lock(&mt63_mutex); int c; if (startflag == true) { startflag = false; maxval = 0.0; if (progdefaults.mt63_usetones) { double w1 = 2.0 * M_PI * (get_txfreq_woffset() - bandwidth / 2.0) / samplerate; double w2 = 2.0 * M_PI * (get_txfreq_woffset() + 31.0 * bandwidth / 64.0) / samplerate; double phi1 = 0.0; double phi2 = 0.0; double buff[512]; int numsmpls = samplerate * progdefaults.mt63_tone_duration / 512; for (int i = 0; i < numsmpls; i++) { for (int j = 0; j < 512; j++) { buff[j] = TONE_AMP * (progdefaults.mt63_twotones ? 0.5 : 1.0) * cos(phi1) + TONE_AMP * (progdefaults.mt63_twotones ? 0.5 : 0.0) * cos(phi2); phi1 += w1; phi2 += w2; if (i == 0) buff[j] *= (1.0 - exp(-1.0 * j / 40.0)); if (i == progdefaults.mt63_tone_duration - 1) buff[j] *= (1.0 - exp(-1.0 * (samplerate - j) / 40.0)); } Fl::awake(); ModulateXmtr(buff, 512); } } for (int i = 0; i < Tx->DataInterleave; i++) { Tx->SendChar(0); Fl::awake(); } } c = get_tx_char(); if (c == GET_TX_CHAR_ETX) { stopflag = true; flush = Tx->DataInterleave; } if (c == GET_TX_CHAR_NODATA || stopflag == true) c = 0; if (stopflag) { stopflag = false; while (--flush) { Tx->SendChar(0); double buff[Tx->Comb.Output.Len]; for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) buff[i] = Tx->Comb.Output.Data[i] /= maxval; ModulateXmtr(buff,Tx->Comb.Output.Len); } Tx->SendJam(); maxval = 0.0; double buff[Tx->Comb.Output.Len]; for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) buff[i] = Tx->Comb.Output.Data[i] * 1.0 / maxval; ModulateXmtr(buff,Tx->Comb.Output.Len); cwid(); return -1; /* we're done */ } if (c > 255 || (!progdefaults.mt63_8bit && c > 127)) c = '.'; int sendc = c; if (sendc > 127) { sendc &= 127; Tx->SendChar(127); double buff[Tx->Comb.Output.Len]; for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) buff[i] = Tx->Comb.Output.Data[i] * 1.0 / maxval; ModulateXmtr(buff,Tx->Comb.Output.Len); } Tx->SendChar(sendc); double buff[Tx->Comb.Output.Len]; int len = Tx->Comb.Output.Len; for (int i = 0; i < len; i++) { buff[i] = Tx->Comb.Output.Data[i]; if (maxval < fabs(buff[i])) maxval = fabs(buff[i]); } for (int i = 0; i < len; i++) { buff[i] *= 1.0 / maxval; } ModulateXmtr(buff,len); put_echo_char(c); return 0; } int mt63::rx_process(const double *buf, int len) { double snr; unsigned int c; int i; static char msg1[20]; static char msg2[20]; double f_offset; if (long_integral != progdefaults.mt63_rx_integration) { long_integral = progdefaults.mt63_rx_integration; restart(); } if (InpBuff->EnsureSpace(len) == -1) { fprintf(stderr, "mt63_rxprocess: buffer error\n"); return -1; } for (i = 0; i < len; i++) InpBuff->Data[i] = buf[i]; { // critical section guard_lock dsp_lock(&mt63_mutex); InpBuff->Len = len; InpLevel->Process(InpBuff); Rx->Process(InpBuff); snr = Rx->FEC_SNR(); if (progStatus.sqlonoff && snr < progStatus.sldrSquelchValue) { put_Status1(""); put_Status2(""); display_metric(0); return 0; } for (i = 0; i < Rx->Output.Len; i++) { c = Rx->Output.Data[i]; if (!progdefaults.mt63_8bit) { put_rx_char(c); continue; } if ((c < 8) && (escape == 0)) continue; if (c == 127) { escape = 1; continue; } if (escape) { c += 128; escape = 0; } put_rx_char(c); } f_offset = Rx->TotalFreqOffset(); } // end critical section if (snr > 99.9) snr = 99.9; display_metric(snr); double s2n = 10.0*log10( snr == 0 ? 0.001 : snr); snprintf(msg1, sizeof(msg1), "s/n %2d dB", (int)(floor(s2n))); put_Status1(msg1); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", f_offset); put_Status2(msg2, 5, STATUS_CLEAR); flushbuffer = true; return 0; } void mt63::rx_flush() { guard_lock dsp_lock(&mt63_mutex); unsigned int c; int len = 512; int dlen = 0; if (!flushbuffer) return; if (emptyBuff->EnsureSpace(len) == -1) { flushbuffer = false; return; } for (int j = 0; j < len; j++) emptyBuff->Data[j] = 0.0; emptyBuff->Len = len; InpLevel->Process(emptyBuff); Rx->Process(emptyBuff); dlen = Rx->Output.Len; while (Rx->SYNC_LockStatus()) { for (int i = 0; i < dlen; i++) { c = Rx->Output.Data[i]; if (!progdefaults.mt63_8bit) { put_rx_char(c); continue; } if ((c < 8) && (escape == 0)) continue; if (c == 127) { escape = 1; continue; } if (escape) { c += 128; escape = 0; } put_rx_char(c); } for (int j = 0; j < len; j++) emptyBuff->Data[j] = 0.0; emptyBuff->Len = len; InpLevel->Process(emptyBuff); Rx->Process(emptyBuff); dlen = Rx->Output.Len; } flushbuffer = false; return; } void mt63::restart() { int err; put_MODEstatus(mode); set_scope_mode(Digiscope::BLANK); { // critical section guard_lock dsp_lock(&mt63_mutex); err = Tx->Preset(get_txfreq_woffset(), (int)bandwidth, Interleave == 64 ? 1 : 0); if (err) fprintf(stderr, "mt63_txinit: init failed\n"); flush = Tx->DataInterleave; err = Rx->Preset( frequency, (int)bandwidth, Interleave == 64 ? 1 : 0, long_integral ? 32 : 16); } // end critical section if (err) fprintf(stderr, "mt63_rxinit: init failed\n"); InpLevel->Preset(64.0, 0.75); stopflag = false; } void mt63::init() { modem::init(); restart(); flushbuffer = false; maxval = 0.0; if (progdefaults.mt63_at500) { frequency = 500 + bandwidth / 2; modem::set_freq(frequency); } else if (progdefaults.mt63_centered) { frequency = 1500; modem::set_freq(frequency); } else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } mt63::mt63 (trx_mode mt63_mode) : modem() { mode = mt63_mode; switch (mode) { case MODE_MT63_500S: Interleave = 32; bandwidth = 500; break; case MODE_MT63_500L: Interleave = 64; bandwidth = 500; break; case MODE_MT63_1000S: Interleave = 32; bandwidth = 1000; break; case MODE_MT63_1000L: Interleave = 64; bandwidth = 1000; break; case MODE_MT63_2000S: Interleave = 32; bandwidth = 2000; break; case MODE_MT63_2000L: Interleave = 64; bandwidth = 2000; break; } long_integral = progdefaults.mt63_rx_integration; Tx = new MT63tx; Rx = new MT63rx; InpLevel = new dspLevelMonitor; InpBuff = new double_buff; emptyBuff = new double_buff; samplerate = 8000; fragmentsize = 1024; } mt63::~mt63() { guard_lock dsp_lock(&mt63_mutex); if (Tx) delete Tx; if (Rx) delete Rx; if (InpLevel) delete InpLevel; if (InpBuff) delete InpBuff; } // W1HKJ // user can select manual or fixed positioning of the MT63 encoder/decoder // progdefaults.mt63_at500 TRUE ==> fixed position void mt63::set_freq(double f) { if (progdefaults.mt63_at500) frequency = 500 + bandwidth / 2; else if (progdefaults.mt63_centered) frequency = 1500; else frequency = f; modem::set_freq(frequency); rx_init(); } fldigi-4.1.06/src/mt63/alias_k5.dat0000644000175000017500000001642613472115775013550 00000000000000/* * alias_k5.dat -- Anti-alias filter 500 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=128 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1000.0 // PassBandLow=437.5 PassBandUpp=1062.5 StopBandLow=250.0 StopBandUpp=1250.0 // => PeakInStopBand=-86.20 dB // Programmers's scale factor: 4.000000 // Programmers's comments: Anti-alias filter 500 Hz bandwidth, decimation by 8 const int Alias_k5_Len=128; double Alias_k5_I[Alias_k5_Len] = { +0.00006549 , // 0 +0.00007616 , // 1 +0.00006321 , // 2 -0.00007051 , // 3 -0.00037947 , // 4 -0.00077842 , // 5 -0.00101934 , // 6 -0.00079747 , // 7 +0.00003634 , // 8 +0.00128166 , // 9 +0.00238256 , // 10 +0.00269672 , // 11 +0.00193090 , // 12 +0.00045168 , // 13 -0.00082397 , // 14 -0.00100872 , // 15 +0.00002675 , // 16 +0.00132515 , // 17 +0.00130571 , // 18 -0.00111559 , // 19 -0.00545495 , // 20 -0.00950601 , // 21 -0.01047729 , // 22 -0.00687776 , // 23 +0.00011406 , // 24 +0.00696202 , // 25 +0.00989474 , // 26 +0.00760013 , // 27 +0.00255231 , // 28 -0.00031461 , // 29 +0.00291281 , // 30 +0.01174794 , // 31 +0.02064676 , // 32 +0.02211535 , // 33 +0.01194783 , // 34 -0.00696440 , // 35 -0.02537662 , // 36 -0.03322892 , // 37 -0.02665276 , // 38 -0.01145836 , // 39 +0.00006418 , // 40 -0.00230763 , // 41 -0.01840573 , // 42 -0.03588720 , // 43 -0.03743444 , // 44 -0.01306806 , // 45 +0.03074821 , // 46 +0.07251687 , // 47 +0.08836159 , // 48 +0.06850261 , // 49 +0.02612053 , // 50 -0.00913110 , // 51 -0.01081820 , // 52 +0.02342696 , // 53 +0.06482083 , // 54 +0.06779523 , // 55 -0.00021458 , // 56 -0.13123843 , // 57 -0.27054300 , // 58 -0.33962227 , // 59 -0.27857291 , // 60 -0.08448838 , // 61 +0.17772565 , // 62 +0.40136534 , // 63 +0.48897105 , // 64 +0.40136534 , // 65 +0.17772565 , // 66 -0.08448838 , // 67 -0.27857291 , // 68 -0.33962227 , // 69 -0.27054300 , // 70 -0.13123843 , // 71 -0.00021458 , // 72 +0.06779523 , // 73 +0.06482083 , // 74 +0.02342696 , // 75 -0.01081820 , // 76 -0.00913110 , // 77 +0.02612053 , // 78 +0.06850261 , // 79 +0.08836159 , // 80 +0.07251687 , // 81 +0.03074821 , // 82 -0.01306806 , // 83 -0.03743444 , // 84 -0.03588720 , // 85 -0.01840573 , // 86 -0.00230763 , // 87 +0.00006418 , // 88 -0.01145836 , // 89 -0.02665276 , // 90 -0.03322892 , // 91 -0.02537662 , // 92 -0.00696440 , // 93 +0.01194783 , // 94 +0.02211535 , // 95 +0.02064676 , // 96 +0.01174794 , // 97 +0.00291281 , // 98 -0.00031461 , // 99 +0.00255231 , // 100 +0.00760013 , // 101 +0.00989474 , // 102 +0.00696202 , // 103 +0.00011406 , // 104 -0.00687776 , // 105 -0.01047729 , // 106 -0.00950601 , // 107 -0.00545495 , // 108 -0.00111559 , // 109 +0.00130571 , // 110 +0.00132515 , // 111 +0.00002675 , // 112 -0.00100872 , // 113 -0.00082397 , // 114 +0.00045168 , // 115 +0.00193090 , // 116 +0.00269672 , // 117 +0.00238256 , // 118 +0.00128166 , // 119 +0.00003634 , // 120 -0.00079747 , // 121 -0.00101934 , // 122 -0.00077842 , // 123 -0.00037947 , // 124 -0.00007051 , // 125 +0.00006321 , // 126 +0.00007616 // 127 } ; double Alias_k5_Q[Alias_k5_Len] = { -0.00000000 , // 0 -0.00005367 , // 1 -0.00016555 , // 2 -0.00031225 , // 3 -0.00036198 , // 4 -0.00013710 , // 5 +0.00044740 , // 6 +0.00124698 , // 7 +0.00186810 , // 8 +0.00184150 , // 9 +0.00093521 , // 10 -0.00058853 , // 11 -0.00200435 , // 12 -0.00252488 , // 13 -0.00187551 , // 14 -0.00063367 , // 15 +0.00001967 , // 16 -0.00088264 , // 17 -0.00319853 , // 18 -0.00540709 , // 19 -0.00536877 , // 20 -0.00180828 , // 21 +0.00444555 , // 22 +0.01048985 , // 23 +0.01293826 , // 24 +0.01021951 , // 25 +0.00399079 , // 26 -0.00159281 , // 27 -0.00262530 , // 28 +0.00149295 , // 29 +0.00697645 , // 30 +0.00777564 , // 31 -0.00010048 , // 32 -0.01493909 , // 33 -0.02926626 , // 34 -0.03410235 , // 35 -0.02512027 , // 36 -0.00643493 , // 37 +0.01119978 , // 38 +0.01734888 , // 39 +0.00962767 , // 40 -0.00347093 , // 41 -0.00757142 , // 42 +0.00724618 , // 43 +0.03765704 , // 44 +0.06671856 , // 45 +0.07363882 , // 46 +0.04816692 , // 47 -0.00023240 , // 48 -0.04602175 , // 49 -0.06349448 , // 50 -0.04533960 , // 51 -0.01075524 , // 52 +0.00463299 , // 53 -0.02695458 , // 54 -0.10175325 , // 55 -0.17821917 , // 56 -0.19595859 , // 57 -0.11176981 , // 58 +0.06782857 , // 59 +0.27891973 , // 60 +0.42579279 , // 61 +0.42868878 , // 62 +0.26809297 , // 63 -0.00000000 , // 64 -0.26809297 , // 65 -0.42868878 , // 66 -0.42579279 , // 67 -0.27891973 , // 68 -0.06782857 , // 69 +0.11176981 , // 70 +0.19595859 , // 71 +0.17821917 , // 72 +0.10175325 , // 73 +0.02695458 , // 74 -0.00463299 , // 75 +0.01075524 , // 76 +0.04533960 , // 77 +0.06349448 , // 78 +0.04602175 , // 79 +0.00023240 , // 80 -0.04816692 , // 81 -0.07363882 , // 82 -0.06671856 , // 83 -0.03765704 , // 84 -0.00724618 , // 85 +0.00757142 , // 86 +0.00347093 , // 87 -0.00962767 , // 88 -0.01734888 , // 89 -0.01119978 , // 90 +0.00643493 , // 91 +0.02512027 , // 92 +0.03410235 , // 93 +0.02926626 , // 94 +0.01493909 , // 95 +0.00010048 , // 96 -0.00777564 , // 97 -0.00697645 , // 98 -0.00149295 , // 99 +0.00262530 , // 100 +0.00159281 , // 101 -0.00399079 , // 102 -0.01021951 , // 103 -0.01293826 , // 104 -0.01048985 , // 105 -0.00444555 , // 106 +0.00180828 , // 107 +0.00536877 , // 108 +0.00540709 , // 109 +0.00319853 , // 110 +0.00088264 , // 111 -0.00001967 , // 112 +0.00063367 , // 113 +0.00187551 , // 114 +0.00252488 , // 115 +0.00200435 , // 116 +0.00058853 , // 117 -0.00093521 , // 118 -0.00184150 , // 119 -0.00186810 , // 120 -0.00124698 , // 121 -0.00044740 , // 122 +0.00013710 , // 123 +0.00036198 , // 124 +0.00031225 , // 125 +0.00016555 , // 126 +0.00005367 // 127 } ; fldigi-4.1.06/src/main.cxx0000664000175000017500000020343713512070600012225 00000000000000// ---------------------------------------------------------------------------- // Digital Modem Program for the Fast Light Toolkit // // Copyright 2006-2010, Dave Freese, W1HKJ // Copyright 2007-2010, Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // // Please report all bugs and problems to fldigi-devel@lists.sourceforge.net. // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #ifdef __MINGW32__ # include "compat.h" #endif #include #if HAVE_SYS_UTSNAME_H # include #endif #include #include #include #include #include #include #include #include #include #ifdef __MINGW32__ # define dirent fl_dirent_no_thanks #endif #include #ifdef __WOE32__ # if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 # undef dirent # include # endif #else # include #endif #include "gettext.h" #include "main.h" #include "waterfall.h" #include "trx.h" #include "soundconf.h" #include "fl_digi.h" #include "rigio.h" #include "globals.h" #include "confdialog.h" #include "configuration.h" #include "macros.h" #include "status.h" #include "fileselect.h" #include "timeops.h" #include "debug.h" #include "pskrep.h" #include "notify.h" #include "logbook.h" #include "dxcc.h" #include "newinstall.h" #include "Viewer.h" #include "kmlserver.h" #include "data_io.h" #include "maclogger.h" #include "psm/psm.h" #include "fd_logger.h" #include "n3fjp_logger.h" #include "dx_cluster.h" #include "dx_dialog.h" #include "record_loader.h" #if USE_HAMLIB #include "rigclass.h" #endif #include "rigsupport.h" #include "log.h" #include "qrunner.h" #include "stacktrace.h" #include "xmlrpc.h" #include "icons.h" #include "nullmodem.h" #include "spectrum_viewer.h" #include "contest.h" #include "counties.h" #if BENCHMARK_MODE #include "benchmark.h" #endif using namespace std; string appname; string scDevice[2]; string BaseDir = ""; string HomeDir = ""; string RigsDir = ""; string ScriptsDir = ""; string PalettesDir = ""; string LogsDir = ""; string PicsDir = ""; string AvatarDir = ""; string HelpDir = ""; string MacrosDir = ""; string WrapDir = ""; string TalkDir = ""; string TempDir = ""; string DebugDir = ""; string LoTWDir = ""; string KmlDir = ""; string PskMailDir = ""; string NBEMS_dir = ""; string NBEMS_dir_default = ""; string DATA_dir = ""; string ARQ_dir = ""; string ARQ_files_dir = ""; string ARQ_recv_dir = ""; string ARQ_send = ""; string WRAP_dir = ""; string WRAP_recv_dir = ""; string WRAP_send_dir = ""; string WRAP_auto_dir = ""; string ICS_dir = ""; string ICS_msg_dir = ""; string ICS_tmp_dir = ""; string FLMSG_dir = ""; string FLMSG_dir_default = ""; string FLMSG_WRAP_dir = ""; string FLMSG_WRAP_recv_dir = ""; string FLMSG_WRAP_send_dir = ""; string FLMSG_WRAP_auto_dir = ""; string FLMSG_ICS_dir = ""; string FLMSG_ICS_msg_dir = ""; string FLMSG_ICS_tmp_dir = ""; string PskMailFile; string ArqFilename; string xmlfname; PTT *push2talk = (PTT *)0; #if USE_HAMLIB Rig *xcvr = (Rig *)0; #endif bool tlfio = false; cLogfile *logfile = 0; cLogfile *Maillogfile = (cLogfile *)0; FILE *server; FILE *client; bool mailserver = false, mailclient = false, arqmode = false; static bool show_cpucheck = false; static bool iconified = false; bool bMOREINFO = false; string option_help, version_text, build_text; qrunner *cbq[NUM_QRUNNER_THREADS]; void arqchecks(void); void generate_option_help(void); int parse_args(int argc, char **argv, int& idx); void generate_version_text(void); void debug_exec(char** argv); void set_platform_ui(void); double speed_test(int converter, unsigned repeat); static void setup_signal_handlers(void); static void checkdirectories(void); static void arg_error(const char* name, const char* arg, bool missing); static void fatal_error(string); /* from: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx BOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCTSTR lpCurrentDirectory, _In_ LPSTARTUPINFO lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation ); Parameters lpApplicationName [in, optional] The name of the module to be executed. This module can be a Windows-based application. It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer. The string can specify the full path and file name of the module to execute or it can specify a partial name. In the case of a partial name, the function uses the current drive and current directory to complete the specification. The function will not use the search path. This parameter must include the file name extension; no default extension is assumed. The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string "c:\program files\sub dir\program name". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order: c:\program.exe files\sub dir\program name c:\program files\sub.exe dir\program name c:\program files\sub dir\program.exe name c:\program files\sub dir\program name.exe If the executable module is a 16-bit application, lpApplicationName should be NULL, and the string pointed to by lpCommandLine should specify the executable module as well as its arguments. To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file. lpCommandLine [in, out, optional] The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters. The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation. The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line. If both lpApplicationName and lpCommandLine are non-NULL, the null-terminated string pointed to by lpApplicationName specifies the module to execute, and the n ull-terminated string pointed to by lpCommandLine specifies the command line. The new process can use GetCommandLine to retrieve the entire command line. Console processes written in C can use the argc and argv arguments to parse the command line. Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line. If lpApplicationName is NULL, the first white space–delimited token of the command line specifies the module name. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin (see the explanation for the lpApplicationName parameter). If the file name does not contain an extension, .exe is appended. Therefore, if the file name extension is .com, this parameter must include the .com extension. If the file name ends in a period (.) with no extension, or if the file name contains a path, .exe is not appended. If the file name does not contain a directory path, the system searches for the executable file in the following sequence: The directory from which the application loaded. The current directory for the parent process. The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory. The directories that are listed in the PATH environment variable. Note that this function does not search the per-application path specified by the App Paths registry key. To include this per-application path in the search sequence, use the ShellExecute function. The system adds a terminating null character to the command-line string to separate the file name from the arguments. This divides the original string into two strings for internal processing. lpProcessAttributes [in, optional] A pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle to the new process object can be inherited by child processes. If lpProcessAttributes is NULL, the handle cannot be inherited. The lpSecurityDescriptor member of the structure specifies a security descriptor for the new process. If lpProcessAttributes is NULL or lpSecurityDescriptor is NULL, the process gets a default security descriptor. The ACLs in the default security descriptor for a process come from the primary token of the creator. Windows XP: The ACLs in the default security descriptor for a process come from the primary or impersonation token of the creator. This behavior changed with Windows XP with SP2 and Windows Server 2003. lpThreadAttributes [in, optional] A pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle to the new thread object can be inherited by child processes. If lpThreadAttributes is NULL, the handle cannot be inherited. The lpSecurityDescriptor member of the structure specifies a security descriptor for the main thread. If lpThreadAttributes is NULL or lpSecurityDescriptor is NULL, the thread gets a default security descriptor. The ACLs in the default security descriptor for a thread come from the process token. Windows XP: The ACLs in the default security descriptor for a thread come from the primary or impersonation token of the creator. This behavior changed with Windows XP with SP2 and Windows Server 2003. bInheritHandles [in] If this parameter TRUE, each inheritable handle in the calling process is inherited by the new process. If the parameter is FALSE, the handles are not inherited. Note that inherited handles have the same value and access rights as the original handles. dwCreationFlags [in] The flags that control the priority class and the creation of the process. For a list of values, see Process Creation Flags. This parameter also controls the new process's priority class, which is used to determine the scheduling priorities of the process's threads. For a list of values, see GetPriorityClass. If none of the priority class flags is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS or BELOW_NORMAL_PRIORITY_CLASS. In this case, the child process receives the default priority class of the calling process. lpEnvironment [in, optional] A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process. An environment block consists of a null-terminated block of null-terminated strings. Each string is in the following form: name=value\0 Because the equal sign is used as a separator, it must not be used in the name of an environment variable. An environment block can contain either Unicode or ANSI characters. If the environment block pointed to by lpEnvironment contains Unicode characters, be sure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. If this parameter is NULL and the environment block of the parent process contains Unicode characters, you must also ensure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. The ANSI version of this function, CreateProcessA fails if the total size of the environment block for the process exceeds 32,767 characters. Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for the last string, two more to terminate the block. lpCurrentDirectory [in, optional] The full path to the current directory for the process. The string can also specify a UNC path. If this parameter is NULL, the new process will have the same current drive and directory as the calling process. (This feature is provided primarily for shells that need to start an application and specify its initial drive and working directory.) lpStartupInfo [in] A pointer to a STARTUPINFO or STARTUPINFOEX structure. To set extended attributes, use a STARTUPINFOEX structure and specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlags parameter. Handles in STARTUPINFO or STARTUPINFOEX must be closed with CloseHandle when they are no longer needed. Important The caller is responsible for ensuring that the standard handle fields in STARTUPINFO contain valid handle values. These fields are copied unchanged to the child process without validation, even when the dwFlags member specifies STARTF_USESTDHANDLES. Incorrect values can cause the child process to misbehave or crash. Use the Application Verifier runtime verification tool to detect invalid handles. lpProcessInformation [out] A pointer to a PROCESS_INFORMATION structure that receives identification information about the new process. Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed. Return value If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. Note that the function returns before the process has finished initialization. If a required DLL cannot be located or fails to initialize, the process is terminated. To get the termination status of a process, call GetExitCodeProcess. Remarks The process is assigned a process identifier. The identifier is valid until the process terminates. It can be used to identify the process, or specified in the OpenProcess function to open a handle to the process. The initial thread in the process is also assigned a thread identifier. It can be specified in the OpenThread function to open a handle to the thread. The identifier is valid until the thread terminates and can be used to uniquely identify the thread within the system. These identifiers are returned in the PROCESS_INFORMATION structure. The name of the executable in the command line that the operating system provides to a process is not necessarily identical to that in the command line that the calling process gives to the CreateProcess function. The operating system may prepend a fully qualified path to an executable name that is provided without a fully qualified path. The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process. The preferred way to shut down a process is by using the ExitProcess function, because this function sends notification of approaching termination to all DLLs attached to the process. Other means of shutting down a process do not notify the attached DLLs. Note that when a thread calls ExitProcess, other threads of the process are terminated without an opportunity to execute any additional code (including the thread termination code of attached DLLs). For more information, see Terminating a Process. A parent process can directly alter the environment variables of a child process during process creation. This is the only situation when a process can directly change the environment settings of another process. For more information, see Changing Environment Variables. If an application provides an environment block, the current directory information of the system drives is not automatically propagated to the new process. For example, there is an environment variable named =C: whose value is the current directory on drive C. An application must manually pass the current directory information to the new process. To do so, the application must explicitly create these environment variable strings, sort them alphabetically (because the system uses a sorted environment), and put them into the environment block. Typically, they will go at the front of the environment block, due to the environment block sort order. One way to obtain the current directory information for a drive X is to make the following call: GetFullPathName("X:", ...). That avoids an application having to scan the environment block. If the full path returned is X:\, there is no need to pass that value on as environment data, since the root directory is the default current directory for drive X of a new process. When a process is created with CREATE_NEW_PROCESS_GROUP specified, an implicit call to SetConsoleCtrlHandler(NULL,TRUE) is made on behalf of the new process; this means that the new process has CTRL+C disabled. This lets shells handle CTRL+C themselves, and selectively pass that signal on to sub-processes. CTRL+BREAK is not disabled, and may be used to interrupt the process/process group. Security Remarks The first parameter, lpApplicationName, can be NULL, in which case the executable name must be in the white space–delimited string pointed to by lpCommandLine. If the executable or path name has a space in it, there is a risk that a different executable could be run because of the way the function parses spaces. The following example is dangerous because the function will attempt to run "Program.exe", if it exists, instead of "MyApp.exe". LPTSTR szCmdline = _tcsdup(TEXT("C:\\Program Files\\MyApp -L -S")); CreateProcess(NULL, szCmdline, ... ); If a malicious user were to create an application called "Program.exe" on a system, any program that incorrectly calls CreateProcess using the Program Files directory will run this application instead of the intended application. To avoid this problem, do not pass NULL for lpApplicationName. If you do pass NULL for lpApplicationName, use quotation marks around the executable path in lpCommandLine. */ void start_process(string executable) { while(executable[executable.length()-1] == ' ') executable.erase(executable.length()-1); if (!executable.empty()) { #ifdef __MINGW32__ static string cmdstr; cmdstr.assign(executable); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); LOG_INFO("Starting external process: %s", cmdstr.c_str()); if (!CreateProcess( NULL, const_cast(cmdstr.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); for (int i = 0; i < 5; i++) { MilliSleep(50); Fl::awake(); } // MilliSleep(100); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); LOG_INFO("Process handles closed"); #else #ifdef __APPLE__ string params = ""; size_t p = executable.find(".app/Contents/MacOS"); if (p == string::npos) { p = executable.find(".app"); if (p != string::npos) { params = executable.substr(p+4); executable.erase(p+4); if (executable[0] == '"') executable.erase(0,1); while ( (executable[executable.length()-1] == '"') || (executable[executable.length()-1] == ' ') ) executable.erase(executable.length()-1, 1); if (params[0] == '"') params.erase(0,1); while (params[0] == ' ') params.erase(0,1); DIR *dp = NULL; executable.append("/Contents/MacOS/"); dp = opendir(executable.c_str()); if (!dp) { fl_alert2("FOLDER NOT FOUND\n\n%s", executable.c_str()); return; } struct dirent *sd = NULL; sd = readdir(dp); string sds = sd->d_name; while (sds == "." || sds == "..") { sd = readdir(dp); sds = sd->d_name; } closedir(dp); executable.insert(0,"\""); executable.append(sds).append("\""); if (!params.empty()) executable.append(" ").append(params); } } #endif // __APPLE__ LOG_INFO("Start external process: %s", executable.c_str()); switch (fork()) { case -1: LOG_PERROR("fork"); // fall through default: break; case 0: execl("/bin/sh", "sh", "-c", executable.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } #endif } } void toggle_io_port_selection(int io_mode) { switch(io_mode) { case ARQ_IO: enable_arq(); progdefaults.changed = false; break; case KISS_IO: enable_kiss(); if(progdefaults.tcp_udp_auto_connect) { btn_connect_kiss_io->value(1); btn_connect_kiss_io->do_callback(); } if(progdefaults.kpsql_enabled && progdefaults.show_psm_btn) { btnPSQL->value(progdefaults.kpsql_enabled); btnPSQL->do_callback(); } progdefaults.changed = false; break; default: LOG_INFO("Unknown data io mode"); } } static void auto_start() { bool run_flamp = false; // Make sure we are in ARQ_IO mode if executing FLAMP if (!progdefaults.auto_flamp_pathname.empty() && progdefaults.flamp_auto_enable) { toggle_io_port_selection(ARQ_IO); run_flamp = true; } // A general wait to ensure FLDIGI initialization of // io ports. 1/4 to 3/4 second delay. int nloops = 0; while(nloops++ < 15) {// 3) { MilliSleep(50); Fl::awake(); // MilliSleep(250); if(arq_state() && data_io_enabled == ARQ_IO) break; // Exit early if verified. } if (!progdefaults.auto_flrig_pathname.empty() && progdefaults.flrig_auto_enable) start_process(progdefaults.auto_flrig_pathname); if (run_flamp) start_process(progdefaults.auto_flamp_pathname); if (!progdefaults.auto_fllog_pathname.empty() && progdefaults.fllog_auto_enable) start_process(progdefaults.auto_fllog_pathname); if (!progdefaults.auto_flnet_pathname.empty() && progdefaults.flnet_auto_enable) start_process(progdefaults.auto_flnet_pathname); if (!progdefaults.auto_prog1_pathname.empty() && progdefaults.prog1_auto_enable) start_process(progdefaults.auto_prog1_pathname); if (!progdefaults.auto_prog2_pathname.empty() && progdefaults.prog2_auto_enable) start_process(progdefaults.auto_prog2_pathname); if (!progdefaults.auto_prog3_pathname.empty() && progdefaults.prog3_auto_enable) start_process(progdefaults.auto_prog3_pathname); } // reset those default values that have been overriden by a command line parameter void check_overrides() { if (xmlrpc_address_override_flag) progdefaults.xmlrpc_address = override_xmlrpc_address; if (xmlrpc_port_override_flag) progdefaults.xmlrpc_port = override_xmlrpc_port; if (arq_address_override_flag) progdefaults.arq_address = override_arq_address; if (arq_port_override_flag) progdefaults.arq_port = override_arq_port; } // these functions are all started after Fl::run() is executing void delayed_startup(void *) { macros.loadDefault(); connect_to_log_server(); #ifdef __WIN32__ if (progdefaults.auto_talk) open_talker(); #else grpTalker->hide(); #endif XML_RPC_Server::start(progdefaults.xmlrpc_address.c_str(), progdefaults.xmlrpc_port.c_str()); FLRIG_start_flrig_thread(); data_io_enabled = DISABLED_IO; n3fjp_init(); arq_init(); FD_init(); DXcluster_init(); start_psm_thread(); if (progdefaults.connect_to_maclogger) maclogger_init(); data_io_enabled = progStatus.data_io_enabled; toggle_io_port_selection(data_io_enabled); disable_config_p2p_io_widgets(); notify_start(); if (progdefaults.pskrep_autostart) { if (!pskrep_start()) { LOG_ERROR("Could not start PSK reporter: %s", pskrep_error()); box_connected_to_pskrep->color(FL_WHITE); } else box_connected_to_pskrep->color(FL_GREEN); } auto_start(); if (progStatus.WK_online) { if (progStatus.WKFSK_mode) { btn_WKFSK_connect->value(1); WKFSK_connect(1); } else { btn_WKCW_connect->value(1); WKCW_connect(1); } } if (progStatus.Nav_online) { if (open_NavFSK()) btn_Nav_connect->value(1); } if (progStatus.Nav_config_online) { if (open_NavConfig()) btn_Nav_config->value(1); } if (progStatus.nanoCW_online) { if (open_nanoCW()) btn_nanoCW_connect->value(1); } if (progStatus.nanoFSK_online) { if (open_nanoIO()) btn_nanoIO_connect->value(1); } if (progdefaults.check_for_updates) cb_mnuCheckUpdate((Fl_Widget *)0, NULL); #if USE_PORTAUDIO LOG_INFO("%s", str_pa_devices.c_str()); try { audio_alert = new Caudio_alert; } catch (...) { } #endif } int main(int argc, char ** argv) { // for KISS_IO status information program_start_time = time(0); active_modem = new NULLMODEM; string appdir = appname = argv[0]; string test_file_name; BaseDir.clear(); HomeDir.clear(); NBEMS_dir.clear(); FLMSG_dir.clear(); #ifdef __WOE32__ size_t p = appdir.rfind("fldigi.exe"); appdir.erase(p); p = appdir.find("FL_APPS\\"); if (p != string::npos) { BaseDir.assign(appdir.substr(0, p + 8)); progdefaults.flmsg_pathname.assign(BaseDir).append("flmsg.exe"); } else { BaseDir.clear(); HomeDir.clear(); NBEMS_dir.clear(); FLMSG_dir.clear(); } #else char apptemp[FL_PATH_MAX + 1]; fl_filename_absolute(apptemp, sizeof(apptemp), argv[0]); appdir.assign(apptemp); size_t p = appdir.rfind("fldigi"); if (p != string::npos) appdir.erase(p); p = appdir.find("FL_APPS/"); if (p != string::npos) { BaseDir.assign(appdir.substr(0, p + 8)); progdefaults.flmsg_pathname.assign(BaseDir).append("flmsg"); string test_dir; test_dir.assign(BaseDir).append("fldigi.files/"); DIR *isdir = opendir(test_dir.c_str()); if (isdir) { HomeDir = test_dir; closedir(isdir); } else { test_dir.assign(BaseDir).append(".fldigi/"); isdir = opendir(test_dir.c_str()); if (isdir) { HomeDir = test_dir; } else { HomeDir.clear(); } } if (!HomeDir.empty()) { test_dir.assign(BaseDir).append("NBEMS.files/"); isdir = opendir(test_dir.c_str()); if (isdir) { NBEMS_dir = test_dir; FLMSG_dir = test_dir; closedir(isdir); } else { test_dir.assign(BaseDir).append(".nbems/"); isdir = opendir(test_dir.c_str()); if (isdir) { NBEMS_dir = test_dir; FLMSG_dir = test_dir; } else { NBEMS_dir.clear(); FLMSG_dir.clear(); } } } } else { BaseDir.clear(); HomeDir.clear(); NBEMS_dir.clear(); FLMSG_dir.clear(); } #endif debug_exec(argv); CREATE_THREAD_ID(); // only call this once SET_THREAD_ID(FLMAIN_TID); for (int i = 0; i < NUM_QRUNNER_THREADS; i++) { cbq[i] = new qrunner; switch(i) { case TRX_TID: cbq[i]->attach(i, "TRX_TID"); break; case TOD_TID: cbq[i]->attach(i, "TOD_TID"); break; case QRZ_TID: cbq[i]->attach(i, "QRZ_TID"); break; case RIGCTL_TID: cbq[i]->attach(i, "RIGCTL_TID"); break; case NORIGCTL_TID: cbq[i]->attach(i, "NORIGCTL_TID"); break; case EQSL_TID: cbq[i]->attach(i, "EQSL_TID"); break; case ADIF_RW_TID: cbq[i]->attach(i, "ADIF_RW_TID"); break; case ADIF_MERGE_TID: cbq[i]->attach(i, "ADIF_MERGE_TID"); break; case XMLRPC_TID: cbq[i]->attach(i, "XMLRPC_TID"); break; case ARQ_TID: cbq[i]->attach(i, "ARQ_TID"); break; case ARQSOCKET_TID: cbq[i]->attach(i, "ARQSOCKET_TID"); break; case KISS_TID: cbq[i]->attach(i, "KISS_TID"); break; case KISSSOCKET_TID: cbq[i]->attach(i, "KISSSOCKET_TID"); break; case MACLOGGER_TID: cbq[i]->attach(i, "MACLOGGER_TID"); break; case PSM_TID: cbq[i]->attach(i, "PSM_TID"); break; case AUDIO_ALERT_TID: cbq[i]->attach(i, "AUDIO_ALERT_TID"); break; case FD_TID: cbq[i]->attach(i, "FD_TID"); break; case N3FJP_TID: cbq[i]->attach(i, "N3FJP_TID"); break; case DXCC_TID: cbq[i]->attach(i, "DXCC_TID"); break; case WKEY_TID: cbq[i]->attach(i, "WKEY_TID"); break; case FLMAIN_TID: cbq[i]->attach(i, "FLMAIN_TID"); break; default: break; } } set_unexpected(handle_unexpected); set_terminate(diediedie); setup_signal_handlers(); #ifndef ENABLE_NLS setlocale(LC_TIME, ""); #endif set_platform_ui(); generate_version_text(); { char dirbuf[FL_PATH_MAX + 1]; #ifdef __WOE32__ if (BaseDir.empty()) { fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); BaseDir = dirbuf; } #else if (BaseDir.empty()) { fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$HOME/"); BaseDir = dirbuf; } #endif } generate_option_help(); // FL_NORMAL_SIZE = 14; int arg_idx; if (Fl::args(argc, argv, arg_idx, parse_args) != argc) arg_error(argv[0], NULL, false); if (argv_window_title.empty()) argv_window_title.assign(PACKAGE_TARNAME); #ifdef __WOE32__ if (HomeDir.empty()) HomeDir.assign(BaseDir).append("fldigi.files/"); if (PskMailDir.empty()) PskMailDir = BaseDir; if (DATA_dir.empty()) DATA_dir.assign(BaseDir).append("DATA.files/"); if (NBEMS_dir.empty()) NBEMS_dir.assign(BaseDir).append("NBEMS.files/"); if (FLMSG_dir.empty()) FLMSG_dir = NBEMS_dir; #else if (HomeDir.empty()) HomeDir.assign(BaseDir).append(".fldigi/"); if (PskMailDir.empty()) PskMailDir = BaseDir; if (DATA_dir.empty()) DATA_dir.assign(BaseDir).append("DATA.files/"); if (NBEMS_dir.empty()) NBEMS_dir.assign(BaseDir).append(".nbems/"); if (FLMSG_dir.empty()) FLMSG_dir = NBEMS_dir; #endif if (!FLMSG_dir_default.empty()) { char dirbuf[FL_PATH_MAX + 1]; if (FLMSG_dir_default[FLMSG_dir_default.length()-1] != '/') FLMSG_dir_default += '/'; fl_filename_expand(dirbuf, sizeof(dirbuf) - 1, FLMSG_dir_default.c_str()); FLMSG_dir = dirbuf; } if (!NBEMS_dir_default.empty()) { char dirbuf[FL_PATH_MAX + 1]; if (NBEMS_dir_default[NBEMS_dir_default.length()-1] != '/') NBEMS_dir_default += '/'; fl_filename_expand(dirbuf, sizeof(dirbuf) - 1, NBEMS_dir_default.c_str()); NBEMS_dir = dirbuf; } checkdirectories(); check_nbems_dirs(); check_data_dir(); try { debug::start(string(DebugDir).append("status_log.txt").c_str()); time_t t = time(NULL); LOG(debug::QUIET_LEVEL, debug::LOG_OTHER, _("%s log started on %s"), PACKAGE_STRING, ctime(&t)); LOG_THREAD_ID(); } catch (const char* error) { cerr << error << '\n'; debug::stop(); } TOD_init(); // initialize time of day thread LOG_INFO("appname: %s", appname.c_str()); LOG_INFO("%s", "Directories"); LOG_INFO("HomeDir: %s", HomeDir.c_str()); LOG_INFO("DATA_dir: %s", DATA_dir.c_str()); LOG_INFO("DebugDir: %s", DebugDir.c_str()); LOG_INFO("HelpDir: %s", HelpDir.c_str()); LOG_INFO("KmlDir: %s", KmlDir.c_str()); LOG_INFO("LogsDir: %s", LogsDir.c_str()); LOG_INFO("LoTWDir: %s", LoTWDir.c_str()); LOG_INFO("MacrosDir: %s", MacrosDir.c_str()); LOG_INFO("PalettesDir: %s", PalettesDir.c_str()); LOG_INFO("PicsDir: %s", PicsDir.c_str()); LOG_INFO("PskMailDir: %s", PskMailDir.c_str()); LOG_INFO("RigsDir: %s", RigsDir.c_str()); LOG_INFO("ScriptsDir: %s", ScriptsDir.c_str()); LOG_INFO("TalkDir: %s", TalkDir.c_str()); LOG_INFO("TempDir: %s", TempDir.c_str()); LOG_INFO("WrapDir: %s", WrapDir.c_str()); LOG_INFO("%s", "NBEMS directories"); LOG_INFO("NBEMS_dir: %s", NBEMS_dir.c_str()); LOG_INFO("ARQ_dir: %s", ARQ_dir.c_str()); LOG_INFO("ARQ_files_dir: %s", ARQ_files_dir.c_str()); LOG_INFO("ARQ_recv_dir: %s", ARQ_recv_dir.c_str()); LOG_INFO("ARQ_send: %s", ARQ_send.c_str()); LOG_INFO("WRAP_dir: %s", WRAP_dir.c_str()); LOG_INFO("WRAP_recv_dir: %s", WRAP_recv_dir.c_str()); LOG_INFO("WRAP_send_dir: %s", WRAP_send_dir.c_str()); LOG_INFO("WRAP_auto_dir: %s", WRAP_auto_dir.c_str()); LOG_INFO("ICS_dir: %s", ICS_dir.c_str()); LOG_INFO("ICS_msg_dir: %s", ICS_msg_dir.c_str()); LOG_INFO("ICS_tmp_dir: %s", ICS_tmp_dir.c_str()); LOG_INFO("%s", "FLMSG directories"); LOG_INFO("FLMSG_dir: %s", FLMSG_dir.c_str()); LOG_INFO("FLMSG_dir_default: %s", FLMSG_dir_default.c_str()); LOG_INFO("FLMSG_WRAP_dir: %s", FLMSG_WRAP_dir.c_str()); LOG_INFO("FLMSG_WRAP_recv_dir: %s", FLMSG_WRAP_recv_dir.c_str()); LOG_INFO("FLMSG_WRAP_send_dir: %s", FLMSG_WRAP_send_dir.c_str()); LOG_INFO("FLMSG_WRAP_auto_dir: %s", FLMSG_WRAP_auto_dir.c_str()); LOG_INFO("FLMSG_ICS_dir: %s", FLMSG_ICS_dir.c_str()); LOG_INFO("FLMSG_ICS_msg_dir: %s", FLMSG_ICS_msg_dir.c_str()); LOG_INFO("FLMSG_ICS_tmp_dir: %s", FLMSG_ICS_tmp_dir.c_str()); bool have_config = progdefaults.readDefaultsXML(); check_overrides(); xmlfname = HomeDir; xmlfname.append(DEFAULT_RIGXML_FILENAME); checkTLF(); Fl::lock(); // start the gui thread!! Fl::visual(FL_RGB); // insure 24 bit color operation fl_register_images(); Fl::set_fonts(0); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.initFonts(); if (progdefaults.cty_dat_pathname.empty()) progdefaults.cty_dat_pathname = HomeDir; dxcc_open(string(progdefaults.cty_dat_pathname).append("cty.dat").c_str()); qsl_open(string(progdefaults.cty_dat_pathname).append("lotw1.txt").c_str(), QSL_LOTW); if (!qsl_open(string(progdefaults.cty_dat_pathname).append("eqsl.txt").c_str(), QSL_EQSL)) qsl_open(string(progdefaults.cty_dat_pathname).append("AGMemberList.txt").c_str(), QSL_EQSL); progStatus.loadLastState(); create_fl_digi_main(argc, argv); if (!have_config || show_cpucheck) { double speed = speed_test(SRC_SINC_FASTEST, 8); if (speed > 150.0) { // fast progdefaults.slowcpu = false; progdefaults.sample_converter = SRC_SINC_BEST_QUALITY; } else if (speed > 60.0) { // ok progdefaults.slowcpu = false; progdefaults.sample_converter = SRC_SINC_MEDIUM_QUALITY; } else if (speed > 15.0) { // slow progdefaults.slowcpu = true; progdefaults.sample_converter = SRC_SINC_FASTEST; } else { // recycle me progdefaults.slowcpu = true; progdefaults.sample_converter = SRC_LINEAR; } LOG_INFO("CPU speed factor=%f: setting slowcpu=%s, sample_converter=\"%s\"", speed, progdefaults.slowcpu ? "true" : "false", src_get_name(progdefaults.sample_converter)); } if (progdefaults.XmlRigFilename.empty()) progdefaults.XmlRigFilename = xmlfname; #if BENCHMARK_MODE return setup_benchmark(); #endif FSEL::create(); #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 listbox_charset_status->hide(); #else listbox_charset_status->show(); #endif populate_charset_listbox(); set_default_charset(); setTabColors(); progdefaults.testCommPorts(); #if USE_HAMLIB xcvr = new Rig(); #endif push2talk = new PTT(); progdefaults.setDefaults(); atexit(sound_close); sound_init(); progdefaults.initInterface(); trx_start(); if (!have_config) { show_wizard(argc, argv); Fl_Window* w; while ((w = Fl::first_window()) && w->visible()) Fl::wait(); } dlgViewer = createViewer(); dxcluster_viewer = dxc_window(); if (!dlgLogbook) create_logbook_dialogs(); dxcluster_viewer->hide(); LOGBOOK_colors_font(); if( progdefaults.kml_save_dir.empty() ) { progdefaults.kml_save_dir = KmlDir ; } kml_init(true); // OS X will prevent the main window from being resized if we change its // size *after* it has been shown. With some X11 window managers, OTOH, // the main window will not be restored at its exact saved position if // we move it *after* it has been shown. #ifndef __APPLE__ fl_digi_main->show(argc, argv); progStatus.initLastState(); #else progStatus.initLastState(); fl_digi_main->show(argc, argv); #endif if (iconified) for (Fl_Window* w = Fl::first_window(); w; w = Fl::next_window(w)) w->iconize(); update_main_title(); mode_browser = new Mode_Browser; clearQSO(); Fl::add_timeout(.25, delayed_startup); Fl::set_color(FL_SELECTION_COLOR, 0, 0, 128); int ret = Fl::run(); return ret; } void exit_process() { close_spectrum_viewer(); if (progdefaults.kml_enabled) KmlServer::Exit(); stop_psm_thread(); arq_close(); FD_close(); DXcluster_close(); kiss_close(false); maclogger_close(); XML_RPC_Server::stop(); if (progdefaults.usepskrep) pskrep_stop(); LOG_INFO("Detach/delete qrunner threads"); for (int i = 0; i < NUM_QRUNNER_THREADS; i++) { LOG_INFO("thread %d", i); cbq[i]->detach(); delete cbq[i]; } LOG_INFO("FSEL::destroy()"); FSEL::destroy(); } void generate_option_help(void) { ostringstream help; string disp_base_dir = BaseDir; #ifdef __WOE32__ size_t p = 0; while ((p = disp_base_dir.find("/")) != string::npos) disp_base_dir[p] = '\\'; #endif help << "Usage:\n" << " " << PACKAGE_NAME << " [option...]\n\n"; help << PACKAGE_NAME << " options:\n\n" #if !defined(__WOE32__) << " --home-dir DIRECTORY\n" << " Set the home directory to full pathname of DIRECTORY\n" << " fldigi will put the file stores\n" << " .fldigi.files, and .nbems.files\n" << " in this directory\n" << " The default is: " << disp_base_dir << "\n\n" << " --config-dir DIRECTORY\n" << " Look for configuration files in DIRECTORY\n" << " The default is: " << disp_base_dir << ".fldigi/\n\n" #else << " --home-dir FOLDER\n" << " Set the home folder to full pathname of FOLDER\n" << " fldigi will put the file stores\n" << " fldigi.files, and nbems.files\n" << " in this folder\n" << " The default is: " << disp_base_dir << "\n\n" << " --config-dir FOLDER\n" << " Look for configuration files in FOLDER\n" << " The default is: " << disp_base_dir << "fldigi.files\\\n\n" #endif #if !defined(__WOE32__) && !defined(__APPLE__) << " --rx-ipc-key KEY\n" << " Set the receive message queue key\n" << " May be given in hex if prefixed with \"0x\"\n" << " The default is: " << progdefaults.rx_msgid << " or 0x" << hex << progdefaults.rx_msgid << dec << "\n\n" << " --tx-ipc-key KEY\n" << " Set the transmit message queue key\n" << " May be given in hex if prefixed with \"0x\"\n" << " The default is: " << progdefaults.tx_msgid << " or 0x" << hex << progdefaults.tx_msgid << dec << "\n\n" #endif << " --enable-io-port <" << ARQ_IO << "|" << KISS_IO << "> ARQ=" << ARQ_IO << " KISS=" << KISS_IO << "\n" << " Select the active IO Port\n" << " The default is: " << progdefaults.data_io_enabled << "\n\n" << " --kiss-server-address HOSTNAME\n" << " Set the KISS TCP/UDP server address\n" << " The default is: " << progdefaults.kiss_address << "\n\n" << " --kiss-server-port-io I/O PORT\n" << " Set the KISS TCP/UDP server I/O port\n" << " The default is: " << progdefaults.kiss_io_port << "\n\n" << " --kiss-server-port-o Output PORT\n" << " Set the KISS UDP server output port\n" << " The default is: " << progdefaults.kiss_out_port << "\n\n" << " --kiss-server-dual-port Dual Port Use (0=disable / 1=enable)\n" << " Set the KISS UDP server dual port flag\n" << " The default is: " << progdefaults.kiss_dual_port_enabled << "\n\n" << " --arq-server-address HOSTNAME\n" << " Set the ARQ TCP server address\n" << " The default is: " << progdefaults.arq_address << "\n\n" << " --arq-server-port PORT\n" << " Set the ARQ TCP server port\n" << " The default is: " << progdefaults.arq_port << "\n\n" << " --flmsg-dir DIRECTORY\n" << " Look for flmsg files in DIRECTORY\n" << " The default is " << FLMSG_dir_default << "\n\n" << " --auto-dir DIRECTORY\n" << " Look for auto-send files in DIRECTORY\n" << " The default is " << HomeDir << "/autosend" << "\n\n" << " --xmlrpc-server-address HOSTNAME\n" << " Set the XML-RPC server address\n" << " The default is: " << progdefaults.xmlrpc_address << "\n\n" << " --xmlrpc-server-port PORT\n" << " Set the XML-RPC server port\n" << " The default is: " << progdefaults.xmlrpc_port << "\n\n" << " --xmlrpc-allow REGEX\n" << " Allow only the methods whose names match REGEX\n\n" << " --xmlrpc-deny REGEX\n" << " Allow only the methods whose names don't match REGEX\n\n" << " --xmlrpc-list\n" << " List all available methods\n\n" #if BENCHMARK_MODE << " --benchmark-modem ID\n" << " Specify the modem\n" << " Default: " << mode_info[benchmark.modem].sname << "\n\n" << " --benchmark-frequency FREQ\n" << " Specify the modem frequency\n" << " Default: " << benchmark.freq << "\n\n" << " --benchmark-afc BOOLEAN\n" << " Set modem AFC\n" << " Default: " << benchmark.afc << " (" << boolalpha << benchmark.afc << noboolalpha << ")\n\n" << " --benchmark-squelch BOOLEAN\n" << " Set modem squelch\n" << " Default: " << benchmark.sql << " (" << boolalpha << benchmark.sql << noboolalpha << ")\n\n" << " --benchmark-squelch-level LEVEL\n" << " Set modem squelch level\n" << " Default: " << benchmark.sqlevel << " (%)\n\n" << " --benchmark-input INPUT\n" << " Specify the input\n" << " Must be a positive integer indicating the number of samples\n" " of silence to generate as the input" # if USE_SNDFILE ", or a filename containing\n" " non-digit characters" #endif "\n\n" << " --benchmark-output FILE\n" << " Specify the output data file\n" << " Default: decoder output is discarded\n\n" << " --benchmark-src-ratio RATIO\n" << " Specify the sample rate conversion ratio\n" << " Default: 1.0 (input is not resampled)\n\n" << " --benchmark-src-type TYPE\n" << " Specify the sample rate conversion type\n" << " Default: " << benchmark.src_type << " (" << src_get_name(benchmark.src_type) << ")\n\n" #endif << " --cpu-speed-test\n" << " Perform the CPU speed test, show results in the event log\n" << " and possibly change options.\n\n" << " --wfall-only\n" << " Hide all controls but the waterfall\n\n" << " --debug-level LEVEL\n" << " Set the event log verbosity\n\n" << " --debug-pskmail\n" << " Enable logging for pskmail / arq events\n\n" << " --debug-audio\n" << " Enable logging for sound-card events\n\n" << " --version\n" << " Print version information\n\n" << " --build-info\n" << " Print build information\n\n" << " --help\n" << " Print this option help\n\n"; // Fl::help looks ugly so we'll write our own help << "Standard FLTK options:\n\n" << " -bg COLOR, -background COLOR\n" << " Set the background color\n" << " -bg2 COLOR, -background2 COLOR\n" << " Set the secondary (text) background color\n\n" << " -di DISPLAY, -display DISPLAY\n" << " Set the X display to use DISPLAY,\n" << " format is ``host:n.n''\n\n" << " -dn, -dnd or -nodn, -nodnd\n" << " Enable or disable drag and drop copy and paste in text fields\n\n" << " -fg COLOR, -foreground COLOR\n" << " Set the foreground color\n\n" << " -g GEOMETRY, -geometry GEOMETRY\n" << " Set the initial window size and position\n" << " GEOMETRY format is ``WxH+X+Y''\n" << " ** " << PACKAGE_NAME << " may override this setting **\n\n" << " -i, -iconic\n" << " Start " << PACKAGE_NAME << " in iconified state\n\n" << " -k, -kbd or -nok, -nokbd\n" << " Enable or disable visible keyboard focus in non-text widgets\n\n" << " -na CLASSNAME, -name CLASSNAME\n" << " Set the window class to CLASSNAME\n\n" << " -ti WINDOWTITLE, -title WINDOWTITLE\n" << " Set the window title\n\n"; help << "Additional UI options:\n\n" << " --font FONT[:SIZE]\n" << " Set the widget font and (optionally) size\n" << " The default is: " << Fl::get_font(FL_HELVETICA) << ':' << FL_NORMAL_SIZE << "\n\n" ; option_help = help.str(); } void exit_cb(void*) { fl_digi_main->do_callback(); } int parse_args(int argc, char **argv, int& idx) { // Only handle long options if (!(strlen(argv[idx]) >= 2 && strncmp(argv[idx], "--", 2) == 0)) { // Store the window title. We may need this early in the initialisation // process, before FLTK uses it to set the main window title. if (argv_window_title.empty() && argc > idx && (!strcmp(argv[idx], "-ti") || !strcmp(argv[idx], "-title"))) argv_window_title = argv[idx + 1]; else if (!strcmp(argv[idx], "-i") || !strcmp(argv[idx], "-iconic")) iconified = true; return 0; } enum { OPT_ZERO, #ifndef __WOE32__ OPT_RX_IPC_KEY, OPT_TX_IPC_KEY, #endif OPT_HOME_DIR, OPT_CONFIG_DIR, OPT_ARQ_ADDRESS, OPT_ARQ_PORT, OPT_SHOW_CPU_CHECK, OPT_FLMSG_DIR, OPT_NBEMS_DIR, OPT_AUTOSEND_DIR, OPT_CONFIG_XMLRPC_ADDRESS, OPT_CONFIG_XMLRPC_PORT, OPT_CONFIG_XMLRPC_ALLOW, OPT_CONFIG_XMLRPC_DENY, OPT_CONFIG_XMLRPC_LIST, OPT_CONFIG_KISS_ADDRESS, OPT_CONFIG_KISS_PORT_IO, OPT_CONFIG_KISS_PORT_O, OPT_CONFIG_KISS_DUAL_PORT, OPT_ENABLE_IO_PORT, #if BENCHMARK_MODE OPT_BENCHMARK_MODEM, OPT_BENCHMARK_AFC, OPT_BENCHMARK_SQL, OPT_BENCHMARK_SQLEVEL, OPT_BENCHMARK_FREQ, OPT_BENCHMARK_INPUT, OPT_BENCHMARK_OUTPUT, OPT_BENCHMARK_SRC_RATIO, OPT_BENCHMARK_SRC_TYPE, #endif OPT_FONT, OPT_WFALL_HEIGHT, OPT_WINDOW_WIDTH, OPT_WINDOW_HEIGHT, OPT_WFALL_ONLY, OPT_RX_ONLY, #if USE_PORTAUDIO OPT_FRAMES_PER_BUFFER, #endif OPT_MORE_INFO, OPT_DEBUG_LEVEL, OPT_DEBUG_PSKMAIL, OPT_DEBUG_AUDIO, OPT_EXIT_AFTER, OPT_DEPRECATED, OPT_HELP, OPT_VERSION, OPT_BUILD_INFO }; static const char shortopts[] = ":"; static const struct option longopts[] = { #ifndef __WOE32__ { "rx-ipc-key", 1, 0, OPT_RX_IPC_KEY }, { "tx-ipc-key", 1, 0, OPT_TX_IPC_KEY }, #endif { "home-dir", 1, 0, OPT_HOME_DIR }, { "config-dir", 1, 0, OPT_CONFIG_DIR }, { "arq-server-address", 1, 0, OPT_ARQ_ADDRESS }, { "arq-server-port", 1, 0, OPT_ARQ_PORT }, { "flmsg-dir", 1, 0, OPT_FLMSG_DIR }, { "nbems-dir", 1, 0, OPT_NBEMS_DIR }, { "auto-dir", 1, 0, OPT_AUTOSEND_DIR }, { "cpu-speed-test", 0, 0, OPT_SHOW_CPU_CHECK }, { "enable-io-port", 1, 0, OPT_ENABLE_IO_PORT }, { "kiss-server-address", 1, 0, OPT_CONFIG_KISS_ADDRESS }, { "kiss-server-port-io", 1, 0, OPT_CONFIG_KISS_PORT_IO }, { "kiss-server-port-o", 1, 0, OPT_CONFIG_KISS_PORT_O }, { "kiss-server-dual-port", 1, 0, OPT_CONFIG_KISS_DUAL_PORT }, { "xmlrpc-server-address", 1, 0, OPT_CONFIG_XMLRPC_ADDRESS }, { "xmlrpc-server-port", 1, 0, OPT_CONFIG_XMLRPC_PORT }, { "xmlrpc-allow", 1, 0, OPT_CONFIG_XMLRPC_ALLOW }, { "xmlrpc-deny", 1, 0, OPT_CONFIG_XMLRPC_DENY }, { "xmlrpc-list", 0, 0, OPT_CONFIG_XMLRPC_LIST }, #if BENCHMARK_MODE { "benchmark-modem", 1, 0, OPT_BENCHMARK_MODEM }, { "benchmark-frequency", 1, 0, OPT_BENCHMARK_FREQ }, { "benchmark-afc", 1, 0, OPT_BENCHMARK_AFC }, { "benchmark-squelch", 1, 0, OPT_BENCHMARK_SQL }, { "benchmark-squelch-level", 1, 0, OPT_BENCHMARK_SQLEVEL }, { "benchmark-input", 1, 0, OPT_BENCHMARK_INPUT }, { "benchmark-output", 1, 0, OPT_BENCHMARK_OUTPUT }, { "benchmark-src-ratio", 1, 0, OPT_BENCHMARK_SRC_RATIO }, { "benchmark-src-type", 1, 0, OPT_BENCHMARK_SRC_TYPE }, #endif { "font", 1, 0, OPT_FONT }, { "wfall-height", 1, 0, OPT_WFALL_HEIGHT }, { "window-width", 1, 0, OPT_WINDOW_WIDTH }, { "window-height", 1, 0, OPT_WINDOW_HEIGHT }, { "wfall-only", 0, 0, OPT_WFALL_ONLY }, { "wo", 0, 0, OPT_WFALL_ONLY }, { "rx-only", 0, 0, OPT_RX_ONLY }, { "ro", 0, 0, OPT_RX_ONLY }, #if USE_PORTAUDIO { "frames-per-buffer",1, 0, OPT_FRAMES_PER_BUFFER }, #endif { "more-info", 1, 0, OPT_MORE_INFO }, { "exit-after", 1, 0, OPT_EXIT_AFTER }, { "debug-level", 1, 0, OPT_DEBUG_LEVEL }, { "debug-pskmail", 0, 0, OPT_DEBUG_PSKMAIL }, { "debug-audio", 0, 0, OPT_DEBUG_AUDIO }, { "help", 0, 0, OPT_HELP }, { "version", 0, 0, OPT_VERSION }, { "build-info", 0, 0, OPT_BUILD_INFO }, { 0 } }; int longindex; optind = idx; opterr = 0; int c = getopt_long(argc, argv, shortopts, longopts, &longindex); switch (c) { case -1: return 0; case 0: // handle options with non-0 flag here return 0; #if !defined(__WOE32__) && !defined(__APPLE__) case OPT_RX_IPC_KEY: case OPT_TX_IPC_KEY: { errno = 0; int key = strtol(optarg, NULL, (strncasecmp(optarg, "0x", 2) ? 10 : 16)); if (errno || key <= 0) cerr << "Hmm, " << key << " doesn't look like a valid IPC key\n"; if (c == OPT_RX_IPC_KEY) progdefaults.rx_msgid = key; else progdefaults.tx_msgid = key; } break; #endif case OPT_HOME_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); BaseDir = buf; } if (*BaseDir.rbegin() != '/') BaseDir += '/'; break; case OPT_CONFIG_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); HomeDir = buf; } if (*HomeDir.rbegin() != '/') HomeDir += '/'; break; case OPT_ARQ_ADDRESS: override_arq_address = optarg; arq_address_override_flag = true; break; case OPT_ARQ_PORT: override_arq_port = optarg; arq_port_override_flag = true; break; case OPT_FLMSG_DIR: FLMSG_dir_default = optarg; break; case OPT_NBEMS_DIR: NBEMS_dir_default = optarg; break; case OPT_AUTOSEND_DIR: FLMSG_WRAP_auto_dir = optarg; break; case OPT_ENABLE_IO_PORT: if(optarg) { switch(atoi(optarg)) { case ARQ_IO: progdefaults.data_io_enabled = ARQ_IO; override_data_io_enabled = ARQ_IO; arq_address_override_flag = true; break; case KISS_IO: progdefaults.data_io_enabled = KISS_IO; override_data_io_enabled = KISS_IO; kiss_address_override_flag = true; break; } } break; case OPT_CONFIG_KISS_ADDRESS: progdefaults.kiss_address = optarg; override_kiss_address = optarg; kiss_address_override_flag = true; break; case OPT_CONFIG_KISS_PORT_IO: progdefaults.kiss_io_port = optarg; override_kiss_io_port = optarg; kiss_address_override_flag = true; break; case OPT_CONFIG_KISS_PORT_O: progdefaults.kiss_out_port = optarg; override_kiss_out_port = optarg; kiss_address_override_flag = true; break; case OPT_CONFIG_KISS_DUAL_PORT: if((optarg) && atoi(optarg)) { progdefaults.kiss_dual_port_enabled = true; override_kiss_dual_port_enabled = true; kiss_address_override_flag = true; } else { progdefaults.kiss_dual_port_enabled = false; override_kiss_dual_port_enabled = false; kiss_address_override_flag = true; } break; case OPT_CONFIG_XMLRPC_ADDRESS: override_xmlrpc_address = optarg; xmlrpc_address_override_flag = true; break; case OPT_CONFIG_XMLRPC_PORT: override_xmlrpc_port = optarg; xmlrpc_port_override_flag = true; break; case OPT_CONFIG_XMLRPC_ALLOW: progdefaults.xmlrpc_allow = optarg; break; case OPT_CONFIG_XMLRPC_DENY: if (!progdefaults.xmlrpc_allow.empty()) cerr << "W: --" << longopts[longindex].name << " cannot be used together with --" << longopts[OPT_CONFIG_XMLRPC_ALLOW-1].name << " and will be ignored\n"; else progdefaults.xmlrpc_deny = optarg; break; case OPT_CONFIG_XMLRPC_LIST: XML_RPC_Server::list_methods(cout); exit(EXIT_SUCCESS); #if BENCHMARK_MODE case OPT_BENCHMARK_MODEM: benchmark.modem = strtol(optarg, NULL, 10); if (!(benchmark.modem >= 0 && benchmark.modem < NUM_MODES)) { fatal_error(_("Bad modem id")); } break; case OPT_BENCHMARK_FREQ: benchmark.freq = strtol(optarg, NULL, 10); if (benchmark.freq < 0) { fatal_error(_("Bad frequency")); } break; case OPT_BENCHMARK_AFC: benchmark.afc = strtol(optarg, NULL, 10); break; case OPT_BENCHMARK_SQL: benchmark.sql = strtol(optarg, NULL, 10); break; case OPT_BENCHMARK_SQLEVEL: benchmark.sqlevel = strtod(optarg, NULL); break; case OPT_BENCHMARK_INPUT: benchmark.input = optarg; break; case OPT_BENCHMARK_OUTPUT: benchmark.output = optarg; break; case OPT_BENCHMARK_SRC_RATIO: benchmark.src_ratio = strtod(optarg, NULL); break; case OPT_BENCHMARK_SRC_TYPE: benchmark.src_type = strtol(optarg, NULL, 10); break; #endif case OPT_FONT: { char *p; if ((p = strchr(optarg, ':'))) { *p = '\0'; FL_NORMAL_SIZE = strtol(p + 1, 0, 10); } } Fl::set_font(FL_HELVETICA, optarg); break; // case OPT_WFALL_HEIGHT: // progdefaults.wfheight = strtol(optarg, NULL, 10); // break; // case OPT_WINDOW_WIDTH: // WNOM = strtol(optarg, NULL, 10); // break; // case OPT_WINDOW_HEIGHT: // HNOM = strtol(optarg, NULL, 10); // break; #if USE_PORTAUDIO case OPT_FRAMES_PER_BUFFER: progdefaults.PortFramesPerBuffer = strtol(optarg, 0, 10); break; #endif // USE_PORTAUDIO case OPT_MORE_INFO: bMOREINFO = true; break; case OPT_EXIT_AFTER: Fl::add_timeout(strtod(optarg, 0), exit_cb); break; case OPT_WFALL_ONLY: bWF_only = true; break; case OPT_RX_ONLY: rx_only = true; break; case OPT_SHOW_CPU_CHECK: show_cpucheck = true; break; case OPT_DEBUG_LEVEL: { int v = strtol(optarg, 0, 10); debug::level = (debug::level_e)CLAMP(v, 0, debug::LOG_NLEVELS-1); } break; case OPT_DEBUG_PSKMAIL: debug_pskmail = true; break; case OPT_DEBUG_AUDIO: debug_audio = true; break; case OPT_DEPRECATED: cerr << "W: the --" << longopts[longindex].name << " option has been deprecated and will be removed in a future version\n"; break; case OPT_HELP: cout << option_help; exit(EXIT_SUCCESS); case OPT_VERSION: cout << version_text; exit(EXIT_SUCCESS); case OPT_BUILD_INFO: cout << build_text; exit(EXIT_SUCCESS); case '?': case ':': default: arg_error(argv[0], argv[idx], (c == ':')); } // Increment idx by the number of args we used and return that number. // We must check whether the option argument is in the same argv element // as the option name itself, i.e., --opt=arg. c = longopts[longindex].has_arg ? 2 : 1; if (c == 2) { string arg = argv[idx]; string::size_type p; if ((p = arg.rfind(optarg)) != string::npos && arg[p-1] == '=') c = 1; } idx += c; return c; } void generate_version_text(void) { version_text.assign(PACKAGE_STRING "\nCopyright (C) 2007-2010 " PACKAGE_AUTHORS ".\n"); version_text.append(_("License GPLv3+: GNU GPL version 3 or later " "\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n")); ostringstream s; s << "Build information:\n"; s << " built : " << BUILD_DATE << " by " << BUILD_USER << '@' << BUILD_HOST << " on " << BUILD_BUILD_PLATFORM << " for " << BUILD_TARGET_PLATFORM << "\n\n" << " configure flags: " << BUILD_CONFIGURE_ARGS << "\n\n" << " compiler : " << BUILD_COMPILER << "\n\n" << " compiler flags : " << FLDIGI_BUILD_CXXFLAGS << "\n\n" << " linker flags : " << FLDIGI_BUILD_LDFLAGS << "\n\n" << " libraries : " "FLTK " FLTK_BUILD_VERSION "\n" << " " "libsamplerate " << SAMPLERATE_BUILD_VERSION "\n"; #if USE_SNDFILE s << " " "libsndfile " << SNDFILE_BUILD_VERSION "\n"; #endif #if USE_PORTAUDIO s << " " "PortAudio " << PORTAUDIO_BUILD_VERSION "\n"; #endif #if USE_PULSEAUDIO s << " " "PulseAudio " << PULSEAUDIO_BUILD_VERSION "\n"; #endif #if USE_HAMLIB s << " " "Hamlib " << HAMLIB_BUILD_VERSION "\n"; #endif s << "\nRuntime information:\n"; struct utsname u; if (uname(&u) != -1) { s << " system : " << u.sysname << ' ' << u.nodename << ' ' << u.release << ' ' << u.version << ' ' << u.machine << "\n\n"; } s << " libraries : " << src_get_version() << '\n'; #if USE_SNDFILE char sndfile_version[32]; sf_command(NULL, SFC_GET_LIB_VERSION, sndfile_version, sizeof(sndfile_version)); s << " " << sndfile_version << '\n'; #endif #if USE_PORTAUDIO s << " " << Pa_GetVersionText() << ' ' << Pa_GetVersion() << '\n'; #endif #if USE_PULSEAUDIO s << " " << "Pulseaudio " << pa_get_library_version() << '\n'; #endif #if USE_HAMLIB s << " " << hamlib_version << '\n'; #endif build_text = s.str(); } // When debugging is enabled, reexec with malloc debugging hooks enabled, unless // the env var FLDIGI_NO_EXEC is set, or our parent process is gdb. void debug_exec(char** argv) { #if !defined(NDEBUG) && defined(__GLIBC__) if (getenv("FLDIGI_NO_EXEC")) return; char ppath[32], lname[32]; ssize_t n; snprintf(ppath, sizeof(ppath), "/proc/%u/exe", getppid()); if ((n = readlink(ppath, lname, sizeof(lname))) > 0) { lname[n] = '\0'; if (strstr(lname, "gdb")) { cerr << "Not using malloc debugging hooks\n"; return; } } setenv("FLDIGI_NO_EXEC", "1", 0); setenv("MALLOC_CHECK_", "3", 0); setenv("MALLOC_PERTURB_", "42", 0); if (execvp(*argv, argv) == -1) perror("execvp"); #endif } void set_platform_ui(void) { #if defined(__APPLE__) FL_NORMAL_SIZE = 12; progdefaults.WaterfallFontsize = 12; progdefaults.RxFontsize = 12; progdefaults.TxFontsize = 12; #elif defined(__WOE32__) Fl::set_font(FL_HELVETICA, "Tahoma"); FL_NORMAL_SIZE = 11; progdefaults.WaterfallFontnbr = FL_HELVETICA; progdefaults.WaterfallFontsize = 12; progdefaults.RxFontsize = 12; progdefaults.TxFontsize = 12; #else FL_NORMAL_SIZE = 12; #endif } // Convert 1 second of 1-channel silence from IN_RATE Hz to OUT_RATE Hz, // Repeat test "repeat" times. Return (repeat / elapsed_time), // the faster-than-realtime factor averaged over "repeat" runs. // Some figures for SRC_SINC_FASTEST: // Pentium 4 2.8GHz: 70 // Pentium 3 550MHz: 13 // UltraSparc II 270MHz: 3.5 // Atom N280 1.66GHz: 17.7 #define IN_RATE 48000 #define OUT_RATE 8000 double speed_test(int converter, unsigned repeat) { float input_frames[IN_RATE]; float output_frames[OUT_RATE]; SRC_DATA src; src.src_ratio = (double)OUT_RATE / IN_RATE; src.input_frames = IN_RATE; src.output_frames = OUT_RATE; src.data_in = &input_frames[0]; src.data_out = &output_frames[0]; memset(input_frames, 0, sizeof(input_frames)); // warm up src_simple(&src, converter, 1); struct timespec t0, t1; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif for (unsigned i = 0; i < repeat; i++) src_simple(&src, converter, 1); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif t0 = t1 - t0; return repeat / (t0.tv_sec + t0.tv_nsec/1e9); } static void setup_signal_handlers(void) { #ifndef __WOE32__ struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); // no child stopped notifications, no zombies action.sa_handler = SIG_DFL; action.sa_flags = SA_NOCLDSTOP; #ifdef SA_NOCLDWAIT action.sa_flags |= SA_NOCLDWAIT; #endif sigaction(SIGCHLD, &action, NULL); action.sa_flags = 0; action.sa_handler = handle_signal; sigaction(SIGSEGV, &action, NULL); sigaction(SIGILL, &action, NULL); sigaction(SIGABRT, &action, NULL); sigaction(SIGUSR2, &action, NULL); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask, SIGUSR2); pthread_sigmask(SIG_BLOCK, &action.sa_mask, NULL); #else signal(SIGSEGV, handle_signal); signal(SIGILL, handle_signal); signal(SIGABRT, handle_signal); #endif } // Show an error dialog and print to cerr if available. // On win32 Fl::fatal displays its own error window. static void fatal_error(string sz_error) { string s = "Fatal error!\n"; s.append(sz_error).append("\n").append(strerror(errno)); // Win32 will display a MessageBox error message #if !defined(__WOE32__) fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); fl_alert2("%s", s.c_str()); #endif Fl::fatal(s.c_str()); } static void checkdirectories(void) { struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS fldigi_dirs[] = { { HomeDir, 0, 0 }, { RigsDir, "rigs", 0 }, { ScriptsDir, "scripts", 0 }, { PalettesDir, "palettes", create_new_palettes }, { LogsDir, "logs", 0 }, { PicsDir, "images", 0 }, { AvatarDir, "avatars", 0}, { HelpDir, "help", 0 }, { MacrosDir, "macros", create_new_macros }, { WrapDir, "wrap", 0 }, { TalkDir, "talk", 0 }, { TempDir, "temp", 0 }, { LoTWDir, "LOTW", 0 }, { KmlDir, "kml", 0 }, { DATA_dir, "data", 0 }, { DebugDir, "debug", 0 } }; int r; for (size_t i = 0; i < sizeof(fldigi_dirs)/sizeof(*fldigi_dirs); i++) { if (fldigi_dirs[i].suffix) fldigi_dirs[i].dir.assign(HomeDir).append(fldigi_dirs[i].suffix).append(PATH_SEP); r = mkdir(fldigi_dirs[i].dir.c_str(), 0777); if (r == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(fldigi_dirs[i].dir); fatal_error(s); } else if (r == 0 && fldigi_dirs[i].new_dir_func) fldigi_dirs[i].new_dir_func(); } } bool nbems_dirs_checked = false; void check_nbems_dirs(void) { if (nbems_dirs_checked) return; struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS NBEMS_dirs[] = { { NBEMS_dir, 0, 0 }, { ARQ_dir, "ARQ", 0 }, { ARQ_files_dir, "ARQ/files", 0 }, { ARQ_recv_dir, "ARQ/recv", 0 }, { ARQ_send, "ARQ/send", 0 }, { WRAP_dir, "WRAP", 0 }, { WRAP_recv_dir, "WRAP/recv", 0 }, { WRAP_send_dir, "WRAP/send", 0 }, { WRAP_auto_dir, "WRAP/auto", 0 }, { ICS_dir, "ICS", 0 }, { ICS_msg_dir, "ICS/messages", 0 }, { ICS_tmp_dir, "ICS/templates", 0 }, }; int r; for (size_t i = 0; i < sizeof(NBEMS_dirs)/sizeof(*NBEMS_dirs); i++) { if (NBEMS_dirs[i].suffix) NBEMS_dirs[i].dir.assign(NBEMS_dir).append(NBEMS_dirs[i].suffix).append(PATH_SEP); if ((r = mkdir(NBEMS_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(NBEMS_dirs[i].dir).append(", ").append(strerror(errno)); fatal_error(s); } else if (r == 0 && NBEMS_dirs[i].new_dir_func) NBEMS_dirs[i].new_dir_func(); } DIRS FLMSG_dirs[] = { { FLMSG_dir, 0, 0 }, { FLMSG_WRAP_dir, "WRAP", 0 }, { FLMSG_WRAP_recv_dir, "WRAP/recv", 0 }, { FLMSG_WRAP_send_dir, "WRAP/send", 0 }, { FLMSG_WRAP_auto_dir, "WRAP/auto", 0 }, { FLMSG_ICS_dir, "ICS", 0 }, { FLMSG_ICS_msg_dir, "ICS/messages", 0 }, { FLMSG_ICS_tmp_dir, "ICS/templates", 0 }, }; for (size_t i = 0; i < sizeof(FLMSG_dirs)/sizeof(*FLMSG_dirs); i++) { if (FLMSG_dirs[i].dir.empty() && FLMSG_dirs[i].suffix) FLMSG_dirs[i].dir.assign(FLMSG_dir).append(FLMSG_dirs[i].suffix).append("/"); if ((r = mkdir(FLMSG_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(FLMSG_dirs[i].dir); fatal_error(s); } else if (r == 0 && FLMSG_dirs[i].new_dir_func) FLMSG_dirs[i].new_dir_func(); } nbems_dirs_checked = true; } void check_data_dir(void) { if (mkdir(DATA_dir.c_str(), 0777) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(DATA_dir); fatal_error(s); } } // Print an error message and exit. static void arg_error(const char* name, const char* arg, bool missing) { ostringstream msg; msg << name << ": "; if (arg && *arg) { if (missing) msg << "option '" << arg << "' requires an argument\n"; else msg << "unrecognized option '" << arg << "'\n"; } else msg << "error while parsing command line\n"; msg << "See command line help for more information."; fatal_error(msg.str()); } /// Sets or resets the KML parameters, and loads existing files. void kml_init(bool load_files) { if (progdefaults.kml_enabled == false) return; // disabled kml service KmlServer::GetInstance()->InitParams( progdefaults.kml_command, progdefaults.kml_save_dir, (double)progdefaults.kml_merge_distance, progdefaults.kml_retention_time, progdefaults.kml_refresh_interval, progdefaults.kml_balloon_style); if(load_files) { KmlServer::GetInstance()->ReloadKmlFiles(); } /// TODO: Should do this only when the locator has changed. try { /// One special KML object for the user. CoordinateT::Pair myCoo( progdefaults.myLocator ); /// TODO: Fix this: It does not seem to create a polyline when changing the locator. KmlServer::CustomDataT custData ; custData.Push( "QTH", progdefaults.myQth ); custData.Push( "Locator", progdefaults.myLocator ); custData.Push( "Antenna", progdefaults.myAntenna ); custData.Push( "Name", progdefaults.myName ); KmlServer::GetInstance()->Broadcast( "User", KmlServer::UniqueEvent, myCoo, 0.0, // Altitude. progdefaults.myCall, progdefaults.myLocator, progdefaults.myQth, custData ); } catch( const std::exception & exc ) { ;// LOG_WARN("Cannot publish user position:%s", exc.what() ); } } /// Tests if a directory exists. int directory_is_created( const char * strdir ) { DIR *dir = opendir(strdir); if (dir) { closedir(dir); return true; } return false; } fldigi-4.1.06/src/fileselector/0000775000175000017500000000000013515625027013320 500000000000000fldigi-4.1.06/src/fileselector/flnfc_common.cxx0000644000175000017500000000407613472115773016435 00000000000000// // flnfc_common.cxx -- common string subs for Fl_Native_File_Chooser // // Copyright 2004 by Greg Ercolano. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include // COPY A STRING WITH 'new' // Value can be NULL // static char *strnew(const char *val) { if ( val == NULL ) return(NULL); char *s = new char[strlen(val)+1]; strcpy(s, val); return(s); } // FREE STRING CREATED WITH strnew(), NULLS OUT STRING // Value can be NULL // static char *strfree(char *val) { if ( val ) delete [] val; return(NULL); } #ifndef __WOE32__ // 'DYNAMICALLY' APPEND ONE STRING TO ANOTHER // Returns newly allocated string, or NULL // if s && val == NULL. // 's' can be NULL; returns a strnew(val). // 'val' can be NULL; s is returned unmodified. // // Usage: // char *s = strnew("foo"); // s = "foo" // s = strapp(s, "bar"); // s = "foobar" // static char *strapp(char *s, const char *val) { if ( ! val ) { return(s); // Nothing to append? return s } if ( ! s ) { return(strnew(val)); // New string? return copy of val } char *news = new char[strlen(s)+strlen(val)+1]; strcpy(news, s); strcat(news, val); delete [] s; // delete old string return(news); // return new copy } #endif // APPEND A CHARACTER TO A STRING // This does NOT allocate space for the new character. // static void chrcat(char *s, char c) { char tmp[2] = { c, '\0' }; strcat(s, tmp); } fldigi-4.1.06/src/fileselector/fileselect.cxx0000644000175000017500000002246113472115773016112 00000000000000// ---------------------------------------------------------------------------- // // fileselect.cxx -- file selector front end // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Dave Freese, 2015 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "config.h" #include "fileselect.h" #include "debug.h" #include "qrunner.h" /** \class Fl_Native_File_Chooser This class lets an FLTK application easily and consistently access the operating system's native file chooser. Some operating systems have very complex and specific file choosers that many users want access to specifically, instead of FLTK's default file chooser(s). In cases where there is no native file browser, FLTK's own file browser is used instead. To use this widget correctly, use the following include in your code: \code #include \endcode Do not include the other Fl_Native_File_Choser_XXX.H files in your code; those are platform specific files that will be included automatically depending on your build platform. The following example shows how to pick a single file: \code // Create and post the local native file chooser #include [..] Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("Text\t*.txt\n" "C Files\t*.{cxx,h,c}"); fnfc.directory("/var/tmp"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: printf("ERROR: %s\n", fnfc.errmsg()); break; // ERROR case 1: printf("CANCEL\n"); break; // CANCEL default: printf("PICKED: %s\n", fnfc.filename()); break; // FILE CHOSEN } \endcode Platform Specific Caveats - Under X windows, it's best if you call Fl_File_Icon::load_system_icons() at the start of main(), to enable the nicer looking file browser widgets. Use the static public attributes of class Fl_File_Chooser to localize the browser. - Some operating systems support certain OS specific options; see Fl_Native_File_Chooser::options() for a list. \image html Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms." \image latex Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms" width=14cm enum Type { BROWSE_FILE = 0, ///< browse files (lets user choose one file) BROWSE_DIRECTORY, ///< browse directories (lets user choose one directory) BROWSE_MULTI_FILE, ///< browse files (lets user choose multiple files) BROWSE_MULTI_DIRECTORY, ///< browse directories (lets user choose multiple directories) BROWSE_SAVE_FILE, ///< browse to save a file BROWSE_SAVE_DIRECTORY ///< browse to save a directory }; enum Option { NO_OPTIONS = 0x0000, ///< no options enabled SAVEAS_CONFIRM = 0x0001, ///< Show native 'Save As' overwrite confirm dialog (if supported) NEW_FOLDER = 0x0002, ///< Show 'New Folder' icon (if supported) PREVIEW = 0x0004 ///< enable preview mode }; IMPORTANT NOTICE: The filter type must be terminated with a '\n' on OS X or the application crashes with a Bus timeout */ bool trx_inhibit = false; using namespace std; namespace FSEL { void create(void) {}; void destroy(void) {}; string filename, stitle, sfilter, sdef, sdirectory; char dirbuf[FL_PATH_MAX + 1] = ""; char msg[400]; // use this function for testing on garbage OS, aka Windows /* void pfile (const char *dir, const char *fname, const char *filt) { char fn[FL_PATH_MAX+1]; #ifdef __WIN32__ fl_filename_expand(fn, sizeof(fn) -1, "$USERPROFILE/"); #else fl_filename_expand(fn, sizeof(fn) -1, "$HOME/"); #endif strcat(fn, "pfile.txt"); FILE *f = fl_fopen(fn, "a"); fprintf(f,"\ dir: %s\n\ file: %s\n\ filter: %s\n", dir, fname, filt); fclose(f); } */ void dosfname(string &s) { for (size_t i = 0; i < s.length(); i++) if (s[i] == '/') s[i] = '\\'; } const char* select(const char* title, const char* filter, const char* def, int* fsel) { if (strlen(dirbuf) == 0) { #ifdef __WIN32__ fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); #else fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$HOME/"); #endif } size_t p = 0; Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); sdirectory.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) { sdef.assign(def); if (!sdef.empty()) { p = sdef.length() - 1; if ((sdef[p] == '/') || (sdef[p] == '\\')) sdef.append("fname"); } sdirectory.assign(sdef); p = sdirectory.rfind(fl_filename_name(sdef.c_str())); sdirectory.erase(p); } if (sdirectory.empty()) { sdirectory.assign(dirbuf); } if (sdef.empty()) { sdef.assign(sdirectory); sdef.append("temp"); } if (!sfilter.empty()) { if (sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; native.filter(sfilter.c_str()); } native.title(stitle.c_str()); #if __WIN32__ dosfname(sdef); dosfname(sdirectory); #endif if (!sdef.empty()) native.preset_file(sdef.c_str()); if (!sdirectory.empty()) native.directory(sdirectory.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_FILE); native.options(Fl_Native_File_Chooser::PREVIEW); // pfile(sdirectory.c_str(), sdef.c_str(), sfilter.c_str()); filename.clear(); trx_inhibit = true; switch ( native.show() ) { case -1: // ERROR LOG_ERROR("ERROR: %s\n", native.errmsg()); // Error fall through case 1: // CANCEL filename = ""; break; default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } trx_inhibit = false; if (fsel) *fsel = native.filter_value(); return filename.c_str(); } const char* saveas(const char* title, const char* filter, const char* def, int* fsel) { if (strlen(dirbuf) == 0) { #ifdef __WIN32__ fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); #else fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$HOME/"); #endif } size_t p = 0; Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); sdirectory.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) { sdef.assign(def); if (!sdef.empty()) { p = sdef.length() - 1; if ((sdef[p] == '/') || (sdef[p] == '\\')) sdef.append("fname"); } sdirectory.assign(sdef); p = sdirectory.rfind(fl_filename_name(sdef.c_str())); sdirectory.erase(p); } if (sdirectory.empty()) { sdirectory.assign(dirbuf); } if (sdef.empty()) { sdef.assign(sdirectory); sdef.append("temp"); } if (!sfilter.empty()) { if (sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; native.filter(sfilter.c_str()); } native.title(stitle.c_str()); #if __WIN32__ dosfname(sdef); dosfname(sdirectory); #endif if (!sdef.empty()) native.preset_file(sdef.c_str()); if (!sdirectory.empty()) native.directory(sdirectory.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE); native.options(Fl_Native_File_Chooser::NEW_FOLDER | Fl_Native_File_Chooser::SAVEAS_CONFIRM); // pfile(sdirectory.c_str(), sdef.c_str(), sfilter.c_str()); filename.clear(); trx_inhibit = true; switch ( native.show() ) { case -1: // ERROR LOG_ERROR("ERROR: %s\n", native.errmsg()); break; case 1: // CANCEL filename = ""; break; default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } trx_inhibit = false; if (fsel) *fsel = native.filter_value(); return filename.c_str(); } const char* dir_select(const char* title, const char* filter, const char* def) { Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) sdef.assign(def); if (!sfilter.empty() && sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; if (!stitle.empty()) native.title(stitle.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_DIRECTORY); if (!sfilter.empty()) native.filter(sfilter.c_str()); native.options(Fl_Native_File_Chooser::NO_OPTIONS); #if __WIN32__ dosfname(sdef); #endif if (!sdef.empty()) { native.directory(sdef.c_str()); sdirectory = sdef; } else sdirectory.clear(); filename.clear(); trx_inhibit = true; switch ( native.show() ) { case -1: // ERROR LOG_ERROR("ERROR: %s\n", native.errmsg()); break; case 1: // CANCEL filename = ""; break; default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } trx_inhibit = false; return filename.c_str(); } } // FSEL fldigi-4.1.06/src/ssb/0000775000175000017500000000000013515625027011427 500000000000000fldigi-4.1.06/src/ssb/ssb.cxx0000644000175000017500000000316513472115773012671 00000000000000// ---------------------------------------------------------------------------- // ssb.cxx -- ssb modem // // Copyright (C) 2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "ssb.h" #include "modem.h" #include "digiscope.h" #include "fl_digi.h" #include "debug.h" #define ssb_bw 4 void ssb::tx_init() { } void ssb::rx_init() { put_MODEstatus(mode); } void ssb::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::BLANK); } ssb::~ssb() { } void ssb::restart() { set_bandwidth(ssb_bw); } ssb::ssb() { mode = MODE_SSB; samplerate = 8000; cap &= ~CAP_TX; restart(); } // dummy process int ssb::rx_process(const double *buf, int len) { return 0; } //===================================================================== // ssb transmit // dummy process //===================================================================== int ssb::tx_process() { return -1; } fldigi-4.1.06/src/spot/0000775000175000017500000000000013515625027011625 500000000000000fldigi-4.1.06/src/spot/spot.cxx0000644000175000017500000001542013472115776013265 00000000000000// ---------------------------------------------------------------------------- // spot.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if HAVE_STD_HASH # include #elif HAVE_STD_TR1_HASH # include #else # error "No std::hash or std::tr1::hash support" #endif #include "trx.h" #include "globals.h" #include "re.h" #include "fl_digi.h" #include "debug.h" #include "spot.h" // the number of characters that we match our REs against #define SEARCHLEN 32 #define DECBUFSIZE 8 * SEARCHLEN using namespace std; struct callback_t { void* data; spot_log_cb_t lcb; spot_log_cb_t mcb; spot_recv_cb_t rcb; }; typedef list cblist_t; struct fre_hash : std::unary_function { size_t operator()(const fre_t* r) const { return r->hash(); } }; struct fre_comp : std::unary_function { size_t operator()(const fre_t* l, const fre_t* r) const { return *l == *r; } }; typedef list callback_p_list_t; #if HAVE_STD_HASH typedef std::unordered_map rcblist_t; static std::unordered_map buffers; #elif HAVE_STD_TR1_HASH typedef tr1::unordered_map rcblist_t; static tr1::unordered_map buffers; #endif static cblist_t cblist; static rcblist_t rcblist; void spot_recv(char c, int decoder, int afreq, int md) { static trx_mode last_mode = NUM_MODES + 1; if (decoder == -1) { // mode without multiple decoders decoder = active_modem->get_mode(); if (last_mode != active_modem->get_mode()) { buffers.clear(); last_mode = active_modem->get_mode(); } } else if (last_mode != md) { buffers.clear(); last_mode = md; } if (afreq == 0) afreq = active_modem->get_freq(); string& buf = buffers[decoder]; if (unlikely(buf.capacity() < DECBUFSIZE)) buf.reserve(DECBUFSIZE); buf += c; string::size_type n = buf.length(); if (n == DECBUFSIZE) buf.erase(0, DECBUFSIZE - SEARCHLEN); const char* search = buf.c_str() + (n > SEARCHLEN ? n - SEARCHLEN : 0); bool matched = false; for (rcblist_t::iterator i = rcblist.begin(); i != rcblist.end(); ++i) { if (unlikely(i->first->match(search))) { matched = true; const vector& m = i->first->suboff(); for (list::iterator j = i->second.begin(); j != i->second.end() && (*j)->rcb; ++j) { if (m.empty()) (*j)->rcb(last_mode, afreq, search, NULL, 0, (*j)->data); else (*j)->rcb(last_mode, afreq, search, &m[0], m.size(), (*j)->data); } } } if (matched) buf.clear(); } static void get_log_details(long long& freq, trx_mode& mode, time_t& rtime) { if (mode == NUM_MODES) mode = active_modem->get_mode(); if (mode >= MODE_WWV) return; if (freq == 0LL) freq = active_modem->get_freq(); if (!wf->USB()) freq = -freq; freq += wf->rfcarrier(); if (rtime == -1L) rtime = time(NULL); } void spot_log(const char* callsign, const char* locator, long long freq, trx_mode mode, time_t rtime) { get_log_details(freq, mode, rtime); for (cblist_t::const_iterator i = cblist.begin(); i != cblist.end(); ++i) if (i->lcb) i->lcb(callsign, locator, freq, mode, rtime, i->data); } void spot_manual(const char* callsign, const char* locator, long long freq, trx_mode mode, time_t rtime) { get_log_details(freq, mode, rtime); for (cblist_t::const_iterator i = cblist.begin(); i != cblist.end(); ++i) if (i->mcb) i->mcb(callsign, locator, freq, mode, rtime, i->data); } // // A callback of type spot_log_cb_t is registered with a data argument. // The callback is invoked every time a QSO is logged. // void spot_register_log(spot_log_cb_t lcb, void* ldata) { callback_t c = { ldata, lcb, 0, 0 }; cblist.push_back(c); } // // A callback of type spot_log_cb_t is registered with a data argument. // The callback is invoked every time the user manually spots a callsign. // void spot_register_manual(spot_log_cb_t mcb, void* mdata) { callback_t c = { mdata, 0, mcb, 0 }; cblist.push_back(c); } // // A callback of type spot_recv_cb_t is registered with a regular // expression (RE, RE_flags). If the RE matches the spotter's search // buffer, the callback is invoked with offsets into the search buffer // indicating substring matches, if the RE defines any, and with its // data argument. The offset format is described in regexec(3). The // buffer and offsets are only valid during that particular invocation. // Clients should use anchoring to avoid repeated calls. // void spot_register_recv(spot_recv_cb_t rcb, void* rdata, const char* re, int reflags) { callback_t c = { rdata, 0, 0, rcb }; cblist.push_back(c); fre_t* fre = new fre_t(re, reflags); rcblist_t::iterator i = rcblist.find(fre); if (i != rcblist.end()) { i->second.push_back(&cblist.back()); delete fre; } else rcblist[fre].push_back(&cblist.back()); show_spot(true); } void spot_unregister_log(spot_log_cb_t lcb, const void* ldata) { for (cblist_t::iterator i = cblist.begin(); i != cblist.end(); ++i) { if (lcb == i->lcb && ldata == i->data) { cblist.erase(i); break; } } } void spot_unregister_manual(spot_log_cb_t mcb, const void* mdata) { for (cblist_t::iterator i = cblist.begin(); i != cblist.end(); ++i) { if (mcb == i->mcb && mdata == i->data) { cblist.erase(i); break; } } } void spot_unregister_recv(spot_recv_cb_t rcb, const void* rdata) { cblist_t::iterator i; callback_t* p = 0; for (i = cblist.begin(); i != cblist.end(); ++i) { if (rcb == i->rcb && rdata == i->data) { p = &*i; cblist.erase(i); break; } } if (!p) return; // remove pointer from rcblist for (rcblist_t::iterator j = rcblist.begin(); j != rcblist.end(); ++j) { for (list::iterator k = j->second.begin(); k != j->second.end(); ++k) { if (*k == p) { j->second.erase(k); if (j->second.empty()) { delete j->first; rcblist.erase(j); } goto out; } } } out: for (i = cblist.begin(); i != cblist.end(); ++i) if (i->rcb) break; show_spot(i != cblist.end()); } fldigi-4.1.06/src/spot/notify.cxx0000664000175000017500000015102313507402064013576 00000000000000// ---------------------------------------------------------------------------- // notify.cxx // // Copyright (C) 2009-2010 // Stelios Bounanos, M0GLD // // Generic notifier // // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "timeops.h" #if HAVE_STD_HASH # define MAP_TYPE std::unordered_map # define HASH_TYPE std::hash # include #else # if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) # define MAP_TYPE std::tr1::unordered_map # include # else // use the non-standard gnu hash_map on gcc <= 4.0.x, // which has a broken tr1::unordered_map::operator= # define MAP_TYPE __gnu_cxx::hash_map # include namespace __gnu_cxx { // define the missing hash specialisation for std::string // using the 'const char*' hash function template<> struct hash { size_t operator()(const std::string& s) const { return __stl_hash_string(s.c_str()); } }; } # endif #endif #include #include #include #ifdef __MINGW32__ # include #endif #include #include #include #include #include #include #include "flinput2.h" #include "flmisc.h" #include "macros.h" #include "debug.h" #include "dxcc.h" #include "spot.h" #include "pskrep.h" #include "logsupport.h" #include "re.h" #include "fileselect.h" #include "icons.h" #include "configuration.h" #include "macroedit.h" #include "main.h" #include "fl_digi.h" #include "waterfall.h" #include "globals.h" #include "trx.h" #include "rsid.h" #include "gettext.h" #include "notifydialog.h" #include "notify.h" #include "qrunner.h" using namespace std; struct notify_action_t { string alert; string rx_marker; string macro; string program; time_t alert_timeout; time_t trigger_limit; }; enum notify_filter_match_t { NOTIFY_FILTER_CALLSIGN, NOTIFY_FILTER_DXCC }; typedef MAP_TYPE notify_filter_dxcc_t; struct notify_filter_t { notify_filter_match_t match; string callsign; notify_filter_dxcc_t dxcc; string dxcc_last; bool nwb, lotw, eqsl; }; struct notify_dup_t { time_t when; band_t band; trx_mode mode; long long freq; }; typedef MAP_TYPE notify_seen_t; enum notify_event_t { NOTIFY_EVENT_MYCALL, NOTIFY_EVENT_STATION, NOTIFY_EVENT_CUSTOM, NOTIFY_EVENT_RSID }; struct notify_t { notify_event_t event; time_t last_trigger; string re; bool enabled; int afreq; long long rfreq; trx_mode mode; const char* match_string; const regmatch_t* submatch_offsets; size_t submatch_length; notify_dup_t dup; bool dup_ignore; size_t dup_ref; notify_seen_t last_seen; notify_action_t action; notify_filter_t filter; }; typedef list notify_list_t; static void notify_init_window(void); static void notify_save(void); static void notify_load(void); static void notify_register(notify_t& n); static void notify_unregister(const notify_t& n); static void notify_set_qsodb_cache(void); static void notify_event_cb(Fl_Widget* w, void* arg); static void notify_select_cb(Fl_Widget* w, void* arg); static void notify_dxcc_browse_cb(Fl_Widget* w, void* arg); static void notify_add_cb(Fl_Widget* w, void* arg); static void notify_remove_cb(Fl_Widget* w, void* arg); static void notify_update_cb(Fl_Widget* w, void* arg); static void notify_dialog_default_cb(Fl_Widget* w, void* arg); static void notify_rx_default_cb(Fl_Widget* w, void* arg); static void notify_macro_edit_cb(Fl_Widget* w, void* arg); static void notify_program_select_cb(Fl_Widget* w, void* arg); static void notify_dxcc_check_cb(Fl_Widget* w, void* arg); static void notify_test_cb(Fl_Widget* w, void* arg); static void notify_filter_dxcc_select_cb(Fl_Widget* w, void* arg); static void notify_filter_dxcc_search(Fl_Widget* w, void* arg); static void notify_dup_ignore_cb(Fl_Widget* w, void* arg); static void notify_re_cb(Fl_Widget* w, void* arg); static void notify_recv(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data); static void notify_table_append(const notify_t& n); //////////////////////////////////////////////////////////////////////////////// struct event_regex_t { const char* regex; size_t index; }; static Fl_Menu_Item notify_event_menu[] = { { _("My callsign de CALL") }, { _("Station heard twice") }, { _("Custom text search") }, { _("RSID reception") }, { 0 } }; #define NOTIFY_SET_DUP_MENU (void*)1 enum { NOTIFY_LIST_MENU_TOGGLE, NOTIFY_LIST_MENU_UPDATE, NOTIFY_LIST_MENU_REMOVE }; static Fl_Menu_Item notify_list_context_menu[] = { { icons::make_icon_label(_("Toggle"), shutdown_icon), 0, notify_update_cb, (void*)NOTIFY_LIST_MENU_TOGGLE }, { icons::make_icon_label(_("Update"), refresh_icon), 0, notify_update_cb, (void*)NOTIFY_LIST_MENU_UPDATE }, { icons::make_icon_label(_("Remove"), minus_icon), 0, notify_remove_cb, (void*)NOTIFY_LIST_MENU_REMOVE }, { 0 } }; enum { NOTIFY_DXCC_SELECT_CONT, NOTIFY_DXCC_SELECT_ITU, NOTIFY_DXCC_SELECT_CQ, NOTIFY_DXCC_SELECT_ALL, NOTIFY_DXCC_DESELECT_CONT, NOTIFY_DXCC_DESELECT_ITU, NOTIFY_DXCC_DESELECT_CQ, NOTIFY_DXCC_DESELECT_ALL }; static Fl_Menu_Item notify_dxcc_context_menu[] = { { _("Select"), 0, 0, 0, FL_SUBMENU }, { _("Continent"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_CONT }, { _("ITU zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ITU }, { _("CQ zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_CQ, FL_MENU_DIVIDER }, { _("All"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ALL }, { 0 }, { _("Deselect"), 0, 0, 0, FL_SUBMENU }, { _("Continent"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_CONT }, { _("ITU zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ITU }, { _("CQ zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_CQ, FL_MENU_DIVIDER }, { _("All"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ALL }, { 0 }, { 0 } }; static event_regex_t event_regex[] = { { ".+de[[:space:]]+()", 1 }, { PSKREP_RE, PSKREP_RE_INDEX }, { "", 0 }, { "", 1 } }; static const char* default_alert_text[] = { "$CALLSIGN is calling you\n $TEXT\nTime: %X %Z (%z)\nMode: $MODEM @ $RF_KHZ KHz", "Heard $CALLSIGN ($COUNTRY)\n $TEXT\nTime: %X %Z (%z)\nMode: $MODEM @ $RF_KHZ KHz", "", "RSID received\nMode: $MODEM @ $RF_KHZ KHz\nTime: %X %Z (%z)", }; static Fl_Menu_Item notify_dup_callsign_menu[] = { { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { 0 } }; static Fl_Menu_Item notify_dup_refs_menu[] = { { "Substring \\0" }, { "Substring \\1" }, { "Substring \\2" }, { "Substring \\3" }, { "Substring \\4" }, { "Substring \\5" }, { "Substring \\6" }, { "Substring \\7" }, { "Substring \\8" }, { "Substring \\9" }, { 0 } }; enum { NOTIFY_DXCC_COL_SEL, NOTIFY_DXCC_COL_CN, NOTIFY_DXCC_COL_CT, NOTIFY_DXCC_COL_ITU, NOTIFY_DXCC_COL_CQ, NOTIFY_DXCC_NUMCOL }; template static T& advli(T& i, int n) { advance(i, n); return i; } template static T advli(T i, U n) { advance(i, n); return i; } static notify_list_t notify_list; static notify_t notify_tmp; static const vector* dxcc_list; Fl_Double_Window* notify_window; Fl_Double_Window* dxcc_window; //////////////////////////////////////////////////////////////////////////////// // public interface //////////////////////////////////////////////////////////////////////////////// void notify_start(void) { if (!notify_window) notify_init_window(); notify_load(); if (!notify_list.empty()) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->enabled) notify_register(*i); tblNotifyList->value(0); tblNotifyList->do_callback(); notify_set_qsodb_cache(); } } void notify_stop(void) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) notify_unregister(*i); notify_list.clear(); notify_set_qsodb_cache(); tblNotifyList->clear(); } void notify_show(void) { if (!notify_window) notify_window = make_notify_window(); notify_window->show(); } // display the dxcc window void notify_dxcc_show(bool readonly) { if (!dxcc_list) return; if (readonly) { btnNotifyDXCCSelect->hide(); btnNotifyDXCCDeselect->hide(); tblNotifyFilterDXCC->callback(Fl_Widget::default_callback); tblNotifyFilterDXCC->menu(0); btnNotifyDXCCDeselect->do_callback(); // deselect all if (dxcc_window->shown()) dxcc_window->hide(); if (dxcc_window->modal()) dxcc_window->set_non_modal(); } else { btnNotifyDXCCSelect->show(); btnNotifyDXCCDeselect->show(); tblNotifyFilterDXCC->callback(notify_dxcc_check_cb); tblNotifyFilterDXCC->menu(notify_dxcc_context_menu); dxcc_window->set_modal(); } dxcc_window->show(); } // called by the myCall callback when the operator callsign is changed void notify_change_callsign(void) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { if (i->event == NOTIFY_EVENT_MYCALL) { // re-register notify_unregister(*i); notify_register(*i); } } } // called by the RSID decoder void notify_rsid(trx_mode mode, int afreq) { const char* mode_name = mode_info[mode].name; regmatch_t sub[2] = { { 0, (regoff_t)strlen(mode_name) } }; sub[1] = sub[0]; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->event == NOTIFY_EVENT_RSID) notify_recv(mode, afreq, mode_name, sub, 2, &*i); } // called by the config dialog when the "notifications only" // rsid option is selected void notify_create_rsid_event(bool val) { if (!val) return; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->event == NOTIFY_EVENT_RSID) return; notify_t rsid_event = { NOTIFY_EVENT_RSID, 0, "", true, 0, 0LL, NUM_MODES, NULL, NULL, 0, { 0, NUM_BANDS, NUM_MODES, 0LL }, false, 0 }; notify_action_t rsid_action = { default_alert_text[NOTIFY_EVENT_RSID], "", "", "", 30, 1 }; rsid_event.action = rsid_action; notify_list.push_back(rsid_event); notify_table_append(notify_list.back()); tblNotifyList->do_callback(); notify_save(); } //////////////////////////////////////////////////////////////////////////////// // misc utility functions //////////////////////////////////////////////////////////////////////////////// static void notify_set_event_dup(const notify_t& n); static void notify_set_event_dup_menu(const char* re); static bool notify_dxcc_row_checked(int i); // return actual regular expression for event n static string notify_get_re(const notify_t& n) { string::size_type pos; string s = n.re; struct { const char* str; const char* rep; } subst[] = { { "", progdefaults.myCall.c_str() }, { "", CALLSIGN_RE } }; for (size_t i = 0; i < sizeof(subst)/sizeof(*subst); i++) if ((pos = s.find(subst[i].str)) != string::npos) s.replace(pos, strlen(subst[i].str), subst[i].rep); return s; } // set the widget values using event n static void notify_event_to_gui(const notify_t& n) { // event mnuNotifyEvent->value(n.event); notify_event_cb(mnuNotifyEvent, 0); if (!n.re.empty() && inpNotifyRE->visible()) inpNotifyRE->value(n.re.c_str()); btnNotifyEnabled->value(n.enabled); // action inpNotifyActionDialog->value(n.action.alert.c_str()); inpNotifyActionRXMarker->value(n.action.rx_marker.c_str()); inpNotifyActionMacro->value(n.action.macro.c_str()); inpNotifyActionProgram->value(n.action.program.c_str()); cntNotifyActionLimit->value(n.action.trigger_limit); cntNotifyActionDialogTimeout->value(n.action.alert_timeout); // dup chkNotifyDupIgnore->value(n.dup_ignore); chkNotifyDupIgnore->do_callback(); notify_set_event_dup(n); cntNotifyDupTime->value(n.dup.when); chkNotifyDupBand->value(n.dup.band); chkNotifyDupMode->value(n.dup.mode); // filter btnNotifyDXCCDeselect->do_callback(); // deselect all if (!grpNotifyFilter->active()) return; chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); inpNotifyFilterCall->value(0); if (n.filter.match == NOTIFY_FILTER_CALLSIGN) { chkNotifyFilterCall->value(1); inpNotifyFilterCall->show(); inpNotifyFilterCall->value(n.filter.callsign.c_str()); } else if (n.filter.match == NOTIFY_FILTER_DXCC) { chkNotifyFilterDXCC->value(1); btnNotifyFilterDXCC->show(); } chkNotifyFilterNWB->value(n.filter.nwb); chkNotifyFilterLOTW->value(n.filter.lotw); chkNotifyFilterEQSL->value(n.filter.eqsl); } // copy widget values to event n static void notify_gui_to_event(notify_t& n) { // event n.event = static_cast(mnuNotifyEvent->value()); n.last_trigger = 0; if (n.event == NOTIFY_EVENT_CUSTOM) n.re = inpNotifyRE->value(); else n.re = event_regex[n.event].regex; n.enabled = btnNotifyEnabled->value(); n.afreq = 0; n.rfreq = 0; n.match_string = 0; n.submatch_offsets = 0; n.submatch_length = 0; // action n.action.alert = inpNotifyActionDialog->value(); n.action.rx_marker = inpNotifyActionRXMarker->value(); n.action.macro = inpNotifyActionMacro->value(); n.action.program = inpNotifyActionProgram->value(); n.action.trigger_limit = static_cast(cntNotifyActionLimit->value()); n.action.alert_timeout = static_cast(cntNotifyActionDialogTimeout->value()); // filter if (chkNotifyFilterCall->value()) { n.filter.callsign = inpNotifyFilterCall->value(); n.filter.match = NOTIFY_FILTER_CALLSIGN; } else if (chkNotifyFilterDXCC->value()) { n.filter.match = NOTIFY_FILTER_DXCC; n.filter.dxcc.clear(); for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) { if (notify_dxcc_row_checked(i)) n.filter.dxcc[tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_CN)] = true; } } n.filter.nwb = chkNotifyFilterNWB->value(); n.filter.lotw = chkNotifyFilterLOTW->value(); n.filter.eqsl = chkNotifyFilterEQSL->value(); // dup n.dup_ignore = chkNotifyDupIgnore->value(); n.dup_ref = mnuNotifyDupWhich->value(); n.dup.when = static_cast(cntNotifyDupTime->value()); n.dup.band = chkNotifyDupBand->value() ? NUM_BANDS : static_cast(0); n.dup.mode = chkNotifyDupMode->value() ? NUM_MODES : static_cast(0); } // initialise the notifications window static void notify_init_window(void) { notify_window = make_notify_window(); notify_window->xclass(PACKAGE_TARNAME); dxcc_window = make_dxcc_window(); dxcc_window->xclass(PACKAGE_TARNAME); struct { Fl_Button* button; const char* label; } buttons[] = { { btnNotifyAdd, icons::make_icon_label(_("Add"), plus_icon) }, { btnNotifyRemove, icons::make_icon_label(_("Remove"), minus_icon) }, { btnNotifyUpdate, icons::make_icon_label(_("Update"), refresh_icon) }, { btnNotifyTest, icons::make_icon_label(_("Test..."), applications_system_icon) }, { btnNotifyClose, icons::make_icon_label(_("Close"), close_icon) }, { btnNotifyDXCCSelect, icons::make_icon_label(_("Select All"), edit_select_all_icon) }, { btnNotifyDXCCDeselect, icons::make_icon_label(_("Clear All"), edit_clear_icon) }, { btnNotifyDXCCClose, icons::make_icon_label(_("Close"), close_icon) }, }; for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { buttons[i].button->label(buttons[i].label); icons::set_icon_label(buttons[i].button); buttons[i].button->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); } struct { Fl_Button* button; const char** icon; } buttons2[] = { { btnNotifyFilterDXCC, text_editor_icon }, { btnNotifyActionDialogDefault, text_icon }, { btnNotifyActionMarkerDefault, text_icon }, { btnNotifyActionMacro, text_editor_icon }, { btnNotifyActionProgram, folder_open_icon } }; for (size_t i = 0; i < sizeof(buttons2)/sizeof(*buttons2); i++) buttons2[i].button->image(new Fl_Pixmap(buttons2[i].icon)); inpNotifyRE->hide(); grpNotifyFilter->deactivate(); mnuNotifyEvent->menu(notify_event_menu); btnNotifyEnabled->value(1); inpNotifyRE->callback(notify_re_cb); int w = (tblNotifyList->w() - Fl::box_dw(tblNotifyList->box())) / 4; struct col_info_t { const char* label; int width; }; col_info_t ncols[] = { { "Event", w + 30 }, { "Filter", w + 30 }, { "Action", w - 30 }, { "Enabled", w - 30 }, }; for (size_t i = 0; i < sizeof(ncols)/sizeof(*ncols); i++) { tblNotifyList->addColumn(ncols[i].label, ncols[i].width, static_cast(FL_ALIGN_CENTER | FL_ALIGN_CLIP)); } tblNotifyList->rowSize(FL_NORMAL_SIZE); tblNotifyList->headerSize(FL_NORMAL_SIZE); tblNotifyList->allowSort(false); tblNotifyList->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED); tblNotifyList->menu(notify_list_context_menu); for (int i = 0; i < notify_list_context_menu->size(); i++) icons::set_icon_label(¬ify_list_context_menu[i]); w = (tblNotifyFilterDXCC->w() - Fl::box_dw(tblNotifyFilterDXCC->box()) - tblNotifyFilterDXCC->scrollbSize()) / NOTIFY_DXCC_NUMCOL; col_info_t dcols[NOTIFY_DXCC_NUMCOL] = { { "", 25 }, { _("Country"), w + w - 25 + 2*(w - 45) }, { _("Continent"), w }, { "ITU", 45 }, { "CQ", 45 } }; for (size_t i = 0; i < NOTIFY_DXCC_NUMCOL; i++) { tblNotifyFilterDXCC->addColumn(dcols[i].label, dcols[i].width, static_cast(FL_ALIGN_CENTER | FL_ALIGN_CLIP), strcmp); } tblNotifyFilterDXCC->columnAlign(NOTIFY_DXCC_COL_CN, static_cast(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); tblNotifyFilterDXCC->rowSize(FL_NORMAL_SIZE); tblNotifyFilterDXCC->headerSize(FL_NORMAL_SIZE); tblNotifyFilterDXCC->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED); tblNotifyFilterDXCC->menu(notify_dxcc_context_menu); btnNotifyDXCCSelect->callback(notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ALL); btnNotifyDXCCDeselect->callback(notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ALL); inpNotifyDXCCSearchCountry->callback(notify_filter_dxcc_search); inpNotifyDXCCSearchCountry->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED | FL_WHEN_ENTER_KEY); inpNotifyDXCCSearchCallsign->callback(notify_filter_dxcc_search); inpNotifyDXCCSearchCallsign->when(FL_WHEN_CHANGED); inpNotifyDXCCSearchCallsign->textfont(FL_HELVETICA); inpNotifyActionDialog->textfont(FL_HELVETICA); inpNotifyActionRXMarker->textfont(FL_HELVETICA); inpNotifyActionMacro->textfont(FL_HELVETICA); inpNotifyActionProgram->textfont(FL_HELVETICA); inpNotifyRE->textfont(FL_HELVETICA); inpNotifyFilterCall->textfont(FL_HELVETICA); tblNotifyList->callback(notify_select_cb); mnuNotifyEvent->callback(notify_event_cb, NOTIFY_SET_DUP_MENU); btnNotifyFilterDXCC->callback(notify_dxcc_browse_cb); btnNotifyAdd->callback(notify_add_cb); btnNotifyRemove->callback(notify_remove_cb); btnNotifyUpdate->callback(notify_update_cb, (void*)NOTIFY_LIST_MENU_UPDATE); btnNotifyActionDialogDefault->callback(notify_dialog_default_cb); btnNotifyActionMarkerDefault->callback(notify_rx_default_cb); btnNotifyActionProgram->callback(notify_program_select_cb); btnNotifyActionMacro->callback(notify_macro_edit_cb); btnNotifyTest->callback(notify_test_cb); tblNotifyFilterDXCC->callback(notify_dxcc_check_cb); chkNotifyDupIgnore->callback(notify_dup_ignore_cb); mnuNotifyDupWhich->menu(notify_dup_refs_menu); chkNotifyFilterCall->value(0); chkNotifyFilterDXCC->value(0); inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->hide(); chkNotifyDupIgnore->value(1); chkNotifyDupIgnore->do_callback(); chkNotifyDupBand->value(1); chkNotifyDupMode->value(1); cntNotifyDupTime->value(3600); mnuNotifyEvent->do_callback(); // for the dup menu dxcc_list = dxcc_entity_list(); if (dxcc_list) { char cq[5], itu[5]; for (vector::const_iterator i = dxcc_list->begin(); i != dxcc_list->end(); ++i) { snprintf(itu, sizeof(itu), "%02d", (*i)->itu_zone); snprintf(cq, sizeof(cq), "%02d", (*i)->cq_zone); tblNotifyFilterDXCC->addRow(NOTIFY_DXCC_NUMCOL, "[x]", (*i)->country, (*i)->continent, itu, cq); } } else { chkNotifyFilterDXCC->deactivate(); btnNotifyFilterDXCC->deactivate(); } unsigned char q = qsl_is_open(); if (!(q & (1 << QSL_LOTW))) chkNotifyFilterLOTW->deactivate(); if (!(q & (1 << QSL_EQSL))) chkNotifyFilterEQSL->deactivate(); } // append event n to the table widget static void notify_table_append(const notify_t& n) { // add to table string fcol, acol; if (n.event == NOTIFY_EVENT_MYCALL) fcol = "My callsign"; else if (n.event == NOTIFY_EVENT_STATION) { if (n.filter.match == NOTIFY_FILTER_CALLSIGN) fcol += "Callsign"; else if (n.filter.match == NOTIFY_FILTER_DXCC) fcol += "DXCC"; } else if (n.event == NOTIFY_EVENT_CUSTOM) fcol = n.re; if (n.filter.nwb) fcol += ", N"; if (n.filter.lotw) fcol += ", L"; if (n.filter.eqsl) fcol += ", E"; if (!n.action.alert.empty()) acol = "A"; if (!n.action.rx_marker.empty()) { if (!acol.empty()) acol += ", "; acol += "RX"; } if (!n.action.macro.empty()) { if (!acol.empty()) acol += ", "; acol += "TX"; } if (!n.action.program.empty()) { if (!acol.empty()) acol += ", "; acol += "P"; } tblNotifyList->addRow(4, notify_event_menu[n.event].label(), fcol.c_str(), acol.c_str(), n.enabled ? "Y" : "N"); tblNotifyList->value(tblNotifyList->rows() - 1); tblNotifyList->redraw(); } // clear and reload the event table static void notify_table_reload(void) { tblNotifyList->clear(); for (notify_list_t::const_iterator i = notify_list.begin(); i != notify_list.end(); ++i) notify_table_append(*i); } //////////////////////////////////////////////////////////////////////////////// // spotter and notification functions //////////////////////////////////////////////////////////////////////////////// static notify_dialog *alert_window = 0; static void notify_goto_freq_cb(Fl_Widget* w, void* arg) { const notify_t* n = static_cast(arg); if (progdefaults.rsid_mark) // mark current modem & freq REQ(note_qrg, false, "\nBefore RSID: ", "\n", active_modem->get_mode(), 0LL, active_modem->get_freq()); if (active_modem->get_mode() != n->mode) init_modem_sync(n->mode); qsy(n->rfreq, n->afreq); if (n->event == NOTIFY_EVENT_RSID && btnRSID->value() && progdefaults.rsid_auto_disable && progdefaults.rsid_notify_only) toggleRSID(); w->parent()->hide(); } static void notify_alert_window_cb(Fl_Widget* w, void* arg) { delete static_cast(arg); w->hide(); } static void notify_show_alert(const notify_t& n, const char* msg) { if (!alert_window) alert_window = new notify_dialog; if (alert_window->visible()) return; Fl_Button* goto_freq = alert_window->make_button(120); if (goto_freq) { char label[32]; snprintf(label, sizeof(label), "Go to %d Hz", n.afreq); goto_freq->copy_label(label); goto_freq->callback(notify_goto_freq_cb, new notify_t(n)); alert_window->callback(notify_alert_window_cb, goto_freq->user_data()); } alert_window->notify(msg, n.action.alert_timeout); REQ(show_notifier, alert_window); } struct replace_refs { enum { REF_MODEM, REF_DF_HZ, REF_RF_HZ, REF_RF_KHZ, REF_AF_HZ, REF_LF_KHZ, REF_CALLSIGN, REF_COUNTRY, REF_MATCHED_TEXT, REF_TEXT }; static void replace_var(const notify_t& n, int t, char* str, size_t len) { switch (t) { case REF_MODEM: strncpy(str, mode_info[n.mode].sname, len-1); str[len - 1] = '\0'; break; case REF_DF_HZ: snprintf(str, len, "%lld", wf->rfcarrier()); break; case REF_RF_HZ: case REF_RF_KHZ: { long long hz = wf->rfcarrier() + (wf->USB() ? n.afreq : -n.afreq); if (t == REF_RF_HZ) snprintf(str, len, "%lld", hz); else // REF_RF_KHZ snprintf(str, len, "%.3f", (double)hz / 1000.0); break; } case REF_AF_HZ: snprintf(str, len, "%d", n.afreq); break; case REF_LF_KHZ: strncpy(str, inpFreq->value(), len-1); str[len - 1] = '\0'; break; case REF_CALLSIGN: if (n.event == NOTIFY_EVENT_MYCALL || n.event == NOTIFY_EVENT_STATION) { stringstream info; info << "\\" << event_regex[n.event].index; strncpy(str, info.str().c_str(), len-1); } break; case REF_COUNTRY: if (n.event == NOTIFY_EVENT_STATION) { strncpy(str, n.filter.dxcc_last.c_str(), len-1); str[len - 1] = '\0'; } break; case REF_MATCHED_TEXT: snprintf(str, len, "\\0"); break; case REF_TEXT: strncpy(str, n.match_string, len-1); str[len - 1] = '\0'; break; } } void operator()(const notify_t& n, string& edit) { char buf[128]; string::size_type p; // replace $VARIABLES const char* vars[] = { "$MODEM", "$DF_HZ", "$RF_HZ", "$RF_KHZ", "$AF_HZ", "$LF_KHZ", "$CALLSIGN", "$COUNTRY", "$MATCHED_TEXT", "$TEXT" }; for (size_t i = 0; i < sizeof(vars)/sizeof(*vars); i++) { if ((p = edit.find(vars[i])) != string::npos) { replace_var(n, i, buf, sizeof(buf)); edit.replace(p, strlen(vars[i]), buf); } } // replace \X refs with regex substrings strcpy(buf, "\\0"); for (size_t i = 0; i < n.submatch_length; i++, buf[1]++) for (p = 0; (p = edit.find(buf, p)) != string::npos; p = 0) edit.replace(p, 2, n.match_string + n.submatch_offsets[i].rm_so, n.submatch_offsets[i].rm_eo - n.submatch_offsets[i].rm_so); } }; // perform the actions for event n static void notify_notify(const notify_t& n) { // show alert window with timeout if (!n.action.alert.empty()) { string alert = n.action.alert; replace_refs()(n, alert); if (alert.find('%') == string::npos) notify_show_alert(n, alert.c_str()); else { // treat alert text as strftime format string size_t len = alert.length() + 256; char* buf = new char[len]; time_t t = time(NULL); struct tm ts; if (localtime_r(&t, &ts) && strftime(buf, len, alert.c_str(), &ts)) notify_show_alert(n, buf); delete [] buf; } } // append to receive text if (!n.action.rx_marker.empty()) { string text = n.action.rx_marker; replace_refs()(n, text); string::size_type p; if ((p = text.find("$RX_MARKER")) != string::npos) { text[p] = '\0'; note_qrg(false, text.c_str(), text.c_str() + p + strlen("$RX_MARKER"), n.mode, 0LL, n.afreq); } else ReceiveText->addstr(text); } // expand macros and append to transmit text if (!n.action.macro.empty()) { MACROTEXT m; m.text[0] = n.action.macro; replace_refs()(n, m.text[0]); m.execute(0); } // define substring & macro variables and run program if (!n.action.program.empty()) { #ifndef __MINGW32__ switch (fork()) { case -1: LOG_PERROR("fork"); // fall through default: break; case 0: #endif char var[] = "FLDIGI_NOTIFY_STR_0"; string val; for (size_t i = 0; i < n.submatch_length; i++, var[sizeof(var) - 2]++) { val.assign(n.match_string + n.submatch_offsets[i].rm_so, n.submatch_offsets[i].rm_eo - n.submatch_offsets[i].rm_so); setenv(var, val.c_str(), 1); if (i == event_regex[n.event].index) setenv("FLDIGI_NOTIFY_CALLSIGN", val.c_str(), 1); } setenv("FLDIGI_NOTIFY_TEXT", n.match_string, 1); unsigned int un = n.submatch_length; snprintf(var, sizeof(var), "%u", un); setenv("FLDIGI_NOTIFY_STR_NUM", var, 1); snprintf(var, sizeof(var), "%d", n.afreq); setenv("FLDIGI_NOTIFY_AUDIO_FREQUENCY", var, 1); snprintf(var, sizeof(var), "%u", (unsigned)n.event); setenv("FLDIGI_NOTIFY_EVENT", var, 1); if (n.event == NOTIFY_EVENT_STATION) setenv("FLDIGI_NOTIFY_COUNTRY", n.filter.dxcc_last.c_str(), 1); set_macro_env(); // also set macro variables #ifdef __MINGW32__ char* cmd = strdup(n.action.program.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); #else execl("/bin/sh", "sh", "-c", n.action.program.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } #endif } } // return true if the event n is a dup static bool notify_is_dup(notify_t& n, const char* str, const regmatch_t* sub, size_t len, time_t now, int afreq, trx_mode mode) { if (!n.dup_ignore) return false; if (n.dup_ref == 0 || n.dup_ref >= len) { stringstream info; info << "Bad dup_ref: " << n.dup_ref << " >= " << len; LOG_ERROR("%s", info.str().c_str()); return false; } const regmatch_t& subidx = sub[n.dup_ref]; string dupstr(subidx.rm_eo - subidx.rm_so, '\0'); transform(str + subidx.rm_so, str + subidx.rm_eo, dupstr.begin(), static_cast(toupper)); notify_dup_t cur = { now, band(wf->rfcarrier()), mode }; if (n.event == NOTIFY_EVENT_RSID) cur.freq = wf->rfcarrier() + (wf->USB() ? afreq : -afreq); notify_seen_t::iterator i; bool is_dup = false; if ((i = n.last_seen.find(dupstr)) != n.last_seen.end()) { const notify_dup_t& prev = i->second; is_dup = (cur.when - prev.when < n.dup.when); if (n.event == NOTIFY_EVENT_RSID) is_dup = is_dup && ::llabs(cur.freq - prev.freq) <= ceil(RSID_PRECISION); if (n.dup.band) is_dup = is_dup && cur.band == prev.band; if (n.dup.mode) is_dup = is_dup && cur.mode == prev.mode; } if (is_dup) return true; n.last_seen[dupstr] = cur; if (n.last_seen.size() > 1) { // remove old data for (i = n.last_seen.begin(); i != n.last_seen.end();) { if (now - i->second.when > n.dup.when) n.last_seen.erase(i++); else ++i; } } return false; } static fre_t notify_filter_call_re("", REG_EXTENDED | REG_NOSUB | REG_ICASE); // Called by the spotter when an event's regular expression matches the decoded text. // Also called by notify_rsid for RSID recepction with: the frequency in afreq, // the mode name in str, the str bounds in the sub array, and len = 1. static void notify_recv(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data) { notify_t* n = reinterpret_cast(data); time_t now = time(0); // check if we may trigger this event if (!n->enabled || now - n->last_trigger < n->action.trigger_limit) return; switch (n->event) { case NOTIFY_EVENT_MYCALL: case NOTIFY_EVENT_CUSTOM: case NOTIFY_EVENT_RSID: break; case NOTIFY_EVENT_STATION: size_t re_idx = event_regex[n->event].index; string call(str + sub[re_idx].rm_so, sub[re_idx].rm_eo - sub[re_idx].rm_so); const dxcc* e = dxcc_lookup(call.c_str()); if (n->filter.match == NOTIFY_FILTER_CALLSIGN) { if (e) // remember the country name we found n->filter.dxcc_last = e->country; if (!n->filter.callsign.empty()) { // the callsign must match if (notify_filter_call_re.re() != n->filter.callsign) // compile new re notify_filter_call_re.recompile(n->filter.callsign.c_str()); if (!notify_filter_call_re.match(call.c_str())) return; } else { // check for nwb, lotw, eqsl if (n->filter.nwb && SearchLog(call.c_str())) return; if ((n->filter.lotw || n->filter.eqsl) && qsl_is_open() && !(qsl_lookup(call.c_str()) & (1 << QSL_LOTW | 1 << QSL_EQSL))) return; } } else if (n->filter.match == NOTIFY_FILTER_DXCC) { if (e) { n->filter.dxcc_last = e->country; // if the dxcc filter is not empty, it must contain the country for call if (!n->filter.dxcc.empty() && n->filter.dxcc.find(e->country) == n->filter.dxcc.end()) return; if (n->filter.nwb && qsodb_dxcc_entity_find(e->country)) return; } if ((n->filter.lotw || n->filter.eqsl) && qsl_is_open() && !(qsl_lookup(call.c_str()) & (1 << QSL_LOTW | 1 << QSL_EQSL))) return; } break; } if (!notify_is_dup(*n, str, sub, len, now, afreq, mode)) { n->last_trigger = now; n->afreq = afreq; n->rfreq = wf->rfcarrier(); n->mode = mode; n->match_string = str; n->submatch_offsets = sub; n->submatch_length = min(len, (size_t)10); // whole string + up to 9 user-specified backrefs std::cout << "trigger: " << n->last_trigger << "\n" << "audio freq: " << n->afreq << "\n" << "rf carrier: " << n->rfreq << "\n" << "mode #: " << n->mode << "\n" << "mode: " << mode_info[n->mode].name << "\n" << "match: " << n->match_string << "\n" << "offsets: " << n->submatch_offsets << "\n" << "length: " << n->submatch_length << std::endl; notify_notify(*n); } } static void notify_set_qsodb_cache(void) { bool v = false; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { if (i->event == NOTIFY_EVENT_STATION && i->filter.match == NOTIFY_FILTER_DXCC && i->enabled) { v = true; break; } } dxcc_entity_cache_enable(v); } // register event n with the spotter static void notify_register(notify_t& n) { if (n.event != NOTIFY_EVENT_RSID) spot_register_recv(notify_recv, &n, notify_get_re(n).c_str(), REG_EXTENDED | REG_ICASE); } // unregister event n static void notify_unregister(const notify_t& n) { if (n.event != NOTIFY_EVENT_RSID) spot_unregister_recv(notify_recv, &n); } //////////////////////////////////////////////////////////////////////////////// // callbacks //////////////////////////////////////////////////////////////////////////////// // the event table callback static void notify_select_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v >= 0) notify_event_to_gui(notify_tmp = *advli(notify_list.begin(), v)); } // the remove button/menu item callback static void notify_remove_cb(Fl_Widget* w, void*) { int v = tblNotifyList->value(); if (v < 0) return; // unregister notify_unregister(*advli(notify_list.begin(), v)); // remove from list notify_list.erase(advli(notify_list.begin(), v)); // remove from table tblNotifyList->removeRow(tblNotifyList->value()); // select next row if (w == btnNotifyRemove) { if (v >= tblNotifyList->rows()) v = tblNotifyList->rows() - 1; if (v >= 0) { tblNotifyList->value(v); notify_select_cb(tblNotifyList, 0); } } notify_save(); } enum { NOTIFY_CHECK_CUSTOM_RE_EMPTY = 1 << 0, NOTIFY_CHECK_CUSTOM_RE_VALID = 1 << 1, NOTIFY_CHECK_MYCALL_NOT_EMPTY = 1 << 2 }; // do some sanity checks on the widget values before adding/updating an event static bool notify_check(unsigned check) { if (mnuNotifyEvent->value() == NOTIFY_EVENT_CUSTOM) { if (check & NOTIFY_CHECK_CUSTOM_RE_EMPTY) { if (!inpNotifyRE->size()) { fl_alert2(_("The regular expression field must not be empty.")); return false; } } if (check & NOTIFY_CHECK_CUSTOM_RE_VALID) { if (!fre_t(inpNotifyRE->value(), REG_EXTENDED | REG_ICASE)) { fl_alert2(_("The regular expression must be valid.")); return false; } } } if ((check & NOTIFY_CHECK_MYCALL_NOT_EMPTY) && mnuNotifyEvent->value() == NOTIFY_EVENT_MYCALL) { if (progdefaults.myCall.empty()) { fl_alert2(_("Please set your callsign first.")); return false; } } // ... return true; } // the add button callback static void notify_add_cb(Fl_Widget* w, void* arg) { if (!notify_check(~0)) return; notify_gui_to_event(notify_tmp); // add to list notify_list.push_back(notify_tmp); // add to table notify_table_append(notify_list.back()); // register with spotter notify_register(notify_list.back()); // save file notify_save(); } // the update button/menu item callback static void notify_update_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v < 0) return; if (!notify_check(~0)) return; notify_t& nv = *advli(notify_list.begin(), v); if ((intptr_t)arg != NOTIFY_LIST_MENU_TOGGLE) { notify_gui_to_event(notify_tmp); nv = notify_tmp; if (nv.dup_ignore) nv.last_seen.clear(); } else { // only toggle the enabled status nv.enabled = !nv.enabled; btnNotifyEnabled->value(nv.enabled); } if (!nv.enabled) notify_unregister(nv); else { notify_unregister(nv); notify_register(nv); } notify_table_reload(); tblNotifyList->value(v); notify_save(); } // the event selection menu callback static void notify_event_cb(Fl_Widget* w, void* arg) { notify_event_t e = static_cast(reinterpret_cast(w)->value()); switch (e) { case NOTIFY_EVENT_MYCALL: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); break; case NOTIFY_EVENT_STATION: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->activate(); if (!chkNotifyFilterCall->value() && !chkNotifyFilterDXCC->value()) { chkNotifyFilterCall->value(1); inpNotifyFilterCall->show(); } inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); break; case NOTIFY_EVENT_CUSTOM: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->show(); break; case NOTIFY_EVENT_RSID: grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); // limited dup handling mnuNotifyDupWhich->deactivate(); chkNotifyDupBand->value(0); chkNotifyDupBand->deactivate(); chkNotifyDupMode->value(1); chkNotifyDupMode->deactivate(); break; } if (arg == NOTIFY_SET_DUP_MENU) { notify_gui_to_event(notify_tmp); notify_set_event_dup(notify_tmp); } w->parent()->redraw(); } // the program filesystem browse button callback static void notify_program_select_cb(Fl_Widget* w, void* arg) { const char* fn = FSEL::select(_("Run program"), "", 0, 0); if (!fn) return; if (!*fn) return; inpNotifyActionProgram->value(fn); // quote program path inpNotifyActionProgram->position(0); inpNotifyActionProgram->insert("\"", 1); inpNotifyActionProgram->position(inpNotifyActionProgram->size()); inpNotifyActionProgram->insert("\"", 1); } // the test button callback static void notify_test_cb(Fl_Widget* w, void* arg) { notify_gui_to_event(notify_tmp); if (notify_tmp.event == NOTIFY_EVENT_RSID) { notify_tmp.mode = active_modem->get_mode(); regmatch_t sub[2] = { { 0, (regoff_t)strlen(mode_info[notify_tmp.mode].name) } }; sub[1] = sub[0]; notify_recv(notify_tmp.mode, active_modem->get_freq(), mode_info[notify_tmp.mode].name, sub, 2, ¬ify_tmp); return; } string test_strings[3]; test_strings[NOTIFY_EVENT_MYCALL].assign(progdefaults.myCall).append(" de n0call"); test_strings[NOTIFY_EVENT_STATION] = "cq de n0call n0call "; static string test; if (test.empty()) test = test_strings[notify_tmp.event]; string msg; msg.assign(_("Default test string is:\n \"")).append(test_strings[notify_tmp.event]).append("\"\n") .append(_("Enter test string or leave blank for default:")); const char* s = fl_input2("%s", msg.c_str(), test.c_str()); if (s) { if (test.assign(s).empty()) // empty input test = test_strings[notify_tmp.event]; } else // cancelled return; fre_t re(notify_get_re(notify_tmp).c_str(), REG_EXTENDED | REG_ICASE); if (!re) fl_alert2(_("This event's regular expression is invalid.")); else if (re.match(test.c_str())) { const vector& o = re.suboff(); notify_recv(active_modem->get_mode(), active_modem->get_freq(), test.c_str(), &o[0], o.size(), ¬ify_tmp); } else fl_message2(_("The test string did not match this event's search pattern.")); } // the macro editor button callback static void notify_macro_edit_cb(Fl_Widget* w, void* arg) { editMacro(0, MACRO_EDIT_INPUT, inpNotifyActionMacro); } // the insert default alert text button callback static void notify_dialog_default_cb(Fl_Widget* w, void* arg) { size_t i = CLAMP((size_t)mnuNotifyEvent->value(), 0, sizeof(default_alert_text)/sizeof(*default_alert_text) - 1); string s = default_alert_text[i]; if (s.empty()) { // custom search; count and list refs size_t nsub = min(fre_t(inpNotifyRE->value(), REG_EXTENDED | REG_ICASE).nsub(), (size_t)9); if (nsub) { s.assign(_("Available substrings")).append(":\n\\0\n"); char ref[] = "\\1"; for (size_t i = 1; i < nsub; i++, ref[1]++) s.append(ref).append("\n"); } } inpNotifyActionDialog->value(s.c_str()); } // the insert default RX text button callback static void notify_rx_default_cb(Fl_Widget* w, void* arg) { if (mnuNotifyEvent->value() == NOTIFY_EVENT_RSID) inpNotifyActionRXMarker->value("\nRSID: $RX_MARKER\n"); else inpNotifyActionRXMarker->value("\n$RX_MARKER\n"); } // the ignore duplicates check button callback void notify_dup_ignore_cb(Fl_Widget* w, void* arg) { if (static_cast(w)->value()) { mnuNotifyDupWhich->show(); cntNotifyDupTime->show(); chkNotifyDupBand->show(); chkNotifyDupMode->show(); } else { mnuNotifyDupWhich->hide(); cntNotifyDupTime->hide(); chkNotifyDupBand->hide(); chkNotifyDupMode->hide(); } w->parent()->redraw(); } // the custom re field callback static void notify_re_cb(Fl_Widget* w, void* arg) { notify_set_event_dup_menu(static_cast(w)->value()); } //////////////////////////////////////////////////////////////////////////////// // dup widget handling //////////////////////////////////////////////////////////////////////////////// // set the dup menu substrings for regular epxression string re static void notify_set_event_dup_menu(const char* re) { int v = mnuNotifyDupWhich->value(); size_t nref = fre_t(re, REG_EXTENDED).nsub(); for (size_t i = 0; i < sizeof(notify_dup_refs_menu)/sizeof(*notify_dup_refs_menu); i++) notify_dup_refs_menu[i].hide(); if (nref) { size_t i; for (i = 1; i < nref; i++) notify_dup_refs_menu[i].show(); if ((size_t)v == nref) v = mnuNotifyDupWhich->size() - 1; else v = 1; } else v = 0; mnuNotifyDupWhich->value(v); mnuNotifyDupWhich->redraw(); } // set the dup group widgets for event n static void notify_set_event_dup(const notify_t& n) { size_t i; for (i = 0; i < sizeof(notify_dup_refs_menu)/sizeof(*notify_dup_refs_menu); i++) notify_dup_refs_menu[i].hide(); switch (n.event) { case NOTIFY_EVENT_MYCALL: case NOTIFY_EVENT_STATION: case NOTIFY_EVENT_RSID: i = event_regex[n.event].index; mnuNotifyDupWhich->menu(notify_dup_callsign_menu); for (size_t j = 0; j < sizeof(notify_dup_callsign_menu)/sizeof(*notify_dup_callsign_menu) - 1; j++) notify_dup_callsign_menu[j].hide(); notify_dup_callsign_menu[i].show(); if (n.event == NOTIFY_EVENT_RSID) notify_dup_callsign_menu[i].label(_("Frequency")); else notify_dup_callsign_menu[i].label(_("Callsign")); mnuNotifyDupWhich->value(i); break; case NOTIFY_EVENT_CUSTOM: mnuNotifyDupWhich->menu(notify_dup_refs_menu); notify_set_event_dup_menu(notify_get_re(n).c_str()); break; } } //////////////////////////////////////////////////////////////////////////////// // DXCC list //////////////////////////////////////////////////////////////////////////////// // set the toggle status of row i to cond static void notify_dxcc_row_check(int i, bool cond = true) { *tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL) = "["[!cond]; } // toggle the checked status of row i, return new status static bool notify_dxcc_row_toggle(int i) { char* p = tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL); return (*p = "["[!!*p]); } // return checked status of row i static bool notify_dxcc_row_checked(int i) { return *tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL); } // the dxcc list select/deselect callback static void notify_filter_dxcc_select_cb(Fl_Widget* w, void* arg) { bool val; const char* str; int row = tblNotifyFilterDXCC->value(); int col; intptr_t iarg = (intptr_t)arg; switch (iarg) { case NOTIFY_DXCC_SELECT_CONT: case NOTIFY_DXCC_DESELECT_CONT: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_CT); val = (iarg == NOTIFY_DXCC_SELECT_CONT); break; case NOTIFY_DXCC_SELECT_ITU: case NOTIFY_DXCC_DESELECT_ITU: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_ITU); val = (iarg == NOTIFY_DXCC_SELECT_ITU); break; case NOTIFY_DXCC_SELECT_CQ: case NOTIFY_DXCC_DESELECT_CQ: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_CQ); val = (iarg == NOTIFY_DXCC_SELECT_CQ); break; case NOTIFY_DXCC_SELECT_ALL: for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i); goto redraw; case NOTIFY_DXCC_DESELECT_ALL: for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i, false); goto redraw; default: return; } for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) { if (!strcmp(tblNotifyFilterDXCC->valueAt(i, col), str)) notify_dxcc_row_check(i, val); } redraw: tblNotifyFilterDXCC->redraw(); } // the dxcc search field callback static void notify_filter_dxcc_search(Fl_Widget* w, void* arg) { if (w == inpNotifyDXCCSearchCallsign) { const dxcc* e = dxcc_lookup(inpNotifyDXCCSearchCallsign->value()); if (e) { inpNotifyDXCCSearchCountry->value(e->country); inpNotifyDXCCSearchCountry->do_callback(); inpNotifyDXCCSearchCountry->position(0); } return; } if (unlikely(!inpNotifyDXCCSearchCountry->size())) return; int col = 1, row = tblNotifyFilterDXCC->value() + 1; row = WCLAMP(row, 0, tblNotifyFilterDXCC->rows() - 1); if (tblNotifyFilterDXCC->search(row, col, false, inpNotifyDXCCSearchCountry->value())) { int when = tblNotifyFilterDXCC->when(); tblNotifyFilterDXCC->when(FL_WHEN_NEVER); tblNotifyFilterDXCC->GotoRow(row); tblNotifyFilterDXCC->when(when); inpNotifyDXCCSearchCountry->textcolor(FL_FOREGROUND_COLOR); } else inpNotifyDXCCSearchCountry->textcolor(FL_RED); inpNotifyDXCCSearchCountry->redraw(); } // the dxcc filter selection button callback static void notify_dxcc_browse_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v < 0) // no selection, uncheck all rows btnNotifyDXCCDeselect->do_callback(); else { const notify_t& n = *advli(notify_list.begin(), v); for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i, n.filter.dxcc.find(tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_CN)) != n.filter.dxcc.end()); } notify_dxcc_show(false); } // the dxcc table callback static void notify_dxcc_check_cb(Fl_Widget* w, void* arg) { if (Fl::event_button() != FL_LEFT_MOUSE || (Fl::event() == FL_KEYDOWN && !Fl::event_shift())) return; int sel = tblNotifyFilterDXCC->value(); const char* country = tblNotifyFilterDXCC->valueAt(sel, NOTIFY_DXCC_COL_CN); if (notify_dxcc_row_toggle(sel)) notify_tmp.filter.dxcc[country] = true; else notify_tmp.filter.dxcc.erase(country); } //////////////////////////////////////////////////////////////////////////////// // storage functions //////////////////////////////////////////////////////////////////////////////// // save the event list static void notify_save(void) { notify_set_qsodb_cache(); remove(string(HomeDir).append("/").append("notify.prefs").c_str()); Fl_Preferences ndata(HomeDir.c_str(), PACKAGE_TARNAME, "notify"); ndata.set("items", static_cast(notify_list.size())); size_t num = 0; stringstream group; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { group << "item" << num++; ndata.set(Fl_Preferences::Name("%s/event", group.str().c_str()), i->event); if (i->event >= NOTIFY_EVENT_CUSTOM) ndata.set(Fl_Preferences::Name("%s/re", group.str().c_str()), i->re.c_str()); ndata.set(Fl_Preferences::Name("%s/enabled", group.str().c_str()), i->enabled); ndata.set(Fl_Preferences::Name("%s/action/alert", group.str().c_str()), i->action.alert.c_str()); ndata.set(Fl_Preferences::Name("%s/action/rx_marker", group.str().c_str()), i->action.rx_marker.c_str()); ndata.set(Fl_Preferences::Name("%s/action/macro", group.str().c_str()), i->action.macro.c_str()); ndata.set(Fl_Preferences::Name("%s/action/program", group.str().c_str()), i->action.program.c_str()); ndata.set(Fl_Preferences::Name("%s/action/trigger_limit", group.str().c_str()), static_cast(i->action.trigger_limit)); ndata.set(Fl_Preferences::Name("%s/action/alert_timeout", group.str().c_str()), static_cast(i->action.alert_timeout)); ndata.set(Fl_Preferences::Name("%s/filter/match", group.str().c_str()), i->filter.match); ndata.set(Fl_Preferences::Name("%s/filter/callsign", group.str().c_str()), i->filter.callsign.c_str()); ndata.set(Fl_Preferences::Name("%s/filter/nwb", group.str().c_str()), i->filter.nwb); ndata.set(Fl_Preferences::Name("%s/filter/lotw", group.str().c_str()), i->filter.lotw); ndata.set(Fl_Preferences::Name("%s/filter/eqsl", group.str().c_str()), i->filter.eqsl); int k = 0; for (notify_filter_dxcc_t::const_iterator j = i->filter.dxcc.begin(); j != i->filter.dxcc.end() && j->second; ++j) { ndata.set(Fl_Preferences::Name("%s/filter/dxcc/%d", group.str().c_str(), k++), j->first.c_str()); } ndata.set(Fl_Preferences::Name("%s/dup/ignore", group.str().c_str()), i->dup_ignore); ndata.set(Fl_Preferences::Name("%s/dup/ref", group.str().c_str()), static_cast(i->dup_ref)); ndata.set(Fl_Preferences::Name("%s/dup/when", group.str().c_str()), static_cast(i->dup.when)); ndata.set(Fl_Preferences::Name("%s/dup/band", group.str().c_str()), i->dup.band); ndata.set(Fl_Preferences::Name("%s/dup/mode", group.str().c_str()), static_cast(i->dup.mode)); } } // load the event list static void notify_load(void) { int x; char s[512]; s[sizeof(s)-1] = '\0'; Fl_Preferences ndata(HomeDir.c_str(), PACKAGE_TARNAME, "notify"); if (!ndata.get("items", x, 0) || x <= 0) return; size_t n = static_cast(x); stringstream group; for (size_t i = 0; i < n; i++) { notify_t nitem; group << "item" << i; ndata.get(Fl_Preferences::Name("%s/event", group.str().c_str()), x, 0); nitem.event = static_cast(x); nitem.last_trigger = 0; if (nitem.event >= NOTIFY_EVENT_CUSTOM) { ndata.get(Fl_Preferences::Name("%s/re", group.str().c_str()), s, "", sizeof(s)-1); nitem.re = s; } else nitem.re = event_regex[nitem.event].regex; ndata.get(Fl_Preferences::Name("%s/enabled", group.str().c_str()), x, 1); nitem.enabled = x; ndata.get(Fl_Preferences::Name("%s/action/alert", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.alert = s; ndata.get(Fl_Preferences::Name("%s/action/macro", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.macro = s; ndata.get(Fl_Preferences::Name("%s/action/rx_marker", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.rx_marker = s; ndata.get(Fl_Preferences::Name("%s/action/program", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.program = s; ndata.get(Fl_Preferences::Name("%s/action/trigger_limit", group.str().c_str()), x, 0); nitem.action.trigger_limit = x; ndata.get(Fl_Preferences::Name("%s/action/alert_timeout", group.str().c_str()), x, 5); nitem.action.alert_timeout = x; ndata.get(Fl_Preferences::Name("%s/filter/match", group.str().c_str()), x, 0); nitem.filter.match = static_cast(x); ndata.get(Fl_Preferences::Name("%s/filter/callsign", group.str().c_str()), s, "", sizeof(s)-1); nitem.filter.callsign = s; ndata.get(Fl_Preferences::Name("%s/filter/nwb", group.str().c_str()), x, 0); nitem.filter.nwb = x; ndata.get(Fl_Preferences::Name("%s/filter/lotw", group.str().c_str()), x, 0); nitem.filter.lotw = x; ndata.get(Fl_Preferences::Name("%s/filter/eqsl", group.str().c_str()), x, 0); nitem.filter.eqsl = x; for (int k = 0; ndata.get(Fl_Preferences::Name("%s/filter/dxcc/%d", group.str().c_str(), k), s, "", sizeof(s)-1); k++) nitem.filter.dxcc[s] = true; ndata.get(Fl_Preferences::Name("%s/dup/ignore", group.str().c_str()), x, 0); nitem.dup_ignore = x; ndata.get(Fl_Preferences::Name("%s/dup/ref", group.str().c_str()), x, 0); nitem.dup_ref = x; ndata.get(Fl_Preferences::Name("%s/dup/when", group.str().c_str()), x, 600); nitem.dup.when = x; ndata.get(Fl_Preferences::Name("%s/dup/band", group.str().c_str()), x, 0); nitem.dup.band = static_cast(x); ndata.get(Fl_Preferences::Name("%s/dup/mode", group.str().c_str()), x, 0); nitem.dup.mode = static_cast(x); notify_list.push_back(nitem); } notify_table_reload(); } fldigi-4.1.06/src/spot/pskrep.cxx0000644000175000017500000006467213472115776013621 00000000000000// ---------------------------------------------------------------------------- // pskrep.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This is a client for N1DQ's PSK Automatic Propagation Reporter // (see http://pskreporter.info/). Philip Gladstone, N1DQ, is // thanked for his helpful explanation of the protocol. // // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #if HAVE_SYS_UTSNAME_H # include #endif #include #if HAVE_ARPA_INET_H # include #endif #include #include #include #include #include #include #include #include #include #if GCC_VER_OK # if HAVE_STD_HASH # define MAP_TYPE std::unordered_map # define HASH_TYPE std::hash # include # else # if HAVE_STD_TR1_HASH # define MAP_TYPE std::tr1::unordered_map # define HASH_TYPE std::tr1::hash # include # endif # endif #else // use the non-standard gnu hash_map on gcc < 4.1.0 // which has a broken tr1::unordered_map::operator= # define MAP_TYPE __gnu_cxx::hash_map # define HASH_TYPE __gnu_cxx::hash # include namespace __gnu_cxx { // define the missing hash specialisation for std::string // using the 'const char*' hash function template<> struct hash { size_t operator()(const std::string& s) const { return __stl_hash_string(s.c_str()); } }; } #endif #include #include "socket.h" #include "re.h" #include "debug.h" #include "util.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "configuration.h" #include "globals.h" #include "spot.h" #include "pskrep.h" LOG_FILE_SOURCE(debug::LOG_SPOTTER); //------------------------------------------------------------------------------ #include "threads.h" static pthread_mutex_t pskrep_mutex = PTHREAD_MUTEX_INITIALIZER; //------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------- // Try to flush the report queue every SEND_INTERVAL seconds. #define SEND_INTERVAL 300 // Ignore reports that are less than DUP_INTERVAL seconds older than // a previously sent report for the same callsign and frequency band. // Sent reports are also garbage-collected after DUP_INTERVAL seconds. #define DUP_INTERVAL 1800 // The first TEMPLATE_THRESHOLD packets will contain the long templates; // the next TEMPLATE_THRESHOLD packets will include the short templates #define TEMPLATE_THRESHOLD 3 // Resend short templates every TEMPLATE_INTERVAL seconds #define TEMPLATE_INTERVAL 1800 // Maximum send size #define DGRAM_MAX (1500-14-24-8) #define PSKREP_QUEUE_FILE "pskrqueue.txt" #define PSKREP_ID_FILE "pskrkey.txt" // ------------------------------------------------------------------------------------------------- using namespace std; enum status_t { PSKR_STATUS_NEW, PSKR_STATUS_PENDING, PSKR_STATUS_SENT }; enum rtype_t { PSKREP_AUTO = 1, PSKREP_LOG = 2, PSKREP_MANUAL = 3 }; struct rcpt_report_t { rcpt_report_t(trx_mode m = 0, long long f = 0, time_t t = 0, rtype_t p = PSKREP_AUTO, string loc = "") : mode(m), freq(f), rtime(t), rtype(p), status(PSKR_STATUS_NEW), locator(loc) { } trx_mode mode; long long freq; time_t rtime; rtype_t rtype; status_t status; string locator; }; // A band_map_t holds a list of reception reports (for a particular callsign and band) typedef deque band_map_t; // A call_map_t holds reception reports for a particular callsign typedef MAP_TYPE > call_map_t; // A container of this type holds all reception reports, sorted by callsign and band typedef MAP_TYPE queue_t; class pskrep_sender { public: pskrep_sender(const string& call, const string& loc, const string& ant, const string& host_, const string& port_, const string& long_id_, const string& short_id_); ~pskrep_sender(); bool append(const string& callsign, const band_map_t::value_type& r); bool send(void); private: void write_station_info(void); void write_preamble(void); string recv_callsign, recv_locator, recv_antenna; string host, port; string long_id, short_id; static const unsigned char long_station_info_template[]; static const unsigned char short_station_info_template[]; static const unsigned char rcpt_record_template[]; vector long_station_info; vector short_station_info; //uint32_t identifier; uint32_t sequence_number; unsigned template_count; time_t last_template; Socket* send_socket; unsigned char* dgram; size_t dgram_size; size_t report_offset; void create_socket(void); pthread_t resolver_thread; static void* resolver(void* obj); static const char hexsym[]; static size_t pad(size_t len, size_t mult); }; class pskrep { public: pskrep(const string& call, const string& loc, const string& ant, const string& host, const string& port, const string& long_id, const string& short_id, bool reg_auto, bool reg_log, bool reg_manual); ~pskrep(); static void recv(trx_mode mode, int afreq, const char* str, const regmatch_t* calls, size_t len, void* obj); static void log(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj); static void manual(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj); bool progress(void); unsigned count(void) { return new_count; } static fre_t locator_re; private: void append(string call, const char* loc, long long freq, trx_mode mode, time_t rtime, rtype_t rtype); void gc(void); void load_queue(void); void save_queue(void); static bool not_sent(const band_map_t::value_type& r) { return r.status != PSKR_STATUS_SENT; } queue_t queue; pskrep_sender sender; unsigned new_count; }; fre_t pskrep::locator_re("[a-r]{2}[0-9]{2}[a-x]{2}", REG_EXTENDED | REG_NOSUB | REG_ICASE); #define SHORT_ID_SIZE 4 #define LONG_ID_SIZE 8 // ------------------------------------------------------------------------------------------------- static string error_string; static bool pskrep_check(void) { struct { const string* var; const char* msg; } check[] = { { &progdefaults.myCall, "callsign" }, { &progdefaults.myLocator, "locator" }, { &progdefaults.myAntenna, "antenna info" }, }; for (size_t i = 0; i < sizeof(check)/sizeof(*check); i++) { if (check[i].var->empty()) { error_string.assign("Error: missing ").append(check[i].msg); return false; } } if (!pskrep::locator_re.match(progdefaults.myLocator.c_str())) { error_string = "Error: bad Maidenhead locator\ncheck Configure->Operator->Locator"; return false; } return true; } const char* pskrep_error(void) { return error_string.c_str(); } static void pskrep_progress(void* obj) { if (reinterpret_cast(obj)->progress()) Fl::add_timeout(SEND_INTERVAL, pskrep_progress, obj); else pskrep_stop(); } static void pskrep_make_id(string& id, size_t len) { id.resize(len); ifstream f("/dev/urandom"); if (f) { for (size_t i = 0; i < len; i++) while ((id[i] = f.get()) != EOF && !isgraph(id[i])); f.close(); } else { unsigned seed = time(NULL); if (!progdefaults.myCall.empty()) seed ^= simple_hash_str((const unsigned char*)progdefaults.myCall.c_str()); srand(seed); for (size_t i = 0; i < len; i++) while (!isgraph(id[i] = rand() % 0x7F)); } } static pskrep* pskr = 0; bool pskrep_start(void) { if (pskr) return true; else if (!pskrep_check()) return false; // get identifier string fname = TempDir; fname.append(PSKREP_ID_FILE); ifstream in(fname.c_str()); string long_id, short_id; if (in) in >> long_id >> short_id; if (!in || in.eof()) { in.close(); pskrep_make_id(long_id, LONG_ID_SIZE); pskrep_make_id(short_id, SHORT_ID_SIZE); ofstream out(fname.c_str()); if (out) out << long_id << ' ' << short_id << '\n'; else LOG_ERROR("Could not write identifiers (\"%s\", \"%s\") to %s", long_id.c_str(), short_id.c_str(), fname.c_str()); } pskr = new pskrep(progdefaults.myCall, progdefaults.myLocator, progdefaults.myAntenna, progdefaults.pskrep_host, progdefaults.pskrep_port, long_id, short_id, progdefaults.pskrep_auto, progdefaults.pskrep_log, true); Fl::add_timeout(SEND_INTERVAL, pskrep_progress, pskr); return true; } void pskrep_stop(void) { Fl::remove_timeout(pskrep_progress, pskr); delete pskr; pskr = 0; } unsigned pskrep_count(void) { return pskr ? pskr->count() : 0; } // ------------------------------------------------------------------------------------------------- pskrep::pskrep(const string& call, const string& loc, const string& ant, const string& host, const string& port, const string& long_id, const string& short_id, bool reg_auto, bool reg_log, bool reg_manual) : sender(call, loc, ant, host, port, long_id, short_id), new_count(0) { if (reg_auto) spot_register_recv(pskrep::recv, this, PSKREP_RE, REG_EXTENDED | REG_ICASE); if (reg_log) spot_register_log(pskrep::log, this); if (reg_manual) spot_register_manual(pskrep::manual, this); load_queue(); } pskrep::~pskrep() { spot_unregister_recv(pskrep::recv, this); spot_unregister_log(pskrep::log, this); spot_unregister_manual(pskrep::manual, this); save_queue(); } // This function is called by spot_recv() when its buffer matches our PSKREP_RE void pskrep::recv(trx_mode mode, int afreq, const char* str, const regmatch_t* calls, size_t len, void* obj) { if (unlikely(calls[PSKREP_RE_INDEX].rm_so == -1 || calls[PSKREP_RE_INDEX].rm_eo == -1)) return; string call(str + calls[PSKREP_RE_INDEX].rm_so, calls[PSKREP_RE_INDEX].rm_eo - calls[PSKREP_RE_INDEX].rm_so); long long freq = afreq; if (!wf->USB()) freq = -freq; freq += wf->rfcarrier(); LOG_DEBUG("Spotted \"%s\" in buffer \"%s\"", call.c_str(), str); reinterpret_cast(obj)->append(call.c_str(), "", freq, active_modem->get_mode(), time(NULL), PSKREP_AUTO); } // This function is called by spot_log() void pskrep::log(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj) { reinterpret_cast(obj)->append(call, loc, freq, mode, rtime, PSKREP_LOG); } // This function is called by spot_manual() void pskrep::manual(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj) { reinterpret_cast(obj)->append(call, loc, freq, mode, rtime, PSKREP_MANUAL); } void pskrep::append(string call, const char* loc, long long freq, trx_mode mode, time_t rtime, rtype_t rtype) { if (unlikely(call.empty())) return; transform(call.begin(), call.end(), call.begin(), static_cast(toupper)); if (!progdefaults.pskrep_qrg) freq = 0LL; if (*loc && !locator_re.match(loc)) loc = ""; band_map_t& bandq = queue[call][band(freq)]; if (bandq.empty() || rtime - bandq.back().rtime >= DUP_INTERVAL) { // add new bandq.push_back(rcpt_report_t(mode, freq, rtime, rtype, loc)); LOG_VERBOSE("Added (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%d, type=%u)", call.c_str(), loc, mode_info[mode].adif_name, static_cast(freq), static_cast(rtime), rtype); new_count++; save_queue(); } else if (!bandq.empty()) { band_map_t::value_type& r = bandq.back(); if (r.status != PSKR_STATUS_SENT && *loc && r.locator != loc) { // update last r.locator = loc; r.rtype = rtype; LOG_VERBOSE("Updated (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%d, type=%u)", call.c_str(), loc, mode_info[r.mode].adif_name, static_cast(r.freq), static_cast(r.rtime), rtype); save_queue(); } } } // Handle queued reports bool pskrep::progress(void) { if (queue.empty()) return true; unsigned nrep = 0; bool sender_full = false; for (queue_t::iterator i = queue.begin(); i != queue.end(); ++i) { for (call_map_t::iterator j = i->second.begin(); j != i->second.end(); ++j) { for (band_map_t::iterator k = j->second.begin(); k != j->second.end(); ++k) { switch (k->status) { case PSKR_STATUS_NEW: if ((sender_full = !sender.append(i->first, *k))) goto send_reports; k->status = PSKR_STATUS_PENDING; nrep++; break; case PSKR_STATUS_PENDING: // sent in last cycle k->status = PSKR_STATUS_SENT; default: break; } } } } send_reports: LOG_VERBOSE("Found %u new report(s)", nrep); if (nrep) { if (!sender.send()) { LOG_ERROR("Sender failed, disabling pskreporter"); return false; } return progress(); } gc(); save_queue(); return true; } // Delete sent reports that are older than DUP_INTERVAL seconds void pskrep::gc(void) { time_t threshold = time(NULL) - DUP_INTERVAL; unsigned rm = 0; for (queue_t::iterator i = queue.begin(); i != queue.end() ; ) { for (call_map_t::iterator j = i->second.begin(); j != i->second.end() ; ) { band_map_t& b = j->second; band_map_t::iterator k = find_if(b.begin(), b.end(), not_sent); if (k != b.begin() && k == b.end()) --k; rm += k - b.begin(); k = b.erase(b.begin(), k); if (k != b.end() && k->status == PSKR_STATUS_SENT && k->rtime <= threshold) { b.erase(k); rm++; } if (b.empty()) i->second.erase(j++); else ++j; } if (i->second.empty()) queue.erase(i++); else ++i; } LOG_DEBUG("Removed %u sent report(s)", rm); } static ostream& operator<<(ostream& out, const rcpt_report_t& r); static istream& operator>>(istream& in, rcpt_report_t& r); static ostream& operator<<(ostream& out, const queue_t& q); static istream& operator>>(istream& in, queue_t& q); void pskrep::save_queue(void) { string fname = TempDir; fname.append(PSKREP_QUEUE_FILE); ofstream out(fname.c_str()); if (out) out << queue; else LOG_ERROR("Could not write %s", fname.c_str()); } void pskrep::load_queue(void) { string fname = TempDir; fname.append(PSKREP_QUEUE_FILE); ifstream in(fname.c_str()); if (!in) return; in >> queue; // restore pending reports as new for (queue_t::iterator i = queue.begin(); i != queue.end(); ++i) for (call_map_t::iterator j = i->second.begin(); j != i->second.end(); ++j) for (band_map_t::iterator k = j->second.begin(); k != j->second.end(); ++k) if (k->status == PSKR_STATUS_PENDING) k->status = PSKR_STATUS_NEW; } // ------------------------------------------------------------------------------------------------- // Text fields must be <= 254 bytes #define MAX_TEXT_SIZE 254 // Records must be padded to a multiple of 4 #define PAD 4 pskrep_sender::pskrep_sender(const string& call, const string& loc, const string& ant, const string& host_, const string& port_, const string& long_id_, const string& short_id_) : recv_callsign(call, 0, MAX_TEXT_SIZE), recv_locator(loc, 0, MAX_TEXT_SIZE), recv_antenna(ant, 0, MAX_TEXT_SIZE), host(host_, 0, MAX_TEXT_SIZE), port(port_, 0, MAX_TEXT_SIZE), long_id(long_id_, 0, LONG_ID_SIZE), short_id(short_id_, 0, SHORT_ID_SIZE), sequence_number(0), template_count(2 * TEMPLATE_THRESHOLD), last_template(0), send_socket(0), dgram_size(0), report_offset(0) { create_socket(); dgram = new unsigned char[DGRAM_MAX]; write_station_info(); } pskrep_sender::~pskrep_sender() { delete send_socket; delete [] dgram; } // fldigi uses 0x0219 as the long station info template id (bytes 4,5) const unsigned char pskrep_sender::long_station_info_template[] = { 0x00, 0x03, 0x00, 0x34, 0x02, 0x19, 0x00, 0x05, 0x00, 0x00, 0x80, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverCallsign 0x80, 0x04, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverLocator 0x80, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x76, 0x8F, // persistentIdentifier 0x80, 0x08, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // decoderSoftware 0x80, 0x09, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // anntennaInformation 0x00, 0x00 }; // fldigi uses 0x0218 as the short station info template id (bytes 4,5) const unsigned char pskrep_sender::short_station_info_template[] = { 0x00, 0x03, 0x00, 0x24, 0x02, 0x18, 0x00, 0x03, 0x00, 0x00, 0x80, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverCallsign 0x80, 0x04, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverLocator 0x80, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x76, 0x8F, // persistentIdentifier 0x00, 0x00 }; void pskrep_sender::write_station_info(void) { char prog_info[MAX_TEXT_SIZE]; size_t prog_len; prog_len = snprintf(prog_info, sizeof(prog_info), "%s", PACKAGE_TARNAME "-" PACKAGE_VERSION); prog_len = MIN(prog_len, sizeof(prog_info)); struct utsname u; if (uname(&u) != -1) { prog_len += snprintf(prog_info+prog_len, sizeof(prog_info)-prog_len, "/%s-%s", u.sysname, u.machine); prog_len = MIN(prog_len, sizeof(prog_info)); } size_t call_len = recv_callsign.length(), loc_len = recv_locator.length(), ant_len = recv_antenna.length(); size_t long_len, short_len; // Long station info length long_len = 4 + // 4-byte header 1 + call_len + // 1-byte call length + call string length 1 + loc_len + // 1-byte loc length + loc string length 8 + // 8-byte identifier 1 + prog_len + // 1-byte prog length + prog string length 1 + ant_len; // 1-byte ant length + ant string length long_len = pad(long_len, PAD); // Short station info length short_len = 4 + // 4-byte header 1 + call_len + // 1-byte call length + call string length 1 + loc_len + // 1-byte loc length + loc string length 8; // 8-byte identifier short_len = pad(short_len, PAD); long_station_info.resize(long_len); short_station_info.resize(short_len); unsigned char* p; size_t npad; // Write the long station info p = &long_station_info[0]; // header memcpy(p, long_station_info_template + 4, 2); p += 2; *reinterpret_cast(p) = htons(long_len); p += sizeof(uint16_t); // call *p++ = call_len; memcpy(p, recv_callsign.data(), call_len); p += call_len; // locator *p++ = loc_len; memcpy(p, recv_locator.data(), loc_len); p += loc_len; // identifier memcpy(p, long_id.data(), LONG_ID_SIZE); p += LONG_ID_SIZE; // program *p++ = prog_len; memcpy(p, prog_info, prog_len); p += prog_len; // antenna *p++ = ant_len; memcpy(p, recv_antenna.data(), ant_len); p += ant_len; // pad npad = &long_station_info[0] + long_len - p; if (npad) memset(p, 0, npad); LOG_DEBUG("long_station_info=\"%s\"", str2hex(&long_station_info[0], long_len)); // Write the short station info p = &short_station_info[0]; // header memcpy(p, short_station_info_template + 4, 2); p += 2; *reinterpret_cast(p) = htons(short_len); p += sizeof(uint16_t); // call *p++ = call_len; memcpy(p, recv_callsign.data(), call_len); p += call_len; // locator *p++ = loc_len; memcpy(p, recv_locator.data(), loc_len); p += loc_len; // identifier memcpy(p, long_id.data(), LONG_ID_SIZE); p += LONG_ID_SIZE; // pad npad = &short_station_info[0] + short_len - p; if (npad) memset(p, 0, npad); LOG_DEBUG("short_station_info=\"%s\"", str2hex(&short_station_info[0], short_len)); } // fldigi uses 0x022C as the reception record template id (bytes 4,5) const unsigned char pskrep_sender::rcpt_record_template[] = { 0x00, 0x02, 0x00, 0x34, 0x02, 0x2C, 0x00, 0x06, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // senderCallsign 0x00, 0x96, 0x00, 0x04, // flowStartSeconds 0x80, 0x05, 0x00, 0x04, 0x00, 0x00, 0x76, 0x8F, // frequency 0x80, 0x0A, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // mode (adif string) 0x80, 0x03, 0xff, 0xff, 0x00, 0x00, 0x76, 0x8F, // senderLocator (if known) 0x80, 0x0B, 0x00, 0x01, 0x00, 0x00, 0x76, 0x8F // flags (informationSource) }; void pskrep_sender::write_preamble(void) { time_t now = time(NULL); unsigned char* p = dgram; // header *p++ = 0x00; *p++ = 0x0A; /* length written later */ p += 2; /* time written later */ p += sizeof(uint32_t); *reinterpret_cast(p) = htonl(sequence_number); p += sizeof(uint32_t); memcpy(p, short_id.data(), SHORT_ID_SIZE); p += SHORT_ID_SIZE; const unsigned char* station_info_template(long_station_info_template); size_t tlen; vector* station_info(&long_station_info); if (template_count == 0 && now - last_template >= TEMPLATE_INTERVAL) template_count = TEMPLATE_THRESHOLD; if (template_count > TEMPLATE_THRESHOLD) { station_info_template = long_station_info_template; tlen = sizeof(long_station_info_template); station_info = &long_station_info; } else if (template_count != 0) { station_info_template = short_station_info_template; tlen = sizeof(short_station_info_template); station_info = &short_station_info; } if (template_count > 0) { memcpy(p, rcpt_record_template, sizeof(rcpt_record_template)); p += sizeof(rcpt_record_template); memcpy(p, station_info_template, tlen); p += tlen; template_count--; last_template = now; } // station info record memcpy(p, &(*station_info)[0], station_info->size()); p += station_info->size(); report_offset = p - dgram; // write report record header memcpy(p, rcpt_record_template + 4, 2); p += 2; /* length written later */ p += sizeof(uint16_t); dgram_size = p - dgram; } bool pskrep_sender::append(const string& callsign, const band_map_t::value_type& r) { guard_lock dsp_lock(&pskrep_mutex); if (dgram_size == 0) write_preamble(); size_t call_len = callsign.length(); call_len = MIN(MAX_TEXT_SIZE, call_len); const char* mode = mode_info[r.mode].adif_name; size_t mode_len = strlen(mode); mode_len = MIN(MAX_TEXT_SIZE, mode_len); size_t loc_len = MIN(MAX_TEXT_SIZE, r.locator.length()); // call_len + call + time + freq + mode_len + mode + loc_len + loc + info size_t rlen = 1 + call_len + 4 + 4 + 1 + mode_len + 1 + loc_len + 1; if (pad(rlen, PAD) + dgram_size > DGRAM_MAX) // datagram full return false; LOG_INFO("Appending report (call=%s mode=%s freq=%d time=%d type=%u)", callsign.c_str(), mode_info[r.mode].adif_name, static_cast(r.freq), static_cast(r.rtime), r.rtype); unsigned char* start = dgram + dgram_size; unsigned char* p = start; // call *p++ = call_len; memcpy(p, callsign.data(), call_len); p += call_len; // 4-byte reception time *reinterpret_cast(p) = htonl(r.rtime); p += sizeof(uint32_t); // 4-byte freq *reinterpret_cast(p) = htonl(r.freq); p += sizeof(uint32_t); // mode *p++ = mode_len; memcpy(p, mode, mode_len); p += mode_len; // locator *p++ = loc_len; memcpy(p, r.locator.data(), loc_len); p += loc_len; // info source *p++ = r.rtype; LOG_DEBUG(" \"%s\"", str2hex(start, p - start)); dgram_size += rlen; return true; } void* pskrep_sender::resolver(void* obj) { pskrep_sender* s = reinterpret_cast(obj); try { s->send_socket = new Socket(Address(s->host.c_str(), s->port.c_str(), "udp")); s->send_socket->connect(); } catch (const SocketException& e) { LOG_ERROR("Could not resolve %s: %s", s->host.c_str(), e.what()); } return NULL; } void pskrep_sender::create_socket(void) { if (pthread_create(&resolver_thread, NULL, resolver, this) != 0) LOG_PERROR("pthread_create"); } bool pskrep_sender::send(void) { if (!send_socket) return false; // empty dgram or no reports (shouldn't happen) if (dgram_size == 0 || dgram_size == report_offset + 4) { stringstream info; info << dgram_size << " " << report_offset; LOG_DEBUG("Not sending empty dgram: %s", info.str().c_str()); return false; } // Finish writing the report record: // do we need padding? size_t npad = (dgram_size - report_offset) % PAD; if (npad) { npad = PAD - npad; memset(dgram + dgram_size, 0x0, npad); dgram_size += npad; } // write length *reinterpret_cast(dgram + report_offset + 2) = htons(dgram_size - report_offset); // finish writing the datagram *reinterpret_cast(dgram + 2) = htons(dgram_size); *reinterpret_cast(dgram + 4) = htonl(time(NULL)); bool ret; { stringstream info; info << "(" << dgram_size << "): \"" << str2hex(dgram, dgram_size) << "\""; LOG_DEBUG("Sending datgram %s", info.str().c_str()); } try { if ((size_t)send_socket->send(dgram, dgram_size) != dgram_size) throw SocketException("short write"); ret = true; } catch (const SocketException& e) { LOG_ERROR("Could not send datagram to %s port %s: %s", host.c_str(), port.c_str(), e.what()); ret = false; } // increment this regardless of any errors sequence_number++; dgram_size = 0; return ret; } // Pad len to a multiple of mult size_t pskrep_sender::pad(size_t len, size_t mult) { size_t r = len % mult; return r ? len + mult - r : len; } // ------------------------------------------------------------------------------------------------- static istream& operator>>(istream& in, rtype_t& t) { int i; in >> i; t = static_cast(i); return in; } static istream& operator>>(istream& in, status_t& t) { int i; in >> i; t = static_cast(i); return in; } static istream& operator>>(istream& in, rcpt_report_t& r) { in >> r.mode >> r.freq >> r.rtime >> r.rtype >> r.status >> r.locator; if (*r.locator.c_str() == '?') r.locator.clear(); return in; } static ostream& operator<<(ostream& out, const rcpt_report_t& r) { return out << r.mode << ' ' << r.freq << ' ' << r.rtime << ' ' << r.rtype << ' ' << r.status << ' ' << (r.locator.empty() ? "?" : r.locator); } static ostream& operator<<(ostream& out, const queue_t& q) { for (queue_t::const_iterator i = q.begin(); i != q.end(); ++i) for (call_map_t::const_iterator j = i->second.begin(); j != i->second.end(); ++j) for (band_map_t::const_iterator k = j->second.begin(); k != j->second.end(); ++k) out << *k << " " << j->first << " " << i->first << '\n'; return out; } static istream& operator>>(istream& in, queue_t& q) { rcpt_report_t rep; int band; string call; while (in >> rep >> band >> call) q[call][static_cast(band)].push_back(rep); return in; } fldigi-4.1.06/src/synop-src/0000775000175000017500000000000013515625030012567 500000000000000fldigi-4.1.06/src/synop-src/Makefile0000644000175000017500000000343313472115773014162 00000000000000#---------------------------------------------------------------------------------- # Make File for synop_tools #---------------------------------------------------------------------------------- GCC = gcc CXX = g++ INCLUDE = -I../ -I../include -I../libtiniconv -I../irrxml OPTIM = -O2 -Wunused -fexceptions -Wno-deprecated CXXFLAGS = $(OPTIM) $(INCLUDE) \ -DLOCALEDIR=\"/usr/local/share/locale\" \ -DPKGDATADIR=\"/usr/local/share/data\" CFLAGS = $(CXXFLAGS) # libraries to link with: LIBS = -lpthread -ldl -lm -lrt # ---------------------------------------------------------------------------------- .SUFFIXES: .cxx .o all: synop_tool synop_tool.o: synop_tool.cxx $(CXX) $(CXXFLAGS) -c $< synop.o: synop.cxx $(CXX) $(CXXFLAGS) -c $< coordinate.o: ../misc/coordinate.cxx $(CXX) $(CXXFLAGS) -c $< kmlserver.o: ../misc/kmlserver.cxx $(CXX) $(CXXFLAGS) -c $< irrXML.o: ../irrxml/irrXML.cpp $(CXX) $(CXXFLAGS) -c $< re.o: ../misc/re.cxx $(CXX) $(CXXFLAGS) -c $< strutil.o: ../misc/strutil.cxx $(CXX) $(CXXFLAGS) -c $< timeops.o: ../misc/timeops.cxx $(CXX) $(CXXFLAGS) -c $< util.o: ../misc/util.cxx $(CXX) $(CXXFLAGS) -c $< threads.o: ../misc/threads.cxx $(CXX) $(CXXFLAGS) -c $< cmd_debug.o: cmd_debug.cxx $(CXX) $(CXXFLAGS) -c $< nls.o: ../misc/nls.cxx $(CXX) $(CXXFLAGS) -c $< locator.o: ../misc/locator.c $(GCC) $(CFLAGS) -c $< synop_tool: \ synop_tool.o synop.o coordinate.o kmlserver.o irrXML.o re.o strutil.o \ nls.o util.o cmd_debug.o threads.o timeops.o locator.o $(CXX) \ synop_tool.o synop.o coordinate.o kmlserver.o irrXML.o re.o strutil.o \ nls.o util.o cmd_debug.o threads.o timeops.o locator.o \ -o synop_tool $(LIBS) clean: $(RM) *.bak *~ *.o synop_tool #---------------------------------------------------------------------------------- fldigi-4.1.06/src/synop-src/synop.cxx0000664000175000017500000063146713507402064014425 00000000000000// ---------------------------------------------------------------------------- // synop.cxx -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "re.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "synop.h" #include "kmlserver.h" #include "configuration.h" #include "fl_digi.h" #include "gettext.h" #include "debug.h" #include "field_def.h" #include "record_loader.h" #include "coordinate.h" #include "strutil.h" #include "FL/fl_ask.H" // ---------------------------------------------------------------------------- // RTTY is 850 Hz shift, 75 baud, ITA2 Baudot code. // 3231.0 KAWN RTTY (Tune in LSB) // 7784.0 KAWN RTTY // 11120.0 KAWN RTTY (Tune in LSB) // 13530.0 KAWN RTTY // 19324.5 KAWN RTTY // 19530.0 KAWN RTTY (Usually "fox" marker) // ---------------------------------------------------------------------------- /// Writes a string range to the current print callback. static void disp_range( std::string::const_iterator b, std::string::const_iterator e, bool bold = false) { const char * first = &( *b ); const char * last = &( *e ); assert( first <= last ); size_t nb = last - first ; synop::ptr_callback->print( first, nb, bold ); }; // ---------------------------------------------------------------------------- /// Builds a time with Synop messages which just have event's day/hour/min. static time_t DayHourMin2Tm( int day, int hour, int min ) { // TODO: Check that time() is UTC too. time_t tmpTime = time(NULL); tm aTm = *gmtime(&tmpTime); // Maybe observation from previous month. if( day > aTm.tm_mday ) { aTm.tm_mon-- ; if( aTm.tm_mon < 0 ) { aTm.tm_mon = 11 ; aTm.tm_year-- ; } } aTm.tm_mday = day ; aTm.tm_hour = hour ; aTm.tm_min = min ; time_t my_time = mktime( & aTm ); if( my_time <= 0 ) throw std::runtime_error("Invalid time"); return my_time ; } /// Absolute time difference in number of days. static int diffTm( time_t tim1, time_t tim2 ) { if( (tim1 <= 0 ) || (tim2 <= 0 ) ) throw std::runtime_error("Invalid times"); double nbSecs = difftime( tim1, tim2 ); return fabs( 0.5 + nbSecs * ( 1.0 / ( 24 * 3600 ) ) ); } /// We could use any other time as long as it is clear. static std::string Tm2SynopTime( time_t tim ) { return KmlServer::Tm2Time( tim ); } // ---------------------------------------------------------------------------- /// Base class for displaying the key-value pairs read from Synop broadcast. class Serializer { /// It returns the previous value which can therefore be restored. Serializer * m_prevSerial ; /// This happens when switching temporarily to this serializer. static Serializer * m_srl ; public: /// It registers itself as a serializer. Serializer() { m_prevSerial = m_srl ; m_srl = this ; } /// It restores the previous serializer. virtual ~Serializer() { m_srl = m_prevSerial ; } virtual void StartSection( const std::string & section_name ) = 0 ; virtual void AddItem( const char * key, const char * value, const char * unit ) = 0; static Serializer * Instance(void) { if( m_srl == NULL ) throw std::runtime_error("Null m_srl"); return m_srl; } }; // Current serializer, that is, the object which prints Synop attributes. Serializer * Serializer::m_srl = NULL; // ---------------------------------------------------------------------------- static const char * Unit_hPa = "hPa"; static const char * Unit_degrees = "degrees"; static const char * Unit_hours = "hours"; static const char * Unit_minutes = "mn"; static const char * Unit_seconds = "seconds"; static const char * Unit_Celsius = "°C"; static const char * Unit_knots = "knots"; static const char * Unit_feet = "feet"; static const char * Unit_km = "km"; static const char * Unit_meters = "meters"; static const char * Unit_centimeters = "cm"; static const char * Unit_mm = "mm"; static const char * Unit_meters_second = "m/s"; // ---------------------------------------------------------------------------- /// Compile-time number of elements of a static array. #ifndef G_N_ELEMENTS #define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0]))) #endif /// For documentation only. Tells the WMO code table of an information. #define FM12CodeTable( arr, num, txt ) // ---------------------------------------------------------------------------- /// Used to select from lookup tables. template< class Key > struct choice { const Key m_key; const char * m_val; }; // Simple lookup. template< class Key, class Dflt > const char * choice_map( const choice< Key > * choices, size_t nb_choices, const Key & key, const Dflt & dflt ) { for( ; nb_choices; --nb_choices, ++choices ) { if( key == choices->m_key ) return choices->m_val ; } return dflt ; } // ---------------------------------------------------------------------------- // There are about 11000 records, so memory usage is an issue. class RecordWmoStation { /// Block Number :2 digits representing the WMO-assigned block. int m_block ; /// Station Number :3 digits representing the WMO-assigned station. int m_station ; /// ICAO Location Indicator :4 alphanumeric characters, /// not all stations in this file have an assigned location indicator. /// The value "----" is used for stations that do not have an assigned location indicator. char m_icao_indicator[5]; // TODO: Not used at the moment. /// Place Name :Common name of station location. std::string m_name ; // State :2 character abbreviation (included for stations located in the United States only). // Country Name :Country name is ISO short English form. // TODO: Consider replacing it with an ISO integer key. std::string m_country; // WMO Region :digits 1 through 6 representing the corresponding WMO region, 7 stands for the WMO Antarctic region. // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds // and H is N for northern hemisphere or S for southern hemisphere or // E for eastern hemisphere or W for western hemisphere. // The seconds value is omitted for those stations where the seconds value is unknown. CoordinateT::Pair m_station_coordinates ; /// Upper Air Latitude :DD-MM-SSH. /// Station Elevation (Ha) :The station elevation in meters. Value is omitted if unknown. int m_station_elevation ; /// Upper Air Elevation (Hp) :The upper air elevation in meters. Value is omitted if unknown. /// RBSN indicator :P if station is defined by the WMO as belonging to the Regional Basic Synoptic Network, omitted otherwise. /// Delimiter between values in a record. static const char m_delim = ';'; public: /// More information here: http://weather.noaa.gov/tg/site.shtml RecordWmoStation() : m_block(0) , m_station(0) {} int wmo_indicator() const { return m_block * 1000 + m_station; } const CoordinateT::Pair & station_coordinates() const { return m_station_coordinates; } int station_elevation(void) const { return m_station_elevation; } const std::string & country() const { return m_country; } /// This garantees an unique name. const std::string & station_name() const { return m_name; } void rename_station( const std::string & nam ) { if (bMOREINFO) LOG_INFO("Renaming %s to %s", m_name.c_str(), nam.c_str() ); m_name = nam; } // http://weather.noaa.gov/data/nsd_bbsss.txt // 01;023;ENDU;Bardufoss;;Norway;6;69-04N;018-32E;;;7;79;P // Wrong record: // 71;113;CWZA;Agassiz Automated Reporting Station ;;Canada;;49-15N;121-46W;;;15;; friend std::istream & operator>>( std::istream & istrm, RecordWmoStation & rec ) { if( read_until_delim( m_delim, istrm, rec.m_block ) && read_until_delim( m_delim, istrm, rec.m_station ) && read_until_delim( m_delim, istrm, rec.m_icao_indicator ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm /* State */ ) && read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm /* WMO region */ ) && read_until_delim( m_delim, istrm, rec.m_station_coordinates.latitude() ) && read_until_delim( m_delim, istrm, rec.m_station_coordinates.longitude() ) && read_until_delim( m_delim, istrm /* Upper air latitude */ ) && read_until_delim( m_delim, istrm /* Upper air longitude */ ) && read_until_delim( m_delim, istrm, rec.m_station_elevation, 0 ) && read_until_delim( m_delim, istrm /* Upper air elevation */ ) && read_until_delim( m_delim, istrm /* Rsbn indicator */ ) && ( rec.m_station_coordinates.latitude().is_lon() == false ) && ( rec.m_station_coordinates.longitude().is_lon() == true ) ) { strtrim( rec.m_name ); return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } friend std::ostream & operator<< ( std::ostream & ostrm, const RecordWmoStation & rec ) { ostrm << rec.m_name ; return ostrm; } }; // RecordWmoStation // ---------------------------------------------------------------------------- // srst2;29.683 N;94.033 W;0.7;Sabine Pass, TX;NDBC;NDBC Meteorological/Ocean;fixed // ssbn7;33.842 N;78.476 W;;Sunset Beach Nearshore Waves;CORMP;IOOS Partners;other // Adapted from http://www.ndbc.noaa.gov/ndbcmapstations.json // ftp://tgftp.nws.noaa.gov/data/observations/marine/stations/station_table.txt // # STATION_ID | OWNER | TTYPE | HULL | NAME | PAYLOAD | LOCATION | TIMEZONE | FORECAST | NOTE // # // 0y2w3|CG|Weather Station||Sturgeon Bay CG Station, WS||44.794 N 87.313 W (44°47'40" N 87°18'47" W)|C| | // 13001|PR|Atlas Buoy|PM-595|NE Extension||12.000 N 23.000 W (12°0'0" N 23°0'0" W)|| | /// This allows to find a buoy characteristics. class RecordBuoy { std::string m_id ; std::string m_owner ; /// "UW" : University of Washington etc... std::string m_type ; /// "Offshore Buoy", "6-meter NOMAD buoy" etc... std::string m_hull; /// "PM-599", "3D37" std::string m_name ; /// "Ecuador INOCAR", "150 NM East of Cape HATTERAS" std::string m_payload; /// "AMPS payload" CoordinateT::Pair m_location ; /// "32.501 N 79.099 W (32°30'2" N 79°5'58" W)" std::string m_timezone ; /// "E" std::string m_forecast; /// "FZUS52.KCHS FZNT22.KWBC" std::string m_note; /// "This buoy was removed ..." /// From the CVS file. static const char m_delim = '|'; public: /// Unique identifier in a catalog. const std::string & id() const { return m_id; } const CoordinateT::Pair & station_coordinates() const { return m_location; } /// The name coming from the file might not be unique. const std::string & buoy_name(void) const { return m_name;} /// Needed because buoy names are not unique void rename_buoy( const std::string & new_buoy_name ) { m_name = new_buoy_name ; } const std::string & owner(void) const { return m_owner;} const std::string & payload(void) const { return m_payload;} const std::string & note(void) const { return m_note;} /// TODO: Speedup by doing that once only. std::string title(void) const { std::string title = m_type ; if( ! m_name.empty() ) title += ":" + m_name ; if( ! m_payload.empty() ) title += ":" + m_payload ; if( ! m_owner.empty() ) title += ":" + m_owner ; return title ; } /// fixed, other, dart, buoy, oilrig, tao const std::string & type(void) const { return m_type;} friend std::istream & operator>>( std::istream & istrm, RecordBuoy & rec ) { if( read_until_delim( m_delim, istrm, rec.m_id ) && read_until_delim( m_delim, istrm, rec.m_owner ) && read_until_delim( m_delim, istrm, rec.m_type ) && read_until_delim( m_delim, istrm, rec.m_hull ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm, rec.m_payload ) && read_until_delim( m_delim, istrm, rec.m_location ) && read_until_delim( m_delim, istrm, rec.m_timezone ) && read_until_delim( m_delim, istrm, rec.m_forecast ) && read_until_delim( m_delim, istrm, rec.m_note ) ) { // std::cout << "id=" << rec.m_id << " name=" << rec.m_name << "\n"; return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } }; // RecordBuoy // ---------------------------------------------------------------------------- // http://www.metoffice.gov.uk/media/csv/e/7/ToR-Stats-SHIP.csv // June 2012,,,,,,,, // CTRY,CALLSIGN,NAME,Observations,N<30,N<60,N<120,N>360,Average (R-O) (mins) // , B2M1297, ,1,1,1,1,0,30 // , B2M1303, ,17,16,17,17,0,17.9 // , BATEU00, ,366,366,366,366,0,5 class RecordShip { std::string m_callsign; std::string m_country; std::string m_name ; static const char m_delim = ','; public: const std::string & callsign(void) const { return m_callsign; } const std::string & country(void) const { return m_country; } const std::string & name(void) const { return m_name; } friend std::istream & operator>>( std::istream & istrm, RecordShip & rec ) { if( read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm, rec.m_callsign ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) ) { strtrim( rec.m_country ); strtrim( rec.m_callsign ); strtrim( rec.m_name ); // std::cout << "id=" << rec.m_callsign << " name=" << rec.m_name << "\n"; strcapitalize( rec.m_name ); // std::cout << "id=" << rec.m_callsign << " name=" << rec.m_name << "\n"; return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } }; // RecordShip // ---------------------------------------------------------------------------- /** Huge file, but contains many information. There are many duplicates for each WMO indicator, it does not matter for us. ftp://ftp.jcommops.org/JCOMMOPS/GTS/wmo/wmo_list.txt GTS stands for Global Telecommunications System JCOMMOPS WMO-PLATFORM cross reference list as of 2012-09-08 for WMO number still allocated in the last 6 months (with WMO Ids that are numerical) WMO;TELECOM ID;TELECOM SYSTEM;PTFM NAME;PTFM FAMILY;PTFM TYPE;CONTACT NAME;EMAIL;PROGRAM;ROLE;AGENCY;COUNTRY;ALLOC_DATE;DEALLOC_DATE;ARGOS_PROG 10044;BSH:10044;METEOSAT;MB:10044;FIXED;METSTATION;;;GERMANY MB;Program Manager;KIEL UNIVERSITY;DEU;2001-01-01;3000-01-01; 10044;BSH:10044;METEOSAT;MB:10044;FIXED;METSTATION;;;GERMANY MB;Programme GTS Coordinator;KIEL UNIVERSITY;DEU;2001-01-01;3000-01-01; 11908;88671;ARGOS;ARGOS:88671;DB;SVPBD2;;;AOML-GDP;Programme GTS Coordinator;NOAA/AOML;USA;2011-07-19;3000-01-01; Apparently, special codes here: http://www.meds-sdmm.dfo-mpo.gc.ca/isdm-gdsi/international-internationale/j-comm/CODES/wmotable_e.htm */ /// JComm stands for Joint Commission on Oceanography and Marine Meteorology (J-COMM) class RecordJComm { std::string m_wmo ; // TODO: This could be an integer. std::string m_telecom_system ; std::string m_ptfm_name ; std::string m_ptfm_family ; std::string m_ptfm_type ; std::string m_program ; std::string m_agency ; std::string m_country ; static const char m_delim = ';'; public: /// TODO: This could be an integer. const std::string & wmo() const { return m_wmo; } const std::string & telecom_system() const { return m_telecom_system; } const std::string & ptfm_name() const { return m_ptfm_name; } const std::string & ptfm_family() const { return m_ptfm_family; } const std::string & ptfm_type() const { return m_ptfm_type; } const std::string & program() const { return m_program; } const std::string & agency() const { return m_agency; } const std::string & country() const { return m_country; } friend std::istream & operator>>( std::istream & istrm, RecordJComm & rec ) { if( read_until_delim( m_delim, istrm, rec.m_wmo ) && read_until_delim( m_delim, istrm /* Telecom Id */ ) && read_until_delim( m_delim, istrm, rec.m_telecom_system ) && read_until_delim( m_delim, istrm, rec.m_ptfm_name ) && read_until_delim( m_delim, istrm, rec.m_ptfm_family ) && read_until_delim( m_delim, istrm, rec.m_ptfm_type ) && read_until_delim( m_delim, istrm /* Contact Name */ ) && read_until_delim( m_delim, istrm /* Email */ ) && read_until_delim( m_delim, istrm, rec.m_program ) && read_until_delim( m_delim, istrm /* Role */ ) && read_until_delim( m_delim, istrm, rec.m_agency ) && read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm /* Alloc Date */ ) && read_until_delim( m_delim, istrm /* Dealloc Date */ ) && read_until_delim( m_delim, istrm /* Argos Prog */ ) ) { return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } // Unfortunately the physical type of the station is embedded in the ptfm_name. // So we rearrange data, to have a decent icon name. Handles cases such as: // 42365;Ursa809;IRIDIUM;PLATFORM:42365;FIXED;FIXED // 62130;IRID:62130;IRIDIUM;OILPLAT:62130;MB;MB; // Very rough solution, quite OK for the moment. void SetJCommFields( std::string & kmlNam, std::string & iconNam ) const { if( ( strstr( m_ptfm_name.c_str(), "PLATFORM" ) ) || ( strstr( m_ptfm_name.c_str(), "OILPLAT" ) ) ) { kmlNam = agency() + ":(" + m_wmo + ")"; iconNam = "Oil Platform"; } else if( ( strstr( m_ptfm_name.c_str(), "BUOY" ) ) ) { kmlNam = agency() + ":(" + m_wmo + ")"; iconNam = "Buoy"; } else { kmlNam = ptfm_name() + "," + agency(); iconNam = telecom_system(); } strcapitalize(kmlNam); } }; // RecordJComm // ---------------------------------------------------------------------------- /// This wraps a record type and allows to load a cvs file and access it using a key. template< class Key, class Record, Key (Record::*Method)(void) const, class Terminal > class Catalog : public RecordLoader< Terminal > { /// The keying method might return a reference instead of a value. template< class Type > struct deref { typedef Type type ; }; template< class Type > struct deref< Type & > { typedef Type type ; }; /// If the return value of the indexing function is for example a reference /// to a const string, then KeyType is a string. template< class Type > struct deref< const Type & > { typedef Type type ; }; protected: typedef typename deref< Key >::type KeyType ; typedef std::map< KeyType, Record > CatalogType ; typedef typename CatalogType::iterator IteratorType ; CatalogType m_catalog ; bool FillAndTest() { int nbRec = this->LoadAndRegister(); if( nbRec < 0 ) { return false ; } else { if (bMOREINFO) LOG_INFO("record=%s nb_recs=%d", typeid(Record).name(), nbRec ); return true ; } } public: void Clear() { m_catalog.clear(); } bool ReadRecord( std::istream & istrm ) { Record tmp ; istrm >> tmp ; if( istrm || istrm.eof() ) { m_catalog[ (tmp.*Method)() ] = tmp ; return true ; } return false; } /// Returns a station with wmo_indicator to zero if cannot find the right one. static const Record * FindFromKey( Key key ) { CatalogType & refCat = RecordLoader< Terminal >::InstCatalog().m_catalog; typename CatalogType::const_iterator it = refCat.find( key ); return ( it == refCat.end() ) ? NULL : &it->second ; } bool Fill() { return FillAndTest(); } }; // Catalog // ---------------------------------------------------------------------------- /// This contains all WMO stations records read from the file. class CatalogWmoStations : public Catalog< int, RecordWmoStation, &RecordWmoStation::wmo_indicator, CatalogWmoStations > { public: // After data loading, there is an extra step to ensure that names are unique. // 85;196;SLCP;Concepcion;;Bolivia;3;16-09S;062-01W;;;497;; // 85;682;SCIE;Concepcion;;Chile;3;36-46S;073-03W;;;12;;P // 86;134;SGCO;Concepcion;;Paraguay;3;23-25S;057-18W;;;74;74; bool Fill() { if( ! FillAndTest() ) return false ; typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; // First take the names if (bMOREINFO) LOG_INFO("Eliminating duplicates out of %d elements", static_cast(m_catalog.size())); for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordWmoStation & refWmo = it->second ; allNames.insert( allNames.end(), HashT::value_type( refWmo.station_name(), it ) ); } size_t nbDupl = 0 ; // Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { if (bMOREINFO) LOG_INFO("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; if( itNextH == enH ) break ; if( itNextH->first != itH->first ) break ; ++nbKeys; } if (bMOREINFO) LOG_INFO("Name=%s nb=%d", itH->first.c_str(), static_cast(nbKeys) ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; if (bMOREINFO) LOG_INFO("%d: Name %s %d occurrences", static_cast(nbDupl), itH->first.c_str(), static_cast(nbKeys) ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; DiffNamesT differentNames ; // Check that all countries are different. for( HashT::iterator itSubH = itH; itSubH != itNextH; ++itSubH ) { RecordWmoStation & refWmo = itSubH->second->second ; if (bMOREINFO) LOG_INFO("Trying %s", refWmo.station_name().c_str() ); // Appends the country. refWmo.rename_station( refWmo.station_name() + "," + refWmo.country() ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refWmo.station_name() ); if( tmpPair.second ) continue ; // Appends the WMO refWmo.rename_station( strformat( "%s,%05d", refWmo.station_name().c_str(), refWmo.wmo_indicator() ) ); tmpPair = differentNames.insert( refWmo.station_name() ); if( tmpPair.second ) continue ; LOG_ERROR("This should never happen because WMO indicator is unique"); return false ; } } if(nbDupl) { if (bMOREINFO) LOG_INFO("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); } return true ; } /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "http://weather.noaa.gov/data/nsd_bbsss.txt"; } const char * Description() const { return _("WMO stations"); } }; // CatalogWmoStations // ---------------------------------------------------------------------------- /// This contains all WMO stations records read from the file. /// Derived class necessary because names are not unique and must be revised. class CatalogBuoy : public Catalog< const std::string &, RecordBuoy, &RecordBuoy::id, CatalogBuoy > { public: /// After data loading, there is an extra step to ensure that names are unique. bool Fill() { if( ! FillAndTest() ) return false ; typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; if (bMOREINFO) LOG_INFO("Eliminating duplicates out of %d elements", static_cast(m_catalog.size())); /// First take the names for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordBuoy & refWmo = it->second ; allNames.insert( allNames.end(), HashT::value_type( refWmo.buoy_name(), it ) ); } size_t nbDupl = 0 ; /// Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { if (bMOREINFO) LOG_INFO("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; if( itNextH == enH ) break ; if( itNextH->first != itH->first ) break ; ++nbKeys; } if (bMOREINFO) LOG_INFO("Name=%s nb=%d", itH->first.c_str(), static_cast(nbKeys) ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; if (bMOREINFO) LOG_INFO("%d: Buoy name %s %d occurrences", static_cast(nbDupl), itH->first.c_str(), static_cast(nbKeys) ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; DiffNamesT differentNames ; // Check that all countries are different. for( HashT::iterator itSubH = itH; itSubH != itNextH; ++itSubH ) { RecordBuoy & refBuoy = itSubH->second->second ; // Appends the id if( refBuoy.buoy_name().empty() ) refBuoy.rename_buoy( refBuoy.id().c_str() ); else refBuoy.rename_buoy( strformat( "%s-%s", refBuoy.buoy_name().c_str(), refBuoy.id().c_str() ) ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refBuoy.buoy_name() ); if (bMOREINFO) LOG_INFO("Buoy set to %s", refBuoy.buoy_name().c_str() ); if( tmpPair.second ) continue ; LOG_ERROR("This should never happen because buoy id is unique"); return false ; } } if(nbDupl) { if (bMOREINFO) LOG_INFO("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); } return true ; } /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "ftp://tgftp.nws.noaa.gov/data/observations/marine/stations/station_table.txt"; } const char * Description() const { return _("Weather buoys"); } }; // CatalogBuoy // ---------------------------------------------------------------------------- /// Known list of VOS weather ships, Volunteer Observing Ships. struct CatalogShip : public Catalog< const std::string &, RecordShip, &RecordShip::callsign, CatalogShip > { /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "http://www.metoffice.gov.uk/media/csv/e/7/ToR-Stats-SHIP.csv"; } const char * Description() const { return _("Weather ships"); } }; /// Another public-domain file, returns information given a WMO-like key. struct CatalogJComm : public Catalog< const std::string &, RecordJComm, &RecordJComm::wmo, CatalogJComm > { /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "ftp://ftp.jcommops.org/JCOMMOPS/GTS/wmo/wmo_list.txt"; } const char * Description() const { return _("Argos & Iridium"); } }; // ---------------------------------------------------------------------------- // Returns true if properly initialised. // TODO: Have all the derived class link to the base class so the initialisation // can be done without having to enumerate the sub-classes. bool SynopDB::Init( const std::string & data_dir ) { try { return CatalogWmoStations::InstCatalog().Fill() && CatalogBuoy::InstCatalog().Fill () && CatalogShip::InstCatalog().Fill () && CatalogJComm::InstCatalog().Fill (); } catch( const std::exception & exc ) { fl_alert("Could not load SYNOP data files: Exception=%s", exc.what() ); return false ; } return true; } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::IndicatorToName( int wmo_indicator ) { const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( wmo_indicator ); static const std::string empty_str ; return ( ptrWmo == NULL ) ? empty_str : ptrWmo->station_name(); } /// For testing purpose only in stand-alone program flsynop. const std::string SynopDB::IndicatorToCoordinates( int wmo_indicator ) { const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( wmo_indicator ); if ( ptrWmo == NULL ) return "No coordinates"; std::stringstream strm ; strm << ptrWmo->station_coordinates() << " " ; strm << ptrWmo->station_coordinates().longitude().angle() << " " ; strm << ptrWmo->station_coordinates().latitude().angle() << " " ; return strm.str(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::BuoyToName( const char * buoy_id ) { const RecordBuoy * ptrBuoy = CatalogBuoy::FindFromKey( buoy_id ); static const std::string empty_str ; return ( ptrBuoy == NULL ) ? empty_str : ptrBuoy->buoy_name(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::ShipToName( const char * ship_id ) { const RecordShip * ptrShip = CatalogShip::FindFromKey( ship_id ); static const std::string empty_str ; return ( ptrShip == NULL ) ? empty_str : ptrShip->name(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::JCommToName( const char * wmo ) { const RecordJComm * ptrJComm = CatalogJComm::FindFromKey( wmo ); static const std::string empty_str ; return ( ptrJComm == NULL ) ? empty_str : ptrJComm->ptfm_name(); } // ---------------------------------------------------------------------------- /// Intrusive reference counter associated with RefCntPtr. template class WithRefCnt { size_t m_ref_cnt ; public: WithRefCnt() : m_ref_cnt(0) {}; template friend class RefCntPtr; }; /// Intrusive smart pointer with reference counting. template< class Obj > class RefCntPtr { /// This must derive from the class WithRefCnt. Obj * m_ptr ; public: RefCntPtr() : m_ptr(NULL) {} /// The reference counter is incremented. RefCntPtr( Obj * ptr ) : m_ptr(ptr) { if( ptr ) ++ptr->m_ref_cnt ; } /// Deletes the pointed object if reference count reaches zero. ~RefCntPtr() { if( m_ptr ) { --m_ptr->m_ref_cnt ; if( m_ptr->m_ref_cnt == 0 ) delete m_ptr ; } } /// The reference counter is incremented. RefCntPtr( const RefCntPtr & ptr ) : m_ptr( ptr.m_ptr ) { if( m_ptr ) ++m_ptr->m_ref_cnt ; } /// The reference counter is incremented. RefCntPtr & operator=( const RefCntPtr & ptr ) { if( this != &ptr ) { m_ptr = ptr.m_ptr ; if( m_ptr ) ++m_ptr->m_ref_cnt ; } return *this; } const Obj * operator->() const { return m_ptr;} Obj * operator->() { return m_ptr;} operator bool() const { return m_ptr; } }; // ---------------------------------------------------------------------------- /// Synop section number. enum section_t { SECTION_ZCZC_DLM=0, SECTION_HEAD_GRP, SECTION_IDENTLOC, // 000 SECTION_LAND_OBS, // 111 SECTION_SEA_SURF, // 222 SECTION_CLIM_DAT, // 333 SECTION_NATCLOUD, // 444 SECTION_NAT_CODE, // 555 SECTION_AUTO_DAT, SECTION_NNNN_DLM, SECTION_SECT_NBR }; static const char * SectionToString( section_t group_number ) { switch(group_number) { case SECTION_ZCZC_DLM : return _("Bulletin start"); case SECTION_HEAD_GRP : return _("Header"); case SECTION_IDENTLOC : return _("Identification and location"); case SECTION_LAND_OBS : return _("Land observations"); case SECTION_SEA_SURF : return _("Sea surface observations"); case SECTION_CLIM_DAT : return _("Climatological data"); case SECTION_NATCLOUD : return _("National data, clouds"); case SECTION_NAT_CODE : return _("National data"); case SECTION_AUTO_DAT : return _("Automatisch erzeugte Daten"); case SECTION_NNNN_DLM : return _("Bulletin end"); default : return _("Unknown Synop group"); } } /// [nextSec][predSec] : Indicates that section Next can be preceded by section Pred. static const char sectionTransitions[SECTION_SECT_NBR][SECTION_SECT_NBR] = { // ZCZC_DLM HEAD_GRP IDENTLOC LAND_OBS SEA_SURF CLIM_DAT NATCLOUD NAT_CODE AUTO_DAT NNNN_DLM { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // ZCZC_DLM { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // HEAD_GRP { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // IDENTLOC { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, // LAND_OBS { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // SEA_SURF { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // CLIM_DAT { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 }, // NATCLOUD { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 }, // NAT_CODE { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0 }, // AUTO_DAT { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } // NNNN_DLM }; // ---------------------------------------------------------------------------- /// Priority helps to classify regular expressions matching the same work. typedef double priority_t ; /// Minimum priorities sum to be accepted as a valid chain of tokens. static const priority_t MIN_PRIO = 2.0 ; /// This models a Synop token, that is, a group of (Most of time) five digits. class TokenProxy : public std::string, public WithRefCnt< TokenProxy > { public: typedef RefCntPtr< TokenProxy > Ptr ; /// List of pointers to TokenProxy, each of them associated to a token and its regex. class TokVec : public std::vector< Ptr > , public WithRefCnt< TokVec > { TokVec( const TokVec & ); TokVec & operator=(const TokVec &); /// For debugging, writes the regular expression. void DumpTotal(section_t group_number, bool kml_mode) const { // This information is not needed at the moment, // but it is not possible to discard it if the section is empty, because // we do not know that yet. Serializer * ptrSerial = Serializer::Instance(); if(kml_mode) { ptrSerial->StartSection( SectionToString(group_number) ); } for( size_t i = 0; i < size(); ++ i ) { TokenProxy & prox = *const_cast< TokenProxy *>( at(i).operator->() ); /// If set, this adds in the output which regular expression was detected. static const bool addRegexToOutput = false ; if( addRegexToOutput && ! kml_mode ) { ptrSerial->AddItem( "Regex", prox.RegexName(), prox.c_str() ); } if(kml_mode) { prox.DrawKml(); } else { prox.Print(); } } } public: typedef RefCntPtr< TokVec > Ptr ; private: /// Chains (sections) are linked so that any section can search the previous ones. TokVec::Ptr m_previous_container ; public: TokVec() {}; /// Used to find a preceding token containing a specific information in a previous tokens chain. TokVec::Ptr previous() const { return m_previous_container; } void previous(TokVec::Ptr prev) { m_previous_container = prev; } /// Debugging purpose: It outputs the concatenation of all regular expressions names. std::string MiniDump(section_t group_number,bool disp_all = false) const { std::stringstream strm ; for( size_t i = 0; i < size(); ++ i ) { TokenProxy & prox = *const_cast< TokenProxy *>( at(i).operator->() ); strm << prox.RegexName() ; if( disp_all ) { strm << "#" << static_cast(prox); } strm << '+'; } return strm.str(); } void DumpTokVec(bool test_mode, section_t group_number, bool kml_mode) const { if( test_mode ) { // Just displays the regular expression name, for debugging. std::string str( MiniDump(group_number) ); disp_range( str.begin(), str.end() ); } else { DumpTotal(group_number, kml_mode); } } }; private: /// The index of the regular expression that this token uses. int m_regex_idx; /// Pointer to the chain of TokenProxy. TokVec::Ptr m_container ; /// Offset in the input buffer which indicates the end of what is parsed. size_t m_offset_end ; virtual bool Parse( const char * str ) = 0 ; /* TODO: Output style. 10035 [Germany, 54ø32'N 009ø33'E SCHLESWIG] 11575 [manned] [cloud height:600-1000m] [visibility:25km] 42905 [cloud cover:4/8] [wind dir:290 deg, speed:5] 10066 [air temp:+6.6] 21022 [dew-point temp:-2.2] 30131 [pressure at station level:1013.1hPa] 40190 [pressure at sea level:1019.0hPa] 53014 [pressure:increasing rapidly] [change in 3h:1.4hPa] 69922 [precipitation:0.2mm during last 12 hours] 70181 [past wx: shower(s), cloud cover 1/2 of sky] [wx now: Clouds generally dissolving or becoming less developed] 84801 [cloud info] 333 [section 3] 10094 [maximum temp:+9.4] 20029 [minimum temp:+2.9] 55307 81823 [clouds:1/8 or less, cumulus, 690m] 83633 [clouds:3/8, stratocumulus, 990m] The method Append() will print the five-digits group. Later on, duplicate and consecutive groups will be suppressed. */ void ItemAdd( const char * key, const char * value, const char * unit ) const { Serializer::Instance()->AddItem( key, value, unit ); } virtual void Print() const = 0 ; virtual void DrawKml() const { Print() ; } TokenProxy & operator=(const TokenProxy & ); protected: void disp_arr(const char ** array,size_t arrsz,int idx,int offset,const char * title) const { /// It is a Synop convention that slashes mean no information. if( idx == '/' ) return ; size_t idx_array = idx - offset; char buffer[64]; const char * val; if( idx_array < arrsz ) val = array[idx_array]; else { snprintf( buffer, sizeof(buffer), _("Unknown index %d/%d/%d"), (int)idx, (int)idx_array, (int)arrsz ); val = buffer ; } Append( title, val ); } TokenProxy() : m_regex_idx(-1), m_offset_end(0) {} public: virtual ~TokenProxy() {} /// The boolean flag allows to search only in the current chain but also /// in the previous ones backward. This could be faster by restricting /// only to given section numbers. template< class TokenDerived > const TokenDerived * get_ptr(bool previous_chains) const ; template< class TokenDerived > static Ptr Generator( int rgx_idx, const std::string & wrd, size_t off ) { TokenProxy * ptr = new TokenDerived ; ptr->m_regex_idx = rgx_idx ; static_cast< std::string & >(*ptr) = wrd ; ptr->m_offset_end = off ; return Ptr(ptr); }; void Section( const char * key ) const { Serializer::Instance()->StartSection( key ); } static const bool tstDisp = false ; template< class Val > void Append( const char * key, const Val & val, const char * unit = NULL ) const { std::stringstream strm ; strm << val ; ItemAdd( key, strm.str().c_str(), unit ); } void Append( const char * key, const std::string & val, const char * unit = NULL ) const { ItemAdd( key, val.c_str(), unit ); } void Append( const char * key, const char * val, const char * unit = NULL ) const { ItemAdd( key, val, unit ); } void Append( const char * key, double val, const char * unit = NULL ) const { char buf[20]; snprintf( buf, sizeof(buf), "%.1lf", val ); ItemAdd( key, buf, unit ); } void Append( const char * key, int val, const char * unit = NULL ) const { char buf[12]; snprintf( buf, sizeof(buf), "%d", val ); ItemAdd( key, buf, unit ); } /// This ensures that each token points to the chain containing it. friend void PushItself( Ptr mySelf, TokVec::Ptr ptr ) { mySelf->m_container = ptr ; ptr->push_back( mySelf ); }; size_t offset_begin(void) const { assert( m_offset_end >= size() ); return m_offset_end - size(); } size_t offset_end(void) const { return m_offset_end; } const char * RegexName(void) const ; bool ParseItself(void) { return Parse( c_str() ); } /// It is dependent on the previous token. // TODO: This should be explicitely dependent on a preceding regex. virtual bool CanComeFirst(void) const { return true; } }; // TokenProxy typedef TokenProxy::Ptr (*ProxyGen)( int reg_idx, const std::string & wrd, size_t txt_offset); /// Stores the regular expression associated to a Synop code, /// plus a factory to create an object modelizing this code. class RegexT : public WithRefCnt< RegexT > { const char * m_str ; const char * m_name ; regex_t m_regex ; ProxyGen m_generator ; priority_t m_priority ; void treat_error(int stat) const { char errbuf[512]; size_t lenbuf = snprintf( errbuf, sizeof(errbuf), "%s:", m_str ); regerror(stat, &m_regex, errbuf + lenbuf, sizeof(errbuf) - lenbuf ); throw std::runtime_error(errbuf); } RegexT(); RegexT(const RegexT &); /// Token now just need an integer to point to their regular expression. /// It is therefore very fast to create/copy a token. typedef std::vector< const RegexT * > StorageT ; /// Where we store all created and compiled regexes, indexed with an integer. static StorageT & storage(void) { static StorageT s_storage ; return s_storage ; } public: RegexT( const char * reg, const char * name, ProxyGen gener, priority_t priority ) : m_str(reg) , m_name(name) , m_generator(gener) , m_priority(priority) { char tmpbuf[ 3 + strlen(m_str) ]; snprintf( tmpbuf, sizeof(tmpbuf), "^%s$", m_str ); int stat = regcomp( &m_regex, tmpbuf, REG_EXTENDED|REG_NOSUB); if(stat) treat_error(stat); } ~RegexT() { regfree( &m_regex ); } /// Returns the regular expression given its index. static const RegexT * Find(size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]; } static size_t Nb(void) { return RegexT::storage().size(); } /// Given a regular expression patterns, creates and compile the regular expression and stores it with an integer. static int CreateRgx( const char * reg, const char * name, ProxyGen gener, priority_t priority ) { typedef std::map< const char *, int > Name2idxT ; static Name2idxT name2idx ; Name2idxT::iterator it = name2idx.find(name); if( it != name2idx.end() ) return it->second ; int new_idx = storage().size(); storage().push_back( new RegexT( reg, name, gener, priority ) ); // The name is later used for easier retrieval from a Synop token. name2idx[ name ] = new_idx ; return new_idx ; }; static TokenProxy::Ptr CreateTokenProxy( int reg_idx, const std::string & wrd, size_t txt_offset ) { return Find(reg_idx)->m_generator( reg_idx, wrd, txt_offset ); } const char * Name(void) const { return m_name; } static const char * Name(size_t idx) { return Find(idx)->m_name; } // If two different tokens, with different regular expressions, match for the // same word, the priority tells which one to take. Default value is one. static priority_t Priority( size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]->m_priority; } bool Match( const std::string & str ) const { int stat = regexec( &m_regex, str.c_str(), 0, 0, 0 ); switch(stat) { case 0: //std::cout << "DEBUG: Matched [" << str << "] with [" << m_str << "] (" << m_name << ")\n"; return true ; case REG_NOMATCH: // std::cout << "DEBUG: NoMatch [" << str << "] with [" << m_str << "]\n"; return false ; default: break ; } treat_error(stat); return 0 ; // Will never be reached. } /// Stores the match result for each regular expression. class Context { // First bit to store whether we tried to match. Next bit for the result. std::vector m_flags ; /// TODO: Consider a compile-time size because we know the number of regular expressions. static size_t NbElts() { return RegexT::Nb(); }; public: Context() : m_flags( NbElts() * 2, false ) {} virtual ~Context() {} // This helps performance because the same regex appears in several chains. virtual bool Mtch( size_t reg_idx, const std::string & str ) { assert( m_flags.size() == NbElts() * 2 ); assert( m_flags.size() > 2 * reg_idx + 1 ); if( m_flags.at( 2 * reg_idx ) ) return m_flags[ 2 * reg_idx + 1 ]; m_flags[ 2 * reg_idx ] = true ; bool res = RegexT::Find(reg_idx)->Match( str ); m_flags[ 2 * reg_idx + 1 ] = res; return res; } }; }; // RegexT /// Loops in the tokens held by the container, for a precise type. template< class TokenDerived > const TokenDerived * TokenProxy::get_ptr(bool previous_chains) const { for( TokVec::Ptr curr_container = m_container ; curr_container ; curr_container = curr_container->previous() ) { for( TokVec::const_iterator it = curr_container->begin(), en = curr_container->end(); it != en ; ++it ) { const TokenDerived * ptr = dynamic_cast< const TokenDerived * >( it->operator->() ); if( ptr != NULL ) return ptr ; } if( ! previous_chains ) break ; } return NULL ; } const char * TokenProxy::RegexName(void) const { return RegexT::Name(m_regex_idx); }; /// Transforms a token nickname into a classname, intentionaly small to reduce symbol table size. #define CLASSTK(a) Tk_##a /// Each Synop group (aka Token° is associated to a regular expression, and a priority. #define GENTK_PRIORITY( TokDrv, Rgx, prio ) \ static int MakeRegex() { return RegexT::CreateRgx( Rgx, #TokDrv, TokenProxy::Generator< CLASSTK(TokDrv) >, prio ); } /// TODO: It is not necessary to add "=" or ";" at the end of the regular expressions. #define GENTK( TokDrv, Rgx ) GENTK_PRIORITY( TokDrv, Rgx, 1.0 ) /// Definition of a derived class associated to a five-digits group (Most of times) and a regular expression. /// Virtual inheritance because it might derive from another TokenProxy derived class. #define HEADTK(a) class CLASSTK(a) : virtual public TokenProxy /// For defining chains of tokens. Some tokens might be repeated, hence TKn. #define TKx(a) CLASSTK(a)::MakeRegex() /// If this token appears once and once only. #define TK1(a) {TKx(a),false} /// If this token can be repeated. #define TKn(a) {TKx(a),true} /// One element in a chain of token which forms a Synop line. struct TOKGEN { int m_rgx_idx; // Index to a regular expression. bool m_many; // If this token can be repeated or appears once only. }; // ---------------------------------------------------------------------------- /// Matches the usual message begin. HEADTK(ZCZC) { public: GENTK_PRIORITY( ZCZC, "ZCZC", MIN_PRIO ) bool Parse( const char * str ) { return 0 == strcmp( str, "ZCZC" ); } void Print() const { Section( "Bulletin preamble" ); } }; /// The id which might come after ZCZC. HEADTK(ZCZC_id) { int m_id ; public: GENTK( ZCZC_id, "[0-9]{2,4}" ) bool Parse( const char * str ) { return 1 == sscanf( str, "%d", &m_id ); } void Print() const { Append( _("Report number"), m_id ); } /// Can come only after ZCZC bool CanComeFirst(void) const { return false ; } }; /// Usual end of weather message. HEADTK(NNNN) { public: GENTK_PRIORITY( NNNN, "NNNN", MIN_PRIO ) bool Parse( const char * str ) { return 0 == strcmp( str, "NNNN" ); } void Print() const { Section( "Bulletin end" ); } }; /// Any coding will work if we store two chars in an integer. #define CHR2(x1,x2) (unsigned char)x1 * 256 + (unsigned char)x2 static const char * wx_code_to_txt( const char * strwx ) { int two_chars = CHR2(strwx[0],strwx[1]); switch( two_chars ) { case CHR2('S','H'): return _("Synoptic ship reports"); case CHR2('S','I'): return _("Intermediate synoptic reports"); case CHR2('S','M'): return _("Synoptic observations"); case CHR2('S','N'): return _("Non-standard synoptic hour"); default : return NULL; } } #undef CHR2 HEADTK(TTAAii) { char m_datatype[3]; char m_geographical[3] ; int m_number ; public: /** SH:Synoptic ship reports SI:Intermediate synoptic reports SM:Synoptic observations */ GENTK( TTAAii, "S[HIMN][A-Z0-9]{2}[0-9]{2}" ) bool Parse( const char * str ) { return 3 == sscanf( str, "%2s%2s%2d", m_datatype, m_geographical, &m_number ); } void Print() const { const char * dt_type = wx_code_to_txt(m_datatype); if(dt_type) { Append(_("Data type"), dt_type ); } else { std::stringstream strm ; strm << _("Unknown") << ':' << m_datatype << '.'; Append(_("WX data type"), strm.str() ); } Append(_("Geographical"), m_geographical ); const char * num = NULL ; switch( m_number ) { case 1 ... 19 : num = _("Inclusive for global distribution"); break; case 20 ... 39 : num = _("Inclusive for regional and interregional distribution"); break; case 40 ... 89 : num = _("Inclusive for national and bilaterally agreed distribution"); break; default : num = _("Reserved"); break; } Append(_("Number"), num ); } }; /// ICAO location. Found in document 7910. /// Or here: http://www.wmo.int/pages/prog/www/ois/Operational_Information/VolumeC1/CCCC_en.html /// http://weather.rap.ucar.edu/surface/stations.txt /// ftp://www.wmo.ch/wmo-ddbs/OperationalInfo/VolumeC1/To_WMO/ HEADTK(CCCC) { char m_icao[5]; public: GENTK( CCCC, "[A-Z]{4}" ) /// All these comparisons, because there might be confusion with other four-letters groups. bool Parse( const char * str ) { return 1 == sscanf( str, "%4s", m_icao ) && strcmp( m_icao, "AAXX" ) && strcmp( m_icao, "BBXX" ) && strcmp( m_icao, "OOXX" ) && strcmp( m_icao, "ZCZC" ) && strcmp( m_icao, "NNNN" ); } /// TODO: Lookup in wmo file. void Print() const { Append( _("ICAO indicator"), m_icao ); } }; static std::string hour_min( int hour, int min ) { char buf[10]; snprintf( buf, sizeof(buf), "%02d:%02d", hour, min ); return buf ; } HEADTK(YYGGgg) { /// Default date is today. time_t m_time; public: GENTK( YYGGgg, "[0-3][0-9][0-2][0-9][0-5][0-9]" ) bool Parse( const char * str ) { int day_of_month ; int UTC_observation_hour ; int UTC_observation_minute ; bool time_ok = ( 3 == sscanf( str, "%02d%02d%02d", &day_of_month, &UTC_observation_hour, &UTC_observation_minute ) ); time_ok = time_ok && ( day_of_month <= 31 ) && ( UTC_observation_hour <= 24 ) && ( UTC_observation_minute <= 59 ); if( ! time_ok ) return false ; m_time = DayHourMin2Tm( day_of_month, UTC_observation_hour, UTC_observation_minute ); return true ; } void Print() const { Append( _("UTC observation time"), Tm2SynopTime( m_time ) ); } /// Does not display anything because all the information is in the UTC time stamp. void DrawKml() const {} time_t ObservationTimeUTC() const { return m_time ; } }; /** BBB Forms The four forms of the BBB indicator group are: * RRx - Delayed (Retard) * CCx - Correction * AAx - Amendment * Pxx - Segment number * */ HEADTK(Numbered) { const char * m_format ; char m_number[3]; public: CLASSTK(Numbered)( const char * fmt ) : m_format(fmt) {}; void Print() const { Append( _("Segment number"), m_number ); } bool Parse( const char * str ) { return 1 == sscanf( str, m_format, m_number ); } const char * Number() const { return m_number ; } }; HEADTK(RRx), virtual CLASSTK(Numbered) { public: /** http://www.wmo.int/pages/prog/www/ois/Operational_Information/Publications/WMO_386/AHLsymbols/bbb_en.html "x=A for the first bulletin after the issuance of the initial bulletin; B, if another bulletin needs to be issued; and so on up to and including x = X; " This seems to be wrong, actually messages up to Y and Z are seen. GENTK( RRx, "RR[A-X]" ) */ GENTK( RRx, "RR[A-Z]" ) CLASSTK(RRx)() : CLASSTK(Numbered)( "RR%1s" ) {} }; HEADTK(CCx), virtual CLASSTK(Numbered) { public: GENTK( CCx, "CC[A-X]" ) CLASSTK(CCx)() : CLASSTK(Numbered)( "CC%1s" ) {} }; HEADTK(AAx), virtual CLASSTK(Numbered) { public: GENTK( AAx, "AA[A-X]" ) CLASSTK(AAx)() : CLASSTK(Numbered)( "AA%1s" ) {} }; /// Pxx is the segmentation BBB group as defined in the WMO document Guidelines For The Use Of The Indicator BBB HEADTK(Pxx), virtual CLASSTK(Numbered) { public: /// Details here: http://www.nws.noaa.gov/tg/bbb.php GENTK( Pxx, "P[A-Z]{2}" ) CLASSTK(Pxx)() : CLASSTK(Numbered)( "P%2s" ) {} }; /// ISMCS WMO STATION NUMBER LIST /// http://www.ncdc.noaa.gov/oa/climate/rcsg/cdrom/ismcs/alphanum.html /// http://www.weather.unisys.com/wxp/Appendices /// http://weather.unisys.com/wxp/Appendices/Formats/SYNOP.html /// 000 Group - Identification and Location /// /// IIiii The WMO number of the station. HEADTK(IIiii) { int m_wmo_indicator ; int m_region_number ; const char * m_region_name ; public: GENTK( IIiii, "[0-9]{5}" ) // GENTK( IIiii, "[0-9]{5}", MIN_PRIO ) /** The IIiii Structure The II or block number is allocated to the services within each Region by regional agreement. Station numbers iii corresponding to a common block number (II) except 89 are usually distributed so that the zone covered by a block number is divided into horizontal strips; e.g. one of several degrees of latitude. Where possible, station numbers within each strip increase from west to east and the first figure of the 3-figure station number increases from north to south. Station index numbers for station in the Antarctic are allocated by the Secretary-General in accordance with the following scheme: Each station has an international number 89xxy, where xx indicated the nearest 10 degree meridian which is numerically lower than the station longitude. For east longitudes, 50 is added; e.g. 89124 indicated a station between 120 degrees and 130 degrees west and 89654 indicates a station between longitudes 150 degrees and 160 degrees east. The figure "y" is allocated roughly according to the latitude of the station with "y" increasing towards the south. For station for which an international numbers are no longer available within the above scheme, the algorithm will be expanded by adding 20 to xx for west longitudes (range of index numbers 200-380) and 70 for east longitudes (range of index numbers 700-880) to provide new index numbers. Antarctic station which held numbers before the introduction of this scheme in 1957 retain their previously allocated index numbers. */ bool Parse( const char * str ) { // std::cout << "wmo=" << str << "\n"; /* Station index numbers consisting of one figure repeated five times, e.g. 55555, 77777, etc., or ending with 0000 or 9999, or duplicating special code indicators, e.g. 10001, 77744, 19191, 89998, etc., are not assigned to meteorological stations. We might check if the code exists or not. */ if( 1 != sscanf( str, "%d", &m_wmo_indicator ) ) return false ; m_region_name = ""; m_region_number = 0 ; // http://weather.noaa.gov/tg/site.shtml switch(m_wmo_indicator) { case 00000: case 11111: case 22222: case 33333: case 44444: case 55555: case 66666: case 77777: case 88888: case 99999: m_region_name = _("Unassigned"); return false ; default : break ; } /// More special codes. switch(m_wmo_indicator%10000) { case 0000: case 9999: return false ; default : break ; } switch(m_wmo_indicator) { case 60000 ... 69999: m_region_name = _("Africa"); m_region_number = 1 ; break; case 20000 ... 20099: case 20200 ... 21999: case 23000 ... 25999: case 28000 ... 32999: case 35000 ... 36999: case 38000 ... 39999: case 40350 ... 48599: case 48800 ... 49999: case 50000 ... 59999: m_region_name = _("Asia"); m_region_number = 2 ; break; case 80000 ... 88999: m_region_name = _("South America"); m_region_number = 3 ; break; case 70000 ... 79999: m_region_name = _("North and Central America"); m_region_number = 4 ; break; case 48600 ... 48799: case 90000 ... 98999: m_region_name = _("South-West Pacific"); m_region_number = 5 ; break; case 00000 ... 19999: case 20100 ... 20199: case 22000 ... 22999: case 26000 ... 27999: case 33000 ... 34999: case 37000 ... 37999: case 40000 ... 40349: m_region_name = _("Europe"); m_region_number = 6 ; break; case 89000 ... 89999: m_region_name = _("Antarctic"); m_region_number = 9 ; break; } /* NOT SURE THIS IS REALLY USEFUL <<<<<<<<<<<================== */ // std::cout << "region=" << m_region_name << "\n"; return true ; } /// Huge list: http://www.ncdc.noaa.gov/oa/climate/rcsg/cdrom/ismcs/alphanum.html int WmoIndicator(void) const { return m_wmo_indicator; } /// Official file: http://weather.noaa.gov/data/nsd_bbsss.txt void Print() const { std::stringstream strm ; strm << std::setfill('0') << std::setw(5) << m_wmo_indicator ; std::string wmo_str = strm.str(); Append( _("WMO Station"), wmo_str ); const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( m_wmo_indicator ); if( ptrWmo ) Append( _("WMO station"), *ptrWmo ); else { Append( _("WMO station"), "WMO_" + wmo_str ); } } void DrawKml() const {} }; HEADTK(AAXX) { public: GENTK( AAXX, "AAXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "AAXX" ); } void Print() const { Section( _("Land station observation") ); } }; /// SHIP report. HEADTK(BBXX) { public: GENTK( BBXX, "BBXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "BBXX" ); } void Print() const { Section( _("Ship observation") ); } }; /// SYNOP MOBILE. HEADTK(OOXX) { public: GENTK( OOXX, "OOXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "OOXX" ); } void Print() const { Section( _("Mobile observation") ); } }; /// http://metaf2xml.sourceforge.net/parser.pm.html#trends HEADTK(MMMULaULo) { /// See decoding here: http://icoads.noaa.gov/Release_1/suppG.html int m_Marsden_square ; double m_latitude; double m_longitude; public: /// Lower priority because it should not be selected against any other chain beginning. GENTK_PRIORITY( MMMULaULo, "[0-9/]{5}", 0.5 ) /// TODO: Marsden square was not tested enough. bool Parse( const char * str ) { m_Marsden_square = -1; m_latitude = 0.0 ; m_longitude = 0.0 ; if( 0 == strncmp( str, "/////", 5 ) ) return true ; // Only slashes or no slash at all. if ( NULL != strchr( str, '/' ) ) return false ; char char_lat ; char char_lon ; if ( 3 != sscanf( str, "%3d%c%c", &m_Marsden_square, &char_lat, &char_lon ) ) return false; m_latitude = 90.0 - ( m_Marsden_square / 36.0 ) ; m_longitude = ( m_Marsden_square % 36 ) - 30.0 ; m_latitude += char_lat - '0' ; m_longitude += char_lon - '0' ; /// East longitude is positive, West is negative. return true; } void Print() const { /// Very approximate. if( m_Marsden_square > 0 ) { Append( _("Marsden latitude"), m_latitude ); Append( _("Marsden longitude"), m_longitude ); } else { Append( _("Coordinates"), _("Marsden square not defined") ); } } bool MarsdenValid(void) const { return m_Marsden_square >= 0; } double Latitude(void) const { assert( MarsdenValid() ); return m_latitude; } double Longitude(void) const { assert( MarsdenValid() ); return m_longitude; } bool CanComeFirst(void) const { return false ; } }; /// Position of the station (Marsden square, height) /// http://metaf2xml.sourceforge.net/parser.pm.html#trends /// h0h0h0h0im elevation of mobile land station, units of elevation, and elevation accuracy /// h0hoh0h0 elevation if meters or feet as indicated by im /// im indicator for units of elevation and confidence factor of accuracy HEADTK(h0h0h0h0im) { /// See decoding here: http://icoads.noaa.gov/Release_1/suppG.html int m_height ; char m_indicator ; public: GENTK( h0h0h0h0im, "[0-9/]{4}[1-8]" ) bool Parse( const char * str ) { m_height = 0; m_indicator = '0'; return ( 2 == sscanf( str, "%4d%c", &m_height, &m_indicator ) ); } void Print() const { const char * unit = ""; switch(m_indicator) { case '1' ... '4' : unit = Unit_meters; break; case '5' ... '8' : unit = Unit_feet; break; default: ; } Append( _("Height"), m_height, unit ); const char * indicators[] = { _("Not Used"), _("Excellent (within 3 meters)"), _("Good (within 10 meters)"), _("Fair (within 20 meters)"), _("Poor (more than 20 meters)"), _("Excellent (within 10 feet)"), _("Good (within 30 feet)"), _("Fair (within 60 feet)"), _("Poor (more than 60 feet)") }; disp_arr(indicators,G_N_ELEMENTS(indicators),m_indicator,'0',_("Precision")); } /// It is dependent on the previous token, MMMUL. bool CanComeFirst(void) const { return false ; } }; /// NIL HEADTK(NIL) { public: GENTK( NIL, "NIL[;=]?" ) bool Parse( const char * str ) { return 0 == strncmp( str, "NIL", 3 ); } void Print() const { Append( _("Token"), _("End of section") ); } void DrawKml() const {} }; /// Ship or Buoy Observations: IIIII The ship or buoy identifier HEADTK(IIIII) { static const size_t maxsz = 20 ; char m_ship_buoy_identifier[maxsz] ; public: GENTK( IIIII, "[A-Z0-9]{3,9}" ) /// We filter some identifiers. bool Parse( const char * str ) { // If this is a five-digits string, it cannot reasonably be an identifier. if( ( 5 == strlen( str ) ) && ( 5 == strspn( str, "0123456789" ) ) ) { return false ; } /// Due to parsing error, we might take the next group header (333 or 555) as a ship name. bool resu = ( 1 == sscanf( str, "%9s", m_ship_buoy_identifier ) ) && ( strcmp( m_ship_buoy_identifier, "333" ) ) && ( strcmp( m_ship_buoy_identifier, "555" ) ); if( resu ) { // Some ships are apparently anonymous, we give them an unique name. if( 0 == strcmp( "SHIP", m_ship_buoy_identifier ) ) { static int ship_counter = 0 ; ++ship_counter ; snprintf( m_ship_buoy_identifier, sizeof(m_ship_buoy_identifier), "SHIP_%d", ship_counter ); } } else { m_ship_buoy_identifier[0] = '\0'; } return resu; } void Print() const { Append( _("Ship/Buoy identifier"), m_ship_buoy_identifier ); } void DrawKml() const {} /// Information about buoys: /// http://www.ndbc.noaa.gov/marine_notice.shtml /// http://www.ndbc.noaa.gov/stndesc.shtml /// http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml const char * ShipIdentifier(void) const { return m_ship_buoy_identifier; } }; /// ff -- wind speed in units determined by wind type indicator (see above) static const choice< char > wind_speed_units[] = { { '0',_("m/s (Estimated)") }, { '1',_("m/s (Anemometer)") }, { '3',_("knots (Estimated)") }, { '4',_("knots (Anemometer)") } }; FM12CodeTable( wind_speed_units, 1855, _("Indicator for source and units of wind speed") ); /// Apparently one can also find YYGGggi: /// YY -- Monatstag (UTC) /// GG -- Beobachtungszeit (UTC) in vollen Stunden /// gg -- Beobachtungszeit in Minuten (wird nur bei Halbstundenterminen benutzt: gg = 30) /// iw -- Indikator für Windangaben: /// YYGGi /// YY -- The day of the month /// GG -- The hour of the observation (UTC) /// iw -- Wind type indicator /// For more safety, we could search today's date only, but testing is more difficult. HEADTK(YYGGi) { time_t m_time; char m_wind_type_indicator ; public: GENTK( YYGGi, "[0-3][0-9][0-2][0-9][0134]" ) bool Parse( const char * str ) { int day_of_month; int UTC_observation_hour; if ( 3 != sscanf( str, "%02d%02d%c", &day_of_month, &UTC_observation_hour, &m_wind_type_indicator ) ) return false ; if ( ( day_of_month > 31 ) || ( day_of_month < 1 ) || ( UTC_observation_hour > 24 ) || ( NULL == strchr( "0134", m_wind_type_indicator ) ) ) return false; // std::cout << __FUNCTION__ << ":" << UTC_observation_hour << " " << day_of_month << "\n"; m_time = DayHourMin2Tm( day_of_month, UTC_observation_hour, 0 ); return true; } void Print() const { Append( _("UTC observation time"), Tm2SynopTime( m_time ) ); // No need to display it twice because it will appear after the speed value. if( tstDisp ) { Append( _("Wind type indicator"), choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), m_wind_type_indicator, _("Unknown speed unit type") ) ); } } /// Does not display anything because all the information is displayed later. void DrawKml() const {} time_t ObservationTimeUTC() const { return m_time ; } friend class CLASSTK(Nddff); }; /// 99LLL QLLLL /// LLL -- Latitude of observation to .1 degrees /// Q -- Quadrant of observation HEADTK(99LLL) { int m_latit_10deg ; public: GENTK( 99LLL, "99[0-9]{3}" ) bool Parse( const char * str ) { // The latitude starts at the third char, after "99". if ( 1 != sscanf( str + 2, "%d", &m_latit_10deg ) ) return false; // Latitudes are between 0 and 90 degrees. return ( m_latit_10deg <= 900 ); } void Print() const { Append( _("QLLLL token"), _("Present") ); } /// Does not display anything because all the information is displayed later as coordinates. void DrawKml() const {} /// It is dependent on the previous token. bool CanComeFirst(void) const { return false ; } friend class CLASSTK(QLLLL); }; /// LLLL -- Longitude of observation to .1 degrees HEADTK(QLLLL) { char m_quadrant ; int m_longit_10deg ; mutable bool m_calc_done ; mutable bool m_coordinates_ok ; mutable double m_Longitude ; mutable double m_Latitude ; /// Can be called only once this token is inserted in a group. void Calc(void) const { if( m_calc_done ) return ; m_calc_done = true ; const CLASSTK(99LLL) * ptr_99LLL = TokenProxy::get_ptr< CLASSTK(99LLL) >(false); if( ptr_99LLL ) { m_Longitude = 0.0; m_Latitude = 0.0; m_coordinates_ok = false ; } double lat = ptr_99LLL ? (double)ptr_99LLL->m_latit_10deg * 0.1 : 0.0 ; double lon = (double)m_longit_10deg * 0.1 ; m_coordinates_ok = true ; // East longitude and north latitude are positive. switch( m_quadrant ) { case '1': break ; // North-East case '3': lat = -lat; break ; // South-East case '5': lon = -lon; lat = -lat; break ; // South-West case '7': lon = -lon; break ; // North-West default : m_coordinates_ok = false; break; } m_Longitude = lon; m_Latitude = lat; } public: CLASSTK(QLLLL) () : m_calc_done(false), m_coordinates_ok(false) {} GENTK( QLLLL, "[1357][0-9]{4}" ) bool Parse( const char * str ) { // Check that longitude is smaller than 180 in tenth of degrees. return ( 2 == sscanf( str, "%c%d", &m_quadrant, &m_longit_10deg ) ) && ( m_longit_10deg <= 1800 ); } void Print() const { Calc(); if(m_coordinates_ok) { Append( _("Longitude"), m_Longitude ); Append( _("Latitude"), m_Latitude ); } else { Append( _("Coordinates"), _("Wrong coordinates format") ); } } /// Does not display anything because all the information is displayed as coordinates. void DrawKml() const {} bool CanComeFirst(void) const { return false ; } const bool CoordinatesOK() const { return m_coordinates_ok; } double Longitude() const { Calc(); assert( m_coordinates_ok ); return m_Longitude; } double Latitude () const { Calc(); assert( m_coordinates_ok ); return m_Latitude ; } }; static const char * cloud_bases[]= { _("0 to 50 m"), _("50 to 100 m"), _("100 to 200 m"), _("200 to 300 m"), _("300 to 600 m"), _("600 to 1000 m"), _("1000 to 1500 m"), _("1500 to 2000 m"), _("2000 to 2500 m"), _("above 2500 m"), _("unknown") }; FM12CodeTable( cloud_bases, 1600, _("Height above surface of the base of the lowest cloud seen") ); /// 111 Group - Land Observations /// Apparently there are differences between FM12 and FM13X which is more recent. /// iihVV HEADTK(iihVV) { char m_precipitation ; char m_station_type ; char m_cloud_base ; int m_visibility ; public: GENTK( iihVV, "[0-4][1-7][0-9/][0-9/]{2}" ) bool Parse( const char * str ) { // TODO; Frequently mismatched with "222//" . Should add a special case. int nbMtch = sscanf( str, "%c%c%c%d", &m_precipitation, &m_station_type, &m_cloud_base, &m_visibility ); // "46///" is a valid string. // std::cout << __FUNCTION__ << ":" << str << " " << nbMtch << "\n"; switch(nbMtch) { case 4 : return true ; case 3 : m_visibility = -1; // i.e. "missing" return 0 == strcmp( str + 3, "//" ); default: return false ; } } bool isAutomated(void) const { switch( m_station_type ) { default : return false ; case '4': case '5': case '6': case '7': return true; } } void Print() const { /// iR -- Precipitation indicator static const char * precipitations[] = { _("In groups 1 and 3"), _("In group 1 only"), _("In group 3 only"), _("Omitted, no precipitation"), _("Omitted, no observation") }; FM12CodeTable( precipitations, 1819, _("Indicator for inclusion or mossion of precipitation data") ); disp_arr(precipitations,G_N_ELEMENTS(precipitations),m_precipitation,'0',_("Precipitations")); /// ix -- Station type and present and past weather indicator. Tells if the group 7WW is included. static const char * station_types[] = { _("Manned station (With 7WW)"), _("Manned station. Not significant (No 7WW)"), _("Manned station. No observation (No 7WW)"), _("Automated station (With 7WW)"), _("Automated station. Not significant (No 7WW)"), _("Automated station. No observation (No 7WW)"), _("Automated station (With 7WW)") }; FM12CodeTable( stations_types, 1860, _("Indicator for type of station operation and for present and past weather data") ); disp_arr(station_types,G_N_ELEMENTS(station_types),m_station_type,'1',_("Station type")); /// h -- Cloud base of lowest cloud seen (meters above ground) disp_arr(cloud_bases,G_N_ELEMENTS(cloud_bases),m_cloud_base,'0',_("Cloud base")); /// VV -- Visibility const char *vis = _("Visibility"); switch( m_visibility ) { case 0 : Append( vis, _("Less than 0.1"), Unit_km ); break ; case 1 ...50 : Append( vis, m_visibility / 10, Unit_km ); break ; case 51 ...79 : Append( vis, m_visibility - 50, Unit_km ); break ; case 80 ...88 : Append( vis, 30 + 5 * ( m_visibility - 80 ), Unit_km ); break ; case 89 : Append( vis, _("Greater than 70"), Unit_km ); break; case 90 : Append( vis, _("Less than 0.05"), Unit_km ); break; case 91 : Append( vis, 0.05, Unit_km ); break; case 92 : Append( vis, 0.2, Unit_km ); break; case 93 : Append( vis, 0.5, Unit_km ); break; case 94 : Append( vis, 1, Unit_km ); break; case 95 : Append( vis, 2, Unit_km ); break; case 96 : Append( vis, 4, Unit_km ); break; case 97 : Append( vis, 10, Unit_km ); break; case 98 : Append( vis, 20, Unit_km ); break; case 99 : Append( vis, _("Greater than 50"), Unit_km ); break; default : Append( vis, _("Missing") ); break; } } }; /// TODO: Use these graphic symbols: http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml static const char * cloud_covers[]= { _("0 eighths (clear)"), _("1/8"), _("2/8"), _("3/8"), _("4/8"), _("5/8"), _("6/8"), _("7/8"), _("8/8 (overcast)"), _("Sky obscured"), _("No observation") }; FM12CodeTable( cloud_covers, 2700, _("Amount of cloud cover") ); /// Nddff HEADTK(Nddff) { char m_cloud_cover ; /// In ten of degrees. int m_wind_direction ; int m_wind_speed ; public: GENTK( Nddff, "[0-9/][0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_cloud_cover = '/'; m_wind_direction = 0; m_wind_speed = 0 ; // Can be "/////" or "8////" plus trailing characters. if ( 0 == strncmp( str + 1, "////", 4) ) return true ; return ( 3 == sscanf( str, "%c%2d%2d", &m_cloud_cover, &m_wind_direction, &m_wind_speed ) ) && ( ( m_wind_direction <= 36 ) || ( m_wind_direction == 99 ) ); } void Print() const { // N -- Total cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // dd -- wind direction in 10s of degrees if( m_wind_direction == 99 ) Append( _("Wind direction"), _("Variable, all directions, confused, indeterminate direction") ); else if( m_wind_direction == 0 ) Append( _("Wind direction"), _("No motion or no waves") ); else Append( _("Wind direction"), m_wind_direction * 10 - 5 , Unit_degrees ); FM12CodeTable( xxx, 0877, _("True direction in tenth of degrees") ); // We search for this token not only in this section but in the previous ones. const CLASSTK(YYGGi) * ptr_YYGGi = TokenProxy::get_ptr< CLASSTK(YYGGi) >(true); const char * wind_speed_title = _("Wind speed"); if( ptr_YYGGi ) { Append( wind_speed_title, m_wind_speed, choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), ptr_YYGGi->m_wind_type_indicator, _("Unknown speed unit type") ) ); } else { Append( wind_speed_title, m_wind_speed, _("No unit (YYGGi missing)") ); } } bool CanComeFirst(void) const { return false ; } }; /// 00fff (optional) HEADTK(00fff) { int m_wind_speed ; public: /// Lower priority than Nddff GENTK_PRIORITY( 00fff, "00[0-9]{3}", 0.5 ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "00%3d", &m_wind_speed ) ); } void Print() const { // fff -- wind speed if value greater than 100 Append( _("Wind speed"), m_wind_speed ); } }; /// Returns true if this temperature makes sense. static bool CheckCelsius( char sign, int temperature_tenth ) { switch( sign ) { case '1' : return temperature_tenth < 700 ; case '0' : return temperature_tenth < 600 ; case '/' : return true ; default : return false ; } } /// Prints the temperature or relative humidity. static void AppCelsius( const TokenProxy * ptrTok, const char * title, char sign, int temperature_tenth ) { if( title == NULL ) title = "No title"; switch( sign ) { case '1' : temperature_tenth = -temperature_tenth ; case '0' : ptrTok->Append( title, temperature_tenth * 0.10, Unit_Celsius ); break; case '9' : ptrTok->Append( _("Relative humidity"), (double)temperature_tenth * 0.10 , "%" ); break; case '/' : ptrTok->Append( title, _("Undefined") ); break; default : ptrTok->Append( title, _("Unexpected case") ); break; } } /// 1sTTT_air -- Temperature HEADTK(1sTTT_air) { char m_temperature_sign ; int m_temperature ; public: GENTK( 1sTTT_air, "1[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 0; if( 0 == strncmp( str, "1////", 5 ) ) return true ; return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } /// s: sign of temperature (0=positive, 1=negative). TTT: Temperature in .1 C void Print() const { AppCelsius( this, _("Temperature"), m_temperature_sign, m_temperature ); } }; /// 2sTTT_dew -- Dewpoint HEADTK(2sTTT_dew) { char m_temperature_sign ; int m_temperature ; public: GENTK( 2sTTT_dew, "2[019/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature = 0; int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); // Temperature check does not apply if humidity. case 2 : return ( m_temperature_sign == '9' ) || CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// TTT -- Dewpoint temperature in .1 C (if sign is 9, TTT is relative humidity) void Print() const { // s -- sign of temperature (0=positive, 1=negative, 9 = Relative humidity) AppCelsius( this, _("Dewpoint temperature"), m_temperature_sign, m_temperature ); } }; /// Station pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) static void thousands_omitted( const TokenProxy * ptrTok, const char * pressure, const char * title ) { char buf[7]; int idx = 0 ; if( pressure[0] == '0' ) buf[idx++] = '1' ; strcpy( buf + idx, pressure ); char *slashpos = strchr( buf, '/' ); if( slashpos != NULL ) *slashpos = '0' ; double tmpPres ; // Checks reasonable values for a pressure. if( ( 1 != sscanf( buf, "%lf", &tmpPres ) ) || ( tmpPres > 12000 ) || ( tmpPres < 7000 ) ) { ptrTok->Append( title, _("Inconsistent:") + std::string(pressure) ); } else { ptrTok->Append( title, (int)( tmpPres / 10.0 ), Unit_hPa ); } }; /// 3PPPP -- Station pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) HEADTK(3PPPP) { char m_station_pressure[5]; public: GENTK( 3PPPP, "3[0789/][0-9/]{3}" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "3%s", m_station_pressure ) ); } void Print() const { thousands_omitted( this, m_station_pressure, _("Station pressure") ); } }; /** 4PPPP -- Sea level pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) Can be as well 4ahhh http://metaf2xml.sourceforge.net/parser.pm.html : a3 Isobaric surface (CT 0264), hhh Geopotential of isobaric surface */ HEADTK(4PPPP) { bool m_4PPPP ; char m_sea_level_pressure[5]; char m_isobaric_surface ; int m_geopotential ; public: GENTK( 4PPPP, "4[0912378/][0-9/]{3}" ) bool Parse( const char * str ) { m_4PPPP = false; m_sea_level_pressure[0] = '\0'; m_isobaric_surface = '/'; m_geopotential = -1; switch( str[1] ) { case '0': case '9': m_4PPPP = true ; return ( 1 == sscanf( str, "4%s", m_sea_level_pressure ) ); case '1': case '2': case '3': case '7': case '8': m_4PPPP = false ; return ( 2 == sscanf( str, "4%c%3d", &m_isobaric_surface, &m_geopotential ) ); case '/': m_4PPPP = true ; return ( 0 == strcmp( str, "4////" ) ); default : return false ; } } void Print() const { if(m_4PPPP) { thousands_omitted( this, m_sea_level_pressure, _("Sea level pressure") ); } else { int iso_surf = 0 ; switch( m_isobaric_surface ) { case '1': iso_surf = 1000; break; // 100 meters. case '2': iso_surf = 925; break; // 800 meters. case '3': iso_surf = 500; break; // 5000 meters case '7': iso_surf = 700; break; // 3000 meters case '8': iso_surf = 850; break; // 1500 meters. default : break ; } FM12CodeTable( xxx, 0264, _("Standard Isobaric surface for which the geopotential is reported") ); Append( _("Isobaric surface"), iso_surf, Unit_hPa ); } } }; /// 4ahhh -- Geopotential of nearest mandatory pressure level HEADTK(4ahhh) { char m_mandatory_pressure_level ; char m_geopotential_height[4] ; public: GENTK( 4ahhh, "4[12579][0-9]{3}" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%c%s", &m_mandatory_pressure_level, m_geopotential_height ) ); } void Print() const { /// a3 -- mandatory pressure level static const choice< char > mandatory_pressure_levels[] = { { '1', "1000" }, { '2', "925" }, { '5', "500" }, { '7', "700" }, { '8', "850" } }; Append( _("Mandatory pressure level"), choice_map( mandatory_pressure_levels, G_N_ELEMENTS( mandatory_pressure_levels ), m_mandatory_pressure_level, _("Unknown mandatory pressure level") ), _("millibar") ); /// hhh -- geopotential height omitting thousandths digit thousands_omitted( this, m_geopotential_height, _("Geopotential height") ); } }; /// 5appp -- Pressure tendency over 3 hours HEADTK(5appp) { char m_pressure_tendency ; int m_pressure_change ; public: GENTK( 5appp, "5[0-8/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { // std::cout << "str=" << str << "\n"; int nbMtch = sscanf( str, "5%c%d", &m_pressure_tendency, &m_pressure_change ); switch( nbMtch ) { case 0 : return false; case 1 : return 0 == strcmp( str, "5////"); case 2 : return true; default: return false; } } /// Symbols associated to each value: http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml void Print() const { /// a -- characteristics of pressure tendency static const char * pressure_tendencies[] = { _("Increasing, then decreasing. Same or higher"), _("Increasing, then steady. Raises"), _("Increasing steadily. Raises"), _("Decreasing or steady, then increasing. Raises"), _("Steady. Resultant same"), _("Decreasing, then increasing. Lowers"), _("Decreasing, then steady. Lowers"), _("Decreasing steadily. Lowers"), _("Increasing or steady, then decreasing. Lowers") }; FM12CodeTable( pressure_tendencies, 0200, _("Characteristics of pressure tendency during three last hours") ); disp_arr(pressure_tendencies,G_N_ELEMENTS(pressure_tendencies),m_pressure_tendency,'0',_("Pressure tendency")); /// ppp -- 3 hour pressure change in 0.1 mb if( m_pressure_tendency == '/' ) { Append( _("Pressure change"), _("Not specified") ); } else { Append( _("Pressure change"), m_pressure_change / 10.0, Unit_hPa ); } } }; static void display_precipitation( const TokenProxy * ptrTok, char precipitation_duration ) { int nb_hours ; /// This could be replaced by a table like the other codes tables. switch( precipitation_duration ) { case '1': nb_hours = 6; break; case '2': nb_hours = 12; break; case '3': nb_hours = 18; break; case '4': nb_hours = 24; break; case '5': nb_hours = 1; break; case '6': nb_hours = 2; break; case '7': nb_hours = 3; break; case '8': nb_hours = 9; break; case '9': nb_hours = 15; break; case '/': nb_hours = 24; break; default : nb_hours = -1; break; } FM12CodeTable( xxx, 4019, _("Duration of period of precipitation") ); if( nb_hours < 0 ) ptrTok->Append( _("Precipitation duration"), _("Undetermined") ); else ptrTok->Append( _("Precipitation duration"), nb_hours, Unit_hours ); } /// 6RRRt -- Liquid precipitation HEADTK(6RRRt) { int m_precipitation_amount ; char m_precipitation_duration ; public: GENTK( 6RRRt, "6[0-9/]{3}[0-9/][;=]?" ) bool Parse( const char * str ) { m_precipitation_amount = -1 ; m_precipitation_duration = '0' ; return ( 2 == sscanf( str, "6%3d%c", &m_precipitation_amount, &m_precipitation_duration ) ) || ( 1 == sscanf( str, "6///%c", &m_precipitation_duration ) ) || ( 0 == strncmp( str, "60000", 5 ) ); } void Print() const { /// RRR -- Precipitation amount in mm const char * precip = _("Precipitation amount"); switch( m_precipitation_amount ) { case 0 ... 988 : Append( precip, m_precipitation_amount, Unit_mm );break; case 989 : Append( precip, _("989 mm or more") );break; case 990 : Append( precip, _("Traces") );break; case 991 ... 999 : Append( precip, ( m_precipitation_amount - 990 ) / 10.0, Unit_mm );break; default : Append( precip, m_precipitation_amount, _("Inconsistent") ); break; } FM12CodeTable( xxx, 3590, _("Amount of precipitation") ); /// t -- Duration over which precipitation amount measured display_precipitation( this, m_precipitation_duration ); } }; /// 7wwWW -- Present and past weather HEADTK(7wwWW) { int m_present_weather ; char m_past_weather_1 ; char m_past_weather_2 ; mutable bool m_calc_done ; mutable bool m_automated ; /// Can be called only once this token is inserted in a group. void Calc(void) const { if( m_calc_done ) return ; m_calc_done = true ; const CLASSTK(iihVV) * ptr_iihVV = TokenProxy::get_ptr< CLASSTK(iihVV) >(false); if( ptr_iihVV ) { m_automated = ptr_iihVV->isAutomated(); } else m_automated = false ; } void PrintPastWeather( char weather, const char * title ) const { static const char * past_weathers_manned[] = { _("Cloud covering less than half of sky"), _("Cloud covering more than half of sky during part of period and more than half during part of period"), _("Cloud covering more than half of sky"), _("Sandstorm, duststorm or blowing snow"), _("Fog, or thick haze"), _("Drizzle"), _("Rain"), _("Snow or mixed rain and snow"), _("Showers"), _("Thunderstorms") }; FM12CodeTable( past_weathers_manned, 4561, _("Past weather reported from a manned weather station") ); static const char * past_weathers_automated[] = { _("No significant weather"), _("Visibility reduced"), _("Blowing phenomena, visibility reduced"), _("Fog"), _("Precipitation"), _("Drizzle"), _("Rain"), _("Snow, or Ice pellets"), _("Showers or intermittent precipitation"), _("Thunderstorm") }; FM12CodeTable( past_weathers_automated, 4532, _("Past weather reported from an automated weather station") ); // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code // http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf "Land Synoptic Code" if( m_automated ) { disp_arr(past_weathers_automated,G_N_ELEMENTS(past_weathers_automated),weather,'0',title); } else { disp_arr(past_weathers_manned,G_N_ELEMENTS(past_weathers_manned),weather,'0',title); } } public: CLASSTK(7wwWW) () : m_calc_done(false), m_automated(false) {} GENTK( 7wwWW, "7[0-9/]{2}[0-9/][0-9/]" ) bool Parse( const char * str ) { m_present_weather = '/' ; m_past_weather_1 = m_past_weather_2 = '/'; return ( 0 == strcmp( "7////", str ) ) || ( 2 == sscanf( str, "7//%c%c", &m_past_weather_1, &m_past_weather_2 ) ) || ( 3 == sscanf( str, "7%2d%c%c", &m_present_weather, &m_past_weather_1, &m_past_weather_2 ) ); } void Print() const { Calc(); /// ww -- Present weather static const char * present_weathers_manned[] = { _("Clear skies"), _("Clouds dissolving"), _("State of sky unchanged"), _("Clouds developing"), // Haze, smoke, dust or sand _("Visibility reduced by smoke"), _("Haze"), _("Widespread dust in suspension not raised by wind"), _("Dust or sand raised by wind"), _("Well developed dust or sand whirls"), _("Dust or sand storm within sight but not at station"), // Non-precipitation events _("Mist"), _("Patches of shallow fog"), _("Continuous shallow fog"), _("Lightning visible, no thunder heard"), _("Precipitation within sight but not hitting ground"), _("Distant precipitation but not falling at station"), _("Nearby precipitation but not falling at station"), _("Thunderstorm but no precipitation falling at station"), _("Squalls within sight but no precipitation falling at station"), _("Funnel clouds within sight"), // Precipitation within past hour but not at observation time _("Drizzle"), _("Rain"), _("Snow"), _("Rain and snow"), _("Freezing rain"), _("Rain showers"), _("Snow showers"), _("Hail showers"), _("Fog"), _("Thunderstorms"), // Duststorm, sandstorm, drifting or blowing snow _("Slight to moderate duststorm, decreasing in intensity"), _("Slight to moderate duststorm, no change"), _("Slight to moderate duststorm, increasing in intensity"), _("Severe duststorm, decreasing in intensity"), _("Severe duststorm, no change"), _("Severe duststorm, increasing in intensity"), _("Slight to moderate drifting snow, below eye level"), _("Heavy drifting snow, below eye level"), _("Slight to moderate drifting snow, above eye level"), _("Heavy drifting snow, above eye level"), // Fog or ice fog _("Fog at a distance"), _("Patches of fog"), _("Fog, sky visible, thinning"), _("Fog, sky not visible, thinning"), _("Fog, sky visible, no change"), _("Fog, sky not visible, no change"), _("Fog, sky visible, becoming thicker"), _("Fog, sky not visible, becoming thicker"), _("Fog, depositing rime, sky visible"), _("Fog, depositing rime, sky not visible"), // Drizzle _("Intermittent light drizzle"), _("Continuous light drizzle"), _("Intermittent moderate drizzle"), _("Continuous moderate drizzle"), _("Intermittent heavy drizzle"), _("Continuous heavy drizzle"), _("Light freezing drizzle"), _("Moderate to heavy freezing drizzle"), _("Light drizzle and rain"), _("Moderate to heavy drizzle and rain"), // Rain _("Intermittent light rain"), _("Continuous light rain"), _("Intermittent moderate rain"), _("Continuous moderate rain"), _("Intermittent heavy rain"), _("Continuous heavy rain"), _("Light freezing rain"), _("Moderate to heavy freezing rain"), _("Light rain and snow"), _("Moderate to heavy rain and snow"), // Snow _("Intermittent light snow"), _("Continuous light snow"), _("Intermittent moderate snow"), _("Continuous moderate snow"), _("Intermittent heavy snow"), _("Continuous heavy snow"), _("Diamond dust"), _("Snow grains"), _("Snow crystals"), _("Ice pellets"), // Showers _("Light rain showers"), _("Moderate to heavy rain showers"), _("Violent rain showers"), _("Light rain and snow showers"), _("Moderate to heavy rain and snow showers"), _("Light snow showers"), _("Moderate to heavy snow showers"), _("Light snow/ice pellet showers"), _("Moderate to heavy snow/ice pellet showers"), _("Light hail showers"), _("Moderate to heavy hail showers"), // Thunderstorms _("Thunderstorm in past hour, currently only light rain"), _("Thunderstorm in past hour, currently only moderate to heavy rain"), _("Thunderstorm in past hour, currently only light snow or rain/snow mix"), _("Thunderstorm in past hour, currently only moderate to heavy snow or rain/snow mix"), _("Light to moderate thunderstorm"), _("Light to moderate thunderstorm with hail"), _("Heavy thunderstorm"), _("Heavy thunderstorm with duststorm"), _("Heavy thunderstorm with hail") }; FM12CodeTable( present_weathers_manned, 4677, _("Present weather reported from a manned weather station") ); /// http://near-goos1.jodc.go.jp/rdmdb/format/JMA/wawa.html static const char * present_weathers_automated[] = { _("No significant weather observed"), _("Clouds generally dissolving or becoming less developed during the past hour"), _("State of sky on the whole unchanged during the past hour"), _("Clouds generally forming or developing during the past hour"), _("Haze or smoke, or dust in suspension in the air, visibility equal to, or greater than, 1 km"), _("Haze or smoke, or dust in suspension in the air, visibility less than 1 km"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("Mist"), _("Diamond dust"), _("Distant lightning"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("Squalls"), _("Reserved"), // Code figures 20–26 are used to report precipitation, fog (or ice fog) // or thunderstorm at the station during the preceding hour but not at the time of observation. _("Fog"), _("PRECIPITATION"), _("Drizzle (not freezing) or snow grains"), _("Rain (not freezing)"), _("Snow"), _("Freezing drizzle or freezing rain"), _("Thunderstorm (with or without precipitation)"), _("BLOWING OR DRIFTING SNOW OR SAND"), _("Blowing or drifting snow or sand, visibility equal to, or greater than, 1 km"), _("Blowing or drifting snow or sand, visibility less than 1 km"), _("FOG"), _("Fog or ice fog in patches"), _("Fog or ice fog, has become thinner during the past hour"), _("Fog or ice fog, no appreciable change during the past hour"), _("Fog or ice fog, has begun or become thicker during the past hour"), _("Fog, depositing rime"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("PRECIPITATION"), _("Precipitation, slight or moderate"), _("Precipitation, heavy"), _("Liquid precipitation, slight or moderate"), _("Liquid precipitation, heavy"), _("Solid precipitation, slight or moderate"), _("Solid precipitation, heavy"), _("Freezing precipitation, slight or moderate"), _("Freezing precipitation, heavy"), _("Reserved"), _("DRIZZLE"), _("Drizzle, not freezing, slight"), _("Drizzle, not freezing, moderate"), _("Drizzle, not freezing, heavy"), _("Drizzle, freezing, slight"), _("Drizzle, freezing, moderate"), _("Drizzle, freezing, heavy"), _("Drizzle and rain, slight"), _("Drizzle and rain, moderate or heavy"), _("Reserved"), _("RAIN"), _("Rain, not freezing, slight"), _("Rain, not freezing, moderate"), _("Rain, not freezing, heavy"), _("Rain, freezing, slight"), _("Rain, freezing, moderate"), _("Rain, freezing, heavy"), _("Rain (or drizzle) and snow, slight"), _("Rain (or drizzle) and snow, moderate or heavy"), _("Reserved"), _("SNOW"), _("Snow, slight"), _("Snow, moderate"), _("Snow, heavy"), _("Ice pellets, slight"), _("Ice pellets, moderate"), _("Ice pellets, heavy"), _("Snow grains"), _("Ice crystals"), _("Reserved"), _("SHOWER(S) or INTERMITTENT PRECIPITATION"), _("Rain shower(s) or intermittent rain, slight"), _("Rain shower(s) or intermittent rain, moderate"), _("Rain shower(s) or intermittent rain, heavy"), _("Rain shower(s) or intermittent rain, violent"), _("Snow shower(s) or intermittent snow, slight"), _("Snow shower(s) or intermittent snow, moderate"), _("Snow shower(s) or intermittent snow, heavy"), _("Reserved"), _("Hail"), _("THUNDERSTORM"), _("Thunderstorm, slight or moderate, with no precipitation"), _("Thunderstorm, slight or moderate, with rain showers and/or snow showers"), _("Thunderstorm, slight or moderate, with hail"), _("Thunderstorm, heavy, with no precipitation"), _("Thunderstorm, heavy, with rain showers and/or snow showers"), _("Thunderstorm, heavy, with hail"), _("Reserved"), _("Reserved"), _("Tornado") }; FM12CodeTable( present_weathers_automated, 4680, _("Present weather reported from an automated weather station") ); // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code if( m_automated ) { disp_arr(present_weathers_manned, G_N_ELEMENTS(present_weathers_manned), m_present_weather,0,_("Present weather - Manned")); PrintPastWeather( m_past_weather_1, _("Past weather type 1 - Manned")); PrintPastWeather( m_past_weather_2, _("Past weather type 2 - Automated")); } else { disp_arr(present_weathers_automated, G_N_ELEMENTS(present_weathers_automated), m_present_weather,0,_("Present weather - Automated")); PrintPastWeather( m_past_weather_1, _("Past weather type 1 - Automated")); PrintPastWeather( m_past_weather_2, _("Past weather type 2 - Automated")); } } }; /// 8NCCC -- Cloud type information HEADTK(8NCCC) { char m_low_clouds_amount ; char m_low_cloud_type ; char m_mid_cloud_type ; char m_high_cloud_type ; public: GENTK( 8NCCC, "8[0-9/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 4 == sscanf( str, "8%c%c%c%c", &m_low_clouds_amount, &m_low_cloud_type, &m_mid_cloud_type, &m_high_cloud_type ) ); } void Print() const { /// N -- Amount of low clouds covering sky, if no low clouds, the amount of the middle clouds const char * low_cloud_title = m_low_cloud_type != '0' ? _("Amount of low clouds") : _("Amount of middle clouds"); if( m_low_clouds_amount == '/' ) Append( low_cloud_title, _("Unspecified") ); else Append( low_cloud_title, m_low_clouds_amount - '0' ); /// CL -- Low cloud type static const choice< char > arr_low_clouds[] = { { '0', _("No low clouds") }, { '1', _("Cumulus humulis or fractus (no vertical development)") }, { '2', _("Cumulus mediocris or congestus (moderate vertical development)") }, { '3', _("Cumulonimbus calvus (no outlines nor anvil)") }, { '4', _("Stratocumulus cumulogenitus (formed by spreading of cumulus)") }, { '5', _("Stratocumulus") }, { '6', _("Stratus nebulosus (continuous sheet)") }, { '7', _("Stratus or cumulus fractus (bad weather)") }, { '8', _("Cumulus and stratocumulus (multilevel)") }, { '9', _("Cumulonimbus with anvil") }, { '/', _("Low clouds unobserved due to darkness or obscuration") } }; Append( _("Low clouds type"), choice_map( arr_low_clouds, G_N_ELEMENTS( arr_low_clouds ), m_low_cloud_type, _("unknown low clouds type") ) ); FM12CodeTable( arr_low_clouds, 0513, _("Clouds of the genera stratocumulus, stratus,cumulus, and cumulonimbus") ); /// CM -- Middle cloud type static const choice< char > arr_mid_clouds[] = { { '0', _("No middle clouds") }, { '1', _("Altostratus translucidous (mostly transparent)") }, { '2', _("Altostratus opacus or nimbostratus") }, { '3', _("Altocumulus translucidous (mostly transparent)") }, { '4', _("Patches of altocumulus (irregular, lenticular)") }, { '5', _("Bands of altocumulus") }, { '6', _("Altocumulus cumulogenitus (formed by spreading of cumulus)") }, { '7', _("Altocumulus (multilayers)") }, { '8', _("Altocumulus castellanus (having cumuliform tufts)") }, { '9', _("Altocumulus of a chaotic sky") }, { '/', _("Middle clouds unobserved due to darkness or obscuration ") }, }; Append( _("Middle clouds type"), choice_map( arr_mid_clouds, G_N_ELEMENTS( arr_mid_clouds ), m_mid_cloud_type, _("unknown middle clouds type") ) ); FM12CodeTable( arr_mid_clouds, 0515, _("Clouds of the genera altocumulus,altostratus, and nimbostratus") ); /// CH -- High cloud type static const choice< char > arr_high_clouds[] = { { '0', _("No high clouds") }, { '1', _("Cirrus fibratus (wispy)") }, { '2', _("Cirrus spissatus (dense in patches)") }, { '3', _("Cirrus spissatus cumulogenitus (formed out of anvil)") }, { '4', _("Cirrus unicus or fibratus (progressively invading sky)") }, { '5', _("Bands of cirrus or cirrostratus invading sky (less than 45 degree above horizon)") }, { '6', _("Bands of cirrus or cirrostratus invading sky (more than 45 degree above horizon)") }, { '7', _("Cirrostratus covering whole sky") }, { '8', _("Cirrostratus not covering sky but not invading") }, { '9', _("Cirrocumulus") }, { '/', _("High clouds unobserved due to darkness or obscuration") } }; Append( _("High clouds type"), choice_map( arr_high_clouds, G_N_ELEMENTS( arr_high_clouds ), m_high_cloud_type, _("unknown high clouds type") ) ); FM12CodeTable( arr_mid_clouds, 0509, _("Clouds of the genera cirrus,cirrocumulus, and cirrostratus") ); } }; /// 9GGgg -- Time of observation in hours and minutes HEADTK(9GGgg) { int m_hours; int m_minutes; public: GENTK( 9GGgg, "9[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "9%2d%2d", &m_hours, &m_minutes ) ); } void Print() const { Append( _("Observation time"), hour_min( m_hours, m_minutes ) ); } }; /// 222 Group - Sea Surface Observations /// /// 222Dv HEADTK(222Dv) { char m_ship_direction; char m_ship_average_speed; public: /// Not only it is selected before similar tokens, but also it can be kept at the end like two tokens together. GENTK_PRIORITY( 222Dv, "222[0-9/][0-9/][;=]?", MIN_PRIO ) // GENTK( 222Dv, "222[0-9/][0-9/][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "222%c%c", &m_ship_direction, &m_ship_average_speed ) ); } void Print() const { /// D -- direction of ship movement const char * ship_directions[] = { _("Calm"), _("North-East"), _("East"), _("South-East"), _("South"), _("South-West"), _("West"), _("North-West"), _("North"), _("Unknown") }; disp_arr(ship_directions,G_N_ELEMENTS(ship_directions),m_ship_direction,'0',_("Ship direction") ); /// * v -- ship's average speed const char * ship_average_speeds[] = { _("0 knots"), _("1 to 5 knots"), _("6 to 10 knots"), _("11 to 15 knots"), _("16 to 20 knots"), _("21 to 25 knots"), _("26 to 30 knots"), _("31 to 35 knots"), _("36 to 40 knots"), _("over 40 knots ") }; disp_arr(ship_average_speeds,G_N_ELEMENTS(ship_average_speeds),m_ship_average_speed,'0',_("Ship average speed") ); } }; /// 0sTTT -- Sea surface temperature HEADTK(0sTTT) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; const char * m_temperature_type ; bool CheckParams() { switch(m_temperature_sign) { case '0': case '1': m_temperature_type = _("Intake measurement"); break; case '2': case '3': m_temperature_type = _("Bucket measurement"); break; case '4': case '5': m_temperature_type = _("Hull contact sensor"); break; case '6': case '7': m_temperature_type = _("Other"); break; default : m_temperature_type = _("Inconsistent"); break ; } switch(m_temperature_sign) { case '1': case '3': case '5': case '7': m_temperature_sign = '1' ; break ; case '0': case '2': case '4': case '6': m_temperature_sign = '0' ; break ; default : return false ; } return true ; } public: /// TODO: Group terminator (=;) is detected before and could be removed from regular expressions. GENTK( 0sTTT, "0[01234567/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 999; m_temperature_type = NULL; if( 0 == strncmp( str, "0////", 5 ) ) return true ; return ( 2 == sscanf( str, "0%c%3d", &m_temperature_sign, &m_temperature ) ) && CheckParams() && CheckCelsius( m_temperature_sign, m_temperature ); } /// TTT -- Temperature in .1 C. s -- sign of temperature (0=positive, 1=negative) void Print() const { if( m_temperature_sign != '/' ) AppCelsius( this, _("Sea surface temperature"), m_temperature_sign, m_temperature ); else Append( _("Sea surface temperature"), _("Unspecified") ); if( m_temperature_type == NULL ) Append( _("Temperature type"), _("Unspecified") ); else Append( _("Temperature type"), m_temperature_type ); } }; /// 1PPHH -- Wave heights in 0.5 m increments HEADTK(1PPHH) { /// PP -- Period of waves in seconds int m_waves_period; /// HH -- Height of waves in 0.5 m increments int m_waves_height; public: GENTK( 1PPHH, "1[0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_waves_period = 0; m_waves_height = 0; return ( 0 == strncmp( str, "1////", 5 ) ) || ( 2 == sscanf( str, "1%2d%2d", &m_waves_period, &m_waves_height ) ); } void Print() const { Append( _("Waves period"), m_waves_period, Unit_seconds ); Append( _("Waves height"), 0.5 * m_waves_height, Unit_meters ); } }; /// http://www.top-wetter.de/themen/synopschluessel.htm says that 1PPHH is instrumented, /// that 2PPHH is not and 70HHH is not instrumented either. Figures should be close however. HEADTK(2PPHH) { int m_waves_period; int m_waves_height; public: /// 2PPHH -- Wave period and heights (instrumented) GENTK( 2PPHH, "2[0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_waves_period = -1; m_waves_height = -1; if( 0 == strcmp( str, "2////") ) return true; int nbMtch = sscanf( str, "2%2d%2d", &m_waves_period, &m_waves_height ); if(nbMtch != 2) return false ; /// Wave heights must be realistic, forty meters is too high.. if( m_waves_height > 80 ) return false ; return true; } void Print() const { if( m_waves_period >= 0 ) Append( _("Instrumented waves period"), m_waves_period, Unit_seconds ); if( m_waves_height >= 0 ) Append( _("Instrumented waves height"), 0.5 * m_waves_height, Unit_meters ); } }; /** Generally speaking: Any element not reported are normally reported with a slash. If an entire group of elements is not reported, skip the group completely (Do not report a group as ///// ) */ /// 3dddd -- Direction of swells (up to 2 swells) HEADTK(3dddd) { int m_wind_direction1 ; int m_wind_direction2 ; /// TODO: The direction should be smaller than 36. void wind_dir( const char * title, int dir ) const { if( dir >= 0 ) Append( title, dir * 10, Unit_degrees ); } public: GENTK( 3dddd, "3[0-9/]{4}" ) bool Parse( const char * str ) { m_wind_direction1 = -1; m_wind_direction2 = -1; if( 0 == strcmp( str, "3////") ) return true; return ( 2 == sscanf( str, "3%2d%2d", &m_wind_direction1, &m_wind_direction2 ) ) || ( 1 == sscanf( str, "3//%2d", &m_wind_direction2 ) ) || ( 1 == sscanf( str, "3%2d//", &m_wind_direction1 ) ); } void Print() const { wind_dir( _("Direction of primary swell waves"), m_wind_direction1 ); wind_dir( _("Direction of secondary swell waves"), m_wind_direction2 ); } }; /// 4PPHH -- Period and direction of first set of swells HEADTK(4PPHH) { int m_swell_waves_period ; int m_swell_waves_height ; public: GENTK( 4PPHH, "4[0-9/]{4}" ) bool Parse( const char * str ) { m_swell_waves_period = -1; m_swell_waves_height = -1; if( 0 == strcmp( str, "4////") ) return true; return ( 2 == sscanf( str, "4%2d%2d", &m_swell_waves_period, &m_swell_waves_height ) ) || ( 1 == sscanf( str, "4%2d//", &m_swell_waves_period ) ); } void Print() const { if( m_swell_waves_period >= 0 ) Append( _("Primary swell waves period"), m_swell_waves_period, Unit_seconds ); if( m_swell_waves_height >= 0 ) Append( _("Primary swell waves height"), 0.5 * m_swell_waves_height, Unit_meters ); } }; /// 5PPHH -- Period and direction of second set of swells HEADTK(5PPHH) { int m_swell_waves_period ; int m_swell_waves_height ; public: GENTK( 5PPHH, "5[0-9/]{4}" ) bool Parse( const char * str ) { m_swell_waves_period = -1; m_swell_waves_height = -1; if( 0 == strcmp( str, "5////") ) return true; int nbMtch = sscanf( str, "5%2d%2d", &m_swell_waves_period, &m_swell_waves_height ); if( nbMtch != 2 ) return false ; /// Realistic values only. Waves are not 40 meters high. if( m_swell_waves_height > 80 ) return false ; return true ; } void Print() const { if( m_swell_waves_period >= 0 ) Append( _("Secondary swell waves period"), m_swell_waves_period, Unit_seconds ); if( m_swell_waves_height >= 0 ) Append( _("Secondary swell waves height"), 0.5 * m_swell_waves_height, Unit_meters ); } }; /// 6IEER -- Ice accretion on ships HEADTK(6IEER) { char m_ice_accretion_code; int m_ice_accretion_thickness; char m_ice_accretion_rate; public: GENTK( 6IEER, "6[0-5/][0-9/]{2}[0-4/]" ) bool Parse( const char * str ) { m_ice_accretion_code = '_'; m_ice_accretion_thickness = -1; m_ice_accretion_rate = '_'; if( 0 == strcmp( str, "6////" ) ) return true; return ( 3 == sscanf( str, "6%c%2d%c", &m_ice_accretion_code, &m_ice_accretion_thickness, &m_ice_accretion_rate ) ); } void Print() const { static const char * ice_accretion_codes[] = { _("Not relevant"), // Should not happen, but it does. _("Icing from ocean spray"), _("Icing from fog"), _("Icing from spray and fog"), _("Icing from rain"), _("Icing from spray and rain") }; disp_arr(ice_accretion_codes,G_N_ELEMENTS(ice_accretion_codes),m_ice_accretion_code,'0',_("Ice accretion code") ); if( m_ice_accretion_thickness >= 0 ) Append( _("Ice accretion thickness"), m_ice_accretion_thickness, Unit_centimeters ); else Append( _("Ice accretion thickness"), _("Not relevant") ); static const char * ice_accretion_rates[] = { _("Ice not building up"), _("Ice building up slowly"), _("Ice building up rapidly"), _("Ice melting or breaking up slowly"), _("Ice melting or breaking up rapidly") }; disp_arr(ice_accretion_rates,G_N_ELEMENTS(ice_accretion_rates),m_ice_accretion_rate,'0',_("Ice accretion rate") ); } }; /// 70HHH -- Wave heights to 0.1 m (instrumented) HEADTK(70HHH) { int m_wave_height ; public: /// This group does not appear in NWSOH document. GENTK( 70HHH, "70[0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_wave_height = -1; return ( 0 == strncmp( str, "70///", 5 ) ) || ( 1 == sscanf( str, "70%3d", &m_wave_height ) ); } void Print() const { const char * txt = _("Wave height"); if( m_wave_height >= 0 ) Append( txt, m_wave_height * 0.1, Unit_meters ); else Append( txt, _("Undetermined"), Unit_meters ); } }; /// 8aTTT -- Wet bulb temperature HEADTK(8aTTT) { char m_wet_bulb_sign_type ; char m_temperature_sign ; int m_wet_bulb_temperature ; const char * m_title ; /// Called once we managed to extract the arguments. bool CheckParams() { switch( m_wet_bulb_sign_type ) { case '0': m_temperature_sign = '0'; m_title = _("Positive or zero measured"); break; case '1': m_temperature_sign = '1'; m_title = _("Negative measured"); break; case '2': m_temperature_sign = '1'; m_title = _("Iced bulb measured"); break; case '5': m_temperature_sign = '0'; m_title = _("Positive or zero computed"); break; case '6': m_temperature_sign = '1'; m_title = _("Negative computed"); break; case '7': m_temperature_sign = '1'; m_title = _("Iced bulb computed"); break; default : m_temperature_sign = '/'; m_title = _("Inconsistent"); return false; }; return true; } public: GENTK( 8aTTT, "8[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_wet_bulb_sign_type = '/'; m_temperature_sign = '/'; m_wet_bulb_temperature = 0 ; m_title = "Not specified"; if( 0 == strncmp( str, "8////", 5 ) ) return true; return ( 2 == sscanf( str, "8%c%3d", &m_wet_bulb_sign_type, &m_wet_bulb_temperature ) ) && CheckParams(); } void Print() const { static const std::string sep(":"); std::string title = _("Web bulb temperature") + sep + m_title ; AppCelsius( this, title.c_str(), m_temperature_sign, m_wet_bulb_temperature ); } }; /// Separator for ice detection. HEADTK(ICE) { public: // TODO: It is possible to have free text after the string ICE. GENTK( ICE, "ICE" ) bool Parse( const char * str ) { return 0 == strcmp( str, "ICE" ); } void Print() const { Append( _("Type"), "{ICE}" ); } bool CanComeFirst(void) const { return false ; } }; /// Appears only in NWSOH document. /// http://www.ndbc.noaa.gov/ice/sea_ice.shtml /// Data reported in Ships Synoptic Code, Group 2 ICE section (ciSibiDizi). HEADTK(cSbDz) { char m_sea_ice_arrangement; char m_sea_ice_development_stage; char m_ice_of_land_origin; char m_bearing_of_principle_ice_edge; char m_sea_ice_situation ; public: /// There might be four chars only ?? GENTK( cSbDz, "[0-9/]{4}[0-9/]?[;=]?" ) bool Parse( const char * str ) { return ( 5 == sscanf( str, "%c%c%c%c%c", &m_sea_ice_arrangement, &m_sea_ice_development_stage, &m_ice_of_land_origin, &m_bearing_of_principle_ice_edge, &m_sea_ice_situation ) ); } void Print() const { /// ci = Concentration or Arrangement of Sea Ice static const char * sea_ice_arrangements[] = { _("No sea ice in sight"), _("Ship in open lead more than 1 nautical mile wide, or ship in fast ice with no boundary beyond limit of visibility"), _("Sea ice present in concentrations less than 3/10 (3/8); open water or very open pack ice"), _("4/10 to 6/10 (3/8 to less than 6/8); open pack ice"), _("7/10 to 8/10 (6/8 to less than 7/8); close pack ice"), _("9/10 or more, but not 10/10 (7/8 to less than 8/8); very close pack ice"), _("Strips and patches of pack ice with open water between"), _("Strips and patches of close or very close pack ice with areas of lesser concentration between"), _("Fast ice with open water, very open or open pack ice to seaward of the ice boundary"), _("Fast ice with close or very close pack ice to seaward of the ice boundary") }; disp_arr(sea_ice_arrangements,G_N_ELEMENTS(sea_ice_arrangements),m_sea_ice_arrangement,'0', _("Concentration or arrangement of Sea Ice") ); /// Si = Sea Ice Stage of Development static const char * sea_ice_development_stages[] = { _("New ice only (frail ice, grease ice, slush ice, shuga)"), _("Nilas or ice rind, less than 10 cm thick"), _("Young ice (grey ice, grey-white ice), 10-30 cm thick"), _("Predominantly new and/or young ice with some first year ice"), _("Predominantly thin first-year ice with some new and/or young ice"), _("All thin first-year ice (30-70 cm thick)"), _("Predominantly medium first-year ice (70-120 cm thick) and thick first-year ice (more than 120 cm thick) with some thinner (younger) first-year ice"), _("All medium and first-year ice"), _("Predominantly medium and thick first-year ice with some old ice (usually more than 2 meters thick)"), _("Predominantly old ice") }; disp_arr(sea_ice_development_stages,G_N_ELEMENTS(sea_ice_development_stages),m_sea_ice_development_stage,'0', _("Sea Ice Stage of Development") ); /// bi = Ice of Land Origin static const char * ice_of_land_origins[] = { _("No ice of land origin"), _("1-5 icebergs, no growlers or bergy bits"), _("6-10 icebergs, no growlers or bergy bits"), _("11-20 icebergs, no growlers or bergy bits"), _("Up to and including 10 growlers and bergy bits - no icebergs"), _("More than 10 growlers and bergy bits - no icebergs"), _("1-5 icebergs with growlers and bergy bits"), _("6-10 icebergs with growlers and bergy bits"), _("11-20 icebergs with growlers and bergy bits"), _("More than 20 icebergs with growlers and bergy bits - a major hazard to navigation") }; disp_arr(ice_of_land_origins,G_N_ELEMENTS(ice_of_land_origins),m_ice_of_land_origin,'0', _("Ice of Land Origin") ); /// Di = Bearing of Principle Ice Edge static const char * bearing_of_principle_ice_edges[] = { _("Ship in shore or flaw lead"), _("Principle ice edge towards NE"), _("Principle ice edge towards E"), _("Principle ice edge towards SE"), _("Principle ice edge towards S"), _("Principle ice edge towards SW"), _("Principle ice edge towards W"), _("Principle ice edge towards NW"), _("Principle ice edge towards N"), _("Not determined (ship in ice)") }; disp_arr(bearing_of_principle_ice_edges,G_N_ELEMENTS(bearing_of_principle_ice_edges),m_bearing_of_principle_ice_edge,'0', _("Bearing of Principle Ice Edge") ); /// zi = Present Sea Ice Situation and Three Hour Trend static const char * sea_ice_situations[] = { _("Ship in open water with floating ice in sight"), _("Ship in easily penetrable ice; conditions improving"), _("Ship in easily penetrable ice; conditions not changing"), _("Ship in easily penetrable ice; conditions worsening"), _("Ship in ice difficult to penetrate; conditions improving"), _("Ship in ice difficult to penetrate; conditions not changing"), _("Ice forming and floes freezing together"), _("Ice under slight pressure"), _("Ice under moderate or severe pressure"), _("Ship beset") }; disp_arr(sea_ice_situations,G_N_ELEMENTS(sea_ice_situations),m_sea_ice_situation,'0', _("Present Sea Ice Situation and Three Hour Trend") ); } /// In fact, completely dependent on the previous token. THIS SHOULD BE ENFORCED. bool CanComeFirst(void) const { return false ; } }; /// 333 Group - Special / Climatological Data HEADTK(333) { public: GENTK( 333, "333" ) bool Parse( const char * str ) { return 0 == strcmp( str, "333" ); } void Print() const { Section( _("Special or climatological data") ); } }; /// 0.... -- Regionally developed data HEADTK(0____) { char m_not_decoded_yet[5] ; public: GENTK( 0____, "0[0-9A-Z/]{2}[0-9A-Z]{2}" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "0%4s", m_not_decoded_yet ) ); } void Print() const { Append( _("Regionally developed data"), m_not_decoded_yet ); } }; /// 1sTTT_max -- Maximum temperature over previous 24 hours HEADTK(1sTTT_max) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; public: GENTK( 1sTTT_max, "1[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 0; if( 0 == strncmp( str, "1////", 5 ) ) return true ; return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } /// s -- sign of temperature (0=positive, 1=negative). TTT -- Temperature in .1 C void Print() const { AppCelsius( this, _("Maximum 24 hours temperature"), m_temperature_sign, m_temperature ); } }; /// 2sTTT_min -- Minimum temperature over previous 24 hours HEADTK(2sTTT_min) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; public: /// 12- bzw. 15-stündige Minimumtemperatur (wird nur um 06, 09 und 18 UTC gemeldet) GENTK( 2sTTT_min, "2[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); case 2 : return CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// s -- sign of temperature (0=positive, 1=negative) /// TTT -- Minimum temperature over previous 24 hours in .1 C (if sign is 9, TTT is relative humidity) void Print() const { AppCelsius( this, _("Minimum temperature over previous 24 hours"), m_temperature_sign, m_temperature ); } }; /// Not sure of how it should be decoded. #ifdef DECODED_3Ejjj /// Can be 3EssTgTg : http://www.ogimet.com/docs/WMO306vol-II.pdf /// TgTg Ground (grass) minimum temperature of the preceding night, in whole degrees Celsius, its sign being given by sn. /// (3-group in Section 3 of FM 12) HEADTK(3Ejjj) { char m_ground_state ; int m_temperature ; bool m_valid_temperature ; public: GENTK( 3Ejjj, "3[0-9/][/01][/0-9]{2}[;=]?" ) // No regional decision has been made for the use of these letters so they will be encoded as solidi (///). bool Parse( const char * str ) { char char_sign, d1, d2 ; int r = sscanf( str, "3%c%c%c%c", &m_ground_state, &char_sign, &d1, &d2 ); if( r != 4 ) return false ; if( ( d1 == '/' ) ^ ( d2 == '/' ) ) return false ; if( ( d1 == '/' ) == ( d2 == '/' ) ) { m_valid_temperature = false ; return true ; } m_valid_temperature = true ; m_temperature = 10 * ( d1 - '0' ) + ( d2 - '0' ); if( char_sign == '1' ) m_temperature = -m_temperature ; return true ; } void Print() const { /// Code table 0901 E: State of the ground without snow or measurable ice cover static const char * ground_without_snow[] = { _("Surface of ground dry (without cracks and no appreciable amount of dust or loose sand)"), _("Surface of ground moist"), _("Surface of ground wet (standing water in small or large pools on surface)"), _("Flooded"), _("Surface of ground frozen"), _("Glaze on ground"), _("Loose dry dust or sand not covering ground completely"), _("Thin cover of loose dry dust or sand covering ground completely"), _("Moderate or thick cover of loose dry dust or sand covering ground completely"), _("Extremely dry with cracks") }; FM12CodeTable( ground_without_snow, 0901, _("State of the ground without snow or measurable ice cover") ); disp_arr(ground_without_snow,G_N_ELEMENTS(ground_without_snow),m_ground_state,'0',_("State of the ground without snow or measurable ice cover") ); if( m_valid_temperature ) { Append( _("Ground grass minimum temperature of preceding night"), m_temperature, Unit_Celsius ); } } }; #else /// 3Ejjj -- Regionally developed data HEADTK(3Ejjj) { char m_not_decoded_yet[5] ; public: /// TODO: See here: http://www.met.fu-berlin.de/~stefan/fm12.html#32 GENTK( 3Ejjj, "3[0-9A-Z/]{4}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "3%4s", m_not_decoded_yet ) ); } void Print() const { Append( _("Regionally developed data"), m_not_decoded_yet ); } }; #endif /// 4Esss -- Snow depth HEADTK(4Esss) { char m_snow_cover ; int m_snow_depth ; public: GENTK( 4Esss, "4[0-9/][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%c%3d", &m_snow_cover, &m_snow_depth ) ); } // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code void Print() const { /// E-prime -- State of ground with snow cover static const char *snow_covers[] = { _("Predominantly covered with ice"), _("Compact or wet snow covering less than half of ground"), _("Compact or wet snow covering more than half of ground but not completely covered"), _("Even layer of compact or wet snow covering entire ground"), _("Uneven layer of compact or wet snow covering entire ground"), _("Loose dry snow covering less than half of ground"), _("Loose dry snow covering more than half of ground but not completely covered"), _("Even layer of loose dry snow covering entire ground"), _("Uneven layer of loose dry snow covering entire ground"), _("Snow covering ground completely with deep drifts ") }; disp_arr(snow_covers,G_N_ELEMENTS(snow_covers),m_snow_cover,'0',_("State of ground with snow cover") ); FM12CodeTable( snow_covers, 0975, _("State of the ground with snow cover or measurable ice cover") ); /// sss -- snow depth in cm: Code table 3889 sss : Total depth of snow switch( m_snow_depth ) { case 0 : Append( _("Snow depth"), _("Not used") ); break; default : Append( _("Snow depth"), m_snow_depth, Unit_centimeters ); break; case 997 : Append( _("Snow depth"), _("Less than 0.5 cm") ); break; case 998 : Append( _("Snow depth"), _("Snow cover, not continuous") ); break; case 999 : Append( _("Snow depth"), _("Measurement impossible or inaccurate") ); break; } FM12CodeTable( , 3889, _("Total depth of snow") ); } }; /// 5jjjj -- Additional information HEADTK(5jjjj) { char m_not_decoded_yet[5] ; public: GENTK( 5jjjj, "5[012346789/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "5%4s", m_not_decoded_yet ) ) || ( 0 == strncmp( str, "5////", 5 ) ); } void Print() const { Append( _("Additional information"), m_not_decoded_yet ); } }; /// 553SS -- Sonnenscheindauer der letzten ganzen bzw. halben* Stunde in 1/10 Stunden HEADTK(553SS) { int m_Sonnenscheindauer; public: GENTK( 553SS, "553[0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_Sonnenscheindauer = -1; return ( 0 == strncmp( str, "553//", 5 ) ) || ( 1 == sscanf( str, "553%2d", &m_Sonnenscheindauer ) ); } void Print() const { const char * txt = _("Sonnenscheindauer der letzten ganzen"); if( m_Sonnenscheindauer < 0 ) Append( txt, _("Undetermined"), Unit_hours ); else Append( txt, m_Sonnenscheindauer / 10.0, Unit_hours ); } }; /* Not sure: http://www.met.fu-berlin.de/~stefan/fm12.html#32 * 55SSS -- Sonnenscheindauer des Vortags in 1/10 Stunden (wird nur um 06 UTC gemeldet) * 553SS -- Sonnenscheindauer der letzten ganzen bzw. halben* Stunde in 1/10 Stunden */ /// 55jjj jjjjj -- Additional information (can be multiple groups) HEADTK(55jjj) { char m_not_decoded_yet[5] ; public: // Not sure it can really have four chars. GENTK( 55jjj, "55[012456789/][0-9/]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "55%3s", m_not_decoded_yet ) ); } void Print() const { Append( _("Undecoded extra information"), m_not_decoded_yet ); } }; /// Can be added several times after 55jjj HEADTK(jjjjj) { char m_not_decoded_yet[5] ; public: GENTK( jjjjj, "[0-9/]{5}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "%5s", m_not_decoded_yet ) ); } void Print() const { Append( _("Undecoded extra information"), m_not_decoded_yet ); } /// It is dependent on the previous token. bool CanComeFirst(void) const { return false ; } }; /// 2FFFF -- Summe der Globalstrahlung des Vortags in J/cm2 HEADTK(2FFFF) { int m_global_strahlung; public: GENTK( 2FFFF, "2[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_global_strahlung = -1; return ( 0 == strncmp( str, "2////", 5 ) ) || ( 1 == sscanf( str, "2%4d", &m_global_strahlung ) ); } void Print() const { /// Global Strahlung const char * txt = _("Global radiation"); if( m_global_strahlung >= 0 ) Append( txt, m_global_strahlung, "J/cm2" ); else Append( txt, _("Undetermined") ); } }; /// 3FFFF -- Diffuse Himmelsstrahlung der letzten ganzen bzw. halben* Stunde in kJ/m2 = 1/10 J/cm2 HEADTK(3FFFF) { int m_himmel_strahlung; public: GENTK( 3FFFF, "3[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_himmel_strahlung = -1; return ( 0 == strncmp( str, "3////", 5 ) ) || ( 1 == sscanf( str, "3%4d", &m_himmel_strahlung ) ); } /// Diffuse Himmelsstrahlung der letzten ganzen bzw. halben* Stunde void Print() const { Append( _("Diffuse sky radiation of last half hour"), m_himmel_strahlung, "kJ/m2" ); } }; /// 4FFFF -- Atmosphärische Wärmestrahlung der letzten ganzen bzw. halben* Stunde HEADTK(4FFFF) { int m_waerme_strahlung; public: GENTK( 4FFFF, "4[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "4%4d", &m_waerme_strahlung ) ); } /// Atmosphärische Wärmestrahlung der letzten ganzen bzw. halben* Stunde void Print() const { Append( _("Atmospheric thermal radiation of last half hour"), m_waerme_strahlung, "kJ/m2" ); } }; /// 6RRRtb -- Liquid precipitation typedef CLASSTK(6RRRt) CLASSTK(6RRRtb); /// 7RRRR -- 24 hour precipitation in mm HEADTK(7RRRR) { int m_24h_precipitations_mm ; public: GENTK( 7RRRR, "7[0-9]{4}=?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "7%4d", &m_24h_precipitations_mm ) ); } void Print() const { const char * precip = _("24 hours precipitations"); if( m_24h_precipitations_mm == 9999 ) Append( precip, _("None") ); else Append( precip, m_24h_precipitations_mm, Unit_mm ); } }; static const char * cloud_genuses[] = { _("Cirrus (Ci)"), _("Cirrocumulus (Cc)"), _("Cirrostratus (Cs)"), _("Altocumulus (Ac)"), _("Altostratus (As)"), _("Nimbostratus (Ns)"), _("Stratocumulus (Sc)"), _("Stratus (St)"), _("Cumulus (Cu)"), _("Cumulonimbus (Cb)") }; /// 8NChh -- Cloud layer data HEADTK(8NChh) { char m_cloud_cover ; char m_cloud_genus ; int m_cloud_base_height ; public: GENTK( 8NChh, "8[0-9/][0-9/][0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_cloud_cover = '0'; m_cloud_genus = '/'; m_cloud_base_height = 0 ; return ( 3 == sscanf( str, "8%c%c%2d", &m_cloud_cover, &m_cloud_genus, &m_cloud_base_height ) ) || ( 2 == sscanf( str, "8%c%c//", &m_cloud_cover, &m_cloud_genus ) ) || ( 0 == strncmp( str, "80///", 5 ) ); } void Print() const { // N -- cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // C -- genus of cloud disp_arr(cloud_genuses,G_N_ELEMENTS(cloud_genuses),m_cloud_genus,'0',_("Cloud genus") ); // * hh -- height of cloud base const char * title = _("Cloud base height"); switch( m_cloud_base_height ) { case 0 : Append( title, _("Less than 30 meters") ); break; case 1 ... 50 : Append( title, m_cloud_base_height * 30, Unit_meters ); break; case 51 ... 56 : Append( title, 1500 + ( m_cloud_base_height - 50 ) * 50, Unit_meters ); break; case 57 ... 80 : Append( title, 1800 + ( m_cloud_base_height - 56 ) * 300, Unit_meters ); break; case 81 ... 88 : Append( title, 9000 + ( m_cloud_base_height - 80 ) * 1500, Unit_meters ); break; case 89 : Append( title, _("Greater than 21000 m") ); break; case 90 ... 99 : disp_arr(cloud_bases,G_N_ELEMENTS(cloud_bases),m_cloud_base_height,90,title ); break; default : break; } } }; /// 9SSss -- Supplementary information /// http://www.met.fu-berlin.de/~stefan/fm12.html#32 /// 9SPSPspsp -- Besondere Wettererscheinungen und zusätzliche Informationen (Gruppe kann mehrmals verschlüsselt werden) HEADTK(9SSss) { int m_figure ; int m_value ; public: GENTK( 9SSss, "9[0-9]{2}[0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_value = -1 ; return ( 2 == sscanf( str, "9%2d%2d", &m_figure, &m_value ) ) || ( 1 == sscanf( str, "9%2d//", &m_figure ) ); } // TODO: Description of decoding alone takes about 100 lines. // http://www.met.fu-berlin.de/~stefan/fm12.html#32 void Print() const { Append( _("Figure"), m_figure ); Append( _("Value"), m_value ); } }; /// 444 Group - National data, clouds. HEADTK(444) { public: GENTK( 444, "444" ) bool Parse( const char * str ) { return 0 == strcmp( str, "444" ); } void Print() const { Section( "National data, clouds" ); } }; /// NCHHC /// The coding can be more complicated, with several groups. /// http://www.top-wetter.de/themen/synopschluessel.htm#444 HEADTK(NCHHC) { char m_cloud_cover ; char m_cloud_genus ; int m_cloud_top_height ; char m_cloud_characteristics ; public: GENTK( NCHHC, "[0-9][0-9][0-9]{2}[0-9][;=]?" ) bool Parse( const char * str ) { m_cloud_cover = '0'; m_cloud_genus = '/'; m_cloud_top_height = 0 ; m_cloud_characteristics = '/'; return ( 4 == sscanf( str, "%c%c%2d%c", &m_cloud_cover, &m_cloud_genus, &m_cloud_top_height, &m_cloud_characteristics ) ); } void Print() const { // N -- cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // C -- genus of cloud disp_arr(cloud_genuses,G_N_ELEMENTS(cloud_genuses),m_cloud_genus,'0',_("Cloud genus") ); // * hh -- height of cloud top Append( _("Cloud top height"), m_cloud_top_height * 100, Unit_meters ); static const char * cloud_characteristics[] = { _("Scattered clouds"), // Vereinzelte Wolken _("Flat, closed cloud cover"), // Flache, geschlossene Wolkendecke _("Shallow clouds with small apertures"), // Flache Wolkendecke mit kleinen Durchbrüchen _("Shallow clouds with large openings"), // Flache Wolkendecke mit großen Durchbrüchen _("Corrugated, solid cloud cover"), // Gewellte, geschlossene Wolkendecke _("Undulating clouds with small apertures"), // Gewellte Wolkendecke mit kleinen Durchbrüchen _("Undulating clouds with large openings"), // Gewellte Wolkendecke mit großen Durchbrüchen _("Closed billows clouds"), // Geschlossene Wogenwolkendecke _("Groups of waves of clouds"), // Gruppen von Wogenwolken _("Several layers of clouds at different altitudes") // Mehrere Wolkenschichten in verschiedenen Höhen }; disp_arr(cloud_characteristics,G_N_ELEMENTS(cloud_characteristics),m_cloud_characteristics,'0',_("Cloud characteristics") ); } }; /// 555 Group - National code group HEADTK(555) { public: GENTK( 555, "555" ) bool Parse( const char * str ) { return 0 == strcmp( str, "555" ); } void Print() const { Section( _("National code group") ); } }; /// 0sTTT_land -- Land surface temperature /// s -- sign of temperature (0=positive, 1=negative) /// TTT -- Temperature in .1 C HEADTK(0sTTT_land) { char m_temperature_sign ; int m_temperature ; public: // TODO: Do not know why, string finished by a semicolon. GENTK( 0sTTT_land, "0[01][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "0%c%3d", &m_temperature_sign, &m_temperature ) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { // s -- sign of temperature (0=positive, 1=negative) // TTT -- Temperature in .1 C AppCelsius( this, _("Land temperature 5 cm over surface"), m_temperature_sign, m_temperature ); } }; /// 1RRRr -- Niederschlagsmenge in der letzten ganzen bzw. halben* Stunde HEADTK(1RRRr) { int m_precipitation_amount ; char m_precipitation_duration ; public: GENTK( 1RRRr, "1[0-9/]{3}[0-9/][;=]?" ) bool Parse( const char * str ) { m_precipitation_amount = -1 ; m_precipitation_duration = '0' ; return ( 2 == sscanf( str, "1%3d%c", &m_precipitation_amount, &m_precipitation_duration ) ); } void Print() const { // RRR -- Precipitation amount in mm : Niederschlagsmenge const char * precip_amount = _("Precipitation amount"); switch( m_precipitation_amount ) { default : Append( precip_amount, m_precipitation_amount / 10.0, Unit_mm );break; case 999 : Append( precip_amount, _("Not measurable") );break; } const char * precip_dur = _("Precipitation duration"); // t -- Duration over which precipitation amount measured switch( m_precipitation_duration ) { case '0' ... '9' : Append( precip_dur, 6 * ( m_precipitation_duration - '0' ), Unit_minutes ); break; default : Append( precip_dur, _("Undetermined") ); break; } } }; /// 2sTTT_avg -- Tagesmittel der Lufttemperatur des Vortages HEADTK(2sTTT_avg) { char m_temperature_sign ; int m_temperature ; public: GENTK( 2sTTT_avg, "2[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); case 2 : return CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// s: sign of temperature (0=positive, 1=negative, 9 = RH). TTT: Temperature in .1 C (if sign is 9, TTT is relative humidity) void Print() const { AppCelsius( this, _("Daily mean air temperature of the previous day"), m_temperature_sign, m_temperature ); } }; HEADTK(22fff) { int m_wind_speed_meter_second; public: GENTK( 22fff, "22[0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "22%3d", &m_wind_speed_meter_second ) ); } void Print() const { Append( _("Wind speed 10 minutes average"), m_wind_speed_meter_second / 10.0, Unit_meters_second ); } }; HEADTK(23SS) { int m_sun_shine_duration; public: GENTK( 23SS, "23[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "23%2d", &m_sun_shine_duration ) ); } void Print() const { Append( _("Total hours of sunshine duration"), m_sun_shine_duration, Unit_minutes ); } }; HEADTK(24Wt) { char m_precipitation_indicator; char m_precipitation_duration; public: GENTK( 24Wt, "24[01236789]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "24%c%c", &m_precipitation_indicator, &m_precipitation_duration ) ); } void Print() const { // WR -- Indikator zur Niederschlagsgruppe und Kennzeichnung der Niederschlagsform static const char * Niederschlagsgruppen[] = { _("Kein Niederschlag"), _("Nur abgesetzte Niederschläge"), _("Nur flüssige abgesetzte Niederschläge"), _("Nur feste abgesetzte Niederschläge"), _("Undefined"), _("Undefined"), _("Niederschlag in flüssiger Form"), _("Niederschlag in fester Form"), _("Niederschlag in flüssiger und fester Form"), _("Niederschlagsmessung ausgefallen") }; // TODO: TRANSLATION disp_arr(Niederschlagsgruppen,G_N_ELEMENTS(Niederschlagsgruppen),m_precipitation_indicator,'0',_("Precipitations group") ); // t -- Duration over which precipitation amount measured display_precipitation( this, m_precipitation_duration ); } }; /// 25wzwz -- zusätzliche Wettererscheinung (Gruppe kann bis zu 4-mal verschlüsselt werden): HEADTK(25ww) { int m_wetter_erscheinung; public: GENTK( 25ww, "25[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "25%2d", &m_wetter_erscheinung ) ); } void Print() const { static const choice< int > wettererscheinungen[] = { // Kondensstreifen { 1, _("Sich schnell auflösende Kondensstreifen (Lebensdauer < 1 Minute)") }, { 2, _("Sich langsam auflösende Kondensstreifen (Lebensdauer 1 bis 14 Minuten)") }, { 3, _("Beständige Kondensstreifen (Lebensdauer > 15 Minuten)") }, { 4, _("Aufgelöste, vollständig in Cirrusbewölkung übergegangene Kondensstreifen") }, // Reif { 5, _("Strahlungsreif") }, { 6, _("Advektionsreif") }, { 7, _("Rauhreif") }, { 8, _("Rauheis") }, { 9, _("Klareis") }, // Decken aus festen Niederschlägen (> 50 % des Erdbodens bedeckend) {15, _("Grieseldecke") }, {16, _("Eiskörnerdecke") }, {17, _("Graupeldecke") }, {18, _("Hageldecke") }, // Wettererscheinungen {23, _("Eiskörner in der letzten Stunde") }, {24, _("Glatteisbildung in der letzten Stunde") }, {31, _("Sandfegen (unter Augenhöhe)") }, {32, _("Sandtreiben (über Augenhöhe)") }, {33, _("Sandverwehungen > 5 cm") }, {36, _("Schneeverwehungen > 20 cm") }, {45, _("nässender Nebel") }, // Glätteerscheinungen {71, _("Reifglätte") }, {75, _("Schneeglätte") }, {76, _("Eisglätte (überfrierende Nässe)") }, {77, _("Glatteis (gefrierender Regen/Sprühregen)") }, {81, _("Gefrierender Schauerniederschlag") }, // sonstige Erscheinungen {99, _("Böenwalze") } }; Append( _("Zusätzliche Wettererscheinung"), choice_map( wettererscheinungen, G_N_ELEMENTS(wettererscheinungen), m_wetter_erscheinung, _("Undefined") ) ); // TODO: TRANSLATION } }; /// 26fff -- mittlere Windgeschwindigkeit der letzten Stunde in 1/10 m/s HEADTK(26fff) { int m_wind_speed_meter_second; public: GENTK( 26fff, "22[0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "26%3d", &m_wind_speed_meter_second ) ); } void Print() const { Append( _("Last hour average wind speed"), m_wind_speed_meter_second / 10.0, Unit_meters_second ); } }; /// 3LGLGLsLs -- Anzahl der registrierten Blitze in den letzten 30 Minuten /// LG LG -- Gesamtzahl der Blitze /// Ls Ls -- Anzahl der Blitze starker Intensität HEADTK(3LLLL) { int m_Gesamtzahl_der_Blitze; int m_Anzahl_der_Blitze_starker_Intensitaet; public: GENTK( 3LLLL, "3[0-9]{4}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "2%2d%2d", &m_Gesamtzahl_der_Blitze, &m_Anzahl_der_Blitze_starker_Intensitaet ) ); } void Print() const { Append( _("Number of flashes"), m_Gesamtzahl_der_Blitze ); Append( _("Number of high-intensity flashes"), m_Anzahl_der_Blitze_starker_Intensitaet ); } }; /* * 4RwRwwzwz -- Wasseräquivalent der Schneedecke und zusätzliche Wettererscheinungen Rw Rw -- Spezifisches Wasseräquivalent der Schneedecke in 1/10 mm/cm wz wz -- zusätzliche Wettererscheinung: Kondensstreifen 01 -- sich schnell auflösende Kondensstreifen 02 -- sich langsam auflösende Kondensstreifen 03 -- beständige Kondensstreifen 04 -- aufgelöste, in Cirrusbewölkung übergegangene Kondensstreifen Reif 05 -- Strahlungsreif 06 -- Advektionsreif 07 -- Rauhreif 08 -- Rauheis 09 -- Klareis Decken aus festen Niederschlägen (> 50 % des Erdbodens bedeckend) 15 -- Grieseldecke 16 -- Eiskörnerdecke 17 -- Graupeldecke 18 -- Hageldecke Wettererscheinungen 23 -- Eiskörner in der letzten Stunde 24 -- Glatteisbildung in der letzten Stunde 31 -- Sandfegen, unter Augenhöhe 32 -- Sandtreiben, über Augenhöhe 33 -- Sandverwehungen > 5 cm 36 -- Schneeverwehungen > 20 cm Glätteerscheinungen 71 -- Reifglätte 75 -- Schneeglätte 76 -- Eisglätte (überfrierende Nässe) 77 -- Glatteis (gefrierender Regen/Sprühregen) 81 -- gefrierender Schauerniederschlag sonstige Erscheinungen 99 -- Böenwalze * 5s's's'tR -- Neuschneehöhe Hinweis: Mit dieser Gruppe wird in der Regel um 06 UTC die 24-stündige und um 18 UTC die 12-stündige Neuschneehöhe gemeldet. s's's' -- Neuschneehöhe in cm (997 = < 0.5 cm, 998 = Flecken oder Reste, 999 = Angabe nicht möglich) tR -- Bezugszeitraum, über welche die Neuschneehöhe gemessen wurde: 0 -- nicht aufgeführter oder vor dem Termin endender Zeitraum 1 -- 6 Stunden 2 -- 12 Stunden 3 -- 18 Stunden 4 -- 24 Stunden 5 -- 1 Stunde bzw. 30 Minuten (bei Halbstundenterminen) 6 -- 2 Stunden 7 -- 3 Stunden 8 -- 9 Stunden 9 -- 15 Stunden / -- Sondermessung wegen Überschreitung des Schwellenwerts (> 5 cm bzw. 10 cm in < 12 Stunden) * 7h'h'ZD' -- Dunst, Talnebel und Wolken unterhalb des Stationsniveaus h'h' -- Höhe der Obergrenze der Erscheinung über NN Z -- Entwicklung von Dunst, Talnebel und Wolken unterhalb des Stationsniveaus D' -- Sektor des Hauptanteils der Bedeckung mit der Erscheinung * 8Ns/hshs -- automatisch ermittelte Höhe von Wolkenschichten (Gruppe kann mehrmals verschlüsselt werden) Ns -- Bedeckungsgrad der Wolkenschicht in Achteln hs hs -- Höhe der Wolkenuntergrenze: 00 -- < 30 m (< 100 ft) 01 -- 30 m (100 ft) 02 -- 60 m (200 ft) 03 -- 90 m (300 ft) ... 50 -- 1500 m (5000 ft) ====================== 56 -- 1800 m (6000 ft) 57 -- 2100 m (7000 ft) ... 80 -- 9000 m (30000 ft) ======================= 81 -- 10500 m (35000 ft) 82 -- 12000 m (40000 ft) ... 88 -- 21000 m (70000 ft) 89 -- höher als 21000 m (> 70000 ft) ==================================== 90 -- 0 bis 49 m (0 - 166 ft) 91 -- 50 bis 99 m (167 - 333 ft) 92 -- 100 bis 199 m (334 - 666 ft) 93 -- 200 bis 299 m (667 - 999 ft) 94 -- 300 bis 599 m (1000 - 1999 ft) 95 -- 600 bis 999 m (2000 - 3333 ft) 96 -- 1000 bis 1499 m (3334 - 4999 ft) 97 -- 1500 bis 1999 m (5000 - 6666 ft) 98 -- 2000 bis 2499 m (6667 - 8333 ft) 99 -- 2500 m oder höher (> 8334 ft) * 910ff -- Höchste Windspitze in den letzten 10 Minuten (wird immer gemeldet!) */ /// 911ff -- Höchste Windspitze in der letzten Stunde (wird immer gemeldet!) HEADTK(911ff) { int m_hoechste_windspitze_letzten_stunde; public: GENTK( 911ff, "911[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "911%2d", &m_hoechste_windspitze_letzten_stunde ) ); } void Print() const { Append( _("Last hour maximum wind speed"), m_hoechste_windspitze_letzten_stunde, Unit_meters_second ); } }; /// 912ff -- Höchstes 10-Minuten-Mittel der Windgeschwindigkeit in der letzten Stunde (wird immer gemeldet!) HEADTK(912ff) { int m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde; public: GENTK( 912ff, "912[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "912%2d", &m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde ) ); } void Print() const { Append( _("Last hour ten minutes average wind speed"), m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde, Unit_meters_second ); } }; /* * PIC INp -- Wolkenbedeckung von Bergen (Gruppe kann bis zu 2-mal verschlüsselt werden) I -- Kennziffer und Richtung des Berges Np -- Bedeckungsgrad des Berges mit Wolken in Achteln * BOT hesnTTT -- Temperaturen im Erdboden (werden immer gemeldet!) he -- Meßtiefe: 0 -- 0 cm 1 -- 5 cm 2 -- 10 cm 3 -- 20 cm 4 -- 50 cm 5 -- 100 cm 6 -- 200 cm sn -- Vorzeichen der Erdbodentemperatur (0 = positiv, 1 = negativ) TTT -- Erdbodentemperatur der angegebenen Meßtiefe in 1/10 Grad Celsius * 80000 -- Kenngruppe für ergänzende klimatologische Meß- und Beobachtungsdaten für die Klimaroutinen * 1RRRRWR -- 6-stündiger Niederschlag Hinweis: Diese Gruppe wird zu den Hauptterminen (00, 06, 12, 18 UTC) gemeldet. RRRR -- Niederschlagsmenge in 1/10 mm (0000 = trocken, 9999 = < 0.05 mm) WR -- Indikator zur Niederschlagsgruppe und Kennzeichnung der Niederschlagsform: 0 -- kein Niederschlag 1 -- nur abgesetzte Niederschläge (flüssig und fest) 2 -- nur flüssige abgesetzte Niederschläge 3 -- nur feste abgesetzte Niederschläge 6 -- gefallener Niederschlag in flüssiger Form 7 -- gefallener Niederschlag in fester Form 8 -- gefallener Niederschlag in flüssiger und fester Form 9 -- Niederschlagsmessung ausgefallen * 2SSSS -- Tagessumme der Sonnenscheindauer des Vortags in Minuten (wird um 06 UTC gemeldet) * 3fkfkfk< -- Höchste Windspitze des Vortags (00 - 24 UTC) in 1/10 m/s (wird um 06 UTC gemeldet) * 4fxkfxkfxk -- Höchstes 10-Minuten-Mittel der Windgeschwindigkeit des Vortags (00 - 24 UTC) in 1/10 m/s (wird um 06 UTC gemeldet) * 5RwRw -- Spezifisches Wasseräquivalent der Schneedecke in 1/10 mm/cm (wird nur montags, mittwochs und freitags um 06 UTC gemeldet, wenn die Schneehöhe mindestens 5 cm beträgt) * 6VAVAVBVBV CVC -- Niederschläge und Wettererscheinungen des Vortags (werden um 06 UTC gemeldet) VAVA -- Gefallener Niederschlag des Vortags (00 - 24 UTC): 000 -- kein gefallener Niederschlag 001 -- Regen (Sprüh-/Nieselregen, Regen, Regentropfen) 002 -- gefrierender Regen (gefrierender Sprüh-/Nieselregen, gefrierender Regen) 004 -- Schnee (Schnee, Schneekristalle, Schneeflocken) 008 -- Graupel (Schneegriesel, Reifgraupel, Frostgraupel, Eiskörner) 016 -- Hagel Hinweis: Bei gleichzeitigem Auftreten mehrerer Niederschlagsarten werden die jeweiligen Schlüsselzahlen addiert, z. B.: Regen und Schnee und Graupel = 001 + 004 + 008 = 013 VBVB -- Abgesetzter oder abgelagerter Niederschlag des Vortags (00 - 24 UTC): 000 -- kein abgesetzter oder abgelagerter Niederschlag 001 -- Tau (Strahlungstau, Advektionstau, weißer Tau) 002 -- Reif (Strahlungsreif, Advektionsreif) 004 -- Rauhreif/Rauhfrost 008 -- Rauheis/Klareis 016 -- Glatteis/Eisglätte 032 -- Decke aus festen Niederschlägen (mindestens 50 % des Bodens bedeckend) Hinweis: Bei gleichzeitigem Auftreten mehrerer abgesetzter Niederschläge werden die jeweiligen Schlüsselzahlen addiert, z. B.: Tau und Reif sowie Schneedecke = 001 + 002 + 032 = 035 VCVC -- Sonstige Wettererscheinungen des Vortags (00 - 24 UTC): 000 -- keine sonstigen Wettererscheinungen 001 -- Nebel (Nebel, Nebeltreiben) 002 -- Gewitter (Nahgewitter, Ferngewitter) 004 -- starker Wind (Windstärke 6 und 7 im 10-Min.-Mittel) 008 -- stürmischer Wind (Windstärke > 8 im 10-Min.-Mittel) Hinweis: Bei gleichzeitigem Auftreten mehrerer Wettererscheinungen werden die jeweiligen Schlüsselzahlen addiert, z. B.: Gewitter und stürmischer Wind = 002 + 008 = 010 * 7snTxkTxkTxk -- Maximumtemperatur des Vortags (00 - 24 UTC) (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Txk Txk Txk -- Maximumtemperatur in 1/10 Grad Celsius * 8snTnkTnkTnk -- Minimumtemperatur des Vortags (00 - 24 UTC) (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Tnk Tnk Tnk -- Minimumtemperatur in 1/10 Grad Celsius * 9snTgTgTgsTg -- Minimumtemperatur des Vortags (00 - 24 UTC) 5 cm über dem Erdboden bzw. der Schneedecke (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Tg Tg Tg -- Erdbodenminimumtemperatur in 1/10 Grad Celsius sTg -- Bedeckung des Temperaturmeßfühlers 5 cm über dem Erdboden mit Schnee oder Eis am Vortag (0 = nein, 1 = ja, / = Angabe nicht möglich) */ /// Abschnitt 6 - Automatisch erzeugte Daten HEADTK(666) { public: GENTK( 666, "666" ) bool Parse( const char * str ) { return 0 == strcmp( str, "666" ); } void Print() const { Section( _("Automatisch erzeugte Daten") ); } }; /// 1snTxTxTx -- Maximumtemperatur der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tx Tx Tx -- Maximumtemperatur in 1/10 Grad Celsius HEADTK(1snTxTxTx) { char m_temperature_sign ; int m_temperature; public: GENTK( 1snTxTxTx, "1[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { AppCelsius( this, _("Last hour maximum temperature"), m_temperature_sign, m_temperature ); } }; /// 2snTnTnTn -- Minimumtemperatur der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tn Tn Tn -- Minimumtemperatur in 1/10 Grad Celsius HEADTK(2snTxTxTx) { char m_temperature_sign ; int m_temperature; public: GENTK( 2snTxTxTx, "2[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature) ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { AppCelsius( this, _("Last hour minimum temperature"), m_temperature_sign, m_temperature ); } }; /// 3snTnTnTn -- Minimumtemperatur 5 cm über dem Erdboden bzw. der Schneedecke in der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tn Tn Tn -- Erdbodenminimumtemperatur in 1/10 Grad Celsius /// 6VMxVMxVMxVMx/ VMnVMnVMnVMn> -- automatisch gemessene maximale/minimale meteorologische Sichtweite (MOR) der letzten ganzen bzw. halben Stunde (nur bei Halbstundenterminen) in m /// 7VMVMVMVM -- automatisch gemessene meteorologische Sichtweite (MOR) in m HEADTK(7VVVV) { int m_MOR; public: GENTK( 7VVVV, "7[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_MOR = -1; return ( 1 == sscanf( str, "7%4d", &m_MOR ) ) || ( 0 == strncmp( str, "7////", 5 ) ); } void Print() const { if(m_MOR >= 0) Append( _("MOR"), m_MOR, Unit_meters ); else Append( _("MOR"), _("Undetermined") ); } }; /* * 80000 -- Kenngruppe für automatisch erzeugte Niederschlagsdaten * 0RRRrx 1RRRrx 2RRRrx 3RRRrx 4RRRrx 5RRRrx 0, 1, 2, 3, 4, 5 (Gruppenkennziffer) -- Kennung der Zeitabschnitte der letzten Stunde: 0 -- 0. bis 9. Minute 1 -- 10. bis 19. Minute 2 -- 20. bis 29. Minute 3 -- 30. bis 39. Minute 4 -- 40. bis 49. Minute 5 -- 50. bis 59. Minute RRR -- 10-minütige Niederschlagshöhe in 1/10 mm rx -- Niederschlagsdauer im jeweiligen Zeitabschnitt in Minuten (0 = 10 Minuten bzw. kein Niederschlag gemessen) */ HEADTK(1VVff) { int m_visibility_metres; int m_gust_speed_knots; public: GENTK( 1VVff, "1[0-9/][0-9/]{3}" ) bool Parse( const char * str ) { m_visibility_metres = 0; m_gust_speed_knots = 0; if( 0 == strcmp( str, "1////" ) ) return true ; if( str[1] == '/' ) { return ( 1 == sscanf( str, "1/%3d", &m_gust_speed_knots ) ); } else { return ( 2 == sscanf( str, "1%2d%2d", &m_visibility_metres, &m_gust_speed_knots ) ); } } void Print() const { Append( _("Visibility"), m_visibility_metres, Unit_meters ); Append( _("Maximum gust speed in past 24 hours"), m_gust_speed_knots, Unit_knots ); } }; HEADTK(110ff) { int m_wind_speed_knots; public: GENTK( 110ff, "110[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "110%2d", &m_wind_speed_knots ) ); } void Print() const { Append( _("Wind speed at 10 meters"), m_wind_speed_knots, Unit_knots ); } }; HEADTK(220ff) { int m_wind_speed_knots; public: GENTK( 220ff, "220[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "220%2d", &m_wind_speed_knots ) ); } void Print() const { Append( _("Wind speed at 20 meters"), m_wind_speed_knots, Unit_knots ); } }; HEADTK(3GGmm) { int m_end_measure_hour; int m_end_measure_minute; public: GENTK( 3GGmm, "3[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "3%2d%2d", &m_end_measure_hour, &m_end_measure_minute ) ) && ( m_end_measure_hour < 25 ); } void Print() const { Append( _("Time of peak wind since last observation"), hour_min( m_end_measure_hour, m_end_measure_minute ) ); } }; HEADTK(4ddff) { int m_peak_direction_degrees; int m_peak_speed_knots; public: GENTK( 4ddff, "4[0-9]{4}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%3d%3d", &m_peak_direction_degrees, &m_peak_speed_knots ) ); } void Print() const { Append( _("Direction"), 10.0 * m_peak_direction_degrees, Unit_degrees ); Append( _("Speed"), m_peak_speed_knots, Unit_knots ); } }; /// End time in hours and minutes of the latest 10-minute continuous wind measurements. HEADTK(6GGmm) { int m_end_measure_hour; int m_end_measure_minute; public: /// More details: http://atmo.tamu.edu/class/atmo251/BuoyCode.pdf GENTK( 6GGmm, "6[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "6%2d%2d", &m_end_measure_hour, &m_end_measure_minute ) ) && ( m_end_measure_hour < 25 ); } void Print() const { Append( _("End time of latest 10-minute continuous wind measurement"), hour_min( m_end_measure_hour, m_end_measure_minute ) ); } }; /// 6 10-minute continuous wind measurements HEADTK(dddfff) { int m_direction_degrees; int m_speed_knots; public: GENTK( dddfff, "[0-9]{6}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "%3d%3d", &m_direction_degrees, &m_speed_knots ) ); } void Print() const { Append( _("Direction"), m_direction_degrees, _("degrees") ); Append( _("Speed"), m_speed_knots, _("knots") ); } }; // ---------------------------------------------------------------------------- /// Contains a Synop group and its length. struct synop_group { size_t m_usage_counter; // How many times did it match an input section. For debugging. section_t m_section ; size_t m_nb_toks ; const TOKGEN * m_tks ; synop_group( section_t g, size_t n, const TOKGEN * t ) : m_usage_counter(0), m_section(g), m_nb_toks(n), m_tks(t) {} friend std::ostream & operator<<( std::ostream & ostrm, const synop_group & syn ) { for( size_t i =0 ; i < syn.m_nb_toks; ++i ) { ostrm << RegexT::Name( syn.m_tks[i].m_rgx_idx ) << "-"; } return ostrm; } }; /// Contains all patterns of Synop sections. We hold a buffer of the last words and try to match /// it against all known patterns. static std::vector< synop_group > arrSynopGroups ; /// This defines a pattern which might mpatch a list of Synop tokens, i.e. a Synop section. #define TKLST(g, ... ) \ { \ static const TOKGEN hiddenTokGen[] = { __VA_ARGS__ }; \ arrSynopGroups.push_back( synop_group( g, G_N_ELEMENTS(hiddenTokGen), hiddenTokGen ) ); \ } static const void init_patterns(void) { static bool init = false ; if( init ) return ; init = true ; TKLST( SECTION_ZCZC_DLM,TK1(ZCZC),TK1(ZCZC_id) ); TKLST( SECTION_NNNN_DLM,TK1(NNNN) ); // http://www.nws.noaa.gov/tg/segment.html TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(RRx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(CCx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(AAx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(Pxx) ); TKLST( SECTION_IDENTLOC,TK1(IIiii),TK1(YYGGi),TK1(99LLL),TK1(QLLLL) ); // http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // TODO: NOT SURE IIiii should be added at the end. TKLST( SECTION_IDENTLOC,TK1(AAXX),TK1(YYGGi) ); // http://www.ominous-valve.com/wx_codes.txt // Can be followed by the callsign or the station id. TKLST( SECTION_IDENTLOC,TK1(BBXX),TK1(IIIII),TK1(YYGGi),TK1(99LLL),TK1(QLLLL) ); // IIIII is the callsign. // OOXX D....D YYGGiw 99LaLaLa QcLoLoLoLo MMMULaULo h0h0h0h0im TKLST( SECTION_IDENTLOC,TK1(OOXX),TK1(IIIII),TK1(YYGGi),TK1(99LLL),TK1(QLLLL),TK1(MMMULaULo),TK1(h0h0h0h0im) ); // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 00fff is optional. // - 2sTTT_dew can be replaced by 29UUU // - 4PPPP can be replaced by 4a3hhh // - 7WWWW can be replaced by 7wwWW // - 9GGgg is optional TKLST( SECTION_LAND_OBS,TK1(iihVV),TK1(Nddff),TK1(00fff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(NIL) ); // 10 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(8NCCC),TKn(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(9GGgg) ); // 61 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(5appp) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(9GGgg) ); // http://allaboutweather.tripod.com/synopcode.htm TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); // 01078 11470 30310 11045 21077 5//// 69941 70182 82360 333 91114= // A: Publish: Error, no coordinates. kmlNam= descrTxt= m_nb_tokens=5:Land observations=6RRRt#69941+7wwWW#70182+8NCCC#82360+;Climatological data=333#333+9SSss#91114+; TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); // 21 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(6RRRt),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 0sTTT is optional. TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(3dddd),TK1(4PPHH) ); // 66 TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(1PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(2PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(ICE),TK1(cSbDz) ); // http://allaboutweather.tripod.com/synopcode.htm // 333 1snTxTxTx (at 1800 UTC) 2snTnTnTn (at 0600 UTC) 3EsnTgTg (at 0600 UTC) 4E'sss (at 0600 UTC) 8NsChshs 9SpSpspsp // - SECTION 5 // 555 1V'f'/V'f''f'' 2snTwTwTw iiirrr /// BEWARE: jjjjj COULD BE REPEATED ! Or only with 55jjj ?? // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 0____ is optional. // - jjjjj is optional. TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(5jjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); // http://www.top-wetter.de/themen/synopschluessel.htm // 333 0.... 1sTTT 2sTTT 3EsTT 4E'sss 55SSS 2FFFF 3FFFF 4FFFF 553SS 2FFFF 3FFFF 4FFFF 6RRRt 7RRRR 8NChh 9SSss TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(4FFFF),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(7RRRR),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TK1(7RRRR),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(4Esss),TK1(7RRRR) ); // 51 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(6RRRtb),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(55jjj),TK1(jjjjj),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(6RRRtb),TK1(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(7RRRR),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(3Ejjj),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(553SS),TK1(2FFFF),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(5jjjj),TKn(8NChh),TK1(9SSss) ); // 61 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(5jjjj),TK1(6RRRtb),TKn(8NChh),TK1(9SSss) ); // 63 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(6RRRtb) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(5jjjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(5jjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(4Esss),TK1(7RRRR),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(55jjj),TK1(jjjjj),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(3FFFF),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(4Esss),TK1(553SS),TK1(6RRRt),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(553SS),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(3FFFF),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(2FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(6RRRt),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(5jjjj),TK1(6RRRtb) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(5jjjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(3Ejjj),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(3Ejjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(9SSss) ); // http://www.top-wetter.de/themen/synopschluessel.htm#444 TKLST( SECTION_NATCLOUD,TK1(444),TK1(NCHHC) ); // NOT SURE AT ALL. // http://allaboutweather.tripod.com/synopcode.htm TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TK1(2sTTT_avg),TK1(3Ejjj),TK1(4Esss),TKn(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TK1(2sTTT_avg),TK1(3Ejjj),TKn(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(2sTTT_avg),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(3Ejjj),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(9SSss) ); // http://metaf2xml.sourceforge.net/parser.pm.html // AT: 1snTxTxTx 6RRR/ // 1snTxTxTx : maximum temperature on the previous day from 06:00 to 18:00 UTC // 6RRR/ : amount of precipitation on the previous day from 06:00 to 18:00 UTC // BE: 1snTxTxTx 2snTnTnTn // 1snTxTxTx : maximum temperature on the next day from 00:00 to 24:00 UTC // 2snTnTnTn : minimum temperature on the next day from 00:00 to 24:00 UTC // CA: 1ssss 2swswswsw 3dmdmfmfm 4fhftftfi // 1ssss : amount of snowfall, in tenths of a centimeter, for the 24-hour period ending at 06:00 UTC // 2swswswsw : amount of water equivalent, in tenths of a millimeter, for the 24-hour snowfall ending at 06:00 UTC // 3dmdmfmfm : maximum (mean or gust) wind speed, in knots, for the 24-hour period ending at 06:00 UTC and its direction // 4fhftftfi : together with the previous group, the hundreds digit of the maximum wind speed (in knots), // the time of occurrence of the maximum wind speed, and the speed range // of the maximum two-minute mean wind speed, for the 24-hour period ending at 06:00 UTC and its direction // US land: RECORD* 0ittDtDtD 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 44snTwTw 9YYGG // RECORD : indicator for temperature record(s) // 0ittDtDtD : tide data // 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 : city data: temperature, maximum and minimum temperature, // indicator for temperature record(s), precipitation last 24 hours // 44snTwTw : water temperature // 9YYGG : additional day and hour of observation (repeated from Section 0) // US sea: 11fff 22fff 3GGgg 4ddfmfm 6GGgg dddfff dddfff dddfff dddfff dddfff dddfff 8ddfmfm 9GGgg // 11fff 22fff : equivalent wind speeds at 10 and 20 meters // 3GGgg 4ddfmfm : maximum wind speed since the last observation and the time when it occurred // 6GGgg : end time of the latest 10-minute continuous wind measurements // 6 x dddfff : 6 10-minute continuous wind measurements // 8ddfmfm 9GGgg : highest 1-minute wind speed and the time when it occurred // CZ: 1dsdsfsfs 2fsmfsmfsxfsx 3UU// 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 // 1dsdsfsfs : wind direction and speed from tower measurement // 2fsmfsmfsxfsx : maximum wind gust speed over 10 minute period and the period W1W2 // 3UU// : relative humidity // 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 : soil temperature at the depths of 5, 10, 20, 50, and 100 cm // RU: 1EsnT'gT'g 2snTnTnTn 3EsnTgTg 4E'sss 52snT2T2 6RRRtR 7R24R24R24/ 88R24R24R24 // 1EsnT'gT'g : state of the ground without snow or measurable ice cover, temperature of the ground surface // 2snTnTnTn : minimum temperature last night // 3EsnTgTg : state of the ground without snow or measurable ice cover, minimum temperature of the ground surface last night // 4E'sss : state of the ground if covered with snow or ice, snow depth // 6RRRtR : amount of precipitation for given period // 7R24R24R24/ : amount of daily precipitation // 88R24R24R24 : amount of daily precipitation if 30 mm or more // http://atmo.tamu.edu/class/atmo251/BuoyCode.pdf // 6GGgg is also called 6GGmm TKLST( SECTION_NAT_CODE,TK1(555),TK1(6GGmm) ); // Or 6snT10T10T10 /// Applies to CMAN messages but apparently to others too. // 3GGgg 4ddfmfm: maximum wind speed since the last observation and the time when it occurred TKLST( SECTION_NAT_CODE,TK1(555),TK1(110ff),TK1(220ff),TK1(3GGmm),TK1(4ddff),TK1(6GGmm),TKn(dddfff) ); // http://www.top-wetter.de/themen/synopschluessel.htm #ifdef FULL_SYNOP_555 TKLST( SECTION_NAT_CODE,TK1(555),TK1(0sTTT_land),TK1(1RRRr),TK1(2sTTT_avg),TK1(22fff),TK1(23SS),TK1(24Wt),TKn(25ww),TK1(26fff),TK1(3LLLL),TK1(5ssst),TK1(7hhZD),TK1(8N_hh),TK1(910ff),TK1(911ff),TK1(912ff),TK1(PIC),TK1(IN),TK1(BOT),TK1(hsTTT) ); #else TKLST( SECTION_NAT_CODE,TK1(555),TK1(0sTTT_land),TK1(1RRRr),TK1(2sTTT_avg),TK1(911ff),TK1(912ff) ); #endif // TODO: Consider optional tokens. // manfred@met.fu-berlin.de Joerg Wichmann // http://www.top-wetter.de/themen/synopschluessel.htm // 666 1sTTT 2sTTT 3sTTT 6VVVV/VVVV 7VVVV TKLST( SECTION_AUTO_DAT,TK1(666),TK1(1snTxTxTx),TK1(2snTxTxTx),TK1(7VVVV) ); // http://www.top-wetter.de/themen/synopschluessel.htm // 80000 0RRRr 1RRRr 2RRRr 3RRRr 4RRRr 5RRRr }; #undef TK /// Actual implementation of the synop objet. Details are hidden. class synop_impl : public synop { /// All characters which are not flushed yet. std::string m_buf ; /// Words being read (Between spaces, tabs etc...) std::string m_current_word ; /// When disabled, chars pass through the object without change. bool m_enabled ; /// A chain of Synop tokens, which tries to match a group. class Chain { size_t m_idxGroup ; // Index of the Synop group. size_t m_idxTok ; // Index of the first Synop token in the group. size_t m_nxtTok ; // Index of the next Synop token in the group. priority_t m_sum_prios ; TokenProxy::TokVec::Ptr m_tokens ; Chain(); void PushElement(TokenProxy::Ptr tp) { if( ! m_tokens ) m_tokens = TokenProxy::TokVec::Ptr( new TokenProxy::TokVec ); PushItself( tp, m_tokens ); } public: /// TODO: Allocates m_tokens only if appending a first token is possible. Chain( int i, int j) : m_idxGroup(i), m_idxTok(j), m_nxtTok(j), m_sum_prios(0.0) {} const TokenProxy::TokVec::Ptr & Tokens() const { assert( m_tokens ); return m_tokens; } section_t section(void) const { return arrSynopGroups[m_idxGroup].m_section; } /// Beware that some elements might have been repeated. bool IsFinished(void) const { // TODO: Our synop_group element should be copied here. const synop_group * ptrSynopGroup = &arrSynopGroups[m_idxGroup]; if( m_nxtTok == m_idxTok ) return false ; size_t nbToks = ptrSynopGroup->m_nb_toks ; if( m_nxtTok > nbToks ) return true ; if( m_nxtTok < nbToks ) return false ; return ! ptrSynopGroup->m_tks[ m_nxtTok - 1 ].m_many; } /// Tries to add a new word at the end of a chain of tokens. TokenProxy::Ptr TryPush( RegexT::Context & rgxCtxt, const std::string & str, size_t txt_offset ) { if( IsFinished() ) return TokenProxy::Ptr(); const synop_group * ptrSynopGroup = &arrSynopGroups[m_idxGroup]; assert( m_nxtTok <= ptrSynopGroup->m_nb_toks ); if( m_nxtTok < ptrSynopGroup->m_nb_toks ) { const int reg_idx = ptrSynopGroup->m_tks[ m_nxtTok ].m_rgx_idx; if( rgxCtxt.Mtch( reg_idx, str ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, str, txt_offset ); /// Maybe a token which must not be at the beginning of a sequence. if( ( m_nxtTok == m_idxTok ) && ( false == tp->CanComeFirst() ) ) { return TokenProxy::Ptr() ; } /// It must parse the current word and the priority must be high enough. if( tp->ParseItself() ) { PushElement( tp ); m_sum_prios += RegexT::Priority( reg_idx ); ++m_nxtTok ; /* std::cout << "DEBUG:" << __FUNCTION__ << " m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str << " m_nxtTok=" << m_nxtTok << " priority=" << m_sum_prios << "\n" ; */ return tp ; } } } /// Maybe the previous pattern can be repeated if "m_many" flag ? if( m_nxtTok > m_idxTok ) { const TOKGEN & tokgen = ptrSynopGroup->m_tks[ m_nxtTok - 1 ]; int reg_idx = tokgen.m_rgx_idx; if( tokgen.m_many && rgxCtxt.Mtch( reg_idx, str ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, str, txt_offset ); /// It must parse the current word and the priority must be high enough. if( tp->ParseItself() ) { PushElement( tp ); m_sum_prios += RegexT::Priority( reg_idx ); /* std::cout << "DEBUG:" << __FUNCTION__ << " REPET m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str << " m_nxtTok=" << m_nxtTok << " m_idxTok=" << m_idxTok << " maxTks=" << ptrSynopGroup->m_nb_toks << " priority=" << m_sum_prios << "\n" ; */ return tp ; } } } /* * MAYBE THE TOKEN IS OPTIONAL. IF YES, RETRY WITH NEXT TOKEN. */ // Now if the match is not empty, we might tolerate one dummy string. if( m_nxtTok > m_idxTok + 2 ) { } // If the previous match is a dummy string, maybe this is because two tokens coalesced, // therefore we try the next token. return TokenProxy::Ptr(); } // Chain::TryPush // TODO: This is now simply the chain length, but we could refine the concept. priority_t sum_priorities(void) const { return m_sum_prios;} size_t text_begin() const { assert( ! m_tokens->empty() ); return m_tokens->front()->offset_begin(); } size_t text_end() const { assert( ! m_tokens->empty() ); return m_tokens->back()->offset_end(); } std::string test_display() const { return m_tokens->MiniDump(section(),true); } void display_chain( bool test_mode, bool kml_mode ) const { m_tokens->DumpTokVec( test_mode, section(), kml_mode ); } // This helps to check if a pattern was used or not. void increment_usage_counter(void) const { arrSynopGroups[m_idxGroup].m_usage_counter++; } typedef std::list< Chain > List ; // Adds our current object at the end of a list. Fast copy thanks to smart pointers. void ConcatToList( List & refList ) const { refList.push_back( *this ); List::iterator lastChain = refList.end(); --lastChain ; if( lastChain != refList.begin() ) { List::iterator prevChain = lastChain ; --prevChain ; lastChain->m_tokens->previous( prevChain->m_tokens ); } } }; // synop_impl::Chain Chain::List m_chains ; /// This represents the last successful chains which can be aggregated into a message. class Message : public Chain::List { // Debug purpose. std::string TstToStr(void) const { std::string res ; for( const_iterator it = begin(), en = end(); it != en; ++ it ) { res += SectionToString(it->section()); res +="=" + it->test_display() + ";"; } return res ; } /// Looks for a specific token in the tokens chain passed as an iterator. template< class TokClass > void SetIfNull( const TokClass * & refIter, const_iterator itChain ) const { const TokClass * tmpPtr = itChain->Tokens()->front()->template get_ptr< TokClass >(false); if( tmpPtr == NULL ) return ; if( refIter == NULL ) { refIter = tmpPtr ; return ; } /// In some circumstances, we might duplicate the header to split the message. LOG_WARN("Duplicate token=%s:%s, was:%s: m_nbTokens=%d:%s", typeid(TokClass).name(), tmpPtr->c_str(), refIter->c_str(), (int)m_nbTokens, TstToStr().c_str() ); refIter = tmpPtr ; // Take the closest (and last). } // Total number of tokens in the list of token chains. size_t m_nbTokens; /// Called when the end of a message is detected. void Publish(void) { const_iterator it0 = begin(); if(it0 == end() ) { LOG_DEBUG("No publish0 empty message"); return; } // Quick check if the message is very short. Beware, it it the total // number of tokens, not the number of sections. if(m_nbTokens <= 2 ) { LOG_DEBUG("No publish1 m_nbTokens=%d:%s", static_cast(m_nbTokens), TstToStr().c_str() ); return ; } // We eliminate this kind of message which is not SYNOP although the beginning is similar. // Other simple combinations might be eliminated but they are rarer. // ZCZC 603 // WWXX60 EDZW 201700 const_iterator it1 = it0; ++it1 ; if( ( it0->section() == SECTION_HEAD_GRP ) && ( it1 != end() ) && ( it1->section() == SECTION_IDENTLOC ) ) { if( m_nbTokens <= 3 ) { if (bMOREINFO) LOG_INFO("No publish3 %s", TstToStr().c_str() ); return ; } // TODO: Store these for next run if their are missing. } if( it1 == end() ) { // For example, receiving only the following line makes no sense: // Climatological data=6RRRt#69907+8NChh#81822+9SSss#91113+9SSss#96480;+; if( it0->section() != SECTION_LAND_OBS ) { if (bMOREINFO) LOG_INFO("No publish2 %s", TstToStr().c_str() ); return ; } // TODO: We should use the header SECTION_IDENTLOC of the previous message: // SMOS01 LOWM 190000 // AAXX 19001 // 11036 32565 73208 10000 21038 30065 40306 57008 8353/ 333 83629 // 86360 91013 91113 91209= // 11010 35561 /2504 11031 21043 39946 40345 57009= // 11120 36/17 /9901 11111 21112 39620 40386 57005= } /// This gets some crucial information from the tokens. const CLASSTK(QLLLL) * ptr_QLLLL = NULL; const CLASSTK(IIIII) * ptr_IIIII = NULL; const CLASSTK(IIiii) * ptr_IIiii = NULL; const CLASSTK(iihVV) * ptr_iihVV = NULL; const CLASSTK(MMMULaULo) * ptr_MMMULaULo = NULL; const CLASSTK(YYGGi) * ptr_YYGGi = NULL; const CLASSTK(YYGGgg) * ptr_YYGGgg = NULL; const CLASSTK(Numbered) * ptr_Numbered = NULL; // In all the chains of tokens , we try to grap some specific tokens. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { assert( itChain->Tokens() ); SetIfNull< CLASSTK(QLLLL) >( ptr_QLLLL , itChain ); SetIfNull< CLASSTK(IIIII) >( ptr_IIIII , itChain ); SetIfNull< CLASSTK(IIiii) >( ptr_IIiii , itChain ); SetIfNull< CLASSTK(iihVV) >( ptr_iihVV , itChain ); SetIfNull< CLASSTK(MMMULaULo) >( ptr_MMMULaULo, itChain ); SetIfNull< CLASSTK(YYGGi) >( ptr_YYGGi , itChain ); SetIfNull< CLASSTK(YYGGgg) >( ptr_YYGGgg , itChain ); SetIfNull< CLASSTK(Numbered) >( ptr_Numbered , itChain ); } bool foundCoo = false ; CoordinateT::Pair newCoo ; double altitudeStation = 0.0; if( ptr_QLLLL ) { if(ptr_QLLLL->CoordinatesOK() ) { newCoo = CoordinateT::Pair( ptr_QLLLL->Longitude(), ptr_QLLLL->Latitude() ); foundCoo = true ; } } std::string kmlNam ; std::string iconNam ; std::string descrTxt ; std::string stationCountry ; bool foundIdentifier = false; /// It also indicates whether we could find the station name given the WMO indicator. if( ptr_IIiii ) { int wmoIndicInt = ptr_IIiii->WmoIndicator(); std::stringstream strmWmo ; strmWmo << std::setfill('0') << std::setw(5) << wmoIndicInt; std::string wmoIndicStr = strmWmo.str(); descrTxt = "WMO " + wmoIndicStr ; const RecordBuoy * ptrBuoy_Tok = CatalogBuoy::FindFromKey( wmoIndicStr ); const RecordWmoStation * ptrWmo_Tok = CatalogWmoStations::FindFromKey( wmoIndicInt ); /// We cannot rely on "isAutomated" to guess if it is a buoy or not. if( ptrWmo_Tok == NULL ) { if( ptrBuoy_Tok ) { foundIdentifier = true; CoordinateT::Pair tmpCoo = ptrBuoy_Tok->station_coordinates(); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with buoy: " << ptrBuoy_Tok->buoy_name() << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; if (bMOREINFO) LOG_INFO("%s", strm.str().c_str() ); } } else { foundCoo = true ; } // In both cases, we take the coordinates given by the WMO file. newCoo = tmpCoo ; altitudeStation = 0; kmlNam = ptrBuoy_Tok->title(); iconNam = ptrBuoy_Tok->type(); } else { const RecordJComm * ptrJComm_Tok = CatalogJComm::FindFromKey( wmoIndicStr ); if( ptrJComm_Tok ) { ptrJComm_Tok->SetJCommFields( kmlNam, iconNam ); if( stationCountry.empty() ) stationCountry = ptrJComm_Tok->country(); } else { kmlNam = "Automated station:" + wmoIndicStr ; iconNam = "automated"; } } } if( ptrBuoy_Tok == NULL ) { iconNam = "wmo"; if( ptrWmo_Tok ) { foundIdentifier = true; CoordinateT::Pair tmpCoo = ptrWmo_Tok->station_coordinates(); if( stationCountry.empty() ) stationCountry = ptrWmo_Tok->country(); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with WMO station: " << ptrWmo_Tok->station_name() << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; if (bMOREINFO) LOG_INFO("%s", strm.str().c_str() ); } } else { foundCoo = true ; } // In both cases, we take the coordinates given by the WMO file. newCoo = tmpCoo ; altitudeStation = ptrWmo_Tok->station_elevation(); kmlNam = ptrWmo_Tok->station_name(); } else { const RecordJComm * ptrJComm_Tok = CatalogJComm::FindFromKey( wmoIndicStr ); if( ptrJComm_Tok ) { ptrJComm_Tok->SetJCommFields( kmlNam, iconNam ); if( stationCountry.empty() ) stationCountry = ptrJComm_Tok->country(); } else { if (bMOREINFO) LOG_INFO("Cannot find WMO station:%s", wmoIndicStr.c_str() ); kmlNam = "WMO:" + wmoIndicStr ; } } } if( ( ptrWmo_Tok != NULL ) && ( ptrBuoy_Tok != NULL ) ) { LOG_WARN("Conflit buoy/WMO"); } } std::string stationCallsign ; if( ptr_IIIII ) { std::string buoyNam ; const char * shipIdIIIII = ptr_IIIII->ShipIdentifier(); if( ! descrTxt.empty() ) descrTxt += ","; descrTxt += _("Ship "); descrTxt += shipIdIIIII; const RecordShip * ptrShip_Tok = CatalogShip::FindFromKey( shipIdIIIII ); if( ptrShip_Tok ) { stationCallsign = buoyNam = ptrShip_Tok->callsign(); if( ! ptrShip_Tok->name().empty() ) buoyNam += "," + ptrShip_Tok->name(); if( iconNam.empty() ) iconNam = "ship"; else iconNam += " ship"; if( stationCountry.empty() ) stationCountry = ptrShip_Tok->country(); } else { const RecordBuoy * ptrBuoy_Tok = CatalogBuoy::FindFromKey( shipIdIIIII ); if( ptrBuoy_Tok ) { buoyNam = ptrBuoy_Tok->title(); if( iconNam.empty() ) iconNam = "other buoy"; else iconNam += " buoy"; } } if( buoyNam.empty() ) { if( kmlNam.empty() ) { kmlNam = std::string("Ship:") + shipIdIIIII; if( iconNam.empty() ) iconNam = "ship"; else iconNam += " ship"; } else { LOG_WARN("Conflict between station %s and ship/buoy identifier %s", kmlNam.c_str(), shipIdIIIII ); } } else { if( kmlNam.empty() ) { kmlNam = buoyNam; } else { // Maybe the WMO station was there. if( foundIdentifier ) { LOG_WARN("Conflict between station %s and ship/buoy callsign %s identifier %s", kmlNam.c_str(), buoyNam.c_str(), shipIdIIIII ); } else { // We concatenate the information. Maybe this is not a conflict after all. if( foundIdentifier ) kmlNam += ",Ship:" + buoyNam ; else kmlNam = buoyNam ; } } } } if( ptr_MMMULaULo && ptr_MMMULaULo->MarsdenValid() ) { CoordinateT::Pair tmpCoo( ptr_MMMULaULo->Longitude(), ptr_MMMULaULo->Latitude() ); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with Marsden square. " << " Coordinates:"<< newCoo << " against:" << tmpCoo << " Dist:" << dist; LOG_WARN("%s", strm.str().c_str() ); } } else { foundCoo = true ; } newCoo = tmpCoo ; } // TODO: Adding time as fourth dimension: // http://earth.google.com/outreach/tutorial_time.html // TODO: Shame that we are losing this message because no coordinates. if( false == foundCoo ) { std::stringstream strm ; strm << "Error, no coordinates."; strm << " kmlNam=" << kmlNam ; strm << " descrTxt=" << descrTxt , strm << " m_nb_tokens=" << m_nbTokens << ":"; strm << TstToStr(); LOG_WARN("%s", strm.str().c_str() ); return ; } // If no time is defined, set current time. time_t tmObservation = 0 ; if( ptr_YYGGi ) { tmObservation = ptr_YYGGi->ObservationTimeUTC(); if( ptr_YYGGgg ) { time_t obsTmGGgg = ptr_YYGGgg->ObservationTimeUTC(); int days = diffTm( tmObservation, obsTmGGgg ); if(days > 1) { LOG_WARN( _("Unreliable observation time: %s and %s"), Tm2SynopTime( tmObservation ).c_str(), Tm2SynopTime( obsTmGGgg ).c_str() ); } } } else if( ptr_YYGGgg ) { tmObservation = ptr_YYGGgg->ObservationTimeUTC(); } // The name must be unique. if( kmlNam.empty() ) { std::stringstream strm ; strm << _("Station") << " " << newCoo; kmlNam = strm.str(); } if( iconNam.empty() ) iconNam = "Weather Station"; if( descrTxt.empty() ) descrTxt = _("Undetermined station"); if( synop::ptr_callback->log_adif() ) { // This builds an ADIF message. struct AdifSerializer : public Serializer, public std::string { void StartSection( const std::string & section_name ) { static_cast(*this) += section_name + ADIF_EOL; } // Will add a new line to a text message in the ADIF record. void AddItem( const char * key, const char * value, const char * unit ) { std::string & refStr = *this ; refStr += key ; refStr += "="; refStr += value ; if(unit) { refStr += " " ; refStr += unit ; } refStr += ADIF_EOL; } }; // synop_impl::Message::KmlSerializer AdifSerializer adifSerial ; /// Concatenate information from each chain. This is where the serializer kmlSerial is called. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { itChain->display_chain(false, true); } /// For updating the logbook with received messages. QsoHelper qso(MODE_RTTY) ; if( ! stationCallsign.empty() ) qso.Push(CALL, stationCallsign ); if( ! stationCountry.empty() ) qso.Push(COUNTRY, stationCountry ); { std::stringstream strm ; strm << newCoo ; qso.Push(QTH, strm.str() ); } qso.Push(GRIDSQUARE, newCoo.locator() ); qso.Push(NAME, kmlNam ); /// If the header is clean, the message type is removed from the string. // In this context, this field cannot be used. qso.Push(XCHG1, iconNam ); // AAx, RRx, CCx, Pxx if( ptr_Numbered ) { qso.Push(SRX, ptr_Numbered->Number() ); } // Sequence of Chars and line-breaks, ASCII CR (code 13) + ASCII LF (code 10) qso.Push(NOTES, adifSerial ); } if( synop::ptr_callback->log_kml() ) { /// Writes messages to a list of key-value pairs, later displayed in KML. struct KmlSerializer : public Serializer, public KmlServer::CustomDataT { // TODO: Doubles the line width of the HTML table. void StartSection( const std::string & section_name ) { // m_freeText << section_name << "\n"; } // Will add a new line to a HTML table. void AddItem( const char * key, const char * value, const char * unit ) { std::string val = unit ? value + std::string(" ") + unit : std::string(value); Push( key, val ); } }; // synop_impl::Message::KmlSerializer KmlSerializer kmlSerial ; /// Concatenate information from each chain. This is where the serializer kmlSerial is called. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { itChain->display_chain(false, true); } // Beware: Some WMO stations have the same name but are not mobile. KmlServer::GetInstance()->Broadcast( "Synop", tmObservation, newCoo, altitudeStation, kmlNam, iconNam, descrTxt, kmlSerial ); } } // synop_impl::Message::Publish public: ~Message() { Publish(); } /// Inconditionnaly cleans the content because too many chars could not be read. void MsgFlush() { // Should be called also after a given timeout. Publish(); Chain::List::clear(); m_nbTokens = 0; } /// When getting rid of the current message. // We might keep it or flush everything etc... void MsgFlushAndMove( const Chain & refChain ) { // Depending on the section of the last chain of the message, // and the section from this brand new chain, this decides to aggregate // the new section at the end of the message, otherwise create a new one, // and broadcast the current message. if( ! empty() ) { section_t new_sec = refChain.section(); section_t last_sec = Chain::List::back().section(); // To build messages, checks if a section can follow another one. if( 0 == sectionTransitions[new_sec][last_sec] ) { MsgFlush(); } } refChain.ConcatToList( *this ); m_nbTokens += refChain.Tokens()->size(); } }; // synop_impl::Message /// We add new chains of tokens, that is, sections, at the end of the message. Message m_current_message ; public: /// If margin is positive, this is the number of chars to be kept in the buffer for further decoding, /// because we are not sure at the moment of what they will be used for. /// If this is negative, this is the number of characters immediately after the decoded chain, /// which should be discarded: This is an end of section, '=' character. void decode_then_flush(int margin = 0 ) { // The margin is here only for display purpose. If the chars are immediately // displayed, there should not be anything in the buffer. size_t len_to_keep = margin > 0 ? margin : 0 ; Chain::List::const_iterator beg = m_chains.begin(), en = m_chains.end(); // Maybe we did not manage to decode anything. if( beg == en ) { // it might also be empty because we are in interleaved mode. if( m_buf.size() >= len_to_keep ) { disp_range( m_buf.begin(), m_buf.end() - len_to_keep ); m_buf.erase(m_buf.begin(), m_buf.end() - len_to_keep); } return ; } Chain::List::const_iterator best = beg ; priority_t best_priority = best->sum_priorities() ; // TODO: We should count the solutions of the same priority (More or less the length), // with a different beginning as ours. for( Chain::List::const_iterator it = beg; ++it != en ; ) { assert( it->Tokens() ); if( it->sum_priorities() > best_priority ) { best_priority = it->sum_priorities() ; best = it ; } }; assert( best != en ); m_current_message.MsgFlushAndMove(*best); // Maybe no chain is worth of interest. bool decoded_ok = best_priority >= MIN_PRIO ; // Counts the number of times this chain is selected. if( decoded_ok ) { best->increment_usage_counter(); } // If interleaved mode, chars are immediately printed. if( m_buf.empty() ) { if( decoded_ok ) { // This just displays the single chain in the output buffer. best->display_chain( GetTestMode(), false ); } } else { assert( len_to_keep <= m_buf.size() ); if( decoded_ok ) { // Not sure why we remove the last char. size_t txt_beg = best->text_begin(); size_t txt_end = best->text_end(); // There might have been a synchronization problem when changing params. if( (txt_beg > 0) && ( txt_beg - 1 <= m_buf.size() ) ) { disp_range( m_buf.begin(), m_buf.begin() + txt_beg - 1 ); } else { LOG_WARN("Bugcheck1: txt_beg=%d txt_end=%d margin=%d m_buf=%s", (int)txt_beg, (int)txt_end, (int)margin, m_buf.c_str() ); } // This just displays the single chain in the output buffer. best->display_chain( GetTestMode(), false ); if( (txt_beg > 0) && ( txt_beg - 1 + len_to_keep <= m_buf.size() ) ) { int to_discard = (margin < 0 ) ? - margin : 0 ; disp_range( m_buf.begin() + txt_end - 1 + to_discard , m_buf.end() - len_to_keep ); } else { LOG_WARN("Bugcheck2: txt_beg=%d txt_end=%d margin=%d m_buf=%s", (int)txt_beg, (int)txt_end, (int)margin, m_buf.c_str() ); } } else { disp_range( m_buf.begin(), m_buf.end() - len_to_keep ); } m_buf.erase(m_buf.begin(), m_buf.end() - len_to_keep); } m_chains.clear(); } // synop_impl::decode_then_flush private: // TODO: When starting a section, we should take first tokens of the same priority, in order to finish. /// Adds a new current word. tries all possible chains to which this word matches one token, even in the middle. size_t AddTokInit() { RegexT::Context rgxCtxt; // std::cout << __FUNCTION__ << "\n"; size_t nbInserts = 0 ; assert( m_chains.empty() ); const size_t buf_sz = m_buf.size(); // The same list can appear in several chains, this is intended. for( int i = 0, nbSynGrp = arrSynopGroups.size(); i < nbSynGrp; ++i ) { for( size_t j = 0, nbToks = arrSynopGroups[i].m_nb_toks; j < nbToks; ++j ) { Chain tmpChain( i, j ); if( tmpChain.TryPush( rgxCtxt, m_current_word, buf_sz ) ) { m_chains.push_back( tmpChain ); ++nbInserts; } } } // std::cout << "DEBUG:" << __FUNCTION__ << ":" << m_current_word << ":at:" << m_buf.size() << " m_buf=" << m_buf << " nbIns=" << nbInserts << " nbChains=" << m_chains.size() << "\n"; return nbInserts; } // synop_impl::AddTokInit /// Tries to add the last word to all possible token chains. size_t AddOtherTok() { class CtxtDerived : public RegexT::Context { struct BestStartTokenT { priority_t m_minPrio ; // Must be negative at startup. size_t m_newReg ; public: BestStartTokenT() : m_minPrio(-1.0), m_newReg(~0) {} void TstSwapPrio( priority_t newPrio, size_t newReg ) { if( m_minPrio < newPrio ) { m_minPrio = newPrio; m_newReg = newReg; } } }; /// This contains for each section the regex which matches the best // the current work, and starting a chain whose section immediately follow ours. BestStartTokenT m_bstStartToken[ SECTION_SECT_NBR ]; section_t m_currSection ; public: CtxtDerived() : m_currSection( static_cast(-1) ) {} void CmpSwapPriority( size_t newReg, section_t newSection ) { priority_t newPrio = RegexT::Priority( newReg ); /// This iterates on all sections which might immediately precede this one. for( size_t precedSec = 0; precedSec < SECTION_SECT_NBR; ++precedSec ) { // Does it make sense to have one section type following another ? if( 0 == sectionTransitions[newSection][precedSec] ) continue ; m_bstStartToken[ precedSec ].TstSwapPrio( newPrio, newReg ); } } /// Does the section comes just before ours ? void SetDistance( section_t predSection ) { m_currSection = predSection ; } // Called in two contexts: // When looking for a better beginning regex. // Or as a virtual in TryPush. virtual bool Mtch( size_t reg_idx, const std::string & str ) { if( m_bstStartToken[ m_currSection ].m_minPrio > RegexT::Priority( reg_idx ) ) { /* * We could add a condition on the length because of this: Expect [IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ Actual [IIIII+YYGGi+99LLL+QLLLL+ 41/96 222Dv+1PPHH+2PPHH+ 4PPPP+5appp+7wwWW+ */ /* std::cout << " prio=" << m_bstStartToken[ m_currSection ].m_minPrio << " str=" << str << " m_newReg:" << m_bstStartToken[ m_currSection ].m_newReg << " prioRgx=" << RegexT::Name(m_bstStartToken[ m_currSection ].m_newReg) << " currSec=" << SectionToString(m_currSection) << " against:" << RegexT::Name(reg_idx) << " reg_idx:" << reg_idx << " oldPrio:" << RegexT::Priority( reg_idx ) << "\n"; */ return false ; } return RegexT::Context::Mtch( reg_idx, str ); }; }; // CtxtDerived CtxtDerived rgxCtxtDerived; const size_t buf_sz = m_buf.size(); /// What happens if it matches the beginning if a chain // NOTE: We suppose that the beginning is never multiple ("Many"). for( int idxGrp = 0, nbSynGrp = arrSynopGroups.size(); idxGrp < nbSynGrp; ++idxGrp ) { const synop_group * ptrSynopGroup = &arrSynopGroups[idxGrp]; assert( ptrSynopGroup->m_nb_toks > 0 ); assert( ptrSynopGroup->m_tks[ 0 ].m_many == false ); const int reg_idx = ptrSynopGroup->m_tks[ 0 ].m_rgx_idx; if( rgxCtxtDerived.Mtch(reg_idx, m_current_word ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, m_current_word, buf_sz ); if( tp->ParseItself() ) { rgxCtxtDerived.CmpSwapPriority( reg_idx, ptrSynopGroup->m_section ); } } } /// Contains the list of chains to which we could not add the current (and last) word. typedef std::list< Chain::List::iterator > ChainsNoInsrtsT ; ChainsNoInsrtsT chainsNoInsrts ; /// We try to add the new word to all potential solutions. size_t nbInserts = 0 ; for( Chain::List::iterator it = m_chains.begin(), en = m_chains.end(); it!= en; ++it ) { /* Beware: Maybe the current word matches an intermediate token which is also the beginning of another chain. In this case, it does not count. It should not be a problem because the priorities are identical. */ rgxCtxtDerived.SetDistance( it->section() ); if( it->TryPush( rgxCtxtDerived, m_current_word, buf_sz ) ) { ++nbInserts; } else { chainsNoInsrts.push_back( it ); } } if( nbInserts != 0 ) { /// Removes the chains which cannot possibly match the current suite of tokens. for( ChainsNoInsrtsT::iterator it = chainsNoInsrts.begin(), en = chainsNoInsrts.end(); it != en; ++it ) { m_chains.erase( *it ); } } return nbInserts; } // synop_impl::AddOtherTok public: synop_impl() { /// Display each decoded key/value/unit item, to a stream, for debug logging. struct SynopSerializer : public Serializer { void StartSection( const std::string & section_name ) { std::string str = section_name + "\n"; disp_range( str.begin(), str.end(), true ); } /// Print in bold chars or special color. void AddItem( const char * key, const char * value, const char * unit ) { std::stringstream strm ; strm << '\t' << key << '=' << value << ' ' << ( unit ? unit : "" ) << '\n'; std::string str = strm.str(); disp_range( str.begin(), str.end(), true ); } }; // synop_impl::SynopSerializer /// It registers automatically as the lowest level serializer. static SynopSerializer fldigiSerial ; init_patterns(); m_enabled = true ; } virtual ~synop_impl() {}; /// Called as a virtual. void init() { cleanup(); } void cleanup() { m_buf.clear(); m_current_word.clear(); m_chains.clear(); m_enabled = false ; } /// Adds a received character to the Synop decoding buffer. void add( char c) { if( ! m_enabled ) { cleanup(); m_enabled = true ; } static bool was_interleaved_before = false ; bool is_interleaved_now = synop::ptr_callback->interleaved(); // I if( is_interleaved_now ) { // Maybe has to display and flush the internal buffer. if( ! was_interleaved_before ) { // Of course it does not clears the current message. disp_range( m_buf.begin(), m_buf.begin() ); m_buf.clear(); } } was_interleaved_before = is_interleaved_now; bool noChains = m_chains.empty(); // No chance to terminate the current message, too many chars not parsed. if( noChains && ( m_buf.size() > 20 ) ) { m_current_message.MsgFlush(); } /// All delimiters are stored in the buffer, but the split loses them. if( ! is_interleaved_now ) { m_buf += c ; } else { std::string one_char( 1, c ); disp_range( one_char.begin(), one_char.end(), false ); } // Note that some chars are not part of Baudot (ITA2) charset and will never appear. switch(c) { case ';' : // Our RTTY decoder uses this for '='. c = '=' ; // TODO: Might as well remove '=' from all regular expressions. case '=' : case ' ' : case '\t' : // TODO: Frequently (But not always, this marks a section end). case '\n' : case '\r' : if( ! m_current_word.empty() ) { size_t nbInserts = 0 ; // The same list can appear in several chains, this is intended. if( noChains ) { nbInserts = AddTokInit(); } else { nbInserts = AddOtherTok(); } if( c == '=' ) { // -1, no display of '=', whose length is one. decode_then_flush(-1); } else if( nbInserts == 0 ) { if( noChains ) { /// There was no chains before. decode_then_flush(); } else { // If there was no insertion, because // the new word did not match any existing chain. // Then we will retry with this word // and update the buffer too. decode_then_flush( m_current_word.size() + 1 ); // If cannot match anything at first stage, // then no need to keep the buffer. if( 0 == AddTokInit() ) { decode_then_flush(); } // Otherwise we have started a new chain. } } m_current_word.clear(); } break ; default : if( m_current_word.size() > 10 ) { decode_then_flush(); m_current_word.clear(); } else { m_current_word += c ; } break ; } } /// When Synop decoding is not needed. void flush(bool finish_decoding) { if( finish_decoding ) { decode_then_flush(); flush(false); } else { disp_range(m_buf.begin(), m_buf.end() ); m_current_message.MsgFlush(); cleanup(); } } bool enabled(void) const { return m_enabled; } }; synop * synop::instance() { /// The destructor should not do any harm because we have no control on when it is called. static synop_impl g_synop ; return &g_synop ; }; /// Prints the number of times each regular expression is used, so the unused ones can be removed. void synop::regex_usage(void) { for( size_t idxGrp = 0; idxGrp < arrSynopGroups.size(); ++idxGrp ) { const synop_group * ptrSynopGroup = &arrSynopGroups[idxGrp]; if( ptrSynopGroup-> m_usage_counter > 0 ) continue ; std::cout << "DEBUG:" << "Unused:" << " idxGrp=" << idxGrp << ' ' << *ptrSynopGroup << '\n' ; } } /// This helps in debug mode: Only the regex name is displayed. bool synop::m_test_mode = false ; const synop_callback * synop::ptr_callback ; /* Useful links about decoding: http://www.kmlvalidator.com/home.htm http://www.ndbc.noaa.gov/station_page.php?station=MBLA1 http://www.ncdc.noaa.gov/homr/ http://www.ncdc.noaa.gov/oa/climate/surfaceinventories.html http://www.nodc.noaa.gov/BUOY/ http://www.nodc.noaa.gov/BUOY/all_buoy_info_latlon.txt http://www.sailwx.info/shiptrack/researchships.phtml http://www.meteo2.shom.fr/qctools/last-report-list_surfmar.htm http://weather.noaa.gov/pub/logs/shipstats/shipstat.out.201206301330.csv http://www.wmo.int/pages/prog/amp/mmop/buoy-ids.html http://www.aoml.noaa.gov/hrd/format/tempdrop_format.html http://www.ominous-valve.com/wx_codes.txt http://www.vos.noaa.gov/ObsHB-508/ObservingHandbook1_2010_508_compliant.pdf http://www.nws.noaa.gov/tg/head.html http://weather.unisys.com/noaaport/text_summary.php http://www.wmo.int/pages/prog/www/ois/Operational_Information/VolumeC1/CCCC_en.html // http://www.wmo.int/pages/prog%2Fwww/WMOCodes/Manual/Volume-I-selection/Sel2.pdf Other information: See Klingenfuss Thunder (corresponding in the SYNOP weather code to group 7, WW=17). */ fldigi-4.1.06/src/synop-src/synop_tool.cxx0000644000175000017500000015212613472115773015457 00000000000000// ---------------------------------------------------------------------------- // synop.cxx -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "synop.h" #include "kmlserver.h" #include "field_def.h" #define G_N_ELEMENTS(arr) sizeof(arr)/sizeof(*arr) // ---------------------------------------------------------------------------- static std::ostream * dbg_strm = &std::cout ; struct tst_callback : public synop_callback { // Callback for writing decoded synop messages. void print(const char * str, size_t nb, bool bold ) const { dbg_strm->write( str, nb ); } bool log_adif(void) const { return true ;} bool log_kml(void) const { return true ;} }; // ---------------------------------------------------------------------------- static void test_coordinates() { CoordinateT::Pair jn45op( "JN45op" ); if( (int)( jn45op.longitude().angle() * 100 ) != 920 ) { std::cout << "Bad longitude\n" ; exit(EXIT_FAILURE); } if( (int)( jn45op.latitude().angle() * 100 ) != 4564 ) { std::cout << "Bad latitude\n" ; exit(EXIT_FAILURE); } std::cout << "Coordinates OK\n"; } // ---------------------------------------------------------------------------- static const struct { int m_wmo_indicator ; const char * m_name ; } wmo_tests[] = { { 62722, "Aroma" }, { 95613, "Pemberton" }, { 41939, "Madaripur" }, { 71121, "Edmonton Namao Alta." } }; static const size_t wmo_tests_nb = G_N_ELEMENTS(wmo_tests); static void test_wmo(void) try { for( size_t i = 0; i < wmo_tests_nb; ++i ) { const std::string & wmo_name = SynopDB::IndicatorToName( wmo_tests[i].m_wmo_indicator ); std::cout << "wmo_name=" << wmo_name << "\n"; std::cout << SynopDB::IndicatorToCoordinates( wmo_tests[i].m_wmo_indicator ) << "\n"; if( wmo_name != wmo_tests[i].m_name ) { std::cout << wmo_name << '\n'; std::cout << wmo_tests[i].m_name << '\n'; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << wmo_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing wmo loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_buoy_id ; const char * m_name ; } buoy_tests[] = { { "44022", "Execution Rocks" }, { "kcmb", "East Cameron 47JP (Apache Corp)" } }; static const size_t buoy_tests_nb = G_N_ELEMENTS(buoy_tests); static void test_buoy(void) try { for( size_t i = 0; i < buoy_tests_nb; ++i ) { const std::string & buoy_name = SynopDB::BuoyToName( buoy_tests[i].m_buoy_id ); std::cout << "buoy_name=" << buoy_name << "\n"; if( buoy_name != buoy_tests[i].m_name ) { std::cout << buoy_name << '\n'; std::cout << buoy_tests[i].m_name << '\n'; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << buoy_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing buoy loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_ship_callsign ; const char * m_name ; } ship_tests[] = { { "3EPD8", "Trinity Arrow" }, { "WYP8657", "James R. Barker" } }; static const size_t ship_tests_nb = G_N_ELEMENTS(ship_tests); static void test_ship(void) try { for( size_t i = 0; i < ship_tests_nb; ++i ) { const std::string & ship_name = SynopDB::ShipToName( ship_tests[i].m_ship_callsign ); std::cout << "ship_name=" << ship_name << "\n"; if( ship_name != ship_tests[i].m_name ) { std::cout << ship_tests[i].m_ship_callsign << ".\n"; std::cout << ship_name << ".\n"; std::cout << ship_tests[i].m_name << ".\n"; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << ship_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing ship loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_jcomm_callsign ; const char * m_name ; } jcomm_tests[] = { { "13002", "TAO21N23W" }, { "13590", "ARGOS:71125" } }; static const size_t jcomm_tests_nb = G_N_ELEMENTS(jcomm_tests); static void test_jcomm(void) try { for( size_t i = 0; i < jcomm_tests_nb; ++i ) { const std::string & jcomm_name = SynopDB::JCommToName( jcomm_tests[i].m_jcomm_callsign ); std::cout << "jcomm_name=" << jcomm_name << "\n"; if( jcomm_name != jcomm_tests[i].m_name ) { std::cout << jcomm_tests[i].m_jcomm_callsign << ".\n"; std::cout << jcomm_name << ".\n"; std::cout << jcomm_tests[i].m_name << ".\n"; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << jcomm_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing jcomm loading\n"; return ; } // ---------------------------------------------------------------------------- // Used in a special mode where the synop decoder just prints output the name of the tokens. struct synop_test { int m_expected_nb_msgs ; const char * m_input ; const char * m_output ; }; static const synop_test tests_arr_full[] = { { 1, "08495 12575 72512 10171 20128 30242 40250 57005 60002 83502 91750\n" " 333 10182 81622 83633 87072=\n", "Day of the month: 11 Observation time: 18 hr\n" "Weather station: 08495 LXGB GIBRALTAR (CIV/MIL) GI\n" "Latitude: 3609N Longitude: 00521W Elevation: 5 m\n" "Cloud base: 600 - 999 m (2000 - 3333 ft).\n" "Horizontal visibility: 25 km.\n" "Total cloud cover: 7/8ths or more, but not 8/8ths.\n" "Wind direction: 250°.\n" "Wind speed: 12 knots, from anemometer.\n" "Air temperature: 17.1 °C.\n" "Dewpoint temperature: 12.8 °C.\n" "Sea level pressure: 1025.0 hPa.\n" "Pressure change over last 3 hours: -0.5 hPa, decreasing steadily.\n" "Present weather: not significant.\n" "Past weather: not significant.\n" "Low cloud type: stratocumulus other than stratocumulus cumulogenitus.\n" "Middle cloud type: no altocumulus, altostratus or nimbostratus.\n" "High cloud type: cirrus spissatus, or cirrus castellanus or cirrus floccus.\n" "Maximum temperature: 18.2 °C.\n" }, { 1, "16597 32562 33113 10139 20097 30053 40140 53022 81130 333 10170 81826\n" " 83357 91132 91531 =\n", "Day of the month: 11 Observation time: 18 hr\n" "Weather station: 16597 LMML LUQA/MALTA ML\n" "Latitude: 3551N Longitude: 01429E Elevation: 91 m\n" "Cloud base: 600 - 999 m (2000 - 3333 ft).\n" "Horizontal visibility: 12 km.\n" "Total cloud cover: 3/8ths.\n" "Wind direction: 310°.\n" "Wind speed: 13 knots, from anemometer.\n" "Air temperature: 13.9 °C.\n" "Dewpoint temperature: 9.7 °C.\n" "Sea level pressure: 1014.0 hPa.\n" "Pressure change over last 3 hours: 2.2 hPa, decreasing or steady, then increasing.\n" "Precipitation amount: 0.0 mm.\n" "Present weather: not significant.\n" "Past weather: not significant.\n" "Low cloud type: cumulus humulis or fractus (no vertical development).\n" "Middle cloud type: altocumulus translucidous at one level.\n" "High cloud type: no cirrus, cirrocumulus or cirrostratus.\n" "Maximum temperature: 17.0 °C.\n" } }; static const size_t nb_tests_full = G_N_ELEMENTS(tests_arr_full); /* * TODO: Put apart the tests with errors. Ideally we should generate them starting from good patterns. */ static const synop_test tests_arr[] = { { 0, "a b c d\n\ne f\n", "a b c d\n\ne f\n" }, { 0, "a b 20123 99536 e f\n20123 99536\ng h\n", "a b YYGGi+99LLL+ e f\nYYGGi+99LLL+\ng h\n" }, { 0, "20123\txyz 20123 30101\nx", "20123\txyz IIiii+YYGGi+\nx" }, { 1, "a b 20123 99536 70307 d e f\n", "a b YYGGi+99LLL+QLLLL+ d e f\n" }, { 0, "0393) 32375 71902 10140 20081 30101 40125 57007 878//\n", "0393) iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AMOUK36 20184 99556 70051 46/// ///// 10114 20068 40134 54001;\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" }, { 0, "81/1/ 222// 00156 2//// 3//// 4//// 5//// 6//// 80220 ICE /////;\n", "81/1/ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" }, { 1, "03075 15981 /1212 10086 20041 30090 40134 56007 60002 91750\n" "333 10099 82/68;\n\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+8NChh+\n\n" }, { 0, "333 69937 81/14 87/60;\n", "333+6RRRt+8NChh+8NChh+\n" }, { 0, "22273 ICE 52//2;\n", "222Dv+ICE+cSbDz+\n" }, { 1, "03204 12580 12505 10117 20064 30103 40123 57006 60002 81100 91750\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+9GGgg+\n" }, { 0, "333 21153 42021 70000 91105;\n", "333+2sTTT_min+4Esss+7RRRR+9SSss+\n" }, { 0, "333 21061 43094 70000 91102;\n", "333+2sTTT_min+4Esss+7RRRR+9SSss+\n" }, { 0, "10015 21014 30134 40152 52009 333 21006 91114;\n", "1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 1, "01102 46/// /1410 10058 20006 30069 40089 52006 333 20051 91116;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 0, "333 20085 91710;\n", "333+2sTTT_min+9SSss+\n" }, { 1, "SNCN19 CWAO 280023\n" "OOXX\n" "MRP43 27221 99181 70159 ///// 00101\n" "26/// /2504 10242 29081 30139 92200 333 60000=\n", "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 0, // Cannot find WMO station:72358 "ZCZC\n" "SM 190600\n" "AAXX 19064\n" "72358 14/// /1019 10244 29095 60071 7////\n" "333 10297 20236 3/025 55300 2//// 70082 91129 91219\n" "555 00245 1011/ 20255 91129 91219\n" "666 10245 20242 7////=\n" "NNNN\n", "ZCZC+\n" "SM 190600\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+7RRRR+9SSss+9SSss+\n" "555+0sTTT_land+1RRRr+2sTTT_avg+911ff+912ff+\n" "666+1snTxTxTx+2snTxTxTx+7VVVV+\n" "NNNN+\n" }, { 1, "04202 NIL;\n" "04203 46/// /1510 11048 21067 30142 40160 52006;\n", "IIiii+NIL+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "01482 46/// /0510 10059 20014 30021 40030 57005 333 20059 91115;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 1, "03091 15981 /1208 10090 20044 30053 40133 57007 60002 91750\n" "333 10107 55310 21294 8//99;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+553SS+2FFFF+8NChh+\n" }, { 1, "AAXX 15064\n\n" "06011 05584 50805 10064 20008 30136 40205 57012 6///2\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+\n" }, { 1, "AAXX 27064\n\n" "04018 42584 62909 10061 20035 40224 52020 86500 555 3//11 8662.04048 4211 QWOQU QPPYU WPPYE\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+ 555+3Ejjj+ 8662.04048 4211 QWOQU QPPYU WPPYE\n" }, { 1, "AAXX 26184\n\n" "04018 21245 82021 10080 20076 40173 58016 72052 886// 333 10107 20079 69918 555 3//22 88703;\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+ 555+3Ejjj+8NChh+\n" }, { 1, "06060 01675 60809 10191 20126 30053 40115895000 69902 72162 82172\n\n" " 333 10228 20130 69907 82840 85358;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+ 40115895000 6RRRt+7wwWW+8NCCC+\n\n" " 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+ 85358;\n" }, { 1, "06070 05970 50506 10163 20104 30096 40126 57003 6///2\n\n" " 333 10201 20122 6///7 85/67;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+\n\n" " 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+\n" }, { 2, "BSH03 20001 99540 10081 46/// ///// 22200 00067 20501 70003;\n\n" "BSH05 20001 99549 10082 46/// ///// 22200 20601 70003;\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+ 222Dv+0sTTT+2PPHH+70HHH+\n\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+ 222Dv+2PPHH+70HHH+\n" }, { 1, "13600 20123 99328 70293 46/// ///// 40331 52003\n" "222// 00200;\n", "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+4PPPP+5appp+\n" "222Dv+0sTTT+\n" }, { 1, "SMMJ01 LWOH 190000\n" "AAXX 1900\n" "13579 32998 03606 11106 21153 39397 40298 52004=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX 1900\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "SMML01 LMMM 190000\n" "AAXX 19004\n" "16597 32670 10403 10069 21015 30177 40268 52009 81500 333 81640 =\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+8NChh+ =\n" }, { 5, "SMOS01 LOWM 190000\n" "AAXX 19001\n" "11036 32565 73208 10000 21038 30065 40306 57008 8353/ 333 83629\n" "86360 91013 91113 91209=\n" "11010 35561 /2504 11031 21043 39946 40345 57009=\n" "11120 36/17 /9901 11111 21112 39620 40386 57005=\n" "11150 36429 /1802 11050 21055 39790 40363 57005=\n" "11240 36966 /1703 11031 21060 39870 40310 57004=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+8NChh+8NChh+9SSss+9SSss+9SSss+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "SNVD01 KWBC 190700\n" "BBXX\n" "S6IG 19071 99278 70923 41/9/ /2603 10193 20100 40160 50001 7////\n" "22234 04239=\n", "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" "222Dv+0sTTT+\n" }, { 1, "AAXX 23004 47411 15/84 /3603 10144 20114 30043 40074 50000 60012 333 20126=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+ 333+2sTTT_min+\n" }, { 1, "AAXX 22184 47409 11/50 80501 10090 20086 30023 40076 57002 69951 78085 887//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" }, { 1, "SMDL40 EDZW 201800\n" "AAXX 20181\n" "10004 46/60 /0408 10124 20107 30077 40077 57015\n" "222// 00103\n" "333 10141 20106 55304;\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "222Dv+0sTTT+\n" "333+1sTTT_max+2sTTT_min+553SS+\n" }, { 1, "10147 12882 50605 10213 20111 30048 40065 58008 69902 81031\n" "333 10265 20152 30017 55304 20454 30310 41284 81358 84076;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+4FFFF+8NChh+8NChh+\n" }, { 1, "10200 07961 20503 10204 20155 30065 40063 55009 69932 70060\n" "333 10215 20130 3/012 553// 2//// 3//// 69907 82/60;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+6RRRt+8NChh+\n" }, { 1, "03302 15973 /0106 10133 20069 30105 40117 57002 60002 91750\n" "333 10143 55310 21364 8//99;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+553SS+2FFFF+8NChh+\n" // "333+1sTTT_max+55jjj+jjjjj+8NChh+\n" }, { 0, "333 10188 91107;\n", "333+1sTTT_max+9SSss+\n" }, { 1, "AAXX 23061 15108 02298 62702 10135 20135 38165 48563 53002 60022 86500 333 10151 20131 30/// 60007 70022 95080 444 86154=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+6RRRt+7RRRR+9SSss+ 444+NCHHC+\n" }, { 1, "AAXX 23051 15346 22997 03601 10237 20171 39879 40154 52011 333 60005 91002 91102 95090=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+6RRRt+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23034 47090 32665 61407 10231 20206 30062 40083 57008 82501=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 23004 47155 32962 60903 10241 20175 30051 40093 57004 80001 333 20194 30034=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+2sTTT_min+3Ejjj+\n" }, { 1, "AAXX 22124 47090 12668 60000 10200 20189 30080 40101 51003 69912 86500 333 10227 31020 92020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+3Ejjj+9SSss+\n" }, { 1, "AAXX 22124 47104 11650 62902 10193 20174 30008 40099 53003 69952 71022 85500 333 10247 30020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+3Ejjj+\n" }, { 1, "AAXX 23004 47127 329// /0001 10248 20175 39959 40090 57009 333 20189 3/028=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+3Ejjj+\n" }, { 1, "AAXX 22181 26029 27/70 /0704 10155 20073 30150 40178 57008 70000 333 10167 20133 60007 91109 555 20133 50142= \n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+1sTTT_max+2sTTT_min+6RRRt+9SSss+ 555+2sTTT_avg+5jjjj+ \n" }, { 1, "AAXX 22151 26045 27/81 00505 10187 20068 30193 40195 56008 70000 80/// 333 10190 20104 60007 80/// 555 1/036 20104 3/010 50134=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+\n" }, { 1, "AAXX 22181 26058 27/84 00505 10176 20076 30175 40182 58007 70000 80/// 333 10199 20158 60007 80/// 91109 555 1/018 20158 3/018 50162 52018=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+5jjjj+\n" }, { 1, "AAXX 22124 47407 11/60 82904 10150 20130 39900 40065 53006 69902 72582 886// 333 10188=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 23034 08055 NIL=\n", "AAXX+YYGGi+ IIiii+NIL+\n" }, { 1, "AAXX 23074 08045 46/// /2102 10139 20110 39933 40241 53003 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 555+6GGmm+\n" }, { 1, "AAXX 22184 08042 02680 23609 10161 20084 39815 40246 53003 60002 81508 333 10183 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+6RRRt+\n" }, { 1, "AAXX 22184 08140 12970 33006 10260 21017 39231 48564 55001 60002 80001 333 10269=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22124 08085 02580 23210 10221 20100 39696 40213 57005 60001 81101 333 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+6RRRt+\n" }, { 1, "AAXX 22124 08130 12970 00406 10220 20070 39462 40213 58005 60001 333 50620=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+ 333+5jjjj+\n" }, { 1, "AAXX 23064 08141 12960 23504 10106 20077 39383 40240 52007 60002 80008 333 20103 30009 55141 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08160 12970 52812 10163 20102 39928 40232 53004 60002 80008 333 20157 55138 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08184 02980 20000 10204 20125 30068 40219 5//// 60002 80001 333 20152 3/015 55087 60007 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+55jjj+jjjjj+7RRRR+\n" }, { 1, "AAXX 22124 08202 02970 11104 10243 20044 39301 42842 58006 60001 80001 333 50880 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+5jjjj+6RRRt+\n" }, { 1, "AAXX 22154 07330 22680 32612 10198 20110 30165 40237 52003 83100 333 60007 83840 90710 91121 93100 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+6RRRt+8NChh+9SSss+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 23064 70174 32766 60000 10206 20044 39892 40131 56007 90553 333 10217 20067 555 92306=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+9GGgg+ 333+1sTTT_max+2sTTT_min+ 555+9SSss+\n" }, { 0, // Cannot find WMO station:91320 "AAXX 22124 91320 32474 80808 10283 20261 30122 40127 83101 333 562/9 58007 83815 85073 555 92212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+5jjjj+8NChh+8NChh+ 555+9SSss+\n" }, { 1, "AAXX 22214 47409 41/50 80102 10094 20091 30030 40083 51007 72588 887//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+\n" }, { 1, "AAXX 22184 08015 12560 80204 10146 20100 39854 40255 54000 60002 8277/ 333 10178=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22181 26124 01/84 10504 10188 20047 30140 40169 57002 60002 70200 80008 333 10227 20178 60007 80/// 91110 555 1/023 20178 3/022 50160 52020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+5jjjj+\n" }, { 1, "AAXX 22091 26231 21/81 00605 10206 20078 30173 40187 57007 70200 333 10211 20060 60007 80/// 91008 91108 555 1/049 20060 3/005 50160= \n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+ \n" }, { 1, "AAXX 22154 64500 42460 42006 10275 20211 30108 40120 84500 333 58008 83611 84630=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+8NChh+\n" }, { 1, "AAXX 22184 64550 32458 8//// 10248 20231 30//0 40//0 885// 333 10274 5//// 84610 88623=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+1sTTT_max+5jjjj+8NChh+8NChh+\n" }, { 1, "AAXX 22094 64550 42460 8//// 10250 20234 30//0 40//0 888// 333 5//// 84813 88626 94939 95839=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 22134 61901 41580 71116 10189 20127 39699 40205 72582 878// 91250 333 58003 81822 87635 91026 90710 91133=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+7wwWW+8NCCC+9GGgg+ 333+5jjjj+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 27064 65222 11458 70000 10237 20234 3//// 4//// 60092 76066 86538 333 20233 5//// 86610=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+6RRRt+7wwWW+8NCCC+ 333+2sTTT_min+5jjjj+8NChh+\n" }, { 0, // Cannot find WMO station:65213 "AAXX 27094 65213 42460 72004 10265 20236 3//// 4//// 875// 333 5//// 87612=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+\n" }, { 1, "AAXX 27094 91582 24570 /0810 10227 20178 30135 40170 50009 700// 333 69907 90710 91120 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+6RRRt+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 27094 62318 32560 43110 10300 20231 40104 54000 84800=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 22154 08015 41558 80306 10148 20094 39854 40255 52003 70522 8271/=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+\n" }, { 1, "AAXX 23064 08015 11550 52802 10122 20113 39848 40252 54000 60002 71022 82806 333 20118 30010 50144 55016 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+\n" }, { 1, "AAXX 22154 08001 42475 13207 10183 20109 30168 40248 55000 81541=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 22124 72654 15966 60000 10167 20150 39718 40175 53006 69931 91155 333 10278 20139 70003 555 92212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+ 333+1sTTT_max+2sTTT_min+7RRRR+ 555+9SSss+\n" }, { 1, "AAXX 22181 15015 02598 53502 10239 20169 39573 42804 52009 60002 84301 333 10269 20226 30042 60007 91003 91105=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+\n" }, { 1, "AAXX 22184 08213 12770 23108 10273 21007 39056 48560 53001 60002 81041 333 10293=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22184 08215 12870 12210 10201 21023 38179 48556 53002 60002 80005 333 10230 95000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+9SSss+\n" }, { 1, "AAXX 23064 08231 12967 12401 10161 20130 39150 48569 53005 60002 80001 333 20161 30016 50904 55109 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08284 02470 12802 10216 20159 30154 40227 53013 60002 81600 333 20195 30019 50484 55082 60007 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+7RRRR+\n" }, { 1, "AAXX 23061 10004 46/29 /2313 10143 20114 30153 40153 53011 222// 00140 333 10153 20137 55069 55308 91117 91214=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+55jjj+jjjjj+9SSss+9SSss+\n" }, { 1, "AAXX 23021 10004 46/60 /2213 10147 20124 30139 40139 53002 222// 00140 333 55300 91116 91213=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 22091 10004 46/58 /2011 10145 20113 30110 40110 51013 222// 00137 333 20133 55306 91117 91213=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+2sTTT_min+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 23061 10007 46/59 /2110 10138 20116 30158 40158 51008 222// 00130 333 10151 20133 55068 55300 91114 91211=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+55jjj+jjjjj+9SSss+9SSss+\n" }, { 1, "AAXX 22181 10007 46/57 /1903 10142 20113 30145 40145 51002 222// 00136 333 10147 20125 55301 91116 91212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 23081 10015 42560 72111 10145 20120 30162 40172 53010 81275 333 55307 21589 30922 81828 84366 85071 91113 91211=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 22151 10015 21580 52303 10156 20110 30138 40148 51008 72598 82972 333 55304 21373 30784 60017 82930 83075 91114 91211 96481=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23081 10022 47466 82109 10149 20125 30161 40170 53009 72365 333 55301 20826 30718 85/16 87/21 88/30 91113=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+9SSss+\n" }, { 1, "AAXX 22171 10022 45977 02105 10169 20109 30142 40151 50002 333 55307 21236 30490=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+553SS+2FFFF+3FFFF+\n" }, { 1, "AAXX 22081 10022 45571 52207 10161 20123 30116 40125 53018 333 55303 21177 30689 83/23 84/29 85/35=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+\n" }, { 1, "AAXX 23064 07005 02475 22307 10128 20105 30143 40233 53013 60002 82201 333 10163 20107 31010 55053 60007 70012 82816 90710 91113 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+55jjj+jjjjj+7RRRR+8NChh+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 27094 96315 41459 72207 10273 20236 40089 72582 83968 333 82816 81917 85277=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+7wwWW+8NCCC+ 333+8NChh+8NChh+8NChh+\n" }, { 1, "SNVD17 CWTO 261300 \n" "BBXX \n" "45142 26131 99427 70793 46/// /0006 10171 39936 40142 52008 \n" "22200 00202 10301 70003 333 91207 =\n", "TTAAii+CCCC+YYGGgg+ \n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+3PPPP+4PPPP+5appp+ \n" "222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ =\n" }, { 2, "SNVD22 KWNB 261300 RRR\n" "BBXX\n" "46232 26131 99325 71174 46/// ///// 1//// 91330 22200 00190 10703\n" "20703 320// 41201 70015=\n" "46247 26131 99378 71228 46/// ///// 1//// 91321 22200 00139 10802\n" "20802 322// 41301 70012=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" }, { 1, "641 \n" "SMVE01 KWBC 141800 RRA\n" "BBXX\n" "A8OK5 14183 99132 51250 41598 50816 10280 20229 40152 51014 70222\n" "83145 22214 04273 20302 316// 40504 5//// 80245=\n", "641 \n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+8aTTT+\n" }, { 1, "765 \n" "SMCA02 KWBC 141800\n" "AAXX 14184\n" "78255 42559 51603 10269 20148 39972 40136 52200 84502 333 10270\n" "20195 84620=\n" "78317 NIL=\n" "78318 NIL=\n", "765 \n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+1sTTT_max+2sTTT_min+8NChh+\n" "IIiii+NIL+\n" "IIiii+NIL+\n" }, { 2, "965 \n" "SMVD20 KWNB 141800\n" "BBXX\n" "44097 14181 99410 70711 46/// ///// 1//// 91731 22200 00040 11308\n" "21005 317// 41306 70042=\n" "572 \n" "SMJD50 OJAM 141800\n" "AAXX 14184\n" "40255 32960 00000 10252 20115 39382 40065 54002 333 10310=\n", "965 \n" "TTAAii+CCCC+YYGGgg+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" "572 \n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+1sTTT_max+\n" }, { 6, "SNVD01 KWBC 261300 RRK\n" "BBXX\n" "46036 26131 99484 71339 46/// /2103 10107 40103 57005 22200 00095\n" "11403 70013 333 91203=\n" "41024 26131 99338 70785 46/// /0510 10225 40094 53030 91300=\n" "44022 26131 99409 70737 46/// /3107 10178 20113 40067 91330 22200\n" "00199 333 91209 555 11072 22072=\n" "44140 26131 99429 70515 46/// ///// 1//// 4//// 5//// 22200 0////\n" "1//// 70/// 333 912//=\n" "PCHM 26134 99525 71298 41298 81617 10110 20100 40132 53001 7//22\n" "8/7// 22234 00120 20402 80105=\n" "PDAN 26134 99552 71314 41298 51909 10090 20045 40120 58020 7//11\n" "8/7// 22273 00080 2//// 30000 80070=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+9GGgg+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+9GGgg+ 222Dv+0sTTT+ 333+9SSss+ 555+110ff+220ff+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+8aTTT+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+8aTTT+\n" }, { 1, "AAXX 28091 11464 42470 53204 10168 20133 39196 42792 50005 83272\n" "333 83813 555 380//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+8NChh+ 555+3Ejjj+\n" }, { 1, "AAXX 28091 06490 45981 01408 10225 20146 39561 40097 58015\n" "333 91112 91209=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+9SSss+9SSss+\n" }, { 1, "AAXX 28091 06479 42970 41202 10257 20173 30028 40102 58016 83031\n" "333 83364 83072 91105 91203=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 28064 71048 16/// /2511 10119 20091 60001\n" "333 10209 20088 70347\n" "555 32948 40133=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 1, "AAXX 28094 71050 36/// /3003 10062 20031 39083 40136 58005\n" "333 60001=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+6RRRt+\n" }, { 1, "AAXX 28064 71079 11574 61403 10153 20131 39624 49887 58011 69981 78082 86100\n" "333 10278 20150 70104 90932\n" "555 10000 20000 31628 40231=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+1sTTT_max+2sTTT_min+7RRRR+9SSss+\n" "555+1VVff+2sTTT_avg+3Ejjj+4Esss+\n" }, { 0, // Cannot find WMO station:27020 "AAXX 28061 27020 32698 72202 10158 20127 39885 40026 52009 69950 87500\n" "333 20099 876//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+\n" "333+2sTTT_min+8NChh+\n" }, { 1, "AAXX 28064 71133 17/// /2613 10151 20104 39343 40026 51025 69921 7//4/\n" "333 10170 20115 70012\n" "555 32833 40212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 0, // Cannot find WMO station:71547 "AAXX 28064 71547 16/// /2513 10129 20046 60001\n" "333 10184 20098 70000\n" "555 32428 40022=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 3, "599 \n" "SNCN19 CWAO 141806\n" "OOXX\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10114 29029 30044 91610 333 60000=\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10114 29028 30044 91620 333 60000=\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10115 29028 30043 91630 333 60000=\n", "599 \n" "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 1, "SMVA13 LFPW 280000\n" "BBXX\n" "BAREU65 28004 99202 70180 46/// ///// 40137 52005\n" "22283=\n", "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+4PPPP+5appp+\n" "222Dv+\n" }, { 2, "SNCN19 CWAO 280016\n" "OOXX\n" "ARP01 27221 99345 50585 ///// 00311\n" "26/// /0000 10070 29040 30084 92220 333 60000=\n" "ARP01 27221 99345 50585 ///// 00311\n" "26/// /0000 10070 29041 30087 92230 333 60000=\n", "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 1, "AAXX 28091 11146 42/86 33201 10071 20018 37029 47148 53009 81202\n" "333 55310 818//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+553SS+8NChh+\n" }, { 1, "AAXX 28061 11406 01465 39901 10182 20150 39593 40153 52003 60002 703// 83101\n" "333 20135 30009 50254 60005 70000 83813\n" "555 382// 50176 60175 70179 80170 90150=\n", "\n" }, { 1, "AAXX 23001 15090 02997 23001 10250 20177 30067 40154 52013 60001 81041 333 55300 10173 20000 3//// 55131 01487 22929 30369 60007 91005 91106=\n", "\n" }, { 1, "391\n" "SNVF01 KWBC 190700\n" "BBXX\n" "9VBL 19071 99514 10028 41/9/ /3009 10076 20023 40319 57012 7////\n" "22263 04074=\n", "391\n" "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" "222Dv+0sTTT+\n" }, { 2, "439\n" "SNVD15 KWBC 190700\n" "BBXX\n" "41009 19071 99285 70802 46/// /2601 10205 40140 54000 90650 22200\n" "00251 10802 70011 333 91201 555 11007 22007=\n" "42002 19071 99259 70936 46/// /1602 10215 20136 40156 50000 90650\n" "22200 00244 10801 70007 333 91203 555 11021 22021 30602 41304\n" "60649 159018 136007 135016 139014 136023 132012=\n", "439\n" "TTAAii+CCCC+YYGGgg+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+9GGgg+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ 555+110ff+220ff+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+9GGgg+\n" "222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ 555+110ff+220ff+3GGmm+4ddff+6GGmm+dddfff+dddfff+dddfff+dddfff+dddfff+dddfff+\n" }, { 1, "AAXX 22191 15420 22997 03401 10225 20204 30015 40121 52010 333 55300 0//// 20030 3//// 60005 91001 91101 99706=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+55jjj+jjjjj+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23001 15420 02997 03201 10189 20176 30028 40135 52007 60001 333 55300 0//// 20000 3//// 55129 0//// 22868 3//// 60007 91002 91102=\n", "\n" }, { 0, // Cannot find WMO station:11244 "AAXX 28091 11244 36/// /1402 10268 20170 39835 40140 57007\n" "333 55310=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+553SS+\n" }, { 1, "AAXX 23001 10015 01465 72110 10144 20119 30144 40154 54000 60021 72586 878// 333 31/// 55/// 21817 30776 55300 20000 30000 69927 83816 86631 91115 91213 96481=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+3Ejjj+55jjj+jjjjj+3FFFF+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 22181 10022 07780 82204 10158 20112 30148 40157 53008 60022 76160 333 10187 20133 3/012 55302 20414 30270 69907 85/50 87/58 88/62=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+ 333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+8NChh+\n" }, { 5, "SMSQ10 LZIB 190000\n" "AAXX 19001\n" "11816 32565 63603 10006 21030 30124 40294 57006 83830\n" "333 55002 82820 86360=\n" "11826 35/64 /3304 10002 21020 30086 40294 57006\n" "333 55000=\n" "11903 32970 71501 11019 21044 39874 40271 58006 87070\n" "333 55047 87360=\n" "11934 11658 82710 11023 21050 39412 42834 56004 69911 77077 8452/\n" "333 55031 84646 88458=\n" "11968 11335 80000 11063 21070 39978 40276 58003 69901 77172 8652/\n" "333 55000 83708 85638 88461=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+55jjj+jjjjj+8NChh+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+55jjj+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+55jjj+jjjjj+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+55jjj+jjjjj+8NChh+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+55jjj+jjjjj+8NChh+8NChh+\n" }, { 7, "SMVF01 EGRR 261200 RRE\n" "BBXX\n" "62107 26124 99501 70061 46/// /2515 10139 20139 40207 52008 22200\n" "00137 10702 70008=\n" "AMOUK12 26124 99533 70062 46/// ///// 10183 20144 40164 57017=\n" "AMOUK06 26124 99534 10017 46/// ///// 10143 20113 40214 54003=\n" "AMOUK03 26124 99513 10032 46/// ///// 10198 20129 40227 52007=\n" "AMOUK34 26124 99513 10032 46/// ///// 10203 20108 4//// 52005=\n" "63106 26124 99610 10017 46/// /3309 10106 40167 51009 22200=\n" "63105 26124 99610 10017 47/98 /3310 10132 20048 40167 51008 700// 22200=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+\n" }, { 1, "AAXX 23044 61901 461// /1319 10151 20148 39710 40224 58010 90350 333 87/02 91028 90710 91128 555 7/097=\n", "\n" }, { 3, "628 \n" "SMVC01 KWBC 141800 RRA\n" "BBXX\n" "MZBN2 14183 99530 50772 41497 82328 10075 20040 40110 54000 70288\n" "887// 22233 00090 20201 323// 40808 5//// 80060=\n" "NWS0020 14184 99008 50903 43/// /1103 10270 20250 40103 5////\n" "7//// 8//// 222// 04276 2//// 3//// 4//// 5//// 6//// 8//// ICE ////=\n" "NWS0029 14184 99039 50376 43/// /0711 10254 20227 40116 5////\n" "7//// 8//// 222// 04295 2//// 3//// 4//// 5//// 6//// 8//// ICE\n" "////=\n", "628 \n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+8aTTT+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" }, { 1, "04018 42588 60507 10006 21025 40109 51002 81258 555 3//07 81830 83357 85363\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+ 555+3Ejjj+8NChh+8NChh+8NChh+\n" }, { 1, "ZCZC 412\n" "SIGL26 EKMI 252100\n" "AAXX 25214\n" "04418 46/// /1914 11150 21169 57011\n" " 333 553// 21328 ;\n" "04425 NIL ;\n" // "02 NIL ;\n" "04436 46/// /0107 11158 21202 ;\n" "04464 46/// /1610 11137 21171\n" " 333 553// 21530 ;\n" "04485 46/// /2503 11152 21175 37398 52006\n" " 333 553// 21624 ;\n" "04488 46/// /2810 11067 21094 37452 52013\n" " 333 553// 21310 ;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+5appp+\n" " 333+553SS+2FFFF+ ;\n" "NNNN+\n" }, { 1, "ZCZC 440\n" "SIGL26 EKMI 260300\n" "AAXX 26034\n" "04418 46/// /2615 11258 21285 57007\n" " 333 553// 20104 ;\n" "04425 NIL ;\n" "04432 NIL ;\n" "04436 NIL ;\n" "04464 46/// /1711 11236 21257 57128\n" " 333 553// 20011 ;\n" "04485 NIL ;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "IIiii+NIL+ ;\n" "IIiii+NIL+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "NNNN+\n" }, { 1, "ZCZC 506\n" "SMEN43 EDZW 261200 CCB\n" "AAXX 26121\n" "01001 11275 32514 10065 21022 30096 40108 57005 69911 70161 81641\n" " 222// 00004 333 91123;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+CCx+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" " 222Dv+0sTTT+ 333+9SSss+\n" "NNNN+\n" }, { 1,// Must check that one message only is created. "ZCZC 616\n" "SMVX41 EDZW 151800 RRC\n" "BBXX\n" "62119 05184\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+\n" }, { 1,// Must check that one message only is created. "ZCZC 619\n" "SMEN43 EDZW 15180 CCB\n" "AAXX 1518\n" "00271 17/82 0040 10870 20040 0116 4 16 57017 60002 700// 333\n" " 10180 91108;\n" "NNNN\n", "\n" }, { 1, "AAXX 22231 15420 22997 03200 10194 20178 30027 40134 52009 333 55300 0//// 20000 3//// 60005 91001 91102=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+55jjj+jjjjj+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+\n" }, { 1, "62144 20184 99534 10017 47297 /3612 10086 20080 40104#580\n", "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+ 40104#580\n" }, { 1, "63057 20004 99592 100-#110)6 10084 20028 49967 51002 700// 22200 10605 70024;\n\n" "63110 20004 99595 10015 47697 /1122 10080 20031 49979 50000 700// 22200 10504 70021;\n", "IIiii+YYGGi+99LLL+ 100-#110)6 1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+1PPHH+70HHH+\n\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+1PPHH+70HHH+\n" }, { 1, "DGEN 20004 99547 10078 41/96 22215 10085 20013 49950 54000 74100\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" } }; static const size_t nb_tests = G_N_ELEMENTS(tests_arr); // TODO: Test this command to detect unpublished messages: // egrep "No publish2" flsynop.log | more // ---------------------------------------------------------------------------- static void tstone( synop * ptr_synop, const synop_test * tst_arr, int tstnb ) { std::stringstream strm_tst ; dbg_strm = &strm_tst ; int nb_errors_parse = 0 ; int nb_errors_msg = 0 ; for(int i = 0; i < tstnb; ++i ) { strm_tst.str(std::string()); ptr_synop->cleanup(); KmlServer::GetInstance()->Reset(); for( const char * pc = tst_arr[i].m_input; *pc != '\0'; ++pc ) ptr_synop->add( *pc ); ptr_synop->flush(true); bool diff_parse = ( strm_tst.str() != tst_arr[i].m_output ); if(diff_parse) ++nb_errors_parse; bool diff_msg = ( KmlServer::GetInstance()->NbBroadcasts() != tst_arr[i].m_expected_nb_msgs ); if( diff_msg ) ++nb_errors_msg; if( diff_parse || diff_msg ) { std::cout << "Input [" << tst_arr[i].m_input << "]\n" ; } if( diff_parse ) { std::cout << "Expect [" << tst_arr[i].m_output << "]\n" ; std::cout << "Actual [" << strm_tst.str() << "]\n" ; } if( diff_msg ) { std::cout << "Expected messages :" << tst_arr[i].m_expected_nb_msgs << "\n" ; std::cout << "Actual :" << KmlServer::GetInstance()->NbBroadcasts() << "\n" ; } std::cout << "=============================================================\n"; } std::cout << "Nb tests=" << tstnb << " nb errors_parse=" << nb_errors_parse << " nb errors_msg=" << nb_errors_msg << '\n' ; } // ---------------------------------------------------------------------------- /* TODO: For testing detection on strings with errors, we will corrupt the existing strings, * and try to decode them with one or two insertions/deletions/changes. */ static void process_file( synop * ptr_synop, const char * namin ) { std::cout << "Processing:" << namin << "\n"; ptr_synop->cleanup(); std::ifstream filin( namin ); std::string namout = namin + std::string(".out"); std::ofstream filout( namout.c_str() ); dbg_strm = &filout ; char c; int nb = 0 ; while( filin.get(c) ) { ptr_synop->add( c ); ++nb ; } ptr_synop->flush(true); filin.close(); filout.close(); std::cout << "====== " << nb << " chars =======================================================\n"; } // ---------------------------------------------------------------------------- // // These stub definitions so we do not link with too much fldigi code. // static std::ofstream g_adif_file; QsoHelper::QsoHelper(int the_mode) : qso_rec( NULL ) { } QsoHelper::~QsoHelper() { g_adif_file << "========================================\n"; } void QsoHelper::Push( ADIF_FIELD_POS pos, const std::string & value ) { #define QSO_TITLE(n) case n : g_adif_file << #n ; break ; switch(pos) { QSO_TITLE(FREQ) QSO_TITLE(CALL) QSO_TITLE(MODE) QSO_TITLE(NAME) QSO_TITLE(QSO_DATE) QSO_TITLE(QSO_DATE_OFF) QSO_TITLE(TIME_OFF) QSO_TITLE(TIME_ON) QSO_TITLE(QTH) QSO_TITLE(RST_RCVD) QSO_TITLE(RST_SENT) QSO_TITLE(STATE) QSO_TITLE(VE_PROV) QSO_TITLE(NOTES) QSO_TITLE(QSLRDATE) QSO_TITLE(QSLSDATE) QSO_TITLE(GRIDSQUARE) QSO_TITLE(BAND) QSO_TITLE(CNTY) QSO_TITLE(COUNTRY) QSO_TITLE(CQZ) QSO_TITLE(DXCC) QSO_TITLE(IOTA) QSO_TITLE(ITUZ) QSO_TITLE(CONT) QSO_TITLE(MYXCHG) QSO_TITLE(XCHG1) QSO_TITLE(SRX) QSO_TITLE(STX) QSO_TITLE(TX_PWR) QSO_TITLE(EXPORT) default: g_adif_file << pos ; } g_adif_file << ":" << value << "\n"; #undef QSO_TITLE } // ---------------------------------------------------------------------------- // Test program: Text files containing synop samples are given on the command line. // Do we run a couple of internal self-test functions ? static bool internal_test = false ; static bool kml_balloon_as_matrix = false ; // If set, the output document, instead of having Synop messages, will get only // the regular expressions names. This helps for debugging and the output // is locale-independent. static bool regex_output_only = false ; // If set, at the end of the execution, prints all the regular expression // and the number of times each of them was used. static bool display_synop_usage = false ; // Where the CSV files for Synop decoding are loaded from. static std::string data_dir = "data/"; // Where the KML files are periodically written to. static std::string kml_dir = "kml/"; // Where the KML files are loaded from at startup. static std::string load_dir ; // Contains the output of all logged nformation. static std::string dbg_file = "FlSynop.log"; // This command must be executed each time KML files are saved to disk. static std::string exec_cmd = "echo Subprocess called; date"; static const char * g_adif_name = "adif.txt"; int main(int argC, char * argV[] ) try { int option_index = 0 ; opterr = 0; for(;;) { static const char shortopts[] = "b:k:l:d:utmrvwh"; static const struct option longopts[] = { { "data_dir", required_argument, 0, 'b' }, { "kml_dir", required_argument, 0, 'k' }, { "load_dir", required_argument, 0, 'l' }, { "dbg", required_argument, 0, 'd' }, { "usage", no_argument, 0, 'u' }, { "test", no_argument, 0, 't' }, { "matrix", no_argument, 0, 'm' }, { "regex", no_argument, 0, 'r' }, { "version", no_argument, 0, 'v' }, { "help", no_argument, 0, 'h' }, { NULL, 0, 0, 0 } }; int c = getopt_long(argC, (char * const *)argV, shortopts, longopts, &option_index); switch (c) { case -1: break; case 0: // handle options with non-0 flag here if (longopts[option_index].flag != 0) continue; printf ("option %s", longopts[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); continue; case 'b': data_dir = optarg; continue; case 'k': kml_dir = optarg; continue; case 'l': load_dir = optarg; continue; case 'd': dbg_file = optarg; continue; case 't': internal_test = true ; continue ; case 'm': kml_balloon_as_matrix = true; continue; case 'r': regex_output_only = true ; continue ; case 'u': display_synop_usage = true ; continue ; case 'v': std::cout << "version 1.0\n"; exit(EXIT_SUCCESS); case ':': default: std::cerr << "Unrecognized option\n"; exit(EXIT_FAILURE); case 'h': case '?': std::cout << "Valid options are:\n" ; for( size_t i = 0; longopts[i].name != NULL; ++i ) { std::cout << " " << longopts[i].name << "\n" ; } exit(EXIT_SUCCESS); } break; } g_adif_file.open( g_adif_name, std::ios_base::out ); /// Where the warning, informational and error messages are written. // debug::start(dbg_file.c_str()); /// Just for testing the loading. We load from one dir and save in another. if( ! load_dir.empty() ) { std::cout << "Loading from " << load_dir << "\n"; KmlServer::GetInstance()->InitParams( exec_cmd, load_dir ); } KmlServer::GetInstance()->InitParams( exec_cmd, kml_dir, 10000, 0, 120, kml_balloon_as_matrix ); if( ! load_dir.empty() ) { std::cout << "Loading tested: Destination=" << kml_dir << "\n"; exit(0); } // Must be done before any use of WMO stations data. // http://weather.noaa.gov/data/nsd_bbsss.txt std::cout << "Opening:" << data_dir << "\n"; if( ! SynopDB::Init(data_dir) ) { std::cerr << "Error opening:" << data_dir << ":" << strerror(errno) << "\n"; exit(EXIT_FAILURE); } // Serializer::SetSrl( & fldigiSerial ); if( internal_test ) { test_coordinates(); test_wmo(); test_buoy(); test_ship(); test_jcomm(); } synop::setup(); synop * ptr_synop = synop::instance(); if( internal_test ) { KmlServer::GetInstance()->Reset(); synop::SetTestMode(false); tstone( ptr_synop, tests_arr_full, nb_tests_full ); synop::SetTestMode(true); tstone( ptr_synop, tests_arr, nb_tests ); KmlServer::GetInstance()->Reset(); } synop::SetTestMode(regex_output_only); while (optind < argC) process_file( ptr_synop, argV[optind++] ); if( display_synop_usage ) { synop::regex_usage(); } KmlServer::Exit(); g_adif_file.close(); // std::cin.get(); return 0 ; } catch( const std::exception & exc ) { std::cout << "Exception:" << exc.what() << '\n'; exit(EXIT_FAILURE); } // ---------------------------------------------------------------------------- fldigi-4.1.06/src/synop-src/README0000644000175000017500000000051613472115773013401 00000000000000The "makefile" in this directory can be used to create a linux only command line tool 'synop_tool.' The make file is not named "Makefile" to avoid it being excluded by the automake distribution scripts. DO NOT rename this file. You can simply invoke "make" from within this directory and "make" will act upon the makefile script. fldigi-4.1.06/src/olivia/0000775000175000017500000000000013515625027012123 500000000000000fldigi-4.1.06/src/olivia/olivia.cxx0000664000175000017500000003057213507402064014054 00000000000000// ---------------------------------------------------------------------------- // olivia.cxx -- OLIVIA modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "olivia.h" #include "modem.h" #include "fl_digi.h" #include "misc.h" #include "confdialog.h" #include "status.h" #include "debug.h" #include "qrunner.h" //------------------------------------------------------------------------------ #include "threads.h" static pthread_mutex_t olivia_mutex = PTHREAD_MUTEX_INITIALIZER; //------------------------------------------------------------------------------ LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; double olivia::nco(double freq) { preamblephase += 2.0 * M_PI * freq / samplerate; if (preamblephase > M_PI) preamblephase -= 2.0 * M_PI; return cos(preamblephase); } void olivia::tx_init() { phaseacc = 0; prevsymbol = cmplx (1.0, 0.0); preamble = 32; shreg = 0; preamblesent = 0; postamblesent = 0; txbasefreq = get_txfreq_woffset(); rx_flush(); { // critical section guard_lock dsp_lock(&olivia_mutex); double fc_offset = Tx->Bandwidth*(1.0 - 0.5/Tx->Tones)/2.0; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + fc_offset)/500.0; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - fc_offset)/500.0; Tx->Reverse = 0; } Tx->Preset(); Tx->Start(); } // end critical section videoText(); escape = 0; } void olivia::rx_flush() { guard_lock dsp_lock(&olivia_mutex); unsigned char c; Rx->Flush(); while (Rx->GetChar(c) > 0) put_rx_char(c); } void olivia::send_tones() { if (!progdefaults.olivia_start_tones) return; double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; if (reverse) { freqa = tone_midfreq + (tone_bw / 2.0); freqb = tone_midfreq - (tone_bw / 2.0); } else { freqa = tone_midfreq - (tone_bw / 2.0); freqb = tone_midfreq + (tone_bw / 2.0); } preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[2*SR4 + i] = tonebuff[i] = 0.9 * nco(freqa) * ampshape[i]; preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = 0.9 * nco(freqb) * ampshape[i]; for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE) ModulateXmtr(&tonebuff[j], SCBLOCKSIZE); } void olivia::rx_init() { guard_lock dsp_lock(&olivia_mutex); Rx->Reset(); escape = 0; } int olivia::unescape(int c) { if (progdefaults.olivia8bit == 0) return c; if (escape) { escape = 0; return c + 128; } if (c == 127) { escape = 1; return -1; } return c; } int olivia::tx_process() { modem::tx_process(); int c = 0, len = 0; if ((mode == MODE_OLIVIA && (tones != progdefaults.oliviatones || bw != progdefaults.oliviabw)) || smargin != progdefaults.oliviasmargin || sinteg != progdefaults.oliviasinteg ) restart(); { // critical section guard_lock dsp_lock(&olivia_mutex); if (preamblesent != 1) { send_tones(); preamblesent = 1; // Olivia Transmitter class requires at least character Tx->PutChar(0); } // The encoder works with BitsPerSymbol length blocks. If the // modem already has that many characters buffered, don't try // to read any more. If stopflag is set, we will always read // whatever there is. if (stopflag || (Tx->GetReadReady() < Tx->BitsPerSymbol)) { if (!stopflag && (c = get_tx_char()) == GET_TX_CHAR_ETX) stopflag = true; if (stopflag) Tx->Stop(); else { if (c == GET_TX_CHAR_NODATA) c = 0; if (c > 127) { if (progdefaults.olivia8bit && c <= 255) { Tx->PutChar(127); Tx->PutChar(c & 127); } else { c = '.'; Tx->PutChar(c); } } else Tx->PutChar(c); } } if (c > 0) put_echo_char(c); if ((len = Tx->Output(txfbuffer)) > 0) { for (int i = 0; i < len; i++) txfbuffer[i] *= 0.9; ModulateXmtr(txfbuffer, len); } if (stopflag && Tx->DoPostambleYet() == 1 && postamblesent != 1) { postamblesent = 1; send_tones(); } if (!Tx->Running()) { cwid(); stopflag = false; return -1; } } // end critical section return 0; } int olivia::rx_process(const double *buf, int len) { int c; unsigned char ch = 0; static double snr = 1e-3; static char msg1[20]; static char msg2[20]; double rxf_offset = 0; double rx_bw = 0; double rx_tones = 0; double rx_snr = 0; int fc_offset = 0; bool gotchar = false; if ((mode == MODE_OLIVIA && (tones != progdefaults.oliviatones || bw != progdefaults.oliviabw)) || smargin != progdefaults.oliviasmargin || sinteg != progdefaults.oliviasinteg ) restart(); { // critical section guard_lock dsp_lock(&olivia_mutex); fc_offset = Tx->Bandwidth*(1.0 - 0.5/Tx->Tones)/2.0; if ((lastfreq != frequency || Rx->Reverse) && !reverse) { Rx->FirstCarrierMultiplier = (frequency - fc_offset)/500.0; Rx->Reverse = 0; lastfreq = frequency; Rx->Preset(); } else if ((lastfreq != frequency || !Rx->Reverse) && reverse) { Rx->FirstCarrierMultiplier = (frequency + fc_offset)/500.0; Rx->Reverse = 1; lastfreq = frequency; Rx->Preset(); } Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->Process(buf, len); while (Rx->GetChar(ch) > 0) { if ((c = unescape(ch)) != -1 && c > 7) { put_rx_char(c); gotchar = true; } } rxf_offset = Rx->FrequencyOffset(); rx_bw = Rx->Bandwidth; rx_tones = Rx->Tones; rx_snr = Rx->SignalToNoiseRatio(); } // end critical section sp = 0; for (int i = frequency - fc_offset; i < frequency + fc_offset; i++) if (wf->Pwr(i) > sp) sp = wf->Pwr(i); np = wf->Pwr(static_cast(frequency + rx_bw/2 + 2*rx_bw/rx_tones)); if (np == 0) np = sp + 1e-8; sigpwr = decayavg( sigpwr, sp, 10); noisepwr = decayavg( noisepwr, np, 50); snr = CLAMP(sigpwr / noisepwr, 0.001, 100000); metric = clamp( 5.0 * (rx_snr - 3.0), 0, 100); display_metric(metric); if (gotchar) { snprintf(msg1, sizeof(msg1), "s/n: %4.1f dB", 10*log10(snr) - 20); put_Status1(msg1, 5, STATUS_CLEAR); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", rxf_offset); put_Status2(msg2, 5, STATUS_CLEAR); } return 0; } void olivia::restart() { if (mode == MODE_OLIVIA) { tones = progdefaults.oliviatones; bw = progdefaults.oliviabw; } smargin = progdefaults.oliviasmargin; sinteg = progdefaults.oliviasinteg; samplerate = 8000; bandwidth = 125 * (1 << bw); Tx->Tones = 2 * (1 << tones); Tx->Bandwidth = bandwidth; Tx->SampleRate = samplerate; Tx->OutputSampleRate = samplerate; txbasefreq = get_txfreq_woffset(); { // critical section guard_lock dsp_lock(&olivia_mutex); int fc_offset = Tx->Bandwidth * (1.0 - 0.5/Tx->Tones) / 2.0; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + fc_offset)/500.0; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - fc_offset)/500.0; Tx->Reverse = 0; } if (Tx->Preset() < 0) { LOG_ERROR("olivia: transmitter preset failed!"); return; } txbufferlen = Tx->MaxOutputLen; if (txfbuffer) delete [] txfbuffer; txfbuffer = new double[txbufferlen]; Rx->Tones = Tx->Tones; Rx->Bandwidth = bandwidth; Rx->SyncMargin = smargin; Rx->SyncIntegLen = sinteg; Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->SampleRate = samplerate; Rx->InputSampleRate = samplerate; fc_offset = Rx->Bandwidth * (1.0 - 0.5/Rx->Tones) / 2.0; if (reverse) { Rx->FirstCarrierMultiplier = (frequency + fc_offset)/500.0; Rx->Reverse = 1; } else { Rx->FirstCarrierMultiplier = (frequency - fc_offset)/500.0; Rx->Reverse = 0; } if (Rx->Preset() < 0) { LOG_ERROR("olivia: receiver preset failed!"); return; } fragmentsize = 1024; set_bandwidth(Tx->Bandwidth - Tx->Bandwidth / Tx->Tones); stringstream info; info << mode_info[mode].sname; put_MODEstatus("%s", info.str().c_str()); metric = 0; sigpwr = 1e-10; noisepwr = 1e-8; LOG_DEBUG("\nOlivia Rx parameters:\n%s", Rx->PrintParameters()); } // end critical section } void olivia::init() { restart(); modem::init(); set_scope_mode(Digiscope::BLANK); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } olivia::olivia(trx_mode omode) { mode = omode; cap |= CAP_REV; txfbuffer = 0; samplerate = 8000; switch (mode) { case MODE_OLIVIA_4_125: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 0; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_250: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 1; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_500: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_1000: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_2000: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_125: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 0; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_250: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 1; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_500: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_1000: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_2000: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_500: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_1000: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_2000: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_32_1000: progdefaults.oliviatones = tones = 4; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_32_2000: progdefaults.oliviatones = tones = 4; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_64_500: progdefaults.oliviatones = tones = 5; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_64_1000: progdefaults.oliviatones = tones = 5; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_64_2000: progdefaults.oliviatones = tones = 5; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA: default: tones = progdefaults.oliviatones; bw = progdefaults.oliviabw; REQ(set_olivia_tab_widgets); break; } Tx = new MFSK_Transmitter< double >; Rx = new MFSK_Receiver< double >; lastfreq = 0; for (int i = 0; i < SR4; i++) ampshape[i] = 1.0; for (int i = 0; i < SR4 / 8; i++) ampshape[i] = ampshape[SR4 - 1 - i] = 0.5 * (1.0 - cos(M_PI * i / (SR4/8))); for (int i = 0; i < TONE_DURATION; i++) tonebuff[i] = 0; tone_bw = -1; tone_midfreq = -1; } olivia::~olivia() { guard_lock dsp_lock(&olivia_mutex); if (Tx) delete Tx; if (Rx) delete Rx; if (txfbuffer) delete [] txfbuffer; } fldigi-4.1.06/src/psk/0000775000175000017500000000000013515625027011435 500000000000000fldigi-4.1.06/src/psk/viewpsk.cxx0000644000175000017500000004263513472115773013605 00000000000000// ---------------------------------------------------------------------------- // viewpsk.cxx // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // viewpsk is a multi channel psk decoder which allows the parallel processing // of the complete audio spectrum from 200 to 3500 Hz in equal 100 Hz // channels. Each channel is separately decoded and the decoded characters // passed to the user interface routines for presentation. The number of // channels can be up to and including 30. #include #include #include #include "fl_digi.h" #include "viewpsk.h" #include "pskeval.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "misc.h" #include "configuration.h" #include "Viewer.h" #include "qrunner.h" #include "status.h" #include "trx.h" extern waterfall *wf; //===================================================================== // Change the following for DCD low pass filter adjustment #define SQLCOEFF 0.01 //#define SQLDECAY 50 #define SQLDECAY 20 #define K 5 #define POLY1 0x17 #define POLY2 0x19 #define PSKR_K 7 #define PSKR_POLY1 0x6d #define PSKR_POLY2 0x4f //===================================================================== viewpsk::viewpsk(pskeval* eval, trx_mode pskmode) { for (int i = 0; i < MAXCHANNELS; i++) { channel[i].fir1 = (C_FIR_filter *)0; channel[i].fir2 = (C_FIR_filter *)0; channel[i].dec = (viterbi *)0; channel[i].dec2 = (viterbi *)0; channel[i].Rxinlv = (interleave *)0; channel[i].Rxinlv2 = (interleave *)0; } evalpsk = eval; viewmode = MODE_PREV; restart(pskmode); } viewpsk::~viewpsk() { for (int i = 0; i < MAXCHANNELS; i++) { if (channel[i].fir1) delete channel[i].fir1; if (channel[i].fir2) delete channel[i].fir2; if (channel[i].dec) delete channel[i].dec; if (channel[i].dec2) delete channel[i].dec2; if (channel[i].Rxinlv) delete channel[i].Rxinlv; if (channel[i].Rxinlv2) delete channel[i].Rxinlv2; } } void viewpsk::init() { nchannels = progdefaults.VIEWERchannels; lowfreq = progdefaults.LowFreqCutoff; for (int i = 0; i < MAXCHANNELS; i++) { channel[i].phaseacc = 0; channel[i].prevsymbol = cmplx (1.0, 0.0); channel[i].quality = cmplx (0.0, 0.0); if (_pskr) { // MFSK varicode instead of psk channel[i].shreg = 1; channel[i].shreg2 = 1; } else { channel[i].shreg = 0; channel[i].shreg2 = 0; } channel[i].dcdshreg = 0; channel[i].dcdshreg2 = 0; channel[i].dcd = false; channel[i].bitclk = 0; channel[i].freqerr = 0.0; channel[i].timeout = 0; channel[i].frequency = NULLFREQ; channel[i].reset = false; channel[i].acquire = 0; for (int j = 0; j < 16; j++) channel[i].syncbuf[j] = 0.0; } for (int i = 0; i < nchannels; i++) REQ(&viewclearchannel, i); evalpsk->clear(); reset_all = false; } void viewpsk::restart(trx_mode pskmode) { if (viewmode == pskmode) return; viewmode = pskmode; double fir1c[FIRLEN+1]; double fir2c[FIRLEN+1]; int idepth = 2; int isize = 2; _pskr = false; _qpsk = false; symbits = 1; switch (viewmode) { case MODE_PSK31: symbollen = 256; dcdbits = 32; break; case MODE_PSK63F: _pskr = true; case MODE_PSK63: symbollen = 128; dcdbits = 64; break; case MODE_PSK125R: _pskr = true; idepth = 40; // 2x2x40 interleaver case MODE_PSK125: symbollen = 64; dcdbits = 128; break; case MODE_PSK250R: _pskr = true; idepth = 80; // 2x2x80 interleaver case MODE_PSK250: symbollen = 32; dcdbits = 256; break; case MODE_PSK500R: _pskr = true; idepth = 160; // 2x2x160 interleaver case MODE_PSK500: symbollen = 16; dcdbits = 512; break; case MODE_QPSK31: symbollen = 256; _qpsk = true; symbits = 2; dcdbits = 32; break; case MODE_QPSK63: symbollen = 128; symbits = 2; _qpsk = true; dcdbits = 64; break; case MODE_QPSK125: symbollen = 64; symbits = 2; _qpsk = true; dcdbits = 128; break; case MODE_QPSK250: symbollen = 32; symbits = 2; _qpsk = true; dcdbits = 256; break; case MODE_QPSK500: symbollen = 16; symbits = 2; _qpsk = true; dcdbits = 512; break; default: // punt! mode not one of the above. symbollen = 512; dcdbits = 32; break; } raisedcosfilt(fir1c, FIRLEN); for (int i = 0; i <= FIRLEN; i++) fir2c[i] = pskcore_filter[i]; for (int i = 0; i < MAXCHANNELS; i++) { if (channel[i].fir1) delete channel[i].fir1; channel[i].fir1 = new C_FIR_filter(); channel[i].fir1->init(FIRLEN+1, symbollen / 16, fir1c, fir1c); if (channel[i].fir2) delete channel[i].fir2; channel[i].fir2 = new C_FIR_filter(); channel[i].fir2->init(FIRLEN+1, 1, fir2c, fir2c); if (_qpsk) { if (channel[i].dec) delete channel[i].dec; channel[i].dec = new viterbi(K, POLY1, POLY2); if (channel[i].dec2) delete channel[i].dec; channel[i].dec2 = 0; } else { if (channel[i].dec) delete channel[i].dec; channel[i].dec = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); channel[i].dec->setchunksize(4); if (channel[i].dec2) delete channel[i].dec; channel[i].dec2 = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); channel[i].dec2->setchunksize(4); } // 2x2x(20,40,80,160) channel[i].Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); // 2x2x(20,40,80,160) channel[i].Rxinlv2 = new interleave (isize, idepth, INTERLEAVE_REV); } bandwidth = VPSKSAMPLERATE / symbollen; init(); } //============================================================================= //========================= viewpsk receive routines ========================== //============================================================================= bool viewpsk::is_valid_char(int &c) { if (c == '\n' || c == '\r') { c = ' '; return true; } if (c <= 0) return false; if (c > 0x7F) return false; if (iscntrl(c & 0xFF)) return false; return true; } void viewpsk::rx_bit(int ch, int bit) { int c; channel[ch].shreg = (channel[ch].shreg << 1) | !!bit; if (_pskr) { // MFSK varicode instead of PSK Varicode if ((channel[ch].shreg & 7) == 1) { c = varidec(channel[ch].shreg >> 1); channel[ch].shreg = 1; // Voting at the character level if (channel[ch].fecmet >= channel[ch].fecmet2) { if (is_valid_char(c)) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, viewmode); } } } else { if ((channel[ch].shreg & 3) == 0) { c = psk_varicode_decode(channel[ch].shreg >> 2); channel[ch].shreg = 0; if (is_valid_char(c)) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, viewmode); } } } void viewpsk::rx_bit2(int ch, int bit) { int c; channel[ch].shreg2 = (channel[ch].shreg2 << 1) | !!bit; // MFSK varicode instead of PSK Varicode if ((channel[ch].shreg2 & 7) == 1) { c = varidec(channel[ch].shreg2 >> 1); // Voting at the character level if (channel[ch].fecmet < channel[ch].fecmet2) { if (is_valid_char(c)) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, viewmode); } channel[ch].shreg2 = 1; } } void viewpsk::rx_pskr(int ch, unsigned char symbol) { int met; unsigned char twosym[2]; unsigned char tempc; int c; // Accumulate the soft bits for the interleaver THEN submit to Viterbi // decoder in alternance so that each one is processed one bit later. // Only two possibilities for sync: current bit or previous one since // we encode with R = 1/2 and send encoded bits one after the other // through the interleaver. channel[ch].symbolpair[1] = channel[ch].symbolpair[0]; channel[ch].symbolpair[0] = symbol; if (channel[ch].rxbitstate == 0) { // process bit 1 // copy to avoid scrambling symbolpair for the next bit channel[ch].rxbitstate = 1; twosym[0] = channel[ch].symbolpair[0]; twosym[1] = channel[ch].symbolpair[1]; // De-interleave for Robust modes only if (viewmode != MODE_PSK63F) channel[ch].Rxinlv2->symbols(twosym); // pass de-interleaved bits pair to the decoder, reversed tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = channel[ch].dec2->decode(twosym, &met); if (c != -1) { // FEC only take metric measurement after backtrace // Will be used for voting between the two decoded streams channel[ch].fecmet2 = decayavg(channel[ch].fecmet2, met, 20); rx_bit2(ch, c & 0x08); rx_bit2(ch, c & 0x04); rx_bit2(ch, c & 0x02); rx_bit2(ch, c & 0x01); } } else { // process bit 0 // copy to avoid scrambling symbolpair for the next bit channel[ch].rxbitstate = 0; twosym[0] = channel[ch].symbolpair[0]; twosym[1] = channel[ch].symbolpair[1]; // De-interleave if (viewmode != MODE_PSK63F) channel[ch].Rxinlv->symbols(twosym); tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = channel[ch].dec->decode(twosym, &met); if (c != -1) { channel[ch].fecmet = decayavg(channel[ch].fecmet, met, 20); rx_bit(ch, c & 0x08); rx_bit(ch, c & 0x04); rx_bit(ch, c & 0x02); rx_bit(ch, c & 0x01); } } } void viewpsk::rx_qpsk(int ch, int bits) { unsigned char sym[2]; int c; if (!active_modem->get_reverse()) bits = (4 - bits) & 3; sym[0] = (bits & 1) ? 255 : 0; sym[1] = (bits & 2) ? 0 : 255; // top bit is flipped c = channel[ch].dec->decode(sym, NULL); if (c != -1) { rx_bit(ch, c & 0x80); rx_bit(ch, c & 0x40); rx_bit(ch, c & 0x20); rx_bit(ch, c & 0x10); rx_bit(ch, c & 0x08); rx_bit(ch, c & 0x04); rx_bit(ch, c & 0x02); rx_bit(ch, c & 0x01); } } void viewpsk::afc(int ch) { if (channel[ch].dcd == true || channel[ch].acquire) { double error; double lower_bound = (lowfreq + ch * 100) - bandwidth; if (lower_bound < bandwidth) lower_bound = bandwidth; double upper_bound = lowfreq + (ch+1)*100 + bandwidth; error = (channel[ch].phase - channel[ch].bits * M_PI / 2); if (error < M_PI / 2.0) error += 2 * M_PI; if (error > M_PI / 2.0) error -= 2 * M_PI; error *= (VPSKSAMPLERATE / (symbollen * 2 * M_PI))/16.0; channel[ch].frequency -= error; channel[ch].frequency = CLAMP(channel[ch].frequency, lower_bound, upper_bound); } if (channel[ch].acquire) channel[ch].acquire--; } void viewpsk::clearch(int n) { channel[n].reset = true; evalpsk->clear(); } void viewpsk::clear() { for (int i = 0; i < nchannels; i++) channel[i].reset = true; evalpsk->clear(); } inline void viewpsk::timeout_check() { for (int ch = 0; ch < nchannels; ch++) { if (channel[ch].timeout) channel[ch].timeout--; if (channel[ch].frequency == NULLFREQ) continue; if (channel[ch].reset || (!channel[ch].timeout && !channel[ch].acquire) || (ch && (fabs(channel[ch-1].frequency - channel[ch].frequency) < bandwidth))) { channel[ch].reset = false; channel[ch].dcd = 0; channel[ch].frequency = NULLFREQ; channel[ch].acquire = 0; REQ(&viewclearchannel, ch); REQ(&viewaddchr, ch, NULLFREQ, 0, viewmode); } } } void viewpsk::findsignals() { if (!evalpsk) return; double level = progStatus.VIEWER_psksquelch; int nomfreq = 0; int lfreq = 0; int hfreq = 0; int ftest; int f1, f2; timeout_check(); for (int i = 0; i < nchannels; i++) { nomfreq = lowfreq + 100 * i; lfreq = nomfreq - 20; hfreq = nomfreq + 120; // suppress detection outside of this range if (!channel[i].dcd && !channel[i].timeout) { if (!channel[i].acquire) { channel[i].frequency = NULLFREQ; f1 = nomfreq - 0.5 * bandwidth; if (f1 < 2 * bandwidth) f1 = 2 * bandwidth; f2 = f1 + 100; ftest = (f1 + f2) / 2; } else { if (channel[i].frequency < lfreq || channel[i].frequency >= hfreq) channel[i].frequency = nomfreq + 50; ftest = channel[i].frequency; f1 = ftest - bandwidth; f2 = ftest + bandwidth; if (f1 < 2 * bandwidth) { f1 = 2 * bandwidth; f2 = f1 + bandwidth; } } if (evalpsk->peak(ftest, f1, f2, level)) { if (ftest < lfreq || ftest >= hfreq) goto nexti; f1 = ftest - bandwidth; f2 = ftest + bandwidth; if (evalpsk->peak(ftest, f1, f2, level)) { if (ftest < lfreq || ftest >= hfreq) goto nexti; if (i && (channel[i-1].dcd || channel[i-1].acquire) && fabs(channel[i-1].frequency - ftest) < bandwidth) goto nexti; if ((i < nchannels - 1) && (channel[i+1].dcd || channel[i+1].acquire) && fabs(channel[i+1].frequency - ftest) < bandwidth) goto nexti; channel[i].frequency = ftest; channel[i].freqerr = 0.0; channel[i].metric = 0.0; if (!channel[i].acquire) channel[i].acquire = 2 * 8000 / 512; } } } nexti: ; } } void viewpsk::rx_symbol(int ch, cmplx symbol) { int n = 2; // psk unsigned char softbit = 128; double softangle; double softamp; double sigamp = norm(symbol); channel[ch].phase = arg ( conj(channel[ch].prevsymbol) * symbol ); channel[ch].prevsymbol = symbol; if (channel[ch].phase < 0) channel[ch].phase += 2 * M_PI; if (_qpsk) { n = 4; channel[ch].bits = ((int) (channel[ch].phase / M_PI_2 + 0.5)) & (n-1); } else { channel[ch].bits = (((int) (channel[ch].phase / M_PI + 0.5)) & (n-1)) << 1; // hard decode if needed // softbit = (bits & 2) ? 0 : 255; // reversed as we normally pass "!bits" when hard decoding // Soft decode section below channel[ch].averageamp = decayavg(channel[ch].averageamp, sigamp, SQLDECAY); if (sigamp > 0 && channel[ch].averageamp > 0) { softamp = clamp( channel[ch].averageamp / sigamp, 1.0, 1e6); } else { softamp = 1; // arbritary number (50% impact) } // Compute values between -128 and +127 for phase value only if (channel[ch].phase > M_PI) { softangle = (127 - (((2 * M_PI - channel[ch].phase) / M_PI) * (double) 255)); } else { softangle = (127 - ((channel[ch].phase / M_PI) * (double) 255)); } // Then apply impact of amplitude. Finally, re-centre on 127-128 // as the decoder needs values between 0-255 softbit = (unsigned char) ((softangle / (1 + softamp)) - 127); } channel[ch].dcdshreg <<= (symbits + 1); channel[ch].dcdshreg |= channel[ch].bits; switch (channel[ch].dcdshreg) { // bpsk DCD on case 0xAAAAAAAA: /* DCD on by preamble */ if (_pskr) break; if (!channel[ch].dcd) REQ(&viewaddchr, ch, (int)channel[ch].frequency, 0, viewmode); channel[ch].dcd = 1; channel[ch].quality = cmplx (1.0, 0.0); channel[ch].metric = 100; channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WFBLOCKSIZE; channel[ch].acquire = 0; break; // pskr DCD on case 0x0A0A0A0A: if (!_pskr) break; if (!channel[ch].dcd) REQ(&viewaddchr, ch, (int)channel[ch].frequency, 0, viewmode); channel[ch].dcd = 1; channel[ch].quality = cmplx (1.0, 0.0); channel[ch].metric = 100; channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WFBLOCKSIZE; channel[ch].acquire = 0; break; case 0: /* DCD off by postamble */ channel[ch].dcd = false; channel[ch].quality = cmplx (0.0, 0.0); channel[ch].metric = 0; channel[ch].acquire = 0; break; default: channel[ch].quality = cmplx ( decayavg(channel[ch].quality.real(), cos(n*channel[ch].phase), SQLDECAY), decayavg(channel[ch].quality.imag(), sin(n*channel[ch].phase), SQLDECAY)); channel[ch].metric = norm(channel[ch].quality); if (channel[ch].metric > (progStatus.VIEWER_psksquelch + 6.0)/26.0) { channel[ch].dcd = true; } else { channel[ch].dcd = false; } } if (channel[ch].dcd == true) { channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WFBLOCKSIZE; if (_qpsk) rx_qpsk(ch, channel[ch].bits); else if (_pskr) rx_pskr(ch, softbit); else rx_bit(ch, !channel[ch].bits); channel[ch].acquire = 0; } } int viewpsk::rx_process(const double *buf, int len) { double sum; double ampsum; int idx; cmplx z, z2; if (nchannels != progdefaults.VIEWERchannels || lowfreq != progdefaults.LowFreqCutoff) init(); // process all channels for (int ch = 0; ch < nchannels; ch++) { if (channel[ch].frequency == NULLFREQ) continue; for (int ptr = 0; ptr < len; ptr++) { // Mix with the internal NCO for each channel z = cmplx ( buf[ptr] * cos(channel[ch].phaseacc), buf[ptr] * sin(channel[ch].phaseacc) ); channel[ch].phaseacc += 2.0 * M_PI * channel[ch].frequency / VPSKSAMPLERATE; // filter & decimate if (channel[ch].fir1->run( z, z )) { channel[ch].fir2->run( z, z2 ); idx = (int) channel[ch].bitclk; sum = 0.0; ampsum = 0.0; channel[ch].syncbuf[idx] = 0.8 * channel[ch].syncbuf[idx] + 0.2 * abs(z2); double bitsteps = (symbollen >= 16 ? 16 : symbollen); int symsteps = (int) (bitsteps / 2); for (int i = 0; i < symsteps; i++) { sum += (channel[ch].syncbuf[i] - channel[ch].syncbuf[i+8]); ampsum += (channel[ch].syncbuf[i] + channel[ch].syncbuf[i+8]); } sum = (ampsum == 0 ? 0 : sum / ampsum); channel[ch].bitclk -= sum / 5.0; channel[ch].bitclk += 1; if (channel[ch].bitclk < 0) channel[ch].bitclk += bitsteps; if (channel[ch].bitclk >= bitsteps) { channel[ch].bitclk -= bitsteps; rx_symbol(ch, z2); afc(ch); } } } } findsignals(); return 0; } int viewpsk::get_freq(int n) { if (channel[n].dcd) return (int)channel[n].frequency; return NULLFREQ; } fldigi-4.1.06/src/psk/pskvaricode.cxx0000644000175000017500000002532613472115773014425 00000000000000// ---------------------------------------------------------------------------- // varicode.cxx -- PSK31 Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "pskvaricode.h" // PSK31 Varicode for encoding static const char *varicodetab1[] = { "1010101011", /* 0 - */ "1011011011", /* 1 - */ "1011101101", /* 2 - */ "1101110111", /* 3 - */ "1011101011", /* 4 - */ "1101011111", /* 5 - */ "1011101111", /* 6 - */ "1011111101", /* 7 - */ "1011111111", /* 8 - */ "11101111", /* 9 - */ "11101", /* 10 - */ "1101101111", /* 11 - */ "1011011101", /* 12 - */ "11111", /* 13 - */ "1101110101", /* 14 - */ "1110101011", /* 15 - */ "1011110111", /* 16 - */ "1011110101", /* 17 - */ "1110101101", /* 18 - */ "1110101111", /* 19 - */ "1101011011", /* 20 - */ "1101101011", /* 21 - */ "1101101101", /* 22 - */ "1101010111", /* 23 - */ "1101111011", /* 24 - */ "1101111101", /* 25 - */ "1110110111", /* 26 - */ "1101010101", /* 27 - */ "1101011101", /* 28 - */ "1110111011", /* 29 - */ "1011111011", /* 30 - */ "1101111111", /* 31 - */ "1", /* 32 - */ "111111111", /* 33 - ! */ "101011111", /* 34 - '"' */ "111110101", /* 35 - # */ "111011011", /* 36 - $ */ "1011010101", /* 37 - % */ "1010111011", /* 38 - & */ "101111111", /* 39 - ' */ "11111011", /* 40 - ( */ "11110111", /* 41 - ) */ "101101111", /* 42 - * */ "111011111", /* 43 - + */ "1110101", /* 44 - , */ "110101", /* 45 - - */ "1010111", /* 46 - . */ "110101111", /* 47 - / */ "10110111", /* 48 - 0 */ "10111101", /* 49 - 1 */ "11101101", /* 50 - 2 */ "11111111", /* 51 - 3 */ "101110111", /* 52 - 4 */ "101011011", /* 53 - 5 */ "101101011", /* 54 - 6 */ "110101101", /* 55 - 7 */ "110101011", /* 56 - 8 */ "110110111", /* 57 - 9 */ "11110101", /* 58 - : */ "110111101", /* 59 - ; */ "111101101", /* 60 - < */ "1010101", /* 61 - = */ "111010111", /* 62 - > */ "1010101111", /* 63 - ? */ "1010111101", /* 64 - @ */ "1111101", /* 65 - A */ "11101011", /* 66 - B */ "10101101", /* 67 - C */ "10110101", /* 68 - D */ "1110111", /* 69 - E */ "11011011", /* 70 - F */ "11111101", /* 71 - G */ "101010101", /* 72 - H */ "1111111", /* 73 - I */ "111111101", /* 74 - J */ "101111101", /* 75 - K */ "11010111", /* 76 - L */ "10111011", /* 77 - M */ "11011101", /* 78 - N */ "10101011", /* 79 - O */ "11010101", /* 80 - P */ "111011101", /* 81 - Q */ "10101111", /* 82 - R */ "1101111", /* 83 - S */ "1101101", /* 84 - T */ "101010111", /* 85 - U */ "110110101", /* 86 - V */ "101011101", /* 87 - W */ "101110101", /* 88 - X */ "101111011", /* 89 - Y */ "1010101101", /* 90 - Z */ "111110111", /* 91 - [ */ "111101111", /* 92 - \ */ "111111011", /* 93 - ] */ "1010111111", /* 94 - ^ */ "101101101", /* 95 - _ */ "1011011111", /* 96 - ` */ "1011", /* 97 - a */ "1011111", /* 98 - b */ "101111", /* 99 - c */ "101101", /* 100 - d */ "11", /* 101 - e */ "111101", /* 102 - f */ "1011011", /* 103 - g */ "101011", /* 104 - h */ "1101", /* 105 - i */ "111101011", /* 106 - j */ "10111111", /* 107 - k */ "11011", /* 108 - l */ "111011", /* 109 - m */ "1111", /* 110 - n */ "111", /* 111 - o */ "111111", /* 112 - p */ "110111111", /* 113 - q */ "10101", /* 114 - r */ "10111", /* 115 - s */ "101", /* 116 - t */ "110111", /* 117 - u */ "1111011", /* 118 - v */ "1101011", /* 119 - w */ "11011111", /* 120 - x */ "1011101", /* 121 - y */ "111010101", /* 122 - z */ "1010110111", /* 123 - { */ "110111011", /* 124 - | */ "1010110101", /* 125 - } */ "1011010111", /* 126 - ~ */ "1110110101", /* 127 - */ "1110111101", /* 128 - */ "1110111111", /* 129 - */ "1111010101", /* 130 - */ "1111010111", /* 131 - */ "1111011011", /* 132 - */ "1111011101", /* 133 - */ "1111011111", /* 134 - */ "1111101011", /* 135 - */ "1111101101", /* 136 - */ "1111101111", /* 137 - */ "1111110101", /* 138 - */ "1111110111", /* 139 - */ "1111111011", /* 140 - */ "1111111101", /* 141 - */ "1111111111", /* 142 - */ "10101010101", /* 143 - */ "10101010111", /* 144 - */ "10101011011", /* 145 - */ "10101011101", /* 146 - */ "10101011111", /* 147 - */ "10101101011", /* 148 - */ "10101101101", /* 149 - */ "10101101111", /* 150 - */ "10101110101", /* 151 - */ "10101110111", /* 152 - */ "10101111011", /* 153 - */ "10101111101", /* 154 - */ "10101111111", /* 155 - */ "10110101011", /* 156 - */ "10110101101", /* 157 - */ "10110101111", /* 158 - */ "10110110101", /* 159 - */ "10110110111", /* 160 -   */ "10110111011", /* 161 - ¡ */ "10110111101", /* 162 - ¢ */ "10110111111", /* 163 - £ */ "10111010101", /* 164 - ¤ */ "10111010111", /* 165 - ¥ */ "10111011011", /* 166 - ¦ */ "10111011101", /* 167 - § */ "10111011111", /* 168 - ¨ */ "10111101011", /* 169 - © */ "10111101101", /* 170 - ª */ "10111101111", /* 171 - « */ "10111110101", /* 172 - ¬ */ "10111110111", /* 173 - ­ */ "10111111011", /* 174 - ® */ "10111111101", /* 175 - ¯ */ "10111111111", /* 176 - ° */ "11010101011", /* 177 - ± */ "11010101101", /* 178 - ² */ "11010101111", /* 179 - ³ */ "11010110101", /* 180 - ´ */ "11010110111", /* 181 - µ */ "11010111011", /* 182 - ¶ */ "11010111101", /* 183 - · */ "11010111111", /* 184 - ¸ */ "11011010101", /* 185 - ¹ */ "11011010111", /* 186 - º */ "11011011011", /* 187 - » */ "11011011101", /* 188 - ¼ */ "11011011111", /* 189 - ½ */ "11011101011", /* 190 - ¾ */ "11011101101", /* 191 - ¿ */ "11011101111", /* 192 - À */ "11011110101", /* 193 - Á */ "11011110111", /* 194 -  */ "11011111011", /* 195 - à */ "11011111101", /* 196 - Ä */ "11011111111", /* 197 - Å */ "11101010101", /* 198 - Æ */ "11101010111", /* 199 - Ç */ "11101011011", /* 200 - È */ "11101011101", /* 201 - É */ "11101011111", /* 202 - Ê */ "11101101011", /* 203 - Ë */ "11101101101", /* 204 - Ì */ "11101101111", /* 205 - Í */ "11101110101", /* 206 - Î */ "11101110111", /* 207 - Ï */ "11101111011", /* 208 - Ð */ "11101111101", /* 209 - Ñ */ "11101111111", /* 210 - Ò */ "11110101011", /* 211 - Ó */ "11110101101", /* 212 - Ô */ "11110101111", /* 213 - Õ */ "11110110101", /* 214 - Ö */ "11110110111", /* 215 - × */ "11110111011", /* 216 - Ø */ "11110111101", /* 217 - Ù */ "11110111111", /* 218 - Ú */ "11111010101", /* 219 - Û */ "11111010111", /* 220 - Ü */ "11111011011", /* 221 - Ý */ "11111011101", /* 222 - Þ */ "11111011111", /* 223 - ß */ "11111101011", /* 224 - à */ "11111101101", /* 225 - á */ "11111101111", /* 226 - â */ "11111110101", /* 227 - ã */ "11111110111", /* 228 - ä */ "11111111011", /* 229 - å */ "11111111101", /* 230 - æ */ "11111111111", /* 231 - ç */ "101010101011", /* 232 - è */ "101010101101", /* 233 - é */ "101010101111", /* 234 - ê */ "101010110101", /* 235 - ë */ "101010110111", /* 236 - ì */ "101010111011", /* 237 - í */ "101010111101", /* 238 - î */ "101010111111", /* 239 - ï */ "101011010101", /* 240 - ð */ "101011010111", /* 241 - ñ */ "101011011011", /* 242 - ò */ "101011011101", /* 243 - ó */ "101011011111", /* 244 - ô */ "101011101011", /* 245 - õ */ "101011101101", /* 246 - ö */ "101011101111", /* 247 - ÷ */ "101011110101", /* 248 - ø */ "101011110111", /* 249 - ù */ "101011111011", /* 250 - ú */ "101011111101", /* 251 - û */ "101011111111", /* 252 - ü */ "101101010101", /* 253 - ý */ "101101010111", /* 254 - þ */ "101101011011" /* 255 - ÿ */ }; // The same in a format more suitable for decoding. static unsigned int varicodetab2[] = { 0x2AB, 0x2DB, 0x2ED, 0x377, 0x2EB, 0x35F, 0x2EF, 0x2FD, 0x2FF, 0x0EF, 0x01D, 0x36F, 0x2DD, 0x01F, 0x375, 0x3AB, 0x2F7, 0x2F5, 0x3AD, 0x3AF, 0x35B, 0x36B, 0x36D, 0x357, 0x37B, 0x37D, 0x3B7, 0x355, 0x35D, 0x3BB, 0x2FB, 0x37F, 0x001, 0x1FF, 0x15F, 0x1F5, 0x1DB, 0x2D5, 0x2BB, 0x17F, 0x0FB, 0x0F7, 0x16F, 0x1DF, 0x075, 0x035, 0x057, 0x1AF, 0x0B7, 0x0BD, 0x0ED, 0x0FF, 0x177, 0x15B, 0x16B, 0x1AD, 0x1AB, 0x1B7, 0x0F5, 0x1BD, 0x1ED, 0x055, 0x1D7, 0x2AF, 0x2BD, 0x07D, 0x0EB, 0x0AD, 0x0B5, 0x077, 0x0DB, 0x0FD, 0x155, 0x07F, 0x1FD, 0x17D, 0x0D7, 0x0BB, 0x0DD, 0x0AB, 0x0D5, 0x1DD, 0x0AF, 0x06F, 0x06D, 0x157, 0x1B5, 0x15D, 0x175, 0x17B, 0x2AD, 0x1F7, 0x1EF, 0x1FB, 0x2BF, 0x16D, 0x2DF, 0x00B, 0x05F, 0x02F, 0x02D, 0x003, 0x03D, 0x05B, 0x02B, 0x00D, 0x1EB, 0x0BF, 0x01B, 0x03B, 0x00F, 0x007, 0x03F, 0x1BF, 0x015, 0x017, 0x005, 0x037, 0x07B, 0x06B, 0x0DF, 0x05D, 0x1D5, 0x2B7, 0x1BB, 0x2B5, 0x2D7, 0x3B5, 0x3BD, 0x3BF, 0x3D5, 0x3D7, 0x3DB, 0x3DD, 0x3DF, 0x3EB, 0x3ED, 0x3EF, 0x3F5, 0x3F7, 0x3FB, 0x3FD, 0x3FF, 0x555, 0x557, 0x55B, 0x55D, 0x55F, 0x56B, 0x56D, 0x56F, 0x575, 0x577, 0x57B, 0x57D, 0x57F, 0x5AB, 0x5AD, 0x5AF, 0x5B5, 0x5B7, 0x5BB, 0x5BD, 0x5BF, 0x5D5, 0x5D7, 0x5DB, 0x5DD, 0x5DF, 0x5EB, 0x5ED, 0x5EF, 0x5F5, 0x5F7, 0x5FB, 0x5FD, 0x5FF, 0x6AB, 0x6AD, 0x6AF, 0x6B5, 0x6B7, 0x6BB, 0x6BD, 0x6BF, 0x6D5, 0x6D7, 0x6DB, 0x6DD, 0x6DF, 0x6EB, 0x6ED, 0x6EF, 0x6F5, 0x6F7, 0x6FB, 0x6FD, 0x6FF, 0x755, 0x757, 0x75B, 0x75D, 0x75F, 0x76B, 0x76D, 0x76F, 0x775, 0x777, 0x77B, 0x77D, 0x77F, 0x7AB, 0x7AD, 0x7AF, 0x7B5, 0x7B7, 0x7BB, 0x7BD, 0x7BF, 0x7D5, 0x7D7, 0x7DB, 0x7DD, 0x7DF, 0x7EB, 0x7ED, 0x7EF, 0x7F5, 0x7F7, 0x7FB, 0x7FD, 0x7FF, 0xAAB, 0xAAD, 0xAAF, 0xAB5, 0xAB7, 0xABB, 0xABD, 0xABF, 0xAD5, 0xAD7, 0xADB, 0xADD, 0xADF, 0xAEB, 0xAED, 0xAEF, 0xAF5, 0xAF7, 0xAFB, 0xAFD, 0xAFF, 0xB55, 0xB57, 0xB5B }; const char *psk_varicode_encode(unsigned char c) { return varicodetab1[c]; } int psk_varicode_decode(unsigned int symbol) { for (int i = 0; i < 256; i++) if (symbol == varicodetab2[i]) return i; return -1; } fldigi-4.1.06/src/psk/psk.cxx0000644000175000017500000016375613472115773012722 00000000000000// ---------------------------------------------------------------------------- // psk.cxx -- psk modem // // Copyright (C) 2006-2015 // Dave Freese, W1HKJ // Copyright (C) 2009-2010 // John Douyere, VK2ETA // Copyright (C) 2014-2018 // John Phelps, KL4YFD // Modified by Joe Counsil, K0OG - Flushlengths on 8PSKxF Modes // // PSK-FEC and PSK-R modes contributed by VK2ETA // // This file is part of fldigi. Adapted from code contained in gmfsk // source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "psk.h" #include "main.h" #include "fl_digi.h" #include "trx.h" #include "misc.h" #include "waterfall.h" #include "configuration.h" #include "status.h" #include "viewpsk.h" #include "pskeval.h" #include "modem.h" #include "Viewer.h" #include "macros.h" #include "confdialog.h" #include "test_signal.h" extern waterfall *wf; // Change the following for DCD low pass filter adjustment #define SQLCOEFF 0.01 #define SQLDECAY 50 //===================================================================== #define K 5 #define POLY1 0x17 #define POLY2 0x19 // PSK + FEC + INTERLEAVE // df=10 : correct up to 4 bits #define PSKR_K 7 #define PSKR_POLY1 0x6d #define PSKR_POLY2 0x4f // df=14 : correct up to 6 bits #define K11 11 #define K11_POLY1 03073 // 1595 #define K11_POLY2 02365 // 1269 // df=16 : correct up to 7 bits // Code has good ac(df) and bc(df) parameters for puncturing #define K13 13 #define K13_POLY1 016461 // 7473 #define K13_POLY2 012767 // 5623 // df=19 : correct up to 9 bits #define K16 16 #define K16_POLY1 0152711 // 54729 #define K16_POLY2 0126723 // 44499 // For Gray-mapped 8PSK: // Even when the received phase is distorted by +- 1 phase-position: // - One of the bits is still known with 100% certianty. // - Only up to 1 bit can be in error static cmplx graymapped_8psk_pos[] = { // Degrees Bits In Mapped Soft-Symbol cmplx (1.0, 0.0), // 0 | 0b000 | 025,000,025 cmplx (0.7071, 0.7071), // 45 | 0b001 | 000,025,230 cmplx (-0.7071, 0.7071), // 135 | 0b010 | 025,255,025 cmplx (0.0, 1.0), // 90 | 0b011 | 000,230,230 cmplx (0.7071, -0.7071), // 315 | 0b100 | 230,000,025 cmplx (0.0, -1.0), // 270 | 0b101 | 255,025,230 cmplx (-1.0, 0.0), // 180 | 0b110 | 230,255,025 cmplx (-0.7071, -0.7071) // 225 | 0b111 | 255,230,230 }; // Associated soft-symbols to be used with graymapped_8psk_pos[] constellation // These softbits have precalculated (a-priori) probabilities applied // Use of this table automatically Gray-decodes incoming symbols. static unsigned char graymapped_8psk_softbits[8][3] = { { 25, 0, 25}, // 0 { 0, 25, 230}, // 1 { 0, 230, 230}, // 3 { 25, 255, 25}, // 2 {230, 255, 25}, // 6 {255, 230, 230}, // 7 {255, 25, 230}, // 5 {230, 0, 25} // 4 }; char pskmsg[80]; void psk::tx_init() { for (int car = 0; car < numcarriers; car++) { phaseacc[car] = 0; prevsymbol[car] = cmplx (1.0, 0.0); } preamble = dcdbits; if (_pskr || _xpsk || _8psk || _16psk) { // MFSK based varicode instead of psk shreg = 1; shreg2 = 1; } else { shreg = 0; shreg2 = 0; } videoText(); // interleaver bitshreg = 0; symbols = 0; acc_symbols = 0; ovhd_symbols = 0; accumulated_bits = 0; if(_8psk && _puncturing) { enc->init(); Txinlv->flush(); } vphase = 0; maxamp = 0; } void psk::rx_init() { for (int car = 0; car < numcarriers; car++) { phaseacc[car] = 0; prevsymbol[car] = cmplx (1.0, 0.0); } quality = cmplx (0.0, 0.0); if (_pskr || _xpsk || _8psk || _16psk) { // MFSK varicode instead of psk shreg = 1; shreg2 = 1; } else { shreg = 0; shreg2 = 0; } dcdshreg = 0; dcdshreg2 = 0; dcd = 0; bitclk = 0; freqerr = 0.0; if (mailserver && progdefaults.PSKmailSweetSpot) sigsearch = SIGSEARCH; else sigsearch = 0; put_MODEstatus(mode); resetSN_IMD(); afcmetric = 0.0; // interleaver, split incoming bit stream into two, one late by one bit rxbitstate = 0; fecmet = fecmet2 = 0; if (Rxinlv) Rxinlv->flush(); if (Rxinlv2) Rxinlv2->flush(); for (int i = 0; i < NUM_FILTERS; i++) { re_Gbin[i]->reset(); im_Gbin[i]->reset(); } } bool psk::viewer_mode() { if (mode == MODE_PSK31 || mode == MODE_PSK63 || mode == MODE_PSK63F || mode == MODE_PSK125 || mode == MODE_PSK250 || mode == MODE_PSK500 || mode == MODE_PSK125R || mode == MODE_PSK250R || mode == MODE_PSK500R || mode == MODE_QPSK31 || mode == MODE_QPSK63 || mode == MODE_QPSK125 || mode == MODE_QPSK250 || mode == MODE_QPSK500 ) return true; return false; } void psk::restart() { if (viewer_mode()) pskviewer->restart(mode); evalpsk->setbw(sc_bw); } void psk::init() { restart(); modem::init(); set_scope_mode(Digiscope::PHASE); initSN_IMD(); snratio = 1.0; imdratio = 0.001; rx_init(); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } psk::~psk() { if (tx_shape) delete [] tx_shape; if (imd_shape) delete [] imd_shape; if (enc) delete enc; if (dec) delete dec; // FEC 2nd Viterbi decoder if (dec2) delete dec2; for (int i = 0; i < MAX_CARRIERS; i++) { if (fir1[i]) delete fir1[i]; if (fir2[i]) delete fir2[i]; } if (e0_filt) delete e0_filt; if (e1_filt) delete e1_filt; if (e2_filt) delete e2_filt; if (e3_filt) delete e3_filt; for (int i = 0; i < NUM_FILTERS; i++) { delete re_Gbin[i]; delete im_Gbin[i]; } if (pskviewer) delete pskviewer; if (evalpsk) delete evalpsk; // Interleaver if (Rxinlv) delete Rxinlv; if (Rxinlv2) delete Rxinlv2; if (Txinlv) delete Txinlv; if (vestigial_sfft) delete vestigial_sfft; } psk::psk(trx_mode pskmode) : modem() { enum FIR_TYPE {PSK_CORE, GMFSK, SINC}; FIR_TYPE fir_type = PSK_CORE; cap |= CAP_AFC | CAP_AFC_SR; mode = pskmode; // Set the defaults that are common to most modes samplerate = 8000; numcarriers = 1; separation = 1.4; _16psk = _8psk = _xpsk = _pskr = _qpsk = _disablefec = _puncturing = false; symbits = 1; flushlength = 0; int isize = 2; idepth = 2; PSKviterbi = false; vestigial = false; switch (mode) { case MODE_PSK31: symbollen = 256; dcdbits = 32; fir_type = PSK_CORE; break; case MODE_PSK63: symbollen = 128; dcdbits = 64; fir_type = PSK_CORE; break; case MODE_PSK125: symbollen = 64; dcdbits = 128; fir_type = SINC; break; case MODE_PSK250: symbollen = 32; dcdbits = 256; fir_type = SINC; break; case MODE_PSK500: symbollen = 16; dcdbits = 512; fir_type = SINC; break; case MODE_PSK1000: symbollen = 8; dcdbits = 128; fir_type = SINC; break; case MODE_QPSK31: symbollen = 256; _qpsk = true; dcdbits = 32; cap |= CAP_REV; fir_type = PSK_CORE; break; case MODE_QPSK63: symbollen = 128; _qpsk = true; dcdbits = 64; cap |= CAP_REV; fir_type = PSK_CORE; break; case MODE_QPSK125: symbollen = 64; _qpsk = true; dcdbits = 128; cap |= CAP_REV; fir_type = SINC; break; case MODE_QPSK250: symbollen = 32; _qpsk = true; dcdbits = 256; cap |= CAP_REV; fir_type = SINC; break; case MODE_QPSK500: symbollen = 16; _qpsk = true; dcdbits = 512; cap |= CAP_REV; fir_type = SINC; break; case MODE_PSK63F: // As per Multipsk (BPSK63 + FEC + MFSK Varicode) symbollen = 128; _pskr = true; dcdbits = 64; fir_type = PSK_CORE; break; // 8psk modes without FEC case MODE_8PSK125: // 125 baud | 375 bits/sec No FEC symbollen = 128; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 128; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK250: // 250 baud | 750 bits/sec No FEC symbollen = 64; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 256; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK500: // 500 baud | 1500 bits/sec No FEC symbollen = 32; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 512; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK1000: // 1000 baud | 3000 bits/sec No FEC symbollen = 16; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 1024; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; // 8psk modes with FEC case MODE_8PSK125FL: // 125 baud | 187 bits/sec @ 1/2 Rate K=13 FEC symbollen = 128; idepth = 384; // 2048 milliseconds flushlength = 55; samplerate = 16000; _8psk = true; dcdbits = 128; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK250FL: // 250 baud | 375 bits/sec @ 1/2 Rate K=13 FEC symbollen = 64; idepth = 512; // 1365 milliseconds flushlength = 65; samplerate = 16000; _8psk = true; dcdbits = 256; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK125F: // 125 baud | 187 bits/sec @ 1/2 Rate K=16 FEC symbollen = 128; idepth = 384; // 2048 milliseconds flushlength = 55; samplerate = 16000; _8psk = true; dcdbits = 128; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK250F: // 250 baud | 375 bits/sec @ 1/2 Rate K=16 FEC symbollen = 64; idepth = 512; // 1365 milliseconds flushlength = 65; samplerate = 16000; _8psk = true; dcdbits = 256; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK500F: // 500 baud | 1000 bits/sec @ 2/3 rate K=13 FEC symbollen = 32; idepth = 640; // 426 milliseconds flushlength = 80; samplerate = 16000; _8psk = true; _puncturing = true; dcdbits = 512; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK1000F: // 1000 baud | 2000 bits/sec @ 2/3 rate K=7 FEC symbollen = 16; idepth = 512; // 170 milliseconds flushlength = 120; samplerate = 16000; _8psk = true; dcdbits = 1024; cap |= CAP_REV; _puncturing = true; vestigial = true; PSKviterbi = true; fir_type = SINC; break; case MODE_8PSK1200F: // 1200 baud | 2400 bits/sec @ 2/3 rate K=7 FEC symbollen = 13; idepth = 512; // 142 milliseconds flushlength = 175; samplerate = 16000; _8psk = true; _puncturing = true; dcdbits = 2048; cap |= CAP_REV; vestigial = true; PSKviterbi = true; fir_type = SINC; break; // end 8psk modes case MODE_PSK125R: symbollen = 64; _pskr = true; dcdbits = 128; idepth = 40; // 2x2x40 interleaver fir_type = SINC; break; case MODE_PSK250R: symbollen = 32; _pskr = true; dcdbits = 256; idepth = 80; // 2x2x80 interleaver fir_type = SINC; break; case MODE_PSK500R: symbollen = 16; _pskr = true; dcdbits = 512; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_PSK1000R: symbollen = 8; _pskr = true; dcdbits = 512; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; // multi-carrier modems case MODE_4X_PSK63R: symbollen = 128;//PSK63 dcdbits = 128; _pskr = true;//PSKR numcarriers = 4; idepth = 80; // 2x2x80 interleaver fir_type = SINC; break; case MODE_5X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 5; idepth = 260; // 2x2x160 interleaver fir_type = SINC; break; case MODE_10X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 10; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_20X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 20; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_32X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 32; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_4X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 4; idepth = 80; // 2x2x80 interleaver fir_type = SINC; break; case MODE_5X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 5; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_10X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 10; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_12X_PSK125: symbollen = 64;//PSK125 dcdbits = 128;//512; numcarriers = 12; fir_type = SINC; break; case MODE_12X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 12; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_16X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 16; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_2X_PSK250R: symbollen = 32;//PSK250 dcdbits = 512; _pskr = true;//PSKR numcarriers = 2; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_3X_PSK250R: symbollen = 32;//PSK250 dcdbits = 512; _pskr = true;//PSKR numcarriers = 3; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_5X_PSK250R: symbollen = 32;//PSK250 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 5; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_6X_PSK250: symbollen = 32;//PSK250 dcdbits = 512; numcarriers = 6; fir_type = SINC; break; case MODE_6X_PSK250R: symbollen = 32;//PSK250 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 6; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_7X_PSK250R: symbollen = 32;//PSK250 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 7; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_2X_PSK500: symbollen = 16; dcdbits = 512; numcarriers = 2; fir_type = SINC; break; case MODE_4X_PSK500: symbollen = 16; dcdbits = 512; numcarriers = 4; fir_type = SINC; break; case MODE_2X_PSK500R: symbollen = 16; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 2; fir_type = SINC; break; case MODE_3X_PSK500R: symbollen = 16; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 3; fir_type = SINC; break; case MODE_4X_PSK500R: symbollen = 16; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 4; fir_type = SINC; break; case MODE_2X_PSK800: symbollen = 10; _pskr = false; dcdbits = 512; numcarriers = 2; fir_type = SINC; break; case MODE_2X_PSK800R: symbollen = 10; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 2; fir_type = SINC; break; case MODE_2X_PSK1000: symbollen = 8;//PSK1000 dcdbits = 1024; numcarriers = 2; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_2X_PSK1000R: symbollen = 8;//PSK1000 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 2; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; default: mode = MODE_PSK31; symbollen = 256; dcdbits = 32; numcarriers = 1; fir_type = PSK_CORE; } // Set the number of bits-per-symbol based on the chosen constellation if (_qpsk || _xpsk) symbits = 2; else if (_8psk) symbits = 3; else if (_16psk) symbits = 4; else symbits = 1; // else BPSK / PSKR //printf("%s: symlen %d, dcdbits %d, _qpsk %d, _pskr %d, numc %f\n", //mode_info[mode].sname, //symbollen, dcdbits, _qpsk, _pskr, numcarriers); enc = (encoder *)0; dec = (viterbi *)0; // BPSK+FEC - 2nd Viterbi decoder and de-interleaver dec2 = (viterbi *)0; Txinlv = (interleave *)0; Rxinlv = (interleave *)0; Rxinlv2 = (interleave *)0; vestigial_sfft = (sfft *)0; // create impulse response for experimental FIR filters double fir1c[FIRLEN+1]; double fir2c[FIRLEN+1]; for (int i = 0; i < MAX_CARRIERS; i++) { if (i < numcarriers) { fir1[i] = new C_FIR_filter(); fir2[i] = new C_FIR_filter(); } else { fir1[i] = (C_FIR_filter *)0; fir2[i] = (C_FIR_filter *)0; } } switch (fir_type) { case PSK_CORE: // PSKcore filter raisedcosfilt(fir1c, FIRLEN); for (int i = 0; i <= FIRLEN; i++) fir2c[i] = pskcore_filter[i]; for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN+1, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN+1, 1, fir2c, fir2c); } break; default: case SINC: // fir1c & fir2c matched sin(x)/x filter w blackman wsincfilt(fir1c, 1.0 / symbollen, FIRLEN); wsincfilt(fir2c, 1.0 / 16.0, FIRLEN); for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN, 1, fir2c, fir2c); } break; } e0_filt = new Cmovavg(dcdbits / 2); e1_filt = new Cmovavg(dcdbits / 2); e2_filt = new Cmovavg(dcdbits / 2); e3_filt = new Cmovavg(dcdbits / 2); re_Gbin[0] = new goertzel(160, 0, 500.0); // base re_Gbin[1] = new goertzel(160, 15.625, 500.0); // fundamental re_Gbin[2] = new goertzel(160, 62.5, 500.0); // 4th harmonic (noise) re_Gbin[3] = new goertzel(160, 46.875, 500.0); // 3rd harmonic (imd) im_Gbin[0] = new goertzel(160, 0, 500.0); // base im_Gbin[1] = new goertzel(160, 15.625, 500.0); // fundamental im_Gbin[2] = new goertzel(160, 62.5, 500.0); // 4th harmonic (noise) im_Gbin[3] = new goertzel(160, 46.875, 500.0); // 3rd harmonic (imd) if (_disablefec) { enc = NULL; dec = dec2 = NULL; } else if (_qpsk) { enc = new encoder(K, POLY1, POLY2); dec = new viterbi(K, POLY1, POLY2); } else if (_pskr || PSKviterbi) { // FEC for BPSK. Use a 2nd Viterbi decoder for comparison. // Set decode size to 4 since some characters can be as small // as 3 bits long. This minimises intercharacters decoding // interactions. enc = new encoder(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec->setchunksize(4); dec2 = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec2->setchunksize(4); } else if (mode == MODE_8PSK125F || mode == MODE_8PSK250F) { enc = new encoder(K16, K16_POLY1, K16_POLY2); dec = new viterbi(K16, K16_POLY1, K16_POLY2); dec->setchunksize(4); dec2 = new viterbi(K16, K16_POLY1, K16_POLY2); dec2->setchunksize(4); } else if (_xpsk || _8psk || _16psk) { enc = new encoder(K13, K13_POLY1, K13_POLY2); dec = new viterbi(K13, K13_POLY1, K13_POLY2); dec->setchunksize(4); // Second viterbi decoder is only needed when modem has an odd number of bits/symbol. if ( _8psk && !_puncturing ) { // (punctured 8psk has 3-real bits + 1-punctured bit per transmitted symbol) dec2 = new viterbi(K13, K13_POLY1, K13_POLY2); dec2->setchunksize(4); } if (_puncturing) { // punctured codes benefit from a longer traceback dec->settraceback(K13 * 16); if (dec2) dec2->settraceback(K13 * 16); } } // Interleaver. For PSKR to maintain constant time delay between bits, // we double the number of concatenated square iterleavers for // each doubling of speed: 2x2x20 for BSK63+FEC, 2x2x40 for // BPSK125+FEC, etc.. Txinlv = new interleave (isize, idepth, INTERLEAVE_FWD); Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); if (dec2) Rxinlv2 = new interleave (isize, idepth, INTERLEAVE_REV); bitshreg = 0; rxbitstate = 0; tx_shape = new double[symbollen]; imd_shape = new double[symbollen]; // raised cosine shape for the transmitter double sym_ph = 0; for ( int i = 0; i < symbollen; i++) { sym_ph = i * M_PI / symbollen; tx_shape[i] = 0.5 * cos(sym_ph) + 0.5; imd_shape[i] = 0.5 * ( cos(3.0 * sym_ph) + (3.0/5.0) * cos(5.0 * sym_ph) + (3.0/7.0) * cos(7.0 * sym_ph) + (3.0/9.0) * cos(9.0 * sym_ph) ); } fragmentsize = symbollen; sc_bw = samplerate / symbollen; //JD added for multiple carriers inter_carrier = separation * sc_bw; bandwidth = sc_bw * ( 1 + separation * (numcarriers - 1)); snratio = s2n = imdratio = imd = 0; if (mailserver && progdefaults.PSKmailSweetSpot) sigsearch = SIGSEARCH; else sigsearch = 0; for (int i = 0; i < 16; i++) syncbuf[i] = 0.0; // E1 = E2 = E3 = 0.0; acquire = 0; evalpsk = new pskeval; if (viewer_mode()) pskviewer = new viewpsk(evalpsk, mode); else pskviewer = 0; if (vestigial) { if (samplerate == 16000) sfft_size = 16384; else sfft_size = 8192; int bin = sc_bw * sfft_size / samplerate; vestigial_sfft = new sfft(sfft_size, bin - 5, bin + 6); // 11 bins for (int i = 0; i < 11; i++) sfft_bins[i] = cmplx(0,0); } } //============================================================================= //=========================== psk31 receive routines ========================== //============================================================================= void psk::s2nreport(void) { modem::s2nreport(); s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } void psk::rx_bit(int bit) { int c; bool do_s2nreport = false; shreg = (shreg << 1) | !!bit; if (_pskr || _xpsk || _8psk || _16psk) { // MFSK varicode instead of PSK Varicode if ((shreg & 7) == 1) { c = varidec(shreg >> 1); // Voting at the character level if (fecmet >= fecmet2 || _disablefec) { if ((c != -1) && (c != 0) && (dcd == true)) { put_rx_char(c); do_s2nreport = true; } } shreg = 1; } } else { // PSK varicode if ((shreg & 3) == 0) { c = psk_varicode_decode(shreg >> 2); if ((c != -1) && (dcd == true)) { put_rx_char(c); do_s2nreport = true; } shreg = 0; } } if (do_s2nreport) { if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount ++; if (c == EOT) s2nreport(); } } } void psk::rx_bit2(int bit) { int c; bool do_s2nreport = false; shreg2 = (shreg2 << 1) | !!bit; // MFSK varicode instead of PSK Varicode if ((shreg2 & 7) == 1) { c = varidec(shreg2 >> 1); // Voting at the character level for only PSKR modes if (fecmet < fecmet2 || _disablefec) { if ((c != -1) && (c != 0) && (dcd == true)) { put_rx_char(c); do_s2nreport = true; } } shreg2 = 1; } if (do_s2nreport) { if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount ++; if (c == EOT) s2nreport(); } } } void psk::rx_qpsk(int bits) { unsigned char sym[2]; int c; if (_qpsk && !reverse) bits = (4 - bits) & 3; sym[0] = (bits & 1) ? 255 : 0; sym[1] = (bits & 2) ? 0 : 255; // top bit is flipped //JD added de-interleaver // Rxinlv->symbols(sym); c = dec->decode(sym, NULL); if (c != -1) { rx_bit(c & 0x80); rx_bit(c & 0x40); rx_bit(c & 0x20); rx_bit(c & 0x10); rx_bit(c & 0x08); rx_bit(c & 0x04); rx_bit(c & 0x02); rx_bit(c & 0x01); } } void psk::rx_pskr(unsigned char symbol) { int met; unsigned char twosym[2]; unsigned char tempc; int c; //In the case of multiple carriers, if even number of carriers then we // know the bit-order and don't need voting otherwise // we accumulate the soft bits for the interleaver THEN submit to Viterbi // decoder in alternance so that each one is processed one bit later. // Only two possibilities for sync: current bit or previous one since // we encode with R = 1/2 and send encoded bits one after the other // through the interleaver. symbolpair[1] = symbolpair[0]; symbolpair[0] = symbol; if (rxbitstate == 0) { rxbitstate++; //Only use one decoder is using even carriers (we know the bits order) // if (((int)numcarriers) % 2 == 0) { // fecmet2 = -9999.0; // return; // } // XPSK and 16PSK have even number of bits/symbol // Punctured 8PSK has even number of bits/symbol (3 real + 1 punctured) // so bit order known: can use only one decoder to reduce CPU usage if ( _xpsk || _16psk || (_8psk && _puncturing) ) { fecmet2 = -9999.0; return; } // copy to avoid scrambling symbolpair for the next bit twosym[0] = symbolpair[0]; twosym[1] = symbolpair[1]; // De-interleave if (mode != MODE_PSK63F) Rxinlv2->symbols(twosym); // pass de-interleaved bits pair to the decoder, reversed tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = dec2->decode(twosym, &met); if (c != -1) { // FEC only take metric measurement after backtrace // Will be used for voting between the two decoded streams fecmet2 = decayavg(fecmet2, met, 20); rx_bit2(c & 0x08); rx_bit2(c & 0x04); rx_bit2(c & 0x02); rx_bit2(c & 0x01); } } else { // Again for the same stream shifted by one bit rxbitstate = 0; twosym[0] = symbolpair[0]; twosym[1] = symbolpair[1]; // De-interleave if (mode != MODE_PSK63F) Rxinlv->symbols(twosym); tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = dec->decode(twosym, &met); if (c != -1) { fecmet = decayavg(fecmet, met, 20); rx_bit(c & 0x08); rx_bit(c & 0x04); rx_bit(c & 0x02); rx_bit(c & 0x01); } } } void psk::searchDown() { double srchfreq = frequency - sc_bw * 2; double minfreq = sc_bw * 2; double spwr, npwr; while (srchfreq > minfreq) { spwr = wf->powerDensity(srchfreq, sc_bw); npwr = wf->powerDensity(srchfreq + sc_bw, sc_bw/2) + 1e-10; if (spwr / npwr > pow(10, progdefaults.ServerACQsn / 10)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq -= sc_bw; } } void psk::searchUp() { double srchfreq = frequency + sc_bw * 2; double maxfreq = IMAGE_WIDTH - sc_bw * 2; double spwr, npwr; while (srchfreq < maxfreq) { spwr = wf->powerDensity(srchfreq, sc_bw/2); npwr = wf->powerDensity(srchfreq - sc_bw, sc_bw/2) + 1e-10; if (spwr / npwr > pow(10, progdefaults.ServerACQsn / 10)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq += sc_bw; } } int waitcount = 0; void psk::findsignal() { put_Status1(""); put_Status2(""); put_status(""); int ftest, f1, f2; if (sigsearch > 0) { sigsearch--; if (mailserver) { // mail server search algorithm if (progdefaults.PSKmailSweetSpot) { f1 = (int)(progdefaults.ServerCarrier - progdefaults.ServerOffset); f2 = (int)(progdefaults.ServerCarrier + progdefaults.ServerOffset); } else { f1 = (int)(frequency - progdefaults.ServerOffset); f2 = (int)(frequency + progdefaults.ServerOffset); } if (evalpsk->sigpeak(ftest, f1, f2) > pow(10, progdefaults.ServerACQsn / 10) ) { if (progdefaults.PSKmailSweetSpot) { if (abs(ftest - progdefaults.ServerCarrier) < progdefaults.ServerOffset) { frequency = ftest; set_freq(frequency); freqerr = 0.0; } else { frequency = progdefaults.ServerCarrier; set_freq(frequency); freqerr = 0.0; } } else { frequency = ftest; set_freq(frequency); freqerr = 0.0; } } else { // less than the detection threshold if (progdefaults.PSKmailSweetSpot) { frequency = progdefaults.ServerCarrier; set_freq(frequency); sigsearch = SIGSEARCH; } } } else { // normal signal search algorithm f1 = (int)(frequency - progdefaults.SearchRange/2); f2 = (int)(frequency + progdefaults.SearchRange/2); resetSN_IMD(); if (evalpsk->sigpeak(ftest, f1, f2) > pow(10, progdefaults.ACQsn / 10.0) ) { frequency = ftest; set_freq(frequency); freqerr = 0.0; sigsearch = 0; acquire = dcdbits; } } } } //DHF: AFC based on vestigial carrier located at f0 - bandwidth void psk::vestigial_afc() { if (!progdefaults.pskpilot) return; if (!vestigial_sfft->is_stable()) return; double avg = 0; int i = 0; for (i = 0; i < 11; i++) avg += abs(sfft_bins[i]); avg /= 11.0; std::setprecision(2); std::setw(5); for (i = 0; i < 11; i++) if (abs(sfft_bins[i]) > 2.0*avg) break; if (i < 11) { // std::cout << "bin: " << i // << ", freq offset: " << (i - 5)*samplerate/16384.0 // << ", amp: " << abs(sfft_bins[i]) // << ", avg: " << avg << "\n"; if (i != 5) { frequency -= 1.0*(i-5)*samplerate/sfft_size; set_freq (frequency); } } vestigial_sfft->reset(); } //JD: disable for multiple carriers as we are running as modem and // therefore use other strategies for frequency alignment like RSID void psk::phaseafc() { double error; // Skip AFC for modes it does not work with if (vestigial) return vestigial_afc(); if (afcmetric < 0.05 || mode == MODE_PSK500 || mode == MODE_QPSK500 || numcarriers > 1) return; error = (phase - bits * M_PI / 2.0); if (error < -M_PI / 2.0 || error > M_PI / 2.0) return; error *= samplerate / (TWOPI * symbollen); if (fabs(error) < sc_bw ) { freqerr = error / dcdbits; frequency -= freqerr; if (mailserver) { if (frequency < progdefaults.ServerCarrier - progdefaults.ServerAFCrange) frequency = progdefaults.ServerCarrier - progdefaults.ServerAFCrange; if (frequency > progdefaults.ServerCarrier + progdefaults.ServerAFCrange) frequency = progdefaults.ServerCarrier + progdefaults.ServerAFCrange; } set_freq (frequency); } if (acquire) acquire--; } void psk::afc() { if (!progStatus.afconoff) return; if (dcd == true || acquire) phaseafc(); } void psk::rx_symbol(cmplx symbol, int car) { int n; unsigned char softbit = 0; double softangle; double softamp; double sigamp = norm(symbol); static double averageamp; phase = arg ( conj(prevsymbol[car]) * symbol ); prevsymbol[car] = symbol; /// align the RX constellation to the TX constellation, for Non-FEC modes if (_disablefec && (_16psk || _8psk || _xpsk )) phase -= M_PI; if (phase < 0) phase += TWOPI; if (_qpsk) { n = 4; bits = ((int) (phase / M_PI_2 + 0.5)) & (n-1); } else if (_xpsk) { n = 4; bits = ((int) (phase / M_PI_2)) & (n-1); } else if (_8psk) { n = 8; bits = ((int) (phase / (M_PI/4.0) + 0.5)) & (n-1); } else if (_16psk) { n = 16; bits = ((int) (phase / (M_PI/8.0) + 0.5)) & (n-1); } else { // bpsk and pskr n = 2; bits = (((int) (phase / M_PI + 0.5)) & (n-1) ) << 1; // hard decode if needed // softbit = (bits & 2) ? 0 : 255; // reversed as we normally pass "!bits" when hard decoding averageamp = decayavg(averageamp, sigamp, SQLDECAY); if (sigamp > 0 && averageamp > 0) { if (sigamp > averageamp) { softamp = clamp( sqrt(sigamp / averageamp), 1.0, 1e6); } else { softamp = clamp( sqrt(averageamp / sigamp), 1.0, 1e6); } } else { softamp = 2; // arbritary number (50% impact) } // Compute values between -128 and +127 for phase value only double alpha = phase / M_PI; if (alpha > 1.0) alpha = 2.0 - alpha; softangle = 127.0 - 255.0 * alpha; softbit = (unsigned char) ((softangle / ( 1.0 + softamp / 2.0)) + 128); } // simple low pass filter for quality of signal double decay = SQLDECAY; double attack = SQLDECAY; double cval = cos(n*phase); double sval = sin(n*phase); if (_8psk) { attack *= 2; decay *= 4; } if (_pskr) { decay *= 10; quality = cmplx( decayavg(quality.real(), cval, decay), decayavg(quality.imag(), sval, decay)); } else quality = cmplx( decayavg(quality.real(), cval, cval > quality.real() ? attack : decay), decayavg(quality.imag(), sval, sval > quality.real() ? attack : decay)); metric = 100.0 * norm(quality); if (_pskr && (averageamp < 3e-5)) metric = 0; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { //s2n reporting: rescale depending on mode, clip after scaling if (_pskr) s2n_metric = metric * 1.5 + 8; else s2n_metric = metric; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } // FEC: adjust squelch for extra sensitivity. // Otherwise we miss good characters // *********************************************************** // **** DHF still needed with attack/decay filtering? // *********************************************************** // if (_pskr) { // metric = metric * 4; // } // else if ( (_xpsk || _8psk || _16psk) && !_disablefec) { // metric *= 2 * symbits; /// @TODO scale the metric with the psk constellation density // } if (metric > 100) metric = 100; afcmetric = decayavg(afcmetric, norm(quality), 50); dcdshreg = ( dcdshreg << (symbits+1) ) | bits; int set_dcdON = -1; // 1 sets DCD on ; 0 sets DCD off ; -1 does neither (no-op) switch (dcdshreg) { // bpsk DCD on case 0xAAAAAAAA: if ( _xpsk || _8psk || _16psk) break; if (_pskr) break; set_dcdON = 1; break; // pskr DCD on case 0x0A0A0A0A: if (!_pskr) break; set_dcdON = 1; break; case 0x92492492: // xpsk DCD off (with FEC disabled) if (!_xpsk) break; if (!_disablefec) break; set_dcdON = 0; break; case 0x10842108: // 16psk DCD off (with FEC disabled) if (!_16psk) break; if (!_disablefec) break; set_dcdON = 0; break; case 0x44444444: // 8psk DCD off (with FEC disabled) if (!_8psk) break; if (!_disablefec) break; set_dcdON = 0; break; case 0x00000000: // bpsk DCD off. 8psk DCD on. if (_pskr) break; if (_xpsk || _16psk) break; if (_8psk) { set_dcdON = 1; break; } set_dcdON = 0; break; default: if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { dcd = true; } else { dcd = false; } } //printf("\n%08x", dcdshreg); if ( 1 == set_dcdON ) { dcd = true; acquire = 0; quality = cmplx (1.0, 0.0); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) s2n_sum = s2n_sum2 = s2n_ncount = 0.0; //printf("\n DCD ON!!"); } else if ( 0 == set_dcdON ){ dcd = false; acquire = 0; quality = cmplx (0.0, 0.0); //printf("\n DCD OFF!!!!!!!!!"); } if (_pskr) { rx_pskr(softbit); set_phase(phase, norm(quality), dcd); } else if (dcd == true) { set_phase(phase, norm(quality), dcd); if (!_disablefec && (_16psk || _8psk || _xpsk) ) { int bitmask = 1; unsigned char xsoftsymbols[symbits]; if ( (_puncturing && _16psk) ) rx_pskr(128); // 16psk: recover punctured low bit // Soft-decode of Gray-mapped 8psk if (_8psk) { bool softpuncture = false; static double lastphasequality=0; double phasequality = fabs(cos( n/2 * phase)); phasequality = (phasequality + lastphasequality) / 2; // Differential modem: average probabilities between current and previous symbols lastphasequality = phasequality; int soft_qualityerror = static_cast(128 - (128 * phasequality)) ; if (soft_qualityerror > 255-25) // Prevent soft-bit wrap-around (crossing of value 128) softpuncture = true; else if (soft_qualityerror < 128/3) // First 1/3 of phase delta is considered a perfect signal soft_qualityerror = 0; else if (soft_qualityerror > 128 - (128/8) ) // Last 1/8 of phase delta triggers a puncture softpuncture = true; else soft_qualityerror /= 2; // Scale the FEC error to prevent premature cutoff if (softpuncture) { for(int i=0; i(bits); for(int i=symbits-1; i>=0; i--) { // Use predefined Gray-mapped softbits for soft-decoding if (graymapped_8psk_softbits[bitindex][i] > 128) // Soft-One rx_pskr( (graymapped_8psk_softbits[bitindex][i]) - soft_qualityerror ); else // Soft-Zero rx_pskr( (graymapped_8psk_softbits[bitindex][i]) + soft_qualityerror ); } } } else { //Hard Decode Section for(int i=0; imag(); double r1 = re_Gbin[1]->mag(); double r2 = re_Gbin[2]->mag(); double r3 = re_Gbin[3]->mag(); double i0 = im_Gbin[0]->mag(); double i1 = im_Gbin[1]->mag(); double i2 = im_Gbin[2]->mag(); double i3 = im_Gbin[3]->mag(); r0 = sqrtf(r0*r0 + i0*i0); r1 = sqrtf(r1*r1 + i1*i1); r2 = sqrtf(r2*r2 + i2*i2); r3 = sqrtf(r3*r3 + i3*i3); //std::cout << r0 << ", " << r1 << ", " << r2 << ", " << r3 << std::endl; // if (r0 > r1) r1 = r0; e0 = e0_filt->run(r0); e1 = e1_filt->run(r1); e2 = e2_filt->run(r2); e3 = e3_filt->run(r3); if (e1 > e0) { if ((e1 > 2 * e2) && (e2 > 0)) { snratio = e1 / e2; if (snratio < 1.0) snratio = 1.0; } else snratio = 1.0; } else { if ((e0 > 2 * e2) && (e2 > 0)) { snratio = e0 / e2; if (snratio < 1.0) snratio = 1.0; } else snratio = 1.0; } if ( (e1 > 2 * e3) && (e3 > 2 * e2) ) { imdratio = e3 / e1; if (imdratio < (1.0 /snratio)) imdratio = 1.0 / snratio; } else imdratio = 1.0 / snratio ; displaysn = false; if (snratio > 4) displaysn = true; if (r0 > r1) { if ((r0 / r2 < 0.1 * snratio ) || (r0 / r2 < 2.0)) { //std::cout << "r0 / r2 " << r0/r2 << ", snratio " << snratio << std::endl; displaysn = false; } } else { if ((r1 / r2 < 0.1 * snratio ) || (r1 / r2 < 2.0)) { //std::cout << "r1 / r2 " << r1/r2 << ", snratio " << snratio << std::endl; displaysn = false; } } } void psk::update_syncscope() { static char msg1[16]; static char msg2[16]; display_metric(metric); if (displaysn && mode == MODE_PSK31) { memset(msg1, 0, sizeof(msg1)); memset(msg2, 0, sizeof(msg2)); s2n = 10.0*log10( snratio ); if (s2n < 6) strcpy(msg1, "S/N ---"); else snprintf(msg1, sizeof(msg1), "S/N %2.0f dB", s2n); put_Status1( msg1, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); imd = 10.0*log10( imdratio ); if (imd > -10) strcpy(msg2, "IMD ---"); else snprintf(msg2, sizeof(msg2), "IMD %2.0f dB", imd); put_Status2( msg2, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); } } char bitstatus[100]; int psk::rx_process(const double *buf, int len) { double delta[MAX_CARRIERS], frequencies[MAX_CARRIERS]; cmplx z, z2[MAX_CARRIERS]; bool can_rx_symbol = false; if (viewer_mode()) { if (!progdefaults.report_when_visible || dlgViewer->visible() || progStatus.show_channels ) if (pskviewer && !bHistory) pskviewer->rx_process(buf, len); if (evalpsk) evalpsk->sigdensity(); } frequencies[0] = frequency + ((-1 * numcarriers) + 1) * inter_carrier / 2; delta[0] = TWOPI * frequencies[0] / samplerate; for (int car = 1; car < numcarriers; car++) { frequencies[car] = frequencies[car - 1] + inter_carrier; delta[car] = TWOPI * frequencies[car] / samplerate; } while (len-- > 0) { for (int car = 0; car < numcarriers; car++) { // Mix with the internal NCO z = cmplx ( *buf * cos(phaseacc[car]), *buf * sin(phaseacc[car]) ); // if we re-enable multi-carrier vestigial carrier // if (vestigial && car == 0) vestigial_sfft->run(z, sfft_bins, 1); if (vestigial && progdefaults.pskpilot) vestigial_sfft->run(z, sfft_bins, 1); phaseacc[car] += delta[car]; if (phaseacc[car] > TWOPI) phaseacc[car] -= TWOPI; // Filter and downsample // by 16 (psk31, qpsk31) // by 8 (psk63, qpsk63) // by 4 (psk125, qpsk125) // by 2 (psk250, qpsk250) // by 1 (psk500, qpsk500) = no down sampling // first filter if (fir1[car]->run( z, z )) { // fir1 returns true every Nth sample // final filter fir2[car]->run( z, z2[car] ); // fir2 returns value on every sample //On last carrier processing if (car == numcarriers - 1) { calcSN_IMD(z); //JD OR all carriers together check logic??? /** * This is the symbol timing recovery mechanism. After the demodulated * signal is processed by the matched filters, the signal lobes are * expected to have been modified to a fairly symmetric shape. The * magnitude of the samples are taken, thus rectifying the signal to * positive values. "bitclk" is a counter that is very close in rate to * (samples / symbol). Its purpose is to repeatedly "draw" one symbol * waveform in the syncbuf array, according to its amplitude (not phase). */ int idx = (int) bitclk; double sum = 0.0; double ampsum = 0.0; for (int ii = 0; ii < numcarriers; ii++) { sum += abs(z2[ii])/numcarriers; } // syncbuf[idx] = 0.8 * syncbuf[idx] + 0.2 * z2[car].mag(); syncbuf[idx] = 0.8 * syncbuf[idx] + 0.2 * sum; sum = 0.0; double bitsteps = (symbollen >= 16 ? 16 : symbollen); int symsteps = (int) (bitsteps / 2); /** * Here we sum up the difference between each sample's magnitude in the * lower half of the array with its counterpart on the upper half of the * array, or the other side of the waveform. Each pair's difference is * divided by their sum, scaling it so that the signal amplitude does not * affect the result. When the differences are summed, it gives an * indication of which side is larger than the other. */ for (int i = 0; i < symsteps; i++) { sum += (syncbuf[i] - syncbuf[i+symsteps]); ampsum += (syncbuf[i] + syncbuf[i+symsteps]); } // added correction as per PocketDigi sum = (ampsum == 0 ? 0 : sum / ampsum); /** * If the lower side is larger (meaning that the waveform is shifted in that * direction), then the sum is negative, and bitclk needs to be adjusted to * be a little faster, so that the next drawing of the waveform in syncbuf * will be shifted right. Conversely, if the sum is positive, then it needs * to slow down bitclk so that the waveform is shifted left. Thus the * error is subtracted from bitclk, rather than added. The goal is to * get the error as close to zero as possible, so that the receiver is * exactly synced with the transmitter and the waveform is exactly in * the middle of syncbuf. */ // bitclk -= sum / 5.0; bitclk -= sum / (5.0 * 16 / bitsteps); bitclk += 1; /** * When bitclock reaches the end of the buffer, then a complete waveform * has been received. It is time to output the current sample and wrap * around to the next cycle. * * There is a complete symbol waveform in syncbuf, so that each * sample[0..N/2-1] is very close in amplitude with the corresponding * sample in [N/2..N-1]. * * | ******** ******** | * | **** **** **** **** | * | *** *** *** *** | * | ** ** ** ** | * | * * * * | * | * * * * | * |* * *| * |_______________________________________________________________| * 0 N/2 N-1 * * === or some variation of it .... === * * |**** ******** *****| * | **** **** **** **** | * | *** *** *** *** | * | ** ** ** ** | * | * * * * | * | * * * * | * | * * | * |_______________________________________________________________| * 0 N/2 N-1 * * A t the end of this cycle, bitclk is pointing at a sample which will * have the maximum phase difference, if any, from the previous symbol's * phase. * */ if (bitclk < 0) bitclk += bitsteps; if (bitclk >= bitsteps) { bitclk -= bitsteps; can_rx_symbol = true; update_syncscope(); afc(); } } } } if (can_rx_symbol) { for (int car = 0; car < numcarriers; car++) { rx_symbol(z2[car], car); } can_rx_symbol = false; } buf++; } if (sigsearch) findsignal(); else if (mailserver) { if (waitcount > 0) { --waitcount; if (waitcount == 0) { if (progdefaults.PSKmailSweetSpot) { frequency = progdefaults.PSKsweetspot; set_freq(frequency); } sigsearch = SIGSEARCH; } } else if ( snratio <= 1.0) { waitcount = 8; sigsearch = 0; } } return 0; } //===================================================================== // transmit processes //===================================================================== void psk::transmit(double *buf, int len) { ModulateXmtr(buf, len); } #define SVP_MASK 0xF #define SVP_COUNT (SVP_MASK + 1) static cmplx sym_vec_pos[SVP_COUNT] = { cmplx (-1.0, 0.0), // 180 degrees cmplx (-0.9238, -0.3826), // 202.5 degrees cmplx (-0.7071, -0.7071), // 225 degrees cmplx (-0.3826, -0.9238), // 247.5 degrees cmplx (0.0, -1.0), // 270 degrees cmplx (0.3826, -0.9238), // 292.5 degrees cmplx (0.7071, -0.7071), // 315 degrees cmplx (0.9238, -0.3826), // 337.5 degrees cmplx (1.0, 0.0), // 0 degrees cmplx (0.9238, 0.3826), // 22.5 degrees cmplx (0.7071, 0.7071), // 45 degrees cmplx (0.3826, 0.9238), // 67.5 degrees cmplx (0.0, 1.0), // 90 degrees cmplx (-0.3826, 0.9238), // 112.5 degrees cmplx (-0.7071, 0.7071), // 135 degrees cmplx (-0.9238, 0.3826) // 157.5 degrees }; void psk::tx_carriers() { double delta[MAX_CARRIERS]; double ival, qval, shapeA, shapeB; cmplx symbol; double frequencies[MAX_CARRIERS]; //Process all carrier's symbols, then submit to sound card accumulated_bits = 0; //reset frequencies[0] = get_txfreq_woffset() + ((-1 * numcarriers) + 1) * inter_carrier / 2; delta[0] = TWOPI * frequencies[0] / samplerate; for (int car = 1; car < symbols; car++) { frequencies[car] = frequencies[car - 1] + inter_carrier; delta[car] = TWOPI * frequencies[car] / samplerate; } int sym; for (int car = 0; car < symbols; car++) { sym = txsymbols[car]; if (_qpsk && !reverse) sym = (4 - sym) & 3; if (_8psk && !_disablefec) // Use Gray-mapped 8psk constellation symbol = prevsymbol[car] * graymapped_8psk_pos[(sym & 7)]; // complex multiplication else { // Map the incoming symbols to the underlying 16psk constellation. if (_xpsk) sym = sym * 4 + 2; // Give it the "X" constellation shape else if (_8psk) sym *= 2; // Map 8psk to 16psk else sym *= 4; // For BPSK and QPSK symbol = prevsymbol[car] * sym_vec_pos[(sym & SVP_MASK)]; // complex multiplication } for (int i = 0; i < symbollen; i++) { shapeA = tx_shape[i]; if (test_signal_window && test_signal_window->visible() && btn_imd_on->value()) { double imd = pow(10, xmtimd->value()/20.0); shapeA -= (imd * imd_shape[i]); // shapeA = cos(i * M_PI/symbollen); // shapeA -= imd * cos(3.0 * i * M_PI / symbollen); // shapeA -= imd * (3.0 / 5.0) * cos(5.0 * i * M_PI / symbollen); // shapeA -= imd * (3.0 / 7.0) * cos(7.0 * i * M_PI / symbollen); // shapeA -= imd * (3.0 / 9.0) * cos(9.0 * i * M_PI / symbollen); // shapeA *= 0.5; // shapeA += 0.5; } // else // shapeA = tx_shape[i]; //0.5 * cos(i * M_PI / symbollen) + 0.5; shapeB = (1.0 - shapeA); ival = shapeA * prevsymbol[car].real() + shapeB * symbol.real(); qval = shapeA * prevsymbol[car].imag() + shapeB * symbol.imag(); if (car != 0) { outbuf[i] += (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car])) / numcarriers; } else { outbuf[i] = (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car])) / numcarriers; } phaseacc[car] += delta[car]; if (phaseacc[car] > TWOPI) phaseacc[car] -= TWOPI; } prevsymbol[car] = symbol; } if (vestigial && progdefaults.pskpilot) { double dvp = TWOPI * (frequencies[0] - sc_bw) / samplerate; double amp = pow(10, progdefaults.pilot_power / 20.0) * maxamp; for (int i = 0; i < symbollen; i++) { outbuf[i] += amp * cos(vphase); outbuf[i] /= (1 + amp); vphase += dvp; if (vphase > TWOPI) vphase -= TWOPI; } } maxamp = 0; for (int i = 0; i < symbollen; i++) if (maxamp < fabs(outbuf[i])) maxamp = fabs(outbuf[i]); if (maxamp) { for (int i = 0; i < symbollen; i++) outbuf[i] /= maxamp; } transmit(outbuf, symbollen); } void psk::tx_symbol(int sym) { acc_symbols++; txsymbols[symbols] = sym; if (++symbols < numcarriers) { return; } tx_carriers(); symbols = 0; //reset } void psk::tx_bit(int bit) { unsigned int sym; static int bitcount=0; static int xpsk_sym=0; // qpsk transmission if (_qpsk) { sym = enc->encode(bit); sym = sym & 3;//JD just to make sure tx_symbol(sym); // pskr (fec + interleaver) transmission } else if (_pskr) { // Encode into two bits bitshreg = enc->encode(bit); // pass through interleaver if (mode != MODE_PSK63F) Txinlv->bits(&bitshreg); // Send low bit first. tx_symbol expects 0 or 2 for BPSK sym = (bitshreg & 1) << 1; tx_symbol(sym); sym = bitshreg & 2; tx_symbol(sym); } else if (_16psk || _8psk || _xpsk) { if (_disablefec) { //Accumulate tx bits until the correct number for symbol-size is reached xpsk_sym |= bit << bitcount++ ; if (bitcount == symbits) { tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; } } else tx_xpsk(bit); // else normal bpsk transmission } else { sym = bit << 1; tx_symbol(sym); } } void psk::tx_xpsk(int bit) { static int bitcount = 0; static unsigned int xpsk_sym = 0; int fecbits = 0; // If invalid value of bitcount, reset to 0 if ( (_8psk && _puncturing) || _xpsk || _16psk) if ( (bitcount & 0x1) ) bitcount = 0; // Pass one bit and return two bits bitshreg = enc->encode(bit); // Interleave Txinlv->bits(&bitshreg); // Bit-interleave fecbits = bitshreg; if (_xpsk) { // 2 bits-per-symbol. Transmit every call xpsk_sym = static_cast(fecbits); tx_symbol(xpsk_sym); return; } else if (_8psk && _puncturing) { // @ 2/3 rate if ( 0 == bitcount) { xpsk_sym = static_cast(fecbits); bitcount = 2; return; } else if ( 2 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; /// Punctured anyways, so skip -> //xpsk_sym |= (static_cast(fecbits) & 2) << 2 ; tx_symbol(xpsk_sym & 7); /// Drop/puncture the high-bit on Tx xpsk_sym = bitcount = 0; return; } } else if (_8psk) { // 3 bits-per-symbol. Accumulate then tx. if ( 0 == bitcount ) { // Empty xpsk_sym buffer: add 2 bits and return xpsk_sym = static_cast(fecbits); bitcount = 2; return ; } else if ( 1 == bitcount ) { // xpsk_sym buffer with one bit: add 2 bits then tx and clear xpsk_sym |= (static_cast(fecbits) & 1) << 1 ; xpsk_sym |= (static_cast(fecbits) & 2) << 1 ; tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; return; } else if ( 2 == bitcount ) { // xpsk_sym buffer with 2 bits: add 1 then tx and save next bit xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; xpsk_sym |= (static_cast(fecbits) & 2) >> 1 ; bitcount = 1; return; } } else if (_puncturing && _16psk) { // @ 3/4 Rate if ( 0 == bitcount) { xpsk_sym = static_cast(fecbits); bitcount = 2; return; } else if ( 2 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; xpsk_sym |= (static_cast(fecbits) & 2) << 2 ; bitcount = 4; return; } else if ( 4 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 4 ; xpsk_sym |= (static_cast(fecbits) & 2) << 4 ; xpsk_sym >>= 1; // Shift right to drop the lowest bit xpsk_sym &= 15; // Drop the highest bit tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; return; } } else if (_16psk) { // 4 bits-per-symbol. Transmit every-other run. if ( 0 == bitcount) { xpsk_sym = static_cast(fecbits); bitcount = 2; return; } else if ( 2 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; xpsk_sym |= (static_cast(fecbits) & 2) << 2 ; //Txinlv->bits(&xpsk_sym); tx_symbol(xpsk_sym & 7); xpsk_sym = bitcount = 0; return; } } } unsigned char ch; void psk::tx_char(unsigned char c) { ch = c; const char *code; char_symbols = acc_symbols; if (_pskr || _xpsk || _8psk || _16psk) { // acc_symbols = 0; // ARQ varicode instead of MFSK for PSK63FEC code = varienc(c); } else { code = psk_varicode_encode(c); } while (*code) { tx_bit((*code - '0')); code++; } // Insert PSK varicode character-delimiting bits if (! _pskr && !_xpsk && !_8psk && !_16psk) { tx_bit(0); tx_bit(0); } char_symbols = acc_symbols - char_symbols; } void psk::tx_flush() { if (_pskr) { ovhd_symbols = ((numcarriers - symbols) % numcarriers); //VK2ETA replace with a more effective flushing sequence (avoids cutting the last characters in low s/n) for (int i = 0; i < ovhd_symbols/2; i++) tx_bit(0); for (int i = 0; i < dcdbits / 2; i++) { tx_bit(1); tx_bit(1); } // QPSK - flush the encoder } else if (_qpsk) { for (int i = 0; i < dcdbits; i++) tx_bit(0); // FEC enabled: Sens the NULL character in MFSk varicode as the flush / post-amble sequence } else if (!_disablefec && (_xpsk || _8psk || _16psk) ) { for (int i=0; i to clear bit accumulators on both Tx and Rx ends. } // FEC disabled: use unmodulated carrier (bpsk-like single tone) } else if (_disablefec && ( _xpsk || _8psk || _16psk) ) { for (int i=0; i to clear bit accumulators on both Tx and Rx ends. } int symbol; if (_16psk) symbol = 8; else if (_8psk) symbol = 4; else symbol = 2; // xpsk for (int i = 0; i <= 96; i++) // DCD window is only 32-bits wide. Send 3-times tx_symbol(symbol); // Standard BPSK postamble } else { for (int i = 0; i < dcdbits; i++) tx_symbol(2); // 0 degrees } for (int i = 0; i < 2048; i++) outbuf[i] = 0; transmit(outbuf, 2048); } // Necessary to clear the interleaver before we start sending void psk::clearbits() { bitshreg = 0; enc->init(); Txinlv->flush(); } int psk::tx_process() { modem::tx_process(); if (preamble) { if (_pskr) { if (mode != MODE_PSK63F) clearbits(); // FEC prep the encoder with one/zero sequences of bits for (int i = 0; i < preamble; i += 2) { tx_bit(1); tx_bit(0); } // FEC: Mark start of first character with a double zero // to ensure sync at end of preamble while (acc_symbols % numcarriers) tx_bit(0); tx_char(0); // preamble = 0; return 0; } else if (_8psk) { if (!_disablefec) clearbits(); if(progStatus.psk8DCDShortFlag) if (preamble > 96) preamble = 96; if (_disablefec) { // Send continuous symbol 0: Usual PSK 2-tone preamble for (int i = 0; i < preamble; i++ ) tx_symbol(0); tx_char(0); preamble = 0; return 0; } else { _disablefec = true; for (int i = 0; i < preamble/2; i++) tx_symbol(0); _disablefec = false; // FEC prep the encoder with encoded sequence of double-zeros // sends a single centered preamble tone for FEC modes for (int i = 0; i < preamble; i += 2) { tx_bit(0); tx_bit(0); } tx_char(0); preamble = 0; return 0; } } else { // Standard BPSK/QPSK preamble for (int i = 0; i < preamble; i++) { tx_symbol(0); // send phase reversals } preamble = 0; return 0; } } int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { tx_flush(); stopflag = false; cwid(); char_samples = char_symbols * symbollen / numcarriers; xmt_samples = acc_symbols * symbollen / numcarriers; ovhd_samples = (acc_symbols - char_symbols - ovhd_symbols) * symbollen / numcarriers; return -1; // we're done } if (c == GET_TX_CHAR_NODATA) { if (_pskr || _xpsk || _8psk || _16psk) { // MFSK varicode instead of psk tx_char(0); // tx_bit(1); // extended zero bit stream for (int i = 0; i < 32; i++) tx_bit(0); } else { tx_bit(0); } } else { tx_char(c); put_echo_char(c); } return 0; } //============================================================================ // psk signal evaluation // using Goertzel IIR filter // derived from pskcore by Moe Wheatley, AE4JY //============================================================================ static bool reset_filters; void psk::initSN_IMD() { reset_filters = true; } void psk::resetSN_IMD() { reset_filters = true; } //============================================================================ // This routine calculates the energy in the frequency bands of // carrier = base (0), fundamental = F1(15.625), noise = F2(31.25), and // 3rd order product = F3(46.875) // It is called with cmplx data samples at 500 Hz. //============================================================================ void psk::calcSN_IMD(cmplx z) { if (!re_Gbin[0]) return; if (reset_filters) { e0_filt->reset(); e1_filt->reset(); e2_filt->reset(); e3_filt->reset(); for(int i = 0; i < NUM_FILTERS; i++) { re_Gbin[i]->reset(); im_Gbin[i]->reset(); } reset_filters = false; } bool isvalid = true; for (int i = 0; i < NUM_FILTERS; i++) { isvalid &= re_Gbin[i]->run(real(z)); isvalid &= im_Gbin[i]->run(imag(z)); } if (isvalid) { signalquality(); for (int i = 0; i < NUM_FILTERS; i++) { re_Gbin[i]->reset(); im_Gbin[i]->reset(); } } return; } fldigi-4.1.06/src/psk/pskeval.cxx0000644000175000017500000000717613472115773013563 00000000000000// ---------------------------------------------------------------------------- // pskeval.cxx -- psk signal evaluator // // Copyright (C) 2008-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "fl_digi.h" #include "pskeval.h" #include "configuration.h" #include "misc.h" using namespace std; //============================================================================= //========================== psk signal evaluation ============================ //============================================================================= pskeval::pskeval() { bw = 31.25; clear(); } pskeval::~pskeval() { } int countdown = 8; int rows = 0; void pskeval::sigdensity() { int ihbw = (int)(0.6*bw); int ibw = 2 * ihbw; double *vals = new double[ibw]; double sig = 0.0; double val = 0.0; int low = progdefaults.LowFreqCutoff; if (low < ihbw) low = ihbw; int high = progdefaults.HighFreqCutoff; if (high > FFT_LEN - ihbw) high = FFT_LEN - ihbw; int nbr = high - low; sigmin = 1e6; for (int i = 0; i < ibw; i++) { val = vals[i] = wf->Pwr(i + low - ihbw); sig += val; } for (int i = 0, j = 0; i < nbr; i++) { sigpwr[i + low] = decayavg(sigpwr[i + low], sig, 32); sig -= vals[j]; val = vals[j] = wf->Pwr(i + ihbw + low); sig += val; if (++j == ibw) j = 0; if (sig < sigmin) sigmin = sig; } if (sigmin < 1e-8) sigmin = 1e-8; delete [] vals; } double pskeval::sigpeak(int &f, int f1, int f2) { double peak = 0; f1 -= bw; if (f1 <= progdefaults.LowFreqCutoff) f1 = progdefaults.LowFreqCutoff; f2 += bw; if (f2 >= progdefaults.HighFreqCutoff) f2 = progdefaults.HighFreqCutoff; int fa = f2, fb = f1; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; if (!peak) return 0; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) return 0; f = (fa + fb) / 2; return peak / sigmin / bw; } double pskeval::peak(int &f0, int f1, int f2, double db) { double peak = 0; int fa = f2, fb = f1; double level = pow(10, (10 + db) / 10.0); //step 1 for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; if (((peak-sigmin) / sigmin ) < level) { return 0; } for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) { return 0; } f0 = (fa + fb) / 2; //step 2 f1 = f0 - 1.5*bw; if (f1 < bw) f1 = bw; f2 = f0 + 1.5*bw; fb = f1; fa = f2; peak = 0; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) { return 0; } f0 = (fa + fb) / 2; return (peak - sigmin) / sigmin ; } void pskeval::clear() { for (int i = 0; i < FFT_LEN; i++) sigpwr[i] = 0.0; } fldigi-4.1.06/src/psk/pskcoeff.cxx0000644000175000017500000001405113472115773013704 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "pskcoeff.h" // Linux PSK31 modem driver for soundcard -- Filter coefficients // // these FIR coefs are those used by G0TJZ in his TMC320C50 code // // Hansi Reiser, DL9RDZ, 20 April 1998 // #include // 65-tap raised-cosine FIR // implements // u[n] = (1.0 - cos(2PI * n / 64))/128.0 // used in gmfsk, twpsk etc. double gmfir1c[FIRLEN+1] = { 0.000000, //0 0.000038, //1 0.000150, //2 0.000336, //3 0.000595, //4 0.000922, //5 0.001317, //6 0.001773, //7 0.002288, //8 0.002856, //9 0.003472, //10 0.004130, //11 0.004823, //12 0.005545, //13 0.006288, //14 0.007047, //15 0.007812, //16 0.008578, //17 0.009337, //18 0.010080, //19 0.010802, //20 0.011495, //21 0.012153, //22 0.012769, //23 0.013337, //24 0.013852, //25 0.014308, //26 0.014703, //27 0.015030, //28 0.015289, //29 0.015475, //30 0.015587, //31 0.015625, //32 0.015587, //33 0.015475, //34 0.015289, //35 0.015030, //36 0.014703, //37 0.014308, //38 0.013852, //39 0.013337, //40 0.012769, //41 0.012153, //42 0.011495, //43 0.010802, //44 0.010080, //45 0.009337, //46 0.008578, //47 0.007813, //48 0.007047, //49 0.006288, //50 0.005545, //51 0.004823, //52 0.004130, //53 0.003472, //54 0.002856, //55 0.002288, //56 0.001773, //57 0.001317, //58 0.000922, //59 0.000595, //60 0.000336, //61 0.000150, //62 0.000038, //63 0.000000 //64 }; // 4-bit receive filter for 31.25 baud BPSK // Designed by G3PLX // double gmfir2c[FIRLEN+1] = { 0.000625000, 0.000820912, 0.001374651, 0.002188141, 0.003110600, 0.003956273, 0.004526787, 0.004635947, 0.004134515, 0.002932456, 0.001016352, -0.001539947, -0.004572751, -0.007834665, -0.011009254, -0.013733305, -0.015625000, -0.016315775, -0.015483216, -0.012882186, -0.008371423, -0.001933193, 0.006315933, 0.016124399, 0.027115485, 0.038807198, 0.050640928, 0.062016866, 0.072333574, 0.081028710, 0.087617820, 0.091728168, 0.093125000, 0.091728168, 0.087617820, 0.081028710, 0.072333574, 0.062016866, 0.050640928, 0.038807198, 0.027115485, 0.016124399, 0.006315933, -0.001933193, -0.008371423, -0.012882186, -0.015483216, -0.016315775, -0.015625000, -0.013733305, -0.011009254, -0.007834665, -0.004572751, -0.001539947, 0.001016352, 0.002932456, 0.004134515, 0.004635947, 0.004526787, 0.003956273, 0.003110600, 0.002188141, 0.001374651, 0.000820912, 0.000625000 }; // sync filter // weighting for sync samples // sum of all weights = 1.0 double syncfilt[16] = { -0.097545161, -0.093796555, -0.086443400, -0.075768274, -0.062181416, -0.046204960, -0.028452874, -0.009607360, 0.009607360, 0.028452874, 0.046204960, 0.062181416, 0.075768274, 0.086443400, 0.093796555, 0.097545161 }; double pskcore_filter[FIRLEN+1] = { 4.3453566e-005, //0 -0.00049122414, //1 -0.00078771292, //2 -0.0013507826, //3 -0.0021287814, //4 -0.003133466, //5 -0.004366817, //6 -0.0058112187, //7 -0.0074249976, //8 -0.0091398882, //9 -0.010860157, //10 -0.012464086, //11 -0.013807772, //12 -0.014731191, //13 -0.015067057, //14 -0.014650894, //15 -0.013333425, //16 -0.01099166, //17 -0.0075431246, //18 -0.0029527849, //19 0.0027546292, //20 0.0094932775, //21 0.017113308, //22 0.025403511, //23 0.034099681, //24 0.042895839, //25 0.051458575, //26 0.059444853, //27 0.066521003, //28 0.072381617, //29 0.076767694, //30 0.079481619, //31 0.080420311, //32 0.079481619, //33 0.076767694, //34 0.072381617, //35 0.066521003, //36 0.059444853, //37 0.051458575, //38 0.042895839, //39 0.034099681, //40 0.025403511, //41 0.017113308, //42 0.0094932775, //43 0.0027546292, //44 -0.0029527849, //45 -0.0075431246, //46 -0.01099166, //47 -0.013333425, //48 -0.014650894, //49 -0.015067057, //50 -0.014731191, //51 -0.013807772, //52 -0.012464086, //53 -0.010860157, //54 -0.0091398882, //55 -0.0074249976, //56 -0.0058112187, //57 -0.004366817, //58 -0.003133466, //59 -0.0021287814, //60 -0.0013507826, //61 -0.00078771292, //62 -0.00049122414, //63 4.3453566e-005 //64 }; // experimental filters (higher precision) // identical to the G0TJZ filter but with double precision // *firc should be double of len+1 void raisedcosfilt(double *firc, int len) { double k1 = M_PI * 2.0 / len; double k2 = 2.0 * len; for (int i = 0; i <= len; i++) firc[i] = ( 1.0 - cos( k1 * i ) ) / k2; } // *firc should be double of FIRLEN+1 // 33, 65, 129 ... void wsincfilt(double *firc, double fc, int len, bool blackman) { double normalize = 0; double k1 = 2.0 * M_PI / len; double k2 = 2.0 * M_PI * fc; double l2 = len / 2.0; // sin(x-tau)/(x-tau) for (int i = 0; i <= len; i++) if (i == l2) firc[i] = 1.0; else firc[i] = sin(k2 * (i - l2)) / (k2 * (i - l2)); // blackman window if (blackman) for (int i = 0; i <= len; i++) firc[i] = firc[i] * (0.42 - 0.5 * cos(k1 * i) + 0.08 * cos(2.0 * k1 * i)); // hamming window else for (int i = 0; i <= len; i++) firc[i] = firc[i] * (0.54 - 0.46 * cos(k1 * i)); // normalization factor for (int i = 0; i <= len; i++) normalize += firc[i]; // normalize the filter for (int i = 0; i <= len; i++) firc[i] /= normalize; } fldigi-4.1.06/src/libtiniconv/0000775000175000017500000000000013515625027013160 500000000000000fldigi-4.1.06/src/libtiniconv/tiniconv_int.h0000644000175000017500000000272013472116001015740 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 3 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef TINICONV_INT_H_ #define TINICONV_INT_H_ #include "tiniconv.h" #define RET_ILSEQ -1 #define RET_TOOFEW(n) (-2-(n)) #define RET_ILUNI -1 #define RET_TOOSMALL -2 extern const struct tiniconv_charset_map_entry_s { xxx_mb2wc_t mb2wc; xxx_flushwc_t flushwc; xxx_wc2mb_t wc2mb; xxx_reset_t reset; } tiniconv_charset_map[]; typedef struct { unsigned short indx; /* index into big table */ unsigned short used; /* bitmask of used entries */ } Summary16; #define TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(options) ((options >> 8) & 0xFF) #endif /*TINICONV_INT_H_*/ fldigi-4.1.06/src/libtiniconv/tiniconv.c0000644000175000017500000001011113472116001015052 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "tiniconv.h" #include "tiniconv_int.h" #include #include int tiniconv_init(int in_charset_id, int out_charset_id, int options, struct tiniconv_ctx_s *ctx) { assert(ctx != NULL); if (in_charset_id < 0 || in_charset_id >= TINICONV_CHARSETSIZE) return TINICONV_INIT_IN_CHARSET_NA; if (out_charset_id < 0 || out_charset_id >= TINICONV_CHARSETSIZE) return TINICONV_INIT_OUT_CHARSET_NA; memset(ctx, 0, sizeof(*ctx)); ctx->mb2wc = tiniconv_charset_map[in_charset_id].mb2wc; ctx->flushwc = tiniconv_charset_map[in_charset_id].flushwc; ctx->wc2mb = tiniconv_charset_map[out_charset_id].wc2mb; ctx->reset = tiniconv_charset_map[out_charset_id].reset; ctx->options = options; if (!TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(options)) ctx->options = ctx->options | TINICONV_OPTION_OUT_ILSEQ_CHAR('?'); return TINICONV_INIT_OK; } int tiniconv_convert(struct tiniconv_ctx_s *ctx, unsigned char const *in_buf, int in_size, int *p_in_size_consumed, unsigned char *out_buf, int out_size, int *p_out_size_consumed) { ucs4_t wc; int in_idx, out_idx; int result, last_result; conv_state_t last_istate; assert(ctx != NULL); assert(in_buf != NULL); assert(out_buf != NULL); for (in_idx = 0, out_idx = 0; in_idx < in_size && out_idx < out_size;) { last_istate = ctx->istate; /* typedef int (*xxx_mb2wc_t) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); */ result = ctx->mb2wc(ctx, &wc, in_buf + in_idx, in_size - in_idx); assert(result <= in_size - in_idx); if (result < 0) { if (result == RET_ILSEQ) { if (ctx->options & TINICONV_OPTION_IGNORE_IN_ILSEQ) { ctx->istate = 0; in_idx ++; continue; } else { result = TINICONV_CONVERT_IN_ILSEQ; goto exit; } } else if (result == RET_TOOSMALL) { result = TINICONV_CONVERT_IN_TOO_SMALL; goto exit; } else { in_idx += RET_TOOFEW(result); continue; } } in_idx += last_result = result; /* typedef int (*xxx_wc2mb_t) (conv_t conv, unsigned char *r, ucs4_t wc, int n); */ result = ctx->wc2mb(ctx, out_buf + out_idx, wc, out_size - out_idx); assert(result <= out_size - out_idx); if (result < 0) { if (result == RET_ILUNI) { if (ctx->options & TINICONV_OPTION_IGNORE_OUT_ILSEQ) { out_buf[out_idx ++] = TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(ctx->options); ctx->ostate = 0; continue; } else { result = TINICONV_CONVERT_OUT_ILSEQ; in_idx -= last_result; /* discarding the last read sequence */ ctx->istate = last_istate; goto exit; } } else if (result == RET_TOOSMALL) { result = TINICONV_CONVERT_OUT_TOO_SMALL; in_idx -= last_result; /* discarding the last read sequence */ ctx->istate = last_istate; goto exit; } } out_idx += result; } result = TINICONV_CONVERT_OK; exit: if (p_in_size_consumed) *p_in_size_consumed = in_idx; if (p_out_size_consumed) *p_out_size_consumed = out_idx; return result; } fldigi-4.1.06/src/libtiniconv/encdec/0000775000175000017500000000000013515625027014401 500000000000000fldigi-4.1.06/src/libtiniconv/encdec/jisx0201.h0000644000175000017500000000330713472116001015740 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0201.1976-0 */ static int jisx0201_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { if (c == 0x5c) *pwc = (ucs4_t) 0x00a5; else if (c == 0x7e) *pwc = (ucs4_t) 0x203e; else *pwc = (ucs4_t) c; return 1; } else { if (c >= 0xa1 && c < 0xe0) { *pwc = (ucs4_t) c + 0xfec0; return 1; } } return RET_ILSEQ; } static int jisx0201_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) { *r = wc; return 1; } if (wc == 0x00a5) { *r = 0x5c; return 1; } if (wc == 0x203e) { *r = 0x7e; return 1; } if (wc >= 0xff61 && wc < 0xffa0) { *r = wc - 0xfec0; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/mac_cyrillic.h0000644000175000017500000001310213472116001017104 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacCyrillic */ static const unsigned short mac_cyrillic_2uni[128] = { /* 0x80 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0x90 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x2202, 0x0408, 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, /* 0xc0 */ 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 0x044f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x00a4, }; static int mac_cyrillic_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80) *pwc = (ucs4_t) mac_cyrillic_2uni[c-0x80]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char mac_cyrillic_page00[32] = { 0xca, 0x00, 0xa2, 0xa3, 0xff, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char mac_cyrillic_page04[96] = { 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ }; static const unsigned char mac_cyrillic_page20[24] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page21[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_cyrillic_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = mac_cyrillic_page00[wc-0x00a0]; else if (wc == 0x00f7) c = 0xd6; else if (wc == 0x0192) c = 0xc4; else if (wc >= 0x0400 && wc < 0x0460) c = mac_cyrillic_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2028) c = mac_cyrillic_page20[wc-0x2010]; else if (wc >= 0x2110 && wc < 0x2128) c = mac_cyrillic_page21[wc-0x2110]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_cyrillic_page22[wc-0x2200]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/ces_big5.h0000644000175000017500000000356113472116001016142 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG-5 */ static int ces_big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) return big5_mbtowc(conv,pwc,s,2); else return RET_ILSEQ; } } return RET_ILSEQ; } static int ces_big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (BIG5) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/ces_gbk.h0000644000175000017500000000336613472116001016062 00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ static int ces_gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GBK) */ if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); return gbk_mbtowc(conv,pwc,s,2); } return RET_ILSEQ; } static int ces_gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GBK) */ ret = gbk_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/gbkext2.h0000644000175000017500000021261413472116001016031 00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/4 and GBK/5 extensions */ static const unsigned short gbkext2_2uni_pagea8[8272] = { /* 0xa8 */ 0x02ca, 0x02cb, 0x02d9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221f, 0x2223, 0x2252, 0x2266, 0x2267, 0x22bf, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, 0x2593, 0x2594, 0x2595, 0x25bc, 0x25bd, 0x25e2, 0x25e3, 0x25e4, 0x25e5, 0x2609, 0x2295, 0x3012, 0x301d, 0x301e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa9 */ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x32a3, 0x338e, 0x338f, 0x339c, 0x339d, 0x339e, 0x33a1, 0x33c4, 0x33ce, 0x33d1, 0x33d2, 0x33d5, 0xfe30, 0xffe2, 0xffe4, 0xfffd, 0x2121, 0x3231, 0xfffd, 0x2010, 0xfffd, 0xfffd, 0xfffd, 0x30fc, 0x309b, 0x309c, 0x30fd, 0x30fe, 0x3006, 0x309d, 0x309e, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xfe50, 0xfe51, 0xfe52, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f, 0xfe60, 0xfe61, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe68, 0xfe69, 0xfe6a, 0xfe6b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3007, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xaa */ 0x72dc, 0x72dd, 0x72df, 0x72e2, 0x72e3, 0x72e4, 0x72e5, 0x72e6, 0x72e7, 0x72ea, 0x72eb, 0x72f5, 0x72f6, 0x72f9, 0x72fd, 0x72fe, 0x72ff, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730b, 0x730c, 0x730d, 0x730f, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, 0x7319, 0x731a, 0x731f, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, 0x7328, 0x732d, 0x732f, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, 0x733a, 0x733b, 0x733c, 0x733d, 0x7340, 0x7341, 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x7349, 0x734a, 0x734b, 0x734c, 0x734e, 0x734f, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735a, 0x735b, 0x735c, 0x735d, 0x735e, 0x735f, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x7369, 0x736a, 0x736b, 0x736e, 0x7370, 0x7371, /* 0xab */ 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, 0x737a, 0x737b, 0x737c, 0x737d, 0x737f, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, 0x738a, 0x738c, 0x738d, 0x738f, 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739a, 0x739c, 0x739d, 0x739e, 0x73a0, 0x73a1, 0x73a3, 0x73a4, 0x73a5, 0x73a6, 0x73a7, 0x73a8, 0x73aa, 0x73ac, 0x73ad, 0x73b1, 0x73b4, 0x73b5, 0x73b6, 0x73b8, 0x73b9, 0x73bc, 0x73bd, 0x73be, 0x73bf, 0x73c1, 0x73c3, 0x73c4, 0x73c5, 0x73c6, 0x73c7, 0x73cb, 0x73cc, 0x73ce, 0x73d2, 0x73d3, 0x73d4, 0x73d5, 0x73d6, 0x73d7, 0x73d8, 0x73da, 0x73db, 0x73dc, 0x73dd, 0x73df, 0x73e1, 0x73e2, 0x73e3, 0x73e4, 0x73e6, 0x73e8, 0x73ea, 0x73eb, 0x73ec, 0x73ee, 0x73ef, 0x73f0, 0x73f1, 0x73f3, 0x73f4, 0x73f5, 0x73f6, 0x73f7, /* 0xac */ 0x73f8, 0x73f9, 0x73fa, 0x73fb, 0x73fc, 0x73fd, 0x73fe, 0x73ff, 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740b, 0x740c, 0x740d, 0x740e, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741c, 0x741d, 0x741e, 0x741f, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742b, 0x742d, 0x742f, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743a, 0x743b, 0x743d, 0x743e, 0x743f, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744a, 0x744b, 0x744c, 0x744d, 0x744e, 0x744f, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, 0x7458, 0x745d, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746a, 0x746b, 0x746c, 0x746e, 0x746f, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747a, /* 0xad */ 0x747b, 0x747c, 0x747d, 0x747f, 0x7482, 0x7484, 0x7485, 0x7486, 0x7488, 0x7489, 0x748a, 0x748c, 0x748d, 0x748f, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749a, 0x749b, 0x749d, 0x749f, 0x74a0, 0x74a1, 0x74a2, 0x74a3, 0x74a4, 0x74a5, 0x74a6, 0x74aa, 0x74ab, 0x74ac, 0x74ad, 0x74ae, 0x74af, 0x74b0, 0x74b1, 0x74b2, 0x74b3, 0x74b4, 0x74b5, 0x74b6, 0x74b7, 0x74b8, 0x74b9, 0x74bb, 0x74bc, 0x74bd, 0x74be, 0x74bf, 0x74c0, 0x74c1, 0x74c2, 0x74c3, 0x74c4, 0x74c5, 0x74c6, 0x74c7, 0x74c8, 0x74c9, 0x74ca, 0x74cb, 0x74cc, 0x74cd, 0x74ce, 0x74cf, 0x74d0, 0x74d1, 0x74d3, 0x74d4, 0x74d5, 0x74d6, 0x74d7, 0x74d8, 0x74d9, 0x74da, 0x74db, 0x74dd, 0x74df, 0x74e1, 0x74e5, 0x74e7, 0x74e8, 0x74e9, 0x74ea, 0x74eb, 0x74ec, 0x74ed, 0x74f0, 0x74f1, 0x74f2, /* 0xae */ 0x74f3, 0x74f5, 0x74f8, 0x74f9, 0x74fa, 0x74fb, 0x74fc, 0x74fd, 0x74fe, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, 0x750a, 0x750b, 0x750c, 0x750e, 0x7510, 0x7512, 0x7514, 0x7515, 0x7516, 0x7517, 0x751b, 0x751d, 0x751e, 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752a, 0x752e, 0x7534, 0x7536, 0x7539, 0x753c, 0x753d, 0x753f, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754a, 0x754d, 0x7550, 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755d, 0x755e, 0x755f, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756b, 0x756c, 0x756d, 0x756e, 0x756f, 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757a, 0x757b, 0x757c, 0x757d, 0x757e, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, /* 0xaf */ 0x7588, 0x7589, 0x758a, 0x758c, 0x758d, 0x758e, 0x7590, 0x7593, 0x7595, 0x7598, 0x759b, 0x759c, 0x759e, 0x75a2, 0x75a6, 0x75a7, 0x75a8, 0x75a9, 0x75aa, 0x75ad, 0x75b6, 0x75b7, 0x75ba, 0x75bb, 0x75bf, 0x75c0, 0x75c1, 0x75c6, 0x75cb, 0x75cc, 0x75ce, 0x75cf, 0x75d0, 0x75d1, 0x75d3, 0x75d7, 0x75d9, 0x75da, 0x75dc, 0x75dd, 0x75df, 0x75e0, 0x75e1, 0x75e5, 0x75e9, 0x75ec, 0x75ed, 0x75ee, 0x75ef, 0x75f2, 0x75f3, 0x75f5, 0x75f6, 0x75f7, 0x75f8, 0x75fa, 0x75fb, 0x75fd, 0x75fe, 0x7602, 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760b, 0x760d, 0x760e, 0x760f, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761a, 0x761c, 0x761d, 0x761e, 0x7621, 0x7623, 0x7627, 0x7628, 0x762c, 0x762e, 0x762f, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763a, 0x763b, 0x763d, 0x7641, 0x7642, 0x7644, /* 0xb0 */ 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764b, 0x764e, 0x764f, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765d, 0x765f, 0x7660, 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766c, 0x766d, 0x766e, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767a, 0x767c, 0x767f, 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768a, 0x768c, 0x768d, 0x768f, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769a, 0x769b, 0x769c, 0x769d, 0x769e, 0x769f, 0x76a0, 0x76a1, 0x76a2, 0x76a3, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76a9, 0x76aa, 0x76ab, 0x76ac, 0x76ad, 0x76af, 0x76b0, 0x76b3, 0x76b5, 0x76b6, 0x76b7, 0x76b8, 0x76b9, 0x76ba, 0x76bb, 0x76bc, 0x76bd, 0x76be, 0x76c0, 0x76c1, 0x76c3, /* 0xb1 */ 0x76c4, 0x76c7, 0x76c9, 0x76cb, 0x76cc, 0x76d3, 0x76d5, 0x76d9, 0x76da, 0x76dc, 0x76dd, 0x76de, 0x76e0, 0x76e1, 0x76e2, 0x76e3, 0x76e4, 0x76e6, 0x76e7, 0x76e8, 0x76e9, 0x76ea, 0x76eb, 0x76ec, 0x76ed, 0x76f0, 0x76f3, 0x76f5, 0x76f6, 0x76f7, 0x76fa, 0x76fb, 0x76fd, 0x76ff, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770a, 0x770c, 0x770e, 0x770f, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, 0x7718, 0x771b, 0x771c, 0x771d, 0x771e, 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772a, 0x772b, 0x772c, 0x772e, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773b, 0x773d, 0x773e, 0x773f, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774a, 0x774b, 0x774c, 0x774d, 0x774e, 0x774f, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775c, /* 0xb2 */ 0x775d, 0x775e, 0x775f, 0x7760, 0x7764, 0x7767, 0x7769, 0x776a, 0x776d, 0x776e, 0x776f, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778, 0x777a, 0x777b, 0x777c, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778a, 0x778b, 0x778f, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779a, 0x779b, 0x779c, 0x779d, 0x779e, 0x77a1, 0x77a3, 0x77a4, 0x77a6, 0x77a8, 0x77ab, 0x77ad, 0x77ae, 0x77af, 0x77b1, 0x77b2, 0x77b4, 0x77b6, 0x77b7, 0x77b8, 0x77b9, 0x77ba, 0x77bc, 0x77be, 0x77c0, 0x77c1, 0x77c2, 0x77c3, 0x77c4, 0x77c5, 0x77c6, 0x77c7, 0x77c8, 0x77c9, 0x77ca, 0x77cb, 0x77cc, 0x77ce, 0x77cf, 0x77d0, 0x77d1, 0x77d2, 0x77d3, 0x77d4, 0x77d5, 0x77d6, 0x77d8, 0x77d9, 0x77da, 0x77dd, 0x77de, 0x77df, 0x77e0, 0x77e1, 0x77e4, /* 0xb3 */ 0x77e6, 0x77e8, 0x77ea, 0x77ef, 0x77f0, 0x77f1, 0x77f2, 0x77f4, 0x77f5, 0x77f7, 0x77f9, 0x77fa, 0x77fb, 0x77fc, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, 0x780a, 0x780b, 0x780e, 0x780f, 0x7810, 0x7813, 0x7815, 0x7819, 0x781b, 0x781e, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782a, 0x782b, 0x782e, 0x782f, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, 0x783d, 0x783f, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784a, 0x784b, 0x784d, 0x784f, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785a, 0x785b, 0x785c, 0x785e, 0x785f, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786f, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787a, 0x787b, 0x787d, 0x787e, 0x787f, 0x7880, 0x7881, 0x7882, 0x7883, /* 0xb4 */ 0x7884, 0x7885, 0x7886, 0x7888, 0x788a, 0x788b, 0x788f, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789d, 0x789e, 0x78a0, 0x78a2, 0x78a4, 0x78a6, 0x78a8, 0x78a9, 0x78aa, 0x78ab, 0x78ac, 0x78ad, 0x78ae, 0x78af, 0x78b5, 0x78b6, 0x78b7, 0x78b8, 0x78ba, 0x78bb, 0x78bc, 0x78bd, 0x78bf, 0x78c0, 0x78c2, 0x78c3, 0x78c4, 0x78c6, 0x78c7, 0x78c8, 0x78cc, 0x78cd, 0x78ce, 0x78cf, 0x78d1, 0x78d2, 0x78d3, 0x78d6, 0x78d7, 0x78d8, 0x78da, 0x78db, 0x78dc, 0x78dd, 0x78de, 0x78df, 0x78e0, 0x78e1, 0x78e2, 0x78e3, 0x78e4, 0x78e5, 0x78e6, 0x78e7, 0x78e9, 0x78ea, 0x78eb, 0x78ed, 0x78ee, 0x78ef, 0x78f0, 0x78f1, 0x78f3, 0x78f5, 0x78f6, 0x78f8, 0x78f9, 0x78fb, 0x78fc, 0x78fd, 0x78fe, 0x78ff, 0x7900, 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790a, 0x790b, 0x790c, /* 0xb5 */ 0x790d, 0x790e, 0x790f, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919, 0x791a, 0x791b, 0x791c, 0x791d, 0x791f, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, 0x7928, 0x7929, 0x792a, 0x792b, 0x792c, 0x792d, 0x792e, 0x792f, 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793d, 0x793f, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, 0x794a, 0x794b, 0x794c, 0x794d, 0x794e, 0x794f, 0x7950, 0x7951, 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964, 0x7966, 0x7969, 0x796a, 0x796b, 0x796c, 0x796e, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797b, 0x797c, 0x797d, 0x797e, 0x797f, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, 0x7989, 0x798b, 0x798c, 0x798d, 0x798e, 0x7990, 0x7991, 0x7992, /* 0xb6 */ 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799b, 0x799c, 0x799d, 0x799e, 0x799f, 0x79a0, 0x79a1, 0x79a2, 0x79a3, 0x79a4, 0x79a5, 0x79a6, 0x79a8, 0x79a9, 0x79aa, 0x79ab, 0x79ac, 0x79ad, 0x79ae, 0x79af, 0x79b0, 0x79b1, 0x79b2, 0x79b4, 0x79b5, 0x79b6, 0x79b7, 0x79b8, 0x79bc, 0x79bf, 0x79c2, 0x79c4, 0x79c5, 0x79c7, 0x79c8, 0x79ca, 0x79cc, 0x79ce, 0x79cf, 0x79d0, 0x79d3, 0x79d4, 0x79d6, 0x79d7, 0x79d9, 0x79da, 0x79db, 0x79dc, 0x79dd, 0x79de, 0x79e0, 0x79e1, 0x79e2, 0x79e5, 0x79e8, 0x79ea, 0x79ec, 0x79ee, 0x79f1, 0x79f2, 0x79f3, 0x79f4, 0x79f5, 0x79f6, 0x79f7, 0x79f9, 0x79fa, 0x79fc, 0x79fe, 0x79ff, 0x7a01, 0x7a04, 0x7a05, 0x7a07, 0x7a08, 0x7a09, 0x7a0a, 0x7a0c, 0x7a0f, 0x7a10, 0x7a11, 0x7a12, 0x7a13, 0x7a15, 0x7a16, 0x7a18, 0x7a19, 0x7a1b, 0x7a1c, /* 0xb7 */ 0x7a1d, 0x7a1f, 0x7a21, 0x7a22, 0x7a24, 0x7a25, 0x7a26, 0x7a27, 0x7a28, 0x7a29, 0x7a2a, 0x7a2b, 0x7a2c, 0x7a2d, 0x7a2e, 0x7a2f, 0x7a30, 0x7a31, 0x7a32, 0x7a34, 0x7a35, 0x7a36, 0x7a38, 0x7a3a, 0x7a3e, 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x7a44, 0x7a45, 0x7a47, 0x7a48, 0x7a49, 0x7a4a, 0x7a4b, 0x7a4c, 0x7a4d, 0x7a4e, 0x7a4f, 0x7a50, 0x7a52, 0x7a53, 0x7a54, 0x7a55, 0x7a56, 0x7a58, 0x7a59, 0x7a5a, 0x7a5b, 0x7a5c, 0x7a5d, 0x7a5e, 0x7a5f, 0x7a60, 0x7a61, 0x7a62, 0x7a63, 0x7a64, 0x7a65, 0x7a66, 0x7a67, 0x7a68, 0x7a69, 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x7a6e, 0x7a6f, 0x7a71, 0x7a72, 0x7a73, 0x7a75, 0x7a7b, 0x7a7c, 0x7a7d, 0x7a7e, 0x7a82, 0x7a85, 0x7a87, 0x7a89, 0x7a8a, 0x7a8b, 0x7a8c, 0x7a8e, 0x7a8f, 0x7a90, 0x7a93, 0x7a94, 0x7a99, 0x7a9a, 0x7a9b, 0x7a9e, 0x7aa1, 0x7aa2, /* 0xb8 */ 0x7aa3, 0x7aa4, 0x7aa7, 0x7aa9, 0x7aaa, 0x7aab, 0x7aae, 0x7aaf, 0x7ab0, 0x7ab1, 0x7ab2, 0x7ab4, 0x7ab5, 0x7ab6, 0x7ab7, 0x7ab8, 0x7ab9, 0x7aba, 0x7abb, 0x7abc, 0x7abd, 0x7abe, 0x7ac0, 0x7ac1, 0x7ac2, 0x7ac3, 0x7ac4, 0x7ac5, 0x7ac6, 0x7ac7, 0x7ac8, 0x7ac9, 0x7aca, 0x7acc, 0x7acd, 0x7ace, 0x7acf, 0x7ad0, 0x7ad1, 0x7ad2, 0x7ad3, 0x7ad4, 0x7ad5, 0x7ad7, 0x7ad8, 0x7ada, 0x7adb, 0x7adc, 0x7add, 0x7ae1, 0x7ae2, 0x7ae4, 0x7ae7, 0x7ae8, 0x7ae9, 0x7aea, 0x7aeb, 0x7aec, 0x7aee, 0x7af0, 0x7af1, 0x7af2, 0x7af3, 0x7af4, 0x7af5, 0x7af6, 0x7af7, 0x7af8, 0x7afb, 0x7afc, 0x7afe, 0x7b00, 0x7b01, 0x7b02, 0x7b05, 0x7b07, 0x7b09, 0x7b0c, 0x7b0d, 0x7b0e, 0x7b10, 0x7b12, 0x7b13, 0x7b16, 0x7b17, 0x7b18, 0x7b1a, 0x7b1c, 0x7b1d, 0x7b1f, 0x7b21, 0x7b22, 0x7b23, 0x7b27, 0x7b29, 0x7b2d, /* 0xb9 */ 0x7b2f, 0x7b30, 0x7b32, 0x7b34, 0x7b35, 0x7b36, 0x7b37, 0x7b39, 0x7b3b, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, 0x7b46, 0x7b48, 0x7b4a, 0x7b4d, 0x7b4e, 0x7b53, 0x7b55, 0x7b57, 0x7b59, 0x7b5c, 0x7b5e, 0x7b5f, 0x7b61, 0x7b63, 0x7b64, 0x7b65, 0x7b66, 0x7b67, 0x7b68, 0x7b69, 0x7b6a, 0x7b6b, 0x7b6c, 0x7b6d, 0x7b6f, 0x7b70, 0x7b73, 0x7b74, 0x7b76, 0x7b78, 0x7b7a, 0x7b7c, 0x7b7d, 0x7b7f, 0x7b81, 0x7b82, 0x7b83, 0x7b84, 0x7b86, 0x7b87, 0x7b88, 0x7b89, 0x7b8a, 0x7b8b, 0x7b8c, 0x7b8e, 0x7b8f, 0x7b91, 0x7b92, 0x7b93, 0x7b96, 0x7b98, 0x7b99, 0x7b9a, 0x7b9b, 0x7b9e, 0x7b9f, 0x7ba0, 0x7ba3, 0x7ba4, 0x7ba5, 0x7bae, 0x7baf, 0x7bb0, 0x7bb2, 0x7bb3, 0x7bb5, 0x7bb6, 0x7bb7, 0x7bb9, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bbe, 0x7bbf, 0x7bc0, 0x7bc2, 0x7bc3, 0x7bc4, /* 0xba */ 0x7bc5, 0x7bc8, 0x7bc9, 0x7bca, 0x7bcb, 0x7bcd, 0x7bce, 0x7bcf, 0x7bd0, 0x7bd2, 0x7bd4, 0x7bd5, 0x7bd6, 0x7bd7, 0x7bd8, 0x7bdb, 0x7bdc, 0x7bde, 0x7bdf, 0x7be0, 0x7be2, 0x7be3, 0x7be4, 0x7be7, 0x7be8, 0x7be9, 0x7beb, 0x7bec, 0x7bed, 0x7bef, 0x7bf0, 0x7bf2, 0x7bf3, 0x7bf4, 0x7bf5, 0x7bf6, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfb, 0x7bfd, 0x7bff, 0x7c00, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c05, 0x7c06, 0x7c08, 0x7c09, 0x7c0a, 0x7c0d, 0x7c0e, 0x7c10, 0x7c11, 0x7c12, 0x7c13, 0x7c14, 0x7c15, 0x7c17, 0x7c18, 0x7c19, 0x7c1a, 0x7c1b, 0x7c1c, 0x7c1d, 0x7c1e, 0x7c20, 0x7c21, 0x7c22, 0x7c23, 0x7c24, 0x7c25, 0x7c28, 0x7c29, 0x7c2b, 0x7c2c, 0x7c2d, 0x7c2e, 0x7c2f, 0x7c30, 0x7c31, 0x7c32, 0x7c33, 0x7c34, 0x7c35, 0x7c36, 0x7c37, 0x7c39, 0x7c3a, 0x7c3b, 0x7c3c, 0x7c3d, 0x7c3e, 0x7c42, /* 0xbb */ 0x7c43, 0x7c44, 0x7c45, 0x7c46, 0x7c47, 0x7c48, 0x7c49, 0x7c4a, 0x7c4b, 0x7c4c, 0x7c4e, 0x7c4f, 0x7c50, 0x7c51, 0x7c52, 0x7c53, 0x7c54, 0x7c55, 0x7c56, 0x7c57, 0x7c58, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, 0x7c5f, 0x7c60, 0x7c61, 0x7c62, 0x7c63, 0x7c64, 0x7c65, 0x7c66, 0x7c67, 0x7c68, 0x7c69, 0x7c6a, 0x7c6b, 0x7c6c, 0x7c6d, 0x7c6e, 0x7c6f, 0x7c70, 0x7c71, 0x7c72, 0x7c75, 0x7c76, 0x7c77, 0x7c78, 0x7c79, 0x7c7a, 0x7c7e, 0x7c7f, 0x7c80, 0x7c81, 0x7c82, 0x7c83, 0x7c84, 0x7c85, 0x7c86, 0x7c87, 0x7c88, 0x7c8a, 0x7c8b, 0x7c8c, 0x7c8d, 0x7c8e, 0x7c8f, 0x7c90, 0x7c93, 0x7c94, 0x7c96, 0x7c99, 0x7c9a, 0x7c9b, 0x7ca0, 0x7ca1, 0x7ca3, 0x7ca6, 0x7ca7, 0x7ca8, 0x7ca9, 0x7cab, 0x7cac, 0x7cad, 0x7caf, 0x7cb0, 0x7cb4, 0x7cb5, 0x7cb6, 0x7cb7, 0x7cb8, 0x7cba, 0x7cbb, /* 0xbc */ 0x7cbf, 0x7cc0, 0x7cc2, 0x7cc3, 0x7cc4, 0x7cc6, 0x7cc9, 0x7ccb, 0x7cce, 0x7ccf, 0x7cd0, 0x7cd1, 0x7cd2, 0x7cd3, 0x7cd4, 0x7cd8, 0x7cda, 0x7cdb, 0x7cdd, 0x7cde, 0x7ce1, 0x7ce2, 0x7ce3, 0x7ce4, 0x7ce5, 0x7ce6, 0x7ce7, 0x7ce9, 0x7cea, 0x7ceb, 0x7cec, 0x7ced, 0x7cee, 0x7cf0, 0x7cf1, 0x7cf2, 0x7cf3, 0x7cf4, 0x7cf5, 0x7cf6, 0x7cf7, 0x7cf9, 0x7cfa, 0x7cfc, 0x7cfd, 0x7cfe, 0x7cff, 0x7d00, 0x7d01, 0x7d02, 0x7d03, 0x7d04, 0x7d05, 0x7d06, 0x7d07, 0x7d08, 0x7d09, 0x7d0b, 0x7d0c, 0x7d0d, 0x7d0e, 0x7d0f, 0x7d10, 0x7d11, 0x7d12, 0x7d13, 0x7d14, 0x7d15, 0x7d16, 0x7d17, 0x7d18, 0x7d19, 0x7d1a, 0x7d1b, 0x7d1c, 0x7d1d, 0x7d1e, 0x7d1f, 0x7d21, 0x7d23, 0x7d24, 0x7d25, 0x7d26, 0x7d28, 0x7d29, 0x7d2a, 0x7d2c, 0x7d2d, 0x7d2e, 0x7d30, 0x7d31, 0x7d32, 0x7d33, 0x7d34, 0x7d35, 0x7d36, /* 0xbd */ 0x7d37, 0x7d38, 0x7d39, 0x7d3a, 0x7d3b, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d3f, 0x7d40, 0x7d41, 0x7d42, 0x7d43, 0x7d44, 0x7d45, 0x7d46, 0x7d47, 0x7d48, 0x7d49, 0x7d4a, 0x7d4b, 0x7d4c, 0x7d4d, 0x7d4e, 0x7d4f, 0x7d50, 0x7d51, 0x7d52, 0x7d53, 0x7d54, 0x7d55, 0x7d56, 0x7d57, 0x7d58, 0x7d59, 0x7d5a, 0x7d5b, 0x7d5c, 0x7d5d, 0x7d5e, 0x7d5f, 0x7d60, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x7d66, 0x7d67, 0x7d68, 0x7d69, 0x7d6a, 0x7d6b, 0x7d6c, 0x7d6d, 0x7d6f, 0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d75, 0x7d76, 0x7d78, 0x7d79, 0x7d7a, 0x7d7b, 0x7d7c, 0x7d7d, 0x7d7e, 0x7d7f, 0x7d80, 0x7d81, 0x7d82, 0x7d83, 0x7d84, 0x7d85, 0x7d86, 0x7d87, 0x7d88, 0x7d89, 0x7d8a, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d8e, 0x7d8f, 0x7d90, 0x7d91, 0x7d92, 0x7d93, 0x7d94, 0x7d95, 0x7d96, 0x7d97, 0x7d98, /* 0xbe */ 0x7d99, 0x7d9a, 0x7d9b, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0, 0x7da1, 0x7da2, 0x7da3, 0x7da4, 0x7da5, 0x7da7, 0x7da8, 0x7da9, 0x7daa, 0x7dab, 0x7dac, 0x7dad, 0x7daf, 0x7db0, 0x7db1, 0x7db2, 0x7db3, 0x7db4, 0x7db5, 0x7db6, 0x7db7, 0x7db8, 0x7db9, 0x7dba, 0x7dbb, 0x7dbc, 0x7dbd, 0x7dbe, 0x7dbf, 0x7dc0, 0x7dc1, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dc7, 0x7dc8, 0x7dc9, 0x7dca, 0x7dcb, 0x7dcc, 0x7dcd, 0x7dce, 0x7dcf, 0x7dd0, 0x7dd1, 0x7dd2, 0x7dd3, 0x7dd4, 0x7dd5, 0x7dd6, 0x7dd7, 0x7dd8, 0x7dd9, 0x7dda, 0x7ddb, 0x7ddc, 0x7ddd, 0x7dde, 0x7ddf, 0x7de0, 0x7de1, 0x7de2, 0x7de3, 0x7de4, 0x7de5, 0x7de6, 0x7de7, 0x7de8, 0x7de9, 0x7dea, 0x7deb, 0x7dec, 0x7ded, 0x7dee, 0x7def, 0x7df0, 0x7df1, 0x7df2, 0x7df3, 0x7df4, 0x7df5, 0x7df6, 0x7df7, 0x7df8, 0x7df9, 0x7dfa, /* 0xbf */ 0x7dfb, 0x7dfc, 0x7dfd, 0x7dfe, 0x7dff, 0x7e00, 0x7e01, 0x7e02, 0x7e03, 0x7e04, 0x7e05, 0x7e06, 0x7e07, 0x7e08, 0x7e09, 0x7e0a, 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, 0x7e10, 0x7e11, 0x7e12, 0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, 0x7e18, 0x7e19, 0x7e1a, 0x7e1b, 0x7e1c, 0x7e1d, 0x7e1e, 0x7e1f, 0x7e20, 0x7e21, 0x7e22, 0x7e23, 0x7e24, 0x7e25, 0x7e26, 0x7e27, 0x7e28, 0x7e29, 0x7e2a, 0x7e2b, 0x7e2c, 0x7e2d, 0x7e2e, 0x7e2f, 0x7e30, 0x7e31, 0x7e32, 0x7e33, 0x7e34, 0x7e35, 0x7e36, 0x7e37, 0x7e38, 0x7e39, 0x7e3a, 0x7e3c, 0x7e3d, 0x7e3e, 0x7e3f, 0x7e40, 0x7e42, 0x7e43, 0x7e44, 0x7e45, 0x7e46, 0x7e48, 0x7e49, 0x7e4a, 0x7e4b, 0x7e4c, 0x7e4d, 0x7e4e, 0x7e4f, 0x7e50, 0x7e51, 0x7e52, 0x7e53, 0x7e54, 0x7e55, 0x7e56, 0x7e57, 0x7e58, 0x7e59, 0x7e5a, 0x7e5b, 0x7e5c, 0x7e5d, /* 0xc0 */ 0x7e5e, 0x7e5f, 0x7e60, 0x7e61, 0x7e62, 0x7e63, 0x7e64, 0x7e65, 0x7e66, 0x7e67, 0x7e68, 0x7e69, 0x7e6a, 0x7e6b, 0x7e6c, 0x7e6d, 0x7e6e, 0x7e6f, 0x7e70, 0x7e71, 0x7e72, 0x7e73, 0x7e74, 0x7e75, 0x7e76, 0x7e77, 0x7e78, 0x7e79, 0x7e7a, 0x7e7b, 0x7e7c, 0x7e7d, 0x7e7e, 0x7e7f, 0x7e80, 0x7e81, 0x7e83, 0x7e84, 0x7e85, 0x7e86, 0x7e87, 0x7e88, 0x7e89, 0x7e8a, 0x7e8b, 0x7e8c, 0x7e8d, 0x7e8e, 0x7e8f, 0x7e90, 0x7e91, 0x7e92, 0x7e93, 0x7e94, 0x7e95, 0x7e96, 0x7e97, 0x7e98, 0x7e99, 0x7e9a, 0x7e9c, 0x7e9d, 0x7e9e, 0x7eae, 0x7eb4, 0x7ebb, 0x7ebc, 0x7ed6, 0x7ee4, 0x7eec, 0x7ef9, 0x7f0a, 0x7f10, 0x7f1e, 0x7f37, 0x7f39, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f40, 0x7f41, 0x7f43, 0x7f46, 0x7f47, 0x7f48, 0x7f49, 0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f, 0x7f52, 0x7f53, /* 0xc1 */ 0x7f56, 0x7f59, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f60, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f67, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6f, 0x7f70, 0x7f73, 0x7f75, 0x7f76, 0x7f77, 0x7f78, 0x7f7a, 0x7f7b, 0x7f7c, 0x7f7d, 0x7f7f, 0x7f80, 0x7f82, 0x7f83, 0x7f84, 0x7f85, 0x7f86, 0x7f87, 0x7f88, 0x7f89, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f90, 0x7f91, 0x7f92, 0x7f93, 0x7f95, 0x7f96, 0x7f97, 0x7f98, 0x7f99, 0x7f9b, 0x7f9c, 0x7fa0, 0x7fa2, 0x7fa3, 0x7fa5, 0x7fa6, 0x7fa8, 0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7fb1, 0x7fb3, 0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7, 0x7fba, 0x7fbb, 0x7fbe, 0x7fc0, 0x7fc2, 0x7fc3, 0x7fc4, 0x7fc6, 0x7fc7, 0x7fc8, 0x7fc9, 0x7fcb, 0x7fcd, 0x7fcf, 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd6, 0x7fd7, 0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fe2, 0x7fe3, /* 0xc2 */ 0x7fe4, 0x7fe7, 0x7fe8, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fef, 0x7ff2, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff, 0x8002, 0x8007, 0x8008, 0x8009, 0x800a, 0x800e, 0x800f, 0x8011, 0x8013, 0x801a, 0x801b, 0x801d, 0x801e, 0x801f, 0x8021, 0x8023, 0x8024, 0x802b, 0x802c, 0x802d, 0x802e, 0x802f, 0x8030, 0x8032, 0x8034, 0x8039, 0x803a, 0x803c, 0x803e, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804e, 0x804f, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059, 0x805b, 0x805c, 0x805d, 0x805e, 0x805f, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806b, 0x806c, 0x806d, 0x806e, 0x806f, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807a, 0x807b, 0x807c, 0x807d, /* 0xc3 */ 0x807e, 0x8081, 0x8082, 0x8085, 0x8088, 0x808a, 0x808d, 0x808e, 0x808f, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, 0x809e, 0x80a3, 0x80a6, 0x80a7, 0x80a8, 0x80ac, 0x80b0, 0x80b3, 0x80b5, 0x80b6, 0x80b8, 0x80b9, 0x80bb, 0x80c5, 0x80c7, 0x80c8, 0x80c9, 0x80ca, 0x80cb, 0x80cf, 0x80d0, 0x80d1, 0x80d2, 0x80d3, 0x80d4, 0x80d5, 0x80d8, 0x80df, 0x80e0, 0x80e2, 0x80e3, 0x80e6, 0x80ee, 0x80f5, 0x80f7, 0x80f9, 0x80fb, 0x80fe, 0x80ff, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810b, 0x810c, 0x8115, 0x8117, 0x8119, 0x811b, 0x811c, 0x811d, 0x811f, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812a, 0x812b, 0x812d, 0x812e, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813f, /* 0xc4 */ 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, 0x814d, 0x814e, 0x814f, 0x8152, 0x8156, 0x8157, 0x8158, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8161, 0x8162, 0x8163, 0x8164, 0x8166, 0x8168, 0x816a, 0x816b, 0x816c, 0x816f, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818b, 0x818c, 0x818d, 0x818e, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819a, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a4, 0x81a5, 0x81a7, 0x81a9, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c4, 0x81c5, 0x81c7, 0x81c8, 0x81c9, 0x81cb, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, /* 0xc5 */ 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e4, 0x81e5, 0x81e6, 0x81e8, 0x81e9, 0x81eb, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fd, 0x81ff, 0x8203, 0x8207, 0x8208, 0x8209, 0x820a, 0x820b, 0x820e, 0x820f, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, 0x8219, 0x821a, 0x821d, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, 0x8229, 0x822e, 0x8232, 0x823a, 0x823c, 0x823d, 0x823f, 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824a, 0x824c, 0x824d, 0x824e, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8259, 0x825b, 0x825c, 0x825d, 0x825e, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, /* 0xc6 */ 0x826a, 0x826b, 0x826c, 0x826d, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827b, 0x827c, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, 0x828c, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829a, 0x829b, 0x829e, 0x82a0, 0x82a2, 0x82a3, 0x82a7, 0x82b2, 0x82b5, 0x82b6, 0x82ba, 0x82bb, 0x82bc, 0x82bf, 0x82c0, 0x82c2, 0x82c3, 0x82c5, 0x82c6, 0x82c9, 0x82d0, 0x82d6, 0x82d9, 0x82da, 0x82dd, 0x82e2, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82ec, 0x82ed, 0x82ee, 0x82f0, 0x82f2, 0x82f3, 0x82f5, 0x82f6, 0x82f8, 0x82fa, 0x82fc, 0x82fd, 0x82fe, 0x82ff, 0x8300, 0x830a, 0x830b, 0x830d, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831d, 0x831e, 0x831f, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8329, 0x832a, 0x832e, 0x8330, 0x8332, 0x8337, 0x833b, 0x833d, /* 0xc7 */ 0x833e, 0x833f, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835d, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, 0x837a, 0x837e, 0x837f, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838a, 0x838b, 0x838c, 0x838d, 0x838f, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839a, 0x839d, 0x839f, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b5, 0x83bb, 0x83be, 0x83bf, 0x83c2, 0x83c3, 0x83c4, 0x83c6, 0x83c8, 0x83c9, 0x83cb, 0x83cd, 0x83ce, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d5, 0x83d7, 0x83d9, 0x83da, 0x83db, 0x83de, 0x83e2, 0x83e3, 0x83e4, 0x83e6, 0x83e7, 0x83e8, 0x83eb, 0x83ec, 0x83ed, /* 0xc8 */ 0x83ee, 0x83ef, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83fa, 0x83fb, 0x83fc, 0x83fe, 0x83ff, 0x8400, 0x8402, 0x8405, 0x8407, 0x8408, 0x8409, 0x840a, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841a, 0x841b, 0x841e, 0x841f, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842a, 0x842b, 0x842c, 0x842d, 0x842e, 0x842f, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8439, 0x843a, 0x843b, 0x843e, 0x843f, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845d, 0x845e, 0x845f, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846a, 0x846e, 0x846f, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847b, 0x847c, /* 0xc9 */ 0x847d, 0x847e, 0x847f, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, 0x8486, 0x848a, 0x848d, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8498, 0x849a, 0x849b, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84b0, 0x84b1, 0x84b3, 0x84b5, 0x84b6, 0x84b7, 0x84bb, 0x84bc, 0x84be, 0x84c0, 0x84c2, 0x84c3, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84cb, 0x84cc, 0x84ce, 0x84cf, 0x84d2, 0x84d4, 0x84d5, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84de, 0x84e1, 0x84e2, 0x84e4, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ed, 0x84ee, 0x84ef, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fd, 0x84fe, 0x8500, 0x8501, 0x8502, /* 0xca */ 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850a, 0x850b, 0x850d, 0x850e, 0x850f, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, 0x8519, 0x851b, 0x851c, 0x851d, 0x851e, 0x8520, 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852a, 0x852d, 0x852e, 0x852f, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853e, 0x853f, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, 0x8546, 0x8547, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8557, 0x8558, 0x855a, 0x855b, 0x855c, 0x855d, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8577, 0x8578, 0x857c, 0x857d, 0x857f, 0x8580, 0x8581, /* 0xcb */ 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a5, 0x85a6, 0x85a7, 0x85a9, 0x85ab, 0x85ac, 0x85ad, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b8, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85d1, 0x85d2, 0x85d4, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, /* 0xcc */ 0x85f9, 0x85fa, 0x85fc, 0x85fd, 0x85fe, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860a, 0x860b, 0x860c, 0x860d, 0x860e, 0x860f, 0x8610, 0x8612, 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861a, 0x861b, 0x861c, 0x861d, 0x861e, 0x861f, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8628, 0x862a, 0x862b, 0x862c, 0x862d, 0x862e, 0x862f, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863a, 0x863b, 0x863d, 0x863e, 0x863f, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x8652, 0x8653, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865b, 0x865c, 0x865d, 0x865f, 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, /* 0xcd */ 0x866d, 0x866f, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a5, 0x86a6, 0x86ab, 0x86ad, 0x86ae, 0x86b2, 0x86b3, 0x86b7, 0x86b8, 0x86b9, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c1, 0x86c2, 0x86c3, 0x86c5, 0x86c8, 0x86cc, 0x86cd, 0x86d2, 0x86d3, 0x86d5, 0x86d6, 0x86d7, 0x86da, 0x86dc, 0x86dd, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86ea, 0x86eb, 0x86ec, 0x86ef, 0x86f5, 0x86f6, 0x86f7, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86ff, 0x8701, 0x8704, 0x8705, 0x8706, 0x870b, 0x870c, 0x870e, 0x870f, 0x8710, 0x8711, 0x8714, 0x8716, /* 0xce */ 0x8719, 0x871b, 0x871d, 0x871f, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872a, 0x872b, 0x872c, 0x872d, 0x872f, 0x8730, 0x8732, 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873a, 0x873c, 0x873d, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874a, 0x874b, 0x874d, 0x874f, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876f, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, 0x8778, 0x8779, 0x877a, 0x877f, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, 0x878a, 0x878c, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, /* 0xcf */ 0x87a5, 0x87a6, 0x87a7, 0x87a9, 0x87aa, 0x87ae, 0x87b0, 0x87b1, 0x87b2, 0x87b4, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87bb, 0x87bc, 0x87be, 0x87bf, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c7, 0x87c8, 0x87c9, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87eb, 0x87ec, 0x87ed, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87ff, 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880b, 0x880c, 0x880d, 0x880e, 0x880f, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881a, 0x881c, 0x881d, 0x881e, 0x881f, 0x8820, 0x8823, /* 0xd0 */ 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882a, 0x882b, 0x882c, 0x882d, 0x882e, 0x882f, 0x8830, 0x8831, 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883a, 0x883b, 0x883d, 0x883e, 0x883f, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, 0x884a, 0x884b, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8866, 0x8867, 0x886a, 0x886d, 0x886f, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888a, 0x888c, 0x888e, 0x888f, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a3, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, /* 0xd1 */ 0x88ac, 0x88ae, 0x88af, 0x88b0, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c3, 0x88c4, 0x88c7, 0x88c8, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88cf, 0x88d0, 0x88d1, 0x88d3, 0x88d6, 0x88d7, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88e0, 0x88e1, 0x88e6, 0x88e7, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f2, 0x88f5, 0x88f6, 0x88f7, 0x88fa, 0x88fb, 0x88fd, 0x88ff, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909, 0x890b, 0x890c, 0x890d, 0x890e, 0x890f, 0x8911, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x891c, 0x891d, 0x891e, 0x891f, 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892c, 0x892d, 0x892e, 0x892f, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, /* 0xd2 */ 0x8938, 0x8939, 0x893a, 0x893b, 0x893c, 0x893d, 0x893e, 0x893f, 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897c, 0x897d, 0x897e, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, /* 0xd3 */ 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c3, 0x89cd, 0x89d3, 0x89d4, 0x89d5, 0x89d7, 0x89d8, 0x89d9, 0x89db, 0x89dd, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e4, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89ec, 0x89ed, 0x89ee, 0x89f0, 0x89f1, 0x89f2, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x89ff, 0x8a01, 0x8a02, 0x8a03, 0x8a04, 0x8a05, 0x8a06, 0x8a08, 0x8a09, 0x8a0a, 0x8a0b, 0x8a0c, 0x8a0d, 0x8a0e, 0x8a0f, 0x8a10, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, 0x8a16, 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a1b, 0x8a1c, 0x8a1d, /* 0xd4 */ 0x8a1e, 0x8a1f, 0x8a20, 0x8a21, 0x8a22, 0x8a23, 0x8a24, 0x8a25, 0x8a26, 0x8a27, 0x8a28, 0x8a29, 0x8a2a, 0x8a2b, 0x8a2c, 0x8a2d, 0x8a2e, 0x8a2f, 0x8a30, 0x8a31, 0x8a32, 0x8a33, 0x8a34, 0x8a35, 0x8a36, 0x8a37, 0x8a38, 0x8a39, 0x8a3a, 0x8a3b, 0x8a3c, 0x8a3d, 0x8a3f, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a7f, 0x8a80, /* 0xd5 */ 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, /* 0xd6 */ 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8aff, 0x8b00, 0x8b01, 0x8b02, 0x8b03, 0x8b04, 0x8b05, 0x8b06, 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b0c, 0x8b0d, 0x8b0e, 0x8b0f, 0x8b10, 0x8b11, 0x8b12, 0x8b13, 0x8b14, 0x8b15, 0x8b16, 0x8b17, 0x8b18, 0x8b19, 0x8b1a, 0x8b1b, 0x8b1c, 0x8b1d, 0x8b1e, 0x8b1f, 0x8b20, 0x8b21, 0x8b22, 0x8b23, 0x8b24, 0x8b25, 0x8b27, 0x8b28, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b2d, 0x8b2e, 0x8b2f, 0x8b30, 0x8b31, 0x8b32, 0x8b33, 0x8b34, 0x8b35, 0x8b36, 0x8b37, 0x8b38, 0x8b39, 0x8b3a, 0x8b3b, 0x8b3c, 0x8b3d, 0x8b3e, 0x8b3f, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, /* 0xd7 */ 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b7f, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, 0x8bac, 0x8bb1, 0x8bbb, 0x8bc7, 0x8bd0, 0x8bea, 0x8c09, 0x8c1e, /* 0xd8 */ 0x8c38, 0x8c39, 0x8c3a, 0x8c3b, 0x8c3c, 0x8c3d, 0x8c3e, 0x8c3f, 0x8c40, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c48, 0x8c4a, 0x8c4b, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c7f, 0x8c80, 0x8c81, 0x8c83, 0x8c84, 0x8c86, 0x8c87, 0x8c88, 0x8c8b, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c95, 0x8c96, 0x8c97, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, /* 0xd9 */ 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8cff, 0x8d00, 0x8d01, 0x8d02, 0x8d03, 0x8d04, 0x8d05, 0x8d06, 0x8d07, 0x8d08, 0x8d09, 0x8d0a, 0x8d0b, 0x8d0c, 0x8d0d, /* 0xda */ 0x8d0e, 0x8d0f, 0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15, 0x8d16, 0x8d17, 0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d20, 0x8d51, 0x8d52, 0x8d57, 0x8d5f, 0x8d65, 0x8d68, 0x8d69, 0x8d6a, 0x8d6c, 0x8d6e, 0x8d6f, 0x8d71, 0x8d72, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d7f, 0x8d80, 0x8d82, 0x8d83, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d92, 0x8d93, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8da0, 0x8da1, 0x8da2, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db2, 0x8db6, 0x8db7, 0x8db9, 0x8dbb, 0x8dbd, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc5, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcd, 0x8dd0, 0x8dd2, 0x8dd3, 0x8dd4, /* 0xdb */ 0x8dd5, 0x8dd8, 0x8dd9, 0x8ddc, 0x8de0, 0x8de1, 0x8de2, 0x8de5, 0x8de6, 0x8de7, 0x8de9, 0x8ded, 0x8dee, 0x8df0, 0x8df1, 0x8df2, 0x8df4, 0x8df6, 0x8dfc, 0x8dfe, 0x8dff, 0x8e00, 0x8e01, 0x8e02, 0x8e03, 0x8e04, 0x8e06, 0x8e07, 0x8e08, 0x8e0b, 0x8e0d, 0x8e0e, 0x8e10, 0x8e11, 0x8e12, 0x8e13, 0x8e15, 0x8e16, 0x8e17, 0x8e18, 0x8e19, 0x8e1a, 0x8e1b, 0x8e1c, 0x8e20, 0x8e21, 0x8e24, 0x8e25, 0x8e26, 0x8e27, 0x8e28, 0x8e2b, 0x8e2d, 0x8e30, 0x8e32, 0x8e33, 0x8e34, 0x8e36, 0x8e37, 0x8e38, 0x8e3b, 0x8e3c, 0x8e3e, 0x8e3f, 0x8e43, 0x8e45, 0x8e46, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e67, 0x8e68, 0x8e6a, 0x8e6b, 0x8e6e, 0x8e71, /* 0xdc */ 0x8e73, 0x8e75, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7d, 0x8e7e, 0x8e80, 0x8e82, 0x8e83, 0x8e84, 0x8e86, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e91, 0x8e92, 0x8e93, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9d, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8ead, 0x8eae, 0x8eb0, 0x8eb1, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, /* 0xdd */ 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x8f03, 0x8f04, 0x8f05, 0x8f06, 0x8f07, 0x8f08, 0x8f09, 0x8f0a, 0x8f0b, 0x8f0c, 0x8f0d, 0x8f0e, 0x8f0f, 0x8f10, 0x8f11, 0x8f12, 0x8f13, 0x8f14, 0x8f15, 0x8f16, 0x8f17, 0x8f18, 0x8f19, 0x8f1a, 0x8f1b, 0x8f1c, 0x8f1d, 0x8f1e, 0x8f1f, 0x8f20, 0x8f21, 0x8f22, 0x8f23, 0x8f24, 0x8f25, 0x8f26, 0x8f27, 0x8f28, 0x8f29, 0x8f2a, 0x8f2b, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f2f, 0x8f30, 0x8f31, 0x8f32, 0x8f33, 0x8f34, 0x8f35, 0x8f36, 0x8f37, 0x8f38, 0x8f39, 0x8f3a, 0x8f3b, 0x8f3c, 0x8f3d, 0x8f3e, 0x8f3f, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, /* 0xde */ 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f6a, 0x8f80, 0x8f8c, 0x8f92, 0x8f9d, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8faa, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb7, 0x8fb8, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbf, 0x8fc0, 0x8fc3, 0x8fc6, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fcf, 0x8fd2, 0x8fd6, 0x8fd7, 0x8fda, 0x8fe0, 0x8fe1, 0x8fe3, 0x8fe7, 0x8fec, 0x8fef, 0x8ff1, 0x8ff2, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffe, 0x8fff, 0x9007, 0x9008, 0x900c, 0x900e, 0x9013, 0x9015, 0x9018, /* 0xdf */ 0x9019, 0x901c, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, 0x902a, 0x902b, 0x902c, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903a, 0x903d, 0x903f, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904e, 0x9054, 0x9055, 0x9056, 0x9059, 0x905a, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906a, 0x906b, 0x906c, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907e, 0x9081, 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908a, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909a, 0x909c, 0x909e, 0x909f, 0x90a0, 0x90a4, 0x90a5, 0x90a7, 0x90a8, 0x90a9, 0x90ab, 0x90ad, 0x90b2, 0x90b7, 0x90bc, 0x90bd, 0x90bf, 0x90c0, /* 0xe0 */ 0x90c2, 0x90c3, 0x90c6, 0x90c8, 0x90c9, 0x90cb, 0x90cc, 0x90cd, 0x90d2, 0x90d4, 0x90d5, 0x90d6, 0x90d8, 0x90d9, 0x90da, 0x90de, 0x90df, 0x90e0, 0x90e3, 0x90e4, 0x90e5, 0x90e9, 0x90ea, 0x90ec, 0x90ee, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f5, 0x90f6, 0x90f7, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90ff, 0x9100, 0x9101, 0x9103, 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910a, 0x910b, 0x910c, 0x910d, 0x910e, 0x910f, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x911a, 0x911b, 0x911c, 0x911d, 0x911f, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, 0x9129, 0x912a, 0x912b, 0x912c, 0x912d, 0x912e, 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913a, 0x913b, 0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x9141, 0x9142, 0x9144, /* 0xe1 */ 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158, 0x9159, 0x915b, 0x915c, 0x915f, 0x9160, 0x9166, 0x9167, 0x9168, 0x916b, 0x916d, 0x9173, 0x917a, 0x917b, 0x917c, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918a, 0x918e, 0x918f, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91ab, 0x91ac, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c8, 0x91cb, 0x91d0, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, /* 0xe2 */ 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x91ff, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, 0x9208, 0x9209, 0x920a, 0x920b, 0x920c, 0x920d, 0x920e, 0x920f, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, 0x9218, 0x9219, 0x921a, 0x921b, 0x921c, 0x921d, 0x921e, 0x921f, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922a, 0x922b, 0x922c, 0x922d, 0x922e, 0x922f, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923a, 0x923b, 0x923c, 0x923d, 0x923e, 0x923f, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, /* 0xe3 */ 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x927f, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, /* 0xe4 */ 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, /* 0xe5 */ 0x930a, 0x930b, 0x930c, 0x930d, 0x930e, 0x930f, 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931a, 0x931b, 0x931c, 0x931d, 0x931e, 0x931f, 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932a, 0x932b, 0x932c, 0x932d, 0x932e, 0x932f, 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933a, 0x933b, 0x933c, 0x933d, 0x933f, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936b, /* 0xe6 */ 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x937f, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93cb, 0x93cc, 0x93cd, /* 0xe7 */ 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, 0x93ff, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940a, 0x940b, 0x940c, 0x940d, 0x940e, 0x940f, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941a, 0x941b, 0x941c, 0x941d, 0x941e, 0x941f, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942a, 0x942b, 0x942c, 0x942d, 0x942e, /* 0xe8 */ 0x942f, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943a, 0x943b, 0x943c, 0x943d, 0x943f, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x947f, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, 0x94c7, 0x94cf, 0x94d3, 0x94d4, 0x94da, 0x94e6, 0x94fb, 0x951c, 0x9520, /* 0xe9 */ 0x9527, 0x9533, 0x953d, 0x9543, 0x9548, 0x954b, 0x9555, 0x955a, 0x9560, 0x956e, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb, /* 0xea */ 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95ec, 0x95ff, 0x9607, 0x9613, 0x9618, 0x961b, 0x961e, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962b, 0x962c, 0x962d, 0x962f, 0x9630, 0x9637, 0x9638, 0x9639, 0x963a, 0x963e, 0x9641, 0x9643, 0x964a, 0x964e, 0x964f, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965c, 0x965d, 0x965e, 0x9660, 0x9663, 0x9665, 0x9666, 0x966b, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9673, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x967f, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968a, /* 0xeb */ 0x968c, 0x968e, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969a, 0x969b, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b1, 0x96b2, 0x96b4, 0x96b5, 0x96b7, 0x96b8, 0x96ba, 0x96bb, 0x96bf, 0x96c2, 0x96c3, 0x96c8, 0x96ca, 0x96cb, 0x96d0, 0x96d1, 0x96d3, 0x96d4, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96f0, 0x96f1, 0x96f2, 0x96f4, 0x96f5, 0x96f8, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96ff, 0x9702, 0x9703, 0x9705, 0x970a, 0x970b, 0x970c, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971a, 0x971b, 0x971d, 0x971f, 0x9720, /* 0xec */ 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, 0x9729, 0x972b, 0x972c, 0x972e, 0x972f, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973a, 0x973b, 0x973c, 0x973d, 0x973f, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975a, 0x975c, 0x975d, 0x975f, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977d, 0x977e, 0x977f, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788, 0x9789, 0x978a, 0x978c, 0x978e, 0x978f, 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, /* 0xed */ 0x979e, 0x979f, 0x97a1, 0x97a2, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ac, 0x97ae, 0x97b0, 0x97b1, 0x97b3, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e8, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f4, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x97ff, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, 0x9808, 0x9809, 0x980a, 0x980b, 0x980c, 0x980d, 0x980e, /* 0xee */ 0x980f, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, 0x9819, 0x981a, 0x981b, 0x981c, 0x981d, 0x981e, 0x981f, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, 0x9829, 0x982a, 0x982b, 0x982c, 0x982d, 0x982e, 0x982f, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, 0x9839, 0x983a, 0x983b, 0x983c, 0x983d, 0x983e, 0x983f, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, /* 0xef */ 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988b, 0x988e, 0x9892, 0x9895, 0x9899, 0x98a3, 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98cf, 0x98d0, 0x98d4, 0x98d6, 0x98d7, 0x98db, 0x98dc, 0x98dd, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x98ff, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, /* 0xf0 */ 0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990e, 0x990f, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, 0x991a, 0x991b, 0x991c, 0x991d, 0x991e, 0x991f, 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, 0x992a, 0x992b, 0x992c, 0x992d, 0x992f, 0x9930, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993a, 0x993b, 0x993c, 0x993d, 0x993e, 0x993f, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997b, 0x997e, 0x9982, 0x9983, 0x9989, /* 0xf1 */ 0x998c, 0x998e, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a6, 0x99a7, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, /* 0xf2 */ 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x99ff, 0x9a00, 0x9a01, 0x9a02, 0x9a03, 0x9a04, 0x9a05, 0x9a06, 0x9a07, 0x9a08, 0x9a09, 0x9a0a, 0x9a0b, 0x9a0c, 0x9a0d, 0x9a0e, 0x9a0f, 0x9a10, 0x9a11, 0x9a12, 0x9a13, 0x9a14, 0x9a15, 0x9a16, 0x9a17, 0x9a18, 0x9a19, 0x9a1a, 0x9a1b, 0x9a1c, 0x9a1d, 0x9a1e, 0x9a1f, 0x9a20, 0x9a21, 0x9a22, 0x9a23, 0x9a24, 0x9a25, 0x9a26, 0x9a27, 0x9a28, 0x9a29, 0x9a2a, 0x9a2b, 0x9a2c, 0x9a2d, 0x9a2e, 0x9a2f, 0x9a30, 0x9a31, 0x9a32, 0x9a33, 0x9a34, 0x9a35, 0x9a36, 0x9a37, 0x9a38, 0x9a39, 0x9a3a, 0x9a3b, 0x9a3c, 0x9a3d, 0x9a3e, 0x9a3f, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, /* 0xf3 */ 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a72, 0x9a83, 0x9a89, 0x9a8d, 0x9a8e, 0x9a94, 0x9a95, 0x9a99, 0x9aa6, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab9, 0x9abb, 0x9abd, 0x9abe, 0x9abf, 0x9ac3, 0x9ac4, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad2, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9ae0, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aec, 0x9aee, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9afa, 0x9afc, 0x9afd, 0x9afe, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b04, 0x9b05, 0x9b06, /* 0xf4 */ 0x9b07, 0x9b09, 0x9b0a, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b10, 0x9b11, 0x9b12, 0x9b14, 0x9b15, 0x9b16, 0x9b17, 0x9b18, 0x9b19, 0x9b1a, 0x9b1b, 0x9b1c, 0x9b1d, 0x9b1e, 0x9b20, 0x9b21, 0x9b22, 0x9b24, 0x9b25, 0x9b26, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2b, 0x9b2c, 0x9b2d, 0x9b2e, 0x9b30, 0x9b31, 0x9b33, 0x9b34, 0x9b35, 0x9b36, 0x9b37, 0x9b38, 0x9b39, 0x9b3a, 0x9b3d, 0x9b3e, 0x9b3f, 0x9b40, 0x9b46, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4e, 0x9b50, 0x9b52, 0x9b53, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, /* 0xf5 */ 0x9b7c, 0x9b7d, 0x9b7e, 0x9b7f, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, /* 0xf6 */ 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9bff, 0x9c00, 0x9c01, 0x9c02, 0x9c03, 0x9c04, 0x9c05, 0x9c06, 0x9c07, 0x9c08, 0x9c09, 0x9c0a, 0x9c0b, 0x9c0c, 0x9c0d, 0x9c0e, 0x9c0f, 0x9c10, 0x9c11, 0x9c12, 0x9c13, 0x9c14, 0x9c15, 0x9c16, 0x9c17, 0x9c18, 0x9c19, 0x9c1a, 0x9c1b, 0x9c1c, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, 0x9c23, 0x9c24, 0x9c25, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c2b, 0x9c2c, 0x9c2d, 0x9c2e, 0x9c2f, 0x9c30, 0x9c31, 0x9c32, 0x9c33, 0x9c34, 0x9c35, 0x9c36, 0x9c37, 0x9c38, 0x9c39, 0x9c3a, 0x9c3b, /* 0xf7 */ 0x9c3c, 0x9c3d, 0x9c3e, 0x9c3f, 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7d, 0x9c7e, 0x9c80, 0x9c83, 0x9c84, 0x9c89, 0x9c8a, 0x9c8c, 0x9c8f, 0x9c93, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9d, 0x9caa, 0x9cac, 0x9caf, 0x9cb9, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc8, 0x9cc9, 0x9cd1, 0x9cd2, 0x9cda, 0x9cdb, 0x9ce0, 0x9ce1, /* 0xf8 */ 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x9d00, 0x9d01, 0x9d02, 0x9d03, 0x9d04, 0x9d05, 0x9d06, 0x9d07, 0x9d08, 0x9d09, 0x9d0a, 0x9d0b, 0x9d0c, 0x9d0d, 0x9d0e, 0x9d0f, 0x9d10, 0x9d11, 0x9d12, 0x9d13, 0x9d14, 0x9d15, 0x9d16, 0x9d17, 0x9d18, 0x9d19, 0x9d1a, 0x9d1b, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d1f, 0x9d20, 0x9d21, 0x9d22, 0x9d23, 0x9d24, 0x9d25, 0x9d26, 0x9d27, 0x9d28, 0x9d29, 0x9d2a, 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d31, 0x9d32, 0x9d33, 0x9d34, 0x9d35, 0x9d36, 0x9d37, 0x9d38, 0x9d39, 0x9d3a, 0x9d3b, 0x9d3c, 0x9d3d, 0x9d3e, 0x9d3f, 0x9d40, 0x9d41, 0x9d42, /* 0xf9 */ 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, /* 0xfa */ 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9dff, 0x9e00, 0x9e01, 0x9e02, /* 0xfb */ 0x9e03, 0x9e04, 0x9e05, 0x9e06, 0x9e07, 0x9e08, 0x9e09, 0x9e0a, 0x9e0b, 0x9e0c, 0x9e0d, 0x9e0e, 0x9e0f, 0x9e10, 0x9e11, 0x9e12, 0x9e13, 0x9e14, 0x9e15, 0x9e16, 0x9e17, 0x9e18, 0x9e19, 0x9e1a, 0x9e1b, 0x9e1c, 0x9e1d, 0x9e1e, 0x9e24, 0x9e27, 0x9e2e, 0x9e30, 0x9e34, 0x9e3b, 0x9e3c, 0x9e40, 0x9e4d, 0x9e50, 0x9e52, 0x9e53, 0x9e54, 0x9e56, 0x9e59, 0x9e5d, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e65, 0x9e6e, 0x9e6f, 0x9e72, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e80, 0x9e81, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e89, 0x9e8a, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9e, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, /* 0xfc */ 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb9, 0x9eba, 0x9ebc, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9eca, 0x9ecb, 0x9ecc, 0x9ed0, 0x9ed2, 0x9ed3, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed9, 0x9eda, 0x9ede, 0x9ee1, 0x9ee3, 0x9ee4, 0x9ee6, 0x9ee8, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9efa, 0x9efd, 0x9eff, 0x9f00, 0x9f01, 0x9f02, 0x9f03, 0x9f04, 0x9f05, 0x9f06, 0x9f07, 0x9f08, 0x9f09, 0x9f0a, 0x9f0c, 0x9f0f, 0x9f11, 0x9f12, 0x9f14, 0x9f15, 0x9f16, 0x9f18, 0x9f1a, 0x9f1b, 0x9f1c, 0x9f1d, 0x9f1e, 0x9f1f, 0x9f21, 0x9f23, 0x9f24, 0x9f25, 0x9f26, 0x9f27, 0x9f28, 0x9f29, 0x9f2a, 0x9f2b, 0x9f2d, 0x9f2e, 0x9f30, 0x9f31, /* 0xfd */ 0x9f32, 0x9f33, 0x9f34, 0x9f35, 0x9f36, 0x9f38, 0x9f3a, 0x9f3c, 0x9f3f, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f45, 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f81, 0x9f82, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f9c, 0x9f9d, 0x9f9e, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0xf92c, 0xf979, 0xf995, 0xf9e7, 0xf9f1, /* 0xfe */ 0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, 0xfa11, 0xfa13, 0xfa14, 0xfa18, 0xfa1f, 0xfa20, 0xfa21, 0xfa23, 0xfa24, 0xfa27, 0xfa28, 0xfa29, }; static int gbkext2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa8 && c1 <= 0xfe)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { unsigned int i = 96 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 12016) wc = gbkext2_2uni_pagea8[i-3744]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } fldigi-4.1.06/src/libtiniconv/encdec/jisx0208.h0000644000175000017500000044152113472116001015753 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0208.1990-0 */ static const unsigned short jisx0208_2uni_page21[690] = { /* 0x21 */ 0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b, 0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e, 0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd, 0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0xff3c, 0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019, 0x201c, 0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b, 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0xff0b, 0x2212, 0x00b1, 0x00d7, 0x00f7, 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04, 0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, /* 0x22 */ 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200, 0x2203, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021, 0x00b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x25ef, /* 0x23 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x24 */ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, }; static const unsigned short jisx0208_2uni_page30[6398] = { /* 0x30 */ 0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328, 0x59f6, 0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25, 0x65ed, 0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271, 0x5b9b, 0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216, 0x7c9f, 0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7, 0x978d, 0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2, 0x5937, 0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613, 0x6905, 0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3, 0x840e, 0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5, 0x57df, 0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038, 0x7a32, 0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1, 0x56e0, 0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d, /* 0x31 */ 0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87, 0x70cf, 0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11, 0x7893, 0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b, 0x59e5, 0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b, 0x96f2, 0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620, 0x66f3, 0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e, 0x9834, 0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca, 0x99c5, 0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186, 0x5712, 0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4, 0x6cbf, 0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01, 0x8276, 0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc, 0x6c5a, 0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc, /* 0x32 */ 0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1, 0x8956, 0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104, 0x5c4b, 0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378, 0x6069, 0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55, 0x4f3d, 0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1, 0x5bb6, 0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3, 0x706b, 0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db, 0x8304, 0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8, 0x8fe6, 0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259, 0x753b, 0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5, 0x4ecb, 0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb, 0x602a, 0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539, /* 0x33 */ 0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686, 0x7d75, 0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be, 0x5916, 0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d, 0x84cb, 0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9, 0x57a3, 0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3, 0x62e1, 0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b, 0x899a, 0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769, 0x5b66, 0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b, 0x6a7f, 0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec, 0x6d3b, 0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39, 0x53f6, 0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2, 0x91dc, 0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431, /* 0x34 */ 0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0, 0x5bd2, 0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6, 0x5b8c, 0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163, 0x61be, 0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53, 0x6c57, 0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b, 0x7aff, 0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266, 0x839e, 0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591, 0x95a2, 0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8, 0x5dcc, 0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1, 0x9811, 0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668, 0x57fa, 0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc, 0x63ee, 0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4, /* 0x35 */ 0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948, 0x5b63, 0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77, 0x8ecc, 0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100, 0x5993, 0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591, 0x7947, 0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0, 0x5409, 0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775, 0x9ecd, 0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45, 0x4ec7, 0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551, 0x673d, 0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae, 0x7b08, 0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd, 0x92f8, 0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac, /* 0x36 */ 0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6, 0x5354, 0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37, 0x5f4a, 0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1, 0x72c2, 0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7, 0x93e1, 0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681, 0x696d, 0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5, 0x52e4, 0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434, 0x7981, 0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f, 0x8b39, 0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5, 0x533a, 0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8, 0x99d2, 0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3, 0x9047, 0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48, /* 0x37 */ 0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a, 0x9688, 0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b, 0x85ab, 0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941, 0x4fc2, 0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b, 0x5951, 0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2, 0x643a, 0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb, 0x7d4c, 0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08, 0x8a63, 0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8, 0x5287, 0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20, 0x6c7a, 0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6, 0x5039, 0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f, 0x5805, 0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372, /* 0x38 */ 0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f, 0x7d79, 0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063, 0x9375, 0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3, 0x5e7b, 0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237, 0x8a00, 0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa, 0x59d1, 0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af, 0x6e56, 0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e, 0x8a87, 0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92, 0x4f0d, 0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f, 0x68a7, 0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190, 0x4e5e, 0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149, 0x516c, 0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411, /* 0x39 */ 0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d, 0x5b8f, 0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7, 0x5f18, 0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602, 0x6643, 0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a, 0x6d69, 0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0, 0x7d05, 0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1, 0x8154, 0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2, 0x8cfc, 0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d, 0x9805, 0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408, 0x58d5, 0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b, 0x544a, 0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09, 0x8170, 0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc, /* 0x3a */ 0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a, 0x6068, 0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5, 0x7d3a, 0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f, 0x5de6, 0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396, 0x88df, 0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700, 0x54c9, 0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d, 0x6b73, 0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d, 0x658e, 0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728, 0x6750, 0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a, 0x80b4, 0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a, 0x548b, 0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22, 0x932f, 0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237, /* 0x3b */ 0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9, 0x96d1, 0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652, 0x4e09, 0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f, 0x71e6, 0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb, 0x9178, 0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a, 0x4f7f, 0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb, 0x59c9, 0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d, 0x6307, 0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62, 0x6b7b, 0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b, 0x80a2, 0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c, 0x8aee, 0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c, 0x4f8d, 0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642, /* 0x3c */ 0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1, 0x793a, 0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f, 0x5f0f, 0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03, 0x53f1, 0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06, 0x75be, 0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d, 0x5c61, 0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66, 0x659c, 0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e, 0x86c7, 0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235, 0x914c, 0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b, 0x53d6, 0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e, 0x816b, 0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff, 0x6388, 0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468, /* 0x3d */ 0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32, 0x79c0, 0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490, 0x8846, 0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c, 0x96c6, 0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e, 0x67d4, 0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4, 0x5919, 0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f, 0x51fa, 0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3, 0x821c, 0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3, 0x6e96, 0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806, 0x51e6, 0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2, 0x7f72, 0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973, 0x5e8f, 0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f, /* 0x3e */ 0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11, 0x5c1a, 0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db, 0x638c, 0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2, 0x6a1f, 0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126, 0x7167, 0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0, 0x7b11, 0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d, 0x88f3, 0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4, 0x9266, 0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e, 0x4e57, 0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38, 0x60c5, 0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63, 0x84b8, 0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe, /* 0x3f */ 0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272, 0x89e6, 0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5, 0x5507, 0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0, 0x664b, 0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f, 0x795e, 0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a, 0x8eab, 0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203, 0x5875, 0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5, 0x9663, 0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8, 0x9017, 0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761, 0x7c8b, 0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f, 0x745e, 0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db, 0x636e, 0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe, /* 0x40 */ 0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f, 0x51c4, 0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f, 0x6574, 0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272, 0x751f, 0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0, 0x8a93, 0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e, 0x8106, 0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790, 0x77f3, 0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1, 0x8e5f, 0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d, 0x7a83, 0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9, 0x5148, 0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226, 0x6247, 0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3, 0x6f5c, 0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda, /* 0x41 */ 0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e, 0x8cce, 0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae, 0x524d, 0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3, 0x7cce, 0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a, 0x72d9, 0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20, 0x7d44, 0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275, 0x53cc, 0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b, 0x5c64, 0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb, 0x64cd, 0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5, 0x4e89, 0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061, 0x8349, 0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001, 0x906d, 0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e, /* 0x42 */ 0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247, 0x5373, 0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7, 0x5c5e, 0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3, 0x5b58, 0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a, 0x592a, 0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253, 0x67c1, 0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806, 0x5bfe, 0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234, 0x66ff, 0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8, 0x9000, 0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927, 0x7b2c, 0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544, 0x5b85, 0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17, 0x9438, 0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea, /* 0x43 */ 0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd, 0x7aea, 0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0, 0x4e39, 0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e, 0x6de1, 0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d, 0x80c6, 0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad, 0x6696, 0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730, 0x5f1b, 0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4, 0x8718, 0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4, 0x9010, 0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2, 0x5b99, 0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877, 0x8a3b, 0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7, 0x8457, 0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5, /* 0x44 */ 0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4, 0x61f2, 0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a, 0x8074, 0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3, 0x929a, 0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715, 0x6c88, 0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e, 0x69cc, 0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4, 0x69fb, 0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354, 0x693f, 0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a, 0x91e3, 0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e, 0x5448, 0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f, 0x608c, 0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e, 0x7a0b, 0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013, /* 0x45 */ 0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2, 0x6575, 0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2, 0x5fb9, 0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929, 0x5c55, 0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b, 0x70b9, 0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410, 0x5835, 0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21, 0x767b, 0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a, 0x52aa, 0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac, 0x51cd, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6, 0x5d8b, 0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df, 0x76d7, 0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8, 0x7977, 0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230, /* 0x46 */ 0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f, 0x9003, 0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd, 0x52d5, 0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3, 0x7ae5, 0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f, 0x5f97, 0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2, 0x72ec, 0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a, 0x9cf6, 0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7, 0x6566, 0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d, 0x5948, 0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058, 0x637a, 0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960, 0x8edf, 0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302, 0x8cd1, 0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165, /* 0x47 */ 0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d, 0x6fe1, 0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74, 0x5ff5, 0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b, 0x57dc, 0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf, 0x8fb2, 0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777, 0x6ce2, 0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac, 0x4ff3, 0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c, 0x80cc, 0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885, 0x6973, 0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019, 0x877f, 0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd, 0x67cf, 0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb, 0x66dd, 0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6, /* 0x48 */ 0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8, 0x5e61, 0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a, 0x9197, 0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9, 0x567a, 0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd, 0x53db, 0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248, 0x72af, 0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4, 0x91c6, 0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4, 0x78d0, 0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87, 0x5f7c, 0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc, 0x75b2, 0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab, 0x8ab9, 0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099, 0x5c3e, 0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e, /* 0x49 */ 0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66, 0x819d, 0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c, 0x6867, 0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a, 0x6a19, 0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79, 0x5edf, 0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c, 0x86ed, 0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7, 0x8cd3, 0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b, 0x5a66, 0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577, 0x65a7, 0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299, 0x8b5c, 0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab, 0x6b66, 0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8, 0x847a, 0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d, /* 0x4a */ 0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255, 0x6cb8, 0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3, 0x61a4, 0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0, 0x6587, 0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73, 0x5f0a, 0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801, 0x50fb, 0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86, 0x504f, 0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d, 0x4fbf, 0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea, 0x5703, 0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df, 0x5893, 0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023, 0x4ff8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef, 0x5d29, 0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b, /* 0x4b */ 0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3, 0x840c, 0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2, 0x98fd, 0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a, 0x59a8, 0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0, 0x68d2, 0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf, 0x927e, 0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8, 0x64b2, 0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1, 0x6b86, 0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6, 0x6469, 0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a, 0x6bce, 0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe, 0x9c52, 0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab, 0x8fc4, 0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80, /* 0x4c */ 0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95, 0x5cac, 0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999, 0x7c8d, 0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db, 0x9727, 0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d, 0x660e, 0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5, 0x514d, 0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21, 0x8302, 0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905, 0x5c24, 0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580, 0x5301, 0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25, 0x77e2, 0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756, 0x67f3, 0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652, /* 0x4d */ 0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb, 0x5ba5, 0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67, 0x6d8c, 0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a, 0x9091, 0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e, 0x8a89, 0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8, 0x63da, 0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6, 0x7194, 0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981, 0x8b21, 0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32, 0x6c83, 0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8, 0x6765, 0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a, 0x4e71, 0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7, 0x5229, 0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483, /* 0x4e */ 0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b, 0x7387, 0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c, 0x7409, 0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6, 0x616e, 0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc, 0x5bee, 0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c, 0x7ce7, 0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b, 0x7dd1, 0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8, 0x8f2a, 0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f, 0x985e, 0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c, 0x73b2, 0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97, 0x9f62, 0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9, 0x604b, 0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f, /* 0x4f */ 0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089, 0x8cc2, 0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717, 0x697c, 0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001, 0x807e, 0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332, 0x8ad6, 0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1, 0x67a0, 0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568, 0x6900, 0x6e7e, 0x7897, 0x8155, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x50 */ 0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c, 0x4e3f, 0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a, 0x8212, 0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0, 0x4eb3, 0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7, 0x4ede, 0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b, 0x4f5d, 0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b, 0x4f69, 0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4, 0x4fdf, 0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4, 0x4fe5, 0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c, 0x4ff6, 0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056, 0x506c, 0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2, /* 0x51 */ 0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5, 0x50ed, 0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c, 0x513b, 0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8, 0x5169, 0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189, 0x518f, 0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2, 0x51a9, 0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5, 0x51bd, 0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed, 0x51f0, 0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227, 0x522a, 0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c, 0x525e, 0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d, 0x528d, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8, /* 0x52 */ 0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd, 0x52d7, 0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5, 0x52f8, 0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f, 0x5315, 0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369, 0x536e, 0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6, 0x53a5, 0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df, 0x66fc, 0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d, 0x5440, 0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d, 0x544e, 0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470, 0x5492, 0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7, 0x54a2, 0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8, /* 0x53 */ 0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5, 0x54e6, 0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2, 0x5539, 0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a, 0x559f, 0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583, 0x55a9, 0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc, 0x55e4, 0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b, 0x55f9, 0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638, 0x566b, 0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a, 0x56a0, 0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2, 0x56bc, 0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3, 0x56d7, 0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709, /* 0x54 */ 0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7, 0x571c, 0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f, 0x5769, 0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0, 0x57b3, 0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2, 0x57d3, 0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872, 0x5821, 0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879, 0x5885, 0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8, 0x58ae, 0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5, 0x58dc, 0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc, 0x58fd, 0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c, 0x592d, 0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e, 0x595a, 0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969, /* 0x55 */ 0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2, 0x59c6, 0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f, 0x5a11, 0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35, 0x5a36, 0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2, 0x5abd, 0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb, 0x5b0c, 0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e, 0x5b43, 0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65, 0x5b69, 0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80, 0x5b83, 0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0, 0x5be4, 0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6, 0x5bf3, 0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22, 0x5c28, 0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53, /* 0x56 */ 0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76, 0x5c79, 0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6, 0x5cbc, 0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd, 0x5cfa, 0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c, 0x5d1f, 0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18, 0x5d4c, 0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87, 0x5d84, 0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90, 0x5db7, 0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb, 0x5deb, 0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b, 0x5e36, 0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54, 0x5e5f, 0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc, 0x5e7f, 0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf, /* 0x57 */ 0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1, 0x5ee8, 0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8, 0x5efe, 0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16, 0x5f29, 0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f, 0x5f51, 0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77, 0x5f83, 0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e, 0x5f99, 0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb, 0x5fe4, 0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b, 0x6026, 0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f, 0x604a, 0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c, 0x606b, 0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a, /* 0x58 */ 0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b, 0x60e1, 0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6, 0x60b5, 0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100, 0x60f4, 0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e, 0x6147, 0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c, 0x6134, 0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615a, 0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a, 0x618a, 0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7, 0x61c8, 0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6, 0x61e3, 0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe, 0x6200, 0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b, /* 0x59 */ 0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233, 0x6241, 0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c, 0x6282, 0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283, 0x6294, 0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4, 0x62c8, 0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9, 0x630c, 0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5, 0x6350, 0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380, 0x63ab, 0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b, 0x6369, 0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2, 0x63f6, 0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651d, 0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e, 0x652a, 0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc, /* 0x5a */ 0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2, 0x64f1, 0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef, 0x652c, 0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518, 0x651c, 0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558, 0x655e, 0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b, 0x659f, 0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc, 0x65d2, 0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a, 0x6603, 0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f, 0x6644, 0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668, 0x665f, 0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684, 0x6698, 0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc, /* 0x5b */ 0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6, 0x66e9, 0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726, 0x6727, 0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67a9, 0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785, 0x67b7, 0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4, 0x67de, 0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7, 0x6a9c, 0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e, 0x68b3, 0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f, 0x68ad, 0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874, 0x68b5, 0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca, 0x6908, 0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd, /* 0x5c */ 0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7, 0x68e3, 0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a, 0x6923, 0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b, 0x6954, 0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930, 0x6961, 0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0, 0x69bf, 0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd, 0x69bb, 0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995, 0x69b4, 0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9, 0x69f2, 0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb, 0x6a0a, 0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72, 0x6a36, 0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38, 0x6a22, 0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3, /* 0x5d */ 0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3, 0x6aac, 0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb, 0x6b05, 0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38, 0x6b37, 0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50, 0x6b59, 0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f, 0x6b80, 0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4, 0x6baa, 0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc, 0x6bc6, 0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef, 0x9ebe, 0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e, 0x6c55, 0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b, 0x6c7e, 0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3, 0x6cbd, 0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe, /* 0x5e */ 0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d, 0x6d36, 0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12, 0x6d0c, 0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e, 0x6d95, 0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7, 0x6de6, 0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2, 0x6dc5, 0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d, 0x6e6e, 0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b, 0x6e2b, 0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24, 0x6eff, 0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7, 0x6ed3, 0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f, 0x6ea5, 0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8, 0x6efe, 0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc, /* 0x5f */ 0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81, 0x6f80, 0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58, 0x6f8e, 0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4, 0x6fb9, 0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8, 0x6ff1, 0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001, 0x700f, 0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f, 0x7030, 0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af, 0x70f1, 0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd, 0x70d9, 0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184, 0x7195, 0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9, 0x71d4, 0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc, /* 0x60 */ 0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d, 0x722c, 0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246, 0x724b, 0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4, 0x72ce, 0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f, 0x7317, 0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329, 0x7325, 0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368, 0x7370, 0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce, 0x73bb, 0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f, 0x7425, 0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459, 0x7441, 0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e, 0x748b, 0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1, /* 0x61 */ 0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0, 0x74f1, 0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e, 0x750d, 0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544, 0x754d, 0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564, 0x7567, 0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758a, 0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3, 0x75c2, 0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1, 0x75cd, 0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff, 0x75fc, 0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d, 0x7609, 0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670, /* 0x62 */ 0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688, 0x768b, 0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4, 0x76b8, 0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de, 0x76e1, 0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737, 0x7738, 0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f, 0x777e, 0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0, 0x77b6, 0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd, 0x77d7, 0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812, 0x7926, 0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c, 0x789a, 0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6, 0x78cb, 0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec, /* 0x63 */ 0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a, 0x7955, 0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b, 0x79aa, 0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7, 0x79ec, 0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20, 0x7a1f, 0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57, 0x7a49, 0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d, 0x7a88, 0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0, 0x7ab6, 0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd, 0x7acf, 0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2, 0x7ae6, 0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33, 0x7b18, 0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50, /* 0x64 */ 0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75, 0x7b65, 0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d, 0x7b98, 0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f, 0x7b5d, 0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6, 0x7bdd, 0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00, 0x7c07, 0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23, 0x7c27, 0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43, 0x7c54, 0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56, 0x7c65, 0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2, 0x7cab, 0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9, 0x7cbd, 0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2, 0x9b3b, 0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06, /* 0x65 */ 0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e, 0x7d32, 0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72, 0x7d68, 0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f, 0x7d7d, 0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd, 0x7dab, 0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0, 0x7dd8, 0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05, 0x7e0a, 0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b, 0x7e22, 0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37, 0x7e32, 0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a, 0x7e79, 0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d, 0x8fae, 0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93, 0x7e94, 0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a, /* 0x66 */ 0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55, 0x7f54, 0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78, 0x7f82, 0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e, 0x7f9d, 0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6, 0x7fb8, 0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1, 0x7fe6, 0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b, 0x8012, 0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b, 0x804a, 0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084, 0x8086, 0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac, 0x80db, 0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109, 0x80ef, 0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b, /* 0x67 */ 0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171, 0x816e, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180, 0x8182, 0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9, 0x81b0, 0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba, 0x81c9, 0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df, 0x81e0, 0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205, 0x8207, 0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264, 0x8262, 0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278, 0x827e, 0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1, 0x82e3, 0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303, 0x82fb, 0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9, /* 0x68 */ 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a, 0x83aa, 0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a, 0x837c, 0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4, 0x8413, 0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1, 0x83f7, 0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd, 0x8438, 0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484, 0x8477, 0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c, 0x846f, 0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f, 0x84d9, 0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6, 0x84a1, 0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f, 0x8515, 0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548, /* 0x69 */ 0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588, 0x8591, 0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587, 0x859c, 0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9, 0x85d0, 0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613, 0x860b, 0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f, 0x864d, 0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3, 0x86a9, 0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6, 0x86b0, 0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec, 0x86df, 0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86fb, 0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f, 0x8737, 0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778, 0x874c, 0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759, /* 0x6a */ 0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782, 0x87af, 0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4, 0x87b3, 0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f, 0x880d, 0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b, 0x8844, 0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881, 0x887e, 0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf, 0x88b1, 0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9, 0x8902, 0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a, 0x8913, 0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944, 0x893b, 0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e, /* 0x6b */ 0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977, 0x897e, 0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9, 0x89a6, 0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0, 0x89da, 0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16, 0x8a10, 0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b, 0x8a52, 0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85, 0x8a82, 0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a, 0x8aa3, 0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7, 0x8ae4, 0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb, 0x8b0c, 0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20, 0x8b33, 0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c, 0x8b4f, 0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b, /* 0x6c */ 0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c, 0x8b8e, 0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41, 0x8c3f, 0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c, 0x8c78, 0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e, 0x8c94, 0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2, 0x8cb3, 0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda, 0x8cfd, 0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f, 0x8d0d, 0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67, 0x8d6d, 0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba, 0x8dcf, 0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb, 0x8ddf, 0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e, 0x8e10, 0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a, /* 0x6d */ 0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64, 0x8e60, 0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81, 0x8e87, 0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94, 0x8e99, 0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe, 0x8ec5, 0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb, 0x8efe, 0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c, 0x8f1f, 0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45, 0x8f42, 0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c, 0x8f62, 0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf, 0x8fb7, 0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4, 0x9005, 0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e, 0x9016, 0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8, /* 0x6e */ 0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e, 0x9056, 0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072, 0x9082, 0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8, 0x90af, 0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2, 0x91ab, 0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1, 0x91c9, 0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc, 0x91f5, 0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211, 0x925e, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f, 0x924b, 0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf, 0x92b9, 0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e, /* 0x6f */ 0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b, 0x935c, 0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad, 0x9394, 0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3, 0x93dd, 0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441, 0x9452, 0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229, 0x9470, 0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481, 0x947f, 0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599, 0x95a0, 0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be, 0x95ca, 0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6, 0x95dc, 0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f, 0x9642, 0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e, /* 0x70 */ 0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698, 0x9695, 0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4, 0x96b6, 0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d, 0x96dc, 0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970e, 0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730, 0x9739, 0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975c, 0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771, 0x9779, 0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f, 0x9790, 0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3, 0x97c6, 0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf, 0x97f6, 0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837, 0x983d, 0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870, /* 0x71 */ 0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6, 0x98c4, 0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c, 0x992e, 0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b, 0x9951, 0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad, 0x99ae, 0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed, 0x99ee, 0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05, 0x99e2, 0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43, 0x9a3e, 0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65, 0x9a64, 0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0, 0x9acf, 0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3, 0x9ae6, 0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7, /* 0x72 */ 0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23, 0x9b25, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32, 0x9b44, 0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74, 0x9b93, 0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8, 0x9bb4, 0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2, 0x9be3, 0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1, 0x9bf0, 0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08, 0x9c12, 0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21, 0x9c30, 0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67, 0x9c76, 0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb, 0x9d03, 0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44, 0x9d15, 0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48, /* 0x73 */ 0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72, 0x9d89, 0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9, 0x9db2, 0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf, 0x9dc2, 0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd, 0x9e1a, 0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88, 0x9e8b, 0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9, 0x9eb8, 0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed4, 0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef, 0x9ef4, 0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07, 0x9f08, 0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52, 0x9f54, 0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c, 0x9f6a, 0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0, /* 0x74 */ 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, }; static int jisx0208_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x28) || (c1 >= 0x30 && c1 <= 0x74)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 690) wc = jisx0208_2uni_page21[i]; } else { if (i < 7808) wc = jisx0208_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short jisx0208_2charset[6879] = { 0x2171, 0x2172, 0x2178, 0x212f, 0x224c, 0x216b, 0x215e, 0x212d, 0x2279, 0x215f, 0x2160, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x213e, 0x213d, 0x2142, 0x2146, 0x2147, 0x2148, 0x2149, 0x2277, 0x2278, 0x2145, 0x2144, 0x2273, 0x216c, 0x216d, 0x2228, 0x216e, 0x2272, 0x222b, 0x222c, 0x222a, 0x222d, 0x224d, 0x224e, 0x224f, 0x225f, 0x2250, 0x2260, 0x223a, 0x223b, 0x215d, 0x2265, 0x2267, 0x2167, 0x225c, 0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2168, 0x2268, 0x2266, 0x2262, 0x2162, 0x2261, 0x2165, 0x2166, 0x2263, 0x2264, 0x223e, 0x223f, 0x223c, 0x223d, 0x225d, 0x225e, 0x2821, 0x282c, 0x2822, 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, 0x2826, 0x2831, 0x2825, 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, 0x2829, 0x283e, 0x2839, 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, 0x282a, 0x283a, 0x283f, 0x2835, 0x282b, 0x283b, 0x2840, 0x2836, 0x2223, 0x2222, 0x2225, 0x2224, 0x2227, 0x2226, 0x2221, 0x217e, 0x217b, 0x217d, 0x217c, 0x227e, 0x217a, 0x2179, 0x216a, 0x2169, 0x2276, 0x2275, 0x2274, 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x2141, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x212b, 0x212c, 0x2135, 0x2136, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2126, 0x213c, 0x2133, 0x2134, 0x306c, 0x437a, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x4954, 0x4d3f, 0x5022, 0x312f, 0x336e, 0x5023, 0x4024, 0x5242, 0x3556, 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, 0x5024, 0x4366, 0x5025, 0x367a, 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, 0x5028, 0x5029, 0x4735, 0x3557, 0x4737, 0x4663, 0x3843, 0x4b33, 0x6949, 0x502a, 0x3e68, 0x502b, 0x3235, 0x3665, 0x3870, 0x4c69, 0x5626, 0x4d70, 0x467d, 0x3425, 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168, 0x502f, 0x3b76, 0x4673, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066, 0x4f4b, 0x4f4a, 0x3a33, 0x3021, 0x5033, 0x5034, 0x5035, 0x4b34, 0x5036, 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462, 0x4e3c, 0x5037, 0x5038, 0x5039, 0x3f4d, 0x3d3a, 0x3f4e, 0x503e, 0x503c, 0x503d, 0x3558, 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29, 0x3b46, 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0x2138, 0x5040, 0x5042, 0x4265, 0x4e61, 0x304a, 0x5041, 0x323e, 0x3644, 0x4367, 0x376f, 0x5043, 0x4724, 0x346b, 0x5044, 0x304b, 0x3860, 0x346c, 0x497a, 0x4832, 0x3559, 0x3271, 0x5067, 0x4541, 0x476c, 0x5046, 0x483c, 0x4e62, 0x3f2d, 0x3b47, 0x3b77, 0x3240, 0x4451, 0x4322, 0x504a, 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x424e, 0x323f, 0x5049, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x5050, 0x5053, 0x5051, 0x3242, 0x4a3b, 0x504b, 0x504f, 0x3873, 0x3b48, 0x3426, 0x5054, 0x504c, 0x4e63, 0x3b78, 0x504d, 0x5052, 0x5055, 0x504e, 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e, 0x3874, 0x3f2f, 0x4e37, 0x4a58, 0x3738, 0x4225, 0x3264, 0x3d53, 0x5059, 0x505e, 0x505c, 0x5057, 0x422f, 0x505a, 0x505d, 0x505b, 0x4a5d, 0x5058, 0x3f2e, 0x4b73, 0x505f, 0x5060, 0x3d24, 0x506d, 0x4750, 0x4936, 0x5068, 0x4a70, 0x3236, 0x506c, 0x5066, 0x506f, 0x4152, 0x3844, 0x475c, 0x6047, 0x506e, 0x455d, 0x5063, 0x3876, 0x3875, 0x5061, 0x3c5a, 0x5069, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x3666, 0x3770, 0x5070, 0x5071, 0x5075, 0x304e, 0x4a50, 0x5074, 0x5073, 0x5077, 0x5076, 0x4464, 0x3772, 0x5078, 0x3c45, 0x4226, 0x4465, 0x3676, 0x5079, 0x3536, 0x507a, 0x507c, 0x4b35, 0x3766, 0x3b31, 0x4877, 0x507b, 0x3a45, 0x4d43, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d, 0x3739, 0x5124, 0x364f, 0x5121, 0x5122, 0x462f, 0x417c, 0x3623, 0x4b4d, 0x5125, 0x4e3d, 0x5126, 0x5129, 0x5127, 0x414e, 0x5128, 0x512a, 0x512c, 0x512b, 0x4a48, 0x3537, 0x512e, 0x512f, 0x322f, 0x512d, 0x3c74, 0x5132, 0x5131, 0x5130, 0x5056, 0x5133, 0x3d7e, 0x5134, 0x4d25, 0x4c59, 0x5136, 0x5135, 0x5138, 0x5137, 0x5139, 0x513a, 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, 0x3877, 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, 0x513d, 0x455e, 0x3375, 0x513e, 0x467e, 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x3626, 0x4a3c, 0x4236, 0x3671, 0x4535, 0x3773, 0x5143, 0x5144, 0x4662, 0x315f, 0x5147, 0x3a7d, 0x5146, 0x3a46, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, 0x514c, 0x3e69, 0x3c4c, 0x3427, 0x514f, 0x514d, 0x4c3d, 0x514e, 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, 0x4e64, 0x5158, 0x4028, 0x5159, 0x3d5a, 0x515a, 0x437c, 0x4e3f, 0x4560, 0x5245, 0x515b, 0x7425, 0x3645, 0x515c, 0x4b5e, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x5160, 0x332e, 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, 0x4821, 0x5162, 0x4561, 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, 0x3429, 0x5164, 0x5166, 0x373a, 0x5165, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167, 0x4d78, 0x5168, 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774, 0x516b, 0x3b49, 0x396f, 0x4466, 0x516d, 0x4227, 0x3a6f, 0x516e, 0x516f, 0x4130, 0x516c, 0x5171, 0x4b36, 0x3964, 0x5170, 0x3775, 0x3a5e, 0x476d, 0x5174, 0x5172, 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0x5177, 0x5176, 0x3344, 0x3760, 0x517c, 0x4e2d, 0x5178, 0x517d, 0x517a, 0x5179, 0x4e4f, 0x3879, 0x3243, 0x4e74, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x4e65, 0x4f2b, 0x5225, 0x387a, 0x5224, 0x332f, 0x5226, 0x4b56, 0x443c, 0x4d26, 0x4a59, 0x5227, 0x7055, 0x4630, 0x5228, 0x342a, 0x4c33, 0x3e21, 0x5229, 0x4a67, 0x522d, 0x402a, 0x522a, 0x3650, 0x522b, 0x342b, 0x372e, 0x522e, 0x522f, 0x5230, 0x5231, 0x3c5b, 0x387b, 0x4c5e, 0x4c68, 0x4677, 0x4a71, 0x5232, 0x5233, 0x5235, 0x5237, 0x5236, 0x5238, 0x323d, 0x4b4c, 0x3a7c, 0x5239, 0x4159, 0x3e22, 0x3629, 0x523a, 0x485b, 0x523b, 0x523c, 0x523d, 0x523e, 0x4924, 0x3668, 0x3065, 0x463f, 0x523f, 0x3d3d, 0x4069, 0x5241, 0x5240, 0x3e23, 0x3861, 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628, 0x466e, 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x3735, 0x5247, 0x5248, 0x312c, 0x3075, 0x346d, 0x4228, 0x3551, 0x4d71, 0x524b, 0x3237, 0x524a, 0x362a, 0x524c, 0x4c71, 0x524d, 0x4e52, 0x387c, 0x3836, 0x524e, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251, 0x5252, 0x3837, 0x5253, 0x356e, 0x3b32, 0x5254, 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x3d47, 0x3c68, 0x3c75, 0x3d76, 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, 0x3c38, 0x3b4b, 0x3126, 0x3370, 0x3966, 0x3b4a, 0x525d, 0x525e, 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x372f, 0x5267, 0x3663, 0x4b4a, 0x485d, 0x5266, 0x345e, 0x5261, 0x5262, 0x5264, 0x5265, 0x355b, 0x3f61, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x5260, 0x4f24, 0x4a72, 0x4468, 0x3862, 0x3970, 0x5268, 0x465d, 0x526c, 0x3c7e, 0x3c76, 0x526f, 0x526d, 0x4c23, 0x526a, 0x5273, 0x526e, 0x5271, 0x3846, 0x4c3f, 0x5272, 0x5274, 0x5276, 0x3a70, 0x4f42, 0x526b, 0x5269, 0x5275, 0x5270, 0x5278, 0x5323, 0x527a, 0x527e, 0x5321, 0x527b, 0x533e, 0x3a69, 0x3331, 0x5279, 0x5325, 0x3076, 0x5324, 0x3025, 0x494a, 0x5322, 0x527c, 0x5277, 0x527d, 0x3a48, 0x5326, 0x3077, 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, 0x532d, 0x532c, 0x452f, 0x532e, 0x532b, 0x3134, 0x3a36, 0x3f30, 0x5329, 0x4562, 0x532a, 0x3022, 0x5334, 0x4d23, 0x3e27, 0x533a, 0x5339, 0x5330, 0x4243, 0x5331, 0x426f, 0x5336, 0x3e26, 0x5333, 0x4c64, 0x373c, 0x5337, 0x5338, 0x5335, 0x533b, 0x5332, 0x5341, 0x5346, 0x5342, 0x533d, 0x5347, 0x4131, 0x5349, 0x3922, 0x533f, 0x437d, 0x5343, 0x533c, 0x342d, 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a, 0x5348, 0x4153, 0x354a, 0x362c, 0x5345, 0x3674, 0x3144, 0x534e, 0x534c, 0x5427, 0x5351, 0x534b, 0x534f, 0x534d, 0x3b4c, 0x5350, 0x5353, 0x5358, 0x5356, 0x5355, 0x4332, 0x3245, 0x5352, 0x5354, 0x3e28, 0x3133, 0x5357, 0x325e, 0x5362, 0x3e7c, 0x535e, 0x535c, 0x535d, 0x535f, 0x313d, 0x4139, 0x5359, 0x535a, 0x337a, 0x5361, 0x346f, 0x5364, 0x5360, 0x5363, 0x4a2e, 0x4655, 0x4838, 0x5366, 0x5365, 0x3345, 0x5367, 0x536a, 0x5369, 0x5368, 0x4739, 0x536b, 0x536c, 0x536e, 0x536d, 0x5370, 0x5373, 0x5371, 0x536f, 0x5372, 0x5374, 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d, 0x3273, 0x3078, 0x4344, 0x5379, 0x3a24, 0x304f, 0x3f5e, 0x537a, 0x3847, 0x3971, 0x537c, 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e, 0x5422, 0x5423, 0x3777, 0x3160, 0x5424, 0x5426, 0x5425, 0x5428, 0x455a, 0x5429, 0x3035, 0x3a5f, 0x373d, 0x434f, 0x542a, 0x542b, 0x542d, 0x542e, 0x3a64, 0x3651, 0x4b37, 0x542c, 0x542f, 0x3a41, 0x3923, 0x5433, 0x3a25, 0x4333, 0x5430, 0x445a, 0x5434, 0x3f62, 0x5432, 0x5435, 0x373f, 0x5436, 0x5437, 0x3924, 0x3340, 0x5439, 0x543a, 0x543b, 0x5438, 0x5431, 0x543c, 0x543d, 0x4b64, 0x3e6b, 0x543f, 0x5440, 0x543e, 0x5442, 0x4738, 0x3068, 0x4956, 0x5443, 0x3e7d, 0x3c39, 0x475d, 0x3470, 0x3a6b, 0x4b59, 0x4632, 0x3778, 0x424f, 0x5441, 0x5444, 0x4244, 0x5445, 0x5446, 0x5448, 0x4469, 0x342e, 0x7421, 0x3161, 0x4a73, 0x3e6c, 0x4548, 0x3a66, 0x544e, 0x4a3d, 0x4e5d, 0x3274, 0x544a, 0x413a, 0x544d, 0x4563, 0x4549, 0x4564, 0x4839, 0x444d, 0x3a49, 0x5449, 0x3176, 0x4536, 0x544b, 0x5447, 0x3f50, 0x544f, 0x3d4e, 0x362d, 0x5450, 0x4a68, 0x417d, 0x4446, 0x5452, 0x4b4f, 0x5453, 0x5458, 0x4a2f, 0x5457, 0x5451, 0x5454, 0x5456, 0x3a26, 0x4a49, 0x5459, 0x4345, 0x3275, 0x3e6d, 0x545b, 0x545a, 0x3968, 0x545c, 0x545e, 0x545d, 0x5460, 0x5455, 0x5462, 0x5461, 0x545f, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c, 0x306d, 0x4764, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, 0x5469, 0x4a51, 0x546a, 0x3246, 0x546b, 0x4d3c, 0x3330, 0x5249, 0x3d48, 0x423f, 0x546c, 0x4c6b, 0x4c34, 0x546e, 0x4267, 0x4537, 0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050, 0x5472, 0x5473, 0x3162, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155, 0x5476, 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0x547b, 0x547a, 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, 0x547d, 0x4a33, 0x3d77, 0x455b, 0x5521, 0x3925, 0x5522, 0x4721, 0x485e, 0x4c51, 0x4725, 0x552b, 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0x5526, 0x4245, 0x4b38, 0x454a, 0x5527, 0x4b65, 0x3a4a, 0x3e2a, 0x5528, 0x3b50, 0x3b4f, 0x3039, 0x3848, 0x402b, 0x3051, 0x552c, 0x552d, 0x552a, 0x3138, 0x342f, 0x5529, 0x4c45, 0x4931, 0x3028, 0x3079, 0x3b51, 0x3052, 0x3023, 0x5532, 0x5530, 0x4c3c, 0x5533, 0x5531, 0x552f, 0x3f31, 0x552e, 0x4a5a, 0x3864, 0x5537, 0x5538, 0x3e2b, 0x5534, 0x4f2c, 0x474c, 0x5536, 0x3a27, 0x5539, 0x4958, 0x553a, 0x5535, 0x4c3b, 0x475e, 0x553b, 0x4932, 0x553c, 0x5540, 0x553d, 0x3247, 0x553f, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, 0x5542, 0x4364, 0x5541, 0x5543, 0x5544, 0x5546, 0x5547, 0x3472, 0x5549, 0x5548, 0x554a, 0x3e6e, 0x554d, 0x445c, 0x3145, 0x554b, 0x554e, 0x554f, 0x5552, 0x5550, 0x5551, 0x3b52, 0x5553, 0x3926, 0x5554, 0x3b7a, 0x4238, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x4c52, 0x3528, 0x3849, 0x5557, 0x3358, 0x5558, 0x4239, 0x5559, 0x5623, 0x555a, 0x555b, 0x555c, 0x555e, 0x555f, 0x5560, 0x4270, 0x3127, 0x3c69, 0x3042, 0x4157, 0x3430, 0x3c35, 0x3928, 0x4566, 0x3d21, 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, 0x406b, 0x3c3c, 0x4d28, 0x5561, 0x355c, 0x3a4b, 0x3332, 0x3163, 0x3e2c, 0x3248, 0x5562, 0x4d46, 0x3d49, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564, 0x5565, 0x4959, 0x5567, 0x3428, 0x3677, 0x5566, 0x3432, 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c, 0x5569, 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4e40, 0x556e, 0x5570, 0x437e, 0x556f, 0x4023, 0x3b7b, 0x4250, 0x3c77, 0x4975, 0x406c, 0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52, 0x5574, 0x4633, 0x3e2e, 0x3e2f, 0x5575, 0x406d, 0x3e30, 0x5576, 0x5577, 0x4c60, 0x5578, 0x3646, 0x3d22, 0x5579, 0x557a, 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, 0x3649, 0x557b, 0x356f, 0x557c, 0x367e, 0x464f, 0x3230, 0x3b53, 0x557d, 0x5622, 0x5621, 0x367d, 0x557e, 0x4538, 0x4230, 0x454b, 0x3c48, 0x4158, 0x4d7a, 0x5624, 0x5625, 0x4656, 0x3b33, 0x5627, 0x5628, 0x5629, 0x3474, 0x562a, 0x562b, 0x322c, 0x413b, 0x3464, 0x562d, 0x4c28, 0x4252, 0x3359, 0x562f, 0x5631, 0x345f, 0x562e, 0x5630, 0x5633, 0x5632, 0x5634, 0x5635, 0x463d, 0x362e, 0x3265, 0x5636, 0x563b, 0x5639, 0x4a77, 0x4a76, 0x4567, 0x5638, 0x3d54, 0x5637, 0x3f72, 0x563c, 0x3a6a, 0x5642, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, 0x5641, 0x5640, 0x5644, 0x4a78, 0x564b, 0x5648, 0x564a, 0x4d72, 0x5649, 0x563f, 0x3f73, 0x564c, 0x3a37, 0x564d, 0x564e, 0x5651, 0x5650, 0x564f, 0x4568, 0x563a, 0x5657, 0x5653, 0x5652, 0x5654, 0x5655, 0x5658, 0x4e66, 0x5659, 0x5656, 0x565a, 0x3460, 0x565b, 0x565d, 0x565c, 0x565e, 0x565f, 0x406e, 0x3d23, 0x3d64, 0x4163, 0x3929, 0x3a38, 0x392a, 0x3570, 0x5660, 0x3a39, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, 0x4327, 0x3652, 0x3b54, 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0x4421, 0x5665, 0x5664, 0x5667, 0x446b, 0x3f63, 0x3b55, 0x404a, 0x4253, 0x3522, 0x4422, 0x5668, 0x5669, 0x3e6f, 0x4b39, 0x566c, 0x566b, 0x566a, 0x497d, 0x5673, 0x4b5a, 0x566d, 0x566f, 0x4b6b, 0x566e, 0x5670, 0x4828, 0x5671, 0x4a3e, 0x5672, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c, 0x4a79, 0x4539, 0x392e, 0x495c, 0x5679, 0x4559, 0x3a42, 0x384b, 0x446d, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0x567a, 0x567b, 0x4751, 0x567c, 0x4e77, 0x4f2d, 0x567e, 0x567d, 0x3347, 0x5721, 0x5724, 0x5725, 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728, 0x5729, 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e, 0x572f, 0x377a, 0x3276, 0x4736, 0x5730, 0x467b, 0x4a5b, 0x5731, 0x4f2e, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x3c30, 0x4675, 0x5736, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350, 0x446f, 0x4c6f, 0x3839, 0x384c, 0x5738, 0x5739, 0x573f, 0x3c65, 0x4425, 0x362f, 0x573a, 0x492b, 0x4346, 0x573b, 0x573c, 0x3630, 0x573d, 0x573e, 0x5740, 0x4576, 0x5741, 0x5742, 0x5743, 0x5734, 0x5733, 0x5744, 0x3741, 0x4927, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, 0x3e34, 0x3146, 0x5746, 0x5747, 0x4c72, 0x4860, 0x574a, 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c, 0x574b, 0x4e27, 0x3865, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x4640, 0x5751, 0x5750, 0x574f, 0x5752, 0x3866, 0x5753, 0x497c, 0x3d5b, 0x5754, 0x4879, 0x4641, 0x4427, 0x4530, 0x5755, 0x352b, 0x3f34, 0x492c, 0x3477, 0x4726, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e, 0x575b, 0x4369, 0x5758, 0x3277, 0x582d, 0x575a, 0x4730, 0x5759, 0x5757, 0x397a, 0x575d, 0x5763, 0x5769, 0x5761, 0x455c, 0x5766, 0x495d, 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, 0x355e, 0x5768, 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x3631, 0x5764, 0x576a, 0x576c, 0x5776, 0x5774, 0x5771, 0x5770, 0x4e78, 0x5772, 0x3632, 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, 0x327a, 0x5773, 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, 0x4229, 0x3366, 0x3743, 0x576e, 0x577a, 0x577d, 0x5821, 0x3c3d, 0x5827, 0x4470, 0x577b, 0x5825, 0x3279, 0x5823, 0x5824, 0x577e, 0x5822, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0x473a, 0x302d, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x5829, 0x4569, 0x582e, 0x3e70, 0x582f, 0x4657, 0x4f47, 0x582b, 0x5831, 0x397b, 0x404b, 0x3054, 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0x4246, 0x583d, 0x415b, 0x5838, 0x5835, 0x5836, 0x3c66, 0x5839, 0x583c, 0x5837, 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f, 0x3055, 0x5833, 0x3672, 0x3026, 0x3436, 0x583b, 0x5843, 0x5842, 0x5847, 0x5848, 0x5846, 0x5849, 0x5841, 0x5845, 0x584a, 0x584b, 0x5840, 0x3b7c, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x5858, 0x4a69, 0x584e, 0x584f, 0x5850, 0x5857, 0x5856, 0x4b7d, 0x3437, 0x5854, 0x3745, 0x3334, 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855, 0x584c, 0x5852, 0x5859, 0x3744, 0x584d, 0x4d5d, 0x4d2b, 0x585c, 0x5860, 0x417e, 0x4e79, 0x5861, 0x585e, 0x585b, 0x585a, 0x585f, 0x4a30, 0x4634, 0x3746, 0x5862, 0x585d, 0x5863, 0x377b, 0x3231, 0x586b, 0x3438, 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, 0x586e, 0x327b, 0x5870, 0x586f, 0x4428, 0x5873, 0x5871, 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, 0x5877, 0x5874, 0x5878, 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e, 0x3266, 0x327c, 0x587d, 0x303f, 0x404c, 0x587e, 0x6c43, 0x5921, 0x3761, 0x5922, 0x406f, 0x5923, 0x5924, 0x353a, 0x5925, 0x5926, 0x5927, 0x4257, 0x384d, 0x4c61, 0x4b3c, 0x3d6a, 0x5928, 0x4070, 0x6e3d, 0x4862, 0x3c6a, 0x3a4d, 0x5929, 0x4247, 0x4a27, 0x4271, 0x592c, 0x592a, 0x592d, 0x592b, 0x592e, 0x4a31, 0x3037, 0x495e, 0x4863, 0x592f, 0x5932, 0x3e35, 0x353b, 0x5930, 0x5937, 0x3e36, 0x5931, 0x4744, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, 0x405e, 0x5946, 0x4834, 0x4272, 0x4864, 0x5a2d, 0x4a7a, 0x4471, 0x4b75, 0x593b, 0x3221, 0x436a, 0x5944, 0x4334, 0x593e, 0x5945, 0x5940, 0x5947, 0x5943, 0x5942, 0x476f, 0x593c, 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, 0x5939, 0x3934, 0x405b, 0x3e37, 0x5941, 0x4752, 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e, 0x594a, 0x377d, 0x594f, 0x3b22, 0x3969, 0x3d26, 0x593d, 0x3b7d, 0x594c, 0x3b58, 0x594d, 0x3044, 0x5948, 0x4429, 0x3573, 0x3634, 0x594b, 0x3027, 0x3a43, 0x3f36, 0x4472, 0x4854, 0x5951, 0x415e, 0x422a, 0x3b2b, 0x5952, 0x5954, 0x5950, 0x4a61, 0x443d, 0x415c, 0x4a7b, 0x3c4e, 0x5960, 0x595f, 0x3f78, 0x377e, 0x5959, 0x3e39, 0x4668, 0x4731, 0x5957, 0x415d, 0x3c78, 0x595c, 0x3e38, 0x5956, 0x595b, 0x4753, 0x5955, 0x3721, 0x335d, 0x595d, 0x4e2b, 0x3a4e, 0x4335, 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, 0x3747, 0x444f, 0x595e, 0x415f, 0x5961, 0x5963, 0x4237, 0x5969, 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, 0x4d2c, 0x4d48, 0x3439, 0x302e, 0x5965, 0x5962, 0x3478, 0x3167, 0x5968, 0x4d49, 0x596c, 0x423b, 0x5973, 0x596d, 0x596a, 0x5971, 0x5953, 0x596e, 0x5972, 0x4842, 0x456b, 0x596b, 0x596f, 0x3748, 0x3a71, 0x405d, 0x5977, 0x4526, 0x5974, 0x4b60, 0x5975, 0x5976, 0x4c4e, 0x4022, 0x3762, 0x597d, 0x3b35, 0x597a, 0x5979, 0x4732, 0x4635, 0x4531, 0x597b, 0x597c, 0x496f, 0x4745, 0x3b23, 0x4071, 0x4b50, 0x3349, 0x5a25, 0x597e, 0x4d4a, 0x5a27, 0x5a23, 0x5a24, 0x4160, 0x5a22, 0x593f, 0x5a26, 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x3b24, 0x5a29, 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x5a34, 0x5a36, 0x3e71, 0x5a35, 0x5a39, 0x5a37, 0x5a38, 0x5970, 0x5a3b, 0x5a3a, 0x5978, 0x5a3c, 0x5a30, 0x3b59, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, 0x5a41, 0x327e, 0x3936, 0x4a7c, 0x402f, 0x384e, 0x5a43, 0x5a46, 0x4952, 0x355f, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635, 0x5a49, 0x5a48, 0x343a, 0x3b36, 0x4658, 0x3749, 0x3f74, 0x5a4a, 0x4030, 0x4528, 0x495f, 0x5a4b, 0x5a4c, 0x5a4d, 0x4a38, 0x555d, 0x4046, 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f, 0x3c50, 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, 0x3b42, 0x4347, 0x3b5b, 0x3f37, 0x5a52, 0x4a7d, 0x3177, 0x3b5c, 0x5a55, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0x407b, 0x5a57, 0x4232, 0x5a58, 0x347a, 0x5a5a, 0x5a59, 0x5a5b, 0x5a5c, 0x347b, 0x467c, 0x4336, 0x356c, 0x3b5d, 0x4161, 0x3d5c, 0x3030, 0x5a5d, 0x3222, 0x5a61, 0x3937, 0x5a60, 0x3a2b, 0x3e3a, 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a, 0x3057, 0x404e, 0x5a66, 0x4031, 0x3147, 0x3d55, 0x4b66, 0x3a72, 0x3e3c, 0x4027, 0x5a65, 0x5a63, 0x5a64, 0x436b, 0x5b26, 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0x5a69, 0x3f38, 0x5a67, 0x3b2f, 0x5a6c, 0x5a6b, 0x5a70, 0x5a71, 0x5a6d, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0x4961, 0x374a, 0x5a72, 0x4032, 0x3e3d, 0x4352, 0x3647, 0x5a73, 0x5a77, 0x324b, 0x5a74, 0x5a76, 0x5a75, 0x3d6b, 0x4348, 0x3045, 0x5a78, 0x5a79, 0x442a, 0x4e71, 0x3b43, 0x4a6b, 0x4b3d, 0x5b22, 0x5a7b, 0x5a7e, 0x5a7d, 0x5a7a, 0x5b21, 0x465e, 0x5a7c, 0x5b23, 0x3d6c, 0x5b24, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x5b28, 0x5b29, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, 0x4162, 0x5258, 0x413e, 0x413d, 0x4258, 0x3a47, 0x5072, 0x376e, 0x4d2d, 0x4a7e, 0x497e, 0x5b2c, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0x4b3e, 0x442b, 0x5b2e, 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x3c6b, 0x4b51, 0x5b34, 0x5b37, 0x5b36, 0x3479, 0x3560, 0x5b33, 0x5b35, 0x5b38, 0x3f79, 0x4d7b, 0x3049, 0x3a60, 0x423c, 0x3c5d, 0x3e73, 0x5b3b, 0x454e, 0x5b39, 0x422b, 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x5b42, 0x393a, 0x4755, 0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0x354f, 0x4747, 0x5b41, 0x3e3e, 0x4844, 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0x4b6d, 0x4e53, 0x4b67, 0x324c, 0x3b5e, 0x4f48, 0x5b46, 0x3f75, 0x5b45, 0x5b40, 0x384f, 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x4248, 0x4a41, 0x5b56, 0x4922, 0x5b55, 0x4770, 0x4b3f, 0x343b, 0x4077, 0x3d40, 0x4453, 0x4d2e, 0x5b51, 0x5b50, 0x5b52, 0x5b4f, 0x5b57, 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0x436c, 0x4c78, 0x3c46, 0x3a74, 0x3a3a, 0x4b6f, 0x3341, 0x444e, 0x464a, 0x3149, 0x4072, 0x4034, 0x372a, 0x5b59, 0x393b, 0x337c, 0x5b5b, 0x3374, 0x5b61, 0x5b5e, 0x4073, 0x334b, 0x3a2c, 0x334a, 0x3a4f, 0x5b5c, 0x3765, 0x374b, 0x456d, 0x5b5a, 0x3046, 0x5b5d, 0x5b5f, 0x364d, 0x372c, 0x343c, 0x354b, 0x5b62, 0x3a79, 0x4b71, 0x3b37, 0x5b63, 0x4930, 0x5b6f, 0x3233, 0x5b64, 0x5b75, 0x5b65, 0x4e42, 0x5b6c, 0x475f, 0x5b74, 0x5b67, 0x3034, 0x5b69, 0x393c, 0x5b6b, 0x5b6a, 0x5b66, 0x5b71, 0x3e3f, 0x546d, 0x3868, 0x4d7c, 0x5b68, 0x4474, 0x3323, 0x3a2d, 0x5b60, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0x456e, 0x347e, 0x5c32, 0x4c49, 0x5b77, 0x347d, 0x5b7e, 0x4b40, 0x5c21, 0x5c23, 0x5c27, 0x5b79, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, 0x5c22, 0x3f39, 0x5c2c, 0x4033, 0x5c2a, 0x343d, 0x4f50, 0x5b76, 0x5c26, 0x3058, 0x5b78, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25, 0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29, 0x5b7b, 0x5c2d, 0x5c2e, 0x5c3f, 0x464e, 0x5c24, 0x5c3b, 0x5c3d, 0x4458, 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x5c3e, 0x413f, 0x5c35, 0x5c42, 0x5c41, 0x466f, 0x5c40, 0x466a, 0x5c44, 0x5c37, 0x3648, 0x5c3a, 0x3d5d, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, 0x5c33, 0x4f30, 0x335a, 0x5c39, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54, 0x4f31, 0x5c57, 0x3f3a, 0x5c56, 0x5c55, 0x5c52, 0x5c46, 0x5c63, 0x5c45, 0x5c58, 0x5c50, 0x5c4b, 0x5c48, 0x5c49, 0x5c51, 0x7422, 0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x5c47, 0x5c4a, 0x4d4d, 0x4b6a, 0x5c4f, 0x5c59, 0x5c61, 0x5c5a, 0x5c67, 0x5c65, 0x5c60, 0x5c5f, 0x4450, 0x4165, 0x5c5d, 0x5c5b, 0x5c62, 0x5c68, 0x4875, 0x5c6e, 0x5c69, 0x5c6c, 0x5c66, 0x4374, 0x4938, 0x5c5c, 0x5c64, 0x3e40, 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, 0x5c53, 0x3e41, 0x5c70, 0x5c77, 0x3c79, 0x3372, 0x432e, 0x5c6d, 0x5c72, 0x5c76, 0x3636, 0x354c, 0x5c74, 0x3521, 0x464b, 0x5c73, 0x5c75, 0x5c6f, 0x5c71, 0x3360, 0x4349, 0x5c7c, 0x5c7a, 0x3869, 0x5c79, 0x5d21, 0x5b58, 0x5c7b, 0x5c7d, 0x5c7e, 0x5d2c, 0x5d28, 0x5b6d, 0x5d27, 0x5d26, 0x5d23, 0x5c6a, 0x5d25, 0x5d24, 0x5d2a, 0x4f26, 0x5d2d, 0x367b, 0x5d29, 0x5d2b, 0x4827, 0x5d2e, 0x5d32, 0x5d2f, 0x4d73, 0x5d30, 0x5c5e, 0x5d33, 0x5d34, 0x3135, 0x5d36, 0x3767, 0x3c21, 0x3655, 0x3224, 0x4d5f, 0x5d38, 0x5d37, 0x5d3a, 0x353d, 0x3656, 0x343e, 0x5d3d, 0x5d3c, 0x5d3e, 0x324e, 0x4337, 0x5d3f, 0x343f, 0x5d41, 0x5d40, 0x5d42, 0x5d43, 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x4970, 0x4a62, 0x4f44, 0x3b75, 0x3a50, 0x4e72, 0x5d45, 0x5d46, 0x3b60, 0x5d47, 0x5d48, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e, 0x3c6c, 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x5d56, 0x3b26, 0x334c, 0x5d57, 0x4542, 0x544c, 0x3523, 0x5d58, 0x5d59, 0x4a6c, 0x4b68, 0x4647, 0x5d5a, 0x4866, 0x487b, 0x4c53, 0x5d5b, 0x5d5d, 0x5d5c, 0x5d5f, 0x5d5e, 0x5d61, 0x3b61, 0x4c31, 0x5d62, 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x3f65, 0x4939, 0x314a, 0x4845, 0x4475, 0x3d41, 0x3561, 0x4846, 0x3c2e, 0x5d68, 0x3440, 0x3178, 0x4672, 0x5d67, 0x393e, 0x4353, 0x5d69, 0x5d71, 0x5d6a, 0x4241, 0x3562, 0x5d72, 0x3768, 0x3525, 0x5d70, 0x5d6e, 0x5d6b, 0x4d60, 0x4440, 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723, 0x322d, 0x3a3b, 0x5d6d, 0x5d6f, 0x4b57, 0x4274, 0x4b77, 0x5d7c, 0x5d7d, 0x324f, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168, 0x3637, 0x5d75, 0x5d7a, 0x4074, 0x4771, 0x4867, 0x5d77, 0x4b21, 0x5d79, 0x5e24, 0x5e22, 0x5d7b, 0x4b22, 0x4748, 0x3563, 0x4525, 0x436d, 0x5e25, 0x5e23, 0x4259, 0x5d76, 0x314b, 0x4d4e, 0x5e30, 0x5e2f, 0x4076, 0x5e2c, 0x4d6c, 0x4636, 0x5e26, 0x4445, 0x314c, 0x393f, 0x5e29, 0x3d27, 0x5e2e, 0x5e2d, 0x5e28, 0x5e2b, 0x3368, 0x5e2a, 0x4749, 0x4e2e, 0x3e74, 0x4075, 0x5e36, 0x5e34, 0x494d, 0x5e31, 0x5e33, 0x313a, 0x3940, 0x4f32, 0x333d, 0x4962, 0x4d61, 0x3324, 0x3f3b, 0x5e35, 0x5e3a, 0x3e43, 0x4d30, 0x5e37, 0x5e32, 0x5e38, 0x4e5e, 0x4573, 0x4642, 0x3336, 0x3155, 0x5e3e, 0x5e41, 0x4e43, 0x4d64, 0x5e48, 0x5e42, 0x5e3f, 0x4e54, 0x5e45, 0x3d4a, 0x5e47, 0x5e4c, 0x4571, 0x5e4a, 0x5e44, 0x4338, 0x5e4b, 0x5e40, 0x5e46, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, 0x3f3c, 0x3d5f, 0x4a25, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, 0x4036, 0x3369, 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, 0x5e52, 0x3d6d, 0x383a, 0x5e61, 0x5e5b, 0x3574, 0x454f, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0x3239, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0x5e62, 0x5e5d, 0x5e55, 0x5e5c, 0x4c2b, 0x5e5a, 0x5e5e, 0x3850, 0x3e45, 0x4339, 0x5e54, 0x4d2f, 0x5e57, 0x5e50, 0x4572, 0x5e53, 0x5e59, 0x4f51, 0x3c3e, 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0x3d60, 0x5e65, 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0x5e64, 0x5e6a, 0x5e6c, 0x4d4f, 0x5e67, 0x452e, 0x5e69, 0x5e71, 0x5e6b, 0x4c47, 0x5e66, 0x3c22, 0x5e7e, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0x426c, 0x425a, 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, 0x5e77, 0x5e78, 0x5e60, 0x3579, 0x493a, 0x3c3f, 0x3977, 0x4f33, 0x5e74, 0x5f22, 0x3169, 0x4166, 0x4779, 0x3441, 0x4e7a, 0x4c21, 0x4452, 0x5e7b, 0x5e7d, 0x4132, 0x5f21, 0x5e79, 0x5e73, 0x3443, 0x3769, 0x5f2f, 0x5f2a, 0x4078, 0x3363, 0x3d61, 0x5f33, 0x5f2c, 0x442c, 0x5f29, 0x4459, 0x5f4c, 0x5f26, 0x5f25, 0x5f2e, 0x5f28, 0x5f27, 0x5f2d, 0x4021, 0x5f24, 0x5f30, 0x5f31, 0x3442, 0x5f36, 0x5f35, 0x5f37, 0x5f3a, 0x4543, 0x5f34, 0x5f38, 0x3763, 0x4279, 0x5f32, 0x473b, 0x5f39, 0x5f3e, 0x5f3c, 0x5f3f, 0x5f42, 0x5f3b, 0x396a, 0x4728, 0x5e39, 0x4d74, 0x5f3d, 0x5f41, 0x4275, 0x5f40, 0x5f2b, 0x6f69, 0x5f45, 0x5f49, 0x5f47, 0x5f43, 0x5f44, 0x5f48, 0x5f46, 0x494e, 0x5f4e, 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, 0x5f4f, 0x4375, 0x426d, 0x4025, 0x5f50, 0x5f52, 0x5f51, 0x5e75, 0x5f53, 0x4667, 0x5f54, 0x3250, 0x4574, 0x3325, 0x3564, 0x3c5e, 0x3a52, 0x4f27, 0x3f66, 0x316a, 0x5f56, 0x5f55, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0x5f5b, 0x5f5a, 0x4540, 0x3059, 0x4e75, 0x5f5e, 0x3128, 0x5f60, 0x5f5f, 0x5f5d, 0x5f58, 0x4b23, 0x5f62, 0x5f61, 0x316b, 0x5f64, 0x4a32, 0x5f63, 0x4c35, 0x3e47, 0x4133, 0x3e46, 0x4e7b, 0x5f6a, 0x4079, 0x5f66, 0x5f6b, 0x316c, 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x4851, 0x5f6c, 0x3c51, 0x407a, 0x5f6f, 0x5f67, 0x3727, 0x5f6d, 0x4d50, 0x5f70, 0x7426, 0x3d4f, 0x5f71, 0x5f72, 0x472e, 0x5f74, 0x5f75, 0x4733, 0x4575, 0x5f77, 0x5f79, 0x4e55, 0x5f76, 0x5f78, 0x316d, 0x5f73, 0x535b, 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b, 0x3f24, 0x5259, 0x5f7d, 0x6021, 0x5f6e, 0x5f7e, 0x6022, 0x477a, 0x6023, 0x6024, 0x6025, 0x6026, 0x445e, 0x6028, 0x6027, 0x6029, 0x602a, 0x3c5f, 0x4963, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d, 0x602e, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d, 0x6031, 0x3267, 0x356d, 0x4c46, 0x4c36, 0x3234, 0x4f34, 0x4b52, 0x4a2a, 0x4037, 0x6032, 0x4643, 0x3823, 0x6033, 0x3a54, 0x6035, 0x6034, 0x6036, 0x6037, 0x6038, 0x353e, 0x6039, 0x603a, 0x3824, 0x4848, 0x603c, 0x3e75, 0x603b, 0x3638, 0x603d, 0x603f, 0x603e, 0x6040, 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044, 0x6042, 0x3c6d, 0x4648, 0x3639, 0x6046, 0x432c, 0x6045, 0x4f35, 0x4762, 0x6049, 0x604b, 0x6048, 0x4c54, 0x604a, 0x604c, 0x4e44, 0x6050, 0x604f, 0x4376, 0x472d, 0x3825, 0x604e, 0x604d, 0x4d31, 0x4d32, 0x6051, 0x316e, 0x3976, 0x3b62, 0x6052, 0x6053, 0x6055, 0x3d43, 0x6057, 0x6056, 0x6058, 0x334d, 0x605a, 0x6059, 0x605c, 0x605b, 0x383c, 0x4e28, 0x364c, 0x3226, 0x366a, 0x3461, 0x4e68, 0x605e, 0x6060, 0x6061, 0x3251, 0x605d, 0x3b39, 0x4441, 0x605f, 0x6064, 0x3c6e, 0x6062, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069, 0x383d, 0x3565, 0x6066, 0x4d7d, 0x4e30, 0x4276, 0x6068, 0x606a, 0x4e56, 0x3657, 0x487c, 0x474a, 0x606b, 0x606d, 0x6070, 0x606c, 0x606f, 0x386a, 0x314d, 0x6071, 0x3f70, 0x606e, 0x4e5c, 0x6074, 0x7424, 0x6072, 0x6075, 0x6067, 0x6073, 0x3a3c, 0x6076, 0x6077, 0x4d7e, 0x6078, 0x6079, 0x6065, 0x607a, 0x3444, 0x3c25, 0x607b, 0x607c, 0x607d, 0x313b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123, 0x6124, 0x6125, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, 0x6129, 0x612c, 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, 0x6132, 0x6131, 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, 0x3b3a, 0x3179, 0x6134, 0x4d51, 0x4a63, 0x6135, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x434b, 0x5234, 0x442e, 0x3268, 0x6136, 0x6137, 0x613c, 0x613a, 0x6139, 0x5a42, 0x3326, 0x6138, 0x305a, 0x482a, 0x484a, 0x4e31, 0x613d, 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c, 0x374d, 0x6140, 0x613e, 0x4856, 0x6141, 0x6142, 0x305b, 0x3e76, 0x6147, 0x6144, 0x466d, 0x6143, 0x3526, 0x614a, 0x6145, 0x6146, 0x6149, 0x6148, 0x4925, 0x4142, 0x4141, 0x353f, 0x614b, 0x614c, 0x614d, 0x614f, 0x614e, 0x3156, 0x6157, 0x4868, 0x6151, 0x6153, 0x6155, 0x3f3e, 0x6156, 0x6154, 0x3c40, 0x6150, 0x6152, 0x4942, 0x3e49, 0x6159, 0x6158, 0x615a, 0x3c26, 0x3a2f, 0x4577, 0x615b, 0x444b, 0x615d, 0x4e21, 0x615c, 0x4169, 0x6162, 0x6164, 0x6165, 0x4354, 0x6163, 0x6160, 0x615e, 0x615f, 0x6161, 0x6168, 0x6166, 0x6167, 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0x616a, 0x6170, 0x616f, 0x6171, 0x4e45, 0x6174, 0x6172, 0x6173, 0x3462, 0x4c7e, 0x4a4a, 0x6176, 0x6175, 0x6177, 0x6178, 0x617c, 0x6179, 0x617a, 0x617b, 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, 0x482f, 0x4550, 0x6224, 0x4772, 0x4934, 0x6225, 0x6226, 0x452a, 0x3327, 0x3944, 0x6227, 0x6228, 0x6229, 0x3b29, 0x622b, 0x622a, 0x622c, 0x622d, 0x4869, 0x622e, 0x622f, 0x7369, 0x6230, 0x6231, 0x6232, 0x3b2e, 0x6233, 0x4756, 0x4b5f, 0x314e, 0x3157, 0x6234, 0x6236, 0x6235, 0x4570, 0x4039, 0x5d39, 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857, 0x6239, 0x623a, 0x623b, 0x4c5c, 0x4c55, 0x443e, 0x416a, 0x623d, 0x3d62, 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x3447, 0x3829, 0x6246, 0x6243, 0x3f3f, 0x4c32, 0x6242, 0x6244, 0x6245, 0x6241, 0x6247, 0x6248, 0x442f, 0x3463, 0x4365, 0x6249, 0x624a, 0x624d, 0x3f67, 0x4644, 0x624e, 0x4b53, 0x624b, 0x624c, 0x6251, 0x6250, 0x624f, 0x6253, 0x6252, 0x6254, 0x6256, 0x6255, 0x4a4d, 0x3d56, 0x4e46, 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c, 0x625a, 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0x4c70, 0x6263, 0x434e, 0x476a, 0x366b, 0x433b, 0x6264, 0x363a, 0x4050, 0x6265, 0x3a3d, 0x6266, 0x6267, 0x3826, 0x3a55, 0x6269, 0x4556, 0x3a56, 0x354e, 0x4b24, 0x474b, 0x4557, 0x395c, 0x626b, 0x3e4b, 0x4e32, 0x3945, 0x3827, 0x4823, 0x626d, 0x626f, 0x386b, 0x626e, 0x4476, 0x6271, 0x3337, 0x626c, 0x486a, 0x3130, 0x3a6c, 0x4f52, 0x6270, 0x6272, 0x4a4b, 0x4059, 0x6274, 0x6275, 0x6273, 0x334e, 0x627b, 0x627a, 0x3c27, 0x627c, 0x6277, 0x627d, 0x6278, 0x4858, 0x6276, 0x6279, 0x6322, 0x6321, 0x4b61, 0x627e, 0x306b, 0x6324, 0x6323, 0x3e4c, 0x6325, 0x4143, 0x6327, 0x6326, 0x6328, 0x6268, 0x626a, 0x632a, 0x6329, 0x3c28, 0x4e69, 0x3c52, 0x632b, 0x3737, 0x3540, 0x3527, 0x3b63, 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d, 0x632f, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0x493c, 0x3a57, 0x4578, 0x6332, 0x6333, 0x6349, 0x3658, 0x4f3d, 0x4135, 0x6334, 0x3252, 0x4477, 0x4a21, 0x6335, 0x357a, 0x6336, 0x6338, 0x6339, 0x4729, 0x633a, 0x633b, 0x633c, 0x3659, 0x3253, 0x4645, 0x3d28, 0x3b64, 0x633d, 0x3d29, 0x324a, 0x4943, 0x633e, 0x486b, 0x4145, 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, 0x6340, 0x3e4e, 0x305c, 0x3529, 0x6343, 0x4478, 0x6344, 0x4047, 0x4c2d, 0x4923, 0x6345, 0x6346, 0x4355, 0x4e47, 0x6348, 0x6347, 0x3c6f, 0x634a, 0x3070, 0x634d, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, 0x3972, 0x4a66, 0x634e, 0x4b54, 0x6350, 0x4051, 0x314f, 0x323a, 0x302c, 0x634f, 0x6351, 0x6352, 0x3e77, 0x6353, 0x334f, 0x6355, 0x376a, 0x3566, 0x6356, 0x3675, 0x6357, 0x407c, 0x464d, 0x4060, 0x3a75, 0x6358, 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b, 0x3722, 0x635d, 0x3726, 0x3567, 0x4d52, 0x635f, 0x6360, 0x312e, 0x6363, 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29, 0x6367, 0x6368, 0x5474, 0x636a, 0x6369, 0x636b, 0x636c, 0x4e35, 0x636d, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x4638, 0x6370, 0x4328, 0x6371, 0x433c, 0x6372, 0x3625, 0x513f, 0x435d, 0x3c33, 0x3448, 0x6373, 0x6422, 0x6376, 0x3568, 0x6375, 0x6424, 0x6374, 0x3e50, 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, 0x4964, 0x637c, 0x4268, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x6426, 0x492e, 0x4826, 0x4579, 0x365a, 0x6425, 0x6423, 0x4835, 0x637e, 0x435e, 0x457b, 0x457a, 0x3a76, 0x6438, 0x6428, 0x642a, 0x642d, 0x642e, 0x642b, 0x642c, 0x6429, 0x6427, 0x6421, 0x4a4f, 0x3255, 0x6435, 0x6432, 0x6437, 0x6436, 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439, 0x6434, 0x6433, 0x642f, 0x6431, 0x3449, 0x433d, 0x407d, 0x4822, 0x643e, 0x4824, 0x4061, 0x643b, 0x484f, 0x643f, 0x4a53, 0x435b, 0x643a, 0x643c, 0x643d, 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444, 0x6441, 0x4f36, 0x644a, 0x644e, 0x644b, 0x6447, 0x6448, 0x644d, 0x6442, 0x5255, 0x6449, 0x6443, 0x644c, 0x6452, 0x344a, 0x644f, 0x6450, 0x6451, 0x6454, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d, 0x645a, 0x6457, 0x6456, 0x4052, 0x6459, 0x645b, 0x6458, 0x645f, 0x645c, 0x645d, 0x6446, 0x645e, 0x6460, 0x6461, 0x4a46, 0x6462, 0x4c62, 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x6464, 0x4e33, 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x6469, 0x6467, 0x6465, 0x3421, 0x3e51, 0x646a, 0x6468, 0x6466, 0x646e, 0x646d, 0x646c, 0x646b, 0x646f, 0x6470, 0x403a, 0x6471, 0x6473, 0x6472, 0x3852, 0x4138, 0x6475, 0x457c, 0x6474, 0x6476, 0x4a35, 0x416c, 0x3947, 0x6477, 0x4e48, 0x6479, 0x647a, 0x647b, 0x647c, 0x3b65, 0x647d, 0x374f, 0x356a, 0x352a, 0x6521, 0x4c73, 0x3948, 0x647e, 0x6524, 0x4c66, 0x473c, 0x4933, 0x3d63, 0x6523, 0x3c53, 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x4147, 0x4b42, 0x3a77, 0x3b67, 0x445d, 0x6527, 0x4e5f, 0x3a59, 0x6528, 0x3f42, 0x652a, 0x3e52, 0x3a30, 0x6529, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x6526, 0x3750, 0x652e, 0x6532, 0x376b, 0x652d, 0x6536, 0x394a, 0x4d6d, 0x303c, 0x6533, 0x356b, 0x6530, 0x6531, 0x457d, 0x652f, 0x652c, 0x3328, 0x4064, 0x3828, 0x6538, 0x6535, 0x6537, 0x6534, 0x3751, 0x4233, 0x6539, 0x416e, 0x6546, 0x6542, 0x653c, 0x6540, 0x3c7a, 0x305d, 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d, 0x6545, 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, 0x653e, 0x365b, 0x486c, 0x416d, 0x4e50, 0x3d6f, 0x656e, 0x6548, 0x407e, 0x6544, 0x6549, 0x654b, 0x4479, 0x654e, 0x654a, 0x4a54, 0x344b, 0x4c4b, 0x305e, 0x654d, 0x4e7d, 0x654c, 0x316f, 0x466c, 0x654f, 0x6556, 0x6550, 0x6557, 0x6553, 0x477b, 0x3c4a, 0x6555, 0x6552, 0x6558, 0x6551, 0x3d44, 0x4b25, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f, 0x655d, 0x6561, 0x655b, 0x6541, 0x4053, 0x484b, 0x655e, 0x6559, 0x4121, 0x3752, 0x3d2b, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567, 0x6563, 0x6565, 0x655a, 0x6562, 0x656a, 0x6569, 0x4b7a, 0x372b, 0x6568, 0x656c, 0x656b, 0x656f, 0x6571, 0x3b3c, 0x656d, 0x6572, 0x6573, 0x6574, 0x657a, 0x453b, 0x6576, 0x6575, 0x6577, 0x6578, 0x6579, 0x657b, 0x657c, 0x344c, 0x657d, 0x657e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6628, 0x6627, 0x6629, 0x662a, 0x662b, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0x4356, 0x4833, 0x3d70, 0x474d, 0x486d, 0x662f, 0x586d, 0x6630, 0x6632, 0x4d65, 0x6631, 0x6634, 0x6633, 0x4d53, 0x6635, 0x487e, 0x6636, 0x6639, 0x6638, 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0x663e, 0x663b, 0x663c, 0x663f, 0x6640, 0x663d, 0x3129, 0x3227, 0x6642, 0x6643, 0x6644, 0x4d62, 0x3d2c, 0x6646, 0x6645, 0x3f69, 0x6647, 0x6648, 0x6649, 0x3465, 0x344d, 0x664a, 0x664b, 0x4b5d, 0x4d63, 0x4d54, 0x4f37, 0x394d, 0x664e, 0x3c54, 0x664d, 0x664f, 0x3c29, 0x4251, 0x6650, 0x394c, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x3c2a, 0x4c6d, 0x6657, 0x433f, 0x6656, 0x6659, 0x6658, 0x665a, 0x403b, 0x665b, 0x665c, 0x4a39, 0x665d, 0x416f, 0x665e, 0x665f, 0x4e7e, 0x6662, 0x6661, 0x6660, 0x4430, 0x6663, 0x3f26, 0x6664, 0x6665, 0x4f38, 0x6666, 0x6667, 0x6669, 0x6668, 0x4825, 0x4679, 0x4f3e, 0x4829, 0x666b, 0x3e53, 0x492a, 0x666c, 0x666a, 0x344e, 0x3854, 0x3b68, 0x486e, 0x382a, 0x4b43, 0x666f, 0x666d, 0x394e, 0x394f, 0x3069, 0x3a68, 0x4759, 0x305f, 0x6674, 0x4340, 0x4758, 0x425b, 0x6676, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, 0x3855, 0x307d, 0x6671, 0x6678, 0x6679, 0x4639, 0x363b, 0x6726, 0x473d, 0x3b69, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0x3553, 0x667a, 0x667c, 0x667b, 0x667d, 0x4326, 0x473e, 0x4431, 0x6723, 0x6722, 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, 0x4f53, 0x6735, 0x6729, 0x672a, 0x3c70, 0x6728, 0x3978, 0x6727, 0x672b, 0x4432, 0x4a22, 0x4123, 0x425c, 0x672f, 0x6730, 0x672c, 0x672d, 0x672e, 0x3951, 0x6736, 0x6732, 0x4966, 0x4b6c, 0x4928, 0x6731, 0x6734, 0x6733, 0x4b44, 0x6737, 0x6738, 0x4137, 0x6739, 0x673b, 0x673f, 0x673c, 0x673a, 0x473f, 0x673d, 0x673e, 0x3232, 0x6745, 0x6740, 0x6741, 0x6742, 0x4221, 0x6744, 0x6743, 0x6746, 0x6747, 0x6748, 0x3f43, 0x3269, 0x6749, 0x4e57, 0x3c2b, 0x3d2d, 0x3b6a, 0x4357, 0x674a, 0x674b, 0x3131, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x363d, 0x5a2a, 0x6751, 0x4065, 0x6752, 0x3c4b, 0x6753, 0x5030, 0x6754, 0x4a5e, 0x345c, 0x4124, 0x3d58, 0x4971, 0x3d2e, 0x6755, 0x3952, 0x6756, 0x484c, 0x6764, 0x6758, 0x4249, 0x4775, 0x383f, 0x6757, 0x4125, 0x6759, 0x447a, 0x675b, 0x675a, 0x675d, 0x675c, 0x675e, 0x6760, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763, 0x3a31, 0x4e49, 0x6765, 0x3f27, 0x3170, 0x6766, 0x6767, 0x6768, 0x3072, 0x6769, 0x676a, 0x4967, 0x3c47, 0x676c, 0x3329, 0x3032, 0x676b, 0x676e, 0x474e, 0x3f44, 0x3256, 0x4b27, 0x375d, 0x365c, 0x676d, 0x326a, 0x3423, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x4944, 0x677e, 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0x6770, 0x3c63, 0x366c, 0x4377, 0x4651, 0x3151, 0x6774, 0x6773, 0x6779, 0x6775, 0x6778, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x677d, 0x3754, 0x6823, 0x682c, 0x682d, 0x302b, 0x6834, 0x3071, 0x682b, 0x682a, 0x6825, 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, 0x6826, 0x6829, 0x4170, 0x3755, 0x3141, 0x6828, 0x3953, 0x4171, 0x683a, 0x683b, 0x3259, 0x322e, 0x6838, 0x682e, 0x6836, 0x683d, 0x6837, 0x6835, 0x6776, 0x6833, 0x682f, 0x3450, 0x6831, 0x683c, 0x6832, 0x683e, 0x6830, 0x477c, 0x4d69, 0x6839, 0x684f, 0x6847, 0x3f7b, 0x3546, 0x365d, 0x6842, 0x325b, 0x3e54, 0x6845, 0x3a5a, 0x4551, 0x684a, 0x4a6e, 0x6841, 0x325a, 0x3856, 0x4929, 0x684b, 0x683f, 0x6848, 0x6852, 0x6843, 0x6844, 0x463a, 0x6849, 0x6846, 0x4b28, 0x684c, 0x3060, 0x6840, 0x684e, 0x684d, 0x476b, 0x6854, 0x685f, 0x337e, 0x6862, 0x6850, 0x6855, 0x4d6e, 0x685e, 0x4d55, 0x4e2a, 0x4378, 0x336b, 0x4972, 0x6864, 0x4621, 0x3031, 0x685d, 0x6859, 0x4172, 0x6853, 0x685b, 0x6860, 0x472c, 0x302a, 0x6858, 0x6861, 0x4978, 0x685c, 0x6857, 0x3e55, 0x3d2f, 0x3c2c, 0x4c58, 0x4947, 0x6867, 0x6870, 0x685a, 0x3377, 0x3e78, 0x6865, 0x686a, 0x4173, 0x6866, 0x686d, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, 0x6869, 0x686c, 0x4c2c, 0x686f, 0x6868, 0x686b, 0x4b29, 0x4f21, 0x6873, 0x687a, 0x6872, 0x3c43, 0x6851, 0x4a4e, 0x4c22, 0x6879, 0x6878, 0x6874, 0x6875, 0x3136, 0x6877, 0x6871, 0x4455, 0x6876, 0x307e, 0x4222, 0x4a43, 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49, 0x6923, 0x363e, 0x6924, 0x4979, 0x687d, 0x6856, 0x687c, 0x4f4f, 0x4622, 0x4973, 0x692b, 0x6931, 0x6932, 0x6925, 0x4776, 0x692f, 0x6927, 0x6929, 0x6933, 0x6928, 0x692c, 0x3172, 0x4665, 0x692d, 0x6930, 0x6926, 0x4126, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x4c79, 0x3d72, 0x6937, 0x6935, 0x4f4e, 0x6934, 0x4d75, 0x6936, 0x6938, 0x6939, 0x693c, 0x693a, 0x4623, 0x693b, 0x484d, 0x692e, 0x3d73, 0x693d, 0x6942, 0x4174, 0x6941, 0x6922, 0x6943, 0x4149, 0x693e, 0x6940, 0x693f, 0x5d31, 0x5d22, 0x6945, 0x6944, 0x4d76, 0x623c, 0x6946, 0x6947, 0x6948, 0x3857, 0x3554, 0x694a, 0x515d, 0x3575, 0x4e3a, 0x3673, 0x694b, 0x694c, 0x436e, 0x694d, 0x467a, 0x303a, 0x3263, 0x6952, 0x6953, 0x694e, 0x3b3d, 0x694f, 0x4742, 0x6950, 0x6951, 0x695b, 0x6955, 0x6958, 0x6954, 0x6956, 0x6957, 0x3c58, 0x6959, 0x4341, 0x3756, 0x3342, 0x695c, 0x333f, 0x6961, 0x695d, 0x6960, 0x483a, 0x695e, 0x695f, 0x4948, 0x485a, 0x6962, 0x427d, 0x696c, 0x6968, 0x326b, 0x6966, 0x4b2a, 0x6967, 0x6964, 0x6965, 0x696a, 0x696d, 0x696b, 0x6969, 0x6963, 0x4358, 0x6974, 0x4c2a, 0x6972, 0x6973, 0x696e, 0x6970, 0x6971, 0x696f, 0x4066, 0x4f39, 0x6978, 0x6979, 0x6a21, 0x3f2a, 0x697b, 0x697e, 0x6976, 0x6975, 0x6a22, 0x325c, 0x697c, 0x6a23, 0x697d, 0x697a, 0x4433, 0x6977, 0x4768, 0x6a27, 0x4d3b, 0x6a26, 0x6a25, 0x6a2e, 0x6a28, 0x6a30, 0x4d66, 0x6a33, 0x6a2a, 0x6a2b, 0x6a2f, 0x6a32, 0x6a31, 0x6a29, 0x6a2c, 0x6a3d, 0x6a36, 0x6a34, 0x6a35, 0x6a3a, 0x6a3b, 0x332a, 0x3542, 0x6a39, 0x6a24, 0x6a38, 0x6a3c, 0x6a37, 0x6a3e, 0x6a40, 0x6a3f, 0x6a42, 0x6a41, 0x695a, 0x6a46, 0x6a43, 0x6a44, 0x6a45, 0x6a47, 0x376c, 0x6a49, 0x6a48, 0x3d30, 0x3954, 0x5e27, 0x6a4a, 0x3d51, 0x3339, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0x3955, 0x6a4d, 0x3061, 0x493d, 0x6a4e, 0x3f6a, 0x6a55, 0x6a52, 0x436f, 0x6a53, 0x6a50, 0x365e, 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c, 0x6a58, 0x4235, 0x6a57, 0x6a5a, 0x6a51, 0x6a5b, 0x6a5d, 0x486f, 0x6a59, 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0x6a5f, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x4e22, 0x6a63, 0x4d35, 0x6a64, 0x6a65, 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0x6a6c, 0x3e58, 0x6a6a, 0x4d67, 0x6a67, 0x6a69, 0x403d, 0x3f7e, 0x6a68, 0x6a6d, 0x4a23, 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, 0x6a70, 0x6a7c, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a79, 0x6a7a, 0x6a78, 0x6a76, 0x6a71, 0x6a77, 0x6a7b, 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0x6b22, 0x6b21, 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28, 0x403e, 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0x6b2b, 0x382b, 0x352c, 0x6b2c, 0x3b6b, 0x4741, 0x6b2d, 0x3350, 0x6b2e, 0x6b30, 0x4d77, 0x6b2f, 0x3f46, 0x6b31, 0x6b32, 0x6b33, 0x3451, 0x6b34, 0x6b35, 0x6b36, 0x6b37, 0x3351, 0x6b38, 0x6b39, 0x6b3a, 0x3272, 0x3f28, 0x6b3b, 0x6b3c, 0x6b3d, 0x3840, 0x447b, 0x6b3e, 0x3757, 0x3f56, 0x6b41, 0x4624, 0x6b40, 0x3731, 0x6b3f, 0x4277, 0x352d, 0x6b42, 0x6b43, 0x3e59, 0x376d, 0x6b44, 0x4b2c, 0x405f, 0x3576, 0x4c75, 0x414a, 0x6b45, 0x3f47, 0x4370, 0x3e5a, 0x6b46, 0x6b49, 0x6b4a, 0x3a3e, 0x4242, 0x6b48, 0x3e5b, 0x493e, 0x6b47, 0x3b6c, 0x3153, 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x6b4b, 0x6b50, 0x6b51, 0x6b4f, 0x3858, 0x4d40, 0x3b6f, 0x4727, 0x6b54, 0x4040, 0x4342, 0x4d36, 0x6b57, 0x386c, 0x403f, 0x6b53, 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x6b52, 0x4062, 0x4649, 0x432f, 0x325d, 0x4870, 0x3543, 0x4434, 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b, 0x4e4a, 0x4f40, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x6b63, 0x6b6b, 0x6b64, 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, 0x3b70, 0x6b61, 0x6b5e, 0x6b65, 0x3d74, 0x3841, 0x427a, 0x4b45, 0x315a, 0x3062, 0x4625, 0x6b69, 0x6b68, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e, 0x382c, 0x6b6a, 0x3956, 0x3c55, 0x6b6f, 0x4d58, 0x6b72, 0x6b75, 0x6b73, 0x4935, 0x6b70, 0x3660, 0x6b74, 0x6b76, 0x6b7a, 0x6b77, 0x6b79, 0x6b78, 0x6b7b, 0x3c31, 0x6b7d, 0x6b7c, 0x4968, 0x6c21, 0x3759, 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x6c24, 0x386e, 0x6c25, 0x6c26, 0x3b3e, 0x5a4e, 0x6c27, 0x6c28, 0x3d32, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x432b, 0x6c2e, 0x6c30, 0x6c2f, 0x4626, 0x6c31, 0x4b2d, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x465a, 0x3e5d, 0x6c36, 0x396b, 0x502e, 0x6c37, 0x6c38, 0x493f, 0x6c39, 0x6c41, 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e, 0x6c3f, 0x6c40, 0x6c42, 0x332d, 0x4467, 0x4969, 0x3a62, 0x3957, 0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379, 0x4c63, 0x6c47, 0x6c48, 0x352e, 0x6c4a, 0x4763, 0x425f, 0x4871, 0x453d, 0x6c46, 0x4b47, 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x3b71, 0x6c4b, 0x4231, 0x6c5c, 0x4128, 0x4678, 0x4950, 0x6c4f, 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x382d, 0x6c4e, 0x6c4d, 0x496a, 0x3c41, 0x4552, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x6c53, 0x6c54, 0x6c56, 0x4223, 0x6c55, 0x3466, 0x6c58, 0x6c57, 0x6c59, 0x6c5b, 0x6c5d, 0x6c5e, 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0x6c60, 0x4176, 0x6c61, 0x6c62, 0x496b, 0x352f, 0x6c63, 0x4436, 0x315b, 0x6c64, 0x3c71, 0x3f76, 0x422d, 0x6c67, 0x6c66, 0x6c65, 0x6c6d, 0x6c6b, 0x6c68, 0x6c6a, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057, 0x6c71, 0x3859, 0x6c6e, 0x6c6f, 0x4f29, 0x4437, 0x4129, 0x6c72, 0x6c75, 0x6c73, 0x6c74, 0x4d59, 0x4627, 0x6c78, 0x6c76, 0x6c77, 0x6c79, 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0x6c7a, 0x447d, 0x6d21, 0x6d25, 0x6d22, 0x6c7e, 0x6d23, 0x6d24, 0x6d2b, 0x6d26, 0x4058, 0x6d28, 0x6d2a, 0x6d27, 0x6d2d, 0x3d33, 0x6d2c, 0x6d2e, 0x6d2f, 0x6d32, 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, 0x6d35, 0x6d37, 0x6d38, 0x6d3a, 0x6d39, 0x3f48, 0x6d3b, 0x366d, 0x6d3c, 0x6d3e, 0x6d3f, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530, 0x3733, 0x382e, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, 0x3c34, 0x6d46, 0x6d45, 0x375a, 0x6d48, 0x3353, 0x6d4a, 0x3a5c, 0x6d49, 0x6d52, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x6d4d, 0x6d51, 0x6d4f, 0x3531, 0x6d50, 0x6d53, 0x475a, 0x4e58, 0x3d34, 0x6d54, 0x4d22, 0x6d56, 0x6d55, 0x6d59, 0x4d41, 0x6d58, 0x336d, 0x6d57, 0x6d5c, 0x6d5b, 0x6d5a, 0x4532, 0x6d5d, 0x6d5e, 0x6d5f, 0x396c, 0x3725, 0x6d60, 0x6d61, 0x6d62, 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65, 0x5221, 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0x6d68, 0x4a55, 0x4454, 0x397e, 0x4329, 0x312a, 0x4b78, 0x3f57, 0x375e, 0x3661, 0x4a56, 0x6d69, 0x6d6b, 0x6d6a, 0x3260, 0x4676, 0x6d6c, 0x4777, 0x4533, 0x6d6d, 0x3d52, 0x6d6f, 0x4c42, 0x6d7e, 0x6d71, 0x6d72, 0x4449, 0x4260, 0x4177, 0x4628, 0x6d70, 0x3555, 0x6d79, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553, 0x6d74, 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e, 0x4224, 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x4261, 0x3d35, 0x3f4a, 0x6d7c, 0x6d7b, 0x306f, 0x6d7d, 0x492f, 0x6e27, 0x465b, 0x3f6b, 0x4359, 0x3678, 0x6e26, 0x4d37, 0x313f, 0x4a57, 0x3261, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x6e29, 0x7423, 0x423d, 0x6e2a, 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b, 0x452c, 0x4178, 0x3c57, 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b, 0x412a, 0x3064, 0x4e4b, 0x6e31, 0x4872, 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0x6d6e, 0x6e35, 0x6e34, 0x6e36, 0x4d38, 0x4661, 0x4b2e, 0x6e37, 0x3c59, 0x6e38, 0x6e39, 0x6e3a, 0x4521, 0x306a, 0x3959, 0x4f3a, 0x6e3e, 0x3734, 0x6e3b, 0x6e3c, 0x4974, 0x3354, 0x4d39, 0x363f, 0x4554, 0x6e3f, 0x6e40, 0x6e41, 0x4522, 0x6e43, 0x6e42, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x3c72, 0x3f6c, 0x6e45, 0x6e46, 0x3f5d, 0x6e47, 0x6e48, 0x6e49, 0x4d6f, 0x3d37, 0x6e4b, 0x6e4a, 0x395a, 0x3973, 0x3b40, 0x6e4e, 0x3d66, 0x6e4d, 0x6e4c, 0x4269, 0x386f, 0x4043, 0x4830, 0x3d39, 0x6e4f, 0x3e5f, 0x6e52, 0x6e50, 0x6e51, 0x6e54, 0x6e53, 0x3e7a, 0x6e55, 0x6e56, 0x6e57, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, 0x4523, 0x6e5e, 0x3378, 0x3f4b, 0x6e5c, 0x6e5d, 0x4460, 0x4b55, 0x367c, 0x6e60, 0x6e61, 0x6e5f, 0x6e63, 0x465f, 0x3343, 0x6e67, 0x6e64, 0x6e66, 0x6e62, 0x6f4f, 0x6e65, 0x4e6b, 0x385a, 0x6e6f, 0x4534, 0x6e6a, 0x6e6d, 0x6e6b, 0x6e70, 0x6e71, 0x6e69, 0x6e76, 0x3174, 0x6e68, 0x482d, 0x6e6c, 0x3e60, 0x395b, 0x4b48, 0x3664, 0x3d46, 0x463c, 0x412d, 0x6e74, 0x6e6e, 0x6e73, 0x4c43, 0x4438, 0x6e75, 0x6e72, 0x412c, 0x6e79, 0x6e78, 0x6e77, 0x4b2f, 0x3d7b, 0x6e7a, 0x4a5f, 0x3154, 0x4946, 0x4372, 0x3578, 0x6e7c, 0x395d, 0x3b2c, 0x6e7b, 0x3f6d, 0x3f6e, 0x6f21, 0x6f23, 0x3e7b, 0x6f22, 0x6f24, 0x3653, 0x4945, 0x3c62, 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25, 0x6f27, 0x6e7d, 0x4669, 0x4555, 0x4457, 0x6f2c, 0x4343, 0x6f28, 0x6f29, 0x372d, 0x6f2b, 0x3830, 0x6f2a, 0x3e61, 0x3379, 0x6f30, 0x3a3f, 0x4179, 0x444a, 0x333b, 0x6f2e, 0x6f2f, 0x4443, 0x6f2d, 0x6f31, 0x6f37, 0x6f3a, 0x6f39, 0x452d, 0x6f32, 0x6f33, 0x6f36, 0x6f38, 0x3640, 0x6f3b, 0x6f35, 0x6f34, 0x6f3f, 0x6f40, 0x6f41, 0x6f3e, 0x6f3d, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0x6f44, 0x6f42, 0x4278, 0x6f46, 0x6f47, 0x6f49, 0x3455, 0x6f48, 0x4c7a, 0x6f54, 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x6f55, 0x6f53, 0x6f56, 0x6f58, 0x6f57, 0x4439, 0x4c67, 0x6f59, 0x412e, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, 0x313c, 0x3457, 0x3456, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x6f60, 0x3458, 0x3355, 0x395e, 0x4836, 0x6f62, 0x6f61, 0x6f63, 0x315c, 0x6f66, 0x6f65, 0x6f64, 0x6f67, 0x6f6a, 0x3047, 0x6f68, 0x6f6c, 0x6f6b, 0x6f6e, 0x6f6d, 0x6f6f, 0x462e, 0x6f70, 0x6f71, 0x6f73, 0x6f72, 0x496c, 0x6f74, 0x6f75, 0x3a65, 0x6f76, 0x6f77, 0x4b49, 0x414b, 0x3024, 0x424b, 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, 0x3842, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x4766, 0x7025, 0x3122, 0x7024, 0x4444, 0x4e4d, 0x462b, 0x6f7c, 0x4e26, 0x3831, 0x4d5b, 0x3679, 0x4e34, 0x3728, 0x4262, 0x6721, 0x7026, 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029, 0x7027, 0x3764, 0x3a5d, 0x3e63, 0x3123, 0x4e59, 0x702b, 0x6e2e, 0x702a, 0x702e, 0x702c, 0x702d, 0x702f, 0x7030, 0x4e6c, 0x7031, 0x7032, 0x4049, 0x483b, 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38, 0x385b, 0x7035, 0x7034, 0x3b73, 0x7036, 0x7033, 0x3b28, 0x703a, 0x6a2d, 0x5256, 0x3f77, 0x7038, 0x4e25, 0x4671, 0x312b, 0x4063, 0x3c36, 0x4a37, 0x3140, 0x4e6d, 0x4d6b, 0x703b, 0x4545, 0x3c7b, 0x703c, 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, 0x7042, 0x7041, 0x703f, 0x7043, 0x7044, 0x417a, 0x3262, 0x7045, 0x4c38, 0x7046, 0x7047, 0x4f2a, 0x5b31, 0x7048, 0x7049, 0x704a, 0x704e, 0x704b, 0x704c, 0x704d, 0x704f, 0x4044, 0x4c77, 0x4045, 0x7050, 0x4873, 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, 0x7054, 0x3357, 0x7056, 0x3f59, 0x7057, 0x3724, 0x7058, 0x705c, 0x705a, 0x705b, 0x3373, 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, 0x3e64, 0x7061, 0x3547, 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x345a, 0x706b, 0x706c, 0x4723, 0x706e, 0x323b, 0x7071, 0x7070, 0x3124, 0x3641, 0x4a47, 0x443a, 0x3a22, 0x3960, 0x3d67, 0x3f5c, 0x7073, 0x7072, 0x4d42, 0x3468, 0x4852, 0x465c, 0x3f7c, 0x4e4e, 0x375b, 0x7076, 0x7075, 0x4b4b, 0x462c, 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078, 0x7079, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x3469, 0x3832, 0x346a, 0x453f, 0x4e60, 0x385c, 0x707c, 0x707d, 0x707e, 0x7121, 0x7123, 0x7122, 0x4977, 0x7124, 0x7125, 0x7126, 0x7127, 0x7129, 0x7128, 0x712a, 0x4874, 0x664c, 0x3f29, 0x3532, 0x712b, 0x712c, 0x522c, 0x5d3b, 0x4853, 0x307b, 0x303b, 0x3b74, 0x4b30, 0x3e7e, 0x712d, 0x4c5f, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, 0x326e, 0x7130, 0x7131, 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713d, 0x713c, 0x713f, 0x7142, 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x3c73, 0x7144, 0x7145, 0x3961, 0x7146, 0x333e, 0x474f, 0x7147, 0x7148, 0x435a, 0x466b, 0x7149, 0x477d, 0x424c, 0x3158, 0x366e, 0x366f, 0x4373, 0x714e, 0x3670, 0x326f, 0x714d, 0x714b, 0x714c, 0x714a, 0x7158, 0x714f, 0x7150, 0x7151, 0x7152, 0x7154, 0x7153, 0x3d59, 0x7155, 0x7157, 0x3533, 0x7156, 0x417b, 0x3833, 0x7159, 0x424d, 0x715a, 0x462d, 0x715b, 0x7160, 0x715e, 0x715d, 0x715f, 0x715c, 0x7162, 0x7161, 0x7164, 0x3643, 0x7163, 0x7165, 0x7166, 0x7168, 0x7167, 0x7169, 0x716b, 0x716a, 0x397c, 0x716c, 0x716d, 0x333c, 0x716e, 0x716f, 0x3f71, 0x7170, 0x7171, 0x7172, 0x7173, 0x3962, 0x7174, 0x7175, 0x7176, 0x7177, 0x7178, 0x4831, 0x717a, 0x4926, 0x717b, 0x7179, 0x717d, 0x717c, 0x717e, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0x722d, 0x722e, 0x5d35, 0x722f, 0x6478, 0x3534, 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0x7233, 0x7234, 0x7232, 0x7235, 0x4b62, 0x7236, 0x357b, 0x4f25, 0x7237, 0x7239, 0x303e, 0x723a, 0x4a2b, 0x7238, 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, 0x4b6e, 0x3b2d, 0x3a7a, 0x412f, 0x7240, 0x7243, 0x7241, 0x7244, 0x3871, 0x7242, 0x7245, 0x7246, 0x7247, 0x724b, 0x3b2a, 0x4264, 0x724c, 0x7249, 0x7248, 0x724a, 0x375f, 0x7250, 0x724f, 0x724e, 0x3033, 0x725a, 0x7256, 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, 0x4f4c, 0x7258, 0x7254, 0x7252, 0x7251, 0x725c, 0x725f, 0x725e, 0x725d, 0x4949, 0x725b, 0x3073, 0x7260, 0x7262, 0x336f, 0x724d, 0x3137, 0x7264, 0x7263, 0x7261, 0x432d, 0x4b70, 0x4e5a, 0x7265, 0x7266, 0x7267, 0x7268, 0x7269, 0x443b, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c, 0x4b31, 0x4c44, 0x4650, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d, 0x322a, 0x7279, 0x7278, 0x3175, 0x7276, 0x7275, 0x7273, 0x337b, 0x7272, 0x3c32, 0x3229, 0x3963, 0x727c, 0x727b, 0x727a, 0x7277, 0x727d, 0x727e, 0x7325, 0x7324, 0x7326, 0x312d, 0x7321, 0x7322, 0x3974, 0x4c39, 0x7323, 0x4b32, 0x732b, 0x7327, 0x732c, 0x7329, 0x7328, 0x375c, 0x732d, 0x732e, 0x732f, 0x732a, 0x7274, 0x7330, 0x4461, 0x7334, 0x7335, 0x7333, 0x7332, 0x7338, 0x7331, 0x7336, 0x7337, 0x733a, 0x7339, 0x733c, 0x733d, 0x733e, 0x4f49, 0x733b, 0x426b, 0x3a6d, 0x733f, 0x7340, 0x7341, 0x7342, 0x7343, 0x3834, 0x7344, 0x7345, 0x3c2f, 0x7346, 0x7347, 0x7348, 0x7349, 0x734c, 0x734a, 0x4f3c, 0x734b, 0x4e6f, 0x734d, 0x4e5b, 0x734e, 0x477e, 0x734f, 0x7351, 0x7352, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0x5d60, 0x4b7b, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x3975, 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a, 0x735c, 0x735d, 0x735e, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x4524, 0x385d, 0x736a, 0x414d, 0x736b, 0x736c, 0x4921, 0x736d, 0x736e, 0x6337, 0x6c5a, 0x706d, 0x736f, 0x7370, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371, 0x7375, 0x7376, 0x7378, 0x7377, 0x737a, 0x737b, 0x7379, 0x4e36, 0x737c, 0x737d, 0x6354, 0x737e, 0x212a, 0x2174, 0x2170, 0x2173, 0x2175, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x2125, 0x213f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129, 0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132, 0x212e, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2131, 0x216f, }; static const Summary16 jisx0208_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x118c }, { 5, 0x0053 }, { 9, 0x0000 }, { 9, 0x0080 }, { 10, 0x0000 }, { 10, 0x0080 }, }; static const Summary16 jisx0208_uni2indx_page03[22] = { /* 0x0300 */ { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0xfffe }, { 26, 0x03fb }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, /* 0x0400 */ { 59, 0x0002 }, { 60, 0xffff }, { 76, 0xffff }, { 92, 0xffff }, { 108, 0xffff }, { 124, 0x0002 }, }; static const Summary16 jisx0208_uni2indx_page20[50] = { /* 0x2000 */ { 125, 0x0000 }, { 125, 0x3361 }, { 132, 0x0063 }, { 136, 0x080d }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, /* 0x2100 */ { 140, 0x0008 }, { 141, 0x0000 }, { 141, 0x0800 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x000f }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0014 }, { 148, 0x0000 }, { 148, 0x0000 }, /* 0x2200 */ { 148, 0x098d }, { 154, 0x6404 }, { 158, 0x1f81 }, { 165, 0x2030 }, { 168, 0x0000 }, { 168, 0x0004 }, { 169, 0x0cc3 }, { 175, 0x0000 }, { 175, 0x00cc }, { 179, 0x0000 }, { 179, 0x0020 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, /* 0x2300 */ { 180, 0x0000 }, { 180, 0x0004 }, }; static const Summary16 jisx0208_uni2indx_page25[23] = { /* 0x2500 */ { 181, 0x900f }, { 187, 0x3999 }, { 195, 0x9939 }, { 203, 0x9999 }, { 211, 0x0804 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0003 }, { 215, 0x300c }, { 219, 0xc8c0 }, { 224, 0x0000 }, { 224, 0x8000 }, { 225, 0x0000 }, /* 0x2600 */ { 225, 0x0060 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0005 }, { 229, 0x0000 }, { 229, 0xa400 }, }; static const Summary16 jisx0208_uni2indx_page30[16] = { /* 0x3000 */ { 232, 0xffef }, { 247, 0x103f }, { 254, 0x0000 }, { 254, 0x0000 }, { 254, 0xfffe }, { 269, 0xffff }, { 285, 0xffff }, { 301, 0xffff }, { 317, 0xffff }, { 333, 0x780f }, { 341, 0xfffe }, { 356, 0xffff }, { 372, 0xffff }, { 388, 0xffff }, { 404, 0xffff }, { 420, 0x787f }, }; static const Summary16 jisx0208_uni2indx_page4e[1307] = { /* 0x4e00 */ { 431, 0x6f8b }, { 441, 0x43f3 }, { 450, 0x2442 }, { 454, 0x9b46 }, { 462, 0xe82c }, { 469, 0xe3e0 }, { 477, 0x0004 }, { 478, 0x400a }, { 481, 0x5f65 }, { 491, 0xdb36 }, { 501, 0x7977 }, { 512, 0x0449 }, { 516, 0xecd7 }, { 527, 0xe3f0 }, { 536, 0x6038 }, { 541, 0x08c5 }, /* 0x4f00 */ { 546, 0xe602 }, { 552, 0x3403 }, { 557, 0x8000 }, { 558, 0x3551 }, { 565, 0xe0c8 }, { 571, 0x7eab }, { 582, 0x8200 }, { 584, 0x9869 }, { 591, 0xa948 }, { 597, 0x2942 }, { 602, 0xe803 }, { 608, 0x8060 }, { 611, 0x441c }, { 616, 0xad93 }, { 625, 0xc03a }, { 631, 0x4568 }, /* 0x5000 */ { 637, 0xaa60 }, { 643, 0x8656 }, { 650, 0x3f7a }, { 661, 0x0240 }, { 663, 0x8388 }, { 668, 0x1461 }, { 673, 0x1020 }, { 675, 0x2174 }, { 681, 0x2021 }, { 684, 0x0702 }, { 688, 0x3000 }, { 690, 0x40bc }, { 696, 0xa624 }, { 702, 0x4462 }, { 707, 0x60a8 }, { 712, 0x0a20 }, /* 0x5100 */ { 715, 0x0217 }, { 720, 0x8574 }, { 727, 0x0402 }, { 729, 0x9c84 }, { 735, 0x7bfb }, { 748, 0x1415 }, { 753, 0x7f24 }, { 762, 0x11e2 }, { 768, 0xb665 }, { 777, 0x02ef }, { 785, 0x1f75 }, { 795, 0x20ff }, { 804, 0x3a70 }, { 811, 0x3840 }, { 815, 0x26c3 }, { 822, 0x6763 }, /* 0x5200 */ { 831, 0x4dd9 }, { 840, 0x2092 }, { 844, 0x46b0 }, { 850, 0x0fc9 }, { 858, 0xbc98 }, { 866, 0x4850 }, { 870, 0x8638 }, { 876, 0xa03f }, { 884, 0x2388 }, { 889, 0x8816 }, { 894, 0x3e09 }, { 901, 0x5232 }, { 907, 0x22aa }, { 913, 0xe3a4 }, { 921, 0x00dd }, { 927, 0xc72c }, /* 0x5300 */ { 935, 0xa166 }, { 942, 0x26e1 }, { 949, 0x840b }, { 954, 0x8f0a }, { 961, 0x27eb }, { 971, 0x559e }, { 980, 0xc241 }, { 985, 0x89bb }, { 994, 0x0014 }, { 996, 0x8540 }, { 1000, 0x6361 }, { 1007, 0x0849 }, { 1011, 0x7f0c }, { 1020, 0x8ad0 }, { 1026, 0xff3e }, { 1039, 0x05cf }, /* 0x5400 */ { 1047, 0xff1a }, { 1058, 0xa803 }, { 1063, 0x7a41 }, { 1070, 0x7b40 }, { 1077, 0x4745 }, { 1084, 0x8002 }, { 1086, 0x0500 }, { 1088, 0x38eb }, { 1097, 0xd851 }, { 1104, 0x0005 }, { 1106, 0x9934 }, { 1113, 0x710c }, { 1119, 0x0397 }, { 1126, 0x0100 }, { 1127, 0x6366 }, { 1135, 0x2404 }, /* 0x5500 */ { 1138, 0x80d0 }, { 1142, 0x0051 }, { 1145, 0xc000 }, { 1147, 0x430a }, { 1152, 0x9071 }, { 1158, 0x30c8 }, { 1163, 0x0008 }, { 1164, 0x5800 }, { 1167, 0x0e99 }, { 1174, 0xf700 }, { 1181, 0x5f80 }, { 1188, 0x0041 }, { 1190, 0x00b0 }, { 1193, 0x9410 }, { 1197, 0x0018 }, { 1199, 0x6280 }, /* 0x5600 */ { 1203, 0x0240 }, { 1205, 0x09d0 }, { 1210, 0x8200 }, { 1212, 0x0156 }, { 1217, 0x5004 }, { 1220, 0x0801 }, { 1222, 0x1d10 }, { 1227, 0x0510 }, { 1230, 0x84c1 }, { 1235, 0x0010 }, { 1236, 0x4025 }, { 1240, 0x1050 }, { 1243, 0x410f }, { 1249, 0x4d8a }, { 1256, 0x4009 }, { 1259, 0xa60d }, /* 0x5700 */ { 1266, 0xab19 }, { 1274, 0x914c }, { 1280, 0x21c0 }, { 1284, 0x0981 }, { 1288, 0xc485 }, { 1294, 0x0003 }, { 1296, 0x0652 }, { 1301, 0x8000 }, { 1302, 0x0b04 }, { 1306, 0x0008 }, { 1307, 0x041d }, { 1312, 0x0009 }, { 1314, 0x4849 }, { 1319, 0x905c }, { 1325, 0x0009 }, { 1327, 0x1690 }, /* 0x5800 */ { 1332, 0x0c65 }, { 1338, 0x2220 }, { 1341, 0x8412 }, { 1345, 0x2433 }, { 1351, 0x0c03 }, { 1355, 0x4796 }, { 1363, 0x0a04 }, { 1366, 0x4225 }, { 1371, 0x0028 }, { 1373, 0x9088 }, { 1377, 0x4900 }, { 1380, 0x4f08 }, { 1386, 0x14a2 }, { 1391, 0xd3aa }, { 1400, 0xd830 }, { 1406, 0x3e87 }, /* 0x5900 */ { 1415, 0x8604 }, { 1419, 0x1f61 }, { 1427, 0x7ea4 }, { 1436, 0x4186 }, { 1441, 0xc390 }, { 1447, 0x05b3 }, { 1454, 0x57a5 }, { 1463, 0x2118 }, { 1467, 0x241e }, { 1473, 0x2a48 }, { 1478, 0x1128 }, { 1482, 0x4a04 }, { 1486, 0x0a40 }, { 1489, 0x161b }, { 1496, 0x0d60 }, { 1501, 0x8840 }, /* 0x5a00 */ { 1504, 0x020a }, { 1507, 0x9502 }, { 1512, 0x8221 }, { 1516, 0x1060 }, { 1519, 0x0243 }, { 1523, 0x0400 }, { 1524, 0x1444 }, { 1528, 0x8000 }, { 1529, 0x0000 }, { 1529, 0x0c04 }, { 1532, 0x0000 }, { 1532, 0x7000 }, { 1535, 0x1a06 }, { 1540, 0x00c1 }, { 1543, 0x024a }, { 1547, 0x0c00 }, /* 0x5b00 */ { 1549, 0x1a00 }, { 1552, 0x0040 }, { 1553, 0x1404 }, { 1556, 0x4045 }, { 1560, 0x0029 }, { 1563, 0xbdb3 }, { 1574, 0x0a78 }, { 1580, 0x052b }, { 1586, 0xbba9 }, { 1596, 0xbfa0 }, { 1605, 0x407c }, { 1611, 0x8379 }, { 1619, 0x12fc }, { 1627, 0xe81d }, { 1635, 0x4bf6 }, { 1645, 0xc569 }, /* 0x5c00 */ { 1653, 0xeff6 }, { 1666, 0x044a }, { 1670, 0x2115 }, { 1675, 0xff02 }, { 1684, 0xed63 }, { 1694, 0x402b }, { 1699, 0xd033 }, { 1706, 0x0242 }, { 1709, 0x1000 }, { 1710, 0x0013 }, { 1713, 0x1b02 }, { 1718, 0x59ca }, { 1726, 0x00a0 }, { 1728, 0x0200 }, { 1729, 0xa703 }, { 1736, 0x2c41 }, /* 0x5d00 */ { 1741, 0x4880 }, { 1744, 0x8ff2 }, { 1754, 0x0204 }, { 1756, 0x0000 }, { 1756, 0x5800 }, { 1759, 0x1005 }, { 1762, 0x9200 }, { 1765, 0x0048 }, { 1767, 0x1894 }, { 1772, 0x2001 }, { 1774, 0x5004 }, { 1777, 0x3480 }, { 1781, 0x3200 }, { 1784, 0x684c }, { 1790, 0x49ea }, { 1798, 0x68be }, /* 0x5e00 */ { 1807, 0x184c }, { 1812, 0x2e42 }, { 1818, 0xa820 }, { 1822, 0x21c9 }, { 1828, 0x50b9 }, { 1835, 0x80b0 }, { 1839, 0x001e }, { 1843, 0xff7c }, { 1856, 0x849a }, { 1862, 0x14e0 }, { 1867, 0x28c1 }, { 1872, 0x01e0 }, { 1876, 0x870e }, { 1883, 0xac49 }, { 1890, 0x130f }, { 1897, 0xdddb }, /* 0x5f00 */ { 1909, 0xbe1a }, { 1918, 0x89fb }, { 1928, 0xa2e0 }, { 1934, 0x51a2 }, { 1940, 0x5502 }, { 1945, 0x32ca }, { 1952, 0x3e46 }, { 1960, 0x928b }, { 1967, 0x1dbf }, { 1978, 0x438f }, { 1986, 0x6703 }, { 1993, 0x3218 }, { 1998, 0x3028 }, { 2002, 0x33c0 }, { 2008, 0x0811 }, { 2011, 0xa923 }, /* 0x6000 */ { 2018, 0xc000 }, { 2020, 0x3a65 }, { 2028, 0x8fe3 }, { 2038, 0x0402 }, { 2040, 0x2c4e }, { 2047, 0x8625 }, { 2053, 0xbf3d }, { 2065, 0x00a1 }, { 2068, 0x3a1a }, { 2075, 0x8cd4 }, { 2082, 0x06c9 }, { 2088, 0x317c }, { 2096, 0x00e0 }, { 2099, 0x950a }, { 2105, 0x018b }, { 2110, 0x0edb }, /* 0x6100 */ { 2119, 0xe34b }, { 2128, 0x8c20 }, { 2132, 0x1182 }, { 2136, 0xf010 }, { 2141, 0x7d94 }, { 2150, 0xa728 }, { 2157, 0xc9ac }, { 2165, 0x40fb }, { 2173, 0x4484 }, { 2177, 0x0653 }, { 2183, 0x5a90 }, { 2189, 0x4444 }, { 2193, 0x3fc8 }, { 2202, 0x0001 }, { 2203, 0x0048 }, { 2205, 0xf5d4 }, /* 0x6200 */ { 2215, 0x7701 }, { 2222, 0xec57 }, { 2232, 0xc442 }, { 2237, 0x891d }, { 2244, 0x6b83 }, { 2252, 0x4928 }, { 2257, 0x4109 }, { 2261, 0xd242 }, { 2267, 0x061d }, { 2273, 0x59fe }, { 2284, 0x1800 }, { 2286, 0x3a22 }, { 2292, 0xb7e4 }, { 2302, 0x3b9f }, { 2313, 0xf003 }, { 2319, 0xc0ea }, /* 0x6300 */ { 2326, 0x1386 }, { 2332, 0x8202 }, { 2335, 0x8980 }, { 2339, 0xe400 }, { 2343, 0xb200 }, { 2347, 0x10a1 }, { 2351, 0x4b80 }, { 2356, 0x0cc4 }, { 2361, 0xd309 }, { 2368, 0x8944 }, { 2373, 0x1faf }, { 2384, 0x4834 }, { 2389, 0x8259 }, { 2395, 0x0c45 }, { 2400, 0x420a }, { 2404, 0x0450 }, /* 0x6400 */ { 2407, 0xa040 }, { 2410, 0x10c8 }, { 2414, 0x3140 }, { 2418, 0x4450 }, { 2422, 0x4004 }, { 2424, 0x0100 }, { 2425, 0x8280 }, { 2428, 0x0540 }, { 2431, 0x0108 }, { 2433, 0x442c }, { 2438, 0x6a30 }, { 2444, 0x1a05 }, { 2449, 0x20a6 }, { 2454, 0x0514 }, { 2458, 0x90cf }, { 2466, 0x6456 }, /* 0x6500 */ { 2473, 0x0021 }, { 2475, 0x3100 }, { 2478, 0x9c18 }, { 2484, 0xcbf0 }, { 2493, 0xa120 }, { 2497, 0x63e2 }, { 2505, 0x104c }, { 2509, 0x01b5 }, { 2515, 0x538c }, { 2522, 0x9a83 }, { 2529, 0xb8b2 }, { 2537, 0x3281 }, { 2542, 0x987a }, { 2550, 0x0a84 }, { 2554, 0x33e7 }, { 2564, 0x0c02 }, /* 0x6600 */ { 2567, 0xd4cc }, { 2575, 0x9018 }, { 2579, 0xa1a1 }, { 2585, 0x9070 }, { 2590, 0x8a1e }, { 2597, 0xe004 }, { 2601, 0xc3d4 }, { 2609, 0x0451 }, { 2613, 0x439a }, { 2620, 0x21c2 }, { 2625, 0x4844 }, { 2629, 0x5310 }, { 2634, 0x0292 }, { 2638, 0x3640 }, { 2643, 0x0241 }, { 2646, 0xf3bd }, /* 0x6700 */ { 2658, 0xab09 }, { 2665, 0xe8f0 }, { 2673, 0x7dc0 }, { 2681, 0xa5d2 }, { 2689, 0xc242 }, { 2694, 0xd24b }, { 2702, 0xa43f }, { 2711, 0xd0af }, { 2720, 0x1aa0 }, { 2725, 0x34a1 }, { 2731, 0x8247 }, { 2737, 0x03d8 }, { 2743, 0xc452 }, { 2749, 0x651b }, { 2757, 0xd294 }, { 2764, 0xc83a }, /* 0x6800 */ { 2771, 0x001c }, { 2774, 0x40c8 }, { 2778, 0x0e06 }, { 2783, 0x3314 }, { 2789, 0x614f }, { 2797, 0xb21b }, { 2805, 0x0088 }, { 2807, 0xc0d0 }, { 2812, 0xa02a }, { 2817, 0xa898 }, { 2823, 0xa1c5 }, { 2830, 0x166b }, { 2838, 0x2e50 }, { 2844, 0x85b4 }, { 2851, 0xc08b }, { 2857, 0x0604 }, /* 0x6900 */ { 2860, 0xf933 }, { 2870, 0x1e04 }, { 2875, 0x056e }, { 2882, 0xa251 }, { 2888, 0x0400 }, { 2889, 0x7638 }, { 2897, 0xec07 }, { 2905, 0x73b8 }, { 2914, 0x4406 }, { 2918, 0x1832 }, { 2923, 0x4081 }, { 2926, 0xc816 }, { 2932, 0x7c8a }, { 2940, 0x6309 }, { 2946, 0x2980 }, { 2950, 0xaa04 }, /* 0x6a00 */ { 2955, 0x1c24 }, { 2960, 0xca9c }, { 2968, 0x4e0e }, { 2975, 0x2760 }, { 2981, 0x0990 }, { 2985, 0x8300 }, { 2988, 0x0046 }, { 2991, 0x8104 }, { 2994, 0x6011 }, { 2998, 0x1081 }, { 3001, 0x540d }, { 3007, 0x0908 }, { 3010, 0x000e }, { 3013, 0xcc0a }, { 3019, 0x0500 }, { 3021, 0x0c00 }, /* 0x6b00 */ { 3023, 0x0430 }, { 3026, 0xa044 }, { 3030, 0x008b }, { 3034, 0x6784 }, { 3041, 0x5288 }, { 3046, 0x8a19 }, { 3052, 0x865e }, { 3060, 0x8b18 }, { 3066, 0x2e59 }, { 3074, 0x4160 }, { 3078, 0x8c10 }, { 3082, 0x9cbe }, { 3092, 0x6861 }, { 3098, 0x891c }, { 3104, 0x9800 }, { 3107, 0x0008 }, /* 0x6c00 */ { 3108, 0x8100 }, { 3110, 0x089a }, { 3115, 0x0018 }, { 3117, 0x4190 }, { 3121, 0x4007 }, { 3125, 0xe4a1 }, { 3132, 0x0505 }, { 3136, 0x640d }, { 3142, 0x310e }, { 3148, 0x0e4d }, { 3155, 0x4806 }, { 3159, 0xff0a }, { 3169, 0x1632 }, { 3175, 0x2aa8 }, { 3181, 0x852e }, { 3188, 0x000b }, /* 0x6d00 */ { 3191, 0x1800 }, { 3193, 0xca84 }, { 3199, 0x0e20 }, { 3203, 0x696c }, { 3211, 0x0032 }, { 3214, 0x1600 }, { 3217, 0x5658 }, { 3224, 0x0390 }, { 3228, 0x5120 }, { 3232, 0x1a28 }, { 3237, 0x8000 }, { 3238, 0x1124 }, { 3242, 0x18e1 }, { 3248, 0x4326 }, { 3254, 0x5d52 }, { 3262, 0x0eaa }, /* 0x6e00 */ { 3269, 0x0fa0 }, { 3275, 0xae28 }, { 3282, 0xfa7b }, { 3294, 0x4500 }, { 3297, 0x6408 }, { 3301, 0x8940 }, { 3305, 0xc880 }, { 3309, 0xc044 }, { 3313, 0x9005 }, { 3317, 0xb141 }, { 3323, 0x8424 }, { 3327, 0x24c4 }, { 3332, 0x1a34 }, { 3338, 0x603a }, { 3344, 0x9000 }, { 3346, 0xc194 }, /* 0x6f00 */ { 3352, 0x8246 }, { 3357, 0x003a }, { 3361, 0x180d }, { 3366, 0xc106 }, { 3371, 0x0022 }, { 3373, 0x9910 }, { 3378, 0xe050 }, { 3383, 0x1511 }, { 3388, 0x4057 }, { 3394, 0x0082 }, { 3396, 0x041a }, { 3400, 0x020a }, { 3403, 0x004f }, { 3408, 0x8930 }, { 3413, 0xd813 }, { 3420, 0x444a }, /* 0x7000 */ { 3425, 0x8a02 }, { 3429, 0xed22 }, { 3437, 0x10c0 }, { 3440, 0x4005 }, { 3443, 0x1000 }, { 3444, 0x0102 }, { 3446, 0x8808 }, { 3449, 0x3101 }, { 3453, 0x4600 }, { 3456, 0x0204 }, { 3458, 0xf000 }, { 3462, 0x0708 }, { 3466, 0x8900 }, { 3469, 0xa200 }, { 3472, 0x0000 }, { 3472, 0x2202 }, /* 0x7100 */ { 3475, 0x0200 }, { 3476, 0x1610 }, { 3480, 0x0042 }, { 3482, 0x1040 }, { 3484, 0x5200 }, { 3487, 0x0260 }, { 3490, 0x52f4 }, { 3498, 0x2000 }, { 3499, 0x8510 }, { 3503, 0x8230 }, { 3507, 0x1100 }, { 3509, 0x4202 }, { 3512, 0x4308 }, { 3516, 0x80b5 }, { 3522, 0x70e1 }, { 3529, 0x9a20 }, /* 0x7200 */ { 3534, 0x2040 }, { 3536, 0x0801 }, { 3538, 0x3500 }, { 3542, 0xfc65 }, { 3552, 0x19c1 }, { 3558, 0xab04 }, { 3564, 0x0286 }, { 3568, 0x6214 }, { 3573, 0x0087 }, { 3577, 0x0044 }, { 3579, 0x9085 }, { 3584, 0x0244 }, { 3587, 0x405c }, { 3592, 0x0a85 }, { 3597, 0x3207 }, { 3603, 0x3380 }, /* 0x7300 */ { 3608, 0x0400 }, { 3609, 0xb8c0 }, { 3615, 0xce20 }, { 3621, 0xc0d0 }, { 3626, 0xc030 }, { 3630, 0x0080 }, { 3631, 0x0508 }, { 3634, 0x0d25 }, { 3640, 0x0a90 }, { 3644, 0x0040 }, { 3645, 0x0200 }, { 3646, 0x080c }, { 3649, 0x6505 }, { 3655, 0x4000 }, { 3656, 0x6421 }, { 3661, 0x4102 }, /* 0x7400 */ { 3664, 0x0268 }, { 3668, 0x0000 }, { 3668, 0x0024 }, { 3670, 0x847c }, { 3677, 0x0002 }, { 3678, 0xde20 }, { 3685, 0x8619 }, { 3691, 0x4049 }, { 3695, 0x0808 }, { 3697, 0x4000 }, { 3698, 0x0084 }, { 3700, 0x2001 }, { 3702, 0x8400 }, { 3704, 0x1010 }, { 3706, 0x42cd }, { 3713, 0x01c7 }, /* 0x7500 */ { 3719, 0x7038 }, { 3725, 0xd52a }, { 3733, 0x1968 }, { 3739, 0x1d8f }, { 3748, 0xbe50 }, { 3756, 0x3e12 }, { 3763, 0x2ef5 }, { 3773, 0x81d9 }, { 3780, 0xcec4 }, { 3788, 0x2412 }, { 3792, 0x0828 }, { 3795, 0x732e }, { 3804, 0x24ac }, { 3810, 0x4b34 }, { 3817, 0x020c }, { 3820, 0xd41d }, /* 0x7600 */ { 3828, 0x2a02 }, { 3832, 0x8000 }, { 3833, 0x0097 }, { 3838, 0x0811 }, { 3841, 0x11c4 }, { 3846, 0x1144 }, { 3850, 0x1786 }, { 3857, 0x7d45 }, { 3866, 0x49d9 }, { 3874, 0x0649 }, { 3879, 0x4000 }, { 3880, 0x8791 }, { 3887, 0x254c }, { 3893, 0xd8c4 }, { 3900, 0x44ba }, { 3907, 0x4914 }, /* 0x7700 */ { 3912, 0x1b92 }, { 3919, 0xc800 }, { 3922, 0x0271 }, { 3927, 0x1580 }, { 3931, 0x0081 }, { 3933, 0x0c00 }, { 3935, 0x096a }, { 3941, 0xc200 }, { 3944, 0x4800 }, { 3946, 0x4002 }, { 3948, 0x3021 }, { 3952, 0xba49 }, { 3960, 0x2080 }, { 3962, 0x1c80 }, { 3966, 0xe2ac }, { 3974, 0x1008 }, /* 0x7800 */ { 3976, 0x1004 }, { 3978, 0x0034 }, { 3981, 0x00e1 }, { 3985, 0x8414 }, { 3989, 0x0020 }, { 3990, 0x2000 }, { 3991, 0x9800 }, { 3994, 0x1014 }, { 3997, 0x70c2 }, { 4003, 0x04aa }, { 4008, 0x8688 }, { 4013, 0x5420 }, { 4017, 0x0c62 }, { 4022, 0x0413 }, { 4026, 0x9180 }, { 4030, 0x2010 }, /* 0x7900 */ { 4032, 0x4082 }, { 4035, 0x0206 }, { 4038, 0x1c40 }, { 4042, 0x5400 }, { 4045, 0x0383 }, { 4050, 0xe4e9 }, { 4059, 0x2125 }, { 4064, 0x8480 }, { 4067, 0xe433 }, { 4075, 0x2000 }, { 4076, 0x44c0 }, { 4080, 0xe609 }, { 4087, 0x0a03 }, { 4091, 0x8126 }, { 4096, 0x12da }, { 4103, 0x0801 }, /* 0x7a00 */ { 4105, 0x6901 }, { 4110, 0x9790 }, { 4117, 0x4001 }, { 4119, 0xf886 }, { 4127, 0xe24d }, { 4135, 0x0081 }, { 4137, 0x0a0e }, { 4142, 0xa651 }, { 4149, 0x011a }, { 4153, 0x81ec }, { 4160, 0xc600 }, { 4164, 0x8441 }, { 4168, 0xadb8 }, { 4177, 0xb62c }, { 4185, 0xa46f }, { 4194, 0x8741 }, /* 0x7b00 */ { 4200, 0x8d54 }, { 4207, 0x4b02 }, { 4212, 0x1161 }, { 4217, 0x0268 }, { 4221, 0xbb60 }, { 4229, 0x2057 }, { 4235, 0x50a0 }, { 4239, 0x0433 }, { 4244, 0xa8c0 }, { 4249, 0xb7b4 }, { 4259, 0x2402 }, { 4262, 0x0112 }, { 4265, 0x9ad3 }, { 4274, 0x2000 }, { 4275, 0x2271 }, { 4281, 0x00c8 }, /* 0x7c00 */ { 4284, 0x2081 }, { 4287, 0x809e }, { 4293, 0x0c8a }, { 4298, 0xe180 }, { 4303, 0xb009 }, { 4308, 0x8151 }, { 4313, 0x1031 }, { 4317, 0x4028 }, { 4320, 0x2a0e }, { 4326, 0x89a5 }, { 4333, 0x69b6 }, { 4342, 0x620e }, { 4348, 0x4425 }, { 4353, 0xd144 }, { 4359, 0x8085 }, { 4363, 0x4d54 }, /* 0x7d00 */ { 4370, 0x2c75 }, { 4378, 0x1fb1 }, { 4387, 0xd807 }, { 4394, 0x862d }, { 4401, 0xd87c }, { 4410, 0x4841 }, { 4414, 0x414e }, { 4420, 0x226e }, { 4427, 0x8200 }, { 4429, 0x9e08 }, { 4435, 0xf80c }, { 4442, 0xed37 }, { 4453, 0x8c80 }, { 4457, 0x7526 }, { 4465, 0x9313 }, { 4472, 0x0814 }, /* 0x7e00 */ { 4475, 0x0e32 }, { 4481, 0xc804 }, { 4485, 0x484e }, { 4491, 0x6ea6 }, { 4500, 0x2c4a }, { 4506, 0x6670 }, { 4513, 0x26c0 }, { 4518, 0xba01 }, { 4524, 0xd30c }, { 4531, 0x185d }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, /* 0x7f00 */ { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0540 }, { 4541, 0x7020 }, { 4545, 0x8133 }, { 4551, 0x4f81 }, { 4558, 0x03a5 }, { 4564, 0x55ec }, { 4573, 0x6410 }, { 4577, 0xc318 }, { 4583, 0x2344 }, { 4588, 0x1462 }, { 4593, 0x0034 }, { 4596, 0x0a43 }, { 4601, 0x1a09 }, /* 0x8000 */ { 4606, 0x187b }, { 4614, 0x13a5 }, { 4621, 0x0102 }, { 4623, 0xa848 }, { 4628, 0x0440 }, { 4630, 0xc544 }, { 4636, 0x8106 }, { 4640, 0xe2dd }, { 4650, 0x1af0 }, { 4657, 0x2d48 }, { 4663, 0xb626 }, { 4671, 0x0416 }, { 4675, 0x5058 }, { 4680, 0x6e40 }, { 4686, 0x8032 }, { 4690, 0x3112 }, /* 0x8100 */ { 4695, 0x07e4 }, { 4702, 0x0c00 }, { 4704, 0x8208 }, { 4707, 0x420a }, { 4711, 0x4840 }, { 4714, 0x803b }, { 4720, 0x4860 }, { 4724, 0x8713 }, { 4731, 0x850d }, { 4737, 0x3428 }, { 4742, 0x0319 }, { 4747, 0xe529 }, { 4755, 0x2345 }, { 4761, 0x870a }, { 4767, 0x25a9 }, { 4774, 0x5c18 }, /* 0x8200 */ { 4780, 0x77a6 }, { 4790, 0xd9c5 }, { 4799, 0x5e00 }, { 4804, 0x03e8 }, { 4810, 0x0081 }, { 4812, 0xa700 }, { 4817, 0xcd54 }, { 4825, 0x41c6 }, { 4831, 0x2800 }, { 4833, 0xa204 }, { 4837, 0xb860 }, { 4843, 0x2b0a }, { 4849, 0x0020 }, { 4850, 0xda9e }, { 4860, 0x08ea }, { 4866, 0x0e1a }, /* 0x8300 */ { 4872, 0x427c }, { 4879, 0x11c0 }, { 4883, 0x8908 }, { 4887, 0x0376 }, { 4894, 0x8621 }, { 4899, 0x0105 }, { 4902, 0x0000 }, { 4902, 0x18a8 }, { 4907, 0x46a0 }, { 4912, 0xc448 }, { 4917, 0x0d05 }, { 4922, 0x2022 }, { 4925, 0x5422 }, { 4930, 0x9148 }, { 4935, 0x8a01 }, { 4939, 0x2897 }, /* 0x8400 */ { 4946, 0x7898 }, { 4953, 0x0008 }, { 4954, 0x1605 }, { 4959, 0x3122 }, { 4964, 0x4240 }, { 4967, 0x0880 }, { 4969, 0xfa4e }, { 4979, 0x06a2 }, { 4984, 0x0814 }, { 4987, 0x9211 }, { 4992, 0x2002 }, { 4994, 0x9b04 }, { 5000, 0x2e52 }, { 5007, 0x0643 }, { 5012, 0x5000 }, { 5014, 0x9010 }, /* 0x8500 */ { 5017, 0x0041 }, { 5019, 0x85ba }, { 5027, 0x3042 }, { 5031, 0x2020 }, { 5033, 0x4f0b }, { 5041, 0x05a0 }, { 5045, 0x2708 }, { 5050, 0x4080 }, { 5052, 0x0591 }, { 5057, 0x1a93 }, { 5064, 0xdf50 }, { 5073, 0x0600 }, { 5075, 0xa202 }, { 5079, 0x3021 }, { 5083, 0x0630 }, { 5087, 0x4e80 }, /* 0x8600 */ { 5092, 0x0cc4 }, { 5097, 0x04c8 }, { 5101, 0xa004 }, { 5104, 0x8001 }, { 5106, 0x6000 }, { 5108, 0xd431 }, { 5115, 0x0880 }, { 5117, 0x0a02 }, { 5120, 0x1c00 }, { 5123, 0x0028 }, { 5125, 0x8e18 }, { 5131, 0x0041 }, { 5133, 0x6ad0 }, { 5140, 0xca10 }, { 5145, 0xf210 }, { 5151, 0x4b00 }, /* 0x8700 */ { 5155, 0x274d }, { 5163, 0x1506 }, { 5168, 0x0220 }, { 5170, 0x8890 }, { 5174, 0x5a00 }, { 5178, 0x82a8 }, { 5183, 0x4549 }, { 5189, 0x8150 }, { 5193, 0x2004 }, { 5195, 0x8000 }, { 5196, 0x8804 }, { 5199, 0x2c08 }, { 5203, 0x08d1 }, { 5208, 0x0005 }, { 5210, 0x8001 }, { 5212, 0x4ac4 }, /* 0x8800 */ { 5218, 0xe020 }, { 5222, 0x0062 }, { 5225, 0x008e }, { 5229, 0x0a42 }, { 5233, 0x3055 }, { 5239, 0x6a8c }, { 5246, 0x090e }, { 5251, 0xe0a5 }, { 5258, 0x2906 }, { 5263, 0x42c4 }, { 5268, 0x4814 }, { 5272, 0x80b3 }, { 5278, 0x803e }, { 5284, 0xb330 }, { 5291, 0x0102 }, { 5293, 0x731c }, /* 0x8900 */ { 5301, 0x1494 }, { 5306, 0x600d }, { 5311, 0x0c20 }, { 5314, 0x0940 }, { 5317, 0x301a }, { 5322, 0xc040 }, { 5325, 0xa451 }, { 5331, 0xc094 }, { 5336, 0x8dca }, { 5344, 0x05c8 }, { 5349, 0x96c2 }, { 5356, 0xa40c }, { 5361, 0x0001 }, { 5362, 0x3404 }, { 5366, 0x00c8 }, { 5369, 0x0110 }, /* 0x8a00 */ { 5371, 0x550d }, { 5378, 0xa9c9 }, { 5386, 0x2428 }, { 5390, 0x1c5a }, { 5397, 0x0142 }, { 5400, 0x4837 }, { 5407, 0x7a4d }, { 5416, 0x100f }, { 5421, 0x32b4 }, { 5428, 0x452a }, { 5434, 0x317b }, { 5443, 0x9205 }, { 5448, 0xb894 }, { 5455, 0x5c44 }, { 5461, 0x68d7 }, { 5470, 0x458a }, /* 0x8b00 */ { 5476, 0x5097 }, { 5483, 0x2ed1 }, { 5491, 0x1943 }, { 5497, 0x4208 }, { 5500, 0xd202 }, { 5505, 0x9d40 }, { 5511, 0x9840 }, { 5515, 0x2097 }, { 5521, 0x5409 }, { 5526, 0x064d }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, /* 0x8c00 */ { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x8480 }, { 5535, 0x5542 }, { 5541, 0x0421 }, { 5544, 0x1c06 }, { 5549, 0x1700 }, { 5553, 0x7624 }, { 5560, 0x6110 }, { 5564, 0xff87 }, { 5576, 0xb9dd }, { 5587, 0x659f }, { 5597, 0x5c0a }, { 5603, 0x245d }, { 5610, 0x3c00 }, /* 0x8d00 */ { 5614, 0xadb0 }, { 5622, 0x0059 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x28d0 }, { 5631, 0x009b }, { 5636, 0x0422 }, { 5639, 0x0200 }, { 5640, 0x0108 }, { 5642, 0x4408 }, { 5645, 0x9804 }, { 5649, 0xac40 }, { 5654, 0x8d0a }, { 5660, 0x9028 }, /* 0x8e00 */ { 5664, 0x8700 }, { 5668, 0xe001 }, { 5672, 0x0400 }, { 5673, 0x0031 }, { 5676, 0x1794 }, { 5683, 0x8221 }, { 5687, 0x0019 }, { 5690, 0x1054 }, { 5694, 0x2cb2 }, { 5701, 0x021a }, { 5705, 0x9c02 }, { 5710, 0x4003 }, { 5713, 0x3d60 }, { 5720, 0x8804 }, { 5723, 0x080c }, { 5726, 0x7900 }, /* 0x8f00 */ { 5731, 0x1628 }, { 5736, 0xba3c }, { 5745, 0x8640 }, { 5749, 0xcb08 }, { 5755, 0x7274 }, { 5763, 0x9080 }, { 5766, 0x001e }, { 5770, 0x0000 }, { 5770, 0x0000 }, { 5770, 0xd800 }, { 5774, 0xe188 }, { 5780, 0x9c87 }, { 5788, 0x4034 }, { 5792, 0x0412 }, { 5795, 0xae64 }, { 5803, 0x2791 }, /* 0x9000 */ { 5810, 0xe86b }, { 5819, 0xe6fb }, { 5831, 0x408f }, { 5837, 0x5366 }, { 5845, 0xeea6 }, { 5855, 0x537f }, { 5866, 0xe32b }, { 5875, 0xb5e4 }, { 5884, 0x869f }, { 5893, 0x0002 }, { 5894, 0x8548 }, { 5899, 0x0122 }, { 5902, 0x4402 }, { 5905, 0x0800 }, { 5906, 0x2116 }, { 5911, 0x20a0 }, /* 0x9100 */ { 5914, 0x0004 }, { 5915, 0x0204 }, { 5917, 0x2000 }, { 5918, 0x0005 }, { 5920, 0x7e00 }, { 5926, 0x0154 }, { 5930, 0x162c }, { 5936, 0x01ac }, { 5941, 0x2a84 }, { 5946, 0x1085 }, { 5950, 0x8c14 }, { 5955, 0x0530 }, { 5959, 0xfbc3 }, { 5970, 0xb943 }, { 5978, 0x00ca }, { 5982, 0x9060 }, /* 0x9200 */ { 5986, 0x6000 }, { 5988, 0x4032 }, { 5992, 0x1200 }, { 5994, 0x8090 }, { 5997, 0x0b30 }, { 6002, 0x4c81 }, { 6007, 0x0054 }, { 6010, 0x4002 }, { 6012, 0x0029 }, { 6015, 0x1d6a }, { 6023, 0x2000 }, { 6024, 0x0280 }, { 6026, 0x8000 }, { 6027, 0x0004 }, { 6028, 0x2610 }, { 6032, 0x150c }, /* 0x9300 */ { 6037, 0x8040 }, { 6039, 0x0701 }, { 6043, 0xd94d }, { 6052, 0x0c24 }, { 6056, 0x2810 }, { 6059, 0x1850 }, { 6063, 0x5001 }, { 6066, 0x5020 }, { 6069, 0x1000 }, { 6070, 0x04d0 }, { 6074, 0x7080 }, { 6078, 0x0201 }, { 6080, 0x0108 }, { 6082, 0x21c3 }, { 6088, 0x0132 }, { 6092, 0x0000 }, /* 0x9400 */ { 6092, 0x0088 }, { 6094, 0x0719 }, { 6100, 0x0802 }, { 6102, 0x0560 }, { 6106, 0x0012 }, { 6108, 0x4c0e }, { 6114, 0x0405 }, { 6117, 0xf0a1 }, { 6124, 0x0002 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, /* 0x9500 */ { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0080 }, { 6126, 0x8e8d }, { 6134, 0x035a }, { 6140, 0x21bd }, { 6148, 0x5a04 }, { 6153, 0x3488 }, { 6158, 0x1170 }, { 6163, 0x0026 }, { 6166, 0x0000 }, /* 0x9600 */ { 6166, 0x0000 }, { 6166, 0x1000 }, { 6167, 0xc502 }, { 6172, 0x8804 }, { 6175, 0xb815 }, { 6182, 0xf801 }, { 6188, 0x147c }, { 6195, 0x25ed }, { 6204, 0xed60 }, { 6212, 0x1bb0 }, { 6219, 0x0589 }, { 6224, 0x1bd7 }, { 6234, 0x7af3 }, { 6245, 0x1a62 }, { 6251, 0x0d0c }, { 6256, 0x0ac5 }, /* 0x9700 */ { 6262, 0xe5d1 }, { 6271, 0x524a }, { 6277, 0x0490 }, { 6280, 0x6305 }, { 6286, 0x0354 }, { 6291, 0x5244 }, { 6296, 0x2b57 }, { 6305, 0x1612 }, { 6310, 0xa872 }, { 6317, 0x1101 }, { 6320, 0x2949 }, { 6326, 0x0018 }, { 6328, 0x0948 }, { 6332, 0x1008 }, { 6334, 0x6000 }, { 6336, 0x886c }, /* 0x9800 */ { 6342, 0x916e }, { 6350, 0x058f }, { 6357, 0x3012 }, { 6361, 0x3990 }, { 6367, 0xf840 }, { 6373, 0x4930 }, { 6378, 0x8880 }, { 6381, 0x001b }, { 6385, 0x0000 }, { 6385, 0x0000 }, { 6385, 0x8500 }, { 6388, 0x0042 }, { 6390, 0x0058 }, { 6393, 0x9800 }, { 6396, 0xea04 }, { 6402, 0x7014 }, /* 0x9900 */ { 6407, 0x1628 }, { 6412, 0x611d }, { 6419, 0x5113 }, { 6425, 0x6000 }, { 6427, 0x1a24 }, { 6432, 0x00a7 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x03c0 }, { 6441, 0x7120 }, { 6446, 0x1018 }, { 6449, 0x0172 }, { 6454, 0xa927 }, { 6462, 0x6004 }, { 6465, 0x8906 }, /* 0x9a00 */ { 6470, 0xc022 }, { 6474, 0x020c }, { 6477, 0x0900 }, { 6479, 0x4081 }, { 6482, 0x202d }, { 6487, 0x8ca0 }, { 6492, 0x0e34 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x2100 }, { 6500, 0x1101 }, { 6503, 0x8011 }, { 6506, 0xc11a }, { 6512, 0xec4c }, { 6520, 0x0892 }, /* 0x9b00 */ { 6524, 0x0040 }, { 6525, 0x8500 }, { 6528, 0xc7ac }, { 6537, 0x1806 }, { 6541, 0xe03e }, { 6549, 0x0512 }, { 6553, 0x8000 }, { 6554, 0x0010 }, { 6555, 0x4008 }, { 6557, 0x80ce }, { 6563, 0x6d01 }, { 6569, 0x0210 }, { 6571, 0x8641 }, { 6576, 0x0856 }, { 6581, 0x011e }, { 6586, 0x0027 }, /* 0x9c00 */ { 6590, 0x3750 }, { 6597, 0x083d }, { 6603, 0xe032 }, { 6609, 0x4e05 }, { 6615, 0x01c0 }, { 6618, 0x0484 }, { 6621, 0x0081 }, { 6623, 0x0140 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x1aa0 }, { 6630, 0x0059 }, /* 0x9d00 */ { 6634, 0x43c8 }, { 6640, 0x8824 }, { 6644, 0x1d48 }, { 6650, 0xc800 }, { 6653, 0x0152 }, { 6657, 0x7203 }, { 6663, 0x9013 }, { 6668, 0x0404 }, { 6670, 0x8280 }, { 6673, 0x0400 }, { 6674, 0x8a10 }, { 6678, 0x0d14 }, { 6683, 0x8056 }, { 6688, 0x0208 }, { 6690, 0xa040 }, { 6693, 0x2704 }, /* 0x9e00 */ { 6698, 0x0000 }, { 6698, 0x4c00 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0xa320 }, { 6706, 0x1902 }, { 6710, 0xa0ae }, { 6717, 0x2660 }, { 6722, 0xdf00 }, { 6729, 0xf010 }, { 6734, 0x7b15 }, { 6743, 0x8121 }, { 6747, 0x3ad0 }, /* 0x9f00 */ { 6754, 0x4180 }, { 6757, 0x0028 }, { 6759, 0x1003 }, { 6762, 0x4800 }, { 6764, 0xcc00 }, { 6768, 0x8014 }, { 6771, 0x14cf }, { 6779, 0x00c4 }, { 6782, 0x2000 }, { 6783, 0x3020 }, { 6786, 0x0001 }, }; static const Summary16 jisx0208_uni2indx_pageff[15] = { /* 0xff00 */ { 6787, 0xdf7a }, { 6799, 0xffff }, { 6815, 0xffff }, { 6831, 0xffff }, { 6847, 0xffff }, { 6863, 0x3fff }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0028 }, }; static int jisx0208_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0100) summary = &jisx0208_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0300 && wc < 0x0460) summary = &jisx0208_uni2indx_page03[(wc>>4)-0x030]; else if (wc >= 0x2000 && wc < 0x2320) summary = &jisx0208_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2670) summary = &jisx0208_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &jisx0208_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &jisx0208_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &jisx0208_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = jisx0208_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.1.06/src/libtiniconv/encdec/cp1253.h0000644000175000017500000001064213472116001015375 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1253 */ static const unsigned short cp1253_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int cp1253_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1253_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1253_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1253_page03[80] = { 0x00, 0x00, 0x00, 0x00, 0xb4, 0xa1, 0xa2, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char cp1253_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1253_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1253_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x0380 && wc < 0x03d0) c = cp1253_page03[wc-0x0380]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1253_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/cp1255.h0000644000175000017500000003175313472116001015405 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1255 */ #include "flushwc.h" /* Combining characters used in Hebrew encoding CP1255. */ /* Relevant combining characters: 0x05b4, 0x05b7, 0x05b8, 0x05b9, 0x05bc, 0x05bf, 0x05c1, 0x05c2. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } cp1255_comp_table_data[] = { #define cp1255_comp_table05b4_idx 0 #define cp1255_comp_table05b4_len 1 { 0x05D9, 0xFB1D }, #define cp1255_comp_table05b7_idx (cp1255_comp_table05b4_idx+cp1255_comp_table05b4_len) #define cp1255_comp_table05b7_len 2 { 0x05D0, 0xFB2E }, { 0x05F2, 0xFB1F }, #define cp1255_comp_table05b8_idx (cp1255_comp_table05b7_idx+cp1255_comp_table05b7_len) #define cp1255_comp_table05b8_len 1 { 0x05D0, 0xFB2F }, #define cp1255_comp_table05b9_idx (cp1255_comp_table05b8_idx+cp1255_comp_table05b8_len) #define cp1255_comp_table05b9_len 1 { 0x05D5, 0xFB4B }, #define cp1255_comp_table05bc_idx (cp1255_comp_table05b9_idx+cp1255_comp_table05b9_len) #define cp1255_comp_table05bc_len 24 { 0x05D0, 0xFB30 }, { 0x05D1, 0xFB31 }, { 0x05D2, 0xFB32 }, { 0x05D3, 0xFB33 }, { 0x05D4, 0xFB34 }, { 0x05D5, 0xFB35 }, { 0x05D6, 0xFB36 }, { 0x05D8, 0xFB38 }, { 0x05D9, 0xFB39 }, { 0x05DA, 0xFB3A }, { 0x05DB, 0xFB3B }, { 0x05DC, 0xFB3C }, { 0x05DE, 0xFB3E }, { 0x05E0, 0xFB40 }, { 0x05E1, 0xFB41 }, { 0x05E3, 0xFB43 }, { 0x05E4, 0xFB44 }, { 0x05E6, 0xFB46 }, { 0x05E7, 0xFB47 }, { 0x05E8, 0xFB48 }, { 0x05E9, 0xFB49 }, { 0x05EA, 0xFB4A }, { 0xFB2A, 0xFB2C }, { 0xFB2B, 0xFB2D }, #define cp1255_comp_table05bf_idx (cp1255_comp_table05bc_idx+cp1255_comp_table05bc_len) #define cp1255_comp_table05bf_len 3 { 0x05D1, 0xFB4C }, { 0x05DB, 0xFB4D }, { 0x05E4, 0xFB4E }, #define cp1255_comp_table05c1_idx (cp1255_comp_table05bf_idx+cp1255_comp_table05bf_len) #define cp1255_comp_table05c1_len 2 { 0x05E9, 0xFB2A }, { 0xFB49, 0xFB2C }, #define cp1255_comp_table05c2_idx (cp1255_comp_table05c1_idx+cp1255_comp_table05c1_len) #define cp1255_comp_table05c2_len 2 { 0x05E9, 0xFB2B }, { 0xFB49, 0xFB2D }, }; static const struct { unsigned int len; unsigned int idx; } cp1255_comp_table[] = { { cp1255_comp_table05b4_len, cp1255_comp_table05b4_idx }, { cp1255_comp_table05b7_len, cp1255_comp_table05b7_idx }, { cp1255_comp_table05b8_len, cp1255_comp_table05b8_idx }, { cp1255_comp_table05b9_len, cp1255_comp_table05b9_idx }, { cp1255_comp_table05bc_len, cp1255_comp_table05bc_idx }, { cp1255_comp_table05bf_len, cp1255_comp_table05bf_idx }, { cp1255_comp_table05c1_len, cp1255_comp_table05c1_idx }, { cp1255_comp_table05c2_len, cp1255_comp_table05c2_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct cp1255_decomp { unsigned short composed; unsigned short base; int comb1 : 8; signed int comb2 : 8; }; static const struct cp1255_decomp cp1255_decomp_table[] = { { 0xFB1D, 0x05D9, 0, -1 }, { 0xFB1F, 0x05F2, 1, -1 }, { 0xFB2A, 0x05E9, 6, -1 }, { 0xFB2B, 0x05E9, 7, -1 }, { 0xFB2C, 0x05E9, 4, 6 }, { 0xFB2D, 0x05E9, 4, 7 }, { 0xFB2E, 0x05D0, 1, -1 }, { 0xFB2F, 0x05D0, 2, -1 }, { 0xFB30, 0x05D0, 4, -1 }, { 0xFB31, 0x05D1, 4, -1 }, { 0xFB32, 0x05D2, 4, -1 }, { 0xFB33, 0x05D3, 4, -1 }, { 0xFB34, 0x05D4, 4, -1 }, { 0xFB35, 0x05D5, 4, -1 }, { 0xFB36, 0x05D6, 4, -1 }, { 0xFB38, 0x05D8, 4, -1 }, { 0xFB39, 0x05D9, 4, -1 }, { 0xFB3A, 0x05DA, 4, -1 }, { 0xFB3B, 0x05DB, 4, -1 }, { 0xFB3C, 0x05DC, 4, -1 }, { 0xFB3E, 0x05DE, 4, -1 }, { 0xFB40, 0x05E0, 4, -1 }, { 0xFB41, 0x05E1, 4, -1 }, { 0xFB43, 0x05E3, 4, -1 }, { 0xFB44, 0x05E4, 4, -1 }, { 0xFB46, 0x05E6, 4, -1 }, { 0xFB47, 0x05E7, 4, -1 }, { 0xFB48, 0x05E8, 4, -1 }, { 0xFB49, 0x05E9, 4, -1 }, { 0xFB4A, 0x05EA, 4, -1 }, { 0xFB4B, 0x05D5, 3, -1 }, { 0xFB4C, 0x05D1, 5, -1 }, { 0xFB4D, 0x05DB, 5, -1 }, { 0xFB4E, 0x05E4, 5, -1 }, }; static const unsigned char cp1255_comb_table[] = { 0xc4, 0xc7, 0xc8, 0xc9, 0xcc, 0xcf, 0xd1, 0xd2, }; static const unsigned short cp1255_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, /* 0xd0 */ 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; /* In the CP1255 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1255_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1255_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x05b0 && wc < 0x05c5) { /* See whether last_wc and wc can be combined. */ unsigned int k; unsigned int i1, i2; switch (wc) { case 0x05b4: k = 0; break; case 0x05b7: k = 1; break; case 0x05b8: k = 2; break; case 0x05b9: k = 3; break; case 0x05bc: k = 4; break; case 0x05bf: k = 5; break; case 0x05c1: k = 6; break; case 0x05c2: k = 7; break; default: goto not_combining; } i1 = cp1255_comp_table[k].idx; i2 = i1 + cp1255_comp_table[k].len-1; if (last_wc >= cp1255_comp_table_data[i1].base && last_wc <= cp1255_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == cp1255_comp_table_data[i].base) break; if (last_wc < cp1255_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == cp1255_comp_table_data[i].base) break; goto not_combining; } } } last_wc = cp1255_comp_table_data[i].composed; if (last_wc == 0xfb2a || last_wc == 0xfb2b || last_wc == 0xfb49) { /* Buffer the combined character. */ conv->istate = last_wc; return RET_TOOFEW(1); } else { /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if ((wc >= 0x05d0 && wc <= 0x05ea && ((0x07db5f7f >> (wc - 0x05d0)) & 1)) || wc == 0x05f2) { /* wc is a possible match in cp1255_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1255_flushwc normal_flushwc static const unsigned char cp1255_page00[88] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1255_page05[72] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xb0-0xb7 */ 0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xb8-0xbf */ 0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1255_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = cp1255_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1255_page02[wc-0x02c0]; else if (wc >= 0x05b0 && wc < 0x05f8) c = cp1255_page05[wc-0x05b0]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1255_page20[wc-0x2008]; else if (wc == 0x20aa) c = 0xa4; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through cp1255_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(cp1255_decomp_table)/sizeof(cp1255_decomp_table[0])-1; if (wc >= cp1255_decomp_table[i1].composed && wc <= cp1255_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == cp1255_decomp_table[i].composed) break; if (wc < cp1255_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == cp1255_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = cp1255_decomp_table[i].base; /* wc is one of 0x05d0..0x05d6, 0x05d8..0x05dc, 0x05de, 0x05e0..0x05e1, 0x05e3..0x05e4, 0x05e6..0x05ea, 0x05f2. */ c = cp1255_page05[wc-0x05b0]; if (cp1255_decomp_table[i].comb2 < 0) { if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; return 2; } else { if (n < 3) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; r[2] = cp1255_comb_table[cp1255_decomp_table[i].comb2]; return 3; } } } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/cp1256.h0000644000175000017500000001516713472116001015407 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1256 */ static const unsigned short cp1256_2uni[128] = { /* 0x80 */ 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, /* 0x90 */ 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, /* 0xa0 */ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, /* 0xc0 */ 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, /* 0xe0 */ 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, /* 0xf0 */ 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2, }; static int cp1256_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp1256_2uni[c-0x80]; return 1; } static const unsigned char cp1256_page00[96] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0xe0, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x00, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0x00, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp1256_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1256_page06[208] = { 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd8, /* 0x30-0x37 */ 0xd9, 0xda, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xdc, 0xdd, 0xde, 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, /* 0x40-0x47 */ 0xe6, 0xec, 0xed, 0xf0, 0xf1, 0xf2, 0xf3, 0xf5, /* 0x48-0x4f */ 0xf6, 0xf8, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, /* 0x80-0x87 */ 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xb8-0xbf */ 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ }; static const unsigned char cp1256_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1256_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp1256_page00[wc-0x00a0]; else if (wc >= 0x0150 && wc < 0x0198) c = cp1256_page01[wc-0x0150]; else if (wc == 0x02c6) c = 0x88; else if (wc >= 0x0608 && wc < 0x06d8) c = cp1256_page06[wc-0x0608]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1256_page20[wc-0x2008]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_13.h0000644000175000017500000001064413472116001016115 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-13 */ static const unsigned short iso8859_13_2uni[96] = { /* 0xa0 */ 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, }; static int iso8859_13_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_13_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_13_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_13_page20[8] = { 0x00, 0xff, 0x00, 0x00, 0xb4, 0xa1, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_13_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_13_page00[wc-0x00a0]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_13_page20[wc-0x2018]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_15.h0000644000175000017500000000532313472116001016115 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-15 */ static const unsigned short iso8859_15_2uni[32] = { /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, }; static int iso8859_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0 && c < 0xc0) *pwc = (ucs4_t) iso8859_15_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_15_page00[32] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0xba, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0xb8-0xbf */ }; static const unsigned char iso8859_15_page01[48] = { 0x00, 0x00, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static int iso8859_15_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_15_page00[wc-0x00a0]; else if (wc >= 0x00c0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0180) c = iso8859_15_page01[wc-0x0150]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/koi8_u.h0000644000175000017500000001625713472116001015666 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-U */ /* Specification: RFC 2319 */ static const unsigned short koi8_u_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_u_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_u_2uni[c-0x80]; return 1; } static const unsigned char koi8_u_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_u_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_u_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_u_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_u_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_u_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_u_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_u_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_u_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_u_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_u_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/ucs2.h0000644000175000017500000000431713472116001015336 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2 */ /* Here we accept FFFE/FEFF marks as endianness indicators everywhere in the stream, not just at the beginning. The default is big-endian. */ /* The state is 0 if big-endian, 1 if little-endian. */ static int ucs2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; for (; n >= 2;) { ucs4_t wc = (state ? s[0] + (s[1] << 8) : (s[0] << 8) + s[1]); s += 2; n -= 2; count += 2; if (wc == 0xfeff) { } else if (wc == 0xfffe) { state ^= 1; } else if (wc >= 0xd800 && wc < 0xe000) { return RET_ILSEQ; } else { *pwc = wc; conv->istate = state; return count; } } conv->istate = state; return RET_TOOFEW(count); } /* But we output UCS-2 in big-endian order, without byte-order mark. */ /* RFC 2152 says: "ISO/IEC 10646-1:1993(E) specifies that when characters the UCS-2 form are serialized as octets, that the most significant octet appear first." */ static int ucs2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x10000 && wc != 0xfffe && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { r[0] = (unsigned char) (wc >> 8); r[1] = (unsigned char) wc; return 2; } else return RET_TOOSMALL; } else return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/gbkext_inv.h0000644000175000017500000044567113472116001016636 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK extensions */ static const unsigned short gbkext_inv_2charset[14313] = { 0xa840, 0xa841, 0xa842, 0xa95c, 0xa843, 0xa844, 0xa845, 0xa846, 0xa847, 0xa848, 0xa959, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d, 0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa892, 0xa853, 0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, 0xa874, 0xa875, 0xa876, 0xa877, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa87e, 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d, 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa965, 0xa996, 0xa893, 0xa894, 0xa895, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, 0xa947, 0xa948, 0xa961, 0xa962, 0xa966, 0xa967, 0xa960, 0xa963, 0xa964, 0xa95a, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xa950, 0xa951, 0xa952, 0xa953, 0xa954, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8188, 0x8189, 0x818a, 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, 0x8199, 0x819a, 0x819b, 0x819c, 0x819d, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, 0x81c8, 0x81c9, 0x81ca, 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b, 0x827c, 0x827d, 0x827e, 0x8280, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, 0x829d, 0x829e, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0x837e, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398, 0x8399, 0x839a, 0x839b, 0x839c, 0x839d, 0x839e, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4, 0x83b5, 0x83b6, 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd, 0x83be, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5, 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd, 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5, 0x83d6, 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd, 0x83de, 0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3, 0x83e4, 0x83e5, 0x83e6, 0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, 0x84b0, 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8, 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, 0x84e0, 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548, 0x8549, 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x8587, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859b, 0x859c, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa, 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85c9, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1, 0x85d2, 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9, 0x85fa, 0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a, 0x865b, 0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a, 0x867b, 0x867c, 0x867d, 0x867e, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868a, 0x868b, 0x868c, 0x868d, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869c, 0x869d, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4, 0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4, 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec, 0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4, 0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775, 0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d, 0x877e, 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, 0x87af, 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0x87c7, 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, 0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, 0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x8880, 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888, 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890, 0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0, 0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941, 0x8942, 0x8943, 0x8944, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982, 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2, 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b66, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee, 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c80, 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, 0x8c88, 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8d40, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, 0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50, 0x8d51, 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59, 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, 0x8d60, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d80, 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92, 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2, 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, 0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7c, 0x8e7d, 0x8e7e, 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e8f, 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac, 0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, 0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75, 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, 0x8f87, 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, 0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, 0x8f9f, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, 0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf, 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce, 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, 0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, 0x8fe7, 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, 0x8fef, 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ff7, 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe, 0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, 0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x9080, 0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088, 0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, 0x9098, 0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0, 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0, 0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, 0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0, 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, 0x90e0, 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8, 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, 0x914a, 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, 0x917a, 0x917b, 0x917c, 0x917d, 0x917e, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918a, 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa, 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x938f, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d6, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f, 0x94a0, 0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6, 0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae, 0x94af, 0x94b0, 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, 0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8, 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x9540, 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551, 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, 0x9560, 0x9561, 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, 0x9570, 0x9571, 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648, 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965b, 0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b, 0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968a, 0x968b, 0x968c, 0x968d, 0x968e, 0x968f, 0x9690, 0x9691, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, 0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4, 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4, 0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d, 0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e, 0x979f, 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af, 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, 0x9898, 0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8, 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a7e, 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84, 0x9a85, 0x9a86, 0x9a87, 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, 0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9e, 0x9a9f, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9adf, 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9afe, 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45, 0x9b46, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d, 0x9b7e, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c80, 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90, 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, 0x9ce0, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9d40, 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41, 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72, 0x9e73, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0x9e9f, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4, 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd, 0x9efe, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, 0x9faf, 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, 0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, 0x9fbf, 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce, 0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7, 0x9fd8, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde, 0x9fdf, 0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6, 0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee, 0x9fef, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7, 0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0xa040, 0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, 0xa048, 0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f, 0xa060, 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, 0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa080, 0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, 0xa088, 0xa089, 0xa08a, 0xa08b, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090, 0xa091, 0xa092, 0xa093, 0xa094, 0xa095, 0xa096, 0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xa09e, 0xa09f, 0xa0a0, 0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8, 0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0, 0xa0b1, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, 0xa0b9, 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, 0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0df, 0xa0e0, 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0, 0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41, 0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0xaa4e, 0xaa4f, 0xaa50, 0xaa51, 0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, 0xaa58, 0xaa59, 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, 0xaa60, 0xaa61, 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68, 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70, 0xaa71, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7e, 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xab40, 0xab41, 0xab42, 0xab43, 0xab44, 0xab45, 0xab46, 0xab47, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xab51, 0xab52, 0xab53, 0xab54, 0xab55, 0xab56, 0xab57, 0xab58, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xab5d, 0xab5e, 0xab5f, 0xab60, 0xab61, 0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, 0xab68, 0xab69, 0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70, 0xab71, 0xab72, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, 0xab78, 0xab79, 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, 0xab80, 0xab81, 0xab82, 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, 0xab8a, 0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xab91, 0xab92, 0xab93, 0xab94, 0xab95, 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49, 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59, 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41, 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, 0xad48, 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xae40, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaf40, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf80, 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0xaf91, 0xaf92, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xb040, 0xb041, 0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, 0xb048, 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059, 0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, 0xb060, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071, 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082, 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb140, 0xb141, 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151, 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159, 0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179, 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb180, 0xb181, 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a, 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb280, 0xb281, 0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370, 0xb371, 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb450, 0xb451, 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb488, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551, 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb580, 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a0, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb648, 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, 0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb740, 0xb741, 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb840, 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb940, 0xb941, 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb980, 0xb981, 0xb982, 0xb983, 0xb984, 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xba41, 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba48, 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xba71, 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbc40, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48, 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc092, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0xc140, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171, 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251, 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271, 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371, 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379, 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc380, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc448, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461, 0xc462, 0xc463, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc480, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541, 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559, 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0xc560, 0xc561, 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc580, 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc640, 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0xc651, 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc680, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688, 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc780, 0xc781, 0xc782, 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790, 0xc791, 0xc792, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971, 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca80, 0xca81, 0xca82, 0xca83, 0xca84, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcb40, 0xcb41, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61, 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 0xcd40, 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61, 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0xce69, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce80, 0xce81, 0xce82, 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, 0xce88, 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90, 0xce91, 0xce92, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71, 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xd040, 0xd041, 0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd050, 0xd051, 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071, 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd140, 0xd141, 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd180, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a0, 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd280, 0xd281, 0xd282, 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345, 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379, 0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441, 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480, 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641, 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649, 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xd682, 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741, 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751, 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0xd761, 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780, 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788, 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0xd799, 0xd79a, 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851, 0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xd858, 0xd859, 0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, 0xd861, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, 0xd868, 0xd869, 0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, 0xd879, 0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd880, 0xd881, 0xd882, 0xd883, 0xd884, 0xd885, 0xd886, 0xd887, 0xd888, 0xd889, 0xd88a, 0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892, 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a, 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941, 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949, 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951, 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959, 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961, 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969, 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971, 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979, 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982, 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a, 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992, 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a, 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41, 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49, 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, 0xda50, 0xda51, 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, 0xda58, 0xda59, 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, 0xda68, 0xda69, 0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, 0xda70, 0xda71, 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda80, 0xda81, 0xda82, 0xda83, 0xda84, 0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, 0xda90, 0xda91, 0xda92, 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99, 0xda9a, 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xdb41, 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, 0xdb48, 0xdb49, 0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, 0xdb50, 0xdb51, 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, 0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71, 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, 0xdb78, 0xdb79, 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb80, 0xdb81, 0xdb82, 0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, 0xdb88, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, 0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, 0xdba0, 0xdc40, 0xdc41, 0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, 0xdc48, 0xdc49, 0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, 0xdc58, 0xdc59, 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc69, 0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc79, 0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a, 0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, 0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, 0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41, 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49, 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, 0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, 0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82, 0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a, 0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, 0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, 0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41, 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49, 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xde61, 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xde78, 0xde79, 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xde85, 0xde86, 0xde87, 0xde88, 0xde89, 0xde8a, 0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, 0xde90, 0xde91, 0xde92, 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98, 0xde99, 0xde9a, 0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, 0xdea0, 0xdf40, 0xdf41, 0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, 0xdf48, 0xdf49, 0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xdf50, 0xdf51, 0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, 0xdf58, 0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, 0xdf60, 0xdf61, 0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, 0xdf68, 0xdf69, 0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xdf71, 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, 0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf80, 0xdf81, 0xdf82, 0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, 0xdf88, 0xdf89, 0xdf8a, 0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, 0xdf90, 0xdf91, 0xdf92, 0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, 0xdf98, 0xdf99, 0xdf9a, 0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, 0xdfa0, 0xe040, 0xe041, 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, 0xe048, 0xe049, 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051, 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059, 0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, 0xe060, 0xe061, 0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, 0xe068, 0xe069, 0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, 0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, 0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xe081, 0xe082, 0xe083, 0xe084, 0xe085, 0xe086, 0xe087, 0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095, 0xe096, 0xe097, 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, 0xe0a0, 0xe140, 0xe141, 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, 0xe148, 0xe149, 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151, 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159, 0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, 0xe160, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, 0xe168, 0xe169, 0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171, 0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, 0xe178, 0xe179, 0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe180, 0xe181, 0xe182, 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, 0xe199, 0xe19a, 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241, 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259, 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261, 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269, 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271, 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279, 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282, 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a, 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292, 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a, 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341, 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349, 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351, 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359, 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361, 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369, 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, 0xe370, 0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, 0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381, 0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xe388, 0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, 0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, 0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486, 0xe487, 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, 0xe497, 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, 0xe4a0, 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, 0xe570, 0xe571, 0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585, 0xe586, 0xe587, 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595, 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe640, 0xe641, 0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649, 0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, 0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, 0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, 0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, 0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, 0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, 0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a, 0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, 0xe693, 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, 0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741, 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xe748, 0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, 0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, 0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, 0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, 0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, 0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, 0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781, 0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789, 0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, 0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840, 0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848, 0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, 0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, 0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, 0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, 0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, 0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, 0xe878, 0xe879, 0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, 0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, 0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xe895, 0xe896, 0xe897, 0xe898, 0xe899, 0xe89a, 0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, 0xe8a0, 0xe940, 0xe941, 0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, 0xe948, 0xe949, 0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, 0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, 0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, 0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, 0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, 0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, 0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982, 0xe983, 0xe984, 0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, 0xe993, 0xe994, 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41, 0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49, 0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, 0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, 0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, 0xea60, 0xea61, 0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, 0xea69, 0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, 0xea70, 0xea71, 0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, 0xea78, 0xea79, 0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea80, 0xea81, 0xea82, 0xea83, 0xea84, 0xea85, 0xea86, 0xea87, 0xea88, 0xea89, 0xea8a, 0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, 0xea90, 0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, 0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, 0xeaa0, 0xeb40, 0xeb41, 0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, 0xeb48, 0xeb49, 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, 0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, 0xeb60, 0xeb61, 0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, 0xeb68, 0xeb69, 0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb80, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, 0xeb88, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0xeb91, 0xeb92, 0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, 0xeb98, 0xeb99, 0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, 0xeba0, 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49, 0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, 0xec50, 0xec51, 0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, 0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, 0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, 0xec68, 0xec69, 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, 0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec80, 0xec81, 0xec82, 0xec83, 0xec84, 0xec85, 0xec86, 0xec87, 0xec88, 0xec89, 0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, 0xec90, 0xec91, 0xec92, 0xec93, 0xec94, 0xec95, 0xec96, 0xec97, 0xec98, 0xec99, 0xec9a, 0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41, 0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, 0xed48, 0xed49, 0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, 0xed50, 0xed51, 0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, 0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, 0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, 0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, 0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, 0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xed82, 0xed83, 0xed84, 0xed85, 0xed86, 0xed87, 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, 0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, 0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40, 0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48, 0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, 0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, 0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, 0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, 0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, 0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, 0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81, 0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89, 0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, 0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, 0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, 0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53, 0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, 0xef78, 0xef79, 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef80, 0xef81, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061, 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 0xf140, 0xf141, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, 0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186, 0xf187, 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265, 0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286, 0xf287, 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296, 0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, 0xf2a0, 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, 0xf348, 0xf349, 0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351, 0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359, 0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, 0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369, 0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371, 0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379, 0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf380, 0xf381, 0xf382, 0xf383, 0xf384, 0xf385, 0xf386, 0xf387, 0xf388, 0xf389, 0xf38a, 0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, 0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a, 0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, 0xf3a0, 0xf440, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, 0xf448, 0xf449, 0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, 0xf458, 0xf459, 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469, 0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0xf470, 0xf471, 0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, 0xf478, 0xf479, 0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482, 0xf483, 0xf484, 0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, 0xf493, 0xf494, 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541, 0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549, 0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, 0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, 0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, 0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, 0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, 0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, 0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582, 0xf583, 0xf584, 0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, 0xf593, 0xf594, 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641, 0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649, 0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, 0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, 0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, 0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, 0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, 0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, 0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682, 0xf683, 0xf684, 0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, 0xf693, 0xf694, 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741, 0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749, 0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, 0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, 0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, 0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf780, 0xf781, 0xf782, 0xf783, 0xf784, 0xf785, 0xf786, 0xf787, 0xf788, 0xf789, 0xf78a, 0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, 0xf790, 0xf791, 0xf792, 0xf793, 0xf794, 0xf795, 0xf796, 0xf797, 0xf798, 0xf799, 0xf79a, 0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, 0xf7a0, 0xf840, 0xf841, 0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, 0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, 0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, 0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895, 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941, 0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, 0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, 0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985, 0xf986, 0xf987, 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995, 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, 0xfb60, 0xfb61, 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, 0xfb68, 0xfb69, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, 0xfb70, 0xfb71, 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb80, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, 0xfb88, 0xfb89, 0xfb8a, 0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, 0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xfc49, 0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, 0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59, 0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81, 0xfc82, 0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, 0xfc88, 0xfc89, 0xfc8a, 0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92, 0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, 0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, 0xfca0, 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44, 0xfd45, 0xfd46, 0xfd47, 0xfd48, 0xfd49, 0xfd4a, 0xfd4b, 0xfd4c, 0xfd4d, 0xfd4e, 0xfd4f, 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, 0xfd88, 0xfd89, 0xfd8a, 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92, 0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, 0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, 0xfda0, 0xfe40, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, 0xfe48, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xa955, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970, 0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa97e, 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, 0xa988, 0xa956, 0xa957, }; static const Summary16 gbkext_inv_uni2indx_page02[14] = { /* 0x0200 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0c00 }, { 2, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page20[44] = { /* 0x2000 */ { 3, 0x0000 }, { 3, 0x0029 }, { 6, 0x0020 }, { 7, 0x0020 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, /* 0x2100 */ { 8, 0x0220 }, { 10, 0x0000 }, { 10, 0x0002 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x03c0 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, /* 0x2200 */ { 15, 0x0000 }, { 15, 0x8020 }, { 17, 0x0008 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0004 }, { 19, 0x00c0 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0020 }, { 22, 0x0000 }, { 22, 0x8000 }, }; static const Summary16 gbkext_inv_uni2indx_page25[17] = { /* 0x2500 */ { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0xffff }, { 39, 0xffff }, { 55, 0x000f }, { 59, 0xfffe }, { 74, 0x0038 }, { 77, 0x0000 }, { 77, 0x3000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x003c }, { 83, 0x0000 }, /* 0x2600 */ { 83, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page30[16] = { /* 0x3000 */ { 84, 0x00c0 }, { 86, 0x6004 }, { 89, 0x03fe }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x7800 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x7000 }, }; static const Summary16 gbkext_inv_uni2indx_page32[30] = { /* 0x3200 */ { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0002 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0008 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, /* 0x3300 */ { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0xc000 }, { 109, 0x7000 }, { 112, 0x0002 }, { 113, 0x0000 }, { 113, 0x4010 }, { 115, 0x0026 }, }; static const Summary16 gbkext_inv_uni2indx_page4e[1307] = { /* 0x4e00 */ { 118, 0x8074 }, { 123, 0x8084 }, { 126, 0xc24b }, { 133, 0x10aa }, { 138, 0x0457 }, { 144, 0x0ca2 }, { 149, 0xfdbc }, { 161, 0xbff4 }, { 173, 0x04bf }, { 181, 0x72c1 }, { 188, 0x8408 }, { 191, 0x73d3 }, { 201, 0x9100 }, { 204, 0x1c05 }, { 209, 0xe2c5 }, { 217, 0x5712 }, /* 0x4f00 */ { 224, 0x19fd }, { 234, 0x307c }, { 241, 0x730a }, { 248, 0xcaaa }, { 256, 0x1fb7 }, { 267, 0x0054 }, { 270, 0x6d46 }, { 278, 0x27a6 }, { 286, 0x54e7 }, { 295, 0xd76d }, { 306, 0x2816 }, { 311, 0x7fdf }, { 325, 0x3bc7 }, { 335, 0x0a7c }, { 342, 0x18b5 }, { 349, 0xbaf5 }, /* 0x5000 */ { 360, 0x4fff }, { 373, 0x68eb }, { 382, 0x889d }, { 389, 0xabff }, { 402, 0x2e77 }, { 412, 0xebdf }, { 425, 0xefdf }, { 439, 0x373f }, { 450, 0xdede }, { 462, 0xffff }, { 478, 0xec57 }, { 488, 0xf3fb }, { 501, 0x7fff }, { 516, 0xfbbf }, { 530, 0x8f3f }, { 541, 0xf7d7 }, /* 0x5100 */ { 554, 0xf73f }, { 567, 0xfffb }, { 582, 0xfffd }, { 597, 0x7fff }, { 612, 0xd484 }, { 618, 0xeb8d }, { 628, 0x86db }, { 637, 0xc404 }, { 641, 0xccd8 }, { 649, 0xe51b }, { 658, 0x67ca }, { 667, 0xc710 }, { 673, 0x652e }, { 681, 0xd7fd }, { 694, 0x57ec }, { 704, 0x4096 }, /* 0x5200 */ { 709, 0x9a30 }, { 715, 0xd039 }, { 722, 0x94ee }, { 731, 0x5036 }, { 737, 0xcbf0 }, { 746, 0xafac }, { 756, 0x795d }, { 766, 0x5ffb }, { 779, 0xfef9 }, { 792, 0x17f6 }, { 802, 0xc0f0 }, { 808, 0x3ff1 }, { 819, 0xf577 }, { 831, 0x7eba }, { 842, 0xffef }, { 857, 0x39fe }, /* 0x5300 */ { 868, 0x5e9e }, { 878, 0xd91e }, { 887, 0xbbb4 }, { 897, 0x31ff }, { 908, 0x3855 }, { 915, 0x2b11 }, { 921, 0x3520 }, { 926, 0x7a44 }, { 933, 0xc58b }, { 941, 0x5adf }, { 952, 0xbc93 }, { 961, 0x77bf }, { 974, 0xc0f9 }, { 982, 0x742d }, { 990, 0x0086 }, { 993, 0xc410 }, /* 0x5400 */ { 997, 0x08a5 }, { 1002, 0x1710 }, { 1007, 0x0434 }, { 1011, 0xa4c9 }, { 1018, 0xf2b6 }, { 1028, 0xe402 }, { 1033, 0xfeab }, { 1045, 0xc611 }, { 1051, 0x27aa }, { 1059, 0xd18a }, { 1066, 0x4027 }, { 1071, 0x56e5 }, { 1080, 0x0c28 }, { 1084, 0x0940 }, { 1087, 0x981f }, { 1095, 0x4bf3 }, /* 0x5500 */ { 1105, 0x7d3d }, { 1116, 0xf7ec }, { 1128, 0x2b62 }, { 1135, 0x2f74 }, { 1144, 0xf9a5 }, { 1154, 0xef9e }, { 1166, 0x8b0d }, { 1173, 0xa61f }, { 1182, 0x7060 }, { 1187, 0x4ced }, { 1196, 0xff7f }, { 1211, 0x9555 }, { 1219, 0xcdcf }, { 1230, 0x4fa1 }, { 1238, 0x6285 }, { 1244, 0x9f53 }, /* 0x5600 */ { 1254, 0x2cfc }, { 1263, 0x36ff }, { 1275, 0xcf67 }, { 1286, 0x75a9 }, { 1295, 0x8fff }, { 1308, 0xec6f }, { 1319, 0xe0eb }, { 1328, 0xe7bd }, { 1340, 0x3f9f }, { 1352, 0xfff7 }, { 1367, 0x7ff7 }, { 1381, 0xef7f }, { 1395, 0xfbff }, { 1410, 0x136f }, { 1419, 0xd7e8 }, { 1429, 0x19cc }, /* 0x5700 */ { 1436, 0xf8a7 }, { 1446, 0x6fff }, { 1460, 0x08f7 }, { 1468, 0xb1f6 }, { 1478, 0x0b7a }, { 1486, 0x037c }, { 1493, 0x50ac }, { 1499, 0xe737 }, { 1510, 0xe783 }, { 1519, 0xf7f3 }, { 1532, 0x9520 }, { 1537, 0xfeeb }, { 1550, 0x37f3 }, { 1561, 0x58cb }, { 1569, 0x5fee }, { 1581, 0xd8ef }, /* 0x5800 */ { 1592, 0xd73a }, { 1602, 0xbddd }, { 1614, 0xfbec }, { 1626, 0xffde }, { 1640, 0xcfef }, { 1653, 0xbeed }, { 1665, 0xe7df }, { 1678, 0xbfff }, { 1693, 0xfdd4 }, { 1704, 0x39f3 }, { 1714, 0xfcff }, { 1728, 0xefff }, { 1743, 0xffdd }, { 1757, 0xffdd }, { 1771, 0xa7ef }, { 1783, 0xfdb6 }, /* 0x5900 */ { 1795, 0x5f6b }, { 1806, 0x698f }, { 1815, 0x114f }, { 1822, 0xe86d }, { 1831, 0x3469 }, { 1838, 0xfa0d }, { 1847, 0xffda }, { 1860, 0xdca7 }, { 1870, 0xda21 }, { 1877, 0xbd33 }, { 1887, 0x30c7 }, { 1894, 0xb5fb }, { 1906, 0xf3bf }, { 1919, 0xca60 }, { 1925, 0xeed7 }, { 1937, 0x75ff }, /* 0x5a00 */ { 1950, 0xec05 }, { 1957, 0x6ef5 }, { 1968, 0xfdd6 }, { 1980, 0xefa9 }, { 1991, 0xf9be }, { 2003, 0xfbdf }, { 2017, 0xfb7b }, { 2030, 0x7b0f }, { 2040, 0xffff }, { 2056, 0xf3fb }, { 2069, 0xfbff }, { 2084, 0xbed3 }, { 2095, 0xedf9 }, { 2107, 0xeeab }, { 2118, 0xf5b4 }, { 2128, 0xfffd }, /* 0x5b00 */ { 2143, 0xfdff }, { 2158, 0xff3f }, { 2172, 0xffff }, { 2188, 0xff6b }, { 2201, 0xfffe }, { 2216, 0x4044 }, { 2219, 0xe983 }, { 2227, 0xdbd4 }, { 2237, 0x6444 }, { 2242, 0x8057 }, { 2248, 0xf380 }, { 2255, 0x1c86 }, { 2261, 0xef0b }, { 2271, 0x1ff2 }, { 2281, 0xbecd }, { 2292, 0x60fe }, /* 0x5c00 */ { 2301, 0x79ad }, { 2311, 0xca8d }, { 2319, 0xef4b }, { 2330, 0x00ed }, { 2336, 0x30d8 }, { 2342, 0xbddc }, { 2353, 0x3f94 }, { 2362, 0x79fd }, { 2374, 0xcef9 }, { 2385, 0xe02c }, { 2391, 0xc5f3 }, { 2401, 0x5e55 }, { 2410, 0xf7ed }, { 2423, 0xfdfb }, { 2437, 0xda8d }, { 2446, 0xf7fe }, /* 0x5d00 */ { 2460, 0xbf33 }, { 2471, 0xb7af }, { 2483, 0x9d2f }, { 2493, 0x9fef }, { 2506, 0xe37f }, { 2518, 0xd6ff }, { 2531, 0x65ff }, { 2543, 0xffef }, { 2558, 0xfffb }, { 2573, 0xddff }, { 2587, 0xffff }, { 2603, 0xff7f }, { 2618, 0xdfdf }, { 2632, 0x97ff }, { 2645, 0x3419 }, { 2651, 0x9f61 }, /* 0x5e00 */ { 2660, 0x6e91 }, { 2668, 0xc08c }, { 2673, 0x9f3f }, { 2685, 0xc67d }, { 2695, 0xefcb }, { 2707, 0xb7cf }, { 2719, 0xfff9 }, { 2733, 0x42a3 }, { 2739, 0x732e }, { 2748, 0x2904 }, { 2752, 0xdf1e }, { 2763, 0xbc17 }, { 2772, 0xf9ff }, { 2786, 0xf7b1 }, { 2797, 0xfaff }, { 2811, 0x3b2f }, /* 0x5f00 */ { 2821, 0x72e0 }, { 2828, 0x7655 }, { 2837, 0x591e }, { 2845, 0xe9fd }, { 2857, 0xfffe }, { 2872, 0xde12 }, { 2880, 0xc9a9 }, { 2888, 0xe574 }, { 2897, 0xe048 }, { 2902, 0xec5a }, { 2911, 0x9afd }, { 2922, 0xcf5f }, { 2934, 0x4d87 }, { 2942, 0xdc38 }, { 2950, 0x936c }, { 2958, 0x16dd }, /* 0x6000 */ { 2967, 0x1b80 }, { 2972, 0xc58b }, { 2980, 0x701c }, { 2986, 0x67df }, { 2998, 0xd7f1 }, { 3009, 0xd9da }, { 3019, 0x4063 }, { 3024, 0x40b6 }, { 3030, 0xcde7 }, { 3041, 0x53ab }, { 3050, 0x46b6 }, { 3058, 0xe6e9 }, { 3068, 0xf39f }, { 3080, 0x4add }, { 3089, 0x043e }, { 3095, 0xf9a6 }, /* 0x6100 */ { 3105, 0x1cbc }, { 3113, 0x7bdf }, { 3126, 0xf726 }, { 3136, 0x7fff }, { 3151, 0xaaff }, { 3163, 0xdfdd }, { 3176, 0xfe7b }, { 3189, 0xff5e }, { 3202, 0xb7ff }, { 3216, 0xdfef }, { 3230, 0xec7f }, { 3242, 0xbf7f }, { 3256, 0xf2fb }, { 3268, 0xffe9 }, { 3281, 0xffbf }, { 3296, 0x7fdf }, /* 0x6200 */ { 3310, 0x02bf }, { 3318, 0x7218 }, { 3324, 0xabc9 }, { 3333, 0x1f67 }, { 3343, 0x8474 }, { 3349, 0xf6e1 }, { 3359, 0x0137 }, { 3365, 0x2db6 }, { 3374, 0xf9ee }, { 3386, 0x7211 }, { 3392, 0xe6c8 }, { 3400, 0x45dd }, { 3409, 0x880b }, { 3414, 0x6022 }, { 3418, 0x0c13 }, { 3423, 0x0f25 }, /* 0x6300 */ { 3430, 0xbc79 }, { 3440, 0x13bd }, { 3449, 0x72c0 }, { 3455, 0xd9fb }, { 3467, 0x0593 }, { 3473, 0x3fde }, { 3485, 0x9d71 }, { 3494, 0xf33d }, { 3505, 0x287a }, { 3512, 0xfeba }, { 3524, 0x8852 }, { 3529, 0xaa66 }, { 3537, 0x1daf }, { 3547, 0xbfba }, { 3559, 0xd9f4 }, { 3569, 0x5eab }, /* 0x6400 */ { 3579, 0x67d8 }, { 3588, 0xa7e6 }, { 3598, 0xcbbc }, { 3608, 0x5bef }, { 3620, 0xfa0d }, { 3629, 0xbeeb }, { 3641, 0xdd7f }, { 3654, 0xf8ff }, { 3667, 0xff4b }, { 3679, 0xbd99 }, { 3689, 0x8def }, { 3700, 0xea5e }, { 3710, 0x9fda }, { 3721, 0xbe7a }, { 3732, 0xffab }, { 3745, 0xffff }, /* 0x6500 */ { 3761, 0xfdfe }, { 3775, 0xfefb }, { 3789, 0x37df }, { 3801, 0x348f }, { 3809, 0x6cdf }, { 3820, 0x959d }, { 3829, 0xe7b3 }, { 3840, 0xff6a }, { 3852, 0xe77f }, { 3865, 0x6574 }, { 3873, 0x554d }, { 3881, 0xcdfe }, { 3893, 0x2785 }, { 3900, 0xff3b }, { 3913, 0x0c1a }, { 3918, 0xfb3c }, /* 0x6600 */ { 3929, 0x2bb2 }, { 3937, 0x5dc7 }, { 3947, 0x5e5e }, { 3957, 0xaf8d }, { 3967, 0x67f5 }, { 3978, 0x7b03 }, { 3986, 0x3ead }, { 3996, 0xbb2e }, { 4006, 0xef6b }, { 4018, 0xdf3d }, { 4030, 0xbe7f }, { 4043, 0xbdef }, { 4056, 0xffff }, { 4072, 0xc5ff }, { 4084, 0xfdbf }, { 4098, 0x2d62 }, /* 0x6700 */ { 4105, 0xd0fe }, { 4115, 0x574e }, { 4124, 0x42bf }, { 4133, 0xdbcd }, { 4144, 0x2cb2 }, { 4151, 0x2fb4 }, { 4160, 0x58dc }, { 4168, 0x2f52 }, { 4176, 0xf56d }, { 4187, 0x8a5e }, { 4195, 0x5253 }, { 4202, 0xfe16 }, { 4212, 0x7fe5 }, { 4224, 0x88e0 }, { 4229, 0x6dda }, { 4239, 0x5fe4 }, /* 0x6800 */ { 4249, 0x205e }, { 4255, 0xdf35 }, { 4266, 0xf9fd }, { 4279, 0x8c73 }, { 4287, 0xa880 }, { 4291, 0xffc4 }, { 4302, 0xf400 }, { 4307, 0xff2f }, { 4320, 0x7f95 }, { 4331, 0xff77 }, { 4345, 0x5e3b }, { 4355, 0xffd6 }, { 4368, 0xd5fa }, { 4379, 0xfadb }, { 4391, 0xbff6 }, { 4404, 0xe9dc }, /* 0x6900 */ { 4414, 0x97dd }, { 4425, 0x7ffa }, { 4438, 0xdfee }, { 4451, 0x5dee }, { 4462, 0xfffb }, { 4477, 0x9b6f }, { 4488, 0xb7b6 }, { 4499, 0xec7d }, { 4510, 0xdc2a }, { 4518, 0xe6cf }, { 4529, 0xd67f }, { 4541, 0xf76d }, { 4553, 0xabfd }, { 4565, 0x77ee }, { 4577, 0xdffe }, { 4591, 0x5ffb }, /* 0x6a00 */ { 4604, 0xfbff }, { 4619, 0x7e7f }, { 4632, 0x7afd }, { 4644, 0x9fdd }, { 4656, 0xff6f }, { 4670, 0xf4fe }, { 4682, 0xffdd }, { 4696, 0xedfd }, { 4709, 0xbfee }, { 4722, 0xff7c }, { 4735, 0xe5fe }, { 4747, 0xffff }, { 4763, 0xffff }, { 4779, 0xffff }, { 4795, 0xffff }, { 4811, 0xffff }, /* 0x6b00 */ { 4827, 0xffff }, { 4843, 0xffff }, { 4859, 0xff60 }, { 4869, 0xb97b }, { 4880, 0xed37 }, { 4891, 0xfdff }, { 4906, 0xfb03 }, { 4915, 0xe5ff }, { 4928, 0xd121 }, { 4934, 0xf3b3 }, { 4945, 0xfbfd }, { 4959, 0x7f47 }, { 4970, 0x57d9 }, { 4980, 0xf503 }, { 4988, 0x73fd }, { 5000, 0xddd7 }, /* 0x6c00 */ { 5012, 0x5f1f }, { 5023, 0x7084 }, { 5028, 0x3829 }, { 5034, 0xdeca }, { 5044, 0xf938 }, { 5053, 0x074e }, { 5060, 0xf8ec }, { 5070, 0x9daa }, { 5079, 0x6c91 }, { 5086, 0x75e6 }, { 5096, 0x9105 }, { 5101, 0x04f1 }, { 5107, 0xe9cf }, { 5118, 0xb706 }, { 5126, 0x32d0 }, { 5132, 0x8214 }, /* 0x6d00 */ { 5136, 0xa76d }, { 5146, 0xb17b }, { 5156, 0xb35f }, { 5167, 0x85d1 }, { 5174, 0x1215 }, { 5179, 0xa9e1 }, { 5187, 0x39b6 }, { 5196, 0xee6f }, { 5208, 0xacdb }, { 5218, 0x17c5 }, { 5226, 0x3024 }, { 5230, 0x7edb }, { 5242, 0xe70e }, { 5251, 0x9cbd }, { 5261, 0xa7ac }, { 5270, 0xe575 }, /* 0x6e00 */ { 5280, 0x8bdf }, { 5291, 0xdb2c }, { 5300, 0x55c4 }, { 5307, 0xfaeb }, { 5319, 0x9fe7 }, { 5331, 0x76a7 }, { 5341, 0xb7ff }, { 5355, 0x3fff }, { 5369, 0x7d97 }, { 5380, 0x6efe }, { 5392, 0x7b5b }, { 5403, 0xd329 }, { 5411, 0x7779 }, { 5422, 0x3b45 }, { 5430, 0xfc88 }, { 5438, 0xfdef }, /* 0x6f00 */ { 5452, 0x7dbb }, { 5464, 0xffc7 }, { 5477, 0x51ee }, { 5486, 0xbfb5 }, { 5498, 0xd73f }, { 5510, 0xaeff }, { 5523, 0x9fbb }, { 5535, 0xeaeb }, { 5546, 0x8cef }, { 5556, 0xefff }, { 5571, 0xff7d }, { 5585, 0xfdb7 }, { 5598, 0xfdfa }, { 5611, 0xbff9 }, { 5624, 0x3ffc }, { 5636, 0xffff }, /* 0x7000 */ { 5652, 0xffff }, { 5668, 0xf3fd }, { 5681, 0xfff7 }, { 5696, 0xfddf }, { 5710, 0x6fff }, { 5724, 0xbfff }, { 5739, 0x47ff }, { 5751, 0x2e9e }, { 5760, 0xb9de }, { 5771, 0xcd8b }, { 5780, 0x07ff }, { 5791, 0xc475 }, { 5799, 0xfaf0 }, { 5809, 0x74ff }, { 5821, 0x442f }, { 5828, 0xdd7f }, /* 0x7100 */ { 5841, 0xf9ff }, { 5855, 0xf896 }, { 5864, 0x7fbf }, { 5878, 0xffbc }, { 5891, 0xabdf }, { 5903, 0xafff }, { 5917, 0xbe2f }, { 5928, 0xdaf3 }, { 5939, 0x7bef }, { 5952, 0x7cef }, { 5964, 0xeefe }, { 5977, 0xfdd7 }, { 5990, 0xbff7 }, { 6004, 0xffcf }, { 6018, 0xbf5e }, { 6030, 0xfdff }, /* 0x7200 */ { 6045, 0xffbf }, { 6060, 0xdfff }, { 6075, 0xeaff }, { 6088, 0x541c }, { 6094, 0xce7f }, { 6106, 0x55bb }, { 6116, 0x3d39 }, { 6125, 0x39db }, { 6135, 0x53ec }, { 6144, 0x7ffb }, { 6158, 0x4fff }, { 6171, 0xfc2e }, { 6181, 0x9ee1 }, { 6190, 0xbd7a }, { 6201, 0x0cfc }, { 6209, 0xe260 }, /* 0x7300 */ { 6215, 0xbbf5 }, { 6227, 0x8717 }, { 6235, 0xa1d9 }, { 6243, 0x3c6d }, { 6252, 0xdfff }, { 6267, 0xff7a }, { 6280, 0x4ffe }, { 6292, 0xbfff }, { 6307, 0xb56f }, { 6318, 0x77bd }, { 6330, 0x35fb }, { 6341, 0xf372 }, { 6351, 0x58fa }, { 6360, 0xbdfc }, { 6372, 0xdd5e }, { 6383, 0xfffb }, /* 0x7400 */ { 6398, 0x7997 }, { 6408, 0xf3fe }, { 6421, 0xaa9b }, { 6430, 0xef86 }, { 6440, 0xfffd }, { 6455, 0x215f }, { 6463, 0xdfff }, { 6478, 0xbf3e }, { 6490, 0xb774 }, { 6500, 0xaffe }, { 6513, 0xfc7f }, { 6526, 0xfbff }, { 6541, 0xffff }, { 6557, 0xaffb }, { 6570, 0x3fa2 }, { 6579, 0x7f2f }, /* 0x7500 */ { 6591, 0x5fef }, { 6604, 0x68f5 }, { 6613, 0x44df }, { 6622, 0xb250 }, { 6628, 0x26de }, { 6637, 0xe1ef }, { 6648, 0xfb9f }, { 6661, 0x7ceb }, { 6672, 0x77b7 }, { 6684, 0x5929 }, { 6691, 0x27c4 }, { 6698, 0x8cc0 }, { 6703, 0xd843 }, { 6710, 0xb68b }, { 6719, 0xf223 }, { 6727, 0x6dec }, /* 0x7600 */ { 6737, 0xebd4 }, { 6747, 0x745e }, { 6756, 0xd18a }, { 6763, 0x2ec6 }, { 6771, 0xcff6 }, { 6783, 0xafaf }, { 6795, 0x77f7 }, { 6808, 0x96ff }, { 6820, 0xb62b }, { 6829, 0xfdb5 }, { 6841, 0xbfef }, { 6855, 0x7fe9 }, { 6867, 0x1a9b }, { 6875, 0x7628 }, { 6882, 0x3fdf }, { 6895, 0xace9 }, /* 0x7700 */ { 6904, 0xd46d }, { 6913, 0x79ff }, { 6926, 0x5cba }, { 6935, 0xea1f }, { 6945, 0xff74 }, { 6957, 0xf3fc }, { 6969, 0xe691 }, { 6977, 0x1dff }, { 6989, 0x8fce }, { 6999, 0x7ff9 }, { 7012, 0xe95a }, { 7021, 0x57d6 }, { 7031, 0xdfff }, { 7046, 0xe77f }, { 7059, 0x8553 }, { 7066, 0x1eb7 }, /* 0x7800 */ { 7076, 0xcdf8 }, { 7086, 0x4a29 }, { 7092, 0xcd17 }, { 7101, 0xa06e }, { 7108, 0xaf5e }, { 7119, 0xdf1a }, { 7129, 0x83ff }, { 7140, 0xef7f }, { 7154, 0x8d7f }, { 7165, 0x6275 }, { 7173, 0xff55 }, { 7185, 0xbde0 }, { 7194, 0xf1dd }, { 7205, 0xfdce }, { 7217, 0xeeff }, { 7231, 0xfb6b }, /* 0x7900 */ { 7243, 0xffdd }, { 7257, 0xbff7 }, { 7271, 0xffef }, { 7286, 0xa3ef }, { 7297, 0xfcbc }, { 7308, 0x0337 }, { 7315, 0x5e5a }, { 7324, 0xfa7f }, { 7337, 0x7bcc }, { 7347, 0xfbff }, { 7362, 0xff7f }, { 7377, 0x91f7 }, { 7387, 0xd5b4 }, { 7396, 0x7ed9 }, { 7407, 0x5527 }, { 7415, 0xd6fe }, /* 0x7a00 */ { 7427, 0x97b2 }, { 7436, 0xbb6f }, { 7448, 0xfff6 }, { 7462, 0x4577 }, { 7471, 0xffbf }, { 7486, 0xff7d }, { 7500, 0xffff }, { 7516, 0x782e }, { 7524, 0xdea4 }, { 7533, 0x4e19 }, { 7540, 0xce9e }, { 7550, 0x7ff7 }, { 7564, 0xf7ff }, { 7579, 0x3dbf }, { 7591, 0x5f96 }, { 7601, 0x59ff }, /* 0x7b00 */ { 7613, 0x72a7 }, { 7622, 0xb5cd }, { 7632, 0xa28e }, { 7639, 0xaaf5 }, { 7649, 0x655f }, { 7659, 0xd2a8 }, { 7666, 0xbffa }, { 7679, 0xb559 }, { 7688, 0xdfde }, { 7701, 0xcf4e }, { 7711, 0xc039 }, { 7717, 0xfeed }, { 7730, 0xef3d }, { 7742, 0xd9f5 }, { 7753, 0xbb9d }, { 7764, 0xaf7d }, /* 0x7c00 */ { 7776, 0x677f }, { 7788, 0x7fbf }, { 7802, 0xfb3f }, { 7815, 0x7eff }, { 7829, 0xdffc }, { 7842, 0xffff }, { 7858, 0xffff }, { 7874, 0xc7e7 }, { 7885, 0xfdff }, { 7900, 0x0e59 }, { 7907, 0xbbcb }, { 7918, 0x8df1 }, { 7927, 0xca5d }, { 7936, 0x6d1f }, { 7946, 0x7efe }, { 7959, 0xf6ff }, /* 0x7d00 */ { 7973, 0xfbff }, { 7988, 0xffff }, { 8004, 0x777a }, { 8015, 0xffff }, { 8031, 0xffff }, { 8047, 0xffff }, { 8063, 0xbfff }, { 8078, 0xff7f }, { 8093, 0xffff }, { 8109, 0xffff }, { 8125, 0xbfbf }, { 8139, 0xffff }, { 8155, 0xffff }, { 8171, 0xffff }, { 8187, 0xffff }, { 8203, 0xffff }, /* 0x7e00 */ { 8219, 0xffff }, { 8235, 0xffff }, { 8251, 0xffff }, { 8267, 0xf7ff }, { 8282, 0xff7d }, { 8296, 0xffff }, { 8312, 0xffff }, { 8328, 0xffff }, { 8344, 0xfffb }, { 8359, 0x77ff }, { 8373, 0x4000 }, { 8374, 0x1810 }, { 8377, 0x0000 }, { 8377, 0x0040 }, { 8378, 0x1010 }, { 8380, 0x0200 }, /* 0x7f00 */ { 8381, 0x0400 }, { 8382, 0x4001 }, { 8384, 0x0000 }, { 8384, 0xfa80 }, { 8391, 0xffcb }, { 8404, 0x7a4c }, { 8412, 0xb8f9 }, { 8422, 0xbde9 }, { 8433, 0xabfd }, { 8445, 0x1bef }, { 8456, 0x7f6d }, { 8468, 0x4cfa }, { 8477, 0xabdd }, { 8488, 0x7ecf }, { 8500, 0xbd9c }, { 8510, 0xe7f4 }, /* 0x8000 */ { 8521, 0xc784 }, { 8528, 0xec0a }, { 8535, 0xf81a }, { 8543, 0x5615 }, { 8550, 0xc3b3 }, { 8559, 0xfaeb }, { 8571, 0xf9ff }, { 8585, 0x7ffd }, { 8599, 0xe526 }, { 8607, 0x42b7 }, { 8615, 0x11c8 }, { 8620, 0x0b69 }, { 8627, 0x8fa0 }, { 8634, 0x813f }, { 8642, 0x404d }, { 8647, 0xcaa0 }, /* 0x8100 */ { 8653, 0x19bb }, { 8662, 0xbaa0 }, { 8669, 0x6fff }, { 8683, 0xbeb9 }, { 8694, 0xe2bf }, { 8705, 0xf9c4 }, { 8714, 0x9d5e }, { 8724, 0x01ec }, { 8730, 0x7afa }, { 8741, 0xc6fd }, { 8752, 0xfab7 }, { 8764, 0xf3f7 }, { 8777, 0xebb0 }, { 8786, 0xffff }, { 8802, 0xcb77 }, { 8813, 0xa7e7 }, /* 0x8200 */ { 8824, 0xcf88 }, { 8832, 0x27ea }, { 8841, 0x42f1 }, { 8848, 0xb404 }, { 8853, 0x756f }, { 8864, 0x7aff }, { 8877, 0x3eff }, { 8890, 0x19e2 }, { 8897, 0x12eb }, { 8905, 0x4c79 }, { 8913, 0x008d }, { 8917, 0x9c64 }, { 8924, 0x026d }, { 8930, 0x2641 }, { 8935, 0x7784 }, { 8943, 0xf56d }, /* 0x8300 */ { 8954, 0x2c01 }, { 8958, 0xe34d }, { 8967, 0x467f }, { 8977, 0xe885 }, { 8984, 0x7d36 }, { 8994, 0x23e8 }, { 9001, 0x0004 }, { 9002, 0xc67f }, { 9013, 0xbd9f }, { 9025, 0xa6f3 }, { 9035, 0xf0fe }, { 9046, 0xc820 }, { 9050, 0x6b5c }, { 9059, 0x4eaf }, { 9069, 0xf9dc }, { 9080, 0xdcf8 }, /* 0x8400 */ { 9090, 0x07a5 }, { 9097, 0xcefd }, { 9109, 0xfe0f }, { 9120, 0xcefd }, { 9132, 0xffbf }, { 9147, 0xe17d }, { 9157, 0xc5f5 }, { 9167, 0xfa95 }, { 9177, 0xa47b }, { 9186, 0xed7f }, { 9199, 0x7ffd }, { 9213, 0x58eb }, { 9222, 0xd9ed }, { 9233, 0x5fb4 }, { 9243, 0xef96 }, { 9254, 0x6ffe }, /* 0x8500 */ { 9267, 0xefff }, { 9282, 0x7b75 }, { 9293, 0xe7fd }, { 9306, 0xc07f }, { 9315, 0xf8f7 }, { 9327, 0xbdbf }, { 9340, 0xfeef }, { 9354, 0xb1eb }, { 9364, 0x7f4f }, { 9376, 0xe7ff }, { 9390, 0x3aef }, { 9401, 0xfd7e }, { 9414, 0x7dfd }, { 9427, 0xefd6 }, { 9439, 0xfdef }, { 9453, 0x77ff }, /* 0x8600 */ { 9467, 0xffdf }, { 9482, 0xffbd }, { 9496, 0xfd7f }, { 9510, 0xeeff }, { 9524, 0x1fff }, { 9537, 0xbbec }, { 9548, 0xa7fb }, { 9560, 0x01fd }, { 9568, 0xc3f8 }, { 9577, 0xcfd7 }, { 9589, 0x6867 }, { 9597, 0xfb8c }, { 9607, 0x312e }, { 9614, 0x34ec }, { 9622, 0x9def }, { 9634, 0xbce0 }, /* 0x8700 */ { 9642, 0xd872 }, { 9650, 0xaa53 }, { 9658, 0xbdd1 }, { 9668, 0x376d }, { 9678, 0xac7f }, { 9689, 0xfd77 }, { 9702, 0xbfc6 }, { 9713, 0x87ae }, { 9722, 0xd6d3 }, { 9732, 0x7f77 }, { 9745, 0x46ff }, { 9756, 0xdbd7 }, { 9768, 0xf3be }, { 9780, 0xf7f1 }, { 9792, 0xbbde }, { 9804, 0xbdff }, /* 0x8800 */ { 9818, 0xfbf7 }, { 9832, 0xf797 }, { 9844, 0xfff9 }, { 9858, 0xedfb }, { 9871, 0xcfce }, { 9882, 0xfd6f }, { 9895, 0xa4c1 }, { 9901, 0x1f7a }, { 9911, 0xd6c9 }, { 9920, 0xefbb }, { 9933, 0xd7eb }, { 9945, 0xef7d }, { 9958, 0xbd99 }, { 9968, 0x7ccb }, { 9978, 0xfec3 }, { 9989, 0xace4 }, /* 0x8900 */ { 9997, 0xfbfb }, { 10011, 0xf1f2 }, { 10021, 0xf3dd }, { 10033, 0xffae }, { 10046, 0xffed }, { 10060, 0x3fff }, { 10074, 0xffbf }, { 10089, 0x77ff }, { 10103, 0xffb5 }, { 10116, 0xffff }, { 10132, 0xffff }, { 10148, 0xffff }, { 10164, 0x2009 }, { 10167, 0xabb8 }, { 10176, 0x7797 }, { 10187, 0xfff7 }, /* 0x8a00 */ { 10202, 0xff7e }, { 10216, 0xffff }, { 10232, 0xffff }, { 10248, 0xbfff }, { 10263, 0xfeff }, { 10278, 0xffff }, { 10294, 0xffff }, { 10310, 0xfdff }, { 10325, 0xf9ff }, { 10339, 0xfff7 }, { 10354, 0xffff }, { 10370, 0xffff }, { 10386, 0xffff }, { 10402, 0xffff }, { 10418, 0xffff }, { 10434, 0xffff }, /* 0x8b00 */ { 10450, 0xff7f }, { 10465, 0xffff }, { 10481, 0xffbf }, { 10496, 0xffff }, { 10512, 0xffff }, { 10528, 0xffff }, { 10544, 0xefbf }, { 10558, 0xffff }, { 10574, 0xffff }, { 10590, 0xffff }, { 10606, 0x1000 }, { 10607, 0x0802 }, { 10609, 0x0080 }, { 10610, 0x0001 }, { 10611, 0x0400 }, { 10612, 0x0000 }, /* 0x8c00 */ { 10612, 0x0200 }, { 10613, 0x4000 }, { 10614, 0x0000 }, { 10614, 0xff00 }, { 10622, 0xed3d }, { 10633, 0xfbdf }, { 10647, 0xf3f9 }, { 10659, 0xf8f7 }, { 10671, 0xe9db }, { 10682, 0xfeef }, { 10696, 0xffff }, { 10712, 0xffff }, { 10728, 0xffff }, { 10744, 0xffff }, { 10760, 0xffff }, { 10776, 0xffff }, /* 0x8d00 */ { 10792, 0xffff }, { 10808, 0x1fff }, { 10821, 0x0001 }, { 10822, 0x0000 }, { 10822, 0x0000 }, { 10822, 0x8086 }, { 10826, 0xd720 }, { 10833, 0xff06 }, { 10843, 0xf3cd }, { 10854, 0x7fed }, { 10867, 0xfff7 }, { 10882, 0x2ac5 }, { 10889, 0x27a7 }, { 10898, 0x133d }, { 10906, 0x62e7 }, { 10915, 0xd057 }, /* 0x8e00 */ { 10923, 0x69df }, { 10934, 0x1fef }, { 10946, 0x29f3 }, { 10955, 0xd9dd }, { 10966, 0xf068 }, { 10973, 0xfdf9 }, { 10986, 0x4dbf }, { 10997, 0x6faa }, { 11007, 0x7f5d }, { 11019, 0xafee }, { 11031, 0x67ff }, { 11044, 0xfbfb }, { 11058, 0xbfff }, { 11073, 0xffff }, { 11089, 0xffff }, { 11105, 0xffff }, /* 0x8f00 */ { 11121, 0xffff }, { 11137, 0xffff }, { 11153, 0xffff }, { 11169, 0xffff }, { 11185, 0xffff }, { 11201, 0xffff }, { 11217, 0x043f }, { 11224, 0x0000 }, { 11224, 0x1001 }, { 11226, 0x2004 }, { 11228, 0xf4f7 }, { 11240, 0x9dbc }, { 11250, 0xbe49 }, { 11259, 0x04c4 }, { 11263, 0x908b }, { 11269, 0xdc76 }, /* 0x9000 */ { 11279, 0x5180 }, { 11283, 0x1328 }, { 11288, 0x1fb8 }, { 11297, 0xa69f }, { 11307, 0x5f69 }, { 11317, 0xf670 }, { 11326, 0x9ed3 }, { 11336, 0x5fcf }, { 11348, 0xf6f2 }, { 11359, 0xd555 }, { 11368, 0x2bb1 }, { 11376, 0xb084 }, { 11381, 0x3b4d }, { 11390, 0xc774 }, { 11399, 0x5639 }, { 11407, 0x9eef }, /* 0x9100 */ { 11419, 0xffeb }, { 11433, 0xbdff }, { 11447, 0x7ff3 }, { 11460, 0xfdfd }, { 11474, 0x01b7 }, { 11481, 0x9b7a }, { 11491, 0x29c1 }, { 11497, 0x1c08 }, { 11501, 0xc55f }, { 11511, 0xf3f8 }, { 11522, 0x1bf3 }, { 11532, 0xfbcf }, { 11545, 0x097f }, { 11554, 0xeffd }, { 11568, 0xffff }, { 11584, 0xffff }, /* 0x9200 */ { 11600, 0xffff }, { 11616, 0xffff }, { 11632, 0xffff }, { 11648, 0xffff }, { 11664, 0xffff }, { 11680, 0xffff }, { 11696, 0xffff }, { 11712, 0xffef }, { 11727, 0xbfff }, { 11742, 0xffff }, { 11758, 0xbfff }, { 11773, 0xffff }, { 11789, 0xfeff }, { 11804, 0xffff }, { 11820, 0xffff }, { 11836, 0xffff }, /* 0x9300 */ { 11852, 0xffff }, { 11868, 0xffff }, { 11884, 0xffff }, { 11900, 0xbfff }, { 11915, 0xffff }, { 11931, 0xffff }, { 11947, 0xfbff }, { 11962, 0xffff }, { 11978, 0x7fff }, { 11993, 0xffff }, { 12009, 0xffff }, { 12025, 0xffff }, { 12041, 0xfbff }, { 12056, 0xffbf }, { 12071, 0xffff }, { 12087, 0xffff }, /* 0x9400 */ { 12103, 0xffff }, { 12119, 0xffff }, { 12135, 0xffff }, { 12151, 0xbfff }, { 12166, 0xffff }, { 12182, 0xffff }, { 12198, 0xf7ff }, { 12213, 0xffff }, { 12229, 0x001f }, { 12234, 0x0142 }, { 12237, 0x0000 }, { 12237, 0x0000 }, { 12237, 0x8080 }, { 12239, 0x0418 }, { 12242, 0x0040 }, { 12243, 0x0800 }, /* 0x9500 */ { 12244, 0x0000 }, { 12244, 0x1000 }, { 12245, 0x0081 }, { 12247, 0x2008 }, { 12249, 0x0908 }, { 12252, 0x0420 }, { 12254, 0x4001 }, { 12256, 0x7fb0 }, { 12266, 0xffff }, { 12282, 0xffff }, { 12298, 0xffff }, { 12314, 0xffff }, { 12330, 0xffff }, { 12346, 0xffff }, { 12362, 0x10ff }, { 12371, 0x8000 }, /* 0x9600 */ { 12372, 0x0080 }, { 12373, 0x4908 }, { 12377, 0xbbf9 }, { 12389, 0x4781 }, { 12395, 0xc40a }, { 12400, 0x77ce }, { 12411, 0xe869 }, { 12419, 0xff0b }, { 12430, 0x569f }, { 12440, 0xec6e }, { 12450, 0xff7f }, { 12465, 0x8db6 }, { 12474, 0x0d0c }, { 12479, 0xffdb }, { 12493, 0x78fe }, { 12504, 0xbd37 }, /* 0x9700 */ { 12515, 0x1c2c }, { 12521, 0xafb7 }, { 12533, 0xdbff }, { 12547, 0xbcfa }, { 12558, 0xffff }, { 12574, 0xb5b3 }, { 12584, 0xfdd8 }, { 12595, 0xefa7 }, { 12607, 0xd7df }, { 12620, 0xfee9 }, { 12632, 0x57f6 }, { 12643, 0xffeb }, { 12657, 0xffff }, { 12673, 0xffff }, { 12689, 0xc13f }, { 12698, 0xff97 }, /* 0x9800 */ { 12711, 0xffff }, { 12727, 0xffff }, { 12743, 0xffff }, { 12759, 0xffff }, { 12775, 0xffff }, { 12791, 0xffff }, { 12807, 0xffff }, { 12823, 0x001f }, { 12828, 0x4800 }, { 12830, 0x0224 }, { 12833, 0xff08 }, { 12842, 0xffff }, { 12858, 0xbfff }, { 12873, 0x38d1 }, { 12880, 0xfe7f }, { 12894, 0xffff }, /* 0x9900 */ { 12910, 0xdfff }, { 12925, 0xfffe }, { 12940, 0xbfff }, { 12955, 0xffff }, { 12971, 0xffff }, { 12987, 0xffcf }, { 13001, 0x0057 }, { 13006, 0x4b08 }, { 13011, 0x520c }, { 13016, 0xfc00 }, { 13022, 0xfedf }, { 13036, 0xffff }, { 13052, 0xffff }, { 13068, 0xffff }, { 13084, 0xffff }, { 13100, 0xffff }, /* 0x9a00 */ { 13116, 0xffff }, { 13132, 0xffff }, { 13148, 0xffff }, { 13164, 0xffff }, { 13180, 0xffff }, { 13196, 0xffff }, { 13212, 0x0fff }, { 13224, 0x0004 }, { 13225, 0x6208 }, { 13229, 0x0230 }, { 13232, 0xfe40 }, { 13240, 0xea3c }, { 13249, 0xe7d8 }, { 13259, 0x7ef5 }, { 13271, 0x57bd }, { 13282, 0xf5ff }, /* 0x9b00 */ { 13296, 0x7ef7 }, { 13309, 0x7ff7 }, { 13323, 0x7ff7 }, { 13337, 0xe7fb }, { 13350, 0x5c41 }, { 13356, 0xffed }, { 13370, 0xffff }, { 13386, 0xffff }, { 13402, 0xffff }, { 13418, 0xffff }, { 13434, 0xffff }, { 13450, 0xffff }, { 13466, 0xffff }, { 13482, 0xffff }, { 13498, 0xffff }, { 13514, 0xffff }, /* 0x9c00 */ { 13530, 0xffff }, { 13546, 0xffff }, { 13562, 0xffff }, { 13578, 0xffff }, { 13594, 0xffff }, { 13610, 0xffff }, { 13626, 0xffff }, { 13642, 0x6fff }, { 13656, 0x9619 }, { 13663, 0x23c8 }, { 13669, 0x9400 }, { 13672, 0xc200 }, { 13675, 0x0307 }, { 13680, 0x0c06 }, { 13684, 0xfffb }, { 13699, 0xffff }, /* 0x9d00 */ { 13715, 0xffff }, { 13731, 0xffff }, { 13747, 0xffff }, { 13763, 0xffff }, { 13779, 0xffff }, { 13795, 0xffff }, { 13811, 0xffff }, { 13827, 0xffff }, { 13843, 0xffff }, { 13859, 0xffff }, { 13875, 0xffff }, { 13891, 0xffff }, { 13907, 0xffff }, { 13923, 0xffff }, { 13939, 0xffff }, { 13955, 0xffff }, /* 0x9e00 */ { 13971, 0xffff }, { 13987, 0x7fff }, { 14002, 0x4090 }, { 14005, 0x1811 }, { 14009, 0x2001 }, { 14011, 0xa25d }, { 14019, 0xc027 }, { 14025, 0x3ff4 }, { 14036, 0xf67b }, { 14048, 0x5ff3 }, { 14060, 0xffbf }, { 14075, 0x96ef }, { 14086, 0x1def }, { 14097, 0x46ed }, { 14106, 0x795a }, { 14115, 0xa5ff }, /* 0x9f00 */ { 14127, 0x97ff }, { 14140, 0xfd76 }, { 14152, 0x6ffa }, { 14164, 0x957f }, { 14175, 0xffef }, { 14190, 0xfffc }, { 14204, 0xffff }, { 14220, 0x7fff }, { 14235, 0xe006 }, { 14240, 0x71ff }, { 14252, 0x003e }, }; static const Summary16 gbkext_inv_uni2indx_pagef9[19] = { /* 0xf900 */ { 14257, 0x0000 }, { 14257, 0x0000 }, { 14257, 0x1000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0200 }, { 14259, 0x0000 }, { 14259, 0x0020 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0080 }, { 14261, 0x0002 }, /* 0xfa00 */ { 14262, 0xf000 }, { 14266, 0x811a }, { 14271, 0x039b }, }; static const Summary16 gbkext_inv_uni2indx_pagefe[31] = { /* 0xfe00 */ { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0001 }, { 14279, 0xfe00 }, { 14286, 0xfef7 }, { 14300, 0x0f7f }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, /* 0xff00 */ { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0014 }, }; static int gbkext_inv_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0200 && wc < 0x02e0) summary = &gbkext_inv_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &gbkext_inv_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2610) summary = &gbkext_inv_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &gbkext_inv_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x3200 && wc < 0x33e0) summary = &gbkext_inv_uni2indx_page32[(wc>>4)-0x320]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &gbkext_inv_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xf900 && wc < 0xfa30) summary = &gbkext_inv_uni2indx_pagef9[(wc>>4)-0xf90]; else if (wc >= 0xfe00 && wc < 0xfff0) summary = &gbkext_inv_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = gbkext_inv_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.1.06/src/libtiniconv/encdec/cp1258.h0000644000175000017500000002450213472116001015402 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1258 */ #include "flushwc.h" #include "vietcomb.h" static const unsigned char cp1258_comb_table[] = { 0xcc, 0xec, 0xde, 0xd2, 0xf2, }; /* The possible bases in viet_comp_table_data: 0x0041..0x0045, 0x0047..0x0049, 0x004B..0x0050, 0x0052..0x0057, 0x0059..0x005A, 0x0061..0x0065, 0x0067..0x0069, 0x006B..0x0070, 0x0072..0x0077, 0x0079..0x007A, 0x00A5, 0x00A8, 0x00C2, 0x00C5..0x00C7, 0x00CA, 0x00CF, 0x00D3..0x00D4, 0x00D6, 0x00D8, 0x00DA, 0x00DC, 0x00E2, 0x00E5..0x00E7, 0x00EA, 0x00EF, 0x00F3..0x00F4, 0x00F6, 0x00F8, 0x00FA, 0x00FC, 0x0102..0x0103, 0x01A0..0x01A1, 0x01AF..0x01B0. */ static const unsigned int cp1258_comp_bases[] = { 0x06fdfbbe, 0x06fdfbbe, 0x00000000, 0x00000120, 0x155884e4, 0x155884e4, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00018003 }; static const unsigned short cp1258_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, }; /* In the CP1258 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1258_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1258_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x0300 && wc < 0x0340) { /* See whether last_wc and wc can be combined. */ unsigned int k = 0; unsigned int i1, i2; switch (wc) { case 0x0300: k = 0; break; case 0x0301: k = 1; break; case 0x0303: k = 2; break; case 0x0309: k = 3; break; case 0x0323: k = 4; break; default: abort(); } i1 = viet_comp_table[k].idx; i2 = i1 + viet_comp_table[k].len-1; if (last_wc >= viet_comp_table_data[i1].base && last_wc <= viet_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == viet_comp_table_data[i].base) break; if (last_wc < viet_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == viet_comp_table_data[i].base) break; goto not_combining; } } } last_wc = viet_comp_table_data[i].composed; /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if (wc >= 0x0041 && wc <= 0x01b0 && ((cp1258_comp_bases[(wc - 0x0040) >> 5] >> (wc & 0x1f)) & 1)) { /* wc is a possible match in viet_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1258_flushwc normal_flushwc static const unsigned char cp1258_page00[88] = { 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ }; static const unsigned char cp1258_page01[104] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xd5, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xa8-0xaf */ 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ }; static const unsigned char cp1258_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1258_page03[40] = { 0xcc, 0xec, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp1258_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1258_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = wc; else if (wc >= 0x00c0 && wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else if (wc >= 0x0150 && wc < 0x01b8) c = cp1258_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1258_page02[wc-0x02c0]; else if (wc >= 0x0300 && wc < 0x0328) c = cp1258_page03[wc-0x0300]; else if (wc >= 0x0340 && wc < 0x0342) /* deprecated Vietnamese tone marks */ c = cp1258_page03[wc-0x0340]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1258_page20[wc-0x2010]; else if (wc == 0x20ab) c = 0xfe; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through viet_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(viet_decomp_table)/sizeof(viet_decomp_table[0])-1; if (wc >= viet_decomp_table[i1].composed && wc <= viet_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == viet_decomp_table[i].composed) break; if (wc < viet_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == viet_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = viet_decomp_table[i].base; /* wc is one of 0x0020, 0x0041..0x005a, 0x0061..0x007a, 0x00a5, 0x00a8, 0x00c2, 0x00c5..0x00c7, 0x00ca, 0x00cf, 0x00d3, 0x00d4, 0x00d6, 0x00d8, 0x00da, 0x00dc, 0x00e2, 0x00e5..0x00e7, 0x00ea, 0x00ef, 0x00f3, 0x00f4, 0x00f6, 0x00f8, 0x00fc, 0x0102, 0x0103, 0x01a0, 0x01a1, 0x01af, 0x01b0. */ if (wc < 0x0100) c = wc; else if (wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else c = cp1258_page01[wc-0x0150]; if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1258_comb_table[viet_decomp_table[i].comb1]; return 2; } } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/gbk.h0000644000175000017500000001120613472116001015220 00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ /* * GBK, as described in Ken Lunde's book, is an extension of GB 2312-1980 * (shifted by adding 0x8080 to the range 0xA1A1..0xFEFE, as used in EUC-CN). * It adds the following ranges: * * (part of GBK/1) 0xA2A1-0xA2AA Small Roman numerals * GBK/3 0x{81-A0}{40-7E,80-FE} 6080 new characters, all in Unicode * GBK/4 0x{AA-FE}{40-7E,80-A0} 8160 new characters, 8080 in Unicode * GBK/5 0x{A8-A9}{40-7E,80-A0} 166 new characters, 153 in Unicode * * Furthermore, all four tables I have looked at * - the CP936 table by Microsoft, found on ftp.unicode.org in 1999, * - the GBK table by Sun, investigated on a Solaris 2.7 machine, * - the GBK tables by CWEX, found in the Big5+ package, * - the GB18030 standard (second printing), * agree in the following extensions. (Ken Lunde must have overlooked these * differences between GB2312 and GBK. Also, the CWEX tables have additional * differences.) * * 1. Some characters in the GB2312 range are defined differently: * * code GB2312 GBK * 0xA1A4 0x30FB # KATAKANA MIDDLE DOT 0x00B7 # MIDDLE DOT * 0xA1AA 0x2015 # HORIZONTAL BAR 0x2014 # EM DASH * * 2. 19 characters added in the range 0xA6E0-0xA6F5. * * 3. 4 characters added in the range 0xA8BB-0xA8C0. * * CP936 as of 1999 was identical to GBK. However, since 1999, Microsoft has * added new mappings to CP936... */ #include "gbkext1.h" #include "gbkext2.h" #include "gbkext_inv.h" #include "cp936ext.h" static int gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); if (c >= 0xa1 && c <= 0xf7) { unsigned char c2 = s[1]; if (c == 0xa1) { if (c2 == 0xa4) { *pwc = 0x00b7; return 2; } if (c2 == 0xaa) { *pwc = 0x2014; return 2; } } if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; int ret; buf[0] = c-0x80; buf[1] = c2-0x80; ret = gb2312_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; buf[0] = c; buf[1] = c2; ret = cp936ext_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; } } if (c >= 0x81 && c <= 0xa0) return gbkext1_mbtowc(conv,pwc,s,2); if (c >= 0xa8 && c <= 0xfe) return gbkext2_mbtowc(conv,pwc,s,2); if (c == 0xa2) { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 <= 0xaa) { *pwc = 0x2170+(c2-0xa1); return 2; } } } return RET_ILSEQ; } static int gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; if (wc != 0x30fb && wc != 0x2015) { ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } } ret = gbkext_inv_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc >= 0x2170 && wc <= 0x2179) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa2; r[1] = 0xa1 + (wc-0x2170); return 2; } ret = cp936ext_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc == 0x00b7) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xa4; return 2; } if (wc == 0x2014) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xaa; return 2; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_10.h0000644000175000017500000001040413472116001016104 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-10 */ static const unsigned short iso8859_10_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, /* 0xb0 */ 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, }; static int iso8859_10_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_10_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_10_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0xd0, 0x00, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0xf0, 0x00, 0x00, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xa9, 0xb9, 0xa2, 0xb2, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xa4, 0xb4, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, /* 0x30-0x37 */ 0xff, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xaf, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, /* 0x60-0x67 */ 0xd7, 0xf7, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, /* 0x78-0x7f */ }; static int iso8859_10_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_10_page00[wc-0x00a0]; else if (wc == 0x2015) c = 0xbd; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/cp866.h0000644000175000017500000001207213472116001015325 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP866 */ static const unsigned short cp866_2uni[80] = { /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, }; static int cp866_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else if (c < 0xb0) *pwc = (ucs4_t) c + 0x0390; else *pwc = (ucs4_t) cp866_2uni[c-0xb0]; return 1; } static const unsigned char cp866_page00[24] = { 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ }; static const unsigned char cp866_page04[96] = { 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0xf4, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf5, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ }; static const unsigned char cp866_page22[8] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char cp866_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp866_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b8) c = cp866_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = cp866_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xfc; else if (wc >= 0x2218 && wc < 0x2220) c = cp866_page22[wc-0x2218]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp866_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_7.h0000644000175000017500000000766413472116001016050 00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-7 */ static const unsigned short iso8859_7_2uni[96] = { /* 0xa0 */ 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int iso8859_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_7_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_7_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char iso8859_7_page03[88] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char iso8859_7_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static int iso8859_7_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_7_page00[wc-0x00a0]; else if (wc >= 0x0378 && wc < 0x03d0) c = iso8859_7_page03[wc-0x0378]; else if (wc >= 0x2010 && wc < 0x2020) c = iso8859_7_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0xa4; else if (wc == 0x20af) c = 0xa5; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_1.h0000644000175000017500000000234213472116001016026 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-1 */ static int iso8859_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; *pwc = (ucs4_t) c; return 1; } static int iso8859_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0100) { *r = wc; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/ascii.h0000644000175000017500000000242213472116001015545 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ASCII */ static int ascii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static int ascii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080) { *r = (unsigned char)wc; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_9.h0000644000175000017500000000607613472116001016046 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-9 */ static const unsigned short iso8859_9_2uni[48] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int iso8859_9_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xd0) *pwc = (ucs4_t) iso8859_9_2uni[c-0xd0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_9_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_9_page01[72] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ }; static int iso8859_9_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00d0) { *r = wc; return 1; } else if (wc >= 0x00d0 && wc < 0x0100) c = iso8859_9_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0160) c = iso8859_9_page01[wc-0x0118]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/vietcomb.h0000644000175000017500000003023213472116001016265 00000000000000/* * Copyright (C) 2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* Combining characters used in Vietnamese encodings CP1258, TCVN. */ #ifndef _VIETCOMB_H #define _VIETCOMB_H /* Relevant combining characters: 0x0300, 0x0301, 0x0303, 0x0309, 0x0323. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } viet_comp_table_data[] = { #define viet_comp_table0300_idx 0 #define viet_comp_table0300_len 31 { 0x0041, 0x00C0 }, { 0x0045, 0x00C8 }, { 0x0049, 0x00CC }, { 0x004E, 0x01F8 }, { 0x004F, 0x00D2 }, { 0x0055, 0x00D9 }, { 0x0057, 0x1E80 }, { 0x0059, 0x1EF2 }, { 0x0061, 0x00E0 }, { 0x0065, 0x00E8 }, { 0x0069, 0x00EC }, { 0x006E, 0x01F9 }, { 0x006F, 0x00F2 }, { 0x0075, 0x00F9 }, { 0x0077, 0x1E81 }, { 0x0079, 0x1EF3 }, { 0x00A8, 0x1FED }, { 0x00C2, 0x1EA6 }, { 0x00CA, 0x1EC0 }, { 0x00D4, 0x1ED2 }, { 0x00DC, 0x01DB }, { 0x00E2, 0x1EA7 }, { 0x00EA, 0x1EC1 }, { 0x00F4, 0x1ED3 }, { 0x00FC, 0x01DC }, { 0x0102, 0x1EB0 }, { 0x0103, 0x1EB1 }, /*{ 0x0112, 0x1E14 },*/ /*{ 0x0113, 0x1E15 },*/ /*{ 0x014C, 0x1E50 },*/ /*{ 0x014D, 0x1E51 },*/ { 0x01A0, 0x1EDC }, { 0x01A1, 0x1EDD }, { 0x01AF, 0x1EEA }, { 0x01B0, 0x1EEB }, #define viet_comp_table0301_idx (viet_comp_table0300_idx+viet_comp_table0300_len) #define viet_comp_table0301_len 64 { 0x0041, 0x00C1 }, { 0x0043, 0x0106 }, { 0x0045, 0x00C9 }, { 0x0047, 0x01F4 }, { 0x0049, 0x00CD }, { 0x004B, 0x1E30 }, { 0x004C, 0x0139 }, { 0x004D, 0x1E3E }, { 0x004E, 0x0143 }, { 0x004F, 0x00D3 }, { 0x0050, 0x1E54 }, { 0x0052, 0x0154 }, { 0x0053, 0x015A }, { 0x0055, 0x00DA }, { 0x0057, 0x1E82 }, { 0x0059, 0x00DD }, { 0x005A, 0x0179 }, { 0x0061, 0x00E1 }, { 0x0063, 0x0107 }, { 0x0065, 0x00E9 }, { 0x0067, 0x01F5 }, { 0x0069, 0x00ED }, { 0x006B, 0x1E31 }, { 0x006C, 0x013A }, { 0x006D, 0x1E3F }, { 0x006E, 0x0144 }, { 0x006F, 0x00F3 }, { 0x0070, 0x1E55 }, { 0x0072, 0x0155 }, { 0x0073, 0x015B }, { 0x0075, 0x00FA }, { 0x0077, 0x1E83 }, { 0x0079, 0x00FD }, { 0x007A, 0x017A }, { 0x00A5, 0x0385 }, { 0x00A8, 0x1FEE }, { 0x00C2, 0x1EA4 }, { 0x00C5, 0x01FA }, { 0x00C6, 0x01FC }, { 0x00C7, 0x1E08 }, { 0x00CA, 0x1EBE }, { 0x00CF, 0x1E2E }, { 0x00D4, 0x1ED0 }, { 0x00D5, 0x1E4C }, { 0x00D8, 0x01FE }, { 0x00DC, 0x01D7 }, { 0x00E2, 0x1EA5 }, { 0x00E5, 0x01FB }, { 0x00E6, 0x01FD }, { 0x00E7, 0x1E09 }, { 0x00EA, 0x1EBF }, { 0x00EF, 0x1E2F }, { 0x00F4, 0x1ED1 }, { 0x00F5, 0x1E4D }, { 0x00F8, 0x01FF }, { 0x00FC, 0x01D8 }, { 0x0102, 0x1EAE }, { 0x0103, 0x1EAF }, /*{ 0x0112, 0x1E16 },*/ /*{ 0x0113, 0x1E17 },*/ /*{ 0x014C, 0x1E52 },*/ /*{ 0x014D, 0x1E53 },*/ { 0x0168, 0x1E78 }, { 0x0169, 0x1E79 }, { 0x01A0, 0x1EDA }, { 0x01A1, 0x1EDB }, { 0x01AF, 0x1EE8 }, { 0x01B0, 0x1EE9 }, #define viet_comp_table0303_idx (viet_comp_table0301_idx+viet_comp_table0301_len) #define viet_comp_table0303_len 34 { 0x0041, 0x00C3 }, { 0x0045, 0x1EBC }, { 0x0049, 0x0128 }, { 0x004E, 0x00D1 }, { 0x004F, 0x00D5 }, { 0x0055, 0x0168 }, { 0x0056, 0x1E7C }, { 0x0059, 0x1EF8 }, { 0x0061, 0x00E3 }, { 0x0065, 0x1EBD }, { 0x0069, 0x0129 }, { 0x006E, 0x00F1 }, { 0x006F, 0x00F5 }, { 0x0075, 0x0169 }, { 0x0076, 0x1E7D }, { 0x0079, 0x1EF9 }, { 0x00C2, 0x1EAA }, { 0x00CA, 0x1EC4 }, { 0x00D3, 0x1E4C }, { 0x00D4, 0x1ED6 }, { 0x00D6, 0x1E4E }, { 0x00DA, 0x1E78 }, { 0x00E2, 0x1EAB }, { 0x00EA, 0x1EC5 }, { 0x00F3, 0x1E4D }, { 0x00F4, 0x1ED7 }, { 0x00F6, 0x1E4F }, { 0x00FA, 0x1E79 }, { 0x0102, 0x1EB4 }, { 0x0103, 0x1EB5 }, { 0x01A0, 0x1EE0 }, { 0x01A1, 0x1EE1 }, { 0x01AF, 0x1EEE }, { 0x01B0, 0x1EEF }, #define viet_comp_table0309_idx (viet_comp_table0303_idx+viet_comp_table0303_len) #define viet_comp_table0309_len 24 { 0x0041, 0x1EA2 }, { 0x0045, 0x1EBA }, { 0x0049, 0x1EC8 }, { 0x004F, 0x1ECE }, { 0x0055, 0x1EE6 }, { 0x0059, 0x1EF6 }, { 0x0061, 0x1EA3 }, { 0x0065, 0x1EBB }, { 0x0069, 0x1EC9 }, { 0x006F, 0x1ECF }, { 0x0075, 0x1EE7 }, { 0x0079, 0x1EF7 }, { 0x00C2, 0x1EA8 }, { 0x00CA, 0x1EC2 }, { 0x00D4, 0x1ED4 }, { 0x00E2, 0x1EA9 }, { 0x00EA, 0x1EC3 }, { 0x00F4, 0x1ED5 }, { 0x0102, 0x1EB2 }, { 0x0103, 0x1EB3 }, { 0x01A0, 0x1EDE }, { 0x01A1, 0x1EDF }, { 0x01AF, 0x1EEC }, { 0x01B0, 0x1EED }, #define viet_comp_table0323_idx (viet_comp_table0309_idx+viet_comp_table0309_len) #define viet_comp_table0323_len 50 { 0x0041, 0x1EA0 }, { 0x0042, 0x1E04 }, { 0x0044, 0x1E0C }, { 0x0045, 0x1EB8 }, { 0x0048, 0x1E24 }, { 0x0049, 0x1ECA }, { 0x004B, 0x1E32 }, { 0x004C, 0x1E36 }, { 0x004D, 0x1E42 }, { 0x004E, 0x1E46 }, { 0x004F, 0x1ECC }, { 0x0052, 0x1E5A }, { 0x0053, 0x1E62 }, { 0x0054, 0x1E6C }, { 0x0055, 0x1EE4 }, { 0x0056, 0x1E7E }, { 0x0057, 0x1E88 }, { 0x0059, 0x1EF4 }, { 0x005A, 0x1E92 }, { 0x0061, 0x1EA1 }, { 0x0062, 0x1E05 }, { 0x0064, 0x1E0D }, { 0x0065, 0x1EB9 }, { 0x0068, 0x1E25 }, { 0x0069, 0x1ECB }, { 0x006B, 0x1E33 }, { 0x006C, 0x1E37 }, { 0x006D, 0x1E43 }, { 0x006E, 0x1E47 }, { 0x006F, 0x1ECD }, { 0x0072, 0x1E5B }, { 0x0073, 0x1E63 }, { 0x0074, 0x1E6D }, { 0x0075, 0x1EE5 }, { 0x0076, 0x1E7F }, { 0x0077, 0x1E89 }, { 0x0079, 0x1EF5 }, { 0x007A, 0x1E93 }, { 0x00C2, 0x1EAC }, { 0x00CA, 0x1EC6 }, { 0x00D4, 0x1ED8 }, { 0x00E2, 0x1EAD }, { 0x00EA, 0x1EC7 }, { 0x00F4, 0x1ED9 }, { 0x0102, 0x1EB6 }, { 0x0103, 0x1EB7 }, { 0x01A0, 0x1EE2 }, { 0x01A1, 0x1EE3 }, { 0x01AF, 0x1EF0 }, { 0x01B0, 0x1EF1 }, }; static const struct { unsigned int len; unsigned int idx; } viet_comp_table[] = { { viet_comp_table0300_len, viet_comp_table0300_idx }, { viet_comp_table0301_len, viet_comp_table0301_idx }, { viet_comp_table0303_len, viet_comp_table0303_idx }, { viet_comp_table0309_len, viet_comp_table0309_idx }, { viet_comp_table0323_len, viet_comp_table0323_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct viet_decomp { unsigned short composed; unsigned int base : 12; int comb1 : 4; }; static const struct viet_decomp viet_decomp_table[] = { { 0x00B4, 0x0020, 1 }, /* compatibility decomposition - for TCVN only */ { 0x00C0, 0x0041, 0 }, { 0x00C1, 0x0041, 1 }, { 0x00C3, 0x0041, 2 }, { 0x00C8, 0x0045, 0 }, { 0x00C9, 0x0045, 1 }, { 0x00CC, 0x0049, 0 }, { 0x00CD, 0x0049, 1 }, { 0x00D1, 0x004E, 2 }, { 0x00D2, 0x004F, 0 }, { 0x00D3, 0x004F, 1 }, { 0x00D5, 0x004F, 2 }, { 0x00D9, 0x0055, 0 }, { 0x00DA, 0x0055, 1 }, { 0x00DD, 0x0059, 1 }, { 0x00E0, 0x0061, 0 }, { 0x00E1, 0x0061, 1 }, { 0x00E3, 0x0061, 2 }, { 0x00E8, 0x0065, 0 }, { 0x00E9, 0x0065, 1 }, { 0x00EC, 0x0069, 0 }, { 0x00ED, 0x0069, 1 }, { 0x00F1, 0x006E, 2 }, { 0x00F2, 0x006F, 0 }, { 0x00F3, 0x006F, 1 }, { 0x00F5, 0x006F, 2 }, { 0x00F9, 0x0075, 0 }, { 0x00FA, 0x0075, 1 }, { 0x00FD, 0x0079, 1 }, { 0x0106, 0x0043, 1 }, { 0x0107, 0x0063, 1 }, { 0x0128, 0x0049, 2 }, { 0x0129, 0x0069, 2 }, { 0x0139, 0x004C, 1 }, { 0x013A, 0x006C, 1 }, { 0x0143, 0x004E, 1 }, { 0x0144, 0x006E, 1 }, { 0x0154, 0x0052, 1 }, { 0x0155, 0x0072, 1 }, { 0x015A, 0x0053, 1 }, { 0x015B, 0x0073, 1 }, { 0x0168, 0x0055, 2 }, { 0x0169, 0x0075, 2 }, { 0x0179, 0x005A, 1 }, { 0x017A, 0x007A, 1 }, { 0x01D7, 0x00DC, 1 }, { 0x01D8, 0x00FC, 1 }, { 0x01DB, 0x00DC, 0 }, { 0x01DC, 0x00FC, 0 }, { 0x01F4, 0x0047, 1 }, { 0x01F5, 0x0067, 1 }, { 0x01F8, 0x004E, 0 }, { 0x01F9, 0x006E, 0 }, { 0x01FA, 0x00C5, 1 }, { 0x01FB, 0x00E5, 1 }, { 0x01FC, 0x00C6, 1 }, { 0x01FD, 0x00E6, 1 }, { 0x01FE, 0x00D8, 1 }, { 0x01FF, 0x00F8, 1 }, { 0x02DC, 0x0020, 2 }, /* compatibility decomposition - for TCVN only */ { 0x0385, 0x00A5, 1 }, { 0x1E04, 0x0042, 4 }, { 0x1E05, 0x0062, 4 }, { 0x1E08, 0x00C7, 1 }, { 0x1E09, 0x00E7, 1 }, { 0x1E0C, 0x0044, 4 }, { 0x1E0D, 0x0064, 4 }, { 0x1E24, 0x0048, 4 }, { 0x1E25, 0x0068, 4 }, { 0x1E2E, 0x00CF, 1 }, { 0x1E2F, 0x00EF, 1 }, { 0x1E30, 0x004B, 1 }, { 0x1E31, 0x006B, 1 }, { 0x1E32, 0x004B, 4 }, { 0x1E33, 0x006B, 4 }, { 0x1E36, 0x004C, 4 }, { 0x1E37, 0x006C, 4 }, { 0x1E3E, 0x004D, 1 }, { 0x1E3F, 0x006D, 1 }, { 0x1E42, 0x004D, 4 }, { 0x1E43, 0x006D, 4 }, { 0x1E46, 0x004E, 4 }, { 0x1E47, 0x006E, 4 }, { 0x1E4C, 0x00D3, 2 }, /*{ 0x1E4C, 0x00D5, 1 },*/ /*{ 0x1E4C, 0x004F, 1, 2 },*/ { 0x1E4D, 0x00F3, 2 }, /*{ 0x1E4D, 0x00F5, 1 },*/ /*{ 0x1E4D, 0x006F, 1, 2 },*/ { 0x1E4E, 0x00D6, 2 }, { 0x1E4F, 0x00F6, 2 }, { 0x1E54, 0x0050, 1 }, { 0x1E55, 0x0070, 1 }, { 0x1E5A, 0x0052, 4 }, { 0x1E5B, 0x0072, 4 }, { 0x1E62, 0x0053, 4 }, { 0x1E63, 0x0073, 4 }, { 0x1E6C, 0x0054, 4 }, { 0x1E6D, 0x0074, 4 }, { 0x1E78, 0x00DA, 2 }, /*{ 0x1E78, 0x0168, 1 },*/ /*{ 0x1E78, 0x0055, 1, 2 },*/ { 0x1E79, 0x00FA, 2 }, /*{ 0x1E79, 0x0169, 1 },*/ /*{ 0x1E79, 0x0075, 1, 2 },*/ { 0x1E7C, 0x0056, 2 }, { 0x1E7D, 0x0076, 2 }, { 0x1E7E, 0x0056, 4 }, { 0x1E7F, 0x0076, 4 }, { 0x1E80, 0x0057, 0 }, { 0x1E81, 0x0077, 0 }, { 0x1E82, 0x0057, 1 }, { 0x1E83, 0x0077, 1 }, { 0x1E88, 0x0057, 4 }, { 0x1E89, 0x0077, 4 }, { 0x1E92, 0x005A, 4 }, { 0x1E93, 0x007A, 4 }, { 0x1EA0, 0x0041, 4 }, { 0x1EA1, 0x0061, 4 }, { 0x1EA2, 0x0041, 3 }, { 0x1EA3, 0x0061, 3 }, { 0x1EA4, 0x00C2, 1 }, { 0x1EA5, 0x00E2, 1 }, { 0x1EA6, 0x00C2, 0 }, { 0x1EA7, 0x00E2, 0 }, { 0x1EA8, 0x00C2, 3 }, { 0x1EA9, 0x00E2, 3 }, { 0x1EAA, 0x00C2, 2 }, { 0x1EAB, 0x00E2, 2 }, { 0x1EAC, 0x00C2, 4 }, { 0x1EAD, 0x00E2, 4 }, { 0x1EAE, 0x0102, 1 }, { 0x1EAF, 0x0103, 1 }, { 0x1EB0, 0x0102, 0 }, { 0x1EB1, 0x0103, 0 }, { 0x1EB2, 0x0102, 3 }, { 0x1EB3, 0x0103, 3 }, { 0x1EB4, 0x0102, 2 }, { 0x1EB5, 0x0103, 2 }, { 0x1EB6, 0x0102, 4 }, { 0x1EB7, 0x0103, 4 }, { 0x1EB8, 0x0045, 4 }, { 0x1EB9, 0x0065, 4 }, { 0x1EBA, 0x0045, 3 }, { 0x1EBB, 0x0065, 3 }, { 0x1EBC, 0x0045, 2 }, { 0x1EBD, 0x0065, 2 }, { 0x1EBE, 0x00CA, 1 }, { 0x1EBF, 0x00EA, 1 }, { 0x1EC0, 0x00CA, 0 }, { 0x1EC1, 0x00EA, 0 }, { 0x1EC2, 0x00CA, 3 }, { 0x1EC3, 0x00EA, 3 }, { 0x1EC4, 0x00CA, 2 }, { 0x1EC5, 0x00EA, 2 }, { 0x1EC6, 0x00CA, 4 }, { 0x1EC7, 0x00EA, 4 }, { 0x1EC8, 0x0049, 3 }, { 0x1EC9, 0x0069, 3 }, { 0x1ECA, 0x0049, 4 }, { 0x1ECB, 0x0069, 4 }, { 0x1ECC, 0x004F, 4 }, { 0x1ECD, 0x006F, 4 }, { 0x1ECE, 0x004F, 3 }, { 0x1ECF, 0x006F, 3 }, { 0x1ED0, 0x00D4, 1 }, { 0x1ED1, 0x00F4, 1 }, { 0x1ED2, 0x00D4, 0 }, { 0x1ED3, 0x00F4, 0 }, { 0x1ED4, 0x00D4, 3 }, { 0x1ED5, 0x00F4, 3 }, { 0x1ED6, 0x00D4, 2 }, { 0x1ED7, 0x00F4, 2 }, { 0x1ED8, 0x00D4, 4 }, { 0x1ED9, 0x00F4, 4 }, { 0x1EDA, 0x01A0, 1 }, { 0x1EDB, 0x01A1, 1 }, { 0x1EDC, 0x01A0, 0 }, { 0x1EDD, 0x01A1, 0 }, { 0x1EDE, 0x01A0, 3 }, { 0x1EDF, 0x01A1, 3 }, { 0x1EE0, 0x01A0, 2 }, { 0x1EE1, 0x01A1, 2 }, { 0x1EE2, 0x01A0, 4 }, { 0x1EE3, 0x01A1, 4 }, { 0x1EE4, 0x0055, 4 }, { 0x1EE5, 0x0075, 4 }, { 0x1EE6, 0x0055, 3 }, { 0x1EE7, 0x0075, 3 }, { 0x1EE8, 0x01AF, 1 }, { 0x1EE9, 0x01B0, 1 }, { 0x1EEA, 0x01AF, 0 }, { 0x1EEB, 0x01B0, 0 }, { 0x1EEC, 0x01AF, 3 }, { 0x1EED, 0x01B0, 3 }, { 0x1EEE, 0x01AF, 2 }, { 0x1EEF, 0x01B0, 2 }, { 0x1EF0, 0x01AF, 4 }, { 0x1EF1, 0x01B0, 4 }, { 0x1EF2, 0x0059, 0 }, { 0x1EF3, 0x0079, 0 }, { 0x1EF4, 0x0059, 4 }, { 0x1EF5, 0x0079, 4 }, { 0x1EF6, 0x0059, 3 }, { 0x1EF7, 0x0079, 3 }, { 0x1EF8, 0x0059, 2 }, { 0x1EF9, 0x0079, 2 }, { 0x1FED, 0x00A8, 0 }, { 0x1FEE, 0x00A8, 1 }, }; #endif /* _VIETCOMB_H */ fldigi-4.1.06/src/libtiniconv/encdec/iso8859_16.h0000644000175000017500000001122213472116001016111 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-16 */ static const unsigned short iso8859_16_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, }; static int iso8859_16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_16_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_16_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0x00, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0x00, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xa2, 0xc5, 0xe5, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0xac, 0xae, 0xaf, 0xbf, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_16_page02[8] = { 0xaa, 0xba, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char iso8859_16_page20[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_16_page00[wc-0x00a0]; else if (wc >= 0x0218 && wc < 0x0220) c = iso8859_16_page02[wc-0x0218]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_16_page20[wc-0x2018]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/koi8_r.h0000644000175000017500000001523613472116001015657 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-R */ /* Specification: RFC 1489 */ static const unsigned short koi8_r_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_r_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_r_2uni[c-0x80]; return 1; } static const unsigned char koi8_r_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_r_page04[88] = { 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static const unsigned char koi8_r_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_r_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_r_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_r_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_r_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0458) c = koi8_r_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_r_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_r_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_r_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/cp1252.h0000644000175000017500000000702313472116001015373 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1252 */ static const unsigned short cp1252_2uni[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0x017d, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0x017e, 0x0178, }; static int cp1252_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80 || c >= 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1252_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1252_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1252_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1252_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1252_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0198) c = cp1252_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1252_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1252_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso2022_jp.h0000644000175000017500000001222013472116001016243 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-JP */ /* Specification: RFC 1468 */ #define ESC 0x1b /* * The state can be one of the following values. */ #define STATE_ASCII 0 #define STATE_JISX0201ROMAN 1 #define STATE_JISX0208 2 static int iso2022_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+3) goto none; if (s[1] == '(') { if (s[2] == 'B') { state = STATE_ASCII; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'J') { state = STATE_JISX0201ROMAN; s += 3; count += 3; if (n < count+1) goto none; continue; } return RET_ILSEQ; } if (s[1] == '$') { if (s[2] == '@' || s[2] == 'B') { /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ state = STATE_JISX0208; s += 3; count += 3; if (n < count+1) goto none; continue; } return RET_ILSEQ; } return RET_ILSEQ; } break; } switch (state) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 1) abort(); conv->istate = state; return count+1; } else return RET_ILSEQ; case STATE_JISX0201ROMAN: if (c < 0x80) { int ret = jisx0201_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 1) abort(); conv->istate = state; return count+1; } else return RET_ILSEQ; case STATE_JISX0208: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0208_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 2) abort(); conv->istate = state; return count+2; } else return RET_ILSEQ; default: abort(); } none: conv->istate = state; return RET_TOOFEW(count); } static int iso2022_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { conv_state_t state = conv->ostate; unsigned char buf[2]; int ret; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_ASCII ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; r += 3; state = STATE_ASCII; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0201-1976 Roman. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_JISX0201ROMAN ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0201ROMAN) { r[0] = ESC; r[1] = '('; r[2] = 'J'; r += 3; state = STATE_JISX0201ROMAN; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state == STATE_JISX0208 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0208) { r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; state = STATE_JISX0208; } r[0] = buf[0]; r[1] = buf[1]; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_jp_reset (conv_t conv, unsigned char *r, int n) { conv_state_t state = conv->ostate; if (state != STATE_ASCII) { if (n < 3) return RET_TOOSMALL; r[0] = ESC; r[1] = '('; r[2] = 'B'; /* conv->ostate = 0; will be done by the caller */ return 3; } else return 0; } #undef STATE_JISX0208 #undef STATE_JISX0201ROMAN #undef STATE_ASCII fldigi-4.1.06/src/libtiniconv/encdec/iso8859_8.h0000644000175000017500000000754713472116001016051 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-8 */ static const unsigned short iso8859_8_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd, /* 0xc0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xd0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; static int iso8859_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) { unsigned short wc = iso8859_8_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static const unsigned char iso8859_8_page00[88] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char iso8859_8_page05[32] = { 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char iso8859_8_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x10-0x17 */ }; static int iso8859_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = iso8859_8_page00[wc-0x00a0]; else if (wc >= 0x05d0 && wc < 0x05f0) c = iso8859_8_page05[wc-0x05d0]; else if (wc >= 0x2008 && wc < 0x2018) c = iso8859_8_page20[wc-0x2008]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_11.h0000644000175000017500000000276013472116001016113 00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-11 */ static int iso8859_11_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa1) { *pwc = (ucs4_t) c; return 1; } else if (c <= 0xfb && !(c >= 0xdb && c <= 0xde)) { *pwc = (ucs4_t) (c + 0x0d60); return 1; } return RET_ILSEQ; } static int iso8859_11_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x00a1) { *r = wc; return 1; } else if (wc >= 0x0e01 && wc <= 0x0e5b && !(wc >= 0x0e3b && wc <= 0x0e3e)) { *r = wc-0x0d60; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/utf8.h0000644000175000017500000001002013472116001015334 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-8 */ /* Specification: RFC 3629 */ static int utf8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = s[0]; if (c < 0x80) { *pwc = c; return 1; } else if (c < 0xc2) { return RET_ILSEQ; } else if (c < 0xe0) { if (n < 2) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40)) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x1f) << 6) | (ucs4_t) (s[1] ^ 0x80); return 2; } else if (c < 0xf0) { if (n < 3) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x0f) << 12) | ((ucs4_t) (s[1] ^ 0x80) << 6) | (ucs4_t) (s[2] ^ 0x80); return 3; } else if (c < 0xf8 && sizeof(ucs4_t)*8 >= 32) { if (n < 4) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x07) << 18) | ((ucs4_t) (s[1] ^ 0x80) << 12) | ((ucs4_t) (s[2] ^ 0x80) << 6) | (ucs4_t) (s[3] ^ 0x80); return 4; } else if (c < 0xfc && sizeof(ucs4_t)*8 >= 32) { if (n < 5) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (c >= 0xf9 || s[1] >= 0x88))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x03) << 24) | ((ucs4_t) (s[1] ^ 0x80) << 18) | ((ucs4_t) (s[2] ^ 0x80) << 12) | ((ucs4_t) (s[3] ^ 0x80) << 6) | (ucs4_t) (s[4] ^ 0x80); return 5; } else if (c < 0xfe && sizeof(ucs4_t)*8 >= 32) { if (n < 6) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (s[5] ^ 0x80) < 0x40 && (c >= 0xfd || s[1] >= 0x84))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x01) << 30) | ((ucs4_t) (s[1] ^ 0x80) << 24) | ((ucs4_t) (s[2] ^ 0x80) << 18) | ((ucs4_t) (s[3] ^ 0x80) << 12) | ((ucs4_t) (s[4] ^ 0x80) << 6) | (ucs4_t) (s[5] ^ 0x80); return 6; } else return RET_ILSEQ; } static int utf8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) /* n == 0 is acceptable */ { int count; if (wc < 0x80) count = 1; else if (wc < 0x800) count = 2; else if (wc < 0x10000) count = 3; else if (wc < 0x200000) count = 4; else if (wc < 0x4000000) count = 5; else if (wc <= 0x7fffffff) count = 6; else return RET_ILUNI; if (n < count) return RET_TOOSMALL; switch (count) { /* note: code falls through cases! */ case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000; case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000; case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000; case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800; case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0; case 1: r[0] = wc; } return count; } fldigi-4.1.06/src/libtiniconv/encdec/cp1250.h0000644000175000017500000001305713472116001015375 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1250 */ static const unsigned short cp1250_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, /* 0xa0 */ 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int cp1250_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1250_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1250_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa5, 0xb9, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xbc, 0xbe, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0x8c, 0x9c, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0x8a, 0x9a, 0xde, 0xfe, 0x8d, 0x9d, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8f, 0x9f, 0xaf, 0xbf, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1250_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1250_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1250_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1250_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1250_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1250_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/gbkext1.h0000644000175000017500000014603613472116001016034 00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/3 extensions */ static const unsigned short gbkext1_2uni_page81[6080] = { /* 0x81 */ 0x4e02, 0x4e04, 0x4e05, 0x4e06, 0x4e0f, 0x4e12, 0x4e17, 0x4e1f, 0x4e20, 0x4e21, 0x4e23, 0x4e26, 0x4e29, 0x4e2e, 0x4e2f, 0x4e31, 0x4e33, 0x4e35, 0x4e37, 0x4e3c, 0x4e40, 0x4e41, 0x4e42, 0x4e44, 0x4e46, 0x4e4a, 0x4e51, 0x4e55, 0x4e57, 0x4e5a, 0x4e5b, 0x4e62, 0x4e63, 0x4e64, 0x4e65, 0x4e67, 0x4e68, 0x4e6a, 0x4e6b, 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, 0x4e72, 0x4e74, 0x4e75, 0x4e76, 0x4e77, 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7f, 0x4e80, 0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e87, 0x4e8a, 0x4e90, 0x4e96, 0x4e97, 0x4e99, 0x4e9c, 0x4e9d, 0x4e9e, 0x4ea3, 0x4eaa, 0x4eaf, 0x4eb0, 0x4eb1, 0x4eb4, 0x4eb6, 0x4eb7, 0x4eb8, 0x4eb9, 0x4ebc, 0x4ebd, 0x4ebe, 0x4ec8, 0x4ecc, 0x4ecf, 0x4ed0, 0x4ed2, 0x4eda, 0x4edb, 0x4edc, 0x4ee0, 0x4ee2, 0x4ee6, 0x4ee7, 0x4ee9, 0x4eed, 0x4eee, 0x4eef, 0x4ef1, 0x4ef4, 0x4ef8, 0x4ef9, 0x4efa, 0x4efc, 0x4efe, 0x4f00, 0x4f02, 0x4f03, 0x4f04, 0x4f05, 0x4f06, 0x4f07, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, 0x4f13, 0x4f14, 0x4f15, 0x4f16, 0x4f1c, 0x4f1d, 0x4f21, 0x4f23, 0x4f28, 0x4f29, 0x4f2c, 0x4f2d, 0x4f2e, 0x4f31, 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f44, 0x4f45, 0x4f47, 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f61, 0x4f62, 0x4f66, 0x4f68, 0x4f6a, 0x4f6b, 0x4f6d, 0x4f6e, 0x4f71, 0x4f72, 0x4f75, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7d, 0x4f80, 0x4f81, 0x4f82, 0x4f85, 0x4f86, 0x4f87, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92, 0x4f93, 0x4f95, 0x4f96, 0x4f98, 0x4f99, 0x4f9a, 0x4f9c, 0x4f9e, 0x4f9f, 0x4fa1, 0x4fa2, /* 0x82 */ 0x4fa4, 0x4fab, 0x4fad, 0x4fb0, 0x4fb1, 0x4fb2, 0x4fb3, 0x4fb4, 0x4fb6, 0x4fb7, 0x4fb8, 0x4fb9, 0x4fba, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc2, 0x4fc6, 0x4fc7, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fd2, 0x4fd3, 0x4fd4, 0x4fd5, 0x4fd6, 0x4fd9, 0x4fdb, 0x4fe0, 0x4fe2, 0x4fe4, 0x4fe5, 0x4fe7, 0x4feb, 0x4fec, 0x4ff0, 0x4ff2, 0x4ff4, 0x4ff5, 0x4ff6, 0x4ff7, 0x4ff9, 0x4ffb, 0x4ffc, 0x4ffd, 0x4fff, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500a, 0x500b, 0x500e, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501b, 0x501d, 0x501e, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502b, 0x502f, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503b, 0x503d, 0x503f, 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504a, 0x504b, 0x504d, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505b, 0x505d, 0x505e, 0x505f, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506a, 0x506b, 0x506d, 0x506e, 0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5078, 0x5079, 0x507a, 0x507c, 0x507d, 0x5081, 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508a, 0x508b, 0x508c, 0x508e, 0x508f, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509a, 0x509b, 0x509c, 0x509d, 0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50a4, 0x50a6, 0x50aa, 0x50ab, 0x50ad, 0x50ae, 0x50af, 0x50b0, 0x50b1, 0x50b3, 0x50b4, 0x50b5, 0x50b6, 0x50b7, 0x50b8, 0x50b9, 0x50bc, /* 0x83 */ 0x50bd, 0x50be, 0x50bf, 0x50c0, 0x50c1, 0x50c2, 0x50c3, 0x50c4, 0x50c5, 0x50c6, 0x50c7, 0x50c8, 0x50c9, 0x50ca, 0x50cb, 0x50cc, 0x50cd, 0x50ce, 0x50d0, 0x50d1, 0x50d2, 0x50d3, 0x50d4, 0x50d5, 0x50d7, 0x50d8, 0x50d9, 0x50db, 0x50dc, 0x50dd, 0x50de, 0x50df, 0x50e0, 0x50e1, 0x50e2, 0x50e3, 0x50e4, 0x50e5, 0x50e8, 0x50e9, 0x50ea, 0x50eb, 0x50ef, 0x50f0, 0x50f1, 0x50f2, 0x50f4, 0x50f6, 0x50f7, 0x50f8, 0x50f9, 0x50fa, 0x50fc, 0x50fd, 0x50fe, 0x50ff, 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0x5109, 0x510a, 0x510c, 0x510d, 0x510e, 0x510f, 0x5110, 0x5111, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511a, 0x511b, 0x511c, 0x511d, 0x511e, 0x511f, 0x5120, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512a, 0x512b, 0x512c, 0x512d, 0x512e, 0x512f, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513a, 0x513b, 0x513c, 0x513d, 0x513e, 0x5142, 0x5147, 0x514a, 0x514c, 0x514e, 0x514f, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515b, 0x515d, 0x515e, 0x515f, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516a, 0x516f, 0x5172, 0x517a, 0x517e, 0x517f, 0x5183, 0x5184, 0x5186, 0x5187, 0x518a, 0x518b, 0x518e, 0x518f, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519a, 0x519d, 0x519e, 0x519f, 0x51a1, 0x51a3, 0x51a6, 0x51a7, 0x51a8, 0x51a9, 0x51aa, 0x51ad, 0x51ae, 0x51b4, 0x51b8, 0x51b9, 0x51ba, 0x51be, 0x51bf, 0x51c1, 0x51c2, 0x51c3, 0x51c5, 0x51c8, 0x51ca, 0x51cd, 0x51ce, 0x51d0, 0x51d2, 0x51d3, 0x51d4, 0x51d5, 0x51d6, 0x51d7, /* 0x84 */ 0x51d8, 0x51d9, 0x51da, 0x51dc, 0x51de, 0x51df, 0x51e2, 0x51e3, 0x51e5, 0x51e6, 0x51e7, 0x51e8, 0x51e9, 0x51ea, 0x51ec, 0x51ee, 0x51f1, 0x51f2, 0x51f4, 0x51f7, 0x51fe, 0x5204, 0x5205, 0x5209, 0x520b, 0x520c, 0x520f, 0x5210, 0x5213, 0x5214, 0x5215, 0x521c, 0x521e, 0x521f, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, 0x522a, 0x522c, 0x522f, 0x5231, 0x5232, 0x5234, 0x5235, 0x523c, 0x523e, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524b, 0x524e, 0x524f, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0x5259, 0x525a, 0x525b, 0x525d, 0x525f, 0x5260, 0x5262, 0x5263, 0x5264, 0x5266, 0x5268, 0x526b, 0x526c, 0x526d, 0x526e, 0x5270, 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527a, 0x527b, 0x527c, 0x527e, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, 0x5289, 0x528a, 0x528b, 0x528c, 0x528d, 0x528e, 0x528f, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529a, 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52ae, 0x52af, 0x52b0, 0x52b4, 0x52b5, 0x52b6, 0x52b7, 0x52b8, 0x52b9, 0x52ba, 0x52bb, 0x52bc, 0x52bd, 0x52c0, 0x52c1, 0x52c2, 0x52c4, 0x52c5, 0x52c6, 0x52c8, 0x52ca, 0x52cc, 0x52cd, 0x52ce, 0x52cf, 0x52d1, 0x52d3, 0x52d4, 0x52d5, 0x52d7, 0x52d9, 0x52da, 0x52db, 0x52dc, 0x52dd, 0x52de, 0x52e0, 0x52e1, 0x52e2, 0x52e3, 0x52e5, 0x52e6, 0x52e7, 0x52e8, 0x52e9, 0x52ea, 0x52eb, 0x52ec, 0x52ed, 0x52ee, 0x52ef, 0x52f1, 0x52f2, 0x52f3, 0x52f4, 0x52f5, 0x52f6, 0x52f7, 0x52f8, 0x52fb, 0x52fc, 0x52fd, 0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530a, 0x530b, 0x530c, 0x530e, /* 0x85 */ 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531b, 0x531c, 0x531e, 0x531f, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x533c, 0x533d, 0x5340, 0x5342, 0x5344, 0x5346, 0x534b, 0x534c, 0x534d, 0x5350, 0x5354, 0x5358, 0x5359, 0x535b, 0x535d, 0x5365, 0x5368, 0x536a, 0x536c, 0x536d, 0x5372, 0x5376, 0x5379, 0x537b, 0x537c, 0x537d, 0x537e, 0x5380, 0x5381, 0x5383, 0x5387, 0x5388, 0x538a, 0x538e, 0x538f, 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539b, 0x539c, 0x539e, 0x53a0, 0x53a1, 0x53a4, 0x53a7, 0x53aa, 0x53ab, 0x53ac, 0x53ad, 0x53af, 0x53b0, 0x53b1, 0x53b2, 0x53b3, 0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53b9, 0x53ba, 0x53bc, 0x53bd, 0x53be, 0x53c0, 0x53c3, 0x53c4, 0x53c5, 0x53c6, 0x53c7, 0x53ce, 0x53cf, 0x53d0, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dc, 0x53dd, 0x53de, 0x53e1, 0x53e2, 0x53e7, 0x53f4, 0x53fa, 0x53fe, 0x53ff, 0x5400, 0x5402, 0x5405, 0x5407, 0x540b, 0x5414, 0x5418, 0x5419, 0x541a, 0x541c, 0x5422, 0x5424, 0x5425, 0x542a, 0x5430, 0x5433, 0x5436, 0x5437, 0x543a, 0x543d, 0x543f, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449, 0x544c, 0x544d, 0x544e, 0x544f, 0x5451, 0x545a, 0x545d, 0x545e, 0x545f, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546a, 0x546b, 0x546c, 0x546d, 0x546e, 0x546f, 0x5470, 0x5474, 0x5479, 0x547a, 0x547e, 0x547f, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488, 0x5489, 0x548a, 0x548d, 0x5491, 0x5493, 0x5497, 0x5498, 0x549c, 0x549e, 0x549f, 0x54a0, 0x54a1, /* 0x86 */ 0x54a2, 0x54a5, 0x54ae, 0x54b0, 0x54b2, 0x54b5, 0x54b6, 0x54b7, 0x54b9, 0x54ba, 0x54bc, 0x54be, 0x54c3, 0x54c5, 0x54ca, 0x54cb, 0x54d6, 0x54d8, 0x54db, 0x54e0, 0x54e1, 0x54e2, 0x54e3, 0x54e4, 0x54eb, 0x54ec, 0x54ef, 0x54f0, 0x54f1, 0x54f4, 0x54f5, 0x54f6, 0x54f7, 0x54f8, 0x54f9, 0x54fb, 0x54fe, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, 0x5508, 0x550a, 0x550b, 0x550c, 0x550d, 0x550e, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551a, 0x551c, 0x551d, 0x551e, 0x551f, 0x5521, 0x5525, 0x5526, 0x5528, 0x5529, 0x552b, 0x552d, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553a, 0x553b, 0x553d, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5551, 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555a, 0x555b, 0x555d, 0x555e, 0x555f, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556b, 0x556f, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557a, 0x557d, 0x557f, 0x5585, 0x5586, 0x558c, 0x558d, 0x558e, 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559a, 0x559b, 0x559e, 0x55a0, 0x55a1, 0x55a2, 0x55a3, 0x55a4, 0x55a5, 0x55a6, 0x55a8, 0x55a9, 0x55aa, 0x55ab, 0x55ac, 0x55ad, 0x55ae, 0x55af, 0x55b0, 0x55b2, 0x55b4, 0x55b6, 0x55b8, 0x55ba, 0x55bc, 0x55bf, 0x55c0, 0x55c1, 0x55c2, 0x55c3, 0x55c6, 0x55c7, 0x55c8, 0x55ca, 0x55cb, 0x55ce, 0x55cf, 0x55d0, 0x55d5, 0x55d7, 0x55d8, 0x55d9, 0x55da, 0x55db, 0x55de, 0x55e0, 0x55e2, 0x55e7, 0x55e9, 0x55ed, 0x55ee, 0x55f0, 0x55f1, 0x55f4, 0x55f6, 0x55f8, 0x55f9, 0x55fa, 0x55fb, 0x55fc, 0x55ff, 0x5602, 0x5603, 0x5604, 0x5605, /* 0x87 */ 0x5606, 0x5607, 0x560a, 0x560b, 0x560d, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561a, 0x561c, 0x561d, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, 0x562a, 0x562b, 0x562e, 0x562f, 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563a, 0x563c, 0x563d, 0x563e, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564a, 0x564b, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565a, 0x565b, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5663, 0x5665, 0x5666, 0x5667, 0x566d, 0x566e, 0x566f, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567a, 0x567d, 0x567e, 0x567f, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x5690, 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569a, 0x569b, 0x569c, 0x569d, 0x569e, 0x569f, 0x56a0, 0x56a1, 0x56a2, 0x56a4, 0x56a5, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56aa, 0x56ab, 0x56ac, 0x56ad, 0x56ae, 0x56b0, 0x56b1, 0x56b2, 0x56b3, 0x56b4, 0x56b5, 0x56b6, 0x56b8, 0x56b9, 0x56ba, 0x56bb, 0x56bd, 0x56be, 0x56bf, 0x56c0, 0x56c1, 0x56c2, 0x56c3, 0x56c4, 0x56c5, 0x56c6, 0x56c7, 0x56c8, 0x56c9, 0x56cb, 0x56cc, 0x56cd, 0x56ce, 0x56cf, 0x56d0, 0x56d1, 0x56d2, 0x56d3, 0x56d5, 0x56d6, 0x56d8, 0x56d9, 0x56dc, 0x56e3, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56e9, 0x56ea, 0x56ec, 0x56ee, 0x56ef, 0x56f2, 0x56f3, 0x56f6, 0x56f7, 0x56f8, 0x56fb, 0x56fc, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, 0x570b, 0x570c, 0x570d, 0x570e, 0x570f, 0x5710, 0x5711, /* 0x88 */ 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, 0x571a, 0x571b, 0x571d, 0x571e, 0x5720, 0x5721, 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572b, 0x5731, 0x5732, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573c, 0x573d, 0x573f, 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574b, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, 0x5767, 0x576c, 0x576e, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, 0x5778, 0x5779, 0x577a, 0x577d, 0x577e, 0x577f, 0x5780, 0x5781, 0x5787, 0x5788, 0x5789, 0x578a, 0x578d, 0x578e, 0x578f, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a5, 0x57a8, 0x57aa, 0x57ac, 0x57af, 0x57b0, 0x57b1, 0x57b3, 0x57b5, 0x57b6, 0x57b7, 0x57b9, 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x57be, 0x57bf, 0x57c0, 0x57c1, 0x57c4, 0x57c5, 0x57c6, 0x57c7, 0x57c8, 0x57c9, 0x57ca, 0x57cc, 0x57cd, 0x57d0, 0x57d1, 0x57d3, 0x57d6, 0x57d7, 0x57db, 0x57dc, 0x57de, 0x57e1, 0x57e2, 0x57e3, 0x57e5, 0x57e6, 0x57e7, 0x57e8, 0x57e9, 0x57ea, 0x57eb, 0x57ec, 0x57ee, 0x57f0, 0x57f1, 0x57f2, 0x57f3, 0x57f5, 0x57f6, 0x57f7, 0x57fb, 0x57fc, 0x57fe, 0x57ff, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580a, 0x580c, 0x580e, 0x580f, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817, 0x5818, 0x581a, 0x581b, 0x581c, 0x581d, 0x581f, 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582b, 0x582c, 0x582d, 0x582e, 0x582f, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, 0x5837, 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, /* 0x89 */ 0x583e, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584e, 0x584f, 0x5850, 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5866, 0x5867, 0x5868, 0x5869, 0x586a, 0x586d, 0x586e, 0x586f, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587f, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888, 0x588a, 0x588b, 0x588c, 0x588d, 0x588e, 0x588f, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x589b, 0x589c, 0x589d, 0x58a0, 0x58a1, 0x58a2, 0x58a3, 0x58a4, 0x58a5, 0x58a6, 0x58a7, 0x58aa, 0x58ab, 0x58ac, 0x58ad, 0x58ae, 0x58af, 0x58b0, 0x58b1, 0x58b2, 0x58b3, 0x58b4, 0x58b5, 0x58b6, 0x58b7, 0x58b8, 0x58b9, 0x58ba, 0x58bb, 0x58bd, 0x58be, 0x58bf, 0x58c0, 0x58c2, 0x58c3, 0x58c4, 0x58c6, 0x58c7, 0x58c8, 0x58c9, 0x58ca, 0x58cb, 0x58cc, 0x58cd, 0x58ce, 0x58cf, 0x58d0, 0x58d2, 0x58d3, 0x58d4, 0x58d6, 0x58d7, 0x58d8, 0x58d9, 0x58da, 0x58db, 0x58dc, 0x58dd, 0x58de, 0x58df, 0x58e0, 0x58e1, 0x58e2, 0x58e3, 0x58e5, 0x58e6, 0x58e7, 0x58e8, 0x58e9, 0x58ea, 0x58ed, 0x58ef, 0x58f1, 0x58f2, 0x58f4, 0x58f5, 0x58f7, 0x58f8, 0x58fa, 0x58fb, 0x58fc, 0x58fd, 0x58fe, 0x58ff, 0x5900, 0x5901, 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590a, 0x590b, 0x590c, 0x590e, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591b, 0x591d, 0x591e, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592c, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593b, /* 0x8a */ 0x593d, 0x593e, 0x593f, 0x5940, 0x5943, 0x5945, 0x5946, 0x594a, 0x594c, 0x594d, 0x5950, 0x5952, 0x5953, 0x5959, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597a, 0x597b, 0x597c, 0x597e, 0x597f, 0x5980, 0x5985, 0x5989, 0x598b, 0x598c, 0x598e, 0x598f, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599a, 0x599b, 0x599c, 0x599d, 0x599f, 0x59a0, 0x59a1, 0x59a2, 0x59a6, 0x59a7, 0x59ac, 0x59ad, 0x59b0, 0x59b1, 0x59b3, 0x59b4, 0x59b5, 0x59b6, 0x59b7, 0x59b8, 0x59ba, 0x59bc, 0x59bd, 0x59bf, 0x59c0, 0x59c1, 0x59c2, 0x59c3, 0x59c4, 0x59c5, 0x59c7, 0x59c8, 0x59c9, 0x59cc, 0x59cd, 0x59ce, 0x59cf, 0x59d5, 0x59d6, 0x59d9, 0x59db, 0x59de, 0x59df, 0x59e0, 0x59e1, 0x59e2, 0x59e4, 0x59e6, 0x59e7, 0x59e9, 0x59ea, 0x59eb, 0x59ed, 0x59ee, 0x59ef, 0x59f0, 0x59f1, 0x59f2, 0x59f3, 0x59f4, 0x59f5, 0x59f6, 0x59f7, 0x59f8, 0x59fa, 0x59fc, 0x59fd, 0x59fe, 0x5a00, 0x5a02, 0x5a0a, 0x5a0b, 0x5a0d, 0x5a0e, 0x5a0f, 0x5a10, 0x5a12, 0x5a14, 0x5a15, 0x5a16, 0x5a17, 0x5a19, 0x5a1a, 0x5a1b, 0x5a1d, 0x5a1e, 0x5a21, 0x5a22, 0x5a24, 0x5a26, 0x5a27, 0x5a28, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, 0x5a30, 0x5a33, 0x5a35, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, 0x5a3b, 0x5a3d, 0x5a3e, 0x5a3f, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4b, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50, 0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a56, 0x5a57, 0x5a58, 0x5a59, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60, /* 0x8b */ 0x5a61, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a68, 0x5a69, 0x5a6b, 0x5a6c, 0x5a6d, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, 0x5a73, 0x5a78, 0x5a79, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5a80, 0x5a81, 0x5a82, 0x5a83, 0x5a84, 0x5a85, 0x5a86, 0x5a87, 0x5a88, 0x5a89, 0x5a8a, 0x5a8b, 0x5a8c, 0x5a8d, 0x5a8e, 0x5a8f, 0x5a90, 0x5a91, 0x5a93, 0x5a94, 0x5a95, 0x5a96, 0x5a97, 0x5a98, 0x5a99, 0x5a9c, 0x5a9d, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa1, 0x5aa2, 0x5aa3, 0x5aa4, 0x5aa5, 0x5aa6, 0x5aa7, 0x5aa8, 0x5aa9, 0x5aab, 0x5aac, 0x5aad, 0x5aae, 0x5aaf, 0x5ab0, 0x5ab1, 0x5ab4, 0x5ab6, 0x5ab7, 0x5ab9, 0x5aba, 0x5abb, 0x5abc, 0x5abd, 0x5abf, 0x5ac0, 0x5ac3, 0x5ac4, 0x5ac5, 0x5ac6, 0x5ac7, 0x5ac8, 0x5aca, 0x5acb, 0x5acd, 0x5ace, 0x5acf, 0x5ad0, 0x5ad1, 0x5ad3, 0x5ad5, 0x5ad7, 0x5ad9, 0x5ada, 0x5adb, 0x5add, 0x5ade, 0x5adf, 0x5ae2, 0x5ae4, 0x5ae5, 0x5ae7, 0x5ae8, 0x5aea, 0x5aec, 0x5aed, 0x5aee, 0x5aef, 0x5af0, 0x5af2, 0x5af3, 0x5af4, 0x5af5, 0x5af6, 0x5af7, 0x5af8, 0x5af9, 0x5afa, 0x5afb, 0x5afc, 0x5afd, 0x5afe, 0x5aff, 0x5b00, 0x5b01, 0x5b02, 0x5b03, 0x5b04, 0x5b05, 0x5b06, 0x5b07, 0x5b08, 0x5b0a, 0x5b0b, 0x5b0c, 0x5b0d, 0x5b0e, 0x5b0f, 0x5b10, 0x5b11, 0x5b12, 0x5b13, 0x5b14, 0x5b15, 0x5b18, 0x5b19, 0x5b1a, 0x5b1b, 0x5b1c, 0x5b1d, 0x5b1e, 0x5b1f, 0x5b20, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25, 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d, 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b33, 0x5b35, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b41, 0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47, /* 0x8c */ 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, 0x5b52, 0x5b56, 0x5b5e, 0x5b60, 0x5b61, 0x5b67, 0x5b68, 0x5b6b, 0x5b6d, 0x5b6e, 0x5b6f, 0x5b72, 0x5b74, 0x5b76, 0x5b77, 0x5b78, 0x5b79, 0x5b7b, 0x5b7c, 0x5b7e, 0x5b7f, 0x5b82, 0x5b86, 0x5b8a, 0x5b8d, 0x5b8e, 0x5b90, 0x5b91, 0x5b92, 0x5b94, 0x5b96, 0x5b9f, 0x5ba7, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5bae, 0x5baf, 0x5bb1, 0x5bb2, 0x5bb7, 0x5bba, 0x5bbb, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bc3, 0x5bc8, 0x5bc9, 0x5bca, 0x5bcb, 0x5bcd, 0x5bce, 0x5bcf, 0x5bd1, 0x5bd4, 0x5bd5, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5bdb, 0x5bdc, 0x5be0, 0x5be2, 0x5be3, 0x5be6, 0x5be7, 0x5be9, 0x5bea, 0x5beb, 0x5bec, 0x5bed, 0x5bef, 0x5bf1, 0x5bf2, 0x5bf3, 0x5bf4, 0x5bf5, 0x5bf6, 0x5bf7, 0x5bfd, 0x5bfe, 0x5c00, 0x5c02, 0x5c03, 0x5c05, 0x5c07, 0x5c08, 0x5c0b, 0x5c0c, 0x5c0d, 0x5c0e, 0x5c10, 0x5c12, 0x5c13, 0x5c17, 0x5c19, 0x5c1b, 0x5c1e, 0x5c1f, 0x5c20, 0x5c21, 0x5c23, 0x5c26, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2d, 0x5c2e, 0x5c2f, 0x5c30, 0x5c32, 0x5c33, 0x5c35, 0x5c36, 0x5c37, 0x5c43, 0x5c44, 0x5c46, 0x5c47, 0x5c4c, 0x5c4d, 0x5c52, 0x5c53, 0x5c54, 0x5c56, 0x5c57, 0x5c58, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, 0x5c5f, 0x5c62, 0x5c64, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d, 0x5c70, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, 0x5c77, 0x5c78, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5c80, 0x5c83, 0x5c84, 0x5c85, 0x5c86, 0x5c87, 0x5c89, 0x5c8a, 0x5c8b, 0x5c8e, 0x5c8f, 0x5c92, 0x5c93, 0x5c95, 0x5c9d, 0x5c9e, 0x5c9f, 0x5ca0, 0x5ca1, 0x5ca4, 0x5ca5, 0x5ca6, 0x5ca7, 0x5ca8, /* 0x8d */ 0x5caa, 0x5cae, 0x5caf, 0x5cb0, 0x5cb2, 0x5cb4, 0x5cb6, 0x5cb9, 0x5cba, 0x5cbb, 0x5cbc, 0x5cbe, 0x5cc0, 0x5cc2, 0x5cc3, 0x5cc5, 0x5cc6, 0x5cc7, 0x5cc8, 0x5cc9, 0x5cca, 0x5ccc, 0x5ccd, 0x5cce, 0x5ccf, 0x5cd0, 0x5cd1, 0x5cd3, 0x5cd4, 0x5cd5, 0x5cd6, 0x5cd7, 0x5cd8, 0x5cda, 0x5cdb, 0x5cdc, 0x5cdd, 0x5cde, 0x5cdf, 0x5ce0, 0x5ce2, 0x5ce3, 0x5ce7, 0x5ce9, 0x5ceb, 0x5cec, 0x5cee, 0x5cef, 0x5cf1, 0x5cf2, 0x5cf3, 0x5cf4, 0x5cf5, 0x5cf6, 0x5cf7, 0x5cf8, 0x5cf9, 0x5cfa, 0x5cfc, 0x5cfd, 0x5cfe, 0x5cff, 0x5d00, 0x5d01, 0x5d04, 0x5d05, 0x5d08, 0x5d09, 0x5d0a, 0x5d0b, 0x5d0c, 0x5d0d, 0x5d0f, 0x5d10, 0x5d11, 0x5d12, 0x5d13, 0x5d15, 0x5d17, 0x5d18, 0x5d19, 0x5d1a, 0x5d1c, 0x5d1d, 0x5d1f, 0x5d20, 0x5d21, 0x5d22, 0x5d23, 0x5d25, 0x5d28, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2f, 0x5d30, 0x5d31, 0x5d32, 0x5d33, 0x5d35, 0x5d36, 0x5d37, 0x5d38, 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3f, 0x5d40, 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d48, 0x5d49, 0x5d4d, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, 0x5d59, 0x5d5a, 0x5d5c, 0x5d5e, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, 0x5d6a, 0x5d6d, 0x5d6e, 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d75, 0x5d76, 0x5d77, 0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5d7f, 0x5d80, 0x5d81, 0x5d83, 0x5d84, 0x5d85, 0x5d86, 0x5d87, 0x5d88, 0x5d89, 0x5d8a, 0x5d8b, 0x5d8c, 0x5d8d, 0x5d8e, 0x5d8f, 0x5d90, 0x5d91, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d96, 0x5d97, 0x5d98, 0x5d9a, 0x5d9b, 0x5d9c, 0x5d9e, 0x5d9f, 0x5da0, /* 0x8e */ 0x5da1, 0x5da2, 0x5da3, 0x5da4, 0x5da5, 0x5da6, 0x5da7, 0x5da8, 0x5da9, 0x5daa, 0x5dab, 0x5dac, 0x5dad, 0x5dae, 0x5daf, 0x5db0, 0x5db1, 0x5db2, 0x5db3, 0x5db4, 0x5db5, 0x5db6, 0x5db8, 0x5db9, 0x5dba, 0x5dbb, 0x5dbc, 0x5dbd, 0x5dbe, 0x5dbf, 0x5dc0, 0x5dc1, 0x5dc2, 0x5dc3, 0x5dc4, 0x5dc6, 0x5dc7, 0x5dc8, 0x5dc9, 0x5dca, 0x5dcb, 0x5dcc, 0x5dce, 0x5dcf, 0x5dd0, 0x5dd1, 0x5dd2, 0x5dd3, 0x5dd4, 0x5dd5, 0x5dd6, 0x5dd7, 0x5dd8, 0x5dd9, 0x5dda, 0x5ddc, 0x5ddf, 0x5de0, 0x5de3, 0x5de4, 0x5dea, 0x5dec, 0x5ded, 0x5df0, 0x5df5, 0x5df6, 0x5df8, 0x5df9, 0x5dfa, 0x5dfb, 0x5dfc, 0x5dff, 0x5e00, 0x5e04, 0x5e07, 0x5e09, 0x5e0a, 0x5e0b, 0x5e0d, 0x5e0e, 0x5e12, 0x5e13, 0x5e17, 0x5e1e, 0x5e1f, 0x5e20, 0x5e21, 0x5e22, 0x5e23, 0x5e24, 0x5e25, 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c, 0x5e2f, 0x5e30, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e39, 0x5e3a, 0x5e3e, 0x5e3f, 0x5e40, 0x5e41, 0x5e43, 0x5e46, 0x5e47, 0x5e48, 0x5e49, 0x5e4a, 0x5e4b, 0x5e4d, 0x5e4e, 0x5e4f, 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a, 0x5e5c, 0x5e5d, 0x5e5f, 0x5e60, 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, 0x5e70, 0x5e71, 0x5e75, 0x5e77, 0x5e79, 0x5e7e, 0x5e81, 0x5e82, 0x5e83, 0x5e85, 0x5e88, 0x5e89, 0x5e8c, 0x5e8d, 0x5e8e, 0x5e92, 0x5e98, 0x5e9b, 0x5e9d, 0x5ea1, 0x5ea2, 0x5ea3, 0x5ea4, 0x5ea8, 0x5ea9, 0x5eaa, 0x5eab, 0x5eac, 0x5eae, 0x5eaf, 0x5eb0, 0x5eb1, 0x5eb2, 0x5eb4, 0x5eba, 0x5ebb, 0x5ebc, 0x5ebd, 0x5ebf, 0x5ec0, 0x5ec1, 0x5ec2, 0x5ec3, 0x5ec4, 0x5ec5, /* 0x8f */ 0x5ec6, 0x5ec7, 0x5ec8, 0x5ecb, 0x5ecc, 0x5ecd, 0x5ece, 0x5ecf, 0x5ed0, 0x5ed4, 0x5ed5, 0x5ed7, 0x5ed8, 0x5ed9, 0x5eda, 0x5edc, 0x5edd, 0x5ede, 0x5edf, 0x5ee0, 0x5ee1, 0x5ee2, 0x5ee3, 0x5ee4, 0x5ee5, 0x5ee6, 0x5ee7, 0x5ee9, 0x5eeb, 0x5eec, 0x5eed, 0x5eee, 0x5eef, 0x5ef0, 0x5ef1, 0x5ef2, 0x5ef3, 0x5ef5, 0x5ef8, 0x5ef9, 0x5efb, 0x5efc, 0x5efd, 0x5f05, 0x5f06, 0x5f07, 0x5f09, 0x5f0c, 0x5f0d, 0x5f0e, 0x5f10, 0x5f12, 0x5f14, 0x5f16, 0x5f19, 0x5f1a, 0x5f1c, 0x5f1d, 0x5f1e, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28, 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f32, 0x5f33, 0x5f34, 0x5f35, 0x5f36, 0x5f37, 0x5f38, 0x5f3b, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f41, 0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49, 0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f51, 0x5f54, 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5e, 0x5f5f, 0x5f60, 0x5f63, 0x5f65, 0x5f67, 0x5f68, 0x5f6b, 0x5f6e, 0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f76, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, 0x5f7f, 0x5f83, 0x5f86, 0x5f8d, 0x5f8e, 0x5f8f, 0x5f91, 0x5f93, 0x5f94, 0x5f96, 0x5f9a, 0x5f9b, 0x5f9d, 0x5f9e, 0x5f9f, 0x5fa0, 0x5fa2, 0x5fa3, 0x5fa4, 0x5fa5, 0x5fa6, 0x5fa7, 0x5fa9, 0x5fab, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb2, 0x5fb3, 0x5fb4, 0x5fb6, 0x5fb8, 0x5fb9, 0x5fba, 0x5fbb, 0x5fbe, 0x5fbf, 0x5fc0, 0x5fc1, 0x5fc2, 0x5fc7, 0x5fc8, 0x5fca, 0x5fcb, 0x5fce, 0x5fd3, 0x5fd4, 0x5fd5, 0x5fda, 0x5fdb, 0x5fdc, 0x5fde, 0x5fdf, 0x5fe2, 0x5fe3, 0x5fe5, 0x5fe6, 0x5fe8, 0x5fe9, 0x5fec, 0x5fef, 0x5ff0, 0x5ff2, 0x5ff3, 0x5ff4, 0x5ff6, 0x5ff7, 0x5ff9, 0x5ffa, 0x5ffc, 0x6007, /* 0x90 */ 0x6008, 0x6009, 0x600b, 0x600c, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601a, 0x601e, 0x601f, 0x6022, 0x6023, 0x6024, 0x602c, 0x602d, 0x602e, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603a, 0x603d, 0x603e, 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604a, 0x604c, 0x604e, 0x604f, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605b, 0x605c, 0x605e, 0x605f, 0x6060, 0x6061, 0x6065, 0x6066, 0x606e, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607e, 0x6080, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608a, 0x608b, 0x608e, 0x608f, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609c, 0x609e, 0x60a1, 0x60a2, 0x60a4, 0x60a5, 0x60a7, 0x60a9, 0x60aa, 0x60ae, 0x60b0, 0x60b3, 0x60b5, 0x60b6, 0x60b7, 0x60b9, 0x60ba, 0x60bd, 0x60be, 0x60bf, 0x60c0, 0x60c1, 0x60c2, 0x60c3, 0x60c4, 0x60c7, 0x60c8, 0x60c9, 0x60cc, 0x60cd, 0x60ce, 0x60cf, 0x60d0, 0x60d2, 0x60d3, 0x60d4, 0x60d6, 0x60d7, 0x60d9, 0x60db, 0x60de, 0x60e1, 0x60e2, 0x60e3, 0x60e4, 0x60e5, 0x60ea, 0x60f1, 0x60f2, 0x60f5, 0x60f7, 0x60f8, 0x60fb, 0x60fc, 0x60fd, 0x60fe, 0x60ff, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610a, 0x610b, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6118, 0x6119, 0x611b, 0x611c, 0x611d, 0x611e, 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612a, 0x612c, 0x612d, 0x612e, 0x612f, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, /* 0x91 */ 0x6147, 0x6149, 0x614b, 0x614d, 0x614f, 0x6150, 0x6152, 0x6153, 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615a, 0x615b, 0x615c, 0x615e, 0x615f, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6171, 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617a, 0x617b, 0x617c, 0x617d, 0x617e, 0x617f, 0x6180, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618a, 0x618c, 0x618d, 0x618f, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196, 0x6197, 0x6198, 0x6199, 0x619a, 0x619b, 0x619c, 0x619e, 0x619f, 0x61a0, 0x61a1, 0x61a2, 0x61a3, 0x61a4, 0x61a5, 0x61a6, 0x61aa, 0x61ab, 0x61ad, 0x61ae, 0x61af, 0x61b0, 0x61b1, 0x61b2, 0x61b3, 0x61b4, 0x61b5, 0x61b6, 0x61b8, 0x61b9, 0x61ba, 0x61bb, 0x61bc, 0x61bd, 0x61bf, 0x61c0, 0x61c1, 0x61c3, 0x61c4, 0x61c5, 0x61c6, 0x61c7, 0x61c9, 0x61cc, 0x61cd, 0x61ce, 0x61cf, 0x61d0, 0x61d3, 0x61d5, 0x61d6, 0x61d7, 0x61d8, 0x61d9, 0x61da, 0x61db, 0x61dc, 0x61dd, 0x61de, 0x61df, 0x61e0, 0x61e1, 0x61e2, 0x61e3, 0x61e4, 0x61e5, 0x61e7, 0x61e8, 0x61e9, 0x61ea, 0x61eb, 0x61ec, 0x61ed, 0x61ee, 0x61ef, 0x61f0, 0x61f1, 0x61f2, 0x61f3, 0x61f4, 0x61f6, 0x61f7, 0x61f8, 0x61f9, 0x61fa, 0x61fb, 0x61fc, 0x61fd, 0x61fe, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, 0x6213, 0x6214, 0x6219, 0x621c, 0x621d, 0x621e, 0x6220, 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622b, 0x622d, 0x622f, 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623a, 0x623b, 0x623c, 0x6242, 0x6244, 0x6245, 0x6246, 0x624a, /* 0x92 */ 0x624f, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625a, 0x625c, 0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627a, 0x627b, 0x627d, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628b, 0x628c, 0x628d, 0x628e, 0x628f, 0x6290, 0x6294, 0x6299, 0x629c, 0x629d, 0x629e, 0x62a3, 0x62a6, 0x62a7, 0x62a9, 0x62aa, 0x62ad, 0x62ae, 0x62af, 0x62b0, 0x62b2, 0x62b3, 0x62b4, 0x62b6, 0x62b7, 0x62b8, 0x62ba, 0x62be, 0x62c0, 0x62c1, 0x62c3, 0x62cb, 0x62cf, 0x62d1, 0x62d5, 0x62dd, 0x62de, 0x62e0, 0x62e1, 0x62e4, 0x62ea, 0x62eb, 0x62f0, 0x62f2, 0x62f5, 0x62f8, 0x62f9, 0x62fa, 0x62fb, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630a, 0x630b, 0x630c, 0x630d, 0x630f, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631c, 0x6326, 0x6327, 0x6329, 0x632c, 0x632d, 0x632e, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x633b, 0x633c, 0x633e, 0x633f, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634a, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, 0x635d, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636a, 0x636b, 0x636c, 0x636f, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637c, 0x637d, 0x637e, 0x637f, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, 0x638b, 0x638d, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, 0x639a, 0x639b, 0x639c, 0x639d, 0x639e, 0x639f, 0x63a1, 0x63a4, 0x63a6, 0x63ab, 0x63af, 0x63b1, 0x63b2, 0x63b5, 0x63b6, 0x63b9, 0x63bb, 0x63bd, 0x63bf, 0x63c0, /* 0x93 */ 0x63c1, 0x63c2, 0x63c3, 0x63c5, 0x63c7, 0x63c8, 0x63ca, 0x63cb, 0x63cc, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63d7, 0x63d8, 0x63d9, 0x63da, 0x63db, 0x63dc, 0x63dd, 0x63df, 0x63e2, 0x63e4, 0x63e5, 0x63e6, 0x63e7, 0x63e8, 0x63eb, 0x63ec, 0x63ee, 0x63ef, 0x63f0, 0x63f1, 0x63f3, 0x63f5, 0x63f7, 0x63f9, 0x63fa, 0x63fb, 0x63fc, 0x63fe, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640a, 0x640d, 0x640e, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641a, 0x641d, 0x641f, 0x6422, 0x6423, 0x6424, 0x6425, 0x6427, 0x6428, 0x6429, 0x642b, 0x642e, 0x642f, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643b, 0x643c, 0x643e, 0x6440, 0x6442, 0x6443, 0x6449, 0x644b, 0x644c, 0x644d, 0x644e, 0x644f, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646a, 0x646b, 0x646c, 0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647b, 0x647c, 0x647d, 0x647e, 0x647f, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, 0x648a, 0x648b, 0x648c, 0x648d, 0x648e, 0x648f, 0x6490, 0x6493, 0x6494, 0x6497, 0x6498, 0x649a, 0x649b, 0x649c, 0x649d, 0x649f, 0x64a0, 0x64a1, 0x64a2, 0x64a3, 0x64a5, 0x64a6, 0x64a7, 0x64a8, 0x64aa, 0x64ab, 0x64af, 0x64b1, 0x64b2, 0x64b3, 0x64b4, 0x64b6, 0x64b9, 0x64bb, 0x64bd, 0x64be, 0x64bf, 0x64c1, 0x64c3, 0x64c4, 0x64c6, 0x64c7, 0x64c8, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64cf, 0x64d1, 0x64d3, 0x64d4, 0x64d5, 0x64d6, 0x64d9, 0x64da, /* 0x94 */ 0x64db, 0x64dc, 0x64dd, 0x64df, 0x64e0, 0x64e1, 0x64e3, 0x64e5, 0x64e7, 0x64e8, 0x64e9, 0x64ea, 0x64eb, 0x64ec, 0x64ed, 0x64ee, 0x64ef, 0x64f0, 0x64f1, 0x64f2, 0x64f3, 0x64f4, 0x64f5, 0x64f6, 0x64f7, 0x64f8, 0x64f9, 0x64fa, 0x64fb, 0x64fc, 0x64fd, 0x64fe, 0x64ff, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, 0x6508, 0x650a, 0x650b, 0x650c, 0x650d, 0x650e, 0x650f, 0x6510, 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651a, 0x651b, 0x651c, 0x651d, 0x651e, 0x651f, 0x6520, 0x6521, 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652a, 0x652c, 0x652d, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653a, 0x653c, 0x653d, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, 0x654a, 0x654b, 0x654d, 0x654e, 0x6550, 0x6552, 0x6553, 0x6554, 0x6557, 0x6558, 0x655a, 0x655c, 0x655f, 0x6560, 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656a, 0x656d, 0x656e, 0x656f, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657a, 0x657b, 0x657c, 0x657d, 0x657e, 0x657f, 0x6580, 0x6581, 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658a, 0x658d, 0x658e, 0x658f, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659a, 0x659d, 0x659e, 0x65a0, 0x65a2, 0x65a3, 0x65a6, 0x65a8, 0x65aa, 0x65ac, 0x65ae, 0x65b1, 0x65b2, 0x65b3, 0x65b4, 0x65b5, 0x65b6, 0x65b7, 0x65b8, 0x65ba, 0x65bb, 0x65be, 0x65bf, 0x65c0, 0x65c2, 0x65c7, 0x65c8, 0x65c9, 0x65ca, 0x65cd, 0x65d0, 0x65d1, 0x65d3, 0x65d4, 0x65d5, 0x65d8, 0x65d9, 0x65da, 0x65db, 0x65dc, 0x65dd, 0x65de, 0x65df, 0x65e1, 0x65e3, 0x65e4, 0x65ea, 0x65eb, /* 0x95 */ 0x65f2, 0x65f3, 0x65f4, 0x65f5, 0x65f8, 0x65f9, 0x65fb, 0x65fc, 0x65fd, 0x65fe, 0x65ff, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, 0x6609, 0x660b, 0x660d, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, 0x6618, 0x661a, 0x661b, 0x661c, 0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662a, 0x662b, 0x662c, 0x662e, 0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663a, 0x663b, 0x663d, 0x663f, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664a, 0x664d, 0x664e, 0x6650, 0x6651, 0x6658, 0x6659, 0x665b, 0x665c, 0x665d, 0x665e, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x6671, 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667b, 0x667c, 0x667d, 0x667f, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668a, 0x668b, 0x668d, 0x668e, 0x668f, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699, 0x669a, 0x669b, 0x669c, 0x669e, 0x669f, 0x66a0, 0x66a1, 0x66a2, 0x66a3, 0x66a4, 0x66a5, 0x66a6, 0x66a9, 0x66aa, 0x66ab, 0x66ac, 0x66ad, 0x66af, 0x66b0, 0x66b1, 0x66b2, 0x66b3, 0x66b5, 0x66b6, 0x66b7, 0x66b8, 0x66ba, 0x66bb, 0x66bc, 0x66bd, 0x66bf, 0x66c0, 0x66c1, 0x66c2, 0x66c3, 0x66c4, 0x66c5, 0x66c6, 0x66c7, 0x66c8, 0x66c9, 0x66ca, 0x66cb, 0x66cc, 0x66cd, 0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5, 0x66d6, 0x66d7, 0x66d8, 0x66da, 0x66de, 0x66df, 0x66e0, 0x66e1, 0x66e2, 0x66e3, 0x66e4, 0x66e5, 0x66e7, 0x66e8, 0x66ea, 0x66eb, 0x66ec, 0x66ed, 0x66ee, 0x66ef, 0x66f1, 0x66f5, 0x66f6, 0x66f8, 0x66fa, 0x66fb, 0x66fd, 0x6701, 0x6702, 0x6703, /* 0x96 */ 0x6704, 0x6705, 0x6706, 0x6707, 0x670c, 0x670e, 0x670f, 0x6711, 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671a, 0x671c, 0x671e, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672e, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673b, 0x673c, 0x673e, 0x673f, 0x6741, 0x6744, 0x6745, 0x6747, 0x674a, 0x674b, 0x674d, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675a, 0x675b, 0x675d, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676b, 0x676c, 0x676e, 0x6771, 0x6774, 0x6776, 0x6778, 0x6779, 0x677a, 0x677b, 0x677d, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, 0x678a, 0x678c, 0x678d, 0x678e, 0x678f, 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679b, 0x679f, 0x67a0, 0x67a1, 0x67a4, 0x67a6, 0x67a9, 0x67ac, 0x67ae, 0x67b1, 0x67b2, 0x67b4, 0x67b9, 0x67ba, 0x67bb, 0x67bc, 0x67bd, 0x67be, 0x67bf, 0x67c0, 0x67c2, 0x67c5, 0x67c6, 0x67c7, 0x67c8, 0x67c9, 0x67ca, 0x67cb, 0x67cc, 0x67cd, 0x67ce, 0x67d5, 0x67d6, 0x67d7, 0x67db, 0x67df, 0x67e1, 0x67e3, 0x67e4, 0x67e6, 0x67e7, 0x67e8, 0x67ea, 0x67eb, 0x67ed, 0x67ee, 0x67f2, 0x67f5, 0x67f6, 0x67f7, 0x67f8, 0x67f9, 0x67fa, 0x67fb, 0x67fc, 0x67fe, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, 0x680d, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681a, 0x681b, 0x681c, 0x681e, 0x681f, 0x6820, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682b, 0x682c, 0x682d, 0x682e, 0x682f, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683a, 0x683b, 0x683f, 0x6847, 0x684b, 0x684d, 0x684f, 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685a, 0x685b, /* 0x97 */ 0x685c, 0x685d, 0x685e, 0x685f, 0x686a, 0x686c, 0x686d, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x687f, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, 0x688a, 0x688b, 0x688c, 0x688d, 0x688e, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, 0x6899, 0x689a, 0x689b, 0x689c, 0x689d, 0x689e, 0x689f, 0x68a0, 0x68a1, 0x68a3, 0x68a4, 0x68a5, 0x68a9, 0x68aa, 0x68ab, 0x68ac, 0x68ae, 0x68b1, 0x68b2, 0x68b4, 0x68b6, 0x68b7, 0x68b8, 0x68b9, 0x68ba, 0x68bb, 0x68bc, 0x68bd, 0x68be, 0x68bf, 0x68c1, 0x68c3, 0x68c4, 0x68c5, 0x68c6, 0x68c7, 0x68c8, 0x68ca, 0x68cc, 0x68ce, 0x68cf, 0x68d0, 0x68d1, 0x68d3, 0x68d4, 0x68d6, 0x68d7, 0x68d9, 0x68db, 0x68dc, 0x68dd, 0x68de, 0x68df, 0x68e1, 0x68e2, 0x68e4, 0x68e5, 0x68e6, 0x68e7, 0x68e8, 0x68e9, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68ef, 0x68f2, 0x68f3, 0x68f4, 0x68f6, 0x68f7, 0x68f8, 0x68fb, 0x68fd, 0x68fe, 0x68ff, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690a, 0x690c, 0x690f, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691a, 0x691b, 0x691c, 0x691d, 0x691e, 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692e, 0x692f, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938, 0x693a, 0x693b, 0x693c, 0x693e, 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694a, 0x694b, 0x694c, 0x694d, 0x694e, 0x694f, 0x6950, 0x6951, 0x6952, 0x6953, 0x6955, 0x6956, 0x6958, 0x6959, 0x695b, 0x695c, 0x695f, /* 0x98 */ 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696a, 0x696c, 0x696d, 0x696f, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x697a, 0x697b, 0x697d, 0x697e, 0x697f, 0x6981, 0x6983, 0x6985, 0x698a, 0x698b, 0x698c, 0x698e, 0x698f, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699a, 0x699d, 0x699e, 0x699f, 0x69a0, 0x69a1, 0x69a2, 0x69a3, 0x69a4, 0x69a5, 0x69a6, 0x69a9, 0x69aa, 0x69ac, 0x69ae, 0x69af, 0x69b0, 0x69b2, 0x69b3, 0x69b5, 0x69b6, 0x69b8, 0x69b9, 0x69ba, 0x69bc, 0x69bd, 0x69be, 0x69bf, 0x69c0, 0x69c2, 0x69c3, 0x69c4, 0x69c5, 0x69c6, 0x69c7, 0x69c8, 0x69c9, 0x69cb, 0x69cd, 0x69cf, 0x69d1, 0x69d2, 0x69d3, 0x69d5, 0x69d6, 0x69d7, 0x69d8, 0x69d9, 0x69da, 0x69dc, 0x69dd, 0x69de, 0x69e1, 0x69e2, 0x69e3, 0x69e4, 0x69e5, 0x69e6, 0x69e7, 0x69e8, 0x69e9, 0x69ea, 0x69eb, 0x69ec, 0x69ee, 0x69ef, 0x69f0, 0x69f1, 0x69f3, 0x69f4, 0x69f5, 0x69f6, 0x69f7, 0x69f8, 0x69f9, 0x69fa, 0x69fb, 0x69fc, 0x69fe, 0x6a00, 0x6a01, 0x6a02, 0x6a03, 0x6a04, 0x6a05, 0x6a06, 0x6a07, 0x6a08, 0x6a09, 0x6a0b, 0x6a0c, 0x6a0d, 0x6a0e, 0x6a0f, 0x6a10, 0x6a11, 0x6a12, 0x6a13, 0x6a14, 0x6a15, 0x6a16, 0x6a19, 0x6a1a, 0x6a1b, 0x6a1c, 0x6a1d, 0x6a1e, 0x6a20, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a29, 0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a30, 0x6a32, 0x6a33, 0x6a34, 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3f, 0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a45, 0x6a46, 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a51, 0x6a52, 0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a5a, /* 0x99 */ 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a62, 0x6a63, 0x6a64, 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x6a70, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a7a, 0x6a7b, 0x6a7d, 0x6a7e, 0x6a7f, 0x6a81, 0x6a82, 0x6a83, 0x6a85, 0x6a86, 0x6a87, 0x6a88, 0x6a89, 0x6a8a, 0x6a8b, 0x6a8c, 0x6a8d, 0x6a8f, 0x6a92, 0x6a93, 0x6a94, 0x6a95, 0x6a96, 0x6a98, 0x6a99, 0x6a9a, 0x6a9b, 0x6a9c, 0x6a9d, 0x6a9e, 0x6a9f, 0x6aa1, 0x6aa2, 0x6aa3, 0x6aa4, 0x6aa5, 0x6aa6, 0x6aa7, 0x6aa8, 0x6aaa, 0x6aad, 0x6aae, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab2, 0x6ab3, 0x6ab4, 0x6ab5, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba, 0x6abb, 0x6abc, 0x6abd, 0x6abe, 0x6abf, 0x6ac0, 0x6ac1, 0x6ac2, 0x6ac3, 0x6ac4, 0x6ac5, 0x6ac6, 0x6ac7, 0x6ac8, 0x6ac9, 0x6aca, 0x6acb, 0x6acc, 0x6acd, 0x6ace, 0x6acf, 0x6ad0, 0x6ad1, 0x6ad2, 0x6ad3, 0x6ad4, 0x6ad5, 0x6ad6, 0x6ad7, 0x6ad8, 0x6ad9, 0x6ada, 0x6adb, 0x6adc, 0x6add, 0x6ade, 0x6adf, 0x6ae0, 0x6ae1, 0x6ae2, 0x6ae3, 0x6ae4, 0x6ae5, 0x6ae6, 0x6ae7, 0x6ae8, 0x6ae9, 0x6aea, 0x6aeb, 0x6aec, 0x6aed, 0x6aee, 0x6aef, 0x6af0, 0x6af1, 0x6af2, 0x6af3, 0x6af4, 0x6af5, 0x6af6, 0x6af7, 0x6af8, 0x6af9, 0x6afa, 0x6afb, 0x6afc, 0x6afd, 0x6afe, 0x6aff, 0x6b00, 0x6b01, 0x6b02, 0x6b03, 0x6b04, 0x6b05, 0x6b06, 0x6b07, 0x6b08, 0x6b09, 0x6b0a, 0x6b0b, 0x6b0c, 0x6b0d, 0x6b0e, 0x6b0f, 0x6b10, 0x6b11, 0x6b12, 0x6b13, 0x6b14, 0x6b15, 0x6b16, 0x6b17, 0x6b18, 0x6b19, 0x6b1a, 0x6b1b, 0x6b1c, 0x6b1d, 0x6b1e, 0x6b1f, 0x6b25, 0x6b26, 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e, /* 0x9a */ 0x6b2f, 0x6b30, 0x6b31, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b38, 0x6b3b, 0x6b3c, 0x6b3d, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b44, 0x6b45, 0x6b48, 0x6b4a, 0x6b4b, 0x6b4d, 0x6b4e, 0x6b4f, 0x6b50, 0x6b51, 0x6b52, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, 0x6b58, 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5d, 0x6b5e, 0x6b5f, 0x6b60, 0x6b61, 0x6b68, 0x6b69, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b77, 0x6b78, 0x6b7a, 0x6b7d, 0x6b7e, 0x6b7f, 0x6b80, 0x6b85, 0x6b88, 0x6b8c, 0x6b8e, 0x6b8f, 0x6b90, 0x6b91, 0x6b94, 0x6b95, 0x6b97, 0x6b98, 0x6b99, 0x6b9c, 0x6b9d, 0x6b9e, 0x6b9f, 0x6ba0, 0x6ba2, 0x6ba3, 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, 0x6ba8, 0x6ba9, 0x6bab, 0x6bac, 0x6bad, 0x6bae, 0x6baf, 0x6bb0, 0x6bb1, 0x6bb2, 0x6bb6, 0x6bb8, 0x6bb9, 0x6bba, 0x6bbb, 0x6bbc, 0x6bbd, 0x6bbe, 0x6bc0, 0x6bc3, 0x6bc4, 0x6bc6, 0x6bc7, 0x6bc8, 0x6bc9, 0x6bca, 0x6bcc, 0x6bce, 0x6bd0, 0x6bd1, 0x6bd8, 0x6bda, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf, 0x6be0, 0x6be2, 0x6be3, 0x6be4, 0x6be5, 0x6be6, 0x6be7, 0x6be8, 0x6be9, 0x6bec, 0x6bed, 0x6bee, 0x6bf0, 0x6bf1, 0x6bf2, 0x6bf4, 0x6bf6, 0x6bf7, 0x6bf8, 0x6bfa, 0x6bfb, 0x6bfc, 0x6bfe, 0x6bff, 0x6c00, 0x6c01, 0x6c02, 0x6c03, 0x6c04, 0x6c08, 0x6c09, 0x6c0a, 0x6c0b, 0x6c0c, 0x6c0e, 0x6c12, 0x6c17, 0x6c1c, 0x6c1d, 0x6c1e, 0x6c20, 0x6c23, 0x6c25, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c31, 0x6c33, 0x6c36, 0x6c37, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3e, 0x6c3f, 0x6c43, 0x6c44, 0x6c45, 0x6c48, 0x6c4b, 0x6c4c, 0x6c4d, 0x6c4e, 0x6c4f, 0x6c51, 0x6c52, 0x6c53, 0x6c56, 0x6c58, /* 0x9b */ 0x6c59, 0x6c5a, 0x6c62, 0x6c63, 0x6c65, 0x6c66, 0x6c67, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, 0x6c71, 0x6c73, 0x6c75, 0x6c77, 0x6c78, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7f, 0x6c80, 0x6c84, 0x6c87, 0x6c8a, 0x6c8b, 0x6c8d, 0x6c8e, 0x6c91, 0x6c92, 0x6c95, 0x6c96, 0x6c97, 0x6c98, 0x6c9a, 0x6c9c, 0x6c9d, 0x6c9e, 0x6ca0, 0x6ca2, 0x6ca8, 0x6cac, 0x6caf, 0x6cb0, 0x6cb4, 0x6cb5, 0x6cb6, 0x6cb7, 0x6cba, 0x6cc0, 0x6cc1, 0x6cc2, 0x6cc3, 0x6cc6, 0x6cc7, 0x6cc8, 0x6ccb, 0x6ccd, 0x6cce, 0x6ccf, 0x6cd1, 0x6cd2, 0x6cd8, 0x6cd9, 0x6cda, 0x6cdc, 0x6cdd, 0x6cdf, 0x6ce4, 0x6ce6, 0x6ce7, 0x6ce9, 0x6cec, 0x6ced, 0x6cf2, 0x6cf4, 0x6cf9, 0x6cff, 0x6d00, 0x6d02, 0x6d03, 0x6d05, 0x6d06, 0x6d08, 0x6d09, 0x6d0a, 0x6d0d, 0x6d0f, 0x6d10, 0x6d11, 0x6d13, 0x6d14, 0x6d15, 0x6d16, 0x6d18, 0x6d1c, 0x6d1d, 0x6d1f, 0x6d20, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d26, 0x6d28, 0x6d29, 0x6d2c, 0x6d2d, 0x6d2f, 0x6d30, 0x6d34, 0x6d36, 0x6d37, 0x6d38, 0x6d3a, 0x6d3f, 0x6d40, 0x6d42, 0x6d44, 0x6d49, 0x6d4c, 0x6d50, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d5b, 0x6d5d, 0x6d5f, 0x6d61, 0x6d62, 0x6d64, 0x6d65, 0x6d67, 0x6d68, 0x6d6b, 0x6d6c, 0x6d6d, 0x6d70, 0x6d71, 0x6d72, 0x6d73, 0x6d75, 0x6d76, 0x6d79, 0x6d7a, 0x6d7b, 0x6d7d, 0x6d7e, 0x6d7f, 0x6d80, 0x6d81, 0x6d83, 0x6d84, 0x6d86, 0x6d87, 0x6d8a, 0x6d8b, 0x6d8d, 0x6d8f, 0x6d90, 0x6d92, 0x6d96, 0x6d97, 0x6d98, 0x6d99, 0x6d9a, 0x6d9c, 0x6da2, 0x6da5, 0x6dac, 0x6dad, 0x6db0, 0x6db1, 0x6db3, 0x6db4, 0x6db6, 0x6db7, 0x6db9, 0x6dba, 0x6dbb, 0x6dbc, 0x6dbd, 0x6dbe, 0x6dc1, 0x6dc2, 0x6dc3, 0x6dc8, 0x6dc9, 0x6dca, /* 0x9c */ 0x6dcd, 0x6dce, 0x6dcf, 0x6dd0, 0x6dd2, 0x6dd3, 0x6dd4, 0x6dd5, 0x6dd7, 0x6dda, 0x6ddb, 0x6ddc, 0x6ddf, 0x6de2, 0x6de3, 0x6de5, 0x6de7, 0x6de8, 0x6de9, 0x6dea, 0x6ded, 0x6def, 0x6df0, 0x6df2, 0x6df4, 0x6df5, 0x6df6, 0x6df8, 0x6dfa, 0x6dfd, 0x6dfe, 0x6dff, 0x6e00, 0x6e01, 0x6e02, 0x6e03, 0x6e04, 0x6e06, 0x6e07, 0x6e08, 0x6e09, 0x6e0b, 0x6e0f, 0x6e12, 0x6e13, 0x6e15, 0x6e18, 0x6e19, 0x6e1b, 0x6e1c, 0x6e1e, 0x6e1f, 0x6e22, 0x6e26, 0x6e27, 0x6e28, 0x6e2a, 0x6e2c, 0x6e2e, 0x6e30, 0x6e31, 0x6e33, 0x6e35, 0x6e36, 0x6e37, 0x6e39, 0x6e3b, 0x6e3c, 0x6e3d, 0x6e3e, 0x6e3f, 0x6e40, 0x6e41, 0x6e42, 0x6e45, 0x6e46, 0x6e47, 0x6e48, 0x6e49, 0x6e4a, 0x6e4b, 0x6e4c, 0x6e4f, 0x6e50, 0x6e51, 0x6e52, 0x6e55, 0x6e57, 0x6e59, 0x6e5a, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e60, 0x6e61, 0x6e62, 0x6e63, 0x6e64, 0x6e65, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6c, 0x6e6d, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e73, 0x6e74, 0x6e75, 0x6e76, 0x6e77, 0x6e78, 0x6e79, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6e80, 0x6e81, 0x6e82, 0x6e84, 0x6e87, 0x6e88, 0x6e8a, 0x6e8b, 0x6e8c, 0x6e8d, 0x6e8e, 0x6e91, 0x6e92, 0x6e93, 0x6e94, 0x6e95, 0x6e96, 0x6e97, 0x6e99, 0x6e9a, 0x6e9b, 0x6e9d, 0x6e9e, 0x6ea0, 0x6ea1, 0x6ea3, 0x6ea4, 0x6ea6, 0x6ea8, 0x6ea9, 0x6eab, 0x6eac, 0x6ead, 0x6eae, 0x6eb0, 0x6eb3, 0x6eb5, 0x6eb8, 0x6eb9, 0x6ebc, 0x6ebe, 0x6ebf, 0x6ec0, 0x6ec3, 0x6ec4, 0x6ec5, 0x6ec6, 0x6ec8, 0x6ec9, 0x6eca, 0x6ecc, 0x6ecd, 0x6ece, 0x6ed0, 0x6ed2, 0x6ed6, 0x6ed8, 0x6ed9, 0x6edb, 0x6edc, 0x6edd, 0x6ee3, 0x6ee7, 0x6eea, 0x6eeb, 0x6eec, 0x6eed, 0x6eee, 0x6eef, /* 0x9d */ 0x6ef0, 0x6ef1, 0x6ef2, 0x6ef3, 0x6ef5, 0x6ef6, 0x6ef7, 0x6ef8, 0x6efa, 0x6efb, 0x6efc, 0x6efd, 0x6efe, 0x6eff, 0x6f00, 0x6f01, 0x6f03, 0x6f04, 0x6f05, 0x6f07, 0x6f08, 0x6f0a, 0x6f0b, 0x6f0c, 0x6f0d, 0x6f0e, 0x6f10, 0x6f11, 0x6f12, 0x6f16, 0x6f17, 0x6f18, 0x6f19, 0x6f1a, 0x6f1b, 0x6f1c, 0x6f1d, 0x6f1e, 0x6f1f, 0x6f21, 0x6f22, 0x6f23, 0x6f25, 0x6f26, 0x6f27, 0x6f28, 0x6f2c, 0x6f2e, 0x6f30, 0x6f32, 0x6f34, 0x6f35, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x6f3b, 0x6f3c, 0x6f3d, 0x6f3f, 0x6f40, 0x6f41, 0x6f42, 0x6f43, 0x6f44, 0x6f45, 0x6f48, 0x6f49, 0x6f4a, 0x6f4c, 0x6f4e, 0x6f4f, 0x6f50, 0x6f51, 0x6f52, 0x6f53, 0x6f54, 0x6f55, 0x6f56, 0x6f57, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5d, 0x6f5f, 0x6f60, 0x6f61, 0x6f63, 0x6f64, 0x6f65, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x6f6f, 0x6f70, 0x6f71, 0x6f73, 0x6f75, 0x6f76, 0x6f77, 0x6f79, 0x6f7b, 0x6f7d, 0x6f7e, 0x6f7f, 0x6f80, 0x6f81, 0x6f82, 0x6f83, 0x6f85, 0x6f86, 0x6f87, 0x6f8a, 0x6f8b, 0x6f8f, 0x6f90, 0x6f91, 0x6f92, 0x6f93, 0x6f94, 0x6f95, 0x6f96, 0x6f97, 0x6f98, 0x6f99, 0x6f9a, 0x6f9b, 0x6f9d, 0x6f9e, 0x6f9f, 0x6fa0, 0x6fa2, 0x6fa3, 0x6fa4, 0x6fa5, 0x6fa6, 0x6fa8, 0x6fa9, 0x6faa, 0x6fab, 0x6fac, 0x6fad, 0x6fae, 0x6faf, 0x6fb0, 0x6fb1, 0x6fb2, 0x6fb4, 0x6fb5, 0x6fb7, 0x6fb8, 0x6fba, 0x6fbb, 0x6fbc, 0x6fbd, 0x6fbe, 0x6fbf, 0x6fc1, 0x6fc3, 0x6fc4, 0x6fc5, 0x6fc6, 0x6fc7, 0x6fc8, 0x6fca, 0x6fcb, 0x6fcc, 0x6fcd, 0x6fce, 0x6fcf, 0x6fd0, 0x6fd3, 0x6fd4, 0x6fd5, 0x6fd6, 0x6fd7, 0x6fd8, 0x6fd9, 0x6fda, 0x6fdb, 0x6fdc, 0x6fdd, 0x6fdf, 0x6fe2, 0x6fe3, 0x6fe4, 0x6fe5, /* 0x9e */ 0x6fe6, 0x6fe7, 0x6fe8, 0x6fe9, 0x6fea, 0x6feb, 0x6fec, 0x6fed, 0x6ff0, 0x6ff1, 0x6ff2, 0x6ff3, 0x6ff4, 0x6ff5, 0x6ff6, 0x6ff7, 0x6ff8, 0x6ff9, 0x6ffa, 0x6ffb, 0x6ffc, 0x6ffd, 0x6ffe, 0x6fff, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, 0x7008, 0x7009, 0x700a, 0x700b, 0x700c, 0x700d, 0x700e, 0x700f, 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701c, 0x701d, 0x701e, 0x701f, 0x7020, 0x7021, 0x7022, 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702a, 0x702b, 0x702c, 0x702d, 0x702e, 0x702f, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703a, 0x703b, 0x703c, 0x703d, 0x703e, 0x703f, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704a, 0x704b, 0x704d, 0x704e, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, 0x705a, 0x705b, 0x705c, 0x705d, 0x705f, 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x706e, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707a, 0x707b, 0x707d, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708b, 0x708c, 0x708d, 0x708f, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709a, 0x709b, 0x709e, 0x709f, 0x70a0, 0x70a1, 0x70a2, 0x70a3, 0x70a4, 0x70a5, 0x70a6, 0x70a7, 0x70a8, 0x70a9, 0x70aa, 0x70b0, 0x70b2, 0x70b4, 0x70b5, 0x70b6, 0x70ba, 0x70be, 0x70bf, 0x70c4, 0x70c5, 0x70c6, 0x70c7, 0x70c9, 0x70cb, 0x70cc, 0x70cd, 0x70ce, 0x70cf, 0x70d0, 0x70d1, 0x70d2, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d7, 0x70da, /* 0x9f */ 0x70dc, 0x70dd, 0x70de, 0x70e0, 0x70e1, 0x70e2, 0x70e3, 0x70e5, 0x70ea, 0x70ee, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, 0x70f6, 0x70f8, 0x70fa, 0x70fb, 0x70fc, 0x70fe, 0x70ff, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710b, 0x710c, 0x710d, 0x710e, 0x710f, 0x7111, 0x7112, 0x7114, 0x7117, 0x711b, 0x711c, 0x711d, 0x711e, 0x711f, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712a, 0x712b, 0x712c, 0x712d, 0x712e, 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713c, 0x713d, 0x713e, 0x713f, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x7149, 0x714b, 0x714d, 0x714f, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715a, 0x715b, 0x715d, 0x715f, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716a, 0x716b, 0x716c, 0x716d, 0x716f, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717b, 0x717c, 0x717e, 0x717f, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718b, 0x718c, 0x718d, 0x718e, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719a, 0x719b, 0x719c, 0x719d, 0x719e, 0x71a1, 0x71a2, 0x71a3, 0x71a4, 0x71a5, 0x71a6, 0x71a7, 0x71a9, 0x71aa, 0x71ab, 0x71ad, 0x71ae, 0x71af, 0x71b0, 0x71b1, 0x71b2, 0x71b4, 0x71b6, 0x71b7, 0x71b8, 0x71ba, 0x71bb, 0x71bc, 0x71bd, 0x71be, 0x71bf, 0x71c0, 0x71c1, 0x71c2, 0x71c4, 0x71c5, 0x71c6, 0x71c7, 0x71c8, 0x71c9, 0x71ca, 0x71cb, 0x71cc, 0x71cd, 0x71cf, 0x71d0, 0x71d1, 0x71d2, 0x71d3, /* 0xa0 */ 0x71d6, 0x71d7, 0x71d8, 0x71d9, 0x71da, 0x71db, 0x71dc, 0x71dd, 0x71de, 0x71df, 0x71e1, 0x71e2, 0x71e3, 0x71e4, 0x71e6, 0x71e8, 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ed, 0x71ef, 0x71f0, 0x71f1, 0x71f2, 0x71f3, 0x71f4, 0x71f5, 0x71f6, 0x71f7, 0x71f8, 0x71fa, 0x71fb, 0x71fc, 0x71fd, 0x71fe, 0x71ff, 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720a, 0x720b, 0x720c, 0x720d, 0x720e, 0x720f, 0x7210, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721a, 0x721b, 0x721c, 0x721e, 0x721f, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722b, 0x722d, 0x722e, 0x722f, 0x7232, 0x7233, 0x7234, 0x723a, 0x723c, 0x723e, 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724a, 0x724b, 0x724e, 0x724f, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, 0x7258, 0x725a, 0x725c, 0x725e, 0x7260, 0x7263, 0x7264, 0x7265, 0x7268, 0x726a, 0x726b, 0x726c, 0x726d, 0x7270, 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727b, 0x727c, 0x727d, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728c, 0x728e, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298, 0x7299, 0x729a, 0x729b, 0x729c, 0x729d, 0x729e, 0x72a0, 0x72a1, 0x72a2, 0x72a3, 0x72a4, 0x72a5, 0x72a6, 0x72a7, 0x72a8, 0x72a9, 0x72aa, 0x72ab, 0x72ae, 0x72b1, 0x72b2, 0x72b3, 0x72b5, 0x72ba, 0x72bb, 0x72bc, 0x72bd, 0x72be, 0x72bf, 0x72c0, 0x72c5, 0x72c6, 0x72c7, 0x72c9, 0x72ca, 0x72cb, 0x72cc, 0x72cf, 0x72d1, 0x72d3, 0x72d4, 0x72d5, 0x72d6, 0x72d8, 0x72da, 0x72db, }; static int gbkext1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x81 && c1 <= 0xa0)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 6080) wc = gbkext1_2uni_page81[i]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_2.h0000644000175000017500000001114213472116001016025 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-2 */ static const unsigned short iso8859_2_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int iso8859_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_2_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_2_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xb1, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xa5, 0xb5, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0xa6, 0xb6, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0xa9, 0xb9, 0xde, 0xfe, 0xab, 0xbb, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xac, 0xbc, 0xaf, 0xbf, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_2_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_2_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_2_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_3.h0000644000175000017500000001107413472116001016032 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-3 */ static const unsigned short iso8859_3_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0xfffd, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0xfffd, 0x017b, /* 0xb0 */ 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0xfffd, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0xfffd, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0xfffd, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0xfffd, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0xfffd, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, }; static int iso8859_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_3_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_3_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char iso8859_3_page01[120] = { 0xc6, 0xe6, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0xab, 0xbb, /* 0x18-0x1f */ 0xd5, 0xf5, 0x00, 0x00, 0xa6, 0xb6, 0xa1, 0xb1, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xa9, 0xb9, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0xaa, 0xba, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_3_page02[8] = { 0xa2, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_3_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0180) c = iso8859_3_page01[wc-0x0108]; else if (wc >= 0x02d8 && wc < 0x02e0) c = iso8859_3_page02[wc-0x02d8]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_14.h0000644000175000017500000001240613472116001016114 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-14 */ static const unsigned short iso8859_14_2uni[96] = { /* 0xa0 */ 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, /* 0xb0 */ 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, }; static int iso8859_14_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) *pwc = (ucs4_t) iso8859_14_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_14_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_14_page01_0[32] = { 0x00, 0x00, 0xa4, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char iso8859_14_page01_1[16] = { 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */ 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_14_page1e_0[136] = { 0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */ }; static const unsigned char iso8859_14_page1e_1[8] = { 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static int iso8859_14_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_14_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0128) c = iso8859_14_page01_0[wc-0x0108]; else if (wc >= 0x0170 && wc < 0x0180) c = iso8859_14_page01_1[wc-0x0170]; else if (wc >= 0x1e00 && wc < 0x1e88) c = iso8859_14_page1e_0[wc-0x1e00]; else if (wc >= 0x1ef0 && wc < 0x1ef8) c = iso8859_14_page1e_1[wc-0x1ef0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/cp1257.h0000644000175000017500000001305713472116001015404 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1257 */ static const unsigned short cp1257_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0x00a8, 0x02c7, 0x00b8, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0x00af, 0x02db, 0xfffd, /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0xfffd, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9, }; static int cp1257_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1257_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1257_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x8d, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x9d, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x8f, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1257_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1257_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1257_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1257_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1257_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1257_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/flushwc.h0000644000175000017500000000230513472116001016130 00000000000000/* * Copyright (C) 2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _FLUSHWC_H #define _FLUSHWC_H static int normal_flushwc (conv_t conv, ucs4_t *pwc) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } else return 0; } #endif /* _FLUSHWC_H */ fldigi-4.1.06/src/libtiniconv/encdec/cp936ext.h0000644000175000017500000000664713472116001016057 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 extensions */ static const unsigned short cp936ext_2uni_pagea6[181-159] = { /* 0xa6 */ 0xfe35, 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37, 0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, }; static const unsigned short cp936ext_2uni_pagea8[128-122] = { /* 0xa8 */ 0x0251, 0xfffd, 0x0144, 0x0148, 0xfffd, 0x0261, }; static int cp936ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0xa6) || (c1 == 0xa8)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; if (i < 7410) { if (i >= 7189 && i < 7211) wc = cp936ext_2uni_pagea6[i-7189]; } else { if (i >= 7532 && i < 7538) wc = cp936ext_2uni_pagea8[i-7532]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short cp936ext_page01[16] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ 0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ }; static const unsigned short cp936ext_page02[24] = { 0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ 0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ }; static const unsigned short cp936ext_pagefe[24] = { 0x0000, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0, /*0x30-0x37*/ 0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4, /*0x38-0x3f*/ 0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ }; static int cp936ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { unsigned short c = 0; if (wc >= 0x0140 && wc < 0x0150) c = cp936ext_page01[wc-0x0140]; else if (wc >= 0x0250 && wc < 0x0268) c = cp936ext_page02[wc-0x0250]; else if (wc >= 0xfe30 && wc < 0xfe48) c = cp936ext_pagefe[wc-0xfe30]; if (c != 0) { r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.1.06/src/libtiniconv/encdec/cp1254.h0000644000175000017500000001222713472116001015377 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1254 */ static const unsigned short cp1254_2uni_1[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, }; static const unsigned short cp1254_2uni_2[16] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, }; static const unsigned short cp1254_2uni_3[16] = { /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int cp1254_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xa0) { unsigned short wc = cp1254_2uni_1[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else if (c < 0xd0) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xe0) { *pwc = (ucs4_t) cp1254_2uni_2[c-0xd0]; return 1; } else if (c < 0xf0) { *pwc = (ucs4_t) c; return 1; } else { *pwc = (ucs4_t) cp1254_2uni_3[c-0xf0]; return 1; } return RET_ILSEQ; } static const unsigned char cp1254_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char cp1254_page01[128] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1254_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1254_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1254_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00d0) c = wc; else if (wc >= 0x00d0 && wc < 0x0100) c = cp1254_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0198) c = cp1254_page01[wc-0x0118]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1254_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1254_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/big5.h0000644000175000017500000077755513472116001015335 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5 */ static const unsigned short big5_2uni_pagea1[6121] = { /* 0xa1 */ 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, 0x2014, 0xfe33, 0xfffd, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, 0x203e, 0xfffd, 0xff3f, 0xfffd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xfffd, /* 0xa2 */ 0xfffd, 0xff0f, 0xff3c, 0xff04, 0x00a5, 0x3012, 0x00a2, 0x00a3, 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0xfffd, 0x5344, 0xfffd, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, /* 0xa3 */ 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa4 */ 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11, 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207, 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929, 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f, 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236, 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5, 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4, 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247, 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, /* 0xa5 */ 0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, 0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, 0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, 0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317, 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e, 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8, 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1, 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x592e, 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7, 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17, 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6, 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11, 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389, 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db, 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f, 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff, 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f, 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, /* 0xa6 */ 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x5f0f, 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263, 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2, 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64, 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50, 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d, 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001, 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c, 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e, 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621, 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34, 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38, 0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63, /* 0xa7 */ 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48, 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225, 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac, 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426, 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b, 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436, 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea, 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x5747, 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d, 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4, 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c, 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90, 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a, 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8, 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d, 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298, 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538, 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c, 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, /* 0xa8 */ 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076, 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2, 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3, 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093, 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x828b, 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d, 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2, 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6, 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a, 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab, 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b, 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b, 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238, 0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475, /* 0xa9 */ 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492, 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462, 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a, 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae, 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af, 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a, 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x5c46, 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18, 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97, 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80, 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff, 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021, 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e, 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9, 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8, 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da, 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e, 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602, 0x660e, 0x6600, 0x660f, 0x6615, 0x660a, /* 0xaa */ 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c, 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f, 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a, 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3, 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe, 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9, 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1, 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x7095, 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248, 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9, 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a, 0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940, 0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54, 0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1, 0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d, 0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1, 0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7, 0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, 0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580, 0x961c, 0x9640, 0x963f, 0x963b, 0x9644, /* 0xab */ 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae, 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd, 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0, 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192, 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b, 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b, 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8, 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x54c4, 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf, 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae, 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8, 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6, 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5, 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7, 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08, 0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, 0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, 0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, 0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7, /* 0xac */ 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545, 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f, 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1, 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef, 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de, 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83, 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32, 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x6d3b, 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38, 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3, 0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272, 0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb, 0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c, 0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701, 0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc, 0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947, 0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff, 0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04, 0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004, /* 0xad */ 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3, 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd, 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6, 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301, 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306, 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4, 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4, 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x8fed, 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b, 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762, 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df, 0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef, 0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f, 0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1, 0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a, 0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd, 0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d, 0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501, 0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9, 0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea, /* 0xae */ 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2, 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a, 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20, 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0, 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04, 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8, 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab, 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f, 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3, 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346, 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328, 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642, 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, 0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, 0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, 0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, 0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93, /* 0xaf */ 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a, 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9, 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8, 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de, 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7, 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b, 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728, 0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x7825, 0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f, 0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7, 0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06, 0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, 0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, 0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, 0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, 0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, /* 0xb0 */ 0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3, 0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18, 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16, 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7, 0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095, 0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd, 0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965b, 0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8, 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c, 0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e, 0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, 0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, 0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, 0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, 0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, 0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, 0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, 0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40, /* 0xb1 */ 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5, 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60, 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22, 0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, 0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, 0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, 0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, 0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5, 0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, 0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, 0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, 0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, 0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, 0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, 0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, 0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, 0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, 0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, 0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, 0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba, /* 0xb2 */ 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, 0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5, 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea, 0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, 0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d, 0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7, 0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, 0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, 0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, 0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, 0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, 0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, 0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, 0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, 0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, 0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, /* 0xb3 */ 0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, 0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, 0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, 0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, 0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, 0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, 0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, 0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8, 0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, 0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, 0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, 0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, 0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, 0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, 0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, 0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960, /* 0xb4 */ 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, 0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43, 0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, 0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, 0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, 0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, 0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2, 0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, 0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, 0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, 0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, 0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, 0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, /* 0xb5 */ 0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, 0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, 0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, 0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, 0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, 0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, 0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, 0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97, 0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, 0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, 0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, 0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, 0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, 0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, 0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, 0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, 0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, 0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, 0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, /* 0xb6 */ 0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, 0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, 0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, 0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, 0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, 0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, 0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593, 0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, 0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, 0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, /* 0xb7 */ 0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, 0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, 0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, 0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, 0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, 0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, 0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, 0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, 0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, 0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, 0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e, 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f, 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f, 0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601, 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df, 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, /* 0xb8 */ 0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, 0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, 0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, 0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, 0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, 0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, 0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179, 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, /* 0xb9 */ 0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, 0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, 0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, 0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, 0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, 0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, 0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd, 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3, 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617, 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616, 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e, 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925, 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7, 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5, 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84, 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6, 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, /* 0xba */ 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff, 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31, 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75, 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9, 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0, 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5, 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, /* 0xbb */ 0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, 0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, 0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, 0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, 0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, 0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x8aaa, 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d, 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc, 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c, 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118, 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291, 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c, 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817, 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1, 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3, 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, /* 0xbc */ 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e, 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e, 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e, 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb, 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb, 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2, 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7, 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495, 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499, 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4, 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd, 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11, 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84, 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e, 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f, 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b, 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, /* 0xbd */ 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5, 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b, 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7, 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb, 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9, 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x7fe9, 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517, 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c, 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8, 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e, /* 0xbe */ 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, 0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x9d03, 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3, 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668, 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be, 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e, 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be, 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc, 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4, 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8, 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44, 0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, /* 0xbf */ 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6, 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8, 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368, 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d, 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f, 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e, 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4, 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f, 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b, 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00, 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed, 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44, 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38, 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c, 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f, 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, /* 0xc0 */ 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b, 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b, 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb, 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12, 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121, 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x568f, 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a, 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c, 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234, 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1, 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94, 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90, 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1, 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6, 0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c, 0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac, /* 0xc1 */ 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901, 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7, 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9, 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b, 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35, 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070, 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, 0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab, 0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938, 0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, 0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, 0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d, 0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e, 0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc, 0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, /* 0xc2 */ 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233, 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7, 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2, 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe, 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8, 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2, 0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59, 0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, 0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a, 0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a, 0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9, 0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6, /* 0xc3 */ 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2, 0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5, 0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d, 0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85, 0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea, 0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9, 0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58, 0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, 0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, 0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, 0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, 0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, 0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e, /* 0xc4 */ 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7, 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6, 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727, 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662, 0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x7e82, 0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa, 0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba, 0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, 0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418, 0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8, 0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1, 0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d, 0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c, 0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f, 0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, /* 0xc5 */ 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf, 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b, 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957, 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d, 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19, 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9, 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61, 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, 0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, 0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, 0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, 0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, 0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, 0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, 0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, 0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, 0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92, /* 0xc6 */ 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063, 0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470, 0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a, 0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, 0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f, 0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x30fe, 0x309d, 0x309e, 0x3005, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, /* 0xc7 */ 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, }; static const unsigned short big5_2uni_pagec9[7652] = { /* 0xc9 */ 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, 0x4e8d, 0x56d7, 0xfa0c, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, 0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, 0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, 0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, 0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723, 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36, 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322, 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a, 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977, 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e, 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4, 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, /* 0xca */ 0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, 0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, 0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64, 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33, 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad, 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437, 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x543d, 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5, 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940, 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f, 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f, 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95, 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d, 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed, 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, /* 0xcb */ 0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, 0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, 0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, 0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, 0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, 0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x828a, 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5, 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33, 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74, 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79, 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82, 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392, 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b, 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9, 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, /* 0xcc */ 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034, 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d, 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb, 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6, 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798, 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791, 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25, 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee, 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2, 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, /* 0xcd */ 0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, 0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9, 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1, 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8, 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1, 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x77f7, 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd, 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220, 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7, 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9, 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d, 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5, 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d, 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9, 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb, 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249, 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398, 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, /* 0xce */ 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x5cde, 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf, 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22, 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3, 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c, 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e, 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303, 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313, 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa, 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622, 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f, 0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba, /* 0xcf */ 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb, 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee, 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc, 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9, 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6, 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d, 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04, 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x6d01, 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c, 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1, 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a, 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb, 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8, 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7, 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e, 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809, 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5, 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, /* 0xd0 */ 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9, 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd, 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8, 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1, 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x82e4, 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673, 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07, 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf, 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3, 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033, 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027, 0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca, 0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e, 0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2, 0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504, 0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1, /* 0xd1 */ 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b, 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6, 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9, 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15, 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad, 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1, 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa, 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x6041, 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095, 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2, 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4, 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4, 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f, 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816, 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844, 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d, 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34, 0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4, /* 0xd2 */ 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64, 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f, 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60, 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68, 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d, 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39, 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5, 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x7277, 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb, 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3, 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7, 0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b, 0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6, 0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823, 0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821, 0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c, 0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed, 0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b, 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10, /* 0xd3 */ 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09, 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85, 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f, 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d, 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e, 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100, 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x8342, 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324, 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353, 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2, 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686, 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695, 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883, 0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, 0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, 0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, 0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, 0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150, /* 0xd4 */ 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc, 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e, 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041, 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b, 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051, 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d, 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550c, 0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540, 0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc, 0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3, 0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1, 0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9, 0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67, 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, 0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69, 0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, 0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f, /* 0xd5 */ 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1, 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96, 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3, 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db, 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365, 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397, 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375, 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x6378, 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665, 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f, 0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, 0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, 0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, 0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, 0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, 0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, 0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, 0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, 0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9, /* 0xd6 */ 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb, 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104, 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8, 0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f, 0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff, 0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401, 0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b, 0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x75cb, 0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f, 0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b, 0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b, 0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94, 0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, 0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, 0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, 0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, 0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f, /* 0xd7 */ 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127, 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232, 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4, 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9, 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e, 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387, 0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x86c2, 0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8, 0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852, 0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1, 0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac, 0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30, 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, 0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea, 0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9, 0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1, 0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea, /* 0xd8 */ 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c, 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5, 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083, 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087, 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8, 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f, 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6, 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x5819, 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c, 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d, 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2, 0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, 0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, 0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, 0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, 0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, 0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, 0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, 0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, 0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114, /* 0xd9 */ 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc, 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104, 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8, 0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5, 0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4, 0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0, 0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568, 0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x667c, 0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701, 0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1, 0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910, 0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911, 0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8, 0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6, 0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7, 0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, 0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, 0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, 0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, 0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e, /* 0xda */ 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b, 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64, 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a, 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a, 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323, 0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x741a, 0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, 0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, 0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, 0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, 0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, 0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, 0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48, 0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, 0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, 0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, 0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, /* 0xdb */ 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050, 0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d, 0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204, 0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423, 0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410, 0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5, 0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9, 0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, 0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, 0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, 0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, 0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, 0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, 0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, 0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, 0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, /* 0xdc */ 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f, 0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, 0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, 0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, 0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689, 0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, 0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, 0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, 0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, 0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, 0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, 0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, /* 0xdd */ 0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, 0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, 0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, 0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, 0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, 0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, 0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, 0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, 0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, 0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, 0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, 0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, 0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, 0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48, 0x6b41, 0x6b9b, 0xfa0d, 0x6bfb, 0x6bfc, /* 0xde */ 0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, 0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, 0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, 0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, 0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, 0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, 0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x7144, 0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, 0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, 0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, 0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, 0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, 0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, 0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, 0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, 0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, 0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, 0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13, /* 0xdf */ 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, 0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70, 0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, 0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, 0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, 0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, 0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, 0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144, 0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, 0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, 0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, 0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, 0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, 0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, /* 0xe0 */ 0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, 0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, 0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, 0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, 0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, 0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, 0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, 0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044, 0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, 0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, 0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, 0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, 0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, 0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, 0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, 0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, 0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, /* 0xe1 */ 0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, 0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, 0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, 0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, 0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, 0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, 0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, 0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3, 0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, 0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, 0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, /* 0xe2 */ 0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, 0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, 0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, 0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, 0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, 0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, 0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, 0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36, 0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, 0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, 0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590, 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8, 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e, 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab, 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a, 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, /* 0xe3 */ 0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, 0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, 0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, 0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, 0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, 0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, 0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024, 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, /* 0xe4 */ 0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, 0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, 0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, 0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, 0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, 0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, 0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, 0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6, 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b, 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e, 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce, 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d, 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7, 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f, 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8, 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a, 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635, 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, /* 0xe5 */ 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b, 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27, 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6, 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25, 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5, 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41, 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, /* 0xe6 */ 0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, 0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, 0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, 0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, 0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, 0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, 0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x7362, 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488, 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619, 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d, 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb, 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4, 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76, 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac, 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc, 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03, 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76, 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, /* 0xe7 */ 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756, 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c, 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a, 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed, 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4, 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3, 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf, 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1, 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b, 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, /* 0xe8 */ 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a, 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182, 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6, 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc, 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd, 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x92b5, 0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0, 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a, 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829, 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3, 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc, 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43, 0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68, 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3, 0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de, 0x5334, 0x53e1, 0x5670, 0x5660, 0x566e, /* 0xe9 */ 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c, 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc, 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10, 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1, 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2, 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9, 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x61bf, 0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd, 0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c, 0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd, 0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67, 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50, 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7, 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad, 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, 0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, /* 0xea */ 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5, 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4, 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da, 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365, 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495, 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633, 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d, 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, 0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, 0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, 0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, 0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, 0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, 0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, 0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, 0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856b, 0x854d, 0x8553, 0x8561, 0x8558, /* 0xeb */ 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, 0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, 0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2, 0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, 0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, 0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, 0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, 0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, 0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, 0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, 0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, 0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325, 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, /* 0xec */ 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd, 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9, 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0, 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929, 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea, 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa, 0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d, 0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, 0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, 0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, 0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, 0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, 0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, 0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, /* 0xed */ 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a, 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9, 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde, 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2, 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2, 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510, 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, 0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, 0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, 0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, 0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, 0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, 0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, 0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, 0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, 0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e, /* 0xee */ 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, 0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, 0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, 0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, 0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, 0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18, 0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, 0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, 0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, 0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, 0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, 0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, 0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, /* 0xef */ 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a, 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933, 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1, 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb, 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01, 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1, 0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45, 0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, 0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, 0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, 0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, 0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, 0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, 0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, 0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, 0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, 0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, 0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, /* 0xf0 */ 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac, 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d, 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56, 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53, 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd, 0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949, 0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f, 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e, 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98, 0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60, 0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67, /* 0xf1 */ 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x97a2, 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851, 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09, 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0, 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c, 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8, 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f, 0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, 0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, 0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, 0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, 0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, 0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70, /* 0xf2 */ 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e, 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1, 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd, 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016, 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c, 0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x7921, 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c, 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78, 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b, 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7, 0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9, 0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8, 0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de, 0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c, 0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962, 0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959, 0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, /* 0xf3 */ 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a, 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d, 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51, 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad, 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec, 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3, 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, 0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, 0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, 0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, 0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, 0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, 0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, 0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, 0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, 0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2, /* 0xf4 */ 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b, 0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, 0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, 0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2, 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff, 0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, 0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, 0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, 0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, 0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, 0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, 0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, 0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff, /* 0xf5 */ 0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, 0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, 0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, 0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, 0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, 0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, 0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0, 0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, 0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, 0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, 0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, 0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, 0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, 0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, 0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, 0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88, 0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, /* 0xf6 */ 0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, 0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, 0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, 0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, 0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437, 0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, 0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, 0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, 0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, 0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, 0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, 0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, 0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, 0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, 0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, 0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, /* 0xf7 */ 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, 0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, 0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, 0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, 0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49, 0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, 0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, 0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, 0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, 0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, 0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, /* 0xf8 */ 0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, 0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, 0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, 0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, 0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, 0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, 0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71, 0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, 0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, 0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, 0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, 0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, 0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, 0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, 0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, 0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, 0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, /* 0xf9 */ 0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, 0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, 0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, 0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, 0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, 0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74, 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4, 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, 0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483, 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, }; static int big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa1 && c1 <= 0xc7) || (c1 >= 0xc9 && c1 <= 0xf9)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); unsigned short wc = 0xfffd; if (i < 6280) { if (i < 6121) wc = big5_2uni_pagea1[i]; } else { if (i < 13932) wc = big5_2uni_pagec9[i-6280]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short big5_2charset[13703] = { 0xa246, 0xa247, 0xa244, 0xa1b1, 0xa258, 0xa1d3, 0xa150, 0xa1d1, 0xa1d2, 0xa3be, 0xa3bc, 0xa3bd, 0xa3bf, 0xa3bb, 0xa344, 0xa345, 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c, 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355, 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d, 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373, 0xc7b3, 0xc7b1, 0xc7b2, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7ce, 0xa156, 0xa158, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa145, 0xa14c, 0xa14b, 0xa1ac, 0xa1ab, 0xa1b0, 0xa1c2, 0xa24a, 0xa1c1, 0xa24b, 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2, 0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0xa1f8, 0xa1f9, 0xa1fb, 0xa1fa, 0xa1d4, 0xa1db, 0xa1e8, 0xa1e7, 0xa1fd, 0xa1fc, 0xa1e4, 0xa1e5, 0xa1ec, 0xa1ed, 0xa1ef, 0xa1ee, 0xa1e3, 0xa1dc, 0xa1da, 0xa1dd, 0xa1d8, 0xa1d9, 0xa1e6, 0xa1e9, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xa277, 0xa278, 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa275, 0xa274, 0xa273, 0xa272, 0xa271, 0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa27e, 0xa2a1, 0xa2a3, 0xa2a2, 0xa2ac, 0xa2ad, 0xa2ae, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266, 0xa267, 0xa268, 0xa269, 0xa270, 0xa26f, 0xa26e, 0xa26d, 0xa26c, 0xa26b, 0xa26a, 0xa276, 0xa279, 0xa1bd, 0xa1bc, 0xa1b6, 0xa1b5, 0xa1bf, 0xa1be, 0xa1bb, 0xa1ba, 0xa1b3, 0xa1b7, 0xa1b4, 0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0xa1b9, 0xa1b8, 0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa140, 0xa142, 0xa143, 0xa1b2, 0xc6a4, 0xa171, 0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179, 0xa17a, 0xa169, 0xa16a, 0xa245, 0xa165, 0xa166, 0xa1a9, 0xa1aa, 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6a2, 0xc6a3, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc6a1, 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9, 0xa3ba, 0xa1c0, 0xa255, 0xa256, 0xa250, 0xa251, 0xa252, 0xa254, 0xa257, 0xa253, 0xa1eb, 0xa1ea, 0xa24f, 0xa440, 0xa442, 0xa443, 0xc945, 0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3, 0xc94f, 0xc94d, 0xa4a2, 0xa4a1, 0xa542, 0xa541, 0xa540, 0xa543, 0xa4fe, 0xa5e0, 0xa5e1, 0xa8c3, 0xa458, 0xa4a4, 0xc950, 0xa4a5, 0xc963, 0xa6ea, 0xcbb1, 0xa459, 0xa4a6, 0xa544, 0xc964, 0xc940, 0xa444, 0xa45b, 0xc947, 0xa45c, 0xa4a7, 0xa545, 0xa547, 0xa546, 0xa5e2, 0xa5e3, 0xa8c4, 0xadbc, 0xa441, 0xc941, 0xa445, 0xa45e, 0xa45d, 0xa5e4, 0xa8c5, 0xb0ae, 0xd44b, 0xb6c3, 0xdcb1, 0xdcb2, 0xa446, 0xa4a9, 0xa8c6, 0xa447, 0xc948, 0xa45f, 0xa4aa, 0xa4ac, 0xc951, 0xa4ad, 0xa4ab, 0xa5e5, 0xa8c7, 0xa8c8, 0xab45, 0xa460, 0xa4ae, 0xa5e6, 0xa5e8, 0xa5e7, 0xa6eb, 0xa8c9, 0xa8ca, 0xab46, 0xab47, 0xadbd, 0xdcb3, 0xf6d6, 0xa448, 0xa4b0, 0xa4af, 0xc952, 0xa4b1, 0xa4b7, 0xa4b2, 0xa4b3, 0xc954, 0xc953, 0xa4b5, 0xa4b6, 0xa4b4, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa549, 0xa550, 0xc96a, 0xc966, 0xc969, 0xa551, 0xa561, 0xc968, 0xa54e, 0xa54f, 0xa548, 0xc965, 0xc967, 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae, 0xa5f3, 0xc9b2, 0xa5f4, 0xa5f7, 0xa5e9, 0xc9b1, 0xa5f8, 0xc9b5, 0xc9b9, 0xc9b6, 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9, 0xa5ee, 0xc9ab, 0xa5f1, 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af, 0xa5ed, 0xc9ac, 0xa5eb, 0xc9b4, 0xc9b7, 0xc9ad, 0xca66, 0xa742, 0xa6f4, 0xca67, 0xa6f1, 0xa744, 0xa6f9, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7, 0xca60, 0xca68, 0xca64, 0xa6fa, 0xa6fd, 0xa6ee, 0xa747, 0xca5d, 0xcbbd, 0xa6ec, 0xa743, 0xa6ed, 0xa6f5, 0xa6f6, 0xca62, 0xca5e, 0xa6fb, 0xa6f3, 0xca5a, 0xa6ef, 0xca65, 0xa745, 0xa748, 0xa6f2, 0xa740, 0xa746, 0xa6f0, 0xca63, 0xa741, 0xca69, 0xca5c, 0xa6fe, 0xca5f, 0xca61, 0xa8d8, 0xcbbf, 0xcbcb, 0xa8d0, 0xcbcc, 0xa8cb, 0xa8d5, 0xa8ce, 0xcbb9, 0xa8d6, 0xcbb8, 0xcbbc, 0xcbc3, 0xcbc1, 0xa8de, 0xa8d9, 0xcbb3, 0xcbb5, 0xa8db, 0xa8cf, 0xcbb6, 0xcbc2, 0xcbc9, 0xa8d4, 0xcbbb, 0xcbb4, 0xa8d3, 0xcbb7, 0xa8d7, 0xcbba, 0xa8d2, 0xa8cd, 0xa8dc, 0xcbc4, 0xa8dd, 0xcbc8, 0xcbc6, 0xcbca, 0xa8da, 0xcbbe, 0xcbb2, 0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0xab56, 0xab4a, 0xcde0, 0xcde8, 0xab49, 0xab51, 0xab5d, 0xcdee, 0xcdec, 0xcde7, 0xab4b, 0xcded, 0xcde3, 0xab59, 0xab50, 0xab58, 0xcdde, 0xcdea, 0xcde1, 0xab54, 0xcde2, 0xcddd, 0xab5b, 0xab4e, 0xab57, 0xab4d, 0xcddf, 0xcde4, 0xcdeb, 0xab55, 0xab52, 0xcde6, 0xab5a, 0xcde9, 0xcde5, 0xab4f, 0xab5c, 0xab53, 0xab4c, 0xab48, 0xcdef, 0xadd7, 0xadc1, 0xadd1, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4, 0xd0d5, 0xadc4, 0xadcd, 0xadda, 0xadce, 0xd0c9, 0xadc7, 0xd0ca, 0xaddc, 0xadd3, 0xadbe, 0xadbf, 0xd0dd, 0xb0bf, 0xadcc, 0xadcb, 0xd0cb, 0xadcf, 0xd45b, 0xadc6, 0xd0d6, 0xadd5, 0xadd4, 0xadca, 0xd0ce, 0xd0d7, 0xd0c8, 0xadc9, 0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0xadc3, 0xadc2, 0xd0d9, 0xadd0, 0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8, 0xd0db, 0xd0cd, 0xd0dc, 0xd0d1, 0xd0da, 0xd0d2, 0xadc8, 0xd463, 0xd457, 0xb0b3, 0xd45c, 0xd462, 0xb0b2, 0xd455, 0xb0b6, 0xd459, 0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be, 0xd467, 0xd451, 0xb0ba, 0xd466, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f, 0xd45d, 0xd450, 0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0xd85b, 0xd45e, 0xd44d, 0xd45f, 0xb0c1, 0xd464, 0xb0c0, 0xd44c, 0xd454, 0xd465, 0xb0bc, 0xb0bb, 0xb0b8, 0xb0bd, 0xb0af, 0xb0b0, 0xb3c8, 0xd85e, 0xd857, 0xb3c5, 0xd85f, 0xd855, 0xd858, 0xb3c4, 0xd859, 0xb3c7, 0xd85d, 0xd853, 0xd852, 0xb3c9, 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c, 0xd85a, 0xd854, 0xb3c3, 0xd856, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd, 0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb, 0xdcc4, 0xdcbf, 0xb6cc, 0xdcb4, 0xb6c9, 0xdcb5, 0xdcbe, 0xdcbc, 0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce, 0xdcbb, 0xdcc2, 0xdcb9, 0xdcc1, 0xb9b6, 0xb9b3, 0xb9b4, 0xe0f9, 0xe0f1, 0xb9b2, 0xb9af, 0xe0f2, 0xb9b1, 0xe0f5, 0xe0f7, 0xe0fe, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0, 0xb9ac, 0xe0f3, 0xb9b7, 0xe0f6, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc, 0xe0fb, 0xb9b5, 0xe0f4, 0xbbf8, 0xe4ec, 0xe4e9, 0xbbf9, 0xbbf7, 0xe4f0, 0xe4ed, 0xe4e6, 0xbbf6, 0xbbfa, 0xe4e7, 0xbbf5, 0xbbfd, 0xe4ea, 0xe4eb, 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef, 0xbeaa, 0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab, 0xe8f6, 0xbea8, 0xe8f7, 0xe8f4, 0xc076, 0xecbd, 0xc077, 0xecbb, 0xecbc, 0xecba, 0xecb9, 0xecbe, 0xc075, 0xefb8, 0xefb9, 0xe4e8, 0xefb7, 0xc078, 0xc35f, 0xf1eb, 0xf1ec, 0xc4d7, 0xc4d8, 0xf5c1, 0xf5c0, 0xc56c, 0xc56b, 0xf7d0, 0xa449, 0xa461, 0xa4b9, 0xa4b8, 0xa553, 0xa552, 0xa5fc, 0xa5fb, 0xa5fd, 0xa5fa, 0xa74a, 0xa749, 0xa74b, 0xa8e0, 0xa8df, 0xa8e1, 0xab5e, 0xa259, 0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b, 0xd860, 0xa25d, 0xb9b8, 0xa25e, 0xa44a, 0xa4ba, 0xa5fe, 0xa8e2, 0xa44b, 0xa4bd, 0xa4bb, 0xa4bc, 0xa640, 0xa74c, 0xa8e4, 0xa8e3, 0xa8e5, 0xaddd, 0xbeac, 0xc94e, 0xa554, 0xa555, 0xa641, 0xca6a, 0xab60, 0xab5f, 0xd0e0, 0xd0df, 0xb0c3, 0xa4be, 0xc955, 0xcbcd, 0xab61, 0xade0, 0xadde, 0xaddf, 0xbead, 0xa556, 0xa642, 0xc9bc, 0xa74d, 0xa74e, 0xca6b, 0xcbce, 0xa8e6, 0xcbcf, 0xd0e2, 0xd0e3, 0xade3, 0xd0e4, 0xd0e1, 0xade4, 0xade2, 0xade1, 0xd0e5, 0xd468, 0xd861, 0xdcc5, 0xe140, 0xbbfe, 0xbeae, 0xe8f9, 0xa44c, 0xa45a, 0xb0c4, 0xb3cd, 0xb9b9, 0xc942, 0xa4bf, 0xa559, 0xa557, 0xa558, 0xa8e7, 0xa44d, 0xa44e, 0xa462, 0xa4c0, 0xa4c1, 0xa4c2, 0xc9be, 0xa55a, 0xc96b, 0xa646, 0xc9bf, 0xa644, 0xa645, 0xc9bd, 0xa647, 0xa643, 0xca6c, 0xaaec, 0xca6d, 0xca6e, 0xa750, 0xa74f, 0xa753, 0xa751, 0xa752, 0xa8ed, 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0xcbd0, 0xa8ee, 0xa8ea, 0xa8e9, 0xa8eb, 0xa8e8, 0xa8ef, 0xab63, 0xcdf0, 0xcbd3, 0xab68, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62, 0xd0e8, 0xade7, 0xd0eb, 0xade5, 0xd0e7, 0xade8, 0xade6, 0xade9, 0xd0e9, 0xd0ea, 0xd0e6, 0xd0ec, 0xb3d1, 0xb0c5, 0xd469, 0xd46b, 0xd46a, 0xd46c, 0xb0c6, 0xb3ce, 0xb3cf, 0xb3d0, 0xb6d0, 0xdcc7, 0xdcc6, 0xdcc8, 0xdcc9, 0xb6d1, 0xb6cf, 0xe141, 0xe142, 0xb9bb, 0xb9ba, 0xe35a, 0xbc40, 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3, 0xbc43, 0xbeaf, 0xbeb0, 0xf1ed, 0xf5c3, 0xf5c2, 0xf7d1, 0xa44f, 0xa55c, 0xa55b, 0xa648, 0xc9c0, 0xa755, 0xa756, 0xa754, 0xa757, 0xca6f, 0xca70, 0xa8f1, 0xcbd5, 0xa8f0, 0xcdf2, 0xab6c, 0xcdf3, 0xab6b, 0xab69, 0xab6a, 0xd0ed, 0xb0c7, 0xd46e, 0xb0ca, 0xd46d, 0xb1e5, 0xb0c9, 0xb0c8, 0xb3d4, 0xb3d3, 0xb3d2, 0xb6d2, 0xb6d5, 0xb6d6, 0xb6d4, 0xb6d3, 0xe143, 0xe144, 0xe4f5, 0xbc45, 0xe4f4, 0xbeb1, 0xecbf, 0xc079, 0xf1ee, 0xc455, 0xa463, 0xa4c3, 0xc956, 0xa4c4, 0xa4c5, 0xa55d, 0xa55e, 0xa649, 0xca71, 0xcbd6, 0xcbd7, 0xab6d, 0xd0ee, 0xb0cc, 0xb0cb, 0xd863, 0xd862, 0xa450, 0xa4c6, 0xa55f, 0xb0cd, 0xc943, 0xc96c, 0xa560, 0xc9c2, 0xa64b, 0xa64a, 0xc9c1, 0xa758, 0xadea, 0xd46f, 0xb6d7, 0xe145, 0xb9bc, 0xe8fa, 0xf3fd, 0xa4c7, 0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce, 0xb0cf, 0xa451, 0xa464, 0xa2cd, 0xa4ca, 0xa4c9, 0xa4c8, 0xa563, 0xa562, 0xc96d, 0xc9c3, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0xab6e, 0xb3d5, 0xa452, 0xa4cb, 0xa565, 0xa564, 0xca72, 0xa8f6, 0xc957, 0xa567, 0xa566, 0xa64c, 0xa64d, 0xca73, 0xa759, 0xa75a, 0xa8f7, 0xa8f8, 0xa8f9, 0xab6f, 0xcdf5, 0xadeb, 0xc944, 0xa4cc, 0xc9c4, 0xca74, 0xca75, 0xcbd9, 0xcbda, 0xcdf7, 0xcdf6, 0xcdf9, 0xcdf8, 0xab70, 0xd470, 0xaded, 0xd0ef, 0xadec, 0xd864, 0xb3d6, 0xd865, 0xe146, 0xb9bd, 0xbc46, 0xf1ef, 0xc958, 0xa568, 0xb0d1, 0xa453, 0xa465, 0xa4ce, 0xa4cd, 0xa4cf, 0xa8fb, 0xa8fa, 0xa8fc, 0xab71, 0xadee, 0xe8fb, 0xc24f, 0xa466, 0xa56a, 0xa579, 0xa574, 0xa56f, 0xa56e, 0xa575, 0xa573, 0xa56c, 0xa57a, 0xa56d, 0xa569, 0xa578, 0xa577, 0xa576, 0xa56b, 0xa572, 0xa571, 0xa57b, 0xa570, 0xa653, 0xa659, 0xa655, 0xa65b, 0xc9c5, 0xa658, 0xa64e, 0xa651, 0xa654, 0xa650, 0xa657, 0xa65a, 0xa64f, 0xa652, 0xa656, 0xa65c, 0xca7e, 0xca7b, 0xa767, 0xca7c, 0xa75b, 0xa75d, 0xa775, 0xa770, 0xcaa5, 0xca7d, 0xa75f, 0xa761, 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d, 0xca76, 0xa773, 0xa764, 0xa76e, 0xa76f, 0xca77, 0xa76c, 0xa76a, 0xa76b, 0xa771, 0xcaa1, 0xa75e, 0xa772, 0xcaa3, 0xa766, 0xa763, 0xca7a, 0xa762, 0xcaa6, 0xa765, 0xa769, 0xa760, 0xcaa2, 0xca79, 0xcbeb, 0xcbea, 0xa94f, 0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee, 0xa950, 0xcbe1, 0xcbe5, 0xcbe9, 0xce49, 0xa94b, 0xce4d, 0xa8fd, 0xcbe6, 0xa8fe, 0xa94c, 0xa945, 0xa941, 0xcbe2, 0xa944, 0xa949, 0xa952, 0xcbe3, 0xcbdc, 0xa943, 0xcbdd, 0xcbdf, 0xa946, 0xa948, 0xcbdb, 0xcbe0, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0xa94a, 0xcbde, 0xa947, 0xa942, 0xa940, 0xcbec, 0xa94e, 0xce48, 0xcdfb, 0xce4b, 0xcdfd, 0xab78, 0xaba8, 0xab74, 0xaba7, 0xab7d, 0xaba4, 0xab72, 0xcdfc, 0xce43, 0xaba3, 0xce4f, 0xaba5, 0xab79, 0xce45, 0xce42, 0xab77, 0xcdfa, 0xaba6, 0xce4a, 0xab7c, 0xce4c, 0xaba9, 0xab73, 0xab7e, 0xab7b, 0xce40, 0xaba1, 0xce46, 0xce47, 0xab7a, 0xaba2, 0xab76, 0xab75, 0xcdfe, 0xce44, 0xce4e, 0xd144, 0xadfb, 0xd0f1, 0xd0f6, 0xadf4, 0xae40, 0xd0f4, 0xadef, 0xadf9, 0xadfe, 0xd0fb, 0xadfa, 0xadfd, 0xd0fe, 0xadf5, 0xd0f5, 0xd142, 0xd143, 0xadf7, 0xd141, 0xadf3, 0xae43, 0xd0f8, 0xadf1, 0xd146, 0xd0f9, 0xd0fd, 0xadf6, 0xae42, 0xd0fa, 0xadfc, 0xd140, 0xd147, 0xd4a1, 0xd145, 0xae44, 0xadf0, 0xd0fc, 0xd0f3, 0xadf8, 0xd0f2, 0xd0f7, 0xd0f0, 0xae41, 0xd477, 0xb0e4, 0xd4a7, 0xb0e2, 0xb0df, 0xd47c, 0xb0db, 0xd4a2, 0xb0e6, 0xd476, 0xd47b, 0xd47a, 0xadf2, 0xb0e1, 0xd4a5, 0xd4a8, 0xd473, 0xb3e8, 0xd4a9, 0xb0e7, 0xb0d9, 0xb0d6, 0xd47e, 0xb0d3, 0xd4a6, 0xb0da, 0xd4aa, 0xd474, 0xd4a4, 0xb0dd, 0xd475, 0xd478, 0xd47d, 0xb0de, 0xb0dc, 0xb0e8, 0xb0e3, 0xb0d7, 0xb1d2, 0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0xb0d4, 0xd471, 0xd472, 0xd86a, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878, 0xb3d8, 0xd871, 0xb3de, 0xb3e4, 0xb5bd, 0xb3e2, 0xd86e, 0xb3ef, 0xb3db, 0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f, 0xd866, 0xd873, 0xd86d, 0xb3e1, 0xd879, 0xb3dd, 0xb3f1, 0xb3ea, 0xb3df, 0xb3dc, 0xb3e7, 0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9, 0xd867, 0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0xb3ed, 0xb3e9, 0xb3e5, 0xd870, 0xb3eb, 0xdcd5, 0xdcd1, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5, 0xb6e6, 0xb6de, 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde, 0xb6dc, 0xdcd8, 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9, 0xdcdb, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0, 0xb6d8, 0xb6e4, 0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db, 0xa25f, 0xb6d9, 0xdcd4, 0xb6e2, 0xdcdd, 0xb9cd, 0xb9c8, 0xe155, 0xe151, 0xe14b, 0xb9c2, 0xb9be, 0xe154, 0xb9bf, 0xe14e, 0xe150, 0xe153, 0xb9c4, 0xb9cb, 0xb9c5, 0xe149, 0xb9c6, 0xb9c7, 0xe14c, 0xb9cc, 0xe14a, 0xe14f, 0xb9c3, 0xe148, 0xb9c9, 0xb9c1, 0xb9c0, 0xe14d, 0xe152, 0xb9ca, 0xe147, 0xbc4d, 0xe547, 0xe544, 0xbc47, 0xbc53, 0xbc54, 0xbc4a, 0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0xe546, 0xbc49, 0xe548, 0xbc48, 0xe543, 0xe545, 0xbc4b, 0xe541, 0xe4fa, 0xe4f7, 0xd86b, 0xe4fd, 0xe4f6, 0xe4fc, 0xe4fb, 0xe4f8, 0xbc4f, 0xbc4e, 0xbc50, 0xe4fe, 0xbeb2, 0xe540, 0xe945, 0xe8fd, 0xbebe, 0xe942, 0xbeb6, 0xbeba, 0xe941, 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3, 0xbebd, 0xe943, 0xe8fe, 0xbebc, 0xe8fc, 0xbebb, 0xe944, 0xe940, 0xbc51, 0xbebf, 0xe946, 0xbeb7, 0xbeb4, 0xecc6, 0xecc8, 0xc07b, 0xecc9, 0xecc7, 0xecc5, 0xecc4, 0xc07d, 0xecc3, 0xc07e, 0xecc1, 0xecc2, 0xc07a, 0xc0a1, 0xc07c, 0xecc0, 0xc250, 0xefbc, 0xefba, 0xefbf, 0xefbd, 0xefbb, 0xefbe, 0xc360, 0xf1f2, 0xf1f3, 0xc456, 0xf1f4, 0xf1f0, 0xf1f5, 0xf1f1, 0xc251, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457, 0xc45a, 0xf5c5, 0xf5c6, 0xc4da, 0xc4d9, 0xc4db, 0xf5c4, 0xf6d8, 0xf6d7, 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8, 0xf8a6, 0xc5f1, 0xf8a5, 0xf8ee, 0xc949, 0xa57d, 0xa57c, 0xa65f, 0xa65e, 0xc9c7, 0xa65d, 0xc9c6, 0xa779, 0xcaa9, 0xcaa8, 0xa777, 0xa77a, 0xcaa7, 0xa778, 0xcbf0, 0xcbf1, 0xa954, 0xabaa, 0xd148, 0xd149, 0xae45, 0xae46, 0xd4ac, 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c, 0xb3f2, 0xb6e9, 0xb6ea, 0xdce1, 0xb9cf, 0xb9ce, 0xe549, 0xe948, 0xe947, 0xf96b, 0xa467, 0xc959, 0xc96e, 0xc96f, 0xa662, 0xa666, 0xc9c9, 0xa664, 0xa663, 0xc9c8, 0xa665, 0xa661, 0xa660, 0xc9ca, 0xa7a6, 0xa7a3, 0xa77d, 0xcaaa, 0xcaab, 0xa7a1, 0xcaad, 0xa77b, 0xcaae, 0xcaac, 0xa77e, 0xa7a2, 0xa7a5, 0xa7a4, 0xa77c, 0xcaaf, 0xa959, 0xcbfe, 0xa95b, 0xa95a, 0xcc40, 0xa958, 0xa957, 0xcbf5, 0xcbf4, 0xcbf2, 0xcbf7, 0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8, 0xa956, 0xcbfb, 0xa95c, 0xcc41, 0xcbf9, 0xabab, 0xa955, 0xabac, 0xce54, 0xce5a, 0xabb2, 0xce58, 0xce5e, 0xce55, 0xce59, 0xce5b, 0xce5d, 0xce57, 0xce56, 0xce51, 0xce52, 0xabad, 0xabaf, 0xabae, 0xce53, 0xce5c, 0xabb1, 0xce50, 0xd153, 0xd152, 0xd157, 0xd14e, 0xd151, 0xd150, 0xd154, 0xd158, 0xae47, 0xae4a, 0xd14f, 0xd155, 0xae49, 0xd14a, 0xabb0, 0xd4ba, 0xd156, 0xd14d, 0xae48, 0xd14c, 0xd4b1, 0xb0ec, 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1, 0xd4bf, 0xd4c5, 0xd4c9, 0xd4c0, 0xd4b4, 0xd4bc, 0xd4ca, 0xd4c8, 0xd4be, 0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5, 0xd4b7, 0xb0f6, 0xb0f2, 0xd4ad, 0xd4c3, 0xd4b5, 0xd4b3, 0xd4c6, 0xb0f3, 0xd4cc, 0xb0ed, 0xb0ef, 0xd4bb, 0xd4b6, 0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb, 0xd4c2, 0xd4c4, 0xd4ae, 0xd8a1, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2, 0xb3fb, 0xb3f9, 0xd8a4, 0xb3f6, 0xd8a8, 0xd8a3, 0xd8a5, 0xd87d, 0xb3f4, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3, 0xb3f7, 0xb3f8, 0xd14b, 0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e, 0xd8b0, 0xd8af, 0xd8b3, 0xdcef, 0xd8ac, 0xd8a7, 0xdce7, 0xb6f4, 0xb6f7, 0xb6f2, 0xdce6, 0xdcea, 0xdce5, 0xb6ec, 0xb6f6, 0xdce2, 0xb6f0, 0xdce9, 0xb6ee, 0xb6ed, 0xdcec, 0xb6ef, 0xdcee, 0xdceb, 0xb6eb, 0xb6f5, 0xdcf0, 0xdce4, 0xdced, 0xdce3, 0xb6f1, 0xb6f3, 0xdce8, 0xdcf1, 0xe15d, 0xb9d0, 0xe163, 0xb9d5, 0xe15f, 0xe166, 0xe157, 0xb9d7, 0xb9d1, 0xe15c, 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0xb9d6, 0xe15a, 0xe160, 0xe165, 0xe156, 0xb9d4, 0xe15e, 0xe162, 0xe168, 0xe158, 0xe161, 0xb9d3, 0xe167, 0xe159, 0xbc59, 0xe54b, 0xbc57, 0xbc56, 0xe54d, 0xe552, 0xe54e, 0xe551, 0xbc5c, 0xbea5, 0xbc5b, 0xe54a, 0xe550, 0xbc5a, 0xe54f, 0xe54c, 0xbc58, 0xe94d, 0xe94f, 0xe94a, 0xbec1, 0xe94c, 0xbec0, 0xe94e, 0xbec3, 0xe950, 0xbec2, 0xe949, 0xe94b, 0xc0a5, 0xeccc, 0xc0a4, 0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca, 0xc253, 0xc252, 0xf1f6, 0xf1f8, 0xf1f7, 0xc361, 0xc362, 0xc363, 0xf442, 0xc45b, 0xf7d3, 0xf7d2, 0xc5f2, 0xa468, 0xa4d0, 0xa7a7, 0xce5f, 0xb3fc, 0xb3fd, 0xdcf2, 0xb9d8, 0xe169, 0xe553, 0xc95a, 0xcab0, 0xcc42, 0xce60, 0xd159, 0xae4c, 0xf1f9, 0xc4dc, 0xa469, 0xa57e, 0xc970, 0xa667, 0xa668, 0xa95d, 0xb0f7, 0xb9da, 0xb9db, 0xb9d9, 0xa46a, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b, 0xa4d4, 0xa5a1, 0xc971, 0xa5a2, 0xa669, 0xa66a, 0xc9cb, 0xa7a8, 0xcab1, 0xa961, 0xcc43, 0xa95f, 0xa960, 0xa95e, 0xd15a, 0xabb6, 0xabb5, 0xabb7, 0xabb4, 0xce61, 0xa962, 0xabb3, 0xae4d, 0xae4e, 0xae4f, 0xd4cd, 0xb3fe, 0xd8b4, 0xb0f8, 0xb6f8, 0xb9dd, 0xb9dc, 0xe16a, 0xbc5d, 0xbec4, 0xefc0, 0xf6da, 0xf7d4, 0xa46b, 0xa5a3, 0xa5a4, 0xc9d1, 0xa66c, 0xa66f, 0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2, 0xc9cc, 0xa671, 0xa670, 0xa66d, 0xa66b, 0xc9ce, 0xa7b3, 0xa7b0, 0xcab6, 0xcab9, 0xcab8, 0xa7aa, 0xa7b2, 0xa7af, 0xcab5, 0xcab3, 0xa7ae, 0xa7a9, 0xa7ac, 0xcab4, 0xcabb, 0xcab7, 0xa7ad, 0xa7b1, 0xa7b4, 0xcab2, 0xcaba, 0xa7ab, 0xa967, 0xa96f, 0xcc4f, 0xcc48, 0xa970, 0xcc53, 0xcc44, 0xcc4b, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50, 0xa963, 0xcc51, 0xcc4a, 0xcc4d, 0xa972, 0xa969, 0xcc54, 0xcc52, 0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46, 0xa96a, 0xa968, 0xa971, 0xa96d, 0xa965, 0xcc4e, 0xabb9, 0xabc0, 0xce6f, 0xabb8, 0xce67, 0xce63, 0xce73, 0xce62, 0xabbb, 0xce6c, 0xabbe, 0xabc1, 0xabbc, 0xce70, 0xabbf, 0xae56, 0xce76, 0xce64, 0xce66, 0xce6d, 0xce71, 0xce75, 0xce72, 0xce6b, 0xce6e, 0xce68, 0xabc3, 0xce6a, 0xce69, 0xce74, 0xabba, 0xce65, 0xabc2, 0xabbd, 0xae5c, 0xd162, 0xae5b, 0xd160, 0xae50, 0xae55, 0xd15f, 0xd15c, 0xd161, 0xae51, 0xd15b, 0xae54, 0xae52, 0xd163, 0xae53, 0xae57, 0xae58, 0xae5a, 0xae59, 0xd15d, 0xd15e, 0xd164, 0xd4d4, 0xb0f9, 0xd8c2, 0xd4d3, 0xd4e6, 0xb140, 0xd4e4, 0xb0fe, 0xb0fa, 0xd4ed, 0xd4dd, 0xd4e0, 0xb143, 0xd4ea, 0xd4e2, 0xb0fb, 0xb144, 0xd4e7, 0xd4e5, 0xd4d6, 0xd4eb, 0xd4df, 0xd4da, 0xd4d0, 0xd4ec, 0xd4dc, 0xd4cf, 0xb142, 0xd4e1, 0xd4ee, 0xd4de, 0xd4d2, 0xd4d7, 0xd4ce, 0xb141, 0xd4db, 0xd4d8, 0xb0fc, 0xd4d1, 0xd4e9, 0xb0fd, 0xd4d9, 0xd4d5, 0xd4e8, 0xb440, 0xd8bb, 0xd8b8, 0xd8c9, 0xd8bd, 0xd8ca, 0xb442, 0xd8c6, 0xd8c3, 0xd8c4, 0xd8c7, 0xd8cb, 0xd4e3, 0xd8cd, 0xdd47, 0xb443, 0xd8ce, 0xd8b6, 0xd8c0, 0xd8c5, 0xb441, 0xb444, 0xd8cc, 0xd8cf, 0xd8ba, 0xd8b7, 0xd8b9, 0xd8be, 0xd8bc, 0xb445, 0xd8c8, 0xd8bf, 0xd8c1, 0xd8b5, 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9, 0xdd44, 0xdd40, 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd, 0xb6fc, 0xdcfb, 0xdd41, 0xb6f9, 0xb741, 0xdcf4, 0xdcfe, 0xdcf3, 0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0xe16e, 0xb9e2, 0xb9e1, 0xb9e3, 0xe17a, 0xe170, 0xe176, 0xe16b, 0xe179, 0xe178, 0xe17c, 0xe175, 0xb9de, 0xe174, 0xb9e4, 0xe16d, 0xb9df, 0xe17b, 0xb9e0, 0xe16f, 0xe172, 0xe177, 0xe171, 0xe16c, 0xe173, 0xe555, 0xbc61, 0xe558, 0xe557, 0xe55a, 0xe55c, 0xbc5f, 0xe556, 0xe554, 0xe55d, 0xe55b, 0xe559, 0xe55f, 0xe55e, 0xbc63, 0xbc5e, 0xbc60, 0xbc62, 0xe560, 0xe957, 0xe956, 0xe955, 0xe958, 0xe951, 0xe952, 0xe95a, 0xe953, 0xbec5, 0xe95c, 0xe95b, 0xe954, 0xecd1, 0xc0a8, 0xeccf, 0xecd4, 0xecd3, 0xe959, 0xc0a7, 0xecd2, 0xecce, 0xecd6, 0xecd5, 0xc0a6, 0xecd0, 0xbec6, 0xc254, 0xefc1, 0xf1fa, 0xf1fb, 0xf1fc, 0xc45c, 0xc45d, 0xf443, 0xf5c8, 0xf5c7, 0xf6db, 0xf6dc, 0xf7d5, 0xf8a7, 0xa46c, 0xa46d, 0xa46e, 0xa4d5, 0xa5a5, 0xc9d3, 0xa672, 0xa673, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5, 0xa973, 0xcc55, 0xa975, 0xa974, 0xcc56, 0xabc4, 0xae5d, 0xd165, 0xd4f0, 0xb145, 0xb447, 0xd4ef, 0xb446, 0xb9e5, 0xe17d, 0xbec7, 0xc0a9, 0xecd7, 0xc45e, 0xc570, 0xc972, 0xa5a6, 0xc973, 0xa676, 0xa674, 0xa675, 0xa677, 0xa7ba, 0xa7b9, 0xcabc, 0xa7bb, 0xcabd, 0xcc57, 0xcc58, 0xa976, 0xa978, 0xa97a, 0xa977, 0xa97b, 0xa979, 0xabc8, 0xabc5, 0xabc7, 0xabc9, 0xabc6, 0xd166, 0xce77, 0xd168, 0xd167, 0xae63, 0xae5f, 0xae60, 0xae62, 0xae64, 0xae61, 0xae66, 0xae65, 0xb14a, 0xd4f2, 0xd4f1, 0xb149, 0xb148, 0xb147, 0xb14b, 0xb146, 0xd8d5, 0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0xb44b, 0xd8d4, 0xb448, 0xb44a, 0xd8d3, 0xdd48, 0xdd49, 0xdd4a, 0xb9e6, 0xb9ee, 0xe17e, 0xb9e8, 0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea, 0xb9e7, 0xb9eb, 0xbc66, 0xd8d0, 0xbc67, 0xbc65, 0xbc64, 0xe95d, 0xbec8, 0xecd8, 0xecd9, 0xc364, 0xc45f, 0xa46f, 0xa678, 0xabca, 0xd169, 0xae67, 0xb14e, 0xb14d, 0xb14c, 0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470, 0xc95c, 0xa4d6, 0xc974, 0xc9d4, 0xa679, 0xa97c, 0xdd4b, 0xa471, 0xa4d7, 0xc9d5, 0xcabe, 0xcabf, 0xa7bc, 0xd8d8, 0xb44e, 0xdd4c, 0xc0aa, 0xa472, 0xa4a8, 0xa4d8, 0xc975, 0xa5a7, 0xa7c0, 0xa7bf, 0xa7bd, 0xa7be, 0xcc59, 0xa97e, 0xa9a1, 0xcc5a, 0xa97d, 0xabce, 0xce78, 0xabcd, 0xabcb, 0xabcc, 0xae6a, 0xae68, 0xd16b, 0xae69, 0xd16a, 0xae5e, 0xd4f3, 0xb150, 0xb151, 0xb14f, 0xb9f0, 0xe1a2, 0xbc68, 0xbc69, 0xe561, 0xc0ab, 0xefc2, 0xefc3, 0xc4dd, 0xf8a8, 0xc94b, 0xa4d9, 0xa473, 0xc977, 0xc976, 0xa67a, 0xc9d7, 0xc9d8, 0xc9d6, 0xc9d9, 0xcac7, 0xcac2, 0xcac4, 0xcac6, 0xcac3, 0xa7c4, 0xcac0, 0xcac1, 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3, 0xcac9, 0xcc68, 0xcc62, 0xcc5d, 0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69, 0xcc6c, 0xcc67, 0xcc60, 0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64, 0xcc5b, 0xcc5f, 0xcc6b, 0xa9a7, 0xa9a8, 0xcc5e, 0xcc6a, 0xa9a2, 0xa9a4, 0xceab, 0xcea4, 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b, 0xceac, 0xcea9, 0xce79, 0xabd0, 0xcea7, 0xcea8, 0xcea6, 0xce7c, 0xce7a, 0xabcf, 0xcea2, 0xce7e, 0xcea1, 0xcead, 0xae6f, 0xae6e, 0xd16c, 0xae6b, 0xd16e, 0xae70, 0xd16f, 0xae73, 0xae71, 0xd170, 0xceae, 0xd172, 0xae6d, 0xae6c, 0xd16d, 0xd171, 0xae72, 0xb153, 0xb152, 0xd4f5, 0xd4f9, 0xd4fb, 0xb154, 0xd4fe, 0xb158, 0xd541, 0xb15a, 0xb156, 0xb15e, 0xb15b, 0xd4f7, 0xb155, 0xd4f6, 0xd4f4, 0xd543, 0xd4f8, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d, 0xd4fa, 0xb159, 0xd544, 0xd540, 0xd8e7, 0xd8ee, 0xd8e3, 0xb451, 0xd8df, 0xd8ef, 0xd8d9, 0xd8ec, 0xd8ea, 0xd8e4, 0xd8ed, 0xd8e6, 0xd8de, 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da, 0xd8f1, 0xb452, 0xd8eb, 0xdd4f, 0xd8dd, 0xb44f, 0xd8e1, 0xb450, 0xd8e0, 0xd8e5, 0xd8e2, 0xd8e8, 0xdd53, 0xdd56, 0xdd4e, 0xdd50, 0xdd55, 0xdd54, 0xb743, 0xd8db, 0xdd52, 0xb744, 0xdd4d, 0xdd51, 0xe1a9, 0xe1b0, 0xe1a7, 0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1, 0xe1a4, 0xe1a8, 0xe1a3, 0xb9f1, 0xe1a6, 0xb9f2, 0xe1ac, 0xe1ab, 0xe1aa, 0xe1af, 0xe565, 0xe567, 0xbc6b, 0xe568, 0xe563, 0xe562, 0xe56c, 0xe56a, 0xbc6a, 0xe56d, 0xe564, 0xe569, 0xe56b, 0xe566, 0xe961, 0xe966, 0xe960, 0xe965, 0xe95e, 0xe968, 0xe964, 0xe969, 0xe963, 0xe95f, 0xe967, 0xe96a, 0xe962, 0xecda, 0xc0af, 0xc0ad, 0xc0ac, 0xc0ae, 0xefc4, 0xf172, 0xf1fd, 0xf444, 0xf445, 0xc460, 0xf5c9, 0xc4de, 0xf5ca, 0xf6de, 0xc572, 0xc571, 0xf6dd, 0xc5c9, 0xf7d6, 0xa474, 0xa67b, 0xc9da, 0xcaca, 0xa8b5, 0xb15f, 0xa475, 0xa5aa, 0xa5a9, 0xa5a8, 0xa7c5, 0xae74, 0xdd57, 0xa476, 0xa477, 0xa478, 0xa4da, 0xabd1, 0xceaf, 0xb453, 0xa479, 0xc95d, 0xa5ab, 0xa5ac, 0xc978, 0xa67c, 0xcacb, 0xa7c6, 0xcacc, 0xa9ae, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d, 0xa9a9, 0xcc6f, 0xa9aa, 0xa9ad, 0xabd2, 0xabd4, 0xceb3, 0xceb0, 0xceb1, 0xceb2, 0xceb4, 0xabd3, 0xd174, 0xd173, 0xae76, 0xae75, 0xb162, 0xd546, 0xb161, 0xb163, 0xb160, 0xb455, 0xd545, 0xb456, 0xd8f3, 0xb457, 0xd8f2, 0xb454, 0xdd5a, 0xdd5c, 0xb745, 0xdd5b, 0xdd59, 0xdd58, 0xe1b4, 0xb9f7, 0xb9f5, 0xb9f6, 0xe1b2, 0xe1b3, 0xb9f3, 0xe571, 0xe56f, 0xbc6d, 0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0xe96d, 0xe96b, 0xe96c, 0xe56e, 0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6, 0xe96e, 0xf1fe, 0xa47a, 0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0xa9af, 0xb746, 0xa4db, 0xa5ae, 0xabd5, 0xb458, 0xc979, 0xc97a, 0xc9dc, 0xa7c8, 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1, 0xa7c7, 0xa9b3, 0xa9b4, 0xa9b1, 0xa9b0, 0xceb8, 0xa9b2, 0xabd6, 0xceb7, 0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79, 0xd175, 0xd177, 0xae77, 0xd178, 0xae78, 0xd176, 0xceb5, 0xd547, 0xd54a, 0xd54b, 0xd548, 0xb167, 0xb166, 0xb164, 0xb165, 0xd549, 0xb168, 0xb45a, 0xb45b, 0xb45c, 0xdd5d, 0xdd5f, 0xdd61, 0xb748, 0xb747, 0xb459, 0xdd60, 0xdd5e, 0xe1b8, 0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9, 0xe1b7, 0xe1b5, 0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574, 0xbc71, 0xbc74, 0xe575, 0xbc6f, 0xbc73, 0xe973, 0xe971, 0xe970, 0xe972, 0xe96f, 0xc366, 0xf446, 0xf447, 0xf5cb, 0xf6df, 0xc655, 0xa9b5, 0xa7ca, 0xabd8, 0xa47b, 0xa4dc, 0xa5af, 0xc9dd, 0xa7cb, 0xcad2, 0xcebb, 0xabd9, 0xb9fa, 0xa47c, 0xa6a1, 0xb749, 0xa47d, 0xa4dd, 0xa4de, 0xa5b1, 0xa5b0, 0xc9de, 0xa6a2, 0xcad3, 0xa7cc, 0xcc71, 0xcc72, 0xcc73, 0xa9b6, 0xa9b7, 0xcc70, 0xa9b8, 0xabda, 0xcebc, 0xd17a, 0xae7a, 0xd179, 0xb169, 0xd54c, 0xb16a, 0xd54d, 0xb45d, 0xdd62, 0xe1bf, 0xe1be, 0xb9fb, 0xbc75, 0xe576, 0xbeca, 0xe974, 0xc0b1, 0xc573, 0xf7d8, 0xcc74, 0xcebd, 0xb16b, 0xd8f4, 0xb74a, 0xc255, 0xa7ce, 0xa7cd, 0xabdb, 0xd17b, 0xb16d, 0xb343, 0xb16e, 0xb16c, 0xb45e, 0xe1c0, 0xb9fc, 0xbc76, 0xc94c, 0xc9df, 0xcad5, 0xa7cf, 0xcad4, 0xa7d0, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb, 0xa9b9, 0xa9ba, 0xcc75, 0xabdd, 0xcebe, 0xabe0, 0xabdc, 0xabe2, 0xabde, 0xabdf, 0xabe1, 0xae7d, 0xae7c, 0xae7b, 0xd54f, 0xb16f, 0xb172, 0xb170, 0xd54e, 0xb175, 0xb171, 0xd550, 0xb174, 0xb173, 0xd8f6, 0xd8f5, 0xb461, 0xb45f, 0xb460, 0xd8f7, 0xb74b, 0xdd64, 0xb74c, 0xdd63, 0xe577, 0xbc78, 0xe1c1, 0xbc77, 0xb9fd, 0xecde, 0xe975, 0xc0b2, 0xecdd, 0xf240, 0xf448, 0xf449, 0xa4df, 0xa5b2, 0xc97b, 0xa7d2, 0xa7d4, 0xc9e2, 0xcad8, 0xcad7, 0xcad6, 0xc9e1, 0xc9e0, 0xa6a4, 0xa7d3, 0xa7d1, 0xa6a3, 0xa9bd, 0xcc78, 0xa9be, 0xcadd, 0xcadf, 0xcade, 0xcc79, 0xcada, 0xa7d8, 0xa7d6, 0xcad9, 0xcadb, 0xcae1, 0xa7d5, 0xcadc, 0xcae5, 0xa9c0, 0xcae2, 0xa7d7, 0xcae0, 0xcae3, 0xa9bf, 0xa9c1, 0xcae4, 0xccaf, 0xcca2, 0xcc7e, 0xccae, 0xcca9, 0xabe7, 0xa9c2, 0xccaa, 0xccad, 0xabe3, 0xccac, 0xa9c3, 0xa9c8, 0xa9c6, 0xcca3, 0xcc7c, 0xcca5, 0xa9cd, 0xccb0, 0xabe4, 0xcca6, 0xabe5, 0xa9c9, 0xcca8, 0xcecd, 0xabe6, 0xcc7b, 0xa9ca, 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7, 0xcc7a, 0xccab, 0xa9c4, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5, 0xcebf, 0xcec0, 0xceca, 0xd1a1, 0xcecb, 0xabee, 0xcece, 0xcec4, 0xabed, 0xcec6, 0xcec7, 0xcec9, 0xabe9, 0xaea3, 0xcec5, 0xcec1, 0xaea4, 0xcecf, 0xae7e, 0xd17d, 0xcec8, 0xd17c, 0xcec3, 0xcecc, 0xabec, 0xaea1, 0xabf2, 0xaea2, 0xced0, 0xd17e, 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef, 0xaea5, 0xced1, 0xaea7, 0xabea, 0xcec2, 0xb176, 0xd1a4, 0xd1a6, 0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac, 0xd1a3, 0xb178, 0xd551, 0xaead, 0xaeab, 0xd1ae, 0xd552, 0xd1a5, 0xaeac, 0xd1a9, 0xaeaf, 0xd1ab, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0xaea9, 0xb179, 0xd1a2, 0xb177, 0xb17a, 0xd555, 0xd55e, 0xb464, 0xb17c, 0xb1a3, 0xb465, 0xd560, 0xb1aa, 0xd8f9, 0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554, 0xd562, 0xd565, 0xd949, 0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac, 0xd55d, 0xd8f8, 0xd561, 0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559, 0xb462, 0xd557, 0xd558, 0xb1a7, 0xb1a6, 0xd55b, 0xb1ab, 0xd55f, 0xb1a4, 0xd55c, 0xb1a9, 0xb466, 0xb463, 0xd8fb, 0xd55a, 0xb17d, 0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d, 0xd944, 0xb471, 0xdd65, 0xd946, 0xb753, 0xb469, 0xb46c, 0xd947, 0xd948, 0xd94e, 0xb473, 0xb754, 0xd94a, 0xd94f, 0xd943, 0xb75e, 0xb755, 0xb472, 0xd941, 0xd950, 0xb75d, 0xb470, 0xb74e, 0xd94d, 0xb474, 0xd945, 0xd8fe, 0xb46a, 0xd942, 0xd94b, 0xb74d, 0xb752, 0xb467, 0xd94c, 0xb750, 0xb468, 0xb75c, 0xe1c3, 0xdd70, 0xdd68, 0xe1c2, 0xdd6c, 0xdd6e, 0xdd6b, 0xb75b, 0xdd6a, 0xb75f, 0xe1d2, 0xb75a, 0xba40, 0xdd71, 0xe1c4, 0xb758, 0xdd69, 0xdd6d, 0xb9fe, 0xb74f, 0xdd66, 0xdd67, 0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f, 0xe1c8, 0xe1c9, 0xe1ce, 0xbc7d, 0xe1d5, 0xba47, 0xba46, 0xe1d0, 0xbc7c, 0xe1c5, 0xba45, 0xe1d4, 0xba43, 0xba44, 0xe1d1, 0xe5aa, 0xbc7a, 0xb46e, 0xe1d3, 0xbca3, 0xe1cb, 0xbc7b, 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7, 0xe1cd, 0xba48, 0xbc79, 0xba42, 0xe57a, 0xe1cf, 0xbca1, 0xbca4, 0xe1cc, 0xbc7e, 0xe579, 0xe57e, 0xbece, 0xe578, 0xe9a3, 0xe5a9, 0xbca8, 0xbca6, 0xbecc, 0xe5a6, 0xe5a2, 0xbcac, 0xe978, 0xbcaa, 0xe5a1, 0xe976, 0xe5a5, 0xe5a8, 0xe57d, 0xbcab, 0xbca5, 0xe977, 0xbecd, 0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3, 0xe57c, 0xe57b, 0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0xe9a2, 0xe97e, 0xece1, 0xbed1, 0xe9a1, 0xe97c, 0xc0b4, 0xecdf, 0xe979, 0xe97b, 0xc0b5, 0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d, 0xbecf, 0xefcf, 0xefc7, 0xece7, 0xefc8, 0xece3, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2, 0xece6, 0xefd0, 0xefcc, 0xefce, 0xefc9, 0xefca, 0xefcd, 0xefcb, 0xc367, 0xc36a, 0xc369, 0xc368, 0xc461, 0xf44a, 0xc462, 0xf241, 0xc4df, 0xf5cc, 0xc4e0, 0xc574, 0xc5ca, 0xf7d9, 0xf7da, 0xf7db, 0xf9ba, 0xa4e0, 0xc97c, 0xa5b3, 0xa6a6, 0xa6a7, 0xa6a5, 0xa6a8, 0xa7da, 0xa7d9, 0xccb1, 0xa9cf, 0xa9ce, 0xd1af, 0xb1ad, 0xb1ae, 0xb475, 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0xe1d7, 0xe1d6, 0xba49, 0xe1d8, 0xe5ac, 0xbcae, 0xbed4, 0xc0b8, 0xc257, 0xc0b9, 0xa4e1, 0xcae6, 0xccb2, 0xa9d1, 0xa9d0, 0xa9d2, 0xabf3, 0xced2, 0xced3, 0xd1b0, 0xaeb0, 0xb1af, 0xb476, 0xd951, 0xa4e2, 0xa47e, 0xa4e3, 0xc97d, 0xa5b7, 0xa5b6, 0xa5b4, 0xa5b5, 0xa6ab, 0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3, 0xc9e4, 0xc9ea, 0xc9e6, 0xc9e8, 0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7, 0xa7e1, 0xa7ea, 0xa7e8, 0xcaf0, 0xcaed, 0xcaf5, 0xa7e6, 0xcaf6, 0xa7df, 0xcaf3, 0xa7e5, 0xcaef, 0xcaee, 0xa7e3, 0xcaf4, 0xa7e4, 0xa9d3, 0xa7de, 0xcaf1, 0xcae7, 0xa7db, 0xa7ee, 0xcaec, 0xcaf2, 0xa7e0, 0xa7e2, 0xcae8, 0xcae9, 0xcaea, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc, 0xa7e9, 0xa9e1, 0xccbe, 0xccb7, 0xa9dc, 0xa9ef, 0xccb3, 0xccba, 0xccbc, 0xccbf, 0xa9ea, 0xccbb, 0xccb4, 0xa9e8, 0xccb8, 0xccc0, 0xa9d9, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6, 0xa9d7, 0xa9d8, 0xa9d6, 0xa9ee, 0xa9e6, 0xa9e0, 0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7, 0xa9f0, 0xced4, 0xa9e4, 0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0xa9ec, 0xa9ed, 0xa9eb, 0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0xceda, 0xac41, 0xabf8, 0xabfa, 0xac40, 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43, 0xced7, 0xcedf, 0xabfe, 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7, 0xabfb, 0xac42, 0xaeb3, 0xcee0, 0xabf9, 0xac45, 0xced9, 0xabfc, 0xaeb2, 0xabf6, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc, 0xd1b2, 0xac44, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0xaec1, 0xd1be, 0xaebf, 0xaec0, 0xd1b4, 0xd1c4, 0xaeb6, 0xd566, 0xd1c6, 0xd1c0, 0xd1b7, 0xd1c9, 0xd1ba, 0xaebc, 0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0xd1cb, 0xd1bf, 0xaeb8, 0xd1b8, 0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5, 0xd1cc, 0xaebb, 0xd1bc, 0xd1bb, 0xaec3, 0xaec2, 0xaeb4, 0xaeba, 0xaebd, 0xd1c8, 0xd1c2, 0xaeb7, 0xd1b3, 0xd1ca, 0xd1c1, 0xd1c3, 0xd1c7, 0xd567, 0xb1b7, 0xb1cb, 0xb1ca, 0xb1bf, 0xd579, 0xd575, 0xd572, 0xd5a6, 0xb1ba, 0xb1b2, 0xd577, 0xb4a8, 0xb1b6, 0xd5a1, 0xb1cc, 0xb1c9, 0xd57b, 0xd56a, 0xb1c8, 0xd5a3, 0xd569, 0xb1bd, 0xb1c1, 0xd5a2, 0xd573, 0xb1c2, 0xb1bc, 0xd568, 0xb478, 0xd5a5, 0xd571, 0xb1c7, 0xd574, 0xd5a4, 0xb1c6, 0xd952, 0xb1b3, 0xd56f, 0xb1b8, 0xb1c3, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e, 0xb1b0, 0xb1c4, 0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0xb1b1, 0xb1c0, 0xb1bb, 0xb1b9, 0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576, 0xd954, 0xd953, 0xd56b, 0xd964, 0xb47a, 0xd96a, 0xd959, 0xd967, 0xdd77, 0xb47d, 0xd96b, 0xd96e, 0xb47c, 0xd95c, 0xd96d, 0xd96c, 0xb47e, 0xd955, 0xb479, 0xb4a3, 0xb4a1, 0xd969, 0xd95f, 0xb4a5, 0xd970, 0xd968, 0xd971, 0xb4ad, 0xb4ab, 0xd966, 0xd965, 0xd963, 0xd95d, 0xb4a4, 0xb4a2, 0xd1b9, 0xd956, 0xddb7, 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0xb4a6, 0xb4a7, 0xd958, 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961, 0xd95e, 0xb4ae, 0xb770, 0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c, 0xddbb, 0xb769, 0xdd7a, 0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e, 0xb76f, 0xdda5, 0xddb2, 0xddb8, 0xb76a, 0xb764, 0xdda3, 0xdd7d, 0xddba, 0xdda8, 0xdda9, 0xdd7e, 0xddb4, 0xddab, 0xddb5, 0xddad, 0xb765, 0xe1d9, 0xb768, 0xb766, 0xddb9, 0xddb0, 0xddac, 0xdda1, 0xba53, 0xddaf, 0xb76d, 0xdda7, 0xdda6, 0xb767, 0xb763, 0xe1ee, 0xddb3, 0xddae, 0xdda2, 0xe1e9, 0xe1da, 0xe1e5, 0xe1ec, 0xba51, 0xb4ac, 0xe1ea, 0xba4c, 0xba4b, 0xe1f1, 0xe1db, 0xe1e8, 0xe1dc, 0xe1e7, 0xba4f, 0xe1eb, 0xd962, 0xe1f2, 0xe1e3, 0xba52, 0xe5ba, 0xbcaf, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0, 0xe5ae, 0xe1df, 0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3, 0xba4e, 0xbcb1, 0xba50, 0xba55, 0xe1e1, 0xe1ed, 0xe1e6, 0xe5b1, 0xba4a, 0xbcb4, 0xe9aa, 0xe5b6, 0xe5b5, 0xe5b7, 0xe5b4, 0xbcb5, 0xbcbb, 0xbcb8, 0xbcb9, 0xe5af, 0xe5b2, 0xe5bc, 0xbcc1, 0xbcbf, 0xe5b3, 0xd95a, 0xbcb2, 0xe5b9, 0xe5b0, 0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0xbcba, 0xbcbe, 0xbcc0, 0xbcbd, 0xbcbc, 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3, 0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf, 0xbed6, 0xbedd, 0xe9ab, 0xbedb, 0xbed5, 0xbedc, 0xe9a8, 0xc0bb, 0xbed7, 0xbede, 0xc0ba, 0xe9a7, 0xe9a6, 0xbee0, 0xbee1, 0xe9a5, 0xe9a4, 0xc0bc, 0xe9ae, 0xbeda, 0xe9ac, 0xc0bd, 0xc0c2, 0xecea, 0xecec, 0xc0bf, 0xeced, 0xece9, 0xeceb, 0xc0c0, 0xc0c3, 0xece8, 0xc0be, 0xc0c1, 0xc259, 0xe9ad, 0xc258, 0xc25e, 0xefd4, 0xc25c, 0xc25d, 0xefd7, 0xefd3, 0xc25a, 0xefd1, 0xc36b, 0xefd5, 0xefd6, 0xefd2, 0xc25b, 0xf242, 0xf245, 0xf246, 0xf244, 0xf247, 0xc36c, 0xf243, 0xf44e, 0xc464, 0xf44d, 0xf44c, 0xf44b, 0xc463, 0xc465, 0xf5cd, 0xc4e2, 0xc4e1, 0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb, 0xc575, 0xf7dd, 0xf6e2, 0xf7dc, 0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9, 0xf8ef, 0xa4e4, 0xd972, 0xe9af, 0xa6ac, 0xcaf7, 0xa7f1, 0xa7ef, 0xa7f0, 0xccc1, 0xa9f1, 0xac46, 0xcee7, 0xcee8, 0xac47, 0xd1ce, 0xaec4, 0xaec5, 0xd1cd, 0xb1d3, 0xb1cf, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1, 0xb1d4, 0xb1d0, 0xd976, 0xb1cd, 0xb4af, 0xb4b1, 0xb4b2, 0xd975, 0xd978, 0xb4b0, 0xd973, 0xd977, 0xd974, 0xb771, 0xddbc, 0xba56, 0xe1f4, 0xbee3, 0xbcc4, 0xe5bd, 0xbcc5, 0xbcc6, 0xe5bf, 0xe5be, 0xe5c0, 0xe9b1, 0xe9b0, 0xecef, 0xecee, 0xc0c4, 0xc0c5, 0xf248, 0xa4e5, 0xd979, 0xb4b4, 0xb4b3, 0xddbd, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6, 0xaec6, 0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772, 0xe1f5, 0xba57, 0xe9b2, 0xa4e7, 0xa5b8, 0xa9f2, 0xccc2, 0xcee9, 0xac48, 0xb1d9, 0xd97c, 0xb4b5, 0xb773, 0xe5c1, 0xe5c2, 0xecf0, 0xc25f, 0xf8f0, 0xa4e8, 0xccc3, 0xa9f3, 0xac49, 0xceea, 0xaec7, 0xd1d2, 0xd1d0, 0xd1d1, 0xaec8, 0xd1cf, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd, 0xb1da, 0xd97d, 0xd97e, 0xddbe, 0xba59, 0xba58, 0xecf1, 0xefd9, 0xf24a, 0xf249, 0xf44f, 0xc95e, 0xac4a, 0xa4e9, 0xa5b9, 0xa6ae, 0xa6ad, 0xa6af, 0xa6b0, 0xc9ee, 0xc9ed, 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9, 0xcafc, 0xa9f4, 0xccc9, 0xccc5, 0xccce, 0xa9fb, 0xa9f9, 0xccca, 0xccc6, 0xcccd, 0xa9f8, 0xaa40, 0xccc8, 0xccc4, 0xa9fe, 0xcccb, 0xa9f7, 0xcccc, 0xa9fa, 0xa9fc, 0xccd0, 0xcccf, 0xccc7, 0xa9f6, 0xa9f5, 0xa9fd, 0xceef, 0xcef5, 0xac50, 0xac4d, 0xceec, 0xcef1, 0xac53, 0xac4b, 0xcef0, 0xac4e, 0xac51, 0xcef3, 0xac4c, 0xcef8, 0xac4f, 0xac52, 0xceed, 0xcef2, 0xcef6, 0xceee, 0xceeb, 0xcef7, 0xcef4, 0xaed0, 0xaec9, 0xaecc, 0xaecf, 0xd1d5, 0xaeca, 0xd1d3, 0xaece, 0xaecb, 0xd1d6, 0xaecd, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad, 0xb1de, 0xb1e3, 0xd1d4, 0xd5aa, 0xd5ae, 0xb1e0, 0xd5a9, 0xb1e2, 0xb1e1, 0xd9a7, 0xd9a2, 0xb4b6, 0xb4ba, 0xb4b7, 0xd9a5, 0xd9a8, 0xb4b8, 0xb4b9, 0xb4be, 0xddc7, 0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1, 0xb4bd, 0xd9a4, 0xb779, 0xddbf, 0xb776, 0xb777, 0xb775, 0xddc4, 0xddc3, 0xddc0, 0xb77b, 0xddc2, 0xb4bb, 0xddc6, 0xddc1, 0xb778, 0xb774, 0xb77a, 0xddc5, 0xba5c, 0xe1f8, 0xe1f7, 0xe1f6, 0xba5a, 0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0xbcc7, 0xe5c9, 0xe5c4, 0xbcca, 0xe5c6, 0xbcc9, 0xe5c3, 0xe5c7, 0xbee9, 0xbee6, 0xe9bb, 0xe9ba, 0xe9b9, 0xe9b4, 0xe9b5, 0xbee7, 0xbee4, 0xbee8, 0xe9b3, 0xbee5, 0xe9b6, 0xe9b7, 0xe9bc, 0xe9b8, 0xecf2, 0xc0c7, 0xefdc, 0xc0c6, 0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0xc36d, 0xf451, 0xf452, 0xc466, 0xf450, 0xc4e4, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0xa4ea, 0xa6b1, 0xa6b2, 0xa7f3, 0xccd1, 0xac54, 0xaed1, 0xb1e4, 0xb0d2, 0xb4bf, 0xb4c0, 0xb3cc, 0xd9a9, 0xb77c, 0xe1fa, 0xe1f9, 0xa4eb, 0xa6b3, 0xccd2, 0xaa42, 0xaa41, 0xcef9, 0xcefa, 0xd1d7, 0xd1d8, 0xaed2, 0xaed3, 0xaed4, 0xd5af, 0xb1e6, 0xb4c2, 0xb4c1, 0xddc8, 0xdf7a, 0xe1fb, 0xe9bd, 0xc261, 0xc467, 0xa4ec, 0xa5bc, 0xa5bd, 0xa5bb, 0xa5be, 0xa5ba, 0xa6b6, 0xc9f6, 0xa6b5, 0xa6b7, 0xc9f1, 0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4, 0xcafd, 0xa7fd, 0xcafe, 0xcb43, 0xa7fc, 0xcb47, 0xcb42, 0xcb45, 0xa7f5, 0xa7f6, 0xa7f7, 0xa7f8, 0xa840, 0xcb41, 0xa7fa, 0xa841, 0xcb40, 0xcb46, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4, 0xa7fe, 0xaa57, 0xccd4, 0xaa43, 0xaa4d, 0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53, 0xccd7, 0xaa49, 0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4, 0xaa51, 0xaa4f, 0xcce5, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a, 0xaa50, 0xaa44, 0xccde, 0xccdd, 0xccd5, 0xaa52, 0xcce1, 0xccd6, 0xaa55, 0xcce8, 0xaa45, 0xaa4c, 0xccd9, 0xcce2, 0xaa54, 0xaa47, 0xaa4b, 0xcce0, 0xcf5b, 0xac5c, 0xac69, 0xcf56, 0xcf4c, 0xac62, 0xcf4a, 0xac5b, 0xcf45, 0xac65, 0xcf52, 0xcefe, 0xcf41, 0xcf44, 0xcefb, 0xcf51, 0xcf61, 0xac60, 0xcf46, 0xcf58, 0xcefd, 0xcf5f, 0xcf60, 0xcf63, 0xcf5a, 0xcf4b, 0xcf53, 0xac66, 0xac59, 0xac61, 0xac6d, 0xac56, 0xac58, 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40, 0xac6c, 0xac67, 0xcf49, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c, 0xcf54, 0xac5e, 0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f, 0xcf55, 0xac57, 0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d, 0xcf42, 0xcf5e, 0xcf57, 0xac55, 0xd1ec, 0xaeea, 0xd1ed, 0xd1e1, 0xaedf, 0xaeeb, 0xd1da, 0xd1e3, 0xd1eb, 0xd1d9, 0xd1f4, 0xaed5, 0xd1f3, 0xd1ee, 0xd1ef, 0xaedd, 0xaee8, 0xd1e5, 0xd1e6, 0xd1f0, 0xd1e7, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4, 0xaed6, 0xaeda, 0xd1f2, 0xd1de, 0xaee6, 0xaee2, 0xaee5, 0xaeec, 0xaedb, 0xaee7, 0xd1e9, 0xaee9, 0xaed8, 0xaed7, 0xd1db, 0xd1df, 0xaee0, 0xd1f1, 0xd1e8, 0xd1e0, 0xaee4, 0xaee1, 0xaed9, 0xaedc, 0xd5c4, 0xd5b4, 0xd5b5, 0xd5b9, 0xd5c8, 0xd5c5, 0xd5be, 0xd5bd, 0xb1ed, 0xd5c1, 0xd5d0, 0xd5b0, 0xd5d1, 0xd5c3, 0xd5d5, 0xd5c9, 0xb1ec, 0xd5c7, 0xb1e7, 0xb1fc, 0xb1f2, 0xb1f6, 0xb1f5, 0xd5b1, 0xd5ce, 0xd5d4, 0xd5cc, 0xd5d3, 0xd5c0, 0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7, 0xd5cb, 0xb1f0, 0xd5ca, 0xd5b3, 0xb1f8, 0xb1fa, 0xd5cd, 0xb1fb, 0xb1e9, 0xd5ba, 0xd5cf, 0xb1ef, 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7, 0xd5bb, 0xb1f4, 0xd5b6, 0xb1e8, 0xb1f1, 0xb1ee, 0xd5bf, 0xaede, 0xd9c0, 0xb1eb, 0xb1f3, 0xd9c3, 0xd9d9, 0xd9ce, 0xb4d6, 0xb4d1, 0xd9bd, 0xb4d2, 0xd9cd, 0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5, 0xb4c4, 0xd9b3, 0xb4c7, 0xb4c6, 0xb4d7, 0xd9ad, 0xd9cf, 0xd9d0, 0xb4c9, 0xb4c5, 0xd9bb, 0xb4d0, 0xd9b6, 0xd9d1, 0xb4cc, 0xd9c9, 0xd9d6, 0xd9b0, 0xd9b5, 0xd9af, 0xb4cb, 0xd9c2, 0xddde, 0xd9b1, 0xb4cf, 0xd9ba, 0xd9d2, 0xb4ca, 0xd9b7, 0xd9b4, 0xd9c5, 0xb4cd, 0xb4c3, 0xb4d9, 0xd9c8, 0xd9c7, 0xd9ac, 0xb4c8, 0xd9d4, 0xd9bc, 0xd9be, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5, 0xd9b2, 0xd9b9, 0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0xd9cc, 0xd9d8, 0xd9ae, 0xddf2, 0xb7a6, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0xddec, 0xddcb, 0xddd2, 0xddea, 0xddf4, 0xdddc, 0xddcf, 0xdde2, 0xdde7, 0xddd3, 0xdde4, 0xddd0, 0xddd7, 0xddd8, 0xb7a8, 0xddeb, 0xdde9, 0xddcc, 0xddee, 0xddef, 0xddf1, 0xb7ac, 0xb7a4, 0xd5b8, 0xddd4, 0xdde6, 0xddd5, 0xb7a1, 0xb7b1, 0xdded, 0xb7af, 0xb7ab, 0xddca, 0xb7a3, 0xddcd, 0xb7b0, 0xdddd, 0xddc9, 0xb7a9, 0xdde1, 0xddd1, 0xb7aa, 0xddda, 0xb77e, 0xb4d8, 0xdde3, 0xd9bf, 0xddce, 0xdde8, 0xb7a5, 0xdde5, 0xb7a2, 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0xb7a7, 0xdec6, 0xb7ae, 0xe24a, 0xe248, 0xe25e, 0xe246, 0xe258, 0xb77d, 0xba5f, 0xe242, 0xe25d, 0xe247, 0xe255, 0xba64, 0xba5d, 0xe25b, 0xe240, 0xe25a, 0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249, 0xba5e, 0xe24b, 0xe259, 0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d, 0xe243, 0xe1fc, 0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65, 0xe253, 0xba66, 0xe245, 0xe250, 0xe24c, 0xe24e, 0xba60, 0xe25f, 0xba6e, 0xe24f, 0xe262, 0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256, 0xba69, 0xba62, 0xe252, 0xe25c, 0xe5d5, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de, 0xbccd, 0xe5e5, 0xe5d4, 0xbcd8, 0xe5db, 0xe5d0, 0xe5da, 0xbcd5, 0xe5ee, 0xe5eb, 0xe5dd, 0xe5ce, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8, 0xe5d3, 0xe5ca, 0xbcce, 0xbcd6, 0xe5e7, 0xbcd7, 0xe5cb, 0xe5ed, 0xe5e0, 0xe5e6, 0xbcd4, 0xe5e3, 0xe5ea, 0xbcd9, 0xbcd3, 0xe5dc, 0xe5cf, 0xe5ef, 0xe5cc, 0xe5e8, 0xbcd0, 0xe5d6, 0xe5d7, 0xbccf, 0xbccc, 0xe5d2, 0xbcd2, 0xbccb, 0xe5e9, 0xe5ec, 0xe5d9, 0xe9ca, 0xe9c2, 0xe9be, 0xbef6, 0xbeeb, 0xbef0, 0xbeec, 0xe9cc, 0xe9d7, 0xbeea, 0xe9c4, 0xe9cd, 0xe5df, 0xe9ce, 0xbef1, 0xe9dd, 0xbef5, 0xbef8, 0xe9c0, 0xbef4, 0xe9db, 0xe9dc, 0xe9d2, 0xe9d1, 0xe9c9, 0xe9d3, 0xe9da, 0xe9d9, 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0xe9c5, 0xe9d8, 0xbef7, 0xe9d6, 0xbef3, 0xbef2, 0xe9d0, 0xe9bf, 0xe9c1, 0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0xe9c6, 0xe9d4, 0xe9c7, 0xc0cf, 0xed45, 0xc0c8, 0xecf5, 0xed41, 0xc0ca, 0xed48, 0xecfc, 0xecf7, 0xed49, 0xecf3, 0xecfe, 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9, 0xed40, 0xecf4, 0xc0d0, 0xed47, 0xecf9, 0xc0cc, 0xecfb, 0xecf8, 0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46, 0xed42, 0xc263, 0xefe7, 0xc268, 0xc269, 0xc262, 0xefe6, 0xefe3, 0xefe4, 0xc266, 0xefde, 0xefe2, 0xc265, 0xefdf, 0xc267, 0xc264, 0xefdd, 0xefe1, 0xefe5, 0xf251, 0xf24e, 0xf257, 0xf256, 0xf254, 0xf24f, 0xc372, 0xf250, 0xc371, 0xc0cd, 0xf253, 0xc370, 0xf258, 0xf252, 0xf24d, 0xefe0, 0xc36f, 0xf24c, 0xf456, 0xf455, 0xf255, 0xc468, 0xf459, 0xf45a, 0xf454, 0xf458, 0xf453, 0xf5d1, 0xf457, 0xc4e7, 0xc4e5, 0xf5cf, 0xf5d2, 0xf5ce, 0xf5d0, 0xc4e6, 0xf6e5, 0xf6e6, 0xc576, 0xf6e4, 0xf7e2, 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0xc656, 0xf8f3, 0xf8f1, 0xf8f2, 0xf8f4, 0xf9bb, 0xa4ed, 0xa6b8, 0xaa59, 0xcce9, 0xcf64, 0xd1f5, 0xd1f7, 0xd1f6, 0xd1f8, 0xb1fd, 0xd5d7, 0xd1f9, 0xd5d6, 0xd5d8, 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd, 0xb4dc, 0xb4da, 0xd9dc, 0xddfa, 0xddf8, 0xddf7, 0xddf6, 0xddf5, 0xb7b2, 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb, 0xbcda, 0xe5f0, 0xe9df, 0xe9de, 0xe9e0, 0xbef9, 0xed4b, 0xc0d3, 0xefe8, 0xc26a, 0xf259, 0xc577, 0xa4ee, 0xa5bf, 0xa6b9, 0xa842, 0xaa5a, 0xaa5b, 0xac6e, 0xd1fa, 0xb7b3, 0xe6d1, 0xbefa, 0xc26b, 0xa4ef, 0xa6ba, 0xcceb, 0xaa5c, 0xccea, 0xcf65, 0xac6f, 0xcf66, 0xac70, 0xd1fc, 0xaeee, 0xaeed, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db, 0xd5da, 0xd9de, 0xd9e1, 0xb4de, 0xd9df, 0xb4dd, 0xd9e0, 0xddfb, 0xe266, 0xe267, 0xe268, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4, 0xe9e1, 0xe9e2, 0xe9e3, 0xed4c, 0xc0d4, 0xc26c, 0xf25a, 0xc4e8, 0xc95f, 0xac71, 0xcf67, 0xaeef, 0xb1fe, 0xb4df, 0xd9e2, 0xb7b5, 0xb7b4, 0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5, 0xe9e4, 0xefe9, 0xf7e3, 0xa4f0, 0xc960, 0xa5c0, 0xa843, 0xcb48, 0xac72, 0xb7b6, 0xa4f1, 0xcf68, 0xac73, 0xcf69, 0xc0d5, 0xa4f2, 0xccec, 0xcf6a, 0xd242, 0xd241, 0xd1fe, 0xd1fd, 0xd243, 0xd240, 0xb240, 0xb241, 0xb4e0, 0xd9e3, 0xd9e4, 0xd9e5, 0xde41, 0xde42, 0xde40, 0xddfd, 0xddfe, 0xb7b7, 0xe26b, 0xe5f7, 0xe5f6, 0xe5f5, 0xe5f8, 0xe9e7, 0xe9e6, 0xbefb, 0xe9e8, 0xc0d6, 0xed4d, 0xefea, 0xf25b, 0xf6e7, 0xa4f3, 0xa5c2, 0xa5c1, 0xaa5d, 0xc961, 0xc97e, 0xa6bb, 0xc9f7, 0xcb49, 0xcb4a, 0xaa5e, 0xcced, 0xac74, 0xcf6b, 0xcf6c, 0xaef0, 0xaef4, 0xd244, 0xaef3, 0xaef1, 0xaef2, 0xd5df, 0xb242, 0xb4e3, 0xb4e1, 0xb4e2, 0xd9e6, 0xba72, 0xa4f4, 0xc9a1, 0xa5c3, 0xc9a4, 0xa5c6, 0xc9a3, 0xa5c5, 0xa5c4, 0xa844, 0xc9a2, 0xc9f8, 0xc9fc, 0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb, 0xa6c1, 0xc9f9, 0xc9fd, 0xa6c2, 0xa6bd, 0xa6be, 0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf, 0xa6c0, 0xa6c3, 0xcb5b, 0xcb59, 0xcb4c, 0xa851, 0xcb53, 0xa84c, 0xcb4d, 0xcb55, 0xcb52, 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858, 0xa85a, 0xcb4b, 0xa84d, 0xcb5c, 0xa854, 0xa857, 0xcd45, 0xa847, 0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56, 0xa848, 0xa849, 0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50, 0xa84e, 0xa853, 0xccee, 0xa85c, 0xcb57, 0xa852, 0xa85d, 0xa846, 0xcb54, 0xa84b, 0xcb58, 0xcd44, 0xaa6a, 0xaa7a, 0xccf5, 0xaa71, 0xcd4b, 0xaa62, 0xaa65, 0xcd42, 0xccf3, 0xccf7, 0xaa6d, 0xaa6f, 0xccfa, 0xaa76, 0xaa68, 0xaa66, 0xaa67, 0xaa75, 0xcd47, 0xaa70, 0xccf9, 0xccfb, 0xaa6e, 0xaa73, 0xccfc, 0xcd4a, 0xac75, 0xaa79, 0xaa63, 0xcd49, 0xcd4d, 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d, 0xaa72, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0xaa7e, 0xaa77, 0xaa69, 0xaa5f, 0xaa64, 0xccf6, 0xaa60, 0xcd4e, 0xccf0, 0xccef, 0xccfd, 0xccf1, 0xaa7b, 0xaef5, 0xaa74, 0xccfe, 0xaa61, 0xaca6, 0xcd4c, 0xcf7c, 0xcfa1, 0xcfa4, 0xcf77, 0xcfa7, 0xcfaa, 0xcfac, 0xcf74, 0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5, 0xcfad, 0xcf7b, 0xcf73, 0xd264, 0xac7e, 0xcfa2, 0xcf78, 0xcf7a, 0xaca5, 0xcf7d, 0xac7d, 0xcf70, 0xcfa8, 0xcfab, 0xac7a, 0xaca8, 0xcf6d, 0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e, 0xcd48, 0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3, 0xaca9, 0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72, 0xcfa6, 0xac79, 0xcf7e, 0xd24c, 0xaefd, 0xaf43, 0xd255, 0xd25b, 0xd257, 0xd24a, 0xd24d, 0xd246, 0xd247, 0xaf4a, 0xaefa, 0xd256, 0xd25f, 0xaf45, 0xaef6, 0xaf40, 0xd24e, 0xaf42, 0xd24f, 0xd259, 0xaf44, 0xd268, 0xd248, 0xaefc, 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a, 0xd267, 0xd261, 0xd253, 0xd262, 0xd25c, 0xd265, 0xd263, 0xaf49, 0xd254, 0xaef9, 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251, 0xb243, 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0xd258, 0xd25d, 0xb265, 0xd5e1, 0xd5e5, 0xb252, 0xb250, 0xb247, 0xd5e3, 0xd5e2, 0xb25b, 0xd5e8, 0xb255, 0xd5fa, 0xd647, 0xb244, 0xd5f7, 0xd5f0, 0xb267, 0xd5e0, 0xd5fc, 0xb264, 0xb258, 0xb263, 0xb24e, 0xd5ec, 0xd5fe, 0xd5f6, 0xb24f, 0xb249, 0xd645, 0xd5fd, 0xd640, 0xb251, 0xb259, 0xd642, 0xd5ea, 0xd5fb, 0xd5ef, 0xd644, 0xb25e, 0xb246, 0xb25c, 0xd5f4, 0xd5f2, 0xd5f3, 0xb253, 0xd5ee, 0xd5ed, 0xb248, 0xd5e7, 0xd646, 0xb24a, 0xd5f1, 0xb268, 0xb262, 0xd5e6, 0xb25f, 0xb25d, 0xb266, 0xd5f8, 0xb261, 0xd252, 0xd5f9, 0xb260, 0xd641, 0xb245, 0xd5f5, 0xb257, 0xd5e9, 0xb256, 0xb254, 0xb24c, 0xb24b, 0xd9e7, 0xd643, 0xd5eb, 0xd9fc, 0xb24d, 0xb541, 0xb25a, 0xb4ee, 0xd9f6, 0xb4fc, 0xd9ea, 0xb4eb, 0xb4e7, 0xda49, 0xb4ed, 0xb4f1, 0xb4ec, 0xb4f5, 0xda4d, 0xda44, 0xd9f1, 0xb4fa, 0xb4f4, 0xd9fd, 0xb4e4, 0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55, 0xda56, 0xb4e5, 0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd, 0xd9f2, 0xd9f9, 0xd9f3, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9, 0xd9eb, 0xb4ea, 0xd9f8, 0xb4f8, 0xb542, 0xd9fa, 0xda53, 0xda4b, 0xb4e6, 0xda51, 0xb4f2, 0xb4f0, 0xda57, 0xb4ef, 0xda41, 0xd9f4, 0xd9fe, 0xb547, 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f, 0xda4c, 0xda54, 0xb4e9, 0xda40, 0xb546, 0xda47, 0xb4f3, 0xb4f6, 0xda46, 0xb545, 0xd9f5, 0xd5e4, 0xda50, 0xda4e, 0xda52, 0xd9ec, 0xb540, 0xde61, 0xde60, 0xde46, 0xb7bd, 0xde5f, 0xde49, 0xde4a, 0xb7c7, 0xde68, 0xb7c2, 0xde5e, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48, 0xde4b, 0xde63, 0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc, 0xb7cb, 0xb7c5, 0xde69, 0xb7b9, 0xde55, 0xde4c, 0xde59, 0xde65, 0xb7cd, 0xb7bb, 0xde54, 0xde4d, 0xb7c4, 0xb7c3, 0xde50, 0xde5a, 0xde64, 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0, 0xde4e, 0xb7bf, 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56, 0xe26c, 0xde58, 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0, 0xde44, 0xde5d, 0xde5c, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2, 0xe26e, 0xbaaf, 0xba77, 0xe26d, 0xe2b0, 0xbab1, 0xe271, 0xe2a3, 0xe273, 0xe2b3, 0xe2af, 0xba75, 0xbaa1, 0xe653, 0xbaae, 0xba7d, 0xe26f, 0xe2ae, 0xbaa3, 0xe2ab, 0xe2b8, 0xe275, 0xe27e, 0xe2b6, 0xe2ac, 0xba7c, 0xe27c, 0xba76, 0xba74, 0xbaa8, 0xe27a, 0xe277, 0xe278, 0xe2b2, 0xe2b7, 0xe2b5, 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0xe270, 0xe5fa, 0xe279, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274, 0xbaaa, 0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0xe2a9, 0xe2a1, 0xe272, 0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0xba79, 0xbcdf, 0xe2a6, 0xe5f9, 0xe2ad, 0xe276, 0xe644, 0xe64e, 0xbce2, 0xe64d, 0xe659, 0xbce4, 0xe64b, 0xe64f, 0xbcef, 0xe646, 0xbce7, 0xe652, 0xe9f0, 0xbcf3, 0xbcf2, 0xe654, 0xe643, 0xe65e, 0xbced, 0xbce3, 0xe657, 0xe65b, 0xe660, 0xe655, 0xe649, 0xbce6, 0xbce9, 0xbcf1, 0xbcec, 0xe64c, 0xe2a2, 0xe648, 0xe65f, 0xbce8, 0xbceb, 0xe661, 0xbce0, 0xe656, 0xe5fb, 0xe65c, 0xc0df, 0xe64a, 0xbce1, 0xe645, 0xbce5, 0xe5fc, 0xbaab, 0xe641, 0xe65a, 0xe642, 0xe640, 0xbcea, 0xe658, 0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee, 0xe9f3, 0xbf49, 0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48, 0xbf43, 0xe9f5, 0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8, 0xea44, 0xea46, 0xbefd, 0xea45, 0xbf44, 0xbf4a, 0xbf47, 0xe9fe, 0xbf46, 0xe9f9, 0xe9ed, 0xe9f2, 0xe9fd, 0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1, 0xe5fd, 0xe9ec, 0xe9ef, 0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43, 0xe9ee, 0xe9fc, 0xed51, 0xc0e3, 0xc0d7, 0xc0db, 0xed53, 0xed59, 0xed57, 0xc0d9, 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0xed56, 0xed55, 0xed5b, 0xc0e2, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de, 0xc0e5, 0xc0d8, 0xed58, 0xed50, 0xeff7, 0xc271, 0xeff4, 0xeff6, 0xc26f, 0xeff2, 0xeff3, 0xefee, 0xe9f6, 0xefef, 0xc270, 0xefeb, 0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed, 0xeff1, 0xc273, 0xc272, 0xeff0, 0xc378, 0xf25f, 0xf265, 0xc379, 0xf25c, 0xc376, 0xc373, 0xf267, 0xc377, 0xc374, 0xf25e, 0xf261, 0xf262, 0xf263, 0xf266, 0xeff5, 0xf25d, 0xc375, 0xf264, 0xf268, 0xf260, 0xf45d, 0xc46a, 0xf460, 0xc46b, 0xf468, 0xf45f, 0xf45c, 0xf45e, 0xf462, 0xf465, 0xf464, 0xf467, 0xf45b, 0xc469, 0xf463, 0xf466, 0xf469, 0xf461, 0xf5d3, 0xf5d4, 0xf5d8, 0xf5d9, 0xf5d6, 0xf5d7, 0xf5d5, 0xc4e9, 0xc578, 0xf6eb, 0xf6e8, 0xf6e9, 0xf6ea, 0xc579, 0xf7e5, 0xf7e4, 0xf8af, 0xc5f4, 0xf8ad, 0xf8b0, 0xf8ae, 0xf8f5, 0xc657, 0xc665, 0xf9a3, 0xf96c, 0xf9a2, 0xf9d0, 0xf9d1, 0xa4f5, 0xa6c7, 0xca41, 0xcb5e, 0xa85f, 0xa862, 0xcb5f, 0xa860, 0xa861, 0xcd58, 0xcd5a, 0xcd55, 0xcd52, 0xcd54, 0xaaa4, 0xaaa2, 0xcd56, 0xaaa3, 0xcd53, 0xcd50, 0xaaa1, 0xcd57, 0xcd51, 0xaaa5, 0xcd59, 0xcfaf, 0xcfb3, 0xacb7, 0xcfb6, 0xacaf, 0xacb2, 0xacb4, 0xacb6, 0xacb3, 0xcfb2, 0xcfb1, 0xacb1, 0xcfb4, 0xcfb5, 0xcfae, 0xacb5, 0xacb0, 0xcfb0, 0xd277, 0xd278, 0xd279, 0xaf50, 0xaf4c, 0xd26e, 0xd276, 0xd27b, 0xaf51, 0xd26c, 0xd272, 0xd26b, 0xd275, 0xd271, 0xaf4d, 0xaf4f, 0xd27a, 0xd26a, 0xd26d, 0xd273, 0xd274, 0xd27c, 0xd270, 0xaf4e, 0xb26d, 0xd64e, 0xd650, 0xd64c, 0xd658, 0xd64a, 0xd657, 0xb269, 0xd648, 0xda5b, 0xd652, 0xb26c, 0xd653, 0xd656, 0xd65a, 0xd64f, 0xd654, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649, 0xd65b, 0xd651, 0xd655, 0xd64b, 0xb548, 0xb549, 0xda65, 0xb54f, 0xda59, 0xda62, 0xda58, 0xb54c, 0xda60, 0xda5e, 0xda5f, 0xb54a, 0xda63, 0xda5c, 0xda5a, 0xb54b, 0xda5d, 0xda61, 0xb54d, 0xda64, 0xde70, 0xde77, 0xde79, 0xdea1, 0xb7da, 0xde6b, 0xb7d2, 0xde7a, 0xb7d7, 0xdea2, 0xb7ce, 0xde7d, 0xde6d, 0xde7e, 0xde6c, 0xb7dc, 0xde78, 0xb7cf, 0xdea3, 0xb7d4, 0xde71, 0xb7d9, 0xde7c, 0xde6f, 0xde76, 0xde72, 0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3, 0xb7db, 0xb7d0, 0xde75, 0xb7d5, 0xb54e, 0xde7b, 0xde73, 0xde74, 0xe2c1, 0xbab4, 0xe2bd, 0xe2c3, 0xe2bf, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba, 0xe2bc, 0xbab5, 0xe2c0, 0xe2bb, 0xbab7, 0xbab2, 0xe2c4, 0xbab3, 0xe667, 0xe664, 0xe670, 0xe66a, 0xe66c, 0xbcf4, 0xe666, 0xe66e, 0xe66d, 0xe66b, 0xe671, 0xbcf7, 0xe668, 0xe66f, 0xbcf5, 0xe663, 0xe665, 0xbcf6, 0xe662, 0xe672, 0xe669, 0xea4a, 0xbf51, 0xea55, 0xea53, 0xbf4b, 0xea49, 0xea4c, 0xea4d, 0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56, 0xea51, 0xbf4f, 0xbf4c, 0xea50, 0xea4e, 0xbf52, 0xea52, 0xbf4d, 0xbf4e, 0xea4f, 0xbf50, 0xea4b, 0xea54, 0xbf53, 0xea57, 0xea58, 0xbf54, 0xc0e7, 0xc0ee, 0xed5c, 0xed62, 0xed60, 0xc0ea, 0xc0e9, 0xc0e6, 0xed5e, 0xc0ec, 0xc0eb, 0xc0e8, 0xed61, 0xed5d, 0xed5f, 0xc0ed, 0xc277, 0xeffb, 0xc274, 0xc275, 0xeffd, 0xc276, 0xeffa, 0xeff9, 0xf26c, 0xeffc, 0xf26d, 0xc37a, 0xf26b, 0xf26a, 0xf269, 0xc37b, 0xc46c, 0xf46a, 0xf46b, 0xf5dc, 0xf5db, 0xc4ea, 0xf5da, 0xf6ec, 0xf6ed, 0xf7e6, 0xf8b1, 0xf8f6, 0xf9bc, 0xc679, 0xf9c6, 0xa4f6, 0xaaa6, 0xaaa7, 0xacb8, 0xc0ef, 0xa4f7, 0xaaa8, 0xaf52, 0xb7dd, 0xa4f8, 0xb26e, 0xbab8, 0xc962, 0xcfb7, 0xd27d, 0xe2c5, 0xc0f0, 0xa4f9, 0xaaa9, 0xcfb8, 0xcfb9, 0xda66, 0xb550, 0xdea4, 0xb7de, 0xe2c6, 0xbcf8, 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0xa6c9, 0xca42, 0xa6c8, 0xa865, 0xa864, 0xa863, 0xcb60, 0xaaaa, 0xaaab, 0xcd5b, 0xcfba, 0xcfbd, 0xacba, 0xcfbb, 0xacb9, 0xcfbc, 0xacbb, 0xd2a2, 0xd2a1, 0xd27e, 0xaf53, 0xd65d, 0xd65e, 0xb26f, 0xd65c, 0xd65f, 0xb552, 0xb270, 0xb551, 0xda6b, 0xda6a, 0xda68, 0xda69, 0xda6c, 0xdea6, 0xdea5, 0xdea9, 0xdea8, 0xdea7, 0xbab9, 0xe2c9, 0xe2c8, 0xbaba, 0xe2c7, 0xe673, 0xe674, 0xbcf9, 0xea59, 0xea5a, 0xf272, 0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb, 0xf46c, 0xf6ee, 0xf8f7, 0xa4fc, 0xc9a5, 0xa5c7, 0xc9a6, 0xca43, 0xca44, 0xcb66, 0xcb62, 0xcb61, 0xaaac, 0xcb65, 0xa867, 0xcb63, 0xa866, 0xcb67, 0xcb64, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0xaaad, 0xaab0, 0xcd65, 0xcd61, 0xcd62, 0xcd5c, 0xaaaf, 0xcd5e, 0xaaae, 0xcd63, 0xcd60, 0xcfc2, 0xacbd, 0xacbe, 0xcfc5, 0xcfbf, 0xcfc4, 0xcfc0, 0xacbc, 0xcfc3, 0xcfc1, 0xd2a8, 0xd2a5, 0xd2a7, 0xaf58, 0xaf57, 0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56, 0xd2a6, 0xd667, 0xd2a3, 0xd2aa, 0xd662, 0xd666, 0xd665, 0xda6e, 0xda79, 0xd668, 0xd663, 0xda6d, 0xb274, 0xb273, 0xd661, 0xd664, 0xb275, 0xb272, 0xb271, 0xd660, 0xd669, 0xda70, 0xda77, 0xb554, 0xda76, 0xda73, 0xb556, 0xda75, 0xda6f, 0xda71, 0xda74, 0xda72, 0xb555, 0xda78, 0xb553, 0xb7df, 0xdead, 0xdeac, 0xdeaa, 0xb7e2, 0xb7e1, 0xdeae, 0xdeab, 0xe2ca, 0xbabb, 0xb7e0, 0xdeb0, 0xdeaf, 0xe2cd, 0xe2cb, 0xbcfa, 0xbabc, 0xe2cc, 0xe676, 0xbcfb, 0xe675, 0xe67e, 0xe67d, 0xe67b, 0xe67a, 0xe677, 0xe678, 0xe679, 0xe67c, 0xe6a1, 0xea5f, 0xea5c, 0xea5d, 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0xed64, 0xed65, 0xc0f1, 0xc0f2, 0xed63, 0xc279, 0xeffe, 0xc278, 0xc37e, 0xc3a1, 0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef, 0xc57a, 0xf7e8, 0xf7e7, 0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276, 0xd66a, 0xa5c9, 0xc9a7, 0xa4fd, 0xca45, 0xcb6c, 0xcb6a, 0xcb6b, 0xcb68, 0xa868, 0xcb69, 0xcd6d, 0xaab3, 0xcd6b, 0xcd67, 0xcd6a, 0xcd66, 0xaab5, 0xcd69, 0xaab2, 0xaab1, 0xaab4, 0xcd6c, 0xcd68, 0xacc2, 0xacc5, 0xcfce, 0xcfcd, 0xcfcc, 0xacbf, 0xcfd5, 0xcfcb, 0xacc1, 0xd2af, 0xcfd2, 0xcfd0, 0xacc4, 0xcfc8, 0xcfd3, 0xcfca, 0xcfd4, 0xcfd1, 0xcfc9, 0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0xd2b4, 0xd2ab, 0xd2b6, 0xd2ae, 0xd2b9, 0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f, 0xaf5d, 0xd2b1, 0xd2ad, 0xd2b0, 0xd2bb, 0xd2b2, 0xaf5e, 0xcfcf, 0xaf5a, 0xaf5c, 0xd678, 0xd66d, 0xd66b, 0xd66c, 0xd673, 0xd674, 0xd670, 0xb27b, 0xd675, 0xd672, 0xd66f, 0xb279, 0xd66e, 0xb277, 0xb27a, 0xd671, 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676, 0xb27c, 0xda7e, 0xdaa1, 0xb560, 0xdaa7, 0xdaa9, 0xdaa2, 0xb55a, 0xdaa6, 0xdaa5, 0xb55b, 0xb561, 0xb562, 0xdaa8, 0xb558, 0xda7d, 0xda7b, 0xdaa3, 0xda7a, 0xb55f, 0xda7c, 0xdaa4, 0xdaaa, 0xb559, 0xb55e, 0xb55c, 0xb55d, 0xb557, 0xb7e9, 0xdeb7, 0xb7e8, 0xdebb, 0xdeb1, 0xdebc, 0xdeb2, 0xdeb3, 0xdebd, 0xdeba, 0xdeb8, 0xdeb9, 0xdeb5, 0xdeb4, 0xdebe, 0xb7e5, 0xdeb6, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec, 0xb7e7, 0xb7e6, 0xe2ce, 0xbabe, 0xbabd, 0xe2d3, 0xbcfc, 0xbabf, 0xbac1, 0xe2d4, 0xb7e3, 0xbac0, 0xe2d0, 0xe2d2, 0xe2cf, 0xe2d1, 0xe6ab, 0xe6aa, 0xe6a7, 0xbd40, 0xea62, 0xbd41, 0xe6a6, 0xbcfe, 0xe6a8, 0xe6a5, 0xe6a2, 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0xed69, 0xea66, 0xea65, 0xea67, 0xed66, 0xbf5a, 0xea63, 0xbf58, 0xbf5c, 0xbf5b, 0xea64, 0xea68, 0xbf59, 0xed6d, 0xc0f5, 0xc27a, 0xc0f6, 0xc0f3, 0xed6a, 0xed68, 0xed6b, 0xed6e, 0xc0f4, 0xed6c, 0xed67, 0xf042, 0xf045, 0xf275, 0xf040, 0xf46f, 0xf046, 0xc3a2, 0xf044, 0xc27b, 0xf041, 0xf043, 0xf047, 0xf276, 0xf274, 0xc3a3, 0xf273, 0xc46e, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3, 0xf6f0, 0xf6f2, 0xc5d0, 0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd, 0xb27d, 0xdebf, 0xbf5d, 0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0xcd6f, 0xa260, 0xcfd7, 0xcfd8, 0xd2be, 0xd2bf, 0xb27e, 0xb2a1, 0xdaab, 0xdec2, 0xdec1, 0xdec0, 0xe2d5, 0xe2d6, 0xe2d7, 0xbac2, 0xe6ad, 0xe6ac, 0xea69, 0xbf5e, 0xbf5f, 0xed72, 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048, 0xc27c, 0xf277, 0xf5de, 0xa5cc, 0xacc6, 0xb2a2, 0xdec3, 0xa5cd, 0xd2c0, 0xb2a3, 0xb563, 0xb564, 0xa5ce, 0xa5cf, 0xca46, 0xa86a, 0xa869, 0xacc7, 0xcfd9, 0xdaac, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa86b, 0xa86c, 0xcb6e, 0xcb6d, 0xaab6, 0xcd72, 0xcd70, 0xcd71, 0xcfda, 0xcfdb, 0xaccb, 0xacc9, 0xacca, 0xacc8, 0xaf60, 0xaf64, 0xaf63, 0xd2c1, 0xaf62, 0xaf61, 0xd2c2, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4, 0xb2a5, 0xb566, 0xb565, 0xdaae, 0xdaad, 0xb2a7, 0xb7ed, 0xdec5, 0xb7ee, 0xdec4, 0xe2d8, 0xe6ae, 0xbd42, 0xea6a, 0xed73, 0xc3a6, 0xc3a5, 0xc57c, 0xa5d4, 0xcd73, 0xb2a8, 0xe2d9, 0xbac3, 0xcb6f, 0xcb70, 0xcd74, 0xaab8, 0xaab9, 0xaab7, 0xaccf, 0xacd0, 0xaccd, 0xacce, 0xcfdc, 0xcfdd, 0xaccc, 0xd2c3, 0xaf68, 0xaf69, 0xb2ab, 0xd2c9, 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b, 0xaf6a, 0xaf65, 0xd2c8, 0xd2c7, 0xd2c4, 0xaf6d, 0xd2c6, 0xaf66, 0xaf67, 0xb2ac, 0xd6a1, 0xd6a2, 0xb2ad, 0xd67c, 0xd67e, 0xd6a4, 0xd6a3, 0xd67d, 0xb2a9, 0xb2aa, 0xdab6, 0xb56b, 0xb56a, 0xdab0, 0xb568, 0xdab3, 0xb56c, 0xdab4, 0xb56d, 0xdab1, 0xb567, 0xb569, 0xdab5, 0xdab2, 0xdaaf, 0xded2, 0xdec7, 0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6, 0xded3, 0xded1, 0xdeca, 0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc, 0xded4, 0xdecb, 0xb7f5, 0xb7ef, 0xb7f1, 0xdec9, 0xe2db, 0xbac7, 0xe2df, 0xbac6, 0xe2dc, 0xbac5, 0xdec8, 0xdecf, 0xe2de, 0xbac8, 0xe2e0, 0xe2dd, 0xe2da, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2, 0xe6b0, 0xbd45, 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af, 0xbd47, 0xbac4, 0xe6b6, 0xbd44, 0xea6c, 0xea6b, 0xea73, 0xea6d, 0xea72, 0xea6f, 0xbf60, 0xea71, 0xbf61, 0xbf62, 0xea70, 0xea6e, 0xc0f8, 0xed74, 0xc0f7, 0xed77, 0xed75, 0xed76, 0xc0f9, 0xf04d, 0xc2a1, 0xf04e, 0xc27d, 0xf04f, 0xc27e, 0xf04c, 0xf050, 0xf04a, 0xc3a7, 0xf278, 0xc3a8, 0xc46f, 0xf04b, 0xc470, 0xc4ee, 0xf5df, 0xc57e, 0xf6f4, 0xc57d, 0xf7ea, 0xc5f5, 0xc5f6, 0xf9cc, 0xacd1, 0xcfde, 0xb56e, 0xb56f, 0xa5d5, 0xa6ca, 0xca47, 0xcb71, 0xa86d, 0xaaba, 0xacd2, 0xacd3, 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0xb2ae, 0xd6a5, 0xdab8, 0xb571, 0xdab7, 0xb570, 0xded5, 0xbd4a, 0xe6bb, 0xe6b8, 0xe6b9, 0xe6ba, 0xed78, 0xf051, 0xf471, 0xf470, 0xf6f5, 0xa5d6, 0xcd75, 0xaf70, 0xb572, 0xded6, 0xe2e1, 0xbd4b, 0xea74, 0xf052, 0xf472, 0xa5d7, 0xaabb, 0xacd7, 0xcfdf, 0xacd8, 0xacd6, 0xacd5, 0xd2cc, 0xaf71, 0xaf72, 0xaf73, 0xb2b0, 0xd6a7, 0xb2af, 0xdab9, 0xb2b1, 0xb573, 0xded7, 0xb7f8, 0xb7f9, 0xbac9, 0xbaca, 0xbd4c, 0xbf64, 0xea75, 0xbf63, 0xed79, 0xc0fa, 0xf053, 0xf473, 0xa5d8, 0xa86e, 0xcd78, 0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79, 0xcfe5, 0xacdb, 0xacda, 0xcfe7, 0xcfe6, 0xacdf, 0xacde, 0xacd9, 0xcfe1, 0xcfe2, 0xcfe3, 0xace0, 0xcfe0, 0xacdc, 0xcfe4, 0xacdd, 0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2ce, 0xd2cd, 0xaf75, 0xaf76, 0xd2d7, 0xd2d2, 0xd6b0, 0xd2d8, 0xaf77, 0xaf74, 0xd6aa, 0xd6a9, 0xd6ab, 0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2, 0xb2b5, 0xb2b2, 0xb2b6, 0xd6a8, 0xb2b7, 0xd6b1, 0xb2b4, 0xd6af, 0xb2b3, 0xdabc, 0xdabe, 0xdaba, 0xdabb, 0xdabf, 0xdac1, 0xdac2, 0xdabd, 0xdac0, 0xb574, 0xdedb, 0xdee0, 0xded8, 0xdedc, 0xdee1, 0xdedd, 0xb7fa, 0xb843, 0xb7fd, 0xded9, 0xdeda, 0xbace, 0xb846, 0xb7fe, 0xb844, 0xb7fc, 0xdedf, 0xb845, 0xdede, 0xb841, 0xb7fb, 0xb842, 0xdee2, 0xe2e6, 0xe2e8, 0xb840, 0xe2e3, 0xbacc, 0xe2e9, 0xbacd, 0xe2e7, 0xe2e2, 0xe2e5, 0xe2ea, 0xbacb, 0xe2e4, 0xbd4e, 0xe6bf, 0xe6be, 0xbd51, 0xbd4f, 0xe6bc, 0xbd4d, 0xe6bd, 0xbd50, 0xea7d, 0xeaa1, 0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66, 0xbf67, 0xbf65, 0xea78, 0xea7b, 0xea7c, 0xbf68, 0xc140, 0xeda3, 0xc0fc, 0xed7b, 0xc0fe, 0xc141, 0xc0fd, 0xeda2, 0xed7c, 0xc0fb, 0xeda1, 0xed7a, 0xed7e, 0xed7d, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2, 0xc2a3, 0xf054, 0xf27b, 0xc3a9, 0xf279, 0xf27a, 0xf474, 0xf477, 0xf475, 0xf476, 0xf5e0, 0xc4ef, 0xf7eb, 0xf8b4, 0xc5f7, 0xf8f8, 0xf8f9, 0xc666, 0xa5d9, 0xace1, 0xdac3, 0xdee3, 0xa5da, 0xa86f, 0xaabe, 0xcfe8, 0xcfe9, 0xaf78, 0xdac4, 0xb575, 0xb847, 0xc142, 0xeda4, 0xf27c, 0xf478, 0xa5db, 0xcda1, 0xcd7a, 0xcd7c, 0xcd7e, 0xcd7d, 0xcd7b, 0xaabf, 0xace2, 0xcff2, 0xcfed, 0xcfea, 0xcff1, 0xace4, 0xace5, 0xcff0, 0xcfef, 0xcfee, 0xcfeb, 0xcfec, 0xcff3, 0xace3, 0xaf7c, 0xafa4, 0xafa3, 0xd2e1, 0xd2db, 0xd2d9, 0xafa1, 0xd6b9, 0xaf7a, 0xd2de, 0xd2e2, 0xd2e4, 0xd2e0, 0xd2da, 0xafa2, 0xd2df, 0xd2dd, 0xaf79, 0xd2e5, 0xafa5, 0xd2e3, 0xaf7d, 0xd2dc, 0xaf7e, 0xaf7b, 0xb2b9, 0xd6ba, 0xd6b3, 0xd6b5, 0xd6b7, 0xd6b8, 0xd6b6, 0xb2ba, 0xd6bb, 0xd6b4, 0xdac8, 0xb576, 0xdad0, 0xdac5, 0xdad1, 0xdac6, 0xdac7, 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577, 0xdac9, 0xdacc, 0xb578, 0xdacd, 0xdaca, 0xdeee, 0xdef2, 0xb84e, 0xe2f0, 0xb851, 0xdef0, 0xdeed, 0xdee8, 0xdeea, 0xdeeb, 0xdee4, 0xb84d, 0xb84c, 0xb848, 0xdee7, 0xb84f, 0xb850, 0xdee6, 0xdee9, 0xdef1, 0xb84a, 0xb84b, 0xdeef, 0xdee5, 0xe2f2, 0xbad0, 0xe2f4, 0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3, 0xbad1, 0xe2ef, 0xbad3, 0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0xb849, 0xe2eb, 0xbad2, 0xe2ed, 0xbd54, 0xe6c1, 0xbd58, 0xbd56, 0xbacf, 0xe6c8, 0xe6c9, 0xbd53, 0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5, 0xe6c2, 0xbd59, 0xe6c4, 0xe6c6, 0xbd57, 0xbf6a, 0xeaa8, 0xeaa2, 0xeaa6, 0xeaac, 0xeaad, 0xeaa9, 0xeaaa, 0xeaa7, 0xeaa4, 0xbf6c, 0xbf69, 0xeaa3, 0xeaa5, 0xbf6b, 0xeaab, 0xc146, 0xedaa, 0xeda5, 0xc145, 0xc143, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6, 0xedad, 0xf056, 0xc147, 0xeda7, 0xedae, 0xedab, 0xf05a, 0xf057, 0xc2a6, 0xf05b, 0xf05d, 0xf05c, 0xf058, 0xf059, 0xf2a3, 0xc3aa, 0xf27e, 0xf2a2, 0xf27d, 0xf2a4, 0xf2a1, 0xf47a, 0xf47d, 0xf479, 0xc471, 0xf47b, 0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473, 0xf5e1, 0xf5e3, 0xf5e2, 0xf6f6, 0xf8b5, 0xf8fa, 0xa5dc, 0xcb72, 0xaac0, 0xcda3, 0xaac1, 0xaac2, 0xcda2, 0xcff8, 0xcff7, 0xace6, 0xace9, 0xace8, 0xace7, 0xcff4, 0xcff6, 0xcff5, 0xd2e8, 0xafa7, 0xd2ec, 0xd2eb, 0xd2ea, 0xd2e6, 0xafa6, 0xafaa, 0xafad, 0xafae, 0xd2e7, 0xd2e9, 0xafac, 0xafab, 0xafa9, 0xafa8, 0xd6c2, 0xd6c0, 0xd6bc, 0xb2bb, 0xd6bd, 0xb2bc, 0xd6be, 0xd6bf, 0xd6c1, 0xb2bd, 0xdad5, 0xdad4, 0xdad3, 0xdad2, 0xdef6, 0xb852, 0xdef3, 0xdef5, 0xb853, 0xb854, 0xdef4, 0xe341, 0xe2f9, 0xe2fa, 0xbad7, 0xbad5, 0xbad6, 0xe343, 0xe342, 0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb, 0xe340, 0xe2f8, 0xe6cb, 0xe6d0, 0xe6ce, 0xe6cd, 0xe6cc, 0xe6cf, 0xeaae, 0xbf6d, 0xc148, 0xedb0, 0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0xf2a5, 0xc3ab, 0xf4a1, 0xc5a1, 0xf6f7, 0xf8b7, 0xf8b6, 0xc9a8, 0xacea, 0xaceb, 0xd6c3, 0xb856, 0xa5dd, 0xa872, 0xa871, 0xa870, 0xcda4, 0xaac4, 0xaac3, 0xacee, 0xcffa, 0xcffd, 0xcffb, 0xacec, 0xaced, 0xcff9, 0xcffc, 0xafb5, 0xd2f3, 0xd2f5, 0xd2f4, 0xafb2, 0xd2ef, 0xafb0, 0xafaf, 0xafb3, 0xafb1, 0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0, 0xd6c6, 0xd6c7, 0xd6c5, 0xd6c4, 0xb2be, 0xb57d, 0xdad6, 0xdad8, 0xdada, 0xb57c, 0xb57a, 0xdad7, 0xb57b, 0xdad9, 0xb579, 0xdf41, 0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0xdefb, 0xdef8, 0xdef9, 0xb858, 0xdf40, 0xb857, 0xb85c, 0xb85b, 0xb859, 0xdefd, 0xe349, 0xe348, 0xe344, 0xbad8, 0xe347, 0xe346, 0xbad9, 0xbd5e, 0xe6d2, 0xbd5f, 0xbd5b, 0xbd5d, 0xbd5a, 0xbd5c, 0xeaaf, 0xbf70, 0xeab1, 0xeab0, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0xedb5, 0xedb3, 0xc14a, 0xedb4, 0xedb6, 0xedb2, 0xedb1, 0xf060, 0xc2aa, 0xc2a8, 0xc2a9, 0xf2a6, 0xf2a7, 0xc3ad, 0xc3ac, 0xf4a3, 0xf4a4, 0xf4a2, 0xf6f8, 0xf6f9, 0xa5de, 0xca48, 0xa873, 0xcda5, 0xaac6, 0xaac5, 0xcda6, 0xd040, 0xacef, 0xcffe, 0xacf0, 0xafb6, 0xd2f8, 0xd2f6, 0xd2fc, 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9, 0xd2fa, 0xd6c8, 0xd6ca, 0xb2bf, 0xd6c9, 0xb2c0, 0xb5a2, 0xb5a1, 0xb57e, 0xdadb, 0xdf44, 0xb85d, 0xb85e, 0xdf43, 0xdf42, 0xe34a, 0xbadb, 0xbada, 0xe34b, 0xe34c, 0xbd61, 0xbd60, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4, 0xeab2, 0xeab6, 0xeab3, 0xbf73, 0xedb7, 0xc14b, 0xedb8, 0xedb9, 0xc2ab, 0xc2ac, 0xc475, 0xc5d1, 0xa5df, 0xd041, 0xd2fd, 0xafb8, 0xb3ba, 0xb3b9, 0xb5a4, 0xdadd, 0xb5a3, 0xdadc, 0xdf45, 0xbadc, 0xe34d, 0xbadd, 0xc476, 0xf4a5, 0xa6cb, 0xaac7, 0xcda7, 0xacf2, 0xacf1, 0xd042, 0xd043, 0xd340, 0xd342, 0xafb9, 0xd344, 0xd347, 0xd345, 0xd346, 0xd343, 0xd2fe, 0xafba, 0xd348, 0xd341, 0xd6d3, 0xb2c6, 0xd6dc, 0xb2c3, 0xd6d5, 0xb2c7, 0xb2c1, 0xd6d0, 0xd6dd, 0xd6d1, 0xd6ce, 0xb2c5, 0xb2c2, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8, 0xb2c8, 0xd6d9, 0xd6cf, 0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb, 0xd6db, 0xdadf, 0xdae4, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc, 0xdae1, 0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad, 0xb5a8, 0xb5ae, 0xb5a9, 0xb5aa, 0xb5a6, 0xdae5, 0xb861, 0xdf50, 0xdf53, 0xdf47, 0xdf4c, 0xdf46, 0xb863, 0xdf4a, 0xdf48, 0xb862, 0xdf4f, 0xdf4e, 0xdf4b, 0xdf4d, 0xdf49, 0xbae1, 0xdf52, 0xb85f, 0xdf51, 0xe35d, 0xbae8, 0xe358, 0xbae7, 0xe34e, 0xe350, 0xbae0, 0xe355, 0xe354, 0xe357, 0xbae5, 0xe352, 0xe351, 0xbae4, 0xbadf, 0xe353, 0xbae2, 0xe359, 0xe35b, 0xe356, 0xe34f, 0xbae3, 0xbd69, 0xbade, 0xe35c, 0xe6d9, 0xbd62, 0xe6db, 0xbd63, 0xbd65, 0xe6de, 0xe6d6, 0xbae6, 0xe6dc, 0xe6d8, 0xb860, 0xbd68, 0xbd64, 0xbd66, 0xbd67, 0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0xe6da, 0xeac0, 0xeabb, 0xeac5, 0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba, 0xeab7, 0xeac6, 0xc151, 0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc, 0xbf7b, 0xeab9, 0xeabe, 0xbf7a, 0xeac1, 0xeac4, 0xedcb, 0xedcc, 0xedbc, 0xedc3, 0xedc1, 0xc14f, 0xedc8, 0xeabf, 0xedbf, 0xedc9, 0xc14e, 0xedbe, 0xedbd, 0xedc7, 0xedc4, 0xedc6, 0xedba, 0xedca, 0xc14c, 0xedc5, 0xedce, 0xedc2, 0xc150, 0xc14d, 0xedc0, 0xedbb, 0xedcd, 0xbf75, 0xf063, 0xf061, 0xf067, 0xc2b0, 0xf065, 0xf064, 0xc2b2, 0xf06a, 0xc2b1, 0xf06b, 0xf068, 0xc2ae, 0xf069, 0xf062, 0xc2af, 0xc2ad, 0xf2ab, 0xf066, 0xf06c, 0xf2a8, 0xc3b2, 0xc3b0, 0xf2aa, 0xf2ac, 0xf2a9, 0xc3b1, 0xc3ae, 0xc3af, 0xc3b3, 0xc478, 0xf4aa, 0xf4a9, 0xf4a7, 0xf4a6, 0xf4a8, 0xc477, 0xc479, 0xc4f0, 0xf5e5, 0xf5e4, 0xf6fa, 0xf6fc, 0xf6fe, 0xf6fd, 0xf6fb, 0xc5a3, 0xc5a2, 0xc5d3, 0xc5d2, 0xc5d4, 0xf7ed, 0xf7ec, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0xc659, 0xf96d, 0xc67e, 0xa6cc, 0xcda8, 0xd045, 0xd046, 0xd044, 0xacf3, 0xd047, 0xd048, 0xd049, 0xd349, 0xd34f, 0xd34d, 0xafbb, 0xd34b, 0xd34c, 0xd34e, 0xd34a, 0xb2c9, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca, 0xd6df, 0xdae8, 0xb5af, 0xdaea, 0xdae7, 0xd6e1, 0xb5b0, 0xdae9, 0xdf56, 0xb864, 0xdf54, 0xb865, 0xdf55, 0xb866, 0xbae9, 0xe361, 0xe35e, 0xe360, 0xbaea, 0xbaeb, 0xe35f, 0xe6df, 0xe6e0, 0xbd6b, 0xe6e2, 0xe6e1, 0xa261, 0xeaca, 0xeacb, 0xeac7, 0xeac8, 0xbf7c, 0xbf7d, 0xeac9, 0xc157, 0xc153, 0xc158, 0xc154, 0xc156, 0xc152, 0xc155, 0xc2b3, 0xedcf, 0xf2ae, 0xf2ad, 0xf4ab, 0xc47a, 0xc47b, 0xf741, 0xf5e6, 0xf740, 0xf8fd, 0xf9a4, 0xa6cd, 0xa874, 0xcda9, 0xaac8, 0xacf6, 0xd04c, 0xacf4, 0xd04a, 0xacf9, 0xacf5, 0xacfa, 0xacf8, 0xd04b, 0xacf7, 0xafbf, 0xafbe, 0xd35a, 0xafc7, 0xd353, 0xd359, 0xafc3, 0xd352, 0xd358, 0xd356, 0xafc2, 0xafc4, 0xd355, 0xafbd, 0xd354, 0xafc8, 0xafc5, 0xafc9, 0xafc6, 0xd351, 0xd350, 0xd357, 0xafc0, 0xafbc, 0xafc1, 0xd6f0, 0xd6e9, 0xb5b5, 0xd6e8, 0xb2cf, 0xb2d6, 0xb2d3, 0xb2d9, 0xb2d8, 0xb2d4, 0xd6e2, 0xd6e5, 0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef, 0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed, 0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd, 0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb, 0xd6ee, 0xdafb, 0xdaf2, 0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7, 0xb5b4, 0xdaef, 0xdaeb, 0xb86c, 0xdaf4, 0xb5b1, 0xdafa, 0xb5b8, 0xb5ba, 0xdaed, 0xb5b9, 0xdaf0, 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5, 0xdaf3, 0xb5b6, 0xdaec, 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0xb868, 0xdf5d, 0xdf5f, 0xdf61, 0xdf65, 0xdf5b, 0xdf59, 0xb86a, 0xdf60, 0xdf64, 0xdf5c, 0xdf58, 0xdf57, 0xdf62, 0xdf5a, 0xdf5e, 0xb86b, 0xb869, 0xdf66, 0xb867, 0xdf63, 0xe372, 0xbaee, 0xe36a, 0xbd78, 0xe374, 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0xe375, 0xe362, 0xe377, 0xe366, 0xbafe, 0xbafb, 0xe376, 0xe370, 0xbaed, 0xbaf5, 0xbaf4, 0xbaf3, 0xbaf9, 0xe363, 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373, 0xbaef, 0xbaf0, 0xbaf8, 0xe368, 0xe367, 0xe364, 0xe36c, 0xe369, 0xe36d, 0xbafd, 0xe379, 0xbaf2, 0xe36e, 0xe36f, 0xe36b, 0xbafc, 0xe6e7, 0xbd70, 0xbd79, 0xbd75, 0xe6e4, 0xbd72, 0xbd76, 0xe6f0, 0xbd6c, 0xe6e8, 0xbd74, 0xe6eb, 0xe6e6, 0xbd73, 0xbd77, 0xe6e5, 0xbd71, 0xe6ef, 0xbd6e, 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d, 0xe6ec, 0xe6e3, 0xbd7b, 0xe6ea, 0xbd6f, 0xe6e9, 0xbfa2, 0xbfa7, 0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9, 0xbfa8, 0xbfa1, 0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace, 0xead6, 0xbfa3, 0xead4, 0xbfa6, 0xbfa5, 0xead0, 0xead1, 0xeacd, 0xead7, 0xbfa4, 0xeade, 0xeadd, 0xedda, 0xedd6, 0xc15f, 0xedd0, 0xc159, 0xc169, 0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164, 0xc167, 0xedde, 0xc15c, 0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1, 0xc160, 0xc15a, 0xc168, 0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf, 0xc162, 0xc15b, 0xedd9, 0xc166, 0xedd7, 0xeddb, 0xf06e, 0xf074, 0xc2b9, 0xf077, 0xc2b4, 0xc2b5, 0xf06f, 0xf076, 0xf071, 0xc2ba, 0xc2b7, 0xf06d, 0xc2b6, 0xf073, 0xf075, 0xc2b8, 0xf072, 0xf070, 0xf2b8, 0xc3b7, 0xc3b8, 0xc3b4, 0xc3b5, 0xf2b4, 0xf2b2, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0, 0xf2af, 0xf2b3, 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d, 0xf4ad, 0xf4af, 0xf4ae, 0xc4a1, 0xf5eb, 0xf5e8, 0xf5e9, 0xf5e7, 0xf5ea, 0xc4f2, 0xf5ec, 0xc4f1, 0xf742, 0xc5d5, 0xc5d7, 0xf7ee, 0xc5d6, 0xf8b9, 0xf940, 0xf942, 0xf8fe, 0xf941, 0xc66c, 0xa6ce, 0xacfb, 0xd26f, 0xafca, 0xb2da, 0xdafc, 0xdafd, 0xeadf, 0xc16a, 0xede1, 0xc2bb, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0xf743, 0xc5f8, 0xca49, 0xaac9, 0xa875, 0xd04d, 0xd360, 0xd35b, 0xd35f, 0xd35d, 0xafcb, 0xd35e, 0xd35c, 0xd6f1, 0xdafe, 0xdb40, 0xdf69, 0xdf6a, 0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67, 0xb86d, 0xbb40, 0xb870, 0xe37a, 0xbd7c, 0xe6f1, 0xbd7d, 0xbfa9, 0xeae2, 0xeae0, 0xeae1, 0xede4, 0xede3, 0xede2, 0xf2bb, 0xc3b9, 0xf2bc, 0xf744, 0xc5f9, 0xf8ba, 0xa6cf, 0xaacb, 0xaaca, 0xd04f, 0xacfc, 0xd04e, 0xd362, 0xafcc, 0xd6f2, 0xd361, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db, 0xdb42, 0xdb43, 0xdb41, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e, 0xb872, 0xb871, 0xe6f2, 0xe6f4, 0xbd7e, 0xe6f3, 0xeae3, 0xbfaa, 0xf079, 0xf078, 0xc3bb, 0xf2bd, 0xc3bd, 0xc3bc, 0xf4b0, 0xf5ee, 0xc4f3, 0xa6d0, 0xd050, 0xacfd, 0xd365, 0xafce, 0xd364, 0xd363, 0xafcd, 0xd6fb, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd, 0xd6f8, 0xb2de, 0xd6fc, 0xd6f9, 0xd6fa, 0xb2df, 0xb5be, 0xb5bf, 0xdb44, 0xdf6f, 0xdf70, 0xe37e, 0xbb43, 0xbb41, 0xbb42, 0xe37b, 0xe37c, 0xe37d, 0xe6f9, 0xe6fa, 0xbda1, 0xe6f7, 0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4, 0xbfab, 0xbfac, 0xede6, 0xc16b, 0xede5, 0xefa8, 0xf07a, 0xf07b, 0xc2bc, 0xc2bd, 0xc16c, 0xf2be, 0xf2bf, 0xf4b1, 0xc4a3, 0xa6d1, 0xa6d2, 0xacfe, 0xaacc, 0xafcf, 0xd051, 0xb5c0, 0xa6d3, 0xad41, 0xd052, 0xd053, 0xad40, 0xad42, 0xa6d4, 0xd054, 0xafd1, 0xd366, 0xafd3, 0xafd0, 0xafd2, 0xd741, 0xb2e0, 0xd740, 0xd6fe, 0xdf71, 0xe3a1, 0xbda2, 0xbfae, 0xeae6, 0xeae5, 0xede7, 0xf5ef, 0xa6d5, 0xcb73, 0xcdaa, 0xad43, 0xd055, 0xd368, 0xafd4, 0xd367, 0xafd5, 0xd743, 0xb2e2, 0xd742, 0xd744, 0xb2e1, 0xdb46, 0xdb47, 0xdb45, 0xb5c1, 0xb874, 0xb875, 0xbb45, 0xe3a3, 0xe3a2, 0xbb44, 0xe6fb, 0xe6fc, 0xeae7, 0xc170, 0xc16f, 0xc16d, 0xc16e, 0xc171, 0xf07c, 0xc2bf, 0xc2be, 0xf2c0, 0xf4b2, 0xc5a5, 0xc5a4, 0xa6d6, 0xd1fb, 0xb877, 0xb5c2, 0xb876, 0xbb46, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9, 0xcdab, 0xcb76, 0xcb77, 0xa877, 0xcb74, 0xa876, 0xa879, 0xcb75, 0xa87b, 0xa87a, 0xcb78, 0xa878, 0xaad1, 0xaacf, 0xcdad, 0xaace, 0xaad3, 0xaad5, 0xaad2, 0xcdb0, 0xcdac, 0xaad6, 0xaad0, 0xa87c, 0xaad4, 0xcdaf, 0xcdae, 0xaacd, 0xd05b, 0xad47, 0xad48, 0xd05d, 0xd057, 0xd05a, 0xd063, 0xd061, 0xad49, 0xd067, 0xad4c, 0xd064, 0xd05c, 0xd059, 0xdb49, 0xd062, 0xad44, 0xd065, 0xd056, 0xd05f, 0xad46, 0xad4b, 0xd060, 0xad4f, 0xad4d, 0xd058, 0xad4a, 0xd05e, 0xad4e, 0xad45, 0xd066, 0xafda, 0xafe3, 0xafd8, 0xafd6, 0xd36a, 0xafde, 0xafdb, 0xd36c, 0xafdd, 0xd36b, 0xd369, 0xd36e, 0xafe2, 0xafe0, 0xdb48, 0xd36f, 0xd36d, 0xafd7, 0xafd9, 0xafdc, 0xafdf, 0xafe1, 0xd74e, 0xb2e4, 0xd745, 0xd747, 0xd748, 0xd750, 0xd74c, 0xd74a, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746, 0xd74f, 0xb2e7, 0xb2e6, 0xd74b, 0xd749, 0xb2e3, 0xb2e8, 0xb5c8, 0xdb51, 0xdb4f, 0xb5ca, 0xdb4a, 0xdfa1, 0xb5c9, 0xdb4e, 0xdb4b, 0xb5c5, 0xb5cb, 0xdb50, 0xb5c7, 0xdb4d, 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4, 0xb5c3, 0xdf77, 0xdf75, 0xdf7b, 0xdf73, 0xdfa2, 0xdf78, 0xdf72, 0xb87b, 0xb8a3, 0xdf7d, 0xdf76, 0xb87e, 0xb87c, 0xdf7e, 0xb879, 0xb878, 0xdf79, 0xb87d, 0xb5cd, 0xdf7c, 0xdf74, 0xb87a, 0xb8a1, 0xb8a2, 0xbb4c, 0xbb48, 0xbb4d, 0xe3a6, 0xe3a5, 0xe3a7, 0xbb4a, 0xe3a4, 0xbb4b, 0xe3aa, 0xe3a9, 0xe3a8, 0xbb49, 0xe741, 0xe744, 0xbda8, 0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe, 0xbda6, 0xe742, 0xe6fd, 0xeae9, 0xeaf3, 0xbfb1, 0xbfb0, 0xeaed, 0xeaef, 0xeaea, 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0, 0xeaec, 0xeaf2, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178, 0xc17a, 0xc177, 0xc176, 0xc175, 0xc173, 0xede9, 0xedec, 0xc172, 0xeded, 0xc179, 0xedeb, 0xedea, 0xc2c0, 0xc2c1, 0xf0a1, 0xf07d, 0xf07e, 0xf2c2, 0xf2c1, 0xc3be, 0xf4b4, 0xc4a4, 0xf4b3, 0xf5f0, 0xf745, 0xc5a6, 0xf943, 0xf944, 0xc5d8, 0xa6da, 0xaad7, 0xdb52, 0xbb4e, 0xc17b, 0xedef, 0xa6db, 0xafe5, 0xafe4, 0xdb53, 0xeaf4, 0xa6dc, 0xad50, 0xdb54, 0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0xaad8, 0xd068, 0xafe6, 0xd370, 0xb2ea, 0xdb57, 0xb8a4, 0xbb50, 0xbfb3, 0xc17c, 0xc2c2, 0xf4b5, 0xa6de, 0xaad9, 0xafe7, 0xd752, 0xb5ce, 0xbb51, 0xe3ab, 0xe745, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0, 0xcdb1, 0xd069, 0xad51, 0xd372, 0xafea, 0xafe8, 0xafe9, 0xafeb, 0xd371, 0xd757, 0xd754, 0xd756, 0xb2eb, 0xb2ed, 0xb2ec, 0xd753, 0xb2ee, 0xd755, 0xdb58, 0xdb59, 0xdb5a, 0xdfa6, 0xdfa7, 0xdfa5, 0xdfa8, 0xb8a5, 0xdfa4, 0xbb53, 0xe74a, 0xe746, 0xe749, 0xe74b, 0xe748, 0xe747, 0xeaf5, 0xeaf6, 0xeaf7, 0xbfb4, 0xbfb5, 0xedf1, 0xedf0, 0xedf2, 0xf0a3, 0xf0a2, 0xf2c4, 0xf2c5, 0xf2c3, 0xc4a5, 0xf4b6, 0xf4b7, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d, 0xc17d, 0xa6e2, 0xd758, 0xdb5b, 0xc641, 0xca4a, 0xca4b, 0xca4d, 0xa6e3, 0xca4e, 0xca4c, 0xcba2, 0xcba3, 0xcb7b, 0xcba1, 0xa8a1, 0xa8a2, 0xcb7c, 0xcb7a, 0xcb79, 0xcb7d, 0xa87e, 0xcb7e, 0xd06a, 0xcdb6, 0xaadc, 0xcdb5, 0xcdb7, 0xaadb, 0xcdbc, 0xaadf, 0xcdb2, 0xcdc0, 0xcdc6, 0xaae6, 0xcdc3, 0xaae3, 0xcdb9, 0xcdbf, 0xcdc1, 0xcdb4, 0xaae2, 0xaadd, 0xcdba, 0xaae4, 0xaae7, 0xaae1, 0xaada, 0xcdbe, 0xcdb8, 0xcdc5, 0xaae9, 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade, 0xaae8, 0xcdb3, 0xcdc2, 0xcdc4, 0xad62, 0xad5c, 0xad64, 0xad61, 0xd071, 0xd074, 0xad5d, 0xd06b, 0xad56, 0xad60, 0xad63, 0xad65, 0xd0a2, 0xd077, 0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52, 0xd06f, 0xd07e, 0xd073, 0xd076, 0xd0a5, 0xad66, 0xd07d, 0xad5e, 0xd078, 0xd0a4, 0xd075, 0xd079, 0xd07c, 0xd06d, 0xd0a3, 0xd07b, 0xd06c, 0xd070, 0xad5f, 0xad5a, 0xad53, 0xad58, 0xad54, 0xad67, 0xd06e, 0xd3a5, 0xad5b, 0xd07a, 0xce41, 0xd3a8, 0xaffa, 0xd376, 0xd3a3, 0xd37d, 0xd3b2, 0xd3aa, 0xd37e, 0xd3a9, 0xd378, 0xd37c, 0xd3b5, 0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0xd3ac, 0xaffc, 0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab, 0xaff1, 0xaff8, 0xd072, 0xdb5c, 0xd3a6, 0xd37a, 0xaffb, 0xd37b, 0xd3a1, 0xaffe, 0xd375, 0xd3af, 0xd3ae, 0xd3b6, 0xaff3, 0xaff0, 0xd3b4, 0xd3b0, 0xd3a7, 0xd3a2, 0xaff6, 0xaff2, 0xd377, 0xafee, 0xd3b1, 0xafef, 0xd379, 0xd75e, 0xd760, 0xd765, 0xd779, 0xb2fc, 0xb2f2, 0xd75d, 0xb2fd, 0xb2fe, 0xd768, 0xd76f, 0xd775, 0xd762, 0xd769, 0xb340, 0xd777, 0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef, 0xd761, 0xd759, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773, 0xb2f1, 0xd764, 0xd77a, 0xd76c, 0xd76b, 0xb2f0, 0xb2fb, 0xb2f3, 0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341, 0xd75b, 0xd767, 0xd76d, 0xb2f6, 0xd778, 0xd771, 0xd774, 0xb2f5, 0xdb6c, 0xdb60, 0xb5d7, 0xdb7d, 0xdba7, 0xdbaa, 0xb5d5, 0xdb68, 0xdba3, 0xdb69, 0xdb77, 0xb5e2, 0xdb73, 0xb5df, 0xdb74, 0xdb5d, 0xdba4, 0xb5e8, 0xdba1, 0xdb75, 0xdbac, 0xdb70, 0xdfc8, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a, 0xb5e9, 0xb5d4, 0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0xdb63, 0xdb61, 0xb5d0, 0xdba5, 0xdb6a, 0xdba8, 0xdba9, 0xb5d8, 0xb5dd, 0xb5d9, 0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0xb5d2, 0xdb5e, 0xdba2, 0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71, 0xdb6d, 0xb5d1, 0xb5e5, 0xdb7c, 0xb5e7, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3, 0xb5e4, 0xdb79, 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0xdbae, 0xdb5f, 0xdfc7, 0xdfdd, 0xb855, 0xdfcc, 0xdfca, 0xdfb5, 0xb8a9, 0xdfc5, 0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf, 0xb5e3, 0xdfcf, 0xdfc0, 0xdfd6, 0xb8b0, 0xb8a8, 0xdfaa, 0xdfb2, 0xdfcb, 0xdfc3, 0xdfdc, 0xdfc6, 0xb8b6, 0xdfd7, 0xb8ad, 0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0, 0xdfe1, 0xdfb1, 0xdfd2, 0xdfdf, 0xdfab, 0xb5db, 0xdfb9, 0xdfb8, 0xb8af, 0xdfbc, 0xdfbe, 0xdfcd, 0xdfde, 0xb8b2, 0xb8b3, 0xdfb0, 0xb8ab, 0xdfb4, 0xdfda, 0xb8b4, 0xb8ac, 0xb8ae, 0xb8b5, 0xdfe0, 0xdfd3, 0xdfce, 0xdfbb, 0xdfba, 0xb8aa, 0xdfac, 0xb8a7, 0xdfc4, 0xdfad, 0xdfc2, 0xdfb7, 0xdfdb, 0xb8a6, 0xdfb3, 0xdfaf, 0xdfd5, 0xdfae, 0xbb60, 0xe3d3, 0xe3c2, 0xe3ac, 0xe3ca, 0xbb58, 0xe3bb, 0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af, 0xe3cd, 0xe3ae, 0xe3c1, 0xe3ad, 0xe3bf, 0xe3c8, 0xe3c6, 0xe3ba, 0xe3b5, 0xe3b3, 0xe3b4, 0xe3c7, 0xe3d2, 0xe3bc, 0xbb5a, 0xe3b7, 0xe3cb, 0xbb5d, 0xe3b6, 0xe3b0, 0xe3c0, 0xbb61, 0xbb55, 0xbb5e, 0xe3b8, 0xe3b2, 0xbb57, 0xdfd4, 0xbb56, 0xe3c3, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9, 0xe3b1, 0xe3cc, 0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0xe3c9, 0xe3ce, 0xe3d1, 0xe773, 0xe774, 0xe767, 0xe766, 0xe762, 0xbdb4, 0xbdac, 0xe776, 0xe775, 0xdfa9, 0xe75f, 0xe763, 0xe75d, 0xe770, 0xe761, 0xe777, 0xe75a, 0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6, 0xe74f, 0xe76d, 0xbdb7, 0xdfbd, 0xe75b, 0xe752, 0xe755, 0xe77b, 0xe75c, 0xe753, 0xe751, 0xe74e, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3, 0xe760, 0xe768, 0xbda9, 0xe778, 0xe77c, 0xbdab, 0xe757, 0xe76b, 0xe76f, 0xe754, 0xe779, 0xbdb2, 0xbdb1, 0xe74c, 0xbdb5, 0xe772, 0xe756, 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c, 0xe77d, 0xe77a, 0xe771, 0xe74d, 0xbdaa, 0xeb49, 0xeb40, 0xeb43, 0xbfbb, 0xeb45, 0xeaf9, 0xeb41, 0xeb47, 0xbfb8, 0xbfbc, 0xbfb6, 0xeafb, 0xeb4c, 0xeb46, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46, 0xeafe, 0xbfb7, 0xeb4a, 0xeb54, 0xbfbf, 0xeb51, 0xeafd, 0xeb44, 0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50, 0xbfb9, 0xbfba, 0xbfbe, 0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0xeb4b, 0xeb4e, 0xee53, 0xee40, 0xee45, 0xee52, 0xee44, 0xedfb, 0xee41, 0xc1a2, 0xedf4, 0xee4d, 0xee4f, 0xedf3, 0xc1a1, 0xee51, 0xee49, 0xc1a8, 0xee50, 0xee42, 0xc1aa, 0xedf9, 0xeb52, 0xee4a, 0xee47, 0xedf5, 0xee55, 0xc1a4, 0xc1a5, 0xedf7, 0xee48, 0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3, 0xee4c, 0xedfe, 0xee56, 0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc, 0xc2cb, 0xedf6, 0xc1a9, 0xc2c4, 0xc17e, 0xc1a6, 0xc2c8, 0xf0b3, 0xf0a9, 0xf0a4, 0xf0aa, 0xf0b4, 0xf0b8, 0xf0b7, 0xc2ca, 0xc2c9, 0xf0ab, 0xf0b9, 0xf0ae, 0xf0a6, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2, 0xf0a5, 0xf0ac, 0xf0b1, 0xc2c7, 0xf0af, 0xc2c5, 0xf0b0, 0xc2c3, 0xc2c6, 0xf2d5, 0xf0b5, 0xc3c2, 0xf2cd, 0xf2d1, 0xf2c9, 0xf2cc, 0xf2d4, 0xc3c0, 0xf2d9, 0xf2d2, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3, 0xc3c4, 0xf2d7, 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8, 0xf2d8, 0xf2d6, 0xf2c7, 0xf2cf, 0xf4be, 0xc3c5, 0xf2d0, 0xc4a7, 0xc4a9, 0xc4a6, 0xf4c3, 0xf4bb, 0xf4b9, 0xf4bd, 0xf4ba, 0xf4bf, 0xf4c1, 0xc4aa, 0xc4ac, 0xf4c0, 0xc4ad, 0xc4ab, 0xf4c2, 0xc4a8, 0xc4f4, 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0xf5fd, 0xf5f4, 0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8, 0xf5fc, 0xf5f2, 0xf74a, 0xc4f5, 0xf5f9, 0xf7f4, 0xf74b, 0xf749, 0xf747, 0xf748, 0xf74c, 0xc5d9, 0xf7f2, 0xf7f0, 0xf7f5, 0xf7f3, 0xf7f6, 0xc5da, 0xf7f1, 0xf8bc, 0xf945, 0xf946, 0xf947, 0xf9c7, 0xf9bd, 0xca4f, 0xaaea, 0xad68, 0xd3b8, 0xd3b7, 0xb040, 0xb342, 0xd77c, 0xd77b, 0xb5ea, 0xb8b8, 0xb8b7, 0xb8b9, 0xe3d4, 0xe77e, 0xeb58, 0xeb5a, 0xeb59, 0xc1ab, 0xee57, 0xf0ba, 0xf9a5, 0xa6e4, 0xcdc9, 0xcdca, 0xcdc8, 0xcdc7, 0xaaeb, 0xd0a9, 0xd0a7, 0xd0a6, 0xad69, 0xad6b, 0xad6a, 0xd0a8, 0xd3c4, 0xd3c1, 0xd3bf, 0xb041, 0xd3c2, 0xb046, 0xd3bc, 0xd3cb, 0xd3cd, 0xd3bd, 0xb043, 0xd3ce, 0xd3c9, 0xd3bb, 0xd3c0, 0xd3ca, 0xd3c6, 0xd3c3, 0xb048, 0xd3cc, 0xd3be, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0xd3c8, 0xd3ba, 0xb045, 0xb042, 0xb34c, 0xd7a5, 0xb34b, 0xd7a8, 0xd7ab, 0xb348, 0xb346, 0xd77e, 0xd7a9, 0xd7a7, 0xd7a4, 0xd7ac, 0xd7ad, 0xd7af, 0xd7b0, 0xd77d, 0xb345, 0xd7a2, 0xd7a1, 0xd7ae, 0xb347, 0xd7a3, 0xb349, 0xb344, 0xd7a6, 0xb34d, 0xb34a, 0xd7aa, 0xb5f1, 0xdbbf, 0xdbb4, 0xb5ee, 0xdfe7, 0xdbbd, 0xdbb1, 0xb5ec, 0xdbb6, 0xb5ef, 0xdbba, 0xdbb8, 0xb5f2, 0xb5eb, 0xdbb2, 0xdbb5, 0xb5f0, 0xdbb3, 0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb, 0xb5ed, 0xdfe8, 0xdfee, 0xdfe4, 0xdfea, 0xb8ba, 0xdfe6, 0xb8c0, 0xb8bf, 0xb8be, 0xdfed, 0xb8c1, 0xb8c2, 0xdfe3, 0xdff0, 0xb8c3, 0xb8bd, 0xb8bc, 0xdfec, 0xb8c4, 0xdfe2, 0xdfe5, 0xdfef, 0xdfeb, 0xe3f4, 0xe3e9, 0xb8bb, 0xbb6a, 0xe3dd, 0xe3f2, 0xe3de, 0xbb65, 0xe3db, 0xe3e4, 0xe3dc, 0xbb67, 0xe3d6, 0xe3f1, 0xbb68, 0xe3ee, 0xe3ef, 0xe3d7, 0xbb6d, 0xe3e6, 0xe3e0, 0xe3e7, 0xe3da, 0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5, 0xbb69, 0xe3ec, 0xbb6c, 0xe3f0, 0xe3ea, 0xbb66, 0xe3e8, 0xe3e2, 0xbb64, 0xe3d9, 0xe3e1, 0xe3ed, 0xe3df, 0xe3e3, 0xbdc1, 0xdfe9, 0xe7b2, 0xe7bb, 0xe7b1, 0xe7ad, 0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b, 0xe7a1, 0xbdc0, 0xe7a7, 0xbdbf, 0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4, 0xe7ae, 0xe7b3, 0xbdbb, 0xe7ab, 0xe7be, 0xe7a2, 0xe7a3, 0xe7ba, 0xbdbc, 0xe7bf, 0xbdbe, 0xe7c0, 0xe7b0, 0xe3d8, 0xe7b6, 0xe7af, 0xe7b8, 0xe7b5, 0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4, 0xbdbd, 0xeb64, 0xe7b7, 0xe7bc, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67, 0xeb65, 0xeb60, 0xeb6f, 0xbfc4, 0xeb5c, 0xeb68, 0xeb69, 0xeb5f, 0xeb5e, 0xeb6c, 0xeb62, 0xeb5d, 0xeb63, 0xeb6e, 0xeb5b, 0xeb6d, 0xeb6a, 0xbfc2, 0xbfc1, 0xbfc3, 0xeb66, 0xf0cb, 0xee59, 0xc1b1, 0xee5d, 0xee5a, 0xee61, 0xee67, 0xee5c, 0xee70, 0xc1ae, 0xee6a, 0xee5f, 0xee6b, 0xee66, 0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60, 0xee6e, 0xee58, 0xee6c, 0xc1ac, 0xee64, 0xee63, 0xee68, 0xee5b, 0xc1b0, 0xc1b4, 0xee62, 0xee69, 0xc1b5, 0xee65, 0xc1ad, 0xc1af, 0xf0c7, 0xf0c5, 0xf0cc, 0xf0c9, 0xf0cd, 0xf0be, 0xf0c6, 0xf0d1, 0xee6f, 0xf0c2, 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4, 0xf0c1, 0xf0bc, 0xf0bb, 0xf0d0, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8, 0xc2cc, 0xc2ce, 0xf0c3, 0xf0cf, 0xf2de, 0xf2df, 0xc3c9, 0xf2dc, 0xc3c6, 0xf2e4, 0xc3ca, 0xf2e6, 0xf2db, 0xf0ce, 0xf2e8, 0xf2dd, 0xc3c7, 0xf2e3, 0xf2e5, 0xf2e0, 0xf2e7, 0xf2e2, 0xf2e1, 0xc3c8, 0xf4c5, 0xf4c6, 0xf4c8, 0xc4ae, 0xc4af, 0xf4c9, 0xf4c7, 0xf4c4, 0xf642, 0xf645, 0xf641, 0xc4fa, 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644, 0xf751, 0xf74f, 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0xf7f9, 0xf7d7, 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0xf8bf, 0xc5fa, 0xf8be, 0xf8bd, 0xc5fb, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8, 0xa6e5, 0xd0aa, 0xd3cf, 0xd3d0, 0xdbc0, 0xf647, 0xf8c0, 0xa6e6, 0xad6c, 0xd0ab, 0xd7b1, 0xb34e, 0xdbc2, 0xdbc1, 0xb5f3, 0xb8c5, 0xe7c1, 0xbdc3, 0xbdc4, 0xbfc5, 0xc5fc, 0xa6e7, 0xd0ac, 0xaaed, 0xd0ae, 0xd0ad, 0xad6d, 0xd3d1, 0xd3d8, 0xb049, 0xd3d6, 0xd3d4, 0xd3db, 0xd3d2, 0xd3d3, 0xb04a, 0xb04e, 0xd3dc, 0xb04d, 0xd3da, 0xd3d7, 0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0xb350, 0xd7b2, 0xb355, 0xd7c2, 0xb354, 0xd7c4, 0xd7b8, 0xb352, 0xd7c3, 0xd7b3, 0xb353, 0xd7bf, 0xd7bb, 0xd7bd, 0xd7b7, 0xd7be, 0xb34f, 0xd7ba, 0xd7b9, 0xd7b5, 0xd7c0, 0xd7bc, 0xd7b4, 0xd7b6, 0xb351, 0xd7c1, 0xb5f6, 0xdbcd, 0xdbc9, 0xdbcb, 0xdbc6, 0xdbc5, 0xdbc3, 0xdbca, 0xdbcc, 0xdbc8, 0xdbc7, 0xb5f4, 0xb5f5, 0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3, 0xdff4, 0xdff9, 0xb8cf, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4, 0xb8ca, 0xb8c8, 0xdff7, 0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6, 0xb8cc, 0xe3f6, 0xbb74, 0xe442, 0xe441, 0xe3fb, 0xbb76, 0xe440, 0xe3f7, 0xe3f8, 0xbb6e, 0xbb70, 0xe3fd, 0xe3f5, 0xbb72, 0xbb71, 0xe3f9, 0xe3fe, 0xe3fc, 0xbb73, 0xe3fa, 0xdbce, 0xbb6f, 0xe7c2, 0xe7c9, 0xbdc6, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0xe7cc, 0xbdc5, 0xe7cb, 0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6, 0xe7c7, 0xe7c8, 0xbb75, 0xeb70, 0xeb7c, 0xbfca, 0xeb77, 0xeb79, 0xbfc8, 0xeb71, 0xeb75, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b, 0xeb73, 0xeb74, 0xeb7a, 0xeb72, 0xeb76, 0xbfc7, 0xee72, 0xee71, 0xc1b7, 0xee77, 0xc1b9, 0xc1b6, 0xee73, 0xc1ba, 0xee74, 0xee75, 0xee78, 0xc1b8, 0xf0d6, 0xf0d9, 0xf0d3, 0xf0d5, 0xf0d4, 0xf0d7, 0xf0d8, 0xee76, 0xf0d2, 0xc3cd, 0xf2ec, 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0, 0xc3ce, 0xc3cc, 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0xf4cb, 0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8, 0xf752, 0xc5a7, 0xf7fd, 0xf7fc, 0xf7fb, 0xf948, 0xf949, 0xf94b, 0xf94a, 0xca50, 0xa6e8, 0xad6e, 0xd7c5, 0xb5f7, 0xdffa, 0xc2d0, 0xf2f2, 0xa8a3, 0xb357, 0xb356, 0xdbd0, 0xb5f8, 0xdbd2, 0xdbd1, 0xdffb, 0xb8d0, 0xe443, 0xe446, 0xe445, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf, 0xbfcc, 0xbfcb, 0xc1bb, 0xee79, 0xee7b, 0xee7a, 0xc2d1, 0xf2f4, 0xf2f3, 0xf4cc, 0xc4b1, 0xc4fd, 0xf754, 0xf753, 0xc65b, 0xa8a4, 0xd0af, 0xad6f, 0xd7c8, 0xd7c6, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043, 0xdbd3, 0xdffc, 0xe041, 0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd, 0xe044, 0xe449, 0xe447, 0xe448, 0xe7d3, 0xe7d1, 0xe7d2, 0xeb7d, 0xee7c, 0xee7d, 0xc2d2, 0xf2f5, 0xf4cd, 0xc4b2, 0xf64c, 0xf755, 0xc5a9, 0xf7fe, 0xf94c, 0xa8a5, 0xad71, 0xad72, 0xd0b0, 0xd0b1, 0xad70, 0xb054, 0xb052, 0xb051, 0xb058, 0xb050, 0xb059, 0xd3dd, 0xb056, 0xb053, 0xb057, 0xb055, 0xb04f, 0xb35f, 0xb359, 0xd7cc, 0xb35e, 0xb360, 0xb35a, 0xb35b, 0xd7ca, 0xb358, 0xd7cb, 0xb35d, 0xd7c9, 0xb35c, 0xb644, 0xb646, 0xdbd8, 0xb645, 0xb5f9, 0xb5fd, 0xb8e4, 0xe049, 0xdbda, 0xb5fe, 0xdbdd, 0xdbde, 0xb643, 0xdbe0, 0xdbe2, 0xdbe3, 0xdbd7, 0xdbd6, 0xdbe4, 0xb642, 0xdbe1, 0xdbdf, 0xb640, 0xb5fb, 0xb647, 0xdbdb, 0xdbdc, 0xdbd9, 0xb641, 0xb5fc, 0xb5fa, 0xe048, 0xb8df, 0xb8da, 0xb8d5, 0xb8e5, 0xb8d6, 0xb8d2, 0xb8e1, 0xb8de, 0xb8e0, 0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050, 0xe04d, 0xe045, 0xe04a, 0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0xe047, 0xe04f, 0xe04b, 0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8, 0xe44c, 0xbb78, 0xbb7b, 0xe44e, 0xbba5, 0xe44d, 0xbb7d, 0xbdcf, 0xe44f, 0xbba4, 0xe44b, 0xbba6, 0xbb79, 0xb8db, 0xbb7c, 0xbb7a, 0xbb7e, 0xbba2, 0xbb77, 0xbba7, 0xbba3, 0xbba1, 0xe44a, 0xbdd6, 0xbdd2, 0xbdd9, 0xe7d6, 0xbdda, 0xe7e2, 0xe7db, 0xbdcb, 0xe7e3, 0xe7dd, 0xbdd5, 0xe7de, 0xbdd4, 0xe7e1, 0xbdce, 0xe7df, 0xe7d5, 0xbdcd, 0xebaa, 0xbdd3, 0xbdd0, 0xbdd8, 0xe7d4, 0xe7d8, 0xbdcc, 0xe7d7, 0xe7d9, 0xe7da, 0xbdd7, 0xe7dc, 0xe7e0, 0xe7e4, 0xbddb, 0xbfd2, 0xeba5, 0xebab, 0xeba8, 0xeb7e, 0xebac, 0xeba1, 0xeba7, 0xbfcd, 0xbfd3, 0xebad, 0xbfcf, 0xbfd9, 0xbfd4, 0xebaf, 0xeba9, 0xbfd0, 0xeba2, 0xbfda, 0xeba3, 0xeba4, 0xbfdb, 0xbfd8, 0xbdd1, 0xbfce, 0xebb0, 0xbfdc, 0xbfd5, 0xebae, 0xbfd1, 0xbfd6, 0xbfd7, 0xc1c3, 0xeea4, 0xeead, 0xeeaa, 0xeeac, 0xc1c0, 0xeea5, 0xeeab, 0xc1bc, 0xeea7, 0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2, 0xc1bd, 0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e, 0xc1c1, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db, 0xc2d3, 0xf0da, 0xc2d6, 0xc2d5, 0xf0e9, 0xf0e1, 0xf0de, 0xf0e4, 0xf0dd, 0xf0df, 0xf0e8, 0xf0e6, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2, 0xf0ec, 0xf0e3, 0xf2f9, 0xc3cf, 0xf341, 0xf64f, 0xc3d6, 0xf0e0, 0xf2f7, 0xc3d2, 0xf2f8, 0xf2fd, 0xc3d4, 0xc3d5, 0xf2f6, 0xf340, 0xf342, 0xf2fa, 0xf2fc, 0xf2fe, 0xf2fb, 0xf343, 0xc3d1, 0xc3d7, 0xc3d3, 0xc3d0, 0xf4d0, 0xc4b7, 0xf4ce, 0xf4d2, 0xf4d3, 0xc4b5, 0xf4d4, 0xf4d1, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0xc4b6, 0xc4b3, 0xc4fe, 0xc540, 0xf64e, 0xf64d, 0xf650, 0xf651, 0xc541, 0xf756, 0xf75b, 0xc5aa, 0xf758, 0xf757, 0xf75a, 0xf759, 0xf843, 0xc5dc, 0xf842, 0xf840, 0xf841, 0xc5fe, 0xc5fd, 0xf8c1, 0xf8c2, 0xc640, 0xf94d, 0xf94e, 0xc667, 0xc66d, 0xf9a9, 0xf9c8, 0xa8a6, 0xd7cd, 0xd7ce, 0xe052, 0xe450, 0xe7e5, 0xc1c6, 0xc1c5, 0xf0ee, 0xf344, 0xf844, 0xa8a7, 0xd3de, 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6, 0xbddd, 0xeeb1, 0xc2d7, 0xc676, 0xa8a8, 0xcdcb, 0xd3df, 0xb362, 0xd7cf, 0xd7d0, 0xdbe5, 0xb648, 0xb8e6, 0xe056, 0xe055, 0xe057, 0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0xeeb5, 0xeeb2, 0xeeb4, 0xeeb3, 0xc1c7, 0xf0ef, 0xf346, 0xf345, 0xcba4, 0xb05c, 0xb05b, 0xd3e0, 0xd7d1, 0xdbe7, 0xdbe6, 0xb649, 0xe059, 0xe05a, 0xe058, 0xb8e8, 0xb8e7, 0xbbaa, 0xbba9, 0xe7e7, 0xebb3, 0xebb1, 0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0xf0f2, 0xf0f1, 0xf0f0, 0xf347, 0xf9aa, 0xa8a9, 0xad73, 0xad74, 0xb05d, 0xb05e, 0xd3e2, 0xd3e1, 0xd7d2, 0xb368, 0xb366, 0xb363, 0xb367, 0xb365, 0xb364, 0xb64a, 0xdbea, 0xb8ed, 0xb64c, 0xb651, 0xdbec, 0xb653, 0xb652, 0xb655, 0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d, 0xdbe9, 0xb654, 0xb650, 0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0, 0xb8ea, 0xb8eb, 0xb8e9, 0xe05b, 0xe454, 0xbbac, 0xbbad, 0xbbab, 0xe453, 0xe455, 0xe7ea, 0xe7ec, 0xbde7, 0xe7ed, 0xbde0, 0xe7e9, 0xbddf, 0xbde9, 0xbde5, 0xbde6, 0xbde2, 0xe7e8, 0xbde1, 0xe7ee, 0xe7eb, 0xbde8, 0xbde3, 0xbde4, 0xebb5, 0xebb7, 0xebb6, 0xebb8, 0xbfe0, 0xebb4, 0xc1cb, 0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9, 0xf0f3, 0xf0f6, 0xf0f5, 0xf0f4, 0xc2d8, 0xf348, 0xf349, 0xc3d8, 0xf34a, 0xc3d9, 0xc4ba, 0xc4b9, 0xf652, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac, 0xf845, 0xc642, 0xa8aa, 0xb36a, 0xb369, 0xe05c, 0xe05d, 0xbbae, 0xebb9, 0xbdea, 0xebba, 0xeeb9, 0xa8ab, 0xd0b2, 0xad76, 0xad75, 0xd3e3, 0xb05f, 0xd3e4, 0xd7d5, 0xd7d4, 0xd7d3, 0xdbee, 0xb658, 0xdbed, 0xb657, 0xdbef, 0xb656, 0xe05f, 0xe062, 0xe060, 0xe061, 0xe065, 0xe05e, 0xe066, 0xe063, 0xe064, 0xbbb0, 0xe456, 0xbbaf, 0xe7f2, 0xe7f0, 0xbdeb, 0xe7ef, 0xe7f1, 0xbdec, 0xebbb, 0xebbc, 0xc1cd, 0xf34c, 0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654, 0xf96f, 0xa8ac, 0xad77, 0xd3e5, 0xd3e7, 0xd3e6, 0xd7d8, 0xb36c, 0xd7d6, 0xb36b, 0xd7d9, 0xd7da, 0xd7d7, 0xdbfb, 0xb660, 0xdbf3, 0xdbf9, 0xb65b, 0xb65e, 0xdbf2, 0xb659, 0xdbf6, 0xe06c, 0xb65d, 0xdbf1, 0xdbf7, 0xdbf4, 0xdbfa, 0xdbf0, 0xdbf8, 0xb65c, 0xb65f, 0xdbf5, 0xb65a, 0xb8f2, 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8, 0xb8f9, 0xe070, 0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0xe06b, 0xb8f4, 0xe067, 0xe06a, 0xe071, 0xb8f5, 0xe073, 0xb8f6, 0xbbb1, 0xe45b, 0xe461, 0xe459, 0xe462, 0xe458, 0xe45d, 0xe463, 0xe460, 0xe45f, 0xe45e, 0xe457, 0xe45c, 0xe45a, 0xbdf1, 0xbdee, 0xe7fb, 0xe841, 0xe843, 0xe840, 0xe7f8, 0xe7fa, 0xe845, 0xe842, 0xe7fc, 0xe846, 0xe7f9, 0xe844, 0xbdef, 0xbdf5, 0xbdf3, 0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4, 0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe, 0xbdf2, 0xbded, 0xe7f7, 0xebc6, 0xbfe2, 0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0xebbf, 0xbfe5, 0xebc3, 0xebc4, 0xebbe, 0xebc7, 0xebc0, 0xebc5, 0xbfe4, 0xbfe1, 0xebc1, 0xeebf, 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb, 0xeeba, 0xeebd, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa, 0xc2d9, 0xf141, 0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd, 0xf0f9, 0xf142, 0xf0f8, 0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe, 0xf144, 0xf352, 0xc3de, 0xf34f, 0xf353, 0xc3db, 0xf351, 0xc3e0, 0xc3dd, 0xf350, 0xc3df, 0xf354, 0xc3da, 0xc4bc, 0xc4be, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc, 0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0xf761, 0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763, 0xf846, 0xf75f, 0xf8c6, 0xf8c3, 0xf8c4, 0xf8c5, 0xc65c, 0xf951, 0xf950, 0xf94f, 0xf970, 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060, 0xb8fa, 0xbdf6, 0xebc8, 0xc2df, 0xf355, 0xf9ac, 0xa8ae, 0xaaee, 0xad79, 0xad78, 0xb063, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0xd7df, 0xd7db, 0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e, 0xd7e0, 0xd7e1, 0xdc43, 0xdc41, 0xdc45, 0xdc46, 0xdc4c, 0xdc48, 0xdc4a, 0xdc42, 0xdbfc, 0xdc49, 0xdc4b, 0xdc44, 0xdc47, 0xdbfd, 0xb662, 0xdc40, 0xdbfe, 0xb661, 0xb663, 0xb8fd, 0xe075, 0xe077, 0xe076, 0xe07b, 0xb8fb, 0xe078, 0xe074, 0xe079, 0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0xe467, 0xe466, 0xe464, 0xe465, 0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d, 0xe84e, 0xe849, 0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9, 0xe84b, 0xe84c, 0xe848, 0xbe40, 0xbdfb, 0xbdfa, 0xbdfc, 0xe847, 0xebca, 0xbfe8, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce, 0xbfe9, 0xebcd, 0xbfe7, 0xc1d3, 0xc1d6, 0xeec1, 0xc1d4, 0xeec0, 0xc1d2, 0xc1d5, 0xf146, 0xf147, 0xf148, 0xc2e0, 0xf149, 0xc2e1, 0xc3e2, 0xf358, 0xf359, 0xf357, 0xf356, 0xf35a, 0xc3e1, 0xf4dd, 0xf4db, 0xf4dc, 0xf4de, 0xf4da, 0xf4df, 0xf658, 0xf659, 0xf657, 0xc546, 0xf764, 0xc5af, 0xf765, 0xf848, 0xf847, 0xa8af, 0xb664, 0xb940, 0xbbb6, 0xbfec, 0xbfeb, 0xc3e3, 0xc47c, 0xc547, 0xa8b0, 0xb064, 0xb941, 0xf35b, 0xcba6, 0xa8b1, 0xa8b4, 0xa8b3, 0xa8b2, 0xcba5, 0xcdcd, 0xcdcf, 0xaaef, 0xaaf1, 0xcdcc, 0xcdce, 0xaaf0, 0xcdd1, 0xcdd0, 0xcdd2, 0xd0b6, 0xd0b4, 0xad7c, 0xd0b3, 0xada3, 0xad7e, 0xad7b, 0xada4, 0xad7d, 0xada2, 0xada1, 0xd0b5, 0xad7a, 0xb06a, 0xd3eb, 0xd3f1, 0xb067, 0xb06e, 0xb069, 0xd3ee, 0xd3f0, 0xb06c, 0xd3ea, 0xd3ed, 0xb068, 0xb065, 0xd3ec, 0xb06b, 0xd3ef, 0xb06d, 0xb066, 0xd7e3, 0xd7e6, 0xb370, 0xb37a, 0xb376, 0xd7e4, 0xb37e, 0xb377, 0xb37c, 0xb372, 0xb36f, 0xb371, 0xb37d, 0xd7e5, 0xb375, 0xb378, 0xb374, 0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2, 0xdc4d, 0xb665, 0xdc4f, 0xb667, 0xb669, 0xdc4e, 0xb666, 0xb66a, 0xb668, 0xb947, 0xe0a3, 0xb94f, 0xe07e, 0xb950, 0xb945, 0xe0a1, 0xb94a, 0xe0a2, 0xb943, 0xb942, 0xb94d, 0xb94c, 0xb94b, 0xb949, 0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0xbbb8, 0xbbbb, 0xbbbf, 0xbbb9, 0xbbbe, 0xbbbc, 0xbbb7, 0xbbbd, 0xbbba, 0xe852, 0xbe43, 0xbe41, 0xe853, 0xbe44, 0xbe42, 0xe851, 0xe850, 0xbff0, 0xe84f, 0xbfee, 0xbfed, 0xebd0, 0xbe45, 0xbfef, 0xebd1, 0xbff2, 0xebd2, 0xbff1, 0xc1d8, 0xeec3, 0xc1d7, 0xc1dc, 0xc1da, 0xc1db, 0xc2e3, 0xc1d9, 0xeec2, 0xebd3, 0xc2e2, 0xc2e4, 0xc3e4, 0xc3e5, 0xf4e0, 0xc5de, 0xc5dd, 0xa8b6, 0xca55, 0xb06f, 0xca52, 0xca53, 0xca51, 0xca54, 0xcbaa, 0xcba7, 0xcbac, 0xcba8, 0xa8b7, 0xa8ba, 0xcba9, 0xa8b9, 0xcbab, 0xa8b8, 0xcdd5, 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6, 0xcdd4, 0xaaf2, 0xaaf5, 0xaaf3, 0xd0b8, 0xd0bc, 0xd0b9, 0xada7, 0xada8, 0xd0bb, 0xd0bd, 0xd0bf, 0xada5, 0xd0be, 0xada6, 0xd7ee, 0xd0ba, 0xd3f2, 0xd3fb, 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc, 0xb071, 0xd3f7, 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8, 0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0xd7e8, 0xd7ea, 0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0xdc56, 0xebd4, 0xdc57, 0xdc54, 0xb3a3, 0xb66e, 0xdc53, 0xdc59, 0xdc58, 0xb66b, 0xdc5c, 0xdc52, 0xdc5b, 0xdc50, 0xdc5a, 0xdc55, 0xb66d, 0xe0aa, 0xe0a5, 0xe0ab, 0xe0a6, 0xe0a4, 0xe0a7, 0xb951, 0xe0a9, 0xe0a8, 0xb952, 0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c, 0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0xe859, 0xbe48, 0xf14a, 0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854, 0xbe46, 0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0xeec4, 0xc1dd, 0xf14b, 0xf14c, 0xf14d, 0xf35d, 0xf35c, 0xf4e2, 0xf4e1, 0xf65b, 0xf65c, 0xf65a, 0xf766, 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075, 0xb074, 0xd440, 0xd441, 0xd3fe, 0xb073, 0xd7f5, 0xd7f6, 0xd7f2, 0xb3a4, 0xd7f3, 0xd7f4, 0xdc5f, 0xdc61, 0xdc5d, 0xdc60, 0xb66f, 0xdc5e, 0xb670, 0xdd73, 0xb955, 0xb954, 0xb953, 0xe0ac, 0xe0ad, 0xe473, 0xe475, 0xbbc6, 0xbbc3, 0xbbc5, 0xbbc4, 0xe474, 0xe472, 0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a, 0xbe4b, 0xe85d, 0xbe4c, 0xebdb, 0xebdc, 0xebd9, 0xebda, 0xbff4, 0xebd8, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb, 0xc1df, 0xeec9, 0xeecc, 0xeeca, 0xeec6, 0xc1de, 0xf14f, 0xf150, 0xf14e, 0xf152, 0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151, 0xf35e, 0xc3e6, 0xf4e5, 0xf4e6, 0xc4bf, 0xf4e4, 0xf4e3, 0xf65d, 0xc548, 0xf849, 0xf8c8, 0xf8c7, 0xc643, 0xc65d, 0xf8c9, 0xf971, 0xc66f, 0xa8bc, 0xaaf6, 0xb956, 0xc4c0, 0xa8bd, 0xadab, 0xb3a5, 0xb671, 0xc2e7, 0xaaf7, 0xd0c1, 0xd0c0, 0xd442, 0xb078, 0xb076, 0xb07a, 0xd444, 0xb079, 0xb077, 0xd443, 0xb3a8, 0xd7fc, 0xb3a7, 0xb3a9, 0xd842, 0xb3ab, 0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0xd7f9, 0xd7fa, 0xd7f8, 0xb3a6, 0xd841, 0xd7fb, 0xd7fd, 0xdc6d, 0xdc6c, 0xdc6a, 0xdc62, 0xdc71, 0xdc65, 0xdc6f, 0xdc76, 0xdc6e, 0xb679, 0xb675, 0xdc63, 0xdc69, 0xb677, 0xdc68, 0xb678, 0xb67a, 0xdc6b, 0xb672, 0xb673, 0xdc77, 0xdc75, 0xdc74, 0xdc66, 0xdc72, 0xb676, 0xb674, 0xdc73, 0xdc64, 0xdc67, 0xdc70, 0xe4ba, 0xe0b7, 0xe0b0, 0xe0c3, 0xe0cc, 0xe0b3, 0xb961, 0xe0c0, 0xb957, 0xb959, 0xb965, 0xe0b1, 0xb95a, 0xb95c, 0xb966, 0xb95b, 0xb964, 0xe0b9, 0xe0ae, 0xb962, 0xe0b8, 0xb95e, 0xe0ca, 0xb963, 0xe0c8, 0xe0bc, 0xe0c6, 0xb960, 0xe0af, 0xe0c9, 0xe0c4, 0xe0cb, 0xb958, 0xb967, 0xb95d, 0xe0b5, 0xe0bd, 0xe0c1, 0xe0c5, 0xb95f, 0xe0b4, 0xe0b2, 0xe0be, 0xe0bb, 0xe0ba, 0xe0bf, 0xe0c2, 0xe0c7, 0xe478, 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc, 0xbbd0, 0xe4ad, 0xe4b5, 0xe4a6, 0xbbc8, 0xe4aa, 0xe0b6, 0xbbc9, 0xe4b1, 0xe4b6, 0xe4ae, 0xe4b0, 0xe4b9, 0xe4b2, 0xe47e, 0xe4a9, 0xbbd1, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb, 0xe4a5, 0xbbca, 0xe4b3, 0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0xe47b, 0xe4af, 0xe4ac, 0xe4a7, 0xe477, 0xe476, 0xe4a1, 0xe4b4, 0xbbcf, 0xe4b7, 0xe47d, 0xe4a3, 0xbe52, 0xbe5a, 0xbe55, 0xe8a4, 0xe8a1, 0xe867, 0xbe50, 0xbe4f, 0xbe56, 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e, 0xe8a3, 0xbe58, 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877, 0xe875, 0xe868, 0xe862, 0xe87d, 0xbe57, 0xe87e, 0xe878, 0xe86d, 0xe86b, 0xe866, 0xe86e, 0xe87b, 0xe86a, 0xe87a, 0xe8a2, 0xbe53, 0xe876, 0xe87c, 0xe872, 0xe86c, 0xbe51, 0xe4a8, 0xe870, 0xbe59, 0xe869, 0xebf4, 0xbff7, 0xebf3, 0xebf0, 0xec44, 0xbffb, 0xec41, 0xebf8, 0xec43, 0xebe9, 0xebf6, 0xbffd, 0xebe1, 0xebdf, 0xec42, 0xec40, 0xebfe, 0xebed, 0xebec, 0xebe2, 0xc040, 0xebe8, 0xebf2, 0xebfd, 0xc043, 0xec45, 0xc1e8, 0xc045, 0xbffe, 0xebe6, 0xebef, 0xebde, 0xebe0, 0xbff5, 0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041, 0xebdd, 0xc1e3, 0xebf9, 0xebfc, 0xbffc, 0xebeb, 0xc044, 0xbff9, 0xbff8, 0xebf5, 0xebfb, 0xbff6, 0xebe4, 0xebfa, 0xebe5, 0xebea, 0xeed2, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3, 0xeed8, 0xeed9, 0xeee2, 0xc1ee, 0xeee1, 0xeed1, 0xeee0, 0xeed4, 0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0xeee8, 0xeeda, 0xeee7, 0xeee9, 0xeed0, 0xc1e6, 0xeeea, 0xeede, 0xc1ea, 0xeedb, 0xc1ec, 0xeee4, 0xc1e4, 0xeed6, 0xeee5, 0xeedf, 0xebe3, 0xeee6, 0xeed3, 0xc1e9, 0xeeeb, 0xc1e2, 0xeece, 0xf160, 0xf159, 0xc2e9, 0xf154, 0xf163, 0xf15b, 0xeedc, 0xf165, 0xf155, 0xc2e8, 0xf15f, 0xc2ea, 0xc2f2, 0xc2f0, 0xf161, 0xc2f1, 0xf157, 0xf158, 0xf15d, 0xf162, 0xeecd, 0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e, 0xf15a, 0xf168, 0xf36a, 0xf15c, 0xc2ee, 0xc2ed, 0xeecf, 0xc2ef, 0xf164, 0xf166, 0xc2ec, 0xf169, 0xf153, 0xf156, 0xf373, 0xf363, 0xc3eb, 0xf371, 0xf361, 0xc3ec, 0xf36c, 0xf368, 0xc3f1, 0xf372, 0xf362, 0xf365, 0xc3e9, 0xf374, 0xf36d, 0xf370, 0xc3ef, 0xc3f4, 0xc3f2, 0xf369, 0xf364, 0xc3ed, 0xc3ee, 0xf360, 0xc3ea, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3, 0xf36b, 0xf375, 0xc3f5, 0xf367, 0xf36e, 0xf4f3, 0xf542, 0xf4f5, 0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed, 0xf4fe, 0xf4f4, 0xc4c2, 0xf544, 0xf4f6, 0xf4fb, 0xf4fd, 0xf4e7, 0xf541, 0xf4f2, 0xf4f7, 0xf4eb, 0xf4ef, 0xf543, 0xf4f9, 0xf4e8, 0xf4ec, 0xf4ee, 0xf4f8, 0xc4c1, 0xf4f1, 0xf4ea, 0xf4f0, 0xf661, 0xf666, 0xc54f, 0xf668, 0xc549, 0xf664, 0xf66a, 0xc54e, 0xc54a, 0xc54b, 0xf660, 0xf667, 0xc54d, 0xf665, 0xc54c, 0xf65f, 0xf663, 0xf662, 0xf65e, 0xf669, 0xc5b1, 0xf76d, 0xf770, 0xf76c, 0xf76e, 0xf76f, 0xf769, 0xf76a, 0xf767, 0xf76b, 0xf768, 0xc5b2, 0xc5b3, 0xf84b, 0xf84d, 0xf84c, 0xf84e, 0xc5e0, 0xf84a, 0xc5df, 0xc5e1, 0xf8cb, 0xf8cc, 0xc644, 0xf8ca, 0xf953, 0xf952, 0xf954, 0xc65f, 0xf955, 0xc65e, 0xf956, 0xf972, 0xf975, 0xf974, 0xc668, 0xf973, 0xc672, 0xc670, 0xc671, 0xc677, 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0xaaf8, 0xd844, 0xdc78, 0xe8a5, 0xf376, 0xaaf9, 0xadac, 0xb07b, 0xd845, 0xd846, 0xb3ac, 0xb67d, 0xdc7a, 0xdc79, 0xb6a3, 0xb67c, 0xdc7b, 0xb67e, 0xb6a2, 0xb6a1, 0xb67b, 0xb968, 0xe0d0, 0xe0ce, 0xe0cf, 0xe0cd, 0xbbd2, 0xbbd5, 0xbbd7, 0xbbd6, 0xbbd3, 0xbbd4, 0xe8a7, 0xe8a6, 0xbe5b, 0xe8a8, 0xe8a9, 0xbe5c, 0xec4d, 0xec4b, 0xeef3, 0xec49, 0xec4a, 0xc046, 0xec46, 0xec4e, 0xec48, 0xec4c, 0xeeef, 0xeef1, 0xeef2, 0xc1f3, 0xeeee, 0xc1f2, 0xeef0, 0xc1ef, 0xc1f0, 0xc1f1, 0xec47, 0xc2f5, 0xf16e, 0xf16c, 0xf16d, 0xc2f3, 0xc2f6, 0xc2f4, 0xf377, 0xf378, 0xc3f6, 0xf545, 0xf547, 0xf546, 0xc4c4, 0xc550, 0xf66d, 0xf66c, 0xf66b, 0xaafa, 0xc9aa, 0xca58, 0xa6e9, 0xca56, 0xca59, 0xca57, 0xcbae, 0xa8c1, 0xa8c2, 0xcbb0, 0xa8bf, 0xcbaf, 0xcbad, 0xa8c0, 0xa8be, 0xcdd8, 0xcddb, 0xaafd, 0xcdda, 0xcdd9, 0xaafc, 0xaafb, 0xab40, 0xcddc, 0xaafe, 0xd0c6, 0xadae, 0xadaf, 0xadb0, 0xd0c7, 0xd0c3, 0xadad, 0xd0c4, 0xd0c5, 0xd0c2, 0xb0a4, 0xb0a1, 0xd445, 0xb0a2, 0xb0a5, 0xd446, 0xb07e, 0xb07c, 0xb07d, 0xb0a3, 0xb3ad, 0xd849, 0xb3b5, 0xd848, 0xd84b, 0xb3b1, 0xd84a, 0xb6ab, 0xb3af, 0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4, 0xb3b0, 0xd847, 0xb6a7, 0xdc7d, 0xdca3, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9, 0xdc7c, 0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0xb6aa, 0xb6a5, 0xe0d3, 0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0xe0d4, 0xb969, 0xbbd8, 0xbbda, 0xbbd9, 0xe4bb, 0xe4bc, 0xe8ab, 0xe8aa, 0xc047, 0xc048, 0xec4f, 0xc049, 0xeef6, 0xeef4, 0xeef5, 0xc1f4, 0xf16f, 0xc3f7, 0xc1f5, 0xab41, 0xb0a6, 0xd447, 0xd84c, 0xb3b6, 0xb6ad, 0xdca4, 0xdca6, 0xb6af, 0xb6ae, 0xb6b0, 0xb6b1, 0xdca5, 0xb96e, 0xb96f, 0xb96d, 0xbbdb, 0xb96c, 0xe0d5, 0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6, 0xf170, 0xf174, 0xc2f9, 0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb, 0xf173, 0xf379, 0xc2f7, 0xc3f8, 0xf8cd, 0xab42, 0xb3b8, 0xb3b7, 0xb6b2, 0xdca8, 0xdca7, 0xb6b3, 0xe0d9, 0xb973, 0xb970, 0xe0d8, 0xb972, 0xe0d6, 0xb971, 0xe0d7, 0xe4bd, 0xbbdd, 0xe8af, 0xbe5d, 0xe8ad, 0xbe5e, 0xbe5f, 0xe8ae, 0xbe60, 0xec51, 0xc04e, 0xc04b, 0xc050, 0xec53, 0xc04c, 0xec52, 0xc04f, 0xc04d, 0xeef9, 0xeefb, 0xc1f7, 0xeefa, 0xc1f8, 0xeef8, 0xeef7, 0xf177, 0xf176, 0xc2fc, 0xf178, 0xf37e, 0xc3fa, 0xf37d, 0xf37a, 0xc3f9, 0xf37b, 0xf37c, 0xf548, 0xf549, 0xc4c5, 0xc553, 0xf66e, 0xc551, 0xc552, 0xf66f, 0xc5b4, 0xc5b5, 0xf771, 0xc645, 0xf8cf, 0xc647, 0xf8ce, 0xf8d0, 0xc646, 0xf957, 0xf9ad, 0xab43, 0xb974, 0xe4be, 0xe8b0, 0xc051, 0xc052, 0xab44, 0xbe61, 0xc3fb, 0xadb1, 0xc053, 0xc5e2, 0xadb2, 0xd84d, 0xdca9, 0xdcab, 0xdcaa, 0xe0dd, 0xe0da, 0xb975, 0xb976, 0xe0db, 0xe0dc, 0xe4c0, 0xe4c5, 0xbbde, 0xe4bf, 0xe4c1, 0xe4c8, 0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2, 0xe4c6, 0xbbdf, 0xe8b3, 0xe8b1, 0xbe63, 0xbe62, 0xe8b2, 0xbe64, 0xec56, 0xec55, 0xc054, 0xec54, 0xeefc, 0xeefe, 0xef41, 0xef40, 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd, 0xf17d, 0xf1a2, 0xc2fe, 0xf17b, 0xf17e, 0xf17c, 0xf179, 0xc340, 0xf17a, 0xf3a1, 0xf3a3, 0xf3a2, 0xf54a, 0xf54b, 0xf670, 0xc5b7, 0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1, 0xc669, 0xadb3, 0xb6b4, 0xe4ca, 0xe4c9, 0xe8b5, 0xe8b4, 0xc1fa, 0xef43, 0xef42, 0xf1a5, 0xf1a3, 0xf1a6, 0xf1a4, 0xc3fc, 0xf3a4, 0xf3a5, 0xf3a6, 0xf671, 0xf772, 0xf8d2, 0xadb4, 0xec57, 0xef44, 0xadb5, 0xbbe0, 0xec58, 0xc341, 0xf1a7, 0xc3fd, 0xf54c, 0xf54d, 0xc554, 0xf851, 0xadb6, 0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac, 0xb6b7, 0xb97a, 0xb97c, 0xe0df, 0xe0e0, 0xe0de, 0xb977, 0xb978, 0xb97b, 0xb979, 0xe4cb, 0xbbe1, 0xbbe2, 0xe8bc, 0xbe67, 0xe8b7, 0xe8b6, 0xe8bb, 0xbe65, 0xc05b, 0xe8b8, 0xe8bd, 0xe8ba, 0xe8b9, 0xbe66, 0xc059, 0xec5a, 0xc055, 0xec5b, 0xec59, 0xc058, 0xc056, 0xc05a, 0xc057, 0xef45, 0xef4a, 0xef46, 0xef49, 0xc1fb, 0xedd4, 0xef48, 0xef47, 0xc344, 0xc342, 0xc345, 0xc343, 0xf1a8, 0xf1a9, 0xf1aa, 0xc346, 0xf3aa, 0xc440, 0xf3a8, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe, 0xf551, 0xf54e, 0xf54f, 0xf550, 0xf672, 0xc556, 0xc555, 0xf774, 0xf773, 0xc5b8, 0xc5e3, 0xc649, 0xc660, 0xf958, 0xf9ae, 0xf9af, 0xadb7, 0xdcad, 0xe0e1, 0xe4cc, 0xe4cd, 0xbbe3, 0xbbe4, 0xe8be, 0xbe68, 0xc1fc, 0xf1ab, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab, 0xf675, 0xf552, 0xf553, 0xc4c6, 0xf674, 0xf673, 0xf775, 0xf9b0, 0xadb8, 0xadb9, 0xb0a7, 0xd448, 0xd84f, 0xb6b8, 0xb6bb, 0xb6b9, 0xdcae, 0xb6bd, 0xb6ba, 0xb6bc, 0xb97e, 0xe0e2, 0xe0e3, 0xe8c0, 0xb97d, 0xb9a1, 0xb9a2, 0xe4cf, 0xe4ce, 0xbbe5, 0xbbe6, 0xe4d0, 0xe8bf, 0xbbe8, 0xbe69, 0xbbe7, 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a, 0xe8c2, 0xe8c5, 0xe8c3, 0xe8c4, 0xbe6c, 0xc061, 0xc05f, 0xc05e, 0xec5d, 0xc060, 0xec5c, 0xef4b, 0xec5e, 0xc05d, 0xec5f, 0xef4e, 0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51, 0xef54, 0xef53, 0xef50, 0xef4f, 0xc1fd, 0xf1ae, 0xf1ad, 0xc34a, 0xc348, 0xc349, 0xf1ac, 0xf3b1, 0xc443, 0xf3b0, 0xf3af, 0xc444, 0xf558, 0xf557, 0xf555, 0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557, 0xf676, 0xf556, 0xf777, 0xc5e4, 0xc661, 0xf959, 0xf9b1, 0xadba, 0xd850, 0xef55, 0xadbb, 0xe4d2, 0xe4d1, 0xec60, 0xef57, 0xef56, 0xc34c, 0xf3b2, 0xf3b3, 0xc4c9, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be, 0xe0e4, 0xe0e6, 0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0xe4d4, 0xe4d6, 0xe4d5, 0xe4d8, 0xbbe9, 0xe4d7, 0xe4d3, 0xe4d9, 0xe8cc, 0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8, 0xbe6e, 0xbe71, 0xbe73, 0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0, 0xe8ce, 0xbe74, 0xbe70, 0xe8c6, 0xbe6d, 0xbe6f, 0xc063, 0xec66, 0xec64, 0xec63, 0xec69, 0xec68, 0xec67, 0xec62, 0xc062, 0xec61, 0xec65, 0xc064, 0xef5a, 0xef5e, 0xef5b, 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60, 0xef61, 0xc240, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8, 0xf1b7, 0xf1b1, 0xf1b5, 0xf1b0, 0xf1b2, 0xc34d, 0xf1af, 0xf1b4, 0xf3c0, 0xf3b5, 0xc445, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf, 0xf3b7, 0xf3be, 0xf3bb, 0xf3ba, 0xf3bd, 0xf3b8, 0xf3b6, 0xf3bc, 0xf560, 0xf55e, 0xc4ca, 0xf55d, 0xf563, 0xf561, 0xc4cb, 0xf55c, 0xf55a, 0xf55b, 0xc4cd, 0xf55f, 0xc4cc, 0xf562, 0xf678, 0xf67e, 0xf679, 0xc55b, 0xf6a1, 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558, 0xf67a, 0xf77d, 0xf7a1, 0xf77e, 0xf77b, 0xc5bb, 0xf778, 0xf77c, 0xf7a3, 0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7, 0xf853, 0xc5e5, 0xc5e6, 0xf8d3, 0xc64a, 0xf976, 0xc66a, 0xf9b3, 0xc66b, 0xf9b4, 0xf9b5, 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd, 0xb0a9, 0xe0e9, 0xe0e8, 0xbbea, 0xbbeb, 0xe4da, 0xe8d2, 0xec6c, 0xbe75, 0xc065, 0xec6a, 0xec6d, 0xc066, 0xef64, 0xec6b, 0xf1b9, 0xc34e, 0xf3c1, 0xf566, 0xf564, 0xf565, 0xf6a2, 0xc55c, 0xf7a4, 0xc5ea, 0xc5bc, 0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0xb0aa, 0xf1ba, 0xd449, 0xb9a6, 0xe4db, 0xbbec, 0xe4dc, 0xe8d4, 0xe8d3, 0xc068, 0xbe76, 0xbe77, 0xe8d7, 0xe8d6, 0xe8d5, 0xec6e, 0xec71, 0xec70, 0xec6f, 0xc067, 0xef68, 0xef66, 0xef65, 0xef67, 0xc34f, 0xf1bc, 0xf1bd, 0xc350, 0xf1bb, 0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0xf567, 0xf569, 0xf568, 0xf6a3, 0xf6a6, 0xf6a4, 0xf6a5, 0xf7a5, 0xc5bd, 0xf854, 0xf855, 0xf856, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0xbe78, 0xc069, 0xf1be, 0xf7a6, 0xf9c4, 0xd44a, 0xc67b, 0xb0ac, 0xec72, 0xf1bf, 0xf3c6, 0xf6a7, 0xf7a7, 0xb0ad, 0xe4dd, 0xe4de, 0xbbed, 0xbbee, 0xe8d9, 0xbe7a, 0xbe79, 0xe8d8, 0xef69, 0xf1c0, 0xf1c2, 0xf1c1, 0xc353, 0xc352, 0xc351, 0xc55e, 0xf6a8, 0xc55d, 0xf7a9, 0xf7a8, 0xc64c, 0xf8d5, 0xb3bd, 0xe0ea, 0xe4e1, 0xe4df, 0xe4e0, 0xe8e2, 0xe8dd, 0xe8da, 0xe8e1, 0xe8e3, 0xbe7c, 0xe8e0, 0xe8dc, 0xe8db, 0xe8df, 0xe8de, 0xbe7b, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77, 0xec73, 0xec79, 0xec74, 0xef72, 0xec75, 0xeca2, 0xec7c, 0xc06a, 0xec7b, 0xec7a, 0xec7e, 0xef6a, 0xef6d, 0xef6c, 0xef74, 0xef6f, 0xef73, 0xef71, 0xef70, 0xef6e, 0xef6b, 0xc243, 0xc242, 0xc244, 0xc241, 0xef75, 0xf1c8, 0xf1cb, 0xf1c9, 0xf1cd, 0xf1ce, 0xf1c6, 0xc358, 0xf1c7, 0xf1c5, 0xf1cc, 0xf1c4, 0xf1c3, 0xc357, 0xc355, 0xc354, 0xf1ca, 0xf3cf, 0xf3d5, 0xc44a, 0xf3d0, 0xf3d3, 0xf3d7, 0xc44b, 0xf3d2, 0xf3ca, 0xf3c9, 0xf3d6, 0xf3cd, 0xf3cb, 0xf3d4, 0xf3cc, 0xc449, 0xc448, 0xf3c7, 0xf3c8, 0xf3d1, 0xf3ce, 0xf56c, 0xf56f, 0xc356, 0xf56d, 0xf573, 0xf571, 0xf56b, 0xf576, 0xf56a, 0xc4cf, 0xf572, 0xf56e, 0xc4ce, 0xf575, 0xf574, 0xf6ab, 0xf6aa, 0xf6b1, 0xf6ad, 0xf6b0, 0xc560, 0xf6ae, 0xf6af, 0xf6a9, 0xf6ac, 0xc55f, 0xc5bf, 0xf7b4, 0xf7af, 0xf7b3, 0xf7b6, 0xf7b2, 0xf7ae, 0xc5c1, 0xf7b1, 0xf7b5, 0xc5c0, 0xf7ac, 0xf570, 0xf7b0, 0xf7ad, 0xf7aa, 0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860, 0xf859, 0xf857, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec, 0xf858, 0xf85e, 0xf8da, 0xc64d, 0xf8db, 0xf8d9, 0xf8d6, 0xf8d8, 0xf8d7, 0xf95a, 0xf95c, 0xf95b, 0xf979, 0xf978, 0xf977, 0xf97a, 0xc673, 0xc674, 0xf9ca, 0xf9ce, 0xb3be, 0xdcaf, 0xe0ed, 0xb9a7, 0xe0eb, 0xe0ec, 0xe4e2, 0xe4e3, 0xbbf1, 0xbbef, 0xe4e4, 0xbbf0, 0xe8e8, 0xe8eb, 0xe8e5, 0xe8ec, 0xe8e4, 0xe8e6, 0xe8e7, 0xe8ea, 0xbea1, 0xe8ef, 0xe8ee, 0xbe7d, 0xe8e9, 0xe8ed, 0xbe7e, 0xecac, 0xc06f, 0xeca7, 0xc06b, 0xeca4, 0xecaa, 0xecad, 0xc070, 0xeca9, 0xeca6, 0xecae, 0xeca5, 0xecab, 0xc06c, 0xeca3, 0xc06d, 0xc06e, 0xeca8, 0xefa9, 0xef7a, 0xef7b, 0xef7e, 0xef7c, 0xef76, 0xef79, 0xefa5, 0xef7d, 0xc245, 0xefa7, 0xefa4, 0xc246, 0xefa6, 0xef77, 0xefa2, 0xefa3, 0xefa1, 0xf1d2, 0xf1d4, 0xf1d7, 0xf1d1, 0xc359, 0xf1d9, 0xf1d0, 0xf1da, 0xf1d6, 0xf1d8, 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf, 0xc35a, 0xf1db, 0xc35b, 0xc44d, 0xef78, 0xf3f1, 0xf3e8, 0xc44f, 0xf3e4, 0xc450, 0xf3ed, 0xf3e7, 0xf3dd, 0xc44e, 0xf3ea, 0xf3e5, 0xf3e6, 0xf3d8, 0xf3df, 0xf3ee, 0xf3eb, 0xf3e3, 0xf3ef, 0xf3de, 0xf3d9, 0xf3ec, 0xf3db, 0xf3e9, 0xf3e0, 0xf3f0, 0xf3dc, 0xc44c, 0xf3da, 0xf3e1, 0xf3e2, 0xf57d, 0xf57b, 0xf5a2, 0xf5ae, 0xf5a5, 0xf57c, 0xf578, 0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577, 0xf5a1, 0xf5a6, 0xf5a8, 0xf5ab, 0xf579, 0xf5af, 0xf5b0, 0xf5a9, 0xf5ad, 0xf5a4, 0xf6c1, 0xf6c4, 0xc561, 0xf6c3, 0xf6c8, 0xf6c6, 0xc562, 0xf6bd, 0xf6b3, 0xf6b2, 0xc564, 0xf6bf, 0xf6c0, 0xf6bc, 0xf6b4, 0xf6b9, 0xf5ac, 0xf6b5, 0xc563, 0xf6bb, 0xf6ba, 0xf6b6, 0xf6c2, 0xf6b7, 0xf7bb, 0xf6c5, 0xf6c7, 0xf6be, 0xf6b8, 0xf7bc, 0xf7be, 0xf7b8, 0xc5c2, 0xf7c5, 0xf7c3, 0xc5c3, 0xf7c2, 0xf7c1, 0xf7ba, 0xf7b7, 0xf7bd, 0xf7c6, 0xf7b9, 0xf7bf, 0xf869, 0xf86e, 0xf864, 0xf867, 0xc5ee, 0xf86b, 0xf872, 0xf7c0, 0xf865, 0xf86f, 0xf873, 0xf86a, 0xf863, 0xf86d, 0xf86c, 0xf871, 0xf870, 0xf7c4, 0xf868, 0xf862, 0xf866, 0xc64e, 0xc64f, 0xf861, 0xf8e6, 0xf8dd, 0xf8e5, 0xf8e2, 0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0, 0xf8de, 0xf8e4, 0xf95d, 0xf95e, 0xf960, 0xf95f, 0xf962, 0xf961, 0xf97c, 0xf97b, 0xf9b7, 0xf9b8, 0xf9c5, 0xc678, 0xc67c, 0xf9cf, 0xc67d, 0xb3bf, 0xc4d0, 0xf6c9, 0xc650, 0xc651, 0xb3c0, 0xe0ee, 0xb9a8, 0xe8f0, 0xecb0, 0xecb1, 0xecaf, 0xefab, 0xefaa, 0xc247, 0xf1df, 0xefac, 0xf1de, 0xf3f3, 0xc451, 0xc453, 0xf3f2, 0xc452, 0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca, 0xc565, 0xc5ef, 0xf8e8, 0xf963, 0xf9d2, 0xb3c1, 0xe4e5, 0xbea2, 0xecb3, 0xecb2, 0xefad, 0xc454, 0xc4d1, 0xf7c7, 0xf9cb, 0xb3c2, 0xbbf2, 0xbea3, 0xf3f4, 0xf874, 0xb6c0, 0xefae, 0xc664, 0xb6c1, 0xbea4, 0xc248, 0xf875, 0xb6c2, 0xe8f1, 0xc072, 0xecb4, 0xecb5, 0xc071, 0xefaf, 0xc24c, 0xc24a, 0xc24b, 0xc249, 0xf1e0, 0xc35c, 0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6, 0xc4d2, 0xf6cb, 0xf6cd, 0xf6cc, 0xc566, 0xf7c8, 0xf876, 0xf877, 0xc5f0, 0xf964, 0xf97d, 0xc675, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5, 0xe0ef, 0xefb1, 0xf1e2, 0xf1e1, 0xf878, 0xc652, 0xf965, 0xf97e, 0xb9a9, 0xe8f2, 0xe8f3, 0xecb7, 0xb9aa, 0xc35d, 0xf1e3, 0xf6cf, 0xc567, 0xf6d0, 0xf6ce, 0xf879, 0xf8e9, 0xb9ab, 0xefb4, 0xefb3, 0xefb2, 0xf1e4, 0xf1e8, 0xf1e7, 0xf1e6, 0xf1e5, 0xc35e, 0xf3f6, 0xf5b9, 0xc4d3, 0xf5b8, 0xf6d1, 0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9, 0xf87c, 0xf87b, 0xf87a, 0xbbf3, 0xecb8, 0xc24d, 0xf3f7, 0xf3f8, 0xf7cc, 0xf87d, 0xf8ea, 0xf966, 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e, 0xf1e9, 0xf3f9, 0xf6d2, 0xf87e, 0xbea6, 0xefb5, 0xf1ea, 0xf3fa, 0xf3fb, 0xf3fc, 0xf5be, 0xf5ba, 0xc568, 0xf5bd, 0xf5bc, 0xc4d4, 0xf5bb, 0xc4d6, 0xc4d5, 0xf6d4, 0xf6d3, 0xc569, 0xc56a, 0xc5c6, 0xf7cd, 0xc5c5, 0xf8a3, 0xf8a4, 0xf8a2, 0xf8a1, 0xc654, 0xf8eb, 0xf8ec, 0xf8ed, 0xc653, 0xf967, 0xf96a, 0xf969, 0xf968, 0xf9d3, 0xc073, 0xc365, 0xf5bf, 0xf6d5, 0xc5c7, 0xf7ce, 0xf9d5, 0xc074, 0xefb6, 0xf7cf, 0xf9a1, 0xc94a, 0xddfc, 0xa14a, 0xa157, 0xa159, 0xa15b, 0xa15f, 0xa160, 0xa163, 0xa164, 0xa167, 0xa168, 0xa16b, 0xa16c, 0xa16f, 0xa170, 0xa173, 0xa174, 0xa177, 0xa178, 0xa17b, 0xa17c, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb, 0xa1c8, 0xa1c9, 0xa15c, 0xa14d, 0xa14f, 0xa151, 0xa152, 0xa153, 0xa154, 0xa17d, 0xa17e, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1cc, 0xa1cd, 0xa1ce, 0xa1de, 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0xa24c, 0xa24d, 0xa24e, 0xa149, 0xa1ad, 0xa243, 0xa248, 0xa1ae, 0xa15d, 0xa15e, 0xa1af, 0xa1cf, 0xa141, 0xa1d0, 0xa144, 0xa241, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa147, 0xa146, 0xa1d5, 0xa1d7, 0xa1d6, 0xa148, 0xa249, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa242, 0xa1c4, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef, 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa340, 0xa341, 0xa342, 0xa343, 0xa161, 0xa155, 0xa162, 0xa14e, }; static const Summary16 big5_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x00ac }, { 4, 0x0083 }, { 7, 0x0000 }, { 7, 0x0080 }, { 8, 0x0000 }, { 8, 0x0080 }, }; static const Summary16 big5_uni2indx_page02[38] = { /* 0x0200 */ { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0e80 }, { 13, 0x0200 }, { 14, 0x0000 }, { 14, 0x0000 }, /* 0x0300 */ { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0xfffe }, { 29, 0x03fb }, { 38, 0xfffe }, { 53, 0x03fb }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, /* 0x0400 */ { 62, 0x0002 }, { 63, 0x1ff0 }, { 72, 0xfff8 }, { 85, 0xffff }, { 101, 0xffff }, { 117, 0x0002 }, }; static const Summary16 big5_uni2indx_page20[44] = { /* 0x2000 */ { 118, 0x0000 }, { 118, 0x3318 }, { 124, 0x0064 }, { 127, 0x4824 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, /* 0x2100 */ { 131, 0x0228 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x03ff }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x03cf }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, /* 0x2200 */ { 152, 0x0000 }, { 152, 0xc400 }, { 155, 0x4e29 }, { 162, 0x1030 }, { 165, 0x0000 }, { 165, 0x0004 }, { 166, 0x00c3 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0020 }, { 171, 0x8000 }, }; static const Summary16 big5_uni2indx_page24[37] = { /* 0x2400 */ { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x03ff }, { 182, 0x3ff0 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, /* 0x2500 */ { 192, 0x1005 }, { 195, 0x1111 }, { 199, 0x1010 }, { 201, 0x1010 }, { 203, 0x0000 }, { 203, 0x4001 }, { 205, 0xe402 }, { 210, 0x000f }, { 214, 0xfffe }, { 229, 0x0030 }, { 231, 0x0003 }, { 233, 0x300c }, { 237, 0xc8c0 }, { 242, 0x0000 }, { 242, 0x003c }, { 246, 0x0000 }, /* 0x2600 */ { 246, 0x0260 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0007 }, }; static const Summary16 big5_uni2indx_page30[62] = { /* 0x3000 */ { 252, 0xff2f }, { 265, 0x6037 }, { 272, 0x03fe }, { 281, 0x0000 }, { 281, 0xfffe }, { 296, 0xffff }, { 312, 0xffff }, { 328, 0xffff }, { 344, 0xffff }, { 360, 0x600f }, { 366, 0xfffe }, { 381, 0xffff }, { 397, 0xffff }, { 413, 0xffff }, { 429, 0xffff }, { 445, 0x407f }, /* 0x3100 */ { 453, 0xffe0 }, { 464, 0xffff }, { 480, 0x03ff }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, /* 0x3200 */ { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0008 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, /* 0x3300 */ { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0xc000 }, { 493, 0x7000 }, { 496, 0x0002 }, { 497, 0x0000 }, { 497, 0x4010 }, { 499, 0x0026 }, }; static const Summary16 big5_uni2indx_page4e[1307] = { /* 0x4e00 */ { 502, 0xff8b }, { 514, 0xc373 }, { 523, 0x6840 }, { 527, 0x1b0f }, { 535, 0xe9ac }, { 544, 0xf34c }, { 553, 0x0200 }, { 554, 0xc008 }, { 557, 0x795c }, { 566, 0xca3e }, { 575, 0x7976 }, { 585, 0x0648 }, { 589, 0x2fdf }, { 601, 0xf7f0 }, { 612, 0x033a }, { 618, 0xa8ff }, /* 0x4f00 */ { 629, 0xef37 }, { 641, 0x233f }, { 650, 0xb004 }, { 654, 0xfd59 }, { 665, 0xf3ca }, { 675, 0xffff }, { 691, 0xde9f }, { 703, 0xfff9 }, { 717, 0xabff }, { 730, 0x7df7 }, { 743, 0xc000 }, { 745, 0x8eec }, { 754, 0xeebf }, { 767, 0xffdb }, { 781, 0xd003 }, { 786, 0x45fa }, /* 0x5000 */ { 795, 0xfae1 }, { 805, 0xdffe }, { 819, 0xbfef }, { 833, 0x10ab }, { 839, 0xffeb }, { 853, 0xfcaa }, { 863, 0xef3f }, { 876, 0x24fd }, { 885, 0x78ad }, { 894, 0x7f76 }, { 906, 0xf00c }, { 912, 0xedff }, { 926, 0xcff6 }, { 938, 0x2cfa }, { 947, 0xf7f9 }, { 960, 0xeb6b }, /* 0x5100 */ { 971, 0x1ffd }, { 983, 0x95bf }, { 994, 0x6677 }, { 1004, 0xbfbf }, { 1018, 0x3bfb }, { 1030, 0xfeb4 }, { 1041, 0x7bae }, { 1052, 0x11e2 }, { 1058, 0xa681 }, { 1064, 0x41be }, { 1072, 0x1435 }, { 1078, 0x72c3 }, { 1086, 0x7d70 }, { 1095, 0x7191 }, { 1102, 0x0003 }, { 1104, 0x276b }, /* 0x5200 */ { 1113, 0x57cb }, { 1123, 0x70cf }, { 1132, 0x4732 }, { 1139, 0x0def }, { 1149, 0x7eda }, { 1160, 0xfc74 }, { 1170, 0xfe06 }, { 1179, 0xbdb4 }, { 1189, 0x3f9f }, { 1201, 0x8bca }, { 1209, 0x7e49 }, { 1218, 0x5800 }, { 1221, 0x228f }, { 1228, 0xebec }, { 1239, 0x8a5c }, { 1246, 0xddbb }, /* 0x5300 */ { 1258, 0xef60 }, { 1267, 0xb6e7 }, { 1278, 0xa40f }, { 1285, 0xf293 }, { 1294, 0x37bb }, { 1305, 0x549e }, { 1313, 0xd04b }, { 1320, 0x9baf }, { 1331, 0xc414 }, { 1336, 0xf7d4 }, { 1347, 0x30b0 }, { 1352, 0x0a14 }, { 1356, 0x2f08 }, { 1362, 0x88d0 }, { 1367, 0xff7e }, { 1381, 0x192f }, /* 0x5400 */ { 1389, 0xffda }, { 1402, 0xfb07 }, { 1412, 0x7ff1 }, { 1424, 0x7beb }, { 1436, 0xc5ef }, { 1447, 0x0010 }, { 1448, 0x99ff }, { 1460, 0xfdff }, { 1475, 0x79d7 }, { 1486, 0x0567 }, { 1493, 0xffe7 }, { 1507, 0xfdcb }, { 1519, 0xc3ff }, { 1531, 0x4040 }, { 1533, 0x6ff7 }, { 1546, 0xbd8e }, /* 0x5500 */ { 1556, 0xdffa }, { 1569, 0x0497 }, { 1575, 0xf4c0 }, { 1582, 0x5bff }, { 1595, 0xed7b }, { 1607, 0xd0e7 }, { 1616, 0x047e }, { 1623, 0xf8e0 }, { 1631, 0xff9f }, { 1645, 0xb73e }, { 1656, 0x7dfe }, { 1669, 0x882e }, { 1675, 0xfffd }, { 1690, 0xbe7f }, { 1703, 0x83fe }, { 1713, 0xf6c4 }, /* 0x5600 */ { 1722, 0xf357 }, { 1733, 0xb8fd }, { 1744, 0xd680 }, { 1750, 0xef7d }, { 1763, 0x5767 }, { 1773, 0x4788 }, { 1779, 0xff7d }, { 1793, 0xc3df }, { 1804, 0xf0ff }, { 1816, 0x37a9 }, { 1825, 0x7de0 }, { 1834, 0x70fc }, { 1843, 0x3f6f }, { 1855, 0xec9a }, { 1864, 0x4cb3 }, { 1872, 0x8681 }, /* 0x5700 */ { 1877, 0x3f9e }, { 1888, 0xdd5c }, { 1898, 0xf70d }, { 1908, 0x4819 }, { 1913, 0xfea3 }, { 1924, 0x0007 }, { 1927, 0xaf56 }, { 1937, 0x38ff }, { 1948, 0x980d }, { 1954, 0xefb8 }, { 1965, 0x403d }, { 1971, 0xb760 }, { 1979, 0xd8ce }, { 1988, 0x9035 }, { 1994, 0x72bf }, { 2005, 0x3fff }, /* 0x5800 */ { 2019, 0x7ff7 }, { 2033, 0x7a11 }, { 2040, 0xf7bb }, { 2053, 0xabff }, { 2066, 0xff00 }, { 2074, 0x6fbe }, { 2086, 0xa93c }, { 2094, 0xfe72 }, { 2105, 0xcfef }, { 2118, 0xf11b }, { 2127, 0xdb6b }, { 2138, 0xf40a }, { 2145, 0xc3e6 }, { 2154, 0xef7e }, { 2167, 0x9b9c }, { 2176, 0xf610 }, /* 0x5900 */ { 2183, 0xf048 }, { 2189, 0x16f4 }, { 2197, 0xfeb5 }, { 2209, 0x5182 }, { 2214, 0xc7b1 }, { 2223, 0x15bb }, { 2232, 0x6e87 }, { 2241, 0xfbdf }, { 2255, 0xe43f }, { 2265, 0x63cd }, { 2274, 0xc1ff }, { 2285, 0x7e7e }, { 2297, 0xfdeb }, { 2310, 0x7d5f }, { 2322, 0x777b }, { 2334, 0xfcfe }, /* 0x5a00 */ { 2347, 0x960b }, { 2354, 0xdbea }, { 2365, 0x6229 }, { 2371, 0x53e8 }, { 2379, 0x37df }, { 2391, 0xfdef }, { 2405, 0x36f5 }, { 2415, 0xbd81 }, { 2423, 0xdc18 }, { 2430, 0xfcbd }, { 2442, 0xd2e4 }, { 2450, 0xffff }, { 2466, 0x3fd7 }, { 2478, 0xffe0 }, { 2489, 0x7f6f }, { 2502, 0xabf8 }, /* 0x5b00 */ { 2512, 0x9bae }, { 2522, 0x6ed9 }, { 2532, 0xf5fb }, { 2545, 0xf115 }, { 2553, 0x79a9 }, { 2562, 0xbdfb }, { 2575, 0x5a3c }, { 2583, 0xadaf }, { 2594, 0xdbba }, { 2605, 0x1fac }, { 2614, 0x71fc }, { 2624, 0x8379 }, { 2632, 0x7cf7 }, { 2644, 0xc35f }, { 2654, 0xdfff }, { 2669, 0x0567 }, /* 0x5c00 */ { 2676, 0xff9a }, { 2688, 0x8467 }, { 2695, 0x1534 }, { 2701, 0xdf8b }, { 2712, 0xf9f3 }, { 2724, 0x3373 }, { 2733, 0xf7bd }, { 2746, 0x5e1a }, { 2754, 0xbf40 }, { 2762, 0xa03f }, { 2770, 0xffff }, { 2786, 0x01eb }, { 2793, 0xdfc0 }, { 2802, 0xcfdd }, { 2814, 0x7500 }, { 2819, 0xabd3 }, /* 0x5d00 */ { 2829, 0xf8c3 }, { 2838, 0xeed6 }, { 2849, 0x43fd }, { 2859, 0xb7ff }, { 2873, 0x5eaf }, { 2884, 0x4227 }, { 2890, 0x9bac }, { 2899, 0xf686 }, { 2908, 0x27d7 }, { 2918, 0xf6bc }, { 2929, 0xf787 }, { 2940, 0x35b7 }, { 2950, 0xaacd }, { 2959, 0xe176 }, { 2968, 0x49e7 }, { 2977, 0xe29f }, /* 0x5e00 */ { 2987, 0x545c }, { 2994, 0xaff2 }, { 3005, 0x2b3f }, { 3015, 0x61d8 }, { 3022, 0xfc3b }, { 3033, 0xbbb8 }, { 3043, 0xffcf }, { 3057, 0x7b7d }, { 3069, 0xbf95 }, { 3080, 0x1ce0 }, { 3086, 0x7dfd }, { 3099, 0x43ff }, { 3110, 0x5ff6 }, { 3122, 0xfffe }, { 3137, 0xd3ef }, { 3149, 0xc4ce }, /* 0x5f00 */ { 3157, 0x8db6 }, { 3166, 0xadbc }, { 3176, 0x63dc }, { 3185, 0x11eb }, { 3193, 0xdf59 }, { 3204, 0x23d0 }, { 3210, 0xbeb4 }, { 3220, 0xf3db }, { 3232, 0x1fe7 }, { 3243, 0xdbc7 }, { 3254, 0xff63 }, { 3266, 0xfae4 }, { 3276, 0xb22b }, { 3284, 0x63f7 }, { 3295, 0xed3b }, { 3306, 0xadba }, /* 0x6000 */ { 3316, 0xfe01 }, { 3324, 0x7eff }, { 3338, 0xfff7 }, { 3353, 0x02bc }, { 3359, 0x32ff }, { 3370, 0xef39 }, { 3381, 0xfffc }, { 3395, 0x8005 }, { 3398, 0x77fb }, { 3411, 0xbcf5 }, { 3422, 0x010d }, { 3426, 0xfff7 }, { 3441, 0xfffb }, { 3456, 0xbf3a }, { 3467, 0x0057 }, { 3472, 0xdfff }, /* 0x6100 */ { 3487, 0xef7b }, { 3500, 0xbd7d }, { 3512, 0xdb88 }, { 3520, 0xc8d4 }, { 3527, 0xfff3 }, { 3541, 0xed7c }, { 3552, 0x5dee }, { 3563, 0x56ff }, { 3575, 0x7e0d }, { 3584, 0xac5f }, { 3594, 0xff96 }, { 3606, 0xd57f }, { 3618, 0x3fee }, { 3630, 0xc140 }, { 3634, 0x6ff9 }, { 3646, 0xffe7 }, /* 0x6200 */ { 3660, 0x779b }, { 3671, 0x8e77 }, { 3681, 0x6ebf }, { 3693, 0xe45d }, { 3702, 0x6fcf }, { 3714, 0x5f1f }, { 3725, 0xe07f }, { 3735, 0xfedf }, { 3749, 0xd7db }, { 3761, 0x01fe }, { 3769, 0xff00 }, { 3777, 0xfb7b }, { 3790, 0xffd4 }, { 3802, 0x1fdf }, { 3814, 0xf800 }, { 3819, 0xffff }, /* 0x6300 */ { 3835, 0xfb8f }, { 3847, 0x007b }, { 3853, 0xbf00 }, { 3860, 0x7f5c }, { 3871, 0xffff }, { 3887, 0x07f3 }, { 3896, 0xeba0 }, { 3904, 0x3de7 }, { 3915, 0xf7bf }, { 3929, 0xfbd7 }, { 3942, 0xffbf }, { 3957, 0x6003 }, { 3961, 0xfffd }, { 3976, 0xbfed }, { 3989, 0xefbb }, { 4002, 0x027f }, /* 0x6400 */ { 4010, 0xfe40 }, { 4018, 0xddfd }, { 4031, 0xfdff }, { 4046, 0xe2f9 }, { 4056, 0x680b }, { 4062, 0xfb1f }, { 4074, 0xfbe3 }, { 4086, 0xaffd }, { 4099, 0x9fa4 }, { 4108, 0xf7ed }, { 4121, 0x7a7d }, { 4132, 0xf80f }, { 4141, 0xeebe }, { 4153, 0x0fd5 }, { 4162, 0xbb5d }, { 4173, 0xfd9f }, /* 0x6500 */ { 4186, 0xf2db }, { 4197, 0x3bf9 }, { 4208, 0xfe7f }, { 4222, 0xebcc }, { 4232, 0x876a }, { 4240, 0x73fa }, { 4251, 0x95fc }, { 4261, 0x9ffc }, { 4273, 0x109f }, { 4280, 0xfaf7 }, { 4293, 0xddb7 }, { 4305, 0xbbcd }, { 4316, 0xf87e }, { 4327, 0xeccd }, { 4337, 0xf366 }, { 4347, 0x3c3f }, /* 0x6600 */ { 4357, 0xfffd }, { 4372, 0xb03f }, { 4381, 0xe9f7 }, { 4393, 0x067e }, { 4401, 0x96ae }, { 4410, 0xfe06 }, { 4419, 0xd576 }, { 4429, 0x5fd7 }, { 4441, 0x3fd1 }, { 4451, 0xa3f3 }, { 4461, 0xcf07 }, { 4470, 0x6fb7 }, { 4482, 0x9fd1 }, { 4492, 0x7f44 }, { 4501, 0x7b59 }, { 4511, 0xd3dd }, /* 0x6700 */ { 4522, 0xaf3b }, { 4533, 0xa9bd }, { 4543, 0x7dcf }, { 4555, 0xff3a }, { 4567, 0xfbe0 }, { 4577, 0xf6eb }, { 4589, 0xb401 }, { 4594, 0xffff }, { 4610, 0x7afa }, { 4621, 0xb7bf }, { 4634, 0xc000 }, { 4636, 0x0ffd }, { 4647, 0xff7f }, { 4662, 0xff1f }, { 4675, 0xfefc }, { 4688, 0x95ff }, /* 0x6800 */ { 4700, 0x0000 }, { 4700, 0xb5dc }, { 4710, 0xef63 }, { 4721, 0x3f3e }, { 4732, 0xfb7f }, { 4746, 0x001b }, { 4750, 0xe800 }, { 4754, 0xfbf6 }, { 4767, 0x9eef }, { 4779, 0xb8df }, { 4790, 0xff9f }, { 4804, 0x003f }, { 4810, 0x7bd0 }, { 4819, 0xf5ff }, { 4833, 0xdfdb }, { 4846, 0x3fff }, /* 0x6900 */ { 4860, 0xfdf0 }, { 4871, 0x00bf }, { 4878, 0x8420 }, { 4881, 0xbbbd }, { 4893, 0xdf37 }, { 4905, 0xffde }, { 4919, 0xff6d }, { 4932, 0x0ff3 }, { 4942, 0x604c }, { 4947, 0x5efb }, { 4959, 0xfffb }, { 4974, 0xfafb }, { 4987, 0xfe5e }, { 4999, 0x0219 }, { 5003, 0x79f4 }, { 5013, 0xf9de }, /* 0x6a00 */ { 5025, 0xa7f7 }, { 5037, 0xebfa }, { 5049, 0x01eb }, { 5056, 0xff34 }, { 5067, 0xebd3 }, { 5078, 0xef73 }, { 5090, 0xafd7 }, { 5102, 0xc040 }, { 5105, 0x72bb }, { 5115, 0xdcff }, { 5128, 0xf17f }, { 5140, 0x2fd8 }, { 5149, 0xb8ec }, { 5158, 0xfe0b }, { 5168, 0xdda3 }, { 5178, 0x1f0b }, /* 0x6b00 */ { 5186, 0x8f1d }, { 5195, 0x47cf }, { 5205, 0xb12b }, { 5213, 0xffde }, { 5227, 0x7fee }, { 5240, 0xda73 }, { 5250, 0x24ff }, { 5260, 0xcbc4 }, { 5268, 0xf75d }, { 5280, 0xcbf2 }, { 5290, 0xecfd }, { 5302, 0xb4ed }, { 5312, 0xbff9 }, { 5325, 0x4ddd }, { 5335, 0x99dd }, { 5345, 0xfb8d }, /* 0x6c00 */ { 5356, 0xbb7f }, { 5369, 0xaf7b }, { 5381, 0xddfb }, { 5394, 0xc959 }, { 5402, 0xfc4f }, { 5413, 0xfab5 }, { 5424, 0xafe3 }, { 5435, 0x6d5f }, { 5446, 0xffff }, { 5462, 0x3f7d }, { 5474, 0x7800 }, { 5478, 0xffdb }, { 5492, 0xb6ff }, { 5505, 0x7eff }, { 5519, 0xfbaf }, { 5532, 0x022f }, /* 0x6d00 */ { 5538, 0xff9b }, { 5551, 0xefc7 }, { 5563, 0xffa5 }, { 5575, 0xffff }, { 5591, 0x0007 }, { 5594, 0xc700 }, { 5599, 0xf7ff }, { 5614, 0xfff1 }, { 5627, 0x7ffd }, { 5641, 0x01bf }, { 5649, 0xdc00 }, { 5654, 0xfdbc }, { 5666, 0xbff5 }, { 5679, 0xffff }, { 5695, 0xff7f }, { 5710, 0x3eff }, /* 0x6e00 */ { 5723, 0x0029 }, { 5726, 0xbe00 }, { 5732, 0xf9ff }, { 5746, 0xff7f }, { 5761, 0x6efb }, { 5773, 0xfd7e }, { 5786, 0xcbff }, { 5799, 0x039e }, { 5806, 0xe300 }, { 5811, 0xfbdd }, { 5824, 0xccff }, { 5836, 0xf6df }, { 5849, 0xffff }, { 5865, 0x117f }, { 5874, 0xf800 }, { 5879, 0xfbf6 }, /* 0x6f00 */ { 5892, 0xe7ef }, { 5905, 0xd73c }, { 5915, 0xfeef }, { 5929, 0xdfef }, { 5943, 0xc00b }, { 5948, 0xedbf }, { 5961, 0xfedf }, { 5975, 0xfdcd }, { 5987, 0x7bf5 }, { 5999, 0x40fd }, { 6007, 0xffff }, { 6023, 0xb75f }, { 6035, 0xffdf }, { 6050, 0xf930 }, { 6058, 0xfbdf }, { 6072, 0xdc97 }, /* 0x7000 */ { 6082, 0xfef3 }, { 6095, 0xbff2 }, { 6107, 0x8fdf }, { 6119, 0xdfbf }, { 6133, 0x177f }, { 6144, 0xede6 }, { 6155, 0x0f7f }, { 6166, 0x3553 }, { 6174, 0x447c }, { 6181, 0x877e }, { 6191, 0xfa12 }, { 6199, 0x45bb }, { 6208, 0xede0 }, { 6217, 0x779e }, { 6228, 0x8017 }, { 6233, 0xbfd9 }, /* 0x7100 */ { 6245, 0x7e55 }, { 6255, 0xde89 }, { 6264, 0xc16f }, { 6273, 0x0447 }, { 6278, 0x7ade }, { 6289, 0xf75d }, { 6301, 0x57ff }, { 6314, 0x2905 }, { 6319, 0x86f7 }, { 6329, 0xfe95 }, { 6340, 0x97b3 }, { 6350, 0xf32f }, { 6361, 0xcfff }, { 6375, 0x9f75 }, { 6386, 0x71f7 }, { 6397, 0xfb17 }, /* 0x7200 */ { 6408, 0x34ee }, { 6417, 0xee19 }, { 6426, 0x37cc }, { 6435, 0xef61 }, { 6445, 0x9fd6 }, { 6456, 0xef4c }, { 6466, 0xd68f }, { 6476, 0xfbdd }, { 6489, 0x7b73 }, { 6500, 0x6def }, { 6512, 0xd7fe }, { 6525, 0xa431 }, { 6531, 0x5e7f }, { 6543, 0x97d7 }, { 6554, 0x0f5b }, { 6563, 0xffd8 }, /* 0x7300 */ { 6575, 0x9d83 }, { 6583, 0x7bce }, { 6594, 0x22ec }, { 6601, 0xdcff }, { 6614, 0x763d }, { 6624, 0xef87 }, { 6635, 0xdfe7 }, { 6648, 0xfded }, { 6661, 0x4fff }, { 6674, 0xa0fc }, { 6682, 0x3b77 }, { 6693, 0xdbfc }, { 6705, 0x3ded }, { 6716, 0x7fdc }, { 6728, 0x6fa9 }, { 6738, 0xf570 }, /* 0x7400 */ { 6747, 0x3ffb }, { 6760, 0x2c40 }, { 6764, 0xff7f }, { 6779, 0x847f }, { 6788, 0xec57 }, { 6798, 0xdeb7 }, { 6810, 0xe69c }, { 6819, 0xf22f }, { 6829, 0x0feb }, { 6839, 0xd5b5 }, { 6849, 0xafeb }, { 6861, 0xede7 }, { 6873, 0x8c2f }, { 6881, 0xfff0 }, { 6893, 0x537f }, { 6904, 0xe8f0 }, /* 0x7500 */ { 6912, 0xb99d }, { 6922, 0xb5ff }, { 6935, 0xff66 }, { 6947, 0xe78f }, { 6958, 0xd981 }, { 6965, 0xbe10 }, { 6972, 0x9c7c }, { 6981, 0xe3c1 }, { 6989, 0x9cd1 }, { 6997, 0x2733 }, { 7005, 0x0cbc }, { 7012, 0xff6d }, { 7025, 0xfcb7 }, { 7037, 0xefb7 }, { 7050, 0xa0df }, { 7059, 0xffff }, /* 0x7600 */ { 7075, 0xbf0b }, { 7085, 0xfe7b }, { 7098, 0xa3ff }, { 7110, 0x353f }, { 7120, 0x13cc }, { 7127, 0x97cd }, { 7137, 0x7637 }, { 7147, 0xfb27 }, { 7158, 0xcfd6 }, { 7169, 0x7e6c }, { 7179, 0xec50 }, { 7186, 0xed31 }, { 7195, 0x677c }, { 7205, 0xfc1c }, { 7214, 0xf6fa }, { 7226, 0x5fbf }, /* 0x7700 */ { 7239, 0x0fba }, { 7248, 0xae2f }, { 7258, 0xa3ad }, { 7267, 0x7ffe }, { 7281, 0xfcf0 }, { 7291, 0xde74 }, { 7301, 0xffef }, { 7316, 0xf200 }, { 7321, 0xfbbf }, { 7335, 0xfea2 }, { 7345, 0x3daf }, { 7356, 0xbcff }, { 7369, 0xf694 }, { 7378, 0x5fb9 }, { 7389, 0xf3ad }, { 7400, 0x3f8f }, /* 0x7800 */ { 7411, 0xf26c }, { 7420, 0xa01f }, { 7427, 0xffef }, { 7442, 0x01bf }, { 7450, 0x7728 }, { 7458, 0x7005 }, { 7463, 0xff35 }, { 7475, 0xda03 }, { 7482, 0xd2f9 }, { 7492, 0xc7fa }, { 7503, 0x3fbf }, { 7516, 0x5c1d }, { 7524, 0xff3a }, { 7536, 0xec33 }, { 7545, 0xb7af }, { 7557, 0xfe9c }, /* 0x7900 */ { 7568, 0x5236 }, { 7575, 0x7a9f }, { 7586, 0xbffa }, { 7599, 0xe722 }, { 7607, 0x9ff7 }, { 7620, 0xfcff }, { 7634, 0x2fbb }, { 7645, 0xb61d }, { 7654, 0xed06 }, { 7662, 0x1dfd }, { 7673, 0x7dd7 }, { 7685, 0xefdf }, { 7699, 0xeb23 }, { 7708, 0xf166 }, { 7717, 0x7ed9 }, { 7728, 0x0dc0 }, /* 0x7a00 */ { 7733, 0x3d3d }, { 7743, 0xdfbf }, { 7757, 0xc945 }, { 7764, 0xba83 }, { 7772, 0x7dd1 }, { 7782, 0x9dd0 }, { 7790, 0x7b87 }, { 7800, 0xcf73 }, { 7811, 0x9ff3 }, { 7823, 0xc3f5 }, { 7833, 0xdf0d }, { 7843, 0xc5fe }, { 7854, 0x0cb3 }, { 7861, 0x8302 }, { 7865, 0xe879 }, { 7874, 0xaec0 }, /* 0x7b00 */ { 7881, 0xc773 }, { 7891, 0x6f0f }, { 7901, 0xfd7d }, { 7914, 0x093f }, { 7922, 0xfff1 }, { 7935, 0x0157 }, { 7941, 0x62fb }, { 7951, 0x01ff }, { 7960, 0xfdb4 }, { 7971, 0x3bf3 }, { 7982, 0xb013 }, { 7988, 0x43b2 }, { 7995, 0x5ed3 }, { 8005, 0xff30 }, { 8015, 0x0fff }, { 8027, 0xeb9f }, /* 0x7c00 */ { 8039, 0xfeef }, { 8053, 0xf203 }, { 8060, 0x3fef }, { 8073, 0xfb89 }, { 8083, 0x37a9 }, { 8092, 0x9e99 }, { 8101, 0xdef9 }, { 8113, 0xa72c }, { 8121, 0x3733 }, { 8130, 0xc1f6 }, { 8139, 0x812e }, { 8145, 0xfe3e }, { 8157, 0x5d20 }, { 8163, 0xf2f7 }, { 8175, 0xd585 }, { 8183, 0x69d7 }, /* 0x7d00 */ { 8193, 0xffff }, { 8209, 0xffff }, { 8225, 0xdb07 }, { 8234, 0xff6f }, { 8248, 0xc4ff }, { 8259, 0xd97f }, { 8271, 0xefce }, { 8283, 0xbe0f }, { 8293, 0xf17b }, { 8304, 0xf05e }, { 8313, 0xf6cf }, { 8325, 0xffb7 }, { 8339, 0x5ef7 }, { 8351, 0xef84 }, { 8360, 0xd7cb }, { 8371, 0x0edf }, /* 0x7e00 */ { 8381, 0xff08 }, { 8390, 0xfcff }, { 8404, 0xee3f }, { 8416, 0xffff }, { 8432, 0x13ff }, { 8443, 0xd7ff }, { 8457, 0xaf0f }, { 8467, 0x7ffd }, { 8481, 0xbdc7 }, { 8492, 0x1ffa }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, /* 0x7f00 */ { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0xe740 }, { 8510, 0xbd38 }, { 8519, 0xf933 }, { 8529, 0x7feb }, { 8542, 0xfeed }, { 8555, 0x7fe8 }, { 8566, 0x7c76 }, { 8576, 0xb3f7 }, { 8588, 0xffef }, { 8603, 0xfeaf }, { 8616, 0xd8b7 }, { 8626, 0xff6f }, { 8640, 0xfbbf }, /* 0x8000 */ { 8654, 0xf8fb }, { 8666, 0xdbf7 }, { 8679, 0x1752 }, { 8686, 0xe2f9 }, { 8696, 0x85c8 }, { 8702, 0x7547 }, { 8711, 0x9090 }, { 8715, 0xe3ef }, { 8727, 0x9ef4 }, { 8737, 0x3f6d }, { 8748, 0xee2e }, { 8758, 0x0536 }, { 8764, 0xf7bc }, { 8776, 0x7ff3 }, { 8789, 0xa07b }, { 8797, 0x7f3f }, /* 0x8100 */ { 8810, 0x0567 }, { 8817, 0xeb60 }, { 8825, 0xbabe }, { 8836, 0x6601 }, { 8841, 0xfcd8 }, { 8851, 0x583f }, { 8860, 0xcaf7 }, { 8871, 0x87df }, { 8882, 0xbfcd }, { 8894, 0xffa0 }, { 8904, 0x5bcd }, { 8914, 0xfebf }, { 8928, 0xb6fd }, { 8940, 0xefa7 }, { 8952, 0x77ef }, { 8965, 0xdf9c }, /* 0x8200 */ { 8976, 0x3fb7 }, { 8988, 0xf877 }, { 8999, 0x9d27 }, { 9008, 0xb7fc }, { 9020, 0xcab5 }, { 9029, 0xdfef }, { 9043, 0xfb5a }, { 9054, 0xf1b6 }, { 9064, 0xec39 }, { 9073, 0xef1f }, { 9085, 0xfbbf }, { 9099, 0x7ffb }, { 9113, 0x000d }, { 9116, 0xdafe }, { 9128, 0xbdfb }, { 9141, 0x4e7f }, /* 0x8300 */ { 9152, 0x33ff }, { 9164, 0x5ac0 }, { 9170, 0xbff5 }, { 9183, 0x9ffe }, { 9196, 0xffbf }, { 9211, 0x005f }, { 9217, 0x0000 }, { 9217, 0xfdf8 }, { 9229, 0xffca }, { 9241, 0x6ffd }, { 9254, 0xcffd }, { 9267, 0xa001 }, { 9270, 0xdfff }, { 9285, 0xfbf2 }, { 9297, 0xdfbf }, { 9311, 0xff7f }, /* 0x8400 */ { 9326, 0xfeda }, { 9338, 0x080f }, { 9343, 0xba08 }, { 9349, 0xbfff }, { 9364, 0x7afd }, { 9376, 0xeed7 }, { 9388, 0xfbeb }, { 9401, 0x67f9 }, { 9412, 0xe044 }, { 9417, 0xff93 }, { 9429, 0xdf97 }, { 9441, 0x9f57 }, { 9452, 0xfef7 }, { 9466, 0x08df }, { 9474, 0xdf80 }, { 9482, 0xfedf }, /* 0x8500 */ { 9496, 0xffc5 }, { 9508, 0xf7fe }, { 9522, 0xfffb }, { 9537, 0x6803 }, { 9542, 0x67fb }, { 9554, 0x6bfa }, { 9565, 0x7fff }, { 9580, 0x5fe2 }, { 9590, 0xffff }, { 9606, 0xff73 }, { 9619, 0x87df }, { 9630, 0xe7fb }, { 9643, 0xebfd }, { 9656, 0xf7a7 }, { 9668, 0xbf7e }, { 9681, 0xefc7 }, /* 0x8600 */ { 9693, 0x1ef3 }, { 9703, 0xdf82 }, { 9712, 0x76ff }, { 9725, 0xdf7e }, { 9738, 0x79c9 }, { 9747, 0xda7d }, { 9758, 0xefbe }, { 9771, 0x1e9b }, { 9780, 0x7ce0 }, { 9788, 0x77fb }, { 9801, 0x87be }, { 9811, 0xfffb }, { 9826, 0x1bff }, { 9838, 0xffdb }, { 9852, 0x3f5c }, { 9862, 0x4fe0 }, /* 0x8700 */ { 9870, 0x7fff }, { 9885, 0x5f0e }, { 9894, 0x77ff }, { 9908, 0xddbf }, { 9921, 0xf04f }, { 9930, 0xffff }, { 9946, 0xffff }, { 9962, 0x0ff8 }, { 9971, 0xa3be }, { 9981, 0xfddf }, { 9995, 0xfc1c }, { 10004, 0xfffd }, { 10019, 0x1f7d }, { 10030, 0xfb9e }, { 10042, 0xbdff }, { 10056, 0xdedc }, /* 0x8800 */ { 10067, 0x3f6f }, { 10079, 0xbafb }, { 10091, 0xdf7f }, { 10105, 0xfbef }, { 10119, 0x7d1b }, { 10129, 0x2eec }, { 10138, 0xaf8e }, { 10148, 0xf2f7 }, { 10160, 0x7b0f }, { 10170, 0xcfee }, { 10182, 0x1d96 }, { 10190, 0x77c6 }, { 10200, 0x7e07 }, { 10209, 0xfff5 }, { 10223, 0xd982 }, { 10230, 0x7fdf }, /* 0x8900 */ { 10244, 0x5ee6 }, { 10254, 0xc7ff }, { 10267, 0xfeee }, { 10280, 0x79ef }, { 10292, 0x9a56 }, { 10300, 0xffcf }, { 10314, 0xfe5f }, { 10327, 0xde5e }, { 10338, 0x896e }, { 10346, 0xf9e8 }, { 10356, 0xf45e }, { 10366, 0xe6c4 }, { 10374, 0x0001 }, { 10375, 0xbe7c }, { 10386, 0x3b7f }, { 10398, 0xdddf }, /* 0x8a00 */ { 10411, 0xd59d }, { 10421, 0xe9ef }, { 10433, 0x34ac }, { 10440, 0xde53 }, { 10450, 0xf573 }, { 10461, 0x4bf7 }, { 10472, 0x7b4f }, { 10483, 0x9eff }, { 10496, 0xb8fe }, { 10507, 0x476e }, { 10516, 0x0dfb }, { 10526, 0xff45 }, { 10537, 0xabfd }, { 10549, 0xfbfe }, { 10563, 0xe9d7 }, { 10574, 0xddff }, /* 0x8b00 */ { 10588, 0xedf7 }, { 10601, 0x7fff }, { 10616, 0xddfd }, { 10629, 0x7eeb }, { 10641, 0xcfe7 }, { 10653, 0xb7ff }, { 10667, 0xbde9 }, { 10678, 0xef91 }, { 10688, 0x5d75 }, { 10698, 0xd77c }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, /* 0x8c00 */ { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0xfa80 }, { 10716, 0xffee }, { 10730, 0xb4f1 }, { 10739, 0xbf76 }, { 10751, 0x2fef }, { 10763, 0xb677 }, { 10774, 0x77bf }, { 10787, 0x9fbf }, { 10800, 0xfffd }, { 10815, 0x95bf }, { 10826, 0xf6ae }, { 10837, 0x75ff }, { 10850, 0x7f3b }, /* 0x8d00 */ { 10862, 0xa7f5 }, { 10873, 0x0af9 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0xfbd0 }, { 10891, 0x2bdd }, { 10901, 0xf633 }, { 10911, 0x9a7f }, { 10922, 0xfdab }, { 10934, 0xd6fc }, { 10945, 0xf9e6 }, { 10956, 0xbfeb }, { 10969, 0xdfdf }, { 10983, 0xf41f }, /* 0x8e00 */ { 10993, 0xa6fd }, { 11004, 0xffff }, { 11020, 0x4aff }, { 11031, 0xf37b }, { 11043, 0x7fb7 }, { 11056, 0xfef9 }, { 11069, 0xb6ff }, { 11082, 0x1d5c }, { 11090, 0x7ff6 }, { 11103, 0xe5ff }, { 11116, 0x1f7b }, { 11127, 0x2404 }, { 11130, 0xbe05 }, { 11138, 0xf99e }, { 11149, 0xdbe3 }, { 11160, 0xdff2 }, /* 0x8f00 */ { 11172, 0x6fef }, { 11185, 0xfdff }, { 11200, 0xd679 }, { 11210, 0xcbfc }, { 11221, 0xebfd }, { 11234, 0xefff }, { 11249, 0x001f }, { 11254, 0x0000 }, { 11254, 0x0000 }, { 11254, 0x9800 }, { 11257, 0xe148 }, { 11263, 0x8017 }, { 11268, 0x6a74 }, { 11276, 0x00fe }, { 11283, 0x6d7f }, { 11295, 0xfdf1 }, /* 0x9000 */ { 11307, 0xb87f }, { 11318, 0xfef3 }, { 11331, 0xe01f }, { 11339, 0xf176 }, { 11349, 0xee96 }, { 11359, 0x7b3f }, { 11371, 0xeb8d }, { 11381, 0xfffd }, { 11396, 0xadff }, { 11409, 0xcbb3 }, { 11419, 0x84ef }, { 11428, 0xe17f }, { 11439, 0x4daa }, { 11447, 0xbff0 }, { 11458, 0xbf3f }, { 11471, 0xfe3f }, /* 0x9100 */ { 11484, 0xebff }, { 11498, 0xffd7 }, { 11512, 0xffdf }, { 11527, 0xcf7f }, { 11540, 0xfffb }, { 11555, 0x85ed }, { 11564, 0xd73f }, { 11576, 0x07bc }, { 11584, 0xaeff }, { 11597, 0xfe0f }, { 11608, 0xfdaf }, { 11621, 0x76bf }, { 11633, 0xfaef }, { 11646, 0x37bb }, { 11657, 0x7fdc }, { 11669, 0xa3ba }, /* 0x9200 */ { 11678, 0xb6ff }, { 11691, 0x56f7 }, { 11702, 0x60f8 }, { 11709, 0xe7df }, { 11722, 0xff61 }, { 11733, 0x4cdf }, { 11743, 0xb0fb }, { 11753, 0xff45 }, { 11764, 0x7ded }, { 11776, 0x3ffa }, { 11788, 0x1fff }, { 11801, 0x18fc }, { 11809, 0xffff }, { 11825, 0xe3af }, { 11836, 0xc7d3 }, { 11846, 0xdf83 }, /* 0x9300 */ { 11856, 0xfb57 }, { 11868, 0xef7d }, { 11881, 0xefff }, { 11896, 0x1378 }, { 11903, 0xfec0 }, { 11912, 0x5ff7 }, { 11925, 0x34bb }, { 11934, 0x5ee3 }, { 11944, 0xf70d }, { 11954, 0xeff6 }, { 11967, 0xd7fe }, { 11980, 0x00bf }, { 11987, 0xf59d }, { 11998, 0xf7f7 }, { 12012, 0x51de }, { 12021, 0xffe0 }, /* 0x9400 */ { 12032, 0xfec9 }, { 12043, 0x037f }, { 12052, 0x5f01 }, { 12059, 0xbfef }, { 12073, 0x9ff1 }, { 12084, 0x60a7 }, { 12091, 0xef1d }, { 12102, 0xf1ff }, { 12115, 0x000f }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, /* 0x9500 */ { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x3c80 }, { 12124, 0xfb4d }, { 12135, 0xd91f }, { 12145, 0x7b3a }, { 12155, 0xfee3 }, { 12167, 0x3fe9 }, { 12178, 0xdc7f }, { 12190, 0x003f }, { 12196, 0x0000 }, /* 0x9600 */ { 12196, 0x0000 }, { 12196, 0x5000 }, { 12198, 0xf51f }, { 12209, 0xbe07 }, { 12218, 0xfc1d }, { 12228, 0xf91b }, { 12238, 0xbc1e }, { 12247, 0x71ff }, { 12259, 0x6ff9 }, { 12271, 0x5bbe }, { 12282, 0x5796 }, { 12291, 0x9b1b }, { 12300, 0x7fff }, { 12315, 0xfffc }, { 12329, 0x872e }, { 12337, 0xafe7 }, /* 0x9700 */ { 12349, 0xebf5 }, { 12361, 0xf34f }, { 12372, 0xdffd }, { 12386, 0xe725 }, { 12395, 0x0bdc }, { 12403, 0x5d44 }, { 12410, 0x5747 }, { 12419, 0xfddd }, { 12432, 0xed3f }, { 12444, 0x7790 }, { 12452, 0x7d7f }, { 12465, 0x8ac8 }, { 12471, 0xfafa }, { 12483, 0xf3f9 }, { 12495, 0x202a }, { 12499, 0xef4b }, /* 0x9800 */ { 12510, 0xf5ff }, { 12524, 0x79cf }, { 12535, 0xabd3 }, { 12545, 0x0ba5 }, { 12552, 0xf77a }, { 12564, 0xfb8f }, { 12576, 0x8ebd }, { 12586, 0x001f }, { 12591, 0x0000 }, { 12591, 0x0000 }, { 12591, 0xf300 }, { 12597, 0xfd4e }, { 12608, 0x1a57 }, { 12616, 0x8800 }, { 12618, 0xaeac }, { 12627, 0x7654 }, /* 0x9900 */ { 12635, 0x17ad }, { 12644, 0xcdff }, { 12657, 0xffb2 }, { 12669, 0xf42f }, { 12679, 0x5baa }, { 12688, 0xdbff }, { 12702, 0x0002 }, { 12703, 0x0000 }, { 12703, 0x0000 }, { 12703, 0x73c0 }, { 12710, 0xf9ea }, { 12721, 0x2e3f }, { 12731, 0xfa8e }, { 12741, 0xbbff }, { 12755, 0x76bc }, { 12765, 0xffd3 }, /* 0x9a00 */ { 12778, 0xeefe }, { 12791, 0x7e72 }, { 12801, 0x7ebd }, { 12813, 0xe7f7 }, { 12826, 0xf77f }, { 12840, 0xcefd }, { 12852, 0x0ff5 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0xa900 }, { 12866, 0xdb9b }, { 12877, 0xa4c7 }, { 12885, 0x917f }, { 12895, 0xf8ca }, { 12904, 0x7ece }, /* 0x9b00 */ { 12915, 0x7d7a }, { 12926, 0xc7e7 }, { 12937, 0xcbbd }, { 12948, 0xdcae }, { 12958, 0xfd7e }, { 12971, 0x8f76 }, { 12981, 0x91d3 }, { 12989, 0x7cf3 }, { 13000, 0x01e5 }, { 13006, 0x4c2f }, { 13014, 0xed77 }, { 13026, 0xa360 }, { 13032, 0x07db }, { 13041, 0x5ef8 }, { 13051, 0x1df7 }, { 13062, 0x2181 }, /* 0x9c00 */ { 13066, 0x6be0 }, { 13074, 0x309c }, { 13080, 0x3b3a }, { 13089, 0xfade }, { 13101, 0x7f53 }, { 13112, 0xc3f5 }, { 13122, 0x61cd }, { 13130, 0x07ba }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x26e0 }, { 13144, 0xbefe }, /* 0x9d00 */ { 13157, 0x03f9 }, { 13165, 0xebb5 }, { 13176, 0xe36d }, { 13186, 0xe9cb }, { 13196, 0x9c2f }, { 13205, 0xbfde }, { 13218, 0x9f83 }, { 13227, 0xabbf }, { 13239, 0x1ff7 }, { 13251, 0xffd5 }, { 13264, 0xb7df }, { 13277, 0xdffe }, { 13291, 0xfdae }, { 13303, 0xffef }, { 13318, 0xfb7e }, { 13331, 0xeffd }, /* 0x9e00 */ { 13345, 0xaaff }, { 13357, 0x6ebf }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0xb620 }, { 13375, 0x7fcd }, { 13387, 0xbe9e }, { 13398, 0x62b3 }, { 13406, 0x58f1 }, { 13414, 0xf10d }, { 13422, 0xfd7b }, { 13435, 0xe9f1 }, { 13445, 0xbefd }, /* 0x9f00 */ { 13458, 0xc6c3 }, { 13466, 0x5f6d }, { 13477, 0xff3d }, { 13490, 0x69ff }, { 13502, 0xffcf }, { 13516, 0xfbf4 }, { 13528, 0xdcfb }, { 13540, 0x4ff7 }, { 13552, 0x2000 }, { 13553, 0x1137 }, { 13560, 0x0015 }, }; static const Summary16 big5_uni2indx_pagefa[1] = { /* 0xfa00 */ { 13563, 0x3000 }, }; static const Summary16 big5_uni2indx_pagefe[23] = { /* 0xfe00 */ { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0xfffb }, { 13580, 0xfe1f }, { 13592, 0xfef5 }, { 13605, 0x0e7f }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, /* 0xff00 */ { 13615, 0xff7a }, { 13628, 0xffff }, { 13644, 0xffff }, { 13660, 0x97ff }, { 13673, 0xfffe }, { 13688, 0x3fff }, { 13702, 0x0010 }, }; static int big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0100) summary = &big5_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0200 && wc < 0x0460) summary = &big5_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &big5_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2400 && wc < 0x2650) summary = &big5_uni2indx_page24[(wc>>4)-0x240]; else if (wc >= 0x3000 && wc < 0x33e0) summary = &big5_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &big5_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xfa00 && wc < 0xfa10) summary = &big5_uni2indx_pagefa[(wc>>4)-0xfa0]; else if (wc >= 0xfe00 && wc < 0xff70) summary = &big5_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = big5_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.1.06/src/libtiniconv/encdec/euc_cn.h0000644000175000017500000000373013472116001015714 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-CN */ static int euc_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GB 2312-1980) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return gb2312_mbtowc(conv,pwc,buf,2); } else return RET_ILSEQ; } } return RET_ILSEQ; } static int euc_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GB 2312-1980) */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/koi8_ru.h0000644000175000017500000001623713472116001016046 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-RU */ static const unsigned short koi8_ru_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x045e, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x040e, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_ru_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_ru_2uni[c-0x80]; return 1; } static const unsigned char koi8_ru_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_ru_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_ru_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_ru_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_ru_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0x00, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_ru_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_ru_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_ru_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_ru_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_ru_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_ru_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/cp1251.h0000644000175000017500000001176513472116001015402 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1251 */ static const unsigned short cp1251_2uni[128] = { /* 0x80 */ 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, /* 0x90 */ 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, /* 0xa0 */ 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, /* 0xb0 */ 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, /* 0xc0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xd0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, }; static int cp1251_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1251_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1251_page00[32] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1251_page04[152] = { 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */ 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f, /* 0x08-0x0f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */ 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1251_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1251_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1251_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = cp1251_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1251_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x88; else if (wc == 0x2116) c = 0xb9; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/utf7.h0000644000175000017500000002444613472116001015354 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-7 */ /* Specification: RFC 2152 (and old RFC 1641, RFC 1642) */ /* The original Base64 encoding is defined in RFC 2045. */ /* Set of direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr */ static const unsigned char direct_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0x81, 0xf3, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isdirect(ch) ((ch) < 128 && ((direct_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of direct and optional direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr * ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } */ static const unsigned char xdirect_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x3f, }; #define isxdirect(ch) ((ch) < 128 && ((xdirect_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of base64 characters, extended: * A-Z a-z 0-9 + / - */ static const unsigned char xbase64_tab[128/8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isxbase64(ch) ((ch) < 128 && ((xbase64_tab[(ch)>>3] >> (ch & 7)) & 1)) /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XXXX00 inside base64, 4 bits remain from 2nd byte * 3 XX0000 inside base64, 2 bits remain from 3rd byte */ static int utf7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; /* number of input bytes already read */ if (state & 3) goto active; else goto inactive; inactive: { /* Here (state & 3) == 0 */ if (n < count+1) goto none; { unsigned char c = *s; if (isxdirect(c)) { *pwc = (ucs4_t) c; conv->istate = state; return count+1; } if (c == '+') { if (n < count+2) goto none; if (s[1] == '-') { *pwc = (ucs4_t) '+'; conv->istate = state; return count+2; } s++; count++; state = 1; goto active; } return RET_ILSEQ; } } active: { /* base64 encoding active */ unsigned int wc = 0; conv_state_t base64state = state; unsigned int kmax = 2; /* number of payload bytes to read */ unsigned int k = 0; /* number of payload bytes already read */ unsigned int base64count = 0; /* number of base64 bytes already read */ for (;;) { unsigned char c = *s; unsigned int i; if (c >= 'A' && c <= 'Z') i = c-'A'; else if (c >= 'a' && c <= 'z') i = c-'a'+26; else if (c >= '0' && c <= '9') i = c-'0'+52; else if (c == '+') i = 62; else if (c == '/') i = 63; else { /* c terminates base64 encoding */ if (base64state & -4) return RET_ILSEQ; /* data must be 0, otherwise illegal */ if (base64count) return RET_ILSEQ; /* partial UTF-16 characters are invalid */ if (c == '-') { s++; count++; } state = 0; goto inactive; } s++; base64count++; /* read 6 bits: 0 <= i < 64 */ switch (base64state & 3) { case 1: /* inside base64, no pending bits */ base64state = (i << 2) | 0; break; case 0: /* inside base64, 6 bits remain from 1st byte */ wc = (wc << 8) | (base64state & -4) | (i >> 4); k++; base64state = ((i & 15) << 4) | 2; break; case 2: /* inside base64, 4 bits remain from 2nd byte */ wc = (wc << 8) | (base64state & -4) | (i >> 2); k++; base64state = ((i & 3) << 6) | 3; break; case 3: /* inside base64, 2 bits remain from 3rd byte */ wc = (wc << 8) | (base64state & -4) | i; k++; base64state = 1; break; } if (k == kmax) { /* UTF-16: When we see a High Surrogate, we must also decode the following Low Surrogate. */ if (kmax == 2 && (wc >= 0xd800 && wc < 0xdc00)) kmax = 4; else break; } if (n < count+(int)base64count+1) { if (*(s-base64count-count) == '+') { /* Begin of base64 sequence. * Not changing state and not reporting RET_TOOFEW(>0). * Next time will do the things again. */ return RET_TOOSMALL; } goto none; } } /* Here k = kmax > 0, hence base64count > 0. */ if ((base64state & 3) == 0) abort(); if (kmax == 4) { ucs4_t wc1 = wc >> 16; ucs4_t wc2 = wc & 0xffff; if (!(wc1 >= 0xd800 && wc1 < 0xdc00)) abort(); if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) return RET_ILSEQ; *pwc = 0x10000 + ((wc1 - 0xd800) << 10) + (wc2 - 0xdc00); } else { *pwc = wc; } conv->istate = base64state; return count+base64count; } none: conv->istate = state; return RET_TOOFEW(count); } /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XX00 inside base64, 2 bits known for 2nd byte * 3 XXXX inside base64, 4 bits known for 3rd byte */ /* Define this to 1 if you want the so-called "optional direct" characters ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } to be encoded. Define to 0 if you want them to be passed straight through, like the so-called "direct" characters. We set this to 1 because it's safer. */ #define UTF7_ENCODE_OPTIONAL_CHARS 1 static int utf7_wctomb (conv_t conv, unsigned char *r, ucs4_t iwc, int n) { conv_state_t state = conv->ostate; unsigned int wc = iwc; int count = 0; if (state & 3) goto active; /*inactive:*/ { if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { r[0] = (unsigned char) wc; /*conv->ostate = state;*/ return 1; } else { *r++ = '+'; if (wc == '+') { if (n < 2) return RET_TOOSMALL; *r = '-'; /*conv->ostate = state;*/ return 2; } count = 1; state = 1; goto active; } } active: { /* base64 encoding active */ if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { /* deactivate base64 encoding */ count += ((state & 3) >= 2 ? 1 : 0) + (isxbase64(wc) ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c = 0; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } if (isxbase64(wc)) *r++ = '-'; state = 0; *r++ = (unsigned char) wc; conv->ostate = state; return count; } else { unsigned int k; /* number of payload bytes to write */ if (wc < 0x10000) { k = 2; count += ((state & 3) >= 2 ? 3 : 2); } else if (wc < 0x110000) { unsigned int wc1 = 0xd800 + ((wc - 0x10000) >> 10); unsigned int wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); wc = (wc1 << 16) | wc2; k = 4; count += ((state & 3) >= 3 ? 6 : 5); } else return RET_ILUNI; if (n < count) return RET_TOOSMALL; for (;;) { unsigned int i; unsigned char c = 0; switch (state & 3) { case 0: /* inside base64, 6 bits known for 4th byte */ c = (state & -4) >> 2; state = 1; break; case 1: /* inside base64, no pending bits */ i = (wc >> (8 * --k)) & 0xff; c = i >> 2; state = ((i & 3) << 4) | 2; break; case 2: /* inside base64, 2 bits known for 2nd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 4); state = ((i & 15) << 2) | 3; break; case 3: /* inside base64, 4 bits known for 3rd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 6); state = ((i & 63) << 2) | 0; break; default: abort(); /* stupid gcc */ } if (c < 26) c = c+'A'; else if (c < 52) c = c-26+'a'; else if (c < 62) c = c-52+'0'; else if (c == 62) c = '+'; else if (c == 63) c = '/'; else abort(); *r++ = c; if ((state & 3) && (k == 0)) break; } conv->ostate = state; return count; } } } static int utf7_reset (conv_t conv, unsigned char *r, int n) { conv_state_t state = conv->ostate; if (state & 3) { /* deactivate base64 encoding */ int count = ((state & 3) >= 2 ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c = 0; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } *r++ = '-'; /* conv->ostate = 0; will be done by the caller */ return count; } else return 0; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_5.h0000644000175000017500000000672513472116001016043 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-5 */ static const unsigned short iso8859_5_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, /* 0xb0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xc0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xd0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, }; static int iso8859_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_5_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_5_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_5_page04[96] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */ }; static int iso8859_5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_5_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = iso8859_5_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xf0; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/cp936.h0000644000175000017500000000702213472116001015322 00000000000000/* * Copyright (C) 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 */ /* * The IANA has CP936 as an alias of GBK. But GBK is an official Chinese * specification, whereas CP936 is de-facto maintained by Microsoft. And, * of course, Microsoft modified CP936 since 1999. * * The differences from GBK are: * * 1. A single character: * * code CP936.TXT * 0x80 0x20AC # EURO SIGN * * Some variants of CP936 (in JDK, Windows-2000, ICU) also add: * * 2. Private area mappings: * * code Unicode * 0x{A1..A2}{40..7E,80..A0} U+E4C6..U+E585 * 0x{AA..AF,F8..FE}{A1..FE} U+E000..U+E4C5 * * We add them too because, although there are backward compatibility problems * when a character from a private area is moved to an official Unicode code * point, they are useful for some people in practice. */ static int cp936_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { /* Try GBK first. */ { int ret = ces_gbk_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } /* Then handle the additional mappings. */ { unsigned char c = *s; if (c == 0x80) { *pwc = 0x20ac; return 1; } /* User-defined characters */ if (c >= 0xa1 && c <= 0xa2) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { *pwc = 0xe4c6 + 96 * (c - 0xa1) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); return 2; } } } else if ((c >= 0xaa && c < 0xb0) || (c >= 0xf8 && c < 0xff)) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { *pwc = 0xe000 + 94 * (c - (c >= 0xf8 ? 0xf2 : 0xaa)) + (c2 - 0xa1); return 2; } } } } return RET_ILSEQ; } static int cp936_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { /* Try GBK first. */ { int ret = ces_gbk_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; } /* Then handle the additional mappings. */ if (wc >= 0xe000 && wc < 0xe586) { /* User-defined characters */ if (n < 2) return RET_TOOFEW(0); if (wc < 0xe4c6) { unsigned int i = wc - 0xe000; unsigned int c1 = i / 94; unsigned int c2 = i % 94; r[0] = c1 + (c1 < 6 ? 0xaa : 0xf2); r[1] = c2 + 0xa1; return 2; } else { unsigned int i = wc - 0xe4c6; unsigned int c1 = i / 96; unsigned int c2 = i % 96; r[0] = c1 + 0xa1; r[1] = c2 + (c2 < 0x3f ? 0x40 : 0x41); return 2; } } else if (wc == 0x20ac) { r[0] = 0x80; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_6.h0000644000175000017500000000663013472116001016037 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-6 */ static const unsigned short iso8859_6_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0xfffd, 0xfffd, 0x00a4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0x00ad, 0xfffd, 0xfffd, /* 0xb0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f, /* 0xc0 */ 0xfffd, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0xf0 */ 0x0650, 0x0651, 0x0652, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, }; static int iso8859_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_6_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_6_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_6_page06[80] = { 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static int iso8859_6_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_6_page00[wc-0x00a0]; else if (wc >= 0x0608 && wc < 0x0658) c = iso8859_6_page06[wc-0x0608]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/encdec/gb2312.h0000644000175000017500000046505513472116001015374 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB2312.1980-0 */ static const unsigned short gb2312_2uni_page21[831] = { /* 0x21 */ 0x3000, 0x3001, 0x3002, 0x30fb, 0x02c9, 0x02c7, 0x00a8, 0x3003, 0x3005, 0x2015, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c, 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a, 0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d, 0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4, 0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, /* 0x22 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0xfffd, 0xfffd, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, 0xfffd, 0xfffd, /* 0x23 */ 0xff01, 0xff02, 0xff03, 0xffe5, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, /* 0x24 */ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0113, 0x00e9, 0x011b, 0x00e8, 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x00fc, 0x00ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x29 */ 0xfffd, 0xfffd, 0xfffd, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250a, 0x250b, 0x250c, 0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c, 0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, }; static const unsigned short gb2312_2uni_page30[6768] = { /* 0x30 */ 0x554a, 0x963f, 0x57c3, 0x6328, 0x54ce, 0x5509, 0x54c0, 0x7691, 0x764c, 0x853c, 0x77ee, 0x827e, 0x788d, 0x7231, 0x9698, 0x978d, 0x6c28, 0x5b89, 0x4ffa, 0x6309, 0x6697, 0x5cb8, 0x80fa, 0x6848, 0x80ae, 0x6602, 0x76ce, 0x51f9, 0x6556, 0x71ac, 0x7ff1, 0x8884, 0x50b2, 0x5965, 0x61ca, 0x6fb3, 0x82ad, 0x634c, 0x6252, 0x53ed, 0x5427, 0x7b06, 0x516b, 0x75a4, 0x5df4, 0x62d4, 0x8dcb, 0x9776, 0x628a, 0x8019, 0x575d, 0x9738, 0x7f62, 0x7238, 0x767d, 0x67cf, 0x767e, 0x6446, 0x4f70, 0x8d25, 0x62dc, 0x7a17, 0x6591, 0x73ed, 0x642c, 0x6273, 0x822c, 0x9881, 0x677f, 0x7248, 0x626e, 0x62cc, 0x4f34, 0x74e3, 0x534a, 0x529e, 0x7eca, 0x90a6, 0x5e2e, 0x6886, 0x699c, 0x8180, 0x7ed1, 0x68d2, 0x78c5, 0x868c, 0x9551, 0x508d, 0x8c24, 0x82de, 0x80de, 0x5305, 0x8912, 0x5265, /* 0x31 */ 0x8584, 0x96f9, 0x4fdd, 0x5821, 0x9971, 0x5b9d, 0x62b1, 0x62a5, 0x66b4, 0x8c79, 0x9c8d, 0x7206, 0x676f, 0x7891, 0x60b2, 0x5351, 0x5317, 0x8f88, 0x80cc, 0x8d1d, 0x94a1, 0x500d, 0x72c8, 0x5907, 0x60eb, 0x7119, 0x88ab, 0x5954, 0x82ef, 0x672c, 0x7b28, 0x5d29, 0x7ef7, 0x752d, 0x6cf5, 0x8e66, 0x8ff8, 0x903c, 0x9f3b, 0x6bd4, 0x9119, 0x7b14, 0x5f7c, 0x78a7, 0x84d6, 0x853d, 0x6bd5, 0x6bd9, 0x6bd6, 0x5e01, 0x5e87, 0x75f9, 0x95ed, 0x655d, 0x5f0a, 0x5fc5, 0x8f9f, 0x58c1, 0x81c2, 0x907f, 0x965b, 0x97ad, 0x8fb9, 0x7f16, 0x8d2c, 0x6241, 0x4fbf, 0x53d8, 0x535e, 0x8fa8, 0x8fa9, 0x8fab, 0x904d, 0x6807, 0x5f6a, 0x8198, 0x8868, 0x9cd6, 0x618b, 0x522b, 0x762a, 0x5f6c, 0x658c, 0x6fd2, 0x6ee8, 0x5bbe, 0x6448, 0x5175, 0x51b0, 0x67c4, 0x4e19, 0x79c9, 0x997c, 0x70b3, /* 0x32 */ 0x75c5, 0x5e76, 0x73bb, 0x83e0, 0x64ad, 0x62e8, 0x94b5, 0x6ce2, 0x535a, 0x52c3, 0x640f, 0x94c2, 0x7b94, 0x4f2f, 0x5e1b, 0x8236, 0x8116, 0x818a, 0x6e24, 0x6cca, 0x9a73, 0x6355, 0x535c, 0x54fa, 0x8865, 0x57e0, 0x4e0d, 0x5e03, 0x6b65, 0x7c3f, 0x90e8, 0x6016, 0x64e6, 0x731c, 0x88c1, 0x6750, 0x624d, 0x8d22, 0x776c, 0x8e29, 0x91c7, 0x5f69, 0x83dc, 0x8521, 0x9910, 0x53c2, 0x8695, 0x6b8b, 0x60ed, 0x60e8, 0x707f, 0x82cd, 0x8231, 0x4ed3, 0x6ca7, 0x85cf, 0x64cd, 0x7cd9, 0x69fd, 0x66f9, 0x8349, 0x5395, 0x7b56, 0x4fa7, 0x518c, 0x6d4b, 0x5c42, 0x8e6d, 0x63d2, 0x53c9, 0x832c, 0x8336, 0x67e5, 0x78b4, 0x643d, 0x5bdf, 0x5c94, 0x5dee, 0x8be7, 0x62c6, 0x67f4, 0x8c7a, 0x6400, 0x63ba, 0x8749, 0x998b, 0x8c17, 0x7f20, 0x94f2, 0x4ea7, 0x9610, 0x98a4, 0x660c, 0x7316, /* 0x33 */ 0x573a, 0x5c1d, 0x5e38, 0x957f, 0x507f, 0x80a0, 0x5382, 0x655e, 0x7545, 0x5531, 0x5021, 0x8d85, 0x6284, 0x949e, 0x671d, 0x5632, 0x6f6e, 0x5de2, 0x5435, 0x7092, 0x8f66, 0x626f, 0x64a4, 0x63a3, 0x5f7b, 0x6f88, 0x90f4, 0x81e3, 0x8fb0, 0x5c18, 0x6668, 0x5ff1, 0x6c89, 0x9648, 0x8d81, 0x886c, 0x6491, 0x79f0, 0x57ce, 0x6a59, 0x6210, 0x5448, 0x4e58, 0x7a0b, 0x60e9, 0x6f84, 0x8bda, 0x627f, 0x901e, 0x9a8b, 0x79e4, 0x5403, 0x75f4, 0x6301, 0x5319, 0x6c60, 0x8fdf, 0x5f1b, 0x9a70, 0x803b, 0x9f7f, 0x4f88, 0x5c3a, 0x8d64, 0x7fc5, 0x65a5, 0x70bd, 0x5145, 0x51b2, 0x866b, 0x5d07, 0x5ba0, 0x62bd, 0x916c, 0x7574, 0x8e0c, 0x7a20, 0x6101, 0x7b79, 0x4ec7, 0x7ef8, 0x7785, 0x4e11, 0x81ed, 0x521d, 0x51fa, 0x6a71, 0x53a8, 0x8e87, 0x9504, 0x96cf, 0x6ec1, 0x9664, 0x695a, /* 0x34 */ 0x7840, 0x50a8, 0x77d7, 0x6410, 0x89e6, 0x5904, 0x63e3, 0x5ddd, 0x7a7f, 0x693d, 0x4f20, 0x8239, 0x5598, 0x4e32, 0x75ae, 0x7a97, 0x5e62, 0x5e8a, 0x95ef, 0x521b, 0x5439, 0x708a, 0x6376, 0x9524, 0x5782, 0x6625, 0x693f, 0x9187, 0x5507, 0x6df3, 0x7eaf, 0x8822, 0x6233, 0x7ef0, 0x75b5, 0x8328, 0x78c1, 0x96cc, 0x8f9e, 0x6148, 0x74f7, 0x8bcd, 0x6b64, 0x523a, 0x8d50, 0x6b21, 0x806a, 0x8471, 0x56f1, 0x5306, 0x4ece, 0x4e1b, 0x51d1, 0x7c97, 0x918b, 0x7c07, 0x4fc3, 0x8e7f, 0x7be1, 0x7a9c, 0x6467, 0x5d14, 0x50ac, 0x8106, 0x7601, 0x7cb9, 0x6dec, 0x7fe0, 0x6751, 0x5b58, 0x5bf8, 0x78cb, 0x64ae, 0x6413, 0x63aa, 0x632b, 0x9519, 0x642d, 0x8fbe, 0x7b54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6b79, 0x50a3, 0x6234, 0x5e26, 0x6b86, 0x4ee3, 0x8d37, 0x888b, 0x5f85, 0x902e, /* 0x35 */ 0x6020, 0x803d, 0x62c5, 0x4e39, 0x5355, 0x90f8, 0x63b8, 0x80c6, 0x65e6, 0x6c2e, 0x4f46, 0x60ee, 0x6de1, 0x8bde, 0x5f39, 0x86cb, 0x5f53, 0x6321, 0x515a, 0x8361, 0x6863, 0x5200, 0x6363, 0x8e48, 0x5012, 0x5c9b, 0x7977, 0x5bfc, 0x5230, 0x7a3b, 0x60bc, 0x9053, 0x76d7, 0x5fb7, 0x5f97, 0x7684, 0x8e6c, 0x706f, 0x767b, 0x7b49, 0x77aa, 0x51f3, 0x9093, 0x5824, 0x4f4e, 0x6ef4, 0x8fea, 0x654c, 0x7b1b, 0x72c4, 0x6da4, 0x7fdf, 0x5ae1, 0x62b5, 0x5e95, 0x5730, 0x8482, 0x7b2c, 0x5e1d, 0x5f1f, 0x9012, 0x7f14, 0x98a0, 0x6382, 0x6ec7, 0x7898, 0x70b9, 0x5178, 0x975b, 0x57ab, 0x7535, 0x4f43, 0x7538, 0x5e97, 0x60e6, 0x5960, 0x6dc0, 0x6bbf, 0x7889, 0x53fc, 0x96d5, 0x51cb, 0x5201, 0x6389, 0x540a, 0x9493, 0x8c03, 0x8dcc, 0x7239, 0x789f, 0x8776, 0x8fed, 0x8c0d, 0x53e0, /* 0x36 */ 0x4e01, 0x76ef, 0x53ee, 0x9489, 0x9876, 0x9f0e, 0x952d, 0x5b9a, 0x8ba2, 0x4e22, 0x4e1c, 0x51ac, 0x8463, 0x61c2, 0x52a8, 0x680b, 0x4f97, 0x606b, 0x51bb, 0x6d1e, 0x515c, 0x6296, 0x6597, 0x9661, 0x8c46, 0x9017, 0x75d8, 0x90fd, 0x7763, 0x6bd2, 0x728a, 0x72ec, 0x8bfb, 0x5835, 0x7779, 0x8d4c, 0x675c, 0x9540, 0x809a, 0x5ea6, 0x6e21, 0x5992, 0x7aef, 0x77ed, 0x953b, 0x6bb5, 0x65ad, 0x7f0e, 0x5806, 0x5151, 0x961f, 0x5bf9, 0x58a9, 0x5428, 0x8e72, 0x6566, 0x987f, 0x56e4, 0x949d, 0x76fe, 0x9041, 0x6387, 0x54c6, 0x591a, 0x593a, 0x579b, 0x8eb2, 0x6735, 0x8dfa, 0x8235, 0x5241, 0x60f0, 0x5815, 0x86fe, 0x5ce8, 0x9e45, 0x4fc4, 0x989d, 0x8bb9, 0x5a25, 0x6076, 0x5384, 0x627c, 0x904f, 0x9102, 0x997f, 0x6069, 0x800c, 0x513f, 0x8033, 0x5c14, 0x9975, 0x6d31, 0x4e8c, /* 0x37 */ 0x8d30, 0x53d1, 0x7f5a, 0x7b4f, 0x4f10, 0x4e4f, 0x9600, 0x6cd5, 0x73d0, 0x85e9, 0x5e06, 0x756a, 0x7ffb, 0x6a0a, 0x77fe, 0x9492, 0x7e41, 0x51e1, 0x70e6, 0x53cd, 0x8fd4, 0x8303, 0x8d29, 0x72af, 0x996d, 0x6cdb, 0x574a, 0x82b3, 0x65b9, 0x80aa, 0x623f, 0x9632, 0x59a8, 0x4eff, 0x8bbf, 0x7eba, 0x653e, 0x83f2, 0x975e, 0x5561, 0x98de, 0x80a5, 0x532a, 0x8bfd, 0x5420, 0x80ba, 0x5e9f, 0x6cb8, 0x8d39, 0x82ac, 0x915a, 0x5429, 0x6c1b, 0x5206, 0x7eb7, 0x575f, 0x711a, 0x6c7e, 0x7c89, 0x594b, 0x4efd, 0x5fff, 0x6124, 0x7caa, 0x4e30, 0x5c01, 0x67ab, 0x8702, 0x5cf0, 0x950b, 0x98ce, 0x75af, 0x70fd, 0x9022, 0x51af, 0x7f1d, 0x8bbd, 0x5949, 0x51e4, 0x4f5b, 0x5426, 0x592b, 0x6577, 0x80a4, 0x5b75, 0x6276, 0x62c2, 0x8f90, 0x5e45, 0x6c1f, 0x7b26, 0x4f0f, 0x4fd8, 0x670d, /* 0x38 */ 0x6d6e, 0x6daa, 0x798f, 0x88b1, 0x5f17, 0x752b, 0x629a, 0x8f85, 0x4fef, 0x91dc, 0x65a7, 0x812f, 0x8151, 0x5e9c, 0x8150, 0x8d74, 0x526f, 0x8986, 0x8d4b, 0x590d, 0x5085, 0x4ed8, 0x961c, 0x7236, 0x8179, 0x8d1f, 0x5bcc, 0x8ba3, 0x9644, 0x5987, 0x7f1a, 0x5490, 0x5676, 0x560e, 0x8be5, 0x6539, 0x6982, 0x9499, 0x76d6, 0x6e89, 0x5e72, 0x7518, 0x6746, 0x67d1, 0x7aff, 0x809d, 0x8d76, 0x611f, 0x79c6, 0x6562, 0x8d63, 0x5188, 0x521a, 0x94a2, 0x7f38, 0x809b, 0x7eb2, 0x5c97, 0x6e2f, 0x6760, 0x7bd9, 0x768b, 0x9ad8, 0x818f, 0x7f94, 0x7cd5, 0x641e, 0x9550, 0x7a3f, 0x544a, 0x54e5, 0x6b4c, 0x6401, 0x6208, 0x9e3d, 0x80f3, 0x7599, 0x5272, 0x9769, 0x845b, 0x683c, 0x86e4, 0x9601, 0x9694, 0x94ec, 0x4e2a, 0x5404, 0x7ed9, 0x6839, 0x8ddf, 0x8015, 0x66f4, 0x5e9a, 0x7fb9, /* 0x39 */ 0x57c2, 0x803f, 0x6897, 0x5de5, 0x653b, 0x529f, 0x606d, 0x9f9a, 0x4f9b, 0x8eac, 0x516c, 0x5bab, 0x5f13, 0x5de9, 0x6c5e, 0x62f1, 0x8d21, 0x5171, 0x94a9, 0x52fe, 0x6c9f, 0x82df, 0x72d7, 0x57a2, 0x6784, 0x8d2d, 0x591f, 0x8f9c, 0x83c7, 0x5495, 0x7b8d, 0x4f30, 0x6cbd, 0x5b64, 0x59d1, 0x9f13, 0x53e4, 0x86ca, 0x9aa8, 0x8c37, 0x80a1, 0x6545, 0x987e, 0x56fa, 0x96c7, 0x522e, 0x74dc, 0x5250, 0x5be1, 0x6302, 0x8902, 0x4e56, 0x62d0, 0x602a, 0x68fa, 0x5173, 0x5b98, 0x51a0, 0x89c2, 0x7ba1, 0x9986, 0x7f50, 0x60ef, 0x704c, 0x8d2f, 0x5149, 0x5e7f, 0x901b, 0x7470, 0x89c4, 0x572d, 0x7845, 0x5f52, 0x9f9f, 0x95fa, 0x8f68, 0x9b3c, 0x8be1, 0x7678, 0x6842, 0x67dc, 0x8dea, 0x8d35, 0x523d, 0x8f8a, 0x6eda, 0x68cd, 0x9505, 0x90ed, 0x56fd, 0x679c, 0x88f9, 0x8fc7, 0x54c8, /* 0x3a */ 0x9ab8, 0x5b69, 0x6d77, 0x6c26, 0x4ea5, 0x5bb3, 0x9a87, 0x9163, 0x61a8, 0x90af, 0x97e9, 0x542b, 0x6db5, 0x5bd2, 0x51fd, 0x558a, 0x7f55, 0x7ff0, 0x64bc, 0x634d, 0x65f1, 0x61be, 0x608d, 0x710a, 0x6c57, 0x6c49, 0x592f, 0x676d, 0x822a, 0x58d5, 0x568e, 0x8c6a, 0x6beb, 0x90dd, 0x597d, 0x8017, 0x53f7, 0x6d69, 0x5475, 0x559d, 0x8377, 0x83cf, 0x6838, 0x79be, 0x548c, 0x4f55, 0x5408, 0x76d2, 0x8c89, 0x9602, 0x6cb3, 0x6db8, 0x8d6b, 0x8910, 0x9e64, 0x8d3a, 0x563f, 0x9ed1, 0x75d5, 0x5f88, 0x72e0, 0x6068, 0x54fc, 0x4ea8, 0x6a2a, 0x8861, 0x6052, 0x8f70, 0x54c4, 0x70d8, 0x8679, 0x9e3f, 0x6d2a, 0x5b8f, 0x5f18, 0x7ea2, 0x5589, 0x4faf, 0x7334, 0x543c, 0x539a, 0x5019, 0x540e, 0x547c, 0x4e4e, 0x5ffd, 0x745a, 0x58f6, 0x846b, 0x80e1, 0x8774, 0x72d0, 0x7cca, 0x6e56, /* 0x3b */ 0x5f27, 0x864e, 0x552c, 0x62a4, 0x4e92, 0x6caa, 0x6237, 0x82b1, 0x54d7, 0x534e, 0x733e, 0x6ed1, 0x753b, 0x5212, 0x5316, 0x8bdd, 0x69d0, 0x5f8a, 0x6000, 0x6dee, 0x574f, 0x6b22, 0x73af, 0x6853, 0x8fd8, 0x7f13, 0x6362, 0x60a3, 0x5524, 0x75ea, 0x8c62, 0x7115, 0x6da3, 0x5ba6, 0x5e7b, 0x8352, 0x614c, 0x9ec4, 0x78fa, 0x8757, 0x7c27, 0x7687, 0x51f0, 0x60f6, 0x714c, 0x6643, 0x5e4c, 0x604d, 0x8c0e, 0x7070, 0x6325, 0x8f89, 0x5fbd, 0x6062, 0x86d4, 0x56de, 0x6bc1, 0x6094, 0x6167, 0x5349, 0x60e0, 0x6666, 0x8d3f, 0x79fd, 0x4f1a, 0x70e9, 0x6c47, 0x8bb3, 0x8bf2, 0x7ed8, 0x8364, 0x660f, 0x5a5a, 0x9b42, 0x6d51, 0x6df7, 0x8c41, 0x6d3b, 0x4f19, 0x706b, 0x83b7, 0x6216, 0x60d1, 0x970d, 0x8d27, 0x7978, 0x51fb, 0x573e, 0x57fa, 0x673a, 0x7578, 0x7a3d, 0x79ef, 0x7b95, /* 0x3c */ 0x808c, 0x9965, 0x8ff9, 0x6fc0, 0x8ba5, 0x9e21, 0x59ec, 0x7ee9, 0x7f09, 0x5409, 0x6781, 0x68d8, 0x8f91, 0x7c4d, 0x96c6, 0x53ca, 0x6025, 0x75be, 0x6c72, 0x5373, 0x5ac9, 0x7ea7, 0x6324, 0x51e0, 0x810a, 0x5df1, 0x84df, 0x6280, 0x5180, 0x5b63, 0x4f0e, 0x796d, 0x5242, 0x60b8, 0x6d4e, 0x5bc4, 0x5bc2, 0x8ba1, 0x8bb0, 0x65e2, 0x5fcc, 0x9645, 0x5993, 0x7ee7, 0x7eaa, 0x5609, 0x67b7, 0x5939, 0x4f73, 0x5bb6, 0x52a0, 0x835a, 0x988a, 0x8d3e, 0x7532, 0x94be, 0x5047, 0x7a3c, 0x4ef7, 0x67b6, 0x9a7e, 0x5ac1, 0x6b7c, 0x76d1, 0x575a, 0x5c16, 0x7b3a, 0x95f4, 0x714e, 0x517c, 0x80a9, 0x8270, 0x5978, 0x7f04, 0x8327, 0x68c0, 0x67ec, 0x78b1, 0x7877, 0x62e3, 0x6361, 0x7b80, 0x4fed, 0x526a, 0x51cf, 0x8350, 0x69db, 0x9274, 0x8df5, 0x8d31, 0x89c1, 0x952e, 0x7bad, 0x4ef6, /* 0x3d */ 0x5065, 0x8230, 0x5251, 0x996f, 0x6e10, 0x6e85, 0x6da7, 0x5efa, 0x50f5, 0x59dc, 0x5c06, 0x6d46, 0x6c5f, 0x7586, 0x848b, 0x6868, 0x5956, 0x8bb2, 0x5320, 0x9171, 0x964d, 0x8549, 0x6912, 0x7901, 0x7126, 0x80f6, 0x4ea4, 0x90ca, 0x6d47, 0x9a84, 0x5a07, 0x56bc, 0x6405, 0x94f0, 0x77eb, 0x4fa5, 0x811a, 0x72e1, 0x89d2, 0x997a, 0x7f34, 0x7ede, 0x527f, 0x6559, 0x9175, 0x8f7f, 0x8f83, 0x53eb, 0x7a96, 0x63ed, 0x63a5, 0x7686, 0x79f8, 0x8857, 0x9636, 0x622a, 0x52ab, 0x8282, 0x6854, 0x6770, 0x6377, 0x776b, 0x7aed, 0x6d01, 0x7ed3, 0x89e3, 0x59d0, 0x6212, 0x85c9, 0x82a5, 0x754c, 0x501f, 0x4ecb, 0x75a5, 0x8beb, 0x5c4a, 0x5dfe, 0x7b4b, 0x65a4, 0x91d1, 0x4eca, 0x6d25, 0x895f, 0x7d27, 0x9526, 0x4ec5, 0x8c28, 0x8fdb, 0x9773, 0x664b, 0x7981, 0x8fd1, 0x70ec, 0x6d78, /* 0x3e */ 0x5c3d, 0x52b2, 0x8346, 0x5162, 0x830e, 0x775b, 0x6676, 0x9cb8, 0x4eac, 0x60ca, 0x7cbe, 0x7cb3, 0x7ecf, 0x4e95, 0x8b66, 0x666f, 0x9888, 0x9759, 0x5883, 0x656c, 0x955c, 0x5f84, 0x75c9, 0x9756, 0x7adf, 0x7ade, 0x51c0, 0x70af, 0x7a98, 0x63ea, 0x7a76, 0x7ea0, 0x7396, 0x97ed, 0x4e45, 0x7078, 0x4e5d, 0x9152, 0x53a9, 0x6551, 0x65e7, 0x81fc, 0x8205, 0x548e, 0x5c31, 0x759a, 0x97a0, 0x62d8, 0x72d9, 0x75bd, 0x5c45, 0x9a79, 0x83ca, 0x5c40, 0x5480, 0x77e9, 0x4e3e, 0x6cae, 0x805a, 0x62d2, 0x636e, 0x5de8, 0x5177, 0x8ddd, 0x8e1e, 0x952f, 0x4ff1, 0x53e5, 0x60e7, 0x70ac, 0x5267, 0x6350, 0x9e43, 0x5a1f, 0x5026, 0x7737, 0x5377, 0x7ee2, 0x6485, 0x652b, 0x6289, 0x6398, 0x5014, 0x7235, 0x89c9, 0x51b3, 0x8bc0, 0x7edd, 0x5747, 0x83cc, 0x94a7, 0x519b, 0x541b, 0x5cfb, /* 0x3f */ 0x4fca, 0x7ae3, 0x6d5a, 0x90e1, 0x9a8f, 0x5580, 0x5496, 0x5361, 0x54af, 0x5f00, 0x63e9, 0x6977, 0x51ef, 0x6168, 0x520a, 0x582a, 0x52d8, 0x574e, 0x780d, 0x770b, 0x5eb7, 0x6177, 0x7ce0, 0x625b, 0x6297, 0x4ea2, 0x7095, 0x8003, 0x62f7, 0x70e4, 0x9760, 0x5777, 0x82db, 0x67ef, 0x68f5, 0x78d5, 0x9897, 0x79d1, 0x58f3, 0x54b3, 0x53ef, 0x6e34, 0x514b, 0x523b, 0x5ba2, 0x8bfe, 0x80af, 0x5543, 0x57a6, 0x6073, 0x5751, 0x542d, 0x7a7a, 0x6050, 0x5b54, 0x63a7, 0x62a0, 0x53e3, 0x6263, 0x5bc7, 0x67af, 0x54ed, 0x7a9f, 0x82e6, 0x9177, 0x5e93, 0x88e4, 0x5938, 0x57ae, 0x630e, 0x8de8, 0x80ef, 0x5757, 0x7b77, 0x4fa9, 0x5feb, 0x5bbd, 0x6b3e, 0x5321, 0x7b50, 0x72c2, 0x6846, 0x77ff, 0x7736, 0x65f7, 0x51b5, 0x4e8f, 0x76d4, 0x5cbf, 0x7aa5, 0x8475, 0x594e, 0x9b41, 0x5080, /* 0x40 */ 0x9988, 0x6127, 0x6e83, 0x5764, 0x6606, 0x6346, 0x56f0, 0x62ec, 0x6269, 0x5ed3, 0x9614, 0x5783, 0x62c9, 0x5587, 0x8721, 0x814a, 0x8fa3, 0x5566, 0x83b1, 0x6765, 0x8d56, 0x84dd, 0x5a6a, 0x680f, 0x62e6, 0x7bee, 0x9611, 0x5170, 0x6f9c, 0x8c30, 0x63fd, 0x89c8, 0x61d2, 0x7f06, 0x70c2, 0x6ee5, 0x7405, 0x6994, 0x72fc, 0x5eca, 0x90ce, 0x6717, 0x6d6a, 0x635e, 0x52b3, 0x7262, 0x8001, 0x4f6c, 0x59e5, 0x916a, 0x70d9, 0x6d9d, 0x52d2, 0x4e50, 0x96f7, 0x956d, 0x857e, 0x78ca, 0x7d2f, 0x5121, 0x5792, 0x64c2, 0x808b, 0x7c7b, 0x6cea, 0x68f1, 0x695e, 0x51b7, 0x5398, 0x68a8, 0x7281, 0x9ece, 0x7bf1, 0x72f8, 0x79bb, 0x6f13, 0x7406, 0x674e, 0x91cc, 0x9ca4, 0x793c, 0x8389, 0x8354, 0x540f, 0x6817, 0x4e3d, 0x5389, 0x52b1, 0x783e, 0x5386, 0x5229, 0x5088, 0x4f8b, 0x4fd0, /* 0x41 */ 0x75e2, 0x7acb, 0x7c92, 0x6ca5, 0x96b6, 0x529b, 0x7483, 0x54e9, 0x4fe9, 0x8054, 0x83b2, 0x8fde, 0x9570, 0x5ec9, 0x601c, 0x6d9f, 0x5e18, 0x655b, 0x8138, 0x94fe, 0x604b, 0x70bc, 0x7ec3, 0x7cae, 0x51c9, 0x6881, 0x7cb1, 0x826f, 0x4e24, 0x8f86, 0x91cf, 0x667e, 0x4eae, 0x8c05, 0x64a9, 0x804a, 0x50da, 0x7597, 0x71ce, 0x5be5, 0x8fbd, 0x6f66, 0x4e86, 0x6482, 0x9563, 0x5ed6, 0x6599, 0x5217, 0x88c2, 0x70c8, 0x52a3, 0x730e, 0x7433, 0x6797, 0x78f7, 0x9716, 0x4e34, 0x90bb, 0x9cde, 0x6dcb, 0x51db, 0x8d41, 0x541d, 0x62ce, 0x73b2, 0x83f1, 0x96f6, 0x9f84, 0x94c3, 0x4f36, 0x7f9a, 0x51cc, 0x7075, 0x9675, 0x5cad, 0x9886, 0x53e6, 0x4ee4, 0x6e9c, 0x7409, 0x69b4, 0x786b, 0x998f, 0x7559, 0x5218, 0x7624, 0x6d41, 0x67f3, 0x516d, 0x9f99, 0x804b, 0x5499, 0x7b3c, 0x7abf, /* 0x42 */ 0x9686, 0x5784, 0x62e2, 0x9647, 0x697c, 0x5a04, 0x6402, 0x7bd3, 0x6f0f, 0x964b, 0x82a6, 0x5362, 0x9885, 0x5e90, 0x7089, 0x63b3, 0x5364, 0x864f, 0x9c81, 0x9e93, 0x788c, 0x9732, 0x8def, 0x8d42, 0x9e7f, 0x6f5e, 0x7984, 0x5f55, 0x9646, 0x622e, 0x9a74, 0x5415, 0x94dd, 0x4fa3, 0x65c5, 0x5c65, 0x5c61, 0x7f15, 0x8651, 0x6c2f, 0x5f8b, 0x7387, 0x6ee4, 0x7eff, 0x5ce6, 0x631b, 0x5b6a, 0x6ee6, 0x5375, 0x4e71, 0x63a0, 0x7565, 0x62a1, 0x8f6e, 0x4f26, 0x4ed1, 0x6ca6, 0x7eb6, 0x8bba, 0x841d, 0x87ba, 0x7f57, 0x903b, 0x9523, 0x7ba9, 0x9aa1, 0x88f8, 0x843d, 0x6d1b, 0x9a86, 0x7edc, 0x5988, 0x9ebb, 0x739b, 0x7801, 0x8682, 0x9a6c, 0x9a82, 0x561b, 0x5417, 0x57cb, 0x4e70, 0x9ea6, 0x5356, 0x8fc8, 0x8109, 0x7792, 0x9992, 0x86ee, 0x6ee1, 0x8513, 0x66fc, 0x6162, 0x6f2b, /* 0x43 */ 0x8c29, 0x8292, 0x832b, 0x76f2, 0x6c13, 0x5fd9, 0x83bd, 0x732b, 0x8305, 0x951a, 0x6bdb, 0x77db, 0x94c6, 0x536f, 0x8302, 0x5192, 0x5e3d, 0x8c8c, 0x8d38, 0x4e48, 0x73ab, 0x679a, 0x6885, 0x9176, 0x9709, 0x7164, 0x6ca1, 0x7709, 0x5a92, 0x9541, 0x6bcf, 0x7f8e, 0x6627, 0x5bd0, 0x59b9, 0x5a9a, 0x95e8, 0x95f7, 0x4eec, 0x840c, 0x8499, 0x6aac, 0x76df, 0x9530, 0x731b, 0x68a6, 0x5b5f, 0x772f, 0x919a, 0x9761, 0x7cdc, 0x8ff7, 0x8c1c, 0x5f25, 0x7c73, 0x79d8, 0x89c5, 0x6ccc, 0x871c, 0x5bc6, 0x5e42, 0x68c9, 0x7720, 0x7ef5, 0x5195, 0x514d, 0x52c9, 0x5a29, 0x7f05, 0x9762, 0x82d7, 0x63cf, 0x7784, 0x85d0, 0x79d2, 0x6e3a, 0x5e99, 0x5999, 0x8511, 0x706d, 0x6c11, 0x62bf, 0x76bf, 0x654f, 0x60af, 0x95fd, 0x660e, 0x879f, 0x9e23, 0x94ed, 0x540d, 0x547d, 0x8c2c, 0x6478, /* 0x44 */ 0x6479, 0x8611, 0x6a21, 0x819c, 0x78e8, 0x6469, 0x9b54, 0x62b9, 0x672b, 0x83ab, 0x58a8, 0x9ed8, 0x6cab, 0x6f20, 0x5bde, 0x964c, 0x8c0b, 0x725f, 0x67d0, 0x62c7, 0x7261, 0x4ea9, 0x59c6, 0x6bcd, 0x5893, 0x66ae, 0x5e55, 0x52df, 0x6155, 0x6728, 0x76ee, 0x7766, 0x7267, 0x7a46, 0x62ff, 0x54ea, 0x5450, 0x94a0, 0x90a3, 0x5a1c, 0x7eb3, 0x6c16, 0x4e43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96be, 0x56ca, 0x6320, 0x8111, 0x607c, 0x95f9, 0x6dd6, 0x5462, 0x9981, 0x5185, 0x5ae9, 0x80fd, 0x59ae, 0x9713, 0x502a, 0x6ce5, 0x5c3c, 0x62df, 0x4f60, 0x533f, 0x817b, 0x9006, 0x6eba, 0x852b, 0x62c8, 0x5e74, 0x78be, 0x64b5, 0x637b, 0x5ff5, 0x5a18, 0x917f, 0x9e1f, 0x5c3f, 0x634f, 0x8042, 0x5b7d, 0x556e, 0x954a, 0x954d, 0x6d85, 0x60a8, 0x67e0, 0x72de, 0x51dd, 0x5b81, /* 0x45 */ 0x62e7, 0x6cde, 0x725b, 0x626d, 0x94ae, 0x7ebd, 0x8113, 0x6d53, 0x519c, 0x5f04, 0x5974, 0x52aa, 0x6012, 0x5973, 0x6696, 0x8650, 0x759f, 0x632a, 0x61e6, 0x7cef, 0x8bfa, 0x54e6, 0x6b27, 0x9e25, 0x6bb4, 0x85d5, 0x5455, 0x5076, 0x6ca4, 0x556a, 0x8db4, 0x722c, 0x5e15, 0x6015, 0x7436, 0x62cd, 0x6392, 0x724c, 0x5f98, 0x6e43, 0x6d3e, 0x6500, 0x6f58, 0x76d8, 0x78d0, 0x76fc, 0x7554, 0x5224, 0x53db, 0x4e53, 0x5e9e, 0x65c1, 0x802a, 0x80d6, 0x629b, 0x5486, 0x5228, 0x70ae, 0x888d, 0x8dd1, 0x6ce1, 0x5478, 0x80da, 0x57f9, 0x88f4, 0x8d54, 0x966a, 0x914d, 0x4f69, 0x6c9b, 0x55b7, 0x76c6, 0x7830, 0x62a8, 0x70f9, 0x6f8e, 0x5f6d, 0x84ec, 0x68da, 0x787c, 0x7bf7, 0x81a8, 0x670b, 0x9e4f, 0x6367, 0x78b0, 0x576f, 0x7812, 0x9739, 0x6279, 0x62ab, 0x5288, 0x7435, 0x6bd7, /* 0x46 */ 0x5564, 0x813e, 0x75b2, 0x76ae, 0x5339, 0x75de, 0x50fb, 0x5c41, 0x8b6c, 0x7bc7, 0x504f, 0x7247, 0x9a97, 0x98d8, 0x6f02, 0x74e2, 0x7968, 0x6487, 0x77a5, 0x62fc, 0x9891, 0x8d2b, 0x54c1, 0x8058, 0x4e52, 0x576a, 0x82f9, 0x840d, 0x5e73, 0x51ed, 0x74f6, 0x8bc4, 0x5c4f, 0x5761, 0x6cfc, 0x9887, 0x5a46, 0x7834, 0x9b44, 0x8feb, 0x7c95, 0x5256, 0x6251, 0x94fa, 0x4ec6, 0x8386, 0x8461, 0x83e9, 0x84b2, 0x57d4, 0x6734, 0x5703, 0x666e, 0x6d66, 0x8c31, 0x66dd, 0x7011, 0x671f, 0x6b3a, 0x6816, 0x621a, 0x59bb, 0x4e03, 0x51c4, 0x6f06, 0x67d2, 0x6c8f, 0x5176, 0x68cb, 0x5947, 0x6b67, 0x7566, 0x5d0e, 0x8110, 0x9f50, 0x65d7, 0x7948, 0x7941, 0x9a91, 0x8d77, 0x5c82, 0x4e5e, 0x4f01, 0x542f, 0x5951, 0x780c, 0x5668, 0x6c14, 0x8fc4, 0x5f03, 0x6c7d, 0x6ce3, 0x8bab, 0x6390, /* 0x47 */ 0x6070, 0x6d3d, 0x7275, 0x6266, 0x948e, 0x94c5, 0x5343, 0x8fc1, 0x7b7e, 0x4edf, 0x8c26, 0x4e7e, 0x9ed4, 0x94b1, 0x94b3, 0x524d, 0x6f5c, 0x9063, 0x6d45, 0x8c34, 0x5811, 0x5d4c, 0x6b20, 0x6b49, 0x67aa, 0x545b, 0x8154, 0x7f8c, 0x5899, 0x8537, 0x5f3a, 0x62a2, 0x6a47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77a7, 0x4e54, 0x4fa8, 0x5de7, 0x9798, 0x64ac, 0x7fd8, 0x5ced, 0x4fcf, 0x7a8d, 0x5207, 0x8304, 0x4e14, 0x602f, 0x7a83, 0x94a6, 0x4fb5, 0x4eb2, 0x79e6, 0x7434, 0x52e4, 0x82b9, 0x64d2, 0x79bd, 0x5bdd, 0x6c81, 0x9752, 0x8f7b, 0x6c22, 0x503e, 0x537f, 0x6e05, 0x64ce, 0x6674, 0x6c30, 0x60c5, 0x9877, 0x8bf7, 0x5e86, 0x743c, 0x7a77, 0x79cb, 0x4e18, 0x90b1, 0x7403, 0x6c42, 0x56da, 0x914b, 0x6cc5, 0x8d8b, 0x533a, 0x86c6, 0x66f2, 0x8eaf, 0x5c48, 0x9a71, 0x6e20, /* 0x48 */ 0x53d6, 0x5a36, 0x9f8b, 0x8da3, 0x53bb, 0x5708, 0x98a7, 0x6743, 0x919b, 0x6cc9, 0x5168, 0x75ca, 0x62f3, 0x72ac, 0x5238, 0x529d, 0x7f3a, 0x7094, 0x7638, 0x5374, 0x9e4a, 0x69b7, 0x786e, 0x96c0, 0x88d9, 0x7fa4, 0x7136, 0x71c3, 0x5189, 0x67d3, 0x74e4, 0x58e4, 0x6518, 0x56b7, 0x8ba9, 0x9976, 0x6270, 0x7ed5, 0x60f9, 0x70ed, 0x58ec, 0x4ec1, 0x4eba, 0x5fcd, 0x97e7, 0x4efb, 0x8ba4, 0x5203, 0x598a, 0x7eab, 0x6254, 0x4ecd, 0x65e5, 0x620e, 0x8338, 0x84c9, 0x8363, 0x878d, 0x7194, 0x6eb6, 0x5bb9, 0x7ed2, 0x5197, 0x63c9, 0x67d4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5b7a, 0x5982, 0x8fb1, 0x4e73, 0x6c5d, 0x5165, 0x8925, 0x8f6f, 0x962e, 0x854a, 0x745e, 0x9510, 0x95f0, 0x6da6, 0x82e5, 0x5f31, 0x6492, 0x6d12, 0x8428, 0x816e, 0x9cc3, 0x585e, 0x8d5b, 0x4e09, 0x53c1, /* 0x49 */ 0x4f1e, 0x6563, 0x6851, 0x55d3, 0x4e27, 0x6414, 0x9a9a, 0x626b, 0x5ac2, 0x745f, 0x8272, 0x6da9, 0x68ee, 0x50e7, 0x838e, 0x7802, 0x6740, 0x5239, 0x6c99, 0x7eb1, 0x50bb, 0x5565, 0x715e, 0x7b5b, 0x6652, 0x73ca, 0x82eb, 0x6749, 0x5c71, 0x5220, 0x717d, 0x886b, 0x95ea, 0x9655, 0x64c5, 0x8d61, 0x81b3, 0x5584, 0x6c55, 0x6247, 0x7f2e, 0x5892, 0x4f24, 0x5546, 0x8d4f, 0x664c, 0x4e0a, 0x5c1a, 0x88f3, 0x68a2, 0x634e, 0x7a0d, 0x70e7, 0x828d, 0x52fa, 0x97f6, 0x5c11, 0x54e8, 0x90b5, 0x7ecd, 0x5962, 0x8d4a, 0x86c7, 0x820c, 0x820d, 0x8d66, 0x6444, 0x5c04, 0x6151, 0x6d89, 0x793e, 0x8bbe, 0x7837, 0x7533, 0x547b, 0x4f38, 0x8eab, 0x6df1, 0x5a20, 0x7ec5, 0x795e, 0x6c88, 0x5ba1, 0x5a76, 0x751a, 0x80be, 0x614e, 0x6e17, 0x58f0, 0x751f, 0x7525, 0x7272, 0x5347, 0x7ef3, /* 0x4a */ 0x7701, 0x76db, 0x5269, 0x80dc, 0x5723, 0x5e08, 0x5931, 0x72ee, 0x65bd, 0x6e7f, 0x8bd7, 0x5c38, 0x8671, 0x5341, 0x77f3, 0x62fe, 0x65f6, 0x4ec0, 0x98df, 0x8680, 0x5b9e, 0x8bc6, 0x53f2, 0x77e2, 0x4f7f, 0x5c4e, 0x9a76, 0x59cb, 0x5f0f, 0x793a, 0x58eb, 0x4e16, 0x67ff, 0x4e8b, 0x62ed, 0x8a93, 0x901d, 0x52bf, 0x662f, 0x55dc, 0x566c, 0x9002, 0x4ed5, 0x4f8d, 0x91ca, 0x9970, 0x6c0f, 0x5e02, 0x6043, 0x5ba4, 0x89c6, 0x8bd5, 0x6536, 0x624b, 0x9996, 0x5b88, 0x5bff, 0x6388, 0x552e, 0x53d7, 0x7626, 0x517d, 0x852c, 0x67a2, 0x68b3, 0x6b8a, 0x6292, 0x8f93, 0x53d4, 0x8212, 0x6dd1, 0x758f, 0x4e66, 0x8d4e, 0x5b70, 0x719f, 0x85af, 0x6691, 0x66d9, 0x7f72, 0x8700, 0x9ecd, 0x9f20, 0x5c5e, 0x672f, 0x8ff0, 0x6811, 0x675f, 0x620d, 0x7ad6, 0x5885, 0x5eb6, 0x6570, 0x6f31, /* 0x4b */ 0x6055, 0x5237, 0x800d, 0x6454, 0x8870, 0x7529, 0x5e05, 0x6813, 0x62f4, 0x971c, 0x53cc, 0x723d, 0x8c01, 0x6c34, 0x7761, 0x7a0e, 0x542e, 0x77ac, 0x987a, 0x821c, 0x8bf4, 0x7855, 0x6714, 0x70c1, 0x65af, 0x6495, 0x5636, 0x601d, 0x79c1, 0x53f8, 0x4e1d, 0x6b7b, 0x8086, 0x5bfa, 0x55e3, 0x56db, 0x4f3a, 0x4f3c, 0x9972, 0x5df3, 0x677e, 0x8038, 0x6002, 0x9882, 0x9001, 0x5b8b, 0x8bbc, 0x8bf5, 0x641c, 0x8258, 0x64de, 0x55fd, 0x82cf, 0x9165, 0x4fd7, 0x7d20, 0x901f, 0x7c9f, 0x50f3, 0x5851, 0x6eaf, 0x5bbf, 0x8bc9, 0x8083, 0x9178, 0x849c, 0x7b97, 0x867d, 0x968b, 0x968f, 0x7ee5, 0x9ad3, 0x788e, 0x5c81, 0x7a57, 0x9042, 0x96a7, 0x795f, 0x5b59, 0x635f, 0x7b0b, 0x84d1, 0x68ad, 0x5506, 0x7f29, 0x7410, 0x7d22, 0x9501, 0x6240, 0x584c, 0x4ed6, 0x5b83, 0x5979, 0x5854, /* 0x4c */ 0x736d, 0x631e, 0x8e4b, 0x8e0f, 0x80ce, 0x82d4, 0x62ac, 0x53f0, 0x6cf0, 0x915e, 0x592a, 0x6001, 0x6c70, 0x574d, 0x644a, 0x8d2a, 0x762b, 0x6ee9, 0x575b, 0x6a80, 0x75f0, 0x6f6d, 0x8c2d, 0x8c08, 0x5766, 0x6bef, 0x8892, 0x78b3, 0x63a2, 0x53f9, 0x70ad, 0x6c64, 0x5858, 0x642a, 0x5802, 0x68e0, 0x819b, 0x5510, 0x7cd6, 0x5018, 0x8eba, 0x6dcc, 0x8d9f, 0x70eb, 0x638f, 0x6d9b, 0x6ed4, 0x7ee6, 0x8404, 0x6843, 0x9003, 0x6dd8, 0x9676, 0x8ba8, 0x5957, 0x7279, 0x85e4, 0x817e, 0x75bc, 0x8a8a, 0x68af, 0x5254, 0x8e22, 0x9511, 0x63d0, 0x9898, 0x8e44, 0x557c, 0x4f53, 0x66ff, 0x568f, 0x60d5, 0x6d95, 0x5243, 0x5c49, 0x5929, 0x6dfb, 0x586b, 0x7530, 0x751c, 0x606c, 0x8214, 0x8146, 0x6311, 0x6761, 0x8fe2, 0x773a, 0x8df3, 0x8d34, 0x94c1, 0x5e16, 0x5385, 0x542c, 0x70c3, /* 0x4d */ 0x6c40, 0x5ef7, 0x505c, 0x4ead, 0x5ead, 0x633a, 0x8247, 0x901a, 0x6850, 0x916e, 0x77b3, 0x540c, 0x94dc, 0x5f64, 0x7ae5, 0x6876, 0x6345, 0x7b52, 0x7edf, 0x75db, 0x5077, 0x6295, 0x5934, 0x900f, 0x51f8, 0x79c3, 0x7a81, 0x56fe, 0x5f92, 0x9014, 0x6d82, 0x5c60, 0x571f, 0x5410, 0x5154, 0x6e4d, 0x56e2, 0x63a8, 0x9893, 0x817f, 0x8715, 0x892a, 0x9000, 0x541e, 0x5c6f, 0x81c0, 0x62d6, 0x6258, 0x8131, 0x9e35, 0x9640, 0x9a6e, 0x9a7c, 0x692d, 0x59a5, 0x62d3, 0x553e, 0x6316, 0x54c7, 0x86d9, 0x6d3c, 0x5a03, 0x74e6, 0x889c, 0x6b6a, 0x5916, 0x8c4c, 0x5f2f, 0x6e7e, 0x73a9, 0x987d, 0x4e38, 0x70f7, 0x5b8c, 0x7897, 0x633d, 0x665a, 0x7696, 0x60cb, 0x5b9b, 0x5a49, 0x4e07, 0x8155, 0x6c6a, 0x738b, 0x4ea1, 0x6789, 0x7f51, 0x5f80, 0x65fa, 0x671b, 0x5fd8, 0x5984, 0x5a01, /* 0x4e */ 0x5dcd, 0x5fae, 0x5371, 0x97e6, 0x8fdd, 0x6845, 0x56f4, 0x552f, 0x60df, 0x4e3a, 0x6f4d, 0x7ef4, 0x82c7, 0x840e, 0x59d4, 0x4f1f, 0x4f2a, 0x5c3e, 0x7eac, 0x672a, 0x851a, 0x5473, 0x754f, 0x80c3, 0x5582, 0x9b4f, 0x4f4d, 0x6e2d, 0x8c13, 0x5c09, 0x6170, 0x536b, 0x761f, 0x6e29, 0x868a, 0x6587, 0x95fb, 0x7eb9, 0x543b, 0x7a33, 0x7d0a, 0x95ee, 0x55e1, 0x7fc1, 0x74ee, 0x631d, 0x8717, 0x6da1, 0x7a9d, 0x6211, 0x65a1, 0x5367, 0x63e1, 0x6c83, 0x5deb, 0x545c, 0x94a8, 0x4e4c, 0x6c61, 0x8bec, 0x5c4b, 0x65e0, 0x829c, 0x68a7, 0x543e, 0x5434, 0x6bcb, 0x6b66, 0x4e94, 0x6342, 0x5348, 0x821e, 0x4f0d, 0x4fae, 0x575e, 0x620a, 0x96fe, 0x6664, 0x7269, 0x52ff, 0x52a1, 0x609f, 0x8bef, 0x6614, 0x7199, 0x6790, 0x897f, 0x7852, 0x77fd, 0x6670, 0x563b, 0x5438, 0x9521, 0x727a, /* 0x4f */ 0x7a00, 0x606f, 0x5e0c, 0x6089, 0x819d, 0x5915, 0x60dc, 0x7184, 0x70ef, 0x6eaa, 0x6c50, 0x7280, 0x6a84, 0x88ad, 0x5e2d, 0x4e60, 0x5ab3, 0x559c, 0x94e3, 0x6d17, 0x7cfb, 0x9699, 0x620f, 0x7ec6, 0x778e, 0x867e, 0x5323, 0x971e, 0x8f96, 0x6687, 0x5ce1, 0x4fa0, 0x72ed, 0x4e0b, 0x53a6, 0x590f, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ed9, 0x9c9c, 0x7ea4, 0x54b8, 0x8d24, 0x8854, 0x8237, 0x95f2, 0x6d8e, 0x5f26, 0x5acc, 0x663e, 0x9669, 0x73b0, 0x732e, 0x53bf, 0x817a, 0x9985, 0x7fa1, 0x5baa, 0x9677, 0x9650, 0x7ebf, 0x76f8, 0x53a2, 0x9576, 0x9999, 0x7bb1, 0x8944, 0x6e58, 0x4e61, 0x7fd4, 0x7965, 0x8be6, 0x60f3, 0x54cd, 0x4eab, 0x9879, 0x5df7, 0x6a61, 0x50cf, 0x5411, 0x8c61, 0x8427, 0x785d, 0x9704, 0x524a, 0x54ee, 0x56a3, 0x9500, 0x6d88, 0x5bb5, 0x6dc6, 0x6653, /* 0x50 */ 0x5c0f, 0x5b5d, 0x6821, 0x8096, 0x5578, 0x7b11, 0x6548, 0x6954, 0x4e9b, 0x6b47, 0x874e, 0x978b, 0x534f, 0x631f, 0x643a, 0x90aa, 0x659c, 0x80c1, 0x8c10, 0x5199, 0x68b0, 0x5378, 0x87f9, 0x61c8, 0x6cc4, 0x6cfb, 0x8c22, 0x5c51, 0x85aa, 0x82af, 0x950c, 0x6b23, 0x8f9b, 0x65b0, 0x5ffb, 0x5fc3, 0x4fe1, 0x8845, 0x661f, 0x8165, 0x7329, 0x60fa, 0x5174, 0x5211, 0x578b, 0x5f62, 0x90a2, 0x884c, 0x9192, 0x5e78, 0x674f, 0x6027, 0x59d3, 0x5144, 0x51f6, 0x80f8, 0x5308, 0x6c79, 0x96c4, 0x718a, 0x4f11, 0x4fee, 0x7f9e, 0x673d, 0x55c5, 0x9508, 0x79c0, 0x8896, 0x7ee3, 0x589f, 0x620c, 0x9700, 0x865a, 0x5618, 0x987b, 0x5f90, 0x8bb8, 0x84c4, 0x9157, 0x53d9, 0x65ed, 0x5e8f, 0x755c, 0x6064, 0x7d6e, 0x5a7f, 0x7eea, 0x7eed, 0x8f69, 0x55a7, 0x5ba3, 0x60ac, 0x65cb, 0x7384, /* 0x51 */ 0x9009, 0x7663, 0x7729, 0x7eda, 0x9774, 0x859b, 0x5b66, 0x7a74, 0x96ea, 0x8840, 0x52cb, 0x718f, 0x5faa, 0x65ec, 0x8be2, 0x5bfb, 0x9a6f, 0x5de1, 0x6b89, 0x6c5b, 0x8bad, 0x8baf, 0x900a, 0x8fc5, 0x538b, 0x62bc, 0x9e26, 0x9e2d, 0x5440, 0x4e2b, 0x82bd, 0x7259, 0x869c, 0x5d16, 0x8859, 0x6daf, 0x96c5, 0x54d1, 0x4e9a, 0x8bb6, 0x7109, 0x54bd, 0x9609, 0x70df, 0x6df9, 0x76d0, 0x4e25, 0x7814, 0x8712, 0x5ca9, 0x5ef6, 0x8a00, 0x989c, 0x960e, 0x708e, 0x6cbf, 0x5944, 0x63a9, 0x773c, 0x884d, 0x6f14, 0x8273, 0x5830, 0x71d5, 0x538c, 0x781a, 0x96c1, 0x5501, 0x5f66, 0x7130, 0x5bb4, 0x8c1a, 0x9a8c, 0x6b83, 0x592e, 0x9e2f, 0x79e7, 0x6768, 0x626c, 0x4f6f, 0x75a1, 0x7f8a, 0x6d0b, 0x9633, 0x6c27, 0x4ef0, 0x75d2, 0x517b, 0x6837, 0x6f3e, 0x9080, 0x8170, 0x5996, 0x7476, /* 0x52 */ 0x6447, 0x5c27, 0x9065, 0x7a91, 0x8c23, 0x59da, 0x54ac, 0x8200, 0x836f, 0x8981, 0x8000, 0x6930, 0x564e, 0x8036, 0x7237, 0x91ce, 0x51b6, 0x4e5f, 0x9875, 0x6396, 0x4e1a, 0x53f6, 0x66f3, 0x814b, 0x591c, 0x6db2, 0x4e00, 0x58f9, 0x533b, 0x63d6, 0x94f1, 0x4f9d, 0x4f0a, 0x8863, 0x9890, 0x5937, 0x9057, 0x79fb, 0x4eea, 0x80f0, 0x7591, 0x6c82, 0x5b9c, 0x59e8, 0x5f5d, 0x6905, 0x8681, 0x501a, 0x5df2, 0x4e59, 0x77e3, 0x4ee5, 0x827a, 0x6291, 0x6613, 0x9091, 0x5c79, 0x4ebf, 0x5f79, 0x81c6, 0x9038, 0x8084, 0x75ab, 0x4ea6, 0x88d4, 0x610f, 0x6bc5, 0x5fc6, 0x4e49, 0x76ca, 0x6ea2, 0x8be3, 0x8bae, 0x8c0a, 0x8bd1, 0x5f02, 0x7ffc, 0x7fcc, 0x7ece, 0x8335, 0x836b, 0x56e0, 0x6bb7, 0x97f3, 0x9634, 0x59fb, 0x541f, 0x94f6, 0x6deb, 0x5bc5, 0x996e, 0x5c39, 0x5f15, 0x9690, /* 0x53 */ 0x5370, 0x82f1, 0x6a31, 0x5a74, 0x9e70, 0x5e94, 0x7f28, 0x83b9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8fce, 0x8d62, 0x76c8, 0x5f71, 0x9896, 0x786c, 0x6620, 0x54df, 0x62e5, 0x4f63, 0x81c3, 0x75c8, 0x5eb8, 0x96cd, 0x8e0a, 0x86f9, 0x548f, 0x6cf3, 0x6d8c, 0x6c38, 0x607f, 0x52c7, 0x7528, 0x5e7d, 0x4f18, 0x60a0, 0x5fe7, 0x5c24, 0x7531, 0x90ae, 0x94c0, 0x72b9, 0x6cb9, 0x6e38, 0x9149, 0x6709, 0x53cb, 0x53f3, 0x4f51, 0x91c9, 0x8bf1, 0x53c8, 0x5e7c, 0x8fc2, 0x6de4, 0x4e8e, 0x76c2, 0x6986, 0x865e, 0x611a, 0x8206, 0x4f59, 0x4fde, 0x903e, 0x9c7c, 0x6109, 0x6e1d, 0x6e14, 0x9685, 0x4e88, 0x5a31, 0x96e8, 0x4e0e, 0x5c7f, 0x79b9, 0x5b87, 0x8bed, 0x7fbd, 0x7389, 0x57df, 0x828b, 0x90c1, 0x5401, 0x9047, 0x55bb, 0x5cea, 0x5fa1, 0x6108, 0x6b32, 0x72f1, 0x80b2, 0x8a89, /* 0x54 */ 0x6d74, 0x5bd3, 0x88d5, 0x9884, 0x8c6b, 0x9a6d, 0x9e33, 0x6e0a, 0x51a4, 0x5143, 0x57a3, 0x8881, 0x539f, 0x63f4, 0x8f95, 0x56ed, 0x5458, 0x5706, 0x733f, 0x6e90, 0x7f18, 0x8fdc, 0x82d1, 0x613f, 0x6028, 0x9662, 0x66f0, 0x7ea6, 0x8d8a, 0x8dc3, 0x94a5, 0x5cb3, 0x7ca4, 0x6708, 0x60a6, 0x9605, 0x8018, 0x4e91, 0x90e7, 0x5300, 0x9668, 0x5141, 0x8fd0, 0x8574, 0x915d, 0x6655, 0x97f5, 0x5b55, 0x531d, 0x7838, 0x6742, 0x683d, 0x54c9, 0x707e, 0x5bb0, 0x8f7d, 0x518d, 0x5728, 0x54b1, 0x6512, 0x6682, 0x8d5e, 0x8d43, 0x810f, 0x846c, 0x906d, 0x7cdf, 0x51ff, 0x85fb, 0x67a3, 0x65e9, 0x6fa1, 0x86a4, 0x8e81, 0x566a, 0x9020, 0x7682, 0x7076, 0x71e5, 0x8d23, 0x62e9, 0x5219, 0x6cfd, 0x8d3c, 0x600e, 0x589e, 0x618e, 0x66fe, 0x8d60, 0x624e, 0x55b3, 0x6e23, 0x672d, 0x8f67, /* 0x55 */ 0x94e1, 0x95f8, 0x7728, 0x6805, 0x69a8, 0x548b, 0x4e4d, 0x70b8, 0x8bc8, 0x6458, 0x658b, 0x5b85, 0x7a84, 0x503a, 0x5be8, 0x77bb, 0x6be1, 0x8a79, 0x7c98, 0x6cbe, 0x76cf, 0x65a9, 0x8f97, 0x5d2d, 0x5c55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7ad9, 0x6e5b, 0x7efd, 0x6a1f, 0x7ae0, 0x5f70, 0x6f33, 0x5f20, 0x638c, 0x6da8, 0x6756, 0x4e08, 0x5e10, 0x8d26, 0x4ed7, 0x80c0, 0x7634, 0x969c, 0x62db, 0x662d, 0x627e, 0x6cbc, 0x8d75, 0x7167, 0x7f69, 0x5146, 0x8087, 0x53ec, 0x906e, 0x6298, 0x54f2, 0x86f0, 0x8f99, 0x8005, 0x9517, 0x8517, 0x8fd9, 0x6d59, 0x73cd, 0x659f, 0x771f, 0x7504, 0x7827, 0x81fb, 0x8d1e, 0x9488, 0x4fa6, 0x6795, 0x75b9, 0x8bca, 0x9707, 0x632f, 0x9547, 0x9635, 0x84b8, 0x6323, 0x7741, 0x5f81, 0x72f0, 0x4e89, 0x6014, 0x6574, 0x62ef, 0x6b63, 0x653f, /* 0x56 */ 0x5e27, 0x75c7, 0x90d1, 0x8bc1, 0x829d, 0x679d, 0x652f, 0x5431, 0x8718, 0x77e5, 0x80a2, 0x8102, 0x6c41, 0x4e4b, 0x7ec7, 0x804c, 0x76f4, 0x690d, 0x6b96, 0x6267, 0x503c, 0x4f84, 0x5740, 0x6307, 0x6b62, 0x8dbe, 0x53ea, 0x65e8, 0x7eb8, 0x5fd7, 0x631a, 0x63b7, 0x81f3, 0x81f4, 0x7f6e, 0x5e1c, 0x5cd9, 0x5236, 0x667a, 0x79e9, 0x7a1a, 0x8d28, 0x7099, 0x75d4, 0x6ede, 0x6cbb, 0x7a92, 0x4e2d, 0x76c5, 0x5fe0, 0x949f, 0x8877, 0x7ec8, 0x79cd, 0x80bf, 0x91cd, 0x4ef2, 0x4f17, 0x821f, 0x5468, 0x5dde, 0x6d32, 0x8bcc, 0x7ca5, 0x8f74, 0x8098, 0x5e1a, 0x5492, 0x76b1, 0x5b99, 0x663c, 0x9aa4, 0x73e0, 0x682a, 0x86db, 0x6731, 0x732a, 0x8bf8, 0x8bdb, 0x9010, 0x7af9, 0x70db, 0x716e, 0x62c4, 0x77a9, 0x5631, 0x4e3b, 0x8457, 0x67f1, 0x52a9, 0x86c0, 0x8d2e, 0x94f8, 0x7b51, /* 0x57 */ 0x4f4f, 0x6ce8, 0x795d, 0x9a7b, 0x6293, 0x722a, 0x62fd, 0x4e13, 0x7816, 0x8f6c, 0x64b0, 0x8d5a, 0x7bc6, 0x6869, 0x5e84, 0x88c5, 0x5986, 0x649e, 0x58ee, 0x72b6, 0x690e, 0x9525, 0x8ffd, 0x8d58, 0x5760, 0x7f00, 0x8c06, 0x51c6, 0x6349, 0x62d9, 0x5353, 0x684c, 0x7422, 0x8301, 0x914c, 0x5544, 0x7740, 0x707c, 0x6d4a, 0x5179, 0x54a8, 0x8d44, 0x59ff, 0x6ecb, 0x6dc4, 0x5b5c, 0x7d2b, 0x4ed4, 0x7c7d, 0x6ed3, 0x5b50, 0x81ea, 0x6e0d, 0x5b57, 0x9b03, 0x68d5, 0x8e2a, 0x5b97, 0x7efc, 0x603b, 0x7eb5, 0x90b9, 0x8d70, 0x594f, 0x63cd, 0x79df, 0x8db3, 0x5352, 0x65cf, 0x7956, 0x8bc5, 0x963b, 0x7ec4, 0x94bb, 0x7e82, 0x5634, 0x9189, 0x6700, 0x7f6a, 0x5c0a, 0x9075, 0x6628, 0x5de6, 0x4f50, 0x67de, 0x505a, 0x4f5c, 0x5750, 0x5ea7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x58 */ 0x4e8d, 0x4e0c, 0x5140, 0x4e10, 0x5eff, 0x5345, 0x4e15, 0x4e98, 0x4e1e, 0x9b32, 0x5b6c, 0x5669, 0x4e28, 0x79ba, 0x4e3f, 0x5315, 0x4e47, 0x592d, 0x723b, 0x536e, 0x6c10, 0x56df, 0x80e4, 0x9997, 0x6bd3, 0x777e, 0x9f17, 0x4e36, 0x4e9f, 0x9f10, 0x4e5c, 0x4e69, 0x4e93, 0x8288, 0x5b5b, 0x556c, 0x560f, 0x4ec4, 0x538d, 0x539d, 0x53a3, 0x53a5, 0x53ae, 0x9765, 0x8d5d, 0x531a, 0x53f5, 0x5326, 0x532e, 0x533e, 0x8d5c, 0x5366, 0x5363, 0x5202, 0x5208, 0x520e, 0x522d, 0x5233, 0x523f, 0x5240, 0x524c, 0x525e, 0x5261, 0x525c, 0x84af, 0x527d, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7f54, 0x4ebb, 0x4ec3, 0x4ec9, 0x4ec2, 0x4ee8, 0x4ee1, 0x4eeb, 0x4ede, 0x4f1b, 0x4ef3, 0x4f22, 0x4f64, 0x4ef5, 0x4f25, 0x4f27, 0x4f09, 0x4f2b, 0x4f5e, 0x4f67, 0x6538, 0x4f5a, 0x4f5d, /* 0x59 */ 0x4f5f, 0x4f57, 0x4f32, 0x4f3d, 0x4f76, 0x4f74, 0x4f91, 0x4f89, 0x4f83, 0x4f8f, 0x4f7e, 0x4f7b, 0x4faa, 0x4f7c, 0x4fac, 0x4f94, 0x4fe6, 0x4fe8, 0x4fea, 0x4fc5, 0x4fda, 0x4fe3, 0x4fdc, 0x4fd1, 0x4fdf, 0x4ff8, 0x5029, 0x504c, 0x4ff3, 0x502c, 0x500f, 0x502e, 0x502d, 0x4ffe, 0x501c, 0x500c, 0x5025, 0x5028, 0x507e, 0x5043, 0x5055, 0x5048, 0x504e, 0x506c, 0x507b, 0x50a5, 0x50a7, 0x50a9, 0x50ba, 0x50d6, 0x5106, 0x50ed, 0x50ec, 0x50e6, 0x50ee, 0x5107, 0x510b, 0x4edd, 0x6c3d, 0x4f58, 0x4f65, 0x4fce, 0x9fa0, 0x6c46, 0x7c74, 0x516e, 0x5dfd, 0x9ec9, 0x9998, 0x5181, 0x5914, 0x52f9, 0x530d, 0x8a07, 0x5310, 0x51eb, 0x5919, 0x5155, 0x4ea0, 0x5156, 0x4eb3, 0x886e, 0x88a4, 0x4eb5, 0x8114, 0x88d2, 0x7980, 0x5b34, 0x8803, 0x7fb8, 0x51ab, 0x51b1, 0x51bd, 0x51bc, /* 0x5a */ 0x51c7, 0x5196, 0x51a2, 0x51a5, 0x8ba0, 0x8ba6, 0x8ba7, 0x8baa, 0x8bb4, 0x8bb5, 0x8bb7, 0x8bc2, 0x8bc3, 0x8bcb, 0x8bcf, 0x8bce, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd6, 0x8bd8, 0x8bd9, 0x8bdc, 0x8bdf, 0x8be0, 0x8be4, 0x8be8, 0x8be9, 0x8bee, 0x8bf0, 0x8bf3, 0x8bf6, 0x8bf9, 0x8bfc, 0x8bff, 0x8c00, 0x8c02, 0x8c04, 0x8c07, 0x8c0c, 0x8c0f, 0x8c11, 0x8c12, 0x8c14, 0x8c15, 0x8c16, 0x8c19, 0x8c1b, 0x8c18, 0x8c1d, 0x8c1f, 0x8c20, 0x8c21, 0x8c25, 0x8c27, 0x8c2a, 0x8c2b, 0x8c2e, 0x8c2f, 0x8c32, 0x8c33, 0x8c35, 0x8c36, 0x5369, 0x537a, 0x961d, 0x9622, 0x9621, 0x9631, 0x962a, 0x963d, 0x963c, 0x9642, 0x9649, 0x9654, 0x965f, 0x9667, 0x966c, 0x9672, 0x9674, 0x9688, 0x968d, 0x9697, 0x96b0, 0x9097, 0x909b, 0x909d, 0x9099, 0x90ac, 0x90a1, 0x90b4, 0x90b3, 0x90b6, 0x90ba, /* 0x5b */ 0x90b8, 0x90b0, 0x90cf, 0x90c5, 0x90be, 0x90d0, 0x90c4, 0x90c7, 0x90d3, 0x90e6, 0x90e2, 0x90dc, 0x90d7, 0x90db, 0x90eb, 0x90ef, 0x90fe, 0x9104, 0x9122, 0x911e, 0x9123, 0x9131, 0x912f, 0x9139, 0x9143, 0x9146, 0x520d, 0x5942, 0x52a2, 0x52ac, 0x52ad, 0x52be, 0x54ff, 0x52d0, 0x52d6, 0x52f0, 0x53df, 0x71ee, 0x77cd, 0x5ef4, 0x51f5, 0x51fc, 0x9b2f, 0x53b6, 0x5f01, 0x755a, 0x5def, 0x574c, 0x57a9, 0x57a1, 0x587e, 0x58bc, 0x58c5, 0x58d1, 0x5729, 0x572c, 0x572a, 0x5733, 0x5739, 0x572e, 0x572f, 0x575c, 0x573b, 0x5742, 0x5769, 0x5785, 0x576b, 0x5786, 0x577c, 0x577b, 0x5768, 0x576d, 0x5776, 0x5773, 0x57ad, 0x57a4, 0x578c, 0x57b2, 0x57cf, 0x57a7, 0x57b4, 0x5793, 0x57a0, 0x57d5, 0x57d8, 0x57da, 0x57d9, 0x57d2, 0x57b8, 0x57f4, 0x57ef, 0x57f8, 0x57e4, 0x57dd, /* 0x5c */ 0x580b, 0x580d, 0x57fd, 0x57ed, 0x5800, 0x581e, 0x5819, 0x5844, 0x5820, 0x5865, 0x586c, 0x5881, 0x5889, 0x589a, 0x5880, 0x99a8, 0x9f19, 0x61ff, 0x8279, 0x827d, 0x827f, 0x828f, 0x828a, 0x82a8, 0x8284, 0x828e, 0x8291, 0x8297, 0x8299, 0x82ab, 0x82b8, 0x82be, 0x82b0, 0x82c8, 0x82ca, 0x82e3, 0x8298, 0x82b7, 0x82ae, 0x82cb, 0x82cc, 0x82c1, 0x82a9, 0x82b4, 0x82a1, 0x82aa, 0x829f, 0x82c4, 0x82ce, 0x82a4, 0x82e1, 0x8309, 0x82f7, 0x82e4, 0x830f, 0x8307, 0x82dc, 0x82f4, 0x82d2, 0x82d8, 0x830c, 0x82fb, 0x82d3, 0x8311, 0x831a, 0x8306, 0x8314, 0x8315, 0x82e0, 0x82d5, 0x831c, 0x8351, 0x835b, 0x835c, 0x8308, 0x8392, 0x833c, 0x8334, 0x8331, 0x839b, 0x835e, 0x832f, 0x834f, 0x8347, 0x8343, 0x835f, 0x8340, 0x8317, 0x8360, 0x832d, 0x833a, 0x8333, 0x8366, 0x8365, /* 0x5d */ 0x8368, 0x831b, 0x8369, 0x836c, 0x836a, 0x836d, 0x836e, 0x83b0, 0x8378, 0x83b3, 0x83b4, 0x83a0, 0x83aa, 0x8393, 0x839c, 0x8385, 0x837c, 0x83b6, 0x83a9, 0x837d, 0x83b8, 0x837b, 0x8398, 0x839e, 0x83a8, 0x83ba, 0x83bc, 0x83c1, 0x8401, 0x83e5, 0x83d8, 0x5807, 0x8418, 0x840b, 0x83dd, 0x83fd, 0x83d6, 0x841c, 0x8438, 0x8411, 0x8406, 0x83d4, 0x83df, 0x840f, 0x8403, 0x83f8, 0x83f9, 0x83ea, 0x83c5, 0x83c0, 0x8426, 0x83f0, 0x83e1, 0x845c, 0x8451, 0x845a, 0x8459, 0x8473, 0x8487, 0x8488, 0x847a, 0x8489, 0x8478, 0x843c, 0x8446, 0x8469, 0x8476, 0x848c, 0x848e, 0x8431, 0x846d, 0x84c1, 0x84cd, 0x84d0, 0x84e6, 0x84bd, 0x84d3, 0x84ca, 0x84bf, 0x84ba, 0x84e0, 0x84a1, 0x84b9, 0x84b4, 0x8497, 0x84e5, 0x84e3, 0x850c, 0x750d, 0x8538, 0x84f0, 0x8539, 0x851f, 0x853a, /* 0x5e */ 0x8556, 0x853b, 0x84ff, 0x84fc, 0x8559, 0x8548, 0x8568, 0x8564, 0x855e, 0x857a, 0x77a2, 0x8543, 0x8572, 0x857b, 0x85a4, 0x85a8, 0x8587, 0x858f, 0x8579, 0x85ae, 0x859c, 0x8585, 0x85b9, 0x85b7, 0x85b0, 0x85d3, 0x85c1, 0x85dc, 0x85ff, 0x8627, 0x8605, 0x8629, 0x8616, 0x863c, 0x5efe, 0x5f08, 0x593c, 0x5941, 0x8037, 0x5955, 0x595a, 0x5958, 0x530f, 0x5c22, 0x5c25, 0x5c2c, 0x5c34, 0x624c, 0x626a, 0x629f, 0x62bb, 0x62ca, 0x62da, 0x62d7, 0x62ee, 0x6322, 0x62f6, 0x6339, 0x634b, 0x6343, 0x63ad, 0x63f6, 0x6371, 0x637a, 0x638e, 0x63b4, 0x636d, 0x63ac, 0x638a, 0x6369, 0x63ae, 0x63bc, 0x63f2, 0x63f8, 0x63e0, 0x63ff, 0x63c4, 0x63de, 0x63ce, 0x6452, 0x63c6, 0x63be, 0x6445, 0x6441, 0x640b, 0x641b, 0x6420, 0x640c, 0x6426, 0x6421, 0x645e, 0x6484, 0x646d, 0x6496, /* 0x5f */ 0x647a, 0x64b7, 0x64b8, 0x6499, 0x64ba, 0x64c0, 0x64d0, 0x64d7, 0x64e4, 0x64e2, 0x6509, 0x6525, 0x652e, 0x5f0b, 0x5fd2, 0x7519, 0x5f11, 0x535f, 0x53f1, 0x53fd, 0x53e9, 0x53e8, 0x53fb, 0x5412, 0x5416, 0x5406, 0x544b, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549a, 0x549b, 0x5484, 0x5476, 0x5466, 0x549d, 0x54d0, 0x54ad, 0x54c2, 0x54b4, 0x54d2, 0x54a7, 0x54a6, 0x54d3, 0x54d4, 0x5472, 0x54a3, 0x54d5, 0x54bb, 0x54bf, 0x54cc, 0x54d9, 0x54da, 0x54dc, 0x54a9, 0x54aa, 0x54a4, 0x54dd, 0x54cf, 0x54de, 0x551b, 0x54e7, 0x5520, 0x54fd, 0x5514, 0x54f3, 0x5522, 0x5523, 0x550f, 0x5511, 0x5527, 0x552a, 0x5567, 0x558f, 0x55b5, 0x5549, 0x556d, 0x5541, 0x5555, 0x553f, 0x5550, 0x553c, /* 0x60 */ 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555c, 0x558b, 0x55d2, 0x5583, 0x55b1, 0x55b9, 0x5588, 0x5581, 0x559f, 0x557e, 0x55d6, 0x5591, 0x557b, 0x55df, 0x55bd, 0x55be, 0x5594, 0x5599, 0x55ea, 0x55f7, 0x55c9, 0x561f, 0x55d1, 0x55eb, 0x55ec, 0x55d4, 0x55e6, 0x55dd, 0x55c4, 0x55ef, 0x55e5, 0x55f2, 0x55f3, 0x55cc, 0x55cd, 0x55e8, 0x55f5, 0x55e4, 0x8f94, 0x561e, 0x5608, 0x560c, 0x5601, 0x5624, 0x5623, 0x55fe, 0x5600, 0x5627, 0x562d, 0x5658, 0x5639, 0x5657, 0x562c, 0x564d, 0x5662, 0x5659, 0x565c, 0x564c, 0x5654, 0x5686, 0x5664, 0x5671, 0x566b, 0x567b, 0x567c, 0x5685, 0x5693, 0x56af, 0x56d4, 0x56d7, 0x56dd, 0x56e1, 0x56f5, 0x56eb, 0x56f9, 0x56ff, 0x5704, 0x570a, 0x5709, 0x571c, 0x5e0f, 0x5e19, 0x5e14, 0x5e11, 0x5e31, 0x5e3b, 0x5e3c, /* 0x61 */ 0x5e37, 0x5e44, 0x5e54, 0x5e5b, 0x5e5e, 0x5e61, 0x5c8c, 0x5c7a, 0x5c8d, 0x5c90, 0x5c96, 0x5c88, 0x5c98, 0x5c99, 0x5c91, 0x5c9a, 0x5c9c, 0x5cb5, 0x5ca2, 0x5cbd, 0x5cac, 0x5cab, 0x5cb1, 0x5ca3, 0x5cc1, 0x5cb7, 0x5cc4, 0x5cd2, 0x5ce4, 0x5ccb, 0x5ce5, 0x5d02, 0x5d03, 0x5d27, 0x5d26, 0x5d2e, 0x5d24, 0x5d1e, 0x5d06, 0x5d1b, 0x5d58, 0x5d3e, 0x5d34, 0x5d3d, 0x5d6c, 0x5d5b, 0x5d6f, 0x5d5d, 0x5d6b, 0x5d4b, 0x5d4a, 0x5d69, 0x5d74, 0x5d82, 0x5d99, 0x5d9d, 0x8c73, 0x5db7, 0x5dc5, 0x5f73, 0x5f77, 0x5f82, 0x5f87, 0x5f89, 0x5f8c, 0x5f95, 0x5f99, 0x5f9c, 0x5fa8, 0x5fad, 0x5fb5, 0x5fbc, 0x8862, 0x5f61, 0x72ad, 0x72b0, 0x72b4, 0x72b7, 0x72b8, 0x72c3, 0x72c1, 0x72ce, 0x72cd, 0x72d2, 0x72e8, 0x72ef, 0x72e9, 0x72f2, 0x72f4, 0x72f7, 0x7301, 0x72f3, 0x7303, 0x72fa, /* 0x62 */ 0x72fb, 0x7317, 0x7313, 0x7321, 0x730a, 0x731e, 0x731d, 0x7315, 0x7322, 0x7339, 0x7325, 0x732c, 0x7338, 0x7331, 0x7350, 0x734d, 0x7357, 0x7360, 0x736c, 0x736f, 0x737e, 0x821b, 0x5925, 0x98e7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x9974, 0x9977, 0x997d, 0x9980, 0x9984, 0x9987, 0x998a, 0x998d, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5e80, 0x5e91, 0x5e8b, 0x5e96, 0x5ea5, 0x5ea0, 0x5eb9, 0x5eb5, 0x5ebe, 0x5eb3, 0x8d53, 0x5ed2, 0x5ed1, 0x5edb, 0x5ee8, 0x5eea, 0x81ba, 0x5fc4, 0x5fc9, 0x5fd6, 0x5fcf, 0x6003, 0x5fee, 0x6004, 0x5fe1, 0x5fe4, 0x5ffe, 0x6005, 0x6006, 0x5fea, 0x5fed, 0x5ff8, 0x6019, 0x6035, 0x6026, 0x601b, 0x600f, 0x600d, 0x6029, 0x602b, 0x600a, 0x603f, 0x6021, 0x6078, 0x6079, 0x607b, 0x607a, 0x6042, /* 0x63 */ 0x606a, 0x607d, 0x6096, 0x609a, 0x60ad, 0x609d, 0x6083, 0x6092, 0x608c, 0x609b, 0x60ec, 0x60bb, 0x60b1, 0x60dd, 0x60d8, 0x60c6, 0x60da, 0x60b4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60f4, 0x6100, 0x610e, 0x612b, 0x614a, 0x6175, 0x61ac, 0x6194, 0x61a7, 0x61b7, 0x61d4, 0x61f5, 0x5fdd, 0x96b3, 0x95e9, 0x95eb, 0x95f1, 0x95f3, 0x95f5, 0x95f6, 0x95fc, 0x95fe, 0x9603, 0x9604, 0x9606, 0x9608, 0x960a, 0x960b, 0x960c, 0x960d, 0x960f, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961a, 0x4e2c, 0x723f, 0x6215, 0x6c35, 0x6c54, 0x6c5c, 0x6c4a, 0x6ca3, 0x6c85, 0x6c90, 0x6c94, 0x6c8c, 0x6c68, 0x6c69, 0x6c74, 0x6c76, 0x6c86, 0x6ca9, 0x6cd0, 0x6cd4, 0x6cad, 0x6cf7, 0x6cf8, 0x6cf1, 0x6cd7, 0x6cb2, 0x6ce0, 0x6cd6, 0x6cfa, 0x6ceb, 0x6cee, 0x6cb1, 0x6cd3, 0x6cef, 0x6cfe, /* 0x64 */ 0x6d39, 0x6d27, 0x6d0c, 0x6d43, 0x6d48, 0x6d07, 0x6d04, 0x6d19, 0x6d0e, 0x6d2b, 0x6d4d, 0x6d2e, 0x6d35, 0x6d1a, 0x6d4f, 0x6d52, 0x6d54, 0x6d33, 0x6d91, 0x6d6f, 0x6d9e, 0x6da0, 0x6d5e, 0x6d93, 0x6d94, 0x6d5c, 0x6d60, 0x6d7c, 0x6d63, 0x6e1a, 0x6dc7, 0x6dc5, 0x6dde, 0x6e0e, 0x6dbf, 0x6de0, 0x6e11, 0x6de6, 0x6ddd, 0x6dd9, 0x6e16, 0x6dab, 0x6e0c, 0x6dae, 0x6e2b, 0x6e6e, 0x6e4e, 0x6e6b, 0x6eb2, 0x6e5f, 0x6e86, 0x6e53, 0x6e54, 0x6e32, 0x6e25, 0x6e44, 0x6edf, 0x6eb1, 0x6e98, 0x6ee0, 0x6f2d, 0x6ee2, 0x6ea5, 0x6ea7, 0x6ebd, 0x6ebb, 0x6eb7, 0x6ed7, 0x6eb4, 0x6ecf, 0x6e8f, 0x6ec2, 0x6e9f, 0x6f62, 0x6f46, 0x6f47, 0x6f24, 0x6f15, 0x6ef9, 0x6f2f, 0x6f36, 0x6f4b, 0x6f74, 0x6f2a, 0x6f09, 0x6f29, 0x6f89, 0x6f8d, 0x6f8c, 0x6f78, 0x6f72, 0x6f7c, 0x6f7a, 0x6fd1, /* 0x65 */ 0x6fc9, 0x6fa7, 0x6fb9, 0x6fb6, 0x6fc2, 0x6fe1, 0x6fee, 0x6fde, 0x6fe0, 0x6fef, 0x701a, 0x7023, 0x701b, 0x7039, 0x7035, 0x704f, 0x705e, 0x5b80, 0x5b84, 0x5b95, 0x5b93, 0x5ba5, 0x5bb8, 0x752f, 0x9a9e, 0x6434, 0x5be4, 0x5bee, 0x8930, 0x5bf0, 0x8e47, 0x8b07, 0x8fb6, 0x8fd3, 0x8fd5, 0x8fe5, 0x8fee, 0x8fe4, 0x8fe9, 0x8fe6, 0x8ff3, 0x8fe8, 0x9005, 0x9004, 0x900b, 0x9026, 0x9011, 0x900d, 0x9016, 0x9021, 0x9035, 0x9036, 0x902d, 0x902f, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905b, 0x66b9, 0x9074, 0x907d, 0x9082, 0x9088, 0x9083, 0x908b, 0x5f50, 0x5f57, 0x5f56, 0x5f58, 0x5c3b, 0x54ab, 0x5c50, 0x5c59, 0x5b71, 0x5c63, 0x5c66, 0x7fbc, 0x5f2a, 0x5f29, 0x5f2d, 0x8274, 0x5f3c, 0x9b3b, 0x5c6e, 0x5981, 0x5983, 0x598d, 0x59a9, 0x59aa, 0x59a3, /* 0x66 */ 0x5997, 0x59ca, 0x59ab, 0x599e, 0x59a4, 0x59d2, 0x59b2, 0x59af, 0x59d7, 0x59be, 0x5a05, 0x5a06, 0x59dd, 0x5a08, 0x59e3, 0x59d8, 0x59f9, 0x5a0c, 0x5a09, 0x5a32, 0x5a34, 0x5a11, 0x5a23, 0x5a13, 0x5a40, 0x5a67, 0x5a4a, 0x5a55, 0x5a3c, 0x5a62, 0x5a75, 0x80ec, 0x5aaa, 0x5a9b, 0x5a77, 0x5a7a, 0x5abe, 0x5aeb, 0x5ab2, 0x5ad2, 0x5ad4, 0x5ab8, 0x5ae0, 0x5ae3, 0x5af1, 0x5ad6, 0x5ae6, 0x5ad8, 0x5adc, 0x5b09, 0x5b17, 0x5b16, 0x5b32, 0x5b37, 0x5b40, 0x5c15, 0x5c1c, 0x5b5a, 0x5b65, 0x5b73, 0x5b51, 0x5b53, 0x5b62, 0x9a75, 0x9a77, 0x9a78, 0x9a7a, 0x9a7f, 0x9a7d, 0x9a80, 0x9a81, 0x9a85, 0x9a88, 0x9a8a, 0x9a90, 0x9a92, 0x9a93, 0x9a96, 0x9a98, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9f, 0x9aa0, 0x9aa2, 0x9aa3, 0x9aa5, 0x9aa7, 0x7e9f, 0x7ea1, 0x7ea3, 0x7ea5, 0x7ea8, 0x7ea9, /* 0x67 */ 0x7ead, 0x7eb0, 0x7ebe, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec9, 0x7ecb, 0x7ecc, 0x7ed0, 0x7ed4, 0x7ed7, 0x7edb, 0x7ee0, 0x7ee1, 0x7ee8, 0x7eeb, 0x7eee, 0x7eef, 0x7ef1, 0x7ef2, 0x7f0d, 0x7ef6, 0x7efa, 0x7efb, 0x7efe, 0x7f01, 0x7f02, 0x7f03, 0x7f07, 0x7f08, 0x7f0b, 0x7f0c, 0x7f0f, 0x7f11, 0x7f12, 0x7f17, 0x7f19, 0x7f1c, 0x7f1b, 0x7f1f, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27, 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2f, 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f35, 0x5e7a, 0x757f, 0x5ddb, 0x753e, 0x9095, 0x738e, 0x7391, 0x73ae, 0x73a2, 0x739f, 0x73cf, 0x73c2, 0x73d1, 0x73b7, 0x73b3, 0x73c0, 0x73c9, 0x73c8, 0x73e5, 0x73d9, 0x987c, 0x740a, 0x73e9, 0x73e7, 0x73de, 0x73ba, 0x73f2, 0x740f, 0x742a, 0x745b, 0x7426, 0x7425, 0x7428, 0x7430, 0x742e, 0x742c, /* 0x68 */ 0x741b, 0x741a, 0x7441, 0x745c, 0x7457, 0x7455, 0x7459, 0x7477, 0x746d, 0x747e, 0x749c, 0x748e, 0x7480, 0x7481, 0x7487, 0x748b, 0x749e, 0x74a8, 0x74a9, 0x7490, 0x74a7, 0x74d2, 0x74ba, 0x97ea, 0x97eb, 0x97ec, 0x674c, 0x6753, 0x675e, 0x6748, 0x6769, 0x67a5, 0x6787, 0x676a, 0x6773, 0x6798, 0x67a7, 0x6775, 0x67a8, 0x679e, 0x67ad, 0x678b, 0x6777, 0x677c, 0x67f0, 0x6809, 0x67d8, 0x680a, 0x67e9, 0x67b0, 0x680c, 0x67d9, 0x67b5, 0x67da, 0x67b3, 0x67dd, 0x6800, 0x67c3, 0x67b8, 0x67e2, 0x680e, 0x67c1, 0x67fd, 0x6832, 0x6833, 0x6860, 0x6861, 0x684e, 0x6862, 0x6844, 0x6864, 0x6883, 0x681d, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683e, 0x684a, 0x6849, 0x6829, 0x68b5, 0x688f, 0x6874, 0x6877, 0x6893, 0x686b, 0x68c2, 0x696e, 0x68fc, 0x691f, 0x6920, 0x68f9, /* 0x69 */ 0x6924, 0x68f0, 0x690b, 0x6901, 0x6957, 0x68e3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695d, 0x6984, 0x696b, 0x6980, 0x6998, 0x6978, 0x6934, 0x69cc, 0x6987, 0x6988, 0x69ce, 0x6989, 0x6966, 0x6963, 0x6979, 0x699b, 0x69a7, 0x69bb, 0x69ab, 0x69ad, 0x69d4, 0x69b1, 0x69c1, 0x69ca, 0x69df, 0x6995, 0x69e0, 0x698d, 0x69ff, 0x6a2f, 0x69ed, 0x6a17, 0x6a18, 0x6a65, 0x69f2, 0x6a44, 0x6a3e, 0x6aa0, 0x6a50, 0x6a5b, 0x6a35, 0x6a8e, 0x6a79, 0x6a3d, 0x6a28, 0x6a58, 0x6a7c, 0x6a91, 0x6a90, 0x6aa9, 0x6a97, 0x6aab, 0x7337, 0x7352, 0x6b81, 0x6b82, 0x6b87, 0x6b84, 0x6b92, 0x6b93, 0x6b8d, 0x6b9a, 0x6b9b, 0x6ba1, 0x6baa, 0x8f6b, 0x8f6d, 0x8f71, 0x8f72, 0x8f73, 0x8f75, 0x8f76, 0x8f78, 0x8f77, 0x8f79, 0x8f7a, 0x8f7c, 0x8f7e, 0x8f81, 0x8f82, 0x8f84, 0x8f87, 0x8f8b, /* 0x6a */ 0x8f8d, 0x8f8e, 0x8f8f, 0x8f98, 0x8f9a, 0x8ece, 0x620b, 0x6217, 0x621b, 0x621f, 0x6222, 0x6221, 0x6225, 0x6224, 0x622c, 0x81e7, 0x74ef, 0x74f4, 0x74ff, 0x750f, 0x7511, 0x7513, 0x6534, 0x65ee, 0x65ef, 0x65f0, 0x660a, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66f7, 0x661d, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665f, 0x6654, 0x6641, 0x664f, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668c, 0x66a7, 0x669d, 0x66be, 0x66db, 0x66dc, 0x66e6, 0x66e9, 0x8d32, 0x8d33, 0x8d36, 0x8d3b, 0x8d3d, 0x8d40, 0x8d45, 0x8d46, 0x8d48, 0x8d49, 0x8d47, 0x8d4d, 0x8d55, 0x8d59, 0x89c7, 0x89ca, 0x89cb, 0x89cc, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x726e, 0x729f, 0x725d, 0x7266, 0x726f, 0x727e, 0x727f, 0x7284, 0x728b, 0x728d, 0x728f, 0x7292, 0x6308, 0x6332, 0x63b0, /* 0x6b */ 0x643f, 0x64d8, 0x8004, 0x6bea, 0x6bf3, 0x6bfd, 0x6bf5, 0x6bf9, 0x6c05, 0x6c07, 0x6c06, 0x6c0d, 0x6c15, 0x6c18, 0x6c19, 0x6c1a, 0x6c21, 0x6c29, 0x6c24, 0x6c2a, 0x6c32, 0x6535, 0x6555, 0x656b, 0x724d, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809f, 0x809c, 0x8093, 0x80bc, 0x670a, 0x80bd, 0x80b1, 0x80ab, 0x80ad, 0x80b4, 0x80b7, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80db, 0x80c2, 0x80c4, 0x80d9, 0x80cd, 0x80d7, 0x6710, 0x80dd, 0x80eb, 0x80f1, 0x80f4, 0x80ed, 0x810d, 0x810e, 0x80f2, 0x80fc, 0x6715, 0x8112, 0x8c5a, 0x8136, 0x811e, 0x812c, 0x8118, 0x8132, 0x8148, 0x814c, 0x8153, 0x8174, 0x8159, 0x815a, 0x8171, 0x8160, 0x8169, 0x817c, 0x817d, 0x816d, 0x8167, 0x584d, 0x5ab5, 0x8188, 0x8182, 0x8191, 0x6ed5, 0x81a3, 0x81aa, 0x81cc, 0x6726, 0x81ca, 0x81bb, /* 0x6c */ 0x81c1, 0x81a6, 0x6b24, 0x6b37, 0x6b39, 0x6b43, 0x6b46, 0x6b59, 0x98d1, 0x98d2, 0x98d3, 0x98d5, 0x98d9, 0x98da, 0x6bb3, 0x5f40, 0x6bc2, 0x89f3, 0x6590, 0x9f51, 0x6593, 0x65bc, 0x65c6, 0x65c4, 0x65c3, 0x65cc, 0x65ce, 0x65d2, 0x65d6, 0x7080, 0x709c, 0x7096, 0x709d, 0x70bb, 0x70c0, 0x70b7, 0x70ab, 0x70b1, 0x70e8, 0x70ca, 0x7110, 0x7113, 0x7116, 0x712f, 0x7131, 0x7173, 0x715c, 0x7168, 0x7145, 0x7172, 0x714a, 0x7178, 0x717a, 0x7198, 0x71b3, 0x71b5, 0x71a8, 0x71a0, 0x71e0, 0x71d4, 0x71e7, 0x71f9, 0x721d, 0x7228, 0x706c, 0x7118, 0x7166, 0x71b9, 0x623e, 0x623d, 0x6243, 0x6248, 0x6249, 0x793b, 0x7940, 0x7946, 0x7949, 0x795b, 0x795c, 0x7953, 0x795a, 0x7962, 0x7957, 0x7960, 0x796f, 0x7967, 0x797a, 0x7985, 0x798a, 0x799a, 0x79a7, 0x79b3, 0x5fd1, 0x5fd0, /* 0x6d */ 0x603c, 0x605d, 0x605a, 0x6067, 0x6041, 0x6059, 0x6063, 0x60ab, 0x6106, 0x610d, 0x615d, 0x61a9, 0x619d, 0x61cb, 0x61d1, 0x6206, 0x8080, 0x807f, 0x6c93, 0x6cf6, 0x6dfc, 0x77f6, 0x77f8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65ab, 0x782d, 0x781c, 0x781d, 0x7839, 0x783a, 0x783b, 0x781f, 0x783c, 0x7825, 0x782c, 0x7823, 0x7829, 0x784e, 0x786d, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784c, 0x786a, 0x789b, 0x7893, 0x789a, 0x7887, 0x789c, 0x78a1, 0x78a3, 0x78b2, 0x78b9, 0x78a5, 0x78d4, 0x78d9, 0x78c9, 0x78ec, 0x78f2, 0x7905, 0x78f4, 0x7913, 0x7924, 0x791e, 0x7934, 0x9f9b, 0x9ef9, 0x9efb, 0x9efc, 0x76f1, 0x7704, 0x770d, 0x76f9, 0x7707, 0x7708, 0x771a, 0x7722, 0x7719, 0x772d, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775a, 0x7768, /* 0x6e */ 0x7762, 0x7765, 0x777f, 0x778d, 0x777d, 0x7780, 0x778c, 0x7791, 0x779f, 0x77a0, 0x77b0, 0x77b5, 0x77bd, 0x753a, 0x7540, 0x754e, 0x754b, 0x7548, 0x755b, 0x7572, 0x7579, 0x7583, 0x7f58, 0x7f61, 0x7f5f, 0x8a48, 0x7f68, 0x7f74, 0x7f71, 0x7f79, 0x7f81, 0x7f7e, 0x76cd, 0x76e5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948b, 0x948a, 0x948c, 0x948d, 0x948f, 0x9490, 0x9494, 0x9497, 0x9495, 0x949a, 0x949b, 0x949c, 0x94a3, 0x94a4, 0x94ab, 0x94aa, 0x94ad, 0x94ac, 0x94af, 0x94b0, 0x94b2, 0x94b4, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bc, 0x94bd, 0x94bf, 0x94c4, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94d0, 0x94d1, 0x94d2, 0x94d5, 0x94d6, 0x94d7, 0x94d9, 0x94d8, 0x94db, 0x94de, 0x94df, 0x94e0, 0x94e2, 0x94e4, 0x94e5, 0x94e7, 0x94e8, 0x94ea, /* 0x6f */ 0x94e9, 0x94eb, 0x94ee, 0x94ef, 0x94f3, 0x94f4, 0x94f5, 0x94f7, 0x94f9, 0x94fc, 0x94fd, 0x94ff, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950a, 0x950d, 0x950e, 0x950f, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951b, 0x951d, 0x951e, 0x951f, 0x9522, 0x952a, 0x952b, 0x9529, 0x952c, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953c, 0x953e, 0x953f, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954c, 0x954e, 0x954f, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955b, 0x955e, 0x955f, 0x955d, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956f, 0x9571, 0x9572, 0x9573, 0x953a, 0x77e7, 0x77ec, 0x96c9, 0x79d5, 0x79ed, 0x79e3, 0x79eb, 0x7a06, 0x5d47, 0x7a03, 0x7a02, 0x7a1e, 0x7a14, /* 0x70 */ 0x7a39, 0x7a37, 0x7a51, 0x9ecf, 0x99a5, 0x7a70, 0x7688, 0x768e, 0x7693, 0x7699, 0x76a4, 0x74de, 0x74e0, 0x752c, 0x9e20, 0x9e22, 0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e32, 0x9e31, 0x9e36, 0x9e38, 0x9e37, 0x9e39, 0x9e3a, 0x9e3e, 0x9e41, 0x9e42, 0x9e44, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4b, 0x9e4c, 0x9e4e, 0x9e51, 0x9e55, 0x9e57, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5e, 0x9e63, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e71, 0x9e6d, 0x9e73, 0x7592, 0x7594, 0x7596, 0x75a0, 0x759d, 0x75ac, 0x75a3, 0x75b3, 0x75b4, 0x75b8, 0x75c4, 0x75b1, 0x75b0, 0x75c3, 0x75c2, 0x75d6, 0x75cd, 0x75e3, 0x75e8, 0x75e6, 0x75e4, 0x75eb, 0x75e7, 0x7603, 0x75f1, 0x75fc, 0x75ff, 0x7610, 0x7600, 0x7605, 0x760c, 0x7617, 0x760a, 0x7625, 0x7618, 0x7615, 0x7619, /* 0x71 */ 0x761b, 0x763c, 0x7622, 0x7620, 0x7640, 0x762d, 0x7630, 0x763f, 0x7635, 0x7643, 0x763e, 0x7633, 0x764d, 0x765e, 0x7654, 0x765c, 0x7656, 0x766b, 0x766f, 0x7fca, 0x7ae6, 0x7a78, 0x7a79, 0x7a80, 0x7a86, 0x7a88, 0x7a95, 0x7aa6, 0x7aa0, 0x7aac, 0x7aa8, 0x7aad, 0x7ab3, 0x8864, 0x8869, 0x8872, 0x887d, 0x887f, 0x8882, 0x88a2, 0x88c6, 0x88b7, 0x88bc, 0x88c9, 0x88e2, 0x88ce, 0x88e3, 0x88e5, 0x88f1, 0x891a, 0x88fc, 0x88e8, 0x88fe, 0x88f0, 0x8921, 0x8919, 0x8913, 0x891b, 0x890a, 0x8934, 0x892b, 0x8936, 0x8941, 0x8966, 0x897b, 0x758b, 0x80e5, 0x76b2, 0x76b4, 0x77dc, 0x8012, 0x8014, 0x8016, 0x801c, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800b, 0x8035, 0x8043, 0x8046, 0x804d, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, /* 0x72 */ 0x9889, 0x988c, 0x988d, 0x988f, 0x9894, 0x989a, 0x989b, 0x989e, 0x989f, 0x98a1, 0x98a2, 0x98a5, 0x98a6, 0x864d, 0x8654, 0x866c, 0x866e, 0x867f, 0x867a, 0x867c, 0x867b, 0x86a8, 0x868d, 0x868b, 0x86ac, 0x869d, 0x86a7, 0x86a3, 0x86aa, 0x8693, 0x86a9, 0x86b6, 0x86c4, 0x86b5, 0x86ce, 0x86b0, 0x86ba, 0x86b1, 0x86af, 0x86c9, 0x86cf, 0x86b4, 0x86e9, 0x86f1, 0x86f2, 0x86ed, 0x86f3, 0x86d0, 0x8713, 0x86de, 0x86f4, 0x86df, 0x86d8, 0x86d1, 0x8703, 0x8707, 0x86f8, 0x8708, 0x870a, 0x870d, 0x8709, 0x8723, 0x873b, 0x871e, 0x8725, 0x872e, 0x871a, 0x873e, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873f, 0x8782, 0x8722, 0x877d, 0x877e, 0x877b, 0x8760, 0x8770, 0x874c, 0x876e, 0x878b, 0x8753, 0x8763, 0x877c, 0x8764, 0x8759, 0x8765, 0x8793, 0x87af, 0x87a8, 0x87d2, /* 0x73 */ 0x87c6, 0x8788, 0x8785, 0x87ad, 0x8797, 0x8783, 0x87ab, 0x87e5, 0x87ac, 0x87b5, 0x87b3, 0x87cb, 0x87d3, 0x87bd, 0x87d1, 0x87c0, 0x87ca, 0x87db, 0x87ea, 0x87e0, 0x87ee, 0x8816, 0x8813, 0x87fe, 0x880a, 0x881b, 0x8821, 0x8839, 0x883c, 0x7f36, 0x7f42, 0x7f44, 0x7f45, 0x8210, 0x7afa, 0x7afd, 0x7b08, 0x7b03, 0x7b04, 0x7b15, 0x7b0a, 0x7b2b, 0x7b0f, 0x7b47, 0x7b38, 0x7b2a, 0x7b19, 0x7b2e, 0x7b31, 0x7b20, 0x7b25, 0x7b24, 0x7b33, 0x7b3e, 0x7b1e, 0x7b58, 0x7b5a, 0x7b45, 0x7b75, 0x7b4c, 0x7b5d, 0x7b60, 0x7b6e, 0x7b7b, 0x7b62, 0x7b72, 0x7b71, 0x7b90, 0x7ba6, 0x7ba7, 0x7bb8, 0x7bac, 0x7b9d, 0x7ba8, 0x7b85, 0x7baa, 0x7b9c, 0x7ba2, 0x7bab, 0x7bb4, 0x7bd1, 0x7bc1, 0x7bcc, 0x7bdd, 0x7bda, 0x7be5, 0x7be6, 0x7bea, 0x7c0c, 0x7bfe, 0x7bfc, 0x7c0f, 0x7c16, 0x7c0b, /* 0x74 */ 0x7c1f, 0x7c2a, 0x7c26, 0x7c38, 0x7c41, 0x7c40, 0x81fe, 0x8201, 0x8202, 0x8204, 0x81ec, 0x8844, 0x8221, 0x8222, 0x8223, 0x822d, 0x822f, 0x8228, 0x822b, 0x8238, 0x823b, 0x8233, 0x8234, 0x823e, 0x8244, 0x8249, 0x824b, 0x824f, 0x825a, 0x825f, 0x8268, 0x887e, 0x8885, 0x8888, 0x88d8, 0x88df, 0x895e, 0x7f9d, 0x7f9f, 0x7fa7, 0x7faf, 0x7fb0, 0x7fb2, 0x7c7c, 0x6549, 0x7c91, 0x7c9d, 0x7c9c, 0x7c9e, 0x7ca2, 0x7cb2, 0x7cbc, 0x7cbd, 0x7cc1, 0x7cc7, 0x7ccc, 0x7ccd, 0x7cc8, 0x7cc5, 0x7cd7, 0x7ce8, 0x826e, 0x66a8, 0x7fbf, 0x7fce, 0x7fd5, 0x7fe5, 0x7fe1, 0x7fe6, 0x7fe9, 0x7fee, 0x7ff3, 0x7cf8, 0x7d77, 0x7da6, 0x7dae, 0x7e47, 0x7e9b, 0x9eb8, 0x9eb4, 0x8d73, 0x8d84, 0x8d94, 0x8d91, 0x8db1, 0x8d67, 0x8d6d, 0x8c47, 0x8c49, 0x914a, 0x9150, 0x914e, 0x914f, 0x9164, /* 0x75 */ 0x9162, 0x9161, 0x9170, 0x9169, 0x916f, 0x917d, 0x917e, 0x9172, 0x9174, 0x9179, 0x918c, 0x9185, 0x9190, 0x918d, 0x9191, 0x91a2, 0x91a3, 0x91aa, 0x91ad, 0x91ae, 0x91af, 0x91b5, 0x91b4, 0x91ba, 0x8c55, 0x9e7e, 0x8db8, 0x8deb, 0x8e05, 0x8e59, 0x8e69, 0x8db5, 0x8dbf, 0x8dbc, 0x8dba, 0x8dc4, 0x8dd6, 0x8dd7, 0x8dda, 0x8dde, 0x8dce, 0x8dcf, 0x8ddb, 0x8dc6, 0x8dec, 0x8df7, 0x8df8, 0x8de3, 0x8df9, 0x8dfb, 0x8de4, 0x8e09, 0x8dfd, 0x8e14, 0x8e1d, 0x8e1f, 0x8e2c, 0x8e2e, 0x8e23, 0x8e2f, 0x8e3a, 0x8e40, 0x8e39, 0x8e35, 0x8e3d, 0x8e31, 0x8e49, 0x8e41, 0x8e42, 0x8e51, 0x8e52, 0x8e4a, 0x8e70, 0x8e76, 0x8e7c, 0x8e6f, 0x8e74, 0x8e85, 0x8e8f, 0x8e94, 0x8e90, 0x8e9c, 0x8e9e, 0x8c78, 0x8c82, 0x8c8a, 0x8c85, 0x8c98, 0x8c94, 0x659b, 0x89d6, 0x89de, 0x89da, 0x89dc, /* 0x76 */ 0x89e5, 0x89eb, 0x89ef, 0x8a3e, 0x8b26, 0x9753, 0x96e9, 0x96f3, 0x96ef, 0x9706, 0x9701, 0x9708, 0x970f, 0x970e, 0x972a, 0x972d, 0x9730, 0x973e, 0x9f80, 0x9f83, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8c, 0x9efe, 0x9f0b, 0x9f0d, 0x96b9, 0x96bc, 0x96bd, 0x96ce, 0x96d2, 0x77bf, 0x96e0, 0x928e, 0x92ae, 0x92c8, 0x933e, 0x936a, 0x93ca, 0x938f, 0x943e, 0x946b, 0x9c7f, 0x9c82, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x7a23, 0x9c8b, 0x9c8e, 0x9c90, 0x9c91, 0x9c92, 0x9c94, 0x9c95, 0x9c9a, 0x9c9b, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9cab, 0x9cad, 0x9cae, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cca, 0x9ccb, /* 0x77 */ 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cdc, 0x9cdd, 0x9cdf, 0x9ce2, 0x977c, 0x9785, 0x9791, 0x9792, 0x9794, 0x97af, 0x97ab, 0x97a3, 0x97b2, 0x97b4, 0x9ab1, 0x9ab0, 0x9ab7, 0x9e58, 0x9ab6, 0x9aba, 0x9abc, 0x9ac1, 0x9ac0, 0x9ac5, 0x9ac2, 0x9acb, 0x9acc, 0x9ad1, 0x9b45, 0x9b43, 0x9b47, 0x9b49, 0x9b48, 0x9b4d, 0x9b51, 0x98e8, 0x990d, 0x992e, 0x9955, 0x9954, 0x9adf, 0x9ae1, 0x9ae6, 0x9aef, 0x9aeb, 0x9afb, 0x9aed, 0x9af9, 0x9b08, 0x9b0f, 0x9b13, 0x9b1f, 0x9b23, 0x9ebd, 0x9ebe, 0x7e3b, 0x9e82, 0x9e87, 0x9e88, 0x9e8b, 0x9e92, 0x93d6, 0x9e9d, 0x9e9f, 0x9edb, 0x9edc, 0x9edd, 0x9ee0, 0x9edf, 0x9ee2, 0x9ee9, 0x9ee7, 0x9ee5, 0x9eea, 0x9eef, 0x9f22, 0x9f2c, 0x9f2f, 0x9f39, 0x9f37, 0x9f3d, 0x9f3e, 0x9f44, }; static int gb2312_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x29) || (c1 >= 0x30 && c1 <= 0x77)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 831) wc = gb2312_2uni_page21[i]; } else { if (i < 8178) wc = gb2312_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short gb2312_2charset[7445] = { 0x2168, 0x216c, 0x2127, 0x2163, 0x2140, 0x2141, 0x2824, 0x2822, 0x2828, 0x2826, 0x283a, 0x282c, 0x282a, 0x2830, 0x282e, 0x2142, 0x2834, 0x2832, 0x2839, 0x2821, 0x2825, 0x2827, 0x2829, 0x282d, 0x2831, 0x2823, 0x282b, 0x282f, 0x2833, 0x2835, 0x2836, 0x2837, 0x2838, 0x2126, 0x2125, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x212a, 0x212c, 0x212e, 0x212f, 0x2130, 0x2131, 0x212d, 0x216b, 0x2164, 0x2165, 0x2179, 0x2166, 0x216d, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x217b, 0x217c, 0x217a, 0x217d, 0x214a, 0x2147, 0x2146, 0x214c, 0x2158, 0x215e, 0x214f, 0x214e, 0x2144, 0x2145, 0x2149, 0x2148, 0x2152, 0x2153, 0x2160, 0x215f, 0x2143, 0x214b, 0x2157, 0x2156, 0x2155, 0x2159, 0x2154, 0x215c, 0x215d, 0x215a, 0x215b, 0x2151, 0x214d, 0x2150, 0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, 0x2260, 0x2261, 0x2262, 0x2245, 0x2246, 0x2247, 0x2248, 0x2249, 0x224a, 0x224b, 0x224c, 0x224d, 0x224e, 0x224f, 0x2250, 0x2251, 0x2252, 0x2253, 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, 0x2231, 0x2232, 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, 0x223a, 0x223b, 0x223c, 0x223d, 0x223e, 0x223f, 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2924, 0x2925, 0x2926, 0x2927, 0x2928, 0x2929, 0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, 0x2930, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2176, 0x2175, 0x2178, 0x2177, 0x2174, 0x2173, 0x2170, 0x2172, 0x2171, 0x216f, 0x216e, 0x2162, 0x2161, 0x2121, 0x2122, 0x2123, 0x2128, 0x2129, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, 0x213e, 0x213f, 0x217e, 0x2132, 0x2133, 0x213c, 0x213d, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2124, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2867, 0x2868, 0x2869, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e, 0x523b, 0x3621, 0x465f, 0x4d72, 0x5549, 0x487d, 0x494f, 0x4f42, 0x5822, 0x323b, 0x536b, 0x5824, 0x3373, 0x5728, 0x4752, 0x5827, 0x4a40, 0x4770, 0x317b, 0x5235, 0x3454, 0x362b, 0x4b3f, 0x5829, 0x362a, 0x413d, 0x514f, 0x4925, 0x582d, 0x3876, 0x513e, 0x635c, 0x5650, 0x3761, 0x342e, 0x4159, 0x583c, 0x4d68, 0x3524, 0x4e2a, 0x5677, 0x4076, 0x3e59, 0x582f, 0x444b, 0x3e43, 0x5831, 0x4334, 0x5265, 0x562e, 0x4e5a, 0x5527, 0x3a75, 0x3726, 0x4056, 0x4639, 0x4552, 0x4747, 0x3954, 0x334b, 0x5252, 0x583f, 0x3e45, 0x4672, 0x5232, 0x4f30, 0x4f67, 0x4a69, 0x5840, 0x4272, 0x4252, 0x4869, 0x472c, 0x414b, 0x5368, 0x5579, 0x4a42, 0x367e, 0x5821, 0x535a, 0x3f77, 0x5446, 0x3b25, 0x5841, 0x4e65, 0x3e2e, 0x5828, 0x5147, 0x5029, 0x583d, 0x596f, 0x4d76, 0x3f3a, 0x3d3b, 0x3a25, 0x5260, 0x327a, 0x3a60, 0x4436, 0x4f6d, 0x3e29, 0x4d24, 0x4141, 0x4757, 0x5971, 0x5974, 0x484b, 0x5869, 0x525a, 0x4a32, 0x484a, 0x586c, 0x586a, 0x5846, 0x3d76, 0x464d, 0x3370, 0x586b, 0x3d71, 0x3d69, 0x4854, 0x3453, 0x4258, 0x3256, 0x5750, 0x4a4b, 0x4b7b, 0x554c, 0x3836, 0x4f49, 0x595a, 0x5870, 0x472a, 0x586e, 0x347a, 0x416e, 0x5254, 0x586d, 0x5247, 0x586f, 0x4347, 0x5176, 0x5659, 0x5872, 0x5875, 0x3c7e, 0x3c5b, 0x484e, 0x375d, 0x3742, 0x4673, 0x5878, 0x5241, 0x4e69, 0x3c3f, 0x377c, 0x3725, 0x505d, 0x565a, 0x5345, 0x3b6f, 0x3b61, 0x5871, 0x4921, 0x4e30, 0x342b, 0x5873, 0x494b, 0x5876, 0x4257, 0x5877, 0x4e31, 0x5879, 0x322e, 0x3940, 0x5923, 0x3069, 0x4166, 0x496c, 0x4b45, 0x4b46, 0x5924, 0x3568, 0x352b, 0x4e3b, 0x354d, 0x5721, 0x5774, 0x5353, 0x4c65, 0x3a4e, 0x5922, 0x595c, 0x5360, 0x587d, 0x3770, 0x5777, 0x587e, 0x587a, 0x5921, 0x4463, 0x5336, 0x5874, 0x595d, 0x587b, 0x4565, 0x4050, 0x5170, 0x305b, 0x3c51, 0x5926, 0x5925, 0x592c, 0x592e, 0x592b, 0x4a39, 0x5929, 0x5636, 0x335e, 0x5928, 0x407d, 0x4a4c, 0x592a, 0x5927, 0x5930, 0x3631, 0x3929, 0x5240, 0x4f40, 0x4242, 0x3d44, 0x556c, 0x3260, 0x4748, 0x3f6b, 0x592d, 0x592f, 0x4e6a, 0x3a6e, 0x4756, 0x3163, 0x3459, 0x366d, 0x5934, 0x3f21, 0x595e, 0x474e, 0x407e, 0x5938, 0x4b57, 0x377d, 0x5935, 0x5937, 0x3123, 0x5361, 0x5939, 0x5045, 0x5936, 0x5931, 0x5932, 0x4129, 0x5933, 0x3c73, 0x505e, 0x3829, 0x3e63, 0x593d, 0x593a, 0x3033, 0x5942, 0x5944, 0x3136, 0x593f, 0x3539, 0x3e73, 0x4c48, 0x3a72, 0x5250, 0x5943, 0x3d68, 0x332b, 0x5945, 0x3e6b, 0x5946, 0x593b, 0x445f, 0x593e, 0x5941, 0x5940, 0x552e, 0x5635, 0x4763, 0x5948, 0x3c59, 0x594a, 0x593c, 0x594b, 0x462b, 0x5949, 0x5776, 0x4d23, 0x3d21, 0x594c, 0x453c, 0x4d35, 0x594d, 0x5947, 0x3325, 0x3f7e, 0x3835, 0x407c, 0x3078, 0x3476, 0x594e, 0x594f, 0x3422, 0x5950, 0x345f, 0x3041, 0x5951, 0x4935, 0x4f71, 0x5952, 0x4145, 0x5956, 0x492e, 0x5955, 0x5954, 0x5957, 0x4b5b, 0x3d29, 0x4627, 0x5953, 0x5958, 0x5959, 0x4865, 0x405c, 0x3679, 0x5823, 0x544a, 0x542a, 0x5056, 0x3364, 0x5557, 0x4f48, 0x3962, 0x3f4b, 0x4362, 0x3652, 0x4d43, 0x596e, 0x5970, 0x3533, 0x3635, 0x3e24, 0x486b, 0x482b, 0x304b, 0x392b, 0x4179, 0x5962, 0x403c, 0x3932, 0x3958, 0x504b, 0x3178, 0x4664, 0x3e5f, 0x3564, 0x5748, 0x5178, 0x3c66, 0x4a5e, 0x3c3d, 0x5966, 0x5867, 0x445a, 0x3854, 0x483d, 0x3261, 0x5459, 0x4330, 0x4361, 0x5a22, 0x485f, 0x5034, 0x3e7c, 0x4529, 0x395a, 0x5a23, 0x5429, 0x5a24, 0x597b, 0x362c, 0x376b, 0x3179, 0x597c, 0x3365, 0x3e76, 0x3f76, 0x5231, 0x4064, 0x3633, 0x597e, 0x597d, 0x3e3b, 0x4660, 0x573c, 0x5a21, 0x4139, 0x3572, 0x4168, 0x3c75, 0x3455, 0x415d, 0x447d, 0x3c38, 0x3732, 0x376f, 0x596c, 0x463e, 0x3f2d, 0x3b4b, 0x354a, 0x5b49, 0x5057, 0x4d39, 0x303c, 0x3376, 0x3b77, 0x5b4a, 0x3a2f, 0x5464, 0x3536, 0x3573, 0x5856, 0x4850, 0x3756, 0x4750, 0x5857, 0x3f2f, 0x5b3b, 0x5858, 0x504c, 0x3b2e, 0x6b3e, 0x4150, 0x4175, 0x5472, 0x3855, 0x3434, 0x3375, 0x493e, 0x4550, 0x4559, 0x407b, 0x3170, 0x5859, 0x394e, 0x353d, 0x585a, 0x5646, 0x4b22, 0x482f, 0x4932, 0x344c, 0x3f4c, 0x3974, 0x585b, 0x585c, 0x3667, 0x3c41, 0x4c6a, 0x4f77, 0x585d, 0x4730, 0x3950, 0x3d23, 0x4c5e, 0x464a, 0x5860, 0x585e, 0x585f, 0x307e, 0x3e67, 0x4a23, 0x3c74, 0x3831, 0x386e, 0x5862, 0x3d4b, 0x5864, 0x5863, 0x457c, 0x5865, 0x5866, 0x4126, 0x4830, 0x306c, 0x3926, 0x3c53, 0x4e71, 0x5b3d, 0x4153, 0x362f, 0x567a, 0x452c, 0x3d59, 0x5b3e, 0x5b3f, 0x4078, 0x3e22, 0x404d, 0x5b40, 0x4a46, 0x322a, 0x5342, 0x4363, 0x512b, 0x5b42, 0x4055, 0x5b43, 0x3f31, 0x443c, 0x475a, 0x5b44, 0x5968, 0x4957, 0x3934, 0x4e70, 0x5448, 0x307c, 0x3452, 0x5059, 0x5969, 0x5e4b, 0x596b, 0x5830, 0x3b2f, 0x3131, 0x3357, 0x584e, 0x5451, 0x3d33, 0x3f6f, 0x4f3b, 0x5850, 0x374b, 0x5851, 0x4625, 0x4778, 0x523d, 0x5852, 0x4464, 0x4a2e, 0x4727, 0x5826, 0x497d, 0x4e67, 0x3b5c, 0x306b, 0x3b2a, 0x502d, 0x3130, 0x5764, 0x573f, 0x3525, 0x4274, 0x444f, 0x3229, 0x3237, 0x3165, 0x5f32, 0x553c, 0x3f28, 0x422c, 0x5855, 0x4231, 0x5854, 0x4e54, 0x5a60, 0x4e40, 0x5834, 0x432e, 0x5321, 0x4e23, 0x3c34, 0x4834, 0x4251, 0x3e6d, 0x5036, 0x5a61, 0x4764, 0x3327, 0x3672, 0x4c7c, 0x407a, 0x4077, 0x5139, 0x5161, 0x5847, 0x325e, 0x4065, 0x3a71, 0x5848, 0x542d, 0x4f61, 0x5849, 0x584a, 0x4f43, 0x3378, 0x3e47, 0x584b, 0x5b4c, 0x4825, 0x4f58, 0x487e, 0x324e, 0x5356, 0x3266, 0x3c30, 0x5351, 0x4b2b, 0x3734, 0x3722, 0x4a65, 0x4821, 0x4a5c, 0x3164, 0x5070, 0x4551, 0x5b45, 0x357e, 0x3f5a, 0x3945, 0x3e64, 0x416d, 0x5f36, 0x5f35, 0x563b, 0x3d50, 0x5559, 0x3048, 0x3623, 0x3f49, 0x4c28, 0x5f33, 0x4a37, 0x5352, 0x584f, 0x5236, 0x3a45, 0x4b3e, 0x4c3e, 0x5f37, 0x3570, 0x5f34, 0x5375, 0x3354, 0x3877, 0x5f3a, 0x3a4f, 0x3c2a, 0x3575, 0x4d2c, 0x437b, 0x3a73, 0x4074, 0x4d42, 0x4f72, 0x5f38, 0x4f45, 0x4240, 0x5f39, 0x4270, 0x3e7d, 0x415f, 0x4d4c, 0x5277, 0x374d, 0x5f41, 0x5f44, 0x3771, 0x3049, 0x3656, 0x3754, 0x3a2c, 0x4c7d, 0x3f54, 0x4b31, 0x4674, 0x5628, 0x5f45, 0x4e62, 0x3333, 0x4e7c, 0x3435, 0x4e47, 0x3a70, 0x4e61, 0x513d, 0x5f40, 0x3474, 0x334a, 0x3866, 0x5f3b, 0x4445, 0x5f3c, 0x5f3d, 0x5f3e, 0x453b, 0x5f3f, 0x5f42, 0x5431, 0x5f43, 0x473a, 0x4e58, 0x4458, 0x5f4a, 0x5f4f, 0x565c, 0x5f49, 0x5f5a, 0x4e36, 0x3a47, 0x5f4e, 0x5f48, 0x455e, 0x496b, 0x3a74, 0x437c, 0x3e57, 0x5f46, 0x5f4d, 0x4558, 0x5526, 0x3a4d, 0x3e4c, 0x533d, 0x3840, 0x5664, 0x5f47, 0x393e, 0x3f27, 0x417c, 0x5f4b, 0x5f4c, 0x5f50, 0x5f5b, 0x5f65, 0x5f57, 0x5f56, 0x5749, 0x5f63, 0x5f64, 0x656b, 0x5227, 0x5f52, 0x3f29, 0x545b, 0x3f48, 0x5f54, 0x4f4c, 0x5f5d, 0x514a, 0x5f5e, 0x3027, 0x4637, 0x5f53, 0x3a65, 0x365f, 0x4d5b, 0x397e, 0x5455, 0x5f5f, 0x4f6c, 0x3025, 0x5f67, 0x5f51, 0x5146, 0x5f55, 0x5f58, 0x5f59, 0x5f5c, 0x3b29, 0x5f60, 0x5f61, 0x5f62, 0x5f66, 0x5f68, 0x5334, 0x3867, 0x4536, 0x5f6a, 0x495a, 0x4128, 0x4444, 0x3f5e, 0x4f78, 0x555c, 0x5f6e, 0x3238, 0x3a5f, 0x5f6c, 0x5b41, 0x5164, 0x4b74, 0x343d, 0x3026, 0x5f71, 0x4c46, 0x5f72, 0x5f6d, 0x5f69, 0x5f6b, 0x5f6f, 0x5f70, 0x3b3d, 0x5f73, 0x5f74, 0x3b23, 0x4a5b, 0x4e28, 0x6027, 0x332a, 0x6026, 0x6021, 0x5f7e, 0x4d59, 0x5f7c, 0x5f7a, 0x3f50, 0x5744, 0x494c, 0x5f78, 0x3021, 0x5f7d, 0x5f7b, 0x6022, 0x6028, 0x3748, 0x4621, 0x4936, 0x4032, 0x5f75, 0x453e, 0x5844, 0x5f79, 0x4476, 0x6023, 0x6024, 0x6025, 0x5025, 0x6034, 0x4c64, 0x6031, 0x3f26, 0x602f, 0x4e39, 0x602b, 0x4946, 0x402e, 0x602e, 0x3a6d, 0x3a30, 0x6029, 0x5f76, 0x6033, 0x6038, 0x342d, 0x6039, 0x4f32, 0x3a48, 0x6030, 0x507a, 0x602c, 0x547b, 0x5f77, 0x4567, 0x602d, 0x5377, 0x6036, 0x6037, 0x6044, 0x5061, 0x603c, 0x6049, 0x604a, 0x603e, 0x602a, 0x4924, 0x6041, 0x6032, 0x4a48, 0x6043, 0x6035, 0x4e4b, 0x4b43, 0x604d, 0x6046, 0x6042, 0x604b, 0x603a, 0x603f, 0x6040, 0x6045, 0x6047, 0x6048, 0x604c, 0x603b, 0x4b54, 0x6055, 0x6056, 0x6052, 0x6050, 0x3c4e, 0x6051, 0x3842, 0x5845, 0x506a, 0x426f, 0x604f, 0x603d, 0x6054, 0x6053, 0x6057, 0x605c, 0x6058, 0x5676, 0x3330, 0x576c, 0x4b3b, 0x605a, 0x4e7b, 0x3a59, 0x6061, 0x605d, 0x522d, 0x6062, 0x605b, 0x6059, 0x605f, 0x6060, 0x605e, 0x6064, 0x4677, 0x582c, 0x546b, 0x6066, 0x4a49, 0x6065, 0x3841, 0x6067, 0x6068, 0x6069, 0x6063, 0x3a3f, 0x4c67, 0x606a, 0x4f79, 0x606b, 0x4842, 0x3d40, 0x4452, 0x606c, 0x606d, 0x4774, 0x4b44, 0x606e, 0x3b58, 0x5836, 0x5272, 0x606f, 0x4d45, 0x365a, 0x6071, 0x5430, 0x4027, 0x3451, 0x4e27, 0x6070, 0x6072, 0x394c, 0x397a, 0x4d3c, 0x6073, 0x4654, 0x6074, 0x5432, 0x4826, 0x6076, 0x6075, 0x6077, 0x4d41, 0x4a25, 0x545a, 0x5b57, 0x5b59, 0x5b58, 0x3967, 0x5b5c, 0x5b5d, 0x3558, 0x5b5a, 0x5b5b, 0x3321, 0x5b5f, 0x3b78, 0x5637, 0x5b60, 0x3e79, 0x373b, 0x5b50, 0x4c2e, 0x3f32, 0x3b35, 0x5778, 0x3f53, 0x3f69, 0x3c61, 0x4c33, 0x5b5e, 0x3053, 0x4e6b, 0x3758, 0x5739, 0x4642, 0x4024, 0x4c39, 0x5b67, 0x5b61, 0x463a, 0x5b63, 0x5b68, 0x4577, 0x5b6a, 0x5b69, 0x3f40, 0x5b66, 0x5b65, 0x3439, 0x402c, 0x4222, 0x5b62, 0x5b64, 0x504d, 0x5b6d, 0x405d, 0x5b72, 0x3662, 0x5b73, 0x5b52, 0x3938, 0x542b, 0x5b6c, 0x3f51, 0x5b70, 0x5b51, 0x3566, 0x5b6b, 0x3f65, 0x5b6e, 0x5b71, 0x5b79, 0x3921, 0x3023, 0x4271, 0x3347, 0x5b6f, 0x5b78, 0x4652, 0x5b74, 0x5b75, 0x5b77, 0x5b76, 0x5b7e, 0x5372, 0x323a, 0x5b7d, 0x5c24, 0x5b7b, 0x5b7a, 0x5b7c, 0x4560, 0x3b79, 0x5c23, 0x5c25, 0x4c43, 0x3651, 0x5d40, 0x5c21, 0x5c22, 0x4735, 0x3669, 0x5c27, 0x5c26, 0x5c29, 0x3124, 0x354c, 0x3f30, 0x515f, 0x3642, 0x5c28, 0x4b7a, 0x6b73, 0x4b5c, 0x4b7e, 0x4c41, 0x487b, 0x5c2a, 0x4c6e, 0x5c2b, 0x5b53, 0x5c2f, 0x5c2c, 0x3e33, 0x4a7b, 0x5c2d, 0x494a, 0x4439, 0x473d, 0x5c2e, 0x5476, 0x5066, 0x442b, 0x3655, 0x5b54, 0x315a, 0x5b55, 0x5b56, 0x3a3e, 0x4840, 0x4a3f, 0x4849, 0x5733, 0x4979, 0x3f47, 0x3a78, 0x523c, 0x623a, 0x3426, 0x3138, 0x3834, 0x4f44, 0x5967, 0x4f26, 0x4d62, 0x596d, 0x3660, 0x5239, 0x393b, 0x6239, 0x6237, 0x3473, 0x4c6c, 0x4c2b, 0x3772, 0x5832, 0x516b, 0x3a3b, 0x4a27, 0x4d37, 0x5244, 0x3f64, 0x3c50, 0x3661, 0x5e45, 0x5e46, 0x5b3c, 0x5159, 0x4666, 0x444e, 0x376e, 0x375c, 0x3f7c, 0x5760, 0x4675, 0x313c, 0x5e48, 0x3d31, 0x4c57, 0x5e4a, 0x5e49, 0x356c, 0x495d, 0x3042, 0x452e, 0x452b, 0x444c, 0x3c69, 0x4b7d, 0x3a43, 0x6579, 0x4867, 0x657a, 0x4d7d, 0x5731, 0x383e, 0x4268, 0x4851, 0x657b, 0x364a, 0x3c4b, 0x517d, 0x6621, 0x436e, 0x6624, 0x657e, 0x6625, 0x4d57, 0x3741, 0x657c, 0x657d, 0x6623, 0x445d, 0x6628, 0x6627, 0x4343, 0x465e, 0x662a, 0x4437, 0x6622, 0x4a3c, 0x3d63, 0x3943, 0x6626, 0x5055, 0x4e2f, 0x6629, 0x6630, 0x5226, 0x3d2a, 0x662d, 0x662f, 0x4051, 0x524c, 0x3c27, 0x6631, 0x5276, 0x574b, 0x4d7e, 0x4d5e, 0x4226, 0x662b, 0x662c, 0x3d3f, 0x662e, 0x6633, 0x6632, 0x6636, 0x6638, 0x446f, 0x4448, 0x3e6a, 0x496f, 0x6637, 0x3670, 0x4364, 0x5369, 0x6634, 0x6635, 0x4822, 0x663d, 0x6639, 0x4645, 0x4d71, 0x663b, 0x663c, 0x3b69, 0x663e, 0x663a, 0x4037, 0x5324, 0x663f, 0x4974, 0x6643, 0x6644, 0x5076, 0x433d, 0x4344, 0x6642, 0x6641, 0x6647, 0x4f31, 0x6b74, 0x664a, 0x6645, 0x3c5e, 0x4929, 0x3c35, 0x4f53, 0x6648, 0x6649, 0x664e, 0x6650, 0x6651, 0x664b, 0x3555, 0x664c, 0x664f, 0x445b, 0x6646, 0x664d, 0x6652, 0x6654, 0x6653, 0x6655, 0x5978, 0x6656, 0x6657, 0x5753, 0x665d, 0x665e, 0x3f57, 0x5450, 0x5756, 0x3466, 0x4b6f, 0x665a, 0x5843, 0x574e, 0x5022, 0x434f, 0x665f, 0x3c3e, 0x3942, 0x665b, 0x5127, 0x3a22, 0x424f, 0x582b, 0x4a6b, 0x656e, 0x665c, 0x3775, 0x4866, 0x4475, 0x6532, 0x447e, 0x4b7c, 0x6533, 0x552c, 0x536e, 0x4a58, 0x3032, 0x4b4e, 0x4d6a, 0x3a6a, 0x6535, 0x6534, 0x575a, 0x3959, 0x5666, 0x3628, 0x4d70, 0x524b, 0x3126, 0x4a35, 0x3368, 0x4973, 0x3f4d, 0x507b, 0x4a52, 0x6536, 0x3b42, 0x4f5c, 0x392c, 0x5457, 0x3a26, 0x5167, 0x4f7c, 0x3c52, 0x6537, 0x485d, 0x3f6d, 0x3176, 0x4b5e, 0x3c45, 0x3c44, 0x527a, 0x435c, 0x3f5c, 0x383b, 0x4342, 0x3a2e, 0x5422, 0x475e, 0x442f, 0x326c, 0x3951, 0x653b, 0x4148, 0x552f, 0x653c, 0x653e, 0x3467, 0x3654, 0x4b42, 0x5130, 0x353c, 0x4a59, 0x3762, 0x4964, 0x3d2b, 0x4e3e, 0x5770, 0x5021, 0x4959, 0x367b, 0x6658, 0x3c62, 0x333e, 0x4950, 0x6659, 0x3322, 0x5e4c, 0x5348, 0x5e4d, 0x5222, 0x5e4e, 0x3e4d, 0x5e4f, 0x4a2c, 0x527c, 0x335f, 0x656a, 0x4461, 0x3e21, 0x4e32, 0x4472, 0x3e56, 0x4628, 0x3263, 0x3e53, 0x477c, 0x4c6b, 0x3d6c, 0x4e5d, 0x4a3a, 0x4641, 0x656c, 0x503c, 0x5539, 0x656d, 0x4a74, 0x4d40, 0x4245, 0x656f, 0x4244, 0x6570, 0x6578, 0x4d4d, 0x493d, 0x5259, 0x6128, 0x536c, 0x4b6a, 0x4671, 0x612c, 0x6127, 0x6129, 0x612a, 0x612f, 0x326d, 0x612b, 0x385a, 0x612d, 0x612e, 0x6130, 0x353a, 0x6131, 0x6133, 0x6138, 0x5152, 0x6136, 0x6135, 0x416b, 0x6137, 0x5440, 0x6132, 0x613a, 0x3036, 0x6134, 0x3f79, 0x6139, 0x613b, 0x613e, 0x613c, 0x5645, 0x4f3f, 0x613d, 0x613f, 0x424d, 0x366b, 0x5378, 0x474d, 0x3765, 0x3e7e, 0x6140, 0x6141, 0x6147, 0x3367, 0x4669, 0x345e, 0x5142, 0x6148, 0x6146, 0x6145, 0x6143, 0x6142, 0x3140, 0x5538, 0x6144, 0x614b, 0x614c, 0x614a, 0x6f7a, 0x6153, 0x6152, 0x4736, 0x6149, 0x614e, 0x6150, 0x6154, 0x6151, 0x614d, 0x614f, 0x6155, 0x6156, 0x6157, 0x6158, 0x615a, 0x615b, 0x4e21, 0x675d, 0x3428, 0x565d, 0x5132, 0x3332, 0x3924, 0x5773, 0x4749, 0x3e5e, 0x392e, 0x4e57, 0x326e, 0x5b4f, 0x3c3a, 0x5251, 0x4b48, 0x304d, 0x4f6f, 0x5963, 0x3d6d, 0x3152, 0x4a50, 0x323c, 0x4b27, 0x372b, 0x4a26, 0x4f23, 0x6078, 0x554a, 0x607b, 0x607a, 0x4541, 0x4c7b, 0x4131, 0x6079, 0x5663, 0x322f, 0x5644, 0x355b, 0x3478, 0x5621, 0x4f2f, 0x306f, 0x607c, 0x6121, 0x3323, 0x607d, 0x607e, 0x4331, 0x435d, 0x6122, 0x3779, 0x3b4f, 0x6123, 0x443b, 0x6124, 0x6125, 0x6126, 0x3431, 0x3849, 0x463d, 0x446a, 0x3222, 0x5052, 0x675b, 0x3b43, 0x5357, 0x5344, 0x3963, 0x624f, 0x572f, 0x476c, 0x3153, 0x3432, 0x6251, 0x5072, 0x422e, 0x6250, 0x3f62, 0x5326, 0x3557, 0x6252, 0x356a, 0x436d, 0x387d, 0x382e, 0x4553, 0x374f, 0x6254, 0x6253, 0x3648, 0x5779, 0x4d25, 0x6258, 0x6256, 0x4a7c, 0x3f35, 0x5339, 0x6255, 0x6257, 0x412e, 0x4048, 0x625b, 0x625a, 0x402a, 0x414e, 0x625c, 0x625d, 0x625e, 0x5b48, 0x5153, 0x4d22, 0x3d28, 0x5e43, 0x5825, 0x3f2a, 0x5b4d, 0x526c, 0x467a, 0x452a, 0x5e44, 0x3157, 0x5f2e, 0x4a3d, 0x5f31, 0x392d, 0x527d, 0x3825, 0x3a6b, 0x335a, 0x355c, 0x5545, 0x4356, 0x4f52, 0x3b21, 0x6573, 0x6572, 0x6574, 0x4d64, 0x4875, 0x352f, 0x473f, 0x6576, 0x6c30, 0x6566, 0x3969, 0x3531, 0x423c, 0x6568, 0x6567, 0x6569, 0x524d, 0x616a, 0x504e, 0x4d2e, 0x5165, 0x324a, 0x316b, 0x3172, 0x456d, 0x5543, 0x5330, 0x615c, 0x615d, 0x525b, 0x3339, 0x314b, 0x4d79, 0x5577, 0x615e, 0x3e36, 0x347d, 0x615f, 0x3a5c, 0x6160, 0x3b32, 0x4249, 0x6161, 0x506c, 0x4d3d, 0x6162, 0x3543, 0x4547, 0x6163, 0x6164, 0x5379, 0x6165, 0x512d, 0x6166, 0x4e22, 0x6167, 0x3542, 0x6168, 0x3b55, 0x5044, 0x6260, 0x3158, 0x5264, 0x6261, 0x3c49, 0x484c, 0x6263, 0x6c7e, 0x6c7d, 0x5f2f, 0x6262, 0x563e, 0x4d7c, 0x4326, 0x6343, 0x5652, 0x6267, 0x6268, 0x5347, 0x626c, 0x3f6c, 0x626d, 0x6265, 0x3340, 0x446e, 0x626e, 0x5043, 0x3a76, 0x6269, 0x375e, 0x3b33, 0x4c2c, 0x4b4b, 0x6264, 0x6266, 0x626a, 0x626b, 0x6277, 0x6274, 0x5475, 0x6273, 0x452d, 0x557a, 0x4542, 0x3240, 0x626f, 0x6272, 0x412f, 0x4b3c, 0x3521, 0x6279, 0x3c31, 0x6271, 0x5054, 0x5439, 0x6275, 0x3956, 0x6276, 0x4753, 0x6270, 0x575c, 0x6d21, 0x6278, 0x6d25, 0x627e, 0x4a51, 0x4135, 0x3b50, 0x3f56, 0x3a63, 0x4b21, 0x6d26, 0x6d23, 0x6d22, 0x3b56, 0x6d27, 0x5074, 0x6d24, 0x3a5e, 0x3677, 0x6321, 0x3632, 0x4c71, 0x3927, 0x4f22, 0x4721, 0x3f52, 0x3671, 0x627a, 0x627b, 0x627d, 0x627c, 0x4455, 0x6322, 0x5341, 0x6327, 0x4744, 0x4f24, 0x6329, 0x3a37, 0x6328, 0x3b5a, 0x6323, 0x6324, 0x632a, 0x6326, 0x4e72, 0x5346, 0x3b3c, 0x5443, 0x447a, 0x6d28, 0x507c, 0x6325, 0x4375, 0x632d, 0x312f, 0x6332, 0x3c42, 0x632c, 0x353f, 0x4769, 0x6330, 0x3e2a, 0x4d6f, 0x3b73, 0x4c68, 0x632f, 0x6331, 0x4f27, 0x632e, 0x4e29, 0x3b5d, 0x356b, 0x3e65, 0x3252, 0x334d, 0x3139, 0x632b, 0x3251, 0x352c, 0x395f, 0x3668, 0x4f6b, 0x6337, 0x3b4c, 0x4847, 0x504a, 0x6338, 0x336e, 0x6d29, 0x537a, 0x5364, 0x6d2a, 0x6339, 0x5262, 0x6335, 0x535e, 0x3850, 0x6333, 0x6336, 0x375f, 0x6334, 0x4022, 0x633a, 0x5438, 0x3448, 0x633b, 0x3b45, 0x4977, 0x4965, 0x443d, 0x6d2b, 0x427d, 0x3b5b, 0x3f2e, 0x4e3f, 0x633c, 0x3f36, 0x316f, 0x5477, 0x633e, 0x6d2d, 0x633f, 0x3a29, 0x6d2c, 0x633d, 0x6340, 0x3a36, 0x362e, 0x5038, 0x3043, 0x6d2e, 0x6d2f, 0x4041, 0x6341, 0x4533, 0x6342, 0x5c32, 0x6d30, 0x386a, 0x4e6c, 0x6a27, 0x5067, 0x4a79, 0x4856, 0x4f37, 0x3349, 0x4e52, 0x3d64, 0x635e, 0x3b72, 0x6a28, 0x553d, 0x465d, 0x6a29, 0x6a2a, 0x6a2c, 0x6a2b, 0x6a2e, 0x6a2d, 0x3d58, 0x6a2f, 0x423e, 0x3441, 0x3477, 0x3b27, 0x6c66, 0x6c65, 0x373f, 0x4b79, 0x3162, 0x6c67, 0x4948, 0x6c68, 0x6c69, 0x4a56, 0x5e50, 0x3245, 0x547a, 0x464b, 0x3047, 0x3472, 0x4853, 0x4d50, 0x3f38, 0x3f5b, 0x4724, 0x5634, 0x4029, 0x5e51, 0x4928, 0x516f, 0x4524, 0x3067, 0x3336, 0x4845, 0x3062, 0x3776, 0x457a, 0x3673, 0x5552, 0x3350, 0x3c3c, 0x332d, 0x3e71, 0x3051, 0x5256, 0x4a63, 0x5725, 0x4d36, 0x3636, 0x3f39, 0x555b, 0x3827, 0x4557, 0x5e52, 0x3f59, 0x4255, 0x4740, 0x3b24, 0x3128, 0x456a, 0x457b, 0x4c27, 0x3127, 0x3556, 0x4428, 0x5e53, 0x513a, 0x3369, 0x4372, 0x3777, 0x5674, 0x3523, 0x3270, 0x4434, 0x4469, 0x402d, 0x5e54, 0x3068, 0x4544, 0x4160, 0x3955, 0x3e5c, 0x4d58, 0x304e, 0x4d4f, 0x5e56, 0x3e50, 0x573e, 0x5e55, 0x5550, 0x305d, 0x4462, 0x4223, 0x3c70, 0x5335, 0x4039, 0x4521, 0x3226, 0x5471, 0x4028, 0x4a43, 0x5e57, 0x557c, 0x3930, 0x482d, 0x4b29, 0x5e59, 0x3f3d, 0x4634, 0x5727, 0x4a30, 0x4443, 0x3356, 0x3952, 0x5638, 0x6a7c, 0x3034, 0x3f66, 0x4c74, 0x4d5a, 0x563f, 0x424e, 0x4e4e, 0x4c22, 0x502e, 0x4453, 0x3532, 0x5e58, 0x5575, 0x3c37, 0x3b53, 0x3024, 0x4532, 0x346c, 0x5571, 0x6a7d, 0x5e5a, 0x4d26, 0x4d6c, 0x4e66, 0x5e5c, 0x4d31, 0x4026, 0x573d, 0x5e5b, 0x3046, 0x3a34, 0x4953, 0x4473, 0x3e68, 0x3236, 0x404c, 0x4b70, 0x3c71, 0x3b3b, 0x3537, 0x4575, 0x5e66, 0x5e63, 0x3e5d, 0x5e5f, 0x3437, 0x3d5d, 0x5e60, 0x446d, 0x4f46, 0x3560, 0x365e, 0x4a5a, 0x3574, 0x5e65, 0x5546, 0x5e61, 0x4c4d, 0x467e, 0x4545, 0x5234, 0x3e72, 0x4253, 0x4c3d, 0x3338, 0x3d53, 0x3f58, 0x4d46, 0x515a, 0x346b, 0x5e64, 0x5e5d, 0x5e67, 0x6a7e, 0x4230, 0x5e62, 0x5640, 0x3527, 0x3274, 0x5e68, 0x5e72, 0x5e6d, 0x5e71, 0x4860, 0x5761, 0x5e6f, 0x4368, 0x4c61, 0x3265, 0x523e, 0x5e6e, 0x5e6b, 0x4e55, 0x3427, 0x3f2b, 0x3e3e, 0x3d52, 0x5e69, 0x542e, 0x5e5e, 0x5e6a, 0x403f, 0x5e6c, 0x3273, 0x3869, 0x4227, 0x3d41, 0x5e75, 0x5e78, 0x322b, 0x3424, 0x346a, 0x4926, 0x5e76, 0x4b51, 0x3863, 0x5e77, 0x5e7a, 0x5e79, 0x4c42, 0x3061, 0x346e, 0x653a, 0x502f, 0x326b, 0x6b21, 0x5e74, 0x4963, 0x5e73, 0x305a, 0x5221, 0x3177, 0x4c2f, 0x5e70, 0x4b24, 0x552a, 0x5e7b, 0x345d, 0x4426, 0x5e7d, 0x437e, 0x4421, 0x5f21, 0x414c, 0x5e7c, 0x3e6f, 0x4632, 0x3345, 0x4876, 0x4b3a, 0x5e7e, 0x5f24, 0x5732, 0x3337, 0x4143, 0x474b, 0x3225, 0x3469, 0x572b, 0x446c, 0x5f22, 0x5f23, 0x5f25, 0x3a33, 0x5f26, 0x405e, 0x4943, 0x3259, 0x4766, 0x5f27, 0x475c, 0x5f28, 0x6b22, 0x4b53, 0x5f2a, 0x5f29, 0x3241, 0x454a, 0x5f2b, 0x545c, 0x4841, 0x5f2c, 0x3e70, 0x5f2d, 0x5627, 0x6a37, 0x6b36, 0x4a55, 0x587c, 0x3844, 0x3925, 0x3745, 0x557e, 0x394a, 0x5027, 0x744d, 0x3550, 0x4374, 0x3e48, 0x6b37, 0x303d, 0x3d4c, 0x4132, 0x3156, 0x3328, 0x3852, 0x4922, 0x3658, 0x6b38, 0x3e34, 0x4a7d, 0x4743, 0x557b, 0x3773, 0x4e44, 0x552b, 0x3173, 0x6c33, 0x305f, 0x6c35, 0x3637, 0x414f, 0x757a, 0x5031, 0x5565, 0x4e53, 0x3d6f, 0x3362, 0x382b, 0x5536, 0x6d3d, 0x364f, 0x4b39, 0x5042, 0x373d, 0x6c36, 0x4a29, 0x4554, 0x6c39, 0x6c38, 0x4243, 0x6c37, 0x507d, 0x6c3a, 0x6c3b, 0x5765, 0x6c3c, 0x6c3d, 0x466c, 0x4e5e, 0x3c48, 0x4855, 0x3529, 0x3e49, 0x563c, 0x5467, 0x512e, 0x5071, 0x6a38, 0x6a39, 0x6a3a, 0x3a35, 0x4a31, 0x3f75, 0x4d7a, 0x6a40, 0x303a, 0x6a3e, 0x4025, 0x6a3b, 0x327d, 0x4377, 0x3b68, 0x5257, 0x4e74, 0x6a3f, 0x6a3c, 0x6a43, 0x5047, 0x5333, 0x343a, 0x4341, 0x5772, 0x5551, 0x4a47, 0x6a45, 0x6a44, 0x6a47, 0x6a46, 0x5667, 0x4f54, 0x6a4b, 0x3b4e, 0x3d7a, 0x494e, 0x6a4c, 0x4939, 0x4f7e, 0x6a4a, 0x544e, 0x6a4d, 0x6a4f, 0x4d6d, 0x6a49, 0x6a4e, 0x4e6e, 0x3b5e, 0x333f, 0x4655, 0x3e30, 0x4e7a, 0x4767, 0x3e27, 0x6a50, 0x5647, 0x4140, 0x545d, 0x6a51, 0x4f3e, 0x6a52, 0x4a6e, 0x452f, 0x3035, 0x6a54, 0x6a53, 0x745f, 0x443a, 0x3129, 0x655f, 0x6a55, 0x4a6f, 0x6a56, 0x6a57, 0x4658, 0x6a58, 0x6a59, 0x543b, 0x477a, 0x5237, 0x387c, 0x6a42, 0x325c, 0x427c, 0x5478, 0x4c66, 0x576e, 0x5442, 0x5350, 0x6b43, 0x4573, 0x377e, 0x6b54, 0x4b37, 0x6b5e, 0x404a, 0x4d7b, 0x332f, 0x465a, 0x6b7c, 0x443e, 0x4e34, 0x4429, 0x313e, 0x547d, 0x4a75, 0x566c, 0x4653, 0x3664, 0x3b7a, 0x5060, 0x4931, 0x5453, 0x4828, 0x384b, 0x683e, 0x493c, 0x683b, 0x406e, 0x5053, 0x3244, 0x3465, 0x683c, 0x5548, 0x3645, 0x683d, 0x4a78, 0x385c, 0x4c75, 0x4034, 0x516e, 0x683f, 0x6842, 0x3a3c, 0x312d, 0x3d5c, 0x6a3d, 0x6843, 0x6846, 0x684b, 0x684c, 0x4b49, 0x3065, 0x3c2b, 0x3939, 0x6841, 0x4d77, 0x684a, 0x4e76, 0x556d, 0x4156, 0x6844, 0x4336, 0x397b, 0x5626, 0x6848, 0x4a60, 0x5466, 0x6840, 0x6845, 0x6847, 0x4739, 0x3763, 0x6849, 0x3f5d, 0x6852, 0x6857, 0x6855, 0x3c5c, 0x3c4f, 0x685b, 0x685e, 0x685a, 0x317a, 0x3058, 0x4433, 0x384c, 0x4662, 0x483e, 0x4861, 0x684f, 0x6854, 0x6856, 0x3971, 0x6858, 0x5775, 0x447b, 0x685c, 0x3269, 0x6851, 0x3c6d, 0x3f42, 0x684d, 0x5679, 0x4178, 0x3271, 0x685f, 0x4a41, 0x6859, 0x5524, 0x316a, 0x553b, 0x684e, 0x6850, 0x3630, 0x6853, 0x685d, 0x4038, 0x4a77, 0x4b28, 0x465c, 0x4075, 0x6869, 0x5023, 0x6872, 0x566a, 0x6860, 0x6861, 0x5179, 0x3a4b, 0x3879, 0x3871, 0x5454, 0x686f, 0x686e, 0x686c, 0x3970, 0x4c52, 0x6866, 0x4e26, 0x3f72, 0x3038, 0x6871, 0x6870, 0x5740, 0x6864, 0x4d29, 0x4923, 0x3b38, 0x3d5b, 0x686a, 0x6862, 0x6863, 0x6865, 0x3535, 0x6867, 0x4745, 0x686b, 0x686d, 0x3d30, 0x572e, 0x6878, 0x6875, 0x4d30, 0x6876, 0x413a, 0x6868, 0x4337, 0x3070, 0x6874, 0x6877, 0x3923, 0x4952, 0x434e, 0x4e60, 0x4066, 0x4b73, 0x4c5d, 0x5035, 0x4a61, 0x6873, 0x3c6c, 0x6879, 0x435e, 0x4665, 0x3977, 0x3074, 0x5758, 0x3c2c, 0x456f, 0x4c44, 0x6926, 0x492d, 0x6922, 0x4062, 0x3f43, 0x687e, 0x3957, 0x687b, 0x6924, 0x524e, 0x6923, 0x5632, 0x5735, 0x6927, 0x3d37, 0x687c, 0x687d, 0x6921, 0x4d56, 0x522c, 0x6932, 0x6929, 0x342a, 0x343b, 0x692b, 0x5028, 0x6925, 0x337e, 0x692c, 0x4063, 0x692a, 0x6939, 0x6938, 0x692e, 0x687a, 0x6928, 0x3f2c, 0x6931, 0x693a, 0x4225, 0x692f, 0x3845, 0x692d, 0x535c, 0x6934, 0x6935, 0x6937, 0x6947, 0x4046, 0x6945, 0x6930, 0x693b, 0x3071, 0x693c, 0x5525, 0x693e, 0x693f, 0x6941, 0x4171, 0x4836, 0x693d, 0x6942, 0x6943, 0x6933, 0x6936, 0x3b31, 0x6940, 0x3c77, 0x6944, 0x6946, 0x694a, 0x694e, 0x325b, 0x6948, 0x372e, 0x694b, 0x694c, 0x5541, 0x4423, 0x6958, 0x3a61, 0x6949, 0x5323, 0x6954, 0x6957, 0x6950, 0x694f, 0x4741, 0x6952, 0x6959, 0x3348, 0x6953, 0x4f70, 0x694d, 0x3377, 0x6956, 0x695a, 0x4c34, 0x4f2d, 0x6955, 0x695c, 0x695b, 0x695e, 0x6951, 0x695d, 0x695f, 0x434a, 0x4737, 0x344e, 0x3b36, 0x5040, 0x6c23, 0x4537, 0x537b, 0x6c24, 0x6c25, 0x465b, 0x3f6e, 0x6c26, 0x6c27, 0x502a, 0x4738, 0x3868, 0x6c28, 0x5639, 0x557d, 0x344b, 0x323d, 0x4e64, 0x4667, 0x4d61, 0x3475, 0x4b40, 0x3c5f, 0x6962, 0x6963, 0x516a, 0x6965, 0x3479, 0x6964, 0x5133, 0x4a62, 0x3250, 0x6968, 0x6966, 0x6967, 0x5633, 0x6969, 0x696a, 0x696b, 0x696c, 0x6c2f, 0x4539, 0x364e, 0x5273, 0x356e, 0x3b59, 0x6c31, 0x5263, 0x4e63, 0x4438, 0x433f, 0x363e, 0x5839, 0x3148, 0x314f, 0x3151, 0x457e, 0x3150, 0x432b, 0x5531, 0x6b24, 0x3a41, 0x4c3a, 0x6b25, 0x6b27, 0x6b28, 0x6b26, 0x6b29, 0x6b2b, 0x6b2a, 0x6b2c, 0x4a4f, 0x5835, 0x4371, 0x4325, 0x4678, 0x6b2d, 0x444a, 0x6b2e, 0x6b2f, 0x6b30, 0x3755, 0x377a, 0x6b31, 0x4762, 0x6b33, 0x3a24, 0x5175, 0x3031, 0x6b32, 0x6b34, 0x352a, 0x4248, 0x4768, 0x6b35, 0x4b2e, 0x635f, 0x5340, 0x595b, 0x4d21, 0x562d, 0x4773, 0x5960, 0x3b63, 0x3a3a, 0x6362, 0x4f2b, 0x6360, 0x4947, 0x3a39, 0x5134, 0x6361, 0x486a, 0x392f, 0x3d2d, 0x3358, 0x4e5b, 0x4c40, 0x6368, 0x6369, 0x4d74, 0x4c2d, 0x3c33, 0x636a, 0x636b, 0x505a, 0x467b, 0x375a, 0x475f, 0x524a, 0x4e56, 0x6364, 0x636c, 0x4972, 0x3341, 0x6367, 0x4663, 0x6365, 0x6d33, 0x6366, 0x4933, 0x4566, 0x3935, 0x433b, 0x6363, 0x453d, 0x4124, 0x4259, 0x3257, 0x636d, 0x3b26, 0x442d, 0x6370, 0x3e5a, 0x637b, 0x6375, 0x3a53, 0x3750, 0x534d, 0x564e, 0x5553, 0x3941, 0x5534, 0x5158, 0x5039, 0x4776, 0x482a, 0x3234, 0x435a, 0x636e, 0x637c, 0x636f, 0x3728, 0x6377, 0x6374, 0x373a, 0x4522, 0x6376, 0x455d, 0x3228, 0x467c, 0x4460, 0x5722, 0x4061, 0x6379, 0x637a, 0x637d, 0x4c29, 0x6373, 0x533e, 0x3143, 0x6d34, 0x6371, 0x6372, 0x6378, 0x503a, 0x4643, 0x5473, 0x637e, 0x3d60, 0x6427, 0x6426, 0x5173, 0x6423, 0x6429, 0x4877, 0x4f34, 0x6428, 0x642e, 0x4265, 0x3634, 0x3d72, 0x6422, 0x3a69, 0x642a, 0x642c, 0x367d, 0x565e, 0x6432, 0x642d, 0x6421, 0x3b6e, 0x4d5d, 0x4722, 0x4549, 0x4177, 0x6424, 0x4733, 0x3d2c, 0x3d3d, 0x6425, 0x5747, 0x3262, 0x642b, 0x3c43, 0x642f, 0x3b6b, 0x6430, 0x4528, 0x6431, 0x5563, 0x3f23, 0x643a, 0x6437, 0x643b, 0x643d, 0x4656, 0x3a46, 0x404b, 0x3821, 0x6434, 0x5421, 0x3a23, 0x3d7e, 0x643c, 0x4d3f, 0x4479, 0x4f7b, 0x4966, 0x533f, 0x4f51, 0x6433, 0x6438, 0x6439, 0x4c69, 0x4c4e, 0x4054, 0x6435, 0x4130, 0x6436, 0x4e50, 0x3b41, 0x3553, 0x4873, 0x3d27, 0x5547, 0x492c, 0x3822, 0x644a, 0x644c, 0x5144, 0x523a, 0x3a2d, 0x3a54, 0x6443, 0x356d, 0x574d, 0x6440, 0x4f7d, 0x643f, 0x415c, 0x4c4a, 0x4a67, 0x4457, 0x4c54, 0x6448, 0x6447, 0x6441, 0x6444, 0x352d, 0x5359, 0x6446, 0x5279, 0x3463, 0x3b34, 0x496e, 0x343e, 0x3b6c, 0x514d, 0x4c6d, 0x6d35, 0x4765, 0x5428, 0x644b, 0x5755, 0x6442, 0x3d25, 0x6445, 0x5366, 0x6449, 0x4978, 0x643e, 0x5365, 0x477e, 0x3649, 0x547c, 0x3233, 0x6457, 0x4e42, 0x644d, 0x4e3c, 0x385b, 0x6456, 0x3f4a, 0x534e, 0x436c, 0x4548, 0x6458, 0x4d44, 0x644f, 0x6454, 0x6455, 0x3a7e, 0x4f66, 0x553f, 0x6452, 0x6450, 0x644e, 0x4d65, 0x4a2a, 0x4023, 0x3d26, 0x6453, 0x3848, 0x6467, 0x5434, 0x645b, 0x416f, 0x6469, 0x5267, 0x645f, 0x6460, 0x4f2a, 0x4b5d, 0x645a, 0x6451, 0x6465, 0x485c, 0x6463, 0x4467, 0x6462, 0x6461, 0x337c, 0x6468, 0x3561, 0x574c, 0x6466, 0x3b2c, 0x5752, 0x4c4f, 0x6b78, 0x6464, 0x3976, 0x564d, 0x6459, 0x645c, 0x427a, 0x645e, 0x424b, 0x4044, 0x4250, 0x3175, 0x4c32, 0x354e, 0x646f, 0x462f, 0x4661, 0x6475, 0x4229, 0x406c, 0x515d, 0x646e, 0x442e, 0x646d, 0x6476, 0x6474, 0x427e, 0x645d, 0x6470, 0x4a7e, 0x5544, 0x6471, 0x517a, 0x646b, 0x646c, 0x6472, 0x4e2b, 0x454b, 0x4731, 0x423a, 0x646a, 0x414a, 0x4c36, 0x3331, 0x647b, 0x6473, 0x647a, 0x647d, 0x647c, 0x334e, 0x333a, 0x6477, 0x6479, 0x6478, 0x456c, 0x403d, 0x5468, 0x6522, 0x3044, 0x6524, 0x6523, 0x3c24, 0x6525, 0x6521, 0x647e, 0x3174, 0x6528, 0x6529, 0x6526, 0x6527, 0x652a, 0x4659, 0x652b, 0x652d, 0x652c, 0x652f, 0x652e, 0x3960, 0x6530, 0x6531, 0x3b70, 0x6c61, 0x4370, 0x3546, 0x3b52, 0x4169, 0x546e, 0x3e44, 0x5746, 0x5456, 0x3253, 0x6c3e, 0x6a41, 0x422f, 0x3436, 0x5157, 0x3334, 0x4832, 0x3f3b, 0x6c40, 0x564b, 0x6c3f, 0x6c41, 0x6c45, 0x3e66, 0x4c3f, 0x455a, 0x3e3c, 0x6c46, 0x317e, 0x6c44, 0x5528, 0x3563, 0x6c42, 0x4136, 0x3363, 0x6c43, 0x4b38, 0x4043, 0x4c7e, 0x4152, 0x6c48, 0x3a66, 0x4053, 0x5672, 0x514c, 0x3f3e, 0x3733, 0x4955, 0x6c47, 0x3b62, 0x4c4c, 0x3d7d, 0x4848, 0x4f29, 0x4d69, 0x456b, 0x3769, 0x5149, 0x3a38, 0x6c49, 0x6c4a, 0x3b40, 0x6c4b, 0x6c62, 0x313a, 0x3759, 0x3d39, 0x6c4c, 0x5166, 0x6c4d, 0x483b, 0x6c51, 0x6c53, 0x3b4d, 0x3c65, 0x6c4f, 0x4937, 0x433a, 0x6c63, 0x5555, 0x6c50, 0x5673, 0x6c52, 0x6c4e, 0x6c54, 0x6c55, 0x493f, 0x4f28, 0x505c, 0x512c, 0x485b, 0x6c56, 0x4e75, 0x4a6c, 0x6c5a, 0x6c59, 0x303e, 0x6c57, 0x6c58, 0x6c64, 0x483c, 0x4147, 0x6c5c, 0x5160, 0x6c5b, 0x546f, 0x6c5d, 0x5b46, 0x6c5e, 0x312c, 0x6c5f, 0x6c60, 0x5726, 0x4540, 0x6b3c, 0x302e, 0x3e74, 0x3838, 0x522f, 0x3056, 0x3579, 0x5833, 0x4b2c, 0x635d, 0x462c, 0x3066, 0x4546, 0x6b39, 0x6b3a, 0x6b3b, 0x5140, 0x4523, 0x6a72, 0x4432, 0x4435, 0x404e, 0x6a73, 0x4441, 0x4e6f, 0x6a70, 0x6a74, 0x497c, 0x4723, 0x4c58, 0x4e7e, 0x6a75, 0x6a76, 0x4f2c, 0x4067, 0x6a77, 0x363f, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a71, 0x482e, 0x616b, 0x3738, 0x616c, 0x616d, 0x5734, 0x616e, 0x616f, 0x534c, 0x6171, 0x3f71, 0x6170, 0x3552, 0x3137, 0x6173, 0x6172, 0x3a7c, 0x6174, 0x3937, 0x3e51, 0x447c, 0x3a5d, 0x3d46, 0x6175, 0x6177, 0x3640, 0x4f41, 0x4a28, 0x6176, 0x5578, 0x537c, 0x6178, 0x617c, 0x6179, 0x617a, 0x406a, 0x617e, 0x6221, 0x4047, 0x617b, 0x617d, 0x6225, 0x4154, 0x6223, 0x6228, 0x327e, 0x6222, 0x434d, 0x3242, 0x6227, 0x6226, 0x6224, 0x6229, 0x622b, 0x5049, 0x566d, 0x4328, 0x622c, 0x4f57, 0x622e, 0x3a6f, 0x6960, 0x622d, 0x622a, 0x3b2b, 0x5433, 0x6230, 0x622f, 0x6961, 0x6231, 0x6232, 0x6233, 0x4c21, 0x6234, 0x6235, 0x507e, 0x424a, 0x5371, 0x4d75, 0x6760, 0x6761, 0x3e41, 0x426a, 0x6764, 0x6763, 0x4d66, 0x4335, 0x6762, 0x3b37, 0x4f56, 0x4161, 0x6769, 0x6768, 0x6774, 0x3223, 0x676a, 0x6766, 0x676c, 0x676b, 0x493a, 0x5564, 0x6765, 0x3729, 0x6767, 0x676e, 0x6773, 0x5669, 0x676d, 0x6772, 0x6771, 0x3060, 0x6775, 0x4772, 0x4045, 0x406d, 0x4170, 0x6770, 0x6776, 0x4b76, 0x6822, 0x6821, 0x5741, 0x677a, 0x6779, 0x677b, 0x6777, 0x677e, 0x677d, 0x677c, 0x4155, 0x4759, 0x457d, 0x4543, 0x476d, 0x6823, 0x6826, 0x6825, 0x6827, 0x3a77, 0x6778, 0x6824, 0x4870, 0x492a, 0x6829, 0x3965, 0x517e, 0x6828, 0x682a, 0x682d, 0x682e, 0x4127, 0x682f, 0x6830, 0x682c, 0x6834, 0x682b, 0x6831, 0x6835, 0x6832, 0x6833, 0x6837, 0x6836, 0x394f, 0x702c, 0x702d, 0x4630, 0x306a, 0x483f, 0x4d5f, 0x4e4d, 0x6a31, 0x6a32, 0x463f, 0x3449, 0x6a33, 0x5567, 0x5d79, 0x6a34, 0x6a35, 0x6a36, 0x384a, 0x5f30, 0x4975, 0x4c70, 0x497a, 0x497b, 0x5343, 0x4b26, 0x3826, 0x702e, 0x3142, 0x6538, 0x4c6f, 0x5349, 0x3c57, 0x496a, 0x3567, 0x4450, 0x3569, 0x6e2e, 0x3b2d, 0x675e, 0x6e2f, 0x3329, 0x6e32, 0x6e31, 0x3d67, 0x6e30, 0x4e37, 0x454f, 0x4174, 0x5b4e, 0x6e33, 0x5073, 0x4254, 0x4668, 0x372c, 0x6e34, 0x336b, 0x3b7b, 0x6e35, 0x675c, 0x6e36, 0x3d2e, 0x7162, 0x4a68, 0x5249, 0x705a, 0x705b, 0x705c, 0x4146, 0x386d, 0x3e4e, 0x705e, 0x4531, 0x705d, 0x5171, 0x7060, 0x304c, 0x3d6a, 0x525f, 0x705f, 0x342f, 0x3768, 0x7066, 0x7065, 0x4623, 0x7061, 0x7062, 0x3443, 0x7063, 0x556e, 0x4c5b, 0x3e52, 0x3c32, 0x7068, 0x7067, 0x7064, 0x3221, 0x5622, 0x5338, 0x3e37, 0x482c, 0x706a, 0x5177, 0x564c, 0x3a5b, 0x7069, 0x363b, 0x4d34, 0x4626, 0x4121, 0x706b, 0x706e, 0x706d, 0x7070, 0x706c, 0x3b3e, 0x706f, 0x4c35, 0x7072, 0x3355, 0x3154, 0x7073, 0x7074, 0x7076, 0x3461, 0x7071, 0x7077, 0x707a, 0x7078, 0x7075, 0x707d, 0x7079, 0x707c, 0x707e, 0x7121, 0x4e41, 0x7124, 0x7123, 0x4176, 0x707b, 0x4a5d, 0x3471, 0x3171, 0x4c31, 0x7126, 0x7127, 0x712c, 0x554e, 0x7129, 0x4833, 0x7122, 0x712b, 0x7128, 0x7125, 0x712a, 0x3029, 0x712d, 0x712f, 0x7131, 0x7130, 0x712e, 0x5122, 0x7132, 0x7133, 0x396f, 0x3547, 0x3057, 0x3059, 0x546d, 0x3544, 0x3d54, 0x3b4a, 0x7027, 0x385e, 0x7028, 0x3028, 0x7029, 0x4d6e, 0x702a, 0x702b, 0x4624, 0x5665, 0x7164, 0x7165, 0x4373, 0x535b, 0x5651, 0x4568, 0x532f, 0x5266, 0x6e41, 0x303b, 0x5535, 0x514e, 0x3c60, 0x3a50, 0x3f78, 0x3847, 0x3541, 0x454c, 0x4a22, 0x434b, 0x6e42, 0x443f, 0x3622, 0x6d6c, 0x4324, 0x5631, 0x4f60, 0x6d6f, 0x454e, 0x365c, 0x4a21, 0x6d6d, 0x6d70, 0x6d71, 0x433c, 0x3f34, 0x6d6e, 0x6d74, 0x6d72, 0x5566, 0x435f, 0x6d73, 0x6d76, 0x5523, 0x5123, 0x6d75, 0x4350, 0x6d77, 0x3f74, 0x3e6c, 0x6d78, 0x4c77, 0x515b, 0x5745, 0x5576, 0x6d7c, 0x6d7b, 0x6d79, 0x6d7a, 0x6d7d, 0x3e26, 0x4b2f, 0x6e21, 0x363d, 0x6e22, 0x4440, 0x6d7e, 0x3d5e, 0x3247, 0x3643, 0x6e25, 0x583a, 0x6e23, 0x6e26, 0x4369, 0x3372, 0x6e27, 0x6e24, 0x4f39, 0x6e28, 0x4277, 0x6e29, 0x6e2a, 0x5e2b, 0x4633, 0x4746, 0x5675, 0x3549, 0x4b32, 0x6e2b, 0x4d2b, 0x6e2c, 0x5530, 0x6e2d, 0x7644, 0x5b47, 0x3423, 0x432c, 0x7166, 0x4a38, 0x5253, 0x562a, 0x6f72, 0x3e58, 0x3d43, 0x6f73, 0x364c, 0x302b, 0x4a2f, 0x6d36, 0x6d37, 0x4e79, 0x372f, 0x3f73, 0x6d38, 0x426b, 0x4930, 0x6d39, 0x4676, 0x3f33, 0x6d3c, 0x4578, 0x5150, 0x5729, 0x6d3a, 0x6d3b, 0x5162, 0x6d3f, 0x6d40, 0x6d44, 0x6d48, 0x6d46, 0x6d4e, 0x5568, 0x6d49, 0x6d47, 0x6d3e, 0x4569, 0x4646, 0x4969, 0x5452, 0x6d41, 0x6d42, 0x6d43, 0x6d45, 0x4079, 0x3421, 0x3968, 0x6d50, 0x6d51, 0x6d4a, 0x6d4f, 0x4e78, 0x4b36, 0x6d4c, 0x6d4d, 0x4f75, 0x6d52, 0x4172, 0x5332, 0x6d4b, 0x4837, 0x3c6f, 0x4570, 0x6d56, 0x356f, 0x4235, 0x302d, 0x4b69, 0x312e, 0x6d54, 0x4d6b, 0x3562, 0x6d55, 0x6d53, 0x6d57, 0x357a, 0x6d58, 0x6d59, 0x6d5c, 0x314c, 0x4576, 0x3c6e, 0x6d5a, 0x4c3c, 0x326a, 0x6d5b, 0x446b, 0x3445, 0x3075, 0x6d5f, 0x405a, 0x3468, 0x454d, 0x6d5d, 0x3f44, 0x6d5e, 0x4425, 0x6d60, 0x6d61, 0x6d63, 0x4157, 0x3b47, 0x3d38, 0x6d62, 0x6d64, 0x6d66, 0x6d65, 0x6d67, 0x4a3e, 0x6c6a, 0x4071, 0x4967, 0x6c6b, 0x466e, 0x6c6c, 0x466d, 0x6c6d, 0x6c70, 0x5766, 0x6c73, 0x6c71, 0x6c6e, 0x6c6f, 0x5723, 0x4971, 0x4b6e, 0x6c74, 0x6c72, 0x4f69, 0x6c76, 0x4631, 0x3c40, 0x6c75, 0x353b, 0x3b76, 0x6c77, 0x5977, 0x3d7b, 0x423b, 0x6c78, 0x6c79, 0x3823, 0x6c7a, 0x6c7b, 0x6c7c, 0x536d, 0x582e, 0x406b, 0x475d, 0x3a4c, 0x5063, 0x4b3d, 0x4d3a, 0x3851, 0x317c, 0x476f, 0x5656, 0x3f46, 0x436b, 0x6f75, 0x4358, 0x5762, 0x6f77, 0x3353, 0x4758, 0x516d, 0x5648, 0x6f78, 0x6f76, 0x3b7d, 0x3346, 0x3d55, 0x5246, 0x3b60, 0x4f21, 0x6f7c, 0x6f7b, 0x6f79, 0x334c, 0x4954, 0x4b30, 0x6f7e, 0x305e, 0x5649, 0x6f7d, 0x336d, 0x7655, 0x4e48, 0x7022, 0x7021, 0x353e, 0x3c5a, 0x3b7c, 0x3865, 0x4442, 0x7023, 0x4b6b, 0x7026, 0x5128, 0x3e3f, 0x476e, 0x7136, 0x7137, 0x3f55, 0x3429, 0x7138, 0x4d3b, 0x4754, 0x552d, 0x7139, 0x713a, 0x474f, 0x5224, 0x564f, 0x713b, 0x3d51, 0x3430, 0x3e3d, 0x345c, 0x4e51, 0x3f5f, 0x713d, 0x3f7a, 0x713c, 0x713f, 0x713e, 0x7140, 0x7141, 0x417e, 0x4122, 0x4a7a, 0x553e, 0x3e3a, 0x3e39, 0x5542, 0x3f22, 0x4d2f, 0x7135, 0x3d5f, 0x364b, 0x5671, 0x7343, 0x7344, 0x384d, 0x7346, 0x7347, 0x304a, 0x7345, 0x7349, 0x4b71, 0x734b, 0x5026, 0x314a, 0x7348, 0x734f, 0x3551, 0x7357, 0x7352, 0x7354, 0x7353, 0x377b, 0x313f, 0x734e, 0x734a, 0x355a, 0x7350, 0x7351, 0x7355, 0x734d, 0x3c63, 0x417d, 0x7356, 0x735a, 0x734c, 0x3548, 0x3d6e, 0x735c, 0x3724, 0x3f70, 0x567e, 0x4d32, 0x3470, 0x325f, 0x7358, 0x7359, 0x4938, 0x735d, 0x735e, 0x7361, 0x735f, 0x7363, 0x7362, 0x735b, 0x3f6a, 0x336f, 0x7360, 0x4729, 0x3c72, 0x736b, 0x393f, 0x7364, 0x322d, 0x3b7e, 0x4b63, 0x736d, 0x7369, 0x395c, 0x736e, 0x7365, 0x7366, 0x736a, 0x4261, 0x736c, 0x736f, 0x7368, 0x3c7d, 0x4f64, 0x7370, 0x7367, 0x7372, 0x572d, 0x462a, 0x7373, 0x7371, 0x4228, 0x385d, 0x7375, 0x7374, 0x345b, 0x7376, 0x7377, 0x7378, 0x403a, 0x4069, 0x4571, 0x737b, 0x737a, 0x3458, 0x737e, 0x7379, 0x737c, 0x737d, 0x7421, 0x7423, 0x3b49, 0x7422, 0x7424, 0x323e, 0x7426, 0x7425, 0x3c2e, 0x4357, 0x5961, 0x4060, 0x744c, 0x5751, 0x375b, 0x744e, 0x4123, 0x4649, 0x3456, 0x5533, 0x7450, 0x744f, 0x7451, 0x4b5a, 0x7452, 0x5441, 0x5660, 0x3760, 0x4138, 0x413b, 0x7453, 0x3e2c, 0x3462, 0x7454, 0x7455, 0x3e2b, 0x7456, 0x745b, 0x7457, 0x745a, 0x3a7d, 0x7458, 0x7459, 0x3862, 0x4c47, 0x745c, 0x325a, 0x4353, 0x5463, 0x3f37, 0x745d, 0x4534, 0x7469, 0x4f35, 0x4e49, 0x4b58, 0x4b77, 0x3d74, 0x574f, 0x405b, 0x5075, 0x746a, 0x746b, 0x746c, 0x7763, 0x3731, 0x746d, 0x576b, 0x746e, 0x6679, 0x3e40, 0x667a, 0x3a6c, 0x667b, 0x4f4b, 0x667c, 0x543c, 0x3c36, 0x667d, 0x667e, 0x3c4d, 0x4852, 0x4e33, 0x6721, 0x343f, 0x6722, 0x4934, 0x3859, 0x4449, 0x575d, 0x425a, 0x3757, 0x563d, 0x4e46, 0x3744, 0x4526, 0x6723, 0x4f5f, 0x6724, 0x6725, 0x6726, 0x4137, 0x5769, 0x4970, 0x4f38, 0x562f, 0x5655, 0x6727, 0x306d, 0x6728, 0x6729, 0x495c, 0x526f, 0x3e2d, 0x672a, 0x3073, 0x485e, 0x3d61, 0x672b, 0x4846, 0x672c, 0x3b66, 0x3878, 0x5124, 0x672d, 0x4267, 0x3e78, 0x3d4a, 0x4d33, 0x672e, 0x672f, 0x3e6e, 0x5065, 0x4b67, 0x4c50, 0x3c4c, 0x6730, 0x3c28, 0x5077, 0x6731, 0x5078, 0x6732, 0x6733, 0x3442, 0x6734, 0x6735, 0x497e, 0x4e2c, 0x4360, 0x6737, 0x3141, 0x3371, 0x6738, 0x6739, 0x575b, 0x5540, 0x673a, 0x424c, 0x573a, 0x673b, 0x673c, 0x673d, 0x3c6a, 0x4365, 0x4042, 0x673e, 0x673f, 0x3c29, 0x6740, 0x6741, 0x6736, 0x3650, 0x6742, 0x6743, 0x6744, 0x3b3a, 0x355e, 0x4246, 0x3160, 0x6745, 0x5435, 0x6746, 0x383f, 0x6748, 0x6747, 0x376c, 0x6749, 0x3278, 0x674a, 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x5327, 0x4b75, 0x6751, 0x6752, 0x6753, 0x6754, 0x4949, 0x6755, 0x6756, 0x6757, 0x6758, 0x6759, 0x3d49, 0x675a, 0x733e, 0x3857, 0x4831, 0x733f, 0x7340, 0x7341, 0x395e, 0x4d78, 0x5868, 0x3a31, 0x425e, 0x6e37, 0x3723, 0x6e39, 0x6e38, 0x3055, 0x6e3b, 0x5556, 0x576f, 0x5643, 0x6e3d, 0x4a70, 0x6e3c, 0x6e3e, 0x6e40, 0x6e3f, 0x5172, 0x473c, 0x4340, 0x3861, 0x4167, 0x7446, 0x505f, 0x7447, 0x4f5b, 0x483a, 0x7448, 0x7449, 0x744a, 0x744b, 0x597a, 0x387e, 0x6571, 0x5370, 0x7460, 0x4e4c, 0x3361, 0x7134, 0x526e, 0x7461, 0x4f68, 0x7462, 0x474c, 0x3554, 0x3464, 0x7464, 0x7463, 0x7465, 0x7466, 0x7467, 0x3a32, 0x303f, 0x7468, 0x372d, 0x526d, 0x522b, 0x404f, 0x3f3c, 0x6b23, 0x555f, 0x6a48, 0x7173, 0x3678, 0x4b23, 0x444d, 0x7167, 0x7168, 0x387b, 0x7169, 0x3a44, 0x5445, 0x3052, 0x716a, 0x716b, 0x716c, 0x716d, 0x716e, 0x716f, 0x7171, 0x7170, 0x4555, 0x7172, 0x367a, 0x7174, 0x522e, 0x5e47, 0x4b4a, 0x335c, 0x3522, 0x3922, 0x4474, 0x7175, 0x7176, 0x4144, 0x417b, 0x5630, 0x7177, 0x7178, 0x412a, 0x4638, 0x3e5b, 0x7179, 0x344f, 0x717a, 0x6d32, 0x6d31, 0x4b60, 0x525e, 0x4b41, 0x5558, 0x4862, 0x405f, 0x3c21, 0x6b41, 0x5024, 0x5662, 0x3647, 0x3858, 0x6b40, 0x384e, 0x6b3f, 0x3326, 0x3949, 0x562b, 0x3774, 0x374a, 0x3c67, 0x373e, 0x6b46, 0x6b47, 0x3039, 0x3f4f, 0x6b45, 0x537d, 0x6b48, 0x6b49, 0x374e, 0x6b42, 0x6b44, 0x4976, 0x5657, 0x554d, 0x5032, 0x6b4f, 0x4e38, 0x6b50, 0x3528, 0x3133, 0x6b52, 0x4c25, 0x4556, 0x6b53, 0x6b51, 0x455f, 0x6b4e, 0x4a24, 0x6b55, 0x307b, 0x3a7a, 0x5837, 0x7163, 0x6b4a, 0x6b4b, 0x6b4c, 0x6b4d, 0x6b56, 0x6640, 0x6b59, 0x3f68, 0x5248, 0x6b57, 0x6b5c, 0x386c, 0x6b58, 0x3d3a, 0x5058, 0x3037, 0x6b5d, 0x445c, 0x562c, 0x3460, 0x4276, 0x3c39, 0x6b5a, 0x6b5b, 0x5460, 0x466a, 0x4454, 0x6b5f, 0x4527, 0x5975, 0x3231, 0x6b64, 0x3d45, 0x6b62, 0x6b63, 0x382c, 0x4d51, 0x6b65, 0x6b61, 0x4133, 0x4622, 0x4c73, 0x6b66, 0x4030, 0x5238, 0x6b67, 0x382f, 0x382d, 0x6b68, 0x473b, 0x4d73, 0x6b6a, 0x6b6b, 0x6b6d, 0x5048, 0x6b72, 0x6b6e, 0x6b71, 0x4879, 0x517c, 0x6b6c, 0x6b69, 0x3839, 0x4f59, 0x4465, 0x6b6f, 0x6b70, 0x4c5a, 0x4d48, 0x3072, 0x6b76, 0x6b75, 0x3232, 0x3860, 0x6b77, 0x316c, 0x4c45, 0x4424, 0x4f25, 0x6b79, 0x6c22, 0x4572, 0x6b7a, 0x4945, 0x625f, 0x6b7e, 0x4d4e, 0x6c21, 0x315b, 0x5337, 0x525c, 0x6b7d, 0x6b7b, 0x333c, 0x6a30, 0x5754, 0x742b, 0x3374, 0x5641, 0x5642, 0x5569, 0x3e4a, 0x7427, 0x5228, 0x7428, 0x7429, 0x742a, 0x3e4b, 0x535f, 0x4960, 0x4961, 0x7342, 0x4a66, 0x4c72, 0x6236, 0x4b34, 0x4e68, 0x565b, 0x742d, 0x742e, 0x742f, 0x7432, 0x3a3d, 0x7433, 0x3063, 0x7430, 0x7431, 0x3d22, 0x3255, 0x7436, 0x7437, 0x3666, 0x3230, 0x4f4f, 0x7434, 0x342c, 0x7435, 0x7438, 0x7439, 0x4d27, 0x743a, 0x743b, 0x743c, 0x4b52, 0x743d, 0x743e, 0x743f, 0x745e, 0x413c, 0x3c68, 0x492b, 0x515e, 0x6575, 0x5c33, 0x5255, 0x5c34, 0x302c, 0x5c35, 0x3d5a, 0x5c39, 0x5842, 0x5c37, 0x5373, 0x4956, 0x5c3a, 0x5c36, 0x5c3b, 0x4322, 0x5c3c, 0x5c45, 0x5c3d, 0x4e5f, 0x5625, 0x5c4f, 0x5c4d, 0x5c52, 0x3d66, 0x422b, 0x5c38, 0x5c4b, 0x5c4e, 0x5c3e, 0x3752, 0x3045, 0x5c47, 0x503e, 0x5c41, 0x3b28, 0x373c, 0x5c4c, 0x5c46, 0x5c3f, 0x475b, 0x513f, 0x5c40, 0x5c4a, 0x5c50, 0x4e2d, 0x5c42, 0x5c43, 0x5c48, 0x5c49, 0x3254, 0x5c51, 0x4b55, 0x5437, 0x5c5b, 0x5c5f, 0x4c26, 0x5c66, 0x4367, 0x5c5c, 0x3f41, 0x5c59, 0x307a, 0x3936, 0x5c65, 0x5c53, 0x5c44, 0x5c56, 0x4874, 0x3f60, 0x493b, 0x313d, 0x5322, 0x5c5a, 0x5c55, 0x463b, 0x5c5e, 0x5742, 0x432f, 0x3736, 0x4751, 0x4329, 0x5c62, 0x5c58, 0x5c6b, 0x5c54, 0x5c5d, 0x3e25, 0x5c57, 0x5c60, 0x5c63, 0x5c64, 0x5c78, 0x5c61, 0x5d22, 0x5c67, 0x3c6b, 0x3444, 0x4323, 0x3267, 0x5c7a, 0x5c72, 0x5c6f, 0x5c7c, 0x5c6e, 0x5270, 0x3268, 0x4857, 0x4863, 0x5c7b, 0x5c6d, 0x5c77, 0x5c75, 0x3e23, 0x5c74, 0x325d, 0x5c73, 0x3c76, 0x5c68, 0x3b44, 0x4073, 0x3c54, 0x5c69, 0x5c6a, 0x5c71, 0x5c76, 0x5c79, 0x3534, 0x4859, 0x3b67, 0x5c7e, 0x5c7d, 0x532b, 0x5d21, 0x5d23, 0x5d25, 0x5271, 0x5d24, 0x5d26, 0x5d27, 0x5229, 0x3a49, 0x5d29, 0x5d36, 0x5d31, 0x5d34, 0x5d30, 0x464e, 0x4072, 0x492f, 0x5c6c, 0x5d2e, 0x5d37, 0x5c70, 0x5d2f, 0x5d38, 0x5d2c, 0x5d39, 0x5d33, 0x5d2d, 0x442a, 0x5d28, 0x4033, 0x412b, 0x5d2a, 0x5d2b, 0x5d32, 0x3b71, 0x5d35, 0x5328, 0x5d3a, 0x5d3b, 0x4327, 0x5d52, 0x5d3c, 0x5d51, 0x393d, 0x3e55, 0x3e7a, 0x3a4a, 0x5d4a, 0x5d45, 0x5d3f, 0x324b, 0x5d43, 0x5d4b, 0x3224, 0x5d55, 0x5d3e, 0x4650, 0x5d50, 0x5d54, 0x4162, 0x3746, 0x5d4e, 0x5d4f, 0x5d44, 0x5d3d, 0x5d4d, 0x4c51, 0x5d49, 0x5d42, 0x4348, 0x463c, 0x4e2e, 0x5d4c, 0x5d48, 0x5d41, 0x5d46, 0x425c, 0x5329, 0x532a, 0x5d53, 0x4f74, 0x4878, 0x5d66, 0x5d47, 0x5d60, 0x4264, 0x5d61, 0x5d57, 0x5678, 0x5d59, 0x5d58, 0x3870, 0x5d56, 0x464f, 0x362d, 0x5d62, 0x3a79, 0x5461, 0x5d67, 0x3450, 0x5d5a, 0x3f7b, 0x5d63, 0x5d5f, 0x5d5d, 0x3559, 0x5d5b, 0x5d5c, 0x5d5e, 0x3d2f, 0x5d64, 0x5d65, 0x5d75, 0x4349, 0x4b62, 0x5d72, 0x5861, 0x4651, 0x5d74, 0x5574, 0x5d73, 0x5d70, 0x5d6c, 0x5d6f, 0x5d68, 0x506e, 0x4858, 0x5d6e, 0x5d69, 0x5d6a, 0x4b72, 0x5d6d, 0x314d, 0x4036, 0x3c3b, 0x5d71, 0x5d77, 0x5d76, 0x5d6b, 0x456e, 0x5d7b, 0x5e24, 0x5e23, 0x5d78, 0x436f, 0x427b, 0x5561, 0x4e35, 0x5d7d, 0x324c, 0x4468, 0x4a5f, 0x473e, 0x5d7a, 0x5d7c, 0x5d7e, 0x5e22, 0x302a, 0x314e, 0x5e2c, 0x5e26, 0x3d36, 0x486f, 0x5e21, 0x5e25, 0x5e29, 0x5e28, 0x5e27, 0x5e2d, 0x544c, 0x5e33, 0x5e2a, 0x5e2e, 0x4059, 0x3121, 0x5e36, 0x5e31, 0x5e32, 0x5126, 0x5e35, 0x5e2f, 0x5e30, 0x503d, 0x5e34, 0x4a6d, 0x5e39, 0x5e38, 0x5e37, 0x5e3b, 0x3d65, 0x3258, 0x436a, 0x5e3a, 0x453a, 0x5e3c, 0x4c59, 0x372a, 0x5465, 0x5e3d, 0x5e3f, 0x4422, 0x5e41, 0x5e3e, 0x5e40, 0x553a, 0x5e42, 0x722e, 0x3b22, 0x4232, 0x4530, 0x4247, 0x722f, 0x5069, 0x535d, 0x6b3d, 0x3366, 0x7230, 0x7231, 0x4a2d, 0x3a67, 0x7233, 0x7235, 0x7234, 0x4b64, 0x4f3a, 0x7232, 0x4a34, 0x524f, 0x426c, 0x4e43, 0x7238, 0x3076, 0x7237, 0x723e, 0x324f, 0x5141, 0x723a, 0x723c, 0x5469, 0x723b, 0x7236, 0x723f, 0x723d, 0x7239, 0x7247, 0x7244, 0x7246, 0x724a, 0x7242, 0x7240, 0x7245, 0x567b, 0x7241, 0x4779, 0x495f, 0x7248, 0x3946, 0x3530, 0x7243, 0x7249, 0x7250, 0x7256, 0x3b57, 0x7255, 0x4d5c, 0x566b, 0x7252, 0x7254, 0x3872, 0x724b, 0x724e, 0x4279, 0x555d, 0x724c, 0x724d, 0x724f, 0x7253, 0x7259, 0x533c, 0x366a, 0x4a71, 0x3764, 0x7257, 0x7258, 0x725a, 0x725d, 0x725b, 0x725c, 0x5151, 0x7251, 0x4d49, 0x4e4f, 0x5629, 0x7263, 0x435b, 0x7260, 0x402f, 0x726c, 0x725e, 0x7261, 0x7268, 0x7262, 0x7267, 0x7266, 0x7269, 0x725f, 0x7264, 0x726a, 0x532c, 0x7265, 0x3275, 0x7272, 0x502b, 0x7275, 0x3b48, 0x7279, 0x7270, 0x7276, 0x7278, 0x727a, 0x7273, 0x7271, 0x3a7b, 0x357b, 0x726f, 0x7277, 0x726d, 0x726e, 0x726b, 0x7326, 0x7323, 0x7322, 0x7274, 0x485a, 0x727b, 0x7325, 0x4378, 0x727d, 0x7327, 0x7329, 0x7324, 0x727c, 0x732b, 0x732a, 0x425d, 0x732e, 0x7330, 0x7321, 0x7331, 0x732c, 0x732f, 0x727e, 0x732d, 0x7332, 0x7334, 0x7328, 0x7333, 0x7335, 0x5037, 0x7338, 0x5979, 0x7339, 0x7337, 0x4864, 0x7336, 0x733a, 0x733b, 0x3440, 0x6e43, 0x733c, 0x733d, 0x512a, 0x742c, 0x5046, 0x5050, 0x515c, 0x4f4e, 0x3d56, 0x5143, 0x3a62, 0x6169, 0x5242, 0x7142, 0x3239, 0x316d, 0x7143, 0x4940, 0x3344, 0x5972, 0x4b25, 0x7144, 0x5654, 0x7145, 0x7440, 0x7146, 0x542c, 0x7147, 0x3040, 0x7441, 0x7442, 0x347c, 0x455b, 0x4c3b, 0x5064, 0x4d60, 0x7148, 0x5973, 0x313b, 0x4f2e, 0x3824, 0x714a, 0x714b, 0x3243, 0x4151, 0x5730, 0x7149, 0x714c, 0x714e, 0x5976, 0x5261, 0x5423, 0x7443, 0x4839, 0x7444, 0x714d, 0x714f, 0x3f63, 0x7150, 0x7154, 0x7156, 0x7151, 0x4951, 0x4561, 0x4263, 0x397c, 0x7153, 0x7155, 0x3953, 0x715b, 0x3a56, 0x307d, 0x7159, 0x7158, 0x7152, 0x715a, 0x7157, 0x486c, 0x4d4a, 0x715d, 0x653d, 0x715c, 0x715e, 0x715f, 0x4f65, 0x7445, 0x3d73, 0x7160, 0x7161, 0x4e77, 0x522a, 0x717b, 0x3832, 0x3c7b, 0x395b, 0x3966, 0x4359, 0x4a53, 0x6a68, 0x4040, 0x3e75, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x3d47, 0x757b, 0x757d, 0x757e, 0x757c, 0x3d62, 0x7621, 0x3425, 0x7622, 0x7623, 0x6c32, 0x5154, 0x596a, 0x7624, 0x6e3a, 0x5532, 0x537e, 0x4c5c, 0x4a44, 0x6540, 0x7625, 0x3e2f, 0x4629, 0x5a25, 0x3c46, 0x3629, 0x383c, 0x484f, 0x3c25, 0x5a26, 0x5a27, 0x4c56, 0x4843, 0x5a28, 0x467d, 0x5135, 0x5269, 0x5136, 0x3c47, 0x3d32, 0x3b64, 0x5a29, 0x5a2a, 0x5148, 0x5a2b, 0x506d, 0x366f, 0x425b, 0x4b4f, 0x376d, 0x4968, 0x3743, 0x3e77, 0x5624, 0x5a2c, 0x5a2d, 0x4640, 0x5767, 0x4a36, 0x5529, 0x4b5f, 0x556f, 0x5a2e, 0x565f, 0x344a, 0x5a30, 0x5a2f, 0x526b, 0x5a31, 0x5a32, 0x5a33, 0x4a54, 0x5a34, 0x4a2b, 0x5a35, 0x5a36, 0x334f, 0x566f, 0x5a37, 0x3b30, 0x352e, 0x5a38, 0x5a39, 0x396e, 0x512f, 0x5268, 0x5a3a, 0x3843, 0x4f6a, 0x326f, 0x5a3b, 0x5a3c, 0x3d6b, 0x4e5c, 0x536f, 0x5a3d, 0x4e73, 0x5a3e, 0x5355, 0x3b65, 0x5a3f, 0x4b35, 0x4b50, 0x5a40, 0x476b, 0x566e, 0x5a41, 0x4535, 0x3641, 0x5a42, 0x374c, 0x3f4e, 0x5a43, 0x5a44, 0x4b2d, 0x5a45, 0x3577, 0x5a46, 0x4142, 0x573b, 0x5a47, 0x4c38, 0x526a, 0x4431, 0x5a48, 0x357d, 0x3b51, 0x5a49, 0x5033, 0x5a4a, 0x5a4b, 0x4e3d, 0x5a4c, 0x5a4d, 0x5a4e, 0x3277, 0x5a51, 0x5a4f, 0x5168, 0x5a50, 0x4355, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x503b, 0x5225, 0x3079, 0x5a56, 0x472b, 0x5a57, 0x3d77, 0x4321, 0x5a58, 0x5a59, 0x437d, 0x4c37, 0x5a5a, 0x5a5b, 0x403e, 0x4657, 0x5a5c, 0x5a5d, 0x4734, 0x5a5e, 0x5a5f, 0x3948, 0x3b6d, 0x3639, 0x7478, 0x7479, 0x4d63, 0x7539, 0x6b60, 0x4f73, 0x3b3f, 0x3a40, 0x5425, 0x6159, 0x7574, 0x312a, 0x3272, 0x7575, 0x7577, 0x3a51, 0x7576, 0x4332, 0x7579, 0x7578, 0x3134, 0x556a, 0x383a, 0x3931, 0x3246, 0x5470, 0x4f4d, 0x305c, 0x554b, 0x3b75, 0x564a, 0x3737, 0x4c30, 0x4636, 0x3161, 0x393a, 0x567c, 0x3961, 0x3721, 0x3c7a, 0x6a5a, 0x6a5b, 0x4c79, 0x3973, 0x6a5c, 0x347b, 0x4333, 0x3751, 0x3a58, 0x6a5d, 0x5474, 0x6a5e, 0x3c56, 0x3b5f, 0x6a5f, 0x415e, 0x4238, 0x545f, 0x574a, 0x6a60, 0x6a61, 0x6a64, 0x6a62, 0x6a63, 0x495e, 0x3833, 0x3644, 0x6a65, 0x4a6a, 0x494d, 0x344d, 0x6259, 0x4562, 0x6a66, 0x4035, 0x5738, 0x6a67, 0x572c, 0x487c, 0x5853, 0x584d, 0x545e, 0x5479, 0x4944, 0x532e, 0x3853, 0x3360, 0x4962, 0x7476, 0x3a55, 0x7477, 0x575f, 0x7471, 0x3830, 0x5554, 0x384f, 0x4670, 0x3343, 0x7472, 0x332c, 0x543d, 0x4777, 0x7474, 0x7473, 0x4c4b, 0x4824, 0x7475, 0x5763, 0x453f, 0x7540, 0x753b, 0x7543, 0x7542, 0x563a, 0x7541, 0x543e, 0x7544, 0x754c, 0x304f, 0x3578, 0x7549, 0x754a, 0x455c, 0x7545, 0x7546, 0x7547, 0x754b, 0x3e60, 0x7548, 0x387a, 0x7550, 0x7553, 0x3f67, 0x3972, 0x753c, 0x754d, 0x4237, 0x4c78, 0x3c79, 0x754e, 0x754f, 0x7551, 0x3665, 0x7552, 0x7555, 0x753d, 0x7554, 0x533b, 0x336c, 0x4c24, 0x7556, 0x7557, 0x3e61, 0x7558, 0x4c5f, 0x755b, 0x3248, 0x5759, 0x7559, 0x755a, 0x755c, 0x7562, 0x7560, 0x755f, 0x755d, 0x7561, 0x755e, 0x7564, 0x7565, 0x4c63, 0x653f, 0x3538, 0x7563, 0x7568, 0x4c23, 0x7566, 0x7567, 0x753e, 0x3144, 0x753f, 0x3545, 0x3264, 0x756c, 0x7569, 0x3657, 0x756d, 0x756a, 0x756b, 0x345a, 0x546a, 0x756e, 0x3379, 0x756f, 0x7571, 0x7570, 0x7572, 0x7573, 0x496d, 0x392a, 0x477b, 0x3663, 0x4c49, 0x6a26, 0x3335, 0x547e, 0x396c, 0x5079, 0x696d, 0x572a, 0x696e, 0x4256, 0x486d, 0x3a64, 0x696f, 0x6970, 0x6971, 0x5661, 0x6972, 0x6973, 0x6975, 0x6974, 0x6976, 0x6977, 0x4761, 0x6978, 0x5458, 0x6979, 0x3d4e, 0x697a, 0x697b, 0x3d4f, 0x697c, 0x3828, 0x413e, 0x697d, 0x3132, 0x3b54, 0x3975, 0x697e, 0x6a21, 0x6a22, 0x6a23, 0x3778, 0x3c2d, 0x4a64, 0x604e, 0x542f, 0x4f3d, 0x5537, 0x6a24, 0x555e, 0x6a25, 0x5041, 0x393c, 0x3447, 0x3159, 0x4031, 0x3166, 0x3167, 0x3168, 0x333d, 0x4868, 0x6541, 0x315f, 0x4149, 0x346f, 0x4728, 0x5358, 0x4679, 0x5138, 0x397d, 0x4275, 0x532d, 0x544b, 0x3d7c, 0x6542, 0x3735, 0x6543, 0x3b39, 0x5562, 0x3d78, 0x5436, 0x4e25, 0x412c, 0x3359, 0x4c76, 0x6546, 0x6544, 0x6548, 0x654a, 0x6547, 0x354f, 0x4648, 0x357c, 0x6545, 0x4a76, 0x6549, 0x4354, 0x3145, 0x3c23, 0x5737, 0x4d4b, 0x4b4d, 0x4a4a, 0x4c53, 0x654c, 0x654b, 0x4466, 0x5121, 0x5137, 0x654d, 0x6550, 0x4d38, 0x5670, 0x654f, 0x355d, 0x4d3e, 0x6551, 0x363a, 0x4d28, 0x3964, 0x4a45, 0x3351, 0x4b59, 0x546c, 0x6552, 0x376a, 0x654e, 0x6555, 0x347e, 0x6556, 0x6553, 0x6554, 0x525d, 0x425f, 0x3146, 0x5362, 0x365d, 0x4b6c, 0x6557, 0x5376, 0x3169, 0x3674, 0x655a, 0x6558, 0x6559, 0x3540, 0x5245, 0x655c, 0x655e, 0x655d, 0x4732, 0x5223, 0x655b, 0x5462, 0x555a, 0x6560, 0x5771, 0x6561, 0x315c, 0x517b, 0x6562, 0x6564, 0x6563, 0x6565, 0x5258, 0x354b, 0x675f, 0x5a75, 0x5a78, 0x5a76, 0x5a77, 0x5a7a, 0x504f, 0x4447, 0x306e, 0x5030, 0x5a79, 0x534a, 0x3a2a, 0x5b22, 0x4771, 0x5a7c, 0x5a7b, 0x495b, 0x5a7d, 0x5b21, 0x575e, 0x5a7e, 0x415a, 0x5b25, 0x5374, 0x5b27, 0x5b24, 0x5b28, 0x3d3c, 0x4049, 0x5b23, 0x5b26, 0x5623, 0x5b29, 0x5b2d, 0x5b2e, 0x5b2c, 0x3a42, 0x3f24, 0x5b2b, 0x5b2a, 0x5447, 0x323f, 0x5b2f, 0x3979, 0x5b30, 0x333b, 0x3526, 0x363c, 0x5b31, 0x3675, 0x5b32, 0x3149, 0x5b34, 0x5b33, 0x5b35, 0x5b37, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x534f, 0x747a, 0x4775, 0x5743, 0x4564, 0x747c, 0x747d, 0x747b, 0x3e46, 0x506f, 0x3753, 0x544d, 0x4c2a, 0x7522, 0x7521, 0x3a28, 0x747e, 0x4b56, 0x7524, 0x4052, 0x336a, 0x4d2a, 0x7525, 0x7523, 0x3d34, 0x7528, 0x7529, 0x3d4d, 0x4338, 0x3f61, 0x4b61, 0x752a, 0x7526, 0x7527, 0x4470, 0x752c, 0x343c, 0x576d, 0x3457, 0x752b, 0x752e, 0x752d, 0x752f, 0x5051, 0x4351, 0x4829, 0x7530, 0x7531, 0x7532, 0x7533, 0x7534, 0x7535, 0x7537, 0x7536, 0x7538, 0x3249, 0x5354, 0x4a4d, 0x406f, 0x5658, 0x5230, 0x413f, 0x3d70, 0x382a, 0x3c78, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764c, 0x764b, 0x7769, 0x764d, 0x764e, 0x6e44, 0x6e45, 0x6e46, 0x556b, 0x3624, 0x6e48, 0x6e47, 0x6e49, 0x6e4a, 0x4725, 0x6e4b, 0x6e4c, 0x3730, 0x3576, 0x6e4d, 0x6e4f, 0x6e4e, 0x3846, 0x6e50, 0x6e51, 0x6e52, 0x365b, 0x332e, 0x5653, 0x4446, 0x3135, 0x3856, 0x6e53, 0x6e54, 0x543f, 0x4755, 0x3e7b, 0x4e59, 0x3933, 0x6e56, 0x6e55, 0x6e58, 0x6e57, 0x4525, 0x6e59, 0x6e5a, 0x472e, 0x6e5b, 0x472f, 0x6e5c, 0x3227, 0x6e5d, 0x6e5e, 0x6e5f, 0x6e60, 0x6e61, 0x576a, 0x6e62, 0x6e63, 0x3c58, 0x6e64, 0x534b, 0x4c7a, 0x322c, 0x4165, 0x6e65, 0x4726, 0x432d, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d, 0x6e6e, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e74, 0x6e73, 0x6e75, 0x4d2d, 0x4241, 0x6e76, 0x6e77, 0x6e78, 0x5521, 0x6e79, 0x4f33, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6f21, 0x6e7e, 0x6f22, 0x3875, 0x437a, 0x6f23, 0x6f24, 0x3d42, 0x523f, 0x3279, 0x6f25, 0x6f26, 0x6f27, 0x5278, 0x6f28, 0x567d, 0x6f29, 0x464c, 0x6f2a, 0x6f2b, 0x4134, 0x6f2c, 0x4f7a, 0x4b78, 0x6f2e, 0x6f2d, 0x337a, 0x3978, 0x6f2f, 0x6f30, 0x5062, 0x6f31, 0x6f32, 0x3766, 0x503f, 0x6f33, 0x6f34, 0x6f35, 0x4871, 0x4c60, 0x6f36, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x5560, 0x6f3b, 0x346d, 0x432a, 0x6f3c, 0x6f3d, 0x6f3e, 0x6f3f, 0x4e7d, 0x6f40, 0x4260, 0x3438, 0x5736, 0x3d75, 0x4f47, 0x6f43, 0x6f41, 0x6f42, 0x6f44, 0x3627, 0x3c7c, 0x3e62, 0x434c, 0x6f45, 0x6f46, 0x6f47, 0x6f4f, 0x6f48, 0x6f49, 0x6f4a, 0x4742, 0x6f71, 0x364d, 0x6f4b, 0x6f4c, 0x6f4d, 0x3646, 0x433e, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x5572, 0x6f53, 0x4477, 0x6f54, 0x4478, 0x6f55, 0x6f56, 0x3864, 0x3077, 0x6f57, 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x3e35, 0x6f61, 0x6f5f, 0x6f60, 0x6f62, 0x6f63, 0x414d, 0x6f64, 0x6f65, 0x6f66, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x4058, 0x6f6d, 0x412d, 0x6f6e, 0x6f6f, 0x6f70, 0x4f62, 0x3324, 0x4345, 0x6345, 0x4941, 0x6346, 0x3155, 0x4e4a, 0x3433, 0x4872, 0x6347, 0x4f50, 0x6348, 0x3c64, 0x6349, 0x634a, 0x4346, 0x5522, 0x4456, 0x396b, 0x4e45, 0x634b, 0x4376, 0x634c, 0x3727, 0x3873, 0x3a52, 0x634d, 0x634e, 0x5444, 0x634f, 0x6350, 0x514b, 0x6351, 0x6352, 0x6353, 0x6354, 0x5156, 0x6355, 0x327b, 0x403b, 0x6356, 0x402b, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x3837, 0x5a62, 0x3653, 0x5a64, 0x5a63, 0x5a66, 0x486e, 0x5a65, 0x3740, 0x5174, 0x5275, 0x5573, 0x3d57, 0x5768, 0x5a68, 0x5a67, 0x3022, 0x4d53, 0x5a69, 0x383d, 0x3c4a, 0x423d, 0x4224, 0x3342, 0x5a6a, 0x422a, 0x4430, 0x3d35, 0x4f5e, 0x5a6b, 0x4942, 0x315d, 0x5a6c, 0x3638, 0x543a, 0x337d, 0x5a6d, 0x5449, 0x4f55, 0x4563, 0x5a6e, 0x5a6f, 0x5a70, 0x416a, 0x4c55, 0x4f5d, 0x5367, 0x4221, 0x5a71, 0x4b65, 0x5a72, 0x4b66, 0x527e, 0x3874, 0x5a73, 0x302f, 0x4f36, 0x554f, 0x4b6d, 0x5a74, 0x6344, 0x4125, 0x763f, 0x7640, 0x7641, 0x4451, 0x4838, 0x5163, 0x505b, 0x5145, 0x3c2f, 0x394d, 0x6f74, 0x3446, 0x533a, 0x7642, 0x337b, 0x7643, 0x3571, 0x7645, 0x536a, 0x7627, 0x5129, 0x7629, 0x7628, 0x4163, 0x4057, 0x3122, 0x4e6d, 0x5068, 0x762b, 0x4f76, 0x762a, 0x5570, 0x762c, 0x4339, 0x3b74, 0x762e, 0x762d, 0x445e, 0x4158, 0x4b2a, 0x4f3c, 0x762f, 0x7630, 0x7631, 0x4236, 0x3054, 0x4579, 0x7632, 0x4760, 0x7626, 0x3e38, 0x3e32, 0x3565, 0x3747, 0x3f3f, 0x4352, 0x4366, 0x584c, 0x386f, 0x3d79, 0x5125, 0x3050, 0x7730, 0x7731, 0x502c, 0x3030, 0x7732, 0x7733, 0x7734, 0x474a, 0x3e4f, 0x7737, 0x7736, 0x315e, 0x7735, 0x7738, 0x7739, 0x4e24, 0x484d, 0x3a2b, 0x6838, 0x6839, 0x683a, 0x3e42, 0x5274, 0x544f, 0x4958, 0x5233, 0x3625, 0x476a, 0x717c, 0x4f6e, 0x4b33, 0x506b, 0x676f, 0x4d67, 0x394b, 0x3659, 0x717d, 0x3064, 0x4b4c, 0x717e, 0x5424, 0x422d, 0x416c, 0x4644, 0x3e31, 0x7221, 0x3c55, 0x7222, 0x7223, 0x7224, 0x5243, 0x4635, 0x4d47, 0x7225, 0x5331, 0x3f45, 0x4c62, 0x7226, 0x7227, 0x5155, 0x366e, 0x7228, 0x7229, 0x355f, 0x722a, 0x722b, 0x327c, 0x722c, 0x722d, 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x4a33, 0x6238, 0x774f, 0x7750, 0x324d, 0x7751, 0x7753, 0x7752, 0x623b, 0x3c22, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x3739, 0x527b, 0x3d24, 0x4a4e, 0x3125, 0x4b47, 0x6242, 0x367c, 0x4844, 0x6243, 0x3d48, 0x317d, 0x6244, 0x3676, 0x6245, 0x4459, 0x6246, 0x4f5a, 0x395d, 0x6247, 0x4021, 0x6248, 0x3276, 0x6249, 0x4173, 0x624a, 0x624b, 0x4278, 0x624c, 0x624d, 0x624e, 0x4a57, 0x5838, 0x5965, 0x4f63, 0x7025, 0x5c30, 0x426d, 0x5426, 0x4d54, 0x5131, 0x335b, 0x477d, 0x3235, 0x423f, 0x6660, 0x4a3b, 0x6661, 0x6662, 0x3e54, 0x6663, 0x5724, 0x4d55, 0x6665, 0x3c5d, 0x6664, 0x6666, 0x6667, 0x426e, 0x3d3e, 0x6668, 0x4266, 0x3a27, 0x6669, 0x666a, 0x3352, 0x5169, 0x3f25, 0x666b, 0x466f, 0x666c, 0x666d, 0x666e, 0x462d, 0x666f, 0x4927, 0x6670, 0x6671, 0x6672, 0x6539, 0x6673, 0x6674, 0x4262, 0x6675, 0x6676, 0x5668, 0x6677, 0x6678, 0x3947, 0x773b, 0x773a, 0x773e, 0x773c, 0x3a21, 0x773f, 0x7740, 0x7742, 0x7741, 0x7744, 0x7743, 0x7745, 0x7746, 0x7747, 0x4b68, 0x385f, 0x7754, 0x7755, 0x7756, 0x7758, 0x775a, 0x7757, 0x775b, 0x7759, 0x5757, 0x775c, 0x775d, 0x775e, 0x775f, 0x7760, 0x5b4b, 0x582a, 0x6577, 0x396d, 0x3f7d, 0x3b6a, 0x7749, 0x4647, 0x7748, 0x774a, 0x774c, 0x774b, 0x774d, 0x4e3a, 0x774e, 0x4427, 0x5363, 0x764f, 0x4233, 0x7650, 0x7651, 0x7652, 0x7653, 0x7654, 0x7656, 0x312b, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x4f4a, 0x765f, 0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x4070, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e, 0x766f, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x3e28, 0x7675, 0x7676, 0x7677, 0x7678, 0x487a, 0x7679, 0x767a, 0x767b, 0x767c, 0x767d, 0x767e, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726, 0x7727, 0x7728, 0x316e, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d, 0x415b, 0x772e, 0x772f, 0x4471, 0x702f, 0x3c26, 0x7030, 0x4379, 0x4538, 0x513b, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x513c, 0x516c, 0x7037, 0x7036, 0x5427, 0x4d52, 0x7038, 0x703a, 0x7039, 0x703b, 0x703c, 0x386b, 0x703d, 0x3a68, 0x703e, 0x703f, 0x3e69, 0x7040, 0x366c, 0x7041, 0x7042, 0x7043, 0x7044, 0x4835, 0x7045, 0x7046, 0x7047, 0x4574, 0x7048, 0x7049, 0x704a, 0x773d, 0x704b, 0x704c, 0x704d, 0x704e, 0x704f, 0x3a57, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7058, 0x5325, 0x7057, 0x7059, 0x753a, 0x4239, 0x7764, 0x7765, 0x7766, 0x7767, 0x7768, 0x4234, 0x776a, 0x776b, 0x4273, 0x7470, 0x746f, 0x4269, 0x7761, 0x7762, 0x3b46, 0x5964, 0x4a72, 0x4068, 0x7024, 0x3a5a, 0x472d, 0x442c, 0x776c, 0x776d, 0x776e, 0x7770, 0x776f, 0x7771, 0x7774, 0x7773, 0x7772, 0x7775, 0x7776, 0x6d69, 0x6d6a, 0x6d6b, 0x763c, 0x763d, 0x763e, 0x3626, 0x583e, 0x3944, 0x583b, 0x5c31, 0x4a73, 0x7777, 0x7778, 0x7779, 0x777b, 0x777a, 0x3147, 0x777c, 0x777d, 0x777e, 0x466b, 0x6c34, 0x335d, 0x7633, 0x7634, 0x4164, 0x7635, 0x7636, 0x7637, 0x7638, 0x7639, 0x763a, 0x4823, 0x763b, 0x417a, 0x3928, 0x6d68, 0x396a, 0x595f, 0x2321, 0x2322, 0x2323, 0x2167, 0x2325, 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, 0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x235b, 0x235c, 0x235d, 0x235e, 0x235f, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x237b, 0x237c, 0x237d, 0x212b, 0x2169, 0x216a, 0x237e, 0x2324, }; static const Summary16 gb2312_uni2indx_page00[70] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0190 }, { 3, 0x0003 }, { 5, 0x0000 }, { 5, 0x0080 }, { 6, 0x3703 }, { 13, 0x168c }, /* 0x0100 */ { 19, 0x0002 }, { 20, 0x0808 }, { 22, 0x0800 }, { 23, 0x0000 }, { 23, 0x2000 }, { 24, 0x0000 }, { 24, 0x0800 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x4000 }, { 26, 0x1555 }, { 33, 0x0000 }, { 33, 0x0000 }, /* 0x0200 */ { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0280 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, /* 0x0300 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0xfffe }, { 74, 0x03fb }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, /* 0x0400 */ { 83, 0x0002 }, { 84, 0xffff }, { 100, 0xffff }, { 116, 0xffff }, { 132, 0xffff }, { 148, 0x0002 }, }; static const Summary16 gb2312_uni2indx_page20[101] = { /* 0x2000 */ { 149, 0x0000 }, { 149, 0x3360 }, { 155, 0x0040 }, { 156, 0x080d }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, /* 0x2100 */ { 160, 0x0008 }, { 161, 0x0040 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0fff }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x000f }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, /* 0x2200 */ { 178, 0x8100 }, { 180, 0x6402 }, { 184, 0x4fa1 }, { 192, 0x20f0 }, { 197, 0x1100 }, { 199, 0x0000 }, { 199, 0xc033 }, { 205, 0x0000 }, { 205, 0x0000 }, { 205, 0x0200 }, { 206, 0x0020 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, /* 0x2300 */ { 207, 0x0000 }, { 207, 0x0004 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, /* 0x2400 */ { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x03ff }, { 218, 0xfff0 }, { 230, 0xffff }, { 246, 0x0fff }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, /* 0x2500 */ { 258, 0xffff }, { 274, 0xffff }, { 290, 0xffff }, { 306, 0xffff }, { 322, 0x0fff }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0003 }, { 336, 0x000c }, { 338, 0xc8c0 }, { 343, 0x0000 }, { 343, 0x0000 }, { 343, 0x0000 }, /* 0x2600 */ { 343, 0x0060 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0005 }, }; static const Summary16 gb2312_uni2indx_page30[35] = { /* 0x3000 */ { 347, 0xff2f }, { 360, 0x00fb }, { 367, 0x0000 }, { 367, 0x0000 }, { 367, 0xfffe }, { 382, 0xffff }, { 398, 0xffff }, { 414, 0xffff }, { 430, 0xffff }, { 446, 0x000f }, { 450, 0xfffe }, { 465, 0xffff }, { 481, 0xffff }, { 497, 0xffff }, { 513, 0xffff }, { 529, 0x087f }, /* 0x3100 */ { 537, 0xffe0 }, { 548, 0xffff }, { 564, 0x03ff }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, /* 0x3200 */ { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x03ff }, }; static const Summary16 gb2312_uni2indx_page4e[1263] = { /* 0x4e00 */ { 584, 0x7f8b }, { 595, 0x7f7b }, { 608, 0x3db4 }, { 617, 0xef55 }, { 628, 0xfba8 }, { 638, 0xf35d }, { 649, 0x0243 }, { 653, 0x400b }, { 657, 0xfb40 }, { 665, 0x8d3e }, { 674, 0x7bf7 }, { 687, 0x8c2c }, { 693, 0x6eff }, { 706, 0xe3fa }, { 717, 0x1d3a }, { 725, 0xa8ed }, /* 0x4f00 */ { 734, 0xe602 }, { 740, 0xcf83 }, { 749, 0x8cf5 }, { 758, 0x3555 }, { 766, 0xe048 }, { 771, 0xffab }, { 784, 0x92b9 }, { 792, 0xd859 }, { 800, 0xab18 }, { 807, 0x2892 }, { 812, 0xd7e9 }, { 823, 0x8020 }, { 825, 0xc438 }, { 831, 0xf583 }, { 840, 0xe74a }, { 849, 0x450a }, /* 0x5000 */ { 854, 0xb000 }, { 857, 0x9714 }, { 864, 0x7762 }, { 873, 0x5400 }, { 876, 0xd188 }, { 882, 0x1420 }, { 885, 0x1020 }, { 887, 0xc8c0 }, { 892, 0x2121 }, { 896, 0x0000 }, { 896, 0x13a8 }, { 902, 0x0c04 }, { 905, 0x8000 }, { 906, 0x0440 }, { 908, 0x70c0 }, { 913, 0x0828 }, /* 0x5100 */ { 916, 0x08c0 }, { 919, 0x0004 }, { 920, 0x0002 }, { 921, 0x8000 }, { 922, 0x2b7b }, { 932, 0x1472 }, { 938, 0x7924 }, { 945, 0x3bfb }, { 957, 0x3327 }, { 965, 0x1ae4 }, { 972, 0x9835 }, { 979, 0x38ef }, { 989, 0x9ad1 }, { 997, 0x2802 }, { 1000, 0xa813 }, { 1006, 0xbf69 }, /* 0x5200 */ { 1017, 0x65cf }, { 1027, 0x2fc6 }, { 1036, 0x6b11 }, { 1043, 0xafc9 }, { 1053, 0x340f }, { 1060, 0x5053 }, { 1066, 0x86a2 }, { 1072, 0xa004 }, { 1075, 0x0106 }, { 1078, 0xe809 }, { 1084, 0x3f0f }, { 1094, 0xc00e }, { 1099, 0x0a88 }, { 1103, 0x8145 }, { 1108, 0x0010 }, { 1109, 0xc601 }, /* 0x5300 */ { 1114, 0xa161 }, { 1120, 0x26e1 }, { 1127, 0x444b }, { 1133, 0xce00 }, { 1138, 0xc7aa }, { 1147, 0xd4ee }, { 1157, 0xcadf }, { 1168, 0x85bb }, { 1177, 0x3a74 }, { 1185, 0xa520 }, { 1190, 0x436c }, { 1197, 0x8840 }, { 1200, 0x3f06 }, { 1208, 0x8bd2 }, { 1216, 0xff79 }, { 1229, 0x3bef }, /* 0x5400 */ { 1241, 0xf75a }, { 1252, 0xe8ef }, { 1263, 0xfbcb }, { 1275, 0x5b36 }, { 1284, 0x0d49 }, { 1290, 0x1bfd }, { 1301, 0x0154 }, { 1305, 0x39ee }, { 1315, 0xd855 }, { 1323, 0x2e75 }, { 1332, 0xbfd8 }, { 1343, 0xa91a }, { 1350, 0xf3d7 }, { 1362, 0xf6bf }, { 1375, 0x67e0 }, { 1383, 0xb40c }, /* 0x5500 */ { 1389, 0x82c2 }, { 1394, 0x0813 }, { 1398, 0xd49d }, { 1407, 0xd08b }, { 1414, 0x065a }, { 1420, 0x1061 }, { 1424, 0x74f2 }, { 1433, 0x59e0 }, { 1440, 0x8f9f }, { 1451, 0xb312 }, { 1458, 0x0080 }, { 1459, 0x6aaa }, { 1467, 0x3230 }, { 1472, 0xb05e }, { 1480, 0x9d7a }, { 1490, 0x60ac }, /* 0x5600 */ { 1496, 0xd303 }, { 1503, 0xc900 }, { 1507, 0x3098 }, { 1512, 0x8a56 }, { 1519, 0x7000 }, { 1522, 0x1390 }, { 1527, 0x1f14 }, { 1534, 0x1842 }, { 1538, 0xc060 }, { 1542, 0x0008 }, { 1543, 0x8008 }, { 1545, 0x1080 }, { 1547, 0x0400 }, { 1548, 0xec90 }, { 1555, 0x2817 }, { 1561, 0xe633 }, /* 0x5700 */ { 1570, 0x0758 }, { 1576, 0x9000 }, { 1578, 0xf708 }, { 1586, 0x4e09 }, { 1592, 0xf485 }, { 1600, 0xfc83 }, { 1609, 0xaf53 }, { 1619, 0x18c8 }, { 1624, 0x187c }, { 1631, 0x080c }, { 1634, 0x6adf }, { 1645, 0x0114 }, { 1648, 0xc80c }, { 1653, 0xa734 }, { 1661, 0xa011 }, { 1665, 0x2710 }, /* 0x5800 */ { 1670, 0x28c5 }, { 1676, 0x4222 }, { 1680, 0x0413 }, { 1684, 0x0021 }, { 1686, 0x3010 }, { 1689, 0x4112 }, { 1693, 0x1820 }, { 1696, 0x4000 }, { 1697, 0x022b }, { 1702, 0xc60c }, { 1708, 0x0300 }, { 1710, 0x1000 }, { 1711, 0x0022 }, { 1713, 0x0022 }, { 1715, 0x5810 }, { 1719, 0x0249 }, /* 0x5900 */ { 1723, 0xa094 }, { 1728, 0x9670 }, { 1735, 0xeeb0 }, { 1744, 0x1792 }, { 1751, 0xcb96 }, { 1760, 0x05f2 }, { 1767, 0x0025 }, { 1770, 0x2358 }, { 1776, 0x25de }, { 1785, 0x42cc }, { 1791, 0xcf38 }, { 1800, 0x4a04 }, { 1804, 0x0c40 }, { 1807, 0x359f }, { 1817, 0x1128 }, { 1821, 0x8a00 }, /* 0x5a00 */ { 1824, 0x13fa }, { 1833, 0x910a }, { 1838, 0x0229 }, { 1842, 0x1056 }, { 1847, 0x0641 }, { 1851, 0x0420 }, { 1853, 0x0484 }, { 1856, 0x84f0 }, { 1862, 0x0000 }, { 1862, 0x0c04 }, { 1865, 0x0400 }, { 1866, 0x412c }, { 1871, 0x1206 }, { 1875, 0x1154 }, { 1880, 0x0a4b }, { 1886, 0x0002 }, /* 0x5b00 */ { 1887, 0x0200 }, { 1888, 0x00c0 }, { 1890, 0x0000 }, { 1890, 0x0094 }, { 1893, 0x0001 }, { 1894, 0xbfbb }, { 1907, 0x167c }, { 1915, 0x242b }, { 1921, 0x9bbb }, { 1932, 0x7fa8 }, { 1942, 0x0c7f }, { 1951, 0xe379 }, { 1961, 0x10f4 }, { 1967, 0xe00d }, { 1973, 0x4132 }, { 1978, 0x9f01 }, /* 0x5c00 */ { 1985, 0x8652 }, { 1991, 0x3572 }, { 1999, 0x10b4 }, { 2004, 0xff12 }, { 2014, 0xcf27 }, { 2024, 0x4223 }, { 2029, 0xc06b }, { 2036, 0x8602 }, { 2040, 0x3106 }, { 2045, 0x1fd3 }, { 2055, 0x3a0c }, { 2061, 0xa1aa }, { 2068, 0x0812 }, { 2071, 0x0204 }, { 2073, 0x2572 }, { 2080, 0x0801 }, /* 0x5d00 */ { 2082, 0x40cc }, { 2087, 0x4850 }, { 2091, 0x62d0 }, { 2097, 0x6010 }, { 2100, 0x1c80 }, { 2104, 0x2900 }, { 2107, 0x9a00 }, { 2111, 0x0010 }, { 2112, 0x0004 }, { 2113, 0x2200 }, { 2115, 0x0000 }, { 2115, 0x0080 }, { 2116, 0x2020 }, { 2118, 0x6800 }, { 2121, 0xcbe6 }, { 2131, 0x609e }, /* 0x5e00 */ { 2138, 0x916e }, { 2146, 0x3f73 }, { 2157, 0x60c0 }, { 2161, 0x3982 }, { 2167, 0x1034 }, { 2171, 0x4830 }, { 2175, 0x0006 }, { 2177, 0xbd5c }, { 2187, 0x8cd1 }, { 2194, 0xd6fb }, { 2206, 0x20e1 }, { 2211, 0x43e8 }, { 2218, 0x0600 }, { 2220, 0x084e }, { 2225, 0x0500 }, { 2227, 0xc4d0 }, /* 0x5f00 */ { 2233, 0x8d1f }, { 2242, 0x89aa }, { 2249, 0xa6e1 }, { 2257, 0x1602 }, { 2261, 0x0001 }, { 2262, 0x21ed }, { 2270, 0x3656 }, { 2278, 0x1a8b }, { 2285, 0x1fb7 }, { 2296, 0x13a5 }, { 2303, 0x6502 }, { 2308, 0x30a0 }, { 2312, 0xb278 }, { 2320, 0x23c7 }, { 2328, 0x6c93 }, { 2336, 0xe922 }, /* 0x6000 */ { 2343, 0xe47f }, { 2354, 0x3a74 }, { 2362, 0x8fe3 }, { 2372, 0x9820 }, { 2376, 0x280e }, { 2381, 0x2625 }, { 2387, 0xbf9c }, { 2398, 0xbf49 }, { 2408, 0x3218 }, { 2413, 0xac54 }, { 2420, 0xb949 }, { 2428, 0x1916 }, { 2434, 0x0c60 }, { 2438, 0xb522 }, { 2445, 0xfbc1 }, { 2455, 0x0659 }, /* 0x6100 */ { 2461, 0xe343 }, { 2469, 0x8420 }, { 2472, 0x08d9 }, { 2478, 0x8000 }, { 2479, 0x5500 }, { 2483, 0x2022 }, { 2486, 0x0184 }, { 2489, 0x00a1 }, { 2492, 0x4800 }, { 2494, 0x2010 }, { 2496, 0x1380 }, { 2500, 0x4080 }, { 2502, 0x0d04 }, { 2506, 0x0016 }, { 2509, 0x0040 }, { 2510, 0x8020 }, /* 0x6200 */ { 2512, 0xfd40 }, { 2520, 0x8de7 }, { 2530, 0x5436 }, { 2537, 0xe098 }, { 2543, 0x7b8b }, { 2553, 0x091e }, { 2559, 0xfec8 }, { 2569, 0xd249 }, { 2576, 0x0611 }, { 2580, 0x8dee }, { 2590, 0x1937 }, { 2598, 0xba22 }, { 2605, 0x77f4 }, { 2616, 0x9fdd }, { 2628, 0xf3ec }, { 2639, 0xf0da }, /* 0x6300 */ { 2648, 0x4386 }, { 2654, 0xec42 }, { 2661, 0x8d3f }, { 2671, 0x2604 }, { 2675, 0xfa6c }, { 2685, 0xc021 }, { 2689, 0x628e }, { 2696, 0x0cc2 }, { 2701, 0xd785 }, { 2710, 0x0145 }, { 2714, 0x77ad }, { 2725, 0x5599 }, { 2733, 0xe250 }, { 2739, 0x4045 }, { 2743, 0x260b }, { 2749, 0xa154 }, /* 0x6400 */ { 2755, 0x9827 }, { 2762, 0x5819 }, { 2768, 0x3443 }, { 2774, 0xa410 }, { 2778, 0x05f2 }, { 2785, 0x4114 }, { 2789, 0x2280 }, { 2792, 0x0700 }, { 2795, 0x00b4 }, { 2799, 0x4266 }, { 2805, 0x7210 }, { 2810, 0x15a1 }, { 2816, 0x6025 }, { 2821, 0x4185 }, { 2826, 0x0054 }, { 2829, 0x0000 }, /* 0x6500 */ { 2829, 0x0201 }, { 2831, 0x0104 }, { 2833, 0xc820 }, { 2837, 0xcb70 }, { 2845, 0x9320 }, { 2850, 0x6a62 }, { 2857, 0x184c }, { 2862, 0x0095 }, { 2866, 0x1880 }, { 2869, 0x9a8b }, { 2877, 0xaab2 }, { 2885, 0x3201 }, { 2889, 0xd87a }, { 2898, 0x00c4 }, { 2901, 0xf3e5 }, { 2912, 0x04c3 }, /* 0x6600 */ { 2917, 0xd44d }, { 2925, 0xa238 }, { 2931, 0xa1a1 }, { 2937, 0x5072 }, { 2943, 0x980a }, { 2948, 0x84fc }, { 2956, 0xc152 }, { 2962, 0x44d1 }, { 2968, 0x1094 }, { 2972, 0x20c2 }, { 2976, 0x4180 }, { 2979, 0x4210 }, { 2982, 0x0000 }, { 2982, 0x3a00 }, { 2986, 0x0240 }, { 2988, 0xd29d }, /* 0x6700 */ { 2997, 0x2f01 }, { 3003, 0xa8b1 }, { 3010, 0xbd40 }, { 3017, 0x2432 }, { 3022, 0xd34d }, { 3031, 0xd04b }, { 3038, 0xa723 }, { 3046, 0xd0ad }, { 3054, 0x0a92 }, { 3059, 0x75a1 }, { 3067, 0xadac }, { 3076, 0x01e9 }, { 3082, 0x801a }, { 3086, 0x771f }, { 3097, 0x9225 }, { 3103, 0xa01b }, /* 0x6800 */ { 3109, 0xdfa1 }, { 3119, 0x20ca }, { 3124, 0x0602 }, { 3127, 0x738c }, { 3135, 0x577f }, { 3147, 0x003b }, { 3152, 0x0bff }, { 3163, 0x00d0 }, { 3166, 0x806a }, { 3171, 0x0088 }, { 3173, 0xa1c4 }, { 3179, 0x0029 }, { 3182, 0x2a05 }, { 3187, 0x0524 }, { 3191, 0x4009 }, { 3194, 0x1623 }, /* 0x6900 */ { 3200, 0x6822 }, { 3205, 0x8005 }, { 3208, 0x2011 }, { 3211, 0xa211 }, { 3216, 0x0004 }, { 3217, 0x6490 }, { 3222, 0x4849 }, { 3227, 0x1382 }, { 3232, 0x23d5 }, { 3240, 0x1930 }, { 3245, 0x2980 }, { 3249, 0x0892 }, { 3253, 0x5402 }, { 3257, 0x8811 }, { 3261, 0x2001 }, { 3263, 0xa004 }, /* 0x6a00 */ { 3266, 0x0400 }, { 3267, 0x8180 }, { 3270, 0x8502 }, { 3274, 0x6022 }, { 3278, 0x0090 }, { 3280, 0x0b01 }, { 3284, 0x0022 }, { 3286, 0x1202 }, { 3289, 0x4011 }, { 3292, 0x0083 }, { 3295, 0x1a01 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, /* 0x6b00 */ { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x009f }, { 3305, 0x4684 }, { 3310, 0x12c8 }, { 3315, 0x0200 }, { 3316, 0x04fc }, { 3323, 0x1a00 }, { 3326, 0x2ede }, { 3336, 0x0c4c }, { 3341, 0x0402 }, { 3343, 0x80b8 }, { 3348, 0xa826 }, { 3354, 0x0afc }, { 3362, 0x8c02 }, { 3366, 0x2228 }, /* 0x6c00 */ { 3370, 0xa0e0 }, { 3375, 0x8f7b }, { 3386, 0xc7d6 }, { 3396, 0x2135 }, { 3402, 0x06c7 }, { 3409, 0xf8b1 }, { 3418, 0x0713 }, { 3424, 0x6255 }, { 3431, 0x936e }, { 3440, 0x8a19 }, { 3446, 0x6efa }, { 3457, 0xfb0e }, { 3467, 0x1630 }, { 3472, 0x48f9 }, { 3480, 0xcd2f }, { 3490, 0x7deb }, /* 0x6d00 */ { 3502, 0x5892 }, { 3508, 0x4e84 }, { 3514, 0x4ca0 }, { 3519, 0x7a2e }, { 3528, 0xedea }, { 3539, 0x561e }, { 3547, 0xc649 }, { 3554, 0x1190 }, { 3558, 0x5324 }, { 3564, 0xe83a }, { 3572, 0xcfdb }, { 3584, 0x8124 }, { 3588, 0x18f1 }, { 3595, 0x6342 }, { 3601, 0x5853 }, { 3608, 0x1a8a }, /* 0x6e00 */ { 3614, 0x7420 }, { 3619, 0x24d3 }, { 3626, 0xaa3b }, { 3635, 0x0514 }, { 3639, 0x6018 }, { 3643, 0x8958 }, { 3649, 0x4800 }, { 3651, 0xc000 }, { 3653, 0x8268 }, { 3658, 0x9101 }, { 3662, 0x84a4 }, { 3667, 0x2cd6 }, { 3675, 0x8886 }, { 3680, 0xc4ba }, { 3688, 0x0377 }, { 3696, 0x0210 }, /* 0x6f00 */ { 3698, 0x8244 }, { 3702, 0x0038 }, { 3705, 0xae11 }, { 3712, 0x404a }, { 3716, 0x28c0 }, { 3720, 0x5100 }, { 3723, 0x6044 }, { 3727, 0x1514 }, { 3732, 0x7310 }, { 3738, 0x1000 }, { 3739, 0x0082 }, { 3741, 0x0248 }, { 3744, 0x0205 }, { 3747, 0x4006 }, { 3750, 0xc003 }, { 3754, 0x0000 }, /* 0x7000 */ { 3754, 0x0000 }, { 3754, 0x0c02 }, { 3757, 0x0008 }, { 3758, 0x0220 }, { 3760, 0x9000 }, { 3762, 0x4000 }, { 3763, 0xb800 }, { 3767, 0xd161 }, { 3774, 0x4621 }, { 3779, 0x3274 }, { 3786, 0xf800 }, { 3791, 0x3b8a }, { 3799, 0x050f }, { 3805, 0x8b00 }, { 3809, 0xbbd0 }, { 3818, 0x2280 }, /* 0x7100 */ { 3821, 0x0600 }, { 3823, 0x0769 }, { 3830, 0x8040 }, { 3832, 0x0043 }, { 3835, 0x5420 }, { 3839, 0x5000 }, { 3841, 0x41d0 }, { 3846, 0x250c }, { 3851, 0x8410 }, { 3854, 0x8310 }, { 3858, 0x1101 }, { 3861, 0x0228 }, { 3864, 0x4008 }, { 3866, 0x0030 }, { 3868, 0x40a1 }, { 3872, 0x0200 }, /* 0x7200 */ { 3873, 0x0040 }, { 3874, 0x2000 }, { 3875, 0x1500 }, { 3878, 0xabe3 }, { 3888, 0x3180 }, { 3892, 0xaa44 }, { 3898, 0xc2c6 }, { 3905, 0xc624 }, { 3911, 0xac13 }, { 3918, 0x8004 }, { 3920, 0xb000 }, { 3923, 0x03d1 }, { 3929, 0x611e }, { 3936, 0x4285 }, { 3941, 0xf303 }, { 3949, 0x1d9f }, /* 0x7300 */ { 3959, 0x440a }, { 3963, 0x78e8 }, { 3971, 0x5e26 }, { 3979, 0xc392 }, { 3986, 0x2000 }, { 3987, 0x0085 }, { 3990, 0xb001 }, { 3994, 0x4000 }, { 3995, 0x4a90 }, { 4000, 0x8842 }, { 4004, 0xca04 }, { 4009, 0x0c8d }, { 4015, 0xa705 }, { 4022, 0x4203 }, { 4026, 0x22a1 }, { 4031, 0x0004 }, /* 0x7400 */ { 4032, 0x8668 }, { 4038, 0x0c01 }, { 4041, 0x5564 }, { 4048, 0x1079 }, { 4054, 0x0002 }, { 4055, 0xdea0 }, { 4063, 0x2000 }, { 4064, 0x40c1 }, { 4068, 0x488b }, { 4074, 0x5001 }, { 4077, 0x0380 }, { 4080, 0x0400 }, { 4081, 0x0000 }, { 4081, 0x5004 }, { 4084, 0xc05d }, { 4091, 0x80d0 }, /* 0x7500 */ { 4095, 0xa010 }, { 4098, 0x970a }, { 4105, 0xbb20 }, { 4112, 0x4daf }, { 4122, 0xd921 }, { 4129, 0x1e10 }, { 4134, 0x0460 }, { 4137, 0x8314 }, { 4142, 0x8848 }, { 4146, 0xa6d6 }, { 4155, 0xd83b }, { 4164, 0x733f }, { 4175, 0x27bc }, { 4184, 0x4974 }, { 4191, 0x0ddc }, { 4199, 0x9213 }, /* 0x7600 */ { 4205, 0x142b }, { 4211, 0x8ba1 }, { 4218, 0x2e75 }, { 4227, 0xd139 }, { 4235, 0x3009 }, { 4239, 0x5050 }, { 4243, 0x8808 }, { 4246, 0x6900 }, { 4250, 0x49d4 }, { 4257, 0x024a }, { 4261, 0x4010 }, { 4263, 0x8016 }, { 4267, 0xe564 }, { 4275, 0x89d7 }, { 4284, 0xc020 }, { 4287, 0x5316 }, /* 0x7700 */ { 4294, 0x2b92 }, { 4301, 0x8600 }, { 4304, 0xa345 }, { 4311, 0x15e0 }, { 4317, 0x008b }, { 4321, 0x0c03 }, { 4325, 0x196e }, { 4333, 0xe200 }, { 4337, 0x7031 }, { 4343, 0x8006 }, { 4346, 0x16a5 }, { 4353, 0xa829 }, { 4359, 0x2000 }, { 4360, 0x1880 }, { 4363, 0x7aac }, { 4372, 0xe148 }, /* 0x7800 */ { 4378, 0x3207 }, { 4384, 0xb5d6 }, { 4394, 0x32e8 }, { 4401, 0x5f91 }, { 4410, 0x50a1 }, { 4415, 0x20e5 }, { 4421, 0x7c00 }, { 4426, 0x1080 }, { 4428, 0x7280 }, { 4433, 0x9d8a }, { 4441, 0x00aa }, { 4445, 0x421f }, { 4452, 0x0e22 }, { 4457, 0x0231 }, { 4461, 0x1100 }, { 4463, 0x0494 }, /* 0x7900 */ { 4467, 0x0022 }, { 4469, 0x4008 }, { 4471, 0x0010 }, { 4472, 0x5c10 }, { 4477, 0x0343 }, { 4482, 0xfcc8 }, { 4491, 0xa1a5 }, { 4498, 0x0580 }, { 4501, 0x8433 }, { 4507, 0x0400 }, { 4508, 0x0080 }, { 4509, 0x6e08 }, { 4515, 0x2a4b }, { 4522, 0x8126 }, { 4527, 0xaad8 }, { 4535, 0x2901 }, /* 0x7a00 */ { 4539, 0x684d }, { 4546, 0x4490 }, { 4550, 0x0009 }, { 4552, 0xba88 }, { 4559, 0x0040 }, { 4560, 0x0082 }, { 4562, 0x0000 }, { 4562, 0x87d1 }, { 4570, 0x215b }, { 4577, 0xb1e6 }, { 4586, 0x3161 }, { 4592, 0x8008 }, { 4594, 0x0800 }, { 4595, 0xc240 }, { 4599, 0xa069 }, { 4605, 0xa600 }, /* 0x7b00 */ { 4609, 0x8d58 }, { 4616, 0x4a32 }, { 4622, 0x5d71 }, { 4631, 0x550a }, { 4637, 0x9aa0 }, { 4643, 0x2d57 }, { 4652, 0x4005 }, { 4655, 0x4aa6 }, { 4662, 0x2021 }, { 4665, 0x30b1 }, { 4671, 0x3fc6 }, { 4681, 0x0112 }, { 4684, 0x10c2 }, { 4688, 0x260a }, { 4693, 0x4462 }, { 4698, 0x5082 }, /* 0x7c00 */ { 4702, 0x9880 }, { 4706, 0x8040 }, { 4708, 0x04c0 }, { 4711, 0x8100 }, { 4713, 0x2003 }, { 4716, 0x0000 }, { 4716, 0x0000 }, { 4716, 0x3818 }, { 4721, 0x0200 }, { 4722, 0xf1a6 }, { 4731, 0x4434 }, { 4736, 0x720e }, { 4743, 0x35a2 }, { 4750, 0x92e0 }, { 4756, 0x8101 }, { 4759, 0x0900 }, /* 0x7d00 */ { 4761, 0x0400 }, { 4762, 0x0000 }, { 4762, 0x8885 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x4000 }, { 4768, 0x0080 }, { 4769, 0x0000 }, { 4769, 0x0000 }, { 4769, 0x4040 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, /* 0x7e00 */ { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0800 }, { 4772, 0x0082 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0004 }, { 4775, 0x8800 }, { 4777, 0xbfff }, { 4792, 0xe7ef }, { 4805, 0xffff }, { 4821, 0xffbf }, { 4836, 0xefef }, { 4850, 0xfdff }, /* 0x7f00 */ { 4865, 0xfbff }, { 4880, 0xbffe }, { 4894, 0xffff }, { 4910, 0x057f }, { 4919, 0x0034 }, { 4922, 0x85b3 }, { 4930, 0x4706 }, { 4936, 0x4216 }, { 4941, 0x5402 }, { 4945, 0xe410 }, { 4950, 0x8092 }, { 4954, 0xb305 }, { 4961, 0x5422 }, { 4966, 0x8130 }, { 4970, 0x4263 }, { 4976, 0x180b }, /* 0x8000 */ { 4981, 0x387b }, { 4990, 0x13f5 }, { 4999, 0x07e5 }, { 5007, 0xa9ea }, { 5016, 0x3c4c }, { 5023, 0x0514 }, { 5027, 0x0600 }, { 5029, 0x8002 }, { 5031, 0x1ad9 }, { 5039, 0xbd48 }, { 5047, 0xee37 }, { 5058, 0xf496 }, { 5067, 0x705f }, { 5076, 0x7ec0 }, { 5084, 0xbfb2 }, { 5095, 0x355f }, /* 0x8100 */ { 5105, 0xe644 }, { 5112, 0x455f }, { 5121, 0x9000 }, { 5123, 0x4146 }, { 5128, 0x1d40 }, { 5133, 0x063b }, { 5140, 0x62a1 }, { 5146, 0xfe13 }, { 5156, 0x8505 }, { 5161, 0x3902 }, { 5166, 0x0548 }, { 5170, 0x0c08 }, { 5173, 0x144f }, { 5180, 0x0000 }, { 5180, 0x3488 }, { 5185, 0x5818 }, /* 0x8200 */ { 5190, 0x3077 }, { 5198, 0xd815 }, { 5205, 0xbd0e }, { 5214, 0x4bfb }, { 5225, 0x8a90 }, { 5230, 0x8500 }, { 5233, 0xc100 }, { 5236, 0xe61d }, { 5245, 0xed14 }, { 5253, 0xb386 }, { 5261, 0xff72 }, { 5273, 0x639b }, { 5282, 0xfd92 }, { 5292, 0xd9be }, { 5303, 0x887b }, { 5311, 0x0a92 }, /* 0x8300 */ { 5316, 0xd3fe }, { 5328, 0x1cb2 }, { 5335, 0xb980 }, { 5341, 0x177a }, { 5350, 0x82c9 }, { 5356, 0xdc17 }, { 5365, 0xfffb }, { 5380, 0x3980 }, { 5385, 0x4260 }, { 5389, 0x590c }, { 5395, 0x0f01 }, { 5400, 0x37df }, { 5412, 0x94a3 }, { 5419, 0xb150 }, { 5425, 0x0623 }, { 5430, 0x2307 }, /* 0x8400 */ { 5436, 0xf85a }, { 5445, 0x3102 }, { 5449, 0x01f0 }, { 5454, 0x3102 }, { 5458, 0x0040 }, { 5459, 0x1e82 }, { 5465, 0x3a0a }, { 5471, 0x056a }, { 5477, 0x5b84 }, { 5484, 0x1280 }, { 5487, 0x8002 }, { 5489, 0xa714 }, { 5496, 0x2612 }, { 5501, 0xa04b }, { 5507, 0x1069 }, { 5512, 0x9001 }, /* 0x8500 */ { 5515, 0x1000 }, { 5516, 0x848a }, { 5521, 0x1802 }, { 5524, 0x3f80 }, { 5531, 0x0708 }, { 5535, 0x4240 }, { 5538, 0x0110 }, { 5540, 0x4e14 }, { 5546, 0x80b0 }, { 5550, 0x1800 }, { 5552, 0xc510 }, { 5557, 0x0281 }, { 5560, 0x8202 }, { 5563, 0x1029 }, { 5567, 0x0210 }, { 5569, 0x8800 }, /* 0x8600 */ { 5571, 0x0020 }, { 5572, 0x0042 }, { 5574, 0x0280 }, { 5576, 0x1100 }, { 5578, 0xe000 }, { 5581, 0x4413 }, { 5586, 0x5804 }, { 5590, 0xfe02 }, { 5598, 0x3c07 }, { 5605, 0x3028 }, { 5609, 0x9798 }, { 5617, 0x0473 }, { 5623, 0xced1 }, { 5632, 0xcb13 }, { 5640, 0x6210 }, { 5644, 0x431f }, /* 0x8700 */ { 5652, 0x278d }, { 5660, 0x55ac }, { 5668, 0x422e }, { 5674, 0xc892 }, { 5680, 0x5380 }, { 5685, 0x0288 }, { 5688, 0x4039 }, { 5693, 0x7851 }, { 5700, 0x292c }, { 5706, 0x8088 }, { 5709, 0xb900 }, { 5714, 0x2428 }, { 5718, 0x0c41 }, { 5722, 0x080e }, { 5726, 0x4421 }, { 5730, 0x4200 }, /* 0x8800 */ { 5732, 0x0408 }, { 5734, 0x0868 }, { 5738, 0x0006 }, { 5740, 0x1204 }, { 5743, 0x3031 }, { 5748, 0x0290 }, { 5751, 0x5b3e }, { 5761, 0xe085 }, { 5767, 0x2936 }, { 5774, 0x1044 }, { 5777, 0x2814 }, { 5781, 0x1082 }, { 5784, 0x4266 }, { 5790, 0x8334 }, { 5796, 0x013c }, { 5801, 0x531b }, /* 0x8900 */ { 5809, 0x0404 }, { 5811, 0x0e0d }, { 5817, 0x0c22 }, { 5821, 0x0051 }, { 5824, 0x0012 }, { 5826, 0xc000 }, { 5828, 0x0040 }, { 5829, 0x8800 }, { 5831, 0x004a }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0xdff6 }, { 5847, 0x5447 }, { 5854, 0x8868 }, { 5859, 0x0008 }, /* 0x8a00 */ { 5860, 0x0081 }, { 5862, 0x0000 }, { 5862, 0x0000 }, { 5862, 0x4000 }, { 5863, 0x0100 }, { 5864, 0x0000 }, { 5864, 0x0000 }, { 5864, 0x0200 }, { 5865, 0x0600 }, { 5867, 0x0008 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, /* 0x8b00 */ { 5868, 0x0080 }, { 5869, 0x0000 }, { 5869, 0x0040 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x1040 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0xefff }, { 5887, 0xf7fd }, { 5901, 0xff7f }, { 5916, 0xfffe }, { 5931, 0xfbff }, { 5946, 0xffff }, /* 0x8c00 */ { 5962, 0xfdff }, { 5977, 0xbfff }, { 5992, 0xffff }, { 6008, 0x00ff }, { 6016, 0x12c2 }, { 6021, 0x0420 }, { 6023, 0x0c06 }, { 6027, 0x0708 }, { 6031, 0x1624 }, { 6036, 0x0110 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, /* 0x8d00 */ { 6038, 0x0000 }, { 6038, 0xe000 }, { 6041, 0xfffe }, { 6056, 0xffff }, { 6072, 0xffff }, { 6088, 0x7f79 }, { 6100, 0x28df }, { 6109, 0x00f9 }, { 6115, 0x0c32 }, { 6120, 0x8012 }, { 6123, 0x0008 }, { 6124, 0xd53a }, { 6133, 0xd858 }, { 6140, 0xecc2 }, { 6148, 0x9d18 }, { 6155, 0x2fa8 }, /* 0x8e00 */ { 6163, 0x9620 }, { 6168, 0xe010 }, { 6172, 0xd60c }, { 6179, 0x2622 }, { 6184, 0x0f97 }, { 6193, 0x0206 }, { 6196, 0xb240 }, { 6201, 0x9055 }, { 6207, 0x80a2 }, { 6211, 0x5011 }, { 6215, 0x9800 }, { 6218, 0x0404 }, { 6220, 0x4000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, /* 0x8f00 */ { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0xfbc0 }, { 6230, 0xffff }, { 6246, 0xeffe }, { 6260, 0xdffb }, { 6274, 0x0b08 }, { 6278, 0x6243 }, { 6284, 0x41b6 }, { 6291, 0xfb3b }, { 6303, 0x6f74 }, { 6313, 0x2389 }, /* 0x9000 */ { 6319, 0xae7f }, { 6331, 0xecd7 }, { 6342, 0xe047 }, { 6349, 0x5960 }, { 6355, 0xa096 }, { 6361, 0x098f }, { 6368, 0x612c }, { 6374, 0xa030 }, { 6378, 0x090d }, { 6383, 0x2aaa }, { 6390, 0xd44e }, { 6398, 0x4f7b }, { 6409, 0xc4b2 }, { 6416, 0x388b }, { 6423, 0xa9c6 }, { 6431, 0x6110 }, /* 0x9100 */ { 6435, 0x0014 }, { 6437, 0x4200 }, { 6439, 0x800c }, { 6442, 0x0202 }, { 6444, 0xfe48 }, { 6453, 0x6485 }, { 6459, 0xd63e }, { 6469, 0xe3f7 }, { 6481, 0x3aa0 }, { 6487, 0x0c07 }, { 6492, 0xe40c }, { 6498, 0x0430 }, { 6501, 0xf680 }, { 6508, 0x1002 }, { 6510, 0x0000 }, { 6510, 0x0000 }, /* 0x9200 */ { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0010 }, { 6511, 0x4000 }, { 6512, 0x0000 }, { 6512, 0x4000 }, { 6513, 0x0000 }, { 6513, 0x0100 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, /* 0x9300 */ { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x4000 }, { 6515, 0x0000 }, { 6515, 0x0000 }, { 6515, 0x0400 }, { 6516, 0x0000 }, { 6516, 0x8000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0400 }, { 6518, 0x0040 }, { 6519, 0x0000 }, { 6519, 0x0000 }, /* 0x9400 */ { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x4000 }, { 6520, 0x0000 }, { 6520, 0x0000 }, { 6520, 0x0800 }, { 6521, 0x0000 }, { 6521, 0xffe0 }, { 6532, 0xfebd }, { 6545, 0xffff }, { 6561, 0xffff }, { 6577, 0x7f7f }, { 6591, 0xfbe7 }, { 6604, 0xffbf }, { 6619, 0xf7ff }, /* 0x9500 */ { 6634, 0xffff }, { 6650, 0xefff }, { 6665, 0xff7e }, { 6679, 0xdff7 }, { 6693, 0xf6f7 }, { 6706, 0xfbdf }, { 6720, 0xbffe }, { 6734, 0x804f }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0xef00 }, { 6747, 0x7fff }, /* 0x9600 */ { 6762, 0xff7f }, { 6777, 0xb6f7 }, { 6789, 0x4406 }, { 6793, 0xb87e }, { 6803, 0x3bf5 }, { 6814, 0x8831 }, { 6819, 0x1796 }, { 6827, 0x00f4 }, { 6832, 0xa960 }, { 6838, 0x1391 }, { 6844, 0x0080 }, { 6845, 0x7249 }, { 6852, 0xf2f3 }, { 6863, 0x0024 }, { 6865, 0x8701 }, { 6870, 0x42c8 }, /* 0x9700 */ { 6875, 0xe3d3 }, { 6885, 0x5048 }, { 6889, 0x2400 }, { 6891, 0x4305 }, { 6896, 0x0000 }, { 6896, 0x4a4c }, { 6902, 0x0227 }, { 6907, 0x1058 }, { 6911, 0x2820 }, { 6914, 0x0116 }, { 6918, 0xa809 }, { 6923, 0x0014 }, { 6925, 0x0000 }, { 6925, 0x0000 }, { 6925, 0x3ec0 }, { 6932, 0x0068 }, /* 0x9800 */ { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0xffe0 }, { 6946, 0xb7ff }, { 6960, 0xfddb }, { 6973, 0x00f7 }, { 6980, 0x0000 }, { 6980, 0x4000 }, { 6981, 0xc72e }, { 6990, 0x0180 }, { 6992, 0x0000 }, /* 0x9900 */ { 6992, 0x2000 }, { 6993, 0x0001 }, { 6994, 0x4000 }, { 6995, 0x0000 }, { 6995, 0x0000 }, { 6995, 0x0030 }, { 6997, 0xffa8 }, { 7008, 0xb4f7 }, { 7019, 0xadf3 }, { 7030, 0x03ff }, { 7040, 0x0120 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, /* 0x9a00 */ { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0xf000 }, { 7046, 0xfffb }, { 7061, 0x9df7 }, { 7073, 0xfdcf }, { 7086, 0x01bf }, { 7094, 0x15c3 }, { 7101, 0x1827 }, { 7107, 0x810a }, { 7111, 0xa842 }, { 7116, 0x0a00 }, /* 0x9b00 */ { 7118, 0x8108 }, { 7121, 0x8008 }, { 7123, 0x8008 }, { 7125, 0x1804 }, { 7128, 0xa3be }, { 7138, 0x0012 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, /* 0x9c00 */ { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x9000 }, { 7142, 0x69e6 }, { 7151, 0xdc37 }, { 7161, 0x6bff }, { 7174, 0x3dff }, { 7187, 0xfcf8 }, { 7198, 0xf3f9 }, { 7210, 0x0004 }, }; static const Summary16 gb2312_uni2indx_page9e[27] = { /* 0x9e00 */ { 7211, 0x0000 }, { 7211, 0x8000 }, { 7212, 0xbf6f }, { 7225, 0xe7ee }, { 7237, 0xdffe }, { 7251, 0x5da2 }, { 7259, 0x3fd8 }, { 7269, 0xc00b }, { 7274, 0x0984 }, { 7278, 0xa00c }, { 7282, 0x0040 }, { 7283, 0x6910 }, { 7288, 0xe210 }, { 7293, 0xb912 }, { 7300, 0x86a5 }, { 7307, 0x5a00 }, /* 0x9f00 */ { 7311, 0x6800 }, { 7314, 0x0289 }, { 7318, 0x9005 }, { 7322, 0x6a80 }, { 7327, 0x0010 }, { 7328, 0x0003 }, { 7330, 0x0000 }, { 7330, 0x8000 }, { 7331, 0x1ff9 }, { 7342, 0x8e00 }, { 7346, 0x0001 }, }; static const Summary16 gb2312_uni2indx_pageff[15] = { /* 0xff00 */ { 7347, 0xfffe }, { 7362, 0xffff }, { 7378, 0xffff }, { 7394, 0xffff }, { 7410, 0xffff }, { 7426, 0x7fff }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x002b }, }; static int gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0460) summary = &gb2312_uni2indx_page00[(wc>>4)]; else if (wc >= 0x2000 && wc < 0x2650) summary = &gb2312_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x3000 && wc < 0x3230) summary = &gb2312_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9cf0) summary = &gb2312_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0x9e00 && wc < 0x9fb0) summary = &gb2312_uni2indx_page9e[(wc>>4)-0x9e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &gb2312_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = gb2312_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.1.06/src/libtiniconv/encdec/iso8859_4.h0000644000175000017500000001114213472116001016027 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-4 */ static const unsigned short iso8859_4_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, /* 0xd0 */ 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, /* 0xf0 */ 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, }; static int iso8859_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_4_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_4_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xaf, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0xaa, 0xba, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xcf, 0xef, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xf3, /* 0x30-0x37 */ 0xa2, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xbd, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, /* 0x60-0x67 */ 0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_4_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_4_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_4_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.1.06/src/libtiniconv/tiniconv.h0000644000175000017500000001261313472116001015070 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef TINICONV_H_ #define TINICONV_H_ /* For exporting functions under WIN32 */ #ifdef WIN32 #ifdef DLL #define EXPORT(type) __declspec(dllexport) type #else #define EXPORT(type) /*__declspec(dllimport)*/ type #endif/*DLL*/ #else #define EXPORT(type) type #endif /*WIN32*/ typedef unsigned int ucs4_t; typedef struct tiniconv_ctx_s * conv_t; /* * int xxx_mb2wc (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n) * converts the byte sequence starting at s to a wide character. Up to n bytes * are available at s. n is >= 1. * Result is number of bytes consumed (if a wide character was read), * or -1 if invalid, or -2 if n too small, or -2-(number of bytes consumed) * if only a shift sequence was read. */ typedef int (*xxx_mb2wc_t) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); /* * int xxx_flushwc (conv_t conv, ucs4_t *pwc) * returns to the initial state and stores the pending wide character, if any. * Result is 1 (if a wide character was read) or 0 if none was pending. */ typedef int (*xxx_flushwc_t) (conv_t conv, ucs4_t *pwc); /* * int xxx_wc2mb (conv_t conv, unsigned char *r, ucs4_t wc, int n) * converts the wide character wc to the character set xxx, and stores the * result beginning at r. Up to n bytes may be written at r. n is >= 1. * Result is number of bytes written, or -1 if invalid, or -2 if n too small. */ typedef int (*xxx_wc2mb_t) (conv_t conv, unsigned char *r, ucs4_t wc, int n); /* * int xxx_reset (conv_t conv, unsigned char *r, int n) * stores a shift sequences returning to the initial state beginning at r. * Up to n bytes may be written at r. n is >= 0. * Result is number of bytes written, or -2 if n too small. */ typedef int (*xxx_reset_t) (conv_t conv, unsigned char *r, int n); typedef unsigned int conv_state_t; struct tiniconv_ctx_s { conv_state_t istate; conv_state_t ostate; xxx_mb2wc_t mb2wc; xxx_flushwc_t flushwc; xxx_wc2mb_t wc2mb; xxx_reset_t reset; int options; }; /* * tiniconv_init */ #define TINICONV_CHARSET_ASCII 0 #define TINICONV_CHARSET_CP1250 1 #define TINICONV_CHARSET_CP1251 2 #define TINICONV_CHARSET_CP1252 3 #define TINICONV_CHARSET_CP1253 4 #define TINICONV_CHARSET_CP1254 5 #define TINICONV_CHARSET_CP1255 6 #define TINICONV_CHARSET_CP1256 7 #define TINICONV_CHARSET_CP1257 8 #define TINICONV_CHARSET_CP1258 9 #define TINICONV_CHARSET_CP936 10 #define TINICONV_CHARSET_GB2312 11 #define TINICONV_CHARSET_GBK 12 #define TINICONV_CHARSET_ISO_2022_JP 13 #define TINICONV_CHARSET_ISO_8859_1 14 #define TINICONV_CHARSET_ISO_8859_2 15 #define TINICONV_CHARSET_ISO_8859_3 16 #define TINICONV_CHARSET_ISO_8859_4 17 #define TINICONV_CHARSET_ISO_8859_5 18 #define TINICONV_CHARSET_ISO_8859_6 19 #define TINICONV_CHARSET_ISO_8859_7 20 #define TINICONV_CHARSET_ISO_8859_8 21 #define TINICONV_CHARSET_ISO_8859_9 22 #define TINICONV_CHARSET_ISO_8859_10 23 #define TINICONV_CHARSET_ISO_8859_11 24 #define TINICONV_CHARSET_ISO_8859_13 25 #define TINICONV_CHARSET_ISO_8859_14 26 #define TINICONV_CHARSET_ISO_8859_15 27 #define TINICONV_CHARSET_ISO_8859_16 28 #define TINICONV_CHARSET_CP866 29 #define TINICONV_CHARSET_KOI8_R 30 #define TINICONV_CHARSET_KOI8_RU 31 #define TINICONV_CHARSET_KOI8_U 32 #define TINICONV_CHARSET_MACCYRILLIC 33 #define TINICONV_CHARSET_UCS_2 34 #define TINICONV_CHARSET_UTF_7 35 #define TINICONV_CHARSET_UTF_8 36 #define TINICONV_CHARSET_CHINESE 37 #define TINICONV_CHARSET_BIG5 38 #define TINICONV_CHARSETSIZE 39 #define TINICONV_OPTION_IGNORE_IN_ILSEQ 1 /*< ignore incorrect input sequences */ #define TINICONV_OPTION_IGNORE_OUT_ILSEQ 2 /*< replace sequence which can't be converted to OUT charset with OUTIL_CHAR */ /* #define TINICONV_OPTION_TRANSLIT 4 */ #define TINICONV_OPTION_OUT_ILSEQ_CHAR(ch) (ch << 8) #define TINICONV_INIT_OK 0 #define TINICONV_INIT_IN_CHARSET_NA -1 #define TINICONV_INIT_OUT_CHARSET_NA -1 #ifdef __cplusplus extern "C" { #endif EXPORT(int) tiniconv_init(int in_charset_id, int out_charset_id, int options, struct tiniconv_ctx_s *ctx); /* * tiniconv_convert */ #define TINICONV_CONVERT_OK 0 #define TINICONV_CONVERT_IN_TOO_SMALL -1 #define TINICONV_CONVERT_OUT_TOO_SMALL -2 #define TINICONV_CONVERT_IN_ILSEQ -3 #define TINICONV_CONVERT_OUT_ILSEQ -4 EXPORT(int) tiniconv_convert(struct tiniconv_ctx_s *ctx, unsigned char const *in_buf, int in_size, int *p_in_size_consumed, unsigned char *out_buf, int out_size, int *p_out_size_consumed); #ifdef __cplusplus } #endif #endif /*TINICONV_H_*/ fldigi-4.1.06/src/libtiniconv/tiniconv_desc.c0000644000175000017500000001340613472116001016062 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "tiniconv_int.h" #include #define abort() assert(0) #define NULL 0 #include "encdec/ascii.h" #include "encdec/cp1250.h" #include "encdec/cp1251.h" #include "encdec/cp1252.h" #include "encdec/cp1253.h" #include "encdec/cp1254.h" #include "encdec/cp1255.h" #include "encdec/cp1256.h" #include "encdec/cp1257.h" #include "encdec/cp1258.h" #include "encdec/iso8859_1.h" #include "encdec/iso8859_2.h" #include "encdec/iso8859_3.h" #include "encdec/iso8859_4.h" #include "encdec/iso8859_5.h" #include "encdec/iso8859_6.h" #include "encdec/iso8859_7.h" #include "encdec/iso8859_8.h" #include "encdec/iso8859_9.h" #include "encdec/iso8859_10.h" #include "encdec/iso8859_11.h" #include "encdec/iso8859_13.h" #include "encdec/iso8859_14.h" #include "encdec/iso8859_15.h" #include "encdec/iso8859_16.h" #include "encdec/cp866.h" #include "encdec/koi8_r.h" #include "encdec/koi8_ru.h" #include "encdec/koi8_u.h" #include "encdec/mac_cyrillic.h" #include "encdec/ucs2.h" #include "encdec/utf7.h" #include "encdec/utf8.h" #include "encdec/gb2312.h" /* is needed for euc_cn.h */ #include "encdec/euc_cn.h" #include "encdec/gbk.h" #include "encdec/ces_gbk.h" #include "encdec/big5.h" /* is needed for ces_big5.h */ #include "encdec/ces_big5.h" #include "encdec/jisx0208.h" #include "encdec/jisx0201.h" #include "encdec/cp936.h" #include "encdec/iso2022_jp.h" const struct tiniconv_charset_map_entry_s tiniconv_charset_map[] = { {ascii_mbtowc, NULL, ascii_wctomb, NULL }, /* 0 */ {cp1250_mbtowc, NULL, cp1250_wctomb, NULL }, /* 1 */ {cp1251_mbtowc, NULL, cp1251_wctomb, NULL }, /* 2 */ {cp1252_mbtowc, NULL, cp1252_wctomb, NULL }, /* 3 */ {cp1253_mbtowc, NULL, cp1253_wctomb, NULL }, /* 4 */ {cp1254_mbtowc, NULL, cp1254_wctomb, NULL }, /* 5 */ {cp1255_mbtowc, cp1255_flushwc, cp1255_wctomb, NULL }, /* 6 */ {cp1256_mbtowc, NULL, cp1256_wctomb, NULL }, /* 7 */ {cp1257_mbtowc, NULL, cp1257_wctomb, NULL }, /* 8 */ {cp1258_mbtowc, cp1258_flushwc, cp1258_wctomb, NULL }, /* 9 */ {cp936_mbtowc, NULL, cp936_wctomb, NULL }, /* 10 */ {euc_cn_mbtowc, NULL, euc_cn_wctomb, NULL }, /* 11 */ {gbk_mbtowc, NULL, gbk_wctomb, NULL }, /* 12 */ {iso2022_jp_mbtowc, NULL, iso2022_jp_wctomb, iso2022_jp_reset}, /* 13 */ {iso8859_1_mbtowc, NULL, iso8859_1_wctomb, NULL }, /* 14 */ {iso8859_2_mbtowc, NULL, iso8859_2_wctomb, NULL }, /* 15 */ {iso8859_3_mbtowc, NULL, iso8859_3_wctomb, NULL }, /* 16 */ {iso8859_4_mbtowc, NULL, iso8859_4_wctomb, NULL }, /* 17 */ {iso8859_5_mbtowc, NULL, iso8859_5_wctomb, NULL }, /* 18 */ {iso8859_6_mbtowc, NULL, iso8859_6_wctomb, NULL }, /* 19 */ {iso8859_7_mbtowc, NULL, iso8859_7_wctomb, NULL }, /* 20 */ {iso8859_8_mbtowc, NULL, iso8859_8_wctomb, NULL }, /* 21 */ {iso8859_9_mbtowc, NULL, iso8859_9_wctomb, NULL }, /* 22 */ {iso8859_10_mbtowc, NULL, iso8859_10_wctomb, NULL }, /* 23 */ {iso8859_11_mbtowc, NULL, iso8859_11_wctomb, NULL }, /* 24 */ {iso8859_13_mbtowc, NULL, iso8859_13_wctomb, NULL }, /* 25 */ {iso8859_14_mbtowc, NULL, iso8859_14_wctomb, NULL }, /* 26 */ {iso8859_15_mbtowc, NULL, iso8859_15_wctomb, NULL }, /* 27 */ {iso8859_16_mbtowc, NULL, iso8859_16_wctomb, NULL }, /* 28 */ {cp866_mbtowc, NULL, cp866_wctomb, NULL }, /* 29 */ {koi8_r_mbtowc, NULL, koi8_r_wctomb, NULL }, /* 30 */ {koi8_ru_mbtowc, NULL, koi8_ru_wctomb, NULL }, /* 31 */ {koi8_u_mbtowc, NULL, koi8_u_wctomb, NULL }, /* 32 */ {mac_cyrillic_mbtowc, NULL, mac_cyrillic_wctomb, NULL }, /* 33 */ {ucs2_mbtowc, NULL, ucs2_wctomb, NULL }, /* 34 */ {utf7_mbtowc, NULL, utf7_wctomb, utf7_reset }, /* 35 */ {utf8_mbtowc, NULL, utf8_wctomb, NULL }, /* 36 */ {gb2312_mbtowc, NULL, gb2312_wctomb, NULL }, /* 37, CHINESE */ {ces_big5_mbtowc, NULL, ces_big5_wctomb, NULL }, /* 38 */ {NULL, NULL, NULL, NULL } }; fldigi-4.1.06/src/contestia/0000775000175000017500000000000013515625026012630 500000000000000fldigi-4.1.06/src/contestia/contestia.cxx0000664000175000017500000002726313507402064015273 00000000000000// ---------------------------------------------------------------------------- // contestia.cxx -- CONTESTIA modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "contestia.h" #include "modem.h" #include "fl_digi.h" #include "misc.h" #include "confdialog.h" #include "status.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; double contestia::nco(double freq) { preamblephase += 2.0 * M_PI * freq / samplerate; if (preamblephase > TWOPI) preamblephase -= TWOPI; return cos(preamblephase); } void contestia::tx_init() { phaseacc = 0; prevsymbol = cmplx (1.0, 0.0); preamble = 32; shreg = 0; preamblesent = 0; postamblesent = 0; txbasefreq = get_txfreq_woffset(); rx_flush(); if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 0; } videoText(); Tx->Preset(); Tx->Start(); escape = 0; } void contestia::rx_flush() { unsigned char c; Rx->Flush(); while (Rx->GetChar(c) > 0) put_rx_char(c); } void contestia::send_tones() { if (!progdefaults.contestia_start_tones) return; double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; if (reverse) { freqa = tone_midfreq + (tone_bw / 2.0); freqb = tone_midfreq - (tone_bw / 2.0); } else { freqa = tone_midfreq - (tone_bw / 2.0); freqb = tone_midfreq + (tone_bw / 2.0); } preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i]; preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i]; for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE) ModulateXmtr(&tonebuff[j], SCBLOCKSIZE); } void contestia::rx_init() { Rx->Reset(); escape = 0; } int contestia::unescape(int c) { if (progdefaults.contestia8bit == 0) return c; if (escape) { escape = 0; return c + 128; } if (c == 127) { escape = 1; return -1; } return c; } int contestia::tx_process() { int c = 0, len = 0; unsigned char ch; if (tones != progdefaults.contestiatones || bw != progdefaults.contestiabw || smargin != progdefaults.contestiasmargin || sinteg != progdefaults.contestiasinteg ) restart(); if (preamblesent != 1) { send_tones(); preamblesent = 1; // Olivia Transmitter class requires at least character Tx->PutChar(0); } // The encoder works with BitsPerSymbol length blocks. If the // modem already has that many characters buffered, don't try // to read any more. If stopflag is set, we will always read // whatever there is. if (stopflag || (Tx->GetReadReady() < Tx->BitsPerSymbol)) { if (!stopflag && (c = get_tx_char()) == GET_TX_CHAR_ETX) stopflag = true; if (stopflag) Tx->Stop(); else { if (c == GET_TX_CHAR_NODATA) c = 0; /* Replace un-representable characters with a dot */ if (c > (progdefaults.contestia8bit ? 255 : 127)) c = '.'; if (c > 127) { c &= 127; Tx->PutChar(127); } Tx->PutChar(c); } } if (Tx->GetChar(ch) > 0) if ((c = unescape(ch)) != -1) put_echo_char(progdefaults.rx_lowercase ? tolower(c) : toupper(c)); if ((len = Tx->Output(txfbuffer)) > 0) ModulateXmtr(txfbuffer, len); if (stopflag && Tx->DoPostambleYet() == 1 && postamblesent != 1) { postamblesent = 1; send_tones(); } if (!Tx->Running()) { cwid(); stopflag = false; return -1; } return 0; } int contestia::rx_process(const double *buf, int len) { int c; unsigned char ch = 0; static double snr = 1e-3; static char msg1[20]; static char msg2[20]; if (tones != progdefaults.contestiatones || bw != progdefaults.contestiabw || smargin != progdefaults.contestiasmargin || sinteg != progdefaults.contestiasinteg ) restart(); if ((lastfreq != frequency || Rx->Reverse) && !reverse) { Rx->FirstCarrierMultiplier = (frequency - (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 0; lastfreq = frequency; Rx->Preset(); } else if ((lastfreq != frequency || !Rx->Reverse) && reverse) { Rx->FirstCarrierMultiplier = (frequency + (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 1; lastfreq = frequency; Rx->Preset(); } Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 3.0, 90.0) : 3.0; Rx->Process(buf, len); sp = 0; for (int i = frequency - Rx->Bandwidth/2; i < frequency - 1 + Rx->Bandwidth/2; i++) if (wf->Pwr(i) > sp) sp = wf->Pwr(i); np = wf->Pwr(frequency + Rx->Bandwidth/2 + 2*Rx->Bandwidth/Rx->Tones); if (np == 0) np = sp + 1e-8; sigpwr = decayavg( sigpwr, sp, 10); noisepwr = decayavg( noisepwr, np, 50); snr = CLAMP(sigpwr / noisepwr, 0.001, 100000); metric = clamp( 5.0 * (Rx->SignalToNoiseRatio() - 3.0), 0, 100); display_metric(metric); bool gotchar = false; while (Rx->GetChar(ch) > 0) { if ((c = unescape(ch)) != -1 && c > 7) { put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); gotchar = true; } } if (gotchar) { snprintf(msg1, sizeof(msg1), "s/n: %4.1f dB", 10*log10(snr) - 20); put_Status1(msg1, 5, STATUS_CLEAR); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", Rx->FrequencyOffset()); put_Status2(msg2, 5, STATUS_CLEAR); } return 0; } void contestia::restart() { tones = progdefaults.contestiatones; bw = progdefaults.contestiabw; smargin = progdefaults.contestiasmargin; sinteg = progdefaults.contestiasinteg; samplerate = 8000; bandwidth = 125 * (1 << bw); Tx->Tones = 2 * (1 << tones); Tx->Bandwidth = bandwidth; Tx->SampleRate = samplerate; Tx->OutputSampleRate = samplerate; txbasefreq = get_txfreq_woffset(); Tx->bContestia = true; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 0; } if (Tx->Preset() < 0) { LOG_ERROR("contestia: transmitter preset failed!"); return; } txbufferlen = Tx->MaxOutputLen; if (txfbuffer) delete [] txfbuffer; txfbuffer = new double[txbufferlen]; Rx->Tones = Tx->Tones; Rx->Bandwidth = bandwidth; Rx->SyncMargin = smargin; Rx->SyncIntegLen = sinteg; Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->SampleRate = samplerate; Rx->InputSampleRate = samplerate; Rx->bContestia = true; if (reverse) { Rx->FirstCarrierMultiplier = (frequency + (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 1; } else { Rx->FirstCarrierMultiplier = (frequency - (Rx->Bandwidth /2)) / 500; Rx->Reverse = 0; } if (Rx->Preset() < 0) { LOG_ERROR("contestia: receiver preset failed!"); return; } fragmentsize = 1024; set_bandwidth(Tx->Bandwidth - Tx->Bandwidth / Tx->Tones); stringstream info; info << mode_info[mode].sname; put_MODEstatus("%s", info.str().c_str()); metric = 0; sigpwr = 1e-10; noisepwr = 1e-8; LOG_DEBUG("\nContestia Rx parameters:\n%s", Rx->PrintParameters()); } void contestia::init() { restart(); modem::init(); set_scope_mode(Digiscope::BLANK); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } contestia::contestia(trx_mode omode) { mode = omode; cap |= CAP_REV; txfbuffer = 0; samplerate = 8000; switch (mode) { case MODE_CONTESTIA_4_125: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 0; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_250: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 1; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_500: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_1000: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_2000: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_125: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 0; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_250: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 1; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_500: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_1000: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_2000: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_16_500: progdefaults.contestiatones = tones = 3; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_16_1000: progdefaults.contestiatones = tones = 3; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_16_2000: progdefaults.contestiatones = tones = 3; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_32_1000: progdefaults.contestiatones = tones = 4; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_32_2000: progdefaults.contestiatones = tones = 4; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_64_500: progdefaults.contestiatones = tones = 5; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_64_1000: progdefaults.contestiatones = tones = 5; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_64_2000: progdefaults.contestiatones = tones = 5; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA: default: tones = progdefaults.contestiatones; bw = progdefaults.contestiabw; REQ(set_contestia_tab_widgets); break; } Tx = new MFSK_Transmitter< double >; Rx = new MFSK_Receiver< double >; Tx->bContestia = true; Rx->bContestia = true; lastfreq = 0; for (int i = 0; i < SR4; i++) ampshape[i] = 1.0; for (int i = 0; i < SR4 / 8; i++) ampshape[i] = ampshape[SR4 - 1 - i] = 0.5 * (1.0 - cos(M_PI * i / (SR4/8))); for (int i = 0; i < TONE_DURATION; i++) tonebuff[i] = 0; tone_bw = -1; tone_midfreq = -1; } contestia::~contestia() { if (Tx) delete Tx; if (Rx) delete Rx; if (txfbuffer) delete [] txfbuffer; } fldigi-4.1.06/src/waterfall/0000775000175000017500000000000013515625027012621 500000000000000fldigi-4.1.06/src/waterfall/raster.cxx0000644000175000017500000001175513472115774014601 00000000000000// ---------------------------------------------------------------------------- // raster.cxx, Raster scan Widget for display of fuzzy modes // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "raster.h" #include "modem.h" #include #include #include "raster.h" #include "qrunner.h" #include "threads.h" static pthread_mutex_t raster_mutex = PTHREAD_MUTEX_INITIALIZER; using namespace std; bool active = false; Raster::Raster (int X, int Y, int W, int H, int rh, bool rv) : Fl_Widget (X, Y, W, H) { width = W - 4; height = H - 4; space = 1; rowheight = 2 * rh; rhs = rowheight + space; Nrows = 0; while ((Nrows * rhs) < height) Nrows++; Nrows--; vidbuf = new unsigned char[width * height]; _reverse = rv; if (_reverse) memset(vidbuf, 0, width * height); else memset(vidbuf, 255, width * height); col = 0; box(FL_DOWN_BOX); marquee = false; } Raster::~Raster() { delete [] vidbuf; } int Raster::change_rowheight( int rh ) { guard_lock raster_lock(&raster_mutex); while ( (2*rh+space) > height) rh--; rowheight = 2 * rh; rhs = rowheight + space; Nrows = 0; while ((Nrows * rhs) < height) Nrows++; Nrows--; if (_reverse) memset(vidbuf, 0, width * height); else memset(vidbuf, 255, width * height); col = 0; REQ_DROP(&Raster::redraw, this); return rh; } void Raster::data(int data[], int len) { guard_lock raster_lock(&raster_mutex); if (data == NULL || len == 0 || (len > rowheight)) { return; } if (marquee) { for (int row = 0; row < Nrows; row++) { int rowstart = width * rhs * row; int nextrow = width * rhs * (row + 1); for (int i = 0; i < len; i++) { memmove(vidbuf + rowstart + i*width, vidbuf + rowstart + i*width + 1, width - 1); if (row < (Nrows - 1)) { vidbuf[rowstart + i*width + width - 1] = vidbuf[nextrow + i* width]; } } } int toppixel = width * (Nrows - 1) * rhs + width - 1; for (int i = 0; i < len; i++) { vidbuf[toppixel + width * (len - i)] = (unsigned char) data[i]; } } else { int pos = 0; int zeropos = (Nrows - 1) * rhs * width; for (int i = 0; i < len; i++) { pos = zeropos + width * (len - i - 1) + col; vidbuf[pos] = (unsigned char)data[i]; } if (++col >= width) { unsigned char *from = vidbuf + rhs * width; int numtocopy = (Nrows -1) * rhs * width; memmove(vidbuf, from, numtocopy); if (_reverse) memset(vidbuf + zeropos, 0, rhs * width); else memset(vidbuf + zeropos, 255, rhs * width); col = 0; } } REQ_DROP(&Raster::redraw, this); } void Raster::clear() { guard_lock raster_lock(&raster_mutex); if (_reverse) memset(vidbuf, 0, width * height); else memset(vidbuf, 255, width * height); col = 0; REQ_DROP(&Raster::redraw, this); } void Raster::resize(int x, int y, int w, int h) { guard_lock raster_lock(&raster_mutex); int Wdest = w - 4; int Hdest = h - 4; int Ndest = 0; while ((Ndest * rhs) < Hdest) Ndest++; Ndest--; unsigned char *tempbuf = new unsigned char [Wdest * Hdest]; unsigned char *oldbuf = vidbuf; if (_reverse) memset(tempbuf, 0, Wdest * Hdest); else memset(tempbuf, 255, Wdest * Hdest); int Ato = Wdest * Hdest; int Afm = width * height; if (Ato >= Afm) { } else { } int xfrcols, xfrrows; int from, to; if (Wdest >= width) xfrcols = width; else xfrcols = Wdest; if (Ndest <= Nrows) { xfrrows = Ndest * rhs; from = (Nrows - Ndest) * rhs; to = 0; for (int r = 0; r < xfrrows; r++) for (int c = 0; c < xfrcols; c++) tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; } else { xfrrows = Nrows * rhs; from = 0; to = (Ndest - Nrows) * rhs; for (int r = 0; r < xfrrows; r++) for (int c = 0; c < xfrcols; c++) tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; } width = Wdest; height = Hdest; Nrows = Ndest; vidbuf = tempbuf; delete [] oldbuf; Fl_Widget::resize(x,y,w,h); redraw(); } void Raster::draw() { draw_box(); fl_draw_image_mono( vidbuf, x() + 2, y() + 2, width, height, 1); } int Raster::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_PUSH) { if (Fl::event_button() == FL_RIGHT_MOUSE) { clear(); return 1; } } } return Fl_Widget::handle(event); } fldigi-4.1.06/src/waterfall/digiscope.cxx0000644000175000017500000003046313472115774015244 00000000000000// ---------------------------------------------------------------------------- // digiscope.cxx, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "digiscope.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "qrunner.h" Digiscope::Digiscope (int X, int Y, int W, int H) : Fl_Widget (X, Y, W, H) { _phase = _quality = _flo = _fhi = _amp = 0.0; box(FL_DOWN_BOX); vidbuf = new unsigned char[ 3 * (W-4) * (H-4)]; vidline = new unsigned char[ 3 * (W-4)]; memset(vidbuf, 0, 3*(W-4)*(H-4) * sizeof(unsigned char)); memset(vidline, 0, 3 * (W-4) * sizeof(unsigned char)); _highlight = false; _len = MAX_LEN; _zptr = 0; for (int i = 0; i < NUM_GRIDS; i++) _x[i] = _y[i] = 0; _y_user1 = _y_user2 = -1; _x_user1 = _x_user2 = -1; _x_graticule = _y_graticule = false; phase_mode = PHASE1; } Digiscope::~Digiscope() { if (vidbuf) delete [] vidbuf; if (vidline) delete [] vidline; } void Digiscope::video(double *data, int len , bool dir) { if (active_modem->HistoryON()) return; if (data == NULL || len == 0) return; FL_LOCK_D(); int W = w() - 4; int H = h() - 4; for (int i = 0; i < W; i++) vidline[3*i] = vidline[3*i+1] = vidline[3*i+2] = (unsigned char)(data[i * len / W]); vidline[3*W/2] = 255; vidline[3*W/2+1] = 0; vidline[3*W/2+2] = 0; if (dir) { if (linecnt == H) { linecnt--; unsigned char *p = &vidbuf[3*W]; memmove (vidbuf, p, 3*(W * (H-1))*sizeof(unsigned char)); memcpy (&vidbuf[3*W*(H-1)], vidline, 3*W * sizeof (unsigned char)); } else memcpy (&vidbuf[3*W*linecnt], vidline, 3*W * sizeof(unsigned char)); linecnt++; } else { unsigned char *p = &vidbuf[3*W]; memmove (p, vidbuf, 3 * (W * (H-1)) * sizeof(unsigned char)); memcpy(vidbuf, vidline, 3 * W * sizeof(unsigned char)); } REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::zdata(cmplx *zarray, int len ) { if (active_modem->HistoryON()) return; if (zarray == NULL || len == 0) return; FL_LOCK_D(); for (int i = 0; i < len; i++) { _zdata[_zptr++] = zarray[i]; if (_zptr == MAX_ZLEN) _zptr = 0; } REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::data(double *data, int len, bool scale) { if (active_modem->HistoryON()) return; if (data == 0) { memset(_buf, 0, MAX_LEN * sizeof(*_buf)); REQ_DROP(&Digiscope::redraw, this); return; } if (len == 0) return; FL_LOCK_D(); if (len > MAX_LEN) _len = MAX_LEN; else _len = len; memcpy(_buf, data, len * sizeof(double)); if (scale) { double max = 1E-6; double min = 1E6; for (int i = 0; i < _len; i++) { max = MAX(max, _buf[i]); min = MIN(min, _buf[i]); } if (max == min) max *= 1.001; for (int i = 0; i < _len; i++) _buf[i] = (_buf[i] - min) / (max - min); } REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::phase(double ph, double ql, bool hl) { if (active_modem->HistoryON()) return; FL_LOCK_D(); _phase = ph; _quality = ql; _highlight = hl; REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::rtty(double flo, double fhi, double amp) { if (active_modem->HistoryON()) return; FL_LOCK_D(); _flo = flo; _fhi = fhi; _amp = amp; REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::mode(scope_mode md) { if (md == PHASE) { if (phase_mode >= PHASE1 && phase_mode <= PHASE3) md = phase_mode; else md = phase_mode = PHASE1; } int W = w() - 4; int H = h() - 4; FL_LOCK_D(); _mode = md; memset(_buf, 0, MAX_LEN * sizeof(double)); linecnt = 0; memset(vidbuf, 0, 3*W*H * sizeof(unsigned char)); memset(vidline, 0, 3 * W * sizeof(unsigned char)); vidline[3*W/2] = 255; vidline[3*W/2+1] = 0; vidline[3*W/2+2] = 0; for (int i = 0; i < H; i++) memcpy(&vidbuf[3*W*i], vidline, 3*W*sizeof(unsigned char) ); REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::draw_phase() { // max number of shown vectors is first dimension static double pvecstack[8][2]; static const size_t psz = sizeof(pvecstack)/sizeof(*pvecstack); static unsigned pszn = 0; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_translate(x() + w() / 2.0, y() + w() / 2.0); fl_scale( 0.9*w()/2, -0.9*w()/2); fl_color(FL_WHITE); fl_circle( 0.0, 0.0, 1.0); fl_begin_line(); fl_vertex(-1.0, 0.0); fl_vertex(-0.9, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(1.0, 0.0); fl_vertex(0.9, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, -1.0); fl_vertex(0.0, -0.9); fl_end_line(); fl_begin_line(); fl_vertex(0.0, 1.0); fl_vertex(0.0, 0.9); fl_end_line(); if (_highlight) { if (_mode > PHASE1) { if (pszn == psz - 1) memmove(pvecstack, pvecstack + 1, (psz - 1) * sizeof(*pvecstack)); else pszn++; pvecstack[pszn][0] = _phase; pvecstack[pszn][1] = _quality; // draw the stack in progressively brighter green for (unsigned i = 0; i <= pszn; i++) { // fl_color(fl_color_average(FL_GREEN, FL_BLACK, 1.0 - 0.8 * (n-i)/ pszn)); fl_color(fl_color_average(FL_GREEN, FL_BLACK, 0.2 + 0.8 * i / pszn)); fl_begin_line(); fl_vertex(0.0, 0.0); if (_mode == PHASE3) // scale length by quality fl_vertex(0.9 * cos(pvecstack[i][0] - M_PI / 2) * pvecstack[i][1], 0.9 * sin(pvecstack[i][0] - M_PI / 2) * pvecstack[i][1]); else fl_vertex(0.9 * cos(pvecstack[i][0] - M_PI / 2), 0.9 * sin(pvecstack[i][0] - M_PI / 2)); fl_end_line(); } } else { // original style fl_color(FL_GREEN); fl_begin_line(); fl_vertex(0.0, 0.0); fl_vertex(0.9 * cos(_phase - M_PI / 2), 0.9 * sin( _phase - M_PI / 2)); fl_end_line(); } } else { fl_color(FL_GREEN); fl_circle( 0.0, 0.0, 0.1); } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_scope() { int npts, np; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); npts = MIN(w(), _len); npts = MAX(1, npts); fl_translate(x()+2, y() + h() - 2); fl_scale ((w()-4), - (h() - 4)); fl_color(FL_GREEN); fl_begin_line(); for (int i = 0; i < npts; i++) { np = i * _len / npts; np = np < MAX_LEN ? np : MAX_LEN - 1; fl_vertex( (double)i / npts, _buf[np] ); } fl_end_line(); // x & y axis' for (int i = 0; i < NUM_GRIDS; i++) { if (_x[i]) { fl_color(FL_WHITE); fl_begin_line(); fl_vertex(_x[i], 0.0); fl_vertex(_x[i], 1.0); fl_end_line(); } if (_y[i]) { fl_color(FL_WHITE); fl_begin_line(); fl_vertex(0.0, _y[i]); fl_vertex(1.0, _y[i]); fl_end_line(); } } if (_x_graticule) { if (_y_user1 > 0 && _y_user1 < 1.0) { fl_color(FL_CYAN); fl_begin_line(); fl_vertex(0.0, 1.0 - _y_user1); fl_vertex(1.0, 1.0 - _y_user1); fl_end_line(); } if (_y_user2 > 0 && _y_user2 < 1.0) { fl_color(FL_MAGENTA); fl_begin_line(); fl_vertex(0.0, 1.0 - _y_user2); fl_vertex(1.0, 1.0 - _y_user2); fl_end_line(); } } if (_y_graticule) { if (_x_user1 > 0 && _x_user1 < 1.0) { fl_color(FL_CYAN); fl_begin_line(); fl_vertex(_x_user1, 0.0); fl_vertex(_x_user1, 1.0); fl_end_line(); } if (_x_user2 > 0 && _x_user2 < 1.0) { fl_color(FL_MAGENTA); fl_begin_line(); fl_vertex(_x_user2, 0.0); fl_vertex(_x_user2, 1.0); fl_end_line(); } } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_xy() { fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_translate(x() + w() / 2.0, y() + w() / 2.0); fl_scale( w()/2.0, -w()/2.0); // x & y axis fl_color(FL_LIGHT1); fl_begin_line(); fl_vertex(-0.6, 0.0); fl_vertex(-1.0, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.6, 0.0); fl_vertex(1.0, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, -0.6); fl_vertex(0.0, -1.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, 0.6); fl_vertex(0.0, 1.0); fl_end_line(); // data int W = w() / 2; int H = h() / 2; int X = x(); int Y = y(); int xp, yp, xp1, yp1; int j = _zptr; if (++j == MAX_ZLEN) j = 0; xp = X + (int)((_zdata[j].real() + 1.0) * W); yp = Y + (int)((_zdata[j].imag() + 1.0) * H); fl_color(fl_rgb_color(0, 230,0)); for (int i = 0; i < MAX_ZLEN; i++ ) { if (++j == MAX_ZLEN) j = 0; xp1 = X + (int)((_zdata[j].real() + 1.0) * W); yp1 = Y + (int)((_zdata[j].imag() + 1.0) * H); fl_line(xp, yp, xp1, yp1); xp = xp1; yp = yp1; } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_rtty() { int npts, np; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); npts = MIN(w(), _len); npts = MAX(1, npts); fl_translate(x()+2, y() + h() - 2); fl_scale ((w()-4), - (h() - 4)); fl_color(FL_YELLOW); fl_begin_line(); fl_vertex( 0.0, 0.9); fl_vertex( 1.0, 0.9); fl_end_line(); fl_begin_line(); fl_vertex( 0.0, 0.1); fl_vertex( 1.0, 0.1); fl_end_line(); fl_color(FL_WHITE); fl_begin_line(); fl_vertex( 0.0, 0.5); fl_vertex( 1.0, 0.5); fl_end_line(); fl_color(FL_GREEN); fl_begin_line(); double value = 0.0; for (int i = 0; i < npts; i++) { np = round(1.0 * i * _len / npts); if (np >= MAX_LEN) np = MAX_LEN - 1; value = _buf[np]; fl_vertex( 1.0 * i / (npts - 1), 0.5 + 0.75 * value ); } fl_end_line(); fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_video() { fl_draw_image( vidbuf, x() + 2, y() + 2, w() - 4, h() - 4); } void Digiscope::draw() { draw_box(); if (_mode == WWV || _mode == DOMWF) draw_video(); else { switch (_mode) { case SCOPE : draw_scope(); break; case PHASE1: case PHASE2: case PHASE3: draw_phase(); break; case RTTY : draw_rtty(); break; case XHAIRS : draw_xy(); break; case DOMDATA : draw_scope(); break; case BLANK : default: fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_pop_matrix(); fl_pop_clip(); break; } } } int Digiscope::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_RELEASE: switch (_mode) { case PHASE1: case PHASE2: _mode = (scope_mode)((int)_mode + 1); phase_mode = _mode; redraw(); break; case PHASE3: _mode = PHASE1; phase_mode = _mode; redraw(); break; case RTTY: _mode = XHAIRS; redraw(); break; case XHAIRS: _mode = RTTY; redraw(); break; case DOMDATA: _mode = DOMWF; redraw(); break; case DOMWF: _mode = DOMDATA; redraw(); break; case WWV: event = Fl::event_button(); if (event == FL_LEFT_MOUSE) wwv_modem->set1(Fl::event_x() - x(), w()); else if (event == FL_RIGHT_MOUSE) wwv_modem->set2(Fl::event_x() - x(), Fl::event_y() - y()); break; default: break; } return 1; case FL_MOUSEWHEEL: if ((event = Fl::event_dy()) || (event = Fl::event_dx())) wf->handle_mouse_wheel(waterfall::WF_AFC_BW, event); break; default: break; } return 1; } void Digiscope::resize(int x, int y, int w, int h) { delete [] vidbuf; delete [] vidline; vidbuf = new unsigned char[ 3 * (w-4) * (h-4)]; vidline = new unsigned char[ 3 * (w-4)]; memset(vidbuf, 0, 3*(w-4)*(h-4) * sizeof(unsigned char)); memset(vidline, 0, 3*(w-4) * sizeof(unsigned char)); Fl_Widget::resize(x, y, w, h); } fldigi-4.1.06/src/waterfall/waterfall.cxx0000664000175000017500000016664713507755043015275 00000000000000// ---------------------------------------------------------------------------- // waterfall.cxx - Waterfall Spectrum Analyzer Widget // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- //#define USE_BLACKMAN //#define USE_HAMMING //#define USE_HANNING #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "trx.h" #include "misc.h" #include "waterfall.h" #include "main.h" #include "modem.h" #include "qrunner.h" #include "threads.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "rigio.h" #include "fldigi-config.h" #include "configuration.h" #include "status.h" #include "Viewer.h" #include "macros.h" #include "arq_io.h" #include "confdialog.h" #include "flmisc.h" #include "gettext.h" #include "rtty.h" #include "flslider2.h" #include "debug.h" #include "rigsupport.h" #include "xmlrpc.h" #include "psm/psm.h" #include "kiss_io.h" #include "spectrum_viewer.h" using namespace std; pthread_mutex_t draw_mutex = PTHREAD_MUTEX_INITIALIZER; #define bwFFT 30 #define cwRef 50 #define bwX1 25 #define bwMov 18 #define bwRate 45 #define cwCnt 92 #define bwQsy 32 #define bwXmtLock 32 #define bwRev 32 #define bwMem 40 #define bwXmtRcv 40 #define wSpace 1 #define bwdths (wSpace + bwFFT + wSpace + cwRef + wSpace + cwRef + wSpace + bwX1 + \ wSpace + 3*bwMov + wSpace + bwRate + wSpace + \ cwCnt + wSpace + bwQsy + wSpace + bwMem + wSpace + \ bwXmtLock + wSpace + bwRev + wSpace + bwXmtRcv + wSpace) extern modem *active_modem; static RGB RGByellow = {254,254,0}; //static RGB RGBgreen = {0,254,0}; //static RGB RGBdkgreen = {0,128,0}; //static RGB RGBblue = {0,0,255}; static RGB RGBred = {254,0,0}; //static RGB RGBwhite = {254,254,254}; //static RGB RGBblack = {0,0,0}; //static RGB RGBmagenta = {196,0,196}; //static RGB RGBblack = {0,0,0}; // RGBI is a structure consisting of the values RED, GREEN, BLUE, INTENSITY // each value can range from 0 (extinguished) to 255 (full on) // the INTENSITY value is used for the grayscale waterfall display RGBI mag2RGBI[256]; RGB palette[9]; short int *tmp_fft_db; static pthread_mutex_t waterfall_mutex = PTHREAD_MUTEX_INITIALIZER; WFdisp::WFdisp (int x0, int y0, int w0, int h0, char *lbl) : Fl_Widget(x0,y0,w0,h0,"") { disp_width = w(); if (disp_width > progdefaults.HighFreqCutoff/4) disp_width = progdefaults.HighFreqCutoff/4; scale_width = IMAGE_WIDTH * 2; image_height = h() - WFTEXT - WFSCALE - WFMARKER; image_area = IMAGE_WIDTH * image_height; sig_image_area = IMAGE_WIDTH * h(); RGBsize = sizeof(RGB); RGBwidth = RGBsize * scale_width; fft_img = new RGBI[image_area]; markerimage = new RGB[scale_width * WFMARKER]; scaleimage = new uchar[scale_width * WFSCALE]; scline = new uchar[scale_width]; fft_sig_img = new uchar[image_area]; sig_img = new uchar[sig_image_area]; pwr = new wf_fft_type[IMAGE_WIDTH]; fft_db = new short int[image_area]; tmp_fft_db = new short int[image_area]; circbuff = new double[FFT_LEN]; wfbuf = new wf_cpx_type[FFT_LEN]; wfft = new g_fft(FFT_LEN); fftwindow = new double[FFT_LEN]; setPrefilter(progdefaults.wfPreFilter); memset(circbuff, 0, FFT_LEN * sizeof(double)); mag = 1; step = 4; offset = 0; sigoffset = 0; ampspan = 75; // reflevel = -10; initmaps(); bandwidth = 32; RGBmarker = RGBred; RGBcursor = RGByellow; RGBInotch.I = progdefaults.notchRGBI.I; RGBInotch.R = progdefaults.notchRGBI.R; RGBInotch.G = progdefaults.notchRGBI.G; RGBInotch.B = progdefaults.notchRGBI.B; mode = WATERFALL; centercarrier = false; overload = false; peakaudio = 0.0; rfc = 0L; usb = true; wfspeed = NORMAL; srate = 8000; wfspdcnt = 0; dispcnt = 1.0 * WFBLOCKSIZE / SC_SMPLRATE; dispdec = 1.0 * WFBLOCKSIZE / srate; wantcursor = false; cursormoved = false; // usebands = false; for (int i = 0; i < IMAGE_WIDTH; i++) pwr[i] = 0.0; carrier(1000); oldcarrier = newcarrier = 0; tmp_carrier = false; ptrCB = 0; ptrFFTbuff = 0; for (int i = 0; i < 256; i++) mag2RGBI[i].I = mag2RGBI[i].R = mag2RGBI[i].G = mag2RGBI[i].B = 0; } WFdisp::~WFdisp() { delete wfft; delete [] fft_img; delete [] scaleimage; delete [] markerimage; delete [] fft_sig_img; delete [] sig_img; delete [] pwr; delete [] scline; delete [] fft_db; delete [] tmp_fft_db; } void WFdisp::initMarkers() { memset(markerimage, 224, RGBwidth * WFMARKER); } // draw a marker of specified width and colour centred at freq and clrM inline void WFdisp::makeMarker_(int width, const RGB* color, int freq, const RGB* clrMin, RGB* clrM, const RGB* clrMax) { if (!active_modem) return; trx_mode marker_mode = active_modem->get_mode(); if (marker_mode == MODE_RTTY) { // rtty has two bandwidth indicators on the waterfall // upper and lower frequency int shift = static_cast( (progdefaults.rtty_shift < rtty::numshifts ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift)); int bw_limit_hi = (int)(shift / 2 + progdefaults.RTTY_BW / 2.0); int bw_limit_lo = (int)(shift / 2 - progdefaults.RTTY_BW / 2.0); int bw_freq = static_cast(freq + 0.5); int bw_lower1 = -bw_limit_hi; int bw_upper1 = -bw_limit_lo; int bw_lower2 = bw_limit_lo; int bw_upper2 = bw_limit_hi; if (bw_lower1 + bw_freq < 0) bw_lower1 -= bw_lower1 + bw_freq; if (bw_upper1 + bw_freq < 0) bw_lower2 -= bw_lower2 + bw_freq; if (bw_upper2 + bw_freq > scale_width) bw_upper2 -= bw_upper2 + bw_freq - scale_width; if (bw_lower2 + bw_freq > scale_width) bw_lower2 -= bw_lower2 + bw_freq - scale_width; // draw it RGB* clrPos; for (int y = 0; y < WFMARKER - 2; y++) { for (int x = bw_lower1; x < bw_upper1; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } for (int x = bw_lower2; x < bw_upper2; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } } return; } int bw_lower = -width, bw_upper = width; if (marker_mode >= MODE_MT63_500S && marker_mode <= MODE_MT63_2000L) bw_upper = (int)(width * 31 / 32); if (marker_mode == MODE_FSQ || marker_mode == MODE_IFKP) bw_upper = (int)(width * 32 / 33); if (bw_lower + static_cast(freq+0.5) < 0) bw_lower -= bw_lower + static_cast(freq+0.5); if (bw_upper + static_cast(freq+0.5) > scale_width) bw_upper -= bw_upper + static_cast(freq+0.5) - scale_width; // draw it RGB* clrPos; for (int y = 0; y < WFMARKER - 2; y++) { for (int x = bw_lower; x < bw_upper; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } } } void WFdisp::makeMarker() { if (unlikely(!active_modem)) return; RGB *clrMin, *clrMax, *clrM; clrMin = markerimage + scale_width; clrMax = clrMin + (WFMARKER - 2) * scale_width; memset(clrMin, 0, RGBwidth * (WFMARKER - 2)); clrM = clrMin + (int)((double)carrierfreq + 0.5); int marker_width = bandwidth; int mode = active_modem->get_mode(); if (mode >= MODE_PSK_FIRST && mode <= MODE_PSK_LAST) marker_width += mailserver ? progdefaults.ServerOffset : progdefaults.SearchRange; else if (mode >= MODE_FELDHELL && mode <= MODE_HELL80) marker_width = (int)progdefaults.HELL_BW; else if (mode == MODE_RTTY) marker_width = static_cast((progdefaults.rtty_shift < rtty::numshifts ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift)); marker_width = (int)(marker_width / 2.0 + 1); RGBmarker.R = progdefaults.bwTrackRGBI.R; RGBmarker.G = progdefaults.bwTrackRGBI.G; RGBmarker.B = progdefaults.bwTrackRGBI.B; makeMarker_(marker_width, &RGBmarker, carrierfreq, clrMin, clrM, clrMax); if (unlikely(active_modem->freqlocked() || mode == MODE_FSQ)) { int txfreq = static_cast(active_modem->get_txfreq()); adjust_color_inv(RGBmarker.R, RGBmarker.G, RGBmarker.B, FL_BLACK, FL_RED); makeMarker_( static_cast(bandwidth / 2.0 + 1), &RGBmarker, txfreq, clrMin, clrMin + (int)((double)txfreq + 0.5), clrMax); } if (!wantcursor) return; if (cursorpos > progdefaults.HighFreqCutoff - bandwidth / 2 / step) cursorpos = progdefaults.HighFreqCutoff - bandwidth / 2 / step; if (cursorpos >= (progdefaults.HighFreqCutoff - offset - bandwidth/2)/step) cursorpos = (progdefaults.HighFreqCutoff - offset - bandwidth/2)/step; if (cursorpos < (progdefaults.LowFreqCutoff + bandwidth / 2) / step) cursorpos = (progdefaults.LowFreqCutoff + bandwidth / 2) / step; // Create the cursor marker double xp = offset + step * cursorpos; if (xp < bandwidth / 2.0 || xp > (progdefaults.HighFreqCutoff - bandwidth / 2.0)) return; clrM = markerimage + scale_width + (int)(xp + 0.5); RGBcursor.R = progdefaults.cursorLineRGBI.R; RGBcursor.G = progdefaults.cursorLineRGBI.G; RGBcursor.B = progdefaults.cursorLineRGBI.B; int bw_lo = marker_width; int bw_hi = marker_width; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; for (int y = 0; y < WFMARKER - 2; y++) { int incr = y * scale_width; int msize = (WFMARKER - 2 - y)*RGBsize*step/4; for (int m = -step; m < step; m++) *(clrM + incr + m) = RGBcursor; if (xp - (bw_lo + msize) > 0) for (int i = bw_lo - msize; i <= bw_lo + msize; i++) *(clrM - i + incr) = RGBcursor; if (xp + (bw_hi + msize) < scale_width) for (int i = bw_hi - msize; i <= bw_hi + msize; i++) *(clrM + i + incr) = RGBcursor; } } void WFdisp::makeScale() { uchar *gmap = scaleimage; memset(scline, 0, scale_width); for (int tic = 500; tic < scale_width; tic += 500) { scline[tic] = 255; for (int ticn = 1; ticn < step; ticn++) if (tic + ticn < scale_width) scline[tic + ticn] = 255; } for (int i = 0; i < WFSCALE - 5; i++) { memcpy(gmap, scline, scale_width); gmap += (scale_width); } for (int tic = 100; tic < scale_width ; tic += 100) { scline[tic] = 255; for (int ticn = 1; ticn < step; ticn++) if (tic + ticn < scale_width) scline[tic + ticn] = 255; } for (int i = 0; i < 5; i++) { memcpy(gmap, scline, scale_width); gmap += (scale_width); } } void WFdisp::setcolors() { double di; int r, g, b; for (int i = 0; i < 256; i++) { di = sqrt((double)i / 256.0); mag2RGBI[i].I = (uchar)(200*di); } for (int n = 0; n < 8; n++) { for (int i = 0; i < 32; i++) { r = palette[n].R + (int)(1.0 * i * (palette[n+1].R - palette[n].R) / 32.0); g = palette[n].G + (int)(1.0 * i * (palette[n+1].G - palette[n].G) / 32.0); b = palette[n].B + (int)(1.0 * i * (palette[n+1].B - palette[n].B) / 32.0); mag2RGBI[i + 32*n].R = r; mag2RGBI[i + 32*n].G = g; mag2RGBI[i + 32*n].B = b; } } } void WFdisp::initmaps() { for (int i = 0; i < image_area; i++) fft_db[i] = tmp_fft_db[i] = log2disp(-1000); memset (fft_img, 0, image_area * sizeof(RGBI) ); memset (scaleimage, 0, scale_width * WFSCALE); memset (markerimage, 0, RGBwidth * WFMARKER); memset (fft_sig_img, 0, image_area); memset (sig_img, 0, sig_image_area); memset (mag2RGBI, 0, sizeof(mag2RGBI)); initMarkers(); makeScale(); setcolors(); } int WFdisp::peakFreq(int f0, int delta) { guard_lock waterfall_lock(&waterfall_mutex); double threshold = 0.0; int f1, fmin = (int)((f0 - delta)), f2, fmax = (int)((f0 + delta)); f1 = fmin; f2 = fmax; if (fmin < 0 || fmax > IMAGE_WIDTH) return f0; for (int f = fmin; f <= fmax; f++) threshold += pwr[f]; threshold /= delta; for (int f = fmin; f <= fmax; f++) if (pwr[f] > threshold) { f2 = f; } for (int f = fmax; f >= fmin; f--) if (pwr[f] > threshold) { f1 = f; } return (f1 + f2) / 2; } double WFdisp::powerDensity(double f0, double bw) { double pwrdensity = 0.0; int flower = (int)((f0 - bw/2)), fupper = (int)((f0 + bw/2)); if (flower < 0 || fupper > IMAGE_WIDTH) return 0.0; { guard_lock waterfall_lock(&waterfall_mutex); for (int i = flower; i <= fupper; i++) pwrdensity += pwr[i]; } return pwrdensity/(bw+1); } /// Frequency of the maximum power for a given bandwidth. Used for AFC. double WFdisp::powerDensityMaximum(int bw_nb, const int (*bw)[2]) const { if (bw_nb < 1) return carrierfreq; int fmax[bw_nb]; double pnbw[bw_nb]; int f_lowest = carrierfreq; int f_highest = carrierfreq; double max_pwr = 0; for (int i = 0; i < bw_nb; i++) { fmax[i] = carrierfreq; pnbw[i] = 0; } { guard_lock waterfall_lock(&waterfall_mutex); for (int i = 0; i < bw_nb; i++) { f_lowest = carrierfreq + bw[i][0]; if (f_lowest <= 0) f_lowest = 0; f_highest = carrierfreq + bw[i][1]; if (f_highest > IMAGE_WIDTH) f_highest = IMAGE_WIDTH; max_pwr = 0; pnbw[i] = 0; for (int n = f_lowest; n < f_highest; n++) { if (pwr[n] > max_pwr) { max_pwr = pwr[n]; fmax[i] = n; } pnbw[i] += pwr[n]; } if (pnbw[i] == 0) return carrierfreq; } } int fmid = 0; double total_pwr = 0; for (int i = 0; i < bw_nb; i++) total_pwr += pnbw[i]; for (int i = 0; i < bw_nb; i++) fmid += fmax[i] * pnbw[i] / total_pwr; return fmid; } void WFdisp::setPrefilter(int v) { switch (v) { case WF_FFT_RECTANGULAR: RectWindow(fftwindow, FFT_LEN); break; case WF_FFT_BLACKMAN: BlackmanWindow(fftwindow, FFT_LEN); break; case WF_FFT_HAMMING: HammingWindow(fftwindow, FFT_LEN); break; case WF_FFT_HANNING: HanningWindow(fftwindow, FFT_LEN); break; case WF_FFT_TRIANGULAR: TriangularWindow(fftwindow, FFT_LEN); break; } prefilter = v; } int WFdisp::log2disp(int v) { double val = -255.0 * v / ampspan; if (val < 0) return 255; if (val > 255 ) return 0; return (int)(255 - val); } void WFdisp::processFFT() { if (prefilter != progdefaults.wfPreFilter) setPrefilter(progdefaults.wfPreFilter); wf_fft_type scale = ( 1.0 * SC_SMPLRATE / srate ) * ( FFT_LEN / 8000.0); if ((dispcnt -= dispdec) <= 0) { static const int log2disp100 = log2disp(-100); double vscale = 2.0 / FFT_LEN; for (int i = 0; i < FFT_LEN; i++) wfbuf[i] = 0; void *pv = static_cast(wfbuf); wf_fft_type *pbuf = static_cast(pv); int latency = progdefaults.wf_latency; if (latency < 1) latency = 1; if (latency > 16) latency = 16; int nsamples = FFT_LEN * latency / 16; vscale *= sqrt(16.0 / latency); for (int i = 0; i < nsamples; i++) pbuf[i] = fftwindow[i * 16 / latency] * circbuff[i] * vscale; wfft->RealFFT(wfbuf); memset(pwr, 0, progdefaults.LowFreqCutoff * sizeof(wf_fft_type)); memset(&fft_db[ptrFFTbuff * IMAGE_WIDTH], log2disp100, progdefaults.LowFreqCutoff * sizeof(*fft_db)); int n = 0; for (int i = progdefaults.LowFreqCutoff + 1; i < IMAGE_WIDTH; i++) { n = round(scale * i); pwr[i] = norm(wfbuf[n]); int ffth = round(10.0 * log10(pwr[i] + 1e-10) ); fft_db[ptrFFTbuff * IMAGE_WIDTH + i] = log2disp(ffth); } ptrFFTbuff--; if (ptrFFTbuff < 0) ptrFFTbuff += image_height; for (int i = 0; i < image_height; i++) { int j = (i + 1 + ptrFFTbuff) % image_height; memmove( (void *)(tmp_fft_db + i * IMAGE_WIDTH), (void *)(fft_db + j * IMAGE_WIDTH), IMAGE_WIDTH * sizeof(short int)); } dispcnt = 1.0 * WFBLOCKSIZE / SC_SMPLRATE; // FAST if (wfspeed == NORMAL) dispcnt *= NORMAL; if (wfspeed == SLOW) dispcnt *= progdefaults.drop_speed; } dispdec = 1.0 * WFBLOCKSIZE / srate; if (wfspeed == PAUSE) dispdec = 0; } void WFdisp::process_analog (wf_fft_type *sig, int len) { int h1, h2, h3; int sigy, sigpixel, ynext, graylevel; h1 = h()/8 - 1; h2 = h()/2 - 1; h3 = h()*7/8 + 1; graylevel = 220; // clear the signal display area sigy = 0; sigpixel = IMAGE_WIDTH*h2; //FL_LOCK(); FL_LOCK_D(); memset (sig_img, 0, sig_image_area); memset (&sig_img[h1*IMAGE_WIDTH], 160, IMAGE_WIDTH); memset (&sig_img[h2*IMAGE_WIDTH], 255, IMAGE_WIDTH); memset (&sig_img[h3*IMAGE_WIDTH], 160, IMAGE_WIDTH); int cbc = ptrCB; for (int c = 0; c < IMAGE_WIDTH; c++) { ynext = (int)(h2 * sig[cbc]); if (ynext < -h2) ynext = -h2; if (ynext > h2) ynext = h2; cbc = (cbc + 1) % (FFT_LEN); for (; sigy < ynext; sigy++) sig_img[sigpixel -= IMAGE_WIDTH] = graylevel; for (; sigy > ynext; sigy--) sig_img[sigpixel += IMAGE_WIDTH] = graylevel; sig_img[sigpixel++] = graylevel; } FL_UNLOCK_D(); } void WFdisp::redrawCursor() { } //---------------------------------------------------------------------- // queue audio_blocks used to separate audio stream process timing // from GUI processing and timing // mutex guards the audio_blocks data //---------------------------------------------------------------------- extern state_t trx_state; static pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER; struct AUDIO_BLOCK { double sig[WFBLOCKSIZE]; int sr; }; queue audio_blocks; void WFdisp::sig_data( double *sig, int sr) { AUDIO_BLOCK audio_block; memcpy((void *) &audio_block.sig[0], sig, WFBLOCKSIZE * sizeof(sig[0])); audio_block.sr = sr; guard_lock data_lock(&data_mutex); audio_blocks.push(audio_block); } // this method must be called from main thread void WFdisp::handle_sig_data() { ENSURE_THREAD(FLMAIN_TID); double gain = pow(10, progdefaults.wfRefLevel / -20.0); while (1) {//!audio_blocks.empty()) { // this block guarded by data_mutex { guard_lock data_lock(&data_mutex); if (audio_blocks.empty()) { return; } memmove( (void*)circbuff, (void*)(circbuff + WFBLOCKSIZE), (FFT_LEN - WFBLOCKSIZE)*sizeof(circbuff[0]) ); if (srate != audio_blocks.front().sr) { srate = audio_blocks.front().sr; memset( circbuff, 0, FFT_LEN * sizeof(circbuff[0])); ptrCB = 0; } memcpy( (void*)&circbuff[FFT_LEN - WFBLOCKSIZE - 1], (void*)&audio_blocks.front().sig[0], WFBLOCKSIZE * sizeof(circbuff[0])); audio_blocks.pop(); } overload = false; double overval = 0, peak = 0.0; for (int i = FFT_LEN - WFBLOCKSIZE; i < FFT_LEN; i++) { overval = fabs(circbuff[i]); if (overval > peak) peak = overval; circbuff[i] *= gain; } peakaudio = 0.1 * peak + 0.9 * peakaudio; { guard_lock dlock(&draw_mutex); if (mode == SCOPE) process_analog(circbuff, FFT_LEN); else processFFT(); } put_WARNstatus(peakaudio); static char szFrequency[14]; if (active_modem && rfc != 0) { int offset = 0; double afreq = active_modem->get_txfreq(); trx_mode mode = active_modem->get_mode(); string testmode = qso_opMODE->value(); bool xcvr_useFSK = ((testmode.find("RTTY") != string::npos) || (testmode.find("FSK") != string::npos) || ((testmode.find("DATA") != string::npos) && (use_nanoIO || progdefaults.PseudoFSK)) ); usb = !ModeIsLSB(testmode); if ((testmode.find("DATA") != string::npos) && xcvr_useFSK) usb = !usb; if (mode == MODE_RTTY && progdefaults.useMARKfreq && !xcvr_useFSK) { offset = (progdefaults.rtty_shift < rtty::numshifts ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); offset /= 2; if (active_modem->get_reverse()) offset *= -1; } if (testmode.find("CW") != string::npos) afreq = 0; if (xcvr_useFSK) afreq = 0; if (mode == MODE_ANALYSIS) { dfreq = 0; } else { if (usb) dfreq = rfc + afreq + offset; else dfreq = rfc - afreq - offset; } snprintf(szFrequency, sizeof(szFrequency), "%-.3f", dfreq / 1000.0); } else { dfreq = active_modem->get_txfreq(); snprintf(szFrequency, sizeof(szFrequency), "%-.0f", dfreq); } inpFreq->value(szFrequency); } } // Check the display offset & limit to 0 to max IMAGE_WIDTH displayed void WFdisp::checkoffset() { if (mode == SCOPE) { if (sigoffset < 0) sigoffset = 0; if (sigoffset > (IMAGE_WIDTH - disp_width)) sigoffset = IMAGE_WIDTH - disp_width; } else { if (offset > (int)(progdefaults.HighFreqCutoff - step * disp_width)) offset = (int)(progdefaults.HighFreqCutoff - step * disp_width); if (offset < 0) offset = 0; } } void WFdisp::setOffset(int v) { offset = v; checkoffset(); } void WFdisp::slew(int dir) { if (mode == SCOPE) sigoffset += dir; else offset += dir; checkoffset(); } void WFdisp::movetocenter() { if (mode == SCOPE) sigoffset = IMAGE_WIDTH / 2; else offset = carrierfreq - (disp_width * step / 2); checkoffset(); } void WFdisp::carrier(int cf) { if (cf >= bandwidth / 2 && cf < (IMAGE_WIDTH - bandwidth / 2)) { carrierfreq = cf; makeMarker(); redrawCursor(); } } int WFdisp::carrier() { return carrierfreq; } void WFdisp::checkWidth() { disp_width = w(); if (mag == MAG_1) step = 4; if (mag == MAG_1 && disp_width > progdefaults.HighFreqCutoff/4) disp_width = progdefaults.HighFreqCutoff/4; if (mag == MAG_2) step = 2; if (mag == MAG_2 && disp_width > progdefaults.HighFreqCutoff/2) disp_width = progdefaults.HighFreqCutoff/2; if (mag == MAG_4) step = 1; } int WFdisp::checkMag() { checkWidth(); makeScale(); return mag; } int WFdisp::setMag(int m) { int mid = offset + (disp_width * step / 2); mag = m; checkMag(); if (centercarrier || Fl::event_shift()) { offset = mid - (disp_width * step / 2); } else { movetocenter(); } return mag; } int WFdisp::wfmag() { int mid = offset + (disp_width * step / 2); if (mag == MAG_1) mag = MAG_2; else if (mag == MAG_2) mag = MAG_4; else mag = MAG_1; checkMag(); if (centercarrier || Fl::event_shift()) { offset = mid - (disp_width * step / 2); } else { movetocenter(); } return mag; } void WFdisp::drawScale() { int fw = 60, xoff; static char szFreq[20]; double fr; uchar *pixmap; if (progdefaults.wf_audioscale) { pixmap = (scaleimage + (int)offset); fl_draw_image_mono( pixmap, x(), y() + WFTEXT, w(), WFSCALE, step, scale_width); fl_color(0xFFFFFF00); fl_font(progdefaults.WaterfallFontnbr, progdefaults.WaterfallFontsize); for (int i = 1; ; i++) { fr = 500.0 * i; snprintf(szFreq, sizeof(szFreq), "%7.0f", fr); fw = (int)fl_width(szFreq); xoff = (int) (( (1000.0/step) * i - fw) / 2.0 - offset /step ); if (xoff > 0 && xoff < w() - fw) fl_draw(szFreq, x() + xoff, y() + 10 ); if (xoff > w() - fw) break; } return; } int mdoffset = 0; string testmode = qso_opMODE->value(); bool xcvr_useFSK = ((testmode.find("RTTY") != string::npos) || (testmode.find("FSK") != string::npos) || ((testmode.find("DATA") != string::npos) && (use_nanoIO ||progdefaults.PseudoFSK)) ); usb = !ModeIsLSB(testmode); if ((testmode.find("DATA") != string::npos) && xcvr_useFSK) usb = !usb; if (testmode.find("CW") != string::npos) mdoffset = progdefaults.CWsweetspot; if (xcvr_useFSK) { if (usb) mdoffset = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_baud] * 2; else mdoffset = progdefaults.xcvr_FSK_MARK; } if (usb) pixmap = (scaleimage + (int)(((rfc - mdoffset) % 1000 + offset)) ); else pixmap = (scaleimage + (int)((1000 - (rfc + mdoffset) % 1000 + offset))); fl_draw_image_mono( pixmap, x(), y() + WFTEXT, w(), WFSCALE, step, scale_width); fl_color(0xFFFFFF00); fl_font(progdefaults.WaterfallFontnbr, progdefaults.WaterfallFontsize); for (int i = 1; ; i++) { if (usb) fr = (rfc - mdoffset - (rfc - mdoffset) % 500 + 500 * i)/1000.0; else fr = (rfc + mdoffset - (rfc + mdoffset) % 500 - 500 * i + 500)/1000.0; snprintf(szFreq, sizeof(szFreq), "%7.1f", fr); fw = (int)fl_width(szFreq); if (usb) xoff = (int) ( ( (1000.0/step) * i - fw) / 2.0 - (offset + (rfc - mdoffset) % 500) / step ); else xoff = (int) ( ( (1000.0/step) * i - fw) / 2.0 - (offset + 500 - (rfc + mdoffset) % 500) / step ); if (xoff > 0 && xoff < w() - fw) fl_draw(szFreq, x() + xoff, y() + 10 ); if (xoff > w() - fw) break; } } void WFdisp::drawMarker() { if (mode == SCOPE) return; uchar *pixmap = (uchar *)(markerimage + (int)(offset)); uchar map[RGBsize * scale_width]; int y1 = y() + WFSCALE + WFTEXT; for (int yp = 0; yp < WFMARKER; yp++) { for (int xp = 0; xp < scale_width; xp++) { map[RGBsize * xp] = pixmap[RGBsize * (yp * scale_width + xp * step)]; map[RGBsize * xp + 1] = pixmap[RGBsize * (yp * scale_width + xp * step) + 1]; map[RGBsize * xp + 2] = pixmap[RGBsize * (yp * scale_width + xp * step) + 2]; } fl_draw_image((const uchar *)map, x(), y1 + yp, w(), 1, RGBsize, 0); } return; } void WFdisp::update_waterfall() { // transfer the fft history data into the WF image short int * __restrict__ p1, * __restrict__ p2; RGBI * __restrict__ p3, * __restrict__ p4; p1 = tmp_fft_db + offset + step/2; p2 = p1; p3 = fft_img; p4 = p3; short* __restrict__ limit = tmp_fft_db + image_area - step + 1; #define UPD_LOOP( Step, Operation ) \ case Step: for (int row = 0; row < image_height; row++) { \ p2 = p1; \ p4 = p3; \ for ( const short * __restrict__ last_p2 = std::min( p2 + Step * disp_width, limit +1 ); p2 < last_p2; p2 += Step ) { \ *(p4++) = mag2RGBI[ Operation ]; \ } \ p1 += IMAGE_WIDTH; \ p3 += disp_width; \ }; break if (progdefaults.WFaveraging) { switch(step) { UPD_LOOP( 4, (*p2 + *(p2+1) + *(p2+2) + *(p2-1) + *(p2-1))/5 ); UPD_LOOP( 2, (*p2 + *(p2+1) + *(p2-1))/3 ); UPD_LOOP( 1, *p2 ); default:; } } else { switch(step) { UPD_LOOP( 4, MAX( MAX( MAX ( MAX ( *p2, *(p2+1) ), *(p2+2) ), *(p2-2) ), *(p2-1) ) ); UPD_LOOP( 2, MAX( MAX( *p2, *(p2+1) ), *(p2-1) ) ); UPD_LOOP( 1, *p2 ); default:; } } #undef UPD_LOOP if (active_modem && progdefaults.UseBWTracks) { int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; trx_mode mode = active_modem->get_mode(); if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) { bw_hi = bw_lo = 69 * bandwidth / 100; } RGBI *pos1 = fft_img + (carrierfreq - offset - bw_lo) / step; RGBI *pos2 = fft_img + (carrierfreq - offset + bw_hi) / step; if (unlikely(pos2 == fft_img + disp_width)) pos2--; if (likely(pos1 >= fft_img && pos2 < fft_img + disp_width)) { RGBI rgbi1, rgbi2 ; if (mode == MODE_RTTY && progdefaults.useMARKfreq) { if (active_modem->get_reverse()) { rgbi1 = progdefaults.rttymarkRGBI; rgbi2 = progdefaults.bwTrackRGBI; } else { rgbi1 = progdefaults.bwTrackRGBI; rgbi2 = progdefaults.rttymarkRGBI; } } else { rgbi1 = progdefaults.bwTrackRGBI; rgbi2 = progdefaults.bwTrackRGBI; } if (progdefaults.UseWideTracks) { for (int y = 0; y < image_height; y ++) { *(pos1 + 1) = *pos1 = rgbi1; *(pos2 - 1) = *pos2 = rgbi2; pos1 += disp_width; pos2 += disp_width; } } else { for (int y = 0; y < image_height; y ++) { *pos1 = rgbi1; *pos2 = rgbi2; pos1 += disp_width; pos2 += disp_width; } } } } // draw notch if ((notch_frequency > 1) && (notch_frequency < progdefaults.HighFreqCutoff - 1)) { RGBInotch.I = progdefaults.notchRGBI.I; RGBInotch.R = progdefaults.notchRGBI.R; RGBInotch.G = progdefaults.notchRGBI.G; RGBInotch.B = progdefaults.notchRGBI.B; RGBI *notch = fft_img + (notch_frequency - offset) / step; int dash = 0; for (int y = 0; y < image_height; y++) { dash = (dash + 1) % 6; if (dash == 0 || dash == 1 || dash == 2) *(notch-1) = *notch = *(notch+1) = RGBInotch; notch += disp_width; } } if (progdefaults.show_psm_btn && progStatus.kpsql_enabled && (trx_state == STATE_RX)) signal_psm(); } void WFdisp::drawcolorWF() { uchar *pixmap = (uchar *)fft_img; update_waterfall(); if (active_modem && wantcursor && (progdefaults.UseCursorLines || progdefaults.UseCursorCenterLine) ) { trx_mode mode = active_modem->get_mode(); int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; RGBI *pos0 = (fft_img + cursorpos); RGBI *pos1 = (fft_img + cursorpos - bw_lo/step); RGBI *pos2 = (fft_img + cursorpos + bw_hi/step); if (pos1 >= fft_img && pos2 < fft_img + disp_width) for (int y = 0; y < image_height; y ++) { if (progdefaults.UseCursorLines) { *pos1 = *pos2 = progdefaults.cursorLineRGBI; if (progdefaults.UseWideCursor) *(pos1 + 1) = *(pos2 - 1) = *pos1; } if (progdefaults.UseCursorCenterLine) { *pos0 = progdefaults.cursorCenterRGBI; if (progdefaults.UseWideCenter) *(pos0 - 1) = *(pos0 + 1) = *pos0; } pos0 += disp_width; pos1 += disp_width; pos2 += disp_width; } } fl_color(FL_BLACK); fl_rectf(x(), y(), w(), WFSCALE + WFMARKER + WFTEXT); fl_color(fl_rgb_color(palette[0].R, palette[0].G, palette[0].B)); fl_rectf(x(), y() + WFSCALE + WFMARKER + WFTEXT, w(), image_height); fl_draw_image( pixmap, x(), y() + WFSCALE + WFMARKER + WFTEXT, disp_width, image_height, sizeof(RGBI), disp_width * sizeof(RGBI) ); drawScale(); } void WFdisp::drawspectrum() { int sig; long offset_idx = 0; long ynext, h1 = image_height - 1, ffty = 0, fftpixel = IMAGE_WIDTH * h1, graylevel = 220; uchar *pixmap = (uchar *)fft_sig_img + offset / step; memset (fft_sig_img, 0, image_area); fftpixel /= step; for (int c = 0; c < IMAGE_WIDTH; c += step) { sig = tmp_fft_db[c]; if (step == 1) sig = tmp_fft_db[c]; else if (step == 2) sig = MAX(tmp_fft_db[c], tmp_fft_db[c+1]); else sig = MAX( MAX ( MAX ( tmp_fft_db[c], tmp_fft_db[c+1] ), tmp_fft_db[c+2] ), tmp_fft_db[c+3]); ynext = h1 * sig / 256; offset_idx = (IMAGE_WIDTH/step); while ((ffty < ynext)) { fft_sig_img[fftpixel -= offset_idx] = graylevel; ffty++; if (fftpixel < offset_idx) { cout << "corrupt index 1\n"; break; } } while ((ffty > ynext)) { fft_sig_img[fftpixel += offset_idx] = graylevel; ffty--; if (fftpixel >= (image_area - 1)) { cout << "corrupt index 2\n"; break; } } if (fftpixel >= 0 && fftpixel <= image_area) fft_sig_img[fftpixel++] = graylevel; else cout << "fft_sig_image index out of bounds: " << fftpixel << endl; } if (progdefaults.UseBWTracks) { uchar *pos1 = pixmap + (carrierfreq - offset - bandwidth/2) / step; uchar *pos2 = pixmap + (carrierfreq - offset + bandwidth/2) / step; if (pos1 >= pixmap && pos2 < pixmap + disp_width) for (int y = 0; y < image_height; y ++) { *pos1 = *pos2 = 255; if (progdefaults.UseWideTracks) { *(pos1 + 1) = 255; *(pos2 - 1) = 255; } pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } } if (active_modem && wantcursor && (progdefaults.UseCursorLines || progdefaults.UseCursorCenterLine)) { trx_mode mode = active_modem->get_mode(); int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; uchar *pos0 = pixmap + cursorpos; uchar *pos1 = (pixmap + cursorpos - bw_lo/step); uchar *pos2 = (pixmap + cursorpos + bw_hi/step); for (int y = 0; y < h1; y ++) { if (progdefaults.UseCursorLines) { *pos1 = *pos2 = 255; if (progdefaults.UseWideCursor) *(pos1 + 1) = *(pos2 - 1) = *pos1; } if (progdefaults.UseCursorCenterLine) { *pos0 = 255; if (progdefaults.UseWideCenter) *(pos0-1) = *(pos0+1) = *(pos0); } pos0 += IMAGE_WIDTH/step; pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } } // draw notch if ((notch_frequency > 1) && (notch_frequency < progdefaults.HighFreqCutoff - 1)) { uchar *notch = pixmap + (notch_frequency - offset) / step; int dash = 0; for (int y = 0; y < image_height; y++) { dash = (dash + 1) % 6; if (dash == 0 || dash == 1 || dash == 2) *(notch-1) = *notch = *(notch+1) = 255; notch += IMAGE_WIDTH/step; } } fl_color(FL_BLACK); fl_rectf(x(), y(), w(), WFSCALE + WFMARKER + WFTEXT + image_height); fl_draw_image_mono( pixmap, x(), y() + WFSCALE + WFMARKER + WFTEXT, disp_width, image_height, 1, IMAGE_WIDTH / step); drawScale(); } void WFdisp::drawsignal() { uchar *pixmap = (uchar *)(sig_img + sigoffset); fl_color(FL_BLACK); fl_rectf(x() + disp_width, y(), w() - disp_width, h()); fl_draw_image_mono(pixmap, x(), y(), disp_width, h(), 1, IMAGE_WIDTH); } void WFdisp::draw() { checkoffset(); checkWidth(); if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { drawcolorWF(); drawMarker(); return; } switch (mode) { case SPECTRUM : drawspectrum(); drawMarker(); break; case SCOPE : drawsignal(); break; case WATERFALL : default: drawcolorWF(); drawMarker(); } } //======================================================================= // waterfall //======================================================================= void x1_cb(Fl_Widget *w, void* v) { waterfall *wf = (waterfall *)w->parent(); int m = wf->wfdisp->wfmag(); if (m == MAG_1) w->label("x1"); if (m == MAG_2) w->label("x2"); if (m == MAG_4) w->label("x4"); restoreFocus(); } void slew_left(Fl_Widget *w, void * v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->slew(-100); restoreFocus(); } void slew_right(Fl_Widget *w, void * v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->slew(100); restoreFocus(); } void center_cb(Fl_Widget *w, void *v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->movetocenter(); restoreFocus(); } void carrier_cb(Fl_Widget *w, void *v) { Fl_Counter *cntr = (Fl_Counter *)w; waterfall *wf = (waterfall *)w->parent(); int selfreq = (int) cntr->value(); if (selfreq > progdefaults.HighFreqCutoff) selfreq = progdefaults.HighFreqCutoff - wf->wfdisp->Bandwidth() / 2; stopMacroTimer(); if (active_modem) active_modem->set_freq(selfreq); wf->wfdisp->carrier(selfreq); restoreFocus(); } void do_qsy(bool dir) { if (!active_modem) return; static vector qsy_stack; qrg_mode_t m; wf->xmtlock->value(0); wf->xmtlock->do_callback(); if (dir) { // store m.rfcarrier = wf->rfcarrier(); int wfc = m.carrier = active_modem->get_freq(); qsy_stack.push_back(m); m.rmode = qso_opMODE->value(); trx_mode md = active_modem->get_mode(); string testmode = qso_opMODE->value(); bool xcvr_useFSK = ((testmode.find("RTTY") != string::npos) || (testmode.find("FSK") != string::npos) || ((testmode.find("DATA") != string::npos) && (use_nanoIO)) ); // qsy to the sweet spot frequency that is the center of the PBF in the rig switch (md) { case MODE_CW: m.carrier = progdefaults.CWsweetspot; break; case MODE_RTTY: if (xcvr_useFSK) { // qsy operates on change in audio center track m.carrier = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift]/2; } else m.carrier = progdefaults.RTTYsweetspot; break; default: m.carrier = progdefaults.PSKsweetspot; break; } if (m.rmode.find("CW") != string::npos) { if (wf->USB()) m.rfcarrier += (wfc - m.carrier); else m.rfcarrier -= (wfc - m.carrier); } else if ( (md == MODE_RTTY) && xcvr_useFSK ) { if (wf->USB()) { m.rfcarrier += (wfc - m.carrier); } else { m.rfcarrier -= (wfc - m.carrier); } } else { if (wf->USB()) m.rfcarrier += (wf->carrier() - m.carrier); else m.rfcarrier -= (wf->carrier() - m.carrier); } } else { // qsy to top of stack if (qsy_stack.size()) { m = qsy_stack.back(); qsy_stack.pop_back(); } } if (m.carrier > 0) qsy(m.rfcarrier, m.carrier); } void qsy_cb(Fl_Widget *w, void *v) { if (Fl::event_button() != FL_RIGHT_MOUSE) do_qsy(true); else do_qsy(false); restoreFocus(); } void rate_cb(Fl_Widget *w, void *v) { waterfall* wf = static_cast(w->parent()); WFspeed new_speed; switch (wf->wfdisp->Speed()) { case SLOW: new_speed = NORMAL; break; case NORMAL: default: new_speed = FAST; break; case FAST: new_speed = PAUSE; break; case PAUSE: new_speed = SLOW; break; } wf->Speed(new_speed); restoreFocus(); } //extern void reset_xmlchars(); void xmtrcv_cb(Fl_Widget *w, void *vi) { if (!active_modem) return; FL_LOCK_D(); Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); FL_UNLOCK_D(); if (!(active_modem->get_cap() & modem::CAP_TX)) { b->value(0); restoreFocus(); return; } if (v == 1) { stopMacroTimer(); active_modem->set_stopflag(false); if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) set_xmtrcv_selection_color_pending(); trx_transmit(); } else { if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { psm_transmit_ended(PSM_ABORT); xmtrcv_selection_color(progdefaults.XmtColor); } if (btnTune->value()) { btnTune->value(0); btnTune->do_callback(); } else { TransmitText->clear(); if (active_modem->get_mode() == MODE_FSQ && fsq_tx_text) fsq_tx_text->clear(); else if (active_modem->get_mode() == MODE_IFKP && ifkp_tx_text) ifkp_tx_text->clear(); if (arq_text_available) AbortARQ(); if(xmltest_char_available) reset_xmlchars(); if(kiss_text_available) flush_kiss_tx_buffer(); if (progStatus.timer) progStatus.timer = 0; queue_reset(); active_modem->set_stopflag(true); } } restoreFocus(); } void xmtlock_cb(Fl_Widget *w, void *vi) { if (!active_modem) return; FL_LOCK_D(); Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); FL_UNLOCK_D(); active_modem->set_freqlock(v ? true : false ); restoreFocus(); } void waterfall::set_XmtRcvBtn(bool val) { FL_LOCK_D(); xmtrcv->value(val); if (!val && btnTune->value()) { btnTune->value(0); btnTune->labelcolor(FL_FOREGROUND_COLOR); } FL_UNLOCK_D(); } void set_wf_mode(void) { static const char* names[NUM_WF_MODES] = { "WF", "FFT", "SIG" }; int m = 0; if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { if(wf->wfdisp->Mode() == WATERFALL) { return; } m = WATERFALL; } else { m = wf->wfdisp->Mode() + (Fl::event_button() == FL_LEFT_MOUSE ? 1 : -1); } m = WCLAMP(m, WATERFALL, NUM_WF_MODES-1); if (m == SCOPE) wf->x1->deactivate(); else wf->x1->activate(); wf->wfdisp->Mode(static_cast(m)); wf->mode->label(names[m]); restoreFocus(); } void mode_cb(Fl_Widget* w, void*) { set_wf_mode(); } void reflevel_cb(Fl_Widget *w, void *v) { FL_LOCK_D(); waterfall *wf = (waterfall *)w->parent(); double val = wf->wfRefLevel->value(); FL_UNLOCK_D(); progdefaults.wfRefLevel = val; restoreFocus(); } void ampspan_cb(Fl_Widget *w, void *v) { FL_LOCK_D(); waterfall *wf = (waterfall *)w->parent(); double val = wf->wfAmpSpan->value(); FL_UNLOCK_D(); wf->wfdisp->Ampspan(val); progdefaults.wfAmpSpan = val; restoreFocus(); } void btnRev_cb(Fl_Widget *w, void *v) { if (!active_modem) return; FL_LOCK_D(); waterfall *wf = (waterfall *)w->parent(); Fl_Light_Button *b = (Fl_Light_Button *)w; wf->Reverse(b->value()); FL_UNLOCK_D(); active_modem->set_reverse(wf->Reverse()); progdefaults.rtty_reverse = b->value(); progdefaults.changed = true; restoreFocus(); } void btnMem_cb(Fl_Widget *, void *menu_event) { if (!active_modem) return; static std::vector qrg_list; enum { SELECT, APPEND, REPLACE, REMOVE, CLEAR }; int op = SELECT, elem = 0; if (menu_event) { // event on popup menu elem = wf->mbtnMem->value(); switch (Fl::event_button()) { case FL_MIDDLE_MOUSE: op = REPLACE; break; case FL_LEFT_MOUSE: case FL_RIGHT_MOUSE: default: op = (Fl::event_state() & FL_SHIFT) ? REMOVE : SELECT; break; } } else { // button press switch (Fl::event_button()) { case FL_RIGHT_MOUSE: return; case FL_MIDDLE_MOUSE: // select last if ((elem = qrg_list.size() - 1) < 0) return; op = SELECT; break; case FL_LEFT_MOUSE: default: op = (Fl::event_state() & FL_SHIFT) ? CLEAR : APPEND; break; } } qrg_mode_t m; switch (op) { case SELECT: m = qrg_list[elem]; if (active_modem != *mode_info[m.mode].modem) init_modem_sync(m.mode); if (m.rfcarrier && m.rfcarrier != wf->rfcarrier()) qsy(m.rfcarrier, m.carrier); else active_modem->set_freq(m.carrier); break; case REMOVE: wf->mbtnMem->remove(elem); qrg_list.erase(qrg_list.begin() + elem); break; case CLEAR: wf->mbtnMem->clear(); qrg_list.clear(); break; case APPEND: case REPLACE: m.rfcarrier = wf->rfcarrier(); m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); if (op == APPEND) { if (find(qrg_list.begin(), qrg_list.end(), m) == qrg_list.end()) qrg_list.push_back(m); else break; } else qrg_list[elem] = m; // write the menu item text { ostringstream o; o << mode_info[m.mode].sname << " @@ "; if (m.rfcarrier > 0) { // write 1000s separators char s[20], *p = s + sizeof(s) - 1; int i = 0; *p = '\0'; do { if (i % 3 == 0 && i) *--p = '.'; *--p = '0' + m.rfcarrier % 10; ++i; } while ((m.rfcarrier /= 10) && p > s); o << p << (wf->USB() ? " + " : " - "); } o << m.carrier; if (op == APPEND) wf->mbtnMem->add(o.str().c_str()); else wf->mbtnMem->replace(elem, o.str().c_str()); } break; } restoreFocus(); } void waterfall::opmode() { if (!active_modem) return; int val = (int)active_modem->get_bandwidth(); wfdisp->carrier((int)CLAMP( wfdisp->carrier(), progdefaults.LowFreqCutoff + val / 2, progdefaults.HighFreqCutoff - val / 2)); wfdisp->Bandwidth( val ); FL_LOCK_D(); wfcarrier->range(progdefaults.LowFreqCutoff + val/2, progdefaults.HighFreqCutoff - val/2); FL_UNLOCK_D(); } void waterfall::carrier(int f) { wfdisp->carrier(f); FL_LOCK_D(); wfcarrier->value(f); wfcarrier->damage(FL_DAMAGE_ALL); FL_UNLOCK_D(); } int waterfall::Speed() { return (int)wfdisp->Speed(); } void waterfall::Speed(int rate) { WFspeed speed = static_cast(rate); wfdisp->Speed(speed); const char* label; switch (speed) { case SLOW: label = "SLOW"; break; case NORMAL: default: label = "NORM"; break; case FAST: label = "FAST"; break; case PAUSE: label = "PAUSE"; break; } wfrate->label(label); wfrate->redraw_label(); } int waterfall::Mag() { return wfdisp->Mag(); } void waterfall::Mag(int m) { FL_LOCK_D(); wfdisp->Mag(m); if (m == MAG_1) x1->label("x1"); if (m == MAG_2) x1->label("x2"); if (m == MAG_4) x1->label("x4"); x1->redraw_label(); FL_UNLOCK_D(); } int waterfall::Offset() { return wfdisp->Offset(); } void waterfall::Offset(int v) { FL_LOCK_D(); wfdisp->Offset(v); FL_UNLOCK_D(); } int waterfall::Carrier() { return wfdisp->carrier(); } void waterfall::Carrier(int f) { if (active_modem) active_modem->set_freq(f); } void waterfall::rfcarrier(long long cf) { wfdisp->rfcarrier(cf); } long long waterfall::rfcarrier() { return wfdisp->rfcarrier(); } void waterfall::setRefLevel() { FL_LOCK_D(); wfRefLevel->value(progdefaults.wfRefLevel); FL_UNLOCK_D(); } void waterfall::setAmpSpan() { FL_LOCK_D(); wfAmpSpan->value(progdefaults.wfAmpSpan); wfdisp->Ampspan(progdefaults.wfAmpSpan); FL_UNLOCK_D(); } void waterfall::USB(bool b) { if (wfdisp->USB() == b) return; wfdisp->USB(b); if (active_modem) active_modem->set_reverse(reverse); REQ(&viewer_redraw); } bool waterfall::USB() { return wfdisp->USB(); } void waterfall::show_scope(bool on) { if (on) { wfscope->show(); wfscope->position(wf->x() + wf->w() - wf_dim - BEZEL, wf->y()); wfdisp->size( wf->w() - 2 * BEZEL - wf_dim, wf_dim - 2 * BEZEL); rs1->init_sizes(); } else { wfscope->hide(); wfscope->position(wf->x() + wf->w(), wf->y()); wfdisp->size( wf->w() - 2 * BEZEL, wf_dim - 2 * BEZEL); rs1->init_sizes(); } wfscope->redraw(); } waterfall::waterfall(int x0, int y0, int w0, int h0, char *lbl) : Fl_Group(x0,y0,w0,h0,lbl) { int xpos; float ratio; ratio = w0 * 1.0 / bwdths; wf_dim = h() - BTN_HEIGHT - 4; buttonrow = h() + y() - BTN_HEIGHT - 1; rs1 = new Fl_Group(x(), y(), w(), wf_dim); rs1->box(FL_DOWN_BOX); wfdisp = new WFdisp( x() + BEZEL, y() + BEZEL, w() - 2 * BEZEL, wf_dim - 2 * BEZEL); wfscope = new Digiscope (x() + w(), y(), wf_dim, wf_dim); rs1->resizable(wfdisp); rs1->end(); wfscope->hide(); xpos = x() + wSpace; mode = new Fl_Button(xpos, buttonrow, (int)(bwFFT*ratio), BTN_HEIGHT, "WF"); mode->callback(mode_cb, 0); mode->tooltip(_("Waterfall / FFT / Scope")); xpos = xpos + (int)(bwFFT*ratio) + wSpace; wfRefLevel = new Fl_Counter2(xpos, buttonrow, (int)(cwRef*ratio), BTN_HEIGHT ); wfRefLevel->callback(reflevel_cb, 0); wfRefLevel->step(1.0); wfRefLevel->precision(0); wfRefLevel->range(-40.0, 0.0); wfRefLevel->value(-20.0); wfRefLevel->tooltip(_("Upper signal level (dB)")); wfRefLevel->type(FL_SIMPLE_COUNTER); xpos = xpos + (int)(cwRef*ratio) + wSpace; wfAmpSpan = new Fl_Counter2(xpos, buttonrow, (int)(cwRef*ratio), BTN_HEIGHT ); wfAmpSpan->callback(ampspan_cb, 0); wfAmpSpan->step(1.0); wfAmpSpan->precision(0); wfAmpSpan->range(6.0, 90.0); wfAmpSpan->value(70.0); wfdisp->Ampspan(70.0); wfAmpSpan->tooltip(_("Signal range (dB)")); wfAmpSpan->type(FL_SIMPLE_COUNTER); xpos = xpos + (int)(cwRef*ratio) + wSpace; x1 = new Fl_Button(xpos, buttonrow, (int)(bwX1*ratio), BTN_HEIGHT, "x1"); x1->callback(x1_cb, 0); x1->tooltip(_("Change waterfall scale")); xpos = xpos + (int)(bwX1*ratio) + wSpace; left = new Fl_Repeat_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@<"); left->callback(slew_left, 0); left->tooltip(_("Slew display lower in frequency")); xpos = xpos + (int)(bwMov*ratio); center = new Fl_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@||"); center->callback(center_cb, 0); center->tooltip(_("Center display on signal")); xpos = xpos + (int)(bwMov*ratio); right = new Fl_Repeat_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@>"); right->callback(slew_right, 0); right->tooltip(_("Slew display higher in frequency")); xpos = xpos + (int)(bwMov*ratio) + wSpace; wfrate = new Fl_Button(xpos, buttonrow, (int)(bwRate*ratio), BTN_HEIGHT, "Norm"); wfrate->callback(rate_cb, 0); wfrate->tooltip(_("Waterfall drop speed")); xpos = xpos + (int)(bwRate*ratio) + wSpace; wfcarrier = new Fl_Counter2(xpos, buttonrow, (int)(cwCnt*ratio), BTN_HEIGHT ); wfcarrier->callback(carrier_cb, 0); wfcarrier->step(1.0); wfcarrier->lstep(10.0); wfcarrier->precision(0); wfcarrier->range(16.0, progdefaults.HighFreqCutoff - 16.0); wfcarrier->value(wfdisp->carrier()); wfcarrier->tooltip(_("Adjust cursor frequency")); xpos = xpos + (int)(cwCnt*ratio) + wSpace; qsy = new Fl_Button(xpos, buttonrow, (int)(bwQsy*ratio), BTN_HEIGHT, "QSY"); qsy->callback(qsy_cb, 0); qsy->tooltip(_("Center in passband\nRight click to undo")); qsy->deactivate(); xpos = xpos + (int)(bwQsy*ratio) + wSpace; btnMem = new Fl_Button(xpos, buttonrow, (int)(bwMem*ratio), BTN_HEIGHT, "Store"); btnMem->callback(btnMem_cb, 0); btnMem->tooltip(_("Store mode and frequency\nRight click for list")); mbtnMem = new Fl_Menu_Button(btnMem->x(), btnMem->y(), btnMem->w(), btnMem->h(), 0); mbtnMem->callback(btnMem->callback(), mbtnMem); mbtnMem->type(Fl_Menu_Button::POPUP3); xpos = xpos + (int)(bwMem*ratio) + wSpace; xmtlock = new Fl_Light_Button(xpos, buttonrow, (int)(bwXmtLock*ratio), BTN_HEIGHT, "Lk"); xmtlock->callback(xmtlock_cb, 0); xmtlock->value(0); xmtlock->selection_color(progdefaults.LkColor); xmtlock->tooltip(_("Lock transmit frequency")); /// We save this flag which is used by rtty decoding. xpos = xpos + (int)(bwXmtLock*ratio) + wSpace; btnRev = new Fl_Light_Button(xpos, buttonrow, (int)(bwRev*ratio), BTN_HEIGHT, "Rv"); btnRev->callback(btnRev_cb, 0); reverse = progdefaults.rtty_reverse; btnRev->value(reverse); btnRev->selection_color(progdefaults.RevColor); btnRev->tooltip(_("Reverse")); xpos = w() - (int)(bwXmtRcv*ratio) - wSpace; xmtrcv = new Fl_Light_Button(xpos, buttonrow, (int)(bwXmtRcv*ratio) - BEZEL, BTN_HEIGHT, "T/R"); xmtrcv->callback(xmtrcv_cb, 0); xmtrcv->selection_color(progdefaults.XmtColor); xmtrcv->value(0); xmtrcv->tooltip(_("Transmit/Receive")); end(); } void waterfall::UI_select(bool on) { if (on) { if (!progdefaults.WF_UIrev) btnRev->hide(); else btnRev->show(); if (!progdefaults.WF_UIwfcarrier) wfcarrier->hide(); else wfcarrier->show(); if (!progdefaults.WF_UIwfreflevel) wfRefLevel->hide(); else wfRefLevel->show(); if (!progdefaults.WF_UIwfampspan) wfAmpSpan->hide(); else wfAmpSpan->show(); if (!progdefaults.WF_UIxmtlock) xmtlock->hide(); else xmtlock->show(); if (!progdefaults.WF_UIqsy) qsy->hide(); else qsy->show(); if (!progdefaults.WF_UIwfmode) mode->hide(); else mode->show(); if (!progdefaults.WF_UIx1) x1->hide(); else x1->show(); if (!progdefaults.WF_UIwfshift) { left->hide(); center->hide(); right->hide(); } else { left->show(); center->show(); right->show(); } if (!progdefaults.WF_UIwfdrop) wfrate->hide(); else wfrate->show(); if (!progdefaults.WF_UIwfstore) { btnMem->hide(); mbtnMem->hide(); } else { btnMem->show(); mbtnMem->show(); } //if (noUI) xmtrcv->hide(); } else { // btnRev->show(); if (!progdefaults.WF_UIrev) btnRev->hide(); else btnRev->show(); wfcarrier->show(); wfRefLevel->show(); wfAmpSpan->show(); xmtlock->show(); qsy->show(); mode->show(); x1->show(); left->show(); center->show(); right->show(); wfrate->show(); btnMem->show(); mbtnMem->show(); } btnRev->redraw(); wfcarrier->redraw(); wfRefLevel->redraw(); wfAmpSpan->redraw(); xmtlock->redraw(); qsy->redraw(); mode->redraw(); x1->redraw(); left->redraw(); center->redraw(); right->redraw(); wfrate->redraw(); btnMem->redraw(); mbtnMem->redraw(); } int waterfall::handle(int event) { if (event != FL_MOUSEWHEEL || Fl::event_inside(wfdisp)) return Fl_Group::handle(event); int d; if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) return 1; // this does not belong here, but we don't have access to this widget's // handle method (or its parent's) if (active_modem && Fl::event_inside(MODEstatus)) { trx_mode mode = active_modem->get_mode(); for (;;) { mode = WCLAMP(mode + d, 0, NUM_MODES - 1); if ((mode >= NUM_RXTX_MODES && mode < NUM_MODES) || progdefaults.visible_modes.test(mode)) break; } init_modem(mode); return 1; } // as above; handle wheel events for the macro bar extern void altmacro_cb(Fl_Widget *w, void *v); if (progdefaults.macro_wheel) { if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (Fl::event_inside(macroFrame2)) { altmacro_cb(btnAltMacros2, reinterpret_cast(d)); return 1; } } else { if (Fl::event_inside(macroFrame1)) { altmacro_cb(btnAltMacros1, reinterpret_cast(d)); return 1; } } } return Fl_Group::handle(event); } static Fl_Cursor cursor = FL_CURSOR_DEFAULT; static void hide_cursor(void *w) { if (cursor != FL_CURSOR_NONE) reinterpret_cast(w)->window()->cursor(cursor = FL_CURSOR_NONE); } void waterfall::insert_text(bool check) { if (active_modem && check) { qrg_mode_t m; m.rfcarrier = wf->rfcarrier(); m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); extern qrg_mode_t last_marked_qrg; if (last_marked_qrg.mode == m.mode && last_marked_qrg.rfcarrier == m.rfcarrier && abs(last_marked_qrg.carrier - m.carrier) <= 16) return; last_marked_qrg = m; } string::size_type i; if ((i = progdefaults.WaterfallClickText.find("")) != string::npos) { string s = progdefaults.WaterfallClickText; s[i] = '\0'; ReceiveText->addstr(s); note_qrg(false); // ReceiveText->addstr(s); // ReceiveText->addstr(s.c_str() + i + strlen("")); } else ReceiveText->addstr(progdefaults.WaterfallClickText, FTextView::SKIP); } static void find_signal_text(void) { if (!active_modem) return; int freq = active_modem->get_freq(); trx_mode mode = active_modem->get_mode(); extern map qrg_marks; map::const_iterator i; for (i = qrg_marks.begin(); i != qrg_marks.end(); ++i) if (i->second.mode == mode && abs(i->second.carrier - freq) <= 20) break; if (i != qrg_marks.end()) { // Search backward from the current text cursor position, then // try the other direction int pos = ReceiveText->insert_position(); if (ReceiveText->buffer()->search_backward(pos, i->first.c_str(), &pos, 1) || ReceiveText->buffer()->search_forward(pos, i->first.c_str(), &pos, 1)) { ReceiveText->insert_position(pos); ReceiveText->show_insert_position(); } } } int WFdisp::handle(int event) { static int pxpos, push; if (!(event == FL_LEAVE || Fl::event_inside(this))) { if (event == FL_RELEASE) push = 0; return 0; } if (trx_state != STATE_RX) return 1; int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int eb; switch (event) { case FL_MOVE: if (progdefaults.WaterfallQSY && ypos < WFTEXT + WFSCALE) { Fl::remove_timeout(hide_cursor, this); if (cursor != FL_CURSOR_WE) window()->cursor(cursor = FL_CURSOR_WE); if (wantcursor) { wantcursor = false; makeMarker(); } break; } if (cursor != FL_CURSOR_DEFAULT) window()->cursor(cursor = FL_CURSOR_DEFAULT); if (!Fl::has_timeout(hide_cursor, this)) Fl::add_timeout(1, hide_cursor, this); wantcursor = true; cursorpos = xpos; makeMarker(); redrawCursor(); break; case FL_DRAG: case FL_PUSH: stopMacroTimer(); switch (eb = Fl::event_button()) { case FL_RIGHT_MOUSE: wantcursor = false; if (event == FL_PUSH) { tmp_carrier = true; oldcarrier = carrier(); if (progdefaults.WaterfallHistoryDefault) bHistory = true; } goto lrclick; case FL_LEFT_MOUSE: if ((Fl::event_state() & (FL_ALT | FL_CTRL)) == (FL_ALT | FL_CTRL)) { if (notch_frequency) notch_off(); else notch_on(cursorFreq(xpos)); return 1; } if (event == FL_PUSH) { push = ypos; pxpos = xpos; if (Fl::event_clicks()) return 1; } if (progdefaults.WaterfallQSY && push < WFTEXT + WFSCALE) { long long newrfc = (pxpos - xpos) * step; if (!USB()) newrfc = -newrfc; newrfc += rfcarrier(); qsy(newrfc, active_modem ? active_modem->get_freq() : 1500); pxpos = xpos; return 1; } lrclick: if (Fl::event_state() & FL_CTRL) { if (event == FL_DRAG) break; if (!progdefaults.WaterfallHistoryDefault) bHistory = true; if (eb == FL_LEFT_MOUSE) { restoreFocus(); break; } } if (progdefaults.WaterfallHistoryDefault) bHistory = true; newcarrier = cursorFreq(xpos); if (active_modem) { newcarrier = (int)CLAMP( newcarrier, progdefaults.LowFreqCutoff + active_modem->get_bandwidth() / 2, progdefaults.HighFreqCutoff - active_modem->get_bandwidth() / 2); active_modem->set_freq(newcarrier); viewer_paste_freq(newcarrier); if (!(Fl::event_state() & FL_SHIFT)) active_modem->set_sigsearch(SIGSEARCH); } redrawCursor(); restoreFocus(); break; case FL_MIDDLE_MOUSE: if (event == FL_DRAG) break; // if (Fl::event_state() & FL_CTRL) // viewer_paste_freq(cursorFreq(xpos)); // else { btnAFC->value(!btnAFC->value()); btnAFC->do_callback(); // } } break; case FL_RELEASE: switch (eb = Fl::event_button()) { case FL_RIGHT_MOUSE: tmp_carrier = false; if (active_modem) active_modem->set_freq(oldcarrier); redrawCursor(); restoreFocus(); // fall through case FL_LEFT_MOUSE: push = 0; oldcarrier = newcarrier; if (eb != FL_LEFT_MOUSE || !ReceiveText->visible()) break; if (eb == FL_LEFT_MOUSE) recenter_spectrum_viewer(); if (!(Fl::event_state() & (FL_CTRL | FL_META | FL_ALT | FL_SHIFT))) { if (Fl::event_clicks() == 1) note_qrg(true, "\n", "\n"); else if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } else if (Fl::event_state() & (FL_META | FL_ALT)) find_signal_text(); break; } break; case FL_MOUSEWHEEL: { stopMacroTimer(); int d; if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) break; int state = Fl::event_state(); if (state & FL_CTRL) wf->handle_mouse_wheel(waterfall::WF_AFC_BW, d); else if (state & (FL_META | FL_ALT)) wf->handle_mouse_wheel(waterfall::WF_SIGNAL_SEARCH, d); else if (state & FL_SHIFT) wf->handle_mouse_wheel(waterfall::WF_SQUELCH, d); else { if (progdefaults.WaterfallQSY && Fl::event_inside(x(), y(), w(), WFTEXT+WFSCALE+WFMARKER)) qsy(wf->rfcarrier() - 500*d); else wf->handle_mouse_wheel(progdefaults.WaterfallWheelAction, d); } return handle(FL_MOVE); } case FL_SHORTCUT: if (Fl::event_inside(this)) take_focus(); break; case FL_KEYBOARD: { stopMacroTimer(); int d = (Fl::event_state() & FL_CTRL) ? 10 : 1; int k = Fl::event_key(); switch (k) { case FL_Left: case FL_Right: if (k == FL_Left) d = -d; if (active_modem) { oldcarrier = newcarrier = (int)CLAMP( carrier() + d, progdefaults.LowFreqCutoff + active_modem->get_bandwidth() / 2, progdefaults.HighFreqCutoff - active_modem->get_bandwidth() / 2); active_modem->set_freq(newcarrier); } redrawCursor(); break; case FL_Tab: restoreFocus(); break; default: restoreFocus(); return TransmitText->handle(event); } break; } case FL_KEYUP: { if (Fl::event_inside(this)) { int k = Fl::event_key(); if (k == FL_Shift_L || k == FL_Shift_R || k == FL_Control_L || k == FL_Control_R || k == FL_Meta_L || k == FL_Meta_R || k == FL_Alt_L || k == FL_Alt_R) restoreFocus(); } break; } case FL_LEAVE: Fl::remove_timeout(hide_cursor, this); if (cursor != FL_CURSOR_DEFAULT) window()->cursor(cursor = FL_CURSOR_DEFAULT); wantcursor = false; makeMarker(); // restoreFocus(); break; } return 1; } void waterfall::handle_mouse_wheel(int what, int d) { if (d == 0) return; Fl_Valuator *val = 0; const char* msg_fmt = 0, *msg_label = 0; switch (what) { case WF_NOP: return; case WF_AFC_BW: { if (active_modem) { trx_mode m = active_modem->get_mode(); if (m >= MODE_PSK_FIRST && m <= MODE_PSK_LAST) { val = mailserver ? cntServerOffset : cntSearchRange; msg_label = "Srch Rng"; } else if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST) { val = sldrHellBW; msg_label = "BW"; } else if (m == MODE_CW) { val = sldrCWbandwidth; msg_label = "BW"; } else return; msg_fmt = "%s: %2.0f Hz"; } break; } case WF_SIGNAL_SEARCH: if (d > 0) { if (active_modem) active_modem->searchDown(); } else { if (active_modem) active_modem->searchUp(); } return; case WF_SQUELCH: val = sldrSquelch; d = -d; msg_fmt = "%s = %2.0f %%"; msg_label = "Squelch"; break; case WF_CARRIER: val = wfcarrier; break; case WF_MODEM: init_modem(d > 0 ? MODE_NEXT : MODE_PREV); return; case WF_SCROLL: (d > 0 ? right : left)->do_callback(); return; } val->value(val->clamp(val->increment(val->value(), -d))); bool changed_save = progdefaults.changed; val->do_callback(); progdefaults.changed = changed_save; if (val == cntServerOffset || val == cntSearchRange) { if (active_modem) active_modem->set_sigsearch(SIGSEARCH); } else if (val == sldrSquelch) { // sldrSquelch gives focus to TransmitText take_focus(); } if (msg_fmt) { char msg[60]; snprintf(msg, sizeof(msg), msg_fmt, msg_label, val->value()); put_status(msg, 2.0); } } const char* waterfall::wf_wheel_action[] = { _("None"), _("AFC range or BW"), _("Signal search"), _("Squelch level"), _("Modem carrier"), _("Modem"), _("Scroll") }; fldigi-4.1.06/src/waterfall/colorbox.cxx0000644000175000017500000000725113472115774015124 00000000000000// ---------------------------------------------------------------------------- // colorbox.cxx // // Copyright (C) 2007-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "gettext.h" #include "colorbox.h" #include "waterfall.h" #include "confdialog.h" #include "main.h" #include "fl_digi.h" #include "fileselect.h" #include "debug.h" using namespace std; void colorbox::draw() { int ypos = y() + 2; int xpos; int ht = h() - 4; int wd = w() - 4; draw_box(); for(int i = 0; i < wd; i++){ xpos = x() + 2 + i; int xc = i * 256 / wd; fl_rectf (xpos, ypos, 1, ht, mag2RGBI[xc].R, mag2RGBI[xc].G, mag2RGBI[xc].B); } } void setColorButtons() { for (int i = 0; i < 9; i++) { btnColor[i]->color( fl_rgb_color( palette[i].R, palette[i].G, palette[i].B ) ); btnColor[i]->redraw(); } } void selectColor(int n) { uchar r, g, b; r = palette[n].R; g = palette[n].G; b = palette[n].B; fl_color_chooser("Spectrum", r, g, b); palette[n].R = r; palette[n].G = g; palette[n].B = b; btnColor[n]->color( fl_rgb_color( palette[n].R, palette[n].G, palette[n].B ) ); btnColor[n]->redraw(); wf->setcolors(); WF_Palette->redraw(); } static string palfilename = ""; static string palLabelStr; void loadPalette() { int r,g,b; FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = PalettesDir; palfilename.append ("fldigi.pal"); } const char *p = FSEL::select(_("Open palette"), _("Fldigi palette\t*.pal"), palfilename.c_str()); if (!p) return; if (!*p) return; if ((clrfile = fl_fopen(p, "r")) != NULL) { for (int i = 0; i < 9; i++) { if (fscanf(clrfile, "%d;%d;%d\n", &r, &g, &b) == EOF) { if (ferror(clrfile)) LOG_PERROR("fscanf"); else LOG_ERROR("unexpected EOF"); fclose(clrfile); return; } palette[i].R = r; palette[i].G = g; palette[i].B = b; } fclose(clrfile); wf->setcolors(); setColorButtons(); palfilename = p; palLabelStr = p; size_t pos = palLabelStr.find_last_of('/'); if (pos != string::npos) palLabelStr.erase(0, pos+1); palLabelStr = _("Palette: ") + palLabelStr; WF_Palette->label(palLabelStr.c_str()); WF_Palette->redraw(); progdefaults.PaletteName = palLabelStr; } } void savePalette() { FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = PalettesDir; palfilename.append ("fldigi.pal"); } const char *p = FSEL::saveas(_("Save palette"), _("Fldigi palette\t*.pal"), palfilename.c_str()); if (!p) return; if ((clrfile = fl_fopen(p, "w")) != NULL) { for (int i = 0; i < 9; i++) { fprintf(clrfile, "%3d;%3d;%3d\n", palette[i].R, palette[i].G, palette[i].B ); } fclose(clrfile); palfilename = p; palLabelStr = p; size_t pos = palLabelStr.find_last_of('/'); if (pos != string::npos) palLabelStr.erase(0, pos+1); palLabelStr = _("Palette: ") + palLabelStr; WF_Palette->label(palLabelStr.c_str()); WF_Palette->redraw(); progdefaults.PaletteName = palLabelStr; } } fldigi-4.1.06/src/fsq/0000775000175000017500000000000013515625027011431 500000000000000fldigi-4.1.06/src/fsq/fsq-pic.cxx0000644000175000017500000003230213472116000013421 00000000000000// ---------------------------------------------------------------------------- // fsqpic.cxx -- fsq image support functions // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gfsq source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "gettext.h" #include "fileselect.h" Fl_Double_Window *fsqpicRxWin = (Fl_Double_Window *)0; picture *fsqpicRx = (picture *)0; Fl_Button *btnfsqRxReset = (Fl_Button *)0; Fl_Button *btnfsqRxSave = (Fl_Button *)0; Fl_Button *btnfsqRxClose = (Fl_Button *)0; Fl_Counter *cnt_phase = (Fl_Counter *)0; Fl_Counter *cnt_slant = (Fl_Counter *)0; Fl_Double_Window *fsqpicTxWin = (Fl_Double_Window *)0; picture *fsqpicTx = (picture *)0; Fl_Button *btnfsqpicTransmit = (Fl_Button *)0; Fl_Button *btnfsqpicTxSendAbort = (Fl_Button *)0; Fl_Button *btnfsqpicTxLoad = (Fl_Button *)0; Fl_Button *btnfsqpicTxClose = (Fl_Button *)0; Fl_Choice *selfsqpicSize = (Fl_Choice *)0; Fl_Shared_Image *fsqTxImg = (Fl_Shared_Image *)0; unsigned char *fsqxmtimg = (unsigned char *)0; unsigned char *fsqxmtpicbuff = (unsigned char *)0; #define RAWSIZE 640*(480 + 8)*3*10 #define RAWSTART 640*4*3*10 unsigned char rawvideo[RAWSIZE + 1]; int numpixels; int pixelptr; int rawcol; int rawrow; int rawrgb; char image_type = 'S'; int fsq_txSPP = 8; char fsq_txclr_tooltip[24]; char fsq_txgry_tooltip[24]; static int translate = 0; static bool enabled = false; void correct_video() { int W = fsqpicRx->w(); int H = fsqpicRx->h(); int slant = cnt_slant->value(); int vidsize = W * H; int index, rowptr, colptr; float ratio = (((float)vidsize - (float)slant)/(float)vidsize); unsigned char vid[W * H * 3]; for (int row = 0; row < H; row++) { rowptr = W * 3 * row * 10; for (int col = 0; col < W; col++) { colptr = 10*col; for (int rgb = 0; rgb < 3; rgb++) { index = ratio*(rowptr + colptr + 10*W*rgb); index += RAWSTART - 10*pixelptr; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[2 - rgb + 3 * (col + row * W)] = rawvideo[index]; } } } fsqpicRx->video(vid, W*H*3); } void fsq_updateRxPic(unsigned char data, int pos) { if (!fsqpicRxWin->shown()) fsqpicRx->show(); fsqpicRx->pixel(data, pos); int W = fsqpicRx->w(); if (image_type == 'F' || image_type == 'p' || image_type == 'm') { int n = RAWSTART + 10*(rawcol + W * (rawrgb + 3 * rawrow)); if (n < RAWSIZE) for (int i = 0; i < 10; i++) rawvideo[n + i] = data; rawrgb++; if (rawrgb == 3) { rawrgb = 0; rawcol++; if (rawcol == W) { rawcol = 0; rawrow++; } } } else for (int i = 0; i < 10; i++) rawvideo[RAWSTART + 10*numpixels + i] = data; numpixels++; if (numpixels >= (RAWSIZE - RAWSTART - 10)) numpixels = RAWSIZE - RAWSTART - 10; } void cb_btnfsqRxReset(Fl_Widget *, void *) { progStatus.fsq_rx_abort = true; } void cb_btnfsqRxSave(Fl_Widget *, void *) { fsqpicRx->save_png(PicsDir.c_str()); } void cb_btnfsqRxClose(Fl_Widget *, void *) { fsqpicRxWin->hide(); progStatus.fsq_rx_abort = true; } void cb_cnt_phase(Fl_Widget *, void *data) { pixelptr = cnt_phase->value(); if (pixelptr >= RAWSTART/10) { pixelptr = RAWSTART/10 - 1; cnt_phase->value(pixelptr); } if (pixelptr < -RAWSTART/10) { pixelptr = -RAWSTART/10; cnt_phase->value(pixelptr); } correct_video(); } void cb_cnt_slant(Fl_Widget *, void *) { correct_video(); } void fsq_disableshift() { if (!fsqpicRxWin) return; cnt_phase->deactivate(); cnt_slant->deactivate(); btnfsqRxSave->deactivate(); fsqpicRxWin->redraw(); } void fsq_enableshift() { if (!fsqpicRxWin) return; cnt_phase->activate(); cnt_slant->activate(); btnfsqRxSave->activate(); fsqpicRxWin->redraw(); } void fsq_createRxViewer() { fsqpicRxWin = new Fl_Double_Window(324, 274, _("FSQ Rx Image")); fsqpicRxWin->xclass(PACKAGE_NAME); fsqpicRxWin->begin(); fsqpicRx = new picture(2, 2, 320, 240); fsqpicRx->noslant(); Fl_Group *buttons = new Fl_Group(0, fsqpicRxWin->h() - 26, fsqpicRxWin->w(), 26, ""); buttons->box(FL_FLAT_BOX); btnfsqRxReset = new Fl_Button(2, fsqpicRxWin->h() - 26, 40, 24, "Reset"); btnfsqRxReset->callback(cb_btnfsqRxReset, 0); cnt_phase = new Fl_Counter(46, fsqpicRxWin->h() - 24, 80, 20, ""); cnt_phase->step(1); cnt_phase->lstep(10); cnt_phase->minimum(-RAWSTART + 1); cnt_phase->maximum(RAWSTART - 1); cnt_phase->value(0); cnt_phase->callback(cb_cnt_phase, 0); cnt_phase->tooltip(_("Phase correction")); cnt_slant = new Fl_Counter(140, fsqpicRxWin->h() - 24, 80, 20, ""); cnt_slant->step(1); cnt_slant->lstep(10); cnt_slant->minimum(-200); cnt_slant->maximum(200); cnt_slant->value(0); cnt_slant->callback(cb_cnt_slant, 0); cnt_slant->tooltip(_("Slant correction")); btnfsqRxSave = new Fl_Button(226, fsqpicRxWin->h() - 26, 45, 24, _("Save")); btnfsqRxSave->callback(cb_btnfsqRxSave, 0); btnfsqRxClose = new Fl_Button(273, fsqpicRxWin->h() - 26, 45, 24, _("Close")); btnfsqRxClose->callback(cb_btnfsqRxClose, 0); buttons->end(); fsqpicRxWin->end(); fsqpicRxWin->resizable(fsqpicRx); numpixels = 0; } void fsq_showRxViewer(int W, int H, char itype) { if (!fsqpicRxWin) fsq_createRxViewer(); int winW, winH; int fsqpicX, fsqpicY; winW = W < 320 ? 324 : W + 4; winH = H < 240 ? 274 : H + 34; fsqpicX = (winW - W) / 2; fsqpicY = (winH - 30 - H) / 2; fsqpicRxWin->size(winW, winH); fsqpicRx->resize(fsqpicX, fsqpicY, W, H); fsqpicRxWin->init_sizes(); fsqpicRx->clear(); fsqpicRxWin->show(); fsq_disableshift(); memset(rawvideo, 0, RAWSIZE); numpixels = 0; pixelptr = 0; rawrow = rawrgb = rawcol = 0; image_type = itype; } void fsq_clear_rximage() { fsqpicRx->clear(); fsq_disableshift(); translate = 0; enabled = false; numpixels = 0; pixelptr = 0; cnt_phase->value(0); cnt_slant->value(0); rawrow = rawrgb = rawcol = 0; } //------------------------------------------------------------------------------ // image transmit functions //------------------------------------------------------------------------------ int fsq_load_image(const char *n, int W, int H) { int D = 0; unsigned char *img_data; switch (selfsqpicSize->value()) { case 0 : W = 160; H = 120; break; case 1 : W = 320; H = 240; break; case 2 : W = 640; H = 480; break; case 3 : W = 640; H = 480; break; case 4 : W = 240; H = 300; break; case 5 : W = 240; H = 300; break; case 6 : W = 120; H = 150; break; case 7 : W = 120; H = 150; break; } if (fsqTxImg) { fsqTxImg->release(); fsqTxImg = 0; } fsqTxImg = Fl_Shared_Image::get(n, W, H); if (!fsqTxImg) return 0; if (fsqTxImg->count() > 1) { fsqTxImg->release(); fsqTxImg = 0; return 0; } fsqpicTx->hide(); fsqpicTx->clear(); img_data = (unsigned char *)fsqTxImg->data()[0]; D = fsqTxImg->d(); if (fsqxmtimg) delete [] fsqxmtimg; fsqxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(fsqxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; fsqxmtimg[j] = img_data[k]; fsqxmtimg[j+1] = img_data[k+1]; fsqxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; fsqxmtimg[j] = fsqxmtimg[j+1] = fsqxmtimg[j+2] = img_data[i]; } } else return 0; // fsq_showTxViewer(W, H); char* label = strdup(n); fsqpicTxWin->copy_label(basename(label)); free(label); // load the fsqpicture widget with the rgb image fsqpicTx->show(); fsqpicTxWin->redraw(); fsqpicTx->video(fsqxmtimg, W * H * 3); btnfsqpicTransmit->activate(); return 1; } void fsq_updateTxPic(unsigned char data, int pos) { if (!fsqpicTxWin->shown()) fsqpicTx->show(); fsqpicTx->pixel(data, pos); } void cb_fsqpicTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); if (!fn) return; if (!*fn) return; fsq_load_image(fn); } void fsq_clear_tximage() { fsqpicTx->clear(); } void cb_fsqpicTxClose( Fl_Widget *w, void *) { fsqpicTxWin->hide(); } int fsqpic_TxGetPixel(int pos, int color) { return fsqxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} } void cb_fsqpicTransmit( Fl_Widget *w, void *) { std::string image_txt; image_txt.assign(fsq_selected_call.c_str()); switch (selfsqpicSize->value()) { case 0: image_txt.append("% S"); break; case 1: image_txt.append("% L"); break; case 2: image_txt.append("% F"); break; case 3: image_txt.append("% V"); break; case 4: image_txt.append("% P"); break; case 5: image_txt.append("% p"); break; case 6: image_txt.append("% M"); break; case 7: image_txt.append("% m"); break; } active_modem->fsq_send_image(image_txt); } void cb_fsqpicTxSendAbort( Fl_Widget *w, void *) { } void cb_selfsqpicSize( Fl_Widget *w, void *) { switch (selfsqpicSize->value()) { case 0 : fsq_showTxViewer('S'); break; case 1 : fsq_showTxViewer('L'); break; case 2 : fsq_showTxViewer('F'); break; case 3 : fsq_showTxViewer('V'); break; case 4 : fsq_showTxViewer('P'); break; case 5 : fsq_showTxViewer('p'); break; case 6 : fsq_showTxViewer('M'); break; case 7 : fsq_showTxViewer('m'); break; } } void fsq_createTxViewer() { fsqpicTxWin = new Fl_Double_Window(324, 270, _("Send image")); fsqpicTxWin->xclass(PACKAGE_NAME); fsqpicTxWin->begin(); fsqpicTx = new picture (2, 2, 320, 240); fsqpicTx->noslant(); fsqpicTx->hide(); selfsqpicSize = new Fl_Choice(5, 244, 110, 24); selfsqpicSize->add("160x120 clr"); // case 0 selfsqpicSize->add("320x240 clr"); // case 1 selfsqpicSize->add("640x480 gry"); // case 2 selfsqpicSize->add("640x480 clr"); // case 3 selfsqpicSize->add("240x300 clr"); // case 4 selfsqpicSize->add("240x300 gry"); // case 5 selfsqpicSize->add("120x150 clr"); // case 6 selfsqpicSize->add("120x150 gry"); // case 7 selfsqpicSize->value(1); selfsqpicSize->callback(cb_selfsqpicSize, 0); btnfsqpicTxLoad = new Fl_Button(120, 244, 60, 24, _("Load")); btnfsqpicTxLoad->callback(cb_fsqpicTxLoad, 0); btnfsqpicTransmit = new Fl_Button(fsqpicTxWin->w() - 130, 244, 60, 24, "Xmt"); btnfsqpicTransmit->callback(cb_fsqpicTransmit, 0); btnfsqpicTxSendAbort = new Fl_Button(fsqpicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); btnfsqpicTxSendAbort->callback(cb_fsqpicTxSendAbort, 0); btnfsqpicTxClose = new Fl_Button(fsqpicTxWin->w() - 65, 244, 60, 24, _("Close")); btnfsqpicTxClose->callback(cb_fsqpicTxClose, 0); btnfsqpicTxSendAbort->hide(); btnfsqpicTransmit->deactivate(); fsqpicTxWin->end(); } void fsq_showTxViewer(char c) { if (!fsqpicTxWin) fsq_createTxViewer(); int winW = 644, winH = 512, W = 480, H = 320; int fsqpicX, fsqpicY; fsqpicTx->clear(); switch (c) { case 'S' : case 's' : W = 160; H = 120; winW = 324; winH = 154; selfsqpicSize->value(0); break; case 'L' : case 'l' : W = 320; H = 240; winW = 324; winH = 274; selfsqpicSize->value(1); break; case 'F' : W = 640; H = 480; winW = 644; winH = 514; selfsqpicSize->value(2); break; case 'V' : W = 640; H = 480; winW = 644; winH = 514; selfsqpicSize->value(3); break; case 'P' : W = 240; H = 300; winW = 324; winH = 334; selfsqpicSize->value(4); break; case 'p' : W = 240; H = 300; winW = 324; winH = 334; selfsqpicSize->value(5); break; case 'M' : W = 120; H = 150; winW = 324; winH = 184; selfsqpicSize->value(6); break; case 'm' : W = 120; H = 150; winW = 324; winH = 184; selfsqpicSize->value(7); } fsqpicTxWin->size(winW, winH); fsqpicX = (winW - W) / 2; fsqpicY = (winH - 26 - H) / 2; fsqpicTx->resize(fsqpicX, fsqpicY, W, H); selfsqpicSize->resize(5, winH - 26, 110, 24); btnfsqpicTxLoad->resize(120, winH - 26, 60, 24); btnfsqpicTransmit->resize(winW - 130, winH - 26, 60, 24); btnfsqpicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); btnfsqpicTxClose->resize(winW -65, winH - 26, 60, 24); selfsqpicSize->show(); btnfsqpicTransmit->show(); btnfsqpicTxLoad->show(); btnfsqpicTxClose->show(); btnfsqpicTxSendAbort->hide(); fsqpicTxWin->show(); } void fsq_deleteTxViewer() { fsqpicTxWin->hide(); if (fsqpicTx) delete fsqpicTx; delete [] fsqxmtimg; fsqxmtimg = 0; delete [] fsqxmtpicbuff; fsqxmtpicbuff = 0; delete fsqpicTxWin; fsqpicTxWin = 0; } void fsq_deleteRxViewer() { fsqpicRxWin->hide(); if (fsqpicRx) { delete fsqpicRx; fsqpicRx = 0; } delete fsqpicRxWin; fsqpicRxWin = 0; } int fsq_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } fldigi-4.1.06/src/fsq/fsq_varicode.cxx0000644000175000017500000002220213472116000014522 00000000000000int fsq_varicode[][2] = { { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {27,31}, { 0, 0}, {28, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {11,30}, {12,30}, {13,30}, {14,30}, {15,30}, {16,30}, {17,30}, {18,30}, {19,30}, {20,30}, {21,30}, {27,29}, {22,30}, {27, 0}, {23,30}, {10,30}, { 1,30}, { 2,30}, { 3,30}, { 4,30}, { 5,30}, { 6,30}, { 7,30}, { 8,30}, { 9,30}, {24,30}, {25,30}, {26,30}, { 0,31}, {27,30}, {28,29}, { 0,29}, { 1,29}, { 2,29}, { 3,29}, { 4,29}, { 5,29}, { 6,29}, { 7,29},// ' ' - 7 { 8,29}, { 9,29}, {10,29}, {11,29}, {12,29}, {13,29}, {14,29}, {15,29},// 8, 9, 0 {16,29}, {17,29}, {18,29}, {19,29}, {20,29}, {21,29}, {22,29}, {23,29}, // ... : {24,29}, {25,29}, {26,29}, { 1,31}, { 2,31}, { 3,31}, { 4,31}, { 5,31}, { 9,31}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 0}, { 5, 0}, { 6, 0}, { 7, 0},// @ - g { 8, 0}, { 9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0},// h - o {16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0},// p - w {24, 0}, {25, 0}, {26, 0}, { 6,31}, { 7,31}, { 8,31}, { 0,30}, {28,31},// x - 127 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//135 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//143 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//151 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//159 { 0, 0}, { 0, 0}, { 0, 0}, {14,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//167 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//175 {12,31}, {10,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//183 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//191 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//199 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//207 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {13,31},//215 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//223 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//231 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//239 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {11,31},//247 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} //255 }; /* * The same in a format more suitable for decoding. * The index is the varicode symbol, being 1-2 nibbles. The value is the * ASCII character. * NB. Do NOT use CR as a line feed, as you will get an extra space and the * new line will be indented. Use LF = ascii 10 instead. */ // decode [ prev * 32 + curr] ; 0 < prev < 29; curr == 29, 30, 31 int wsq_varidecode[] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, 46, 10, 64,126, 61, // 0 - 31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 49, 91, // 32 - 63 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 50, 92, // 2 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 51, 93, // 3 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 52, 94, // 4 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 53, 95, // 5 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 54,123, // 6 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, 55,124, // 7 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, 56,125, // 8 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, 57, 96, // 9 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 48,177, // 10 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, 33,247, // 11 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, 34,176, // 12 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, 35,215, // 13 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, 36,163, // 14 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 79, 37, -1, // 15 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, 38, -1, // 16 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 39, -1, // 17 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, 40, -1, // 18 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, 41, -1, // 19 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 42, -1, // 20 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, 43, -1, // 21 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, 45, -1, // 22 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 47, -1, // 23 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, 58, -1, // 24 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, 59, -1, // 25 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 60, -1, // 26 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 62, 8, // 27 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, 0,127, // 28 }; const char *fsq_ascii[256] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "£", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "°", "±", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "×", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "÷", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; fldigi-4.1.06/src/fsq/fsq.cxx0000664000175000017500000012710613507402064012670 00000000000000// ---------------------------------------------------------------------------- // fsq.cxx -- fsq modem // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "progress.h" #include "fsq.h" #include "complex.h" #include "fl_digi.h" #include "misc.h" #include "fileselect.h" #include "threads.h" #include "debug.h" #include "re.h" #include "configuration.h" #include "qrunner.h" #include "fl_digi.h" #include "status.h" #include "main.h" #include "icons.h" #include "ascii.h" #include "timeops.h" #include "flmisc.h" #include "test_signal.h" using namespace std; #include "fsq_varicode.cxx" void clear_xmt_arrays(); #define SQLFILT_SIZE 64 #define NIT std::string::npos #define txcenterfreq 1500.0 int fsq::symlen = 4096; // nominal symbol length; 3 baud static const char *FSQBOL = " \n"; static const char *FSQEOL = "\n "; static const char *FSQEOT = " \b "; static const char *fsq_lf = "\n"; static const char *fsq_bot = ""; static const char *fsq_eol = ""; static const char *fsq_eot = ""; static std::string fsq_string; static std::string fsq_delayed_string; static bool enable_audit_log = false; static bool enable_heard_log = false; #include "fsq-pic.cxx" static notify_dialog *alert_window = 0; void post_alert(std::string s1, double timeout = 0.0, std::string s2 = "") { if (active_modem && (active_modem->get_mode() == MODE_FSQ) && !s2.empty()) { active_modem->send_ack(s2); } if (!alert_window) alert_window = new notify_dialog; alert_window->notify(s1.c_str(), timeout); REQ(show_notifier, alert_window); display_fsq_mon_text(s1, FTextBase::ALTR); } // nibbles table used for fast conversion from tone difference to symbol static std::string sz2utf8(std::string s) { char dest[4*s.length() + 1]; // if every char were utf8 int numbytes = fl_utf8froma(dest, sizeof(dest) - 1, s.c_str(), s.length()); if (numbytes > 0) return dest; return s; } //static int nibbles[199]; void fsq::init_nibbles() { int nibble = 0; for (int i = 0; i < 199; i++) { nibble = floor(0.5 + (i - 99)/3.0); // allow for wrap-around (33 tones for 32 tone differences) if (nibble < 0) nibble += 33; if (nibble > 32) nibble -= 33; // adjust for +1 symbol at the transmitter nibble--; nibbles[i] = nibble; } } // note: // display_fsq_rx_text and // display_fsq_mon_text // use a REQ(...) access to the UI // it is not necessary to indirectly call either write_rx_mon_char or // write_mon_tx_char using the REQ access mechanism void write_rx_mon_char(int ch) { int ach = ch & 0xFF; if (!progdefaults.fsq_directed) { display_fsq_rx_text(fsq_ascii[ach], FTextBase::FSQ_UND) ; if (ach == '\n') display_fsq_rx_text(fsq_lf, FTextBase::FSQ_UND); } display_fsq_mon_text(fsq_ascii[ach], FTextBase::RECV); if (ach == '\n') display_fsq_mon_text(fsq_lf, FTextBase::RECV); } void write_mon_tx_char(int ch) { int ach = ch & 0xFF; display_fsq_mon_text(fsq_ascii[ach], FTextBase::FSQ_TX); if (ach == '\n') display_fsq_mon_text(fsq_lf, FTextBase::FSQ_TX); } void printit(double speed, int bandwidth, int symlen, int bksize, int peak_hits, int tone) { std::ostringstream it; it << "\nSpeed.......... " << speed << "\nBandwidth...... " << bandwidth; it << "\nSymbol length.. " << symlen << "\nBlock size..... " << bksize; it << "\nMinimum Hits... " << peak_hits << "\nBasetone....... " << tone << "\n"; display_fsq_mon_text(it.str(), FTextBase::ALTR); } fsq::fsq(trx_mode md) : modem() { modem::set_freq(1500); // default Rx/Tx center frequency mode = md; samplerate = SR; fft = new g_fft(FFTSIZE); snfilt = new Cmovavg(SQLFILT_SIZE); noisefilt = new Cmovavg(32); sigfilt = new Cmovavg(8); // baudfilt = new Cmovavg(3); movavg_size = progdefaults.fsq_movavg; if (movavg_size < 1) movavg_size = progdefaults.fsq_movavg = 1; if (movavg_size > MOVAVGLIMIT) movavg_size = progdefaults.fsq_movavg = MOVAVGLIMIT; for (int i = 0; i < NUMBINS; i++) binfilt[i] = new Cmovavg(movavg_size); spacing = 3; txphase = 0; basetone = 333; picfilter = new C_FIR_filter(); picfilter->init_lowpass(257, 1, 500.0 / samplerate); phase = 0; phidiff = 2.0 * M_PI * frequency / samplerate; prevz = cmplx(0,0); bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; ch_sqlch_open = false; memset(rx_stream, 0, sizeof(rx_stream)); rx_text.clear(); for (int i = 0; i < BLOCK_SIZE; i++) a_blackman[i] = blackman(1.0 * i / BLOCK_SIZE); fsq_tx_image = false; init_nibbles(); sounder_interval = progdefaults.fsq_sounder; start_sounder(sounder_interval); start_aging(); show_mode(); restart(); toggle_logs(); } fsq::~fsq() { delete fft; delete snfilt; delete sigfilt; delete noisefilt; for (int i = 0; i < NUMBINS; i++) delete binfilt[i]; // delete baudfilt; delete picfilter; REQ(close_fsqMonitor); stop_sounder(); stop_aging(); if (enable_audit_log) audit_log.close(); if (enable_heard_log) heard_log.close(); }; void fsq::tx_init() { tone = prevtone = 0; txphase = 0; send_bot = true; mycall = progdefaults.myCall; if (progdefaults.fsq_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); videoText(); } void fsq::rx_init() { set_freq(frequency); bandwidth = 33 * spacing * samplerate / FSQ_SYMLEN; bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; ch_sqlch_open = false; memset(rx_stream, 0, sizeof(rx_stream)); rx_text.clear(); for (int i = 0; i < NUMBINS; i++) { tones[i] = 0.0; binfilt[i]->reset(); } pixel = 0; amplitude = 0; phase = 0; prevz = cmplx(0,0); image_counter = 0; RXspp = 10; // 10 samples per pixel state = TEXT; } void fsq::init() { modem::init(); rx_init(); } void fsq::set_freq(double f) { frequency = f; modem::set_freq(frequency); basetone = ceil(1.0*(frequency - bandwidth / 2) * FSQ_SYMLEN / samplerate); tx_basetone = ceil((get_txfreq() - bandwidth / 2) * FSQ_SYMLEN / samplerate ); int incr = basetone % spacing; basetone -= incr; tx_basetone -= incr; } void fsq::show_mode() { if (speed == 1.5 ) put_MODEstatus("FSQ-1.5"); else if (speed == 2.0) put_MODEstatus("FSQ-2"); else if (speed == 3.0) put_MODEstatus("FSQ-3"); else if (speed == 4.5) put_MODEstatus("FSQ-4.5"); else put_MODEstatus("FSQ-6"); } void fsq::adjust_for_speed() { speed = progdefaults.fsqbaud; if( speed == 1.5 ) { symlen = 8192; } else if (speed == 2.0) { symlen = 6144; } else if (speed == 3.0) { symlen = 4096; } else if (speed == 4.5) { symlen = 3072; } else { // speed == 6 symlen = 2048; } show_mode(); } void fsq::toggle_logs() { if (enable_heard_log != progdefaults.fsq_enable_heard_log) { enable_heard_log = progdefaults.fsq_enable_heard_log; if (heard_log.is_open()) heard_log.close(); } if (enable_audit_log != progdefaults.fsq_enable_audit_log) { enable_audit_log = progdefaults.fsq_enable_audit_log; if (audit_log.is_open()) audit_log.close(); } if (enable_heard_log) { heard_log_fname = progdefaults.fsq_heard_log; std::string sheard = TempDir; sheard.append(heard_log_fname); heard_log.open(sheard.c_str(), ios::app); heard_log << "==================================================\n"; heard_log << "Heard log: " << zdate() << ", " << ztime() << "\n"; heard_log << "==================================================\n"; } if (enable_audit_log) { audit_log_fname = progdefaults.fsq_audit_log; std::string saudit = TempDir; saudit.append(audit_log_fname); audit_log.close(); audit_log.open(saudit.c_str(), ios::app); audit_log << "==================================================\n"; audit_log << "Audit log: " << zdate() << ", " << ztime() << "\n"; audit_log << "==================================================\n"; } } void fsq::restart() { set_freq(frequency); peak_hits = progdefaults.fsqhits; adjust_for_speed(); mycall = progdefaults.myCall; if (progdefaults.fsq_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); movavg_size = progdefaults.fsq_movavg; if (movavg_size < 1) movavg_size = progdefaults.fsq_movavg = 1; if (movavg_size > MOVAVGLIMIT) movavg_size = progdefaults.fsq_movavg = MOVAVGLIMIT; for (int i = 0; i < NUMBINS; i++) binfilt[i]->setLength(movavg_size); printit(speed, bandwidth, symlen, SHIFT_SIZE, peak_hits, basetone); } bool fsq::valid_char(int ch) { if ( ch == 10 || ch == 163 || ch == 176 || ch == 177 || ch == 215 || ch == 247 || (ch > 31 && ch < 128)) return true; return false; } //===================================================================== // receive processing //===================================================================== bool fsq::fsq_squelch_open() { return ch_sqlch_open || metric >= progStatus.sldrSquelchValue; } static string triggers = " !#$%&'()*+,-.;<=>?@[\\]^_{|}~"; static string allcall = "allcall"; static string cqcqcq = "cqcqcq"; static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); // test for valid callsign // returns: // 0 - not a callsign // 1 - mycall // 2 - allcall // 4 - cqcqcq // 8 - any other valid call int fsq::valid_callsign(std::string s) { if (s.length() < 3) return 0; if (s.length() > 20) return 0; if (s == allcall) return 2; if (s == cqcqcq) return 4; if (s == mycall) return 1; if (s.find("Heard") != string::npos) return 0; static char sz[21]; memset(sz, 0, 21); strcpy(sz, s.c_str()); bool matches = call.match(sz); return (matches ? 8 : 0); } void fsq::parse_rx_text() { char ztbuf[20]; struct timeval tv; gettimeofday(&tv, NULL); struct tm tm; time_t t_temp; t_temp=(time_t)tv.tv_sec; gmtime_r(&t_temp, &tm); strftime(ztbuf, sizeof(ztbuf), "%Y%m%d,%H%M%S", &tm); toprint.clear(); if (rx_text.empty()) return; if (rx_text.length() > 65536) { rx_text.clear(); return; } state = TEXT; size_t p = rx_text.find(':'); if (p == 0) { rx_text.erase(0,1); return; } if (p == std::string::npos || rx_text.length() < p + 2) { return; } std::string rxcrc = rx_text.substr(p+1,2); station_calling.clear(); int max = p+1; if (max > 20) max = 20; std::string substr; for (int i = 1; i < max; i++) { if (rx_text[p-i] <= ' ' || rx_text[p-i] > 'z') { rx_text.erase(0, p+1); return; } substr = rx_text.substr(p-i, i); if ((crc.sval(substr) == rxcrc) && valid_callsign(substr)) { station_calling = substr; break; } } if (station_calling == mycall) { // do not display any of own rx stream LOG_ERROR("Station calling is mycall: %s", station_calling.c_str()); rx_text.erase(0, p+3); return; } if (!station_calling.empty()) { REQ(add_to_heard_list, station_calling, szestimate); if (enable_heard_log) { std::string sheard = ztbuf; sheard.append(",").append(station_calling); sheard.append(",").append(szestimate).append("\n"); heard_log << sheard; heard_log.flush(); } } // remove station_calling, colon and checksum rx_text.erase(0, p+3); // extract all directed callsigns // look for 'allcall', 'cqcqcq' or mycall bool all = false; bool directed = false; // test next word in string size_t tr_pos = 0; char tr = rx_text[tr_pos]; size_t trigger = triggers.find(tr); // strip any leading spaces before either text or first directed callsign while (rx_text.length() > 1 && triggers.find(rx_text[0]) != std::string::npos) rx_text.erase(0,1); // find first word while ( tr_pos < rx_text.length() && ((trigger = triggers.find(rx_text[tr_pos])) == std::string::npos) ) { tr_pos++; } while (trigger != std::string::npos && tr_pos < rx_text.length()) { int word_is = valid_callsign(rx_text.substr(0, tr_pos)); if (word_is == 0) { rx_text.insert(0," "); break; // not a callsign } if (word_is == 1) { directed = true; // mycall } // test for cqcqcq and allcall else if (word_is != 8) all = true; rx_text.erase(0, tr_pos); while (rx_text.length() > 1 && (rx_text[0] == ' ' && rx_text[1] == ' ')) rx_text.erase(0,1); if (rx_text[0] != ' ') break; rx_text.erase(0, 1); tr_pos = 0; tr = rx_text[tr_pos]; trigger = triggers.find(tr); while ( tr_pos < rx_text.length() && (trigger == std::string::npos) ) { tr_pos++; tr = rx_text[tr_pos]; trigger = triggers.find(tr); } } if ( (all == false) && (directed == false)) { rx_text.clear(); return; } // remove eot if present if (rx_text.length() > 3) rx_text.erase(rx_text.length() - 3); toprint.assign(station_calling).append(":"); // test for trigger tr = rx_text[0]; trigger = triggers.find(tr); if (trigger == NIT) { tr = ' '; // force to be text line rx_text.insert(0, " "); } // if asleep suppress all but the * trigger if (btn_SELCAL->value() == 0) { if (tr == '*') parse_star(); rx_text.clear(); return; } // now process own call triggers if (directed) { switch (tr) { case ' ': parse_space(false); break; case '?': parse_qmark(); break; case '*': parse_star(); break; case '+': parse_plus(); break; case '-': break;//parse_minus(); break; case ';': parse_relay(); break; case '!': parse_repeat(); break; case '~': parse_delayed_repeat(); break; case '#': parse_pound(); break; case '$': parse_dollar(); break; case '@': parse_at(); break; case '&': parse_amp(); break; case '^': parse_carat(); break; case '%': parse_pcnt(); break; case '|': parse_vline(); break; case '>': parse_greater(); break; case '<': parse_less(); break; case '[': parse_relayed(); break; } } // if allcall; only respond to the ' ', '*', '#', '%', and '[' triggers else { switch (tr) { case ' ': parse_space(true); break; case '*': parse_star(); break; case '#': parse_pound(); break; case '%': parse_pcnt(); break; case '[': parse_relayed(); break; } } rx_text.clear(); } void fsq::parse_space(bool all) { display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_qmark(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" snr=").append(szestimate); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_dollar(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" Heard:\n"); response.append(heard_list()); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_star() { REQ(enableSELCAL); reply(std::string(station_calling).append(" ack")); } // immediate repeat of msg void fsq::parse_repeat() { std::string response; rx_text.erase(0, 1); if (rx_text[0] != ' ') rx_text.insert(0, " "); response.assign(" "); response.append(rx_text); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } // delayed repeat of msg void fsq::parse_delayed_repeat() { std::string response; rx_text.erase(0, 1); if (rx_text[0] != ' ') rx_text.insert(0, " "); response.assign(" "); response.append(rx_text); delayed_reply(response, 15); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } // extended relay of msg // k2a sees : k1a:; k3a hi // k2a sends: k2a:22k3a[k1a] hi void fsq::parse_relay() { std::string send_txt = rx_text; send_txt.erase(0,1); // remove ';' if (send_txt.empty()) return; while (send_txt[0] == ' ' && !send_txt.empty()) send_txt.erase(0,1); // remove leading spaces // find trigger size_t p = 0; while ((triggers.find(send_txt[p]) == NIT) && p < send_txt.length()) p++; std::string response = string("[").append(station_calling).append("]"); send_txt.insert(p, response); if ((p = send_txt.find('^')) != NIT) send_txt.insert(p, "^"); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); reply(send_txt); } // k3a sees : k2a: [k1a]@ // or : k2a:[k1a]@ void fsq::parse_relayed() { std::string relayed = ""; size_t p1 = rx_text.find('['); if (p1 == NIT) { LOG_ERROR("%s", "missing open bracket"); return; } rx_text.erase(0,p1 + 1); if (rx_text.empty()) return; size_t p2 = rx_text.find(']'); if (p2 == NIT) { LOG_ERROR("%s", "missing end bracket"); return; } relayed = rx_text.substr(0, p2); rx_text.erase(0, p2 + 1); if (rx_text.empty()) return; if (triggers.find(rx_text[0]) == NIT) { LOG_ERROR("%s", "invalid relay trigger"); return; } // execute trigger switch (rx_text[0]) { case ' ' : { std::string response = station_calling; response.append(";").append(relayed).append(rx_text); display_fsq_rx_text(toprint.append(response).append("\n"), FTextBase::FSQ_DIR); } break; case '$' : parse_dollar(relayed); break; case '&' : parse_amp(relayed); break; case '?' : parse_qmark(relayed); break; case '@' : parse_at(relayed); break; case '^' : parse_carat(relayed); break; case '|' : parse_vline(relayed); break; case '#' : parse_pound(relayed); break; case '<' : parse_less(relayed); break; case '>' : parse_greater(relayed); break; default : break; } } // rx_text[0] will be '#' void fsq::parse_pound(std::string relay) { size_t p1 = NIT, p2 = NIT; std::string fname = ""; p1 = rx_text.find('['); if (p1 != NIT) { p2 = rx_text.find(']', p1); if (p2 != NIT) { fname = rx_text.substr(p1 + 1, p2 - p1 - 1); fname = fl_filename_name(fname.c_str()); } else p2 = 0; } else p2 = 0; if (fname.empty()) { if (!relay.empty()) fname = relay; else fname = station_calling; fname.append(".txt"); } if (fname.find(".txt") == std::string::npos) fname.append(".txt"); if (rx_text[rx_text.length() -1] != '\n') rx_text.append("\n"); size_t p3 = NIT; while( (p3 = fname.find("/")) != NIT) fname[p3] = '.'; while( (p3 = fname.find("\\")) != NIT) fname[p3] = '.'; std::ofstream rxfile; fname.insert(0, TempDir); if (progdefaults.always_append) { rxfile.open(fname.c_str(), ios::app); } else { rxfile.open(fname.c_str(), ios::out); } if (!rxfile) return; if (progdefaults.add_fsq_msg_dt) { rxfile << "Received: " << zdate() << ", " << ztime() << "\n"; rxfile << rx_text.substr(p2+1) << "\n"; } else rxfile << rx_text.substr(p2+1); rxfile.close(); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ack"); reply(response); } void fsq::parse_plus(std::string relay) { size_t p1 = NIT, p2 = NIT; std::string fname = ""; p1 = rx_text.find('['); if (p1 != NIT) { p2 = rx_text.find(']', p1); if (p2 != NIT) { fname = rx_text.substr(p1 + 1, p2 - p1 - 1); fname = fl_filename_name(fname.c_str()); } else p2 = 0; } if (fname.empty()) { if (!relay.empty()) fname = relay; else fname = station_calling; fname.append(".txt"); } std::ifstream txfile; bool append = (fname == station_calling); std::string pathname = TempDir; if (append) { pathname.append(fname).append(".txt"); txfile.open(pathname.c_str()); } else { pathname.append(fname); txfile.open(pathname.c_str()); } if (!txfile) { reply(std::string(station_calling).append(" not found")); return; } stringstream outtext(station_calling); outtext << " [" << fname << "]\n"; char ch = txfile.get(); while (!txfile.eof()) { outtext << ch; ch = txfile.get(); } txfile.close(); std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(outtext.str()); reply(response); } void fsq::parse_minus() { display_fsq_rx_text(toprint.append(rx_text).append(" nia\n"), FTextBase::FSQ_DIR); reply(std::string(station_calling).append(" not supported")); } void fsq::parse_at(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ").append(progdefaults.myQth); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_amp(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ").append(progdefaults.fsqQTCtext); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_carat(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" fldigi ").append(PACKAGE_VERSION); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_pcnt() { switch (rx_text[2]) { case 'L' : image_mode = 0; picW = 320; picH = 240; break; case 'S' : image_mode = 1; picW = 160; picH = 120; break; case 'F' : image_mode = 2; picW = 640; picH = 480; break; case 'V' : image_mode = 3; picW = 640; picH = 480; break; case 'P' : image_mode = 4; picW = 240; picH = 300; break; case 'p' : image_mode = 5; picW = 240; picH = 300; break; case 'M' : image_mode = 6; picW = 120; picH = 150; break; case 'm' : image_mode = 7; picW = 120; picH = 150; break; } REQ( fsq_showRxViewer, picW, picH, rx_text[2] ); image_counter = 0; picf = 0; row = col = rgb = 0; state = IMAGE; display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_vline(std::string relay) { display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); std::string alert = "Message received from "; if (relay.empty()) alert.append(station_calling); else alert.append(relay); alert.append("\n").append("at: ").append(zshowtime()).append("\n"); alert.append(rx_text.substr(1)); REQ(post_alert, alert, progdefaults.fsq_notify_time_out, relay); } void fsq::send_ack(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ack"); reply(response); } void fsq::parse_greater(std::string relay) { std::string response; response.assign(station_calling); if (!relay.empty()) response.append(";").append(relay); double spd = progdefaults.fsqbaud; if (spd == 1.5 ) { spd = 2.0; response.append(" 2.0 baud"); } else if (spd == 2.0) { spd = 3.0; response.append(" 3.0 baud"); } else if (spd == 3.0) { spd = 4.5; response.append(" 4.5 baud"); } else if (spd == 4.5) { spd = 6.0; response.append(" 6.0 baud"); } else if (spd == 6.0) { response.append(" 6.0 baud"); } progdefaults.fsqbaud = spd; adjust_for_speed(); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_less(std::string relay) { std::string response; response.assign(station_calling); if (!relay.empty()) response.append(";").append(relay); double spd = progdefaults.fsqbaud; if (spd == 2.0) { spd = 1.5; response.append(" 1.5 baud"); } else if (spd == 3.0) { spd = 2.0; response.append(" 2.0 baud"); } else if (spd == 4.5) { spd = 3.0; response.append(" 3.0 baud"); } else if (spd == 6.0) { spd = 4.5; response.append(" 4.5 baud"); } progdefaults.fsqbaud = spd; adjust_for_speed(); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::lf_check(int ch) { static char lfpair[3] = "01"; static char bstrng[4] = "012"; lfpair[0] = lfpair[1]; lfpair[1] = 0xFF & ch; bstrng[0] = bstrng[1]; bstrng[1] = bstrng[2]; bstrng[2] = 0xFF & ch; b_bot = b_eol = b_eot = false; if (bstrng[0] == FSQEOT[0] // find SP SP BS SP && bstrng[1] == FSQEOT[1] && bstrng[2] == FSQEOT[2] ) { b_eot = true; } else if (lfpair[0] == FSQBOL[0] && lfpair[1] == FSQBOL[1]) { b_bot = true; } else if (lfpair[0] == FSQEOL[0] && lfpair[1] == FSQEOL[1]) { b_eol = true; } } void fsq::process_symbol(int sym) { int nibble = 0; int curr_ch = -1; symbol = sym; nibble = symbol - prev_symbol; if (nibble < -99 || nibble > 99) { prev_symbol = symbol; return; } nibble = nibbles[nibble + 99]; // -1 is our idle symbol, indicating we already have our symbol if (nibble >= 0) { // process nibble curr_nibble = nibble; // single-nibble characters if ((prev_nibble < 29) & (curr_nibble < 29)) { curr_ch = wsq_varidecode[prev_nibble]; // double-nibble characters } else if ( (prev_nibble < 29) && (curr_nibble > 28) && (curr_nibble < 32)) { curr_ch = wsq_varidecode[prev_nibble * 32 + curr_nibble]; } if (curr_ch > 0) { if (enable_audit_log) { audit_log << fsq_ascii[curr_ch];// & 0xFF]; if (curr_ch == '\n') audit_log << '\n'; audit_log.flush(); } lf_check(curr_ch); if (b_bot) { ch_sqlch_open = true; rx_text.clear(); } if (fsq_squelch_open()) { write_rx_mon_char(curr_ch); if (b_bot) { char ztbuf[20]; struct timeval tv; gettimeofday(&tv,NULL); struct tm tm; time_t t_temp; t_temp=(time_t)tv.tv_sec; gmtime_r(&t_temp, &tm); strftime(ztbuf,sizeof(ztbuf),"%m/%d %H:%M:%S ",&tm); display_fsq_mon_text( ztbuf, FTextBase::CTRL); display_fsq_mon_text( fsq_bot, FTextBase::CTRL); } if (b_eol) { display_fsq_mon_text( fsq_eol, FTextBase::CTRL); noisefilt->reset(); noisefilt->run(1); sigfilt->reset(); sigfilt->run(1); snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); } if (b_eot) { snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); noisefilt->reset(); noisefilt->run(1); sigfilt->reset(); sigfilt->run(1); display_fsq_mon_text( fsq_eot, FTextBase::CTRL); } } if ( valid_char(curr_ch) || b_eol || b_eot ) { if (rx_text.length() > 32768) rx_text.clear(); if ( fsq_squelch_open() || !progStatus.sqlonoff ) { rx_text += curr_ch; if (b_eot) { parse_rx_text(); if (state == TEXT) ch_sqlch_open = false; } } } if (fsq_squelch_open() && (b_eot || b_eol)) { ch_sqlch_open = false; } } prev_nibble = curr_nibble; } prev_symbol = symbol; } // find the maximum bin // 908 Hz and 1351 Hz respectively for original center frequency of 1145 Hz // 1280 to 1720 for a 1500 Hz center frequency void fsq::process_tones() { max = 0; peak = NUMBINS / 2; // examine FFT bin contents over bandwidth +/- ~ 50 Hz int firstbin = frequency * FSQ_SYMLEN / samplerate - NUMBINS / 2; double sigval = 0; double min = 3.0e8; int minbin = NUMBINS / 2; for (int i = 0; i < NUMBINS; ++i) { val = norm(fft_data[i + firstbin]); // looking for maximum signal tones[i] = binfilt[i]->run(val); if (tones[i] > max) { max = tones[i]; peak = i; } // looking for minimum signal in a 3 bin sequence if (tones[i] < min) { min = tones[i]; minbin = i; } } sigval = tones[(peak-1) < 0 ? (NUMBINS - 1) : (peak - 1)] + tones[peak] + tones[(peak+1) == NUMBINS ? 0 : (peak + 1)]; min = tones[(minbin-1) < 0 ? (NUMBINS - 1) : (minbin - 1)] + tones[minbin] + tones[(minbin+1) == NUMBINS ? 0 : (minbin + 1)]; if (min == 0) min = 1e-10; s2n = 10 * log10( snfilt->run(sigval/min)) - 34.0 + movavg_size / 4; if (s2n <= 0) metric = 2 * (25 + s2n); if (s2n > 0) metric = 50 * ( 1 + s2n / 45); metric = clamp(metric, 0, 100); display_metric(metric); if (metric < progStatus.sldrSquelchValue && ch_sqlch_open) ch_sqlch_open = false; // requires consecutive hits if (peak == prev_peak) { peak_counter++; } else { peak_counter = 0; } if ((peak_counter >= peak_hits) && (peak != last_peak) && (fsq_squelch_open() || !progStatus.sqlonoff)) { process_symbol(peak); peak_counter = 0; last_peak = peak; } prev_peak = peak; } void fsq::recvpic(double smpl) { phase -= phidiff; if (phase < 0) phase += 2.0 * M_PI; cmplx z = smpl * cmplx( cos(phase), sin(phase ) ); picfilter->run( z, currz); pixel += arg(conj(prevz) * currz);// * samplerate / TWOPI; amplitude += norm(currz); prevz = currz; if (image_counter <= -RXspp) { pixel = 0; amplitude = 0; image_counter++; return; } if ((image_counter++ % RXspp) == 0) { amplitude /= RXspp; pixel /= RXspp; pixel *= (samplerate / TWOPI); byte = pixel / 1.5 + 128; byte = (int)CLAMP( byte, 0.0, 255.0); // FSQCAL sends blue-green-red static int RGB[] = {2, 1, 0}; if (image_mode == 2 || image_mode == 5 || image_mode == 7) { // grey scale pixelnbr = 3 * (col + row * picW); REQ(fsq_updateRxPic, byte, pixelnbr); REQ(fsq_updateRxPic, byte, pixelnbr + 1); REQ(fsq_updateRxPic, byte, pixelnbr + 2); if (++ col == picW) { col = 0; row++; if (row >= picH) { state = TEXT; REQ(fsq_enableshift); metric = 0; } } } else { pixelnbr = RGB[rgb] + 3 * (col + row * picW); REQ(fsq_updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; row ++; } } if (row >= picH) { state = TEXT; REQ(fsq_enableshift); metric = 0; } } pixel = 0; amplitude = 0; } } int fsq::rx_process(const double *buf, int len) { if (peak_hits != progdefaults.fsqhits) restart(); if (movavg_size != progdefaults.fsq_movavg) restart(); if (speed != progdefaults.fsqbaud) restart(); if (enable_heard_log != progdefaults.fsq_enable_heard_log || enable_audit_log != progdefaults.fsq_enable_audit_log) toggle_logs(); if (sounder_interval != progdefaults.fsq_sounder) { sounder_interval = progdefaults.fsq_sounder; start_sounder(sounder_interval); } if (bkptr < 0) bkptr = 0; if (bkptr >= SHIFT_SIZE) bkptr = 0; if (len > 512) { LOG_ERROR("fsq rx stream overrun %d", len); } if (progStatus.fsq_rx_abort) { state = TEXT; progStatus.fsq_rx_abort = false; REQ(fsq_clear_rximage); } while (len) { if (state == IMAGE) { recvpic(*buf); len--; buf++; } else { rx_stream[BLOCK_SIZE + bkptr] = *buf; len--; buf++; bkptr++; if (bkptr == SHIFT_SIZE) { bkptr = 0; memmove(rx_stream, // to &rx_stream[SHIFT_SIZE], // from BLOCK_SIZE*sizeof(*rx_stream)); // # bytes memset(fft_data, 0, sizeof(fft_data)); for (int i = 0; i < BLOCK_SIZE; i++) { double d = rx_stream[i] * a_blackman[i]; fft_data[i] = cmplx(d, d); } fft->ComplexFFT(fft_data); process_tones(); } } } return 0; } //===================================================================== // transmit processing //===================================================================== // implement the symbol counter using a new thread whose thread loop // time is equal to a symbol length 4096/12000 = 341 milliseconds // symbol loop decrements symbol counts and send_symbol increments them // flush_buffer will then awake for the symbol count to be zero // have not observed a remaining count > 1 so this might be an over kill! // typical awake period is 90 msec void fsq::flush_buffer() { for (int i = 0; i < 64; i++) outbuf[i] = 0; ModulateXmtr(outbuf, 64); return; } #include "confdialog.h" void fsq::send_tone(int tone) { double phaseincr; double freq; if (speed != progdefaults.fsqbaud) restart(); freq = (tx_basetone + tone * spacing) * samplerate / FSQ_SYMLEN; if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) freq += ctrl_freq_offset->value(); phaseincr = 2.0 * M_PI * freq / samplerate; prevtone = tone; int send_symlen = symlen; if (fsq_tx_image) send_symlen = 4096; // must use 3 baud symlen for image xfrs for (int i = 0; i < send_symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, send_symlen); } void fsq::send_symbol(int sym) { tone = (prevtone + sym + 1) % 33; send_tone(tone); } void fsq::send_idle() { send_symbol(28); send_symbol(30); } static bool send_eot = false; void fsq::send_char(int ch) { if (!ch) return send_idle(); int sym1 = fsq_varicode[ch][0]; int sym2 = fsq_varicode[ch][1]; send_symbol(sym1); if (sym2 > 28) send_symbol(sym2); if (valid_char(ch) && !(send_bot || send_eot)) put_echo_char(ch); write_mon_tx_char(ch); } void fsq::send_image() { int W = 640, H = 480; // grey scale transfer (FAX) bool color = true; float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; if (!fsqpicTxWin || !fsqpicTxWin->visible()) { return; } switch (selfsqpicSize->value()) { case 0 : W = 160; H = 120; break; case 1 : W = 320; H = 240; break; case 2 : W = 640; H = 480; color = false; break; case 3 : W = 640; H = 480; break; case 4 : W = 240; H = 300; break; case 5 : W = 240; H = 300; color = false; break; case 6 : W = 120; H = 150; break; case 7 : W = 120; H = 150; color = false; break; } REQ(fsq_clear_tximage); stop_deadman(); freq = frequency - 200; #define PHASE_CORR 200 phaseincr = radians * freq; for (int n = 0; n < PHASE_CORR; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, 10); if (color == false) { // grey scale image for (int row = 0; row < H; row++) { memset(outbuf, 0, 10 * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = 0.3 * fsqpic_TxGetPixel(tx_pixelnbr, 0) + // red 0.6 * fsqpic_TxGetPixel(tx_pixelnbr, 1) + // green 0.1 * fsqpic_TxGetPixel(tx_pixelnbr, 2); // blue REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); freq = frequency - 200 + tx_pixel * 1.5; phaseincr = radians * freq; for (int n = 0; n < 10; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, 10); Fl::awake(); } } } else { for (int row = 0; row < H; row++) { for (int color = 2; color >= 0; color--) { memset(outbuf, 0, 10 * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = fsqpic_TxGetPixel(tx_pixelnbr, color); REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); freq = frequency - 200 + tx_pixel * 1.5; phaseincr = radians * freq; for (int n = 0; n < 10; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, 10); } Fl::awake(); } } } start_deadman(); } void fsq::send_string(std::string s) { for (size_t n = 0; n < s.length(); n++) send_char(s[n]); if ((s == FSQEOT || s == FSQEOL) && fsq_tx_image) send_image(); } void fsq::fsq_send_image(std::string s) { fsq_tx_image = true; fsq_string = std::string("IMAGE:").append(s); write_fsq_que(fsq_string); fsq_xmt(s); } int fsq::tx_process() { modem::tx_process(); if (send_bot) { std::string send; send.assign(" ").append(FSQBOL).append(mycall).append(":"); if (progdefaults.fsq_directed) send.append(crc.sval(mycall)); send_string(send); send_bot = false; } int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || c == -1) { // end of text or empty tx buffer send_eot = true; if (progdefaults.fsq_directed) send_string(std::string(FSQEOT)); else send_string(std::string(FSQEOL)); send_eot = false; put_echo_char('\n'); if (c == -1) REQ(&FTextTX::clear, TransmitText); flush_buffer(); stopflag = false; fsq_tx_image = false; return -1; } if ( stopflag ) { // aborts transmission static std::string aborted = " !ABORTED!\n"; for (size_t n = 0; n < aborted.length(); n++) put_echo_char(aborted[n]); fsq_tx_image = false; stopflag = false; clear_xmt_arrays(); return -1; } send_char(c); return 0; } //============================================================================== // delayed transmit //============================================================================== static pthread_mutex_t fsq_tx_mutex = PTHREAD_MUTEX_INITIALIZER; static float xmt_repeat_try = 6.0; static string tx_text_queue = ""; static vector commands; #define NUMCOMMANDS 10 static size_t next = 0; void clear_xmt_arrays() { commands.erase(commands.begin(), commands.begin()); tx_text_queue.clear(); fsq_tx_text->clear(); } double fsq_xmtdelay() // in seconds { #define MIN_DELAY 50 #define MAX_DELAY 500 srand((int)clock()); double scaled = (double)rand()/RAND_MAX; double delay = ((MAX_DELAY - MIN_DELAY + 1 ) * scaled + MIN_DELAY) / 1000.0; if (delay < 0.05) delay = 0.05; if (delay > 0.5) delay = 0.5; return delay; } void fsq_repeat_last_command() { using ::next; // disambiguate from std::next if (commands.empty()) return; fsq_tx_text->clear(); fsq_tx_text->addstr(sz2utf8(commands[next].c_str())); next++; if (next == commands.size()) { next = 0; } } int get_fsq_tx_char(void) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (tx_text_queue.empty()) return (GET_TX_CHAR_NODATA); int c = tx_text_queue[0]; tx_text_queue.erase(0,1); if (c == GET_TX_CHAR_ETX) { return c; } if (c == -1) return(GET_TX_CHAR_NODATA); if (c == '^') { c = tx_text_queue[0]; tx_text_queue.erase(0,1); if (c == -1) return(GET_TX_CHAR_NODATA); switch (c) { case 'r': return(GET_TX_CHAR_ETX); break; case 'R': return(GET_TX_CHAR_ETX); break; default: ; } } start_deadman(); return(c); } void try_transmit(void *) { if (active_modem != fsq_modem) return; if (!active_modem->fsq_squelch_open() && trx_state == STATE_RX) { ::next = 0; fsq_que_clear(); //LOG_WARN("%s", "start_tx()"); start_tx(); return; } if (xmt_repeat_try > 0) { xmt_repeat_try -= 0.5; static char szwaiting[50]; snprintf(szwaiting, sizeof(szwaiting), "Waiting %4.2f", xmt_repeat_try); fsq_que_clear(); write_fsq_que(std::string(szwaiting).append("\n").append(fsq_string)); //LOG_WARN("%s", szwaiting); Fl::repeat_timeout(0.5, try_transmit); return; } else { static const char szsquelch[50] = "Squelch open. Transmit timed out!"; display_fsq_rx_text(string("\n").append(szsquelch).append("\n").c_str(), FTextBase::ALTR); tx_text_queue.clear(); fsq_que_clear(); if (active_modem->fsq_tx_image) active_modem->fsq_tx_image = false; //LOG_WARN("%s", szsquelch); return; } return; } inline void _fsq_xmt(string s) { tx_text_queue.clear(); if (commands.size() > NUMCOMMANDS) commands.pop_back(); commands.insert(commands.begin(), 1, s); s.append("^r"); tx_text_queue = s; xmt_repeat_try = progdefaults.fsq_time_out; Fl::add_timeout(0.5 + fsq_xmtdelay(), try_transmit); } void fsq_xmt_mt(void *cs = (void *)0) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (active_modem != fsq_modem) return; if (!cs) return; string s; s.assign((char *) cs); delete (char *) cs; if(!s.empty()) { _fsq_xmt(s); } } void fsq_xmt(string s) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (active_modem != fsq_modem) return; if(!s.empty()) { _fsq_xmt(s); } } void fsq_transmit(void *a = (void *)0) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (active_modem != fsq_modem) return; if (!tx_text_queue.empty()) { size_t p = tx_text_queue.find("^r"); tx_text_queue.erase(p); tx_text_queue += ' '; int nxt = fsq_tx_text->nextChar(); while (nxt != -1) { tx_text_queue += nxt; nxt = fsq_tx_text->nextChar(); } commands.erase(commands.begin(), commands.begin()); commands.insert(commands.begin(), 1, tx_text_queue); tx_text_queue.append("^r"); fsq_tx_text->clear(); return; //LOG_WARN("A: %s", tx_text_queue.c_str()); } int nxt = fsq_tx_text->nextChar(); while (nxt != -1) { tx_text_queue += nxt; nxt = fsq_tx_text->nextChar(); } if (commands.size() > NUMCOMMANDS) commands.pop_back(); commands.insert(commands.begin(), 1, tx_text_queue); tx_text_queue.append("^r"); fsq_tx_text->clear(); //LOG_WARN("B: %s", tx_text_queue.c_str()); xmt_repeat_try = progdefaults.fsq_time_out; Fl::add_timeout(0.5 + fsq_xmtdelay(), try_transmit); } void timed_xmt(void *) { //LOG_WARN("%s", fsq_delayed_string.c_str()); fsq_xmt(fsq_delayed_string); } static float secs = 0; void fsq_add_tx_timeout(void *a = 0) { Fl::add_timeout(secs, timed_xmt); } void fsq::reply(std::string s) { fsq_string = std::string("SEND: ").append(s); write_fsq_que(fsq_string); char *cs = (char *)0; cs = new char[s.size() + 1]; if(!cs) return; cs[s.size()] = 0; memcpy(cs, s.c_str(), s.size()); Fl::awake(fsq_xmt_mt, (void *) cs); } void fsq::delayed_reply(std::string s, int delay) { fsq_string = std::string("DELAYED SEND: ").append(s); write_fsq_que(fsq_string); fsq_delayed_string = s; secs = delay; Fl::awake(fsq_add_tx_timeout, 0); //LOG_WARN("%s : %d", s.c_str(), delay); } //============================================================================== // Heard list aging //============================================================================== void aging(void *who) { fsq *me = (fsq *)who; if (me != active_modem) return; age_heard_list(); Fl::repeat_timeout(60.0, aging, me); } void fsq_start_aging(void *who) { fsq *me = (fsq *)who; Fl::remove_timeout(aging); Fl::add_timeout(60.0, aging, me); } void fsq::start_aging() { Fl::awake(fsq_start_aging, this); } void fsq_stop_aging(void *) { Fl::remove_timeout(aging); } void fsq::stop_aging() { Fl::awake(fsq_stop_aging); } //============================================================================== // Sounder support //============================================================================== static int sounder_tries = 10; static double sounder_secs = 60; void sounder(void *) { if (active_modem != fsq_modem) return; if (trx_state == STATE_TX) { Fl::repeat_timeout(active_modem->fsq_xmtdelay(), timed_xmt); return; } if (active_modem->fsq_squelch_open()) { if (--sounder_tries < 0) { display_fsq_rx_text("\nSounder timed out!\n", FTextBase::ALTR); sounder_tries = 10; Fl::repeat_timeout(sounder_secs, sounder); return; } Fl::repeat_timeout(10, sounder); // retry in 10 seconds return; } sounder_tries = 10; std::string xmtstr = FSQBOL; xmtstr.append(active_modem->fsq_mycall()).append(":").append(FSQEOT); int numsymbols = xmtstr.length(); int xmtsecs = (int)(1.0 * numsymbols * (fsq::symlen / 4096.0) / SR); if (fsq_tx_text->eot()) { std::string stime = ztime(); stime.erase(4); stime.insert(2,":"); std::string sndx = "Sounded @ "; sndx.append(stime); display_fsq_rx_text(sndx, FTextBase::ALTR); fsq_xmt(" "); } Fl::repeat_timeout(sounder_secs - xmtsecs, sounder); } void fsq_start_sounder() { if (active_modem != fsq_modem) return; Fl::remove_timeout(sounder); Fl::add_timeout(sounder_secs, sounder); } void fsq_stop_sounder() { Fl::remove_timeout(sounder); } void fsq::stop_sounder() { REQ(fsq_stop_sounder); } void fsq::start_sounder(int interval) { if (interval == 0) { REQ(fsq_stop_sounder); return; } switch (interval) { case 0: return; case 1: sounder_secs = 60; break; // 1 minute case 2: sounder_secs = 600; break; // 10 minutes case 3: sounder_secs = 1800; break; // 30 minutes case 4: sounder_secs = 3600; break; // 60 minutes default: sounder_secs = 600; } REQ(fsq_start_sounder); } #include "bitmaps.cxx" fldigi-4.1.06/src/fsq/bitmaps.cxx0000644000175000017500000000566713472116000013534 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of flrig. // // flrig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include static unsigned char s2n_data[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x60, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xa0, 0x12, 0x00, 0x00, 0x46, 0x12, 0x00, 0x00, 0x4c, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0xf0, 0x12, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; Fl_Bitmap image_s2n(s2n_data, 160, 16); fldigi-4.1.06/src/fsq/fsq_monitor.cxx0000644000175000017500000001272513472116000014426 00000000000000// ---------------------------------------------------------------------------- // // Viewer.cxx -- PSK browser // // Copyright (C) 2015 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "Viewer.h" #include "trx.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "re.h" #include "gettext.h" #include "flmisc.h" #include "spot.h" #include "icons.h" #include "qrunner.h" using namespace std; // // External fsq monitor dialog // Fl_Double_Window *fsqMonitor = 0; static Fl_Button *btnCloseMonitor; FTextRX *fsq_monitor = 0; FTextRX *fsq_que = 0; static void cb_btnCloseMonitor(Fl_Button*, void*) { progStatus.fsqMONITORxpos = fsqMonitor->x(); progStatus.fsqMONITORypos = fsqMonitor->y(); progStatus.fsqMONITORwidth = fsqMonitor->w(); progStatus.fsqMONITORheight = fsqMonitor->h(); btn_MONITOR->value(0); btn_MONITOR->redraw(); fsqMonitor->hide(); } Fl_Double_Window* create_fsqMonitor(void) { Fl_Double_Window* w = new Fl_Double_Window( progStatus.fsqMONITORxpos, progStatus.fsqMONITORypos, progStatus.fsqMONITORwidth, progStatus.fsqMONITORheight, _("FSQ monitor")); Panel *monitor_panel = new Panel( 2, 2, w->w() - 4, w->h() - 28); fsq_monitor = new FTextRX( monitor_panel->x(), monitor_panel->y(), monitor_panel->w(), 7*monitor_panel->h()/8); fsq_monitor->color( fl_rgb_color( 0.98*progdefaults.RxColor.R, 0.98*progdefaults.RxColor.G, 0.98*progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); fsq_monitor->setFont(progdefaults.RxFontnbr); fsq_monitor->setFontSize(progdefaults.RxFontsize); fsq_monitor->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_que = new FTextRX( fsq_monitor->x(), fsq_monitor->y() + fsq_monitor->h(), fsq_monitor->w(), monitor_panel->h() - fsq_monitor->h()); fsq_que->color( fl_rgb_color( 0.98*progdefaults.RxColor.R, 0.98*progdefaults.RxColor.G, 0.98*progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); fsq_que->setFont(progdefaults.RxFontnbr); fsq_que->setFontSize(progdefaults.RxFontsize); fsq_que->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); Fl_Box *minbox = new Fl_Box( monitor_panel->x(), monitor_panel->y() + 66, monitor_panel->w(), monitor_panel->h() - 132); minbox->hide(); monitor_panel->resizable(minbox); monitor_panel->end(); Fl_Group *g = new Fl_Group( fsq_monitor->x(), monitor_panel->y() + monitor_panel->h() + 2, fsq_monitor->w(), 22); Fl_Group *g1 = new Fl_Group( g->x(), g->y() + 2, g->w() - 80, g->h()); g1->box(FL_FLAT_BOX); g1->end(); // close button btnCloseMonitor = new Fl_Button( g->x() + g->w() - 82, g->y(), 80, g->h(), icons::make_icon_label(_("Close"), close_icon)); btnCloseMonitor->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnCloseMonitor); btnCloseMonitor->callback((Fl_Callback*)cb_btnCloseMonitor); g->resizable(g1); g->end(); w->end(); w->callback((Fl_Callback*)cb_btnCloseMonitor); w->resizable(monitor_panel); w->size_range( 300, 200 ); w->xclass(PACKAGE_NAME); w->hide(); return w; } void open_fsqMonitor() { if (!fsqMonitor) fsqMonitor = create_fsqMonitor(); fsqMonitor->show(); fsqMonitor->redraw(); } #if (FSQDEBUG == 1) Fl_Double_Window *fsqDebug = 0; FTextRX *fsq_debug = 0; void close_fsqDebug() { if (fsqDebug) fsqDebug->hide(); } static void cb_CloseDebug(Fl_Button*, void*) { fsqDebug->hide(); } Fl_Double_Window* create_fsqDebug(void) { Fl_Double_Window* w = new Fl_Double_Window( 50, 50, 500, 300, "FSQ debug"); fsq_debug = new FTextRX( 2, 2, w->w() - 4, w->h() - 4); fsq_debug->color( FL_WHITE); fsq_debug->setFont(progdefaults.RxFontnbr); fsq_debug->setFontSize(progdefaults.RxFontsize); fsq_debug->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_debug->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); fsq_debug->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); fsq_debug->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); fsq_debug->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); w->end(); w->callback((Fl_Callback*)cb_CloseDebug); w->resizable(fsq_debug); w->size_range( 200, 200 ); w->xclass(PACKAGE_NAME); w->hide(); return w; } void open_fsqDebug() { if (!fsqDebug) fsqDebug = create_fsqDebug(); fsqDebug->show(); fsqDebug->redraw(); } void write_fsqDebug(string s, int style) { if (!fsq_debug) return; REQ(&FTextRX::addstr, fsq_debug, s, style); } #endif void fsq_que_clear() { REQ(&FTextRX::clear, fsq_que); } void write_fsq_que(std::string s) { if (!fsq_que) return; // REQ(&FTextRX::clear, fsq_que); REQ(&FTextRX::addstr, fsq_que, s, FTextBase::ALTR); } fldigi-4.1.06/src/logbook/0000775000175000017500000000000013515625030012266 500000000000000fldigi-4.1.06/src/logbook/maclogger.cxx0000644000175000017500000002627313472115777014720 00000000000000// ===================================================================== // // maclogger.cxx // // receive log data from maclogger udp broadcast message // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "maclogger.h" #include "confdialog.h" LOG_FILE_SOURCE(debug::LOG_MACLOGGER); using namespace std; //====================================================================== // Socket MACLOGGER i/o used on all platforms //====================================================================== pthread_t maclogger_thread; pthread_t maclogger_rx_socket_thread; pthread_mutex_t mclg_str_mutex = PTHREAD_MUTEX_INITIALIZER; Socket *maclogger_socket = 0; bool maclogger_enabled = false; bool maclogger_exit = false; string maclogger_ip_address= "";; string maclogger_ip_port= "";; string mclg_str = ""; int mclg_rxhz; int mclg_txhz; string mclg_band; string mclg_mode; string mclg_power; string mclg_call; string mclg_dxccnum; string mclg_dxccstr; string mclg_city; string mclg_state; string mclg_firstname; string mclg_lastname; string mclg_comment; string mclg_bearing; string mclg_longpath; string mclg_distance; //====================================================================== // MacLogger UDP string parsing //====================================================================== static string get_str(string s) { size_t p = s.find(":"); if (p == string::npos) return ""; s.erase(0, p+1); p = s.find(","); if (p == string::npos) p = s.find("]"); if (p == string::npos) return ""; string s2 = s.substr(0, p); if (s2 == "(null)") return ""; return s2; } static int get_freq(string s) { string s2 = get_str(s); float mhz; sscanf(s2.c_str(), "%f", &mhz); int hz = mhz * 1e6; return hz; } void maclogger_set_qsy() { int hz = mclg_txhz; if (hz <= 0) hz = mclg_rxhz; if (hz <= 0) return; wf->rfcarrier(hz); wf->movetocenter(); show_frequency(hz); } void maclogger_set_call() { inpCall->value(mclg_call.c_str()); inpCall->do_callback(); } void maclogger_set_name() { inpName->value(mclg_firstname.c_str()); inpName->do_callback(); } void maclogger_set_mode() { // inpMode->value(mclg_mode.c_str()); // inpMode->do_callback(); } void maclogger_set_qth() { inpQth->value(mclg_city.c_str()); inpQth->do_callback(); } void maclogger_set_state() { inpState->value(mclg_state.c_str()); inpState->do_callback(); } void maclogger_disp_report(const char * s) { txt_UDP_data->insert(s); txt_UDP_data->redraw(); } void show_mac_strings() { SET_THREAD_ID(MACLOGGER_TID); if (mclg_txhz > 0) REQ(maclogger_set_qsy); else if (mclg_rxhz > 0) REQ(maclogger_set_qsy); if (!mclg_mode.empty()) REQ(maclogger_set_mode); if (!mclg_call.empty()) REQ(maclogger_set_call); if (!mclg_city.empty()) REQ(maclogger_set_qth); if (!mclg_state.empty()) REQ(maclogger_set_state); if (!mclg_firstname.empty()) REQ(maclogger_set_name); // if (!mclg_power.empty()) // if (!mclg_band.empty()) // if (!mclg_lastname.empty()) // if (!mclg_comment.empty()) // if (!mclg_bearing.empty()) // if (!mclg_longpath.empty()) // if (!mclg_distance.empty()) // if (!mclg_dxccnum.empty()) // if (!mclg_dxccstr.empty()) } void parse_report(string str) { size_t p; mclg_rxhz = 0; mclg_txhz = 0; mclg_band.clear(); mclg_mode.clear(); mclg_power.clear(); mclg_call.clear(); mclg_dxccnum.clear(); mclg_dxccstr.clear(); mclg_city.clear(); mclg_state.clear(); mclg_firstname.clear(); mclg_lastname.clear(); mclg_comment.clear(); mclg_bearing.clear(); mclg_longpath.clear(); mclg_distance.clear(); if ((p = str.find("RxMHz:")) != string::npos) mclg_rxhz = get_freq(str.substr(p)); if ((p = str.find("TxMHz:")) != string::npos) mclg_txhz = get_freq(str.substr(p)); if ((p = str.find("Mode:")) != string::npos) mclg_mode = get_str(str.substr(p)); if ((p = str.find("Call:")) != string::npos) mclg_call = get_str(str.substr(p)); if ((p = str.find("city:")) != string::npos) mclg_city = get_str(str.substr(p)); if ((p = str.find("state:")) != string::npos) mclg_state = get_str(str.substr(p)); if ((p = str.find("first_name:")) != string::npos) mclg_firstname = get_str(str.substr(p)); // if ((p = mclg_str.find("dxcc_num:")) != string::npos) // mclg_dxccnum = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("dxcc_string:")) != string::npos) // mclg_dxccstr = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Power:")) != string::npos) // mclg_power = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Band:")) != string::npos) // mclg_band = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("last_name:")) != string::npos) // mclg_lastname = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Comment:")) != string::npos) // mclg_comment = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Bearing:")) != string::npos) // mclg_bearing = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("LongPath:")) != string::npos) // mclg_longpath = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Distance:")) != string::npos) // mclg_distance = get_str(mclg_str.substr(p)); show_mac_strings(); } void parse_maclog() { size_t p1, p2; string str, srep; static string sreport[20]; int repnbr = 0; while (!mclg_str.empty()) { p1 = mclg_str.find("["); if (p1 == string::npos) return; if (p1 != 0) mclg_str.erase(0, p1); p2 = mclg_str.find("]"); if (p2 == string::npos) return; str = mclg_str.substr(0, p2 + 1); srep = str; srep.append("\n"); if (repnbr < 20) { sreport[repnbr] = srep; REQ(maclogger_disp_report, sreport[repnbr].c_str()); repnbr++; } if (progdefaults.enable_maclogger_log) { std::string pathname = TempDir; pathname.append("maclogger_udp_strings.txt"); FILE *maclog = fl_fopen(pathname.c_str(), "a"); fprintf(maclog, "%s", srep.c_str()); fclose(maclog); } if (progdefaults.capture_maclogger_radio && (mclg_str.find("[Radio Report:") == 0)) parse_report(str); else if (progdefaults.capture_maclogger_spot_tune && (mclg_str.find("[SpotTune:") == 0)) parse_report(str); else if (progdefaults.capture_maclogger_spot_report && (mclg_str.find("[Spot Report:") == 0)) parse_report(str); else if (progdefaults.capture_maclogger_log && (mclg_str.find("[Log Report:") == 0)) parse_report(str); else if (progdefaults.capture_maclogger_lookup && (mclg_str.find("[Lookup Report") == 0)) parse_report(str); mclg_str.erase(0, p2 + 1); } } //====================================================================== // uncomment to use UDP test strings // // #define TESTSTRINGS 1 // //====================================================================== #ifdef TESTSTRINGS string tstring[6] = { "[Radio Report:RxMHz:24.96400, TxMHz:24.96400, Band:12M, Mode:USB, Power:5]", "[SpotTune:RxMHz:28.49500, TxMHz:28.49600, Band:10M, Mode:USB]", "[Log Report: Call:N2BJ, RxMHz:21.08580, TxMHz:21.08580, Band:15M, Mode:FSK, Power:5, dxcc_num:291, dxcc_string:United States, city:NEW LENOX, state:IL, first_name:Barry, last_name:COHEN]", "[Spot Report: RxMHz:3.50300, TxMHz:3.50300, Band:80M, Mode:CW, Call:EP6T, dxcc_string:Iran, Comment:UP , TNX CARLO , GL]", "[Rotor Report: Bearing:304.7, LongPath:0, Distance:0.0]", "[Lookup Report:Call:YC8RBI, RxMHz:21.32500, Band:15M, Mode:USB, dxcc_num:327, dxcc_string:Indonesia, Bearing:328.1, city:SANGIHE ISLAND NORTH SULAWESI, state:(null), first_name:RICHARD, last_name:BYL ( ICHA )]" }; int tnbr = 0; #endif void get_maclogger_udp() { if(!maclogger_socket) return; if (!progdefaults.connect_to_maclogger) return; #ifdef TESTSTRINGS if (tnbr == 0) { mclg_str = "bogus start chars dkoe13.chfff "; for (int n = 0; n < 6; n++) mclg_str.append(tstring[n]); mclg_str.append(" and garbage at the end"); parse_maclog(); tnbr = 1; } #else char buffer[MACLOGGER_BUFFER_SIZE]; size_t count = 0; memset(buffer, 0, sizeof(buffer)); try { count = maclogger_socket->recvFrom( (void *) buffer, sizeof(buffer) - 1); } catch (...) { LOG_WARN("MAC_logger socket error"); count = 0; } if (count) { mclg_str.append(buffer, count); parse_maclog(); } #endif } //====================================================================== // //====================================================================== void *maclogger_loop(void *args) { SET_THREAD_ID(MACLOGGER_TID); LOG_INFO("%s", "MAC_logger loop started. "); while(1) { for (int i = 0; i < 100; i++) { MilliSleep(10); if (maclogger_exit) break; } if (maclogger_exit) break; get_maclogger_udp(); } // exit the maclogger thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== bool maclogger_start(void) { maclogger_ip_address = "255.255.255.255"; maclogger_ip_port = "9932"; try { maclogger_socket = new Socket( Address( maclogger_ip_address.c_str(), maclogger_ip_port.c_str(), "udp") ); maclogger_socket->set_autoclose(true); maclogger_socket->set_nonblocking(false); maclogger_socket->bindUDP(); } catch (const SocketException& e) { LOG_ERROR( "Could not resolve %s: %s", maclogger_ip_address.c_str(), e.what() ); return false; } return true; } //====================================================================== // //====================================================================== void maclogger_init(void) { maclogger_enabled = false; maclogger_exit = false; if(!maclogger_start()) return; LOG_INFO("%s", "UDP Init - OK"); if (pthread_create(&maclogger_thread, NULL, maclogger_loop, NULL) < 0) { LOG_ERROR("MACLOGGER maclogger_thread: pthread_create failed"); return; } LOG_INFO("MACLOGGER thread started"); maclogger_enabled = true; } //====================================================================== // //====================================================================== void maclogger_close(void) { if (!maclogger_enabled) return; if(maclogger_socket) { maclogger_socket->shut_down(); maclogger_socket->close(); } maclogger_exit = true; pthread_join(maclogger_thread, NULL); LOG_INFO("%s", "MAC_logger loop terminated. "); maclogger_enabled = false; #ifdef TESTSTRINGS tnbr = 0; #endif } fldigi-4.1.06/src/logbook/cty-dat.cxx0000664000175000017500000024206013507402064014304 00000000000000// ---------------------------------------------------------------------------- // cty-dat.cxx // // Copyright (C) 2018 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // internal data file string that is the latest cty.dat as of the // publishing date of the software #include #include std::string s_ctydat = "Sov Mil Order of Malta: 15: 28: EU: 41.90: -12.43: -1.0: 1A:\n\ 1A;\n\ Spratly Islands: 26: 50: AS: 9.88: -114.23: -8.0: 1S:\n\ 9M0,BM9S,BN9S,BO9S,BP9S,BQ9S,BU9S,BV9S,BW9S,BX9S;\n\ Monaco: 14: 27: EU: 43.73: -7.40: -1.0: 3A:\n\ 3A;\n\ Agalega & St. Brandon: 39: 53: AF: -10.45: -56.67: -4.0: 3B6:\n\ 3B6,3B7;\n\ Mauritius: 39: 53: AF: -20.35: -57.50: -4.0: 3B8:\n\ 3B8;\n\ Rodriguez Island: 39: 53: AF: -19.70: -63.42: -4.0: 3B9:\n\ 3B9;\n\ Equatorial Guinea: 36: 47: AF: 1.70: -10.33: -1.0: 3C:\n\ 3C;\n\ Annobon Island: 36: 52: AF: -1.43: -5.62: -1.0: 3C0:\n\ 3C0;\n\ Fiji: 32: 56: OC: -17.78: -177.92: -12.0: 3D2:\n\ 3D2;\n\ Conway Reef: 32: 56: OC: -22.00: -175.00: -12.0: 3D2/c:\n\ =3D2CR;\n\ Rotuma Island: 32: 56: OC: -12.48: -177.08: -12.0: 3D2/r:\n\ =3D2RI;\n\ Swaziland: 38: 57: AF: -26.65: -31.48: -2.0: 3DA:\n\ 3DA;\n\ Tunisia: 33: 37: AF: 35.40: -9.32: -1.0: 3V:\n\ 3V,TS;\n\ Vietnam: 26: 49: AS: 15.80: -107.90: -7.0: 3W:\n\ 3W,XV;\n\ Guinea: 35: 46: AF: 11.00: 10.68: 0.0: 3X:\n\ 3X;\n\ Bouvet: 38: 67: AF: -54.42: -3.38: -1.0: 3Y/b:\n\ =3Y0E;\n\ Peter 1 Island: 12: 72: SA: -68.77: 90.58: 4.0: 3Y/p:\n\ =3Y0X;\n\ Azerbaijan: 21: 29: AS: 40.45: -47.37: -4.0: 4J:\n\ 4J,4K;\n\ Georgia: 21: 29: AS: 42.00: -45.00: -4.0: 4L:\n\ 4L;\n\ Montenegro: 15: 28: EU: 42.50: -19.28: -1.0: 4O:\n\ 4O;\n\ Sri Lanka: 22: 41: AS: 7.60: -80.70: -5.5: 4S:\n\ 4P,4Q,4R,4S;\n\ ITU HQ: 14: 28: EU: 46.17: -6.05: -1.0: 4U1I:\n\ =4U1ITU,=4U1WRC;\n\ United Nations HQ: 05: 08: NA: 40.75: 73.97: 5.0: 4U1U:\n\ =4U1UN;\n\ Vienna Intl Ctr: 15: 28: EU: 48.20: -16.30: -1.0: *4U1V:\n\ =4U0R,=4U1A,=4U1VIC,=4U2U,=4Y1A,=C7A;\n\ Timor - Leste: 28: 54: OC: -8.80: -126.05: -9.0: 4W:\n\ 4W;\n\ Israel: 20: 39: AS: 31.32: -34.82: -2.0: 4X:\n\ 4X,4Z;\n\ Libya: 34: 38: AF: 27.20: -16.60: -2.0: 5A:\n\ 5A;\n\ Cyprus: 20: 39: AS: 35.00: -33.00: -2.0: 5B:\n\ 5B,C4,H2,P3;\n\ Tanzania: 37: 53: AF: -5.75: -33.92: -3.0: 5H:\n\ 5H,5I;\n\ Nigeria: 35: 46: AF: 9.87: -7.55: -1.0: 5N:\n\ 5N,5O;\n\ Madagascar: 39: 53: AF: -19.00: -46.58: -3.0: 5R:\n\ 5R,5S,6X;\n\ Mauritania: 35: 46: AF: 20.60: 10.50: 0.0: 5T:\n\ 5T;\n\ Niger: 35: 46: AF: 17.63: -9.43: -1.0: 5U:\n\ 5U;\n\ Togo: 35: 46: AF: 8.40: -1.28: 0.0: 5V:\n\ 5V;\n\ Samoa: 32: 62: OC: -13.93: 171.70: -13.0: 5W:\n\ 5W;\n\ Uganda: 37: 48: AF: 1.92: -32.60: -3.0: 5X:\n\ 5X;\n\ Kenya: 37: 48: AF: 0.32: -38.15: -3.0: 5Z:\n\ 5Y,5Z;\n\ Senegal: 35: 46: AF: 15.20: 14.63: 0.0: 6W:\n\ 6V,6W;\n\ Jamaica: 08: 11: NA: 18.20: 77.47: 5.0: 6Y:\n\ 6Y;\n\ Yemen: 21: 39: AS: 15.65: -48.12: -3.0: 7O:\n\ 7O,=VERSION;\n\ Lesotho: 38: 57: AF: -29.22: -27.88: -2.0: 7P:\n\ 7P;\n\ Malawi: 37: 53: AF: -14.00: -34.00: -2.0: 7Q:\n\ 7Q;\n\ Algeria: 33: 37: AF: 28.00: -2.00: -1.0: 7X:\n\ 7R,7T,7U,7V,7W,7X,7Y;\n\ Barbados: 08: 11: NA: 13.18: 59.53: 4.0: 8P:\n\ 8P;\n\ Maldives: 22: 41: AS: 4.15: -73.45: -5.0: 8Q:\n\ 8Q;\n\ Guyana: 09: 12: SA: 6.02: 59.45: 4.0: 8R:\n\ 8R;\n\ Croatia: 15: 28: EU: 45.18: -15.30: -1.0: 9A:\n\ 9A;\n\ Ghana: 35: 46: AF: 7.70: 1.57: 0.0: 9G:\n\ 9G;\n\ Malta: 15: 28: EU: 35.88: -14.42: -1.0: 9H:\n\ 9H;\n\ Zambia: 36: 53: AF: -14.22: -26.73: -2.0: 9J:\n\ 9I,9J;\n\ Kuwait: 21: 39: AS: 29.38: -47.38: -3.0: 9K:\n\ 9K,NLD;\n\ Sierra Leone: 35: 46: AF: 8.50: 13.25: 0.0: 9L:\n\ 9L;\n\ West Malaysia: 28: 54: AS: 3.95: -102.23: -8.0: 9M2:\n\ 9M,9W;\n\ East Malaysia: 28: 54: OC: 2.68: -113.32: -8.0: 9M6:\n\ 9M6,9M8,9W6,9W8,=9M4CKT,=9M4CRB,=9M4CRP;\n\ Nepal: 22: 42: AS: 27.70: -85.33: -5.75: 9N:\n\ 9N;\n\ Dem. Rep. of the Congo: 36: 52: AF: -3.12: -23.03: -1.0: 9Q:\n\ 9O,9P,9Q,9R,9S,9T;\n\ Burundi: 36: 52: AF: -3.17: -29.78: -2.0: 9U:\n\ 9U;\n\ Singapore: 28: 54: AS: 1.37: -103.78: -8.0: 9V:\n\ 9V,S6;\n\ Rwanda: 36: 52: AF: -1.75: -29.82: -2.0: 9X:\n\ 9X;\n\ Trinidad & Tobago: 09: 11: SA: 10.38: 61.28: 4.0: 9Y:\n\ 9Y,9Z;\n\ Botswana: 38: 57: AF: -22.00: -24.00: -2.0: A2:\n\ 8O,A2;\n\ Tonga: 32: 62: OC: -21.22: 175.13: -13.0: A3:\n\ A3;\n\ Oman: 21: 39: AS: 23.60: -58.55: -4.0: A4:\n\ A4;\n\ Bhutan: 22: 41: AS: 27.40: -90.18: -6.0: A5:\n\ A5;\n\ United Arab Emirates: 21: 39: AS: 24.00: -54.00: -4.0: A6:\n\ A6;\n\ Qatar: 21: 39: AS: 25.25: -51.13: -3.0: A7:\n\ A7;\n\ Bahrain: 21: 39: AS: 26.03: -50.53: -3.0: A9:\n\ A9;\n\ Pakistan: 21: 41: AS: 30.00: -70.00: -5.0: AP:\n\ 6P,6Q,6R,6S,AP,AQ,AR,AS;\n\ Scarborough Reef: 27: 50: AS: 15.08: -117.72: -8.0: BS7:\n\ =BS7H;\n\ Taiwan: 24: 44: AS: 23.72: -120.88: -8.0: BV:\n\ BM,BN,BO,BP,BQ,BU,BV,BW,BX;\n\ Pratas Island: 24: 44: AS: 20.70: -116.70: -8.0: BV9P:\n\ BM9P,BN9P,BO9P,BP9P,BQ9P,BU9P,BV9P,BW9P,BX9P;\n\ China: 24: 44: AS: 36.00: -102.00: -8.0: BY:\n\ 3H,3H0(23)[42],3H9(23)[43],3I,3I0(23)[42],3I9(23)[43],3J,3J0(23)[42],\n\ 3J9(23)[43],3K,3K0(23)[42],3K9(23)[43],3L,3L0(23)[42],3L9(23)[43],3M,\n\ 3M0(23)[42],3M9(23)[43],3N,3N0(23)[42],3N9(23)[43],3O,3O0(23)[42],\n\ 3O9(23)[43],3P,3P0(23)[42],3P9(23)[43],3Q,3Q0(23)[42],3Q9(23)[43],3R,\n\ 3R0(23)[42],3R9(23)[43],3S,3S0(23)[42],3S9(23)[43],3T,3T0(23)[42],\n\ 3T9(23)[43],3U,3U0(23)[42],3U9(23)[43],B0(23)[42],B2,B3,B4,B5,B6,B7,B8,\n\ B9(23)[43],BA,BA0(23)[42],BA9(23)[43],BD,BD0(23)[42],BD9(23)[43],BG,\n\ BG0(23)[42],BG9(23)[43],BH,BH0(23)[42],BH9(23)[43],BI,BI0(23)[42],\n\ BI9(23)[43],BJ,BJ0(23)[42],BJ9(23)[43],BL,BL0(23)[42],BL9(23)[43],BT,\n\ BT0(23)[42],BT9(23)[43],BY,BY0(23)[42],BY9(23)[43],BZ,BZ0(23)[42],\n\ BZ9(23)[43],XS,XS0(23)[42],XS9(23)[43],B1,B2A[33],B2B[33],B2C[33],B2D[33],\n\ B2E[33],B2F[33],B2G[33],B2H[33],B2I[33],B2J[33],B2K[33],B2L[33],B2M[33],\n\ B2N[33],B2O[33],B2P[33],B3G(23)[33],B3H(23)[33],B3I(23)[33],B3J(23)[33],\n\ B3K(23)[33],B3L(23)[33],B6Q[43],B6R[43],B6S[43],B6T[43],B6U[43],B6V[43],\n\ B6W[43],B6X[43],B7A[43],B7B[43],B7C[43],B7D[43],B7E[43],B7F[43],B7G[43],\n\ B7H[43],B7Q[43],B7R[43],B7S[43],B7T[43],B7U[43],B7V[43],B7W[43],B7X[43],\n\ B8A[43],B8B[43],B8C[43],B8D[43],B8E[43],B8F[43],B8G[43],B8H[43],B8I[43],\n\ B8J[43],B8K[43],B8L[43],B8M[43],B8N[43],B8O[43],B8P[43],B8Q[43],B8R[43],\n\ B8S[43],B8T[43],B8U[43],B8V[43],B8W[43],B8X[43],B9A(24)[43],B9B(24)[43],\n\ B9C(24)[43],B9D(24)[43],B9E(24)[43],B9F(24)[43],B9S(23)[42],B9T(23)[42],\n\ B9U(23)[42],B9V(23)[42],B9W(23)[42],B9X(23)[42],BA2A[33],BA2B[33],\n\ BA2C[33],BA2D[33],BA2E[33],BA2F[33],BA2G[33],BA2H[33],BA2I[33],BA2J[33],\n\ BA2K[33],BA2L[33],BA2M[33],BA2N[33],BA2O[33],BA2P[33],BA3G(23)[33],\n\ BA3H(23)[33],BA3I(23)[33],BA3J(23)[33],BA3K(23)[33],BA3L(23)[33],BA6Q[43],\n\ BA6R[43],BA6S[43],BA6T[43],BA6U[43],BA6V[43],BA6W[43],BA6X[43],BA7A[43],\n\ BA7B[43],BA7C[43],BA7D[43],BA7E[43],BA7F[43],BA7G[43],BA7H[43],BA7Q[43],\n\ BA7R[43],BA7S[43],BA7T[43],BA7U[43],BA7V[43],BA7W[43],BA7X[43],BA8A[43],\n\ BA8B[43],BA8C[43],BA8D[43],BA8E[43],BA8F[43],BA8G[43],BA8H[43],BA8I[43],\n\ BA8J[43],BA8K[43],BA8L[43],BA8M[43],BA8N[43],BA8O[43],BA8P[43],BA8Q[43],\n\ BA8R[43],BA8S[43],BA8T[43],BA8U[43],BA8V[43],BA8W[43],BA8X[43],\n\ BA9A(24)[43],BA9B(24)[43],BA9C(24)[43],BA9D(24)[43],BA9E(24)[43],\n\ BA9F(24)[43],BA9S(23)[42],BA9T(23)[42],BA9U(23)[42],BA9V(23)[42],\n\ BA9W(23)[42],BA9X(23)[42],BD2A[33],BD2B[33],BD2C[33],BD2D[33],BD2E[33],\n\ BD2F[33],BD2G[33],BD2H[33],BD2I[33],BD2J[33],BD2K[33],BD2L[33],BD2M[33],\n\ BD2N[33],BD2O[33],BD2P[33],BD3G(23)[33],BD3H(23)[33],BD3I(23)[33],\n\ BD3J(23)[33],BD3K(23)[33],BD3L(23)[33],BD6Q[43],BD6R[43],BD6S[43],\n\ BD6T[43],BD6U[43],BD6V[43],BD6W[43],BD6X[43],BD7A[43],BD7B[43],BD7C[43],\n\ BD7D[43],BD7E[43],BD7F[43],BD7G[43],BD7H[43],BD7Q[43],BD7R[43],BD7S[43],\n\ BD7T[43],BD7U[43],BD7V[43],BD7W[43],BD7X[43],BD8A[43],BD8B[43],BD8C[43],\n\ BD8D[43],BD8E[43],BD8F[43],BD8G[43],BD8H[43],BD8I[43],BD8J[43],BD8K[43],\n\ BD8L[43],BD8M[43],BD8N[43],BD8O[43],BD8P[43],BD8Q[43],BD8R[43],BD8S[43],\n\ BD8T[43],BD8U[43],BD8V[43],BD8W[43],BD8X[43],BD9A(24)[43],BD9B(24)[43],\n\ BD9C(24)[43],BD9D(24)[43],BD9E(24)[43],BD9F(24)[43],BD9S(23)[42],\n\ BD9T(23)[42],BD9U(23)[42],BD9V(23)[42],BD9W(23)[42],BD9X(23)[42],BG2A[33],\n\ BG2B[33],BG2C[33],BG2D[33],BG2E[33],BG2F[33],BG2G[33],BG2H[33],BG2I[33],\n\ BG2J[33],BG2K[33],BG2L[33],BG2M[33],BG2N[33],BG2O[33],BG2P[33],\n\ BG3G(23)[33],BG3H(23)[33],BG3I(23)[33],BG3J(23)[33],BG3K(23)[33],\n\ BG3L(23)[33],BG6Q[43],BG6R[43],BG6S[43],BG6T[43],BG6U[43],BG6V[43],\n\ BG6W[43],BG6X[43],BG7A[43],BG7B[43],BG7C[43],BG7D[43],BG7E[43],BG7F[43],\n\ BG7G[43],BG7H[43],BG7Q[43],BG7R[43],BG7S[43],BG7T[43],BG7U[43],BG7V[43],\n\ BG7W[43],BG7X[43],BG8A[43],BG8B[43],BG8C[43],BG8D[43],BG8E[43],BG8F[43],\n\ BG8G[43],BG8H[43],BG8I[43],BG8J[43],BG8K[43],BG8L[43],BG8M[43],BG8N[43],\n\ BG8O[43],BG8P[43],BG8Q[43],BG8R[43],BG8S[43],BG8T[43],BG8U[43],BG8V[43],\n\ BG8W[43],BG8X[43],BG9A(24)[43],BG9B(24)[43],BG9C(24)[43],BG9D(24)[43],\n\ BG9E(24)[43],BG9F(24)[43],BG9S(23)[42],BG9T(23)[42],BG9U(23)[42],\n\ BG9V(23)[42],BG9W(23)[42],BG9X(23)[42],BH2A[33],BH2B[33],BH2C[33],\n\ BH2D[33],BH2E[33],BH2F[33],BH2G[33],BH2H[33],BH2I[33],BH2J[33],BH2K[33],\n\ BH2L[33],BH2M[33],BH2N[33],BH2O[33],BH2P[33],BH3G(23)[33],BH3H(23)[33],\n\ BH3I(23)[33],BH3J(23)[33],BH3K(23)[33],BH3L(23)[33],BH6Q[43],BH6R[43],\n\ BH6S[43],BH6T[43],BH6U[43],BH6V[43],BH6W[43],BH6X[43],BH7A[43],BH7B[43],\n\ BH7C[43],BH7D[43],BH7E[43],BH7F[43],BH7G[43],BH7H[43],BH7Q[43],BH7R[43],\n\ BH7S[43],BH7T[43],BH7U[43],BH7V[43],BH7W[43],BH7X[43],BH8A[43],BH8B[43],\n\ BH8C[43],BH8D[43],BH8E[43],BH8F[43],BH8G[43],BH8H[43],BH8I[43],BH8J[43],\n\ BH8K[43],BH8L[43],BH8M[43],BH8N[43],BH8O[43],BH8P[43],BH8Q[43],BH8R[43],\n\ BH8S[43],BH8T[43],BH8U[43],BH8V[43],BH8W[43],BH8X[43],BH9A(24)[43],\n\ BH9B(24)[43],BH9C(24)[43],BH9D(24)[43],BH9E(24)[43],BH9F(24)[43],\n\ BH9S(23)[42],BH9T(23)[42],BH9U(23)[42],BH9V(23)[42],BH9W(23)[42],\n\ BH9X(23)[42],BI2A[33],BI2B[33],BI2C[33],BI2D[33],BI2E[33],BI2F[33],\n\ BI2G[33],BI2H[33],BI2I[33],BI2J[33],BI2K[33],BI2L[33],BI2M[33],BI2N[33],\n\ BI2O[33],BI2P[33],BI3G(23)[33],BI3H(23)[33],BI3I(23)[33],BI3J(23)[33],\n\ BI3K(23)[33],BI3L(23)[33],BI6Q[43],BI6R[43],BI6S[43],BI6T[43],BI6U[43],\n\ BI6V[43],BI6W[43],BI6X[43],BI7A[43],BI7B[43],BI7C[43],BI7D[43],BI7E[43],\n\ BI7F[43],BI7G[43],BI7H[43],BI7Q[43],BI7R[43],BI7S[43],BI7T[43],BI7U[43],\n\ BI7V[43],BI7W[43],BI7X[43],BI8A[43],BI8B[43],BI8C[43],BI8D[43],BI8E[43],\n\ BI8F[43],BI8G[43],BI8H[43],BI8I[43],BI8J[43],BI8K[43],BI8L[43],BI8M[43],\n\ BI8N[43],BI8O[43],BI8P[43],BI8Q[43],BI8R[43],BI8S[43],BI8T[43],BI8U[43],\n\ BI8V[43],BI8W[43],BI8X[43],BI9A(24)[43],BI9B(24)[43],BI9C(24)[43],\n\ BI9D(24)[43],BI9E(24)[43],BI9F(24)[43],BI9S(23)[42],BI9T(23)[42],\n\ BI9U(23)[42],BI9V(23)[42],BI9W(23)[42],BI9X(23)[42],BJ2A[33],BJ2B[33],\n\ BJ2C[33],BJ2D[33],BJ2E[33],BJ2F[33],BJ2G[33],BJ2H[33],BJ2I[33],BJ2J[33],\n\ BJ2K[33],BJ2L[33],BJ2M[33],BJ2N[33],BJ2O[33],BJ2P[33],BJ3G(23)[33],\n\ BJ3H(23)[33],BJ3I(23)[33],BJ3J(23)[33],BJ3K(23)[33],BJ3L(23)[33],BJ6Q[43],\n\ BJ6R[43],BJ6S[43],BJ6T[43],BJ6U[43],BJ6V[43],BJ6W[43],BJ6X[43],BJ7A[43],\n\ BJ7B[43],BJ7C[43],BJ7D[43],BJ7E[43],BJ7F[43],BJ7G[43],BJ7H[43],BJ7Q[43],\n\ BJ7R[43],BJ7S[43],BJ7T[43],BJ7U[43],BJ7V[43],BJ7W[43],BJ7X[43],BJ8A[43],\n\ BJ8B[43],BJ8C[43],BJ8D[43],BJ8E[43],BJ8F[43],BJ8G[43],BJ8H[43],BJ8I[43],\n\ BJ8J[43],BJ8K[43],BJ8L[43],BJ8M[43],BJ8N[43],BJ8O[43],BJ8P[43],BJ8Q[43],\n\ BJ8R[43],BJ8S[43],BJ8T[43],BJ8U[43],BJ8V[43],BJ8W[43],BJ8X[43],\n\ BJ9A(24)[43],BJ9B(24)[43],BJ9C(24)[43],BJ9D(24)[43],BJ9E(24)[43],\n\ BJ9F(24)[43],BJ9S(23)[42],BJ9T(23)[42],BJ9U(23)[42],BJ9V(23)[42],\n\ BJ9W(23)[42],BJ9X(23)[42],BL2A[33],BL2B[33],BL2C[33],BL2D[33],BL2E[33],\n\ BL2F[33],BL2G[33],BL2H[33],BL2I[33],BL2J[33],BL2K[33],BL2L[33],BL2M[33],\n\ BL2N[33],BL2O[33],BL2P[33],BL3G(23)[33],BL3H(23)[33],BL3I(23)[33],\n\ BL3J(23)[33],BL3K(23)[33],BL3L(23)[33],BL6Q[43],BL6R[43],BL6S[43],\n\ BL6T[43],BL6U[43],BL6V[43],BL6W[43],BL6X[43],BL7A[43],BL7B[43],BL7C[43],\n\ BL7D[43],BL7E[43],BL7F[43],BL7G[43],BL7H[43],BL7Q[43],BL7R[43],BL7S[43],\n\ BL7T[43],BL7U[43],BL7V[43],BL7W[43],BL7X[43],BL8A[43],BL8B[43],BL8C[43],\n\ BL8D[43],BL8E[43],BL8F[43],BL8G[43],BL8H[43],BL8I[43],BL8J[43],BL8K[43],\n\ BL8L[43],BL8M[43],BL8N[43],BL8O[43],BL8P[43],BL8Q[43],BL8R[43],BL8S[43],\n\ BL8T[43],BL8U[43],BL8V[43],BL8W[43],BL8X[43],BL9A(24)[43],BL9B(24)[43],\n\ BL9C(24)[43],BL9D(24)[43],BL9E(24)[43],BL9F(24)[43],BL9S(23)[42],\n\ BL9T(23)[42],BL9U(23)[42],BL9V(23)[42],BL9W(23)[42],BL9X(23)[42],BT2A[33],\n\ BT2B[33],BT2C[33],BT2D[33],BT2E[33],BT2F[33],BT2G[33],BT2H[33],BT2I[33],\n\ BT2J[33],BT2K[33],BT2L[33],BT2M[33],BT2N[33],BT2O[33],BT2P[33],\n\ BT3G(23)[33],BT3H(23)[33],BT3I(23)[33],BT3J(23)[33],BT3K(23)[33],\n\ BT3L(23)[33],BT6Q[43],BT6R[43],BT6S[43],BT6T[43],BT6U[43],BT6V[43],\n\ BT6W[43],BT6X[43],BT7A[43],BT7B[43],BT7C[43],BT7D[43],BT7E[43],BT7F[43],\n\ BT7G[43],BT7H[43],BT7Q[43],BT7R[43],BT7S[43],BT7T[43],BT7U[43],BT7V[43],\n\ BT7W[43],BT7X[43],BT8A[43],BT8B[43],BT8C[43],BT8D[43],BT8E[43],BT8F[43],\n\ BT8G[43],BT8H[43],BT8I[43],BT8J[43],BT8K[43],BT8L[43],BT8M[43],BT8N[43],\n\ BT8O[43],BT8P[43],BT8Q[43],BT8R[43],BT8S[43],BT8T[43],BT8U[43],BT8V[43],\n\ BT8W[43],BT8X[43],BT9A(24)[43],BT9B(24)[43],BT9C(24)[43],BT9D(24)[43],\n\ BT9E(24)[43],BT9F(24)[43],BT9S(23)[42],BT9T(23)[42],BT9U(23)[42],\n\ BT9V(23)[42],BT9W(23)[42],BT9X(23)[42],BY2A[33],BY2B[33],BY2C[33],\n\ BY2D[33],BY2E[33],BY2F[33],BY2G[33],BY2H[33],BY2I[33],BY2J[33],BY2K[33],\n\ BY2L[33],BY2M[33],BY2N[33],BY2O[33],BY2P[33],BY3G(23)[33],BY3H(23)[33],\n\ BY3I(23)[33],BY3J(23)[33],BY3K(23)[33],BY3L(23)[33],BY6Q[43],BY6R[43],\n\ BY6S[43],BY6T[43],BY6U[43],BY6V[43],BY6W[43],BY6X[43],BY7A[43],BY7B[43],\n\ BY7C[43],BY7D[43],BY7E[43],BY7F[43],BY7G[43],BY7H[43],BY7Q[43],BY7R[43],\n\ BY7S[43],BY7T[43],BY7U[43],BY7V[43],BY7W[43],BY7X[43],BY8A[43],BY8B[43],\n\ BY8C[43],BY8D[43],BY8E[43],BY8F[43],BY8G[43],BY8H[43],BY8I[43],BY8J[43],\n\ BY8K[43],BY8L[43],BY8M[43],BY8N[43],BY8O[43],BY8P[43],BY8Q[43],BY8R[43],\n\ BY8S[43],BY8T[43],BY8U[43],BY8V[43],BY8W[43],BY8X[43],BY9A(24)[43],\n\ BY9B(24)[43],BY9C(24)[43],BY9D(24)[43],BY9E(24)[43],BY9F(24)[43],\n\ BY9S(23)[42],BY9T(23)[42],BY9U(23)[42],BY9V(23)[42],BY9W(23)[42],\n\ BY9X(23)[42],BZ2A[33],BZ2B[33],BZ2C[33],BZ2D[33],BZ2E[33],BZ2F[33],\n\ BZ2G[33],BZ2H[33],BZ2I[33],BZ2J[33],BZ2K[33],BZ2L[33],BZ2M[33],BZ2N[33],\n\ BZ2O[33],BZ2P[33],BZ3G(23)[33],BZ3H(23)[33],BZ3I(23)[33],BZ3J(23)[33],\n\ BZ3K(23)[33],BZ3L(23)[33],BZ6Q[43],BZ6R[43],BZ6S[43],BZ6T[43],BZ6U[43],\n\ BZ6V[43],BZ6W[43],BZ6X[43],BZ7A[43],BZ7B[43],BZ7C[43],BZ7D[43],BZ7E[43],\n\ BZ7F[43],BZ7G[43],BZ7H[43],BZ7Q[43],BZ7R[43],BZ7S[43],BZ7T[43],BZ7U[43],\n\ BZ7V[43],BZ7W[43],BZ7X[43],BZ8A[43],BZ8B[43],BZ8C[43],BZ8D[43],BZ8E[43],\n\ BZ8F[43],BZ8G[43],BZ8H[43],BZ8I[43],BZ8J[43],BZ8K[43],BZ8L[43],BZ8M[43],\n\ BZ8N[43],BZ8O[43],BZ8P[43],BZ8Q[43],BZ8R[43],BZ8S[43],BZ8T[43],BZ8U[43],\n\ BZ8V[43],BZ8W[43],BZ8X[43],BZ9A(24)[43],BZ9B(24)[43],BZ9C(24)[43],\n\ BZ9D(24)[43],BZ9E(24)[43],BZ9F(24)[43],BZ9S(23)[42],BZ9T(23)[42],\n\ BZ9U(23)[42],BZ9V(23)[42],BZ9W(23)[42],BZ9X(23)[42],=BG9XD/7;\n\ Nauru: 31: 65: OC: -0.52: -166.92: -12.0: C2:\n\ C2;\n\ Andorra: 14: 27: EU: 42.58: -1.62: -1.0: C3:\n\ C3;\n\ The Gambia: 35: 46: AF: 13.40: 16.38: 0.0: C5:\n\ C5;\n\ Bahamas: 08: 11: NA: 24.25: 76.00: 5.0: C6:\n\ C6;\n\ Mozambique: 37: 53: AF: -18.25: -35.00: -2.0: C9:\n\ C8,C9;\n\ Chile: 12: 14: SA: -30.00: 71.00: 4.0: CE:\n\ 3G,CA,CB,CC,CD,CE,XQ,XR,3G7[16],3G8[16],CA7[16],CA8[16],CB7[16],CB8[16],\n\ CC7[16],CC8[16],CD7[16],CD8[16],CE7[16],CE8[16],XQ7[16],XQ8[16],XR7[16],\n\ XR8[16],=CE6PGO[16],=XQ6CFX[16],=XQ6OA[16],=XR6F[16];\n\ San Felix & San Ambrosio: 12: 14: SA: -26.28: 80.07: 4.0: CE0X:\n\ 3G0X,CA0X,CB0X,CC0X,CD0X,CE0X,XQ0X,XR0X;\n\ Easter Island: 12: 63: SA: -27.10: 109.37: 6.0: CE0Y:\n\ 3G0,CA0,CB0,CC0,CD0,CE0,XQ0,XR0;\n\ Juan Fernandez Islands: 12: 14: SA: -33.60: 78.85: 4.0: CE0Z:\n\ 3G0Z,CA0Z,CB0Z,CC0Z,CD0Z,CE0I,CE0Z,XQ0Z,XR0Z;\n\ Antarctica: 13: 74: SA: -90.00: 0.00: 0.0: CE9:\n\ 3Y[73],AX0(39)[69],AY1Z[73],AY2Z[73],AY3Z[73],AY4Z[73],AY5Z[73],AY6Z[73],\n\ AY7Z[73],AY8Z[73],AY9Z[73],FT0Y(30)[70],FT1Y(30)[70],FT2Y(30)[70],\n\ FT3Y(30)[70],FT4Y(30)[70],FT5Y(30)[70],FT6Y(30)[70],FT7Y(30)[70],\n\ FT8Y(30)[70],LU1Z[73],LU2Z[73],LU3Z[73],LU4Z[73],LU5Z[73],LU6Z[73],\n\ LU7Z[73],LU8Z[73],LU9Z[73],RI1AN(29)[69],VI0(39)[69],VK0(39)[69],\n\ ZL5(30)[71],ZM5(30)[71],ZS7(38)[67],=8J1RL(39)[67],=DP0GVN(38)[67],\n\ =DP1POL(38)[67],=EM1U[73],=EM1UA[73],=IA0/IZ1KHY/P(29)[70],=KC4AAA(39),\n\ =KC4AAC[73],=KC4USB(12),=KC4USV(30)[71],=RI1ANC(29)[70],=RI1ANZ(39)[69],\n\ =VP8CTR[73];\n\ Cuba: 08: 11: NA: 21.50: 80.00: 5.0: CM:\n\ CL,CM,CO,T4;\n\ Morocco: 33: 37: AF: 32.00: 5.00: 0.0: CN:\n\ 5C,5D,5E,5F,5G,CN;\n\ Bolivia: 10: 12: SA: -17.00: 65.00: 4.0: CP:\n\ CP,CP2[14],CP3[14],CP4[14],CP5[14],CP6[14],CP7[14];\n\ Portugal: 14: 37: EU: 39.50: 8.00: 0.0: CT:\n\ CQ,CR,CS,CT;\n\ Madeira Islands: 33: 36: AF: 32.75: 16.95: 0.0: CT3:\n\ CQ2,CQ3,CQ9,CR3,CR9,CS3,CS9,CT3,CT9;\n\ Azores: 14: 36: EU: 38.70: 27.23: 1.0: CU:\n\ CQ1,CQ8,CR1,CR2,CR8,CS4,CS8,CT8,CU;\n\ Uruguay: 13: 14: SA: -33.00: 56.00: 3.0: CX:\n\ CV,CW,CX;\n\ Sable Island: 05: 09: NA: 43.93: 59.90: 4.0: CY0:\n\ CY0;\n\ St. Paul Island: 05: 09: NA: 47.00: 60.00: 4.0: CY9:\n\ CY9;\n\ Angola: 36: 52: AF: -12.50: -18.50: -1.0: D2:\n\ D2,D3;\n\ Cape Verde: 35: 46: AF: 16.00: 24.00: 1.0: D4:\n\ D4;\n\ Comoros: 39: 53: AF: -11.63: -43.30: -3.0: D6:\n\ D6;\n\ Fed. Rep. of Germany: 14: 28: EU: 51.00: -10.00: -1.0: DL:\n\ DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,Y2,Y3,Y4,Y5,Y6,Y7,\n\ Y8,Y9;\n\ Philippines: 27: 50: OC: 13.00: -122.00: -8.0: DU:\n\ 4D,4E,4F,4G,4H,4I,DU,DV,DW,DX,DY,DZ;\n\ Eritrea: 37: 48: AF: 15.00: -39.00: -3.0: E3:\n\ E3;\n\ Palestine: 20: 39: AS: 31.28: -34.27: -2.0: E4:\n\ E4;\n\ North Cook Islands: 32: 62: OC: -10.02: 161.08: 10.0: E5/n:\n\ =E51PT,=E51WL[63];\n\ South Cook Islands: 32: 63: OC: -21.90: 157.93: 10.0: E5/s:\n\ E5;\n\ Niue: 32: 62: OC: -19.03: 169.85: 11.0: E6:\n\ E6;\n\ Bosnia-Herzegovina: 15: 28: EU: 44.32: -17.57: -1.0: E7:\n\ E7;\n\ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA:\n\ AM,AN,AO,EA,EB,EC,ED,EE,EF,EG,EH,=EA1RCI/KD,=EA1URO/KD,=EA2EZ/P,=EA3HSD/P,\n\ =EA5CC/P,=EA5EZ/P,=EA9HU;\n\ Balearic Islands: 14: 37: EU: 39.60: -2.95: -1.0: EA6:\n\ AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6,=AM70URE/6;\n\ Canary Islands: 33: 36: AF: 28.32: 15.85: 0.0: EA8:\n\ AM8,AN8,AO8,EA8,EB8,EC8,ED8,EE8,EF8,EG8,EH8,=AM70URE/8;\n\ Ceuta & Melilla: 33: 37: AF: 35.90: 5.27: -1.0: EA9:\n\ AM9,AN9,AO9,EA9,EB9,EC9,ED9,EE9,EF9,EG9,EH9,=AM70URE/9,=EA9PD/P;\n\ Ireland: 14: 27: EU: 53.13: 8.02: 0.0: EI:\n\ EI,EJ;\n\ Armenia: 21: 29: AS: 40.40: -44.90: -4.0: EK:\n\ EK;\n\ Liberia: 35: 46: AF: 6.50: 9.50: 0.0: EL:\n\ 5L,5M,6Z,A8,D5,EL;\n\ Iran: 21: 40: AS: 32.00: -53.00: -3.5: EP:\n\ 9B,9C,9D,EP,EQ;\n\ Moldova: 16: 29: EU: 47.00: -29.00: -2.0: ER:\n\ ER;\n\ Estonia: 15: 29: EU: 59.00: -25.00: -2.0: ES:\n\ ES;\n\ Ethiopia: 37: 48: AF: 9.00: -39.00: -3.0: ET:\n\ 9E,9F,ET;\n\ Belarus: 16: 29: EU: 54.00: -28.00: -2.0: EU:\n\ EU,EV,EW;\n\ Kyrgyzstan: 17: 30: AS: 41.70: -74.13: -6.0: EX:\n\ EX,EX0P[31],EX0Q[31],EX2P[31],EX2Q[31],EX6P[31],EX6Q[31],EX7P[31],\n\ EX7Q[31],EX8P[31],EX8Q[31];\n\ Tajikistan: 17: 30: AS: 38.82: -71.22: -5.0: EY:\n\ EY;\n\ Turkmenistan: 17: 30: AS: 38.00: -58.00: -5.0: EZ:\n\ EZ;\n\ France: 14: 27: EU: 46.00: -2.00: -1.0: F:\n\ F,HW,HX,HY,TH,TM,TP,TQ,TV;\n\ Guadeloupe: 08: 11: NA: 16.13: 61.67: 4.0: FG:\n\ FG,=TO1T;\n\ Mayotte: 39: 53: AF: -12.88: -45.15: -3.0: FH:\n\ FH;\n\ St. Barthelemy: 08: 11: NA: 17.90: 62.83: 4.0: FJ:\n\ FJ;\n\ New Caledonia: 32: 56: OC: -21.50: -165.50: -11.0: FK:\n\ FK;\n\ Chesterfield Islands: 30: 56: OC: -19.87: -158.32: -11.0: FK/c:\n\ =TX3X;\n\ Martinique: 08: 11: NA: 14.70: 61.03: 4.0: FM:\n\ FM,=TO5A,=TO5T,=TO7A;\n\ French Polynesia: 32: 63: OC: -17.65: 149.40: 10.0: FO:\n\ FO;\n\ Austral Islands: 32: 63: OC: -23.37: 149.48: 10.0: FO/a:\n\ =TX2A;\n\ Clipperton Island: 07: 10: NA: 10.28: 109.22: 8.0: FO/c:\n\ =TX5P;\n\ Marquesas Islands: 31: 63: OC: -8.92: 140.07: 9.5: FO/m:\n\ =TX5EG;\n\ St. Pierre & Miquelon: 05: 09: NA: 46.77: 56.20: 3.0: FP:\n\ FP,=TO5M;\n\ Reunion Island: 39: 53: AF: -21.12: -55.48: -4.0: FR:\n\ FR;\n\ St. Martin: 08: 11: NA: 18.08: 63.03: 4.0: FS:\n\ FS;\n\ Glorioso Islands: 39: 53: AF: -11.55: -47.28: -4.0: FT/g:\n\ FT0G,FT1G,FT2G,FT3G,FT4G,FT5G,FT6G,FT7G,FT8G,FT9G;\n\ Juan de Nova, Europa: 39: 53: AF: -17.05: -42.72: -3.0: FT/j:\n\ FT0E,FT0J,FT1E,FT1J,FT2E,FT2J,FT3E,FT3J,FT4E,FT4J,FT6E,FT6J,FT7E,FT7J,\n\ FT8E,FT8J,FT9E,FT9J;\n\ Tromelin Island: 39: 53: AF: -15.88: -54.50: -4.0: FT/t:\n\ FT0T,FT1T,FT2T,FT3T,FT4T,FT5T,FT6T,FT7T,FT8T,FT9T;\n\ Crozet Island: 39: 68: AF: -46.42: -51.75: -5.0: FT/w:\n\ FT0W,FT4W,FT5W,FT8W;\n\ Kerguelen Islands: 39: 68: AF: -49.00: -69.27: -5.0: FT/x:\n\ FT0X,FT2X,FT4X,FT5X,FT8X;\n\ Amsterdam & St. Paul Is.: 39: 68: AF: -37.85: -77.53: -5.0: FT/z:\n\ FT0Z,FT1Z,FT2Z,FT3Z,FT4Z,FT5Z,FT6Z,FT7Z,FT8Z;\n\ Wallis & Futuna Islands: 32: 62: OC: -13.30: 176.20: -12.0: FW:\n\ FW,TW;\n\ French Guiana: 09: 12: SA: 4.00: 53.00: 3.0: FY:\n\ FY,=TO1A;\n\ England: 14: 27: EU: 52.77: 1.47: 0.0: G:\n\ 2E,G,M;\n\ Isle of Man: 14: 27: EU: 54.20: 4.53: 0.0: GD:\n\ 2D,GD,GT,MD,MT,=GB19CIM;\n\ Northern Ireland: 14: 27: EU: 54.73: 6.68: 0.0: GI:\n\ 2I,GI,GN,MI,MN,=GB19CGI,=GB19CNI,=GB2MAC,=GB3NGI,=GB4SOS,=GB4UAS;\n\ Jersey: 14: 27: EU: 49.22: 2.18: 0.0: GJ:\n\ 2J,GH,GJ,MH,MJ,=GB19CJ;\n\ Shetland Islands: 14: 27: EU: 60.50: 1.50: 0.0: *GM/s:\n\ =2M0BDR,=2M0BDT,=2M0CPN,=2M0GFC,=2M0SEG,=2M0SPX,=2M0ZET,=GB0DAW,=GB2DAW,\n\ =GB2ELH,=GB3LER,=GB3LER/B,=GB4LER,=GM0AVR,=GM0CXQ,=GM0EKM,=GM0GFL,=GM0ILB,\n\ =GM0JDB,=GM1FGN,=GM1KKI,=GM1ZNR,=GM3WHT,=GM3ZET,=GM4IPK,=GM4JPI,=GM4LBE,\n\ =GM4LER,=GM4PXG,=GM4SLV,=GM4SSA,=GM4WXQ,=GM4ZHL,=GM6RQW,=GM6YQA,=GM7AFE,\n\ =GM7GWW,=GM8LNH,=GM8MMA,=GM8YEC,=GS3ZET,=MM0LSM,=MM0NQY,=MM0VIK,=MM0XAU,\n\ =MM0ZAL,=MM0ZCG,=MM0ZRC,=MM1FJM,=MM3VQO,=MM5PSL,=MM5YLO,=MM6BDU,=MM6BZQ,\n\ =MM6IKB,=MM6IMB,=MM6MFA,=MM6PTE,=MM6SJK,=MM6YLO,=MM6ZBG,=MM6ZDW,=MM8A,\n\ =MS0ZCG,=MS0ZET;\n\ Scotland: 14: 27: EU: 56.82: 4.18: 0.0: GM:\n\ 2A,2M,GM,GS,MA,MM,MS,=GB0DAW,=GB0SSB,=GB19CGM,=GB19CS,=GB2DAW,=GB2ELH,\n\ =GB2JCM,=GB2KDR,=GB2MOF,=GB2NMM,=GB2OL,=GB2OWM,=GB2RDR,=GB3ANG,=GB3LER,\n\ =GB3LER/B,=GB4LER;\n\ Guernsey: 14: 27: EU: 49.45: 2.58: 0.0: GU:\n\ 2U,GP,GU,MP,MU,=GB19CG;\n\ Wales: 14: 27: EU: 52.28: 3.73: 0.0: GW:\n\ 2W,GC,GW,MC,MW,=GB0ATM,=GB19CGW,=GB19CW,=GB19SG,=GB2HMM,=GB2IMD,=GB2ORM,\n\ =GB2TD,=GB2VK;\n\ Solomon Islands: 28: 51: OC: -9.00: -160.00: -11.0: H4:\n\ H4;\n\ Temotu Province: 32: 51: OC: -10.72: -165.80: -11.0: H40:\n\ H40;\n\ Hungary: 15: 28: EU: 47.12: -19.28: -1.0: HA:\n\ HA,HG;\n\ Switzerland: 14: 28: EU: 46.87: -8.12: -1.0: HB:\n\ HB,HE;\n\ Liechtenstein: 14: 28: EU: 47.13: -9.57: -1.0: HB0:\n\ HB0,HE0;\n\ Ecuador: 10: 12: SA: -1.40: 78.40: 5.0: HC:\n\ HC,HD;\n\ Galapagos Islands: 10: 12: SA: -0.78: 91.03: 6.0: HC8:\n\ HC8,HD8;\n\ Haiti: 08: 11: NA: 19.02: 72.18: 5.0: HH:\n\ 4V,HH;\n\ Dominican Republic: 08: 11: NA: 19.13: 70.68: 4.0: HI:\n\ HI;\n\ Colombia: 09: 12: SA: 5.00: 74.00: 5.0: HK:\n\ 5J,5K,HJ,HK;\n\ San Andres & Providencia: 07: 11: NA: 12.55: 81.72: 5.0: HK0/a:\n\ 5J0,5K0,HJ0,HK0;\n\ Malpelo Island: 09: 12: SA: 3.98: 81.58: 5.0: HK0/m:\n\ HJ0M,HK0M,=HK0TU;\n\ Republic of Korea: 25: 44: AS: 36.23: -127.90: -9.0: HL:\n\ 6K,6L,6M,6N,D7,D8,D9,DS,DT,HL,KL9K;\n\ Panama: 07: 11: NA: 9.00: 80.00: 5.0: HP:\n\ 3E,3F,H3,H8,H9,HO,HP;\n\ Honduras: 07: 11: NA: 15.00: 87.00: 6.0: HR:\n\ HQ,HR;\n\ Thailand: 26: 49: AS: 12.60: -99.70: -7.0: HS:\n\ E2,HS;\n\ Vatican City: 15: 28: EU: 41.90: -12.47: -1.0: HV:\n\ HV;\n\ Saudi Arabia: 21: 39: AS: 24.20: -43.83: -3.0: HZ:\n\ 7Z,8Z,HZ;\n\ Italy: 15: 28: EU: 42.82: -12.58: -1.0: I:\n\ I,=4U0WFP,=4U1GSC,=4U5F,=4U73B;\n\ African Italy: 33: 37: AF: 35.67: -12.67: -1.0: *IG9:\n\ IG9,IH9;\n\ Sardinia: 15: 28: EU: 40.15: -9.27: -1.0: IS:\n\ IM0,IS,IW0U,IW0V,IW0W,IW0X,IW0Y,IW0Z,=II0ICH,=II0IDP,=II0M,=II0SRE,=IQ0AG,\n\ =IQ0AH,=IQ0AH/P,=IQ0AI,=IQ0AK,=IQ0AL,=IQ0AM,=IQ0EH,=IQ0HO,=IQ0ID,=IQ0ID/P,\n\ =IQ0NU,=IQ0NU/P,=IQ0NV,=IQ0NV/P,=IQ0OG,=IQ0OH,=IQ0QP,=IQ0SS,=IY0GA;\n\ Sicily: 15: 28: EU: 37.50: -14.00: -1.0: *IT9:\n\ IB9,ID9,IE9,IF9,II9,IJ9,IO9,IQ9,IR9,IT9,IU9,IW9,IY9,=II0GDF/9;\n\ Djibouti: 37: 48: AF: 11.75: -42.35: -3.0: J2:\n\ J2;\n\ Grenada: 08: 11: NA: 12.13: 61.68: 4.0: J3:\n\ J3;\n\ Guinea-Bissau: 35: 46: AF: 12.02: 14.80: 0.0: J5:\n\ J5;\n\ St. Lucia: 08: 11: NA: 13.87: 61.00: 4.0: J6:\n\ J6;\n\ Dominica: 08: 11: NA: 15.43: 61.35: 4.0: J7:\n\ J7;\n\ St. Vincent: 08: 11: NA: 13.23: 61.20: 4.0: J8:\n\ J8;\n\ Japan: 25: 45: AS: 36.40: -138.38: -9.0: JA:\n\ 7J,7K,7L,7M,7N,8J,8K,8L,8M,8N,JA,JE,JF,JG,JH,JI,JJ,JK,JL,JM,JN,JO,JP,JQ,\n\ JR,JS;\n\ Minami Torishima: 27: 90: OC: 24.28: -153.97: -10.0: JD/m:\n\ =JD1YAA,=JG1RHN/JD1,=JG8NQJ/JD1;\n\ Ogasawara: 27: 45: AS: 27.05: -142.20: -9.0: JD/o:\n\ JD1;\n\ Mongolia: 23: 32: AS: 46.77: -102.17: -7.0: JT:\n\ JT,JU,JV,JT2[33],JT3[33],JU2[33],JU3[33],JV2[33],JV3[33];\n\ Svalbard: 40: 18: EU: 78.00: -16.00: -1.0: JW:\n\ JW;\n\ Bear Island: 40: 18: EU: 74.43: -19.08: -1.0: *JW/b:\n\ =JW/LB2PG;\n\ Jan Mayen: 40: 18: EU: 71.05: 8.28: 1.0: JX:\n\ JX;\n\ Jordan: 20: 39: AS: 31.18: -36.42: -2.0: JY:\n\ JY;\n\ United States: 05: 08: NA: 37.53: 91.67: 5.0: K:\n\ AA,AB,AC,AD,AE,AF,AG,AI,AJ,AK,K,N,W,=4U1WB(5)[8],=AA0O(5)[8],=AA2IL(3)[6],\n\ =AA4DD(4)[8],=AA4R(4)[8],=AA7TV(4)[7],=AA9HQ(5)[8],=AB4B(4)[8],\n\ =AB4EJ(4)[8],=AB4GG(4)[8],=AB4IQ(4)[8],=AB4KJ(4)[8],=AB5OR(4)[8],\n\ =AB8RL(5)[8],=AB9DU(4)[7],=AC4CA(4)[7],=AC4G(4)[8],=AC4GW(4)[8],\n\ =AC6WI(5)[8],=AC6ZM(4)[8],=AC7AF(4)[7],=AC7P(4)[7],=AC8Y(5)[8],\n\ =AD1C(4)[7],=AD4EB(4)[8],=AD4TA(4)[8],=AD8J(5)[8],=AE7AP(4)[6],\n\ =AG1RL(3)[6],=AG4W(4)[8],=AG5Z(4)[8],=AH0U(3)[6],=AH2O(5)[8],=AH6AX(5)[8],\n\ =AI4DB(4)[8],=AI9K(4)[7],=AJ4A(4)[8],=AJ4F(4)[7],=AJ7G(5)[8],=AL0A(5)[8],\n\ =AL4B(4)[8],=AL7GI(4)[8],=AL7RF(3)[6],=G8ERJ(5)[8],=K0ACP(4)[8],\n\ =K0AU(3)[6],=K0EJ(4)[8],=K0IP(3)[6],=K0LUZ(5)[8],=K0NW(3)[6],=K0PJ(4)[8],\n\ =K0SN(4)[6],=K0TQ(4)[8],=K0ZR(5)[8],=K1DW(4)[7],=K1GU(4)[8],=K1KD(4)[7],\n\ =K1LT(4)[8],=K1PQS(4)[7],=K2DSW(4)[7],=K2GMY(3)[6],=K2KR(4)[7],\n\ =K2PM(4)[8],=K2PO(3)[6],=K2RD(3)[6],=K2UR(4)[8],=K2VV(4)[7],=K3DMG(4)[8],\n\ =K3EST(3)[6],=K3IE(4)[8],=K3JWI(4)[8],=K3PA(4)[7],=K3WT(4)[7],\n\ =K3WYC(3)[6],=K3YP(4)[8],=K4AB(4)[8],=K4AFE(4)[8],=K4AMC(4)[8],\n\ =K4AVX(4)[8],=K4BX(4)[8],=K4CWW(4)[8],=K4DG(4)[7],=K4DXV(4)[8],\n\ =K4FN(4)[8],=K4FT(4)[8],=K4HAL(4)[8],=K4IE(4)[8],=K4IU(4)[7],=K4LPQ(4)[8],\n\ =K4MMW(4)[8],=K4OAQ(4)[8],=K4OWR(4)[8],=K4RO(4)[8],=K4TCG(4)[8],\n\ =K4TZ(4)[8],=K4WG(4)[8],=K4WI(4)[8],=K4WW(4)[8],=K4XU(3)[6],=K4YJ(4)[8],\n\ =K4ZGB(4)[8],=K5AUP(5)[8],=K5EK(5)[8],=K5KG(5)[8],=K5OA(3)[6],\n\ =K5VIP(5)[8],=K5WK(4)[8],=K5ZD(5)[8],=K5ZM(3)[6],=K6XT(4)[7],=K7ABV(4)[6],\n\ =K7BV(5)[8],=K7CS(4)[8],=K7DR(4)[8],=K7IA(4)[7],=K7JOE(4)[8],=K7OM(5)[8],\n\ =K7QA(4)[6],=K7SCX(4)[7],=K7SV(5)[8],=K7TD(4)[7],=K7VU(4)[7],=K7ZYV(4)[8],\n\ =K8AC(5)[8],=K8ARY(5)[8],=K8CN(5)[8],=K8FU(4)[7],=K8GU(5)[8],=K8IA(3)[6],\n\ =K8JQ(5)[8],=K8LBQ(5)[8],=K8LF(5)[8],=K8LS(4)[7],=K8NYG(5)[8],=K8PO(5)[8],\n\ =K8SYH(5)[8],=K9DR(4)[7],=K9DU(4)[7],=K9JF(3)[6],=K9JM(3)[6],=K9OM(5)[8],\n\ =K9OR(4)[7],=K9OZ(4)[7],=K9RS(5)[8],=K9WA(4)[7],=K9WZB(3)[6],=K9YC(3)[6],\n\ =KA1KIX(4)[8],=KA3DRR(3)[6],=KA3MTT(4)[8],=KA4BVG(4)[8],=KA4GAV(4)[7],\n\ =KA4OTB(4)[8],=KA5DWI(3)[6],=KA8HDE(4)[7],=KA8Q(5)[8],=KA9FOX(4)[7],\n\ =KA9VVQ(4)[7],=KB7Q(4)[6],=KB8KMH(5)[8],=KB8V(5)[8],=KB9S(4)[7],\n\ =KC2LM(4)[7],=KC4HW(4)[8],=KC4NX(4)[8],=KC4SAW(4)[8],=KC4TEO(4)[8],\n\ =KC4WQ(4)[8],=KC6X(4)[7],=KC7QY(4)[7],=KC9K(4)[7],=KD0EE(4)[8],\n\ =KD2KW(4)[7],=KD4ADC(4)[8],=KD5DD(4)[8],=KD5M(5)[8],=KD9BSO(4)[7],\n\ =KD9LA(5)[8],=KE0L(4)[8],=KE0YI(4)[8],=KE1B(3)[6],=KE2VB(3)[6],\n\ =KE3K(4)[8],=KE4KY(4)[8],=KE8FT(3)[6],=KF4AV(4)[8],=KF5BA(4)[8],\n\ =KF5MU(4)[8],=KG4CUY(4)[8],=KG5HVO(4)[8],=KG6MC(5)[8],=KH2D(5)[8],\n\ =KH2GM(5)[8],=KH6CT(5)[8],=KH6M(5)[8],=KH6VM(3)[6],=KH6XS(3)[6],\n\ =KI6DY(4)[7],=KI6QDH(4)[7],=KJ4AOM(4)[8],=KJ4IWZ(4)[8],=KJ4KKD(4)[8],\n\ =KJ4M(4)[8],=KK9A(5)[8],=KK9N(4)[7],=KL0MP(5)[8],=KL2RA(4)[7],\n\ =KL4CZ(4)[6],=KL7IKV(3)[6],=KL7JR(5)[8],=KL7QW(4)[7],=KL7SK(3)[6],\n\ =KM4FO(4)[8],=KM4JA(4)[8],=KM7W(4)[6],=KM9R(3)[6],=KN1CBR(4)[7],\n\ =KN4DUA(4)[8],=KN4FRG(4)[7],=KN8U(5)[8],=KO0Z(4)[8],=KO4OL(4)[8],\n\ =KO9V(4)[7],=KP2XX(4)[7],=KP4KD(5)[8],=KP4M(5)[8],=KQ9J(4)[7],=KR4F(4)[8],\n\ =KS0CW(5)[8],=KS4L(4)[8],=KS4X(4)[8],=KS7T(4)[6],=KS9W(4)[7],=KT3M(4)[7],\n\ =KT4O(4)[8],=KT4RR(4)[8],=KU1CW(3)[6],=KU8E(5)[8],=KV8S(4)[7],=KW4J(4)[8],\n\ =KW7D(4)[7],=KX4FR(4)[8],=KX4WB(4)[8],=KX4X(4)[8],=KY0Q(4)[8],=KY4F(4)[8],\n\ =KY4KD(4)[8],=KZ1W(3)[6],=KZ9V(4)[7],=N1JM(3)[6],=N1RU(4)[8],=N1XK(4)[7],\n\ =N2AU(3)[6],=N2BJ(4)[8],=N2IC(4)[7],=N2NS(3)[6],=N3BB(4)[7],=N3BUO(4)[7],\n\ =N3CI(4)[7],=N3RC(3)[6],=N3ZZ(3)[6],=N4ARO(4)[8],=N4AU(4)[8],=N4BAA(4)[8],\n\ =N4BCB(4)[8],=N4BCD(4)[8],=N4DW(4)[8],=N4HAI(4)[8],=N4HID(4)[8],\n\ =N4KC(4)[8],=N4KG(4)[8],=N4KH(4)[8],=N4NA(4)[8],=N4NO(4)[8],=N4OGW(4)[8],\n\ =N4QS(4)[8],=N4SL(4)[6],=N4TZ(4)[8],=N4UC(4)[8],=N4UW(4)[8],=N4VI(4)[7],\n\ =N4VV(4)[8],=N4WE(4)[8],=N4ZY(4)[8],=N4ZZ(4)[8],=N5CR(3)[6],=N5CW(4)[8],\n\ =N5DX(5)[8],=N5RP(4)[8],=N5SMQ(5)[8],=N5TB(5)[8],=N5TOO(5)[8],=N5YT(4)[8],\n\ =N5ZO(3)[6],=N6AR(5)[8],=N6DW(5)[8],=N6FS(4)[8],=N6PAT(5)[8],=N7DF(4)[7],\n\ =N7DR(4)[7],=N7FLT(4)[6],=N7IP(4)[6],=N7IV(4)[7],=N7MZW(4)[7],=N7NG(4)[7],\n\ =N7RCS(5)[8],=N7US(4)[8],=N7WY(4)[7],=N7ZZ(4)[8],=N8AID(5)[8],=N8GU(5)[8],\n\ =N8II(5)[8],=N8NA(5)[8],=N8OO(4)[7],=N8PR(5)[8],=N8RA(5)[8],=N8WXQ(5)[8],\n\ =N9CIQ(4)[7],=N9GB(4)[7],=N9JF(4)[7],=N9NA(3)[6],=N9NB(5)[8],=N9NC(5)[8],\n\ =N9NM(4)[7],=N9RV(4)[6],=N9SB(4)[7],=N9VPV(4)[7],=NA2CC(3)[6],=NA4K(4)[8],\n\ =NA5NN(4)[8],=NA9RB(4)[7],=ND2T(3)[6],=ND3N(4)[8],=ND4Y(4)[8],=NE8P(5)[8],\n\ =NE9U(4)[7],=NF4J(4)[8],=NH6T(4)[8],=NI7R(5)[8],=NJ8J(5)[8],=NK8Q(5)[8],\n\ =NL7CQ(4)[7],=NL7D(3)[6],=NL7QC(4)[7],=NL7XM(5)[8],=NN1N(4)[7],\n\ =NN4SA(4)[8],=NN5O(4)[8],=NN7A(4)[7],=NN7CW(5)[8],=NO9E(5)[8],\n\ =NP2GG(5)[8],=NP3K(5)[8],=NQ6N(4)[8],=NR5W(3)[6],=NR7DX(4)[6],=NS4X(4)[8],\n\ =NW7R(5)[8],=NW8U(5)[8],=NX1P(3)[6],=NY6DX(5)[8],=W0BR(5)[8],=W0CN(5)[8],\n\ =W0JX(4)[8],=W0MHK(5)[8],=W0PV(5)[8],=W0QQG(5)[8],=W0RIC(3)[6],\n\ =W0SK(4)[8],=W0ZP(4)[8],=W1GKT(4)[8],=W1NN(4)[8],=W1PDI(4)[8],=W1PR(3)[6],\n\ =W1RH(3)[6],=W1SRD(3)[6],=W2ACY(4)[7],=W2FV(3)[6],=W2GS(4)[7],\n\ =W2VJN(3)[6],=W3DQN(4)[7],=W3HDH(4)[8],=W3HKK(4)[8],=W3TB(4)[8],\n\ =W4BCG(4)[8],=W4DAN(4)[8],=W4ER(4)[8],=W4GKM(4)[8],=W4GZX(4)[8],\n\ =W4JSI(4)[8],=W4KW(4)[8],=W4LC(4)[8],=W4LID(4)[8],=W4NBS(4)[8],\n\ =W4NI(4)[8],=W4NZ(4)[8],=W4PF(4)[8],=W4TLK(4)[8],=W4TTM(4)[8],\n\ =W4UAL(4)[8],=W4UT(4)[8],=W5HIO(4)[8],=W5JR(5)[8],=W5MX(4)[8],=W5NZ(4)[8],\n\ =W5UE(4)[8],=W5VE(5)[8],=W5VS(5)[8],=W5XB(5)[8],=W6GMT(4)[7],=W6KGP(4)[7],\n\ =W6LFB(4)[7],=W6NWS(5)[8],=W6RLL(3)[7],=W6UB(4)[8],=W6XR(5)[8],\n\ =W6YTG(5)[8],=W7DO(5)[8],=W7EE(4)[6],=W7HJ(5)[8],=W7IGC(5)[8],=W7II(4)[7],\n\ =W7IY(5)[8],=W7KF(4)[6],=W7RY(4)[7],=W7SE(4)[7],=W7UT(4)[7],=W7XU(4)[7],\n\ =W8AT(5)[8],=W8FJ(5)[8],=W8FN(4)[7],=W8HAP(5)[8],=W8HGH(5)[8],=W8KA(3)[6],\n\ =W8LYJ(5)[8],=W8OV(4)[7],=W8TK(3)[6],=W8WEJ(5)[8],=W9CF(3)[6],=W9DC(5)[8],\n\ =W9ET(4)[7],=W9IL(5)[8],=W9JA(4)[7],=W9JEF(4)[7],=W9KKN(3)[6],\n\ =W9LHG(4)[7],=W9MAF(4)[7],=W9PL(3)[6],=W9RM(4)[7],=W9RNY(4)[7],\n\ =WA0WWW(3)[6],=WA1FCN(4)[8],=WA1UJU(4)[8],=WA2VYA(4)[7],=WA3C(4)[8],\n\ =WA4JA(4)[8],=WA5POK(4)[8],=WA8KAN(5)[8],=WA8OJR(5)[8],=WA8ZBT(4)[7],\n\ =WB2JEP(3)[6],=WB3JFS(3)[6],=WB4YDL(4)[8],=WB4YDY(4)[8],=WB7S(4)[7],\n\ =WB8BPU(5)[8],=WB8IMY(5)[8],=WB8YYY(5)[8],=WB9QAF(4)[7],=WC7S(4)[7],\n\ =WD5F(5)[8],=WE6EZ(4)[7],=WF3H(4)[7],=WF7T(4)[8],=WF9A(5)[8],=WH0AI(4)[7],\n\ =WH6AQ(5)[8],=WH6LE(5)[8],=WH7R(4)[7],=WI4T(4)[7],=WJ9B(3)[6],\n\ =WL7OU(4)[7],=WM5DX(4)[8],=WN1G(4)[8],=WN7S(5)[8],=WP2B(4)[7],\n\ =WP3ME(5)[8],=WQ3U(3)[6],=WQ5L(4)[8],=WQ9T(4)[7],=WR3O(4)[8],=WR5J(3)[6],\n\ =WS6K(4)[8],=WS6X(5)[8],=WS9M(5)[8],=WT2P(4)[8],=WT8WV(5)[8],=WU0B(5)[8],\n\ =WU9B(3)[6],=WV4P(4)[8],=WV8SW(5)[8],=WW4R(4)[8],=WW5M(4)[8],=WX4W(4)[8],\n\ =WX5S(3)[6],=WY6K(4)[7],=WY7FD(4)[7],=WZ1Y(4)[7],=WZ4F(4)[8],=WZ7I(5)[8],\n\ =WZ8T(3)[6];\n\ Guantanamo Bay: 08: 11: NA: 20.00: 75.00: 5.0: KG4:\n\ KG4,=KG4AY,=KG4WH;\n\ Mariana Islands: 27: 64: OC: 15.18: -145.72: -10.0: KH0:\n\ AH0,KH0,NH0,WH0,=K0W,=K8KH,=K8RN,=NH2B;\n\ Baker & Howland Islands: 31: 61: OC: 0.00: 176.00: 12.0: KH1:\n\ AH1,KH1,NH1,WH1;\n\ Guam: 27: 64: OC: 13.37: -144.70: -10.0: KH2:\n\ AH2,KH2,NH2,WH2,=AH0FM,=KA1I,=KB5OXR,=KF7BMU,=KG6DX,=KG6JDX,=KH0UM,\n\ =KK6GVF,=NH0Q;\n\ Johnston Island: 31: 61: OC: 16.72: 169.53: 10.0: KH3:\n\ AH3,KH3,NH3,WH3;\n\ Midway Island: 31: 61: OC: 28.20: 177.37: 11.0: KH4:\n\ AH4,KH4,NH4,WH4;\n\ Palmyra & Jarvis Islands: 31: 61: OC: 5.87: 162.07: 11.0: KH5:\n\ AH5,KH5,NH5,WH5;\n\ Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6:\n\ AH6,AH7,KH6,KH7,NH6,NH7,WH6,WH7,=AA7LE,=AC7N,=AC9PT,=AK2J,=K2GT,=K3NW,\n\ =K4XS,=K6BU,=K6MIO,=K9FD,=KA7BSK,=KB1UHL,=KB6EGA,=KB6INB,=KB7WDC,=KC0YIH,\n\ =KC9KEX,=KD6NVX,=KE4DYE,=KE7FJA,=KE7LWN,=KE7QML,=KF6RLP,=KF7IJL,=KH0WJ,\n\ =KH3AE,=KH8Z,=KI4YOG,=KI7QZQ,=KK6GM,=KK6QAI,=KK6RM,=KL0TK,=KM6IK,=KQ6M,\n\ =N1CBF,=N1TEE,=N1VOP,=N3FUR,=N3GWR,=N4ERA,=W6KEV,=W7NX,=W7OO,=WA6IIQ,\n\ =WA6JJQ,=WA8JQP,=WB0TZQ,=WB4JTT,=WB6PIO,=WB8NCD,=WD0LFN,=WY6F;\n\ Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K:\n\ AH7K,KH7K,NH7K,WH7K;\n\ American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8:\n\ AH8,KH8,NH8,WH8;\n\ Swains Island: 32: 62: OC: -11.05: 171.25: 11.0: KH8/s:\n\ =KH8S/NA6M;\n\ Wake Island: 31: 65: OC: 19.28: -166.63: -12.0: KH9:\n\ AH9,KH9,NH9,WH9;\n\ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL:\n\ AL,KL,NL,WL,=K1KAO,=K4HOE,=K7SGA,=KA1NCN,=KB3CYB,=KB4DX,=KC0YSW,=KC1KPL,\n\ =KC5YOX,=KC5ZAA,=KD0JJB,=KD5WYP,=KD7BBX,=KF3L,=KF6IAO,=KF6RMG,=KF7GKY,\n\ =KG5MIO,=KG7JVJ,=KG7OUF,=KI6BGR,=KJ6DCH,=KM6NOL,=KN4HGD,=KW1W,=N1NDA,\n\ =N1TX,=N6ZZX,=N7DBN,=N7IA,=N8SUG,=NM0H,=NW7F,=W3MKG,=WH6DPL;\n\ Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1:\n\ KP1,NP1,WP1;\n\ US Virgin Islands: 08: 11: NA: 17.73: 64.80: 4.0: KP2:\n\ KP2,NP2,WP2,=K8RF,=KV4FZ,=W4LIS;\n\ Puerto Rico: 08: 11: NA: 18.18: 66.55: 4.0: KP4:\n\ KP3,KP4,NP3,NP4,WP3,WP4,=AA0WX,=K4LCR,=KB0JRR,=KC2TE,=KC2VCR,=KC8BFN,\n\ =KD2KPC,=KD9GIZ,=KG4GYO,=KK4DCX,=KP2Z,=N4CIE,=N6NVD;\n\ Desecheo Island: 08: 11: NA: 18.08: 67.88: 4.0: KP5:\n\ KP5,NP5,WP5;\n\ Norway: 14: 18: EU: 61.00: -9.00: -1.0: LA:\n\ LA,LB,LC,LD,LE,LF,LG,LH,LI,LJ,LK,LL,LM,LN;\n\ Argentina: 13: 14: SA: -34.80: 65.92: 3.0: LU:\n\ AY,AZ,L1,L2,L3,L4,L5,L6,L7,L8,L9,LO,LP,LQ,LR,LS,LT,LU,LV,LW,AY0V[16],\n\ AY0W[16],AY0X[16],AY0Y[16],AY1V[16],AY1W[16],AY1X[16],AY1Y[16],AY2V[16],\n\ AY2W[16],AY2X[16],AY2Y[16],AY3V[16],AY3W[16],AY3X[16],AY3Y[16],AY4V[16],\n\ AY4W[16],AY4X[16],AY4Y[16],AY5V[16],AY5W[16],AY5X[16],AY5Y[16],AY6V[16],\n\ AY6W[16],AY6X[16],AY6Y[16],AY7V[16],AY7W[16],AY7X[16],AY7Y[16],AY8V[16],\n\ AY8W[16],AY8X[16],AY8Y[16],AY9V[16],AY9W[16],AY9X[16],AY9Y[16],AZ0V[16],\n\ AZ0W[16],AZ0X[16],AZ0Y[16],AZ1V[16],AZ1W[16],AZ1X[16],AZ1Y[16],AZ2V[16],\n\ AZ2W[16],AZ2X[16],AZ2Y[16],AZ3V[16],AZ3W[16],AZ3X[16],AZ3Y[16],AZ4V[16],\n\ AZ4W[16],AZ4X[16],AZ4Y[16],AZ5V[16],AZ5W[16],AZ5X[16],AZ5Y[16],AZ6V[16],\n\ AZ6W[16],AZ6X[16],AZ6Y[16],AZ7V[16],AZ7W[16],AZ7X[16],AZ7Y[16],AZ8V[16],\n\ AZ8W[16],AZ8X[16],AZ8Y[16],AZ9V[16],AZ9W[16],AZ9X[16],AZ9Y[16],L20V[16],\n\ L20W[16],L20X[16],L20Y[16],L21V[16],L21W[16],L21X[16],L21Y[16],L22V[16],\n\ L22W[16],L22X[16],L22Y[16],L23V[16],L23W[16],L23X[16],L23Y[16],L24V[16],\n\ L24W[16],L24X[16],L24Y[16],L25V[16],L25W[16],L25X[16],L25Y[16],L26V[16],\n\ L26W[16],L26X[16],L26Y[16],L27V[16],L27W[16],L27X[16],L27Y[16],L28V[16],\n\ L28W[16],L28X[16],L28Y[16],L29V[16],L29W[16],L29X[16],L29Y[16],L30V[16],\n\ L30W[16],L30X[16],L30Y[16],L31V[16],L31W[16],L31X[16],L31Y[16],L32V[16],\n\ L32W[16],L32X[16],L32Y[16],L33V[16],L33W[16],L33X[16],L33Y[16],L34V[16],\n\ L34W[16],L34X[16],L34Y[16],L35V[16],L35W[16],L35X[16],L35Y[16],L36V[16],\n\ L36W[16],L36X[16],L36Y[16],L37V[16],L37W[16],L37X[16],L37Y[16],L38V[16],\n\ L38W[16],L38X[16],L38Y[16],L39V[16],L39W[16],L39X[16],L39Y[16],L40V[16],\n\ L40W[16],L40X[16],L40Y[16],L41V[16],L41W[16],L41X[16],L41Y[16],L42V[16],\n\ L42W[16],L42X[16],L42Y[16],L43V[16],L43W[16],L43X[16],L43Y[16],L44V[16],\n\ L44W[16],L44X[16],L44Y[16],L45V[16],L45W[16],L45X[16],L45Y[16],L46V[16],\n\ L46W[16],L46X[16],L46Y[16],L47V[16],L47W[16],L47X[16],L47Y[16],L48V[16],\n\ L48W[16],L48X[16],L48Y[16],L49V[16],L49W[16],L49X[16],L49Y[16],L50V[16],\n\ L50W[16],L50X[16],L50Y[16],L51V[16],L51W[16],L51X[16],L51Y[16],L52V[16],\n\ L52W[16],L52X[16],L52Y[16],L53V[16],L53W[16],L53X[16],L53Y[16],L54V[16],\n\ L54W[16],L54X[16],L54Y[16],L55V[16],L55W[16],L55X[16],L55Y[16],L56V[16],\n\ L56W[16],L56X[16],L56Y[16],L57V[16],L57W[16],L57X[16],L57Y[16],L58V[16],\n\ L58W[16],L58X[16],L58Y[16],L59V[16],L59W[16],L59X[16],L59Y[16],L60V[16],\n\ L60W[16],L60X[16],L60Y[16],L61V[16],L61W[16],L61X[16],L61Y[16],L62V[16],\n\ L62W[16],L62X[16],L62Y[16],L63V[16],L63W[16],L63X[16],L63Y[16],L64V[16],\n\ L64W[16],L64X[16],L64Y[16],L65V[16],L65W[16],L65X[16],L65Y[16],L66V[16],\n\ L66W[16],L66X[16],L66Y[16],L67V[16],L67W[16],L67X[16],L67Y[16],L68V[16],\n\ L68W[16],L68X[16],L68Y[16],L69V[16],L69W[16],L69X[16],L69Y[16],L70V[16],\n\ L70W[16],L70X[16],L70Y[16],L71V[16],L71W[16],L71X[16],L71Y[16],L72V[16],\n\ L72W[16],L72X[16],L72Y[16],L73V[16],L73W[16],L73X[16],L73Y[16],L74V[16],\n\ L74W[16],L74X[16],L74Y[16],L75V[16],L75W[16],L75X[16],L75Y[16],L76V[16],\n\ L76W[16],L76X[16],L76Y[16],L77V[16],L77W[16],L77X[16],L77Y[16],L78V[16],\n\ L78W[16],L78X[16],L78Y[16],L79V[16],L79W[16],L79X[16],L79Y[16],L80V[16],\n\ L80W[16],L80X[16],L80Y[16],L81V[16],L81W[16],L81X[16],L81Y[16],L82V[16],\n\ L82W[16],L82X[16],L82Y[16],L83V[16],L83W[16],L83X[16],L83Y[16],L84V[16],\n\ L84W[16],L84X[16],L84Y[16],L85V[16],L85W[16],L85X[16],L85Y[16],L86V[16],\n\ L86W[16],L86X[16],L86Y[16],L87V[16],L87W[16],L87X[16],L87Y[16],L88V[16],\n\ L88W[16],L88X[16],L88Y[16],L89V[16],L89W[16],L89X[16],L89Y[16],L90V[16],\n\ L90W[16],L90X[16],L90Y[16],L91V[16],L91W[16],L91X[16],L91Y[16],L92V[16],\n\ L92W[16],L92X[16],L92Y[16],L93V[16],L93W[16],L93X[16],L93Y[16],L94V[16],\n\ L94W[16],L94X[16],L94Y[16],L95V[16],L95W[16],L95X[16],L95Y[16],L96V[16],\n\ L96W[16],L96X[16],L96Y[16],L97V[16],L97W[16],L97X[16],L97Y[16],L98V[16],\n\ L98W[16],L98X[16],L98Y[16],L99V[16],L99W[16],L99X[16],L99Y[16],LO0V[16],\n\ LO0W[16],LO0X[16],LO0Y[16],LO1V[16],LO1W[16],LO1X[16],LO1Y[16],LO2V[16],\n\ LO2W[16],LO2X[16],LO2Y[16],LO3V[16],LO3W[16],LO3X[16],LO3Y[16],LO4V[16],\n\ LO4W[16],LO4X[16],LO4Y[16],LO5V[16],LO5W[16],LO5X[16],LO5Y[16],LO6V[16],\n\ LO6W[16],LO6X[16],LO6Y[16],LO7V[16],LO7W[16],LO7X[16],LO7Y[16],LO8V[16],\n\ LO8W[16],LO8X[16],LO8Y[16],LO9V[16],LO9W[16],LO9X[16],LO9Y[16],LP0V[16],\n\ LP0W[16],LP0X[16],LP0Y[16],LP1V[16],LP1W[16],LP1X[16],LP1Y[16],LP2V[16],\n\ LP2W[16],LP2X[16],LP2Y[16],LP3V[16],LP3W[16],LP3X[16],LP3Y[16],LP4V[16],\n\ LP4W[16],LP4X[16],LP4Y[16],LP5V[16],LP5W[16],LP5X[16],LP5Y[16],LP6V[16],\n\ LP6W[16],LP6X[16],LP6Y[16],LP7V[16],LP7W[16],LP7X[16],LP7Y[16],LP8V[16],\n\ LP8W[16],LP8X[16],LP8Y[16],LP9V[16],LP9W[16],LP9X[16],LP9Y[16],LQ0V[16],\n\ LQ0W[16],LQ0X[16],LQ0Y[16],LQ1V[16],LQ1W[16],LQ1X[16],LQ1Y[16],LQ2V[16],\n\ LQ2W[16],LQ2X[16],LQ2Y[16],LQ3V[16],LQ3W[16],LQ3X[16],LQ3Y[16],LQ4V[16],\n\ LQ4W[16],LQ4X[16],LQ4Y[16],LQ5V[16],LQ5W[16],LQ5X[16],LQ5Y[16],LQ6V[16],\n\ LQ6W[16],LQ6X[16],LQ6Y[16],LQ7V[16],LQ7W[16],LQ7X[16],LQ7Y[16],LQ8V[16],\n\ LQ8W[16],LQ8X[16],LQ8Y[16],LQ9V[16],LQ9W[16],LQ9X[16],LQ9Y[16],LR0V[16],\n\ LR0W[16],LR0X[16],LR0Y[16],LR1V[16],LR1W[16],LR1X[16],LR1Y[16],LR2V[16],\n\ LR2W[16],LR2X[16],LR2Y[16],LR3V[16],LR3W[16],LR3X[16],LR3Y[16],LR4V[16],\n\ LR4W[16],LR4X[16],LR4Y[16],LR5V[16],LR5W[16],LR5X[16],LR5Y[16],LR6V[16],\n\ LR6W[16],LR6X[16],LR6Y[16],LR7V[16],LR7W[16],LR7X[16],LR7Y[16],LR8V[16],\n\ LR8W[16],LR8X[16],LR8Y[16],LR9V[16],LR9W[16],LR9X[16],LR9Y[16],LS0V[16],\n\ LS0W[16],LS0X[16],LS0Y[16],LS1V[16],LS1W[16],LS1X[16],LS1Y[16],LS2V[16],\n\ LS2W[16],LS2X[16],LS2Y[16],LS3V[16],LS3W[16],LS3X[16],LS3Y[16],LS4V[16],\n\ LS4W[16],LS4X[16],LS4Y[16],LS5V[16],LS5W[16],LS5X[16],LS5Y[16],LS6V[16],\n\ LS6W[16],LS6X[16],LS6Y[16],LS7V[16],LS7W[16],LS7X[16],LS7Y[16],LS8V[16],\n\ LS8W[16],LS8X[16],LS8Y[16],LS9V[16],LS9W[16],LS9X[16],LS9Y[16],LT0V[16],\n\ LT0W[16],LT0X[16],LT0Y[16],LT1V[16],LT1W[16],LT1X[16],LT1Y[16],LT2V[16],\n\ LT2W[16],LT2X[16],LT2Y[16],LT3V[16],LT3W[16],LT3X[16],LT3Y[16],LT4V[16],\n\ LT4W[16],LT4X[16],LT4Y[16],LT5V[16],LT5W[16],LT5X[16],LT5Y[16],LT6V[16],\n\ LT6W[16],LT6X[16],LT6Y[16],LT7V[16],LT7W[16],LT7X[16],LT7Y[16],LT8V[16],\n\ LT8W[16],LT8X[16],LT8Y[16],LT9V[16],LT9W[16],LT9X[16],LT9Y[16],LU0V[16],\n\ LU0W[16],LU0X[16],LU0Y[16],LU1V[16],LU1W[16],LU1X[16],LU1Y[16],LU2V[16],\n\ LU2W[16],LU2X[16],LU2Y[16],LU3V[16],LU3W[16],LU3X[16],LU3Y[16],LU4V[16],\n\ LU4W[16],LU4X[16],LU4Y[16],LU5V[16],LU5W[16],LU5X[16],LU5Y[16],LU6V[16],\n\ LU6W[16],LU6X[16],LU6Y[16],LU7V[16],LU7W[16],LU7X[16],LU7Y[16],LU8V[16],\n\ LU8W[16],LU8X[16],LU8Y[16],LU9V[16],LU9W[16],LU9X[16],LU9Y[16],LV0V[16],\n\ LV0W[16],LV0X[16],LV0Y[16],LV1V[16],LV1W[16],LV1X[16],LV1Y[16],LV2V[16],\n\ LV2W[16],LV2X[16],LV2Y[16],LV3V[16],LV3W[16],LV3X[16],LV3Y[16],LV4V[16],\n\ LV4W[16],LV4X[16],LV4Y[16],LV5V[16],LV5W[16],LV5X[16],LV5Y[16],LV6V[16],\n\ LV6W[16],LV6X[16],LV6Y[16],LV7V[16],LV7W[16],LV7X[16],LV7Y[16],LV8V[16],\n\ LV8W[16],LV8X[16],LV8Y[16],LV9V[16],LV9W[16],LV9X[16],LV9Y[16],LW0V[16],\n\ LW0W[16],LW0X[16],LW0Y[16],LW1V[16],LW1W[16],LW1X[16],LW1Y[16],LW2V[16],\n\ LW2W[16],LW2X[16],LW2Y[16],LW3V[16],LW3W[16],LW3X[16],LW3Y[16],LW4V[16],\n\ LW4W[16],LW4X[16],LW4Y[16],LW5V[16],LW5W[16],LW5X[16],LW5Y[16],LW6V[16],\n\ LW6W[16],LW6X[16],LW6Y[16],LW7V[16],LW7W[16],LW7X[16],LW7Y[16],LW8V[16],\n\ LW8W[16],LW8X[16],LW8Y[16],LW9V[16],LW9W[16],LW9X[16],LW9Y[16],\n\ =LU1AW/X[16],=LU2DVI/H,=LU3AJL/H,=LU3EFL/D,=LU3HKA/H,=LU3HL/H,\n\ =LU3YA/V[16],=LU5FYX/H,=LU7HA/H,=LU7HBL/H,=LU8HH/H,=LU8VCC/V[16],\n\ =LW4HCL/H;\n\ Luxembourg: 14: 27: EU: 50.00: -6.00: -1.0: LX:\n\ LX;\n\ Lithuania: 15: 29: EU: 55.45: -23.63: -2.0: LY:\n\ LY;\n\ Bulgaria: 20: 28: EU: 42.83: -25.08: -2.0: LZ:\n\ LZ;\n\ Peru: 10: 12: SA: -10.00: 76.00: 5.0: OA:\n\ 4T,OA,OB,OC;\n\ Lebanon: 20: 39: AS: 33.83: -35.83: -2.0: OD:\n\ OD;\n\ Austria: 15: 28: EU: 47.33: -13.33: -1.0: OE:\n\ OE,=4U0R,=4U1A,=4U1VIC,=4U2U,=4Y1A,=C7A;\n\ Finland: 15: 18: EU: 63.78: -27.08: -2.0: OH:\n\ OF,OG,OH,OI,OJ;\n\ Aland Islands: 15: 18: EU: 60.13: -20.37: -2.0: OH0:\n\ OF0,OG0,OH0,OI0;\n\ Market Reef: 15: 18: EU: 60.00: -19.00: -2.0: OJ0:\n\ OJ0;\n\ Czech Republic: 15: 28: EU: 50.00: -16.00: -1.0: OK:\n\ OK,OL;\n\ Slovak Republic: 15: 28: EU: 49.00: -20.00: -1.0: OM:\n\ OM;\n\ Belgium: 14: 27: EU: 50.70: -4.85: -1.0: ON:\n\ ON,OO,OP,OQ,OR,OS,OT,=ON3BLB/YL;\n\ Greenland: 40: 05: NA: 74.00: 42.78: 3.0: OX:\n\ OX,XP;\n\ Faroe Islands: 14: 18: EU: 62.07: 6.93: 0.0: OY:\n\ OW,OY;\n\ Denmark: 14: 18: EU: 56.00: -10.00: -1.0: OZ:\n\ 5P,5Q,OU,OV,OZ;\n\ Papua New Guinea: 28: 51: OC: -9.50: -147.12: -10.0: P2:\n\ P2;\n\ Aruba: 09: 11: SA: 12.53: 69.98: 4.0: P4:\n\ P4;\n\ DPR of Korea: 25: 44: AS: 39.78: -126.30: -9.0: P5:\n\ P5,P6,P7,P8,P9;\n\ Netherlands: 14: 27: EU: 52.28: -5.47: -1.0: PA:\n\ PA,PB,PC,PD,PE,PF,PG,PH,PI;\n\ Curacao: 09: 11: SA: 12.17: 69.00: 4.0: PJ2:\n\ PJ2;\n\ Bonaire: 09: 11: SA: 12.20: 68.25: 4.0: PJ4:\n\ PJ4;\n\ Saba & St. Eustatius: 08: 11: NA: 17.57: 63.10: 4.0: PJ5:\n\ PJ5,PJ6;\n\ Sint Maarten: 08: 11: NA: 18.07: 63.07: 4.0: PJ7:\n\ PJ0,PJ7,PJ8;\n\ Brazil: 11: 15: SA: -10.00: 53.00: 3.0: PY:\n\ PP,PQ,PR,PS,PT,PU,PV,PW,PX,PY,ZV,ZW,ZX,ZY,ZZ,PP6[13],PP7[13],PP8[12],\n\ PQ2[13],PQ8[13],PR7[13],PR8[13],PS7[13],PS8[13],PT2[13],PT7[13],PT8[12],\n\ PV8[12],PW8[12],PY6[13],PY7[13],PY8[13],PY9[13];\n\ Fernando de Noronha: 11: 13: SA: -3.85: 32.43: 2.0: PY0F:\n\ PP0F,PP0ZF,PQ0F,PQ0ZF,PR0F,PR0ZF,PS0F,PS0ZF,PT0F,PT0ZF,PU0F,PU0ZF,PV0F,\n\ PV0ZF,PW0F,PW0ZF,PX0F,PX0ZF,PY0F,PY0Z,ZV0F,ZV0ZF,ZW0F,ZW0ZF,ZX0F,ZX0ZF,\n\ ZY0F,ZY0Z,ZZ0F,ZZ0ZF,PP0R,PP0ZR,PQ0R,PQ0ZR,PR0R,PR0ZR,PS0R,PS0ZR,PT0R,\n\ PT0ZR,PU0R,PU0ZR,PV0R,PV0ZR,PW0R,PW0ZR,PX0R,PX0ZR,PY0R,ZV0R,ZV0ZR,ZW0R,\n\ ZW0ZR,ZX0R,ZX0ZR,ZY0R,ZZ0R,ZZ0ZR;\n\ St. Peter & St. Paul: 11: 13: SA: 0.00: 29.00: 2.0: PY0S:\n\ PP0S,PP0ZS,PQ0S,PQ0ZS,PR0S,PR0ZS,PS0S,PS0ZS,PT0S,PT0ZS,PU0S,PU0ZS,PV0S,\n\ PV0ZS,PW0S,PW0ZS,PX0S,PX0ZS,PY0S,PY0ZS,ZV0S,ZV0ZS,ZW0S,ZW0ZS,ZX0S,ZX0ZS,\n\ ZY0S,ZY0ZS,ZZ0S,ZZ0ZS;\n\ Trindade & Martim Vaz: 11: 15: SA: -20.50: 29.32: 2.0: PY0T:\n\ PP0T,PP0ZT,PQ0T,PQ0ZT,PR0T,PR0ZT,PS0T,PS0ZT,PT0T,PT0ZT,PU0T,PU0ZT,PV0T,\n\ PV0ZT,PW0T,PW0ZT,PX0T,PX0ZT,PY0T,PY0ZT,ZV0T,ZV0ZT,ZW0T,ZW0ZT,ZX0T,ZX0ZT,\n\ ZY0T,ZY0ZT,ZZ0T,ZZ0ZT;\n\ Suriname: 09: 12: SA: 4.00: 56.00: 3.0: PZ:\n\ PZ;\n\ Franz Josef Land: 40: 75: EU: 80.68: -49.92: -3.0: R1FJ:\n\ RI1F;\n\ Western Sahara: 33: 46: AF: 24.82: 13.85: 0.0: S0:\n\ S0;\n\ Bangladesh: 22: 41: AS: 24.12: -89.65: -6.0: S2:\n\ S2,S3;\n\ Slovenia: 15: 28: EU: 46.00: -14.00: -1.0: S5:\n\ S5;\n\ Seychelles: 39: 53: AF: -4.67: -55.47: -4.0: S7:\n\ S7;\n\ Sao Tome & Principe: 36: 47: AF: 0.22: -6.57: 0.0: S9:\n\ S9;\n\ Sweden: 14: 18: EU: 61.20: -14.57: -1.0: SM:\n\ 7S,8S,SA,SB,SC,SD,SE,SF,SG,SH,SI,SJ,SK,SL,SM;\n\ Poland: 15: 28: EU: 52.28: -18.67: -1.0: SP:\n\ 3Z,HF,SN,SO,SP,SQ,SR;\n\ Sudan: 34: 48: AF: 14.47: -28.62: -3.0: ST:\n\ 6T,6U,ST;\n\ Egypt: 34: 38: AF: 26.28: -28.60: -2.0: SU:\n\ 6A,6B,SS,SU;\n\ Greece: 20: 28: EU: 39.78: -21.78: -2.0: SV:\n\ J4,SV,SW,SX,SY,SZ,=SV94MIKIS,=SV94THEO,=SX94MIKIS,=SX94THEO;\n\ Mount Athos: 20: 28: EU: 40.00: -24.00: -2.0: SV/a:\n\ =SV2ASP/A,=SV2RSG/A;\n\ Dodecanese: 20: 28: EU: 36.17: -27.93: -2.0: SV5:\n\ J45,SV5,SW5,SX5,SY5,SZ5;\n\ Crete: 20: 28: EU: 35.23: -24.78: -2.0: SV9:\n\ J49,SV9,SW9,SX9,SY9,SZ9;\n\ Tuvalu: 31: 65: OC: -8.50: -179.20: -12.0: T2:\n\ T2;\n\ Western Kiribati: 31: 65: OC: 1.42: -173.00: -12.0: T30:\n\ T30;\n\ Central Kiribati: 31: 62: OC: -2.83: 171.72: -13.0: T31:\n\ T31;\n\ Eastern Kiribati: 31: 61: OC: 1.80: 157.35: -14.0: T32:\n\ T32;\n\ Banaba Island: 31: 65: OC: -0.88: -169.53: -12.0: T33:\n\ T33;\n\ Somalia: 37: 48: AF: 2.03: -45.35: -3.0: T5:\n\ 6O,T5;\n\ San Marino: 15: 28: EU: 43.95: -12.45: -1.0: T7:\n\ T7;\n\ Palau: 27: 64: OC: 7.45: -134.53: -9.0: T8:\n\ T8;\n\ Asiatic Turkey: 20: 39: AS: 39.18: -35.65: -2.0: TA:\n\ TA,TB,TC,YM,=TA1BZ/2,=TA1D/4;\n\ European Turkey: 20: 39: EU: 41.02: -28.97: -2.0: *TA1:\n\ TA1,TB1,TC1,YM1,=TA6CQ/1;\n\ Iceland: 40: 17: EU: 64.80: 18.73: 0.0: TF:\n\ TF;\n\ Guatemala: 07: 11: NA: 15.50: 90.30: 6.0: TG:\n\ TD,TG;\n\ Costa Rica: 07: 11: NA: 10.00: 84.00: 6.0: TI:\n\ TE,TI;\n\ Cocos Island: 07: 11: NA: 5.52: 87.05: 6.0: TI9:\n\ TE9,TI9;\n\ Cameroon: 36: 47: AF: 5.38: -11.87: -1.0: TJ:\n\ TJ;\n\ Corsica: 15: 28: EU: 42.00: -9.00: -1.0: TK:\n\ TK;\n\ Central African Republic: 36: 47: AF: 6.75: -20.33: -1.0: TL:\n\ TL;\n\ Republic of the Congo: 36: 52: AF: -1.02: -15.37: -1.0: TN:\n\ TN;\n\ Gabon: 36: 52: AF: -0.37: -11.73: -1.0: TR:\n\ TR;\n\ Chad: 36: 47: AF: 15.80: -18.17: -1.0: TT:\n\ TT;\n\ Cote d'Ivoire: 35: 46: AF: 7.58: 5.80: 0.0: TU:\n\ TU;\n\ Benin: 35: 46: AF: 9.87: -2.25: -1.0: TY:\n\ TY;\n\ Mali: 35: 46: AF: 18.00: 2.58: 0.0: TZ:\n\ TZ;\n\ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA:\n\ R,U,R1I(17)[20],R1N[19],R1O[19],R1P[20],R1Z[19],R4H[30],R4I[30],R4W[30],\n\ R8F(17)[30],R8G(17)[30],R8X(17)[20],R9F(17)[30],R9G(17)[30],R9X(17)[20],\n\ RA1I(17)[20],RA1N[19],RA1O[19],RA1P[20],RA1Z[19],RA4H[30],RA4I[30],\n\ RA4W[30],RA8F(17)[30],RA8G(17)[30],RA8X(17)[20],RA9F(17)[30],RA9G(17)[30],\n\ RA9X(17)[20],RC1I(17)[20],RC1N[19],RC1O[19],RC1P[20],RC1Z[19],RC4H[30],\n\ RC4I[30],RC4W[30],RC8F(17)[30],RC8G(17)[30],RC8X(17)[20],RC9F(17)[30],\n\ RC9G(17)[30],RC9X(17)[20],RD1I(17)[20],RD1N[19],RD1O[19],RD1P[20],\n\ RD1Z[19],RD4H[30],RD4I[30],RD4W[30],RD8F(17)[30],RD8G(17)[30],\n\ RD8X(17)[20],RD9F(17)[30],RD9G(17)[30],RD9X(17)[20],RE1I(17)[20],RE1N[19],\n\ RE1O[19],RE1P[20],RE1Z[19],RE4H[30],RE4I[30],RE4W[30],RE8F(17)[30],\n\ RE8G(17)[30],RE8X(17)[20],RE9F(17)[30],RE9G(17)[30],RE9X(17)[20],\n\ RF1I(17)[20],RF1N[19],RF1O[19],RF1P[20],RF1Z[19],RF4H[30],RF4I[30],\n\ RF4W[30],RF8F(17)[30],RF8G(17)[30],RF8X(17)[20],RF9F(17)[30],RF9G(17)[30],\n\ RF9X(17)[20],RG1I(17)[20],RG1N[19],RG1O[19],RG1P[20],RG1Z[19],RG4H[30],\n\ RG4I[30],RG4W[30],RG8F(17)[30],RG8G(17)[30],RG8X(17)[20],RG9F(17)[30],\n\ RG9G(17)[30],RG9X(17)[20],RI8X(17)[20],RI9X(17)[20],RJ1I(17)[20],RJ1N[19],\n\ RJ1O[19],RJ1P[20],RJ1Z[19],RJ4H[30],RJ4I[30],RJ4W[30],RJ8F(17)[30],\n\ RJ8G(17)[30],RJ8X(17)[20],RJ9F(17)[30],RJ9G(17)[30],RJ9X(17)[20],\n\ RK1I(17)[20],RK1N[19],RK1O[19],RK1P[20],RK1Z[19],RK4H[30],RK4I[30],\n\ RK4W[30],RK8F(17)[30],RK8G(17)[30],RK8X(17)[20],RK9F(17)[30],RK9G(17)[30],\n\ RK9X(17)[20],RL1I(17)[20],RL1N[19],RL1O[19],RL1P[20],RL1Z[19],RL4H[30],\n\ RL4I[30],RL4W[30],RL8F(17)[30],RL8G(17)[30],RL8X(17)[20],RL9F(17)[30],\n\ RL9G(17)[30],RL9X(17)[20],RM1I(17)[20],RM1N[19],RM1O[19],RM1P[20],\n\ RM1Z[19],RM4H[30],RM4I[30],RM4W[30],RM8F(17)[30],RM8G(17)[30],\n\ RM8X(17)[20],RM9F(17)[30],RM9G(17)[30],RM9X(17)[20],RN1I(17)[20],RN1N[19],\n\ RN1O[19],RN1P[20],RN1Z[19],RN4H[30],RN4I[30],RN4W[30],RN8F(17)[30],\n\ RN8G(17)[30],RN8X(17)[20],RN9F(17)[30],RN9G(17)[30],RN9X(17)[20],\n\ RO1I(17)[20],RO1N[19],RO1O[19],RO1P[20],RO1Z[19],RO4H[30],RO4I[30],\n\ RO4W[30],RO8F(17)[30],RO8G(17)[30],RO8X(17)[20],RO9F(17)[30],RO9G(17)[30],\n\ RO9X(17)[20],RQ1I(17)[20],RQ1N[19],RQ1O[19],RQ1P[20],RQ1Z[19],RQ4H[30],\n\ RQ4I[30],RQ4W[30],RQ8F(17)[30],RQ8G(17)[30],RQ8X(17)[20],RQ9F(17)[30],\n\ RQ9G(17)[30],RQ9X(17)[20],RT1I(17)[20],RT1N[19],RT1O[19],RT1P[20],\n\ RT1Z[19],RT4H[30],RT4I[30],RT4W[30],RT8F(17)[30],RT8G(17)[30],\n\ RT8X(17)[20],RT9F(17)[30],RT9G(17)[30],RT9X(17)[20],RU1I(17)[20],RU1N[19],\n\ RU1O[19],RU1P[20],RU1Z[19],RU4H[30],RU4I[30],RU4W[30],RU8F(17)[30],\n\ RU8G(17)[30],RU8X(17)[20],RU9F(17)[30],RU9G(17)[30],RU9X(17)[20],\n\ RV1I(17)[20],RV1N[19],RV1O[19],RV1P[20],RV1Z[19],RV4H[30],RV4I[30],\n\ RV4W[30],RV8F(17)[30],RV8G(17)[30],RV8X(17)[20],RV9F(17)[30],RV9G(17)[30],\n\ RV9X(17)[20],RW1I(17)[20],RW1N[19],RW1O[19],RW1P[20],RW1Z[19],RW4H[30],\n\ RW4I[30],RW4W[30],RW8F(17)[30],RW8G(17)[30],RW8X(17)[20],RW9F(17)[30],\n\ RW9G(17)[30],RW9X(17)[20],RX1I(17)[20],RX1N[19],RX1O[19],RX1P[20],\n\ RX1Z[19],RX4H[30],RX4I[30],RX4W[30],RX8F(17)[30],RX8G(17)[30],\n\ RX8X(17)[20],RX9F(17)[30],RX9G(17)[30],RX9X(17)[20],RY1I(17)[20],RY1N[19],\n\ RY1O[19],RY1P[20],RY1Z[19],RY4H[30],RY4I[30],RY4W[30],RY8F(17)[30],\n\ RY8G(17)[30],RY8X(17)[20],RY9F(17)[30],RY9G(17)[30],RY9X(17)[20],\n\ RZ1I(17)[20],RZ1N[19],RZ1O[19],RZ1P[20],RZ1Z[19],RZ4H[30],RZ4I[30],\n\ RZ4W[30],RZ8F(17)[30],RZ8G(17)[30],RZ8X(17)[20],RZ9F(17)[30],RZ9G(17)[30],\n\ RZ9X(17)[20],U1I(17)[20],U1N[19],U1O[19],U1P[20],U1Z[19],U4H[30],U4I[30],\n\ U4W[30],U8F(17)[30],U8G(17)[30],U8X(17)[20],U9F(17)[30],U9G(17)[30],\n\ U9X(17)[20],UA1I(17)[20],UA1N[19],UA1O[19],UA1P[20],UA1Z[19],UA4H[30],\n\ UA4I[30],UA4W[30],UA8F(17)[30],UA8G(17)[30],UA8X(17)[20],UA9F(17)[30],\n\ UA9G(17)[30],UA9X(17)[20],UB1I(17)[20],UB1N[19],UB1O[19],UB1P[20],\n\ UB1Z[19],UB4H[30],UB4I[30],UB4W[30],UB8F(17)[30],UB8G(17)[30],\n\ UB8X(17)[20],UB9F(17)[30],UB9G(17)[30],UB9X(17)[20],UC1I(17)[20],UC1N[19],\n\ UC1O[19],UC1P[20],UC1Z[19],UC4H[30],UC4I[30],UC4W[30],UC8F(17)[30],\n\ UC8G(17)[30],UC8X(17)[20],UC9F(17)[30],UC9G(17)[30],UC9X(17)[20],\n\ UD1I(17)[20],UD1N[19],UD1O[19],UD1P[20],UD1Z[19],UD4H[30],UD4I[30],\n\ UD4W[30],UD8F(17)[30],UD8G(17)[30],UD8X(17)[20],UD9F(17)[30],UD9G(17)[30],\n\ UD9X(17)[20],UE1I(17)[20],UE1N[19],UE1O[19],UE1P[20],UE1Z[19],UE4H[30],\n\ UE4I[30],UE4W[30],UE8F(17)[30],UE8G(17)[30],UE8X(17)[20],UE9F(17)[30],\n\ UE9G(17)[30],UE9X(17)[20],UF1I(17)[20],UF1N[19],UF1O[19],UF1P[20],\n\ UF1Z[19],UF4H[30],UF4I[30],UF4W[30],UF8F(17)[30],UF8G(17)[30],\n\ UF8X(17)[20],UF9F(17)[30],UF9G(17)[30],UF9X(17)[20],UG1I(17)[20],UG1N[19],\n\ UG1O[19],UG1P[20],UG1Z[19],UG4H[30],UG4I[30],UG4W[30],UG8F(17)[30],\n\ UG8G(17)[30],UG8X(17)[20],UG9F(17)[30],UG9G(17)[30],UG9X(17)[20],\n\ UH1I(17)[20],UH1N[19],UH1O[19],UH1P[20],UH1Z[19],UH4H[30],UH4I[30],\n\ UH4W[30],UH8F(17)[30],UH8G(17)[30],UH8X(17)[20],UH9F(17)[30],UH9G(17)[30],\n\ UH9X(17)[20],UI1I(17)[20],UI1N[19],UI1O[19],UI1P[20],UI1Z[19],UI4H[30],\n\ UI4I[30],UI4W[30],UI8F(17)[30],UI8G(17)[30],UI8X(17)[20],UI9F(17)[30],\n\ UI9G(17)[30],UI9X(17)[20],=R0AGD/6,=UA0ZL/6,=R3ARS/4[30],=R4HAT[29],\n\ =R4HC[29],=R4HCE[29],=R4HCZ[29],=R4HD[29],=R4HDC[29],=R4HDR[29],=R4HL[29],\n\ =R4IC[29],=R4ID[29],=R4II[29],=R4IK[29],=R4IM[29],=R4IN[29],=R4IO[29],\n\ =R4IT[29],=R85AAL,=R8MB/1(17)[20],=R9CMA/4,=R9CZ/3,=RA3X/1(17)[20],\n\ =RA4HL[29],=RA4NCC[30],=RA9KD/6,=RA9SGI/1,=RC4HT[29],=RC4I[29],=RJ4I[29],\n\ =RJ4P[30],=RK4HM[29],=RK75OP[19],=RM4I[29],=RM4R[30],=RN4HFJ[29],\n\ =RN4HIF[29],=RT9K/6,=RT9T/1,=RT9T/3,=RU4HD[29],=RU4HP[29],=RU4I[29],\n\ =RU9MU/1,=RW4HM[29],=RW4HTK[29],=RW4HW[29],=RW4HZ[29],=RW9WJ/4[30],\n\ =RZ9SZ/3,=UA4H[29],=UA4HBM[29],=UA4HGL[29],=UA4HIP[29],=UA4HRZ[29],\n\ =UA4HY[29],=UA4NF[30],=UA4PN[30],=UC4I[29],=UI4I[29];\n\ Kaliningrad: 15: 29: EU: 54.72: -20.52: -3.0: UA2:\n\ R2F,R2K,RA2,RC2F,RC2K,RD2F,RD2K,RE2F,RE2K,RF2F,RF2K,RG2F,RG2K,RJ2F,RJ2K,\n\ RK2F,RK2K,RL2F,RL2K,RM2F,RM2K,RN2F,RN2K,RO2F,RO2K,RQ2F,RQ2K,RT2F,RT2K,\n\ RU2F,RU2K,RV2F,RV2K,RW2F,RW2K,RX2F,RX2K,RY2F,RY2K,RZ2F,RZ2K,U2F,U2K,UA2,\n\ UB2,UC2,UD2,UE2,UF2,UG2,UH2,UI2,=R2MWO;\n\ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9:\n\ R0,R8(17)[30],R9,RA0,RA8(17)[30],RA9,RC0,RC8(17)[30],RC9,RD0,RD8(17)[30],\n\ RD9,RE0,RE8(17)[30],RE9,RF0,RF8(17)[30],RF9,RG0,RG8(17)[30],RG9,RI0,\n\ RI8(17)[30],RI9,RJ0,RJ8(17)[30],RJ9,RK0,RK8(17)[30],RK9,RL0,RL8(17)[30],\n\ RL9,RM0,RM8(17)[30],RM9,RN0,RN8(17)[30],RN9,RO0,RO8(17)[30],RO9,RQ0,\n\ RQ8(17)[30],RQ9,RT0,RT8(17)[30],RT9,RU0,RU8(17)[30],RU9,RV0,RV8(17)[30],\n\ RV9,RW0,RW8(17)[30],RW9,RX0,RX8(17)[30],RX9,RY0,RY8(17)[30],RY9,RZ0,\n\ RZ8(17)[30],RZ9,U0,U8(17)[30],U9,UA0,UA8(17)[30],UA9,UB0,UB8(17)[30],UB9,\n\ UC0,UC8(17)[30],UC9,UD0,UD8(17)[30],UD9,UE0,UE8(17)[30],UE9,UF0,\n\ UF8(17)[30],UF9,UG0,UG8(17)[30],UG9,UH0,UH8(17)[30],UH9,UI0,UI8(17)[30],\n\ UI9,R0T(18)[32],R8H(18)[31],R8I(18)[31],R8O(18)[31],R8P(18)[31],\n\ R8S(16)[30],R8T(16)[30],R8U(18)[31],R8V(18)[31],R8W(16)[30],R8Y(18)[31],\n\ R8Z(18)[31],R9I(18)[31],R9M(17)[30],R9P(18)[31],R9S(16),R9T(16),\n\ R9V(18)[31],R9W(16),RA0T(18)[32],RA8H(18)[31],RA8I(18)[31],RA8O(18)[31],\n\ RA8P(18)[31],RA8S(16)[30],RA8T(16)[30],RA8U(18)[31],RA8V(18)[31],\n\ RA8W(16)[30],RA8Y(18)[31],RA8Z(18)[31],RA9I(18)[31],RA9M(17)[30],\n\ RA9P(18)[31],RA9S(16),RA9T(16),RA9V(18)[31],RA9W(16),RC0T(18)[32],\n\ RC8H(18)[31],RC8I(18)[31],RC8O(18)[31],RC8P(18)[31],RC8S(16)[30],\n\ RC8T(16)[30],RC8U(18)[31],RC8V(18)[31],RC8W(16)[30],RC8Y(18)[31],\n\ RC8Z(18)[31],RC9I(18)[31],RC9M(17)[30],RC9P(18)[31],RC9S(16),RC9T(16),\n\ RC9V(18)[31],RC9W(16),RD0T(18)[32],RD8H(18)[31],RD8I(18)[31],RD8O(18)[31],\n\ RD8P(18)[31],RD8S(16)[30],RD8T(16)[30],RD8U(18)[31],RD8V(18)[31],\n\ RD8W(16)[30],RD8Y(18)[31],RD8Z(18)[31],RD9I(18)[31],RD9M(17)[30],\n\ RD9P(18)[31],RD9S(16),RD9T(16),RD9V(18)[31],RD9W(16),RE0T(18)[32],\n\ RE8H(18)[31],RE8I(18)[31],RE8O(18)[31],RE8P(18)[31],RE8S(16)[30],\n\ RE8T(16)[30],RE8U(18)[31],RE8V(18)[31],RE8W(16)[30],RE8Y(18)[31],\n\ RE8Z(18)[31],RE9I(18)[31],RE9M(17)[30],RE9P(18)[31],RE9S(16),RE9T(16),\n\ RE9V(18)[31],RE9W(16),RF0T(18)[32],RF8H(18)[31],RF8I(18)[31],RF8O(18)[31],\n\ RF8P(18)[31],RF8S(16)[30],RF8T(16)[30],RF8U(18)[31],RF8V(18)[31],\n\ RF8W(16)[30],RF8Y(18)[31],RF8Z(18)[31],RF9I(18)[31],RF9M(17)[30],\n\ RF9P(18)[31],RF9S(16),RF9T(16),RF9V(18)[31],RF9W(16),RG0T(18)[32],\n\ RG8H(18)[31],RG8I(18)[31],RG8O(18)[31],RG8P(18)[31],RG8S(16)[30],\n\ RG8T(16)[30],RG8U(18)[31],RG8V(18)[31],RG8W(16)[30],RG8Y(18)[31],\n\ RG8Z(18)[31],RG9I(18)[31],RG9M(17)[30],RG9P(18)[31],RG9S(16),RG9T(16),\n\ RG9V(18)[31],RG9W(16),RJ0T(18)[32],RJ8H(18)[31],RJ8I(18)[31],RJ8O(18)[31],\n\ RJ8P(18)[31],RJ8S(16)[30],RJ8T(16)[30],RJ8U(18)[31],RJ8V(18)[31],\n\ RJ8W(16)[30],RJ8Y(18)[31],RJ8Z(18)[31],RJ9I(18)[31],RJ9M(17)[30],\n\ RJ9P(18)[31],RJ9S(16),RJ9T(16),RJ9V(18)[31],RJ9W(16),RK0T(18)[32],\n\ RK8H(18)[31],RK8I(18)[31],RK8O(18)[31],RK8P(18)[31],RK8S(16)[30],\n\ RK8T(16)[30],RK8U(18)[31],RK8V(18)[31],RK8W(16)[30],RK8Y(18)[31],\n\ RK8Z(18)[31],RK9I(18)[31],RK9M(17)[30],RK9P(18)[31],RK9S(16),RK9T(16),\n\ RK9V(18)[31],RK9W(16),RL0T(18)[32],RL8H(18)[31],RL8I(18)[31],RL8O(18)[31],\n\ RL8P(18)[31],RL8S(16)[30],RL8T(16)[30],RL8U(18)[31],RL8V(18)[31],\n\ RL8W(16)[30],RL8Y(18)[31],RL8Z(18)[31],RL9I(18)[31],RL9M(17)[30],\n\ RL9P(18)[31],RL9S(16),RL9T(16),RL9V(18)[31],RL9W(16),RM0T(18)[32],\n\ RM8H(18)[31],RM8I(18)[31],RM8O(18)[31],RM8P(18)[31],RM8S(16)[30],\n\ RM8T(16)[30],RM8U(18)[31],RM8V(18)[31],RM8W(16)[30],RM8Y(18)[31],\n\ RM8Z(18)[31],RM9I(18)[31],RM9M(17)[30],RM9P(18)[31],RM9S(16),RM9T(16),\n\ RM9V(18)[31],RM9W(16),RN0T(18)[32],RN8H(18)[31],RN8I(18)[31],RN8O(18)[31],\n\ RN8P(18)[31],RN8S(16)[30],RN8T(16)[30],RN8U(18)[31],RN8V(18)[31],\n\ RN8W(16)[30],RN8Y(18)[31],RN8Z(18)[31],RN9I(18)[31],RN9M(17)[30],\n\ RN9P(18)[31],RN9S(16),RN9T(16),RN9V(18)[31],RN9W(16),RO0T(18)[32],\n\ RO8H(18)[31],RO8I(18)[31],RO8O(18)[31],RO8P(18)[31],RO8S(16)[30],\n\ RO8T(16)[30],RO8U(18)[31],RO8V(18)[31],RO8W(16)[30],RO8Y(18)[31],\n\ RO8Z(18)[31],RO9I(18)[31],RO9M(17)[30],RO9P(18)[31],RO9S(16),RO9T(16),\n\ RO9V(18)[31],RO9W(16),RQ0T(18)[32],RQ8H(18)[31],RQ8I(18)[31],RQ8O(18)[31],\n\ RQ8P(18)[31],RQ8S(16)[30],RQ8T(16)[30],RQ8U(18)[31],RQ8V(18)[31],\n\ RQ8W(16)[30],RQ8Y(18)[31],RQ8Z(18)[31],RQ9I(18)[31],RQ9M(17)[30],\n\ RQ9P(18)[31],RQ9S(16),RQ9T(16),RQ9V(18)[31],RQ9W(16),RT0T(18)[32],\n\ RT8H(18)[31],RT8I(18)[31],RT8O(18)[31],RT8P(18)[31],RT8S(16)[30],\n\ RT8T(16)[30],RT8U(18)[31],RT8V(18)[31],RT8W(16)[30],RT8Y(18)[31],\n\ RT8Z(18)[31],RT9I(18)[31],RT9M(17)[30],RT9P(18)[31],RT9S(16),RT9T(16),\n\ RT9V(18)[31],RT9W(16),RU0T(18)[32],RU8H(18)[31],RU8I(18)[31],RU8O(18)[31],\n\ RU8P(18)[31],RU8S(16)[30],RU8T(16)[30],RU8U(18)[31],RU8V(18)[31],\n\ RU8W(16)[30],RU8Y(18)[31],RU8Z(18)[31],RU9I(18)[31],RU9M(17)[30],\n\ RU9P(18)[31],RU9S(16),RU9T(16),RU9V(18)[31],RU9W(16),RV0T(18)[32],\n\ RV8H(18)[31],RV8I(18)[31],RV8O(18)[31],RV8P(18)[31],RV8S(16)[30],\n\ RV8T(16)[30],RV8U(18)[31],RV8V(18)[31],RV8W(16)[30],RV8Y(18)[31],\n\ RV8Z(18)[31],RV9I(18)[31],RV9M(17)[30],RV9P(18)[31],RV9S(16),RV9T(16),\n\ RV9V(18)[31],RV9W(16),RW0T(18)[32],RW8H(18)[31],RW8I(18)[31],RW8O(18)[31],\n\ RW8P(18)[31],RW8S(16)[30],RW8T(16)[30],RW8U(18)[31],RW8V(18)[31],\n\ RW8W(16)[30],RW8Y(18)[31],RW8Z(18)[31],RW9I(18)[31],RW9M(17)[30],\n\ RW9P(18)[31],RW9S(16),RW9T(16),RW9V(18)[31],RW9W(16),RX0T(18)[32],\n\ RX8H(18)[31],RX8I(18)[31],RX8O(18)[31],RX8P(18)[31],RX8S(16)[30],\n\ RX8T(16)[30],RX8U(18)[31],RX8V(18)[31],RX8W(16)[30],RX8Y(18)[31],\n\ RX8Z(18)[31],RX9I(18)[31],RX9M(17)[30],RX9P(18)[31],RX9S(16),RX9T(16),\n\ RX9V(18)[31],RX9W(16),RY0T(18)[32],RY8H(18)[31],RY8I(18)[31],RY8O(18)[31],\n\ RY8P(18)[31],RY8S(16)[30],RY8T(16)[30],RY8U(18)[31],RY8V(18)[31],\n\ RY8W(16)[30],RY8Y(18)[31],RY8Z(18)[31],RY9I(18)[31],RY9M(17)[30],\n\ RY9P(18)[31],RY9S(16),RY9T(16),RY9V(18)[31],RY9W(16),RZ0T(18)[32],\n\ RZ8H(18)[31],RZ8I(18)[31],RZ8O(18)[31],RZ8P(18)[31],RZ8S(16)[30],\n\ RZ8T(16)[30],RZ8U(18)[31],RZ8V(18)[31],RZ8W(16)[30],RZ8Y(18)[31],\n\ RZ8Z(18)[31],RZ9I(18)[31],RZ9M(17)[30],RZ9P(18)[31],RZ9S(16),RZ9T(16),\n\ RZ9V(18)[31],RZ9W(16),U0T(18)[32],U8H(18)[31],U8I(18)[31],U8O(18)[31],\n\ U8P(18)[31],U8S(16)[30],U8T(16)[30],U8U(18)[31],U8V(18)[31],U8W(16)[30],\n\ U8Y(18)[31],U8Z(18)[31],U9I(18)[31],U9M(17)[30],U9P(18)[31],U9S(16),\n\ U9T(16),U9V(18)[31],U9W(16),UA0T(18)[32],UA8H(18)[31],UA8I(18)[31],\n\ UA8O(18)[31],UA8P(18)[31],UA8S(16)[30],UA8T(16)[30],UA8U(18)[31],\n\ UA8V(18)[31],UA8W(16)[30],UA8Y(18)[31],UA8Z(18)[31],UA9I(18)[31],\n\ UA9M(17)[30],UA9P(18)[31],UA9S(16),UA9T(16),UA9V(18)[31],UA9W(16),\n\ UB0T(18)[32],UB8H(18)[31],UB8I(18)[31],UB8O(18)[31],UB8P(18)[31],\n\ UB8S(16)[30],UB8T(16)[30],UB8U(18)[31],UB8V(18)[31],UB8W(16)[30],\n\ UB8Y(18)[31],UB8Z(18)[31],UB9I(18)[31],UB9M(17)[30],UB9P(18)[31],UB9S(16),\n\ UB9T(16),UB9V(18)[31],UB9W(16),UC0T(18)[32],UC8H(18)[31],UC8I(18)[31],\n\ UC8O(18)[31],UC8P(18)[31],UC8S(16)[30],UC8T(16)[30],UC8U(18)[31],\n\ UC8V(18)[31],UC8W(16)[30],UC8Y(18)[31],UC8Z(18)[31],UC9I(18)[31],\n\ UC9M(17)[30],UC9P(18)[31],UC9S(16),UC9T(16),UC9V(18)[31],UC9W(16),\n\ UD0T(18)[32],UD8H(18)[31],UD8I(18)[31],UD8O(18)[31],UD8P(18)[31],\n\ UD8S(16)[30],UD8T(16)[30],UD8U(18)[31],UD8V(18)[31],UD8W(16)[30],\n\ UD8Y(18)[31],UD8Z(18)[31],UD9I(18)[31],UD9M(17)[30],UD9P(18)[31],UD9S(16),\n\ UD9T(16),UD9V(18)[31],UD9W(16),UE0T(18)[32],UE8H(18)[31],UE8I(18)[31],\n\ UE8O(18)[31],UE8P(18)[31],UE8S(16)[30],UE8T(16)[30],UE8U(18)[31],\n\ UE8V(18)[31],UE8W(16)[30],UE8Y(18)[31],UE8Z(18)[31],UE9I(18)[31],\n\ UE9M(17)[30],UE9P(18)[31],UE9S(16),UE9T(16),UE9V(18)[31],UE9W(16),\n\ UF0T(18)[32],UF8H(18)[31],UF8I(18)[31],UF8O(18)[31],UF8P(18)[31],\n\ UF8S(16)[30],UF8T(16)[30],UF8U(18)[31],UF8V(18)[31],UF8W(16)[30],\n\ UF8Y(18)[31],UF8Z(18)[31],UF9I(18)[31],UF9M(17)[30],UF9P(18)[31],UF9S(16),\n\ UF9T(16),UF9V(18)[31],UF9W(16),UG0T(18)[32],UG8H(18)[31],UG8I(18)[31],\n\ UG8O(18)[31],UG8P(18)[31],UG8S(16)[30],UG8T(16)[30],UG8U(18)[31],\n\ UG8V(18)[31],UG8W(16)[30],UG8Y(18)[31],UG8Z(18)[31],UG9I(18)[31],\n\ UG9M(17)[30],UG9P(18)[31],UG9S(16),UG9T(16),UG9V(18)[31],UG9W(16),\n\ UH0T(18)[32],UH8H(18)[31],UH8I(18)[31],UH8O(18)[31],UH8P(18)[31],\n\ UH8S(16)[30],UH8T(16)[30],UH8U(18)[31],UH8V(18)[31],UH8W(16)[30],\n\ UH8Y(18)[31],UH8Z(18)[31],UH9I(18)[31],UH9M(17)[30],UH9P(18)[31],UH9S(16),\n\ UH9T(16),UH9V(18)[31],UH9W(16),UI0T(18)[32],UI8H(18)[31],UI8I(18)[31],\n\ UI8O(18)[31],UI8P(18)[31],UI8S(16)[30],UI8T(16)[30],UI8U(18)[31],\n\ UI8V(18)[31],UI8W(16)[30],UI8Y(18)[31],UI8Z(18)[31],UI9I(18)[31],\n\ UI9M(17)[30],UI9P(18)[31],UI9S(16),UI9T(16),UI9V(18)[31],UI9W(16),\n\ =RA0QK/8(17)[30],=UD6AOP/0,=R0WX/P(23)[32],=R2019CG(16),=R205NEW(19)[25],\n\ =R26RRC(19)[34],=R2ET/9(18)[31],=R53ICGA(16),=R53ICGB(16),=R53ICGC(16),\n\ =R53ICGF(16),=R53ICGJ(16),=R53ICGS(16),=R53ICGV(16),=R53ICGW(16),\n\ =R63RRC(18)[32],=R66IOTA(19)[34],=RA/DF8DX(18)[31],=RA/DJ8QP(18)[31],\n\ =RA3DS/P(18)[31],=RA4RU/9[20],=RD0L/9(18)[31],=RK4PA/9[20],=RN9S(16),\n\ =RO9S(16),=RQ73QQ(19)[23],=RT9S(16),=RT9W(16),=RU9MV/0(19)[25],\n\ =RW1AI/9(18)[22],=RW3YC/9(18)[32],=RW4YA/9(18)[32],=RW9WJ/P(16),\n\ =RZ1CWC/8(17)[30],=RZ5D/9(18)[31],=UA3A/P(18)[31];\n\ Uzbekistan: 17: 30: AS: 41.40: -63.97: -5.0: UK:\n\ UJ,UK,UL,UM;\n\ Kazakhstan: 17: 30: AS: 48.17: -65.18: -5.0: UN:\n\ UN,UO,UP,UQ,UN0F[31],UN0G[31],UN0J[31],UN0Q[31],UN2F[31],UN2G[31],\n\ UN2J[31],UN2Q[31],UN3F[31],UN3G[31],UN3J[31],UN3Q[31],UN4F[31],UN4G[31],\n\ UN4J[31],UN4Q[31],UN5F[31],UN5G[31],UN5J[31],UN5Q[31],UN6F[31],UN6G[31],\n\ UN6J[31],UN6Q[31],UN7F[31],UN7G[31],UN7J[31],UN7Q[31],UN8F[31],UN8G[31],\n\ UN8J[31],UN8Q[31],UN9F[31],UN9G[31],UN9J[31],UN9Q[31],UO0F[31],UO0G[31],\n\ UO0J[31],UO0Q[31],UO1F[31],UO1G[31],UO1J[31],UO1Q[31],UO2F[31],UO2G[31],\n\ UO2J[31],UO2Q[31],UO3F[31],UO3G[31],UO3J[31],UO3Q[31],UO4F[31],UO4G[31],\n\ UO4J[31],UO4Q[31],UO5F[31],UO5G[31],UO5J[31],UO5Q[31],UO6F[31],UO6G[31],\n\ UO6J[31],UO6Q[31],UO7F[31],UO7G[31],UO7J[31],UO7Q[31],UO8F[31],UO8G[31],\n\ UO8J[31],UO8Q[31],UO9F[31],UO9G[31],UO9J[31],UO9Q[31],UP0F[31],UP0G[31],\n\ UP0J[31],UP0Q[31],UP1F[31],UP1G[31],UP1J[31],UP1Q[31],UP2F[31],UP2G[31],\n\ UP2J[31],UP2Q[31],UP3F[31],UP3G[31],UP3J[31],UP3Q[31],UP4F[31],UP4G[31],\n\ UP4J[31],UP4Q[31],UP5F[31],UP5G[31],UP5J[31],UP5Q[31],UP6F[31],UP6G[31],\n\ UP6J[31],UP6Q[31],UP7F[31],UP7G[31],UP7J[31],UP7Q[31],UP8F[31],UP8G[31],\n\ UP8J[31],UP8Q[31],UP9F[31],UP9G[31],UP9J[31],UP9Q[31],UQ0F[31],UQ0G[31],\n\ UQ0J[31],UQ0Q[31],UQ1F[31],UQ1G[31],UQ1J[31],UQ1Q[31],UQ2F[31],UQ2G[31],\n\ UQ2J[31],UQ2Q[31],UQ3F[31],UQ3G[31],UQ3J[31],UQ3Q[31],UQ4F[31],UQ4G[31],\n\ UQ4J[31],UQ4Q[31],UQ5F[31],UQ5G[31],UQ5J[31],UQ5Q[31],UQ6F[31],UQ6G[31],\n\ UQ6J[31],UQ6Q[31],UQ7F[31],UQ7G[31],UQ7J[31],UQ7Q[31],UQ8F[31],UQ8G[31],\n\ UQ8J[31],UQ8Q[31],UQ9F[31],UQ9G[31],UQ9J[31],UQ9Q[31];\n\ Ukraine: 16: 29: EU: 50.00: -30.00: -2.0: UR:\n\ EM,EN,EO,U5,UR,US,UT,UU,UV,UW,UX,UY,UZ;\n\ Antigua & Barbuda: 08: 11: NA: 17.07: 61.80: 4.0: V2:\n\ V2;\n\ Belize: 07: 11: NA: 16.97: 88.67: 6.0: V3:\n\ V3;\n\ St. Kitts & Nevis: 08: 11: NA: 17.37: 62.78: 4.0: V4:\n\ V4;\n\ Namibia: 38: 57: AF: -22.00: -17.00: -1.0: V5:\n\ V5;\n\ Micronesia: 27: 65: OC: 6.88: -158.20: -10.0: V6:\n\ V6;\n\ Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7:\n\ V7;\n\ Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8:\n\ V8;\n\ Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE:\n\ CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,CF2[4],CG2[4],CH1,CH2(2),\n\ CI0(2)[4],CI1(1)[2],CI2,CJ2[4],CK2[4],CY1,CY2(2),CZ0(2)[4],CZ1(1)[2],CZ2,\n\ VA2[4],VB2[4],VC2[4],VD1,VD2(2),VE2[4],VF0(2)[4],VF1(1)[2],VF2,VG2[4],VO1,\n\ VO2(2),VX2[4],VY0(2)[4],VY1(1)[2],VY2,XJ1,XJ2(2),XK0(2)[4],XK1(1)[2],XK2,\n\ XL2[4],XM2[4],XN1,XN2(2),XO0(2)[4],XO1(1)[2],XO2,=VER20190630,\n\ =VA2VVV(2)[4],=VA3ELE/2(2)[4],=VA7XW/VE2(2)[4],=VE2CSI(2)[4],\n\ =VE2EKA(2)[4],=VE2FK[9],=VE2IDX(2)[4],=VE2IM(2)[4],=VE2KK(2)[4],\n\ =VE2NN(2)[4],=VE2TKH(2)[4],=VE2TWO(2)[4],=VE7ACN/VE2(2)[4],=VE8AT(2)[4],\n\ =VY0AA(4)[3],=VY0PW(4)[3];\n\ Australia: 30: 59: OC: -23.70: -132.33: -10.0: VK:\n\ AX,VH,VI,VJ,VK,VL,VM,VN,VZ,AX4[55],VH4[55],VI4[55],VJ4[55],VK4[55],\n\ VL4[55],VM4[55],VN4[55],VZ4[55],=VK4VXX,=VK4VXX/6(29)[58],=VK6MB/2,\n\ =VK6MB/3;\n\ Heard Island: 39: 68: AF: -53.08: -73.50: -5.0: VK0H:\n\ =VK0EK;\n\ Macquarie Island: 30: 60: OC: -54.60: -158.88: -10.0: VK0M:\n\ =VK0AI;\n\ Cocos (Keeling) Islands: 29: 54: OC: -12.15: -96.82: -6.5: VK9C:\n\ AX9C,AX9Y,VH9C,VH9Y,VI9C,VI9Y,VJ9C,VJ9Y,VK9C,VK9FC,VK9KC,VK9Y,VK9ZY,VL9C,\n\ VL9Y,VM9C,VM9Y,VN9C,VN9Y,VZ9C,VZ9Y;\n\ Lord Howe Island: 30: 60: OC: -31.55: -159.08: -10.5: VK9L:\n\ AX9L,VH9L,VI9L,VJ9L,VK9FL,VK9L,VK9ZL,VL9L,VM9L,VN9L,VZ9L,=VK3YQS/9,\n\ =VK3YQS/VK9,=VK9APX;\n\ Mellish Reef: 30: 56: OC: -17.40: -155.85: -10.0: VK9M:\n\ AX9M,VH9M,VI9M,VJ9M,VK9M,VL9M,VM9M,VN9M,VZ9M;\n\ Norfolk Island: 32: 60: OC: -29.03: -167.93: -11.5: VK9N:\n\ AX9,VH9,VI9,VJ9,VK9,VL9,VM9,VN9,VZ9;\n\ Willis Island: 30: 55: OC: -16.22: -150.02: -10.0: VK9W:\n\ AX9W,AX9Z,VH9W,VH9Z,VI9W,VI9Z,VJ9W,VJ9Z,VK9FW,VK9W,VK9Z,VL9W,VL9Z,VM9W,\n\ VM9Z,VN9W,VN9Z,VZ9W,VZ9Z;\n\ Christmas Island: 29: 54: OC: -10.48: -105.63: -7.0: VK9X:\n\ AX9X,VH9X,VI9X,VJ9X,VK9FX,VK9KX,VK9X,VL9X,VM9X,VN9X,VZ9X;\n\ Anguilla: 08: 11: NA: 18.23: 63.00: 4.0: VP2E:\n\ VP2E;\n\ Montserrat: 08: 11: NA: 16.75: 62.18: 4.0: VP2M:\n\ VP2M;\n\ British Virgin Islands: 08: 11: NA: 18.33: 64.75: 4.0: VP2V:\n\ VP2V;\n\ Turks & Caicos Islands: 08: 11: NA: 21.77: 71.75: 5.0: VP5:\n\ VP5,VQ5;\n\ Pitcairn Island: 32: 63: OC: -25.07: 130.10: 8.0: VP6:\n\ VP6;\n\ Ducie Island: 32: 63: OC: -24.70: 124.80: 8.0: VP6/d:\n\ =VP6D;\n\ Falkland Islands: 13: 16: SA: -51.63: 58.72: 4.0: VP8:\n\ VP8;\n\ South Georgia Island: 13: 73: SA: -54.48: 37.08: 2.0: VP8/g:\n\ =VP8CA;\n\ South Shetland Islands: 13: 73: SA: -62.08: 58.67: 4.0: VP8/h:\n\ CE9,XR9,=HF0POL,=RI1ANF;\n\ South Orkney Islands: 13: 73: SA: -60.60: 45.55: 3.0: VP8/o:\n\ =LU4ZD;\n\ South Sandwich Islands: 13: 73: SA: -58.43: 26.33: 2.0: VP8/s:\n\ =VP8DXU;\n\ Bermuda: 05: 11: NA: 32.32: 64.73: 4.0: VP9:\n\ VP9;\n\ Chagos Islands: 39: 41: AF: -7.32: -72.42: -6.0: VQ9:\n\ VQ9;\n\ Hong Kong: 24: 44: AS: 22.28: -114.18: -8.0: VR:\n\ VR;\n\ India: 22: 41: AS: 22.50: -77.58: -5.5: VU:\n\ 8T,8U,8V,8W,8X,8Y,AT,AU,AV,AW,VT,VU,VV,VW;\n\ Andaman & Nicobar Is.: 26: 49: AS: 12.37: -92.78: -5.5: VU4:\n\ VU4;\n\ Lakshadweep Islands: 22: 41: AS: 11.23: -72.78: -5.5: VU7:\n\ VU7;\n\ Mexico: 06: 10: NA: 21.32: 100.23: 6.0: XE:\n\ 4A,4B,4C,6D,6E,6F,6G,6H,6I,6J,XA,XB,XC,XD,XE,XF,XG,XH,XI;\n\ Revillagigedo: 06: 10: NA: 18.77: 110.97: 7.0: XF4:\n\ 4A4,4B4,4C4,6D4,6E4,6F4,6G4,6H4,6I4,6J4,XA4,XB4,XC4,XD4,XE4,XF4,XG4,XH4,\n\ XI4;\n\ Burkina Faso: 35: 46: AF: 12.00: 2.00: 0.0: XT:\n\ XT;\n\ Cambodia: 26: 49: AS: 12.93: -105.13: -7.0: XU:\n\ XU;\n\ Laos: 26: 49: AS: 18.20: -104.55: -7.0: XW:\n\ XW;\n\ Macao: 24: 44: AS: 22.10: -113.50: -8.0: XX9:\n\ XX9;\n\ Myanmar: 26: 49: AS: 20.00: -96.37: -6.5: XZ:\n\ XY,XZ;\n\ Afghanistan: 21: 40: AS: 34.70: -65.80: -4.5: YA:\n\ T6,YA;\n\ Indonesia: 28: 51: OC: -7.30: -109.88: -7.0: YB:\n\ 7A,7B,7C,7D,7E,7F,7G,7H,7I,8A,8B,8C,8D,8E,8F,8G,8H,8I,PK,PL,PM,PN,PO,YB,\n\ YC,YD,YE,YF,YG,YH,YB0[54],YB1[54],YB2[54],YB3[54],YB4[54],YB5[54],YB6[54],\n\ YB7[54],YB8[54],YC0[54],YC1[54],YC2[54],YC3[54],YC4[54],YC5[54],YC6[54],\n\ YC7[54],YC8[54],YD0[54],YD1[54],YD2[54],YD3[54],YD4[54],YD5[54],YD6[54],\n\ YD7[54],YD8[54],YE0[54],YE1[54],YE2[54],YE3[54],YE4[54],YE5[54],YE6[54],\n\ YE7[54],YE8[54],YF0[54],YF1[54],YF2[54],YF3[54],YF4[54],YF5[54],YF6[54],\n\ YF7[54],YF8[54],YG0[54],YG1[54],YG2[54],YG3[54],YG4[54],YG5[54],YG6[54],\n\ YG7[54],YG8[54],YH0[54],YH1[54],YH2[54],YH3[54],YH4[54],YH5[54],YH6[54],\n\ YH7[54],YH8[54];\n\ Iraq: 21: 39: AS: 33.92: -42.78: -3.0: YI:\n\ HN,YI;\n\ Vanuatu: 32: 56: OC: -17.67: -168.38: -11.0: YJ:\n\ YJ;\n\ Syria: 20: 39: AS: 35.38: -38.20: -2.0: YK:\n\ 6C,YK;\n\ Latvia: 15: 29: EU: 57.03: -24.65: -2.0: YL:\n\ YL;\n\ Nicaragua: 07: 11: NA: 12.88: 85.05: 6.0: YN:\n\ H6,H7,HT,YN;\n\ Romania: 20: 28: EU: 45.78: -24.70: -2.0: YO:\n\ YO,YP,YQ,YR;\n\ El Salvador: 07: 11: NA: 14.00: 89.00: 6.0: YS:\n\ HU,YS;\n\ Serbia: 15: 28: EU: 44.00: -21.00: -1.0: YU:\n\ YT,YU;\n\ Venezuela: 09: 12: SA: 8.00: 66.00: 4.5: YV:\n\ 4M,YV,YW,YX,YY;\n\ Aves Island: 08: 11: NA: 15.67: 63.60: 4.0: YV0:\n\ 4M0,YV0,YW0,YX0,YY0;\n\ Zimbabwe: 38: 53: AF: -18.00: -31.00: -2.0: Z2:\n\ Z2;\n\ North Macedonia: 15: 28: EU: 41.60: -21.65: -1.0: Z3:\n\ Z3;\n\ Republic of Kosovo: 15: 28: EU: 42.67: -21.17: -1.0: Z6:\n\ Z6;\n\ Republic of South Sudan: 34: 48: AF: 4.85: -31.60: -3.0: Z8:\n\ Z8;\n\ Albania: 15: 28: EU: 41.00: -20.00: -1.0: ZA:\n\ ZA;\n\ Gibraltar: 14: 37: EU: 36.15: 5.37: -1.0: ZB:\n\ ZB,ZG;\n\ UK Base Areas on Cyprus: 20: 39: AS: 35.32: -33.57: -2.0: ZC4:\n\ ZC4;\n\ St. Helena: 36: 66: AF: -15.97: 5.72: 0.0: ZD7:\n\ ZD7;\n\ Ascension Island: 36: 66: AF: -7.93: 14.37: 0.0: ZD8:\n\ ZD8;\n\ Tristan da Cunha & Gough: 38: 66: AF: -37.13: 12.30: 0.0: ZD9:\n\ ZD9;\n\ Cayman Islands: 08: 11: NA: 19.32: 81.22: 5.0: ZF:\n\ ZF;\n\ Tokelau Islands: 31: 62: OC: -9.40: 171.20: -13.0: ZK3:\n\ ZK3;\n\ New Zealand: 32: 60: OC: -41.83: -173.27: -12.0: ZL:\n\ ZK,ZL,ZL50,ZM;\n\ Chatham Islands: 32: 60: OC: -43.85: 176.48: -12.75: ZL7:\n\ ZL7,ZM7;\n\ Kermadec Islands: 32: 60: OC: -29.25: 177.92: -12.0: ZL8:\n\ ZL8,ZM8;\n\ N.Z. Subantarctic Is.: 32: 60: OC: -51.62: -167.62: -12.0: ZL9:\n\ ZL9;\n\ Paraguay: 11: 14: SA: -25.27: 57.67: 4.0: ZP:\n\ ZP;\n\ South Africa: 38: 57: AF: -29.07: -22.63: -2.0: ZS:\n\ H5,S4,S8,V9,ZR,ZS,ZT,ZU;\n\ Pr. Edward & Marion Is.: 38: 57: AF: -46.88: -37.72: -3.0: ZS8:\n\ ZR8,ZS8,ZT8,ZU8;" ; fldigi-4.1.06/src/logbook/n3fjp_logger.cxx0000664000175000017500000023126213507402064015320 00000000000000// ===================================================================== // // n3fjp_logger.cxx // // interface to multiple n3fjp tcpip logbook services // // Copyright (C) 2016 // Dave Freese, W1HKJ // Dave Anderson, KA3PMW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "threads.h" #include "socket.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "logsupport.h" #include "n3fjp_logger.h" #include "confdialog.h" #include "rigsupport.h" #include "contest.h" LOG_FILE_SOURCE(debug::LOG_N3FJP); using namespace std; static void send_log_data(); //====================================================================== // Socket N3FJP i/o used on all platforms //====================================================================== pthread_t n3fjp_thread; pthread_t n3fjp_rx_socket_thread; Socket *n3fjp_socket = 0; pthread_mutex_t n3fjp_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t send_this_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t report_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t n3fjp_socket_mutex = PTHREAD_MUTEX_INITIALIZER; static string send_this = ""; static string pathname; static stringstream result; bool n3fjp_connected = false; bool n3fjp_enabled = false; bool n3fjp_exit = false; string n3fjp_ip_address = ""; string n3fjp_ip_port = ""; string n3fjp_rxbuffer; string connected_to; enum {UNKNOWN, N3FJP, FLDIGI}; bool n3fjp_bool_add_record = false; int n3fjp_has_xcvr_control = UNKNOWN; string tracked_freq = ""; int tracked_mode = -1; enum { FJP_NONE, FJP_ACL, // Amateur Contact Log FJP_FD, // ARRL Field Day FJP_WFD, // ARRL Winter Field Day FJP_KD, // ARRL Kids Day FJP_ARR, // ARRL Rookie Roundup FJP_RTTY, // ARRL Rtty FJP_ASCR, // ARRL School Club Roundup FJP_JOTA, // ARRL Jamboree On The Air FJP_AICW, // ARRL International DX (CW) FJP_SS, // ARRL November Sweepstakes FJP_CQ_WPX, // CQ WPX FJP_CQWWRTTY, // CQWW Rtty FJP_CQWWDX, // CQWW DX FJP_IARI, // Italian ARI International DX FJP_NAQP, // North American QSO Party FJP_NAS, // North American Sprint FJP_1010, // Ten Ten FJP_AIDX, // Africa All Mode FJP_VHF, // VHF FJP_WAE, // Worked All Europe FJP_MDQP, // MD QSOP record format FJP_7QP, // 7QP record format FJP_NEQP, // New England QSO party record format FJP_QP1, // QSO party record format 1 / 7QP contest FJP_QP2, // QSO party record format 2 FJP_QP3, // QSO party record format 3 FJP_QP4, // QSO party record format 4 FJP_QP5, // QSO party record format 5 FJP_QP6 // QSO party record format 6 }; // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // // "7QP", "B", "B", "B", "", "I", "", "", "SSCCC" // "New Eng", "B", "B", "B", "", "I", "", "", "CCCSS" // "MD SQP" "", "B", "B", "", "", "", "B", "" // "QSOP 1" "B", "B", "B", "", "I", "", "", "" // "QSOP 2" "B", "B", "B", "", "B", "", "", "" // "QSOP 3" "", "B", "B", "B", "I", "", "", "" // "QSOP 4" "", "B", "B", "", "I", "B", "", "" // "QSOP 5" "B", "B", "B", "", "", "", "", "" // "QSOP 6" "B", "B", "B", "", "I", "", "", "" struct N3FJP_LOGGER { const char *program; int contest; bool in_state; } n3fjp_logger[] = { {"No Contest", FJP_NONE, false}, {"Amateur Contact Log", FJP_ACL, false}, {"Africa All-Mode International", FJP_AIDX, false}, {"ARRL Field Day", FJP_FD, false}, {"Winter FD", FJP_WFD, false}, {"ARRL International DX", FJP_AICW, false}, {"Jamboree on the Air", FJP_JOTA, false}, {"ARRL Kids Day", FJP_KD, false}, {"ARRL Rookie Roundup", FJP_ARR, false}, {"ARRL RTTY Roundup", FJP_RTTY, false}, {"School Club Roundup", FJP_ASCR, false}, {"ARRL November Sweepstakes", FJP_SS, false}, {"BARTG RTTY Contest", FJP_NONE, false}, {"CQ WPX Contest Log", FJP_CQ_WPX, false}, {"CQ WW DX Contest Log", FJP_CQWWDX, false}, {"CQ WW DX RTTY Contest Log", FJP_CQWWRTTY, false}, {"Italian A.R.I. International DX", FJP_IARI, false}, {"NAQP", FJP_NAQP, false}, {"NA Sprint", FJP_NAS, false}, {"Ten Ten", FJP_1010, false}, {"VHF", FJP_VHF, false}, {"Worked All Europe", FJP_WAE, false}, {"Alabama QSO Party Contest Log", FJP_QP1, true}, {"ALQP Contest Log (Out of State)", FJP_QP1, false}, {"Arkansas QSO Party Contest Log", FJP_QP1, true}, {"ARQP Contest Log (Out of State)", FJP_QP1, false}, {"British Columbia QSO Party Contest Log", FJP_QP1, true}, {"BCQP Contest Log (Out of Province)", FJP_QP1, false}, {"Florida QSO Party Contest Log", FJP_QP1, true}, {"FLQP Contest Log (Out of State)", FJP_QP1, false}, {"Georgia QSO Party Contest Log", FJP_QP1, true}, {"GAQP Contest Log (Out of State)", FJP_QP1, false}, {"Hawaii QSO Party Contest Log", FJP_QP1, true}, {"HIQP Contest Log (Out of State)", FJP_QP1, false}, {"Iowa QSO Party Contest Log", FJP_QP1, true}, {"IAQP Contest Log (Out of State)", FJP_QP1, false}, {"Idaho QSO Party Contest Log", FJP_QP1, true}, {"IDQP Contest Log (Out of State)", FJP_QP1, false}, {"Illinois QSO Party Contest Log", FJP_QP1, true}, {"ILQP Contest Log (Out of State)", FJP_QP1, false}, {"Indiana QSO Party Contest Log", FJP_QP1, true}, {"INQP Contest Log (Out of State)", FJP_QP1, false}, {"Kansas QSO Party Contest Log", FJP_QP1, true}, {"KSQP Contest Log (Out of State)", FJP_QP1, false}, {"Kentucky QSO Party Contest Log", FJP_QP1, true}, {"KYQP Contest Log (Out of State)", FJP_QP1, false}, {"Louisiana QSO Party Contest Log", FJP_QP1, true}, {"LAQP Contest Log (Out of State)", FJP_QP1, false}, {"Missouri QSO Party Contest Log", FJP_QP1, true}, {"MOQP Contest Log (Out of State)", FJP_QP1, false}, {"Mississippi QSO Party Contest Log", FJP_QP1, true}, {"MSQP Contest Log (Out of State)", FJP_QP1, false}, {"North Dakota QSO Party Contest Log", FJP_QP1, true}, {"NDQP Contest Log (Out of State)", FJP_QP1, false}, {"New Jersey QSO Party Contest Log", FJP_QP1, true}, {"NJQP Contest Log (Out of State)", FJP_QP1, false}, {"Montana QSO Party Contest Log", FJP_QP2, true}, {"MTQP Contest Log (Out of State)", FJP_QP2, false}, {"Nebraska QSO Party Contest Log", FJP_QP2, true}, {"NEQP Contest Log (Out of State)", FJP_QP2, false}, {"New York QSO Party Contest Log", FJP_QP2, true}, {"NYQP Contest Log (Out of State)", FJP_QP2, false}, {"Ohio QSO Party Contest Log", FJP_QP2, true}, {"OHQP Contest Log (Out of State)", FJP_QP2, false}, {"Oklahoma QSO Party Contest Log", FJP_QP2, true}, {"OKQP Contest Log (Out of State)", FJP_QP2, false}, {"Ontario QSO Party Contest Log", FJP_QP2, true}, {"ONQP Contest Log (Out of Province)", FJP_QP2, false}, {"South Dakota QSO Party Contest Log", FJP_QP2, true}, {"SDQP Contest Log (Out of State)", FJP_QP2, false}, {"Tennessee QSO Party Contest Log", FJP_QP2, true}, {"TNQP Contest Log (Out of State)", FJP_QP2, false}, {"Texas QSO Party Contest Log", FJP_QP2, true}, {"TXQP Contest Log (Out of State)", FJP_QP2, false}, {"Vermont QSO Party Contest Log", FJP_QP2, true}, {"VTQP Contest Log (Out of State)", FJP_QP2, false}, {"Washington Salmon Run QSO Party Contest Log", FJP_QP2, true}, {"WAQP Contest Log (Out of State)", FJP_QP2, false}, {"Maine QSO Party Contest Log", FJP_QP2, true}, {"MEQP Contest Log (Out of State)", FJP_QP2, false}, {"Arizona QSO Party Contest Log", FJP_QP3, true}, {"AZQP Contest Log (Out of State)", FJP_QP3, false}, {"California QSO Party Contest Log", FJP_QP3, true}, {"CAQP Contest Log (Out of State)", FJP_QP3, false}, {"Michigan QSO Party Contest Log", FJP_QP3, true}, {"MIQP Contest Log (Out of State)", FJP_QP3, false}, {"Pennsylvania QSO Party Contest Log", FJP_QP3, true}, {"PAQP Contest Log (Out of State)", FJP_QP3, false}, {"Virginia QSO Party Contest Log", FJP_QP3, true}, {"VAQP Contest Log (Out of State)", FJP_QP3, false}, {"Colorado QSO Party Contest Log", FJP_QP4, true}, {"COQP Contest Log (Out of State)", FJP_QP4, false}, {"Maryland QSO Party Contest Log", FJP_MDQP, true}, {"MDQP Contest Log (Out of State)", FJP_MDQP, false}, {"Minnesota QSO Party Contest Log", FJP_QP4, true}, {"MNQP Contest Log (Out of State)", FJP_QP4, false}, {"New Mexico QSO Party Contest Log", FJP_QP4, true}, {"NMQP Contest Log (Out of State)", FJP_QP4, false}, {"North Carolina QSO Party Contest Log", FJP_QP6, true}, {"NCQP Contest Log (Out of State)", FJP_QP6, false}, {"South Carolina QSO Party Contest Log", FJP_QP5, true}, {"SCQP Contest Log (Out of State)", FJP_QP5, false}, {"West Virginia QSO Party Contest Log", FJP_QP5, true}, {"WVQP Contest Log (Out of State)", FJP_QP5, false}, {"Wisconsin QSO Party Contest Log", FJP_QP6, true}, {"WIQP Contest Log (Out of State)", FJP_QP6, false}, {"7QP QSO Party Contest Log", FJP_7QP, true}, {"7QP Contest Log (Out of Region)", FJP_7QP, false}, {"New England QSO Party Contest Log", FJP_NEQP, true}, {"NEQP Contest Log (Out of Region)", FJP_NEQP, false} }; int n3fjp_contest = FJP_NONE; bool n3fjp_in_state = false; int n3fjp_wait = 0; void adjust_freq(string s); void n3fjp_parse_response(string s); void n3fjp_disp_report(string s, string fm = "", bool tofile = true); void n3fjp_send(string cmd, bool tofile = true); void n3fjp_rcv(string &rx, bool tofile = true); void n3fjp_send_freq_mode(); void n3fjp_clear_record(); void n3fjp_getfields(); void n3fjp_get_record(string call); static string ParseField(string &record, string fieldtag); static string ParseTextField(string &record, string fieldtag); static string ucasestr(string s); static void n3fjp_parse_data_stream(string buffer); static void n3fjp_parse_calltab_event(string buffer); string fmt_date(string date); string fmt_time(string time); string field_rec(string fld, string val); static string n3fjp_tstmode(); static string n3fjp_opmode(); static string n3fjp_opband(); static string n3fjp_freq(); static void send_control(const string ctl, string val); static void send_action(const string action); static void send_command(const string command, string val=""); static void send_data(); static void send_data_norig(); void get_n3fjp_frequency(); void do_n3fjp_add_record_entries(); void n3fjp_set_freq(long f); void n3fjp_set_ptt(int on); void n3fjp_add_record(cQsoRec &record); void n3fjp_parse_response(string tempbuff); void n3fjp_rcv_data(); static bool connect_to_n3fjp_server(); void n3fjp_start(); void n3fjp_disconnect(bool clearlog = false); void *n3fjp_loop(void *args); void n3fjp_init(void); void n3fjp_close(void); //====================================================================== // //====================================================================== static std::string strip(std::string s) { while (s.length() && (s[0] <= ' ')) s.erase(0,1); while (s.length() && (s[s.length()-1] <= ' ')) s.erase(s.length()-1, 1); return s; } //====================================================================== // //====================================================================== void adjust_freq(string sfreq) { long freq; size_t pp = sfreq.find("."); if (pp == string::npos) return; while ((sfreq.length() - pp) < 7) sfreq.append("0"); sfreq.erase(pp,1); freq = atol(sfreq.c_str()); if (freq == 0) return; wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); return; if (progdefaults.N3FJP_sweet_spot) { int afreq; if (active_modem->get_mode() == MODE_CW) { afreq = progdefaults.CWsweetspot; } else if (active_modem->get_mode() == MODE_RTTY) { afreq = progdefaults.RTTYsweetspot; } else if (active_modem->get_mode() < MODE_SSB) afreq = progdefaults.PSKsweetspot; else { wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); return; } freq -= (wf->USB() ? afreq : -afreq); wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); return; } wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); } //====================================================================== // //====================================================================== static notify_dialog *alert_window = 0; void set_connect_box() { if (!alert_window) alert_window = new notify_dialog; box_n3fjp_connected->color( n3fjp_connected ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_n3fjp_connected->redraw(); if (n3fjp_connected) { alert_window->notify(_("Connected to N3FJP logger"), 1.0); REQ(show_notifier, alert_window); REQ(update_main_title); } else { progdefaults.CONTESTnotes = ""; listbox_contest->index(0); listbox_QP_contests->index(0); inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); } } void n3fjp_print(string s) { if (bEXITING) return; FILE *n3fjplog = fl_fopen(pathname.c_str(), "a"); time_t t = time(NULL); struct tm stm; (void)localtime_r(&t, &stm); char sztime[12]; memset(sztime, 0, 11); snprintf(sztime, sizeof(sztime), "[%02d:%02d:%02d] ", stm.tm_hour, stm.tm_min, stm.tm_sec); s.insert(0, sztime); if (n3fjplog) { if (s[s.length()-1]!='\n') fprintf(n3fjplog, "%s\n", s.c_str()); else fprintf(n3fjplog, "%s", s.c_str()); fclose(n3fjplog); } LOG_VERBOSE("%s", s.c_str()); } void n3fjp_show(std::string s) { txt_N3FJP_data->insert(s.c_str()); txt_N3FJP_data->redraw(); } void n3fjp_disp_report(string s, string fm, bool tofile) { guard_lock report_lock(&report_mutex); if (s.empty()) return; string report = fm.append("\n").append(s); size_t p; p = report.find("\r\n"); while (p != string::npos) { report.replace(p,2,"\n"); p = report.find("\r\n"); } p = report.find(""); while (p != string::npos) { report.replace(p, 11, "\n"); p = report.find(""); } if (progdefaults.enable_N3FJP_log) REQ(n3fjp_show, report); if (tofile) n3fjp_print(report); } void n3fjp_send(string cmd, bool tofile) { guard_lock send_lock(&n3fjp_socket_mutex); if (!n3fjp_socket) { n3fjp_print("Socket not present"); return; } try { if (cmd.empty()) return; n3fjp_disp_report(cmd, "SEND:", tofile); cmd.append("\r\n"); n3fjp_socket->send(cmd); } catch (const SocketException& e) { result.str(""); result << "n3fjp_send()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void n3fjp_rcv(string &rx, bool tofile) { guard_lock read_lock(&n3fjp_socket_mutex); if (!n3fjp_socket) return; try { if (!n3fjp_socket->recv(rx)) rx.clear(); if (rx.empty()) return; n3fjp_disp_report(rx, "RCVD:", tofile); } catch (const SocketException& e) { result.str(""); result << "n3fjp_rcv()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void n3fjp_send_freq_mode() { if (!active_modem) return; string cmd; char szfreq[20]; double freq = atof(inpFreq->value()) / 1e3; snprintf(szfreq, sizeof(szfreq), "%f", freq); if (active_modem->get_mode() != tracked_mode || tracked_freq != szfreq) { tracked_mode = active_modem->get_mode(); tracked_freq = szfreq; cmd = ""; cmd.append(tracked_freq); cmd.append(""); cmd.append( mode_info[tracked_mode].adif_name ); cmd.append(""); n3fjp_send(cmd, progdefaults.enable_N3FJP_log); } } //====================================================================== // //====================================================================== static cQsoRec rec; static void n3fjp_sendRSTS(std::string s) { if (s.empty()) return; try { send_control("RSTS", s); } catch (...) { throw; } } static void n3fjp_sendRSTR(std::string s) { if (s.empty()) return; try { send_control("RSTR", s); } catch (...) { throw; } } void send_call(std::string s) { try { send_control("CALL", s.c_str()); } catch (const SocketException& e) { result.str(""); result << "send_call()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_freq(std::string s) { try { send_control("FREQUENCY", s); } catch (const SocketException& e) { result.str(""); result << "send_freq()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_band(std::string s) { try { send_control("BAND", s); } catch (const SocketException& e) { result.str(""); result << "send_band()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_mode(std::string s) { try { send_control("MODE", s); } catch (const SocketException& e) { result.str(""); result << "send_mode()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_state(std::string s) { try { send_control("STATE", s); } catch (const SocketException& e) { result.str(""); result << "send_state()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_county(std::string s) { try { send_control("COUNTYR", s); } catch (const SocketException& e) { result.str(""); result << "send_county()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_spcnum(std::string s) { try { send_control("SPCNUM", s); } catch (const SocketException& e) { result.str(""); result << "send_spcnum()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_name(std::string s) { try { send_control("NAMER", s); } catch (const SocketException& e) { result.str(""); result << "send_name()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } //====================================================================== // //====================================================================== void n3fjp_clear_record() { if(!n3fjp_socket) return; if (!n3fjp_connected) return; string cmd = "CLEAR"; try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 100; } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); } catch (...) { throw; } } //====================================================================== // //====================================================================== bool n3fjp_calltab = false; void n3fjp_getfields() { string cmd =""; try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 100; } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); n3fjp_calltab = false; } catch (...) { throw; } } void n3fjp_get_record(string call) { if(!n3fjp_socket) return; if (!n3fjp_connected) return; if (!n3fjp_calltab) return; string cmd0, cmd1, cmd2; cmd0.assign("CLEAR"); cmd1.assign("TXTENTRYCALL"); cmd1.append(call).append(""); cmd2.assign("CALLTAB"); try { n3fjp_send(cmd0, progdefaults.enable_N3FJP_log); n3fjp_send(cmd1, progdefaults.enable_N3FJP_log); n3fjp_send(cmd2, progdefaults.enable_N3FJP_log); n3fjp_calltab = false; n3fjp_wait = 100; } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); n3fjp_calltab = false; } catch (...) { throw; } } //====================================================================== // parse string containing value, e.g. // 14.01310 //====================================================================== static string ParseField(string &record, string fieldtag) { string fld_tag_start, fld_tag_end; fld_tag_start.assign("<").append(fieldtag).append(">"); fld_tag_end.assign(""); size_t p1 = record.find(fld_tag_start); if (p1 == string::npos) return ""; p1 += fld_tag_start.length(); size_t p2 = record.find(fld_tag_end, p1); if (p2 == string::npos) return ""; return record.substr(p1, p2 - p1); } //====================================================================== // parse string containing text entry values, e.g. // TXTENTRYCOUNTYRSaint Louis City //====================================================================== static string ParseTextField(string &record, string fieldtag) { string fld_tag_start; fld_tag_start.assign("TXTENTRY").append(fieldtag).append(""); size_t p1 = record.find(fld_tag_start); if (p1 == string::npos) return ""; size_t p2 = record.find("", p1); if (p2 == string::npos) return ""; p2 += strlen(""); size_t p3 = record.find("", p2); if (p3 == string::npos) return ""; return record.substr(p2, p3 - p2); } //====================================================================== // parse value contents // valuestring //====================================================================== static string ParseValueField(string field, string &record) { string start = "<"; start.append(field).append(">"); string endvalue = ""; size_t p1 = record.find(start); size_t p2 = record.find(endvalue, p1); if ((p1 == string::npos) || (p2 == string::npos) || (p2 < p1) ) return ""; p1 += start.length(); return record.substr(p1, p2 - p1); } static string ucasestr(string s) { for (size_t n = 0; n < s.length(); n++) s[n] = toupper(s[n]); return s; } //====================================================================== // //====================================================================== static void n3fjp_parse_data_stream(string buffer) { string field; field = ParseTextField(buffer, "NAMER"); if (!field.empty() && ucasestr(field) != ucasestr(inpName->value())) { for (size_t n = 1; n < field.length(); n++) field[n] = tolower(field[n]); } field = ParseTextField(buffer, "COUNTYR"); if (!field.empty() && field != inpCounty->value() && n3fjp_contest != FJP_NEQP && n3fjp_contest != FJP_7QP) field = ParseTextField(buffer, "STATE"); if (!field.empty() && field != inpState->value() && n3fjp_contest != FJP_NEQP && n3fjp_contest != FJP_7QP) field = ParseTextField(buffer, "COUNTRYWORKED"); if (!field.empty() && field != cboCountry->value()) field = ParseTextField(buffer, "GRID"); if (!field.empty() && field != inpLoc->value()) field = ParseTextField(buffer, "FREQUENCY"); if (!field.empty()) adjust_freq(field); field = ParseTextField(buffer, "CQZONE"); if (!field.empty() && field != inp_CQzone->value()) // comments field does not contain \n delimiters // substitute \n for each '-' field = ParseTextField(buffer, "COMMENTS"); if (!field.empty()) { size_t p = field.find(" - "); while (p != string::npos) { field.replace(p, 3, "\n"); p = field.find(" - "); } } } //====================================================================== // // ON6NB/P // 40 // SSB // PH // Belgium // //====================================================================== static void n3fjp_parse_calltab_event(string buffer) { // inpCall->value(ParseField(buffer, "CALL").c_str()); cboCountry->value(ParseField(buffer, "COUNTRY").c_str()); n3fjp_getfields(); } //====================================================================== // //====================================================================== string fmt_date(string date) { if (date.length() > 6) date.insert(6,"/"); if (date.length() > 4) date.insert(4,"/"); return date; } string fmt_time(string time) { if (time.length() > 4) time.insert(4,":"); if (time.length() > 2) time.insert(2,":"); return time; } string field_rec(string fld, string val) { string s; s.assign("<").append(fld).append(">"); s.append(val); s.append(""); return s; } static string n3fjp_tstmode() { if (!active_modem) return "PH"; if (active_modem->get_mode() == MODE_CW) return "CW"; if (active_modem->get_mode() == MODE_SSB) return "PH"; if (active_modem->get_mode() < MODE_SSB) return mode_info[active_modem->get_mode()].adif_name; return ""; } static string n3fjp_opmode() { if (!active_modem) return "PH"; if (active_modem->get_mode() == MODE_CW) return "CW"; if (active_modem->get_mode() == MODE_SSB) return "PH"; if (active_modem->get_mode() < MODE_SSB) return mode_info[active_modem->get_mode()].adif_name; return ""; } static string n3fjp_opband() { if (!active_modem) return ""; float freq = qsoFreqDisp->value(); freq /= 1e6; if (freq >= 1.8 && freq < 3.5) return "160"; if (freq >= 3.5 && freq < 5.3) return "80"; if (freq >= 5.3 && freq < 5.5) return "60"; if (freq >= 7.0 && freq < 7.5) return "40"; if (freq >= 14.0 && freq < 18.0) return "20"; if (freq >= 18.0 && freq < 21.0) return "17"; if (freq >= 21.0 && freq < 24.0) return "15"; if (freq >= 24.0 && freq < 28.0) return "12"; if (freq >= 28.0 && freq < 50.0) return "10"; if (freq >= 50.0 && freq < 70.0) return "6"; if (freq >= 144.0 && freq < 222.0) return "2"; if (freq >= 222.0 && freq < 420.0) return "222"; if (freq >= 420.0 && freq < 444.0) return "440"; return ""; } static string n3fjp_freq() { if (!active_modem) return ""; float freq = qsoFreqDisp->value(); if (progdefaults.N3FJP_modem_carrier) { if (ModeIsLSB(mode_info[active_modem->get_mode()].adif_name)) { freq -= active_modem->get_txfreq(); if (active_modem->get_mode() == MODE_RTTY) freq -= progdefaults.rtty_shift / 2; } else { freq += active_modem->get_txfreq(); if (active_modem->get_mode() == MODE_RTTY) freq += progdefaults.rtty_shift / 2; } } freq /= 1e6; char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%f", freq); return szfreq; } static void send_control(const string ctl, string val) { string cmd; cmd.assign("TXTENTRY").append(ctl); cmd.append(""); cmd.append(val); cmd.append(""); try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 100; } catch (...) { throw; } } static void send_action(const string action) { string cmd; cmd.assign(""); cmd.append(action); cmd.append(""); try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 200;//100; } catch (...) { throw; } } static void send_command(const string command, string val) { string cmd; cmd.assign("<").append(command).append(">"); if (!val.empty()) cmd.append("").append(val).append(""); cmd.append(""); try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); // MilliSleep(5); n3fjp_wait = 100; } catch (...) { throw; } } static void n3fjp_send_NONE() { try { send_control("DATE", fmt_date(rec.getField(QSO_DATE))); send_control("TIMEON", fmt_time(rec.getField(TIME_ON))); send_control("TIMEOFF", fmt_time(rec.getField(TIME_OFF))); send_name(strip(rec.getField(NAME))); send_control("COMMENTS", strip(rec.getField(NOTES))); send_control("POWER", strip(rec.getField(TX_PWR))); send_state(rec.getField(STATE)); send_control("GRID", strip(rec.getField(GRIDSQUARE))); send_control("QTHGROUP", strip(rec.getField(QTH))); send_county(rec.getField(CNTY)); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // ARRL Field Day static void n3fjp_send_FD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", strip(ucasestr(rec.getField(CLASS)))); send_control("SECTION", strip(ucasestr(rec.getField(ARRL_SECT)))); } catch (...) { throw; } } // Winter Field Day static void n3fjp_send_WFD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", strip(ucasestr(rec.getField(CLASS)))); send_control("SECTION", strip(ucasestr(rec.getField(ARRL_SECT)))); } catch (...) { throw; } } // Kids Day static void n3fjp_send_KD() { try { send_name(rec.getField(NAME)); send_control("AGE", rec.getField(AGE)); std::string stprc = strip(ucasestr(rec.getField(STATE))); if (stprc.empty()) stprc = strip(ucasestr(rec.getField(VE_PROV))); if (stprc.empty()) stprc = strip(rec.getField(COUNTRY)); send_spcnum(stprc); send_control("COMMENTS", strip(rec.getField(XCHG1))); } catch (...) { throw; } } // ARRL Rookie Roundup static void n3fjp_send_ARR() { try { send_name(rec.getField(NAME)); send_control("CHECK", rec.getField(CHECK)); if (rec.getField(XCHG1)[0]) send_spcnum(strip(ucasestr(rec.getField(XCHG1)))); else send_spcnum(strip(ucasestr(rec.getField(COUNTRY)))); } catch (...) { throw; } } // ARRL RTTY static void n3fjp_send_RTTY() { try { if (rec.getField(SRX)[0]) send_spcnum(strip(rec.getField(SRX))); else if (rec.getField(STATE)[0]) send_spcnum(strip(ucasestr(rec.getField(STATE)))); else if (rec.getField(VE_PROV)[0]) send_spcnum(strip(ucasestr(rec.getField(VE_PROV)))); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // ARRL School Club Roundup static void n3fjp_send_ASCR() { try { send_name(strip(rec.getField(NAME))); send_control("CLASS", ucasestr(rec.getField(CLASS))); send_spcnum(ucasestr(rec.getField(XCHG1))); } catch (...) { throw; } } // ARRL Jamboree On The Air static void n3fjp_send_JOTA() { try { send_name(rec.getField(SCOUTR)); // received scout name send_control("NAMES", rec.getField(SCOUTS)); // sent scout name send_control("CHECK", rec.getField(TROOPR)); // received troop number send_control("TROOPS", rec.getField(TROOPS)); // sent troop number if (state_test(rec.getField(STATE))) send_spcnum(ucasestr(rec.getField(STATE))); else if (province_test(rec.getField(VE_PROV))) send_spcnum(ucasestr(rec.getField(VE_PROV))); else send_spcnum(rec.getField(COUNTRY)); // St / Pr / Cntry send_control("COMMENTS", rec.getField(NOTES)); } catch (...) { throw; } } // CQ WPX static void n3fjp_send_WPX() { try { send_call(rec.getField(CALL)); send_freq(n3fjp_freq()); send_band(n3fjp_opband()); send_mode(n3fjp_opmode()); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); send_control("SERIALNOR", strip(rec.getField(SRX))); } catch (...) { throw; } } // Italian ARI International DX static void n3fjp_send_IARI() { try { if (rec.getField(SRX)[0]) send_spcnum(rec.getField(SRX)); else send_spcnum(ucasestr(rec.getField(XCHG1))); // send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // North American Sprint static void n3fjp_send_NAS() { try { send_name(rec.getField(NAME)); send_control("SERIALNOR", strip(rec.getField(SRX))); send_spcnum(strip(ucasestr(rec.getField(XCHG1)))); } catch (...) { throw; } } // CQ World Wide RTTY static void n3fjp_send_CQWWRTTY() { try { send_control("CQZONE", strip(rec.getField(CQZ))); send_state(rec.getField(STATE)); send_control("COUNTRYWORKED", strip(rec.getField(COUNTRY))); } catch (...) { throw; } } // CQ World Wide DX static void n3fjp_send_CQWWDX() { try { send_control("CQZONE", strip(rec.getField(CQZ))); send_control("COUNTRYWORKED", strip(rec.getField(COUNTRY))); } catch (...) { throw; } } // Sweepstakes static void n3fjp_send_SS() { try { send_control("SERIALNOR", strip(rec.getField(SS_SERNO))); send_control("PRECEDENCE", strip(rec.getField(SS_PREC))); send_control("CHECK", strip(rec.getField(SS_CHK))); send_control("SECTION", strip(rec.getField(SS_SEC))); } catch (...) { throw; } } // North American QSO Party static void n3fjp_send_NAQP() { try { send_name(rec.getField(NAME)); if (strlen(rec.getField(XCHG1)) > 0) send_spcnum(ucasestr(rec.getField(XCHG1))); } catch (...) { throw; } } // Ten Ten static void n3fjp_send_1010() { try { send_name(rec.getField(NAME)); send_control("1010", rec.getField(TEN_TEN)); if (strlen(rec.getField(XCHG1)) > 0) send_spcnum(ucasestr(rec.getField(XCHG1))); } catch (...) { throw; } } // Africa International DX static void n3fjp_send_AIDX() { try { send_control("SERIALNOR", strip(rec.getField(SRX))); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // ARRL International DX (CW) static void n3fjp_send_AICW() { try { send_spcnum(rec.getField(XCHG1)); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } static void n3fjp_send_GENERIC() { try { send_control("SERIALNOR", strip(rec.getField(SRX))); send_spcnum(strip(ucasestr(rec.getField(XCHG1)))); } catch (...) { throw; } } static void n3fjp_send_VHF() { try { std::string grid = strip(rec.getField(GRIDSQUARE)); if (grid.length() > 4) grid.erase(4); send_control("GRID", grid); } catch (...) { throw; } } static void n3fjp_send_WAE() { try { send_control("SERIALNOR", strip(rec.getField(SRX))); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "MD SQP" "", "B", "B", "", "", "", "B", "" static void n3fjp_send_MDQSP() { try { if (rec.getField(XCHG1)[0]) send_control("CATEGORY", ucasestr(strip(rec.getField(XCHG1)))); send_county(strip(rec.getField(CNTY))); if (n3fjp_in_state) { send_county(ucasestr(strip(rec.getField(CNTY)))); if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "New Eng", "B", "B", "B", "", "I", "", "", "CCCSS" // MA, NH, VT, MA, CT, RI static void n3fjp_send_NEQP() { try { if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "7QP", "B", "B", "B", "", "I", "", "", "SSCCC" // AZ ID OR MT NV WA WY static void n3fjp_send_7QP() { static string st7QP = "AZ ID OR MT NV WA WY UT"; try { std::string st = rec.getField(STATE); std::string cnty = rec.getField(CNTY); if (cnty.length() == 5) { if (st7QP.find(cnty.substr(0,2)) != std::string::npos) st = cnty.substr(0,2); } send_spcnum(st); send_county(cnty); if (progdefaults.SQSOinstate && !st.empty()) { // in region if (st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } else send_spcnum(st); } else { // out of region if (!st.empty() && st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 1" "B", "B", "B", "", "I", "", "", "" //AL, AR, FL, GA, HI, IA, ID, IL, KS, KY, LA, MO, MI, ND, NJ, BC, 7QP static void n3fjp_send_QP1() { try { std::string st = rec.getField(STATE); if (st.empty()) st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(CNTY)[0]) { if (st == "BC") { // British Columbia Cstates cs; send_county(cs.cnty_short(st, rec.getField(CNTY))); } else send_county(rec.getField(CNTY)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 2" "B", "B", "B", "", "B", "", "", "" // MT, NE, NY, OH, OK, ON, SK, TN, TX, VT, WA, ME static void n3fjp_send_QP2() { try { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 3" "", "B", "B", "B", "I", "", "", "" // AZ, CA, MI, PA, VI static void n3fjp_send_QP3() { try { if (n3fjp_in_state) { // in state log if (rec.getField(STATE)[0]) { send_spcnum(rec.getField(STATE)); // string county = states.county(rec.getField(STATE), rec.getField(CNTY)); // if (!county.empty()) if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); } else { // out of state log std::string county = rec.getField(CNTY); if (!county.empty()) // { send_county(county); // } else // send_county(rec.getField(CNTY)); // may be ARRL section } send_control("SERIALNOR", strip(rec.getField(SRX))); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 4" "", "B", "B", "", "I", "B", "", "" // CO, MN, NM static void n3fjp_send_QP4() { try { // RST sent/rcvd not required, but will be accepted by logger if (n3fjp_in_state) { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(NAME)[0]) send_name(rec.getField(NAME)); if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } else { // std::string st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; // send_county(states.county(st, rec.getField(CNTY))); send_county(rec.getField(CNTY)); if (rec.getField(NAME)[0]) send_name(rec.getField(NAME)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 5" "B", "I", "B", "", "", "", "", "" // SC, WV static void n3fjp_send_QP5() { try { if (n3fjp_in_state) { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); send_county(rec.getField(CNTY)); } else { send_county(rec.getField(CNTY)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 6" "B", "B", "B", "", "I", "", "", "" // NC, WI static void n3fjp_send_QP6() { try { if (n3fjp_in_state) { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } else { // send_county(states.county(rec.getField(STATE), rec.getField(CNTY))); send_county(rec.getField(CNTY)); } } catch (...) { throw; } } // check fields for duplicates // ARRL Field Day static void n3fjp_check_FD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", inpClass->value()); send_control("SECTION", inpSection->value()); } catch (...) { throw; } return; } // Winter Field Day static void n3fjp_check_WFD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", inpClass->value()); send_control("SECTION", inpSection->value()); } catch (...) { throw; } return; } // Kids Day static void n3fjp_check_KD() { try { send_name(inpName->value()); send_control("AGE", inp_KD_age->value()); send_spcnum(ucasestr(inpQTH->value())); send_control("COMMENTS", inpXchgIn->value()); } catch (...) { throw; } return; } // ARRL Rookie Roundup static void n3fjp_check_ARR() { try { send_name(inpName->value()); send_control("CHECK", inp_ARR_check->value()); if (inpXchgIn->value()[0]) send_spcnum(ucasestr(inpXchgIn->value())); else send_spcnum(ucasestr(cboCountry->value())); } catch (...) { throw; } return; } // ARRL RTTY static void n3fjp_check_RTTY() { try { if (inpSerNo->value()[0]) send_spcnum(inpSerNo->value()); else if (inpState->value()[0]) send_spcnum(ucasestr(inpState->value())); else if (inpVEprov->value()[0]) send_spcnum(ucasestr(ucasestr(inpVEprov->value()))); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // ARRL School Club Roundup static void n3fjp_check_ASCR() { try { send_name(inpName->value()); send_spcnum(inpXchgIn->value()); send_control("CLASS", ucasestr(inpClass->value())); } catch (...) { throw; } return; } // ARRL Jamboree On The Air static void n3fjp_check_JOTA() { try { send_name(inpName->value()); send_control("CHECK", rec.getField(TROOPR)); // received troop number send_control("TROOPS", inp_JOTA_troop->value()); // sent troop number if (state_test(inpState->value())) send_spcnum(inpState->value()); else if (province_test(inpVEprov->value())) send_spcnum(inpVEprov->value()); else send_spcnum(ucasestr(cboCountry->value())); // St / Pr / Cntry send_control("CHECK", inp_JOTA_troop->value()); } catch (...) { throw; } return; } // CQ WPX static void n3fjp_check_WPX() { try { send_control("COUNTRYWORKED", cboCountry->value()); send_control("SERIALNOR", inpSerNo->value()); // send_control("CHECK", inpXchgIn->value()); } catch (...) { throw; } return; } // Italian ARI International DX static void n3fjp_check_IARI() { try { if (inpSerNo->value()[0]) send_spcnum(inpSerNo->value()); else send_spcnum(inpXchgIn->value()); // send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // North American Sprint static void n3fjp_check_NAS() { try { send_name(inpName->value()); send_control("SERIALNOR", inpSerNo->value()); send_spcnum(inpXchgIn->value()); } catch (...) { throw; } return; } // CQ World Wide RTTY static void n3fjp_check_CQWWRTTY() { try { send_control("CQZONE", inp_CQzone->value()); send_state(inpState->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // CQ World Wide DX static void n3fjp_check_CQWWDX() { try { send_control("CQZONE", inp_CQzone->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // Sweepstakes static void n3fjp_check_SS() { try { send_control("SERIALNOR", inpSerNo->value()); send_control("PRECEDENCE", inp_SS_Precedence->value()); send_control("CHECK", inp_SS_Check->value()); send_control("SECTION", inp_SS_Section->value()); } catch (...) { throw; } return; } // North American QSO Party static void n3fjp_check_NAQP() { try { send_name(inpName->value()); send_spcnum(inpXchgIn->value()); } catch (...) { throw; } return; } // Ten Ten static void n3fjp_check_1010() { try { send_name(inpName->value()); send_control("1010", inp_1010_nr->value()); send_spcnum(inpXchgIn->value()); } catch (...) { throw; } return; } // Africa International DX static void n3fjp_check_AIDX() { try { send_control("SERIALNOR", inpSerNo->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // ARRL International DX (CW) static void n3fjp_check_AICW() { try { send_spcnum(inpSPCnum->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } static void n3fjp_check_GENERIC() { try { send_control("SERIALNOR", inpSerNo->value()); send_spcnum(ucasestr(inpXchgIn->value())); } catch (...) { throw; } return; } static void n3fjp_check_VHF() { try { std::string grid = inpLoc->value(); if (grid.length() > 4) grid.erase(4); send_control("GRID", grid); } catch (...) { throw; } return; } static void n3fjp_check_WAE() { try { send_control("SERIALNOR", inpSerNo->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "MD SQP" "", "B", "B", "", "", "", "B", "" static void n3fjp_check_MDQSP() { try { send_county(inpCounty->value()); if (inpSQSO_category->value()[0]) send_control("CATEGORY", inpSQSO_category->value()); if (n3fjp_in_state) { if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "New Eng", "B", "B", "B", "", "I", "", "", "CCCSS" // MA, NH, VT, MA, CT, RI static void n3fjp_check_NEQP() { static std::string stNEQP = "CT MA ME NH RI VT"; try { std::string st = inpState->value(); std::string cnty = inpCounty->value(); if (cnty.length() == 5) { if (stNEQP.find(cnty.substr(cnty.length() - 3, 2)) != std::string::npos) st = cnty.substr(cnty.length() - 3, 2); } if (progdefaults.SQSOinstate && !st.empty()) { // in region if (stNEQP.find(st) != std::string::npos) { if(!cnty.empty()) send_county(cnty); send_spcnum(st); } else send_spcnum(st); } else { // out of region if (!st.empty() && stNEQP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "7QP", "B", "B", "B", "", "I", "", "", "SSCCC" // AZ ID OR MT NV WA WY static void n3fjp_check_7QP() { try { static string st7QP = "AZ ID OR MT NV WA WY UT"; std::string st = inpState->value(); std::string cnty = inpCounty->value(); if (cnty.length() == 5 && !inpState->value()[0]) { if (st7QP.find(cnty.substr(0,2)) != std::string::npos) st = cnty.substr(0,2); } if (progdefaults.SQSOinstate && !st.empty()) { // in region if (st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } else send_spcnum(st); } else { // out of region if (!st.empty() && st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 1" "B", "B", "B", "", "I", "", "", "" //AL, AR, FL, GA, HI, IA, ID, IL, IN, KS, KY, LA, MO, MI, ND, NJ, BC, 7QP static void n3fjp_check_QP1() { try { std::string st = inpState->value(); std::string cntry = cboCountry->value(); if (st.empty()) st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (inpState->value()[0]) send_spcnum(inpState->value()); if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); if (!cntry.empty() && cntry != "USA") send_spcnum(cboCountry->value()); if (inpCounty->value()[0]) { if (st == "BC" ) { // British Columbia Cstates cs; send_county(cs.cnty_short("BC", inpCounty->value())); } else send_county(inpCounty->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 2" "B", "B", "B", "", "B", "", "", "" // MT, NE, NY, OH, OK, ON, SK, TN, TX, VT, WA, ME static void n3fjp_check_QP2() { try { if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); if (inpCounty->value()[0]) send_county(inpCounty->value()); } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 3" "", "B", "B", "B", "I", "", "", "" // AZ, CA, MI, PA, VI static void n3fjp_check_QP3() { try { if (n3fjp_in_state) { if (inpState->value()[0]) { send_spcnum(inpState->value()); // string county = states.county(inpState->value(), inpCounty->value()); // if (!county.empty()) // send_county(county); } if (inpCounty->value()[0]) send_county(inpCounty->value()); if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); if (cboCountry->value()[0] && (strcmp(cboCountry->value(), "USA") != 0)) send_spcnum(cboCountry->value()); } else { // std::string stsh = states.state_short(inpState->value()); // std::string county = states.county(stsh, inpCounty->value()); // if (!county.empty()) { // send_county(county); // } else if (inpCounty->value()[0]) send_county(inpCounty->value()); } send_control("SERIALNOR", inpSerNo->value()); } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 4" "", "B", "B", "", "I", "B", "", "" // CO, MN, NM /* N3FJP's Colorado QSO Party Contest Log TXTENTRYSPCNUM TXTENTRYNAMER TXTENTRYCOUNTYR TXTENTRYCALL LBLDIALOGUEReady to begin! */ static void n3fjp_check_QP4() { try { if (n3fjp_in_state) { std::string cntry = cboCountry->value(); if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (!cntry.empty() && cntry != "USA") send_county(inpCounty->value()); if (inpCounty->value()[0]) send_county(inpCounty->value()); if (inpName->value()[0]) send_name(inpName->value()); } else { std::string st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; // send_county(states.county(st, inpCounty->value())); send_county(inpCounty->value()); if (inpName->value()[0]) send_name(inpName->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 5" "B", "I", "B", "", "", "", "", "" // SC, WV static void n3fjp_check_QP5() { try { if (n3fjp_in_state) { if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); if (inpCounty->value()[0]) send_county(inpCounty->value()); }else { send_county(inpCounty->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 6" "B", "B", "B", "", "I", "", "", "" // NC, WI static void n3fjp_check_QP6() { try { if (n3fjp_in_state) { if (inpCounty->value()[0]) send_county(inpCounty->value()); if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); } else { // send_county(states.county(inpState->value(), inpCounty->value())); send_county(inpCounty->value()); } } catch (...) { throw; } return; } static void check_log_data() { try{ switch (n3fjp_contest) { case FJP_FD: n3fjp_check_FD(); break; case FJP_WFD: n3fjp_check_WFD(); break; case FJP_KD: n3fjp_check_KD(); break; case FJP_ARR: n3fjp_check_ARR(); break; case FJP_RTTY: n3fjp_check_RTTY(); break; case FJP_ASCR: n3fjp_check_ASCR(); break; case FJP_JOTA: n3fjp_check_JOTA(); break; case FJP_CQ_WPX: n3fjp_check_WPX(); break; case FJP_IARI: n3fjp_check_IARI(); break; case FJP_NAS: n3fjp_check_NAS(); break; case FJP_CQWWRTTY: n3fjp_check_CQWWRTTY(); break; case FJP_CQWWDX: n3fjp_check_CQWWDX(); break; case FJP_SS: n3fjp_check_SS(); break; case FJP_NAQP: n3fjp_check_NAQP(); break; case FJP_1010: n3fjp_check_1010(); break; case FJP_AIDX: n3fjp_check_AIDX(); break; case FJP_AICW: n3fjp_check_AICW(); break; case FJP_VHF: n3fjp_check_VHF(); break; case FJP_WAE: n3fjp_check_WAE(); break; case FJP_MDQP: n3fjp_check_MDQSP(); break; case FJP_7QP: n3fjp_check_7QP(); break; case FJP_NEQP: n3fjp_check_NEQP(); break; case FJP_QP1: n3fjp_check_QP1(); break; case FJP_QP2: n3fjp_check_QP2(); break; case FJP_QP3: n3fjp_check_QP3(); break; case FJP_QP4: n3fjp_check_QP4(); break; case FJP_QP5: n3fjp_check_QP5(); break; case FJP_QP6: n3fjp_check_QP6(); break; case FJP_ACL: case FJP_NONE: default: n3fjp_check_GENERIC(); } } catch (...) { throw; } } int n3fjp_dupcheck() { guard_lock rx_lock(&n3fjp_mutex); string chkcall = inpCall->value(); if (chkcall.length() < 3) return false; if ((chkcall.length() == 3) && isdigit(chkcall[2])) return false; string cmd; try { send_call(chkcall); send_band(strip(n3fjp_opband())); send_mode(n3fjp_tstmode()); n3fjp_sendRSTS(inpRstOut->value()); n3fjp_sendRSTR(inpRstIn->value()); check_log_data(); send_action("CALLTAB"); } catch (...) { throw; } return 0; } static void send_log_data() { send_call(rec.getField(CALL)); send_band(strip(n3fjp_opband())); send_mode(n3fjp_opmode()); n3fjp_sendRSTS(rec.getField(RST_SENT)); n3fjp_sendRSTR(rec.getField(RST_RCVD)); try { switch (n3fjp_contest) { case FJP_NONE: n3fjp_send_NONE(); break; case FJP_FD: n3fjp_send_FD(); break; case FJP_WFD: n3fjp_send_WFD(); break; case FJP_KD: n3fjp_send_KD(); break; case FJP_ARR: n3fjp_send_ARR(); break; case FJP_RTTY: n3fjp_send_RTTY(); break; case FJP_ASCR: n3fjp_send_ASCR(); break; case FJP_JOTA: n3fjp_send_JOTA(); break; case FJP_CQ_WPX: n3fjp_send_WPX(); break; case FJP_IARI: n3fjp_send_IARI(); break; case FJP_NAS: n3fjp_send_NAS(); break; case FJP_CQWWRTTY: n3fjp_send_CQWWRTTY(); break; case FJP_CQWWDX: n3fjp_send_CQWWDX(); break; case FJP_SS: n3fjp_send_SS(); break; case FJP_NAQP: n3fjp_send_NAQP(); break; case FJP_1010: n3fjp_send_1010(); break; case FJP_AIDX: n3fjp_send_AIDX(); break; case FJP_AICW: n3fjp_send_AICW(); break; case FJP_VHF: n3fjp_send_VHF(); break; case FJP_WAE: n3fjp_send_WAE(); break; case FJP_MDQP: n3fjp_send_MDQSP(); break; case FJP_7QP: n3fjp_send_7QP(); break; case FJP_NEQP: n3fjp_send_NEQP(); break; case FJP_QP1: n3fjp_send_QP1(); break; case FJP_QP2: n3fjp_send_QP2(); break; case FJP_QP3: n3fjp_send_QP3(); break; case FJP_QP4: n3fjp_send_QP4(); break; case FJP_QP5: n3fjp_send_QP5(); break; case FJP_QP6: n3fjp_send_QP6(); break; case FJP_ACL: n3fjp_send_NONE(); break; default: n3fjp_send_GENERIC(); break; } send_command("NEXTSERIALNUMBER"); } catch (...) { throw; } } static void enter_log_data() { try { send_log_data(); send_action("ENTER"); if (n3fjp_contest != FJP_SS) { string other = "XCVR:"; char szfreq[6]; snprintf(szfreq, sizeof(szfreq), "%d", (int)active_modem->get_txfreq()); other.append(ModeIsLSB(rec.getField(ADIF_MODE)) ? "LSB" : "USB"); other.append(" MODE:"); other.append(strip(rec.getField(ADIF_MODE))); other.append(" WF:"); other.append(szfreq); send_control("OTHER8", other); } } catch (...) { throw; } } static void send_data() { try { send_command("IGNORERIGPOLLS", "TRUE"); send_call(rec.getField(CALL)); send_freq(n3fjp_freq()); send_band(n3fjp_opband()); send_mode(n3fjp_opmode()); enter_log_data(); send_command("IGNORERIGPOLLS", "FALSE"); } catch (...) { throw; } } static void send_data_norig() { try { string cmd; send_call(rec.getField(CALL)); cmd = ""; cmd.append("").append(n3fjp_opband()).append(""); cmd.append("").append(n3fjp_opmode()).append(""); cmd.append(""); n3fjp_send(cmd, progdefaults.enable_N3FJP_log); enter_log_data(); } catch (...) { throw; } } void get_n3fjp_frequency() { try { send_command("READBMF"); } catch (...) { throw; } } void do_n3fjp_add_record_entries() { if(!n3fjp_socket) return; if (!n3fjp_connected) return; string cmd, response, val; try { if (n3fjp_has_xcvr_control == N3FJP) send_data(); else send_data_norig(); } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); throw e; } n3fjp_bool_add_record = false; } void n3fjp_set_freq(long f) { char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%ld", f); string freq = szfreq; while (freq.length() < 7) freq.insert(0, "0"); freq.insert(freq.length() - 6, "."); string cmd; cmd.assign(""); cmd.append(freq); cmd.append("TRUE"); { guard_lock send_lock(&send_this_mutex); send_this = cmd; } } void n3fjp_set_ptt(int on) { if (n3fjp_has_xcvr_control != N3FJP) return; string cmd = ""; if (on) { if (progdefaults.enable_N3FJP_RIGTX) cmd.append(""); else cmd.append(""); } else { if (progdefaults.enable_N3FJP_RIGTX) cmd.append(""); else cmd.append(""); } cmd.append(""); { guard_lock send_lock(&send_this_mutex); send_this = cmd; } } void n3fjp_add_record(cQsoRec &record) { if (!n3fjp_connected) return; rec = record; n3fjp_bool_add_record = true; } std::string n3fjp_serno = ""; void n3fjp_parse_next_serial(string buff) { n3fjp_serno = ParseValueField("NEXTSERIALNUMBERRESPONSE", buff); updateOutSerNo(); } //====================================================================== // //====================================================================== void n3fjp_parse_response(string tempbuff) { if (tempbuff.empty()) return; size_t p1 = string::npos, p2 = string::npos; if (tempbuff.find("RIGRESPONSE") != string::npos) { size_t p0 = tempbuff.find(""); if (p0 != string::npos) { p0 += strlen(""); string rigname = tempbuff.substr(p0); p0 = rigname.find(""); if (p0 != string::npos) { rigname.erase(p0); if (rigname != "None" && rigname != "Client API") { n3fjp_has_xcvr_control = N3FJP; send_command("READBMF"); } else n3fjp_has_xcvr_control = FLDIGI; } } } if (n3fjp_has_xcvr_control == N3FJP) { if ((p1 = tempbuff.find("")) != string::npos) { p1 += strlen(""); p2 = tempbuff.find("", p1); if (p2 == string::npos) return; string sfreq = tempbuff.substr(p1, p2 - p1); REQ(adjust_freq, sfreq); } else if (tempbuff.find("") != string::npos) { string sfreq = ParseField(tempbuff, "FREQ"); REQ(adjust_freq, sfreq); } } if (tempbuff.find("") != string::npos) { n3fjp_rxbuffer = tempbuff; REQ(n3fjp_parse_calltab_event, tempbuff); } if (tempbuff.find("ALLFIELDSWVRESPONSE") != string::npos) { REQ(n3fjp_parse_data_stream, tempbuff); } if (tempbuff.find("") != string::npos) { send_command("NEXTSERIALNUMBER"); } if (tempbuff.find("") != string::npos) { REQ(n3fjp_parse_next_serial, tempbuff); } if (tempbuff.find("CALLTABDUPEEVENT") != string::npos && tempbuff.find("Duplicate") != string::npos) { if (tempbuff.find("Possible") != string::npos) REQ(show_dup, (void*)2); else REQ(show_dup, (void*)1); } } //====================================================================== // //====================================================================== void n3fjp_rcv_data() { string tempbuff = ""; try { n3fjp_rcv(tempbuff, progdefaults.enable_N3FJP_log); n3fjp_parse_response(tempbuff); } catch (const SocketException& e) { result.str(""); result << "n3fjp_rcv_data()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } static int logger_nbr = 0; inline bool match(std::string s1, std::string s2) { return (s1.find(s2) != std::string::npos || s2.find(s1) != std::string::npos); } static void select_fldigi_logging() { // check for specific contest size_t n = 0; std::string logger = n3fjp_logger[logger_nbr].program; n3fjp_print(std::string("logger: ").append(logger)); if (logger == "Amateur Contact Log") { listbox_contest->index(0); progdefaults.logging = 0; UI_select(); return; } if ((n = logger.find("Jamboree") != std::string::npos)) { logger.insert(0, "ARRL "); } if (logger.find("CQ WW DX RTTY") != std::string::npos) logger = "WW DX RTTY"; progdefaults.CONTESTnotes = ""; for (int n = 2; !contests[n].name.empty(); n++) { if (match(contests[n].name, logger)) { progdefaults.logging = n; listbox_contest->index(n); listbox_QP_contests->index(0); UI_select(); progdefaults.CONTESTnotes = contests[progdefaults.logging].notes; inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); n3fjp_print(std::string("found: ").append(contests[n].name)); return; } } n3fjp_print(std::string("Check for SQSO: ").append(logger)); if ((n = logger.find("QP Contest Log")) != std::string::npos) { logger.erase(n + 2, 12); progdefaults.logging = LOG_SQSO; listbox_contest->index(progdefaults.logging); n3fjp_print(std::string("Out of state SQSO log: ").append(logger)); } else if ((n = logger.find(" QSO Party Contest Log")) != std::string::npos) { logger.erase(n + 10); progdefaults.logging = LOG_SQSO; listbox_contest->index(progdefaults.logging); n3fjp_print(std::string("In state SQSO log: ").append(logger)); } for (n = 1; QSOparties.qso_parties[n].contest[0]; n++) { if (logger == QSOparties.qso_parties[n].contest) { n3fjp_print(std::string("QSOparty: ").append(QSOparties.qso_parties[n].contest)); progdefaults.SQSOcontest = n; listbox_QP_contests->index(progdefaults.SQSOcontest - 1); inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); progdefaults.CONTESTnotes = QSOparties.qso_parties[progdefaults.SQSOcontest].notes; adjust_for_contest(0); } } inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); UI_select(); clearQSO(); return; } static void fldigi_no_contest() { progdefaults.SQSOcontest = 0;//1; progdefaults.logging = 0; adjust_for_contest(0); UI_select(); set_log_colors(); clearQSO(); listbox_contest->index(0); } static int connect_tries = 0; static bool connect_to_n3fjp_server() { try { n3fjp_serno.clear(); if (!n3fjp_connected) n3fjp_socket->connect(); if (!n3fjp_socket->is_connected()) { MilliSleep(200); n3fjp_socket->connect(); if (!n3fjp_socket->is_connected()) { if (!connect_tries--) { result.str(""); result << "Cannot connect to server: " << n3fjp_socket->fd(); n3fjp_print(result.str()); connect_tries = 20; } return false; } result.str(""); result << "connected to n3fjp server: " << n3fjp_socket->fd(); n3fjp_print(result.str()); connect_tries = 0; } string buffer; string cmd = ""; n3fjp_send(cmd, true); buffer.clear(); size_t n; for (n = 0; n < 10; n++) { n3fjp_rcv(buffer, true); if (!buffer.empty()) break; } if (buffer.empty()) { n3fjp_print("N3FJP logger not responding"); return false; } string info = ParseField(buffer, "PGM"); connected_to = info; n3fjp_contest = FJP_NONE; n = info.find("N3FJP's "); if (n != std::string::npos) info.erase(n, 8); if (info.find("Winter") != std::string::npos) info = "Winter FD"; n3fjp_print(std::string("Info: ").append(info)); for (n = 0; n < sizeof(n3fjp_logger) / sizeof(*n3fjp_logger); n++) { if (info.find(n3fjp_logger[n].program) == 0) { n3fjp_contest = n3fjp_logger[n].contest; n3fjp_in_state = n3fjp_logger[n].in_state; logger_nbr = n; REQ(select_fldigi_logging); break; } } if (n == sizeof(n3fjp_logger) / sizeof(*n3fjp_logger)) { n3fjp_print(string(info).append(" not supported by fldigi")); return false; } else n3fjp_print(std::string("Connected to: ").append(n3fjp_logger[n].program)); send_command("NEXTSERIALNUMBER"); info.insert(0, "Connected to "); string ver = ParseField(buffer, "VER"); info.append(", Ver ").append(ver); n3fjp_connected = true; REQ(set_connect_box); cmd = " "; n3fjp_send(cmd, true); buffer.clear(); n3fjp_rcv(buffer, true); cmd = "TRUE"; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = ""; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = ""; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = ""; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = "RIGENABLED"; send_command(cmd); } catch (const SocketException& e) { result.str(""); result << e.what() << "(" << e.error() << ")"; n3fjp_print(result.str()); connected_to.clear(); LOG_ERROR("%s", result.str().c_str()); } catch (...) { n3fjp_print("Caught unknown error"); LOG_ERROR("%s", "Caught unknown error"); connected_to.clear(); } return true; } //====================================================================== // //====================================================================== void n3fjp_start() { n3fjp_ip_address = progdefaults.N3FJP_address; n3fjp_ip_port = progdefaults.N3FJP_port; try { if (n3fjp_socket) delete n3fjp_socket; n3fjp_socket = new Socket( Address( n3fjp_ip_address.c_str(), n3fjp_ip_port.c_str(), "tcp") ); if (!n3fjp_socket) return; n3fjp_socket->set_timeout(0.20);//0.05); n3fjp_socket->set_nonblocking(true); result.str(""); result << "Client socket " << n3fjp_socket->fd(); n3fjp_print(result.str()); } catch (const SocketException& e) { result.str(""); result << e.what() << "(" << e.error() << ")"; n3fjp_print(result.str()); LOG_ERROR("%s", result.str().c_str() ); delete n3fjp_socket; n3fjp_socket = 0; n3fjp_connected = false; REQ(set_connect_box); n3fjp_has_xcvr_control = UNKNOWN; } catch (...) { n3fjp_print("Caught unknown error"); n3fjp_print(result.str()); LOG_ERROR("%s", result.str().c_str() ); delete n3fjp_socket; n3fjp_socket = 0; n3fjp_connected = false; REQ(set_connect_box); n3fjp_has_xcvr_control = UNKNOWN; } } //====================================================================== // Disconnect from N3FJP tcpip server //====================================================================== void n3fjp_disconnect(bool clearlog) { if (n3fjp_socket) { n3fjp_send("", false);//progdefaults.enable_N3FJP_log); delete n3fjp_socket; n3fjp_socket = 0; } n3fjp_connected = false; n3fjp_has_xcvr_control = UNKNOWN; n3fjp_serno.clear(); connected_to.clear(); REQ(set_connect_box); if (clearlog) REQ(fldigi_no_contest); n3fjp_print("Disconnected"); } //====================================================================== // Thread loop //====================================================================== void *n3fjp_loop(void *args) { SET_THREAD_ID(N3FJP_TID); int loopcount = 9; int n3fjp_looptime = 100; // initially 0.1 second delay to connect while(1) { if (n3fjp_exit) break; MilliSleep(10); if (n3fjp_wait) n3fjp_wait -= 10; if (n3fjp_looptime) n3fjp_looptime -= 10; if (n3fjp_wait > 0) continue; if (n3fjp_looptime > 0) continue; n3fjp_looptime = 250; // r/w to N3FJP logger every 1/4 second loopcount = (loopcount + 1) % 10; if (progdefaults.connect_to_n3fjp) { if (!n3fjp_socket || (n3fjp_socket->fd() == -1)) n3fjp_start(); else { if ((n3fjp_ip_address != progdefaults.N3FJP_address) || (n3fjp_ip_port != progdefaults.N3FJP_port) ) { n3fjp_disconnect(true); n3fjp_start(); } if (!n3fjp_connected) { if (loopcount == 0) if (!connect_to_n3fjp_server()) n3fjp_disconnect(false); } else try { // insure connection still up (2.5 second interval) if (loopcount == 0) { guard_lock send_lock(&send_this_mutex); std::string buffer; string cmd = ""; n3fjp_send(cmd, false); size_t n; for (n = 0; n < 10; n++) { n3fjp_rcv(buffer, false); if (!buffer.empty()) break; } if (buffer.empty()) { n3fjp_print(std::string("Lost server connection to ").append(connected_to)); n3fjp_disconnect(true); continue; } } if (n3fjp_has_xcvr_control == FLDIGI) n3fjp_send_freq_mode(); if (!send_this.empty()) { guard_lock send_lock(&send_this_mutex); n3fjp_send(send_this, progdefaults.enable_N3FJP_log); send_this.clear(); } else if (n3fjp_bool_add_record) do_n3fjp_add_record_entries(); else { guard_lock rx_lock(&n3fjp_mutex); n3fjp_rcv_data(); } } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); n3fjp_disconnect(true); } catch (...) { n3fjp_print("Caught unknown error"); n3fjp_disconnect(true); } } } else if (n3fjp_connected) n3fjp_disconnect(true); } // exit the n3fjp thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void n3fjp_init(void) { n3fjp_enabled = false; n3fjp_exit = false; if (pthread_create(&n3fjp_thread, NULL, n3fjp_loop, NULL) < 0) { LOG_ERROR("pthread_create failed"); return; } LOG_INFO("N3FJP logger thread started"); pathname = DebugDir; pathname.append("n3fjp_data_stream.txt"); rotate_log(pathname); FILE *n3fjplog = fl_fopen(pathname.c_str(), "w"); fprintf(n3fjplog, "N3FJP / fldigi tcpip log\n\n"); fclose(n3fjplog); n3fjp_enabled = true; } //====================================================================== // //====================================================================== void n3fjp_close(void) { if (!n3fjp_enabled) return; guard_lock close_lock(&n3fjp_socket_mutex); n3fjp_exit = true; CANCEL_THREAD(n3fjp_thread); pthread_join(n3fjp_thread, NULL); n3fjp_enabled = false; LOG_INFO("%s", "N3FJP logger thread terminated. "); if(n3fjp_socket) { delete n3fjp_socket; n3fjp_socket = 0; } } /* FLDIGI log fields FREQ QSO frequency in Mhz CALL contacted stations CALLSIGN MODE QSO mode NAME contacted operators NAME QSO_DATE QSO date QSO_DATE_OFF QSO date OFF, according to ADIF 2.2.6 TIME_OFF HHMM or HHMMSS in UTC TIME_ON HHMM or HHMMSS in UTC QTH contacted stations city RST_RCVD received signal report RST_SENT sent signal report STATE contacted stations STATE VE_PROV 2 letter abbreviation for Canadian Province NOTES QSO notes QSLRDATE QSL received date QSLSDATE QSL sent date EQSLRDATE EQSL received date EQSLSDATE EQSL sent date LOTWRDATE EQSL received date LOTWSDATE EQSL sent date GRIDSQUARE contacted stations Maidenhead Grid Square BAND QSO band CNTY secondary political subdivision, ie: county COUNTRY contacted stations DXCC entity name CQZ contacted stations CQ Zone DXCC contacted stations Country Code QSL_VIA contacted stations QSL manager IOTA Islands on the air ITUZ ITU zone CONT contacted stations continent SRX received serial number for a contest QSO STX QSO transmitted serial number XCHG1 contest exchange received MYXCHG contest exchange sent CLASS Field Day class received ARRL_SECT Field Day section received TX_PWR power transmitted by this station OP_CALL Callsign of person logging the QSO STA_CALL Callsign of transmitting station MY_GRID Xmt station locator MY_CITY Xmt station city SS_SEC CW sweepstakes section SS_SERNO CW sweepstakes serial number received SS_PREC CW sweepstakes precedence SS_CHK CW sweepstakes check AGE contacted operators age in years TEN_TEN contacted stations ten ten # CHECK contacted stations contest identifier |-------------------------------------------------------------| | N3FJP field | FLDIGI LOG FIELD | |--------------------------------|----------------------------| | txtEntry1010 | rec.getField(TEN_TEN) | | txtEntryCall | rec.getField(CALL) | | txtEntryCheck (Rookie Roundup) | rec.getField(CHECK) | | txtEntryCheck (1010 ??) ) | rec.getField(CHECK) | | txtEntryClass | rec.getField(CLASS) | | txtEntryCountyR | rec.getField(CNTY) | | txtEntryGrid | rec.getField(GRIDSQUARE) | | txtEntryNameR | rec.getField(NAME) | | txtEntryRSTR | rec.getField(RST_RCVD) | | txtEntryRSTS | rec.getField(RST_SENT) | | txtEntrySection | rec.getField(ARRL_SECT) | | txtEntrySection | rec.getField(SS_SEC) | | txtEntrySerialNoT | rec.getField(STX) | | txtEntrySerialNoR | rec.getField(SRX) | | txtEntrySpcNum | rec.getField(XCHG1) | | txtEntryState | rec.getField(STATE) | | txtEntryState | rec.getField(VE_PROV) ?? | |-------------------------------------------------------------| Use this command to query N3FJP logger to find which fields are visible for any given program. TXTENTRYCOUNTYR TXTENTRYSTATE TXTENTRYCOUNTRYWORKED TXTENTRYMODE TXTENTRYBAND TXTENTRYDATE TXTENTRYTIMEOFF TXTENTRYTIMEON TXTENTRYRSTS TXTENTRYRSTR TXTENTRYPOWER TXTENTRYOTHER1 TXTENTRYNAMER TXTENTRYFREQUENCY TXTENTRYCOMMENTS TXTENTRYCALL LBLDIALOGUEReady to begin! Africa All Mode: RST / Serial Received ARRL Field Day: Class / Section ARRL Kids Day: Name / Age / SPCNum ARRL Rookie Roundup: Name / Check / SPCNum ARRL RTTY: RST / SPCNum ARRL School Club Roundup: RST / Class / SPCNum / Name (optional) CQ WPX: RST / Serial Received CQ WW RTTY: RST / CQ Zone (autofilled from call) / State (or Province) Italian ARI International DX: RST / SPCNum Jamboree On The Air (lots of unrequired fields) NCJ North American QSO Party: Name / SPCNum NCJ North American Sprint: Serial Received / Name / SPCNum State QSO Parties, varies: Name State County Serial Received Section SPCNum Ten Ten: Name / SPCNum / 1010 number VHF: Grid / RST Worked All Europe: RST / Serial Received (QTCs not coded in API) Winter Field Day: Category (use class, just like ARRL Field Day) / Section */ fldigi-4.1.06/src/logbook/fd_view.cxx0000644000175000017500000004443013511722452014362 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "gettext.h" #include "fd_view.h" #include "configuration.h" Fl_Output *view_FD_call=(Fl_Output *)0; Fl_Output *view_FD_class=(Fl_Output *)0; Fl_Output *view_FD_section=(Fl_Output *)0; Fl_Output *view_FD_mult=(Fl_Output *)0; Fl_Output *view_FD_score=(Fl_Output *)0; Fl_Output *view_FD_CW[12]={(Fl_Output *)0}; Fl_Output *view_FD_CW_OP[12]={(Fl_Output *)0}; Fl_Output *view_FD_DIG[12]={(Fl_Output *)0}; Fl_Output *view_FD_DIG_OP[12]={(Fl_Output *)0}; Fl_Output *view_FD_PHONE[12]={(Fl_Output *)0}; Fl_Output *view_FD_PHONE_OP[12]={(Fl_Output *)0}; Fl_Input2 *inp_fd_tcpip_addr=(Fl_Input2 *)0; static void cb_inp_fd_tcpip_addr(Fl_Input2* o, void*) { progdefaults.fd_tcpip_addr=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_fd_tcpip_port=(Fl_Input2 *)0; static void cb_inp_fd_tcpip_port(Fl_Input2* o, void*) { progdefaults.fd_tcpip_port=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_fd_op_call=(Fl_Input2 *)0; static void cb_inp_fd_op_call(Fl_Input2* o, void*) { progdefaults.fd_op_call=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fd_connect=(Fl_Check_Button *)0; static void cb_btn_fd_connect(Fl_Check_Button* o, void*) { progdefaults.connect_to_fdserver=o->value(); if (progdefaults.connect_to_fdserver) { listbox_contest->index(LOG_FD); progdefaults.logging = LOG_FD; } else { listbox_contest->index(LOG_QSO); progdefaults.logging = LOG_QSO; } UI_select(); } Fl_Box *box_fdserver_connected=(Fl_Box *)0; Fl_Double_Window* make_fd_view() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(785, 270, _("Field Day Viewer - use with program \'fdserver\'")); w = o; if (w) {/* empty */} o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Output* o = view_FD_call = new Fl_Output(98, 6, 77, 24, _("FD Call")); o->value(progdefaults.my_FD_call.c_str()); } // Fl_Output* view_FD_call { Fl_Output* o = view_FD_class = new Fl_Output(277, 5, 38, 24, _("FD Class")); o->value(progdefaults.my_FD_class.c_str()); } // Fl_Output* view_FD_class { Fl_Output* o = view_FD_section = new Fl_Output(417, 5, 38, 24, _("FD Section")); o->value(progdefaults.my_FD_section.c_str()); } // Fl_Output* view_FD_section { Fl_Output* o = view_FD_mult = new Fl_Output(557, 5, 38, 24, _("FD Mult")); o->value(progdefaults.my_FD_mult.c_str()); } // Fl_Output* view_FD_mult { view_FD_score = new Fl_Output(698, 5, 80, 24, _("Score")); } // Fl_Output* view_FD_score { Fl_Box* o = new Fl_Box(55, 33, 50, 17, _("160")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(114, 33, 50, 17, _("80")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(174, 33, 50, 17, _("40")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(233, 33, 50, 17, _("20")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(293, 33, 50, 17, _("17")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(352, 33, 50, 17, _("15")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(414, 33, 50, 17, _("12")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(476, 33, 50, 17, _("10")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(538, 33, 50, 17, _("6")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(600, 33, 50, 17, _("2")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(660, 33, 60, 17, _("220")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(720, 33, 60, 17, _("440")); o->box(FL_FLAT_BOX); } // Fl_Box* o { view_FD_CW[0] = new Fl_Output(55, 49, 60, 24, _("CW")); } // Fl_Output* view_FD_CW[0] { view_FD_CW[1] = new Fl_Output(115, 49, 60, 24); view_FD_CW[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[1] { view_FD_CW[2] = new Fl_Output(174, 49, 60, 24); view_FD_CW[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[2] { view_FD_CW[3] = new Fl_Output(234, 49, 60, 24); view_FD_CW[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[3] { view_FD_CW[4] = new Fl_Output(293, 49, 60, 24); view_FD_CW[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[4] { view_FD_CW[5] = new Fl_Output(353, 49, 60, 24); view_FD_CW[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[5] { view_FD_CW[6] = new Fl_Output(415, 49, 60, 24); view_FD_CW[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[6] { view_FD_CW[7] = new Fl_Output(475, 49, 60, 24); view_FD_CW[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[7] { view_FD_CW[8] = new Fl_Output(536, 49, 60, 24); view_FD_CW[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[8] { view_FD_CW[9] = new Fl_Output(598, 49, 60, 24); view_FD_CW[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[9] { view_FD_CW[10] = new Fl_Output(659, 49, 60, 24); view_FD_CW[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[10] { view_FD_CW[11] = new Fl_Output(719, 49, 60, 24); view_FD_CW[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[11] { view_FD_CW_OP[0] = new Fl_Output(55, 73, 60, 24, _("Oper\'")); } // Fl_Output* view_FD_CW_OP[0] { view_FD_CW_OP[1] = new Fl_Output(115, 73, 60, 24); view_FD_CW_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[1] { view_FD_CW_OP[2] = new Fl_Output(174, 73, 60, 24); view_FD_CW_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[2] { view_FD_CW_OP[3] = new Fl_Output(234, 73, 60, 24); view_FD_CW_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[3] { view_FD_CW_OP[4] = new Fl_Output(293, 73, 60, 24); view_FD_CW_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[4] { view_FD_CW_OP[5] = new Fl_Output(353, 73, 60, 24); view_FD_CW_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[5] { view_FD_CW_OP[6] = new Fl_Output(415, 73, 60, 24); view_FD_CW_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[6] { view_FD_CW_OP[7] = new Fl_Output(475, 73, 60, 24); view_FD_CW_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[7] { view_FD_CW_OP[8] = new Fl_Output(536, 73, 60, 24); view_FD_CW_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[8] { view_FD_CW_OP[9] = new Fl_Output(598, 73, 60, 24); view_FD_CW_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[9] { view_FD_CW_OP[10] = new Fl_Output(659, 73, 60, 24); view_FD_CW_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[10] { view_FD_CW_OP[11] = new Fl_Output(719, 73, 60, 24); view_FD_CW_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[11] { view_FD_DIG[0] = new Fl_Output(55, 103, 60, 24, _("DIG")); } // Fl_Output* view_FD_DIG[0] { view_FD_DIG[1] = new Fl_Output(115, 103, 60, 24); view_FD_DIG[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[1] { view_FD_DIG[2] = new Fl_Output(174, 103, 60, 24); view_FD_DIG[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[2] { view_FD_DIG[3] = new Fl_Output(234, 103, 60, 24); view_FD_DIG[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[3] { view_FD_DIG[4] = new Fl_Output(293, 103, 60, 24); view_FD_DIG[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[4] { view_FD_DIG[5] = new Fl_Output(353, 103, 60, 24); view_FD_DIG[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[5] { view_FD_DIG[6] = new Fl_Output(415, 103, 60, 24); view_FD_DIG[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[6] { view_FD_DIG[7] = new Fl_Output(475, 103, 60, 24); view_FD_DIG[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[7] { view_FD_DIG[8] = new Fl_Output(536, 103, 60, 24); view_FD_DIG[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[8] { view_FD_DIG[9] = new Fl_Output(598, 103, 60, 24); view_FD_DIG[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[9] { view_FD_DIG[10] = new Fl_Output(659, 103, 60, 24); view_FD_DIG[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[10] { view_FD_DIG[11] = new Fl_Output(719, 103, 60, 24); view_FD_DIG[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[11] { view_FD_DIG_OP[0] = new Fl_Output(55, 128, 60, 24, _("Oper\'")); } // Fl_Output* view_FD_DIG_OP[0] { view_FD_DIG_OP[1] = new Fl_Output(115, 128, 60, 24); view_FD_DIG_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[1] { view_FD_DIG_OP[2] = new Fl_Output(174, 128, 60, 24); view_FD_DIG_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[2] { view_FD_DIG_OP[3] = new Fl_Output(234, 128, 60, 24); view_FD_DIG_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[3] { view_FD_DIG_OP[4] = new Fl_Output(293, 128, 60, 24); view_FD_DIG_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[4] { view_FD_DIG_OP[5] = new Fl_Output(353, 128, 60, 24); view_FD_DIG_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[5] { view_FD_DIG_OP[6] = new Fl_Output(415, 128, 60, 24); view_FD_DIG_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[6] { view_FD_DIG_OP[7] = new Fl_Output(475, 128, 60, 24); view_FD_DIG_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[7] { view_FD_DIG_OP[8] = new Fl_Output(536, 128, 60, 24); view_FD_DIG_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[8] { view_FD_DIG_OP[9] = new Fl_Output(598, 128, 60, 24); view_FD_DIG_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[9] { view_FD_DIG_OP[10] = new Fl_Output(659, 128, 60, 24); view_FD_DIG_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[10] { view_FD_DIG_OP[11] = new Fl_Output(719, 128, 60, 24); view_FD_DIG_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[11] { view_FD_PHONE[0] = new Fl_Output(55, 158, 60, 24, _("PHONE")); } // Fl_Output* view_FD_PHONE[0] { view_FD_PHONE[1] = new Fl_Output(115, 158, 60, 24); view_FD_PHONE[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[1] { view_FD_PHONE[2] = new Fl_Output(174, 158, 60, 24); view_FD_PHONE[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[2] { view_FD_PHONE[3] = new Fl_Output(234, 158, 60, 24); view_FD_PHONE[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[3] { view_FD_PHONE[4] = new Fl_Output(293, 158, 60, 24); view_FD_PHONE[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[4] { view_FD_PHONE[5] = new Fl_Output(353, 158, 60, 24); view_FD_PHONE[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[5] { view_FD_PHONE[6] = new Fl_Output(415, 158, 60, 24); view_FD_PHONE[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[6] { view_FD_PHONE[7] = new Fl_Output(475, 158, 60, 24); view_FD_PHONE[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[7] { view_FD_PHONE[8] = new Fl_Output(536, 158, 60, 24); view_FD_PHONE[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[8] { view_FD_PHONE[9] = new Fl_Output(598, 158, 60, 24); view_FD_PHONE[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[9] { view_FD_PHONE[10] = new Fl_Output(659, 158, 60, 24); view_FD_PHONE[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[10] { view_FD_PHONE[11] = new Fl_Output(719, 158, 60, 24); view_FD_PHONE[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[11] { view_FD_PHONE_OP[0] = new Fl_Output(55, 183, 60, 24, _("Oper\'")); } // Fl_Output* view_FD_PHONE_OP[0] { view_FD_PHONE_OP[1] = new Fl_Output(115, 183, 60, 24); view_FD_PHONE_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[1] { view_FD_PHONE_OP[2] = new Fl_Output(174, 183, 60, 24); view_FD_PHONE_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[2] { view_FD_PHONE_OP[3] = new Fl_Output(234, 183, 60, 24); view_FD_PHONE_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[3] { view_FD_PHONE_OP[4] = new Fl_Output(293, 183, 60, 24); view_FD_PHONE_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[4] { view_FD_PHONE_OP[5] = new Fl_Output(353, 183, 60, 24); view_FD_PHONE_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[5] { view_FD_PHONE_OP[6] = new Fl_Output(415, 183, 60, 24); view_FD_PHONE_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[6] { view_FD_PHONE_OP[7] = new Fl_Output(475, 183, 60, 24); view_FD_PHONE_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[7] { view_FD_PHONE_OP[8] = new Fl_Output(536, 183, 60, 24); view_FD_PHONE_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[8] { view_FD_PHONE_OP[9] = new Fl_Output(598, 183, 60, 24); view_FD_PHONE_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[9] { view_FD_PHONE_OP[10] = new Fl_Output(659, 183, 60, 24); view_FD_PHONE_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[10] { view_FD_PHONE_OP[11] = new Fl_Output(719, 183, 60, 24); view_FD_PHONE_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[11] { Fl_Group* o = new Fl_Group(5, 212, 775, 55, _("\"fdserver\" Client")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inp_fd_tcpip_addr = new Fl_Input2(85, 234, 198, 24, _("tcpip addr")); inp_fd_tcpip_addr->tooltip(_("fdserver tcipip address")); inp_fd_tcpip_addr->box(FL_DOWN_BOX); inp_fd_tcpip_addr->color(FL_BACKGROUND2_COLOR); inp_fd_tcpip_addr->selection_color(FL_SELECTION_COLOR); inp_fd_tcpip_addr->labeltype(FL_NORMAL_LABEL); inp_fd_tcpip_addr->labelfont(0); inp_fd_tcpip_addr->labelsize(14); inp_fd_tcpip_addr->labelcolor(FL_FOREGROUND_COLOR); inp_fd_tcpip_addr->callback((Fl_Callback*)cb_inp_fd_tcpip_addr); inp_fd_tcpip_addr->align(Fl_Align(FL_ALIGN_LEFT)); inp_fd_tcpip_addr->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_tcpip_addr.c_str()); } // Fl_Input2* inp_fd_tcpip_addr { Fl_Input2* o = inp_fd_tcpip_port = new Fl_Input2(325, 234, 75, 24, _("port")); inp_fd_tcpip_port->tooltip(_("fdserver tcpip port")); inp_fd_tcpip_port->box(FL_DOWN_BOX); inp_fd_tcpip_port->color(FL_BACKGROUND2_COLOR); inp_fd_tcpip_port->selection_color(FL_SELECTION_COLOR); inp_fd_tcpip_port->labeltype(FL_NORMAL_LABEL); inp_fd_tcpip_port->labelfont(0); inp_fd_tcpip_port->labelsize(14); inp_fd_tcpip_port->labelcolor(FL_FOREGROUND_COLOR); inp_fd_tcpip_port->callback((Fl_Callback*)cb_inp_fd_tcpip_port); inp_fd_tcpip_port->align(Fl_Align(FL_ALIGN_LEFT)); inp_fd_tcpip_port->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_tcpip_port.c_str()); } // Fl_Input2* inp_fd_tcpip_port { Fl_Input2* o = inp_fd_op_call = new Fl_Input2(500, 234, 90, 24, _("OP callsign")); inp_fd_op_call->tooltip(_("free form exchange")); inp_fd_op_call->box(FL_DOWN_BOX); inp_fd_op_call->color(FL_BACKGROUND2_COLOR); inp_fd_op_call->selection_color(FL_SELECTION_COLOR); inp_fd_op_call->labeltype(FL_NORMAL_LABEL); inp_fd_op_call->labelfont(0); inp_fd_op_call->labelsize(14); inp_fd_op_call->labelcolor(FL_FOREGROUND_COLOR); inp_fd_op_call->callback((Fl_Callback*)cb_inp_fd_op_call); inp_fd_op_call->align(Fl_Align(FL_ALIGN_LEFT)); inp_fd_op_call->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_op_call.c_str()); } // Fl_Input2* inp_fd_op_call { Fl_Check_Button* o = btn_fd_connect = new Fl_Check_Button(608, 236, 70, 20, _("Connect")); btn_fd_connect->tooltip(_("Connect / Disconnect^jAddr/Port/OP required")); btn_fd_connect->down_box(FL_DOWN_BOX); btn_fd_connect->callback((Fl_Callback*)cb_btn_fd_connect); o->value(progdefaults.connect_to_fdserver); } // Fl_Check_Button* btn_fd_connect { box_fdserver_connected = new Fl_Box(722, 237, 18, 18, _("Connected")); box_fdserver_connected->box(FL_ROUND_DOWN_BOX); box_fdserver_connected->color((Fl_Color)31); box_fdserver_connected->align(Fl_Align(FL_ALIGN_TOP)); } // Fl_Box* box_fdserver_connected o->end(); } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; } fldigi-4.1.06/src/logbook/contest.cxx0000664000175000017500000007062013507402064014417 00000000000000// ---------------------------------------------------------------------------- // contest.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "fl_digi.h" #include "confdialog.h" #include "contest.h" #include "icons.h" #include "dxcc.h" #include "strutil.h" static std::string SECTIONS = "\ DX \ CT RI EMA VT ME WMA NH \ ENY NNY NLI SNJ NNJ WHY \ DE MDC EPA WPA \ AL GA KY NC NFL PR SC SFL TN VA \ VI WCF AR LA MS NM NTX OK STX WTX \ EB LAX ORG PAC SB SCV SDG SF SJV SV \ AK AZ EWA ID MT NV OR UT WWA WY \ MI OH WV \ IL IN WI \ CO IA KS MN MO ND NE SD \ AB BC GTA MAR MB NL NT ONE ONN ONS QC SK "; static std::string STATES = "\ DX CT MA ME NH RI VT \ NY NJ \ DE PA MD DC \ AL FL GA KY NC SC TN VA \ AR LA MS NM OK TX \ CA HI \ AK AZ ID MT NV OR UT WA WY \ MI OH WV \ IL WI IN \ CO IA KS MN MO ND NE SD "; static std::string PROVINCES = "\ AB BC LB MB NB NF NS NU NWT ON PEI QC SK YT "; static std::string MEXICO = "\ XE1 XE2 XE3 XF1 XF4 "; static std::string IT1_ = "AL AT BI CN GE IM NO SP SV TO VB VC "; static std::string IX1_ = "AO "; static std::string IT2_ = "BG BS CO CR LC LO MB MI MN PV SO VA "; static std::string IT3_ = "BL PD RO TV VE VI VR "; static std::string IN3_ = "BZ TN "; static std::string IV3_ = "GO PN TS UD "; static std::string IT4_ = "BO FC FE MO PC PR RA RE RN "; static std::string IT5_ = "AR FI GR LI LU MS PI PO PT SI "; static std::string IT6_ = "AN AP AQ CH FM MC PE PS PU TE "; static std::string IT7_ = "BA BR BT FG LE MT TA "; static std::string IT8_ = "AV BN CB CE CS CZ IS KR NA PZ RC SA VV "; static std::string IT0_ = "FR LT PG RI RM TR VT "; static std::string IT9_ = "AG CL CT EN ME PA RG SR TP "; static std::string IS0_ = "CA NU OR SS SU "; static const std::vector* dxcc_list; std::string country_match = ""; bool class_test(std::string s) { if (s.length() < 2) return false; static std::string clss = "ABCDEF"; if (clss.find(toupper(s[s.length()-1])) == std::string::npos) return false; for (size_t n = 0; n < s.length() - 1; n++) if (s[n] < '0' || s[n] > '9') return false; return true; } bool state_test(std::string s) { if (s.empty()) return false; while (s.length() < 4) s.append(" "); bool isState = (STATES.find(ucasestr(s)) != std::string::npos); return isState; } bool county_test(std::string st, std::string cty) { if (st.empty() && !progdefaults.SQSOinstate) st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (!state_test(st)) return false; return states.valid_county( st, cty ); } bool province_test(std::string s) { while (s.length() < 4) s.append(" "); return (PROVINCES.find(ucasestr(s)) != std::string::npos); } bool district_test(std::string pr, std::string dist) { if (pr.empty() && !progdefaults.SQSOinstate) pr = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (!province_test(pr)) return false; return states.valid_county( pr, dist ); } bool check_test(std::string s) { if (s.length() < 4) { while (s.length() < 4) s.append(" "); std::string CHECK = std::string(STATES).append(PROVINCES).append(MEXICO); return (CHECK.find(s) != std::string::npos); } else return false; } bool country_test(std::string s) { std::string str = ucasestr(s); dxcc_list = dxcc_entity_list(); if (!dxcc_list) return true; for (std::vector::const_iterator i = dxcc_list->begin(); i != dxcc_list->end(); ++i) { if (ucasestr((*i)->country).find(str) != std::string::npos) { country_match = (*i)->country; return true; } } country_match.clear(); return false; } bool wfd_class_test(std::string s) { if (s.length() < 2) return false; static std::string clss = "IOH"; if (clss.find(toupper(s[s.length()-1])) == std::string::npos) return false; for (size_t n = 0; n < s.length() - 1; n++) if (s[n] < '0' || s[n] > '9') return false; return true; } bool ascr_class_test(std::string s) { if (s.length() != 1) return false; if (toupper(s[0]) == 'I' || toupper(s[0]) == 'C' || toupper(s[0]) == 'S') return true; return false; } bool section_test(std::string s) { while (s.length() < 4) s.append(" "); return (SECTIONS.find(s) != std::string::npos); } bool rookie_test(std::string s) { int year_licensed = 0; if (!sscanf(s.c_str(), "%d", &year_licensed)) return false; if (year_licensed < 100) year_licensed += 2000; int year_worked = 0; std::string s_year = std::string(zdate()).substr(0,4); sscanf(s_year.c_str(), "%d", &year_worked); if (year_worked < year_licensed) year_licensed -= 100; if (year_worked - year_licensed < 3) return true; return false; } bool c1010_test(std::string s) { for (size_t n = 0; n < s.length(); n++) if (s[n] < '0' || s[n] > '9') return false; return true; } static std::string nbrs0 = "1234567890"; static std::string nbrs1 = "12345"; static std::string nbrs2 = "123456789Nn"; bool numeric_test(std::string s) { if (s.empty()) return false; for (size_t n = 0; n < s.length(); n++) if (nbrs0.find(s[0]) == std::string::npos) return false; return true; } bool rst_test(std::string s) { if (s.length() < 3 && active_modem->get_mode() < MODE_SSB) return false; if (s.length() < 2 || s.length() > 3) return false; if (s[0] == '0') return false; if (s.length() == 2) { if (nbrs1.find(s[0]) == std::string::npos) return false; if (nbrs2.find(s[1]) == std::string::npos) return false; } else { if (nbrs1.find(s[0]) == std::string::npos) return false; if (nbrs2.find(s[1]) == std::string::npos) return false; if (nbrs2.find(s[2]) == std::string::npos) return false; } return true; } bool italian_test(std::string s) { if (s.length() != 2) return false; s.append(" "); if (IT1_.find(s) != std::string::npos || IX1_.find(s) != std::string::npos || IT2_.find(s) != std::string::npos || IT3_.find(s) != std::string::npos || IN3_.find(s) != std::string::npos || IV3_.find(s) != std::string::npos || IT4_.find(s) != std::string::npos || IT5_.find(s) != std::string::npos || IT6_.find(s) != std::string::npos || IT7_.find(s) != std::string::npos || IT8_.find(s) != std::string::npos || IT0_.find(s) != std::string::npos || IT9_.find(s) != std::string::npos || IS0_.find(s) != std::string::npos ) return true; return false; } bool ss_chk_test(std::string s) { std::string nums = "0123456789"; if (nums.find(s[0]) != std::string::npos && nums.find(s[0]) != std::string::npos) return true; return false; } bool ss_prec_test(std::string s) { std::string prec = "QABUMS"; if (prec.find(ucasestr(s)[0]) != std::string::npos) return true; return false; } int check_field(std::string s, CONTEST_FIELD field, std::string s2) { switch (field) { case cSTATE: return state_test(s); break; case cVE_PROV: return province_test(s); break; case cCHECK: return check_test(s); break; case cCOUNTRY: return country_test(s); break; case cCLASS: case cFD_CLASS: return class_test(s); break; case cWFD_CLASS: return wfd_class_test(s); break; case cASCR_CLASS: return ascr_class_test(s); break; case cARRL_SECT: case cFD_SECTION: return section_test(s); break; case cROOKIE: return rookie_test(s); break; case c1010: return c1010_test(s); break; case cRST: return rst_test(s); break; case cSRX: case cNUMERIC: return numeric_test(s); break; case cITALIAN: return italian_test(s); break; case cCNTY: return county_test(s2, s); break; case cDIST: return district_test(s2, s); break; case cSS_CHK: return ss_chk_test(s); break; case cSS_PREC: return ss_prec_test(s); break; case cSS_SERNO: return numeric_test(s); break; case cSS_SEC: return section_test(s); break; case cNAME: break; case cQTH: break; case cGRIDSQUARE: break; case cXCHG1: break; case cKD_XCHG: break; case cARR_XCHG: break; case cCQZ: break; default: break; } return true; } CONTESTS contests[] = { { "No Contest", "CALL if (RSTr), if (LOCATOR), NAME, QTH" }, { "Generic contest", "CALL RSTr, RSTs, EXCHANGE" }, { "Africa All-Mode International", "CALL SERNO, COUNTRY, RSTr, RSTs" }, { "ARRL Field Day", "CALL SECTION, CLASS, RSTr, RSTs" }, { "ARRL International DX (cw)", "CALL COUNTRY, POWER, RSTr, RSTs" }, { "ARRL Jamboree on the Air", "CALL TROOP_NO, STATE / VE_PROV / COUNTRY, RSTr, RSTs, SCOUT_NAME" }, { "ARRL Kids Day", "CALL, NAME, AGE, QTH, COMMENT, RSTr, RSTs" }, { "ARRL Rookie Roundup", "CALL, NAME, CHECK, STATE / VE_PROV, RSTr, RSTs" }, { "ARRL RTTY Roundup", "CALL STATE, SERNO, COUNTRY, RSTr, RSTs" }, { "ARRL School Club Roundup", "CALL CLASS, STATE / VE_PROV, NAME, RSTr, RSTs" }, { "ARRL November Sweepstakes", "CALL SECTION, SERNO, PREC, CHECK, RSTr, RSTs" }, { "ARRL Winter FD", "CALL SECTION, CLASS, RSTr, RSTs" }, { "BARTG RTTY contest", "CALL NAME, SERIAL, EXCHANGE" }, { "CQ WPX", "CALL SERNO, COUNTRY, RSTr, RSTs" }, { "CQ WW DX", "CALL COUNTRY, ZONE, RSTr, RSTs" }, { "CQ WW DX RTTY", "CALL STATE, COUNTRY, ZONE, RSTr" }, { "Italian A.R.I. International DX", "CALL PR(ovince), COUNTRY, SERNO, RSTr, RSTs" }, { "NAQP", "CALL NAME, STATE / VE_PROV / COUNTRY" }, { "NA Sprint", "CALL SERNO, STATE / VE_PROV / COUNTRY, NAME, RSTr, RSTs" }, { "Ten Ten", "CALL 1010NR, STATE, NAME, RSTr, RSTs" }, { "VHF", "CALL RSTr, RSTs" }, //{ "Worked All Europe", "CALL SERNO, COUNTRY, RSTr, RSTs" }, { "State QSO parties", "" }, { "", "" } }; struct QSOP Ccontests::qso_parties[] = { /* {"QSO Party Contest", "ST", "in", "rRST","rST","rCY","rSER","rXCHG","rNAM","rCAT", "STCTY", "Notes"}, */ {"None selected", "", "", "", "", "", "", "", "", "", "", "CALL if (RSTr), if (LOCATOR), NAME, QTH" }, {"Alabama QSO Party", "AL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ALQP (Out of State)", "AL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Arizona QSO Party", "AZ", "T", "B", "B", "B", "" , "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"AZQP (Out of State)", "AZ", "", "B", "B", "B", "" , "", "", "", "", "CALL RST CNTY"}, {"Arkansas QSO Party", "AR", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ARQP (Out of State)", "AR", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"British Columbia QSO Party", "BC", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"BCQP (Out of Province)", "BC", "", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY"}, {"California QSO Party", "CA", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"}, {"CAQP (Out of State)", "CA", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"}, {"Colorado QSO Party", "CO", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"}, {"COQP (Out of State)", "CO", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"}, {"Delaware QSO Party", "DE", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"DEQP (Out of State)", "DE", "", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY"}, {"Florida QSO Party", "FL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"FLQP (Out of State)", "FL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Georgia QSO Party", "GA", "T", "B", "B", "B", "", "" , "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"GAQP (Out of State)", "GA", "", "B", "B", "B", "", "" , "", "", "", "CALL RST CNTY"}, {"Hawaii QSO Party", "HI", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"HIQP (Out of State)", "HI", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Idaho QSO Party", "ID", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"IDQP (Out of State)", "ID", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Illinois QSO Party", "IL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ILQP (Out of State)", "IL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Indiana QSO Party", "IN", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"INQP (Out of State)", "IN", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Iowa QSO Party", "IA", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"IAQP (Out of State)", "IA", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Kansas QSO Party", "KS", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"KSQP (Out of State)", "KS", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Kentucky QSO Party", "KY", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"KYQP (Out of State)", "KY", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Louisiana QSO Party", "LA", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"LAQP (Out of State)", "LA", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Maine QSO Party", "ME", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MEQP (Out of State)", "ME", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Maryland QSO Party", "MD", "T", "", "B", "B", "", "", "", "B", "", "CALL CAT CNTY ST/PR/CNTRY"}, {"MDQP (Out of State)", "MD", "", "", "B", "B", "", "", "", "B", "", "CALL CAT CNTY"}, {"Michigan QSO Party", "MI", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"}, {"MIQP (Out of State)", "MI", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"}, {"Minnesota QSO Party", "MN", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"}, {"MNQP (Out of State)", "MN", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"}, {"Missouri QSO Party", "MO", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MOQP (Out of State)", "MO", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Mississippi QSO Party", "MS", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MSQP (Out of State)", "MS", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Montana QSO Party", "MT", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MTQP (Out of State)", "MT", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"North Carolina QSO Party", "NC", "T", "B", "B", "B", "", "I", "", "", "", "CALL CNTY ST/PR/CNTRY"}, {"NCQP (Out of State)", "NC", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"}, {"Nebraska QSO Party", "NE", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NEQP (Out of State)", "NE", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"New Jersey QSO Party", "NJ", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NJQP (Out of State)", "NJ", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"New Mexico QSO Party", "NM", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"}, {"NMQP (Out of State)", "NM", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"}, {"New York QSO Party", "NY", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NYQP (Out of State)", "NY", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"North Dakota QSO Party", "ND", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NDQP (Out of State)", "ND", " ", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Ohio QSO Party", "OH", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"OHQP (Out of State)", "OH", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"Oklahoma QSO Party", "OK", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"OKQP (Out of State)", "OK", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"Ontario QSO Party", "ON", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ONQP (Out of Province)", "ON", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"Pennsylvania QSO Party", "PA", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"}, {"PAQP (Out of State)", "PA", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"}, {"South Carolina QSO Party" , "SC", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"SCQP (Out of State)", "SC", "", "B", "B", "B", "", "", "", "", "", "CALL CNTY"}, {"South Dakota QSO Party", "SD", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"SDQP (Out of State)", "SD", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Tennessee QSO Party", "TN", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"TNQP (Out of State)", "TN", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Texas QSO Party", "TX", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"TXQP (Out of State)", "TX", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"}, {"Vermont QSO Party", "VT", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"VTQP (Out of State)", "VT", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Virginia QSO Party", "VA", "T", "", "B", "B", "B", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"VAQP (Out of State)", "VA", "", "", "B", "B", "B", "I", "", "", "", "CALL CNTY"}, {"Washington Salmon Run QSO Party","WA", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"WAQP (Out of State)", "WA", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Wisconsin QSO Party", "WI", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"WIQP (Out of State)", "WI", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"}, {"West Virginia QSO Party", "WV", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"WVQP (Out of State)", "WV", "", "B", "B", "B", "", "", "", "", "", "CALL CNTY"}, {"7QP QSO Party", "7QP","T", "B", "B", "B", "", "I", "", "", "S", "CALL RST [(ST COUNTY) or (STCNTY) or (DX)]"}, {"7QP (Out of Region)", "7QP","", "B", "B", "B", "", "I", "", "", "S", "CALL RST [(ST COUNTY) or (STCNTY)]"}, {"New England QSO Party", "6NE","T", "B", "B", "B", "", "I", "", "", "C", "CALL RST [(ST COUNTY) or (CNTYST) or (DX)]"}, {"NEQP (Out of Region)", "6NE","", "B", "B", "B", "", "I", "", "", "C", "CALL RST [(ST COUNTY) or (CNTYST)]"}, {"", "", "", "", "", "", "", "", "", "", "", ""} }; //{"Alaska QSO Party", "AK", "T", "", "", "", "", "", "", "", "", ""}, //{"Connecticut QSO Party", "CT", "T", "", "", "", "", "", "", "", "", ""}, //{"Massachusetts QSO Party", "MA", "T", "", "", "", "", "", "", "", "", ""}, //{"New Hampshire QSO Party", "NH", "T", "", "", "", "", "", "", "", "", ""}, //{"Nevada QSO Party", "NV", "T", "", "", "", "", "", "", "", "", ""}, //{"Oregon QSO Party", "OR", "T", "", "", "", "", "", "", "", "", ""}, //{"Rhode Island QSO Party", "RI", "T", "", "", "", "", "", "", "", "", ""}, //{"Utah QSO Party", "UT", "T", "", "", "", "", "", "", "", "", ""}, //{"Wyoming QSO Party", "WY", "T", "", "", "", "", "", "", "", "", ""}, std::string contest_names() { std::string _names; for (size_t n = 0; n < sizeof(contests) / sizeof(*contests) - 1; n++) _names.append(contests[n].name).append("|"); return _names; } Ccontests QSOparties; const std::string Ccontests::names() { std::string _names; for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties) - 1; n++ ) _names.append(qso_parties[n].contest).append("|"); return _names; } const char *Ccontests::notes(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].notes; return ""; } char Ccontests::rst(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].rst[0]; return ' '; } char Ccontests::st(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].st[0]; return ' '; } char Ccontests::cnty(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].cnty[0]; return ' '; } char Ccontests::serno(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].serno[0]; return ' '; } char Ccontests::xchg(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].xchg[0]; return ' '; } char Ccontests::name(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].name[0]; return ' '; } char Ccontests::cat(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].cat[0]; return ' '; } char Ccontests::stcty(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].stcty[0]; return ' '; } void adjust_for_contest(void *) { int n = progdefaults.SQSOcontest; progdefaults.SQSOinstate = false; progdefaults.SQSOlogcounty = false; progdefaults.SQSOlogstate = false; progdefaults.SQSOlogxchg = false; progdefaults.SQSOlogrst = false; progdefaults.SQSOlogname = false; progdefaults.SQSOlogserno = false; progdefaults.SQSOlogstcty = false; progdefaults.SQSOlogctyst = false; progdefaults.SQSOlogcat = false; if (QSOparties.qso_parties[n].instate[0] == 'T') progdefaults.SQSOinstate = true; if (progdefaults.SQSOinstate) { if (QSOparties.qso_parties[n].st[0] == 'I' || QSOparties.qso_parties[n].st[0] == 'B') progdefaults.SQSOlogstate = true; if (QSOparties.qso_parties[n].cnty[0] == 'I' || QSOparties.qso_parties[n].cnty[0] == 'B') progdefaults.SQSOlogcounty = true; if (QSOparties.qso_parties[n].xchg[0] == 'I' || QSOparties.qso_parties[n].xchg[0] == 'B') progdefaults.SQSOlogxchg = true; if (QSOparties.qso_parties[n].rst[0] == 'I' || QSOparties.qso_parties[n].rst[0] == 'B') progdefaults.SQSOlogrst = true; if (QSOparties.qso_parties[n].name[0] == 'I' || QSOparties.qso_parties[n].name[0] == 'B') progdefaults.SQSOlogname = true; if (QSOparties.qso_parties[n].serno[0] == 'I' || QSOparties.qso_parties[n].serno[0] == 'B') progdefaults.SQSOlogserno = true; if (QSOparties.qso_parties[n].cat[0] == 'I' || QSOparties.qso_parties[n].cat[0] == 'B') progdefaults.SQSOlogcat = true; } else { if (QSOparties.qso_parties[n].st[0] == 'O' || QSOparties.qso_parties[n].st[0] == 'B') progdefaults.SQSOlogstate = true; if (QSOparties.qso_parties[n].cnty[0] == 'O' || QSOparties.qso_parties[n].cnty[0] == 'B') progdefaults.SQSOlogcounty = true; if (QSOparties.qso_parties[n].xchg[0] == 'O' || QSOparties.qso_parties[n].xchg[0] == 'B') progdefaults.SQSOlogxchg = true; if (QSOparties.qso_parties[n].rst[0] == 'O' || QSOparties.qso_parties[n].rst[0] == 'B') progdefaults.SQSOlogrst = true; if (QSOparties.qso_parties[n].name[0] == 'O' || QSOparties.qso_parties[n].name[0] == 'B') progdefaults.SQSOlogname = true; if (QSOparties.qso_parties[n].serno[0] == 'O' || QSOparties.qso_parties[n].serno[0] == 'B') progdefaults.SQSOlogserno = true; if (QSOparties.qso_parties[n].cat[0] == 'O' || QSOparties.qso_parties[n].cat[0] == 'B') progdefaults.SQSOlogcat = true; } if (QSOparties.qso_parties[n].stcty[0] == 'S') progdefaults.SQSOlogstcty = true; if (QSOparties.qso_parties[n].stcty[0] == 'C') progdefaults.SQSOlogctyst = true; update_main_title(); return; std::cout << "QSOparties.qso_parties[" << n << "]\n" << QSOparties.qso_parties[n].contest << std::endl << "instate: " << progdefaults.SQSOinstate << std::endl << "ST: " << QSOparties.qso_parties[n].state << std::endl << "rRST: " << QSOparties.qso_parties[n].rst << std::endl << "rST: " << QSOparties.qso_parties[n].st << std::endl << "rCY: " << QSOparties.qso_parties[n].cnty << std::endl << "rSER: " << QSOparties.qso_parties[n].serno << std::endl << "rXCHG: " << QSOparties.qso_parties[n].xchg << std::endl << "rNAM: " << QSOparties.qso_parties[n].name << std::endl << "rCAT: " << QSOparties.qso_parties[n].cat << std::endl << "STCTY: " << QSOparties.qso_parties[n].stcty << std::endl << "Notes: " << QSOparties.qso_parties[n].notes << std::endl; } fldigi-4.1.06/src/logbook/qrzlib.cxx0000664000175000017500000004607213507401434014247 00000000000000// ---------------------------------------------------------------------------- // qrzlib.cc // // Interface library to the QRZ database distributed by AA7BQ // // Copyright (C) 1999-2009 David Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include using namespace std; #include "qrzlib.h" #include "configuration.h" #include "debug.h" static char QRZdir[256] = ""; static const char *QRZpath; static const char *QRZtry[] = { #ifdef __WOE32__ "C:/CALLBK/", // look on C: drive first "D:/CALLBK/", "E:/CALLBK/", "F:/CALLBK/", "G:/CALLBK/", #else "~/callbk/", "/cdrom/callbk/", "/mnt/cdrom/callbk/", "/mnt/cdrom0/callbk/", "/mnt/cdrom1/callbk/", "/media/cdrom/callbk/", "/media/cdrom0/callbk/", "/media/cdrom1/callbk/", #endif 0 }; FILE *imagefile = NULL; #define isdirsep(c) ((c)=='/') int filename_expand(char *to,int tolen, const char *from) { char temp[tolen]; strlcpy(temp,from, tolen); char *start = temp; char *end = temp+strlen(temp); int ret = 0; for (char *a=temp; a= tolen) end += tolen - (end+1-e+t); memmove(a+t, e, end+1-e); end = a+t+(end-e); *end = '\0'; memcpy(a, value, t); ret++; } else { a = e+1; } } strlcpy(to, start, tolen); return ret; } char *QRZImageFilename (char *call) { static char fname[80], *p, imgcall[12]; FILE *f; strcpy(imgcall, call); p = imgcall; while (*p) {*p = tolower (*p); p++; } strcpy (fname, QRZdir); strcat (fname, "images/"); strcat (fname, &imgcall[strlen(imgcall)-1]); strcat (fname, "/"); strcat (fname, imgcall); while (fname[strlen(fname)-1] == ' ') fname[strlen(fname)-1] = 0; strcat (fname, ".jpg"); f = fl_fopen(fname, "r"); if (f != NULL) { fclose (f); return fname; } return NULL; } int checkPath( const char *filename ) { char fname[120]; FILE *f; bool notfound = false; if (!progdefaults.QRZpathname.empty()) { strcpy ( fname, progdefaults.QRZpathname.c_str()); for (size_t i = 0; i < strlen(fname); i++) if (fname[i] == '\\') fname[i] = '/'; // fix for DOS path convention strcat( fname, filename ); strcat( fname, ".dat" ); if (fname[0] == '~' || fname[0] == '$') { char f2name[80]; filename_expand(f2name, 79, fname); strcpy (fname, f2name); } f = fl_fopen(fname, "r" ); if( f != NULL ) { fclose( f ); char pathname[120]; strcpy( pathname, progdefaults.QRZpathname.c_str()); if (pathname[0] == '~' || pathname[0] == '$') filename_expand(QRZdir, 79, pathname); else strcpy (QRZdir, pathname); return 1; } string err = fname; err.append(" not found, performing search"); LOG_WARN("%s", err.c_str()); notfound = true; } // not specified, perform a search const char **pQRZpath = QRZtry; while (*pQRZpath) { strcpy( fname, *pQRZpath ); strcat( fname, filename ); strcat( fname, ".dat" ); if (fname[0] == '~' || fname[0] == '$') { char f2name[80]; filename_expand(f2name, 79, fname); strcpy (fname, f2name); } f = fl_fopen(fname, "r" ); if( f != NULL ) { fclose( f ); QRZpath = *pQRZpath; if (QRZpath[0] == '~' || QRZpath[0] == '$') filename_expand(QRZdir, 79, QRZpath); else strcpy (QRZdir, QRZpath); if (notfound) { string err = "Using "; err.append(fname); LOG_WARN("%s", err.c_str()); } return 1; } pQRZpath++; } QRZpath = QRZtry[0]; LOG_WARN("QRZ data base not found"); return 0; } void SetQRZdirectory(char *dir) { strcpy(QRZdir, dir); strcat(QRZdir, "/"); } bool QRZ::ImageExists() { if (Qimagefname == NULL) return (hasImage = false); imagefile = fl_fopen(Qimagefname, "r"); if (imagefile) { fclose (imagefile); return (hasImage = true); } return (hasImage = false); } void QRZ::OpenQRZFiles( const char *fname ) { long fsize; char dfname[64]; char idxname[64]; int num1; int num2; num1 = 0; num2 = 0; if( fname[0] == 0 ) { QRZvalid = 0; return; } QRZvalid = 1; if (*QRZdir == 0) if( checkPath( fname ) == 0 ) { QRZvalid = 0; return; } strcpy( dfname, QRZdir ); strcpy( idxname, QRZdir ); strcat( idxname, fname ); strcat( idxname, ".idx" ); strcat( dfname, fname ); strcat( dfname, ".dat" ); idxfile = fl_fopen( idxname, "r" ); if( idxfile == NULL ) { QRZvalid = 0; return; } fseek( idxfile, 0, SEEK_END ); fsize = ftell( idxfile ); rewind( idxfile ); idxsize = fsize - 48; index = new char[idxsize]; if( index == NULL ) { fclose( idxfile ); QRZvalid = 0; return; } memset( index, 0, idxsize ); num1 = fread( &idxhdr.dataname, 48, 1, idxfile ); num2 = fread( index, idxsize, 1, idxfile ); if (num1 != 1 || num2 != 1) { fclose( idxfile ); delete [] index; QRZvalid = 0; return; } fflush( stdout ); fclose( idxfile ); datafile = fl_fopen( dfname, "r" ); if( datafile == NULL ) { delete [] index; QRZvalid = 0; return; } sscanf( idxhdr.bytesperkey, "%d", &datarecsize ); if( datarecsize == 0 || datarecsize > 32767 ) { delete [] index; QRZvalid = 0; return; } // allocate sufficient data buffer for file read over key boundary if (data) delete [] data; data = new char[datarecsize + 512]; if( data == NULL ) { delete [] index; QRZvalid = 0; return; } // fill buffer with new-lines to insure not reading past end of // the buffer memset( data, '\n', datarecsize + 512 ); sscanf( idxhdr.keylen, "%d", &keylen ); sscanf( idxhdr.numkeys, "%ld", &numkeys ); top = index + idxsize - keylen; } QRZ::QRZ( const char *fname ) { int len = strlen(fname); criteria = fname[ len - 1 ]; OpenQRZFiles( fname ); } QRZ::QRZ( const char *fname, char c ) { criteria = c; OpenQRZFiles( fname ); } void QRZ::NewDBpath( const char *fname ) { int len = strlen(fname); criteria = fname[ len - 1 ]; *QRZdir = 0; OpenQRZFiles( fname ); } QRZ::~QRZ() { if (index) delete [] index; if (data) delete [] data; if( datafile != NULL ) fclose( datafile ); return; } int QRZ::CallComp( char *s1, char *s2 ) { static char sa[7], sb[7]; strncpy( sb, s2, 6 ); strncpy( sa, s1, 6 ); sa[6] = 0; sb[6] = 0; int stest = strncasecmp( sa + 3, sb + 3, 3 ); if( stest < 0 ) return -1; if( stest > 0 ) return 1; // suffix are equal int atest = strncasecmp( sa + 2, sb + 2, 1 ); if( atest < 0 ) return -1; if( atest > 0 ) return 1; // suffix & call area are equal int ptest = strncasecmp( sa, sb, 2 ); if( ptest < 0 ) return -1; if( ptest > 0 ) return 1; // total match of calls return 0; } char *Composite( char *s ) { static char newstr[7]; int ccount = strlen(s) < 7 ? strlen(s) : 6; memset(newstr, ' ', 6 ); newstr[6] = 0; if( isdigit( s[2] ) ) { for( int i = 0; i < ccount; i++ ) newstr[i] = s[i]; } else { newstr[0] = s[0]; newstr[2] = s[1]; for( int i = 2; i < ccount; i++ ) newstr[i+1] = s[i]; } return( newstr ); } int QRZ::ReadDataBlock( long p ) { rewind( datafile ); if ( p < 0 ) p = 0; if( fseek( datafile, p, SEEK_SET ) != 0 ) { return 1; } databytesread = fread( data, 1, datarecsize + 512, datafile ); dataoffset = p; fflush( stdout); return 0; } int QRZ::FindCallsign( char *field ) { char composite[7], testcall[7]; char *endofdata; int matched = 0, iOffset; memset( composite, 0, 6 ); memset( testcall, 0, 6 ); found = 0; idxptr = index; if( strlen( field ) < 3 ) // must be a valid callsign return 0; if ( !(isdigit( field[1] ) || isdigit( field[2] ) ) ) return 0; strcpy( composite, Composite( field ) ); for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( CallComp( composite, idxptr) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + databytesread; endofline = strchr( dfptr, '\n' ); if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { memcpy( testcall, dfptr, 6 ); if( (matched = CallComp( composite, Composite(testcall) ) ) <= 0 ) found = 1; else { endofline = strchr( dfptr, '\n' ); dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); // check for old call referencing new call if (strlen(recbuffer) < 15 ) { dfptr = strchr( dfptr, ',' ) + 1; strcpy( recbuffer, dfptr ); // Qcall = recbuffer; found = -1; } else { found = 1; dfptr = endofline + 1; // point to next record } return (found); } found = 0; return 0; } int QRZ::nextrec() { if( dfptr > data + datarecsize ) { if( ReadDataBlock( dataoffset + (dfptr - data) ) != 0) return 0; dfptr = data; } endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); dfptr = endofline + 1; if (strlen(recbuffer) < 15 ) { nextrec(); } return 1; } int QRZ::NextRecord() { if( nextrec() == 1 ) return( ReadRec() ); return 0; } int QRZ::FindName( char *field ) { char *endofdata; int matched = 0, iOffset; char *Lname, *Fname; char sFname[17]; char sLname[17]; char sIdxName[33]; char *cptr; memset( sFname, 0, 17 ); memset( sLname, 0, 17 ); memset( sIdxName, 0, 33 ); if ( (cptr = strchr( field, ',' ) ) != NULL ) { strncpy( sLname, field, cptr - field ); strcpy( sFname, cptr + 1 ); } else strcpy( sLname, field ); strcpy( sIdxName, sLname ); if( strlen( sFname ) > 0 ) { strcat( sIdxName, " " ); strcat( sIdxName, sFname ); } found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( sIdxName, idxptr, keylen ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + databytesread; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline == NULL || endofline > endofdata ) break; if( endofline - dfptr > 14 ) { // valid racord Lname = strchr( dfptr, ',' ) + 1; // locate Lname element Fname = strchr( Lname, ',' ) + 1; // locate Fname element if( *Fname == ',' ) Fname++; else Fname = strchr( Fname, ',' ) + 1; if( (matched = strncasecmp( sLname, Lname, strlen(sLname) ) ) == 0 ) { if( sFname[0] == 0 ) found = 1; else if( ( matched = strncasecmp( sFname, Fname, strlen(sFname) ) ) <= 0 ) found = 1; } } if (!found && (dfptr < endofdata ) ) dfptr = strchr( dfptr, '\n' ) + 1; // move to next record } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::CompState( const char *field, const char *state, const char *city ) { int compsize = strlen(field+2), chk; if (compsize > keylen) compsize = keylen; if(strlen( field ) == 2) return ( strncasecmp( field, state, 2 ) ); if( (chk = strncasecmp( field, state, 2 ) ) < 0 ) return -1; if( chk > 0 ) return 1; chk = strncasecmp( field + 2, city, compsize); if (chk < 0) return -1; if (chk > 0) return 1; return 0; } int QRZ::FindState( char *field ) { char *endofdata; int matched = 0, iOffset; char *state; char *city; int compsize = strlen(field); if (compsize > keylen) compsize = keylen; found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( field, idxptr, compsize ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + datarecsize; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline - dfptr > 14 ) { // valid record city = dfptr; for( int i = 0; i < 9; i++ ) // move to city element city = strchr( city, ',' ) + 1; state = strchr( city, ',' ) + 1; // move to state element matched = CompState( field, state, city ); if( matched == 0) found = 1; else { endofline = strchr( dfptr, '\n' ); // no match, move to next dfptr = endofline + 1; } } else { endofline = strchr( dfptr, '\n' ); // invalid record, move to next dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::FindZip( char *field ) { char *endofdata; int matched = 0, iOffset; char *zip; found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( field, idxptr, 5 ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + datarecsize; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline - dfptr > 14 ) { // valid record zip = dfptr; for( int i = 0; i < 11; i++ ) // move to Zip element zip = strchr( zip, ',' ) + 1; if( (matched = strncasecmp( field, zip, 5 ) ) <= 0 ) found = 1; else { endofline = strchr( dfptr, '\n' ); // no match, move to next dfptr = endofline + 1; } } else { endofline = strchr( dfptr, '\n' ); // invalid record, move to next dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::FindRecord( char *field ) { if (QRZvalid == 0 ) return 0; switch (criteria) { case 'c' : FindCallsign( field ); break; case 'n' : FindName( field ); break; case 's' : FindState( field ); break; case 'z' : FindZip( field ); } return( ReadRec() ); } static char empty[] = { '\0' }; int QRZ::ReadRec() { char *comma; if( found == 1 ) { Qcall = recbuffer; comma = strchr( Qcall, ',' ); *comma = 0; Qlname = comma + 1; comma = strchr( Qlname, ',' ); *comma = 0; Qfname = comma + 1; comma = strchr( Qfname, ',' ); Qfname = comma + 1; // skip JR field comma = strchr( Qfname, ',' ); *comma = 0; Qdob = comma + 1; comma = strchr( Qdob, ',' ); Qdob = comma + 1; // skip MI field comma = strchr( Qdob, ',' ); *comma = 0; Qefdate = comma + 1; comma = strchr( Qefdate, ',' ); *comma = 0; Qexpdate = comma + 1; comma = strchr( Qexpdate, ',' ); *comma = 0; Qmail_str = comma + 1; comma = strchr( Qmail_str, ',' ); *comma = 0; Qmail_city = comma + 1; comma = strchr( Qmail_city, ',' ); *comma = 0; Qmail_st = comma + 1; comma = strchr( Qmail_st, ',' ); *comma = 0; Qmail_zip = comma + 1; comma = strchr( Qmail_zip, ',' ); *comma = 0; Qopclass = comma + 1; comma = strchr( Qopclass, ',' ); *comma = 0; Qp_call = comma + 1; comma = strchr( Qp_call, ',' ); *comma = 0; Qp_class = comma + 1; //Qp_class[1] = 0; *(comma + 2) = 0; Qimagefname = QRZImageFilename (GetCall()); return( 1 ); } else { Qcall = empty; Qlname = empty; Qfname = empty; Qdob = empty; Qefdate = empty; Qexpdate = empty; Qmail_str = empty; Qmail_city = empty; Qmail_st = empty; Qmail_zip = empty; Qopclass = empty; Qp_call = empty; Qp_class = empty; Qimagefname = NULL; return( 0 ); } } int QRZ::GetCount( char *unknown ) { int matched, cnt = 0; char temp[40]; if( FindRecord( unknown ) != 1 ) return(0); matched = 0; while (matched == 0) { cnt++; NextRecord(); switch (criteria) { case 'c' : matched = 1; break; case 'n' : if( strchr( unknown, ',' ) == 0 ) matched = strcasecmp( unknown, GetLname() ); else { strcpy( temp, GetLname() ); strcat( temp, "," ); strcat( temp, GetFname() ); matched = strncasecmp( unknown, temp, strlen(unknown) ); } break; case 'z' : matched = strncmp( unknown, GetZIP(), 5 ); break; case 's' : matched = CompState( unknown, GetState(), GetCity() ); break; default : matched = 1; } } return cnt; } char * QRZ::GetCall() { static char call[15]; char *p = call; strcpy (call, Qcall); while (*p) { if (*p == ' ') strcpy (p, p+1); if (*p != ' ') p++; } return( call ); }; const char * QRZ::GetLname() { return( Qlname ); }; const char * QRZ::GetFname() { return( Qfname ); }; const char * QRZ::GetDOB() { return( Qdob ); }; const char * QRZ::GetEFdate() { return( Qefdate ); }; const char * QRZ::GetEXPdate() { return( Qexpdate ); }; const char * QRZ::GetStreet() { return( Qmail_str ); }; const char * QRZ::GetCity() { return( Qmail_city ); }; const char * QRZ::GetState() { return( Qmail_st ); }; const char * QRZ::GetZIP() { return( Qmail_zip ); }; const char * QRZ::GetOPclass() { return( Qopclass ); }; const char * QRZ::GetPriorCall() { return( Qp_call ); }; const char * QRZ::GetPriorClass() { return( Qp_class ); }; int QRZ::getQRZvalid() { return( QRZvalid ); } const char * QRZ::GetImageFileName () { return (Qimagefname); } char * QRZ::CSV_Record() { static char info[256]; memset( info, 0, 256 ); snprintf( info, sizeof(info) - 1, "%s,%s,%s,%s,%s,%s,%s,%s,%s", GetCall(), Qopclass, Qefdate, Qlname, Qfname, Qmail_str, Qmail_city, Qmail_st, Qmail_zip ); return info; } char *QRZ::Fmt_Record() { static char info[256]; memset( info, 0, 256 ); snprintf( info, sizeof(info) - 1, "%s %s : %s\n%s %s\n%s\n%s, %s %s\n", GetCall(), Qopclass, Qefdate, Qfname, Qlname, Qmail_str, Qmail_city, Qmail_st, Qmail_zip ); return info; } fldigi-4.1.06/src/logbook/fd_logger.cxx0000644000175000017500000004621013510637101014660 00000000000000// ===================================================================== // // FD_logger.cxx // // interface to tcpip application fdserver.tcl // fdserver is a multiple client tcpip server // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "logsupport.h" #include "fd_logger.h" #include "fd_view.h" #include "flmisc.h" #include "confdialog.h" LOG_FILE_SOURCE(debug::LOG_FD); using namespace std; //forward declarations of local functions void FD_start(); //====================================================================== // Socket FD i/o used on all platforms //====================================================================== pthread_t FD_thread; pthread_t FD_rx_socket_thread; pthread_mutex_t FD_mutex = PTHREAD_MUTEX_INITIALIZER; Socket *FD_socket = 0; bool FD_connected = false; bool FD_logged_on = false; bool FD_enabled = false; bool FD_exit = false; string FD_ip_addr = ""; string FD_ip_port = ""; string FD_rxbuffer; //====================================================================== // data report from fdserver.tcl // LOGON w1hkj 40,DIG // LOGON_OK W1HKJ 1A 5 // SCORE 35 // WORKED ... all on a single line // {160 CW 1} {160 DIG 0} {160 PHONE 0} // {80 CW 0} {80 DIG 0} {80 PHONE 0} // {40 CW 1} {40 DIG 0} {40 PHONE 0} // {20 CW 0} {20 DIG 1} {20 PHONE 0} // {17 CW 0} {17 DIG 0} {17 PHONE 1} // {15 CW 0} {15 DIG 0} {15 PHONE 1} // {10 CW 0} {10 DIG 0} {10 PHONE 0} // {2 CW 0} {2 DIG 0} {2 PHONE 0} // {440 CW 0} {440 DIG 0} {440 PHONE 0} //====================================================================== //====================================================================== // //====================================================================== void post(Fl_Input2 *w, const char * s) { w->value(s); } //====================================================================== // //====================================================================== void view(Fl_Output *w, const char * s) { w->value(s); } //====================================================================== // //====================================================================== static string toparse; void parse_logon_ok(string s) { size_t p = 0; static string call, clss, mult, sect; call.clear(); clss.clear(); sect.clear(); s.erase(0, 9); call = s; call.erase(call.find(" ")); p = s.find(" "); if (p != string::npos) { s.erase(0, p+1); clss = s; p = clss.find(" "); clss.erase(p); p = s.find(" "); if (p != string::npos) { s.erase(0,p+1); mult = s; p = mult.find(" "); mult.erase(p); p = s.find(" "); if (p != string::npos) { s.erase(0,p+1); sect = s; p = sect.find("\r"); if (p != string::npos) sect.erase(p); p = sect.find("\n"); if (p != string::npos) sect.erase(p); } } } progdefaults.my_FD_call = call; REQ(&post, inp_my_FD_call, call.c_str()); REQ(&view, view_FD_call, call.c_str()); progdefaults.my_FD_class = clss; REQ(&post, inp_my_FD_class, clss.c_str()); REQ(&view, view_FD_class, clss.c_str()); progdefaults.my_FD_section = sect; REQ(&post, inp_my_FD_section, sect.c_str()); REQ(&view, view_FD_section, sect.c_str()); progdefaults.my_FD_mult = mult; REQ(&view, view_FD_mult, mult.c_str()); } //====================================================================== // //====================================================================== void parse_score(string s) { static string sscore; size_t p = s.find("\r"); if (p != string::npos) s.erase(p); p = s.find("\n"); if (p != string::npos) s.erase(p); p = s.find(" "); if (p != string::npos) s.erase(0, p+1); sscore = s; REQ(&view, view_FD_score, sscore.c_str()); } //====================================================================== // //====================================================================== void parse_entry( string needle, Fl_Output *view1, Fl_Output *view2 ) { size_t p1 = toparse.find(needle); if (p1 == string::npos) return; p1 += needle.length(); size_t p2 = toparse.find(" ", p1); size_t p3 = toparse.find("}", p1); if (p3 == string::npos) return; string num = "", op = ""; num = toparse.substr(p1, p2 - p1); op = toparse.substr(p2+1, p3 - (p2+1)); view1->value(num.c_str()); view2->value(op.c_str()); } //====================================================================== // //====================================================================== void parse_worked() { // CW contacts parse_entry("{160 CW ", view_FD_CW[0], view_FD_CW_OP[0]); parse_entry("{80 CW ", view_FD_CW[1], view_FD_CW_OP[1]); parse_entry("{40 CW ", view_FD_CW[2], view_FD_CW_OP[2]); parse_entry("{20 CW ", view_FD_CW[3], view_FD_CW_OP[3]); parse_entry("{17 CW ", view_FD_CW[4], view_FD_CW_OP[4]); parse_entry("{15 CW ", view_FD_CW[5], view_FD_CW_OP[5]); parse_entry("{12 CW ", view_FD_CW[6], view_FD_CW_OP[6]); parse_entry("{10 CW ", view_FD_CW[7], view_FD_CW_OP[7]); parse_entry("{6 CW ", view_FD_CW[8], view_FD_CW_OP[8]); parse_entry("{2 CW ", view_FD_CW[9], view_FD_CW_OP[9]); parse_entry("{220 CW ", view_FD_CW[10], view_FD_CW_OP[10]); parse_entry("{440 CW ", view_FD_CW[11], view_FD_CW_OP[11]); // DIG contacts parse_entry("{160 DIG ", view_FD_DIG[0], view_FD_DIG_OP[0]); parse_entry("{80 DIG ", view_FD_DIG[1], view_FD_DIG_OP[1]); parse_entry("{40 DIG ", view_FD_DIG[2], view_FD_DIG_OP[2]); parse_entry("{20 DIG ", view_FD_DIG[3], view_FD_DIG_OP[3]); parse_entry("{17 DIG ", view_FD_DIG[4], view_FD_DIG_OP[4]); parse_entry("{15 DIG ", view_FD_DIG[5], view_FD_DIG_OP[5]); parse_entry("{12 DIG ", view_FD_DIG[6], view_FD_DIG_OP[6]); parse_entry("{10 DIG ", view_FD_DIG[7], view_FD_DIG_OP[7]); parse_entry("{6 DIG ", view_FD_DIG[8], view_FD_DIG_OP[8]); parse_entry("{2 DIG ", view_FD_DIG[9], view_FD_DIG_OP[9]); parse_entry("{220 DIG ", view_FD_DIG[10], view_FD_DIG_OP[10]); parse_entry("{440 DIG ", view_FD_DIG[11], view_FD_DIG_OP[11]); // PHONE contacts parse_entry("{160 PHONE ", view_FD_PHONE[0], view_FD_PHONE_OP[0]); parse_entry("{80 PHONE ", view_FD_PHONE[1], view_FD_PHONE_OP[1]); parse_entry("{40 PHONE ", view_FD_PHONE[2], view_FD_PHONE_OP[2]); parse_entry("{20 PHONE ", view_FD_PHONE[3], view_FD_PHONE_OP[3]); parse_entry("{17 PHONE ", view_FD_PHONE[4], view_FD_PHONE_OP[4]); parse_entry("{15 PHONE ", view_FD_PHONE[5], view_FD_PHONE_OP[5]); parse_entry("{12 PHONE ", view_FD_PHONE[6], view_FD_PHONE_OP[6]); parse_entry("{10 PHONE ", view_FD_PHONE[7], view_FD_PHONE_OP[7]); parse_entry("{6 PHONE ", view_FD_PHONE[8], view_FD_PHONE_OP[8]); parse_entry("{2 PHONE ", view_FD_PHONE[9], view_FD_PHONE_OP[9]); parse_entry("{220 PHONE ", view_FD_PHONE[10], view_FD_PHONE_OP[10]); parse_entry("{440 PHONE ", view_FD_PHONE[11], view_FD_PHONE_OP[11]); } void clear_fd_viewer() { for (int i = 0; i < 12; i++) { view_FD_CW[i]->value(""); view_FD_CW_OP[i]->value(""); view_FD_DIG[i]->value(""); view_FD_DIG_OP[i]->value(""); view_FD_PHONE[i]->value(""); view_FD_PHONE_OP[i]->value(""); } view_FD_call->value(""); view_FD_class->value(""); view_FD_section->value(""); view_FD_mult->value(""); box_fdserver_connected->color((Fl_Color)31); box_fdserver_connected->redraw(); } //====================================================================== // //====================================================================== void parse_FD_stream(string data) { size_t p = 0; if (data.empty()) return; //std::cout << "RX Stream:\n" << data << std::endl; if (data.find("QUIT") != string::npos) { //std::cout << "Quit\n"; FD_disconnect(); btn_fd_connect->value(0); return; } if (data.find("LOGON_DENIED") != string::npos) { //std::cout << "Logon denied\n"; FD_logged_on = false; LOG_ERROR("FD logon DENIED"); btn_fd_connect->value(0); return; } if (data.find("LOGOFF_OK") != string::npos) { //std::cout << "Log off OK\n"; FD_logged_on = false; return; } if (data.find("LOGON_OK") != string::npos) { //std::cout << "Logon OK\n"; parse_logon_ok(data.substr(p)); FD_logged_on = true; box_fdserver_connected->color((Fl_Color)2); box_fdserver_connected->redraw(); } if ( (p = data.find("SCORE") ) != string::npos) { //std::cout << "SCORE\n"; parse_score(data.substr(p)); } if ( (p = data.find("WORKED"))!= string::npos) { //std::cout << "WORKED\n"; toparse = data.substr(p); REQ(parse_worked); return; } if ( data.find("NODUP") != string::npos) { //std::cout << "Not a duplicate\n"; return; } else if (data.find("DUP") != string::npos) { //std::cout << "Duplicate\n"; } else if (data.find("REJECT") != string::npos) { //std::cout << "Reject\n"; } else if (data.find("ACCEPT") != string::npos) { //std::cout << "Accept\n"; } } //====================================================================== // //====================================================================== void FD_write(string s) { FD_socket->send(s.append("\n")); } //====================================================================== // //====================================================================== void FD_get_record(string call) { if(!FD_socket) return; if (!FD_connected) return; } //====================================================================== // //====================================================================== void FD_add_record() { if(!FD_socket) return; if (!FD_connected) return; guard_lock send_lock(&FD_mutex); string cmd = "ADD "; cmd.append(inpCall->value()).append(" "); cmd.append(inpSection->value()).append(" "); cmd.append(inpClass->value()); FD_write(cmd); } //====================================================================== // //====================================================================== static string fd_band; static string fd_mode; static string FD_opmode() { if (!active_modem) { return "DIG"; } if (active_modem->get_mode() == MODE_CW) return "CW"; else if (active_modem->get_mode() < MODE_SSB) return "DIG"; else if (active_modem->get_mode() == MODE_SSB) return "PHONE"; return ""; } //====================================================================== // //====================================================================== static string FD_opband() { if (!active_modem) return "40"; float freq = qsoFreqDisp->value(); freq /= 1e6; if (freq >= 1.8 && freq < 3.5) return "160"; if (freq >= 3.5 && freq <= 7.0) return "80"; if (freq >= 7.0 && freq <= 7.5) return "40"; if (freq >= 14.0 && freq < 18.0) return "20"; if (freq >= 18.0 && freq < 21.0) return "17"; if (freq >= 21.0 && freq < 24.0) return "15"; if (freq >= 24.0 && freq < 28.0) return "12"; if (freq >= 28.0 && freq < 50.0) return "10"; if (freq >= 50.0 && freq < 70.0) return "6"; if (freq >= 144.0 && freq < 222.0) return "2"; if (freq >= 222.0 && freq < 420.0) return "222"; if (freq >= 420.0 && freq < 444.0) return "440"; return ""; } //====================================================================== // //====================================================================== int FD_dupcheck() { if(!FD_socket) return 0; if (!FD_connected) return 0; string response; string cmd = "DUPCHECK "; cmd.append(inpCall->value()); try { guard_lock send_lock(&FD_mutex); FD_write(cmd); MilliSleep(50); FD_socket->recv(response); if (response.empty()) return 0; if (response.find("NODUP") != string::npos) return 0; if (response.find("DUP") != string::npos) return 1; return 0; } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); FD_exit = true; } return 0; } //====================================================================== // //====================================================================== void FD_logon() { string ucasecall = progdefaults.fd_op_call; string buffer; string cmd = "LOGON "; if (ucasecall.empty()) return; for (size_t n = 0; n < ucasecall.length(); n++) ucasecall[n] = toupper(ucasecall[n]); fd_band = FD_opband(); fd_mode = FD_opmode(); if (fd_band.empty() || fd_mode.empty()) return; cmd.append(ucasecall).append(" "); cmd.append(fd_band).append(","); cmd.append(fd_mode); try { guard_lock send_lock(&FD_mutex); //std::cout << "Log On: " << cmd << std::endl; FD_write(cmd); FD_socket->recv(buffer); parse_FD_stream(buffer); LOG_INFO("Logged on to fdserver"); FD_logged_on = true; } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); } } //====================================================================== // //====================================================================== void FD_logoff() { if (!FD_socket) return; guard_lock send_lock(&FD_mutex); try { string buffer; FD_write("LOGOFF"); MilliSleep(100); FD_socket->recv(buffer); parse_FD_stream(buffer); FD_disconnect(); LOG_INFO("Logged off FD server"); } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); } } //====================================================================== // //====================================================================== void FD_band_check() { if (fd_band != FD_opband()) { FD_logoff(); // FD_start(); FD_logon(); } } //====================================================================== // //====================================================================== void FD_mode_check() { if (fd_mode != FD_opmode()) { FD_logoff(); // FD_start(); FD_logon(); } } //====================================================================== // //====================================================================== void FD_rcv_data() { string tempbuff; try { guard_lock send_lock(&FD_mutex); FD_socket->recv(tempbuff); if (tempbuff.empty()) return; parse_FD_stream(tempbuff); } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); FD_exit = true; } } //====================================================================== // //====================================================================== static int fd_looptime = 1000; // in milliseconds void FD_start() { guard_lock send_lock(&FD_mutex); FD_ip_addr = progdefaults.fd_tcpip_addr; FD_ip_port = progdefaults.fd_tcpip_port; try { FD_socket = new Socket( Address( FD_ip_addr.c_str(), FD_ip_port.c_str(), "tcp") ); FD_socket->set_timeout(0.01); FD_socket->connect(); FD_socket->set_nonblocking(true); LOG_INFO( "Connected to fdserver %s:%s", FD_ip_addr.c_str(), FD_ip_port.c_str() ); fd_looptime = 100; FD_connected = true; } catch (const SocketException& e) { // LOG_ERROR("%s", e.what() ); delete FD_socket; FD_socket = 0; FD_connected = false; } } //====================================================================== // //====================================================================== void FD_restart() { guard_lock send_lock(&FD_mutex); FD_ip_addr = progdefaults.fd_tcpip_addr; FD_ip_port = progdefaults.fd_tcpip_port; try { FD_socket->shut_down(); FD_socket->close(); delete FD_socket; FD_connected = false; FD_socket = new Socket( Address( FD_ip_addr.c_str(), FD_ip_port.c_str(), "tcp") ); FD_socket->set_timeout(0.01); FD_socket->connect(); FD_socket->set_nonblocking(true); fd_looptime = 100; LOG_INFO( "Connected to fdserver %s:%s", FD_ip_addr.c_str(), FD_ip_port.c_str() ); } catch (const SocketException& e) { // LOG_ERROR("%s", e.what() ); delete FD_socket; FD_socket = 0; FD_connected = false; } } //====================================================================== // Disconnect from FD tcpip server //====================================================================== void FD_disconnect() { if (!FD_socket) return; // send disconnect string FD_socket->shut_down(); FD_socket->close(); delete FD_socket; FD_socket = 0; FD_connected = false; FD_logged_on = false; REQ(clear_fd_viewer); LOG_INFO("Disconnected from fdserver"); } //////////////////////////////////////////////// // NEED TO DETECT WHEN SERVER IS CLOSED OR FAILS //////////////////////////////////////////////// //====================================================================== // Thread loop //====================================================================== static notify_dialog *fd_alert_window = 0; void ui_feedback() { btn_fd_connect->value(0); if (!fd_alert_window) fd_alert_window = new notify_dialog; fd_alert_window->notify(_("Check FD server, connect failed"), 15.0); show_notifier(fd_alert_window); } void *FD_loop(void *args) { SET_THREAD_ID(FD_TID); int try_count = 10; while(1) { for (int i = 0; i < fd_looptime/50; i++) { MilliSleep(50); if (FD_exit) break; } if (!FD_connected && progdefaults.connect_to_fdserver) { if (try_count--) FD_start(); else { progdefaults.connect_to_fdserver = false; REQ(ui_feedback); try_count = 10; } } if ( FD_connected && ((FD_ip_addr != progdefaults.fd_tcpip_addr) || (FD_ip_port != progdefaults.fd_tcpip_port)) ) FD_restart(); if (FD_exit) break; if (FD_connected && !progdefaults.connect_to_fdserver) { if (FD_logged_on) FD_logoff(); FD_disconnect(); } else if ( FD_connected && !FD_logged_on && progdefaults.connect_to_fdserver) { FD_logon(); } else if (FD_connected && FD_logged_on) { FD_rcv_data(); FD_mode_check(); FD_band_check(); } } if (FD_logged_on && FD_socket) FD_logoff(); // calls FD_disconnect() else FD_disconnect(); // exit the FD thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void FD_init(void) { FD_enabled = false; FD_exit = false; if (pthread_create(&FD_thread, NULL, FD_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "fdserver thread started"); FD_enabled = true; } //====================================================================== // //====================================================================== void FD_close(void) { if (!FD_enabled) return; FD_exit = true; pthread_join(FD_thread, NULL); FD_enabled = false; LOG_INFO("%s", "fdserver thread terminated. "); if (FD_socket) { FD_socket->shut_down(); FD_socket->close(); } } fldigi-4.1.06/src/logbook/lookupcall.cxx0000664000175000017500000007555513507401670015123 00000000000000// ---------------------------------------------------------------------------- // lookupcall.cxx -- a part of fldigi // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2006-2007 // Leigh Klotz, WA5ZNU // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "signal.h" #include #include #include #include #include #include "threads.h" #include "misc.h" #include "configuration.h" #include "lookupcall.h" #include "logsupport.h" #include "main.h" #include "confdialog.h" #include "fl_digi.h" #include "flmisc.h" #include "qrzlib.h" #include "trx.h" #include "xmlreader.h" #include "qrunner.h" #include "debug.h" #include "network.h" #include "locator.h" using namespace std; string qrzhost = "xmldata.qrz.com"; string qrzSessionKey; string qrzalert; string qrzerror; string callsign; string lookup_name; string lookup_addr1; string lookup_addr2; string lookup_state; string lookup_province; string lookup_zip; string lookup_country; string lookup_born; string lookup_fname; string lookup_qth; string lookup_grid; string lookup_latd; string lookup_lond; string lookup_notes; qrz_xmlquery_t DB_XML_query = QRZXMLNONE; qrz_webquery_t DB_WEB_query = QRZWEBNONE; enum TAG { QRZ_IGNORE, QRZ_KEY, QRZ_ALERT, QRZ_ERROR, QRZ_CALL, QRZ_FNAME, QRZ_NAME, QRZ_ADDR1, QRZ_ADDR2, QRZ_STATE, QRZ_ZIP, QRZ_COUNTRY, QRZ_LATD, QRZ_LOND, QRZ_GRID, QRZ_DOB }; pthread_t* QRZ_thread = 0; pthread_mutex_t qrz_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t qrz_cond = PTHREAD_COND_INITIALIZER; static void *LOOKUP_loop(void *args); bool parseSessionKey(); bool parse_xml(); bool getSessionKey(string& sessionpage); bool QRZGetXML(string& xmlpage); int bearing(const char *, const char *); void qra(const char *, double &, double &); void QRZ_disp_result(); void QRZ_CD_query(); void Lookup_init(void); void QRZclose(void); void qthappend(string &qth, string &datum); void QRZAlert(); bool QRZLogin(string& sessionpage); void QRZquery(); void parse_html(const string& htmlpage); bool HAMCALLget(string& htmlpage); void HAMCALLquery(); void QRZ_DETAILS_query(); QRZ *qCall = 0; static notify_dialog *announce = 0; void print_query(const string &name, const string &s) { // LOG_WARN("%s query:\n%s", name.c_str(), s.c_str()); LOG_VERBOSE("%s query:\n%s", name.c_str(), s.c_str()); } void print_data(const string &name, const string &s) { // LOG_WARN("%s data:\n%s", name.c_str(), s.c_str()); LOG_VERBOSE("%s data:\n%s", name.c_str(), s.c_str()); } void clear_Lookup() { lookup_name.clear(); lookup_addr1.clear(); lookup_addr2.clear(); lookup_state.clear(); lookup_province.clear(); lookup_zip.clear(); lookup_born.clear(); lookup_fname.clear(); lookup_qth.clear(); lookup_grid.clear(); lookup_latd.clear(); lookup_lond.clear(); lookup_notes.clear(); lookup_country.clear(); } // ---------------------------------------------------------------------------- // QRZ subscription query // ---------------------------------------------------------------------------- bool parseSessionKey(const string& sessionpage) { if (sessionpage.find("Bad Request") != string::npos) { return false; } IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(sessionpage)); TAG tag=QRZ_IGNORE; while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: switch (tag) { default: break; case QRZ_KEY: qrzSessionKey = xml->getNodeData(); break; case QRZ_ALERT: qrzalert = xml->getNodeData(); break; case QRZ_ERROR: qrzerror = xml->getNodeData(); break; } break; case EXN_ELEMENT_END: tag=QRZ_IGNORE; break; case EXN_ELEMENT: { const char *nodeName = xml->getNodeName(); if (!strcmp("Key", nodeName)) tag=QRZ_KEY; else if (!strcmp("Alert", nodeName)) tag=QRZ_ALERT; else if (!strcmp("Error", nodeName)) tag=QRZ_ERROR; else tag=QRZ_IGNORE; break; } case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } delete xml; return true; } bool parse_xml(const string& xmlpage) { print_data("xmldata.qrz.com", xmlpage); if (xmlpage.find("Not found") != std::string::npos) { if (!announce) announce = new notify_dialog; announce->notify("Not found", 2.0); REQ(show_notifier, announce); return false; } IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(xmlpage)); // If we got any result back, clear the session key so that it will be // refreshed by this response, or if not present, will be removed and we'll // know to log in next time. if (xml) { qrzSessionKey.clear(); qrzalert.clear(); qrzerror.clear(); clear_Lookup(); } TAG tag = QRZ_IGNORE; // parse the file until end reached while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: switch (tag) { default: case QRZ_IGNORE: break; case QRZ_CALL: break; case QRZ_FNAME: lookup_fname = xml->getNodeData(); break; case QRZ_NAME: lookup_name = xml->getNodeData(); break; case QRZ_ADDR1: { lookup_addr1 = xml->getNodeData(); size_t apt = lookup_addr1.find("#"); if (apt != string::npos) lookup_addr1.erase(apt, lookup_addr1.length() - apt); break; } case QRZ_ADDR2: lookup_addr2 = xml->getNodeData(); break; case QRZ_STATE: lookup_state = xml->getNodeData(); break; case QRZ_ZIP: lookup_zip = xml->getNodeData(); break; case QRZ_COUNTRY: lookup_country = xml->getNodeData(); break; case QRZ_LATD: lookup_latd = xml->getNodeData(); break; case QRZ_LOND: lookup_lond = xml->getNodeData(); break; case QRZ_GRID: lookup_grid = xml->getNodeData(); break; case QRZ_ALERT: qrzalert = xml->getNodeData(); break; case QRZ_ERROR: qrzerror = xml->getNodeData(); break; case QRZ_KEY: qrzSessionKey = xml->getNodeData(); break; } break; case EXN_ELEMENT_END: tag=QRZ_IGNORE; break; case EXN_ELEMENT: { const char *nodeName = xml->getNodeName(); if (!strcmp("call", nodeName)) tag = QRZ_CALL; else if (!strcmp("fname", nodeName)) tag = QRZ_FNAME; else if (!strcmp("name", nodeName)) tag = QRZ_NAME; else if (!strcmp("addr1", nodeName)) tag = QRZ_ADDR1; else if (!strcmp("addr2", nodeName)) tag = QRZ_ADDR2; else if (!strcmp("state", nodeName)) tag = QRZ_STATE; else if (!strcmp("zip", nodeName)) tag = QRZ_ZIP; else if (!strcmp("country", nodeName)) tag = QRZ_COUNTRY; else if (!strcmp("lat", nodeName)) tag = QRZ_LATD; else if (!strcmp("lon", nodeName)) tag = QRZ_LOND; else if (!strcmp("grid", nodeName)) tag = QRZ_GRID; else if (!strcmp("dob", nodeName)) tag = QRZ_DOB; else if (!strcmp("Alert", nodeName)) tag = QRZ_ALERT; else if (!strcmp("Error", nodeName)) tag = QRZ_ERROR; else if (!strcmp("Key", nodeName)) tag = QRZ_KEY; else tag = QRZ_IGNORE; } break; case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } // delete the xml parser after usage delete xml; return true; } bool getSessionKey(string& sessionpage) { string html = "http://"; html.append(qrzhost); html.append(" /xml/current/?username="); html.append(progdefaults.QRZusername); html.append(";password="); html.append(progdefaults.QRZuserpassword); html.append(";agent="); html.append(PACKAGE_NAME); html.append("-"); html.append(PACKAGE_VERSION); return get_http(html, sessionpage, 5.0); } bool QRZGetXML(string& xmlpage) { string html; html.assign("http://").append(qrzhost); html.append(" /bin/xml?s="); html.append(qrzSessionKey); html.append(";callsign="); html.append(callsign); return get_http(html, xmlpage, 5.0); } void camel_case(string &s) { bool first_letter = true; for (size_t n = 0; n < s.length(); n++) { if (s[n] == ' ') first_letter = true; else if (first_letter) { s[n] = toupper(s[n]); first_letter = false; } else s[n] = tolower(s[n]); } } void QRZ_disp_result() { ENSURE_THREAD(FLMAIN_TID); if (lookup_fname.length() > 0) { camel_case(lookup_fname); string::size_type spacePos = lookup_fname.find(" "); // if fname is "ABC" then display "ABC" // or if fname is "A BCD" then display "A BCD" if (spacePos == string::npos || (spacePos == 1)) { inpName->value(lookup_fname.c_str()); } // if fname is "ABC Y" then display "ABC" else if (spacePos > 2) { string fname; fname.assign(lookup_fname, 0, spacePos); inpName->value(fname.c_str()); } // fname must be "ABC DEF" so display "ABC DEF" else { inpName->value(lookup_fname.c_str()); } } else if (lookup_name.length() > 0) { // only name is set; don't know first/last, so just show all inpName->value(lookup_name.c_str()); } inpQth->value(lookup_qth.c_str()); inpQth->position (0); inpState->value(lookup_state.c_str()); inpState->position (0); inpVEprov->value(lookup_province.c_str()); inpVEprov->position (0); inpLoc->value(lookup_grid.c_str()); inpLoc->position (0); if (!lookup_country.empty()) { cboCountry->value(lookup_country.c_str()); } if (!progdefaults.myLocator.empty() && !lookup_grid.empty()) { char buf[10]; buf[0] = '\0'; double distance, azimuth, lon[2], lat[2]; if (QRB::locator2longlat(&lon[0], &lat[0], progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon[1], &lat[1], lookup_grid.c_str()) == QRB::QRB_OK && QRB::qrb(lon[0], lat[0], lon[1], lat[1], &distance, &azimuth) == QRB::QRB_OK) snprintf(buf, sizeof(buf), "%03.0f", round(azimuth)); inpAZ->value(buf); inpAZ->position (0); } inpNotes->value(lookup_notes.c_str()); inpNotes->position (0); } void QRZ_CD_query() { ENSURE_THREAD(QRZ_TID); char srch[20]; size_t snip; memset( srch, 0, sizeof(srch) ); strncpy( srch, callsign.c_str(), 6 ); for (size_t i = 0; i < strlen(srch); i ++ ) srch[i] = toupper(srch[i]); string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if( qCall->FindRecord( srch ) == 1) { lookup_fname = qCall->GetFname(); camel_case(lookup_fname); snip = lookup_fname.find(' '); if (snip != string::npos) lookup_fname.erase(snip, lookup_fname.length() - snip); lookup_qth = qCall->GetCity(); lookup_state = qCall->GetState(); lookup_grid.clear(); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_fname).append(" ").append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); if (!lookup_state.empty()) notes.append(", ").append(lookup_state).append(" ").append(lookup_zip); else if (!lookup_province.empty()) notes.append(", ").append(lookup_province).append(" ").append(lookup_zip); else notes.append(" ").append(lookup_country); } } else { lookup_fname.clear(); lookup_qth.clear(); lookup_grid.clear(); lookup_born.clear(); lookup_notes.append("Not found in CD database"); } REQ(QRZ_disp_result); } void Lookup_init(void) { ENSURE_THREAD(FLMAIN_TID); if (QRZ_thread) return; QRZ_thread = new pthread_t; if (pthread_create(QRZ_thread, NULL, LOOKUP_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } void QRZclose(void) { ENSURE_THREAD(FLMAIN_TID); if (!QRZ_thread) return; CANCEL_THREAD(*QRZ_thread); DB_XML_query = QRZXML_EXIT; DB_WEB_query = QRZWEB_EXIT; pthread_mutex_lock(&qrz_mutex); pthread_cond_signal(&qrz_cond); pthread_mutex_unlock(&qrz_mutex); pthread_join(*QRZ_thread, NULL); delete QRZ_thread; QRZ_thread = 0; } void qthappend(string &qth, string &datum) { if (datum.empty()) return; if (!qth.empty()) qth += ", "; qth += datum; } void QRZAlert() { ENSURE_THREAD(FLMAIN_TID); string qrznote; if (!qrzalert.empty()) { qrznote.append("QRZ alert:\n"); qrznote.append(qrzalert); qrznote.append("\n"); qrzalert.clear(); } if (!qrzerror.empty()) { qrznote.append("QRZ error:\n"); qrznote.append(qrzerror); qrzerror.clear(); } string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if (!qrznote.empty()) { if (!notes.empty()) notes.append("\n"); notes.append(qrznote); inpNotes->value(notes.c_str()); } } bool QRZLogin(string& sessionpage) { bool ok = true; if (qrzSessionKey.empty()) { ok = getSessionKey(sessionpage); if (ok) ok = parseSessionKey(sessionpage); } if (!ok) { LOG_VERBOSE("failed"); REQ(QRZAlert); } return ok; } void QRZquery() { ENSURE_THREAD(QRZ_TID); bool ok = true; string qrzpage; if (qrzSessionKey.empty()) ok = QRZLogin(qrzpage); if (ok) ok = QRZGetXML(qrzpage); if (ok) { parse_xml(qrzpage); if (!qrzalert.empty() || !qrzerror.empty()) REQ(QRZAlert); else { lookup_qth = lookup_addr2; if (lookup_country.find("Canada") != string::npos) { lookup_province = lookup_state; lookup_state.clear(); } string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_fname).append(" ").append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); if (!lookup_state.empty()) notes.append(", ").append(lookup_state).append(" ").append(lookup_zip); else if (!lookup_province.empty()) notes.append(", ").append(lookup_province).append(" ").append(lookup_zip); else notes.append(" ").append(lookup_country); } lookup_notes = notes; REQ(QRZ_disp_result); } } else { qrzerror = qrzpage; REQ(QRZAlert); } } // --------------------------------------------------------------------- // HTTP:://callook.info queries // --------------------------------------------------------------------- string node_data(const string &xmlpage, const string nodename) { size_t pos1, pos2; string test; test.assign("<").append(nodename).append(">"); pos1 = xmlpage.find(test); if (pos1 == string::npos) return ""; pos1 += test.length(); test.assign(""); pos2 = xmlpage.find(test); if (pos2 == string::npos) return ""; return xmlpage.substr(pos1, pos2 - pos1); } void parse_callook(string& xmlpage) { print_data("Callook info", xmlpage); if (xmlpage.find("INVALID") != std::string::npos) { if (!announce) announce = new notify_dialog; announce->notify("Call not found", 2.0); REQ(show_notifier, announce); return; } string nodestr = node_data(xmlpage, "current"); if (nodestr.empty()) { if (!announce) announce = new notify_dialog; announce->notify("no data from callook.info", 2.0); REQ(show_notifier, announce); return; } size_t start_pos = xmlpage.find(""); if (start_pos == string::npos) return; start_pos += 10; xmlpage = xmlpage.substr(start_pos); lookup_name = node_data(xmlpage, "name"); camel_case(lookup_name); lookup_fname = lookup_name; nodestr = node_data(xmlpage, "address"); if (!nodestr.empty()) { lookup_addr1 = node_data(nodestr, "line1"); lookup_addr2 = node_data(nodestr, "line2"); } nodestr = node_data(xmlpage, "location"); if (!nodestr.empty()) { lookup_lond = node_data(nodestr, "longitude"); lookup_latd = node_data(nodestr, "latitude"); lookup_grid = node_data(nodestr, "gridsquare"); } string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); } lookup_notes = notes; size_t p = lookup_addr2.find(","); if (p != string::npos) { lookup_qth = lookup_addr2.substr(0, p); lookup_addr2.erase(0, p+2); p = lookup_addr2.find(" "); if (p != string::npos) lookup_state = lookup_addr2.substr(0, p); } } bool CALLOOKGetXML(string& xmlpage) { string url = progdefaults.callookurl; size_t p = 0; if ((p = url.find("https")) != std::string::npos) url.erase(p+4,1); url.append(callsign).append("/xml"); bool res = get_http(url, xmlpage, 5.0); LOG_VERBOSE("result = %d", res); return res; } void CALLOOKquery() { ENSURE_THREAD(QRZ_TID); // bool ok = true; string CALLOOKpage; clear_Lookup(); // ok = CALLOOKGetXML(CALLOOKpage); // if (ok) parse_callook(CALLOOKpage); REQ(QRZ_disp_result); } // --------------------------------------------------------------------- // Hamcall specific functions // --------------------------------------------------------------------- #define HAMCALL_CALL "181" #define HAMCALL_FIRST "184" #define HAMCALL_CITY "191" #define HAMCALL_STATE "192" #define HAMCALL_GRID "202" #define HAMCALL_DOB "194" void parse_html(const string& htmlpage) { print_data("Hamcall data", htmlpage); size_t p; clear_Lookup(); if ((p = htmlpage.find(HAMCALL_FIRST)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length() ) lookup_fname += htmlpage[p++]; camel_case(lookup_fname); } if ((p = htmlpage.find(HAMCALL_CITY)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_qth += htmlpage[p++]; } if ((p = htmlpage.find(HAMCALL_STATE)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_state += htmlpage[p++]; } if ((p = htmlpage.find(HAMCALL_GRID)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_grid += htmlpage[p++]; } if ((p = htmlpage.find(HAMCALL_DOB)) != string::npos) { p++; lookup_notes = "DOB: "; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_notes += htmlpage[p++]; } } bool HAMCALLget(string& htmlpage) { string html = "http://"; html.append(progdefaults.hamcallurl); html.append(" /call?username="); html.append(progdefaults.QRZusername); html.append("&password="); html.append(progdefaults.QRZuserpassword); html.append("&rawlookup=1&callsign="); html.append(callsign); html.append("&program=fldigi-"); html.append(VERSION); return get_http(html, htmlpage, 5.0); // print_query("hamcall", url_html); // string url = progdefaults.hamcallurl; // size_t p = url.find("//"); // string service = url.substr(0, p); // url.erase(0, p+2); // size_t len = url.length(); // if (url[len-1]=='/') url.erase(len-1, 1); // return network_query(url, service, url_html, htmlpage, 5.0); } void HAMCALLquery() { ENSURE_THREAD(QRZ_TID); string htmlpage; if (HAMCALLget(htmlpage)) parse_html(htmlpage); else lookup_notes = htmlpage; REQ(QRZ_disp_result); } // --------------------------------------------------------------------- // Hamcall specific functions // --------------------------------------------------------------------- static string HAMQTH_session_id = ""; static string HAMQTH_reply = ""; #define HAMQTH_DEBUG 1 #undef HAMQTH_DEBUG /* * send: https://www.hamqth.com/xml.php?u=username&p=password * response: 09b0ae90050be03c452ad235a1f2915ad684393c * * send: https://www.hamqth.com/xml.php?id=09b0ae90050be03c452ad235a1f2915ad684393c\ &callsign=ok7an&prg=YOUR_PROGRAM_NAME * response: ok7an Petr Neratovice Czech Republic 503 28 15 jo70gg Petr Hlozek 17. listopadu 1065 Neratovice 27711 Czech Republic 503 GZL Y Y Y Y petr@ok7an.com petr@ok7an.com PetrHH 1982 1998 https://www.ok7an.com 50.07 14.42 EU -1 https://www.hamqth.com/userfiles/o/ok/ok7an/_profile/ok7an_nove.jpg */ bool HAMQTH_get_session_id() { string url; string retstr = ""; size_t p1 = string::npos; size_t p2 = string::npos; url.assign(progdefaults.hamqthurl); if ((p1 = url.find("https")) != std::string::npos) url.erase(p1+4,1); if (url[url.length()-1] != '/') url += '/'; url.append("xml.php?u=").append(progdefaults.QRZusername); url.append("&p=").append(progdefaults.QRZuserpassword); HAMQTH_session_id.clear(); int ret = get_http(url, retstr, 5.0); if (ret == 0 ) { LOG_ERROR("get_http( %s, retstr, 5.0) failed\n", url.c_str()); return false; } LOG_VERBOSE("url: %s", url.c_str()); LOG_VERBOSE("reply: %s\n", retstr.c_str()); p1 = retstr.find(""); if (p1 != string::npos) { p2 = retstr.find(""); if (p2 != string::npos) { p1 += 7; lookup_notes = retstr.substr(p1, p2 - p1); } return false; } p1 = retstr.find(""); if (p1 == string::npos) { lookup_notes = "HamQTH not available"; return false; } p2 = retstr.find(""); HAMQTH_session_id = retstr.substr(p1 + 12, p2 - p1 - 12); print_data("HamQTH session id", HAMQTH_session_id); return true; } void parse_HAMQTH_html(const string& htmlpage) { print_data("HamQth html", htmlpage); size_t p = string::npos; size_t p1 = string::npos; string tempstr; clear_Lookup(); lookup_fname.clear(); lookup_qth.clear(); lookup_state.clear(); lookup_grid.clear(); lookup_notes.clear(); lookup_country.clear(); if ((p = htmlpage.find("")) != string::npos) { p += 7; p1 = htmlpage.find("", p); if (p1 != string::npos) { std::string errstr = htmlpage.substr(p, p1 - p); if (!announce) announce = new notify_dialog; announce->notify(errstr.c_str(), 2.0); REQ(show_notifier, announce); } return; } if ((p = htmlpage.find("")) != string::npos) { p += 6; p1 = htmlpage.find("", p); if (p1 != string::npos) { lookup_fname = htmlpage.substr(p, p1 - p); camel_case(lookup_fname); } } if ((p = htmlpage.find("")) != string::npos) { p += 5; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_qth = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != string::npos) { lookup_country = htmlpage.substr(p, p1 - p); if (lookup_country == "Canada") { p = htmlpage.find(""); if (p != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_province = htmlpage.substr(p, p1 - p); } } } } if ((p = htmlpage.find("")) != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_state = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != string::npos) { p += 6; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_grid = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append("QSL via: ").append(tempstr).append("\n"); } } if (progdefaults.notes_address) { if ((p = htmlpage.find("")) != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr).append("\n"); } } if ((p = htmlpage.find("")) != string::npos) { p += 13; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr).append("\n"); } } if ((p = htmlpage.find("")) != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr); if (!lookup_state.empty()) lookup_notes.append(", ").append(lookup_state); else if (!lookup_province.empty()) lookup_notes.append(", ").append(lookup_province); } } if ((p = htmlpage.find("")) != string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(" ").append(tempstr); } } } } bool HAMQTHget(string& htmlpage) { string url; bool ret; if (HAMQTH_session_id.empty()) { if (!HAMQTH_get_session_id()) { LOG_WARN("HAMQTH session id failed!"); lookup_notes = "Get session id failed!\n"; return false; } } size_t p1; url.assign(progdefaults.hamqthurl); if ((p1 = url.find("https")) != std::string::npos) url.erase(p1+4,1); if (url[url.length()-1] != '/') url += '/'; url.append("xml.php?id=").append(HAMQTH_session_id); url.append("&callsign=").append(callsign); url.append("&prg=FLDIGI"); print_query("HamQTH", url); ret = get_http(url, htmlpage, 5.0); size_t p = htmlpage.find("Session does not exist or expired"); if (p != string::npos) { htmlpage.clear(); LOG_WARN("HAMQTH session id expired!"); HAMQTH_session_id.clear(); if (!HAMQTH_get_session_id()) { LOG_WARN("HAMQTH get session id failed!"); lookup_notes = "Get session id failed!\n"; htmlpage.clear(); return false; } ret = get_http(url, htmlpage, 5.0); } #ifdef HAMQTH_DEBUG FILE *fetchit = fopen("fetchit.txt", "a"); fprintf(fetchit, "%s\n", htmlpage.c_str()); fclose(fetchit); #endif return ret; } void HAMQTHquery() { ENSURE_THREAD(QRZ_TID); string htmlpage; if (!HAMQTHget(htmlpage)) return; parse_HAMQTH_html(htmlpage); REQ(QRZ_disp_result); } // ---------------------------------------------------------------------------- void QRZ_DETAILS_query() { string qrz = progdefaults.qrzurl; qrz.append("db/").append(callsign); cb_mnuVisitURL(0, (void*)qrz.c_str()); } void HAMCALL_DETAILS_query() { string hamcall = progdefaults.hamcallurl; hamcall.append("call?callsign=").append(callsign); cb_mnuVisitURL(0, (void*)hamcall.c_str()); } void HAMQTH_DETAILS_query() { string hamqth = progdefaults.hamqthurl; hamqth.append(callsign); cb_mnuVisitURL(0, (void*)hamqth.c_str()); } void CALLOOK_DETAILS_query() { string hamcall = progdefaults.callookurl; hamcall.append(callsign); cb_mnuVisitURL(0, (void *)hamcall.c_str()); } // ---------------------------------------------------------------------------- static void *LOOKUP_loop(void *args) { SET_THREAD_ID(QRZ_TID); SET_THREAD_CANCEL(); for (;;) { TEST_THREAD_CANCEL(); pthread_mutex_lock(&qrz_mutex); pthread_cond_wait(&qrz_cond, &qrz_mutex); pthread_mutex_unlock(&qrz_mutex); switch (DB_XML_query) { case QRZCD : QRZ_CD_query(); break; case QRZNET : QRZquery(); break; case HAMCALLNET : HAMCALLquery(); break; case CALLOOK: CALLOOKquery(); break; case HAMQTH: HAMQTHquery(); break; case QRZXML_EXIT: return NULL; default: break; } switch (DB_WEB_query) { case QRZHTML : QRZ_DETAILS_query(); break; case HAMCALLHTML : HAMCALL_DETAILS_query(); break; case HAMQTHHTML : HAMQTH_DETAILS_query(); break; case CALLOOKHTML : CALLOOK_DETAILS_query(); break; case QRZWEB_EXIT: return NULL; default: break; } } return NULL; } void CALLSIGNquery() { ENSURE_THREAD(FLMAIN_TID); if (!QRZ_thread) Lookup_init(); // Filter callsign for nonsense characters (remove all but [A-Za-z0-9/]) callsign.clear(); for (const char* p = inpCall->value(); *p; p++) if (isalnum(*p) || *p == '/') callsign += *p; if (callsign.empty()) return; if (callsign != inpCall->value()) inpCall->value(callsign.c_str()); size_t slash; while ((slash = callsign.rfind('/')) != string::npos) { if (((slash+1) * 2) < callsign.length()) callsign.erase(0, slash + 1); else callsign.erase(slash); } switch (DB_XML_query = static_cast(progdefaults.QRZXML)) { case QRZNET: LOG_INFO("%s","Request sent to qrz.com..."); break; case HAMCALLNET: LOG_INFO("%s","Request sent to www.hamcall.net..."); break; case QRZCD: if (!qCall) qCall = new QRZ( "callbkc" ); if (progdefaults.QRZchanged) { qCall->NewDBpath("callbkc"); progdefaults.QRZchanged = false; } if (!qCall->getQRZvalid()) { LOG_ERROR("%s","QRZ DB error"); DB_XML_query = QRZXMLNONE; return; } break; case CALLOOK: LOG_INFO("Request sent to %s", progdefaults.callookurl.c_str()); break; case HAMQTH: LOG_INFO("Request sent to %s", progdefaults.hamqthurl.c_str()); break; case QRZXMLNONE: break; default: LOG_ERROR("Bad query type %d", DB_XML_query); return; } DB_WEB_query = static_cast(progdefaults.QRZWEB); pthread_mutex_lock(&qrz_mutex); pthread_cond_signal(&qrz_cond); pthread_mutex_unlock(&qrz_mutex); } /// With this constructor, no need to declare the array mode_info[] in the calling program. QsoHelper::QsoHelper(int the_mode) : qso_rec( new cQsoRec ) { qso_rec->putField(ADIF_MODE, mode_info[the_mode].adif_name ); } /// This saves the new record to a file and must be run in the main thread. static void QsoHelperSave(cQsoRec * qso_rec_ptr) { qsodb.qsoNewRec (qso_rec_ptr); qsodb.isdirty(0); qsodb.isdirty(0); loadBrowser(true); /// It is mandatory to do this in the main thread. TODO: Crash suspected. adifFile.writeLog (logbook_filename.c_str(), &qsodb); /// Beware that this object is created in a thread and deleted in the main one. delete qso_rec_ptr ; } /// This must be called from the main thread, according to writeLog(). QsoHelper::~QsoHelper() { qso_rec->setDateTime(true); qso_rec->setDateTime(false); qso_rec->setFrequency( wf->rfcarrier() ); REQ( QsoHelperSave, qso_rec ); // It will be deleted in the main thread. qso_rec = NULL ; } /// Adds one key-value pair to display in the ADIF file. void QsoHelper::Push( ADIF_FIELD_POS pos, const std::string & value ) { qso_rec->putField( pos, value.c_str() ); } fldigi-4.1.06/src/logbook/logbook.cxx0000664000175000017500000000443013507402064014370 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "main.h" #include "logbook.h" #include "logsupport.h" #include "configuration.h" #include "debug.h" #include "qrunner.h" #include "gettext.h" #include "icons.h" using namespace std; void start_logbook () { if (progdefaults.logbookfilename.empty()) { logbook_filename = LogsDir; logbook_filename.append("logbook." ADIF_SUFFIX); progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; } else logbook_filename = progdefaults.logbookfilename; qsodb.deleteRecs(); adifFile.readFile (logbook_filename.c_str(), &qsodb); rotate_log(logbook_filename); string label = "Logbook - "; label.append(fl_filename_name(logbook_filename.c_str())); dlgLogbook->copy_label(label.c_str()); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); restore_sort(); loadBrowser(); qsodb.isdirty(0); MilliSleep(100); return; } void close_logbook() { /* DISABLE CONSTRAINTS - ATTEMPT TO THWART WINDOWS FAILURE TO WRITE LOG ON EXIT if (!qsodb.isdirty()) return; if (progdefaults.NagMe) if (!fl_choice2(_("Save changed Logbook?"), _("No"), _("Yes"), NULL)) return; cQsoDb::reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); */ // force immediate write to logbook adif file adifFile.writeLog (logbook_filename.c_str(), &qsodb, true); } fldigi-4.1.06/src/logbook/qso_db.cxx0000664000175000017500000004412413507401434014207 00000000000000// ---------------------------------------------------------------------------- // qso_db.cxx // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Remi Chateauneu, 2011 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "qso_db.h" #include "field_def.h" #include "globals.h" #include "timeops.h" #include "debug.h" #include "pthread.h" using namespace std; static int compby = COMPDATE; static bool date_off = true; bool cQsoDb::reverse = false; cQsoRec::cQsoRec() { for (int i=0;i < NUMFIELDS; i++) { qsofield[i] = new string; qsofield[i]->clear(); } } cQsoRec::~cQsoRec () { for (int i = 0; i < NUMFIELDS; i++) delete qsofield[i]; } void cQsoRec::clearRec () { for (int i = 0; i < NUMFIELDS; i++) qsofield[i]->clear(); } int cQsoRec::validRec() { return 0; } void cQsoRec::checkBand() { size_t flen = qsofield[FREQ]->length(), blen = qsofield[BAND]->length(); if (flen == 0 && blen != 0) { for (size_t n = 0; n < blen; n++) (*qsofield[BAND])[n] = tolower((*qsofield[BAND])[n]); *qsofield[FREQ] = band_freq((*qsofield[BAND]).c_str()); } else if (blen == 0 && flen != 0) *qsofield[BAND] = band_name((*qsofield[FREQ]).c_str()); } void cQsoRec::checkDateTimes() { size_t len1 = qsofield[TIME_ON]->length(), len2 = qsofield[TIME_OFF]->length(); if (len1 == 0 && len2 != 0) *qsofield[TIME_ON] = *qsofield[TIME_OFF]; else if (len1 != 0 && len2 == 0) *qsofield[TIME_OFF] = *qsofield[TIME_ON]; len1 = qsofield[QSO_DATE]->length(); len2 = qsofield[QSO_DATE_OFF]->length(); if (len1 == 0 && len2 != 0) *qsofield[QSO_DATE] = *qsofield[QSO_DATE_OFF]; else if (len1 != 0 && len2 == 0) *qsofield[QSO_DATE_OFF] = *qsofield[QSO_DATE]; } // Sets the current time, with the right format. void cQsoRec::setDateTime(bool dtOn) { time_t tmp_time = time(NULL); struct tm tmp_tm ; if (localtime_r(&tmp_time, &tmp_tm)) { char buf_date[64] ; snprintf( buf_date, sizeof(buf_date), "%04d%02d%02d", 1900 + tmp_tm.tm_year, 1 + tmp_tm.tm_mon, tmp_tm.tm_mday ); char buf_time[64] ; snprintf( buf_time, sizeof(buf_time), "%02d%02d%02d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec ); if(dtOn) { putField(QSO_DATE, buf_date); putField(TIME_ON, buf_time); } else { putField(QSO_DATE_OFF, buf_date); putField(TIME_OFF, buf_time); } } } /// It must match a specific format. Input in Hertz. void cQsoRec::setFrequency(long long freq) { double freq_dbl = freq / 1000000.0 ; char buf_freq[64]; snprintf( buf_freq, sizeof(buf_freq), "%lf", freq_dbl ); putField(FREQ, buf_freq ); } void cQsoRec::putField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; qsofield[n]->assign(s);// = s; } void cQsoRec::putField (int n, const char *s, int len) { if (n < 0 || n >= NUMFIELDS) return; qsofield[n]->assign(s, len); } void cQsoRec::addtoField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; qsofield[n]->append(s); } void cQsoRec::trimFields () { size_t p; string s; for (int i = 0; i < NUMFIELDS; i++) { s = *qsofield[i]; //right trim string p = s.length(); while (p && s[p-1] == ' ') { s.erase(p - 1); p = s.length(); } //left trim string p = s.length(); while (p && s[0] == ' ') { s.erase(0,1); p = s.length(); } //make all upper case if Callsign or Mode if (i == CALL || i == ADIF_MODE) { for (p = 0; p < s.length(); p++) s[p] = toupper(s[p]); } *qsofield[i] = s; } } static const char *empty_field = ""; const char * cQsoRec::getField (int n) const { if (n < 0 || n >= NUMFIELDS) return empty_field; return (qsofield[n]->c_str()); } const cQsoRec &cQsoRec::operator=(const cQsoRec &right) { if (this != &right) { for (int i = 0; i < NUMFIELDS; i++) { (this->qsofield[i])->assign((right.qsofield[i])->c_str()); } } return *this; } int compareTimes (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) return r1.qsofield[TIME_OFF]->compare(*r2.qsofield[TIME_OFF]); return r1.qsofield[TIME_ON]->compare(*r2.qsofield[TIME_ON]); } int compareDates (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) return r1.qsofield[QSO_DATE_OFF]->compare(*r2.qsofield[QSO_DATE_OFF]); return r1.qsofield[QSO_DATE]->compare(*r2.qsofield[QSO_DATE]); } int compareCalls (const cQsoRec &r1, const cQsoRec &r2) { return (r1.qsofield[CALL])->compare( *r2.qsofield[CALL] ); } int compareModes (const cQsoRec &r1, const cQsoRec &r2) { return (r1.qsofield[ADIF_MODE])->compare( *r2.qsofield[ADIF_MODE] ); } int compareFreqs (const cQsoRec &r1, const cQsoRec &r2) { double f1, f2; f1 = atof(r1.qsofield[FREQ]->c_str()); f2 = atof(r2.qsofield[FREQ]->c_str()); return (f1 == f2 ? 0 : f1 < f2 ? -1 : 1); } int comparebydate(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareDates(*r1, *r2))) return cmp; if ((cmp = compareTimes(*r1, *r2))) return cmp; if ((cmp = compareCalls(*r1, *r2))) return cmp; if ((cmp = compareModes(*r1, *r2))) return cmp; return compareFreqs(*r1, *r2); } int comparebymode(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareModes(*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; return compareFreqs(*r1, *r2); } int comparebycall(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareModes(*r1, *r2)) != 0) return cmp; return compareFreqs(*r1, *r2); } int comparebyfreq(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareFreqs(*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; return compareModes(*r1, *r2); } bool cQsoRec::operator==(const cQsoRec &right) const { if (compareDates (*this, right) != 0) return false; if (compareTimes (*this, right) != 0) return false; if (compareCalls (*this, right) != 0) return false; if (compareFreqs (*this, right) != 0) return false; return true; } bool cQsoRec::operator<(const cQsoRec &right) const { if (compareDates (*this, right) > -1) return false; if (compareTimes (*this, right) > -1) return false; if (compareCalls (*this, right) > -1) return false; if (compareFreqs (*this, right) > -1) return false; return true; } static char delim_in = '\t'; static char delim_out = '\t'; static bool isVer3 = false; ostream &operator<< (ostream &output, const cQsoRec &rec) { for (int i = 0; i < EXPORT; i++) output << rec.qsofield[i]->c_str() << delim_out; return output; } istream &operator>> (istream &input, cQsoRec &rec ) { static char buf[1024]; // Must be big enough for a field. for (int i = 0; i < NUMFIELDS; i++) { input.getline( buf, sizeof(buf), delim_in ); *rec.qsofield[i] = buf ; } return input; } //====================================================================== // class cQsoDb #define MAXRECS 100000 #define INCRRECS 10000 cQsoDb::cQsoDb() { nbrrecs = 0; maxrecs = MAXRECS; qsorec = new cQsoRec[maxrecs]; compby = COMPDATE; dirty = 0; } cQsoDb::cQsoDb(cQsoDb *db) { nbrrecs = 0; maxrecs = db->nbrRecs(); qsorec = new cQsoRec[maxrecs]; for (int i = 0; i < maxrecs; i++) qsorec[i] = db->qsorec[i]; compby = COMPDATE; nbrrecs = maxrecs; dirty = 0; } cQsoDb::~cQsoDb() { delete [] qsorec; } void cQsoDb::deleteRecs() { delete [] qsorec; nbrrecs = 0; maxrecs = MAXRECS; qsorec = new cQsoRec[maxrecs]; dirty = 0; } void cQsoDb::clearDatabase() { deleteRecs(); } int cQsoDb::qsoFindRec(cQsoRec *rec) { for (int i = 0; i < nbrrecs; i++) if (qsorec[i] == *rec) return i; return -1; } void cQsoDb::qsoNewRec (cQsoRec *nurec) { if (nbrrecs == maxrecs) { maxrecs += INCRRECS; cQsoRec *atemp = new cQsoRec[maxrecs]; for (int i = 0; i < nbrrecs; i++) atemp[i] = qsorec[i]; delete [] qsorec; qsorec = atemp; } qsorec[nbrrecs] = *nurec; qsorec[nbrrecs].checkBand(); qsorec[nbrrecs].checkDateTimes(); nbrrecs++; } cQsoRec* cQsoDb::newrec() { if (nbrrecs == maxrecs) { maxrecs += INCRRECS; cQsoRec *atemp = new cQsoRec[maxrecs]; for (int i = 0; i < nbrrecs; i++) atemp[i] = qsorec[i]; delete [] qsorec; qsorec = atemp; } nbrrecs++; return &qsorec[nbrrecs - 1]; } void cQsoDb::qsoDelRec (int rnbr) { if (rnbr < 0 || rnbr > (nbrrecs - 1)) return; for (int i = rnbr; i < nbrrecs - 1; i++) qsorec[i] = qsorec[i+1]; nbrrecs--; qsorec[nbrrecs].clearRec(); } void cQsoDb::qsoUpdRec (int rnbr, cQsoRec *updrec) { if (rnbr < 0 || rnbr > (nbrrecs - 1)) return; qsorec[rnbr] = *updrec; qsorec[rnbr].checkBand(); return; } #if 1 void cQsoDb::SortByDate (bool how) { date_off = how; qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebydate); } void cQsoDb::SortByCall () { qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebycall); } void cQsoDb::SortByMode () { qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebymode); } void cQsoDb::SortByFreq () { qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebyfreq); } #else #include using Clock = std::chrono::steady_clock; using std::chrono::time_point; using std::chrono::duration_cast; using std::chrono::milliseconds; void cQsoDb::SortByDate (bool how) { date_off = how; time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebydate); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } void cQsoDb::SortByCall () { time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebycall); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } void cQsoDb::SortByMode () { time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebymode); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } void cQsoDb::SortByFreq () { time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebyfreq); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } #endif bool cQsoDb::qsoIsValidFile(const char *fname) { char buff[256]; ifstream inQsoFile (fname, ios::in); if (!inQsoFile) return false; inQsoFile.getline (buff, 256); if (strstr (buff, "_LOGBODUP DB") == 0) { inQsoFile.close(); return false; } inQsoFile.close(); return true; } int cQsoDb::qsoReadFile (const char *fname) { char buff[256]; ifstream inQsoFile (fname, ios::in); if (!inQsoFile) return 1; inQsoFile.getline (buff, 256); if (strstr (buff, "_LOGBODUP DB") == 0) { inQsoFile.close(); return 2; } if (strstr (buff, "_LOGBODUP DBX") == 0) // new file format delim_in = '\n'; if (strstr (buff, "3.0") != 0) isVer3 = true; cQsoRec inprec; while (inQsoFile >> inprec) qsoNewRec (&inprec); inQsoFile.close(); SortByDate(date_off); return 0; } int cQsoDb::qsoWriteFile (const char *fname) { ofstream outQsoFile (fname, ios::out); if (!outQsoFile) { return 1; } outQsoFile << "_LOGBODUP DBX 3.0" << '\n'; for (int i = 0; i < nbrrecs; i++) outQsoFile << qsorec[i]; outQsoFile.close(); return 0; } const int cQsoDb::jdays[2][13] = { { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; bool cQsoDb::isleapyear( int y ) const { if( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) ) return true; return false; } int cQsoDb::dayofyear (int year, int mon, int mday) { return mday + jdays[isleapyear (year) ? 1 : 0][mon]; } unsigned long cQsoDb::epoch_dt (const char *szdate, const char *sztime) { unsigned long doe; int era, cent, quad, rest; int year, mon, mday; int secs; year = ((szdate[0]*10 + szdate[1])*10 + szdate[2])*10 + szdate[3]; mon = szdate[4]*10 + szdate[5]; mday = szdate[6]*10 + szdate[7]; secs = ((sztime[0]*10 + sztime[1])*60 + sztime[2]*10 + sztime[3])*60 + + sztime[4]*10 + sztime[5]; /* break down the year into 400, 100, 4, and 1 year multiples */ rest = year - 1; quad = rest / 4; rest %= 4; cent = quad / 25; quad %= 25; era = cent / 4; cent %= 4; /* set up doe */ doe = dayofyear (year, mon, mday); doe += era * (400 * 365 + 97); doe += cent * (100 * 365 + 24); doe += quad * (4 * 365 + 1); doe += rest * 365; return doe*60*60*24 + secs; } int cQsoDb::duplicate( const char *callsign, const char *szdate, const char *sztime, unsigned int interval, bool chkdatetime, const char *freq, bool chkfreq, const char *state, bool chkstate, const char *mode, bool chkmode, const char *xchg1, bool chkxchg1 ) { bool b_freqDUP = true, b_stateDUP = true, b_modeDUP = true, b_xchg1DUP = true, b_dtimeDUP = true; unsigned long datetime = 0L; unsigned long qsodatetime = 0L; int f1 = 0; int f2 = 0; int isdup = 0; if (freq) f1 = (int)(atof(freq)/1000.0); if (chkdatetime) datetime = epoch_dt(szdate, sztime); for (int i = 0; i < nbrrecs; i++) { if (strcasecmp(qsorec[i].getField(CALL), callsign) == 0) { // found callsign duplicate if (!chkdatetime && !chkfreq && !chkstate && !chkmode && !chkxchg1) isdup = 2; if (szdate == NULL) return isdup; b_freqDUP = b_stateDUP = b_modeDUP = b_xchg1DUP = b_dtimeDUP = false; if (chkfreq) { f2 = (int)atof(qsorec[i].getField(FREQ)); b_freqDUP = (f1 == f2); } if (chkstate) b_stateDUP = (qsorec[i].getField(STATE)[0] == 0 && state[0] == 0) || (strcasestr(qsorec[i].getField(STATE), state) != 0); if (chkmode) b_modeDUP = (qsorec[i].getField(ADIF_MODE)[0] == 0 && mode[0] == 0) || (strcasestr(qsorec[i].getField(ADIF_MODE), mode) != 0); if (chkxchg1) b_xchg1DUP = (qsorec[i].getField(XCHG1)[0] == 0 && xchg1[0] == 0) || (strcasestr(qsorec[i].getField(XCHG1), xchg1) != 0); if (chkdatetime) { qsodatetime = epoch_dt ( qsorec[i].getField(QSO_DATE), qsorec[i].getField(TIME_OFF)); if ((datetime - qsodatetime) < interval*60) b_dtimeDUP = true; } if ( (!chkfreq || (chkfreq && b_freqDUP)) && (!chkstate || (chkstate && b_stateDUP)) && (!chkmode || (chkmode && b_modeDUP)) && (!chkxchg1 || (chkxchg1 && b_xchg1DUP)) && (!chkdatetime || (chkdatetime && b_dtimeDUP))) { isdup = 1; } } } return isdup; } // set epoch interval test to 15 * 60 static inline const char *adifmode(const char *mode) { for (int i = 0; i < NUM_MODES; i++) { if (strcasecmp(mode_info[i].sname, mode) == 0) return (mode_info[i].adif_name); } return ""; } int cQsoDb::matched( cQsoRec *rec ) { bool match = false; bool test = false; int interval = 60 * 15; const char *callsign = rec->getField(CALL); const char *date = rec->getField(QSO_DATE); const char *time = rec->getField(TIME_ON); const char *mode = rec->getField(ADIF_MODE); const char *band = rec->getField(BAND); unsigned long qsodatetime, lotwdatetime = epoch_dt(date, time); int freq = (int)(atof(rec->getField(FREQ)) / 1000.0); int difftime; for (int i = 0; i < nbrrecs; i++) { // test CALL match = (strcasecmp(qsorec[i].getField(CALL), callsign) == 0); if (!match) continue; // test FREQ test = (freq == (int)(atof(qsorec[i].getField(FREQ)) / 1000.0)); // test BAND iff FREQ test fails if (!test) test = (strcasecmp(qsorec[i].getField(BAND), band) == 0); match = match && test; if (!match) continue; // test MODE test = (qsorec[i].getField(ADIF_MODE)[0] == 0 && mode[0] == 0) || (strcasestr(qsorec[i].getField(ADIF_MODE), mode) != 0); if (!test) test = (strcasecmp(mode, adifmode(qsorec[i].getField(ADIF_MODE))) == 0); if (!test) test = (strcasecmp(mode, "DATA") == 0); match = match && test; if (!match) continue; // test date/time (epoch) qsodatetime = epoch_dt ( qsorec[i].getField(QSO_DATE), qsorec[i].getField(TIME_ON)); difftime = (int)(lotwdatetime - qsodatetime); if (abs(difftime) < interval) test = true; else test = false; match = match && test; if (!match) continue; // found match // printf("%10s, %12s, %s, %s, %s\n%10s, %12s, %s, %s, %s\n", // rec->getField(CALL), rec->getField(FREQ), rec->getField(QSO_DATE), rec->getField(TIME_ON), rec->getField(ADIF_MODE), // qsorec[i].getField(CALL), qsorec[i].getField(FREQ), qsorec[i].getField(QSO_DATE), qsorec[i].getField(TIME_ON), qsorec[i].getField(ADIF_MODE) ); // printf("epoch test: %ud ~= %ud ==> %d\n", (uint)lotwdatetime, (uint)qsodatetime, difftime); return i; } return -1; } fldigi-4.1.06/src/logbook/table.cxx0000644000175000017500000012371413472115777014045 00000000000000/* Copyright (c) 2004 Markus Niemistö Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include "table.h" //#define DAMAGE_HEADER FL_DAMAGE_USER1 //#define DAMAGE_ROWS FL_DAMAGE_USER2 #define DAMAGE_HEADER FL_DAMAGE_ALL #define DAMAGE_ROWS FL_DAMAGE_ALL using namespace std; /* * ====================================== * void Table.drawHeader(int x, int y); * ====================================== * * Draws header buttons starting at (x, y). */ void Table::drawHeader(int x, int y) { int w; struct ColumnInfo col; fl_font(tbl_font, tbl_fontsize); /* * Draw all header cells that aren't clipped. */ for (int i = leftCol; i <= rightCol; i++) { col = header[i]; if (col.hidden) continue; // Draw box if (pushed != i) fl_draw_box(FL_THIN_UP_BOX, x, y, w = col.width, headerHeight, FL_GRAY); else fl_draw_box(FL_THIN_DOWN_BOX, x, y, w = col.width, headerHeight, FL_GRAY); fl_color(FL_FOREGROUND_COLOR); // Draw labels if (col.title != NULL) fl_draw(col.title, x + 2, y - 1, w - 2, headerHeight, col.hdr_align); x += w; // Draw "the sort arrow", if any. if (sortColumn == i) { int mod = headerHeight - 10; if (ascent) fl_polygon(x - mod - 6, y + 5, x - mod / 2 - 6, y + mod + 5, x - 6, y + 5); else fl_polygon(x - mod - 6, y + mod + 5, x - mod / 2 - 6, y + 5, x - 6, y + mod + 5); } } } /* * ============================================================= * void Table.drawRow(int row, char *rowData[], int x, int y); * ============================================================= * * Draws all items in the row. Starts drawing from (x, y). */ void Table::drawRow(int row, char *rowData[], int x, int y) { int w; ColumnInfo col; fl_font(tbl_font, tbl_fontsize); // Draw background box. if (row != selected) { Fl_Color bg; if (!withGrid && row % 2 == 0) // different bg for consecutive rows bg = color(); else { bg = fl_color_average(color(), FL_BLACK, .9); if (fl_contrast(bg, FL_BLACK) == FL_WHITE) // widget has very dark text bg bg = fl_color_average(color(), FL_WHITE, .9); } fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, bg); fl_color(FL_FOREGROUND_COLOR); } else { if (Fl::focus() == this) { fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, selection_color()); fl_color(FL_FOREGROUND_COLOR); // Draw focus fl_line_style(FL_DOT); fl_rect(iX, y, tableWidth - hScroll->value(), rowHeight); fl_line_style(FL_SOLID); } else fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, selection_color()); fl_color(fl_contrast(FL_FOREGROUND_COLOR, selection_color())); } // Get color from highlighter. Fl_Color color; if ((highlighter != NULL) && (highlighter(row, rowData, &color))) fl_color(color); const char *str; // Draw the data. for (int i = leftCol; i <= rightCol; i++) { w = (col = header[i]).width; if (col.hidden) continue; if (withGrid == true) { fl_color(FL_FOREGROUND_COLOR); fl_line_style(FL_SOLID); fl_rect(x,y,w,rowHeight); fl_color(FL_FOREGROUND_COLOR); } if ((str = rowData[i]) != NULL) fl_draw(str, x + 1, y - 1, w - 2, rowHeight + 1, col.align); x += w; } } /* * ======================================================= * Table.Table(int x, int y, int w, int h, char *label); * ======================================================= * * This is standard FLTK constructor. See FLTK documentation for * more information. */ Table::Table(int x, int y, int w, int h, char *label) : Fl_Group(x, y, w, h, label) { // Setup variables. align((Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); box(FL_THIN_DOWN_FRAME); color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); tbl_fontsize = 14; headerHeight = tbl_fontsize + 4; rowHeight = tbl_fontsize + 4; scrollbarSize = 16; // Create scrollbars. vScroll = new Fl_Scrollbar(x + w - scrollbarSize, y, scrollbarSize, h + scrollbarSize); vScroll->type(FL_VERTICAL); vScroll->linesize(3 * rowHeight); vScroll->callback(scrollCallback, (void*)this); vScroll->hide(); hScroll = new Fl_Scrollbar(x, y + h - scrollbarSize, w, scrollbarSize); hScroll->type(FL_HORIZONTAL); hScroll->callback(scrollCallback, (void*)this); hScroll->hide(); Fl_Group::end(); // Setup the rest of the variables to reasonable defaults. nCols = nRows = 0; cPos = 0; dragX = 0; resizing = -1; pushed = -1; curRow = NULL; highlighter = NULL; sortColumn = -1; selected = -1; canSort = true; canResize = true; ascent = false; noMoreColumns = false; dimensionsChanged = false; toBeSorted = false; headerEnabled = true; withGrid = false; popupMenu = NULL; menuAlloc = false; Vscroll = var; Hscroll = var; tbl_font = FL_HELVETICA; } /* * ================= * Table.~Table(); * ================= * * Destructor. */ Table::~Table() { delete vScroll; delete hScroll; menuClear(); clear(); } /* * ==================================== * bool Table.headerOn(); * void Table.headerOn(bool enabled); * ==================================== * * These methods get or set the value of variable controlling * whether header buttons are displayed. */ bool Table::headerOn() const { return headerEnabled; } void Table::headerOn(bool enabled) { headerEnabled = enabled; dimensionsChanged = true; redraw(); } /* * ==================================== * bool Table.gridEnabled(); * void Table.gridEnabled(bool enabled); * ==================================== * * These methods get or set the value of variable controlling * whether the table grid is displayed. */ bool Table::gridEnabled() const { return withGrid; } void Table::gridEnabled(bool enabled) { withGrid = enabled; dimensionsChanged = true; redraw(); } /* * ===================================== * bool Table.allowResize(); * void Table.allowResize(bool allow); * ===================================== * * These methods get or set the value of variable controlling * whether user may resize columns by dragging the column border. */ bool Table::allowResize() const { return canResize; } void Table::allowResize(bool allow) { canResize = allow; } /* * =================================== * bool Table.allowSort(); * void Table.allowSort(bool allow); * =================================== * * These methods get or set the value of variable controlling * whether user can determine how data on table is sorted by * clicking on the header buttons. */ bool Table::allowSort() const { return canSort; } void Table::allowSort(bool allow) { canSort = allow; } /* * ================================== * int Table.headerSize(); * void Table.headerSize(int size); * ================================== * * These methods get or set the value of variable controlling * the height of header buttons. */ int Table::headerSize() const { return headerHeight; } void Table::headerSize(int height) { headerHeight = height + 4; dimensionsChanged = true; redraw(); } /* * =============================== * int Table.rowSize(); * void Table.rowSize(int size); * =============================== * * These methods get or set the value of variable controlling * the height of rows. */ int Table::rowSize() const { return rowHeight; } void Table::rowSize(int height) { height += 4; rowHeight = height; vScroll->linesize(3 * height); dimensionsChanged = true; redraw(); } /* * =================================== * int Table.scrollbSize(); * void Table.scrollbSize(int size); * =================================== * * These methods get or set the value of variable controlling * the size (width) of the scrollbars. */ int Table::scrollbSize() const { return scrollbarSize; } void Table::scrollbSize(int size) { scrollbarSize = size; dimensionsChanged = true; redraw(); } /* * ===================================================== * Fl_Align Table.columnAlign(int column); * void Table.columnAlign(int column, Fl_Align align); * ===================================================== * * These methods get or set the value of variable controlling * the alignment of the specified column. */ Fl_Align Table::columnAlign(int column) const { if ((column < 0) && (column >= nCols)) return (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP); /* NOT REACHED */ return header[column].align; } void Table::columnAlign(int column, Fl_Align align) { if ((column < 0) || (column >= nCols)) return; /* NOT REACHED */ header[column].align = (Fl_Align)(align | FL_ALIGN_CLIP); redraw(); } Fl_Align Table::headerAlign(int column) const { if ((column < 0) && (column >= nCols)) return (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP); /* NOT REACHED */ return header[column].hdr_align; } void Table::headerAlign(int column, Fl_Align align) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].hdr_align = (Fl_Align)(align | FL_ALIGN_CLIP); redraw(); } /* * ===================================================== * int Table.columnWidth(int column); * void Table.columnWidth(int column, int width); * ===================================================== * * These methods get or set the value of variable controlling * the width of the specified column. */ int Table::columnWidth(int column) const { if ((column < 0) && (column >= nCols)) return 0; /* NOT REACHED */ return header[column].width; } void Table::columnWidth(int column, int width) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].width = width; dimensionsChanged = true; redraw(); } /* * ======================================================== * const char *Table.columnTitle(int column); * void Table.columnTitle(int column, const char *title); * ======================================================== * * These methods get or set the value of variable controlling * the width of the specified column. */ const char *Table::columnTitle(int column) { if ((column < 0) && (column >= nCols)) return NULL; /* NOT REACHED */ return header[column].title; } void Table::columnTitle(int column, const char *title) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ free((void*)header[column].title); header[column].title = strdup(title); damage(DAMAGE_HEADER); } /* * =================================================== * bool Table.columnHidden(int column); * void Table.columnHidden(int column, bool hidden); * =================================================== * * These methods get or set the value of variable controlling * whether column is visible or not. */ bool Table::columnHidden(int column) { if ((column < 0) && (column >= nCols)) return false; /* NOT REACHED */ return header[column].hidden; } void Table::columnHidden(int column, bool hidden) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].hidden = hidden; dimensionsChanged = true; damage(DAMAGE_HEADER | DAMAGE_ROWS); } /* * =================== * int Table.rows(); * =================== * * Returns the number of rows in table. */ int Table::rows() { return nRows; } /* * ====================== * int Table.columns(); * ====================== * * Returns the number of columns in table. */ int Table::columns() { return nCols; } /* * ================================== * void Table.value(int selection); * ================================== * * Sets the currently selected row. */ void Table::value(int selection) { if ((selection >= 0) && (selection < nRows)) selected = selection; damage(DAMAGE_ROWS); } /* * ==================== * int Table.value(); * ==================== * * Returns the number of the currently selected row. */ int Table::value() { return selected; } /* * ==================================================================== * void Table.addColumn(const char *label, int width, Fl_Align align, * int (*comparator)(const char*, const char*)); * ==================================================================== * * Adds column with label as title, width, align and comparator as * sort function. */ void Table::addColumn(const char *label, int width, Fl_Align align, int (*comparator)(const char*, const char*)) { if (!noMoreColumns) { struct ColumnInfo col; dimensionsChanged = true; col.title = strdup(label); col.width = width; col.hidden = false; col.align = (Fl_Align)(align | FL_ALIGN_CLIP); col.hdr_align = (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_CLIP); col.comparator = comparator; col.callback = NULL; header.push_back(col); nCols++; } } void Table::colcomparator(int col, int (*comparator)(const char*, const char*)) { header[col].comparator = comparator; } void Table::colcallback (int col, void (*callback)()) { header[col].callback = callback; } /* * ================================================ * void Table.addHiddenColumn(const char *label); * ================================================ * * Adds a nonvisible column with label as title. */ void Table::addHiddenColumn(const char *label) { if (!noMoreColumns) { struct ColumnInfo col; col.title = strdup(label); col.width = 0; col.hidden = true; col.align = FL_ALIGN_LEFT; col.comparator = NULL; header.push_back(col); nCols++; } } /* * ================================= * void Table.addCell(char *data); * ================================= * * Adds a cell with data to the table. */ void Table::addCell(char *data) { if (!noMoreColumns) noMoreColumns = true; if ((cPos >= nCols) || (curRow == NULL)) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if (data != NULL) curRow[cPos] = strdup(data); else curRow[cPos] = strdup(""); if (cPos == sortColumn) toBeSorted = true; cPos++; } /* * =================================== * void Table.addRow(int cols, ...); * =================================== * * Adds cols number of cells to table. */ void Table::addRow(int cols, ...) { char *temp; if (!noMoreColumns) noMoreColumns = true; if ((cPos != 0) || (curRow == NULL)) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if (cols > nCols) cols = nCols; va_list ap; va_start(ap, cols); for (int c = 0; c < cols; c++, cPos++) { if (cPos >= nCols) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if ((temp = va_arg(ap, char *)) != NULL) curRow[cPos] = strdup(temp); else curRow[cPos] = strdup(""); } va_end(ap); toBeSorted = true; dimensionsChanged = true; } /* * ================================ * void Table.removeRow(int row); * ================================ * * Removes row referenced by row. */ void Table::removeRow(int row) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows)) { char **rowData = data[row]; if (rowData == curRow) curRow = NULL; for (int i = 0; i < nCols; i++) free(rowData[i]); data.erase(row + data.begin()); nRows--; dimensionsChanged = true; toBeSorted = true; selected = -1; } redraw (); } /* * ======================================= * void Table.clear(bool removeColumns); * ======================================= * * Frees all data in table. If removeColumns is true, frees also header * structures. */ void Table::clear(bool removeColumns) { nRows = 0; curRow = NULL; cPos = 0; // Delete row data. vector::iterator end = data.end(); char **row; for (vector::iterator i = data.begin(); i < end; ++i) { row = *i; for (int i = 0; i < nCols; i++) free(row[i]); delete [] row; } data.clear(); if (removeColumns) { // Delete header data. vector::iterator end = header.end(); for (vector::iterator i = header.begin(); i < end; ++i) free((void*)(*i).title); header.clear(); nCols = 0; } selected = -1; dimensionsChanged = true; redraw (); } /* * ============================================ * char *Table.valueAt(int row, int column); * int Table.intValueAt(int row, int column); * ============================================ * * Returns value in cell referenced by row and column. */ char *Table::valueAt(int row, int column) { if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) return data[row][column]; else if ((row == -1) && (selected >= 0) && (column >= 0) && (column < nCols)) return data[selected][column]; else return NULL; } int Table::intValueAt(int row, int column) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) return strtol(data[row][column], NULL, 10); else return 0; } /* * ====================================================== * void Table.valueAt(int row, int column, char *data); * void Table.valueAt(int row, int column, int data); * ====================================================== * * Sets alue in cell referenced by row and column. */ void Table::valueAt(int row, int column, char *data) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) { if (column == sortColumn) toBeSorted = true; if (this->data[row][column] != NULL) free(this->data[row][column]); this->data[row][column] = strdup(data); } } void Table::valueAt(int row, int column, int data) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) { if (column == sortColumn) toBeSorted = true; if (this->data[row][column] != NULL) free(this->data[row][column]); string temp = ""; temp += data; strcpy(this->data[row][column] = (char*)malloc(temp.length()), temp.c_str()); } } /* * ===================================== * const char **Table.getRow(int row); * ===================================== * * Returns pointer to the data of the row number row. */ const char **Table::getRow(int row) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows)) return (const char**)data[row]; else return NULL; } /* * ============== * Menu methods * ============== * * These work in the same way as in class Fl_Menu_ (methods menu, * copy and clear). These are used for handling the popup menu. */ const Fl_Menu_Item *Table::menu() { return popupMenu; } void Table::menu(const Fl_Menu_Item *m) { menuClear(); popupMenu = m; } void Table::menuCopy(const Fl_Menu_Item *m) { int n = m->size(); Fl_Menu_Item* newMenu = new Fl_Menu_Item[n]; memcpy(newMenu, m, n * sizeof(Fl_Menu_Item)); menu(newMenu); menuAlloc = true; } void Table::menuClear() { if (menuAlloc) delete[] popupMenu; popupMenu = NULL; } /* * ================================================================ * Table.where(int x, int y, int &row, int &column, int &resize); * ================================================================ * * Finds corresponding row and column for x and y coordinates. This function * uses Fl::event_inside() method. * * row = -1 means header and row = -2 means that coordinates don't * correspond any cell. */ void Table::where(int x, int y, int &row, int &column, int &resize) { int temp, temp2; // Inside the header if ((nCols > 0) && headerEnabled && Fl::event_inside(oX, oY, iW, headerHeight)) { row = -1; temp = leftColX + iX - hScroll->value(); // Scan visible columns until found one that matches. for (column = leftCol; column <= rightCol; column++ ) { if (header[column].hidden) continue; temp2 = temp; // Near the left border of the column header if ((x >= temp) && (x <= temp + 3)) { resize = 1; return; /* NOT REACHED */ } // Near the right border of the column header else if ((x >= (temp += header[column].width) - 3) && (x < temp)) { resize = 2; return; /* NOT REACHED */ } // Somewhere else else if ((x >= temp2) && (x < temp)) { resize = 0; return; /* NOT REACHED */ } } } // Header /* * Now the harder one. X and Y lie somewhere in the table. * Find correct row and column. */ else if ((nRows > 0) && Fl::event_inside(iX, iY, iW, iH)) { temp = topRowY; int yMod = iY - vScroll->value(); int leftX = leftColX + iX - hScroll->value(); // Scan rows for (row = topRow; row <= bottomRow; row++) { int temp2 = leftX; for (column = leftCol; column <= rightCol; column++) { if (header[column].hidden) continue; if (Fl::event_inside(temp2, temp + yMod, header[column].width, rowHeight)) return; /* NOT REACHED */ temp2 += header[column].width; } temp += rowHeight; } } row = column = -2; } void Table::FirstRow() { if (nRows == 0 || selected == 0) return; scrollTo (selected = 0); } void Table::PrevPage () { // Does it make sense to move up? if (selected > 0) { // Number of rows on the 'page' int step = iH / rowHeight; // Change selection if (selected >= step) selected -= step; else selected = 0; scrollTo(selected * rowHeight); } } void Table::PrevRow() { int newpos, oldpos; if (nRows == 0) return; selected = (selected > 0) ? selected - 1 : 0; oldpos = vScroll->value(); newpos = rowHeight * selected; if (newpos - oldpos > 0) scrollTo (oldpos); else scrollTo (newpos); } void Table::NextRow() { int newpos, oldpos, lastrow; if (nRows == 0 || selected == (nRows - 1)) return; lastrow = nRows -1; selected = (selected < lastrow) ? selected + 1 : lastrow; oldpos = vScroll->value(); newpos = rowHeight *(selected + 1) - iH; if (newpos - oldpos < 0) scrollTo (oldpos); else scrollTo (newpos); } void Table::NextPage () { if ((selected >= 0) && (selected < (nRows - 1))) { int step = iH / rowHeight; if ((selected += step) >= nRows) selected = nRows - 1; scrollTo(rowHeight * (selected + 1) - iH); } } void Table::LastRow() { if (nRows == 0) return; selected = nRows - 1; scrollTo (rowHeight * (selected + 1) - iH); } void Table::GotoRow(int n) { if (n >= 0 && (n < nRows)) { selected = n; scrollTo(rowHeight * (selected + 1) - iH); } } /* * ============================== * int Table.handle(int event); * ============================== * * FLTK internal. Handles incoming events. */ int Table::handle(int event) { int ret = 0; static int row, prev_row; int column, resize; if (event != FL_KEYDOWN) ret = Fl_Group::handle(event); /* * MAIN SWITCH */ switch (event) { /* * PUSH event */ case FL_PUSH: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); switch (row) { // Push on nothing... Not interested case -2: if (selected != -1) { // selected = -1; damage(DAMAGE_ROWS); } break; // Push on header. case -1: if ((canResize) && (Fl::event_button() == 1) && (resize != 0)) { resizing = (resize == 1) ? column - 1 : column; dragX = Fl::event_x(); ret = 1; } else if ((canSort) && (Fl::event_button() == 1)) { pushed = column; damage(DAMAGE_HEADER); ret = 1; } break; // Push on cell. default: bool changed = selected != row; selected = row; // Create new selection int len = 0; char **tableRow = data[selected]; char *buffer; for (int col = 0; col < nCols; col++) len += strlen(tableRow[col]) + 1; // Create a tab separated list from data. buffer = (char*)malloc(len); strcpy(buffer, tableRow[0]); for (int col = 1; col < nCols; col++) { strcat(buffer, "\t"); strcat(buffer, tableRow[col]); } Fl::selection(*this, buffer, len); free(buffer); // Update view. damage(DAMAGE_ROWS); take_focus(); // Show popup menu if ((Fl::event_button() == 3) && (popupMenu != NULL)) { const Fl_Menu_Item *m; m = popupMenu->popup(Fl::event_x(), Fl::event_y()); if (m != NULL) m->do_callback(this, m->user_data()); ret = 1; break; } // Callback if ((Fl::event_clicks() != 0) && !changed && (when() & TABLE_WHEN_DCLICK)) { Fl::event_is_click(0); do_callback(); } else if (changed && (when() & FL_WHEN_CHANGED)) do_callback(); else if (!changed && (when() & FL_WHEN_NOT_CHANGED)) do_callback(); ret = 1; break; } // switch(row) break; /* * DRAG event */ case FL_DRAG: // Resizing... if (resizing > -1 ) { int offset = dragX - Fl::event_x(); int newWidth = header[resizing].width - offset; // Width must be at least 1. if (newWidth < 1) newWidth = 1; // Test if column really is resized. if (header[resizing].width != newWidth) { header[resizing].width = newWidth; dragX = Fl::event_x(); resized(); redraw(); } ret = 1; } else { prev_row = row; where(Fl::event_x(), Fl::event_y(), row, column, resize); if (row < 0 || pushed != -1) { ret = 1; break; } if (prev_row != row) { selected = row; damage(DAMAGE_ROWS); take_focus(); if (when() & FL_WHEN_CHANGED) do_callback(); } } break; /* * RELEASE event */ case FL_RELEASE: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); // Restore cursor and end resizing. if (Fl::event_button() == 1) { fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); if ((pushed == column) && canSort) { if (this->header[pushed].callback != NULL) (this->header[pushed].callback)(); if (this->header[pushed].comparator != NULL) { if (sortColumn == pushed) { if (ascent) ascent = false; else sortColumn = -1; } else { ascent = true; sortColumn = pushed; } sort(); } redraw(); } pushed = -1; resizing = -1; ret = 1; } // Callback. if ((row >= 0) && (when() & FL_WHEN_RELEASE)) do_callback(); break; /* * MOVE event */ case FL_MOVE: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); // If near header boundary. if ((row == -1) && canResize && resize) fl_cursor(FL_CURSOR_WE, FL_BLACK, FL_WHITE); else fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); ret = 1; break; case FL_ENTER: case FL_LEAVE: if (event == FL_LEAVE) fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); ret = 1; break; case FL_FOCUS: case FL_UNFOCUS: if (Fl::visible_focus()) { damage(DAMAGE_ROWS); ret = 1; } break; /* * KEYDOWN event */ case FL_KEYDOWN: switch(Fl::event_key()) { case FL_Enter: if ((selected > -1) && ((when() & TABLE_WHEN_DCLICK) || (when() & FL_WHEN_ENTER_KEY))) do_callback(); ret = 1; break; case FL_Home: FirstRow(); ret = 1; break; case FL_Up: PrevRow(); ret = 1; break; case FL_Down: NextRow(); ret = 1; break; case FL_End: LastRow(); ret = 1; break; case FL_Page_Up: PrevPage (); ret = 1; break; case FL_Page_Down: NextPage (); ret = 1; break; } break; } return ret; } /* * =============================== * void Table.scrollTo(int pos); * =============================== * * Scrolls table to given position. */ void Table::scrollTo(int pos) { if (vScroll->visible() || nRows > (iH / rowHeight)) { int max = rowHeight * nRows - iH; //printf ("pos %d, max %d\n", pos, max); fflush (stdout); if (pos < 0 || max < 0) pos = 0; if (pos > max) pos = max; vScroll->Fl_Valuator::value(1.0*pos); vScroll->damage (FL_DAMAGE_ALL); vScroll->redraw (); scrolled(); } damage(DAMAGE_ROWS); if (when() & FL_WHEN_CHANGED) do_callback(); } int Table::scrollPos() const { return (int)vScroll->value(); } /* * =========================================== * void Table.sort(int column, bool ascent); * =========================================== * * Sets sortColumn and ascent and sorts table. Does not redraw. */ void Table::sort(int column, bool ascent) { if ((column < -1) || (column >= nCols)) return; sortColumn = column; this->ascent = ascent; sort(); } void Table::aSort(int start, int end, int (*compare)(const char *, const char*)) { int i, j; const char *x; char **temp; x = data[(start + end) / 2][sortColumn]; i = start; j = end; for (;;) { while ((i < end) && (compare(data[i][sortColumn], x) < 0)) i++; while ((j > 0) && (compare(data[j][sortColumn], x) > 0)) j--; while ((i < end) && (i != j) && (compare(data[i][sortColumn], data[j][sortColumn]) == 0)) i++; if (i == j) break; temp = data[i]; data[i] = data[j]; data[j] = temp; } if (start < --i) aSort(start, i, compare); if (end > ++j) aSort(j, end, compare); } void Table::dSort(int start, int end, int (*compare)(const char *, const char*)) { int i, j; const char *x; char **temp; x = data[(start + end) / 2][sortColumn]; i = start; j = end; for (;;) { while ((i < end) && (compare(data[i][sortColumn], x) > 0)) i++; while ((j > 0) && (compare(data[j][sortColumn], x) < 0)) j--; while ((i < end) && (i != j) && (compare(data[i][sortColumn], data[j][sortColumn]) == 0)) i++; if (i == j) break; temp = data[i]; data[i] = data[j]; data[j] = temp; } if (start < --i) dSort(start, i, compare); if (end > ++j) dSort(j, end, compare); } /* * ==================== * void Table.sort(); * ==================== * * Sorts table according sortColumn and ascent. Does not redraw. */ void Table::sort() { if ((sortColumn == -1) || !canSort) return; /* NOT REACHED */ toBeSorted = false; int (*compare)(const char *, const char*); // Get comparator function or set it to the default. if (this->header[sortColumn].comparator == NULL) // compare = strcasecmp; return; else compare = header[sortColumn].comparator; // Sort in descending order. if ((nRows > 1) && ascent) aSort(0, nRows - 1, compare); // Sort in ascending order. else if (nRows > 1) dSort(0, nRows - 1, compare); } /* * ==================================================== * void Table.getSort(int &sortColumn, bool &ascent); * ==================================================== * * Set sortColumn and ascent according to current sort policy. */ void Table::getSort(int &sortColumn, bool &ascent) { sortColumn = this->sortColumn; ascent = this->ascent; } /* * ===================================================== * int compareInt(const char *val1, const char *val2); * ===================================================== * * This function compares values as numbers instead of strings. Solves * problem with string sorting (eg. 1 - 10 - 11 - 12 - 2 - 3 ...). */ int compareInt(const char *val1, const char *val2) { return strtol(val1, NULL, 0) - strtol(val2, NULL, 0); } /* * ============================================================================== * void Table.setHighlighter(bool (*highliter)(int, char **, Fl_Color &color)); * ============================================================================== * * Sets highlighter function to highlighter. Highlighter is used to determine * text color in Table.drawRow(). */ void Table::setHighlighter(bool (*highlighter)(int, char **, Fl_Color *)) { this->highlighter = highlighter; } /* * ==================== * void Table.draw(); * ==================== * * FLTK internal. Called when Table widget needs to be drawn. */ void Table::draw() { int damage; if (dimensionsChanged) { dimensionsChanged = false; resized(); } if (toBeSorted) sort(); damage = Fl_Widget::damage(); // Draw children. if (damage & (FL_DAMAGE_ALL | FL_DAMAGE_CHILD)) { fl_push_clip(oX, oY, oW, oH); Fl_Group::draw(); fl_pop_clip(); } // Draw box. if (damage & FL_DAMAGE_ALL) { // Draw box. draw_box(box(), x(), y(), w(), h(), FL_GRAY); // Draw label. draw_label(); } // Draw header. int xPos = leftColX + iX - hScroll->value(); if (headerEnabled && (damage & (FL_DAMAGE_ALL | DAMAGE_HEADER)) && (nCols > 0)) { fl_push_clip(iX, oY, iW, headerHeight); drawHeader(xPos, oY); fl_pop_clip(); } // Draw all the cells. if ((damage & (FL_DAMAGE_ALL | DAMAGE_ROWS)) && (nRows > 0) && (nCols > 0)) { fl_push_clip(iX, iY, iW, iH); int yMod = iY - vScroll->value(); for (int row = topRow, rowY = topRowY; row <= bottomRow; row++, rowY += rowHeight) drawRow(row, data[row], xPos, rowY + yMod); fl_pop_clip(); } fl_push_clip(oX, oY, oW, oH); if (tableWidth < iW) fl_rectf(iX + tableWidth, oY, iW - tableWidth, oH, FL_GRAY); // Table height smaller than window? Fill remainder with rectangle if (tableHeight < iH) fl_rectf(iX, iY + tableHeight, iW, iH - tableHeight, FL_GRAY); if (vScroll->visible()) { vScroll->damage (FL_DAMAGE_ALL); vScroll->redraw(); } if (hScroll->visible()) { hScroll->damage (FL_DAMAGE_ALL); hScroll->redraw(); } // Both scrollbars? Draw little box in lower right if (vScroll->visible() && hScroll->visible()) fl_rectf(vScroll->x(), hScroll->y(), vScroll->w(), hScroll->h(), FL_GRAY); fl_pop_clip(); } /* * ================================================ * void Table.resize(int x, int y, int w, int h); * ================================================ * * FLTK internal. Called when Table widget is resized. */ void Table::resize(int x, int y, int w2, int h) { // resize the columns proportionally if the width changes if (w2 != w()) { int iw = w() - (vScroll->visible() ? vScroll->w() : 0) - 4; int iw2 = w2 - (vScroll->visible() ? vScroll->w() : 0) - 4; if (iw > 0 && iw2 > 0) { int lastcol = 0; int iw3 = 0; for (int i = 0; i < nCols - 1; i++) { if (!header[i].hidden) { header[i].width = (int)(1.0 * header[i].width * iw2 / iw + 0.5); iw3 += header[i].width; lastcol = i; } } // adjust last visible column if (iw3 < iw2) header[lastcol].width += (iw2 - iw3); if (iw3 > iw2) header[lastcol].width -= (iw3 - iw2); } } Fl_Widget::resize(x, y, w2, h); resized(); damage(FL_DAMAGE_ALL); } /* * ============================== * void Table.calcDimensions(); * ============================== * * Calculates table dimensions. */ void Table::calcDimensions() { // Calculate width and height of the table (in pixels). tableWidth = 0; for (int i = 0; i < nCols; i++) if (!header[i].hidden) tableWidth +=header[i].width; tableHeight = nRows * rowHeight; Fl_Boxtype b; iX = oX = x() + Fl::box_dx(b = box()); iY = oY = y() + Fl::box_dy(b); iW = oW = w() - Fl::box_dw(b); iH = oH = h() - Fl::box_dh(b); // Trim inner size if header enabled. if (headerEnabled) { iY += headerHeight; iH -= headerHeight; } // Hide scrollbars if window is large enough int hideV, hideH; hideV = (tableHeight <= iH), hideH = (tableWidth <= iW); if (!hideH && hideV) hideV = (tableHeight - iH - scrollbarSize) <= 0; if (!hideV && hideH) hideH = (tableWidth - iW + scrollbarSize) <= 0; if (Vscroll == always) { vScroll->show(); iW -= scrollbarSize; } else if (Vscroll == never) { vScroll->hide(); vScroll->Fl_Valuator::value(0); } else if (hideV) { vScroll->hide(); vScroll->Fl_Valuator::value(0); } else { vScroll->show(); iW -= scrollbarSize; } if (Hscroll == always) { hScroll->show(); iH -= scrollbarSize; } else if (Hscroll == never) { hScroll->hide(); hScroll->Fl_Valuator::value(0); } else if (hideH) { hScroll->hide(); hScroll->Fl_Valuator::value(0); } else { hScroll->show(); iH -= scrollbarSize; } } /* * ======================== * void Table.scrolled(); * ======================== * * Calculates visible are after scroll or adding data. */ void Table::scrolled() { int y, row, voff = vScroll->value(); // First visible row row = voff / rowHeight; topRow = (row >= nRows) ? (nRows - 1) : row; topRow = (topRow < 0) ? 0 : topRow; y = topRow * rowHeight; if ((topRow > 0) && (y > voff)) { topRow--; y -= rowHeight; } topRowY = y; // Last visible row row = (voff + iH) / rowHeight; bottomRow = (row >= nRows) ? (nRows - 1) : row; // First visible column int x, col, h = hScroll->value(); for (col = x = 0; col < nCols; col++) { if (header[col].hidden) continue; x += header[col].width; if (x >= h) { x -= header[col].width; break; } } leftCol = (col >= nCols) ? (nCols - 1) : col; leftColX = x; // Last visible column h += iW; for (; col < nCols; col++) { if (header[col].hidden) continue; x += header[col].width; if (x >= h) break; } rightCol = (col >= nCols) ? (nCols - 1) : col; } /* * ======================= * void Table.resized(); * ======================= * * Calculates scrollbar properties after resizing or adding data. */ void Table::resized() { calcDimensions(); // Calculate properties for vertical scrollbar. if (vScroll->visible()) { vScroll->bounds(0, tableHeight - iH); vScroll->resize(oX + oW - scrollbarSize, oY, scrollbarSize, oH - (hScroll->visible() ? scrollbarSize : 0)); vScroll->Fl_Valuator::value(vScroll->clamp(vScroll->value())); vScroll->slider_size(iH > tableHeight ? 1 : (float)iH / tableHeight); } // Calculate properties for horizontal scrollbar. if (hScroll->visible()) { hScroll->bounds(0, tableWidth - iW); hScroll->resize(oX, oY + oH - scrollbarSize, oW - (vScroll->visible() ? scrollbarSize : 0), scrollbarSize); hScroll->Fl_Valuator::value(hScroll->clamp(hScroll->value())); hScroll->slider_size(iW > tableWidth ? 1 : (float)iW / tableWidth); } scrolled(); dimensionsChanged = false; } /* * =========================================================== * void Table.scrollCallback(Fl_Widget *widget, void *data); * =========================================================== * * Internal callback for scrollbars. Scrolls view. */ void Table::scrollCallback(Fl_Widget *widget, void *data) { Table *me = (Table*)data; me->scrolled(); if (widget == me->vScroll) me->damage(DAMAGE_ROWS); else me->damage(DAMAGE_ROWS | DAMAGE_HEADER); } #include "re.h" inline static bool search_row(const std::vector& data, int row, int col, int ncols, fre_t& re, bool allcols) { if (unlikely(allcols)) { for (col = 0; col < ncols; col++) if (re.match(data[row][col])) return true; } else if (re.match(data[row][col])) return true; return false; } /* * ================================================================== * void Table.search(int& row, int& col, bool rev, const char* re); * ================================================================== * * Searches Table data starting at `row', in direction indicated by `rev', * for column data matching regexp `re'. Looks in all row columns if `col' * is equal to nCols, or just the specified column if 0 <= col < nCols. * Returns true if found, in which case the `row' and `col' arguments will * point to the matching data. If false is returned, the contents of * `row' and `col' are undefined. */ bool Table::search(int& row, int& col, bool rev, const char* re) { if (unlikely(col < 0 || col > nCols || row < 0 || row >= nRows)) return false; bool allcols = col == nCols; fre_t sre(re, REG_EXTENDED | REG_ICASE | REG_NOSUB); if (!sre) return false; int r = row; if (rev) { for (; row >= 0; row--) if (search_row(data, row, col, nCols, sre, allcols)) return true; for (row = nRows - 1; row > r; row--) if (search_row(data, row, col, nCols, sre, allcols)) return true; } else { for (; row < nRows; row++) if (search_row(data, row, col, nCols, sre, allcols)) return true; for (row = 0; row < r; row++) if (search_row(data, row, col, nCols, sre, allcols)) return true; } return false; } fldigi-4.1.06/src/logbook/calendar.cxx0000664000175000017500000003062713507755043014524 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "pixmaps.h" #include "calendar.h" void popcal_cb (Fl_Widget *v, long d); static void fl_calendar_button_cb (Fl_Button *a, void *b) { long j=0; Fl_Calendar *c = (Fl_Calendar *)b; Fl_Button *sb; int numdays = c->daysinmonth () + 1; for (int i=1; i < numdays; i++) { sb = c->day_button(i); sb->color (52); if (a == sb) { c->Day (i); j = i; sb->color (sb->selection_color()); if (c->target) { ((Fl_Input2 *)(c->target))->value(c->szDate(c->calfmt)); (c->target)->redraw(); } } } c->redraw(); c->do_callback(c, j); } void Fl_Calendar_Base::setTarget (Fl_Widget *tgt) { target = tgt; } Fl_Calendar_Base::Fl_Calendar_Base (int x, int y, int w, int h, const char *l) : Fl_Group (x, y, w, h, l), Date () { int i; for (i = 0; i<(7*6); i++) { days[i] = new Fl_Button ((w/7)*(i%7) + x, (h/6)*(i/7) + y, (w/7), (h/6)); days[i]->down_box (FL_THIN_DOWN_BOX); days[i]->labelsize (10); days[i]->box (FL_THIN_UP_BOX); days[i]->color (52); days[i]->callback ((Fl_Callback*)&fl_calendar_button_cb, (void *)this); } calfmt = 0; } void Fl_Calendar_Base::csize (int cx, int cy, int cw, int ch) { int i; for (i = 0; i<(7*6); i++) { days[i]->resize ((cw/7)*(i%7) + cx, (ch/6)*(i/7) + cy, (cw/7), (ch/6)); } } void Fl_Calendar_Base::update () { int dow = dayofweek (Year(), Month(), 1); int dim = daysinmonth (Month(), isleapyear (Year())); int i; for (i=0; ihide (); } for (i=(dim+dow); i<(6*7); i++) { days[i]->hide (); } for (i=dow; i<(dim+dow); i++) { char t[12]; snprintf (t, sizeof(t), "%d", (i-dow+1)); days[i]->label (strdup(t)); days[i]->color (52); if ((i-dow+1) == Day()) days[i]->color (selection_color()); days[i]->show (); } } Fl_Button * Fl_Calendar_Base::day_button (int i) { if ((i > 0) && (i <= daysinmonth ())) return days[i + dayofweek (Year(), Month(), 1) - 1]; return 0; } static void fl_calendar_prv_month_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->previous_month (); c->do_callback(c, (long)0); } static void fl_calendar_nxt_month_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->next_month (); c->do_callback(c, (long)0); } static void fl_calendar_prv_year_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->previous_year (); c->do_callback(c, (long)0); } static void fl_calendar_nxt_year_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->next_year (); c->do_callback(c, (long)0); } Fl_Calendar::Fl_Calendar (int x, int y, int w, int h, const char *l) : Fl_Calendar_Base (x, y, w, h, l) { int i, bw; for (i = 0; i<7; i++) { // weekdays[i] = new Fl_Button ((w/7)*(i%7) + x, weekdays[i] = new Fl_Box ((w/7)*(i%7) + x, (h/8)*((i/7)+1) + y, (w/7), (h/8)); weekdays[i]->box (FL_THIN_UP_BOX); weekdays[i]->labelsize (10); weekdays[i]->color (52); } weekdays[SUNDAY]->label ("S"); weekdays[MONDAY]->label ("M"); weekdays[TUESDAY]->label ("T"); weekdays[WEDNESDAY]->label ("W"); weekdays[THURSDAY]->label ("T"); weekdays[FRIDAY]->label ("F"); weekdays[SATURDAY]->label ("S"); bw = w/10 < 16 ? 16 : w/10; prv_year = new Fl_Button (x, y, bw, (h/8), "@<<"); prv_year->box (FL_THIN_UP_BOX); prv_year->labeltype (FL_SYMBOL_LABEL); prv_year->labelsize (10); prv_year->down_box (FL_THIN_DOWN_BOX); prv_year->callback ((Fl_Callback*)&fl_calendar_prv_year_cb, (void *)this); prv_month = new Fl_Button (x + bw, y, bw, (h/8), "@<"); prv_month->box (FL_THIN_UP_BOX); prv_month->labeltype (FL_SYMBOL_LABEL); prv_month->labelsize (10); prv_month->down_box (FL_THIN_DOWN_BOX); prv_month->callback ((Fl_Callback*)&fl_calendar_prv_month_cb, (void *)this); nxt_month = new Fl_Button (x + w - 2*bw, y, bw, (h/8), "@>"); nxt_month->box (FL_THIN_UP_BOX); nxt_month->labeltype (FL_SYMBOL_LABEL); nxt_month->labelsize (10); nxt_month->down_box (FL_THIN_DOWN_BOX); nxt_month->callback ((Fl_Callback*)&fl_calendar_nxt_month_cb, (void *)this); nxt_year = new Fl_Button (x + w - bw, y, bw, (h/8), "@>>"); nxt_year->box (FL_THIN_UP_BOX); nxt_year->labeltype (FL_SYMBOL_LABEL); nxt_year->labelsize (10); nxt_year->down_box (FL_THIN_DOWN_BOX); nxt_year->callback ((Fl_Callback*)&fl_calendar_nxt_year_cb, (void *)this); // caption = new Fl_Button (x + (w/10)*2, y, (6*w/10), (h/8)); caption = new Fl_Box (x + 2*bw, y, w - 4*bw, (h/8)); caption->box (FL_THIN_UP_BOX); caption->labeltype (FL_SYMBOL_LABEL); caption->labelfont (1); if (bw < 20) caption->labelsize (9); else caption->labelsize (11); // caption->down_box (FL_THIN_DOWN_BOX); Fl_Calendar_Base::csize (x, y + (2*h/8), w, (6*h/8)); target = 0; update (); } void Fl_Calendar::csize (int cx, int cy, int cw, int ch) { int i; for (i = 0; i<7; i++) { // weekdays[i] = new Fl_Button ((cw/7)*(i%7) + cx, weekdays[i] = new Fl_Box ((cw/7)*(i%7) + cx, (ch/8)*((i/7)+1) + cy, (cw/7), (ch/8)); } prv_month->resize (cx + (cw/10), cy, (cw/10), (ch/8)); nxt_month->resize (cx + (cw/10)*8, cy, (cw/10), (ch/8)); prv_year->resize (cx, cy, (cw/10), (ch/8)); nxt_year->resize (cx + (cw/10)*9, cy, (cw/10), (ch/8)); caption->resize (cx + (cw/10)*2, cy, (cw/10)*6, (ch/8)); Fl_Calendar_Base::csize (cx, cy + (2*ch/8), cw, (6*ch/8)); } void Fl_Calendar::update () { int dow = dayofweek (Year(), Month(), 1); int dim = daysinmonth (Month(), isleapyear (Year())); int i; for (i=dow; i<(dim+dow); i++) { char t[12]; snprintf (t, sizeof(t), "%d", (i-dow+1)); days[i]->label (strdup(t)); } char tmp[32]; snprintf (tmp, sizeof(tmp), "%s %d", month_name[Month()-1], Year()); Fl_Calendar_Base::update (); if (caption->label ()) free ((void *) caption->label ()); caption->label (strdup(tmp)); redraw (); } void Fl_Calendar::today () { Date::today(); update (); } void Fl_Calendar::previous_month () { Date::previous_month(); update (); } void Fl_Calendar::next_month () { Date::next_month(); update (); } void Fl_Calendar::previous_year () { Date::previous_year(); update (); } void Fl_Calendar::next_year () { Date::next_year(); update (); } void Fl_Calendar::setDate(int m, int d, int y) { Date::setDate(m,d,y); } int Fl_Calendar::handle (int event) { int m, d, y, o, md; switch (event) { case FL_FOCUS: case FL_UNFOCUS: return 1; case FL_KEYBOARD: m = Month (); d = Day (); y = Year (); switch(Fl::event_key ()) { case FL_Enter: do_callback(this, d); return 1; break; case FL_Up: o = -7; break; case FL_Down: o = 7; break; case FL_Right: o = 1; break; case FL_Left: o = -1; break; case FL_Page_Up: previous_month (); return 1; case FL_Page_Down: next_month (); return 1; default: return Fl_Group::handle (event); } if (datevalid (y, m, d + o)) setDate (m, d + o, y); else { if (o < 0) { previous_month (); m = Month (); y = Year (); md = daysinmonth (m, isleapyear (y)); d = d + o + md; setDate (m, d, y); } else { md = daysinmonth (m, isleapyear (y)); next_month (); m = Month (); y = Year (); d = d + o - md; setDate (m, d, y); } } return 1; } return Fl_Group::handle (event); } // Popup Calendar class Fl_PopCal::Fl_PopCal (int X, int Y, int W, int H, Fl_Input2 * tgt) : Fl_Window (X, Y, W, H, "") { target = tgt; clear_border(); box(FL_UP_BOX); // popcal = new Fl_Calendar(2, 2); popcal = new Fl_Calendar(2, 2, W-4, H-4); popcal->callback ( (Fl_Callback*)popcal_cb); end(); } Fl_PopCal::~Fl_PopCal () { } void Fl_PopCal::popcalfmt (int i) { popcalfmt_ = i; } int Fl_PopCal::popcalfmt () { return popcalfmt_; } void Fl_PopCal::setDate (int m, int d, int y) { popcal->setDate (m,d,y); popcal->update(); } int Fl_PopCal::handle(int event) { int ex = Fl::event_x_root(), ey = Fl::event_y_root(); if (event == FL_PUSH) { if ( ex < x() || ex > (x() + w()) || ey < y() || ey > (y() + h()) ) { pophide(); return 1; } } if (Fl_Group::handle(event)) return 1; return 0; } void Fl_PopCal::popposition (int x, int y) { position (x, y); } void Fl_PopCal::popshow () { show (); Fl::grab(this); } void Fl_PopCal::pophide () { hide (); Fl::release(); } void Fl_PopCal::popcal_cb_i (Fl_Widget *v, long d) { int ey = Fl::event_y_root(); Fl_PopCal *me = (Fl_PopCal *)(v->parent()); Fl_Input2 *tgt = me->target; if (ey > me->y() + 40) { if (d && tgt) tgt->value (((Fl_Calendar *)v)->szDate (me->popcalfmt_)); me->pophide(); } return; } void popcal_cb (Fl_Widget *v, long d) { ((Fl_PopCal *)(v))->popcal_cb_i (v, d); return; } void Fl_DateInput::fl_popcal() { Fl_Widget *who = this, *parent; int xpos = who->x(), ypos = who->h() + who->y(); int w = who->w(), h; int m = 0, d = 0, y = 0; w = w < 140 ? 140 : w; w = w - (w % 7); h = 8*(w/7); w += 4; h += 4; parent = who; while (parent) { who = parent; parent = parent->parent(); if (parent == 0) { xpos += who->x(); ypos += who->y(); } } if (!Cal) // Cal = new Fl_PopCal(xpos, ypos, 7*20+4, 8*20+4, Input); Cal = new Fl_PopCal(xpos, ypos, w, h, Input); else Cal->popposition(xpos, ypos); if (popcalfmt_ < 3) { switch (popcalfmt_) { case 0: case 1: sscanf(Input->value(), "%d/%d/%d", &m, &d, &y); break; case 2: default: sscanf(Input->value(),"%4d%2d%2d", &y, &m, &d); break; } if (y < 10) y+=2000; if (y < 100) y+=1900; Cal->setDate (m,d,y); } Cal->popcalfmt (popcalfmt_); Cal->popshow(); return; } void btnDateInput_cb (Fl_Widget *v, void *d) { ((Fl_DateInput *)(v->parent()))->fl_popcal (); return; } Fl_DateInput::Fl_DateInput (int X,int Y,int W,int H, const char *L) : Fl_Group (X, Y, W, H, 0) { Btn = new Fl_Button (X + W - H, Y, H, H); (new Fl_Pixmap (time_icon))->label (Btn); Btn->callback ((Fl_Callback *)btnDateInput_cb, 0); Input = new Fl_Input2 (X, Y, W-H, H, L); popcalfmt_ = 0; Cal = 0; end(); } void Fl_DateInput::align (Fl_Align how) { Input->align(how); } // DateInput value is contained in the Input widget void Fl_DateInput::value( const char *s ) { Input->value (s); } const char *Fl_DateInput::value() { return (Input->value ()); } void Fl_DateInput::textfont(int tf) { Input->textfont (tf); } void Fl_DateInput::textsize(int sz) { Input->textsize (sz); } void Fl_DateInput::textcolor(Fl_Color c) { Input->textcolor(c); } void Fl_DateInput::color(Fl_Color c) { Input->color(c); } void Fl_DateInput::labelfont(int fnt) { Input->labelfont(fnt); } void Fl_DateInput::labelsize(int size) { Input->labelsize(size); } void Fl_DateInput::labelcolor(int clr) { Input->labelcolor(clr); } void Fl_DateInput::format (int fmt) { switch (fmt) { case 0: case 1: case 2: case 3: case 4: popcalfmt_ = fmt; break; default : popcalfmt_ = 0; } } void Fl_DateInput::take_focus() { Input->take_focus(); } fldigi-4.1.06/src/logbook/xmlrpc_log.cxx0000664000175000017500000003147713507402064015115 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "xmlrpcpp/XmlRpc.h" #include "config.h" #include "lgbook.h" #include "icons.h" #include "gettext.h" #include "debug.h" #include "util.h" #include "date.h" #include "logbook.h" #include "logger.h" #include "locator.h" #include "counties.h" #include "confdialog.h" #include "fl_digi.h" #include "adif_io.h" #include "modem.h" #include "trx.h" #include "status.h" #include "configuration.h" using namespace XmlRpc; XmlRpcClient *log_client = (XmlRpcClient *)0; bool test_connection(bool info = false) { if (!log_client) { create_logbook_dialogs(); return false; } XmlRpcValue query, result; if (log_client->execute("system.listMethods", query, result)) { if (info) { string res; int asize = result.size(); XmlRpcValue oneArg, help; res = "Xml-log methods:"; for (int i = 0; i < asize; i++) { oneArg[0] = result[i]; try { if (std::string(result[i]).find("system") == string::npos) { log_client->execute("system.methodHelp", oneArg, help); res.append("\n\t").append(help); } } catch ( XmlRpcException err) { res.append("\n").append(oneArg[0]).append(": ").append(err.getMessage()); } } LOG_INFO("%s", res.c_str()); } return true; } return false; } void activate_log_menus(bool val) { set_server_label(!val); activate_menu_item(_("View"), val); activate_menu_item(_("New"), val); activate_menu_item(_("Open..."), val); activate_menu_item(_("Save"), val); activate_menu_item(_("ADIF"), val); activate_menu_item(_("Reports"), val); } string get_field(string &adifline, int field) { string fld; fld.append("<").append(fields[field].name).append(":"); size_t pos1 = adifline.find(fld); if (pos1 == std::string::npos) return ""; pos1 = adifline.find(">", pos1) + 1; size_t pos2 = adifline.find("<", pos1); fld = adifline.substr(pos1, pos2 - pos1); return fld; } cQsoRec* search_fllog(const char *callsign) { cQsoRec *rec = new cQsoRec; XmlRpcValue oneArg, result; if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); return (cQsoRec *)0; } oneArg[0] = callsign; if (log_client->execute("log.get_record", oneArg, result)) { string adifline = std::string(result); rec->putField(NAME, get_field(adifline, NAME).c_str()); rec->putField(QTH, get_field(adifline, QTH).c_str()); rec->putField(QSO_DATE, get_field(adifline, QSO_DATE).c_str()); rec->putField(BAND, get_field(adifline, BAND).c_str()); rec->putField(ADIF_MODE, get_field(adifline, ADIF_MODE).c_str()); return rec; } return (cQsoRec *)0; } bool xml_get_record(const char *callsign) { XmlRpcValue oneArg, result; if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); return false; } oneArg[0] = callsign; if (log_client->execute("log.get_record", oneArg, result)) { string adifline = std::string(result); //std::cout << adifline << std::endl; inpName->value(get_field(adifline, NAME).c_str()); inpQth->value(get_field(adifline, QTH).c_str()); inpState->value(get_field(adifline, STATE).c_str()); inpVEprov->value(get_field(adifline, VE_PROV).c_str()); cboCountry->value(get_field(adifline, COUNTRY).c_str()); inpCounty->value(get_field(adifline, CNTY).c_str()); inpLoc->value(get_field(adifline, GRIDSQUARE).c_str()); inp_SS_SerialNoR->value(get_field(adifline, SS_SERNO).c_str()); inp_SS_Precedence->value(get_field(adifline, SS_PREC).c_str()); inp_SS_Check->value(get_field(adifline, SS_CHK).c_str()); inp_SS_Section->value(get_field(adifline, SS_SEC).c_str()); inp_KD_age->value(get_field(adifline, AGE).c_str()); inp_ARR_check->value(get_field(adifline, CHECK).c_str()); inp_1010_nr->value(get_field(adifline, TEN_TEN).c_str()); inp_JOTA_troop->value(get_field(adifline, TROOPR).c_str()); inp_JOTA_scout->value(get_field(adifline, SCOUTR).c_str()); inpNotes->value(get_field(adifline, NOTES).c_str()); } else { inpName->value(""); inpQth->value(""); inpState->value(""); inpVEprov->value(""); cboCountry->value(""); inpCounty->value(""); inpLoc->value(""); inp_SS_SerialNoR->value(""); inp_SS_Precedence->value(""); inp_SS_Check->value(""); inp_SS_Section->value(""); inp_KD_age->value(""); inp_ARR_check->value(""); inp_1010_nr->value(""); inp_JOTA_troop->value(""); inp_JOTA_scout->value(""); inpNotes->value(""); } if (inpLoc->value()[0]) { double lon1, lat1, lon2, lat2; double azimuth, distance; char szAZ[4]; if ( QRB::locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon2, &lat2, inpLoc->value()) == QRB::QRB_OK && QRB::qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == QRB::QRB_OK ) { snprintf(szAZ,sizeof(szAZ),"%0.f", azimuth); inpAZ->value(szAZ); } else inpAZ->value(""); } else inpAZ->value(""); return true; } static std::string adif; static std::string notes; #define adif_str(a, b) { \ std::ostringstream os; \ os << "<" << fields[(a)].name << ":" << strlen((b)) << ">" << (b); \ adif.append(os.str()); } void xml_add_record() { if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); AddRecord(); return; } // create the ADIF record char Mhz[30]; adif.erase(); adif_str(QSO_DATE, sDate_on.c_str()); adif_str(QSO_DATE_OFF, sDate_off.c_str()); adif_str(TIME_ON, sTime_on.c_str()); adif_str(TIME_OFF, sTime_off.c_str()); adif_str(CALL, inpCall->value()); { snprintf(Mhz, sizeof(Mhz), "%-f", atof(inpFreq->value()) / 1000.0); inpFreq_log->value(Mhz); adif_str(FREQ, Mhz); } adif_str(ADIF_MODE, mode_info[active_modem->get_mode()].adif_name); adif_str(RST_SENT, inpRstOut->value()); adif_str(RST_RCVD, inpRstIn->value()); adif_str(TX_PWR, progdefaults.mytxpower.c_str()); adif_str(NAME, inpName->value()); adif_str(QTH, inpQth->value()); adif_str(STATE, inpState->value()); adif_str(VE_PROV, inpVEprov->value()); adif_str(COUNTRY, cboCountry->value()); adif_str(CNTY, inpCounty->value()); adif_str(GRIDSQUARE, inpLoc->value()); adif_str(STX, outSerNo->value()); adif_str(SRX, inpSerNo->value()); adif_str(XCHG1, inpXchgIn->value()); adif_str(MYXCHG, progdefaults.myXchg.c_str()); adif_str(NOTES, inpNotes->value()); adif_str(CLASS, inpClass->value()); adif_str(ARRL_SECT, inpSection->value()); adif_str(CQZ, inp_CQzone->value()); // these fields will always be blank unless they are added to the main // QSO log area. // need to add the remaining fields adif_str(IOTA, ""); adif_str(DXCC, ""); adif_str(QSL_VIA, ""); adif_str(QSLRDATE, ""); adif_str(QSLSDATE, ""); // new contest fields adif_str(SS_SEC, inp_SS_Section->value()); adif_str(SS_SERNO, inp_SS_SerialNoR->value()); adif_str(SS_PREC, inp_SS_Precedence->value()); adif_str(SS_CHK, inp_SS_Check->value()); adif_str(AGE, inp_KD_age->value()); adif_str(TEN_TEN, inp_1010_nr->value()); adif_str(CHECK, inp_ARR_check->value()); adif_str(TROOPS, progdefaults.my_JOTA_troop.c_str()); adif_str(TROOPR, inp_JOTA_troop->value()); adif_str(SCOUTS, progdefaults.my_JOTA_scout.c_str()); adif_str(SCOUTR, inp_JOTA_scout->value()); adif_str(OP_CALL, progdefaults.operCall.c_str()); adif_str(STA_CALL, progdefaults.myCall.c_str()); adif_str(MY_CITY, std::string(progdefaults.myQth). append(", "). append(inp_QP_state_short->value()).c_str()); adif_str(MY_GRID, progdefaults.myLocator.c_str()); adif.append(""); // send it to the server XmlRpcValue oneArg, result; oneArg[0] = adif.c_str(); log_client->execute("log.add_record", oneArg, result); // submit it foreign log programs cQsoRec rec; rec.putField(CALL, inpCall->value()); rec.putField(NAME, inpName->value()); rec.putField(QSO_DATE, sDate_on.c_str()); rec.putField(QSO_DATE_OFF, sDate_off.c_str()); rec.putField(TIME_ON, inpTimeOn->value()); rec.putField(TIME_OFF, ztime()); rec.putField(FREQ, Mhz); rec.putField(ADIF_MODE, mode_info[active_modem->get_mode()].adif_name); rec.putField(QTH, inpQth->value()); rec.putField(STATE, inpState->value()); rec.putField(VE_PROV, inpVEprov->value()); rec.putField(COUNTRY, cboCountry->value()); rec.putField(CNTY, inpCounty->value()); rec.putField(GRIDSQUARE, inpLoc->value()); rec.putField(NOTES, inpNotes->value()); rec.putField(QSLRDATE, ""); rec.putField(QSLSDATE, ""); rec.putField(RST_RCVD, inpRstIn->value ()); rec.putField(RST_SENT, inpRstOut->value ()); rec.putField(SRX, inpSerNo->value()); rec.putField(STX, outSerNo->value()); rec.putField(XCHG1, inpXchgIn->value()); rec.putField(MYXCHG, progdefaults.myXchg.c_str()); rec.putField(CLASS, inpClass->value()); rec.putField(ARRL_SECT, inpSection->value()); rec.putField(CNTY, ""); rec.putField(IOTA, ""); rec.putField(DXCC, ""); rec.putField(CONT, ""); rec.putField(CQZ, ""); rec.putField(ITUZ, ""); rec.putField(TX_PWR, ""); // new contest fields rec.putField(SS_SEC, inp_SS_Section->value()); rec.putField(SS_SERNO, inp_SS_SerialNoR->value()); rec.putField(SS_PREC, inp_SS_Precedence->value()); rec.putField(SS_CHK, inp_SS_Check->value()); rec.putField(AGE, inp_KD_age->value()); rec.putField(TEN_TEN, inp_1010_nr->value()); rec.putField(CHECK, inp_ARR_check->value()); rec.putField(TROOPS, progdefaults.my_JOTA_troop.c_str()); rec.putField(TROOPR, inp_JOTA_troop->value()); rec.putField(SCOUTS, progdefaults.my_JOTA_scout.c_str()); rec.putField(SCOUTR, inp_JOTA_scout->value()); rec.putField(OP_CALL, progdefaults.operCall.c_str()); rec.putField(STA_CALL, progdefaults.myCall.c_str()); submit_record(rec); } int xml_check_dup() { int dup_test = 0; if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; progdefaults.changed = true; activate_log_menus(true); if (!dlgLogbook) create_logbook_dialogs(); start_logbook(); return dup_test; } XmlRpcValue six_args, result; six_args[0] = inpCall->value(); six_args[1] = progdefaults.dupmode ? mode_info[active_modem->get_mode()].adif_name : "0"; char tspn[10]; snprintf(tspn, sizeof(tspn), "%d", progdefaults.timespan); six_args[2] = progdefaults.duptimespan ? tspn : "0"; six_args[3] = progdefaults.dupband ? inpFreq->value() : "0"; six_args[4] = (progdefaults.dupstate && inpState->value()[0]) ? inpState->value() : "0"; six_args[5] = (progdefaults.dupxchg1 && inpXchgIn->value()[0]) ? inpXchgIn->value() : "0"; if (log_client->execute("log.check_dup", six_args, result)) { string res = std::string(result); if (res == "true") dup_test = 1; else if (res == "possible") dup_test = 2; } return dup_test; } void xml_update_eqsl() { adif.erase(); adif_str(EQSLSDATE, sDate_on.c_str()); adif.append(""); XmlRpcValue oneArg, result; oneArg[0] = adif.c_str(); LOG_INFO("%s", "xmlrpc log: update eqsl date"); log_client->execute("log.update_record", oneArg, result); } void xml_update_lotw() { adif.erase(); adif_str(LOTWSDATE, sDate_on.c_str()); adif.append(""); XmlRpcValue oneArg, result; oneArg[0] = adif.c_str(); LOG_INFO("%s", "xmlrpc log: update LoTW date"); log_client->execute("log.update_record", oneArg, result); } void connect_to_log_server(void *) { if (log_client) { delete log_client; log_client = 0; } LOG_INFO("%s","Create XMLRPC client"); log_client = new XmlRpcClient( progdefaults.xmllog_address.c_str(), atoi(progdefaults.xmllog_port.c_str())); LOG_INFO("%s","Created"); if (progdefaults.xml_logbook) { if (test_connection(true)) { LOG_INFO("%s","Close local logbook"); close_logbook(); if (dlgLogbook) dlgLogbook->hide(); activate_log_menus(false); } else { LOG_INFO("%s","Remote server not responding"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); LOG_INFO("%s","Use local logbook"); } } else { LOG_INFO("%s","Enable local logbook"); activate_log_menus(true); start_logbook(); } } fldigi-4.1.06/src/logbook/logsupport.cxx0000664000175000017500000017621413507402064015164 00000000000000// ---------------------------------------------------------------------------- // logsupport.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "main.h" #include "trx.h" #include "debug.h" #include "macros.h" #include "status.h" #include "date.h" #include "logger.h" #include "n3fjp_logger.h" #include "adif_io.h" #include "textio.h" #include "logbook.h" #include "rigsupport.h" #include "fd_logger.h" #include "fl_digi.h" #include "fileselect.h" #include "configuration.h" #include "main.h" #include "locator.h" #include "icons.h" #include "gettext.h" #include "qrunner.h" #include "flmisc.h" #include "network.h" #include "timeops.h" #include "strutil.h" #include #include #include #include #include #include using namespace std; extern vector lotw_recs_sent; cQsoDb qsodb; cAdifIO adifFile; cTextFile txtFile; string logbook_filename; enum sorttype {NONE, SORTCALL, SORTDATE, SORTFREQ, SORTMODE}; sorttype lastsort = SORTDATE; bool callfwd = true; bool modefwd = true; bool freqfwd = true; int editNbr = 0; void restore_sort(); void addBrowserRow(cQsoRec *, int); void adjustBrowser(bool keep_pos = false); // convert to and from "00:00:00" <=> "000000" const char *timeview(const char *s) { static char ds[9]; int len = strlen(s); strcpy(ds, "00:00:00"); if (len < 4) return ds; ds[0] = s[0]; ds[1] = s[1]; ds[3] = s[2]; ds[4] = s[3]; if (len < 6) return ds; ds[6] = s[4]; ds[7] = s[5]; return ds; } const char *timestring(const char *s) { static char ds[7]; int len = strlen(s); if (len <= 4) return s; ds[0] = s[0]; ds[1] = s[1]; ds[2] = s[3]; ds[3] = s[4]; if (len < 8) { ds[4] = ds[5] = '0'; ds[6] = 0; return ds; } ds[4] = s[6]; ds[5] = s[7]; ds[6] = 0; return ds; } const char *timeview4(const char *s) { static char ds[6]; int len = strlen(s); strcpy(ds, "00:00"); if (len < 5) return ds; ds[0] = s[0]; ds[1] = s[1]; ds[3] = s[2]; ds[4] = s[3]; return ds; } const char *time4(const char *s) { static char ds[5]; int len = strlen(s); if (len <= 4) return ds; memset(ds, 0, 5); strncpy(ds, s, 4); return ds; } void Export_CSV() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Export to CSV file"); string filters = "CSV\t*.csv"; #ifdef __APPLE__ filters.append("\n"); #endif const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "export.csv"); if (!p) return; if (!*p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; if (sp.find(".csv") == string::npos) sp.append(".csv"); txtFile.writeCSVFile(sp.c_str(), &qsodb); } void Export_TXT() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Export to fixed field text file"); string filters = "TEXT\t*.txt"; #ifdef __APPLE__ filters.append("\n"); #endif const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "export.txt"); if (!p) return; if (!*p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; if (sp.find(".txt") == string::npos) sp.append(".txt"); txtFile.writeTXTFile(p, &qsodb); } void Export_ADIF() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Export to ADIF file"); string filters; string defname; filters.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filters.append("\n"); #endif defname.assign("export.").append(ADIF_SUFFIX); const char* p = FSEL::saveas( title.c_str(), filters.c_str(), defname.c_str()); if (!p) return; if (!*p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; string temp = "."; temp.append(ADIF_SUFFIX); if (sp.find(temp) == string::npos) sp.append(temp); adifFile.writeFile (sp.c_str(), &qsodb); } // refresh_logbook_dialog ONLY called as an Fl::awake process // insures that logbook dialog LOTWSDATE field is updated by // FLTK UI thread. // called by Export_LOTW() and saveRecord() static string lotwsdate; void refresh_logbook_dialog(void *) { inpLOTWsentdate_log->value(lotwsdate.c_str()); inpLOTWsentdate_log->redraw(); } void Export_LOTW() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; if (str_lotw.empty()) str_lotw = "Fldigi LoTW upload file\n2.2.7\n\n"; string adifrec; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); rec->putField(LOTWSDATE, zdate()); qsodb.qsoUpdRec (i, rec); lotw_recs_sent.push_back(i); if (i == editNbr) { lotwsdate = rec->getField(LOTWSDATE); Fl::awake(refresh_logbook_dialog); } adifrec = lotw_rec(*rec); if (adifrec.empty()) { LOG_INFO("%s", "Invalid LOTW record"); } else str_lotw.append(adifrec); } } } Fl_Double_Window *lotw_review_dialog = 0; static Fl_Text_Buffer *buff = 0; static Fl_Text_Editor *disp = 0; static Fl_Button *lotw_close_review = 0; static Fl_Button *lotw_save_review = 0; static Fl_Button *lotw_clear_review = 0; void cb_lotw_close_review(Fl_Button *, void *) { lotw_review_dialog->hide(); delete lotw_review_dialog; lotw_review_dialog = 0; lotw_close_review = 0; buff = 0; disp = 0; } void cb_lotw_save_review(Fl_Button *, void *) { str_lotw = buff->text(); } void cb_lotw_clear_review(Fl_Button *, void *) { buff->text(""); } void cb_review_lotw() { if (str_lotw.empty()) return; if (!lotw_review_dialog) { lotw_review_dialog = new Fl_Double_Window(50,50, 640, 400, _("LoTW Review")); lotw_review_dialog->begin(); buff = new Fl_Text_Buffer(); disp = new Fl_Text_Editor(4, 4, 632, 364); disp->textfont(FL_SCREEN); disp->buffer(buff); // attach text buffer to display widget lotw_close_review = new Fl_Button(576, 372, 60, 24, _("Close")); lotw_close_review->callback((Fl_Callback *)cb_lotw_close_review); lotw_clear_review = new Fl_Button(4, 372, 60, 24, _("Clear")); lotw_clear_review->callback((Fl_Callback *)cb_lotw_clear_review); lotw_save_review = new Fl_Button(lotw_review_dialog->w()/2-30, 372, 60, 24, _("Save")); lotw_save_review->callback((Fl_Callback *)cb_lotw_save_review); lotw_review_dialog->end(); } buff->text(str_lotw.c_str()); lotw_review_dialog->show(); } void cb_send_lotw() { send_to_lotw(NULL); } static savetype export_to = ADIF; void Export_log() { if (export_to == LOTW) Export_LOTW(); else if (export_to == ADIF) Export_ADIF(); else if (export_to == CSV) Export_CSV(); else Export_TXT(); } void saveLogbook(bool force) { if (!force && !qsodb.isdirty()) return; if (!force && progdefaults.NagMe) if (!fl_choice2(_("Save changed Logbook?"), _("No"), _("Yes"), NULL)) return; qsodb.isdirty(0); restore_sort(); if (force) adifFile.writeLog (logbook_filename.c_str(), &qsodb, true); else adifFile.writeLog (logbook_filename.c_str(), &qsodb); } static void dxcc_entity_cache_clear(void); static void dxcc_entity_cache_add(cQsoRec* r); static void dxcc_entity_cache_rm(cQsoRec* r); static void dxcc_entity_cache_add(cQsoDb& db); void cb_mnuNewLogbook(Fl_Menu_* m, void* d){ saveLogbook(); string title = _("Create new logbook file"); string filter; filter.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filter.append("\n"); #endif logbook_filename = LogsDir; logbook_filename.append("newlog.").append(ADIF_SUFFIX); const char* p = FSEL::saveas( title.c_str(), filter.c_str(), logbook_filename.c_str()); if (!p) return; if (!*p) return; string temp = p; string suffix = "."; suffix.append(ADIF_SUFFIX); if (temp.find(suffix) == string::npos) temp.append(suffix); FILE *testopen = fl_fopen(temp.c_str(), "r"); if (testopen) { string warn = logbook_filename; int ans = fl_choice2( _("%s exists, overwrite?"), _("No"), _("Yes"), NULL, temp.c_str()); if (!ans) return; fclose(testopen); } progdefaults.logbookfilename = logbook_filename = temp; dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); progdefaults.changed = true; qsodb.deleteRecs(); dxcc_entity_cache_clear(); wBrowser->clear(); clearRecord(); qsodb.isdirty(1); saveLogbook(); } void adif_read_OK() { if (qsodb.nbrRecs() == 0) adifFile.writeFile(logbook_filename.c_str(), &qsodb); dxcc_entity_cache_clear(); dxcc_entity_cache_add(qsodb); restore_sort(); activateButtons(); loadBrowser(); } void cb_mnuOpenLogbook(Fl_Menu_* m, void* d) { string title = _("Open logbook file"); string filter; filter.assign("ADIF file\t*.{adi,adif}"); #ifdef __APPLE__ filter.append("\n"); #endif std::string deffilename = LogsDir; deffilename.append(fl_filename_name(logbook_filename.c_str())); const char* p = FSEL::select( title.c_str(), filter.c_str(), deffilename.c_str()); if (!p) return; if (!*p) return; saveLogbook(); qsodb.deleteRecs(); logbook_filename = p; progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; adifFile.readFile (logbook_filename.c_str(), &qsodb); dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); qsodb.isdirty(0); } void cb_mnuSaveLogbook(Fl_Menu_*m, void* d) { string title = _("Save logbook file"); string filter; filter.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filter.append("\n"); #endif std::string deffilename = LogsDir; deffilename.append(fl_filename_name(logbook_filename.c_str())); const char* p = FSEL::saveas( title.c_str(), filter.c_str(), deffilename.c_str()); if (!p) return; if (!*p) return; logbook_filename = p; string temp = "."; temp.append(ADIF_SUFFIX); if (logbook_filename.find(temp) == string::npos) logbook_filename.append(temp); progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); // cQsoDb::reverse = false; // qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } //====================================================================== // separate thread for performing the database merger // // thread 'merge_thread' is instantiated for a database file merger // either on failure or successful merger the thread signals the main // UI thread to close the merge_thread and release all of it's resources // // merge_thread is not re-entrant. Only a single instance of the thread // is allowed. // // the user will be notified if an attempt is made to start a new merger // while one is already in progress. // //====================================================================== pthread_t* MERGE_thread = 0; pthread_mutex_t MERGE_mutex = PTHREAD_MUTEX_INITIALIZER; static string mrg_fname; static string disptxt; static bool abort_merger; static int num_merge_recs; static float read_secs; static void merge_announce_1(void *) { static char announce[500]; snprintf(announce, sizeof(announce), "Merging records:\n File: %s\n", mrg_fname.c_str()); ReceiveText->addstr(announce); ReceiveText->redraw(); Fl::flush(); } static void merge_announce_2(void *) { static char announce[500]; snprintf(announce, sizeof(announce), " Read %d records in %4.1f seconds\n Merging ... please wait", num_merge_recs, read_secs ); ReceiveText->addstr(announce); ReceiveText->redraw(); Fl::flush(); } void close_MERGE_thread (void *) { ENSURE_THREAD(FLMAIN_TID); if (!MERGE_thread) return; pthread_mutex_lock(&MERGE_mutex); abort_merger = true; pthread_mutex_unlock(&MERGE_mutex); pthread_join(*MERGE_thread, NULL); delete MERGE_thread; MERGE_thread = 0; abort_merger = false; qsodb.isdirty(1); saveLogbook(true); // force the save independent of user settings loadBrowser(); ReceiveText->addstr(disptxt.c_str()); ReceiveText->redraw(); } // for testing only /* static char recfield[200]; static std::string adif_record(cQsoRec *rec) { static std::string record; static std::string sFld; record.clear(); for (int j = 0; fields[j].type != NUMFIELDS; j++) { if (strcmp(fields[j].name,"MYXCHG") == 0) continue; if (strcmp(fields[j].name,"XCHG1") == 0) continue; sFld = rec->getField(fields[j].type); if (!sFld.empty()) { snprintf(recfield, sizeof(recfield), "<%s:%d>", fields[j].name, sFld.length()); record.append(recfield).append(sFld); } } record.append("\n"); return record; } static void writeLog(std::string fname, cQsoDb *db) { FILE *adiFile = fl_fopen (fname.c_str(), "wb"); cQsoRec *rec; std::string records; records.clear(); for (int i = 0; i < db->nbrRecs(); i++) { rec = db->getRec(i); records.append(adif_record(rec)); } fprintf (adiFile, "%s\n\n", fl_filename_name(fname.c_str())); fprintf (adiFile, "%s", records.c_str()); fclose (adiFile); return; } */ static void *merge_thread(void *args) { SET_THREAD_ID(ADIF_MERGE_TID); static char msg1[200]; sorttype orig_sort = lastsort; int orig_reverse = cQsoDb::reverse; cQsoDb::reverse = false; cQsoDb *db = &qsodb; cQsoDb *mrgdb = new cQsoDb; cQsoDb *merge_dups = new cQsoDb; cQsoDb *orig_dups = new cQsoDb; cQsoDb *copy = new cQsoDb(db); string mergedir; string mrg_dups_name; string orig_dups_name; string lg_recs_name; string fname; size_t pname; cQsoRec *lastrec = 0; cQsoRec *rec_n; cQsoRec *rec_m; int N; int M; int n = 0; int m = 0; int cmp = 0; int cmp2 = 0; int merged = 0; int merge_duplicates = 0; int orig_duplicates = 0; struct timespec t0, t1, t2; float merger_time = 0; Fl::awake(merge_announce_1); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif adifFile.do_readfile (mrg_fname.c_str(), mrgdb); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif N = copy->nbrRecs(); M = mrgdb->nbrRecs(); if (M == 0) { disptxt.assign("\n================================================\n"); disptxt.append("Merge file contains no records\n"); disptxt.append("\n================================================"); LOG_INFO("%s", disptxt.c_str()); disptxt.append("\n"); goto exit_merge_thread; } read_secs = t1.tv_sec - t0.tv_sec + (t1.tv_nsec- t0.tv_nsec)/1e9; num_merge_recs = M; Fl::awake(merge_announce_2); disptxt.assign("\n================================================\n"); copy->SortByCall(); mrgdb->SortByCall(); for (int i = 0; i < M; i++) { mrgdb->getRec(i)->checkBand(); mrgdb->getRec(i)->checkDateTimes(); } //writeLog("copy.adi", copy); //writeLog("mrgdb.adi", mrgdb); db->clearDatabase(); for (;;) { pthread_mutex_lock(&MERGE_mutex); if (abort_merger) goto abort; pthread_mutex_unlock(&MERGE_mutex); rec_n = copy->getRec(n); rec_m = mrgdb->getRec(m); if (N == 0) { if (m == M) break; if (lastrec == 0) { db->qsoNewRec(lastrec = rec_m); merged++; } else { cmp = comparebycall(lastrec, rec_m); if (cmp != 0) { db->qsoNewRec(lastrec = rec_m); merged++; } else { merge_dups->qsoNewRec(rec_m); merge_duplicates++; } } m++; continue; } if (n == N) { if (m == M) break; cmp = comparebycall(lastrec, rec_m); if (cmp == 0) { merge_dups->qsoNewRec(rec_m); merge_duplicates++; } else { db->qsoNewRec(lastrec = rec_m); merged++; } m++; continue; } if (m == M) { if (n == N) break; cmp = comparebycall(lastrec, rec_n); if (cmp == 0) { orig_dups->qsoNewRec(rec_n); orig_duplicates++; } else { db->qsoNewRec(lastrec = rec_n); } n++; continue; } if (lastrec == 0) { cmp = comparebycall(rec_n, rec_m); if (cmp < 0) { db->qsoNewRec(lastrec = rec_n); n++; continue; } if (cmp == 0) { db->qsoNewRec(lastrec = rec_n); n++; merge_dups->qsoNewRec(rec_m); m++; merge_duplicates++; continue; } // cmp > 0 db->qsoNewRec(lastrec = rec_m); m++; } else { // lastrec exists cmp = comparebycall(rec_n, rec_m); if (cmp == 0) { merge_dups->qsoNewRec(rec_m); merge_duplicates++; m++; cmp2 = comparebycall(lastrec, rec_n); if (cmp2 == 0) { orig_dups->qsoNewRec(rec_n); orig_duplicates++; } else db->qsoNewRec(lastrec = rec_n); n++; continue; } if (cmp < 0) { cmp2 = comparebycall(lastrec, rec_n); if (cmp2 == 0) { orig_dups->qsoNewRec(rec_n); orig_duplicates++; } else db->qsoNewRec(lastrec = rec_n); n++; continue; } // cmp > 0 cmp2 = comparebycall(lastrec, rec_m); if (cmp2 == 0) { merge_dups->qsoNewRec(rec_m); merge_duplicates++; } else if (cmp2 < 0) { db->qsoNewRec(lastrec = rec_m); merged++; } m++; } } mergedir = logbook_filename; fname = fl_filename_name(mergedir.c_str()); pname = mergedir.find(fname); mergedir.erase(pname); if (db->nbrRecs()) db->SortByCall(); if (merged > 0) { snprintf(msg1, sizeof(msg1), "Merged %d records\n", merged); disptxt.append(msg1); } if (merge_duplicates) { merge_dups->SortByCall(); mrg_dups_name = mergedir; mrg_dups_name.append("merge_file_dups"); #ifdef __WIN32__ mrg_dups_name.append(".adi"); #else mrg_dups_name.append(".adif"); #endif adifFile.writeLog (mrg_dups_name.c_str(), merge_dups, true); snprintf(msg1, sizeof(msg1), "Found %d duplicate records\n", merge_duplicates); disptxt.append(msg1); snprintf(msg1, sizeof(msg1), "Duplicate's saved in %s\n", mrg_dups_name.c_str()); disptxt.append(msg1); } if (orig_duplicates) { orig_dups->SortByCall(); orig_dups_name = mergedir; orig_dups_name.append("original_file_dups"); #ifdef __WIN32__ orig_dups_name.append(".adi"); #else orig_dups_name.append(".adif"); #endif adifFile.writeLog (orig_dups_name.c_str(), orig_dups, true); snprintf(msg1,sizeof(msg1), "Original database had %d duplicates\n", orig_duplicates); disptxt.append(msg1); snprintf(msg1, sizeof(msg1), "Duplicate's saved in %s\n", orig_dups_name.c_str()); disptxt.append(msg1); } #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t2); #else clock_gettime(CLOCK_REALTIME, &t2); #endif merger_time = t2.tv_sec - t0.tv_sec + (t2.tv_nsec- t2.tv_nsec)/1e9; snprintf(msg1, sizeof(msg1), "Merger took %4.1f seconds\n", merger_time); disptxt.append(msg1); disptxt.append("================================================"); LOG_INFO("%s", disptxt.c_str()); disptxt.append("\n"); exit_merge_thread: delete mrgdb; delete orig_dups; delete merge_dups; delete copy; lastsort = orig_sort; cQsoDb::reverse = orig_reverse; Fl::awake(close_MERGE_thread); return NULL; abort: pthread_mutex_unlock(&MERGE_mutex); disptxt.assign("Merger aborted"); delete mrgdb; delete orig_dups; delete merge_dups; delete copy; lastsort = orig_sort; cQsoDb::reverse = orig_reverse; Fl::awake(close_MERGE_thread); return NULL; } static notify_dialog *alert_window = 0; void cb_mnuMergeADIF_log(Fl_Menu_* m, void* d) { ENSURE_THREAD(FLMAIN_TID); if (MERGE_thread) { if (!alert_window) alert_window = new notify_dialog; alert_window->notify(_("Database merger in progress"), 5.0); REQ(show_notifier, alert_window); return; } const char* p = FSEL::select( _("Merge ADIF file"), "ADIF\t*.{adi,adif}", LogsDir.c_str()); fl_digi_main->redraw(); Fl::flush(); if (!p) return; if (!*p) return; mrg_fname = p; abort_merger = false; MERGE_thread = new pthread_t; if (pthread_create(MERGE_thread, NULL, merge_thread, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } //====================================================================== static string lotw_download_name = ""; static cQsoDb *lotw_db = 0; extern Fl_Button *btn_view_unmatched; void verify_lotw(void *) { lotw_db = new cQsoDb; adifFile.do_readfile (lotw_download_name.c_str(), lotw_db); stringstream ss_note; if (lotw_db->nbrRecs() == 0) { LOG_INFO("%s", _("No records in lotw download file")); } else { string report_fname = LoTWDir; report_fname.append("unverified.txt"); ofstream report_file(report_fname.c_str()); int matchrec; cQsoRec *qrec, *lrec; int nverified = 0; int unverified = 0; string date; string qdate; for (int i = 0; i < lotw_db->nbrRecs(); i++) { lrec = lotw_db->getRec(i); date = lrec->getField(QSLRDATE); matchrec = qsodb.matched( lrec ); if (matchrec != -1) { qrec = qsodb.getRec(matchrec); qdate = qrec->getField(LOTWRDATE); if (date != qdate) { qrec->putField(STATE, lrec->getField(STATE)); qrec->putField(GRIDSQUARE, lrec->getField(GRIDSQUARE)); qrec->putField(CQZ, lrec->getField(CQZ)); qrec->putField(COUNTRY, lrec->getField(COUNTRY)); qrec->putField(CNTY, lrec->getField(CNTY)); qrec->putField(DXCC, lrec->getField(DXCC)); qrec->putField(DXCC, lrec->getField(DXCC)); qrec->putField(LOTWRDATE, lrec->getField(QSLRDATE)); } nverified++; } else { unverified++; report_file << lrec->getField(CALL) << ", " << lrec->getField(QSO_DATE) << ", " << lrec->getField(TIME_ON) << ", " << lrec->getField(FREQ) << ", " << lrec->getField(BAND) << ", " << lrec->getField(ADIF_MODE) << "\n"; } } report_file.close(); if (!unverified) remove(report_fname.c_str()); ss_note << "LoTW download contains " << lotw_db->nbrRecs() << " records\n\n" << nverified << " verified\n"; if (unverified) { ss_note << unverified << " unverified\n\n" << "Check file " << report_fname; btn_view_unmatched->activate(); if (nverified) qsodb.isdirty(1); LOG_INFO("%d records verified", nverified); LOG_INFO("%d records unverified", unverified); } if (!alert_window) alert_window = new notify_dialog; alert_window->notify(ss_note.str().c_str(), 15.0); REQ(show_notifier, alert_window); } delete lotw_db; } static Fl_Window *unmatched_viewer = (Fl_Window *)0; static Fl_Text_Display *viewer = (Fl_Text_Display *)0; static Fl_Text_Buffer *buffer = (Fl_Text_Buffer *)0; static Fl_Button *close_viewer = (Fl_Button *)0; void cb_close_viewer(Fl_Button *, void *) { if (unmatched_viewer) { unmatched_viewer->hide(); delete unmatched_viewer; unmatched_viewer = 0; } } void cb_btn_view_unmatched(Fl_Button *, void *) { btn_view_unmatched->deactivate(); if (!unmatched_viewer) { unmatched_viewer = new Fl_Window(100,100, 400, 500, _("Unmatched LoTW Records")); viewer = new Fl_Text_Display(5, 5, 390, 470, ""); buffer = new Fl_Text_Buffer(8192); viewer->buffer(buffer); viewer->textfont(progdefaults.LOGBOOKtextfont); viewer->textsize(progdefaults.LOGBOOKtextsize); close_viewer = new Fl_Button(320, 477, 75, 20, _("Close")); close_viewer->callback((Fl_Callback *)cb_close_viewer); unmatched_viewer->end(); unmatched_viewer->resizable(viewer); } string report_fname = LoTWDir; report_fname.append("unverified.txt"); ifstream report_file(report_fname.c_str()); if (report_file) { char linebuff[1025]; viewer->buffer()->text(""); while (!report_file.eof()) { report_file.getline(linebuff, 1024); strcat(linebuff, "\n"); viewer->insert(linebuff); } report_file.close(); unmatched_viewer->show(); } } void cb_btn_verify_lotw(Fl_Button *, void *) { string deffname = LoTWDir; deffname.append("lotwreport.adi"); ifstream f(deffname.c_str()); // const char* p = FSEL::select(_("LoTW download file"), "ADIF\t*.{adi,adif}", deffname.c_str()); // if (!p || !*p) { if (!f) { std::string alert = _("\ Could not find LoTW report file.\n\n\ Download from ARRL's LoTW page after logging in at:\n\n\ https://lotw.arrl.org/lotwuser/default\n\n\ Store the report file to the fldigi LOTW folder,\n\n\ naming the file 'lotwreport.adi'"); if (!alert_window) alert_window = new notify_dialog; alert_window->notify(alert.c_str(), 20); REQ(show_notifier, alert_window); return; } // lotw_download_name = p; f.close(); lotw_download_name = deffname; Fl::awake(verify_lotw); } void cb_export_date_select() { if (qsodb.nbrRecs() == 0) return; int start = atoi(inp_export_start_date->value()); int stop = atoi(inp_export_stop_date->value()); chkExportBrowser->check_none(); if (!start || !stop) return; int chkdate; if (!btn_export_by_date->value()) return; cQsoRec *rec; for (int i = 0; i < qsodb.nbrRecs(); i++) { rec = qsodb.getRec (i); chkdate = atoi(rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE)); if (chkdate >= start && chkdate <= stop) chkExportBrowser->checked(i+1, 1); } chkExportBrowser->redraw(); } inline const char *szfreq(const char *freq) { static char szf[11]; float f = atof(freq); snprintf(szf, sizeof(szf), "%10.6f", f); return szf; } void cb_Export_log() { if (qsodb.nbrRecs() == 0) return; cQsoRec *rec; char line[80]; chkExportBrowser->clear(); #ifdef __APPLE__ chkExportBrowser->textfont(FL_SCREEN_BOLD); chkExportBrowser->textsize(12); #else chkExportBrowser->textfont(FL_COURIER); chkExportBrowser->textsize(12); #endif for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); snprintf(line,sizeof(line),"%8s %4s %-10s %-10s %-s %-s", rec->getField(QSO_DATE), rec->getField((export_to == LOTW ? TIME_ON : TIME_OFF) ), rec->getField(CALL), szfreq(rec->getField(FREQ)), adif2export(rec->getField(ADIF_MODE)).c_str(), adif2submode(rec->getField(ADIF_MODE)).c_str() ); chkExportBrowser->add(line); } cb_export_date_select(); wExport->show(); } void cb_mnuExportADIF_log(Fl_Menu_* m, void* d) { export_to = ADIF; cb_Export_log(); } void cb_mnuExportCSV_log(Fl_Menu_* m, void* d) { export_to = CSV; cb_Export_log(); } void cb_btnExportLoTW() { export_to = LOTW; cb_Export_log(); } void cb_mnuExportTEXT_log(Fl_Menu_* m, void *d) { export_to = TEXT; cb_Export_log(); } void cb_mnuShowLogbook(Fl_Menu_* m, void* d) { dlgLogbook->resize( progStatus.logbook_x, progStatus.logbook_y, progStatus.logbook_w, progStatus.logbook_h); dlgLogbook->show(); } enum State {VIEWREC, NEWREC}; static State logState = VIEWREC; void activateButtons() { if (logState == NEWREC) { bNewSave->label(_("Save")); bUpdateCancel->label(_("Cancel")); bUpdateCancel->activate(); bDelete->deactivate (); bSearchNext->deactivate (); bSearchPrev->deactivate (); inpDate_log->take_focus(); return; } bNewSave->label(_("New")); bUpdateCancel->label(_("Update")); if (qsodb.nbrRecs() > 0) { bDelete->activate(); bUpdateCancel->activate(); bSearchNext->activate (); bSearchPrev->activate (); wBrowser->take_focus(); } else { bDelete->deactivate(); bUpdateCancel->deactivate(); bSearchNext->deactivate(); bSearchPrev->deactivate(); } } void cb_btnNewSave(Fl_Button* b, void* d) { if (logState == VIEWREC) { logState = NEWREC; clearRecord(); activateButtons(); } else { saveRecord(); qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); logState = VIEWREC; activateButtons(); } } void cb_btnUpdateCancel(Fl_Button* b, void* d) { if (logState == NEWREC) { logState = VIEWREC; activateButtons (); } else { updateRecord(); wBrowser->take_focus(); } } void cb_btnDelete(Fl_Button* b, void* d) { deleteRecord(); wBrowser->take_focus(); } void restore_sort() { switch (lastsort) { case SORTCALL : cQsoDb::reverse = callfwd; qsodb.SortByCall(); break; case SORTDATE : cQsoDb::reverse = progStatus.logbook_reverse; qsodb.SortByDate(progdefaults.sort_date_time_off); break; case SORTFREQ : cQsoDb::reverse = freqfwd; qsodb.SortByFreq(); break; case SORTMODE : cQsoDb::reverse = modefwd; qsodb.SortByMode(); break; default: break; } } void cb_SortByCall (void) { if (lastsort == SORTCALL) callfwd = !callfwd; else { callfwd = false; lastsort = SORTCALL; } cQsoDb::reverse = callfwd; qsodb.SortByCall(); loadBrowser(); } void cb_SortByDate (void) { if (lastsort == SORTDATE) progStatus.logbook_reverse = !progStatus.logbook_reverse; else { lastsort = SORTDATE; } cQsoDb::reverse = progStatus.logbook_reverse; qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } void reload_browser() { qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } void cb_SortByMode (void) { if (lastsort == SORTMODE) modefwd = !modefwd; else { modefwd = false; lastsort = SORTMODE; } cQsoDb::reverse = modefwd; qsodb.SortByMode(); loadBrowser(); } void cb_SortByFreq (void) { if (lastsort == SORTFREQ) freqfwd = !freqfwd; else { freqfwd = false; lastsort = SORTFREQ; } cQsoDb::reverse = freqfwd; qsodb.SortByFreq(); loadBrowser(); } void show_dup(void *dup) { int cdup = 0; if (dup == (void *)1) cdup = 1; if (dup == (void *)2) cdup = 2; Fl_Color call_clr = progdefaults.LOGGINGcolor; Fl_Color dup_clr = fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); Fl_Color pdup_clr = fl_rgb_color( progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B); inpCall1->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall2->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall3->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall4->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall1->redraw(); inpCall2->redraw(); inpCall3->redraw(); inpCall4->redraw(); } void DupCheck() { size_t dup = 0; if (n3fjp_connected) { show_dup(0); n3fjp_dupcheck(); return; } if ( FD_logged_on && strlen(inpCall->value()) > 2) dup = FD_dupcheck(); else if ( progdefaults.xml_logbook) dup = xml_check_dup(); else { // check for call only for possible dup returns 2 if possible dup = qsodb.duplicate(inpCall->value()); if (dup && qsodb.duplicate( inpCall->value(), zdate(), ztime(), progdefaults.timespan, progdefaults.duptimespan, inpFreq->value(), progdefaults.dupband, inpState->value(), progdefaults.dupstate, mode_info[active_modem->get_mode()].adif_name, progdefaults.dupmode, inpXchgIn->value(), progdefaults.dupxchg1 ) ) dup = 1; } show_dup((void*)dup); } cQsoRec* SearchLog(const char *callsign) { if (progdefaults.xml_logbook) return search_fllog(callsign); size_t len = strlen(callsign); char* re = new char[len + 3]; snprintf(re, len + 3, "^%s$", callsign); int row = 0, col = 2; return wBrowser->search(row, col, !cQsoDb::reverse, re) ? qsodb.getRec(row) : 0; } void SearchLastQSO(const char *callsign) { if (n3fjp_connected) { n3fjp_get_record(callsign); return; } size_t len = strlen(callsign); if (len < 3) return; if (progdefaults.xml_logbook) { if(xml_get_record(callsign)) return; } Fl::focus(inpCall); char* re = new char[len + 3]; snprintf(re, len + 3, "^%s$", callsign); int row = 0, col = 2; if (wBrowser->search(row, col, !cQsoDb::reverse, re)) { wBrowser->GotoRow(row); inpName->value(inpName_log->value()); inpQTH->value(inpQth_log->value()); inpLoc1->value(inpLoc_log->value()); inpLoc1->position (0); // inpLoc2->value(inpLoc_log->value()); // inpLoc2->position (0); inpState->value(inpState_log->value()); inpState->position (0); inpVEprov->value(inpVE_Prov_log->value ()); inpVEprov->position (0); inpCounty->value(inpCNTY_log->value ()); inpCounty->position (0); cboCountry->value(inpCountry_log->value ()); inpSearchString->value(callsign); if (inpLoc->value()[0]) { double lon1, lat1, lon2, lat2; double azimuth, distance; char szAZ[4]; if ( QRB::locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon2, &lat2, inpLoc->value()) == QRB::QRB_OK && QRB::qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == QRB::QRB_OK ) { snprintf(szAZ,sizeof(szAZ),"%0.f", azimuth); inpAZ->value(szAZ); inpAZ->position (0); } else inpAZ->value(""); } else inpAZ->value(""); } else { clear_log_fields(); } delete [] re; } void cb_search(Fl_Widget* w, void*) { const char* str = inpSearchString->value(); if (!*str) return; bool rev = w == bSearchPrev; int col = 2, row = wBrowser->value() + (rev ? -1 : 1); row = WCLAMP(row, 0, wBrowser->rows() - 1); if (wBrowser->search(row, col, rev, str)) wBrowser->GotoRow(row); wBrowser->take_focus(); } int log_search_handler(int) { if (!(Fl::event_state() & FL_CTRL)) return 0; switch (Fl::event_key()) { case 's': bSearchNext->do_callback(); break; case 'r': bSearchPrev->do_callback(); break; default: return 0; } return 1; } void cb_btnRetrieve(Fl_Button* b, void* d) { double drf = atof(inpFreq_log->value()); if (!drf) return; int rf1, rf, audio; rf1 = drf * 1e6; rf = rf1 / 10000; rf *= 10000; audio = rf1 - rf; // try to keep within normal xcvr bw, 500 - 3000 Hz while (audio > 3000) { audio -= 3000; rf += 3000; } if (audio < 500) { audio += 500; rf -= 500; } qsy(rf, audio); std::string mode_name = inpMode_log->value(); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (mode_name == mode_info[m].adif_name) break; // do we have a valid modem? if (m < NUM_MODES && active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); const cQsoRec *qsoPtr = qsodb.getRec(editNbr); inpCall->value(qsoPtr->getField(CALL)); inpName->value (qsoPtr->getField(NAME)); sDate_on = sDate_off = zdate(); sTime_on = sTime_off = ztime(); inpTimeOn->value(inpTimeOff->value()); inpTimeOn1->value(inpTimeOff->value()); inpTimeOn2->value(inpTimeOff->value()); inpTimeOn3->value(inpTimeOff->value()); inpTimeOn4->value(inpTimeOff->value()); inpTimeOn5->value(inpTimeOff->value()); inpState->value (qsoPtr->getField(STATE)); inpState->position (0); inpCounty->value (qsoPtr->getField(CNTY)); inpCounty->position (0); cboCountry->value (qsoPtr->getField(COUNTRY)); inpXchgIn->value(qsoPtr->getField(XCHG1)); inpQTH->value (qsoPtr->getField(QTH)); inpLoc1->value (qsoPtr->getField(GRIDSQUARE)); inpLoc1->position (0); // inpLoc2->value (qsoPtr->getField(GRIDSQUARE)); // inpLoc2->position (0); inpNotes->value (qsoPtr->getField(NOTES)); wBrowser->take_focus(); if (n3fjp_connected) n3fjp_get_record(inpCall->value()); } void clearRecord() { Date tdy; inpCall_log->value (""); inpName_log->value (""); inpDate_log->value (tdy.szDate(2)); inpDateOff_log->value (tdy.szDate(2)); inpTimeOn_log->value (""); inpTimeOff_log->value (""); inpRstR_log->value (""); inpRstS_log->value (""); inpFreq_log->value (""); inpBand_log->value (""); inpMode_log->value (""); inpQth_log->value (""); inpState_log->value (""); inpVE_Prov_log->value (""); inpCountry_log->value (""); inpLoc_log->value (""); inpQSLrcvddate_log->value (""); inpQSLsentdate_log->value (""); inpEQSLrcvddate_log->value (""); inpEQSLsentdate_log->value (""); inpLOTWrcvddate_log->value (""); inpLOTWsentdate_log->value (""); inpSerNoOut_log->value (""); inpSerNoIn_log->value (""); inpXchgIn_log->value(""); inpMyXchg_log->value(progdefaults.myXchg.c_str()); inpNotes_log->value (""); inpIOTA_log->value(""); inpDXCC_log->value(""); inpQSL_VIA_log->value(""); inpCONT_log->value(""); inpCNTY_log->value(""); inpCQZ_log->value(""); inpITUZ_log->value(""); inpTX_pwr_log->value(""); inpSearchString->value (""); inp_log_sta_call->value(""); inp_log_op_call->value(""); inp_log_sta_qth->value(""); inp_log_sta_loc->value(""); inp_log_cwss_serno->value(""); inp_log_cwss_prec->value(""); inp_log_cwss_chk->value(""); inp_log_cwss_sec->value(""); } void saveRecord() { cQsoRec rec; rec.putField(CALL, inpCall_log->value()); rec.putField(NAME, inpName_log->value()); rec.putField(QSO_DATE, inpDate_log->value()); rec.putField(QSO_DATE_OFF, inpDateOff_log->value()); string tm = timestring(inpTimeOn_log->value()); rec.putField(TIME_ON, tm.c_str()); inpTimeOn_log->value(timeview(tm.c_str())); tm = timestring(inpTimeOff_log->value()); rec.putField(TIME_OFF, tm.c_str()); inpTimeOff_log->value(timeview(tm.c_str())); rec.putField(FREQ, inpFreq_log->value()); rec.putField(BAND, inpBand_log->value()); rec.putField(ADIF_MODE, inpMode_log->value()); rec.putField(QTH, inpQth_log->value()); rec.putField(STATE, inpState_log->value()); rec.putField(VE_PROV, inpVE_Prov_log->value()); rec.putField(COUNTRY, inpCountry_log->value()); rec.putField(GRIDSQUARE, inpLoc_log->value()); rec.putField(NOTES, inpNotes_log->value()); rec.putField(QSLRDATE, inpQSLrcvddate_log->value()); rec.putField(QSLSDATE, inpQSLsentdate_log->value()); rec.putField(EQSLRDATE, inpEQSLrcvddate_log->value()); rec.putField(EQSLSDATE, inpEQSLsentdate_log->value()); rec.putField(LOTWRDATE, inpLOTWrcvddate_log->value()); if (progdefaults.submit_lotw) { lotwsdate = zdate(); rec.putField(LOTWSDATE, lotwsdate.c_str()); Fl::awake(refresh_logbook_dialog); } else rec.putField(LOTWSDATE, inpLOTWsentdate_log->value()); rec.putField(RST_RCVD, inpRstR_log->value ()); rec.putField(RST_SENT, inpRstS_log->value ()); rec.putField(SRX, inpSerNoIn_log->value()); rec.putField(STX, inpSerNoOut_log->value()); if (inpSPCnum->value()[0]) { inpXchgIn_log->value(inpSPCnum->value()); rec.putField(XCHG1, inpSPCnum->value()); } else if (inpSQSO_category->value()[0]) { inpXchgIn_log->value(inpSQSO_category->value()); rec.putField(XCHG1, inpSQSO_category->value()); } else rec.putField(XCHG1, inpXchgIn_log->value()); rec.putField(CLASS, inpClass_log->value()); rec.putField(ARRL_SECT, inpSection_log->value()); if (!qso_exchange.empty()) { rec.putField(MYXCHG, qso_exchange.c_str()); qso_exchange.clear(); qso_time.clear(); } else if (!qso_time.empty()) { string myexch = inpMyXchg_log->value(); myexch.append(" ").append(qso_time); rec.putField(MYXCHG, myexch.c_str()); qso_time.clear(); } else { rec.putField(MYXCHG, inpMyXchg_log->value()); } rec.putField(CNTY, inpCNTY_log->value()); rec.putField(IOTA, inpIOTA_log->value()); rec.putField(DXCC, inpDXCC_log->value()); rec.putField(DXCC, inpQSL_VIA_log->value()); rec.putField(CONT, inpCONT_log->value()); rec.putField(CQZ, inpCQZ_log->value()); rec.putField(ITUZ, inpITUZ_log->value()); rec.putField(TX_PWR, inpTX_pwr_log->value()); rec.putField(STA_CALL, inp_log_sta_call->value()); rec.putField(OP_CALL, inp_log_op_call->value()); rec.putField(MY_CITY, inp_log_sta_qth->value()); rec.putField(MY_GRID, inp_log_sta_loc->value()); rec.putField(SS_SERNO, inp_log_cwss_serno->value()); rec.putField(SS_PREC, inp_log_cwss_prec->value()); rec.putField(SS_CHK, inp_log_cwss_chk->value()); rec.putField(SS_SEC, inp_log_cwss_sec->value()); rec.putField(AGE, inp_age_log->value()); rec.putField(TEN_TEN, inp_1010_log->value()); rec.putField(CHECK, inp_check_log->value()); rec.putField(TROOPS, inp_log_troop_s->value()); rec.putField(TROOPR, inp_log_troop_r->value()); rec.putField(SCOUTS, inp_log_scout_s->value()); rec.putField(SCOUTR, inp_log_scout_r->value()); qsodb.qsoNewRec (&rec); lotw_recs_sent.push_back(qsodb.nbrRecs() - 1); dxcc_entity_cache_add(&rec); submit_record(rec); qsodb.isdirty(0); reload_browser(); if (qsodb.nbrRecs() == 1) adifFile.writeLog (logbook_filename.c_str(), &qsodb); else adifFile.writeAdifRec(&rec, logbook_filename.c_str()); } void updateRecord() { cQsoRec rec; if (qsodb.nbrRecs() == 0) return; rec.putField(CALL, inpCall_log->value()); rec.putField(NAME, inpName_log->value()); rec.putField(QSO_DATE, inpDate_log->value()); rec.putField(QSO_DATE_OFF, inpDateOff_log->value()); string tm = timestring(inpTimeOn_log->value()); rec.putField(TIME_ON, tm.c_str()); inpTimeOn_log->value(timeview(tm.c_str())); tm = timestring(inpTimeOff_log->value()); rec.putField(TIME_OFF, tm.c_str()); inpTimeOff_log->value(timeview(tm.c_str())); rec.putField(FREQ, inpFreq_log->value()); rec.putField(BAND, inpBand_log->value()); rec.putField(ADIF_MODE, inpMode_log->value()); rec.putField(QTH, inpQth_log->value()); rec.putField(STATE, inpState_log->value()); rec.putField(VE_PROV, inpVE_Prov_log->value()); rec.putField(COUNTRY, inpCountry_log->value()); rec.putField(GRIDSQUARE, inpLoc_log->value()); rec.putField(NOTES, inpNotes_log->value()); rec.putField(QSLRDATE, inpQSLrcvddate_log->value()); rec.putField(QSLSDATE, inpQSLsentdate_log->value()); rec.putField(EQSLRDATE, inpEQSLrcvddate_log->value()); rec.putField(EQSLSDATE, inpEQSLsentdate_log->value()); rec.putField(LOTWRDATE, inpLOTWrcvddate_log->value()); rec.putField(LOTWSDATE, inpLOTWsentdate_log->value()); rec.putField(RST_RCVD, inpRstR_log->value ()); rec.putField(RST_SENT, inpRstS_log->value ()); rec.putField(SRX, inpSerNoIn_log->value()); rec.putField(STX, inpSerNoOut_log->value()); rec.putField(XCHG1, inpXchgIn_log->value()); rec.putField(MYXCHG, inpMyXchg_log->value()); rec.putField(CLASS, inpClass_log->value()); rec.putField(ARRL_SECT, inpSection_log->value()); rec.putField(CNTY, inpCNTY_log->value()); rec.putField(IOTA, inpIOTA_log->value()); rec.putField(DXCC, inpDXCC_log->value()); rec.putField(QSL_VIA, inpQSL_VIA_log->value()); rec.putField(CONT, inpCONT_log->value()); rec.putField(CQZ, inpCQZ_log->value()); rec.putField(ITUZ, inpITUZ_log->value()); rec.putField(TX_PWR, inpTX_pwr_log->value()); rec.putField(STA_CALL, inp_log_sta_call->value()); rec.putField(OP_CALL, inp_log_op_call->value()); rec.putField(MY_CITY, inp_log_sta_qth->value()); rec.putField(MY_GRID, inp_log_sta_loc->value()); rec.putField(SS_SERNO, inp_log_cwss_serno->value()); rec.putField(SS_PREC, inp_log_cwss_prec->value()); rec.putField(SS_CHK, inp_log_cwss_chk->value()); rec.putField(SS_SEC, inp_log_cwss_sec->value()); rec.putField(AGE, inp_age_log->value()); rec.putField(TEN_TEN, inp_1010_log->value()); rec.putField(CHECK, inp_check_log->value()); rec.putField(TROOPS, inp_log_troop_s->value()); rec.putField(TROOPR, inp_log_troop_r->value()); rec.putField(SCOUTS, inp_log_scout_s->value()); rec.putField(SCOUTR, inp_log_scout_r->value()); dxcc_entity_cache_rm(qsodb.getRec(editNbr)); qsodb.qsoUpdRec (editNbr, &rec); dxcc_entity_cache_add(&rec); // cQsoDb::reverse = false; // qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } void deleteRecord () { if (qsodb.nbrRecs() == 0 || fl_choice2(_("Really delete record for \"%s\"?"), _("Yes"), _("No"), NULL, wBrowser->valueAt(-1, 2))) return; dxcc_entity_cache_rm(qsodb.getRec(editNbr)); qsodb.qsoDelRec(editNbr); // cQsoDb::reverse = false; // qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } void EditRecord( int i ) { cQsoRec *editQSO = qsodb.getRec (i); if( !editQSO ) return; inpCall_log->value (editQSO->getField(CALL)); inpName_log->value (editQSO->getField(NAME)); inpDate_log->value (editQSO->getField(QSO_DATE)); inpDateOff_log->value (editQSO->getField(QSO_DATE_OFF)); inpTimeOn_log->value (timeview(editQSO->getField(TIME_ON))); inpTimeOff_log->value (timeview(editQSO->getField(TIME_OFF))); inpRstR_log->value (editQSO->getField(RST_RCVD)); inpRstS_log->value (editQSO->getField(RST_SENT)); inpFreq_log->value (editQSO->getField(FREQ)); inpBand_log->value (editQSO->getField(BAND)); inpMode_log->value (editQSO->getField(ADIF_MODE)); inpState_log->value (editQSO->getField(STATE)); inpVE_Prov_log->value (editQSO->getField(VE_PROV)); inpCountry_log->value (editQSO->getField(COUNTRY)); inpQth_log->value (editQSO->getField(QTH)); inpLoc_log->value (editQSO->getField(GRIDSQUARE)); inpQSLrcvddate_log->value (editQSO->getField(QSLRDATE)); inpQSLsentdate_log->value (editQSO->getField(QSLSDATE)); inpEQSLrcvddate_log->value (editQSO->getField(EQSLRDATE)); inpEQSLsentdate_log->value (editQSO->getField(EQSLSDATE)); inpLOTWrcvddate_log->value (editQSO->getField(LOTWRDATE)); inpLOTWsentdate_log->value (editQSO->getField(LOTWSDATE)); inpNotes_log->value (editQSO->getField(NOTES)); inpSerNoIn_log->value(editQSO->getField(SRX)); inpSerNoOut_log->value(editQSO->getField(STX)); inpXchgIn_log->value(editQSO->getField(XCHG1)); inpClass_log->value(editQSO->getField(CLASS)); inpSection_log->value(editQSO->getField(ARRL_SECT)); inpMyXchg_log->value(editQSO->getField(MYXCHG)); inpCNTY_log->value(editQSO->getField(CNTY)); inpIOTA_log->value(editQSO->getField(IOTA)); inpDXCC_log->value(editQSO->getField(DXCC)); inpQSL_VIA_log->value(editQSO->getField(QSL_VIA)); inpCONT_log->value(editQSO->getField(CONT)); inpCQZ_log->value(editQSO->getField(CQZ)); inpITUZ_log->value(editQSO->getField(ITUZ)); inpTX_pwr_log->value(editQSO->getField(TX_PWR)); inp_log_sta_call->value(editQSO->getField(STA_CALL)); inp_log_op_call->value(editQSO->getField(OP_CALL)); inp_log_sta_qth->value(editQSO->getField(MY_CITY)); inp_log_sta_loc->value(editQSO->getField(MY_GRID)); inp_log_cwss_serno->value(editQSO->getField(SS_SERNO)); inp_log_cwss_prec->value(editQSO->getField(SS_PREC)); inp_log_cwss_chk->value(editQSO->getField(SS_CHK)); inp_log_cwss_sec->value(editQSO->getField(SS_SEC)); inp_age_log->value(editQSO->getField(AGE)); inp_1010_log->value(editQSO->getField(TEN_TEN)); inp_check_log->value(editQSO->getField(CHECK)); inp_log_troop_s->value(editQSO->getField(TROOPS)); inp_log_troop_r->value(editQSO->getField(TROOPR)); inp_log_scout_s->value(editQSO->getField(SCOUTS)); inp_log_scout_r->value(editQSO->getField(SCOUTR)); } std::string sDate_on = ""; std::string sTime_on = ""; std::string sDate_off = ""; std::string sTime_off = ""; void AddRecord () { inpCall_log->value(inpCall->value()); inpName_log->value (inpName->value()); if (progdefaults.force_date_time) { inpDate_log->value(sDate_off.c_str()); inpTimeOn_log->value (timeview(sTime_off.c_str())); } else { inpDate_log->value(sDate_on.c_str()); inpTimeOn_log->value (timeview(sTime_on.c_str())); } inpDateOff_log->value(sDate_off.c_str()); inpTimeOff_log->value (timeview(sTime_off.c_str())); inpRstR_log->value (inpRstIn->value()); inpRstS_log->value (inpRstOut->value()); { char Mhz[30]; snprintf(Mhz, sizeof(Mhz), "%-f", atof(inpFreq->value()) / 1000.0); inpFreq_log->value(Mhz); inpBand_log->value(band_name(Mhz)); } inpMode_log->value (logmode); inpState_log->value (ucasestr(inpState->value()).c_str()); inpVE_Prov_log->value (ucasestr(inpVEprov->value()).c_str()); inpCountry_log->value (cboCountry->value()); inpCNTY_log->value (inpCounty->value()); inpSerNoIn_log->value(inpSerNo->value()); inpSerNoOut_log->value(outSerNo->value()); inpXchgIn_log->value(inpXchgIn->value()); inpMyXchg_log->value(progdefaults.myXchg.c_str()); inpQth_log->value (inpQTH->value()); inpLoc_log->value (inpLoc->value()); inpQSLrcvddate_log->value (""); inpQSLsentdate_log->value (""); inpEQSLrcvddate_log->value (""); inpEQSLsentdate_log->value (""); inpLOTWrcvddate_log->value (""); inpLOTWsentdate_log->value (""); inpNotes_log->value (inpNotes->value()); inpTX_pwr_log->value (progdefaults.mytxpower.c_str()); inpIOTA_log->value(""); inpDXCC_log->value(""); inpQSL_VIA_log->value(""); inpCONT_log->value(""); inpCQZ_log->value(inp_CQzone->value()); inpITUZ_log->value(""); inpClass_log->value(ucasestr(inpClass->value()).c_str()); inpSection_log->value(ucasestr(inpSection->value()).c_str()); inp_log_sta_call->value(progdefaults.myCall.c_str()); inp_log_op_call->value(progdefaults.operCall.c_str()); inp_log_sta_qth->value(progdefaults.myQth.c_str()); inp_log_sta_loc->value(progdefaults.myLocator.c_str()); inp_log_cwss_serno->value(ucasestr(inp_SS_SerialNoR->value()).c_str()); inp_log_cwss_prec->value(ucasestr(inp_SS_Precedence->value()).c_str()); inp_log_cwss_chk->value(ucasestr(inp_SS_Check->value()).c_str()); inp_log_cwss_sec->value(ucasestr(inp_SS_Section->value()).c_str()); inp_age_log->value(ucasestr(inp_KD_age->value()).c_str()); inp_check_log->value(ucasestr(inp_ARR_check->value()).c_str()); inp_1010_log->value(ucasestr(inp_1010_nr->value()).c_str()); inp_log_troop_s->value(progdefaults.my_JOTA_troop.c_str()); inp_log_troop_r->value(inp_JOTA_troop->value()); inp_log_scout_s->value(progdefaults.my_JOTA_scout.c_str()); inp_log_scout_r->value(inp_JOTA_scout->value()); saveRecord(); logState = VIEWREC; activateButtons(); } void cb_browser (Fl_Widget *w, void *data ) { Table *table = (Table *)w; editNbr = atoi(table->valueAt(-1,6)); EditRecord (editNbr); } void addBrowserRow(cQsoRec *rec, int nbr) { char sNbr[6]; snprintf(sNbr,sizeof(sNbr),"%d", nbr); wBrowser->addRow (7, rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE), timeview4(rec->getField(progdefaults.sort_date_time_off ? TIME_OFF : TIME_ON)), rec->getField(CALL), rec->getField(NAME), rec->getField(FREQ), rec->getField(ADIF_MODE), sNbr); } void adjustBrowser(bool keep_pos) { int row = wBrowser->value(), pos = wBrowser->scrollPos(); if (row >= qsodb.nbrRecs()) row = qsodb.nbrRecs() - 1; if (keep_pos && row >= 0) { wBrowser->value(row); wBrowser->scrollTo(pos); } else { if (cQsoDb::reverse == true) wBrowser->FirstRow (); else wBrowser->LastRow (); } char szRecs[6]; snprintf(szRecs, sizeof(szRecs), "%5d", qsodb.nbrRecs()); txtNbrRecs_log->value(szRecs); } void loadBrowser(bool keep_pos) { cQsoRec *rec; wBrowser->clear(); if (qsodb.nbrRecs() == 0) return; for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); addBrowserRow(rec, i); } adjustBrowser(keep_pos); } //============================================================================= // Cabrillo reporter //============================================================================= const char *szContests[] = { "AP-SPRINT", "ARRL-10", "ARRL-160", "ARRL-DX-CW", "ARRL-DX-SSB", "ARRL-SS-CW", "ARRL-SS-SSB", "ARRL-UHF-AUG", "ARRL-VHF-JAN", "ARRL-VHF-JUN", "ARRL-VHF-SEP", "ARRL-RTTY", "BARTG-RTTY", "BARTG-SPRINT", "CQ-160-CW", "CQ-160-SSB", "CQ-WPX-CW", "CQ-WPX-RTTY", "CQ-WPX-SSB", "CQ-VHF", "CQ-WW-CW", "CQ-WW-RTTY", "CQ-WW-SSB", "DARC-WAEDC-CW", "DARC-WAEDC-RTTY", "DARC-WAEDC-SSB", "FCG-FQP", "IARU-HF", "JIDX-CW", "JIDX-SSB", "NAQP-CW", "NAQP-RTTY", "NAQP-SSB", "NA-SPRINT-CW", "NA-SPRINT-SSB", "NCCC-CQP", "NEQP", "OCEANIA-DX-CW", "OCEANIA-DX-SSB", "RDXC", "RSGB-IOTA", "SAC-CW", "SAC-SSB", "STEW-PERRY", "TARA-RTTY", 0 }; enum icontest { AP_SPRINT, ARRL_10, ARRL_160, ARRL_DX_CW, ARRL_DX_SSB, ARRL_SS_CW, ARRL_SS_SSB, ARRL_UHF_AUG, ARRL_VHF_JAN, ARRL_VHF_JUN, ARRL_VHF_SEP, ARRL_RTTY, BARTG_RTTY, BARTG_SPRINT, CQ_160_CW, CQ_160_SSB, CQ_WPX_CW, CQ_WPX_RTTY, CQ_WPX_SSB, CQ_VHF, CQ_WW_CW, CQ_WW_RTTY, CQ_WW_SSB, DARC_WAEDC_CW, DARC_WAEDC_RTTY, DARC_WAEDC_SSB, FCG_FQP, IARU_HF, JIDX_CW, JIDX_SSB, NAQP_CW, NAQP_RTTY, NAQP_SSB, NA_SPRINT_CW, NA_SPRINT_SSB, NCCC_CQP, NEQP, OCEANIA_DX_CW, OCEANIA_DX_SSB, RDXC, RSGB_IOTA, SAC_CW, SAC_SSB, STEW_PERRY, TARA_RTTY }; bool bInitCombo = true; icontest contestnbr; void setContestType() { contestnbr = (icontest)cboContest->index(); btnCabCall->value(true); btnCabFreq->value(true); btnCabMode->value(true); btnCabQSOdate->value(true); btnCabTimeOFF->value(true); btnCabRSTsent->value(true); btnCabRSTrcvd->value(true); btnCabSerialIN->value(true);btnCabSerialOUT->value(true); btnCabXchgIn->value(true); btnCabMyXchg->value(true); switch (contestnbr) { case ARRL_SS_CW : case ARRL_SS_SSB : btnCabRSTrcvd->value(false); break; case BARTG_RTTY : case BARTG_SPRINT : break; case ARRL_UHF_AUG : case ARRL_VHF_JAN : case ARRL_VHF_JUN : case ARRL_VHF_SEP : case CQ_VHF : btnCabRSTrcvd->value(false); btnCabSerialIN->value(false); btnCabSerialOUT->value(false); break; case AP_SPRINT : case ARRL_10 : case ARRL_160 : case ARRL_DX_CW : case ARRL_DX_SSB : case CQ_160_CW : case CQ_160_SSB : case CQ_WPX_CW : case CQ_WPX_RTTY : case CQ_WPX_SSB : case RDXC : case OCEANIA_DX_CW : case OCEANIA_DX_SSB : break; case DARC_WAEDC_CW : case DARC_WAEDC_RTTY : case DARC_WAEDC_SSB : break; case NAQP_CW : case NAQP_RTTY : case NAQP_SSB : case NA_SPRINT_CW : case NA_SPRINT_SSB : break; case RSGB_IOTA : break; default : break; } } void cb_Export_Cabrillo(Fl_Menu_* m, void* d) { if (qsodb.nbrRecs() == 0) return; cQsoRec *rec; char line[80]; int indx = 0; if (bInitCombo) { bInitCombo = false; while (szContests[indx]) { cboContest->add(szContests[indx]); indx++; } } cboContest->index(0); chkCabBrowser->clear(); #ifdef __APPLE__ chkCabBrowser->textfont(FL_SCREEN_BOLD); chkCabBrowser->textsize(12); #else chkCabBrowser->textfont(FL_COURIER); chkCabBrowser->textsize(12); #endif for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); memset(line, 0, sizeof(line)); snprintf(line,sizeof(line),"%8s %4s %-10s %-10s %-s", rec->getField(QSO_DATE), time4(rec->getField(TIME_OFF)), rec->getField(CALL), szfreq(rec->getField(FREQ)), adif2export(rec->getField(ADIF_MODE)).c_str() ); chkCabBrowser->add(line); } wCabrillo->show(); } void cabrillo_append_qso (FILE *fp, cQsoRec *rec) { char freq[16] = ""; string rst_in, rst_out, exch_in, exch_out, date, time, mode, mycall, call, exch; string qsoline = "QSO: "; int ifreq = 0; size_t len = 0; size_t p = 0; exch_out.clear(); exch_in.clear(); exch.clear(); if (btnCabFreq->value()) { ifreq = (int)(1000.0 * atof(rec->getField(FREQ))); snprintf(freq, sizeof(freq), "%7d", ifreq); qsoline.append(freq); qsoline.append(" "); } if (btnCabMode->value()) { mode = adif2export(rec->getField(ADIF_MODE)); if (mode.compare("USB") == 0 || mode.compare("LSB") == 0 || mode.compare("SSB") == 0 || mode.compare("PH") == 0 ) mode = "PH"; else if (mode.compare("FM") == 0 || mode.compare("CW") == 0 ) ; else mode = "RY"; qsoline.append(mode); qsoline.append(" "); } if (btnCabQSOdate->value()) { date = rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE); date.insert(4,"-"); date.insert(7,"-"); qsoline.append(date); qsoline.append(" "); } if (btnCabTimeOFF->value()) { time = rec->getField(progdefaults.sort_date_time_off ? TIME_OFF : TIME_ON); qsoline.append(time4(time.c_str())); qsoline.append(" "); } mycall = progdefaults.myCall; if (mycall.length() > 13) mycall = mycall.substr(0,13); len = mycall.length(); if (len < 13) mycall.append(13 - len, ' '); qsoline.append(mycall); qsoline.append(" "); if (btnCabRSTsent->value() || contestnbr == BARTG_RTTY) { rst_out = rec->getField(RST_SENT); if (rst_out.length() > 3) rst_out = rst_out.substr(0, 3); len = rst_out.length(); if (len < 3) rst_out.append(3 - len, ' '); exch_out.append(rst_out).append(" "); } if (btnCabSerialOUT->value() || contestnbr == BARTG_RTTY) { exch_out.append(rec->getField(STX)).append(" "); } if (btnCabMyXchg->value()) { exch = rec->getField(MYXCHG); if (!exch.empty()) exch_out.append(rec->getField(MYXCHG)).append(" "); } if (contestnbr == BARTG_RTTY) { string toff = rec->getField(TIME_OFF); if (toff.length() > 4) toff = toff.substr(0,4); toff = toff.append(" "); exch_out.append(toff); } // // ADD CONTESTNBR == FD // // if (exch_out.length() > 20) exch_out = exch_out.substr(0,20); len = exch_out.length(); if (len < 20) exch_out.append(20 - len, ' '); qsoline.append(exch_out); if (btnCabCall->value()) { call = rec->getField(CALL); if (call.length() > 13) call = call.substr(0,13); len = call.length(); if (len < 13) call.append(13 - len, ' '); qsoline.append(call); qsoline.append(" "); } if (btnCabRSTrcvd->value()) { rst_in = rec->getField(RST_RCVD); if (rst_in.length() > 3) rst_in = rst_in.substr(0,3); len = rst_in.length(); if (len < 3) rst_in.append(3 - len, ' '); qsoline.append(rst_in); qsoline.append(" "); } if (btnCabSerialIN->value()) { exch_in = exch_in.append(rec->getField(SRX)); if (exch_in.length()) exch_in += ' '; } if (btnCabXchgIn->value()) { exch = rec->getField(XCHG1); while ((p = exch.find(":")) != string::npos) exch.erase(p,1); while ((p = exch.find(" ")) != string::npos) exch.erase(p,1); if (exch[0] == ' ') exch.erase(0,1); exch_in.append(exch); } if (exch_in.length() > 14) exch_in = exch_in.substr(0,14); len = exch_in.length(); if (len < 14) exch_in.append(14 - len, ' '); qsoline.append(exch_in); fprintf (fp, "%s\n", qsoline.c_str()); return; } void WriteCabrillo() { if (chkCabBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Create cabrillo report"); string filters = "TEXT\t*.txt"; #ifdef __APPLE__ filters.append("\n"); #endif string strContest = ""; const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "contest.txt"); if (!p) return; if (!*p) return; for (int i = 0; i < chkCabBrowser->FLTK_nitems(); i++) { if (chkCabBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; if (sp.find(".txt") == string::npos) sp.append(".txt"); FILE *cabFile = fl_fopen (p, "w"); if (!cabFile) return; strContest = cboContest->value(); contestnbr = (icontest)cboContest->index(); fprintf (cabFile, "START-OF-LOG: 3.0\n\ CREATED-BY: %s %s\n\ \n\ # The callsign used during the contest.\n\ CALLSIGN: %s\n\ \n\ # ASSISTED or NON-ASSISTED\n\ CATEGORY-ASSISTED: \n\ \n\ # Band: ALL, 160M, 80M, 40M, 20M, 15M, 10M, 6M, 2M, 222, 432, 902, 1.2G\n\ CATEGORY-BAND: \n\ \n\ # Mode: SSB, CW, RTTY, MIXED \n\ CATEGORY-MODE: \n\ \n\ # Operator: SINGLE-OP, MULTI-OP, CHECKLOG \n\ CATEGORY-OPERATOR: \n\ \n\ # Power: HIGH, LOW, QRP \n\ CATEGORY-POWER: \n\ \n\ # Station: FIXED, MOBILE, PORTABLE, ROVER, EXPEDITION, HQ, SCHOOL \n\ CATEGORY-STATION: \n\ \n\ # Time: 6-HOURS, 12-HOURS, 24-HOURS \n\ CATEGORY-TIME: \n\ \n\ # Transmitter: ONE, TWO, LIMITED, UNLIMITED, SWL \n\ CATEGORY-TRANSMITTER: \n\ \n\ # Overlay: ROOKIE, TB-WIRES, NOVICE-TECH, OVER-50 \n\ CATEGORY-OVERLAY: \n\ \n\ # Integer number\n\ CLAIMED-SCORE: \n\ \n\ # Name of the radio club with which the score should be aggregated.\n\ CLUB: \n\ \n\ # Contest: AP-SPRINT, ARRL-10, ARRL-160, ARRL-DX-CW, ARRL-DX-SSB, ARRL-SS-CW,\n\ # ARRL-SS-SSB, ARRL-UHF-AUG, ARRL-VHF-JAN, ARRL-VHF-JUN, ARRL-VHF-SEP,\n\ # ARRL-RTTY, BARTG-RTTY, CQ-160-CW, CQ-160-SSB, CQ-WPX-CW, CQ-WPX-RTTY,\n\ # CQ-WPX-SSB, CQ-VHF, CQ-WW-CW, CQ-WW-RTTY, CQ-WW-SSB, DARC-WAEDC-CW,\n\ # DARC-WAEDC-RTTY, DARC-WAEDC-SSB, FCG-FQP, IARU-HF, JIDX-CW, JIDX-SSB,\n\ # NAQP-CW, NAQP-RTTY, NAQP-SSB, NA-SPRINT-CW, NA-SPRINT-SSB, NCCC-CQP,\n\ # NEQP, OCEANIA-DX-CW, OCEANIA-DX-SSB, RDXC, RSGB-IOTA, SAC-CW, SAC-SSB,\n\ # STEW-PERRY, TARA-RTTY \n\ CONTEST: %s\n\ \n\ # Optional email address\n\ EMAIL: \n\ \n\ LOCATION: \n\ \n\ # Operator name\n\ NAME: \n\ \n\ # Maximum 4 address lines.\n\ ADDRESS: \n\ ADDRESS: \n\ ADDRESS: \n\ ADDRESS: \n\ \n\ # A space-delimited list of operator callsign(s). \n\ OPERATORS: \n\ \n\ # Offtime yyyy-mm-dd nnnn yyyy-mm-dd nnnn \n\ # OFFTIME: \n\ \n\ # Soapbox comments.\n\ SOAPBOX: \n\ SOAPBOX: \n\ SOAPBOX: \n\n", PACKAGE_NAME, PACKAGE_VERSION, progdefaults.myCall.c_str(), strContest.c_str() ); qsodb.SortByDate(progdefaults.sort_date_time_off); for (int i = 0; i < qsodb.nbrRecs(); i++) { rec = qsodb.getRec(i); if (rec->getField(EXPORT)[0] == 'E') { cabrillo_append_qso(cabFile, rec); rec->putField(EXPORT,""); qsodb.qsoUpdRec(i, rec); } } fprintf(cabFile, "END-OF-LOG:\n"); fclose (cabFile); return; } #if HAVE_STD_HASH # include typedef std::unordered_map dxcc_entity_cache_t; #elif HAVE_STD_TR1_HASH # include typedef tr1::unordered_map dxcc_entity_cache_t; #else # error "No std::hash or std::tr1::hash support" #endif static dxcc_entity_cache_t dxcc_entity_cache; static bool dxcc_entity_cache_enabled = false; #include "dxcc.h" static void dxcc_entity_cache_clear(void) { if (dxcc_entity_cache_enabled) dxcc_entity_cache.clear(); } static void dxcc_entity_cache_add(cQsoRec* r) { if (!dxcc_entity_cache_enabled | !r) return; const dxcc* e = dxcc_lookup(r->getField(CALL)); if (e) dxcc_entity_cache[e->country]++; } static void dxcc_entity_cache_add(cQsoDb& db) { if (!dxcc_entity_cache_enabled) return; int n = db.nbrRecs(); for (int i = 0; i < n; i++) dxcc_entity_cache_add(db.getRec(i)); if (!dxcc_entity_cache.empty()) { unsigned int un = dxcc_entity_cache.size(); LOG_INFO("Found %u countries in %d QSO records", un, n); } } static void dxcc_entity_cache_rm(cQsoRec* r) { if (!dxcc_entity_cache_enabled || !r) return; const dxcc* e = dxcc_lookup(r->getField(CALL)); if (!e) return; dxcc_entity_cache_t::iterator i = dxcc_entity_cache.find(e->country); if (i != dxcc_entity_cache.end()) { if (i->second) i->second--; else dxcc_entity_cache.erase(i); } } void dxcc_entity_cache_enable(bool v) { if (dxcc_entity_cache_enabled == v) return; dxcc_entity_cache_clear(); if ((dxcc_entity_cache_enabled = v)) dxcc_entity_cache_add(qsodb); } bool qsodb_dxcc_entity_find(const char* country) { return dxcc_entity_cache.find(country) != dxcc_entity_cache.end(); } //====================================================================== // eQSL verification support //====================================================================== static string eqsl_download_name = ""; static cQsoDb *eqsl_db = 0; void verify_eqsl(void *) { eqsl_db = new cQsoDb; adifFile.do_readfile (eqsl_download_name.c_str(), eqsl_db); if (eqsl_db->nbrRecs() == 0) { LOG_INFO("No records in eqsl download file"); return; } LOG_INFO("logbook %d records, verify with %d records", qsodb.nbrRecs(), eqsl_db->nbrRecs()); int matchrec; cQsoRec *qrec, *lrec; int nverified = 0; for (int i = 0; i < eqsl_db->nbrRecs(); i++) { lrec = eqsl_db->getRec(i); matchrec = qsodb.matched( lrec ); if (matchrec != -1) { qrec = qsodb.getRec(matchrec); if (qrec->getField(EQSLRDATE)[0] == 0) { nverified++; qrec->putField(EQSLRDATE, zdate()); } } else { LOG_INFO("Could not match %s on %s", lrec->getField(CALL), lrec->getField(QSO_DATE)); } } LOG_INFO("%d records updated", nverified); delete eqsl_db; } void cb_btn_verify_eqsl(Fl_Button *, void *) { ENSURE_THREAD(FLMAIN_TID); const char* p = FSEL::select(_("LoTW download file"), "ADIF\t*.{adi,adif}", LoTWDir.c_str()); if (!p) return; if (!*p) return; eqsl_download_name = p; Fl::awake(verify_eqsl); } fldigi-4.1.06/src/logbook/fd_view.fl0000644000175000017500000002216113472115777014172 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include "configuration.h"} {private local } Function {make_fd_view()} {open } { Fl_Window {} { label {Field Day Viewer - use with program 'fdserver'} open xywh {745 38 785 270} type Double align 5 visible } { Fl_Output view_FD_call { label {FD Call} xywh {98 6 77 24} code0 {o->value(progdefaults.my_FD_call.c_str());} } Fl_Output view_FD_class { label {FD Class} xywh {277 5 38 24} code0 {o->value(progdefaults.my_FD_class.c_str());} } Fl_Output view_FD_section { label {FD Section} xywh {417 5 38 24} code0 {o->value(progdefaults.my_FD_section.c_str());} } Fl_Output view_FD_mult { label {FD Mult} xywh {557 5 38 24} code0 {o->value(progdefaults.my_FD_mult.c_str());} } Fl_Output view_FD_score { label Score xywh {698 5 80 24} } Fl_Box {} { label 160 xywh {55 33 50 17} box FLAT_BOX } Fl_Box {} { label 80 xywh {114 33 50 17} box FLAT_BOX } Fl_Box {} { label 40 xywh {174 33 50 17} box FLAT_BOX } Fl_Box {} { label 20 xywh {233 33 50 17} box FLAT_BOX } Fl_Box {} { label 17 xywh {293 33 50 17} box FLAT_BOX } Fl_Box {} { label 15 xywh {352 33 50 17} box FLAT_BOX } Fl_Box {} { label 12 xywh {414 33 50 17} box FLAT_BOX } Fl_Box {} { label 10 xywh {476 33 50 17} box FLAT_BOX } Fl_Box {} { label 6 xywh {538 33 50 17} box FLAT_BOX } Fl_Box {} { label 2 xywh {600 33 50 17} box FLAT_BOX } Fl_Box {} { label 220 xywh {660 33 60 17} box FLAT_BOX } Fl_Box {} { label 440 xywh {720 33 60 17} box FLAT_BOX } Fl_Output {view_FD_CW[0]} { label CW xywh {55 49 60 24} } Fl_Output {view_FD_CW[1]} { xywh {115 49 60 24} align 20 } Fl_Output {view_FD_CW[2]} { xywh {174 49 60 24} align 20 } Fl_Output {view_FD_CW[3]} { xywh {234 49 60 24} align 20 } Fl_Output {view_FD_CW[4]} { xywh {293 49 60 24} align 20 } Fl_Output {view_FD_CW[5]} { xywh {353 49 60 24} align 20 } Fl_Output {view_FD_CW[6]} { xywh {415 49 60 24} align 20 } Fl_Output {view_FD_CW[7]} { xywh {475 49 60 24} align 20 } Fl_Output {view_FD_CW[8]} { xywh {536 49 60 24} align 20 } Fl_Output {view_FD_CW[9]} { xywh {598 49 60 24} align 20 } Fl_Output {view_FD_CW[10]} { xywh {659 49 60 24} align 20 } Fl_Output {view_FD_CW[11]} { xywh {719 49 60 24} align 20 } Fl_Output {view_FD_CW_OP[0]} { label {Oper'} xywh {55 73 60 24} } Fl_Output {view_FD_CW_OP[1]} { xywh {115 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[2]} { xywh {174 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[3]} { xywh {234 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[4]} { xywh {293 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[5]} { xywh {353 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[6]} { xywh {415 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[7]} { xywh {475 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[8]} { xywh {536 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[9]} { xywh {598 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[10]} { xywh {659 73 60 24} align 20 } Fl_Output {view_FD_CW_OP[11]} { xywh {719 73 60 24} align 20 } Fl_Output {view_FD_DIG[0]} { label DIG xywh {55 103 60 24} } Fl_Output {view_FD_DIG[1]} { xywh {115 103 60 24} align 20 } Fl_Output {view_FD_DIG[2]} { xywh {174 103 60 24} align 20 } Fl_Output {view_FD_DIG[3]} { xywh {234 103 60 24} align 20 } Fl_Output {view_FD_DIG[4]} { xywh {293 103 60 24} align 20 } Fl_Output {view_FD_DIG[5]} { xywh {353 103 60 24} align 20 } Fl_Output {view_FD_DIG[6]} { xywh {415 103 60 24} align 20 } Fl_Output {view_FD_DIG[7]} { xywh {475 103 60 24} align 20 } Fl_Output {view_FD_DIG[8]} { xywh {536 103 60 24} align 20 } Fl_Output {view_FD_DIG[9]} { xywh {598 103 60 24} align 20 } Fl_Output {view_FD_DIG[10]} { xywh {659 103 60 24} align 20 } Fl_Output {view_FD_DIG[11]} { xywh {719 103 60 24} align 20 } Fl_Output {view_FD_DIG_OP[0]} { label {Oper'} xywh {55 128 60 24} } Fl_Output {view_FD_DIG_OP[1]} { xywh {115 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[2]} { xywh {174 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[3]} { xywh {234 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[4]} { xywh {293 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[5]} { xywh {353 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[6]} { xywh {415 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[7]} { xywh {475 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[8]} { xywh {536 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[9]} { xywh {598 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[10]} { xywh {659 128 60 24} align 20 } Fl_Output {view_FD_DIG_OP[11]} { xywh {719 128 60 24} align 20 } Fl_Output {view_FD_PHONE[0]} { label PHONE xywh {55 158 60 24} } Fl_Output {view_FD_PHONE[1]} { xywh {115 158 60 24} align 20 } Fl_Output {view_FD_PHONE[2]} { xywh {174 158 60 24} align 20 } Fl_Output {view_FD_PHONE[3]} { xywh {234 158 60 24} align 20 } Fl_Output {view_FD_PHONE[4]} { xywh {293 158 60 24} align 20 } Fl_Output {view_FD_PHONE[5]} { xywh {353 158 60 24} align 20 } Fl_Output {view_FD_PHONE[6]} { xywh {415 158 60 24} align 20 } Fl_Output {view_FD_PHONE[7]} { xywh {475 158 60 24} align 20 } Fl_Output {view_FD_PHONE[8]} { xywh {536 158 60 24} align 20 } Fl_Output {view_FD_PHONE[9]} { xywh {598 158 60 24} align 20 } Fl_Output {view_FD_PHONE[10]} { xywh {659 158 60 24} align 20 } Fl_Output {view_FD_PHONE[11]} { xywh {719 158 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[0]} { label {Oper'} xywh {55 183 60 24} } Fl_Output {view_FD_PHONE_OP[1]} { xywh {115 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[2]} { xywh {174 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[3]} { xywh {234 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[4]} { xywh {293 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[5]} { xywh {353 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[6]} { xywh {415 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[7]} { xywh {475 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[8]} { xywh {536 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[9]} { xywh {598 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[10]} { xywh {659 183 60 24} align 20 } Fl_Output {view_FD_PHONE_OP[11]} { xywh {719 183 60 24} align 20 } Fl_Group {} { label {"fdserver" Client} open xywh {5 212 775 55} box ENGRAVED_BOX align 21 } { Fl_Input inp_fd_tcpip_addr { label {tcpip addr} callback {progdefaults.fd_tcpip_addr=o->value(); progdefaults.changed = true;} tooltip {fdserver tcipip address} xywh {85 234 198 24} code0 {o->value(progdefaults.fd_tcpip_addr.c_str());} code1 {\#include "flinput2.h"} class Fl_Input2 } Fl_Input inp_fd_tcpip_port { label port callback {progdefaults.fd_tcpip_port=o->value(); progdefaults.changed = true;} tooltip {fdserver tcpip port} xywh {325 234 75 24} code0 {o->value(progdefaults.fd_tcpip_port.c_str());} class Fl_Input2 } Fl_Input inp_fd_op_call { label {OP callsign} callback {progdefaults.fd_op_call=o->value(); progdefaults.changed = true;} tooltip {free form exchange} xywh {500 234 90 24} code0 {o->value(progdefaults.fd_op_call.c_str());} class Fl_Input2 } Fl_Check_Button btn_fd_connect { label Connect callback {progdefaults.connect_to_fdserver=o->value(); if (progdefaults.connect_to_fdserver) { listbox_contest->index(LOG_FD); progdefaults.logging = LOG_FD; } else { listbox_contest->index(LOG_QSO); progdefaults.logging = LOG_QSO; } UI_select();} tooltip {Connect / Disconnect^jAddr/Port/OP required} xywh {608 236 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_fdserver);} code1 {\#include "confdialog.h"} code2 {\#include "fl_digi.h"} code3 {\#include "logsupport.h"} } Fl_Box box_fdserver_connected { label Connected selected xywh {722 237 18 18} box ROUND_DOWN_BOX color 31 align 1 } } } } fldigi-4.1.06/src/logbook/textio.cxx0000664000175000017500000004204313507402064014252 00000000000000// ---------------------------------------------------------------------------- // textio.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "textio.h" #include "lgbook.h" #include "globals.h" using namespace std; #ifdef __WOE32__ static const char *szEOL = "\r\n"; #else static const char *szEOL = "\n"; #endif char * cTextFile::adif_to_date( char *s) { static char date[9]; strcpy(date, " / / "); for (int i = 0; i < 2; i++) { date[i+6] = s[i+2]; date[i] = s[i+4]; date[i+3] = s[i+6]; } return date; } char * cTextFile::adif_to_time( char *s) { static char time[6]; strcpy(time, " : "); for (int i = 0; i < 2; i++) { time[i] = s[i]; time[i+3] = s[i+2]; } return time; } void cTextFile::writeCSVHeader(FILE *txtFile) { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%s", "\"DATE_ON\""); if (btnSelectQSOdateOff->value())fprintf (txtFile, "%s", ",\"DATE_OFF\""); if (btnSelectTimeON->value()) fprintf (txtFile, "%s", ",\"ON\""); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%s", ",\"OFF\""); if (btnSelectCall->value()) fprintf (txtFile, "%s", ",\"CALL\""); if (btnSelectName->value()) fprintf (txtFile, "%s", ",\"NAME\""); if (btnSelectBand->value()) fprintf (txtFile, "%s", ",\"BAND\""); if (btnSelectFreq->value()) fprintf (txtFile, "%s", ",\"FREQ\""); if (btnSelectMode->value()) fprintf (txtFile, "%s", ",\"MODE\""); if (btnSelectTX_pwr->value()) fprintf (txtFile, "%s", ",\"TX_PWR\""); if (btnSelectRSTsent->value()) fprintf (txtFile, "%s", ",\"RSTSENT\""); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%s", ",\"RSTRCVD\""); if (btnSelectQth->value()) fprintf (txtFile, "%s", ",\"QTH\""); if (btnSelectState->value()) fprintf (txtFile, "%s", ",\"ST\""); if (btnSelectProvince->value()) fprintf (txtFile, "%s", ",\"PR\""); if (btnSelectCNTY->value()) fprintf (txtFile, "%s", ",\"CNTY\""); if (btnSelectCountry->value()) fprintf (txtFile, "%s", ",\"CNTRY\""); if (btnSelectDXCC->value()) fprintf (txtFile, "%s", ",\"DXCC\""); if (btnSelectCQZ->value()) fprintf (txtFile, "%s", ",\"CQZONE\""); if (btnSelectIOTA->value()) fprintf (txtFile, "%s", ",\"IOTA\""); if (btnSelectCONT->value()) fprintf (txtFile, "%s", ",\"CONT\""); if (btnSelectITUZ->value()) fprintf (txtFile, "%s", ",\"ITUZ\""); if (btnSelectLOC->value()) fprintf (txtFile, "%s", ",\"GRIDSQUARE\""); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%s", ",\"QSL_RCVD\""); if (btnSelectQSLsent->value()) fprintf (txtFile, "%s", ",\"QSL_SENT\""); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, "%s", ",\"EQSL_RCVD\""); if (btnSelecteQSLsent->value()) fprintf (txtFile, "%s", ",\"EQSL_SENT\""); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, "%s", ",\"LOTW_RCVD\""); if (btnSelectLOTWsent->value()) fprintf (txtFile, "%s", ",\"LOTW_SENT\""); if (btnSelectNotes->value()) fprintf (txtFile, "%s", ",\"NOTES\""); if (btnSelectSerialIN->value()) fprintf (txtFile, "%s", ",\"SERIAL RCVD\""); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%s", ",\"SERIAL_SENT\""); if (btnSelectXchgIn->value()) fprintf (txtFile, "%s", ",\"XCHG1\""); if (btnSelectMyXchg->value()) fprintf (txtFile, "%s", ",\"MYXCHG\""); if (btnSelectClass->value()) fprintf (txtFile, "%s", ",\"CLASS\""); if (btnSelectSection->value()) fprintf (txtFile, "%s", ",\"ARRl_SECT\""); if (btnSelectOperator->value()) fprintf (txtFile, "%s", ",\"OPER\""); if (btnSelectStaCall->value()) fprintf (txtFile, "%s", ",\"STA_CALL\""); if (btnSelectStaGrid->value()) fprintf (txtFile, "%s", ",\"STA_GRID\""); if (btnSelectStaCity->value()) fprintf (txtFile, "%s", ",\"STA_CITY\""); if (btnSelectCheck->value()) fprintf (txtFile, "%s", ",\"CHECK\""); if (btnSelectAge->value()) fprintf (txtFile, "%s", ",\"AGE\""); if (btnSelect_1010->value()) fprintf (txtFile, "%s", ",\"10-10\""); fprintf (txtFile, "%s", szEOL); } int cTextFile::writeCSVFile (const char *fname, cQsoDb *db) { cQsoRec *pRec = (cQsoRec *)0; FILE *txtFile = fl_fopen (fname, "w"); if (!txtFile) return 1; if (txtFile) { writeCSVHeader(txtFile); for (int i = 0; i < db->nbrRecs(); i++) { pRec = db->getRec(i); if (pRec->getField(EXPORT)[0] == 'E') { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "\"%s\"", pRec->getField(QSO_DATE)); if (btnSelectQSOdateOff->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSO_DATE_OFF)); if (btnSelectTimeON->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TIME_ON)); if (btnSelectTimeOFF->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TIME_OFF)); if (btnSelectCall->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CALL)); if (btnSelectName->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(NAME)); if (btnSelectBand->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(BAND)); if (btnSelectFreq->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(FREQ)); if (btnSelectMode->value()) { if (!adif2submode(pRec->getField(ADIF_MODE)).empty()) fprintf (txtFile, ",\"%s\"", adif2submode(pRec->getField(ADIF_MODE)).c_str()); else fprintf (txtFile, ",\"%s\"", adif2export(pRec->getField(ADIF_MODE)).c_str()); } if (btnSelectTX_pwr->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TX_PWR)); if (btnSelectRSTsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(RST_SENT)); if (btnSelectRSTrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(RST_RCVD)); if (btnSelectQth->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QTH)); if (btnSelectState->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STATE)); if (btnSelectProvince->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(VE_PROV)); if (btnSelectCNTY->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CNTY)); if (btnSelectCountry->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(COUNTRY)); if (btnSelectDXCC->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(DXCC)); if (btnSelectCQZ->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CQZ)); if (btnSelectIOTA->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(IOTA)); if (btnSelectCONT->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CONT)); if (btnSelectITUZ->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(ITUZ)); if (btnSelectLOC->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(GRIDSQUARE)); if (btnSelectQSLrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSLRDATE)); if (btnSelectQSLsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSLSDATE)); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(EQSLRDATE)); if (btnSelecteQSLsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(EQSLSDATE)); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(LOTWSDATE)); if (btnSelectLOTWsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(LOTWSDATE)); if (btnSelectNotes->value()) { string temp = pRec->getField(NOTES); for (size_t n = 0; n < temp.length(); n++) if (temp[n] == '\r' || temp[n] == '\n') temp[n] = '-'; fprintf (txtFile, ",\"%s\"", temp.c_str()); } if (btnSelectSerialIN->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(SRX)); if (btnSelectSerialOUT->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STX)); if (btnSelectXchgIn->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(XCHG1)); if (btnSelectMyXchg->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MYXCHG)); if (btnSelectClass->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CLASS)); if (btnSelectSection->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(ARRL_SECT)); if (btnSelectOperator->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(OP_CALL)); if (btnSelectStaCall->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STA_CALL)); if (btnSelectStaGrid->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MY_GRID)); if (btnSelectStaCity->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MY_CITY)); if (btnSelectCheck->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CHECK)); if (btnSelectAge->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(AGE)); if (btnSelect_1010->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TEN_TEN)); fprintf (txtFile, "%s", szEOL); pRec->putField(EXPORT,""); db->qsoUpdRec(i, pRec); } } fclose (txtFile); } return 0; } // text file in fixed fields void cTextFile::writeTXTHeader(FILE *txtFile) { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%-10s", "DATE_ON"); if (btnSelectQSOdateOff->value())fprintf (txtFile, "%-10s", "DATE_OFF"); if (btnSelectTimeON->value()) fprintf (txtFile, "%-8s", "ON"); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%-8s", "OFF"); if (btnSelectCall->value()) fprintf (txtFile, "%-10s", "CALL"); if (btnSelectName->value()) fprintf (txtFile, "%-15s", "NAME"); if (btnSelectBand->value()) fprintf (txtFile, "%-7s", "BAND"); if (btnSelectFreq->value()) fprintf (txtFile, "%-12s", "FREQ"); if (btnSelectMode->value()) fprintf (txtFile, "%-8s", "MODE"); if (btnSelectTX_pwr->value()) fprintf (txtFile, "%-8s", "TX_PWR"); if (btnSelectRSTsent->value()) fprintf (txtFile, "%-6s", "RSTX"); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%-6s", "RSTR"); if (btnSelectQth->value()) fprintf (txtFile, "%-20s", "QTH"); if (btnSelectState->value()) fprintf (txtFile, "%-5s", "ST"); if (btnSelectProvince->value()) fprintf (txtFile, "%-5s", "PR"); if (btnSelectCountry->value()) fprintf (txtFile, "%-15s", "CNTRY"); if (btnSelectCNTY->value()) fprintf (txtFile, "%-8s", "CNTY"); if (btnSelectDXCC->value()) fprintf (txtFile, "%-8s", "DXCC"); if (btnSelectCQZ->value()) fprintf (txtFile, "%-8s", "CQZONE"); if (btnSelectIOTA->value()) fprintf (txtFile, "%-8s", "IOTA"); if (btnSelectCONT->value()) fprintf (txtFile, "%-8s", "CONT"); if (btnSelectITUZ->value()) fprintf (txtFile, "%-8s", "ITUZ"); if (btnSelectLOC->value()) fprintf (txtFile, "%-15s", "GRIDSQUARE"); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%-10s", "QSLR"); if (btnSelectQSLsent->value()) fprintf (txtFile, "%-10s", "QSLS"); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, "%-10s", "EQSLR"); if (btnSelecteQSLsent->value()) fprintf (txtFile, "%-10s", "EQSLS"); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, "%-10s", "LOTWR"); if (btnSelectLOTWsent->value()) fprintf (txtFile, "%-10s", "LOTWS"); if (btnSelectNotes->value()) fprintf (txtFile, "%-80s", "NOTES"); if (btnSelectSerialIN->value()) fprintf (txtFile, "%-7s", "SRX"); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%-7s", "STX"); if (btnSelectXchgIn->value()) fprintf (txtFile, "%-15s", "XCHG1"); if (btnSelectMyXchg->value()) fprintf (txtFile, "%-15s", "MYXCHG"); if (btnSelectClass->value()) fprintf (txtFile, "%-15s", "CLASS"); if (btnSelectSection->value()) fprintf (txtFile, "%-15s", "ARRL_SECT"); if (btnSelectOperator->value()) fprintf (txtFile, "%-15s", "OPER"); if (btnSelectStaCall->value()) fprintf (txtFile, "%-15s", "STA_CALL"); if (btnSelectStaGrid->value()) fprintf (txtFile, "%-15s", "STA_GRID"); if (btnSelectStaCity->value()) fprintf (txtFile, "%-15s", "STA_CITY"); if (btnSelectCheck->value()) fprintf (txtFile, "%-15s", "CHECK"); if (btnSelectAge->value()) fprintf (txtFile, "%-15s", "AGE"); if (btnSelect_1010->value()) fprintf (txtFile, "%-15s", "10-10"); fprintf (txtFile, "%s", szEOL); } int cTextFile::writeTXTFile (const char *fname, cQsoDb *db) { cQsoRec *pRec = (cQsoRec *)0; FILE *txtFile = fl_fopen (fname, "w"); if (!txtFile) return 1; if (txtFile) { writeTXTHeader(txtFile); for (int i = 0; i < db->nbrRecs(); i++) { pRec = db->getRec(i); if (pRec->getField(EXPORT)[0] == 'E') { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%-10s", pRec->getField(QSO_DATE)); if (btnSelectQSOdateOff->value()) fprintf (txtFile, "%-10s", pRec->getField(QSO_DATE_OFF)); if (btnSelectTimeON->value()) fprintf (txtFile, "%-8s", pRec->getField(TIME_ON)); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%-8s", pRec->getField(TIME_OFF)); if (btnSelectCall->value()) fprintf (txtFile, "%-10s", pRec->getField(CALL)); if (btnSelectName->value()) fprintf (txtFile, "%-15s", pRec->getField(NAME)); if (btnSelectBand->value()) fprintf (txtFile, "%-7s", pRec->getField(BAND)); if (btnSelectFreq->value()) fprintf (txtFile, "%-12s", pRec->getField(FREQ)); if (btnSelectMode->value()) { if (!adif2submode(pRec->getField(ADIF_MODE)).empty()) fprintf (txtFile, "%-12s", adif2submode(pRec->getField(ADIF_MODE)).c_str()); else fprintf (txtFile, "%-12s", adif2export(pRec->getField(ADIF_MODE)).c_str()); } if (btnSelectTX_pwr->value()) fprintf (txtFile, "%-8s", pRec->getField(TX_PWR)); if (btnSelectRSTsent->value()) fprintf (txtFile, "%-6s", pRec->getField(RST_SENT)); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%-6s", pRec->getField(RST_RCVD)); if (btnSelectQth->value()) fprintf (txtFile, "%-20s", pRec->getField(QTH)); if (btnSelectState->value()) fprintf (txtFile, "%-5s", pRec->getField(STATE)); if (btnSelectProvince->value()) fprintf (txtFile, "%-5s", pRec->getField(VE_PROV)); if (btnSelectCountry->value()) fprintf (txtFile, "%-15s", pRec->getField(COUNTRY)); if (btnSelectCNTY->value()) fprintf (txtFile, "%-8s", pRec->getField(CNTY)); if (btnSelectDXCC->value()) fprintf (txtFile, "%-8s", pRec->getField(DXCC)); if (btnSelectCQZ->value()) fprintf (txtFile, "%-8s", pRec->getField(CQZ)); if (btnSelectIOTA->value()) fprintf (txtFile, "%-8s", pRec->getField(IOTA)); if (btnSelectCONT->value()) fprintf (txtFile, "%-8s", pRec->getField(CONT)); if (btnSelectITUZ->value()) fprintf (txtFile, "%-8s", pRec->getField(ITUZ)); if (btnSelectLOC->value()) fprintf (txtFile, "%-15s", pRec->getField(GRIDSQUARE)); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%-10s", pRec->getField(QSLRDATE)); if (btnSelectQSLsent->value()) fprintf (txtFile, "%-10s", pRec->getField(QSLSDATE)); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, "%-10s", pRec->getField(EQSLRDATE)); if (btnSelecteQSLsent->value()) fprintf (txtFile, "%-10s", pRec->getField(EQSLSDATE)); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, "%-10s", pRec->getField(LOTWRDATE)); if (btnSelectLOTWsent->value()) fprintf (txtFile, "%-10s", pRec->getField(LOTWSDATE)); if (btnSelectNotes->value()) { string temp = pRec->getField(NOTES); for (size_t n = 0; n < temp.length(); n++) if (temp[n] == '\n') temp[n] = ';'; fprintf (txtFile, "%-80s", temp.c_str()); } if (btnSelectSerialIN->value()) fprintf (txtFile, "%-7s", pRec->getField(SRX)); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%-7s", pRec->getField(STX)); if (btnSelectXchgIn->value()) fprintf (txtFile, "%-15s", pRec->getField(XCHG1)); if (btnSelectMyXchg->value()) fprintf (txtFile, "%-15s", pRec->getField(MYXCHG)); if (btnSelectClass->value()) fprintf (txtFile, "%-15s", pRec->getField(CLASS)); if (btnSelectSection->value()) fprintf (txtFile, "%-15s", pRec->getField(ARRL_SECT)); if (btnSelectOperator->value()) fprintf (txtFile, "%-15s", pRec->getField(OP_CALL)); if (btnSelectStaCall->value()) fprintf (txtFile, "%-15s", pRec->getField(STA_CALL)); if (btnSelectStaGrid->value()) fprintf (txtFile, "%-15s", pRec->getField(MY_GRID)); if (btnSelectStaCity->value()) fprintf (txtFile, "%-15s", pRec->getField(MY_CITY)); if (btnSelectCheck->value()) fprintf (txtFile, "%-15s", pRec->getField(CHECK)); if (btnSelectAge->value()) fprintf (txtFile, "%-15s", pRec->getField(AGE)); if (btnSelect_1010->value()) fprintf (txtFile, "%-15s", pRec->getField(TEN_TEN)); fprintf (txtFile, "%s", szEOL); pRec->putField(EXPORT,""); db->qsoUpdRec(i, pRec); } } fclose (txtFile); } return 0; } fldigi-4.1.06/src/logbook/counties.cxx0000644000175000017500000003347513472115777014613 00000000000000// ---------------------------------------------------------------------------- // counties.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // Extracted from FIPS 2010 census data #include #include #include "main.h" #include "counties.h" #include "contest.h" #include "configuration.h" #include "debug.h" #include "strutil.h" //---------------------------------------------------------------------- Cstates states; std::vector vec_SQSO; std::vector vec_6QP; std::vector vec_7QP; void load_from_string(std::string &str, vector &vec) { size_t ptr1 = 0; size_t ptr2 = 0; size_t ptr3 = 0; std::string line; STATE_COUNTY_QUAD scq; vec.clear(); // eat first line ptr1 = str.find("\n"); line = str.substr(ptr1); LOG_INFO("%s data read from internal data string", (&vec == &vec_SQSO ? "SQSO" : &vec == &vec_6QP ? "NEQP" : "7QP")); ptr1++; ptr2 = str.find("\n", ptr1); while (ptr2 != std::string::npos) { line = str.substr(ptr1, ptr2 - ptr1); if (line.empty()) break; ptr3 = line.find(","); scq.state = line.substr(0,ptr3); line.erase(0, ptr3 + 1); ptr3 = line.find(","); scq.ST = line.substr(0,ptr3); line.erase(0, ptr3 + 1); ptr3 = line.find(","); scq.county = line.substr(0,ptr3); line.erase(0, ptr3 + 1); scq.CTY = line; if (!scq.ST.empty()) vec.push_back(scq); ptr1 = ptr2 + 1; ptr2 = str.find("\n", ptr1); } LOG_INFO("Read %d records", (int)vec.size()); } void load_from_file( std::string &fname, vector &vec) { std::ifstream csvfile(fname.c_str()); if (!csvfile) return; vec.clear(); std::string line; line.reserve(1024); char str[1024]; STATE_COUNTY_QUAD scq; // eat the header line memset(str, 0, 1024); csvfile.getline(str, 1024); LOG_INFO("%s data read from %s", (&vec == &vec_SQSO ? "SQSO" : &vec == &vec_6QP ? "NEQP" : "7QP"), fname.c_str()); size_t ptr = 0; while (!csvfile.eof()) { memset(str, 0, 1024); csvfile.getline(str, 1024); line = str; if (line.empty()) break; ptr = line.find(","); scq.state = line.substr(0,ptr); line.erase(0, ptr + 1); ptr = line.find(","); scq.ST = line.substr(0,ptr); line.erase(0, ptr + 1); ptr = line.find(","); scq.county = line.substr(0,ptr); line.erase(0, ptr + 1); scq.CTY = line; if (!scq.ST.empty()) vec.push_back(scq); } csvfile.close(); LOG_INFO("Read %d records", (int)vec.size()); } void load_SQSO() { std::string cnty_file = DATA_dir; cnty_file.append("SQSO.txt"); std::ifstream csvfile(cnty_file.c_str()); if (!csvfile) { std::string str = szSQSO; load_from_string( str, vec_SQSO ); return; } csvfile.close(); load_from_file( cnty_file, vec_SQSO ); } void load_7qp() { std::string cnty_file = DATA_dir; cnty_file.append("7QP.txt"); std::ifstream csvfile(cnty_file.c_str()); if (!csvfile) { std::string str = sz7QP; load_from_string( str, vec_7QP ); return; } csvfile.close(); load_from_file( cnty_file, vec_7QP ); } void load_neqp() { std::string cnty_file = DATA_dir; cnty_file.append("NEQP.txt"); std::ifstream csvfile(cnty_file.c_str()); if (!csvfile) { std::string str = szNEQP; load_from_string(str, vec_6QP); return; } csvfile.close(); load_from_file( cnty_file, vec_6QP ); } void save_SQSO() { std::string cnty_file = DATA_dir; cnty_file.append("SQSO.txt"); std::ofstream csvfile(cnty_file.c_str()); if (!csvfile) { // std::cout << "cannot create " << cnty_file << std::endl; return; } csvfile << "State/Province, ST/PR, County/City/Disrict, CCD" << std::endl; for (size_t n = 0; n < vec_SQSO.size(); n++ ) csvfile << vec_SQSO[n].state << "," << vec_SQSO[n].ST << "," << vec_SQSO[n].county << "," << vec_SQSO[n].CTY << std::endl; csvfile.close(); //std::cout << vec_SQSO.size() << " records written to " << cnty_file << std::endl; } void save_7qp() { std::string cnty_file = DATA_dir; cnty_file.append("7QP.txt"); std::ofstream csvfile(cnty_file.c_str()); if (!csvfile) { // std::cout << "cannot create " << cnty_file << std::endl; return; } csvfile << "State, ST, County/City, CC" << std::endl; for (size_t n = 0; n < vec_7QP.size(); n++) csvfile << vec_7QP[n].state << "," << vec_7QP[n].ST << "," << vec_7QP[n].county << "," << vec_7QP[n].CTY << std::endl; csvfile.close(); //std::cout << vec_7QP.size() << " records written to " << cnty_file << std::endl; } void save_neqp() { std::string cnty_file = DATA_dir; cnty_file.append("NEQP.txt"); std::ofstream csvfile(cnty_file.c_str()); if (!csvfile) { // std::cout << "cannot create " << cnty_file << std::endl; return; } csvfile << "State, ST, County/City, CC" << std::endl; for (size_t n = 0; n < vec_6QP.size(); n++) csvfile << vec_6QP[n].state << "," << vec_6QP[n].ST << "," << vec_6QP[n].county << "," << vec_6QP[n].CTY << std::endl; csvfile.close(); //std::cout << vec_6QP.size() << " records written to " << cnty_file << std::endl; } void save_counties() { save_SQSO(); save_7qp(); save_neqp(); } void load_counties() { load_SQSO(); load_7qp(); load_neqp(); } //---------------------------------------------------------------------- bool Cstates::valid_county( string st, string cnty ) { string ST = ucasestr(st); string CNTY = ucasestr(cnty); string dST, dCNTY, dCOUNTY; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (size_t n = 0; n < vec_7QP.size(); n++) { dST = ucasestr(vec_7QP[n].ST); dCNTY = ucasestr(vec_7QP[n].CTY); dCOUNTY = ucasestr(vec_7QP[n].county); if ( ST != dST ) continue; if (CNTY == dCNTY) return true; if (CNTY == dCOUNTY) return true; } } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (size_t n = 0; n < vec_6QP.size(); n++) { dST = ucasestr(vec_6QP[n].ST); dCNTY = ucasestr(vec_6QP[n].CTY); dCOUNTY = ucasestr(vec_6QP[n].county); if ( ST != dST ) continue; if (CNTY == dCNTY) return true; if (CNTY == dCOUNTY) return true; } } else { for (size_t n = 0; n < vec_SQSO.size(); n++) { dST = ucasestr(vec_SQSO[n].ST); dCNTY = ucasestr(vec_SQSO[n].CTY); dCOUNTY = ucasestr(vec_SQSO[n].county); if ( ST != dST ) continue; if (CNTY == dCNTY) return true; if (CNTY == dCOUNTY) return true; } } return false; } const string Cstates::names() { string _names = vec_SQSO[0].state; string _st = vec_SQSO[0].ST; for (size_t n = 0; n < vec_SQSO.size(); n++) { if (_st != vec_SQSO[n].ST && !vec_SQSO[n].ST.empty()) { _names.append("|").append(vec_SQSO[n].state); _st = vec_SQSO[n].ST; } } return _names; } const string Cstates::state_short(string ST) // ST can be either short or long form { for (size_t n = 0; n < vec_SQSO.size(); n++) if (ST == vec_SQSO[n].ST || ST == vec_SQSO[n].state) return vec_SQSO[n].ST; return ""; } const string Cstates::state(string ST) // ST can be either short or long form { for (size_t n = 0; n < vec_SQSO.size(); n++) if (ST == vec_SQSO[n].ST || ST == vec_SQSO[n].state) return vec_SQSO[n].state; return ""; } const string Cstates::counties(string ST) { string _counties = ""; if (ST == "NIL") return _counties; size_t n = 0; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (n = 0; n < vec_7QP.size(); n++) { if (ST == vec_7QP[n].ST || ST == vec_7QP[n].state) { ST = vec_7QP[n].ST; if (!_counties.empty() ) _counties.append("|"); _counties.append(vec_7QP[n].county); continue; } if (!_counties.empty() && ST != vec_7QP[n].ST && ST != vec_7QP[n].state ) break; } } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (size_t n = 0; n < vec_6QP.size(); n++) { if (ST == vec_6QP[n].ST || ST == vec_6QP[n].state) { ST = vec_6QP[n].ST; if (!_counties.empty() ) _counties.append("|"); _counties.append(vec_6QP[n].county); continue; } if (!_counties.empty() && ST != vec_6QP[n].ST && ST != vec_6QP[n].state ) break; } } else { for (n = 0; n < vec_SQSO.size(); n++) { if (ST == vec_SQSO[n].ST || ST == vec_SQSO[n].state) { ST = vec_SQSO[n].ST; if (!_counties.empty() ) _counties.append("|"); _counties.append(vec_SQSO[n].county); continue; } if (!_counties.empty() && ST != vec_SQSO[n].ST && ST != vec_SQSO[n].state ) break; } } return _counties; } const string Cstates::cnty_short( string st, string cnty) // st/cnty can be either short or long { string ST = ucasestr(st); string CNTY = ucasestr(cnty); string dSTATE, dST, dCNTY, dCOUNTY; string answer = ""; size_t n = 0; bool OK = false; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (n = 0; n < vec_7QP.size(); n++) { dST = ucasestr(vec_7QP[n].ST); dSTATE = ucasestr(vec_7QP[n].state); if (ST == dST) {OK = true; break;} if (ST == dSTATE) { OK = true; break; } } if (!OK) return answer; ST = vec_7QP[n].ST; for (size_t k = n; ST == vec_7QP[k].ST, k < vec_7QP.size(); k++) { dCNTY = ucasestr(vec_7QP[k].CTY); dCOUNTY = ucasestr(vec_7QP[k].county); if (CNTY == dCNTY) { answer = vec_7QP[k].CTY; break; } if (CNTY == dCOUNTY) { answer = vec_7QP[k].CTY; break; } } } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (n = 0; n < vec_6QP.size(); n++) { dST = ucasestr(vec_6QP[n].ST); dSTATE = ucasestr(vec_6QP[n].state); if (ST == dST) {OK = true; break;} if (ST == dSTATE) { OK = true; break; } } if (!OK) return answer; ST = vec_6QP[n].ST; for (size_t k = n; ST == vec_6QP[k].ST, k < vec_6QP.size(); k++) { dCNTY = ucasestr(vec_6QP[k].CTY); dCOUNTY = ucasestr(vec_6QP[k].county); if (CNTY == dCNTY) { answer = vec_6QP[k].CTY; break; } if (CNTY == dCOUNTY) { answer = vec_6QP[k].CTY; break; } } } else { for (n = 0; n < vec_SQSO.size(); n++) { dST = ucasestr(vec_SQSO[n].ST); dSTATE = ucasestr(vec_SQSO[n].state); if (ST == dST) {OK = true; break;} if (ST == dSTATE) { OK = true; break; } } if (!OK) return answer; ST = vec_SQSO[n].ST; for (size_t k = n; ST == vec_SQSO[k].ST, k < vec_SQSO.size(); k++) { dCNTY = ucasestr(vec_SQSO[k].CTY); dCOUNTY = ucasestr(vec_SQSO[k].county); if (CNTY == dCNTY) { answer = vec_SQSO[k].CTY; break; } if (CNTY == dCOUNTY) { answer = vec_SQSO[k].CTY; break; } } } return answer; } const string Cstates::county( string st, string cnty) // st/cnty can be either short or long { string ST = ucasestr(st); string CNTY = ucasestr(cnty); string dST, dCNTY, dCOUNTY; size_t n = 0; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (n = 0; n < vec_7QP.size(); n++) { dST = ucasestr(vec_7QP[n].ST); if (ST == dST) break; } if (ST != dST) return ""; ST = vec_7QP[n].ST; for (size_t k = n; ST == vec_7QP[k].ST, k < vec_7QP.size(); k++) { dCNTY = ucasestr(vec_7QP[k].CTY); dCOUNTY = ucasestr(vec_7QP[k].county); if (CNTY == dCNTY) return vec_7QP[k].county; if (CNTY == dCOUNTY) return vec_7QP[k].county; } return ""; } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (n = 0; n < vec_6QP.size(); n++) { dST = ucasestr(vec_6QP[n].ST); if (ST == dST) break; } if (ST != dST) return ""; ST = vec_6QP[n].ST; for (size_t k = n; ST == vec_6QP[k].ST, k < vec_6QP.size(); k++) { if (vec_6QP[k].ST.empty()) return ""; dCNTY = ucasestr(vec_6QP[k].CTY); dCOUNTY = ucasestr(vec_6QP[k].county); if (CNTY == dCNTY) return vec_6QP[k].county; if (CNTY == dCOUNTY) return vec_6QP[k].county; } return ""; } else { for (n = 0; !vec_SQSO[n].ST.empty(); n++) { dST = ucasestr(vec_SQSO[n].ST); if (ST == dST) break; } if (ST != dST) return ""; ST = vec_SQSO[n].ST; for (size_t k = n; ST == vec_SQSO[k].ST, k < vec_SQSO.size(); k++) { if (vec_SQSO[k].ST.empty()) return ""; dCNTY = ucasestr(vec_SQSO[k].CTY); dCOUNTY = ucasestr(vec_SQSO[k].county); if (CNTY == dCNTY) return vec_SQSO[k].county; if (CNTY == dCOUNTY) return vec_SQSO[k].county; } return ""; } return ""; } static string __counties; const string counties() { load_counties(); if (vec_SQSO.empty()) return ""; __counties.clear(); for (size_t n = 0; n < vec_SQSO.size(); n++ ) { __counties.append(vec_SQSO[n].ST).append(" ").append(vec_SQSO[n].county); if (n < (vec_SQSO.size() - 1)) __counties.append("|"); } return __counties; } /* const string seven_qp_counties() { load_7qp(); if (vec_7QP.empty()) return ""; __counties.clear(); for (size_t n = 0; n < vec_7QP.size(); n++ ) { __counties.append(vec_7QP[n].ST).append(" ").append(vec_7QP[n].county).append("|"); if (n < (vec_7QP.size() - 1)) __counties.append("|"); } return __counties; } const string six_qp_counties() { load_neqp(); if (vec_6QP.empty()) return ""; __counties.clear(); for (size_t n = 0; n < vec_6QP.size(); n++ ) { __counties.append(vec_6QP[n].ST).append(" ").append(vec_6QP[n].county).append("|"); if (n < (vec_6QP.size() - 1)) __counties.append("|"); } return __counties; } */ fldigi-4.1.06/src/logbook/date.cxx0000644000175000017500000001570113472115777013667 00000000000000// ---------------------------------------------------------------------------- // // Date.cxx date class for Fast Light Took Kit // // Copyright (C) 1998 David Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "date.h" using namespace std; const int Date::mdays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; const int Date::jdays[2][13] = { { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; const char *Date::month_name[] = { "January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; void Date::today() { time_t t; struct tm *now; time( &t ); now = localtime( &t ); year = now->tm_year + 1900; month = now->tm_mon + 1; day = now->tm_mday; } Date::Date() { today(); fmt = 0; } Date::Date( int m, int d, int y ) { setDate( m, d, y ); fmt = 1; } void Date::setDate( int mm, int dd, int yy ) { if( isvalid( mm, dd, yy ) ) { year = yy; month = mm; day = dd; } else today(); } void Date::setDate( Date &dt ) { year = dt.year; month = dt.month; day = dt.day; } void Date::setFormat( int iFmt ) { fmt = iFmt; } void Date::Year( int y ) { year = y; } int Date::Year() { return year; } void Date::Month( int m ) { month = m; } int Date::Month() { return month; } void Date::Day( int d ) { day = d; } int Date::Day() { return day; } bool Date::leapYear( int y ) { if( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) ) return true; return false; } bool Date::isvalid( int m, int d, int y ) { if( y > 2035 ) return false; if( m < 1 || m > 12 ) return false; if( d < 1 ) return false; if( leapYear( y ) ){ if( m == 2 && d > 29 ) return false; else return true; } if( d > mdays[m] ) return false; return true; } int Date::daysinmonth (int month, int leap) { /* Validate the month. */ if (month < JANUARY || month > DECEMBER) return -1; /* Return 28, 29, 30, or 31 based on month/leap. */ switch (month) { case FEBRUARY: return leap ? 29 : 28; default: return mdays[month]; } } int Date::dayofyear (int year, int mon, int mday) { /* Return day of year. */ return mday + jdays[isleapyear (year) ? 1 : 0][mon]; } int Date::dayofepoch (int year, int mon, int mday) { int doe; int era, cent, quad, rest; /* break down the year into 400, 100, 4, and 1 year multiples */ rest = year - 1; quad = rest / 4; rest %= 4; cent = quad / 25; quad %= 25; era = cent / 4; cent %= 4; /* set up doe */ doe = dayofyear (year, mon, mday); doe += era * (400 * 365 + 97); doe += cent * (100 * 365 + 24); doe += quad * (4 * 365 + 1); doe += rest * 365; return doe; } int Date::dayofweek (int year, int mon, int mday) { return dayofepoch (year, mon, mday) % 7; } void Date::previous_month () { if (month == 1) { month = 12; year--; } else month--; while ((day >= 1) && (!datevalid ())) day--; } void Date::next_month () { if (month == 12) { month = 1; year++; } else month++; while ((day >= 1) && (!datevalid ())) day--; } void Date::previous_year () { if (month == 2 && day == 29) day = 28; year--; } void Date::next_year () { if (month == 2 && day == 29) day = 28; year++; } char *Date::szDate (int fmt) { static char temp[20]; char szMonth[10]; switch (fmt) { case 1 : snprintf (temp, sizeof(temp), "%02d/%02d/%02d", month, day, year > 1999 ? year - 2000 : year - 1900); break; case 2 : snprintf (temp, sizeof(temp), "%4d%02d%02d", year, month, day); break; case 3 : snprintf (temp, sizeof(temp), "%s %2d, %4d", month_name[month - 1], day, year); break; case 4 : strcpy (szMonth, month_name [month - 1]); szMonth[3] = 0; snprintf (temp, sizeof(temp), "%s %2d, %4d", szMonth, day, year); break; case 5 : strcpy (szMonth, month_name [month - 1]); szMonth[3] = 0; snprintf (temp, sizeof(temp), "%02d %s %4d", day, szMonth, year); break; case 0 : default : snprintf (temp, sizeof(temp), "%02d/%02d/%04d", month, day, year); break; } return temp; } char *Date::szDate () { return szDate (fmt); } // operator functions ostream &operator<<( ostream &output, Date &d ) { output << d.szDate (); return output; } bool Date::endOfMonth( int d ) { if( month == 2 && leapYear( year ) ) return (d == 29 ); // last day of Feb in leap year else return (d == mdays[ month ] ); } void Date::helpIncrement() { if( endOfMonth( day ) && month == 12 ) { // end year day = 1; month = 1; ++year; } else if ( endOfMonth( day ) ) { day = 1; ++month; } else ++day; } Date &Date::operator++() { helpIncrement(); return *this; // reference return to create an lvalue } Date Date::operator++( int ) { Date temp = *this; helpIncrement(); return temp; // return non-increment, saved temporary object } const Date &Date::operator+=( int ndays ) { for( int i = 0; i < ndays; i++ ) helpIncrement(); return *this; // enables cascading } bool Date::operator==( const Date &d ) { if( this->year != d.year ) return false; if( this->month != d.month ) return false; if( this->day != d.day ) return false; return true; } bool Date::operator!=( const Date &d ) { return ( !( *this == d ) ); } bool Date::operator<( const Date &d ) { if( this->year < d.year ) return true; if( this->year > d.year ) return false; if( this->month < d.month ) return true; if( this->month > d.month ) return false; if( this->day < d.day ) return true; return false; } bool Date::operator>( const Date &d ) { if( *this < d ) return false; if( *this == d ) return false; return true; } void Date::operator=( const Date &d ) { this->year = d.year; this->month = d.month; this->day = d.day; } double Date::dJulian () { int DaysInYear = 365; if (leapYear ()) DaysInYear++; return ( year + 1.0 * (dayofyear (year, month, day) - 1) / DaysInYear); } fldigi-4.1.06/src/logbook/county_lists.cxx0000664000175000017500000022175313507402064015504 00000000000000// ---------------------------------------------------------------------------- // county lists // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "counties.h" //std::string strSQSO const char *szSQSO = "\ State/Province, ST/PR, County/City/District, CCD\n\ NIL,--,none\n\ Alaska,AK,AK1st (SE),SE\n\ ,AK,AK2nd (NW),NW\n\ ,AK,AK3rd (SC),SC\n\ ,AK,AK4th (C),C\n\ Alabama,AL,Autauga,AUTA\n\ ,AL,Baldwin,BALD\n\ ,AL,Barbour,BARB\n\ ,AL,Bibb,BIBB\n\ ,AL,Blount,BLOU\n\ ,AL,Bullock,BULL\n\ ,AL,Butler,BUTL\n\ ,AL,Calhoun,CHOU\n\ ,AL,Chambers,CHMB\n\ ,AL,Cherokee,CKEE\n\ ,AL,Chilton,CHIL\n\ ,AL,Choctaw,CHOC\n\ ,AL,Clarke,CLRK\n\ ,AL,Clay,CLAY\n\ ,AL,Cleburne,CLEB\n\ ,AL,Coffee,COFF\n\ ,AL,Colbert,COLB\n\ ,AL,Conecuh,CONE\n\ ,AL,Coosa,COOS\n\ ,AL,Covington,COVI\n\ ,AL,Crenshaw,CREN\n\ ,AL,Cullman,CULM\n\ ,AL,Dale,DALE\n\ ,AL,Dallas,DLLS\n\ ,AL,DeKalb,DKLB\n\ ,AL,Elmore,ELMO\n\ ,AL,Escambia,ESCA\n\ ,AL,Etowah,ETOW\n\ ,AL,Fayette,FAYE\n\ ,AL,Franklin,FRNK\n\ ,AL,Geneva,GENE\n\ ,AL,Greene,GREE\n\ ,AL,Hale,HALE\n\ ,AL,Henry,HNRY\n\ ,AL,Houston,HOUS\n\ ,AL,Jackson,JKSN\n\ ,AL,Jefferson,JEFF\n\ ,AL,Lamar,LAMA\n\ ,AL,Lauderdale,LAUD\n\ ,AL,Lawrence,LAWR\n\ ,AL,Lee,LEE\n\ ,AL,Limestone,LIME\n\ ,AL,Lowndes,LOWN\n\ ,AL,Macon,MACO\n\ ,AL,Madison,MDSN\n\ ,AL,Marengo,MRGO\n\ ,AL,Marion,MARI\n\ ,AL,Marshall,MRSH\n\ ,AL,Mobile,MOBI\n\ ,AL,Monroe,MNRO\n\ ,AL,Montgomery,MGMY\n\ ,AL,Morgan,MORG\n\ ,AL,Perry,PERR\n\ ,AL,Pickens,PICK\n\ ,AL,Pike,PIKE\n\ ,AL,Randolph,RAND\n\ ,AL,Russell,RSSL\n\ ,AL,Shelby,SHEL\n\ ,AL,St. Clair,SCLR\n\ ,AL,Sumter,SUMT\n\ ,AL,Talladega,TDEG\n\ ,AL,Tallapoosa,TPOO\n\ ,AL,Tuscaloosa,TUSC\n\ ,AL,Walker,WLKR\n\ ,AL,Washington,WASH\n\ ,AL,Wilcox,WLCX\n\ ,AL,Winston,WINS\n\ Arizona,AZ,Apache,APH\n\ ,AZ,Cochise,CHS\n\ ,AZ,Coconino,CNO\n\ ,AZ,Gila,GLA\n\ ,AZ,Graham,GHM\n\ ,AZ,Greenlee,GLE\n\ ,AZ,La Paz,LPZ\n\ ,AZ,Maricopa,MCP\n\ ,AZ,Mohave,MHV\n\ ,AZ,Navajo,NVO\n\ ,AZ,Pima,PMA\n\ ,AZ,Pinal,PNL\n\ ,AZ,Santa Cruz,SCZ\n\ ,AZ,Yavapai,YVP\n\ ,AZ,Yuma,YMA\n\ Arkansas,AR,Arkansas,ARKA\n\ ,AR,Ashley,ASHL\n\ ,AR,Baxter,BAXT\n\ ,AR,Benton,BENT\n\ ,AR,Boone,BOON\n\ ,AR,Bradley,BRAD\n\ ,AR,Calhoun,CALH\n\ ,AR,Carroll,CARR\n\ ,AR,Chicot,CHIC\n\ ,AR,Clark,CLRK\n\ ,AR,Clay,CLAY\n\ ,AR,Cleburne,CLEB\n\ ,AR,Cleveland,CLEV\n\ ,AR,Columbia,COLU\n\ ,AR,Conway,CONW\n\ ,AR,Craighead,CRAG\n\ ,AR,Crawford,CRAW\n\ ,AR,Crittenden,CRIT\n\ ,AR,Cross,CROS\n\ ,AR,Dallas,DALL\n\ ,AR,Desha,DESH\n\ ,AR,Drew,DREW\n\ ,AR,Faulkner,FAUL\n\ ,AR,Franklin,FRNK\n\ ,AR,Fulton,FULT\n\ ,AR,Garland,GARL\n\ ,AR,Grant,GRNT\n\ ,AR,Greene,GREN\n\ ,AR,Hempstead,HEMP\n\ ,AR,Hot Spring,HSPR\n\ ,AR,Howard,HOWA\n\ ,AR,Independence,INDE\n\ ,AR,Izard,IZRD\n\ ,AR,Jackson,JACK\n\ ,AR,Jefferson,JEFF\n\ ,AR,Johnson,JOHN\n\ ,AR,Lafayette,LAFA\n\ ,AR,Lawrence,LAWR\n\ ,AR,Lee,LEE\n\ ,AR,Lincoln,LINC\n\ ,AR,Little River,LRVR\n\ ,AR,Logan,LOGN\n\ ,AR,Lonoke,LONO\n\ ,AR,Madison,MADI\n\ ,AR,Marion,MARI\n\ ,AR,Miller,MILL\n\ ,AR,Mississippi,MISS\n\ ,AR,Monroe,MONR\n\ ,AR,Montgomery,MTGY\n\ ,AR,Nevada,NEVA\n\ ,AR,Newton,NEWT\n\ ,AR,Ouachita,OUAC\n\ ,AR,Perry,PERR\n\ ,AR,Phillips,PHIL\n\ ,AR,Pike,PIKE\n\ ,AR,Poinsett,POIN\n\ ,AR,Polk,POLK\n\ ,AR,Pope,POPE\n\ ,AR,Prairie,PRAR\n\ ,AR,Pulaski,PULA\n\ ,AR,Randolph,RAND\n\ ,AR,Saline,SALI\n\ ,AR,Scott,SCOT\n\ ,AR,Searcy,SRCY\n\ ,AR,Sebastian,SEBA\n\ ,AR,Sevier,SEVR\n\ ,AR,Sharp,SHRP\n\ ,AR,St. Francis,STFR\n\ ,AR,Stone,STON\n\ ,AR,Union,UNIO\n\ ,AR,Van Buren,VBRN\n\ ,AR,Washington,WASH\n\ ,AR,White,WHIE\n\ ,AR,Woodruff,WOOD\n\ ,AR,Yell,YELL\n\ British Columbia,BC,Abbotsford,ABF\n\ ,BC,Burnaby North-Seymour,BNS\n\ ,BC,Burnaby South,BUS\n\ ,BC,Cariboo-Prince George,CPG\n\ ,BC,Central Okanagan-Similkameen-Nicola,CSN\n\ ,BC,Chilliwack-Hope,CHP\n\ ,BC,Cloverdale-Langley City,CLC\n\ ,BC,Coquitlam-Port Coquitlam,CPC\n\ ,BC,Courtenay-Alberni,COA\n\ ,BC,Cowichan-Malahat-Langford,CML\n\ ,BC,Delta,DEL\n\ ,BC,Esquimalt-Saanich-Sooke,ESQ\n\ ,BC,Fleetwood-Port Kells,FPK\n\ ,BC,Kamloops-Thompson-Cariboo,KTC\n\ ,BC,Kelowna-Lake Country,KEL\n\ ,BC,Kootenay-Columbia,KOC\n\ ,BC,Langley-Aldergrove,LAA\n\ ,BC,Mission-Matsqui-Fraser Canyon,MMF\n\ ,BC,Nanaimo-Ladysmith,NAL\n\ ,BC,New Westminster-Burnaby,NWB\n\ ,BC,North Island-Powell River,NPR\n\ ,BC,North Okanagan-Shuswap,NOS\n\ ,BC,North Vancouver,NVA\n\ ,BC,Pitt Meadows-Maple Ridge,PMM\n\ ,BC,Port Moody-Coquitlam,PMC\n\ ,BC,Prince George-Peace River-Northern Rockies,PPN\n\ ,BC,Richmond Center,RIC\n\ ,BC,Saanich-Gulf Islands,SGI\n\ ,BC,Skeena-Bulkley Valley,SBV\n\ ,BC,South Okanagan-West Kootenay,SWK\n\ ,BC,South Surrey-White Rock,SWR\n\ ,BC,Steveston-Richmond East,STR\n\ ,BC,Surrey Centre,SUC\n\ ,BC,Surrey-Newton,SUN\n\ ,BC,Vancouver Centre,VAC\n\ ,BC,Vancouver East,VAE\n\ ,BC,Vancouver Kingsway,VAK\n\ ,BC,Vancouver Quadra,VAQ\n\ ,BC,Vancouver South,VAS\n\ ,BC,Vancouver-Granville,VAG\n\ ,BC,Victoria,VIC\n\ ,BC,West Vanc,WVS\n\ California,CA,Alameda,ALAM\n\ ,CA,Alpine,ALPI\n\ ,CA,Amador,AMAD\n\ ,CA,Butte,BUTT\n\ ,CA,Calaveras,CALA\n\ ,CA,Colusa,COLU\n\ ,CA,Contra Costa,CCOS\n\ ,CA,Del Norte,DELN\n\ ,CA,El Dorado,ELDO\n\ ,CA,Fresno,FRES\n\ ,CA,Glenn,GLEN\n\ ,CA,Humboldt,HUMB\n\ ,CA,Imperial,IMPE\n\ ,CA,Inyo,INYO\n\ ,CA,Kern,KERN\n\ ,CA,Kings,KING\n\ ,CA,Lake,LAKE\n\ ,CA,Lassen,LASS\n\ ,CA,Los Angeles,LANG\n\ ,CA,Madera,MADE\n\ ,CA,Marin,MARN\n\ ,CA,Mariposa,MARP\n\ ,CA,Mendocino,MEND\n\ ,CA,Merced,MERC\n\ ,CA,Modoc,MODO\n\ ,CA,Mono,MONO\n\ ,CA,Monterey,MONT\n\ ,CA,Napa,NAPA\n\ ,CA,Nevada,NEVA\n\ ,CA,Orange,ORAN\n\ ,CA,Placer,PLAC\n\ ,CA,Plumas,PLUM\n\ ,CA,Riverside,RIVE\n\ ,CA,Sacramento,SACR\n\ ,CA,San Benito,SBEN\n\ ,CA,San Bernardino,SBER\n\ ,CA,San Diego,SDIE\n\ ,CA,San Francisco,SFRA\n\ ,CA,San Joaquin,SJOA\n\ ,CA,San Luis Obispo,SLUI\n\ ,CA,San Mateo,SMAT\n\ ,CA,Santa Barbara,SBAR\n\ ,CA,Santa Clara,SCLA\n\ ,CA,Santa Cruz,SCRU\n\ ,CA,Shasta,SHAS\n\ ,CA,Sierra,SIER\n\ ,CA,Siskiyou,SISK\n\ ,CA,Solano,SOLA\n\ ,CA,Sonoma,SONO\n\ ,CA,Stanislaus,STAN\n\ ,CA,Sutter,SUTT\n\ ,CA,Tehama,TEHA\n\ ,CA,Trinity,TRIN\n\ ,CA,Tulare,TULA\n\ ,CA,Tuolumne,TUOL\n\ ,CA,Ventura,VENT\n\ ,CA,Yolo,YOLO\n\ ,CA,Yuba,YUBA\n\ Colorado,CO,Adams,ADA\n\ ,CO,Alamosa,ALA\n\ ,CO,Arapahoe,ARA\n\ ,CO,Archuleta,ARC\n\ ,CO,Baca,BAC\n\ ,CO,Bent,BEN\n\ ,CO,Boulder,BOU\n\ ,CO,Broomfield,BRO\n\ ,CO,Chaffee,CHA\n\ ,CO,Cheyenne,CHE\n\ ,CO,Clear Creek,CLC\n\ ,CO,Conejos,CON\n\ ,CO,Costilla,COS\n\ ,CO,Crowley,CRO\n\ ,CO,Custer,CUS\n\ ,CO,Delta,DEL\n\ ,CO,Denver,DEN\n\ ,CO,Dolores,DOL\n\ ,CO,Douglas,DOU\n\ ,CO,Eagle,EAG\n\ ,CO,El Paso,ELP\n\ ,CO,Elbert,ELB\n\ ,CO,Fremont,FRE\n\ ,CO,Garfield,GAR\n\ ,CO,Gilpin,GIL\n\ ,CO,Grand,GRA\n\ ,CO,Gunnison,GUN\n\ ,CO,Hinsdale,HIN\n\ ,CO,Huerfano,HUE\n\ ,CO,Jackson,JAC\n\ ,CO,Jefferson,JEF\n\ ,CO,Kiowa,KIO\n\ ,CO,Kit Carson,KIC\n\ ,CO,La Plata,LAP\n\ ,CO,Lake,LAK\n\ ,CO,Larimer,LAR\n\ ,CO,Las Animas,LAA\n\ ,CO,Lincoln,LIN\n\ ,CO,Logan,LOG\n\ ,CO,Mesa,MES\n\ ,CO,Mineral,MIN\n\ ,CO,Moffat,MOF\n\ ,CO,Montezuma,MON\n\ ,CO,Montrose,MOT\n\ ,CO,Morgan,MOR\n\ ,CO,Otero,OTE\n\ ,CO,Ouray,OUR\n\ ,CO,Park,PAR\n\ ,CO,Phillips,PHI\n\ ,CO,Pitkin,PIT\n\ ,CO,Prowers,PRO\n\ ,CO,Pueblo,PUE\n\ ,CO,Rio Blanco,RIB\n\ ,CO,Rio Grande,RIG\n\ ,CO,Routt,ROU\n\ ,CO,Saguache,SAG\n\ ,CO,San Juan,SAJ\n\ ,CO,San Miguel,SAM\n\ ,CO,Sedgwick,SED\n\ ,CO,Summit,SUM\n\ ,CO,Teller,TEL\n\ ,CO,Washington,WAS\n\ ,CO,Weld,WEL\n\ ,CO,Yuma,YUM\n\ Connecticut,CT,Fairfield,FAI\n\ ,CT,Hartford,HAR\n\ ,CT,Litchfield,LIT\n\ ,CT,Middlesex,MIC\n\ ,CT,New Haven,NHV\n\ ,CT,New London,NLN\n\ ,CT,Tolland,TOL\n\ ,CT,Windham,WIN\n\ Delaware,DE,Kent,KDE\n\ ,DE,New Castle,NDE\n\ ,DE,Sussex,SDE\n\ Dist. of Col.,DC,District of Columbia,\n\ Florida,FL,ALACHUA,ALC\n\ ,FL,BAKER,BAK\n\ ,FL,BAY,BAY\n\ ,FL,BRADFORD,BRA\n\ ,FL,BREVARD,BRE\n\ ,FL,BROWARD,BRO\n\ ,FL,CALHOUN,CAH\n\ ,FL,CHARLOTTE,CHA\n\ ,FL,CITRUS,CIT\n\ ,FL,CLAY,CLA\n\ ,FL,COLLIER,CLR\n\ ,FL,COLUMBIA,CLM\n\ ,FL,MIAMI-DADE,DAD\n\ ,FL,DESOTO,DES\n\ ,FL,DIXIE,DIX\n\ ,FL,DUVAL,DUV\n\ ,FL,ESCAMBIA,ESC\n\ ,FL,FLAGLER,FLG\n\ ,FL,FRANKLIN,FRA\n\ ,FL,GADSDEN,GAD\n\ ,FL,GILCHRIST,GIL\n\ ,FL,GLADES,GLA\n\ ,FL,GULF,GUL\n\ ,FL,HAMILTON,HAM\n\ ,FL,HARDEE,HAR\n\ ,FL,HENDRY,HEN\n\ ,FL,HERNANDO,HER\n\ ,FL,HIGHLANDS,HIG\n\ ,FL,HILLSBOROUGH,HIL\n\ ,FL,HOLMES,HOL\n\ ,FL,INDIAN RIVER,IDR\n\ ,FL,JACKSON,JAC\n\ ,FL,JEFFERSON,JEF\n\ ,FL,LAFAYETTE,LAF\n\ ,FL,LAKE,LAK\n\ ,FL,LEE,LEE\n\ ,FL,LEON,LEO\n\ ,FL,LEVY,LEV\n\ ,FL,LIBERTY,LIB\n\ ,FL,MADISON,MAD\n\ ,FL,MANATEE,MTE\n\ ,FL,MARION,MAO\n\ ,FL,MARTIN,MRT\n\ ,FL,MONROE,MON\n\ ,FL,NASSAU,NAS\n\ ,FL,OKALOOSA,OKA\n\ ,FL,OKEECHOBEE,OKE\n\ ,FL,ORANGE,ORA\n\ ,FL,OSCEOLA,OSC\n\ ,FL,PALM BEACH,PAL\n\ ,FL,PASCO,PAS\n\ ,FL,PINELLAS,PIN\n\ ,FL,POLK,POL\n\ ,FL,PUTNAM,PUT\n\ ,FL,SANTA ROSA,SAN\n\ ,FL,SARASOTA,SAR\n\ ,FL,SEMINOLE,SEM\n\ ,FL,ST. JOHNS,STJ\n\ ,FL,ST. LUCIE,STL\n\ ,FL,SUMTER,SUM\n\ ,FL,SUWANNEE,SUW\n\ ,FL,TAYLOR,TAY\n\ ,FL,UNION,UNI\n\ ,FL,VOLUSIA,VOL\n\ ,FL,WAKULLA,WAK\n\ ,FL,WALTON,WAL\n\ ,FL,WASHINGTON,WAG\n\ Georgia,GA,Appling,APPL\n\ ,GA,Atkinson,ATKN\n\ ,GA,Bacon,BACN\n\ ,GA,Baker,BAKR\n\ ,GA,Baldwin,BALD\n\ ,GA,Banks,BANK\n\ ,GA,Barrow,BARR\n\ ,GA,Bartow,BART\n\ ,GA,Ben Hill,BENH\n\ ,GA,Berrien,BERR\n\ ,GA,Bibb,BIBB\n\ ,GA,Bleckley,BLEC\n\ ,GA,Brantley,BRAN\n\ ,GA,Brooks,BROK\n\ ,GA,Bryan,BRYN\n\ ,GA,Bulloch,BULL\n\ ,GA,Burke,BURK\n\ ,GA,Butts,BUTT\n\ ,GA,Calhoun,CALH\n\ ,GA,Camden,CMDN\n\ ,GA,Candler,CAND\n\ ,GA,Carroll,CARR\n\ ,GA,Catoosa,CATO\n\ ,GA,Charlton,CHAR\n\ ,GA,Chatham,CHTM\n\ ,GA,Chattahoochee,CHAT\n\ ,GA,Chattooga,CHGA\n\ ,GA,Cherokee,CHER\n\ ,GA,Clarke,CLKE\n\ ,GA,Clay,CLAY\n\ ,GA,Clayton,CLTN\n\ ,GA,Clinch,CLCH\n\ ,GA,Cobb,COBB\n\ ,GA,Coffee,COFF\n\ ,GA,Colquitt,COLQ\n\ ,GA,Columbia,COLU\n\ ,GA,Cook,COOK\n\ ,GA,Coweta,COWE\n\ ,GA,Crawford,CRAW\n\ ,GA,Crisp,CRIS\n\ ,GA,Dade,DADE\n\ ,GA,Dawson,DAWS\n\ ,GA,Decatur,DECA\n\ ,GA,DeKalb,DKLB\n\ ,GA,Dodge,DODG\n\ ,GA,Dooly,DOOL\n\ ,GA,Dougherty,DHTY\n\ ,GA,Douglas,DOUG\n\ ,GA,Early,EARL\n\ ,GA,Echols,ECHO\n\ ,GA,Effingham,EFFI\n\ ,GA,Elbert,ELBE\n\ ,GA,Emanuel,EMAN\n\ ,GA,Evans,EVAN\n\ ,GA,Fannin,FANN\n\ ,GA,Fayette,FAYE\n\ ,GA,Floyd,FLOY\n\ ,GA,Forsyth,FORS\n\ ,GA,Franklin,FRAN\n\ ,GA,Fulton,FULT\n\ ,GA,Gilmer,GILM\n\ ,GA,Glascock,GLAS\n\ ,GA,Glynn,GLYN\n\ ,GA,Gordon,GORD\n\ ,GA,Grady,GRAD\n\ ,GA,Greene,GREE\n\ ,GA,Gwinnett,GWIN\n\ ,GA,Habersham,HABE\n\ ,GA,Hall,HALL\n\ ,GA,Hancock,HANC\n\ ,GA,Haralson,HARA\n\ ,GA,Harris,HARR\n\ ,GA,Hart,HART\n\ ,GA,Heard,HEAR\n\ ,GA,Henry,HNRY\n\ ,GA,Houston,HOUS\n\ ,GA,Irwin,IRWI\n\ ,GA,Jackson,JACK\n\ ,GA,Jasper,JASP\n\ ,GA,Jeff Davis,JFDA\n\ ,GA,Jefferson,JEFF\n\ ,GA,Jenkins,JENK\n\ ,GA,Johnson,JOHN\n\ ,GA,Jones,JONE\n\ ,GA,Lamar,LAMA\n\ ,GA,Lanier,LANI\n\ ,GA,Laurens,LAUR\n\ ,GA,Lee,LEE\n\ ,GA,Liberty,LIBE\n\ ,GA,Lincoln,LINC\n\ ,GA,Long,LONG\n\ ,GA,Lowndes,LOWN\n\ ,GA,Lumpkin,LUMP\n\ ,GA,McDuffie,MCDU\n\ ,GA,McIntosh,MCIN\n\ ,GA,Macon,MACO\n\ ,GA,Madison,MADI\n\ ,GA,Marion,MARI\n\ ,GA,Meriwether,MERI\n\ ,GA,Miller,MILL\n\ ,GA,Mitchell,MITC\n\ ,GA,Monroe,MNRO\n\ ,GA,Montgomery,MONT\n\ ,GA,Morgan,MORG\n\ ,GA,Murray,MURR\n\ ,GA,Muscogee,MUSC\n\ ,GA,Newton,NEWT\n\ ,GA,Oconee,OCON\n\ ,GA,Oglethorpe,OGLE\n\ ,GA,Paulding,PAUL\n\ ,GA,Peach,PEAC\n\ ,GA,Pickens,PICK\n\ ,GA,Pierce,PIER\n\ ,GA,Pike,PIKE\n\ ,GA,Polk,POLK\n\ ,GA,Pulaski,PULA\n\ ,GA,Putnam,PUTN\n\ ,GA,Quitman,QUIT\n\ ,GA,Rabun,RABU\n\ ,GA,Randolph,RAND\n\ ,GA,Richmond,RICH\n\ ,GA,Rockdale,ROCK\n\ ,GA,Schley,SCHL\n\ ,GA,Screven,SCRE\n\ ,GA,Seminole,SEMI\n\ ,GA,Spalding,SPAL\n\ ,GA,Stephens,STEP\n\ ,GA,Stewart,STWT\n\ ,GA,Sumter,SUMT\n\ ,GA,Talbot,TLBT\n\ ,GA,Taliaferro,TALI\n\ ,GA,Tattnall,TATT\n\ ,GA,Taylor,TAYL\n\ ,GA,Telfair,TELF\n\ ,GA,Terrell,TERR\n\ ,GA,Thomas,THOM\n\ ,GA,Tift,TIFT\n\ ,GA,Toombs,TOOM\n\ ,GA,Towns,TOWN\n\ ,GA,Treutlen,TREU\n\ ,GA,Troup,TROU\n\ ,GA,Turner,TURN\n\ ,GA,Twiggs,TWIG\n\ ,GA,Union,UNIO\n\ ,GA,Upson,UPSO\n\ ,GA,Walker,WLKR\n\ ,GA,Walton,WALT\n\ ,GA,Ware,WARE\n\ ,GA,Warren,WARR\n\ ,GA,Washington,WASH\n\ ,GA,Wayne,WAYN\n\ ,GA,Webster,WEBS\n\ ,GA,Wheeler,WHEE\n\ ,GA,White,WHIT\n\ ,GA,Whitfield,WFLD\n\ ,GA,Wilcox,WCOX\n\ ,GA,Wilkes,WILK\n\ ,GA,Wilkinson,WKSN\n\ ,GA,Worth,WORT\n\ Guam,GU,Guam,\n\ Hawaii,HI,Hawaii-HIL,HIL\n\ ,HI,Hawaii-KOH,KOH\n\ ,HI,Hawaii-KON,KON\n\ ,HI,Hawaii-VOL,VOL\n\ ,HI,Honolulu-HON,HON\n\ ,HI,Honolulu-LHN,LHN\n\ ,HI,Honolulu-PRL,PRL\n\ ,HI,Honolulu-WHN,WHN\n\ ,HI,Kalawao-KAL,KAL\n\ ,HI,Kauai-KAU,KAU\n\ ,HI,Kauai-NII,NII\n\ ,HI,Maui-LAN,LAN\n\ ,HI,Maui-MAU,MAU\n\ ,HI,Maui-MOL,MOL\n\ Idaho,ID,Ada,ADA\n\ ,ID,Adams,ADM\n\ ,ID,Bannock,BAN\n\ ,ID,Bear Lake,BEA\n\ ,ID,Benewah,BEN\n\ ,ID,Bingham,BIN\n\ ,ID,Blaine,BLA\n\ ,ID,Boise,BOI\n\ ,ID,Bonner,BNR\n\ ,ID,Bonneville,BNV\n\ ,ID,Boundary,BOU\n\ ,ID,Butte,BUT\n\ ,ID,Camas,CAM\n\ ,ID,Canyon,CAN\n\ ,ID,Caribou,CAR\n\ ,ID,Cassia,CAS\n\ ,ID,Clark,CLA\n\ ,ID,Clearwater,CLE\n\ ,ID,Custer,CUS\n\ ,ID,Elmore,ELM\n\ ,ID,Franklin,FRA\n\ ,ID,Fremont,FRE\n\ ,ID,Gem,GEM\n\ ,ID,Gooding,GOO\n\ ,ID,Idaho,IDA\n\ ,ID,Jefferson,JEF\n\ ,ID,Jerome,JER\n\ ,ID,Kootenai,KOO\n\ ,ID,Latah,LAT\n\ ,ID,Lemhi,LEM\n\ ,ID,Lewis,LEW\n\ ,ID,Lincoln,LIN\n\ ,ID,Madison,MAD\n\ ,ID,Minidoka,MIN\n\ ,ID,Nez Perce,NEZ\n\ ,ID,Oneida,ONE\n\ ,ID,Owyhee,OWY\n\ ,ID,Payette,PAY\n\ ,ID,Power,POW\n\ ,ID,Shoshone,SHO\n\ ,ID,Teton,TET\n\ ,ID,Twin Falls,TWI\n\ ,ID,Valley,VAL\n\ ,ID,Washington,WAS\n\ Illinois,IL,Adams,ADAM\n\ ,IL,Alexander,ALEX\n\ ,IL,Bond,BOND\n\ ,IL,Boone,BOON\n\ ,IL,Brown,BROW\n\ ,IL,Bureau,BURO\n\ ,IL,Calhoun,CALH\n\ ,IL,Carroll,CARR\n\ ,IL,Cass,CASS\n\ ,IL,Champaign,CHAM\n\ ,IL,Christian,CHRS\n\ ,IL,Clark,CLRK\n\ ,IL,Clay,CLAY\n\ ,IL,Clinton,CLNT\n\ ,IL,Coles,COLE\n\ ,IL,Cook,COOK\n\ ,IL,Crawford,CRAW\n\ ,IL,Cumberland,CUMB\n\ ,IL,DeWitt,DEWT\n\ ,IL,DeKalb,DEKA\n\ ,IL,Douglas,DOUG\n\ ,IL,DuPage,DUPG\n\ ,IL,Edgar,EDGR\n\ ,IL,Edwards,EDWA\n\ ,IL,Effingham,EFFG\n\ ,IL,Fayette,FAYE\n\ ,IL,Ford,FORD\n\ ,IL,Franklin,FRNK\n\ ,IL,Fulton,FULT\n\ ,IL,Gallatin,GALL\n\ ,IL,Greene,GREE\n\ ,IL,Grundy,GRUN\n\ ,IL,Hamilton,HAML\n\ ,IL,Hancock,HANC\n\ ,IL,Hardin,HARD\n\ ,IL,Henderson,HNDR\n\ ,IL,Henry,HENR\n\ ,IL,Iroquois,IROQ\n\ ,IL,Jackson,JACK\n\ ,IL,Jasper,JASP\n\ ,IL,Jefferson,JEFF\n\ ,IL,Jersey,JERS\n\ ,IL,JoDaviess,JODA\n\ ,IL,Johnson,JOHN\n\ ,IL,Kane,KANE\n\ ,IL,Kankakee,KANK\n\ ,IL,Kendall,KEND\n\ ,IL,Knox,KNOX\n\ ,IL,LaSalle,LASA\n\ ,IL,Lake,LAKE\n\ ,IL,Lawrence,LAWR\n\ ,IL,Lee,LEE\n\ ,IL,Livingston,LIVG\n\ ,IL,Logan,LOGN\n\ ,IL,Macon,MACN\n\ ,IL,Macoupin,MCPN\n\ ,IL,Madison,MADN\n\ ,IL,Marion,MARI\n\ ,IL,Marshall,MSHL\n\ ,IL,Mason,MASN\n\ ,IL,Massac,MSSC\n\ ,IL,McDonough,MCDN\n\ ,IL,McHenry,MCHE\n\ ,IL,McLean,MCLN\n\ ,IL,Menard,MNRD\n\ ,IL,Mercer,MRCR\n\ ,IL,Monroe,MNRO\n\ ,IL,Montgomery,MNTG\n\ ,IL,Morgan,MORG\n\ ,IL,Moultrie,MOUL\n\ ,IL,Ogle,OGLE\n\ ,IL,Peoria,PEOR\n\ ,IL,Perry,PERR\n\ ,IL,Piatt,PIAT\n\ ,IL,Pike,PIKE\n\ ,IL,Pope,POPE\n\ ,IL,Pulaski,PULA\n\ ,IL,Putnam,PUTN\n\ ,IL,Randolph,RAND\n\ ,IL,Richland,RICH\n\ ,IL,Rock Island,ROCK\n\ ,IL,Saline,SALI\n\ ,IL,Sangamon,SANG\n\ ,IL,Schuyler,SCHY\n\ ,IL,Scott,SCOT\n\ ,IL,Shelby,SHEL\n\ ,IL,St. Clair,SCLA\n\ ,IL,Stark,STAR\n\ ,IL,Stephenson,STEP\n\ ,IL,Tazewell,TAZW\n\ ,IL,Union,UNIO\n\ ,IL,Vermilion,VERM\n\ ,IL,Wabash,WABA\n\ ,IL,Warren,WARR\n\ ,IL,Washington,WASH\n\ ,IL,Wayne,WAYN\n\ ,IL,White,WHIT\n\ ,IL,Whiteside,WTSD\n\ ,IL,Will,WILL\n\ ,IL,Williamson,WMSN\n\ ,IL,Winnebago,WBGO\n\ ,IL,Woodford,WOOD\n\ Indiana,IN,Adams,INADA\n\ ,IN,Allen,INALL\n\ ,IN,Bartholomew,INBAR\n\ ,IN,Benton,INBEN\n\ ,IN,Blackford,INBLA\n\ ,IN,Boone,INBOO\n\ ,IN,Brown,INBRO\n\ ,IN,Carroll,INCAR\n\ ,IN,Cass,INCAS\n\ ,IN,Clark,INCLR\n\ ,IN,Clay,INCLY\n\ ,IN,Clinton,INCLI\n\ ,IN,Crawford,INCRA\n\ ,IN,Daviess,INDAV\n\ ,IN,De Kalb,INDEK\n\ ,IN,Dearborn,INDEA\n\ ,IN,Decatur,INDEC\n\ ,IN,Delaware,INDEL\n\ ,IN,Dubois,INDUB\n\ ,IN,Elkhart,INELK\n\ ,IN,Fayette,INFAY\n\ ,IN,Floyd,INFLO\n\ ,IN,Fountain,INFOU\n\ ,IN,Franklin,INFRA\n\ ,IN,Fulton,INFUL\n\ ,IN,Gibson,INGIB\n\ ,IN,Grant,INGRA\n\ ,IN,Greene,INGRE\n\ ,IN,Hamilton,INHAM\n\ ,IN,Hancock,INHAN\n\ ,IN,Harrison,INHAR\n\ ,IN,Hendricks,INHND\n\ ,IN,Henry,INHNR\n\ ,IN,Howard,INHOW\n\ ,IN,Huntington,INHUN\n\ ,IN,Jackson,INJAC\n\ ,IN,Jasper,INJAS\n\ ,IN,Jay,INJAY\n\ ,IN,Jefferson,INJEF\n\ ,IN,Jennings,INJEN\n\ ,IN,Johnson,INJOH\n\ ,IN,Knox,INKNO\n\ ,IN,Kosciusko,INKOS\n\ ,IN,La Porte,INLAP\n\ ,IN,Lagrange,INLAG\n\ ,IN,Lake,INLAK\n\ ,IN,Lawrence,INLAW\n\ ,IN,Madison,INMAD\n\ ,IN,Marion,INMRN\n\ ,IN,Marshall,INMRS\n\ ,IN,Martin,INMRT\n\ ,IN,Miami,INMIA\n\ ,IN,Monroe,INMNR\n\ ,IN,Montgomery,INMNT\n\ ,IN,Morgan,INMOR\n\ ,IN,Newton,INNEW\n\ ,IN,Noble,INNOB\n\ ,IN,Ohio,INOHI\n\ ,IN,Orange,INORA\n\ ,IN,Owen,INOWE\n\ ,IN,Parke,INPAR\n\ ,IN,Perry,INPER\n\ ,IN,Pike,INPIK\n\ ,IN,Porter,INPOR\n\ ,IN,Posey,INPOS\n\ ,IN,Pulaski,INPUL\n\ ,IN,Putnam,INPUT\n\ ,IN,Randolph,INRAN\n\ ,IN,Ripley,INRIP\n\ ,IN,Rush,INRUS\n\ ,IN,Scott,INSCO\n\ ,IN,Shelby,INSHE\n\ ,IN,Spencer,INSPE\n\ ,IN,St. Joseph,INSTJ\n\ ,IN,Starke,INSTA\n\ ,IN,Steuben,INSTE\n\ ,IN,Sullivan,INSUL\n\ ,IN,Switzerland,INSWI\n\ ,IN,Tippecanoe,INTPP\n\ ,IN,Tipton,INTPT\n\ ,IN,Union,INUNI\n\ ,IN,Vanderburgh,INVAN\n\ ,IN,Vermillion,INVER\n\ ,IN,Vigo,INVIG\n\ ,IN,Wabash,INWAB\n\ ,IN,Warren,INWRN\n\ ,IN,Warrick,INWRK\n\ ,IN,Washington,INWAS\n\ ,IN,Wayne,INWAY\n\ ,IN,Wells,INWEL\n\ ,IN,White,INWHT\n\ ,IN,Whitley,INWHL\n\ Iowa,IA,Adair,ADR\n\ ,IA,Adams,ADM\n\ ,IA,Allamakee,ALL\n\ ,IA,Appanoose,APP\n\ ,IA,Audubon,AUD\n\ ,IA,Benton,BEN\n\ ,IA,Black Hawk,BKH\n\ ,IA,Boone,BOO\n\ ,IA,Bremer,BRE\n\ ,IA,Buchanan,BUC\n\ ,IA,Buena Vista,BNV\n\ ,IA,Butler,BTL\n\ ,IA,Calhoun,CAL\n\ ,IA,Carroll,CAR\n\ ,IA,Cass,CAS\n\ ,IA,Cedar,CED\n\ ,IA,Cerro Gordo,CEG\n\ ,IA,Cherokee,CHE\n\ ,IA,Chickasaw,CHI\n\ ,IA,Clarke,CLR\n\ ,IA,Clay,CLA\n\ ,IA,Clayton,CLT\n\ ,IA,Clinton,CLN\n\ ,IA,Crawford,CRF\n\ ,IA,Dallas,DAL\n\ ,IA,Davis,DAV\n\ ,IA,Decatur,DEC\n\ ,IA,Delaware,DEL\n\ ,IA,Des Moines,DSM\n\ ,IA,Dickinson,DIC\n\ ,IA,Dubuque,DUB\n\ ,IA,Emmet,EMM\n\ ,IA,Fayette,FAY\n\ ,IA,Floyd,FLO\n\ ,IA,Franklin,FRA\n\ ,IA,Fremont,FRE\n\ ,IA,Greene,GRE\n\ ,IA,Grundy,GRU\n\ ,IA,Guthrie,GUT\n\ ,IA,Hamilton,HAM\n\ ,IA,Hancock,HAN\n\ ,IA,Hardin,HDN\n\ ,IA,Harrison,HRS\n\ ,IA,Henry,HEN\n\ ,IA,Howard,HOW\n\ ,IA,Humboldt,HUM\n\ ,IA,Ida,IDA\n\ ,IA,Iowa,IOW\n\ ,IA,Jackson,JAC\n\ ,IA,Jasper,JAS\n\ ,IA,Jefferson,JEF\n\ ,IA,Johnson,JOH\n\ ,IA,Jones,JON\n\ ,IA,Keokuk,KEO\n\ ,IA,Kossuth,KOS\n\ ,IA,Lee,LEE\n\ ,IA,Linn,LIN\n\ ,IA,Louisa,LOU\n\ ,IA,Lucas,LUC\n\ ,IA,Lyon,LYN\n\ ,IA,Madison,MAD\n\ ,IA,Mahaska,MAH\n\ ,IA,Marion,MRN\n\ ,IA,Marshall,MSL\n\ ,IA,Mills,MIL\n\ ,IA,Mitchell,MIT\n\ ,IA,Monona,MNA\n\ ,IA,Monroe,MOE\n\ ,IA,Montgomery,MTG\n\ ,IA,Muscatine,MUS\n\ ,IA,O'Brien,OBR\n\ ,IA,Osceola,OSC\n\ ,IA,Page,PAG\n\ ,IA,Palo Alto,PLA\n\ ,IA,Plymouth,PLY\n\ ,IA,Pocahontas,POC\n\ ,IA,Polk,POL\n\ ,IA,Pottawattamie,POT\n\ ,IA,Poweshiek,POW\n\ ,IA,Ringgold,RIN\n\ ,IA,Sac,SAC\n\ ,IA,Scott,SCO\n\ ,IA,Shelby,SHE\n\ ,IA,Sioux,SIO\n\ ,IA,Story,STR\n\ ,IA,Tama,TAM\n\ ,IA,Taylor,TAY\n\ ,IA,Union,UNI\n\ ,IA,Van Buren,VAN\n\ ,IA,Wapello,WAP\n\ ,IA,Warren,WAR\n\ ,IA,Washington,WAS\n\ ,IA,Wayne,WAY\n\ ,IA,Webster,WEB\n\ ,IA,Winnebago,WNB\n\ ,IA,Winneshiek,WNS\n\ ,IA,Woodbury,WOO\n\ ,IA,Worth,WOR\n\ ,IA,Wright,WRI\n\ Kansas,KS,Allen,ALL\n\ ,KS,Anderson,AND\n\ ,KS,Atchison,ATC\n\ ,KS,Barber,BAR\n\ ,KS,Barton,BRT\n\ ,KS,Bourbon,BOU\n\ ,KS,Brown,BRO\n\ ,KS,Butler,BUT\n\ ,KS,Chase,CHS\n\ ,KS,Chautauqua,CHT\n\ ,KS,Cherokee,CHE\n\ ,KS,Cheyenne,CHY\n\ ,KS,Clark,CLK\n\ ,KS,Clay,CLY\n\ ,KS,Cloud,CLO\n\ ,KS,Coffey,COF\n\ ,KS,Comanche,COM\n\ ,KS,Cowley,COW\n\ ,KS,Crawford,CRA\n\ ,KS,Decatur,DEC\n\ ,KS,Dickinson,DIC\n\ ,KS,Doniphan,DON\n\ ,KS,Douglas,DOU\n\ ,KS,Edwards,EDW\n\ ,KS,Elk,ELK\n\ ,KS,Ellis,ELL\n\ ,KS,Ellsworth,ELS\n\ ,KS,Finney,FIN\n\ ,KS,Ford,FOR\n\ ,KS,Franklin,FRA\n\ ,KS,Geary,GEA\n\ ,KS,Gove,GOV\n\ ,KS,Graham,GRM\n\ ,KS,Grant,GRT\n\ ,KS,Gray,GRY\n\ ,KS,Greeley,GLY\n\ ,KS,Greenwood,GRE\n\ ,KS,Hamilton,HAM\n\ ,KS,Harper,HPR\n\ ,KS,Harvey,HVY\n\ ,KS,Haskell,HAS\n\ ,KS,Hodgeman,HOG\n\ ,KS,Jackson,JAC\n\ ,KS,Jefferson,JEF\n\ ,KS,Jewell,JEW\n\ ,KS,Johnson,JOH\n\ ,KS,Kearny,KEA\n\ ,KS,Kingman,KIN\n\ ,KS,Kiowa,KIO\n\ ,KS,Labette,LAB\n\ ,KS,Lane,LAN\n\ ,KS,Leavenworth,LEA\n\ ,KS,Lincoln,LCN\n\ ,KS,Linn,LIN\n\ ,KS,Logan,LOG\n\ ,KS,Lyon,LYO\n\ ,KS,Marion,MRN\n\ ,KS,Marshall,MSH\n\ ,KS,McPherson,MCP\n\ ,KS,Meade,MEA\n\ ,KS,Miami,MIA\n\ ,KS,Mitchell,MIT\n\ ,KS,Montgomery,MGY\n\ ,KS,Morris,MOR\n\ ,KS,Morton,MTN\n\ ,KS,Nemaha,NEM\n\ ,KS,Neosho,NEO\n\ ,KS,Ness,NES\n\ ,KS,Norton,NOR\n\ ,KS,Osage,OSA\n\ ,KS,Osborne,OSB\n\ ,KS,Ottawa,OTT\n\ ,KS,Pawnee,PAW\n\ ,KS,Phillips,PHI\n\ ,KS,Pottawatomie,POT\n\ ,KS,Pratt,PRA\n\ ,KS,Rawlins,RAW\n\ ,KS,Reno,REN\n\ ,KS,Republic,REP\n\ ,KS,Rice,RIC\n\ ,KS,Riley,RIL\n\ ,KS,Rooks,ROO\n\ ,KS,Rush,RUS\n\ ,KS,Russell,RSL\n\ ,KS,Saline,SAL\n\ ,KS,Scott,SCO\n\ ,KS,Sedgwick,SED\n\ ,KS,Seward,SEW\n\ ,KS,Shawnee,SHA\n\ ,KS,Sheridan,SHE\n\ ,KS,Sherman,SMN\n\ ,KS,Smith,SMI\n\ ,KS,Stafford,STA\n\ ,KS,Stanton,STN\n\ ,KS,Stevens,STE\n\ ,KS,Sumner,SUM\n\ ,KS,Thomas,THO\n\ ,KS,Trego,TRE\n\ ,KS,Wabaunsee,WAB\n\ ,KS,Wallace,WAL\n\ ,KS,Washington,WAS\n\ ,KS,Wichita,WIC\n\ ,KS,Wilson,WIL\n\ ,KS,Woodson,WOO\n\ ,KS,Wyandotte,WYA\n\ Kentucky,KY,Adair,ADA\n\ ,KY,Allen,ALL\n\ ,KY,Anderson,AND\n\ ,KY,Ballard,BAL\n\ ,KY,Barren,BAR\n\ ,KY,Bath,BAT\n\ ,KY,Bell,BEL\n\ ,KY,Boone,BOO\n\ ,KY,Bourbon,BOU\n\ ,KY,Boyd,BOY\n\ ,KY,Boyle,BOL\n\ ,KY,Bracken,BRA\n\ ,KY,Breathitt,BRE\n\ ,KY,Breckinridge,BRK\n\ ,KY,Bullitt,BUL\n\ ,KY,Butler,BUT\n\ ,KY,Caldwell,CAL\n\ ,KY,Calloway,CAW\n\ ,KY,Campbell,CAM\n\ ,KY,Carlisle,CAE\n\ ,KY,Carroll,CRL\n\ ,KY,Carter,CTR\n\ ,KY,Casey,CAS\n\ ,KY,Christian,CHR\n\ ,KY,Clark,CLA\n\ ,KY,Clay,CLY\n\ ,KY,Clinton,CLI\n\ ,KY,Crittenden,CRI\n\ ,KY,Cumberland,CUM\n\ ,KY,Daviess,DAV\n\ ,KY,Edmonson,EDM\n\ ,KY,Elliott,ELL\n\ ,KY,Estill,EST\n\ ,KY,Fayette,FAY\n\ ,KY,Fleming,FLE\n\ ,KY,Floyd,FLO\n\ ,KY,Franklin,FRA\n\ ,KY,Fulton,FUL\n\ ,KY,Gallatin,GAL\n\ ,KY,Garrard,GAR\n\ ,KY,Grant,GRT\n\ ,KY,Graves,GRV\n\ ,KY,Grayson,GRY\n\ ,KY,Green,GRE\n\ ,KY,Greenup,GRP\n\ ,KY,Hancock,HAN\n\ ,KY,Hardin,HAR\n\ ,KY,Harlan,HRL\n\ ,KY,Harrison,HSN\n\ ,KY,Hart,HRT\n\ ,KY,Henderson,HEN\n\ ,KY,Henry,HNY\n\ ,KY,Hickman,HIC\n\ ,KY,Hopkins,HOP\n\ ,KY,Jackson,JAC\n\ ,KY,Jefferson,JEF\n\ ,KY,Jessamine,JES\n\ ,KY,Johnson,JOH\n\ ,KY,Kenton,KEN\n\ ,KY,Knott,KNT\n\ ,KY,Knox,KNX\n\ ,KY,Larue,LAR\n\ ,KY,Laurel,LAU\n\ ,KY,Lawrence,LAW\n\ ,KY,LEE,LEE\n\ ,KY,Leslie,LES\n\ ,KY,Letcher,LET\n\ ,KY,Lewis,LEW\n\ ,KY,Lincoln,LIN\n\ ,KY,Livingston,LIV\n\ ,KY,Logan,LOG\n\ ,KY,Lyon,LYO\n\ ,KY,McCracken,MCC\n\ ,KY,McCreary,MCY\n\ ,KY,McLean,MCL\n\ ,KY,Madison,MAD\n\ ,KY,Magoffin,MAG\n\ ,KY,Marion,MAR\n\ ,KY,Marshall,MSL\n\ ,KY,Martin,MAT\n\ ,KY,Mason,MAS\n\ ,KY,Meade,MEA\n\ ,KY,Menifee,MEN\n\ ,KY,Mercer,MER\n\ ,KY,Metcalfe,MET\n\ ,KY,Monroe,MON\n\ ,KY,Montgomery,MOT\n\ ,KY,Morgan,MOR\n\ ,KY,Muhlenberg,MUH\n\ ,KY,Nelson,NEL\n\ ,KY,Nicholas,NIC\n\ ,KY,Ohio,OHI\n\ ,KY,Oldham,OLD\n\ ,KY,Owen,OWE\n\ ,KY,Owsley,OWS\n\ ,KY,Pendleton,PEN\n\ ,KY,Perry,PER\n\ ,KY,Pike,PIK\n\ ,KY,Powell,POW\n\ ,KY,Pulaski,PUL\n\ ,KY,Robertson,ROB\n\ ,KY,Rockcastle,ROC\n\ ,KY,Rowan,ROW\n\ ,KY,Russell,RUS\n\ ,KY,Scott,SCO\n\ ,KY,Shelby,SHE\n\ ,KY,Simpson,SIM\n\ ,KY,Spencer,SPE\n\ ,KY,Taylor,TAY\n\ ,KY,Todd,TOD\n\ ,KY,Trigg,TRI\n\ ,KY,Trimble,TRM\n\ ,KY,Union,UNI\n\ ,KY,Warren,WAR\n\ ,KY,Washington,WAS\n\ ,KY,Wayne,WAY\n\ ,KY,Webster,WEB\n\ ,KY,Whitley,WHI\n\ ,KY,Wolfe,WOL\n\ ,KY,Woodford,WOO\n\ Louisiana,LA,Acadia,ACAD\n\ ,LA,Allen,ALLE\n\ ,LA,Ascension,ASCE\n\ ,LA,Assumption,ASSU\n\ ,LA,Avoyelles,AVOY\n\ ,LA,Beauregard,BEAU\n\ ,LA,Bienville,BIEN\n\ ,LA,Bossier,BOSS\n\ ,LA,Caddo,CADD\n\ ,LA,Calcasieu,CALC\n\ ,LA,Caldwell,CALD\n\ ,LA,Cameron,CAME\n\ ,LA,Catahoula,CATA\n\ ,LA,Claiborne,CLAI\n\ ,LA,Concordia,CONC\n\ ,LA,De Soto,DESO\n\ ,LA,East Baton Rouge,EBR\n\ ,LA,East Carroll,ECAR\n\ ,LA,East Feliciana,EFEL\n\ ,LA,Evangeline,EVAN\n\ ,LA,Franklin,FRAN\n\ ,LA,Grant,GRAN\n\ ,LA,Iberia,IBER\n\ ,LA,Iberville,IBVL\n\ ,LA,Jackson,JACK\n\ ,LA,Jefferson,JEFF\n\ ,LA,Jefferson Davis,JFDV\n\ ,LA,La Salle,LASA\n\ ,LA,Lafayette,LAFA\n\ ,LA,Lafourche,LAFO\n\ ,LA,Lincoln,LINC\n\ ,LA,Livingston,LIVI\n\ ,LA,Madison,MADI\n\ ,LA,Morehouse,MORE\n\ ,LA,Natchitoches,NATC\n\ ,LA,Orleans,ORLE\n\ ,LA,Ouachita,OUAC\n\ ,LA,Plaquemines,PLAQ\n\ ,LA,Pointe Coupee,PCP\n\ ,LA,Rapides,RAPI\n\ ,LA,Red River,REDR\n\ ,LA,Richland,RICH\n\ ,LA,Sabine,SABI\n\ ,LA,St. Bernard,SBND\n\ ,LA,St. Charles,SCHL\n\ ,LA,St. Helena,SHEL\n\ ,LA,St. James,SJAM\n\ ,LA,St. John the Baptist,SJB\n\ ,LA,St. Landry,SLAN\n\ ,LA,St. Martin,SMT\n\ ,LA,St. Mary,SMAR\n\ ,LA,St. Tammany,STAM\n\ ,LA,Tangipahoa,TANG\n\ ,LA,Tensas,TENS\n\ ,LA,Terrebonne,TERR\n\ ,LA,Union,UNIO\n\ ,LA,Vermilion,VERM\n\ ,LA,Vernon,VERN\n\ ,LA,Washington,WASH\n\ ,LA,Webster,WEBS\n\ ,LA,West Baton Rouge,WBR\n\ ,LA,West Carroll,WCAR\n\ ,LA,West Feliciana,WFEL\n\ ,LA,Winn,WINN\n\ Massachusetts,MA,Barnstable,BAR\n\ ,MA,Berkshire,BER\n\ ,MA,Bristol,BRM\n\ ,MA,Dukes,DUK\n\ ,MA,Essex,ESM\n\ ,MA,Franklin,FRA\n\ ,MA,Hampden,HMD\n\ ,MA,Hampshire,MA\n\ ,MA,Middlesex,MIM\n\ ,MA,Nantucket,NAN\n\ ,MA,Norfolk,NOR\n\ ,MA,Plymouth,PLY\n\ ,MA,Suffolk,SUF\n\ ,MA,Worcester,WOR\n\ Maine,ME,Androscoggin,AND\n\ ,ME,Aroostook,ARO\n\ ,ME,Cumberland,CBL\n\ ,ME,Franklin,FRA\n\ ,ME,Hancock,HAN\n\ ,ME,Kennebec,KEN\n\ ,ME,Knox,KNO\n\ ,ME,Lincoln,LIN\n\ ,ME,Oxford,OXF\n\ ,ME,Penobscot,PEN\n\ ,ME,Piscataquis,PSQ\n\ ,ME,Sagadahoc,SAG\n\ ,ME,Somerset,SOM\n\ ,ME,Waldo,WAL\n\ ,ME,Washington,WAS\n\ ,ME,York,YOR\n\ Maryland,MD,Allegany,ALY\n\ ,MD,Anne Arundel,ANA\n\ ,MD,Baltimore City,BAL\n\ ,MD,Baltimore,BCT\n\ ,MD,Calvert,CLV\n\ ,MD,Caroline,CLN\n\ ,MD,Carroll,CRL\n\ ,MD,Cecil,CEC\n\ ,MD,Charles,CHS\n\ ,MD,Dorchester,DRC\n\ ,MD,Frederick,FRD\n\ ,MD,Garrett,GAR\n\ ,MD,Harford,HFD\n\ ,MD,Howard,HWD\n\ ,MD,Kent,KEN\n\ ,MD,Montgomery,MON\n\ ,MD,Prince George,PGE\n\ ,MD,Queen Anne,QAN\n\ ,MD,St. Mary,STM\n\ ,MD,Somerset,SMR\n\ ,MD,Talbot,TAL\n\ ,MD,Washington,WAS\n\ ,MD,Washington DC,WRC\n\ ,MD,Wicomico,WIC\n\ ,MD,Worcester,WRC\n\ ,MD,Worcester,\n\ Michigan,MI,Alcona,ALCO\n\ ,MI,Alger,ALGE\n\ ,MI,Allegan,ALLE\n\ ,MI,Alpena,ALPE\n\ ,MI,Antrim,ANTR\n\ ,MI,Arenac,AREN\n\ ,MI,Baraga,BARA\n\ ,MI,Barry,BARR\n\ ,MI,Bay,BAY\n\ ,MI,Benzie,BENZ\n\ ,MI,Berrien,BERR\n\ ,MI,Branch,BRAN\n\ ,MI,Calhoun,CALH\n\ ,MI,Cass,CASS\n\ ,MI,Charlevoix,CHAR\n\ ,MI,Cheboygan,CHEB\n\ ,MI,Chippewa,CHIP\n\ ,MI,Clare,CLAR\n\ ,MI,Clinton,CLIN\n\ ,MI,Crawford,CRAW\n\ ,MI,Delta,DELT\n\ ,MI,Dickinson,DICK\n\ ,MI,Eaton,EATO\n\ ,MI,Emmet,EMME\n\ ,MI,Genesee,GENE\n\ ,MI,Gladwin,GLAD\n\ ,MI,Gogebic,GOGE\n\ ,MI,Gratiot,GRAT\n\ ,MI,Grand Traverse,GRTR\n\ ,MI,Hillsdale,HILL\n\ ,MI,Houghton,HOUG\n\ ,MI,Huron,HURO\n\ ,MI,Ionia,IONI\n\ ,MI,Iosco,IOSC\n\ ,MI,Ingham,INGH\n\ ,MI,Iron,IRON\n\ ,MI,Isabella,ISAB\n\ ,MI,Jackson,JACK\n\ ,MI,Kalamazoo,KZOO\n\ ,MI,Kalkaska,KALK\n\ ,MI,Keweenaw,KEWE\n\ ,MI,Kent,KENT\n\ ,MI,Lake,LAKE\n\ ,MI,Lapeer,LAPE\n\ ,MI,Leelanau,LEEL\n\ ,MI,Lenawee,LENA\n\ ,MI,Livingston,LIVI\n\ ,MI,Luce,LUCE\n\ ,MI,Mackinac,MACK\n\ ,MI,Macomb,MACO\n\ ,MI,Manistee,MANI\n\ ,MI,Marquette,MARQ\n\ ,MI,Mason,MASO\n\ ,MI,Mecosta,MECO\n\ ,MI,Menominee,MENO\n\ ,MI,Midland,MIDL\n\ ,MI,Missaukee,MISS\n\ ,MI,Monroe,MONR\n\ ,MI,Montcalm,MCLM\n\ ,MI,Montmorency,MTMO\n\ ,MI,Muskegon,MUSK\n\ ,MI,Newaygo,NEWA\n\ ,MI,Oakland,OAKL\n\ ,MI,Oceana,OCEA\n\ ,MI,Ogemaw,OGEM\n\ ,MI,Ontonagon,ONTO\n\ ,MI,Osceola,OSCE\n\ ,MI,Oscoda,OSCO\n\ ,MI,Otsego,OTSE\n\ ,MI,Ottawa,OTTA\n\ ,MI,Presque Isle,PRES\n\ ,MI,Roscommon,ROSC\n\ ,MI,Saginaw,SAGI\n\ ,MI,Sanilac,SANI\n\ ,MI,Schoolcraft,SCHO\n\ ,MI,Shiawassee,SHIA\n\ ,MI,St. Clair,STCL\n\ ,MI,St. Joseph,STJO\n\ ,MI,Tuscola,TUSC\n\ ,MI,Van Buren,VANB\n\ ,MI,Washtenaw,WASH\n\ ,MI,Wayne,WAYN\n\ ,MI,Wexford,WEXF\n\ Minnesota,MN,Aitkin,AIT\n\ ,MN,Anoka,ANO\n\ ,MN,Becker,BEC\n\ ,MN,Beltrami,BEL\n\ ,MN,Benton,BEN\n\ ,MN,Big Stone,BIG\n\ ,MN,Blue Earth,BLU\n\ ,MN,Brown,BRO\n\ ,MN,Carlton,CRL\n\ ,MN,Carver,CRV\n\ ,MN,Cass,CAS\n\ ,MN,Chippewa,CHP\n\ ,MN,Chisago,CHS\n\ ,MN,Clay,CLA\n\ ,MN,Clearwater,CLE\n\ ,MN,Cook,COO\n\ ,MN,Cottonwood,COT\n\ ,MN,Crow Wing,CRO\n\ ,MN,Dakota,DAK\n\ ,MN,Dodge,DOD\n\ ,MN,Douglas,DOU\n\ ,MN,Fairbault,FAI\n\ ,MN,Fillmore,FIL\n\ ,MN,Freeborn,FRE\n\ ,MN,Goodhue,GOO\n\ ,MN,Grant,GRA\n\ ,MN,Hennepin,HEN\n\ ,MN,Houston,HOU\n\ ,MN,Hubbard,HUB\n\ ,MN,Isanti,ISA\n\ ,MN,Itasca,ITA\n\ ,MN,Jackson,JAC\n\ ,MN,Kanabec,KNB\n\ ,MN,Kandiyohi,KND\n\ ,MN,Kittson,KIT\n\ ,MN,Koochiching,KOO\n\ ,MN,Lac Qui Parle,LAC\n\ ,MN,Lake,LAK\n\ ,MN,Lake of the Woods,LKW\n\ ,MN,Le Sueur,LES\n\ ,MN,Lincoln,LIN\n\ ,MN,Lyon,LYO\n\ ,MN,McLeod,MCL\n\ ,MN,Mahnomen,MAH\n\ ,MN,Marshall,MRS\n\ ,MN,Martin,MRT\n\ ,MN,Meeker,MEE\n\ ,MN,Mille Lacs,MIL\n\ ,MN,Morrison,MOR\n\ ,MN,Mower,MOW\n\ ,MN,Murray,MUR\n\ ,MN,Nicollet,NIC\n\ ,MN,Nobles,NOB\n\ ,MN,Norman,NOR\n\ ,MN,Olmsted,OLM\n\ ,MN,Ottertail,OTT\n\ ,MN,Pennington,PEN\n\ ,MN,Pine,PIN\n\ ,MN,Pipestone,PIP\n\ ,MN,Polk,POL\n\ ,MN,Pope,POP\n\ ,MN,Ramsey,RAM\n\ ,MN,Red Lake,RDL\n\ ,MN,Redwood,RDW\n\ ,MN,Renville,REN\n\ ,MN,Rice,RIC\n\ ,MN,Rock,ROC\n\ ,MN,Roseau,ROS\n\ ,MN,St Louis,STL\n\ ,MN,Scott,SCO\n\ ,MN,Sherburne,SHE\n\ ,MN,Sibley,SIB\n\ ,MN,Stearns,STR\n\ ,MN,Steele,STE\n\ ,MN,Stevens,STV\n\ ,MN,St. Louis,STL\n\ ,MN,Swift,SWI\n\ ,MN,Todd,TOD\n\ ,MN,Traverse,TRA\n\ ,MN,Wabasha,WAB\n\ ,MN,Wadena,WAD\n\ ,MN,Waseca,WSC\n\ ,MN,Washington,WSH\n\ ,MN,Watonwan,WAT\n\ ,MN,Wilkin,WIL\n\ ,MN,Winona,WIN\n\ ,MN,Wright,WRI\n\ ,MN,Yellow Medicine,YEL\n\ Missouri,MO,Adair,ADR\n\ ,MO,Andrew,AND\n\ ,MO,Atchison,ATC\n\ ,MO,Audrain,AUD\n\ ,MO,Barry,BAR\n\ ,MO,Barton,BTN\n\ ,MO,Bates,BAT\n\ ,MO,Benton,BEN\n\ ,MO,Bollinger,BOL\n\ ,MO,Boone,BOO\n\ ,MO,Buchanan,BUC\n\ ,MO,Butler,BTR\n\ ,MO,Caldwell,CWL\n\ ,MO,Callaway,CAL\n\ ,MO,Camden,CAM\n\ ,MO,Cape Girardeau,CPG\n\ ,MO,Carroll,CRL\n\ ,MO,Carter,CAR\n\ ,MO,Cass,CAS\n\ ,MO,Cedar,CED\n\ ,MO,Chariton,CHN\n\ ,MO,Christian,CHR\n\ ,MO,Clark,CLK\n\ ,MO,Clay,CLA\n\ ,MO,Clinton,CLN\n\ ,MO,Cole,COL\n\ ,MO,Cooper,COP\n\ ,MO,Crawford,CRA\n\ ,MO,Dade,DAD\n\ ,MO,Dallas,DAL\n\ ,MO,Daviess,DVS\n\ ,MO,DeKalb,DEK\n\ ,MO,Dent,DEN\n\ ,MO,Douglas,DGL\n\ ,MO,Dunklin,DUN\n\ ,MO,Franklin,FRA\n\ ,MO,Gasconade,GAS\n\ ,MO,Gentry,GEN\n\ ,MO,Greene,GRN\n\ ,MO,Grundy,GRU\n\ ,MO,Harrison,HAR\n\ ,MO,Henry,HEN\n\ ,MO,Hickory,HIC\n\ ,MO,Holt,HLT\n\ ,MO,Howard,HOW\n\ ,MO,Howell,HWL\n\ ,MO,Iron,IRN\n\ ,MO,Jackson,JAC\n\ ,MO,Jasper,JAS\n\ ,MO,Jefferson,JEF\n\ ,MO,Johnson,JON\n\ ,MO,Knox,KNX\n\ ,MO,Laclede,LAC\n\ ,MO,Lafayette,LAF\n\ ,MO,Lawrence,LAW\n\ ,MO,Lewis,LEW\n\ ,MO,Lincoln,LCN\n\ ,MO,Linn,LIN\n\ ,MO,Livingston,LIV\n\ ,MO,Macon,MAC\n\ ,MO,Madison,MAD\n\ ,MO,Maries,MRE\n\ ,MO,Marion,MAR\n\ ,MO,McDonald,MCD\n\ ,MO,Mercer,MER\n\ ,MO,Miller,MIL\n\ ,MO,Mississippi,MIS\n\ ,MO,Moniteau,MNT\n\ ,MO,Monroe,MON\n\ ,MO,Montgomery,MGM\n\ ,MO,Morgan,MOR\n\ ,MO,New Madrid,NMD\n\ ,MO,Newton,NWT\n\ ,MO,Nodaway,NOD\n\ ,MO,Oregon,ORE\n\ ,MO,Osage,OSA\n\ ,MO,Ozark,OZA\n\ ,MO,Pemiscot,PEM\n\ ,MO,Perry,PER\n\ ,MO,Pettis,PET\n\ ,MO,Phelps,PHE\n\ ,MO,Pike,PIK\n\ ,MO,Platte,PLA\n\ ,MO,Polk,POL\n\ ,MO,Pulaski,PUL\n\ ,MO,Putnam,PUT\n\ ,MO,Ralls,RAL\n\ ,MO,Randolph,RAN\n\ ,MO,Ray,RAY\n\ ,MO,Reynolds,REY\n\ ,MO,Ripley,RIP\n\ ,MO,Saline,SAL\n\ ,MO,Schuyler,SCH\n\ ,MO,Scotland,SCT\n\ ,MO,Scott,SCO\n\ ,MO,Shannon,SHA\n\ ,MO,Shelby,SHL\n\ ,MO,St. Charles,STC\n\ ,MO,St. Clair,SCL\n\ ,MO,St. Francois,STF\n\ ,MO,St. Genevieve,STG\n\ ,MO,St. Louis City,STL\n\ ,MO,St. Louis,SLC\n\ ,MO,Stoddard,STD\n\ ,MO,Stone,STN\n\ ,MO,Sullivan,SUL\n\ ,MO,Taney,TAN\n\ ,MO,Texas,TEX\n\ ,MO,Vernon,VRN\n\ ,MO,Warren,WAR\n\ ,MO,Washington,WAS\n\ ,MO,Wayne,WAY\n\ ,MO,Webster,WEB\n\ ,MO,Worth,WOR\n\ ,MO,Wright,WRT\n\ Mississippi,MS,Adams,ADA\n\ ,MS,Alcorn,ALC\n\ ,MS,Amite,AMI\n\ ,MS,Attala,ATT\n\ ,MS,Benton,BEN\n\ ,MS,Bolivar,BOL\n\ ,MS,Calhoun,CAL\n\ ,MS,Carroll,CAR\n\ ,MS,Chickasaw,CHI\n\ ,MS,Choctaw,CHO\n\ ,MS,Claiborne,CLB\n\ ,MS,Clarke,CLK\n\ ,MS,Clay,CLA\n\ ,MS,Coahoma,COA\n\ ,MS,Copiah,COP\n\ ,MS,Covington,COV\n\ ,MS,DeSoto,DES\n\ ,MS,Forrest,FOR\n\ ,MS,Franklin,FRA\n\ ,MS,George,GEO\n\ ,MS,Greene,GRN\n\ ,MS,Grenada,GRE\n\ ,MS,Hancock,HAN\n\ ,MS,Harrison,HAR\n\ ,MS,Hinds,HIN\n\ ,MS,Holmes,HOL\n\ ,MS,Humphreys,HUM\n\ ,MS,Issaquena,ISS\n\ ,MS,Itawamba,ITA\n\ ,MS,Jackson,JAC\n\ ,MS,Jasper,JAS\n\ ,MS,Jefferson,JEF\n\ ,MS,Jefferson Davis,JDV\n\ ,MS,Jones,JON\n\ ,MS,Kemper,KEM\n\ ,MS,Lafayette,LAF\n\ ,MS,Lamar,LAM\n\ ,MS,Lauderdale,LAU\n\ ,MS,Lawrence,LAW\n\ ,MS,Leake,LEA\n\ ,MS,Lee,LEE\n\ ,MS,Leflore,LEF\n\ ,MS,Lincoln,LIN\n\ ,MS,Lowndes,LOW\n\ ,MS,Madison,MAD\n\ ,MS,Marion,MRN\n\ ,MS,Marshall,MAR\n\ ,MS,Monroe,MON\n\ ,MS,Montgomery,MGY\n\ ,MS,Neshoba,NES\n\ ,MS,Newton,NEW\n\ ,MS,Noxubee,NOX\n\ ,MS,Oktibbeha,OKT\n\ ,MS,Panola,PAN\n\ ,MS,Pearl River,PEA\n\ ,MS,Perry,PER\n\ ,MS,Pike,PIK\n\ ,MS,Pontotoc,PON\n\ ,MS,Prentiss,PRE\n\ ,MS,Quitman,QUI\n\ ,MS,Rankin,RAN\n\ ,MS,Scott,SCO\n\ ,MS,Sharkey,SHA\n\ ,MS,Simpson,SIM\n\ ,MS,Smith,SMI\n\ ,MS,Stone,STO\n\ ,MS,Sunflower,SUN\n\ ,MS,Tallahatchie,TAL\n\ ,MS,Tate,TAT\n\ ,MS,Tippah,TIP\n\ ,MS,Tishomingo,TIS\n\ ,MS,Tunica,TUN\n\ ,MS,Union,UNI\n\ ,MS,Walthall,WAL\n\ ,MS,Warren,WAR\n\ ,MS,Washington,WAS\n\ ,MS,Wayne,WAY\n\ ,MS,Webster,WEB\n\ ,MS,Wilkinson,WIL\n\ ,MS,Winston,WIN\n\ ,MS,Yalobusha,YAL\n\ ,MS,Yazoo,YAZ\n\ Montana,MT,Beaverhead,BEA\n\ ,MT,Big Horn,BIG\n\ ,MT,Blaine,BLA\n\ ,MT,Broadwater,BRO\n\ ,MT,Carbon,CRB\n\ ,MT,Carter,CRT\n\ ,MT,Cascade,CAS\n\ ,MT,Chouteau,CHO\n\ ,MT,Custer,CUS\n\ ,MT,Daniels,DAN\n\ ,MT,Dawson,DAW\n\ ,MT,Deer Lodge,DEE\n\ ,MT,Fallon,FAL\n\ ,MT,Fergus,FER\n\ ,MT,Flathead,FLA\n\ ,MT,Gallatin,GAL\n\ ,MT,Garfield,GAR\n\ ,MT,Glacier,GLA\n\ ,MT,Golden Valley,GOL\n\ ,MT,Granite,GRA\n\ ,MT,Hill,HIL\n\ ,MT,Jefferson,JEF\n\ ,MT,Judith Basin,JUD\n\ ,MT,Lake,LAK\n\ ,MT,Lewis & Clark,LEW\n\ ,MT,Liberty,LIB\n\ ,MT,Lincoln,LIN\n\ ,MT,Madison,MAD\n\ ,MT,McCone,MCC\n\ ,MT,Meagher,MEA\n\ ,MT,Mineral,MIN\n\ ,MT,Missoula,MIS\n\ ,MT,Musselshell,MUS\n\ ,MT,Park,PAR\n\ ,MT,Petroleum,PET\n\ ,MT,Phillips,PHI\n\ ,MT,Pondera,PON\n\ ,MT,Powder River,PWD\n\ ,MT,Powell,PWL\n\ ,MT,Prairie,PRA\n\ ,MT,Ravalli,RAV\n\ ,MT,Richland,RIC\n\ ,MT,Roosevelt,ROO\n\ ,MT,Rosebud,ROS\n\ ,MT,Sanders,SAN\n\ ,MT,Sheridan,SHE\n\ ,MT,Silver Bow,SIL\n\ ,MT,Stillwater,STI\n\ ,MT,Sweet Grass,SWE\n\ ,MT,Teton,TET\n\ ,MT,Toole,TOO\n\ ,MT,Treasure,TRE\n\ ,MT,Valley,VAL\n\ ,MT,Wheatland,WHE\n\ ,MT,Wibaux,WIB\n\ ,MT,Yellowstone,YEL\n\ North Carolina,NC,Alamance,ALA\n\ ,NC,Alexander,ALE\n\ ,NC,Alleghany,ALL\n\ ,NC,Anson,ANS\n\ ,NC,Ashe,ASH\n\ ,NC,Avery,AVE\n\ ,NC,Beaufort,BEA\n\ ,NC,Bertie,BER\n\ ,NC,Bladen,BLA\n\ ,NC,Brunswick,BRU\n\ ,NC,Buncombe,BUN\n\ ,NC,Burke,BUR\n\ ,NC,Cabarrus,CAB\n\ ,NC,Caldwell,CAL\n\ ,NC,Camden,CAM\n\ ,NC,Carteret,CAR\n\ ,NC,Caswell,CAS\n\ ,NC,Catawba,CAT\n\ ,NC,Chatham,CHA\n\ ,NC,Cherokee,CHE\n\ ,NC,Chowan,CHO\n\ ,NC,Clay,CLA\n\ ,NC,Cleveland,CLE\n\ ,NC,Columbus,COL\n\ ,NC,Craven,CRA\n\ ,NC,Cumberland,CUM\n\ ,NC,Currituck,CUR\n\ ,NC,Dare,DAR\n\ ,NC,Davidson,DVD\n\ ,NC,Davie,DAV\n\ ,NC,Duplin,DUP\n\ ,NC,Durham,DUR\n\ ,NC,Edgecombe,EDG\n\ ,NC,Forsyth,FOR\n\ ,NC,Franklin,FRA\n\ ,NC,Gaston,GAS\n\ ,NC,Gates,GAT\n\ ,NC,Graham,GRM\n\ ,NC,Granville,GRA\n\ ,NC,Greene,GRE\n\ ,NC,Guilford,GUI\n\ ,NC,Halifax,HAL\n\ ,NC,Harnett,HAR\n\ ,NC,Haywood,HAY\n\ ,NC,Henderson,HEN\n\ ,NC,Hertford,HER\n\ ,NC,Hoke,HOK\n\ ,NC,Hyde,HYD\n\ ,NC,Iredell,IRE\n\ ,NC,Jackson,JAC\n\ ,NC,Johnston,JOH\n\ ,NC,Jones,JON\n\ ,NC,Lee,LEE\n\ ,NC,Lenoir,LEN\n\ ,NC,Lincoln,LIN\n\ ,NC,Macon,MAC\n\ ,NC,Madison,MAD\n\ ,NC,Martin,MAR\n\ ,NC,McDowell,MCD\n\ ,NC,Mecklenburg,MEC\n\ ,NC,Mitchell,MIT\n\ ,NC,Montgomery,MON\n\ ,NC,Moore,MOO\n\ ,NC,Nash,NAS\n\ ,NC,New Hanover,NEW\n\ ,NC,Northampton,NOR\n\ ,NC,Onslow,ONS\n\ ,NC,Orange,ORA\n\ ,NC,Pamlico,PAM\n\ ,NC,Pasquotank,PAS\n\ ,NC,Pender,PEN\n\ ,NC,Perquimans,PEQ\n\ ,NC,Person,PER\n\ ,NC,Pitt,PIT\n\ ,NC,Polk,POL\n\ ,NC,Randolph,RAN\n\ ,NC,Richmond,RIC\n\ ,NC,Robeson,ROB\n\ ,NC,Rockingham,ROC\n\ ,NC,Rowan,ROW\n\ ,NC,Rutherford,RUT\n\ ,NC,Sampson,SAM\n\ ,NC,Scotland,SCO\n\ ,NC,Stanly,STA\n\ ,NC,Stokes,STO\n\ ,NC,Surry,SUR\n\ ,NC,Swain,SWA\n\ ,NC,Transylvania,TRA\n\ ,NC,Tyrrell,TYR\n\ ,NC,Union,UNI\n\ ,NC,Vance,VAN\n\ ,NC,Wake,WAK\n\ ,NC,Warren,WAR\n\ ,NC,Washington,WAS\n\ ,NC,Watauga,WAT\n\ ,NC,Wayne,WAY\n\ ,NC,Wilkes,WLK\n\ ,NC,Wilson,WIL\n\ ,NC,Yadkin,YAD\n\ ,NC,Yancey,YAN\n\ North Dakota,ND,Adams,ADM\n\ ,ND,Barnes,BRN\n\ ,ND,Benson,BSN\n\ ,ND,Billings,BLL\n\ ,ND,Bottineau,BOT\n\ ,ND,Bowman,BOW\n\ ,ND,Burke,BRK\n\ ,ND,Burleigh,BUR\n\ ,ND,Cass,CSS\n\ ,ND,Cavalier,CAV\n\ ,ND,Dickey,DIK\n\ ,ND,Divide,DIV\n\ ,ND,Dunn,DUN\n\ ,ND,Eddy,EDY\n\ ,ND,Emmons,EMN\n\ ,ND,Foster,FOS\n\ ,ND,Golden Valley,GNV\n\ ,ND,Grand Forks,GFK\n\ ,ND,Grant,GNT\n\ ,ND,Griggs,GRG\n\ ,ND,Hettinger,HET\n\ ,ND,Kidder,KDR\n\ ,ND,LaMoure,LMR\n\ ,ND,Logan,LOG\n\ ,ND,McHenry,MCH\n\ ,ND,McIntosh,MCI\n\ ,ND,McKenzie,MCK\n\ ,ND,McLean,MCL\n\ ,ND,Mercer,MCR\n\ ,ND,Morton,MTN\n\ ,ND,Mountrail,MRL\n\ ,ND,Nelson,NEL\n\ ,ND,Oliver,OLR\n\ ,ND,Pembina,PBA\n\ ,ND,Pierce,PRC\n\ ,ND,Ramsey,RMY\n\ ,ND,Ransom,RSM\n\ ,ND,Renville,REN\n\ ,ND,Richland,RLD\n\ ,ND,Rolette,ROL\n\ ,ND,Sargent,SGT\n\ ,ND,Sheridan,SRN\n\ ,ND,Sioux,SIX\n\ ,ND,Slope,SLP\n\ ,ND,Stark,STK\n\ ,ND,Steele,STL\n\ ,ND,Stutsman,STN\n\ ,ND,Towner,TWR\n\ ,ND,Traill,TRL\n\ ,ND,Walsh,WLH\n\ ,ND,Ward,WRD\n\ ,ND,Wells,WLS\n\ ,ND,Williams,WLM\n\ Nebraska,NE,Adams,ADMS\n\ ,NE,Antelope,ANTE\n\ ,NE,Arthur,ARTH\n\ ,NE,Banner,BANN\n\ ,NE,Blaine,BLAI\n\ ,NE,Boone,BOON\n\ ,NE,Box Butte,BOXB\n\ ,NE,Boyd,BOYD\n\ ,NE,Brown,BRWN\n\ ,NE,Buffalo,BUFF\n\ ,NE,Burt,BURT\n\ ,NE,Butler,BUTL\n\ ,NE,Cass,CASS\n\ ,NE,Cedar,CEDA\n\ ,NE,Chase,CHAS\n\ ,NE,Cherry,CHER\n\ ,NE,Cheyenne,CHEY\n\ ,NE,Clay,CLAY\n\ ,NE,Colfax,COLF\n\ ,NE,Cuming,CUMI\n\ ,NE,Custer,CUST\n\ ,NE,Dakota,DAKO\n\ ,NE,Dawes,DAWE\n\ ,NE,Dawson,DAWS\n\ ,NE,Deuel,DEUE\n\ ,NE,Dixon,DIXO\n\ ,NE,Dodge,DODG\n\ ,NE,Douglas,DGLS\n\ ,NE,Dundy,DUND\n\ ,NE,Fillmore,FILL\n\ ,NE,Franklin,FRNK\n\ ,NE,Frontier,FRON\n\ ,NE,Furnas,FURN\n\ ,NE,Gage,GAGE\n\ ,NE,Garden,GARD\n\ ,NE,Garfield,GARF\n\ ,NE,Gosper,GOSP\n\ ,NE,Grant,GRAN\n\ ,NE,Greeley,GREE\n\ ,NE,Hall,HALL\n\ ,NE,Hamilton,HAMI\n\ ,NE,Harlan,HRLN\n\ ,NE,Hayes,HAYE\n\ ,NE,Hitchcock,HITC\n\ ,NE,Holt,HOLT\n\ ,NE,Hooker,HOOK\n\ ,NE,Howard,HOWA\n\ ,NE,Jefferson,JEFF\n\ ,NE,Johnson,JOHN\n\ ,NE,Kearney,KEAR\n\ ,NE,Keith,KEIT\n\ ,NE,Keya Paha,KEYA\n\ ,NE,Kimball,KIMB\n\ ,NE,Knox,KNOX\n\ ,NE,Lancaster,LNCS\n\ ,NE,Lincoln,LINC\n\ ,NE,Logan,LOGA\n\ ,NE,Loup,LOUP\n\ ,NE,Madison,MDSN\n\ ,NE,McPherson,MCPH\n\ ,NE,Merrick,MERR\n\ ,NE,Morrill,MORR\n\ ,NE,Nance,NANC\n\ ,NE,Nemaha,NEMA\n\ ,NE,Nuckolls,NUCK\n\ ,NE,Otoe,OTOE\n\ ,NE,Pawnee,PAWN\n\ ,NE,Perkins,PERK\n\ ,NE,Phelps,PHEL\n\ ,NE,Pierce,PIER\n\ ,NE,Platte,PLAT\n\ ,NE,Polk,POLK\n\ ,NE,Red Willow,REDW\n\ ,NE,Richardson,RICH\n\ ,NE,Rock,ROCK\n\ ,NE,Saline,SALI\n\ ,NE,Sarpy,SARP\n\ ,NE,Saunders,SAUN\n\ ,NE,Scotts Bluff,SCOT\n\ ,NE,Seward,SEWA\n\ ,NE,Sheridan,SHRD\n\ ,NE,Sherman,SHRM\n\ ,NE,Sioux,SIOU\n\ ,NE,Stanton,STAN\n\ ,NE,Thayer,THAY\n\ ,NE,Thomas,THOM\n\ ,NE,Thurston,THUR\n\ ,NE,Valley,VLLY\n\ ,NE,Washington,WASH\n\ ,NE,Wayne,WAYN\n\ ,NE,Webster,WEBS\n\ ,NE,Wheeler,WHEE\n\ ,NE,York,YORK\n\ New Hampshire,NH,Belknap,BEL\n\ ,NH,Carroll,CAR\n\ ,NH,Cheshire,CHE\n\ ,NH,Coos,COO\n\ ,NH,Grafton,GRN\n\ ,NH,Hillsborough,HIL\n\ ,NH,Merrimack,MER\n\ ,NH,Rockingham,ROC\n\ ,NH,Strafford,STR\n\ ,NH,Sullivan,SUL\n\ New Jersey,NJ,Atlantic,ATLA\n\ ,NJ,Bergen,BERG\n\ ,NJ,Burlington,BURL\n\ ,NJ,Camden,CMDN\n\ ,NJ,Cape May,CAPE\n\ ,NJ,Cumberland,CUMB\n\ ,NJ,Essex,ESSE\n\ ,NJ,Gloucester,GLOU\n\ ,NJ,Hudson,HUDS\n\ ,NJ,Hunterdon,HUNT\n\ ,NJ,Mercer,MERC\n\ ,NJ,Middlesex,MIDD\n\ ,NJ,Monmouth,MONM\n\ ,NJ,Morris,MORR\n\ ,NJ,Ocean,OCEA\n\ ,NJ,Passaic,PASS\n\ ,NJ,Salem,SALE\n\ ,NJ,Somerset,SOME\n\ ,NJ,Sussex,SUSS\n\ ,NJ,Union,UNIO\n\ ,NJ,Warren,WRRN\n\ New Mexico,NM,Bernalillo,BER\n\ ,NM,Catron,CAT\n\ ,NM,Chaves,CHA\n\ ,NM,Cibola,CIB\n\ ,NM,Colfax,COL\n\ ,NM,Curry,CUR\n\ ,NM,De Baca,DEB\n\ ,NM,Dona Ana,DON\n\ ,NM,Eddy,EDD\n\ ,NM,Grant,GRA\n\ ,NM,Guadalupe,GUA\n\ ,NM,Harding,HAR\n\ ,NM,Hidalgo,HID\n\ ,NM,Lea,LEA\n\ ,NM,Lincoln,LIN\n\ ,NM,Los Alamos,LOS\n\ ,NM,Luna,LUN\n\ ,NM,McKinley,MCK\n\ ,NM,Mora,MOR\n\ ,NM,Otero,OTE\n\ ,NM,Quay,QUA\n\ ,NM,Rio Arriba,RIO\n\ ,NM,Roosevelt,ROO\n\ ,NM,San Juan,SJU\n\ ,NM,San Miguel,SMI\n\ ,NM,Sandoval,SAN\n\ ,NM,Santa Fe,SFE\n\ ,NM,Sierra,SIE\n\ ,NM,Socorro,SOC\n\ ,NM,Taos,TAO\n\ ,NM,Torrance,TOR\n\ ,NM,Union,UNI\n\ ,NM,Valencia,VAL\n\ Nevada,NV,Carson City,CAR\n\ ,NV,Churchill,CHU\n\ ,NV,Clark,CLA\n\ ,NV,Douglas,DOU\n\ ,NV,Elko,ELK\n\ ,NV,Esmeralda,ESM\n\ ,NV,Eureka,EUR\n\ ,NV,Humboldt,HUM\n\ ,NV,Lander,LAN\n\ ,NV,Lincoln,LIN\n\ ,NV,Lyon,LYO\n\ ,NV,Mineral,MIN\n\ ,NV,Nye,NYE\n\ ,NV,Pershing,PER\n\ ,NV,Storey,STO\n\ ,NV,Washoe,WAS\n\ ,NV,White Pine,WHI\n\ New York,NY,Albany,ALB\n\ ,NY,Allegany,ALL\n\ ,NY,Bronx,BRX\n\ ,NY,Broome,BRM\n\ ,NY,Cattaraugus,CAT\n\ ,NY,Cayuga,CAY\n\ ,NY,Chautauqua,CHA\n\ ,NY,Chemung,CHE\n\ ,NY,Chenango,CGO\n\ ,NY,Clinton,CLI\n\ ,NY,Columbia,COL\n\ ,NY,Cortland,COR\n\ ,NY,Delaware,DEL\n\ ,NY,Dutchess,DUT\n\ ,NY,Erie,ERI\n\ ,NY,Essex,ESS\n\ ,NY,Franklin,FRA\n\ ,NY,Fulton,FUL\n\ ,NY,Genesee,GEN\n\ ,NY,Greene,GRE\n\ ,NY,Hamilton,HAM\n\ ,NY,Herkimer,HER\n\ ,NY,Jefferson,JEF\n\ ,NY,Kings,KIN\n\ ,NY,Lewis,LEW\n\ ,NY,Livingston,LIV\n\ ,NY,Madison,MAD\n\ ,NY,Monroe,MON\n\ ,NY,Montgomery,MTG\n\ ,NY,Nassau,NAS\n\ ,NY,New York,NEW\n\ ,NY,Niagara,NIA\n\ ,NY,Oneida,ONE\n\ ,NY,Onondaga,ONO\n\ ,NY,Ontario,ONT\n\ ,NY,Orange,ORA\n\ ,NY,Orleans,ORL\n\ ,NY,Oswego,OSW\n\ ,NY,Otsego,OTS\n\ ,NY,Putnam,PUT\n\ ,NY,Queens,QUE\n\ ,NY,Rensselaer,REN\n\ ,NY,Rockland,ROC\n\ ,NY,Richmond,RIC\n\ ,NY,Saratoga,SAR\n\ ,NY,Schenectady,SCH\n\ ,NY,Schoharie,SCO\n\ ,NY,Schuyler,SCU\n\ ,NY,Seneca,SEN\n\ ,NY,St. Lawrence,STL\n\ ,NY,Steuben,STE\n\ ,NY,Suffolk,SUF\n\ ,NY,Sullivan,SUL\n\ ,NY,Tioga,TIO\n\ ,NY,Tompkins,TOM\n\ ,NY,Ulster,ULS\n\ ,NY,Warren,WAR\n\ ,NY,Washington,WAS\n\ ,NY,Wayne,WAY\n\ ,NY,Westchester,WES\n\ ,NY,Wyoming,WYO\n\ ,NY,Yates,YAT\n\ Ohio,OH,Adams,ADAM\n\ ,OH,Allen,ALLE\n\ ,OH,Ashland,ASHL\n\ ,OH,Ashtabula,ASHT\n\ ,OH,Athens,ATHE\n\ ,OH,Auglaze,AUGL\n\ ,OH,Belmont,BELM\n\ ,OH,Brown,BROW\n\ ,OH,Butler,BUTL\n\ ,OH,Carroll,CARR\n\ ,OH,Champaign,CHAM\n\ ,OH,Clark,CLAR\n\ ,OH,Clermont,CLER\n\ ,OH,Clinton,CLIN\n\ ,OH,Columbiana,COLU\n\ ,OH,Coshocton,COSH\n\ ,OH,Crawford,CRAW\n\ ,OH,Cuyahoga,CUYA\n\ ,OH,Darke,DARK\n\ ,OH,Defiance,DEFI\n\ ,OH,Delaware,DELA\n\ ,OH,Erie,ERIE\n\ ,OH,Fairfield,FAIR\n\ ,OH,Fayette,FAYE\n\ ,OH,Franklin,FRAN\n\ ,OH,Fulton,FULT\n\ ,OH,Gallia,GALL\n\ ,OH,Geauga,GEAU\n\ ,OH,Greene,GREE\n\ ,OH,Guernsey,GUER\n\ ,OH,Hamilton,HAMI\n\ ,OH,Hancock,HANC\n\ ,OH,Hardin,HARD\n\ ,OH,Harrison,HARR\n\ ,OH,Henry,HENR\n\ ,OH,Highland,HIGH\n\ ,OH,Hocking,HOCK\n\ ,OH,Holmes,HOLM\n\ ,OH,Huron,HURO\n\ ,OH,Jackson,JACK\n\ ,OH,Jefferson,JEFF\n\ ,OH,Knox,KNOX\n\ ,OH,Lake,LAKE\n\ ,OH,Lawrence,LAWR\n\ ,OH,Licking,LICK\n\ ,OH,Logan,LOGA\n\ ,OH,Lorain,LORA\n\ ,OH,Lucas,LUCA\n\ ,OH,Madison,MADI\n\ ,OH,Mahoning,MAHO\n\ ,OH,Marion,MARI\n\ ,OH,Medina,MEDI\n\ ,OH,Meigs,MEIG\n\ ,OH,Mercer,MERC\n\ ,OH,Miami,MIAM\n\ ,OH,Monroe,MONR\n\ ,OH,Montgomery,MONT\n\ ,OH,Morgan,MORG\n\ ,OH,Morrow,MORR\n\ ,OH,Muskingum,MUSK\n\ ,OH,Noble,NOBL\n\ ,OH,Ottawa,OTTA\n\ ,OH,Paulding,PAUL\n\ ,OH,Perry,PERR\n\ ,OH,Pickaway,PICK\n\ ,OH,Pike,PIKE\n\ ,OH,Portage,PORT\n\ ,OH,Preble,PREB\n\ ,OH,Putnam,PUTN\n\ ,OH,Richland,RICH\n\ ,OH,Ross,ROSS\n\ ,OH,Sandusky,SAND\n\ ,OH,Scioto,SCIO\n\ ,OH,Seneca,SENE\n\ ,OH,Shelby,SHEL\n\ ,OH,Stark,STAR\n\ ,OH,Summit,SUMM\n\ ,OH,Trumbull,TRUM\n\ ,OH,Tuscarawas,TUSC\n\ ,OH,Union,UNIO\n\ ,OH,VanWert,VANW\n\ ,OH,Vinton,VINT\n\ ,OH,Warren,WARR\n\ ,OH,Washington,WASH\n\ ,OH,Wayne,WAYN\n\ ,OH,Williams,WILL\n\ ,OH,Wood,WOOD\n\ ,OH,Wyandot,WYAN\n\ Oklahoma,OK,Adair,ADA\n\ ,OK,Alfalfa,ALF\n\ ,OK,Atoka,ATO\n\ ,OK,Beaver,BEA\n\ ,OK,Beckham,BEC\n\ ,OK,Blaine,BLA\n\ ,OK,Bryan,BRY\n\ ,OK,Caddo,CAD\n\ ,OK,Canadian,CAN\n\ ,OK,Carter,CAR\n\ ,OK,Cherokee,CHE\n\ ,OK,Choctaw,CHO\n\ ,OK,Cimarron,CIM\n\ ,OK,Cleveland,CLE\n\ ,OK,Coal,COA\n\ ,OK,Comanche,COM\n\ ,OK,Cotton,COT\n\ ,OK,Craig,CRA\n\ ,OK,Creek,CRE\n\ ,OK,Custer,CUS\n\ ,OK,Delaware,DEL\n\ ,OK,Dewey,DEW\n\ ,OK,Ellis,ELL\n\ ,OK,Garfield,GAR\n\ ,OK,Garvin,GRV\n\ ,OK,Grady,GRA\n\ ,OK,Grant,GNT\n\ ,OK,Greer,GRE\n\ ,OK,Harmon,HAR\n\ ,OK,Harper,HRP\n\ ,OK,Haskell,HAS\n\ ,OK,Hughes,HUG\n\ ,OK,Jackson,JAC\n\ ,OK,Jefferson,JEF\n\ ,OK,Johnston,JOH\n\ ,OK,Kay,KAY\n\ ,OK,Kingfisher,KIN\n\ ,OK,Kiowa,KIO\n\ ,OK,Latimer,LAT\n\ ,OK,Le Flore,LEF\n\ ,OK,Lincoln,LIN\n\ ,OK,Logan,LOG\n\ ,OK,Love,LOV\n\ ,OK,McClain,MCL\n\ ,OK,McCurtain,MCU\n\ ,OK,McIntosh,MCI\n\ ,OK,Major,MAJ\n\ ,OK,Marshall,MAR\n\ ,OK,Mayes,MAY\n\ ,OK,Murray,MUR\n\ ,OK,Muskogee,MUS\n\ ,OK,Noble,NOB\n\ ,OK,Nowata,NOW\n\ ,OK,Okfuskee,OKF\n\ ,OK,Oklahoma,OKL\n\ ,OK,Okmulgee,OKM\n\ ,OK,Osage,OSA\n\ ,OK,Ottawa,OTT\n\ ,OK,Pawnee,PAW\n\ ,OK,Payne,PAY\n\ ,OK,Pittsburg,PIT\n\ ,OK,Pontotoc,PON\n\ ,OK,Pottawatomie,POT\n\ ,OK,Pushmataha,PUS\n\ ,OK,Roger Mills,RGM\n\ ,OK,Rogers,ROG\n\ ,OK,Seminole,SEM\n\ ,OK,Sequoyah,SEQ\n\ ,OK,Stephens,STE\n\ ,OK,Texas,TEX\n\ ,OK,Tillman,TIL\n\ ,OK,Tulsa,TUL\n\ ,OK,Wagoner,WAG\n\ ,OK,Washington,WAS\n\ ,OK,Washita,WAT\n\ ,OK,Woods,WOO\n\ ,OK,Woodward,WDW\n\ Ontario,ON,Algoma District,ALG\n\ ,ON,City of Brant,BRA\n\ ,ON,City of Brantford,BFD\n\ ,ON,Bruce County,BRU\n\ ,ON,City of Chatham-Kent,CHK\n\ ,ON,Cochrane District,COC\n\ ,ON,Dufferin County,DUF\n\ ,ON,Durham Regional Municipality,DUR\n\ ,ON,Elgin County,ELG\n\ ,ON,Essex County,ESX\n\ ,ON,Frontenac County,FRO\n\ ,ON,Grey County,GRY\n\ ,ON,Town of Haldimand,HAL\n\ ,ON,Haliburton County,HLB\n\ ,ON,Halton Regional Municipality,HTN\n\ ,ON,City of Hamilton,HAM\n\ ,ON,Hastings County,HAS\n\ ,ON,Huron County,HUR\n\ ,ON,City of Kawartha Lakes,KAW\n\ ,ON,Kenora District,KEN\n\ ,ON,Lambton County,LAM\n\ ,ON,Lanark County,LAN\n\ ,ON,Leeds Grenville United Counties,LGR\n\ ,ON,Lennox-Addington County,LXA\n\ ,ON,Manitoulin District,MAN\n\ ,ON,Middlesex County,MSX\n\ ,ON,Muskoka District,MUS\n\ ,ON,Niagara Regional Municipality,NIA\n\ ,ON,Nipissing District,NIP\n\ ,ON,Town of Norfolk,NFK\n\ ,ON,Northumberland County,NOR\n\ ,ON,City of Ottawa,OTT\n\ ,ON,Oxford County,OXF\n\ ,ON,Parry Sound District,PSD\n\ ,ON,Peel Regional Municipality,PEL\n\ ,ON,Perth County,PER\n\ ,ON,Peterborough County,PET\n\ ,ON,United Counties of Prescott Russell,PRU\n\ ,ON,City of Prince Edward,PED\n\ ,ON,Rainy River District,RAI\n\ ,ON,Renfrew County,REN\n\ ,ON,Simcoe County,SIM\n\ ,ON,United Counties of Stormont Dundas Glengarry,SDG\n\ ,ON,Sudbury District,SUD\n\ ,ON,Thunder Bay District,TBY\n\ ,ON,Timiskaming District,TIM\n\ ,ON,City of Toronto,TOR\n\ ,ON,Waterloo Regional Municipality,WAT\n\ ,ON,Wellington County,WEL\n\ ,ON,York Regional Municipality,YRK\n\ Oregon,OR,Baker,BAK\n\ ,OR,Benton,BEN\n\ ,OR,Clackamas,CLK\n\ ,OR,Clatsop,CLT\n\ ,OR,Columbia,COL\n\ ,OR,Coos,COO\n\ ,OR,Crook,CRO\n\ ,OR,Curry,CUR\n\ ,OR,Deschutes,DES\n\ ,OR,Douglas,DOU\n\ ,OR,Gilliam,GIL\n\ ,OR,Grant,GRA\n\ ,OR,Harney,HAR\n\ ,OR,Hood River,HOO\n\ ,OR,Jackson,JAC\n\ ,OR,Jefferson,JEF\n\ ,OR,Josephine,JOS\n\ ,OR,Klamath,KLA\n\ ,OR,Lake,LAK\n\ ,OR,Lane,LAN\n\ ,OR,Lincoln,LCN\n\ ,OR,Linn,LNN\n\ ,OR,Malheur,MAL\n\ ,OR,Marion,MAR\n\ ,OR,Morrow,MOR\n\ ,OR,Multnomah,MUL\n\ ,OR,Polk,POL\n\ ,OR,Sherman,SHE\n\ ,OR,Tillamook,TIL\n\ ,OR,Umatilla,UMA\n\ ,OR,Union,UNI\n\ ,OR,Wallowa,WAL\n\ ,OR,Wasco,WCO\n\ ,OR,Washington,WSH\n\ ,OR,Wheeler,WHE\n\ ,OR,Yamhill,YAM\n\ Pennsylvania,PA,Adams,ADA\n\ ,PA,Allegheny,ALL\n\ ,PA,Armstrong,ARM\n\ ,PA,Beaver,BEA\n\ ,PA,Bedford,BED\n\ ,PA,Berks,BER\n\ ,PA,Blair,BLA\n\ ,PA,Bradford,BRA\n\ ,PA,Bucks,BUX\n\ ,PA,Butler,BUT\n\ ,PA,Cambria,CMB\n\ ,PA,Cameron,CRN\n\ ,PA,Carbon,CAR\n\ ,PA,Centre,CEN\n\ ,PA,Chester,CHE\n\ ,PA,Clarion,CLA\n\ ,PA,Clearfield,CLE\n\ ,PA,Clinton,CLI\n\ ,PA,Columbia,COL\n\ ,PA,Crawford,CRA\n\ ,PA,Cumberland,CUM\n\ ,PA,Dauphin,DAU\n\ ,PA,Delaware,DCO\n\ ,PA,Elk,ELK\n\ ,PA,Erie,ERI\n\ ,PA,Fayette,FAY\n\ ,PA,Forest,FOR\n\ ,PA,Franklin,FRA\n\ ,PA,Fulton,FUL\n\ ,PA,Greene,GRE\n\ ,PA,Huntingdon,HUN\n\ ,PA,Indiana,INN\n\ ,PA,Jefferson,JEF\n\ ,PA,Juniata,JUN\n\ ,PA,Lackawanna,LAC\n\ ,PA,Lancaster,LAN\n\ ,PA,Lawrence,LAW\n\ ,PA,Lebanon,LEB\n\ ,PA,Lehigh,LEH\n\ ,PA,Luzerne,LUZ\n\ ,PA,Lycoming,LYC\n\ ,PA,Mc Kean,MCK\n\ ,PA,Mercer,MER\n\ ,PA,Mifflin,MIF\n\ ,PA,Monroe,MOE\n\ ,PA,Montgomery,MGY\n\ ,PA,Montour,MTR\n\ ,PA,Northampton,NHA\n\ ,PA,Northumberland,NUM\n\ ,PA,Perry,PER\n\ ,PA,Philadelphia,PHI\n\ ,PA,Pike,PIK\n\ ,PA,Potter,POT\n\ ,PA,Schuylkill,SCH\n\ ,PA,Snyder,SNY\n\ ,PA,Somerset,SOM\n\ ,PA,Sullivan,SUL\n\ ,PA,Susquehanna,SUS\n\ ,PA,Tioga,TIO\n\ ,PA,Union,UNI\n\ ,PA,Venango,VEN\n\ ,PA,Warren,WAR\n\ ,PA,Washington,WAS\n\ ,PA,Wayne,WAY\n\ ,PA,Westmoreland,WES\n\ ,PA,Wyoming,WYO\n\ ,PA,York,YOR\n\ Puerto Rico,PR,Adjuntas Municipio,\n\ ,PR,Aguada Municipio,\n\ ,PR,Aguadilla Municipio,\n\ ,PR,Aguas Buenas Municipio,\n\ ,PR,Aibonito Municipio,\n\ ,PR,Anasco Municipio,\n\ ,PR,Arecibo Municipio,\n\ ,PR,Arroyo Municipio,\n\ ,PR,Barceloneta Municipio,\n\ ,PR,Barranquitas Municipio,\n\ ,PR,Bayamon Municipio,\n\ ,PR,Cabo Rojo Municipio,\n\ ,PR,Caguas Municipio,\n\ ,PR,Camuy Municipio,\n\ ,PR,Canovanas Municipio,\n\ ,PR,Carolina Municipio,\n\ ,PR,Catano Municipio,\n\ ,PR,Cayey Municipio,\n\ ,PR,Ceiba Municipio,\n\ ,PR,Ciales Municipio,\n\ ,PR,Cidra Municipio,\n\ ,PR,Coamo Municipio,\n\ ,PR,Comerio Municipio,\n\ ,PR,Corozal Municipio,\n\ ,PR,Culebra Municipio,\n\ ,PR,Dorado Municipio,\n\ ,PR,Fajardo Municipio,\n\ ,PR,Florida Municipio,\n\ ,PR,Guanica Municipio,\n\ ,PR,Guayama Municipio,\n\ ,PR,Guayanilla Municipio,\n\ ,PR,Guaynabo Municipio,\n\ ,PR,Gurabo Municipio,\n\ ,PR,Hatillo Municipio,\n\ ,PR,Hormigueros Municipio,\n\ ,PR,Humacao Municipio,\n\ ,PR,Isabela Municipio,\n\ ,PR,Jayuya Municipio,\n\ ,PR,Juana Diaz Municipio,\n\ ,PR,Juncos Municipio,\n\ ,PR,Lajas Municipio,\n\ ,PR,Lares Municipio,\n\ ,PR,Las Marias Municipio,\n\ ,PR,Las Piedras Municipio,\n\ ,PR,Loiza Municipio,\n\ ,PR,Luquillo Municipio,\n\ ,PR,Manati Municipio,\n\ ,PR,Maricao Municipio,\n\ ,PR,Maunabo Municipio,\n\ ,PR,Mayaguez Municipio,\n\ ,PR,Moca Municipio,\n\ ,PR,Morovis Municipio,\n\ ,PR,Naguabo Municipio,\n\ ,PR,Naranjito Municipio,\n\ ,PR,Orocovis Municipio,\n\ ,PR,Patillas Municipio,\n\ ,PR,Penuelas Municipio,\n\ ,PR,Ponce Municipio,\n\ ,PR,Quebradillas Municipio,\n\ ,PR,Rincon Municipio,\n\ ,PR,Rio Grande Municipio,\n\ ,PR,Sabana Grande Municipio,\n\ ,PR,Salinas Municipio,\n\ ,PR,San German Municipio,\n\ ,PR,San Juan Municipio,\n\ ,PR,San Lorenzo Municipio,\n\ ,PR,San Sebastian Municipio,\n\ ,PR,Santa Isabel Municipio,\n\ ,PR,Toa Alta Municipio,\n\ ,PR,Toa Baja Municipio,\n\ ,PR,Trujillo Alto Municipio,\n\ ,PR,Utuado Municipio,\n\ ,PR,Vega Alta Municipio,\n\ ,PR,Vega Baja Municipio,\n\ ,PR,Vieques Municipio,\n\ ,PR,Villalba Municipio,\n\ ,PR,Yabucoa Municipio,\n\ ,PR,Yauco Municipio,\n\ Rhode Island,RI,Bristol,BRI\n\ ,RI,Kent,KNT\n\ ,RI,Newport,NEW\n\ ,RI,Providence,PRO\n\ ,RI,Washington,WAR\n\ South Carolina,SC,Abbeville,ABBE\n\ ,SC,Aiken,AIKE\n\ ,SC,Allendale,ALLE\n\ ,SC,Anderson,ANDE\n\ ,SC,Bamberg,BAMB\n\ ,SC,Barnwell,BARN\n\ ,SC,Beaufort,BEAU\n\ ,SC,Berkeley,BERK\n\ ,SC,Calhoun,CHOU\n\ ,SC,Charleston,CHAR\n\ ,SC,Chester,CHES\n\ ,SC,Chesterfield,CHFD\n\ ,SC,Cherokee,CKEE\n\ ,SC,Clarendon,CLRN\n\ ,SC,Colleton,COLL\n\ ,SC,Darlington,DARL\n\ ,SC,Dillon,DILL\n\ ,SC,Dorchester,DORC\n\ ,SC,Edgefield,EDGE\n\ ,SC,Fairfield,FAIR\n\ ,SC,Florence,FLOR\n\ ,SC,Georgetown,GEOR\n\ ,SC,Greenwood,GRWD\n\ ,SC,Greenville,GVIL\n\ ,SC,Hampton,HAMP\n\ ,SC,Horry,HORR\n\ ,SC,Jasper,JASP\n\ ,SC,Kershaw,KERS\n\ ,SC,Laurens,LAUR\n\ ,SC,Lee,LEE\n\ ,SC,Lexington,LEXI\n\ ,SC,Lancaster,LNCS\n\ ,SC,Marion,MARI\n\ ,SC,Marlboro,MARL\n\ ,SC,McCormick,MCOR\n\ ,SC,Newberry,NEWB\n\ ,SC,Oconee,OCON\n\ ,SC,Orangeburg,ORNG\n\ ,SC,Pickens,PICK\n\ ,SC,Richland,RICH\n\ ,SC,Saluda,SALU\n\ ,SC,Spartanburg,SPAR\n\ ,SC,Sumter,SUMT\n\ ,SC,Union,UNIO\n\ ,SC,Williamsburg,WILL\n\ ,SC,York,YORK\n\ South Dakota,SD,Aurora,AURO\n\ ,SD,Beadle,BEAD\n\ ,SD,Bennett,BENN\n\ ,SD,Bon Homme,BONH\n\ ,SD,Brookings,BROO\n\ ,SD,Brule,BRUL\n\ ,SD,Brown,BRWN\n\ ,SD,Buffalo,BUFF\n\ ,SD,Butte,BUTT\n\ ,SD,Campbell,CAMP\n\ ,SD,Charles Mix,CHAR\n\ ,SD,Clay,CLAY\n\ ,SD,Clark,CLRK\n\ ,SD,Codington,CODI\n\ ,SD,Corson,CORS\n\ ,SD,Custer,CUST\n\ ,SD,Davison,DAVI\n\ ,SD,Day,DAY\n\ ,SD,Deuel,DEUE\n\ ,SD,Dewey,DEWY\n\ ,SD,Douglas,DGLS\n\ ,SD,Edmunds,EDMU\n\ ,SD,Fall River,FALL\n\ ,SD,Faulk,FAUL\n\ ,SD,Grant,GRAN\n\ ,SD,Gregory,GREG\n\ ,SD,Haakon,HAAK\n\ ,SD,Hamlin,HAML\n\ ,SD,Hand,HAND\n\ ,SD,Hanson,HNSN\n\ ,SD,Harding,HRDG\n\ ,SD,Hughes,HUGH\n\ ,SD,Hutchinson,HUTC\n\ ,SD,Hyde,HYDE\n\ ,SD,Jerauld,JERA\n\ ,SD,Jackson,JKSN\n\ ,SD,Jones,JONE\n\ ,SD,Kingsbury,KING\n\ ,SD,Lake,LAKE\n\ ,SD,Lawrence,LAWR\n\ ,SD,Lincoln,LINC\n\ ,SD,Lyman,LYMA\n\ ,SD,McCook,MCOO\n\ ,SD,McPherson,MCPH\n\ ,SD,Meade,MEAD\n\ ,SD,Mellette,MELL\n\ ,SD,Miner,MINE\n\ ,SD,Minnehaha,MINN\n\ ,SD,Moody,MOOD\n\ ,SD,Marshall,MRSH\n\ ,SD,Oglala Lakota,OGLA\n\ ,SD,Pennington,PENN\n\ ,SD,Perkins,PERK\n\ ,SD,Potter,POTT\n\ ,SD,Roberts,ROBE\n\ ,SD,Sanborn,SANB\n\ ,SD,Spink,SPIN\n\ ,SD,Stanley,STAN\n\ ,SD,Sully,SULL\n\ ,SD,Todd,TODD\n\ ,SD,Tripp,TRIP\n\ ,SD,Turner,TURN\n\ ,SD,Union,UNIO\n\ ,SD,Walworth,WALW\n\ ,SD,Yankton,YANK\n\ ,SD,Ziebach,ZIEB\n\ Tennessee,TN,Anderson,ANDE\n\ ,TN,Bedford,BEDF\n\ ,TN,Benton,BENT\n\ ,TN,Bledsoe,BLED\n\ ,TN,Blount,BLOU\n\ ,TN,Bradley,BRAD\n\ ,TN,Campbell,CAMP\n\ ,TN,Cannon,CANN\n\ ,TN,Carroll,CARR\n\ ,TN,Carter,CART\n\ ,TN,Cheatham,CHEA\n\ ,TN,Chester,CHES\n\ ,TN,Claiborne,CLAI\n\ ,TN,Clay,CLAY\n\ ,TN,Cocke,COCK\n\ ,TN,Coffee,COFF\n\ ,TN,Crockett,CROC\n\ ,TN,Cumberland,CUMB\n\ ,TN,Davidson,DAVI\n\ ,TN,Decatur,DECA\n\ ,TN,DeKalb,DEKA\n\ ,TN,Dickson,DICK\n\ ,TN,Dyer,DYER\n\ ,TN,Fayette,FAYE\n\ ,TN,Fentress,FENT\n\ ,TN,Franklin,FRAN\n\ ,TN,Gibson,GIBS\n\ ,TN,Giles,GILE\n\ ,TN,Grainger,GRAI\n\ ,TN,Greene,GREE\n\ ,TN,Grundy,GRUN\n\ ,TN,Hamblen,HAMB\n\ ,TN,Hamilton,HAMI\n\ ,TN,Hancock,HANC\n\ ,TN,Hardeman,HARD\n\ ,TN,Hardin,HARN\n\ ,TN,Hawkins,HAWK\n\ ,TN,Haywood,HAYW\n\ ,TN,Henderson,HEND\n\ ,TN,Henry,HENR\n\ ,TN,Hickman,HICK\n\ ,TN,Houston,HOUS\n\ ,TN,Humphreys,HUMP\n\ ,TN,Jackson,JACK\n\ ,TN,Jefferson,JEFF\n\ ,TN,Johnson,JOHN\n\ ,TN,Knox,KNOX\n\ ,TN,Lake,LAKE\n\ ,TN,Lauderdale,LAUD\n\ ,TN,Lawrence,LAWR\n\ ,TN,Lewis,LEWI\n\ ,TN,Lincoln,LINC\n\ ,TN,Loudon,LOUD\n\ ,TN,Macon,MACO\n\ ,TN,Madison,MADI\n\ ,TN,Marion,MARI\n\ ,TN,Marshall,MARS\n\ ,TN,Maury,MAUR\n\ ,TN,McMinn,MCMI\n\ ,TN,McNairy,MCNA\n\ ,TN,Meigs,MEIG\n\ ,TN,Monroe,MONR\n\ ,TN,Montgomery,MONT\n\ ,TN,Moore,MOOR\n\ ,TN,Morgan,MORG\n\ ,TN,Obion,OBIO\n\ ,TN,Overton,OVER\n\ ,TN,Perry,PERR\n\ ,TN,Pickett,PICK\n\ ,TN,Polk,POLK\n\ ,TN,Putnam,PUTN\n\ ,TN,Rhea,RHEA\n\ ,TN,Roane,ROAN\n\ ,TN,Robertson,ROBE\n\ ,TN,Rutherford,RUTH\n\ ,TN,Scott,SCOT\n\ ,TN,Sequatchie,SEQU\n\ ,TN,Sevier,SEVI\n\ ,TN,Shelby,SHEL\n\ ,TN,Smith,SMIT\n\ ,TN,Stewart,STEW\n\ ,TN,Sullivan,SULL\n\ ,TN,Sumner,SUMN\n\ ,TN,Tipton,TIPT\n\ ,TN,Trousdale,TROU\n\ ,TN,Unicoi,UNIC\n\ ,TN,Union,UNIO\n\ ,TN,Van Buren,VANB\n\ ,TN,Warren,WARR\n\ ,TN,Washington,WASH\n\ ,TN,Wayne,WAYN\n\ ,TN,Weakley,WEAK\n\ ,TN,White,WHIT\n\ ,TN,Williamson,WILL\n\ ,TN,Wilson,WILS\n\ Texas,TX,Anderson,ANDE\n\ ,TX,Andrews,ANDR\n\ ,TX,Angelina,ANGE\n\ ,TX,Aransas,ARAN\n\ ,TX,Archer,ARCH\n\ ,TX,Armstrong,ARMS\n\ ,TX,Atascosa,ATAS\n\ ,TX,Austin,AUST\n\ ,TX,Bailey,BAIL\n\ ,TX,Bandera,BAND\n\ ,TX,Bastrop,BAST\n\ ,TX,Baylor,BAYL\n\ ,TX,Bee,BEE\n\ ,TX,Bell,BELL\n\ ,TX,Bexar,BEXA\n\ ,TX,Blanco,BLAN\n\ ,TX,Borden,BORD\n\ ,TX,Bosque,BOSQ\n\ ,TX,Bowie,BOWI\n\ ,TX,Brazoria,BZIA\n\ ,TX,Brazos,BZOS\n\ ,TX,Brewster,BREW\n\ ,TX,Briscoe,BRIS\n\ ,TX,Brooks,BROO\n\ ,TX,Brown,BROW\n\ ,TX,Burleson,BURL\n\ ,TX,Burnet,BURN\n\ ,TX,Caldwell,CALD\n\ ,TX,Calhoun,CALH\n\ ,TX,Callahan,CALL\n\ ,TX,Cameron,CMRN\n\ ,TX,Camp,CAMP\n\ ,TX,Carson,CARS\n\ ,TX,Cass,CASS\n\ ,TX,Castro,CAST\n\ ,TX,Chambers,CHAM\n\ ,TX,Cherokee,CHER\n\ ,TX,Childress,CHIL\n\ ,TX,Clay,CLAY\n\ ,TX,Cochran,COCH\n\ ,TX,Coke,COKE\n\ ,TX,Coleman,COLE\n\ ,TX,Collin,COLN\n\ ,TX,Collingsworth,COLW\n\ ,TX,Colorado,COLO\n\ ,TX,Comal,COML\n\ ,TX,Comanche,COMA\n\ ,TX,Concho,CONC\n\ ,TX,Cooke,COOK\n\ ,TX,Coryell,CORY\n\ ,TX,Cottle,COTT\n\ ,TX,Crane,CRAN\n\ ,TX,Crockett,CROC\n\ ,TX,Crosby,CROS\n\ ,TX,Culberson,CULB\n\ ,TX,Dallam,DALM\n\ ,TX,Dallas,DALS\n\ ,TX,Dawson,DAWS\n\ ,TX,Deaf Smith,DSMI\n\ ,TX,Delta,DELT\n\ ,TX,Denton,DENT\n\ ,TX,Dewitt,DEWI\n\ ,TX,Dickens,DICK\n\ ,TX,Dimmit,DIMM\n\ ,TX,Donley,DONL\n\ ,TX,Duval,DUVA\n\ ,TX,Eastland,EAST\n\ ,TX,Ector,ECTO\n\ ,TX,Edwards,EDWA\n\ ,TX,El Paso,EPAS\n\ ,TX,Ellis,ELLI\n\ ,TX,Erath,ERAT\n\ ,TX,Falls,FALL\n\ ,TX,Fannin,FANN\n\ ,TX,Fayette,FAYE\n\ ,TX,Fisher,FISH\n\ ,TX,Floyd,FLOY\n\ ,TX,Foard,FOAR\n\ ,TX,Fort Bend,FBEN\n\ ,TX,Franklin,FRAN\n\ ,TX,Freestone,FREE\n\ ,TX,Frio,FRIO\n\ ,TX,Gaines,GAIN\n\ ,TX,Galveston,GALV\n\ ,TX,Garza,GARZ\n\ ,TX,Gillespie,GILL\n\ ,TX,Glasscock,GLAS\n\ ,TX,Goliad,GOLI\n\ ,TX,Gonzales,GONZ\n\ ,TX,Gray,GRAY\n\ ,TX,Grayson,GRSN\n\ ,TX,Gregg,GREG\n\ ,TX,Grimes,GRIM\n\ ,TX,Guadalupe,GUAD\n\ ,TX,Hale,HALE\n\ ,TX,Hall,HALL\n\ ,TX,Hamilton,HAMI\n\ ,TX,Hansford,HANS\n\ ,TX,Hardeman,HDMN\n\ ,TX,Hardin,HRDN\n\ ,TX,Harris,HARR\n\ ,TX,Harrison,HRSN\n\ ,TX,Hartley,HART\n\ ,TX,Haskell,HASK\n\ ,TX,Hays,HAYS\n\ ,TX,Hemphill,HEMP\n\ ,TX,Henderson,HEND\n\ ,TX,Hidalgo,HIDA\n\ ,TX,Hill,HILL\n\ ,TX,Hockley,HOCK\n\ ,TX,Hood,HOOD\n\ ,TX,Hopkins,HOPK\n\ ,TX,Houston,HOUS\n\ ,TX,Howard,HOWA\n\ ,TX,Hudspeth,HUDS\n\ ,TX,Hunt,HUNT\n\ ,TX,Hutchinson,HUTC\n\ ,TX,Irion,IRIO\n\ ,TX,Jack,JACK\n\ ,TX,Jackson,JKSN\n\ ,TX,Jasper,JASP\n\ ,TX,Jeff Davis,JDAV\n\ ,TX,Jefferson,JEFF\n\ ,TX,Jim Hogg,JHOG\n\ ,TX,Jim Wells,JWEL\n\ ,TX,Johnson,JOHN\n\ ,TX,Jones,JONE\n\ ,TX,Karnes,KARN\n\ ,TX,Kaufman,KAUF\n\ ,TX,Kendall,KEND\n\ ,TX,Kenedy,KENY\n\ ,TX,Kent,KENT\n\ ,TX,Kerr,KERR\n\ ,TX,Kimble,KIMB\n\ ,TX,King,KING\n\ ,TX,Kinney,KINN\n\ ,TX,Kleberg,KLEB\n\ ,TX,Knox,KNOX\n\ ,TX,Lamar,LAMA\n\ ,TX,Lamb,LAMB\n\ ,TX,Lampasas,LAMP\n\ ,TX,La Salle,LSAL\n\ ,TX,Lavaca,LAVA\n\ ,TX,Lee,LEE\n\ ,TX,Leon,LEON\n\ ,TX,Liberty,LIBE\n\ ,TX,Limestone,LIME\n\ ,TX,Lipscomb,LIPS\n\ ,TX,Live Oak,LIVO\n\ ,TX,Llano,LLAN\n\ ,TX,Loving,LOVI\n\ ,TX,Lubbock,LUBB\n\ ,TX,Lynn,LYNN\n\ ,TX,Madison,MADI\n\ ,TX,Marion,MARI\n\ ,TX,Martin,MART\n\ ,TX,Mason,MASO\n\ ,TX,Matagorda,MATA\n\ ,TX,Maverick,MAVE\n\ ,TX,McCulloch,MCUL\n\ ,TX,McLennan,MLEN\n\ ,TX,McMullen,MMUL\n\ ,TX,Medina,MEDI\n\ ,TX,Menard,MENA\n\ ,TX,Midland,MIDL\n\ ,TX,Milam,MILA\n\ ,TX,Mills,MILL\n\ ,TX,Mitchell,MITC\n\ ,TX,Montague,MONT\n\ ,TX,Montgomery,MGMY\n\ ,TX,Moore,MOOR\n\ ,TX,Morris,MORR\n\ ,TX,Motley,MOTL\n\ ,TX,Nacogdoches,NACO\n\ ,TX,Navarro,NAVA\n\ ,TX,Newton,NEWT\n\ ,TX,Nolan,NOLA\n\ ,TX,Nueces,NUEC\n\ ,TX,Ochiltree,OCHI\n\ ,TX,Oldham,OLDH\n\ ,TX,Orange,ORAN\n\ ,TX,Palo Pinto,PPIN\n\ ,TX,Panola,PANO\n\ ,TX,Parker,PARK\n\ ,TX,Parmer,PARM\n\ ,TX,Pecos,PECO\n\ ,TX,Polk,POLK\n\ ,TX,Potter,POTT\n\ ,TX,Presidio,PRES\n\ ,TX,Rains,RAIN\n\ ,TX,Randall,RAND\n\ ,TX,Reagan,REAG\n\ ,TX,Real,REAL\n\ ,TX,Red River,RRIV\n\ ,TX,Reeves,REEV\n\ ,TX,Refugio,REFU\n\ ,TX,Roberts,ROBE\n\ ,TX,Robertson,RBSN\n\ ,TX,Rockwall,ROCK\n\ ,TX,Runnels,RUNN\n\ ,TX,Rusk,RUSK\n\ ,TX,Sabine,SABI\n\ ,TX,San Augustine,SAUG\n\ ,TX,San Jacinto,SJAC\n\ ,TX,San Patricio,SPAT\n\ ,TX,San Saba,SSAB\n\ ,TX,Schleicher,SCHL\n\ ,TX,Scurry,SCUR\n\ ,TX,Shackelford,SHAC\n\ ,TX,Shelby,SHEL\n\ ,TX,Sherman,SHMN\n\ ,TX,Smith,SMIT\n\ ,TX,Somervell,SOME\n\ ,TX,Starr,STAR\n\ ,TX,Stephens,STEP\n\ ,TX,Sterling,STER\n\ ,TX,Stonewall,STON\n\ ,TX,Sutton,SUTT\n\ ,TX,Swisher,SWIS\n\ ,TX,Tarrant,TARR\n\ ,TX,Taylor,TAYL\n\ ,TX,Terrell,TERL\n\ ,TX,Terry,TERY\n\ ,TX,Throckmorton,THRO\n\ ,TX,Titus,TITU\n\ ,TX,Tom Green,TGRE\n\ ,TX,Travis,TRAV\n\ ,TX,Trinity,TRIN\n\ ,TX,Tyler,TYLE\n\ ,TX,Upshur,UPSH\n\ ,TX,Upton,UPTO\n\ ,TX,Uvalde,UVAL\n\ ,TX,Val Verde,VVER\n\ ,TX,Van Zandt,VZAN\n\ ,TX,Victoria,VICT\n\ ,TX,Walker,WALK\n\ ,TX,Waller,WALL\n\ ,TX,Ward,WARD\n\ ,TX,Washington,WASH\n\ ,TX,Webb,WEBB\n\ ,TX,Wharton,WHAR\n\ ,TX,Wheeler,WHEE\n\ ,TX,Wichita,WICH\n\ ,TX,Wilbarger,WILB\n\ ,TX,Willacy,WILY\n\ ,TX,Williamson,WMSN\n\ ,TX,Wilson,WLSN\n\ ,TX,Winkler,WINK\n\ ,TX,Wise,WISE\n\ ,TX,Wood,WOOD\n\ ,TX,Yoakum,YOAK\n\ ,TX,Young,YOUN\n\ ,TX,Zapata,ZAPA\n\ ,TX,Zavala,ZAVA\n\ Midway,UM,Midway Islands,\n\ Utah,UT,Beaver,BEA\n\ ,UT,Box Elder,BOX\n\ ,UT,Cache,CAC\n\ ,UT,Carbon,CAR\n\ ,UT,Daggett,DAG\n\ ,UT,Davis,DAV\n\ ,UT,Duchesne,DUC\n\ ,UT,Emery,EME\n\ ,UT,Garfield,GAR\n\ ,UT,Grand,GRA\n\ ,UT,Iron,IRO\n\ ,UT,Juab,JUA\n\ ,UT,Kane,KAN\n\ ,UT,Millard,MIL\n\ ,UT,Morgan,MOR\n\ ,UT,Piute,PIU\n\ ,UT,Rich,RIC\n\ ,UT,Salt Lake,SAL\n\ ,UT,San Juan,SNJ\n\ ,UT,Sanpete,SNP\n\ ,UT,Sevier,SEV\n\ ,UT,Summit,SUM\n\ ,UT,Tooele,TOO\n\ ,UT,Uintah,UIN\n\ ,UT,Utah,UTA\n\ ,UT,Wasatch,WST\n\ ,UT,Washington,WSH\n\ ,UT,Wayne,WAY\n\ ,UT,Weber,WEB\n\ Vermont,VT,Addison,ADD\n\ ,VT,Bennington,BEN\n\ ,VT,Caledonia,CAL\n\ ,VT,Chittenden,CHI\n\ ,VT,Essex,ESS\n\ ,VT,Franklin,FRA\n\ ,VT,Grand Isle,GRA\n\ ,VT,Lamoille,LAM\n\ ,VT,Orange,ORA\n\ ,VT,Orleans,ORL\n\ ,VT,Rutland,RUT\n\ ,VT,Washington,WAS\n\ ,VT,Windham,WNH\n\ ,VT,Windsor,WNS\n\ Virginia,VA,Accomack,ACC\n\ ,VA,Albemarle,ALB\n\ ,VA,Alexandria,ALX\n\ ,VA,Alleghany,ALL\n\ ,VA,Amelia,AME\n\ ,VA,Amherst,AMH\n\ ,VA,Appomattox,APP\n\ ,VA,Arlington,ARL\n\ ,VA,Augusta,AUG\n\ ,VA,Bath,BAT\n\ ,VA,Bedford,BED\n\ ,VA,Bland,BLA\n\ ,VA,Botetourt,BOT\n\ ,VA,Bristol,BRX\n\ ,VA,Brunswick,BRU\n\ ,VA,Buchanan,BCH\n\ ,VA,Buckingham,BHM\n\ ,VA,Buena Vista,BVX\n\ ,VA,Campbell,CAM\n\ ,VA,Caroline,CLN\n\ ,VA,Carroll,CRL\n\ ,VA,Charles City,CCY\n\ ,VA,Charlotte,CHA\n\ ,VA,Charlottesville,CHX\n\ ,VA,Chesapeake,CPX\n\ ,VA,Chesterfield,CHE\n\ ,VA,Clarke,CLA\n\ ,VA,Colonial Heights,COX\n\ ,VA,Covington,CVX\n\ ,VA,Craig,CRA\n\ ,VA,Culpeper,CUL\n\ ,VA,Cumberland,CUM\n\ ,VA,Danville,DAX\n\ ,VA,Dickenson,DIC\n\ ,VA,Dinwiddie,DIN\n\ ,VA,Emporia,EMX\n\ ,VA,Essex,ESS\n\ ,VA,Fairfax,FFX\n\ ,VA,Fairfax City,FXX\n\ ,VA,Falls Church,FCX\n\ ,VA,Fauquier,FAU\n\ ,VA,Floyd,FLO\n\ ,VA,Fluvanna,FLU\n\ ,VA,Franklin,FRA\n\ ,VA,Franklin City,FRX\n\ ,VA,Frederick,FRE\n\ ,VA,Fredericksburg,FBX\n\ ,VA,Galax,GAX\n\ ,VA,Giles,GIL\n\ ,VA,Gloucester,GLO\n\ ,VA,Goochland,GOO\n\ ,VA,Grayson,GRA\n\ ,VA,Greene,GRN\n\ ,VA,Greensville,GVL\n\ ,VA,Halifax,HAL\n\ ,VA,Hampton,HAX\n\ ,VA,Hanover,HAN\n\ ,VA,Harrisonburg,HBX\n\ ,VA,Henrico,HCO\n\ ,VA,Henry,HRY\n\ ,VA,Highland,HIG\n\ ,VA,Hopewell,HOX\n\ ,VA,Isle of Wight,IOW\n\ ,VA,James City,JAM\n\ ,VA,King and Queen,KQN\n\ ,VA,King George,KGE\n\ ,VA,King William,KWM\n\ ,VA,Lancaster,LAN\n\ ,VA,Lee,LEE\n\ ,VA,Lexington,LEX\n\ ,VA,Loudoun,LDN\n\ ,VA,Louisa,LSA\n\ ,VA,Lunenburg,LUN\n\ ,VA,Lynchburg,LYX\n\ ,VA,Madison,MAD\n\ ,VA,Manassas,MAX\n\ ,VA,Manassas Park,MPX\n\ ,VA,Martinsville,MVX\n\ ,VA,Mathews,MAT\n\ ,VA,Mecklenburg,MEC\n\ ,VA,Middlesex,MID\n\ ,VA,Montgomery,MON\n\ ,VA,Nelson,NEL\n\ ,VA,New Kent,NEW\n\ ,VA,Newport News,NNX\n\ ,VA,Norfolk,NFX\n\ ,VA,Northampton,NHA\n\ ,VA,Northumberland,NUM\n\ ,VA,Norton,NRX\n\ ,VA,Nottoway,NOT\n\ ,VA,Orange,ORG\n\ ,VA,Page,PAG\n\ ,VA,Patrick,PAT\n\ ,VA,Petersburg,PBX\n\ ,VA,Pittsylvania,PIT\n\ ,VA,Poquoson,PQX\n\ ,VA,Portsmouth,POX\n\ ,VA,Powhatan,POW\n\ ,VA,Prince Edward,PRE\n\ ,VA,Prince George,PRG\n\ ,VA,Prince William,PRW\n\ ,VA,Pulaski,PUL\n\ ,VA,Radford,RAX\n\ ,VA,Rappahannock,RAP\n\ ,VA,Richmond,RIC\n\ ,VA,Richmond City,RIX\n\ ,VA,Roanoke,ROA\n\ ,VA,Roanoke City,ROX\n\ ,VA,Rockbridge,RBR\n\ ,VA,Rockingham,RHM\n\ ,VA,Russell,RUS\n\ ,VA,Salem,SAX\n\ ,VA,Scott,SCO\n\ ,VA,Shenandoah,SHE\n\ ,VA,Smyth,SMY\n\ ,VA,Southampton,SHA\n\ ,VA,Spotsylvania,SPO\n\ ,VA,Stafford,STA\n\ ,VA,Staunton,STX\n\ ,VA,Suffolk,SUX\n\ ,VA,Surry,SUR\n\ ,VA,Sussex,SUS\n\ ,VA,Tazewell,TAZ\n\ ,VA,Virginia Beach,VBX\n\ ,VA,Warren,WAR\n\ ,VA,Washington,WAS\n\ ,VA,Waynesboro,WAX\n\ ,VA,Westmoreland,WES\n\ ,VA,Williamsburg,WMX\n\ ,VA,Winchester,WIX\n\ ,VA,Wise,WIS\n\ ,VA,Wythe,WYT\n\ ,VA,York,YOR\n\ U.S. Virgin Islands,VI,St. Croix Island,\n\ ,VI,St. John Island,\n\ ,VI,St. Thomas Island,\n\ Washington,WA,Adams,ADA\n\ ,WA,Asotin,ASO\n\ ,WA,Benton,BEN\n\ ,WA,Chelan,CHE\n\ ,WA,Clallam,CLAL\n\ ,WA,Clark,CLAR\n\ ,WA,Columbia,COL\n\ ,WA,Cowlitz,COW\n\ ,WA,Douglas,DOU\n\ ,WA,Ferry,FER\n\ ,WA,Franklin,FRA\n\ ,WA,Garfield,GAR\n\ ,WA,Grant,GRAN\n\ ,WA,Grays Harbor,GRAY\n\ ,WA,Island,ISL\n\ ,WA,Jefferson,JEFF\n\ ,WA,King,KING\n\ ,WA,Kitsap,KITS\n\ ,WA,Kittitas,KITT\n\ ,WA,Klickitat,KLI\n\ ,WA,Lewis,LEW\n\ ,WA,Lincoln,LIN\n\ ,WA,Mason,MAS\n\ ,WA,Okanogan,OKA\n\ ,WA,Pacific,PAC\n\ ,WA,Pend Oreille,PEND\n\ ,WA,Pierce,PIE\n\ ,WA,San Juan,SAN\n\ ,WA,Skagit,SKAG\n\ ,WA,Skamania,SKAM\n\ ,WA,Snohomish,SNO\n\ ,WA,Spokane,SPO\n\ ,WA,Stevens,STE\n\ ,WA,Thurston,THU\n\ ,WA,Wahkiakum,WAH\n\ ,WA,Walla Walla,WAL\n\ ,WA,Whatcom,WHA\n\ ,WA,Whitman,WHI\n\ ,WA,Yakima,YAK\n\ Wisconsin,WI,Adams,ADA\n\ ,WI,Ashland,ASH\n\ ,WI,Barron,BAR\n\ ,WI,Bayfield,BAY\n\ ,WI,Brown,BRO\n\ ,WI,Buffalo,BUF\n\ ,WI,Burnett,BUR\n\ ,WI,Calumet,CAL\n\ ,WI,Chippewa,CHI\n\ ,WI,Clark,CLA\n\ ,WI,Columbia,COL\n\ ,WI,Crawford,CRA\n\ ,WI,Dane,DAN\n\ ,WI,Dodge,DOD\n\ ,WI,Door,DOO\n\ ,WI,Douglas,DOU\n\ ,WI,Dunn,DUN\n\ ,WI,Eau Claire,EAU\n\ ,WI,Florence,FLO\n\ ,WI,Fond du Lac,FON\n\ ,WI,Forest,FOR\n\ ,WI,Grant,GRA\n\ ,WI,Green,GRE\n\ ,WI,Green Lake,GRL\n\ ,WI,Iowa,IOW\n\ ,WI,Iron,IRO\n\ ,WI,Jackson,JAC\n\ ,WI,Jefferson,JEF\n\ ,WI,Juneau,JUN\n\ ,WI,Kenosha,KEN\n\ ,WI,Kewaunee,KEW\n\ ,WI,La Crosse,LAC\n\ ,WI,Lafayette,LAF\n\ ,WI,Langlade,LAN\n\ ,WI,Lincoln,LIN\n\ ,WI,Manitowoc,MAN\n\ ,WI,Marathon,MAR\n\ ,WI,Marinette,MRN\n\ ,WI,Marquette,MRQ\n\ ,WI,Menominee,MEN\n\ ,WI,Milwaukee,MIL\n\ ,WI,Monroe,MON\n\ ,WI,Oconto,OCO\n\ ,WI,Oneida,ONE\n\ ,WI,Outagamie,OUT\n\ ,WI,Ozaukee,OZA\n\ ,WI,Pepin,PEP\n\ ,WI,Pierce,PIE\n\ ,WI,Polk,POL\n\ ,WI,Portage,POR\n\ ,WI,Price,PRI\n\ ,WI,Racine,RAC\n\ ,WI,Richland,RIC\n\ ,WI,Rock,ROC\n\ ,WI,Rusk,RUS\n\ ,WI,Sauk,SAU\n\ ,WI,Sawyer,SAW\n\ ,WI,Shawano,SHA\n\ ,WI,Sheboygan,SHE\n\ ,WI,St. Croix,STC\n\ ,WI,Taylor,TAY\n\ ,WI,Trempealeau,TRE\n\ ,WI,Vernon,VER\n\ ,WI,Vilas,VIL\n\ ,WI,Walworth,WAL\n\ ,WI,Washburn,WSB\n\ ,WI,Washington,WAS\n\ ,WI,Waukesha,WAU\n\ ,WI,Waupaca,WAP\n\ ,WI,Waushara,WSR\n\ ,WI,Winnebago,WIN\n\ ,WI,Wood,WOO\n\ West Virginia,WV,Barbour,BAR\n\ ,WV,Berkeley,BER\n\ ,WV,Boone,BOO\n\ ,WV,Braxton,BRA\n\ ,WV,Brooke,BRO\n\ ,WV,Cabell,CAB\n\ ,WV,Calhoun,CAL\n\ ,WV,Clay,CLA\n\ ,WV,Doddridge,DOD\n\ ,WV,Fayette,FAY\n\ ,WV,Gilmer,GIL\n\ ,WV,Grant,GRA\n\ ,WV,Greenbrier,GRE\n\ ,WV,Hampshire,HAM\n\ ,WV,Hancock,HAN\n\ ,WV,Hardy,HDY\n\ ,WV,Harrison,HAR\n\ ,WV,Jackson,JAC\n\ ,WV,Jefferson,JEF\n\ ,WV,Kanawha,KAN\n\ ,WV,Lewis,LEW\n\ ,WV,Lincoln,LIN\n\ ,WV,Logan,LOG\n\ ,WV,Marion,MRN\n\ ,WV,Marshall,MAR\n\ ,WV,Mason,MAS\n\ ,WV,McDowell,MCD\n\ ,WV,Mercer,MER\n\ ,WV,Mineral,MIN\n\ ,WV,Mingo,MGO\n\ ,WV,Monongalia,MON\n\ ,WV,Monroe,MRO\n\ ,WV,Morgan,MOR\n\ ,WV,Nicholas,NIC\n\ ,WV,Ohio,OHI\n\ ,WV,Pendleton,PEN\n\ ,WV,Pleasants,PLE\n\ ,WV,Pocahontas,POC\n\ ,WV,Preston,PRE\n\ ,WV,Putnam,PUT\n\ ,WV,Raleigh,RAL\n\ ,WV,Randolph,RAN\n\ ,WV,Ritchie,RIT\n\ ,WV,Roane,ROA\n\ ,WV,Summers,SUM\n\ ,WV,Taylor,TAY\n\ ,WV,Tucker,TUC\n\ ,WV,Tyler,TYL\n\ ,WV,Upshur,UPS\n\ ,WV,Wayne,WAY\n\ ,WV,Webster,WEB\n\ ,WV,Wetzel,WET\n\ ,WV,Wirt,WIR\n\ ,WV,Wood,WOO\n\ ,WV,Wyoming,WYO\n\ Wyoming,WY,Albany,ALB\n\ ,WY,Big Horn,BIG\n\ ,WY,Campbell,CAM\n\ ,WY,Carbon,CAR\n\ ,WY,Converse,CON\n\ ,WY,Crook,CRO\n\ ,WY,Fremont,FRE\n\ ,WY,Goshen,GOS\n\ ,WY,Hot Springs,HOT\n\ ,WY,Johnson,JOH\n\ ,WY,Laramie,LAR\n\ ,WY,Lincoln,LIN\n\ ,WY,Natrona,NAT\n\ ,WY,Niobrara,NIO\n\ ,WY,Park,PAR\n\ ,WY,Platte,PLA\n\ ,WY,Sheridan,SHE\n\ ,WY,Sublette,SUB\n\ ,WY,Sweetwater,SWE\n\ ,WY,Teton,TET\n\ ,WY,Uinta,UIN\n\ ,WY,Washakie,WAS\n\ ,WY,Weston,WES\n"; //std::string strNEQP const char *szNEQP = "\ State, ST, County/City, CC\n\ Connecticut,CT,Fairfield,FAICT\n\ ,CT,Hartford,HARCT\n\ ,CT,Litchfield,LITCT\n\ ,CT,Middlesex,MIDCT\n\ ,CT,New Haven,NHVCT\n\ ,CT,New London,NLNCT\n\ ,CT,Tolland,TOLCT\n\ ,CT,Windham,WINCT\n\ Massechusetts,MA,Barnstable,BARMA\n\ ,MA,Berkshire,BERMA\n\ ,MA,Bristol,BRIMA\n\ ,MA,Dukes,DUKMA\n\ ,MA,Essex,ESSMA\n\ ,MA,Franklin,FRAMA\n\ ,MA,Hampden,HMDMA\n\ ,MA,Hampshire,HMPMA\n\ ,MA,Middlesex,MIDMA\n\ ,MA,Nantucket,NANMA\n\ ,MA,Norfolk,NORMA\n\ ,MA,Plymouth,PLYMA\n\ ,MA,Suffolk,SUFMA\n\ ,MA,Worcester,WORMA\n\ Maine,ME,Androscoggin,ANDME\n\ ,ME,Aroostook,AROME\n\ ,ME,Cumberland,CUMME\n\ ,ME,Franklin,FRAME\n\ ,ME,Hancock,HANME\n\ ,ME,Kennebec,KENME\n\ ,ME,Knox,KNOME\n\ ,ME,Lincoln,LINME\n\ ,ME,Oxford,OXFME\n\ ,ME,Penobscot,PENME\n\ ,ME,Piscataquis,PISME\n\ ,ME,Sagadahoc,SAGME\n\ ,ME,Somerset,SOMME\n\ ,ME,Waldo,WALME\n\ ,ME,Washington,WASME\n\ ,ME,York,YORME\n\ New Hampshire,NH,Belknap,BELNH\n\ ,NH,Carroll,CARNH\n\ ,NH,Cheshire,CHENH\n\ ,NH,Coos,COONH\n\ ,NH,Grafton,GRANH\n\ ,NH,Hillsborough,HILNH\n\ ,NH,Merrimack,MERNH\n\ ,NH,Rockingham,ROCNH\n\ ,NH,Strafford,STRNH\n\ ,NH,Sullivan,SULNH\n\ Rhode Island,RI,Bristol,BRIRI\n\ ,RI,Kent,KENRI\n\ ,RI,Newport,NEWRI\n\ ,RI,Providence,PRORI\n\ ,RI,Washington,WASRI\n\ Vermont,VT,Addison,ADDVT\n\ ,VT,Bennington,BENVT\n\ ,VT,Caledonia,CALVT\n\ ,VT,Chittenden,CHIVT\n\ ,VT,Essex,ESSVT\n\ ,VT,Franklin,FRAVT\n\ ,VT,Grand Isle,GRAVT\n\ ,VT,Lamoille,LAMVT\n\ ,VT,Orange,ORAVT\n\ ,VT,Orleans,ORLVT\n\ ,VT,Rutland,RUTVT\n\ ,VT,Washington,WASVT\n\ ,VT,Windham,WNHVT\n\ ,VT,Windsor,WNDVT\n"; //std::string str7QP const char *sz7QP = "\ State, ST, County/City, CC\n\ Arizona,AZ,Apache,AZAPH\n\ ,AZ,Cochise,AZCHS\n\ ,AZ,Coconino,AZCNO\n\ ,AZ,Gila,AZGLA\n\ ,AZ,Graham,AZGHM\n\ ,AZ,Greenlee,AZGLE\n\ ,AZ,La Paz,AZLPZ\n\ ,AZ,Maricopa,AZMCP\n\ ,AZ,Mohave,AZMHV\n\ ,AZ,Navajo,AZNVO\n\ ,AZ,Pima,AZPMA\n\ ,AZ,Pinal,AZPNL\n\ ,AZ,Santa Cruz,AZSCZ\n\ ,AZ,Yavapai,AZYVP\n\ ,AZ,Yuma,AZYMA\n\ Idaho,ID,Ada,IDADA\n\ ,ID,Adams,IDADM\n\ ,ID,Bannock,IDBAN\n\ ,ID,Bear Lake,IDBEA\n\ ,ID,Benewah,IDBEN\n\ ,ID,Bingham,IDBIN\n\ ,ID,Blaine,IDBLA\n\ ,ID,Boise,IDBOI\n\ ,ID,Bonner,IDBNR\n\ ,ID,Bonneville,IDBNV\n\ ,ID,Boundary,IDBOU\n\ ,ID,Butte,IDBUT\n\ ,ID,Camas,IDCAM\n\ ,ID,Canyon,IDCAN\n\ ,ID,Caribou,IDCAR\n\ ,ID,Cassia,IDCAS\n\ ,ID,Clark,IDCLA\n\ ,ID,Clearwater,IDCLE\n\ ,ID,Custer,IDCUS\n\ ,ID,Elmore,IDELM\n\ ,ID,Franklin,IDFRA\n\ ,ID,Fremont,IDFRE\n\ ,ID,Gem,IDGEM\n\ ,ID,Gooding,IDGOO\n\ ,ID,Idaho,IDIDA\n\ ,ID,Jefferson,IDJEF\n\ ,ID,Jerome,IDJER\n\ ,ID,Kootenai,IDKOO\n\ ,ID,Latah,IDLAT\n\ ,ID,Lemhi,IDLEM\n\ ,ID,Lewis,IDLEW\n\ ,ID,Lincoln,IDLIN\n\ ,ID,Madison,IDMAD\n\ ,ID,Minidoka,IDMIN\n\ ,ID,Nez Perce,IDNEZ\n\ ,ID,Oneida,IDONE\n\ ,ID,Owyhee,IDOWY\n\ ,ID,Payette,IDPAY\n\ ,ID,Power,IDPOW\n\ ,ID,Shoshone,IDSHO\n\ ,ID,Teton,IDTET\n\ ,ID,Twin Falls,IDTWI\n\ ,ID,Valley,IDVAL\n\ ,ID,Washington,IDWAS\n\ Montana,MT,Beaverhead,MTBEA\n\ ,MT,Big Horn,MTBIG\n\ ,MT,Blaine,MTBLA\n\ ,MT,Broadwater,MTBRO\n\ ,MT,Carbon,MTCRB\n\ ,MT,Carter,MTCRT\n\ ,MT,Cascade,MTCAS\n\ ,MT,Chouteau,MTCHO\n\ ,MT,Custer,MTCUS\n\ ,MT,Daniels,MTDAN\n\ ,MT,Dawson,MTDAW\n\ ,MT,Deer Lodge,MTDEE\n\ ,MT,Fallon,MTFAL\n\ ,MT,Fergus,MTFER\n\ ,MT,Flathead,MTFLA\n\ ,MT,Gallatin,MTGAL\n\ ,MT,Garfield,MTGAR\n\ ,MT,Glacier,MTGLA\n\ ,MT,Golden Valley,MTGOL\n\ ,MT,Granite,MTGRA\n\ ,MT,Hill,MTHIL\n\ ,MT,Jefferson,MTJEF\n\ ,MT,Judith Basin,MTJUD\n\ ,MT,Lake,MTLAK\n\ ,MT,Lewis & Clark,MTLEW\n\ ,MT,Liberty,MTLIB\n\ ,MT,Lincoln,MTLIN\n\ ,MT,Madison,MTMAD\n\ ,MT,McCone,MTMCC\n\ ,MT,Meagher,MTMEA\n\ ,MT,Mineral,MTMIN\n\ ,MT,Missoula,MTMIS\n\ ,MT,Musselshell,MTMUS\n\ ,MT,Park,MTPAR\n\ ,MT,Petroleum,MTPET\n\ ,MT,Phillips,MTPHI\n\ ,MT,Pondera,MTPON\n\ ,MT,Powder River,MTPWD\n\ ,MT,Powell,MTPWL\n\ ,MT,Prairie,MTPRA\n\ ,MT,Ravalli,MTRAV\n\ ,MT,Richland,MTRIC\n\ ,MT,Roosevelt,MTROO\n\ ,MT,Rosebud,MTROS\n\ ,MT,Sanders,MTSAN\n\ ,MT,Sheridan,MTSHE\n\ ,MT,Silver Bow,MTSIL\n\ ,MT,Stillwater,MTSTI\n\ ,MT,Sweet Grass,MTSWE\n\ ,MT,Teton,MTTET\n\ ,MT,Toole,MTTOO\n\ ,MT,Treasure,MTTRE\n\ ,MT,Valley,MTVAL\n\ ,MT,Wheatland,MTWHE\n\ ,MT,Wibaux,MTWIB\n\ ,MT,Yellowstone,MTYEL\n\ Nevada,NV,Carson City,NVCAR\n\ ,NV,Churchill,NVCHU\n\ ,NV,Clark,NVCLA\n\ ,NV,Douglas,NVDOU\n\ ,NV,Elko,NVELK\n\ ,NV,Esmeralda,NVESM\n\ ,NV,Eureka,NVEUR\n\ ,NV,Humboldt,NVHUM\n\ ,NV,Lander,NVLAN\n\ ,NV,Lincoln,NVLIN\n\ ,NV,Lyon,NVLYO\n\ ,NV,Mineral,NVMIN\n\ ,NV,Nye,NVNYE\n\ ,NV,Pershing,NVPER\n\ ,NV,Storey,NVSTO\n\ ,NV,Washoe,NVWAS\n\ ,NV,White Pine,NVWHI\n\ Oregon,OR,Baker,ORBAK\n\ ,OR,Benton,ORBEN\n\ ,OR,Clackamas,ORCLK\n\ ,OR,Clatsop,ORCLT\n\ ,OR,Columbia,ORCOL\n\ ,OR,Coos,ORCOO\n\ ,OR,Crook,ORCRO\n\ ,OR,Curry,ORCUR\n\ ,OR,Deschutes,ORDES\n\ ,OR,Douglas,ORDOU\n\ ,OR,Gilliam,ORGIL\n\ ,OR,Grant,ORGRA\n\ ,OR,Harney,ORHAR\n\ ,OR,Hood River,ORHOO\n\ ,OR,Jackson,ORJAC\n\ ,OR,Jefferson,ORJEF\n\ ,OR,Josephine,ORJOS\n\ ,OR,Klamath,ORKLA\n\ ,OR,Lake,ORLAK\n\ ,OR,Lane,ORLAN\n\ ,OR,Lincoln,ORLCN\n\ ,OR,Linn,ORLNN\n\ ,OR,Malheur,ORMAL\n\ ,OR,Marion,ORMAR\n\ ,OR,Morrow,ORMOR\n\ ,OR,Multnomah,ORMUL\n\ ,OR,Polk,ORPOL\n\ ,OR,Sherman,ORSHE\n\ ,OR,Tillamook,ORTIL\n\ ,OR,Umatilla,ORUMA\n\ ,OR,Union,ORUNI\n\ ,OR,Wallowa,ORWAL\n\ ,OR,Wasco,ORWCO\n\ ,OR,Washington,ORWSH\n\ ,OR,Wheeler,ORWHE\n\ ,OR,Yamhill,ORYAM\n\ Utah,UT,Beaver,UTBEA\n\ ,UT,Box Elder,UTBOX\n\ ,UT,Cache,UTCAC\n\ ,UT,Carbon,UTCAR\n\ ,UT,Daggett,UTDAG\n\ ,UT,Davis,UTDAV\n\ ,UT,Duchesne,UTDUC\n\ ,UT,Emery,UTEME\n\ ,UT,Garfield,UTGAR\n\ ,UT,Grand,UTGRA\n\ ,UT,Iron,UTIRO\n\ ,UT,Juab,UTJUA\n\ ,UT,Kane,UTKAN\n\ ,UT,Millard,UTMIL\n\ ,UT,Morgan,UTMOR\n\ ,UT,Piute,UTPIU\n\ ,UT,Rich,UTRIC\n\ ,UT,Salt Lake,UTSAL\n\ ,UT,San Juan,UTSNJ\n\ ,UT,Sanpete,UTSNP\n\ ,UT,Sevier,UTSEV\n\ ,UT,Summit,UTSUM\n\ ,UT,Tooele,UTTOO\n\ ,UT,Uintah,UTUIN\n\ ,UT,Utah,UTUTA\n\ ,UT,Wasatch,UTWST\n\ ,UT,Washington,UTWSH\n\ ,UT,Wayne,UTWAY\n\ ,UT,Weber,UTWEB\n\ Washington,WA,Adams,WAADA\n\ ,WA,Asotin,WAASO\n\ ,WA,Benton,WABEN\n\ ,WA,Chelan,WACHE\n\ ,WA,Clallam,WACLL\n\ ,WA,Clark,WACLR\n\ ,WA,Columbia,WACOL\n\ ,WA,Cowlitz,WACOW\n\ ,WA,Douglas,WADOU\n\ ,WA,Ferry,WAFER\n\ ,WA,Franklin,WAFRA\n\ ,WA,Garfield,WAGAR\n\ ,WA,Grant,WAGRN\n\ ,WA,Grays Harbor,WAGRY\n\ ,WA,Island,WAISL\n\ ,WA,Jefferson,WAJEF\n\ ,WA,Klickitat,WAKLI\n\ ,WA,King,WAKNG\n\ ,WA,Kitsap,WAKTP\n\ ,WA,Kittitas,WAKTT\n\ ,WA,Lewis,WALEW\n\ ,WA,Lincoln,WALIN\n\ ,WA,Mason,WAMAS\n\ ,WA,Okanogan,WAOKA\n\ ,WA,Pacific,WAPAC\n\ ,WA,Pend Oreille,WAPEN\n\ ,WA,Pierce,WAPIE\n\ ,WA,San Juan,WASAN\n\ ,WA,Skagit,WASKG\n\ ,WA,Skamania,WASKM\n\ ,WA,Snohomish,WASNO\n\ ,WA,Spokane,WASPO\n\ ,WA,Stevens,WASTE\n\ ,WA,Thurston,WATHU\n\ ,WA,Wahkiakum,WAWAH\n\ ,WA,Walla Walla,WAWAL\n\ ,WA,Whatcom,WAWHA\n\ ,WA,Whitman,WAWHI\n\ ,WA,Yakima,WAYAK\n\ Wyoming,WY,Albany,WYALB\n\ ,WY,Big Horn,WYBIG\n\ ,WY,Campbell,WYCAM\n\ ,WY,Carbon,WYCAR\n\ ,WY,Converse,WYCON\n\ ,WY,Crook,WYCRO\n\ ,WY,Fremont,WYFRE\n\ ,WY,Goshen,WYGOS\n\ ,WY,Hot Springs,WYHOT\n\ ,WY,Johnson,WYJOH\n\ ,WY,Laramie,WYLAR\n\ ,WY,Lincoln,WYLIN\n\ ,WY,Natrona,WYNAT\n\ ,WY,Niobrara,WYNIO\n\ ,WY,Park,WYPAR\n\ ,WY,Platte,WYPLA\n\ ,WY,Sheridan,WYSHE\n\ ,WY,Sublette,WYSUB\n\ ,WY,Sweetwater,WYSWE\n\ ,WY,Teton,WYTET\n\ ,WY,Uinta,WYUIN\n\ ,WY,Washakie,WYWAS\n\ ,WY,Weston,WYWES\n"; fldigi-4.1.06/src/logbook/lgbook.fl0000664000175000017500000007333413507401434014021 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include "flmisc.h"} {private local } decl {\#include "logsupport.h"} {private local } decl {\#include "pixmaps.h"} {private local } decl {\#include "flinput2.h"} {public local } decl {// Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) \#undef nitems \#include \#define FLTK_nitems nitems \#undef nitems // ^^^ Avoid 'nitems' macro collision extern Fl_Check_Browser *chkExportBrowser;} {public local } Function {create_logbook_dialogs()} {open return_type void } { Fl_Window wExport { label {Export Setup} open xywh {489 51 809 440} type Double visible } { Fl_Group {} { label {Select Records to Export} xywh {4 4 388 430} box ENGRAVED_FRAME align 21 } { Fl_Check_Browser chkExportBrowser { xywh {13 25 370 330} } Fl_Button btnClearAll { label {Clear All} callback {btn_export_by_date->value(0); chkExportBrowser->check_none();} xywh {78 362 90 20} } Fl_Button btnCheckAll { label {Check All} callback {btn_export_by_date->value(0); chkExportBrowser->check_all();} xywh {201 362 90 20} } Fl_Input inp_export_start_date { label {Start Date} callback {cb_export_date_select();} tooltip {Start date for export} xywh {20 402 100 22} align 5 code0 {\#include "calendar.h"} code1 {inp_export_start_date->format(2);} class Fl_DateInput } Fl_Input inp_export_stop_date { label {Stop Date} callback {cb_export_date_select();} tooltip {Inclusive stop date for export} xywh {144 402 100 22} align 5 code0 {\#include "calendar.h"} code1 {inp_export_stop_date->format(2);} class Fl_DateInput } Fl_Check_Button btn_export_by_date { label {select by date} callback {cb_export_date_select();} tooltip {Enable to select date range} xywh {269 405 70 15} down_box DOWN_BOX } } Fl_Group {} { label {Select Fields to Export} open xywh {392 4 414 430} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnSelectCall { label Call xywh {402 26 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectName { label Name xywh {402 47 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectFreq { label Freq xywh {402 68 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectBand { label Band xywh {402 90 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectMode { label Mode xywh {402 111 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQSOdateOn { label {QSO Date On} xywh {402 133 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQSOdateOff { label {QSO Date Off} xywh {402 154 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectTimeON { label {Time ON} xywh {402 176 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectTimeOFF { label {Time OFF} xywh {402 197 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectTX_pwr { label {TX Power} xywh {402 219 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectRSTsent { label {RST sent} xywh {402 240 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectRSTrcvd { label {RST rcvd} xywh {402 262 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQth { label Qth xywh {402 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectLOC { label LOC xywh {402 305 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectState { label State xywh {402 326 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectAge { label Age xywh {402 348 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectStaCall { label {Station Call} xywh {536 26 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectStaCity { label {Station QTH} xywh {536 47 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectStaGrid { label {Station LOC} xywh {536 68 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectOperator { label Operator xywh {536 90 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectProvince { label Province xywh {536 111 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCountry { label Country xywh {536 133 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectNotes { label Notes xywh {536 154 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSLrcvd { label {QSL rcvd date} xywh {536 176 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSLsent { label {QSL sent date} xywh {536 197 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelecteQSLrcvd { label {eQSL rcvd date} xywh {536 219 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelecteQSLsent { label {eQSL sent date} xywh {536 240 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectLOTWrcvd { label {LoTW rcvd date} selected xywh {536 262 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectLOTWsent { label {LoTW sent date} xywh {536 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSL_VIA { label {QSL-VIA} xywh {536 305 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSerialIN { label {Serial \# in} xywh {536 326 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSerialOUT { label {Serial \# out} xywh {536 348 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCheck { label Check xywh {670 26 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectXchgIn { label {Exchange In} xywh {670 47 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectMyXchg { label {Exchange Out} xywh {670 68 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCNTY { label County xywh {670 90 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCONT { label Continent xywh {670 111 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCQZ { label CQZ xywh {670 133 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectDXCC { label DXCC xywh {670 154 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectIOTA { label IOTA xywh {670 176 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectITUZ { label ITUZ xywh {670 197 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectClass { label {FD class} xywh {670 219 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSection { label {FD section} xywh {670 240 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_serno { label {CW SS SerNo R} tooltip {CW sweepstakes rcvd ser. no.} xywh {670 262 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_prec { label {CW SS Prec'} tooltip {CW sweepstakes precedence} xywh {670 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_check { label {CW SS Check} xywh {670 305 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_section { label {CW SS Section} tooltip {CW sweepstakes section} xywh {670 326 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_1010 { label {10-10} tooltip {CW sweepstakes section} xywh {670 348 70 15} down_box DOWN_BOX } Fl_Button btnClearAllFields { label {Clear All} callback {btnSelectCall->value(0); btnSelectName->value(0); btnSelectFreq->value(0); btnSelectBand->value(0); btnSelectMode->value(0); btnSelectQSOdateOn->value(0); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(0); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0);} xywh {412 373 85 20} } Fl_Button btnCheckAllFields { label {Check All} callback {btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(1); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(1); btnSelectLOC->value(1); btnSelectState->value(1); btnSelectAge->value(1); btnSelectStaCall->value(1); btnSelectStaGrid->value(1); btnSelectStaCity->value(1); btnSelectOperator->value(1); btnSelectProvince->value(1); btnSelectCountry->value(1); btnSelectNotes->value(1); btnSelectQSLrcvd->value(1); btnSelectQSLsent->value(1); btnSelecteQSLrcvd->value(1); btnSelecteQSLsent->value(1); btnSelectLOTWrcvd->value(1); btnSelectLOTWsent->value(1); btnSelectQSL_VIA->value(1); btnSelectSerialIN->value(1); btnSelectSerialOUT->value(1); btnSelectCheck->value(1); btnSelectXchgIn->value(1); btnSelectMyXchg->value(1); btnSelectCNTY->value(1); btnSelectCONT->value(1); btnSelectCQZ->value(1); btnSelectDXCC->value(1); btnSelectIOTA->value(1); btnSelectITUZ->value(1); btnSelectClass->value(1); btnSelectSection->value(1); btnSelect_cwss_serno->value(1); btnSelect_cwss_prec->value(1); btnSelect_cwss_check->value(1); btnSelect_1010->value(1);} xywh {507 373 85 20} } Fl_Button btnSetFieldDefaults { label Defaults callback {btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0);} xywh {602 373 85 20} } Fl_Button btnSetLoTWfields { label LoTW callback {btnSelectCall->value(1); btnSelectName->value(0); btnSelectFreq->value(1); btnSelectBand->value(0); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(1); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0);} xywh {697 373 85 20} } Fl_Return_Button btnOK { label OK callback {wExport->hide(); Export_log();} xywh {697 403 85 20} } Fl_Button btnCancel { label Cancel callback {wExport->hide();} xywh {602 403 85 20} } } } Fl_Window dlgLogbook { label Logbook xywh {533 50 590 390} type Double hide resizable code0 {o->resizable(wBrowser);} } { Fl_Input inpDate_log { label {Date On} tooltip {Date QSO started} xywh {4 24 100 24} align 5 code0 {\#include "calendar.h"} code1 {inpDate_log->format(2);} class Fl_DateInput } Fl_Input inpTimeOn_log { label {Time On} tooltip {Time QSO started} xywh {106 24 70 24} align 5 class Fl_Input2 } Fl_Input inpCall_log { label Call tooltip {Call sign worked} xywh {178 24 100 24} align 5 class Fl_Input2 } Fl_Input inpName_log { label Name tooltip {Operator worked} xywh {280 24 185 24} align 5 class Fl_Input2 } Fl_Input inpRstR_log { label In tooltip {Rst received} xywh {468 24 36 24} align 5 class Fl_Input2 } Fl_Input txtNbrRecs_log { label Recs tooltip {\# Records in logbook} xywh {520 24 65 24} align 5 class Fl_Input2 } Fl_Input inpDateOff_log { label {Date Off} tooltip {Date QSO Ended} xywh {4 68 100 24} align 5 code0 {\#include "calendar.h"} code1 {inpDateOff_log->format(2);} class Fl_DateInput } Fl_Input inpTimeOff_log { label {Time Off} tooltip {Time QSO ended} xywh {106 68 70 24} align 5 class Fl_Input2 } Fl_Input inpFreq_log { label {Freq.} tooltip {Frequency in MHz} xywh {178 68 100 24} align 5 class Fl_Input2 } Fl_Input inpMode_log { label Mode tooltip {Mode in use} xywh {280 68 146 24} align 5 class Fl_Input2 } Fl_Input inpTX_pwr_log { label Pwr tooltip {Transmit power used} xywh {429 68 36 24} align 5 class Fl_Input2 } Fl_Input inpLoc_log { label Loc tooltip {Stations grid square} xywh {508 68 76 24} align 5 class Fl_Input2 } Fl_Input inpRstS_log { label Out tooltip {Rst sent} xywh {468 68 36 24} align 5 class Fl_Input2 } Fl_Input inpQth_log { label Qth tooltip {City of station worked} xywh {5 112 280 24} align 5 class Fl_Input2 } Fl_Input inpState_log { label St tooltip {US state of station worked} xywh {288 112 44 24} align 5 class Fl_Input2 } Fl_Input inpVE_Prov_log { label Pr tooltip {Province of station worked} xywh {335 112 44 24} align 5 class Fl_Input2 } Fl_Input inpCountry_log { label Country tooltip {Country of station worked} xywh {382 112 202 24} align 5 class Fl_Input2 } Fl_Group grpTabsSearch {open xywh {0 137 590 125} code0 {o->resizable(Tabs);} } { Fl_Tabs Tabs { xywh {0 140 481 120} } { Fl_Group tab_log_qsl { label QSL open xywh {0 161 481 97} } { Fl_Input inpQSLrcvddate_log { label {QSL-rcvd} tooltip {QSL received on this date} xywh {14 188 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpEQSLrcvddate_log { label {EQSL-rcvd} tooltip {QSL received on this date} xywh {118 188 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpLOTWrcvddate_log { label {LOTW-rcvd} tooltip {QSL received on this date} xywh {222 188 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpQSLsentdate_log { label {QSL-sent} tooltip {QSL sent on this date} xywh {14 234 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpEQSLsentdate_log { label {EQSL-sent} tooltip {QSL sent on this date} xywh {118 234 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpLOTWsentdate_log { label {LOTW-sent} tooltip {QSL sent on this date} xywh {222 234 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpQSL_VIA_log { label {QSL-VIA} tooltip {QSL route of contacted station} xywh {325 188 156 70} type Multiline align 5 resizable class Fl_Input2 } } Fl_Group tab_log_other { label Other open xywh {0 161 475 99} hide } { Fl_Input inpCNTY_log { label County tooltip County xywh {21 192 241 24} align 5 class Fl_Input2 } Fl_Input inpIOTA_log { label IOTA tooltip {Islands on the air} xywh {276 192 90 24} align 5 class Fl_Input2 } Fl_Input inpCQZ_log { label CQZ tooltip {CQ zone} xywh {383 192 90 24} align 5 class Fl_Input2 } Fl_Input inpCONT_log { label {Cont'} tooltip Continent xywh {21 236 241 24} align 5 class Fl_Input2 } Fl_Input inpITUZ_log { label ITUZ tooltip {ITU zone} xywh {277 236 90 24} align 5 class Fl_Input2 } Fl_Input inpDXCC_log { label DXCC tooltip {DXCC designator} xywh {383 236 90 24} align 5 class Fl_Input2 } } Fl_Group tab_log_notes { label Notes open xywh {0 161 480 96} hide } { Fl_Input inpNotes_log { tooltip {Interesting notes} xywh {15 171 465 85} type Multiline align 21 class Fl_Input2 } } Fl_Group tab_log_my_station { label {My Station} open xywh {0 161 475 99} hide } { Fl_Input inp_log_sta_call { label {Station Call} tooltip {Interesting notes} xywh {15 192 100 24} align 5 class Fl_Input2 } Fl_Input inp_log_op_call { label {Operator Call} tooltip {Interesting notes} xywh {140 192 100 24} align 5 class Fl_Input2 } Fl_Input inp_log_sta_qth { label {Station QTH} tooltip {Interesting notes} xywh {15 236 334 24} align 5 class Fl_Input2 } Fl_Input inp_log_sta_loc { label {Station Locator} tooltip {Interesting notes} xywh {355 236 120 24} align 5 class Fl_Input2 } } Fl_Group tab_log_contest { label Contest open xywh {0 161 480 99} hide } { Fl_Input inpSerNoOut_log { label {Ser out} tooltip {Contest seral \# sent} xywh {69 179 55 24} class Fl_Input2 } Fl_Input inpMyXchg_log { label {Exch Out} tooltip {Contest exchange sent} xywh {204 179 170 24} class Fl_Input2 } Fl_Input inpSerNoIn_log { label {Ser in} tooltip {Contest serial \# received} xywh {69 207 55 24} class Fl_Input2 } Fl_Input inpXchgIn_log { label {Exch In} tooltip {Contest exchange received} xywh {204 207 170 24} class Fl_Input2 } Fl_Input inpClass_log { label Class tooltip {Field Day class received} xywh {69 236 55 24} class Fl_Input2 } Fl_Input inpSection_log { label {ARRL Sect} tooltip {Field Section received} xywh {204 236 56 24} class Fl_Input2 } Fl_Input inp_age_log { label Age tooltip {Operators age received} xywh {420 179 60 24} class Fl_Input2 } Fl_Input inp_1010_log { label {10-10} tooltip {Ten Ten number received} xywh {420 207 60 24} class Fl_Input2 } Fl_Input inpBand_log { label Band tooltip {Operating band} xywh {420 236 60 24} class Fl_Input2 } Fl_Input inp_check_log { label Check tooltip {Check value received} xywh {314 236 60 24} class Fl_Input2 } } Fl_Group tab_log_cwss { label {CW SS} open tooltip {CW Sweepstakes Contest} xywh {0 161 475 96} hide } { Fl_Input inp_log_cwss_serno { label {Ser NoR} tooltip {Contest seral \# sent} xywh {77 179 55 24} class Fl_Input2 } Fl_Input inp_log_cwss_sec { label Section tooltip {SS section} xywh {77 207 56 24} class Fl_Input2 } Fl_Input inp_log_cwss_prec { label Precedence tooltip {Contest exchange sent} xywh {238 179 77 24} class Fl_Input2 } Fl_Input inp_log_cwss_chk { label Check tooltip {Contest exchange received} xywh {238 207 77 24} class Fl_Input2 } } Fl_Group tab_log_jota { label JOTA open tooltip {Jamboree On The Air} xywh {0 161 475 96} hide } { Fl_Input inp_log_troop_s { label {Troop-S} tooltip {Sent troop number} xywh {115 179 100 24} class Fl_Input2 } Fl_Input inp_log_troop_r { label {Troop-R} tooltip {Received troop number} xywh {292 179 100 24} class Fl_Input2 } Fl_Input inp_log_scout_s { label {Name-S} tooltip {Sent scout name} xywh {115 215 100 24} class Fl_Input2 } Fl_Input inp_log_scout_r { label {Name-R} tooltip {Received scout name} xywh {292 215 100 24} class Fl_Input2 } } } Fl_Group grpCallSearch {open xywh {482 137 105 125} } { Fl_Input inpSearchString { label {Call Search} tooltip {Search for this callsign} xywh {482 160 105 24} align 1 class Fl_Input2 } Fl_Button bSearchPrev { callback cb_search tooltip {Find previous} xywh {500 193 24 22} color 50 selection_color 48 align 16 code0 {bSearchPrev->image(new Fl_Pixmap(left_arrow_icon));} } Fl_Button bSearchNext { callback cb_search tooltip {Find next} xywh {552 193 24 22} color 50 selection_color 48 align 16 code0 {bSearchNext->image(new Fl_Pixmap(right_arrow_icon));} } Fl_Button bRetrieve { label Retrieve callback cb_btnRetrieve tooltip {Retrieve for active modem use} xywh {500 223 75 22} shortcut 0x50066 color 50 selection_color 48 } } } Fl_Group grpFileButtons { xywh {0 262 589 25} code0 {o->resizable(txtLogFile);} } { Fl_Button bNewSave { label New callback cb_btnNewSave tooltip {New record / Save record} xywh {396 263 59 22} shortcut 0x8004e color 50 selection_color 48 } Fl_Button bUpdateCancel { label Update callback cb_btnUpdateCancel tooltip {Update the current record} xywh {459 263 59 22} shortcut 0x80055 color 50 selection_color 48 } Fl_Button bDelete { label Delete callback cb_btnDelete tooltip {Delete the current record} xywh {522 263 59 22} shortcut 0x80044 color 50 selection_color 48 } Fl_Output txtLogFile { label {File:} xywh {35 263 357 22} color 54 } } Fl_Group wBrowser {open xywh {2 288 586 100} box DOWN_FRAME color 7 selection_color 15 resizable code0 {\#include "table.h"} class Table } {} } code {wBrowser->align (FL_ALIGN_TOP | FL_ALIGN_LEFT); wBrowser->addColumn (_("Date"),85); wBrowser->colcallback (0,cb_SortByDate); wBrowser->addColumn (_("Time"),47); wBrowser->addColumn (_("Callsign"),100); wBrowser->colcallback (2,cb_SortByCall); wBrowser->addColumn (_("Name"),110); wBrowser->addColumn (_("Frequency"),120); wBrowser->colcallback (4,cb_SortByFreq); wBrowser->addColumn (_("Mode"),103); wBrowser->colcallback (5,cb_SortByMode); wBrowser->addHiddenColumn ("rn"); wBrowser->allowSort(true); wBrowser->callback(cb_browser); wBrowser->when(FL_WHEN_CHANGED); wBrowser->rowSize (FL_NORMAL_SIZE); wBrowser->headerSize (FL_NORMAL_SIZE); wBrowser->allowResize (1); wBrowser->gridEnabled (0); dlgLogbook->xclass(PACKAGE_TARNAME);} {} Fl_Window wCabrillo { label {Cabrillo Setup} open xywh {131 224 675 340} type Double hide } { Fl_Group {} { label {Select Records to Export} open xywh {4 4 388 305} box ENGRAVED_FRAME align 21 } { Fl_Check_Browser chkCabBrowser { xywh {13 25 370 245} } Fl_Button btnCabClearAll { label {Clear All} callback {chkCabBrowser->check_none();} xywh {69 277 110 24} } Fl_Button btnCabCheckAll { label {Check All} callback {chkCabBrowser->check_all();} xywh {200 277 110 24} } } Fl_Return_Button btnCabOK { label OK callback {wCabrillo->hide(); WriteCabrillo();} xywh {544 312 100 24} } Fl_Button btnCabCancel { label Cancel callback {wCabrillo->hide();} xywh {414 312 100 24} } Fl_Group {} { label {Select Cabrillo Contest & Fields} xywh {390 4 283 305} box ENGRAVED_FRAME align 21 } { Fl_Group cboContest { label {Contest:} callback {setContestType();} open xywh {486 41 180 20} box BORDER_BOX color 7 align 4 code0 {\#include "combo.h"} code1 {extern void setContestType();} class Fl_ComboBox } {} Fl_Check_Button btnCabCall { label Call xywh {423 75 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabFreq { label Freq xywh {423 100 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabMode { label Mode xywh {423 124 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabQSOdate { label {QSO Date} xywh {423 148 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabTimeOFF { label {Time OFF} xywh {423 172 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabRSTsent { label {RST sent} xywh {423 196 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabRSTrcvd { label {RST rcvd} xywh {423 221 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabSerialIN { label {Serial \# in} xywh {533 100 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabSerialOUT { label {Serial \# out} xywh {533 124 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabXchgIn { label {Exchange In} xywh {533 148 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabMyXchg { label {Exchange Out} xywh {533 172 70 15} down_box DOWN_BOX value 1 } Fl_Button btnCabClearAllFields { label {Clear All} callback {btnCabCall->value(0); btnCabFreq->value(0); btnCabMode->value(0); btnCabQSOdate->value(0); btnCabTimeOFF->value(0); btnCabSerialIN->value(0); btnCabSerialOUT->value(0); btnCabXchgIn->value(0); btnCabMyXchg->value(0); btnCabRSTsent->value(0); btnCabRSTrcvd->value(0);} xywh {409 277 110 24} } Fl_Button btnCabCheckAllFields { label {Check All} callback {btnCabCall->value(1); btnCabFreq->value(1); btnCabMode->value(1); btnCabQSOdate->value(1); btnCabTimeOFF->value(1); btnCabSerialIN->value(1); btnCabSerialOUT->value(1); btnCabXchgIn->value(1); btnCabMyXchg->value(1); btnCabRSTsent->value(1); btnCabRSTrcvd->value(1);} xywh {539 277 110 24} } } } } fldigi-4.1.06/src/logbook/lgbook.cxx0000664000175000017500000021616713511722452014226 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "gettext.h" #include "lgbook.h" #include #include #include "flmisc.h" #include "logsupport.h" #include "pixmaps.h" Fl_Double_Window *wExport=(Fl_Double_Window *)0; Fl_Check_Browser *chkExportBrowser=(Fl_Check_Browser *)0; Fl_Button *btnClearAll=(Fl_Button *)0; static void cb_btnClearAll(Fl_Button*, void*) { btn_export_by_date->value(0); chkExportBrowser->check_none(); } Fl_Button *btnCheckAll=(Fl_Button *)0; static void cb_btnCheckAll(Fl_Button*, void*) { btn_export_by_date->value(0); chkExportBrowser->check_all(); } Fl_DateInput *inp_export_start_date=(Fl_DateInput *)0; static void cb_inp_export_start_date(Fl_DateInput*, void*) { cb_export_date_select(); } Fl_DateInput *inp_export_stop_date=(Fl_DateInput *)0; static void cb_inp_export_stop_date(Fl_DateInput*, void*) { cb_export_date_select(); } Fl_Check_Button *btn_export_by_date=(Fl_Check_Button *)0; static void cb_btn_export_by_date(Fl_Check_Button*, void*) { cb_export_date_select(); } Fl_Check_Button *btnSelectCall=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectName=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectFreq=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectBand=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectMode=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSOdateOn=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSOdateOff=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTimeON=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTimeOFF=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTX_pwr=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectRSTsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectRSTrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQth=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectLOC=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectState=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectAge=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectStaCall=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectStaCity=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectStaGrid=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectOperator=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectProvince=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCountry=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectNotes=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSLrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSLsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelecteQSLrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelecteQSLsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectLOTWrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectLOTWsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSL_VIA=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSerialIN=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSerialOUT=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCheck=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectXchgIn=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectMyXchg=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCNTY=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCONT=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCQZ=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectDXCC=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectIOTA=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectITUZ=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectClass=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSection=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_serno=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_prec=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_check=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_section=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_1010=(Fl_Check_Button *)0; Fl_Button *btnClearAllFields=(Fl_Button *)0; static void cb_btnClearAllFields(Fl_Button*, void*) { btnSelectCall->value(0); btnSelectName->value(0); btnSelectFreq->value(0); btnSelectBand->value(0); btnSelectMode->value(0); btnSelectQSOdateOn->value(0); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(0); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0); } Fl_Button *btnCheckAllFields=(Fl_Button *)0; static void cb_btnCheckAllFields(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(1); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(1); btnSelectLOC->value(1); btnSelectState->value(1); btnSelectAge->value(1); btnSelectStaCall->value(1); btnSelectStaGrid->value(1); btnSelectStaCity->value(1); btnSelectOperator->value(1); btnSelectProvince->value(1); btnSelectCountry->value(1); btnSelectNotes->value(1); btnSelectQSLrcvd->value(1); btnSelectQSLsent->value(1); btnSelecteQSLrcvd->value(1); btnSelecteQSLsent->value(1); btnSelectLOTWrcvd->value(1); btnSelectLOTWsent->value(1); btnSelectQSL_VIA->value(1); btnSelectSerialIN->value(1); btnSelectSerialOUT->value(1); btnSelectCheck->value(1); btnSelectXchgIn->value(1); btnSelectMyXchg->value(1); btnSelectCNTY->value(1); btnSelectCONT->value(1); btnSelectCQZ->value(1); btnSelectDXCC->value(1); btnSelectIOTA->value(1); btnSelectITUZ->value(1); btnSelectClass->value(1); btnSelectSection->value(1); btnSelect_cwss_serno->value(1); btnSelect_cwss_prec->value(1); btnSelect_cwss_check->value(1); btnSelect_1010->value(1); } Fl_Button *btnSetFieldDefaults=(Fl_Button *)0; static void cb_btnSetFieldDefaults(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0); } Fl_Button *btnSetLoTWfields=(Fl_Button *)0; static void cb_btnSetLoTWfields(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(0); btnSelectFreq->value(1); btnSelectBand->value(0); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(1); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0); } Fl_Return_Button *btnOK=(Fl_Return_Button *)0; static void cb_btnOK(Fl_Return_Button*, void*) { wExport->hide(); Export_log(); } Fl_Button *btnCancel=(Fl_Button *)0; static void cb_btnCancel(Fl_Button*, void*) { wExport->hide(); } Fl_Double_Window *dlgLogbook=(Fl_Double_Window *)0; Fl_DateInput *inpDate_log=(Fl_DateInput *)0; Fl_Input2 *inpTimeOn_log=(Fl_Input2 *)0; Fl_Input2 *inpCall_log=(Fl_Input2 *)0; Fl_Input2 *inpName_log=(Fl_Input2 *)0; Fl_Input2 *inpRstR_log=(Fl_Input2 *)0; Fl_Input2 *txtNbrRecs_log=(Fl_Input2 *)0; Fl_DateInput *inpDateOff_log=(Fl_DateInput *)0; Fl_Input2 *inpTimeOff_log=(Fl_Input2 *)0; Fl_Input2 *inpFreq_log=(Fl_Input2 *)0; Fl_Input2 *inpMode_log=(Fl_Input2 *)0; Fl_Input2 *inpTX_pwr_log=(Fl_Input2 *)0; Fl_Input2 *inpLoc_log=(Fl_Input2 *)0; Fl_Input2 *inpRstS_log=(Fl_Input2 *)0; Fl_Input2 *inpQth_log=(Fl_Input2 *)0; Fl_Input2 *inpState_log=(Fl_Input2 *)0; Fl_Input2 *inpVE_Prov_log=(Fl_Input2 *)0; Fl_Input2 *inpCountry_log=(Fl_Input2 *)0; Fl_Group *grpTabsSearch=(Fl_Group *)0; Fl_Tabs *Tabs=(Fl_Tabs *)0; Fl_Group *tab_log_qsl=(Fl_Group *)0; Fl_DateInput *inpQSLrcvddate_log=(Fl_DateInput *)0; Fl_DateInput *inpEQSLrcvddate_log=(Fl_DateInput *)0; Fl_DateInput *inpLOTWrcvddate_log=(Fl_DateInput *)0; Fl_DateInput *inpQSLsentdate_log=(Fl_DateInput *)0; Fl_DateInput *inpEQSLsentdate_log=(Fl_DateInput *)0; Fl_DateInput *inpLOTWsentdate_log=(Fl_DateInput *)0; Fl_Input2 *inpQSL_VIA_log=(Fl_Input2 *)0; Fl_Group *tab_log_other=(Fl_Group *)0; Fl_Input2 *inpCNTY_log=(Fl_Input2 *)0; Fl_Input2 *inpIOTA_log=(Fl_Input2 *)0; Fl_Input2 *inpCQZ_log=(Fl_Input2 *)0; Fl_Input2 *inpCONT_log=(Fl_Input2 *)0; Fl_Input2 *inpITUZ_log=(Fl_Input2 *)0; Fl_Input2 *inpDXCC_log=(Fl_Input2 *)0; Fl_Group *tab_log_notes=(Fl_Group *)0; Fl_Input2 *inpNotes_log=(Fl_Input2 *)0; Fl_Group *tab_log_my_station=(Fl_Group *)0; Fl_Input2 *inp_log_sta_call=(Fl_Input2 *)0; Fl_Input2 *inp_log_op_call=(Fl_Input2 *)0; Fl_Input2 *inp_log_sta_qth=(Fl_Input2 *)0; Fl_Input2 *inp_log_sta_loc=(Fl_Input2 *)0; Fl_Group *tab_log_contest=(Fl_Group *)0; Fl_Input2 *inpSerNoOut_log=(Fl_Input2 *)0; Fl_Input2 *inpMyXchg_log=(Fl_Input2 *)0; Fl_Input2 *inpSerNoIn_log=(Fl_Input2 *)0; Fl_Input2 *inpXchgIn_log=(Fl_Input2 *)0; Fl_Input2 *inpClass_log=(Fl_Input2 *)0; Fl_Input2 *inpSection_log=(Fl_Input2 *)0; Fl_Input2 *inp_age_log=(Fl_Input2 *)0; Fl_Input2 *inp_1010_log=(Fl_Input2 *)0; Fl_Input2 *inpBand_log=(Fl_Input2 *)0; Fl_Input2 *inp_check_log=(Fl_Input2 *)0; Fl_Group *tab_log_cwss=(Fl_Group *)0; Fl_Input2 *inp_log_cwss_serno=(Fl_Input2 *)0; Fl_Input2 *inp_log_cwss_sec=(Fl_Input2 *)0; Fl_Input2 *inp_log_cwss_prec=(Fl_Input2 *)0; Fl_Input2 *inp_log_cwss_chk=(Fl_Input2 *)0; Fl_Group *tab_log_jota=(Fl_Group *)0; Fl_Input2 *inp_log_troop_s=(Fl_Input2 *)0; Fl_Input2 *inp_log_troop_r=(Fl_Input2 *)0; Fl_Input2 *inp_log_scout_s=(Fl_Input2 *)0; Fl_Input2 *inp_log_scout_r=(Fl_Input2 *)0; Fl_Group *grpCallSearch=(Fl_Group *)0; Fl_Input2 *inpSearchString=(Fl_Input2 *)0; Fl_Button *bSearchPrev=(Fl_Button *)0; Fl_Button *bSearchNext=(Fl_Button *)0; Fl_Button *bRetrieve=(Fl_Button *)0; Fl_Group *grpFileButtons=(Fl_Group *)0; Fl_Button *bNewSave=(Fl_Button *)0; Fl_Button *bUpdateCancel=(Fl_Button *)0; Fl_Button *bDelete=(Fl_Button *)0; Fl_Output *txtLogFile=(Fl_Output *)0; Table *wBrowser=(Table *)0; Fl_Double_Window *wCabrillo=(Fl_Double_Window *)0; Fl_Check_Browser *chkCabBrowser=(Fl_Check_Browser *)0; Fl_Button *btnCabClearAll=(Fl_Button *)0; static void cb_btnCabClearAll(Fl_Button*, void*) { chkCabBrowser->check_none(); } Fl_Button *btnCabCheckAll=(Fl_Button *)0; static void cb_btnCabCheckAll(Fl_Button*, void*) { chkCabBrowser->check_all(); } Fl_Return_Button *btnCabOK=(Fl_Return_Button *)0; static void cb_btnCabOK(Fl_Return_Button*, void*) { wCabrillo->hide(); WriteCabrillo(); } Fl_Button *btnCabCancel=(Fl_Button *)0; static void cb_btnCabCancel(Fl_Button*, void*) { wCabrillo->hide(); } Fl_ComboBox *cboContest=(Fl_ComboBox *)0; static void cb_cboContest(Fl_ComboBox*, void*) { setContestType(); } Fl_Check_Button *btnCabCall=(Fl_Check_Button *)0; Fl_Check_Button *btnCabFreq=(Fl_Check_Button *)0; Fl_Check_Button *btnCabMode=(Fl_Check_Button *)0; Fl_Check_Button *btnCabQSOdate=(Fl_Check_Button *)0; Fl_Check_Button *btnCabTimeOFF=(Fl_Check_Button *)0; Fl_Check_Button *btnCabRSTsent=(Fl_Check_Button *)0; Fl_Check_Button *btnCabRSTrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnCabSerialIN=(Fl_Check_Button *)0; Fl_Check_Button *btnCabSerialOUT=(Fl_Check_Button *)0; Fl_Check_Button *btnCabXchgIn=(Fl_Check_Button *)0; Fl_Check_Button *btnCabMyXchg=(Fl_Check_Button *)0; Fl_Button *btnCabClearAllFields=(Fl_Button *)0; static void cb_btnCabClearAllFields(Fl_Button*, void*) { btnCabCall->value(0); btnCabFreq->value(0); btnCabMode->value(0); btnCabQSOdate->value(0); btnCabTimeOFF->value(0); btnCabSerialIN->value(0); btnCabSerialOUT->value(0); btnCabXchgIn->value(0); btnCabMyXchg->value(0); btnCabRSTsent->value(0); btnCabRSTrcvd->value(0); } Fl_Button *btnCabCheckAllFields=(Fl_Button *)0; static void cb_btnCabCheckAllFields(Fl_Button*, void*) { btnCabCall->value(1); btnCabFreq->value(1); btnCabMode->value(1); btnCabQSOdate->value(1); btnCabTimeOFF->value(1); btnCabSerialIN->value(1); btnCabSerialOUT->value(1); btnCabXchgIn->value(1); btnCabMyXchg->value(1); btnCabRSTsent->value(1); btnCabRSTrcvd->value(1); } void create_logbook_dialogs() { { wExport = new Fl_Double_Window(809, 440, _("Export Setup")); { Fl_Group* o = new Fl_Group(4, 4, 388, 430, _("Select Records to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkExportBrowser = new Fl_Check_Browser(13, 25, 370, 330); } // Fl_Check_Browser* chkExportBrowser { btnClearAll = new Fl_Button(78, 362, 90, 20, _("Clear All")); btnClearAll->callback((Fl_Callback*)cb_btnClearAll); } // Fl_Button* btnClearAll { btnCheckAll = new Fl_Button(201, 362, 90, 20, _("Check All")); btnCheckAll->callback((Fl_Callback*)cb_btnCheckAll); } // Fl_Button* btnCheckAll { inp_export_start_date = new Fl_DateInput(20, 402, 100, 22, _("Start Date")); inp_export_start_date->tooltip(_("Start date for export")); inp_export_start_date->box(FL_DOWN_BOX); inp_export_start_date->color(FL_BACKGROUND2_COLOR); inp_export_start_date->selection_color(FL_SELECTION_COLOR); inp_export_start_date->labeltype(FL_NORMAL_LABEL); inp_export_start_date->labelfont(0); inp_export_start_date->labelsize(14); inp_export_start_date->labelcolor(FL_FOREGROUND_COLOR); inp_export_start_date->callback((Fl_Callback*)cb_inp_export_start_date); inp_export_start_date->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_export_start_date->when(FL_WHEN_RELEASE); inp_export_start_date->format(2); } // Fl_DateInput* inp_export_start_date { inp_export_stop_date = new Fl_DateInput(144, 402, 100, 22, _("Stop Date")); inp_export_stop_date->tooltip(_("Inclusive stop date for export")); inp_export_stop_date->box(FL_DOWN_BOX); inp_export_stop_date->color(FL_BACKGROUND2_COLOR); inp_export_stop_date->selection_color(FL_SELECTION_COLOR); inp_export_stop_date->labeltype(FL_NORMAL_LABEL); inp_export_stop_date->labelfont(0); inp_export_stop_date->labelsize(14); inp_export_stop_date->labelcolor(FL_FOREGROUND_COLOR); inp_export_stop_date->callback((Fl_Callback*)cb_inp_export_stop_date); inp_export_stop_date->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_export_stop_date->when(FL_WHEN_RELEASE); inp_export_stop_date->format(2); } // Fl_DateInput* inp_export_stop_date { btn_export_by_date = new Fl_Check_Button(269, 405, 70, 15, _("select by date")); btn_export_by_date->tooltip(_("Enable to select date range")); btn_export_by_date->down_box(FL_DOWN_BOX); btn_export_by_date->callback((Fl_Callback*)cb_btn_export_by_date); } // Fl_Check_Button* btn_export_by_date o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(392, 4, 414, 430, _("Select Fields to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnSelectCall = new Fl_Check_Button(402, 26, 70, 15, _("Call")); btnSelectCall->down_box(FL_DOWN_BOX); btnSelectCall->value(1); } // Fl_Check_Button* btnSelectCall { btnSelectName = new Fl_Check_Button(402, 47, 70, 15, _("Name")); btnSelectName->down_box(FL_DOWN_BOX); btnSelectName->value(1); } // Fl_Check_Button* btnSelectName { btnSelectFreq = new Fl_Check_Button(402, 68, 70, 15, _("Freq")); btnSelectFreq->down_box(FL_DOWN_BOX); btnSelectFreq->value(1); } // Fl_Check_Button* btnSelectFreq { btnSelectBand = new Fl_Check_Button(402, 90, 70, 15, _("Band")); btnSelectBand->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectBand { btnSelectMode = new Fl_Check_Button(402, 111, 70, 15, _("Mode")); btnSelectMode->down_box(FL_DOWN_BOX); btnSelectMode->value(1); } // Fl_Check_Button* btnSelectMode { btnSelectQSOdateOn = new Fl_Check_Button(402, 133, 70, 15, _("QSO Date On")); btnSelectQSOdateOn->down_box(FL_DOWN_BOX); btnSelectQSOdateOn->value(1); } // Fl_Check_Button* btnSelectQSOdateOn { btnSelectQSOdateOff = new Fl_Check_Button(402, 154, 70, 15, _("QSO Date Off")); btnSelectQSOdateOff->down_box(FL_DOWN_BOX); btnSelectQSOdateOff->value(1); } // Fl_Check_Button* btnSelectQSOdateOff { btnSelectTimeON = new Fl_Check_Button(402, 176, 70, 15, _("Time ON")); btnSelectTimeON->down_box(FL_DOWN_BOX); btnSelectTimeON->value(1); } // Fl_Check_Button* btnSelectTimeON { btnSelectTimeOFF = new Fl_Check_Button(402, 197, 70, 15, _("Time OFF")); btnSelectTimeOFF->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectTimeOFF { btnSelectTX_pwr = new Fl_Check_Button(402, 219, 70, 15, _("TX Power")); btnSelectTX_pwr->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectTX_pwr { btnSelectRSTsent = new Fl_Check_Button(402, 240, 70, 15, _("RST sent")); btnSelectRSTsent->down_box(FL_DOWN_BOX); btnSelectRSTsent->value(1); } // Fl_Check_Button* btnSelectRSTsent { btnSelectRSTrcvd = new Fl_Check_Button(402, 262, 70, 15, _("RST rcvd")); btnSelectRSTrcvd->down_box(FL_DOWN_BOX); btnSelectRSTrcvd->value(1); } // Fl_Check_Button* btnSelectRSTrcvd { btnSelectQth = new Fl_Check_Button(402, 283, 70, 15, _("Qth")); btnSelectQth->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQth { btnSelectLOC = new Fl_Check_Button(402, 305, 70, 15, _("LOC")); btnSelectLOC->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectLOC { btnSelectState = new Fl_Check_Button(402, 326, 70, 15, _("State")); btnSelectState->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectState { btnSelectAge = new Fl_Check_Button(402, 348, 70, 15, _("Age")); btnSelectAge->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectAge { btnSelectStaCall = new Fl_Check_Button(536, 26, 70, 15, _("Station Call")); btnSelectStaCall->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectStaCall { btnSelectStaCity = new Fl_Check_Button(536, 47, 70, 15, _("Station QTH")); btnSelectStaCity->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectStaCity { btnSelectStaGrid = new Fl_Check_Button(536, 68, 70, 15, _("Station LOC")); btnSelectStaGrid->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectStaGrid { btnSelectOperator = new Fl_Check_Button(536, 90, 70, 15, _("Operator")); btnSelectOperator->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectOperator { btnSelectProvince = new Fl_Check_Button(536, 111, 70, 15, _("Province")); btnSelectProvince->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectProvince { btnSelectCountry = new Fl_Check_Button(536, 133, 70, 15, _("Country")); btnSelectCountry->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCountry { btnSelectNotes = new Fl_Check_Button(536, 154, 70, 15, _("Notes")); btnSelectNotes->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectNotes { btnSelectQSLrcvd = new Fl_Check_Button(536, 176, 70, 15, _("QSL rcvd date")); btnSelectQSLrcvd->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSLrcvd { btnSelectQSLsent = new Fl_Check_Button(536, 197, 70, 15, _("QSL sent date")); btnSelectQSLsent->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSLsent { btnSelecteQSLrcvd = new Fl_Check_Button(536, 219, 70, 15, _("eQSL rcvd date")); btnSelecteQSLrcvd->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelecteQSLrcvd { btnSelecteQSLsent = new Fl_Check_Button(536, 240, 70, 15, _("eQSL sent date")); btnSelecteQSLsent->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelecteQSLsent { btnSelectLOTWrcvd = new Fl_Check_Button(536, 262, 70, 15, _("LoTW rcvd date")); btnSelectLOTWrcvd->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectLOTWrcvd { btnSelectLOTWsent = new Fl_Check_Button(536, 283, 70, 15, _("LoTW sent date")); btnSelectLOTWsent->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectLOTWsent { btnSelectQSL_VIA = new Fl_Check_Button(536, 305, 70, 15, _("QSL-VIA")); btnSelectQSL_VIA->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSL_VIA { btnSelectSerialIN = new Fl_Check_Button(536, 326, 70, 15, _("Serial # in")); btnSelectSerialIN->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSerialIN { btnSelectSerialOUT = new Fl_Check_Button(536, 348, 70, 15, _("Serial # out")); btnSelectSerialOUT->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSerialOUT { btnSelectCheck = new Fl_Check_Button(670, 26, 70, 15, _("Check")); btnSelectCheck->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCheck { btnSelectXchgIn = new Fl_Check_Button(670, 47, 70, 15, _("Exchange In")); btnSelectXchgIn->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectXchgIn { btnSelectMyXchg = new Fl_Check_Button(670, 68, 70, 15, _("Exchange Out")); btnSelectMyXchg->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectMyXchg { btnSelectCNTY = new Fl_Check_Button(670, 90, 70, 15, _("County")); btnSelectCNTY->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCNTY { btnSelectCONT = new Fl_Check_Button(670, 111, 70, 15, _("Continent")); btnSelectCONT->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCONT { btnSelectCQZ = new Fl_Check_Button(670, 133, 70, 15, _("CQZ")); btnSelectCQZ->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCQZ { btnSelectDXCC = new Fl_Check_Button(670, 154, 70, 15, _("DXCC")); btnSelectDXCC->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectDXCC { btnSelectIOTA = new Fl_Check_Button(670, 176, 70, 15, _("IOTA")); btnSelectIOTA->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectIOTA { btnSelectITUZ = new Fl_Check_Button(670, 197, 70, 15, _("ITUZ")); btnSelectITUZ->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectITUZ { btnSelectClass = new Fl_Check_Button(670, 219, 70, 15, _("FD class")); btnSelectClass->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectClass { btnSelectSection = new Fl_Check_Button(670, 240, 70, 15, _("FD section")); btnSelectSection->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSection { btnSelect_cwss_serno = new Fl_Check_Button(670, 262, 70, 15, _("CW SS SerNo R")); btnSelect_cwss_serno->tooltip(_("CW sweepstakes rcvd ser. no.")); btnSelect_cwss_serno->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_serno { btnSelect_cwss_prec = new Fl_Check_Button(670, 283, 70, 15, _("CW SS Prec\'")); btnSelect_cwss_prec->tooltip(_("CW sweepstakes precedence")); btnSelect_cwss_prec->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_prec { btnSelect_cwss_check = new Fl_Check_Button(670, 305, 70, 15, _("CW SS Check")); btnSelect_cwss_check->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_check { btnSelect_cwss_section = new Fl_Check_Button(670, 326, 70, 15, _("CW SS Section")); btnSelect_cwss_section->tooltip(_("CW sweepstakes section")); btnSelect_cwss_section->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_section { btnSelect_1010 = new Fl_Check_Button(670, 348, 70, 15, _("10-10")); btnSelect_1010->tooltip(_("CW sweepstakes section")); btnSelect_1010->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_1010 { btnClearAllFields = new Fl_Button(412, 373, 85, 20, _("Clear All")); btnClearAllFields->callback((Fl_Callback*)cb_btnClearAllFields); } // Fl_Button* btnClearAllFields { btnCheckAllFields = new Fl_Button(507, 373, 85, 20, _("Check All")); btnCheckAllFields->callback((Fl_Callback*)cb_btnCheckAllFields); } // Fl_Button* btnCheckAllFields { btnSetFieldDefaults = new Fl_Button(602, 373, 85, 20, _("Defaults")); btnSetFieldDefaults->callback((Fl_Callback*)cb_btnSetFieldDefaults); } // Fl_Button* btnSetFieldDefaults { btnSetLoTWfields = new Fl_Button(697, 373, 85, 20, _("LoTW")); btnSetLoTWfields->callback((Fl_Callback*)cb_btnSetLoTWfields); } // Fl_Button* btnSetLoTWfields { btnOK = new Fl_Return_Button(697, 403, 85, 20, _("OK")); btnOK->callback((Fl_Callback*)cb_btnOK); } // Fl_Return_Button* btnOK { btnCancel = new Fl_Button(602, 403, 85, 20, _("Cancel")); btnCancel->callback((Fl_Callback*)cb_btnCancel); } // Fl_Button* btnCancel o->end(); } // Fl_Group* o wExport->end(); } // Fl_Double_Window* wExport { Fl_Double_Window* o = dlgLogbook = new Fl_Double_Window(590, 390, _("Logbook")); { inpDate_log = new Fl_DateInput(4, 24, 100, 24, _("Date On")); inpDate_log->tooltip(_("Date QSO started")); inpDate_log->box(FL_DOWN_BOX); inpDate_log->color(FL_BACKGROUND2_COLOR); inpDate_log->selection_color(FL_SELECTION_COLOR); inpDate_log->labeltype(FL_NORMAL_LABEL); inpDate_log->labelfont(0); inpDate_log->labelsize(14); inpDate_log->labelcolor(FL_FOREGROUND_COLOR); inpDate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDate_log->when(FL_WHEN_RELEASE); inpDate_log->format(2); } // Fl_DateInput* inpDate_log { inpTimeOn_log = new Fl_Input2(106, 24, 70, 24, _("Time On")); inpTimeOn_log->tooltip(_("Time QSO started")); inpTimeOn_log->box(FL_DOWN_BOX); inpTimeOn_log->color(FL_BACKGROUND2_COLOR); inpTimeOn_log->selection_color(FL_SELECTION_COLOR); inpTimeOn_log->labeltype(FL_NORMAL_LABEL); inpTimeOn_log->labelfont(0); inpTimeOn_log->labelsize(14); inpTimeOn_log->labelcolor(FL_FOREGROUND_COLOR); inpTimeOn_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTimeOn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTimeOn_log { inpCall_log = new Fl_Input2(178, 24, 100, 24, _("Call")); inpCall_log->tooltip(_("Call sign worked")); inpCall_log->box(FL_DOWN_BOX); inpCall_log->color(FL_BACKGROUND2_COLOR); inpCall_log->selection_color(FL_SELECTION_COLOR); inpCall_log->labeltype(FL_NORMAL_LABEL); inpCall_log->labelfont(0); inpCall_log->labelsize(14); inpCall_log->labelcolor(FL_FOREGROUND_COLOR); inpCall_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCall_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCall_log { inpName_log = new Fl_Input2(280, 24, 185, 24, _("Name")); inpName_log->tooltip(_("Operator worked")); inpName_log->box(FL_DOWN_BOX); inpName_log->color(FL_BACKGROUND2_COLOR); inpName_log->selection_color(FL_SELECTION_COLOR); inpName_log->labeltype(FL_NORMAL_LABEL); inpName_log->labelfont(0); inpName_log->labelsize(14); inpName_log->labelcolor(FL_FOREGROUND_COLOR); inpName_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpName_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpName_log { inpRstR_log = new Fl_Input2(468, 24, 36, 24, _("In")); inpRstR_log->tooltip(_("Rst received")); inpRstR_log->box(FL_DOWN_BOX); inpRstR_log->color(FL_BACKGROUND2_COLOR); inpRstR_log->selection_color(FL_SELECTION_COLOR); inpRstR_log->labeltype(FL_NORMAL_LABEL); inpRstR_log->labelfont(0); inpRstR_log->labelsize(14); inpRstR_log->labelcolor(FL_FOREGROUND_COLOR); inpRstR_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpRstR_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpRstR_log { txtNbrRecs_log = new Fl_Input2(520, 24, 65, 24, _("Recs")); txtNbrRecs_log->tooltip(_("# Records in logbook")); txtNbrRecs_log->box(FL_DOWN_BOX); txtNbrRecs_log->color(FL_BACKGROUND2_COLOR); txtNbrRecs_log->selection_color(FL_SELECTION_COLOR); txtNbrRecs_log->labeltype(FL_NORMAL_LABEL); txtNbrRecs_log->labelfont(0); txtNbrRecs_log->labelsize(14); txtNbrRecs_log->labelcolor(FL_FOREGROUND_COLOR); txtNbrRecs_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtNbrRecs_log->when(FL_WHEN_RELEASE); } // Fl_Input2* txtNbrRecs_log { inpDateOff_log = new Fl_DateInput(4, 68, 100, 24, _("Date Off")); inpDateOff_log->tooltip(_("Date QSO Ended")); inpDateOff_log->box(FL_DOWN_BOX); inpDateOff_log->color(FL_BACKGROUND2_COLOR); inpDateOff_log->selection_color(FL_SELECTION_COLOR); inpDateOff_log->labeltype(FL_NORMAL_LABEL); inpDateOff_log->labelfont(0); inpDateOff_log->labelsize(14); inpDateOff_log->labelcolor(FL_FOREGROUND_COLOR); inpDateOff_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDateOff_log->when(FL_WHEN_RELEASE); inpDateOff_log->format(2); } // Fl_DateInput* inpDateOff_log { inpTimeOff_log = new Fl_Input2(106, 68, 70, 24, _("Time Off")); inpTimeOff_log->tooltip(_("Time QSO ended")); inpTimeOff_log->box(FL_DOWN_BOX); inpTimeOff_log->color(FL_BACKGROUND2_COLOR); inpTimeOff_log->selection_color(FL_SELECTION_COLOR); inpTimeOff_log->labeltype(FL_NORMAL_LABEL); inpTimeOff_log->labelfont(0); inpTimeOff_log->labelsize(14); inpTimeOff_log->labelcolor(FL_FOREGROUND_COLOR); inpTimeOff_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTimeOff_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTimeOff_log { inpFreq_log = new Fl_Input2(178, 68, 100, 24, _("Freq.")); inpFreq_log->tooltip(_("Frequency in MHz")); inpFreq_log->box(FL_DOWN_BOX); inpFreq_log->color(FL_BACKGROUND2_COLOR); inpFreq_log->selection_color(FL_SELECTION_COLOR); inpFreq_log->labeltype(FL_NORMAL_LABEL); inpFreq_log->labelfont(0); inpFreq_log->labelsize(14); inpFreq_log->labelcolor(FL_FOREGROUND_COLOR); inpFreq_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpFreq_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpFreq_log { inpMode_log = new Fl_Input2(280, 68, 146, 24, _("Mode")); inpMode_log->tooltip(_("Mode in use")); inpMode_log->box(FL_DOWN_BOX); inpMode_log->color(FL_BACKGROUND2_COLOR); inpMode_log->selection_color(FL_SELECTION_COLOR); inpMode_log->labeltype(FL_NORMAL_LABEL); inpMode_log->labelfont(0); inpMode_log->labelsize(14); inpMode_log->labelcolor(FL_FOREGROUND_COLOR); inpMode_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpMode_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMode_log { inpTX_pwr_log = new Fl_Input2(429, 68, 36, 24, _("Pwr")); inpTX_pwr_log->tooltip(_("Transmit power used")); inpTX_pwr_log->box(FL_DOWN_BOX); inpTX_pwr_log->color(FL_BACKGROUND2_COLOR); inpTX_pwr_log->selection_color(FL_SELECTION_COLOR); inpTX_pwr_log->labeltype(FL_NORMAL_LABEL); inpTX_pwr_log->labelfont(0); inpTX_pwr_log->labelsize(14); inpTX_pwr_log->labelcolor(FL_FOREGROUND_COLOR); inpTX_pwr_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTX_pwr_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTX_pwr_log { inpLoc_log = new Fl_Input2(508, 68, 76, 24, _("Loc")); inpLoc_log->tooltip(_("Stations grid square")); inpLoc_log->box(FL_DOWN_BOX); inpLoc_log->color(FL_BACKGROUND2_COLOR); inpLoc_log->selection_color(FL_SELECTION_COLOR); inpLoc_log->labeltype(FL_NORMAL_LABEL); inpLoc_log->labelfont(0); inpLoc_log->labelsize(14); inpLoc_log->labelcolor(FL_FOREGROUND_COLOR); inpLoc_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpLoc_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpLoc_log { inpRstS_log = new Fl_Input2(468, 68, 36, 24, _("Out")); inpRstS_log->tooltip(_("Rst sent")); inpRstS_log->box(FL_DOWN_BOX); inpRstS_log->color(FL_BACKGROUND2_COLOR); inpRstS_log->selection_color(FL_SELECTION_COLOR); inpRstS_log->labeltype(FL_NORMAL_LABEL); inpRstS_log->labelfont(0); inpRstS_log->labelsize(14); inpRstS_log->labelcolor(FL_FOREGROUND_COLOR); inpRstS_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpRstS_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpRstS_log { inpQth_log = new Fl_Input2(5, 112, 280, 24, _("Qth")); inpQth_log->tooltip(_("City of station worked")); inpQth_log->box(FL_DOWN_BOX); inpQth_log->color(FL_BACKGROUND2_COLOR); inpQth_log->selection_color(FL_SELECTION_COLOR); inpQth_log->labeltype(FL_NORMAL_LABEL); inpQth_log->labelfont(0); inpQth_log->labelsize(14); inpQth_log->labelcolor(FL_FOREGROUND_COLOR); inpQth_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQth_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpQth_log { inpState_log = new Fl_Input2(288, 112, 44, 24, _("St")); inpState_log->tooltip(_("US state of station worked")); inpState_log->box(FL_DOWN_BOX); inpState_log->color(FL_BACKGROUND2_COLOR); inpState_log->selection_color(FL_SELECTION_COLOR); inpState_log->labeltype(FL_NORMAL_LABEL); inpState_log->labelfont(0); inpState_log->labelsize(14); inpState_log->labelcolor(FL_FOREGROUND_COLOR); inpState_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpState_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpState_log { inpVE_Prov_log = new Fl_Input2(335, 112, 44, 24, _("Pr")); inpVE_Prov_log->tooltip(_("Province of station worked")); inpVE_Prov_log->box(FL_DOWN_BOX); inpVE_Prov_log->color(FL_BACKGROUND2_COLOR); inpVE_Prov_log->selection_color(FL_SELECTION_COLOR); inpVE_Prov_log->labeltype(FL_NORMAL_LABEL); inpVE_Prov_log->labelfont(0); inpVE_Prov_log->labelsize(14); inpVE_Prov_log->labelcolor(FL_FOREGROUND_COLOR); inpVE_Prov_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpVE_Prov_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpVE_Prov_log { inpCountry_log = new Fl_Input2(382, 112, 202, 24, _("Country")); inpCountry_log->tooltip(_("Country of station worked")); inpCountry_log->box(FL_DOWN_BOX); inpCountry_log->color(FL_BACKGROUND2_COLOR); inpCountry_log->selection_color(FL_SELECTION_COLOR); inpCountry_log->labeltype(FL_NORMAL_LABEL); inpCountry_log->labelfont(0); inpCountry_log->labelsize(14); inpCountry_log->labelcolor(FL_FOREGROUND_COLOR); inpCountry_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCountry_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCountry_log { Fl_Group* o = grpTabsSearch = new Fl_Group(0, 137, 590, 125); { Tabs = new Fl_Tabs(0, 140, 481, 120); { tab_log_qsl = new Fl_Group(0, 161, 481, 97, _("QSL")); { Fl_DateInput* o = inpQSLrcvddate_log = new Fl_DateInput(14, 188, 100, 24, _("QSL-rcvd")); inpQSLrcvddate_log->tooltip(_("QSL received on this date")); inpQSLrcvddate_log->box(FL_DOWN_BOX); inpQSLrcvddate_log->color(FL_BACKGROUND2_COLOR); inpQSLrcvddate_log->selection_color(FL_SELECTION_COLOR); inpQSLrcvddate_log->labeltype(FL_NORMAL_LABEL); inpQSLrcvddate_log->labelfont(0); inpQSLrcvddate_log->labelsize(14); inpQSLrcvddate_log->labelcolor(FL_FOREGROUND_COLOR); inpQSLrcvddate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSLrcvddate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpQSLrcvddate_log { Fl_DateInput* o = inpEQSLrcvddate_log = new Fl_DateInput(118, 188, 100, 24, _("EQSL-rcvd")); inpEQSLrcvddate_log->tooltip(_("QSL received on this date")); inpEQSLrcvddate_log->box(FL_DOWN_BOX); inpEQSLrcvddate_log->color(FL_BACKGROUND2_COLOR); inpEQSLrcvddate_log->selection_color(FL_SELECTION_COLOR); inpEQSLrcvddate_log->labeltype(FL_NORMAL_LABEL); inpEQSLrcvddate_log->labelfont(0); inpEQSLrcvddate_log->labelsize(14); inpEQSLrcvddate_log->labelcolor(FL_FOREGROUND_COLOR); inpEQSLrcvddate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpEQSLrcvddate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpEQSLrcvddate_log { Fl_DateInput* o = inpLOTWrcvddate_log = new Fl_DateInput(222, 188, 100, 24, _("LOTW-rcvd")); inpLOTWrcvddate_log->tooltip(_("QSL received on this date")); inpLOTWrcvddate_log->box(FL_DOWN_BOX); inpLOTWrcvddate_log->color(FL_BACKGROUND2_COLOR); inpLOTWrcvddate_log->selection_color(FL_SELECTION_COLOR); inpLOTWrcvddate_log->labeltype(FL_NORMAL_LABEL); inpLOTWrcvddate_log->labelfont(0); inpLOTWrcvddate_log->labelsize(14); inpLOTWrcvddate_log->labelcolor(FL_FOREGROUND_COLOR); inpLOTWrcvddate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpLOTWrcvddate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpLOTWrcvddate_log { Fl_DateInput* o = inpQSLsentdate_log = new Fl_DateInput(14, 234, 100, 24, _("QSL-sent")); inpQSLsentdate_log->tooltip(_("QSL sent on this date")); inpQSLsentdate_log->box(FL_DOWN_BOX); inpQSLsentdate_log->color(FL_BACKGROUND2_COLOR); inpQSLsentdate_log->selection_color(FL_SELECTION_COLOR); inpQSLsentdate_log->labeltype(FL_NORMAL_LABEL); inpQSLsentdate_log->labelfont(0); inpQSLsentdate_log->labelsize(14); inpQSLsentdate_log->labelcolor(FL_FOREGROUND_COLOR); inpQSLsentdate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSLsentdate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpQSLsentdate_log { Fl_DateInput* o = inpEQSLsentdate_log = new Fl_DateInput(118, 234, 100, 24, _("EQSL-sent")); inpEQSLsentdate_log->tooltip(_("QSL sent on this date")); inpEQSLsentdate_log->box(FL_DOWN_BOX); inpEQSLsentdate_log->color(FL_BACKGROUND2_COLOR); inpEQSLsentdate_log->selection_color(FL_SELECTION_COLOR); inpEQSLsentdate_log->labeltype(FL_NORMAL_LABEL); inpEQSLsentdate_log->labelfont(0); inpEQSLsentdate_log->labelsize(14); inpEQSLsentdate_log->labelcolor(FL_FOREGROUND_COLOR); inpEQSLsentdate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpEQSLsentdate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpEQSLsentdate_log { Fl_DateInput* o = inpLOTWsentdate_log = new Fl_DateInput(222, 234, 100, 24, _("LOTW-sent")); inpLOTWsentdate_log->tooltip(_("QSL sent on this date")); inpLOTWsentdate_log->box(FL_DOWN_BOX); inpLOTWsentdate_log->color(FL_BACKGROUND2_COLOR); inpLOTWsentdate_log->selection_color(FL_SELECTION_COLOR); inpLOTWsentdate_log->labeltype(FL_NORMAL_LABEL); inpLOTWsentdate_log->labelfont(0); inpLOTWsentdate_log->labelsize(14); inpLOTWsentdate_log->labelcolor(FL_FOREGROUND_COLOR); inpLOTWsentdate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpLOTWsentdate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpLOTWsentdate_log { inpQSL_VIA_log = new Fl_Input2(325, 188, 156, 70, _("QSL-VIA")); inpQSL_VIA_log->tooltip(_("QSL route of contacted station")); inpQSL_VIA_log->type(4); inpQSL_VIA_log->box(FL_DOWN_BOX); inpQSL_VIA_log->color(FL_BACKGROUND2_COLOR); inpQSL_VIA_log->selection_color(FL_SELECTION_COLOR); inpQSL_VIA_log->labeltype(FL_NORMAL_LABEL); inpQSL_VIA_log->labelfont(0); inpQSL_VIA_log->labelsize(14); inpQSL_VIA_log->labelcolor(FL_FOREGROUND_COLOR); inpQSL_VIA_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSL_VIA_log->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(inpQSL_VIA_log); } // Fl_Input2* inpQSL_VIA_log tab_log_qsl->end(); } // Fl_Group* tab_log_qsl { tab_log_other = new Fl_Group(0, 161, 475, 99, _("Other")); tab_log_other->hide(); { inpCNTY_log = new Fl_Input2(21, 192, 241, 24, _("County")); inpCNTY_log->tooltip(_("County")); inpCNTY_log->box(FL_DOWN_BOX); inpCNTY_log->color(FL_BACKGROUND2_COLOR); inpCNTY_log->selection_color(FL_SELECTION_COLOR); inpCNTY_log->labeltype(FL_NORMAL_LABEL); inpCNTY_log->labelfont(0); inpCNTY_log->labelsize(14); inpCNTY_log->labelcolor(FL_FOREGROUND_COLOR); inpCNTY_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCNTY_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCNTY_log { inpIOTA_log = new Fl_Input2(276, 192, 90, 24, _("IOTA")); inpIOTA_log->tooltip(_("Islands on the air")); inpIOTA_log->box(FL_DOWN_BOX); inpIOTA_log->color(FL_BACKGROUND2_COLOR); inpIOTA_log->selection_color(FL_SELECTION_COLOR); inpIOTA_log->labeltype(FL_NORMAL_LABEL); inpIOTA_log->labelfont(0); inpIOTA_log->labelsize(14); inpIOTA_log->labelcolor(FL_FOREGROUND_COLOR); inpIOTA_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpIOTA_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpIOTA_log { inpCQZ_log = new Fl_Input2(383, 192, 90, 24, _("CQZ")); inpCQZ_log->tooltip(_("CQ zone")); inpCQZ_log->box(FL_DOWN_BOX); inpCQZ_log->color(FL_BACKGROUND2_COLOR); inpCQZ_log->selection_color(FL_SELECTION_COLOR); inpCQZ_log->labeltype(FL_NORMAL_LABEL); inpCQZ_log->labelfont(0); inpCQZ_log->labelsize(14); inpCQZ_log->labelcolor(FL_FOREGROUND_COLOR); inpCQZ_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCQZ_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCQZ_log { inpCONT_log = new Fl_Input2(21, 236, 241, 24, _("Cont\'")); inpCONT_log->tooltip(_("Continent")); inpCONT_log->box(FL_DOWN_BOX); inpCONT_log->color(FL_BACKGROUND2_COLOR); inpCONT_log->selection_color(FL_SELECTION_COLOR); inpCONT_log->labeltype(FL_NORMAL_LABEL); inpCONT_log->labelfont(0); inpCONT_log->labelsize(14); inpCONT_log->labelcolor(FL_FOREGROUND_COLOR); inpCONT_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCONT_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCONT_log { inpITUZ_log = new Fl_Input2(277, 236, 90, 24, _("ITUZ")); inpITUZ_log->tooltip(_("ITU zone")); inpITUZ_log->box(FL_DOWN_BOX); inpITUZ_log->color(FL_BACKGROUND2_COLOR); inpITUZ_log->selection_color(FL_SELECTION_COLOR); inpITUZ_log->labeltype(FL_NORMAL_LABEL); inpITUZ_log->labelfont(0); inpITUZ_log->labelsize(14); inpITUZ_log->labelcolor(FL_FOREGROUND_COLOR); inpITUZ_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpITUZ_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpITUZ_log { inpDXCC_log = new Fl_Input2(383, 236, 90, 24, _("DXCC")); inpDXCC_log->tooltip(_("DXCC designator")); inpDXCC_log->box(FL_DOWN_BOX); inpDXCC_log->color(FL_BACKGROUND2_COLOR); inpDXCC_log->selection_color(FL_SELECTION_COLOR); inpDXCC_log->labeltype(FL_NORMAL_LABEL); inpDXCC_log->labelfont(0); inpDXCC_log->labelsize(14); inpDXCC_log->labelcolor(FL_FOREGROUND_COLOR); inpDXCC_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDXCC_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpDXCC_log tab_log_other->end(); } // Fl_Group* tab_log_other { tab_log_notes = new Fl_Group(0, 161, 480, 96, _("Notes")); tab_log_notes->hide(); { inpNotes_log = new Fl_Input2(15, 171, 465, 85); inpNotes_log->tooltip(_("Interesting notes")); inpNotes_log->type(4); inpNotes_log->box(FL_DOWN_BOX); inpNotes_log->color(FL_BACKGROUND2_COLOR); inpNotes_log->selection_color(FL_SELECTION_COLOR); inpNotes_log->labeltype(FL_NORMAL_LABEL); inpNotes_log->labelfont(0); inpNotes_log->labelsize(14); inpNotes_log->labelcolor(FL_FOREGROUND_COLOR); inpNotes_log->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); inpNotes_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpNotes_log tab_log_notes->end(); } // Fl_Group* tab_log_notes { tab_log_my_station = new Fl_Group(0, 161, 475, 99, _("My Station")); tab_log_my_station->hide(); { inp_log_sta_call = new Fl_Input2(15, 192, 100, 24, _("Station Call")); inp_log_sta_call->tooltip(_("Interesting notes")); inp_log_sta_call->box(FL_DOWN_BOX); inp_log_sta_call->color(FL_BACKGROUND2_COLOR); inp_log_sta_call->selection_color(FL_SELECTION_COLOR); inp_log_sta_call->labeltype(FL_NORMAL_LABEL); inp_log_sta_call->labelfont(0); inp_log_sta_call->labelsize(14); inp_log_sta_call->labelcolor(FL_FOREGROUND_COLOR); inp_log_sta_call->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_sta_call->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_sta_call { inp_log_op_call = new Fl_Input2(140, 192, 100, 24, _("Operator Call")); inp_log_op_call->tooltip(_("Interesting notes")); inp_log_op_call->box(FL_DOWN_BOX); inp_log_op_call->color(FL_BACKGROUND2_COLOR); inp_log_op_call->selection_color(FL_SELECTION_COLOR); inp_log_op_call->labeltype(FL_NORMAL_LABEL); inp_log_op_call->labelfont(0); inp_log_op_call->labelsize(14); inp_log_op_call->labelcolor(FL_FOREGROUND_COLOR); inp_log_op_call->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_op_call->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_op_call { inp_log_sta_qth = new Fl_Input2(15, 236, 334, 24, _("Station QTH")); inp_log_sta_qth->tooltip(_("Interesting notes")); inp_log_sta_qth->box(FL_DOWN_BOX); inp_log_sta_qth->color(FL_BACKGROUND2_COLOR); inp_log_sta_qth->selection_color(FL_SELECTION_COLOR); inp_log_sta_qth->labeltype(FL_NORMAL_LABEL); inp_log_sta_qth->labelfont(0); inp_log_sta_qth->labelsize(14); inp_log_sta_qth->labelcolor(FL_FOREGROUND_COLOR); inp_log_sta_qth->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_sta_qth->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_sta_qth { inp_log_sta_loc = new Fl_Input2(355, 236, 120, 24, _("Station Locator")); inp_log_sta_loc->tooltip(_("Interesting notes")); inp_log_sta_loc->box(FL_DOWN_BOX); inp_log_sta_loc->color(FL_BACKGROUND2_COLOR); inp_log_sta_loc->selection_color(FL_SELECTION_COLOR); inp_log_sta_loc->labeltype(FL_NORMAL_LABEL); inp_log_sta_loc->labelfont(0); inp_log_sta_loc->labelsize(14); inp_log_sta_loc->labelcolor(FL_FOREGROUND_COLOR); inp_log_sta_loc->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_sta_loc->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_sta_loc tab_log_my_station->end(); } // Fl_Group* tab_log_my_station { tab_log_contest = new Fl_Group(0, 161, 480, 99, _("Contest")); tab_log_contest->hide(); { inpSerNoOut_log = new Fl_Input2(69, 179, 55, 24, _("Ser out")); inpSerNoOut_log->tooltip(_("Contest seral # sent")); inpSerNoOut_log->box(FL_DOWN_BOX); inpSerNoOut_log->color(FL_BACKGROUND2_COLOR); inpSerNoOut_log->selection_color(FL_SELECTION_COLOR); inpSerNoOut_log->labeltype(FL_NORMAL_LABEL); inpSerNoOut_log->labelfont(0); inpSerNoOut_log->labelsize(14); inpSerNoOut_log->labelcolor(FL_FOREGROUND_COLOR); inpSerNoOut_log->align(Fl_Align(FL_ALIGN_LEFT)); inpSerNoOut_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSerNoOut_log { inpMyXchg_log = new Fl_Input2(204, 179, 170, 24, _("Exch Out")); inpMyXchg_log->tooltip(_("Contest exchange sent")); inpMyXchg_log->box(FL_DOWN_BOX); inpMyXchg_log->color(FL_BACKGROUND2_COLOR); inpMyXchg_log->selection_color(FL_SELECTION_COLOR); inpMyXchg_log->labeltype(FL_NORMAL_LABEL); inpMyXchg_log->labelfont(0); inpMyXchg_log->labelsize(14); inpMyXchg_log->labelcolor(FL_FOREGROUND_COLOR); inpMyXchg_log->align(Fl_Align(FL_ALIGN_LEFT)); inpMyXchg_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMyXchg_log { inpSerNoIn_log = new Fl_Input2(69, 207, 55, 24, _("Ser in")); inpSerNoIn_log->tooltip(_("Contest serial # received")); inpSerNoIn_log->box(FL_DOWN_BOX); inpSerNoIn_log->color(FL_BACKGROUND2_COLOR); inpSerNoIn_log->selection_color(FL_SELECTION_COLOR); inpSerNoIn_log->labeltype(FL_NORMAL_LABEL); inpSerNoIn_log->labelfont(0); inpSerNoIn_log->labelsize(14); inpSerNoIn_log->labelcolor(FL_FOREGROUND_COLOR); inpSerNoIn_log->align(Fl_Align(FL_ALIGN_LEFT)); inpSerNoIn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSerNoIn_log { inpXchgIn_log = new Fl_Input2(204, 207, 170, 24, _("Exch In")); inpXchgIn_log->tooltip(_("Contest exchange received")); inpXchgIn_log->box(FL_DOWN_BOX); inpXchgIn_log->color(FL_BACKGROUND2_COLOR); inpXchgIn_log->selection_color(FL_SELECTION_COLOR); inpXchgIn_log->labeltype(FL_NORMAL_LABEL); inpXchgIn_log->labelfont(0); inpXchgIn_log->labelsize(14); inpXchgIn_log->labelcolor(FL_FOREGROUND_COLOR); inpXchgIn_log->align(Fl_Align(FL_ALIGN_LEFT)); inpXchgIn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpXchgIn_log { inpClass_log = new Fl_Input2(69, 236, 55, 24, _("Class")); inpClass_log->tooltip(_("Field Day class received")); inpClass_log->box(FL_DOWN_BOX); inpClass_log->color(FL_BACKGROUND2_COLOR); inpClass_log->selection_color(FL_SELECTION_COLOR); inpClass_log->labeltype(FL_NORMAL_LABEL); inpClass_log->labelfont(0); inpClass_log->labelsize(14); inpClass_log->labelcolor(FL_FOREGROUND_COLOR); inpClass_log->align(Fl_Align(FL_ALIGN_LEFT)); inpClass_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpClass_log { inpSection_log = new Fl_Input2(204, 236, 56, 24, _("ARRL Sect")); inpSection_log->tooltip(_("Field Section received")); inpSection_log->box(FL_DOWN_BOX); inpSection_log->color(FL_BACKGROUND2_COLOR); inpSection_log->selection_color(FL_SELECTION_COLOR); inpSection_log->labeltype(FL_NORMAL_LABEL); inpSection_log->labelfont(0); inpSection_log->labelsize(14); inpSection_log->labelcolor(FL_FOREGROUND_COLOR); inpSection_log->align(Fl_Align(FL_ALIGN_LEFT)); inpSection_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSection_log { inp_age_log = new Fl_Input2(420, 179, 60, 24, _("Age")); inp_age_log->tooltip(_("Operators age received")); inp_age_log->box(FL_DOWN_BOX); inp_age_log->color(FL_BACKGROUND2_COLOR); inp_age_log->selection_color(FL_SELECTION_COLOR); inp_age_log->labeltype(FL_NORMAL_LABEL); inp_age_log->labelfont(0); inp_age_log->labelsize(14); inp_age_log->labelcolor(FL_FOREGROUND_COLOR); inp_age_log->align(Fl_Align(FL_ALIGN_LEFT)); inp_age_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_age_log { inp_1010_log = new Fl_Input2(420, 207, 60, 24, _("10-10")); inp_1010_log->tooltip(_("Ten Ten number received")); inp_1010_log->box(FL_DOWN_BOX); inp_1010_log->color(FL_BACKGROUND2_COLOR); inp_1010_log->selection_color(FL_SELECTION_COLOR); inp_1010_log->labeltype(FL_NORMAL_LABEL); inp_1010_log->labelfont(0); inp_1010_log->labelsize(14); inp_1010_log->labelcolor(FL_FOREGROUND_COLOR); inp_1010_log->align(Fl_Align(FL_ALIGN_LEFT)); inp_1010_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_1010_log { inpBand_log = new Fl_Input2(420, 236, 60, 24, _("Band")); inpBand_log->tooltip(_("Operating band")); inpBand_log->box(FL_DOWN_BOX); inpBand_log->color(FL_BACKGROUND2_COLOR); inpBand_log->selection_color(FL_SELECTION_COLOR); inpBand_log->labeltype(FL_NORMAL_LABEL); inpBand_log->labelfont(0); inpBand_log->labelsize(14); inpBand_log->labelcolor(FL_FOREGROUND_COLOR); inpBand_log->align(Fl_Align(FL_ALIGN_LEFT)); inpBand_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpBand_log { inp_check_log = new Fl_Input2(314, 236, 60, 24, _("Check")); inp_check_log->tooltip(_("Check value received")); inp_check_log->box(FL_DOWN_BOX); inp_check_log->color(FL_BACKGROUND2_COLOR); inp_check_log->selection_color(FL_SELECTION_COLOR); inp_check_log->labeltype(FL_NORMAL_LABEL); inp_check_log->labelfont(0); inp_check_log->labelsize(14); inp_check_log->labelcolor(FL_FOREGROUND_COLOR); inp_check_log->align(Fl_Align(FL_ALIGN_LEFT)); inp_check_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_check_log tab_log_contest->end(); } // Fl_Group* tab_log_contest { tab_log_cwss = new Fl_Group(0, 161, 475, 96, _("CW SS")); tab_log_cwss->tooltip(_("CW Sweepstakes Contest")); tab_log_cwss->hide(); { inp_log_cwss_serno = new Fl_Input2(77, 179, 55, 24, _("Ser NoR")); inp_log_cwss_serno->tooltip(_("Contest seral # sent")); inp_log_cwss_serno->box(FL_DOWN_BOX); inp_log_cwss_serno->color(FL_BACKGROUND2_COLOR); inp_log_cwss_serno->selection_color(FL_SELECTION_COLOR); inp_log_cwss_serno->labeltype(FL_NORMAL_LABEL); inp_log_cwss_serno->labelfont(0); inp_log_cwss_serno->labelsize(14); inp_log_cwss_serno->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_serno->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_serno->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_serno { inp_log_cwss_sec = new Fl_Input2(77, 207, 56, 24, _("Section")); inp_log_cwss_sec->tooltip(_("SS section")); inp_log_cwss_sec->box(FL_DOWN_BOX); inp_log_cwss_sec->color(FL_BACKGROUND2_COLOR); inp_log_cwss_sec->selection_color(FL_SELECTION_COLOR); inp_log_cwss_sec->labeltype(FL_NORMAL_LABEL); inp_log_cwss_sec->labelfont(0); inp_log_cwss_sec->labelsize(14); inp_log_cwss_sec->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_sec->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_sec->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_sec { inp_log_cwss_prec = new Fl_Input2(238, 179, 77, 24, _("Precedence")); inp_log_cwss_prec->tooltip(_("Contest exchange sent")); inp_log_cwss_prec->box(FL_DOWN_BOX); inp_log_cwss_prec->color(FL_BACKGROUND2_COLOR); inp_log_cwss_prec->selection_color(FL_SELECTION_COLOR); inp_log_cwss_prec->labeltype(FL_NORMAL_LABEL); inp_log_cwss_prec->labelfont(0); inp_log_cwss_prec->labelsize(14); inp_log_cwss_prec->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_prec->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_prec->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_prec { inp_log_cwss_chk = new Fl_Input2(238, 207, 77, 24, _("Check")); inp_log_cwss_chk->tooltip(_("Contest exchange received")); inp_log_cwss_chk->box(FL_DOWN_BOX); inp_log_cwss_chk->color(FL_BACKGROUND2_COLOR); inp_log_cwss_chk->selection_color(FL_SELECTION_COLOR); inp_log_cwss_chk->labeltype(FL_NORMAL_LABEL); inp_log_cwss_chk->labelfont(0); inp_log_cwss_chk->labelsize(14); inp_log_cwss_chk->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_chk->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_chk->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_chk tab_log_cwss->end(); } // Fl_Group* tab_log_cwss { tab_log_jota = new Fl_Group(0, 161, 475, 96, _("JOTA")); tab_log_jota->tooltip(_("Jamboree On The Air")); tab_log_jota->hide(); { inp_log_troop_s = new Fl_Input2(115, 179, 100, 24, _("Troop-S")); inp_log_troop_s->tooltip(_("Sent troop number")); inp_log_troop_s->box(FL_DOWN_BOX); inp_log_troop_s->color(FL_BACKGROUND2_COLOR); inp_log_troop_s->selection_color(FL_SELECTION_COLOR); inp_log_troop_s->labeltype(FL_NORMAL_LABEL); inp_log_troop_s->labelfont(0); inp_log_troop_s->labelsize(14); inp_log_troop_s->labelcolor(FL_FOREGROUND_COLOR); inp_log_troop_s->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_troop_s->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_troop_s { inp_log_troop_r = new Fl_Input2(292, 179, 100, 24, _("Troop-R")); inp_log_troop_r->tooltip(_("Received troop number")); inp_log_troop_r->box(FL_DOWN_BOX); inp_log_troop_r->color(FL_BACKGROUND2_COLOR); inp_log_troop_r->selection_color(FL_SELECTION_COLOR); inp_log_troop_r->labeltype(FL_NORMAL_LABEL); inp_log_troop_r->labelfont(0); inp_log_troop_r->labelsize(14); inp_log_troop_r->labelcolor(FL_FOREGROUND_COLOR); inp_log_troop_r->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_troop_r->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_troop_r { inp_log_scout_s = new Fl_Input2(115, 215, 100, 24, _("Name-S")); inp_log_scout_s->tooltip(_("Sent scout name")); inp_log_scout_s->box(FL_DOWN_BOX); inp_log_scout_s->color(FL_BACKGROUND2_COLOR); inp_log_scout_s->selection_color(FL_SELECTION_COLOR); inp_log_scout_s->labeltype(FL_NORMAL_LABEL); inp_log_scout_s->labelfont(0); inp_log_scout_s->labelsize(14); inp_log_scout_s->labelcolor(FL_FOREGROUND_COLOR); inp_log_scout_s->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_scout_s->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_scout_s { inp_log_scout_r = new Fl_Input2(292, 215, 100, 24, _("Name-R")); inp_log_scout_r->tooltip(_("Received scout name")); inp_log_scout_r->box(FL_DOWN_BOX); inp_log_scout_r->color(FL_BACKGROUND2_COLOR); inp_log_scout_r->selection_color(FL_SELECTION_COLOR); inp_log_scout_r->labeltype(FL_NORMAL_LABEL); inp_log_scout_r->labelfont(0); inp_log_scout_r->labelsize(14); inp_log_scout_r->labelcolor(FL_FOREGROUND_COLOR); inp_log_scout_r->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_scout_r->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_scout_r tab_log_jota->end(); } // Fl_Group* tab_log_jota Tabs->end(); } // Fl_Tabs* Tabs { grpCallSearch = new Fl_Group(482, 137, 105, 125); { inpSearchString = new Fl_Input2(482, 160, 105, 24, _("Call Search")); inpSearchString->tooltip(_("Search for this callsign")); inpSearchString->box(FL_DOWN_BOX); inpSearchString->color(FL_BACKGROUND2_COLOR); inpSearchString->selection_color(FL_SELECTION_COLOR); inpSearchString->labeltype(FL_NORMAL_LABEL); inpSearchString->labelfont(0); inpSearchString->labelsize(14); inpSearchString->labelcolor(FL_FOREGROUND_COLOR); inpSearchString->align(Fl_Align(FL_ALIGN_TOP)); inpSearchString->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSearchString { bSearchPrev = new Fl_Button(500, 193, 24, 22); bSearchPrev->tooltip(_("Find previous")); bSearchPrev->color(FL_LIGHT1); bSearchPrev->selection_color((Fl_Color)48); bSearchPrev->callback((Fl_Callback*)cb_search); bSearchPrev->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); bSearchPrev->image(new Fl_Pixmap(left_arrow_icon)); } // Fl_Button* bSearchPrev { bSearchNext = new Fl_Button(552, 193, 24, 22); bSearchNext->tooltip(_("Find next")); bSearchNext->color(FL_LIGHT1); bSearchNext->selection_color((Fl_Color)48); bSearchNext->callback((Fl_Callback*)cb_search); bSearchNext->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); bSearchNext->image(new Fl_Pixmap(right_arrow_icon)); } // Fl_Button* bSearchNext { bRetrieve = new Fl_Button(500, 223, 75, 22, _("Retrieve")); bRetrieve->tooltip(_("Retrieve for active modem use")); bRetrieve->shortcut(0x50066); bRetrieve->color(FL_LIGHT1); bRetrieve->selection_color((Fl_Color)48); bRetrieve->callback((Fl_Callback*)cb_btnRetrieve); } // Fl_Button* bRetrieve grpCallSearch->end(); } // Fl_Group* grpCallSearch o->resizable(Tabs); grpTabsSearch->end(); } // Fl_Group* grpTabsSearch { Fl_Group* o = grpFileButtons = new Fl_Group(0, 262, 589, 25); { bNewSave = new Fl_Button(396, 263, 59, 22, _("New")); bNewSave->tooltip(_("New record / Save record")); bNewSave->shortcut(0x8004e); bNewSave->color(FL_LIGHT1); bNewSave->selection_color((Fl_Color)48); bNewSave->callback((Fl_Callback*)cb_btnNewSave); } // Fl_Button* bNewSave { bUpdateCancel = new Fl_Button(459, 263, 59, 22, _("Update")); bUpdateCancel->tooltip(_("Update the current record")); bUpdateCancel->shortcut(0x80055); bUpdateCancel->color(FL_LIGHT1); bUpdateCancel->selection_color((Fl_Color)48); bUpdateCancel->callback((Fl_Callback*)cb_btnUpdateCancel); } // Fl_Button* bUpdateCancel { bDelete = new Fl_Button(522, 263, 59, 22, _("Delete")); bDelete->tooltip(_("Delete the current record")); bDelete->shortcut(0x80044); bDelete->color(FL_LIGHT1); bDelete->selection_color((Fl_Color)48); bDelete->callback((Fl_Callback*)cb_btnDelete); } // Fl_Button* bDelete { txtLogFile = new Fl_Output(35, 263, 357, 22, _("File:")); txtLogFile->color(FL_LIGHT3); } // Fl_Output* txtLogFile o->resizable(txtLogFile); grpFileButtons->end(); } // Fl_Group* grpFileButtons { wBrowser = new Table(2, 288, 586, 100); wBrowser->box(FL_DOWN_FRAME); wBrowser->color(FL_BACKGROUND2_COLOR); wBrowser->selection_color(FL_SELECTION_COLOR); wBrowser->labeltype(FL_NORMAL_LABEL); wBrowser->labelfont(0); wBrowser->labelsize(14); wBrowser->labelcolor(FL_FOREGROUND_COLOR); wBrowser->align(Fl_Align(FL_ALIGN_TOP)); wBrowser->when(FL_WHEN_RELEASE); wBrowser->end(); Fl_Group::current()->resizable(wBrowser); } // Table* wBrowser o->resizable(wBrowser); dlgLogbook->end(); } // Fl_Double_Window* dlgLogbook wBrowser->align (FL_ALIGN_TOP | FL_ALIGN_LEFT); wBrowser->addColumn (_("Date"),85); wBrowser->colcallback (0,cb_SortByDate); wBrowser->addColumn (_("Time"),47); wBrowser->addColumn (_("Callsign"),100); wBrowser->colcallback (2,cb_SortByCall); wBrowser->addColumn (_("Name"),110); wBrowser->addColumn (_("Frequency"),120); wBrowser->colcallback (4,cb_SortByFreq); wBrowser->addColumn (_("Mode"),103); wBrowser->colcallback (5,cb_SortByMode); wBrowser->addHiddenColumn ("rn"); wBrowser->allowSort(true); wBrowser->callback(cb_browser); wBrowser->when(FL_WHEN_CHANGED); wBrowser->rowSize (FL_NORMAL_SIZE); wBrowser->headerSize (FL_NORMAL_SIZE); wBrowser->allowResize (1); wBrowser->gridEnabled (0); dlgLogbook->xclass(PACKAGE_TARNAME); { wCabrillo = new Fl_Double_Window(675, 340, _("Cabrillo Setup")); { Fl_Group* o = new Fl_Group(4, 4, 388, 305, _("Select Records to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkCabBrowser = new Fl_Check_Browser(13, 25, 370, 245); } // Fl_Check_Browser* chkCabBrowser { btnCabClearAll = new Fl_Button(69, 277, 110, 24, _("Clear All")); btnCabClearAll->callback((Fl_Callback*)cb_btnCabClearAll); } // Fl_Button* btnCabClearAll { btnCabCheckAll = new Fl_Button(200, 277, 110, 24, _("Check All")); btnCabCheckAll->callback((Fl_Callback*)cb_btnCabCheckAll); } // Fl_Button* btnCabCheckAll o->end(); } // Fl_Group* o { btnCabOK = new Fl_Return_Button(544, 312, 100, 24, _("OK")); btnCabOK->callback((Fl_Callback*)cb_btnCabOK); } // Fl_Return_Button* btnCabOK { btnCabCancel = new Fl_Button(414, 312, 100, 24, _("Cancel")); btnCabCancel->callback((Fl_Callback*)cb_btnCabCancel); } // Fl_Button* btnCabCancel { Fl_Group* o = new Fl_Group(390, 4, 283, 305, _("Select Cabrillo Contest & Fields")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { cboContest = new Fl_ComboBox(486, 41, 180, 20, _("Contest:")); cboContest->box(FL_BORDER_BOX); cboContest->color(FL_BACKGROUND2_COLOR); cboContest->selection_color(FL_BACKGROUND_COLOR); cboContest->labeltype(FL_NORMAL_LABEL); cboContest->labelfont(0); cboContest->labelsize(14); cboContest->labelcolor(FL_FOREGROUND_COLOR); cboContest->callback((Fl_Callback*)cb_cboContest); cboContest->align(Fl_Align(FL_ALIGN_LEFT)); cboContest->when(FL_WHEN_RELEASE); cboContest->end(); } // Fl_ComboBox* cboContest { btnCabCall = new Fl_Check_Button(423, 75, 70, 16, _("Call")); btnCabCall->down_box(FL_DOWN_BOX); btnCabCall->value(1); } // Fl_Check_Button* btnCabCall { btnCabFreq = new Fl_Check_Button(423, 100, 70, 15, _("Freq")); btnCabFreq->down_box(FL_DOWN_BOX); btnCabFreq->value(1); } // Fl_Check_Button* btnCabFreq { btnCabMode = new Fl_Check_Button(423, 124, 70, 15, _("Mode")); btnCabMode->down_box(FL_DOWN_BOX); btnCabMode->value(1); } // Fl_Check_Button* btnCabMode { btnCabQSOdate = new Fl_Check_Button(423, 148, 70, 15, _("QSO Date")); btnCabQSOdate->down_box(FL_DOWN_BOX); btnCabQSOdate->value(1); } // Fl_Check_Button* btnCabQSOdate { btnCabTimeOFF = new Fl_Check_Button(423, 172, 70, 15, _("Time OFF")); btnCabTimeOFF->down_box(FL_DOWN_BOX); btnCabTimeOFF->value(1); } // Fl_Check_Button* btnCabTimeOFF { btnCabRSTsent = new Fl_Check_Button(423, 196, 70, 15, _("RST sent")); btnCabRSTsent->down_box(FL_DOWN_BOX); btnCabRSTsent->value(1); } // Fl_Check_Button* btnCabRSTsent { btnCabRSTrcvd = new Fl_Check_Button(423, 221, 70, 16, _("RST rcvd")); btnCabRSTrcvd->down_box(FL_DOWN_BOX); btnCabRSTrcvd->value(1); } // Fl_Check_Button* btnCabRSTrcvd { btnCabSerialIN = new Fl_Check_Button(533, 100, 70, 15, _("Serial # in")); btnCabSerialIN->down_box(FL_DOWN_BOX); btnCabSerialIN->value(1); } // Fl_Check_Button* btnCabSerialIN { btnCabSerialOUT = new Fl_Check_Button(533, 124, 70, 15, _("Serial # out")); btnCabSerialOUT->down_box(FL_DOWN_BOX); btnCabSerialOUT->value(1); } // Fl_Check_Button* btnCabSerialOUT { btnCabXchgIn = new Fl_Check_Button(533, 148, 70, 15, _("Exchange In")); btnCabXchgIn->down_box(FL_DOWN_BOX); btnCabXchgIn->value(1); } // Fl_Check_Button* btnCabXchgIn { btnCabMyXchg = new Fl_Check_Button(533, 172, 70, 15, _("Exchange Out")); btnCabMyXchg->down_box(FL_DOWN_BOX); btnCabMyXchg->value(1); } // Fl_Check_Button* btnCabMyXchg { btnCabClearAllFields = new Fl_Button(409, 277, 110, 24, _("Clear All")); btnCabClearAllFields->callback((Fl_Callback*)cb_btnCabClearAllFields); } // Fl_Button* btnCabClearAllFields { btnCabCheckAllFields = new Fl_Button(539, 277, 110, 24, _("Check All")); btnCabCheckAllFields->callback((Fl_Callback*)cb_btnCabCheckAllFields); } // Fl_Button* btnCabCheckAllFields o->end(); } // Fl_Group* o wCabrillo->end(); } // Fl_Double_Window* wCabrillo } fldigi-4.1.06/src/logbook/adif_io.cxx0000664000175000017500000005175613507402064014343 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "fl_digi.h" #include "signal.h" #include "threads.h" #include "adif_io.h" #include "config.h" #include "configuration.h" #include "lgbook.h" #include "icons.h" #include "gettext.h" #include "debug.h" #include "util.h" #include "date.h" #include "logsupport.h" #include "qrunner.h" #include "timeops.h" using namespace std; #ifdef __WOE32__ static const char *szEOL = "\r\n"; #else static const char *szEOL = "\n"; #endif static const char *szEOR = ""; // These ADIF fields define the ADIF database FIELD fields[] = { // TYPE, FSIZE, NAME, WIDGET {FREQ, 12, "FREQ", &btnSelectFreq}, // QSO frequency in Mhz {CALL, 30, "CALL", &btnSelectCall}, // contacted stations CALLSIGN {ADIF_MODE, 20, "MODE", &btnSelectMode}, // QSO mode {SUBMODE, 20, "SUBMODE", NULL}, // QSO submode {NAME, 80, "NAME", &btnSelectName}, // contacted operators NAME {QSO_DATE, 8, "QSO_DATE", &btnSelectQSOdateOn}, // QSO data {QSO_DATE_OFF, 8, "QSO_DATE_OFF", &btnSelectQSOdateOff},// QSO data OFF, according to ADIF 2.2.6 {TIME_OFF, 6, "TIME_OFF", &btnSelectTimeOFF}, // HHMM or HHMMSS in UTC {TIME_ON, 6, "TIME_ON", &btnSelectTimeON}, // HHMM or HHMMSS in UTC {QTH, 100, "QTH", &btnSelectQth}, // contacted stations city {RST_RCVD, 3, "RST_RCVD", &btnSelectRSTrcvd}, // received signal report {RST_SENT, 3, "RST_SENT", &btnSelectRSTsent}, // sent signal report {STATE, 20, "STATE", &btnSelectState}, // contacted stations STATE {VE_PROV, 20, "VE_PROV", &btnSelectProvince}, // 2 letter abbreviation for Canadian Province {NOTES, 512, "NOTES", &btnSelectNotes}, // QSO notes {QSLRDATE, 8, "QSLRDATE", &btnSelectQSLrcvd}, // QSL received date {QSLSDATE, 8, "QSLSDATE", &btnSelectQSLsent}, // QSL sent date {EQSLRDATE, 8, "EQSLRDATE", &btnSelecteQSLrcvd}, // EQSL received date {EQSLSDATE, 8, "EQSLSDATE", &btnSelecteQSLsent}, // EQSL sent date {LOTWRDATE, 8, "LOTWRDATE", &btnSelectLOTWrcvd}, // LOTW received date {LOTWSDATE, 8, "LOTWSDATE", &btnSelectLOTWsent}, // LOTW sent date {GRIDSQUARE, 8, "GRIDSQUARE", &btnSelectLOC}, // contacted stations Maidenhead Grid Square {BAND, 8, "BAND", &btnSelectBand}, // QSO band {CNTY, 60, "CNTY", &btnSelectCNTY}, // secondary political subdivision, ie: county {COUNTRY, 60, "COUNTRY", &btnSelectCountry}, // contacted stations DXCC entity name {CQZ, 8, "CQZ", &btnSelectCQZ}, // contacted stations CQ Zone {DXCC, 8, "DXCC", &btnSelectDXCC}, // contacted stations Country Code {QSL_VIA, 256, "QSL_VIA", &btnSelectQSL_VIA}, // contacted stations path {IOTA, 20, "IOTA", &btnSelectIOTA}, // Islands on the air {ITUZ, 20, "ITUZ", &btnSelectITUZ}, // ITU zone {CONT, 60, "CONT", &btnSelectCONT}, // contacted stations continent {SRX, 50, "SRX", &btnSelectSerialIN}, // received serial number for a contest QSO {STX, 50, "STX", &btnSelectSerialOUT}, // QSO transmitted serial number {XCHG1, 100, "SRX_STRING", &btnSelectXchgIn}, // contest exchange #1 / free1 in xlog {MYXCHG, 100, "STX_STRING", &btnSelectMyXchg}, // contest exchange sent {CLASS, 20, "CLASS", &btnSelectClass}, // Field Day / School RR class received {ARRL_SECT, 20, "ARRL_SECT", &btnSelectSection}, // ARRL section received {TX_PWR, 8, "TX_PWR", &btnSelectTX_pwr}, // power transmitted by this station {OP_CALL, 30, "OPERATOR", &btnSelectOperator}, // Callsign of person logging the QSO {STA_CALL, 30, "STATION_CALLSIGN", &btnSelectStaCall}, // Callsign of transmitting station {MY_GRID, 8, "MY_GRIDSQUARE", &btnSelectStaGrid}, // Xmt station locator {MY_CITY, 60, "MY_CITY", &btnSelectStaCity}, // Xmt station location {SS_SEC, 20, "CWSS_SECTION", &btnSelect_cwss_section}, // CW sweepstakes {SS_SERNO, 20, "CWSS_SERNO", &btnSelect_cwss_serno}, {SS_PREC, 20, "CWSS_PREC", &btnSelect_cwss_prec}, {SS_CHK, 20, "CWSS_CHK", &btnSelect_cwss_check}, {AGE, 2, "AGE", &btnSelectAge}, // contacted operators age in years {TEN_TEN, 10, "TEN_TEN", &btnSelect_1010}, // ten ten # of other station {CHECK, 10, "CHECK", &btnSelectCheck}, // contest identifier {FD_CLASS, 20, "FD_CLASS", NULL}, // Field Day Rcvd {FD_SECTION, 20, "FD_SECTION", NULL}, // FD section received {TROOPS, 20, "TROOPS", NULL}, // JOTA troop number sent {TROOPR, 20, "TROOPR", NULL}, // JOTA troop number received {SCOUTS, 20, "SCOUTS", NULL}, {SCOUTR, 20, "SCOUTR", NULL}, {NUMFIELDS, 0, "", NULL} }; // This ADIF fields is in the fldigi QSO database, but not saved in the ADIF file /* {EXPORT, 0, "EXPORT", NULL}, // used to indicate record is to be exported */ // These ADIF fields are not in the fldigi QSO database /* {COMMENT, 256, "COMMENT", NULL}, // comment field for QSO {ADDRESS, 256, "ADDRESS", NULL}, // contacted stations mailing address {PFX, 20, "PFX", NULL}, // WPA prefix {PROP_MODE, 100, "PROP_MODE", NULL}, // propogation mode {QSL_MSG, 256, "QSL_MSG", NULL}, // personal message to appear on qsl card {QSL_RCVD, 4, "QSL_RCVD", NULL}, // QSL received status {QSL_SENT, 4, "QSL_SENT", NULL}, // QSL sent status {QSL_VIA, 20, "QSL_VIA", NULL}, // QSL via this person {RX_PWR, 8, "RX_PWR", NULL}, // power of other station in watts {SAT_MODE, 20, "SAT_MODE", NULL}, // satellite mode {SAT_NAME, 20, "SAT_NAME", NULL}, // satellite name }; */ static string read_errors; static int num_read_errors; static void write_rxtext(const char *s) { ReceiveText->addstr(s); } static char *fastlookup = 0; static unsigned int maxlen = 0; static void initfields() { if (fastlookup) return; // may have multiple instances using common code int i = 0; while (fields[i].type != NUMFIELDS) { if (strlen(fields[i].name) > maxlen) maxlen = strlen(fields[i].name); i++; } maxlen++; fastlookup = new char[maxlen * i + 1]; fastlookup[0] = 0; i = 0; while (fields[i].type != NUMFIELDS) { strcat(fastlookup, fields[i].name); unsigned int n = maxlen - strlen(fastlookup) % maxlen; if (n > 0 && n < maxlen) for (unsigned int j = 0; j < n; j++) strcat(fastlookup, " "); i++; } } static inline int findfield( char *p ) { if (strncasecmp (p, "EOR>", 4) == 0 || !maxlen) return -1; char *pos; char *p1 = strchr(p, ':'); char *p2 = strchr(p, '>'); if (p1 && p2) { if (p1 < p2) { pos = p; do { *pos = toupper(*pos); } while (++pos < p1); *p1 = 0; pos = strcasestr(fastlookup, p); *p1 = ':'; if (pos) { return fields[(pos - fastlookup) / maxlen].type; } } } return -2; //search key not found } int cAdifIO::instances = 0; cAdifIO::cAdifIO () { initfields(); instances++; } cAdifIO::~cAdifIO() { if (--instances == 0) { delete [] fastlookup; fastlookup = 0; } } char * cAdifIO::fillfield (int recnbr, int fieldnum, char *buff) { char *p1 = strchr(buff, ':'); char *p2 = strchr(buff, '>'); if (!p1 || !p2 || p2 < p1) { return 0; // bad ADIF specifier ---> no ':' after field name } p1++; int fldsize = 0; while (p1 != p2) { if (*p1 >= '0' && *p1 <= '9') { fldsize = fldsize * 10 + *p1 - '0'; } p1++; } string tmp = ""; tmp.assign(p2+1, fldsize); // added to disallow very large corrupted adif fields if (fldsize > fields[fieldnum].fsize) { string bfr = buff; tmp.erase(fields[fieldnum].fsize); static char szmsg[1000]; snprintf(szmsg, sizeof(szmsg), "In record # %d, <%s, too large, saving first %d characters\n", recnbr+1, bfr.substr(0, (int)(p2+1 - buff)).c_str(), fields[fieldnum].fsize ); read_errors.append(szmsg); num_read_errors++; } if ((fieldnum == TIME_ON || fieldnum == TIME_OFF) && fldsize < 6) while (tmp.length() < 6) tmp += '0'; adifqso->putField( fieldnum, tmp.c_str(), tmp.length() ); return p2 + fldsize + 1; } void cAdifIO::do_readfile(const char *fname, cQsoDb *db) { int found; static char szmsg[500]; read_errors.clear(); num_read_errors = 0; // open the adif file FILE *adiFile = fl_fopen (fname, "rb"); if (adiFile == NULL) { LOG_ERROR("Could not open %s", fname); return; } struct timespec t0, t1; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif char buff[16384]; string sbuff; memset(buff, 0, 16384); int retnbr = fread(buff, 1, 16384, adiFile); if (retnbr) sbuff.assign(buff, retnbr); size_t p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); if (p == std::string::npos) { LOG_ERROR("Could not find in %s", fname); return; } sbuff.erase(0, p + 5); // skip over cr/lf pairs while (sbuff.length() && (sbuff[0] == '\r' || sbuff[0] == '\n')) sbuff.erase(0,1); p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); while (!feof(adiFile) && (p == std::string::npos)) { retnbr = fread(buff, 1, 16384, adiFile); if (retnbr) sbuff.append(buff, retnbr); p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); } if (p == std::string::npos) { LOG_ERROR("Could not find any records in %s", fname); return; } char *ptr = 0, *ptr2 = 0; int recnbr = 0; while (p != std::string::npos) { ptr = strchr((char *)sbuff.c_str(),'<'); adifqso = 0; while (ptr) { found = findfield(ptr+1); if (found > -1) { if (!adifqso) adifqso = db->newrec(); // need new record in db ptr2 = fillfield (recnbr, found, ptr+1); } else if (found == -1) { // reached; break; } else { ptr2 = ptr + 1; } if ((ptr2 != NULL) && (unsigned)(ptr2 - ptr) <= p) ptr = strchr(ptr2,'<'); else break; // corrupt record } recnbr++; sbuff.erase(0, p + 5); while (sbuff.length() && (sbuff[0] == '\r' || sbuff[0] == '\n')) sbuff.erase(0,1); p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); while (!feof(adiFile) && (p == std::string::npos)) { retnbr = fread(buff, 1, 16384, adiFile); if (retnbr) sbuff.append(buff, retnbr); p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); } } #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif float t = t1.tv_sec - t0.tv_sec + (t1.tv_nsec - t0.tv_nsec)/1e9; if (!feof(adiFile)) snprintf(szmsg, sizeof(szmsg), "\ ================================================\n\ ERROR reading logbook %s\n\ read %d records in %4.1f seconds\n\ ================================================\n", fname, db->nbrRecs(), t); else { snprintf(szmsg, sizeof(szmsg), "\ ================================================\n\ Read Logbook: %s\n\ read %d records in %4.1f seconds\n\ ================================================\n", fname, db->nbrRecs(), t); LOG_INFO("logfile: %s, read %d records in %4.1f seconds", fname, db->nbrRecs(), t); if (num_read_errors) { if (!read_errors.empty()) { read_errors.append("\n"); read_errors.append(szmsg); } else read_errors.assign(szmsg); snprintf(szmsg, sizeof(szmsg), "Corrected %d errors. Save logbook and then reload\n", num_read_errors); read_errors.append("\ ================================================\n").append(szmsg); read_errors.append("\ ================================================\n"); if (db == &qsodb) REQ(write_rxtext, read_errors.c_str()); } else if (progdefaults.DisplayLogbookRead && (db == &qsodb)) REQ(write_rxtext, szmsg); } if (db == &qsodb) REQ(adif_read_OK); fclose(adiFile); } static const char *adifmt = "<%s:%d>"; // write ALL or SELECTED records to the designated file int cAdifIO::writeFile (const char *fname, cQsoDb *db) { string ADIFHEADER; ADIFHEADER = "File: %s"; ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append(""); ADIFHEADER.append(szEOL); // open the adif file cQsoRec *rec; string sFld; adiFile = fl_fopen (fname, "wb"); if (!adiFile) return 1; fprintf (adiFile, ADIFHEADER.c_str(), fl_filename_name(fname), strlen(ADIF_VERS), ADIF_VERS, strlen(PACKAGE_NAME), PACKAGE_NAME, strlen(PACKAGE_VERSION), PACKAGE_VERSION); string sName; int field_type; for (int i = 0; i < db->nbrRecs(); i++) { rec = db->getRec(i); if (rec->getField(EXPORT)[0] == 'E') { int j = 0; while (fields[j].type != NUMFIELDS) { if (strcmp(fields[j].name,"MYXCHG") == 0) { j++; continue; } if (strcmp(fields[j].name,"XCHG1") == 0) { j++; continue; } if (fields[j].btn != NULL) { if ((*fields[j].btn)->value()) { field_type = fields[j].type; sFld = rec->getField(field_type); sName = fields[j].name; if (field_type == ADIF_MODE && !sFld.empty()) { fprintf(adiFile, adifmt, "MODE", adif2export(sFld).length()); fprintf(adiFile, "%s", adif2export(sFld).c_str()); if (!adif2submode(sFld).empty()) { fprintf(adiFile, adifmt, "SUBMODE", adif2submode(sFld).length()); fprintf(adiFile, "%s", adif2submode(sFld).c_str()); } } else { if (!sFld.empty()) { fprintf(adiFile, adifmt, sName.c_str(), sFld.length()); fprintf(adiFile, "%s", sFld.c_str()); } } } } j++; } rec->putField(EXPORT,""); db->qsoUpdRec(i, rec); fprintf(adiFile, "%s", szEOR); fprintf(adiFile, "%s", szEOL); } } fclose (adiFile); return 0; } // write ALL records to the common log //====================================================================== // thread support writing database //====================================================================== pthread_t* ADIF_RW_thread = 0; pthread_mutex_t ADIF_RW_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t ADIF_RW_cond = PTHREAD_COND_INITIALIZER; static void ADIF_RW_init(); static string adif_file_image; static string adif_file_name; static string records; static string record; static char recfield[200]; static int nrecs; static bool ADIF_READ = false; static bool ADIF_WRITE = false; static cQsoDb *adif_db; static cAdifIO *adifIO = 0; void cAdifIO::readFile (const char *fname, cQsoDb *db) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) ADIF_RW_init(); pthread_mutex_lock(&ADIF_RW_mutex); adif_file_name = fname; adif_db = db; adifIO = this; ADIF_READ = true; pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); } static cQsoDb *adifdb = 0; static cQsoDb *wrdb = 0; static struct timespec t0, t1; std::string cAdifIO::adif_record(cQsoRec *rec) { static std::string record; static std::string sFld; record.clear(); for (int j = 0; fields[j].type != NUMFIELDS; j++) { if (strcmp(fields[j].name,"MYXCHG") == 0) continue; if (strcmp(fields[j].name,"XCHG1") == 0) continue; sFld = rec->getField(fields[j].type); if (!sFld.empty()) { snprintf(recfield, sizeof(recfield), adifmt, fields[j].name, sFld.length()); record.append(recfield).append(sFld); } } record.append(szEOR); record.append(szEOL); return record; } int cAdifIO::writeAdifRec (cQsoRec *rec, const char *fname) { std::string strRecord = adif_record(rec); FILE *adiFile = fl_fopen (fname, "ab"); if (!adiFile) { LOG_ERROR("Cannot write to %s", fname); return 1; } LOG_INFO("Write record to %s", fname); fprintf (adiFile, "%s", strRecord.c_str()); fclose (adiFile); return 0; } int cAdifIO::writeLog (const char *fname, cQsoDb *db, bool immediate) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) ADIF_RW_init(); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif if (!immediate) { pthread_mutex_lock(&ADIF_RW_mutex); adif_file_name = fname; adifIO = this; ADIF_WRITE = true; if (wrdb) delete wrdb; wrdb = new cQsoDb(db); adifdb = wrdb; pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); } else { adif_file_name = fname; adifdb = db; do_writelog(); } return 1; } void cAdifIO::do_writelog() { string ADIFHEADER; ADIFHEADER = "File: %s"; ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append(""); ADIFHEADER.append(szEOL); adiFile = fl_fopen (adif_file_name.c_str(), "wb"); if (!adiFile) { LOG_ERROR("Cannot write to %s", adif_file_name.c_str()); if (wrdb) delete wrdb; return; } LOG_INFO("Writing %s", adif_file_name.c_str()); cQsoRec *rec; records.clear(); for (int i = 0; i < adifdb->nbrRecs(); i++) { rec = adifdb->getRec(i); records.append(adif_record(rec)); if (wrdb) adifdb->qsoUpdRec(i, rec); } nrecs = adifdb->nbrRecs(); fprintf (adiFile, ADIFHEADER.c_str(), fl_filename_name(adif_file_name.c_str()), strlen(ADIF_VERS), ADIF_VERS, strlen(PACKAGE_NAME), PACKAGE_NAME, strlen(PACKAGE_VERSION), PACKAGE_VERSION ); fprintf (adiFile, "%s", records.c_str()); fclose (adiFile); if (wrdb) delete wrdb; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif t0 = t1 - t0; float t = (t0.tv_sec + t0.tv_nsec/1e9); static char szmsg[50]; snprintf(szmsg, sizeof(szmsg), "%d records in %4.2f seconds", adifdb->nbrRecs(), t); LOG_INFO("%s", szmsg); snprintf(szmsg, sizeof(szmsg), "Wrote log %d recs", adifdb->nbrRecs()); put_status(szmsg, 5.0); return; } //====================================================================== // thread to support writing database in a separate thread //====================================================================== static void *ADIF_RW_loop(void *args); static bool ADIF_RW_EXIT = false; static void *ADIF_RW_loop(void *args) { SET_THREAD_ID(ADIF_RW_TID); for (;;) { pthread_mutex_lock(&ADIF_RW_mutex); pthread_cond_wait(&ADIF_RW_cond, &ADIF_RW_mutex); pthread_mutex_unlock(&ADIF_RW_mutex); if (ADIF_RW_EXIT) return NULL; if (ADIF_WRITE && adifIO) { adifIO->do_writelog(); ADIF_WRITE = false; } else if (ADIF_READ && adifIO) { adifIO->do_readfile(adif_file_name.c_str(), adif_db); ADIF_READ = false; } } return NULL; } void ADIF_RW_close(void) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) return; pthread_mutex_lock(&ADIF_RW_mutex); ADIF_RW_EXIT = true; LOG_INFO("%s", "Exiting ADIF_RW_thread"); pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); pthread_join(*ADIF_RW_thread, NULL); delete ADIF_RW_thread; ADIF_RW_thread = 0; LOG_INFO("%s", "ADIF_RW_thread closed"); } static void ADIF_RW_init() { ENSURE_THREAD(FLMAIN_TID); if (ADIF_RW_thread) return; ADIF_RW_thread = new pthread_t; ADIF_RW_EXIT = false; if (pthread_create(ADIF_RW_thread, NULL, ADIF_RW_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } fldigi-4.1.06/src/Makefile.am0000664000175000017500000006532713507401434012624 00000000000000## Copyright (C) 2007-2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # Copyright (c) 2008 Dave Freese, W1HKJ (w1hkj AT w1hkj DOT com) # Copyright (c) 2012 Remi Chateauneu, F4ECW (remi dot chateauneu AT gmail DOT com) # License: GPLv3+: GNU GPL version 3 or later. bin_PROGRAMS = SUBDIRS = if WANT_FLDIGI bin_PROGRAMS += fldigi endif if WANT_FLARQ bin_PROGRAMS += flarq endif # The BUILD_* variables are defined in build.m4 fldigi_CPPFLAGS = -DBUILD_FLDIGI -DLOCALEDIR=\"$(localedir)\" @FLDIGI_BUILD_CPPFLAGS@ -DPKGDATADIR=\"$(pkgdatadir)\" fldigi_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ fldigi_CFLAGS = @FLDIGI_BUILD_CFLAGS@ fldigi_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ fldigi_LDADD = @FLDIGI_BUILD_LDADD@ flarq_CPPFLAGS = -DBUILD_FLARQ -DLOCALEDIR=\"$(localedir)\" @FLARQ_BUILD_CPPFLAGS@ flarq_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ flarq_CFLAGS = $(fldigi_CFLAGS) flarq_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ flarq_LDADD = @FLARQ_BUILD_LDADD@ if WIN32 fldigi_CPPFLAGS += -fno-var-tracking fldigi_CXXFLAGS += -fno-var-tracking endif HAMLIB_SRC = \ include/hamlib.h \ rigcontrol/hamlib.cxx \ include/rigclass.h \ rigcontrol/rigclass.cxx XMLRPC_SRC = \ include/xmlrpc.h \ network/xmlrpc.cxx FLDIGI_WIN32_RES_SRC = fldigirc.rc FLARQ_WIN32_RES_SRC = flarq-src/flarqrc.rc COMMON_WIN32_RES_SRC = common.rc BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx REGEX_SRC = compat/regex.h compat/regex.c STACK_SRC = include/stack.h misc/stack.cxx MINGW32_SRC = include/compat.h compat/getsysinfo.c compat/mingw.c compat/mingw.h NLS_SRC = misc/nls.cxx include/nls.h # We distribute these but do not always compile them # Build the xmlrpcpp source if libflxmlrpc is not found XMLRPCPP_SRC = \ xmlrpcpp/XmlRpcBase64.h \ xmlrpcpp/XmlRpcClient.cpp \ xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp \ xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h \ xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h \ xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h \ xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h \ xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h \ xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h \ xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h \ xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h \ xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h # Build the libmbedtls source if libmbedtls is not found LIBMBEDTLS_SRC = \ mbedtls/aes.c \ mbedtls/aesni.c \ mbedtls/arc4.c \ mbedtls/aria.c \ mbedtls/asn1parse.c \ mbedtls/asn1write.c \ mbedtls/base64.c \ mbedtls/bignum.c \ mbedtls/blowfish.c \ mbedtls/camellia.c \ mbedtls/ccm.c \ mbedtls/certs.c \ mbedtls/chacha20.c \ mbedtls/chachapoly.c \ mbedtls/cipher.c \ mbedtls/cipher_wrap.c \ mbedtls/cmac.c \ mbedtls/ctr_drbg.c \ mbedtls/debug.c \ mbedtls/des.c \ mbedtls/dhm.c \ mbedtls/ecdh.c \ mbedtls/ecdsa.c \ mbedtls/ecjpake.c \ mbedtls/ecp.c \ mbedtls/ecp_curves.c \ mbedtls/entropy.c \ mbedtls/entropy_poll.c \ mbedtls/error.c \ mbedtls/gcm.c \ mbedtls/havege.c \ mbedtls/hkdf.c \ mbedtls/hmac_drbg.c \ mbedtls/md2.c \ mbedtls/md4.c \ mbedtls/md5.c \ mbedtls/md.c \ mbedtls/md_wrap.c \ mbedtls/memory_buffer_alloc.c \ mbedtls/net_sockets.c \ mbedtls/nist_kw.c \ mbedtls/oid.c \ mbedtls/padlock.c \ mbedtls/pem.c \ mbedtls/pk.c \ mbedtls/pkcs11.c \ mbedtls/pkcs12.c \ mbedtls/pkcs5.c \ mbedtls/pkparse.c \ mbedtls/pk_wrap.c \ mbedtls/pkwrite.c \ mbedtls/platform.c \ mbedtls/platform_util.c \ mbedtls/poly1305.c \ mbedtls/ripemd160.c \ mbedtls/rsa.c \ mbedtls/rsa_internal.c \ mbedtls/sha1.c \ mbedtls/sha256.c \ mbedtls/sha512.c \ mbedtls/ssl_cache.c \ mbedtls/ssl_ciphersuites.c \ mbedtls/ssl_cli.c \ mbedtls/ssl_cookie.c \ mbedtls/ssl_srv.c \ mbedtls/ssl_ticket.c \ mbedtls/ssl_tls.c \ mbedtls/threading.c \ mbedtls/timing.c \ mbedtls/version.c \ mbedtls/version_features.c \ mbedtls/x509.c \ mbedtls/x509_create.c \ mbedtls/x509_crl.c \ mbedtls/x509_crt.c \ mbedtls/x509_csr.c \ mbedtls/x509write_crt.c \ mbedtls/x509write_csr.c \ mbedtls/xtea.c \ include/mbedtls/aes.h \ include/mbedtls/aesni.h \ include/mbedtls/arc4.h \ include/mbedtls/aria.h \ include/mbedtls/asn1.h \ include/mbedtls/asn1write.h \ include/mbedtls/base64.h \ include/mbedtls/bignum.h \ include/mbedtls/blowfish.h \ include/mbedtls/bn_mul.h \ include/mbedtls/camellia.h \ include/mbedtls/ccm.h \ include/mbedtls/certs.h \ include/mbedtls/chacha20.h \ include/mbedtls/chachapoly.h \ include/mbedtls/check_config.h \ include/mbedtls/cipher.h \ include/mbedtls/cipher_internal.h \ include/mbedtls/cmac.h \ include/mbedtls/compat-1.3.h \ include/mbedtls/config.h \ include/mbedtls/ctr_drbg.h \ include/mbedtls/debug.h \ include/mbedtls/des.h \ include/mbedtls/dhm.h \ include/mbedtls/ecdh.h \ include/mbedtls/ecdsa.h \ include/mbedtls/ecjpake.h \ include/mbedtls/ecp.h \ include/mbedtls/ecp_internal.h \ include/mbedtls/entropy.h \ include/mbedtls/entropy_poll.h \ include/mbedtls/error.h \ include/mbedtls/gcm.h \ include/mbedtls/havege.h \ include/mbedtls/hkdf.h \ include/mbedtls/hmac_drbg.h \ include/mbedtls/md2.h \ include/mbedtls/md4.h \ include/mbedtls/md5.h \ include/mbedtls/md.h \ include/mbedtls/md_internal.h \ include/mbedtls/memory_buffer_alloc.h \ include/mbedtls/net.h \ include/mbedtls/net_sockets.h \ include/mbedtls/nist_kw.h \ include/mbedtls/oid.h \ include/mbedtls/padlock.h \ include/mbedtls/pem.h \ include/mbedtls/pkcs11.h \ include/mbedtls/pkcs12.h \ include/mbedtls/pkcs5.h \ include/mbedtls/pk.h \ include/mbedtls/pk_internal.h \ include/mbedtls/platform.h \ include/mbedtls/platform_time.h \ include/mbedtls/platform_util.h \ include/mbedtls/poly1305.h \ include/mbedtls/ripemd160.h \ include/mbedtls/rsa.h \ include/mbedtls/rsa_internal.h \ include/mbedtls/sha1.h \ include/mbedtls/sha256.h \ include/mbedtls/sha512.h \ include/mbedtls/ssl_cache.h \ include/mbedtls/ssl_ciphersuites.h \ include/mbedtls/ssl_cookie.h \ include/mbedtls/ssl.h \ include/mbedtls/ssl_internal.h \ include/mbedtls/ssl_ticket.h \ include/mbedtls/threading.h \ include/mbedtls/timing.h \ include/mbedtls/version.h \ include/mbedtls/x509_crl.h \ include/mbedtls/x509_crt.h \ include/mbedtls/x509_csr.h \ include/mbedtls/x509.h \ include/mbedtls/xtea.h EXTRA_fldigi_SOURCES = \ $(HAMLIB_SRC) $(XMLRPC_SRC) $(FLDIGI_WIN32_RES_SRC) \ $(COMMON_WIN32_RES_SRC) $(BENCHMARK_SRC) $(REGEX_SRC) $(STACK_SRC) \ $(MINGW32_SRC) $(NLS_SRC) $(XMLRPCPP_SRC) $(LIBMBEDTLS_SRC) EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) $(XMLRPCPP_SRC) fldigi_SOURCES = flarq_SOURCES = fldigi_SOURCES += $(XMLRPC_SRC) if !ENABLE_FLXMLRPC fldigi_SOURCES += $(XMLRPCPP_SRC) flarq_SOURCES += $(XMLRPCPP_SRC) else fldigi_CPPFLAGS += @FLXMLRPC_CFLAGS@ fldigi_CXXFLAGS += @FLXMLRPC_CFLAGS@ fldigi_CFLAGS += @FLXMLRPC_CFLAGS@ fldigi_LDFLAGS += @FLXMLRPC_LIBS@ flarq_CPPFLAGS += @FLXMLRPC_CFLAGS@ flarq_CXXFLAGS += @FLXMLRPC_CFLAGS@ flarq_CFLAGS += @FLXMLRPC_CFLAGS@ flarq_LDFLAGS += @FLXMLRPC_LIBS@ endif if !ENABLE_LIBMBEDTLS fldigi_SOURCES += $(LIBMBEDTLS_SRC) else fldigi_CPPFLAGS += @LIBMBEDTLS_CFLAGS@ fldigi_CXXFLAGS += @LIBMBEDTLS_CFLAGS@ fldigi_CFLAGS += @LIBMBEDTLS_CFLAGS@ fldigi_LDFLAGS += @LIBMBEDTLS_LIBS@ endif if ENABLE_HAMLIB fldigi_SOURCES += $(HAMLIB_SRC) endif if NEED_HAMLIB_LOCATOR fldigi_SOURCES += $(LOCATOR_SRC) endif if ENABLE_BENCHMARK fldigi_SOURCES += $(BENCHMARK_SRC) endif if COMPAT_REGEX fldigi_SOURCES += $(REGEX_SRC) flarq_SOURCES += $(REGEX_SRC) endif if COMPAT_STACK fldigi_SOURCES += $(STACK_SRC) flarq_SOURCES += $(STACK_SRC) endif if MINGW32 fldigi_SOURCES += $(MINGW32_SRC) flarq_SOURCES += $(MINGW32_SRC) endif if USE_NLS fldigi_SOURCES += $(NLS_SRC) flarq_SOURCES += $(NLS_SRC) endif ######################################################################## FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLDIGI_VERSION = @FLDIGI_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLARQ_VERSION = @FLARQ_VERSION@ # Define the custom silent rule function @SILENT_CMDS@ .EXPORT_ALL_VARIABLES: appbundle nsisinst hamlib-static # Sources that are generated, BUILT_SOURCES = # not distributed, nodist_fldigi_SOURCES = $(BUILT_SOURCES) # and deleted by the clean targets CLEANFILES = $(BUILT_SOURCES) CLEAN_LOCAL = if WIN32 if HAVE_WINDRES .rc.o: $(call silent,WRES ,$@)$(WINDRES) -DRC_BUILD_TIME=\\\"$(shell date +%s)\\\" -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/../data/win32 $< -O coff $@ fldigi_SOURCES += $(FLDIGI_WIN32_RES_SRC) flarq_SOURCES += $(FLARQ_WIN32_RES_SRC) endif endif install-exec-local: if WANT_FLDIGI if test -f $(srcdir)/../scripts/ftp_kml_files.sh; then \ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ $(INSTALL_SCRIPT) $(srcdir)/../scripts/ftp_kml_files.sh $(DESTDIR)/$(bindir); \ fi endif # TODO: xpm files should probably go to $(datadir)/pixmaps/fldigi instead of $(datadir)/pixmaps install-data-local: if WANT_FLDIGI if test -f $(srcdir)/../data/fldigi.xpm; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ $(INSTALL_DATA) $(srcdir)/../data/fldigi.xpm $(DESTDIR)/$(datadir)/pixmaps; \ fi if test -f $(srcdir)/../data/fldigi.desktop; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ $(INSTALL_DATA) $(srcdir)/../data/fldigi.desktop $(DESTDIR)/$(datadir)/applications; \ fi if test -f $(srcdir)/../data/NAVTEX_Stations.csv; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/NAVTEX_Stations.csv $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/nsd_bbsss.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/nsd_bbsss.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/station_table.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/station_table.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/ToR-Stats-SHIP.csv; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/ToR-Stats-SHIP.csv $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/wmo_list.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/wmo_list.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../kml/styles.kml; then \ $(mkinstalldirs) $(DESTDIR)/$(pkgdatadir)/kml; \ $(INSTALL_DATA) $(srcdir)/../kml/styles.kml $(DESTDIR)/$(pkgdatadir)/kml; \ fi endif if WANT_FLARQ if test -f $(srcdir)/../data/flarq.xpm; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ $(INSTALL_DATA) $(srcdir)/../data/flarq.xpm $(DESTDIR)/$(datadir)/pixmaps; \ fi if test -f $(srcdir)/../data/flarq.desktop; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ $(INSTALL_DATA) $(srcdir)/../data/flarq.desktop $(DESTDIR)/$(datadir)/applications; \ fi endif uninstall-local: if WANT_FLDIGI rm -f $(DESTDIR)/$(datadir)/pixmaps/fldigi.xpm rm -f $(DESTDIR)/$(datadir)/applications/fldigi.desktop rm -fr $(DESTDIR)/$(datadir)/fldigi endif if WANT_FLARQ rm -f $(DESTDIR)/$(datadir)/pixmaps/flarq.xpm rm -f $(DESTDIR)/$(datadir)/applications/flarq.desktop endif FLDIGI_FL_SRC = \ dialogs/confdialog.fl \ dialogs/notifydialog.fl \ dialogs/record_browse.fl \ dialogs/testsigs.fl \ logbook/lgbook.fl \ logbook/fd_view.fl \ dxcluster/dx_dialog.fl FLARQ_FL_SRC = flarq-src/arqdialogs.fl if HAVE_FLUID flgen: $(FLDIGI_FL_SRC) $(FLARQ_FL_SRC) if WANT_FLDIGI $(call silent,FLUID ,$(FLDIGI_FL_SRC))(cd $(srcdir)/include; \ for f in $(FLDIGI_FL_SRC); do \ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ $(FLUID) -c -o ../$$c -h $$h ../$$f; \ done) endif if WANT_FLARQ $(call silent,FLUID ,$(FLARQ_FL_SRC))(cd $(srcdir)/flarq-src/include; \ for f in $(FLARQ_FL_SRC); do \ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ $(FLUID) -c -o ../../$$c -h $$h ../../$$f; \ done) endif endif if WANT_FLDIGI WANT_FLDIGI = yes INSTALLER_FILE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)_setup.exe APPBUNDLE=$(PACKAGE_TARNAME)-$(PACKAGE_VERSION) APPBUNDLE_NOLIBS=$(APPBUNDLE)-nolibs endif if WANT_FLARQ WANT_FLARQ = yes if !WANT_FLDIGI INSTALLER_FILE = flarq-$(FLARQ_VERSION)_setup.exe APPBUNDLE=flarq-$(FLARQ_VERSION) APPBUNDLE_NOLIBS=$(APPBUNDLE)-nolibs endif endif if DARWIN appbundle: $(bin_PROGRAMS) $(call silent,APPB ,$(APPBUNDLE_NOLIBS) $(APPBUNDLE))sh $(srcdir)/../scripts/mkappbundle.sh "$(srcdir)/../data" . CLEAN_LOCAL += $(APPBUNDLE_NOLIBS) $(APPBUNDLE) $(APPBUNDLE)*.dmg endif if HAVE_NSIS nsisinst: $(bin_PROGRAMS) $(call silent,NSIS ,$(INSTALLER_FILE))sh $(srcdir)/../scripts/mknsisinst.sh "$(srcdir)/../data" . CLEANFILES += $(INSTALLER_FILE) endif if USE_NLS CLEAN_LOCAL += share endif if WANT_FLDIGI if ENABLE_HAMLIB hamlib-static: $(fldigi_OBJECTS) $(call silent,HLS ,fldigi$(EXEEXT))sh $(srcdir)/../scripts/mkhamlibstatic.sh fldigi endif endif tmp_srcdir_var=$(srcdir) TESTS = $(tmp_srcdir_var)/../scripts/tests/config-h.sh $(tmp_srcdir_var)/../scripts/tests/cr.sh if HAVE_ASCIIDOC $(builddir)/../doc/guide.html: $(builddir)/../doc/guide.txt @$(MAKE) -C $(builddir)/../doc $(AM_MAKEFLAGS) guide.html $(builddir)/dialogs/guide.cxx: $(builddir)/../doc/guide.html @mkdir -p $(builddir)/dialogs $(call silent,GUIDE ,$@)sed 's/\\/\\\\/g; s/"/\\"/g; s/$$/\\n\\/g; 1 s/.*/const char* szBeginner = "&/; $$ s/.*/&n";/' $< > $@ dialogs/htmlstrings.cxx: $(builddir)/dialogs/guide.cxx distclean-local: @if test "$(builddir)" != "$(srcdir)"; then \ rm -f $(builddir)/dialogs/guide.cxx; \ fi endif clean-local: -rm -rf $(CLEAN_LOCAL) # Sources that we build. It is OK to have headers here. fldigi_SOURCES += \ combo/combo.cxx \ config_script/create_default_script.cxx \ config_script/run_script.h \ config_script/run_scripts.cxx \ config_script/script_parsing.cxx \ config_script/script_parsing.h \ contestia/contestia.cxx \ cw_rtty/cw.cxx \ cw_rtty/morse.cxx \ cw_rtty/nanoIO.cxx \ cw_rtty/Nav.cxx \ cw_rtty/rtty.cxx \ cw_rtty/view_cw.cxx \ cw_rtty/view_rtty.cxx \ cw_rtty/winkeyer.cxx \ dialogs/confdialog.cxx \ dialogs/fl_digi.cxx \ dialogs/font_browser.cxx \ dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx \ dialogs/record_browse.cxx \ dialogs/testsigs.cxx \ dialogs/tod_clock.cxx \ dialogs/Viewer.cxx \ dominoex/dominoex.cxx \ dominoex/dominovar.cxx \ dtmf/dtmf.cxx \ dxcluster/dxcluster.cxx \ dxcluster/dx_dialog.cxx \ feld/feld.cxx \ feld/feldfonts.cxx \ fft-monitor/fft-monitor.cxx \ fft-monitor/spectrum.cxx \ fft-monitor/spectrum_viewer.cxx \ fileselector/fileselect.cxx \ filters/fftfilt.cxx \ filters/filters.cxx \ filters/viterbi.cxx \ fsq/fsq.cxx \ fsq/fsq_monitor.cxx \ globals/globals.cxx \ ifkp/ifkp.cxx \ ifkp/tux.cxx \ irrxml/CXMLReaderImpl.h \ irrxml/fast_atof.h \ irrxml/heapsort.h \ irrxml/irrArray.h \ irrxml/irrString.h \ irrxml/irrTypes.h \ irrxml/irrXML.cpp \ irrxml/irrXML.h \ libtiniconv/tiniconv.c \ libtiniconv/tiniconv_desc.c \ logbook/adif_io.cxx \ logbook/calendar.cxx \ logbook/contest.cxx \ logbook/counties.cxx \ logbook/county_lists.cxx \ logbook/cty-dat.cxx \ logbook/date.cxx \ logbook/fd_logger.cxx \ logbook/fd_view.cxx \ logbook/lgbook.cxx \ logbook/logbook.cxx \ logbook/logsupport.cxx \ logbook/lookupcall.cxx \ logbook/maclogger.cxx \ logbook/n3fjp_logger.cxx \ logbook/qrzlib.cxx \ logbook/qso_db.cxx \ logbook/table.cxx \ logbook/textio.cxx \ logbook/xmlrpc_log.cxx \ logger/logger.cxx \ logger/rx_extract.cxx \ logger/speak.cxx \ main.cxx \ mfsk/interleave.cxx \ mfsk/mfsk.cxx \ mfsk/mfskvaricode.cxx \ misc/arq_io.cxx \ misc/ascii.cxx \ misc/ax25_decode.cxx \ misc/charsetdistiller.cxx \ misc/charsetlist.cxx \ misc/configuration.cxx \ misc/coordinate.cxx \ misc/debug.cxx \ misc/dxcc.cxx \ misc/estrings.cxx \ misc/icons.cxx \ misc/kiss_io.cxx \ misc/kmlserver.cxx \ misc/locator.cxx \ misc/log.cxx \ misc/macroedit.cxx \ misc/macros.cxx \ misc/misc.cxx \ misc/newinstall.cxx \ misc/outputencoder.cxx \ misc/pixmaps.cxx \ misc/pixmaps_tango.cxx \ misc/record_loader.cxx \ misc/re.cxx \ misc/stacktrace.cxx \ misc/status.cxx \ misc/strutil.cxx \ misc/threads.cxx \ misc/timeops.cxx \ misc/utf8file_io.cxx \ misc/util.cxx \ mt63/dsp.cxx \ mt63/mt63base.cxx \ mt63/mt63.cxx \ navtex/navtex.cxx \ network/ca_cert.cxx \ network/metar.cxx \ network/network.cxx \ network/socket.cxx \ network/weather.cxx \ olivia/olivia.cxx \ psk/pskcoeff.cxx \ psk/psk.cxx \ psk/pskeval.cxx \ psk/pskvaricode.cxx \ psk/viewpsk.cxx \ psm/psm.cxx \ psm/psm.h \ qrunner/fqueue.h \ qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx \ rigcontrol/norig.cxx \ rigcontrol/ptt.cxx \ rigcontrol/rigio.cxx \ rigcontrol/rigsupport.cxx \ rigcontrol/rigxml.cxx \ rigcontrol/serial.cxx \ rigcontrol/xmlrpc_rig.cxx \ rsid/rsid.cxx \ soundcard/audio_alert.cxx \ soundcard/bark.cxx \ soundcard/checkout.cxx \ soundcard/diesel.cxx \ soundcard/dinnerbell.cxx \ soundcard/doesnot.cxx \ soundcard/play.pa.cxx \ soundcard/soundconf.cxx \ soundcard/sound.cxx \ soundcard/steam_train.cxx \ spot/notify.cxx \ spot/pskrep.cxx \ spot/spot.cxx \ ssb/ssb.cxx \ synop-src/synop.cxx \ thor/thor.cxx \ thor/thorvaricode.cxx \ throb/throb.cxx \ trx/modem.cxx \ trx/nullmodem.cxx \ trx/test_signal.cxx \ trx/trx.cxx \ waterfall/colorbox.cxx \ waterfall/digiscope.cxx \ waterfall/raster.cxx \ waterfall/waterfall.cxx \ wefax/wefax.cxx \ wefax/wefax_map.cxx \ wefax/wefax-pic.cxx \ widgets/flinput2.cxx \ widgets/flmisc.cxx \ widgets/flslider2.cxx \ widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextRXTX.cxx \ widgets/FTextView.cxx \ widgets/Panel.cxx \ widgets/picture.cxx \ widgets/progress.cxx \ widgets/psk_browser.cxx \ widgets/pwrmeter.cxx \ widgets/smeter.cxx \ wwv/analysis.cxx \ wwv/wwv.cxx # packet/pkt.cxx # include/pkt.h # Sources that are part of the distribution but are not compiled directly EXTRA_fldigi_SOURCES += \ blank/blank.cxx \ blank/blank.h \ dialogs/fl_digi_main.cxx \ dxcluster/arc-help.cxx \ dxcluster/CCC_Commands.cxx \ dxcluster/DXClusterServers.cxx \ dxcluster/DXSpiderCommandReference.cxx \ fileselector/flnfc_common.cxx \ feld/Feld7x7-14.cxx \ feld/Feld7x7n-14.cxx \ feld/FeldDx-14.cxx \ feld/FeldFat-14.cxx \ feld/FeldHell-12.cxx \ feld/FeldLittle-12.cxx \ feld/FeldLo8-14.cxx \ feld/FeldLow-14.cxx \ feld/FeldModern-14.cxx \ feld/FeldModern8-14.cxx \ feld/FeldNarr-14.cxx \ feld/FeldReal-14.cxx \ feld/FeldStyl-14.cxx \ feld/FeldVert-14.cxx \ feld/FeldWide-14.cxx \ fsq/fsq_varicode.cxx \ include/crc8.h \ include/Fl_Text_Buffer_mod.H \ include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H \ fsq/fsq-pic.cxx \ fsq/bitmaps.cxx \ ifkp/ifkp_bitmaps.cxx \ ifkp/ifkp_varicode.cxx \ ifkp/ifkp-pic.cxx \ mfsk/mfsk-pic.cxx \ mt63/alias_1k.dat \ mt63/alias_2k.dat \ mt63/morse.dat \ mt63/symbol.dat \ mt63/alias_k5.dat \ mt63/mt63intl.dat \ rsid/rsid_defs.cxx \ thor/thor-pic.cxx \ trx/tune.cxx \ dialogs/guide.cxx \ include/adif_def.h \ include/adif_io.h \ include/analysis.h \ include/arq_io.h \ include/ascii.h \ include/audio_alert.h \ include/ax25_decode.h \ include/calendar.h \ include/charsetdistiller.h \ include/charsetlist.h \ include/colorbox.h \ include/combo.h \ include/complex.h \ include/confdialog.h \ include/configuration.h \ include/contest.h \ include/contestia.h \ include/coordinate.h \ include/counties.h \ include/cw.h \ include/data_io.h \ include/date.h \ include/debug.h \ include/digiscope.h \ include/dominoex.h \ include/dominovar.h \ include/dsp.h \ include/dtmf.h \ include/dxcc.h \ include/dx_cluster.h \ include/dx_dialog.h \ include/estrings.h \ include/fd_logger.h \ include/fd_view.h \ include/feld.h \ include/fftfilt.h \ include/fft-monitor.h \ include/field_def.h \ include/fileselect.h \ include/filters.h \ include/fldigi-config.h \ include/fl_digi.h \ include/flinput2.h \ include/fl_lock.h \ include/flmisc.h \ include/flslider2.h \ include/font_browser.h \ include/fontdef.h \ include/FreqControl.h \ include/fsq.h \ include/FTextRXTX.h \ include/FTextView.h \ include/gettext.h \ include/gfft.h \ include/globals.h \ include/htmlstrings.h \ include/https.h \ include/icons.h \ include/ifkp.h \ include/interleave.h \ include/jalocha/pj_cmpx.h \ include/jalocha/pj_fft.h \ include/jalocha/pj_fht.h \ include/jalocha/pj_fifo.h \ include/jalocha/pj_gray.h \ include/jalocha/pj_lowpass3.h \ include/jalocha/pj_mfsk.h \ include/jalocha/pj_struc.h \ include/kiss_io.h \ include/kmlserver.h \ include/lgbook.h \ include/locator.h \ include/logbook.h \ include/logger.h \ include/log.h \ include/logsupport.h \ include/lookupcall.h \ include/maclogger.h \ include/macroedit.h \ include/macros.h \ include/main.h \ include/mbuffer.h \ include/metar.h \ include/mfsk.h \ include/mfskvaricode.h \ include/misc.h \ include/modem.h \ include/morse.h \ include/mt63base.h \ include/mt63.h \ include/n3fjp_logger.h \ include/nanoIO.h \ include/Nav.h \ include/navtex.h \ include/navtex.h \ include/nco.h \ include/network.h \ include/newinstall.h \ include/notifydialog.h \ include/notify.h \ include/nullmodem.h \ include/olivia.h \ include/outputencoder.h \ include/Panel.h \ include/picture.h \ include/pixmaps.h \ include/pkg.h \ include/play.pa.h \ include/progress.h \ include/psk_browser.h \ include/pskcoeff.h \ include/pskeval.h \ include/psk.h \ include/pskrep.h \ include/pskvaricode.h \ include/ptt.h \ include/pwrmeter.h \ include/qrunner.h \ include/qrzlib.h \ include/qso_db.h \ include/raster.h \ include/record_browse.h \ include/record_loader_gui.h \ include/record_loader.h \ include/re.h \ include/rigCAT.h \ include/rigio.h \ include/rigsupport.h \ include/rigxml.h \ include/ringbuffer.h \ include/rsid.h \ include/rtty.h \ include/rx_extract.h \ include/serial.h \ include/smeter.h \ include/socket.h \ include/soundconf.h \ include/sound.h \ include/speak.h \ include/spectrum.h \ include/spectrum_viewer.h \ include/spot.h \ include/ssb.h \ include/stacktrace.h \ include/status.h \ include/strutil.h \ include/synop.h \ include/table.h \ include/testmodem.h \ include/test_signal.h \ include/testsigs.h \ include/textio.h \ include/thor.h \ include/thorvaricode.h \ include/threads.h \ include/throb.h \ include/timeops.h \ include/trx.h \ include/utf8file_io.h \ include/util.h \ include/view_cw.h \ include/Viewer.h \ include/viewpsk.h \ include/view_rtty.h \ include/viterbi.h \ include/waterfall.h \ include/weather.h \ include/wefax.h \ include/wefax_map.h \ include/wefax-pic.h \ include/winkeyer.h \ include/wwv.h \ include/xmlreader.h \ libtiniconv/tiniconv.h \ libtiniconv/tiniconv_int.h \ libtiniconv/encdec/ascii.h \ libtiniconv/encdec/big5.h \ libtiniconv/encdec/ces_big5.h \ libtiniconv/encdec/ces_gbk.h \ libtiniconv/encdec/cp1250.h \ libtiniconv/encdec/cp1251.h \ libtiniconv/encdec/cp1252.h \ libtiniconv/encdec/cp1253.h \ libtiniconv/encdec/cp1254.h \ libtiniconv/encdec/cp1255.h \ libtiniconv/encdec/cp1256.h \ libtiniconv/encdec/cp1257.h \ libtiniconv/encdec/cp1258.h \ libtiniconv/encdec/cp866.h \ libtiniconv/encdec/cp936ext.h \ libtiniconv/encdec/cp936.h \ libtiniconv/encdec/euc_cn.h \ libtiniconv/encdec/flushwc.h \ libtiniconv/encdec/gb2312.h \ libtiniconv/encdec/gbkext1.h \ libtiniconv/encdec/gbkext2.h \ libtiniconv/encdec/gbkext_inv.h \ libtiniconv/encdec/gbk.h \ libtiniconv/encdec/iso2022_jp.h \ libtiniconv/encdec/iso8859_10.h \ libtiniconv/encdec/iso8859_11.h \ libtiniconv/encdec/iso8859_13.h \ libtiniconv/encdec/iso8859_14.h \ libtiniconv/encdec/iso8859_15.h \ libtiniconv/encdec/iso8859_16.h \ libtiniconv/encdec/iso8859_1.h \ libtiniconv/encdec/iso8859_2.h \ libtiniconv/encdec/iso8859_3.h \ libtiniconv/encdec/iso8859_4.h \ libtiniconv/encdec/iso8859_5.h \ libtiniconv/encdec/iso8859_6.h \ libtiniconv/encdec/iso8859_7.h \ libtiniconv/encdec/iso8859_8.h \ libtiniconv/encdec/iso8859_9.h \ libtiniconv/encdec/jisx0201.h \ libtiniconv/encdec/jisx0208.h \ libtiniconv/encdec/koi8_r.h \ libtiniconv/encdec/koi8_ru.h \ libtiniconv/encdec/koi8_u.h \ libtiniconv/encdec/mac_cyrillic.h \ libtiniconv/encdec/ucs2.h \ libtiniconv/encdec/utf7.h \ libtiniconv/encdec/utf8.h \ libtiniconv/encdec/vietcomb.h flarq_SOURCES += \ dialogs/font_browser.cxx \ flarq-src/arq.cxx \ flarq-src/arqdialogs.cxx \ flarq-src/arqhelp.cxx \ flarq-src/b64.cxx \ flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx \ flarq-src/xml_server.cxx \ flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h \ flarq-src/include/b64.h \ flarq-src/include/flarq.h \ flarq-src/include/flarqenv.h \ flarq-src/include/xml_server.h \ include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H \ include/FTextView.h \ include/debug.h \ include/fileselect.h \ include/flinput2.h \ include/flmisc.h \ include/flslider2.h \ include/font_browser.h \ include/icons.h \ include/pixmaps.h \ include/re.h \ include/socket.h \ include/stacktrace.h \ include/threads.h \ include/table.h \ include/util.h \ combo/combo.cxx \ fileselector/fileselect.cxx \ logbook/table.cxx \ misc/ascii.cxx \ misc/debug.cxx \ misc/stacktrace.cxx \ misc/threads.cxx \ misc/timeops.cxx \ network/socket.cxx \ widgets/flinput2.cxx \ widgets/flmisc.cxx \ widgets/flslider2.cxx \ misc/icons.cxx \ misc/pixmaps.cxx \ misc/pixmaps_tango.cxx \ misc/re.cxx \ misc/util.cxx \ widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx # Additional files that we distribute EXTRA_DIST = \ $(srcdir)/../build-aux/config.rpath \ $(srcdir)/../scripts/mkappbundle.sh \ $(srcdir)/../scripts/mkhamlibstatic.sh \ $(srcdir)/../scripts/mknsisinst.sh \ $(srcdir)/../scripts/buildmxe.sh \ $(srcdir)/../scripts/builddist.sh \ $(srcdir)/../scripts/tests/cr.sh \ $(srcdir)/../scripts/tests/config-h.sh \ $(srcdir)/../data/fldigi-psk.png \ $(srcdir)/../data/fldigi-rtty.png \ $(srcdir)/../data/fldigi.xpm \ $(srcdir)/../data/fldigi.desktop \ $(srcdir)/../data/NAVTEX_Stations.csv \ $(srcdir)/../data/nsd_bbsss.txt \ $(srcdir)/../data/station_table.txt \ $(srcdir)/../data/ToR-Stats-SHIP.csv \ $(srcdir)/../data/mac/Info.plist.in \ $(srcdir)/../data/mac/fldigi.icns \ $(srcdir)/../data/win32/fldigi.ico \ $(srcdir)/../data/win32/fldigi.nsi \ $(srcdir)/../data/flarq.desktop \ $(srcdir)/../data/flarq.xpm \ $(srcdir)/../data/mac/flarq.icns \ $(srcdir)/../data/win32/flarq.ico \ $(srcdir)/mbedtls/libmbedtls.pc \ $(srcdir)/mbedtls/LICENSE \ $(srcdir)/mbedtls/gpl-2.0.txt \ $(srcdir)/synop-src/synop_tool.cxx \ $(srcdir)/synop-src/README \ $(srcdir)/synop-src/Makefile \ $(FLDIGI_FL_SRC) \ $(FLARQ_FL_SRC) fldigi-4.1.06/src/compat/0000775000175000017500000000000013515625026012122 500000000000000fldigi-4.1.06/src/compat/mingw.c0000644000175000017500000001465613472115775013350 00000000000000// ---------------------------------------------------------------------------- // mingw.c // // The following routines were copied from git-1.6.1.2/compat/mingw.c: // sleep mingw_getcwd mingw_getenv mingw_rename // // The uname routine was adapted from libgw32c 0.4. // // The rest: // Copyright (C) 2009 // Stelios Bounanos, M0GLD // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include "compat.h" /* default mode for stdin, stdout and stderr */ unsigned int _CRT_fmode = _O_BINARY; unsigned sleep(unsigned seconds) { Sleep(seconds*1000); return 0; } #undef getcwd char *mingw_getcwd(char *pointer, int len) { int i; char *ret = getcwd(pointer, len); if (!ret) return ret; for (i = 0; pointer[i]; i++) if (pointer[i] == '\\') pointer[i] = '/'; return ret; } #undef getenv char *mingw_getenv(const char *name) { char *result = getenv(name); if (!result && !strcmp(name, "TMPDIR")) { /* on Windows it is TMP and TEMP */ result = getenv("TMP"); if (!result) result = getenv("TEMP"); } return result; } #undef rename int mingw_rename(const char *pold, const char *pnew) { DWORD attrs; /* * Try native rename() first to get errno right. * It is based on MoveFile(), which cannot overwrite existing files. */ if (!rename(pold, pnew)) return 0; if (errno != EEXIST) return -1; if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; /* TODO: translate more errors */ if (GetLastError() == ERROR_ACCESS_DENIED && (attrs = GetFileAttributes(pnew)) != INVALID_FILE_ATTRIBUTES) { if (attrs & FILE_ATTRIBUTE_DIRECTORY) { errno = EISDIR; return -1; } if ((attrs & FILE_ATTRIBUTE_READONLY) && SetFileAttributes(pnew, attrs & ~FILE_ATTRIBUTE_READONLY)) { if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; /* revert file attributes on failure */ SetFileAttributes(pnew, attrs); } } errno = EACCES; return -1; } /******************************************************************************/ __attribute__((constructor)) static void wsa_init(void) { static WSADATA wsaData; static int wsa_init_ = 0; if (wsa_init_) return; wsa_init_ = 1; if (WSAStartup(MAKEWORD(WSA_MAJOR, WSA_MINOR), &wsaData)) { fprintf(stderr, "unable to initialize winsock: error %d", WSAGetLastError()); exit(EXIT_FAILURE); } atexit((void(*)(void)) WSACleanup); } int socketpair(int family, int type, int protocol, int *sv) { struct sockaddr_in addr; SOCKET sfd; int err, len = sizeof(addr); if (sv == NULL || family != AF_INET || type != SOCK_STREAM || protocol) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } sv[0] = sv[1] = INVALID_SOCKET; if ((sfd = socket(family, type, 0)) == INVALID_SOCKET) return SOCKET_ERROR; memset(&addr, 0, sizeof(addr)); addr.sin_family = family; addr.sin_addr.s_addr = inet_addr("127.0.0.1"); addr.sin_port = 0; /* any port */ if ((err = bind(sfd, (const struct sockaddr*)&addr, sizeof(addr))) == SOCKET_ERROR) { err = WSAGetLastError(); closesocket(sfd); WSASetLastError(err); return SOCKET_ERROR; } if ((err = getsockname(sfd, (struct sockaddr*)&addr, &len)) == SOCKET_ERROR) { err = WSAGetLastError(); closesocket(sfd); WSASetLastError(err); return SOCKET_ERROR; } do { if (listen(sfd, 1) == SOCKET_ERROR) break; if ((sv[0] = WSASocket(family, type, 0, NULL, 0, 0)) == INVALID_SOCKET) break; if (connect(sv[0], (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) break; if ((sv[1] = accept(sfd, NULL, NULL)) == INVALID_SOCKET) break; closesocket(sfd); return 0; } while (0); /* error */ err = WSAGetLastError(); closesocket(sfd); closesocket(sv[0]); closesocket(sv[1]); WSASetLastError(err); return SOCKET_ERROR; } /******************************************************************************/ int nanosleep(const struct timespec *req, struct timespec *rem) { if (unlikely(req->tv_nsec < 0 || req->tv_nsec < 0L || req->tv_nsec > 999999999L)) { errno = EINVAL; return -1; } Sleep(req->tv_sec * 1000 + req->tv_nsec / 1000000L); if (unlikely(rem)) { rem->tv_sec = 0; rem->tv_nsec = 0L; } return 0; } BOOL GetOsInfo(LPSTR OsName, LPSTR Release, LPSTR Version); BOOL GetMachInfo(LPSTR MachineName, LPSTR ProcessorName); int uname(struct utsname *name) { char processor[1024]; if (name == NULL) { errno = EINVAL; return -1; } if (gethostname(name->nodename, sizeof(name->nodename)) < 0) { name->nodename[0] = '\0'; errno = ENOSYS; return -1; } if (!GetOsInfo(name->sysname, name->release, name->version)) { strncpy (name->sysname, "win32", sizeof (name->sysname)); strncpy (name->release, "unknown", sizeof (name->release)); strncpy (name->version, "unknown", sizeof (name->version)); } /* "windows32" is as yet the only universal windows description allowed by config.guess and config.sub */ strncpy(name->sysname, "windows32", sizeof (name->sysname)); if (!GetMachInfo(name->machine, processor)) strncpy(name->machine, "i386", sizeof (name->machine)); return 0; } int getrusage(int who, struct rusage *usage) { FILETIME ct, et, kt, ut; ULARGE_INTEGER uli; if (who != RUSAGE_SELF) { errno = EINVAL; return -1; } if (!usage) { errno = EFAULT; return -1; } if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) { errno = ENOENT; return -1; } // FILETIMEs use 100-ns units memcpy(&uli, &kt, sizeof(FILETIME)); usage->ru_stime.tv_sec = uli.QuadPart / 10000000L; usage->ru_stime.tv_usec = uli.QuadPart % 10000000L; memcpy(&uli, &ut, sizeof(FILETIME)); usage->ru_utime.tv_sec = uli.QuadPart / 10000000L; usage->ru_utime.tv_usec = uli.QuadPart % 10000000L; return 0; } fldigi-4.1.06/src/compat/getsysinfo.c0000644000175000017500000002630313472115775014411 00000000000000/* Adapted from libgw32c-0.4 */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #define BUFSIZE 80 #define VIDSIZE 13 static const char * vid_cyrix = "CyrixInstead"; static const char * vid_centaur = "CentaurHauls"; static const char * vid_rise = "RiseRiseRise"; static const char * vid_intel = "GenuineIntel"; static const char * vid_amd = "AuthenticAMD"; static const char * vid_tmx86 = "GenuineTMx86"; static const char * vid_geode = "Geode by NSC"; static const char * vid_umc = "UMC UMC UMC "; static const char * vid_amd2 = "AMD ISBETTER"; static const char * vid_amd3 = "DEI "; static const char * vid_amd4 = "NexGenerationAMD"; static const char * vid_nexgen = "NexGenDriven"; #define cpuid(op,a,b,c,d)\ __asm__("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (op)); static void GetVendorID (char *vid) { unsigned long MaxEax, ebx, ecx, edx, zerobyte; cpuid (0, MaxEax, ebx, ecx, edx); memcpy (vid, &ebx, 4); memcpy (vid+4, &edx, 4); memcpy (vid+8, &ecx, 4); zerobyte = 0; memcpy (vid+12, &zerobyte, 1); } BOOL GetMachInfo(LPSTR MachineName, LPSTR ProcessorName) { SYSTEM_INFO sysinf; int family; char VendorId [VIDSIZE+2]; ZeroMemory(&sysinf, sizeof(SYSTEM_INFO)); GetSystemInfo(&sysinf); family = sysinf.wProcessorLevel; switch (sysinf.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_UNKNOWN: strcpy(MachineName, "unknown"); break; case PROCESSOR_ARCHITECTURE_INTEL: strcpy(MachineName, "ix86"); break; case PROCESSOR_ARCHITECTURE_MIPS: strcpy(MachineName, "mips"); break; case PROCESSOR_ARCHITECTURE_ALPHA: strcpy(MachineName, "alpha"); break; case PROCESSOR_ARCHITECTURE_PPC: strcpy(MachineName, "ppc"); break; case PROCESSOR_ARCHITECTURE_IA64: strcpy(MachineName, "IA64"); break; case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: strcpy(MachineName, "IA32 on Win64"); break; case PROCESSOR_ARCHITECTURE_AMD64: strcpy(MachineName, "amd64"); break; case PROCESSOR_ARCHITECTURE_SHX: strcpy(MachineName, "sh"); break; case PROCESSOR_ARCHITECTURE_ARM: strcpy(MachineName, "arm"); break; case PROCESSOR_ARCHITECTURE_ALPHA64: strcpy(MachineName, "alpha64"); break; case PROCESSOR_ARCHITECTURE_MSIL: strcpy(MachineName, "msil"); break; default: strcpy(MachineName, "unknown"); break; } if (sysinf.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) switch(family) { case 3: strcpy(MachineName, "i386"); break; case 4: strcpy(MachineName, "i486"); break; case 5: strcpy(MachineName, "i586"); break; case 6: strcpy(MachineName, "i686"); break; case 7: strcpy(MachineName, "i786"); break; case 15: strcpy(MachineName, "i786"); break; default: strcpy(MachineName, "ix86"); } GetVendorID(VendorId); if (!strcmp(VendorId, vid_cyrix)) strcpy(ProcessorName, "Cyrix"); else if (!strcmp(VendorId, vid_centaur)) strcpy(ProcessorName, "Centaur"); else if (!strcmp(VendorId, vid_rise)) strcpy(ProcessorName, "Rise"); else if (!strcmp(VendorId, vid_intel)) strcpy(ProcessorName, "Intel"); else if (!strcmp(VendorId, vid_amd)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_tmx86)) strcpy(ProcessorName, "Transmeta"); else if (!strcmp(VendorId, vid_geode)) strcpy(ProcessorName, "Geode"); else if (!strcmp(VendorId, vid_umc)) strcpy(ProcessorName, "UMC"); else if (!strcmp(VendorId, vid_amd2)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_amd3)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_amd4)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_nexgen)) strcpy(ProcessorName, "NexGen"); else strcpy(ProcessorName, "Unknown"); return TRUE; } /* Platform SDK: Windows System Information Adapted from: http://msdn.microsoft.com/library/en-us/sysinfo/base/getting_the_system_version.asp http://www.codeproject.com/system/winvertable.asp Getting the System Version The following example uses the GetVersionEx function to display the version of the currently running operating system. Relying on version information is not the best way to test for a feature. Instead, refer to the documentation for the feature of interest. For more information on common techniques for feature detection, see Operating System Version. If you must require a particular operating system, be sure to use it as a minimum supported version, rather than design the test for the one operating system. This way, your detection code will continue to work on future versions of Windows. */ #undef BUFSIZE #define BUFSIZE 255 BOOL GetOsInfo(LPSTR OsName, LPSTR Release, LPSTR Version) { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; DWORD BuildNumber; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((LPOSVERSIONINFO) &osvi)) ) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (LPOSVERSIONINFO) &osvi) ) return FALSE; } BuildNumber = osvi.dwBuildNumber & 0xFFFF; switch (osvi.dwPlatformId) { // Tests for Windows NT product family. case VER_PLATFORM_WIN32_NT: // Test for the product. if ( osvi.dwMajorVersion == 3 && osvi.dwMinorVersion == 51 ) strcpy(OsName, "Microsoft Windows NT 3.51"); else if ( osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows NT 4.0"); else if ( osvi.dwMajorVersion <= 4 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows NT"); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) strcpy(OsName, "Microsoft Windows Server 2003 family, "); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) strcpy(OsName, "Microsoft Windows XP"); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows 2000"); if( bOsVersionInfoEx ) { // Use information from GetVersionEx. // Test for the workstation type. if ( osvi.wProductType == VER_NT_WORKSTATION ) { if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) strcat(OsName, " Home Edition" ); else strcat(OsName, " Professional" ); } // Test for the server type. else if ( osvi.wProductType == VER_NT_SERVER) { if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) strcat(OsName, " Datacenter Edition" ); else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) if( osvi.dwMajorVersion == 4 ) strcat(OsName, " Advanced Server" ); else strcat(OsName, " Enterprise Edition" ); else if ( osvi.wSuiteMask == VER_SUITE_BLADE ) strcat(OsName, " Web Edition" ); else strcat(OsName, " Standard Edition" ); } else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) strcat(OsName, " Datacenter Server" ); else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) strcat(OsName, " Advanced Server" ); else strcat(OsName, " Server" ); } else // Windows NT 4.0 { if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) strcat(OsName, "Server 4.0, Enterprise Edition "); else strcat(OsName, "Server 4.0 " ); } } else { // Use the registry on early versions of Windows NT. HKEY hKey; char szProductType[BUFSIZE]; DWORD dwBufLen=BUFSIZE; LONG lRet; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey ); if( lRet != ERROR_SUCCESS ) return FALSE; lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen); if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) ) return FALSE; RegCloseKey( hKey ); if ( lstrcmpi( "WINNT", szProductType) == 0 ) strcat(OsName, " Professional" ); if ( lstrcmpi( "LANMANNT", szProductType) == 0 ) strcat(OsName, " Server" ); if ( lstrcmpi( "SERVERNT", szProductType) == 0 ) strcat(OsName, " Advanced Server" ); } // Display version, service pack (if any), and build number. strcat (OsName, " "); strcat (OsName, osvi.szCSDVersion); break; // Test for the Windows 95 product family. case VER_PLATFORM_WIN32_WINDOWS: if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { strcpy(OsName, "Microsoft Windows 95"); if (BuildNumber > 950 && BuildNumber <= 1080) strcat(OsName, " SP1"); else if (BuildNumber > 1080) strcat(OsName, " OSR2"); /* if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) strcat(OsName, "OSR2 " ); */ } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { strcpy(OsName, "Microsoft Windows 98"); if (BuildNumber > 1998 && BuildNumber < 2183) strcat(OsName, " SP1"); else if (BuildNumber >= 2183) strcat(OsName, " SE"); /* if ( osvi.szCSDVersion[1] == 'A' ) strcat(OsName, "SE " ); */ } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { strcpy(OsName, "Microsoft Windows Millennium Edition "); } break; } sprintf(Release, "%lu.%lu.%lu", osvi.dwPlatformId, osvi.dwMajorVersion, osvi.dwMinorVersion); sprintf(Version, "%lu", osvi.dwBuildNumber & 0xFFFF); return TRUE; } fldigi-4.1.06/src/compat/regex.h0000644000175000017500000004437313472115775013345 00000000000000/* Definitions for data structures and routines for the regular expression library, version 0.12. Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __REGEXP_LIBRARY_H__ #define __REGEXP_LIBRARY_H__ #ifdef __cplusplus extern "C" { #endif /* POSIX says that must be included (by the caller) before . */ #ifdef VMS /* VMS doesn't have `size_t' in , even though POSIX says it should be there. */ #include #endif /* The following bits are used to determine the regexp syntax we recognize. The set/not-set meanings are chosen so that Emacs syntax remains the value 0. The bits are given in alphabetical order, and the definitions shifted by one from the previous bit; thus, when we add or remove a bit, only one other definition need change. */ typedef unsigned reg_syntax_t; /* If this bit is not set, then \ inside a bracket expression is literal. If set, then such a \ quotes the following character. */ #define RE_BACKSLASH_ESCAPE_IN_LISTS (1) /* If this bit is not set, then + and ? are operators, and \+ and \? are literals. If set, then \+ and \? are operators and + and ? are literals. */ #define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) /* If this bit is set, then character classes are supported. They are: [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. If not set, then character classes are not supported. */ #define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) /* If this bit is set, then ^ and $ are always anchors (outside bracket expressions, of course). If this bit is not set, then it depends: ^ is an anchor if it is at the beginning of a regular expression or after an open-group or an alternation operator; $ is an anchor if it is at the end of a regular expression, or before a close-group or an alternation operator. This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because POSIX draft 11.2 says that * etc. in leading positions is undefined. We already implemented a previous draft which made those constructs invalid, though, so we haven't changed the code back. */ #define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) /* If this bit is set, then special characters are always special regardless of where they are in the pattern. If this bit is not set, then special characters are special only in some contexts; otherwise they are ordinary. Specifically, * + ? and intervals are only special when not after the beginning, open-group, or alternation operator. */ #define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) /* If this bit is set, then *, +, ?, and { cannot be first in an re or immediately after an alternation or begin-group operator. */ #define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) /* If this bit is set, then . matches newline. If not set, then it doesn't. */ #define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) /* If this bit is set, then . doesn't match NUL. If not set, then it does. */ #define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) /* If this bit is set, nonmatching lists [^...] do not match newline. If not set, they do. */ #define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) /* If this bit is set, either \{...\} or {...} defines an interval, depending on RE_NO_BK_BRACES. If not set, \{, \}, {, and } are literals. */ #define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) /* If this bit is set, +, ? and | aren't recognized as operators. If not set, they are. */ #define RE_LIMITED_OPS (RE_INTERVALS << 1) /* If this bit is set, newline is an alternation operator. If not set, newline is literal. */ #define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) /* If this bit is set, then `{...}' defines an interval, and \{ and \} are literals. If not set, then `\{...\}' defines an interval. */ #define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) /* If this bit is set, (...) defines a group, and \( and \) are literals. If not set, \(...\) defines a group, and ( and ) are literals. */ #define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) /* If this bit is set, then \ matches . If not set, then \ is a back-reference. */ #define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) /* If this bit is set, then | is an alternation operator, and \| is literal. If not set, then \| is an alternation operator, and | is literal. */ #define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) /* If this bit is set, then an ending range point collating higher than the starting range point, as in [z-a], is invalid. If not set, then when ending range point collates higher than the starting range point, the range is ignored. */ #define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) /* If this bit is set, then an unmatched ) is ordinary. If not set, then an unmatched ) is invalid. */ #define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) /* This global variable defines the particular regexp syntax to use (for some interfaces). When a regexp is compiled, the syntax used is stored in the pattern buffer, so changing this does not affect already-compiled regexps. */ extern reg_syntax_t re_syntax_options; /* Define combinations of the above bits for the standard possibilities. (The [[[ comments delimit what gets put into the Texinfo file, so don't delete them!) */ /* [[[begin syntaxes]]] */ #define RE_SYNTAX_EMACS 0 #define RE_SYNTAX_AWK \ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ | RE_UNMATCHED_RIGHT_PAREN_ORD) #define RE_SYNTAX_POSIX_AWK \ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) #define RE_SYNTAX_GREP \ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ | RE_NEWLINE_ALT) #define RE_SYNTAX_EGREP \ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ | RE_NO_BK_VBAR) #define RE_SYNTAX_POSIX_EGREP \ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ #define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC #define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC /* Syntax bits common to both basic and extended POSIX regex syntax. */ #define _RE_SYNTAX_POSIX_COMMON \ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ | RE_INTERVALS | RE_NO_EMPTY_RANGES) #define RE_SYNTAX_POSIX_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this isn't minimal, since other operators, such as \`, aren't disabled. */ #define RE_SYNTAX_POSIX_MINIMAL_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) #define RE_SYNTAX_POSIX_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ | RE_UNMATCHED_RIGHT_PAREN_ORD) /* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ #define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) /* [[[end syntaxes]]] */ /* Maximum number of duplicates an interval can allow. Some systems (erroneously) define this in other header files, but we want our value, so remove any previous define. */ #ifdef RE_DUP_MAX #undef RE_DUP_MAX #endif #define RE_DUP_MAX ((1 << 15) - 1) /* POSIX `cflags' bits (i.e., information for `regcomp'). */ /* If this bit is set, then use extended regular expression syntax. If not set, then use basic regular expression syntax. */ #define REG_EXTENDED 1 /* If this bit is set, then ignore case when matching. If not set, then case is significant. */ #define REG_ICASE (REG_EXTENDED << 1) /* If this bit is set, then anchors do not match at newline characters in the string. If not set, then anchors do match at newlines. */ #define REG_NEWLINE (REG_ICASE << 1) /* If this bit is set, then report only success or fail in regexec. If not set, then returns differ between not matching and errors. */ #define REG_NOSUB (REG_NEWLINE << 1) /* POSIX `eflags' bits (i.e., information for regexec). */ /* If this bit is set, then the beginning-of-line operator doesn't match the beginning of the string (presumably because it's not the beginning of a line). If not set, then the beginning-of-line operator does match the beginning of the string. */ #define REG_NOTBOL 1 /* Like REG_NOTBOL, except for the end-of-line. */ #define REG_NOTEOL (1 << 1) /* If any error codes are removed, changed, or added, update the `re_error_msg' table in regex.c. */ typedef enum { REG_NOERROR = 0, /* Success. */ REG_NOMATCH, /* Didn't find a match (for regexec). */ /* POSIX regcomp return error codes. (In the order listed in the standard.) */ REG_BADPAT, /* Invalid pattern. */ REG_ECOLLATE, /* Not implemented. */ REG_ECTYPE, /* Invalid character class name. */ REG_EESCAPE, /* Trailing backslash. */ REG_ESUBREG, /* Invalid back reference. */ REG_EBRACK, /* Unmatched left bracket. */ REG_EPAREN, /* Parenthesis imbalance. */ REG_EBRACE, /* Unmatched \{. */ REG_BADBR, /* Invalid contents of \{\}. */ REG_ERANGE, /* Invalid range end. */ REG_ESPACE, /* Ran out of memory. */ REG_BADRPT, /* No preceding re for repetition op. */ /* Error codes we've added. */ REG_EEND, /* Premature end. */ REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ } reg_errcode_t; /* This data structure represents a compiled pattern. Before calling the pattern compiler, the fields `buffer', `allocated', `fastmap', `translate', and `no_sub' can be set. After the pattern has been compiled, the `re_nsub' field is available. All other fields are private to the regex routines. */ struct re_pattern_buffer { /* [[[begin pattern_buffer]]] */ /* Space that holds the compiled pattern. It is declared as `unsigned char *' because its elements are sometimes used as array indexes. */ unsigned char *buffer; /* Number of bytes to which `buffer' points. */ unsigned long allocated; /* Number of bytes actually used in `buffer'. */ unsigned long used; /* Syntax setting with which the pattern was compiled. */ reg_syntax_t syntax; /* Pointer to a fastmap, if any, otherwise zero. re_search uses the fastmap, if there is one, to skip over impossible starting points for matches. */ char *fastmap; /* Either a translate table to apply to all characters before comparing them, or zero for no translation. The translation is applied to a pattern when it is compiled and to a string when it is matched. */ char *translate; /* Number of subexpressions found by the compiler. */ size_t re_nsub; /* Zero if this pattern cannot match the empty string, one else. Well, in truth it's used only in `re_search_2', to see whether or not we should use the fastmap, so we don't set this absolutely perfectly; see `re_compile_fastmap' (the `duplicate' case). */ unsigned can_be_null : 1; /* If REGS_UNALLOCATED, allocate space in the `regs' structure for `max (RE_NREGS, re_nsub + 1)' groups. If REGS_REALLOCATE, reallocate space if necessary. If REGS_FIXED, use what's there. */ #define REGS_UNALLOCATED 0 #define REGS_REALLOCATE 1 #define REGS_FIXED 2 unsigned regs_allocated : 2; /* Set to zero when `regex_compile' compiles a pattern; set to one by `re_compile_fastmap' if it updates the fastmap. */ unsigned fastmap_accurate : 1; /* If set, `re_match_2' does not return information about subexpressions. */ unsigned no_sub : 1; /* If set, a beginning-of-line anchor doesn't match at the beginning of the string. */ unsigned not_bol : 1; /* Similarly for an end-of-line anchor. */ unsigned not_eol : 1; /* If true, an anchor at a newline matches. */ unsigned newline_anchor : 1; /* [[[end pattern_buffer]]] */ }; typedef struct re_pattern_buffer regex_t; /* search.c (search_buffer) in Emacs needs this one opcode value. It is defined both in `regex.c' and here. */ #define RE_EXACTN_VALUE 1 /* Type for byte offsets within the string. POSIX mandates this. */ typedef int regoff_t; /* This is the structure we store register match data in. See regex.texinfo for a full description of what registers match. */ struct re_registers { unsigned num_regs; regoff_t *start; regoff_t *end; }; /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, `re_match_2' returns information about at least this many registers the first time a `regs' structure is passed. */ #ifndef RE_NREGS #define RE_NREGS 30 #endif /* POSIX specification for registers. Aside from the different names than `re_registers', POSIX uses an array of structures, instead of a structure of arrays. */ typedef struct { regoff_t rm_so; /* Byte offset from string's start to substring's start. */ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ } regmatch_t; /* Declarations for routines. */ /* To avoid duplicating every routine declaration -- once with a prototype (if we are ANSI), and once without (if we aren't) -- we use the following macro to declare argument types. This unfortunately clutters up the declarations a bit, but I think it's worth it. */ #if __STDC__ #define _RE_ARGS(args) args #else /* not __STDC__ */ #define _RE_ARGS(args) () #endif /* not __STDC__ */ /* Sets the current default syntax to SYNTAX, and return the old syntax. You can also simply assign to the `re_syntax_options' variable. */ extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); /* Compile the regular expression PATTERN, with length LENGTH and syntax given by the global `re_syntax_options', into the buffer BUFFER. Return NULL if successful, and an error string if not. */ extern const char *re_compile_pattern _RE_ARGS ((const char *pattern, int length, struct re_pattern_buffer *buffer)); /* Compile a fastmap for the compiled pattern in BUFFER; used to accelerate searches. Return 0 if successful and -2 if was an internal error. */ extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); /* Search in the string STRING (with length LENGTH) for the pattern compiled into BUFFER. Start searching at position START, for RANGE characters. Return the starting position of the match, -1 for no match, or -2 for an internal error. Also return register information in REGS (if REGS and BUFFER->no_sub are nonzero). */ extern int re_search _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string_, int length, int start, int range, struct re_registers *regs)); /* Like `re_search', but search in the concatenation of STRING1 and STRING2. Also, stop searching at index START + STOP. */ extern int re_search_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, int range, struct re_registers *regs, int stop)); /* Like `re_search', but return how many characters in STRING the regexp in BUFFER matched, starting at position START. */ extern int re_match _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string_, int length, int start, struct re_registers *regs)); /* Relates to `re_match' as `re_search_2' relates to `re_search'. */ extern int re_match_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, struct re_registers *regs, int stop)); /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated with malloc, and must each be at least `NUM_REGS * sizeof (regoff_t)' bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ extern void re_set_registers _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, unsigned num_regs, regoff_t *starts, regoff_t *ends)); /* 4.2 bsd compatibility. */ extern char *re_comp _RE_ARGS ((const char *)); extern int re_exec _RE_ARGS ((const char *)); /* POSIX compatibility. */ extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags)); extern int regexec _RE_ARGS ((const regex_t *preg, const char *string_, size_t nmatch, regmatch_t pmatch[], int eflags)); extern size_t regerror _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)); extern void regfree _RE_ARGS ((regex_t *preg)); #ifdef __cplusplus } #endif #endif /* not __REGEXP_LIBRARY_H__ */ /* Local variables: make-backup-files: t version-control: t trim-versions-without-asking: nil End: */ fldigi-4.1.06/src/compat/mingw.h0000644000175000017500000000574013472115775013347 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MINGW_H_ #define MINGW_H_ #include "config.h" #include #include #include #undef EADDRINUSE #define EADDRINUSE WSAEADDRINUSE #undef EISCONN #define EISCONN WSAEISCONN #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #undef EALREADY #define EALREADY WSAEALREADY //====================================================================== #ifdef __cplusplus extern "C" { #endif typedef int pid_t; typedef long suseconds_t; #define hstrerror strerror #ifndef SIGUSR2 # define SIGUSR2 100 #endif extern void was_init(void); extern int was_init_state(void); extern WSADATA * was_data(void); /* * simple adaptors */ static inline int mingw_mkdir(const char *path, int mode) { return mkdir(path); } #define mkdir mingw_mkdir static inline int mingw_unlink(const char *pathname) { /* read-only files cannot be removed */ chmod(pathname, 0666); return unlink(pathname); } #define unlink mingw_unlink /* * implementations of missing functions */ unsigned int sleep (unsigned int seconds); char *mingw_getcwd(char *pointer, int len); #define getcwd mingw_getcwd char *mingw_getenv(const char *name); #define getenv mingw_getenv int mingw_rename(const char*, const char*); #define rename mingw_rename #ifndef SHUT_WR # define SHUT_WR SD_SEND #endif #ifndef SHUT_RD # define SHUT_RD SD_RECEIVE #endif #ifndef SHUT_RDWR # define SHUT_RDWR SD_BOTH #endif int nanosleep (const struct timespec *req, struct timespec *rem); int socketpair(int family, int type, int protocol, int *sv); /* uname */ #define UTSNAME_MAX_ 257 struct utsname { char sysname[UTSNAME_MAX_]; char nodename[UTSNAME_MAX_]; char release[UTSNAME_MAX_]; char version[UTSNAME_MAX_]; char machine[UTSNAME_MAX_]; }; int uname(struct utsname *name); /* getrusage */ #define RUSAGE_SELF 0 #define RUSAGE_CHILDREN (-1) struct rusage { struct timeval ru_utime; struct timeval ru_stime; }; int getrusage(int who, struct rusage *usage); /* fsync, fdatasync */ #include #define fsync _commit #define fdatasync fsync #ifdef __cplusplus } #endif #endif fldigi-4.1.06/src/compat/regex.c0000644000175000017500000042751613472115775013344 00000000000000/* Extended regular expression matching and search library, version 0.12. (Implements POSIX draft P10003.2/D11.2, except for internationalization features.) Copyright (C) 1993 Free Software Foundation, Inc. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- /* AIX requires this to be the first thing in the file. */ #if defined (_AIX) && !defined (REGEX_MALLOC) #pragma alloca #endif #define _GNU_SOURCE /* We need this for `regex.h', and perhaps for the Emacs include files. */ #include /* We used to test for `BSTRING' here, but only GCC and Emacs define `BSTRING', as far as I know, and neither of them use this code. */ #include #ifndef bcmp #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) #endif #ifndef bcopy #define bcopy(s, d, n) memcpy ((d), (s), (n)) #endif #ifndef bzero #define bzero(s, n) memset ((s), 0, (n)) #endif #include /* Define the syntax stuff for \<, \>, etc. */ /* This must be nonzero for the wordchar and notwordchar pattern commands in re_match_2. */ #ifndef Sword #define Sword 1 #endif #ifdef SYNTAX_TABLE extern char *re_syntax_table; #else /* not SYNTAX_TABLE */ /* How many characters in the character set. */ #define CHAR_SET_SIZE 256 static char re_syntax_table[CHAR_SET_SIZE]; static void init_syntax_once () { register int c; static int done = 0; if (done) return; bzero (re_syntax_table, sizeof re_syntax_table); for (c = 'a'; c <= 'z'; c++) re_syntax_table[c] = Sword; for (c = 'A'; c <= 'Z'; c++) re_syntax_table[c] = Sword; for (c = '0'; c <= '9'; c++) re_syntax_table[c] = Sword; re_syntax_table['_'] = Sword; done = 1; } #endif /* not SYNTAX_TABLE */ #define SYNTAX(c) re_syntax_table[c] /* Get the interface, including the syntax bits. */ #include "regex.h" /* isalpha etc. are used for the character classes. */ #include #ifndef isascii #define isascii(c) 1 #endif #ifdef isblank #define ISBLANK(c) (isascii (c) && isblank (c)) #else #define ISBLANK(c) ((c) == ' ' || (c) == '\t') #endif #ifdef isgraph #define ISGRAPH(c) (isascii (c) && isgraph (c)) #else #define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c)) #endif #define ISPRINT(c) (isascii (c) && isprint (c)) #define ISDIGIT(c) (isascii (c) && isdigit (c)) #define ISALNUM(c) (isascii (c) && isalnum (c)) #define ISALPHA(c) (isascii (c) && isalpha (c)) #define ISCNTRL(c) (isascii (c) && iscntrl (c)) #define ISLOWER(c) (isascii (c) && islower (c)) #define ISPUNCT(c) (isascii (c) && ispunct (c)) #define ISSPACE(c) (isascii (c) && isspace (c)) #define ISUPPER(c) (isascii (c) && isupper (c)) #define ISXDIGIT(c) (isascii (c) && isxdigit (c)) #ifndef NULL #define NULL 0 #endif /* We remove any previous definition of `SIGN_EXTEND_CHAR', since ours (we hope) works properly with all combinations of machines, compilers, `char' and `unsigned char' argument types. (Per Bothner suggested the basic approach.) */ #undef SIGN_EXTEND_CHAR #if __STDC__ #define SIGN_EXTEND_CHAR(c) ((signed char) (c)) #else /* not __STDC__ */ /* As in Harbison and Steele. */ #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) #endif /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we use `alloca' instead of `malloc'. This is because using malloc in re_search* or re_match* could cause memory leaks when C-g is used in Emacs; also, malloc is slower and causes storage fragmentation. On the other hand, malloc is more portable, and easier to debug. Because we sometimes use alloca, some routines have to be macros, not functions -- `alloca'-allocated space disappears at the end of the function it is called in. */ #ifdef REGEX_MALLOC #define REGEX_ALLOCATE malloc #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) #else /* not REGEX_MALLOC */ /* Emacs already defines alloca, sometimes. */ #ifndef alloca /* Make alloca work the best possible way. */ #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not __GNUC__ */ #if HAVE_ALLOCA_H #include #else /* not __GNUC__ or HAVE_ALLOCA_H */ #ifndef _AIX /* Already did AIX, up at the top. */ char *alloca (); #endif /* not _AIX */ #endif /* not HAVE_ALLOCA_H */ #endif /* not __GNUC__ */ #endif /* not alloca */ #define REGEX_ALLOCATE alloca /* Assumes a `char *destination' variable. */ #define REGEX_REALLOCATE(source, osize, nsize) \ (destination = (char *) alloca (nsize), \ bcopy (source, destination, osize), \ destination) #endif /* not REGEX_MALLOC */ /* True if `size1' is non-NULL and PTR is pointing anywhere inside `string1' or just past its end. This works if PTR is NULL, which is a good thing. */ #define FIRST_STRING_P(ptr) \ (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) /* (Re)Allocate N items of type T using malloc, or fail. */ #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) #define BYTEWIDTH 8 /* In bits. */ #define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) typedef char boolean; #define false 0 #define true 1 /* These are the command codes that appear in compiled regular expressions. Some opcodes are followed by argument bytes. A command code can specify any interpretation whatsoever for its arguments. Zero bytes may appear in the compiled regular expression. The value of `exactn' is needed in search.c (search_buffer) in Emacs. So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of `exactn' we use here must also be 1. */ typedef enum { no_op = 0, /* Followed by one byte giving n, then by n literal bytes. */ exactn = 1, /* Matches any (more or less) character. */ anychar, /* Matches any one char belonging to specified set. First following byte is number of bitmap bytes. Then come bytes for a bitmap saying which chars are in. Bits in each byte are ordered low-bit-first. A character is in the set if its bit is 1. A character too large to have a bit in the map is automatically not in the set. */ charset, /* Same parameters as charset, but match any character that is not one of those specified. */ charset_not, /* Start remembering the text that is matched, for storing in a register. Followed by one byte with the register number, in the range 0 to one less than the pattern buffer's re_nsub field. Then followed by one byte with the number of groups inner to this one. (This last has to be part of the start_memory only because we need it in the on_failure_jump of re_match_2.) */ start_memory, /* Stop remembering the text that is matched and store it in a memory register. Followed by one byte with the register number, in the range 0 to one less than `re_nsub' in the pattern buffer, and one byte with the number of inner groups, just like `start_memory'. (We need the number of inner groups here because we don't have any easy way of finding the corresponding start_memory when we're at a stop_memory.) */ stop_memory, /* Match a duplicate of something remembered. Followed by one byte containing the register number. */ duplicate, /* Fail unless at beginning of line. */ begline, /* Fail unless at end of line. */ endline, /* Succeeds if at beginning of buffer (if emacs) or at beginning of string to be matched (if not). */ begbuf, /* Analogously, for end of buffer/string. */ endbuf, /* Followed by two byte relative address to which to jump. */ jump, /* Same as jump, but marks the end of an alternative. */ jump_past_alt, /* Followed by two-byte relative address of place to resume at in case of failure. */ on_failure_jump, /* Like on_failure_jump, but pushes a placeholder instead of the current string position when executed. */ on_failure_keep_string_jump, /* Throw away latest failure point and then jump to following two-byte relative address. */ pop_failure_jump, /* Change to pop_failure_jump if know won't have to backtrack to match; otherwise change to jump. This is used to jump back to the beginning of a repeat. If what follows this jump clearly won't match what the repeat does, such that we can be sure that there is no use backtracking out of repetitions already matched, then we change it to a pop_failure_jump. Followed by two-byte address. */ maybe_pop_jump, /* Jump to following two-byte address, and push a dummy failure point. This failure point will be thrown away if an attempt is made to use it for a failure. A `+' construct makes this before the first repeat. Also used as an intermediary kind of jump when compiling an alternative. */ dummy_failure_jump, /* Push a dummy failure point and continue. Used at the end of alternatives. */ push_dummy_failure, /* Followed by two-byte relative address and two-byte number n. After matching N times, jump to the address upon failure. */ succeed_n, /* Followed by two-byte relative address, and two-byte number n. Jump to the address N times, then fail. */ jump_n, /* Set the following two-byte relative address to the subsequent two-byte number. The address *includes* the two bytes of number. */ set_number_at, wordchar, /* Matches any word-constituent character. */ notwordchar, /* Matches any char that is not a word-constituent. */ wordbeg, /* Succeeds if at word beginning. */ wordend, /* Succeeds if at word end. */ wordbound, /* Succeeds if at a word boundary. */ notwordbound /* Succeeds if not at a word boundary. */ #ifdef emacs ,before_dot, /* Succeeds if before point. */ at_dot, /* Succeeds if at point. */ after_dot, /* Succeeds if after point. */ /* Matches any character whose syntax is specified. Followed by a byte which contains a syntax code, e.g., Sword. */ syntaxspec, /* Matches any character whose syntax is not that specified. */ notsyntaxspec #endif /* emacs */ } re_opcode_t; /* Common operations on the compiled pattern. */ /* Store NUMBER in two contiguous bytes starting at DESTINATION. */ #define STORE_NUMBER(destination, number) \ do { \ (destination)[0] = (number) & 0377; \ (destination)[1] = (number) >> 8; \ } while (0) /* Same as STORE_NUMBER, except increment DESTINATION to the byte after where the number is stored. Therefore, DESTINATION must be an lvalue. */ #define STORE_NUMBER_AND_INCR(destination, number) \ do { \ STORE_NUMBER (destination, number); \ (destination) += 2; \ } while (0) /* Put into DESTINATION a number stored in two contiguous bytes starting at SOURCE. */ #define EXTRACT_NUMBER(destination, source) \ do { \ (destination) = *(source) & 0377; \ (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ } while (0) #ifdef DEBUG static void extract_number (dest, source) int *dest; unsigned char *source; { int temp = SIGN_EXTEND_CHAR (*(source + 1)); *dest = *source & 0377; *dest += temp << 8; } #ifndef EXTRACT_MACROS /* To debug the macros. */ #undef EXTRACT_NUMBER #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src) #endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. SOURCE must be an lvalue. */ #define EXTRACT_NUMBER_AND_INCR(destination, source) \ do { \ EXTRACT_NUMBER (destination, source); \ (source) += 2; \ } while (0) #ifdef DEBUG static void extract_number_and_incr (destination, source) int *destination; unsigned char **source; { extract_number (destination, *source); *source += 2; } #ifndef EXTRACT_MACROS #undef EXTRACT_NUMBER_AND_INCR #define EXTRACT_NUMBER_AND_INCR(dest, src) \ extract_number_and_incr (&dest, &src) #endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* If DEBUG is defined, Regex prints many voluminous messages about what it is doing (if the variable `debug' is nonzero). If linked with the main program in `iregex.c', you can enter patterns and strings interactively. And if linked with the main program in `main.c' and the other test files, you can run the already-written tests. */ #ifdef DEBUG /* We use standard I/O for debugging. */ #include /* It is useful to test things that ``must'' be true when debugging. */ #include static int debug = 0; #define DEBUG_STATEMENT(e) e #define DEBUG_PRINT1(x) if (debug) printf (x) #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ if (debug) print_partial_compiled_pattern (s, e) #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ if (debug) print_double_string (w, s1, sz1, s2, sz2) extern void printchar (); /* Print the fastmap in human-readable form. */ void print_fastmap (fastmap) char *fastmap; { unsigned was_a_range = 0; unsigned i = 0; while (i < (1 << BYTEWIDTH)) { if (fastmap[i++]) { was_a_range = 0; printchar (i - 1); while (i < (1 << BYTEWIDTH) && fastmap[i]) { was_a_range = 1; i++; } if (was_a_range) { printf ("-"); printchar (i - 1); } } } putchar ('\n'); } /* Print a compiled pattern string in human-readable form, starting at the START pointer into it and ending just before the pointer END. */ void print_partial_compiled_pattern (start, end) unsigned char *start; unsigned char *end; { int mcnt, mcnt2; unsigned char *p = start; unsigned char *pend = end; if (start == NULL) { printf ("(null)\n"); return; } /* Loop over pattern commands. */ while (p < pend) { switch ((re_opcode_t) *p++) { case no_op: printf ("/no_op"); break; case exactn: mcnt = *p++; printf ("/exactn/%d", mcnt); do { putchar ('/'); printchar (*p++); } while (--mcnt); break; case start_memory: mcnt = *p++; printf ("/start_memory/%d/%d", mcnt, *p++); break; case stop_memory: mcnt = *p++; printf ("/stop_memory/%d/%d", mcnt, *p++); break; case duplicate: printf ("/duplicate/%d", *p++); break; case anychar: printf ("/anychar"); break; case charset: case charset_not: { register int c; printf ("/charset%s", (re_opcode_t) *(p - 1) == charset_not ? "_not" : ""); assert (p + *p < pend); for (c = 0; c < *p; c++) { unsigned bit; unsigned char map_byte = p[1 + c]; putchar ('/'); for (bit = 0; bit < BYTEWIDTH; bit++) if (map_byte & (1 << bit)) printchar (c * BYTEWIDTH + bit); } p += 1 + *p; break; } case begline: printf ("/begline"); break; case endline: printf ("/endline"); break; case on_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_jump/0/%d", mcnt); break; case on_failure_keep_string_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_keep_string_jump/0/%d", mcnt); break; case dummy_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/dummy_failure_jump/0/%d", mcnt); break; case push_dummy_failure: printf ("/push_dummy_failure"); break; case maybe_pop_jump: extract_number_and_incr (&mcnt, &p); printf ("/maybe_pop_jump/0/%d", mcnt); break; case pop_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/pop_failure_jump/0/%d", mcnt); break; case jump_past_alt: extract_number_and_incr (&mcnt, &p); printf ("/jump_past_alt/0/%d", mcnt); break; case jump: extract_number_and_incr (&mcnt, &p); printf ("/jump/0/%d", mcnt); break; case succeed_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2); break; case jump_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2); break; case set_number_at: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2); break; case wordbound: printf ("/wordbound"); break; case notwordbound: printf ("/notwordbound"); break; case wordbeg: printf ("/wordbeg"); break; case wordend: printf ("/wordend"); #ifdef emacs case before_dot: printf ("/before_dot"); break; case at_dot: printf ("/at_dot"); break; case after_dot: printf ("/after_dot"); break; case syntaxspec: printf ("/syntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; case notsyntaxspec: printf ("/notsyntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; #endif /* emacs */ case wordchar: printf ("/wordchar"); break; case notwordchar: printf ("/notwordchar"); break; case begbuf: printf ("/begbuf"); break; case endbuf: printf ("/endbuf"); break; default: printf ("?%d", *(p-1)); } } printf ("/\n"); } void print_compiled_pattern (bufp) struct re_pattern_buffer *bufp; { unsigned char *buffer = bufp->buffer; print_partial_compiled_pattern (buffer, buffer + bufp->used); printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated); if (bufp->fastmap_accurate && bufp->fastmap) { printf ("fastmap: "); print_fastmap (bufp->fastmap); } printf ("re_nsub: %d\t", bufp->re_nsub); printf ("regs_alloc: %d\t", bufp->regs_allocated); printf ("can_be_null: %d\t", bufp->can_be_null); printf ("newline_anchor: %d\n", bufp->newline_anchor); printf ("no_sub: %d\t", bufp->no_sub); printf ("not_bol: %d\t", bufp->not_bol); printf ("not_eol: %d\t", bufp->not_eol); printf ("syntax: %d\n", bufp->syntax); /* Perhaps we should print the translate table? */ } void print_double_string (where, string1, size1, string2, size2) const char *where; const char *string1; const char *string2; int size1; int size2; { unsigned this_char; if (where == NULL) printf ("(null)"); else { if (FIRST_STRING_P (where)) { for (this_char = where - string1; this_char < size1; this_char++) printchar (string1[this_char]); where = string2; } for (this_char = where - string2; this_char < size2; this_char++) printchar (string2[this_char]); } } #else /* not DEBUG */ #undef assert #define assert(e) #define DEBUG_STATEMENT(e) #define DEBUG_PRINT1(x) #define DEBUG_PRINT2(x1, x2) #define DEBUG_PRINT3(x1, x2, x3) #define DEBUG_PRINT4(x1, x2, x3, x4) #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) #endif /* not DEBUG */ /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can also be assigned to arbitrarily: each pattern buffer stores its own syntax, so it can be changed between regex compilations. */ reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS; /* Specify the precise syntax of regexps for compilation. This provides for compatibility for various utilities which historically have different, incompatible syntaxes. The argument SYNTAX is a bit mask comprised of the various bits defined in regex.h. We return the old syntax. */ reg_syntax_t re_set_syntax (syntax) reg_syntax_t syntax; { reg_syntax_t ret = re_syntax_options; re_syntax_options = syntax; return ret; } /* This table gives an error message for each of the error codes listed in regex.h. Obviously the order here has to be same as there. */ static const char *re_error_msg[] = { NULL, /* REG_NOERROR */ "No match", /* REG_NOMATCH */ "Invalid regular expression", /* REG_BADPAT */ "Invalid collation character", /* REG_ECOLLATE */ "Invalid character class name", /* REG_ECTYPE */ "Trailing backslash", /* REG_EESCAPE */ "Invalid back reference", /* REG_ESUBREG */ "Unmatched [ or [^", /* REG_EBRACK */ "Unmatched ( or \\(", /* REG_EPAREN */ "Unmatched \\{", /* REG_EBRACE */ "Invalid content of \\{\\}", /* REG_BADBR */ "Invalid range end", /* REG_ERANGE */ "Memory exhausted", /* REG_ESPACE */ "Invalid preceding regular expression", /* REG_BADRPT */ "Premature end of regular expression", /* REG_EEND */ "Regular expression too big", /* REG_ESIZE */ "Unmatched ) or \\)", /* REG_ERPAREN */ }; /* Subroutine declarations and macros for regex_compile. */ static void store_op1 (), store_op2 (); static void insert_op1 (), insert_op2 (); static boolean at_begline_loc_p (), at_endline_loc_p (); static boolean group_in_compile_stack (); static reg_errcode_t compile_range (); /* Fetch the next character in the uncompiled pattern---translating it if necessary. Also cast from a signed character in the constant string passed to us by the user to an unsigned char that we can use as an array index (in, e.g., `translate'). */ #define PATFETCH(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ if (translate) c = translate[c]; \ } while (0) /* Fetch the next character in the uncompiled pattern, with no translation. */ #define PATFETCH_RAW(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ } while (0) /* Go backwards one character in the pattern. */ #define PATUNFETCH p-- /* If `translate' is non-null, return translate[D], else just D. We cast the subscript to translate because some data is declared as `char *', to avoid warnings when a string constant is passed. But when we use a character as a subscript we must make it unsigned. */ #define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d)) /* Macros for outputting the compiled pattern into `buffer'. */ /* If the buffer isn't allocated when it comes in, use this. */ #define INIT_BUF_SIZE 32 /* Make sure we have at least N more bytes of space in buffer. */ #define GET_BUFFER_SPACE(n) \ while (b - bufp->buffer + (n) > bufp->allocated) \ EXTEND_BUFFER () /* Make sure we have one more byte of buffer space and then add C to it. */ #define BUF_PUSH(c) \ do { \ GET_BUFFER_SPACE (1); \ *b++ = (unsigned char) (c); \ } while (0) /* Ensure we have two more bytes of buffer space and then append C1 and C2. */ #define BUF_PUSH_2(c1, c2) \ do { \ GET_BUFFER_SPACE (2); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ } while (0) /* As with BUF_PUSH_2, except for three bytes. */ #define BUF_PUSH_3(c1, c2, c3) \ do { \ GET_BUFFER_SPACE (3); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ *b++ = (unsigned char) (c3); \ } while (0) /* Store a jump with opcode OP at LOC to location TO. We store a relative address offset by the three bytes the jump itself occupies. */ #define STORE_JUMP(op, loc, to) \ store_op1 (op, loc, (to) - (loc) - 3) /* Likewise, for a two-argument jump. */ #define STORE_JUMP2(op, loc, to, arg) \ store_op2 (op, loc, (to) - (loc) - 3, arg) /* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP(op, loc, to) \ insert_op1 (op, loc, (to) - (loc) - 3, b) /* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP2(op, loc, to, arg) \ insert_op2 (op, loc, (to) - (loc) - 3, arg, b) /* This is not an arbitrary limit: the arguments which represent offsets into the pattern are two bytes long. So if 2^16 bytes turns out to be too small, many things would have to change. */ #define MAX_BUF_SIZE (1L << 16) /* Extend the buffer by twice its current size via realloc and reset the pointers that pointed into the old block to point to the correct places in the new one. If extending the buffer results in it being larger than MAX_BUF_SIZE, then flag memory exhausted. */ #define EXTEND_BUFFER() \ do { \ unsigned char *old_buffer = bufp->buffer; \ if (bufp->allocated == MAX_BUF_SIZE) \ return REG_ESIZE; \ bufp->allocated <<= 1; \ if (bufp->allocated > MAX_BUF_SIZE) \ bufp->allocated = MAX_BUF_SIZE; \ bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\ if (bufp->buffer == NULL) \ return REG_ESPACE; \ /* If the buffer moved, move all the pointers into it. */ \ if (old_buffer != bufp->buffer) \ { \ b = (b - old_buffer) + bufp->buffer; \ begalt = (begalt - old_buffer) + bufp->buffer; \ if (fixup_alt_jump) \ fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\ if (laststart) \ laststart = (laststart - old_buffer) + bufp->buffer; \ if (pending_exact) \ pending_exact = (pending_exact - old_buffer) + bufp->buffer; \ } \ } while (0) /* Since we have one byte reserved for the register number argument to {start,stop}_memory, the maximum number of groups we can report things about is what fits in that byte. */ #define MAX_REGNUM 255 /* But patterns can have more than `MAX_REGNUM' registers. We just ignore the excess. */ typedef unsigned regnum_t; /* Macros for the compile stack. */ /* Since offsets can go either forwards or backwards, this type needs to be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ typedef int pattern_offset_t; typedef struct { pattern_offset_t begalt_offset; pattern_offset_t fixup_alt_jump; pattern_offset_t inner_group_offset; pattern_offset_t laststart_offset; regnum_t regnum; } compile_stack_elt_t; typedef struct { compile_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } compile_stack_type; #define INIT_COMPILE_STACK_SIZE 32 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0) #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) /* The next available element. */ #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) /* Set the bit for character C in a list. */ #define SET_LIST_BIT(c) \ (b[((unsigned char) (c)) / BYTEWIDTH] \ |= 1 << (((unsigned char) c) % BYTEWIDTH)) /* Get the next unsigned number in the uncompiled pattern. */ #define GET_UNSIGNED_NUMBER(num) \ { if (p != pend) \ { \ PATFETCH (c); \ while (ISDIGIT (c)) \ { \ if (num < 0) \ num = 0; \ num = num * 10 + c - '0'; \ if (p == pend) \ break; \ PATFETCH (c); \ } \ } \ } #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ #define IS_CHAR_CLASS(string) \ (STREQ (string, "alpha") || STREQ (string, "upper") \ || STREQ (string, "lower") || STREQ (string, "digit") \ || STREQ (string, "alnum") || STREQ (string, "xdigit") \ || STREQ (string, "space") || STREQ (string, "print") \ || STREQ (string, "punct") || STREQ (string, "graph") \ || STREQ (string, "cntrl") || STREQ (string, "blank")) /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. Returns one of error codes defined in `regex.h', or zero for success. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. If it succeeds, results are put in BUFP (if it returns an error, the contents of BUFP are undefined): `buffer' is the compiled pattern; `syntax' is set to SYNTAX; `used' is set to the length of the compiled pattern; `fastmap_accurate' is zero; `re_nsub' is the number of subexpressions in PATTERN; `not_bol' and `not_eol' are zero; The `fastmap' and `newline_anchor' fields are neither examined nor set. */ static reg_errcode_t regex_compile (pattern, size, syntax, bufp) const char *pattern; int size; reg_syntax_t syntax; struct re_pattern_buffer *bufp; { /* We fetch characters from PATTERN here. Even though PATTERN is `char *' (i.e., signed), we declare these variables as unsigned, so they can be reliably used as array indices. */ register unsigned char c, c1; /* A random tempory spot in PATTERN. */ const char *p1; /* Points to the end of the buffer, where we should append. */ register unsigned char *b; /* Keeps track of unclosed groups. */ compile_stack_type compile_stack; /* Points to the current (ending) position in the pattern. */ const char *p = pattern; const char *pend = pattern + size; /* How to translate the characters in the pattern. */ char *translate = bufp->translate; /* Address of the count-byte of the most recently inserted `exactn' command. This makes it possible to tell if a new exact-match character can be added to that command or if the character requires a new `exactn' command. */ unsigned char *pending_exact = 0; /* Address of start of the most recently finished expression. This tells, e.g., postfix * where to find the start of its operand. Reset at the beginning of groups and alternatives. */ unsigned char *laststart = 0; /* Address of beginning of regexp, or inside of last group. */ unsigned char *begalt; /* Place in the uncompiled pattern (i.e., the {) to which to go back if the interval is invalid. */ const char *beg_interval; /* Address of the place where a forward jump should go to the end of the containing expression. Each alternative of an `or' -- except the last -- ends with a forward jump of this sort. */ unsigned char *fixup_alt_jump = 0; /* Counts open-groups as they are encountered. Remembered for the matching close-group on the compile stack, so the same register number is put in the stop_memory as the start_memory. */ regnum_t regnum = 0; #ifdef DEBUG DEBUG_PRINT1 ("\nCompiling pattern: "); if (debug) { unsigned debug_count; for (debug_count = 0; debug_count < size; debug_count++) printchar (pattern[debug_count]); putchar ('\n'); } #endif /* DEBUG */ /* Initialize the compile stack. */ compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size = INIT_COMPILE_STACK_SIZE; compile_stack.avail = 0; /* Initialize the pattern buffer. */ bufp->syntax = syntax; bufp->fastmap_accurate = 0; bufp->not_bol = bufp->not_eol = 0; /* Set `used' to zero, so that if we return an error, the pattern printer (for debugging) will think there's no pattern. We reset it at the end. */ bufp->used = 0; /* Always count groups, whether or not bufp->no_sub is set. */ bufp->re_nsub = 0; #if !defined (emacs) && !defined (SYNTAX_TABLE) /* Initialize the syntax table. */ init_syntax_once (); #endif if (bufp->allocated == 0) { if (bufp->buffer) { /* If zero allocated, but buffer is non-null, try to realloc enough space. This loses if buffer's address is bogus, but that is the user's responsibility. */ RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char); } else { /* Caller did not allocate a buffer. Do it for them. */ bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char); } if (!bufp->buffer) { free(compile_stack.stack); return REG_ESPACE; } bufp->allocated = INIT_BUF_SIZE; } begalt = b = bufp->buffer; /* Loop through the uncompiled pattern until we're at the end. */ while (p != pend) { PATFETCH (c); switch (c) { case '^': { if ( /* If at start of pattern, it's an operator. */ p == pattern + 1 /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's come before. */ || at_begline_loc_p (pattern, p, syntax)) BUF_PUSH (begline); else goto normal_char; } break; case '$': { if ( /* If at end of pattern, it's an operator. */ p == pend /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's next. */ || at_endline_loc_p (p, pend, syntax)) BUF_PUSH (endline); else goto normal_char; } break; case '+': case '?': if ((syntax & RE_BK_PLUS_QM) || (syntax & RE_LIMITED_OPS)) goto normal_char; handle_plus: case '*': /* If there is no previous pattern... */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) return REG_BADRPT; else if (!(syntax & RE_CONTEXT_INDEP_OPS)) goto normal_char; } { /* Are we optimizing this jump? */ boolean keep_string_p = false; /* 1 means zero (many) matches is allowed. */ char zero_times_ok = 0, many_times_ok = 0; /* If there is a sequence of repetition chars, collapse it down to just one (the right one). We can't combine interval operators with these because of, e.g., `a{2}*', which should only match an even number of `a's. */ for (;;) { zero_times_ok |= c != '+'; many_times_ok |= c != '?'; if (p == pend) break; PATFETCH (c); if (c == '*' || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) ; else if (syntax & RE_BK_PLUS_QM && c == '\\') { if (p == pend) return REG_EESCAPE; PATFETCH (c1); if (!(c1 == '+' || c1 == '?')) { PATUNFETCH; PATUNFETCH; break; } c = c1; } else { PATUNFETCH; break; } /* If we get here, we found another repeat character. */ } /* Star, etc. applied to an empty pattern is equivalent to an empty pattern. */ if (!laststart) break; /* Now we know whether or not zero matches is allowed and also whether or not two or more matches is allowed. */ if (many_times_ok) { /* More than one repetition is allowed, so put in at the end a backward relative jump from `b' to before the next jump we're going to put in below (which jumps from laststart to after this jump). But if we are at the `*' in the exact sequence `.*\n', insert an unconditional jump backwards to the ., instead of the beginning of the loop. This way we only push a failure point once, instead of every time through the loop. */ assert (p - 1 > pattern); /* Allocate the space for the jump. */ GET_BUFFER_SPACE (3); /* We know we are not at the first character of the pattern, because laststart was nonzero. And we've already incremented `p', by the way, to be the character after the `*'. Do we have to do something analogous here for null bytes, because of RE_DOT_NOT_NULL? */ if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') && zero_times_ok && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') && !(syntax & RE_DOT_NEWLINE)) { /* We have .*\n. */ STORE_JUMP (jump, b, laststart); keep_string_p = true; } else /* Anything else. */ STORE_JUMP (maybe_pop_jump, b, laststart - 3); /* We've added more stuff to the buffer. */ b += 3; } /* On failure, jump from laststart to b + 3, which will be the end of the buffer after this jump is inserted. */ GET_BUFFER_SPACE (3); INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump : on_failure_jump, laststart, b + 3); pending_exact = 0; b += 3; if (!zero_times_ok) { /* At least one repetition is required, so insert a `dummy_failure_jump' before the initial `on_failure_jump' instruction of the loop. This effects a skip over that instruction the first time we hit that loop. */ GET_BUFFER_SPACE (3); INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6); b += 3; } } break; case '.': laststart = b; BUF_PUSH (anychar); break; case '[': { boolean had_char_class = false; if (p == pend) return REG_EBRACK; /* Ensure that we have enough space to push a charset: the opcode, the length count, and the bitset; 34 bytes in all. */ GET_BUFFER_SPACE (34); laststart = b; /* We test `*p == '^' twice, instead of using an if statement, so we only need one BUF_PUSH. */ BUF_PUSH (*p == '^' ? charset_not : charset); if (*p == '^') p++; /* Remember the first position in the bracket expression. */ p1 = p; /* Push the number of bytes in the bitmap. */ BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); /* Clear the whole map. */ bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); /* charset_not matches newline according to a syntax bit. */ if ((re_opcode_t) b[-2] == charset_not && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) SET_LIST_BIT ('\n'); /* Read in characters and ranges, setting map bits. */ for (;;) { if (p == pend) return REG_EBRACK; PATFETCH (c); /* \ might escape characters inside [...] and [^...]. */ if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') { if (p == pend) return REG_EESCAPE; PATFETCH (c1); SET_LIST_BIT (c1); continue; } /* Could be the end of the bracket expression. If it's not (i.e., when the bracket expression is `[]' so far), the ']' character bit gets set way below. */ if (c == ']' && p != p1 + 1) break; /* Look ahead to see if it's a range when the last thing was a character class. */ if (had_char_class && c == '-' && *p != ']') return REG_ERANGE; /* Look ahead to see if it's a range when the last thing was a character: if this is a hyphen not at the beginning or the end of a list, then it's the range operator. */ if (c == '-' && !(p - 2 >= pattern && p[-2] == '[') && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') && *p != ']') { reg_errcode_t ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) return ret; } else if (p[0] == '-' && p[1] != ']') { /* This handles ranges made up of characters only. */ reg_errcode_t ret; /* Move past the `-'. */ PATFETCH (c1); ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) return ret; } /* See if we're at the beginning of a possible character class. */ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') { /* Leave room for the null. */ char str[CHAR_CLASS_MAX_LENGTH + 1]; PATFETCH (c); c1 = 0; /* If pattern is `[[:'. */ if (p == pend) return REG_EBRACK; for (;;) { PATFETCH (c); if (c == ':' || c == ']' || p == pend || c1 == CHAR_CLASS_MAX_LENGTH) break; str[c1++] = c; } str[c1] = '\0'; /* If isn't a word bracketed by `[:' and:`]': undo the ending character, the letters, and leave the leading `:' and `[' (but set bits for them). */ if (c == ':' && *p == ']') { int ch; boolean is_alnum = STREQ (str, "alnum"); boolean is_alpha = STREQ (str, "alpha"); boolean is_blank = STREQ (str, "blank"); boolean is_cntrl = STREQ (str, "cntrl"); boolean is_digit = STREQ (str, "digit"); boolean is_graph = STREQ (str, "graph"); boolean is_lower = STREQ (str, "lower"); boolean is_print = STREQ (str, "print"); boolean is_punct = STREQ (str, "punct"); boolean is_space = STREQ (str, "space"); boolean is_upper = STREQ (str, "upper"); boolean is_xdigit = STREQ (str, "xdigit"); if (!IS_CHAR_CLASS (str)) return REG_ECTYPE; /* Throw away the ] at the end of the character class. */ PATFETCH (c); if (p == pend) return REG_EBRACK; for (ch = 0; ch < 1 << BYTEWIDTH; ch++) { if ( (is_alnum && ISALNUM (ch)) || (is_alpha && ISALPHA (ch)) || (is_blank && ISBLANK (ch)) || (is_cntrl && ISCNTRL (ch)) || (is_digit && ISDIGIT (ch)) || (is_graph && ISGRAPH (ch)) || (is_lower && ISLOWER (ch)) || (is_print && ISPRINT (ch)) || (is_punct && ISPUNCT (ch)) || (is_space && ISSPACE (ch)) || (is_upper && ISUPPER (ch)) || (is_xdigit && ISXDIGIT (ch))) SET_LIST_BIT (ch); } had_char_class = true; } else { c1++; while (c1--) PATUNFETCH; SET_LIST_BIT ('['); SET_LIST_BIT (':'); had_char_class = false; } } else { had_char_class = false; SET_LIST_BIT (c); } } /* Discard any (non)matching list bytes that are all 0 at the end of the map. Decrease the map-length byte too. */ while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) b[-1]--; b += b[-1]; } break; case '(': if (syntax & RE_NO_BK_PARENS) goto handle_open; else goto normal_char; case ')': if (syntax & RE_NO_BK_PARENS) goto handle_close; else goto normal_char; case '\n': if (syntax & RE_NEWLINE_ALT) goto handle_alt; else goto normal_char; case '|': if (syntax & RE_NO_BK_VBAR) goto handle_alt; else goto normal_char; case '{': if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) goto handle_interval; else goto normal_char; case '\\': if (p == pend) return REG_EESCAPE; /* Do not translate the character after the \, so that we can distinguish, e.g., \B from \b, even if we normally would translate, e.g., B to b. */ PATFETCH_RAW (c); switch (c) { case '(': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; handle_open: bufp->re_nsub++; regnum++; if (COMPILE_STACK_FULL) { RETALLOC (compile_stack.stack, compile_stack.size << 1, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size <<= 1; } /* These are the values to restore when we hit end of this group. They are all relative offsets, so that if the whole pattern moves because of realloc, they will still be valid. */ COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; COMPILE_STACK_TOP.fixup_alt_jump = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; COMPILE_STACK_TOP.regnum = regnum; /* We will eventually replace the 0 with the number of groups inner to this one. But do not push a start_memory for groups beyond the last one we can represent in the compiled pattern. */ if (regnum <= MAX_REGNUM) { COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; BUF_PUSH_3 (start_memory, regnum, 0); } compile_stack.avail++; fixup_alt_jump = 0; laststart = 0; begalt = b; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; break; case ')': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_backslash; else return REG_ERPAREN; } handle_close: if (fixup_alt_jump) { /* Push a dummy failure point at the end of the alternative for a possible future `pop_failure_jump' to pop. See comments at `push_dummy_failure' in `re_match_2'. */ BUF_PUSH (push_dummy_failure); /* We allocated space for this jump when we assigned to `fixup_alt_jump', in the `handle_alt' case below. */ STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); } /* See similar code for backslashed left paren above. */ if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_char; else return REG_ERPAREN; } /* Since we just checked for an empty stack above, this ``can't happen''. */ assert (compile_stack.avail != 0); { /* We don't just want to restore into `regnum', because later groups should continue to be numbered higher, as in `(ab)c(de)' -- the second group is #2. */ regnum_t this_group_regnum; compile_stack.avail--; begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; fixup_alt_jump = COMPILE_STACK_TOP.fixup_alt_jump ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 : 0; laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; this_group_regnum = COMPILE_STACK_TOP.regnum; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; /* We're at the end of the group, so now we know how many groups were inside this one. */ if (this_group_regnum <= MAX_REGNUM) { unsigned char *inner_group_loc = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; *inner_group_loc = regnum - this_group_regnum; BUF_PUSH_3 (stop_memory, this_group_regnum, regnum - this_group_regnum); } } break; case '|': /* `\|'. */ if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) goto normal_backslash; handle_alt: if (syntax & RE_LIMITED_OPS) goto normal_char; /* Insert before the previous alternative a jump which jumps to this alternative if the former fails. */ GET_BUFFER_SPACE (3); INSERT_JUMP (on_failure_jump, begalt, b + 6); pending_exact = 0; b += 3; /* The alternative before this one has a jump after it which gets executed if it gets matched. Adjust that jump so it will jump to this alternative's analogous jump (put in below, which in turn will jump to the next (if any) alternative's such jump, etc.). The last such jump jumps to the correct final destination. A picture: _____ _____ | | | | | v | v a | b | c If we are at `b', then fixup_alt_jump right now points to a three-byte space after `a'. We'll put in the jump, set fixup_alt_jump to right after `b', and leave behind three bytes which we'll fill in when we get to after `c'. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); /* Mark and leave space for a jump after this alternative, to be filled in later either by next alternative or when know we're at the end of a series of alternatives. */ fixup_alt_jump = b; GET_BUFFER_SPACE (3); b += 3; laststart = 0; begalt = b; break; case '{': /* If \{ is a literal. */ if (!(syntax & RE_INTERVALS) /* If we're at `\{' and it's not the open-interval operator. */ || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) || (p - 2 == pattern && p == pend)) goto normal_backslash; handle_interval: { /* If got here, then the syntax allows intervals. */ /* At least (most) this many matches must be made. */ int lower_bound = -1, upper_bound = -1; beg_interval = p - 1; if (p == pend) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_EBRACE; } GET_UNSIGNED_NUMBER (lower_bound); if (c == ',') { GET_UNSIGNED_NUMBER (upper_bound); if (upper_bound < 0) upper_bound = RE_DUP_MAX; } else /* Interval such as `{1}' => match exactly once. */ upper_bound = lower_bound; if (lower_bound < 0 || upper_bound > RE_DUP_MAX || lower_bound > upper_bound) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_BADBR; } if (!(syntax & RE_NO_BK_BRACES)) { if (c != '\\') return REG_EBRACE; PATFETCH (c); } if (c != '}') { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_BADBR; } /* We just parsed a valid interval. */ /* If it's invalid to have no preceding re. */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) return REG_BADRPT; else if (syntax & RE_CONTEXT_INDEP_OPS) laststart = b; else goto unfetch_interval; } /* If the upper bound is zero, don't want to succeed at all; jump from `laststart' to `b + 3', which will be the end of the buffer after we insert the jump. */ if (upper_bound == 0) { GET_BUFFER_SPACE (3); INSERT_JUMP (jump, laststart, b + 3); b += 3; } /* Otherwise, we have a nontrivial interval. When we're all done, the pattern will look like: set_number_at set_number_at succeed_n jump_n (The upper bound and `jump_n' are omitted if `upper_bound' is 1, though.) */ else { /* If the upper bound is > 1, we need to insert more at the end of the loop. */ unsigned nbytes = 10 + (upper_bound > 1) * 10; GET_BUFFER_SPACE (nbytes); /* Initialize lower bound of the `succeed_n', even though it will be set during matching by its attendant `set_number_at' (inserted next), because `re_compile_fastmap' needs to know. Jump to the `jump_n' we might insert below. */ INSERT_JUMP2 (succeed_n, laststart, b + 5 + (upper_bound > 1) * 5, lower_bound); b += 5; /* Code to initialize the lower bound. Insert before the `succeed_n'. The `5' is the last two bytes of this `set_number_at', plus 3 bytes of the following `succeed_n'. */ insert_op2 (set_number_at, laststart, 5, lower_bound, b); b += 5; if (upper_bound > 1) { /* More than one repetition is allowed, so append a backward jump to the `succeed_n' that starts this interval. When we've reached this during matching, we'll have matched the interval once, so jump back only `upper_bound - 1' times. */ STORE_JUMP2 (jump_n, b, laststart + 5, upper_bound - 1); b += 5; /* The location we want to set is the second parameter of the `jump_n'; that is `b-2' as an absolute address. `laststart' will be the `set_number_at' we're about to insert; `laststart+3' the number to set, the source for the relative address. But we are inserting into the middle of the pattern -- so everything is getting moved up by 5. Conclusion: (b - 2) - (laststart + 3) + 5, i.e., b - laststart. We insert this at the beginning of the loop so that if we fail during matching, we'll reinitialize the bounds. */ insert_op2 (set_number_at, laststart, b - laststart, upper_bound - 1, b); b += 5; } } pending_exact = 0; beg_interval = NULL; } break; unfetch_interval: /* If an invalid interval, match the characters as literals. */ assert (beg_interval); p = beg_interval; beg_interval = NULL; /* normal_char and normal_backslash need `c'. */ PATFETCH (c); if (!(syntax & RE_NO_BK_BRACES)) { if (p > pattern && p[-1] == '\\') goto normal_backslash; } goto normal_char; #ifdef emacs /* There is no way to specify the before_dot and after_dot operators. rms says this is ok. --karl */ case '=': BUF_PUSH (at_dot); break; case 's': laststart = b; PATFETCH (c); BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); break; case 'S': laststart = b; PATFETCH (c); BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); break; #endif /* emacs */ case 'w': laststart = b; BUF_PUSH (wordchar); break; case 'W': laststart = b; BUF_PUSH (notwordchar); break; case '<': BUF_PUSH (wordbeg); break; case '>': BUF_PUSH (wordend); break; case 'b': BUF_PUSH (wordbound); break; case 'B': BUF_PUSH (notwordbound); break; case '`': BUF_PUSH (begbuf); break; case '\'': BUF_PUSH (endbuf); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (syntax & RE_NO_BK_REFS) goto normal_char; c1 = c - '0'; if (c1 > regnum) return REG_ESUBREG; /* Can't back reference to a subexpression if inside of it. */ if (group_in_compile_stack (compile_stack, c1)) goto normal_char; laststart = b; BUF_PUSH_2 (duplicate, c1); break; case '+': case '?': if (syntax & RE_BK_PLUS_QM) goto handle_plus; else goto normal_backslash; default: normal_backslash: /* You might think it would be useful for \ to mean not to translate; but if we don't translate it it will never match anything. */ c = TRANSLATE (c); goto normal_char; } break; default: /* Expects the character in `c'. */ normal_char: /* If no exactn currently being built. */ if (!pending_exact /* If last exactn not at current position. */ || pending_exact + *pending_exact + 1 != b /* We have only one byte following the exactn for the count. */ || *pending_exact == (1 << BYTEWIDTH) - 1 /* If followed by a repetition operator. */ || *p == '*' || *p == '^' || ((syntax & RE_BK_PLUS_QM) ? *p == '\\' && (p[1] == '+' || p[1] == '?') : (*p == '+' || *p == '?')) || ((syntax & RE_INTERVALS) && ((syntax & RE_NO_BK_BRACES) ? *p == '{' : (p[0] == '\\' && p[1] == '{')))) { /* Start building a new exactn. */ laststart = b; BUF_PUSH_2 (exactn, 0); pending_exact = b - 1; } BUF_PUSH (c); (*pending_exact)++; break; } /* switch (c) */ } /* while p != pend */ /* Through the pattern now. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); if (!COMPILE_STACK_EMPTY) return REG_EPAREN; free (compile_stack.stack); /* We have succeeded; set the length of the buffer. */ bufp->used = b - bufp->buffer; #ifdef DEBUG if (debug) { DEBUG_PRINT1 ("\nCompiled pattern: "); print_compiled_pattern (bufp); } #endif /* DEBUG */ return REG_NOERROR; } /* regex_compile */ /* Subroutines for `regex_compile'. */ /* Store OP at LOC followed by two-byte integer parameter ARG. */ static void store_op1 (op, loc, arg) re_opcode_t op; unsigned char *loc; int arg; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg); } /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ static void store_op2 (op, loc, arg1, arg2) re_opcode_t op; unsigned char *loc; int arg1, arg2; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg1); STORE_NUMBER (loc + 3, arg2); } /* Copy the bytes from LOC to END to open up three bytes of space at LOC for OP followed by two-byte integer parameter ARG. */ static void insert_op1 (op, loc, arg, end) re_opcode_t op; unsigned char *loc; int arg; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 3; while (pfrom != loc) *--pto = *--pfrom; store_op1 (op, loc, arg); } /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ static void insert_op2 (op, loc, arg1, arg2, end) re_opcode_t op; unsigned char *loc; int arg1, arg2; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 5; while (pfrom != loc) *--pto = *--pfrom; store_op2 (op, loc, arg1, arg2); } /* P points to just after a ^ in PATTERN. Return true if that ^ comes after an alternative or a begin-subexpression. We assume there is at least one character before the ^. */ static boolean at_begline_loc_p (pattern, p, syntax) const char *pattern, *p; reg_syntax_t syntax; { const char *prev = p - 2; boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; return /* After a subexpression? */ (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) /* After an alternative? */ || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); } /* The dual of at_begline_loc_p. This one is for $. We assume there is at least one character after the $, i.e., `P < PEND'. */ static boolean at_endline_loc_p (p, pend, syntax) const char *p, *pend; int syntax; { const char *next = p; boolean next_backslash = *next == '\\'; const char *next_next = p + 1 < pend ? p + 1 : NULL; return /* Before a subexpression? */ (syntax & RE_NO_BK_PARENS ? *next == ')' : next_backslash && next_next && *next_next == ')') /* Before an alternative? */ || (syntax & RE_NO_BK_VBAR ? *next == '|' : next_backslash && next_next && *next_next == '|'); } /* Returns true if REGNUM is in one of COMPILE_STACK's elements and false if it's not. */ static boolean group_in_compile_stack (compile_stack, regnum) compile_stack_type compile_stack; regnum_t regnum; { int this_element; for (this_element = compile_stack.avail - 1; this_element >= 0; this_element--) if (compile_stack.stack[this_element].regnum == regnum) return true; return false; } /* Read the ending character of a range (in a bracket expression) from the uncompiled pattern *P_PTR (which ends at PEND). We assume the starting character is in `P[-2]'. (`P[-1]' is the character `-'.) Then we set the translation of all bits between the starting and ending characters (inclusive) in the compiled pattern B. Return an error code. We use these short variable names so we can use the same macros as `regex_compile' itself. */ static reg_errcode_t compile_range (p_ptr, pend, translate, syntax, b) const char **p_ptr, *pend; char *translate; reg_syntax_t syntax; unsigned char *b; { unsigned this_char; const char *p = *p_ptr; int range_start, range_end; if (p == pend) return REG_ERANGE; /* Even though the pattern is a signed `char *', we need to fetch with unsigned char *'s; if the high bit of the pattern character is set, the range endpoints will be negative if we fetch using a signed char *. We also want to fetch the endpoints without translating them; the appropriate translation is done in the bit-setting loop below. */ range_start = ((unsigned char *) p)[-2]; range_end = ((unsigned char *) p)[0]; /* Have to increment the pointer into the pattern string, so the caller isn't still at the ending character. */ (*p_ptr)++; /* If the start is after the end, the range is empty. */ if (range_start > range_end) return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; /* Here we see why `this_char' has to be larger than an `unsigned char' -- the range is inclusive, so if `range_end' == 0xff (assuming 8-bit characters), we would otherwise go into an infinite loop, since all characters <= 0xff. */ for (this_char = range_start; this_char <= range_end; this_char++) { SET_LIST_BIT (TRANSLATE (this_char)); } return REG_NOERROR; } /* Failure stack declarations and macros; both re_compile_fastmap and re_match_2 use a failure stack. These have to be macros because of REGEX_ALLOCATE. */ /* Number of failure points for which to initially allocate space when matching. If this number is exceeded, we allocate more space, so it is not a hard limit. */ #ifndef INIT_FAILURE_ALLOC #define INIT_FAILURE_ALLOC 5 #endif /* Roughly the maximum number of failure points on the stack. Would be exactly that if always used MAX_FAILURE_SPACE each time we failed. This is a variable only so users of regex can assign to it; we never change it ourselves. */ int re_max_failures = 2000; typedef const unsigned char *fail_stack_elt_t; typedef struct { fail_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } fail_stack_type; #define FAIL_STACK_EMPTY() (fail_stack.avail == 0) #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) #define FAIL_STACK_TOP() (fail_stack.stack[fail_stack.avail]) /* Initialize `fail_stack'. Do `return -2' if the alloc fails. */ #define INIT_FAIL_STACK() \ do { \ fail_stack.stack = (fail_stack_elt_t *) \ REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \ \ if (fail_stack.stack == NULL) \ return -2; \ \ fail_stack.size = INIT_FAILURE_ALLOC; \ fail_stack.avail = 0; \ } while (0) /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. Return 1 if succeeds, and 0 if either ran out of memory allocating space for it or it was already too large. REGEX_REALLOCATE requires `destination' be declared. */ #define DOUBLE_FAIL_STACK(fail_stack) \ ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS \ ? 0 \ : ((fail_stack).stack = (fail_stack_elt_t *) \ REGEX_REALLOCATE ((fail_stack).stack, \ (fail_stack).size * sizeof (fail_stack_elt_t), \ ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \ \ (fail_stack).stack == NULL \ ? 0 \ : ((fail_stack).size <<= 1, \ 1))) /* Push PATTERN_OP on FAIL_STACK. Return 1 if was able to do so and 0 if ran out of memory allocating space to do so. */ #define PUSH_PATTERN_OP(pattern_op, fail_stack) \ ((FAIL_STACK_FULL () \ && !DOUBLE_FAIL_STACK (fail_stack)) \ ? 0 \ : ((fail_stack).stack[(fail_stack).avail++] = pattern_op, \ 1)) /* This pushes an item onto the failure stack. Must be a four-byte value. Assumes the variable `fail_stack'. Probably should only be called from within `PUSH_FAILURE_POINT'. */ #define PUSH_FAILURE_ITEM(item) \ fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item /* The complement operation. Assumes `fail_stack' is nonempty. */ #define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail] /* Used to omit pushing failure point id's when we're not debugging. */ #ifdef DEBUG #define DEBUG_PUSH PUSH_FAILURE_ITEM #define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM () #else #define DEBUG_PUSH(item) #define DEBUG_POP(item_addr) #endif /* Push the information about the state we will need if we ever fail back to it. Requires variables fail_stack, regstart, regend, reg_info, and num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be declared. Does `return FAILURE_CODE' if runs out of memory. */ #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ do { \ char *destination; \ /* Must be int, so when we don't save any registers, the arithmetic \ of 0 + -1 isn't done as unsigned. */ \ int this_reg; \ \ DEBUG_STATEMENT (failure_id++); \ DEBUG_STATEMENT (nfailure_points_pushed++); \ DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ \ DEBUG_PRINT2 (" slots needed: %d\n", NUM_FAILURE_ITEMS); \ DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ \ /* Ensure we have enough space allocated for what we will push. */ \ while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ { \ if (!DOUBLE_FAIL_STACK (fail_stack)) \ return failure_code; \ \ DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ (fail_stack).size); \ DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ } \ \ /* Push the info, starting with the registers. */ \ DEBUG_PRINT1 ("\n"); \ \ for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ this_reg++) \ { \ DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \ DEBUG_STATEMENT (num_regs_pushed++); \ \ DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ PUSH_FAILURE_ITEM (regstart[this_reg]); \ \ DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ PUSH_FAILURE_ITEM (regend[this_reg]); \ \ DEBUG_PRINT2 (" info: 0x%x\n ", reg_info[this_reg]); \ DEBUG_PRINT2 (" match_null=%d", \ REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ DEBUG_PRINT2 (" matched_something=%d", \ MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT2 (" ever_matched=%d", \ EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT1 ("\n"); \ PUSH_FAILURE_ITEM (reg_info[this_reg].word); \ } \ \ DEBUG_PRINT2 (" Pushing low active reg: %d\n", lowest_active_reg);\ PUSH_FAILURE_ITEM (lowest_active_reg); \ \ DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg);\ PUSH_FAILURE_ITEM (highest_active_reg); \ \ DEBUG_PRINT2 (" Pushing pattern 0x%x: ", pattern_place); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ PUSH_FAILURE_ITEM (pattern_place); \ \ DEBUG_PRINT2 (" Pushing string 0x%x: `", string_place); \ DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ size2); \ DEBUG_PRINT1 ("'\n"); \ PUSH_FAILURE_ITEM (string_place); \ \ DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ DEBUG_PUSH (failure_id); \ } while (0) /* This is the number of items that are pushed and popped on the stack for each register. */ #define NUM_REG_ITEMS 3 /* Individual items aside from the registers. */ #ifdef DEBUG #define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ #else #define NUM_NONREG_ITEMS 4 #endif /* We push at most this many items on the stack. */ #define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS) /* We actually push this many items. */ #define NUM_FAILURE_ITEMS \ ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS \ + NUM_NONREG_ITEMS) /* How many items can still be added to the stack without overflowing it. */ #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) /* Pops what PUSH_FAIL_STACK pushes. We restore into the parameters, all of which should be lvalues: STR -- the saved data position. PAT -- the saved pattern position. LOW_REG, HIGH_REG -- the highest and lowest active registers. REGSTART, REGEND -- arrays of string positions. REG_INFO -- array of information about each subexpression. Also assumes the variables `fail_stack' and (if debugging), `bufp', `pend', `string1', `size1', `string2', and `size2'. */ #define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ { \ DEBUG_STATEMENT (fail_stack_elt_t failure_id;) \ int this_reg; \ const unsigned char *string_temp; \ \ assert (!FAIL_STACK_EMPTY ()); \ \ /* Remove failure points and point to how many regs pushed. */ \ DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ \ assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ \ DEBUG_POP (&failure_id); \ DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ \ /* If the saved string location is NULL, it came from an \ on_failure_keep_string_jump opcode, and we want to throw away the \ saved NULL, thus retaining our current position in the string. */ \ string_temp = POP_FAILURE_ITEM (); \ if (string_temp != NULL) \ str = (const char *) string_temp; \ \ DEBUG_PRINT2 (" Popping string 0x%x: `", str); \ DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ DEBUG_PRINT1 ("'\n"); \ \ pat = (unsigned char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping pattern 0x%x: ", pat); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ \ /* Restore register info. */ \ high_reg = (unsigned) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping high active reg: %d\n", high_reg); \ \ low_reg = (unsigned) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \ \ for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ { \ DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \ \ reg_info[this_reg].word = POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" info: 0x%x\n", reg_info[this_reg]); \ \ regend[this_reg] = (const char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ \ regstart[this_reg] = (const char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ } \ \ DEBUG_STATEMENT (nfailure_points_popped++); \ } /* POP_FAILURE_POINT */ /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible characters can start a string that matches the pattern. This fastmap is used by re_search to skip quickly over impossible starting points. The caller must supply the address of a (1 << BYTEWIDTH)-byte data area as BUFP->fastmap. We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in the pattern buffer. Returns 0 if we succeed, -2 if an internal error. */ int re_compile_fastmap (bufp) struct re_pattern_buffer *bufp; { int j, k; fail_stack_type fail_stack; #ifndef REGEX_MALLOC char *destination; #endif /* We don't push any register information onto the failure stack. */ unsigned num_regs = 0; register char *fastmap = bufp->fastmap; unsigned char *pattern = bufp->buffer; unsigned long size = bufp->used; const unsigned char *p = pattern; register unsigned char *pend = pattern + size; /* Assume that each path through the pattern can be null until proven otherwise. We set this false at the bottom of switch statement, to which we get only if a particular path doesn't match the empty string. */ boolean path_can_be_null = true; /* We aren't doing a `succeed_n' to begin with. */ boolean succeed_n_p = false; assert (fastmap != NULL && p != NULL); INIT_FAIL_STACK (); bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ bufp->fastmap_accurate = 1; /* It will be when we're done. */ bufp->can_be_null = 0; while (p != pend || !FAIL_STACK_EMPTY ()) { if (p == pend) { bufp->can_be_null |= path_can_be_null; /* Reset for next path. */ path_can_be_null = true; p = fail_stack.stack[--fail_stack.avail]; } /* We should never be about to go beyond the end of the pattern. */ assert (p < pend); #ifdef SWITCH_ENUM_BUG switch ((int) ((re_opcode_t) *p++)) #else switch ((re_opcode_t) *p++) #endif { /* I guess the idea here is to simply not bother with a fastmap if a backreference is used, since it's too hard to figure out the fastmap for the corresponding group. Setting `can_be_null' stops `re_search_2' from using the fastmap, so that is all we do. */ case duplicate: bufp->can_be_null = 1; return 0; /* Following are the cases which match a character. These end with `break'. */ case exactn: fastmap[p[1]] = 1; break; case charset: for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) fastmap[j] = 1; break; case charset_not: /* Chars beyond end of map must be allowed. */ for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) fastmap[j] = 1; break; case wordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == Sword) fastmap[j] = 1; break; case notwordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != Sword) fastmap[j] = 1; break; case anychar: /* `.' matches anything ... */ for (j = 0; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; /* ... except perhaps newline. */ if (!(bufp->syntax & RE_DOT_NEWLINE)) fastmap['\n'] = 0; /* Return if we have already set `can_be_null'; if we have, then the fastmap is irrelevant. Something's wrong here. */ else if (bufp->can_be_null) return 0; /* Otherwise, have to check alternative paths. */ break; #ifdef emacs case syntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == (enum syntaxcode) k) fastmap[j] = 1; break; case notsyntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != (enum syntaxcode) k) fastmap[j] = 1; break; /* All cases after this match the empty string. These end with `continue'. */ case before_dot: case at_dot: case after_dot: continue; #endif /* not emacs */ case no_op: case begline: case endline: case begbuf: case endbuf: case wordbound: case notwordbound: case wordbeg: case wordend: case push_dummy_failure: continue; case jump_n: case pop_failure_jump: case maybe_pop_jump: case jump: case jump_past_alt: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); p += j; if (j > 0) continue; /* Jump backward implies we just went through the body of a loop and matched nothing. Opcode jumped to should be `on_failure_jump' or `succeed_n'. Just treat it like an ordinary jump. For a * loop, it has pushed its failure point already; if so, discard that as redundant. */ if ((re_opcode_t) *p != on_failure_jump && (re_opcode_t) *p != succeed_n) continue; p++; EXTRACT_NUMBER_AND_INCR (j, p); p += j; /* If what's on the stack is where we are now, pop it. */ if (!FAIL_STACK_EMPTY () && fail_stack.stack[fail_stack.avail - 1] == p) fail_stack.avail--; continue; case on_failure_jump: case on_failure_keep_string_jump: handle_on_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); /* For some patterns, e.g., `(a?)?', `p+j' here points to the end of the pattern. We don't want to push such a point, since when we restore it above, entering the switch will increment `p' past the end of the pattern. We don't need to push such a point since we obviously won't find any more fastmap entries beyond `pend'. Such a pattern can match the null string, though. */ if (p + j < pend) { if (!PUSH_PATTERN_OP (p + j, fail_stack)) return -2; } else bufp->can_be_null = 1; if (succeed_n_p) { EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ succeed_n_p = false; } continue; case succeed_n: /* Get to the number of times to succeed. */ p += 2; /* Increment p past the n for when k != 0. */ EXTRACT_NUMBER_AND_INCR (k, p); if (k == 0) { p -= 4; succeed_n_p = true; /* Spaghetti code alert. */ goto handle_on_failure_jump; } continue; case set_number_at: p += 4; continue; case start_memory: case stop_memory: p += 2; continue; default: abort (); /* We have listed all the cases. */ } /* switch *p++ */ /* Getting here means we have found the possible starting characters for one path of the pattern -- and that the empty string does not match. We need not follow this path further. Instead, look at the next alternative (remembered on the stack), or quit if no more. The test at the top of the loop does these things. */ path_can_be_null = false; p = pend; } /* while p */ /* Set `can_be_null' for the last path (also the first path, if the pattern is empty). */ bufp->can_be_null |= path_can_be_null; return 0; } /* re_compile_fastmap */ /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated using the malloc library routine, and must each be at least NUM_REGS * sizeof (regoff_t) bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ void re_set_registers (bufp, regs, num_regs, starts, ends) struct re_pattern_buffer *bufp; struct re_registers *regs; unsigned num_regs; regoff_t *starts, *ends; { if (num_regs) { bufp->regs_allocated = REGS_REALLOCATE; regs->num_regs = num_regs; regs->start = starts; regs->end = ends; } else { bufp->regs_allocated = REGS_UNALLOCATED; regs->num_regs = 0; regs->start = regs->end = (regoff_t *) 0; } } /* Searching routines. */ /* Like re_search_2, below, but only one string is specified, and doesn't let you say where to stop matching. */ int re_search (bufp, string, size, startpos, range, regs) struct re_pattern_buffer *bufp; const char *string; int size, startpos, range; struct re_registers *regs; { return re_search_2 (bufp, NULL, 0, string, size, startpos, range, regs, size); } /* Using the compiled pattern in BUFP->buffer, first tries to match the virtual concatenation of STRING1 and STRING2, starting first at index STARTPOS, then at STARTPOS + 1, and so on. STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. RANGE is how far to scan while trying to match. RANGE = 0 means try only at STARTPOS; in general, the last start tried is STARTPOS + RANGE. In REGS, return the indices of the virtual concatenation of STRING1 and STRING2 that matched the entire BUFP->buffer and its contained subexpressions. Do not consider matching one past the index STOP in the virtual concatenation of STRING1 and STRING2. We return either the position in the strings at which the match was found, -1 if no match, or -2 if error (such as failure stack overflow). */ int re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int startpos; int range; struct re_registers *regs; int stop; { int val; register char *fastmap = bufp->fastmap; register char *translate = bufp->translate; int total_size = size1 + size2; int endpos = startpos + range; /* Check for out-of-range STARTPOS. */ if (startpos < 0 || startpos > total_size) return -1; /* Fix up RANGE if it might eventually take us outside the virtual concatenation of STRING1 and STRING2. */ if (endpos < -1) range = -1 - startpos; else if (endpos > total_size) range = total_size - startpos; /* If the search isn't to be a backwards one, don't waste time in a search for a pattern that must be anchored. */ if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0) { if (startpos > 0) return -1; else range = 1; } /* Update the fastmap now if not correct already. */ if (fastmap && !bufp->fastmap_accurate) if (re_compile_fastmap (bufp) == -2) return -2; /* Loop through the string, looking for a place to start matching. */ for (;;) { /* If a fastmap is supplied, skip quickly over characters that cannot be the start of a match. If the pattern can match the null string, however, we don't need to skip characters; we want the first null string. */ if (fastmap && startpos < total_size && !bufp->can_be_null) { if (range > 0) /* Searching forwards. */ { register const char *d; register int lim = 0; int irange = range; if (startpos < size1 && startpos + range >= size1) lim = range - (size1 - startpos); d = (startpos >= size1 ? string2 - size1 : string1) + startpos; /* Written out as an if-else to avoid testing `translate' inside the loop. */ if (translate) while (range > lim && !fastmap[(unsigned char) translate[(unsigned char) *d++]]) range--; else while (range > lim && !fastmap[(unsigned char) *d++]) range--; startpos += irange - range; } else /* Searching backwards. */ { register char c = (size1 == 0 || startpos >= size1 ? string2[startpos - size1] : string1[startpos]); if (!fastmap[(unsigned char) TRANSLATE (c)]) goto advance; } } /* If can't match the null string, and that's all we have left, fail. */ if (range >= 0 && startpos == total_size && fastmap && !bufp->can_be_null) return -1; val = re_match_2 (bufp, string1, size1, string2, size2, startpos, regs, stop); if (val >= 0) return startpos; if (val == -2) return -2; advance: if (!range) break; else if (range > 0) { range--; startpos++; } else { range++; startpos--; } } return -1; } /* re_search_2 */ /* Declarations and macros for re_match_2. */ static int bcmp_translate (); static boolean alt_match_null_string_p (), common_op_match_null_string_p (), group_match_null_string_p (); /* Structure for per-register (a.k.a. per-group) information. This must not be longer than one word, because we push this value onto the failure stack. Other register information, such as the starting and ending positions (which are addresses), and the list of inner groups (which is a bits list) are maintained in separate variables. We are making a (strictly speaking) nonportable assumption here: that the compiler will pack our bit fields into something that fits into the type of `word', i.e., is something that fits into one item on the failure stack. */ typedef union { fail_stack_elt_t word; struct { /* This field is one if this group can match the empty string, zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ #define MATCH_NULL_UNSET_VALUE 3 unsigned match_null_string_p : 2; unsigned is_active : 1; unsigned matched_something : 1; unsigned ever_matched_something : 1; } bits; } register_info_type; #define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) #define IS_ACTIVE(R) ((R).bits.is_active) #define MATCHED_SOMETHING(R) ((R).bits.matched_something) #define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) /* Call this when have matched a real character; it sets `matched' flags for the subexpressions which we are currently inside. Also records that those subexprs have matched. */ #define SET_REGS_MATCHED() \ do \ { \ unsigned r; \ for (r = lowest_active_reg; r <= highest_active_reg; r++) \ { \ MATCHED_SOMETHING (reg_info[r]) \ = EVER_MATCHED_SOMETHING (reg_info[r]) \ = 1; \ } \ } \ while (0) /* This converts PTR, a pointer into one of the search strings `string1' and `string2' into an offset from the beginning of that string. */ #define POINTER_TO_OFFSET(ptr) \ (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1) /* Registers are set to a sentinel when they haven't yet matched. */ #define REG_UNSET_VALUE ((char *) -1) #define REG_UNSET(e) ((e) == REG_UNSET_VALUE) /* Macros for dealing with the split strings in re_match_2. */ #define MATCHING_IN_FIRST_STRING (dend == end_match_1) /* Call before fetching a character with *d. This switches over to string2 if necessary. */ #define PREFETCH() \ while (d == dend) \ { \ /* End of string2 => fail. */ \ if (dend == end_match_2) \ goto fail; \ /* End of string1 => advance to string2. */ \ d = string2; \ dend = end_match_2; \ } /* Test if at very beginning or at very end of the virtual concatenation of `string1' and `string2'. If only one string, it's `string2'. */ #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) #define AT_STRINGS_END(d) ((d) == end2) /* Test if D points to a character which is word-constituent. We have two special cases to check for: if past the end of string1, look at the first character in string2; and if before the beginning of string2, look at the last character in string1. */ #define WORDCHAR_P(d) \ (SYNTAX ((d) == end1 ? *string2 \ : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ == Sword) /* Test if the character before D and the one at D differ with respect to being word-constituent. */ #define AT_WORD_BOUNDARY(d) \ (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) /* Free everything we malloc. */ #ifdef REGEX_MALLOC #define FREE_VAR(var) if (var) free (var); var = NULL #define FREE_VARIABLES() \ do { \ FREE_VAR (fail_stack.stack); \ FREE_VAR (regstart); \ FREE_VAR (regend); \ FREE_VAR (old_regstart); \ FREE_VAR (old_regend); \ FREE_VAR (best_regstart); \ FREE_VAR (best_regend); \ FREE_VAR (reg_info); \ FREE_VAR (reg_dummy); \ FREE_VAR (reg_info_dummy); \ } while (0) #else /* not REGEX_MALLOC */ /* Some MIPS systems (at least) want this to free alloca'd storage. */ #define FREE_VARIABLES() alloca (0) #endif /* not REGEX_MALLOC */ /* These values must meet several constraints. They must not be valid register values; since we have a limit of 255 registers (because we use only one byte in the pattern for the register number), we can use numbers larger than 255. They must differ by 1, because of NUM_FAILURE_ITEMS above. And the value for the lowest register must be larger than the value for the highest register, so we do not try to actually save any registers when none are active. */ #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) /* Matching routines. */ #ifndef emacs /* Emacs never uses this. */ /* re_match is like re_match_2 except it takes only a single string. */ int re_match (bufp, string, size, pos, regs) struct re_pattern_buffer *bufp; const char *string; int size, pos; struct re_registers *regs; { return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); } #endif /* not emacs */ /* re_match_2 matches the compiled pattern in BUFP against the the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 and SIZE2, respectively). We start matching at POS, and stop matching at STOP. If REGS is non-null and the `no_sub' field of BUFP is nonzero, we store offsets for the substring each group matched in REGS. See the documentation for exactly how many groups we fill. We return -1 if no match, -2 if an internal error (such as the failure stack overflowing). Otherwise, we return the length of the matched substring. */ int re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int pos; struct re_registers *regs; int stop; { /* General temporaries. */ int mcnt; unsigned char *p1; /* Just past the end of the corresponding string. */ const char *end1, *end2; /* Pointers into string1 and string2, just past the last characters in each to consider matching. */ const char *end_match_1, *end_match_2; /* Where we are in the data, and the end of the current string. */ const char *d, *dend; /* Where we are in the pattern, and the end of the pattern. */ unsigned char *p = bufp->buffer; register unsigned char *pend = p + bufp->used; /* We use this to map every character in the string. */ char *translate = bufp->translate; /* Failure point stack. Each place that can handle a failure further down the line pushes a failure point on this stack. It consists of restart, regend, and reg_info for all registers corresponding to the subexpressions we're currently inside, plus the number of such registers, and, finally, two char *'s. The first char * is where to resume scanning the pattern; the second one is where to resume scanning the strings. If the latter is zero, the failure point is a ``dummy''; if a failure happens and the failure point is a dummy, it gets discarded and the next next one is tried. */ fail_stack_type fail_stack; #ifdef DEBUG static unsigned failure_id = 0; unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; #endif /* We fill all the registers internally, independent of what we return, for use in backreferences. The number here includes an element for register zero. */ unsigned num_regs = bufp->re_nsub + 1; /* The currently active registers. */ unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG; unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG; /* Information on the contents of registers. These are pointers into the input strings; they record just what was matched (on this attempt) by a subexpression part of the pattern, that is, the regnum-th regstart pointer points to where in the pattern we began matching and the regnum-th regend points to right after where we stopped matching the regnum-th subexpression. (The zeroth register keeps track of what the whole pattern matches.) */ const char **regstart = NULL, **regend = NULL; /* If a group that's operated upon by a repetition operator fails to match anything, then the register for its start will need to be restored because it will have been set to wherever in the string we are when we last see its open-group operator. Similarly for a register's end. */ const char **old_regstart = NULL, **old_regend = NULL; /* The is_active field of reg_info helps us keep track of which (possibly nested) subexpressions we are currently in. The matched_something field of reg_info[reg_num] helps us tell whether or not we have matched any of the pattern so far this time through the reg_num-th subexpression. These two fields get reset each time through any loop their register is in. */ register_info_type *reg_info = NULL; /* The following record the register info as found in the above variables when we find a match better than any we've seen before. This happens as we backtrack through the failure points, which in turn happens only if we have not yet matched the entire string. */ unsigned best_regs_set = false; const char **best_regstart = NULL, **best_regend = NULL; /* Logically, this is `best_regend[0]'. But we don't want to have to allocate space for that if we're not allocating space for anything else (see below). Also, we never need info about register 0 for any of the other register vectors, and it seems rather a kludge to treat `best_regend' differently than the rest. So we keep track of the end of the best match so far in a separate variable. We initialize this to NULL so that when we backtrack the first time and need to test it, it's not garbage. */ const char *match_end = NULL; /* Used when we pop values we don't care about. */ const char **reg_dummy = NULL; register_info_type *reg_info_dummy = NULL; #ifdef DEBUG /* Counts the total number of registers pushed. */ unsigned num_regs_pushed = 0; #endif DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); INIT_FAIL_STACK (); /* Do not bother to initialize all the register variables if there are no groups in the pattern, as it takes a fair amount of time. If there are groups, we include space for register 0 (the whole pattern), even though we never use it, since it simplifies the array indexing. We should fix this. */ if (bufp->re_nsub) { regstart = REGEX_TALLOC (num_regs, const char *); regend = REGEX_TALLOC (num_regs, const char *); old_regstart = REGEX_TALLOC (num_regs, const char *); old_regend = REGEX_TALLOC (num_regs, const char *); best_regstart = REGEX_TALLOC (num_regs, const char *); best_regend = REGEX_TALLOC (num_regs, const char *); reg_info = REGEX_TALLOC (num_regs, register_info_type); reg_dummy = REGEX_TALLOC (num_regs, const char *); reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); if (!(regstart && regend && old_regstart && old_regend && reg_info && best_regstart && best_regend && reg_dummy && reg_info_dummy)) { FREE_VARIABLES (); return -2; } } #ifdef REGEX_MALLOC else { /* We must initialize all our variables to NULL, so that `FREE_VARIABLES' doesn't try to free them. */ regstart = regend = old_regstart = old_regend = best_regstart = best_regend = reg_dummy = NULL; reg_info = reg_info_dummy = (register_info_type *) NULL; } #endif /* REGEX_MALLOC */ /* The starting position is bogus. */ if (pos < 0 || pos > size1 + size2) { FREE_VARIABLES (); return -1; } /* Initialize subexpression text positions to -1 to mark ones that no start_memory/stop_memory has been seen for. Also initialize the register information struct. */ for (mcnt = 1; mcnt < num_regs; mcnt++) { regstart[mcnt] = regend[mcnt] = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; IS_ACTIVE (reg_info[mcnt]) = 0; MATCHED_SOMETHING (reg_info[mcnt]) = 0; EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; } /* We move `string1' into `string2' if the latter's empty -- but not if `string1' is null. */ if (size2 == 0 && string1 != NULL) { string2 = string1; size2 = size1; string1 = 0; size1 = 0; } end1 = string1 + size1; end2 = string2 + size2; /* Compute where to stop matching, within the two strings. */ if (stop <= size1) { end_match_1 = string1 + stop; end_match_2 = string2; } else { end_match_1 = end1; end_match_2 = string2 + stop - size1; } /* `p' scans through the pattern as `d' scans through the data. `dend' is the end of the input string that `d' points within. `d' is advanced into the following input string whenever necessary, but this happens before fetching; therefore, at the beginning of the loop, `d' can be pointing at the end of a string, but it cannot equal `string2'. */ if (size1 > 0 && pos <= size1) { d = string1 + pos; dend = end_match_1; } else { d = string2 + pos - size1; dend = end_match_2; } DEBUG_PRINT1 ("The compiled pattern is: "); DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); DEBUG_PRINT1 ("The string to match is: `"); DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); DEBUG_PRINT1 ("'\n"); /* This loops over pattern commands. It exits by returning from the function if the match is complete, or it drops through if the match fails at this starting point in the input data. */ for (;;) { DEBUG_PRINT2 ("\n0x%x: ", p); if (p == pend) { /* End of pattern means we might have succeeded. */ DEBUG_PRINT1 ("end of pattern ... "); /* If we haven't matched the entire string, and we want the longest match, try backtracking. */ if (d != end_match_2) { DEBUG_PRINT1 ("backtracking.\n"); if (!FAIL_STACK_EMPTY ()) { /* More failure points to try. */ boolean same_str_p = (FIRST_STRING_P (match_end) == MATCHING_IN_FIRST_STRING); /* If exceeds best match so far, save it. */ if (!best_regs_set || (same_str_p && d > match_end) || (!same_str_p && !MATCHING_IN_FIRST_STRING)) { best_regs_set = true; match_end = d; DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); for (mcnt = 1; mcnt < num_regs; mcnt++) { best_regstart[mcnt] = regstart[mcnt]; best_regend[mcnt] = regend[mcnt]; } } goto fail; } /* If no failure points, don't restore garbage. */ else if (best_regs_set) { restore_best_regs: /* Restore best match. It may happen that `dend == end_match_1' while the restored d is in string2. For example, the pattern `x.*y.*z' against the strings `x-' and `y-z-', if the two strings are not consecutive in memory. */ DEBUG_PRINT1 ("Restoring best registers.\n"); d = match_end; dend = ((d >= string1 && d <= end1) ? end_match_1 : end_match_2); for (mcnt = 1; mcnt < num_regs; mcnt++) { regstart[mcnt] = best_regstart[mcnt]; regend[mcnt] = best_regend[mcnt]; } } } /* d != end_match_2 */ DEBUG_PRINT1 ("Accepting match.\n"); /* If caller wants register contents data back, do it. */ if (regs && !bufp->no_sub) { /* Have the register data arrays been allocated? */ if (bufp->regs_allocated == REGS_UNALLOCATED) { /* No. So allocate them with malloc. We need one extra element beyond `num_regs' for the `-1' marker GNU code uses. */ regs->num_regs = MAX (RE_NREGS, num_regs + 1); regs->start = TALLOC (regs->num_regs, regoff_t); regs->end = TALLOC (regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) return -2; bufp->regs_allocated = REGS_REALLOCATE; } else if (bufp->regs_allocated == REGS_REALLOCATE) { /* Yes. If we need more elements than were already allocated, reallocate them. If we need fewer, just leave it alone. */ if (regs->num_regs < num_regs + 1) { regs->num_regs = num_regs + 1; RETALLOC (regs->start, regs->num_regs, regoff_t); RETALLOC (regs->end, regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) return -2; } } else assert (bufp->regs_allocated == REGS_FIXED); /* Convert the pointer data in `regstart' and `regend' to indices. Register zero has to be set differently, since we haven't kept track of any info for it. */ if (regs->num_regs > 0) { regs->start[0] = pos; regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1 : d - string2 + size1); } /* Go through the first `min (num_regs, regs->num_regs)' registers, since that is all we initialized. */ for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++) { if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) regs->start[mcnt] = regs->end[mcnt] = -1; else { regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]); regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]); } } /* If the regs structure we return has more elements than were in the pattern, set the extra elements to -1. If we (re)allocated the registers, this is the case, because we always allocate enough to have at least one -1 at the end. */ for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++) regs->start[mcnt] = regs->end[mcnt] = -1; } /* regs && !bufp->no_sub */ FREE_VARIABLES (); DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", nfailure_points_pushed, nfailure_points_popped, nfailure_points_pushed - nfailure_points_popped); DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); mcnt = d - pos - (MATCHING_IN_FIRST_STRING ? string1 : string2 - size1); DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); return mcnt; } /* Otherwise match next pattern command. */ #ifdef SWITCH_ENUM_BUG switch ((int) ((re_opcode_t) *p++)) #else switch ((re_opcode_t) *p++) #endif { /* Ignore these. Used to ignore the n of succeed_n's which currently have n == 0. */ case no_op: DEBUG_PRINT1 ("EXECUTING no_op.\n"); break; /* Match the next n pattern characters exactly. The following byte in the pattern defines n, and the n bytes after that are the characters to match. */ case exactn: mcnt = *p++; DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); /* This is written out as an if-else so we don't waste time testing `translate' inside the loop. */ if (translate) { do { PREFETCH (); if (translate[(unsigned char) *d++] != (char) *p++) goto fail; } while (--mcnt); } else { do { PREFETCH (); if (*d++ != (char) *p++) goto fail; } while (--mcnt); } SET_REGS_MATCHED (); break; /* Match any character except possibly a newline or a null. */ case anychar: DEBUG_PRINT1 ("EXECUTING anychar.\n"); PREFETCH (); if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) goto fail; SET_REGS_MATCHED (); DEBUG_PRINT2 (" Matched `%d'.\n", *d); d++; break; case charset: case charset_not: { register unsigned char c; boolean not = (re_opcode_t) *(p - 1) == charset_not; DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); PREFETCH (); c = TRANSLATE (*d); /* The character to match. */ /* Cast to `unsigned' instead of `unsigned char' in case the bit list is a full 32 bytes long. */ if (c < (unsigned) (*p * BYTEWIDTH) && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; p += 1 + *p; if (!not) goto fail; SET_REGS_MATCHED (); d++; break; } /* The beginning of a group is represented by start_memory. The arguments are the register number in the next byte, and the number of groups inner to this one in the next. The text matched within the group is recorded (in the internal registers data structure) under the register number. */ case start_memory: DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]); /* Find out if this group can match the empty string. */ p1 = p; /* To send to group_match_null_string_p. */ if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[*p]) = group_match_null_string_p (&p1, pend, reg_info); /* Save the position in the string where we were the last time we were at this open-group operator in case the group is operated upon by a repetition operator, e.g., with `(a*)*b' against `ab'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regstart[*p]) ? d : regstart[*p] : regstart[*p]; DEBUG_PRINT2 (" old_regstart: %d\n", POINTER_TO_OFFSET (old_regstart[*p])); regstart[*p] = d; DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); IS_ACTIVE (reg_info[*p]) = 1; MATCHED_SOMETHING (reg_info[*p]) = 0; /* This is the new highest active register. */ highest_active_reg = *p; /* If nothing was active before, this is the new lowest active register. */ if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *p; /* Move past the register number and inner group count. */ p += 2; break; /* The stop_memory opcode represents the end of a group. Its arguments are the same as start_memory's: the register number, and the number of inner groups. */ case stop_memory: DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]); /* We need to save the string position the last time we were at this close-group operator in case the group is operated upon by a repetition operator, e.g., with `((a*)*(b*)*)*' against `aba'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regend[*p]) ? d : regend[*p] : regend[*p]; DEBUG_PRINT2 (" old_regend: %d\n", POINTER_TO_OFFSET (old_regend[*p])); regend[*p] = d; DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); /* This register isn't active anymore. */ IS_ACTIVE (reg_info[*p]) = 0; /* If this was the only register active, nothing is active anymore. */ if (lowest_active_reg == highest_active_reg) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else { /* We must scan for the new highest active register, since it isn't necessarily one less than now: consider (a(b)c(d(e)f)g). When group 3 ends, after the f), the new highest active register is 1. */ unsigned char r = *p - 1; while (r > 0 && !IS_ACTIVE (reg_info[r])) r--; /* If we end up at register zero, that means that we saved the registers as the result of an `on_failure_jump', not a `start_memory', and we jumped to past the innermost `stop_memory'. For example, in ((.)*) we save registers 1 and 2 as a result of the *, but when we pop back to the second ), we are at the stop_memory 1. Thus, nothing is active. */ if (r == 0) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else highest_active_reg = r; } /* If just failed to match something this time around with a group that's operated on by a repetition operator, try to force exit from the ``loop'', and restore the register information for this group that we had before trying this last match. */ if ((!MATCHED_SOMETHING (reg_info[*p]) || (re_opcode_t) p[-3] == start_memory) && (p + 2) < pend) { boolean is_a_jump_n = false; p1 = p + 2; mcnt = 0; switch ((re_opcode_t) *p1++) { case jump_n: is_a_jump_n = true; case pop_failure_jump: case maybe_pop_jump: case jump: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (is_a_jump_n) p1 += 2; break; default: /* do nothing */ ; } p1 += mcnt; /* If the next operation is a jump backwards in the pattern to an on_failure_jump right before the start_memory corresponding to this stop_memory, exit from the loop by forcing a failure after pushing on the stack the on_failure_jump's jump in the pattern, and d. */ if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) { /* If this group ever matched anything, then restore what its registers were before trying this last failed match, e.g., with `(a*)*b' against `ab' for regstart[1], and, e.g., with `((a*)*(b*)*)*' against `aba' for regend[3]. Also restore the registers for inner groups for, e.g., `((a*)(b*))*' against `aba' (register 3 would otherwise get trashed). */ if (EVER_MATCHED_SOMETHING (reg_info[*p])) { unsigned r; EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; /* Restore this and inner groups' (if any) registers. */ for (r = *p; r < *p + *(p + 1); r++) { regstart[r] = old_regstart[r]; /* xx why this test? */ if ((int) old_regend[r] >= (int) regstart[r]) regend[r] = old_regend[r]; } } p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); PUSH_FAILURE_POINT (p1 + mcnt, d, -2); goto fail; } } /* Move past the register number and the inner group count. */ p += 2; break; /* \ has been turned into a `duplicate' command which is followed by the numeric value of as the register number. */ case duplicate: { register const char *d2, *dend2; int regno = *p++; /* Get which register to match against. */ DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); /* Can't back reference a group which we've never matched. */ if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) goto fail; /* Where in input to try to start matching. */ d2 = regstart[regno]; /* Where to stop matching; if both the place to start and the place to stop matching are in the same string, then set to the place to stop, otherwise, for now have to use the end of the first string. */ dend2 = ((FIRST_STRING_P (regstart[regno]) == FIRST_STRING_P (regend[regno])) ? regend[regno] : end_match_1); for (;;) { /* If necessary, advance to next segment in register contents. */ while (d2 == dend2) { if (dend2 == end_match_2) break; if (dend2 == regend[regno]) break; /* End of string1 => advance to string2. */ d2 = string2; dend2 = regend[regno]; } /* At end of register contents => success */ if (d2 == dend2) break; /* If necessary, advance to next segment in data. */ PREFETCH (); /* How many characters left in this segment to match. */ mcnt = dend - d; /* Want how many consecutive characters we can match in one shot, so, if necessary, adjust the count. */ if (mcnt > dend2 - d2) mcnt = dend2 - d2; /* Compare that many; failure if mismatch, else move past them. */ if (translate ? bcmp_translate (d, d2, mcnt, translate) : bcmp (d, d2, mcnt)) goto fail; d += mcnt, d2 += mcnt; } } break; /* begline matches the empty string at the beginning of the string (unless `not_bol' is set in `bufp'), and, if `newline_anchor' is set, after newlines. */ case begline: DEBUG_PRINT1 ("EXECUTING begline.\n"); if (AT_STRINGS_BEG (d)) { if (!bufp->not_bol) break; } else if (d[-1] == '\n' && bufp->newline_anchor) { break; } /* In all other cases, we fail. */ goto fail; /* endline is the dual of begline. */ case endline: DEBUG_PRINT1 ("EXECUTING endline.\n"); if (AT_STRINGS_END (d)) { if (!bufp->not_eol) break; } /* We have to ``prefetch'' the next character. */ else if ((d == end1 ? *string2 : *d) == '\n' && bufp->newline_anchor) { break; } goto fail; /* Match at the very beginning of the data. */ case begbuf: DEBUG_PRINT1 ("EXECUTING begbuf.\n"); if (AT_STRINGS_BEG (d)) break; goto fail; /* Match at the very end of the data. */ case endbuf: DEBUG_PRINT1 ("EXECUTING endbuf.\n"); if (AT_STRINGS_END (d)) break; goto fail; /* on_failure_keep_string_jump is used to optimize `.*\n'. It pushes NULL as the value for the string on the stack. Then `pop_failure_point' will keep the current value for the string, instead of restoring it. To see why, consider matching `foo\nbar' against `.*\n'. The .* matches the foo; then the . fails against the \n. But the next thing we want to do is match the \n against the \n; if we restored the string value, we would be back at the foo. Because this is used only in specific cases, we don't need to check all the things that `on_failure_jump' does, to make sure the right things get saved on the stack. Hence we don't share its code. The only reason to push anything on the stack at all is that otherwise we would have to change `anychar's code to do something besides goto fail in this case; that seems worse than this. */ case on_failure_keep_string_jump: DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); PUSH_FAILURE_POINT (p + mcnt, NULL, -2); break; /* Uses of on_failure_jump: Each alternative starts with an on_failure_jump that points to the beginning of the next alternative. Each alternative except the last ends with a jump that in effect jumps past the rest of the alternatives. (They really jump to the ending jump of the following alternative, because tensioning these jumps is a hassle.) Repeats start with an on_failure_jump that points past both the repetition text and either the following jump or pop_failure_jump back to this on_failure_jump. */ case on_failure_jump: on_failure: DEBUG_PRINT1 ("EXECUTING on_failure_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); /* If this on_failure_jump comes right before a group (i.e., the original * applied to a group), save the information for that group and all inner ones, so that if we fail back to this point, the group's information will be correct. For example, in \(a*\)*\1, we need the preceding group, and in \(\(a*\)b*\)\2, we need the inner group. */ /* We can't use `p' to check ahead because we push a failure point to `p + mcnt' after we do this. */ p1 = p; /* We need to skip no_op's before we look for the start_memory in case this on_failure_jump is happening as the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 against aba. */ while (p1 < pend && (re_opcode_t) *p1 == no_op) p1++; if (p1 < pend && (re_opcode_t) *p1 == start_memory) { /* We have a new highest active register now. This will get reset at the start_memory we are about to get to, but we will have saved all the registers relevant to this repetition op, as described above. */ highest_active_reg = *(p1 + 1) + *(p1 + 2); if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *(p1 + 1); } DEBUG_PRINT1 (":\n"); PUSH_FAILURE_POINT (p + mcnt, d, -2); break; /* A smart repeat ends with `maybe_pop_jump'. We change it to either `pop_failure_jump' or `jump'. */ case maybe_pop_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); { register unsigned char *p2 = p; /* Compare the beginning of the repeat with what in the pattern follows its end. If we can establish that there is nothing that they would both match, i.e., that we would have to backtrack because of (as in, e.g., `a*a') then we can change to pop_failure_jump, because we'll never have to backtrack. This is not true in the case of alternatives: in `(a|ab)*' we do need to backtrack to the `ab' alternative (e.g., if the string was `ab'). But instead of trying to detect that here, the alternative has put on a dummy failure point which is what we will end up popping. */ /* Skip over open/close-group commands. */ while (p2 + 2 < pend && ((re_opcode_t) *p2 == stop_memory || (re_opcode_t) *p2 == start_memory)) p2 += 3; /* Skip over args, too. */ /* If we're at the end of the pattern, we can change. */ if (p2 == pend) { /* Consider what happens when matching ":\(.*\)" against ":/". I don't really understand this code yet. */ p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" End of pattern: change to `pop_failure_jump'.\n"); } else if ((re_opcode_t) *p2 == exactn || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) { register unsigned char c = *p2 == (unsigned char) endline ? '\n' : p2[2]; p1 = p + mcnt; /* p1[0] ... p1[2] are the `on_failure_jump' corresponding to the `maybe_finalize_jump' of this case. Examine what follows. */ if ((re_opcode_t) p1[3] == exactn && p1[5] != c) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", c, p1[5]); } else if ((re_opcode_t) p1[3] == charset || (re_opcode_t) p1[3] == charset_not) { int not = (re_opcode_t) p1[3] == charset_not; if (c < (unsigned char) (p1[4] * BYTEWIDTH) && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; /* `not' is equal to 1 if c would match, which means that we can't change to pop_failure_jump. */ if (!not) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); } } } } p -= 2; /* Point at relative address again. */ if ((re_opcode_t) p[-1] != pop_failure_jump) { p[-1] = (unsigned char) jump; DEBUG_PRINT1 (" Match => jump.\n"); goto unconditional_jump; } /* Note fall through. */ /* The end of a simple repeat has a pop_failure_jump back to its matching on_failure_jump, where the latter will push a failure point. The pop_failure_jump takes off failure points put on by this pop_failure_jump's matching on_failure_jump; we got through the pattern to here from the matching on_failure_jump, so didn't fail. */ case pop_failure_jump: { /* We need to pass separate storage for the lowest and highest registers, even though we don't care about the actual values. Otherwise, we will restore only one register from the stack, since lowest will == highest in `pop_failure_point'. */ unsigned dummy_low_reg, dummy_high_reg; unsigned char *pdummy; const char *sdummy; DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); POP_FAILURE_POINT (sdummy, pdummy, dummy_low_reg, dummy_high_reg, reg_dummy, reg_dummy, reg_info_dummy); if (pdummy == 0) DEBUG_PRINT2("pdummy surely is! %p", pdummy); if (sdummy == 0) DEBUG_PRINT2("sdummy surely is! %p", sdummy); } /* Note fall through. */ /* Unconditionally jump (without popping any failure points). */ case jump: unconditional_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); p += mcnt; /* Do the jump. */ DEBUG_PRINT2 ("(to 0x%x).\n", p); break; /* We need this opcode so we can detect where alternatives end in `group_match_null_string_p' et al. */ case jump_past_alt: DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); goto unconditional_jump; /* Normally, the on_failure_jump pushes a failure point, which then gets popped at pop_failure_jump. We will end up at pop_failure_jump, also, and with a pattern of, say, `a+', we are skipping over the on_failure_jump, so we have to push something meaningless for pop_failure_jump to pop. */ case dummy_failure_jump: DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); /* It doesn't matter what we push for the string here. What the code at `fail' tests is the value for the pattern. */ PUSH_FAILURE_POINT (0, 0, -2); goto unconditional_jump; /* At the end of an alternative, we need to push a dummy failure point in case we are followed by a `pop_failure_jump', because we don't want the failure point for the alternative to be popped. For example, matching `(a|ab)*' against `aab' requires that we match the `ab' alternative. */ case push_dummy_failure: DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); /* See comments just above at `dummy_failure_jump' about the two zeroes. */ PUSH_FAILURE_POINT (0, 0, -2); break; /* Have to succeed matching what follows at least n times. After that, handle like `on_failure_jump'. */ case succeed_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); assert (mcnt >= 0); /* Originally, this is how many times we HAVE to succeed. */ if (mcnt > 0) { mcnt--; p += 2; STORE_NUMBER_AND_INCR (p, mcnt); DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p, mcnt); } else if (mcnt == 0) { DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2); p[2] = (unsigned char) no_op; p[3] = (unsigned char) no_op; goto on_failure; } break; case jump_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); /* Originally, this is how many times we CAN jump. */ if (mcnt) { mcnt--; STORE_NUMBER (p + 2, mcnt); goto unconditional_jump; } /* If don't have to jump any more, skip over the rest of command. */ else p += 4; break; case set_number_at: { DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); EXTRACT_NUMBER_AND_INCR (mcnt, p); p1 = p + mcnt; EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); STORE_NUMBER (p1, mcnt); break; } case wordbound: DEBUG_PRINT1 ("EXECUTING wordbound.\n"); if (AT_WORD_BOUNDARY (d)) break; goto fail; case notwordbound: DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); if (AT_WORD_BOUNDARY (d)) goto fail; break; case wordbeg: DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) break; goto fail; case wordend: DEBUG_PRINT1 ("EXECUTING wordend.\n"); if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) break; goto fail; #ifdef emacs #ifdef emacs19 case before_dot: DEBUG_PRINT1 ("EXECUTING before_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) >= point) goto fail; break; case at_dot: DEBUG_PRINT1 ("EXECUTING at_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) != point) goto fail; break; case after_dot: DEBUG_PRINT1 ("EXECUTING after_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) <= point) goto fail; break; #else /* not emacs19 */ case at_dot: DEBUG_PRINT1 ("EXECUTING at_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point) goto fail; break; #endif /* not emacs19 */ case syntaxspec: DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); mcnt = *p++; goto matchsyntax; case wordchar: DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); mcnt = (int) Sword; matchsyntax: PREFETCH (); if (SYNTAX (*d++) != (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; case notsyntaxspec: DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); mcnt = *p++; goto matchnotsyntax; case notwordchar: DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); mcnt = (int) Sword; matchnotsyntax: PREFETCH (); if (SYNTAX (*d++) == (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; #else /* not emacs */ case wordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); PREFETCH (); if (!WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; case notwordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); PREFETCH (); if (WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; #endif /* not emacs */ default: abort (); } continue; /* Successfully executed one pattern command; keep going. */ /* We goto here if a matching operation fails. */ fail: if (!FAIL_STACK_EMPTY ()) { /* A restart point is known. Restore to that state. */ DEBUG_PRINT1 ("\nFAIL:\n"); POP_FAILURE_POINT (d, p, lowest_active_reg, highest_active_reg, regstart, regend, reg_info); /* If this failure point is a dummy, try the next one. */ if (!p) goto fail; /* If we failed to the end of the pattern, don't examine *p. */ assert (p <= pend); if (p < pend) { boolean is_a_jump_n = false; /* If failed to a backwards jump that's part of a repetition loop, need to pop this failure point and use the next one. */ switch ((re_opcode_t) *p) { case jump_n: is_a_jump_n = true; case maybe_pop_jump: case pop_failure_jump: case jump: p1 = p + 1; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) || (!is_a_jump_n && (re_opcode_t) *p1 == on_failure_jump)) goto fail; break; default: /* do nothing */ ; } } if (d >= string1 && d <= end1) dend = end_match_1; } else break; /* Matching at this starting point really fails. */ } /* for (;;) */ if (best_regs_set) goto restore_best_regs; FREE_VARIABLES (); return -1; /* Failure to match. */ } /* re_match_2 */ /* Subroutine definitions for re_match_2. */ /* We are passed P pointing to a register number after a start_memory. Return true if the pattern up to the corresponding stop_memory can match the empty string, and false otherwise. If we find the matching stop_memory, sets P to point to one past its number. Otherwise, sets P to an undefined byte less than or equal to END. We don't handle duplicates properly (yet). */ static boolean group_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; /* Point to after the args to the start_memory. */ unsigned char *p1 = *p + 2; while (p1 < end) { /* Skip over opcodes that can match nothing, and return true or false, as appropriate, when we get to one that can't, or to the matching stop_memory. */ switch ((re_opcode_t) *p1) { /* Could be either a loop or a series of alternatives. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); /* If the next operation is not a jump backwards in the pattern. */ if (mcnt >= 0) { /* Go through the on_failure_jumps of the alternatives, seeing if any of the alternatives cannot match nothing. The last alternative starts with only a jump, whereas the rest start with on_failure_jump and end with a jump, e.g., here is the pattern for `a|b|c': /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 /exactn/1/c So, we have to first go through the first (n-1) alternatives and then deal with the last one separately. */ /* Deal with the first (n-1) alternatives, which start with an on_failure_jump (see above) that jumps to right past a jump_past_alt. */ while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) { /* `mcnt' holds how many bytes long the alternative is, including the ending `jump_past_alt' and its number. */ if (!alt_match_null_string_p (p1, p1 + mcnt - 3, reg_info)) return false; /* Move to right after this alternative, including the jump_past_alt. */ p1 += mcnt; /* Break if it's the beginning of an n-th alternative that doesn't begin with an on_failure_jump. */ if ((re_opcode_t) *p1 != on_failure_jump) break; /* Still have to check that it's not an n-th alternative that starts with an on_failure_jump. */ p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) { /* Get to the beginning of the n-th alternative. */ p1 -= 3; break; } } /* Deal with the last alternative: go back and get number of the `jump_past_alt' just before it. `mcnt' contains the length of the alternative. */ EXTRACT_NUMBER (mcnt, p1 - 2); if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) return false; p1 += mcnt; /* Get past the n-th alternative. */ } /* if mcnt > 0 */ break; case stop_memory: assert (p1[1] == **p); *p = p1 + 2; return true; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return false; } /* group_match_null_string_p */ /* Similar to group_match_null_string_p, but doesn't deal with alternatives: It expects P to be the first byte of a single alternative and END one byte past the last. The alternative can contain groups. */ static boolean alt_match_null_string_p (p, end, reg_info) unsigned char *p, *end; register_info_type *reg_info; { int mcnt; unsigned char *p1 = p; while (p1 < end) { /* Skip over opcodes that can match nothing, and break when we get to one that can't. */ switch ((re_opcode_t) *p1) { /* It's a loop. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; break; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return true; } /* alt_match_null_string_p */ /* Deals with the ops common to group_match_null_string_p and alt_match_null_string_p. Sets P to one after the op and its arguments, if any. */ static boolean common_op_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; boolean ret; int reg_no; unsigned char *p1 = *p; switch ((re_opcode_t) *p1++) { case no_op: case begline: case endline: case begbuf: case endbuf: case wordbeg: case wordend: case wordbound: case notwordbound: #ifdef emacs case before_dot: case at_dot: case after_dot: #endif break; case start_memory: reg_no = *p1; assert (reg_no > 0 && reg_no <= MAX_REGNUM); ret = group_match_null_string_p (&p1, end, reg_info); /* Have to set this here in case we're checking a group which contains a group and a back reference to it. */ if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; if (!ret) return false; break; /* If this is an optimized succeed_n for zero times, make the jump. */ case jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt >= 0) p1 += mcnt; else return false; break; case succeed_n: /* Get to the number of times to succeed. */ p1 += 2; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt == 0) { p1 -= 4; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; } else return false; break; case duplicate: if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) return false; break; case set_number_at: p1 += 4; default: /* All other opcodes mean we cannot match the empty string. */ return false; } *p = p1; return true; } /* common_op_match_null_string_p */ /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN bytes; nonzero otherwise. */ static int bcmp_translate( unsigned char *s1, unsigned char *s2, int len, char *translate ) { register unsigned char *p1 = s1, *p2 = s2; while (len) { if (translate[*p1++] != translate[*p2++]) return 1; len--; } return 0; } /* Entry points for GNU code. */ /* re_compile_pattern is the GNU regular expression compiler: it compiles PATTERN (of length SIZE) and puts the result in BUFP. Returns 0 if the pattern was valid, otherwise an error string. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. We call regex_compile to do the actual compilation. */ const char * re_compile_pattern (pattern, length, bufp) const char *pattern; int length; struct re_pattern_buffer *bufp; { reg_errcode_t ret; /* GNU code is written to assume at least RE_NREGS registers will be set (and at least one extra will be -1). */ bufp->regs_allocated = REGS_UNALLOCATED; /* And GNU code determines whether or not to get register information by passing null for the REGS argument to re_match, etc., not by setting no_sub. */ bufp->no_sub = 0; /* Match anchors at newline. */ bufp->newline_anchor = 1; ret = regex_compile (pattern, length, re_syntax_options, bufp); return re_error_msg[(int) ret]; } /* Entry points compatible with 4.2 BSD regex library. We don't define them if this is an Emacs or POSIX compilation. */ #if !defined (emacs) && !defined (_POSIX_SOURCE) /* BSD has one and only one pattern buffer. */ static struct re_pattern_buffer re_comp_buf; char * re_comp (s) const char *s; { reg_errcode_t ret; if (!s) { if (!re_comp_buf.buffer) return "No previous regular expression"; return 0; } if (!re_comp_buf.buffer) { re_comp_buf.buffer = (unsigned char *) malloc (200); if (re_comp_buf.buffer == NULL) return "Memory exhausted"; re_comp_buf.allocated = 200; re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); if (re_comp_buf.fastmap == NULL) return "Memory exhausted"; } /* Since `re_exec' always passes NULL for the `regs' argument, we don't need to initialize the pattern buffer fields which affect it. */ /* Match anchors at newlines. */ re_comp_buf.newline_anchor = 1; ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); /* Yes, we're discarding `const' here. */ return (char *) re_error_msg[(int) ret]; } int re_exec (s) const char *s; { const int len = strlen (s); return 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); } #endif /* not emacs and not _POSIX_SOURCE */ /* POSIX.2 functions. Don't define these for Emacs. */ #ifndef emacs /* regcomp takes a regular expression as a string and compiles it. PREG is a regex_t *. We do not expect any fields to be initialized, since POSIX says we shouldn't. Thus, we set `buffer' to the compiled pattern; `used' to the length of the compiled pattern; `syntax' to RE_SYNTAX_POSIX_EXTENDED if the REG_EXTENDED bit in CFLAGS is set; otherwise, to RE_SYNTAX_POSIX_BASIC; `newline_anchor' to REG_NEWLINE being set in CFLAGS; `fastmap' and `fastmap_accurate' to zero; `re_nsub' to the number of subexpressions in PATTERN. PATTERN is the address of the pattern string. CFLAGS is a series of bits which affect compilation. If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we use POSIX basic syntax. If REG_NEWLINE is set, then . and [^...] don't match newline. Also, regexec will try a match beginning after every newline. If REG_ICASE is set, then we considers upper- and lowercase versions of letters to be equivalent when matching. If REG_NOSUB is set, then when PREG is passed to regexec, that routine will report only success or failure, and nothing about the registers. It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for the return codes and their meanings.) */ int regcomp (preg, pattern, cflags) regex_t *preg; const char *pattern; int cflags; { reg_errcode_t ret; unsigned syntax = (cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; /* regex_compile will allocate the space for the compiled pattern. */ preg->buffer = 0; preg->allocated = 0; /* Don't bother to use a fastmap when searching. This simplifies the REG_NEWLINE case: if we used a fastmap, we'd have to put all the characters after newlines into the fastmap. This way, we just try every character. */ preg->fastmap = 0; if (cflags & REG_ICASE) { unsigned i; preg->translate = (char *) malloc (CHAR_SET_SIZE); if (preg->translate == NULL) return (int) REG_ESPACE; /* Map uppercase characters to corresponding lowercase ones. */ for (i = 0; i < CHAR_SET_SIZE; i++) preg->translate[i] = ISUPPER (i) ? tolower (i) : i; } else preg->translate = NULL; /* If REG_NEWLINE is set, newlines are treated differently. */ if (cflags & REG_NEWLINE) { /* REG_NEWLINE implies neither . nor [^...] match newline. */ syntax &= ~RE_DOT_NEWLINE; syntax |= RE_HAT_LISTS_NOT_NEWLINE; /* It also changes the matching behavior. */ preg->newline_anchor = 1; } else preg->newline_anchor = 0; preg->no_sub = !!(cflags & REG_NOSUB); /* POSIX says a null character in the pattern terminates it, so we can use strlen here in compiling the pattern. */ ret = regex_compile (pattern, strlen (pattern), syntax, preg); /* POSIX doesn't distinguish between an unmatched open-group and an unmatched close-group: both are REG_EPAREN. */ if (ret == REG_ERPAREN) ret = REG_EPAREN; return (int) ret; } /* regexec searches for a given pattern, specified by PREG, in the string STRING. If NMATCH is zero or REG_NOSUB was set in the cflags argument to `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at least NMATCH elements, and we set them to the offsets of the corresponding matched substrings. EFLAGS specifies `execution flags' which affect matching: if REG_NOTBOL is set, then ^ does not match at the beginning of the string; if REG_NOTEOL is set, then $ does not match at the end. We return 0 if we find a match and REG_NOMATCH if not. */ int regexec (preg, string, nmatch, pmatch, eflags) const regex_t *preg; const char *string; size_t nmatch; regmatch_t pmatch[]; int eflags; { int ret; struct re_registers regs; regex_t private_preg; int len = strlen (string); boolean want_reg_info = !preg->no_sub && nmatch > 0; private_preg = *preg; private_preg.not_bol = !!(eflags & REG_NOTBOL); private_preg.not_eol = !!(eflags & REG_NOTEOL); /* The user has told us exactly how many registers to return information about, via `nmatch'. We have to pass that on to the matching routines. */ private_preg.regs_allocated = REGS_FIXED; if (want_reg_info) { regs.num_regs = nmatch; regs.start = TALLOC (nmatch, regoff_t); regs.end = TALLOC (nmatch, regoff_t); if (regs.start == NULL || regs.end == NULL) { free (regs.start); free (regs.end); return (int) REG_NOMATCH; } } /* Perform the searching operation. */ ret = re_search (&private_preg, string, len, /* start: */ 0, /* range: */ len, want_reg_info ? ®s : (struct re_registers *) 0); /* Copy the register information to the POSIX structure. */ if (want_reg_info) { if (ret >= 0) { unsigned r; for (r = 0; r < nmatch; r++) { pmatch[r].rm_so = regs.start[r]; pmatch[r].rm_eo = regs.end[r]; } } /* If we needed the temporary register info, free the space now. */ free (regs.start); free (regs.end); } /* We want zero return to mean success, unlike `re_search'. */ return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; } /* Returns a message corresponding to an error code, ERRCODE, returned from either regcomp or regexec. We don't use PREG here. */ size_t regerror (errcode, preg, errbuf, errbuf_size) int errcode; const regex_t *preg; char *errbuf; size_t errbuf_size; { const char *msg; size_t msg_size; if (errcode < 0 || errcode >= (sizeof (re_error_msg) / sizeof (re_error_msg[0]))) /* Only error codes returned by the rest of the code should be passed to this routine. If we are given anything else, or if other regex code generates an invalid error code, then the program has a bug. Dump core so we can fix it. */ abort (); msg = re_error_msg[errcode]; /* POSIX doesn't require that we do anything in this case, but why not be nice. */ if (! msg) msg = "Success"; msg_size = strlen (msg) + 1; /* Includes the null. */ if (errbuf_size != 0) { if (msg_size > errbuf_size) { strncpy (errbuf, msg, errbuf_size - 1); errbuf[errbuf_size - 1] = 0; } else strcpy (errbuf, msg); } return msg_size; } /* Free dynamically allocated space used by PREG. */ void regfree (preg) regex_t *preg; { if (preg->buffer != NULL) free (preg->buffer); preg->buffer = NULL; preg->allocated = 0; preg->used = 0; if (preg->fastmap != NULL) free (preg->fastmap); preg->fastmap = NULL; preg->fastmap_accurate = 0; if (preg->translate != NULL) free (preg->translate); preg->translate = NULL; } #endif /* not emacs */ /* Local variables: make-backup-files: t version-control: t trim-versions-without-asking: nil End: */ fldigi-4.1.06/src/rsid/0000775000175000017500000000000013515625027011601 500000000000000fldigi-4.1.06/src/rsid/rsid.cxx0000664000175000017500000006741513507402064013216 00000000000000// ---------------------------------------------------------------------------- // // rsid.cxx // // Copyright (C) 2008-2012 // Dave Freese, W1HKJ // Copyright (C) 2009-2012 // Stelios Bounanos, M0GLD // Copyright (C) 2012 // John Douyere, VK2ETA // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "rsid.h" #include "filters.h" #include "misc.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "qrunner.h" #include "notify.h" #include "debug.h" #include "main.h" #include "arq_io.h" #include "data_io.h" #include "audio_alert.h" LOG_FILE_SOURCE(debug::LOG_MODEM); #include "rsid_defs.cxx" #define RSWINDOW 1 const int cRsId::Squares[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 0, 2, 4, 6, 8,10,12,14, 9,11,13,15, 1, 3, 5, 7, 0, 3, 6, 5,12,15,10, 9, 1, 2, 7, 4,13,14,11, 8, 0, 4, 8,12, 9,13, 1, 5,11,15, 3, 7, 2, 6,10,14, 0, 5,10,15,13, 8, 7, 2, 3, 6, 9,12,14,11, 4, 1, 0, 6,12,10, 1, 7,13,11, 2, 4,14, 8, 3, 5,15, 9, 0, 7,14, 9, 5, 2,11,12,10,13, 4, 3,15, 8, 1, 6, 0, 8, 9, 1,11, 3, 2,10,15, 7, 6,14, 4,12,13, 5, 0, 9,11, 2,15, 6, 4,13, 7,14,12, 5, 8, 1, 3,10, 0,10,13, 7, 3, 9,14, 4, 6,12,11, 1, 5,15, 8, 2, 0,11,15, 4, 7,12, 8, 3,14, 5, 1,10, 9, 2, 6,13, 0,12, 1,13, 2,14, 3,15, 4, 8, 5, 9, 6,10, 7,11, 0,13, 3,14, 6,11, 5, 8,12, 1,15, 2,10, 7, 9, 4, 0,14, 5,11,10, 4,15, 1,13, 3, 8, 6, 7, 9, 2,12, 0,15, 7, 8,14, 1, 9, 6, 5,10, 2,13,11, 4,12, 3 }; const int cRsId::indices[] = { 2, 4, 8, 9, 11, 15, 7, 14, 5, 10, 13, 3 }; cRsId::cRsId() { int error; src_state = src_new(progdefaults.sample_converter, 1, &error); if (error) { LOG_ERROR("src_new error %d: %s", error, src_strerror(error)); abort(); } src_data.end_of_input = 0; reset(); rsfft = new g_fft(RSID_ARRAY_SIZE); memset(fftwindow, 0, sizeof(fftwindow)); if (RSWINDOW) { for (int i = 0; i < RSID_ARRAY_SIZE; i++) // fftwindow[i] = blackman ( 1.0 * i / RSID_ARRAY_SIZE ); fftwindow[i] = hamming ( 1.0 * i / RSID_ARRAY_SIZE ); // fftwindow[i] = hanning ( 1.0 * i / RSID_ARRAY_SIZE ); // fftwindow[i] = 1.0; } pCodes1 = new unsigned char[rsid_ids_size1 * RSID_NSYMBOLS]; memset(pCodes1, 0, sizeof(pCodes1) * sizeof(unsigned char)); pCodes2 = new unsigned char[rsid_ids_size2 * RSID_NSYMBOLS]; memset(pCodes2, 0, sizeof(pCodes2) * sizeof(unsigned char)); // Initialization of assigned mode/submode IDs. unsigned char* c; for (int i = 0; i < rsid_ids_size1; i++) { c = pCodes1 + i * RSID_NSYMBOLS; Encode(rsid_ids_1[i].rs, c); } for (int i = 0; i < rsid_ids_size2; i++) { c = pCodes2 + i * RSID_NSYMBOLS; Encode(rsid_ids_2[i].rs, c); } #if 0 printf("pcode 1\n"); printf(",rs, name, mode,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\n"); for (int i = 0; i < rsid_ids_size1; i++) { printf("%d,%d,%s,%d", i, rsid_ids_1[i].rs, rsid_ids_1[i].name, rsid_ids_1[i].mode); for (int j = 0; j < RSID_NSYMBOLS + 1; j++) printf(",%d", pCodes1[i*(RSID_NSYMBOLS + 1) + j]); printf("\n"); } printf("\npcode 2\n"); printf(", rs, name, mode,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\n"); for (int i = 0; i < rsid_ids_size2; i++) { printf("%d,%d,%s,%d", i, rsid_ids_2[i].rs, rsid_ids_2[i].name, rsid_ids_2[i].mode); for (int j = 0; j < RSID_NSYMBOLS + 1; j++) printf(",%d", pCodes2[i*(RSID_NSYMBOLS+ 1) + j]); printf("\n"); } #endif nBinLow = 3; nBinHigh = RSID_FFT_SIZE - 32; // - RSID_NTIMES - 2 outbuf = 0; symlen = 0; reset(); } cRsId::~cRsId() { delete [] pCodes1; delete [] pCodes2; delete [] outbuf; delete rsfft; src_delete(src_state); } void cRsId::reset() { iPrevDistance = iPrevDistance2 = 99; bPrevTimeSliceValid = bPrevTimeSliceValid2 = false; found1 = found2 = false; rsid_secondary_time_out = 0; memset(aInputSamples, 0, (RSID_ARRAY_SIZE * 2) * sizeof(float)); memset(aFFTcmplx, 0, RSID_ARRAY_SIZE * sizeof(rs_cpx_type)); memset(aFFTAmpl, 0, RSID_FFT_SIZE * sizeof(rs_fft_type)); memset(fft_buckets, 0, RSID_NTIMES * RSID_FFT_SIZE * sizeof(int)); int error = src_reset(src_state); if (error) LOG_ERROR("src_reset error %d: %s", error, src_strerror(error)); src_data.src_ratio = 0.0; inptr = RSID_FFT_SIZE; hamming_resolution = progdefaults.RsID_label_type; } void cRsId::Encode(int code, unsigned char *rsid) { rsid[0] = code >> 8; rsid[1] = (code >> 4) & 0x0f; rsid[2] = code & 0x0f; for (int i = 3; i < RSID_NSYMBOLS; i++) rsid[i] = 0; for (int i = 0; i < 12; i++) { for (int j = RSID_NSYMBOLS - 1; j > 0; j--) rsid[j] = rsid[j - 1] ^ Squares[(rsid[j] << 4) + indices[i]]; rsid[0] = Squares[(rsid[0] << 4) + indices[i]]; } } void cRsId::CalculateBuckets(const rs_fft_type *pSpectrum, int iBegin, int iEnd) { rs_fft_type Amp = 0.0, AmpMax = 0.0; int iBucketMax = iBegin - 2; int j; for (int i = iBegin; i < iEnd; i += 2) { if (iBucketMax == i - 2) { AmpMax = pSpectrum[i]; iBucketMax = i; for (j = i + 2; j < i + RSID_NTIMES + 2; j += 2) { Amp = pSpectrum[j]; if (Amp > AmpMax) { AmpMax = Amp; iBucketMax = j; } } } else { j = i + RSID_NTIMES; Amp = pSpectrum[j]; if (Amp > AmpMax) { AmpMax = Amp; iBucketMax = j; } } fft_buckets[RSID_NTIMES - 1][i] = (iBucketMax - i) >> 1; } } void cRsId::receive(const float* buf, size_t len) { if (len == 0) return; int srclen = static_cast(len); double src_ratio = RSID_SAMPLE_RATE / active_modem->get_samplerate(); if (rsid_secondary_time_out > 0) { rsid_secondary_time_out -= 1.0 * len / active_modem->get_samplerate(); if (rsid_secondary_time_out <= 0) { LOG_INFO("%s", "Secondary RsID timed out"); reset(); } } if (src_data.src_ratio != src_ratio) { src_data.src_ratio = src_ratio; src_set_ratio(src_state, src_data.src_ratio); } while (srclen > 0) { src_data.data_in = const_cast(buf); src_data.input_frames = srclen; src_data.data_out = &aInputSamples[inptr]; src_data.output_frames = RSID_ARRAY_SIZE * 2 - inptr; src_data.input_frames_used = 0; int error = src_process(src_state, &src_data); if (unlikely(error)) { LOG_ERROR("src_process error %d: %s", error, src_strerror(error)); return; } size_t gend = src_data.output_frames_gen; size_t used = src_data.input_frames_used; inptr += gend; buf += used; srclen -= used; while (inptr >= RSID_ARRAY_SIZE) { search(); memmove(&aInputSamples[0], &aInputSamples[RSID_FFT_SAMPLES], (RSID_BUFFER_SIZE - RSID_FFT_SAMPLES)*sizeof(float)); inptr -= RSID_FFT_SAMPLES; } } } void cRsId::search(void) { if (progdefaults.rsidWideSearch) { nBinLow = 3; nBinHigh = RSID_FFT_SIZE - 32; } else { float centerfreq = active_modem->get_freq(); float bpf = 1.0 * RSID_ARRAY_SIZE / RSID_SAMPLE_RATE; nBinLow = (int)((centerfreq - 100.0 * 2) * bpf); nBinHigh = (int)((centerfreq + 100.0 * 2) * bpf); } if (nBinLow < 3) nBinLow = 3; if (nBinHigh > RSID_FFT_SIZE - 32) nBinHigh = RSID_FFT_SIZE - 32; bool bReverse = !(wf->Reverse() ^ wf->USB()); if (bReverse) { nBinLow = RSID_FFT_SIZE - nBinHigh; nBinHigh = RSID_FFT_SIZE - nBinLow; } if (RSWINDOW) { for (int i = 0; i < RSID_ARRAY_SIZE; i++) aFFTcmplx[i] = cmplx(aInputSamples[i] * fftwindow[i], 0); } else { for (int i = 0; i < RSID_ARRAY_SIZE; i++) aFFTcmplx[i] = cmplx(aInputSamples[i], 0); } rsfft->ComplexFFT(aFFTcmplx); memset(aFFTAmpl, 0, sizeof(aFFTAmpl)); static const double pscale = 4.0 / (RSID_FFT_SIZE * RSID_FFT_SIZE); if (unlikely(bReverse)) { for (int i = 0; i < RSID_FFT_SIZE; i++) aFFTAmpl[RSID_FFT_SIZE - 1 - i] = norm(aFFTcmplx[i]) * pscale; } else { for (int i = 0; i < RSID_FFT_SIZE; i++) aFFTAmpl[i] = norm(aFFTcmplx[i]) * pscale; } int bucket_low = 3; int bucket_high = RSID_FFT_SIZE - 32; if (bReverse) { bucket_low = RSID_FFT_SIZE - bucket_high; bucket_high = RSID_FFT_SIZE - bucket_low; } memmove(fft_buckets, &(fft_buckets[1][0]), (RSID_NTIMES - 1) * RSID_FFT_SIZE * sizeof(int)); memset(&(fft_buckets[RSID_NTIMES - 1][0]), 0, RSID_FFT_SIZE * sizeof(int)); CalculateBuckets ( aFFTAmpl, bucket_low, bucket_high - RSID_NTIMES); CalculateBuckets ( aFFTAmpl, bucket_low + 1, bucket_high - RSID_NTIMES); int symbol_out_1 = -1; int bin_out_1 = -1; int symbol_out_2 = -1; int bin_out_2 = -1; if (rsid_secondary_time_out <= 0) { found1 = search_amp(bin_out_1, symbol_out_1, pCodes1); if (found1) { if (symbol_out_1 != RSID_ESCAPE) { if (bReverse) bin_out_1 = 1024 - bin_out_1 - 31; apply(bin_out_1, symbol_out_1, 0); reset(); return; } else { // 10 rsid_gap + 15 symbols + 2 for timing errors rsid_secondary_time_out = 27 * RSID_SYMLEN; return; } } else return; } found2 = search_amp(bin_out_2, symbol_out_2, pCodes2); if (found2) { if (symbol_out_2 != RSID_NONE2) { if (bReverse) bin_out_2 = 1024 - bin_out_2 - 31; apply(bin_out_2, symbol_out_2, 1); } reset(); } } void cRsId::setup_mode(int iSymbol) { switch (iSymbol) { case RSID_RTTY_ASCII_7: progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 1; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_ASCII_8: progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 2; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_45: progdefaults.rtty_baud = 1; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_50: progdefaults.rtty_baud = 2; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_75: progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; // DominoEX / FEC case RSID_DOMINOEX_4: case RSID_DOMINOEX_5: case RSID_DOMINOEX_8: case RSID_DOMINOEX_11: case RSID_DOMINOEX_16: case RSID_DOMINOEX_22: progdefaults.DOMINOEX_FEC = false; REQ(&set_dominoex_tab_widgets); break; case RSID_DOMINOEX_4_FEC: case RSID_DOMINOEX_5_FEC: case RSID_DOMINOEX_8_FEC: case RSID_DOMINOEX_11_FEC: case RSID_DOMINOEX_16_FEC: case RSID_DOMINOEX_22_FEC: progdefaults.DOMINOEX_FEC = true; REQ(&set_dominoex_tab_widgets); break; // olivia parameters case RSID_OLIVIA_4_125: progdefaults.oliviatones = 1; progdefaults.oliviabw = 0; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_250: progdefaults.oliviatones = 1; progdefaults.oliviabw = 1; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_500: progdefaults.oliviatones = 1; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_1000: progdefaults.oliviatones = 1; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_2000: progdefaults.oliviatones = 1; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_125: progdefaults.oliviatones = 2; progdefaults.oliviabw = 0; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_250: progdefaults.oliviatones = 2; progdefaults.oliviabw = 1; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_500: progdefaults.oliviatones = 2; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_1000: progdefaults.oliviatones = 2; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_2000: progdefaults.oliviatones = 2; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_500: progdefaults.oliviatones = 3; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_1000: progdefaults.oliviatones = 3; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_2000: progdefaults.oliviatones = 3; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_32_1000: progdefaults.oliviatones = 4; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_32_2000: progdefaults.oliviatones = 4; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_64_2000: progdefaults.oliviatones = 5; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; // contestia parameters case RSID_CONTESTIA_4_125: progdefaults.contestiatones = 1; progdefaults.contestiabw = 0; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_250: progdefaults.contestiatones = 1; progdefaults.contestiabw = 1; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_500: progdefaults.contestiatones = 1; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_1000: progdefaults.contestiatones = 1; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_2000: progdefaults.contestiatones = 1; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_125: progdefaults.contestiatones = 2; progdefaults.contestiabw = 0; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_250: progdefaults.contestiatones = 2; progdefaults.contestiabw = 1; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_500: progdefaults.contestiatones = 2; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_1000: progdefaults.contestiatones = 2; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_2000: progdefaults.contestiatones = 2; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_500: progdefaults.contestiatones = 3; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_1000: progdefaults.contestiatones = 3; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_2000: progdefaults.contestiatones = 3; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_32_1000: progdefaults.contestiatones = 4; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_32_2000: progdefaults.contestiatones = 4; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_500: progdefaults.contestiatones = 5; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_1000: progdefaults.contestiatones = 5; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_2000: progdefaults.contestiatones = 5; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; default: break; } // switch (iSymbol) } void cRsId::apply(int iBin, int iSymbol, int extended) { ENSURE_THREAD(TRX_TID); double rsidfreq = 0, currfreq = 0; int n, mbin = NUM_MODES; int tblsize; const RSIDs *p_rsid; if (extended) { tblsize = rsid_ids_size2; p_rsid = rsid_ids_2; } else { tblsize = rsid_ids_size1; p_rsid = rsid_ids_1; } currfreq = active_modem->get_freq(); rsidfreq = (iBin + RSID_NSYMBOLS - 0.5) * RSID_SAMPLE_RATE / 2048.0; for (n = 0; n < tblsize; n++) { if (p_rsid[n].rs == iSymbol) { mbin = p_rsid[n].mode; break; } } if (mbin == NUM_MODES) { char msg[50]; if (n < tblsize) // RSID known but unimplemented snprintf(msg, sizeof(msg), "RSID: %s unimplemented", p_rsid[n].name); else // RSID unknown; shouldn't happen snprintf(msg, sizeof(msg), "RSID: code %d unknown", iSymbol); put_status(msg, 4.0); LOG_VERBOSE("%s", msg); return; } if (progdefaults.rsid_rx_modes.test(mbin)) { LOG_VERBOSE("RSID: %s @ %0.1f Hz", p_rsid[n].name, rsidfreq); } else { LOG_DEBUG("Ignoring RSID: %s @ %0.1f Hz", p_rsid[n].name, rsidfreq); return; } if (progdefaults.ENABLE_RSID_MATCH) audio_alert->alert(progdefaults.RSID_MATCH); if (mailclient || mailserver) REQ(pskmail_notify_rsid, mbin); if (progdefaults.rsid_auto_disable) REQ(toggleRSID); if (!progdefaults.disable_rsid_warning_dialog_box) REQ(notify_rsid, mbin, rsidfreq); if (progdefaults.rsid_notify_only) { if (data_io_enabled == KISS_IO) { bcast_rsid_kiss_frame(rsidfreq, mbin, (int) active_modem->get_txfreq_woffset(), active_modem->get_mode(), RSID_KISS_NOTIFY); } return; } if (progdefaults.rsid_mark) // mark current modem & freq REQ(note_qrg, false, "\nBefore RSID: ", "\n", active_modem->get_mode(), 0LL, currfreq); if(active_modem) // Currently only effects Olivia, Contestia and MT63. active_modem->rx_flush(); setup_mode(iSymbol); if (progdefaults.rsid_squelch) REQ(init_modem_squelch, mbin, progdefaults.disable_rsid_freq_change ? currfreq : rsidfreq); else REQ(init_modem, mbin, progdefaults.disable_rsid_freq_change ? currfreq : rsidfreq); } inline int cRsId::HammingDistance(int iBucket, unsigned char *p2) { int dist = 0; for (int i = 0, j = 1; i < RSID_NSYMBOLS; i++, j += 2) { if (fft_buckets[j][iBucket] != p2[i]) { ++dist; if (dist > hamming_resolution) break; } } return dist; } bool cRsId::search_amp( int &bin_out, int &symbol_out, unsigned char *pcode) { int i, j; int iDistanceMin = 1000; // infinity int iDistance = 1000; int iBin = -1; int iSymbol = -1; int tblsize; const RSIDs *prsid; if (pcode == pCodes1) { tblsize = rsid_ids_size1; prsid = rsid_ids_1; } else { tblsize = rsid_ids_size2; prsid = rsid_ids_2; } unsigned char *pc = 0; for (i = 0; i < tblsize; i++) { pc = pcode + i * RSID_NSYMBOLS; for (j = nBinLow; j < nBinHigh - RSID_NTIMES; j++) { iDistance = HammingDistance(j, pc); if (iDistance < iDistanceMin) { iDistanceMin = iDistance; iSymbol = prsid[i].rs; iBin = j; if (iDistanceMin == 0) break; } } } if (iDistanceMin <= hamming_resolution) { symbol_out = iSymbol; bin_out = iBin; return true; } return false; } //============================================================================= // transmit rsid code for current mode //============================================================================= bool cRsId::assigned(trx_mode mode) { rmode = RSID_NONE; rmode2 = RSID_NONE2; switch (mode) { case MODE_RTTY : if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_ASCII_7; else if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_ASCII_8; else if (progdefaults.rtty_baud == 1 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3) rmode = RSID_RTTY_45; else if (progdefaults.rtty_baud == 2 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3) rmode = RSID_RTTY_50; else if (progdefaults.rtty_baud == 4 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_75; else return false; return true; break; case MODE_OLIVIA: case MODE_OLIVIA_4_250: case MODE_OLIVIA_8_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_8_500: case MODE_OLIVIA_16_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_64_2000: if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 0) rmode = RSID_OLIVIA_4_125; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 1) rmode = RSID_OLIVIA_4_250; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_4_500; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_4_1000; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_4_2000; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 0) rmode = RSID_OLIVIA_8_125; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 1) rmode = RSID_OLIVIA_8_250; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_8_500; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_8_1000; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_8_2000; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_16_500; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_16_1000; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_16_2000; else if (progdefaults.oliviatones == 4 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_32_1000; else if (progdefaults.oliviatones == 4 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_32_2000; else if (progdefaults.oliviatones == 5 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_64_2000; else return false; return true; break; case MODE_CONTESTIA: case MODE_CONTESTIA_4_125: case MODE_CONTESTIA_4_250: case MODE_CONTESTIA_8_250: case MODE_CONTESTIA_4_500: case MODE_CONTESTIA_8_500: case MODE_CONTESTIA_16_500: case MODE_CONTESTIA_8_1000: case MODE_CONTESTIA_16_1000: case MODE_CONTESTIA_32_1000: case MODE_CONTESTIA_64_2000: if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 0) rmode = RSID_CONTESTIA_4_125; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 1) rmode = RSID_CONTESTIA_4_250; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_4_500; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_4_1000; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_4_2000; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 0) rmode = RSID_CONTESTIA_8_125; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 1) rmode = RSID_CONTESTIA_8_250; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_8_500; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_8_1000; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_8_2000; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_16_500; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_16_1000; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_16_2000; else if (progdefaults.contestiatones == 4 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_32_1000; else if (progdefaults.contestiatones == 4 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_32_2000; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_64_500; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_64_1000; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_64_2000; else return false; return true; break; case MODE_DOMINOEX4: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_4_FEC; break; case MODE_DOMINOEX5: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_5_FEC; break; case MODE_DOMINOEX8: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_8_FEC; break; case MODE_DOMINOEX11: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_11_FEC; break; case MODE_DOMINOEX16: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_16_FEC; break; case MODE_DOMINOEX22: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_22_FEC; break; case MODE_MT63_500S: rmode = RSID_MT63_500_ST; break; case MODE_MT63_500L: rmode = RSID_MT63_500_LG; break; case MODE_MT63_1000S: rmode = RSID_MT63_1000_ST; break; case MODE_MT63_1000L: rmode = RSID_MT63_1000_LG; break; case MODE_MT63_2000S: rmode = RSID_MT63_2000_ST; break; case MODE_MT63_2000L: rmode = RSID_MT63_2000_LG; break; } // if rmode is still unset, look it up // Try secondary table first if (rmode == RSID_NONE) { for (size_t i = 0; i < sizeof(rsid_ids_2)/sizeof(*rsid_ids_2); i++) { if (mode == rsid_ids_2[i].mode) { rmode = RSID_ESCAPE; rmode2 = rsid_ids_2[i].rs; break; } } if (rmode2 == RSID_NONE2) { for (size_t i = 0; i < sizeof(rsid_ids_1)/sizeof(*rsid_ids_1); i++) { if (mode == rsid_ids_1[i].mode) { rmode = rsid_ids_1[i].rs; break; } } } } if (rmode == RSID_NONE) { LOG_DEBUG("%s mode is not assigned an RSID", mode_info[mode].sname); return false; } return true; } void cRsId::send(bool preRSID) { trx_mode mode = active_modem->get_mode(); if (!progdefaults.rsid_tx_modes.test(mode)) { LOG_DEBUG("Mode %s excluded, not sending RSID", mode_info[mode].sname); return; } if (!progdefaults.rsid_post && !preRSID) return; if (!assigned(mode)) return; unsigned char rsid[RSID_NSYMBOLS]; double sr; size_t len; int iTone; double freq, phaseincr; double fr; double phase; Encode(rmode, rsid); sr = active_modem->get_samplerate(); len = (size_t)floor(RSID_SYMLEN * sr); if (unlikely(len != symlen)) { symlen = len; delete [] outbuf; outbuf = new double[symlen]; } // transmit 5 symbol periods of silence at beginning of rsid memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < 5; i++) active_modem->ModulateXmtr(outbuf, symlen); // transmit sequence of 15 symbols (tones) fr = 1.0 * active_modem->get_txfreq_woffset() - (RSID_SAMPLE_RATE * 7 / 1024); phase = 0.0; for (int i = 0; i < 15; i++) { iTone = rsid[i]; if (active_modem->get_reverse()) iTone = 15 - iTone; freq = fr + iTone * RSID_SAMPLE_RATE / 1024; phaseincr = 2.0 * M_PI * freq / sr; for (size_t j = 0; j < symlen; j++) { phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; outbuf[j] = sin(phase); } active_modem->ModulateXmtr(outbuf, symlen); } if (rmode == RSID_ESCAPE && rmode2 != RSID_NONE2) { // transmit 10 symbol periods of silence between rsid sequences memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < 10; i++) active_modem->ModulateXmtr(outbuf, symlen); Encode(rmode2, rsid); sr = active_modem->get_samplerate(); len = (size_t)floor(RSID_SYMLEN * sr); if (unlikely(len != symlen)) { symlen = len; delete [] outbuf; outbuf = new double[symlen]; } // transmit sequence of 15 symbols (tones) fr = 1.0 * active_modem->get_txfreq_woffset() - (RSID_SAMPLE_RATE * 7 / 1024); phase = 0.0; for (int i = 0; i < 15; i++) { iTone = rsid[i]; if (active_modem->get_reverse()) iTone = 15 - iTone; freq = fr + iTone * RSID_SAMPLE_RATE / 1024; phaseincr = 2.0 * M_PI * freq / sr; for (size_t j = 0; j < symlen; j++) { phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; outbuf[j] = sin(phase); } active_modem->ModulateXmtr(outbuf, symlen); } } // 5 symbol periods of silence at end of transmission // and between RsID and the data signal int nperiods = 5; memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < nperiods; i++) active_modem->ModulateXmtr(outbuf, symlen); } fldigi-4.1.06/src/rsid/rsid_defs.cxx0000664000175000017500000004050313507402064014204 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // Syntax: ELEM_(rsid_code, rsid_tag, fldigi_mode) // fldigi_mode is NUM_MODES if mode is not available in fldigi, // otherwise one of the tags defined in globals.h. // rsid_tag is stringified and may be shown to the user. /* ELEM_(263, ESCAPE, NUM_MODES) \ */ #undef ELEM_ #define RSID_LIST \ \ /* ESCAPE used to transition to 2nd RSID set */ \ \ ELEM_(6, ESCAPE, NUM_MODES) \ \ ELEM_(1, BPSK31, MODE_PSK31) \ ELEM_(110, QPSK31, MODE_QPSK31) \ ELEM_(2, BPSK63, MODE_PSK63) \ ELEM_(3, QPSK63, MODE_QPSK63) \ ELEM_(4, BPSK125, MODE_PSK125) \ ELEM_(5, QPSK125, MODE_QPSK125) \ ELEM_(126, BPSK250, MODE_PSK250) \ ELEM_(127, QPSK250, MODE_QPSK250) \ ELEM_(173, BPSK500, MODE_PSK500) \ \ ELEM_(183, PSK125R, MODE_PSK125R) \ ELEM_(186, PSK250R, MODE_PSK250R) \ ELEM_(187, PSK500R, MODE_PSK500R) \ \ ELEM_(7, PSKFEC31, NUM_MODES) \ ELEM_(8, PSK10, NUM_MODES) \ \ ELEM_(9, MT63_500_LG, MODE_MT63_500L) \ ELEM_(10, MT63_500_ST, MODE_MT63_500S) \ ELEM_(11, MT63_500_VST, NUM_MODES) \ ELEM_(12, MT63_1000_LG, MODE_MT63_1000L) \ ELEM_(13, MT63_1000_ST, MODE_MT63_1000S) \ ELEM_(14, MT63_1000_VST, NUM_MODES) \ ELEM_(15, MT63_2000_LG, MODE_MT63_2000L) \ ELEM_(17, MT63_2000_ST, MODE_MT63_2000S) \ ELEM_(18, MT63_2000_VST, NUM_MODES) \ \ ELEM_(19, PSKAM10, NUM_MODES) \ ELEM_(20, PSKAM31, NUM_MODES) \ ELEM_(21, PSKAM50, NUM_MODES) \ \ ELEM_(22, PSK63F, MODE_PSK63F) \ ELEM_(23, PSK220F, NUM_MODES) \ \ ELEM_(24, CHIP64, NUM_MODES) \ ELEM_(25, CHIP128, NUM_MODES) \ \ ELEM_(26, CW, MODE_CW) \ \ ELEM_(27, CCW_OOK_12, NUM_MODES) \ ELEM_(28, CCW_OOK_24, NUM_MODES) \ ELEM_(29, CCW_OOK_48, NUM_MODES) \ ELEM_(30, CCW_FSK_12, NUM_MODES) \ ELEM_(31, CCW_FSK_24, NUM_MODES) \ ELEM_(33, CCW_FSK_48, NUM_MODES) \ \ ELEM_(34, PACTOR1_FEC, NUM_MODES) \ \ ELEM_(113, PACKET_110, NUM_MODES) \ ELEM_(35, PACKET_300, NUM_MODES) \ ELEM_(36, PACKET_1200, NUM_MODES) \ \ ELEM_(37, RTTY_ASCII_7, MODE_RTTY) \ ELEM_(38, RTTY_ASCII_8, MODE_RTTY) \ ELEM_(39, RTTY_45, MODE_RTTY) \ ELEM_(40, RTTY_50, MODE_RTTY) \ ELEM_(41, RTTY_75, MODE_RTTY) \ \ ELEM_(42, AMTOR_FEC, NUM_MODES) \ \ ELEM_(43, THROB_1, MODE_THROB1) \ ELEM_(44, THROB_2, MODE_THROB2) \ ELEM_(45, THROB_4, MODE_THROB4) \ ELEM_(46, THROBX_1, MODE_THROBX1) \ ELEM_(47, THROBX_2, MODE_THROBX2) \ ELEM_(146, THROBX_4, MODE_THROBX4) \ \ ELEM_(204, CONTESTIA_4_125, MODE_CONTESTIA_4_125) \ ELEM_(55, CONTESTIA_4_250, MODE_CONTESTIA_4_250) \ ELEM_(54, CONTESTIA_4_500, MODE_CONTESTIA_4_500) \ ELEM_(255, CONTESTIA_4_1000, MODE_CONTESTIA_4_1000) \ ELEM_(254, CONTESTIA_4_2000, MODE_CONTESTIA_4_2000) \ \ ELEM_(169, CONTESTIA_8_125, MODE_CONTESTIA_8_125) \ ELEM_(49, CONTESTIA_8_250, MODE_CONTESTIA_8_250) \ ELEM_(52, CONTESTIA_8_500, MODE_CONTESTIA_8_500) \ ELEM_(117, CONTESTIA_8_1000, MODE_CONTESTIA_8_1000) \ ELEM_(247, CONTESTIA_8_2000, MODE_CONTESTIA_8_2000) \ \ ELEM_(50, CONTESTIA_16_500, MODE_CONTESTIA_16_500) \ ELEM_(53, CONTESTIA_16_1000, MODE_CONTESTIA_16_1000) \ ELEM_(259, CONTESTIA_16_2000, MODE_CONTESTIA_16_2000) \ \ ELEM_(51, CONTESTIA_32_1000, MODE_CONTESTIA_32_1000) \ ELEM_(201, CONTESTIA_32_2000, MODE_CONTESTIA_32_2000) \ \ ELEM_(194, CONTESTIA_64_500, MODE_CONTESTIA_64_500) \ ELEM_(193, CONTESTIA_64_1000, MODE_CONTESTIA_64_1000) \ ELEM_(191, CONTESTIA_64_2000, MODE_CONTESTIA_64_2000) \ \ ELEM_(56, VOICE, NUM_MODES) \ \ ELEM_(60, MFSK8, MODE_MFSK8) \ ELEM_(57, MFSK16, MODE_MFSK16) \ ELEM_(147, MFSK32, MODE_MFSK32) \ \ ELEM_(148, MFSK11, MODE_MFSK11) \ ELEM_(152, MFSK22, MODE_MFSK22) \ \ ELEM_(61, RTTYM_8_250, NUM_MODES) \ ELEM_(62, RTTYM_16_500, NUM_MODES) \ ELEM_(63, RTTYM_32_1000, NUM_MODES) \ ELEM_(65, RTTYM_8_500, NUM_MODES) \ ELEM_(66, RTTYM_16_1000, NUM_MODES) \ ELEM_(67, RTTYM_4_500, NUM_MODES) \ ELEM_(68, RTTYM_4_250, NUM_MODES) \ ELEM_(119, RTTYM_8_1000, NUM_MODES) \ ELEM_(170, RTTYM_8_125, NUM_MODES) \ \ ELEM_(203, OLIVIA_4_125, MODE_OLIVIA_4_125) \ ELEM_(75, OLIVIA_4_250, MODE_OLIVIA_4_250) \ ELEM_(74, OLIVIA_4_500, MODE_OLIVIA_4_500) \ ELEM_(229, OLIVIA_4_1000, MODE_OLIVIA_4_1000) \ ELEM_(238, OLIVIA_4_2000, MODE_OLIVIA_4_2000) \ \ ELEM_(163, OLIVIA_8_125, MODE_OLIVIA_8_125) \ ELEM_(69, OLIVIA_8_250, MODE_OLIVIA_8_250) \ ELEM_(72, OLIVIA_8_500, MODE_OLIVIA_8_500) \ ELEM_(116, OLIVIA_8_1000, MODE_OLIVIA_8_1000) \ ELEM_(214, OLIVIA_8_2000, MODE_OLIVIA_8_2000) \ \ ELEM_(70, OLIVIA_16_500, MODE_OLIVIA_16_500) \ ELEM_(73, OLIVIA_16_1000, MODE_OLIVIA_16_1000) \ ELEM_(234, OLIVIA_16_2000, MODE_OLIVIA_16_2000) \ \ ELEM_(71, OLIVIA_32_1000, MODE_OLIVIA_32_1000) \ ELEM_(221, OLIVIA_32_2000, MODE_OLIVIA_32_2000) \ \ ELEM_(211, OLIVIA_64_2000, MODE_OLIVIA_64_2000) \ \ ELEM_(76, PAX, NUM_MODES) \ ELEM_(77, PAX2, NUM_MODES) \ ELEM_(78, DOMINOF, NUM_MODES) \ ELEM_(79, FAX, NUM_MODES) \ ELEM_(81, SSTV, NUM_MODES) \ \ ELEM_(84, DOMINOEX_4, MODE_DOMINOEX4) \ ELEM_(85, DOMINOEX_5, MODE_DOMINOEX5) \ ELEM_(86, DOMINOEX_8, MODE_DOMINOEX8) \ ELEM_(87, DOMINOEX_11, MODE_DOMINOEX11) \ ELEM_(88, DOMINOEX_16, MODE_DOMINOEX16) \ ELEM_(90, DOMINOEX_22, MODE_DOMINOEX22) \ ELEM_(92, DOMINOEX_4_FEC, MODE_DOMINOEX4) \ ELEM_(93, DOMINOEX_5_FEC, MODE_DOMINOEX5) \ ELEM_(97, DOMINOEX_8_FEC, MODE_DOMINOEX8) \ ELEM_(98, DOMINOEX_11_FEC, MODE_DOMINOEX11) \ ELEM_(99, DOMINOEX_16_FEC, MODE_DOMINOEX16) \ ELEM_(101, DOMINOEX_22_FEC, MODE_DOMINOEX22) \ \ ELEM_(104, FELD_HELL, MODE_FELDHELL) \ ELEM_(105, PSK_HELL, NUM_MODES) \ ELEM_(106, HELL_80, MODE_HELL80) \ ELEM_(107, FM_HELL_105, MODE_FSKH105) \ ELEM_(108, FM_HELL_245, NUM_MODES) \ \ ELEM_(114, MODE_141A, NUM_MODES) \ ELEM_(123, DTMF, NUM_MODES) \ ELEM_(125, ALE400, NUM_MODES) \ ELEM_(131, FDMDV, NUM_MODES) \ \ ELEM_(132, JT65_A, NUM_MODES) \ ELEM_(134, JT65_B, NUM_MODES) \ ELEM_(135, JT65_C, NUM_MODES) \ \ ELEM_(136, THOR_4, MODE_THOR4) \ ELEM_(137, THOR_8, MODE_THOR8) \ ELEM_(138, THOR_16, MODE_THOR16) \ ELEM_(139, THOR_5, MODE_THOR5) \ ELEM_(143, THOR_11, MODE_THOR11) \ ELEM_(145, THOR_22, MODE_THOR22) \ \ ELEM_(153, CALL_ID, NUM_MODES) \ \ ELEM_(155, PACKET_PSK1200, NUM_MODES) \ ELEM_(156, PACKET_PSK250, NUM_MODES) \ ELEM_(159, PACKET_PSK63, NUM_MODES) \ \ ELEM_(172, MODE_188_110A_8N1, NUM_MODES) \ \ /* NONE must be the last element */ \ ELEM_(0, NONE, NUM_MODES) #define ELEM_(code_, tag_, mode_) RSID_ ## tag_ = code_, enum { RSID_LIST }; #undef ELEM_ #define ELEM_(code_, tag_, mode_) { RSID_ ## tag_, mode_, #tag_ }, const RSIDs cRsId::rsid_ids_1[] = { RSID_LIST }; #undef ELEM_ const int cRsId::rsid_ids_size1 = sizeof(rsid_ids_1)/sizeof(*rsid_ids_1) - 1; //====================================================================== /* ELEM_(6, ESCAPE2, NUM_MODES) \ */ #define RSID_LIST2 \ ELEM2_(450, PSK63RX4, MODE_4X_PSK63R) \ ELEM2_(457, PSK63RX5, MODE_5X_PSK63R) \ ELEM2_(458, PSK63RX10, MODE_10X_PSK63R) \ ELEM2_(460, PSK63RX20, MODE_20X_PSK63R) \ ELEM2_(462, PSK63RX32, MODE_32X_PSK63R) \ \ ELEM2_(467, PSK125RX4, MODE_4X_PSK125R) \ ELEM2_(497, PSK125RX5, MODE_5X_PSK125R) \ ELEM2_(513, PSK125RX10, MODE_10X_PSK125R) \ ELEM2_(519, PSK125X12, MODE_12X_PSK125) \ ELEM2_(522, PSK125RX12, MODE_12X_PSK125R) \ ELEM2_(527, PSK125RX16, MODE_16X_PSK125R) \ \ ELEM2_(529, PSK250RX2, MODE_2X_PSK250R) \ ELEM2_(533, PSK250RX3, MODE_3X_PSK250R) \ ELEM2_(539, PSK250RX5, MODE_5X_PSK250R) \ ELEM2_(541, PSK250X6, MODE_6X_PSK250) \ ELEM2_(545, PSK250RX6, MODE_6X_PSK250R) \ ELEM2_(551, PSK250RX7, MODE_7X_PSK250R) \ \ ELEM2_(553, PSK500RX2, MODE_2X_PSK500R) \ ELEM2_(558, PSK500RX3, MODE_3X_PSK500R) \ ELEM2_(564, PSK500RX4, MODE_4X_PSK500R) \ ELEM2_(566, PSK500X2, MODE_2X_PSK500) \ ELEM2_(569, PSK500X4, MODE_4X_PSK500) \ \ ELEM2_(570, PSK1000, MODE_PSK1000) \ ELEM2_(580, PSK1000R, MODE_PSK1000R) \ ELEM2_(587, PSK1000X2, MODE_2X_PSK1000) \ ELEM2_(595, PSK1000RX2, MODE_2X_PSK1000R) \ ELEM2_(604, PSK800RX2, MODE_2X_PSK800R) \ ELEM2_(610, PSK800X2, MODE_2X_PSK800) \ \ ELEM2_(620, MFSK64, MODE_MFSK64) \ ELEM2_(625, MFSK128, MODE_MFSK128) \ \ ELEM2_(639, THOR25x4, MODE_THOR25x4) \ ELEM2_(649, THOR50x1, MODE_THOR50x1) \ ELEM2_(653, THOR50x2, MODE_THOR50x2) \ ELEM2_(658, THOR100, MODE_THOR100) \ \ ELEM2_(662, DOMINOEX_44, MODE_DOMINOEX44) \ ELEM2_(681, DOMINOEX_88, MODE_DOMINOEX88) \ \ ELEM2_(687, MFSK31, MODE_MFSK31) \ \ ELEM2_(1026, MFSK64L, MODE_MFSK64L) \ ELEM2_(1029, MFSK128L, MODE_MFSK128L) \ \ ELEM2_(1066, PSK8P125, MODE_8PSK125) \ ELEM2_(1071, PSK8P250, MODE_8PSK250) \ ELEM2_(1076, PSK8P500, MODE_8PSK500) \ ELEM2_(1047, PSK8P1000, MODE_8PSK1000) \ \ ELEM2_(1037, PSK8P125F, MODE_8PSK125F) \ ELEM2_(1038, PSK8P250F, MODE_8PSK250F) \ ELEM2_(1043, PSK8P500F, MODE_8PSK500F) \ ELEM2_(1078, PSK8P1000F, MODE_8PSK1000F) \ ELEM2_(1058, PSK8P1200F, MODE_8PSK1200F) \ \ ELEM2_(1239, PSK8P125FL, MODE_8PSK125FL) \ ELEM2_(2052, PSK8P250FL, MODE_8PSK250FL) \ \ ELEM2_(1171, IFKP, MODE_IFKP) \ \ ELEM2_(0, NONE2, NUM_MODES) #define ELEM2_(code_, tag_, mode_) RSID_ ## tag_ = code_, enum { RSID_LIST2 }; #undef ELEM2_ #define ELEM2_(code_, tag_, mode_) { RSID_ ## tag_, mode_, #tag_ }, const RSIDs cRsId::rsid_ids_2[] = { RSID_LIST2 }; #undef ELEM2_ const int cRsId::rsid_ids_size2 = sizeof(rsid_ids_2)/sizeof(*rsid_ids_2) - 1; fldigi-4.1.06/src/wwv/0000775000175000017500000000000013515625027011463 500000000000000fldigi-4.1.06/src/wwv/analysis.cxx0000664000175000017500000001216113507401434013746 00000000000000// ---------------------------------------------------------------------------- // anal.cxx -- anal modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "analysis.h" #include "modem.h" #include "misc.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #include "waterfall.h" #include "main.h" #include "fl_digi.h" #include "timeops.h" #include "debug.h" using namespace std; static char msg1[80]; void anal::tx_init() { } void anal::rx_init() { phaseacc = 0; put_MODEstatus(mode); } void anal::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::RTTY); } anal::~anal() { delete bpfilt; delete ffilt; delete afilt; } void anal::restart() { double fhi = ANAL_BW * 1.1 / samplerate; double flo = 0.0; if (bpfilt) bpfilt->create_filter(flo, fhi); else bpfilt = new fftfilt(flo, fhi, 2048); set_bandwidth(ANAL_BW); ffilt->reset(); afilt->reset(); elapsed = 0.0; fout = 0.0; wf_freq = frequency; if (clock_gettime(CLOCK_REALTIME, &start_time) == -1) { LOG_PERROR("clock_gettime"); abort(); } passno = 0; dspcnt = DSP_CNT; for (int i = 0; i < PIPE_LEN; i++) pipe[i] = 0; if (write_to_csv) stop_csv(); start_csv(); } anal::anal() { mode = MODE_ANALYSIS; samplerate = ANAL_SAMPLERATE; bpfilt = (fftfilt *)0; ffilt = new Cmovavg(FILT_LEN * samplerate); afilt = new Cmovavg(FILT_LEN * samplerate); analysisFilename = TempDir; analysisFilename.append("analysis.csv"); cap &= ~CAP_TX; write_to_csv = false; restart(); } void anal::clear_syncscope() { set_scope(0, 0, false); } cmplx anal::mixer(cmplx in) { cmplx z = cmplx( cos(phaseacc), sin(phaseacc)) * in; phaseacc -= TWOPI * frequency / samplerate; if (phaseacc < 0) phaseacc += TWOPI; return z; } void anal::start_csv() { FILE *out = fl_fopen(analysisFilename.c_str(), "w"); if (unlikely(!out)) { LOG_PERROR("fl_fopen"); return; } fprintf(out, "Clock,Elapsed Time,Freq Error,RF,|amp|,20log(|amp|)\n"); fclose(out); put_status("Writing csv file"); write_to_csv = true; } void anal::stop_csv() { write_to_csv = false; put_status(""); } void anal::writeFile() { if (!write_to_csv) return; time_t now = time(NULL); struct tm tm; gmtime_r(&now, &tm); FILE* out = fl_fopen(analysisFilename.c_str(), "a"); if (unlikely(!out)) { LOG_PERROR("fl_fopen"); return; } fprintf(out, "%02d:%02d:%02d, %8.3f, %8.3f, %12.3f, %8.3f, %8.2f\n", tm.tm_hour, tm.tm_min, tm.tm_sec, elapsed, fout, (wf->rfcarrier() + (wf->USB() ? 1.0 : -1.0) * (frequency + fout)), amp, 20.0 * log10( (amp == 0 ? 1e-6 : amp) ) ); fclose(out); put_status("Writing csv file"); } int anal::rx_process(const double *buf, int len) { cmplx z, *zp; double fin; int n = 0; if (wf_freq != frequency) { restart(); set_scope(pipe, PIPE_LEN, false); } for (int i = 0; i < len; i++) { // create analytic signal from sound card input samples z = cmplx( *buf, *buf ); buf++; // mix it with the audio carrier frequency to create a baseband signal z = mixer(z); // low pass filter using Windowed Sinc - Overlap-Add convolution filter n = bpfilt->run(z, &zp); if (n) { for (int j = 0; j < n; j++) { // measure phase difference between successive samples to determine // the frequency of the baseband signal (+anal_baud or -anal_baud) // see class cmplx definiton for operator % fin = arg( conj(prevsmpl) * zp[j] ) * samplerate / TWOPI; prevsmpl = zp[j]; // filter using moving average filter fout = ffilt->run(fin); amp = afilt->run(abs(zp[j])); } } //else prevsmpl = z; } if (passno++ > 10) { dspcnt -= (1.0 * n / samplerate); if (dspcnt <= 0) { for (int i = 0; i < PIPE_LEN -1; i++) pipe[i] = pipe[i+1]; double fdsp = fout / 4.0; if (fabs(fdsp) < 2.6) { elapsed += DSP_CNT - dspcnt; pipe[PIPE_LEN - 1] = fout / 4.0; set_scope(pipe, PIPE_LEN, false); if (wf->USB()) snprintf(msg1, sizeof(msg1), "%12.2f", wf->rfcarrier() + frequency + fout ); else snprintf(msg1, sizeof(msg1), "%12.2f", wf->rfcarrier() - frequency - fout ); put_Status2(msg1, 2.0); writeFile(); } // reset the display counter & the pipe pointer dspcnt = DSP_CNT; } } return 0; } //===================================================================== // anal transmit //===================================================================== int anal::tx_process() { return -1; } fldigi-4.1.06/src/wwv/wwv.cxx0000644000175000017500000001142213472116001012735 00000000000000// ---------------------------------------------------------------------------- // wwv.cxx -- wwv monitoring modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // // This modem is only used for reception of WWV "tick" signals to determine // the correction factor to be applied to the sound card oscillator. #include #include #include #include #include #include "wwv.h" #include "fl_digi.h" using namespace std; void wwv::tx_init() { phaseacc = 0; } void wwv::rx_init() { phaseacc = 0.0; smpl_ctr = 0; // sample counter for timing wwv rx agc = 0.0; // threshold for tick detection ticks = 0; calc = false; zoom = false; set_scope_mode(Digiscope::WWV); put_MODEstatus(mode); } void wwv::init() { modem::init(); rx_init(); } wwv::~wwv() { if (hilbert) delete hilbert; if (lpfilter) delete lpfilter; if (vidfilter) delete vidfilter; } wwv::wwv() : modem() { double lp; mode = MODE_WWV; frequency = 1000; bandwidth = 200; samplerate = 8000; // phase increment expected at the tick freq phaseincr = 2.0 * M_PI * frequency / samplerate; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); lp = 0.5 * bandwidth / samplerate; lpfilter = new C_FIR_filter(); lpfilter->init_lowpass (FIRLEN_1, DEC_1, lp); vidfilter = new Cmovavg(16); makeaudio(); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For wwv this is video signal much like a FAX display //======================================================================= // void wwv::update_syncscope() { double max = 0, min = 1e6, range; for (int i = 0; i < 1000; i++ ) { if (max < buffer[i]) max = buffer[i]; if (min > buffer[i]) min = buffer[i]; } range = max - min; for (int i = 0; i < 1000; i++ ) { buffer[i] = 255*(buffer[i] - min) / range; } if (zoom) set_video(&buffer[400], 200); else set_video(buffer, 1000); buffer.next(); // change buffers } //===================================================================== // wwv_rxprocess() // Called with a block (512 samples) of audio. // Nominal sound card sampling rate is set to 8000 Hz //======================================================================= int wwv::rx_process(const double *buf, int len) { cmplx z, znco; while (len-- > 0) { z = cmplx ( *buf, *buf ); buf++; hilbert->run(z, z); znco = cmplx ( cos(phaseacc), sin(phaseacc) ); z = znco * z; phaseacc += phaseincr; if (phaseacc > TWOPI) phaseacc -= TWOPI; if (lpfilter->run ( z, z )) { buffer[smpl_ctr % 1000] = vidfilter->run( abs(z) ); if (++smpl_ctr >= 1000) { update_syncscope(); smpl_ctr = 0; } } } return 0; } void wwv::set1(int x, int y) { int zfactor = 500; if (zoom) zfactor = 100; smpl_ctr -= ((2*x - y) * zfactor) / y; if (smpl_ctr < 0) smpl_ctr += 1000; if (smpl_ctr > 1000) smpl_ctr -= 1000; } char strPPM[20]; void wwv::set2(int x, int y) { zoom = !zoom; } //====================================================================== // transmit time tick //====================================================================== void wwv::makeshape() { for (int i = 0; i < 32; i++) keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / 32)); } double wwv::nco(double freq) { phaseacc += 2.0 * M_PI * freq / samplerate; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; return sin(phaseacc); } void wwv::makeaudio() { phaseacc = 0.0; makeshape(); for (int i = 0; i < 400; i++) { audio[i] = (i < 200 ? nco(1000) : 0); quiet[i] = 0; } for (int i = 0; i < 32; i++) { audio[i] *= keyshape[i]; audio[199 - i] *= keyshape[i]; } } int wwv::tx_process() { static int cycle = 4; int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; return -1; } if (--cycle == 0) { memcpy(play, audio, 400 * sizeof(double)); ModulateXmtr(play, 400); cycle = 4; } else ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); return 0; } fldigi-4.1.06/src/wefax/0000775000175000017500000000000013515625027011752 500000000000000fldigi-4.1.06/src/wefax/wefax-pic.cxx0000644000175000017500000017415613472115774014322 00000000000000// ---------------------------------------------------------------------------- // wefax-pic.cxx -- wefax support functions // // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. Adapted from code contained in HAMFAX source code // distribution. // Hamfax Copyright (C) Christof Schmitt // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "wefax-pic.h" #include "debug.h" #include "configuration.h" #include "wefax.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "fileselect.h" #include "wefax_map.h" #include "gettext.h" Fl_Double_Window *wefax_pic_rx_win = (Fl_Double_Window *)0; static Fl_Scroll *wefax_pic_rx_scroll = (Fl_Scroll *)0 ; static wefax_map *wefax_pic_rx_wefax_map = (wefax_map *)0; static Fl_Button *wefax_btn_rx_save = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_abort = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_pause = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_resume = (Fl_Button *)0; static Fl_Choice *wefax_choice_rx_zoom = (Fl_Choice *)0; static Fl_Browser *wefax_browse_rx_events = (Fl_Browser *)0; static Fl_Button *wefax_btn_rx_skip_apt = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_skip_phasing = (Fl_Button *)0; static Fl_Light_Button *wefax_round_rx_noise_removal = (Fl_Light_Button *)0; static Fl_Light_Button *wefax_round_rx_binary = (Fl_Light_Button *)0; static Fl_Spinner *wefax_spinner_rx_binary = (Fl_Spinner *)0; static Fl_Light_Button *wefax_round_rx_non_stop = (Fl_Light_Button *)0; static Fl_Output *wefax_out_rx_row_num = (Fl_Output *)0; //static Fl_Output *wefax_out_rx_width = (Fl_Output *)0; static Fl_Choice *wefax_choice_rx_lpm = (Fl_Choice *)0; static Fl_Counter *wefax_cnt_rx_ratio = (Fl_Counter *)0; static Fl_Counter *wefax_rx_center = (Fl_Counter *)0; static Fl_Light_Button *wefax_round_rx_auto_center = (Fl_Light_Button *)0; static Fl_Chart *wefax_chart_rx_power = (Fl_Chart *)0; static Fl_Choice *wefax_choice_rx_filter = (Fl_Choice *)0; Fl_Double_Window *wefax_pic_tx_win = (Fl_Double_Window *)0; static Fl_Scroll *wefax_pic_tx_scroll = (Fl_Scroll *)0 ; static wefax_map *wefax_pic_tx_wefax_map = (wefax_map *)0; static wefax_picbox *wefax_pic_tx_box = (wefax_picbox *)0; static Fl_Choice *wefax_choice_tx_zoom = (Fl_Choice *)0; static Fl_Choice *wefax_choice_tx_lpm = (Fl_Choice *)0; static Fl_Button *wefax_btn_tx_send_color = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_send_grey = (Fl_Button *)0; static Fl_Output *wefax_out_tx_row_num = (Fl_Output *)0; static Fl_Output *wefax_out_tx_col_num = (Fl_Output *)0; static Fl_Button *wefax_btn_tx_send_abort = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_load = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_clear = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_close = (Fl_Button *)0; /// The image to send. static Fl_Shared_Image *wefax_shared_tx_img = (Fl_Shared_Image *)0; /// This contains the original content of the image to send, /// converted into three bytes per pixel. static unsigned char *wefax_xmtimg = (unsigned char *)0; /// This indicates whether an image to send is loaded in the GUI. /// It allows to acquire twice when re-loading an image without sending. static bool wefax_image_loaded_in_gui = false ; /// Used for shifting the received image left and right. static volatile int center_val_prev = 0 ; static volatile bool enable_auto_center = false ; static volatile bool global_auto_center = false ; void wefax_pic::update_auto_center(bool is_auto_center) { global_auto_center = is_auto_center && enable_auto_center; } /// Global pointer to the current wefax modem. static wefax *wefax_serviceme = 0; /// TODO: This should be hidden in the class wefax_map. It is in wefax too. static const int bytes_per_pix = 3 ; /// Initial size of the reception image. A typical fax has about 1300 lines. static const int curr_pix_h_default = 300 ; /// Always reset before loading a new image. static volatile int curr_pix_height = curr_pix_h_default ; /// The antepenultimate line of the rx image is filtered to remove noise. static int rx_last_filtered_row = 0 ; static bool noise_removal = false ; /// Alters the slanting of the image based on LPM adjustments. static volatile double rx_slant_ratio = 0.0 ; /// This transforms the user slant ratio (Small number around 0.0) /// into a ratio used to stretch the image (Very very small mantissa added to 1.0). static double slant_factor_default(void) { return 100.0 / ( rx_slant_ratio + 100.0 ); } static double slant_factor_with_ratio( double ratio_percent ) { return ( ratio_percent + 100.0 ) / ( rx_slant_ratio + 100.0 ); } /// Minimum fax number of rows should be at least this size. //static const int mini_max_fax_lines = 1000 ; /// When set by the user, no new pixel is added or printed. /// However, when the printing resumes, the position is not altered. static volatile bool reception_paused = false ; /// Sets the label of the received or sent image. static void set_win_label( Fl_Window * wefax_pic, const std::string & lab) { /// If the wefax window (rx or tx) is embedded in the main window. // then we would set wefax_pic = fl_digi_main; if( progdefaults.WEFAX_EmbeddedGui ) return ; char* label = strdup(lab.c_str()); wefax_pic->copy_label(label); free(label); wefax_pic->redraw(); } /// Called when clearing the image to send. static void clear_image(void) { ENSURE_THREAD(FLMAIN_TID); if (wefax_xmtimg) { delete [] wefax_xmtimg; wefax_xmtimg = NULL ; } if (wefax_shared_tx_img) { wefax_shared_tx_img->release(); wefax_shared_tx_img = 0; } set_win_label(wefax_pic_tx_win,""); } /// Clears the loaded image. It allows XML-RPC clients to send an image. static void wefax_cb_pic_tx_clear( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); wefax_image_loaded_in_gui = false ; clear_image(); wefax_pic_tx_wefax_map->clear(); wefax_pic_tx_wefax_map->resize(0,0,0,0); wefax_pic::restart_tx_viewer(); /// Now the lock can be acquired by XML-RPC. wefax_serviceme->transmit_lock_release( "Cleared" ); } /// According to config flags, shows or hides the transmission window, and resizes both windows if needed. static void wefax_pic_show_tx() { ENSURE_THREAD(FLMAIN_TID); if( progdefaults.WEFAX_HideTx ) { wefax_pic_tx_win->hide(); if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_rx_win->resize( text_panel->x(), text_panel->y(), text_panel->w(), text_panel->h() ); wefax_pic_rx_win->redraw(); } } else { if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_rx_win->resize( text_panel->x(), text_panel->y(), text_panel->w(), text_panel->h()/2); wefax_pic_tx_win->resize( text_panel->x(), wefax_pic_rx_win->y() + wefax_pic_rx_win->h(), text_panel->w(), text_panel->h() - wefax_pic_rx_win->h()); } wefax_pic_tx_win->show(); wefax_pic_rx_win->redraw(); wefax_pic_tx_win->redraw(); } } static void wefax_cb_pic_tx_close( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); /// TODO: Small inconvenience: When coming back in wefax mode, the tx window is always closed. progdefaults.WEFAX_HideTx = true ; wefax_pic_show_tx(); } /// Usual LPM values. static const struct { int m_value ; const char * m_label ; } all_lpm_values[] = { { 240, "240" }, { 120, "120" }, { 90, "90" }, { 60, "60" } }; static const int nb_lpm_values = sizeof(all_lpm_values) / sizeof(all_lpm_values[0]); /// Returns the LPM value choosed on the TX or RX window. static int get_choice_lpm_value( Fl_Choice * the_choice_lpm ) { int idx_lpm = the_choice_lpm->value(); if( ( idx_lpm < 0 ) || ( idx_lpm >= nb_lpm_values ) ) { LOG_WARN( "Invalid LPM index=%d", idx_lpm ); idx_lpm = 0 ; } return all_lpm_values[ idx_lpm ].m_value ; } /// Lpm=120 is by far the most common value, therefore used by default if nothing else works. // wefax.cxx will anyway try 120 for wefax576 or 60 for wefax288. static const int lpm_default_idx = 1 ; static const char * title_choice_lpm = "LPM" ; /// Fills a FLTK widget with LPM vpossible values. Used for transmission and reception. static Fl_Choice * make_lpm_choice( int width_offset, int y_btn, int width_btn, int hei_tx_btn ) { Fl_Choice * choice_lpm = new Fl_Choice(width_offset, y_btn, width_btn, hei_tx_btn, title_choice_lpm ); for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { choice_lpm->add( all_lpm_values[ ix_lpm ].m_label ); }; choice_lpm->value(lpm_default_idx); choice_lpm->tooltip(_("Set the LPM value")); return choice_lpm ; } /// Sometimes the LPM can be calculated to 122.0 when it should be 120.0. int wefax_pic::normalize_lpm( double the_lpm ) { for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { int curr_lpm = all_lpm_values[ ix_lpm ].m_value ; if( std::fabs( the_lpm - curr_lpm ) < 3.0 ) { return curr_lpm ; } }; int dflt_lpm = all_lpm_values[ lpm_default_idx ].m_value ; LOG_INFO("Out of bounds LPM=%f. Setting to default:%d", the_lpm, dflt_lpm ); return dflt_lpm ; } /// At this place, the LPM should have been normalized. static void set_nearest_lpm( int the_lpm ) { for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { if( the_lpm == all_lpm_values[ ix_lpm ].m_value ) { wefax_choice_rx_lpm->value( ix_lpm ); return ; } }; LOG_INFO("Unknown LPM=%d. Reset to default:%d", the_lpm, all_lpm_values[ lpm_default_idx ].m_value ); wefax_choice_rx_lpm->value( lpm_default_idx ); } /// Called just before starting to receive the image. The LPM should be normalized. void wefax_pic::update_rx_lpm( int the_lpm ) { ENSURE_THREAD(FLMAIN_TID); set_nearest_lpm( the_lpm ); /// We keep the previous value of the slant ratio. wefax_cnt_rx_ratio->value( rx_slant_ratio ); /// The increment must be very small otherwise the image is too slanted. // wefax_cnt_rx_ratio->step( 0.001 ); // wefax_cnt_rx_ratio->lstep( 0.010 ); // wefax_cnt_rx_ratio->precision( 3 ); /// TODO: Not sure about the difference between range() and bounds(). wefax_cnt_rx_ratio->range( -1.0, 1.0 ); wefax_cnt_rx_ratio->bounds( -1.0, 1.0 ); wefax_cnt_rx_ratio->redraw(); } /// Called for each new color component. int wefax_pic::update_rx_pic_col(unsigned char data, int pix_pos ) { /// Each time the received image becomes too high, we increase its height. static const int curr_pix_incr_height = 100 ; /// Three ints per pixel. It is safer to recalculate the /// row index to avoid any buffer overflow, because the given /// row is invalid if the image was horizontally moved. int row_number = 1 + ( pix_pos / ( wefax_pic_rx_wefax_map->pix_width() * bytes_per_pix ) ); /// Maybe we must increase the image height. if( curr_pix_height <= row_number ) { curr_pix_height = row_number + curr_pix_incr_height ; wefax_pic_rx_wefax_map->resize_height( curr_pix_height, false ); int y_pos = wefax_pic_rx_wefax_map->h() - wefax_pic_rx_scroll->h() ; if( y_pos < 0 ) { y_pos = 0 ; } else { // Small margin at the bottom, so we can immediately see new lines. y_pos += 20 ; } wefax_pic_rx_wefax_map->position( wefax_pic_rx_wefax_map->x(), -y_pos ); wefax_pic_rx_scroll->redraw(); } wefax_pic_rx_wefax_map->pixel(data, pix_pos); return row_number ; } /// This estimates the colum of where the horizontal center of the image is, /// or rather, the beginning of the left margin. The estimation is done on /// a range of rows. It looks for a vertical band of X pixels, where the image /// derivative is the lowest. It works well with faxes because they always have /// a wide blank margin. // capture one interval of centering computation #define CAPTURE 4 int capture = CAPTURE; static int estimate_rx_image_center( int row_end )//, int numrows ) { /// This works as well with color images. int img_wid = wefax_pic_rx_wefax_map->pix_width() * bytes_per_pix ; /// Much bigger that a char, so we can add values without overflow. int img_buf[ img_wid ]; // for( int col_ix = 0; col_ix < img_wid ; ++col_ix ) { // img_buf[ col_ix ] = 0 ; // } memset(img_buf, 0, img_wid*sizeof(img_buf[0])); unsigned const char * img_start = wefax_pic_rx_wefax_map->buffer(); /// This computes the absolute value of the horizontal derivative // /* for( int row_ix = 1; row_ix < row_end ; ++row_ix ) { int col_offset = row_ix * img_wid ; /// Pixels of the current row. const unsigned char * row_start = img_start + col_offset ; /// This is the previous colum of the next row, does not matter. int pix_prev = row_start[img_wid - 1]; /// This is an estimation of how the image has information or is just uniform. for( int col_ix = 0; col_ix < img_wid ; ++col_ix ) { int pix_next = row_start[ col_ix ]; /// Absolute value of the horizontal derivative. int deriv = pix_next - pix_prev; if( deriv < 0 ) { deriv = -deriv ; } img_buf[ col_ix ] += deriv ; /// Used at next iteration so that the memory is read once only. pix_prev = pix_next ; } } // */ /* for( int row_ix = 1; row_ix < row_end ; ++row_ix ) { const unsigned char * row_start = img_start + row_ix * img_wid ; for( int col_ix = 1; col_ix <= img_wid ; ++col_ix ) { img_buf[col_ix -1] += abs(row_start[(col_ix) % img_wid] - row_start[col_ix - 1]); } } */ /// Much bigger that a char, so we can add values without overflow. int img_avg[ img_wid ]; /// The half width of the image band on which we compute the average /// of the absolute value of the horizontal derivate. static const int avg_wid = 150 ; // /* int curr_avg = 0 ; /// Average of the first column. for( int col_ix = 0; col_ix < avg_wid ; ++col_ix ) { curr_avg += img_buf[ col_ix ] ; } img_avg[ 0 ] = curr_avg ; /// Rest of the average in a single pass. for( int col_ix = 1; col_ix < img_wid - avg_wid ; ++col_ix ) { curr_avg += img_buf[ col_ix + avg_wid ] - img_buf[ col_ix - 1 ]; img_avg[ col_ix ] = curr_avg ; } /// Finishes the last bit which wraps at the beginning of the row. for( int col_ix = img_wid - avg_wid; col_ix < img_wid ; ++col_ix ) { curr_avg += img_buf[ col_ix + avg_wid - img_wid ] - img_buf[ col_ix - 1 ]; img_avg[ col_ix ] = curr_avg ; } // */ /* int curr_avg = 0 ; for (int col = 1; col < img_wid; col ++) { curr_avg = 0; for (int n = 0; n < avg_wid; n++) { curr_avg += img_buf[(col + n) % img_wid]; } img_avg[col] = curr_avg / avg_wid; } img_avg[0] = img_avg[1]; */ if (capture > 0) { capture--; if (capture == 0) { int avgs[img_wid]; int numrows = 100; const unsigned char *pch = img_start; int avgval = 0; for (int col = 0; col < img_wid; ++col) { avgval = 0; for (int row = row_end - numrows; row < row_end; ++row) { avgval += (int)(pch[row * img_wid + col]); } avgs[col] = avgval / numrows; } ofstream csvfile("img.csv"); for (int col = 0; col < img_wid; ++col) { csvfile << avgs[col] << ",," << img_buf[col] << "," << img_avg[col] << std::endl; } csvfile.close(); std::cout << "done\n"; } } /* /// Find the minimum of the derivative on an averaged segment. Last col is zero. int min_idx = -1 ; int min_val = INT_MAX ; for( int col_ix = 0; col_ix < img_wid - 1 ; ++col_ix ) { int avg_val = img_avg[ col_ix ] ; if( avg_val < min_val ) { min_idx = col_ix ; min_val = avg_val ; } } if( (min_idx < 0) || (min_idx >= img_wid) ) { LOG_ERROR("ERROR MINIMUM:%d",min_idx); return 0 ; } /// Better shift left than shift right too much. if( min_idx > img_wid / 2 ) { min_idx = min_idx - img_wid ; } /// Three chars per pixel. min_idx /= bytes_per_pix ; return min_idx ; */ // /* /// Find the maximum of the derivative on an averaged segment. int max_idx = -1 ; int max_val = 0; for( int col = 0; col < img_wid - 1 ; ++col ) { int avg_val = img_avg[ col ] ; if( avg_val > max_val ) { max_idx = col ; max_val = avg_val ; } } max_idx -= avg_wid / 2; std::cout << "Max val " << max_val << " @ " << max_idx << std::endl; if( (max_idx < 0) || (max_idx >= img_wid) ) { LOG_ERROR("Maximum at index value %d", max_idx); max_idx = 0; } /// Better shift left than shift right too much. if( max_idx > img_wid / 2 ) { max_idx = max_idx - img_wid ; } /// Three chars per pixel. max_idx /= bytes_per_pix ; return max_idx ; // */ } /// Called for each bw pixel. void wefax_pic::update_rx_pic_bw(unsigned char data, int pix_pos ) { /// No pixel is added nor printed until this flag is reset to false. if( reception_paused ) { return ; }; /// The image must be horizontally shifted. pix_pos += center_val_prev * bytes_per_pix ; if( pix_pos < 0 ) { pix_pos = 0 ; } /// Maybe there is a slant. pix_pos = ( double )pix_pos * slant_factor_default() + 0.5 ; /// Must be a multiple of the number of bytes per pixel. pix_pos = ( pix_pos / bytes_per_pix ) * bytes_per_pix ; static int last_row_number = 0 ; update_rx_pic_col(data, pix_pos); update_rx_pic_col(data, pix_pos + 1); int row_number = update_rx_pic_col(data, pix_pos + 2); /// Prints the row number sometimes only, to save CPU. if( ( pix_pos % 5000 ) == 0 ) { char row_num_buffer[20]; snprintf( row_num_buffer, sizeof(row_num_buffer), "%d", row_number ); wefax_out_rx_row_num->value( row_num_buffer ); } /// Maybe we restarted an image or maybe went back because of recentering. if( last_row_number > row_number ) { last_row_number = row_number ; } /// Eliminate the noise from the ante-antepenultimate line if( noise_removal ) { if( ( row_number > wefax_map::noise_height_margin - 2 ) && ( row_number != rx_last_filtered_row ) ) { static bool math_morph_enhancement = false ; /* Not used yet because this depends on the image features. * Lines are properly enhancement, but not letters. * Maybe row_number > 2 * wefax_map::noise_height_margin * Also decrease wefax_map::noise_height_margin and ensure image is repaired * when switching on/off noise removal. */ if( math_morph_enhancement ) { wefax_pic_rx_wefax_map->dilatation( row_number - 2 * wefax_map::noise_height_margin ); wefax_pic_rx_wefax_map->erosion( row_number - 1 * wefax_map::noise_height_margin ); } wefax_pic_rx_wefax_map->remove_noise( row_number, progdefaults.WEFAX_NoiseMargin, progdefaults.WEFAX_NoiseThreshold ); rx_last_filtered_row = row_number ; } } /// We start to recenter only if the row number is bigger than that. static const int row_margin = 100 ; /// We try to recenter every X rows. static const int row_recenter_period = 10; /// Every new X-th row, maybe automatic recenter. if( ( (row_number % row_recenter_period) == 0 ) && ( row_number > row_margin ) && ( row_number >= last_row_number + row_recenter_period ) ) { int delta_center = estimate_rx_image_center( row_number ); // int delta_center = estimate_rx_image_center( row_number, 10 ); if (global_auto_center) { // static const int neglect_center = 3 ; // if( (delta_center > -neglect_center) && (delta_center < neglect_center) ) { if (abs(delta_center) < 3) { /// We may stop the centering algorithm but it is not stable at the beginning. // update_auto_center(false); } else { center_val_prev -= delta_center ; wefax_pic_rx_wefax_map->shift_horizontal_center( -delta_center ); } } /// Beware that the line number may go backward if the image is left-shifted, /// that is, shortened. Is this assignment REALLY necessary ? last_row_number = row_number ; } } static void wefax_cb_pic_rx_pause( Fl_Widget *, void *) { wefax_btn_rx_pause->hide(); wefax_btn_rx_resume->show(); reception_paused = true ; wefax_serviceme->update_rx_label(); } static void wefax_cb_pic_rx_resume( Fl_Widget *, void *) { wefax_btn_rx_pause->show(); wefax_btn_rx_resume->hide(); reception_paused = false ; wefax_serviceme->update_rx_label(); } static void LocalSleep( int seconds ) { #ifdef __MINGW32__ MilliSleep(seconds); #else usleep(100000*seconds); #endif } /// Displays the latest image file saved. static void add_to_files_list( const std::string & the_fil_nam ) { ENSURE_THREAD(FLMAIN_TID); /// If the beginning of the file is the default output directory, do not print it. std::string dst_file( the_fil_nam ); int pos_dflt = dst_file.find( progdefaults.wefax_save_dir ); if( pos_dflt == 0 ) { dst_file.erase( 0, progdefaults.wefax_save_dir.size() ); } int curr_siz = wefax_browse_rx_events->size(); std::stringstream tmp_strm ; /// 999 images seem a reasonable sizing (3 digits). tmp_strm << std::setw(3) << ( curr_siz + 1 ) << " " << dst_file; /// The complete file name is stored. It needs a private copy. wefax_browse_rx_events->add( tmp_strm.str().c_str(), strdup( the_fil_nam.c_str() ) ); wefax_browse_rx_events->bottomline( curr_siz + 1 ); /// This window is hidden/shown to signal that a file was added. static const int nb_blink = 5 ; for( int ix_blink = 0 ; ix_blink < nb_blink ; ++ix_blink ) { wefax_browse_rx_events->hide(); wefax_browse_rx_events->redraw(); LocalSleep(1); wefax_browse_rx_events->show(); wefax_browse_rx_events->redraw(); LocalSleep(1); } /// If there is not directory specification, adds the default dir. if( the_fil_nam.empty() ) LOG_WARN("Empty file name"); else if( the_fil_nam[0] != '/' ) wefax_serviceme->put_received_file( progdefaults.wefax_save_dir + '/' + the_fil_nam ); else wefax_serviceme->put_received_file( the_fil_nam ); }; static void wefax_cb_pic_rx_abort( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); if (wefax_serviceme != active_modem) return; /// This will call wefax_pic::abort_rx_viewer wefax_serviceme->end_reception(); wefax_round_rx_non_stop->value(false); wefax_serviceme->set_rx_manual_mode(false); wefax_round_rx_non_stop->redraw(); wefax_btn_rx_pause->show(); wefax_btn_rx_resume->hide(); } void wefax_pic::set_manual( bool manual ) { wefax_round_rx_non_stop->value(manual); } static void wefax_cb_pic_rx_manual( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; if( wefax_round_rx_non_stop->value() ) { wefax_serviceme->set_rx_manual_mode(true); wefax_serviceme->skip_apt(); wefax_serviceme->skip_phasing(true); } else { wefax_serviceme->set_rx_manual_mode(false); } } static void wefax_cb_pic_rx_center( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int center_new_val = wefax_rx_center->value(); int center_delta = center_new_val - center_val_prev ; center_val_prev = center_new_val ; /// Not sure whether lock/unlock is necessary. wefax_pic_rx_wefax_map->shift_horizontal_center( center_delta ); } static void wefax_cb_pic_rx_auto_center( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_auto_center->value(); enable_auto_center = rndVal ? true : false; wefax_pic::update_auto_center(global_auto_center); } /// This gets the directory where images are accessed by default. static std::string default_dir_get( const std::string & config_dir ) { std::string tmp_dir = config_dir.empty() ? PicsDir : config_dir ; /// Valid dir names must end with a slash. if( ! tmp_dir.empty() ) { char termin = tmp_dir[ tmp_dir.size() - 1 ]; if( ( termin != '/' ) && ( termin != '\\' ) ) tmp_dir += '/'; } return tmp_dir ; } /// This sets the directory where images are accessed by default. /// Receives a file name, not a directory name. static void default_dir_set( std::string & config_dir, const std::string & fil_name ) { char * fil_nam_copy = strdup( fil_name.c_str() ); /// dirname() is a POSIX function. const char * dir_nam = dirname( fil_nam_copy ); config_dir = dir_nam + std::string("/"); LOG_INFO("Setting default dir to %s", dir_nam ); free( fil_nam_copy ); } /// Adds the file name to log to the adif file. static void qso_notes( const char * direction, const std::string & file_name ) { if( progdefaults.WEFAX_AdifLog == false ) { return ; } const std::string tmp_notes = direction + file_name ; wefax_serviceme->qso_rec().putField( NOTES, tmp_notes.c_str() ); } static void wefax_cb_pic_rx_save( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); const char ffilter[] = "Portable Network Graphics\t*.png\n"; std::string dfname = default_dir_get( progdefaults.wefax_save_dir ); dfname.append( wefax_serviceme->suggested_filename() ); const char *file_name = FSEL::saveas(_("Save image as:"), ffilter, dfname.c_str(), NULL); /// Beware that no extra comments are saved here. if (!file_name) return; if (!*file_name) return; wefax_pic_rx_wefax_map->save_png(file_name,progdefaults.WEFAX_SaveMonochrome); qso_notes( "RX:", file_name ); wefax_serviceme->qso_rec_save(); /// Next time, image will be saved at the same place. default_dir_set( progdefaults.wefax_save_dir, file_name ); add_to_files_list( file_name ); } /// Beware, might be called by another thread. Called by the GUI /// or when APT start is detected. void wefax_pic::skip_rx_apt(void) { ENSURE_THREAD(FLMAIN_TID); wefax_btn_rx_abort->hide(); wefax_btn_rx_skip_apt->hide(); wefax_btn_rx_skip_phasing->show(); // wefax_round_rx_noise_removal->hide(); // wefax_round_rx_binary->hide(); // wefax_spinner_rx_binary->hide(); } /// Called when the user clicks "Skip APT" static void wefax_cb_pic_rx_skip_apt( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); wefax_serviceme->skip_apt(); } /// Called when clicking "Skip phasing" or by wefax.cxx /// when end of phasing is detected. Beware, might be called by another thread. void wefax_pic::skip_rx_phasing(bool auto_center) { ENSURE_THREAD(FLMAIN_TID); /// Theoretically, this widget should already be hidden, but sometimes /// it seems that a call to skip_apt is lost... ? wefax_btn_rx_abort->show(); wefax_btn_rx_skip_apt->hide(); wefax_btn_rx_skip_phasing->hide(); wefax_round_rx_noise_removal->show(); if( progdefaults.WEFAX_SaveMonochrome ) { wefax_round_rx_binary->show(); wefax_spinner_rx_binary->show(); } wefax_out_rx_row_num->show(); // wefax_out_rx_width->show(); wefax_cnt_rx_ratio->show(); wefax_rx_center->show(); wefax_round_rx_auto_center->show(); update_auto_center(auto_center); } /// Called when clicking "Skip phasing". static void wefax_cb_pic_rx_skip_phasing( Fl_Widget *w, void *) { if (wefax_serviceme != active_modem) return; wefax_serviceme->skip_phasing(true); } static void wefax_cb_pic_rx_noise_removal( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_noise_removal->value(); noise_removal = rndVal ? true : false; } static void wefax_cb_pic_rx_binary( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_binary->value(); if( rndVal ) { wefax_pic_rx_wefax_map->set_binary( true ); wefax_spinner_rx_binary->activate(); } else { wefax_pic_rx_wefax_map->set_binary( false ); wefax_spinner_rx_binary->deactivate(); } } static void wefax_cb_pic_rx_bin_threshold( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int rndVal = wefax_spinner_rx_binary->value(); wefax_pic_rx_wefax_map->set_binary_threshold( rndVal ); } /// Sets the reception filter: The change should be visible. static void wefax_cb_rx_set_filter( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; int ix_filter = wefax_choice_rx_filter->value(); /// Saved in the configuration. progdefaults.wefax_filter = ix_filter ; wefax_serviceme->set_rx_filter(ix_filter); } static void wefax_cb_choice_rx_lpm( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; int the_new_lpm = get_choice_lpm_value( wefax_choice_rx_lpm ); wefax_serviceme->set_lpm( the_new_lpm ); } static void wefax_cb_pic_ratio( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); double ratio_percent = wefax_cnt_rx_ratio->value(); double current_ratio = slant_factor_with_ratio( ratio_percent ); wefax_pic_rx_wefax_map->stretch( current_ratio ); rx_slant_ratio = ratio_percent ; /// And we update the configuration structure. progdefaults.wefax_slant = rx_slant_ratio ; /// Will prompt for saving configuration when exiting. progdefaults.changed = true; } /// Possible zooms. The value is processed by class wefax_map. static const struct { int m_value ; const char * m_label ; } all_zooms[] = { { -3, "25%" }, { -2, "33%" }, { -1, "50%" }, { 0, "100%" }, { 1, "200%" }, { 2, "300%" }, { 3, "400%" }, }; // Index in all_zooms. static const int idx_default_zoom = 2 ; static int zoom_nb = sizeof(all_zooms) / sizeof(all_zooms[0]); static void wefax_cb_pic_zoom( Fl_Widget * wefax_choice_zoom, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int idx_zoom = dynamic_cast(wefax_choice_zoom)->value(); if( ( idx_zoom < 0 ) || ( idx_zoom >= zoom_nb ) ) { LOG_WARN( "Invalid zoom index=%d", idx_zoom ); idx_zoom = idx_default_zoom ; } /// Not very elegant but OK if two possibilities only. if( wefax_choice_zoom == wefax_choice_rx_zoom ) { wefax_pic_rx_wefax_map->set_zoom( all_zooms[ idx_zoom ].m_value ); wefax_pic_rx_win->redraw(); } else if( wefax_choice_zoom == wefax_choice_tx_zoom ) { wefax_pic_tx_wefax_map->set_zoom( all_zooms[ idx_zoom ].m_value ); wefax_pic_tx_win->redraw(); } else { LOG_ERROR("Inconsistent possibility"); } } static Fl_Choice * wefax_create_zoom(int wid_off_up, int hei_off_up, int wid_btn_curr, int height_btn) { ENSURE_THREAD(FLMAIN_TID); static const char * title_zoom = "Zoom" ; Fl_Choice * wefax_choice_zoom = new Fl_Choice(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _(title_zoom)); wefax_choice_zoom->callback(wefax_cb_pic_zoom, 0); for( int ix_zoom = 0; ix_zoom < zoom_nb ; ++ix_zoom ) { wefax_choice_zoom->add( all_zooms[ ix_zoom ].m_label ); }; wefax_choice_zoom->value(idx_default_zoom); wefax_choice_zoom->tooltip(_("Window zoom")); wefax_choice_zoom->align(FL_ALIGN_LEFT); return wefax_choice_zoom ; } void wefax_pic::abort_rx_viewer(void) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); put_status(""); /// Maybe the image is too high, we make it shorter. wefax_pic_rx_wefax_map->resize_height( curr_pix_h_default, true ); /// Now returns to the top of the image, and refresh the scrolling. wefax_pic_rx_wefax_map->position( wefax_pic_rx_wefax_map->x(), 0 ); wefax_pic_rx_scroll->redraw(); curr_pix_height = curr_pix_h_default ; rx_last_filtered_row = 0; center_val_prev = 0 ; update_auto_center(false); wefax_rx_center->value(0.0); wefax_btn_rx_abort->hide(); wefax_btn_rx_skip_apt->show(); wefax_btn_rx_skip_phasing->hide(); // wefax_round_rx_noise_removal->hide(); // wefax_round_rx_binary->hide(); // wefax_spinner_rx_binary->hide(); // wefax_out_rx_row_num->hide(); // wefax_out_rx_row_num->value(""); // wefax_out_rx_width->hide(); // wefax_cnt_rx_ratio->hide(); // wefax_cnt_rx_ratio->value(); // wefax_rx_center->hide(); // wefax_round_rx_auto_center->hide(); /// Back to the first line before reading next image. wefax_pic_rx_scroll->position( 0, 0 ); } /// This must be called within REQ or REQ_SYNC to avoid a segfault. void wefax_pic::power( double start, double phase, double image, double black, double stop ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); static bool init_done = false ; /// This reduces memory reallocation. if( init_done ) { /// TODO: Keep the latest value and update only if they really changed. /// This should save CPU. wefax_chart_rx_power->replace(1,start, "start", FL_BLUE); wefax_chart_rx_power->replace(2,phase, "phase", FL_RED); wefax_chart_rx_power->replace(3,image, "image", FL_GREEN); wefax_chart_rx_power->replace(4,black, "black", FL_YELLOW); wefax_chart_rx_power->replace(5,stop, "stop", FL_MAGENTA); } else { // First time only. init_done = true ; wefax_chart_rx_power->autosize(1); wefax_chart_rx_power->add(start, "start", FL_BLUE); wefax_chart_rx_power->add(phase, "phase", FL_RED); wefax_chart_rx_power->add(image, "image", FL_GREEN); wefax_chart_rx_power->add(black, "black", FL_YELLOW); wefax_chart_rx_power->add(stop, "stop", FL_MAGENTA); } } /// The resizing is different from the base class. class wefax_map_scroll : public wefax_map { public: /// Background color is gray. wefax_map_scroll(int X, int Y, int W, int H) : wefax_map (X, Y, W, H, 255) {}; virtual ~wefax_map_scroll() {}; /// wefax_map::resize destroys the image, we do not want that when displaying. virtual void resize(int x, int y, int w, int h) { // LOG_DEBUG("resize: %d %d %d %d", x, y, w, h ); Fl_Widget::resize( x, y, w, h ); } /// This must not process slant this way, so inhibits wefax_map::handle. virtual int handle(int event) { return 0 ; } }; static void wefax_load_image(const char * fil_name); static void wefax_cb_browse_rx_events( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int idx_file = wefax_browse_rx_events->value(); if( idx_file != 0 ) { /// The file name with its directory is stored as data. const char * filnam = (const char *)wefax_browse_rx_events->data( idx_file ); if(filnam == NULL) { LOG_INFO("Cannot find index=%d nb=%d", idx_file, wefax_browse_rx_events->size() ); return ; } /// The tx window might be hidden. progdefaults.WEFAX_HideTx = false ; wefax_pic_show_tx(); wefax_load_image(filnam); } } static const int extra_win_wid = 800 ; void wefax_pic::create_rx_viewer(int pos_x, int pos_y,int win_wid, int hei_win) { rx_slant_ratio = progdefaults.wefax_slant ; int wid_btn_margin = 2 ; if( progdefaults.WEFAX_EmbeddedGui ) wefax_pic_rx_win = new Fl_Double_Window(pos_x, pos_y, win_wid, hei_win); else wefax_pic_rx_win = new Fl_Double_Window(win_wid, hei_win, "Fax reception" ); wefax_pic_rx_win->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); wefax_pic_rx_win->align(FL_ALIGN_CLIP); int wid_img = win_wid - 15 ; /// A bit wider so that it does not scroll at the beginning. int height_btn = 22 ; int height_margin = 2 ; int hei_scroll = hei_win - (2 * height_btn + 3 * height_margin); wefax_pic_rx_win->begin(); wefax_pic_rx_scroll = new Fl_Scroll( 1, 2, win_wid-2, hei_scroll ); wefax_pic_rx_scroll->type(Fl_Scroll::HORIZONTAL | Fl_Scroll::VERTICAL); wefax_pic_rx_scroll->color( fl_rgb_color( 255, 255, 255), progdefaults.RxTxSelectcolor); wefax_pic_rx_scroll->box(FL_ENGRAVED_FRAME); wefax_pic_rx_scroll->begin(); /// It will be resized immediately. wefax_pic_rx_wefax_map = new wefax_map_scroll( 0, 0, wid_img, curr_pix_height); wefax_pic_rx_wefax_map->align(FL_ALIGN_TOP); wefax_pic_rx_wefax_map->set_zoom( all_zooms[ idx_default_zoom ].m_value ); wefax_pic_rx_scroll->end(); wefax_pic_rx_win->resizable( wefax_pic_rx_scroll ); int hei_off_up = hei_win - height_margin - 2 * height_btn - height_margin ; int wid_margin = 2; int wid_off_up = wid_margin ; int wid_btn_curr = 0 ; /// Sets the group at a big size, we will resize the width at the end. Fl_Group * tmpGroup = new Fl_Group( 0, hei_off_up, extra_win_wid, height_margin + 2 * height_btn + height_margin ); tmpGroup->begin(); wid_btn_curr = 80 ; wefax_btn_rx_save = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn,_("Save...")); wefax_btn_rx_save->callback(wefax_cb_pic_rx_save, 0); wefax_btn_rx_save->tooltip(_("Save current image in a file.")); /// Clear, Skipt APT and Skip phasing are at the same place wid_off_up += wid_btn_margin + wid_btn_curr ; wid_btn_curr = 80 ; wefax_btn_rx_abort = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Clear")); wefax_btn_rx_abort->callback(wefax_cb_pic_rx_abort, 0); wefax_btn_rx_abort->tooltip(_("End and clear current image reception.")); wefax_btn_rx_skip_apt = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Skip APT")); wefax_btn_rx_skip_apt->callback(wefax_cb_pic_rx_skip_apt, 0); wefax_btn_rx_skip_apt->tooltip(_("Skip Automatic Picture Transmission step")); wefax_btn_rx_skip_phasing = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Skip Phase")); wefax_btn_rx_skip_phasing->callback(wefax_cb_pic_rx_skip_phasing, 0); wefax_btn_rx_skip_phasing->tooltip(_("Skip phasing step")); wid_off_up += wid_btn_margin + wid_btn_curr ; wid_btn_curr = 60 ; wefax_btn_rx_pause = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Pause")); wefax_btn_rx_pause->callback(wefax_cb_pic_rx_pause, 0); wefax_btn_rx_pause->tooltip(_("Pause reception.")); wefax_btn_rx_resume = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Resume")); wefax_btn_rx_resume->callback(wefax_cb_pic_rx_resume, 0); wefax_btn_rx_resume->tooltip(_("Resume reception.")); wefax_btn_rx_resume->hide(); wid_off_up += wid_btn_margin + wid_btn_curr ; wid_btn_curr = 70 ; wefax_round_rx_non_stop = new Fl_Light_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Non stop")); wefax_round_rx_non_stop->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_non_stop->selection_color(FL_RED); wefax_round_rx_non_stop->callback(wefax_cb_pic_rx_manual, 0); wefax_round_rx_non_stop->tooltip(_("Continuous reception mode")); wid_off_up += wid_btn_margin + wid_btn_curr + 40; wid_btn_curr = 60 ; wefax_choice_rx_zoom = wefax_create_zoom( wid_off_up, hei_off_up, wid_btn_curr, height_btn ); static const char * title_filter = "FIR" ; wid_off_up += wid_btn_margin + wid_btn_curr + 25; wid_btn_curr = 90 ; wefax_choice_rx_filter = new Fl_Choice(wid_off_up, hei_off_up, wid_btn_curr, height_btn, title_filter ); wefax_choice_rx_filter->callback( wefax_cb_rx_set_filter, 0 ); wefax_choice_rx_filter->align(FL_ALIGN_LEFT); int nb_filters = 0 ; for( const char ** filter_names = wefax::rx_filters(); *filter_names; ++filter_names, ++nb_filters ) { wefax_choice_rx_filter->add( *filter_names ); }; /// Sets the default filter based on the configuration. int init_filter_idx = progdefaults.wefax_filter ; if( ( init_filter_idx < 0 ) || ( init_filter_idx >= nb_filters ) ) { LOG_WARN("Invalid config filter index:%d", init_filter_idx ); /// It is impossible to have no filters at all. init_filter_idx = 0 ; } wefax_choice_rx_filter->value(init_filter_idx); wefax_choice_rx_filter->tooltip(_("Set the reception filter.")); wid_off_up += 2 * wid_btn_margin + wid_btn_curr ; wid_btn_curr = 45; wefax_round_rx_binary = new Fl_Light_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Bin")); wefax_round_rx_binary->callback(wefax_cb_pic_rx_binary, 0); wefax_round_rx_binary->tooltip(_("Binary image when ticked")); wefax_round_rx_binary->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_binary->selection_color(FL_RED); wefax_round_rx_binary->value(0); if( false == progdefaults.WEFAX_SaveMonochrome ) { wefax_round_rx_binary->hide(); } wid_off_up += wid_btn_margin + wid_btn_curr ; int hei_off_low = hei_off_up + height_btn + height_margin ; int wid_off_low = wid_margin ; /// fl_width does not take into account the different size of letters. wid_off_low += 30; wid_btn_curr = 50 ; wefax_choice_rx_lpm = make_lpm_choice( wid_off_low, hei_off_low, wid_btn_curr, height_btn ); wefax_choice_rx_lpm->callback(wefax_cb_choice_rx_lpm); /// SkipApt and SkipPhasing are never displayed at the same time then the following widgets. /// Therefore we go back to the previous offset. wid_off_low += wid_btn_margin + wid_btn_curr ; wid_btn_curr = 40 ; wefax_out_rx_row_num = new Fl_Output(wid_off_low, hei_off_low, wid_btn_curr, height_btn); wefax_out_rx_row_num->align(FL_ALIGN_LEFT); wefax_out_rx_row_num->tooltip(_("Fax line number being read. Image is saved when reaching max lines.")); // wid_off_low += wid_btn_margin + wid_btn_curr + 10; // wid_btn_curr = 37 ; // wefax_out_rx_width = new Fl_Output(wid_off_low, hei_off_low, wid_btn_curr, height_btn, "x"); // wefax_out_rx_width->align(FL_ALIGN_LEFT); // wefax_out_rx_width->value("n/a"); // wefax_out_rx_width->tooltip(_("Image width, in pixels.")); static const char * title_lpm = _("Slant"); wid_off_low = wefax_btn_rx_pause->x(); // wid_off_low += wid_btn_margin + wid_btn_curr + 37; wid_btn_curr = 120 ; wefax_cnt_rx_ratio = new Fl_Counter(wid_off_low, hei_off_low, wid_btn_curr, height_btn, title_lpm); wefax_cnt_rx_ratio->align(FL_ALIGN_LEFT); // wefax_cnt_rx_ratio->type(FL_SIMPLE_COUNTER); wefax_cnt_rx_ratio->step(.0001); wefax_cnt_rx_ratio->lstep(.001); wefax_cnt_rx_ratio->precision( 4 ); wefax_cnt_rx_ratio->callback(wefax_cb_pic_ratio, 0); wefax_cnt_rx_ratio->tooltip(_("Adjust image slant to correct soundcard clock error.")); static const char * title_center = _("Align"); wid_off_low += wid_btn_curr + 37; wid_btn_curr = 120 ; wefax_rx_center = new Fl_Counter(wid_off_low, hei_off_low, wid_btn_curr, height_btn, title_center); // wefax_rx_center->type(FL_HORIZONTAL); wefax_rx_center->align(FL_ALIGN_LEFT); /// The range is set when the image size in pixels is known. wefax_rx_center->step(1.0); wefax_rx_center->lstep(10.0); wefax_rx_center->callback(wefax_cb_pic_rx_center, 0); wefax_rx_center->tooltip(_("Align image horizontally.")); center_val_prev = 0 ; wid_off_low += wid_btn_curr ; wid_btn_curr = 18; wefax_round_rx_auto_center = new Fl_Light_Button(wid_off_low, hei_off_low, wid_btn_curr, height_btn ); wefax_round_rx_auto_center->selection_color(FL_GREEN); wefax_round_rx_auto_center->callback(wefax_cb_pic_rx_auto_center, 0); wefax_round_rx_auto_center->tooltip(_("Enable automatic image centering")); wefax_round_rx_auto_center->value(1); enable_auto_center = true; update_auto_center(false); wid_off_low += 2 * wid_btn_margin + wid_btn_curr ; wid_btn_curr = 53 ; wefax_round_rx_noise_removal = new Fl_Light_Button(wid_off_low, hei_off_low, wid_btn_curr, height_btn, _("Noise")); wefax_round_rx_noise_removal->callback(wefax_cb_pic_rx_noise_removal, 0); wefax_round_rx_noise_removal->tooltip(_("Removes noise when ticked")); wefax_round_rx_noise_removal->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_noise_removal->selection_color(FL_RED); // wid_off_low += 2 * wid_btn_margin + wid_btn_curr ; // wid_btn_curr = 38 ; // wefax_round_rx_binary = new Fl_Light_Button(wid_off_low, hei_off_low, wid_btn_curr, height_btn, _("Bin")); // wefax_round_rx_binary->callback(wefax_cb_pic_rx_binary, 0); // wefax_round_rx_binary->tooltip(_("Binary image when ticked")); // wefax_round_rx_binary->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); // wefax_round_rx_binary->selection_color(FL_RED); // wefax_round_rx_binary->value(0); // if( false == progdefaults.WEFAX_SaveMonochrome ) { // wefax_round_rx_binary->hide(); // } // wid_off_low += wid_btn_curr ; wid_off_low = wefax_round_rx_binary->x(); wid_btn_curr = 45 ; wefax_spinner_rx_binary = new Fl_Spinner( wid_off_low, hei_off_low, wid_btn_curr, height_btn ); wefax_spinner_rx_binary->callback(wefax_cb_pic_rx_bin_threshold, 0); wefax_spinner_rx_binary->tooltip(_("Set binarization level")); wefax_spinner_rx_binary->format("%d"); wefax_spinner_rx_binary->type(FL_INT_INPUT); wefax_spinner_rx_binary->range(0.0,255.0); wefax_spinner_rx_binary->step(1.0); wefax_spinner_rx_binary->value(wefax_pic_rx_wefax_map->get_binary_threshold()); if( false == progdefaults.WEFAX_SaveMonochrome ) { wefax_spinner_rx_binary->hide(); } wefax_spinner_rx_binary->deactivate(); wid_off_low += wid_btn_curr ; int wid_hei_two = height_margin + 2 * height_btn ; /// Starts from the longest of the two lines. int wid_off_two = std::max( wid_off_low, wid_off_up ); wid_btn_curr = 80;//78 ; wefax_chart_rx_power = new Fl_Chart( wid_off_two, hei_off_up, wid_btn_curr, wid_hei_two ); wefax_chart_rx_power->tooltip(_("Power/noise for significant frequencies")); wefax_chart_rx_power->type(FL_HORBAR_CHART); wid_off_two += wid_btn_margin + wid_btn_curr ; // wid_btn_curr = std::max( extra_win_wid - wid_off_two - wid_margin, 200 ) ; wid_btn_curr = extra_win_wid - wid_off_two - wid_margin; wefax_browse_rx_events = new Fl_Select_Browser(wid_off_two, hei_off_up, wid_btn_curr+2, wid_hei_two ); wefax_browse_rx_events->callback(wefax_cb_browse_rx_events, 0); // static std::string tooltip_rx_events ; std::string tooltip_rx_events = _("Files saved in ") + default_dir_get( progdefaults.wefax_save_dir ); wefax_browse_rx_events->tooltip( tooltip_rx_events.c_str() ); /// TODO: The horizontal slider should not be always displayed. wefax_browse_rx_events->has_scrollbar(Fl_Browser::VERTICAL_ALWAYS); tmpGroup->resizable(wefax_browse_rx_events); tmpGroup->end(); tmpGroup->resize( 0, hei_off_up, win_wid-2, height_margin + 2 * height_btn + height_margin ); wefax_pic_rx_win->end(); wefax_pic_rx_win->init_sizes(); wefax_pic_rx_win->redraw(); } void wefax_pic::resize_rx_viewer(int wid_img) { ENSURE_THREAD(FLMAIN_TID); abort_rx_viewer(); /// We want to update the wefax_map data structure. wefax_pic_rx_wefax_map->wefax_map::resize( 0, 0, wid_img, curr_pix_h_default ); // char buffer_width[20]; // snprintf( buffer_width, sizeof(buffer_width), "%d", wid_img ); // wefax_out_rx_width->value(buffer_width); /// This is a number of pixels. // double range_rx_center = wid_img / 2.0 ; // wefax_rx_center->range(-range_rx_center, range_rx_center); wefax_pic_rx_win->redraw(); } void wefax_pic::set_rx_label(const std::string & win_label) { std::string tmp_label( win_label ); if( reception_paused ) { tmp_label += " paused" ; } /// This copy seems strange, but otherwise the label is not updated. set_win_label(wefax_pic_rx_win, tmp_label); } void wefax_pic::save_image(const std::string & fil_name, const std::string & extra_comments ) { std::string dfname = default_dir_get( progdefaults.wefax_save_dir ) + fil_name ; std::stringstream local_comments; local_comments << extra_comments ; local_comments << "Slant:" << rx_slant_ratio << "\n" ; local_comments << "Auto-Center:" << ( global_auto_center ? "On" : "Off" ) << "\n" ; wefax_pic_rx_wefax_map->save_png(dfname.c_str(),progdefaults.WEFAX_SaveMonochrome, local_comments.str().c_str()); add_to_files_list( dfname ); qso_notes( "RX:", fil_name ); wefax_serviceme->qso_rec_save(); } /// Protected by an exclusive mutex. static std::string wefax_load_image_after_acquire(const char * fil_name) { if (wefax_serviceme != active_modem) return "Not in WEFAX mode"; ENSURE_THREAD(FLMAIN_TID); wefax_serviceme->qso_rec_init(); qso_notes( "TX:", fil_name ); clear_image(); wefax_shared_tx_img = Fl_Shared_Image::get(fil_name); if (!wefax_shared_tx_img) { std::string err_msg("Cannot call Fl_Shared_Image::get on file:" + std::string(fil_name) ); LOG_ERROR("%s",err_msg.c_str()); return err_msg; } if (wefax_shared_tx_img->count() > 1) { // we only handle rgb images std::string err_msg("Handle only RGB images: " + std::string(fil_name) ); LOG_ERROR("%s",err_msg.c_str()); clear_image(); return err_msg; } unsigned char * img_data = (unsigned char *)wefax_shared_tx_img->data()[0]; int img_wid = wefax_shared_tx_img->w(); int img_hei = wefax_shared_tx_img->h(); int img_depth = wefax_shared_tx_img->d(); wefax_xmtimg = new unsigned char [img_wid * img_hei * bytes_per_pix]; if (img_depth == bytes_per_pix) memcpy(wefax_xmtimg, img_data, img_wid*img_hei*bytes_per_pix); else if (img_depth == 4) { int i, j, k; for (i = 0; i < img_wid*img_hei; i++) { j = i*bytes_per_pix; k = i*4; wefax_xmtimg[j] = img_data[k]; wefax_xmtimg[j+1] = img_data[k+1]; wefax_xmtimg[j+2] = img_data[k+2]; } } else if (img_depth == 1) { int i, j; for (i = 0; i < img_wid*img_hei; i++) { j = i * bytes_per_pix; wefax_xmtimg[j] = wefax_xmtimg[j+1] = wefax_xmtimg[j+2] = img_data[i]; } } else { std::stringstream err_strm ; err_strm << "Inconsistent img_depth=" << img_depth << " for " << fil_name ; std::string err_msg = err_strm.str(); LOG_ERROR("%s",err_msg.c_str()); return err_msg ; }; wefax_pic::tx_viewer_resize(img_wid, img_hei); set_win_label(wefax_pic_tx_win, fil_name); wefax_pic_tx_box->label(0); // load the wefax_map widget with the rgb image wefax_pic_tx_wefax_map->show(); wefax_pic_tx_wefax_map->clear(); wefax_pic_tx_wefax_map->video(wefax_xmtimg, img_wid * img_hei * bytes_per_pix); int tim_color = wefax_serviceme->tx_time( img_wid * img_hei * bytes_per_pix ); static char wefax_txclr_tooltip[24]; snprintf( wefax_txclr_tooltip, sizeof(wefax_txclr_tooltip), _("Time needed: %dm %ds (Color)"), tim_color/60, tim_color % 60 ); wefax_btn_tx_send_color->tooltip(wefax_txclr_tooltip); if( false ) { // No color transmission now because no information this format. wefax_btn_tx_send_color->activate(); } int tim_grey = wefax_serviceme->tx_time( img_wid * img_hei ); static char wefax_txgry_tooltip[24]; snprintf( wefax_txgry_tooltip, sizeof(wefax_txgry_tooltip), _("Time needed: %dm %ds (B/W)"), tim_grey/60, tim_grey % 60 ); wefax_btn_tx_send_grey->tooltip(wefax_txgry_tooltip); wefax_btn_tx_send_grey->activate(); wefax_choice_tx_zoom->activate(); wefax_btn_tx_clear->activate(); return std::string(); } static void wefax_load_image(const char * fil_name) { if (wefax_serviceme != active_modem) return; if( false == wefax_image_loaded_in_gui ) { /// So we do not re-acquire the exclusive access to wefax transmission. wefax_serviceme->transmit_lock_acquire(fil_name); wefax_image_loaded_in_gui = true ; } wefax_load_image_after_acquire(fil_name); } void wefax_pic::set_tx_pic(unsigned char data, int col, int row, bool is_color ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); if( ( col >= wefax_shared_tx_img->w() ) || ( row >= wefax_shared_tx_img->h() ) ) { LOG_ERROR("invalid col=%d row=%d w=%d h=%d", col, row, wefax_shared_tx_img->w(), wefax_shared_tx_img->h() ); exit(EXIT_FAILURE); } int offset = row * wefax_shared_tx_img->w() + col ; if (is_color) { wefax_pic_tx_wefax_map->pixel( data, offset ); } else { int tripleOffset = bytes_per_pix * offset ; wefax_pic_tx_wefax_map->pixel( data, tripleOffset ); wefax_pic_tx_wefax_map->pixel( data, tripleOffset + 1 ); wefax_pic_tx_wefax_map->pixel( data, tripleOffset + 2 ); } static int previous_row = -1 ; if( row != previous_row ) { previous_row = row ; char num_buffer[20]; snprintf( num_buffer, sizeof(num_buffer), "%d", row ); wefax_out_tx_row_num->value( num_buffer ); snprintf( num_buffer, sizeof(num_buffer), "%d", wefax_shared_tx_img->w() ); wefax_out_tx_col_num->value( num_buffer ); } } static void wefax_cb_pic_tx_load(Fl_Widget *, void *) { const char *fil_name = FSEL::select(_("Load image file"), "Portable Network Graphics\t*.png\n" "Independent JPEG Group\t*.{jpg,jif,jpeg,jpe}\n" "Graphics Interchange Format\t*.gif", default_dir_get( progdefaults.wefax_load_dir ).c_str() ); if (!fil_name) return; if (!*fil_name) return; /// Next time, image will be saved at the same place. default_dir_set( progdefaults.wefax_load_dir, fil_name ); wefax_load_image(fil_name); } /// Called whether color or b/w image. static void wefax_pic_tx_send_common( bool is_color ) { ENSURE_THREAD(FLMAIN_TID); if (wefax_serviceme != active_modem) return; int img_w = wefax_shared_tx_img->w(); int img_h = wefax_shared_tx_img->h(); wefax_choice_tx_lpm->hide(); wefax_btn_tx_send_color->hide(); wefax_btn_tx_send_grey->hide(); wefax_btn_tx_load->hide(); wefax_choice_tx_zoom->hide(); wefax_btn_tx_clear->hide(); wefax_btn_tx_close->hide(); wefax_out_tx_row_num->show(); wefax_out_tx_col_num->show(); wefax_btn_tx_send_abort->show(); wefax_pic_tx_wefax_map->clear(); wefax_out_tx_row_num->value( "Init" ); wefax_out_tx_col_num->value( "" ); wefax_serviceme->set_tx_parameters( get_choice_lpm_value( wefax_choice_tx_lpm ), wefax_xmtimg, is_color, img_w, img_h ); start_tx(); } static void wefax_cb_pic_tx_send_color( Fl_Widget * , void *) { wefax_pic_tx_send_common(true); } static void wefax_cb_pic_tx_send_grey( Fl_Widget *, void *) { wefax_pic_tx_send_common(false); } static void wefax_cb_pic_tx_send_abort( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; /// Maybe we are not sending an image. if( wefax_shared_tx_img ) { wefax_serviceme->set_tx_abort_flag(); // reload the wefax_map widget with the rgb image wefax_pic_tx_wefax_map->video(wefax_xmtimg, wefax_shared_tx_img->w() * wefax_shared_tx_img->h() * bytes_per_pix); } } void wefax_pic::restart_tx_viewer(void) { ENSURE_THREAD(FLMAIN_TID); wefax_out_tx_row_num->hide(); wefax_out_tx_col_num->hide(); wefax_btn_tx_send_abort->hide(); wefax_btn_tx_load->show(); wefax_btn_tx_close->show(); if( wefax_image_loaded_in_gui ) { // If the image was loaded from the GUI. wefax_choice_tx_lpm->show(); wefax_btn_tx_send_color->show(); wefax_btn_tx_send_grey->show(); wefax_choice_tx_zoom->show(); wefax_btn_tx_clear->show(); } else { /// If the image was loaded and sent from XML-RPC, or no image present. wefax_choice_tx_lpm->deactivate(); wefax_btn_tx_send_color->deactivate(); wefax_btn_tx_send_grey->deactivate(); wefax_choice_tx_zoom->deactivate(); wefax_btn_tx_clear->deactivate(); } } void wefax_pic::create_tx_viewer(int pos_x, int pos_y,int win_wid, int hei_win) { ENSURE_THREAD(FLMAIN_TID); int wid_btn_margin = 5 ; if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_tx_win = new Fl_Double_Window(pos_x, pos_y, win_wid, hei_win ); } else { Fl_Double_Window * tmpWin = new Fl_Double_Window(win_wid, hei_win, _("Send image")); wefax_pic_tx_win = tmpWin; } wefax_pic_tx_win->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); wefax_pic_tx_win->begin(); wefax_pic_tx_scroll = new Fl_Scroll( 1, 1, win_wid-2, hei_win - 23 ); wefax_pic_tx_scroll->type(Fl_Scroll::HORIZONTAL | Fl_Scroll::VERTICAL); wefax_pic_tx_scroll->color( fl_rgb_color( 255, 255, 255), progdefaults.RxTxSelectcolor); wefax_pic_tx_scroll->box(FL_ENGRAVED_FRAME); wefax_pic_tx_scroll->begin(); /// It will be resized immediately when an image is loaded. wefax_pic_tx_wefax_map = new wefax_map_scroll( 0,0,0,0); wefax_pic_tx_wefax_map->align(FL_ALIGN_TOP); wefax_pic_tx_wefax_map->set_zoom( all_zooms[ idx_default_zoom ].m_value ); wefax_pic_tx_scroll->end(); wefax_pic_tx_win->resizable( wefax_pic_tx_scroll ); wefax_pic_tx_box = new wefax_picbox( wefax_pic_tx_scroll->x(), wefax_pic_tx_scroll->y(), wefax_pic_tx_scroll->w(), wefax_pic_tx_scroll->h(), _("Loads an image file\nSupported types: PNG, JPEG, BMP")); wefax_pic_tx_box->labelfont(FL_HELVETICA_ITALIC); static const int last_margin = 21 ; static const int y_btn = hei_win - last_margin ; static const int hei_tx_btn = 20 ; Fl_Group * tmpGroup = new Fl_Group( 0, y_btn, extra_win_wid, last_margin ); tmpGroup->begin(); int width_btn = 30; int width_offset = 30; width_btn = 50 ; wefax_choice_tx_lpm = make_lpm_choice( width_offset, y_btn, width_btn, hei_tx_btn ); width_offset += width_btn + wid_btn_margin ; width_btn = 55 ; wefax_btn_tx_send_color = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, "Tx Color"); wefax_btn_tx_send_color->callback(wefax_cb_pic_tx_send_color, 0); wefax_btn_tx_send_color->tooltip(_("Starts transmit in color mode")); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_send_grey = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, "Tx B/W"); wefax_btn_tx_send_grey->callback( wefax_cb_pic_tx_send_grey, 0); wefax_btn_tx_send_grey->tooltip(_("Starts transmit in gray level mode")); width_offset += width_btn + wid_btn_margin ; width_btn = 55 ; wefax_btn_tx_load = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Load...")); wefax_btn_tx_load->callback(wefax_cb_pic_tx_load, 0); wefax_btn_tx_load->tooltip(_("Load image to send")); width_offset += width_btn + wid_btn_margin + 40 ; width_btn = 58 ; wefax_choice_tx_zoom = wefax_create_zoom( width_offset, y_btn, width_btn, hei_tx_btn ); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_clear = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Clear")); wefax_btn_tx_clear->callback(wefax_cb_pic_tx_clear, 0); wefax_btn_tx_clear->tooltip(_("Clear image to transmit")); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_close = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Close")); wefax_btn_tx_close->callback(wefax_cb_pic_tx_close, 0); wefax_btn_tx_close->tooltip(_("Close transmit window")); wefax_out_tx_row_num = new Fl_Output(20, y_btn, 50, hei_tx_btn ); wefax_out_tx_row_num->align(FL_ALIGN_LEFT); wefax_out_tx_row_num->tooltip(_("Fax line number being sent.")); wefax_out_tx_col_num = new Fl_Output(80, y_btn, 50, hei_tx_btn, "x" ); wefax_out_tx_col_num->align(FL_ALIGN_LEFT); wefax_out_tx_col_num->tooltip(_("Fax column number.")); wefax_btn_tx_send_abort = new Fl_Button(180, y_btn, 100, hei_tx_btn, _("Abort Transmit") ); wefax_btn_tx_send_abort->callback(wefax_cb_pic_tx_send_abort, 0); wefax_btn_tx_send_abort->tooltip(_("Abort transmission")); wefax_out_tx_row_num->hide(); wefax_out_tx_col_num->hide(); wefax_btn_tx_send_abort->hide(); wefax_btn_tx_send_color->deactivate(); wefax_btn_tx_send_grey->deactivate(); wefax_choice_tx_zoom->deactivate(); wefax_btn_tx_clear->deactivate(); tmpGroup->end(); wefax_pic_tx_win->end(); wefax_pic_rx_win->init_sizes(); wefax_pic_rx_win->redraw(); } void wefax_pic::abort_tx_viewer(void) { wefax_cb_pic_tx_send_abort(NULL,NULL); wefax_cb_pic_tx_close(NULL,NULL); } void wefax_pic::tx_viewer_resize(int the_width, int the_height) { ENSURE_THREAD(FLMAIN_TID); LOG_DEBUG("the_width=%d the_height=%d", the_width, the_height ); int win_width = the_width < 288 ? 290 : the_width + 4; int win_height = the_height < 180 ? 180 : the_height + 30; int pic_x = (win_width - the_width) / 2; int pic_y = (win_height - 30 - the_height)/2; /// This because it is a wefax_map_scroll object. wefax_pic_tx_wefax_map->wefax_map::resize(pic_x, pic_y, the_width, the_height); wefax_pic_tx_wefax_map->clear(); wefax_pic_tx_box->size(win_width, win_height); } /// TODO: This crashes but should be called. void wefax_pic::delete_tx_viewer() { ENSURE_THREAD(FLMAIN_TID); wefax_pic_tx_win->hide(); wefax_serviceme = 0; /// First delete the Fl_Widget. delete wefax_pic_tx_win; wefax_pic_tx_win = 0; delete [] wefax_xmtimg; wefax_xmtimg = 0; } /// TODO: This crashes. void wefax_pic::delete_rx_viewer() { ENSURE_THREAD(FLMAIN_TID); wefax_pic_rx_win->hide(); wefax_serviceme = 0; /// These objects are deleted with the main window. wefax_pic_tx_win = 0; wefax_pic_rx_win = 0; } void wefax_pic::setwefax_map_link(wefax *me) { wefax_serviceme = me; } /// Called by the main menu bar to open explicitely a wefax reception window. void wefax_pic::cb_mnu_pic_viewer_rx(Fl_Menu_ *, void * ) { ENSURE_THREAD(FLMAIN_TID); if ( ! wefax_pic_rx_win) { LOG_ERROR("wefax_rx_win should be created"); return ; } wefax_pic_rx_win->show(); } /// Called by the main menu bar to open explicitely a wefax transmission window. void wefax_pic::cb_mnu_pic_viewer_tx(Fl_Menu_ *, void * ) { if ( ! wefax_pic_tx_win) { LOG_ERROR("wefax_tx_win should be created"); return ; } progdefaults.WEFAX_HideTx = ! progdefaults.WEFAX_HideTx ; wefax_pic_show_tx(); } /// Called from XML-RPC thread. void wefax_pic::send_image( const std::string & fil_nam ) { LOG_INFO("Sending %s", fil_nam.c_str() ); /// Here, transmit_lock_acquire is called by the XML-RPC client. std::string err_msg = wefax_load_image_after_acquire( fil_nam.c_str() ); if( ! err_msg.empty() ) { if (wefax_serviceme == active_modem) { /// Allows another XML-RPC client or the GUI to send an image. wefax_serviceme->transmit_lock_release( err_msg ); } return ; } wefax_cb_pic_tx_send_grey( NULL, NULL ); LOG_INFO("Sent %s", fil_nam.c_str() ); } /// This function is called at two places: // - When creating the main window. // - When initializing the fax modem. void wefax_pic::create_both(bool called_from_fl_digi) { if( wefax_pic_rx_win ) return ; ENSURE_THREAD(FLMAIN_TID); /// This function can be called from fl_digi.cxx or wefax.cxx. if( called_from_fl_digi && progdefaults.WEFAX_EmbeddedGui ) { int rxh = wefax_group->h()/2 ; wefax_pic::create_rx_viewer( wefax_group->x(), wefax_group->y(), wefax_group->w(), rxh ); wefax_pic::create_tx_viewer( wefax_group->x(), wefax_group->y() + rxh, wefax_group->w(), wefax_group->h() - rxh); if( progdefaults.WEFAX_HideTx ) { wefax_pic_tx_win->hide(); if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_rx_win->resize( text_panel->x(), text_panel->y(), text_panel->w(), text_panel->h() ); wefax_pic_rx_win->redraw(); } } } else if( ! called_from_fl_digi && ! progdefaults.WEFAX_EmbeddedGui ) { wefax_pic::create_rx_viewer( 0, 0, extra_win_wid, 400 ); wefax_pic::create_tx_viewer( 0, 0, extra_win_wid, 400 ); } /// Explicitely does nothing here if conditions are not met. } void wefax_pic::show_both() { ENSURE_THREAD(FLMAIN_TID); if( ( NULL == wefax_pic_rx_win ) || ( NULL == wefax_pic_tx_win ) ) { return; } wefax_pic_show_tx(); // wefax_pic_rx_win->show(); // wefax_pic_rx_win->redraw(); } void wefax_pic::hide_both() { ENSURE_THREAD(FLMAIN_TID); if( ( NULL == wefax_pic_rx_win ) || ( NULL == wefax_pic_tx_win ) ) { return; } wefax_pic_rx_win->hide(); wefax_pic_tx_win->hide(); } fldigi-4.1.06/src/wefax/wefax.cxx0000664000175000017500000025562213507401434013537 00000000000000// ---------------------------------------------------------------------------- // wefax.cxx -- Weather Fax modem // // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. Adapted from code contained in HAMFAX source code // distribution. // Hamfax Copyright (C) Christof Schmitt // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "wefax.h" #include "modem.h" #include "main.h" #include "misc.h" #include "timeops.h" #include "fl_digi.h" #include "configuration.h" #include "status.h" #include "filters.h" #include "strutil.h" #include "wefax-pic.h" #include "ascii.h" #include "qrunner.h" using namespace std; //============================================================================= // //============================================================================= #define PUT_STATUS( A ) \ { \ std::stringstream strm_status ; \ strm_status << A ; \ put_status( strm_status.str().c_str() ); \ LOG_DEBUG("%s", strm_status.str().c_str() ); \ } //============================================================================= // Core of the code taken from Hamfax. //============================================================================= /// No reasonable FIR filter should have more coefficients than that. #define MAX_FILT_SIZE 256 struct fir_coeffs { const char * _name ; int _size ; const double _coefs[MAX_FILT_SIZE]; }; // Narrow, middle and wide fir low pass filter from ACfax static const fir_coeffs input_filters[] = { { _("Narrow"), 17, { -7,-18,-15, 11, 56,116,177,223,240,223,177,116, 56, 11,-15,-18, -7} }, { _("Middle"), 17, { 0,-18,-38,-39, 0, 83,191,284,320,284,191, 83, 0,-39,-38,-18, 0} }, { _("Wide"), 17, { 6, 20, 7,-42,-74,-12,159,353,440,353,159,-12,-74,-42, 7, 20, 6} }, { "Blackman", 17, { -2.7756e-15, 2.9258e+00, 1.3289e+01, 3.4418e+01, 6.8000e+01, 1.1095e+02, 1.5471e+02, 1.8770e+02, 2.0000e+02, 1.8770e+02, 1.5471e+02, 1.1095e+02, 6.8000e+01, 3.4418e+01, 1.3289e+01, 2.9258e+00, -2.7756e-15 } }, { "Hanning", 17, { 0.00000, 7.61205, 29.28932, 61.73166, 100.00000, 138.26834, 170.71068, 192.38795, 200.00000, 192.38795, 170.71068, 138.26834, 100.00000, 61.73166, 29.28932, 7.61205, 0.00000 } }, { "Hamming", 17, { 16.000, 23.003, 42.946, 72.793, 108.000, 143.207, 173.054, 192.997, 200.000, 192.997, 173.054, 143.207, 108.000, 72.793, 42.946, 23.003, 16.000 } } }; static const size_t nb_filters = sizeof(input_filters)/sizeof(input_filters[0]); ; /// This contains all possible reception filters. class fir_filter_pair_set : public std::vector< C_FIR_filter > { /// This, because C_FIR_filter cannot be copied. fir_filter_pair_set(const fir_filter_pair_set &); fir_filter_pair_set & operator=(const fir_filter_pair_set &); public: static const char ** filters_list(void) { /// There will be a small memory leak when leaving. No problem at all. static const char ** stt_filters = NULL ; if( stt_filters == NULL ) { stt_filters = new const char * [nb_filters + 1]; for( size_t ix_filt = 0 ; ix_filt < nb_filters ; ++ix_filt ) { stt_filters[ix_filt] = input_filters[ix_filt]._name ; } stt_filters[nb_filters] = NULL ; } return stt_filters ; } fir_filter_pair_set() { /// Beware that C_FIR_filter cannot be copied with its content. resize( nb_filters ); for( size_t ix_filt = 0 ; ix_filt < nb_filters ; ++ix_filt ) { // Same filter for real and imaginary. const fir_coeffs * ptr_filt = input_filters + ix_filt ; // init() should take const double pointers. operator[]( ix_filt ).init( ptr_filt->_size, 1, const_cast< double * >( ptr_filt->_coefs ), const_cast< double * >( ptr_filt->_coefs ) ); } } }; // fir_filter_pair_set /// Speed-up of trigonometric calculations. template class lookup_table { T * m_table; size_t m_table_size; size_t m_next; size_t m_increment; /// No default constructor because it would invalidate the buffer pointer. lookup_table(); lookup_table(const lookup_table &); lookup_table & operator=(const lookup_table &); public: lookup_table(const size_t N) : m_table_size(N), m_next(0), m_increment(0) { assert( N != 0 ); /// If no more memory, an exception will be thrown. m_table=new T[m_table_size]; } ~lookup_table(void) { delete[] m_table; } T& operator[](size_t i) { return m_table[i]; } void set_increment(size_t i) { m_increment=i; } T next_value(void) { m_next+=m_increment; if(m_next>=m_table_size) { m_next%=m_table_size; } return m_table[m_next]; } size_t size(void) const { return m_table_size; } void reset(void) { m_next=0; } }; // lookup_table typedef enum { RXAPTSTART, RXAPTSTOP, RXPHASING, RXIMAGE, TXAPTSTART, TXPHASING, ENDPHASING, TXIMAGE, TXAPTSTOP, IDLE } fax_state; static const char * state_to_str(fax_state a_state) { switch( a_state ) { case RXAPTSTART : return _("APT reception start") ; case RXAPTSTOP : return _("APT reception stop") ; case RXPHASING : return _("Phasing reception") ; case RXIMAGE : return _("Receiving") ; case TXAPTSTART : return _("APT transmission start") ; case TXAPTSTOP : return _("APT stop") ; case TXPHASING : return _("Phasing transmission") ; case ENDPHASING : return _("End phasing") ; case TXIMAGE : return _("Sending image") ; case IDLE : return _("Idle") ; } return "UNKNOWN" ; }; /// TODO: This should be hidden to this class. static const int bytes_per_pixel = 3; #define IOC_576 576 #define IOC_288 288 /// Index of correlation to image width. static int ioc_to_width( int ioc ) { return ioc * M_PI ; }; /// Used by bandwidth. Standard shift is 800 Hz, so deviation is 400 Hz. /// Deutsche Wetterdienst (DWD) shift is 850 Hz. static int fm_deviation = -1 ; #define GARBAGE_STR "garbage" class fax_implementation { wefax * m_ptr_wefax ; // Points to the modem of which this is the implementation. fax_state m_rx_state ; // RXPHASING, RXIMAGE etc... int m_sample_rate; // Set at startup: 8000, 11025 etc... int m_current_value; // Latest received pixel value. bool m_apt_high; int m_apt_trans; // APT low-high transitions int m_apt_count; // samples counted for m_apt_trans int m_apt_start_freq; // Standard APT frequency. Set at startup. int m_apt_stop_freq; // Standard APT frequency. bool m_phase_high; // When state=RXPHASING int m_curr_phase_len; // Counts the len of the image band used for phasing int m_curr_phase_high; // Counts the len of the white part of the phasing image band. int m_phase_lines; int m_num_phase_lines; int m_phasing_calls_nb;// Number of calls to decode_phasing for the current image. double m_lpm_img; // Lines per minute. double m_lpm_sum_rx; // Sum of the latest LPM values, when RXPHASING. int m_default_lpm; // 120 for WEFAX_576, 60 for WEFAX_288. int m_img_width; // Calculated with IOC=576 or 288. int m_img_sample; // Current received samples number when in RXIMAGE. int m_last_col; // Current col based on samples number, decides to set a pixel when changes. int m_pixel_val; // Accumulates received samples, then averaged to set a pixel. int m_pix_samples_nb; // Number of samples read for the next pixel, and current column. About 4 if 11025 Hz. bool m_img_color; // Whether this is a color image or not. fax_state m_tx_state; // Modem state when transmitting. int m_tx_phasing_lin; // Nb of phasing lines sent when transmitting an image. int m_start_duration; // Number of seconds for sending ATP start. int m_stop_duration; // Number of seconds for sending APT stop. int m_img_tx_cols; // Number of columns when transmitting. int m_img_tx_rows; // Number of rows when transmitting. int m_carrier; // Normalised fax carrier frequency. Should be identical to modem::get_freq(). int m_fax_pix_num; // Index of current pixel in received image. const unsigned char * m_xmt_pic_buf ; // Bytes to send. Number of pixels by three. bool m_freq_mod ; // Frequency modulation or AM. bool m_manual_mode ; // Tells whether everything is read, or apt+phasing detection. /// The number of samples sent for one line. The LPM is given by the GUI. Typically 5512. double m_smpl_per_lin ;// Recalculated each time m_lpm_img is updated. int m_ix_filt ; // Index of the current reception filter. static const int range_sample = 255 ; // At the moment, never found an example where it should be negated. static const bool m_phase_inverted = false; /// This is always the same filter for all objects. static fir_filter_pair_set m_rx_filters ; /// These are used for transmission. lookup_table m_dbl_sine; lookup_table m_dbl_cosine; lookup_table m_dbl_arc_sine; /// Stores a result based on the previous received sample. double m_i_fir_old; double m_q_fir_old; void decode(const int* buf, int nb_samples); /// Used for transmission. lookup_table m_short_sine; /// This evaluates the average and standard deviation of the current image, // using the histogram. class statistics { static const size_t m_sz = 256 ; int m_hist[m_sz]; mutable double m_avg ; mutable double m_dev ; public: void add_bw( int pix_val ) { pix_val = pix_val < 0 ? 0 : pix_val > 255 ? 255 : pix_val ; m_hist[ pix_val ]++; } void calc() const { m_avg = 0.0; int sum = 0 ; int sum_vals = 0 ; for( size_t i = 0; i < m_sz; ++ i ) { int weight = m_hist[i]; sum_vals += i * weight ; sum += weight ; } if( sum == 0 ) { m_avg = 0.0 ; m_dev = 0.0 ; return ; } m_avg = sum_vals / sum ; double sum_dlt_pwr2 = 0.0 ; for( size_t i = 0; i < m_sz; ++ i ) { int weight = m_hist[i]; double val = i - m_avg ; sum_dlt_pwr2 += val * val * weight ; } m_dev = sqrt( sum_dlt_pwr2 / sum ); } double average() const { return m_avg; } double stddev() const { return m_dev; }; void reset() { std::fill( m_hist, m_hist + m_sz, 0 ); } }; statistics m_statistics ; fax_implementation(); /// Needed when starting image reception, after phasing. void reset_counters(void) { m_last_col = 0 ; m_fax_pix_num = 0 ; m_img_sample = 0; m_pix_samples_nb = 0; } // These counters used for phasing. void reset_phasing_counters() { m_lpm_sum_rx = 0; m_phasing_calls_nb = 0 ; m_phase_high = m_current_value>=128 ? true : false; m_curr_phase_len=m_curr_phase_high=0; m_phase_lines=m_num_phase_lines=0; } /// Called at init time or when the carrier changes. void reset_increments(void) { /// This might happen at startup. Not a problem. if(m_sample_rate == 0) { return; } m_dbl_sine.set_increment(m_dbl_sine.size()*m_carrier/m_sample_rate); m_dbl_cosine.set_increment(m_dbl_cosine.size()*m_carrier/m_sample_rate); m_dbl_sine.reset(); m_dbl_cosine.reset(); m_short_sine.reset(); if(!m_freq_mod ) { m_short_sine.set_increment(m_short_sine.size()*m_carrier/m_sample_rate); } } public: fax_implementation(int fax_mode, wefax * ptr_wefax ); void init_rx(int the_smpl_rate); void skip_apt_rx(void); void skip_phasing_to_image_save(const std::string & comment); void skip_phasing_to_image(bool auto_center); void skip_phasing_rx(bool auto_center); void end_rx(void); void rx_new_samples(const double* audio_ptr, int audio_sz); void init_tx(int the_smpl_rate); void modulate(const double* buffer, int n); void tx_params_set( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h ); bool trx_do_next(void); void tx_apt_stop(void); double carrier(void) const { return m_carrier ; } /// The trigo tables have an increment which depends on the carrier frequency. void set_carrier(double freq) { m_carrier = freq ; reset_increments(); } int fax_width(void) const { return m_img_width ; } void set_filter_rx( int idx_filter ) { m_ix_filt = idx_filter ; } /// When set, starts receiving faxes without interruption other than manual. void manual_mode_set( bool manual_flag ) { m_manual_mode = manual_flag ; } /// Called by the GUI. bool manual_mode_get(void) const { return m_manual_mode ; } int lpm_to_samples( int the_lpm ) const { return m_sample_rate * 60.0 / the_lpm ; } /// Called by the GUI. void lpm_set( int the_lpm ) { m_lpm_img = the_lpm ; m_smpl_per_lin = lpm_to_samples( m_lpm_img ); } /// This generates a filename based on the frequency, current time, internal state etc... std::string generate_filename( const char *extra_msg ) const ; const char * state_rx_str(void) const { return state_to_str(m_rx_state); } /// Returns a string telling the state. Informational purpose. std::string state_string(void) const { std::stringstream result ; result << "tx:" << state_to_str(m_tx_state) << " " << "rx:" << state_to_str(m_rx_state); return result.str(); }; private: /// Centered around the frequency. double power_usb_noise(void) const { static double avg_pwr = 0.0 ; double pwr = wf->powerDensity(m_carrier, 2 * fm_deviation) + 1e-10; return decayavg( avg_pwr, pwr, 10 ); } /// This evaluates the power signal when APT start frequency. This frequency pattern /// can be observed on the waterfall. double power_usb_apt_start(void) const { static double avg_pwr = 0.0 ; /// Value approximated by watching the waterfall. static const int bandwidth_apt_start = 10 ; double pwr = wf->powerDensity(m_carrier - 2 * m_apt_start_freq, bandwidth_apt_start) + wf->powerDensity(m_carrier - m_apt_start_freq, bandwidth_apt_start) + wf->powerDensity(m_carrier , bandwidth_apt_start) + wf->powerDensity(m_carrier + m_apt_start_freq, bandwidth_apt_start); return decayavg( avg_pwr, pwr, 10 ); } /// Estimates the signal power when the phasing signal is received. double power_usb_phasing(void) const { static double avg_pwr = 0.0 ; /// Rough estimate based on waterfall observation. static const int bandwidth_phasing = 1 ; double pwr = wf->powerDensity(m_carrier - fm_deviation, bandwidth_phasing); return decayavg( avg_pwr, pwr, 10 ); } /// There is some power at m_carrier + fm_deviation but this is neglictible. double power_usb_image(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_image = 100 ; double pwr = wf->powerDensity(m_carrier + fm_deviation, bandwidth_image); return decayavg( avg_pwr, pwr, 10 ); } /// Hambourg Radio sends a constant freq which looks like an image. /// We eliminate it by comparing with a black signal. /// If this is a real image, bith powers will be close. /// If not, the image is very important, but not the black. /// TODO: Consider removing this, because it is not used. double power_usb_black(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_black = 20 ; double pwr = wf->powerDensity(m_carrier - fm_deviation, bandwidth_black); return decayavg( avg_pwr, pwr, 10 ); } /// Evaluates the signal power for APT stop frequency. double power_usb_apt_stop(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_apt_stop = 50 ; double pwr = wf->powerDensity(m_carrier - m_apt_stop_freq, bandwidth_apt_stop); return decayavg( avg_pwr, pwr, 10 ); } /// This evaluates the signal/noise ratio for some specific bandwidths. class fax_signal { const fax_implementation * _ptr_fax ; int _cnt ; /// The value can be reused a couple of times. double _apt_start ; double _phasing ; double _image ; double _black ; double _apt_stop ; fax_state _state ; /// Deduction made based on signal power. const char * _text; const char * _stop_code; /// Finer tests can be added. These are all rule-of-thumb values based /// on observation of real signals. /// TODO: Adds a learning mode using the Hamfax detector to train the signal-based one. void set_state(void) { _state = IDLE ; _text = _("No signal detected"); _stop_code = "" ; if( ( _apt_start > 20.0 ) && ( _phasing < 10.0 ) && ( _image < 10.0 ) && ( _apt_stop < 10.0 ) ) { _state = RXAPTSTART ; _text = _("Strong APT start signal: Skip to phasing."); } if( /// The image signal may be weak if the others signals are even weaker. ( ( _apt_start < 1.0 ) && ( _phasing < 1.0 ) && ( _image > 10.0 ) && ( _apt_stop < 1.0 ) ) || ( ( _apt_start < 1.0 ) && ( _phasing < 0.5 ) && ( _image > 8.0 ) && ( _apt_stop < 0.5 ) ) || ( ( _apt_start < 3.0 ) && ( _phasing < 1.0 ) && ( _image > 15.0 ) && ( _apt_stop < 1.0 ) ) ) { _state = RXIMAGE ; _text = _("Strong image signal when getting APT start: Starting phasing."); } if( ( _apt_start < 10.0 ) && ( _phasing > 20.0 ) && ( _image < 10.0 ) && ( _apt_stop < 10.0 ) ) { _state = RXPHASING ; _text = _("Strong phasing signal when getting APT start: Starting phasing."); } /// TODO: Beware that quite often, it cuts image in the middle. // Maybe the levels should be amended. if( ( ( _apt_start < 2.0 ) && ( _phasing < 2.0 ) && ( _image < 2.0 ) && ( _apt_stop > 8.0 ) ) || ( ( _apt_start < 1.0 ) && ( _phasing < 1.0 ) && ( _image < 1.0 ) && ( _apt_stop > 6.0 ) ) ) { /// This test is redundant now that apt_stop_freq is better (On several lines). // It had also the disadvantage to be triggered on a plain horizontal line. LOG_DEBUG("Strong APT Stop TEMPORARILY DISABLED\n"); if(false) { _state = RXAPTSTOP ; _text = _("Strong APT stop signal: Stopping reception."); _stop_code = "stop"; } // END TEMP DISABLED. } /// Consecutive lines in a wefax image have a strong statistical correlation. fax_state state_corr = _ptr_fax->correlation_state( &_stop_code ); if( ( _state == RXIMAGE ) || ( _state == IDLE ) ) { if( state_corr == RXAPTSTOP ) { _state = RXAPTSTOP ; _text = _("No significant line-to-line correlation: Reception should stop."); } } if( ( _state == IDLE ) || ( _state == RXAPTSTART ) || ( _state == RXPHASING ) ) { if( state_corr == RXIMAGE ) { _state = RXIMAGE ; _text = _("Significant line-to-line correlation: Reception should start."); } } } void recalc(void) { /// Adds a small value to avoid division by zero. double noise = _ptr_fax->power_usb_noise() + 1e-10 ; /// Multiplications are faster than divisions. double inv_noise = 1.0 / noise ; _apt_start = _ptr_fax->power_usb_apt_start() * inv_noise ; _phasing = _ptr_fax->power_usb_phasing() * inv_noise ; _image = _ptr_fax->power_usb_image() * inv_noise ; _black = _ptr_fax->power_usb_black() * inv_noise ; _apt_stop = _ptr_fax->power_usb_apt_stop() * inv_noise ; set_state(); } public: /// This recomputes, if needed, the various signal power ratios. void refresh(void) { /// Values reevaluated every X input samples. Must be smaller /// than the typical audio input frames (512 samples). static const int validity = 1000 ; /// Calculated at least the first time. if( ( _cnt % validity ) == 0 ) { recalc(); } /// Does not matter if wrapped beyond 2**31. ++_cnt ; } fax_signal( const fax_implementation * ptr_fax) : _ptr_fax(ptr_fax) , _cnt(0) , _text(NULL) {} fax_state signal_state(void) const { return _state ; } const char * signal_text(void) const { return _text; }; const char * signal_stop_code(void) const { return _stop_code; } double image_noise_ratio(void) const { return _image ; } /// This updates a Fl_Chart widget. void display(void) const { // Protected with REQ, otherwise will segfault. Do not use REQ_SYNC // otherwise it hangs when switching to another mode with a macro. REQ( wefax_pic::power, _apt_start, _phasing, _image, _black, _apt_stop ); } /// For debugging only. friend std::ostream & operator<<( std::ostream & refO, const fax_signal & ref_sig ) { refO << " start=" << std::setw(10) << ref_sig._apt_start << " phasing=" << std::setw(10) << ref_sig._phasing << " image=" << std::setw(10) << ref_sig._image << " black=" << std::setw(10) << ref_sig._black << " stop=" << std::setw(10) << ref_sig._apt_stop << " pwr_state=" << state_to_str(ref_sig._state); return refO ; } std::string to_string(void) const { std::stringstream tmp_strm ; tmp_strm << *this ; return tmp_strm.str(); } }; /// We tolerate a small difference between the frequencies. bool is_near_freq( int f1, int f2, int margin ) const { int delta = f1 - f2 ; if( delta < 0 ) { delta = -delta ; } if( delta < margin ) { return true ; } else { return false ; } } void save_automatic( const char * extra_msg, const std::string & comment); void decode_apt(int x, const fax_signal & the_signal ); void decode_phasing(int x, const fax_signal & the_signal ); bool decode_image(int x); private: /// Each received file has its name pushed in this queue. syncobj m_sync_rx ; std::queue< std::string > m_received_files ; public: /// Called by the engine each time a file is saved. void put_received_file( const std::string &filnam ) { guard_lock g( m_sync_rx.mtxp() ); LOG_INFO("%s", filnam.c_str() ); m_received_files.push( filnam ); m_sync_rx.signal(); } /// Returns a received file name, by chronological order. std::string get_received_file( int max_seconds ) { guard_lock g( m_sync_rx.mtxp() ); LOG_INFO(_("delay=%d"), max_seconds ); if( m_received_files.empty() ) { if( ! m_sync_rx.wait(max_seconds) ) return std::string(); } std::string filnam = m_received_files.front(); m_received_files.pop(); return filnam ; } private: /// No unicity if the same filename is sent by several clients at the same time. /// This does not really matter because the error codes should be the same. syncobj m_sync_tx_fil ; std::string m_tx_fil ; // Filename being transmitted. syncobj m_sync_tx_msg ; typedef std::map< std::string, std::string > sent_files_type ; sent_files_type m_sent_files ; public: /// If the delay is exceeded, returns with an error message. std::string send_file( const std::string & filnam, double max_seconds ) { LOG_INFO("%s rf_carried=%d carrier=%d", filnam.c_str(), static_cast(wf->rfcarrier()), m_carrier ); bool is_acquired = transmit_lock_acquire(filnam, max_seconds); if( ! is_acquired ) return "Timeout sending " + filnam ; REQ( wefax_pic::send_image, filnam ); guard_lock g( m_sync_tx_fil.mtxp() ); sent_files_type::iterator itFi ; while(true) { itFi = m_sent_files.find( filnam ); if( itFi != m_sent_files.end() ) { break ; } LOG_INFO("Locking"); guard_lock g( m_sync_tx_msg.mtxp() ); LOG_INFO("Waiting %f",max_seconds); if( ! m_sync_tx_msg.wait( max_seconds ) ) { LOG_INFO("Timeout %f", max_seconds ); return "Timeout"; } } std::string err_msg = itFi->second ; LOG_INFO("err_msg=%s", err_msg.c_str() ); m_sent_files.erase( itFi ); return err_msg ; } /// Called when loading a file from the GUI, or indirectly from XML-RPC. bool transmit_lock_acquire(const std::string & filnam, double delay = wefax::max_delay ) { LOG_INFO("Sending %s delay=%f tid=%d", filnam.c_str(), delay, (int)GET_THREAD_ID() ); guard_lock g( m_sync_tx_fil.mtxp() ); LOG_INFO("Locked"); if ( ! m_tx_fil.empty() ) { if( ! m_sync_tx_fil.wait( delay ) ) return false ; } m_tx_fil = filnam ; LOG_INFO("Sent %s", filnam.c_str() ); return true ; } /// Allows to send another file. Called by XML-RPC and the GUI. void transmit_lock_release( const std::string & err_msg ) { LOG_INFO("err_msg=%s tid=%d", err_msg.c_str(), (int)GET_THREAD_ID() ); guard_lock g( m_sync_tx_msg.mtxp() ); LOG_INFO("%s %s", m_tx_fil.c_str(), err_msg.c_str() ); if( m_tx_fil.empty() ) { LOG_WARN(_("%s: File name should not be empty"), err_msg.c_str() ); } else { m_sent_files[ m_tx_fil ] = err_msg ; m_tx_fil.clear(); } LOG_INFO("Signaling"); m_sync_tx_msg.signal(); } /// Maybe we could reset this buffer when we change the state so that we could /// use the current LPM width. struct corr_buffer_t : public std::vector { unsigned char at_mod(size_t i) const { return operator[](i % size()); } unsigned char & at_mod(size_t i) { return operator[](i % size()); } }; mutable corr_buffer_t m_correlation_buffer ; mutable double m_curr_corr_avg ; // Average line-to-line correlation for the last m_min_corr_lines sampled lines. mutable double m_imag_corr_max ; // Max line-to-line correlation for the current image. mutable double m_imag_corr_min ; // Min line-to-line correlation for the current image. mutable int m_corr_calls_nb; static const int m_min_corr_lines = 15 ; /// Evaluates the correlation between two lines separated by line_offset pixels. double correlation_from_index(size_t line_length, size_t line_offset) const { /// This is a ring buffer. size_t line_length_plus_img_sample = line_length + m_img_sample ; int avg_pred = 0, avg_curr = 0 ; for( size_t i = m_img_sample ; i < line_length_plus_img_sample ; ++i ) { int pix_pred = m_correlation_buffer.at_mod( i ); int pix_curr = m_correlation_buffer.at_mod( i + line_offset ); avg_pred += pix_pred; avg_curr += pix_curr ; } avg_pred /= line_length; avg_curr /= line_length; /// Use integers because it is faster. Samples are chars, so no overflow possible. int numerator = 0, denom_pred = 0, denom_curr = 0 ; for( size_t i = m_img_sample ; i < line_length_plus_img_sample ; ++i ) { int pix_pred = m_correlation_buffer.at_mod( i ); int pix_curr = m_correlation_buffer.at_mod( i + line_offset ); int delta_pred = pix_pred - avg_pred ; int delta_curr = pix_curr - avg_curr ; numerator += delta_pred * delta_curr ; denom_pred += delta_pred * delta_pred ; denom_curr += delta_curr * delta_curr ; } double denominator = sqrt( (double)denom_pred * (double)denom_curr ); if( denominator == 0.0 ) { return 0.0 ; } else { return fabs( numerator / denominator ); } } // This is experimental, and is disabled yet. // The goal is to eliminate artefact which echoes each pixel a couple of pixels later. // This correlates each sample line with itself for each pixel number in a small given // range. When the correlation reaches a maximum (A couple of dozens of samples), // this estimates the echo delay. // This delay is typical of a given emitter, at a given time of the day. // Therefore, the array of occurences of a given delay must be refreshed when the frequence // is changed. // The next step is to estimate the amplitude of the echo, and later to substract // each sample to the same sample "delay" mater, with the right attenuation. // // For an unknown reason, there is frequently a correlation peak after 9 or 10 samples. // Just as there were two propagation paths, distant from 10 / 11025 Hz * 300000 = 300 km. // // This happens with Bracknell (Not far from where I live), // and surprisingly the weak signal comes first. // This never happens with Deutsche Wetterdienst (Hundredth of kilometers). size_t correlation_shift( size_t corr_smpl_lin ) const { static bool is_init = false ; static const size_t max_space_echo = 100 ; /// Specific to the antenna and the reception, so no need to clean it up. static size_t shift_histogram[max_space_echo]; static size_t nb_calls = 0 ; if( ! is_init ) { for( size_t i = 0; i < max_space_echo; ++i ) shift_histogram[i] = 0 ; is_init = true ; } double tmpCorrPrev = correlation_from_index(corr_smpl_lin, 0 ); // double tmpCorrMax = 0.0 ; size_t local_max = 0 ; bool is_growing = false ; /// We could even start the loop later because we are not interested by small shifts. for( size_t i = 1 ; i < max_space_echo; i++ ) { double tmpCorr = correlation_from_index(corr_smpl_lin, i ); bool is_growing_next = tmpCorr > tmpCorrPrev ; if( is_growing && ( ! is_growing_next ) ) { local_max = i - 1 ; // tmpCorrMax = tmpCorr ; break ; } is_growing = is_growing_next ; tmpCorrPrev = tmpCorr ; } if( local_max != 0 ) { ++shift_histogram[local_max]; // LOG_INFO("Local max: i=%d corr=%lf", local_max, tmpCorrMax ); } ++nb_calls ; size_t best_shift_idx = 0 ; size_t biggest_shift = shift_histogram[best_shift_idx]; if( ( nb_calls > 100 ) && ( ( nb_calls % 10 ) == 0 ) ) { for( size_t i = 0; i < max_space_echo; ++i ) { size_t new_hist = shift_histogram[i]; if( new_hist > biggest_shift ) { biggest_shift = new_hist ; best_shift_idx = i ; } } LOG_INFO("Shift: i=%d hist=%d", (int)best_shift_idx, (int)biggest_shift ); } return best_shift_idx ; } static const int min_white_level = 128 ; /// Absolute value of statistical correlation between the current line and the previous one. /// Called once per maximum sample line. void correlation_calc(void) const { ++m_corr_calls_nb; /// We should in fact take the smallest one, 60. size_t corr_smpl_lin = lpm_to_samples( m_default_lpm ); double current_corr = correlation_from_index(corr_smpl_lin, corr_smpl_lin); /// This never happened, but who knows (Inaccuracy etc...)? if( current_corr > 1.0 ) { LOG_WARN("Inconsistent correlation:%lf", current_corr ); current_corr = 1.0; } if( m_corr_calls_nb < m_min_corr_lines ) { m_curr_corr_avg = current_corr ; /// The max value of the correlation must be significative (Does not take peak values). m_imag_corr_max = 0.0; m_imag_corr_min = 0.0; } else { /// Equivalent to decayavg with weight= (min_corr_lin +1)/min_corr_lin m_curr_corr_avg = ( m_curr_corr_avg * m_min_corr_lines + current_corr ) / ( m_min_corr_lines + 1 ); m_imag_corr_max = std::max( m_curr_corr_avg, m_imag_corr_max ); m_imag_corr_min = std::min( m_curr_corr_avg, m_imag_corr_min ); } /// Debugging purpose only. if( ( m_corr_calls_nb % 100 ) == 0 ) { LOG_DEBUG( "current_corr=%lf m_curr_corr_avg=%lf m_imag_corr_max=%f m_corr_calls_nb=%d " "m_min_corr_lines=%d state=%s m_lpm_img=%f", current_corr, m_curr_corr_avg, m_imag_corr_max, m_corr_calls_nb, m_min_corr_lines, state_rx_str(), m_lpm_img ); } double metric = m_curr_corr_avg * 100.0 ; m_ptr_wefax->display_metric(metric); static const bool calc_corr_shift = false ; if( calc_corr_shift ) correlation_shift( corr_smpl_lin ); } /// This is called quite often. It estimates, based on the mobile /// average of statistical correlation between consecutive lines, whether this is a wefax /// signal or not. fax_state correlation_state(const char ** stop_code) const { static fax_state stable_state = IDLE ; switch( stable_state ) { case RXAPTSTART : *stop_code = "stable_start" ; break; case RXAPTSTOP : *stop_code = "stable_stop" ; break; case RXPHASING : *stop_code = "stable_phasing"; break; case RXIMAGE : *stop_code = "stable_image" ; break; case IDLE : *stop_code = "stable_idle" ; break; default : *stop_code = "unexpected" ; break; } /// If the mobile average is not computed on enough lines, returns IDLE /// which means "Do not know" in this context. if( m_corr_calls_nb >= m_min_corr_lines ) { int crr_row = m_img_sample / m_smpl_per_lin ; /// Sometimes, we detected a Stop just after the header, and we create an image // of 300 lignes. This is a rule of thumb. The bad consequence is that the image // would be a bit too high. This an approximate row number. // On the other hand, if we read very few lines, we assume this is just noise. const double low_corr = ( crr_row < 600 ) ? 0.01 // Short images containing text. : ( crr_row < 1300 ) ? 0.02 // Most of images. : 0.05 ; // Deutsche Wetterdienst sometimes 1900 pixels high. /// The thresholds are very approximate. This is a compromise: // * If high threshold, we cut images in two. // * If low threshold, we go on reading an image after its end if apt stop is not seen, // and might read the beginning of the next image. // This might be suppressed if phasing band detection is much better. if( m_curr_corr_avg < low_corr ) { LOG_DEBUG("Setting to stop m_curr_corr_avg=%f low_corr=%f", m_curr_corr_avg, low_corr ); *stop_code = "nocorr"; stable_state = RXAPTSTOP ; /// TODO: Beware, this is sometimes triggered with cyclic parasites. } else if( m_curr_corr_avg > 0.20 ) { stable_state = RXIMAGE ; } else if( ( m_imag_corr_max < 0.10 ) && ( crr_row > 200 ) ) { // If the correlation was always very low for many lines, // this means that we started to read a wrong image, so // there might be a wrong tuning or the DWD constant frequency. // So we trash the image. // TODO: It is done too many times: SOMETIMES THE MESSAGE IS REPEATED HUNDREDTH. // crr8row continues to grow although it makes no sense. LOG_DEBUG("Flushing dummy image m_imag_corr_max=%f crr_row=%d 200 lines.", m_imag_corr_max, crr_row ); static const char * garbage_200 = GARBAGE_STR ".200"; *stop_code = garbage_200; reset_afc(); stable_state = RXAPTSTOP ; } else if( ( m_imag_corr_max < 0.20 ) && ( crr_row > 500 ) ) { // If the max line-to-line correlation still low for a bigger image. LOG_DEBUG("Flushing dummy image m_imag_corr_max=%f crr_row=%d 500 lines.", m_imag_corr_max, crr_row ); static const char * garbage_500 = GARBAGE_STR ".500"; *stop_code = garbage_500; reset_afc(); stable_state = RXAPTSTOP ; } else { stable_state = IDLE ; } } /// Message for first detection. if( (stable_state == IDLE) && (m_corr_calls_nb == m_min_corr_lines) ) { // Do not display twice the same value. static double last_corr_avg = 0.0 ; if( m_curr_corr_avg != last_corr_avg ) { LOG_INFO("Correlation average %lf m_imag_corr_max=%f: Detected %s", m_curr_corr_avg, m_imag_corr_max, state_to_str(stable_state) ); last_corr_avg = m_curr_corr_avg ; } } return stable_state; } /// We compute about the same when plotting a pixel. void correlation_update( int the_sample ) { size_t corr_smpl_lin = lpm_to_samples( m_default_lpm ); size_t corr_buff_sz = 2 * corr_smpl_lin ; static size_t cnt_upd = 0 ; if( m_correlation_buffer.size() != corr_buff_sz ) { m_correlation_buffer.resize( corr_buff_sz, 0 ); m_curr_corr_avg = 0.0 ; } if( ( cnt_upd % corr_smpl_lin ) == 0 ) { correlation_calc(); } ++cnt_upd ; m_correlation_buffer.at_mod( m_img_sample ) = the_sample ; } // correlation_update /// Clean trick so that we can reset internal variables of process_afc(). void reset_afc() const { process_afc(true); } /// Called once for each row of input data. void process_afc(bool reset_afc = false) const { static int prev_row = -1 ; static int total_img_rows = 0 ; /// Audio frequency. static int stable_carrier = 0 ; static const int max_median_freqs = 20 ; static double median_freqs[ max_median_freqs ]; static int nb_median_freqs = 0 ; /// Rig frequency. static long long stable_rfcarrier = 0 ; /// TODO: Maybe we could restrict the range of frequencies. if( reset_afc ) { /// Displays the message only once. if( prev_row != -1 ) { LOG_DEBUG("Resetting AFC total_img_rows=%d",total_img_rows); } prev_row = -1 ; total_img_rows = 0 ; stable_carrier = 0; stable_rfcarrier = 0 ; nb_median_freqs = 0 ; return; } if( progStatus.afconoff == false ) return ; /// The LPM might have changed, but this is very improbable. /// We do not know the LPM so we assume the default. double smpl_per_lin = lpm_to_samples( m_default_lpm ); int crr_row = m_img_sample / smpl_per_lin ; // Actually executed once for each line of samples. if( crr_row == prev_row ) { return ; } long long curr_rfcarr = wf->rfcarrier() ; /// If the freq changed, reset the number of good lines read. if( ( m_carrier != stable_carrier ) || ( curr_rfcarr != stable_rfcarrier ) ) { /// Displays the messages once only. if( total_img_rows != 0 ) { LOG_INFO("Setting m_carrier=%d curr_rfcarr=%d total_img_rows=%d", m_carrier, static_cast(curr_rfcarr), total_img_rows ); } total_img_rows = 0 ; stable_carrier = m_carrier ; stable_rfcarrier = curr_rfcarr ; } /// If we could read a big portion of an image, then no adjustment. if( m_rx_state == RXIMAGE ) { /// Maybe this is a new image so last_img_rows is from the previous image. if( prev_row < crr_row ) { total_img_rows += crr_row - prev_row ; } else { LOG_DEBUG("prev_crr_row=%d crr_row=%d total_img_rows=%d", prev_row, crr_row, total_img_rows ); } } else { LOG_DEBUG("State=%s crr_row=%d", state_rx_str(), crr_row ); } prev_row = crr_row ; /// If we could succesfully read this number of lines, it must be the right frequency. static const int threshold_rows = 200 ; /// Consider than not only we could read many lines, but also other criterias such // as correlation, or if we could read apt start/stop. Otherwise, it may stabilize a useless frequency. if( ( total_img_rows >= threshold_rows ) && ( m_curr_corr_avg > 0.10 ) ) { if( total_img_rows == threshold_rows ) { LOG_INFO("Stable total_img_rows=%d m_curr_corr_avg=%f", total_img_rows, m_curr_corr_avg ); } /// TODO: If the reception is always poor for a long time, // and a close frequency is constantly better for a long time, then restart AFC. return ; } /* TODO: If there are parasites, there is an excursion of the frequency. Therefore, * in order to keep constant a frequency which might be temporarily decentered, * it would be better to: * - Stabilize an average of the last X frequencies. * - And/Or maximize as well the correlation. */ /// This centers the carrier where the activity is the strongest. static const int bw_dual[][2] = { { -fm_deviation - 50, -fm_deviation + 50 }, { fm_deviation - 50, fm_deviation + 50 } }; double max_carrier_dual = wf->powerDensityMaximum( 2, bw_dual ); static const int bw_right[][2] = { { fm_deviation - 50, fm_deviation + 50 } }; double max_carrier_right = wf->powerDensityMaximum( 1, bw_right ); // This might have to be adjusted because DWD has all the energy on the right // band, but Northwood has some on the left. double max_carrier = 0.0 ; /// Maybe there is not enough room on the left. if( max_carrier_dual < 0.0 ) { LOG_DEBUG("Invalid AFC: Dual band=%f, right band=%f. Take right", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_right ; } else /// Both mask detect approximately the same frequency: This is the consistent case. if( fabs( max_carrier_dual - max_carrier_right ) < 20 ) { max_carrier = max_carrier_right ; } else if( max_carrier_dual < max_carrier_right ) { LOG_DEBUG("Inconsistent AFC: Dual band=%f, right band=%f. Take right", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_right ; } else /// Single-band mask close to the left frequency of the dual-freq mask if( fabs( fabs( max_carrier_dual - max_carrier_right ) - 2 * fm_deviation ) < 20 ) { LOG_DEBUG("Dual band=%f instead of right band=%f. Take dual", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_dual ; } else { LOG_DEBUG("Inconsistent AFC: Dual band=%f, right band=%f. Take dual.", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_dual ; } /// The max power is unreachable, there might be another reason. Stay where we are. static bool prevWasRight = true ; /// TODO: We might find the next solution, maybe by giving to powerDensityMaximum a smaller range. if( ( max_carrier <= fm_deviation ) || ( max_carrier >= IMAGE_WIDTH - fm_deviation ) ) { /// Display this message once only. if( prevWasRight ) { LOG_INFO("Invalid max_carrier=%f", max_carrier); } prevWasRight = false ; return ; } else { prevWasRight = true ; } // TODO: If the correlation is below a given threshold, it might be useless to add it. median_freqs[ nb_median_freqs % max_median_freqs ] = max_carrier ; ++nb_median_freqs; if( nb_median_freqs >= max_median_freqs ) { std::sort( median_freqs, median_freqs + max_median_freqs ); max_carrier = median_freqs[ max_median_freqs / 2 ]; } double delta = fabs( m_carrier - max_carrier ); if( delta > 5.0 ) { // Hertz. /// Do not change the frequency too quickly if an image is received. double next_carr = max_carrier ; LOG_DEBUG("m_carrier=%f max_carrier=%f next_carr=%f", (double)m_carrier, max_carrier, next_carr ); m_ptr_wefax->set_freq(next_carr); } // So we can detect if it was changed manually. stable_carrier = m_carrier ; } }; // class fax_implementation /// Narrow, middle etc... input filters. Constructed at program startup. Readonly. fir_filter_pair_set fax_implementation::m_rx_filters ; // center frequency offset is 1500Hz // to tune a fax station on 4610kHz, tune to 4608.5 kHz USB static const double wefax_default_carrier = 1500; fax_implementation::fax_implementation( int fax_mode, wefax * ptr_wefax ) : m_ptr_wefax( ptr_wefax ) , m_dbl_sine(8192),m_dbl_cosine(8192),m_dbl_arc_sine(256) , m_short_sine(8192) { m_freq_mod = true; m_apt_stop_freq = 450 ; m_img_color = false ; m_tx_phasing_lin = 20 ; m_carrier = wefax_default_carrier ; m_start_duration = 5 ; m_stop_duration = 5 ; m_manual_mode = false ; m_rx_state = IDLE ; m_tx_state = IDLE ; m_sample_rate = 0 ; reset_counters(); int index_of_correlation ; /// http://en.wikipedia.org/wiki/Radiofax switch( fax_mode ) { case MODE_WEFAX_576: m_apt_start_freq = 300 ; index_of_correlation = IOC_576 ; m_default_lpm = 120 ; break; case MODE_WEFAX_288: m_apt_start_freq = 675 ; index_of_correlation = IOC_288 ; m_default_lpm = 60 ; break; default: LOG_ERROR(_("Invalid fax mode:%d"), fax_mode); abort(); } m_img_width = ioc_to_width( index_of_correlation ); for(size_t i=0; i(32767*std::sin(2.0*M_PI*i/m_short_sine.size())); } }; void fax_implementation::init_rx(int the_smpl_rat) { m_sample_rate=the_smpl_rat; m_rx_state=RXAPTSTART; m_apt_count=m_apt_trans=0; m_apt_high=false; /// Centers the carriers on the GUI and reinits the trigonometric tables. m_ptr_wefax->set_freq(wefax_default_carrier); /// Default value, can be the with the GUI. m_ix_filt = 0 ; // 0=narrow, 1=middle, 2=wide. reset_increments(); m_i_fir_old=m_q_fir_old=0; m_corr_calls_nb = 0; } /// Values are between zero and +range_sample void fax_implementation::decode(const int* buf, int nb_samples) { if(nb_samples==0) { LOG_WARN(_("Empty buffer.")); end_rx(); } fax_signal my_signal(this); process_afc(); for(int i=0; i 0 ) { /// If the maximum number of lines is reached, we stop the reception. decode_image(crr_val); } } m_img_sample++; } } // The number of transitions between black and white is counted. After 1/2 // second, the frequency is calculated. If it matches the APT start frequency, // the state skips to the detection of phasing lines, if it matches the apt // stop frequency two times, the reception is ended. void fax_implementation::decode_apt(int x, const fax_signal & the_signal ) { if( (m_img_sample % 10000) == 0 ) { PUT_STATUS( state_rx_str() << " apt_count=" << m_apt_count ); } /// Maybe the thresholds 229 and 25 should be changed if the image is not contrasted enough. // if(x>229 && !m_apt_high) { if(x>215 && !m_apt_high) { m_apt_high=true; ++m_apt_trans; // } else if(x<25 && m_apt_high) { } else if(x<40 && m_apt_high) { m_apt_high=false; } ++m_apt_count ; /// This makes one line if LPM=120: // samples_per_line = m_sample_rate * 60.0 / the_lpm ; if( m_apt_count >= m_sample_rate/2 ) { static int curr_freq = 0 ; static int cr_1_freq = 0 ; static int cr_2_freq = 0 ; static int cr_3_freq = 0 ; // For APT start, we have several lines with freq=300 nearly exactly. // For APT stop, one or two lines maximum with freq=452, and this is not accurate. // On top of that, sometimes lines randomly have 300 or 452 black-white transitions, // especially if the signal is very noisy. This is why we check the transitions // frequency of two consecutive lines. cr_3_freq=cr_2_freq; cr_2_freq=cr_1_freq; cr_1_freq=curr_freq; curr_freq=m_sample_rate*m_apt_trans/m_apt_count; /// This writes the S/R level on the status bar. double tmp_snr = the_signal.image_noise_ratio(); char snr_buffer[64]; snprintf(snr_buffer, sizeof(snr_buffer), "s/n %3.0f dB", 20.0 * log10(tmp_snr)); put_Status1(snr_buffer); LOG_DEBUG("m_apt_count=%d m_apt_trans=%d curr_freq=%d cr_1_freq=%d cr_2_freq=%d", m_apt_count, m_apt_trans, curr_freq, cr_1_freq, cr_2_freq ); m_apt_count=m_apt_trans=0; if(m_rx_state==RXAPTSTART) { if( is_near_freq(curr_freq,m_apt_start_freq, 8 ) && is_near_freq(cr_1_freq,m_apt_start_freq, 8 ) ) { LOG_INFO(_("Skipping APT freq=%d State=%s"), curr_freq, state_rx_str() ); skip_apt_rx(); PUT_STATUS( state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz. " << _("Skipping.") ); return ; } if( is_near_freq(curr_freq,m_apt_stop_freq, 2 ) && is_near_freq(cr_1_freq,m_apt_stop_freq, 2 ) ) { LOG_INFO(_("Spurious APT stop frequency=%d Hz as waiting for APT start. SNR=%f State=%s"), curr_freq, tmp_snr, state_rx_str() ); return ; } PUT_STATUS( state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz." ); } /// If APT start in the middle of an image, maybe the preceding APT Stop was not caught. if(m_rx_state==RXIMAGE) { /// TODO: We could enhance accuracy by taking into account the number of read lines. int crr_row = m_img_sample / m_smpl_per_lin ; const char * msg_start = NULL ; if( is_near_freq(curr_freq,m_apt_start_freq, 4 ) && is_near_freq(cr_1_freq,m_apt_start_freq, 4 ) && is_near_freq(cr_2_freq,m_apt_start_freq, 4 ) ) { msg_start = "apt"; } else if( is_near_freq(curr_freq,m_apt_start_freq, 5 ) && is_near_freq(cr_1_freq,m_apt_start_freq, 5 ) && is_near_freq(cr_2_freq,m_apt_start_freq, 5 ) && is_near_freq(cr_3_freq,m_apt_start_freq, 5 ) ) { msg_start = "apt2"; } if( msg_start != NULL ) { std::string comment = strformat( "APT start: freq=%d cr_1=%d cr_2=%d cr_3=%d crr_row=%d State=%s msg=%s", curr_freq, cr_1_freq, cr_2_freq, cr_3_freq, crr_row, state_rx_str(), msg_start ); LOG_INFO("%s",comment.c_str()); PUT_STATUS( state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz. " << _("Skipping.") ); save_automatic(msg_start,comment); skip_apt_rx(); return ; } } /// TODO: Check that the correlation is not too high because there are false stops. const char * msg_stop = NULL ; if( is_near_freq(curr_freq,m_apt_stop_freq, 6 ) && is_near_freq(cr_1_freq,m_apt_stop_freq, 6 ) ) { msg_stop = "ok" ; } else if( is_near_freq(curr_freq,m_apt_stop_freq, 7 ) && is_near_freq(cr_1_freq,m_apt_stop_freq, 7 ) && is_near_freq(cr_2_freq,m_apt_stop_freq, 7 ) ) { msg_stop = "ok2" ; } if( msg_stop != NULL ) { std::string comment = strformat( "APT Stop: curr_freq=%d m_img_sample=%d State=%s_ msg=%s", curr_freq, m_img_sample, state_rx_str(), msg_stop ); LOG_INFO("%s",comment.c_str()); PUT_STATUS( state_rx_str() << " " << _("Apt stop frequency") << ": " << curr_freq << " Hz. " << _("Stopping.") ); save_automatic(msg_stop,comment); return ; } switch( the_signal.signal_state() ) { case RXAPTSTART : switch( m_rx_state ) { case RXAPTSTART : skip_apt_rx(); LOG_INFO( "Start, start: %s", the_signal.signal_text() ); break ; default : LOG_DEBUG( "Start, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; case RXPHASING : switch( m_rx_state ) { case RXAPTSTART : skip_apt_rx(); LOG_INFO( "Phasing, start: %s", the_signal.signal_text() ); break ; default : LOG_DEBUG( "Phasing, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; case RXIMAGE : switch( m_rx_state ) { case RXAPTSTART : skip_apt_rx(); /// The phasing step will start receiving the image later. First we try /// to phase the image correctly. LOG_INFO( "Image, start: %s", the_signal.signal_text() ); break ; default : LOG_DEBUG( "Image, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; case RXAPTSTOP : switch( m_rx_state ) { case RXIMAGE : LOG_INFO( "Stop, image: %s", the_signal.signal_text() ); save_automatic( the_signal.signal_stop_code(), the_signal.signal_text() ); break; default : LOG_DEBUG( "Stop, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; default : LOG_DEBUG( "%s, %s: %s", state_to_str(the_signal.signal_state()), state_rx_str(), the_signal.signal_text() ); break ; } } } /// This generates a file name with the reception time and the frequency. std::string fax_implementation::generate_filename( const char *extra_msg ) const { time_t tmp_time = time(NULL); struct tm tmp_tm ; localtime_r( &tmp_time, &tmp_tm ); char buf_fil_nam[256] ; long long tmp_fl = wf->rfcarrier() ; snprintf( buf_fil_nam, sizeof(buf_fil_nam), "wefax_%04d%02d%02d_%02d%02d%02d_%d_%s.png", 1900 + tmp_tm.tm_year, 1 + tmp_tm.tm_mon, tmp_tm.tm_mday, tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, static_cast(tmp_fl), extra_msg ); return buf_fil_nam ; } /// This saves an image and adds the right comments. void fax_implementation::save_automatic( const char * extra_msg, const std::string & comment) { std::string new_filnam ; std::stringstream extra_comments ; /// These criteria used by rules-of-thumb to eliminate blank images. m_statistics.calc(); double avg = m_statistics.average(); double stddev = m_statistics.stddev(); int current_row = m_img_sample / m_smpl_per_lin ; /* Sometimes the AFC leaves the right frequency (Because no signal) and it produces * images which are plain wrong (Pure periodic parasites). We might find * a criteria to suppress them but maybe it's better to enhance AFC. */ /// Minimum pixel numbers for a valid image. static const int max_fax_pix_num = 150000 ; if( m_fax_pix_num < max_fax_pix_num ) { /// Maybe we should reset AFC ? LOG_INFO( _("Do not save small image (%d bytes). Manual=%d"), m_fax_pix_num, m_manual_mode ); goto cleanup_rx ; } /// If correlation was always low. if( 0 == strncmp( extra_msg, GARBAGE_STR, strlen(GARBAGE_STR) ) ) { LOG_INFO( _("Do not save garbage file") ); goto cleanup_rx ; } static const double min_max_correlation = 0.20 ; if( m_imag_corr_max < min_max_correlation ) { LOG_INFO(_("Do not save image with correlation < less than %f"), min_max_correlation ); goto cleanup_rx ; } /// Intermediate blank images, low standard deviation and correlation. if( ( ( avg > 220 ) && ( m_imag_corr_max < 0.30 ) && ( stddev < 30 ) ) || ( ( avg > 240 ) && ( m_imag_corr_max < 0.35 ) && ( stddev < 30 ) ) || ( ( avg > 230 ) && ( m_imag_corr_max < 0.25 ) && ( stddev < 35 ) ) || ( ( avg > 220 ) && ( stddev < 20 ) ) ) { LOG_INFO(_("Do not save non-significant image, avg=%f, m_imag_corr_max=%f stddev=%f"), avg, m_imag_corr_max, stddev ); goto cleanup_rx ; } /// Dark images coming from local parasites. if( ( avg < 100 ) && ( m_imag_corr_max < 0.30 ) ) { LOG_INFO(_("Do not save dark parasite image, avg=%f, m_imag_corr_max=%f"), avg, m_imag_corr_max ); goto cleanup_rx ; } /// Same: Dark images due to parasites. if( ( avg < 80 ) && ( m_imag_corr_max < 0.35 ) ) { LOG_INFO(_("Do not save dark parasite image (II), avg=%f, m_imag_corr_max=%f"), avg, m_imag_corr_max ); goto cleanup_rx ; } if( ( avg > 235 ) && ( m_imag_corr_max < 0.65 ) && ( stddev < 40 ) && ( current_row < 100 ) ) { LOG_INFO(_("Do not save small white image, avg=%f, m_imag_corr_max=%f stddev=%f current_row=%d"), avg, m_imag_corr_max, stddev, current_row ); goto cleanup_rx ; } /// Small image cut between APT start and phasing. if( ( avg < 130 ) && ( m_imag_corr_max < 0.70 ) && ( stddev < 100 ) && ( current_row < 100 ) ) { LOG_INFO(_("Do not save small white image, avg=%f, m_imag_corr_max=%f stddev=%f current_row=%d"), avg, m_imag_corr_max, stddev, current_row ); goto cleanup_rx ; } new_filnam = generate_filename(extra_msg); LOG_INFO( "Saving %d bytes in %s. m_imag_corr_max=%f", m_fax_pix_num, new_filnam.c_str(), m_imag_corr_max ); extra_comments << "ControlMode:" << ( m_manual_mode ? "Manual" : "APT control" ) << "\n" ; extra_comments << "LPM:" << m_lpm_img << "\n" ; extra_comments << "FrequencyMode:" << ( m_freq_mod ? "FM" : "AM" ) << "\n" ; extra_comments << "Carrier:" << m_carrier << "\n" ; extra_comments << "Inversion:" << ( m_phase_inverted ? "Inverted" : "Normal" ) << "\n" ; extra_comments << "Color:" << ( m_img_color ? "Color" : "BW" ) << "\n" ; extra_comments << "SampleRate:" << m_sample_rate << "\n" ; extra_comments << "Maximum line-to-line correlation:" << m_imag_corr_max << "\n" ; extra_comments << "Minimum line-to-line correlation:" << m_imag_corr_min << "\n" ; extra_comments << "Average:" << avg << "\n" ; extra_comments << "Row number:" << current_row << "\n" ; extra_comments << "Standard deviation:" << stddev << "\n" ; extra_comments << "Comment:" << comment << "\n" ; extra_comments << "PID:" << getpid() << "\n" ; wefax_pic::save_image( new_filnam, extra_comments.str() ); cleanup_rx: /// This clears the current image. end_rx(); }; // Phasing lines consist of 2.5% white at the beginning, 95% black and again // 2.5% white at the end (or inverted). In normal phasing lines we try to // count the length between the white-black transitions. If the line has // a reasonable amount of black (4.8%--5.2%) and the length fits in the // range of 60--360 lpm (plus some tolerance) it is considered a valid // phasing line. Then the start of a line and the lpm is calculated. void fax_implementation::decode_phasing(int x, const fax_signal & the_signal ) { static const bool filter_phasing = true ; if( filter_phasing ) { // The input is filtered over X columns because the blacks bands are very wide. static const size_t phasing_width = 16 ; static size_t phasing_count = 0 ; static int phasing_history[ phasing_width ]; /// Mobile average filters out parasites. phasing_history[ phasing_count % phasing_width ] = x ; ++phasing_count ; if( phasing_count >= phasing_width ) { x = 0 ; for( size_t i = 0; i < phasing_width; ++i ) x += phasing_history[ i ]; x /= phasing_width ; } } /// Number of samples per line. m_curr_phase_len++; ++m_phasing_calls_nb ; /// Number of black pixels. if(x>128) { m_curr_phase_high++; } /* If the high level is too high (229) we miss some phasing lines. * but if it is too low (200) the center is not at the right place. * We should instead use an histogram and determine what is the highest level in the image. */ // if((!m_phase_inverted && x>229 && !m_phase_high) || if((!m_phase_inverted && x>200 && !m_phase_high) || ( m_phase_inverted && x<25 && m_phase_high)) { m_phase_high=m_phase_inverted?false:true; } else if((!m_phase_inverted && x<25 && m_phase_high) || ( m_phase_inverted && x>200 && !m_phase_high)) // ( m_phase_inverted && x>229 && !m_phase_high)) { m_phase_high=m_phase_inverted?true:false; /// In the phasing line, there is a white segment of 5% of the total length, // so it is approximated with 0.048->0.052. if (m_curr_phase_high >= (m_phase_inverted ? 0.948 : 0.048) * m_curr_phase_len && m_curr_phase_high <= (m_phase_inverted ? 0.952 : 0.052) * m_curr_phase_len && m_curr_phase_len <= 1.1 * m_sample_rate && m_curr_phase_len >= 0.15 * m_sample_rate) { double tmp_lpm = 60.0 * m_sample_rate / m_curr_phase_len; m_lpm_sum_rx += tmp_lpm; ++m_phase_lines; PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line") << ", lpm = " << tmp_lpm << " " << _("count") << "=" << m_phase_lines ); m_num_phase_lines = 0; /// This option was selected just once, in the middle of an image, // with many vertical lines. if( m_phase_lines >= 5 /* Was 4 */ ) { /// The precision cannot really increase because there cannot // be more than a couple of loops. This is used for guessing // whether the LPM is around 120 or 60. lpm_set( m_lpm_sum_rx / m_phase_lines ); std::string comment = strformat( "Skipping to reception: m_phase_lines=%d m_num_phase_lines=%d LPM=%f State=%s" " m_img_sample=%d m_last_col=%d m_lpm_img=%f m_smpl_per_lin=%f", m_phase_lines, m_num_phase_lines, m_lpm_img, state_rx_str(), m_img_sample, m_last_col, m_lpm_img, m_smpl_per_lin ); LOG_INFO( "%s", comment.c_str() ); skip_phasing_to_image_save(comment); /// reset_counters sets these to zero, so restore right values. // But skip_phasing_to_image normalizes the LPM if not accurate. /// Half of the band of the phasing line. m_img_sample=static_cast(1.025 * m_smpl_per_lin ); double tmp_pos=std::fmod(m_img_sample,m_smpl_per_lin) / m_smpl_per_lin; m_last_col=static_cast(tmp_pos*m_img_width); /// Now the image will start at the right column offset. m_fax_pix_num = m_last_col * bytes_per_pixel ; LOG_INFO("Center set: m_last_col=%d m_img_width=%d m_smpl_per_lin=%f", m_last_col, m_img_width, m_smpl_per_lin ); } } else if( m_rx_state == RXPHASING && m_phase_lines>0 && ++m_num_phase_lines>=5) { /// TODO: Compare with m_tx_phasing_lin which indicates the number of phasing /// lines sent when transmitting an image. std::string comment = strformat( "Missed last phasing line m_phase_lines=%d m_num_phase_lines=%d LPM=%f State=%s", m_phase_lines, m_num_phase_lines, m_lpm_img, state_rx_str() ); LOG_INFO("%s", comment.c_str() ); /// Phasing header is finished but could not get the center. skip_phasing_to_image(true); } else if(m_curr_phase_len>5*m_sample_rate) { m_curr_phase_len=0; PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line, resetting.") ); } else { /// Here, if no phasing is detected. Must be very fast. } PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line, reset.") ); m_curr_phase_len=m_curr_phase_high=0; } else if ( m_rx_state == RXPHASING ) { /// We do not know the LPM so we assume the default. /// TODO: We could take the one given by the GUI. Apparently; problem for Japanese faxes when lpm=60: // http://forums.radioreference.com/digital-signals-decoding/228802-problems-decoding-wefax.html double smpl_per_lin = lpm_to_samples( m_default_lpm ); int smpl_per_lin_int = smpl_per_lin ; int nb_tested_phasing_lines = m_phasing_calls_nb / smpl_per_lin ; /// If this is too big, we lose the beginning of the fax. // If this is too small, we start recording when we should not (But why not starting early ?) // Value was: 30 static const int max_tested_phasing_lines = 20 ; if( (m_phase_lines == 0) && (m_num_phase_lines == 0) && (nb_tested_phasing_lines >= max_tested_phasing_lines ) && ( (m_phasing_calls_nb % smpl_per_lin_int) == 0 ) ) { switch( the_signal.signal_state() ) { case RXIMAGE : LOG_INFO(_("Starting reception when phasing:%s"), the_signal.signal_text() ); skip_phasing_to_image(true); break ; /// If RXPHASING, we stay in phasing mode. case RXAPTSTOP : /// Do not display the same message over and over. LOG_DEBUG( _("Strong APT stop when phasing:%s"), the_signal.signal_text() ); end_rx(); skip_apt_rx(); default : break ; } } } } bool fax_implementation::decode_image(int x) { double current_row_dbl = m_img_sample / m_smpl_per_lin ; int current_row = current_row_dbl ; int curr_col= m_img_width * (current_row_dbl - current_row) ; if(curr_col==m_last_col) { m_pixel_val+=x; m_pix_samples_nb++; } else { if(m_pix_samples_nb>0) { m_pixel_val/=m_pix_samples_nb; /// TODO: Put m_fax_pix_num in wefax_pic so that the saving of an image /// will only be the number of added pixels. And it will hide /// the storage of B/W pixels in three contiguous ones. // // TODO: If the machine is heavily loaded, it loses a couple of pixel. // The consequence is that the image is shifted. // We could use the local clock to deduce where the pixel must be written: // - Store the first pixel reception time. // - Compute m_fax_pix_num = (reception_time * LPM * image_width) REQ( wefax_pic::update_rx_pic_bw, m_pixel_val, m_fax_pix_num ); m_statistics.add_bw( m_pixel_val ); m_fax_pix_num += bytes_per_pixel ; } m_last_col=curr_col; m_pixel_val=x; m_pix_samples_nb=1; } /// Prints the status from time to time. if( (m_img_sample % 10000) == 0 ) { PUT_STATUS( state_rx_str() << ". " << _("Image reception") << ", " << _("sample") << "=" << m_img_sample ); } /// Hard-limit to the number of rows. if( current_row >= progdefaults.WEFAX_MaxRows ) { std::string comment = strformat( _("Maximum number of rows %d reached:%d. m_last_col=%d Manual=%d"), progdefaults.WEFAX_MaxRows, current_row, m_last_col, m_manual_mode ); LOG_INFO("%s", comment.c_str()); /// The reception might be very poor, so reset AFC. reset_afc(); save_automatic("max",comment); return true ; } else { return false ; } } /// Called automatically or by the GUI, when clicking "Skip APT" void fax_implementation::skip_apt_rx(void) { LOG_INFO("state=%s",state_rx_str() ); REQ( wefax_pic::skip_rx_apt ); if(m_rx_state!=RXAPTSTART) { LOG_ERROR( _("Should be in APT state. State=%s. Manual=%d"), state_rx_str(), m_manual_mode ); } lpm_set( 0 ); m_rx_state=RXPHASING; reset_phasing_counters(); m_img_sample=0; /// Used for correlation between consecutive lines. m_imag_corr_max = 0.0 ; // Used for finally deciding whether it is worth saving the image. m_imag_corr_min = 1.0 ; // Used for finally deciding whether it is worth saving the image. m_statistics.reset(); } void fax_implementation::skip_phasing_to_image_save(const std::string & comment) { switch( m_rx_state ) { /// Maybe we were still reading an image when the phasing band was detected. case RXIMAGE : LOG_INFO("Detected phasing when in image state."); // TODO: Maybe we could keep the top margin, and not save if less than X lines. save_automatic("phasing",comment); skip_apt_rx(); break ; default: LOG_ERROR( _("Should be in phasing or image state. State=%s"), state_rx_str() ); case RXPHASING: break ; } /// Because we might find a phasing band when reading an image. reset_phasing_counters(); /// Auto-centering by default. Beware that if an image is saved and /// if we lose samples, the alignment is lost. skip_phasing_to_image(false); } /// Called by the user when skipping phasing, /// or automatically when phasing is detected. void fax_implementation::skip_phasing_to_image(bool auto_center) { m_ptr_wefax->qso_rec_init(); REQ( wefax_pic::skip_rx_phasing, auto_center ); m_rx_state=RXIMAGE; /// For monochrome, LPM=60, 90, 100, 120, 180, 240. For colour, LPM =120, 240 /// So we round to the nearest integer to avoid slanting. int lpm_integer = wefax_pic::normalize_lpm( m_lpm_img ); if( m_lpm_img != lpm_integer ) { /// If we could not find a valid LPM, then set the default one for this mode (576/288). lpm_integer = wefax_pic::normalize_lpm( m_default_lpm ); LOG_INFO( _("LPM rounded from %f to %d. Manual=%d State=%s"), m_lpm_img, lpm_integer, m_manual_mode, state_rx_str() ); } /// From now on, m_lpm_img will never change and has a normalized value. REQ( wefax_pic::update_rx_lpm, lpm_integer); PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line LPM=") << lpm_integer ); lpm_set( lpm_integer ); } /// Called by the user when clicking button. Never called automatically. void fax_implementation::skip_phasing_rx(bool auto_center) { if(m_rx_state!=RXPHASING) { LOG_ERROR( _("Should be in phasing state. State=%s"), state_rx_str() ); } skip_phasing_to_image(auto_center); /// We force these two values because these could not be detected automatically. if( m_lpm_img != m_default_lpm ) { lpm_set( m_default_lpm ); LOG_INFO( _("Forcing m_lpm_img=%f. Manual=%d"), m_lpm_img, m_manual_mode ); } m_img_sample=0; /// The image start may not be what the phasing would have told. } // Here we want to remove the last detected phasing line and the following // non phasing line from the beginning of the image and one second of apt stop // from the end void fax_implementation::end_rx(void) { /// Synchronized otherwise there might be a crash if something tries to access the data. REQ(wefax_pic::abort_rx_viewer ); m_rx_state=RXAPTSTART; reset_counters(); } /// Receives data from the soundcard. void fax_implementation::rx_new_samples(const double* audio_ptr, int audio_sz) { int demod[audio_sz]; static const double half_255 = (double)range_sample * 0.5 ; const double ratio_sam_devi = half_255 * static_cast(m_sample_rate)/fm_deviation; /// The reception filter may have been changed by the GUI. C_FIR_filter & ref_fir_filt_pair = m_rx_filters[ m_ix_filt ]; const double half_arc_sine_size = m_dbl_arc_sine.size() / 2.0 ; for(int i=0; i10000) { /// Real part of the product of current vector, /// by previous vector rotated of 90 degrees. /// It makes something like sine(a-b). /// Maybe the derivative of the phase, that is, /// the instantaneous frequency ? double y = m_q_fir_old * ifirout - m_i_fir_old * qfirout ; /// Mapped to the interval [0 .. size] /// m_dbl_arc_sine[i] = asin(2*i/m_dbl_arc_sine.size-1)/2/Pi. /// TODO: Therefore it could be simplified ? y = ( y + 1.0 ) * half_arc_sine_size; /// TODO: y might be rounded with more accuracy: (int)(Y+0.5) double x = ratio_sam_devi * m_dbl_arc_sine[static_cast(y)]; int scaled_x = x + half_255 ; if(scaled_x < 0) { scaled_x=0; } else if(scaled_x > range_sample) { scaled_x=range_sample; } demod[i]=scaled_x; } else { demod[i]=0; } } else { /// Why 96000 ? bytes_per_pixel * 32000 because color ? ifirout/=96000; qfirout/=96000; demod[i]=static_cast (std::sqrt(ifirout*ifirout+qfirout*qfirout)); } m_i_fir_old=ifirout; m_q_fir_old=qfirout; } decode( demod, audio_sz); #ifdef WEFAX_DISPLAY_SCOPE /// Nothing really meaningful to display. /// Beware that some pixels are lost if too many things are displayed double scope_demod[ audio_sz ]; /// TODO: Do this in the loop, it will avoid conversions. for( int i = 0 ; i < audio_sz ; ++i ) { scope_demod[ i ] = demod[i]; } set_scope( (double *)scope_demod, audio_sz , true ); #endif // WEFAX_DISPLAY_SCOPE } // Init transmission. Called once only. void fax_implementation::init_tx(int the_smpl_rat) { m_sample_rate=the_smpl_rat; set_carrier(wefax_default_carrier); /// These reset increments of trigo tables. m_ptr_wefax->set_freq(wefax_default_carrier); m_tx_state=TXAPTSTART; } /// Elements of buffer are between 0.0 and 1.0 void fax_implementation::modulate(const double* buffer, int number) { /// TODO: This should be in m_short_sine static const double dbl_max_short_invert = 1.0 / 32768.0 ; double stack_xmt_buf[number] ; if( m_freq_mod ) { for(int i = 0; i < number; i++) { double tmp_freq = m_carrier + 2. * ( buffer[i] - 0.5 ) * fm_deviation ; m_short_sine.set_increment(m_short_sine.size() * tmp_freq / m_sample_rate); stack_xmt_buf[i] = m_short_sine.next_value() * dbl_max_short_invert ; } } else { /// Beware: Not tested ! for(int i = 0; i < number; i++) { stack_xmt_buf[i] = m_short_sine.next_value() * buffer[i] * dbl_max_short_invert ; } } m_ptr_wefax->ModulateXmtr( stack_xmt_buf, number ); } /// Returns true if succesful /* MULTIPSK: 120 LPM / 288 IOC and a transmission takes with a 200 lines wefax_map 150 sec. In FLDIGI it took 480 sec. For 120 LPM it's too slow. "240 LPM" in FLDIGI gives 130 sec which is nearly real 120 LPM. APT 5 sec m_start_duration=5 SYNC 30 sec m_tx_phasing_line=20 lines => 10 seconds if LPM=120 PIC APT 5 sec m_stop_duration=5 BLACK 10 sec No black signal. This is in summary 50 sec + PIC (60*LINES/LPM). */ bool fax_implementation::trx_do_next(void) { LOG_DEBUG("m_lpm_img=%f", m_lpm_img ); /// The number of samples sent for one line. The LPM is given by the GUI. const int smpl_per_lin= m_smpl_per_lin; /// Should not be too big because it is allocated on the stack, gcc feature. static const int block_len = 256 ; double buf[block_len]; bool end_of_loop = false ; bool tx_completed = true ; int curr_sample_idx = 0 , nb_samples_to_send = 0 ; for(int num_bytes_to_write=0; ; ++num_bytes_to_write ) { bool disp_msg = ( ( num_bytes_to_write % block_len ) == 0 ) && ( num_bytes_to_write > 0 ); if( disp_msg ) { modulate( buf, num_bytes_to_write); const char * curr_status_msg = state_to_str( m_tx_state ); /// TODO: Should be multiplied by 3 when sending in BW ? if( m_ptr_wefax->is_tx_finished(curr_sample_idx, nb_samples_to_send, curr_status_msg ) ) { end_of_loop = true ; tx_completed = false; continue ; }; num_bytes_to_write = 0 ; }; if( end_of_loop == true ) { break ; } if(m_tx_state==TXAPTSTART) { nb_samples_to_send = m_sample_rate * m_start_duration ; if( curr_sample_idx < nb_samples_to_send ) { buf[num_bytes_to_write]=(curr_sample_idx*2*m_apt_start_freq/m_sample_rate)%2; curr_sample_idx++; } else { m_tx_state=TXPHASING; curr_sample_idx=0; } } if(m_tx_state==TXPHASING) { nb_samples_to_send = smpl_per_lin * m_tx_phasing_lin ; if( curr_sample_idx < nb_samples_to_send ) { double pos= (double)(curr_sample_idx % smpl_per_lin) / (double)smpl_per_lin; buf[num_bytes_to_write] = (pos<0.025||pos>=0.975 ) ? (m_phase_inverted?0.0:1.0) : (m_phase_inverted?1.0:0.0); curr_sample_idx++; } else { m_tx_state=ENDPHASING; curr_sample_idx=0; } } if(m_tx_state==ENDPHASING) { nb_samples_to_send = smpl_per_lin ; if( curr_sample_idx < nb_samples_to_send ) { buf[num_bytes_to_write]= m_phase_inverted?0.0:1.0; curr_sample_idx++; } else { m_tx_state=TXIMAGE; curr_sample_idx=0; } } if(m_tx_state==TXIMAGE) { /// The image must be stretched so that its width matches the fax width, /// which cannot change because because it depends on the LPM. /// Accordingly the height is stretched. /// For LPM=120 and sample rate=11025 Hz, smpl_per_lin=5512. double ratio_img_to_fax = (double)m_img_width / m_img_tx_cols ; double samples_per_pix = smpl_per_lin / (double)m_img_width ; double ratio_pow = ratio_img_to_fax * ratio_img_to_fax * samples_per_pix ; nb_samples_to_send = m_img_tx_cols * m_img_tx_rows * ratio_pow ; if( curr_sample_idx < nb_samples_to_send ) { int tmp_col = (double)( curr_sample_idx % smpl_per_lin ) * (double)m_img_tx_cols / smpl_per_lin; int tmp_row = (double)( curr_sample_idx / smpl_per_lin ) * (double)m_img_tx_cols / m_img_width; if( tmp_row >= m_img_tx_rows ) { LOG_ERROR( "Inconsistent tmp_row=%d m_img_tx_rows=%d " "curr_sample_idx=%d smpl_per_lin=%d " "ratio_img_to_fax=%f nb_samples_to_send=%d", tmp_row, m_img_tx_rows, curr_sample_idx, smpl_per_lin, ratio_img_to_fax, nb_samples_to_send ); exit(EXIT_FAILURE); } int byte_offset = bytes_per_pixel * ( tmp_row * m_img_tx_cols + tmp_col ); unsigned char temp_pix = m_xmt_pic_buf[ byte_offset ]; curr_sample_idx++; REQ( wefax_pic::set_tx_pic, temp_pix, tmp_col, tmp_row, m_img_color ); buf[num_bytes_to_write]= (double)temp_pix / 256.0 ; if( ( curr_sample_idx % 5000 ) == 0 ) { LOG_INFO( "curr_sample_idx=%d tmp_row=%d tmp_col=%d smpl_per_lin=%d " "samples_per_pix=%f nb_samples_to_send=%d m_img_width=%d", curr_sample_idx, tmp_row, tmp_col, smpl_per_lin, samples_per_pix, nb_samples_to_send, m_img_width ); } } else { m_tx_state=TXAPTSTOP; curr_sample_idx=0; } } if(m_tx_state==TXAPTSTOP) { nb_samples_to_send = m_sample_rate * m_stop_duration ; if( curr_sample_idx < nb_samples_to_send ) { buf[num_bytes_to_write]=curr_sample_idx*2*m_apt_stop_freq/m_sample_rate%2; curr_sample_idx++; } else { m_tx_state=IDLE; end_of_loop = true ; continue ; } } } // loop return tx_completed ; } void fax_implementation::tx_params_set( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h ) { LOG_DEBUG("img_w=%d img_h=%d the_lpm=%d is_color=%d", img_w, img_h, the_lpm, (int)is_color); m_img_tx_rows=img_h; m_img_tx_cols=img_w; m_img_color = is_color ; lpm_set( the_lpm ); m_xmt_pic_buf = xmtpic_buffer ; PUT_STATUS( _("Sending wefax_map.") << _(" rows=") << m_img_tx_rows << _(" cols=") << m_img_tx_cols ); } void fax_implementation::tx_apt_stop(void) { m_tx_state=TXAPTSTOP; } //============================================================================= // //============================================================================= /// Called by trx_trx_transmit_loop void wefax::tx_init() { videoText(); // In trx/modem.cxx m_impl->init_tx(modem::samplerate) ; } /// This updates the window label according to the state. void wefax::update_rx_label(void) const { std::string tmp_label( _("Reception ") ); tmp_label += mode_info[modem::mode].name ; if( m_impl->manual_mode_get() ) { tmp_label += _(" - Manual") ; } else { tmp_label += _(" - APT control") ; } REQ( wefax_pic::set_rx_label, tmp_label ); } void wefax::rx_init() { put_MODEstatus(modem::mode); m_impl->init_rx(modem::samplerate) ; REQ( wefax_pic::resize_rx_viewer, m_impl->fax_width() ); } void wefax::init() { modem::init(); /// TODO: Maybe remove, probably not necessary because called by trx_trx_loop rx_init(); /// TODO: Display scope. set_scope_mode(Digiscope::SCOPE); } void wefax::shutdown() { } wefax::~wefax() { modem::stopflag = true; /// Maybe we are receiving an image, this must be stopped. end_reception(); /// Maybe we are sending an image. REQ( wefax_pic::abort_tx_viewer ); activate_wefax_image_item(false); delete m_impl ; /// Not really useful, just to help debugging. m_impl = 0 ; } wefax::wefax(trx_mode wefax_mode) : modem() { /// Beware that it is already set by modem::modem modem::cap |= CAP_AFC | CAP_REV | CAP_IMG ; LOG_DEBUG("wefax_mode=%d", (int)wefax_mode); wefax::mode = wefax_mode; modem::samplerate = 11025; m_impl = new fax_implementation(wefax_mode, this); /// Now this object is usable by wefax_pic. wefax_pic::setwefax_map_link(this); int tmpShift = progdefaults.WEFAX_Shift ; if( (progdefaults.WEFAX_Shift < 100 ) || ( progdefaults.WEFAX_Shift > 1000 ) ) { static const int standard_shift = 800; LOG_WARN("Invalid weather fax shift: %d. setting standard value: %d", progdefaults.WEFAX_Shift, standard_shift ); tmpShift = standard_shift ; } fm_deviation = tmpShift / 2 ; modem::bandwidth = fm_deviation * 2 ; m_abortxmt = false; modem::stopflag = false; // There is only one instance of the reception and transmission // windows, therefore only static methods. wefax_pic::create_both( false ); /// This updates the window label. set_rx_manual_mode( false ); activate_wefax_image_item(true); init(); } //===================================================================== // receive processing //===================================================================== /// This must return the current time in seconds with high precision. #if defined(__WIN32__) || defined(__APPLE__) #include /// This is much less accurate. static double current_time(void) { clock_t clks = clock(); return clks * 1.0 / CLOCKS_PER_SEC; } #else #if defined(HAVE_CLOCK_GETTIME) #include static double current_time(void) { // DJV/AB3NR // Replace call to deprecated ftime() function with call to // clock_gettime(2). clock_gettime(2) is POSIX.1 compliant. // Replace ifdef __linux__ with autoconf generated guard. // (Note __linux__ fails for *BSD, which all have better functions // than the fallback Windows routine. Note, clock(2) on Unix systems // returns CPU time used so far. It's not a "clock" in any generally // accepted sense of the word. // // Check system call return codes and abort on failure. // DJV/AB3NR struct timespec ts; double curtime; // Do not know if CLOCK_MONOTONIC or CLOCK_REALTIME is appropriate. DJV if(clock_gettime(CLOCK_REALTIME, &ts)!=0) { LOG_PERROR("clock_gettime"); abort(); } curtime= ts.tv_nsec*1e-09 + (double)ts.tv_sec; return curtime; } #else #include // This is much less accurate. // Add compile time warning DJV/AB3NR #warning imprecise clock() call in function current_time in wefax.cxx static double current_time(void) { clock_t clks = clock(); return clks * 1.0 / CLOCKS_PER_SEC; } #endif // HAVE_CLOCK_GETTIME #endif //__WIN32__ /// Callback continuously called by fldigi modem class. int wefax::rx_process(const double *buf, int len) { if( len == 0 ) { return 0 ; } static const int avg_buf_size = 256 ; static int idx = 0 ; static double buf_tim[avg_buf_size]; static int buf_len[avg_buf_size]; int idx_mod = idx % avg_buf_size ; /// Here we estimate the average number of pixels per second. buf_tim[idx_mod] = current_time(); buf_len[idx_mod] = len ; ++idx ; /// Wait some seconds otherwise not significant. if( idx >= avg_buf_size ) { if( idx == avg_buf_size ) { LOG_VERBOSE( _("Starting samples loss control avg_buf_size=%d"), avg_buf_size); } int idx_mod_first = idx % avg_buf_size ; double total_tim = buf_tim[idx_mod] - buf_tim[idx_mod_first]; int total_len = 0 ; for( int ix = 0 ; ix < avg_buf_size ; ++ix ) { total_len += buf_len[ix] ; } /// Estimate the real sample rate. double estim_smpl_rate = (double)total_len / total_tim ; /// If too far from what it should be, it means that pixels were lost. if( estim_smpl_rate < 0.95 * modem::samplerate ) { int expected_samples = (int)( modem::samplerate * total_tim + 0.5 ); int missing_samples = expected_samples - total_len ; LOG_VERBOSE(_("Lost %d samples idx=%d estim_smpl_rate=%f total_tim=%f total_len=%d. Auto-center."), missing_samples, idx, estim_smpl_rate, total_tim, total_len ); REQ( wefax_pic::update_auto_center, true ); if( missing_samples <= 0 ) { /// This should practically never happen. LOG_WARN(_("Cannot compensate")); } else { /// Adjust the number of received pixels, /// so the lost frames are signaled once only. buf_len[idx_mod] += missing_samples ; } } } /// Back to normal processing. m_impl->rx_new_samples( buf, len ); return 0; } //===================================================================== // transmit processing //===================================================================== /// This is called by wefax-pix.cxx before entering transmission loop. void wefax::set_tx_parameters( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h) { m_impl->tx_params_set( the_lpm, xmtpic_buffer, is_color, img_w, img_h ); } /// Callback continuously called by fldigi modem class. int wefax::tx_process() { modem::tx_process(); bool tx_was_completed = m_impl->trx_do_next(); std::string status ; if( false == tx_was_completed ) { status = _("Transmission cancelled"); LOG_INFO("Sending cancelled" ); m_qso_rec.putField(NOTES, status.c_str() ); } // qso_rec_save(); REQ_FLUSH(GET_THREAD_ID()); wefax_pic::restart_tx_viewer(); transmit_lock_release(status); m_abortxmt = false; m_impl->tx_apt_stop(); return -1; } void wefax::skip_apt(void) { m_impl->skip_apt_rx(); } /// auto_center indicates whether we try to find the margin of the image /// automatically. This is the fact when skipping to image reception /// is triggered manually or based on the signal power. void wefax::skip_phasing(bool auto_center) { m_impl->skip_phasing_rx(auto_center); } void wefax::end_reception(void) { m_impl->end_rx(); } // Continuous reception or APT control. void wefax::set_rx_manual_mode( bool manual_flag ) { m_impl->manual_mode_set( manual_flag ); wefax_pic::set_manual( manual_flag ); update_rx_label(); } void wefax::set_lpm( int the_lpm ) { return m_impl->lpm_set( the_lpm ); } /// Transmission time in seconds. Factor 3 if b/w image. int wefax::tx_time( int nb_bytes ) const { return (double)nb_bytes / modem::samplerate ; } /// This prints a message about the progress of image sending, /// then tells whether the user has requested the end. bool wefax::is_tx_finished( int ix_sample, int nb_sample, const char * msg ) const { static char wefaxmsg[256]; double fraction_done = nb_sample ? 100.0 * (double)ix_sample / nb_sample : 0.0 ; int tm_left = tx_time( nb_sample - ix_sample ); snprintf( wefaxmsg, sizeof(wefaxmsg), "%s : %04.1f%% done. Time left: %dm %ds", msg, fraction_done, tm_left / 60, tm_left % 60 ); put_status(wefaxmsg); bool is_finished = modem::stopflag || m_abortxmt ; if( is_finished ) { LOG_INFO("Transmit finished"); } return is_finished ; } /// This returns the names of the possible reception filters. const char ** wefax::rx_filters(void) { return fir_filter_pair_set::filters_list(); } /// Allows to choose the reception filter. void wefax::set_rx_filter( int idx_filter ) { m_impl->set_filter_rx( idx_filter ); } std::string wefax::suggested_filename(void) const { return m_impl->generate_filename( "gui" ); }; /// This creates a QSO record to be written to an adif file. void wefax::qso_rec_init(void) { /// This is always initialised because the flag progdefaults.WEFAX_AdifLog /// may be set in the middle of an image reception. /// Ideally we should find out the name of the fax station. m_qso_rec.putField(CALL, "Wefax"); m_qso_rec.putField(NAME, "Weather fax"); m_qso_rec.putField( TX_PWR, "0"); m_qso_rec.setDateTime(true); m_qso_rec.setFrequency( wf->rfcarrier() + m_impl->carrier() ); m_qso_rec.putField(ADIF_MODE, mode_info[get_mode()].adif_name ); } /// Called once a QSO rec has been filled with information. Saved to adif file. void wefax::qso_rec_save(void) { if( progdefaults.WEFAX_AdifLog == false ) { return ; } m_qso_rec.setDateTime(false); qsodb.qsoNewRec (&m_qso_rec); qsodb.isdirty(0); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); // dxcc_entity_cache_add(&rec); LOG_INFO( _("Updating log book %s"), logbook_filename.c_str() ); } /// Called when changing the carrier in the GUI, and by class modem with 1000Hz, when initializing. void wefax::set_freq(double freq) { modem::set_freq(freq); /// This must recompute the increments of the trigonometric tables. m_impl->set_carrier( freq ); } // String telling the tx and rx internal state. std::string wefax::state_string(void) const { return m_impl->state_string(); } /// Called when a file is saved, so XML-RPC calls can get the filename. void wefax::put_received_file( const std::string &filnam ) { m_impl->put_received_file( filnam ); } /// Returns a received file name, by chronological order. std::string wefax::get_received_file( int max_seconds ) { return m_impl->get_received_file( max_seconds ); } std::string wefax::send_file( const std::string & filnam, double max_seconds ) { return m_impl->send_file( filnam, max_seconds ); } /// Transmitting files is done in exclusive mode. bool wefax::transmit_lock_acquire(const std::string & filnam, double max_seconds ) { return m_impl->transmit_lock_acquire( filnam, max_seconds ); } /// Called after a file is sent. void wefax::transmit_lock_release( const std::string & err_msg ) { m_impl->transmit_lock_release( err_msg ); } fldigi-4.1.06/src/wefax/wefax_map.cxx0000644000175000017500000005460713472115774014404 00000000000000// ---------------------------------------------------------------------------- // wefax_map.cxx rgb wefax_map viewer // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 4 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "trx.h" #include "fl_lock.h" #include "wefax_map.h" #include "debug.h" #include "timeops.h" using namespace std; wefax_map::wefax_map (int X, int Y, int W, int H, int bg_col) : Fl_Widget (X, Y, W, H) { width = W; height = H; bufsize = W * H * depth; numcol = 0; slantdir = 0; vidbuf = new unsigned char[bufsize]; background = bg_col ; memset( vidbuf, background, bufsize ); zoom = 0 ; binary = false ; binary_threshold = 128 ; } wefax_map::~wefax_map() { if (vidbuf) delete [] vidbuf; } void wefax_map::video(unsigned char const *data, int len ) { if (len > bufsize) return; FL_LOCK_D(); memcpy( vidbuf, data, len ); redraw(); FL_UNLOCK_D(); } unsigned char wefax_map::pixel(int pos) { if (pos < 0 || pos >= bufsize) return 0; return vidbuf[pos]; } void wefax_map::clear() { FL_LOCK_D(); memset(vidbuf, background, bufsize); redraw(); FL_UNLOCK_D(); } void wefax_map::resize_zoom(int x, int y, int w, int h) { if( zoom < 0 ) { int stride = -zoom + 1 ; Fl_Widget::resize(x,y,w/stride,h/stride); } else if( zoom > 0 ) { int stride = zoom + 1 ; Fl_Widget::resize(x,y,w*stride,h*stride); } else { Fl_Widget::resize(x,y,w,h); } } void wefax_map::resize(int x, int y, int w, int h) { FL_LOCK_D(); width = w; height = h; delete [] vidbuf; bufsize = depth * w * h; vidbuf = new unsigned char[bufsize]; memset( vidbuf, background, bufsize ); resize_zoom(x,y,w,h); FL_UNLOCK_D(); } /// No data destruction. Used when the received image grows more than expected. /// Beware that this is not protected by a mutex. void wefax_map::resize_height(int new_height, bool clear_img) { int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; if( clear_img ) { /// Sets to zero the complete image. memset( new_vidbuf, background, new_bufsize ); } else { if( new_height <= height ) { memcpy( new_vidbuf, vidbuf, new_bufsize ); } else { memcpy( new_vidbuf, vidbuf, bufsize ); memset( new_vidbuf + bufsize, background, new_bufsize - bufsize ); } } delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } void wefax_map::stretch(double the_ratio) { /// We do not change the width but the height int new_height = height * the_ratio + 0.5 ; int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; /// No interpolation, it takes the nearest pixel. for( int ix_out = 0 ; ix_out < new_bufsize ; ix_out += depth ) { int ix_in = 0.5 + ( double )ix_out * the_ratio ; switch( ix_in % depth ) { case 1 : --ix_in ; break ; case 2 : ++ix_in ; break ; default: ; } if( ix_in >= bufsize ) { /// Grey value as a filler to indicate the end. For debugging. memset( new_vidbuf + ix_out, 128, new_bufsize - ix_out ); break ; } for( int i = 0; i < depth ; ++i ) { new_vidbuf[ ix_out + i ] = vidbuf[ ix_in + i ]; } }; delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } /// Change the horizontal center of the image by shifting the pixels. void wefax_map::shift_horizontal_center(int horizontal_shift) { /// This is a number of pixels. horizontal_shift *= depth ; if( horizontal_shift < -bufsize ) { horizontal_shift = -bufsize ; } if( horizontal_shift > 0 ) { /// Here we lose a couple of pixels at the end of the buffer /// if there is not a line enough. It should not be a lot. memmove( vidbuf + horizontal_shift, vidbuf, bufsize - horizontal_shift ); memset( vidbuf, background, horizontal_shift ); } else { /// Here, it is not necessary to reduce the buffer size. memmove( vidbuf, vidbuf - horizontal_shift, bufsize + horizontal_shift ); memset( vidbuf + bufsize + horizontal_shift, background, -horizontal_shift ); } redraw(); } void wefax_map::set_zoom( int the_zoom ) { zoom = the_zoom ; /// The size of the displayed bitmap is changed. resize_zoom( x(), y(), width, height ); } // in data user data passed to function // in x_screen,y_screen,wid_screen position and width of scan line in image // out buf buffer for generated image data. // Must copy wid_screen pixels from scanline y_screen, starting at pixel x_screen to this buffer. void wefax_map::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, uchar * __restrict__ buf) { const wefax_map * __restrict__ ptr_pic = ( const wefax_map * ) data ; const int img_width = ptr_pic->width ; const unsigned char * __restrict__ in_ptr = ptr_pic->vidbuf ; /// One pixel out of (zoom+1) if( ptr_pic->zoom < 0 ) { const int stride = -ptr_pic->zoom + 1 ; const int in_offset = ( img_width * y_screen + x_screen ) * stride ; int dpth_in_offset = depth * in_offset ; if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth * stride ; } } else { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = in_ptr[ dpth_in_offset ]; buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ]; buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ]; dpth_in_offset += depth * stride ; } } return ; } /// Reads each input pixel (-zoom+1) times. if( ptr_pic->zoom > 0 ) { const int stride = ptr_pic->zoom + 1 ; const int in_offset = img_width * ( y_screen / stride ) + x_screen / stride ; #ifndef NDEBUG if( y_screen / stride >= ptr_pic->h() ) { LOG_ERROR( "Overflow2 y_screen=%d h=%d y_screen*stride=%d height=%d stride=%d\n", y_screen, ptr_pic->h(), (y_screen/stride), ptr_pic->height, stride ); return ; } #endif if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); unsigned char in_dpth_in_offset_1 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); unsigned char in_dpth_in_offset_2 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } else { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = in_ptr[ dpth_in_offset ]; unsigned char in_dpth_in_offset_1 = in_ptr[ dpth_in_offset + 1 ]; unsigned char in_dpth_in_offset_2 = in_ptr[ dpth_in_offset + 2 ]; // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } return ; } // zoom == 0, stride=1 const int in_offset = img_width * y_screen + x_screen ; if(ptr_pic->binary) { int dpth_in_offset = depth * in_offset ; for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth ; } } else { abort(); // This should never be called, see optimization in wefax_map::draw(). } } // wefax_map::draw_cb void wefax_map::draw() { if( ( zoom == 0 ) && ( binary == false ) ) { /// No scaling, this is faster. fl_draw_image( vidbuf, x(), y(), w(), h() ); } else { fl_draw_image( draw_cb, this, x(), y(), w(), h() ); // redraw(); } } void wefax_map::slant_undo() { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0 || slantdir == 0) return; if (slantdir == -1) { // undo from left for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } } else if (slantdir == 1) { // undo from right for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } } slantdir = 0; redraw(); } void wefax_map::slant_corr(int x, int y) { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0) return; if (x > width / 2) { // unwrap from right numcol = (width - x) * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } slantdir = 1; } else { // unwrap from left numcol = x * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } slantdir = -1; } redraw(); } int wefax_map::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int evb = Fl::event_button(); if (evb == 1) slant_corr(xpos, ypos); else if (evb == 3) slant_undo(); LOG_DEBUG("#2 %d, %d", xpos, ypos); return 1; } return 1; } return 0; } static FILE* open_file(const char* name, const char* suffix) { FILE* fp; size_t flen = strlen(name); if (name[flen - 1] == '/') { // if the name ends in a slash we will generate // a timestamped name in the following format: const char t[] = "pic_YYYY-MM-DD_HHMMSSz"; size_t newlen = flen + sizeof(t); if (suffix) newlen += 5; char* newfn = new char[newlen]; memcpy(newfn, name, flen); time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); size_t sz; if ((sz = strftime(newfn + flen, newlen - flen, "pic_%Y-%m-%d_%H%M%Sz", &ztime)) > 0) { strncpy(newfn + flen + sz, suffix, newlen - flen - sz); newfn[newlen - 1] = '\0'; mkdir(name, 0777); fp = fopen(newfn, "wb"); } else fp = NULL; delete [] newfn; } else fp = fopen(name, "wb"); return fp; } static inline unsigned char avg_pix( const unsigned char * vidbuf ) { return ( vidbuf[ 0 ] + vidbuf[ 1 ] + vidbuf[ 2 ] ) / wefax_map::depth ; } int wefax_map::save_png(const char* filename, bool monochrome, const char *extra_comments) { FILE* fp; if ((fp = open_file(filename, ".png")) == NULL) return -1; // set up the png structures png_structp png; png_infop info; if ((png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) { fclose(fp); return -1; } /* png_set_compression_level() shall set the compression level to "level". * The valid values for "level" range from [0,9], corresponding directly * to compression levels for zlib. The value 0 implies no compression * and 9 implies maximal compression. Note: Tests have shown that zlib * compression levels 3-6 usually perform as well as level 9 for PNG images, * and do considerably fewer calculations. */ png_set_compression_level(png, Z_BEST_COMPRESSION); if ((info = png_create_info_struct(png)) == NULL) { png_destroy_write_struct(&png, NULL); fclose(fp); return -1; } if (setjmp(png_jmpbuf(png))) { png_destroy_write_struct(&png, &info); fclose(fp); return -1; } // use an stdio stream png_init_io(png, fp); // set png header int color_type = monochrome ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_RGB ; /// Color images must take eight bits per pixel. const int bit_depth = ( monochrome && binary ) ? 1 : 8 ; png_set_IHDR(png, info, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); // write text comments struct tm tm; time_t t = time(NULL); gmtime_r(&t, &tm); char z[20 + 1]; strftime(z, sizeof(z), "%Y-%m-%dT%H:%M:%SZ", &tm); z[sizeof(z) - 1] = '\0'; ostringstream comment; comment << "Program: " PACKAGE_STRING << '\n' << "Received: " << z << '\n' << "Modem: " << mode_info[active_modem->get_mode()].name << '\n' << "Frequency: " << inpFreq->value() << '\n'; if( extra_comments ) { comment << extra_comments ; } if (inpCall->size()) comment << "Log call: " << inpCall->value() << '\n'; // set text png_text text; text.key = strdup("Comment"); text.text = strdup(comment.str().c_str()); text.compression = PNG_TEXT_COMPRESSION_NONE; png_set_text(png, info, &text, 1); // write header png_write_info(png, info); // Extra check for debugging. if( height * width * depth != bufsize ) { LOG_ERROR("Buffer inconsistency h=%d w=%d b=%d", height, width, bufsize ); } // write image if(monochrome) { unsigned char tmp_row[width]; png_bytep row; for (int i = 0; i < height; i++) { int row_offset = i * width * depth ; if( binary ) { unsigned char accumPix = 0 ; int j_offset = 0 ; for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; unsigned char tmpChr = avg_pix( vidbuf + col_offset ); tmpChr = pix2bin(tmpChr) ? 1 : 0 ; j_offset = j & 0x07 ; tmpChr = tmpChr << ( 7 - j_offset ); accumPix |= tmpChr ; if( j_offset == 7 ) { tmp_row[ j >> 3 ] = accumPix ; accumPix = 0 ; } } if( j_offset != 7 ) { tmp_row[ width >> 3 ] = accumPix ; } } else { for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; tmp_row[j] = avg_pix( vidbuf + col_offset ); } } row = tmp_row; png_write_rows(png, &row, 1); } } else { png_bytep row; for (int i = 0; i < height; i++) { row = &vidbuf[i * width * depth]; png_write_rows(png, &row, 1); } } png_write_end(png, info); // clean up free(text.key); free(text.text); png_destroy_write_struct(&png, &info); fclose(fp); return 0; } bool wefax_map::restore( int row, int margin ) { if( ( row <= noise_height_margin ) || ( row >= height ) ) return true; unsigned char * line_ante = vidbuf + (row - noise_height_margin) * width * depth; // Copy the new calculated value (at previous call) to all channels. // TODO: Do that when switching off noise removal, otherwise a couple of colored pixels are left. for( int col = margin ; col < width - margin; ++col ) { int offset = col * depth ; line_ante[ offset ] = line_ante[ offset + 2 ] = line_ante[ offset + 1 ]; } return false ; } void wefax_map::erosion( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 255 ; new_pix = std::min( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void wefax_map::dilatation( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 0 ; new_pix = std::max( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void wefax_map::remove_noise( int row, int half_len, int noise_margin ) { if( restore( row, half_len ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; const int nb_neighbours = ( 2 * ( 2 * half_len + 1 ) ); int medians[nb_neighbours]; /// Takes into account the first component only. for( int col = half_len ; col < width - half_len; ++col ) { int curr_pix = line_curr[ col * depth ]; assert( ( curr_pix >= 0 ) && ( curr_pix <= 255 ) ); int pix_min = 255, pix_max = 0; for( int subcol = col - half_len, tmp, nghb_i = 0 ; subcol <= col + half_len ; ++subcol ) { int offset = subcol * depth ; tmp = line_prev[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; tmp = line_next[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; } // Maybe the pixel is between min and max. int thres_min = pix_min - noise_margin; if(thres_min < 0) thres_min = 0; assert(thres_min <= pix_min); int thres_max = pix_max + noise_margin; if(thres_max > 255 ) thres_max = 255; if(thres_max < pix_max) abort(); if( ( curr_pix >= thres_min ) && ( curr_pix <= thres_max ) ) continue ; assert( ( pix_max >= 0 ) && ( pix_max <= 255 ) ); std::sort( medians, medians + nb_neighbours ); int new_pix = medians[ nb_neighbours / 2 ]; assert( new_pix >= 0 ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } int wefax_picbox::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_DND_ENTER: case FL_DND_LEAVE: case FL_DND_DRAG: case FL_DND_RELEASE: return 1; case FL_PASTE: break; default: return Fl_Box::handle(event); } // handle FL_PASTE string text = Fl::event_text(); // from dnd event "file:///home/dave/Photos/dave.jpeg" string::size_type p; if ((p = text.find("file://")) != string::npos) text.erase(0, p + strlen("file://")); if ((p = text.find('\r')) != string::npos) text.erase(p); if ((p = text.find('\n')) != string::npos) text.erase(p); struct stat st; if (stat(text.c_str(), &st) == -1 || !S_ISREG(st.st_mode)) return 0; extern void load_image(const char*); load_image(text.c_str()); return 1; } fldigi-4.1.06/src/rigcontrol/0000775000175000017500000000000013515625027013022 500000000000000fldigi-4.1.06/src/rigcontrol/rigxml.cxx0000644000175000017500000005514313472116000014762 00000000000000// ---------------------------------------------------------------------------- // rigxml.cxx - parse a rig control xml file // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "gettext.h" #include "rigio.h" #include "rigxml.h" #include "rigsupport.h" #ifdef RIGCATTEST #include "rigCAT.h" #else #include "main.h" #endif #include "debug.h" #include "configuration.h" #include "fileselect.h" #include "confdialog.h" #include "icons.h" #include "fl_digi.h" using namespace std; //#define DEBUGXML 1 void parseRIGDEF(size_t &); void parseRIG(size_t &); void parseCOMMAND(size_t &); void parseREPLY(size_t &); void parseMODES(size_t &); void parseBANDWIDTHS(size_t &); void parseBWCMD(size_t &); void parseBWREPLY(size_t &); void parseMODECMD(size_t &); void parseMODEREPLY(size_t &); void parseTITLE(size_t &); void parseLSBMODES(size_t &); void parseDISCARD(size_t &); void parseDEBUG(size_t &); void parseNOSERIAL(size_t &); void parseASCII(size_t &); void parseWRITE_DELAY(size_t &); void parseINIT_DELAY(size_t &); void parseWAIT_FOR_DEVICE(size_t &); void parsePOST_WRITE_DELAY(size_t &); void parseRETRIES(size_t &); void parseTIMEOUT(size_t &); void parseBAUDRATE(size_t &); void parseSTOPBITS(size_t &); void parseRTSCTS(size_t &); void parseCMDPTT(size_t &); void parseRTSPLUS(size_t &); void parseDTRPLUS(size_t &); void parseRTSPTT(size_t &); void parseDTRPTT(size_t &); void parseRESTORE_TIO(size_t &); void parseECHO(size_t &); void parseVSP(size_t &); void parseLOGSTR(size_t &); void parsePOLLINT(size_t &); void parseSMETER(size_t &); void parsePMETER(size_t &); void parseNOTCH(size_t &); void parsePWRLEVEL(size_t &); void parseIOSsymbol(size_t &); void parseIOSsize(size_t &); void parseIOSbytes(size_t &); void parseIOSbyte(size_t &); void parseIOSdata(size_t &); void parseIOSinfo(size_t &); void parseIOSok(size_t &); void parseIOSbad(size_t &); void parseIOSstring(size_t &); void parseIOSint(size_t &); void parseIOSfill(size_t &); void parseDTYPE(size_t &); void parseDSIZE(size_t &); void parseDMAX(size_t &); void parseDMIN(size_t &); void parseDRESOL(size_t &); void parseDREV(size_t &); void parseDMAKS(size_t &); void parseDSHIFT(size_t &); void print(size_t &); list commands; list reply; list lmodes; list lbws; list lbwCMD; list lbwREPLY; list lmodeCMD; list lmodeREPLY; list LSBmodes; XMLRIG xmlrig; XMLIOS iosTemp; string strXML; TAGS rigdeftags[] = { {"", p0); LOG_INFO("%s%s", istr.c_str(), strXML.substr(p0, tend - p0 + 1).c_str()); #endif } size_t tagEnd(size_t p0) { size_t p1, p2, p3; p1 = p0; string strtag = "", p0); p3 = strXML.find(" ", p0); if (p2 == string::npos) { return p2; } if (p3 < p2) p2 = p3; strtag.append(strXML.substr(p1 + 1, p2 - p1 - 1)); strtag.append(">"); p3 = strXML.find(strtag, p1); return p3; } size_t nextTag(size_t p0) { p0 = strXML.find("<", p0+1); return p0; } string getElement(size_t p0) { size_t p1 = strXML.find(">",p0), p2 = nextTag(p1+1); if (p1 == string::npos || p2 == string::npos) return ""; p1++; p2--; while (p1 < p2 && strXML[p1] == ' ') p1++; // skip leading spaces while (p1 < p2 && strXML[p2] == ' ') p2--; // skip trailing spaces return strXML.substr(p1, p2 - p1 + 1); } int getInt(size_t p0) { string stemp = getElement(p0); if (stemp.length() == 0) return 0; return atoi(stemp.c_str()); } float getFloat(size_t p0) { string stemp = getElement(p0); if (stemp.length() == 0) return 0; return atof(stemp.c_str()); } bool getBool( size_t p0) { string stemp = getElement(p0); if (stemp.length() == 0) return false; if (strcasecmp(stemp.c_str(), "true") == 0) return true; if (stemp == "1") return true; return false; } char getByte(size_t p0) { unsigned int val; if (sscanf( getElement(p0).c_str(), "%x", &val ) != 1) return 0; return (val & 0xFF); } string getBytes(size_t p0) { unsigned int val; size_t space; string stemp = getElement(p0); string s; while ( stemp.length() ) { if (sscanf( stemp.c_str(), "%x", &val) != 1) { s = ""; return s; } s += (char)(val & 0xFF); space = stemp.find(" "); if (space == string::npos) break; stemp.erase(0, space + 1); } return s; } bool isInt(size_t p0, int &i) { // p0 = nextTag(p0); if (strXML.find(" &lmd) { size_t pend = tagEnd(p0); size_t elend; char ch; int n; string stemp; string strELEMENT; if (pend == string::npos) { p0++; return; } print(p0,0); p0 = nextTag(p0); while (p0 != string::npos && p0 < pend && tagIs(p0, " &lbw) { size_t pend = tagEnd(p0); size_t elend; char ch; int n; string strELEMENT; string stemp; if (pend == string::npos) { LOG_ERROR("Unmatched tag %s", strXML.substr(p0, 10).c_str()); p0++; return; } print(p0,0); size_t p1 = nextTag(p0); while (p1 != string::npos && p1 < pend && tagIs(p1, " pend) { LOG_ERROR("Unmatched tag %s", " 2) val = 2; xmlrig.stopbits = val; size_t pend = tagEnd(p0); p0 = pend; } void parseWRITE_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.write_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseINIT_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.init_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseWAIT_FOR_DEVICE(size_t &p0){ int val = getInt(p0); xmlrig.wait_for_device = val; size_t pend = tagEnd(p0); p0 = pend; } void parsePOST_WRITE_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.post_write_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRETRIES(size_t &p0){ int val = getInt(p0); xmlrig.retries = val; size_t pend = tagEnd(p0); p0 = pend; } void parseTIMEOUT(size_t &p0){ int val = getInt(p0); xmlrig.timeout = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSCTS(size_t &p0){ bool val = getBool(p0); xmlrig.rtscts = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSPLUS(size_t &p0) { bool val = getBool(p0); xmlrig.rts = val; size_t pend = tagEnd(p0); p0 = pend; } void parseDTRPLUS(size_t &p0) { bool val = getBool(p0); xmlrig.dtr = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSPTT(size_t &p0) { bool val = getBool(p0); xmlrig.rtsptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseDTRPTT(size_t &p0) { bool val = getBool(p0); xmlrig.dtrptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRESTORE_TIO(size_t &p0) { bool val = getBool(p0); xmlrig.restore_tio = val; size_t pend = tagEnd(p0); p0 = pend; } void parseCMDPTT(size_t &p0) { bool val = getBool(p0); xmlrig.cmdptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseECHO(size_t &p0) { bool val = getBool(p0); xmlrig.echo = val; size_t pend = tagEnd(p0); p0 = pend; } void parseVSP(size_t &p0) { bool val = getBool(p0); xmlrig.vsp = val; size_t pend = tagEnd(p0); p0 = pend; } void parseLOGSTR(size_t &p0) { bool val = getBool(p0); xmlrig.logstr = val; size_t pend = tagEnd(p0); p0 = pend; } void parsePOLLINT(size_t &p0) { int val = getInt(p0); if (val < 100) val = 1000; if (val > 20000) val = 20000; xmlrig.pollinterval = val; size_t pend = tagEnd(p0); p0 = pend; } void parseSMETER(size_t &p0) { string strmeter = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.smeter.clear(); int val, sm; size_t p = strmeter.find(","); while ( !strmeter.empty() && (p != string::npos) ) { val = atoi(&strmeter[0]); sm = atoi(&strmeter[p+1]); xmlrig.smeter.push_back(PAIR(val,sm)); p = strmeter.find(";"); if (p == string::npos) strmeter.clear(); else { strmeter.erase(0, p+1); p = strmeter.find(","); } } xmlrig.use_smeter = true; } void parsePMETER(size_t &p0) { string strmeter = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.pmeter.clear(); int val, sm; size_t p = strmeter.find(","); while ( !strmeter.empty() && (p != string::npos) ) { val = atoi(&strmeter[0]); sm = atoi(&strmeter[p+1]); xmlrig.pmeter.push_back(PAIR(val,sm)); p = strmeter.find(";"); if (p == string::npos) strmeter.clear(); else { strmeter.erase(0, p+1); p = strmeter.find(","); } } xmlrig.use_pwrmeter = true; } void parseNOTCH(size_t &p0) { string strnotch = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.notch.clear(); int val, ntch; size_t p = strnotch.find(","); while ( !strnotch.empty() && (p != string::npos) ) { val = atoi(&strnotch[0]); ntch = atoi(&strnotch[p+1]); xmlrig.notch.push_back(PAIR(val,ntch)); p = strnotch.find(";"); if (p == string::npos) strnotch.clear(); else { strnotch.erase(0, p+1); p = strnotch.find(","); } } xmlrig.use_notch = true; } void parsePWRLEVEL(size_t &p0) { string strpwrlevel = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.pwrlevel.clear(); int val, pwr; float min = 500, max = 0; size_t p = strpwrlevel.find(","); while ( !strpwrlevel.empty() && (p != string::npos) ) { val = atoi(&strpwrlevel[0]); pwr = atoi(&strpwrlevel[p+1]); if (pwr < min) min = pwr; if (pwr > max) max = pwr; xmlrig.pwrlevel.push_back(PAIR(val,pwr)); p = strpwrlevel.find(";"); if (p == string::npos) strpwrlevel.clear(); else { strpwrlevel.erase(0, p+1); p = strpwrlevel.find(","); } } pwr_level->range(min, max); xmlrig.use_pwrlevel = true; } //--------------------------------------------------------------------- // Parse IOS (serial stream format) definitions //--------------------------------------------------------------------- void parseIOSsize(size_t &p0) { iosTemp.size = getInt(p0); } void parseIOSbytes(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1.append(getBytes(p0)); else iosTemp.str2.append(getBytes(p0)); } void parseIOSbyte(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += getByte(p0); else iosTemp.str2 += getByte(p0); } void parseIOSstring(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += getElement(p0); else iosTemp.str2 += getElement(p0); } void parseIOSint(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += (char)(getInt(p0) & 0xFF); else iosTemp.str2 += (char)(getInt(p0) & 0xFF); } void parseDTYPE(size_t &p1) { print(p1,2); iosTemp.data.dtype = getElement(p1); } void parseDSIZE(size_t &p1) { print(p1,2); iosTemp.data.size = getInt(p1); } void parseDMAX(size_t &p1) { print(p1,2); iosTemp.data.max = getInt(p1); } void parseDMIN(size_t &p1) { print(p1,2); iosTemp.data.min = getInt(p1); } void parseDRESOL(size_t &p1) { print(p1,2); iosTemp.data.resolution = getFloat(p1); } void parseDREV(size_t &p1) { print(p1,2); iosTemp.data.reverse = getBool(p1); } void parseDMAKS(size_t &p1) { print(p1,2); iosTemp.data.andmask = getInt(p1); } void parseDSHIFT(size_t &p1) { print(p1,2); iosTemp.data.shiftbits = getInt(p1); } void parseIOSdata(size_t &p0) { size_t pend = tagEnd(p0); size_t p1; TAGS *pv; p1 = nextTag(p0); while (p1 < pend) { pv = datatags; while (pv->tag) { if (strXML.find(pv->tag, p1) == p1) break; pv++; } if (pv->fp) { print(p1, 1); (pv->fp)(p1); p1 = tagEnd(p1); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str()); parseDISCARD(p1); } p1 = nextTag(p1); } } void parseIOSinfo(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.info = strR; } void parseIOSok(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.ok = strR; } void parseIOSbad(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.bad = strR; } void parseIOSsymbol(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.SYMBOL = strR; } void parseIOSfill(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.fill1 = getInt(p0); else iosTemp.fill2 = getInt(p0); } //======================================================================= bool parseIOS(size_t &p0, TAGS *valid) { size_t pend = tagEnd(p0); size_t p1; TAGS *pv; print(p0,0); iosTemp.clear(); p1 = nextTag(p0); while (p1 < pend) { pv = valid; while (pv->tag) { if (strXML.find(pv->tag, p1) == p1) break; pv++; } if (pv->fp) { print(p1, 1); (pv->fp)(p1); p1 = tagEnd(p1); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str()); parseDISCARD(p1); } p1 = nextTag(p1); } p0 = pend; return (!iosTemp.SYMBOL.empty()); } void parseCOMMAND(size_t &p0) { if (parseIOS(p0, commandtags)) commands.push_back(iosTemp); } void parseREPLY(size_t &p0) { if (parseIOS(p0, replytags)) reply.push_back(iosTemp); } void parseRIGDEF(size_t &p0) { print(p0,0); size_t p1 = tagEnd(p0); if (p1 != string::npos) strXML.erase(p1); } void parseDISCARD(size_t &p0) { size_t pend = tagEnd(p0); if (pend == string::npos) p0++; else p0 = pend; } void parseXML() { size_t p0 = 0; TAGS *pValid = rigdeftags; p0 = strXML.find("<"); while (p0 != string::npos) { pValid = rigdeftags; while (pValid->tag) { if (strXML.find(pValid->tag, p0) == p0) break; pValid++; } if (pValid->tag) { (pValid->fp)(p0); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p0, 10).c_str()); parseDISCARD(p0); } p0 = nextTag(p0); } } bool remove_comments() { size_t p0 = 0; size_t p1 = 0; // remove comments from xml text while ((p0 = strXML.find("", p0); if (p1 == string::npos) { fl_alert2("Corrupt rig XML definition file\nMismatched comment tags!"); return false; } strXML.erase(p0, p1 - p0 + 3); } if (strXML.find("-->") != string::npos) { fl_alert2("Corrupt rig XML definition file\nMismatched comment tags!"); return false; } return true; } bool testXML() { if (!remove_comments()) return false; return true; } bool readRigXML() { char szLine[256]; int lines = 0; commands.clear(); reply.clear(); lmodes.clear(); lmodeCMD.clear(); lmodeREPLY.clear(); lbws.clear(); lbwCMD.clear(); lbwREPLY.clear(); LSBmodes.clear(); strXML = ""; ifstream xmlfile(progdefaults.XmlRigFilename.c_str(), ios::in); if (xmlfile) { while (!xmlfile.eof()) { lines++; memset(szLine, 0, sizeof(szLine)); xmlfile.getline(szLine,255); strXML.append(szLine); } xmlfile.close(); if (testXML()) { parseXML(); xmlrig.xmlok = true; return true; } } return false; } void selectRigXmlFilename() { string deffilename; deffilename = progdefaults.XmlRigFilename; const char *p = FSEL::select(_("Open rig xml file"), _("Fldigi rig xml definition file\t*.xml"), deffilename.c_str()); if (!p) return; if (!*p) return; progdefaults.XmlRigFilename = p; txtXmlRigFilename->value(fl_filename_name(p)); loadRigXmlFile(); } void loadRigXmlFile(void) { rigCAT_close(); readRigXML(); rigCAT_defaults(); } fldigi-4.1.06/src/rigcontrol/serial.cxx0000644000175000017500000005043313472116000014734 00000000000000// ---------------------------------------------------------------------------- // serial.cxx - Serial I/O class // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "serial.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); #ifndef __MINGW32__ #include #include #include #include #include #include #include #include using namespace std; Cserial::Cserial() { device = "/dev/ttyS0"; baud = 1200; timeout = 50; //msec retries = 5; rts = dtr = false; rtsptt = dtrptt = false; rtscts = false; status = 0; stopbits = 2; fd = -1; restore_tio = true; } Cserial::~Cserial() { ClosePort(); } /////////////////////////////////////////////////////// // Function name : Cserial::OpenPort // Description : Opens the port specified by strPortName // Return type : BOOL // Argument : c_string strPortName /////////////////////////////////////////////////////// bool Cserial::OpenPort() { #ifdef __CYGWIN__ com_to_tty(device); #endif int oflags = O_RDWR | O_NOCTTY | O_NDELAY; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd = fl_open( device.c_str(), oflags)) < 0) return false; // save current port settings tcflush (fd, TCIFLUSH); tcgetattr (fd, &oldtio); newtio = oldtio; // 8 data bits newtio.c_cflag &= ~CSIZE; newtio.c_cflag |= CS8; // enable receiver, set local mode newtio.c_cflag |= (CLOCAL | CREAD); // no parity newtio.c_cflag &= ~PARENB; if (stopbits == 1) // 1 stop bit newtio.c_cflag &= ~CSTOPB; else // 2 stop bit newtio.c_cflag |= CSTOPB; if (rtscts) // h/w handshake newtio.c_cflag |= CRTSCTS; else // no h/w handshake newtio.c_cflag &= ~CRTSCTS; // raw input newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // raw output newtio.c_oflag &= ~OPOST; // software flow control disabled newtio.c_iflag &= ~IXON; // do not translate CR to NL newtio.c_iflag &= ~ICRNL; switch(baud) { case 50: speed = B50; break; case 300: speed = B300; break; case 1200: speed = B1200; break; case 2400: speed = B2400; break; case 4800: speed = B4800; break; case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; case 57600: speed = B57600; break; case 115200: speed = B115200; break; default: speed = B1200; } cfsetispeed(&newtio, speed); cfsetospeed(&newtio, speed); tcsetattr (fd, TCSANOW, &newtio); ioctl(fd, TIOCMGET, &status); origstatus = status; if (dtr) status |= TIOCM_DTR; // set the DTR bit else status &= ~TIOCM_DTR; // clear the DTR bit if (rtscts == false) { // rts OK for ptt if RTSCTS not used if (rts) status |= TIOCM_RTS; // set the RTS bit else status &= ~TIOCM_RTS; // clear the RTS bit } ioctl(fd, TIOCMSET, &status); return true; } /////////////////////////////////////////////////////// // Function name : Cserial::setPTT // Return type : void /////////////////////////////////////////////////////// void Cserial::SetPTT(bool b) { if (fd < 0) { LOG_DEBUG("PTT fd < 0"); return; } if (dtrptt || rtsptt) { ioctl(fd, TIOCMGET, &status); LOG_DEBUG("H/W PTT %d, status %X", b, status); if (b == true) { // ptt enabled if (dtrptt && dtr) status &= ~TIOCM_DTR; // toggle low if (dtrptt && !dtr) status |= TIOCM_DTR; // toggle high if (rtscts == false) { if (rtsptt && rts) status &= ~TIOCM_RTS; // toggle low if (rtsptt && !rts) status |= TIOCM_RTS; // toggle high } } else { // ptt disabled if (dtrptt && dtr) status |= TIOCM_DTR; // toggle high if (dtrptt && !dtr) status &= ~TIOCM_DTR; // toggle low if (rtscts == false) { if (rtsptt && rts) status |= TIOCM_RTS; // toggle high if (rtsptt && !rts) status &= ~TIOCM_RTS; // toggle low } } LOG_DEBUG("Status %02X, %s", status & 0xFF, uint2bin(status, 8)); ioctl(fd, TIOCMSET, &status); } LOG_DEBUG("No PTT specified"); } /////////////////////////////////////////////////////// // Function name : Cserial::ClosePort // Description : Closes the Port // Return type : void /////////////////////////////////////////////////////// void Cserial::ClosePort() { if (fd < 0) return; if (restore_tio) { ioctl(fd, TIOCMSET, &origstatus); tcsetattr (fd, TCSANOW, &oldtio); } close(fd); LOG_INFO("Serial port closed, fd = %d", fd); fd = -1; return; } bool Cserial::IOselect () { fd_set rfds; struct timeval tv; int retval; FD_ZERO (&rfds); FD_SET (fd, &rfds); tv.tv_sec = timeout/1000; tv.tv_usec = (timeout % 1000) * 1000; retval = select (FD_SETSIZE, &rfds, (fd_set *)0, (fd_set *)0, &tv); if (retval <= 0) // no response from serial port or error returned return false; return true; } /////////////////////////////////////////////////////// // Function name : Cserial::ReadBuffer // Description : Reads upto nchars from the selected port // Return type : # characters received // Argument : pointer to buffer; # chars to read /////////////////////////////////////////////////////// int Cserial::ReadBuffer (unsigned char *buf, int nchars) { if (fd < 0) return 0; int retnum, nread = 0; while (nchars > 0) { if (!IOselect()) { return nread; } retnum = read (fd, (char *)(buf + nread), nchars); if (retnum < 0) return 0;//nread; if (retnum == 0) return nread; nread += retnum; nchars -= retnum; } return nread; } /////////////////////////////////////////////////////// // Function name : Cserial::WriteBuffer // Description : Writes a string to the selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// int Cserial::WriteBuffer(unsigned char *buff, int n) { if (fd < 0) return 0; int ret = write (fd, buff, n); return ret; } /////////////////////////////////////////////////////// // Function name : Cserial::FlushBuffer // Description : flushes the pending rx chars // Return type : void /////////////////////////////////////////////////////// void Cserial::FlushBuffer() { if (fd < 0) return; tcflush (fd, TCIFLUSH); } #else // __MINGW32__ //====================================================================== // Win32 support code //====================================================================== #include "estrings.h" using namespace std; /////////////////////////////////////////////////////// // Function name : Cserial::OpenPort // Description : Opens the port specified by strPortName // Return type : BOOL // Argument : CString strPortName /////////////////////////////////////////////////////// BOOL Cserial::OpenPort() { string COMportname = "//./"; tty_to_com(device); COMportname += device; hComm = CreateFile(COMportname.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if(hComm == INVALID_HANDLE_VALUE) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); return FALSE; } if (!ConfigurePort( baud, 8, FALSE, NOPARITY, stopbits)) { errno = GetLastError(); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; LOG_PERROR(win_error_string(errno).c_str()); return FALSE; } LOG_INFO("COM port %s opened, handle = %d", device.c_str(), (int)hComm); FlushBuffer(); return TRUE; } /////////////////////////////////////////////////////// // Function name : Cserial::ClosePort // Description : Closes the Port // Return type : void /////////////////////////////////////////////////////// void Cserial::ClosePort() { LOG_INFO("Closing COM port, handle = %d", (int)hComm); if (hComm != INVALID_HANDLE_VALUE) { if (restore_tio) bPortReady = SetCommTimeouts (hComm, &CommTimeoutsSaved); if (CloseHandle(hComm) == 0) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); } hComm = INVALID_HANDLE_VALUE; } return; } int Cserial::ReadData (unsigned char *buf, int nchars) { if (!hComm) return 0; DWORD dwRead = 0; if (ReadFile(hComm, buf, nchars, &dwRead, NULL)) return static_cast(dwRead); if (dwRead == 0) return 0; errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); return 0; } BOOL Cserial::ReadByte(unsigned char & by) { static BYTE byResByte[2]; if (ReadData(byResByte, 1) == 1) { by = byResByte[0]; return true; } return false; } void Cserial::FlushBuffer() { unsigned char c; while (ReadByte(c) == true); } /////////////////////////////////////////////////////// // Function name : Cserial::WriteByte // Description : Writes a Byte to teh selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// BOOL Cserial::WriteByte(UCHAR by) { if (!hComm) return FALSE; nBytesWritten = 0; if (WriteFile(hComm,&by,1,&nBytesWritten,NULL)==0) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); return FALSE; } return TRUE; } /////////////////////////////////////////////////////// // Function name : Cserial::WriteBuffer // Description : Writes a string to the selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// int Cserial::WriteBuffer(unsigned char *buff, int n) { if (!hComm) return 0; if (WriteFile (hComm, buff, n, &nBytesWritten, NULL) == 0) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); return 0; } return nBytesWritten; } /////////////////////////////////////////////////////// // Function name : Cserial::SetCommunicationTimeouts // Description : Sets the timeout for the selected port // Return type : BOOL // Argument : DWORD ReadIntervalTimeout // Argument : DWORD ReadTotalTimeoutMultiplier // Argument : DWORD ReadTotalTimeoutConstant // Argument : DWORD WriteTotalTimeoutMultiplier // Argument : DWORD WriteTotalTimeoutConstant /////////////////////////////////////////////////////// BOOL Cserial::SetCommunicationTimeouts( DWORD ReadIntervalTimeout, // msec DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant ) { CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout; CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier; CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant; CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant; CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier; LOG_DEBUG("\n\ Read Interval Timeout............... %8ld %8ld\n\ Read Total Timeout Multiplier....... %8ld %8ld\n\ Read Total Timeout Constant Timeout. %8ld %8ld\n\ Write Total Timeout Constant........ %8ld %8ld\n\ Write Total Timeout Multiplier...... %8ld %8ld", CommTimeoutsSaved.ReadIntervalTimeout, CommTimeouts.ReadIntervalTimeout, CommTimeoutsSaved.ReadTotalTimeoutMultiplier, CommTimeouts.ReadTotalTimeoutMultiplier, CommTimeoutsSaved.ReadTotalTimeoutConstant, CommTimeouts.ReadTotalTimeoutConstant, CommTimeoutsSaved.WriteTotalTimeoutConstant, CommTimeouts.WriteTotalTimeoutConstant, CommTimeoutsSaved.WriteTotalTimeoutMultiplier, CommTimeouts.WriteTotalTimeoutMultiplier); bPortReady = SetCommTimeouts (hComm, &CommTimeouts); if(bPortReady ==0) { LOG_PERROR(win_error_string(GetLastError()).c_str()); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } return TRUE; } /* * ReadIntervalTimeout * * The maximum time allowed to elapse between the arrival of two bytes on the * communications line, in milliseconds. During a ReadFile operation, the time * period begins when the first byte is received. If the interval between the * arrival of any two bytes exceeds this amount, the ReadFile operation is * completed and any buffered data is returned. A value of zero indicates that * interval time-outs are not used. * * A value of MAXDWORD, combined with zero values for both the * ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies * that the read operation is to return immediately with the bytes that have * already been received, even if no bytes have been received. * * ReadTotalTimeoutMultiplier * * The multiplier used to calculate the total time-out period for read * operations, in milliseconds. For each read operation, this value is * multiplied by the requested number of bytes to be read. * * ReadTotalTimeoutConstant * * A constant used to calculate the total time-out period for read operations, * in milliseconds. For each read operation, this value is added to the product * of the ReadTotalTimeoutMultiplier member and the requested number of bytes. * * A value of zero for both the ReadTotalTimeoutMultiplier and * ReadTotalTimeoutConstant members indicates that total time-outs are not * used for read operations. * * WriteTotalTimeoutMultiplier * * The multiplier used to calculate the total time-out period for write * operations, in milliseconds. For each write operation, this value is * multiplied by the number of bytes to be written. * * WriteTotalTimeoutConstant * * A constant used to calculate the total time-out period for write operations, * in milliseconds. For each write operation, this value is added to the product * of the WriteTotalTimeoutMultiplier member and the number of bytes to be * written. * * A value of zero for both the WriteTotalTimeoutMultiplier and * WriteTotalTimeoutConstant members indicates that total time-outs are not * used for write operations. * * Remarks * * If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to * MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and * less than MAXDWORD, one of the following occurs when the ReadFile function * is called: * * If there are any bytes in the input buffer, ReadFile returns immediately * with the bytes in the buffer. * * If there are no bytes in the input buffer, ReadFile waits until a byte * arrives and then returns immediately. * * If no bytes arrive within the time specified by ReadTotalTimeoutConstant, * ReadFile times out. */ BOOL Cserial::SetCommTimeout() { return SetCommunicationTimeouts ( MAXDWORD, // Read Interval Timeout MAXDWORD, // Read Total Timeout Multiplier 10, // Read Total Timeout Constant 50, // Write Total Timeout Constant 5 // Write Total Timeout Multiplier ); } /////////////////////////////////////////////////////// // Function name : ConfigurePort // Description : Configures the Port // Return type : BOOL // Argument : DWORD BaudRate // Argument : BYTE ByteSize // Argument : DWORD fParity // Argument : BYTE Parity // Argument : BYTE StopBits /////////////////////////////////////////////////////// BOOL Cserial::ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD dwParity, BYTE Parity, BYTE StopBits) { if((bPortReady = GetCommState(hComm, &dcb))==0) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } LOG_INFO("\n\ Get Comm State:\n\ DCB.DCBlength %d\n\ DCB.Baudrate %d\n\ DCB.ByteSize %d\n\ DCB.Parity %d\n\ DCB.StopBits %d\n\ DCB.Binary %d\n\ DCB.fDtrControl %d\n\ DCB.fRtsControl %d\n\ DCB.fDsrSensitivity %d\n\ DCB.fParity %d\n\ DCB.fOutX %d\n\ DCB.fInX %d\n\ DCB.fNull %d\n\ DCB.XonChar %d\n\ DCB.XoffChar %d\n\ DCB.fAbortOnError %d\n\ DCB.fOutxCtsFlow %d\n\ DCB.fOutxDsrFlow %d\n", (int)dcb.DCBlength, (int)dcb.BaudRate, (int)dcb.ByteSize, (int)dcb.Parity, (int)dcb.StopBits, (int)dcb.fBinary, (int)dcb.fDtrControl, (int)dcb.fRtsControl, (int)dcb.fDsrSensitivity, (int)dcb.fParity, (int)dcb.fOutX, (int)dcb.fInX, (int)dcb.fNull, (int)dcb.XonChar, (int)dcb.XoffChar, (int)dcb.fAbortOnError, (int)dcb.fOutxCtsFlow, (int)dcb.fOutxDsrFlow); dcb.BaudRate = BaudRate; dcb.ByteSize = ByteSize; dcb.Parity = Parity; dcb.StopBits = (StopBits == 1) ? 0 : 2; // dcb.fBinary = TRUE; // dcb.fDsrSensitivity = FALSE; // dcb.fParity = dwParity; // dcb.fOutX = FALSE; // dcb.fInX = FALSE; // dcb.fNull = FALSE; // dcb.fAbortOnError = TRUE; // dcb.fOutxCtsFlow = FALSE; // dcb.fOutxDsrFlow = FALSE; if (dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; else dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = FALSE; if (rtscts) dcb.fRtsControl = RTS_CONTROL_ENABLE; else { if (rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; else dcb.fRtsControl = RTS_CONTROL_DISABLE; } LOG_INFO("\n\ Set Comm State:\n\ DCB.DCBlength %d\n\ DCB.Baudrate %d\n\ DCB.ByteSize %d\n\ DCB.Parity %d\n\ DCB.StopBits %d\n\ DCB.Binary %d\n\ DCB.fDtrControl %d\n\ DCB.fRtsControl %d\n\ DCB.fDsrSensitivity %d\n\ DCB.fParity %d\n\ DCB.fOutX %d\n\ DCB.fInX %d\n\ DCB.fNull %d\n\ DCB.XonChar %d\n\ DCB.XoffChar %d\n\ DCB.fAbortOnError %d\n\ DCB.fOutxCtsFlow %d\n\ DCB.fOutxDsrFlow %d\n", (int)dcb.DCBlength, (int)dcb.BaudRate, (int)dcb.ByteSize, (int)dcb.Parity, (int)dcb.StopBits, (int)dcb.fBinary, (int)dcb.fDtrControl, (int)dcb.fRtsControl, (int)dcb.fDsrSensitivity, (int)dcb.fParity, (int)dcb.fOutX, (int)dcb.fInX, (int)dcb.fNull, (int)dcb.XonChar, (int)dcb.XoffChar, (int)dcb.fAbortOnError, (int)dcb.fOutxCtsFlow, (int)dcb.fOutxDsrFlow); bPortReady = SetCommState(hComm, &dcb); if(bPortReady == 0) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } if ( (bPortReady = GetCommTimeouts (hComm, &CommTimeoutsSaved) ) == 0) return FALSE; return SetCommTimeout(); } /////////////////////////////////////////////////////// // Function name : Cserial::setPTT // Return type : void /////////////////////////////////////////////////////// void Cserial::SetPTT(bool b) { if ( !(dtrptt || rtsptt) ) return; if(hComm == INVALID_HANDLE_VALUE) { LOG_PERROR("Invalid handle"); return; } LOG_DEBUG("PTT = %d, DTRptt = %d, DTR = %d, RTSptt = %d, RTS = %d", b, dtrptt, dtr, rtsptt, rts); if (b == true) { // ptt enabled if (dtrptt && dtr) dcb.fDtrControl = DTR_CONTROL_DISABLE; if (dtrptt && !dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; if (rtscts == false) { if (rtsptt && rts) dcb.fRtsControl = RTS_CONTROL_DISABLE; if (rtsptt && !rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; } } else { // ptt disabled if (dtrptt && dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; if (dtrptt && !dtr) dcb.fDtrControl = DTR_CONTROL_DISABLE; if (rtscts == false) { if (rtsptt && rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; if (rtsptt && !rts) dcb.fRtsControl = RTS_CONTROL_DISABLE; } } SetCommState(hComm, &dcb); } //====================================================================== // end Win32 code //====================================================================== #endif //__MINGW32__ #ifdef __WOE32__ #include #include "re.h" // convert COMx to /dev/ttySy with y = x - 1 void com_to_tty(string& port) { re_t re("com([0-9]+)", REG_EXTENDED | REG_ICASE); if (!(re.match(port.c_str()) && re.nsub() == 2)) return; stringstream ss; int n; ss << re.submatch(1); ss >> n; if (--n < 0) n = 0; ss.clear(); ss.str(""); ss << "/dev/ttyS" << n; ss.seekp(0); port = ss.str(); } // convert /dev/ttySx to COMy with y = x + 1 void tty_to_com(string& port) { re_t re("/dev/tty.([0-9]+)", REG_EXTENDED | REG_ICASE); if (!(re.match(port.c_str()) && re.nsub() == 2)) return; stringstream ss; int n; ss << re.submatch(1); ss >> n; ss.clear(); ss.str(""); ss << "COM" << n + 1; ss.seekp(0); port = ss.str(); } #endif fldigi-4.1.06/src/rigcontrol/norig.cxx0000664000175000017500000000500013507402064014572 00000000000000// ---------------------------------------------------------------------------- // norig.cxx // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #ifdef RIGCATTEST #include "rigCAT.h" #else #include "fl_digi.h" #include "misc.h" #include "configuration.h" #endif #include "rigsupport.h" #include "rigxml.h" #include "trx.h" #include "serial.h" #include "rigio.h" #include "debug.h" #include "threads.h" #include "qrunner.h" #include "confdialog.h" #include "status.h" //---------------------------------------------------------------------- // functions used when no xcvr control is in use //---------------------------------------------------------------------- long long noCAT_getfreq() { return progStatus.noCATfreq; } void noCAT_setfreq(long long f) { progStatus.noCATfreq = f; wf->rfcarrier(f); } std::string noCAT_getmode() { return progStatus.noCATmode; } void noCAT_setmode(const std::string &md) { progStatus.noCATmode = md; if (ModeIsLSB(md)) wf->USB(false); else wf->USB(true); } std::string noCAT_getwidth() { return progStatus.noCATwidth; } void noCAT_setwidth(const std::string &w) { progStatus.noCATwidth = w; show_bw(w); } void noCAT_setPTT(bool val) { rigio.SetPTT(val); // always execute the h/w ptt if enabled } void noCAT_init() { qso_setFreq(progStatus.noCATfreq); wf->rfcarrier(progStatus.noCATfreq); init_NoRig_RigDialog(); qso_opMODE->value(progStatus.noCATmode.c_str()); chkUSEHAMLIB->value(0); chkUSEHAMLIB->redraw(); btnInitHAMLIB->labelcolor(FL_BLACK); btnInitHAMLIB->redraw_label(); chkUSERIGCAT->value(0); chkUSERIGCAT->redraw(); btnInitRIGCAT->labelcolor(FL_BLACK); btnInitRIGCAT->redraw_label(); return; } fldigi-4.1.06/src/rigcontrol/rigclass.cxx0000644000175000017500000001206313472116000015261 00000000000000// ---------------------------------------------------------------------------- // rigclass.cxx // // Hamlib C++ interface is a frontend implementing wrapper functions // to the hamlib library // // derived from rigclass.cc distributed with hamlib // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "rigclass.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); #define NUMTRIES 5 using namespace std; Rig::Rig() : rig(0) { } Rig::Rig(rig_model_t rig_model) { rig = rig_init(rig_model); fnull = 3580.0; if (!rig) throw RigException ("Could not initialize rig"); } Rig::~Rig() { LOG_INFO("Rig destroy %p", rig); if (!rig) return; close(); } void Rig::init(rig_model_t rig_model) { close(); if ((rig = rig_init(rig_model)) == NULL) throw RigException ("Could not initialize rig"); LOG_INFO("Initialised rig model %d: %s", rig_model, getName()); } const char *Rig::getName() { return rig ? rig->caps->model_name : ""; } const struct rig_caps* Rig::getCaps(void) { return rig ? rig->caps : 0; } void Rig::open(void) { int err = rig_open(rig); if (err != RIG_OK) throw RigException(err); } void Rig::close(bool abort) { if (abort) rig = NULL; else if (rig) { rig_close(rig); rig_cleanup(rig); rig = NULL; } } bool Rig::canSetFreq() { if (!rig) return false; return (rig->caps->set_freq != NULL); } bool Rig::canGetFreq() { if (!rig) return false; return (rig->caps->get_freq != NULL); } bool Rig::canSetMode() { if (!rig) return false; return (rig->caps->set_mode != NULL); } bool Rig::canGetMode() { if (!rig) return false; return (rig->caps->get_mode != NULL); } bool Rig::canSetPTT() { if (!rig) return false; return (rig->caps->set_ptt != NULL); } bool Rig::canGetPTT() { if (!rig) return false; return (rig->caps->get_ptt != NULL); } void Rig::setFreq(freq_t freq, vfo_t vfo) { fnull = freq; if (!canSetFreq()) { // rig does not support set_freq return; } int err; for (int i = 0; i < NUMTRIES; i++) { err = rig_set_freq(rig, vfo, freq); if (err == RIG_OK) return; } throw RigException(err); } freq_t Rig::getFreq(vfo_t vfo) { if (!canGetFreq()) { // rig does not support get_freq return fnull; } freq_t freq = fnull; int i; for (i = 0; i < NUMTRIES; i++) if (rig_get_freq(rig, vfo, &freq) == RIG_OK) break; return freq; } void Rig::setMode(rmode_t mode, pbwidth_t width, vfo_t vfo) { if (!canSetMode()) throw RigException(RIG_ENAVAIL); int err; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_set_mode(rig, vfo, mode, width)) == RIG_OK) return; } throw RigException(err); } rmode_t Rig::getMode(pbwidth_t& width, vfo_t vfo) { if (!canGetMode()) throw RigException(RIG_ENAVAIL); int err; rmode_t mode; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_get_mode(rig, vfo, &mode, &width)) == RIG_OK) return mode; } throw RigException(err); } void Rig::setPTT(ptt_t ptt, vfo_t vfo) { if (!canSetPTT()) throw RigException(RIG_ENAVAIL); int err; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_set_ptt(rig, vfo, ptt)) == RIG_OK) return; } throw RigException(err); } ptt_t Rig::getPTT(vfo_t vfo) { if (!canGetPTT()) throw RigException(RIG_ENAVAIL); int err; ptt_t ptt; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_get_ptt(rig, vfo, &ptt)) == RIG_OK) return ptt; } throw RigException(err); } void Rig::setConf(token_t token, const char *val) { int err = rig_set_conf(rig, token, val); if (err != RIG_OK) throw RigException(err); } void Rig::setConf(const char *name, const char *val) { LOG_INFO("setting \"%s\" to \"%s\"", name, val); int err = rig_set_conf(rig, tokenLookup(name), val); if (err != RIG_OK) throw RigException(name, err); } void Rig::getConf(token_t token, char *val) { int err = rig_get_conf(rig, token, val); if (err != RIG_OK) throw RigException(err); } void Rig::getConf(const char *name, char *val) { int err = rig_get_conf(rig, tokenLookup(name), val); if (err != RIG_OK) throw RigException(name, err); } token_t Rig::tokenLookup(const char *name) { return rig_token_lookup(rig, name); } pbwidth_t Rig::passbandNormal (rmode_t mode) { return rig_passband_normal(rig, mode); } pbwidth_t Rig::passbandNarrow (rmode_t mode) { return rig_passband_narrow(rig, mode); } pbwidth_t Rig::passbandWide (rmode_t mode) { return rig_passband_wide(rig, mode); } fldigi-4.1.06/src/rigcontrol/rigsupport.cxx0000644000175000017500000003316513472116000015676 00000000000000// ---------------------------------------------------------------------------- // rigsupport.cxx - support functions file // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "rigsupport.h" #include "rigxml.h" #include "rigio.h" #include "threads.h" #include "main.h" #include "fl_digi.h" #include "trx.h" #include "configuration.h" #include "globals.h" #include "debug.h" #include "gettext.h" extern void n3fjp_set_freq(long); extern bool n3fjp_connected; LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; string windowTitle; vector freqlist; const unsigned char nfields = 5;//4; int fwidths[nfields]; enum { max_rfcarrier, max_rmode, max_mode, max_carrier }; #if !USE_HAMLIB typedef enum { RIG_MODE_NONE = 0, /*!< '' -- None */ RIG_MODE_AM = (1<<0), /*!< \c AM -- Amplitude Modulation */ RIG_MODE_CW = (1<<1), /*!< \c CW -- CW "normal" sideband */ RIG_MODE_USB = (1<<2), /*!< \c USB -- Upper Side Band */ RIG_MODE_LSB = (1<<3), /*!< \c LSB -- Lower Side Band */ RIG_MODE_RTTY = (1<<4), /*!< \c RTTY -- Radio Teletype */ RIG_MODE_FM = (1<<5), /*!< \c FM -- "narrow" band FM */ RIG_MODE_WFM = (1<<6), /*!< \c WFM -- broadcast wide FM */ RIG_MODE_CWR = (1<<7), /*!< \c CWR -- CW "reverse" sideband */ RIG_MODE_RTTYR = (1<<8), /*!< \c RTTYR -- RTTY "reverse" sideband */ RIG_MODE_AMS = (1<<9), /*!< \c AMS -- Amplitude Modulation Synchronous */ RIG_MODE_PKTLSB = (1<<10),/*!< \c PKTLSB -- Packet/Digital LSB mode (dedicated port) */ RIG_MODE_PKTUSB = (1<<11),/*!< \c PKTUSB -- Packet/Digital USB mode (dedicated port) */ RIG_MODE_PKTFM = (1<<12),/*!< \c PKTFM -- Packet/Digital FM mode (dedicated port) */ RIG_MODE_ECSSUSB = (1<<13),/*!< \c ECSSUSB -- Exalted Carrier Single Sideband USB */ RIG_MODE_ECSSLSB = (1<<14),/*!< \c ECSSLSB -- Exalted Carrier Single Sideband LSB */ RIG_MODE_FAX = (1<<15),/*!< \c FAX -- Facsimile Mode */ RIG_MODE_SAM = (1<<16),/*!< \c SAM -- Synchronous AM double sideband */ RIG_MODE_SAL = (1<<17),/*!< \c SAL -- Synchronous AM lower sideband */ RIG_MODE_SAH = (1<<18),/*!< \c SAH -- Synchronous AM upper (higher) sideband */ RIG_MODE_DSB = (1<<19), /*!< \c DSB -- Double sideband suppressed carrier */ } rmode_t; #endif struct rmode_name_t { rmode_t mode; const char *name; } modes[] = { { RIG_MODE_NONE, "NONE" }, { RIG_MODE_AM, "AM" }, { RIG_MODE_CW, "CW" }, { RIG_MODE_USB, "USB" }, { RIG_MODE_LSB, "LSB" }, { RIG_MODE_RTTY, "RTTY" }, { RIG_MODE_FM, "FM" }, { RIG_MODE_WFM, "WFM" }, { RIG_MODE_CWR, "CWR" }, { RIG_MODE_RTTYR, "RTTYR" }, { RIG_MODE_AMS, "AMS" }, { RIG_MODE_PKTLSB, "PKTLSB" }, { RIG_MODE_PKTUSB, "PKTUSB" }, { RIG_MODE_PKTFM, "PKTFM" } //, // C99 trailing commas in enumerations not yet in the C++ standard // { RIG_MODE_ECSSUSB, "ECSSUSB" }, // { RIG_MODE_ECSSLSB, "ECSSLSB" }, // { RIG_MODE_FAX, "FAX" } // the above are covered by our requirement that hamlib be >= 1.2.4 #if (defined(RIG_MODE_SAM) && defined(RIG_MODE_SAL) && defined(RIG_MODE_SAH)) , // C99 trailing commas in enumerations not yet in the C++ standard { RIG_MODE_SAM, "SAM" }, { RIG_MODE_SAL, "SAL" }, { RIG_MODE_SAH, "SAH" } #endif }; map mode_nums; map mode_names; void qso_selMode(rmode_t m) { qso_opMODE->value(mode_names[m].c_str()); } string modeString(rmode_t m) { return mode_names[m].c_str(); } void initOptionMenus() { qso_opMODE->clear(); list::iterator MD; list *pMD = 0; if (lmodes.empty() == false) pMD = &lmodes; else if (lmodeCMD.empty() == false) pMD = &lmodeCMD; //printf("initOptionMenus()\n"); if (pMD) { MD = pMD->begin(); while (MD != pMD->end()) { //printf("adding mode: %s\n", (*MD).SYMBOL.c_str()); qso_opMODE->add( (*MD).SYMBOL.c_str()); MD++; } qso_opMODE->activate(); qso_opMODE->index(0); } else { qso_opMODE->deactivate(); } qso_opBW->clear(); list::iterator bw; list *pBW = 0; if (lbws.empty() == false) pBW = &lbws; else if (lbwCMD.empty() == false) pBW = &lbwCMD; if (pBW) { bw = pBW->begin(); while (bw != pBW->end()) { //printf("adding BW: %s\n", (*bw).SYMBOL.c_str()); qso_opBW->add( (*bw).SYMBOL.c_str()); bw++; } qso_opBW->activate(); qso_opBW->index(0); } else { qso_opBW->deactivate(); } } void clearList() { freqlist.clear(); qso_opBrowser->clear(); } void updateSelect() { if (freqlist.empty()) return; for (size_t i = 0; i < freqlist.size(); i++) { qso_opBrowser->add(freqlist[i].str().c_str()); } } size_t updateList(long rf, int freq, string rmd, trx_mode md, string usage = "") { qrg_mode_t m; m.rmode = rmd; m.mode = md; m.rfcarrier = rf; m.carrier = freq; m.usage = usage; freqlist.push_back(m); sort(freqlist.begin(), freqlist.end()); vector::const_iterator pos = find(freqlist.begin(), freqlist.end(), m); if (pos != freqlist.end()) return pos - freqlist.begin(); else return 0; } size_t addtoList(long val) { qrg_mode_t m; m.rfcarrier = val; if (strlen(qso_opMODE->value())) m.rmode = qso_opMODE->value(); if (active_modem) { m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); } return updateList(val, m.carrier, m.rmode, m.mode); } bool readFreqList() { ifstream freqfile((HomeDir + "frequencies2.txt").c_str()); if (!freqfile) { LOG_ERROR("Could not open %s", (HomeDir + "frequencies2.txt").c_str()); return false; } string line; qrg_mode_t m; while (!getline(freqfile, line).eof()) { LOG_INFO("%s", line.c_str()); if (line[0] == '#') continue; istringstream is(line); is >> m; freqlist.push_back(m); } sort(freqlist.begin(), freqlist.end()); updateSelect(); freqfile.close(); return freqlist.size(); } void saveFreqList() { if (freqlist.empty()) return; ofstream freqfile((HomeDir + "frequencies2.txt").c_str()); if (!freqfile) { LOG_ERROR("Could not open %s", (HomeDir + "frequencies2.txt").c_str()); return; } freqfile << "# rfcarrier rig_mode carrier mode usage\n"; copy( freqlist.begin(), freqlist.end(), ostream_iterator(freqfile, "\n") ); freqfile.close(); } void build_frequencies2_list() { if (!freqlist.empty()) saveFreqList(); clearList(); // calculate the column widths memset(fwidths, 0, sizeof(fwidths)); // these need to be a little wider than fl_width thinks fwidths[max_rmode] = fwidths[max_mode] = fwidths[max_carrier] = fwidths[max_rfcarrier]= 15; fwidths[max_rfcarrier] += (int)ceil(fl_width("999999.999")); fwidths[max_rmode] += (int)ceil(fl_width("XXXXXX")); fwidths[max_carrier] += (int)ceil(fl_width("8888")); // find mode with longest shortname size_t s, smax = 0, mmax = 0; for (size_t i = 0; i < NUM_MODES; i++) { s = strlen(mode_info[i].sname); if (smax < s) { smax = s; mmax = i; } } fwidths[max_mode] += (int)ceil(fl_width(mode_info[mmax].sname)); if (readFreqList() == true) return; updateList (1807000L, 1000, "USB", MODE_PSK31 ); updateList (3505000L, 800, "USB", MODE_CW); updateList (3580000L, 1000, "USB", MODE_PSK31 ); updateList (1000500L, 800, "USB", MODE_CW); updateList (10135000L, 1000, "USB", MODE_PSK31 ); updateList (7005000L, 800, "USB", MODE_CW); updateList (7030000L, 1000, "USB", MODE_PSK31 ); updateList (7070000L, 1000, "USB", MODE_PSK31 ); updateList (14005000L, 800, "USB", MODE_CW); updateList (14070000L, 1000, "USB", MODE_PSK31 ); updateList (18100000L, 1000, "USB", MODE_PSK31 ); updateList (21005000L, 800, "USB", MODE_CW); updateList (21070000L, 1000, "USB", MODE_PSK31 ); updateList (24920000L, 1000, "USB", MODE_PSK31 ); updateList (28005000L, 800, "USB", MODE_CW); updateList (28120000, 1000, "USB", MODE_PSK31 ); updateSelect(); } int cb_qso_opMODE() { if (connected_to_flrig) { set_flrig_mode(qso_opMODE->value()); return 0; } #if USE_HAMLIB if (progdefaults.chkUSEHAMLIBis) hamlib_setmode(mode_nums[qso_opMODE->value()]); else #endif if (progdefaults.chkUSERIGCATis) rigCAT_setmode(qso_opMODE->value()); else noCAT_setmode(qso_opMODE->value()); return 0; } int cb_qso_opBW() { if (connected_to_flrig) set_flrig_bw(qso_opBW->index(), -1); else if (progdefaults.chkUSERIGCATis) rigCAT_setwidth(qso_opBW->value()); else noCAT_setwidth(qso_opBW->value()); return 0; } int cb_qso_btnBW1() { qso_btnBW1->hide(); qso_opBW1->hide(); qso_btnBW2->show(); qso_opBW2->show(); return 0; } int cb_qso_btnBW2() { qso_btnBW2->hide(); qso_opBW2->hide(); qso_btnBW1->show(); qso_opBW1->show(); return 0; } int cb_qso_opBW1() { //printf("opBW1 %d:%s\n", qso_opBW1->index(), qso_opBW1->value()); set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); return 0; } int cb_qso_opBW2() { //printf("opBW2 %d:%s\n", qso_opBW2->index(), qso_opBW2->value()); set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); return 0; } void sendFreq(long int f) { if (connected_to_flrig) set_flrig_freq(f); #if USE_HAMLIB else if (progdefaults.chkUSEHAMLIBis) hamlib_setfreq(f); #endif else if (progdefaults.chkUSERIGCATis) rigCAT_setfreq(f); else noCAT_setfreq(f); if (n3fjp_connected) n3fjp_set_freq(f); } void qso_movFreq(Fl_Widget* w, void *data) { cFreqControl *fc = (cFreqControl *)w; long int f; long restore = reinterpret_cast(data); f = fc->value(); if (fc == qsoFreqDisp1) { qsoFreqDisp2->value(f); qsoFreqDisp3->value(f); } else if (fc == qsoFreqDisp2) { qsoFreqDisp1->value(f); qsoFreqDisp3->value(f); } else { qsoFreqDisp1->value(f); qsoFreqDisp2->value(f); } sendFreq(f); if (restore == 1) restoreFocus(); return; } void qso_selectFreq(long int rfcarrier, int carrier) { if (rfcarrier > 0) { qsoFreqDisp1->value(rfcarrier); qsoFreqDisp2->value(rfcarrier); qsoFreqDisp3->value(rfcarrier); sendFreq(rfcarrier); } if (carrier > 0) { active_modem->set_freq(carrier); } } void qso_selectFreq() { int n = qso_opBrowser->value(); if (!n) return; n -= 1; // transceiver frequency if (freqlist[n].rfcarrier > 0) { qsoFreqDisp1->value(freqlist[n].rfcarrier); qsoFreqDisp2->value(freqlist[n].rfcarrier); qsoFreqDisp3->value(freqlist[n].rfcarrier); sendFreq(freqlist[n].rfcarrier); } // transceiver mode if (freqlist[n].rmode != "NONE") { qso_opMODE->value(freqlist[n].rmode.c_str()); cb_qso_opMODE(); } // modem type & audio sub carrier if (freqlist[n].mode != NUM_MODES) { if (freqlist[n].mode != active_modem->get_mode()) init_modem_sync(freqlist[n].mode); if (freqlist[n].carrier > 0) active_modem->set_freq(freqlist[n].carrier); } } void qso_setFreq(long int f) { // transceiver frequency if (f > 0) { qsoFreqDisp->value(f); sendFreq(f); } } void qso_setFreq() { int n = qso_opBrowser->value(); if (!n) return; n -= 1; // transceiver frequency qso_setFreq(freqlist[n].rfcarrier); } void qso_delFreq() { int v = qso_opBrowser->value() - 1; if (v >= 0) { freqlist.erase(freqlist.begin() + v); qso_opBrowser->remove(v + 1); } } void qso_addFreq() { long freq = qsoFreqDisp->value(); if (freq) { size_t pos = addtoList(freq); qso_opBrowser->insert(pos+1, freqlist[pos].str().c_str()); } } void qso_updateEntry(int i, std::string usage) { int v = i - 1; int sz = (int)freqlist.size(); if ((v >= 0) && (v < sz)) { freqlist[v].usage = usage; } } void setTitle() { update_main_title(); } bool init_Xml_RigDialog() { LOG_DEBUG("xml rig"); initOptionMenus(); xcvr_title = xmlrig.rigTitle; setTitle(); return true; } bool init_NoRig_RigDialog() { LOG_DEBUG("no rig"); qso_opBW->clear(); qso_opBW->add(" "); qso_opBW->index(0); qso_opBW->redraw(); qso_opBW->deactivate(); qso_opMODE->clear(); //printf("init_NoRig_RigDialog()\n"); for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { //printf("adding %s\n", modes[i].name); qso_opMODE->add(modes[i].name); } // list of LSB type modes that various xcvrs report via flrig LSBmodes.clear(); LSBmodes.push_back("LSB"); LSBmodes.push_back("LSB-D"); LSBmodes.push_back("LSB-D1"); LSBmodes.push_back("LSB-D2"); LSBmodes.push_back("LSB-D3"); LSBmodes.push_back("CW"); LSBmodes.push_back("LCW"); LSBmodes.push_back("CW-N"); LSBmodes.push_back("CWL"); LSBmodes.push_back("RTTY"); LSBmodes.push_back("RTTY-L"); LSBmodes.push_back("PKTLSB"); LSBmodes.push_back("PKT-L"); LSBmodes.push_back("USER-L"); LSBmodes.push_back("DATA-L"); LSBmodes.push_back("DATA"); LSBmodes.push_back("D-LSB"); qso_opMODE->index(3); qso_opMODE->activate(); xcvr_title.clear(); setTitle(); return true; } #if USE_HAMLIB bool init_Hamlib_RigDialog() { LOG_DEBUG("hamlib"); qso_opBW->deactivate(); qso_opMODE->clear(); for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { mode_nums[modes[i].name] = modes[i].mode; mode_names[modes[i].mode] = modes[i].name; qso_opMODE->add(modes[i].name); } xcvr_title = "Hamlib "; xcvr_title.append(xcvr->getName()); setTitle(); return true; } #endif fldigi-4.1.06/src/rigcontrol/ptt.cxx0000644000175000017500000004544013472116000014266 00000000000000// ---------------------------------------------------------------------------- // // ptt.cxx -- PTT control // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Diane Bruce, VA3DB // // Added gpio for PTT (Lior KK6BWA) // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if HAVE_SYS_SELECT_H # include #endif #include #include #if HAVE_SYS_IOCTL_H # include #endif #if HAVE_TERMIOS_H # include #endif #include #include #include #include "trx.h" #include "ptt.h" #include "configuration.h" #include "rigio.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "serial.h" #include "re.h" #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "n3fjp_logger.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; PTT::PTT(ptt_t dev) : pttdev(PTT_INVALID), oldtio(0) { reset(dev); } PTT::~PTT() { close_all(); } void PTT::reset(ptt_t dev) { close_all(); // LOG_VERBOSE("Setting PTT to %d", dev); switch (pttdev = dev) { #if HAVE_UHROUTER case PTT_UHROUTER: if (progdefaults.PTTdev.find(UHROUTER_FIFO_PREFIX) == 0) { pttdev = PTT_UHROUTER; open_uhrouter(); break; } else { pttdev = PTT_NONE; break; } #endif #if HAVE_PARPORT case PTT_PARPORT: open_parport(); if (pttfd < 0) pttdev = PTT_NONE; break; #endif case PTT_TTY: open_tty(); break; default: break; // nothing to open } open_gpio(); set(false); } void PTT::set(bool ptt) { // add milliseconds - no audio to clear virtual audio card used by Flex systems if (!ptt && progdefaults.PTT_off_delay) MilliSleep(progdefaults.PTT_off_delay); if (active_modem == cw_modem && ((progdefaults.useCWkeylineRTS) || progdefaults.useCWkeylineDTR == true)) return; //{ // uncomment block for debugging // string sport = // pttdev == PTT_NONE ? "NONE" : // pttdev == PTT_HAMLIB ? "HAMLIB" : // pttdev == PTT_RIGCAT ? "RIGCAT" : // pttdev == PTT_TTY ? "TTY" : // pttdev == PTT_GPIO ? "GPIO" : // pttdev == PTT_PARPORT ? "PARPORT" : // pttdev == PTT_UHROUTER ? "UHROUTER" : "UNKNOWN"; // LOG_INFO("PTT via %s : %s", sport.c_str(), ptt ? "ON" : "OFF"); //} switch (pttdev) { case PTT_NONE: default: noCAT_setPTT(ptt); break; #if USE_HAMLIB case PTT_HAMLIB: hamlib_set_ptt(ptt); break; #endif case PTT_RIGCAT: rigCAT_set_ptt(ptt); break; case PTT_TTY: set_tty(ptt); break; #if HAVE_PARPORT case PTT_PARPORT: set_parport(ptt); break; #else btnUsePPortPTT->hide(); #endif #if HAVE_UHROUTER case PTT_UHROUTER: set_uhrouter(ptt); break; #endif } set_gpio(ptt); nano_PTT(ptt); if (n3fjp_connected) n3fjp_set_ptt(ptt); if (ptt && progdefaults.PTT_on_delay) MilliSleep(progdefaults.PTT_on_delay); if (ptt) start_tx_timer(); else stop_tx_timer(); } void PTT::close_all(void) { set(false); switch (pttdev) { case PTT_TTY: close_tty(); break; #if HAVE_PARPORT case PTT_PARPORT: close_parport(); break; #endif #if HAVE_UHROUTER case PTT_UHROUTER: close_uhrouter(); break; #endif default: break; } close_gpio(); pttfd = -1; } //-------------------- gpio port PTT --------------------// #ifndef __MINGW32__ static void gpioEXEC(std::string execstr) { int pfd[2]; if (pipe(pfd) == -1) { LOG_PERROR("pipe"); return; } pid_t pid; switch (pid = fork()) { case -1: LOG_PERROR("fork"); return; case 0: // child close(pfd[0]); if (dup2(pfd[1], STDOUT_FILENO) != STDOUT_FILENO) { LOG_PERROR("dup2"); exit(EXIT_FAILURE); } close(pfd[1]); execl("/bin/sh", "sh", "-c", execstr.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } // parent close(pfd[1]); } #else // !__MINGW32__ static void gpioEXEC(std::string execstr) { char* cmd = strdup(execstr.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); } #endif // !__MINGW32__ static const char *gpio_name[] = { "17", "18", "27", "22", "23", "24", "25", "4", "5", "6", "13", "19", "26", "12", "16", "20", "21"}; void export_gpio(int bcm) { if (bcm < 0 || bcm > 16) return; string exec_str = "gpio export "; exec_str.append(gpio_name[bcm]).append(" out"); gpioEXEC(exec_str); LOG_INFO("%s", exec_str.c_str()); } void unexport_gpio(int bcm) { if (bcm < 0 || bcm > 16) return; string exec_str = "gpio unexport "; exec_str.append(gpio_name[bcm]); gpioEXEC(exec_str); LOG_INFO("%s", exec_str.c_str()); } void PTT::open_gpio(void) { bool enabled = false; for (int i = 0; i < 17; i++) { enabled = (progdefaults.enable_gpio >> i) & 0x01; if (enabled) export_gpio(i); } } void PTT::close_gpio(void) { bool enabled = false; for (int i = 0; i < 17; i++) { enabled = (progdefaults.enable_gpio >> i) & 0x01; if (enabled) unexport_gpio(i); } } void PTT::set_gpio(bool ptt) { #define VALUE_MAX 30 static const char s_values_str[] = "01"; string portname = "/sys/class/gpio/gpio"; string ctrlport; bool enabled = false; int val = 0; int fd; for (int i = 0; i < 17; i++) { enabled = (progdefaults.enable_gpio >> i) & 0x01; if (enabled) { val = (progdefaults.gpio_on >> i) & 0x01; ctrlport = portname; ctrlport.append(gpio_name[i]); ctrlport.append("/value"); fd = fl_open(ctrlport.c_str(), O_WRONLY); bool ok = false; if (fd == -1) { LOG_ERROR("Failed to open gpio (%s) for writing!", ctrlport.c_str()); } else { if (progdefaults.gpio_pulse_width == 0) { if (ptt) { if (val == 1) val = 1; else val = 0;} if (!ptt) { if (val == 1) val = 0; else val = 1;} if (write(fd, &s_values_str[val], 1) == 1) ok = true; } else { if (write(fd, &s_values_str[val], 1) == 1) { MilliSleep(progdefaults.gpio_pulse_width); if (write(fd, &s_values_str[val == 0 ? 1 : 0], 1) == 1) ok = true; } } if (ok) LOG_INFO("Set GPIO ptt on %s %s%s", ctrlport.c_str(), (progdefaults.gpio_pulse_width > 0) ? "pulsed " : "", (val == 1 ? "HIGH" : "LOW") ); else LOG_ERROR("Failed to write value!"); close(fd); } } } } //-------------------- serial port PTT --------------------// void PTT::open_tty(void) { #ifdef __MINGW32__ serPort.Baud(progdefaults.BaudRate(progdefaults.XmlRigBaudrate)); serPort.Device(progdefaults.PTTdev); serPort.RTS(progdefaults.RTSplus); serPort.DTR(progdefaults.DTRplus); serPort.RTSptt(progdefaults.RTSptt); serPort.DTRptt(progdefaults.DTRptt); if (progdefaults.SCU_17) serPort.Stopbits(1); else serPort.Stopbits(2); if (serPort.OpenPort() == false) { LOG_ERROR("Cannot open serial port %s", rigio.Device().c_str()); pttfd = -1; return; } // pttfd = -1; // just a dummy return for this implementation LOG_INFO("Serial port %s open", progdefaults.PTTdev.c_str()); #else # if HAVE_TTYPORT string pttdevName = progdefaults.PTTdev; # ifdef __CYGWIN__ // convert to Linux serial port naming com_to_tty(pttdevName); # endif int oflags = O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((pttfd = fl_open(pttdevName.c_str(), oflags)) < 0) { LOG_ERROR("Could not open \"%s\": %s", pttdevName.c_str(), strerror(errno)); return; } oldtio = new struct termios; tcgetattr(pttfd, oldtio); int status; ioctl(pttfd, TIOCMGET, &status); if (progdefaults.RTSplus) status |= TIOCM_RTS; // set RTS bit else status &= ~TIOCM_RTS; // clear RTS bit if (progdefaults.DTRplus) status |= TIOCM_DTR; // set DTR bit else status &= ~TIOCM_DTR; // clear DTR bit ioctl(pttfd, TIOCMSET, &status); LOG_DEBUG("Serial port %s open; status = %02X, %s", progdefaults.PTTdev.c_str(), status, uint2bin(status, 8)); # endif // HAVE_TTYPORT #endif // __MINGW32__ } void PTT::close_tty(void) { #ifdef __MINGW32__ serPort.ClosePort(); LOG_DEBUG("Serial port %s closed", progdefaults.PTTdev.c_str()); #else # if HAVE_TTYPORT if (pttfd >= 0) { tcsetattr(pttfd, TCSANOW, oldtio); close(pttfd); } delete oldtio; pttfd = -1; # endif // HAVE_TTYPORT #endif // __MINGW32__ } void PTT::set_tty(bool ptt) { #ifdef __MINGW32__ serPort.SetPTT(ptt); #else # if HAVE_TTYPORT if (pttfd == -1){ LOG_ERROR("PTT::set_tty pttfd = -1. error."); return; } static int status; int retval = ioctl(pttfd, TIOCMGET, &status); if (retval != 0) { LOG_ERROR("ioctl error return %d, %s", errno, strerror(errno)); close_tty(); } if (ptt) { if (progdefaults.RTSptt == true && progdefaults.RTSplus == false) status |= TIOCM_RTS; if (progdefaults.RTSptt == true && progdefaults.RTSplus == true) status &= ~TIOCM_RTS; if (progdefaults.DTRptt == true && progdefaults.DTRplus == false) status |= TIOCM_DTR; if (progdefaults.DTRptt == true && progdefaults.DTRplus == true) status &= ~TIOCM_DTR; } else { if (progdefaults.RTSptt == true && progdefaults.RTSplus == false) status &= ~TIOCM_RTS; if (progdefaults.RTSptt == true && progdefaults.RTSplus == true) status |= TIOCM_RTS; if (progdefaults.DTRptt == true && progdefaults.DTRplus == false) status &= ~TIOCM_DTR; if (progdefaults.DTRptt == true && progdefaults.DTRplus == true) status |= TIOCM_DTR; } LOG_DEBUG("Status %02X, %s", status & 0xFF, uint2bin(status, 8)); retval = ioctl(pttfd, TIOCMSET, &status); if (retval != 0) { LOG_ERROR("ioctl error return %d, %s", errno, strerror(errno)); close_tty(); } # endif // HAVE_TTYPORT #endif // __MINGW32__ } #if HAVE_PARPORT //-------------------- parallel port PTT --------------------// #if HAVE_LINUX_PPDEV_H # include # include #elif HAVE_DEV_PPBUS_PPI_H # include # include #endif void PTT::open_parport(void) { if (progdefaults.PTTdev.find("tty") != string::npos) return; int oflags = O_RDWR | O_NDELAY; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((pttfd = fl_open(progdefaults.PTTdev.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", progdefaults.PTTdev.c_str(), strerror(errno)); return; } bool isparport = false; struct stat st; int status; #if HAVE_LINUX_PPDEV_H // Linux (ppdev) isparport = (fstat(pttfd, &st) == 0 && S_ISCHR(st.st_mode) && ioctl(pttfd, PPGETMODE, &status) != -1); #elif HAVE_DEV_PPBUS_PPI_H // FreeBSD (ppbus/ppi) */ isparport = (fstat(pttfd, &st) == 0 && S_ISCHR(st.st_mode) && ioctl(pttfd, PPISSTATUS, &status) != -1); #else // Fallback (nothing) isparport = false; #endif if (!isparport) { LOG_VERBOSE("%s: not a supported parallel port device", progdefaults.PTTdev.c_str()); close_parport(); pttfd = -1; } } void PTT::close_parport(void) { close(pttfd); } void PTT::set_parport(bool ptt) { #ifdef HAVE_LINUX_PPDEV_H struct ppdev_frob_struct frob; frob.mask = PARPORT_CONTROL_INIT; frob.val = !ptt; ioctl(pttfd, PPFCONTROL, &frob); #elif HAVE_DEV_PPBUS_PPI_H u_int8_t val; ioctl(pttfd, PPIGCTRL, &val); if (ptt) val |= nINIT; else val &= ~nINIT; ioctl(pttfd, PPISCTRL, &val); #endif } #endif // HAVE_PARPORT #if HAVE_UHROUTER //-------------------- uhRouter PTT --------------------// // See interface documentation at: // http://homepage.mac.com/chen/w7ay/Router/Contents/routerInterface.html #define FUNCTIONMASK 0x1f #define ROUTERFUNCTION 0x80 #define OPENMICROKEYER (ROUTERFUNCTION + 0x01) // get a port to the microKEYER router #define OPENCWKEYER (ROUTERFUNCTION + 0x02) // get a port to the CW KEYER router #define OPENDIGIKEYER (ROUTERFUNCTION + 0x03) // get a port to the DIGI KEYER router #define QUITIFNOKEYER (ROUTERFUNCTION + 0x1f) // quit if there are no keyers #define QUITIFNOTINUSE (ROUTERFUNCTION + 0x1e) // quit if not connected #define QUITALWAYS (ROUTERFUNCTION + 0x1d) // quit #define CLOSEKEYER (ROUTERFUNCTION + FUNCTIONMASK) #define KEYERFUNCTION 0x40 #define OPENPTT (KEYERFUNCTION + 0x04) // get a port to the PTT flag bit #ifndef PATH_MAX # define PATH_MAX 1024 #endif static ssize_t tm_read(int fd, void* buf, size_t len, const struct timeval* to) { fd_set s; FD_ZERO(&s); FD_SET(fd, &s); struct timeval t; memcpy(&t, to, sizeof(t)); ssize_t n; if ((n = select(fd + 1, &s, 0, 0, &t)) != 1) return n; return read(fd, buf, len); } static ssize_t tm_write(int fd, const void* buf, size_t len, const struct timeval* to) { fd_set s; FD_ZERO(&s); FD_SET(fd, &s); struct timeval t; memcpy(&t, to, sizeof(t)); ssize_t n; if ((n = select(fd + 1, 0, &s, 0, &t)) != 1) return n; return write(fd, buf, len); } static bool open_fifos(const char* base, int fd[2]) { struct stat st; string fifo = base; size_t len = fifo.length(); fifo += "Read"; if (stat(fifo.c_str(), &st) == -1 || !S_ISFIFO(st.st_mode)) { LOG_ERROR("%s is not a fifo", fifo.c_str()); return false; } int oflags = O_RDONLY | O_NONBLOCK; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd[0] = fl_open(fifo.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", fifo.c_str(), strerror(errno)); return false; } fifo.erase(len); fifo += "Write"; if (stat(fifo.c_str(), &st) == -1 || !S_ISFIFO(st.st_mode)) { LOG_ERROR("%s is not a fifo", fifo.c_str()); return false; } oflags = O_WRONLY | O_NONBLOCK; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd[1] = fl_open(fifo.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", fifo.c_str(), strerror(errno)); return false; } return true; } static bool get_fifos(const int fd[2], const unsigned char* msg, size_t msglen, char* base, size_t baselen) { struct timeval to = { 2, 0 }; if (tm_write(fd[1], msg, msglen, &to) < (ssize_t)msglen) { LOG_PERROR("Could not write request"); return false; } ssize_t r; if ((r = tm_read(fd[0], base, baselen-1, &to)) <= 0) { LOG_PERROR("Could not read FIFO name"); return false; } base[r] = '\0'; return true; } #ifdef __APPLE__ #include #include #include #endif static bool start_uhrouter(void) { bool found = false; #ifdef __APPLE__ FILE *fd = (FILE *)0; std::string appPath; std::string buffer; appPath.assign("/Applications/µH Router.app/Contents/MacOS/µH Router"); fd = fl_fopen(appPath.c_str(), "r"); if(fd) { found = true; fclose(fd); } if(found) { buffer.clear(); buffer.assign("\""); buffer.append(appPath); buffer.append("\" & "); system(buffer.c_str()); } else { LOG_ERROR("File: /Applications/\265H Router.app Not Found!"); } #endif // __APPLE__ return found; } void PTT::open_uhrouter(void) { struct { unsigned char keyer; const char* name; const char* abbrev; } keyers[] = { { OPENMICROKEYER, "microKeyer", "MK" }, { OPENCWKEYER, "CWKeyer", "CK" }, { OPENDIGIKEYER, "DigiKeyer", "DK" } }; size_t start = 0, end = sizeof(keyers)/sizeof(*keyers); // If the device string is something like /tmp/microHamRouter/microKeyer, // or /tmp/microHamRouter/MK, try that keyer only. re_t keyer_re("^" UHROUTER_FIFO_PREFIX "/(.+)$", REG_EXTENDED); if (keyer_re.match(progdefaults.PTTdev.c_str()) && keyer_re.nsub() == 2) { const char* keyer = keyer_re.submatch(1).c_str(); // do we recognise this keyer name? for (size_t i = 0; i < sizeof(keyers)/sizeof(*keyers); i++) { if (!strcasecmp(keyers[i].name, keyer) || !strcasecmp(keyers[i].abbrev, keyer)) { start = i; end = start + 1; break; } } } LOG_VERBOSE("Will try %s", (start == end ? keyers[start].name : "all keyers")); int uhrfd[2]; uhrfd[0] = uhrfd[1] = uhkfd[0] = uhkfd[1] = uhfd[0] = uhfd[1] = -1; if (!open_fifos(UHROUTER_FIFO_PREFIX, uhrfd)) { // if we just started uhrouter we will retry open_fifos a few times unsigned retries = start_uhrouter() ? 30 : 0; while (retries-- && !open_fifos(UHROUTER_FIFO_PREFIX, uhrfd)) MilliSleep(100); if (uhrfd[0] == -1 || uhrfd[1] == -1) { LOG_ERROR("Could not open router"); return; } } char fifo_name[PATH_MAX]; size_t len = PATH_MAX - 8; memset(fifo_name, 0, sizeof(fifo_name)); for (size_t i = start; i < end; i++) { // open keyer if (!get_fifos(uhrfd, &keyers[i].keyer, 1, fifo_name, len) || *fifo_name == '\0') { LOG_VERBOSE("Keyer \"%s\" not found", keyers[i].name); continue; } // open ptt port if (!open_fifos(fifo_name, uhkfd)) { LOG_ERROR("Could not open keyer %s", keyers[i].name); continue; } LOG_VERBOSE("Opened keyer %s", keyers[i].name); unsigned char port = OPENPTT; if (!get_fifos(uhkfd, &port, 1, fifo_name, len)) { LOG_ERROR("Could not get PTT port"); continue; } if (!open_fifos(fifo_name, uhfd)) { LOG_ERROR("Could not open PTT port %s", fifo_name); continue; } LOG_VERBOSE("Successfully opened PTT port of keyer %s", keyers[i].name); break; } // close router FIFOs close(uhrfd[0]); close(uhrfd[1]); } void PTT::close_uhrouter(void) { close(uhfd[0]); close(uhfd[1]); unsigned char c = QUITIFNOTINUSE; write(uhkfd[1], &c, 1); close(uhkfd[0]); close(uhkfd[1]); } void PTT::set_uhrouter(bool ptt) { if (uhfd[0] == -1 || uhfd[1] == -1) return; unsigned char buf[_POSIX_PIPE_BUF]; // empty the fifo while (read(uhfd[0], buf, sizeof(buf)) > 0); // send command *buf = '0' + ptt; LOG_VERBOSE("Sending PTT=%uc", *buf); struct timeval t = { 2, 0 }; if (tm_write(uhfd[1], buf, 1, &t) != 1) { LOG_ERROR("Could not set PTT: %s", strerror(errno)); return; } // wait for status ssize_t n = tm_read(uhfd[0], buf, sizeof(buf), &t); switch (n) { case -1: LOG_PERROR("tm_read"); break; case 0: LOG_ERROR("No reply to PTT command within %jd seconds", (intmax_t)t.tv_sec); break; default: LOG_VERBOSE("Received \"%s\"", str2hex(buf, n)); // last received char should be '1'(?) break; } } #endif // HAVE_UHROUTER fldigi-4.1.06/src/rigcontrol/FreqControl.cxx0000664000175000017500000003650013507402064015723 00000000000000// ---------------------------------------------------------------------------- // Frequency Control Widget // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of flrig. // // flrig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "qrunner.h" #include "FreqControl.h" #include "gettext.h" #include "configuration.h" const char *cFreqControl::Label[10] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; void cFreqControl::IncFreq (int nbr) { double v = (double)val + (double)mult[nbr] * precision; if (v <= maxVal) val = (long int)v; updatevalue(); do_callback(); } void cFreqControl::DecFreq (int nbr) { double v = (double)val - (double)mult[nbr] * precision; if (v >= minVal) val = (long int)v; updatevalue(); do_callback(); } void cbSelectDigit (Fl_Widget *btn, void * nbr) { Fl_Button *b = (Fl_Button *)btn; int Nbr = (int)(reinterpret_cast (nbr)); cFreqControl *fc = (cFreqControl *)b->parent(); if (fc->hrd_buttons) { int yclick = Fl::event_y(); int fc_yc = fc->y() + fc->h()/2; if (yclick <= fc_yc) fc->IncFreq(Nbr); else fc->DecFreq(Nbr); } else { if (Fl::event_button1()) fc->IncFreq(Nbr); else if (Fl::event_button3()) fc->DecFreq(Nbr); } fc->redraw(); } cFreqControl::cFreqControl(int x, int y, int w, int h, const char *lbl): Fl_Group(x,y,w,h,"") { font_number = progdefaults.FreqControlFontnbr; ONCOLOR = FL_YELLOW; OFFCOLOR = FL_BLACK; SELCOLOR = fl_rgb_color(100, 100, 100); ILLUMCOLOR = FL_GREEN; oldval = val = 0; precision = 1; dpoint = 3; W = w; nD = atoi(lbl); if (nD > MAX_DIGITS) nD = MAX_DIGITS; if (nD < MIN_DIGITS) nD = MIN_DIGITS; bdr = 1; fcHeight = h - 2 * bdr; int fw, fh, ht = fcHeight; fl_font(font_number, ++ht); fh = fl_height();// + 1; while (fh > fcHeight) { ht--; fl_font(font_number, ht); fh = fl_height(); } fl_font(font_number, ht); fw = fl_width("9") + 2; pw = fw / 2; while( (nD * fw + pw) >= (W - 2*bdr)) { ht--; fl_font(font_number, ht); fw = fl_width("9") + 2; pw = fw / 2; } fh = fl_height(); wfill = (w - nD * fw - pw - 2*bdr) / 2; int wf2 = w - nD * fw - pw - 2*bdr - wfill; fcWidth = fw; fcTop = y + bdr; int xpos; box(FL_DOWN_BOX); color(OFFCOLOR); minVal = 0; double fmaxval = (pow(10.0, nD) - 1) * precision; long int UMAX = maximum(); if (fmaxval > UMAX) fmaxval = UMAX; maxVal = fmaxval; fmaxval /= 1000.0; static char tt[100]; snprintf(tt, sizeof(tt), "Enter frequency (max %.3f) or\nLeft/Right/Up/Down/Pg_Up/Pg_Down", fmaxval); tooltip(tt); hfill2 = new Fl_Box(x + w - bdr - wf2, fcTop, wf2, fcHeight, ""); hfill2->box(FL_FLAT_BOX); hfill2->labelcolor(ONCOLOR); hfill2->color(OFFCOLOR); xpos = x + w - bdr - wfill; for (int n = 0; n < 3; n++) { xpos -= fcWidth; Digit[n] = new Fl_Repeat_Button ( xpos, fcTop, fcWidth, fcHeight, " "); Digit[n]->box(FL_FLAT_BOX); Digit[n]->labelfont(font_number); Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR, SELCOLOR); Digit[n]->labelsize(fh); Digit[n]->callback(cbSelectDigit, reinterpret_cast(n)); if (n == 0) mult[n] = 1; else mult[n] = 10 * mult[n-1]; } xpos -= pw; decbx = new Fl_Box(xpos, fcTop, pw, fcHeight,"."); decbx->box(FL_FLAT_BOX); decbx->labelfont(font_number); decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); decbx->labelsize(fh); for (int n = 3; n < nD; n++) { xpos -= fcWidth; Digit[n] = new Fl_Repeat_Button ( xpos, fcTop, fcWidth, fcHeight, " "); Digit[n]->box(FL_FLAT_BOX); Digit[n]->labelfont(font_number); Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR, SELCOLOR); Digit[n]->labelsize(fh); Digit[n]->callback(cbSelectDigit, reinterpret_cast(n)); if (n == 0) mult[n] = 1; else mult[n] = 10 * mult[n-1]; } hfill1 = new Fl_Box(x + bdr, fcTop, Digit[nD-1]->x() - x - bdr, fcHeight, ""); hfill1->box(FL_FLAT_BOX); hfill1->labelcolor(ONCOLOR); hfill1->color(OFFCOLOR); cbFunc = NULL; end(); finp = new Fl_Float_Input(0, 0, 24,24);//1, 1); finp->callback(freq_input_cb, this); finp->when(FL_WHEN_CHANGED); parent()->remove(finp); precision = 1; hrd_buttons = true; enable_arrow_keys = false; } cFreqControl::~cFreqControl() { for (int i = 0; i < nD; i++) { delete Digit[i]; } delete finp; } void cFreqControl::updatevalue() { long int v = val / precision; int i; if (likely(v > 0L)) { for (i = 0; i < nD; i++) { Digit[i]->label(v == 0 ? "" : Label[v % 10]); v /= 10; } } else { for (i = 0; i < 4; i++) Digit[i]->label("0"); for (; i < nD; i++) Digit[i]->label(""); } decbx->label("."); decbx->redraw_label(); redraw(); } void cFreqControl::font(Fl_Font fnt) { font_number = fnt; set_ndigits(nD); updatevalue(); } void cFreqControl::SetONOFFCOLOR( Fl_Color ONcolor, Fl_Color OFFcolor) { OFFCOLOR = REVONCOLOR = OFFcolor; ONCOLOR = REVOFFCOLOR = ONcolor; for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR); Digit[n]->redraw(); Digit[n]->redraw_label(); } decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); decbx->redraw(); decbx->redraw_label(); hfill1->labelcolor(ONCOLOR); hfill1->color(OFFCOLOR); hfill1->redraw(); hfill1->redraw_label(); hfill2->labelcolor(ONCOLOR); hfill2->color(OFFCOLOR); hfill2->redraw(); hfill2->redraw_label(); color(OFFCOLOR); redraw(); } void cFreqControl::SetONCOLOR (uchar r, uchar g, uchar b) { ONCOLOR = fl_rgb_color (r, g, b); REVOFFCOLOR = ONCOLOR; for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR); Digit[n]->redraw(); Digit[n]->redraw_label(); } decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); decbx->redraw(); decbx->redraw_label(); hfill1->color(OFFCOLOR); hfill1->labelcolor(ONCOLOR); hfill1->redraw(); hfill1->redraw_label(); hfill2->labelcolor(ONCOLOR); hfill2->color(OFFCOLOR); hfill2->redraw(); hfill2->redraw_label(); color(OFFCOLOR); redraw(); } void cFreqControl::SetOFFCOLOR (uchar r, uchar g, uchar b) { OFFCOLOR = fl_rgb_color (r, g, b); REVONCOLOR = OFFCOLOR; for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR); } decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); decbx->redraw(); decbx->redraw_label(); hfill1->color(OFFCOLOR); hfill1->labelcolor(ONCOLOR); hfill1->redraw(); hfill1->redraw_label(); hfill2->labelcolor(ONCOLOR); hfill2->color(OFFCOLOR); hfill2->redraw(); hfill2->redraw_label(); color(OFFCOLOR); redraw(); } static void blink_point(Fl_Widget* w) { w->label(*w->label() ? "" : "."); Fl::add_timeout(0.2, (Fl_Timeout_Handler)blink_point, w); } void cFreqControl::value(long lv) { oldval = val = lv; Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); updatevalue(); } long int cFreqControl::maximum(void) { return (long int)(pow(2.0, 31) - 1); } void cFreqControl::restore_colors() { enable_arrow_keys = false; for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR); Digit[n]->redraw(); Digit[n]->redraw_label(); } decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); decbx->redraw(); decbx->redraw_label(); hfill1->labelcolor(ONCOLOR); hfill1->color(OFFCOLOR); hfill1->redraw(); hfill1->redraw_label(); hfill2->labelcolor(ONCOLOR); hfill2->color(OFFCOLOR); hfill2->redraw(); hfill2->redraw_label(); color(OFFCOLOR); redraw(); } void cFreqControl::reverse_colors() { enable_arrow_keys = true; for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(REVONCOLOR); Digit[n]->color(REVOFFCOLOR); Digit[n]->redraw(); Digit[n]->redraw_label(); } decbx->labelcolor(REVONCOLOR); decbx->color(REVOFFCOLOR); decbx->redraw(); decbx->redraw_label(); hfill1->labelcolor(REVONCOLOR); hfill1->color(REVOFFCOLOR); hfill1->redraw(); hfill1->redraw_label(); hfill2->labelcolor(REVONCOLOR); hfill2->color(REVOFFCOLOR); hfill2->redraw(); hfill2->redraw_label(); color(REVOFFCOLOR); redraw(); } #define KEEP_FOCUS (void *)0 #define LOSE_FOCUS (void *)1 void cFreqControl::cancel_kb_entry(void) { val = oldval; Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); updatevalue(); } int cFreqControl::handle(int event) { // static Fl_Widget* fw = NULL; int d; switch (event) { case FL_FOCUS: return 1; case FL_UNFOCUS: return 1; case FL_ENTER: // fw = Fl::focus(); // if (fw != NULL) // if NULL then fldigi did not have focus // take_focus(); break; case FL_LEAVE: // if (fw) // fw->take_focus(); // if (Fl::has_timeout((Fl_Timeout_Handler)blink_point, this)) // cancel_kb_entry(); // clear_focus(); // updatevalue(); // return 1; break; case FL_KEYBOARD: switch (d = Fl::event_key()) { case FL_Right: if (Fl::event_shift()) d = 100 * lsd; else d = lsd; val += d; updatevalue(); do_callback(); return 1; break; case FL_Left: if (Fl::event_shift()) d = -100 * lsd; else d = -1 * lsd; val += d; updatevalue(); do_callback(); return 1; break; case FL_Up: if (Fl::event_shift()) d = 1000 * lsd; else d = 10 * lsd; val += d; updatevalue(); do_callback(); return 1; break; case FL_Down: if (Fl::event_shift()) d = -1000 * lsd; else d = -10 * lsd; val += d; updatevalue(); do_callback(); return 1; break; default: if (Fl::event_ctrl()) { if (Fl::event_key() == 'v') { finp->handle(event); Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); return 1; } } if (Fl::has_timeout((Fl_Timeout_Handler)blink_point, decbx)) { if (d == FL_Escape) { cancel_kb_entry(); return 1; } else if (d == FL_Enter || d == FL_KP_Enter) { finp->position(finp->size()); finp->replace(finp->position(), finp->mark(), "\n", 1); clear_focus(); updatevalue(); do_callback(); return 1; } } else { if (d == FL_Escape && window() != Fl::first_window()) { window()->do_callback(); return 1; } else if (d == FL_Enter) { clear_focus(); updatevalue(); do_callback(); return 1; } int ch = Fl::event_text()[0]; if (ch < '0' || ch > '9') return Fl_Group::handle(event); Fl::add_timeout(0.0, (Fl_Timeout_Handler)blink_point, decbx); finp->static_value(""); oldval = val; if (!enable_arrow_keys) reverse_colors(); } return finp->handle(event); } val += d; updatevalue(); do_callback(); break; case FL_MOUSEWHEEL: if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) return 1; for (int i = 0; i < nD; i++) { if (Fl::event_inside(Digit[i])) { d > 0 ? DecFreq(i) : IncFreq(i); break; } } break; case FL_PUSH: if (Fl::event_button() == FL_MIDDLE_MOUSE) Fl::paste(*this, 0); else return Fl_Group::handle(event); break; case FL_PASTE: finp->value(Fl::event_text()); finp->position(finp->size()); finp->insert(" \n", 2); // space before newline for pasted text finp->do_callback(); break; } return Fl_Group::handle(event); } void cFreqControl::freq_input_cb(Fl_Widget*, void* arg) { cFreqControl* fc = reinterpret_cast(arg); double val = strtod(fc->finp->value(), NULL); long int lval; val *= 1e3; val += 0.5; lval = (long)val; if (lval <= fc->maxVal) { fc->val = (long)val; fc->updatevalue(); if (fc->finp->index(fc->finp->size() - 1) == '\n' && val > 0.0) { Fl::remove_timeout((Fl_Timeout_Handler)blink_point, fc->decbx); fc->do_callback(); } } } static void restore_color(void* w) { cFreqControl *fc = (cFreqControl *)w; fc->restore_colors(); } void cFreqControl::visual_beep() { reverse_colors(); Fl::add_timeout(0.1, restore_color, this); } void cFreqControl::set_ndigits(int nbr) { delete decbx; for (int n = 0; n < nD; n++) { this->remove(Digit[n]); delete Digit[n]; } nD = nbr; if (nD > MAX_DIGITS) nD = MAX_DIGITS; if (nD < MIN_DIGITS) nD = MIN_DIGITS; int fw, fh, ht = h() - 2*bdr; font_number = progdefaults.FreqControlFontnbr; fl_font(font_number, ht); fh = fl_height();// + 1; while (fh > fcHeight) { ht--; fl_font(font_number, ht); fh = fl_height(); } fl_font(font_number, ht); fw = fl_width("9") + 2; pw = fw / 2; while( (nD * fw + pw) >= (W - 2*bdr)) { ht--; fl_font(font_number, ht); fw = fl_width("9") + 2; pw = fw / 2; } fh = fl_height(); fcWidth = fw; int wf1 = (w() - nD * fcWidth - pw - 2*bdr)/2; int wf2 = w() - nD * fcWidth - pw - 2*bdr - wf1; fcTop = y() + bdr; int xpos; minVal = 0; double fmaxval = (pow(10.0, nD) - 1) * precision; long int UMAX = (long int)(pow(2.0, 31) - 1); if (fmaxval > UMAX) fmaxval = UMAX; maxVal = fmaxval; fmaxval /= 1000.0; static char tt[100]; snprintf(tt, sizeof(tt), "Enter frequency (max %.3f) or\nLeft/Right/Up/Down/Pg_Up/Pg_Down", fmaxval); tooltip(tt); hfill2->resize(x() + w() - bdr - wf2, fcTop, wf2, fcHeight); xpos = x() + w() - bdr - wf2; for (int n = 0; n < dpoint; n++) { xpos -= fcWidth; Digit[n] = new Fl_Repeat_Button ( xpos, fcTop, fcWidth, fcHeight, " "); Digit[n]->box(FL_FLAT_BOX); Digit[n]->labelfont(font_number); Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR, SELCOLOR); Digit[n]->labelsize(fh); Digit[n]->callback(cbSelectDigit, reinterpret_cast(n)); if (n == 0) mult[n] = 1; else mult[n] = 10 * mult[n-1]; this->add(Digit[n]); } xpos -= pw; decbx = new Fl_Box(xpos, fcTop, pw, fcHeight,"."); decbx->box(FL_FLAT_BOX); decbx->labelfont(font_number); decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); decbx->labelsize(fh); this->add(decbx); for (int n = dpoint; n < nD; n++) { xpos -= fcWidth; Digit[n] = new Fl_Repeat_Button ( xpos, fcTop, fcWidth, fcHeight, " "); Digit[n]->box(FL_FLAT_BOX); Digit[n]->labelfont(font_number); Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR, SELCOLOR); Digit[n]->labelsize(fh); Digit[n]->callback(cbSelectDigit, reinterpret_cast(n)); if (n == 0) mult[n] = 1; else mult[n] = 10 * mult[n-1]; this->add(Digit[n]); } hfill1->resize(x() + bdr, fcTop, wf1, fcHeight); redraw(); } void cFreqControl::resize(int x, int y, int w, int h) { Fl_Group::resize(x,y,w,h); int wf1 = (w - nD * fcWidth - pw - 2*bdr) / 2; int wf2 = w - nD * fcWidth - pw - 2*bdr - wf1; hfill2->resize(x + w - bdr - wf2, y + bdr, wf2, h - 2*bdr); int xpos = x + w - bdr - wf2; int ypos = y + bdr; for (int n = 0; n < dpoint; n++) { xpos -= fcWidth; Digit[n]->resize(xpos, ypos, fcWidth, fcHeight); } xpos -= pw; decbx->resize(xpos, ypos, pw, fcHeight); for (int n = dpoint; n < nD; n++) { xpos -= fcWidth; Digit[n]->resize(xpos, ypos, fcWidth, fcHeight); } hfill1->resize(x + bdr, y + bdr, wf1, h - 2*bdr); Fl_Group::redraw(); } fldigi-4.1.06/src/rigcontrol/hamlib.cxx0000644000175000017500000003524013472116000014710 00000000000000// ---------------------------------------------------------------------------- // hamlib.cxx -- Hamlib (rig control) interface for fldigi // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "trx.h" #include "configuration.h" #include "confdialog.h" #include "rigclass.h" #include "threads.h" #include "misc.h" #include "fl_digi.h" #include "main.h" #include "misc.h" #include "rigsupport.h" #include "stacktrace.h" #ifdef __WOE32__ # include "serial.h" #endif #include "debug.h" #include "re.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; static pthread_mutex_t hamlib_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t *hamlib_thread = 0; static bool hamlib_exit = false; static bool hamlib_ptt = false; static bool hamlib_qsy = false; static bool need_freq = false; static bool need_mode = false; static bool hamlib_bypass = false; static bool hamlib_closed = true;//false; static int hamlib_passes = 20; static long int hamlib_freq; static rmode_t hamlib_rmode = RIG_MODE_USB; static pbwidth_t hamlib_pbwidth = 3000; typedef std::vector rig_list_t; rig_list_t hamlib_rigs; enum { SIDEBAND_RIG, SIDEBAND_LSB, SIDEBAND_USB }; static void *hamlib_loop(void *args); void show_error(const char* msg1, const char* msg2 = 0) { string error = msg1; if (msg2) error.append(": ").append(msg2); put_status(error.c_str(), 10.0); LOG_ERROR("%s", error.c_str()); } void hamlib_get_defaults() { char szParam[40]; int i; Rig testrig; rig_model_t rigmodel; rigmodel = hamlib_get_rig_model(cboHamlibRig->index()); testrig.init(rigmodel); if (testrig.getCaps()->port_type != RIG_PORT_SERIAL) { testrig.close(); return; } testrig.getConf("serial_speed", szParam); listbox_baudrate->value(szParam); testrig.getConf("post_write_delay", szParam); sscanf(szParam, "%d", &i); cntHamlibWait->value(i); testrig.getConf("write_delay", szParam); sscanf(szParam, "%d", &i); cntHamlibWriteDelay->value(i); testrig.getConf("timeout", szParam); sscanf(szParam, "%d", &i); cntHamlibTimeout->value(i); testrig.getConf("retry", szParam); sscanf(szParam, "%d", &i); cntHamlibRetries->value(i); testrig.getConf("rts_state", szParam); chkHamlibRTSplus->value( strcmp(szParam, "ON") == 0 ? true : false); testrig.getConf("dtr_state", szParam); btnHamlibDTRplus->value( strcmp(szParam, "ON") == 0 ? true : false); testrig.getConf("serial_handshake", szParam); chkHamlibRTSCTSflow->value(strcmp(szParam, "Hardware") == 0 ? true : false); chkHamlibXONXOFFflow->value(strcmp(szParam, "XONXOFF") == 0 ? true : false); testrig.getConf("stop_bits", szParam); valHamRigStopbits->value(strcmp(szParam, "1") == 0 ? 1 : 2); if (!testrig.canSetPTT()) { btnHamlibCMDptt->value(0); btnHamlibCMDptt->deactivate(); } else { btnHamlibCMDptt->value(1); btnHamlibCMDptt->activate(); } inpHamlibConfig->value(""); testrig.close(); } void hamlib_init_defaults() { progdefaults.HamRigModel = hamlib_get_rig_model(cboHamlibRig->index()); progdefaults.HamRigDevice = inpRIGdev->value(); progdefaults.HamlibRetries = static_cast(cntHamlibRetries->value()); progdefaults.HamlibTimeout = static_cast(cntHamlibTimeout->value()); progdefaults.HamlibWriteDelay = static_cast(cntHamlibWriteDelay->value()); progdefaults.HamlibWait = static_cast(cntHamlibWait->value()); progdefaults.HamlibCMDptt = btnHamlibCMDptt->value(); progdefaults.HamlibDTRplus = btnHamlibDTRplus->value(); progdefaults.HamlibRTSCTSflow = chkHamlibRTSCTSflow->value(); progdefaults.HamlibRTSplus = chkHamlibRTSplus->value(); progdefaults.HamlibXONXOFFflow = chkHamlibXONXOFFflow->value(); progdefaults.HamlibSideband = listbox_sideband->index(); progdefaults.HamRigStopbits = static_cast(valHamRigStopbits->value()); progdefaults.HamRigBaudrate = listbox_baudrate->index(); progdefaults.HamlibCMDptt = btnHamlibCMDptt->value(); progdefaults.HamConfig = inpHamlibConfig->value(); } bool hamlib_init(bool bPtt) { freq_t freq; // rmode_t mode; // pbwidth_t width; hamlib_ptt = bPtt; hamlib_init_defaults(); #ifdef __CYGWIN__ string port = progdefaults.HamRigDevice; com_to_tty(port); #endif if (progdefaults.HamRigModel == 0) { LOG_ERROR("No such hamlib rig model"); return false; } try { char szParam[20]; xcvr->init(progdefaults.HamRigModel); #ifdef __CYGWIN__ xcvr->setConf("rig_pathname", port.c_str()); #else xcvr->setConf("rig_pathname", progdefaults.HamRigDevice.c_str()); #endif snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibWait); xcvr->setConf("post_write_delay", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibWriteDelay); xcvr->setConf("write_delay", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibTimeout); xcvr->setConf("timeout", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibRetries); xcvr->setConf("retry", szParam); if (xcvr->getCaps()->port_type == RIG_PORT_SERIAL) { xcvr->setConf("serial_speed", progdefaults.strBaudRate()); if (progdefaults.HamlibDTRplus) xcvr->setConf("dtr_state", "ON"); else xcvr->setConf("dtr_state", "OFF"); if (progdefaults.HamlibRTSCTSflow) xcvr->setConf("serial_handshake", "Hardware"); else if (progdefaults.HamlibXONXOFFflow) xcvr->setConf("serial_handshake", "XONXOFF"); else xcvr->setConf("serial_handshake", "None"); if (!progdefaults.HamlibRTSCTSflow) { if (progdefaults.HamlibRTSplus) xcvr->setConf("rts_state", "ON"); else xcvr->setConf("rts_state", "OFF"); } xcvr->setConf("stop_bits", progdefaults.HamRigStopbits == 1 ? "1" : "2"); } string::size_type c = progdefaults.HamConfig.find('#'); if (c != string::npos) progdefaults.HamConfig.erase(c); if (!progdefaults.HamConfig.empty()) { re_t re("([^, =]+) *= *([^, =]+)", REG_EXTENDED); const char* conf = progdefaults.HamConfig.c_str(); int end; while (re.match(conf)) { xcvr->setConf(re.submatch(1).c_str(), re.submatch(2).c_str()); re.suboff(0, NULL, &end); conf += end; } } xcvr->open(); } catch (const RigException& Ex) { show_error(__func__, Ex.what()); xcvr->close(); return false; } try { if ( !xcvr->canGetFreq() ) need_freq = false; // getFreq will return setFreq value else { need_freq = true; freq = xcvr->getFreq(); if ((long)freq <= 0) { xcvr->close(true); LOG_ERROR("%s","Hamlib xcvr not responding"); return false; } } } catch (const RigException& Ex) { show_error("Get Freq", Ex.what()); need_freq = false; } if (!need_freq) { xcvr->close(true); LOG_INFO("Failed freq test"); return false; } LOG_INFO("trying mode request"); try { if ( !xcvr->canGetMode() ) need_mode = false; else { need_mode = true; // mode = xcvr->getMode(width); } } catch (const RigException& Ex) { LOG_ERROR("Get Mode %s", Ex.what()); need_mode = false; } try { if (hamlib_ptt == true) { LOG_INFO("trying PTT"); if (!xcvr->canSetPTT()) hamlib_ptt = false; else xcvr->setPTT(RIG_PTT_OFF); } } catch (const RigException& Ex) { LOG_ERROR("Set Ptt %s", Ex.what()); hamlib_ptt = false; } hamlib_freq = 0; hamlib_rmode = RIG_MODE_NONE; hamlib_exit = false; hamlib_bypass = false; hamlib_thread = new pthread_t; if (pthread_create(hamlib_thread, NULL, hamlib_loop, NULL) < 0) { show_error(__func__, "pthread_create failed"); xcvr->close(); hamlib_thread = 0; return false; } init_Hamlib_RigDialog(); hamlib_closed = false; return true; } void hamlib_close(void) { ENSURE_THREAD(FLMAIN_TID); if (hamlib_closed) return; pthread_mutex_lock(&hamlib_mutex); hamlib_exit = true; pthread_mutex_unlock(&hamlib_mutex); pthread_join(*hamlib_thread, NULL); delete hamlib_thread; hamlib_thread = 0; if (xcvr->isOnLine()) xcvr->close(); wf->USB(true); } bool hamlib_active(void) { if (!xcvr) return false; return (xcvr->isOnLine()); } void hamlib_set_ptt(int ptt) { if (xcvr->isOnLine() == false) return; if (!hamlib_ptt) return; guard_lock hamlib(&hamlib_mutex); try { xcvr->setPTT( ptt ? (progdefaults.hamlib_ptt_on_data ? RIG_PTT_ON_DATA : RIG_PTT_ON_MIC) : RIG_PTT_OFF ); hamlib_bypass = ptt ? true : false; } catch (const RigException& Ex) { show_error("Rig PTT", Ex.what()); hamlib_ptt = false; } } void hamlib_set_qsy(long long f) { if (xcvr->isOnLine() == false) return; guard_lock hamlib(&hamlib_mutex); double fdbl = f; hamlib_qsy = false; try { xcvr->setFreq(fdbl); wf->rfcarrier(f); wf->movetocenter(); } catch (const RigException& Ex) { show_error("QSY", Ex.what()); hamlib_passes = 0; } } int hamlib_setfreq(long f) { if (xcvr->isOnLine() == false) return -1; guard_lock hamlib(&hamlib_mutex); try { LOG_DEBUG("%ld", f); xcvr->setFreq(f); } catch (const RigException& Ex) { show_error("SetFreq", Ex.what()); hamlib_passes = 0; } return 1; } static int hamlib_wait = 0; int hamlib_setmode(rmode_t m) { if (need_mode == false) return -1; if (xcvr->isOnLine() == false) return -1; guard_lock hamlib(&hamlib_mutex); try { hamlib_rmode = xcvr->getMode(hamlib_pbwidth); xcvr->setMode(m, hamlib_pbwidth); hamlib_rmode = m; } catch (const RigException& Ex) { show_error("Set Mode", Ex.what()); hamlib_passes = 0; } hamlib_wait = progdefaults.hamlib_mode_delay / 50; return 1; } // width control via hamlib is not implemented int hamlib_setwidth(pbwidth_t w) { if (xcvr->isOnLine() == false) return -1; guard_lock hamlib(&hamlib_mutex); try { hamlib_rmode = xcvr->getMode(hamlib_pbwidth); xcvr->setMode(hamlib_rmode, w); hamlib_pbwidth = w; } catch (const RigException& Ex) { show_error("Set Width", Ex.what()); hamlib_passes = 0; } return 1; } rmode_t hamlib_getmode() { return hamlib_rmode; } pbwidth_t hamlib_getwidth() { return hamlib_pbwidth; } bool hamlib_USB() { if (hamlib_wait) return wf->USB(); bool islsb = false; if (progdefaults.HamlibSideband == SIDEBAND_RIG) { islsb = (hamlib_rmode == RIG_MODE_LSB || hamlib_rmode == RIG_MODE_PKTLSB || hamlib_rmode == RIG_MODE_ECSSLSB); if (hamlib_rmode == RIG_MODE_CW) { if (progdefaults.hamlib_cw_islsb) islsb = true; else islsb = false; } if (hamlib_rmode == RIG_MODE_CWR) { if (progdefaults.hamlib_cw_islsb) islsb = false; else islsb = true; } if (hamlib_rmode == RIG_MODE_RTTY) { if (progdefaults.hamlib_rtty_isusb) islsb = false; else islsb = true; } if (hamlib_rmode == RIG_MODE_RTTYR) { if (progdefaults.hamlib_rtty_isusb) islsb = true; else islsb = false; } } else if (progdefaults.HamlibSideband == SIDEBAND_LSB) islsb = true; return !islsb; } static void *hamlib_loop(void *args) { SET_THREAD_ID(RIGCTL_TID); long int freq = 0L; rmode_t numode = RIG_MODE_NONE; int skips = 0; for (;;) { bool cont = false; MilliSleep(50); if (skips) { skips--; cont = true; } if (hamlib_wait) { hamlib_wait--; cont = true; } if (cont) continue; else { skips = valHamRigPollrate->value() / 50; } if (hamlib_exit) break; if (hamlib_bypass) continue; { guard_lock hamlib(&hamlib_mutex); if (need_freq) { freq_t f; try { f = xcvr->getFreq(); freq = (long int) f; if (freq == 0) continue; hamlib_freq = freq; show_frequency(hamlib_freq); wf->rfcarrier(hamlib_freq); } catch (const RigException& Ex) { show_error(__func__, "Rig not responding: freq"); } } } if (hamlib_exit) break; if (hamlib_bypass) continue; { guard_lock hamlib(&hamlib_mutex); if (need_mode) { try { numode = xcvr->getMode(hamlib_pbwidth); if (numode != hamlib_rmode) { hamlib_rmode = numode; show_mode(modeString(hamlib_rmode)); wf->USB(hamlib_USB()); } } catch (const RigException& Ex) { show_error(__func__, "Rig not responding: mode"); } } } if (hamlib_exit) break; if (hamlib_bypass) continue; } hamlib_closed = true; return NULL; } static int add_to_list(const struct rig_caps* rc, void*) { hamlib_rigs.push_back(rc); return 1; } static bool rig_cmp(const struct rig_caps* rig1, const struct rig_caps* rig2) { int ret; ret = strcasecmp(rig1->mfg_name, rig2->mfg_name); if (ret > 0) return false; if (ret < 0) return true; ret = strcasecmp(rig1->model_name, rig2->model_name); if (ret > 0) return false; if (ret < 0) return true; if (rig1->rig_model < rig2->rig_model) return true; return false; } void hamlib_get_rigs(void) { if (!hamlib_rigs.empty()) return; enum rig_debug_level_e dblv = RIG_DEBUG_NONE; #ifndef NDEBUG const char* hd = getenv("FLDIGI_HAMLIB_DEBUG"); if (hd) { dblv = static_cast(strtol(hd, NULL, 10)); dblv = CLAMP(dblv, RIG_DEBUG_NONE, RIG_DEBUG_TRACE); } #endif rig_set_debug(dblv); rig_load_all_backends(); rig_list_foreach(add_to_list, 0); sort(hamlib_rigs.begin(), hamlib_rigs.end(), rig_cmp); } rig_model_t hamlib_get_rig_model_compat(const char* name) { for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) if (strstr(name, (*i)->mfg_name) && strstr(name, (*i)->model_name)) return (*i)->rig_model; return 0; } size_t hamlib_get_index(rig_model_t model) { for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) if ((*i)->rig_model == model) return i - hamlib_rigs.begin(); return hamlib_rigs.size(); } rig_model_t hamlib_get_rig_model(size_t i) { try { return hamlib_rigs.at(i)->rig_model; } catch (...) { return 0; } } void hamlib_get_rig_str(int (*func)(const char*)) { string rigstr; for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) { rigstr.clear(); rigstr.append((*i)->mfg_name).append(" ").append((*i)->model_name); rigstr.append(" (").append(rig_strstatus((*i)->status)).append(")"); if (!(*func)(rigstr.c_str())) break; } } fldigi-4.1.06/src/rigcontrol/rigio.cxx0000644000175000017500000015371613472116000014576 00000000000000// ---------------------------------------------------------------------------- // rigio.cxx // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #ifdef RIGCATTEST #include "rigCAT.h" #else #include "fl_digi.h" #include "misc.h" #include "configuration.h" #endif #include "rigsupport.h" #include "rigxml.h" #include "trx.h" #include "serial.h" #include "rigio.h" #include "debug.h" #include "qrunner.h" #include "confdialog.h" #include "status.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; Cserial rigio; static pthread_t rigCAT_thread; pthread_mutex_t rigCAT_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t cmdque_mutex = PTHREAD_MUTEX_INITIALIZER; static bool rigCAT_exit = false; static bool rigCAT_open = false; static string sRigWidth = ""; static string sRigMode = ""; static long long llFreq = 0; static void *rigCAT_loop(void *args); #define RXBUFFSIZE 2000 static unsigned char replybuff[RXBUFFSIZE+1]; static unsigned char retbuf[3]; struct CMDQUEUE { string cmd; string s; int retnbr; int waitval; CMDQUEUE(string _cmd, string _s, int _retnbr, int _waitval) { cmd = _cmd; s = _s; retnbr = _retnbr; waitval = _waitval; } CMDQUEUE() {cmd.clear(); s.clear(); retnbr = 0; waitval = 0;} ~CMDQUEUE() {}; }; queue cmdque; void add_to_cmdque( string cmd, string s, int retnbr, int waitval) { guard_lock quelock(&cmdque_mutex); cmdque.push(CMDQUEUE(cmd, s, retnbr, waitval)); } void cmdque_exec() { bool sendcmd = false; CMDQUEUE cmdq; { guard_lock quelock(&cmdque_mutex); if (!cmdque.empty()) { cmdq = cmdque.front(); cmdque.pop(); sendcmd = true; } } if (sendcmd) sendCommand(cmdq.cmd, cmdq.s, cmdq.retnbr, cmdq.waitval); } bool sendCommand (string cmd, string s, int retnbr, int waitval) { int numwrite = (int)s.length(); int readafter = 0; int numread = 0; int retval = 0; numread = retnbr; if (progdefaults.RigCatECHO) numread += numwrite; readafter = waitval + (int) ceilf ( numread * (9 + progdefaults.RigCatStopbits) * 1000.0 / rigio.Baud() ); if (xmlrig.debug) LOG_INFO( "%s: '%s', Expect: %d after %d msec", cmd.c_str(), (xmlrig.ascii ? s.c_str() : str2hex(s.data(), s.length())), numread, readafter); if (xmlrig.noserial) { memset(replybuff, 0, RXBUFFSIZE + 1); numread = 0; return true; } retval = rigio.WriteBuffer((unsigned char *)s.c_str(), numwrite); if (retval <= 0) LOG_ERROR("Write error %d", retval); if (retnbr == 0) return true; memset(replybuff, 0, RXBUFFSIZE + 1); numread = 0; while (readafter > 50) { MilliSleep(50); Fl::awake(); readafter -= 50; } if (readafter) { MilliSleep(readafter); Fl::awake(); } while (numread < RXBUFFSIZE) { memset(retbuf, 0, 2); retval = rigio.ReadBuffer(retbuf, 1); if (retval == 0) break; replybuff[numread] = retbuf[0]; numread++; } if (xmlrig.debug) LOG_INFO( "Reply (%d): '%s'", numread, (xmlrig.ascii ? reinterpret_cast(replybuff) : str2hex(reinterpret_cast(replybuff), numread))); if (numread > retnbr) { memmove(replybuff, replybuff + numread - retnbr, retnbr); numread = retnbr; } return (numread == retnbr); } string to_bcd_be(long long freq, int len) { string bcd = ""; unsigned char a; int numchars = len / 2; if (len & 1) numchars ++; for (int i = 0; i < numchars; i++) { a = 0; a |= freq%10; freq /= 10; a |= (freq%10)<<4; freq /= 10; bcd += a; } return bcd; } string to_bcd(long long freq, int len) { string bcd = ""; string bcd_be = to_bcd_be(freq, len); int bcdlen = bcd_be.size(); for (int i = bcdlen - 1; i >= 0; i--) bcd += bcd_be[i]; return bcd; } long long fm_bcd (size_t p, int len) { int i; long long f = 0; int numchars = len/2; if (len & 1) numchars ++; for (i = 0; i < numchars; i++) { f *=10; f += (replybuff[p + i] >> 4) & 0x0F; f *= 10; f += replybuff[p + i] & 0x0F; } return f; } long long fm_bcd_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_bcd(p, len); } string to_binary_be(long long freq, int len) { string bin = ""; for (int i = 0; i < len; i++) { bin += freq & 0xFF; freq >>= 8; } return bin; } string to_binary(long long freq, int len) { string bin = ""; string bin_be = to_binary_be(freq, len); int binlen = bin_be.size(); for (int i = binlen - 1; i >= 0; i--) bin += bin_be[i]; return bin; } long long fm_binary(size_t p, int len) { int i; long long f = 0; for (i = 0; i < len; i++) { f *= 256; f += replybuff[p + i]; } return f; } long long fm_binary_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_binary(p, len); } string to_decimal_be(long long d, int len) { string sdec_be = ""; for (int i = 0; i < len; i++) { sdec_be += (char)((d % 10) + '0'); d /= 10; } return sdec_be; } string to_decimal(long long d, int len) { string sdec = ""; string sdec_be = to_decimal_be(d, len); int bcdlen = sdec_be.size(); for (int i = bcdlen - 1; i >= 0; i--) sdec += sdec_be[i]; return sdec; } long long fm_decimal(size_t p, int len) { long long d = 0; for (int i = 0; i < len; i++) { d *= 10; d += replybuff[p + i] - '0'; } return d; } long long fm_decimal_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_decimal(p, len); } string to_freqdata(DATA d, long long f) { int num, den; num = 100; den = (int)(d.resolution * 100); if (d.size == 0) return ""; if (d.dtype == "BCD") { if (d.reverse == true) return to_bcd_be((long long int)(f * num / den), d.size); else return to_bcd((long long int)(f * num / den), d.size); } else if (d.dtype == "BINARY") { if (d.reverse == true) return to_binary_be((long long int)(f * num / den), d.size); else return to_binary((long long int)(f * num / den), d.size); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) return to_decimal_be((long long int)(f * num / den), d.size); else return to_decimal((long long int)(f * num / den), d.size); } return ""; } long long fm_freqdata(DATA d, size_t p) { int num, den; num = (int)(d.resolution * 100); den = 100; long long fret = 0; if (d.dtype == "BCD") { if (d.reverse == true) fret = (long long int)(fm_bcd_be(p, d.size) * num / den); else fret = (long long int)(fm_bcd(p, d.size) * num / den); } else if (d.dtype == "BINARY") { if (d.reverse == true) fret = (long long int)(fm_binary_be(p, d.size) * num / den); else fret = (long long int)(fm_binary(p, d.size) * num / den); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) fret = (long long int)(fm_decimal_be(p, d.size) * num / den); else fret = (long long int)(fm_decimal(p, d.size) * num / den); } return fret; } long long rigCAT_getfreq(int retries, bool &failed, int waitval) { const char symbol[] = "GETFREQ"; failed = false; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) { failed = true; return progStatus.noCATfreq; } if (waitval == 0) waitval = progdefaults.RigCatWait; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long long f = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { failed = true; if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return progStatus.noCATfreq; // get_freq command is not defined! } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) { failed = true; return 0; } for (list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != modeCmd.info) continue; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); for (int n = 0; n < retries; n++) { if (n && progdefaults.RigCatTimeout > 0) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, waitval); } if ( !sendok ) { if (xmlrig.debug) LOG_INFO("sendCommand failed"); goto retry_get_freq; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_freq; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); goto retry_get_freq; } } // convert the data field f = fm_freqdata(rTemp.data, pData); if ( f >= rTemp.data.min && f <= rTemp.data.max) return f; LOG_VERBOSE("freq: %d", static_cast(f)); retry_get_freq: ; } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); failed = true; return 0; } void rigCAT_setfreq(long long f) { const char symbol[] = "SETFREQ"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) { progStatus.noCATfreq = f; } if (rigCAT_exit || !xmlrig.xmlok) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); strCmd.append( to_freqdata(modeCmd.data, f) ); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); } string rigCAT_getmode() { const char symbol[] = "GETMODE"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) return progStatus.noCATmode; XMLIOS modeCmd; list::iterator itrCmd; list::iterator mode; list *pmode; string strCmd, mData; size_t len; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return progStatus.noCATmode; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (!modeCmd.info.size()) return ""; for (list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != modeCmd.info) continue; XMLIOS rTemp = *preply; for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (progdefaults.RigCatTimeout > 50) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } size_t p = 0, pData = 0; // send the command { guard_lock ser_guard(&rigCAT_mutex); if (!sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) goto retry_get_mode; } // check the pre data string len = rTemp.str1.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_mode; } p = len; } if (rTemp.fill1) p += rTemp.fill1; pData = p; // check the post data string p += rTemp.data.size; len = rTemp.str2.size(); if (rTemp.fill2) p += rTemp.fill2; if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) goto retry_get_mode; } // convert the data field mData = ""; for (int i = 0; i < rTemp.data.size; i++) mData += (char)replybuff[pData + i]; // for FT100 and the ilk that use bit fields if (rTemp.data.size == 1) { unsigned char d = mData[0]; if (rTemp.data.shiftbits) d >>= rTemp.data.shiftbits; d &= rTemp.data.andmask; mData[0] = d; } if (lmodes.empty() == false) pmode = &lmodes; else if (lmodeREPLY.empty() == false) pmode = &lmodeREPLY; else goto retry_get_mode; mode = pmode->begin(); while (mode != pmode->end()) { if ((*mode).BYTES == mData) break; mode++; } if (mode != pmode->end()) return ((*mode).SYMBOL); retry_get_mode: ; } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); return ""; } void rigCAT_setmode(const string& md) { const char symbol[] = "SETMODE"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) progStatus.noCATmode = md; if (rigCAT_exit || !xmlrig.xmlok) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if ( modeCmd.data.size > 0 ) { list::iterator mode; list *pmode; if (lmodes.empty() == false) pmode = &lmodes; else if (lmodeCMD.empty() == false) pmode = &lmodeCMD; else return; mode = pmode->begin(); while (mode != pmode->end()) { if ((*mode).SYMBOL == md) break; mode++; } if (mode != pmode->end()) strCmd.append( (*mode).BYTES ); } if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); } string rigCAT_getwidth() { const char symbol[] = "GETBW"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) return progStatus.noCATwidth; XMLIOS widthCmd; list::iterator itrCmd; list::iterator bw; list *pbw; string strCmd, mData; size_t len = 0, p = 0, pData = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return ""; } widthCmd = *itrCmd; if ( widthCmd.str1.empty() == false) strCmd.append(widthCmd.str1); if (widthCmd.str2.empty() == false) strCmd.append(widthCmd.str2); if (!widthCmd.info.size()) return ""; for (list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != widthCmd.info) continue; XMLIOS rTemp = *preply; for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (progdefaults.RigCatTimeout > 50) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } p = 0; pData = 0; // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait); } if ( !sendok ) { goto retry_get_width; } // check the pre data string len = rTemp.str1.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_width; } p = pData = len; } if (rTemp.fill1) p += rTemp.fill1; pData = p; p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; len = rTemp.str2.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_width; } } // convert the data field mData = ""; for (int i = 0; i < rTemp.data.size; i++) mData += (char)replybuff[pData + i]; // new for FT100 and the ilk that use bit fields if (rTemp.data.size == 1) { unsigned char d = mData[0]; if (rTemp.data.shiftbits) d >>= rTemp.data.shiftbits; d &= rTemp.data.andmask; mData[0] = d; } if (!lbwREPLY.empty()) pbw = &lbwREPLY; else if (lbws.empty() == false) pbw = &lbws; else goto retry_get_width; bw = pbw->begin(); while (bw != pbw->end()) { if ((*bw).BYTES == mData) break; bw++; } if (bw != pbw->end()) return ((*bw).SYMBOL); retry_get_width: ; } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); return ""; } void rigCAT_setwidth(const string& w) { const char symbol[] = "SETBW"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) progStatus.noCATwidth = w; if (rigCAT_exit || !xmlrig.xmlok) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); progStatus.noCATwidth = w; return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if ( modeCmd.data.size > 0 ) { list::iterator bw; list *pbw; if (lbws.empty() == false) pbw = &lbws; else if (lbwCMD.empty() == false) pbw = &lbwCMD; else return; bw = pbw->begin(); while (bw != pbw->end()) { if ((*bw).SYMBOL == w) break; bw++; } if (bw != pbw->end()) strCmd.append( (*bw).BYTES ); } if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_pttON() { const char symbol[] = "PTTON"; if (rigCAT_exit) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; rigio.SetPTT(1); // always execute the h/w ptt if enabled itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { // if (xmlrig.debug) // LOG_INFO("OK string: %s", str2hex(modeCmd.ok.c_str(), modeCmd.ok.size()) ); list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_VERBOSE("%s failed", symbol); } void rigCAT_pttOFF() { const char symbol[] = "PTTOFF"; if (rigCAT_exit) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; rigio.SetPTT(0); // always execute the h/w ptt if enabled itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_sendINIT(const string& icmd, int multiplier) { if (rigCAT_exit) return; const char symbol[] = "INIT"; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == icmd) break; ++itrCmd; } if (itrCmd == commands.end()) return; modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatInitDelay)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatInitDelay)) return; MilliSleep(50); } } LOG_ERROR("INIT failed"); } void rigCAT_defaults() { listbox_xml_rig_baudrate->index(xmlrig.baud); valRigCatStopbits->value(xmlrig.stopbits); btnRigCatRTSplus->value(xmlrig.rts); btnRigCatDTRplus->value(xmlrig.dtr); btnRigCatRTSptt->value(xmlrig.rtsptt); btnRigCatDTRptt->value(xmlrig.dtrptt); chk_restore_tio->value(xmlrig.restore_tio); chkRigCatRTSCTSflow->value(xmlrig.rtscts); cntRigCatRetries->value(xmlrig.retries); cntRigCatTimeout->value(xmlrig.timeout); cntRigCatWait->value(xmlrig.write_delay); cntRigCatInitDelay->value(xmlrig.init_delay); // cntRigCatWaitForDevice->value(xmlrig.wait_for_device); btnRigCatEcho->value(xmlrig.echo); btnRigCatCMDptt->value(xmlrig.cmdptt); chkRigCatVSP->value(xmlrig.vsp); } void rigCAT_init_defaults() { progdefaults.XmlRigDevice = inpXmlRigDevice->value(); progdefaults.XmlRigBaudrate = listbox_xml_rig_baudrate->index(); progdefaults.RigCatStopbits = static_cast(valRigCatStopbits->value()); progdefaults.RigCatRTSplus = btnRigCatRTSplus->value(); progdefaults.RigCatDTRplus = btnRigCatDTRplus->value(); progdefaults.RigCatRTSptt = btnRigCatRTSptt->value(); progdefaults.RigCatDTRptt = btnRigCatDTRptt->value(); progdefaults.RigCatRestoreTIO = chk_restore_tio->value(); progdefaults.RigCatRTSCTSflow = chkRigCatRTSCTSflow->value(); progdefaults.RigCatRetries = static_cast(cntRigCatRetries->value()); progdefaults.RigCatTimeout = static_cast(cntRigCatTimeout->value()); progdefaults.RigCatWait = static_cast(cntRigCatWait->value()); progdefaults.RigCatInitDelay = static_cast(cntRigCatInitDelay->value()); progdefaults.RigCatECHO = btnRigCatEcho->value(); progdefaults.RigCatCMDptt = btnRigCatCMDptt->value(); progdefaults.RigCatVSP = chkRigCatVSP->value(); } bool rigCAT_init() { if (rigCAT_open == true) { LOG_ERROR("RigCAT already open"); return false; } sRigMode = ""; sRigWidth = ""; rigCAT_init_defaults(); rigio.Device(progdefaults.XmlRigDevice); rigio.Baud(progdefaults.BaudRate(progdefaults.XmlRigBaudrate)); rigio.RTS(progdefaults.RigCatRTSplus); rigio.DTR(progdefaults.RigCatDTRplus); rigio.RTSptt(progdefaults.RigCatRTSptt); rigio.DTRptt(progdefaults.RigCatDTRptt); rigio.RestoreTIO(progdefaults.RigCatRestoreTIO); rigio.RTSCTS(progdefaults.RigCatRTSCTSflow); rigio.Stopbits(progdefaults.RigCatStopbits); LOG_INFO("\n\ Serial port parameters:\n\ device : %s\n\ baudrate : %d\n\ stopbits : %d\n\ retries : %d\n\ timeout : %d\n\ wait : %d\n\ initial rts: %+d\n\ use rts ptt: %c\n\ initial dtr: %+d\n\ use dtr ptt: %c\n\ restore tio: %c\n\ flowcontrol: %c\n\ echo : %c\n", rigio.Device().c_str(), rigio.Baud(), rigio.Stopbits(), progdefaults.RigCatRetries, progdefaults.RigCatTimeout, progdefaults.RigCatWait, (rigio.RTS() ? +12 : -12), (rigio.RTSptt() ? 'T' : 'F'), (rigio.DTR() ? +12 : -12), (rigio.DTRptt() ? 'T' : 'F'), (rigio.RestoreTIO() ? 'T' : 'F'), (rigio.RTSCTS() ? 'T' : 'F'), progdefaults.RigCatECHO ? 'T' : 'F'); if (xmlrig.noserial == false && xmlrig.xmlok) { if (rigio.OpenPort() == false) { LOG_ERROR("Cannot open serial port %s", rigio.Device().c_str()); xmlrig.xmlok = true; } } sRigMode = ""; sRigWidth = ""; if (xmlrig.wait_for_device) { int delay = xmlrig.wait_for_device / 10; while (delay) { MilliSleep(10); if (delay % 10) Fl::awake(); delay--; } } rigCAT_sendINIT("INIT", progdefaults.RigCatInitDelay); bool failed = false; if (xmlrig.noserial) rigCAT_getfreq(1, failed, 0); else if (xmlrig.xmlok) { rigCAT_getfreq(3, failed, progdefaults.RigCatInitDelay); if (failed) { LOG_ERROR("*****************Failed to read xcvr frequency"); if (xmlrig.noserial == false) rigio.ClosePort(); xmlrig.xmlok = false; } else LOG_INFO("Passed serial port test"); } llFreq = 0; if (pthread_create(&rigCAT_thread, NULL, rigCAT_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); if (xmlrig.xmlok && !xmlrig.noserial) rigio.ClosePort(); xmlrig.xmlok = false; return false; } LOG_INFO("Created rigCAT thread"); rigCAT_open = true; init_Xml_RigDialog(); return true; } void rigCAT_close(void) { if ( rigCAT_open == false || rigCAT_exit == true) return; rigCAT_sendINIT("CLOSE"); { guard_lock ser_guard( &rigCAT_mutex ); rigCAT_exit = true; } LOG_INFO("%s", "Waiting for rigCAT_thread"); pthread_join(rigCAT_thread, NULL); rigio.ClosePort(); rigCAT_exit = false; rigCAT_open = false; wf->USB(true); } bool rigCAT_active(void) { return (rigCAT_open); } void rigCAT_set_ptt(int ptt) { if (rigCAT_open == false) return; if (ptt) { rigCAT_pttON(); } else{ rigCAT_pttOFF(); } } #ifndef RIGCATTEST void rigCAT_set_qsy(long long f) { if (rigCAT_open == false) return; // send new freq to rig rigCAT_setfreq(f); wf->rfcarrier(f); wf->movetocenter(); } #endif bool ModeIsLSB(string s) { if (connected_to_flrig) return !xmlrpc_USB(); #if USE_HAMLIB if (hamlib_active()) return !hamlib_USB(); #endif list::iterator pM = LSBmodes.begin(); while (pM != LSBmodes.end() ) { if (*pM == s) return true; pM++; } return false; } int smeter_data(DATA d, size_t p) { int val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; int sm1, sm2, val1, val2; for (n = 0; n < xmlrig.smeter.size() - 1; n++) { if ((val >= xmlrig.smeter[n].val) && (val < xmlrig.smeter[n+1].val)) break; } if (n == xmlrig.smeter.size() - 1) return 0; sm1 = xmlrig.smeter[n].mtr; sm2 = xmlrig.smeter[n+1].mtr; val1 = xmlrig.smeter[n].val; val2 = xmlrig.smeter[n+1].val; if (val1 == val2) return 0; int mtr = sm1 + (val - val1) * (sm2 - sm1) / (val2 - val1); return mtr; } static void rigcat_set_smeter(void *data) { if (pwrlevel_grp->visible()) return; if (!smeter && !pwrmeter) return; if (smeter && progStatus.meters) { if (!smeter->visible()) { pwrmeter->hide(); smeter->show(); } int val = reinterpret_cast(data); smeter->value(val); } } void rigCAT_get_smeter() { const char symbol[] = "GET_SMETER"; if (rigCAT_exit || xmlrig.noserial) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long mtr = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field mtr = smeter_data(rTemp.data, pData); // if (xmlrig.debug) LOG_INFO("Converted %s value to %d", symbol, (int)mtr); REQ(rigcat_set_smeter, reinterpret_cast(mtr)); } int pmeter_data(DATA d, size_t p) { int val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; int pm1, pm2, val1, val2; for (n = 0; n < xmlrig.pmeter.size() - 1; n++) { if ((val > xmlrig.pmeter[n].val) && (val <= xmlrig.pmeter[n+1].val)) break; } if (n == xmlrig.pmeter.size() - 1) return 0; pm1 = xmlrig.pmeter[n].mtr; pm2 = xmlrig.pmeter[n+1].mtr; val1 = xmlrig.pmeter[n].val; val2 = xmlrig.pmeter[n+1].val; if (val1 == val2) return 0; int mtr = pm1 + (val - val1) * (pm2 - pm1) / (val2 - val1); return mtr; } static void rigcat_set_pmeter(void *data) { if (pwrlevel_grp->visible()) return; if (!smeter && !pwrmeter) return; if (pwrmeter && progStatus.meters) { if (!pwrmeter->visible()) { smeter->hide(); pwrmeter->show(); } int val = reinterpret_cast(data); pwrmeter->value(val); } } void rigCAT_get_pwrmeter() { const char symbol[] = "GET_PWRMETER"; if (rigCAT_exit || xmlrig.noserial) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long mtr = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field mtr = pmeter_data(rTemp.data, pData); if (xmlrig.debug) LOG_INFO("Converted %s to %d", symbol, (int)mtr); REQ(rigcat_set_pmeter, reinterpret_cast(mtr)); } static void rigcat_notch(void *data) { int val = reinterpret_cast(data); notch_frequency = val; } int notch_data(DATA d, size_t p) { int val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; int ntch1, ntch2, val1, val2; for (n = 0; n < xmlrig.notch.size() - 1; n++) { if ((val > xmlrig.notch[n].val) && (val <= xmlrig.notch[n+1].val)) break; } if (n == xmlrig.notch.size() - 1) return 0; val1 = xmlrig.notch[n].val; val2 = xmlrig.notch[n+1].val; if (val1 == val2) return 0; ntch1 = xmlrig.notch[n].mtr; ntch2 = xmlrig.notch[n+1].mtr; return ntch1 + (val - val1) * (ntch2 - ntch1) / (val2 - val1); } int notch_val(int freq) { size_t n; int val1, val2, freq1, freq2; for (n = 0; n < xmlrig.notch.size() - 1; n++) { if ((freq > xmlrig.notch[n].mtr) && (freq <= xmlrig.notch[n+1].mtr)) break; } if (n == xmlrig.notch.size() - 1) return 0; freq1 = xmlrig.notch[n].mtr; freq2 = xmlrig.notch[n+1].mtr; if (freq1 == freq2) return 0; val1 = xmlrig.notch[n].val; val2 = xmlrig.notch[n+1].val; return val1 + (freq - freq1) * (val2 - val1) / (freq2 - freq1); } bool rigCAT_notchON() { const char symbol[] = "GET_NOTCH_ON"; if (rigCAT_exit) return 0; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t len1 = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return 0; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return 0; list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return 0; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait ); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return 0; } bool is_on = true; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { is_on = false; break; } } } else is_on = false; // if (xmlrig.debug) LOG_INFO("%s is %s", symbol, is_on ? "ON" : "OFF"); return is_on; } void rigCAT_get_notch() { const char symbol[] = "GET_NOTCH"; if (rigCAT_exit) return; if (!rigCAT_notchON()) { REQ(rigcat_notch, reinterpret_cast(0)); return; } XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long ntch = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size,progdefaults.RigCatWait); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field ntch = notch_data(rTemp.data, pData); if (xmlrig.debug) LOG_INFO("%s converted to %d", symbol, (int)ntch); REQ(rigcat_notch, reinterpret_cast(ntch)); } void rigCAT_notch_ON() { const char symbol[] = "SET_NOTCH_ON"; if (rigCAT_exit) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_notch_OFF() { const char symbol[] = "SET_NOTCH_OFF"; if (rigCAT_exit) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_set_notch(int freq) { const char symbol[] = "SET_NOTCH_VAL"; if (rigCAT_exit) return; if (!freq) { rigCAT_notch_OFF(); return; } rigCAT_notch_ON(); XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); string strval = ""; long long int val = notch_val(freq); if (modeCmd.data.size != 0) { if (modeCmd.data.dtype == "BCD") { if (modeCmd.data.reverse == true) strval = to_bcd_be(val, modeCmd.data.size); else strval = to_bcd(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "BINARY") { if (modeCmd.data.reverse == true) strval = to_binary_be(val, modeCmd.data.size); else strval = to_binary(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "DECIMAL") { if (modeCmd.data.reverse == true) strval = to_decimal_be(val, modeCmd.data.size); else strval = to_decimal(val, modeCmd.data.size); } } strCmd.append(strval); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); } int pwrlevel_data(DATA d, size_t p) { int val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; int pwr1, pwr2, val1, val2; for (n = 0; n < xmlrig.pwrlevel.size() - 1; n++) { if ((val > xmlrig.pwrlevel[n].val) && (val <= xmlrig.pwrlevel[n+1].val)) break; } if (n == xmlrig.pwrlevel.size() - 1) return 0; val1 = xmlrig.pwrlevel[n].val; val2 = xmlrig.pwrlevel[n+1].val; if (val1 == val2) return 0; pwr1 = xmlrig.pwrlevel[n].mtr; pwr2 = xmlrig.pwrlevel[n+1].mtr; return pwr1 + (val - val1) * (pwr2 - pwr1) / (val2 - val1); } int pwrlevel_val(int pwr) { size_t n; int val1, val2, pwr1, pwr2; for (n = 0; n < xmlrig.pwrlevel.size() - 1; n++) { if ((pwr >= xmlrig.pwrlevel[n].mtr) && (pwr <= xmlrig.pwrlevel[n+1].mtr)) break; } if (n == xmlrig.pwrlevel.size() - 1) return 0; pwr1 = xmlrig.pwrlevel[n].mtr; pwr2 = xmlrig.pwrlevel[n+1].mtr; if (pwr1 == pwr2) return 0; val1 = xmlrig.pwrlevel[n].val; val2 = xmlrig.pwrlevel[n+1].val; return val1 + (pwr - pwr1) * (val2 - val1) / (pwr2 - pwr1); } // called by rigio thread // must use REQ(...) to set the power level control static void rigCAT_update_pwrlevel(void *v) { long pwr = reinterpret_cast(v); char szpwr[10]; snprintf(szpwr, sizeof(szpwr), "%ld", pwr); progdefaults.mytxpower = szpwr; inpMyPower->value(szpwr); pwr_level->value(pwr); // if (xmlrig.debug) LOG_INFO("Read power level %s", szpwr); } void rigCAT_get_pwrlevel() { const char symbol[] = "GET_PWRLEVEL"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long pwr = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command { guard_lock ser_guard( &rigCAT_mutex ); if ( !sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait) ) { LOG_ERROR("sendCommand failed"); return; } } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field pwr = pwrlevel_data(rTemp.data, pData); REQ(rigCAT_update_pwrlevel, (void *)pwr); } void rigCAT_set_pwrlevel(int pwr) { const char symbol[] = "SET_PWRLEVEL"; if (rigCAT_exit || !xmlrig.use_pwrlevel) return; XMLIOS modeCmd; list::iterator itrCmd; string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); string strval = ""; int val = pwrlevel_val(pwr); if (modeCmd.data.size != 0) { if (modeCmd.data.dtype == "BCD") { if (modeCmd.data.reverse == true) strval = to_bcd_be(val, modeCmd.data.size); else strval = to_bcd(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "BINARY") { if (modeCmd.data.reverse == true) strval = to_binary_be(val, modeCmd.data.size); else strval = to_binary(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "DECIMAL") { if (modeCmd.data.reverse == true) strval = to_decimal_be(val, modeCmd.data.size); else strval = to_decimal(val, modeCmd.data.size); } } strCmd.append(strval); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) { if (xmlrig.debug) LOG_INFO("Power set to %s", strval.c_str()); return; } MilliSleep(50); } if (xmlrig.debug) LOG_ERROR("%s failed", symbol); return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) { if (xmlrig.debug) LOG_INFO("Power set to %s", strval.c_str()); return; MilliSleep(50); } } } if (progdefaults.RigCatVSP == false) if (xmlrig.debug) LOG_ERROR("%s failed", symbol); } static void *rigCAT_loop(void *args) { SET_THREAD_ID(RIGCTL_TID); long long freq = 0L; string sWidth, sMode; bool failed; for (;;) { for (int i = 0; i < xmlrig.pollinterval / 10; i++) { MilliSleep(10); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit == true) { LOG_INFO("%s", "Exited rigCAT loop"); return NULL; } } if (trx_state == STATE_RX) { cmdque_exec(); freq = rigCAT_getfreq(progdefaults.RigCatRetries, failed); if (rigCAT_exit) continue; if ((freq > 0) && (freq != llFreq)) { llFreq = freq; show_frequency(freq); wf->rfcarrier(freq); } sWidth = rigCAT_getwidth(); if (rigCAT_exit) continue; if (sWidth.size() && sWidth != sRigWidth) { sRigWidth = sWidth; show_bw(sWidth); } sMode = rigCAT_getmode(); if (rigCAT_exit) continue; if (sMode.size() && sMode != sRigMode) { sRigMode = sMode; if (ModeIsLSB(sMode)) wf->USB(false); else wf->USB(true); show_mode(sMode); } if (xmlrig.use_pwrlevel) rigCAT_get_pwrlevel(); if (xmlrig.use_smeter) rigCAT_get_smeter(); if (xmlrig.use_notch) rigCAT_get_notch(); } else { if ( (trx_state == STATE_TUNE) || (trx_state == STATE_TX) ) if (xmlrig.use_pwrmeter) rigCAT_get_pwrmeter(); } } return NULL; } fldigi-4.1.06/src/rigcontrol/xmlrpc_rig.cxx0000644000175000017500000006471213472116000015630 00000000000000// ===================================================================== // // xmlrpc_rig.cxx // // connect to flrig xmlrpc server // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" LOG_FILE_SOURCE(debug::debug::LOG_XMLRPC_RIG); using namespace XmlRpc; using namespace std; static int xmlrpc_verbosity = 0; //====================================================================== // flrig xmlrpc client //====================================================================== pthread_t *flrig_thread = 0; pthread_mutex_t mutex_flrig = PTHREAD_MUTEX_INITIALIZER; void movFreq(Fl_Widget *w, void *d); void show_freq(void *); void flrig_get_vfo(); void flrig_get_frequency(); void post_mode(void *); void flrig_get_mode(); void post_modes(void *); void flrig_get_modes(); void post_bw(void *); void flrig_get_bw(); void post_bws(void *); void flrig_get_bws(); void flrig_get_notch(); void flrig_set_notch(int); bool flrig_get_xcvr(); void flrig_connection(); void set_ptt(); void connect_to_flrig(); XmlRpcClient *flrig_client = (XmlRpcClient *)0; //---------------------------------------------------------------------- // declared as extern in rigsupport.h //---------------------------------------------------------------------- bool connected_to_flrig = false; //---------------------------------------------------------------------- static bool bws_posted = false; static bool modes_posted = false; static bool freq_posted = true; static string xcvr_name; static string str_freq; static string mode_result; static XmlRpcValue modes_result; static XmlRpcValue bws_result; static XmlRpcValue bw_result; static XmlRpcValue notch_result; static double timeout = 2.0; static int wait_bws_timeout = 0; //====================================================================== void xmlrpc_rig_set_qsy(long long rfc) { set_flrig_freq(static_cast(rfc)); wf->rfcarrier(rfc); wf->movetocenter(); show_frequency(rfc); LOG_VERBOSE("set qsy: %d", (int)rfc); } //====================================================================== // set / get pairs //====================================================================== //---------------------------------------------------------------------- // push to talk //---------------------------------------------------------------------- static bool wait_ptt = false; // wait for transceiver to respond static int wait_ptt_timeout = 5; // 5 polls and then disable wait static int ptt_state = 0; static int new_ptt = -1; static int last_new_ptt = -1; void exec_flrig_ptt() { if (!connected_to_flrig) { new_ptt = -1; return; } XmlRpcValue val, result, result2; int resp, res; try { res = flrig_client->execute("rig.set_ptt", new_ptt, result, timeout); if (res) { for (int j = 0; j < 5; j++) { MilliSleep(100); res = flrig_client->execute("rig.get_ptt", XmlRpcValue(), result2, 10); if (res) { resp = int(result2); if (resp == new_ptt) { wait_ptt = true; wait_ptt_timeout = 10; ptt_state = new_ptt; LOG_VERBOSE("ptt %s in %d msec", ptt_state ? "ON" : "OFF", (j + 1)*50);//20); new_ptt = -1; return; } } } } } catch (...) { last_new_ptt = new_ptt; new_ptt = -1; wait_ptt = false; wait_ptt_timeout = 0; return; } wait_ptt = false; wait_ptt_timeout = 0; LOG_ERROR("fldigi/flrig PTT %s failure", new_ptt ? "ON" : "OFF"); last_new_ptt = new_ptt; new_ptt = -1; return; } void set_flrig_ptt(int on) { if (progdefaults.disable_CW_PTT && active_modem->get_mode() == MODE_CW && progStatus.nanoCW_online) return; guard_lock flrig_lock(&mutex_flrig); new_ptt = on; } pthread_mutex_t mutex_flrig_ptt = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_show_ptt(void *data) { guard_lock flrig_lock(&mutex_flrig_ptt); int on = reinterpret_cast(data); if (wf && (trx_state != STATE_TUNE)) { wf->xmtrcv->value(on); wf->xmtrcv->do_callback(); } } void flrig_get_ptt() { guard_lock flrig_lock(&mutex_flrig); try { XmlRpcValue result; if (flrig_client->execute("rig.get_ptt", XmlRpcValue(), result, timeout) ) { int val = int(result); if (!wait_ptt && (val != ptt_state)) { ptt_state = val; guard_lock flrig_lock(&mutex_flrig_ptt); Fl::awake(xmlrpc_rig_show_ptt, reinterpret_cast(val) ); LOG_VERBOSE("get_ptt: %s", ptt_state ? "ON" : "OFF"); } else if (wait_ptt && (val == ptt_state)) { wait_ptt = false; wait_ptt_timeout = 0; } else if (wait_ptt_timeout == 0) { wait_ptt = false; } else if (wait_ptt_timeout) { --wait_ptt_timeout; } } else { connected_to_flrig = false; wait_ptt = false; wait_ptt_timeout = 5; LOG_ERROR("%s", "get_ptt failed!"); } } catch (...) {} } //---------------------------------------------------------------------- // transceiver radio frequency //---------------------------------------------------------------------- static bool wait_freq = false; // wait for transceiver to respond static int wait_freq_timeout = 5; // 5 polls and then disable wait static long int xcvr_freq = 0; pthread_mutex_t mutex_flrig_freq = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_show_freq(void * fr) { guard_lock flrig_lock(&mutex_flrig_freq); if (!wf) return; long freq = reinterpret_cast(fr); wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); } void set_flrig_freq(long int fr) { if (!connected_to_flrig) return; guard_lock flrig_lock(&mutex_flrig); XmlRpcValue val, result; try { val = double(fr); if (!flrig_client->execute("rig.set_vfo", val, result, timeout)) { LOG_ERROR("%s", "rig.set_vfo failed"); wait_freq = false; wait_freq_timeout = 0; } else { wait_freq = true; wait_freq_timeout = 5; xcvr_freq = fr; Fl::awake(xmlrpc_rig_show_freq, reinterpret_cast(fr)); LOG_VERBOSE("set freq: %d", (int)fr); } } catch (...) {} } void flrig_get_frequency() { guard_lock flrig_lock(&mutex_flrig); XmlRpcValue result; try { if (!freq_posted) return; if (flrig_client->execute("rig.get_vfo", XmlRpcValue(), result, timeout) ) { str_freq = string(result); int fr = atoi(str_freq.c_str()); if (!wait_freq && (fr != xcvr_freq)) { xcvr_freq = fr; guard_lock flrig_lock(&mutex_flrig_freq); Fl::awake(xmlrpc_rig_show_freq, reinterpret_cast(fr)); LOG_VERBOSE("get freq: %d", fr); } else if (wait_freq && (fr == xcvr_freq)) { wait_freq = false; wait_freq_timeout = 0; } else if (wait_freq_timeout == 0) { wait_freq = false; } else if (wait_freq_timeout) --wait_freq_timeout; } else { connected_to_flrig = false; wait_freq = false; wait_freq_timeout = 5; LOG_ERROR("%s", "get freq failed"); } } catch (...) {} } //---------------------------------------------------------------------- // transceiver set / get mode // transceiver get modes (mode table) //---------------------------------------------------------------------- static bool wait_mode = false; // wait for transceiver to respond static int wait_mode_timeout = 5; // 5 polls and then disable wait static string posted_mode = ""; static bool wait_bw = false; // wait for transceiver to respond static int wait_bw_timeout = 5; // 5 polls and then disable wait static bool need_sideband = false; static string posted_bw = ""; static string posted_bw1 = ""; static string posted_bw2 = ""; void set_flrig_mode(const char *md) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { val = string(md); guard_lock flrig_lock(&mutex_flrig); if (!flrig_client->execute("rig.set_mode", val, result, timeout)) { LOG_ERROR("%s", "rig.set_mode failed"); wait_mode = false; wait_mode_timeout = 10; } else { posted_mode = md; need_sideband = true; bws_posted = false; wait_mode = true; wait_mode_timeout = 10; wait_bws_timeout = 5; qso_opBW->hide(); qso_opGROUP->hide(); LOG_VERBOSE("set mode: %s", md); } } catch (...) {} } pthread_mutex_t mutex_flrig_mode = PTHREAD_MUTEX_INITIALIZER; static bool xml_USB = true; bool xmlrpc_USB() { return xml_USB; } void xmlrpc_rig_post_mode(void *data) { guard_lock flrig_lock(&mutex_flrig_mode); if (!qso_opMODE) return; string *s = reinterpret_cast(data); qso_opMODE->value(s->c_str()); bws_posted = false; need_sideband = false; } void flrig_get_mode() { guard_lock flrig_lock(&mutex_flrig); XmlRpcValue res; try { if (flrig_client->execute("rig.get_mode", XmlRpcValue(), res, timeout) ) { static string md; md = string(res); bool posted = (md == posted_mode); if (!wait_mode && (!posted || need_sideband)) { posted_mode = md; guard_lock flrig_modelock(&mutex_flrig_mode); if (flrig_client->execute("rig.get_sideband", XmlRpcValue(), res, timeout) ) { static string sb; sb = string(res); xml_USB = (sb[0] == 'U'); } else { xml_USB = true; } if (posted) { need_sideband = false; return; } Fl::awake(xmlrpc_rig_post_mode, reinterpret_cast(&md)); LOG_VERBOSE("get mode: %s:%s", md.c_str(), xml_USB ? "USB" : "LSB"); } else if (wait_mode && posted) { wait_mode = false; wait_mode_timeout = 0; } else if (wait_mode_timeout == 0) { wait_mode = false; } else if (wait_mode_timeout) --wait_mode_timeout; } else { connected_to_flrig = false; wait_mode = false; wait_freq_timeout = 0; LOG_ERROR("%s", "get mode failed"); } } catch (...) {} } pthread_mutex_t mutex_flrig_modes = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_post_modes(void *) { guard_lock flrig_lock(&mutex_flrig_modes); if (!qso_opMODE) return; int nargs = modes_result.size(); qso_opMODE->clear(); if (nargs == 0) { qso_opMODE->add(""); qso_opMODE->index(0); qso_opMODE->deactivate(); return; } std::string smodes; for (int i = 0; i < nargs; i++) smodes.append(string(modes_result[i])).append("|"); qso_opMODE->add(smodes.c_str()); qso_opMODE->index(0); qso_opMODE->activate(); modes_posted = true; bws_posted = false; } void flrig_get_modes() { guard_lock flrig_lock(&mutex_flrig); try { if (flrig_client->execute("rig.get_modes", XmlRpcValue(), modes_result, timeout) ) { guard_lock flrig_lock(&mutex_flrig_modes); Fl::awake(xmlrpc_rig_post_modes); posted_mode = posted_bw = posted_bw1 = posted_bw2 = "GETME"; { int nargs = modes_result.size(); static string debugstr; debugstr.assign("Mode table: "); for (int i = 0; i < nargs - 1; i++) debugstr.append(modes_result[i]).append(","); debugstr.append(modes_result[nargs-1]); LOG_VERBOSE("%s", debugstr.c_str()); } } else { LOG_ERROR("%s", "get modes failed"); } } catch (...) {} } //---------------------------------------------------------------------- // transceiver get / set bandwidth // transceiver get bandwidth table //---------------------------------------------------------------------- void set_flrig_bw(int bw2, int bw1) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { int ival = bw2; if (bw1 > -1) ival = 256*(bw1+128) + bw2; val = ival; guard_lock flrig_lock(&mutex_flrig); LOG_VERBOSE("set_flrig_bw %04X", ival); if (!flrig_client->execute("rig.set_bw", val, result, timeout)) { LOG_ERROR("%s", "rig.set_bw failed"); wait_bw = false; wait_bw_timeout = 0; } else { wait_bw = true; wait_bw_timeout = 5; } } catch (...) {} } pthread_mutex_t mutex_flrig_bw = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_post_bw(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW) return; if (posted_bw != (std::string)(qso_opBW->value())) { qso_opBW->value(posted_bw);//.c_str()); qso_opBW->redraw(); LOG_VERBOSE("Update BW %s", posted_bw.c_str()); std::cout << "Update BW " << posted_bw << std::endl; } qso_opBW->show(); } void xmlrpc_rig_post_bw1(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW1) return; if (posted_bw1 != (std::string)(qso_opBW1->value())) { qso_opBW1->value(posted_bw1);//.c_str()); qso_opBW1->redraw(); LOG_VERBOSE("Update combo BW1 %s", posted_bw1.c_str()); } qso_opGROUP->show(); } void xmlrpc_rig_post_bw2(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW2) return; if (posted_bw2 != (std::string)(qso_opBW2->value())) { qso_opBW2->value(posted_bw2);//.c_str()); qso_opBW2->redraw(); LOG_VERBOSE("Update combo BW2 %s", posted_bw2.c_str()); } qso_opGROUP->show(); } void do_flrig_get_bw() { guard_lock flrig_lock(&mutex_flrig); XmlRpcValue res; try { if (flrig_client->execute("rig.get_bw", XmlRpcValue(), res, timeout) ) { static string s1; static string s2; s2 = string(res[0]); s1 = string(res[1]); if (!s1.empty()) { posted_bw1 = s1; Fl::awake(xmlrpc_rig_post_bw1); posted_bw2 = s2; Fl::awake(xmlrpc_rig_post_bw2); } else { if (!s2.empty()) { posted_bw = s2; Fl::awake(xmlrpc_rig_post_bw); } } wait_bw_timeout = 0; } else { connected_to_flrig = false; wait_bw_timeout = 0; LOG_ERROR("%s", "get bw failed!"); } } catch (...) { } } void flrig_get_bw() { if (wait_bw_timeout) { wait_bw_timeout--; return; } do_flrig_get_bw(); } pthread_mutex_t mutex_flrig_bws = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_post_bws(void *) { if (!qso_opBW) return; int nargs; try { // two BW controls nargs = bws_result[1].size(); static string bwstr; qso_opBW1->clear(); for (int i = 1; i < nargs; i++) { bwstr = string(bws_result[1][i]); qso_opBW1->add(bwstr.c_str()); } string labels1 = bws_result[1][0]; static char btn1_label[2]; btn1_label[0] = labels1[0]; btn1_label[1] = 0; qso_btnBW1->label(btn1_label); qso_btnBW1->redraw_label(); qso_btnBW1->redraw(); static char tooltip1[20]; snprintf(tooltip1,sizeof(tooltip1),"%s",labels1.substr(2).c_str()); qso_opBW1->tooltip(tooltip1); qso_opBW1->index(0); qso_opBW1->redraw(); { static string debugstr; debugstr.assign("\nBW1 table: "); for (int i = 1; i < nargs-1; i++) debugstr.append(string(bws_result[1][i])).append(", "); debugstr.append(string(bws_result[1][nargs - 1])).append("\n"); debugstr.append(labels1); LOG_VERBOSE("%s", debugstr.c_str()); } try { nargs = bws_result[0].size(); static string bwstr; qso_opBW2->clear(); for (int i = 1; i < nargs; i++) { bwstr = string(bws_result[0][i]); qso_opBW2->add(bwstr.c_str()); } string labels2 = bws_result[0][0]; static char btn2_label[2]; btn2_label[0] = labels2[0]; btn2_label[1] = 0; qso_btnBW2->label(btn2_label); qso_btnBW2->redraw_label(); qso_btnBW2->redraw(); static char tooltip2[20]; snprintf(tooltip2,sizeof(tooltip2),"%s",labels2.substr(2).c_str()); qso_opBW2->tooltip(tooltip2); qso_opBW2->index(0); qso_opBW2->redraw(); { static string debugstr; debugstr.assign("\nBW2 table: "); for (int i = 1; i < nargs-1; i++) debugstr.append(string(bws_result[0][i])).append(", "); debugstr.append(string(bws_result[0][nargs - 1])).append("\n"); debugstr.append(labels2); LOG_VERBOSE("%s", debugstr.c_str()); } } catch ( XmlRpcException err) { bws_posted = false; return; } qso_opBW->hide(); bws_posted = true; return; } catch (XmlRpcException err) { try { // one BW control nargs = bws_result[0].size(); string bwstr; qso_opBW->clear(); for (int i = 1; i < nargs; i++) { bwstr.append(string(bws_result[0][i])).append("|"); } qso_opBW->add(bwstr.c_str()); qso_opBW->index(0); qso_opBW->activate(); qso_opBW->tooltip("xcvr bandwidth"); qso_opGROUP->hide(); { static string debugstr; debugstr.assign("BW table: "); for (int i = 1; i < nargs-1; i++) debugstr.append(string(bws_result[0][i])).append(", "); debugstr.append(string(bws_result[0][nargs - 1])); LOG_VERBOSE("%s", debugstr.c_str()); } } catch (XmlRpcException err) { LOG_ERROR("%s", "no bandwidths specified"); qso_opBW->add(""); qso_opBW->index(0); qso_opBW->deactivate(); return; } } bws_posted = true; do_flrig_get_bw(); } void flrig_get_bws() { if (bws_posted) return; if (wait_bws_timeout) { wait_bws_timeout--; return; } XmlRpcValue result; try { if (flrig_client->execute("rig.get_bws", XmlRpcValue(), bws_result, timeout) ) { bws_posted = false; wait_bw = true; wait_bw_timeout = 5; posted_bw.clear(); Fl::awake(xmlrpc_rig_post_bws); } else { LOG_ERROR("%s", "get bws failed"); } } catch (...) {} } //---------------------------------------------------------------------- // transceiver get / set vfo A / B //---------------------------------------------------------------------- void set_flrig_ab(int n) { // if (n) btn_vfoA->clear(); // else btn_vfoB->clear(); // if (!connected_to_flrig) return; // XmlRpcValue val = string(n == 0 ? "A" : "B"); // XmlRpcValue result; // guard_lock flrig_lock(&mutex_flrig); // if (!flrig_client->execute("rig.set_AB", val, result, timeout)) // printf("rig.set_mode failed\n"); // else { // skip = 2; // } // return; } void show_A(void *) { // btn_vfoA->set(); // btn_vfoB->clear(); } void show_B(void *) { // btn_vfoA->clear(); // btn_vfoB->set(); } void flrig_get_vfo() { guard_lock flrig_lock(&mutex_flrig); XmlRpcValue result; try { if (flrig_client->execute("rig.get_AB", XmlRpcValue(), result, timeout) ) { // string str_vfo = string(result[0]); // if (str_vfo == "A" && !btn_vfoA->value()) REQ(FLRIG_show_A); // else if (str_vfo == "B" && !btn_vfoB->value()) REQ(FLRIG_show_B); } else { connected_to_flrig = false; } } catch (...) {} } //============================================================================== // transceiver set / get notch //============================================================================== static bool wait_notch = false; // wait for transceiver to respond static int wait_notch_timeout = 5; // 5 polls and then disable wait static int xcvr_notch = 0; void set_flrig_notch() { if (!connected_to_flrig) return; guard_lock flrig_lock(&mutex_flrig); XmlRpcValue val, result; try { val = (double)(notch_frequency); if (flrig_client->execute("rig.set_notch", val, result, timeout)) { wait_notch = true; wait_notch_timeout = 5; xcvr_notch = notch_frequency; } else { LOG_ERROR("%s", "rig.set_notch failed"); wait_notch = 0; wait_notch_timeout = 0; xcvr_notch = 0; } } catch (...) {} } void flrig_get_notch() { guard_lock flrig_lock(&mutex_flrig); try { if (flrig_client->execute("rig.get_notch", XmlRpcValue(), notch_result, timeout) ) { int nu_notch = (int)(notch_result); if (nu_notch != notch_frequency) { notch_frequency = nu_notch; } bool posted = (nu_notch == xcvr_notch); if (!wait_notch && !posted) { xcvr_notch = nu_notch; notch_frequency = nu_notch; } else if (wait_notch && posted) { wait_notch = false; wait_notch_timeout = 0; } else if (wait_notch_timeout == 0) { wait_notch = false; } else if (wait_notch_timeout) --wait_notch_timeout; } else { wait_notch = false; wait_notch_timeout = 0; } } catch (...) {} } //============================================================================== // transceiver get smeter // transceiver get power meter //============================================================================== pthread_mutex_t mutex_flrig_smeter = PTHREAD_MUTEX_INITIALIZER; static void xmlrpc_rig_set_smeter(void *data) { guard_lock flrig_lock(&mutex_flrig_smeter); if (!smeter && !pwrmeter) return; if (smeter && progStatus.meters) { if (!smeter->visible()) { pwrmeter->hide(); smeter->show(); } int val = reinterpret_cast(data); smeter->value(val); } } void flrig_get_smeter() { XmlRpcValue val, result; try { if (flrig_client->execute("rig.get_smeter", val, result, timeout)) { int val = (int)(result); guard_lock flrig_lock(&mutex_flrig_smeter); Fl::awake(xmlrpc_rig_set_smeter, reinterpret_cast(val)); } } catch (...) {} } pthread_mutex_t mutex_flrig_pwrmeter = PTHREAD_MUTEX_INITIALIZER; static void xmlrpc_rig_set_pwrmeter(void *data) { guard_lock flrig_lock(&mutex_flrig_pwrmeter); if (!smeter && !pwrmeter) return; if (pwrmeter && progStatus.meters) { if (!pwrmeter->visible()) { smeter->hide(); pwrmeter->show(); } int val = reinterpret_cast(data); pwrmeter->value(val); } } void flrig_get_pwrmeter() { XmlRpcValue val, result; try { if (flrig_client->execute("rig.get_pwrmeter", val, result, timeout)) { int val = (int)(result); guard_lock flrig_lock(&mutex_flrig_pwrmeter); Fl::awake(xmlrpc_rig_set_pwrmeter, reinterpret_cast(val)); } } catch (...) {} } //============================================================================== // transceiver get name //============================================================================== static void xmlrpc_rig_show_xcvr_name(void *) { xcvr_title = xcvr_name; setTitle(); } static void no_rig_init(void *) { init_NoRig_RigDialog(); } bool flrig_get_xcvr() { XmlRpcValue result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_xcvr", XmlRpcValue(), result, timeout); } if (ret) { string nuxcvr = string(result); if (nuxcvr != xcvr_name) { xcvr_name = nuxcvr; modes_posted = false; bws_posted = false; flrig_get_modes(); flrig_get_bws(); flrig_get_mode(); flrig_get_bw(); Fl::awake(xmlrpc_rig_show_xcvr_name); } return true; } else { if (xcvr_name != "") { xcvr_name = ""; Fl::awake(xmlrpc_rig_show_xcvr_name); Fl::awake(no_rig_init); } connected_to_flrig = false; } } catch (XmlRpcException *err) { if (xcvr_name != "") { xcvr_name = ""; Fl::awake(xmlrpc_rig_show_xcvr_name); Fl::awake(no_rig_init); } connected_to_flrig = false; } return false; } //====================================================================== // xmlrpc read polling thread //====================================================================== static bool run_flrig_thread = true; static int poll_interval = 100; // 1 second //---------------------------------------------------------------------- // Set QSY to true if xmlrpc client connection is OK //---------------------------------------------------------------------- void flrig_setQSY(void *) { if (!wf) return; wf->setQSY(true); } void flrig_connection() { XmlRpcValue noArgs, result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("system.listMethods", noArgs, result, timeout); } if (ret) { int nargs = result.size(); string method_str = "\nMethods:\n"; for (int i = 0; i < nargs; i++) method_str.append(" ").append(result[i]).append("\n"); LOG_VERBOSE("%s", method_str.c_str()); connected_to_flrig = true; poll_interval = 20; // every 200 msec flrig_get_xcvr(); Fl::awake(flrig_setQSY); } else { LOG_VERBOSE("%s", "Waiting for flrig"); connected_to_flrig = false; poll_interval = 500; // every 5 seconds } } catch (...) { LOG_ERROR("%s", "failure in flrig_client"); } } void connect_to_flrig() { XmlRpc::setVerbosity(xmlrpc_verbosity); if (flrig_client) { delete flrig_client; flrig_client = (XmlRpcClient *)0; } try { flrig_client = new XmlRpcClient( progdefaults.flrig_ip_address.c_str(), atol(progdefaults.flrig_ip_port.c_str())); LOG_VERBOSE("created flrig xmlrpc client %s, %ld", progdefaults.flrig_ip_address.c_str(), atol(progdefaults.flrig_ip_port.c_str())); flrig_connection(); } catch (...) { LOG_ERROR("Cannot create flrig xmlrpc client %s, %s", progdefaults.flrig_ip_address.c_str(), progdefaults.flrig_ip_port.c_str()); } } void * flrig_thread_loop(void *d) { while(run_flrig_thread) { for (int i = 0; i < poll_interval; i++) { if (!run_flrig_thread) { // LOG_VERBOSE("Exiting thread - 1"); return NULL; } MilliSleep(10); } if (!run_flrig_thread) break; if (progdefaults.fldigi_client_to_flrig) { if (!flrig_client) connect_to_flrig(); if (!connected_to_flrig) flrig_connection(); else if (flrig_get_xcvr()) { if (new_ptt > -1) { exec_flrig_ptt(); continue; } if (progdefaults.flrig_keys_modem) flrig_get_ptt(); if (trx_state == STATE_RX) { flrig_get_frequency(); flrig_get_smeter(); flrig_get_notch(); if (!modes_posted) flrig_get_modes(); if (modes_posted) flrig_get_mode(); if (!bws_posted) flrig_get_bws(); else if (bws_posted) flrig_get_bw(); } else flrig_get_pwrmeter(); } } } // LOG_VERBOSE("Exiting thread - 2"); return NULL; } void FLRIG_start_flrig_thread() { flrig_thread = new pthread_t; poll_interval = 100; if (pthread_create(flrig_thread, NULL, flrig_thread_loop, NULL)) { LOG_ERROR("%s", "flrig_thread create"); exit(EXIT_FAILURE); } } void stop_flrig_thread() { if (!flrig_client) return; LOG_VERBOSE("%s", "stopping flrig thread"); flrig_client->close(); pthread_mutex_lock(&mutex_flrig); run_flrig_thread = false; pthread_mutex_unlock(&mutex_flrig); pthread_join(*flrig_thread, NULL); LOG_VERBOSE("%s", "flrig thread closed"); } void reconnect_to_flrig() { flrig_client->close(); pthread_mutex_lock(&mutex_flrig); delete flrig_client; flrig_client = (XmlRpcClient *)0; connected_to_flrig = false; pthread_mutex_unlock(&mutex_flrig); } void xmlrpc_send_command(std::string cmd) { if (!connected_to_flrig) return; guard_lock flrig_lock(&mutex_flrig); XmlRpcValue val, result; try { val = string(cmd); if (!flrig_client->execute("rig.cat_string", val, result, timeout)) { LOG_ERROR("%s", "rig.cat_string failed"); } else { LOG_VERBOSE("rig.cat_string: %s", cmd.c_str()); } } catch (...) {} } fldigi-4.1.06/src/dxcluster/0000775000175000017500000000000013515625030012647 500000000000000fldigi-4.1.06/src/dxcluster/dx_dialog.fl0000644000175000017500000004202213472115772015053 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include "Fl_Text_Buffer_mod.H"} {private local } decl {Fl_Text_Buffer_mod telnet_txt_buffer;} {private local } decl {Fl_Text_Buffer_mod telnet_view_buffer;} {private local } decl {\#include "configuration.h"} {private local } decl {\#include "dx_cluster.h"} {private local } Function {dxc_window()} {open } { Fl_Window {} { label {DX Cluster Spotting} open xywh {902 41 680 400} type Double resizable visible } { Fl_Group btn_select_host {open xywh {1 2 678 50} box ENGRAVED_BOX } { Fl_Input inp_dxcc_host_url { label {DX HOST hostname/IP} callback {progdefaults.dxcc_host_url=o->value(); progdefaults.changed = true;} tooltip {telnet server URL} xywh {6 25 256 22} align 5 code0 {\#include "flinput2.h"} code1 {o->value(progdefaults.dxcc_host_url.c_str());} class Fl_Input2 } Fl_Button btn_show_host_tab { label {@2>} callback {cluster_tabs->value(tabDXclusterConfig); cluster_tabs->redraw();} xywh {263 25 20 22} } Fl_Input inp_dccc_host_port { label Port callback {progdefaults.dxcc_host_port=o->value(); progdefaults.changed = true;} tooltip {telnet server port} xywh {285 25 50 22} align 5 code1 {o->value(progdefaults.dxcc_host_port.c_str());} class Fl_Input2 } Fl_Input inp_dccc_login { label {Login as} callback {progdefaults.dxcc_login=o->value(); progdefaults.changed = true;} tooltip {login call sign} xywh {336 25 80 22} align 5 code1 {o->value(progdefaults.dxcc_login.c_str());} class Fl_Input2 } Fl_Input inp_dxcc_password { label Password callback {progdefaults.dxcc_password = o->value();} tooltip {Your login password} xywh {420 25 80 22} align 5 code0 {o->value(progdefaults.dxcc_password.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inp_dxcc_password->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnDXCLUSTERpasswordShow { label {?} callback {inp_dxcc_password->type(inp_dxcc_password->type() ^ FL_SECRET_INPUT); inp_dxcc_password->redraw();} tooltip {Show password in plain text} xywh {503 25 22 22} } Fl_Check_Button btn_dxcc_connect { label Connect callback {progStatus.cluster_connected=o->value(); DXcluster_connect(o->value());} tooltip {Connect / Disconnect} xywh {571 10 101 15} down_box DOWN_BOX code0 {o->value(progStatus.cluster_connected);} code1 {\#include "status.h"} } Fl_Box lbl_dxc_connected { tooltip {Connected State} xywh {540 17 20 20} box DIAMOND_DOWN_BOX color 55 align 8 } Fl_Check_Button btn_dxc_auto_connect { label {Auto conn'} callback {progdefaults.dxc_auto_connect = o->value(); progdefaults.changed = true;} tooltip {Connect to host when starting fldigi} xywh {571 31 101 15} down_box DOWN_BOX code0 {o->value(progdefaults.dxc_auto_connect);} } } Fl_Tabs cluster_tabs {open xywh {0 55 680 340} resizable } { Fl_Group tabDXclusterTelNetStream { label {TelNet stream} open selected xywh {1 80 677 314} } { Fl_Group {} {open xywh {2 82 676 276} box ENGRAVED_FRAME } { Fl_Text_Editor brws_tcpip_stream { tooltip {Cluster server command strings} xywh {4 85 668 240} labelsize 13 textfont 13 resizable code0 {\#include "FTextView.h"} class FTextView } Fl_Button dxc_macro_1 { label m1 callback dxc_click_m1 tooltip {DX cluster macro\\nLeft click execute\\nRight click edit} xywh {4 331 80 22} code0 {o->label(progdefaults.dxcm_label_1.c_str());} } Fl_Button dxc_macro_2 { label m2 callback dxc_click_m2 xywh {88 331 80 22} code0 {o->label(progdefaults.dxcm_label_2.c_str());} } Fl_Button dxc_macro_3 { label m3 callback dxc_click_m3 xywh {172 331 80 22} code0 {o->label(progdefaults.dxcm_label_3.c_str());} } Fl_Button dxc_macro_4 { label m4 callback dxc_click_m4 xywh {256 331 80 22} code0 {o->label(progdefaults.dxcm_label_4.c_str());} } Fl_Button dxc_macro_5 { label m5 callback dxc_click_m5 xywh {340 331 80 22} code0 {o->label(progdefaults.dxcm_label_5.c_str());} } Fl_Button dxc_macro_6 { label m6 callback dxc_click_m6 xywh {424 331 80 22} code0 {o->label(progdefaults.dxcm_label_6.c_str());} } Fl_Button dxc_macro_7 { label m7 callback dxc_click_m7 xywh {508 331 80 22} code0 {o->label(progdefaults.dxcm_label_7.c_str());} } Fl_Button dxc_macro_8 { label m8 callback dxc_click_m8 tooltip {DX cluster macro\\nLeft click execute\\nRight click edit} xywh {592 331 80 22} code0 {o->label(progdefaults.dxcm_label_8.c_str());} } } Fl_Input inp_dxcluster_cmd { label {Cmd:} callback {DXcluster_submit();} tooltip {Command string} xywh {43 364 480 22} labelsize 13 when 8 class Fl_Input2 } Fl_Button btn_cluster_spot { label Spot callback {send_DXcluster_spot();} tooltip {Send SPOT string to server} xywh {527 364 70 22} } Fl_Button btn_cluster_submit { label Submit callback {DXcluster_submit();} tooltip {Send command to server} xywh {602 364 70 22} } } Fl_Group tabDXclusterReports { label {DX Reports} open xywh {1 80 673 314} hide } { Fl_Browser reports_header { xywh {3 84 671 20} color 52 when 2 textfont 4 } Fl_Browser brws_dx_cluster { callback {DXcluster_select();} tooltip {Left Click to select SPOT} xywh {3 104 671 260} type Hold align 18 textfont 4 resizable } Fl_Button btn_dxc_cluster_clear { label Clear callback {brws_dx_cluster->clear();} tooltip {Clear parsed data stream} xywh {294 366 72 22} } Fl_Check_Button brws_order { label {New entries in first line} callback {progdefaults.dxc_topline = o->value(); dxc_lines(); progdefaults.changed=true;} xywh {31 371 186 15} down_box DOWN_BOX when 1 code0 {o->value(progdefaults.dxc_topline);} } Fl_Button btn_cluster_spot2 { label Spot callback {send_DXcluster_spot();} tooltip {Send SPOT string to server} xywh {585 368 70 22} } } Fl_Group tabDXclusterConfig { label Config open tooltip {Initialization strings for telnet cluster host} xywh {0 80 676 314} hide } { Fl_Group {} {open xywh {0 82 676 130} resizable } { Fl_Group {} {open xywh {1 82 348 124} } { Fl_Browser brws_dxcluster_hosts { label Hosts xywh {5 100 278 100} type Hold align 1 textfont 4 resizable code0 {static int widths[]={o->w()*6/10, o->w()*2/10, o->w()*2/10, 0 };} code1 {o->column_widths(widths);} code2 {o->column_char(':');} code3 {dxcluster_hosts_load();} } Fl_Group {} {open xywh {286 100 61 100} } { Fl_Button btn_dxcluster_hosts_select { label Select callback dxcluster_hosts_select tooltip {Select highlighted DX cluster host} xywh {290 106 54 19} } Fl_Button btn_dxcluster_hosts_add { label Add callback dxcluster_hosts_add tooltip {Add current DX cluster host} xywh {290 128 54 19} } Fl_Button btn_dxcluster_hosts_delete { label Delete callback dxcluster_hosts_delete tooltip {Delete highlighted DX cluster host} xywh {290 151 54 19} } Fl_Button btn_dxcluster_servers { label Srvrs callback dxcluster_servers tooltip {Server List} xywh {290 174 54 19} } Fl_Group {} {open xywh {290 195 54 2} resizable } {} } } Fl_Group {} {open xywh {350 82 325 103} } { Fl_Text_Editor ed_telnet_cmds { label {Cluster Server Setup Cmds} tooltip {Cluster server command strings} xywh {354 100 248 80} textfont 13 resizable class FTextEdit } Fl_Group {} {open xywh {606 100 59 82} } { Fl_Button btn_dxcluster_hosts_load_setup { label Load callback dxcluster_hosts_load_setup tooltip {Load Cluster Setup Commands} xywh {610 106 54 19} } Fl_Button btn_dxcluster_hosts_save_setup { label Save callback dxcluster_hosts_save_setup tooltip {Save Cluster Setup Commands} xywh {610 128 54 19} } Fl_Button btn_dxcluster_hosts_send_setup { label Send callback dxcluster_hosts_send_setup tooltip {Send Commands to Cluster Server} xywh {610 151 54 19} } Fl_Group {} {open xywh {610 174 54 2} resizable } {} } } Fl_Check_Button btn_spot_when_logged { label {Spot when logged} callback {progdefaults.spot_when_logged = o->value(); progdefaults.changed = true;} tooltip {Create DX spot when logging contact} xywh {354 188 146 15} down_box DOWN_BOX code0 {o->value(progdefaults.spot_when_logged);} } Fl_Check_Button btn_dxc_hertz { label {Report [0..99 Hz]} callback {progdefaults.dxc_hertz = o->value(); progdefaults.changed = true;} tooltip {Add [0..99] Hz WF value to DX report notes} xywh {512 188 146 15} down_box DOWN_BOX code0 {o->value(progdefaults.dxc_hertz);} } } Fl_Group {} {open xywh {0 218 676 174} align 17 } { Fl_Group {} {open xywh {1 218 307 170} } { Fl_Input mlabel_1 { label {label 1} callback {progdefaults.dxcm_label_1=o->value(); dxc_macro_1->label(progdefaults.dxcm_label_1.c_str()); progdefaults.changed=true;} xywh {5 238 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_1.c_str());} } Fl_Input mtext_1 { label {macro text} callback {progdefaults.dxcm_text_1=o->value(); progdefaults.changed=true;} xywh {87 238 220 22} align 1 code0 {o->value(progdefaults.dxcm_text_1.c_str());} class Fl_Input2 } Fl_Input mlabel_2 { label {label 2} callback {progdefaults.dxcm_label_2=o->value(); dxc_macro_2->label(progdefaults.dxcm_label_2.c_str()); progdefaults.changed=true;} xywh {5 278 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_2.c_str());} } Fl_Input mtext_2 { callback {progdefaults.dxcm_text_2=o->value(); progdefaults.changed=true;} xywh {87 278 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_2.c_str());} class Fl_Input2 } Fl_Input mlabel_3 { label {label 3} callback {progdefaults.dxcm_label_3=o->value(); dxc_macro_3->label(progdefaults.dxcm_label_3.c_str()); progdefaults.changed=true;} xywh {5 318 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_3.c_str());} } Fl_Input mtext_3 { callback {progdefaults.dxcm_text_3=o->value(); progdefaults.changed=true;} xywh {87 318 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_3.c_str());} class Fl_Input2 } Fl_Input mlabel_4 { label {label 4} callback {progdefaults.dxcm_label_4=o->value(); dxc_macro_4->label(progdefaults.dxcm_label_4.c_str()); progdefaults.changed=true;} xywh {5 358 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_4.c_str());} } Fl_Input mtext_4 { callback {progdefaults.dxcm_text_4=o->value(); progdefaults.changed=true;} xywh {87 358 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_4.c_str());} class Fl_Input2 } } Fl_Group {} {open xywh {308 218 307 170} } { Fl_Input mlabel_5 { label {label 5} callback {progdefaults.dxcm_label_5=o->value(); dxc_macro_5->label(progdefaults.dxcm_label_5.c_str()); progdefaults.changed=true;} xywh {310 237 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_5.c_str());} } Fl_Input mtext_5 { label {macro text} callback {progdefaults.dxcm_text_5=o->value(); progdefaults.changed=true;} xywh {391 237 220 22} align 1 code0 {o->value(progdefaults.dxcm_text_5.c_str());} class Fl_Input2 } Fl_Input mlabel_6 { label {label 6} callback {progdefaults.dxcm_label_6=o->value(); dxc_macro_6->label(progdefaults.dxcm_label_6.c_str()); progdefaults.changed=true;} xywh {310 277 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_6.c_str());} } Fl_Input mtext_6 { callback {progdefaults.dxcm_text_6=o->value(); progdefaults.changed=true;} xywh {391 277 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_6.c_str());} class Fl_Input2 } Fl_Input mlabel_7 { label {label 7} callback {progdefaults.dxcm_label_7=o->value(); dxc_macro_7->label(progdefaults.dxcm_label_7.c_str()); progdefaults.changed=true;} xywh {310 317 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_7.c_str());} } Fl_Input mtext_7 { callback {progdefaults.dxcm_text_7=o->value(); progdefaults.changed=true;} xywh {391 317 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_7.c_str());} class Fl_Input2 } Fl_Input mlabel_8 { label {label 8} callback {progdefaults.dxcm_label_8=o->value(); dxc_macro_8->label(progdefaults.dxcm_label_8.c_str()); progdefaults.changed=true;} xywh {310 357 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_8.c_str());} } Fl_Input mtext_8 { callback {progdefaults.dxcm_text_8=o->value(); progdefaults.changed=true;} xywh {391 357 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_8.c_str());} class Fl_Input2 } } Fl_Button btn_dxcluster_ar_help { label {AR ?} callback dxcluster_ar_help tooltip {AR Commands} xywh {618 230 56 22} } Fl_Button btn_dxcluster_cc_help { label {CC ?} callback dxcluster_cc_help tooltip {CC Commands} xywh {618 272 56 22} } Fl_Button btn_dxcluster_dx_help { label {DX ?} callback dxcluster_dx_help tooltip {Spider Commands} xywh {618 315 56 22} } } } Fl_Group tabDXclusterHelp { label Help open xywh {1 80 675 314} hide } { Fl_Text_Editor brws_dxc_help { tooltip {Cluster server command strings} xywh {3 84 673 281} labelsize 13 textfont 13 resizable class FTextView } Fl_Button btn_dxc_help_query { label {Get Help} callback {dxc_help_query();} tooltip {Get WWV sunspot events} xywh {441 368 70 22} } Fl_Input inp_help_string { label {Help on:} callback {dxc_help_query();} tooltip {Leave blank for general help Enter subject, e.g. DX} xywh {265 368 172 22} labelsize 13 when 8 class Fl_Input2 } Fl_Button btn_dxc_help_clear { label Clear callback {dxc_help_clear()} tooltip {Clear help panel} xywh {517 368 71 22} } } } } } fldigi-4.1.06/src/dxcluster/dx_dialog.cxx0000644000175000017500000010660313511722452015253 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "gettext.h" #include "dx_dialog.h" #include "Fl_Text_Buffer_mod.H" static Fl_Text_Buffer_mod telnet_txt_buffer; static Fl_Text_Buffer_mod telnet_view_buffer; #include "configuration.h" #include "dx_cluster.h" Fl_Group *btn_select_host=(Fl_Group *)0; Fl_Input2 *inp_dxcc_host_url=(Fl_Input2 *)0; static void cb_inp_dxcc_host_url(Fl_Input2* o, void*) { progdefaults.dxcc_host_url=o->value(); progdefaults.changed = true; } Fl_Button *btn_show_host_tab=(Fl_Button *)0; static void cb_btn_show_host_tab(Fl_Button*, void*) { cluster_tabs->value(tabDXclusterConfig); cluster_tabs->redraw(); } Fl_Input2 *inp_dccc_host_port=(Fl_Input2 *)0; static void cb_inp_dccc_host_port(Fl_Input2* o, void*) { progdefaults.dxcc_host_port=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_dccc_login=(Fl_Input2 *)0; static void cb_inp_dccc_login(Fl_Input2* o, void*) { progdefaults.dxcc_login=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_dxcc_password=(Fl_Input2 *)0; static void cb_inp_dxcc_password(Fl_Input2* o, void*) { progdefaults.dxcc_password = o->value(); } Fl_Button *btnDXCLUSTERpasswordShow=(Fl_Button *)0; static void cb_btnDXCLUSTERpasswordShow(Fl_Button*, void*) { inp_dxcc_password->type(inp_dxcc_password->type() ^ FL_SECRET_INPUT); inp_dxcc_password->redraw(); } Fl_Check_Button *btn_dxcc_connect=(Fl_Check_Button *)0; static void cb_btn_dxcc_connect(Fl_Check_Button* o, void*) { progStatus.cluster_connected=o->value(); DXcluster_connect(o->value()); } Fl_Box *lbl_dxc_connected=(Fl_Box *)0; Fl_Check_Button *btn_dxc_auto_connect=(Fl_Check_Button *)0; static void cb_btn_dxc_auto_connect(Fl_Check_Button* o, void*) { progdefaults.dxc_auto_connect = o->value(); progdefaults.changed = true; } Fl_Tabs *cluster_tabs=(Fl_Tabs *)0; Fl_Group *tabDXclusterTelNetStream=(Fl_Group *)0; FTextView *brws_tcpip_stream=(FTextView *)0; Fl_Button *dxc_macro_1=(Fl_Button *)0; Fl_Button *dxc_macro_2=(Fl_Button *)0; Fl_Button *dxc_macro_3=(Fl_Button *)0; Fl_Button *dxc_macro_4=(Fl_Button *)0; Fl_Button *dxc_macro_5=(Fl_Button *)0; Fl_Button *dxc_macro_6=(Fl_Button *)0; Fl_Button *dxc_macro_7=(Fl_Button *)0; Fl_Button *dxc_macro_8=(Fl_Button *)0; Fl_Input2 *inp_dxcluster_cmd=(Fl_Input2 *)0; static void cb_inp_dxcluster_cmd(Fl_Input2*, void*) { DXcluster_submit(); } Fl_Button *btn_cluster_spot=(Fl_Button *)0; static void cb_btn_cluster_spot(Fl_Button*, void*) { send_DXcluster_spot(); } Fl_Button *btn_cluster_submit=(Fl_Button *)0; static void cb_btn_cluster_submit(Fl_Button*, void*) { DXcluster_submit(); } Fl_Group *tabDXclusterReports=(Fl_Group *)0; Fl_Browser *reports_header=(Fl_Browser *)0; Fl_Browser *brws_dx_cluster=(Fl_Browser *)0; static void cb_brws_dx_cluster(Fl_Browser*, void*) { DXcluster_select(); } Fl_Button *btn_dxc_cluster_clear=(Fl_Button *)0; static void cb_btn_dxc_cluster_clear(Fl_Button*, void*) { brws_dx_cluster->clear(); } Fl_Check_Button *brws_order=(Fl_Check_Button *)0; static void cb_brws_order(Fl_Check_Button* o, void*) { progdefaults.dxc_topline = o->value(); dxc_lines(); progdefaults.changed=true; } Fl_Button *btn_cluster_spot2=(Fl_Button *)0; static void cb_btn_cluster_spot2(Fl_Button*, void*) { send_DXcluster_spot(); } Fl_Group *tabDXclusterConfig=(Fl_Group *)0; Fl_Browser *brws_dxcluster_hosts=(Fl_Browser *)0; Fl_Button *btn_dxcluster_hosts_select=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_add=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_delete=(Fl_Button *)0; Fl_Button *btn_dxcluster_servers=(Fl_Button *)0; FTextEdit *ed_telnet_cmds=(FTextEdit *)0; Fl_Button *btn_dxcluster_hosts_load_setup=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_save_setup=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_send_setup=(Fl_Button *)0; Fl_Check_Button *btn_spot_when_logged=(Fl_Check_Button *)0; static void cb_btn_spot_when_logged(Fl_Check_Button* o, void*) { progdefaults.spot_when_logged = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_dxc_hertz=(Fl_Check_Button *)0; static void cb_btn_dxc_hertz(Fl_Check_Button* o, void*) { progdefaults.dxc_hertz = o->value(); progdefaults.changed = true; } Fl_Input *mlabel_1=(Fl_Input *)0; static void cb_mlabel_1(Fl_Input* o, void*) { progdefaults.dxcm_label_1=o->value(); dxc_macro_1->label(progdefaults.dxcm_label_1.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_1=(Fl_Input2 *)0; static void cb_mtext_1(Fl_Input2* o, void*) { progdefaults.dxcm_text_1=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_2=(Fl_Input *)0; static void cb_mlabel_2(Fl_Input* o, void*) { progdefaults.dxcm_label_2=o->value(); dxc_macro_2->label(progdefaults.dxcm_label_2.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_2=(Fl_Input2 *)0; static void cb_mtext_2(Fl_Input2* o, void*) { progdefaults.dxcm_text_2=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_3=(Fl_Input *)0; static void cb_mlabel_3(Fl_Input* o, void*) { progdefaults.dxcm_label_3=o->value(); dxc_macro_3->label(progdefaults.dxcm_label_3.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_3=(Fl_Input2 *)0; static void cb_mtext_3(Fl_Input2* o, void*) { progdefaults.dxcm_text_3=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_4=(Fl_Input *)0; static void cb_mlabel_4(Fl_Input* o, void*) { progdefaults.dxcm_label_4=o->value(); dxc_macro_4->label(progdefaults.dxcm_label_4.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_4=(Fl_Input2 *)0; static void cb_mtext_4(Fl_Input2* o, void*) { progdefaults.dxcm_text_4=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_5=(Fl_Input *)0; static void cb_mlabel_5(Fl_Input* o, void*) { progdefaults.dxcm_label_5=o->value(); dxc_macro_5->label(progdefaults.dxcm_label_5.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_5=(Fl_Input2 *)0; static void cb_mtext_5(Fl_Input2* o, void*) { progdefaults.dxcm_text_5=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_6=(Fl_Input *)0; static void cb_mlabel_6(Fl_Input* o, void*) { progdefaults.dxcm_label_6=o->value(); dxc_macro_6->label(progdefaults.dxcm_label_6.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_6=(Fl_Input2 *)0; static void cb_mtext_6(Fl_Input2* o, void*) { progdefaults.dxcm_text_6=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_7=(Fl_Input *)0; static void cb_mlabel_7(Fl_Input* o, void*) { progdefaults.dxcm_label_7=o->value(); dxc_macro_7->label(progdefaults.dxcm_label_7.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_7=(Fl_Input2 *)0; static void cb_mtext_7(Fl_Input2* o, void*) { progdefaults.dxcm_text_7=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_8=(Fl_Input *)0; static void cb_mlabel_8(Fl_Input* o, void*) { progdefaults.dxcm_label_8=o->value(); dxc_macro_8->label(progdefaults.dxcm_label_8.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_8=(Fl_Input2 *)0; static void cb_mtext_8(Fl_Input2* o, void*) { progdefaults.dxcm_text_8=o->value(); progdefaults.changed=true; } Fl_Button *btn_dxcluster_ar_help=(Fl_Button *)0; Fl_Button *btn_dxcluster_cc_help=(Fl_Button *)0; Fl_Button *btn_dxcluster_dx_help=(Fl_Button *)0; Fl_Group *tabDXclusterHelp=(Fl_Group *)0; FTextView *brws_dxc_help=(FTextView *)0; Fl_Button *btn_dxc_help_query=(Fl_Button *)0; static void cb_btn_dxc_help_query(Fl_Button*, void*) { dxc_help_query(); } Fl_Input2 *inp_help_string=(Fl_Input2 *)0; static void cb_inp_help_string(Fl_Input2*, void*) { dxc_help_query(); } Fl_Button *btn_dxc_help_clear=(Fl_Button *)0; static void cb_btn_dxc_help_clear(Fl_Button*, void*) { dxc_help_clear(); } Fl_Double_Window* dxc_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(680, 400, _("DX Cluster Spotting")); w = o; if (w) {/* empty */} { btn_select_host = new Fl_Group(1, 2, 678, 50); btn_select_host->box(FL_ENGRAVED_BOX); { Fl_Input2* o = inp_dxcc_host_url = new Fl_Input2(6, 25, 256, 22, _("DX HOST hostname/IP")); inp_dxcc_host_url->tooltip(_("telnet server URL")); inp_dxcc_host_url->box(FL_DOWN_BOX); inp_dxcc_host_url->color(FL_BACKGROUND2_COLOR); inp_dxcc_host_url->selection_color(FL_SELECTION_COLOR); inp_dxcc_host_url->labeltype(FL_NORMAL_LABEL); inp_dxcc_host_url->labelfont(0); inp_dxcc_host_url->labelsize(14); inp_dxcc_host_url->labelcolor(FL_FOREGROUND_COLOR); inp_dxcc_host_url->callback((Fl_Callback*)cb_inp_dxcc_host_url); inp_dxcc_host_url->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dxcc_host_url->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_host_url.c_str()); } // Fl_Input2* inp_dxcc_host_url { btn_show_host_tab = new Fl_Button(263, 25, 20, 22, _("@2>")); btn_show_host_tab->callback((Fl_Callback*)cb_btn_show_host_tab); } // Fl_Button* btn_show_host_tab { Fl_Input2* o = inp_dccc_host_port = new Fl_Input2(285, 25, 50, 22, _("Port")); inp_dccc_host_port->tooltip(_("telnet server port")); inp_dccc_host_port->box(FL_DOWN_BOX); inp_dccc_host_port->color(FL_BACKGROUND2_COLOR); inp_dccc_host_port->selection_color(FL_SELECTION_COLOR); inp_dccc_host_port->labeltype(FL_NORMAL_LABEL); inp_dccc_host_port->labelfont(0); inp_dccc_host_port->labelsize(14); inp_dccc_host_port->labelcolor(FL_FOREGROUND_COLOR); inp_dccc_host_port->callback((Fl_Callback*)cb_inp_dccc_host_port); inp_dccc_host_port->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dccc_host_port->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_host_port.c_str()); } // Fl_Input2* inp_dccc_host_port { Fl_Input2* o = inp_dccc_login = new Fl_Input2(336, 25, 80, 22, _("Login as")); inp_dccc_login->tooltip(_("login call sign")); inp_dccc_login->box(FL_DOWN_BOX); inp_dccc_login->color(FL_BACKGROUND2_COLOR); inp_dccc_login->selection_color(FL_SELECTION_COLOR); inp_dccc_login->labeltype(FL_NORMAL_LABEL); inp_dccc_login->labelfont(0); inp_dccc_login->labelsize(14); inp_dccc_login->labelcolor(FL_FOREGROUND_COLOR); inp_dccc_login->callback((Fl_Callback*)cb_inp_dccc_login); inp_dccc_login->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dccc_login->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_login.c_str()); } // Fl_Input2* inp_dccc_login { Fl_Input2* o = inp_dxcc_password = new Fl_Input2(420, 25, 80, 22, _("Password")); inp_dxcc_password->tooltip(_("Your login password")); inp_dxcc_password->box(FL_DOWN_BOX); inp_dxcc_password->color(FL_BACKGROUND2_COLOR); inp_dxcc_password->selection_color(FL_SELECTION_COLOR); inp_dxcc_password->labeltype(FL_NORMAL_LABEL); inp_dxcc_password->labelfont(0); inp_dxcc_password->labelsize(14); inp_dxcc_password->labelcolor(FL_FOREGROUND_COLOR); inp_dxcc_password->callback((Fl_Callback*)cb_inp_dxcc_password); inp_dxcc_password->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dxcc_password->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_password.c_str()); o->type(FL_SECRET_INPUT); inp_dxcc_password->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_dxcc_password { btnDXCLUSTERpasswordShow = new Fl_Button(503, 25, 22, 22, _("?")); btnDXCLUSTERpasswordShow->tooltip(_("Show password in plain text")); btnDXCLUSTERpasswordShow->callback((Fl_Callback*)cb_btnDXCLUSTERpasswordShow); } // Fl_Button* btnDXCLUSTERpasswordShow { Fl_Check_Button* o = btn_dxcc_connect = new Fl_Check_Button(571, 10, 101, 15, _("Connect")); btn_dxcc_connect->tooltip(_("Connect / Disconnect")); btn_dxcc_connect->down_box(FL_DOWN_BOX); btn_dxcc_connect->callback((Fl_Callback*)cb_btn_dxcc_connect); o->value(progStatus.cluster_connected); } // Fl_Check_Button* btn_dxcc_connect { lbl_dxc_connected = new Fl_Box(540, 17, 20, 20); lbl_dxc_connected->tooltip(_("Connected State")); lbl_dxc_connected->box(FL_DIAMOND_DOWN_BOX); lbl_dxc_connected->color((Fl_Color)55); lbl_dxc_connected->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* lbl_dxc_connected { Fl_Check_Button* o = btn_dxc_auto_connect = new Fl_Check_Button(571, 31, 101, 15, _("Auto conn\'")); btn_dxc_auto_connect->tooltip(_("Connect to host when starting fldigi")); btn_dxc_auto_connect->down_box(FL_DOWN_BOX); btn_dxc_auto_connect->callback((Fl_Callback*)cb_btn_dxc_auto_connect); o->value(progdefaults.dxc_auto_connect); } // Fl_Check_Button* btn_dxc_auto_connect btn_select_host->end(); } // Fl_Group* btn_select_host { cluster_tabs = new Fl_Tabs(0, 55, 680, 340); { tabDXclusterTelNetStream = new Fl_Group(1, 80, 677, 314, _("TelNet stream")); { Fl_Group* o = new Fl_Group(2, 82, 676, 276); o->box(FL_ENGRAVED_FRAME); { brws_tcpip_stream = new FTextView(4, 85, 668, 240); brws_tcpip_stream->tooltip(_("Cluster server command strings")); brws_tcpip_stream->box(FL_DOWN_FRAME); brws_tcpip_stream->color(FL_BACKGROUND2_COLOR); brws_tcpip_stream->selection_color(FL_SELECTION_COLOR); brws_tcpip_stream->labeltype(FL_NORMAL_LABEL); brws_tcpip_stream->labelfont(0); brws_tcpip_stream->labelsize(13); brws_tcpip_stream->labelcolor(FL_FOREGROUND_COLOR); brws_tcpip_stream->textfont(13); brws_tcpip_stream->align(Fl_Align(FL_ALIGN_TOP)); brws_tcpip_stream->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(brws_tcpip_stream); } // FTextView* brws_tcpip_stream { Fl_Button* o = dxc_macro_1 = new Fl_Button(4, 331, 80, 22, _("m1")); dxc_macro_1->tooltip(_("DX cluster macro\\nLeft click execute\\nRight click edit")); dxc_macro_1->callback((Fl_Callback*)dxc_click_m1); o->label(progdefaults.dxcm_label_1.c_str()); } // Fl_Button* dxc_macro_1 { Fl_Button* o = dxc_macro_2 = new Fl_Button(88, 331, 80, 22, _("m2")); dxc_macro_2->callback((Fl_Callback*)dxc_click_m2); o->label(progdefaults.dxcm_label_2.c_str()); } // Fl_Button* dxc_macro_2 { Fl_Button* o = dxc_macro_3 = new Fl_Button(172, 331, 80, 22, _("m3")); dxc_macro_3->callback((Fl_Callback*)dxc_click_m3); o->label(progdefaults.dxcm_label_3.c_str()); } // Fl_Button* dxc_macro_3 { Fl_Button* o = dxc_macro_4 = new Fl_Button(256, 331, 80, 22, _("m4")); dxc_macro_4->callback((Fl_Callback*)dxc_click_m4); o->label(progdefaults.dxcm_label_4.c_str()); } // Fl_Button* dxc_macro_4 { Fl_Button* o = dxc_macro_5 = new Fl_Button(340, 331, 80, 22, _("m5")); dxc_macro_5->callback((Fl_Callback*)dxc_click_m5); o->label(progdefaults.dxcm_label_5.c_str()); } // Fl_Button* dxc_macro_5 { Fl_Button* o = dxc_macro_6 = new Fl_Button(424, 331, 80, 22, _("m6")); dxc_macro_6->callback((Fl_Callback*)dxc_click_m6); o->label(progdefaults.dxcm_label_6.c_str()); } // Fl_Button* dxc_macro_6 { Fl_Button* o = dxc_macro_7 = new Fl_Button(508, 331, 80, 22, _("m7")); dxc_macro_7->callback((Fl_Callback*)dxc_click_m7); o->label(progdefaults.dxcm_label_7.c_str()); } // Fl_Button* dxc_macro_7 { Fl_Button* o = dxc_macro_8 = new Fl_Button(592, 331, 80, 22, _("m8")); dxc_macro_8->tooltip(_("DX cluster macro\\nLeft click execute\\nRight click edit")); dxc_macro_8->callback((Fl_Callback*)dxc_click_m8); o->label(progdefaults.dxcm_label_8.c_str()); } // Fl_Button* dxc_macro_8 o->end(); } // Fl_Group* o { inp_dxcluster_cmd = new Fl_Input2(43, 364, 480, 22, _("Cmd:")); inp_dxcluster_cmd->tooltip(_("Command string")); inp_dxcluster_cmd->box(FL_DOWN_BOX); inp_dxcluster_cmd->color(FL_BACKGROUND2_COLOR); inp_dxcluster_cmd->selection_color(FL_SELECTION_COLOR); inp_dxcluster_cmd->labeltype(FL_NORMAL_LABEL); inp_dxcluster_cmd->labelfont(0); inp_dxcluster_cmd->labelsize(13); inp_dxcluster_cmd->labelcolor(FL_FOREGROUND_COLOR); inp_dxcluster_cmd->callback((Fl_Callback*)cb_inp_dxcluster_cmd); inp_dxcluster_cmd->align(Fl_Align(FL_ALIGN_LEFT)); inp_dxcluster_cmd->when(FL_WHEN_ENTER_KEY); } // Fl_Input2* inp_dxcluster_cmd { btn_cluster_spot = new Fl_Button(527, 364, 70, 22, _("Spot")); btn_cluster_spot->tooltip(_("Send SPOT string to server")); btn_cluster_spot->callback((Fl_Callback*)cb_btn_cluster_spot); } // Fl_Button* btn_cluster_spot { btn_cluster_submit = new Fl_Button(602, 364, 70, 22, _("Submit")); btn_cluster_submit->tooltip(_("Send command to server")); btn_cluster_submit->callback((Fl_Callback*)cb_btn_cluster_submit); } // Fl_Button* btn_cluster_submit tabDXclusterTelNetStream->end(); } // Fl_Group* tabDXclusterTelNetStream { tabDXclusterReports = new Fl_Group(1, 80, 673, 314, _("DX Reports")); tabDXclusterReports->hide(); { reports_header = new Fl_Browser(3, 84, 671, 20); reports_header->color(FL_LIGHT2); reports_header->textfont(4); reports_header->when(FL_WHEN_NEVER); } // Fl_Browser* reports_header { brws_dx_cluster = new Fl_Browser(3, 104, 671, 260); brws_dx_cluster->tooltip(_("Left Click to select SPOT")); brws_dx_cluster->type(2); brws_dx_cluster->textfont(4); brws_dx_cluster->callback((Fl_Callback*)cb_brws_dx_cluster); brws_dx_cluster->align(Fl_Align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE)); Fl_Group::current()->resizable(brws_dx_cluster); } // Fl_Browser* brws_dx_cluster { btn_dxc_cluster_clear = new Fl_Button(294, 366, 72, 22, _("Clear")); btn_dxc_cluster_clear->tooltip(_("Clear parsed data stream")); btn_dxc_cluster_clear->callback((Fl_Callback*)cb_btn_dxc_cluster_clear); } // Fl_Button* btn_dxc_cluster_clear { Fl_Check_Button* o = brws_order = new Fl_Check_Button(31, 371, 186, 15, _("New entries in first line")); brws_order->down_box(FL_DOWN_BOX); brws_order->callback((Fl_Callback*)cb_brws_order); brws_order->when(FL_WHEN_CHANGED); o->value(progdefaults.dxc_topline); } // Fl_Check_Button* brws_order { btn_cluster_spot2 = new Fl_Button(585, 368, 70, 22, _("Spot")); btn_cluster_spot2->tooltip(_("Send SPOT string to server")); btn_cluster_spot2->callback((Fl_Callback*)cb_btn_cluster_spot2); } // Fl_Button* btn_cluster_spot2 tabDXclusterReports->end(); } // Fl_Group* tabDXclusterReports { tabDXclusterConfig = new Fl_Group(0, 80, 676, 314, _("Config")); tabDXclusterConfig->tooltip(_("Initialization strings for telnet cluster host")); tabDXclusterConfig->hide(); { Fl_Group* o = new Fl_Group(0, 82, 676, 130); { Fl_Group* o = new Fl_Group(1, 82, 348, 124); { Fl_Browser* o = brws_dxcluster_hosts = new Fl_Browser(5, 100, 278, 100, _("Hosts")); brws_dxcluster_hosts->type(2); brws_dxcluster_hosts->textfont(4); brws_dxcluster_hosts->align(Fl_Align(FL_ALIGN_TOP)); Fl_Group::current()->resizable(brws_dxcluster_hosts); static int widths[]={o->w()*6/10, o->w()*2/10, o->w()*2/10, 0 }; o->column_widths(widths); o->column_char(':'); dxcluster_hosts_load(); } // Fl_Browser* brws_dxcluster_hosts { Fl_Group* o = new Fl_Group(286, 100, 61, 100); { btn_dxcluster_hosts_select = new Fl_Button(290, 106, 54, 19, _("Select")); btn_dxcluster_hosts_select->tooltip(_("Select highlighted DX cluster host")); btn_dxcluster_hosts_select->callback((Fl_Callback*)dxcluster_hosts_select); } // Fl_Button* btn_dxcluster_hosts_select { btn_dxcluster_hosts_add = new Fl_Button(290, 128, 54, 19, _("Add")); btn_dxcluster_hosts_add->tooltip(_("Add current DX cluster host")); btn_dxcluster_hosts_add->callback((Fl_Callback*)dxcluster_hosts_add); } // Fl_Button* btn_dxcluster_hosts_add { btn_dxcluster_hosts_delete = new Fl_Button(290, 151, 54, 19, _("Delete")); btn_dxcluster_hosts_delete->tooltip(_("Delete highlighted DX cluster host")); btn_dxcluster_hosts_delete->callback((Fl_Callback*)dxcluster_hosts_delete); } // Fl_Button* btn_dxcluster_hosts_delete { btn_dxcluster_servers = new Fl_Button(290, 174, 54, 19, _("Srvrs")); btn_dxcluster_servers->tooltip(_("Server List")); btn_dxcluster_servers->callback((Fl_Callback*)dxcluster_servers); } // Fl_Button* btn_dxcluster_servers { Fl_Group* o = new Fl_Group(290, 195, 54, 2); o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(350, 82, 325, 103); { ed_telnet_cmds = new FTextEdit(354, 100, 248, 80, _("Cluster Server Setup Cmds")); ed_telnet_cmds->tooltip(_("Cluster server command strings")); ed_telnet_cmds->box(FL_DOWN_FRAME); ed_telnet_cmds->color(FL_BACKGROUND2_COLOR); ed_telnet_cmds->selection_color(FL_SELECTION_COLOR); ed_telnet_cmds->labeltype(FL_NORMAL_LABEL); ed_telnet_cmds->labelfont(0); ed_telnet_cmds->labelsize(14); ed_telnet_cmds->labelcolor(FL_FOREGROUND_COLOR); ed_telnet_cmds->textfont(13); ed_telnet_cmds->align(Fl_Align(FL_ALIGN_TOP)); ed_telnet_cmds->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(ed_telnet_cmds); } // FTextEdit* ed_telnet_cmds { Fl_Group* o = new Fl_Group(606, 100, 59, 82); { btn_dxcluster_hosts_load_setup = new Fl_Button(610, 106, 54, 19, _("Load")); btn_dxcluster_hosts_load_setup->tooltip(_("Load Cluster Setup Commands")); btn_dxcluster_hosts_load_setup->callback((Fl_Callback*)dxcluster_hosts_load_setup); } // Fl_Button* btn_dxcluster_hosts_load_setup { btn_dxcluster_hosts_save_setup = new Fl_Button(610, 128, 54, 19, _("Save")); btn_dxcluster_hosts_save_setup->tooltip(_("Save Cluster Setup Commands")); btn_dxcluster_hosts_save_setup->callback((Fl_Callback*)dxcluster_hosts_save_setup); } // Fl_Button* btn_dxcluster_hosts_save_setup { btn_dxcluster_hosts_send_setup = new Fl_Button(610, 151, 54, 19, _("Send")); btn_dxcluster_hosts_send_setup->tooltip(_("Send Commands to Cluster Server")); btn_dxcluster_hosts_send_setup->callback((Fl_Callback*)dxcluster_hosts_send_setup); } // Fl_Button* btn_dxcluster_hosts_send_setup { Fl_Group* o = new Fl_Group(610, 174, 54, 2); o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_spot_when_logged = new Fl_Check_Button(354, 188, 146, 15, _("Spot when logged")); btn_spot_when_logged->tooltip(_("Create DX spot when logging contact")); btn_spot_when_logged->down_box(FL_DOWN_BOX); btn_spot_when_logged->callback((Fl_Callback*)cb_btn_spot_when_logged); o->value(progdefaults.spot_when_logged); } // Fl_Check_Button* btn_spot_when_logged { Fl_Check_Button* o = btn_dxc_hertz = new Fl_Check_Button(512, 188, 146, 15, _("Report [0..99 Hz]")); btn_dxc_hertz->tooltip(_("Add [0..99] Hz WF value to DX report notes")); btn_dxc_hertz->down_box(FL_DOWN_BOX); btn_dxc_hertz->callback((Fl_Callback*)cb_btn_dxc_hertz); o->value(progdefaults.dxc_hertz); } // Fl_Check_Button* btn_dxc_hertz o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 218, 676, 174); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Group* o = new Fl_Group(1, 218, 307, 170); { Fl_Input* o = mlabel_1 = new Fl_Input(5, 238, 80, 22, _("label 1")); mlabel_1->callback((Fl_Callback*)cb_mlabel_1); mlabel_1->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_1.c_str()); } // Fl_Input* mlabel_1 { Fl_Input2* o = mtext_1 = new Fl_Input2(87, 238, 220, 22, _("macro text")); mtext_1->box(FL_DOWN_BOX); mtext_1->color(FL_BACKGROUND2_COLOR); mtext_1->selection_color(FL_SELECTION_COLOR); mtext_1->labeltype(FL_NORMAL_LABEL); mtext_1->labelfont(0); mtext_1->labelsize(14); mtext_1->labelcolor(FL_FOREGROUND_COLOR); mtext_1->callback((Fl_Callback*)cb_mtext_1); mtext_1->align(Fl_Align(FL_ALIGN_TOP)); mtext_1->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_1.c_str()); } // Fl_Input2* mtext_1 { Fl_Input* o = mlabel_2 = new Fl_Input(5, 278, 80, 22, _("label 2")); mlabel_2->callback((Fl_Callback*)cb_mlabel_2); mlabel_2->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_2.c_str()); } // Fl_Input* mlabel_2 { Fl_Input2* o = mtext_2 = new Fl_Input2(87, 278, 220, 22); mtext_2->box(FL_DOWN_BOX); mtext_2->color(FL_BACKGROUND2_COLOR); mtext_2->selection_color(FL_SELECTION_COLOR); mtext_2->labeltype(FL_NORMAL_LABEL); mtext_2->labelfont(0); mtext_2->labelsize(14); mtext_2->labelcolor(FL_FOREGROUND_COLOR); mtext_2->callback((Fl_Callback*)cb_mtext_2); mtext_2->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_2->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_2.c_str()); } // Fl_Input2* mtext_2 { Fl_Input* o = mlabel_3 = new Fl_Input(5, 318, 80, 22, _("label 3")); mlabel_3->callback((Fl_Callback*)cb_mlabel_3); mlabel_3->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_3.c_str()); } // Fl_Input* mlabel_3 { Fl_Input2* o = mtext_3 = new Fl_Input2(87, 318, 220, 22); mtext_3->box(FL_DOWN_BOX); mtext_3->color(FL_BACKGROUND2_COLOR); mtext_3->selection_color(FL_SELECTION_COLOR); mtext_3->labeltype(FL_NORMAL_LABEL); mtext_3->labelfont(0); mtext_3->labelsize(14); mtext_3->labelcolor(FL_FOREGROUND_COLOR); mtext_3->callback((Fl_Callback*)cb_mtext_3); mtext_3->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_3->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_3.c_str()); } // Fl_Input2* mtext_3 { Fl_Input* o = mlabel_4 = new Fl_Input(5, 358, 80, 22, _("label 4")); mlabel_4->callback((Fl_Callback*)cb_mlabel_4); mlabel_4->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_4.c_str()); } // Fl_Input* mlabel_4 { Fl_Input2* o = mtext_4 = new Fl_Input2(87, 358, 220, 22); mtext_4->box(FL_DOWN_BOX); mtext_4->color(FL_BACKGROUND2_COLOR); mtext_4->selection_color(FL_SELECTION_COLOR); mtext_4->labeltype(FL_NORMAL_LABEL); mtext_4->labelfont(0); mtext_4->labelsize(14); mtext_4->labelcolor(FL_FOREGROUND_COLOR); mtext_4->callback((Fl_Callback*)cb_mtext_4); mtext_4->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_4->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_4.c_str()); } // Fl_Input2* mtext_4 o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(308, 218, 307, 170); { Fl_Input* o = mlabel_5 = new Fl_Input(310, 237, 80, 22, _("label 5")); mlabel_5->callback((Fl_Callback*)cb_mlabel_5); mlabel_5->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_5.c_str()); } // Fl_Input* mlabel_5 { Fl_Input2* o = mtext_5 = new Fl_Input2(391, 237, 220, 22, _("macro text")); mtext_5->box(FL_DOWN_BOX); mtext_5->color(FL_BACKGROUND2_COLOR); mtext_5->selection_color(FL_SELECTION_COLOR); mtext_5->labeltype(FL_NORMAL_LABEL); mtext_5->labelfont(0); mtext_5->labelsize(14); mtext_5->labelcolor(FL_FOREGROUND_COLOR); mtext_5->callback((Fl_Callback*)cb_mtext_5); mtext_5->align(Fl_Align(FL_ALIGN_TOP)); mtext_5->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_5.c_str()); } // Fl_Input2* mtext_5 { Fl_Input* o = mlabel_6 = new Fl_Input(310, 277, 80, 22, _("label 6")); mlabel_6->callback((Fl_Callback*)cb_mlabel_6); mlabel_6->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_6.c_str()); } // Fl_Input* mlabel_6 { Fl_Input2* o = mtext_6 = new Fl_Input2(391, 277, 220, 22); mtext_6->box(FL_DOWN_BOX); mtext_6->color(FL_BACKGROUND2_COLOR); mtext_6->selection_color(FL_SELECTION_COLOR); mtext_6->labeltype(FL_NORMAL_LABEL); mtext_6->labelfont(0); mtext_6->labelsize(14); mtext_6->labelcolor(FL_FOREGROUND_COLOR); mtext_6->callback((Fl_Callback*)cb_mtext_6); mtext_6->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_6->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_6.c_str()); } // Fl_Input2* mtext_6 { Fl_Input* o = mlabel_7 = new Fl_Input(310, 317, 80, 22, _("label 7")); mlabel_7->callback((Fl_Callback*)cb_mlabel_7); mlabel_7->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_7.c_str()); } // Fl_Input* mlabel_7 { Fl_Input2* o = mtext_7 = new Fl_Input2(391, 317, 220, 22); mtext_7->box(FL_DOWN_BOX); mtext_7->color(FL_BACKGROUND2_COLOR); mtext_7->selection_color(FL_SELECTION_COLOR); mtext_7->labeltype(FL_NORMAL_LABEL); mtext_7->labelfont(0); mtext_7->labelsize(14); mtext_7->labelcolor(FL_FOREGROUND_COLOR); mtext_7->callback((Fl_Callback*)cb_mtext_7); mtext_7->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_7->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_7.c_str()); } // Fl_Input2* mtext_7 { Fl_Input* o = mlabel_8 = new Fl_Input(310, 357, 80, 22, _("label 8")); mlabel_8->callback((Fl_Callback*)cb_mlabel_8); mlabel_8->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_8.c_str()); } // Fl_Input* mlabel_8 { Fl_Input2* o = mtext_8 = new Fl_Input2(391, 357, 220, 22); mtext_8->box(FL_DOWN_BOX); mtext_8->color(FL_BACKGROUND2_COLOR); mtext_8->selection_color(FL_SELECTION_COLOR); mtext_8->labeltype(FL_NORMAL_LABEL); mtext_8->labelfont(0); mtext_8->labelsize(14); mtext_8->labelcolor(FL_FOREGROUND_COLOR); mtext_8->callback((Fl_Callback*)cb_mtext_8); mtext_8->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_8->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_8.c_str()); } // Fl_Input2* mtext_8 o->end(); } // Fl_Group* o { btn_dxcluster_ar_help = new Fl_Button(618, 230, 56, 22, _("AR ?")); btn_dxcluster_ar_help->tooltip(_("AR Commands")); btn_dxcluster_ar_help->callback((Fl_Callback*)dxcluster_ar_help); } // Fl_Button* btn_dxcluster_ar_help { btn_dxcluster_cc_help = new Fl_Button(618, 272, 56, 22, _("CC ?")); btn_dxcluster_cc_help->tooltip(_("CC Commands")); btn_dxcluster_cc_help->callback((Fl_Callback*)dxcluster_cc_help); } // Fl_Button* btn_dxcluster_cc_help { btn_dxcluster_dx_help = new Fl_Button(618, 315, 56, 22, _("DX ?")); btn_dxcluster_dx_help->tooltip(_("Spider Commands")); btn_dxcluster_dx_help->callback((Fl_Callback*)dxcluster_dx_help); } // Fl_Button* btn_dxcluster_dx_help o->end(); } // Fl_Group* o tabDXclusterConfig->end(); } // Fl_Group* tabDXclusterConfig { tabDXclusterHelp = new Fl_Group(1, 80, 675, 314, _("Help")); tabDXclusterHelp->hide(); { brws_dxc_help = new FTextView(3, 84, 673, 281); brws_dxc_help->tooltip(_("Cluster server command strings")); brws_dxc_help->box(FL_DOWN_FRAME); brws_dxc_help->color(FL_BACKGROUND2_COLOR); brws_dxc_help->selection_color(FL_SELECTION_COLOR); brws_dxc_help->labeltype(FL_NORMAL_LABEL); brws_dxc_help->labelfont(0); brws_dxc_help->labelsize(13); brws_dxc_help->labelcolor(FL_FOREGROUND_COLOR); brws_dxc_help->textfont(13); brws_dxc_help->align(Fl_Align(FL_ALIGN_TOP)); brws_dxc_help->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(brws_dxc_help); } // FTextView* brws_dxc_help { btn_dxc_help_query = new Fl_Button(441, 368, 70, 22, _("Get Help")); btn_dxc_help_query->tooltip(_("Get WWV sunspot events")); btn_dxc_help_query->callback((Fl_Callback*)cb_btn_dxc_help_query); } // Fl_Button* btn_dxc_help_query { inp_help_string = new Fl_Input2(265, 368, 172, 22, _("Help on:")); inp_help_string->tooltip(_("Leave blank for general help\nEnter subject, e.g. DX")); inp_help_string->box(FL_DOWN_BOX); inp_help_string->color(FL_BACKGROUND2_COLOR); inp_help_string->selection_color(FL_SELECTION_COLOR); inp_help_string->labeltype(FL_NORMAL_LABEL); inp_help_string->labelfont(0); inp_help_string->labelsize(13); inp_help_string->labelcolor(FL_FOREGROUND_COLOR); inp_help_string->callback((Fl_Callback*)cb_inp_help_string); inp_help_string->align(Fl_Align(FL_ALIGN_LEFT)); inp_help_string->when(FL_WHEN_ENTER_KEY); } // Fl_Input2* inp_help_string { btn_dxc_help_clear = new Fl_Button(517, 368, 71, 22, _("Clear")); btn_dxc_help_clear->tooltip(_("Clear help panel")); btn_dxc_help_clear->callback((Fl_Callback*)cb_btn_dxc_help_clear); } // Fl_Button* btn_dxc_help_clear tabDXclusterHelp->end(); } // Fl_Group* tabDXclusterHelp cluster_tabs->end(); Fl_Group::current()->resizable(cluster_tabs); } // Fl_Tabs* cluster_tabs o->end(); } // Fl_Double_Window* o return w; } fldigi-4.1.06/src/dxcluster/DXClusterServers.cxx0000644000175000017500000010620113472115772016551 00000000000000string dxcc_servers = "\ \n\ \n\ \n\ \n\ DX Cluster Servers\n\ \n\ \n\

DX Cluster Servers

\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
CallDomain Name/
IP address
logincommentSoftware, Location, etc.
NC7J Skimmer + Spotsdxc.nc7j.com
(dynamically assigned)
call NC7J AR-Cluster (Syracuse, UT, DN31xb);\n\ Sysop: NG7M\n\ and W7CT; default is North American spots. Filters may be\n\ adjusted to enable and filter skimmer spots to your\n\ preference by connecting callsign; for details see \n\ \n\ NG7M Connection and Filter Guide
NC7J Direct CW Skimmerdxc.nc7j.com:7300
(dynamically assigned)
call Telnet access to NC7J's CW Skimmer (Syracuse, UT, DN31xb)
NC7J Direct RTTY Skimmerdxc.nc7j.com:7200
(dynamically assigned)
call Telnet access to NC7J's RTTY Skimmer (Syracuse, UT, DN31xb)
DL4RCK DigiMode Skimmerdl4rck.ham-radio-op.net:8000\n\
(dynamically assigned)
call Telnet access to DL4RCK's Digital Skimmer-Cluster
W1AAAdxusa.net:7300
\n\ 65.172.152.29:7300
call W1AAA DX Spider (Ledyard, CT), \n\ W1AN(Sysop)
K1AJk1aj.mine.nu:7300\n\
(dynamically assigned)
call K1AJ DXSpider (Boston MA)
NN1DK1RFI.com:7300\n\
(dynamically assigned)
call NN1D DXSpider Cluster (Swansea, MA)
K1EUk1eu.dynip.com
\n\  
call K1EU AR-Cluster (Scarborough, ME)
W1GQdx.w1gq.net\n\
(dynamically assigned)
call W1GQ AR-Cluster (Londonderry NH); Skimmer\n\ capable
W1NRdx.w1nr.net
\n\ 173.255.227.205
call W1NR DXSpider (Marlborough, MA); Yankee Clipper Contest Club spotting network; also accessible through \n\ \n\ Java applet (close applet using \"File\" drop-down menu); NTP\n\ server also available: timelord.w1nr.net
W1NR-8usdx.w1nr.net
\n\ 173.255.232.93
call W1NR DXSpider (Marlborough, MA); Yankee\n\ Clipper Contest Club spotting network; default filters set\n\ to only display spots from callsigns in zones 1-8
WW1R-9dxc.ww1r.com:7300
\n\ (dynamically assigned)
call  Dx-Spider (Newton, NC); Sysop: WW1R
K1TTTk1ttt.net:7373
\n\ (dynamically assigned)
call YCCC\n\ AR-Cluster (Peru, MA); Skimmer capable
WC2Ldxc.wc2l.com
\n\ (dynamically assigned)
call WC2L AR-Cluster (Niskayuna, NY); Web access; Skimmer\n\ capable
K2LSdxc.k2ls.com
\n\ (dynamically assigned)
call K2LS DXSpider (Greensboro, NC); spots from CQ\n\ Zones 1-8 (NA) only
AA2MFdxc.aa2mf.net
\n\ (dynamically assigned)
call AA2MF AR-Cluster (Staten Island, NY)
WB3FFVdxc.wb3ffv.us:7300
\n\ (static IP)
call WB3FFV DX-Spider (Abingdon, MD); reachable\n\ with either IPv4 or v6
W3LPLw3lpl.net:7373
\n\ (dynamically assigned)
call W3LPL AR-Cluster, version 6 (Glenwood, MD)
W3LPLdxc.w3lpl.net:7373
\n\ (dynamically assigned)
callCan include Skimmer spotsW3LPL AR-Cluster, version 6 (Glenwood, MD)
K3LRdx.k3lr.com
\n\ 75.185.154.114
call K3LR\n\ AR-Cluster, West Midddlesex, PA; (North Coast\n\ Contesters)
WD4IXDdxc.wd4ixd.net
\n\ (dynamically assigned)
call WD4IXD AR-Cluster (Clermont, FL); Sysop: WD4IXD
WC4Jdxc.wc4j.net
\n\ (dynamically assigned)
call WC4J AR-Cluster (Nokesville, VA)
W4MLdxc.w4ml.net
\n\ (dynamically assigned)
call W4ML AR-Cluster (Montpelier, VA (FM17du))
AI4OFskcc.matrixlist.com:7300
\n\ 208.111.3.150:7300
call AI4OF-SKCC DX-Spider (Orlando, FL); Sysop: AI4OF
K4ZRk4zr.no-ip.org:7300
\n\ (dynamically assigned)
call K4ZR DX Spider (Huntsville, AL); Sysop: AA4U
KY4XXdxc.ky4xx.com:7300
\n\ 198.73.30.100
call KY4XX DX Spider (Louisville, KY) - Kentucky\n\ DX Association; Sysop: N8ZFM
K5DX 
\n\ 75.148.198.113
call Texas DX\n\ Society AR-Cluster (Houston, TX); Sysop: WB5TUF
AE5Edxspots.com
\n\ 204.221.76.52
call AE5A\n\ CC-Cluster (Thief River Falls, MN); Skimmer capable
AB5Kdxc.ab5k.net
\n\ (dynamically assigned)
callWorldwide spotsAB5K AR-Cluster (Holland, TX); Skimmer\n\ capable
AB5K-2dxc-us.ab5k.net
\n\ (dynamically assigned)
callUS spots onlyAB5K AR-Cluster (Holland, TX); Skimmer\n\ capable
K5RLMusrdude.webhop.net:7300
\n\ (dynamically assigned)
call DXSpider (Charleston AR); K5RLM
N5UXTdxc.n5uxt.org
\n\ (dynamically assigned)
callRF access on 145.010N5UXT DX-Cluster (New Orleans, LA)
W6CUAw6cua.no-ip.org:7300
\n\ (dynamically assigned
call AR-Cluster (Castro Valley, CA)
K6EXOk6exo.dyndns.org:7300
\n\ (dynamically assigned
call DXSpider (Los Angeles, CA)
W6KKw6kk.zapto.org:7300
\n\ (dynamically assigned)
call DXSpider (Alta Loma, CA); Southern CA DX Club; USA\n\ and VE spots only
W6RFUucsbdx.ece.ucsb.edu:7300
\n\ 128.111.56.240:7300
call W6RFU DX Spider (Santa Barbara, CA); Sysop: N6WS; CQ Zones 1-5 spots\n\ only
N6WS-6n6ws.no-ip.org:7300
\n\ (dynamically assigned)
call DXSpider (Nipomo, CA); Sysop: N6WS; worldwide spots
K7EKwww.k7ek.net:9000
\n\ (dynamically assigned)
call K7EK DX Spider (Spanaway, WA CN87tb); Sysop:\n\ K7EK
N7ODn7od.pentux.net
\n\ (dynamically assigned)
call N7OD AR-Cluster (Hemet, CA); Sysop: N7OD
NL7Snl7s.net:8000call NL7S DX Spider (Wasilla, AK); Sysop: NL7S
N7XYn7xy.net:7300
\n\ (dynamically assigned)
call N7XY DXSpider (Bainbridge Island, WA); Sysop:\n\ N7XY
NK7Znk7z-cluster.ddns.net:7373
\n\ (dynamically assigned)
call NK7Z AR-Cluster (Eugene, OR); Sysop: NK7Z
N8NOEn8noe.us
\n\ (dynamically assigned)
call N8NOE AR DX Cluster, Waterford, MI
N8NOEn8noe.us:7373
\n\ (dynamically assigned)
call N8NOE AR CW SKimmer, Waterford, MI; Skimmer\n\ capable
W9AEKdx.svs.com:7300
\n\ (dynamically assigned)
call W9AEK DXSpider; Lisle, IL; Sysop: W9AEK
N9AIn9ai.no-ip.org
\n\ (dynamically assigned)
call N9AI AR-Cluster; Green Bay, WI; Sysop: N9AI
N9BCdxc.n9bc.com:7300
\n\ (dynamically assigned)
call N9BC DXSpider; Appleton, WI (EN54xl); Sysop:\n\ N9BC
W9BGw9bg.com
\n\ (dynamically assigned)
callNo SkimmerW9BG AR-Cluster; Madison DX Club, Madison, WI
W9BGw9bg.com:7373
\n\ (dynamically assigned)
callw/ SkimmerW9BG AR-Cluster; Madison DX Club, Madison,\n\ WI; Skimmer capable
NX9Gdxc.f2f.us:7300
\n\ (dynamically assigned)
callipv6 2607:f978:5:8001::1NX9G DXSpider, Bensenville, IL; Sysop: NX9G
N9KTn9kt.homenet.org:8000
\n\ (dynamically assigned)
call N9KT DXSpider, Indianapolis, IN; Sysop: N9KT
W9ODDw9odd.bien.mu.edu
\n\ 134.48.91.173
call K3GGN,\n\ Sysop; Marquette University, Milwaukee, WI,
KR9Ukr9u.net
\n\ (dynamically assigned)
call Fort\n\ Wayne DX Association; Fort Wayne, IN
W9ZRXdxc.w9zrx.net
\n\ (dynamically assigned)
call W9ZRX AR-Cluster, Westfield, IN
\n\ (Hoosier DX & Contest\n\ Club)
W0MWw0mw.dynip.com
\n\ (dynamically assigned)
call Kansas City (Olathe, KS) AR-Cluster
WA0ROIwa0roi.no-ip.com
\n\ (dynamically assigned)
call WA0ROI AR-Cluster (Sheldahl, IA)
K0WLk0wl.ddns.net:23
\n\ (dynamically assigned)
call K0WL AR-Cluster (Urbandale, IA (EN31dp))
DB0SPC-7db0spc.dynv6.net:8000
\n\ (dynamically assigned)
call DXSpider (Mainz); Sysop: DJ6RX
DB0SUE-7db0sue.de:8000
\n\ (dynamically assigned)
call DXSpider (Flensburg); Sysop: DK2ZZ
DL9GTBcluster.dl9gtb.de:8000
\n\ (dynamically assigned)
call DL9GTB\n\ AR Cluster (Nossendorf); Skimmer capable
EA4RCHdxfun.com:8000
\n\ (dynamically assigned)
call EA4RCH DX Spider (Madrid)
EA4UREeadx.org
\n\ 213.97.191.228
call Sysop: EA5BZ
EA7URC-5
\n\ ED7ZAB-5
dx.ea7urc.org:8000
\n\ 150.214.111.198:8000
call DX Spider; Sysop: EA7URC (Cordoba)
EI7MREei7mre.ath.cx:7300
\n\  
call DX Spider; Sysop: EI6IZ (Co Mayo -\n\ IO53hu)
GB7DXGgb7dxg.shacknet.nu:7300
\n\ (dynamically assigned)
call DXSpider Cluster (St Andrew's, Guernsey);\n\ Sysop: GU6EFB
GB7MBCgb7mbc.spoo.org:8000
\n\ (dynamically assigned)
call GB7MBC DXSpider Cluster (Morecambe,\n\ Lancashire); Sysop: G0VGS
GB7NHRgb7nhr.dydns.org:7300
\n\ (dynamically assigned)
call GB7NHR DXSpider Cluster (Nunsfield House ARG,\n\ Derby); Sysop: G8IYZ
HA6DXdx.hu:9000
\n\ (dynamically assigned)
call HA6DX
IK2DUW-6dx.arilimbiate.net:7300
\n\ (dynamically assigned)
call DxSpider (Limbiate MB); Sysop: IW2OHX IK2DUW
IQ4AX-6 
\n\ 195.43.189.178:8000
call DXSpider (ARI Modena); Sysop: IZ4EFN (Sysop)
IQ4AX-6 
\n\ 195.43.189.178:8000
call DXSpider (ARI Modena); Sysop: IZ4EFN (Sysop)
IK4ICZ-6ik4icz.dyndns.org:8000
\n\ (dynamically assigned)
call DX Spider (Ravenna); Sysop: IK4ICZ
IZ5IIN-6iz5iin.no-ip.biz:8000
\n\ (dynamically assigned)
call DX Spider (Santa Maria a Monte, Pisa); Sysop:\n\ IZ5IIN
IK5PWJ-6ik5pwj-6.dyndns.org:8000
\n\ (dynamically assigned)
call DX Spider (Monte Carlo, Lucca); Sysops: IK5PWJ and I5NOD
IK7IMO-6ik7imo.ddns.net:7000
\n\ (dynamically assigned)
call DXSpider Cavallino (LE)); Sysop: IK7IMO
IK7QLZ-6ik7qlz.dyndns.org:7000
\n\ (dynamically assigned)
call DXSpider (Taranto); Sysop: IK7QLZ
IK7UXWik7uxw.dyndns.org:7300
\n\ (dynamically assigned)
call DXSpider (Brindisi); Sysop: IK7UXW
IK8HJC-6ik8hjc.dyndns.org:8000
\n\ (dynamically assigned)
call DXSpider (Battipaglia, SA)
IK8VRN-6ik8vrn.dyndns.org:7000
\n\ (dynamically assigned)
call DXSpider (Marigliano, NA); Sysop: IK8VRN
IR5AG-6iz5fsa.duckdns.org:8000
\n\ (dynamically assigned)
call DX Spider Scandicci (FI); Sysop: IZ5FSA
IZ7AUH-6dx.iz7auh.net:8000
\n\ (dynamically assigned)
call DX Spider (Taranto); Sysop: IZ7AUH
IZ8MBW-6dx.iz8mbw.net:7300
\n\ (dynamically assigned)
call DX Spider (Napoli); Sysop: IZ8MBW
IT9ESI-6it9esi.ddns.net:7373
\n\ (dynamically assigned)
call IT9ESI-6 DXSpider (Gravina di Catania)
KP4JRSkp4jrs.dyndns.org
\n\ (dynamically assigned)
call DXSpider (Trujillo Alto); Sysop: KP4JRS
OH1RCFoh1ab.dy.fi:8000
\n\ 213.186.225.90:8000
call DXSpider (Pori); Sysops: OH1MRR OH1KH OH1QG
ON2VHF-3on2vhf-3.ddns.net:9001
\n\ (dynamically assigned)
call AR-Cluster (Marcinelle, JO20FJ); Sysop: ON2VHF
ON0DXKon0dxk.dyndns.org:8000
\n\ (dynamically assigned)
call DX-Spider (Kortrijk); Sysop: ON6HH
ON0LLV-5telnet://on0llv.ddns.net:7300
\n\ (dynamically assigned)
call DX-Spider (Houdeng-Goegnies, Hainaut,\n\ Belgium; Sysop: ON6LR
OZ5BBS-7oz5bbs.no-ip.org:8000
\n\ dynamically assigned
call OZ1LQH\n\ DXSpider (Odense)
PA1RBZpa1rbz.dyndns.org:9000
\n\ (dynamically assigned)
call PA1RBZ\n\ DXSpider (Ermelo)
PA4JJ-3 
\n\ 83.162.186.24.2:7388
call PA4JJ\n\ DXSpider (Emmen, Drente)
PI4CCdxc.pi4cc.nl:8000
\n\ (dynamically assigned)
call PI4CC\n\ DX-Cluster (Rotterdam); Sysop: PC2A
PI8DXCpi8dxc.mooo.com:41112
\n\ (dynamically assigned)
call DX Spider (Voorburg); Sysop: PA2R
RW3XAdx.feerc.ru:8000call RW3XA-8 DX-Cluster (Obninsk); Sysop: RW3XA
S50CLXbonaparte.infrax.si:41112
\n\ (dynamically assigned)
call S50CLX DX Spider (Cerkno, Slovenia); Sysop: S50CLX
SV2HRT-1sv2hrt.ath.cx:7300
\n\ (dynamically assigned)
call SV2HRT DXSpider; White Tower DX Team, Sysop:\n\ SV2HRT
TA2NC-2home.kayhan.name.tr:7300
\n\ (dynamically assigned)
call TA2NC DXSpider, Ankara, Turkey; Sysop: TA2NC
VE1DXIve1dxi.no-ip.com
\n\ (dynamically assigned)
call VE1DX\n\ WinCluster (Lake Echo, NS)
VA3NAdx.fireroute.com
\n\ (dynamically assigned)
call VA3NA\n\ Linux-PacketCluster (Toronto, ON)
VE6DXCdx.middlebrook.ca:8000
\n\ 64.59.129.23:8000
call VE6DXC DXSpider Cluster (Calgary, AB)
VE7CCdxc.ve7cc.net
\n\ (dynamically assigned)
call VE7CC CC-Cluster (Whonnock, BC); Skimmer\n\ capable
VE9EMOve9emo.gnb.ca
\n\ 205.174.162.164
call VE9EMO DXSpider, the New-Brunswick DX Cluster
VE9SCwww.ve9sc.com:6300
\n\ (dynamically assigned)
call VE9SC DX\n\ Spider (Moncton, NB)
VK7HDM-2ddmcomputers.com:7300
\n\ (dynamically assigned)
call VK7HDM\n\ DX Spider (Gagebrook, Hobart, Tasmania); Web access
YL7DXCdxc.ardi.lv:8000
\n\  
call YL7C DXSpider Cluster (Jelgava, Latvia);\n\ Sysop: YL2MD
YO8SAW-1yo8saw.netroute.ro:7300
\n\  
call YO8SAW\n\ DX Spider (Barlad, Romania)
YV6BTFyv6btf.no-ip.org:8000
\n\ (dynamically assigned)
call YV6BTF\n\ AR-Cluster (Barcelona); Skimmer capable
ZL2AQY-10olson.net.nz:9000
\n\ (dynamically assigned)
call DXSpider (Glenfield, Auckland); Sysop: ZL2AQY
ZL2ARN-10zl2arn.dyndns.org:7300
\n\ (dynamically assigned)
call DXSpider (Waikanae, Kapiti Coast); Sysop: ZL2ARN
\n\ \n\ "; fldigi-4.1.06/src/dxcluster/dxcluster.cxx0000664000175000017500000011225313507401434015335 00000000000000// ===================================================================== // // dxcluster.cxx // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include #include "config.h" #include "fl_digi.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "threads.h" #include "strutil.h" #include "fileselect.h" //#include "logsupport.h" #include "dx_dialog.h" #include "dx_cluster.h" #include "confdialog.h" #ifdef __MINGW32__ # include "compat/mingw.h" #endif LOG_FILE_SOURCE(debug::LOG_FD); //#define DXC_DEBUG 1 using namespace std; pthread_mutex_t dxcc_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t dxc_line_mutex = PTHREAD_MUTEX_INITIALIZER; //forward declarations of local functions void DXcluster_start(); static char even[50]; static char odd[50]; //====================================================================== // Socket DXcluster i/o used on all platforms //====================================================================== pthread_t DXcluster_thread; pthread_mutex_t DXcluster_mutex = PTHREAD_MUTEX_INITIALIZER; Socket *DXcluster_socket = 0; enum DXC_STATES {DISCONNECTED, CONNECTING, CONNECTED}; int DXcluster_state = DISCONNECTED; bool DXcluster_exit = false; bool DXcluster_enabled = false; #define DXCLUSTER_CONNECT_TIMEOUT 5000 // 5 second timeout #define DXCLUSTER_SOCKET_TIMEOUT 200 // milliseconds #define DXCLUSTER_LOOP_TIME 100 // milliseconds int DXcluster_connect_timeout = (DXCLUSTER_CONNECT_TIMEOUT) / (DXCLUSTER_SOCKET_TIMEOUT + DXCLUSTER_LOOP_TIME); //====================================================================== // support routines all called from DXcluster thread using REQ(...) //====================================================================== void set_btn_dxcc_connect(bool v) { btn_dxcc_connect->value(v); btn_dxcc_connect->redraw(); } void dxc_label() { switch (DXcluster_state) { case CONNECTING: lbl_dxc_connected->color(FL_YELLOW); cluster_tabs->value(tabDXclusterTelNetStream); break; case CONNECTED: lbl_dxc_connected->color(FL_GREEN); cluster_tabs->value(tabDXclusterTelNetStream); break; case DISCONNECTED: default : lbl_dxc_connected->color(FL_WHITE); } lbl_dxc_connected->redraw_label(); lbl_dxc_connected->redraw(); } static string trim(string s) { size_t p; while (s[s.length()-1] == ' ') s.erase(s.length()-1, 1); while ( (p = s.find("\x07")) != string::npos) s.erase(p, 1); while ((p = s.find("\r")) != string::npos) s.erase(p,1); while ((p = s.find("\n")) != string::npos) s.erase(p,1); return s; } //-------------------------------------------------------------------------------- // 1 2 3 4 5 6 7 //01234567890123456789012345678901234567890123456789012345678901234567890123456789 // 1 ^ 2 ^ 3 ^4 5 6 ^ //DX de KB8O: 14240.0 D66D up 10 59 Ohio 2059Z EN81 //DX de W4DL: 18082.0 V44KAI 2220Z //DX de K2IOF: 14240.0 D66D up 5 2220Z //DX de N3ZV: 10147.0 AN400G RTTY 2220Z FM18 //DX de W4LT: 14204.0 EA3HSO 2218Z EL88 //-------------------------------------------------------------------------------- static string tcpip_buffer; void show_tx_stream(string buff) { size_t p; while ((p = buff.find("\r")) != string::npos) buff.erase(p,1); if (buff[buff.length()-1] != '\n') buff += '\n'; brws_tcpip_stream->insert_position(brws_tcpip_stream->buffer()->length()); brws_tcpip_stream->addstr(buff, FTextBase::XMIT); #ifdef DXC_DEBUG string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[T]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } void show_rx_stream(string buff) { for (size_t p = 0; p < buff.length(); p++) { if ( (buff[p] < '\n') || (buff[p] > '\n' && buff[p] < ' ') || (buff[p] > '~') ) buff[p] = ' '; } if (buff.empty()) buff = "\n"; else if (buff[buff.length()-1] != '\n') buff += '\n'; brws_tcpip_stream->insert_position(brws_tcpip_stream->buffer()->length()); brws_tcpip_stream->addstr(buff, FTextBase::RECV); #ifdef DXC_DEBUG string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[R]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } void show_error(string buff) { if (buff.empty()) return; if (!brws_tcpip_stream) return; if (buff[buff.length()-1] != '\n') buff += '\n'; brws_tcpip_stream->addstr(buff, FTextBase::CTRL); brws_tcpip_stream->redraw(); #ifdef DXC_DEBUG string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[E]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } static void odd_even() { char hdr[100]; snprintf(hdr, sizeof(hdr), "@F%d@S%d@.Spotter Freq Dx Station Notes UTC LOC", progdefaults.DXC_textfont, progdefaults.DXC_textsize); reports_header->clear(); reports_header->add(hdr); reports_header->redraw(); snprintf(odd, sizeof(odd), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_odd_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); snprintf(even, sizeof(even), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_even_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); } void dxc_lines_redraw() { guard_lock dxcc_lock(&dxc_line_mutex); odd_even(); int n = brws_dx_cluster->size(); if (n == 0) return; queue lines; string dxc_line; size_t p; for (int i = 0; i < n; i++) { dxc_line = brws_dx_cluster->text(i+1); p = dxc_line.find("."); if (p != string::npos) dxc_line.erase(0,p+1); lines.push(dxc_line); } brws_dx_cluster->clear(); for (int i = 0; i < n; i++) { if (i % 2) dxc_line.assign(even); else dxc_line.assign(odd); dxc_line.append(lines.front()); lines.pop(); brws_dx_cluster->insert(1, dxc_line.c_str()); } if (progdefaults.dxc_topline) brws_dx_cluster->make_visible(1); else brws_dx_cluster->bottomline(brws_dx_cluster->size()); brws_dx_cluster->redraw(); } void dxc_lines() { guard_lock dxcc_lock(&dxc_line_mutex); odd_even(); int n = brws_dx_cluster->size(); if (n == 0) return; queue lines; string dxc_line; size_t p; for (int i = 0; i < n; i++) { if (progdefaults.dxc_topline) dxc_line = brws_dx_cluster->text(i+1); else dxc_line = brws_dx_cluster->text(n - i); p = dxc_line.find("."); if (p != string::npos) dxc_line.erase(0,p+1); lines.push(dxc_line); } brws_dx_cluster->clear(); for (int i = 0; i < n; i++) { if (i % 2) dxc_line.assign(even); else dxc_line.assign(odd); dxc_line.append(lines.front()); lines.pop(); if (progdefaults.dxc_topline) brws_dx_cluster->insert(1, dxc_line.c_str()); else brws_dx_cluster->add(dxc_line.c_str()); } if (progdefaults.dxc_topline) brws_dx_cluster->make_visible(1); else brws_dx_cluster->bottomline(brws_dx_cluster->size()); brws_dx_cluster->redraw(); } void parse_dxline(string buffer) { guard_lock dxcc_lock(&dxc_line_mutex); snprintf(odd, sizeof(odd), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_odd_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); snprintf(even, sizeof(even), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_even_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); buffer.erase(0, strlen("DX de ")); size_t p = buffer.find(":"); if (p != string::npos) buffer.replace(p, 1, " "); string dxc_line; if (brws_dx_cluster->size() % 2) dxc_line.assign(even); else dxc_line.assign(odd); dxc_line.append(buffer); if (progdefaults.dxc_topline) { bool visible = brws_dx_cluster->displayed(1); brws_dx_cluster->insert(1, dxc_line.c_str()); if (visible) brws_dx_cluster->make_visible(1); } else { bool visible = brws_dx_cluster->displayed(brws_dx_cluster->size()); brws_dx_cluster->add(dxc_line.c_str()); if (visible) brws_dx_cluster->bottomline(brws_dx_cluster->size()); } } void show_help_line(string buff) { brws_dxc_help->insert_position(brws_dxc_help->buffer()->length()); brws_dxc_help->addstr(buff, FTextBase::RECV); #ifdef DXC_DEBUG string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[W]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } enum server_type {NIL, DX_SPIDER, AR_CLUSTER, CC_CLUSTER}; static int cluster_login = NIL; static bool logged_in = false; void register_dxspider() { string login; login.assign("set/page 0\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/name ").append(progdefaults.myName); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qth ").append(progdefaults.myQth); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qra ").append(progdefaults.myLocator); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); } void login_to_dxspider() { if (!DXcluster_socket) return; try { string login = progdefaults.dxcc_login; login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); if (progdefaults.dxcc_password.empty()) register_dxspider(); logged_in = true; cluster_login = NIL; } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } void login_to_arcluster() { string login = progdefaults.dxcc_login; login.append("\r\n"); try { DXcluster_socket->send(login); REQ(show_tx_stream, login); logged_in = true; cluster_login = NIL; } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } /* * telnet session with dxspots.com 7300 * Trying 204.221.76.52... Connected to dxspots.com. Escape character is '^]'. Greetings from the AE5E CC Cluster in Thief River Falls MN USA Running CC Cluster software version 3.101b ************************************************************************* * * * Please login with a callsign indicating your correct country * * Portable calls are ok. * * * ************************************************************************ New commands: set/skimmer turns on Skimmer spots. set/noskimmer turns off Skimmer spots. set/own turns on Skimmer spots for own call. set/noown turns them off. set/nobeacon turns off spots for beacons. set/beacon turns them back on. For information on CC Cluster software see: http://bcdxc.org/ve7cc/ccc/CCC_Commands.htm Please enter your call: login: w1hkj W1HKJ Hello David. CC-User is the recommended telnet acess program. It simplifies filtering, may be used stand alone or can feed spots to your logging program. CC_User is free at: http://ve7cc.net/default.htm#prog CC_User group at: http://groups.yahoo.com/group/ARUser Using telnet port 7000 Cluster: 423 nodes 459 Locals 4704 Total users Uptime 7 days 15:32 Date Hour SFI A K Forecast Logger 19-Nov-2016 0 78 3 0 No Storms -> No Storms W1HKJ de AE5E 19-Nov-2016 0154Z CCC > W1HKJ de AE5E 19-Nov-2016 0154Z CCC > bye 73 David. W1HKJ de AE5E 19-Nov-2016 0154Z CCC > Connection closed by foreign host. */ void register_cccluster() { string login; login.assign("set/name ").append(progdefaults.myName); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qth ").append(progdefaults.myQth); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qra ").append(progdefaults.myLocator); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/noskimmer"); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/noown"); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/nobeacon"); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); } void login_to_cccluster() { if (!DXcluster_socket) return; try { string login = progdefaults.dxcc_login; login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); if (progdefaults.dxcc_password.empty()) register_cccluster(); logged_in = true; cluster_login = NIL; } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } void send_password() { if (!DXcluster_socket || logged_in == false || inp_dxcc_password->value()[0] == 0) return; try { string password = inp_dxcc_password->value(); password.append("\r\n"); DXcluster_socket->send(password); REQ(show_tx_stream, password); switch (cluster_login) { case AR_CLUSTER: break; case CC_CLUSTER: register_cccluster(); break; case DX_SPIDER: register_dxspider(); break; } } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } static bool help_lines = false; void init_cluster_stream() { string buffer; help_lines = false; tcpip_buffer.clear(); brws_tcpip_stream->clear(); brws_tcpip_stream->redraw(); } void parse_DXcluster_stream(string input_buffer) { guard_lock dxcc_lock(&dxcc_mutex); string buffer; string ucasebuffer = ucasestr(input_buffer); if (!logged_in) { if (ucasebuffer.find("AR-CLUSTER") != string::npos) { // AR cluster init_cluster_stream(); cluster_login = AR_CLUSTER; } else if (ucasebuffer.find("CC CLUSTER") != string::npos) { // CC cluster init_cluster_stream(); cluster_login = CC_CLUSTER; } else if (ucasebuffer.find("LOGIN:") != string::npos) { // DX Spider init_cluster_stream(); cluster_login = DX_SPIDER; } } tcpip_buffer.append(input_buffer); string strm; string its_me = progdefaults.dxcc_login; its_me.append(" DE "); its_me = ucasestr(its_me); size_t p; while (!tcpip_buffer.empty()) { p = tcpip_buffer.find("\n"); if (p != string::npos) { buffer = trim(tcpip_buffer.substr(0, p)); tcpip_buffer.erase(0, p + 1); } else { buffer = trim(tcpip_buffer); tcpip_buffer.clear(); } REQ(show_rx_stream, buffer); ucasebuffer = ucasestr(buffer); if (ucasebuffer.find("DX DE") != string::npos) { parse_dxline(buffer); continue; } if (ucasebuffer.find("HELP") != string::npos) { help_lines = true; } if (ucasebuffer.find(its_me) != string::npos) { help_lines = false; continue; } if (help_lines) { show_help_line(buffer); continue; } if (cluster_login == AR_CLUSTER && ucasebuffer.find("CALL:") != string::npos) login_to_arcluster(); if (cluster_login == CC_CLUSTER && ucasebuffer.find("CALL:") != string::npos) login_to_cccluster(); if (cluster_login == DX_SPIDER && ucasebuffer.find("LOGIN:") != string::npos) login_to_dxspider(); if (cluster_login == DX_SPIDER && ucasebuffer.find("PASSWORD:") != string::npos) send_password(); } } void clear_dxcluster_viewer() { guard_lock dxcc_lock(&dxcc_mutex); brws_dx_cluster->clear(); brws_tcpip_stream->clear(); } //====================================================================== // Receive tcpip data stream //====================================================================== void DXcluster_recv_data() { if (!DXcluster_socket) return; string tempbuff; try { guard_lock dxc_lock(&DXcluster_mutex); if (DXcluster_state == CONNECTED) { DXcluster_socket->recv(tempbuff); if (!tempbuff.empty()) REQ(parse_DXcluster_stream, tempbuff); } } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); } } //====================================================================== // //====================================================================== const char *default_help[]={ "Help available after logging on", "Try URL: k4zr.no-ip.org, PORT 7300", "", "Visit http://www.dxcluster.info/telnet/ for a listing of dx cluster servers", NULL }; void dxc_help_query() { // brws_dxc_help->clear(); if ((DXcluster_state == DISCONNECTED) || !DXcluster_socket) { brws_dxc_help->clear(); const char **help = default_help; while (*help) { brws_dxc_help->add(*help); help++; } return; } try { guard_lock dxc_lock(&DXcluster_mutex); string sendbuf = "help"; if (inp_help_string->value()[0]) { string helptype = inp_help_string->value(); if (ucasestr(helptype).find("HELP") != string::npos) sendbuf = helptype; else sendbuf.append(" ").append(helptype); } sendbuf.append("\r\n"); DXcluster_socket->send(sendbuf.c_str()); REQ(show_tx_stream, sendbuf); } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } void dxc_help_clear() { guard_lock dxcc_lock(&dxcc_mutex); brws_dxc_help->clear(); } //====================================================================== // //====================================================================== void DXcluster_submit() { if (!DXcluster_socket) return; try { guard_lock dxc_lock(&DXcluster_mutex); string sendbuf = trim(inp_dxcluster_cmd->value()); string test = ucasestr(sendbuf); if (test.find("BYE") != string::npos) { fl_alert2("Uncheck the \"Connect\" button to disconnect!"); logged_in = false; return; } sendbuf.append("\r\n"); DXcluster_socket->send(sendbuf.c_str()); REQ(show_tx_stream, sendbuf); } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } inp_dxcluster_cmd->value(""); } void rf_af(long &rf, long &af) { mode_t md = active_modem->get_mode(); string testmode = qso_opMODE->value(); bool xcvr_useFSK = (testmode.find("RTTY") != string::npos); if (md == MODE_SSB) { af = 0; return; } if (md == MODE_CW) { af = progdefaults.CWsweetspot; string smode = qso_opMODE->value(); if (smode.find("CW") == string::npos) { if (wf->USB()) rf -= af; else rf += af; } } else if (md == MODE_RTTY) { if (xcvr_useFSK) { af = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift]/2; } else { int shift = rtty::SHIFT[progdefaults.rtty_shift]; af = progdefaults.RTTYsweetspot; if (progdefaults.useMARKfreq) { if (wf->USB()) rf -= (af + shift / 2); else rf += (af - shift / 2); } else { if (wf->USB()) rf -= af; else rf += af; } } } else { af = progdefaults.PSKsweetspot; if (wf->USB()) rf -= af; else rf += af; } return; } void DXcluster_select() { int sel = brws_dx_cluster->value(); if (sel == 0) return; //-------------------------------------------------------------------------------- // 1 2 3 4 5 6 7 //01234567890123456789012345678901234567890123456789012345678901234567890123456789 // 1^ ^ 3 ^ 4 5 6 ^ //KB8O 14240.0 D66D up 10 59 Ohio 2059Z EN81 string dxcline = brws_dx_cluster->text(sel); size_t p = dxcline.find("@."); if (p == string::npos) return; // remove rendition characters dxcline = dxcline.substr(p + 2); // remove reporting stations call p = dxcline.find(" "); dxcline.erase(0, p+1); // find reported frequency while (dxcline[0] == ' ') dxcline.erase(0,1); p = dxcline.find(" "); string sfreq = dxcline.substr(0, p); dxcline.erase(0, p+1); // find dx call while (dxcline[0] == ' ') dxcline.erase(0,1); p = dxcline.find(" "); string dxcall = trim(dxcline.substr(0, p)); dxcline.erase(0, p+1); // treat remainder as remarks // search for a mode name in the remarks // change to that mode if discovered dxcline = ucasestr(dxcline); for (int i = 0; i < NUM_MODES-3; i++) { if (dxcline.find(mode_info[i].adif_name) != string::npos) { if (active_modem->get_mode() != mode_info[i].mode) init_modem_sync(mode_info[i].mode); break; } } inpCall->value(dxcall.c_str()); long freq = (long)(atof(sfreq.c_str()) * 1000.0 + 0.5); // does remark section have a [nn] block? p = dxcline.find("["); if (p != string::npos) { dxcline.erase(0, p+1); p = dxcline.find("]"); if (p == 2) freq += atoi(dxcline.c_str()); } long af = 1500; rf_af(freq, af); qsy(freq, af); } //-------------------------------------------------------------------------------- // 1 2 3 4 5 6 7 //01234567890123456789012345678901234567890123456789012345678901234567890123456789 // 1 ^ 2 ^ 3 ^4 5 6 ^ //7080.4 CO3VR Optional Comment void freqstrings( string &khz, string &hz ) { string sfreq = inpFreq->value(); int phz = sfreq.length() - 2; hz = sfreq.substr(phz, 2); sfreq.erase(phz); size_t p = sfreq.find("."); if (p != string::npos) sfreq.erase(p,1); long freq = atol(sfreq.c_str()); if (!progdefaults.dxc_hertz) { if (hz > "49") freq++; } char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%ld", freq); khz = szfreq; khz.insert(khz.length() - 1, "."); return; } void send_DXcluster_spot() { if (inpCall->value()[0] == 0) return; // no call string hz, khz; freqstrings( khz, hz ); string spot = "dx "; spot.append(khz) .append(" ") .append(inpCall->value()) .append(" "); string comments = trim(inp_dxcluster_cmd->value()); string currmode = mode_info[active_modem->get_mode()].adif_name; if (comments.find(currmode) == string::npos) { if (progdefaults.dxc_hertz) { currmode.append(" [") .append(hz). append("] "); } comments.insert(0, currmode); } spot.append(comments); inp_dxcluster_cmd->value(spot.c_str()); tabDXclusterTelNetStream->show(); } //====================================================================== // //====================================================================== bool connect_changed; bool connect_to_cluster; void DXcluster_doconnect() { int result = 0; if (connect_to_cluster) { REQ(clear_dxcluster_viewer); try { if (DXcluster_state == DISCONNECTED) { if (DXcluster_socket) { DXcluster_socket->shut_down(); DXcluster_socket->close(); delete DXcluster_socket; DXcluster_socket = 0; DXcluster_state = DISCONNECTED; REQ(dxc_label); } Address addr = Address( progdefaults.dxcc_host_url.c_str(), progdefaults.dxcc_host_port.c_str() ); DXcluster_socket = new Socket( addr ); DXcluster_socket->set_nonblocking(true); DXcluster_socket->set_timeout((double)(DXCLUSTER_SOCKET_TIMEOUT / 1000.0)); } result = DXcluster_socket->connect(); if ( (result == 0) || (result == EISCONN) || (result == EALREADY) ) { DXcluster_state = CONNECTED; REQ(dxc_label); LOG_INFO( "Connected to dxserver %s:%s", progdefaults.dxcc_host_url.c_str(), progdefaults.dxcc_host_port.c_str() ); connect_changed = false; return; } else if ( (result == EWOULDBLOCK) || (result == EINPROGRESS) ) DXcluster_state = CONNECTING; else DXcluster_state = DISCONNECTED; if ((DXcluster_state == CONNECTING) && (DXcluster_connect_timeout-- <= 0) ) { REQ(show_error, "Connection attempt timed out"); DXcluster_state = DISCONNECTED; set_btn_dxcc_connect(false); REQ(dxc_label); DXcluster_socket->shut_down(); DXcluster_socket->close(); delete DXcluster_socket; DXcluster_socket = 0; } else { LOG_INFO("Connecting %f seconds remaining", DXcluster_connect_timeout * DXCLUSTER_LOOP_TIME * 0.001); } connect_changed = false; return; } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); connect_to_cluster = false; connect_changed = false; DXcluster_state = DISCONNECTED; set_btn_dxcc_connect(false); REQ(dxc_label); return; } } else { if (!DXcluster_socket) { REQ(show_error, "NO socket!"); DXcluster_state = DISCONNECTED; connect_to_cluster = false; connect_changed = false; set_btn_dxcc_connect(false); REQ(dxc_label); return; } try { string bye = "BYE\r\n"; DXcluster_socket->send(bye); REQ(show_tx_stream, bye); } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); DXcluster_state = DISCONNECTED; connect_to_cluster = false; connect_changed = false; set_btn_dxcc_connect(false); REQ(dxc_label); return; } MilliSleep(50); logged_in = false; DXcluster_socket->shut_down(); DXcluster_socket->close(); delete DXcluster_socket; DXcluster_socket = 0; DXcluster_state = DISCONNECTED; lbl_dxc_connected->color(FL_WHITE); lbl_dxc_connected->redraw(); progStatus.cluster_connected = false; set_btn_dxcc_connect(false); LOG_INFO("Disconnected from dxserver"); } connect_changed = false; } void DXcluster_connect(bool val) { connect_changed = true; connect_to_cluster = val; } //====================================================================== // Thread loop //====================================================================== void *DXcluster_loop(void *args) { SET_THREAD_ID(DXCC_TID); while(1) { MilliSleep(DXCLUSTER_LOOP_TIME); if (DXcluster_exit) break; if (connect_changed || (DXcluster_state == CONNECTING) ) DXcluster_doconnect(); if (DXcluster_state == CONNECTED) DXcluster_recv_data(); } // exit the DXCC thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void DXcluster_init(void) { DXcluster_enabled = false; DXcluster_exit = false; if (pthread_create(&DXcluster_thread, NULL, DXcluster_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "dxserver thread started"); DXcluster_enabled = true; char hdr[100]; snprintf(hdr, sizeof(hdr), "@F%d@S%d@.Spotter Freq Dx Station Notes UTC LOC", progdefaults.DXC_textfont, progdefaults.DXC_textsize); reports_header->clear(); reports_header->add(hdr); reports_header->has_scrollbar(0); brws_tcpip_stream->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_tcpip_stream->setFont(progdefaults.DXfontnbr); brws_tcpip_stream->setFontSize(progdefaults.DXfontsize); brws_tcpip_stream->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->setFontColor( fl_contrast(progdefaults.DXfontcolor, fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B) ), FTextBase::CTRL); ed_telnet_cmds->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); ed_telnet_cmds->setFont(progdefaults.DXfontnbr); ed_telnet_cmds->setFontSize(progdefaults.DXfontsize); ed_telnet_cmds->setFontColor(progdefaults.DXfontcolor); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); cluster_tabs->selection_color(progdefaults.TabsColor); if (progdefaults.dxc_auto_connect) { DXcluster_connect(true); set_btn_dxcc_connect(true); } #ifdef DXC_DEBUG string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "w"); fprintf(dxcdebug, "DXC session\n\n"); fclose(dxcdebug); #endif } //====================================================================== // //====================================================================== void DXcluster_close(void) { if (!DXcluster_enabled) return; if ((DXcluster_state != DISCONNECTED) && DXcluster_socket) { DXcluster_connect(false); int n = 500; while ((DXcluster_state != DISCONNECTED) && n) { MilliSleep(10); n--; } if (n == 0) { LOG_ERROR("%s", _("Failed to shut down dxcluster socket")); fl_message2(_("Failed to shut down dxcluster socket")); exit(1); return; } } DXcluster_exit = true; pthread_join(DXcluster_thread, NULL); DXcluster_enabled = false; LOG_INFO("%s", "dxserver thread terminated. "); if (DXcluster_socket) { DXcluster_socket->shut_down(); DXcluster_socket->close(); } } void dxcluster_hosts_save() { string hosts = ""; int nlines = brws_dxcluster_hosts->size(); if (!nlines) { progdefaults.dxcluster_hosts = hosts; return; } string hostline; size_t p; for (int n = 1; n <= nlines; n++) { hostline = brws_dxcluster_hosts->text(n); p = hostline.find("@."); if (p != string::npos) hostline.erase(0,p+2); hosts.append(hostline).append("|"); } progdefaults.dxcluster_hosts = hosts; progdefaults.changed = true; } void dxcluster_hosts_load() { brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); brws_dxcluster_hosts->clear(); if (progdefaults.dxcluster_hosts.empty()) { return; } string hostline; string hosts = progdefaults.dxcluster_hosts; size_t p = hosts.find("|"); size_t p2; while (p != string::npos && p != 0) { hostline.assign(hosts.substr(0,p+1)); p2 = hostline.find("::|"); if (p2 != string::npos) hostline.insert(p2 + 1, progdefaults.myCall); p2 = hostline.find("|"); if (p2 != string::npos) hostline.erase(p2, 1); brws_dxcluster_hosts->add(hostline.c_str()); hosts.erase(0, p+1); p = hosts.find("|"); } brws_dxcluster_hosts->sort(FL_SORT_ASCENDING); brws_dxcluster_hosts->redraw(); } void dxcluster_hosts_select(Fl_Button*, void*) { string host_line; int line_nbr = brws_dxcluster_hosts->value(); if (line_nbr == 0) return; host_line = brws_dxcluster_hosts->text(line_nbr); string host_name, host_port, host_login, host_password; size_t p = host_line.find("@."); if (p != string::npos) host_line.erase(0, p + 2); p = host_line.find(":"); if (p == string::npos) return; host_name = host_line.substr(0, p); host_line.erase(0, p+1); p = host_line.find(":"); if (p == string::npos) return; host_port = host_line.substr(0, p); host_line.erase(0, p+1); p = host_line.find(":"); if (p == string::npos) host_login = host_line; else { host_login = host_line.substr(0, p); host_line.erase(0, p+1); host_password = host_line; } progdefaults.dxcc_host_url = host_name; inp_dxcc_host_url->value(host_name.c_str()); inp_dxcc_host_url->redraw(); progdefaults.dxcc_host_port = host_port; inp_dccc_host_port->value(host_port.c_str()); inp_dccc_host_port->redraw(); progdefaults.dxcc_login = host_login; inp_dccc_login->value(host_login.c_str()); inp_dccc_login->redraw(); progdefaults.dxcc_password = host_password; inp_dxcc_password->value(host_password.c_str()); inp_dxcc_password->redraw(); } void dxcluster_hosts_delete(Fl_Button*, void*) { int line_nbr = brws_dxcluster_hosts->value(); if (line_nbr == 0) return; brws_dxcluster_hosts->remove(line_nbr); dxcluster_hosts_save(); brws_dxcluster_hosts->redraw(); } void dxcluster_hosts_clear(Fl_Button*, void*) { brws_dxcluster_hosts->clear(); dxcluster_hosts_save(); brws_dxcluster_hosts->redraw(); } void dxcluster_hosts_add(Fl_Button*, void*) { brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); string host_line = progdefaults.dxcc_host_url.c_str(); host_line.append(":").append(progdefaults.dxcc_host_port.c_str()); host_line.append(":").append(progdefaults.dxcc_login); host_line.append(":").append(progdefaults.dxcc_password); if (brws_dx_cluster->size() > 0) { for (int i = 1; i <= brws_dxcluster_hosts->size(); i++) { if (host_line == brws_dxcluster_hosts->text(i)) return; } } brws_dxcluster_hosts->add(host_line.c_str()); brws_dxcluster_hosts->sort(FL_SORT_ASCENDING); brws_dxcluster_hosts->redraw(); dxcluster_hosts_save(); } void dxcluster_hosts_clear_setup(Fl_Button*, void*) { ed_telnet_cmds->clear(); } void dxcluster_hosts_load_setup(Fl_Button*, void*) { const char* p = FSEL::select( _("Load dxcluster setup file"), "*.dxc", ScriptsDir.c_str()); if (!p) return; if (!*p) return; ed_telnet_cmds->buffer()->loadfile(p); } void dxcluster_hosts_save_setup(Fl_Button*, void*) { string defaultfilename = ScriptsDir; defaultfilename.append("default.dxc"); const char* p = FSEL::saveas( _("Save dxcluster setup file"), "*.dxc", defaultfilename.c_str()); if (!p) return; if (!*p) return; ed_telnet_cmds->buffer()->savefile(p); } void dxc_send_string(string &tosend) { if (!DXcluster_socket) return; string line; size_t p; while (!tosend.empty()) { p = tosend.find("\n"); if (p != string::npos) { line = tosend.substr(0,p); tosend.erase(0,p+1); } else { line = tosend; tosend.clear(); } line.append("\r\n"); try { DXcluster_socket->send(line); REQ(show_tx_stream, line); } catch (const SocketException& e) { string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } } void dxcluster_hosts_send_setup(Fl_Button*, void*) { char *str = ed_telnet_cmds->buffer()->text(); string tosend = str; free(str); dxc_send_string(tosend); } #include #include "arc-help.cxx" void dxcluster_ar_help(Fl_Button*, void*) { string fn_help = HelpDir; fn_help.append("arc_help.html"); ifstream f_help(fn_help.c_str()); if (!f_help) { ofstream fo_help(fn_help.c_str()); fo_help << arc_commands; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } #include "CCC_Commands.cxx" void dxcluster_cc_help(Fl_Button*, void*) { string fn_help = HelpDir; fn_help.append("ccc_help.html"); ifstream f_help(fn_help.c_str()); if (!f_help) { ofstream fo_help(fn_help.c_str()); fo_help << ccc_commands; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } #include "DXSpiderCommandReference.cxx" void dxcluster_dx_help(Fl_Button*, void*) { string fn_help = HelpDir; fn_help.append("dxc_help.html"); ifstream f_help(fn_help.c_str()); if (!f_help) { ofstream fo_help(fn_help.c_str()); fo_help << dxspider_cmds; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } #include "DXClusterServers.cxx" void dxcluster_servers(Fl_Button*, void*) { string fn_help = HelpDir; fn_help.append("dxc_servers.html"); ifstream f_help(fn_help.c_str()); if (!f_help) { ofstream fo_help(fn_help.c_str()); fo_help << dxcc_servers; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } void dxc_click_m1(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_1.c_str()); } void dxc_click_m2(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_2.c_str()); } void dxc_click_m3(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_3.c_str()); } void dxc_click_m4(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_4.c_str()); } void dxc_click_m5(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_5.c_str()); } void dxc_click_m6(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_6.c_str()); } void dxc_click_m7(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_7.c_str()); } void dxc_click_m8(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_8.c_str()); } fldigi-4.1.06/src/dxcluster/arc-help.cxx0000644000175000017500000002146413472115772015024 00000000000000string arc_commands = "\ \n\ \n\ \n\ \n\ AR Commands\n\ \n\ \n\
\n\

Overview of\n\ AR-Cluster User\n\ Commands

\n\

The\n\ following list is a summary of AR-Cluster commands.  The upper case part of the commands is\n\ required and the lower\n\ case part of the command is optional. \n\ Thus the command A/F is the same as the Announce/Full command.

\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
AnnounceAnnouncement to all locally users
Announce/FullAnnouncement to all users
ByeTerminate the connection to the cluster
CLEAR/QSLRemove a QSL route from the local QSL database
CONFErenceEnter a local conference
CONFErence/FullEnter a network wide conference
DBBuilt in database information
DEeleteDelete a mail message
DIrectroyList mail messages
DxEnter as DX spot
HelpCommand for help
ListList mail messages
QuitTerminate the connection to the cluster
ReadRead a mail message
REPlyReply to a mail message
SendSend a mail message
SEt/ANNouncementsTurn on announcements
SEt/BEepTurn on a beep for DX and Announcement spots
SEt/DX_AnnouncementsActivate DX spots
SEt/DXSqthTurn on the display of the spotter QTH
SEt/EMAILSet your Internet email address
SEt/FILTERSet the spot filters
SEt/HEreLet others know you are at your station
SEt/HOMenodeSet your home node
SEt/LOCAtionSet the location (lat/lon) of your station
SEt/LOGIN_announcementsShow user logins
SEt/NameSet your name
SEt/NOAnnouncementsTurn off announcements
SEt/NOBeepTurn off the beep for DX and Announcements
SEt/NODX_AnnouncementsTurn off DX announcements
SEt/NODXSqthTurn off the display of the spotter QTH
SEt/NOHereIndicate you are away from your station
SEt/NOLOGin_announcementsTurn off login announcements
SEt/NOTalkTurn off the display of talk messages
SEt/NOWWV_announcementsTurn off the display of WWV spots
SEt/NOWX_announcementsTurn off the display of weather announcements
Set/PHONESet your phone number
Set/QRASet the QRA for your station
Set/QSLAdd a QSL route to the local database
SEt/QTHSet your location (city, etc)
SEt/TAlkTurn on the display of talk messages
SEt/WWV_announcementsTurn on the display of WWV spots
SEt/WX_announcementsTurn on the display of weather announcements
SHow/ANnounceShow previous announcements
SHow/ARCHiveShow the files in the archive folder
SHow/BUCmasterShow callbook information for a specified callsign
SHow/BULLEtinsShow the files in the bulletins folder
SHow/CBAShow callbook information for a specified callsign
SHow/CLusterShow the configuration of the cluster
SHow/ConfigurationShow the users on the node
SHow/DxShow previous DX spots
SHow/Dx SQLQuery for past DX using SQL
SHow/EMAILShow a users Internet email address
SHow/FDxDisplay a formatted SH/DX command
SHow/FILEsShow the files in the files folder
SHow/FILTERShows the current DX spot filters
SHow/FITuDisplay a formatted SH/ITU
#Formatted\">SHow/FZOneDisplay a formatted SH/ZONE
SHow/GridShow the MaidenHead grid locator for a station
SHow/HAMShow callbook information for a specified callsign
SHow/HeadingShow the heading and distance to a station
SHow/HOMEnodeShow a users homenode
SHow/ITuShow past DX based on a ITU zone
SHow/LOCationShow the location (lat/lon) of a station
SHow/LOGShow the node logins for a call
SHow/MufShow the MUF for a country
SHow/NEedsShow the CTY needs for a station
SHow/NOdesDisplays a list of nodes in the network
SHow/PrefixShow the prefix information for a call
Show/QRAShow the station QRA
SHow/QslShow QSL information for a call
SHow/STationShow detail information for a call
SHow/SunShow the sunrise/sunset for a location
SHow/TAlkShow past talk messages
SHow/TImeShow the time
SHow/TIPShow a tip about using the cluster
Show/UPTimeShows the uptime for the node
SHow/UsersShow the users connected to the node
SHow/VersionShows the AR-Cluster software version
SHow/WWvShows past WWV information
SHow/WXShow past weather announcements
SHow/WXStationShow data from an optional weather station
SHow/ZoneShow past DX based on a CQ zone
TalkTalk to a station
Talk/TimestampTalk to a station with a timestamp
Type/ARChiveDisplay a file in the archive folder
Type/BULletinsDisplay a file in the bulletin folder
Type/FILesDisplay a file in the files folder
WwvSend a WWV spot to the cluster
WXMake a local weather announcement
WX/FullMake a weather announcement to the network
\n\
\n\ \n\ "; fldigi-4.1.06/src/dxcluster/CCC_Commands.cxx0000644000175000017500000005650213472115772015543 00000000000000std::string ccc_commands = "\n\ \n\ \n\ \n\ \n\ CCC Commands\n\ \n\ \n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\

CC Cluster Commands

\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
ANnounceSend an announcement to local USERs.  (AN<Text Message>)
ANnounce/FullSend an announcement to all nodes and USERs.  (AN/F <Text Message>)
BYEDisconnect from the node. (BYE) or (B)
DXSend a DX spot.  (DX <Callsign> <Frequency> or DX <Frequency> <Callsign>)
DXTestReturns  to USER only. (DXT P5NOW 14006.06) Good for testing RES 1 & RES 2
DIRShows mail messages on the node
DIR/BULLETINShows mail messages to ALL, BULLETIN and anything not to a call
DIR/NEWShows only mail messages you haven't seen since your last DIR
DIR/OWNShows only mail messages to you including messages to ALL & ones you sent
DIR/SUBJECTShows mail messages with subject you enter.  (DIR/SUBJECT ARL)
DELeteDelete mail messages. (DEL (Msg #) (DEL 1-99) Deletes your messages from 1 to 99
KillDelete mail messages.  (K (Msg #) (K 1-99) Deletes your messages from 1 to 99
ListShows mail messages on the node
List/NEWShows only mail messages you haven't seen since your last DIR or L
List/OWNShows only mail messages to you including messages to ALL & ones you sent
QUITDisconnect from the node
READRead cluster mail.  (READ <Message #>)  See Mail Send/Receive below
REplyREply without a number following replies to the last mail message you read. \n\ REply <#> replies to the message with that number given. \n\ REply/DELete replies to message and deletes it.  REply/DELete/RR replies\n\ to message, delets message and gets a return receipt.  REply/RR replies\n\ to message and gets a return receipt. 
SEND(SEND <Callsign>) Sends mail  to that callsign. SEND <LOCAL>\n\ to just send a message to local node USERs.  SEND <ALL>, SEND\n\ <FORSALE> and SEND <DXNEWS> will be passed to all nodes for all USERs.
SET/ANNTurn on announcements
SET/BEACONTurn on beacon spots.  These are spots ending in \"/B\" or \"BCN\"
SET/BEEPTurn on a beep for DX and Announcement spots
SET/BOBTurn on bottom of band DX spots
SET/DXTurn on DX spot announcements
SET/DXCQTurn on CQ Zone in DX info for DX spots
SET/DXITUTurn on ITU Zone in DX info for DX spots
SET/DXSTurn on US state/province or country in DX info for DX spots
SET/USSTATETurn on US\n\ state or Canadian province spotter in DX info for DX spots
SET/FILTERSee Band\n\ & Mode Filtering Below
SET/GRIDTurns on DX\n\ Grid, toggles CQ Zone, ITU Zone, & US State to off
SET/HOMETell cluster\n\ your home node. (SET/HOME <Node Call>) If you normally connect to\n\ K8SMC then it would be (SET/HOME K8SMC) 
SET/LOCATIONSet your location (lat/lon) of your station.  (SET/LOCATION 42 17 N 84 21 W)
SET/LOGINTells cluster to send USER connects and disconnects.
SET/NAMESet your name (SET/NAME <First Name>)
SET/NOANNTurn off announcements.
SET/NOBEACONTurn off beacon spots.  These are spots ending in \"/B\" or \"BCN\"
SET/NOBEEPTurn off a beep for DX and Announcement spots\n\ .
SET/NOBOBTurn off bottom of band DX spots.
SET/NOCQTurn off CQ Zone in spot announcements.
SET/NODXTurn off DX spot announcements.
SET/NODXCQTurn off CQ Zone in DX info for DX spots
SET/NODXITUTurn off ITU Zone in DX info for DX spots
SET/NODXSTurn off US state/province or country in DX info for DX spots
SET/NOUSSTATETurn off US state or Canadian province spotter in DX info for DX spots
SET/NOGRIDTurn off DX Grids in spot announcements
SET/NOITUTurn off ITU Zone in spot announcements
SET/NOLOGINStops cluster from sending USER connects and disconnects
SET/NOOWNTurn off skimmer spots for your own call
SET/NOSELFTurn off self spots by other users
SET/NOSKIMMERTurn off Skimmer spots
SET/NOTALKTurn off the display of talk messages
SET/NOWCYTurn off the display of WCY spots
SET/NOWWVTurn off the display of WWV spots
SET/NOWXTurn off the display of weather announcements
SET/OWNTurn on Skimmer spots for own call
SET/NOLOGINStops cluster from sending USER connects and disconnects
SET/QRAInput your Grid Square. (SET/QRA EN72)
SET/QTHSet your city and state. (SET/QTH <City, State>) DX <City, Country>
SET/RES 1Tells CC-Cluster to give you 1 decimal point rounding in DX spots
SET/RES 2Tells CC-Cluster to give you 2 decimal point rounding in DX spots
SET/SELFTurn on self spots by other users
SET/SKIMMERTurn on Skimmer spots
SET/TALKTurn on the display of talk messages
SET/USSTATETurns on US State, toggles CQ Zone, DX Grid, & ITU Zone to off
SET/WCYTurn on the display of WCY spots
SET/WIDTHSets the line width for DX spots, normally this has been 80 characters.  Depending\n\ on your logging program you can use anything between 45 to 130\n\ characters,  SET/WIDTH XX where XX is the number of characters.
SET/WWVTurn on the display of WWV spots
SET/WXTurn on the display of weather announcements
SHow/CLNode Info and CCC Uptime  See SH/VERSION 
SHow/CONFShows nodes and callsigns of USERs, only nodes called LOCAL by Sysop.
SHow/DXShows last 30 spots
SHow/DX <Call>Shows last 30 spots for that call
SHow/DX/<number>Shows that number of spots.  SH/DX/100
SHow/DX <Band>Shows spots on that band.  SH/DX 20  for 20 meters
SHow/DX/ <Freq>Shows spots by frequency range.  Syntax = SH/DX 7020-7130
SHow/DX <prefix*>Shows all spots for a country, standard prefix not necessary, asterisk needed
SHow/DX 'rtty'Shows spots where the comment field contains (rtty)
SHow/DXBY <call>Shows spots where spotter = Call
SHow/FDXShows real time formatted dx spots.
SHow/FILTERShows how you have your filters set.
SHow/HEAD <Call>Shows heading - distance and bearing for the\n\ call.
SHow/MYANNShows last 5 announcements allowed by your filter settings.
SHow/MYDXShows last 30 spots allowed by your filter settings
SHow/MYDX <Call>Shows last 30 spots for the call allowed by your filter settings.
SHow/MYDX/<number>Shows that number of spots allowed by your filter.  SH/MYDX/100
SHow/MYDX <Band>Shows spots on that band allowed by your filter settings.  SH/MYDX 20  for 20 meters
SHow/MYFDXShows last 30 spots allowed by your filter settings.  
SHow/MYWXShows last 5 weather announcements allowed by your filter settings.
SHow/RESShows the number of digits after the decimal point for frequencies
SHow/SETTINGSShows information on the node for your call and how you are setup.
SHow/STATIONShows information on the node for a station.  (SH/STA <Callsign>)
SHow/SUNShows local sunrise and sunset times.  (SH/SUN <Prefix.) for that country
SHow/TIMEShows GMT time.
SHow/TIME <Call>Shows local time for the call.
SHow/USDBShows State/Province for US/VE calls.  (SH/USDB <Callsign>)
SHow/USERSShows callsigns of everyone connected to the local node.
SHow/VERSIONShows the CCC Uptime for connections.
SHow/WIDTHShows the length of a DX Spot. Normally 80 characters.
SHow/WWVShows WWV info, (SH/WWV) gives last 5 (SH/WWV/99) gives last 99
SHow/WCYShows last 5 DK0WCY, similar to WWV
TalkSend a talk message to someone on the node.  (T<Callsign> <Message>)
UNSET/This command can be used instead of SET/NO, Compatibility for DX-Spider USERs
WHOThis command will return a list of connections in alphabetical order.  Items are: Call User/Node Name IP/AGW
WXThe command \"WX\" will send a local weather announcement.  (WX Sunny and Warm)
\n\
\n\ \n\   \n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
Most Common Used Filter Commands
\n\
\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
Filter Settings:Filters are mostly default to off, but one simple setting for say someone in the US or Canada\n\ that is happy seeing spots from just the US and Canada can do a quick setting for this: SET/FILTER K,VE/PASS
SH/FILTERShows all of your USER\n\ filter settings
SH/FILTER <aaa>Show setting for specific filter, <aaa> = filter name.
\n\ SH/FILTER DOC = DX Origination Country
\n\ SH/FILTER DOS = DX Origination State
\n\ SH/FILTER AOC = Announce Origination Country
\n\ SH/FILTER AOS = Announce Origination State
\n\ SH/FILTER WOC = Weather Origination Country
\n\ SH/FILTER WOS = Weather Origination State
\n\ SH/FILTER DXCTY = DX spot CounTrY
\n\ SH/FILTER DXSTATE = DX spot STATE 
SET/NOFILTERResets all filters to default.  If you suspect you have\n\ entered invalid filter command or commands, reset and start over.
SET/FILTER <aaa>/OFFTurn off specific filter.  <aaa> = filter name (see SH/FILTER <aaa>)
SET/FILTER K,VE/PASSThis would be the most common filter setting for say someone\n\ in the United States or Canada to set so as to only see spots that\n\ originated in the US or Canada. 
SET/FILTER <aaa>/<p/r> <bbb>Set specific filter.
\n\ <aaa> = filter name (see SH/FILTER <aaa>
\n\ <p/r> = PASS or REJECT
\n\ <bbb> = Country or State
\n\ Example #1:  SET/FILTER DOC/PASS EA,OH,G  This would set your\n\ filter to pass originated spots from Spain, Finland and England only.
\n\ Example #2:  SET/FILTER DXCTY/PASS F,OH  This would set\n\ your filter to pass spots for France and Finland only.
DX Band Mode FilteringThe DXBM filter has many variations for your settings, it\n\ is defaulted to receive all DX spots for all modes from 160 to 10 meters,\n\ (see Band & Mode Filtering below).
\n\
\n\
\n\

 

\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\

Band & Mode Filtering

\n\
\n\
\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
You can tailor the DX spots from CC Cluster to only the bands and modes that interest you.
The default setting for new users is to receive all DX\n\ spots from 160 to 10 meters, all modes.
To reset the band/mode filter to pass everything, enter \"SET/FILTER DXBM/OFF\".
To display your current settings, enter \"SH/FILTER DXBM\".
You can change any band or band/mode
You can set the band or band/mode to either pass or reject.
You can add items one at a time, or all at once.
 
For example:
To add 6 meters, you enter \"SET/FILTER DXBM/PASS 6\".
\n\ To delete 80 meter and 40 meter CW, enter \"SET/FILTER DXBM/REJECT 80-CW,40-CW\"
 
Although the band/mode has a \"mode\" name, it does not mean\n\ that when you select 40-RTTY that you are selecting only RTTY spots. What it\n\ really means is that you are selecting the frequency range in the following\n\ table that corresponds to this name. In this case 7040-7100. The actual\n\ mode may be anything. The only thing you have selected is a frequency range.
 
\n\
\n\
\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
DXBM Frequencies
Band ModeLowHighBand ModeLowHighBand ModeLowHigh
160-CW18001850   160-SSB18502000
80-CW3500358080-RTTY3580370080-SSB37004000
      60-SSB52605405
40-CW7000704040-RTTY7040710040-SSB71007300
30-CW101001013030-RTTY1013010150   
20-CW140001407020-RTTY140701415020-SSB1415014350
17-CW180681810017-RTTY181001811017-SSB1811018168
15-CW210002107015-RTTY210702120015-SSB2120021450
12-CW248902492012-RTTY249202493012-SSB2493024990
10-CW280002807010-RTTY280702830010-SSB2830029700
6-CW50000500806-SSB50080505006-FM5050054000
      4-MTR7000070650
2-CW1440001441002-SSB1441001445002-FM144500148000
1-CW2200002210001-SSB2220002240001-FM221000222000
      MW-MW50000047000000
\n\
\n\
\n\
\n\
\n\ \n\ "; fldigi-4.1.06/src/dxcluster/DXSpiderCommandReference.cxx0000644000175000017500000032710113472115772020126 00000000000000string dxspider_cmds = "\n\ \n\ \n\ \n\ \n\ DX Spider Command Reference\n\ \n\ \n\

DXSpider Command Reference

\n\
\n\
\n\
\n\
\n\

Contents

\n\
\n\
\n\
\n\
\n\
\n\
    \n\
  • 1 ACCEPT\n\
      \n\
    • 1.1 accept/announce
    • \n\
    • 1.2 accept/spots
    • \n\
    • 1.3 accept/wcy
    • \n\
    • 1.4 accept/wwv
    • \n\
    \n\
  • \n\
  • 2 ANNOUNCE\n\
      \n\
    • 2.1 announce
    • \n\
    • 2.2 announce\n\ full
    • \n\
    \n\
  • \n\
  • 3 APROPOS\n\
      \n\
    • 3.1 apropos
    • \n\
    \n\
  • \n\
  • 4 BLANK\n\
      \n\
    • 4.1 blank
    • \n\
    \n\
  • \n\
  • 5 BYE\n\
      \n\
    • 5.1 bye
    • \n\
    \n\
  • \n\
  • 6 CHAT\n\
      \n\
    • 6.1 chat
    • \n\
    \n\
  • \n\
  • 7 CLEAR\n\
      \n\
    • 7.1 clear/announce
    • \n\
    • 7.2 clear/route
    • \n\
    • 7.3 clear/spots\n\ [0-9|all]
    • \n\
    • 7.4 clear/wcy
    • \n\
    • 7.5 clear/wwv
    • \n\
    \n\
  • \n\
  • 8 DATABASES\n\
      \n\
    • 8.1 dbavail
    • \n\
    • 8.2 dbshow
    • \n\
    \n\
  • \n\
  • 9 MAIL\n\
      \n\
    • 9.1 directory
    • \n\
    • 9.2 directory\n\ <from>-<to>
    • \n\
    • 9.3 directory\n\ <nn>
    • \n\
    • 9.4 directory\n\ all
    • \n\
    • 9.5 directory\n\ from <call>
    • \n\
    • 9.6 directory\n\ new
    • \n\
    • 9.7 directory\n\ own
    • \n\
    • 9.8 directory\n\ subject <string>
    • \n\
    • 9.9 directory\n\ to <call>
    • \n\
    \n\
  • \n\
  • 10 DX\n\
      \n\
    • 10.1 dx\n\ [by <call>] <freq> <call>\n\ <remarks>
    • \n\
    \n\
  • \n\
  • 11 ECHO\n\
      \n\
    • 11.1 echo\n\ <line>
    • \n\
    \n\
  • \n\
  • 12 FILTERING\n\
      \n\
    • 12.1 filtering...
    • \n\
    \n\
  • \n\
  • 13 HELP\n\
      \n\
    • 13.1 help
    • \n\
    \n\
  • \n\
  • 14 JOIN\n\
      \n\
    • 14.1 join\n\ <group>
    • \n\
    \n\
  • \n\
  • 15 KILL\n\
      \n\
    • 15.1 kill\n\ <from msgno>-<to msgno>
    • \n\
    • 15.2 kill\n\ <msgno> [<msgno..]
    • \n\
    • 15.3 kill\n\ <msgno> [<msgno> ...]
    • \n\
    • 15.4 kill\n\ from <regex>
    • \n\
    • 15.5 kill\n\ to <regex>
    • \n\
    \n\
  • \n\
  • 16 LEAVE\n\
      \n\
    • 16.1 leave\n\ <group>
    • \n\
    \n\
  • \n\
  • 17 LINKS\n\
      \n\
    • 17.1 links
    • \n\
    \n\
  • \n\
  • 18 READ\n\
      \n\
    • 18.1 read
    • \n\
    • 18.2 read\n\ <msgno>
    • \n\
    \n\
  • \n\
  • 19 REJECT\n\
      \n\
    • 19.1 reject
    • \n\
    • 19.2 reject/announce\n\ [0-9] <pattern>
    • \n\
    • 19.3 reject/spots\n\ [0-9] <pattern>
    • \n\
    • 19.4 reject/wcy\n\ [0-9] <pattern>
    • \n\
    • 19.5 reject/wwv\n\ [0-9] <pattern>
    • \n\
    \n\
  • \n\
  • 20 REPLY\n\
      \n\
    • 20.1 reply
    • \n\
    • 20.2 reply\n\ <msgno>
    • \n\
    • 20.3 reply\n\ b <msgno>
    • \n\
    • 20.4 reply\n\ noprivate <msgno>
    • \n\
    • 20.5 reply\n\ rr <msgno>
    • \n\
    \n\
  • \n\
  • 21 SEND\n\
      \n\
    • 21.1 send\n\ <call> [<call> ...]
    • \n\
    • 21.2 send\n\ copy <msgno> <call>
    • \n\
    • 21.3 send\n\ noprivate <call>
    • \n\
    • 21.4 send\n\ private <call>
    • \n\
    • 21.5 send\n\ rr <call>
    • \n\
    \n\
  • \n\
  • 22 SET\n\
      \n\
    • 22.1 set/address\n\ <your address>
    • \n\
    • 22.2 set/announce
    • \n\
    • 22.3 set/anntalk
    • \n\
    • 22.4 set/beep
    • \n\
    • 22.5 set/dx
    • \n\
    • 22.6 set/dxcq
    • \n\
    • 22.7 set/dxgrid
    • \n\
    • 22.8 set/dxitu
    • \n\
    • 22.9 set/echo
    • \n\
    • 22.10 set/email\n\ <email>
    • \n\
    • 22.11 set/here
    • \n\
    • 22.12 set/homenode\n\ <node>
    • \n\
    • 22.13 set/language\n\ <lang>
    • \n\
    • 22.14 set/location\n\ <lat & long>
    • \n\
    • 22.15 set/logininfo
    • \n\
    • 22.16 set/name\n\ <your name>
    • \n\
    • 22.17 set/page\n\ <lines per page>
    • \n\
    • 22.18 set/password
    • \n\
    • 22.19 set/prompt\n\ <string>
    • \n\
    • 22.20 set/qra\n\ <locator>
    • \n\
    • 22.21 set/qth\n\ <your qth>
    • \n\
    • 22.22 set/startup
    • \n\
    • 22.23 set/talk
    • \n\
    • 22.24 set/usstate
    • \n\
    • 22.25 set/wcy
    • \n\
    • 22.26 set/wwv
    • \n\
    • 22.27 set/wx
    • \n\
    \n\
  • \n\
  • 23 SHOW\n\
      \n\
    • 23.1 show/chat
    • \n\
    • 23.2 show/configuration
    • \n\
    • 23.3 show/configuration/node
    • \n\
    • 23.4 show/contest
    • \n\
    • 23.5 show/date
    • \n\
    • 23.6 show/db0sdx
    • \n\
    • 23.7 show/dx
    • \n\
    • 23.8 show/dxcc
    • \n\
    • 23.9 show/dxqsl
    • \n\
    • 23.10 show/dxstats
    • \n\
    • 23.11 show/fdx
    • \n\
    • 23.12 show/files
    • \n\
    • 23.13 show/filter
    • \n\
    • 23.14 show/hfstats
    • \n\
    • 23.15 show/hftable
    • \n\
    • 23.16 show/moon
    • \n\
    • 23.17 show/muf
    • \n\
    • 23.18 show/mydx
    • \n\
    • 23.19 show/newconfiguration
    • \n\
    • 23.20 show/newconfiguration/node
    • \n\
    • 23.21 show/prefix
    • \n\
    • 23.22 show/qra
    • \n\
    • 23.23 show/qrz
    • \n\
    • 23.24 show/route
    • \n\
    • 23.25 show/satellite
    • \n\
    • 23.26 show/startup
    • \n\
    • 23.27 show/station
    • \n\
    • 23.28 show/sun
    • \n\
    • 23.29 show/time
    • \n\
    • 23.30 show/usdb
    • \n\
    • 23.31 show/vhfstats
    • \n\
    • 23.32 show/vhftable
    • \n\
    • 23.33 show/wcy
    • \n\
    • 23.34 show/wm7d
    • \n\
    • 23.35 show/wwv
    • \n\
    • 23.36 sysop
    • \n\
    • 23.37 talk
    • \n\
    • 23.38 type
    • \n\
    • 23.39 unset/announce
    • \n\
    • 23.40 unset/anntalk
    • \n\
    • 23.41 unset/beep
    • \n\
    • 23.42 unset/dx
    • \n\
    • 23.43 unset/dxcq
    • \n\
    • 23.44 unset/dxgrid
    • \n\
    • 23.45 unset/dxitu
    • \n\
    • 23.46 unset/echo
    • \n\
    • 23.47 unset/email
    • \n\
    • 23.48 unset/here
    • \n\
    • 23.49 unset/logininfo
    • \n\
    • 23.50 unset/privilege
    • \n\
    • 23.51 unset/prompt
    • \n\
    • 23.52 unset/startup
    • \n\
    • 23.53 unset/talk
    • \n\
    • 23.54 unset/usstate
    • \n\
    • 23.55 unset/wcy
    • \n\
    • 23.56 unset/wwv
    • \n\
    • 23.57 unset/wx
    • \n\
    • 23.58 who
    • \n\
    • 23.59 wx
    • \n\
    \n\
  • \n\
\n\
\n\

ACCEPT

\n\
    \n\
  • accept - Set a filter to accept something\n\
  • \n\
\n\

There are 2 types of filter, accept and reject. See HELP\n\ FILTERING for more info.\n\

\n\

accept/announce

\n\
    \n\
  • accept/announce [0-9] <pattern> Set an 'accept' filter\n\ line for announce\n\
  • \n\
\n\

Create an 'accept this announce' line for a filter.\n\

\n\

An accept filter line means that if the announce matches this\n\ filter it is passed onto the user. See HELP FILTERING for more\n\ info. Please read this to understand how filters work - it will\n\ save a lot of grief later on.\n\ You can use any of the following things in this line:-\n\

\n\
info <string>            eg: iota or qsl\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
origin_state <states>                eg: VA,NH,RI,NH\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>\n\
channel <prefixes>\n\
wx 1                     filter WX announces\n\
dest <prefixes>          eg: 6MUK,WDX      (distros)\n\
\n\

some examples:-\n\

\n\
acc/ann dest 6MUK\n\
acc/ann 2 by_zone 14,15,16\n\
(this could be all on one line: acc/ann dest 6MUK or by_zone 14,15,16)\n\
\n\

or\n\

\n\
acc/ann by G,M,2\n\
\n\

for american states\n\

\n\
acc/ann by_state va,nh,ri,nh\n\
\n\

You can use the tag 'all' to accept everything eg:\n\

\n\
acc/ann all\n\
\n\

but this probably for advanced users...\n\

\n\

accept/spots

\n\
    \n\
  • accept/spots [0-9] <pattern> Set an 'accept' filter line\n\ for spots\n\
  • \n\
\n\

Create an 'accept this spot' line for a filter.\n\

\n\

An accept filter line means that if the spot matches this filter\n\ it is passed onto the user. See HELP FILTERING for more info.\n\ Please read this to understand how filters work - it will save a\n\ lot of grief later on.\n\

\n\

You can use any of the following things in this line:-\n\

\n\
freq <range>           eg: 0/30000 or hf or hf/cw or 6m,4m,2m\n\
on <range>             same as 'freq'\n\
call <prefixes>        eg: G,PA,HB9\n\
info <string>          eg: iota or qsl\n\
by <prefixes>\n\
call_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
call_itu <prefixes or numbers>     or: G,GM,GW\n\
call_zone <prefixes or numbers>\n\
call_state <states>                eg: VA,NH,RI,ME\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>                eg: VA,NH,RI,ME\n\
origin <prefixes>\n\
channel <prefixes>\n\
\n\

For frequencies, you can use any of the band names defined in\n\ SHOW/BANDS and you can use a subband name like: cw, rtty, data,\n\ ssb - thus: hf/ssb. You can also just have a simple range like:\n\ 0/30000 - this is more efficient than saying simply: freq HF (but\n\ don't get too hung up about that)\n\

\n\

some examples:-\n\

\n\
acc/spot 1 on hf/cw\n\
acc/spot 2 on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

You can use the tag 'all' to accept everything, eg:\n\

\n\
acc/spot 3 all\n\
\n\

for US states\n\

\n\
acc/spots by_state VA,NH,RI,MA,ME\n\
\n\

but this probably for advanced users...\n\

\n\

accept/wcy

\n\
    \n\
  • accept/wcy [0-9] <pattern> set an 'accept' WCY filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

There are no examples because WCY Broadcasts only come from one\n\ place and you either want them or not (see UNSET/WCY if you don't\n\ want them).\n\

\n\

This command is really provided for future use.\n\

\n\

See HELP FILTER for information.\n\

\n\

accept/wwv

\n\
    \n\
  • accept/wwv [0-9] <pattern> set an 'accept' WWV filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

for example\n\

\n\
accept/wwv by_zone 4\n\
\n\

is probably the only useful thing to do (which will only show WWV\n\ broadcasts by stations in the US).\n\

\n\

See HELP FILTER for information.\n\

\n\

ANNOUNCE

\n\

announce

\n\
    \n\
  • announce <text> Send an announcement to LOCAL users only\n\
  • \n\
\n\

<text> is the text of the announcement you wish to\n\ broadcast\n\

\n\

announce full

\n\
    \n\
  • announce full <text> Send an announcement cluster wide\n\
  • \n\
\n\

This will send your announcement cluster wide\n\

\n\

APROPOS

\n\

apropos

\n\
    \n\
  • apropos <string> Search help database for <string>\n\
  • \n\
\n\

Search the help database for <string> (it isn't case\n\ sensitive), and print the names of all the commands that may be\n\ relevant.\n\

\n\

BLANK

\n\

blank

\n\
    \n\
  • blank [<string>] [<nn>] Print nn (default 1) blank\n\ lines (or strings)\n\
  • \n\
\n\

In its basic form this command prints one or more blank lines.\n\ However if you pass it a string it will replicate the string for\n\ the width of the screen (default 80) and then print that one or\n\ more times, so:\n\

\n\
blank 2\n\
\n\

prints two blank lines\n\

\n\
blank -\n\
\n\

prints a row of - characters once.\n\

\n\
blank abc\n\
\n\

prints 'abcabcabcabcabcabc....'\n\

\n\

This is really only of any use in a script file and you can print\n\ a maximum of 9 lines.\n\

\n\

BYE

\n\

bye

\n\
    \n\
  • bye Exit from the cluster\n\
  • \n\
\n\

This will disconnect you from the cluster\n\

\n\

CHAT

\n\

chat

\n\
    \n\
  • chat <group> <text> Chat or Conference to a group\n\
  • \n\
\n\

It is now possible to JOIN a group and have network wide\n\ conferencing to that group. DXSpider does not (and probably will\n\ not) implement the AK1A conference mode as this seems very\n\ limiting, is hardly used and doesn't seem to work too well anyway.\n\

\n\

This system uses the existing ANN system and is compatible with\n\ both other DXSpider nodes and AK1A clusters (they use\n\ ANN/<group>).\n\

\n\

You can be a member of as many \"groups\" as you want. To join a\n\ group type:-\n\

\n\
JOIN FOC    (where FOC is the group name)\n\
\n\

To leave a group type:-\n\

\n\
LEAVE FOC\n\
\n\

You can see which groups you are in by typing:-\n\

\n\
STAT/USER\n\
\n\

and you can see whether your mate is in the group, if he connects\n\ to the same node as you, by typing:-\n\

\n\
STAT/USER g1tlh\n\
\n\

To send a message to a group type:-\n\

\n\
CHAT FOC hello everyone\n\
\n\

or\n\

\n\
CH #9000 hello I am back\n\
\n\

See also JOIN, LEAVE, SHOW/CHAT\n\

\n\

CLEAR

\n\

clear/announce

\n\
    \n\
  • clear/announce [1|all] Clear a announce filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a annouce\n\ filter or to remove the whole filter. See CLEAR/SPOTS for a more\n\ detailed explanation.\n\

\n\

clear/route

\n\
    \n\
  • clear/route [1|all] Clear a route filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a route\n\ filter or to remove the whole filter. See CLEAR/SPOTS for a more\n\ detailed explanation.\n\

\n\

clear/spots\n\ [0-9|all]

\n\
    \n\
  • clear/spots [0-9|all] Clear a spot filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a spot filter\n\ or to remove the whole filter.\n\

\n\

If you have a filter:-\n\

\n\
acc/spot 1 on hf/cw\n\
acc/spot 2 on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

and you say:-\n\

\n\
clear/spot 1\n\
\n\

you will be left with:-\n\

\n\
acc/spot 2 on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

If you do:\n\

\n\
clear/spot all\n\
\n\

the filter will be completely removed.\n\

\n\

clear/wcy

\n\
    \n\
  • clear/wcy [1|all] Clear a WCY filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a WCY filter\n\ or to remove the whole filter. See CLEAR/SPOTS for a more detailed\n\ explanation.\n\

\n\

clear/wwv

\n\
    \n\
  • clear/wwv [1|all] Clear a WWV filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a WWV filter\n\ or to remove the whole filter. See CLEAR/SPOTS for a more detailed\n\ explanation.\n\

\n\

DATABASES

\n\

dbavail

\n\
    \n\
  • dbavail - Show a list of all the Databases in the system\n\
  • \n\
\n\

The name says it all really, this command lists all the databases\n\ defined in the system. It is also aliased to SHOW/COMMAND.\n\

\n\

dbshow

\n\
    \n\
  • dbshow <dbname> <key> - Display an entry, if it\n\ exists, in a database\n\
  • \n\
\n\

This is the generic user interface to the database to the\n\ database system. It is expected that the sysop will add an entry\n\ to the local Aliases file so that users can use the more familiar\n\ AK1A style of enquiry such as:\n\

\n\
SH/BUCK G1TLH\n\
\n\

but if he hasn't and the database really does exist (use DBAVAIL\n\ or SHOW/COMMAND to find out) you can do the same thing with:\n\

\n\
DBSHOW buck G1TLH\n\
\n\

MAIL

\n\

directory

\n\
    \n\
  • directory - List messages\n\
  • \n\
\n\

directory\n\ <from>-<to>

\n\
    \n\
  • directory <from>-<to> - List messages <from>\n\ message <to> message\n\
  • \n\
\n\

List the messages in the messages directory.\n\

\n\

If there is a 'p' one space after the message number then it is a\n\ personal message. If there is a '-' between the message number and\n\ the 'p' then this indicates the message has been read.\n\

\n\

You can use shell escape characters such as '*' and '?' in the\n\ <call> fields.\n\

\n\

You can also combine some of the various directory commands\n\ together eg:-\n\

\n\
DIR TO G1TLH 5\n\
\n\

or\n\

\n\
DIR SUBJECT IOTA 200-250\n\
\n\

You can abbreviate all the commands to one letter and use ak1a\n\ syntax:-\n\

\n\
DIR/T G1* 10\n\
DIR/S QSL 10-100 5\n\
\n\

directory\n\ <nn>

\n\
    \n\
  • directory <nn> - List last <nn> messages\n\
  • \n\
\n\

directory all

\n\
    \n\
  • directory all - List all messages\n\
  • \n\
\n\

directory\n\ from <call>

\n\
    \n\
  • directory from <call> - List all messages from\n\ <call>\n\
  • \n\
\n\

directory new

\n\
    \n\
  • directory new - List all new messages\n\
  • \n\
\n\

directory own

\n\
    \n\
  • directory own - List your own messages\n\
  • \n\
\n\

directory\n\ subject <string>

\n\
    \n\
  • directory subject <string> - List all messages with\n\ <string> in subject\n\
  • \n\
\n\

directory\n\ to <call>

\n\
    \n\
  • directory to <call> - List all messages to <call>\n\
  • \n\
\n\

DX

\n\

dx\n\ [by <call>] <freq> <call> <remarks>

\n\
    \n\
  • dx [by <call>] <freq> <call> <remarks>\n\ - Send a DX spot\n\
  • \n\
\n\

This is how you send a DX Spot to other users. You can, in fact,\n\ now enter the <freq> and the <call> either way round.\n\

\n\
DX FR0G 144.600\n\
DX 144.600 FR0G\n\
DX 144600 FR0G\n\
\n\

will all give the same result. You can add some remarks to the\n\ end of the command and they will be added to the spot.\n\

\n\
DX FR0G 144600 this is a test\n\
\n\

You can credit someone else by saying:-\n\

\n\
DX by G1TLH FR0G 144.600 he isn't on the cluster\n\
\n\

The <freq> is compared against the available bands set up\n\ in the cluster. See SHOW/BANDS for more information.\n\

\n\

ECHO

\n\

echo <line>

\n\
    \n\
  • echo <line> - Echo the line to the output\n\
  • \n\
\n\

This command is useful in scripts and so forth for printing the\n\ line that you give to the command to the output. You can use this\n\ in user_default scripts and the SAVE command for titling and so\n\ forth.\n\

\n\

The script will interpret certain standard \"escape\" sequences as\n\ follows:-\n\

\n\
\\t - becomes a TAB character (0x09 in ascii)\n\
\\a - becomes a BEEP character (0x07 in ascii)\n\
\\n - prints a new line\n\
\n\

So the following example:-\n\

\n\
echo GB7DJK is a dxcluster\n\
\n\

produces:-\n\

\n\
GB7DJK is a dxcluster\n\
\n\

on the output. You don't need a \\n on the end of the line you\n\ want to send.\n\

\n\

A more complex example:-\n\

\n\
echo GB7DJK\\n\\tg1tlh\\tDirk\\n\\tg3xvf\\tRichard\n\
\n\

produces:-\n\

\n\
GB7DJK\n\
g1tlh   Dirk\n\
g3xvf   Richard\n\
\n\

on the output.\n\

\n\

FILTERING

\n\

filtering...

\n\
    \n\
  • filtering... - Filtering things in DXSpider\n\
  • \n\
\n\

There are a number of things you can filter in the DXSpider\n\ system. They all use the same general mechanism.\n\

\n\

In general terms you can create a 'reject' or an 'accept' filter\n\ which can have up to 10 lines in it. You do this using, for\n\ example:-\n\

\n\
accept/spots .....\n\
reject/spots .....\n\
\n\

where ..... are the specific commands for that type of filter.\n\ There are filters for spots, wwv, announce, wcy and (for sysops)\n\ connects. See each different accept or reject command reference\n\ for more details.\n\

\n\

There is also a command to clear out one or more lines in a\n\ filter and one to show you what you have set. They are:-\n\

\n\
clear/spots 1\n\
clear/spots all\n\
\n\

and\n\

\n\
show/filter\n\
\n\

There is clear/xxxx command for each type of filter.\n\

\n\

For now we are going to use spots for the examples, but you can\n\ apply the principles to all types of filter.\n\

\n\

There are two main types of filter 'accept' or 'reject'; which\n\ you use depends entirely on how you look at the world and what is\n\ least writing to achieve what you want. Each filter has 10 lines\n\ (of any length) which are tried in order. If a line matches then\n\ the action you have specified is taken (ie reject means ignore it\n\ and accept means gimme it).\n\

\n\

The important thing to remember is that if you specify a 'reject'\n\ filter (all the lines in it say 'reject/spots' (for instance))\n\ then if a spot comes in that doesn't match any of the lines then\n\ you will get it BUT if you specify an 'accept' filter then any\n\ spots that don't match are dumped. For example if I have a one\n\ line accept filter:-\n\

\n\
accept/spots on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

then automatically you will ONLY get VHF spots from or to CQ\n\ zones 14 15 and 16. If you set a reject filter like:\n\

\n\
reject/spots on hf/cw\n\
\n\

Then you will get everything EXCEPT HF CW spots, If you am\n\ interested in IOTA and will work it even on CW then you could\n\ say:-\n\

\n\
reject/spots on hf/cw and not info iota\n\
\n\

But in that case you might only be interested in iota and say:-\n\

\n\
accept/spots not on hf/cw or info iota\n\
\n\

which is exactly the same. You should choose one or the other\n\ until you are confortable with the way it works. Yes, you can mix\n\ them (actually you can have an accept AND a reject on the same\n\ line) but don't try this at home until you can analyse the results\n\ that you get without ringing up the sysop for help.\n\

\n\

Another useful addition now is filtering by US state\n\

\n\
accept/spots by_state VA,NH,RI,ME\n\
\n\

You can arrange your filter lines into logical units, either for\n\ your own understanding or simply convenience. I have one set\n\ frequently:-\n\

\n\
reject/spots 1 on hf/cw\n\
reject/spots 2 on 50000/1400000 not (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

What this does is to ignore all HF CW spots (being a class B I\n\ can't read any CW and couldn't possibly be interested in\n\ HF :-) and also rejects any spots on VHF which don't either\n\ originate or spot someone in Europe.\n\

\n\

This is an exmaple where you would use the line number (1 and 2\n\ in this case), if you leave the digit out, the system assumes '1'.\n\ Digits '0'-'9' are available.\n\

\n\

You can leave the word 'and' out if you want, it is implied. You\n\ can use any number of brackets to make the 'expression' as you\n\ want it. There are things called precedence rules working here\n\ which mean that you will NEED brackets in a situation like line 2\n\ because, without it, will assume:-\n\

\n\
(on 50000/1400000 and by_zone 14,15,16) or call_zone 14,15,16\n\
\n\

annoying, but that is the way it is. If you use OR - use\n\ brackets. Whilst we are here CASE is not important. 'And BY_Zone'\n\ is just 'and by_zone'.\n\

\n\

If you want to alter your filter you can just redefine one or\n\ more lines of it or clear out one line. For example:-\n\

\n\
reject/spots 1 on hf/ssb\n\
\n\

or\n\

\n\
clear/spots 1\n\
\n\

To remove the filter in its entirety:-\n\

\n\
clear/spots all\n\
\n\

There are similar CLEAR commands for the other filters:-\n\

\n\
clear/announce\n\
clear/wcy\n\
clear/wwv\n\
\n\

ADVANCED USERS:-\n\

\n\

Once you are happy with the results you get, you may like to\n\ experiment.\n\

\n\

My example that filters hf/cw spots and accepts vhf/uhf spots\n\ from EU can be written with a mixed filter, eg:\n\

\n\
rej/spot on hf/cw\n\
acc/spot on 0/30000\n\
acc/spot 2 on 50000/1400000 and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

Each filter slot actually has a 'reject' slot and an 'accept'\n\ slot. The reject slot is executed BEFORE the accept slot.\n\

\n\

It was mentioned earlier that after a reject test that doesn't\n\ match, the default for following tests is 'accept', the reverse is\n\ true for first, any non hf/cw spot is passed to the accept line,\n\ which lets through everything else on HF.\n\

\n\

The last filter line in the example above lets through just\n\ VHF/UHF spots from EU.\n\

\n\

HELP

\n\

help

\n\
    \n\
  • help - The HELP Command\n\
  • \n\
\n\

HELP is available for a number of commands. The syntax is:-\n\

\n\
HELP <cmd>\n\
\n\

Where <cmd> is the name of the command you want help on.\n\ All commands can be abbreviated, so SHOW/DX can be abbreviated to\n\ SH/DX, ANNOUNCE can be shortened to AN and so on.\n\

\n\

Look at the APROPOS <string> command which will search the\n\ help database for the <string> you specify and give you a\n\ list of likely commands to look at with HELP.\n\

\n\

JOIN

\n\

join\n\ <group>

\n\
    \n\
  • join <group> - Join a chat or conference group\n\
  • \n\
\n\

JOIN allows you to join a network wide conference group. To join\n\ a group (called FOC in this case) type:-\n\

\n\
JOIN FOC\n\
\n\

See also CHAT, LEAVE, SHOW/CHAT\n\

\n\

KILL

\n\

kill <from\n\ msgno>-<to msgno>

\n\
    \n\
  • kill <from msgno>-<to msgno> - Delete a range of\n\ messages\n\
  • \n\
\n\

kill\n\ <msgno> [<msgno..]

\n\
    \n\
  • kill <msgno> [<msgno..] - Delete a message from the\n\ local system\n\
  • \n\
\n\

kill <msgno>\n\ [<msgno> ...]

\n\
    \n\
  • kill <msgno> [<msgno> ...] - Remove or erase a\n\ message from the system\n\
  • \n\
\n\

You can get rid of any message to or originating from your\n\ callsign using this command. You can remove more than one message\n\ at a time.\n\

\n\

kill from\n\ <regex>

\n\
    \n\
  • kill from <regex> - Delete messages FROM a callsign or\n\ pattern\n\
  • \n\
\n\

kill to\n\ <regex>

\n\
    \n\
  • kill to <regex> - Delete messages TO a callsign or\n\ pattern\n\
  • \n\
\n\

LEAVE

\n\

leave\n\ <group>

\n\
    \n\
  • leave <group> - Leave a chat or conference group\n\
  • \n\
\n\

LEAVE allows you to leave a network wide conference group. To\n\ leave a group (called FOC in this case) type:-\n\

\n\
LEAVE FOC\n\
\n\

See also CHAT, JOIN, SHOW/CHAT\n\

\n\

LINKS

\n\

links

\n\
    \n\
  • links - Show which nodes is physically connected\n\
  • \n\
\n\

This is a quick listing that shows which links are connected and\n\ some information about them. See WHO for a list of all\n\ connections.\n\

\n\

READ

\n\

read

\n\
    \n\
  • read - Read the next unread personal message addressed to you\n\
  • \n\
\n\

read\n\ <msgno>

\n\
    \n\
  • read <msgno> - Read the specified message\n\
  • \n\
\n\

You can read any messages that are sent as 'non-personal' and\n\ also any message either sent by or sent to your callsign.\n\

\n\

REJECT

\n\

reject

\n\
    \n\
  • reject - Set a filter to reject something\n\
  • \n\
\n\

There are 2 types of filter, accept and reject. See HELP\n\ FILTERING for more info.\n\

\n\

reject/announce\n\ [0-9] <pattern>

\n\
    \n\
  • reject/announce [0-9] <pattern> - Set a 'reject' filter\n\ line for announce\n\
  • \n\
\n\

A reject filter line means that if the announce matches this\n\ filter it is passed onto the user. See HELP FILTERING for more\n\ info. Please read this to understand how filters work - it will\n\ save a lot of grief later on.\n\

\n\

You can use any of the following things in this line:-\n\

\n\
info <string>            eg: iota or qsl\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
origin_state <states>                eg: VA,NH,RI,ME\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>                eg: VA,NH,RI,ME\n\
channel <prefixes>\n\
wx 1                     filter WX announces\n\
dest <prefixes>          eg: 6MUK,WDX      (distros)\n\
\n\

some examples:-\n\

\n\
rej/ann by_zone 14,15,16 and not by G,M,2\n\
\n\

You can use the tag 'all' to reject everything eg:\n\

\n\
rej/ann all\n\
\n\

but this probably for advanced users...\n\

\n\

reject/spots [0-9]\n\ <pattern>

\n\
    \n\
  • reject/spots [0-9] <pattern> - Set a 'reject' filter\n\ line for spots\n\
  • \n\
\n\

A reject filter line means that if the spot matches this filter\n\ it is dumped (not passed on). See HELP FILTERING for more info.\n\ Please read this to understand how filters work - it will save a\n\ lot of grief later on.\n\

\n\

You can use any of the following things in this line:-\n\

\n\
freq <range>           eg: 0/30000 or hf or hf/cw or 6m,4m,2m\n\
on <range>             same as 'freq'\n\
call <prefixes>        eg: G,PA,HB9\n\
info <string>          eg: iota or qsl\n\
by <prefixes>\n\
call_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
call_itu <prefixes or numbers>     or: G,GM,GW\n\
call_zone <prefixes or numbers>\n\
call_state <states>                eg: VA,NH,RI,ME\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>                eg: VA,NH,RI,ME\n\
origin <prefixes>\n\
channel <prefixes>\n\
\n\

For frequencies, you can use any of the band names defined in\n\ SHOW/BANDS and you can use a subband name like: cw, rtty, data,\n\ ssb - thus: hf/ssb. You can also just have a simple range like:\n\ 0/30000 - this is more efficient than saying simply: on HF (but\n\ don't get too hung up about that)\n\

\n\

some examples:-\n\

\n\
rej/spot 1 on hf\n\
rej/spot 2 on vhf and not (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

You can use the tag 'all' to reject everything eg:\n\

\n\
rej/spot 3 all\n\
\n\

but this probably for advanced users...\n\

\n\

reject/wcy [0-9]\n\ <pattern>

\n\
    \n\
  • reject/wcy [0-9] <pattern> - set a 'reject' WCY filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

There are no examples because WCY Broadcasts only come from one\n\ place and you either want them or not (see UNSET/WCY if you don't\n\ want them).\n\

\n\

This command is really provided for future use.\n\

\n\

See HELP FILTER for information.\n\

\n\

reject/wwv [0-9]\n\ <pattern>

\n\
    \n\
  • reject/wwv [0-9] <pattern> - set a 'reject' WWV filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

for example\n\

\n\
reject/wwv by_zone 14,15,16\n\
\n\

is probably the only useful thing to do (which will only show WWV\n\ broadcasts by stations in the US).\n\

\n\

See HELP FILTER for information.\n\

\n\

REPLY

\n\

reply

\n\
    \n\
  • reply = Reply (privately) to the last message that you have\n\ read\n\
  • \n\
\n\

reply\n\ <msgno>

\n\
    \n\
  • reply <msgno> - Reply (privately) to the specified\n\ message\n\
  • \n\
\n\

reply b\n\ <msgno>

\n\
    \n\
  • reply b <msgno> - Reply as a Bulletin to the specified\n\ message\n\
  • \n\
\n\

reply\n\ noprivate <msgno>

\n\
    \n\
  • reply noprivate <msgno> - Reply as a Bulletin to the\n\ specified message\n\
  • \n\
\n\

reply rr\n\ <msgno>

\n\
    \n\
  • reply rr <msgno> - Reply to the specified message with\n\ read receipt\n\
  • \n\
\n\

You can reply to a message and the subject will automatically\n\ have \"Re:\" inserted in front of it, if it isn't already present.\n\ You can also use all the extra qualifiers such as RR, PRIVATE,\n\ NOPRIVATE, B that you can use with the SEND command (see SEND for\n\ further details)\n\

\n\

SEND

\n\

send <call>\n\ [<call> ...]

\n\
    \n\
  • send <call> [<call> ...] - Send a message to one\n\ or more callsigns\n\
  • \n\
\n\

send\n\ copy <msgno> <call>

\n\
    \n\
  • send copy <msgno> <call> - Send a copy of a\n\ message to someone\n\
  • \n\
\n\

send\n\ noprivate <call>

\n\
    \n\
  • send noprivate <call> - Send a message to all stations\n\
  • \n\
\n\

All the SEND commands will create a message which will be sent\n\ either to an individual callsign or to one of the 'bulletin'\n\ addresses.\n\ SEND <call> on its own acts as though you had typed SEND\n\ PRIVATE, that is it will mark the message as personal and send it\n\ to the cluster node that that callsign is connected to. If the\n\ <call> you have specified is in fact a known bulletin\n\ category on your node (eg: ALL) then the message should\n\ automatically become a bulletin. You can have more than one\n\ callsign in all of the SEND commands.\n\

\n\

You can have multiple qualifiers so that you can have for\n\ example:-\n\

\n\
SEND RR COPY 123 PRIVATE G1TLH G0RDI\n\
\n\

which should send a copy of message 123 to G1TLH and G0RDI and\n\ you will receive a read receipt when they have read the message.\n\

\n\

SB is an alias for SEND NOPRIVATE (or send a bulletin in BBS\n\ speak) SP is an alias for SEND PRIVATE\n\

\n\

The system will ask you for a subject. Conventionally this should\n\ be no longer than 29 characters for compatibility. Most modern\n\ cluster software should accept more.\n\

\n\

You will now be prompted to start entering your text.\n\

\n\

You finish the message by entering '/EX' on a new line. For\n\ instance:\n\

\n\
...\n\
bye then Jim\n\
73 Dirk\n\
/ex\n\
\n\

If you have started a message and you don't want to keep it then\n\ you can abandon the message with '/ABORT' on a new line, like:-\n\

\n\
line 1\n\
line 2\n\
oh I just can't be bothered with this\n\
/abort\n\
\n\

If you abort the message it will NOT be sent.\n\

\n\

When you are entering the text of your message, most normal\n\ output (such as DX announcements and so on are suppressed and\n\ stored for latter display (upto 20 such lines are stored, as new\n\ ones come along, so the oldest lines are dropped).\n\

\n\

Also, you can enter normal commands commands (and get the output\n\ immediately) whilst in the middle of a message. You do this by\n\ typing the command preceeded by a '/' character on a new line,\n\ so:-\n\

\n\
/dx g1tlh 144010 strong signal\n\
\n\

Will issue a dx annoucement to the rest of the cluster.\n\

\n\

Also, you can add the output of a command to your message by\n\ preceeding the command with '//', thus :-\n\

\n\
//sh/vhftable\n\
\n\

This will show YOU the output from SH/VHFTABLE and also store it\n\ in the message.\n\

\n\

You can carry on with the message until you are ready to send it.\n\

\n\

send\n\ private <call>

\n\
    \n\
  • send private <call> - Send a personal message\n\
  • \n\
\n\

send rr\n\ <call>

\n\
    \n\
  • send rr <call> - Send a message and ask for a read\n\ receipt\n\
  • \n\
\n\

SET

\n\

set/address\n\ <your address>

\n\
    \n\
  • set/address <your address> - Record your postal address\n\
  • \n\
\n\

set/announce

\n\
    \n\
  • set/announce - Allow announce messages to come out on your\n\ terminal\n\
  • \n\
\n\

set/anntalk

\n\
    \n\
  • set/anntalk - Allow talk like announce messages on your\n\ terminal\n\
  • \n\
\n\

set/beep

\n\
    \n\
  • set/beep - Add a beep to DX and other messages on your\n\ terminal\n\
  • \n\
\n\

set/dx

\n\
    \n\
  • set/dx - Allow DX messages to come out on your terminal\n\
  • \n\
\n\

set/dxcq

\n\
    \n\
  • set/dxcq - Show CQ Zones on the end of DX announcements\n\
  • \n\
\n\

set/dxgrid

\n\
    \n\
  • set/dxgrid - Allow QRA Grid Squares on the end of DX\n\ announcements\n\
  • \n\
\n\

set/dxitu

\n\
    \n\
  • set/dxitu - Show ITU Zones on the end of DX announcements\n\
  • \n\
\n\

set/echo

\n\
    \n\
  • set/echo - Make the cluster echo your input\n\
  • \n\
\n\

set/email\n\ <email>

\n\
    \n\
  • set/email <email> - Set email address(es) and forward\n\ your personals\n\
  • \n\
\n\

set/here

\n\
    \n\
  • set/here - Tell the system you are present at your terminal\n\
  • \n\
\n\

set/homenode\n\ <node>

\n\
    \n\
  • set/homenode <node> - Set your normal cluster callsign\n\
  • \n\
\n\

Tell the cluster system where you normally connect to. Any\n\ Messages sent to you will normally find their way there should you\n\ not be connected. eg:-\n\

\n\
SET/HOMENODE gb7djk\n\
\n\

set/language\n\ <lang>

\n\
    \n\
  • set/language <lang> - Set the language you want to use\n\
  • \n\
\n\

You can select the language that you want the cluster to use.\n\ Currently the languages available are en (English), de (German),\n\ es (Spanish), Czech (cz), French (fr), Portuguese (pt), Italian\n\ (it) and nl (Dutch).\n\

\n\

set/location\n\ <lat & long>

\n\
    \n\
  • set/location <lat & long> - Set your latitude and\n\ longitude\n\
  • \n\
\n\

set/logininfo

\n\
    \n\
  • set/logininfo - Inform when a station logs in/out locally\n\
  • \n\
\n\

set/name\n\ <your name>

\n\
    \n\
  • set/name <your name> - Set your name\n\
  • \n\
\n\

Tell the system what your name is eg:-\n\

\n\
SET/NAME Dirk\n\
\n\

set/page\n\ <lines per page>

\n\
    \n\
  • set/page <lines per page> - Set the lines per page\n\
  • \n\
\n\

Tell the system how many lines you wish on a page when the number\n\ of line of output from a command is more than this. The default is\n\ 20. Setting it explicitly to 0 will disable paging.\n\

\n\
SET/PAGE 30\n\
SET/PAGE 0\n\
\n\

The setting is stored in your user profile.\n\

\n\

set/password

\n\
    \n\
  • set/password - Set your own password\n\
  • \n\
\n\

This command only works for a 'telnet' user (currently). It will\n\ only work if you have a password already set. This initial\n\ password can only be set by the sysop.\n\

\n\

When you execute this command it will ask you for your old\n\ password, then ask you to type in your new password twice (to make\n\ sure you get it right). You may or may not see the data echoed on\n\ the screen as you type, depending on the type of telnet client you\n\ have.\n\

\n\

set/prompt\n\ <string>

\n\
    \n\
  • set/prompt <string> - Set your prompt to <string>\n\
  • \n\
\n\

set/qra\n\ <locator>

\n\
    \n\
  • set/qra <locator> - Set your QRA Grid locator\n\
  • \n\
\n\

Tell the system what your QRA (or Maidenhead) locator is. If you\n\ have not done a SET/LOCATION then your latitude and longitude will\n\ be set roughly correctly (assuming your locator is\n\ correct ;-). For example:-\n\

\n\
SET/QRA JO02LQ\n\
\n\

set/qth\n\ <your qth>

\n\
    \n\
  • set/qth <your qth> - Set your QTH\n\
  • \n\
\n\

Tell the system where you are. For example:-\n\

\n\
SET/QTH East Dereham, Norfolk\n\
\n\

set/startup

\n\
    \n\
  • set/startup - Create your own startup script\n\
  • \n\
\n\

Create a startup script of DXSpider commands which will be\n\ executed everytime that you login into this node. You can only\n\ input the whole script afresh, it is not possible to 'edit' it.\n\ Inputting a new script is just like typing in a message using\n\ SEND. To finish inputting type: /EX on a newline, to abandon the\n\ script type: /ABORT.\n\

\n\

You may find the (curiously named) command BLANK useful to break\n\ up the output. If you simply want a blank line, it is easier to\n\ input one or more spaces and press the <return> key.\n\

\n\

See UNSET/STARTUP to remove a script.\n\

\n\

set/talk

\n\
    \n\
  • set/talk - Allow TALK messages to come out on your terminal\n\
  • \n\
\n\

set/usstate

\n\
    \n\
  • set/usstate - Allow US State info on the end of DX\n\ announcements\n\
  • \n\
\n\

set/wcy

\n\
    \n\
  • set/wcy - Allow WCY messages to come out on your terminal\n\
  • \n\
\n\

set/wwv

\n\
    \n\
  • set/wwv - Allow WWV messages to come out on your terminal\n\
  • \n\
\n\

set/wx

\n\
    \n\
  • set/wx - Allow WX messages to come out on your terminal\n\
  • \n\
\n\

SHOW

\n\

show/chat

\n\
    \n\
  • show/chat [<group>] [<lines>]\n\
  • \n\
\n\

This command allows you to see any chat or conferencing that has\n\ occurred whilst you were away. SHOW/CHAT on its own will show data\n\ for all groups. If you use a group name then it will show only\n\ chat for that group.\n\

\n\

show/configuration

\n\
    \n\
  • show/configuration [<node>]\n\
  • \n\
\n\

This command allows you to see all the users that can be seen and\n\ the nodes to which they are connected.\n\

\n\

This command is normally abbreviated to: sh/c\n\

\n\

Normally, the list returned will be just for the nodes from your\n\ country (because the list otherwise will be very long).\n\

\n\
SH/C ALL\n\
\n\

will produce a complete list of all nodes.\n\

\n\

BE WARNED: the list that is returned can be VERY long\n\

\n\

It is possible to supply a node or part of a prefix and you will\n\ get a list of the users for that node or list of nodes starting\n\ with that prefix.\n\

\n\
SH/C GB7DJK\n\
SH/C SK\n\
\n\

show/configuration/node

\n\
    \n\
  • show/configuration/node\n\
  • \n\
\n\

Show all the nodes connected to this node.\n\

\n\

show/contest

\n\
    \n\
  • show/contest <year and month>\n\
  • \n\
\n\

Show all known contests which are maintained at http://www.sk3bg.se/contest/\n\ for a particular month or year. The format is reasonably flexible.\n\ For example:-\n\

\n\
SH/CONTEST sep2003\n\
SH/CONTEST 03 march\n\
\n\

show/date

\n\
    \n\
  • show/date [<prefix>|<callsign>]\n\
  • \n\
\n\

This is very nearly the same as SHOW/TIME, the only difference\n\ the format of the date string if no arguments are given.\n\

\n\

If no prefixes or callsigns are given then this command returns\n\ the local time and UTC as the computer has it right now. If you\n\ give some prefixes then it will show UTC and UTC + the local\n\ offset (not including DST) at the prefixes or callsigns that you\n\ specify.\n\

\n\

show/db0sdx

\n\
    \n\
  • show/db0sdx <callsign>\n\
  • \n\
\n\

This command queries the DB0SDX QSL server on the internet and\n\ returns any information available for that callsign. This service\n\ is provided for users of this software by http://www.qslinfo.de.\n\

\n\

See also SHOW/QRZ, SHOW/WM7D.\n\

\n\

show/dx

\n\
    \n\
  • show/dx\n\
  • \n\
\n\

If you just type SHOW/DX you will get the last so many spots\n\ (sysop configurable, but usually 10).\n\

\n\

In addition you can add any number of these commands in very\n\ nearly any order to the basic SHOW/DX command, they are:-\n\

\n\
on <band>       - eg 160m 20m 2m 23cm 6mm\n\
on <region>     - eg hf vhf uhf shf      (see SHOW/BANDS)\n\
on <from>/<to>  - eg 1000/4000 14000-30000  (in Khz)\n\
   <from>-<to>\n\
<number>        - the number of spots you want\n\
<from>-<to>     - <from> spot no <to> spot no in the selected list\n\
<from>/<to>\n\
<prefix>        - for a spotted callsign beginning with <prefix>\n\
*<suffix>       - for a spotted callsign ending in <suffix>\n\
*<string>*      - for a spotted callsign containing <string>\n\
day <number>    - starting <number> days ago\n\
day <from>-<to> - <from> days <to> days ago\n\
<from>/<to>\n\
info <text>     - any spots containing <text> in the info or remarks\n\
by <call>       - any spots spotted by <call> (spotter <call> is the same).\n\
qsl             - this automatically looks for any qsl info on the call\n\
  held in the spot database.\n\
iota [<iota>]   - If the iota island number is missing it will look for\n\
  the string iota and anything which looks like an iota\n\
  island number. If you specify then it will look for\n\
  that island.\n\
qra [<locator>] - this will look for the specific locator if you specify\n\
  one or else anything that looks like a locator.\n\
dxcc            - treat the prefix as a 'country' and look for spots\n\
  from that country regardless of actual prefix. eg dxcc oq2\n\
  You can also use this with the 'by' keyword. eg by W dxcc\n\
real or rt      - Format the output the same as for real time spots. The\n\
  formats are deliberately different (so you can tell\n\
  one sort from the other). This is useful for some\n\
  logging programs that can't cope with normal sh/dx\n\
  output. An alias of SHOW/FDX is available.\n\
filter          - Filter the spots, before output, with the user's\n\
  spot filter. An alias of SHOW/MYDX is available.\n\
zone <zones>    - look for spots in the cq zone (or zones) specified.\n\
  zones are numbers separated by commas.\n\
by_zone <zones> - look for spots spotted by people in the cq zone\n\
  specified.\n\
itu <itus>      - look for spots in the itu zone (or zones) specified\n\
  itu zones are numbers separated by commas.\n\
by_itu <itus>   - look for spots spotted by people in the itu zone\n\
  specified.\n\
state <list>    - look for spots in the US state (or states) specified\n\
  The list is two letter state codes separated by commas.\n\
by_state <list> - look for spots spotted by people in the US state\n\
  specified.\n\
\n\

Examples...\n\

\n\
SH/DX 9m0\n\
SH/DX on 20m info iota\n\
SH/DX 9a on vhf day 30\n\
SH/DX rf1p qsl\n\
SH/DX iota\n\
SH/DX iota eu-064\n\
SH/DX qra jn86\n\
SH/DX dxcc oq2\n\
SH/DX dxcc oq2 by w dxcc\n\
SH/DX zone 4,5,6\n\
SH/DX by_zone 4,5,6\n\
SH/DX state in,oh\n\
SH/DX by_state in,oh\n\
\n\

show/dxcc

\n\
    \n\
  • show/dxcc <prefix>\n\
  • \n\
\n\

This command takes the <prefix> (which can be a full or\n\ partial callsign if desired), looks up which internal country\n\ number it is and then displays all the spots as per SH/DX for that\n\ country.\n\

\n\

This is now an alias for 'SHOW/DX DXCC'\n\

\n\

The options for SHOW/DX also apply to this command. e.g.\n\

\n\
SH/DXCC G\n\
SH/DXCC W on 20m iota\n\
\n\

This can be done with the SHOW/DX command like this:-\n\

\n\
SH/DX dxcc g\n\
SH/DX dxcc w on 20m iota\n\
\n\

This is an alias for: SH/DX dxcc\n\

\n\

show/dxqsl

\n\
    \n\
  • show/dxqsl <callsign>\n\
  • \n\
\n\

The node collects information from the comment fields in spots\n\ (things like 'VIA EA7WA' or 'QSL-G1TLH') and stores these in a\n\ database.\n\

\n\

This command allows you to interrogate that database and if the\n\ callsign is found will display the manager(s) that people have\n\ spotted. This information is NOT reliable, but it is normally\n\ reasonably accurate if it is spotted enough times.\n\

\n\

For example:-\n\

\n\
sh/dxqsl 4k9w\n\
\n\

You can check the raw input spots yourself with:-\n\

\n\
sh/dx 4k9w qsl\n\
\n\

This gives you more background information.\n\

\n\

show/dxstats

\n\
    \n\
  • show/dxstats [days] [date]�[0m\n\
  • \n\
\n\

Show the total DX spots for the last <days> no of days\n\ (default is 31), starting from a <date> (default: today).\n\

\n\

show/fdx

\n\
    \n\
  • show/fdx\n\
  • \n\
\n\

Normally SHOW/DX outputs spot data in a different format to the\n\ realtime data. This is a deliberate policy (so you can tell the\n\ difference between the two). Some logging programs cannot handle\n\ this so SHOW/FDX outputs historical data in real time format.\n\

\n\

This is an alias for: SHOW/DX real\n\

\n\

show/files

\n\
    \n\
  • show/files [<filearea> [<string>]]\n\
  • \n\
\n\

SHOW/FILES on its own will show you a list of the various\n\ fileareas available on the system. To see the contents of a\n\ particular file area type:-\n\

\n\
SH/FILES <filearea>\n\
\n\

where <filearea> is the name of the filearea you want to\n\ see the contents of.\n\

\n\

You can also use shell globbing characters like '*' and '?' in a\n\ string to see a selection of files in a filearea eg:-\n\

\n\
SH/FILES bulletins arld*\n\
\n\

See also TYPE - to see the contents of a file.\n\

\n\

show/filter

\n\
    \n\
  • show/filter\n\
  • \n\
\n\

Show the contents of all the filters that are set. This command\n\ displays all the filters set - for all the various categories.\n\

\n\

show/hfstats

\n\
    \n\
  • show/hfstats [days] [date]\n\
  • \n\
\n\

Show the HF DX spots breakdown by band for the last <days>\n\ no of days (default is 31), starting from a <date> (default:\n\ today).\n\

\n\

show/hftable

\n\
    \n\
  • show/hftable [days] [date] [prefix ...]\n\
  • \n\
\n\

Show the HF DX Spotter table for the list of prefixes for the\n\ last <days> no of days (default is 31), starting from a\n\ <date> (default: today).\n\

\n\

If there are no prefixes then it will show the table for your\n\ country.\n\

\n\

Remember that some countries have more than one \"DXCC country\" in\n\ them (eg G :-), to show them (assuming you are not in G\n\ already which is specially treated in the code) you must list all\n\ the relevant prefixes\n\

\n\
sh/hftable g gm gd gi gj gw gu\n\
\n\

Note that the prefixes are converted into country codes so you\n\ don't have to list all possible prefixes for each country.\n\

\n\

If you want more or less days than the default simply include the\n\ number you require:-\n\

\n\
sh/hftable 20 pa\n\
\n\

If you want to start at a different day, simply add the date in\n\ some recognizable form:-\n\

\n\
sh/hftable 2 25nov02\n\
sh/hftable 2 25-nov-02\n\
sh/hftable 2 021125\n\
sh/hftable 2 25/11/02\n\
\n\

This will show the stats for your DXCC for that CQWW contest\n\ weekend.\n\

\n\

You can specify either prefixes or full callsigns (so you can see\n\ how you did against all your mates). You can also say 'all' which\n\ will then print the worldwide statistics.\n\

\n\
sh/hftable all\n\
\n\

show/moon

\n\
    \n\
  • show/moon [ndays] [<prefix>|<callsign>]�[0m\n\
  • \n\
\n\

Show the Moon rise and set times for a (list of) prefixes or\n\ callsigns, together with the azimuth and elevation of the sun\n\ currently at those locations.\n\

\n\

If you don't specify any prefixes or callsigns, it will show the\n\ times for your QTH (assuming you have set it with either\n\ SET/LOCATION or SET/QRA), together with the current azimuth and\n\ elevation.\n\

\n\

In addition, it will show the illuminated fraction of the moons\n\ disk.\n\

\n\

If all else fails it will show the Moonrise and set times for the\n\ node that you are connected to.\n\

\n\

For example:-\n\

\n\
SH/MOON\n\
SH/MOON G1TLH W5UN\n\
\n\

You can also use this command to see into the past or the future,\n\ so if you want to see yesterday's times then do:-\n\

\n\
SH/MOON -1\n\
\n\

or in three days time:-\n\

\n\
SH/MOON +3 W9\n\
\n\

Upto 366 days can be checked both in the past and in the future.\n\

\n\

Please note that the rise and set times are given as the UT times\n\ of rise and set on the requested UT day.\n\

\n\

show/muf

\n\
    \n\
  • show/muf <prefix> [<hours>][long]\n\
  • \n\
\n\

This command allow you to estimate the likelihood of you\n\ contacting a station with the prefix you have specified. The\n\ output assumes a modest power of 20dBW and receiver sensitivity of\n\ -123dBm (about 0.15muV/10dB SINAD)\n\

\n\

The result predicts the most likely operating frequencies and\n\ signal levels for high frequency (shortwave) radio propagation\n\ paths on specified days of the year and hours of the day. It is\n\ most useful for paths between 250 km and 6000 km, but can be used\n\ with reduced accuracy for paths shorter or longer than this.\n\

\n\

The command uses a routine MINIMUF 3.5 developed by the U.S. Navy\n\ and used to predict the MUF given the predicted flux, day of the\n\ year, hour of the day and geographic coordinates of the\n\ transmitter and receiver. This routine is reasonably accurate for\n\ the purposes here, with a claimed RMS error of 3.8 MHz, but much\n\ smaller and less complex than the programs used by major shortwave\n\ broadcasting organizations, such as the Voice of America.\n\

\n\

The command will display some header information detailing its\n\ assumptions, together with the locations, latitude and longitudes\n\ and bearings. It will then show UTC (UT), local time at the other\n\ end (LT), calculate the MUFs, Sun zenith angle at the midpoint of\n\ the path (Zen) and the likely signal strengths. Then for each\n\ frequency for which the system thinks there is a likelihood of a\n\ circuit it prints a value.\n\

\n\

The value is currently a likely S meter reading based on the\n\ conventional 6dB / S point scale. If the value has a '+' appended\n\ it means that it is 1/2 an S point stronger. If the value is\n\ preceded by an 'm' it means that there is likely to be much fading\n\ and by an 's' that the signal is likely to be noisy.\n\

\n\

By default SHOW/MUF will show the next two hours worth of data.\n\ You can specify anything up to 24 hours worth of data by appending\n\ the no of hours required after the prefix. For example:-\n\

\n\
SH/MUF W\n\
\n\

produces:\n\

\n\
RxSens: -123 dBM SFI: 159   R: 193   Month: 10   Day: 21\n\
Power :   20 dBW    Distance:  6283 km    Delay: 22.4 ms\n\
Location                       Lat / Long           Azim\n\
East Dereham, Norfolk          52 41 N 0 57 E         47\n\
United-States-W                43 0 N 87 54 W        299\n\
UT LT  MUF Zen  1.8  3.5  7.0 10.1 14.0 18.1 21.0 24.9 28.0 50.0\n\
18 23 11.5 -35  mS0+ mS2   S3\n\
19  0 11.2 -41  mS0+ mS2   S3\n\
\n\

indicating that you will have weak, fading circuits on top band\n\ and 80m but usable signals on 40m (about S3).\n\

\n\

inputing:-\n\

\n\
SH/MUF W 24\n\
\n\

will get you the above display, but with the next 24 hours worth\n\ of propagation data.\n\

\n\
SH/MUF W L 24\n\
SH/MUF W 24 Long\n\
\n\

Gives you an estimate of the long path propagation characterics.\n\ It should be noted that the figures will probably not be very\n\ useful, nor terrible accurate, but it is included for\n\ completeness.\n\

\n\

show/mydx

\n\
    \n\
  • show/mydx\n\
  • \n\
\n\

SHOW/DX potentially shows all the spots available in the system.\n\ Using SHOW/MYDX will, instead, filter the availble spots using any\n\ spot filter that you have set, first.\n\

\n\

This command, together with ACCEPT/SPOT or REJECT/SPOT, will\n\ allow you to customise the spots that you receive.\n\

\n\

So if you have said: ACC/SPOT on hf, doing a SHOW/MYDX will now\n\ only, ever, show HF spots.

\n\

All the other options on SH/DX can still be used.\n\

\n\

show/newconfiguration

\n\
    \n\
  • show/newconfiguration [<node>]\n\
  • \n\
\n\

This command allows you to see all the users that can be seen and\n\ the nodes to which they are connected.\n\

\n\

This command produces essentially the same information as\n\ SHOW/CONFIGURATION except that it shows all the duplication of any\n\ routes that might be present It also uses a different format which\n\ may not take up quite as much space if you don't have any loops.\n\

\n\

BE WARNED: the list that is returned can be VERY long\n\

\n\

show/newconfiguration/node

\n\
    \n\
  • show/newconfiguration/node\n\
  • \n\
\n\

Show all the nodes connected to this node in the new format.\n\

\n\

show/prefix

\n\
    \n\
  • show/prefix <callsign>\n\
  • \n\
\n\

This command takes the <callsign> (which can be a full or\n\ partial callsign or a prefix), looks up which internal country\n\ number it is and then displays all the relevant prefixes for that\n\ country together with the internal country no, the CQ and ITU\n\ regions.\n\

\n\

See also SHOW/DXCC\n\

\n\

show/qra

\n\
    \n\
  • show/qra <lat> <long>\n\
  • \n\
\n\

This is a multipurpose command that allows you either to\n\ calculate the distance and bearing between two locators or (if\n\ only one locator is given on the command line) the distance and\n\ beraing from your station to the locator. For example:-\n\

\n\
SH/QRA IO92QL\n\
SH/QRA JN06 IN73\n\
\n\

The first example will show the distance and bearing to the\n\ locator from yourself, the second example will calculate the\n\ distance and bearing from the first locator to the second. You can\n\ use 4 or 6 character locators.\n\

\n\

It is also possible to convert a latitude and longitude to a\n\ locator by using this command with a latitude and longitude as an\n\ argument, for example:-\n\

\n\
SH/QRA 52 41 N 0 58 E\n\
\n\
    \n\
  • show/qra <locator> [<locator>]\n\
  • \n\
\n\

Show distance between QRA Grid locators\n\

\n\

show/qrz

\n\
    \n\
  • show/qrz <callsign>\n\
  • \n\
\n\

This command queries the QRZ callbook server on the internet and\n\ returns any information available for that callsign. This service\n\ is provided for users of this software by http://www.qrz.com\n\

\n\

See also SHOW/WM7D for an alternative.\n\

\n\

show/route

\n\
    \n\
  • show/route <callsign> ...\n\
  • \n\
\n\

This command allows you to see to which node the callsigns\n\ specified are connected. It is a sort of inverse sh/config.\n\

\n\
sh/route n2tly\n\
\n\

show/satellite

\n\
    \n\
  • show/satellite <name> [<hours> <interval>]\n\
  • \n\
\n\

Show the tracking data from your location to the satellite of\n\ your choice from now on for the next few hours.\n\

\n\

If you use this command without a satellite name it will display\n\ a list of all the satellites known currently to the system.\n\

\n\

If you give a name then you can obtain tracking data of all the\n\ passes that start and finish 5 degrees below the horizon. As\n\ default it will give information for the next three hours for\n\ every five minute period.\n\

\n\

You can alter the number of hours and the step size, within\n\ certain limits.\n\

\n\

Each pass in a period is separated with a row of '-----'\n\ characters\n\

\n\

So for example:-\n\

\n\
SH/SAT AO-10\n\
SH/SAT FENGYUN1 12 2\n\
\n\

show/startup

\n\
    \n\
  • show/startup\n\
  • \n\
\n\

View the contents of a startup script created with SET/STARTUP.\n\

\n\

show/station

\n\
    \n\
  • show/station [<callsign> ..]\n\
  • \n\
\n\

Show the information known about a callsign and whether (and\n\ where) that callsign is connected to the cluster.\n\

\n\
SH/ST G1TLH\n\
\n\

If no callsign is given then show the information for yourself.\n\

\n\

show/sun

\n\
    \n\
  • show/sun [ndays] [<prefix>|<callsign>]\n\
  • \n\
\n\

Show the sun rise and set times for a (list of) prefixes or\n\ callsigns, together with the azimuth and elevation of the sun\n\ currently at those locations.\n\

\n\

If you don't specify any prefixes or callsigns, it will show the\n\ times for your QTH (assuming you have set it with either\n\ SET/LOCATION or SET/QRA), together with the current azimuth and\n\ elevation.\n\

\n\

If all else fails it will show the sunrise and set times for the\n\ node that you are connected to.\n\

\n\

For example:-\n\

\n\
SH/SUN\n\
SH/SUN G1TLH K9CW ZS\n\
\n\

You can also use this command to see into the past or the future,\n\ so if you want to see yesterday's times then do:-\n\

\n\
SH/SUN -1\n\
\n\

or in three days time:-\n\

\n\
SH/SUN +3 W9\n\
\n\

Upto 366 days can be checked both in the past and in the future.\n\

\n\

Please note that the rise and set times are given as the UT times\n\ of rise and set on the requested UT day.\n\

\n\

show/time

\n\
    \n\
  • show/time [<prefix>|<callsign>]\n\
  • \n\
\n\

If no prefixes or callsigns are given then this command returns\n\ the local time and UTC as the computer has it right now. If you\n\ give some prefixes then it will show UTC and UTC + the local\n\ offset (not including DST) at the prefixes or callsigns that you\n\ specify.\n\

\n\

show/usdb

\n\
    \n\
  • show/usdb [call ..]\n\
  • \n\
\n\

Show the City and State of a Callsign held on the FCC database if\n\ his is being run on this system, eg:-\n\

\n\
sh/usdb k1xx\n\
\n\

show/vhfstats

\n\
    \n\
  • show/vhfstats [days] [date]\n\
  • \n\
\n\

Show the VHF DX spots breakdown by band for the last <days>\n\ no of days (default is 31), starting from a date (default: today).\n\

\n\

show/vhftable

\n\
    \n\
  • show/vhftable [days] [date] [prefix ...]\n\
  • \n\
\n\

Show the VHF DX Spotter table for the list of prefixes for the\n\ last <days> no of days (default is 31), starting from a date\n\ (default: today).\n\

\n\

If there are no prefixes then it will show the table for your\n\ country.\n\

\n\

Remember that some countries have more than one \"DXCC country\" in\n\ them (eg G :-), to show them (assuming you are not in G\n\ already which is specially treated in the code) you must list all\n\ the relevant prefixes\n\

\n\
sh/vhftable g gm gd gi gj gw gu\n\
\n\

Note that the prefixes are converted into country codes so you\n\ don't have to list all possible prefixes for each country.\n\

\n\

If you want more or less days than the default simply include the\n\ number you require:-\n\

\n\
sh/vhftable 20 pa\n\
\n\

If you want to start at a different day, simply add the date in\n\ some recognizable form:-\n\

\n\
sh/vhftable 2 25nov02\n\
sh/vhftable 2 25-nov-02\n\
sh/vhftable 2 021125\n\
sh/vhftable 2 25/11/02\n\
\n\

This will show the stats for your DXCC for that CQWW contest\n\ weekend.\n\

\n\

You can specify either prefixes or full callsigns (so you can see\n\ how you did against all your mates). You can also say 'all' which\n\ will then print the worldwide statistics.\n\

\n\
sh/vhftable all\n\
\n\

show/wcy

\n\

Display the most recent WCY information that has been received by\n\ the system\n\

\n\
    \n\
  • show/wcy\n\
  • \n\
\n\

Show last 10 WCY broadcasts\n\

\n\
    \n\
  • show/wcy <n>\n\
  • \n\
\n\

Show last <n> WCY broadcasts\n\

\n\

show/wm7d

\n\
    \n\
  • show/wm7d <callsign>\n\
  • \n\
\n\

This command queries the WM7D callbook server on the internet and\n\ returns any information available for that US callsign. This\n\ service is provided for users of this software by http://www.wm7d.net.\n\

\n\

See also SHOW/QRZ.\n\

\n\

show/wwv

\n\

Display the most recent WWV information that has been received by\n\ the system\n\

\n\
    \n\
  • show/wwv\n\
  • \n\
\n\

Show last 10 WWV broadcasts\n\

\n\
    \n\
  • show/wwv <n>\n\
  • \n\
\n\

Show last <n> WWV broadcasts\n\

\n\

sysop

\n\
    \n\
  • sysop\n\
  • \n\
\n\

The system automatically reduces your privilege level to that of\n\ a normal user if you login in remotely. This command allows you to\n\ regain your normal privilege level. It uses the normal system:\n\ five numbers are returned that are indexes into the character\n\ array that is your assigned password (see SET/PASSWORD). The\n\ indexes start from zero.\n\

\n\

You are expected to return a string which contains the characters\n\ required in the correct order. You may intersperse those\n\ characters with others to obscure your reply for any watchers. For\n\ example (and these values are for explanation :-):\n\

\n\
password = 012345678901234567890123456789\n\
> sysop\n\
22 10 15 17 3\n\
\n\

you type:-\n\

\n\
aa2bbbb0ccc5ddd7xxx3n\n\
or 2 0 5 7 3\n\
or 20573\n\
\n\

They will all match. If there is no password you will still be\n\ offered numbers but nothing will happen when you input a string.\n\ Any match is case sensitive.\n\

\n\

talk

\n\
    \n\
  • talk <call> > <node> [<text>]\n\
  • \n\
\n\

Send a short message to any other station that is visible on the\n\ cluster system. You can send it to anyone you can see with a\n\ SHOW/CONFIGURATION command, they don't have to be connected\n\ locally.\n\

\n\

The second form of TALK is used when other cluster nodes are\n\ connected with restricted information. This usually means that\n\ they don't send the user information usually associated with\n\ logging on and off the cluster.\n\

\n\

If you know that G3JNB is likely to be present on GB7TLH, but you\n\ can only see GB7TLH in the SH/C list but with no users, then you\n\ would use the second form of the talk message.\n\

\n\

If you want to have a ragchew with someone you can leave the text\n\ message out and the system will go into 'Talk' mode. What this\n\ means is that a short message is sent to the recipient telling\n\ them that you are in a go to the station that you asked for.\n\

\n\

All the usual announcements, spots and so on will still come out\n\ on your terminal. If you want to do something (such as send a\n\ spot) you preceed the normal command with a '/' character, eg:-\n\

\n\
/DX 14001 G1TLH What's a B class licensee doing on 20m CW?\n\
/HELP talk\n\
\n\

To leave talk mode type:\n\

\n\
/EX\n\
\n\

If you are in 'Talk' mode, there is an extention to the '/'\n\ command which allows you to send the output to all the people you\n\ are talking to. You do with the '//' command. For example:-\n\

\n\
//sh/hftable\n\
\n\

will send the hftable as you have it to all the people you are\n\ currently talking to.\n\

\n\
    \n\
  • talk <call> [<text>]\n\
  • \n\
\n\

Send a text message to another station\n\

\n\

type

\n\
    \n\
  • type <filearea>/<name>\n\
  • \n\
\n\

Type out the contents of a file in a filearea. So, for example,\n\ in filearea 'bulletins' you want to look at file 'arld051' you\n\ would enter:-\n\

\n\
TYPE bulletins/arld051\n\
\n\

See also SHOW/FILES to see what fileareas are available and a\n\ list of content.\n\

\n\

unset/announce

\n\
    \n\
  • unset/announce\n\
  • \n\
\n\

Stop announce messages coming out on your terminal\n\

\n\

unset/anntalk

\n\
    \n\
  • unset/anntalk\n\
  • \n\
\n\

The announce system on legacy cluster nodes is used as a talk\n\ substitute because the network is so poorly connected. If you:\n\

\n\
unset/anntalk\n\
\n\

you will suppress several of these announces, you may miss the\n\ odd useful one as well, but you would probably miss them anyway in\n\ the welter of useless ones.\n\

\n\
set/anntalk\n\
\n\

allows you to see them again. This is the default.\n\

\n\

unset/beep

\n\
    \n\
  • unset/beep\n\
  • \n\
\n\

Stop beeps for DX and other messages on your terminal\n\

\n\

unset/dx

\n\
    \n\
  • unset/dx\n\
  • \n\
\n\

Stop DX messages coming out on your terminal\n\

\n\

unset/dxcq

\n\
    \n\
  • unset/dxcq\n\
  • \n\
\n\

Stop CQ Zones on the end of DX announcements\n\

\n\

unset/dxgrid

\n\
    \n\
  • unset/dxgrid\n\
  • \n\
\n\

Stop QRA Grid Square announcements

\n\

A standard feature which is enabled in version 1.43 and above is\n\ that if the spotter's grid square is known it is output on the end\n\ of a DX announcement (there is just enough room). Some user\n\ programs cannot cope with this. You can use this command to reset\n\ (or set) this feature.\n\

\n\

Conflicts with: SET/DXCQ, SET/DXITU\n\

\n\

Do a STAT/USER to see which flags you have set if you are\n\ confused.\n\

\n\

unset/dxitu

\n\
    \n\
  • unset/dxitu\n\
  • \n\
\n\

Stop ITU Zones on the end of DX announcements\n\

\n\

unset/echo

\n\
    \n\
  • unset/echo\n\
  • \n\
\n\

Stop the cluster echoing your input\n\

\n\

If you are connected via a telnet session, different\n\ implimentations of telnet handle echo differently depending on\n\ whether you are connected via port 23 or some other port. You can\n\ use this command to change the setting appropriately.\n\

\n\

The setting is stored in your user profile.\n\

\n\

YOU DO NOT NEED TO USE THIS COMMAND IF YOU ARE CONNECTED VIA\n\ AX25.\n\

\n\

unset/email

\n\
    \n\
  • unset/email\n\
  • \n\
\n\

Stop personal messages being forwarded by email\n\

\n\

If any personal messages come in for your callsign then you can\n\ usevthese commands to control whether they are forwarded onto your\n\ email address. To enable the forwarding do something like:-\n\

\n\
SET/EMAIL mike.tubby@somewhere.com\n\
\n\

You can have more than one email address (each one separated by a\n\ space). Emails are forwarded to all the email addresses you\n\ specify.\n\

\n\

You can disable forwarding by:-\n\

\n\
UNSET/EMAIL\n\
\n\

unset/here

\n\
    \n\
  • unset/here\n\
  • \n\
\n\

Tell the system you are absent from your terminal\n\

\n\

unset/logininfo

\n\
    \n\
  • unset/logininfo\n\
  • \n\
\n\

No longer inform when a station logs in/out locally\n\

\n\

unset/privilege

\n\
    \n\
  • unset/privilege\n\
  • \n\
\n\

Remove any privilege for this session\n\

\n\

You can use this command to 'protect' this session from\n\ unauthorised use. If you want to get your normal privilege back\n\ you will need to either logout and login again (if you are on a\n\ console) or use the SYSOP command.\n\

\n\

unset/prompt

\n\
    \n\
  • unset/prompt\n\
  • \n\
\n\

Set your prompt back to default\n\

\n\

UNSET/PROMPT will undo the SET/PROMPT command and set your prompt\n\ back to normal.\n\

\n\

unset/startup

\n\
    \n\
  • unset/startup\n\
  • \n\
\n\

Remove your own startup script\n\

\n\

unset/talk

\n\
    \n\
  • unset/talk\n\
  • \n\
\n\

Stop TALK messages coming out on your terminal\n\

\n\

unset/usstate

\n\
    \n\
  • unset/usstate\n\
  • \n\
\n\

Stop US State info on the end of DX announcements\n\

\n\

If the spotter's or spotted's US State is known it is output on\n\ the end of a DX announcement (there is just enough room).\n\

\n\

A spotter's state will appear on the RHS of the time (like\n\ SET/DXGRID) and the spotted's State will appear on the LHS of the\n\ time field. Any information found will override any locator\n\ information from SET/DXGRID.\n\

\n\

Some user programs cannot cope with this. You can use this\n\ command to reset (or set) this feature.\n\

\n\

Conflicts with: SET/DXCQ, SET/DXITU\n\

\n\

Do a STAT/USER to see which flags you have set if you are\n\ confused.\n\

\n\

unset/wcy

\n\
    \n\
  • unset/wcy\n\
  • \n\
\n\

Stop WCY messages coming out on your terminal\n\

\n\

unset/wwv

\n\
    \n\
  • unset/wwv\n\
  • \n\
\n\

Stop WWV messages coming out on your terminal\n\

\n\

unset/wx

\n\
    \n\
  • unset/wx\n\
  • \n\
\n\

Stop WX messages coming out on your terminal\n\

\n\

who

\n\
    \n\
  • who\n\
  • \n\
\n\

Show who is physically connected\n\

\n\

This is a quick listing that shows which callsigns are connected\n\ and what sort of connection they have.\n\

\n\

wx

\n\
    \n\
  • wx <text>\n\
  • \n\
\n\

Send a weather message to local users\n\

\n\
    \n\
  • wx full <text>\n\
  • \n\
\n\

Send a weather message to all cluster users\n\

\n\ \n\ "; fldigi-4.1.06/src/navtex/0000775000175000017500000000000013515625027012145 500000000000000fldigi-4.1.06/src/navtex/navtex.cxx0000644000175000017500000016632613472115775014140 00000000000000// --------------------------------------------------------------------- // // navtex.cxx // // Copyright (C) 2011-2016 // Remi Chateauneu, F4ECW // Rik van Riel, AB1KW, // // This file is part of fldigi. Adapted from code contained in JNX // source code distribution. // JNX Copyright (C) Paul Lutus // http://www.arachnoid.com/JNX/index.html // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Sync using multicorrelator, instead of null crossings // Rik van Riel, AB1KW, // // Null crossings are somewhat noisy, and the code to keep the navtex // decoder in sync with the incoming signal using null crossings was // rather fragile. // // Use a multicorrelator instead, which relies on the averaged magnitude // of the signal accumulator to sync the decoder with the incoming signal. // // When debugging the code, the multicorrelator mostly corrects the // modem forward in time, which can be explained by the fact that a // bit takes 110.25 samples, while the code uses 110. When the NAVTEX // transmitter is running at exactly 100 baud, one can expect to see // the decoder get adjusted 25 times a second, to make up for the // difference between 11000 and 11025. // // When multiple signals are on the air simultaneously, the null crossing // code would often lose track of the signal. The multicorrelator seems // to be more stable in this situation, though of course when both signals // are close in strength things do not get decoded right. // // The signal sampling spread of 1/6 of the width of a bit was set through // trial and error. A larger spread increases the signal difference between // early, prompt, and late samples, but reduces the accumulator value seen // by the demodulator. A smaller spread increases the accumulator value seen, // but makes it harder to lock on in noisy conditions. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // low pass mark & space individually // Rik van Riel, AB1KW, // // Putting individual low pass filters on mark and space seems to // result in an improved ability to overcome pulse noise, and decode // weaker navtex signals. // // I have not found any signal where the performance of the codec // got worse with this change. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Correct display metric // Rik van Riel, AB1KW, // // The NAVTEX display_metric() function was buggy, in that decayavg // returns the decayed value, but does not store it. It always put // the current value in the metric, and kept avg_ratio at 0.0. // // This resulted in a somewhat chaotic, and not very useful metric // display. Copy over the S/N calculation from the RTTY code, because // that code seems to work well. // Also print the S/N in Status2, like the RTTY code and other modes // do. // Copying over the RTTY S/N code wholesale might still not be // enough, since the NAVTEX wave form appears to be somewhat // different from RTTY. However, at least we have something // now, and the metric used for squelch seems to work again. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Correct display metric // Rik van Riel, AB1KW, // // Widen afc filter for 'jump 90 Hz' code // // When the NAVTEX code spots a power imbalance of more than a factor // 5 between mark and space, it will shift the frequency by 90 Hz. // This is reported to help with some signals. // // However, it breaks with some other signals, which have a different // spectral distribution between mark and space, with a spectrum looking // something like this: // // * // * // * // ** // ****** *** // ******** ****** // ********** ******** // ******************************************** // ********************************************** // // In this spectrum, mark & space have a similar amount of energy, // but that is only apparent when the comparison between them is // done on a wider sample than 10 Hz. // // Sampling 30 Hz instead seems to result in a more stable AFC. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // use exact bit length // Rik van Riel, AB1KW, // // With a baud rate of 100 and a sample rate of 11025, the number // of bits per sample is 110.25. Approximating this with 110 bits // per sample results in the decoder continuously chasing after the // signal, and losing it more easily during transient noise or // interference events. // // Simply changing the variable type from int to double makes life // a little easier on the bit tracking code. // // The accumulator does not seem to care that it gets an extra sample // every 4 bit periods. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // improvements to the multi correlator // Rik van Riel, AB1KW, // // While the multi correlator for bit sync was a nice improvement over // the null crossing tracking, it did lose sync too easily in the presence // of transient noise or interference, and was full of magic adjustments. // // Replace the magic adjustments with a calculation, which makes the multi // correlator able to ride out transient noise or interference, and then // make a larger adjustment all at once (if needed). // --------------------------------------------------------------------- // --------------------------------------------------------------------- // use same mark/space detector as RTTY modem // Rik van Riel, AB1KW, // // Switch the NAVTEX modem over to the same mark/spac decoder, with W7AY's // automatic threshold correction algorithm, like the RTTY modem uses. // // The noise subtraction is a little different than in the RTTY modem; // the algorithm used in W7AY's code seems to work a little better with // the noise present at 518 kHz, when compared to the algorithm used in // the RTTY modem. // // I have compared this detector to a correlation detector; the latter // appears to be a little more sensitive, which includes higher // sensitivity to noise. With a 250 Hz filter on the radio, the // correlation detector might be a little bit better, while with the // filter on the radio opened up to 4kHz wide, this detector appears // to be more robust. // // On signals with a large mark/space power imbalance, or where the power // distribution in one of the two throws off the automatic frequency // correction, this decoder is able to handle signals that neither of // the alternatives tested does. // --------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "configuration.h" #include "fl_digi.h" #include "debug.h" #include "gettext.h" #include "navtex.h" #include "logbook.h" #include "coordinate.h" #include "misc.h" #include "status.h" #include "strutil.h" #include "kmlserver.h" #include "record_loader.h" #include "fftfilt.h" #include "strutil.h" #include "FL/fl_ask.H" pthread_mutex_t navtex_filter_mutex = PTHREAD_MUTEX_INITIALIZER; /// This models a line of the file defining Navtex stations. class NavtexRecord { std::string m_country ; std::string m_country_code ; double m_frequency ; char m_origin ; std::string m_callsign ; std::string m_name ; CoordinateT::Pair m_coordinates ; std::string m_locator ; /// Reads a CSV file. static const char m_delim = ';'; public: NavtexRecord() : m_frequency(0.0) , m_origin('?') , m_name( _("Unknown station") ) {} char origin(void) const { return m_origin; }; const CoordinateT::Pair & coordinates() const { return m_coordinates; } double frequency(void) const { return m_frequency; }; const std::string & country() const { return m_country; } const std::string & name() const { return m_name; } const std::string & callsign() const { return m_callsign; } /// Example: Azores;AZR;490.0;J;CTH;Horta;38 32 N;28 38 W;II;PP friend std::istream & operator>>( std::istream & istrm, NavtexRecord & rec ) { std::string input_str ; if( ! std::getline( istrm, input_str ) ) return istrm ; std::stringstream str_strm( input_str ); if( read_until_delim( m_delim, str_strm, rec.m_country ) && read_until_delim( m_delim, str_strm /* Country code */ ) && read_until_delim( m_delim, str_strm, rec.m_frequency ) && read_until_delim( m_delim, str_strm, rec.m_origin ) && read_until_delim( m_delim, str_strm, rec.m_callsign ) && read_until_delim( m_delim, str_strm, rec.m_name ) && read_until_delim( m_delim, str_strm, rec.m_coordinates.latitude() ) && read_until_delim( m_delim, str_strm, rec.m_coordinates.longitude() ) && read_until_delim( m_delim, str_strm /* Zone */ ) && read_until_delim( m_delim, str_strm /* Language */ ) && ( rec.m_coordinates.latitude().is_lon() == false ) && ( rec.m_coordinates.longitude().is_lon() == true ) ) { return istrm ; } istrm.setstate(std::ios::eofbit); return istrm ; } }; /// Navtex catalog of stations is used when logging to ADIF file: It gives the station name, callsign etc... class NavtexCatalog : public RecordLoader< NavtexCatalog > { // TODO: Consider a multimap typedef std::deque< NavtexRecord > CatalogType ; CatalogType m_catalog ; /// Frequency more or less 1 %: 485-494 kHz, 512-523 kHz etc... static bool freq_close( double freqA, double freqB ) { static const double freq_ratio = 1.01 ; return ( freqA < freqB * freq_ratio ) || ( freqA * freq_ratio > freqB ); } /// Tells if this is a reasonable Navtex frequency. static bool freq_acceptable( double freq ) { return freq_close( freq, 490.0 ) || freq_close( freq, 518.0 ) || freq_close( freq, 4209.5 ); } void Clear() { m_catalog.clear(); } bool ReadRecord( std::istream & istrm ) { NavtexRecord tmp ; istrm >> tmp ; if( istrm || istrm.eof() ) { m_catalog.push_back( tmp ); return true ; } return false ; } /// Minimal edit distance (Levenshtein) between the pattern and any token of the string. static double DistToStationName( const std::string & msg, const std::string & pattern ) { std::stringstream strm( msg ); /// Any big number is OK, if bigger than any string length. double currDist = 1.7976931348623157e+308; // DBL_MAX ; typedef std::istream_iterator StrmIterStr ; for( StrmIterStr itStrm( strm ); itStrm != StrmIterStr(); ++itStrm ) { const std::string tmp = *itStrm ; currDist = std::min( currDist, (double)levenshtein( tmp, pattern ) ); } return currDist ; } public: std::string base_filename() const { return "NAVTEX_Stations.csv"; } const char * Description() const { return _("Navtex stations"); } /// Usual frequencies are 490, 518 or 4209 kiloHertz. const NavtexRecord * FindStation( long long freq_ll, char origin, const std::string & maidenhead, const std::string & msg) { if( maidenhead.empty() ) return NULL; if( m_catalog.empty() ) { int nbRecs = LoadAndRegister(); static bool error_signaled = false ; if( nbRecs <= 0 ) { LOG_WARN("Error reading Navtex stations file"); if(error_signaled == false) { fl_alert("Cannot read Navtex file %s", storage_filename().first.c_str() ); error_signaled = true ; return NULL; } } error_signaled = false ; } const CoordinateT::Pair coo( maidenhead ); /// Possible Navtex stations stored by closer first. typedef std::multimap< double, CatalogType::const_iterator > SolutionType ; SolutionType solDistKm; double freq = freq_ll / 1000.0 ; // As kiloHertz in the data file. bool okFreq = freq_acceptable( freq ); //LOG_INFO("Operator Maidenhead=%s lon=%lf lat=%lf okFreq=%d Origin=%c", // maidenhead.c_str(), coo.longitude().angle(), coo.latitude().angle(), okFreq, origin ); for( CatalogType::const_iterator it = m_catalog.begin(), en = m_catalog.end(); it != en ; ++it ) { /// The origin letters must be identical. if( origin != it->origin() ) continue ; /// The two frequencies must be close more or less 10%. bool freqClose = freq_close( freq, it->frequency() ); if( okFreq && ! freqClose ) continue ; /// Solutions are stored smallest distance first. double dist = coo.distance( it->coordinates() ); solDistKm.insert( SolutionType::value_type( dist, it ) ); } /// No station found. if( solDistKm.empty() ) return NULL; /// Only one station, no ambiguity. SolutionType::iterator begSolKm = solDistKm.begin(); if( solDistKm.size() == 1 ) return & ( *begSolKm->second ); SolutionType solStrDist ; // Maybe some station names appear but not others. This can be for example "Maltaradio", "Cullercoat", "Limnos" etc... for( SolutionType::iterator itSolKm = begSolKm, endSolKm = solDistKm.end(); itSolKm != endSolKm; ++itSolKm ) { std::stringstream strm ; strm << itSolKm->second->coordinates(); // LOG_INFO("Name=%s Dist=%lf %s", itSolKm->second->name().c_str(), itSolKm->first, strm.str().c_str() ); // The message is in uppercase anyway, so no need to convert. double str_dist = DistToStationName( msg, ucasestr( itSolKm->second->name() ) ); solStrDist.insert( SolutionType::value_type( str_dist, itSolKm->second ) ); } // There are at least two elements, so we can do this. SolutionType::iterator begSolStr = solStrDist.begin(); SolutionType::iterator nxtSolStr = begSolStr; ++nxtSolStr ; // The first message only contains a string very similar to a radio station. if( (begSolStr->first < 2) && ( nxtSolStr->first > 2 ) ) { //LOG_INFO("Levenshtein beg=%lf beg_name=%s next=%lf next_name=%s", // begSolStr->first, begSolStr->second->name().c_str(), // nxtSolStr->first, nxtSolStr->second->name().c_str() ); return & (*begSolStr->second) ; } // There are at least two elements, and more than one station name, or none of them, // is contained in the message. // Just returns the closest element. return & ( *begSolKm->second ); // Now we could search for a coordinate in the message, and we will keep the station which is the closest // to this coordinate. We wish to do that anyway in order to map things in KML. // Possible formats are -(This is experimental): // 67-04.0N 032-25.7E // 47-29'30N 003-16'00W // 6930.1N 01729.9E // 48-21'45N 004-31'45W // 58-37N 003-32W // 314408N 341742E // 42-42N 005-10E // 54-02.3N 004-45.8E // 55-20.76N 014-45.27E // 55-31.1 N 012-44.7 E // 5330.4N 01051.5W // 43 45.0 N - 015 44.8 E // 34-33.7N 012-28.7E // 51 10.55 N - 001 51.02 E // 51.21.67N 002.13.29E // 73 NORTH 14 EAST // 58-01.20N 005-27.08W // 50.56N 007.00,5W // 5630,1N- 00501,6E // LAT. 41.06N - LONG 012.57E // 42 40 01 N - 018 05 10 E // 40 25 31N - 18 15 30E // 40-32.2N 000-33.5E // 58-01.2 NORTH 005-27.1 WEST // 39-07,7N 026-39,2E // // ESTIMATED LIMIT OF ALL KNOWN ICE: // 4649N 5411W TO 4530N 5400W TO // 4400N 4900W TO 4545N 4530W TO // 4715N 4530W TO 5000N 4715W TO // 5530N 5115W TO 5700N 5545W. // } }; // NavtexCatalog static const unsigned char code_to_ltrs[128] = { //0 1 2 3 4 5 6 7 8 9 a b c d e f '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', // 0 '_', '_', '_', '_', '_', '_', '_', 'J', '_', '_', '_', 'F', '_', 'C', 'K', '_', // 1 '_', '_', '_', '_', '_', '_', '_', 'W', '_', '_', '_', 'Y', '_', 'P', 'Q', '_', // 2 '_', '_', '_', '_', '_', 'G', '_', '_', '_', 'M', 'X', '_', 'V', '_', '_', '_', // 3 '_', '_', '_', '_', '_', '_', '_', 'A', '_', '_', '_', 'S', '_', 'I', 'U', '_', // 4 '_', '_', '_', 'D', '_', 'R', 'E', '_', '_', 'N', '_', '_', ' ', '_', '_', '_', // 5 '_', '_', '_', 'Z', '_', 'L', '_', '_', '_', 'H', '_', '_', '\n', '_', '_', '_', // 6 '_', 'O', 'B', '_', 'T', '_', '_', '_', '\r', '_', '_', '_', '_', '_', '_', '_' // 7 }; static const unsigned char code_to_figs[128] = { //0 1 2 3 4 5 6 7 8 9 a b c d e f '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', // 0 '_', '_', '_', '_', '_', '_', '_', '\'', '_', '_', '_', '!', '_', ':', '(', '_', // 1 '_', '_', '_', '_', '_', '_', '_', '2', '_', '_', '_', '6', '_', '0', '1', '_', // 2 '_', '_', '_', '_', '_', '&', '_', '_', '_', '.', '/', '_', ';', '_', '_', '_', // 3 '_', '_', '_', '_', '_', '_', '_', '-', '_', '_', '_', '\07', '_', '8', '7', '_', // 4 '_', '_', '_', '$', '_', '4', '3', '_', '_', ',', '_', '_', ' ', '_', '_', '_', // 5 '_', '_', '_', '"', '_', ')', '_', '_', '_', '#', '_', '_', '\n', '_', '_', '_', // 6 '_', '9', '?', '_', '5', '_', '_', '_', '\r', '_', '_', '_', '_', '_', '_', '_' // 7 }; static const int code_ltrs = 0x5a; static const int code_figs = 0x36; static const int code_alpha = 0x0f; static const int code_beta = 0x33; static const int code_char32 = 0x6a; static const int code_rep = 0x66; static const int char_bell = 0x07; class CCIR476 { unsigned char m_ltrs_to_code[128]; unsigned char m_figs_to_code[128]; bool m_valid_codes[128]; public: CCIR476() { memset( m_ltrs_to_code, 0, 128 ); memset( m_figs_to_code, 0, 128 ); for( size_t i = 0; i < 128; ++i ) m_valid_codes[i] = false ; for (int code = 0; code < 128; code++) { // Valid codes have four bits set only. This leaves three bits for error detection. // TODO: If a code is invalid, we could take the closest value in terms of bits. if (check_bits(code)) { m_valid_codes[code] = true; unsigned char figv = code_to_figs[code]; unsigned char ltrv = code_to_ltrs[code]; if ( figv != '_') { m_figs_to_code[figv] = code; } if ( ltrv != '_') { m_ltrs_to_code[ltrv] = code; } } } } void char_to_code(std::string & str, int ch, bool & ex_shift) const { ch = toupper(ch); // avoid unnecessary shifts if (ex_shift && m_figs_to_code[ch] != '\0') { str.push_back( m_figs_to_code[ch] ); } else if (!ex_shift && m_ltrs_to_code[ch] != '\0') { str.push_back( m_ltrs_to_code[ch] ); } else if (m_figs_to_code[ch] != '\0') { ex_shift = true; str.push_back( code_figs ); str.push_back( m_figs_to_code[ch] ); } else if (m_ltrs_to_code[ch] != '\0') { ex_shift = false; str.push_back( code_ltrs ); str.push_back( m_ltrs_to_code[ch] ); } } int code_to_char(int code, bool shift) const { const unsigned char * target = (shift) ? code_to_figs : code_to_ltrs; if (target[code] != '_') { return target[code]; } // default: return negated code return -code; } int bytes_to_code(int *pos) { int code = 0; int i; for (i = 0; i < 7; i++) code |= ((pos[i] > 0) << i); return code; } int bytes_to_char(int *pos, int shift) { int code = bytes_to_code(pos); return code_to_char(code, shift); } // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive /// Counting set bits, Brian Kernighan's way static bool check_bits(int v) { int bc = 0; while (v != 0) { bc++; v &= v - 1; } //printf("check_bits %d %d %c\n", bc, (int)code_to_ltrs[v], code_to_ltrs[v] ); return bc == 4; } // Is there a valid character in the next 7 ints? bool valid_char_at(int *pos) { int count = 0; int i; for (i = 0; i < 7; i++) if (pos[i] > 0) count++; return (count == 4); } }; /// This is temporary, to manipulate a multi-line string. static const char * new_line = "\n"; // Coordinates samples: // 52-08.5N 003-18.0E // 51-03.93N 001-09.17E // 50-40.2N 001-03.7W class ccir_message : public std::string { static const size_t header_len = 10 ; static const size_t trunc_len = 5 ; // Header structure is: // ZCZCabcd message text NNNN // a : Origin of the station. // b : Message type. // cd : Message number from this station. char m_origin ; char m_subject ; int m_number ; public: const char * msg_type(void) const { switch(m_subject) { case 'A' : return _("Navigational warning"); case 'B' : return _("Meteorological warning"); case 'C' : return _("Ice report"); case 'D' : return _("Search & rescue information, pirate warnings"); case 'E' : return _("Meteorological forecast"); case 'F' : return _("Pilot service message"); case 'G' : return _("AIS message"); case 'H' : return _("LORAN message"); case 'I' : return _("Not used"); case 'J' : return _("SATNAV messages"); case 'K' : return _("Other electronic navaid messages"); case 'L' : return _("Navigational warnings"); case 'T' : return _("Test transmissions (UK only)"); case 'V' : return _("Notice to fishermen (U.S. only)"); case 'W' : return _("Environmental (U.S. only)"); case 'X' : return _("Special services - allocation by IMO NAVTEX Panel"); case 'Y' : return _("Special services - allocation by IMO NAVTEX Panel"); case 'Z' : return _("No message on hand"); default : return _("Invalid navtex subject"); } } private: /// Remove non-Ascii chars, replace new-line by special character etc.... void cleanup() { /// It would be possible to do the change in place, because the new string /// it shorter than the current one, but at the expense of clarity. bool wasDelim = false, wasSpace = false, chrSeen = false ; std::string newStr ; for( iterator it = begin(); it != end(); ++it ) { switch( *it ) { case '\n': case '\r': wasDelim = true ; break ; case ' ' : case '\t': wasSpace = true ; break ; default : if( chrSeen ) { if( wasDelim ) { newStr.append(new_line); } else if( wasSpace ) { newStr.push_back(' '); } } wasDelim = false ; wasSpace = false ; chrSeen = true ; newStr.push_back( *it ); } } swap( newStr ); } void init_members() { m_origin = '?'; m_subject = '?'; m_number = 0 ; } public: ccir_message() { init_members(); } ccir_message( const std::string & s, char origin, char subject, int number ) : std::string(s) , m_origin(origin) , m_subject(subject) , m_number(number) { cleanup(); } void reset_msg() { clear(); init_members(); } typedef std::pair detect_result ; detect_result detect_header() { size_t qlen = size(); if (qlen >= header_len) { const char * comp = & (*this)[ qlen - header_len ]; if( (comp[0] == 'Z') && (comp[1] == 'C') && (comp[2] == 'Z') && (comp[3] == 'C') && (comp[4] == ' ') && isalnum(comp[5]) && isalnum(comp[6]) && isdigit(comp[7]) && isdigit(comp[8]) && // (comp[9] == '\r') ) (strchr( "\n\r", comp[9] ) ) ) { /// This returns the garbage before the valid header. // Garbage because the trailer could not be read, but maybe header OK. ccir_message msg_cut( substr( 0, size() - header_len ), m_origin, m_subject, m_number ); m_origin = comp[5]; m_subject = comp[6]; m_number = ( comp[7] - '0' ) * 10 + ( comp[8] - '0' ); // Remove the beginning useless chars. /// TODO: Read broken headers such as "ZCZC EA0?" clear(); return detect_result( true, msg_cut ); } } return detect_result( false, ccir_message() ); ; } bool detect_end() { // Should be "\r\nNNNN\r\n" theoretically, but tolerates shorter strings. static const size_t slen = 4 ; static const char stop_valid[slen + 1] = "NNNN"; size_t qlen = size(); if (qlen < slen) { return false; } std::string comp = substr(qlen - slen, slen); bool end_seen = comp == stop_valid; if( end_seen ) { erase( qlen - slen, slen ); LOG_INFO("\n%s", c_str()); } return end_seen ; } void display( const std::string & alt_string ) { std::string::operator=( alt_string ); cleanup(); long long currFreq = wf->rfcarrier(); if( ! progdefaults.NVTX_AdifLog && ! progdefaults.NVTX_KmlLog ) { return ; } const NavtexRecord * ptrNavRec = NavtexCatalog::InstCatalog().FindStation(currFreq, m_origin, progdefaults.myLocator, *this ); if( ptrNavRec != NULL ) { LOG_INFO("Locator=%s Origin=%c freq=%d name=%s lon=%lf lat=%lf", progdefaults.myLocator.c_str(), m_origin, static_cast(currFreq), ptrNavRec->name().c_str(), ptrNavRec->coordinates().longitude().angle(), ptrNavRec->coordinates().latitude().angle() ); } else { LOG_INFO("Locator=%s Origin=%c freq=%d Navtex station not found", progdefaults.myLocator.c_str(), m_origin, static_cast(currFreq) ); } if( progdefaults.NVTX_AdifLog ) { /// For updating the logbook with received messages. QsoHelper qso(MODE_NAVTEX); if( ptrNavRec ) { qso.Push(QTH, ptrNavRec->country() ); qso.Push(CALL, ptrNavRec->callsign() ); qso.Push(COUNTRY, ptrNavRec->country() ); qso.Push(GRIDSQUARE, ptrNavRec->coordinates().locator() ); qso.Push(NAME, ptrNavRec->name() ); /// If the header is clean, the message type is removed from the string. // In this context, this field cannot be used. qso.Push(XCHG1, msg_type() ); qso.Push(SRX, strformat( "%d", m_number ) ); } else { qso.Push(NAME, std::string("Station_") + m_origin ); } // Sequence of Chars and line-breaks, ASCII CR (code 13) + ASCII LF (code 10) qso.Push(NOTES, strreplace( *this, new_line, ADIF_EOL ) ); } // Adds a placemark to the navtex KML file. if( progdefaults.NVTX_KmlLog ) { if( ptrNavRec ) { KmlServer::CustomDataT custData ; custData.Push( "Callsign", ptrNavRec->callsign() ); custData.Push( "Country", ptrNavRec->country() ); custData.Push( "Locator", ptrNavRec->coordinates().locator() ); custData.Push( "Message number", m_number ); custData.Push( "Frequency", currFreq ); custData.Push( "Mode", mode_info[MODE_NAVTEX].adif_name ); custData.Push( "Message", *this ); KmlServer::GetInstance()->Broadcast( "Navtex", 0, ptrNavRec->coordinates(), 0, ptrNavRec->name(), "navtex_station", substr( 0, 20 ) + "...", custData ); } // TODO: Parse the message to extract coordinates. } } // display }; // ccir_message static const int deviation_f = 85; static const double dflt_center_freq = 1000.0 ; class navtex ; /// Implements PIMPL idiom. class navtex_implementation { enum State { NOSIGNAL, SYNC_SETUP, SYNC, READ_DATA }; static const char * state_to_str( State s ) { switch( s ) { case NOSIGNAL : return "NOSIGNAL"; case SYNC_SETUP: return "SYNC_SETUP"; case SYNC : return "SYNC"; case READ_DATA : return "READ_DATA"; default : return "Unknown" ; } } bool m_only_sitor_b ; int m_message_counter ; static const size_t m_tx_block_len = 1024 ; /// Between -1 and 1. double m_tx_buf[m_tx_block_len]; size_t m_tx_counter ; navtex * m_ptr_navtex ; pthread_mutex_t m_mutex_tx ; typedef std::list TxMsgQueueT ; TxMsgQueueT m_tx_msg_queue ; double m_metric ; CCIR476 m_ccir476; typedef std::list sync_chrs_type ; ccir_message m_curr_msg ; double m_message_time ; double m_early_accumulator ; double m_prompt_accumulator ; double m_late_accumulator ; double m_mark_f, m_space_f; double m_audio_average ; double m_audio_average_tc; double m_audio_minimum ; double m_time_sec; double m_baud_rate ; int m_sample_rate ; int m_averaged_mark_state; int m_bit_duration ; fftfilt *m_mark_lowpass; fftfilt *m_space_lowpass; double m_mark_phase; double m_space_phase; double m_bit_sample_count, m_half_bit_sample_count; State m_state; int m_sample_count; double m_next_early_event; double m_next_prompt_event; double m_next_late_event; double m_average_early_signal; double m_average_prompt_signal; double m_average_late_signal; std::vector m_bit_values; int m_bit_cursor; bool m_shift ; bool m_pulse_edge_event; int m_error_count; bool m_alpha_phase ; bool m_header_found ; char snrmsg[80]; // filter method related double m_center_frequency_f ; navtex_implementation( const navtex_implementation & ); navtex_implementation(); navtex_implementation & operator=( const navtex_implementation & ); public: navtex_implementation(int the_sample_rate, bool only_sitor_b, navtex * ptr_navtex ) { pthread_mutex_init( &m_mutex_tx, NULL ); m_ptr_navtex = ptr_navtex ; m_only_sitor_b = only_sitor_b ; m_message_counter = 1 ; m_metric = 0.0 ; m_time_sec = 0.0 ; m_state = NOSIGNAL; m_message_time = 0.0 ; m_early_accumulator = 0; m_prompt_accumulator = 0; m_late_accumulator = 0; m_audio_average = 0; m_audio_minimum = 0.15; m_sample_rate = the_sample_rate; m_bit_duration = 0; m_shift = false; m_alpha_phase = false; m_header_found = false; m_center_frequency_f = dflt_center_freq; m_audio_average_tc = 1000.0 / m_sample_rate; // this value must never be zero and bigger than 10. m_baud_rate = 100; double m_bit_duration_seconds = 1.0 / m_baud_rate; m_bit_sample_count = m_sample_rate * m_bit_duration_seconds; m_half_bit_sample_count = m_bit_sample_count / 2; // A narrower spread between signals allows the modem to // center on the pulses better, but a wider spread makes // more robust under noisy conditions. 1/5 seems to work. m_next_early_event = 0; m_next_prompt_event = m_bit_sample_count / 5; m_next_late_event = m_bit_sample_count * 2 / 5; m_average_early_signal = 0; m_average_prompt_signal = 0; m_average_late_signal = 0; m_error_count = 0; m_sample_count = 0; // keep 1 second worth of bit values for decoding m_bit_values.resize(m_baud_rate); m_bit_cursor = 0; m_mark_lowpass = 0; m_space_lowpass = 0; set_filter_values(); configure_filters(); } ~navtex_implementation() { pthread_mutex_destroy( &m_mutex_tx ); } private: void set_filter_values() { // carefully manage the parameters WRT the center frequency // Q must change with frequency // try to maintain a zero mixer output at the carrier frequency double qv = m_center_frequency_f + (4.0 * 1000 / m_center_frequency_f); m_mark_f = qv + deviation_f; m_space_f = qv - deviation_f; m_mark_phase = 0; m_space_phase = 0; } void configure_filters() { // do not allow filters to be changed during signal processing! guard_lock filter_guard(&navtex_filter_mutex); const int filtlen = 512; if (m_mark_lowpass) delete m_mark_lowpass; m_mark_lowpass = new fftfilt(m_baud_rate/m_sample_rate, filtlen); m_mark_lowpass->rtty_filter(m_baud_rate/m_sample_rate); if (m_space_lowpass) delete m_space_lowpass; m_space_lowpass = new fftfilt(m_baud_rate/m_sample_rate, filtlen); m_space_lowpass->rtty_filter(m_baud_rate/m_sample_rate); } void set_state(State s) { if (s != m_state) { m_state = s; set_label_from_state(); } } /// The parameter is appended at the message end. void flush_message(const std::string & extra_info) { if( m_header_found ) { m_header_found = false; display_message( m_curr_msg, m_curr_msg + extra_info ); } else { display_message( m_curr_msg, "[Lost header]:" + m_curr_msg + extra_info ); } m_curr_msg.reset_msg(); m_message_time = m_time_sec; } /// Checks that we have no waited too long, and if so, flushes the message with a specific terminator. void process_timeout() { /// No messaging in SitorB if ( m_only_sitor_b ) { return ; } bool timeOut = m_time_sec - m_message_time > 600 ; if ( ! timeOut ) return ; LOG_INFO("Timeout: time_sec=%lf, message_time=%lf", m_time_sec, m_message_time ); // TODO: Headerless messages could be dropped if shorter than X chars. flush_message(":"); } void process_messages(int c) { m_curr_msg.push_back((char) c); /// No header nor trailer for plain SitorB. if ( m_only_sitor_b ) { m_header_found = true; m_message_time = m_time_sec; return; } ccir_message::detect_result msg_cut = m_curr_msg.detect_header(); if ( msg_cut.first ) { /// Maybe the message was already valid. if( m_header_found ) { display_message( msg_cut.second, msg_cut.second + ":[Lost trailer]" ); } else { /// Maybe only non-significant chars. if( ! msg_cut.second.empty() ) { display_message( msg_cut.second, "[Lost header]:" + msg_cut.second + ":[Lost trailer]" ); } } m_header_found = true; m_message_time = m_time_sec; } else { // valid message state if ( m_curr_msg.detect_end() ) { flush_message(""); } } } // The rep character is transmitted 5 characters (35 bits) ahead of // the alpha character. int fec_offset(int offset) { return offset - 35; } // Flip the sign of the smallest (least certain) bit in a character; // hopefully this will result in the right valid character. void flip_smallest_bit(int *pos) { int minimum = INT_MAX; int smallest_bit = -1; int i; for (i = 0; i < 7; i++) { if (abs(pos[i]) < minimum) { minimum = abs(pos[i]); smallest_bit = i; } } pos[smallest_bit] = -pos[smallest_bit]; } // Try to find a position in the bit stream with: // - the largest number of valid characters, and // - with rep (duplicate) characters in the right locations // This way the code can sync up with an incoming signal after // the initial alpha/rep synchronisation // // http://www.arachnoid.com/JNX/index.html // "NAUTICAL" becomes: // rep alpha rep alpha N alpha A alpha U N T A I U C T A I L C blank A blank L int find_alpha_characters(void) { int best_offset = 0; int best_score = 0; int offset, i; // With 7 bits per character, and interleaved rep & alpha // characters, the first alpha character with a corresponding // rep in the stream can be in any of 14 locations for (offset = 35; offset < (35 + 14); offset++) { int score = 0; int reps = 0; int limit = m_bit_values.size() - 7; // Search for the largest sequence of valid characters for (i = offset; i < limit; i += 7) { if (m_ccir476.valid_char_at(&m_bit_values[i])) { int ri = fec_offset(i); int code = m_ccir476.bytes_to_code(&m_bit_values[i]); int rep = m_ccir476.bytes_to_code(&m_bit_values[ri]); // This character is valid score++; // Does it match its rep? if (code == rep) { // This offset is wrong, rep // and alpha are spaced odd if (code == code_alpha || code == code_rep) { score = 0; break; } reps++; } else if (code == code_alpha) { // Is there a matching rep to // this alpha? int ri = i - 7; int rep = m_ccir476.bytes_to_code(&m_bit_values[ri]); if (rep == code_rep) { reps++; } } } } // the most valid characters, with at least 3 FEC reps if (reps > 3 && score + reps > best_score) { best_score = score + reps; best_offset = offset; } } // m_bit_values fits 14 characters; if there are at least // 9 good ones, tell the caller where they start if (best_score > 8) return best_offset; else return -1; } // Turns accumulator values (estimates of whether a bit is 1 or 0) // into navtex messages void handle_bit_value(int accumulator) { int buffersize = m_bit_values.size(); int i, offset = 0; // Store the received value in the bit stream for (i = 0; i < buffersize - 1; i++) { m_bit_values[i] = m_bit_values[i+1]; } m_bit_values[buffersize - 1] = accumulator; if (m_bit_cursor > 0) m_bit_cursor--; // Find the most likely location where the message starts if (m_state == SYNC) { offset = find_alpha_characters(); if (offset >= 0) { set_state(READ_DATA); m_bit_cursor = offset; m_alpha_phase = true; } else set_state(SYNC_SETUP); } // Process 7-bit characters as they come in, // skipping rep (duplicate) characters if (m_state == READ_DATA) { if (m_bit_cursor < buffersize - 7) { if (m_alpha_phase) { int ret = process_bytes(m_bit_cursor); m_error_count -= ret; if (m_error_count > 5) set_state(SYNC_SETUP); if (m_error_count < 0) m_error_count = 0; } m_alpha_phase = !m_alpha_phase; m_bit_cursor += 7; } } } // Turn a series of 7 bit confidence values into a character // // 1 on successful decode of the alpha character // 0 on unmodified FEC replacement // -1 on soft failure (FEC calculation) // -2 on hard failure int process_bytes(int m_bit_cursor) { int code = m_ccir476.bytes_to_code(&m_bit_values[m_bit_cursor]); int success = 0; if (m_ccir476.check_bits(code)) { LOG_DEBUG("valid code : %x (%c)", code, m_ccir476.code_to_char(code, m_shift)); success = 1; goto decode; } if (fec_offset(m_bit_cursor) < 0) return -1; // The alpha (primary) character received was not correct. // Try the rep (duplicate) copy of the character, and some // permutations to see if the correct character can be found. { int i, calc, avg[7]; // Rep is 5 characters before alpha. int reppos = fec_offset(m_bit_cursor); int rep = m_ccir476.bytes_to_code(&m_bit_values[reppos]); if (CCIR476::check_bits(rep)) { // Current code is probably code_alpha. // Skip decoding to avoid switching phase. if (rep == code_rep) return 0; LOG_DEBUG("FEC replacement: %x -> %x (%c)", code, rep, m_ccir476.code_to_char(rep, m_shift)); code = rep; goto decode; } // Neither alpha or rep are valid. Check whether // the average of the two is a valid character. for (i = 0; i < 7; i++) { int a = m_bit_values[m_bit_cursor + i]; int r = m_bit_values[rep + i]; avg[i] = a + r; } calc = m_ccir476.bytes_to_code(avg); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } // Flip the lowest confidence bit in alpha. flip_smallest_bit(&m_bit_values[m_bit_cursor]); calc = m_ccir476.bytes_to_code(&m_bit_values[m_bit_cursor]); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } // Flip the lowest confidence bit in rep. flip_smallest_bit(&m_bit_values[reppos]); calc = m_ccir476.bytes_to_code(&m_bit_values[reppos]); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } // Try flipping the bit with the lowest confidence // in the average of alpha & rep. flip_smallest_bit(avg); calc = m_ccir476.bytes_to_code(avg); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } LOG_DEBUG("decode fail %x, %x", code, rep); return -2; } decode: process_char(code); return success; } bool process_char(int chr) { static int last_char = 0; switch (chr) { case code_rep: // This code should run in alpha phase, but // it just received two rep characters. Fix // the rep/alpha phase, so FEC works again. if (last_char == code_rep) { LOG_DEBUG("fixing rep/alpha sync"); m_alpha_phase = false; } break; case code_alpha: break; case code_beta: break; case code_char32: break; case code_ltrs: m_shift = false; break; case code_figs: m_shift = true; break; default: chr = m_ccir476.code_to_char(chr, m_shift); if (chr < 0) { LOG_INFO(_("Missed this code: %x"), abs(chr)); } else { filter_print(chr); process_messages(chr); } break; } // switch last_char = chr; return true; } void filter_print(int c) { if (c == char_bell) { /// TODO: It should be a beep, but French navtex displays a quote. put_rx_char('\''); } else if (c != -1 && c != '\r' && c != code_alpha && c != code_rep) { put_rx_char(c); } } void compute_metric(void) { static double sigpwr = 0.0 ; static double noisepwr = 0.0; double delta = m_baud_rate/8.0; double np = wf->powerDensity(m_center_frequency_f, delta) * 3000 / delta; double sp = wf->powerDensity(m_mark_f, delta) + wf->powerDensity(m_space_f, delta) + 1e-10; double snr; sigpwr = decayavg ( sigpwr, sp, sp > sigpwr ? 2 : 8); noisepwr = decayavg ( noisepwr, np, 16 ); snr = 10*log10(sigpwr / noisepwr); snprintf(snrmsg, sizeof(snrmsg), "s/n %3.0f dB", snr); put_Status2(snrmsg); m_metric = CLAMP((3000 / delta) * (sigpwr/noisepwr), 0.0, 100.0); m_ptr_navtex->display_metric(m_metric); } void process_afc() { if( progStatus.afconoff == false ) return ; static size_t cnt_upd = 0 ; static const size_t delay_upd = 50 ; ++cnt_upd ; /// AFC from time to time. if( ( cnt_upd % delay_upd ) != 0 ) { return ; } static int cnt_read_data = 0 ; /// This centers the carrier where the activity is the strongest. static const int bw[][2] = { { -deviation_f - 10, -deviation_f + 5 }, { deviation_f - 5, deviation_f + 10 } }; // find mid frequency of power spectra in mark/space frequency interval double max_carrier = wf->powerDensityMaximum( 2, bw ); /// Do not change the frequency too quickly if an image is received. double next_carr = 0.0 ; State lingering_state ; if( m_state == READ_DATA ) { /// Proportional to the number of lines between each AFC update. cnt_read_data = delay_upd / 20 ; lingering_state = READ_DATA ; } else { if( cnt_read_data ) { --cnt_read_data ; lingering_state = READ_DATA ; } else { lingering_state = m_state ; /// Maybe this is the phasing signal, so we recenter. double pwr_left = wf->powerDensity ( max_carrier - deviation_f, 30 ); double pwr_right = wf->powerDensity( max_carrier + deviation_f, 30 ); static const double ratio_left_right = 5.0 ; if( pwr_left > ratio_left_right * pwr_right ) { max_carrier -= deviation_f ; } else if ( ratio_left_right * pwr_left < pwr_right ) { max_carrier += deviation_f ; } } } switch( lingering_state ) { case NOSIGNAL: case SYNC_SETUP: next_carr = max_carrier ; break; case SYNC: next_carr = decayavg( m_center_frequency_f, max_carrier, 1 ); break; case READ_DATA: // It will stay stable for a couple of calls. if( max_carrier < m_center_frequency_f ) next_carr = std::max( max_carrier, m_center_frequency_f - 3.0 ); else if( max_carrier > m_center_frequency_f ) next_carr = std::min( max_carrier, m_center_frequency_f + 3.0 ); else next_carr = max_carrier ; break; default: LOG_ERROR("Should not happen: lingering_state=%d", (int)lingering_state ); break ; } LOG_DEBUG("m_center_frequency_f=%f max_carrier=%f next_carr=%f cnt_read_data=%d", (double)m_center_frequency_f, max_carrier, next_carr, cnt_read_data ); double delta = fabs( m_center_frequency_f - next_carr ); if( delta > 1.0 ) { // Hertz. m_ptr_navtex->set_freq(next_carr); } } // The signal is sampled at three points: early, prompt, and late. // The prompt event is where the signal is decoded, while early and // late are only used to adjust the time of the sampling to match // the incoming signal. // // The early event happens 1/5 bit period before the prompt event, // and the late event 1/5 bit period later. If the incoming signal // peaks early, it means the decoder is late. That is, if the early // signal is "too large", decoding should to happen earlier. // // Attempt to center the signal so the accumulator is at its // maximum deviation at the prompt event. If the bit is decoded // too early or too late, the code is more sensitive to noise, // and less likely to decode the signal correctly. void process_multicorrelator() { // Adjust the sampling period once every 8 bit periods. if (m_sample_count % (int)(m_bit_sample_count * 8)) return; // Calculate the slope between early and late signals // to align the logic sampling with the received signal double slope = m_average_late_signal - m_average_early_signal; if (m_average_prompt_signal < m_average_early_signal && m_average_prompt_signal < m_average_late_signal) // At a signal minimum. Get out quickly. slope /= 2; else if (m_average_prompt_signal > m_average_late_signal && m_average_prompt_signal > m_average_late_signal) // Limit the adjustment, to ride out noise slope /= 128; else slope /= 32; if (slope) { m_next_early_event += slope; m_next_prompt_event += slope; m_next_late_event += slope; LOG_DEBUG("adjusting by %1.2f, early %1.1f, prompt %1.1f, late %1.1f", slope, m_average_early_signal, m_average_prompt_signal, m_average_late_signal); } } /* A NAVTEX message is built on SITOR collective B-mode and consists of: * a phasing signal of at least ten seconds * the four characters "ZCZC" that identify the end of phasing * a single space * four characters B1, B2, B3 and B4: * B1 is an alpha character identifying the station, * B2 is an alpha character used to identify the subject of the message. * B3 and B4 are two-digit numerics identifying individual messages * a carriage return and a line feed * the information * the four characters "NNNN" to identify the end of information * a carriage return and two line feeds * either * 5 or more seconds of phasing signal and another message starting with "ZCZC" or * an end of emission idle signal alpha for at least 2 seconds. */ public: void process_data(const double * data, int nb_samples) { cmplx z, zmark, zspace, *zp_mark, *zp_space; process_afc(); process_timeout(); // prevent user waterfall interaction from changing filters! guard_lock g( &navtex_filter_mutex ); for( int i =0; i < nb_samples; ++i ) { int n_out; m_time_sec = m_sample_count / m_sample_rate ; double dv = 32767 * data[i]; z = cmplx(dv, dv); zmark = mixer(m_mark_phase, m_mark_f, z); m_mark_lowpass->run(zmark, &zp_mark); zspace = mixer(m_space_phase, m_space_f, z); n_out = m_space_lowpass->run(zspace, &zp_space); if (n_out) process_fft_output(zp_mark, zp_space, n_out); } } private: cmplx mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in; phase -= TWOPI * f / m_sample_rate; if (phase < -TWOPI) phase += TWOPI; return z; } // noise average decays fast down, slow up double noise_decay(double avg, double value) { int divisor; if (value < avg) divisor = m_bit_sample_count / 4; else divisor = m_bit_sample_count * 48; return decayavg(avg, value, divisor); } // envelope average decays fast up, slow down double envelope_decay(double avg, double value) { int divisor; if (value > avg) divisor = m_bit_sample_count / 4; else divisor = m_bit_sample_count * 16; return decayavg(avg, value, divisor); } void process_fft_output(cmplx *zp_mark, cmplx *zp_space, int samples) { // envelope & noise levels for mark & space, respectively static double mark_env = 0, space_env = 0; static double mark_noise = 0, space_noise = 0; for (int i = 0; i < samples; i++) { double mark_abs = abs(zp_mark[i]); double space_abs = abs(zp_space[i]); process_multicorrelator(); m_audio_average += (std::max(mark_abs, space_abs) - m_audio_average) * m_audio_average_tc; m_audio_average = std::max(.1, m_audio_average); // determine noise floor & envelope for mark & space mark_env = envelope_decay(mark_env, mark_abs); mark_noise = noise_decay(mark_noise, mark_abs); space_env = envelope_decay(space_env, space_abs); space_noise = noise_decay(space_noise, space_abs); double noise_floor = (space_noise + mark_noise) / 2; // clip mark & space to envelope & floor mark_abs = min(mark_abs, mark_env); mark_abs = max(mark_abs, noise_floor); space_abs = min(space_abs, space_env); space_abs = max(space_abs, noise_floor); // mark-space discriminator with automatic threshold // correction, see: // http://www.w7ay.net/site/Technical/ATC/ double logic_level = (mark_abs - noise_floor) * (mark_env - noise_floor) - (space_abs - noise_floor) * (space_env - noise_floor) - 0.5 * ( (mark_env - noise_floor) * (mark_env - noise_floor) - (space_env - noise_floor) * (space_env - noise_floor)); // the accumulator hits max when mark_state flips sign bool mark_state = (logic_level > 0); m_early_accumulator += (mark_state) ? 1 : -1; m_prompt_accumulator += (mark_state) ? 1 : -1; m_late_accumulator += (mark_state) ? 1 : -1; // An average of the magnitude of the accumulator // is taken at the sample point, as well as a quarter // bit before and after. This allows the code to see // the best time to sample the signal without relying // on (noisy) null crossings. if (m_sample_count >= m_next_early_event) { m_average_early_signal = decayavg( m_average_early_signal, fabs(m_early_accumulator), 64); m_next_early_event += m_bit_sample_count; m_early_accumulator = 0; } if (m_sample_count >= m_next_late_event) { m_average_late_signal = decayavg( m_average_late_signal, fabs(m_late_accumulator), 64); m_next_late_event += m_bit_sample_count; m_late_accumulator = 0; } // the end of a signal pulse // the accumulator should be at maximum deviation m_pulse_edge_event = m_sample_count >= m_next_prompt_event; if (m_pulse_edge_event) { m_average_prompt_signal = decayavg( m_average_prompt_signal, fabs(m_prompt_accumulator), 64); m_next_prompt_event += m_bit_sample_count; m_averaged_mark_state = m_prompt_accumulator; if (m_ptr_navtex->get_reverse()) m_averaged_mark_state = -m_averaged_mark_state; m_prompt_accumulator = 0; } if (m_audio_average < m_audio_minimum) { set_state(NOSIGNAL); } else if (m_state == NOSIGNAL) { set_state(SYNC_SETUP); } switch (m_state) { case NOSIGNAL: break; case SYNC_SETUP: m_error_count = 0; m_shift = false; set_state(SYNC); break; case SYNC: case READ_DATA: if (m_pulse_edge_event) handle_bit_value(m_averaged_mark_state); } m_sample_count++; } compute_metric(); } /// This updates the window label according to the state. void set_label_from_state(void) const { put_status( state_to_str(m_state) ); } private: /// Each received message is pushed in this queue, so it can be read by XML/RPC. syncobj m_sync_rx ; std::queue< std::string > m_received_messages ; void display_message( ccir_message & ccir_msg, const std::string & alt_string ) { if( ccir_msg.size() >= (size_t)progdefaults.NVTX_MinSizLoggedMsg ) { try { ccir_msg.display(alt_string); put_received_message( alt_string ); } catch( const std::exception & exc ) { LOG_WARN("Caught %s", exc.what() ); } } else { LOG_INFO("Do not log short message:%s", ccir_msg.c_str() ); } } /// Called by the engine each time a message is saved. void put_received_message( const std::string &message ) { guard_lock g( m_sync_rx.mtxp() ); LOG_INFO("%s", message.c_str() ); m_received_messages.push( message ); m_sync_rx.signal(); } public: /// Returns a received message, by chronological order. std::string get_received_message( double max_seconds ) { guard_lock g( m_sync_rx.mtxp() ); LOG_DEBUG("Delay=%f", max_seconds ); if( m_received_messages.empty() ) { if( ! m_sync_rx.wait(max_seconds) ) return "Timeout"; } std::string message = m_received_messages.front(); m_received_messages.pop(); return message ; } // http://www.arachnoid.com/JNX/index.html // "NAUTICAL" becomes: // rep alpha rep alpha N alpha A alpha U N T A I U C T A I L C blank A blank L std::string create_fec( const std::string & str ) const { std::string res ; const size_t sz = str.size(); static const size_t offset = 2 ; for( size_t i = 0 ; i < offset ; ++i ) { res.push_back( code_rep ); res.push_back( code_alpha ); } for ( size_t i = 0; i < sz; ++i ) { res.push_back( str[i] ); res.push_back( i >= offset ? str[ i - offset ] : code_alpha ); } for( size_t i = 0 ; i < offset ; ++i ) { res.push_back( code_char32 ); res.push_back( str[ sz - offset + i ] ); } return res; } /// Note path std::string can contain null characters. TODO: Beware of the extra copy constructor. std::string encode( const std::string & str ) const { std::string res ; bool shift = false ; for ( size_t i = 0, sz = str.size(); i < sz; ++ i ) { m_ccir476.char_to_code(res, str[i], shift ); } return res; } void tx_flush() { if( m_tx_counter != 0 ) { m_ptr_navtex->ModulateXmtr( m_tx_buf, m_tx_counter ); m_tx_counter = 0 ; } } /// Input value must be between -1 and 1 void add_sample( double sam ) { m_tx_buf[ m_tx_counter++ ] = sam ; if( m_tx_counter == m_tx_block_len ) { tx_flush(); } } // REMI : Note change to send_sine void send_sine( double seconds, double freq ) { static double phase = 0; int nb_samples = seconds * m_ptr_navtex->get_samplerate(); double max_level = 0.9;//0.99 ; // Between -1.0 and 1.0 double ratio = 2.0 * M_PI * (double)freq / (double)m_ptr_navtex->get_samplerate() ; for (int i = 0; i < nb_samples ; ++i ) { add_sample( max_level * sin( phase += ratio));//i * ratio ) ); if (phase > 2.0 * M_PI) phase -= 2.0*M_PI; } } void send_phasing( int seconds ) { send_sine( seconds, m_center_frequency_f ); } void send_bit( bool bit ) { send_sine( 1.0 / (double)m_baud_rate, bit ? m_mark_f : m_space_f ); } void send_string( const std::string & msg ) { std::string encod = encode( msg ); std::string sevenbits = create_fec( encod ); for( size_t i = 0, sz = sevenbits.size(); i < sz; i++ ) { char tmp_stat[64]; snprintf( tmp_stat, sizeof(tmp_stat), "Transmission %d%%", (int)( 100.0 * ( i + 1.0 ) / sz ) ); put_status( tmp_stat ); char c = sevenbits[i]; for( size_t j = 0; j < 7 ; ++j, c >>= 1 ) { send_bit( c & 1 ); } } } void send_message( const std::string & msg, bool is_first, bool is_last ) { put_status( "Transmission" ); m_tx_counter = 0 ; if( m_only_sitor_b ) { send_string( msg ); } else { put_status( "Phasing" ); send_phasing( is_first ? 10.0 : 5.0 ); char preamble[64]; const char origin = 'Z' ; // Never seen this value. const char subject = 'I' ; // This code is not used. snprintf( preamble, sizeof(preamble), "ZCZC %c%c%02d\r\n", origin, subject, m_message_counter ); m_message_counter = ( m_message_counter + 1 ) % 100 ; /// The extra cr-nl before NNNN is not in the specification but clarify things. std::string full_msg = preamble + msg + "\r\nNNNN\r\n\n"; send_string( full_msg ); // 5 or more seconds of phasing signal and another message starting with "ZCZC" or // an end of emission idle signal alpha for at least 2 seconds. */ if( is_last ) { put_status( "Trailer" ); send_phasing(2.0); } } tx_flush(); put_status( "" ); } void append_message_to_send( const std::string & msg ) { guard_lock g( &m_mutex_tx ); m_tx_msg_queue.push_back( msg ); } void transmit_message_async( const std::string & msg ) { LOG_INFO("%s", msg.c_str() ); append_message_to_send( msg ); bool is_first = true ; for(;;) { guard_lock g( &m_mutex_tx ); TxMsgQueueT::iterator it = m_tx_msg_queue.begin(), en = m_tx_msg_queue.end(); if( it == en ) break ; TxMsgQueueT::iterator it_next = it ; ++it_next ; bool is_last = it_next == en ; send_message( *it, is_first, is_last ); is_first = false ; m_tx_msg_queue.erase(it); } } void process_tx() { std::string msg ; for(;;) { int c = get_tx_char(); if( c == GET_TX_CHAR_NODATA ) { break ; } msg.push_back( c ); } for( size_t i = 0 ; i < msg.size(); ++ i) { put_echo_char( msg[i] ); } transmit_message_async(msg); } void set_carrier( double freq ) { m_center_frequency_f = freq; set_filter_values(); configure_filters(); } }; // navtex_implementation #ifdef NAVTEX_COMMAND_LINE /// For testing purpose, this file can be compiled and run separately as a command-line program. int main(int n, const char ** v ) { printf("%s\n", v[1] ); FILE * f = fl_fopen( v[1], "r" ); fseek( f, 0, SEEK_END ); long l = ftell( f ); printf("l=%ld\n", l); char * buf = new char[l]; fseek( f, 0, SEEK_SET ); size_t lr = fread( buf, 1, l, f ); if( lr - l ) { printf("Err reading\n"); exit(EXIT_FAILURE); }; navtex_implementation nv(11025) ; double * tmp = new double[l/2]; const short * shrt = (const short *)buf; for( int i = 0; i < l/2; i++ ) tmp[i] = ( (double)shrt[i] ) / 32767.0; nv.process_data( tmp, l / 2 ); return 0 ; } #endif // NAVTEX_COMMAND_LINE navtex::navtex (trx_mode md) { modem::cap |= CAP_AFC | CAP_REV; navtex::mode = md; modem::samplerate = 11025; modem::bandwidth = 2 * deviation_f ; modem::reverse = false ; bool only_sitor_b = false ; switch( md ) { case MODE_NAVTEX : only_sitor_b = false ; break; case MODE_SITORB : only_sitor_b = true ; break; default : LOG_ERROR("Unknown mode"); } m_impl = new navtex_implementation( modem::samplerate, only_sitor_b, this ); } navtex::~navtex() { if( m_impl ) { delete m_impl ; } } void navtex::rx_init() { put_MODEstatus(modem::mode); } void navtex::restart() { } int navtex::rx_process(const double *buf, int len) { m_impl->process_data( buf, len ); return 0; } void navtex::tx_init() { videoText(); // In trx/modem.cxx } int navtex::tx_process() { modem::tx_process(); m_impl->process_tx(); return -1; } void navtex::set_freq( double freq ) { modem::set_freq( freq ); m_impl->set_carrier( freq ); } /// This returns the next received message. std::string navtex::get_message(int max_seconds) { return m_impl->get_received_message(max_seconds); } std::string navtex::send_message(const std::string &msg) { m_impl->append_message_to_send(msg); start_tx(); // If this is not done. return ""; } fldigi-4.1.06/src/feld/0000775000175000017500000000000013515625027011552 500000000000000fldigi-4.1.06/src/feld/FeldWide-14.cxx0000644000175000017500000003101713472116000014107 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld wide-14 font fntchr feldwide_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x4800, 0x4800, 0xFE00, 0xFE00, 0x4800, 0x4800, 0xFE00, 0xFE00, 0x4800, 0x4800, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x1000, 0x7C00, 0xFE00, 0x9200, 0x9000, 0xFC00, 0x7E00, 0x1200, 0x9200, 0xFE00, 0x7C00, 0x1000, 0x0000 }, }, {'%', { 0x0000, 0xC200, 0xC200, 0xC200, 0x0600, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8600, 0x8600, 0x8600, 0x0000 }, }, {'&', { 0x0000, 0x1800, 0x3C00, 0x6400, 0x6000, 0x3000, 0x7A00, 0x5E00, 0xCC00, 0x8400, 0x8600, 0xFE00, 0x7C00, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x1800, 0x3800, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x3800, 0x1800, 0x0000 }, }, {')', { 0x0000, 0xC000, 0xE000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7E00, 0xFF00, 0x8D00, 0x8D00, 0x9900, 0x9900, 0xB100, 0xB100, 0xFF00, 0x7E00, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x3000, 0x7000, 0xD000, 0x9000, 0x1000, 0x1000, 0x1000, 0x1000, 0x7C00, 0x7C00, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x0200, 0x3E00, 0x7C00, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8600, 0x0600, 0x1C00, 0x1C00, 0x0600, 0x8600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xFE00, 0xFE00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x7E00, 0x7E00, 0x4000, 0x4000, 0x7C00, 0x7E00, 0x0200, 0x0200, 0x0600, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'6', { 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8000, 0xBC00, 0xFE00, 0xC200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'8', { 0x7C00, 0xFE00, 0x8200, 0x8200, 0xC600, 0x7C00, 0x7C00, 0xC600, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xFE00, 0x7E00, 0x0200, 0x0200, 0x0600, 0x7C00, 0x7800, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x0200, 0x0E00, 0x1C00, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xBA00, 0xBE00, 0xBC00, 0x8000, 0xC000, 0x7C00, 0x3C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC600, 0x8200, 0x8200, 0xFE00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x7C00, 0x7C00, 0x4200, 0x4200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x4600, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0x8000, 0x8E00, 0x8E00, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0E00, 0x0E00, 0x0200, 0x0200, 0x0200, 0x0200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8600, 0x8600, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8600, 0x8600, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8200, 0xC200, 0xE200, 0xB200, 0x9A00, 0x8E00, 0x8600, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x7E00, 0x7C00, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x8A00, 0x8A00, 0xFE00, 0x7C00, 0x0400, 0x0400 }, }, {'R', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x8200, 0x8200, 0xFE00, 0xFC00, 0x8400, 0x8600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0x8000, 0xFC00, 0x7E00, 0x0200, 0x0200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8600, 0x8C00, 0x9800, 0xB000, 0xE000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x3000, 0x6000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x7E00, 0x0200, 0x7E00, 0xFE00, 0x8200, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xC000, 0xC000, 0x5C00, 0x7E00, 0x6200, 0x4200, 0x4200, 0x4200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0600, 0x0600, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0xFE00, 0xFE00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8200, 0x8200, 0x8600, 0xFE00, 0x7A00, 0x0200, 0x7E00, 0x7C00, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0xC000, 0xC000, 0x5C00, 0x7E00, 0x6200, 0x4200, 0x4200, 0x4200, 0xC200, 0xC200, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x9800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8C00, 0x8C00, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xBC00, 0xFE00, 0xC200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x6200, 0x7E00, 0x5C00, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x1E00, 0x1E00, 0x0000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0x6200, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0xFC00, 0x7E00, 0x0200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8600, 0xFE00, 0x7A00, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldNarr-14.cxx0000644000175000017500000003102113472116000014114 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld narrow-14 font fntchr feldnarr_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0x9000, 0xB000, 0xE000, 0xE000, 0xA000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xC800, 0x7800, 0x3000, 0x2000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x6800, 0xF800, 0xB000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/Feld7x7n-14.cxx0000644000175000017500000003101713472116000014022 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld 7x7n-14 font fntchr feld7x7n_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0x7800, 0xA000, 0xA000, 0x7000, 0x7000, 0x2800, 0x2800, 0xF000, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x0000, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x6800, 0x6800, 0x9000, 0x9000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x6000, 0x6000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0xC000, 0xC000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0xA800, 0xA800, 0x7000, 0x7000, 0xF800, 0xF800, 0x7000, 0x7000, 0xA800, 0xA800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0000, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x6000, 0x6000, 0xA000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x3000, 0x5000, 0x5000, 0x9000, 0x9000, 0xF000, 0xF000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x6000, 0x6000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x0800, 0x3000, 0x3000, 0xC000, 0xC000, 0x3000, 0x3000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1800, 0x1800, 0x6000, 0x6000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0xB000, 0xB000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xB000, 0xB000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0xD800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x9000, 0x9000, 0xD000, 0xD000, 0xB000, 0xB000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x2000, 0x2000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0x4000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0x8000, 0x8000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x1000, 0x1000, 0xF000, 0xF000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x1000, 0x1000, 0x7000, 0x7000, 0x9000, 0x9000, 0x9000, 0x9000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0xF000, 0xF000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3000, 0x3000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000, 0x6000, 0x6000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xD000, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x9000, 0x9000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xB000, 0xC000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0xC000, 0xC000, 0x3000, 0x3000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x6000, 0x6000, 0x6000, 0x6000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x5000, 0x5000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x4000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldLow-14.cxx0000644000175000017500000003101513472116000013756 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld low-14 font fntchr feldlow_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000 }, }, {'$', { 0x2000, 0x7800, 0xF800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF800, 0xF000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x4000, 0xE000, 0xE000, 0xA000, 0x4000, 0x4000, 0xE000, 0xA000, 0xB000, 0xB000, 0xF800, 0x7800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'2', { 0x0000, 0xF000, 0xF800, 0xF800, 0x0800, 0x0800, 0x7800, 0xF000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x7000, 0x7000, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x7800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x0800, 0x0800, 0x3800, 0x3000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0xF000, 0xF000, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000 }, }, {'D', { 0x0000, 0xF000, 0xF800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x9800, 0xB800, 0xF000, 0xE000, 0xE000, 0xF000, 0xB800, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xE800, 0xB800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xFC00, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0xF000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0x9800, 0xB000, 0xB000, 0xE000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x2000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0xD800, 0x7000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0x7800, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x8000, 0x8000, 0x8000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0800, 0x0800, 0x0800, 0x7800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x3000, 0x7000, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'h', { 0x8000, 0x8000, 0x8000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0xF000, 0x6000, 0x0000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xE000, 0xE000, 0xB000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0xD000, 0xF800, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0xB000, 0xF800, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0xF800, 0x4800, 0x4800, 0x7800, 0x7800, 0x7000, 0x4000, 0x4000, 0x4000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x7000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0xD800, 0xF800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x2000, 0x7000, 0xF800, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xC800, 0xE800, 0x7800, 0x3800, 0x3000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0xC000, 0x4000, 0x6000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x6000, 0x4000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0xD800, 0xF800, 0x6C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldModern-14.cxx0000644000175000017500000003102313472116000014440 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld modern-14 font fntchr feldmodern_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x3800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x7000, 0x5000, 0xD000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xD800, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xB400, 0xBC00, 0xB800, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF000, 0xF000, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3000, 0x7800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xF800, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0xF000, 0x7800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0x9000, 0xB000, 0xE000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldHell-12.cxx0000644000175000017500000003101613472116000014100 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feldhell-12 font fntchr feldhell_12[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0xC000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800, 0x0000 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x8800, 0x9800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x9800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800, 0x0000 }, }, {'r', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldFat-14.cxx0000644000175000017500000003101213472116000013724 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld-fat font fntchr feldfat_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x6C00, 0x6C00, 0xFE00, 0xFE00, 0x6C00, 0x6C00, 0xFE00, 0xFE00, 0x6C00, 0x6C00, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x1000, 0x7E00, 0xFE00, 0xD000, 0xD000, 0xFC00, 0x7E00, 0x1600, 0x1600, 0xFE00, 0xFC00, 0x1000, 0x0000 }, }, {'%', { 0x0000, 0xE600, 0xE600, 0xE600, 0x0600, 0x0E00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xCE00, 0xCE00, 0xCE00, 0x0000 }, }, {'&', { 0x0000, 0x1800, 0x3E00, 0x6600, 0x6000, 0x3000, 0x7B00, 0x7F00, 0xCE00, 0xC600, 0xC700, 0xFF00, 0x7C00, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0000 }, }, {')', { 0x0000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x1800, 0xFF00, 0xFF00, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0C00, 0x0C00, 0x1C00, 0x1800, 0x3800, 0x3000, 0x7000, 0x6000, 0xE000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xCE00, 0xCE00, 0xD600, 0xD600, 0xE600, 0xE600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x3000, 0x7000, 0xF000, 0xF000, 0x3000, 0x3000, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0x0600, 0x3E00, 0x7C00, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0x0600, 0x1C00, 0x1C00, 0x0600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xEC00, 0xCC00, 0xCC00, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xFC00, 0xFE00, 0x0600, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7C00, 0xFC00, 0xC000, 0xC000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0x7C00, 0x7C00, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0600, 0x0600, 0x7E00, 0x7C00, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0C00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xE000, 0x7000, 0x3800, 0x1C00, 0x0C00, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1C00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xCC00, 0x0C00, 0x3800, 0x7000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x0000 }, }, {'@', { 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xDE00, 0xDE00, 0xDC00, 0xC000, 0xC000, 0x7C00, 0x3C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0xFE00, 0xFE00, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFC00, 0xFC00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3C00, 0x7E00, 0xE600, 0xC000, 0xC000, 0xC000, 0xC000, 0xE600, 0x7E00, 0x3C00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF800, 0xFC00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xCE00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xF800, 0xF800, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xF800, 0xF800, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3E00, 0x7E00, 0xE000, 0xC000, 0xCE00, 0xCE00, 0xC600, 0xE600, 0x7E00, 0x3C00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF000, 0xF000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0E00, 0x0E00, 0x0600, 0x0600, 0x0600, 0x0600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0xC600, 0xC600, 0xCE00, 0xDC00, 0xF800, 0xF800, 0xDC00, 0xCE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0xC600, 0xEE00, 0xFE00, 0xFE00, 0xD600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0xC600, 0xE600, 0xF600, 0xFE00, 0xDE00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xDE00, 0xDE00, 0xFE00, 0x7C00, 0x0C00, 0x0C00 }, }, {'R', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0xCC00, 0xCE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC000, 0xC000, 0xFC00, 0x7E00, 0x0600, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0x6C00, 0x6C00, 0x3800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xD600, 0xD600, 0xD600, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xCC00, 0xCC00, 0xCC00, 0xFC00, 0x7800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0E00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xE000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xF000, 0xF000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0xC000, 0xC000, 0xE000, 0x6000, 0x7000, 0x3000, 0x3800, 0x1800, 0x1C00, 0x0C00, 0x0C00, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xF000, 0xF000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x7000, 0xF800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x7E00, 0x0600, 0x7E00, 0xFE00, 0xC600, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xC000, 0xC000, 0xDC00, 0xFE00, 0xE600, 0xC600, 0xC600, 0xC600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0600, 0x0600, 0x7600, 0xFE00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xFE00, 0xFE00, 0xC000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x6000, 0x6000, 0xF800, 0xF800, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0600, 0x7E00, 0x7C00 }, }, {'h', { 0x0000, 0x0000, 0xC000, 0xC000, 0xDC00, 0xFE00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x6000, 0x6000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'j', { 0x1800, 0x1800, 0x0000, 0x3800, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0xC000, 0xCC00, 0xDC00, 0xF800, 0xF000, 0xF000, 0xF800, 0xDC00, 0xCC00, 0xCC00, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0xFE00, 0xD600, 0xD600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xE600, 0xFE00, 0xDC00, 0xC000, 0xC000, 0xC000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC600, 0xC600, 0xCE00, 0xFE00, 0x7600, 0x0600, 0x0600, 0x0600 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0xE600, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC000, 0xFC00, 0x7E00, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x6000, 0x6000, 0xF000, 0xF000, 0x6000, 0x6000, 0x6000, 0x6000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xCE00, 0xFE00, 0x7600, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xD600, 0xD600, 0xD600, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3000, 0x7000, 0xE000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x3000, 0x7000, 0x6000, 0x6000, 0x6000, 0xE000, 0xE000, 0x6000, 0x6000, 0x7000, 0x7000, 0x3000, 0x0000 }, }, {'|', { 0x0000, 0xC000, 0xC000, 0xE000, 0x6000, 0x7000, 0x3000, 0x3800, 0x1800, 0x1C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0xC000, 0xE000, 0x6000, 0x6000, 0x6000, 0x7000, 0x7000, 0x6000, 0x6000, 0x6000, 0xE000, 0xC000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x2000, 0x7000, 0xF800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldModern8-14.cxx0000644000175000017500000003102713472116000014534 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld modern -8-14 font fntchr feldmodern8_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8C00, 0x9C00, 0xB400, 0xE400, 0xC400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0C00, 0x1800, 0x1C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4800, 0xC800, 0x8800, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7800, 0x0000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xB200, 0xBE00, 0xBC00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8400, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8400, 0xC400, 0xE400, 0xB400, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xCC00, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0x7800, 0x0800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8000, 0xF800, 0x7C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x4400, 0x6C00, 0x2800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0400, 0x0400, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF800, 0xF800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xC400, 0xFC00, 0xB800, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x0400, 0x0400 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldReal-14.cxx0000644000175000017500000003101713472116000014102 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld real-14 font fntchr feldreal_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x9000, 0x9000, 0xD800, 0x4800, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC400, 0xC400, 0xC400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8C00, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA800, 0xA800, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x7000, 0x7000, 0x1000, 0x1000, 0x3000, 0x3800, 0x0800, 0x0800, 0x1800, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x3800, 0x3800, 0x2000, 0x2000, 0x3000, 0x3800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xE800, 0x6800, 0x0800, 0x1800, 0x3000, 0x6000, 0x4000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0xF800, 0xF800, 0x0800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0xF800, 0xF800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldLittle-12.cxx0000644000175000017500000003102513472116000014451 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld little - 12 font fntchr feldlittle_12[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xE000, 0xF000, 0x1000, 0x1000, 0x7000, 0x7000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xF000, 0x1000, 0x1000, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xA000, 0xF000, 0xD000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000 }, }, {'7', { 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x6000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x7000, 0x1000, 0x1000, 0x3000, 0x6000, 0x4000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x1000, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x8000, 0x8000, 0x8000, 0x8000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xB000, 0xB000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xB000, 0xE000, 0xE000, 0xB000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x9000, 0xD000, 0xF000, 0xB000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0xD000, 0xF000, 0xB000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'R', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xF000, 0xE000, 0xA000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xE000, 0x7000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x6000, 0xC000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x7000, 0x1000, 0x7000, 0xF000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0x6000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x1000, 0x1000, 0x7000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0xF000, 0xF000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x9000, 0x9000, 0xB000, 0xF000, 0x5000, 0x1000, 0x7000, 0x6000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x2000, 0x2000, 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xA000, 0xE000, 0x4000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0xA000, 0xA000, 0xE000, 0xC000, 0xC000, 0xE000, 0xA000, 0xA000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0xF000, 0xD000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x1000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0xE000, 0x7000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0xA000, 0xE000, 0x4000, 0x4000, 0xE000, 0xA000, 0xA000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xD000, 0x7000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x3000, 0x2000, 0x6000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldStyl-14.cxx0000644000175000017500000003101713472116000014152 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld styl-14 font fntchr feldstyl_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0xE000, 0x6000, 0x6800, 0xD800, 0x9000, 0x9000, 0xF800, 0x6800, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'2', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x3000, 0x1800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x7000, 0x5000, 0xD000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x1000, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xB800, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'A', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'D', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xC800, 0x7800, 0x3000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000 }, }, {'P', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xB800, 0xF800, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x9800, 0xF000, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x0800, 0x7800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'b', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'d', { 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000 }, }, {'f', { 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000 }, }, {'h', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9000, 0xF800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldLo8-14.cxx0000644000175000017500000003101513472116000013657 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld Lo8-14 font fntchr feldlo8_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000 }, }, {'$', { 0x2000, 0x7800, 0xF800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF800, 0xF000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x4000, 0xE000, 0xE000, 0xA000, 0x4000, 0x4000, 0xE000, 0xA000, 0xB000, 0xB000, 0xF800, 0x7800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8C00, 0x8C00, 0xB400, 0xB400, 0xC400, 0xC400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x7000, 0x7000, 0x7000, 0x0000 }, }, {'2', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x7C00, 0xF800, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'3', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x3C00, 0x3C00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x8800, 0x8800, 0x8800, 0x8800, 0xFC00, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'5', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'6', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'7', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x7800, 0x7800, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'9', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7C00, 0x7800, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x8000 }, }, {'?', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x0000, 0x0000, 0x3000, 0x3000, 0x3000 }, }, {'@', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xBC00, 0xBC00, 0x8000, 0xC000, 0xFC00, 0x7C00, 0x3C00, 0x0000 }, }, {'A', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000 }, }, {'B', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'C', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x7C00, 0x0000 }, }, {'D', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'E', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'F', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x9C00, 0x9C00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'H', { 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000 }, }, {'I', { 0x0000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'J', { 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'K', { 0x0000, 0x8400, 0x8400, 0x8C00, 0x9C00, 0xB800, 0xF000, 0xF000, 0xB800, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'M', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xFE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000 }, }, {'N', { 0x0000, 0x8400, 0xC400, 0xC400, 0xE400, 0xA400, 0xB400, 0x9400, 0x9C00, 0x8C00, 0x8C00, 0x8400, 0x8400, 0x0000 }, }, {'O', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'P', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0xFE00, 0x7E00, 0x0600, 0x0000 }, }, {'R', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0xF800, 0x8C00, 0x8C00, 0x8C00, 0x0000 }, }, {'S', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0x7C00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'T', { 0x0000, 0xFE00, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'U', { 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'V', { 0x0000, 0x8400, 0x8400, 0x8C00, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0xFE00, 0x6C00, 0x0000 }, }, {'X', { 0x0000, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x8200, 0x8200, 0x0000 }, }, {'Y', { 0x0000, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'Z', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x0C00, 0x0C00, 0x3800, 0x7000, 0xC000, 0xC000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7800, 0x7C00, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'b', { 0x8000, 0x8000, 0x8000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'d', { 0x0400, 0x0400, 0x0400, 0x7C00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x3800, 0x7800, 0x7800, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0xF000, 0xF000, 0xF000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0xFC00, 0xFC00, 0x7800 }, }, {'h', { 0x8000, 0x8000, 0x8000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'i', { 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0xF000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'j', { 0x0800, 0x0800, 0x0000, 0x1800, 0x1800, 0x1800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'k', { 0x8000, 0x8000, 0x8800, 0x9800, 0xB800, 0xF000, 0xE000, 0xE000, 0xB000, 0xB800, 0x9800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0xEC00, 0xFE00, 0xFE00, 0x9200, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0xB800, 0xFC00, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0xFC00, 0x4400, 0x4400, 0x7C00, 0x7C00, 0x7800, 0x4000, 0x4000, 0x4000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xDC00, 0xFC00, 0xFC00, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'t', { 0x4000, 0x4000, 0xF000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0xFC00, 0x7400, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0xC400, 0xE400, 0x7C00, 0x3C00, 0x0400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0xC000, 0x4000, 0x6000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x6000, 0x4000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0xD800, 0xF800, 0x6C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldDx-14.cxx0000644000175000017500000003101213472116000013565 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feldDx-14 font fntchr feldDx_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x0C00, 0x3F00, 0xF3C0, 0xC0C0, 0xC0C0, 0xFFC0, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFF80, 0xFFE0, 0x3060, 0x3060, 0x3F80, 0x3F80, 0x3060, 0x3060, 0xFFE0, 0xFF80, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xF0C0, 0xC000, 0xC000, 0xC000, 0xC000, 0xF0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xFF00, 0xFFC0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0xFFC0, 0xFF00, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFC00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3FC0, 0xFFC0, 0xF000, 0xC000, 0xC3C0, 0xC3C0, 0xC0C0, 0xF0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC3C0, 0xCF00, 0xFC00, 0xFC00, 0xCF00, 0xC3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0xC00C, 0xF03C, 0xFCFC, 0xCFCC, 0xC30C, 0xC00C, 0xC00C, 0xC00C, 0xC00C, 0xC00C, 0x000C, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0xC0C0, 0xF0C0, 0xF0C0, 0xFCC0, 0xCCC0, 0xCFC0, 0xC3C0, 0xC3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFF00, 0xFFC0, 0x30C0, 0x30C0, 0x3FC0, 0x3F00, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xF3C0, 0xC0C0, 0xC0C0, 0xCCC0, 0xCCC0, 0xCFC0, 0xFF00, 0x3F00, 0x03C0, 0x00C0 }, }, {'R', { 0x0000, 0x0000, 0xFF80, 0xFFE0, 0xC060, 0xC060, 0xFFE0, 0xFF80, 0xC180, 0xC1E0, 0xC060, 0xC060, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x3FC0, 0xFFC0, 0xC000, 0xC000, 0xFF00, 0x3FC0, 0x00C0, 0x00C0, 0xFFC0, 0xFF00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC3C0, 0xC300, 0xCF00, 0xCC00, 0xFC00, 0xF000, 0xF000, 0xC000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xCFCC, 0xFCFC, 0x3030, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xF3C0, 0x3F00, 0x0C00, 0x0C00, 0x3F00, 0xF3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xF3C0, 0x3300, 0x3F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0x03C0, 0x0300, 0x0F00, 0x3C00, 0x30C0, 0xF0C0, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000 }, }, {'~', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/FeldVert-14.cxx0000644000175000017500000003101713472116000014137 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld vert-14 font fntchr feldvert_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0xE000, 0x6000, 0x6800, 0xD800, 0x9000, 0x9000, 0xF800, 0x6800, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x7000, 0x7000, 0x0000 }, }, {'2', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x3800, 0x7000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x3000, 0x1800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x1000, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1000, 0x0000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xB800, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'A', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x9800, 0xF000, 0xF000, 0x9800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000 }, }, {'D', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xB800, 0xF800, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'S', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x0800, 0x7800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'b', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'d', { 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'f', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'h', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0xD800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xC800, 0x6800, 0x3800, 0x3000, 0x6000, 0xC000, 0x8000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9000, 0xF800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/feld.cxx0000644000175000017500000003633713472116000013126 00000000000000// // feld.cxx -- FELDHELL modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This modem code owes much to the efforts of Joe Veldhuis, N8FQ // // Adapted from code contained in gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include using namespace std; #include "feld.h" #include "fl_digi.h" #include "fontdef.h" #include "confdialog.h" #include "qrunner.h" #include "status.h" #include "debug.h" #include "threads.h" #include #include LOG_FILE_SOURCE(debug::LOG_MODEM); pthread_mutex_t feld_mutex = PTHREAD_MUTEX_INITIALIZER; char feldmsg[80]; void feld::tx_init() { txcounter = 0.0; tx_state = PREAMBLE; preamble = 3; prevsymb = false; videoText(); return; } void feld::rx_init() { rxcounter = 0.0; peakhold = 0.0; for (int i = 0; i < 2 * RxColumnLen; i++ ) col_data[i] = 0; col_pointer = 0; peakhold = 0.0; minhold = 1.0; agc = 0.0; return; } void feld::init() { modem::init(); initKeyWaveform(); set_scope_mode(Digiscope::BLANK); put_MODEstatus(mode); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } void feld::restart() { set_bandwidth(hell_bandwidth); RxColumnLen = progdefaults.HellRcvHeight; TxColumnLen = FELD_COLUMN_LEN; switch (mode) { // Amplitude modulation modes case MODE_FELDHELL: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_FH; break; case MODE_SLOWHELL: feldcolumnrate = 2.1875; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_SH; break; case MODE_HELLX5: feldcolumnrate = 87.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_X5; break; case MODE_HELLX9: feldcolumnrate = 157.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_X9; break; // Frequency modulation modes case MODE_FSKHELL: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 122.5; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = progdefaults.HELL_BW_FSK; cap |= CAP_REV; break; case MODE_FSKH105: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 55; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = progdefaults.HELL_BW_FSK105; cap |= CAP_REV; break; case MODE_HELL80: feldcolumnrate = 35; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 300; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = progdefaults.HELL_BW_HELL80; cap |= CAP_REV; break; default : feldcolumnrate = 17.5; break; } /* std::cout << "HellRcvHeight: " << progdefaults.HellRcvHeight << "\n" << "rx column length: " << RxColumnLen << "\n" << "tx column length: " << TxColumnLen << "\n" << "feldcolumrate: " << feldcolumnrate << "\n" << "rxpixrate: " << rxpixrate << "\n" << "txpixrate: " << txpixrate << "\n" << "downsampleinc: " << downsampleinc << "\n" << "upsampleinc: " << upsampleinc << "\n" << "hell_bandwidth: " << hell_bandwidth << "\n" << "filter bandwidth: " << filter_bandwidth << "\n"; */ col_data.alloc(2 * RxColumnLen); } feld::~feld() { if (hilbert) delete hilbert; if (bpfilt) delete bpfilt; if (bbfilt) delete bbfilt; if (minmaxfilt) delete minmaxfilt; } feld::feld(trx_mode m) { double lp; mode = m; samplerate = FeldSampleRate; cap |= CAP_BW; restart(); progdefaults.HELL_BW = filter_bandwidth; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); set_bandwidth(hell_bandwidth); wf->redraw_marker(); lp = filter_bandwidth / samplerate; bpfilt = new fftfilt(0, lp, 1024); bbfilt = new Cmovavg(8); average = new Cmovavg( static_cast(500 / downsampleinc)); minmaxfilt = new Cmovavg(120); rxphacc = 0.0; txphacc = 0.0; REQ(&Raster::set_marquee, FHdisp, progdefaults.HellMarquee); } // rx section cmplx feld::mixer(cmplx in) { cmplx z; z = cmplx( cos(rxphacc), sin(rxphacc) ); z = z * in; rxphacc -= 2.0 * M_PI * frequency / samplerate; if (rxphacc < 0) rxphacc += TWOPI; return z; } void feld::FSKHELL_rx(cmplx z) { guard_lock raster_lock(&feld_mutex); double f; double vid; double avg; f = arg(conj(prev) * z) * phi2freq; prev = z; f = bbfilt->run(f); avg = average->run(abs(z)); rxcounter += downsampleinc; if (rxcounter < 1.0) return; rxcounter -= 1.0; if (avg > agc) agc = avg; else switch (progdefaults.hellagc) { case 3: agc *= (1.0 - 0.2 / RxColumnLen); break; case 2: agc *= (1.0 - 0.075 / RxColumnLen); break; case 1: default: agc *= (1.0 - 0.01 / RxColumnLen); } metric = CLAMP(1000*agc, 0.0, 100.0); display_metric(metric); vid = f + 0.5; vid = CLAMP(vid, 0.0, 1.0); if (mode == MODE_HELL80) vid = 1.0 - vid; if (reverse) vid = 1.0 - vid; if (progdefaults.HellBlackboard) vid = 1.0 - vid; col_data[col_pointer + RxColumnLen] = (int)(vid * 255.0); col_pointer++; if (col_pointer == RxColumnLen) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { switch (progdefaults.HellRcvWidth) { case 4: REQ(put_rx_data, col_data, col_data.size()); case 3: REQ(put_rx_data, col_data, col_data.size()); case 2: REQ(put_rx_data, col_data, col_data.size()); case 1: default: REQ(put_rx_data, col_data, col_data.size()); } } col_pointer = 0; for (int i = 0; i < RxColumnLen; i++) col_data[i] = col_data[i + RxColumnLen]; } } void feld::rx(cmplx z) { guard_lock raster_lock(&feld_mutex); double x, avg; int ix; x = abs(z); if (x > peakval) peakval = x; avg = average->run(x); rxcounter += downsampleinc; if (rxcounter < 1.0) return; rxcounter -= 1.0; x = peakval; peakval = 0; if (x > peakhold) peakhold = x; else peakhold *= (1.0 - 0.02 / RxColumnLen); ix = CLAMP(255 * x / peakhold, 0, 255); if (avg > agc) agc = avg; else switch (progdefaults.hellagc) { case 3: agc *= (1.0 - 0.2 / RxColumnLen); break; case 2: agc *= (1.0 - 0.075 / RxColumnLen); break; case 1: default: agc *= (1.0 - 0.01 / RxColumnLen); } metric = CLAMP(1000*agc, 0.0, 100.0); display_metric(metric); if (!progdefaults.HellBlackboard) ix = 255 - ix; col_data[col_pointer + RxColumnLen] = ix; col_pointer++; if (col_pointer >= RxColumnLen) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { switch (progdefaults.HellRcvWidth) { case 4: REQ(put_rx_data, col_data, col_data.size()); case 3: REQ(put_rx_data, col_data, 2 * RxColumnLen);//col_data.size()); case 2: REQ(put_rx_data, col_data, 2 * RxColumnLen);//col_data.size()); case 1: default: REQ(put_rx_data, col_data, 2 * RxColumnLen);//col_data.size()); } } col_pointer = 0; for (int i = 0; i < RxColumnLen; i++) col_data[i] = col_data[i + RxColumnLen]; } } int feld::rx_process(const double *buf, int len) { cmplx z, *zp; int i, n; if (progdefaults.HELL_BW != filter_bandwidth) { double lp; filter_bandwidth = progdefaults.HELL_BW; switch (mode) { case MODE_FELDHELL: progdefaults.HELL_BW_FH = filter_bandwidth; break; case MODE_SLOWHELL: progdefaults.HELL_BW_SH = filter_bandwidth; break; case MODE_HELLX5: progdefaults.HELL_BW_X5 = filter_bandwidth; break; case MODE_HELLX9: progdefaults.HELL_BW_X9 = filter_bandwidth; break; case MODE_FSKHELL: progdefaults.HELL_BW_FSK = filter_bandwidth; break; case MODE_FSKH105: progdefaults.HELL_BW_FSK105 = filter_bandwidth; break; case MODE_HELL80: progdefaults.HELL_BW_HELL80 = filter_bandwidth; } lp = filter_bandwidth / samplerate; bpfilt->create_filter(0, lp); wf->redraw_marker(); } while (len-- > 0) { /* create analytic signal... */ z = cmplx( *buf, *buf ); buf++; hilbert->run(z, z); /* ...so it can be shifted in frequency */ z = mixer(z); n = bpfilt->run(z, &zp); switch (mode) { case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80: for (i = 0; i < n; i++) { FSKHELL_rx(zp[i]); } break; default: for (i = 0; i < n; i++) rx(zp[i]); break; } } return 0; } //===================================================================== // tx section // returns value = column bits with b0 ... b13 the transmit rows respecfully // 1 = on, 0 = off // if all bits are 0 // and no lesser bits are set then character is complete // then return -1; int feld::get_font_data(unsigned char c, int col) { int bits = 0; int mask; int bin; int ordbits = 0; fntchr *font = 0; if (col > 15 || c < ' ' || c > '~') return -1; mask = 1 << (15 - col); switch (progdefaults.feldfontnbr) { case 0: font = feld7x7_14; break; case 1: font = feld7x7n_14; break; case 2: font = feldDx_14; break; case 3: font = feldfat_14; break; case 4: font = feldhell_12; break; case 5: font = feldlittle_12; break; case 6: font = feldlo8_14; break; case 7: font = feldlow_14; break; case 8: font = feldmodern_14; break; case 9: font = feldmodern8_14; break; case 10: font = feldnarr_14; break; case 11: font = feldreal_14; break; case 12: font = feldstyl_14; break; case 13: font = feldvert_14; break; case 14: font = feldwide_14; break; default: font = feld7x7_14; } for (int i = 0; i < 14; i++) ordbits |= font[c-' '].byte[i]; for (int row = 0; row < 14; row ++) { bin = font[c - ' '].byte[13 - row] & mask; if ( bin != 0) bits |= 1 << row; } int testval = (1 << (15 - col)) - 1; if ( (bits == 0) && ((ordbits & testval) == 0) ) return -1; return bits; } double feld::nco(double freq) { double x = sin(txphacc); txphacc += 2.0 * M_PI * freq / samplerate; if (txphacc > TWOPI) txphacc -= TWOPI; return x; } void feld::send_symbol(int currsymb, int nextsymb) { int outlen = 0; double Amp = 1.0; double tone = get_txfreq_woffset(); if (hardkeying != progdefaults.HellPulseFast) { hardkeying = progdefaults.HellPulseFast; initKeyWaveform(); } if (mode == MODE_FSKHELL || mode == MODE_FSKH105 || mode == MODE_HELL80) tone += (reverse ? -1 : 1) * (currsymb ? -1 : 1) * bandwidth / 2.0; for (;;) { switch (mode) { case MODE_FSKHELL : case MODE_FSKH105 : case MODE_HELL80 : break; case MODE_HELLX5 : case MODE_HELLX9 : Amp = currsymb; break; case MODE_FELDHELL : case MODE_SLOWHELL : default : if (prevsymb == 0 && currsymb == 1) { Amp = OnShape[outlen]; } else if (currsymb == 1 && nextsymb == 0) { Amp = OffShape[outlen]; } else Amp = currsymb; break; } outbuf[outlen++] = Amp * nco(tone); if (outlen >= OUTBUFSIZE) { LOG_DEBUG("feld reset"); outlen = 0; break; } txcounter += upsampleinc; if (txcounter < 1.0) continue; txcounter -= 1.0; break; } prevsymb = currsymb; // write to soundcard & display ModulateXmtr(outbuf, outlen); rx_process(outbuf, outlen); } void feld::send_null_column() { for (int i = 0; i < 14; i++) send_symbol(0, 0); } void feld::tx_char(char c) { int column = 0; int bits, colbits; int currbit, nextbit; send_null_column(); if (c == ' ') { send_null_column(); send_null_column(); send_null_column(); } else { while ((bits = get_font_data(c, column)) != -1) { for (int col = 0; col < progdefaults.HellXmtWidth; col++) { colbits = bits; for (int i = 0; i < 14; i++) { currbit = colbits & 1; colbits = colbits >> 1; nextbit = colbits & 1; send_symbol(currbit, nextbit); } } column++; } } send_null_column(); return; } int feld::tx_process() { modem::tx_process(); int c; if (hardkeying != progdefaults.HellPulseFast) { hardkeying = progdefaults.HellPulseFast; initKeyWaveform(); } if (tx_state == PREAMBLE) { if (preamble-- > 0) { tx_char('.'); return 0; } tx_state = DATA; } if (tx_state == POSTAMBLE) { if (postamble-- > 0) { tx_char('.'); return 0; } tx_char(' '); tx_state = PREAMBLE; cwid(); return -1; } c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { tx_state = POSTAMBLE; postamble = 3; return 0; } // if TX buffer empty // send idle character if (c == GET_TX_CHAR_NODATA) { if (progdefaults.HellXmtIdle == true) c = '.'; else { send_null_column(); send_null_column(); return 0; } } if (c == '\r' || c == '\n') c = ' '; tx_char(c); return 0; } void feld::initKeyWaveform() { for (int i = 0; i < MAXLEN; i++) { OnShape[i] = 1.0; OffShape[i] = 0.0; } for (int i = 0; i < 32; i++) { switch (hardkeying) { case 0: OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 33)); // raised cosine with 4 msec rise break; case 1: if (i < 16) OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 16)); // raised cosine with 2 msec rise break; case 2: if (i < 8) OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 8)); // raised cosine with 1 msec rise case 3: default: // square shaped pulse break; } OffShape[31 - i] = OnShape[i]; } } fldigi-4.1.06/src/feld/Feld7x7-14.cxx0000644000175000017500000003101613472116000013643 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld 7x7-14 font fntchr feld7x7_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0x7800, 0xA000, 0xA000, 0x7000, 0x7000, 0x2800, 0x2800, 0xF000, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x0000, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x6800, 0x6800, 0x9000, 0x9000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x6000, 0x6000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0xC000, 0xC000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0xA800, 0xA800, 0x7000, 0x7000, 0xF800, 0xF800, 0x7000, 0x7000, 0xA800, 0xA800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0000, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0x7000, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x6000, 0x6000, 0xA000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF000, 0x0800, 0x0800, 0x3000, 0x3000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x7000, 0x7000, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x7800, 0x7800, 0x0800, 0x0800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x0800, 0x3000, 0x3000, 0xC000, 0xC000, 0x3000, 0x3000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1800, 0x1800, 0x6000, 0x6000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0xB000, 0xB000, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF000, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0xD800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xA800, 0xA800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xF000, 0xF000, 0x9000, 0x9000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x7000, 0x7000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0x4000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0x8000, 0x8000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0xF000, 0xF000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x8800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x7800, 0x7800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0xF800, 0xF800, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x3800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0800, 0x0800, 0x7000, 0x7000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xD000, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xB000, 0xC800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xC800, 0xC800, 0xB000, 0xB000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0x8800, 0x8800, 0x9800, 0x9800, 0x6800, 0x6800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD800, 0xD800, 0x6000, 0x6000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0xC000, 0xC000, 0x3800, 0x3800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x7000, 0x7000, 0x7000, 0x7000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x4800, 0x4800, 0x3000, 0x3000, 0x2000, 0x2000, 0x4000, 0x4000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1000, 0x1000, 0x6000, 0x6000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.1.06/src/feld/feldfonts.cxx0000644000175000017500000000303013472116000014160 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "fontdef.h" #include "Feld7x7-14.cxx" #include "Feld7x7n-14.cxx" #include "FeldDx-14.cxx" #include "FeldFat-14.cxx" #include "FeldHell-12.cxx" #include "FeldLittle-12.cxx" #include "FeldLo8-14.cxx" #include "FeldLow-14.cxx" #include "FeldModern-14.cxx" #include "FeldModern8-14.cxx" #include "FeldNarr-14.cxx" #include "FeldReal-14.cxx" #include "FeldStyl-14.cxx" #include "FeldVert-14.cxx" #include "FeldWide-14.cxx" char szFeldFonts[] = "\ 7x7 14|\ 7x7n 14|\ Dx 14|\ fat 14|\ hell 12|\ little 12|\ lo8 14|\ low 14|\ modern 14|\ modern8 14|\ narr 14|\ real 14|\ style 14|\ vert 14|\ wide 14"; fldigi-4.1.06/src/config_script/0000775000175000017500000000000013515625026013470 500000000000000fldigi-4.1.06/src/config_script/script_parsing.h0000644000175000017500000004740113472115777016625 00000000000000//====================================================================== // script_parsing.h (FLDIGI) // // Author(s): // // Robert Stiles, KK5VD, Copyright (C) 2014 // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ===================================================================== #ifndef __script_parsing__ #define __script_parsing__ #include #include #ifdef __WIN32__ #define PATH_SEPERATOR "\\" #define PATH_CHAR_SEPERATOR '\\' #include #define get_current_dir _getcwd #else #define PATH_SEPERATOR "/" #define PATH_CHAR_SEPERATOR '/' #include #define get_current_dir getcwd #endif #define MAX_CMD_PARAMETERS 5 #define MAX_COMMAND_LENGTH 128 #define MAX_PARAMETER_LENGTH FILENAME_MAX #define MAX_READLINE_LENGTH (FILENAME_MAX+FILENAME_MAX) #define MAX_SUB_SCRIPTS 5 #define SCRIPT_FILE_TAG ((char *)"FLDIGI_CONFIG") #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) #define RESET_ALL 0x01 #define RESET_PARTIAL 0X02 #undef __LOCALIZED_SCRIPT_COMMANDS #ifdef __LOCALIZED_SCRIPT_COMMANDS #pragma message ( \ "\n" \ "************************************************************************\n" \ "* Defining __LOCALIZED_SCRIPT_COMMANDS breaks script compatibility. In *\n" \ "* doing so, FLDIGI development team does not assume responsibility for *\n" \ "* maintaining the code sections that are altered/effected as a result. *\n" \ "************************************************************************\n" ) #define F_LOC(a) _(a) #else #define F_LOC(a) a #endif #define CMD_OPERATOR F_LOC("OPERATOR") #define CMD_CALLSIGN F_LOC("CALLSIGN") #define CMD_NAME F_LOC("NAME") #define CMD_QTH F_LOC("QTH") #define CMD_LOCATOR F_LOC("LOC") #define CMD_ANTENNA F_LOC("ANT") #define CMD_AUDIO_DEVICE F_LOC("AUDIO DEVICE") #define CMD_OSS_AUDIO F_LOC("OSS") #define CMD_OSS_AUDIO_DEV_PATH F_LOC("OSS DEV") #define CMD_PORT_AUDIO F_LOC("PA") #define CMD_PORTA_CAP F_LOC("PA CAPTURE") #define CMD_PORTA_PLAY F_LOC("PA PLAYBACK") #define CMD_PULSEA F_LOC("PUA") #define CMD_PULSEA_SERVER F_LOC("PUA SERVER") #define CMD_AUDIO_SETTINGS F_LOC("AUDIO SETTINGS") #define CMD_CAPTURE_SAMPLE_RATE F_LOC("CAPTURE") #define CMD_PLAYBACK_SAMPLE_RATE F_LOC("PLAYBACK") #define CMD_AUDIO_CONVERTER F_LOC("CONVERTER") #define CMD_RX_PPM F_LOC("RX PPM") #define CMD_TX_PPM F_LOC("TX PPM") #define CMD_TX_OFFSET F_LOC("TX OFFSET") #define CMD_AUDIO_RT_CHANNEL F_LOC("AUDIO RT CHANNEL") #define CMD_MONO_AUDIO F_LOC("MONO AUDIO") #define CMD_AUDIO_L_R F_LOC("MODEM LR") #define CMD_AUDIO_REV_L_R F_LOC("REV LR") #define CMD_PTT_RIGHT_CHAN F_LOC("PTT RT CHAN") #define CMD_CW_QSK_RT_CHAN F_LOC("QSK RT CHAN") #define CMD_PSEUDO_FSK_RT_CHAN F_LOC("FSK RT CHAN") #define CMD_AUDIO_WAVE F_LOC("AUDIO WAVE") #define CMD_WAVE_SR F_LOC("SRATE") #define CMD_HRDWR_PTT F_LOC("RIG HRDWR PTT") #define CMD_HPPT_PTT_RT F_LOC("PTT RT CHAN") #define CMD_HPTT_SP2 F_LOC("SERIAL PORT") #define CMD_HPTT_SP2_PATH F_LOC("DEVICE") #define CMD_HPTT_SP2_RTS F_LOC("RTS") #define CMD_HPTT_SP2_DTR F_LOC("DTR") #define CMD_HPTT_SP2_RTS_V F_LOC("RTSV") #define CMD_HPTT_SP2_DTR_V F_LOC("DTRV") #define CMD_HPTT_SP2_START_DELAY F_LOC("START PTT DELAY") #define CMD_HPTT_SP2_END_DELAY F_LOC("END PTT DELAY") #define CMD_HPTT_UHROUTER F_LOC("UHROUTER") #define CMD_HPTT_PARALLEL F_LOC("PARALLEL") #define CMD_HPTT_SP2_INITIALIZE F_LOC("INIT") #define CMD_RIGCAT F_LOC("RIGCAT") #define CMD_RIGCAT_STATE F_LOC("STATE") #define CMD_RIGCAT_DESC_FILE F_LOC("DESC FILE") #define CMD_RIGCAT_DEV_PATH F_LOC("DEV PATH") #define CMD_RIGCAT_RETRIES F_LOC("RETRIES") #define CMD_RIGCAT_RETRY_INTERVAL F_LOC("RETRY INT") #define CMD_RIGCAT_WRITE_DELAY F_LOC("WDELAY") #define CMD_RIGCAT_INTIAL_DELAY F_LOC("IDELAY") #define CMD_RIGCAT_BAUD_RATE F_LOC("BRATE") #define CMD_RIGCAT_STOP_BITS F_LOC("SBITS") #define CMD_RIGCAT_ECHO F_LOC("ECHO") #define CMD_RIGCAT_TOGGLE_RTS_PTT F_LOC("TOGGLE RTS PTT") #define CMD_RIGCAT_TOGGLE_DTR_PTT F_LOC("TOGGLE DTR PTT") #define CMD_RIGCAT_RESTORE F_LOC("RESTORE") #define CMD_RIGCAT_PTT_COMMAND F_LOC("PTT COMMAND") #define CMD_RIGCAT_RTS_12V F_LOC("RTS 12V") #define CMD_RIGCAT_DTR_12V F_LOC("DTR 12V") #define CMD_RIGCAT_HRDWR_FLOW F_LOC("HRDWR FC") #define CMD_RIGCAT_VSP F_LOC("VSP") #define CMD_RIGCAT_INITIALIZE F_LOC("INIT") #define CMD_HAMLIB F_LOC("HAMLIB") #define CMD_HAMLIB_STATE F_LOC("STATE") #define CMD_HAMLIB_RIG F_LOC("RIG") #define CMD_HAMLIB_DEV_PATH F_LOC("DEV PATH") #define CMD_HAMLIB_RETRIES F_LOC("RETRIES") #define CMD_HAMLIB_RETRY_INTERVAL F_LOC("RETRY INT") #define CMD_HAMLIB_WRITE_DELAY F_LOC("WDELAY") #define CMD_HAMLIB_POST_WRITE_DELAY F_LOC("PWDELAY") #define CMD_HAMLIB_BAUD_RATE F_LOC("BRATE") #define CMD_HAMLIB_STOP_BITS F_LOC("SBITS") #define CMD_HAMLIB_POLL_RATE F_LOC("POLL_RATE") #define CMD_HAMLIB_SIDE_BAND F_LOC("SBAND") #define CMD_HAMLIB_PTT_COMMAND F_LOC("PTT COMMAND") #define CMD_HAMLIB_DTR_12V F_LOC("DTR 12V") #define CMD_HAMLIB_RTS_12V F_LOC("RTS 12V") #define CMD_HAMLIB_HRDWR_FLOW F_LOC("HRDWR FC") #define CMD_HAMLIB_SFTWR_FLOW F_LOC("SFTWR FC") #define CMD_HAMLIB_ADV_CONFIG F_LOC("ADV CONF") #define CMD_HAMLIB_INITIALIZE F_LOC("INIT") #define CMD_RC_XMLRPC F_LOC("XMLRPC RC") #define CMD_RC_XMLRPC_STATE F_LOC("STATE") #define CMD_RC_XMLRPC_BW_DELAY F_LOC("BWDELAY") #define CMD_RC_XMLRPC_INITIALIZE F_LOC("INIT") #define CMD_FLDIGI F_LOC("FLDIGI") #define CMD_FLDIGI_FREQ F_LOC("FREQ") #define CMD_FLDIGI_MODE F_LOC("MODE") #define CMD_FLDIGI_WFHZ F_LOC("WFHZ") #define CMD_FLDIGI_RXID F_LOC("RXID") #define CMD_FLDIGI_TXID F_LOC("TXID") #define CMD_FLDIGI_SPOT F_LOC("SPOT") #define CMD_FLDIGI_REV F_LOC("REV") #define CMD_FLDIGI_LOCK F_LOC("LOCK") #define CMD_FLDIGI_AFC F_LOC("AFC") #define CMD_FLDIGI_SQL F_LOC("SQL") #define CMD_FLDIGI_KPSQL F_LOC("KPSQL") #define CMD_FLDIGI_KPSM F_LOC("KPSM") #define CMD_FLDIGI_MODEM F_LOC("MODEM") #define CMD_IO F_LOC("IO") #define CMD_IO_LOCK F_LOC("LOCK") #define CMD_IO_ACT_PORT F_LOC("PORT") #define CMD_IO_AX25_DECODE F_LOC("AX25D") #define CMD_IO_CSMA F_LOC("CSMA") #define CMD_IO_KISS F_LOC("KISS") #define CMD_IO_KISS_IPA F_LOC("IPA") #define CMD_IO_KISS_IOPN F_LOC("IOPN") #define CMD_IO_KISS_OPN F_LOC("OPN") #define CMD_IO_KISS_DP F_LOC("DP") #define CMD_IO_KISS_BUSY F_LOC("BUSY") #define CMD_IO_KISS_CONT F_LOC("CONT") #define CMD_IO_KISS_ATTEN F_LOC("ATTEN") #define CMD_IO_ARQ F_LOC("ARQ") #define CMD_IO_ARQ_IPA F_LOC("IPA") #define CMD_IO_ARQ_IOPN F_LOC("IOPN") #define CMD_IO_XMLRPC F_LOC("XMLRPC") #define CMD_IO_XMLRPC_IPA F_LOC("IPA") #define CMD_IO_XMLRPC_IOPN F_LOC("IOPN") #define CMD_NBEMS F_LOC("MISC NBEMS") #define CMD_NBEMS_STATE F_LOC("STATE") #define CMD_NBEMS_MSG F_LOC("OPEN MSG") #define CMD_NBEMS_FLMSG F_LOC("OPEN FLMSG") #define CMD_NBEMS_FLMSG_PATH F_LOC("PATH") #define CMD_NBEMS_BRWSR F_LOC("OPEN BRWSR") #define CMD_NBEMS_TIMEOUT F_LOC("TIMEOUT") #define CMD_ID F_LOC("ID") #define CMD_ID_RSID F_LOC("RSID") #define CMD_ID_RSID_NOTIFY F_LOC("NOTIFY") #define CMD_ID_RSID_SRCH_BP F_LOC("SRCH BP") #define CMD_ID_RSID_MARK_PREV F_LOC("MARK PREV") #define CMD_ID_RSID_DETECTOR F_LOC("DETECTOR") #define CMD_ID_RSID_ALRT_DIALOG F_LOC("ALRT DIALOG") #define CMD_ID_RSID_TX_FREQ_LOCK F_LOC("TX FREQ LOCK") #define CMD_ID_RSID_FREQ_CHANGE F_LOC("FREQ CHANGE") #define CMD_ID_RSID_ALLOW_ERRORS F_LOC("ALLOW ERRORS") #define CMD_ID_RSID_SQL_OPEN F_LOC("SQL OPEN") #define CMD_ID_RSID_PRETONE F_LOC("PRETONE") #define CMD_ID_RSID_END_XMT_ID F_LOC("END XMT ID") #define CMD_ID_VIDEO F_LOC("VIDEO") #define CMD_ID_VIDEO_TX_ID_MODE F_LOC("ID MODE") #define CMD_ID_VIDEO_TX_VIDEO_TXT F_LOC("VIDEO TXT") #define CMD_ID_VIDEO_TX_TXT_INP F_LOC("TEXT INPUT") #define CMD_ID_VIDEO_SMALL_FONT F_LOC("SMALL FONT") #define CMD_ID_VIDEO_500_HZ F_LOC("500HZ") #define CMD_ID_VIDEO_WIDTH_LIMIT F_LOC("WIDTH LIMIT") #define CMD_ID_VIDEO_CHAR_ROW F_LOC("CHAR ROW") #define CMD_ID_CW F_LOC("CW") #define CMD_ID_CW_TX_CALLSIGN F_LOC("TX CALL") #define CMD_ID_CW_SPEED F_LOC("SPEED") #define CMD_LOAD_MACRO F_LOC("MACRO") #define CMD_END_CMD F_LOC("END") // Parameters localized - no restrictions. #define PARM_ENABLE _("ENABLE") #define PARM_YES _("YES") #define PARM_DISABLE _("DISABLE") #define PARM_NO _("NO") #define PARM_KISS _("KISS") #define PARM_ARQ _("ARQ") #define SCRIPT_COMMAND 0x0001 #define SCRIPT_DOT_NOTATION_ONLY 0x0002 #define SCRIPT_STRUCTURED_ONLY 0x0004 #define RECURSIVE_LIMIT 3 #define MAX_DELETE_LIST_COUNT 100 //! @enum script_codes //! Error codes. //! @typedef SCRIPT_CODES //! @see script_codes typedef enum script_codes { script_recursive_limit_reached = -100, //!< Reached command recursive limit. script_command_not_found = -100, //!< Script command not found. script_unexpected_eof, //!< Unexspected end of file reached. script_file_read_error, //!< File read error script_errors_reported, //!< Script Errors found during parsing of file. script_file_not_found, //!< Script file not found. script_path_not_found, //!< Script directory path not found. script_device_path_not_found, //!< Script device path not found. script_non_script_file, //!< Opened file not a Script file. script_max_sub_script_reached, //!< Maximum open subscripts reached. script_subscript_exec_fail, //!< Subscript execution fail (internal). script_incorrectly_assigned_value, //!< Incorrect parameter type. script_invalid_parameter, //!< Parameter is not valid. script_parameter_error, //!< Script parameter invalid. script_function_parameter_error, //!< Function parameter error (internal, non script error). script_mismatched_quotes, //!< Opening or closing quotes missing prior to reaching end if line. script_command_seperator_missing, //!< Command missing ':' script_args_eol, //!< Reached end of args list sooner then expected script_param_check_eol, //!< Reached end of parameter check list sooner then expected script_paramter_exceeds_length, //!< Data length exceeds expectations script_memory_allocation_error, //!< Memory Allocation Error (Non-Script internal Error). script_general_error = -1, //!< General purpose error (undefined erros). script_no_errors, //!< No Errors script_char_match_not_found, //!< Search char not found (Warning) script_end_of_line_reached, //!< End of line reached (Warning) script_end_of_list_reached, //!< End of list reached (Info) script_list, //!< List command (Info) script_command_handled, //!< Command was procedded and handled (Info) } SCRIPT_CODES; //! @enum paramter_types //! Parameter type flags. Used to validate the informarion. //! @typedef PARAM_TYPES //! @see paramter_types typedef enum paramter_types { p_null = 0, p_void, p_bool, p_char, p_int, p_unsigned_int, p_long, p_unsigned_long, p_float, p_double, p_string, p_path, p_filename, p_dev_path, p_dev_name, p_list, p_list_end } PARAM_TYPES; class ScriptParsing; //! @struct script_cmds //! Vector table of script command string and executing function member. //! @typedef SCRIPT_COMMANDS //! @see script_cmds typedef struct script_cmds { char command[MAX_COMMAND_LENGTH]; //!< Command matching string. int flags; //!< General purpose flags size_t command_length; //!< Number of chacters in the command string. int argc; //!< Number of required prarmeters for the command char *args[MAX_CMD_PARAMETERS+1]; //!< String vector table of parameters enum paramter_types param_check[MAX_CMD_PARAMETERS+1]; //!< Flags to determine type of parameter. const char **valid_values; //!< A list of valid paramters. int valid_value_count; //!< The number of valid paramters. SCRIPT_CODES (ScriptParsing::*func)(struct script_cmds *); //!< The function (member) to execute on positive match int (*cb)(ScriptParsing *sp, struct script_cmds *sd); //!< Call back function for script command struct script_cmds * sub_commands; //!< List of sub commands size_t sub_command_count; //!< Number of table entires in the sub table. } SCRIPT_COMMANDS; //! @class script_parsing_class class ScriptParsing { public: private: pthread_mutex_t ac; //. // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include #ifdef __WOE32__ # ifdef __CYGWIN__ # include # else # include # endif #endif #include #include #include #include #include #include #ifndef __WOE32__ #include #endif #include "gettext.h" #include "fl_digi.h" #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include "waterfall.h" #include "raster.h" #include "progress.h" #include "Panel.h" #include "main.h" #include "threads.h" #include "trx.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "timeops.h" #include "rigio.h" #include "nullmodem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "mt63.h" #include "view_rtty.h" #include "olivia.h" #include "contestia.h" #include "thor.h" #include "dominoex.h" #include "feld.h" #include "throb.h" //#include "pkt.h" #include "wwv.h" #include "analysis.h" #include "ssb.h" #include "smeter.h" #include "pwrmeter.h" #include "ascii.h" #include "globals.h" #include "misc.h" #include "FTextRXTX.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "macros.h" #include "macroedit.h" #include "logger.h" #include "lookupcall.h" #include "font_browser.h" #include "icons.h" #include "pixmaps.h" #include "rigsupport.h" #include "qrunner.h" #include "Viewer.h" #include "soundconf.h" #include "htmlstrings.h" # include "xmlrpc.h" #if BENCHMARK_MODE # include "benchmark.h" #endif #include "debug.h" #include "re.h" #include "network.h" #include "spot.h" #include "dxcc.h" #include "locator.h" #include "notify.h" #include "logbook.h" #include "rx_extract.h" #include "speak.h" #include "flmisc.h" #include "arq_io.h" #include "data_io.h" #include "kmlserver.h" #include "notifydialog.h" #include "macroedit.h" #include "rx_extract.h" #include "wefax-pic.h" #include "charsetdistiller.h" #include "charsetlist.h" #include "outputencoder.h" #include "record_loader.h" #include "record_browse.h" #include "fileselect.h" #include "script_parsing.h" #include "run_script.h" pthread_mutex_t mutex_script_io = PTHREAD_MUTEX_INITIALIZER; extern std::string ScriptsDir; void script_execute(void *); static void script_execute(const char *filename, bool queue_flag); /** ******************************************************** * \brief Template for assigning bool values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_bool(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, bool &data) { if(!sp || !sc) return script_function_parameter_error; bool value = 0; int error = sp->check_bool(sc->args[0], value); if(error != script_no_errors) return error; if(!widget) return script_no_errors; widget->value(value); widget->do_callback(); data = value; return script_no_errors; } /** ******************************************************** * \brief Template for assigning bool values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_bool(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool data = false; return assign_bool(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning integer values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_integer(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, int &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; int value = 0; int cnt = sscanf(str_data.c_str(), "%d", &value); if(cnt < 1) return script_invalid_parameter; if(!widget) return script_no_errors; int min = (int) widget->minimum(); int max = (int) widget->maximum(); if((value < min) || (value > max)) return script_invalid_parameter; widget->value(value); widget->do_callback(); data = value; return script_no_errors; } /** ******************************************************** * \brief Template for assigning integer values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_integer(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int data = 0.0; return assign_integer(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning double values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_double(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, double &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; double value = 0; int cnt = sscanf(str_data.c_str(), "%lf", &value); if(cnt < 1) return script_invalid_parameter; if(!widget) return script_no_errors; double min = (double) widget->minimum(); double max = (double) widget->maximum(); if((value < min) || (value > max)) return script_invalid_parameter; widget->value(value); widget->do_callback(); data = value; return script_no_errors; } /** ******************************************************** * \brief Template for assigning double values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_double(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { double data = 0.0; return assign_double(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning string values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_string(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, std::string &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!widget) return script_no_errors; widget->value(str_data.c_str()); widget->do_callback(); data.assign(str_data); return script_no_errors; } /** ******************************************************** * \brief Template for assigning string values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_string(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { std::string data = ""; return assign_string(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning index values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_index(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, int &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!widget) return script_no_errors; int index = widget->find_index(str_data.c_str()); if(index < 0) return script_invalid_parameter; widget->index(index); widget->do_callback(); data = index; return script_no_errors; } /** ******************************************************** * \brief Template for assigning index values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_index(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int data = 0; return assign_index(widget, sp, sc, data); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_notify(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidNotifyOnly, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_search_bp(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidWideSearch, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_mark_prev(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidMark, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_detector(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidAutoDisable, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_alert_dialog(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidShowAlert, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_tx_freq_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRetainFreqLock, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_freq_change(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkDisableFreqChange, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_allow_errors(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(listbox_rsid_errors, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_sql_open(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(sldrRSIDsquelch, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_pretone(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_double(val_pretone, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_char_per_row(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(sldrVideowidth, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_end_xmt_id(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btn_post_rsid, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_tx_id_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnsendid, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_tx_vid_txt(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnsendvideotext, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_txt_input(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(valVideotext, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_small_font(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkID_SMALL, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_500hz(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btn_vidlimit, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_width_limit(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btn_vidmodelimit, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cw_callsign(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnCWID, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cw_speed(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(sldrCWIDwpm, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_state(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkAutoExtract, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_open_flmsg(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chk_open_flmsg, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_open_msg(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chk_open_wrap_folder, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_open_brwsr(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chk_open_flmsg_print, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_flmsg_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(txt_flmsg_pathname, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_timeout(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(sldr_extract_timeout, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rig_freq(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!qsoFreqDisp) return script_no_errors; double value = 0; double max = (double) qsoFreqDisp->maximum(); int cnt = sscanf(str_data.c_str(), "%lf", &value); if(cnt < 1 || value < 0.0 || value > max) return script_invalid_parameter; qsy((long int) value, active_modem ? active_modem->get_freq() : 1500); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rig_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(qso_opMODE, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_wf_hz_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!cntrWfwidth) return script_no_errors; int value = 0; int cnt = sscanf(str_data.c_str(), "%d", &value); int min = 0; int max = cntrWfwidth->maximum(); if(cnt < 1 || value < min || value > max) return script_invalid_parameter; active_modem->set_freq(value); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRSID, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_tx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnTxRSID, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_spot(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnAutoSpot, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rev(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!wf) return script_no_errors; return assign_bool(wf->btnRev, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_afc(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnAFC, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!wf) return script_no_errors; return assign_bool(wf->xmtlock, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_sql(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnSQL, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_kpsql(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnPSQL, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) **********************************************************/ int process_modem(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; bool modem_found = false; int index = 0; std::string value; value.assign(sc->args[0]); if(value.empty()) return script_parameter_error; sp->to_uppercase(value); for(index = 0; index < NUM_MODES; index++) { if(strncmp(value.c_str(), mode_info[index].sname, 32) == 0) { modem_found = true; break; } } if(modem_found == false) return script_invalid_parameter; if((data_io_enabled == KISS_IO) && (!(mode_info[index].iface_io & KISS_IO))) { LOG_INFO(_("Invalid Modem for KISS IO")); return script_invalid_parameter; } REQ_SYNC(init_modem_sync, index, 0); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtKiss_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtKiss_ip_address->value(), 32) != 0) { txtKiss_ip_address->value(str_data.c_str()); txtKiss_ip_address->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtKiss_ip_io_port_no) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtKiss_ip_io_port_no->value(), 32) != 0) { txtKiss_ip_io_port_no->value(str_data.c_str()); txtKiss_ip_io_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_o_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtKiss_ip_out_port_no) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtKiss_ip_out_port_no->value(), 32) != 0) { txtKiss_ip_out_port_no->value(str_data.c_str()); txtKiss_ip_out_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_dual_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnable_dual_port, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_busy_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnableBusyChannel, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_continue_after(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntBusyChannelSeconds, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_kpsql_atten(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntKPSQLAttenuation, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_arq_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtArq_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtArq_ip_address->value(), 32) != 0) { txtArq_ip_address->value(str_data.c_str()); txtArq_ip_address->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_arq_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtArq_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtArq_ip_port_no->value(), 32) != 0) { txtArq_ip_port_no->value(str_data.c_str()); txtArq_ip_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_xmlrpc_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtXmlrpc_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtXmlrpc_ip_address->value(), 32) != 0) { txtXmlrpc_ip_address->value(str_data.c_str()); txtXmlrpc_ip_address->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_xmlrpc_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtXmlrpc_ip_port_no) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtXmlrpc_ip_port_no->value(), 32) != 0) { txtXmlrpc_ip_port_no->value(str_data.c_str()); txtXmlrpc_ip_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnDisable_p2p_io_widgets, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_active_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string value; value.assign(sc->args[0]); if(value.empty()) return script_parameter_error; sp->to_uppercase(value); if(!btnEnable_kiss || !btnEnable_arq) return script_no_errors; if(value.find(PARM_KISS) != std::string::npos) { enable_kiss(); } else if(value.find(PARM_ARQ) != std::string::npos) { enable_arq(); } else { return script_invalid_parameter; } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_ax25_decode(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnable_ax25_decode, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_csma(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnable_csma, sp, sc); } /** ******************************************************** * \brief Assign Call Sign. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) * \par Note: * This string storage can be assigned to anything. User * should follow the limitations imposed by the rules * of the host country. ***********************************************************/ int process_callsign_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyCallsign, sp, sc); } /** ******************************************************** * \brief Operator Name * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_name_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyName, sp, sc); } /** ******************************************************** * \brief QTH Location of Operator * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_qth_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyQth, sp, sc); } /** ******************************************************** * \brief Assign Locator * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_locator_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyLocator, sp, sc); } /** ******************************************************** * \brief Assign Antenna information * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_antenna_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyAntenna, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_oss_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_OSS return assign_bool(btnAudioIO[0], sp, sc); #else return script_no_errors; #endif // USE_OSS } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_oss_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx #if USE_OSS if(!sp || !sc) return script_function_parameter_error; std::string str_data; std::string valid_data; str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!menuOSSDev) return script_no_errors; if(sp->check_dev_path(str_data.c_str())) return script_device_path_not_found; int index = 0; bool found = false; int count = menuOSSDev->menubutton()->size(); for (index = 0; index < count; index++ ) { const Fl_Menu_Item &item = menuOSSDev->menubutton()->menu()[index]; valid_data.assign(item.label()); if(!valid_data.empty()) { if(strncmp(valid_data.c_str(), str_data.c_str(), FL_PATH_MAX) == 0) { found = true; break; } } } if(!found) return script_invalid_parameter; menuOSSDev->value(index); menuOSSDev->do_callback(); return script_no_errors; #else return script_no_errors; #endif // USE_OSS } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_port_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_PORTAUDIO return assign_bool(btnAudioIO[1], sp, sc); #else return script_no_errors; #endif // USE_PORTAUDIO } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_capture_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx #if USE_PORTAUDIO if(!sp || !sc) return script_function_parameter_error; int value = 0; std::string str_data = ""; if(sc->argc < 2) return script_invalid_parameter; int cnt = sscanf(sc->args[0], "%d", &value); if(cnt < 1 || value < 0) return script_invalid_parameter; str_data.assign(sc->args[1]); if(str_data.empty()) return script_invalid_parameter; if(!menuPortInDev) return script_no_errors; cnt = pa_set_dev(menuPortInDev, str_data, value); if(cnt == PA_DEV_NOT_FOUND) return script_invalid_parameter; #endif // USE_PORTAUDIO return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_playback_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx #if USE_PORTAUDIO if(!sp || !sc) return script_function_parameter_error; int value = 0; std::string str_data = ""; if(sc->argc < 2) return script_invalid_parameter; int cnt = sscanf(sc->args[0], "%d", &value); if(cnt < 1 || value < 0) return script_invalid_parameter; str_data.assign(sc->args[1]); if(str_data.empty()) return script_invalid_parameter; if(!menuPortOutDev) return script_no_errors; cnt = pa_set_dev(menuPortOutDev, str_data, value); if(cnt == PA_DEV_NOT_FOUND) return script_invalid_parameter; #endif return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_pulse_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_PULSEAUDIO return assign_bool(btnAudioIO[2], sp, sc); #else return script_no_errors; #endif // USE_PULSEAUDIO } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_pulse_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_PULSEAUDIO return assign_string(inpPulseServer, sp, sc); #else return script_no_errors; #endif // USE_PULSEAUDIO } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_audio_device_sample_rate_capture(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!menuInSampleRate) return script_no_errors; int index = menuInSampleRate->find_index(str_data.c_str()); if(index < 0) { str_data.append(" (native)"); index = menuInSampleRate->find_index(str_data.c_str()); } if(index < 0) return script_invalid_parameter; menuInSampleRate->index(index); menuInSampleRate->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_audio_device_sample_rate_playback(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!menuOutSampleRate) return script_no_errors; int index = menuOutSampleRate->find_index(str_data.c_str()); if(index < 0) { str_data.append(" (native)"); index = menuOutSampleRate->find_index(str_data.c_str()); } if(index < 0) return script_invalid_parameter; menuOutSampleRate->index(index); menuOutSampleRate->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_audio_device_converter(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data; std::string append_string; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; append_string.assign(" Sinc Interpolator"); if(str_data.find(append_string) != std::string::npos) append_string.clear(); if(append_string.empty()) { append_string.assign(" Interpolator"); if(str_data.find(append_string) != std::string::npos) { append_string.clear(); } } str_data.append(append_string); if(!menuSampleConverter) return script_no_errors; int index = menuSampleConverter->find_index(str_data.c_str()); if(index < 0) return script_invalid_parameter; menuSampleConverter->index(index); menuSampleConverter->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntRxRateCorr, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_tx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntTxRateCorr, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_tx_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntTxOffset, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_modem_signal_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkAudioStereoOut, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_reverse_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkReverseAudio, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_ptt_tone_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnPTTrightchannel2, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cw_qsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnQSK2, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_pseudo_fsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkPseudoFSK2, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_wave_file_sample_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; char buffer[32]; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; int value = 0; int cnt = sscanf(str_data.c_str(), "%d", &value); if(cnt < 1) return script_invalid_parameter; if((value < 8000) || (value > 48000)) return script_invalid_parameter; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer) - 1, "%d", value); if(!listbox_wav_samplerate) return script_no_errors; int index = listbox_wav_samplerate->find_index(buffer); if(index < 0) return script_invalid_parameter; listbox_wav_samplerate->index(index); listbox_wav_samplerate->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_right_audio_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnPTTrightchannel, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnTTYptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) * \par NOTE: * Fl_ComboBox (custom widget) * find_index() located in combo.cxx and used here returns -1 * on non-matching. ***********************************************************/ int process_hrdw_ptt_sep_serial_port_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(inpTTYdev, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_rts(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRTSptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_dtr(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnDTRptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_rts_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRTSplusV, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_dtr_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnDTRplusV, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_start_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntPTT_on_delay, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_end_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntPTT_off_delay, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_uhrouter(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if HAVE_UHROUTER return assign_bool(btnUseUHrouterPTT, sp, sc); #else return script_no_errors; #endif // HAVE_UHROUTER } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_parallel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnUsePPortPTT, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!btnInitHWPTT) return script_no_errors; btnInitHWPTT->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_rigcat(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkUSERIGCAT, sp, sc); } extern void loadRigXmlFile(void); /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_desc_file(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(str_data.find(DEFAULT_RIGXML_FILENAME) != std::string::npos) return script_no_errors; if(sp->check_filename((char *) str_data.c_str())) return script_file_not_found; if(!txtXmlRigFilename) return script_no_errors; progdefaults.XmlRigFilename.assign(str_data); txtXmlRigFilename->value(fl_filename_name(progdefaults.XmlRigFilename.c_str())); loadRigXmlFile(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(inpXmlRigDevice, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatRetries, sp, sc, value); if(!error && cntRigCatRetries) { progdefaults.RigCatRetries = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatTimeout, sp, sc, value); if(!error && cntRigCatTimeout) { progdefaults.RigCatTimeout = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatWait, sp, sc, value); if(!error && cntRigCatWait) { progdefaults.RigCatTimeout = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_init_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatInitDelay, sp, sc, value); if(!error && cntRigCatInitDelay) { progdefaults.RigCatInitDelay = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int index = 0; int error = assign_index(listbox_xml_rig_baudrate, sp, sc, index); if(!error && listbox_xml_rig_baudrate) { progdefaults.XmlRigBaudrate = index; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_cat_command_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRigCatCMDptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(valRigCatStopbits, sp, sc, value); if(!error && valRigCatStopbits) { progdefaults.RigCatStopbits = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_commands_echoed(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatEcho, sp, sc, value); if(!error && btnRigCatEcho) { progdefaults.RigCatECHO = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_toggle_rts_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatRTSptt, sp, sc, value); if(!error && btnRigCatRTSptt) { progdefaults.RigCatRTSptt = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_restore_on_close(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(chk_restore_tio, sp, sc, value); if(!error && chk_restore_tio) { progdefaults.RigCatRestoreTIO = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_rts_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatRTSplus, sp, sc, value); if(!error && btnRigCatRTSplus) { progdefaults.RigCatRTSplus = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_dtr_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatDTRplus, sp, sc, value); if(!error && btnRigCatDTRplus) { progdefaults.RigCatDTRplus = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_hrdwr_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(chkRigCatRTSCTSflow, sp, sc, value); if(!error && chkRigCatRTSCTSflow) { progdefaults.RigCatRTSCTSflow = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_vsp_enable(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(chkRigCatVSP, sp, sc, value); if(!error && chkRigCatVSP) { progdefaults.RigCatVSP = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!btnInitRIGCAT) return script_no_errors; btnInitRIGCAT->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_hamlib(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB return assign_bool(chkUSEHAMLIB, sp, sc); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_rig(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB return assign_index(cboHamlibRig, sp, sc); #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibRetries, sp, sc, value); if(!error && cntHamlibRetries) { progdefaults.HamlibRetries = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibTimeout, sp, sc, value); if(!error && cntHamlibTimeout) { progdefaults.HamlibTimeout = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibWriteDelay, sp, sc, value); if(!error && cntHamlibWriteDelay) { progdefaults.HamlibWriteDelay = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_post_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibWait, sp, sc, value); if(!error && cntHamlibWait) { progdefaults.HamlibWait = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) * \par Note: * This string storage can be assigned to anything. User * should follow the limitations imposed by the rules * of the host country. ***********************************************************/ int process_hamlib_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!inpRIGdev) return script_no_errors; int index = inpRIGdev->find_index(str_data.c_str()); if(index < 0) return script_invalid_parameter; progdefaults.HamRigDevice.assign(str_data); progdefaults.changed = true; inpRIGdev->value(str_data.c_str()); inpRIGdev->do_callback(); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int index = 0; int error = assign_index(listbox_baudrate, sp, sc, index); if(!error && listbox_baudrate) { progdefaults.HamRigBaudrate = index; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(valHamRigStopbits, sp, sc, value); if(!error && valHamRigStopbits) { progdefaults.HamRigStopbits = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_poll_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(valHamRigPollrate, sp, sc, value); if(!error && valHamRigPollrate) { progdefaults.HamRigPollrate = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_sideband(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int index = 0; int error = assign_index(listbox_sideband, sp, sc, index); if(!error && listbox_sideband) { progdefaults.HamlibSideband = index; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_ptt_hl_command(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(btnHamlibCMDptt, sp, sc, value); if(!error && btnHamlibCMDptt) { progdefaults.HamlibCMDptt = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_dtr_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(btnHamlibDTRplus, sp, sc, value); if(!error && btnHamlibDTRplus) { progdefaults.HamlibDTRplus = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_rts_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; bool value = 0; int error = sp->check_bool(sc->args[0], value); if(error != script_no_errors) return error; if(!chkHamlibRTSCTSflow || !chkHamlibRTSplus) return script_no_errors; if(chkHamlibRTSCTSflow->value()) value = false; progdefaults.HamlibRTSplus = value; progdefaults.changed = true; chkHamlibRTSplus->value(value); chkHamlibRTSplus->do_callback(); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_rts_cts_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(chkHamlibRTSCTSflow, sp, sc, value); if(!error && chkHamlibRTSCTSflow) { progdefaults.HamlibRTSCTSflow = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_xon_xoff_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(chkHamlibXONXOFFflow, sp, sc, value); if(!error && chkHamlibXONXOFFflow) { progdefaults.HamlibXONXOFFflow = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_advanced_config(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB std::string value = ""; int error = assign_string(inpHamlibConfig, sp, sc, value); if(!error && inpHamlibConfig) { progdefaults.HamConfig.assign(value); progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief Initialize HAMLIB Parameters * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB if(!btnInitHAMLIB) return script_no_errors; btnInitHAMLIB->do_callback(); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief Assign Macro information to there respective * macro button. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_load_macro(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string macro_data = sp->macro_command(); std::string macro_label = ""; int col = 0; int row = 0; int index = 0; if(sc->argc < 3) return script_invalid_parameter; if((!sc->args[0]) || (!sc->args[1]) || (!sc->args[2])) return script_invalid_parameter; index = sscanf(sc->args[0], "%d", &col); if(index < 1) return script_invalid_parameter; index = sscanf(sc->args[1], "%d", &row); if(index < 1) return script_invalid_parameter; macro_label.assign(sc->args[2]); if(macro_label.empty()) return script_invalid_parameter; if(col > 0) col--; if(row > 0) row--; index = (col * NUMMACKEYS) + row; if((index < 0) || (index > MAXMACROS)) return script_invalid_parameter; if((col == 0) || ((col == altMacros) && (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX))) { update_macro_button(index, macro_data.c_str(), macro_label.c_str()); } else { macros.text[index].assign(macro_data); macros.name[index].assign(macro_label); } return script_no_errors; } /** ******************************************************** * \brief Reset Configuration panel attributes * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_reset(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return script_no_errors; } /** ******************************************************** * \brief Pass script file name to script passing class * for execution. * Called from the File->Execute Config Script menu item. * \param void ***********************************************************/ static void script_execute(const char *filename, bool queue_flag) { ScriptParsing *sp = 0; static std::string script_filename = ""; if(!filename) { LOG_INFO(_("Script file name (path) null pointer")); return; } script_filename.assign(filename); if(script_filename.empty()) { LOG_INFO(_("Script file name (path) invalid")); return; } sp = new ScriptParsing; if(!sp) { LOG_INFO(_("Script Parsing Class Allocation Fail (%s)"), script_filename.c_str()); return; } LOG_INFO(_("Executing script file: %s"), script_filename.c_str()); sp->parse_commands((char *) script_filename.c_str()); if(sp->script_errors()) { LOG_INFO(_("Issues reported in processing script file: %s"), script_filename.c_str()); fl_alert("%s", _("Script file contains potential issues\nSee documentation and/or Log file for details.")); } if(sp->restart_flag()) { fl_alert("%s", _("Some changes made by the script requires program\nrestart before they become active.")); } if(sp) delete sp; } /** ******************************************************** * \brief Call back function when executing a configuration script. * Called from the File->Execute Config Script menu item. * \param void ***********************************************************/ void cb_scripts(bool reset_path = false) { pthread_mutex_lock(&mutex_script_io); static bool first_time = true; static char script_filename[FL_PATH_MAX + 1]; std::string new_path = ""; if(reset_path || first_time) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, ScriptsDir.c_str(), FL_PATH_MAX); int len = strnlen(script_filename, FL_PATH_MAX); if(len > 0) { len--; if(script_filename[len] == PATH_CHAR_SEPERATOR); else strncat(script_filename, PATH_SEPERATOR, FL_PATH_MAX); } else { return; } first_time = false; } const char *p = FSEL::select((char *)_("Script Files"), (char *)_("*.txt"), \ script_filename); if(p) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, p, FL_PATH_MAX); Fl::lock(); script_execute(script_filename, false); Fl::unlock(); } pthread_mutex_unlock(&mutex_script_io); } fldigi-4.1.06/src/config_script/run_script.h0000664000175000017500000002450513507402064015753 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2015 // Robert Stiles // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _run_script_h #define _run_script_h extern int process_callsign_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_name_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_qth_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_locator_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_antenna_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_oss_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_oss_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_port_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_capture_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_playback_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_pulse_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_pulse_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_audio_device_sample_rate_capture(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_audio_device_sample_rate_playback(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_audio_device_converter(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_tx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_tx_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_modem_signal_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_reverse_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_ptt_tone_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cw_qsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_pseudo_fsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_wave_file_sample_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_right_audio_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_rts(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_dtr(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_rts_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_dtr_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_start_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_end_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_uhrouter(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_rigcat(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_desc_file(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_init_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_commands_echoed(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_toggle_rts_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_restore_on_close(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_cat_command_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_dtr_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_rts_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_hrdwr_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_vsp_enable(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_hamlib(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_rig(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_post_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_sideband(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_ptt_hl_command(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_dtr_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_rts_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_rts_cts_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_xon_xoff_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_advanced_config(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_o_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_dual_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_busy_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_continue_after(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_kpsql_atten(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_arq_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_arq_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_xmlrpc_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_xmlrpc_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_active_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_ax25_decode(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_csma(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_state(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_open_flmsg(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_open_msg(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_open_brwsr(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_flmsg_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_timeout(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_notify(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_search_bp(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_mark_prev(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_detector(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_alert_dialog(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_tx_freq_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_freq_change(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_allow_errors(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_sql_open(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_pretone(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_end_xmt_id(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_tx_id_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_tx_vid_txt(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_txt_input(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_small_font(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_500hz(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_width_limit(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_char_per_row(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cw_callsign(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cw_speed(ScriptParsing *sp, SCRIPT_COMMANDS *sc); // FLDIGI main windows widgets extern int process_rig_freq(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rig_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_wf_hz_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_tx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_spot(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rev(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_afc(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_sql(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_kpsql(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_modem(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_load_macro(ScriptParsing *sp, SCRIPT_COMMANDS *sc); #endif fldigi-4.1.06/src/config_script/create_default_script.cxx0000664000175000017500000007301313507402064020467 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2015 // Robert Stiles // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include #ifdef __WOE32__ # ifdef __CYGWIN__ # include # else # include # endif #endif #include #include #include #include #include #include #ifndef __WOE32__ #include #endif #include "gettext.h" #include "fl_digi.h" #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include "waterfall.h" #include "raster.h" #include "progress.h" #include "Panel.h" #include "main.h" #include "threads.h" #include "trx.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "timeops.h" #include "rigio.h" #include "nullmodem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "mt63.h" #include "view_rtty.h" #include "olivia.h" #include "contestia.h" #include "thor.h" #include "dominoex.h" #include "feld.h" #include "throb.h" //#include "pkt.h" #include "wwv.h" #include "analysis.h" #include "ssb.h" #include "smeter.h" #include "pwrmeter.h" #include "ascii.h" #include "globals.h" #include "misc.h" #include "FTextRXTX.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "macros.h" #include "macroedit.h" #include "logger.h" #include "lookupcall.h" #include "font_browser.h" #include "icons.h" #include "pixmaps.h" #include "rigsupport.h" #include "qrunner.h" #include "Viewer.h" #include "soundconf.h" #include "htmlstrings.h" # include "xmlrpc.h" #if BENCHMARK_MODE # include "benchmark.h" #endif #include "debug.h" #include "re.h" #include "network.h" #include "spot.h" #include "dxcc.h" #include "locator.h" #include "notify.h" #include "logbook.h" #include "rx_extract.h" #include "speak.h" #include "flmisc.h" #include "arq_io.h" #include "data_io.h" #include "kmlserver.h" #include "notifydialog.h" #include "macroedit.h" #include "rx_extract.h" #include "wefax-pic.h" #include "charsetdistiller.h" #include "charsetlist.h" #include "outputencoder.h" #include "record_loader.h" #include "record_browse.h" #include "fileselect.h" #include "waterfall.h" #include "util.h" #include "script_parsing.h" #include "run_script.h" void cb_create_default_script(void); static int create_default_script(char *file_name); static int add_command(FILE *fd, char *cmd, int param, int indent_level); static int add_command(FILE *fd, char *cmd, char * param, int indent_level); static int add_command(FILE *fd, char *cmd, int indent_level); static int add_command(FILE *fd, char *cmd, bool param, int indent_level); static int add_command(FILE *fd, char *cmd, double param, int indent_level); static int add_string(FILE *fd, char *cmd, int indent_level); static void write_macro_list(FILE *fd); extern pthread_mutex_t mutex_script_io; /** ******************************************************** * \brief Menu callback. Create default script based on the * current settings. * \param none * \return void ***********************************************************/ void cb_create_default_script(void) { pthread_mutex_lock(&mutex_script_io); static bool first_time = true; static char script_filename[FL_PATH_MAX + 1]; std::string new_path = ""; if(first_time) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, ScriptsDir.c_str(), FL_PATH_MAX); int len = strnlen(script_filename, FL_PATH_MAX); if(len > 0) { len--; if(script_filename[len] == PATH_CHAR_SEPERATOR); else strncat(script_filename, PATH_SEPERATOR, FL_PATH_MAX); } else { return; } strncat(script_filename, "default_script.txt", FL_PATH_MAX); first_time = false; } const char *p = FSEL::saveas((char *)_("Script Files"), (char *)_("*.txt"), \ script_filename); if(p) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, p, FL_PATH_MAX); Fl::lock(); create_default_script(script_filename); Fl::unlock(); } pthread_mutex_unlock(&mutex_script_io); } /** ******************************************************** * \brief Create default script based on current settings. * \param file_name Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int create_default_script(char *file_name) { FILE *fd = (FILE *)0; static char buffer[FL_PATH_MAX]; std::string temp = ""; if(!file_name) { LOG_INFO(_("Invalid File Name Pointer (NULL) in function %s:%d"), __FILE__, __LINE__); return -1; } fd = fl_fopen(file_name, "w"); if(!fd) { LOG_INFO(_("Unable to create file %s (Error No=%d) func %s:%d"), file_name, errno, __FILE__, __LINE__); return -1; } memset(buffer, 0, sizeof(buffer)); // Tag the text file as a FLDIGI script file fprintf(fd, _("%s\n# Fldigi Generated Config Script\n"), SCRIPT_FILE_TAG); time_t thetime = time(0); fprintf(fd, _("# Created: %s\n"), ctime(&thetime)); // FLDIGI Main Window if(add_command(fd, (char *)CMD_FLDIGI, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_FREQ, (double) qsoFreqDisp->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_MODE, (char *) qso_opMODE->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_WFHZ, (int) wf->Carrier(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_RXID, (bool) btnRSID->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_TXID, (bool) btnTxRSID->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_SPOT, (bool) btnAutoSpot->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_REV, (bool) wf->btnRev->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_AFC, (bool) btnAFC->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_LOCK, (bool) wf->xmtlock->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_SQL, (bool) btnSQL->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_KPSQL, (bool) btnPSQL->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_MODEM, (char *) active_modem->get_mode_name(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // OPERATOR if(add_command(fd, (char *)CMD_OPERATOR, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_CALLSIGN, (char *) inpMyCallsign->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_QTH, (char *) inpMyName->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NAME, (char *) inpMyQth->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_LOCATOR, (char *) inpMyLocator->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ANTENNA, (char *) inpMyAntenna->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO DEVICE if(add_command(fd, (char *)CMD_AUDIO_DEVICE, 0)) return fclose(fd); #if USE_OSS // OSS if(add_command(fd, (char *)CMD_OSS_AUDIO, (bool) btnAudioIO[0]->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_OSS_AUDIO_DEV_PATH, (char *) menuOSSDev->value(), 1)) return fclose(fd); #endif // USE_OSS #if USE_PORTAUDIO // PORT AUDIO if(add_command(fd, (char *)CMD_PORT_AUDIO, (bool) btnAudioIO[1]->value(), 1)) return fclose(fd); if(menuPortInDev->value() > -1) { memset(buffer, 0, sizeof(buffer)); // Invalid warning issued (clang-600.0.56 [3.5] MacOSX) if index is replaced with reinterpret_cast(x) in snprintf() routine. int index = reinterpret_cast(menuPortInDev->mvalue()->user_data()); snprintf(buffer, sizeof(buffer)-1, "%s:%d,\"%s\"", CMD_PORTA_CAP, index, menuPortInDev->text()); if(add_string(fd, (char *)buffer, 1)) return fclose(fd); } if(menuPortOutDev->value() > -1) { memset(buffer, 0, sizeof(buffer)); // Invalid warning issued (clang-600.0.56 [3.5] MacOSX) if index is replaced with reinterpret_cast(x) in snprintf() routine. int index = reinterpret_cast(menuPortOutDev->mvalue()->user_data()); snprintf(buffer, sizeof(buffer)-1, "%s:%d,\"%s\"", CMD_PORTA_PLAY, index, menuPortOutDev->text()); if(add_string(fd, (char *)buffer, 1)) return fclose(fd); } #endif // USE_PORTAUDIO #if USE_PULSEAUDIO // PULSE AUDIO if(add_command(fd, (char *)CMD_PULSEA, (bool) btnAudioIO[2]->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PULSEA_SERVER, (char *) inpPulseServer->value(), 1)) return fclose(fd); #endif // USE_PULSEAUDIO if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO SETTINGS if(add_command(fd, (char *)CMD_AUDIO_SETTINGS, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_CAPTURE_SAMPLE_RATE, (char *) menuInSampleRate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PLAYBACK_SAMPLE_RATE, (char *) menuOutSampleRate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_AUDIO_CONVERTER, (char *) menuSampleConverter->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RX_PPM, (int) cntRxRateCorr->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_TX_PPM, (int) cntTxRateCorr->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_TX_OFFSET, (int) cntTxOffset->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO RIGHT CHANNEL if(add_command(fd, (char *)CMD_AUDIO_RT_CHANNEL, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_AUDIO_L_R, (bool) chkAudioStereoOut->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_AUDIO_REV_L_R, (bool) chkReverseAudio->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PTT_RIGHT_CHAN, (bool) btnPTTrightchannel2->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_CW_QSK_RT_CHAN, (bool) btnQSK2->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PSEUDO_FSK_RT_CHAN, (bool) chkPseudoFSK2->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO WAVE if(add_command(fd, (char *)CMD_AUDIO_WAVE, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_WAVE_SR, (char *) listbox_wav_samplerate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // RIG HRDWR PTT if(add_command(fd, (char *)CMD_HRDWR_PTT, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_HPPT_PTT_RT, (bool) btnPTTrightchannel->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2, (bool) btnTTYptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2_PATH, (char *) inpTTYdev->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2_RTS, (bool) btnRTSptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2_RTS_V, (bool) btnRTSplusV->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2_DTR, (bool) btnDTRptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2_DTR_V, (bool) btnDTRplusV->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_PARALLEL, (bool) btnUsePPortPTT->value(), 1)) return fclose(fd); #if HAVE_UHROUTER if(add_command(fd, (char *)CMD_HPTT_UHROUTER, (bool) btnUseUHrouterPTT->value(), 1)) return fclose(fd); #endif if(add_command(fd, (char *)CMD_HPTT_SP2_START_DELAY, (int) cntPTT_on_delay->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2_END_DELAY, (int) cntPTT_off_delay->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HPTT_SP2_INITIALIZE, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // RIG CAT if(add_command(fd, (char *)CMD_RIGCAT, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_STATE, (bool) chkUSERIGCAT->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_DEV_PATH, (char *) inpXmlRigDevice->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_DESC_FILE, (char *) progdefaults.XmlRigFilename.c_str(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RETRIES, (int) cntRigCatRetries->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RETRY_INTERVAL, (int) cntRigCatTimeout->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_WRITE_DELAY, (int) cntRigCatWait->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_INTIAL_DELAY, (int) cntRigCatInitDelay->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_BAUD_RATE, (char *) listbox_xml_rig_baudrate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_STOP_BITS, (int) valRigCatStopbits->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_ECHO, (bool) btnRigCatEcho->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_TOGGLE_RTS_PTT, (bool) btnRigCatRTSptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RESTORE, (bool) chk_restore_tio->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_PTT_COMMAND, (bool) btnRigCatCMDptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_TOGGLE_DTR_PTT, (bool) btnRigCatDTRptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_TOGGLE_RTS_PTT, (bool) btnRigCatRTSptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RTS_12V, (bool) btnRigCatRTSplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_DTR_12V, (bool) btnRigCatDTRplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_HRDWR_FLOW, (bool) chkRigCatRTSCTSflow->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_VSP, (bool) chkRigCatVSP->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_INITIALIZE, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); #if USE_HAMLIB // HAMLIB if(add_command(fd, (char *)CMD_HAMLIB, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_STATE, (bool) chkUSEHAMLIB->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RIG, (char *) cboHamlibRig->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_DEV_PATH, (char *) inpRIGdev->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RETRIES, (int) cntHamlibRetries->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RETRY_INTERVAL, (int) cntHamlibTimeout->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_WRITE_DELAY, (int) cntHamlibWriteDelay->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_POST_WRITE_DELAY, (int) cntHamlibWait->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_BAUD_RATE, (char *) listbox_baudrate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_STOP_BITS, (int) valHamRigStopbits->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_POLL_RATE, (int) valHamRigPollrate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_SIDE_BAND, (char *) listbox_sideband->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_PTT_COMMAND, (bool) btnHamlibCMDptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_DTR_12V, (bool) btnHamlibDTRplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RTS_12V, (bool) btnHamlibDTRplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_HRDWR_FLOW, (bool) chkHamlibRTSCTSflow->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_SFTWR_FLOW, (bool) chkHamlibXONXOFFflow->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_ADV_CONFIG, (char *) inpHamlibConfig->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_INITIALIZE, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); #endif //#if USE_HAMLIB // IO Config Panel if(add_command(fd, (char *)CMD_IO, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_LOCK, (bool) btnDisable_p2p_io_widgets->value(), 1)) return fclose(fd); if(btnEnable_arq->value()) { if(add_command(fd, (char *)CMD_IO_ACT_PORT, (char *) PARM_ARQ, 1)) return fclose(fd); } else if(btnEnable_kiss->value()) { if(add_command(fd, (char *)CMD_IO_ACT_PORT, (char *) PARM_KISS, 1)) return fclose(fd); } if(add_command(fd, (char *)CMD_IO_AX25_DECODE, (bool) btnEnable_ax25_decode->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_CSMA, (bool) btnEnable_csma->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_IPA, (char *) txtKiss_ip_address->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_IOPN, (char *) txtKiss_ip_io_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_OPN, (char *) txtKiss_ip_out_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_DP, (bool) btnEnable_dual_port->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_BUSY, (bool) btnEnableBusyChannel->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_CONT, (int) cntBusyChannelSeconds->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_ATTEN, (int) cntKPSQLAttenuation->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_ARQ, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_ARQ_IPA, (char *) txtArq_ip_address->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_ARQ_IOPN, (char *) txtArq_ip_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_XMLRPC, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_XMLRPC_IPA, (char *) txtXmlrpc_ip_address->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_XMLRPC_IOPN, (char *) txtXmlrpc_ip_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // NBEMS if(add_command(fd, (char *)CMD_NBEMS, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_STATE, (bool) chkAutoExtract->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_MSG, (bool) chk_open_wrap_folder->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_FLMSG, (bool) chk_open_flmsg->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_FLMSG_PATH, (char *) txt_flmsg_pathname->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_BRWSR, (bool) chk_open_flmsg_print->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_TIMEOUT, (double) sldr_extract_timeout->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // ID/RSID/VIDEO/CW if(add_command(fd, (char *)CMD_ID, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_NOTIFY, (bool) chkRSidNotifyOnly->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_SRCH_BP, (bool) chkRSidWideSearch->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_MARK_PREV, (bool) chkRSidMark->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_DETECTOR, (bool) chkRSidAutoDisable->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_ALRT_DIALOG, (bool) chkRSidShowAlert->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_TX_FREQ_LOCK, (bool) chkRetainFreqLock->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_FREQ_CHANGE, (bool) chkDisableFreqChange->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_ALLOW_ERRORS, (char *) listbox_rsid_errors->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_SQL_OPEN, (int) sldrRSIDsquelch->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_PRETONE, (double) val_pretone->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_END_XMT_ID, (bool) btn_post_rsid->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_TX_ID_MODE, (bool) btnsendid->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_TX_VIDEO_TXT, (bool) btnsendvideotext->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_TX_TXT_INP, (char *) valVideotext->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_SMALL_FONT, (bool) chkID_SMALL->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_500_HZ, (bool) btn_vidlimit->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_WIDTH_LIMIT, (bool) btn_vidmodelimit->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_CHAR_ROW, (int) sldrVideowidth->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_CW, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_CW_TX_CALLSIGN, (bool) btnCWID->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_CW_SPEED, (int) sldrCWIDwpm->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // MACROS write_macro_list(fd); return fclose(fd); } /** ******************************************************** * \brief Write the current macro list in script format * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static void write_macro_list(FILE *fd) { if(!fd) return; int index = 0; int row = 0; int col = 0; bool save_flag = false; int count = 0; char * cPtr = (char *)0; for(index = 0; index < MAXMACROS; index++) { // Do not save empty macros count = macros.text[index].size(); if(count < 1) continue; cPtr = (char *) macros.text[index].c_str(); while(count-- > 0) { if(*cPtr++ > ' ') { save_flag = true; break; } } if(save_flag) { col = (index / NUMMACKEYS) + 1; row = (index % NUMMACKEYS) + 1; fprintf(fd, "\n%s:%d,%d,\"%s\"\n", (char *) CMD_LOAD_MACRO, col, row, macros.name[index].c_str()); fprintf(fd, "%s\n", macros.text[index].c_str()); fprintf(fd, "%s:\n",(char *) CMD_END_CMD); save_flag = false; } } } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, double param, int indent_level) { if(!fd || !cmd) return -1; char buffer[32]; memset(buffer, 0, sizeof(buffer)); if((param > -1000.0) && (param < 1000.0)) snprintf(buffer, sizeof(buffer) - 1, "%1.3f", param); else snprintf(buffer, sizeof(buffer) - 1, "%1.9e", param); return add_command(fd, cmd, buffer, indent_level); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, bool param, int indent_level) { if(!fd || !cmd) return -1; char buffer[32]; memset(buffer, 0, sizeof(buffer)); if(param) strncpy(buffer, PARM_ENABLE, sizeof(buffer)-1); else strncpy(buffer, PARM_DISABLE, sizeof(buffer)-1); return add_command(fd, cmd, buffer, indent_level); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, int param, int indent_level) { if(!fd || !cmd) return -1; char buffer[32]; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer) - 1, "%d", param); return add_command(fd, cmd, buffer, indent_level); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, char *param, int indent_level) { if(!fd || !cmd || !param) return -1; bool q_flag = false; int size = strnlen(param, FILENAME_MAX); if(size < 1) return 0; for(int i = 0; i < size; i++) { if(param[i] == 0) break; if((param[i] == ',') || (param[i] <= ' ')) { q_flag = true; } } std::string indent = ""; for(int i = 0; i < indent_level; i++) indent.append(" "); if(q_flag) fprintf(fd, "%s%s:\"%s\"\n", indent.c_str(), cmd, param); else fprintf(fd, "%s%s:%s\n", indent.c_str(), cmd, param); return ferror(fd); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, int indent_level) { if(!fd || !cmd) return -1; std::string indent = ""; for(int i = 0; i < indent_level; i++) indent.append(" "); fprintf(fd, "%s%s:\n", indent.c_str(), cmd); return ferror(fd); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_string(FILE *fd, char *cmd, int indent_level) { if(!fd || !cmd) return -1; std::string indent = ""; for(int i = 0; i < indent_level; i++) indent.append(" "); fprintf(fd, "%s%s\n", indent.c_str(), cmd); return ferror(fd); } fldigi-4.1.06/src/config_script/script_parsing.cxx0000664000175000017500000021661013507402064017165 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2015 // Robert Stiles // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "util.h" #include #include #include #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "script_parsing.h" #include "run_script.h" // Do not use directly. It's copied for each instance static const SCRIPT_COMMANDS default_operator_command_table[] = { { CMD_CALLSIGN, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_callsign_info, 0, 0}, { CMD_NAME, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_name_info, 0, 0}, { CMD_QTH, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_qth_info, 0, 0}, { CMD_LOCATOR, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_locator_info, 0, 0}, { CMD_ANTENNA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_antenna_info, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_device_command_table[] = { { CMD_OSS_AUDIO, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_oss_audio_device, 0, 0}, { CMD_OSS_AUDIO_DEV_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_oss_audio_device_path, 0, 0}, { CMD_PORT_AUDIO, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_port_audio_device, 0, 0}, { CMD_PORTA_CAP, SCRIPT_COMMAND, 0, 2, {0}, { p_int, p_dev_name }, 0, 0, 0, process_capture_path, 0, 0}, { CMD_PORTA_PLAY, SCRIPT_COMMAND, 0, 2, {0}, { p_int, p_dev_name }, 0, 0, 0, process_playback_path, 0, 0}, { CMD_PULSEA, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_pulse_audio_device, 0, 0}, { CMD_PULSEA_SERVER, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_pulse_audio_device_path, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_settings_command_table[] = { { CMD_CAPTURE_SAMPLE_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_audio_device_sample_rate_capture, 0, 0}, { CMD_PLAYBACK_SAMPLE_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_audio_device_sample_rate_playback, 0, 0}, { CMD_AUDIO_CONVERTER, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_audio_device_converter, 0, 0}, { CMD_RX_PPM, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rx_ppm, 0, 0}, { CMD_TX_PPM, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_tx_ppm, 0, 0}, { CMD_TX_OFFSET, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_tx_offset, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_rt_channel_command_table[] = { { CMD_AUDIO_L_R, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_modem_signal_left_right, 0, 0}, { CMD_AUDIO_REV_L_R, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_reverse_left_right, 0, 0}, { CMD_PTT_RIGHT_CHAN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_ptt_tone_right_channel, 0, 0}, { CMD_CW_QSK_RT_CHAN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_cw_qsk_right_channel, 0, 0}, { CMD_PSEUDO_FSK_RT_CHAN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_pseudo_fsk_right_channel, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_wave_command_table[] = { { CMD_WAVE_SR, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_wave_file_sample_rate, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_rig_hrdwr_ptt_command_table[] = { { CMD_HPPT_PTT_RT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_right_audio_channel, 0, 0}, { CMD_HPTT_SP2, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port, 0, 0}, { CMD_HPTT_SP2_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_path, 0, 0}, { CMD_HPTT_SP2_RTS, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_rts, 0, 0}, { CMD_HPTT_SP2_DTR, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_dtr, 0, 0}, { CMD_HPTT_SP2_RTS_V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_rts_v, 0, 0}, { CMD_HPTT_SP2_DTR_V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_dtr_v, 0, 0}, { CMD_HPTT_SP2_START_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hrdw_ptt_start_delay, 0, 0}, { CMD_HPTT_SP2_END_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hrdw_ptt_end_delay, 0, 0}, { CMD_HPTT_UHROUTER, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_uhrouter, 0, 0}, { CMD_HPTT_SP2_INITIALIZE, SCRIPT_COMMAND, 0, 0, {0}, { p_void }, 0, 0, 0, process_hrdw_ptt_initialize, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_rigcat_command_table[] = { { CMD_RIGCAT_STATE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_rigcat, 0, 0}, { CMD_RIGCAT_DESC_FILE, SCRIPT_COMMAND, 0, 1, {0}, { p_filename }, 0, 0, 0, process_rigcat_desc_file, 0, 0}, { CMD_RIGCAT_DEV_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_rigcat_device_path, 0, 0}, { CMD_RIGCAT_RETRIES, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_retries, 0, 0}, { CMD_RIGCAT_RETRY_INTERVAL, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_retry_interval, 0, 0}, { CMD_RIGCAT_WRITE_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_write_delay, 0, 0}, { CMD_RIGCAT_INTIAL_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_init_delay, 0, 0}, { CMD_RIGCAT_BAUD_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_rigcat_baud_rate, 0, 0}, { CMD_RIGCAT_STOP_BITS, SCRIPT_COMMAND, 0, 1, {0}, { p_float }, 0, 0, 0, process_rigcat_stop_bits, 0, 0}, { CMD_RIGCAT_ECHO, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_commands_echoed, 0, 0}, { CMD_RIGCAT_TOGGLE_RTS_PTT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_toggle_rts_ptt, 0, 0}, { CMD_RIGCAT_RESTORE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_restore_on_close, 0, 0}, { CMD_RIGCAT_PTT_COMMAND, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_cat_command_ptt, 0, 0}, { CMD_RIGCAT_RTS_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_rts_12v, 0, 0}, { CMD_RIGCAT_DTR_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_dtr_12v, 0, 0}, { CMD_RIGCAT_HRDWR_FLOW, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_hrdwr_flow, 0, 0}, { CMD_RIGCAT_VSP, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_vsp_enable, 0, 0}, { CMD_RIGCAT_INITIALIZE, SCRIPT_COMMAND, 0, 0, {0}, { p_void }, 0, 0, 0, process_rigcat_initialize, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_hamlib_command_table[] = { { CMD_HAMLIB_STATE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_hamlib, 0, 0}, { CMD_HAMLIB_RIG, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_name }, 0, 0, 0, process_hamlib_rig, 0, 0}, { CMD_HAMLIB_DEV_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_hamlib_device_path, 0, 0}, { CMD_HAMLIB_RETRIES, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_retries, 0, 0}, { CMD_HAMLIB_RETRY_INTERVAL, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_retry_interval, 0, 0}, { CMD_HAMLIB_WRITE_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_write_delay, 0, 0}, { CMD_HAMLIB_POST_WRITE_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_post_write_delay, 0, 0}, { CMD_HAMLIB_BAUD_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_baud_rate, 0, 0}, { CMD_HAMLIB_STOP_BITS, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_stop_bits, 0, 0}, { CMD_HAMLIB_SIDE_BAND, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_sideband, 0, 0}, { CMD_HAMLIB_PTT_COMMAND, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_ptt_hl_command, 0, 0}, { CMD_HAMLIB_DTR_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_dtr_12, 0, 0}, { CMD_HAMLIB_RTS_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_rts_12, 0, 0}, { CMD_HAMLIB_HRDWR_FLOW, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_rts_cts_flow, 0, 0}, { CMD_HAMLIB_SFTWR_FLOW, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_xon_xoff_flow, 0, 0}, { CMD_HAMLIB_ADV_CONFIG, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_advanced_config, 0, 0}, { CMD_HAMLIB_INITIALIZE, SCRIPT_COMMAND, 0, 0, {0}, { p_void }, 0, 0, 0, process_hamlib_initialize, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_kiss_command_table[] = { { CMD_IO_KISS_IPA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_kiss_ip_address, 0, 0}, { CMD_IO_KISS_IOPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_io_port_no, 0, 0}, { CMD_IO_KISS_OPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_o_port_no, 0, 0}, { CMD_IO_KISS_DP, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_kiss_dual_port, 0, 0}, { CMD_IO_KISS_BUSY, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_kiss_busy_channel, 0, 0}, { CMD_IO_KISS_CONT, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_continue_after, 0, 0}, { CMD_IO_KISS_ATTEN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_kpsql_atten, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_arq_command_table[] = { { CMD_IO_ARQ_IPA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_arq_ip_address, 0, 0}, { CMD_IO_ARQ_IOPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_arq_io_port_no, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_xmlrpc_command_table[] = { { CMD_IO_XMLRPC_IPA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_xmlrpc_ip_address, 0, 0}, { CMD_IO_XMLRPC_IOPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_xmlrpc_io_port_no, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_io_command_table[] = { { CMD_IO_LOCK, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_lock, 0, 0}, { CMD_IO_ACT_PORT, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_active_port, 0, 0}, { CMD_IO_AX25_DECODE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_ax25_decode, 0, 0}, { CMD_IO_CSMA, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_csma, 0, 0}, { CMD_IO_KISS, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_kiss_command_table, sizeof(default_kiss_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_IO_ARQ, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_arq_command_table, sizeof(default_arq_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_IO_XMLRPC, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_xmlrpc_command_table, sizeof(default_xmlrpc_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_fldigi_command_table[] = { { CMD_FLDIGI_FREQ, SCRIPT_COMMAND, 0, 1, {0}, { p_double }, 0, 0, 0, process_rig_freq, 0, 0}, { CMD_FLDIGI_MODE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_rig_mode, 0, 0}, { CMD_FLDIGI_WFHZ, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_wf_hz_offset, 0, 0}, { CMD_FLDIGI_RXID, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rx_rsid, 0, 0}, { CMD_FLDIGI_TXID, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_tx_rsid, 0, 0}, { CMD_FLDIGI_SPOT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_spot, 0, 0}, { CMD_FLDIGI_REV, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rev, 0, 0}, { CMD_FLDIGI_AFC, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_afc, 0, 0}, { CMD_FLDIGI_LOCK, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_lock, 0, 0}, { CMD_FLDIGI_SQL, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_sql, 0, 0}, { CMD_FLDIGI_KPSQL, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_kpsql, 0, 0}, { CMD_FLDIGI_KPSM, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_kpsql, 0, 0}, { CMD_FLDIGI_MODEM, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_modem, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_nbems_command_table[] = { { CMD_NBEMS_FLMSG_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_misc_nbems_flmsg_path, 0, 0}, { CMD_NBEMS_TIMEOUT, SCRIPT_COMMAND, 0, 1, {0}, { p_double }, 0, 0, 0, process_misc_nbems_timeout, 0, 0}, { CMD_NBEMS_STATE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_state, 0, 0}, { CMD_NBEMS_MSG, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_open_msg, 0, 0}, { CMD_NBEMS_FLMSG, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_open_flmsg, 0, 0}, { CMD_NBEMS_BRWSR, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_open_brwsr, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_rsid_command_table[] = { { CMD_ID_RSID_NOTIFY, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_notify, 0, 0}, { CMD_ID_RSID_SRCH_BP, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_search_bp, 0, 0}, { CMD_ID_RSID_MARK_PREV, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_mark_prev, 0, 0}, { CMD_ID_RSID_DETECTOR, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_detector, 0, 0}, { CMD_ID_RSID_ALRT_DIALOG, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_alert_dialog, 0, 0}, { CMD_ID_RSID_TX_FREQ_LOCK, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_tx_freq_lock, 0, 0}, { CMD_ID_RSID_FREQ_CHANGE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_freq_change, 0, 0}, { CMD_ID_RSID_ALLOW_ERRORS, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_rsid_allow_errors, 0, 0}, { CMD_ID_RSID_SQL_OPEN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_rsid_sql_open, 0, 0}, { CMD_ID_RSID_PRETONE, SCRIPT_COMMAND, 0, 1, {0}, { p_double }, 0, 0, 0, process_rsid_pretone, 0, 0}, { CMD_ID_RSID_END_XMT_ID, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_end_xmt_id, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_video_command_table[] = { { CMD_ID_VIDEO_TX_ID_MODE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_tx_id_mode, 0, 0}, { CMD_ID_VIDEO_TX_VIDEO_TXT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_tx_vid_txt, 0, 0}, { CMD_ID_VIDEO_TX_TXT_INP, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_video_txt_input, 0, 0}, { CMD_ID_VIDEO_SMALL_FONT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_small_font, 0, 0}, { CMD_ID_VIDEO_500_HZ, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_500hz, 0, 0}, { CMD_ID_VIDEO_WIDTH_LIMIT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_width_limit, 0, 0}, { CMD_ID_VIDEO_CHAR_ROW, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_rsid_char_per_row, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_cw_command_table[] = { { CMD_ID_CW_TX_CALLSIGN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_cw_callsign, 0, 0}, { CMD_ID_CW_SPEED, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_cw_speed, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_command_table[] = { { CMD_ID_RSID, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_rsid_command_table, sizeof(default_id_rsid_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_ID_VIDEO, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_video_command_table, sizeof(default_id_video_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_ID_CW, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_cw_command_table, sizeof(default_id_cw_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_top_level_command_table[] = { { CMD_FLDIGI, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_fldigi_command_table, sizeof(default_fldigi_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_OPERATOR, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_operator_command_table, sizeof(default_operator_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_DEVICE, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_device_command_table, sizeof(default_audio_device_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_SETTINGS, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_settings_command_table, sizeof(default_audio_settings_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_RT_CHANNEL, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_rt_channel_command_table, sizeof(default_audio_rt_channel_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_WAVE, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_wave_command_table, sizeof(default_audio_wave_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_HRDWR_PTT, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_rig_hrdwr_ptt_command_table, sizeof(default_rig_hrdwr_ptt_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_RIGCAT, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_rigcat_command_table, sizeof(default_rigcat_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_HAMLIB, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_hamlib_command_table, sizeof(default_hamlib_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_IO, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_io_command_table, sizeof(default_io_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_NBEMS, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_nbems_command_table, sizeof(default_nbems_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_ID, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_command_table, sizeof(default_id_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_LOAD_MACRO, SCRIPT_COMMAND | SCRIPT_STRUCTURED_ONLY, 0, 3, {0}, { p_int, p_int, p_string }, 0, 0, 0, process_load_macro, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; /** ************************************************************** * \brief Macro command requires special procesing. * \param cmd Pointer to matching struct script_cmds script * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::sc_macros(struct script_cmds *cmd) { bool not_done = false; std::string temp; SCRIPT_CODES error = script_no_errors; int line_number_start = line_number; char *local_buffer = (char *)0; _macro_command.clear(); temp.clear(); std::string search_cmd; search_cmd.assign(CMD_END_CMD).append(":"); local_buffer = new char[MAX_READLINE_LENGTH]; if(!local_buffer) return script_memory_allocation_error; while(!not_done) { if(ferror(fd)) { error = script_file_read_error; break; } if(feof(fd)) { error = script_unexpected_eof; break; } memset(local_buffer, 0, MAX_READLINE_LENGTH); if (fgets(local_buffer, MAX_READLINE_LENGTH, fd)) line_number++; temp.assign(local_buffer); trim(temp); if(temp.find(search_cmd) == std::string::npos) _macro_command.append(local_buffer); else break; } int pos = _macro_command.length() - 1; bool lf_removed = false; // Remove the last new line in the macro command (script syntax requirement) if(pos > 1) { // Windows way if(_macro_command[pos-1] == '\r' && _macro_command[pos] == '\n') { _macro_command.erase(pos - 1, 2); lf_removed = true; } } if((lf_removed == false) && (pos > 0)) { // Unix/Linux/MacOSX way if(_macro_command[pos] == '\n') _macro_command.erase(pos, 1); } if(error == script_unexpected_eof) { LOG_INFO(_("Missing command %s after line %d"), search_cmd.c_str(), line_number_start); } delete [] local_buffer; return error; } /** ************************************************************** * \brief Used for initialization of the function vector table. * \param cmd Pointer to matching struct script_cmds script * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::sc_dummy(struct script_cmds *cmd) { return script_no_errors; } /** ************************************************************** * \brief Convert error numbers into human readable form. * \param error_no Error number to convert. * \param ln The offending line number in the script file. * \param cmd The script command is question. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ char * ScriptParsing::script_error_string(SCRIPT_CODES error_no, int ln, char *cmd) { char *es = (char *) ""; memset(error_buffer, 0, sizeof(error_buffer)); memset(error_cmd_buffer, 0, sizeof(error_cmd_buffer)); memset(error_string, 0, sizeof(error_string)); if(cmd) { strncpy(error_cmd_buffer, cmd, sizeof(error_cmd_buffer)-1); } if(error_no < 0) { _script_error_detected = true; } switch(error_no) { case script_command_not_found: es = (char *) _("Command Not Found"); break; case script_non_script_file: es = (char *) _("Not a script file/tag not found"); break; case script_parameter_error: es = (char *) _("Invalid parameter"); break; case script_function_parameter_error: es = (char *) _("Invalid function parameter (internal non-script error)"); break; case script_mismatched_quotes: es = (char *) _("Missing paired quotes (\")"); break; case script_general_error: es = (char *) _("General Error"); break; case script_no_errors: es = (char *) _("No Errors"); break; case script_char_match_not_found: es = (char *) _("Character searched not found"); break; case script_end_of_line_reached: es = (char *) _("End of line reached"); break; case script_file_not_found: es = (char *) _("File not found"); break; case script_path_not_found: es = (char *) _("Directory path not found"); break; case script_args_eol: es = (char *) _("Unexpected end of parameter (args[]) list found"); break; case script_param_check_eol: es = (char *) _("Unexpected end of parameter check list found"); break; case script_paramter_exceeds_length: es = (char *) _("Character count in args[] parameter exceeds expectations"); break; case script_memory_allocation_error: es = (char *) _("Memory Allocation Error (internal non-script error)"); break; case script_incorrectly_assigned_value: es = (char *) _("Passed parameter is not of the expected type."); break; case script_invalid_parameter: es = (char *) _("Parameter is not valid."); break; case script_command_seperator_missing: es = (char *) _("Command missing ':'."); break; case script_max_sub_script_reached: es = (char *) _("Maximum open subscripts reached."); break; case script_subscript_exec_fail: es = (char *) _("Subscript execution fail (internal)."); break; case script_device_path_not_found: es = (char *) _("Script device path not found."); break; case script_unexpected_eof: es = (char *) _("Unexpected end of file reached."); break; case script_file_read_error: es = (char *) _("File read error"); break; default: es = (char *) _("Undefined error"); } snprintf(error_buffer, sizeof(error_buffer)-1, _("Line: %d Error:%d %s (%s)"), ln, error_no, es, error_cmd_buffer); return error_buffer; } /** ************************************************************** * \brief Search for first occurrence of a non white space * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_white_spaces(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr > ' ') { error = script_no_errors; return cPtr; } } error = script_end_of_line_reached; return (char *)0; // End of line reached. } /** ************************************************************** * \brief Search for the first occurrence on a non number. * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_numbers(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(!isdigit(*cPtr)) { error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Skip characters until either a number or white space is * found. * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_characters(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(isdigit(*cPtr) || *cPtr <= ' ') { error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Search for the first occurrence of a white space. * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_alpha_numbers(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(*cPtr <= ' ') { error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Search for first occurrence of 'character' * \param c Character to search for * \param data Pointer to Data to search for character in. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_to_character(char c, char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(*cPtr == c) { // Match found. Return pointer to it's location error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Replace CR, LF, and '#' with '0' (by value) * \param data Search data pointer * \param limit data buffer size * \return void (none) * \par Note:
* The searched condition is ignored if the remark character \(#\) * is encapsulated in quotes \(\"\"\). *****************************************************************/ SCRIPT_CODES ScriptParsing::remove_crlf_comments(char *data, char *limit, size_t &count) { char *cPtr = (char *) 0; int q_flag = 0; SCRIPT_CODES error = script_no_errors; if(!data || !limit) return script_function_parameter_error; count = 0; for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '\r' || *cPtr == '\n') { *cPtr = 0; return script_no_errors; } if(*cPtr == '"') q_flag++; if((q_flag & 0x1)) continue; if(*cPtr == '#') { *cPtr = 0; break; } if(*cPtr > ' ') count++; } // Remove trailing white spaces. while(cPtr >= data) { if(*cPtr <= ' ') *cPtr = 0; else break; cPtr--; } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return error; } /** ************************************************************** * \brief Copy memory from address to address. * \param buffer Destination buffer * \param sPtr Start of the copy Address * \param ePtr End of the copy Address * \param limit Destination buffer size * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::copy_string_uppercase(char *buffer, char *sPtr, char *ePtr, size_t limit) { if(!buffer || !sPtr || !ePtr || limit < 1) { return script_function_parameter_error; } char *dPtr = buffer; size_t index = 0; for(index = 0; index < limit; index++) { *dPtr++ = toupper(*sPtr++); if(sPtr >= ePtr) break; } return script_no_errors; } /** ************************************************************** * \brief Parse the parameters and seperate into individual components. * \param s char pointer to the start of the string. * \param e char pointer to the end of the string. * \param matching_command pointer to the data strucure of the matching * command. See \ref SCRIPT_COMMANDS * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_parameters(char *s, char *e, SCRIPT_COMMANDS *matching_command) { char *c = s; char *d = (char *)0; int index = 0; int parameter_count = matching_command->argc; int count = 0; long tmp = 0; SCRIPT_CODES error = script_no_errors; // Clear the old pointers. for(index = 0; index < MAX_CMD_PARAMETERS; index++) { matching_command->args[index] = (char *)0; } if(parameter_count > 0) { count = parameter_count - 1; for(index = 0; index < count; index++) { c = skip_white_spaces(c, e, error); if(error != script_no_errors) return script_parameter_error; d = skip_to_character(',', c, e, error); if(error != script_no_errors) return script_parameter_error; *d = 0; tmp = (long) (d - c); if(tmp > 0) trim(c, (size_t)(tmp)); matching_command->args[index] = c; c = d + 1; } c = skip_white_spaces(c, e, error); if(error) return error; d = skip_alpha_numbers(c, e, error); if(error) return error; *d = 0; tmp = (long) (d - c); if(tmp > 0) trim(c, (size_t)(tmp)); matching_command->args[index] = c; } #ifdef TESTING for(int i = 0; i < parameter_count; i++) if(matching_command->args[i]) printf("parameters %d (%s)\n", i, matching_command->args[i]); #endif error = check_parameters(matching_command); if(error != script_no_errors) return error; // If assigned then special processing is required. if(matching_command->func) error = (this->*matching_command->func)(matching_command); if(error) return error; return script_no_errors; } /** ************************************************************** * \brief Execute callback function. * \param cb_data Pointer for making a copy of the data to prevent * exterior alteration of source information. * \return 0 = No error
\< 0 = Error
*****************************************************************/ int ScriptParsing::call_callback(SCRIPT_COMMANDS *cb_data) { int argc = 0; int error = 0; int index = 0; SCRIPT_COMMANDS *tmp = (SCRIPT_COMMANDS *)0; size_t count = 0; if(!cb_data || !cb_data->cb) return -1; argc = cb_data->argc; tmp = new SCRIPT_COMMANDS; if(!tmp) return -1; memset(tmp, 0, sizeof(SCRIPT_COMMANDS)); for(index = 0; index < argc; index++) { if(cb_data->args[index]) { count = strnlen(cb_data->args[index], MAX_PARAMETER_LENGTH-1); tmp->args[index] = new char[count+1]; if(tmp->args[index]) { memset(tmp->args[index], 0, count+1); strncpy(tmp->args[index], cb_data->args[index], count); } else { error = -1; break; } } else break; } if(error > -1) { // Fill SCRIPT_COMMANDS (tmp) struct with useful data. tmp->flags = cb_data->flags; tmp->command_length = cb_data->command_length; tmp->argc = cb_data->argc; strncpy(tmp->command, cb_data->command, MAX_COMMAND_LENGTH); // Initialize with do nothing functions tmp->func = &ScriptParsing::sc_dummy; tmp->cb = callback_dummy; error = (*cb_data->cb)(this, tmp); } if(tmp) { for(index = 0; index < argc; index++) { if(tmp->args[index]) { delete [] tmp->args[index]; } } delete tmp; } return error; } /** ************************************************************** * \brief Parse a single line of data from the script file being read. * \param data Pointer the the script scring in question * \param buffer_size buffer size of the data pointer. * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_hierarchy_command(char *data, size_t buffer_size) { char *buffer = (char *)0; char *cPtr = (char *)0; char *endPtr = (char *)0; char *ePtr = (char *)0; int allocated_buffer_size = MAX_COMMAND_LENGTH; SCRIPT_CODES error = script_no_errors; SCRIPT_COMMANDS *local_list = _script_commands; size_t local_limit = _script_command_count; cPtr = data; endPtr = &data[buffer_size]; cPtr = skip_white_spaces(cPtr, endPtr, error); if(error != script_no_errors) return error; ePtr = skip_to_character(':', cPtr, endPtr, error); if(error != script_no_errors) return script_command_seperator_missing; buffer = new char [allocated_buffer_size]; if(!buffer) { LOG_INFO(_("Buffer allocation Error near File: %s Line %d"), __FILE__, __LINE__); return script_memory_allocation_error; } memset(buffer, 0, allocated_buffer_size); error = copy_string_uppercase(buffer, cPtr, ePtr, allocated_buffer_size-1); if(error != script_no_errors) { buffer[0] = 0; delete [] buffer; return error; } int str_count = str_cnt(buffer, allocated_buffer_size); trim(buffer, (size_t) str_count); char sub_command[MAX_COMMAND_LENGTH]; bool not_found = true; char *endCmd = ePtr; char *endCmdPtr = endPtr; cPtr = buffer; endPtr = &buffer[str_count]; while(not_found) { memset(sub_command, 0, sizeof(sub_command)); ePtr = skip_to_character('.', cPtr, endPtr, error); if(error == script_end_of_line_reached) { ePtr = endPtr; error = script_no_errors; } if(error == script_no_errors) { copy_string_uppercase(sub_command, cPtr, ePtr, MAX_COMMAND_LENGTH-1); cPtr = ePtr + 1; } else break; for(size_t i = 0; i < local_limit; i++) { if(local_list[i].command[0] == 0) { not_found = false; error = script_command_not_found; break; } if(strncmp(sub_command, local_list[i].command, MAX_COMMAND_LENGTH) == 0) { if((local_list[i].param_check[0] == p_list) && local_list[i].sub_commands) { local_limit = local_list[i].sub_command_count; local_list = local_list[i].sub_commands; break; } if((file_type() & local_list[i].flags) && !(SCRIPT_STRUCTURED_ONLY & local_list[i].flags)) { error = parse_parameters(++endCmd, endCmdPtr, &local_list[i]); if(error) { buffer[0] = 0; delete [] buffer; return error; } if(local_list[i].cb) { error = (SCRIPT_CODES) call_callback(&local_list[i]); if(error < script_no_errors) LOG_INFO(_("Call back for script command %s reported an Error"), local_list[local_limit].command); not_found = false; error = script_command_handled; break; } } else { LOG_INFO(_("Command %s ignored, dot notation not supported"), buffer); not_found = false; error = script_general_error; break; } } } } buffer[0] = 0; delete [] buffer; return error; } /** ************************************************************** * \brief Parse a single line of data from the script file being read. * \param data Pointer the the script scring in question * \param buffer_size buffer size of the data pointer. * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_single_command(FILE *fd, SCRIPT_COMMANDS *cur_list, size_t limit, char *data, size_t buffer_size) { char *buffer = (char *)0; char *cPtr = (char *)0; char *endPtr = (char *)0; char *ePtr = (char *)0; int allocated_buffer_size = MAX_COMMAND_LENGTH; size_t cmd_size = 0; size_t cmp_results = 0; size_t index = 0; size_t size = 0; bool dot_notation = false; SCRIPT_CODES error = script_no_errors; SCRIPT_COMMANDS *local_list = cur_list; size_t local_limit = limit; cPtr = data; endPtr = &data[buffer_size]; cPtr = skip_white_spaces(cPtr, endPtr, error); if(error != script_no_errors) return error; ePtr = skip_to_character(':', cPtr, endPtr, error); if(error != script_no_errors) return script_command_seperator_missing; buffer = new char [allocated_buffer_size]; if(!buffer) { LOG_INFO(_("Buffer allocation Error near File: %s Line %d"), __FILE__, __LINE__); return script_memory_allocation_error; } memset(buffer, 0, allocated_buffer_size); error = copy_string_uppercase(buffer, cPtr, ePtr, allocated_buffer_size-1); if(error != script_no_errors) { buffer[0] = 0; delete [] buffer; return error; } int str_count = (int) strnlen(buffer, allocated_buffer_size); trim(buffer, (size_t) str_count); for(int i = 0; i < str_count; i++) { if(buffer[i] == '.') { error = parse_hierarchy_command(data, buffer_size); if(error == script_no_errors) dot_notation = true; break; } } if(dot_notation == false && error == script_no_errors) { for(index = 0; index < local_limit; index++) { size = strnlen(local_list[index].command, MAX_COMMAND_LENGTH); cmd_size = strnlen(buffer, MAX_COMMAND_LENGTH); cmp_results = memcmp(buffer, local_list[index].command, size); if(cmp_results == 0 && (cmd_size == size)) { if(local_list[index].param_check[0] == p_list_end) { return script_end_of_list_reached; } if(local_list[index].sub_commands && local_list[index].param_check[0] == p_list) { if(recursive_count <= RECURSIVE_LIMIT) { read_file(fd, local_list[index].sub_commands, local_list[index].sub_command_count); } else { error = script_recursive_limit_reached; } break; } if((file_type() & local_list[index].flags) && !(SCRIPT_DOT_NOTATION_ONLY & local_list[index].flags)) { if(local_list[index].argc > 0) { error = parse_parameters(++ePtr, endPtr, &local_list[index]); if(error) { buffer[0] = 0; delete [] buffer; return error; } } if(local_list[index].cb) { error = (SCRIPT_CODES) call_callback(&local_list[index]); if(error < script_no_errors) LOG_INFO(_("Call back for script command %s reported an Error"), local_list[index].command); } } else { LOG_INFO(_("Command %s ignored, structured command not supported"), buffer); error = script_general_error; } break; } } } buffer[0] = 0; delete [] buffer; return error; } /** ************************************************************** * \brief Script entry point for parsing the script file. * \param file_name_path path and file name for the script to parse. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::read_file(FILE *fd, SCRIPT_COMMANDS *cur_list, size_t limit) { SCRIPT_CODES return_code = script_no_errors; SCRIPT_COMMANDS *local_list = cur_list; size_t count = 0; bool errors_reported = false; recursive_count++; if(recursive_count > RECURSIVE_LIMIT) return script_recursive_limit_reached; while(1) { if(ferror(fd) || feof(fd)) break; memset(line_buffer, 0, sizeof(line_buffer)); if (fgets(line_buffer, sizeof(line_buffer) - 1, fd)) line_number++; #ifdef TESTING printf("Reading: %s", line_buffer); #endif return_code = remove_crlf_comments(line_buffer, &line_buffer[sizeof(line_buffer)], count); if(count < 1) { continue; } if(return_code >= script_no_errors) { return_code = parse_single_command(fd, local_list, limit, line_buffer, sizeof(line_buffer) - 1); } if(return_code == script_end_of_list_reached) break; if(return_code < script_no_errors) { LOG_INFO("%s", script_error_string(return_code, line_number, line_buffer)); errors_reported = true; } } recursive_count--; if(errors_reported) return script_errors_reported; return script_no_errors; } /** ************************************************************** * \brief Script entry point for parsing the script file. * \param file_name_path path and file name for the script to parse. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_commands(char *file_name_path) { char *cPtr = (char *)0; SCRIPT_CODES error_code = script_no_errors; size_t tmp = 0; SCRIPT_COMMANDS *local_script_commands = _script_commands; size_t local_script_command_count = _script_command_count; if(!file_name_path) { LOG_INFO(_("Invalid function parameter 'char *file_name_path' (null)")); return script_function_parameter_error; } fd = fl_fopen(file_name_path, "r"); line_number = 0; if(!fd) { LOG_INFO(_("Unable to open file %s"), file_name_path); return script_file_not_found; } memset(line_buffer, 0, sizeof(line_buffer)); char *retval = fgets(line_buffer, sizeof(line_buffer) - 1, fd); line_number++; tmp = strlen(SCRIPT_FILE_TAG); line_buffer[tmp] = 0; tmp = strncmp(SCRIPT_FILE_TAG, line_buffer, tmp); if(!retval || tmp) { cPtr = script_error_string(script_non_script_file, line_number, line_buffer); LOG_INFO("%s", cPtr); fclose(fd); return script_non_script_file; } error_code = read_file(fd, local_script_commands, local_script_command_count); fclose(fd); return error_code; } /** ************************************************************** * \brief Assign a list of valid parameters for verification checks. * \param array An Array of pointers to each element. * \param array_count Number of entries in the array. * \return the array count or '0' if error. * \par Note: * This array is limited to the first parameter of the command * used in it's comparison. *****************************************************************/ int ScriptParsing::assign_valid_parameters(const char *command, const char **array, const int array_count) { if(!array || array_count < 1 || !command) return 0; int index = 0; int count = 0; SCRIPT_COMMANDS * cmd_sc = search_command(_script_commands, 0, command); if(!cmd_sc) { return 0; } for(index = 0; index < array_count; index++) { if(*array[index]) count++; } if(count != array_count) return 0; cmd_sc->valid_values = array; cmd_sc->valid_value_count = array_count; return array_count; } /** ************************************************************** * \brief Return true state if string is matched. * \param state Referenced value to assign results to. * \param string Pointer to the data string. * \param true_state Pointer to the data to match with. * \return SCRIPT_CODES error code. *****************************************************************/ inline SCRIPT_CODES ScriptParsing::test_on_off_state(bool &state, char *string, char *true_state=(char *)"ON") { if(!string || !true_state) { return script_function_parameter_error; } bool flag = false; if(strncmp(string, true_state, MAX_PARAMETER_LENGTH) == 0) flag = true; state = flag; return script_no_errors; } /** ************************************************************** * \brief Validate if file is located in the specified location. * \param filename Pointer to a series of charcters * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_filename(char *filename) { SCRIPT_CODES error = script_no_errors; if(!filename) { return script_function_parameter_error; } FILE *fd = (FILE *)0; fd = fl_fopen(filename, "r"); if(!fd) { error = script_file_not_found; } else { fclose(fd); } return error; } /** ************************************************************** * \brief Validate if path is present. * \param path The path to verify. * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_path(const char *path) { if(!path) { return script_function_parameter_error; } struct stat st; memset(&st, 0, sizeof(struct stat)); if(stat(path, &st) == 0) { if(st.st_mode & S_IFDIR) return script_no_errors; } return script_path_not_found; } /** ************************************************************** * \brief Validate if device path is present. * \param path The path to verify. * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_dev_path(const char *path) { if(!path) { return script_function_parameter_error; } struct stat st; memset(&st, 0, sizeof(struct stat)); #ifdef __WIN32__ std::string alt_path; int value = 0; int cnt = 0; alt_path.assign(path); if(!alt_path.empty()) { if(alt_path.find("COM") != std::string::npos) { cnt = sscanf(alt_path.c_str(), "COM%d", &value); if(cnt && (value > 0)) return script_no_errors; } } #endif if(stat(path, &st) == 0) { if(st.st_mode & S_IFCHR) return script_no_errors; } return script_device_path_not_found; } /** ************************************************************** * \brief Validate bool representation. * \param value String data or * \param flag Depending on string content a value of true or false assigned * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_bool(const char *value, bool &flag) { if(!value) { return script_function_parameter_error; } flag = false; std::string uc_value; uc_value.assign(value); to_uppercase(uc_value); static char *bool_true_flags[] = { (char *)PARM_ENABLE, (char *)PARM_YES, (char *)_("1"), (char *)0 }; static char *bool_false_flags[] = { (char *) PARM_DISABLE, (char *)PARM_NO, (char *)_("0"), (char *)0 }; for(size_t i = 0; i < sizeof(bool_true_flags)/sizeof(char *); i++) { if(bool_true_flags[i] == (char *)0) break; if(strncmp(uc_value.c_str(), bool_true_flags[i], 7) == 0) { flag = true; return script_no_errors; } } for(size_t i = 0; i < sizeof(bool_false_flags)/sizeof(char *); i++) { if(bool_false_flags[i] == (char *)0) break; if(strncmp(uc_value.c_str(), bool_false_flags[i], 7) == 0) { flag = false; return script_no_errors; } } flag = false; return script_invalid_parameter; } /** ************************************************************** * \brief Validate if the parameter is a value. * \param value The string in question. * \param p format verification. * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_numbers(char *value, paramter_types p) { SCRIPT_CODES error = script_no_errors; size_t length = 0; size_t index = 0; int data_count = 0; int signed_value = 0; int decimal_point = 0; if(!value) return script_function_parameter_error; length = strnlen(value, MAX_PARAMETER_LENGTH); if(length < 1) return script_parameter_error; // Skip any leading white spaces. for(index = 0; index < length; index++) { if(value[index] > ' ') break; } if((index >= length)) return script_parameter_error; switch(p) { case p_int: case p_long: if(value[0] == '-' || value[0] == '+') { index++; signed_value++; } case p_unsigned_int: case p_unsigned_long: for(; index< length; index++) { if(isdigit(value[index])) data_count++; else break; } break; if(data_count) return script_no_errors; case p_float: case p_double: if(value[0] == '-' || value[0] == '+') { index++; signed_value++; } for(; index< length; index++) { if(isdigit(value[index])) data_count++; if(value[index] == '.') decimal_point++; if(decimal_point > 1) return script_parameter_error; } if(data_count) return script_no_errors; break; default:; } return error; } /** ************************************************************** * \brief Validate the script parameter(s) are of the expected format. * \param cmd Matching command data structure. * \param p A table of expected parameters types (null terminated). * \param p_count the number of 'p[]' items in the table (includes null termination). * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_parameters(struct script_cmds *cmd) { SCRIPT_CODES error = script_no_errors; int count = 0; int index = 0; size_t size = 0; bool flag = false; if(!cmd) return script_function_parameter_error; count = cmd->argc; if(count < 1) return script_no_errors; for(index = 0; index < count; index++) { if(!cmd->args[index]) { return script_args_eol; } if(cmd->param_check[index] == p_null) { size = 0; } else { size = strnlen(cmd->args[index], MAX_COMMAND_LENGTH); } switch(cmd->param_check[index]) { case p_null: error = script_param_check_eol; break; case p_char: if(size > 1) error = script_paramter_exceeds_length; break; case p_bool: error = check_bool(cmd->args[index], flag); break; case p_int: case p_long: case p_unsigned_int: case p_unsigned_long: case p_float: case p_double: error = check_numbers(cmd->args[index], cmd->param_check[index]); break; case p_dev_path: error = check_dev_path(cmd->args[index]); break; case p_dev_name: case p_string: if(size < 1) error = script_parameter_error; break; case p_path: error = check_path(cmd->args[index]); break; case p_filename: error = check_filename(cmd->args[index]); break; case p_list: case p_list_end: case p_void: break; } if(error != script_no_errors) break; } return error; } /** ************************************************************** * \brief Search the content of SCRIPT_COMMANDS structure table * for the specified command. * \param command The command to search for. * \return Pointer to the matching SCRIPT_COMMANDS entry. Null if * not found. *****************************************************************/ SCRIPT_COMMANDS * ScriptParsing::search_command(SCRIPT_COMMANDS * table, size_t limit, const char *command) { char *cmd_buffer = (char *)0; int diff = 0; SCRIPT_COMMANDS * found = (SCRIPT_COMMANDS *) 0; size_t count = limit; size_t index = 0; if(!command) return found; cmd_buffer = new char [MAX_COMMAND_LENGTH]; if(!cmd_buffer) { LOG_INFO(_("cmd_buffer allocation error near line %d"), __LINE__); return found; } memset(cmd_buffer, 0, MAX_COMMAND_LENGTH); strncpy(cmd_buffer, command, MAX_COMMAND_LENGTH-1); to_uppercase(cmd_buffer, (int) MAX_COMMAND_LENGTH); trim(cmd_buffer, (size_t) MAX_COMMAND_LENGTH); for(index = 0; index < count; index++) { diff = strncmp(cmd_buffer, table[index].command, MAX_COMMAND_LENGTH); if(diff == 0) { found = &table[index]; break; } } cmd_buffer[0] = 0; delete [] cmd_buffer; return found; } /** ************************************************************** * \brief Convert string to uppercase characters.
* \par str Pointer to data. * \par limit data buffer size * \return void *****************************************************************/ void ScriptParsing::to_uppercase(char *str, int limit) { if(!str || limit < 1) return; int character = 0; int count = 0; int index = 0; count = (int) strnlen(str, limit); for(index = 0; index < count; index++) { character = str[index]; if(character == 0) break; character = (char) toupper(character); str[index] = character; } } /** ************************************************************** * \brief Convert string to uppercase characters.
* \par str String storage passed by reference. * \return void *****************************************************************/ void ScriptParsing::to_uppercase(std::string &str) { int character = 0; int count = 0; int index = 0; count = (int) str.length(); for(index = 0; index < count; index++) { character = str[index]; if(character == 0) break; character = (char) toupper(character); str[index] = character; } } #if 0 /** ************************************************************** * \brief Assign Call back function to a given script command.
* \param scriptCommand Script command string
* \param cb Pointer to call back function. int (*cb)(ScriptParsing *sp, SCRIPT_COMMANDS *sc) *****************************************************************/ int ScriptParsing::assign_callback(const char *scriptCommand, int (*cb)(ScriptParsing *sp, SCRIPT_COMMANDS *sc)) { char *cmd_buffer = (char *)0; int diff = 0; size_t count = _script_command_count; size_t index = 0; if(!scriptCommand || !cb) return 0; cmd_buffer = new char[MAX_COMMAND_LENGTH]; if(!cmd_buffer) { LOG_INFO(_("cmd_buffer allocation error near line %d"), __LINE__); return 0; } memset(cmd_buffer, 0, MAX_COMMAND_LENGTH); strncpy(cmd_buffer, scriptCommand, MAX_COMMAND_LENGTH-1); to_uppercase(cmd_buffer, (int) MAX_COMMAND_LENGTH); trim(cmd_buffer, (size_t) MAX_COMMAND_LENGTH); for(index = 0; index < count; index++) { diff = strncmp(cmd_buffer, _script_commands[index].command, MAX_COMMAND_LENGTH); if(diff == 0) { if(_script_commands[index].cb) LOG_INFO(_("Over writing call back funcion for \"%s\""), cmd_buffer); _script_commands[index].cb = cb; break; } } cmd_buffer[0] = 0; delete [] cmd_buffer; return 0; } #endif // #if 0 /** ************************************************************** * \brief Assign member calling function to a command * \param top_command Top Command * \param sub_command Sub command * \param func Assigned calling function member * \return void (nothing) *****************************************************************/ SCRIPT_CODES ScriptParsing::assign_member_func(char *cmd, SCRIPT_CODES (ScriptParsing::*func)(struct script_cmds *)) { char *buffer = (char *)0; char *cPtr = (char *)0; char *endPtr = (char *)0; char *ePtr = (char *)0; int allocated_buffer_size = MAX_COMMAND_LENGTH; size_t size = 0; SCRIPT_CODES error = script_no_errors; SCRIPT_COMMANDS *local_list = _script_commands; size_t local_limit = _script_command_count; if(!cmd || !func) return script_invalid_parameter; size = strnlen(cmd, MAX_COMMAND_LENGTH); cPtr = cmd; endPtr = &cmd[size]; size = 0; cPtr = skip_white_spaces(cPtr, endPtr, error); if(error != script_no_errors) return error; ePtr = skip_to_character(':', cPtr, endPtr, error); if(error != script_no_errors) return script_command_seperator_missing; buffer = new char [allocated_buffer_size]; if(!buffer) { LOG_INFO(_("Buffer allocation Error near File: %s Line %d"), __FILE__, __LINE__); return script_memory_allocation_error; } memset(buffer, 0, allocated_buffer_size); error = copy_string_uppercase(buffer, cPtr, ePtr, allocated_buffer_size-1); if(error != script_no_errors) { buffer[0] = 0; delete [] buffer; return error; } int str_count = str_cnt(buffer, allocated_buffer_size); trim(buffer, (size_t) str_count); char sub_command[MAX_COMMAND_LENGTH]; bool not_found = true; cPtr = buffer; endPtr = &buffer[str_count]; while(not_found) { memset(sub_command, 0, sizeof(sub_command)); ePtr = skip_to_character('.', cPtr, endPtr, error); if(error == script_end_of_line_reached) { ePtr = endPtr; error = script_no_errors; } if(error == script_no_errors) { copy_string_uppercase(sub_command, cPtr, ePtr, MAX_COMMAND_LENGTH-1); cPtr = ePtr + 1; } else break; for(size_t i = 0; i < local_limit; i++) { if(local_list[i].command[0] == 0) { not_found = false; error = script_command_not_found; break; } if(strncmp(sub_command, local_list[i].command, MAX_COMMAND_LENGTH) == 0) { if((local_list[i].param_check[0] == p_list) && local_list[i].sub_commands) { local_limit = local_list[i].sub_command_count; local_list = local_list[i].sub_commands; break; } local_list[i].func = func; local_list[i].command_length = strnlen(local_list[i].command, MAX_COMMAND_LENGTH); not_found = false; error = script_no_errors; break; } } } buffer[0] = 0; delete [] buffer; return error; } #if 0 /** ************************************************************** * \brief Assign member calling function to a command * \param top_command Top Command * \param sub_command Sub command * \param func Assigned calling function member * \return void (nothing) *****************************************************************/ void ScriptParsing::assign_member_func(char *cmd, SCRIPT_CODES (ScriptParsing::*func)(struct script_cmds *)) { if(!top_command || !func) return; SCRIPT_COMMANDS *top_table = (SCRIPT_COMMANDS *)0; SCRIPT_COMMANDS *modify_table = (SCRIPT_COMMANDS *)0; if(top_cache) { if(strncmp(top_cache->command, top_command, MAX_COMMAND_LENGTH) == 0) { top_table = top_cache; } } if(!top_table) { for(int i = 0; i < _script_command_count; i++) { if(strncmp(_script_commands[i].command, top_command, MAX_COMMAND_LENGTH) == 0) { top_cache = &_script_commands[i]; top_table = top_cache; break; } } } if(!top_table) return; if(!sub_command) modify_table = top_table; if(modify_table == (SCRIPT_COMMANDS *)0) { if(top_table->sub_commands) { for(int i = 0; i < top_table->sub_command_count; i++) { if(strncmp(sub_command, top_table->sub_commands[i].command, MAX_COMMAND_LENGTH) == 0) { modify_table = &top_table->sub_commands[i]; break; } } } } if(modify_table != (SCRIPT_COMMANDS *)0) { modify_table->func = func; modify_table->command_length = strnlen(modify_table->command, MAX_COMMAND_LENGTH); } } #endif // #if 0 /** ************************************************************** * \brief Initialize variables * \return void (nothing) *****************************************************************/ void ScriptParsing::clear_script_parameters(bool all) { _path.clear(); _file_type = SCRIPT_COMMAND; _macro_command.clear(); } /** ************************************************************** * \brief Initialize callable members. * \return void (nothing) *****************************************************************/ void ScriptParsing::initialize_function_members(void) { std::string cmd; cmd.assign(CMD_LOAD_MACRO).append(":"); // For localization assign_member_func((char *) cmd.c_str(), &ScriptParsing::sc_macros); } /** ************************************************************** * \brief Copy environment to the sub ScriptParsing class * \param src Source Class pointer to copy from. *****************************************************************/ int ScriptParsing::CopyScriptParsingEnv(ScriptParsing *src) { if(!src || (src == this)) return -1; parent(src); script_commands(src->script_commands()); script_command_count(src->script_command_count()); initialize_function_members(); return 0; } /** ************************************************************** * \brief Constructor: Copy and initialize.
*****************************************************************/ int ScriptParsing::copy_tables(struct script_cmds * subcmds, size_t count) { size_t index = 0; size_t table_count = 0; SCRIPT_COMMANDS * dst_table = 0; SCRIPT_COMMANDS * src_table = 0; recursive_count++; if(recursive_count > RECURSIVE_LIMIT) return 0; for(index = 0; index < count; index++) { src_table = subcmds[index].sub_commands; table_count = subcmds[index].sub_command_count; if(src_table && table_count) { dst_table = new SCRIPT_COMMANDS[table_count]; if(dst_table) { add_to_delete_list(dst_table); memcpy(dst_table, src_table, sizeof(SCRIPT_COMMANDS) * table_count); subcmds[index].sub_commands = dst_table; subcmds[index].sub_command_count = table_count; copy_tables(dst_table, table_count); } } } recursive_count--; return 0; } /** ************************************************************** * \brief Constructor: Copy and initialize function arrays.
*****************************************************************/ ScriptParsing::ScriptParsing() { size_t count = 0; clear_script_parameters(true); memset(line_buffer, 0, sizeof(line_buffer)); memset(error_cmd_buffer, 0, sizeof(error_cmd_buffer)); memset(error_string, 0, sizeof(error_string)); memset(error_buffer, 0, sizeof(error_buffer)); memset(memory_delete_list, 0, sizeof(memory_delete_list)); delete_list_count = 0; top_cache = 0; recursive_count = 0; _script_error_detected = false; _restart_flag = false; fd = 0; count = sizeof(default_top_level_command_table)/sizeof(SCRIPT_COMMANDS); _script_commands = new SCRIPT_COMMANDS[count]; if(_script_commands) { add_to_delete_list(_script_commands); _script_command_count = count; memcpy(_script_commands, default_top_level_command_table, sizeof(SCRIPT_COMMANDS) * _script_command_count); copy_tables(_script_commands, _script_command_count); } recursive_count = 0; initialize_function_members(); } /** ************************************************************** * \brief Destructor *****************************************************************/ ScriptParsing::~ScriptParsing() { int index = 0; for(index = 0; index < MAX_DELETE_LIST_COUNT; index++) { if(memory_delete_list[index]) { delete [] memory_delete_list[index]; } } } /** ************************************************************** * \brief Keep track of memory allocation for easy deallocation. *****************************************************************/ void ScriptParsing::add_to_delete_list(SCRIPT_COMMANDS *ptr) { if(!ptr) return; if(delete_list_count < MAX_DELETE_LIST_COUNT) { memory_delete_list[delete_list_count] = ptr; delete_list_count++; } } /** ************************************************************** * \brief Dummy callback function for initialization of * function pointers. * \param sp The calling ScriptParsing Class * \param sc Command data structure pointer to the matching script * command. * \return 0 = No error
\< 0 = Error
*****************************************************************/ int callback_dummy(ScriptParsing *sp, struct script_cmds *sc) { return 0; } /** ******************************************************** * \brief Determine the length of the string with a count * limitation. * \return signed integer. The number of characters in the * array not to excede count limit. ***********************************************************/ int ScriptParsing::str_cnt(char * str, int count_limit) { if(!str || (count_limit < 1)) return 0; int value = 0; for(int index = 0; index < count_limit; index++) { if(str[index] == 0) break; value++; } return value; } /** ******************************************************** * \brief Trim leading and trailing spaces from string. * \param s String to modify * \return s modified string. ***********************************************************/ std::string &ScriptParsing::trim(std::string &s) { char *buffer = (char *)0; char *dst = (char *)0; char *end = (char *)0; char *src = (char *)0; long count = s.size(); buffer = new char[count + 1]; if(!buffer) return s; memcpy(buffer, s.c_str(), count); buffer[count] = 0; dst = src = buffer; end = &buffer[count]; while(src < end) { if(*src > ' ') break; src++; } if(src > dst) { while((dst < end) && (src < end)) *dst++ = *src++; *dst = 0; } while(end >= buffer) { if(*end > ' ') break; *end-- = 0; } s.assign(buffer); delete [] buffer; return s; } /** ************************************************************** * \brief Remove leading/trailing white spaces and quotes. * \param buffer Destination buffer * \param limit passed buffer size * \return void *****************************************************************/ void ScriptParsing::trim(char *buffer, size_t limit) { char *s = (char *)0; char *e = (char *)0; char *dst = (char *)0; size_t count = 0; if(!buffer || limit < 1) { return; } for(count = 0; count < limit; count++) if(buffer[count] == 0) break; if(count < 1) return; s = buffer; e = &buffer[count-1]; for(size_t i = 0; i < count; i++) { if((*s <= ' ') || (*s == '"')) s++; else break; } while(e > s) { if(*e == '"') { *e-- = 0; break; } if(*e > ' ') break; if(*e <= ' ') *e = 0; e--; } dst = buffer; while(s <= e) { *dst++ = *s++; } *dst = 0; } fldigi-4.1.06/src/flarq-src/0000775000175000017500000000000013515625030012524 500000000000000fldigi-4.1.06/src/flarq-src/flarqrc.rc0000644000175000017500000000040013472116001014407 00000000000000#define BUILD_FLARQ 1 #include "config.h" #define IDI_ICON 101 IDI_ICON ICON DISCARDABLE "flarq.ico" #define RC_FILE_VERSION_QUAD FLARQ_VERSION_MAJOR,FLARQ_VERSION_MINOR,0,0 #define RC_FILE_DESCRIPTION "Fast Light ARQ Application" #include "common.rc" fldigi-4.1.06/src/flarq-src/flarq.cxx0000664000175000017500000013300213507401434014275 00000000000000// ---------------------------------------------------------------------------- // flarq.cxx - Fast Light ARQ Application // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "fileselect.h" #include "socket.h" #include #include "threads.h" #include "flarq.h" #include "flarqenv.h" #include "flmisc.h" #include "stacktrace.h" #include "icons.h" #include "arq.h" #include "arqdialogs.h" #include "b64.h" #include "gettext.h" #include "xml_server.h" #define FLDIGI_port "7322" #define MPSK_port "3122" #define FLARQ_XML_PORT 7422 #define MPSK_TX "TX" #define MPSK_RX "RX" #define MPSK_TX2RX "RX_AFTER_TX" #define MPSK_BYTE 25 #define MPSK_CMD 26 #define MPSK_END 27 #define MPSK_ISTX 28 #define MPSK_ISRX 29 #define MPSK_ISCMD 30 #define MPSK_CMDEND 31 // directory structures for all NBEMS applications static void checkdirectories(void); string HomeDir; string NBEMS_dir; string ARQ_dir; string ARQ_files_dir; string ARQ_recv_dir; string ARQ_send_dir; string ARQ_mail_dir; string ARQ_mail_in_dir; string ARQ_mail_out_dir; string ARQ_mail_sent_dir; string WRAP_dir; string WRAP_recv_dir; string WRAP_send_dir; string WRAP_auto_dir; string ICS_dir; string ICS_msg_dir; string ICS_tmp_dir; string MailFileName = ""; string MailSaveFileName = ""; string Logfile; struct dirent *entry; DIR *dp; bool SendingEmail = false; bool SHOWDEBUG = false; extern void STATUSprint(string s); Fl_Text_Buffer *txtbuffARQ; Fl_Text_Buffer *stylebufARQ; Fl_Text_Buffer *txtbuffRX; Fl_Text_Buffer *stylebufRX; Fl_Text_Buffer *txtbuffComposer; //Fl_Text_Buffer *styleComposer; Fl_Text_Display::Style_Table_Entry styletable[] = { // Style table { FL_BLACK, FL_SCREEN, FL_NORMAL_SIZE }, // A - RX { FL_DARK_RED, FL_SCREEN, FL_NORMAL_SIZE }, // B - TX { FL_DARK_GREEN, FL_SCREEN, FL_NORMAL_SIZE }, // C - DEBUG rx text { FL_MAGENTA, FL_SCREEN, FL_NORMAL_SIZE } // D - DEBUG tx text }; Fl_Double_Window *arqwin = 0; Fl_Double_Window *dlgconfig = 0; Fl_Double_Window *outdialog = 0; Fl_Double_Window *composer = 0; using namespace std; arq *digi_arq; bool traffic = false; bool sendingfile = false; int arqstate = 0; bool configured = false; bool ioMPSK = false; string arq_address = "127.0.0.1"; string arq_port = FLDIGI_port; string RX; string TX; string teststring; string statusmsg; string MyCall; string beacontext; #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X Pixmap flarq_icon_pixmap; #endif Socket *tcpip = 0; string txbuffer; string cmdbuffer; string rxbuffer; size_t bufsize = 0; size_t bufptr = 0; bool isRxChar = false; bool isCmdChar = false; bool isTxChar = false; bool inLoop = false; int exponent = 5; int txdelay = 500; int iretries = 5; long iwaittime = 10000; long itimeout = 60000; int idtimer = 10; int bcnInterval = 30; bool autobeacon = false; bool beaconrcvd = false; int blocksSent = 0; int mainX = 0, mainY = 0, mainW = 600, mainH = 500; float vers = 0; float version; const char *ASCII[32] = { "", "", "", "", // 0x00 - 0x03 "", "", "", "", // 0x04 - 0x07 "", "", "", "", // 0x08 - 0x0B "", "", "", "", // 0x0C - 0x0F "", "", "", "", // 0x10 - 0x13 "", "", "", "", // 0x14 - 0x17 "", "", "", "", // 0x18 - 0x1B "", "", "", "" // 0x1C - 0x1F }; string AsciiChars; string incomingText = ""; string txtarqload = ""; string rxfname = ""; string arqstart = "ARQ::STX\n"; string arqend = "ARQ::ETX\n"; string arqfile = "ARQ:FILE::"; string arqemail = "ARQ:EMAIL::\n"; string arqascii = "ARQ:ENCODING::ASCII\n"; string arqbase64 = "ARQ:ENCODING::BASE64\n"; string arqsizespec = "ARQ:SIZE::"; size_t startpos = string::npos; size_t endpos = string::npos; size_t fnamepos = string::npos; size_t indx = string::npos; size_t sizepos = string::npos; size_t lfpos = string::npos; size_t arqPayloadSize = 0; bool haveemail = false; bool rxARQfile = false; bool rxARQhavesize = false; bool rxTextReady = false; time_t StartTime_t; time_t EndTime_t; time_t TransferTime_t; double TransferTime; //============================================================================= // email selector //============================================================================= int datedir = 1; int todir = 1; int subdir = 1; string sendfilename = ""; void cb_SortByDate() { if (datedir == 0) { tblOutgoing->sort(1, false); datedir = 1; } else { tblOutgoing->sort(1, true); datedir = 0; } tblOutgoing->redraw(); } void cb_SortByTo() { if (todir == 0) { tblOutgoing->sort(2, false); todir = 1; } else { tblOutgoing->sort(2, true); todir = 0; } tblOutgoing->redraw(); } void cb_SortBySubj() { if (subdir == 0) { tblOutgoing->sort(3, false); subdir = 1; } else { tblOutgoing->sort(3, true); subdir = 0; } tblOutgoing->redraw(); } void sendOK() { outdialog->hide(); int sel = tblOutgoing->value(); if (sel >= 0) sendfilename = tblOutgoing->valueAt(sel,0); else sendfilename.clear(); } void sendCancel() { outdialog->hide(); sendfilename.clear(); } void selectTrafficOut(bool ComposerOnly) { if (outdialog == 0) { outdialog = arq_SendSelect(); outdialog->xclass(PACKAGE_TARNAME); tblOutgoing->addHiddenColumn ("fnbr"); // column #0 tblOutgoing->addColumn ("Date", 180); // column #1 tblOutgoing->addColumn ("To", 120); // column #2 tblOutgoing->addColumn ("Subj", 196); // column #3 tblOutgoing->colcallback (1, cb_SortByDate); tblOutgoing->columnAlign(1, FL_ALIGN_LEFT); tblOutgoing->colcallback (2, cb_SortByTo); tblOutgoing->columnAlign(2, FL_ALIGN_LEFT); tblOutgoing->colcallback (3, cb_SortBySubj); tblOutgoing->columnAlign(3, FL_ALIGN_LEFT); tblOutgoing->allowSort(true); tblOutgoing->rowSize (14); tblOutgoing->headerSize (14); tblOutgoing->allowResize (true); tblOutgoing->gridEnabled (true); } tblOutgoing->clear(); string fline, fname, fdate, fto, fsubj; char szline[10000]; size_t p; string folder = ARQ_mail_out_dir; dp = 0; dp = opendir(folder.c_str()); if (dp == 0) { string nfound = folder; nfound += " not found"; fl_message("%s", nfound.c_str()); return; } int nummails = 0; while ((entry = readdir(dp)) != 0) { if (entry->d_name[0] == '.') continue; fname = folder; fname.append(entry->d_name); if (fname.find(".eml") == string::npos) continue; int validlines = 0; ifstream emailtxt(fname.c_str()); while (!emailtxt.eof()) { memset(szline, 0, 10000); emailtxt.getline(szline,10000); fline = szline; if ((p = fline.find("Date: ")) != string::npos) { fdate = fline.substr(p + 6); validlines++; continue; } if ((p = fline.find("To: ")) != string::npos) { fto = fline.substr(p + 4); p = fto.find('@'); if (p != string::npos) fto.replace(p,1,"@@"); p = fto.find("<"); if (p != string::npos) fto.erase(p,1); p = fto.find(">"); if (p != string::npos) fto.erase(p,1); validlines++; continue; } if ((p = fline.find("Subject: ")) != string::npos) { fsubj = fline.substr(p + 9); validlines++; continue; } if ((p = fline.find("//FLARQ COMPOSER")) != string::npos) validlines++; } emailtxt.close(); if ((!ComposerOnly && validlines >= 3) || (ComposerOnly && validlines == 4)) { tblOutgoing->addRow (4, fname.c_str(), fdate.c_str(), fto.c_str(), fsubj.c_str()); nummails++; } } if (nummails) { tblOutgoing->FirstRow(); outdialog->show(); while (outdialog->shown()) Fl::wait(); } else fl_message2("No emails for delivery"); } //====================================================================================== // simple email composer //====================================================================================== extern bool fileExists(string fname); void cb_CancelComposeMail() { composer->hide(); } void readComposedFile(string filename) { ifstream textfile; textfile.open(filename.c_str()); if (textfile) { char szline[10000]; string fline, tempstr; size_t p; txtbuffComposer->text(""); while (!textfile.eof()) { memset(szline,0, 10000); textfile.getline(szline,10000); fline = szline; if ((p = fline.find("//FLARQ COMPOSER")) != string::npos) continue; if ((p = fline.find("Date: ")) != string::npos) continue; if ((p = fline.find("From:")) != string::npos) continue; if ((p = fline.find("To: ")) != string::npos) { tempstr = fline.substr(p + 4); p = tempstr.find("<"); if (p != string::npos) tempstr.erase(p,1); p = tempstr.find(">"); if (p != string::npos) tempstr.erase(p,1); inpMailTo->value(tempstr.c_str()); continue; } if ((p = fline.find("Subject: ")) != string::npos) { inpMailSubj->value(fline.substr(p + 9).c_str()); continue; } if (strlen(szline) == 0 && txtbuffComposer->length() == 0) continue; txtbuffComposer->append(szline); txtbuffComposer->append("\n"); } textfile.close(); } } void cb_UseTemplate() { string templatename = ARQ_mail_out_dir; const char *p = FSEL::select("Load Template file", "*.tpl", templatename.c_str()); if (!p) return; if (!*p) return; readComposedFile(p); } void cb_ClearComposer() { sendfilename.clear(); txtbuffComposer->text(""); inpMailTo->value(""); inpMailSubj->value(""); } string nextEmailFile(string fname) { int nbr = 0; char szNbr[20]; string name; string ext; string nuname; size_t p; p = fname.find_last_of('.'); if (p != string::npos) { ext = fname.substr(p); name = fname.substr(0,p); } else { ext = ""; name = fname; } do { nbr++; nuname = name; #ifdef __WOE32__ snprintf(szNbr, sizeof(szNbr), "-%-d", nbr); #else snprintf(szNbr, sizeof(szNbr), "%-d", nbr); #endif nuname.append(szNbr); nuname.append(ext); } while (fileExists(nuname)); return nuname; } void saveComposedText(string filename) { ofstream textfile; textfile.open(filename.c_str()); textfile << "//FLARQ COMPOSER" << endl; char szmaildt[100]; time_t maildt = time(NULL); struct tm *gmt = gmtime(&maildt); strftime(szmaildt, sizeof(szmaildt), "%x %X", gmt); textfile << "Date: " << szmaildt << endl; textfile << "To: " << inpMailTo->value() << endl; textfile << "From: " << endl; textfile << "Subject: " << inpMailSubj->value() << endl; textfile << endl << txtbuffComposer->text() << endl; textfile.close(); cb_ClearComposer(); } void SaveComposeMail() { if (strlen(inpMailTo->value()) == 0 || strlen(inpMailSubj->value()) == 0) return; if (sendfilename.empty()) { sendfilename = ARQ_mail_out_dir; sendfilename += "flarqmail.eml"; sendfilename = nextEmailFile(sendfilename); } saveComposedText(sendfilename); } void SaveComposeTemplate() { string templatename = ARQ_mail_out_dir; const char *p = FSEL::saveas("Save Template file", "*.tpl", templatename.c_str()); if (!p) return; if (!*p) return; saveComposedText(p); } void cb_SaveComposeMail() { if (Fl::event_state(FL_SHIFT)) SaveComposeTemplate(); else SaveComposeMail(); } void cb_OpenComposeMail() { sendfilename.clear(); selectTrafficOut(true); if (sendfilename.empty()) return; readComposedFile(sendfilename); } void ComposeMail() { if (composer == 0) { composer = arq_composer(); composer->xclass(PACKAGE_TARNAME); txtbuffComposer = new Fl_Text_Buffer(); txtMailText->buffer(txtbuffComposer); txtMailText->wrap_mode(1,80); } txtbuffComposer->text(""); inpMailTo->value(""); inpMailSubj->value(""); composer->show(); } //====================================================================================== string noCR(string s) { string text = s; size_t p; while ((p = text.find('\r')) != string::npos) text.erase(p,1); return text; } void createAsciiChars() { AsciiChars = ""; AsciiChars += 0x09; // tab AsciiChars += 0x0A; // lf AsciiChars += 0x0D; // cr for (int n = 20; n < 128; n++) AsciiChars += n; } void initVals() { MyCall = "NOCALL"; exponent = digi_arq->getExponent(); iretries = digi_arq->getRetries(); itimeout = digi_arq->getTimeout(); txdelay = digi_arq->getTxDelay(); iwaittime = digi_arq->getWaitTime(); bcnInterval = 30; beacontext = ""; cbMenuConfig(); digi_arq->myCall(MyCall.c_str()); } void testDirectory(string dir) { string tstdir = ARQ_dir; tstdir += '/'; tstdir.append(dir); ifstream test(tstdir.c_str()); if (!test) mkdir(tstdir.c_str(), 0777); else test.close(); } void readConfig() { extern void cbMenuConfig(); string configfname = ARQ_dir; configfname.append("flarq.config"); ifstream configfile(configfname.c_str()); if (configfile) { char tempstr[200]; configfile.getline(tempstr,200); sscanf(tempstr,"%f", &vers); if (int(vers*10) != int(version*10)) initVals(); else { configfile >> MyCall; configfile >> exponent; configfile >> txdelay; configfile >> iretries; configfile >> iwaittime; configfile >> itimeout; configfile >> bcnInterval; configfile >> mainX; configfile >> mainY; configfile >> mainW; configfile >> mainH; configfile.ignore(); configfile.getline(tempstr, 200); beacontext = tempstr; digi_arq->myCall(MyCall.c_str()); digi_arq->setExponent(exponent); digi_arq->setRetries(iretries); digi_arq->setTimeout(itimeout); digi_arq->setTxDelay(txdelay); digi_arq->setWaitTime(iwaittime); } configfile.close(); } else initVals(); } void saveConfig() { string configfname = ARQ_dir; configfname.append("flarq.config"); ofstream configfile(configfname.c_str()); if (configfile) { int mainX = arqwin->x(); int mainY = arqwin->y(); int mainW = arqwin->w(); int mainH = arqwin->h(); configfile << VERSION << endl; configfile << MyCall << endl; configfile << exponent << endl; configfile << txdelay << endl; configfile << iretries << endl; configfile << iwaittime << endl; configfile << itimeout << endl; configfile << bcnInterval << endl; configfile << mainX << endl; configfile << mainY << endl; configfile << mainW << endl; configfile << mainH << endl; configfile << beacontext.c_str() << endl; configfile.close(); } } void cbSetConfig() { digi_arq->setExponent(exponent); digi_arq->setRetries(iretries); digi_arq->setTimeout(itimeout); digi_arq->setTxDelay(txdelay); digi_arq->setWaitTime(iwaittime); } void closeConfig() { if (dlgconfig) dlgconfig->hide(); cbSetConfig(); } void cb_idtimer() { digi_arq->set_idtimer(); } void cbMenuConfig() { if (!dlgconfig) { dlgconfig = arq_configure(); dlgconfig->xclass(PACKAGE_TARNAME); choiceBlockSize->add("16"); choiceBlockSize->add("32"); choiceBlockSize->add("64"); choiceBlockSize->add("128"); choiceBlockSize->add("256"); } choiceBlockSize->index(exponent - 4); choiceBlockSize->redraw(); dlgconfig->show(); } void cbMenuAbout() { fl_message2("flarq - ARQ client\nversion: %s\nw1hkj@@w1hkj.com", VERSION); } string txhold = ""; //============================================================================= void mpsk_on() { string s; s.append(1, MPSK_CMD).append(MPSK_TX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void mpsk_off_after_buffer_sent() { string s; s.append(1, MPSK_CMD).append(MPSK_TX2RX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void mpsk_off() { string s; s.append(1, MPSK_CMD).append(MPSK_RX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void MPSK_client_transmit(const string& s) { if (s.empty()) return; string tosend; tosend.reserve(s.length() * 2); for (size_t i = 0; i < s.length(); i++) tosend.append(1, MPSK_BYTE).append(1, s[i]); try { mpsk_on(); tcpip->send(tosend); mpsk_off_after_buffer_sent(); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void MPSK_Socket_rcv_loop(void *) { if (inLoop) Fl::wait(0.1); inLoop = true; char cs; try { while (tcpip->wait(0)) { tcpip->recv(&cs, 1); if (isRxChar) { rxbuffer += cs; isRxChar = false; continue; } if (isTxChar) { if (cs < 28 || cs > 31) txbuffer += cs; isTxChar = false; continue; } if (isCmdChar) { if (cs == MPSK_CMDEND) { isCmdChar = false; if (cmdbuffer.find("RX_AFTER_TX OK") != string::npos) { rxbuffer += 0x06; cmdbuffer.clear(); txbuffer.clear(); } continue; } cmdbuffer += cs; continue; } if (cs == MPSK_ISRX) { isRxChar = true; continue; } if (cs == MPSK_ISCMD) { isCmdChar = true; continue; } if (cs == MPSK_ISTX) { isTxChar = true; continue; } } } catch (const SocketException& e) { cerr << e.what() << '\n'; } inLoop = false; Fl::add_timeout(0.01, MPSK_Socket_rcv_loop); } //============================================================================= void client_transmit(const string& s ) { try { if (!s.empty()) tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void Socket_rcv_loop(void *) { if (inLoop) Fl::wait(0.1); inLoop = true; try { tcpip->set_nonblocking(true); tcpip->recv(rxbuffer); tcpip->set_nonblocking(false); } catch (const SocketException& e) { cerr << e.what() << '\n'; } inLoop = false; Fl::add_timeout(0.01, Socket_rcv_loop); } bool client_receive(char &c) { if (inLoop) Fl::wait(0.1); inLoop = true; bufsize = rxbuffer.length(); if (bufsize) { if (bufptr < bufsize) { c = rxbuffer[bufptr++]; inLoop = false; return true; } } rxbuffer.clear(); bufsize = 0; bufptr = 0; inLoop = false; return false; } int autobeaconcounter = 0; char bcnMsg[40]; void arqAutoBeacon(void *) { if (autobeacon == true) { int currstate = digi_arq->state(); btnCONNECT->deactivate(); btnCONNECT->redraw(); if (currstate > 0x7F) { txtBeaconing->value("Beaconing"); btnBEACON->deactivate(); btnBEACON->redraw(); Fl::repeat_timeout(1.0, arqAutoBeacon); return; } else if (currstate == DOWN || currstate == TIMEDOUT) { if (autobeaconcounter == 0) { digi_arq->sendBeacon( beacontext ); autobeaconcounter = bcnInterval; Fl::repeat_timeout(1.0 + txdelay / 1000.0, arqAutoBeacon); } else { snprintf(bcnMsg, sizeof(bcnMsg), "Bcn in: %d sec", autobeaconcounter); txtBeaconing->value(bcnMsg); btnBEACON->label("STOP"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); autobeaconcounter--; Fl::repeat_timeout(1.0, arqAutoBeacon); } return; } else { autobeaconcounter = 0; btnBEACON->value(0); btnBEACON->label("Beacon"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); } } else { autobeaconcounter = 0; btnCONNECT->activate(); btnCONNECT->redraw(); btnBEACON->value(0); btnBEACON->label("Beacon"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); } } void arqBEACON() { if (autobeacon == false) { autobeacon = true; Fl::add_timeout(0.01, arqAutoBeacon); } else { autobeacon = false; } } void printstring(string s) { for (size_t n = 0; n < s.length(); n++) if (s[n] < ' ') printf("<%02d>",(int)s[n]); else printf("%c", s[n]); printf("\n"); } void arqCLOSE() { tcpip->close(); saveConfig(); exit_server(); exit(0); } void clearText() { txtarqload = ""; txtbuffARQ->text(""); txtStatus->value(""); txtStatus2->value(""); } void restart() { TX.clear(); rxfname = ""; rxTextReady = false; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); rxARQfile = false; sendingfile = false; incomingText.clear(); clearText(); } void arqCONNECT() { int state = Fl::event_state(); if ((state & FL_CTRL) == FL_CTRL) { digi_arq->restart_arq(); txtURCALL->value(""); restart(); return; } if (digi_arq->state() < ARQ_CONNECTED) { if (strlen(txtURCALL->value()) > 0) digi_arq->connect(txtURCALL->value()); } else { if (rxARQfile || sendingfile) abortTransfer(); else { restart(); digi_arq->disconnect(); txtURCALL->value(""); } } } bool fileExists(string fname) { ifstream test(fname.c_str()); if (test) { test.close(); return true; } return false; } string nextFileName(string fname) { int nbr = 0; char szNbr[20]; string name; string ext; string nuname; size_t p; p = fname.find_last_of('.'); if (p != string::npos) { ext = fname.substr(p); name = fname.substr(0,p); } else { ext = ""; name = fname; } do { nbr++; nuname = name; snprintf(szNbr, sizeof(szNbr), ".dup%-d", nbr); nuname.append(szNbr); nuname.append(ext); } while (fileExists(nuname)); return nuname; } void saveEmailFile() { static char xfrmsg[80]; string tempname; time(&EndTime_t); TransferTime = difftime(EndTime_t, StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); string savetoname = ARQ_mail_in_dir; if (rxfname.find(".eml") == string::npos) rxfname.append(".eml"); savetoname.append(rxfname); while (fileExists(savetoname)) savetoname = nextFileName(savetoname); ofstream tfile(savetoname.c_str(), ios::binary); if (tfile) { tfile << txtarqload; tfile.close(); } txtStatus->value(xfrmsg); rxfname = ""; txtarqload = ""; rxTextReady = false; } void saveRxFile() { static char xfrmsg[80]; time(&EndTime_t); TransferTime = difftime(EndTime_t, StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); string savetoname = ARQ_recv_dir; savetoname.append(rxfname); if (fileExists(savetoname)) savetoname = nextFileName(savetoname); ofstream tfile(savetoname.c_str(), ios::binary); if (tfile) { tfile << txtarqload; tfile.close(); } txtStatus->value(xfrmsg); rxfname = ""; txtarqload = ""; rxTextReady = false; } void payloadText(string s) { static char szPercent[10]; string text = noCR(s); string style; style.append(text.length(), 'A'); stylebufARQ->append(style.c_str()); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); incomingText.append (s); if (!rxARQfile) if ((startpos = incomingText.find(arqstart)) != string::npos) { rxARQfile = true; startpos += arqstart.length(); time(&StartTime_t); } if (rxARQfile) { if (!rxARQhavesize) { if ( (sizepos = incomingText.find(arqsizespec)) != string::npos) { sizepos += arqsizespec.length(); if ((lfpos = incomingText.find('\n', sizepos)) != string::npos) { string sizechars = incomingText.substr(sizepos, lfpos - sizepos); unsigned int tempnbr; sscanf(sizechars.c_str(), "%u", &tempnbr); arqPayloadSize = tempnbr; rxARQhavesize = true; char statusmsg[40]; snprintf(statusmsg, sizeof(statusmsg), "Rcvg: %d", static_cast(arqPayloadSize)); txtStatus->value(statusmsg); } } } else { if (startpos != string::npos) { float partial = incomingText.length() - startpos; snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * partial / arqPayloadSize); prgStatus->value( partial / arqPayloadSize ); prgStatus->label(szPercent); } else { prgStatus->value(0.0); prgStatus->label(""); } prgStatus->redraw(); prgStatus->redraw_label(); } if ((endpos = incomingText.find(arqend)) != string::npos) { haveemail = false; fnamepos = incomingText.find(arqfile); fnamepos += arqfile.length(); indx = incomingText.find('\n', fnamepos); rxfname = incomingText.substr(fnamepos, indx - fnamepos); txtarqload = incomingText.substr(startpos, endpos - startpos); if (incomingText.find(arqbase64) != string::npos) { base64 b64; txtarqload = b64.decode(txtarqload); } if (incomingText.find(arqemail) != string::npos) haveemail = true; startpos = string::npos; endpos = string::npos; fnamepos = string::npos; indx = string::npos; sizepos = string::npos; lfpos = string::npos; arqPayloadSize = 0; rxARQfile = false; rxARQhavesize = false; rxTextReady = true; if (incomingText.find("FLMSG_XFR") != std::string::npos) xml_rx_text_ready = true; incomingText = ""; txtStatus->value(""); prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); } } } void cbClearText() { txtbuffARQ->text(""); } void abortedTransfer() { restart(); txtARQ->insert("transfer aborted\n"); btnCONNECT->activate(); } void abortTransfer() { sendingfile = false; SendingEmail = false; rxARQfile = false; btnCONNECT->label("ABORTING"); btnCONNECT->redraw_label(); btnCONNECT->deactivate(); digi_arq->abort(); } void rxBeaconCallsign(string s) { txtURCALL->value(s.c_str()); beaconrcvd = true; } void moveEmailFile() { if (MailFileName.empty()) return; if (MailSaveFileName.empty()) return; ifstream infile(MailFileName.c_str(), ios::in | ios::binary); if (MailSaveFileName.find(".eml") == string::npos) MailSaveFileName.append(".eml"); while (fileExists(MailSaveFileName)) MailSaveFileName = nextFileName(MailSaveFileName); ofstream outfile(MailSaveFileName.c_str(), ios::out | ios::binary); char c; if (infile && outfile) { while (!infile.eof()) { infile.get(c); outfile.put(c); } infile.close(); outfile.close(); unlink(MailFileName.c_str()); } MailFileName.clear(); MailSaveFileName.clear(); } void sendEmailFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } sendfilename.clear(); selectTrafficOut(false); if (sendfilename.empty()) return; char cin; size_t txtsize; string textin = ""; char sizemsg[40]; size_t p; ifstream textfile; textfile.open(sendfilename.c_str(), ios::binary); if (textfile) { for (size_t i = 0; i < sendfilename.length(); i++) if (sendfilename[i] == '\\') sendfilename[i] = '/'; MailFileName = sendfilename; TX.erase(); TX.append(arqfile); MailSaveFileName = ARQ_mail_sent_dir; p = sendfilename.find_last_of('/'); if (p != string::npos) p++; MailSaveFileName.append(sendfilename.substr(p)); TX.append(sendfilename.substr(p)); TX.append("\n"); TX.append(arqemail); while (textfile.get(cin)) // only allow ASCII printable characters if ((cin >= ' ' && cin <= '~') || (cin == 0x09 || (cin == 0x0a) || cin == 0x0d) ) textin += cin; textfile.close(); txtsize = textin.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(textin); TX.append(arqend); traffic = true; statusmsg = "Sending email: "; statusmsg.append(sendfilename.substr(p)); txtStatus->value(statusmsg.c_str()); SendingEmail = true; sendingfile = true; cbClearText(); return; } traffic = false; sendingfile = false; SendingEmail = false; } void sendAsciiFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } string readfromname = ARQ_send_dir; readfromname.append(rxfname); const char *p = FSEL::select("ARQ text file", "*.txt\t*", readfromname.c_str()); char cin; size_t txtsize; string textin = ""; char sizemsg[40]; if (p && *p) { ifstream textfile; textfile.open(p); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqascii); while (textfile.get(cin)) textin += cin; textfile.close(); if ( textin.find_first_not_of(AsciiChars) != string::npos) { fl_alert2("File contains non-ASCII bytes and must be sent as binary."); return; } txtsize = textin.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(textin); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending ASCII file: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void sendImageFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } const char *p = FSEL::select("ARQ image file", "*.{png,jpg,bmp}\t*", ""); char cin; size_t b64size; string textin = ""; string b64text; base64 b64(true); char sizemsg[40]; if (p && *p) { ifstream textfile; textfile.open(p, ios::binary); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqbase64); while (textfile.get(cin)) textin += cin; textfile.close(); b64text = b64.encode(textin); b64size = b64text.length(); snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(b64size)); arqPayloadSize = b64size; blocksSent = 0; TX.append(sizemsg); TX.append(arqstart); TX.append(b64text); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending image: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void sendBinaryFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } const char *p = FSEL::select("ARQ file", "*", ""); char cin; size_t b64size; string textin = ""; string b64text; base64 b64(true); char sizemsg[40]; if (p && *p) { ifstream textfile; textfile.open(p, ios::binary); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqbase64); while (textfile.get(cin)) textin += cin; textfile.close(); b64text = b64.encode(textin); b64size = b64text.length(); snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(b64size)); arqPayloadSize = b64size; blocksSent = 0; TX.append(sizemsg); TX.append(arqstart); TX.append(b64text); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending binary: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void send_xml_text(std::string fname, std::string txt) { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } size_t txtsize; char sizemsg[40]; if (!txt.empty()) { TX.erase(); TX.append(arqfile); TX.append(fname); TX.append("\n"); TX.append(arqascii); txtsize = txt.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(txt); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending XML payload: "; statusmsg.append(fname); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } traffic = false; sendingfile = false; } char statemsg[80]; void dispState() { int currstate = digi_arq->state(); static char xfrmsg[80]; static char szPercent[10]; arqstate = currstate & 0x7F; if (arqstate == DOWN || arqstate == TIMEDOUT) { if (btnCONNECT->active()) btnCONNECT->label("Connect"); if (!autobeacon) btnBEACON->activate(); // mnuSend->deactivate(); mnu->redraw(); } else if (arqstate == ARQ_CONNECTED || arqstate == WAITING) { if (btnCONNECT->active()) btnCONNECT->label("Disconnect"); if (!autobeacon) btnBEACON->deactivate(); mnuSend->activate(); mnu->redraw(); } if (rxARQfile || sendingfile) { if (btnCONNECT->active()) btnCONNECT->label("Abort"); } if (btnCONNECT->active()) btnCONNECT->redraw_label(); if (currstate <= 0x7F) // receiving switch (currstate) { case ARQ_CONNECTING : snprintf(statemsg, sizeof(statemsg), "CONNECTING: %d", digi_arq->getTimeLeft()); txtState->value(statemsg); txtState->redraw(); autobeacon = false; break; case WAITFORACK : snprintf(statemsg, sizeof(statemsg), "WAITING FOR ACK "); txtState->value(statemsg); txtState->redraw(); autobeacon = false; break; case ABORT: case ABORTING : txtState->value("ABORTING XFR"); txtState->redraw(); autobeacon = false; break; case WAITING : case ARQ_CONNECTED : char szState[80]; snprintf(szState, sizeof(szState),"CONNECTED - Quality = %4.2f", digi_arq->quality()); indCONNECT->color(FL_GREEN); indCONNECT->redraw(); txtState->value(szState); txtURCALL->value( digi_arq->urCall().c_str() ); autobeacon = false; break; case TIMEDOUT : indCONNECT->color(FL_WHITE); indCONNECT->redraw(); txtState->value("TIMED OUT"); txtStatus->value(""); autobeacon = false; beaconrcvd = false; break; case DISCONNECT: case DISCONNECTING: txtState->value("DISCONNECTING"); break; case DOWN : default : indCONNECT->color(FL_WHITE); indCONNECT->redraw(); txtState->value("NOT CONNECTED"); txtStatus->value(""); } if (sendingfile == true) { if (digi_arq->transferComplete()) { time(&EndTime_t); TransferTime = difftime(EndTime_t,StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); txtStatus->value(xfrmsg); blocksSent = 0; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); sendingfile = false; } else { prgStatus->value( digi_arq->percentSent()); snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * digi_arq->percentSent()); prgStatus->label(szPercent); prgStatus->redraw(); prgStatus->redraw_label(); } } if (SendingEmail == true) { if (digi_arq->transferComplete()) { time(&EndTime_t); TransferTime = difftime(EndTime_t,StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); txtStatus->value(xfrmsg); moveEmailFile(); blocksSent = 0; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); SendingEmail = false; } else { prgStatus->value( digi_arq->percentSent()); snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * digi_arq->percentSent()); prgStatus->label(szPercent); prgStatus->redraw(); prgStatus->redraw_label(); } } } void mainloop(void *) { if (traffic) { digi_arq->sendText(TX); traffic = false; time(&StartTime_t); } dispState(); if (rxTextReady) { if (haveemail) saveEmailFile(); else if (!xml_rx_text_ready) saveRxFile(); } Fl::repeat_timeout(0.1, mainloop); } void changeMyCall(const char *nucall) { int currstate = digi_arq->state(); if (currstate != DOWN) return; MyCall = nucall; for (size_t i = 0; i < MyCall.length(); i++) MyCall[i] = toupper(MyCall[i]); txtMyCall->value(MyCall.c_str()); digi_arq->myCall(MyCall.c_str()); string title = "flarq "; title.append(VERSION); title.append(" - "); title.append(MyCall); arqwin->label(title.c_str()); } void changeBeaconText(const char *txt) { beacontext = txt; } void TALKprint(string s) { string style; style.append(s.length(), 'A'); stylebufRX->append(style.c_str()); txtRX->insert(s.c_str()); txtRX->show_insert_position(); txtRX->redraw(); } void clear_STATUS(void* arg) { txtStatus2->value(""); } void STATUSprint(string s, double disptime) { txtStatus2->value(s.c_str()); if (disptime > 0.0) { Fl::remove_timeout( clear_STATUS ); Fl::add_timeout( disptime, clear_STATUS ); } } void cbSendTalk() { string tosend; string style; tosend = txtTX->value(); if (tosend.empty()) return; tosend += '\n'; digi_arq->sendPlainText(tosend); txtTX->value(""); style.append(tosend.length(), 'B'); stylebufRX->append(style.c_str()); txtRX->insert(tosend.c_str()); txtRX->show_insert_position(); txtRX->redraw(); } void arqlog(string nom,string s) { static char szGMT[80]; tm *now; time_t tm; string strdebug; time(&tm); now = localtime( &tm ); strftime(szGMT, sizeof(szGMT), "[%X] ", now); for (unsigned int i = 0; i < s.length(); i++) if (s[i] < 32) strdebug += ASCII[(int)s[i]]; else strdebug += s[i]; ofstream logfile(Logfile.c_str(), ios::app); if (logfile) logfile << nom << szGMT << strdebug << endl; } void DEBUGrxprint(string s) { string style; string text = noCR(s); style.append(text.length(), 'C'); stylebufRX->append(style.c_str()); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); arqlog("",s); } void DEBUGtxprint(string s) { string style; string text = noCR(s); style.append(text.length(), 'D'); stylebufRX->append(style.c_str()); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); arqlog("",s); } void TXecho(string s) { string style; blocksSent += s.length(); string text = noCR(s); style.append(text.length(), 'B'); stylebufARQ->append(style.c_str()); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); } void style_unfinished_cb(int, void*) { } void cbClearTalk() { txtbuffRX->text(""); stylebufRX->text(""); } void cb_arqwin(Fl_Widget *, void*) { arqCLOSE(); } int main (int argc, char *argv[] ) { sscanf(VERSION, "%f", &version); set_unexpected(handle_unexpected); set_terminate(diediedie); setup_signal_handlers(); NBEMS_dir.clear(); { string appname = argv[0]; string appdir = argv[0]; #ifdef __WIN32__ size_t p = appdir.find("FL_APPS\\"); if (p == string::npos) p = appdir.find("FL_APPS/"); if (p == string::npos) { char dirbuf[FL_PATH_MAX + 1]; fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); NBEMS_dir.assign(dirbuf); } else NBEMS_dir.assign(appdir.substr(0, p + 8)); NBEMS_dir.append("NBEMS.files/"); #else char dirbuf[FL_PATH_MAX + 1]; fl_filename_absolute(dirbuf, sizeof(dirbuf), argv[0]); appdir.assign(dirbuf); size_t p = appdir.rfind("flarq"); if (p != string::npos) appdir.erase(p); p = appdir.find("FL_APPS/"); if (p != string::npos) NBEMS_dir.assign(appdir.substr(0, p + 8)); else { fl_filename_expand(dirbuf, FL_PATH_MAX, "$HOME/"); NBEMS_dir = dirbuf; } DIR *isdir = 0; string test_dir; test_dir.assign(NBEMS_dir).append("NBEMS.files/"); isdir = opendir(test_dir.c_str()); if (isdir) { NBEMS_dir = test_dir; closedir(isdir); } else { NBEMS_dir.append(".nbems/"); } #endif HomeDir = NBEMS_dir; } checkdirectories(); Logfile = ARQ_dir; Logfile.append("/").append("arqlog.txt"); set_platform_ui(); generate_option_help(); generate_version_text(); int arg_idx; if (Fl::args(argc, argv, arg_idx, parse_args) != argc) { cerr << PACKAGE_NAME << ": bad option `" << argv[arg_idx] << "'\nTry `" << PACKAGE_NAME << " --help' for more information.\n"; exit(EXIT_FAILURE); } createAsciiChars(); // allowable ASCII text chars for ".txt" type of files FSEL::create(); arqwin = arq_dialog(); arqwin->callback(cb_arqwin); arqwin->xclass(PACKAGE_TARNAME); // FL_NORMAL_SIZE may have changed; update the menu items for (int i = 0; i < menu_mnu->size() - 1; i++) if (menu_mnu[i].text) menu_mnu[i].labelsize(FL_NORMAL_SIZE); txtbuffRX = new Fl_Text_Buffer(); txtRX->buffer(txtbuffRX); txtRX->wrap_mode(1,80); stylebufRX = new Fl_Text_Buffer(); txtRX->highlight_data(stylebufRX, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0); txtbuffARQ = new Fl_Text_Buffer(); txtARQ->buffer(txtbuffARQ); txtARQ->wrap_mode(1,80); stylebufARQ = new Fl_Text_Buffer(); txtARQ->highlight_data(stylebufARQ, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0); digi_arq = new arq(); try { tcpip = new Socket(Address(arq_address.c_str(), arq_port.c_str())); tcpip->set_timeout(0.01); tcpip->connect(); } catch (const SocketException& e) { string errmsg; errmsg.append("Could not connect to modem program.\nPlease start "); if (ioMPSK) errmsg.append("MultiPSK"); else errmsg.append("fldigi"); errmsg.append(" before flarq."); fl_alert2("%s", errmsg.c_str()); exit(EXIT_FAILURE); } if (ioMPSK) Fl::add_timeout(0.1, MPSK_Socket_rcv_loop); else Fl::add_timeout(0.1, Socket_rcv_loop); // the following sequence of assigning callback functions is mandatory // for the arq class to function if (ioMPSK) digi_arq->setSendFunc (MPSK_client_transmit); else digi_arq->setSendFunc (client_transmit); digi_arq->setGetCFunc (client_receive); digi_arq->setAbortedTransfer(abortedTransfer); digi_arq->setDisconnected(restart); digi_arq->setrxUrCall (rxBeaconCallsign); digi_arq->setPrintRX (payloadText); digi_arq->setPrintTX (TXecho); digi_arq->setPrintTALK (TALKprint); digi_arq->setPrintSTATUS (STATUSprint); if (SHOWDEBUG) { digi_arq->setPrintRX_DEBUG (DEBUGrxprint); digi_arq->setPrintTX_DEBUG (DEBUGtxprint); } digi_arq->start_arq(); readConfig(); string title = "flarq "; title.append(VERSION); title.append(" - "); title.append(MyCall); arqwin->label(title.c_str()); arqwin->resize(mainX, mainY, mainW, mainH); txtBeaconing->value("Beacon Off"); Fl::add_timeout(0.1, mainloop); #ifdef __WOE32__ # ifndef IDI_ICON # define IDI_ICON 101 # endif arqwin->icon((char*)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); #elif !defined(__APPLE__) && USE_X make_pixmap(&flarq_icon_pixmap, flarq_icon, argc, argv); arqwin->icon((char *)flarq_icon_pixmap); #endif start_xml_server(FLARQ_XML_PORT); arqwin->show(argc, argv); return Fl::run(); } static void checkdirectories(void) { struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS NBEMS_dirs[] = { { NBEMS_dir, 0, 0 }, { ARQ_dir, "ARQ", 0 }, { ARQ_files_dir, "ARQ/files", 0 }, { ARQ_recv_dir, "ARQ/recv", 0 }, { ARQ_send_dir, "ARQ/send", 0 }, { ARQ_mail_dir, "ARQ/mail", 0 }, { ARQ_mail_in_dir, "ARQ/mail/in", 0 }, { ARQ_mail_out_dir, "ARQ/mail/out", 0 }, { ARQ_mail_sent_dir, "ARQ/mail/sent", 0 }, { WRAP_dir, "WRAP", 0 }, { WRAP_recv_dir, "WRAP/recv", 0 }, { WRAP_send_dir, "WRAP/send", 0 }, { WRAP_auto_dir, "WRAP/auto", 0 }, { ICS_dir, "ICS", 0 }, { ICS_msg_dir, "ICS/messages", 0 }, { ICS_tmp_dir, "ICS/templates", 0 }, }; int r; for (size_t i = 0; i < sizeof(NBEMS_dirs)/sizeof(*NBEMS_dirs); i++) { if (NBEMS_dirs[i].suffix) NBEMS_dirs[i].dir.assign(NBEMS_dir).append(NBEMS_dirs[i].suffix).append("/"); if ((r = mkdir(NBEMS_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { cerr << _("Could not make directory") << ' ' << NBEMS_dirs[i].dir << ": " << strerror(errno) << '\n'; exit(EXIT_FAILURE); } else if (r == 0 && NBEMS_dirs[i].new_dir_func) NBEMS_dirs[i].new_dir_func(); } } // This function may be called by the QRZ thread void cb_mnuVisitURL(Fl_Widget*, void* arg) { const char* url = reinterpret_cast(arg); #ifndef __WOE32__ const char* browsers[] = { # ifdef __APPLE__ getenv("FLDIGI_BROWSER"), // valid for any OS - set by user "open" // OS X # else "fl-xdg-open", // Puppy Linux "xdg-open", // other Unix-Linux distros getenv("FLDIGI_BROWSER"), // force use of spec'd browser getenv("BROWSER"), // most Linux distributions "sensible-browser", "firefox", "mozilla" // must be something out there! # endif }; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif for (size_t i = 0; i < sizeof(browsers)/sizeof(browsers[0]); i++) if (browsers[i]) execlp(browsers[i], browsers[i], url, (char*)0); exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not run a web browser:\n%s\n\n" "Open this URL manually:\n%s"), strerror(errno), url); } #else // gurgle... gurgle... HOWL // "The return value is cast as an HINSTANCE for backward // compatibility with 16-bit Windows applications. It is // not a true HINSTANCE, however. The only thing that can // be done with the returned HINSTANCE is to cast it to an // int and compare it with the value 32 or one of the error // codes below." (Error codes omitted to preserve sanity). if ((int)ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL) <= 32) fl_alert2(_("Could not open url:\n%s\n"), url); #endif } void open_nbems_file_folder() { cb_mnuVisitURL(0, (void*)NBEMS_dir.c_str()); } fldigi-4.1.06/src/flarq-src/b64.cxx0000644000175000017500000001253513472116001013562 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- //===================================================================== // // base64 encoding / decoding class // // To create a standalone base64 encode/coder: // g++ -DTEST b64.cxx -o base64 // // To use in a calling program: // // base64 b64; // default no CRLF's in output file // base 64 b64(true); // insert CRLF's in output file // pass c++ string into encoder / decoder // return value is encoded / decoded string // original string is left unchanged // // string instr, outstr; // outstr = b64.encoder(instr); // outstr = b64.decoder(instr); //===================================================================== #ifdef HAVE_CONFIG_H # include #endif #include "b64.h" void base64::init() { iolen = 0; iocp = 0; ateof = false; linelength = 0; // create the etable for encoding for (int i = 0; i < 9; i++) { etable[i] = 'A' + i; etable[i + 9] = 'J' + i; etable[26 + i] = 'a' + i; etable[26 + i + 9] = 'j' + i; } for (int i = 0; i < 8; i++) { etable[i + 18] = 'S' + i; etable[26 + i + 18] = 's' + i; } for (int i = 0; i < 10; i++) etable[52 + i] = '0' + i; etable[62] = '+'; etable[63] = '/'; // create the dtable for decoding for (int i= 0; i < 255; i++) dtable[i] = 0x80; for (int i = 'A'; i <= 'I'; i++) dtable[i] = 0 + (i - 'A'); for (int i = 'J'; i <= 'R'; i++) dtable[i] = 9 + (i - 'J'); for (int i = 'S'; i <= 'Z'; i++) dtable[i] = 18 + (i - 'S'); for (int i = 'a'; i <= 'i'; i++) dtable[i] = 26 + (i - 'a'); for (int i = 'j'; i <= 'r'; i++) dtable[i] = 35 + (i - 'j'); for (int i = 's'; i <= 'z'; i++) dtable[i] = 44 + (i - 's'); for (int i = '0'; i <= '9'; i++) dtable[i] = 52 + (i - '0'); dtable[(int)'+'] = 62; dtable[(int)'/'] = 63; dtable[(int)'='] = 0; } string base64::encode(string in) { int n; byte igroup[3], ogroup[4]; output = ""; iocp = 0; ateof = false; if (crlf) linelength = 0; iolen = in.length(); while (!ateof) { igroup[0] = igroup[1] = igroup[2] = 0; for (n = 0; n < 3; n++) { if (iocp == iolen) { ateof = true; break; } igroup[n] = (byte)in[iocp]; iocp++; } if (n > 0) { ogroup[0] = etable[igroup[0] >> 2]; ogroup[1] = etable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; ogroup[2] = etable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; ogroup[3] = etable[igroup[2] & 0x3F]; if (n < 2) { ogroup[2] = '='; if (n < 1) { ogroup[2] = '='; } } for (int i = 0; i < 4; i++) { if (crlf) if (linelength >= LINELEN) { // output += '\r'; output += '\n'; linelength = 0; } output += (byte)ogroup[i]; if (crlf) linelength++; } } } if (crlf) { // output += '\r'; output += '\n'; } return output; } string base64::decode(string in) { int i; output = ""; iocp = 0; iolen = in.length(); byte c; while (iocp < iolen) { byte a[4], b[4], o[3]; for (i = 0; i < 4; i++) { if (iocp == iolen) { output = "b64 file length error.\n"; return output; } c = in[iocp++]; while (c <= ' ') { if (iocp == iolen) { return output; } c = in[iocp++]; } if (dtable[c] & 0x80) { output = "Illegal character in b64 file.\n"; return output; } a[i] = c; b[i] = (byte)dtable[c]; } o[0] = (b[0] << 2) | (b[1] >> 4); o[1] = (b[1] << 4) | (b[2] >> 2); o[2] = (b[2] << 6) | b[3]; output += o[0]; if (a[2] != '=') { output += o[1]; if (a[3] != '=') output += o[2]; } } return output; } #ifdef TEST #include #include void usage(void) { printf("b64 -- Encode/decode file as base64. Call:\n"); printf(" b64 e/d < infile > outfile\n"); } int main(int argc,char*argv[]) { char opt; bool decoding = false; char * cp; byte c; string inputstring; string infilename; string outputstring; string outfilename; base64 b64; if (argc < 2) { usage(); return(0); } opt = *(argv[1]); if (opt == 'd' || opt == 'D') { while (!std::cin.eof()) { c = std::cin.get(); if (!std::cin.eof()) inputstring += c; } outputstring = b64.decode( inputstring ); size_t len = outputstring.length(); for (size_t n = 0; n < len; n++) std::cout << (unsigned char)outputstring[n]; } else if (opt == 'e' || opt == 'E') { while (!std::cin.eof()) { c = std::cin.get(); if (!std::cin.eof()) inputstring += c; } outputstring = b64.encode( inputstring ); size_t len = outputstring.length(); for (size_t n = 0; n < len; n++) std::cout << (unsigned char)outputstring[n]; } else usage(); return 0; } #endif fldigi-4.1.06/src/flarq-src/arqdialogs.fl0000644000175000017500000002450113472116001015110 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include "flarq.h"} {private local } decl {\#include "flinput2.h"} {public local } decl {\#include "flslider2.h"} {public local } decl {\#include "combo.h"} {public local } Function {arq_dialog()} {open } { Fl_Window {} { label flarq callback {arqCLOSE();} xywh {825 38 515 415} type Double color 50 resizable visible } { Fl_Menu_Bar mnu {open xywh {0 0 516 22} } { Submenu {} { label {&File} open xywh {0 0 70 21} } { MenuItem mnu_nbems_files { label {NBEMS files} callback {open_nbems_file_folder();} xywh {0 0 36 20} divider } MenuItem mnuExit { label {E&xit} callback {arqCLOSE();} xywh {0 0 36 21} } } Submenu mnuSend { label {&Send} open xywh {0 0 70 21} } { MenuItem mnuSendEmail { label Email callback {sendEmailFile();} xywh {0 0 34 21} } MenuItem mnuSendText { label {Text File} callback {sendAsciiFile();} xywh {0 0 36 21} } MenuItem mnuSendImage { label {Image File} callback {sendImageFile();} xywh {0 0 36 21} } MenuItem mnuSendBinary { label {Binary File} callback {sendBinaryFile();} xywh {0 0 36 21} } } MenuItem mnuCompose { label Compose callback {ComposeMail();} xywh {0 0 30 20} code0 {extern void ComposeMail();} } MenuItem mnuConfig { label {&Config} callback {cbMenuConfig();} xywh {0 0 36 21} code0 {extern void cbMenuConfig();} } Submenu mnuHelp { label {&Help} open xywh {0 0 62 20} } { MenuItem mnuHowTo { label {How To} callback {help_cb();} xywh {0 0 30 20} } MenuItem mnuAbout { label {&About} callback {cbMenuAbout();} xywh {5 5 36 21} code0 {extern void cbMenuAbout();} } } } Fl_Group {} {open xywh {0 25 515 60} } { Fl_Group {} {open xywh {0 25 515 31} box ENGRAVED_FRAME } { Fl_Button btnCONNECT { label Connnect callback {arqCONNECT();} tooltip {Connect to other station} xywh {5 28 90 24} color 50 } Fl_Input txtURCALL { tooltip {Connect-to callsign} xywh {97 28 70 24} align 20 class Fl_Input2 } Fl_Light_Button btnBEACON { label Beacon callback {arqBEACON();} tooltip {Beacon ON / OFF} xywh {168 28 79 24} selection_color 2 } Fl_Output txtBeaconing { label {output:} xywh {249 28 261 24} box FLAT_BOX color 50 align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } } Fl_Group {} {open xywh {0 54 515 31} box ENGRAVED_FRAME } { Fl_Box indCONNECT { tooltip {ARQ state} xywh {5 60 18 18} box DIAMOND_DOWN_BOX color 50 labelfont 13 align 24 } Fl_Output txtState { label Disconnecting xywh {27 57 483 24} box FLAT_BOX color 50 align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } } } Fl_Text_Display txtARQ { xywh {0 87 515 117} box DOWN_BOX textfont 4 resizable } Fl_Group {} {open xywh {0 206 516 26} box DOWN_BOX } { Fl_Output txtStatus { tooltip {Status messages} xywh {5 208 220 22} align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } Fl_Output txtStatus2 { xywh {225 208 170 22} align 20 code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } Fl_Progress prgStatus { tooltip {Tx/Rx ARQ file transfer progress} xywh {395 210 70 18} selection_color 70 labelfont 1 code0 {o->minimum(0.0);} code1 {o->maximum(1.0);} } Fl_Button btnClearText { label Clear callback {cbClearText();} xywh {468 210 45 20} } } Fl_Group {} { label {Plain Talk} open xywh {0 235 515 180} box ENGRAVED_FRAME align 21 } { Fl_Text_Display txtRX { xywh {5 255 505 130} box DOWN_BOX textfont 4 resizable } Fl_Group {} {open xywh {0 387 515 28} box ENGRAVED_FRAME } { Fl_Input txtTX { label {input:} callback {cbSendTalk();} tooltip {Plain talk text - ENTER to send} xywh {5 390 450 22} align 0 when 8 resizable code0 {txtTX->value("");} code1 {txtTX->maximum_size(80);} class Fl_Input2 } Fl_Button btnSendTalk { label Clear callback {cbClearTalk();} xywh {460 390 49 22} } } } } } Function {arq_configure()} {open } { Fl_Window {} { label {Configure flarq} open xywh {741 499 480 190} type Double resizable visible } { Fl_Input txtMyCall { label {My Call:} callback {changeMyCall(o->value());} xywh {98 13 150 24} code0 {o->value(MyCall.c_str());} class Fl_Input2 } Fl_Input txtBEACONTXT { label {Beacon Text} callback {changeBeaconText(o->value());} tooltip {Text for the beacon 64 chars max} xywh {98 42 370 24} resizable code0 {o->value(beacontext.c_str());} class Fl_Input2 } Fl_Spinner spnRetries { label {Retries:} callback {iretries = (int)o->value(); cbSetConfig();} selected tooltip {\# retries before connection declared down} xywh {146 71 45 22} code0 {o->minimum(2);} code1 {o->maximum(20);} code2 {o->step(1);} code3 {o->value(iretries);} class Fl_Spinner2 } Fl_Spinner spnWaitTime { label {Wait time (sec):} callback {iwaittime = (int)(1000 * o->value()); cbSetConfig();} tooltip {Time between retries} xywh {121 98 70 22} code0 {o->minimum(10);} code1 {o->maximum(30);} code2 {o->step(5);} code3 {o->value(iwaittime/1000);} class Fl_Spinner2 } Fl_Spinner spnTimeout { label {Timeout (sec):} callback {itimeout = (int)(o->value() * 1000.0); cbSetConfig();} tooltip {Time out for dead connection} xywh {121 126 70 22} code0 {o->minimum(30);} code1 {o->maximum(300);} code2 {o->step(15);} code3 {o->value(itimeout / 1000);} class Fl_Spinner2 } Fl_Spinner spnTxDelay { label {Tx delay (msec):} callback {txdelay = (int)o->value(); cbSetConfig();} tooltip {delay from Rx to Tx} xywh {317 98 70 22} code0 {o->minimum(200);} code1 {o->maximum(2000);} code2 {o->step(100);} code3 {o->value(txdelay);} class Fl_Spinner2 } Fl_Spinner spnBcnInterval { label {Beacon interval (sec)} callback {bcnInterval = (int)o->value(); cbSetConfig();} tooltip {Time between beacon transmissions} xywh {398 71 70 22} value 120 code0 {o->minimum(60); o->maximum(3600);} code1 {o->step(30);} code2 {o->value(bcnInterval);} class Fl_Spinner2 } Fl_Spinner spnIDtimer { label {ID timer (min):} callback {idtimer = (int)(o->value()); cb_idtimer();} tooltip {ID timer\\n0 = disable} xywh {121 155 70 22} minimum 0 maximum 10 code0 {o->minimum(0);} code1 {o->maximum(10);} code2 {o->step(1);} code3 {o->value(idtimer);} class Fl_Spinner2 } Fl_Group choiceBlockSize { label {Block Size:} callback {exponent = (int)o->index() + 4; cbSetConfig();} open xywh {314 126 72 24} box DOWN_BOX color 7 align 4 class Fl_ComboBox } {} Fl_Button btnOK { label Ok callback {closeConfig();} xywh {406 154 62 24} } } } Function {arq_SendSelect()} {} { Fl_Window {} { label {Select Email} open xywh {768 532 500 170} type Double hide resizable modal } { Fl_Box tblOutgoing { xywh {0 3 500 140} box DOWN_BOX color 7 selection_color 246 align 16 code0 {\#include "table.h"} class Table } Fl_Button send_Cancel { label Cancel callback {sendCancel();} xywh {335 145 70 20} code0 {extern void sendCancel();} } Fl_Return_Button send_OK { label OK callback {sendOK();} xywh {420 145 72 20} code0 {extern void sendOK();} } } } Function {arq_composer()} {} { Fl_Window {} { label {Flarq Mail Composer} open xywh {575 537 515 275} type Double hide resizable } { Fl_Input inpMailTo { label {To:} xywh {48 4 460 24} class Fl_Input2 } Fl_Input inpMailSubj { label {Subj:} xywh {48 30 460 24} class Fl_Input2 } Fl_Text_Editor txtMailText { xywh {0 56 510 188} resizable } Fl_Pack {} {open xywh {0 247 515 28} type HORIZONTAL } { Fl_Button btnOpenComposedMail { label Open callback {cb_OpenComposeMail();} tooltip {Open existing Composed email} xywh {4 251 70 20} code0 {extern void cb_OpenComposeMail();} } Fl_Box {} { xywh {75 251 5 20} } Fl_Button btnClearComposer { label Clear callback {cb_ClearComposer();} tooltip {Clear all fields} xywh {81 251 70 20} code0 {extern void cb_ClearComposer();} } Fl_Box {} { xywh {152 251 5 20} } Fl_Button btnUseTemplate { label Template callback {cb_UseTemplate();} tooltip {Use template file} xywh {159 251 70 20} code0 {extern void cb_UseTemplate();} } Fl_Box {} { xywh {230 251 127 20} resizable } Fl_Button btnCancelComposedMail { label Cancel callback {cb_CancelComposeMail();} tooltip {Close Dialog} xywh {358 251 70 20} code0 {extern void cb_CancelComposeMail();} } Fl_Box {} { xywh {429 251 5 20} } Fl_Button btnSaveComposedMail { label Save callback {cb_SaveComposeMail();} tooltip {Save this message (shift click Save Template)} xywh {436 251 70 20} code0 {extern void cb_SaveComposeMail();} } } } } fldigi-4.1.06/src/flarq-src/arqdialogs.cxx0000644000175000017500000005476413511627773015350 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "arqdialogs.h" #include #include #include "flarq.h" static void cb_flarq(Fl_Double_Window*, void*) { arqCLOSE(); } Fl_Menu_Bar *mnu=(Fl_Menu_Bar *)0; static void cb_mnu_nbems_files(Fl_Menu_*, void*) { open_nbems_file_folder(); } static void cb_mnuExit(Fl_Menu_*, void*) { arqCLOSE(); } static void cb_mnuSendEmail(Fl_Menu_*, void*) { sendEmailFile(); } static void cb_mnuSendText(Fl_Menu_*, void*) { sendAsciiFile(); } static void cb_mnuSendImage(Fl_Menu_*, void*) { sendImageFile(); } static void cb_mnuSendBinary(Fl_Menu_*, void*) { sendBinaryFile(); } static void cb_mnuCompose(Fl_Menu_*, void*) { ComposeMail(); } static void cb_mnuConfig(Fl_Menu_*, void*) { cbMenuConfig(); } static void cb_mnuHowTo(Fl_Menu_*, void*) { help_cb(); } static void cb_mnuAbout(Fl_Menu_*, void*) { cbMenuAbout(); } Fl_Menu_Item menu_mnu[] = { {"&File", 0, 0, 0, 64, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"NBEMS files", 0, (Fl_Callback*)cb_mnu_nbems_files, 0, 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"E&xit", 0, (Fl_Callback*)cb_mnuExit, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"&Send", 0, 0, 0, 64, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Email", 0, (Fl_Callback*)cb_mnuSendEmail, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Text File", 0, (Fl_Callback*)cb_mnuSendText, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Image File", 0, (Fl_Callback*)cb_mnuSendImage, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Binary File", 0, (Fl_Callback*)cb_mnuSendBinary, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Compose", 0, (Fl_Callback*)cb_mnuCompose, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"&Config", 0, (Fl_Callback*)cb_mnuConfig, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"&Help", 0, 0, 0, 64, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"How To", 0, (Fl_Callback*)cb_mnuHowTo, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"&About", 0, (Fl_Callback*)cb_mnuAbout, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} }; Fl_Button *btnCONNECT=(Fl_Button *)0; static void cb_btnCONNECT(Fl_Button*, void*) { arqCONNECT(); } Fl_Input2 *txtURCALL=(Fl_Input2 *)0; Fl_Light_Button *btnBEACON=(Fl_Light_Button *)0; static void cb_btnBEACON(Fl_Light_Button*, void*) { arqBEACON(); } Fl_Input2 *txtBeaconing=(Fl_Input2 *)0; Fl_Box *indCONNECT=(Fl_Box *)0; Fl_Input2 *txtState=(Fl_Input2 *)0; Fl_Text_Display *txtARQ=(Fl_Text_Display *)0; Fl_Input2 *txtStatus=(Fl_Input2 *)0; Fl_Input2 *txtStatus2=(Fl_Input2 *)0; Fl_Progress *prgStatus=(Fl_Progress *)0; Fl_Button *btnClearText=(Fl_Button *)0; static void cb_btnClearText(Fl_Button*, void*) { cbClearText(); } Fl_Text_Display *txtRX=(Fl_Text_Display *)0; Fl_Input2 *txtTX=(Fl_Input2 *)0; static void cb_txtTX(Fl_Input2*, void*) { cbSendTalk(); } Fl_Button *btnSendTalk=(Fl_Button *)0; static void cb_btnSendTalk(Fl_Button*, void*) { cbClearTalk(); } Fl_Double_Window* arq_dialog() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(515, 415, "flarq"); w = o; if (w) {/* empty */} o->color(FL_LIGHT1); o->callback((Fl_Callback*)cb_flarq); { mnu = new Fl_Menu_Bar(0, 0, 516, 22); mnu->menu(menu_mnu); } // Fl_Menu_Bar* mnu { Fl_Group* o = new Fl_Group(0, 25, 515, 60); { Fl_Group* o = new Fl_Group(0, 25, 515, 31); o->box(FL_ENGRAVED_FRAME); { btnCONNECT = new Fl_Button(5, 28, 90, 24, "Connnect"); btnCONNECT->tooltip("Connect to other station"); btnCONNECT->color(FL_LIGHT1); btnCONNECT->callback((Fl_Callback*)cb_btnCONNECT); } // Fl_Button* btnCONNECT { txtURCALL = new Fl_Input2(97, 28, 70, 24); txtURCALL->tooltip("Connect-to callsign"); txtURCALL->box(FL_DOWN_BOX); txtURCALL->color(FL_BACKGROUND2_COLOR); txtURCALL->selection_color(FL_SELECTION_COLOR); txtURCALL->labeltype(FL_NORMAL_LABEL); txtURCALL->labelfont(0); txtURCALL->labelsize(14); txtURCALL->labelcolor(FL_FOREGROUND_COLOR); txtURCALL->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtURCALL->when(FL_WHEN_RELEASE); } // Fl_Input2* txtURCALL { btnBEACON = new Fl_Light_Button(168, 28, 79, 24, "Beacon"); btnBEACON->tooltip("Beacon ON / OFF"); btnBEACON->selection_color((Fl_Color)2); btnBEACON->callback((Fl_Callback*)cb_btnBEACON); } // Fl_Light_Button* btnBEACON { Fl_Input2* o = txtBeaconing = new Fl_Input2(249, 28, 261, 24, "output:"); txtBeaconing->box(FL_FLAT_BOX); txtBeaconing->color(FL_LIGHT1); txtBeaconing->selection_color(FL_SELECTION_COLOR); txtBeaconing->labeltype(FL_NORMAL_LABEL); txtBeaconing->labelfont(0); txtBeaconing->labelsize(14); txtBeaconing->labelcolor(FL_FOREGROUND_COLOR); txtBeaconing->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtBeaconing->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtBeaconing); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtBeaconing o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 54, 515, 31); o->box(FL_ENGRAVED_FRAME); { indCONNECT = new Fl_Box(5, 60, 18, 18); indCONNECT->tooltip("ARQ state"); indCONNECT->box(FL_DIAMOND_DOWN_BOX); indCONNECT->color(FL_LIGHT1); indCONNECT->labelfont(13); indCONNECT->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE)); } // Fl_Box* indCONNECT { Fl_Input2* o = txtState = new Fl_Input2(27, 57, 483, 24, "Disconnecting"); txtState->box(FL_FLAT_BOX); txtState->color(FL_LIGHT1); txtState->selection_color(FL_SELECTION_COLOR); txtState->labeltype(FL_NORMAL_LABEL); txtState->labelfont(0); txtState->labelsize(14); txtState->labelcolor(FL_FOREGROUND_COLOR); txtState->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtState->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtState); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtState o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { txtARQ = new Fl_Text_Display(0, 87, 515, 117); txtARQ->box(FL_DOWN_BOX); txtARQ->textfont(4); Fl_Group::current()->resizable(txtARQ); } // Fl_Text_Display* txtARQ { Fl_Group* o = new Fl_Group(0, 206, 516, 26); o->box(FL_DOWN_BOX); { Fl_Input2* o = txtStatus = new Fl_Input2(5, 208, 220, 22); txtStatus->tooltip("Status messages"); txtStatus->box(FL_DOWN_BOX); txtStatus->color(FL_BACKGROUND2_COLOR); txtStatus->selection_color(FL_SELECTION_COLOR); txtStatus->labeltype(FL_NORMAL_LABEL); txtStatus->labelfont(0); txtStatus->labelsize(14); txtStatus->labelcolor(FL_FOREGROUND_COLOR); txtStatus->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtStatus->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtStatus); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtStatus { Fl_Input2* o = txtStatus2 = new Fl_Input2(225, 208, 170, 22); txtStatus2->box(FL_DOWN_BOX); txtStatus2->color(FL_BACKGROUND2_COLOR); txtStatus2->selection_color(FL_SELECTION_COLOR); txtStatus2->labeltype(FL_NORMAL_LABEL); txtStatus2->labelfont(0); txtStatus2->labelsize(14); txtStatus2->labelcolor(FL_FOREGROUND_COLOR); txtStatus2->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtStatus2->when(FL_WHEN_RELEASE); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtStatus2 { Fl_Progress* o = prgStatus = new Fl_Progress(395, 210, 70, 18); prgStatus->tooltip("Tx/Rx ARQ file transfer progress"); prgStatus->selection_color((Fl_Color)70); prgStatus->labelfont(1); o->minimum(0.0); o->maximum(1.0); } // Fl_Progress* prgStatus { btnClearText = new Fl_Button(468, 210, 45, 20, "Clear"); btnClearText->callback((Fl_Callback*)cb_btnClearText); } // Fl_Button* btnClearText o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 235, 515, 180, "Plain Talk"); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { txtRX = new Fl_Text_Display(5, 255, 505, 130); txtRX->box(FL_DOWN_BOX); txtRX->textfont(4); Fl_Group::current()->resizable(txtRX); } // Fl_Text_Display* txtRX { Fl_Group* o = new Fl_Group(0, 387, 515, 28); o->box(FL_ENGRAVED_FRAME); { txtTX = new Fl_Input2(5, 390, 450, 22, "input:"); txtTX->tooltip("Plain talk text - ENTER to send"); txtTX->box(FL_DOWN_BOX); txtTX->color(FL_BACKGROUND2_COLOR); txtTX->selection_color(FL_SELECTION_COLOR); txtTX->labeltype(FL_NORMAL_LABEL); txtTX->labelfont(0); txtTX->labelsize(14); txtTX->labelcolor(FL_FOREGROUND_COLOR); txtTX->callback((Fl_Callback*)cb_txtTX); txtTX->align(Fl_Align(FL_ALIGN_CENTER)); txtTX->when(FL_WHEN_ENTER_KEY); Fl_Group::current()->resizable(txtTX); txtTX->value(""); txtTX->maximum_size(80); } // Fl_Input2* txtTX { btnSendTalk = new Fl_Button(460, 390, 49, 22, "Clear"); btnSendTalk->callback((Fl_Callback*)cb_btnSendTalk); } // Fl_Button* btnSendTalk o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; } Fl_Input2 *txtMyCall=(Fl_Input2 *)0; static void cb_txtMyCall(Fl_Input2* o, void*) { changeMyCall(o->value()); } Fl_Input2 *txtBEACONTXT=(Fl_Input2 *)0; static void cb_txtBEACONTXT(Fl_Input2* o, void*) { changeBeaconText(o->value()); } Fl_Spinner2 *spnRetries=(Fl_Spinner2 *)0; static void cb_spnRetries(Fl_Spinner2* o, void*) { iretries = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnWaitTime=(Fl_Spinner2 *)0; static void cb_spnWaitTime(Fl_Spinner2* o, void*) { iwaittime = (int)(1000 * o->value()); cbSetConfig(); } Fl_Spinner2 *spnTimeout=(Fl_Spinner2 *)0; static void cb_spnTimeout(Fl_Spinner2* o, void*) { itimeout = (int)(o->value() * 1000.0); cbSetConfig(); } Fl_Spinner2 *spnTxDelay=(Fl_Spinner2 *)0; static void cb_spnTxDelay(Fl_Spinner2* o, void*) { txdelay = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnBcnInterval=(Fl_Spinner2 *)0; static void cb_spnBcnInterval(Fl_Spinner2* o, void*) { bcnInterval = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnIDtimer=(Fl_Spinner2 *)0; static void cb_spnIDtimer(Fl_Spinner2* o, void*) { idtimer = (int)(o->value()); cb_idtimer(); } Fl_ComboBox *choiceBlockSize=(Fl_ComboBox *)0; static void cb_choiceBlockSize(Fl_ComboBox* o, void*) { exponent = (int)o->index() + 4; cbSetConfig(); } Fl_Button *btnOK=(Fl_Button *)0; static void cb_btnOK(Fl_Button*, void*) { closeConfig(); } Fl_Double_Window* arq_configure() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(480, 190, "Configure flarq"); w = o; if (w) {/* empty */} { Fl_Input2* o = txtMyCall = new Fl_Input2(98, 13, 150, 24, "My Call:"); txtMyCall->box(FL_DOWN_BOX); txtMyCall->color(FL_BACKGROUND2_COLOR); txtMyCall->selection_color(FL_SELECTION_COLOR); txtMyCall->labeltype(FL_NORMAL_LABEL); txtMyCall->labelfont(0); txtMyCall->labelsize(14); txtMyCall->labelcolor(FL_FOREGROUND_COLOR); txtMyCall->callback((Fl_Callback*)cb_txtMyCall); txtMyCall->align(Fl_Align(FL_ALIGN_LEFT)); txtMyCall->when(FL_WHEN_RELEASE); o->value(MyCall.c_str()); } // Fl_Input2* txtMyCall { Fl_Input2* o = txtBEACONTXT = new Fl_Input2(98, 42, 370, 24, "Beacon Text"); txtBEACONTXT->tooltip("Text for the beacon 64 chars max"); txtBEACONTXT->box(FL_DOWN_BOX); txtBEACONTXT->color(FL_BACKGROUND2_COLOR); txtBEACONTXT->selection_color(FL_SELECTION_COLOR); txtBEACONTXT->labeltype(FL_NORMAL_LABEL); txtBEACONTXT->labelfont(0); txtBEACONTXT->labelsize(14); txtBEACONTXT->labelcolor(FL_FOREGROUND_COLOR); txtBEACONTXT->callback((Fl_Callback*)cb_txtBEACONTXT); txtBEACONTXT->align(Fl_Align(FL_ALIGN_LEFT)); txtBEACONTXT->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtBEACONTXT); o->value(beacontext.c_str()); } // Fl_Input2* txtBEACONTXT { Fl_Spinner2* o = spnRetries = new Fl_Spinner2(146, 71, 45, 22, "Retries:"); spnRetries->tooltip("# retries before connection declared down"); spnRetries->box(FL_NO_BOX); spnRetries->color(FL_BACKGROUND_COLOR); spnRetries->selection_color(FL_BACKGROUND_COLOR); spnRetries->labeltype(FL_NORMAL_LABEL); spnRetries->labelfont(0); spnRetries->labelsize(14); spnRetries->labelcolor(FL_FOREGROUND_COLOR); spnRetries->callback((Fl_Callback*)cb_spnRetries); spnRetries->align(Fl_Align(FL_ALIGN_LEFT)); spnRetries->when(FL_WHEN_RELEASE); o->minimum(2); o->maximum(20); o->step(1); o->value(iretries); } // Fl_Spinner2* spnRetries { Fl_Spinner2* o = spnWaitTime = new Fl_Spinner2(121, 98, 70, 22, "Wait time (sec):"); spnWaitTime->tooltip("Time between retries"); spnWaitTime->box(FL_NO_BOX); spnWaitTime->color(FL_BACKGROUND_COLOR); spnWaitTime->selection_color(FL_BACKGROUND_COLOR); spnWaitTime->labeltype(FL_NORMAL_LABEL); spnWaitTime->labelfont(0); spnWaitTime->labelsize(14); spnWaitTime->labelcolor(FL_FOREGROUND_COLOR); spnWaitTime->callback((Fl_Callback*)cb_spnWaitTime); spnWaitTime->align(Fl_Align(FL_ALIGN_LEFT)); spnWaitTime->when(FL_WHEN_RELEASE); o->minimum(10); o->maximum(30); o->step(5); o->value(iwaittime/1000); } // Fl_Spinner2* spnWaitTime { Fl_Spinner2* o = spnTimeout = new Fl_Spinner2(121, 126, 70, 22, "Timeout (sec):"); spnTimeout->tooltip("Time out for dead connection"); spnTimeout->box(FL_NO_BOX); spnTimeout->color(FL_BACKGROUND_COLOR); spnTimeout->selection_color(FL_BACKGROUND_COLOR); spnTimeout->labeltype(FL_NORMAL_LABEL); spnTimeout->labelfont(0); spnTimeout->labelsize(14); spnTimeout->labelcolor(FL_FOREGROUND_COLOR); spnTimeout->callback((Fl_Callback*)cb_spnTimeout); spnTimeout->align(Fl_Align(FL_ALIGN_LEFT)); spnTimeout->when(FL_WHEN_RELEASE); o->minimum(30); o->maximum(300); o->step(15); o->value(itimeout / 1000); } // Fl_Spinner2* spnTimeout { Fl_Spinner2* o = spnTxDelay = new Fl_Spinner2(317, 98, 70, 22, "Tx delay (msec):"); spnTxDelay->tooltip("delay from Rx to Tx"); spnTxDelay->box(FL_NO_BOX); spnTxDelay->color(FL_BACKGROUND_COLOR); spnTxDelay->selection_color(FL_BACKGROUND_COLOR); spnTxDelay->labeltype(FL_NORMAL_LABEL); spnTxDelay->labelfont(0); spnTxDelay->labelsize(14); spnTxDelay->labelcolor(FL_FOREGROUND_COLOR); spnTxDelay->callback((Fl_Callback*)cb_spnTxDelay); spnTxDelay->align(Fl_Align(FL_ALIGN_LEFT)); spnTxDelay->when(FL_WHEN_RELEASE); o->minimum(200); o->maximum(2000); o->step(100); o->value(txdelay); } // Fl_Spinner2* spnTxDelay { Fl_Spinner2* o = spnBcnInterval = new Fl_Spinner2(398, 71, 70, 22, "Beacon interval (sec)"); spnBcnInterval->tooltip("Time between beacon transmissions"); spnBcnInterval->box(FL_NO_BOX); spnBcnInterval->color(FL_BACKGROUND_COLOR); spnBcnInterval->selection_color(FL_BACKGROUND_COLOR); spnBcnInterval->labeltype(FL_NORMAL_LABEL); spnBcnInterval->labelfont(0); spnBcnInterval->labelsize(14); spnBcnInterval->labelcolor(FL_FOREGROUND_COLOR); spnBcnInterval->value(120); spnBcnInterval->callback((Fl_Callback*)cb_spnBcnInterval); spnBcnInterval->align(Fl_Align(FL_ALIGN_LEFT)); spnBcnInterval->when(FL_WHEN_RELEASE); o->minimum(60); o->maximum(3600); o->step(30); o->value(bcnInterval); } // Fl_Spinner2* spnBcnInterval { Fl_Spinner2* o = spnIDtimer = new Fl_Spinner2(121, 155, 70, 22, "ID timer (min):"); spnIDtimer->tooltip("ID timer\\n0 = disable"); spnIDtimer->box(FL_NO_BOX); spnIDtimer->color(FL_BACKGROUND_COLOR); spnIDtimer->selection_color(FL_BACKGROUND_COLOR); spnIDtimer->labeltype(FL_NORMAL_LABEL); spnIDtimer->labelfont(0); spnIDtimer->labelsize(14); spnIDtimer->labelcolor(FL_FOREGROUND_COLOR); spnIDtimer->minimum(0); spnIDtimer->maximum(10); spnIDtimer->callback((Fl_Callback*)cb_spnIDtimer); spnIDtimer->align(Fl_Align(FL_ALIGN_LEFT)); spnIDtimer->when(FL_WHEN_RELEASE); o->minimum(0); o->maximum(10); o->step(1); o->value(idtimer); } // Fl_Spinner2* spnIDtimer { choiceBlockSize = new Fl_ComboBox(314, 126, 72, 24, "Block Size:"); choiceBlockSize->box(FL_DOWN_BOX); choiceBlockSize->color(FL_BACKGROUND2_COLOR); choiceBlockSize->selection_color(FL_BACKGROUND_COLOR); choiceBlockSize->labeltype(FL_NORMAL_LABEL); choiceBlockSize->labelfont(0); choiceBlockSize->labelsize(14); choiceBlockSize->labelcolor(FL_FOREGROUND_COLOR); choiceBlockSize->callback((Fl_Callback*)cb_choiceBlockSize); choiceBlockSize->align(Fl_Align(FL_ALIGN_LEFT)); choiceBlockSize->when(FL_WHEN_RELEASE); choiceBlockSize->end(); } // Fl_ComboBox* choiceBlockSize { btnOK = new Fl_Button(406, 154, 62, 24, "Ok"); btnOK->callback((Fl_Callback*)cb_btnOK); } // Fl_Button* btnOK o->end(); } // Fl_Double_Window* o return w; } Table *tblOutgoing=(Table *)0; Fl_Button *send_Cancel=(Fl_Button *)0; static void cb_send_Cancel(Fl_Button*, void*) { sendCancel(); } Fl_Return_Button *send_OK=(Fl_Return_Button *)0; static void cb_send_OK(Fl_Return_Button*, void*) { sendOK(); } Fl_Double_Window* arq_SendSelect() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(500, 170, "Select Email"); w = o; if (w) {/* empty */} { tblOutgoing = new Table(0, 3, 500, 140); tblOutgoing->box(FL_DOWN_BOX); tblOutgoing->color(FL_BACKGROUND2_COLOR); tblOutgoing->selection_color((Fl_Color)246); tblOutgoing->labeltype(FL_NORMAL_LABEL); tblOutgoing->labelfont(0); tblOutgoing->labelsize(14); tblOutgoing->labelcolor(FL_FOREGROUND_COLOR); tblOutgoing->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); tblOutgoing->when(FL_WHEN_RELEASE); } // Table* tblOutgoing { send_Cancel = new Fl_Button(335, 145, 70, 20, "Cancel"); send_Cancel->callback((Fl_Callback*)cb_send_Cancel); } // Fl_Button* send_Cancel { send_OK = new Fl_Return_Button(420, 145, 72, 20, "OK"); send_OK->callback((Fl_Callback*)cb_send_OK); } // Fl_Return_Button* send_OK o->set_modal(); o->end(); o->resizable(o); } // Fl_Double_Window* o return w; } Fl_Input2 *inpMailTo=(Fl_Input2 *)0; Fl_Input2 *inpMailSubj=(Fl_Input2 *)0; Fl_Text_Editor *txtMailText=(Fl_Text_Editor *)0; Fl_Button *btnOpenComposedMail=(Fl_Button *)0; static void cb_btnOpenComposedMail(Fl_Button*, void*) { cb_OpenComposeMail(); } Fl_Button *btnClearComposer=(Fl_Button *)0; static void cb_btnClearComposer(Fl_Button*, void*) { cb_ClearComposer(); } Fl_Button *btnUseTemplate=(Fl_Button *)0; static void cb_btnUseTemplate(Fl_Button*, void*) { cb_UseTemplate(); } Fl_Button *btnCancelComposedMail=(Fl_Button *)0; static void cb_btnCancelComposedMail(Fl_Button*, void*) { cb_CancelComposeMail(); } Fl_Button *btnSaveComposedMail=(Fl_Button *)0; static void cb_btnSaveComposedMail(Fl_Button*, void*) { cb_SaveComposeMail(); } Fl_Double_Window* arq_composer() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(515, 275, "Flarq Mail Composer"); w = o; if (w) {/* empty */} { inpMailTo = new Fl_Input2(48, 4, 460, 24, "To:"); inpMailTo->box(FL_DOWN_BOX); inpMailTo->color(FL_BACKGROUND2_COLOR); inpMailTo->selection_color(FL_SELECTION_COLOR); inpMailTo->labeltype(FL_NORMAL_LABEL); inpMailTo->labelfont(0); inpMailTo->labelsize(14); inpMailTo->labelcolor(FL_FOREGROUND_COLOR); inpMailTo->align(Fl_Align(FL_ALIGN_LEFT)); inpMailTo->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailTo { inpMailSubj = new Fl_Input2(48, 30, 460, 24, "Subj:"); inpMailSubj->box(FL_DOWN_BOX); inpMailSubj->color(FL_BACKGROUND2_COLOR); inpMailSubj->selection_color(FL_SELECTION_COLOR); inpMailSubj->labeltype(FL_NORMAL_LABEL); inpMailSubj->labelfont(0); inpMailSubj->labelsize(14); inpMailSubj->labelcolor(FL_FOREGROUND_COLOR); inpMailSubj->align(Fl_Align(FL_ALIGN_LEFT)); inpMailSubj->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailSubj { txtMailText = new Fl_Text_Editor(0, 56, 510, 188); Fl_Group::current()->resizable(txtMailText); } // Fl_Text_Editor* txtMailText { Fl_Pack* o = new Fl_Pack(0, 247, 515, 28); o->type(1); { btnOpenComposedMail = new Fl_Button(4, 251, 70, 20, "Open"); btnOpenComposedMail->tooltip("Open existing Composed email"); btnOpenComposedMail->callback((Fl_Callback*)cb_btnOpenComposedMail); } // Fl_Button* btnOpenComposedMail { new Fl_Box(75, 251, 5, 20); } // Fl_Box* o { btnClearComposer = new Fl_Button(81, 251, 70, 20, "Clear"); btnClearComposer->tooltip("Clear all fields"); btnClearComposer->callback((Fl_Callback*)cb_btnClearComposer); } // Fl_Button* btnClearComposer { new Fl_Box(152, 251, 5, 20); } // Fl_Box* o { btnUseTemplate = new Fl_Button(159, 251, 70, 20, "Template"); btnUseTemplate->tooltip("Use template file"); btnUseTemplate->callback((Fl_Callback*)cb_btnUseTemplate); } // Fl_Button* btnUseTemplate { Fl_Box* o = new Fl_Box(230, 251, 127, 20); Fl_Group::current()->resizable(o); } // Fl_Box* o { btnCancelComposedMail = new Fl_Button(358, 251, 70, 20, "Cancel"); btnCancelComposedMail->tooltip("Close Dialog"); btnCancelComposedMail->callback((Fl_Callback*)cb_btnCancelComposedMail); } // Fl_Button* btnCancelComposedMail { new Fl_Box(429, 251, 5, 20); } // Fl_Box* o { btnSaveComposedMail = new Fl_Button(436, 251, 70, 20, "Save"); btnSaveComposedMail->tooltip("Save this message (shift click Save Template)"); btnSaveComposedMail->callback((Fl_Callback*)cb_btnSaveComposedMail); } // Fl_Button* btnSaveComposedMail o->end(); } // Fl_Pack* o o->end(); } // Fl_Double_Window* o return w; } fldigi-4.1.06/src/flarq-src/flarqenv.cxx0000644000175000017500000002142013472116001014776 00000000000000// ---------------------------------------------------------------------------- // flarqenv.cxx // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #ifdef __MINGW32__ # include "compat.h" #endif #if HAVE_SYS_UTSNAME_H # include #endif #include #include #include #include "stacktrace.h" #include "flarq.h" using namespace std; string option_help, version_text, build_text; extern string arq_address, arq_port; extern bool ioMPSK; extern bool SHOWDEBUG; void generate_option_help(void) { ostringstream help; help << "Usage:\n" << " " << PACKAGE_NAME << " [option...]\n\n"; help << PACKAGE_NAME << " options:\n\n" << " --arq-protocol TYPE\n" << " Set the ARQ protocol\n" << " May be either ``fldigi'' or ``multipsk''\n" << " The default is: " << (ioMPSK ? "multipsk" : "fldigi") << "\n\n" << " --arq-server-address HOSTNAME\n" << " Set the ARQ TCP server address\n" << " The default is: " << arq_address << "\n\n" << " --arq-server-port PORT\n" << " Set the ARQ TCP server port\n" << " The default is: " << arq_port << "\n\n" << " --debug\n" << " Enable debugging messages\n\n" << " --version\n" << " Print version information\n\n" << " --build-info\n" << " Print build information\n\n" << " --help\n" << " Print this option help\n\n"; // Fl::help looks ugly so we'll write our own help << "Standard FLTK options:\n\n" << " -bg COLOR, -background COLOR\n" << " Set the background color\n" << " -bg2 COLOR, -background2 COLOR\n" << " Set the secondary (text) background color\n\n" << " -di DISPLAY, -display DISPLAY\n" << " Set the X display to use DISPLAY,\n" << " format is ``host:n.n''\n\n" << " -dn, -dnd or -nodn, -nodnd\n" << " Enable or disable drag and drop copy and paste in text fields\n\n" << " -fg COLOR, -foreground COLOR\n" << " Set the foreground color\n\n" << " -g GEOMETRY, -geometry GEOMETRY\n" << " Set the initial window size and position\n" << " GEOMETRY format is ``WxH+X+Y''\n" << " ** " << PACKAGE_NAME << " may override this setting **\n\n" << " -i, -iconic\n" << " Start " << PACKAGE_NAME << " in iconified state\n\n" << " -k, -kbd or -nok, -nokbd\n" << " Enable or disable visible keyboard focus in non-text widgets\n\n" << " -na CLASSNAME, -name CLASSNAME\n" << " Set the window class to CLASSNAME\n\n" << " -ti WINDOWTITLE, -title WINDOWTITLE\n" << " Set the window title\n\n"; help << "Additional UI options:\n\n" << " --font FONT[:SIZE]\n" << " Set the widget font and (optionally) size\n" << " The default is: " << Fl::get_font(FL_HELVETICA) << ':' << FL_NORMAL_SIZE << "\n\n"; option_help = help.str(); } int parse_args(int argc, char** argv, int& idx) { // Only handle long options if ( !(strlen(argv[idx]) >= 2 && strncmp(argv[idx], "--", 2) == 0) ) return 0; enum { OPT_ZERO, #ifndef __WOE32__ OPT_RX_IPC_KEY, OPT_TX_IPC_KEY, #endif OPT_ARQ_PROTOCOL, OPT_ARQ_ADDRESS, OPT_ARQ_PORT, OPT_FONT, OPT_DEBUG, OPT_DEPRECATED, OPT_HELP, OPT_VERSION, OPT_BUILD_INFO }; const char shortopts[] = "+"; struct option longopts[] = { #ifndef __WOE32__ { "rx-ipc-key", 1, 0, OPT_RX_IPC_KEY }, { "tx-ipc-key", 1, 0, OPT_TX_IPC_KEY }, #endif { "arq-protocol", 1, 0, OPT_ARQ_PROTOCOL }, { "arq-server-address", 1, 0, OPT_ARQ_ADDRESS }, { "arq-server-port", 1, 0, OPT_ARQ_PORT }, { "font", 1, 0, OPT_FONT }, { "debug", 0, 0, OPT_DEBUG }, { "help", 0, 0, OPT_HELP }, { "version", 0, 0, OPT_VERSION }, { "build-info", 0, 0, OPT_BUILD_INFO }, { 0 } }; int longindex; optind = idx; int c = getopt_long(argc, argv, shortopts, longopts, &longindex); switch (c) { case -1: return 0; case 0: // handle options with non-0 flag here return 0; case OPT_ARQ_PROTOCOL: if (!strcmp(optarg, "fldigi")) ioMPSK = false; else if (!strcmp(optarg, "multipsk")) ioMPSK = true; else { cerr << "E: unknown protocol type\n"; exit(EXIT_FAILURE); } break; case OPT_ARQ_ADDRESS: arq_address = optarg; break; case OPT_ARQ_PORT: arq_port = optarg; break; case OPT_FONT: { char *p; if ((p = strchr(optarg, ':'))) { *p = '\0'; FL_NORMAL_SIZE = strtol(p + 1, 0, 10); } Fl::set_font(FL_HELVETICA, optarg); break; } case OPT_DEBUG: SHOWDEBUG = true; break; case OPT_DEPRECATED: cerr << "W: the --" << longopts[longindex].name << " option has been deprecated and will be removed in a future version\n"; break; case OPT_HELP: cout << option_help; exit(EXIT_SUCCESS); case OPT_VERSION: cout << version_text; exit(EXIT_SUCCESS); case OPT_BUILD_INFO: cout << build_text; exit(EXIT_SUCCESS); case '?': default: cerr << "Try `" << PACKAGE_NAME << " --help' for more information.\n"; exit(EXIT_FAILURE); } // Increment idx by the number of args we used and return that number. // We must check whether the option argument is in the same argv element // as the option name itself, i.e., --opt=arg. c = longopts[longindex].has_arg ? 2 : 1; if (c == 2) { string arg = argv[idx]; string::size_type p; if ((p = arg.rfind(optarg)) != string::npos && arg[p-1] == '=') c = 1; } idx += c; return c; } void set_platform_ui(void) { #if defined(__APPLE__) FL_NORMAL_SIZE = 12; #elif defined(__WOE32__) Fl::set_font(FL_HELVETICA, "Tahoma"); FL_NORMAL_SIZE = 11; #else FL_NORMAL_SIZE = 12; #endif } void generate_version_text(void) { version_text.assign(PACKAGE_STRING "\nCopyright (C) 2008, 2009 " PACKAGE_AUTHORS ".\n"); version_text.append("License GPLv3+: GNU GPL version 3 or later " "\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n"); ostringstream s; s << "Build information:\n"; s << " built : " << BUILD_DATE << " by " << BUILD_USER << '@' << BUILD_HOST << " on " << BUILD_BUILD_PLATFORM << " for " << BUILD_TARGET_PLATFORM << "\n\n" << " configure flags: " << BUILD_CONFIGURE_ARGS << "\n\n" << " compiler : " << BUILD_COMPILER << "\n\n" << " compiler flags : " << FLARQ_BUILD_CXXFLAGS << "\n\n" << " linker flags : " << FLARQ_BUILD_LDFLAGS << "\n\n" << " libraries : " "FLTK " FLTK_BUILD_VERSION "\n"; s << "\nRuntime information:\n"; struct utsname u; if (uname(&u) != -1) { s << " system : " << u.sysname << ' ' << u.nodename << ' ' << u.release << ' ' << u.version << ' ' << u.machine << "\n\n"; } build_text = s.str(); } void setup_signal_handlers(void) { #ifndef __WOE32__ struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); // no child stopped notifications, no zombies action.sa_handler = SIG_DFL; action.sa_flags = SA_NOCLDSTOP; #ifdef SA_NOCLDWAIT action.sa_flags |= SA_NOCLDWAIT; #endif sigaction(SIGCHLD, &action, NULL); action.sa_flags = 0; action.sa_handler = handle_signal; sigaction(SIGSEGV, &action, NULL); sigaction(SIGILL, &action, NULL); sigaction(SIGABRT, &action, NULL); sigaction(SIGUSR2, &action, NULL); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask, SIGUSR2); pthread_sigmask(SIG_BLOCK, &action.sa_mask, NULL); #else signal(SIGSEGV, handle_signal); signal(SIGILL, handle_signal); signal(SIGABRT, handle_signal); #endif } fldigi-4.1.06/src/flarq-src/xml_server.cxx0000644000175000017500000001356713472116001015363 00000000000000// --------------------------------------------------------------------- // // xml_server.cxx, a part of flarq // // Copyflarqht (C) 2016 // Dave Freese, W1HKJ // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with the program; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include "support.h" //#include "debug.h" #include "arq.h" #include "flarq.h" #include "xml_server.h" #include "xmlrpcpp/XmlRpc.h" using namespace XmlRpc; // The server XmlRpcServer flarq_server; //---------------------------------------------------------------------- // get interface //---------------------------------------------------------------------- bool xml_rx_text_ready = false; //---------------------------------------------------------------------- // Request for flarq version //---------------------------------------------------------------------- class flarq_get_version : public XmlRpcServerMethod { public: flarq_get_version(XmlRpcServer* s) : XmlRpcServerMethod("flarq.get_version", s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { result = VERSION; } std::string help() { return std::string("returns version number of flarq"); } } flarq_get_version(&flarq_server); //---------------------------------------------------------------------- // Request for ARQ state //---------------------------------------------------------------------- class flarq_get_state : public XmlRpcServerMethod { public: flarq_get_state(XmlRpcServer* s) : XmlRpcServerMethod("flarq.get_state", s) {} // x00 - unconnected // x81 - connected // x82 - sending // x83 - receiving // x84 - send completed // x85 - recv completed void execute(XmlRpcValue& params, XmlRpcValue& result) { int state = 0; if (arqstate != ARQ_CONNECTED) state = 0; else if (sendingfile) state = 0x82; else if (rxARQfile) state = 0x83; else if (xml_rx_text_ready) state = 0x85; else state = 0x81; result = state; } std::string help() { return std::string("returns state of connection"); } } flarq_get_state(&flarq_server); //---------------------------------------------------------------------- // Request for received text //---------------------------------------------------------------------- class flarq_rcvd_text : public XmlRpcServerMethod { public: flarq_rcvd_text(XmlRpcServer* s) : XmlRpcServerMethod("flarq.rcvd_text", s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { std::string result_string = "none"; if (xml_rx_text_ready) result_string = txtarqload; xml_rx_text_ready = false; result = result_string; txtarqload = ""; } std::string help() { return std::string("returns received text"); } } flarq_rcvd_text(&flarq_server); //---------------------------------------------------------------------- // set interface //---------------------------------------------------------------------- //------------------------------------------------------------------------------ // Send text //------------------------------------------------------------------------------ class flarq_send_text : public XmlRpcServerMethod { public: flarq_send_text(XmlRpcServer* s) : XmlRpcServerMethod("flarq.send_text", s) {} void execute(XmlRpcValue& params, XmlRpcValue &result) { std::string txt_to_send = string(params[0]); send_xml_text("FLMSG_XFR", txt_to_send); } std::string help() { return std::string("send_text"); } } flarq_send_text(&flarq_server); struct MLIST { string name; string signature; string help; } mlist[] = { { "flarq.rcvd_text", "s:n", "return MODE of current VFO" }, { "flarq.get_state", "s:n", "return PTT state" }, { "flarq.send_text", "i:i", "set MODE iaw MODE table" } }; class flarq_list_methods : public XmlRpcServerMethod { public: flarq_list_methods(XmlRpcServer *s) : XmlRpcServerMethod("flarq.list_methods", s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { vector methods; for (size_t n = 0; n < sizeof(mlist) / sizeof(*mlist); ++n) { XmlRpcValue::ValueStruct item; item["name"] = mlist[n].name; item["signature"] = mlist[n].signature; item["help"] = mlist[n].help; methods.push_back(item); } result = methods; } std::string help() { return std::string("get flarq methods"); } } flarq_list_methods(&flarq_server); //------------------------------------------------------------------------------ // support thread xmlrpc clients //------------------------------------------------------------------------------ pthread_t *xml_thread = 0; void * xml_thread_loop(void *d) { for(;;) { flarq_server.work(-1.0); } return NULL; } void start_xml_server(int port) { XmlRpc::setVerbosity(0); // Create the server socket on the specified port flarq_server.bindAndListen(port); // Enable introspection flarq_server.enableIntrospection(true); xml_thread = new pthread_t; if (pthread_create(xml_thread, NULL, xml_thread_loop, NULL)) { perror("pthread_create"); exit(EXIT_FAILURE); } } void exit_server() { flarq_server.exit(); } fldigi-4.1.06/src/flarq-src/include/0000775000175000017500000000000013515625026014154 500000000000000fldigi-4.1.06/src/flarq-src/include/arq.h0000644000175000017500000002662613472116001015030 00000000000000#ifndef arq_H #define arq_H // ---------------------------------------------------------------------------- // arq module arq.h // Copyright (c) 2007-2009, Dave Freese, W1HKJ // // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // link layer spec for fldigi_arq // // generic Frame format: // dcl[info])12EF // | ||| | | | // | ||| | | +--ASCII or (0x04) character // | ||| | +-------checksum (4xAlphaNum) // | ||| +-------------Payload (1 ... 2^N chars, N 4, 5, 6, 7 8) // | ||+---------------Block type // | |+----------------Stream id // | +-----------------Protocol version number // +---------------------ASCII (0x01) character // BLOCKSIZE = 2^n // #include #include #include #include #include #include #include #include extern int idtimer; using namespace std; #define DEBUG #define arq_Version "arq 0.1" //===================================================================== // following Block Types are defined in K9PS ARQ Protocol specification #define IDENT 'i' #define CONREQ 'c' #define CONACK 'k' #define REFUSED 'r' #define DISREQ 'd' #define STATUS 's' #define POLL 'p' #define FMTFAIL 'f' // following Block Types are extensions to the K9PS specification #define _ABORT 'a' #define _ACKABORT 'o' #define _DISACK 'b' #define _UNPROTO 'u' #define _TALK 't' //===================================================================== #define SOH 0X01 #define STX 0X02 #define ACK 0X06 #define SUB 0X1A #define EOT 0X04 //===================================================================== //ARQ defaults #define MAXHEADERS 8 // Max. number of missing blocks #define MAXCOUNT 64 // DO NOT CHANGE THIS CONSTANT #define EXPONENT 7 // Bufferlength = 2 ^ EXPONENT = 128 //===================================================================== //link timing defaults #define RETRIES 5 #define RETRYTIME 10000 // # milliseconds between retries #define TXDELAY 500 // # milliseconds from xmt to rcv #define TIMEOUT 60000 // # milliseconds before TIMED OUT #define ARQLOOPTIME 100 // # msec for loop timing //===================================================================== //link states enum LINK_STATES { DOWN = 0, TIMEDOUT, ABORT, ARQ_CONNECTING, ARQ_CONNECTED, WAITING, WAITFORACK, DISCONNECT, DISCONNECTING, ABORTING, STOPPED }; //#define DOWN 0 //#define TIMEDOUT 1 //#define ABORT 3 //#define ARQ_CONNECTING 4 //#define ARQ_CONNECTED 5 //#define WAITING 6 //#define WAITFORACK 7 //#define DISCONNECT 8 //#define DISCONNECTING 9 //#define ABORTING 10 #define SENDING 0x80; //===================================================================== extern char *ARQASCII[]; // crc 16 cycle redundancy check sum for data block integrity class Ccrc16 { private: unsigned int crcval; char ss[5]; public: Ccrc16() { crcval = 0xFFFF; } ~Ccrc16() {}; void reset() { crcval = 0xFFFF;} unsigned int val() {return crcval;} string sval() { snprintf(ss, sizeof(ss), "%04X", crcval); return ss; } void update(char c) { crcval ^= c & 255; for (int i = 0; i < 8; ++i) { if (crcval & 1) crcval = (crcval >> 1) ^ 0xA001; else crcval = (crcval >> 1); } } unsigned int crc16(char c) { update(c); return crcval; } unsigned int crc16(string s) { reset(); for (size_t i = 0; i < s.length(); i++) update(s[i]); return crcval; } string scrc16(string s) { crc16(s); return sval(); } }; // text block; block # and string of text class cTxtBlk { private: int number; string txt; public: cTxtBlk() {number = -1; txt = "";} cTxtBlk(int n, string text) { number = n; txt = text; } ~cTxtBlk() {} void nbr(int n) { number = n;} int nbr() { return number; } string text() { return txt; } void text(string t) { txt = t;} bool operator <(const cTxtBlk &b)const { return number < b.number; } bool operator ==(const cTxtBlk b)const { return number == b.number; } }; class arq { private: bool arqstop; string MyCall; string UrCall; string Header; string Frame; string Payload; string rcvPayload; string logfile; char MyStreamID; char UrStreamID; char MyBlockLengthChar; char UrBlockLengthChar; char BlockNumberChar; char fID; int blknbr; // queues // string TxTextQueue; // Text out to mail engine string TxPlainTextQueue; // plain text transmit queu string RxTextQueue; // Text in from mail engine string RxFrameQueue; char lastRxChar; bool TXflag; int Bufferlength; int maxheaders; int exponent; // status variables int payloadlength; // Average length of payload received int totalRx; // total number of frames received int totalTx; // total number of frames transmitted int nbrbadRx; // number with crc errors int nbrbadTx; // total number of repeats required // int max_idle; // Dynamic timing slot initial value int SessionNumber; bool PollOK; // used for status handshake bool wrappedFlag; // set true if missing blocks bit count // has wrapped around int retrytime; int RetryTime; int retries; int Retries; int timeout; int Timeout; int tx2txdelay; int TxDelay; int loopcount; int _idtimer; int baseRetryTime; int baseTimeout; int baseRetries; bool immediate; bool primary; Ccrc16 framecrc; // My status int Firstsent; // First Header I sent last turn int LastHeader; // Last Header I sent last turn int Lastqueued; // Last Header in static send queue int EndHeader; // Last I received o.k. int GoodHeader; // Last Header received consecutively int blkcount; int Blocks2Send; // number of blocks at beginning of Tx vector MyMissing; // missing Rx blocks string MissingRxBlocks; vector RxPending; // RxPending Rx blocks (not consecutive) list TxBlocks; // fifo of transmit buffers list TxMissing; // fifo of sent; RxPending Status report list TxPending; // fifo of transmitted buffers pending print // Ur status int UrGoodHeader; // Other station's Good Header int UrLastHeader; // Other station's Header last sent int UrEndHeader; // Other station's last received Header vector UrMissing; // Other station's missing Headers int LinkState; // status of ARQ link int Sending; bool bABORT; // Link quality for sending *** used for testing only !! *** // double sendquality; void reset(); void resetTx(); void resetRx(); int rtry(); void setBufferlength(); void checkblocks(); string upcase(string s); void newblocknumber(); void newHeader(); void IdHeader(); void UnkHeader(); void connectFrame(); void disackFrame(); void ackFrame(); void ttyconnectFrame(); void ttyackFrame(); void pollFrame(); void identFrame(); void pingFrame(); void statFrame(); void disconnectFrame(); void abortFrame(); void ackAbortFrame(); void beaconFrame(string txt); void textFrame(cTxtBlk block); void talkFrame(string txt); void addToTxQue(string s); void sendblocks(); void transmitdata(); string frame() {return Frame;} bool isUrcall(); void parseIDENT(); void parseCONREQ(); void parseCONACK(); void parseREFUSED(); void parseDISREQ(); void parseDISACK(); void parseABORT(); void parseACKABORT(); void parseUNPROTO(); void parseSTATUS(); void parsePOLL(); void parseDATA(); void parseTALK(); int parseFrame(string txt); // external functions called by arq class void (*sendfnc)(const string& s); bool (*getc1)(char &); void (*rcvfnc)(); void (*printRX)(string s); void (*printTX)(string s); void (*printRX_DEBUG)(string s); void (*printTX_DEBUG)(string s); void (*printTALK)(string s); void (*abortfnc)(); void (*disconnectfnc)(); void (*rxUrCall)(string s); void (*qualityfnc)(string s); void (*printSTATUS)(string s, double disptime); public: arq(); ~arq() {}; friend void arqloop(void *me); void start_arq(); void restart_arq(); string checksum(string &s); void myCall(string s) { MyCall = upcase(s);} string myCall() { return MyCall;} void urCall(string s) { UrCall = s;} string urCall() { return UrCall;} void newsession(); void setSendFunc( void (*f)(const string& s)) { sendfnc = f;} void setGetCFunc( bool (*f)(char &)) { getc1 = f;} void setRcvFunc( void (*f)()) { rcvfnc = f;} void setPrintRX( void (*f)(string s)) { printRX = f;} void setPrintTX( void (*f)(string s)) { printTX = f;} void setPrintTALK (void (*f)(string s)) {printTALK = f;} void setPrintRX_DEBUG (void (*f)(string s)){printRX_DEBUG = f;} void setPrintTX_DEBUG (void (*f)(string s)) {printTX_DEBUG = f;} void setPrintSTATUS (void (*f)(string s, double disptime)) { printSTATUS = f;} void setMaxHeaders( int mh ) { maxheaders = mh; } void setExponent( int exp ) { exponent = exp; setBufferlength(); } int getExponent() { return (int) exponent;} void setWaitTime( int rtime ) { RetryTime = rtime; baseRetryTime = rtime; } int getWaitTime() { return (int) RetryTime; } void setRetries ( int rtries ) { retries = Retries = baseRetries = rtries; } int getRetries() { return (int) Retries; } void setTimeout ( int tout ) { Timeout = tout; baseTimeout = tout; } int getTimeout() { return (int) Timeout; } int getTimeLeft() { return (int) timeout * ARQLOOPTIME / 1000; } void setTxDelay ( int r2t ) { TxDelay = r2t; } int getTxDelay() { return (int) TxDelay; } int getRetryCount() { return (int)(Retries - retries + 1); } void set_idtimer() { if (idtimer) _idtimer = (idtimer * 60 - 10) * 1000 / ARQLOOPTIME; else _idtimer = (10 * 60 - 10) * 1000 / ARQLOOPTIME; } void setrxUrCall( void (*f)(string s)) { rxUrCall = f;} void setQualityValue( void (*f)(string s)) { qualityfnc = f;} void setAbortedTransfer( void (*f)()) { abortfnc = f;}; void setDisconnected( void (*f)()) { disconnectfnc = f;}; void rcvChar( char c ); void connect(string callsign);//, int blocksize = 6, int retries = 4); void sendblocks( string txt ); void sendBeacon (string txt); void sendPlainText( string txt ); string getText() { return RxTextQueue;} void sendText(string txt); bool connected() { return (LinkState == ARQ_CONNECTED); } void disconnect(); void abort(); int state() { return (LinkState + Sending);} int TXblocks() { return totalTx;} int TXbad() { return nbrbadTx;} int RXblocks() { return totalRx;} int RXbad() { return nbrbadRx;} double quality() { if (totalTx == 0) return 1.0; return ( 1.0 * (totalTx - nbrbadTx) / totalTx ); } float percentSent() { if (Blocks2Send == 0) return 0.0; if ((TxBlocks.empty() && TxMissing.empty())) return 1.0; return (1.0 * (Blocks2Send - TxBlocks.size() - TxMissing.size()) / Blocks2Send); } bool transferComplete() { if (TxMissing.empty() == false) return false; if (TxBlocks.empty() == false) return false; return true; } }; #endif fldigi-4.1.06/src/flarq-src/include/arqdialogs.h0000644000175000017500000000475213511627773016410 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef arqdialogs_h #define arqdialogs_h #include #include "flinput2.h" #include "flslider2.h" #include "combo.h" #include #include extern Fl_Menu_Bar *mnu; extern void ComposeMail(); extern void cbMenuConfig(); extern void cbMenuAbout(); #include #include extern Fl_Button *btnCONNECT; extern Fl_Input2 *txtURCALL; #include extern Fl_Light_Button *btnBEACON; extern Fl_Input2 *txtBeaconing; #include extern Fl_Box *indCONNECT; extern Fl_Input2 *txtState; #include extern Fl_Text_Display *txtARQ; extern Fl_Input2 *txtStatus; extern Fl_Input2 *txtStatus2; #include extern Fl_Progress *prgStatus; extern Fl_Button *btnClearText; extern Fl_Text_Display *txtRX; extern Fl_Input2 *txtTX; extern Fl_Button *btnSendTalk; Fl_Double_Window* arq_dialog(); extern Fl_Menu_Item menu_mnu[]; #define mnu_nbems_files (menu_mnu+1) #define mnuExit (menu_mnu+2) #define mnuSend (menu_mnu+4) #define mnuSendEmail (menu_mnu+5) #define mnuSendText (menu_mnu+6) #define mnuSendImage (menu_mnu+7) #define mnuSendBinary (menu_mnu+8) #define mnuCompose (menu_mnu+10) #define mnuConfig (menu_mnu+11) #define mnuHelp (menu_mnu+12) #define mnuHowTo (menu_mnu+13) #define mnuAbout (menu_mnu+14) extern Fl_Input2 *txtMyCall; extern Fl_Input2 *txtBEACONTXT; extern Fl_Spinner2 *spnRetries; extern Fl_Spinner2 *spnWaitTime; extern Fl_Spinner2 *spnTimeout; extern Fl_Spinner2 *spnTxDelay; extern Fl_Spinner2 *spnBcnInterval; extern Fl_Spinner2 *spnIDtimer; extern Fl_ComboBox *choiceBlockSize; extern Fl_Button *btnOK; Fl_Double_Window* arq_configure(); #include "table.h" extern Table *tblOutgoing; extern void sendCancel(); extern Fl_Button *send_Cancel; #include extern void sendOK(); extern Fl_Return_Button *send_OK; Fl_Double_Window* arq_SendSelect(); extern Fl_Input2 *inpMailTo; extern Fl_Input2 *inpMailSubj; #include extern Fl_Text_Editor *txtMailText; #include extern void cb_OpenComposeMail(); extern Fl_Button *btnOpenComposedMail; extern void cb_ClearComposer(); extern Fl_Button *btnClearComposer; extern void cb_UseTemplate(); extern Fl_Button *btnUseTemplate; extern void cb_CancelComposeMail(); extern Fl_Button *btnCancelComposedMail; extern void cb_SaveComposeMail(); extern Fl_Button *btnSaveComposedMail; Fl_Double_Window* arq_composer(); #endif fldigi-4.1.06/src/flarq-src/include/flarq.h0000664000175000017500000000422713507401434015353 00000000000000#ifndef FLARQ_H #define FLARQ_H #include #define SOHCOUNT 10 extern void arqBEACON(); extern void arqCLOSE(); extern void arqCONNECT(); extern void cbMenuAbout(); extern void cbMenuConfig(); extern void cbSetConfig(); extern void closeConfig(); extern void sendCancel(); extern void sendOK(); extern void cb_SortByDate(); extern void cb_SortByTo(); extern void cb_SortBySubj(); extern void abortTransfer(); extern void cbAbort(); extern void cbClearText(); extern void testDirectory(std::string); extern void cbSendTalk(); extern void cbClearTalk(); extern void help_cb(); extern void open_nbems_file_folder(); extern void sendEmailFile(); extern void sendAsciiFile(); extern void sendImageFile(); extern void sendBinaryFile(); extern void changeMyCall(const char *); extern void changeBeaconText(const char *); extern std::string HomeDir; extern std::string NBEMS_dir; extern std::string ARQ_dir; extern std::string ARQ_files_dir; extern std::string ARQ_recv_dir; extern std::string ARQ_send_dir; extern std::string ARQ_mail_dir; extern std::string ARQ_mail_in_dir; extern std::string ARQ_mail_out_dir; extern std::string ARQ_mail_sent_dir; extern std::string WRAP_dir; extern std::string WRAP_recv_dir; extern std::string WRAP_send_dir; extern std::string WRAP_auto_dir; extern std::string ICS_dir; extern std::string ICS_msg_dir; extern std::string ICS_tmp_dir; extern std::string MyCall; extern std::string InFolder; extern std::string OutFolder; extern std::string MailInFolder; extern std::string MailOutFolder; extern std::string MailSentFolder; extern std::string Logfile; extern std::string beacontext; extern int exponent; extern int txdelay; extern int iretries; extern long iwaittime; extern long itimeout; extern int bcnInterval; extern int idtimer; extern void cb_idtimer(); // used by xmlrpc interface extern int arqstate; extern bool sendingfile; extern bool rxTextReady; extern bool rxARQfile; extern std::string txtarqload; extern void cb_SaveComposeMail(); extern void cb_CancelComposeMail(); extern void cb_UseTemplate(); extern void cb_OpenComposeMail(); extern void ComposeMail(); extern void send_xml_text(std::string, std::string); #endif fldigi-4.1.06/src/flarq-src/include/b64.h0000644000175000017500000000116213472116001014624 00000000000000//===================================================================== // // base64 encoding / decoding class // //===================================================================== #include #include #include #include using namespace std; typedef unsigned char byte; class base64 { #define LINELEN 72 private: string output; size_t iolen; size_t iocp; bool ateof; byte dtable[256]; byte etable[256]; int linelength; bool crlf; void init(); public: base64(bool t = false) {crlf = t; init(); }; ~base64(){}; string encode(string in); string decode(string in); }; fldigi-4.1.06/src/flarq-src/include/xml_server.h0000644000175000017500000000254313472116001016423 00000000000000// --------------------------------------------------------------------- // // xml_server.h, a part of flarq // // Copyflarqht (C) 2016 // Dave Freese, W1HKJ // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with the program; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #ifndef XML_SERVER_H #define XML_SERVER_H #include #include #include #include #ifndef WIN32 #include #include #include #endif #include "status.h" #include #include extern void start_xml_server(int port = 12345); extern void exit_server(); extern bool xml_rx_text_ready; #endif fldigi-4.1.06/src/flarq-src/include/flarqenv.h0000644000175000017500000000050013472116001016042 00000000000000#ifndef flarqenv_h_ #define flarqenv_h_ #include extern std::string option_help, version_text, build_text; void generate_option_help(void); void generate_version_text(void); int parse_args(int argc, char** argv, int& idx); void set_platform_ui(void); void setup_signal_handlers(void); #endif // flarqenv_h_ fldigi-4.1.06/src/flarq-src/arq.cxx0000644000175000017500000007700213472116001013752 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "arq.h" using namespace std; //============================================================================= // status messages //============================================================================= string TXPOLL = "TX: Send Blocks Report"; string STIMEDOUT = "Timed out"; string ABORTXFR = "ABORT transfer"; string RXIDENT = "RX: Link Still Active"; string RXCONREQ = "RX: Connect Request"; string RXCONACK = "RX: Connect OK"; string RXDISCONN = "RX: Disconnect Request"; string RXDISCONACK = "RX: Disconnect OK"; string RXSTATUS = "RX: Status Report"; string RXPOLL = "RX: Send Blocks Report"; string TXSTATUS = "TX: Blocks Received OK"; string TXDISCONN = "TX: Disconnect Request"; string TXDISACK = "TX: Disconnect OK"; string TXBEACON = "TX: Beacon"; string TXCONNECT = "TX: Connect"; string TXCONNACK = "TX: Connect OK"; string TXIDENT = "TX: Watchdog %d"; //bool bPoll = false; string arq::upcase(string s) { for (size_t i = 0; i < s.length(); i++) s[i] = toupper(s[i]); return s; } arq::arq() { sendfnc = NULL; rcvfnc = NULL; printRX = NULL; abortfnc = NULL; disconnectfnc = NULL; qualityfnc = NULL; printRX_DEBUG = NULL; printTX_DEBUG = NULL; rxUrCall = NULL; Header.erase(); MyStreamID = '0'; UrStreamID = '0'; UrCall.erase(); MyCall.erase(); logfile = "server.log"; // queues // TxTextQueue.clear();//erase(); // Text out to mail engine RxTextQueue.clear();//erase(); // Text in from mail engine TxPlainTextQueue.clear();//erase(); RxFrameQueue.clear();//erase(); lastRxChar = 0; TXflag = false; SessionNumber = 0; exponent = EXPONENT; maxheaders = MAXHEADERS; RetryTime = RETRYTIME; Retries = RETRIES; Timeout = TIMEOUT; TxDelay = TXDELAY; immediate = false; primary = false; setBufferlength(); // status variables // // totalRx = 0; // nbrbadRx = 0; totalTx = 0; nbrbadTx = 0; payloadlength = 32; // Average length of payload received // static status Firstsent = MAXCOUNT - 1; // First Header I sent last turn LastHeader = MAXCOUNT - 1; // Last Header I sent last turn Lastqueued = MAXCOUNT - 1; // Last Header in static send queue EndHeader = MAXCOUNT - 1; // Last I received o.k. GoodHeader = MAXCOUNT - 1; // Last Header received consecutive // Ur status UrGoodHeader = MAXCOUNT - 1; // Other station's Good Header UrLastHeader = MAXCOUNT - 1; // Other station's Header last sent UrEndHeader = MAXCOUNT - 1; // Other station's last received Header blkcount = -1; TXflag = false; // TX on LinkState = DOWN; // ARQ link is initially down Sending = 0; PollOK = false; // bABORT = false; MyMissing.clear(); MissingRxBlocks = ""; TxBlocks.clear(); TxMissing.clear(); TxPending.clear(); RxPending.clear(); arqstop = false; retries = baseRetries = Retries; baseRetryTime = RetryTime; baseTimeout = Timeout; retrytime = RetryTime / ARQLOOPTIME; timeout = Timeout / ARQLOOPTIME; loopcount = 0; set_idtimer(); tx2txdelay = 0;//TxDelay / ARQLOOPTIME; // srand(time(NULL)); } void arq::setBufferlength() { Bufferlength = 1; for (int i = 0; i < exponent; i++) Bufferlength *= 2; MyBlockLengthChar = '0' + exponent; } void arq::resetTx() { Firstsent = MAXCOUNT - 1; // First Header I sent last turn LastHeader = MAXCOUNT - 1; // Last Header I sent last turn Lastqueued = MAXCOUNT - 1; // Last Header in static send queue TxMissing.clear(); TxBlocks.clear(); TxPending.clear(); TxTextQueue.clear(); // UrMissing.clear(); } void arq::resetRx() { RxTextQueue.clear();//erase(); // Text in from mail engine RxFrameQueue.clear();//erase(); lastRxChar = 0; EndHeader = MAXCOUNT - 1; // Last I received o.k. GoodHeader = MAXCOUNT - 1; // Last Header I received conseq. o.k, 1st in send queue RxPending.clear(); MissingRxBlocks = ""; } void arq::reset() { resetTx(); resetRx(); immediate = false; primary = false; blkcount = -1; // bABORT = false; } // new session number // unknown stream id = 0 // known id's from 1 to 63 void arq::newsession() { if (++SessionNumber == 64) SessionNumber = 1; MyStreamID = SessionNumber + '0'; } // get new blocknumber void arq::newblocknumber() { Lastqueued++; Lastqueued %= MAXCOUNT; } // Checksum of header + Header string arq::checksum(string &s) { framecrc.reset(); return framecrc.scrc16(s); } // Start header when MyStreamID has been assigned void arq::newHeader() { Header.erase(); Header += SOH; Header += '0'; // protocol version; } void arq::IdHeader() { newHeader(); Header += UrStreamID; } void arq::UnkHeader() { newHeader(); Header += '0'; } char crlf[3] = " "; void arq::addToTxQue(string s) { // TxTextQueue += "\r\n"; crlf[0] = 0x0D; crlf[1] = 0x0A; TxTextQueue.append(s); TxTextQueue.append(crlf); totalTx++; } // Connect (client:port, server:port) // c Header = Client:port Server:port // e.g.: '00cW1HKJ:1025 KH6TY:24 4' // void arq::connectFrame() { char szGlobals[24]; reset(); UnkHeader(); Header += CONREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":1025"); Payload += ' '; Payload.append(UrCall); Payload.append(":24"); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; snprintf(szGlobals, 23, " T%dR%dW%d", Timeout/1000, Retries, RetryTime/1000); Payload.append(szGlobals); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); LinkState = ARQ_CONNECTING; printSTATUS(TXCONNECT, 5.0); set_idtimer(); } // Connect acknowledge (server:port, client:port) // k Header = Server:port Client:port // e.g: '00kKH6TY:24 W1HKJ:1024 8 6' // void arq::ackFrame () { reset(); IdHeader(); Header += CONACK; Payload.erase(); Payload.append(MyCall); Payload.append(":24"); Payload += ' '; Payload.append(UrCall); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXCONNACK, 5.0); set_idtimer(); } // Connect (caller:port, static:port) // c Header = Caller:port static:port // e.g.: '00cW1HKJ:87 KH6TY:87 4' // void arq::ttyconnectFrame() { UnkHeader(); Header += CONREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":87"); Payload += ' '; Payload.append(UrCall); Payload.append(":87"); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // Connect acknowledge (server:port, client:port) // k Header = Server:port Client:port // e.g: '00kKH6TY:87 W1HKJ 4' // Service id # 87 is keyboard-to-keyboard // void arq::ttyackFrame() { IdHeader(); Header += CONACK; Payload.erase(); Payload.append(MyCall); Payload.append(":87"); Payload += ' '; Payload.append(UrCall); Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // Identify //i frame = '00iKH6TY de W1HKJ' void arq::identFrame() { IdHeader(); Header += IDENT; Payload.erase(); Payload.append(UrCall); Payload.append(" de "); Payload.append(MyCall); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); char szIDENT[80]; snprintf(szIDENT,sizeof(szIDENT), TXIDENT.c_str(), retries); printSTATUS(szIDENT, 5.0); set_idtimer(); } // e.g. Ping frame // u Header = From:port // e.g: '00uKH6TY:7 ' void arq::pingFrame() { IdHeader(); Header += _UNPROTO; Payload.erase(); Payload.append(MyCall); Payload.append(":7"); Payload += ' '; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // talk frame // similar to UNPROTO frame // but only sent if ARQ_CONNECTED void arq::talkFrame(string txt) { IdHeader(); Header += _TALK; Payload.erase(); Payload.append(MyCall); Payload.append(":73"); Payload += ' '; if (txt.length() > (size_t)Bufferlength) Payload.append(txt.substr(0, Bufferlength)); else Payload.append(txt); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } void arq::ackAbortFrame() { IdHeader(); Header += _ACKABORT; Payload.erase(); Payload += (LastHeader + 0x20); Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } // Status report (End, Good, Lastrx, Missing) //p frame = //e.g.: '00sXHCAB' // void arq::statFrame() { if (idtimer && _idtimer <= 0) talkFrame("auto ID"); IdHeader(); Header += STATUS; Payload.erase(); Payload += (LastHeader + 0x20); Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } // Disconnect session //d frame = "" //e.g.: '00d' void arq::disconnectFrame() { IdHeader(); Header += DISREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":90"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXDISCONN, 5.0); set_idtimer(); } void arq::disackFrame() { IdHeader(); Header += _DISACK; Payload.erase(); Payload.append(MyCall); Payload.append(":91"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXDISACK, 5.0); set_idtimer(); } // ABORT session //a frame = "" //e.g.: '00a' void arq::abortFrame() { IdHeader(); Header += _ABORT; Payload.erase(); Payload.append(MyCall); Payload.append(":92"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // Beacon frame // u Header = From:port data // e.g: '00uKH6TY:72 Beacon text ' // void arq::beaconFrame(string txt) { UnkHeader(); Header += _UNPROTO; Payload.erase(); Payload.append(MyCall); Payload.append(":72"); Payload += ' '; if (txt.length() > (size_t)Bufferlength) Payload.append(txt.substr(0, Bufferlength)); else Payload.append(txt); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXBEACON, 5.0); set_idtimer(); } // poll //p frame = //e.g.: '00pXHCAB' void arq::pollFrame() { IdHeader(); Frame = Header; Frame += POLL; Frame.append(MyCall); Frame += SUB; Frame += (LastHeader + 0x20); Frame += (GoodHeader + 0x20); Frame += (EndHeader + 0x20); Frame.append(MissingRxBlocks); Frame.append(checksum(Frame)); Frame += EOT; addToTxQue(Frame); printSTATUS(TXPOLL, 5.0); set_idtimer(); } // Text frame void arq::textFrame(cTxtBlk block) { IdHeader(); Frame = Header; Frame += (block.nbr() + 0x20); Frame.append(block.text()); Frame.append(checksum(Frame)); Frame += SOH; addToTxQue(Frame); } //===================================================================== void arq::parseIDENT() { timeout = Timeout / ARQLOOPTIME; statFrame(); immediate = true; printSTATUS(RXIDENT, 5.0); } void arq::parseCONREQ() { size_t p1 = 0, p2 = rcvPayload.find(':'); if (p2 == string::npos) return; // if (LinkState == ARQ_CONNECTED || LinkState == WAITFORACK) return; // disallow multiple connects // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); p1 = rcvPayload.find(' ', p2+1); if (p1 == string::npos) { UrCall.erase(); return; } p1++; p2 = rcvPayload.find(":", p1); string testcall = upcase(rcvPayload.substr(p1, p2 - p1)); if (testcall != MyCall) { UrCall.erase(); return; } p1 = rcvPayload.find(' ', p2 +1); if (p1 == string::npos) { UrCall.erase(); return; } p1++; // *p1 ==> StreamID for requesting station UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size UrBlockLengthChar = rcvPayload[p1]; p1 += 3; // *p1 ==>" TnnnRnnnWnnn" if (p1 < rcvPayload.length()) { char num[7]; if (rcvPayload[p1] == 'T') { int n = 0; while (rcvPayload[++p1] != 'R' && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &Timeout); Timeout *= 1000; if (p1 < rcvPayload.length() && rcvPayload[p1] == 'R') { int n = 0; while (rcvPayload[++p1] != 'W' && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &Retries); if (p1 < rcvPayload.length() && rcvPayload[p1] == 'W') { int n = 0; while (++p1 < rcvPayload.length() && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &RetryTime); RetryTime *= 1000; Timeout += Retries * RetryTime; } } /* char line[80]; string NewValues = "Temporary control parameters set to\n"; snprintf(line, 79, " Retries = %d\n", Retries); NewValues.append(line); snprintf(line, 79, " Wait time = %d secs\n", RetryTime / 1000); NewValues.append(line); snprintf(line, 79, " Timeout = %d secs\n", Timeout / 1000); NewValues.append(line); printRX(NewValues); */ } } reset(); LinkState = WAITFORACK; newsession(); if (rxUrCall) rxUrCall(UrCall); TxTextQueue.clear(); ackFrame(); immediate = true; printSTATUS(RXCONREQ, 5.0); } void arq::parseCONACK() { if (LinkState < ARQ_CONNECTING ) { //!= ARQ_CONNECTING) { return; // Connect Acknowledge only valid during a connect } size_t p1 = 0, p2 = rcvPayload.find(':'); // LinkState = DOWN; if (p2 == string::npos) return; // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); p1 = rcvPayload.find(' ', p2+1); if (p1 == string::npos) { UrCall.erase(); return; } p1++; p2 = rcvPayload.find(" ", p1); string testcall = upcase(rcvPayload.substr(p1, p2 - p1)); if (testcall != MyCall) { UrCall.erase(); return; } p1++; // *p1 ==> StreamID for requesting station UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size UrBlockLengthChar = rcvPayload[p1]; RxTextQueue.clear();//erase(); LinkState = ARQ_CONNECTED; timeout = Timeout / ARQLOOPTIME; statFrame(); immediate = true; primary = true; printSTATUS(RXCONACK, 5.0); } void arq::parseDISREQ() { if (LinkState == DOWN) return; TxTextQueue.clear();//erase(); TxMissing.clear(); TxBlocks.clear(); TxPlainTextQueue.clear(); disackFrame(); immediate = true; LinkState = DOWN; if (rxUrCall) rxUrCall(""); if (disconnectfnc) disconnectfnc(); printSTATUS(RXDISCONN, 5.0); } void arq::parseDISACK() { if (rxUrCall) rxUrCall(""); LinkState = DOWN; printSTATUS(RXDISCONACK, 5.0); } void arq::parseABORT() { reset(); if (abortfnc) abortfnc(); ackAbortFrame(); immediate = true; LinkState = ARQ_CONNECTED; } void arq::parseACKABORT() { reset(); if (abortfnc) abortfnc(); LinkState = ARQ_CONNECTED; } void arq::parseUNPROTO() { size_t p1 = 0, p2 = rcvPayload.find(':'); if (p2 == string::npos) return; // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); if (rxUrCall) rxUrCall(UrCall); if (printRX) printRX(rcvPayload + "\n"); } void arq::parseTALK() { size_t p1 = rcvPayload.find(":73"); if (p1 == string::npos) return; string talktext = rcvPayload.substr(p1 + 4); if (printTALK) printTALK(talktext); } void arq::parseSTATUS() { // create the missing list // all reported missing blocks if (LinkState >= ARQ_CONNECTED) { UrLastHeader = rcvPayload[0] - 0x20; // Other station's Header last sent UrGoodHeader = rcvPayload[1] - 0x20; // Other station's Good Header UrEndHeader = rcvPayload[2] - 0x20; // Other station's last received Header size_t nummissing = rcvPayload.length() - 3; vector missing; // append those reported missing if (nummissing > 0) for (size_t i = 0; i < nummissing; i++) missing.push_back(rcvPayload[i+3] - 0x20); // append those not reported missing from UrEndHeader to LastHeader if (UrEndHeader != LastHeader) { int m = UrEndHeader + 1; if (m > MAXCOUNT) m -= MAXCOUNT; while (m != LastHeader) { missing.push_back(m); m++; if (m > MAXCOUNT) m -= MAXCOUNT; } missing.push_back(LastHeader); } if (missing.empty()) TxMissing.clear(); if (TxMissing.empty() == false) { list keep; list::iterator p = TxMissing.begin(); while (p != TxMissing.end()) { for (size_t n = 0; n < missing.size(); n++) { if (p->nbr() == missing[n]) { keep.push_back(*p); break; } } p++; } TxMissing = keep; } } // print any txpending blocks up to and including UrGoodHeader list ::iterator p1 = TxPending.begin(); p1 = TxPending.begin(); while (p1 != TxPending.end()) { if(p1->nbr() == UrGoodHeader) { if (printTX) printTX(p1->text()); TxPending.erase(p1); break; } else if (printTX) printTX(p1->text()); TxPending.erase(p1); p1 = TxPending.begin(); } switch (LinkState) { case WAITFORACK : LinkState = ARQ_CONNECTED; break; case DISCONNECTING : if (rxUrCall) rxUrCall(""); LinkState = DOWN; break; case WAITING : LinkState = ARQ_CONNECTED; break; // case ABORTING : // reset(); // if (abortfnc) abortfnc(); // LinkState = ARQ_CONNECTED; // break; // case ABORT : // break; default: break; } printSTATUS(RXSTATUS, 5.0); } void arq::parsePOLL() { if (LinkState == DISCONNECTING || LinkState == DOWN || LinkState == TIMEDOUT || LinkState == ABORT ) return; statFrame(); immediate = true; LinkState = ARQ_CONNECTED; printSTATUS(RXPOLL, 5.0); } void arq::parseDATA() { vector::iterator p1, p2; int n1, n2; if (LinkState < ARQ_CONNECTED) return; // do not respond if DOWN or TIMEDOUT for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) if (blknbr == p1->nbr()) { return; } char szStatus[80]; snprintf(szStatus, sizeof(szStatus),"RX: data block %d", blknbr); printSTATUS(szStatus, 5.0); cTxtBlk tempblk(blknbr, rcvPayload); RxPending.push_back (tempblk); for (p1 = RxPending.begin(); p1 < RxPending.end() - 1; p1++) { n1 = p1->nbr(); if (n1 < GoodHeader) n1 += MAXCOUNT; for (p2 = p1 + 1; p2 < RxPending.end(); p2++) { n2 = p2->nbr(); if (n2 < GoodHeader) n2 += MAXCOUNT; if (n2 < n1) { tempblk = *p1; *p1 = *p2; *p2 = tempblk; } } } // compute new EndHeader EndHeader = GoodHeader; if (!RxPending.empty()) { p1 = RxPending.end() - 1; EndHeader = p1->nbr(); } // add RxPending blocks that are consecutive to GoodHeader p1 = RxPending.begin(); while (!RxPending.empty()) { if ((p1->nbr() != (GoodHeader +1) % MAXCOUNT)) break; RxTextQueue.append(p1->text()); GoodHeader = p1->nbr(); if (printRX) printRX(p1->text()); RxPending.erase(p1); p1 = RxPending.begin(); } MissingRxBlocks = ""; if (RxPending.empty()) return; int start = (GoodHeader + 1)%MAXCOUNT; int end = (EndHeader + 1)%MAXCOUNT; int test; bool ok; if (end < start) end += MAXCOUNT; for (int i = start; i < end; i++) { test = (i % MAXCOUNT); ok = false; for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) { if (test == p1->nbr()) { ok = true; break; } } if (!ok) MissingRxBlocks += test + 0x20; } } bool arq::isUrcall() { if (UrCall.empty()) return false; if (rcvPayload.find(UrCall) != string::npos) return true; return false; } // expects to receive a full frame // txt[0] == SOH // txt[len - 3] ... txt[len] == CRC // returns // -1 invalid frame // -n failed CRC for text type n // n valid frame // rcvPayload will contain the valid payload // int arq::parseFrame(string txt) { if ( txt.length() < 8 ) { return -1; // not a valid frame } Ccrc16 testcrc; size_t len = txt.length(); rcvPayload = txt.substr(4, len - 8); fID = txt[3]; // treat unproto TALK as a special case // no effort made to confirm the data by the CRC value if (fID == _TALK) { if (LinkState >= ARQ_CONNECTED) { timeout = Timeout / ARQLOOPTIME; parseTALK(); retries = Retries; } return -1; } string sRcvdCRC = testcrc.scrc16( txt.substr(0, len - 4)); if (sRcvdCRC != txt.substr(len - 4) ) { if (printRX_DEBUG) printRX_DEBUG("CRC failed\n"); return -1; // failed CRC test } retries = Retries; switch (fID) { case IDENT : if (!isUrcall()) break; blknbr = fID - 0x20; parseIDENT(); if (printRX_DEBUG) { printRX_DEBUG("IDENT:"); } break; case CONREQ : if (LinkState > TIMEDOUT) break; // disallow multiple connects blknbr = fID - 0x20; parseCONREQ(); if (printRX_DEBUG) { printRX_DEBUG("CONREQ:"); } break; case CONACK : if (!isUrcall()) break; blknbr = fID - 0x20; parseCONACK(); if (printRX_DEBUG) { printRX_DEBUG("CONACK:"); } break; case DISREQ : if (!isUrcall()) break; blknbr = fID - 0x20; parseDISREQ(); if (printRX_DEBUG) { printRX_DEBUG("DISREQ:"); } break; case _DISACK : if (!isUrcall()) break; blknbr = fID - 0x20; parseDISACK(); if (printRX_DEBUG) { printRX_DEBUG("DISACK: "); } break; case STATUS : if (LinkState == DOWN || LinkState == TIMEOUT) break; blknbr = fID - 0x20; parseSTATUS(); if (printRX_DEBUG) { printRX_DEBUG("STATUS:"); } break; case POLL : if (!isUrcall()) { break; } blknbr = fID - 0x20; parsePOLL(); if (printRX_DEBUG) { printRX_DEBUG("POLL:"); } break; case _ABORT : if (!isUrcall()) break; blknbr = fID - 0x20; parseABORT(); if (printRX_DEBUG) { printRX_DEBUG("RCVD ABORT:"); } break; case _ACKABORT : blknbr = fID - 0x20; parseACKABORT(); if (printRX_DEBUG) { printRX_DEBUG("RCVD ACK_ABORT:"); } break; case _UNPROTO : if (LinkState >TIMEDOUT && !isUrcall()) break; // disallow interruption blknbr = fID - 0x20; parseUNPROTO(); if (printRX_DEBUG) { printRX_DEBUG("UNPROTO:"); } break; default : blknbr = fID - 0x20; parseDATA(); if (printRX_DEBUG) { printRX_DEBUG("DATA:"); } } if (printRX_DEBUG) { printRX_DEBUG(txt); printRX_DEBUG("\n"); } if (LinkState == ARQ_CONNECTED) timeout = Timeout / ARQLOOPTIME; return fID; } void arq::rcvChar( char c ) { if ( c == 0x06 ) { Sending = 0; retrytime = rtry(); timeout = Timeout / ARQLOOPTIME; tx2txdelay = TxDelay / ARQLOOPTIME; return; } if (lastRxChar == SOH && c == SOH) // consecutive characters return; if (lastRxChar == EOT && c == EOT) // consecutive characters return; if (RxFrameQueue.empty()) { if (c == SOH) RxFrameQueue += c; } else { if (c == SOH || c == EOT) { parseFrame(RxFrameQueue); RxFrameQueue.clear();//erase(); if (c == SOH) RxFrameQueue += c; } else RxFrameQueue += c; } lastRxChar = c; } //===================================================================== void arq::sendText (string txt) { size_t offset = 0; cTxtBlk tempblk; if (LinkState < ARQ_CONNECTED) return; Blocks2Send = 0; while (offset < txt.length()) { newblocknumber(); tempblk.nbr(Lastqueued); tempblk.text(txt.substr(offset, Bufferlength)); offset += Bufferlength; TxBlocks.push_back(tempblk); Blocks2Send++; } } void arq::sendblocks() { char szStatus[80]; int missedblks = 0, newblks = 0; int framecount = 0; cTxtBlk tempblk; if (TxMissing.empty() == false) { list::iterator p = TxMissing.begin(); while (p != TxMissing.end()) { textFrame(*p); p++; framecount++; } } missedblks = framecount; if (!TxBlocks.empty()) { while (TxBlocks.empty() == false && framecount < maxheaders) { tempblk = TxBlocks.front(); if ((tempblk.nbr() + 2)%MAXCOUNT == UrGoodHeader) break; TxBlocks.pop_front(); TxMissing.push_back(tempblk); TxPending.push_back(tempblk); textFrame(tempblk); LastHeader = tempblk.nbr(); framecount++; } } newblks = framecount - missedblks; snprintf(szStatus, sizeof(szStatus),"TX: repeat %d new %d", missedblks, newblks); printSTATUS(szStatus, 0.0); if (!TxMissing.empty() || !TxBlocks.empty()) pollFrame(); if (LinkState != ABORT && LinkState != ABORTING) LinkState = WAITING; } void arq::connect(string callsign) { UrCall = callsign; for (size_t i = 0; i < UrCall.length(); i++) UrCall[i] = toupper(UrCall[i]); if (rxUrCall) rxUrCall(UrCall); TxTextQueue.clear(); connectFrame(); LinkState = ARQ_CONNECTING; immediate = true; } void arq::disconnect() { Retries = baseRetries; Timeout = baseTimeout; RetryTime = baseRetryTime; totalTx = 0; nbrbadTx = 0; LinkState = DISCONNECT; } void arq::abort() { // bABORT = true; LinkState = ABORT; } void arq::sendBeacon (string txt) { string deText = "<<< FLARQ Beacon >>> de "; deText.append(MyCall); TxTextQueue.clear();//erase(); addToTxQue(deText); beaconFrame(txt); immediate = true; LinkState = DOWN; } void arq::sendPlainText( string txt ) { size_t p = 0; while (p < txt.length()) { talkFrame(txt.substr(p, Bufferlength)); p += Bufferlength; } } void arq::transmitdata() { if (TxTextQueue.empty() == false) { sendfnc(TxTextQueue); Sending = 0x80; if (printTX_DEBUG) printTX_DEBUG(TxTextQueue); TxTextQueue.clear(); tx2txdelay = TxDelay / ARQLOOPTIME; return; } if (TxPlainTextQueue.empty() == false) { sendfnc(TxPlainTextQueue); Sending = 0x80; if (printTX_DEBUG) printTX_DEBUG(TxPlainTextQueue); TxPlainTextQueue.clear(); tx2txdelay = TxDelay / ARQLOOPTIME; } } int arq::rtry() { return RetryTime / ARQLOOPTIME; // return (RetryTime + rand() * 5000 / RAND_MAX) / ARQLOOPTIME; } //--------------------------------------------------------------------- void arqloop(void *who) { arq *me = (arq *)who; char c; if (idtimer) me->_idtimer--; // check for received chars including 0x06 for Sending = 0 if (me->getc1(c) == true) { me->rcvChar(c); while (me->getc1(c) == true) me->rcvChar(c); if (me->tx2txdelay < me->TxDelay / ARQLOOPTIME) me->tx2txdelay = me->TxDelay / ARQLOOPTIME; } if (me->Sending == 0) { // not transmitting // wait period between transmits if (me->tx2txdelay > 0) { me->tx2txdelay--; } else { if (me->immediate == true) { me->transmitdata(); me->retrytime = me->rtry(); me->retries = me->Retries; me->immediate = false; } else { switch (me->LinkState) { case ARQ_CONNECTING : break; case DISCONNECT : me->LinkState = DISCONNECTING; me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->disconnectFrame(); me->immediate = true; break; case DISCONNECTING : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->disconnectFrame(); me->transmitdata(); me->timeout = me->Timeout / ARQLOOPTIME; } } break; case ABORT : me->LinkState = ABORTING; me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->tx2txdelay = 5000/ ARQLOOPTIME; // 5 sec delay for abort me->abortFrame(); me->immediate = true; break; case ABORTING : if (--me->retrytime == 0) { me->retrytime = me->rtry(); if (me->retries--) { me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->abortFrame(); me->transmitdata(); me->timeout = me->Timeout / ARQLOOPTIME; } } break; case WAITING : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->pollFrame(); me->transmitdata(); me->nbrbadTx++; me->timeout = me->Timeout / ARQLOOPTIME; } } break; case WAITFORACK : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->ackFrame(); me->transmitdata(); me->nbrbadTx++; me->timeout = me->Timeout / ARQLOOPTIME; } } break; case ARQ_CONNECTED : default: if (me->TxTextQueue.empty() == false) { me->transmitdata(); } else if ( (me->TxMissing.empty() == false) || (me->TxBlocks.empty() == false)) { me->nbrbadTx += me->TxMissing.size(); me->sendblocks(); me->transmitdata(); } else if ( me->TxPlainTextQueue.empty() == false ) { me->transmitdata(); } break; } me->timeout--; if (me->timeout == 0 // 10000 / ARQLOOPTIME // 10 seconds remaining && me->LinkState == ARQ_CONNECTED // link is connected && me->primary == true ) { // this is the connecting station if (--me->retries) { // repeat Retries and then allow timeout me->TxTextQueue.clear(); me->identFrame(); // send an identity frame to try to keep me->transmitdata(); // the link up me->timeout = me->rtry(); //10000 / ARQLOOPTIME + 1; } } if (me->timeout == 0) { if (me->LinkState == ARQ_CONNECTED) me->LinkState = TIMEDOUT; else me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); } if (me->retries == 0) { me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); me->printSTATUS(STIMEDOUT, 10.0); } } } } if (me->arqstop) { me->LinkState = STOPPED; me->arqstop = false; me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); me->printSTATUS(STIMEDOUT, 10.0); Fl::repeat_timeout( 1.0, arqloop, me); return; } Fl::repeat_timeout( ARQLOOPTIME/1000.0, arqloop, me); } void arq::start_arq() { Fl::add_timeout(1.0, arqloop, this); } void arq::restart_arq() { arqstop = true; } //--------------------------------------------------------------------- fldigi-4.1.06/src/flarq-src/arqhelp.cxx0000644000175000017500000002133113472116001014615 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __WOE32__ #include #include #include #endif // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include #include "flarq.h" #include "arq.h" #include "arqdialogs.h" #include "b64.h" Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0; void help_cb() { if (!help_dialog) { help_dialog = new Fl_Help_Dialog(); help_dialog->value( "\n" "\n" "Flarq Help\n" "\n" "\n" "

Initiating an ARQ connect session

\n" "

Start by sending a 'CQ NBEMS' or some similar unique way of indicating\n" "that you are seeking to send ARQ traffic. Do this from the digital modem\n" "program and not from flarq. The potential station for receiving your ARQ\n" "traffic will answer in the clear. Negotiate what digital mode you will use\n" "for the ARQ connection; ie: PSK-63, PSK-125, PSK-250, MFKS-16 etc. Then\n" "try that mode without ARQ to be sure that QRN and QSB will not seriously\n" "disrupt the connection. Ask the responding station to send an ARQ beacon\n" "using flarq. You will then see his ARQ callsign appear in the callsign\n" "window.

" "

Click the CONNECT button to connect with that station. The text next to\n" "the diamond will change to CONNECTING and remain that way during the connect\n" "time out period. During the connection process the CONNECT button will be\n" "disabled (greyed out).

\n" "

After a connection has been established the button label changes to\n" "'Disconnect' and the text next to the diamond indicator will read CONNECTED.\n" "Pressing this button will then execute an orderly disconnect from the other\n" "station and return the program to the CONNECTED state.

\n" "

During a file transfer the button's label changes to Abort. When the\n" "button says Abort, pressing it will abort the file transfer and the program\n" "will return to the CONNECTED state. During the abort text next to the\n" "diamond indicator will read ABORTING XFR and return to CONNECTED after the\n" "abort has been fully recognized by both ends of the connection.

\n" "

Beaconing

\n" "

Click the Beacon button to transmit a beacon signal requesting\n" "assistance with ARQ message forwarding. The small rectangle on the Beacon\n" "button will turn green when a beacon signal is being sent. The beacon will\n" "repeat at the repeat interval (default is 60 seconds). You should not reduce\n" "the repeat interval so short as to make it impossible to receive an ARQ\n" "connection. This is particularly true on PSK-31.

\n" "

Diamond Indicator

\n" "

The diamond-shaped indicator will be green when ready to transfer messages.\n" "The ""Not Connected"" label next to the diamond indicator will change to Sending\n" "when sending, or Connected when connected.

\n" "

Send Menu

\n" "

The Send menu will not be enabled unless a CONNECTION has been established\n" "with another flarq station.

\n" "

This menu accesses four types of files. When selecting any type, the Show: field\n" "allows you to use the dropdown arrow to choose which type of file to display.

\n" "

The area with the question mark is where file content is displayed, if the Preview\n" "box is checked.

\n" "

The Filename field has a row of buttons above it which can be used to quickly\n" "navigate through the hierarchy of folders shown. Just click the button over the\n" "folder you want to access.

\n" "

When Email is selected, a list of emails waiting to be transferred will be\n" "displayed. Select an email and click the Send button to start transferring the\n" "email.

\n" "

When Image File is selected, Flarq can send a color, passport photo sized\n" "picture, in about 10 minutes using PSK250.

\n" "

Config Menu

\n" "

This menu provides a place where you should enter your callsign that Flarq\n" "will use for transmitting. Various folders are shown and can be changed, but\n" "it is recommended that the default folders be used except in special\n" "circumstances.

\n" "

If you are using the Sylpheed mail client you need to check that box.\n" "Sylpheed uses a different naming convention for storing messages inside of\n" "it's mail folders.

\n" "

The beacon interval is probably the most often changed setting. Use it to\n" "control how often Flarq sends the beacon text.

\n" "

You can enter additional beacon text which will be sent with the each time\n" "the ARQ beacon is transmited.

\n" "

At the bottom left of the Flarq window there is a space on the left side that\n" "displays messages showing the Flarq status at any given time.

\n" "

At the bottom right, there is a space for a progress indicator, which will show\n" "a moving green bar as a message is transferred. When a transfer is completed, the\n" "green color will disappear after filling the space, indicating that transfer has\n" "been completed.

\n" "

Status Bar

\n" "

A notification area in the bar just above the Plain Talk label will show the name\n" "and size of the file being transferred and how long it took to transfer when the\n" "transfer is completed. The left and right arrows are for adjusting the number of\n" "SOH characters preceding each block. Leave it at the default of 10 unless you\n" "have trouble connecting at high speed, or have too many repeat blocks. Then try\n" "higher values to reduce the number of repeated blocks.

\n" "

Next to the right hand arrow is an area where the quality level of the transfer\n" "is shown. A transfer without any retries will be shown as 1.00.

\n" "

The area next to the Clear button will display a progress indicator, which will\n" "show the progress of the transfer. When you are sending a message, it will show\n" "the amount of the message confirmed as being received correctly. When you are on\n" "the receiving end, it will advance as each message frame is received.

\n" "

The Clear button can be used to clear the flarq screen.

\n" "

Plain Talk

\n" "

You can also communicate during, before, or after a file transfer, as long as\n" "the Connected diamond is green (showing that you are connected to the other\n" "station), by typing in the box next to the Clear button at the very bottom of\n" "the flarq window, and pressing Enter. The text you are sending will be shown\n" "in red in the Plain Talk window and incoming text from the other station will\n" "be shown in black. Text you type will be sent out at the first opportunity,\n" "but only after a block completes being sent, so there will be a delay until\n" "your text appears on the other station's Plain Talk window, and the other\n" "station responds. As with most edit controls it is necessary to first put\n" "the keyboard focus in that box by clicking in it with the mouse.

\n" "

The maximum number of characters you can type on the Plain Talk line before\n" "pressing Enter can be no more than 80 characters. In order to make the speed\n" "of Plain Talk text exchanges as rapid as possible, Plain Talk uses the current\n" "mode without any ARQ error checking, so there may be some errors at the\n" "receiving end that would not occur if ARQ were used.

\n" "

The Clear button next to the Plain Talk line can be used to clear the Plain\n" "Talk display area." "\n" ); } help_dialog->show(); } fldigi-4.1.06/src/config.h.in0000644000175000017500000003526513472116001012601 00000000000000/* src/config.h.in. Generated from configure.ac by autoheader. */ #ifndef CONFIG_H_ #define CONFIG_H_ /* Defined if we are building for benchmarking */ #undef BENCHMARK_MODE /* Build platform */ #undef BUILD_BUILD_PLATFORM /* Compiler */ #undef BUILD_COMPILER /* Configure arguments */ #undef BUILD_CONFIGURE_ARGS /* Build date */ #undef BUILD_DATE /* Build host */ #undef BUILD_HOST /* Host platform */ #undef BUILD_HOST_PLATFORM /* Target platform */ #undef BUILD_TARGET_PLATFORM /* Build user */ #undef BUILD_USER /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Flarq authors */ #undef FLARQ_AUTHORS /* Flarq compiler flags */ #undef FLARQ_BUILD_CXXFLAGS /* Flarq linker flags */ #undef FLARQ_BUILD_LDFLAGS /* Flarq Docs index */ #undef FLARQ_DOCS /* Flarq version string */ #undef FLARQ_VERSION /* Flarq major version number */ #undef FLARQ_VERSION_MAJOR /* Flarq minor version number */ #undef FLARQ_VERSION_MINOR /* Flarq patch/alpha version string */ #undef FLARQ_VERSION_PATCH /* Fldigi authors */ #undef FLDIGI_AUTHORS /* Fldigi cc compiler flags */ #undef FLDIGI_BUILD_CFLAGS /* Fldigi cpp compiler flags */ #undef FLDIGI_BUILD_CXXFLAGS /* Fldigi linker flags */ #undef FLDIGI_BUILD_LDFLAGS /* FLTK API major version */ #undef FLDIGI_FLTK_API_MAJOR /* FLTK API minor version */ #undef FLDIGI_FLTK_API_MINOR /* FLTK API patch */ #undef FLDIGI_FLTK_API_PATCH /* Fldigi version string */ #undef FLDIGI_VERSION /* Fldigi major version number */ #undef FLDIGI_VERSION_MAJOR /* Fldigi minor version number */ #undef FLDIGI_VERSION_MINOR /* Fldigi patch/alpha version string */ #undef FLDIGI_VERSION_PATCH /* FLTK version */ #undef FLTK_BUILD_VERSION /* flxmlrpc version */ #undef FLXMLRPC_BUILD_VERSION /* Define to 0 if gcc < 4.1.0 */ #undef GCC_VER_OK /* hamlib version */ #undef HAMLIB_BUILD_VERSION /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if we have clock_gettime */ #undef HAVE_CLOCK_GETTIME /* define if the compiler supports basic C++11 syntax */ #undef HAVE_CXX11 /* Define to 0 if not using dbg::stack */ #undef HAVE_DBG_STACK /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DEV_PPBUS_PPI_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if we have dlopen */ #undef HAVE_DLOPEN /* Define to 1 if you have the header file. */ #undef HAVE_EXECINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `getaddrinfo' function. */ #undef HAVE_GETADDRINFO /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the `hstrerror' function. */ #undef HAVE_HSTRERROR /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PPDEV_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have O_CLOEXEC defined */ #undef HAVE_O_CLOEXEC /* Define to 1 if you have the header file. */ #undef HAVE_REGEX_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if we have sem_timedwait */ #undef HAVE_SEM_TIMEDWAIT /* Define to 1 if we have sem_unlink */ #undef HAVE_SEM_UNLINK /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the `socketpair' function. */ #undef HAVE_SOCKETPAIR /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Defined 0 if we do not have std::bind in */ #undef HAVE_STD_BIND /* Defined 0 if we do not have std::bind in */ #undef HAVE_STD_HASH /* Defined 0 if we do not have std::tr1::bind in */ #undef HAVE_STD_TR1_BIND /* Defined 0 if we do not have std::tr1::hash in */ #undef HAVE_STD_TR1_HASH /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strcasestr' function. */ #undef HAVE_STRCASESTR /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strlcpy' function. */ #undef HAVE_STRLCPY /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strncmp' function. */ #undef HAVE_STRNCMP /* Define to 1 if you have the `strncpy' function. */ #undef HAVE_STRNCPY /* Define to 1 if you have the `strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* libmbedtls version */ #undef LIBMBEDTLS_BUILD_VERSION /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Download page */ #undef PACKAGE_DL /* Docs index */ #undef PACKAGE_DOCS /* Beginners guide */ #undef PACKAGE_GUIDE /* Home page */ #undef PACKAGE_HOME /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Trac new ticket page */ #undef PACKAGE_NEWBUG /* Sourceforge page */ #undef PACKAGE_PROJ /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* png version */ #undef PNG_BUILD_VERSION /* portaudio version */ #undef PORTAUDIO_BUILD_VERSION /* pulseaudio version */ #undef PULSEAUDIO_BUILD_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* samplerate version */ #undef SAMPLERATE_BUILD_VERSION /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* sndfile version */ #undef SNDFILE_BUILD_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Define to 1 if we are using flxmlrpc */ #undef USE_FLXMLRPC /* Define to 1 if we are using hamlib */ #undef USE_HAMLIB /* Define to 1 if we are using libmbedtls */ #undef USE_LIBMBEDTLS /* Defined if we are using OSS */ #undef USE_OSS /* Define to 1 if we are using png */ #undef USE_PNG /* Define to 1 if we are using portaudio */ #undef USE_PORTAUDIO /* Define to 1 if we are using pulseaudio */ #undef USE_PULSEAUDIO /* Define to 1 if we are using samplerate */ #undef USE_SAMPLERATE /* Define to 1 if we are using sndfile */ #undef USE_SNDFILE /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Defined if we are using TLS */ #undef USE_TLS /* Define to 1 if we are using x */ #undef USE_X /* Version number of package */ #undef VERSION /* x version */ #undef X_BUILD_VERSION /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to 1 if we are building on cygwin or mingw */ #undef _WINDOWS /* Define to 1 if we are building on cygwin or mingw */ #undef __MINGW32__ /* Define to 1 if we are building on cygwin or mingw */ #undef __WOE32__ /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef int8_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile #include "pkg.h" #include "util.h" #endif /* CONFIG_H_ */ fldigi-4.1.06/src/combo/0000775000175000017500000000000013515625026011736 500000000000000fldigi-4.1.06/src/combo/combo.cxx0000644000175000017500000002743713472116001013502 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "config.h" #include "combo.h" void popbrwsr_cb (Fl_Widget *v, long d); Fl_PopBrowser::Fl_PopBrowser (int X, int Y, int W, int H, const char *label) : Fl_Window (X, Y, W, H, label) { hRow = H; wRow = W; clear_border(); box(FL_BORDER_BOX); align(FL_ALIGN_INSIDE); popbrwsr = new Fl_Select_Browser(0,0,wRow,hRow, ""); popbrwsr->callback ( (Fl_Callback*)popbrwsr_cb); popbrwsr->align(FL_ALIGN_INSIDE); parentCB = 0; end(); set_modal(); } Fl_PopBrowser::~Fl_PopBrowser () { delete popbrwsr; } int Fl_PopBrowser::handle(int event) { Fl_ComboBox *cbx = (Fl_ComboBox*)this->parent(); if (!Fl::event_inside( child(0) ) && event == FL_PUSH) { pophide(); return 1; } if (event == FL_KEYDOWN) { int kbd = Fl::event_key(); int key = Fl::event_text()[0]; if (kbd == FL_Down) { if (popbrwsr->value() < popbrwsr->size()) popbrwsr->select(popbrwsr->value() + 1); popbrwsr->bottomline(popbrwsr->value()); return 1; } if (kbd == FL_Up && popbrwsr->value() > 1) { popbrwsr->select(popbrwsr->value() - 1); return 1; } if (key == '\r' || kbd == FL_Enter) { // kbd test for OS X int n = popbrwsr->value() - 1; pophide(); cbx->index(n); cbx->do_callback(); return 1; } if (key == '\b' || kbd == FL_BackSpace) { // kbd test for OS X if (!keystrokes.empty()) keystrokes.erase(keystrokes.length() - 1, 1); return 1; } if (key == 0x1b || kbd == FL_Escape) { // kbd test for OS X pophide(); return 0; } if (key >= ' ' && key <= 0x7f) { keystrokes += key; for (int i = 0; i < cbx->listsize; i++) { if (strncasecmp(keystrokes.c_str(), cbx->datalist[i]->s, keystrokes.length()) == 0) { popbrwsr->select(i+1); popbrwsr->show(i+1); return 1; } } return 0; } } return Fl_Group::handle(event); } void Fl_PopBrowser::add(char *s, void *d) { popbrwsr->add(s,d); } void Fl_PopBrowser::clear() { popbrwsr->clear(); } void Fl_PopBrowser::sort() { return; } void Fl_PopBrowser::popshow (int x, int y) { int nRows = parentCB->numrows(); int fh = fl_height(); int height = nRows * fh + 4; if (popbrwsr->size() == 0) return; if (nRows > parentCB->lsize()) nRows = parentCB->lsize(); // locate first occurance of inp string value in the list // and display that if found int i = parentCB->index(); if (!(i >= 0 && i < parentCB->listsize)) { for (i = 0; i < parentCB->listsize; i++) if (parentCB->type_ == COMBOBOX) { if (!strcmp(parentCB->val->value(), parentCB->datalist[i]->s)) break; } else { if (!strcmp(parentCB->valbox->label(), parentCB->datalist[i]->s)) break; } if (i == parentCB->listsize) i = 0; } // resize and reposition the popup to insure that it is within the bounds // of the uppermost parent widget // preferred position is just below and at the same x position as the // parent widget Fl_Widget *gparent = parentCB; int hp = gparent->h(); while ((gparent = gparent->parent())) { hp = gparent->h(); parentWindow = gparent; } int nu = nRows, nl = nRows; int hu = nu * fh + 4, hl = nl * fh + 4; int yu = parentCB->y() - hu; int yl = y; while (nl > 1 && (yl + hl > hp)) { nl--; hl -= fh; } while (nu > 1 && yu < 0) { nu--; yu += fh; hu -= fh; } y = yl; height = hl; if (nl < nu) { y = yu; height = hu; } wRow = parentCB->w(); popbrwsr->size (wRow, height); resize (x, y, wRow, height); popbrwsr->redraw(); popbrwsr->topline (i); keystrokes.empty(); popbrwsr->show(); show(); for (const Fl_Widget* o = popbrwsr; o; o = o->parent()) ((Fl_Widget *)o)->set_visible(); if (parentWindow) { parentWindow->damage(FL_DAMAGE_ALL); parentWindow->redraw(); } Fl::grab(this); } void Fl_PopBrowser::pophide () { hide (); if (parentWindow) { parentWindow->damage(FL_DAMAGE_ALL); parentWindow->redraw(); } Fl::grab(0); Fl::focus(((Fl_ComboBox*)parent())->btn); } void Fl_PopBrowser::popbrwsr_cb_i (Fl_Widget *v, long d) { // update the return values Fl_Select_Browser *SB = (Fl_Select_Browser *)(v); Fl_PopBrowser *PB = (Fl_PopBrowser *)(SB->parent()); Fl_ComboBox *CB = (Fl_ComboBox *)(PB->parent()); int row = SB->value(); if (row == 0) return; SB->deselect(); CB->index(row - 1); PB->pophide(); CB->do_callback(); return; } void popbrwsr_cb (Fl_Widget *v, long d) { ((Fl_PopBrowser *)(v))->popbrwsr_cb_i (v, d); return; } void Fl_ComboBox::fl_popbrwsr(Fl_Widget *p) { int xpos = p->x(), ypos = p->h() + p->y(); // pass the calling widget to the popup browser so that the // correct callback function can be called when the user selects an item // from the browser list Brwsr->parentCB = (Fl_ComboBox *) p; Brwsr->clear_kbd(); Brwsr->popshow(xpos, ypos); return; } void btnComboBox_cb (Fl_Widget *v, void *d) { Fl_ComboBox *p = (Fl_ComboBox *)(v->parent()); p->fl_popbrwsr (p); return; } void val_callback(Fl_Widget *w, void *d) { Fl_Input *inp = (Fl_Input *)(w); Fl_ComboBox *cbx = (Fl_ComboBox *)(d); cbx->add(inp->value()); cbx->sort(); } Fl_ComboBox::Fl_ComboBox (int X,int Y,int W,int H, const char *lbl, int wtype) : Fl_Group (X, Y, W, H, lbl) { width = W; height = H; type_ = wtype; valbox = new Fl_Box (FL_DOWN_BOX, X, Y, W-H, H, ""); valbox->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT); valbox->color(FL_BACKGROUND2_COLOR); val = new Fl_Input (X, Y, W-H, H, ""); val->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT); val->callback((Fl_Callback *)val_callback, this); val->when(FL_WHEN_RELEASE); if (type_ == LISTBOX) { valbox->show(); val->hide(); } else { val->show(); valbox->hide(); } btn = new Fl_Button (X + W - H + 1, Y, H - 1, H, "@2>"); btn->callback ((Fl_Callback *)btnComboBox_cb, 0); Brwsr = 0; datalist = new datambr *[FL_COMBO_LIST_INCR]; maxsize = FL_COMBO_LIST_INCR; for (int i = 0; i < FL_COMBO_LIST_INCR; i++) datalist[i] = 0; listsize = 0; listtype = 0; Brwsr = new Fl_PopBrowser(X, Y, W, H, ""); Brwsr->align(FL_ALIGN_INSIDE); idx = 0; end(); numrows_ = 8; } Fl_ComboBox::~Fl_ComboBox() { delete Brwsr; for (int i = 0; i < listsize; i++) { if (datalist[i]) { if (datalist[i]->s) delete [] datalist[i]->s; delete datalist[i]; } } delete [] datalist; } int Fl_ComboBox::handle(int event) { if (event == FL_KEYDOWN) { int kbd = Fl::event_key(); if (kbd == FL_Down) { fl_popbrwsr (this); return 1; } } return Fl_Group::handle(event); } void Fl_ComboBox::type (int t) { listtype = t; } void Fl_ComboBox::readonly(bool yes) { if (type_ == LISTBOX) return; val->readonly(yes); if (yes) val->selection_color(fl_rgb_color(173,216,230)); else val->selection_color(FL_SELECTION_COLOR); } // ComboBox value is contained in the val widget const char *Fl_ComboBox::value() { if (type_ == LISTBOX) return valbox->label(); else return val->value(); } void Fl_ComboBox::value( std::string s ) { while (s[0] == ' ') { s.erase(0,1); } if (s.empty()) { if (type_ == LISTBOX) { valbox->label(""); valbox->redraw_label(); } else { val->value(""); val->redraw(); } return; } int i; if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { for (i = 0; i < listsize; i++) { if (strcasecmp (s.c_str(), datalist[i]->s) == 0) break; } } else { for (i = 0; i < listsize; i++) { if (strcmp (s.c_str(), datalist[i]->s) == 0) break; } } if ( i < listsize) { idx = i; if (type_ == LISTBOX) { valbox->label(datalist[idx]->s); valbox->redraw_label(); } else { val->value(datalist[idx]->s); val->redraw(); } } else { if (type_ == LISTBOX) { valbox->label(""); valbox->redraw_label(); } else if (type_ != LISTBOX && !val->readonly()) { insert(s.c_str(), 0); for (i = 0; i < listsize; i++) { if (strcmp (s.c_str(), datalist[i]->s) == 0) { idx = i; val->value(datalist[idx]->s); break; } val->redraw(); } } else { val->value(""); val->redraw(); } } } void Fl_ComboBox::put_value(const char *s) { value(s); } void Fl_ComboBox::index(int i) { if (i >= 0 && i < listsize) { idx = i; if (type_ == LISTBOX) { valbox->label(datalist[idx]->s); valbox->redraw_label(); } else { val->value( datalist[idx]->s); val->redraw(); } } } int Fl_ComboBox::index() { return idx; } void * Fl_ComboBox::data() { return retdata; } void Fl_ComboBox::insert(const char *str, void *d) { datalist[listsize] = new datambr; datalist[listsize]->s = new char [strlen(str) + 1]; datalist[listsize]->s[0] = 0; strcpy (datalist[listsize]->s, str); datalist[listsize]->d = 0; Brwsr->add(datalist[listsize]->s,d); listsize++; if (listsize == maxsize) { int nusize = maxsize + FL_COMBO_LIST_INCR; datambr **temparray = new datambr *[nusize]; for (int i = 0; i < listsize; i++) temparray[i] = datalist[i]; delete [] datalist; datalist = temparray; maxsize = nusize; } } void Fl_ComboBox::add( const char *s, void * d) { std::string str = s; std::string sinsert; size_t p = str.find("|"); bool found = false; if (p != std::string::npos) { while (p != std::string::npos) { sinsert = str.substr(0, p); found = false; // test for in list if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { for (int i = 0; i < listsize; i++) { if (sinsert == datalist[i]->s) { found = true; break; } } } // not in list, so add this entry if (!found) insert(sinsert.c_str(), 0); str.erase(0, p+1); p = str.find("|"); } if (str.length()) insert(str.c_str(), 0); } else insert( s, d ); } void Fl_ComboBox::clear() { Brwsr->clear(); if (listsize == 0) return; for (int i = 0; i < listsize; i++) { delete [] datalist[i]->s; delete datalist[i]; } listsize = 0; } int DataCompare( const void *x1, const void *x2 ) { int cmp; datambr *X1, *X2; X1 = *(datambr **)(x1); X2 = *(datambr **)(x2); cmp = strcasecmp (X1->s, X2->s); if (cmp < 0) return -1; if (cmp > 0) return 1; return 0; } void Fl_ComboBox::sort() { Brwsr->clear (); qsort (&datalist[0], listsize, sizeof (datambr *), DataCompare); for (int i = 0; i < listsize; i++) Brwsr->add (datalist[i]->s, datalist[i]->d); } void Fl_ComboBox::textfont (int fnt) { if (type_ == LISTBOX) valbox->labelfont (fnt); else val->textfont (fnt); } void Fl_ComboBox::textsize (uchar n) { if (type_ == LISTBOX) valbox->labelsize(n); else val->textsize (n); } void Fl_ComboBox::textcolor( Fl_Color c) { if (type_ == LISTBOX) valbox->labelcolor (c); else val->textcolor (c); } void Fl_ComboBox::color(Fl_Color c) { _color = c; if (type_ == LISTBOX) { valbox->color(c); valbox->redraw(); } else { val->color(c); val->redraw(); } if (Brwsr) Brwsr->color(c); } int Fl_ComboBox::find_index(const char *str) { if((listsize < 1) || !str) return -1; for (int i = 0; i < listsize; i++) { if(datalist[i]->s) if(strncmp(datalist[i]->s, str, FILENAME_MAX) == 0) return i; } return -1; } void Fl_ComboBox::position(int n) { if (type_ != LISTBOX) val->position(n, n); } fldigi-4.1.06/src/Makefile.in0000664000175000017500000332215213515623767012646 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (c) 2008 Dave Freese, W1HKJ (w1hkj AT w1hkj DOT com) # Copyright (c) 2012 Remi Chateauneu, F4ECW (remi dot chateauneu AT gmail DOT com) # License: GPLv3+: GNU GPL version 3 or later. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) @WANT_FLDIGI_TRUE@am__append_1 = fldigi @WANT_FLARQ_TRUE@am__append_2 = flarq @WIN32_TRUE@am__append_3 = -fno-var-tracking @WIN32_TRUE@am__append_4 = -fno-var-tracking @ENABLE_FLXMLRPC_FALSE@am__append_5 = $(XMLRPCPP_SRC) @ENABLE_FLXMLRPC_FALSE@am__append_6 = $(XMLRPCPP_SRC) @ENABLE_FLXMLRPC_TRUE@am__append_7 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_8 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_9 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_10 = @FLXMLRPC_LIBS@ @ENABLE_FLXMLRPC_TRUE@am__append_11 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_12 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_13 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_14 = @FLXMLRPC_LIBS@ @ENABLE_LIBMBEDTLS_FALSE@am__append_15 = $(LIBMBEDTLS_SRC) @ENABLE_LIBMBEDTLS_TRUE@am__append_16 = @LIBMBEDTLS_CFLAGS@ @ENABLE_LIBMBEDTLS_TRUE@am__append_17 = @LIBMBEDTLS_CFLAGS@ @ENABLE_LIBMBEDTLS_TRUE@am__append_18 = @LIBMBEDTLS_CFLAGS@ @ENABLE_LIBMBEDTLS_TRUE@am__append_19 = @LIBMBEDTLS_LIBS@ @ENABLE_HAMLIB_TRUE@am__append_20 = $(HAMLIB_SRC) @NEED_HAMLIB_LOCATOR_TRUE@am__append_21 = $(LOCATOR_SRC) @ENABLE_BENCHMARK_TRUE@am__append_22 = $(BENCHMARK_SRC) @COMPAT_REGEX_TRUE@am__append_23 = $(REGEX_SRC) @COMPAT_REGEX_TRUE@am__append_24 = $(REGEX_SRC) @COMPAT_STACK_TRUE@am__append_25 = $(STACK_SRC) @COMPAT_STACK_TRUE@am__append_26 = $(STACK_SRC) @MINGW32_TRUE@am__append_27 = $(MINGW32_SRC) @MINGW32_TRUE@am__append_28 = $(MINGW32_SRC) @USE_NLS_TRUE@am__append_29 = $(NLS_SRC) @USE_NLS_TRUE@am__append_30 = $(NLS_SRC) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__append_31 = $(FLDIGI_WIN32_RES_SRC) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__append_32 = $(FLARQ_WIN32_RES_SRC) @DARWIN_TRUE@am__append_33 = $(APPBUNDLE_NOLIBS) $(APPBUNDLE) $(APPBUNDLE)*.dmg @HAVE_NSIS_TRUE@am__append_34 = $(INSTALLER_FILE) @USE_NLS_TRUE@am__append_35 = share subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/intl/gettext.m4 \ $(top_srcdir)/m4/intl/iconv.m4 $(top_srcdir)/m4/intl/lib-ld.m4 \ $(top_srcdir)/m4/intl/lib-link.m4 \ $(top_srcdir)/m4/intl/lib-prefix.m4 \ $(top_srcdir)/m4/intl/nls.m4 $(top_srcdir)/m4/intl/po.m4 \ $(top_srcdir)/m4/intl/progtest.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/benchmark.m4 $(top_srcdir)/m4/bind.m4 \ $(top_srcdir)/m4/build.m4 $(top_srcdir)/m4/c++11.m4 \ $(top_srcdir)/m4/debug.m4 $(top_srcdir)/m4/docs.m4 \ $(top_srcdir)/m4/fltk.m4 $(top_srcdir)/m4/funcs.m4 \ $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/libintl.m4 \ $(top_srcdir)/m4/macosx.m4 $(top_srcdir)/m4/np-compat.m4 \ $(top_srcdir)/m4/opt.m4 $(top_srcdir)/m4/oss.m4 \ $(top_srcdir)/m4/pkg-config.m4 $(top_srcdir)/m4/progs.m4 \ $(top_srcdir)/m4/static.m4 $(top_srcdir)/m4/tls.m4 \ $(top_srcdir)/m4/win32.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @WANT_FLDIGI_TRUE@am__EXEEXT_1 = fldigi$(EXEEXT) @WANT_FLARQ_TRUE@am__EXEEXT_2 = flarq$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__flarq_SOURCES_DIST = xmlrpcpp/XmlRpcBase64.h \ xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcMutex.cpp xmlrpcpp/XmlRpcMutex.h \ xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h compat/regex.h compat/regex.c \ include/stack.h misc/stack.cxx include/compat.h \ compat/getsysinfo.c compat/mingw.c compat/mingw.h misc/nls.cxx \ include/nls.h flarq-src/flarqrc.rc dialogs/font_browser.cxx \ flarq-src/arq.cxx flarq-src/arqdialogs.cxx \ flarq-src/arqhelp.cxx flarq-src/b64.cxx flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx flarq-src/xml_server.cxx \ flarq-src/include/arq.h flarq-src/include/arqdialogs.h \ flarq-src/include/b64.h flarq-src/include/flarq.h \ flarq-src/include/flarqenv.h flarq-src/include/xml_server.h \ include/Fl_Text_Display_mod.H include/Fl_Text_Editor_mod.H \ include/FTextView.h include/debug.h include/fileselect.h \ include/flinput2.h include/flmisc.h include/flslider2.h \ include/font_browser.h include/icons.h include/pixmaps.h \ include/re.h include/socket.h include/stacktrace.h \ include/threads.h include/table.h include/util.h \ combo/combo.cxx fileselector/fileselect.cxx logbook/table.cxx \ misc/ascii.cxx misc/debug.cxx misc/stacktrace.cxx \ misc/threads.cxx misc/timeops.cxx network/socket.cxx \ widgets/flinput2.cxx widgets/flmisc.cxx widgets/flslider2.cxx \ misc/icons.cxx misc/pixmaps.cxx misc/pixmaps_tango.cxx \ misc/re.cxx misc/util.cxx widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx am__dirstamp = $(am__leading_dot)dirstamp am__objects_1 = xmlrpcpp/flarq-XmlRpcClient.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcDispatch.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcMutex.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcServerConnection.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcServer.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcServerMethod.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcSocket.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcSource.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcUtil.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcValue.$(OBJEXT) @ENABLE_FLXMLRPC_FALSE@am__objects_2 = $(am__objects_1) am__objects_3 = compat/flarq-regex.$(OBJEXT) @COMPAT_REGEX_TRUE@am__objects_4 = $(am__objects_3) am__objects_5 = misc/flarq-stack.$(OBJEXT) @COMPAT_STACK_TRUE@am__objects_6 = $(am__objects_5) am__objects_7 = compat/flarq-getsysinfo.$(OBJEXT) \ compat/flarq-mingw.$(OBJEXT) @MINGW32_TRUE@am__objects_8 = $(am__objects_7) am__objects_9 = misc/flarq-nls.$(OBJEXT) @USE_NLS_TRUE@am__objects_10 = $(am__objects_9) am__objects_11 = flarq-src/flarqrc.$(OBJEXT) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__objects_12 = $(am__objects_11) am_flarq_OBJECTS = $(am__objects_2) $(am__objects_4) $(am__objects_6) \ $(am__objects_8) $(am__objects_10) $(am__objects_12) \ dialogs/flarq-font_browser.$(OBJEXT) \ flarq-src/flarq-arq.$(OBJEXT) \ flarq-src/flarq-arqdialogs.$(OBJEXT) \ flarq-src/flarq-arqhelp.$(OBJEXT) \ flarq-src/flarq-b64.$(OBJEXT) flarq-src/flarq-flarq.$(OBJEXT) \ flarq-src/flarq-flarqenv.$(OBJEXT) \ flarq-src/flarq-xml_server.$(OBJEXT) \ combo/flarq-combo.$(OBJEXT) \ fileselector/flarq-fileselect.$(OBJEXT) \ logbook/flarq-table.$(OBJEXT) misc/flarq-ascii.$(OBJEXT) \ misc/flarq-debug.$(OBJEXT) misc/flarq-stacktrace.$(OBJEXT) \ misc/flarq-threads.$(OBJEXT) misc/flarq-timeops.$(OBJEXT) \ network/flarq-socket.$(OBJEXT) \ widgets/flarq-flinput2.$(OBJEXT) \ widgets/flarq-flmisc.$(OBJEXT) \ widgets/flarq-flslider2.$(OBJEXT) misc/flarq-icons.$(OBJEXT) \ misc/flarq-pixmaps.$(OBJEXT) \ misc/flarq-pixmaps_tango.$(OBJEXT) misc/flarq-re.$(OBJEXT) \ misc/flarq-util.$(OBJEXT) \ widgets/flarq-Fl_Text_Buffer_mod.$(OBJEXT) \ widgets/flarq-Fl_Text_Display_mod.$(OBJEXT) \ widgets/flarq-Fl_Text_Editor_mod.$(OBJEXT) \ widgets/flarq-FTextView.$(OBJEXT) flarq_OBJECTS = $(am_flarq_OBJECTS) flarq_DEPENDENCIES = flarq_LINK = $(CXXLD) $(flarq_CXXFLAGS) $(CXXFLAGS) $(flarq_LDFLAGS) \ $(LDFLAGS) -o $@ am__fldigi_SOURCES_DIST = include/xmlrpc.h network/xmlrpc.cxx \ xmlrpcpp/XmlRpcBase64.h xmlrpcpp/XmlRpcClient.cpp \ xmlrpcpp/XmlRpcClient.h xmlrpcpp/XmlRpcDispatch.cpp \ xmlrpcpp/XmlRpcDispatch.h xmlrpcpp/XmlRpcException.h \ xmlrpcpp/XmlRpc.h xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h mbedtls/aes.c mbedtls/aesni.c \ mbedtls/arc4.c mbedtls/aria.c mbedtls/asn1parse.c \ mbedtls/asn1write.c mbedtls/base64.c mbedtls/bignum.c \ mbedtls/blowfish.c mbedtls/camellia.c mbedtls/ccm.c \ mbedtls/certs.c mbedtls/chacha20.c mbedtls/chachapoly.c \ mbedtls/cipher.c mbedtls/cipher_wrap.c mbedtls/cmac.c \ mbedtls/ctr_drbg.c mbedtls/debug.c mbedtls/des.c mbedtls/dhm.c \ mbedtls/ecdh.c mbedtls/ecdsa.c mbedtls/ecjpake.c mbedtls/ecp.c \ mbedtls/ecp_curves.c mbedtls/entropy.c mbedtls/entropy_poll.c \ mbedtls/error.c mbedtls/gcm.c mbedtls/havege.c mbedtls/hkdf.c \ mbedtls/hmac_drbg.c mbedtls/md2.c mbedtls/md4.c mbedtls/md5.c \ mbedtls/md.c mbedtls/md_wrap.c mbedtls/memory_buffer_alloc.c \ mbedtls/net_sockets.c mbedtls/nist_kw.c mbedtls/oid.c \ mbedtls/padlock.c mbedtls/pem.c mbedtls/pk.c mbedtls/pkcs11.c \ mbedtls/pkcs12.c mbedtls/pkcs5.c mbedtls/pkparse.c \ mbedtls/pk_wrap.c mbedtls/pkwrite.c mbedtls/platform.c \ mbedtls/platform_util.c mbedtls/poly1305.c mbedtls/ripemd160.c \ mbedtls/rsa.c mbedtls/rsa_internal.c mbedtls/sha1.c \ mbedtls/sha256.c mbedtls/sha512.c mbedtls/ssl_cache.c \ mbedtls/ssl_ciphersuites.c mbedtls/ssl_cli.c \ mbedtls/ssl_cookie.c mbedtls/ssl_srv.c mbedtls/ssl_ticket.c \ mbedtls/ssl_tls.c mbedtls/threading.c mbedtls/timing.c \ mbedtls/version.c mbedtls/version_features.c mbedtls/x509.c \ mbedtls/x509_create.c mbedtls/x509_crl.c mbedtls/x509_crt.c \ mbedtls/x509_csr.c mbedtls/x509write_crt.c \ mbedtls/x509write_csr.c mbedtls/xtea.c include/mbedtls/aes.h \ include/mbedtls/aesni.h include/mbedtls/arc4.h \ include/mbedtls/aria.h include/mbedtls/asn1.h \ include/mbedtls/asn1write.h include/mbedtls/base64.h \ include/mbedtls/bignum.h include/mbedtls/blowfish.h \ include/mbedtls/bn_mul.h include/mbedtls/camellia.h \ include/mbedtls/ccm.h include/mbedtls/certs.h \ include/mbedtls/chacha20.h include/mbedtls/chachapoly.h \ include/mbedtls/check_config.h include/mbedtls/cipher.h \ include/mbedtls/cipher_internal.h include/mbedtls/cmac.h \ include/mbedtls/compat-1.3.h include/mbedtls/config.h \ include/mbedtls/ctr_drbg.h include/mbedtls/debug.h \ include/mbedtls/des.h include/mbedtls/dhm.h \ include/mbedtls/ecdh.h include/mbedtls/ecdsa.h \ include/mbedtls/ecjpake.h include/mbedtls/ecp.h \ include/mbedtls/ecp_internal.h include/mbedtls/entropy.h \ include/mbedtls/entropy_poll.h include/mbedtls/error.h \ include/mbedtls/gcm.h include/mbedtls/havege.h \ include/mbedtls/hkdf.h include/mbedtls/hmac_drbg.h \ include/mbedtls/md2.h include/mbedtls/md4.h \ include/mbedtls/md5.h include/mbedtls/md.h \ include/mbedtls/md_internal.h \ include/mbedtls/memory_buffer_alloc.h include/mbedtls/net.h \ include/mbedtls/net_sockets.h include/mbedtls/nist_kw.h \ include/mbedtls/oid.h include/mbedtls/padlock.h \ include/mbedtls/pem.h include/mbedtls/pkcs11.h \ include/mbedtls/pkcs12.h include/mbedtls/pkcs5.h \ include/mbedtls/pk.h include/mbedtls/pk_internal.h \ include/mbedtls/platform.h include/mbedtls/platform_time.h \ include/mbedtls/platform_util.h include/mbedtls/poly1305.h \ include/mbedtls/ripemd160.h include/mbedtls/rsa.h \ include/mbedtls/rsa_internal.h include/mbedtls/sha1.h \ include/mbedtls/sha256.h include/mbedtls/sha512.h \ include/mbedtls/ssl_cache.h include/mbedtls/ssl_ciphersuites.h \ include/mbedtls/ssl_cookie.h include/mbedtls/ssl.h \ include/mbedtls/ssl_internal.h include/mbedtls/ssl_ticket.h \ include/mbedtls/threading.h include/mbedtls/timing.h \ include/mbedtls/version.h include/mbedtls/x509_crl.h \ include/mbedtls/x509_crt.h include/mbedtls/x509_csr.h \ include/mbedtls/x509.h include/mbedtls/xtea.h include/hamlib.h \ rigcontrol/hamlib.cxx include/rigclass.h \ rigcontrol/rigclass.cxx include/benchmark.h misc/benchmark.cxx \ compat/regex.h compat/regex.c include/stack.h misc/stack.cxx \ include/compat.h compat/getsysinfo.c compat/mingw.c \ compat/mingw.h misc/nls.cxx include/nls.h fldigirc.rc \ combo/combo.cxx config_script/create_default_script.cxx \ config_script/run_script.h config_script/run_scripts.cxx \ config_script/script_parsing.cxx \ config_script/script_parsing.h contestia/contestia.cxx \ cw_rtty/cw.cxx cw_rtty/morse.cxx cw_rtty/nanoIO.cxx \ cw_rtty/Nav.cxx cw_rtty/rtty.cxx cw_rtty/view_cw.cxx \ cw_rtty/view_rtty.cxx cw_rtty/winkeyer.cxx \ dialogs/confdialog.cxx dialogs/fl_digi.cxx \ dialogs/font_browser.cxx dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx dialogs/record_browse.cxx \ dialogs/testsigs.cxx dialogs/tod_clock.cxx dialogs/Viewer.cxx \ dominoex/dominoex.cxx dominoex/dominovar.cxx dtmf/dtmf.cxx \ dxcluster/dxcluster.cxx dxcluster/dx_dialog.cxx feld/feld.cxx \ feld/feldfonts.cxx fft-monitor/fft-monitor.cxx \ fft-monitor/spectrum.cxx fft-monitor/spectrum_viewer.cxx \ fileselector/fileselect.cxx filters/fftfilt.cxx \ filters/filters.cxx filters/viterbi.cxx fsq/fsq.cxx \ fsq/fsq_monitor.cxx globals/globals.cxx ifkp/ifkp.cxx \ ifkp/tux.cxx irrxml/CXMLReaderImpl.h irrxml/fast_atof.h \ irrxml/heapsort.h irrxml/irrArray.h irrxml/irrString.h \ irrxml/irrTypes.h irrxml/irrXML.cpp irrxml/irrXML.h \ libtiniconv/tiniconv.c libtiniconv/tiniconv_desc.c \ logbook/adif_io.cxx logbook/calendar.cxx logbook/contest.cxx \ logbook/counties.cxx logbook/county_lists.cxx \ logbook/cty-dat.cxx logbook/date.cxx logbook/fd_logger.cxx \ logbook/fd_view.cxx logbook/lgbook.cxx logbook/logbook.cxx \ logbook/logsupport.cxx logbook/lookupcall.cxx \ logbook/maclogger.cxx logbook/n3fjp_logger.cxx \ logbook/qrzlib.cxx logbook/qso_db.cxx logbook/table.cxx \ logbook/textio.cxx logbook/xmlrpc_log.cxx logger/logger.cxx \ logger/rx_extract.cxx logger/speak.cxx main.cxx \ mfsk/interleave.cxx mfsk/mfsk.cxx mfsk/mfskvaricode.cxx \ misc/arq_io.cxx misc/ascii.cxx misc/ax25_decode.cxx \ misc/charsetdistiller.cxx misc/charsetlist.cxx \ misc/configuration.cxx misc/coordinate.cxx misc/debug.cxx \ misc/dxcc.cxx misc/estrings.cxx misc/icons.cxx \ misc/kiss_io.cxx misc/kmlserver.cxx misc/locator.cxx \ misc/log.cxx misc/macroedit.cxx misc/macros.cxx misc/misc.cxx \ misc/newinstall.cxx misc/outputencoder.cxx misc/pixmaps.cxx \ misc/pixmaps_tango.cxx misc/record_loader.cxx misc/re.cxx \ misc/stacktrace.cxx misc/status.cxx misc/strutil.cxx \ misc/threads.cxx misc/timeops.cxx misc/utf8file_io.cxx \ misc/util.cxx mt63/dsp.cxx mt63/mt63base.cxx mt63/mt63.cxx \ navtex/navtex.cxx network/ca_cert.cxx network/metar.cxx \ network/network.cxx network/socket.cxx network/weather.cxx \ olivia/olivia.cxx psk/pskcoeff.cxx psk/psk.cxx psk/pskeval.cxx \ psk/pskvaricode.cxx psk/viewpsk.cxx psm/psm.cxx psm/psm.h \ qrunner/fqueue.h qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx rigcontrol/norig.cxx \ rigcontrol/ptt.cxx rigcontrol/rigio.cxx \ rigcontrol/rigsupport.cxx rigcontrol/rigxml.cxx \ rigcontrol/serial.cxx rigcontrol/xmlrpc_rig.cxx rsid/rsid.cxx \ soundcard/audio_alert.cxx soundcard/bark.cxx \ soundcard/checkout.cxx soundcard/diesel.cxx \ soundcard/dinnerbell.cxx soundcard/doesnot.cxx \ soundcard/play.pa.cxx soundcard/soundconf.cxx \ soundcard/sound.cxx soundcard/steam_train.cxx spot/notify.cxx \ spot/pskrep.cxx spot/spot.cxx ssb/ssb.cxx synop-src/synop.cxx \ thor/thor.cxx thor/thorvaricode.cxx throb/throb.cxx \ trx/modem.cxx trx/nullmodem.cxx trx/test_signal.cxx \ trx/trx.cxx waterfall/colorbox.cxx waterfall/digiscope.cxx \ waterfall/raster.cxx waterfall/waterfall.cxx wefax/wefax.cxx \ wefax/wefax_map.cxx wefax/wefax-pic.cxx widgets/flinput2.cxx \ widgets/flmisc.cxx widgets/flslider2.cxx \ widgets/Fl_Text_Buffer_mod.cxx widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx widgets/FTextRXTX.cxx \ widgets/FTextView.cxx widgets/Panel.cxx widgets/picture.cxx \ widgets/progress.cxx widgets/psk_browser.cxx \ widgets/pwrmeter.cxx widgets/smeter.cxx wwv/analysis.cxx \ wwv/wwv.cxx am__objects_13 = network/fldigi-xmlrpc.$(OBJEXT) am__objects_14 = xmlrpcpp/fldigi-XmlRpcClient.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcDispatch.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcMutex.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcServerConnection.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcServer.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcServerMethod.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcSocket.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcSource.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcUtil.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcValue.$(OBJEXT) @ENABLE_FLXMLRPC_FALSE@am__objects_15 = $(am__objects_14) am__objects_16 = mbedtls/fldigi-aes.$(OBJEXT) \ mbedtls/fldigi-aesni.$(OBJEXT) mbedtls/fldigi-arc4.$(OBJEXT) \ mbedtls/fldigi-aria.$(OBJEXT) \ mbedtls/fldigi-asn1parse.$(OBJEXT) \ mbedtls/fldigi-asn1write.$(OBJEXT) \ mbedtls/fldigi-base64.$(OBJEXT) \ mbedtls/fldigi-bignum.$(OBJEXT) \ mbedtls/fldigi-blowfish.$(OBJEXT) \ mbedtls/fldigi-camellia.$(OBJEXT) mbedtls/fldigi-ccm.$(OBJEXT) \ mbedtls/fldigi-certs.$(OBJEXT) \ mbedtls/fldigi-chacha20.$(OBJEXT) \ mbedtls/fldigi-chachapoly.$(OBJEXT) \ mbedtls/fldigi-cipher.$(OBJEXT) \ mbedtls/fldigi-cipher_wrap.$(OBJEXT) \ mbedtls/fldigi-cmac.$(OBJEXT) \ mbedtls/fldigi-ctr_drbg.$(OBJEXT) \ mbedtls/fldigi-debug.$(OBJEXT) mbedtls/fldigi-des.$(OBJEXT) \ mbedtls/fldigi-dhm.$(OBJEXT) mbedtls/fldigi-ecdh.$(OBJEXT) \ mbedtls/fldigi-ecdsa.$(OBJEXT) \ mbedtls/fldigi-ecjpake.$(OBJEXT) mbedtls/fldigi-ecp.$(OBJEXT) \ mbedtls/fldigi-ecp_curves.$(OBJEXT) \ mbedtls/fldigi-entropy.$(OBJEXT) \ mbedtls/fldigi-entropy_poll.$(OBJEXT) \ mbedtls/fldigi-error.$(OBJEXT) mbedtls/fldigi-gcm.$(OBJEXT) \ mbedtls/fldigi-havege.$(OBJEXT) mbedtls/fldigi-hkdf.$(OBJEXT) \ mbedtls/fldigi-hmac_drbg.$(OBJEXT) \ mbedtls/fldigi-md2.$(OBJEXT) mbedtls/fldigi-md4.$(OBJEXT) \ mbedtls/fldigi-md5.$(OBJEXT) mbedtls/fldigi-md.$(OBJEXT) \ mbedtls/fldigi-md_wrap.$(OBJEXT) \ mbedtls/fldigi-memory_buffer_alloc.$(OBJEXT) \ mbedtls/fldigi-net_sockets.$(OBJEXT) \ mbedtls/fldigi-nist_kw.$(OBJEXT) mbedtls/fldigi-oid.$(OBJEXT) \ mbedtls/fldigi-padlock.$(OBJEXT) mbedtls/fldigi-pem.$(OBJEXT) \ mbedtls/fldigi-pk.$(OBJEXT) mbedtls/fldigi-pkcs11.$(OBJEXT) \ mbedtls/fldigi-pkcs12.$(OBJEXT) mbedtls/fldigi-pkcs5.$(OBJEXT) \ mbedtls/fldigi-pkparse.$(OBJEXT) \ mbedtls/fldigi-pk_wrap.$(OBJEXT) \ mbedtls/fldigi-pkwrite.$(OBJEXT) \ mbedtls/fldigi-platform.$(OBJEXT) \ mbedtls/fldigi-platform_util.$(OBJEXT) \ mbedtls/fldigi-poly1305.$(OBJEXT) \ mbedtls/fldigi-ripemd160.$(OBJEXT) \ mbedtls/fldigi-rsa.$(OBJEXT) \ mbedtls/fldigi-rsa_internal.$(OBJEXT) \ mbedtls/fldigi-sha1.$(OBJEXT) mbedtls/fldigi-sha256.$(OBJEXT) \ mbedtls/fldigi-sha512.$(OBJEXT) \ mbedtls/fldigi-ssl_cache.$(OBJEXT) \ mbedtls/fldigi-ssl_ciphersuites.$(OBJEXT) \ mbedtls/fldigi-ssl_cli.$(OBJEXT) \ mbedtls/fldigi-ssl_cookie.$(OBJEXT) \ mbedtls/fldigi-ssl_srv.$(OBJEXT) \ mbedtls/fldigi-ssl_ticket.$(OBJEXT) \ mbedtls/fldigi-ssl_tls.$(OBJEXT) \ mbedtls/fldigi-threading.$(OBJEXT) \ mbedtls/fldigi-timing.$(OBJEXT) \ mbedtls/fldigi-version.$(OBJEXT) \ mbedtls/fldigi-version_features.$(OBJEXT) \ mbedtls/fldigi-x509.$(OBJEXT) \ mbedtls/fldigi-x509_create.$(OBJEXT) \ mbedtls/fldigi-x509_crl.$(OBJEXT) \ mbedtls/fldigi-x509_crt.$(OBJEXT) \ mbedtls/fldigi-x509_csr.$(OBJEXT) \ mbedtls/fldigi-x509write_crt.$(OBJEXT) \ mbedtls/fldigi-x509write_csr.$(OBJEXT) \ mbedtls/fldigi-xtea.$(OBJEXT) @ENABLE_LIBMBEDTLS_FALSE@am__objects_17 = $(am__objects_16) am__objects_18 = rigcontrol/fldigi-hamlib.$(OBJEXT) \ rigcontrol/fldigi-rigclass.$(OBJEXT) @ENABLE_HAMLIB_TRUE@am__objects_19 = $(am__objects_18) am__objects_20 = am__objects_21 = misc/fldigi-benchmark.$(OBJEXT) @ENABLE_BENCHMARK_TRUE@am__objects_22 = $(am__objects_21) am__objects_23 = compat/fldigi-regex.$(OBJEXT) @COMPAT_REGEX_TRUE@am__objects_24 = $(am__objects_23) am__objects_25 = misc/fldigi-stack.$(OBJEXT) @COMPAT_STACK_TRUE@am__objects_26 = $(am__objects_25) am__objects_27 = compat/fldigi-getsysinfo.$(OBJEXT) \ compat/fldigi-mingw.$(OBJEXT) @MINGW32_TRUE@am__objects_28 = $(am__objects_27) am__objects_29 = misc/fldigi-nls.$(OBJEXT) @USE_NLS_TRUE@am__objects_30 = $(am__objects_29) am__objects_31 = fldigirc.$(OBJEXT) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__objects_32 = $(am__objects_31) am_fldigi_OBJECTS = $(am__objects_13) $(am__objects_15) \ $(am__objects_17) $(am__objects_19) $(am__objects_20) \ $(am__objects_22) $(am__objects_24) $(am__objects_26) \ $(am__objects_28) $(am__objects_30) $(am__objects_32) \ combo/fldigi-combo.$(OBJEXT) \ config_script/fldigi-create_default_script.$(OBJEXT) \ config_script/fldigi-run_scripts.$(OBJEXT) \ config_script/fldigi-script_parsing.$(OBJEXT) \ contestia/fldigi-contestia.$(OBJEXT) \ cw_rtty/fldigi-cw.$(OBJEXT) cw_rtty/fldigi-morse.$(OBJEXT) \ cw_rtty/fldigi-nanoIO.$(OBJEXT) cw_rtty/fldigi-Nav.$(OBJEXT) \ cw_rtty/fldigi-rtty.$(OBJEXT) cw_rtty/fldigi-view_cw.$(OBJEXT) \ cw_rtty/fldigi-view_rtty.$(OBJEXT) \ cw_rtty/fldigi-winkeyer.$(OBJEXT) \ dialogs/fldigi-confdialog.$(OBJEXT) \ dialogs/fldigi-fl_digi.$(OBJEXT) \ dialogs/fldigi-font_browser.$(OBJEXT) \ dialogs/fldigi-htmlstrings.$(OBJEXT) \ dialogs/fldigi-notifydialog.$(OBJEXT) \ dialogs/fldigi-record_browse.$(OBJEXT) \ dialogs/fldigi-testsigs.$(OBJEXT) \ dialogs/fldigi-tod_clock.$(OBJEXT) \ dialogs/fldigi-Viewer.$(OBJEXT) \ dominoex/fldigi-dominoex.$(OBJEXT) \ dominoex/fldigi-dominovar.$(OBJEXT) dtmf/fldigi-dtmf.$(OBJEXT) \ dxcluster/fldigi-dxcluster.$(OBJEXT) \ dxcluster/fldigi-dx_dialog.$(OBJEXT) \ feld/fldigi-feld.$(OBJEXT) feld/fldigi-feldfonts.$(OBJEXT) \ fft-monitor/fldigi-fft-monitor.$(OBJEXT) \ fft-monitor/fldigi-spectrum.$(OBJEXT) \ fft-monitor/fldigi-spectrum_viewer.$(OBJEXT) \ fileselector/fldigi-fileselect.$(OBJEXT) \ filters/fldigi-fftfilt.$(OBJEXT) \ filters/fldigi-filters.$(OBJEXT) \ filters/fldigi-viterbi.$(OBJEXT) fsq/fldigi-fsq.$(OBJEXT) \ fsq/fldigi-fsq_monitor.$(OBJEXT) \ globals/fldigi-globals.$(OBJEXT) ifkp/fldigi-ifkp.$(OBJEXT) \ ifkp/fldigi-tux.$(OBJEXT) irrxml/fldigi-irrXML.$(OBJEXT) \ libtiniconv/fldigi-tiniconv.$(OBJEXT) \ libtiniconv/fldigi-tiniconv_desc.$(OBJEXT) \ logbook/fldigi-adif_io.$(OBJEXT) \ logbook/fldigi-calendar.$(OBJEXT) \ logbook/fldigi-contest.$(OBJEXT) \ logbook/fldigi-counties.$(OBJEXT) \ logbook/fldigi-county_lists.$(OBJEXT) \ logbook/fldigi-cty-dat.$(OBJEXT) logbook/fldigi-date.$(OBJEXT) \ logbook/fldigi-fd_logger.$(OBJEXT) \ logbook/fldigi-fd_view.$(OBJEXT) \ logbook/fldigi-lgbook.$(OBJEXT) \ logbook/fldigi-logbook.$(OBJEXT) \ logbook/fldigi-logsupport.$(OBJEXT) \ logbook/fldigi-lookupcall.$(OBJEXT) \ logbook/fldigi-maclogger.$(OBJEXT) \ logbook/fldigi-n3fjp_logger.$(OBJEXT) \ logbook/fldigi-qrzlib.$(OBJEXT) \ logbook/fldigi-qso_db.$(OBJEXT) logbook/fldigi-table.$(OBJEXT) \ logbook/fldigi-textio.$(OBJEXT) \ logbook/fldigi-xmlrpc_log.$(OBJEXT) \ logger/fldigi-logger.$(OBJEXT) \ logger/fldigi-rx_extract.$(OBJEXT) \ logger/fldigi-speak.$(OBJEXT) fldigi-main.$(OBJEXT) \ mfsk/fldigi-interleave.$(OBJEXT) mfsk/fldigi-mfsk.$(OBJEXT) \ mfsk/fldigi-mfskvaricode.$(OBJEXT) \ misc/fldigi-arq_io.$(OBJEXT) misc/fldigi-ascii.$(OBJEXT) \ misc/fldigi-ax25_decode.$(OBJEXT) \ misc/fldigi-charsetdistiller.$(OBJEXT) \ misc/fldigi-charsetlist.$(OBJEXT) \ misc/fldigi-configuration.$(OBJEXT) \ misc/fldigi-coordinate.$(OBJEXT) misc/fldigi-debug.$(OBJEXT) \ misc/fldigi-dxcc.$(OBJEXT) misc/fldigi-estrings.$(OBJEXT) \ misc/fldigi-icons.$(OBJEXT) misc/fldigi-kiss_io.$(OBJEXT) \ misc/fldigi-kmlserver.$(OBJEXT) misc/fldigi-locator.$(OBJEXT) \ misc/fldigi-log.$(OBJEXT) misc/fldigi-macroedit.$(OBJEXT) \ misc/fldigi-macros.$(OBJEXT) misc/fldigi-misc.$(OBJEXT) \ misc/fldigi-newinstall.$(OBJEXT) \ misc/fldigi-outputencoder.$(OBJEXT) \ misc/fldigi-pixmaps.$(OBJEXT) \ misc/fldigi-pixmaps_tango.$(OBJEXT) \ misc/fldigi-record_loader.$(OBJEXT) misc/fldigi-re.$(OBJEXT) \ misc/fldigi-stacktrace.$(OBJEXT) misc/fldigi-status.$(OBJEXT) \ misc/fldigi-strutil.$(OBJEXT) misc/fldigi-threads.$(OBJEXT) \ misc/fldigi-timeops.$(OBJEXT) \ misc/fldigi-utf8file_io.$(OBJEXT) misc/fldigi-util.$(OBJEXT) \ mt63/fldigi-dsp.$(OBJEXT) mt63/fldigi-mt63base.$(OBJEXT) \ mt63/fldigi-mt63.$(OBJEXT) navtex/fldigi-navtex.$(OBJEXT) \ network/fldigi-ca_cert.$(OBJEXT) \ network/fldigi-metar.$(OBJEXT) \ network/fldigi-network.$(OBJEXT) \ network/fldigi-socket.$(OBJEXT) \ network/fldigi-weather.$(OBJEXT) \ olivia/fldigi-olivia.$(OBJEXT) psk/fldigi-pskcoeff.$(OBJEXT) \ psk/fldigi-psk.$(OBJEXT) psk/fldigi-pskeval.$(OBJEXT) \ psk/fldigi-pskvaricode.$(OBJEXT) psk/fldigi-viewpsk.$(OBJEXT) \ psm/fldigi-psm.$(OBJEXT) qrunner/fldigi-qrunner.$(OBJEXT) \ rigcontrol/fldigi-FreqControl.$(OBJEXT) \ rigcontrol/fldigi-norig.$(OBJEXT) \ rigcontrol/fldigi-ptt.$(OBJEXT) \ rigcontrol/fldigi-rigio.$(OBJEXT) \ rigcontrol/fldigi-rigsupport.$(OBJEXT) \ rigcontrol/fldigi-rigxml.$(OBJEXT) \ rigcontrol/fldigi-serial.$(OBJEXT) \ rigcontrol/fldigi-xmlrpc_rig.$(OBJEXT) \ rsid/fldigi-rsid.$(OBJEXT) \ soundcard/fldigi-audio_alert.$(OBJEXT) \ soundcard/fldigi-bark.$(OBJEXT) \ soundcard/fldigi-checkout.$(OBJEXT) \ soundcard/fldigi-diesel.$(OBJEXT) \ soundcard/fldigi-dinnerbell.$(OBJEXT) \ soundcard/fldigi-doesnot.$(OBJEXT) \ soundcard/fldigi-play.pa.$(OBJEXT) \ soundcard/fldigi-soundconf.$(OBJEXT) \ soundcard/fldigi-sound.$(OBJEXT) \ soundcard/fldigi-steam_train.$(OBJEXT) \ spot/fldigi-notify.$(OBJEXT) spot/fldigi-pskrep.$(OBJEXT) \ spot/fldigi-spot.$(OBJEXT) ssb/fldigi-ssb.$(OBJEXT) \ synop-src/fldigi-synop.$(OBJEXT) thor/fldigi-thor.$(OBJEXT) \ thor/fldigi-thorvaricode.$(OBJEXT) \ throb/fldigi-throb.$(OBJEXT) trx/fldigi-modem.$(OBJEXT) \ trx/fldigi-nullmodem.$(OBJEXT) \ trx/fldigi-test_signal.$(OBJEXT) trx/fldigi-trx.$(OBJEXT) \ waterfall/fldigi-colorbox.$(OBJEXT) \ waterfall/fldigi-digiscope.$(OBJEXT) \ waterfall/fldigi-raster.$(OBJEXT) \ waterfall/fldigi-waterfall.$(OBJEXT) \ wefax/fldigi-wefax.$(OBJEXT) wefax/fldigi-wefax_map.$(OBJEXT) \ wefax/fldigi-wefax-pic.$(OBJEXT) \ widgets/fldigi-flinput2.$(OBJEXT) \ widgets/fldigi-flmisc.$(OBJEXT) \ widgets/fldigi-flslider2.$(OBJEXT) \ widgets/fldigi-Fl_Text_Buffer_mod.$(OBJEXT) \ widgets/fldigi-Fl_Text_Display_mod.$(OBJEXT) \ widgets/fldigi-Fl_Text_Editor_mod.$(OBJEXT) \ widgets/fldigi-FTextRXTX.$(OBJEXT) \ widgets/fldigi-FTextView.$(OBJEXT) \ widgets/fldigi-Panel.$(OBJEXT) \ widgets/fldigi-picture.$(OBJEXT) \ widgets/fldigi-progress.$(OBJEXT) \ widgets/fldigi-psk_browser.$(OBJEXT) \ widgets/fldigi-pwrmeter.$(OBJEXT) \ widgets/fldigi-smeter.$(OBJEXT) wwv/fldigi-analysis.$(OBJEXT) \ wwv/fldigi-wwv.$(OBJEXT) nodist_fldigi_OBJECTS = $(am__objects_20) fldigi_OBJECTS = $(am_fldigi_OBJECTS) $(nodist_fldigi_OBJECTS) fldigi_DEPENDENCIES = fldigi_LINK = $(CXXLD) $(fldigi_CXXFLAGS) $(CXXFLAGS) \ $(fldigi_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(flarq_SOURCES) $(EXTRA_flarq_SOURCES) $(fldigi_SOURCES) \ $(EXTRA_fldigi_SOURCES) $(nodist_fldigi_SOURCES) DIST_SOURCES = $(am__flarq_SOURCES_DIST) $(EXTRA_flarq_SOURCES) \ $(am__fldigi_SOURCES_DIST) $(EXTRA_fldigi_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" A2X = @A2X@ ACLOCAL = @ACLOCAL@ AC_CONFIG_ARGS = @AC_CONFIG_ARGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CFLAGS = @BFD_CFLAGS@ BFD_LIBS = @BFD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11_SWITCH = @CXX11_SWITCH@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_CFLAGS = @DEBUG_CFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_LIBS = @EXTRA_LIBS@ FLARQ_AUTHORS = @FLARQ_AUTHORS@ FLARQ_BUILD_CPPFLAGS = @FLARQ_BUILD_CPPFLAGS@ FLARQ_BUILD_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ FLARQ_BUILD_LDADD = @FLARQ_BUILD_LDADD@ FLARQ_BUILD_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ FLARQ_DOCS = @FLARQ_DOCS@ FLARQ_VERSION = @FLARQ_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLDIGI_AUTHORS = @FLDIGI_AUTHORS@ FLDIGI_BUILD_CFLAGS = @FLDIGI_BUILD_CFLAGS@ FLDIGI_BUILD_CPPFLAGS = @FLDIGI_BUILD_CPPFLAGS@ FLDIGI_BUILD_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ FLDIGI_BUILD_LDADD = @FLDIGI_BUILD_LDADD@ FLDIGI_BUILD_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ FLDIGI_VERSION = @FLDIGI_VERSION@ ######################################################################## FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLTK_CFLAGS = @FLTK_CFLAGS@ FLTK_CONFIG = @FLTK_CONFIG@ FLTK_LIBS = @FLTK_LIBS@ FLUID = @FLUID@ FLXMLRPC_CFLAGS = @FLXMLRPC_CFLAGS@ FLXMLRPC_LIBS = @FLXMLRPC_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HAMLIB_CFLAGS = @HAMLIB_CFLAGS@ HAMLIB_LIBS = @HAMLIB_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_CFLAGS = @INTL_CFLAGS@ INTL_LIBS = @INTL_LIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBMBEDTLS_CFLAGS = @LIBMBEDTLS_CFLAGS@ LIBMBEDTLS_LIBS = @LIBMBEDTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAC_UNIVERSAL_CFLAGS = @MAC_UNIVERSAL_CFLAGS@ MAC_UNIVERSAL_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKENSIS = @MAKENSIS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DL = @PACKAGE_DL@ PACKAGE_DOCS = @PACKAGE_DOCS@ PACKAGE_GUIDE = @PACKAGE_GUIDE@ PACKAGE_HOME = @PACKAGE_HOME@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NEWBUG = @PACKAGE_NEWBUG@ PACKAGE_PROJ = @PACKAGE_PROJ@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ PORTAUDIO_CFLAGS = @PORTAUDIO_CFLAGS@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PTW32_CFLAGS = @PTW32_CFLAGS@ PTW32_LIBS = @PTW32_LIBS@ PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ RDYNAMIC = @RDYNAMIC@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = # The BUILD_* variables are defined in build.m4 fldigi_CPPFLAGS = -DBUILD_FLDIGI -DLOCALEDIR=\"$(localedir)\" \ @FLDIGI_BUILD_CPPFLAGS@ -DPKGDATADIR=\"$(pkgdatadir)\" \ $(am__append_3) $(am__append_7) $(am__append_16) fldigi_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ $(am__append_4) \ $(am__append_8) $(am__append_17) fldigi_CFLAGS = @FLDIGI_BUILD_CFLAGS@ $(am__append_9) $(am__append_18) fldigi_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ $(am__append_10) \ $(am__append_19) fldigi_LDADD = @FLDIGI_BUILD_LDADD@ flarq_CPPFLAGS = -DBUILD_FLARQ -DLOCALEDIR=\"$(localedir)\" \ @FLARQ_BUILD_CPPFLAGS@ $(am__append_11) flarq_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ $(am__append_12) flarq_CFLAGS = $(fldigi_CFLAGS) $(am__append_13) flarq_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ $(am__append_14) flarq_LDADD = @FLARQ_BUILD_LDADD@ HAMLIB_SRC = \ include/hamlib.h \ rigcontrol/hamlib.cxx \ include/rigclass.h \ rigcontrol/rigclass.cxx XMLRPC_SRC = \ include/xmlrpc.h \ network/xmlrpc.cxx FLDIGI_WIN32_RES_SRC = fldigirc.rc FLARQ_WIN32_RES_SRC = flarq-src/flarqrc.rc COMMON_WIN32_RES_SRC = common.rc BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx REGEX_SRC = compat/regex.h compat/regex.c STACK_SRC = include/stack.h misc/stack.cxx MINGW32_SRC = include/compat.h compat/getsysinfo.c compat/mingw.c compat/mingw.h NLS_SRC = misc/nls.cxx include/nls.h # We distribute these but do not always compile them # Build the xmlrpcpp source if libflxmlrpc is not found XMLRPCPP_SRC = \ xmlrpcpp/XmlRpcBase64.h \ xmlrpcpp/XmlRpcClient.cpp \ xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp \ xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h \ xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h \ xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h \ xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h \ xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h \ xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h \ xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h \ xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h \ xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h # Build the libmbedtls source if libmbedtls is not found LIBMBEDTLS_SRC = \ mbedtls/aes.c \ mbedtls/aesni.c \ mbedtls/arc4.c \ mbedtls/aria.c \ mbedtls/asn1parse.c \ mbedtls/asn1write.c \ mbedtls/base64.c \ mbedtls/bignum.c \ mbedtls/blowfish.c \ mbedtls/camellia.c \ mbedtls/ccm.c \ mbedtls/certs.c \ mbedtls/chacha20.c \ mbedtls/chachapoly.c \ mbedtls/cipher.c \ mbedtls/cipher_wrap.c \ mbedtls/cmac.c \ mbedtls/ctr_drbg.c \ mbedtls/debug.c \ mbedtls/des.c \ mbedtls/dhm.c \ mbedtls/ecdh.c \ mbedtls/ecdsa.c \ mbedtls/ecjpake.c \ mbedtls/ecp.c \ mbedtls/ecp_curves.c \ mbedtls/entropy.c \ mbedtls/entropy_poll.c \ mbedtls/error.c \ mbedtls/gcm.c \ mbedtls/havege.c \ mbedtls/hkdf.c \ mbedtls/hmac_drbg.c \ mbedtls/md2.c \ mbedtls/md4.c \ mbedtls/md5.c \ mbedtls/md.c \ mbedtls/md_wrap.c \ mbedtls/memory_buffer_alloc.c \ mbedtls/net_sockets.c \ mbedtls/nist_kw.c \ mbedtls/oid.c \ mbedtls/padlock.c \ mbedtls/pem.c \ mbedtls/pk.c \ mbedtls/pkcs11.c \ mbedtls/pkcs12.c \ mbedtls/pkcs5.c \ mbedtls/pkparse.c \ mbedtls/pk_wrap.c \ mbedtls/pkwrite.c \ mbedtls/platform.c \ mbedtls/platform_util.c \ mbedtls/poly1305.c \ mbedtls/ripemd160.c \ mbedtls/rsa.c \ mbedtls/rsa_internal.c \ mbedtls/sha1.c \ mbedtls/sha256.c \ mbedtls/sha512.c \ mbedtls/ssl_cache.c \ mbedtls/ssl_ciphersuites.c \ mbedtls/ssl_cli.c \ mbedtls/ssl_cookie.c \ mbedtls/ssl_srv.c \ mbedtls/ssl_ticket.c \ mbedtls/ssl_tls.c \ mbedtls/threading.c \ mbedtls/timing.c \ mbedtls/version.c \ mbedtls/version_features.c \ mbedtls/x509.c \ mbedtls/x509_create.c \ mbedtls/x509_crl.c \ mbedtls/x509_crt.c \ mbedtls/x509_csr.c \ mbedtls/x509write_crt.c \ mbedtls/x509write_csr.c \ mbedtls/xtea.c \ include/mbedtls/aes.h \ include/mbedtls/aesni.h \ include/mbedtls/arc4.h \ include/mbedtls/aria.h \ include/mbedtls/asn1.h \ include/mbedtls/asn1write.h \ include/mbedtls/base64.h \ include/mbedtls/bignum.h \ include/mbedtls/blowfish.h \ include/mbedtls/bn_mul.h \ include/mbedtls/camellia.h \ include/mbedtls/ccm.h \ include/mbedtls/certs.h \ include/mbedtls/chacha20.h \ include/mbedtls/chachapoly.h \ include/mbedtls/check_config.h \ include/mbedtls/cipher.h \ include/mbedtls/cipher_internal.h \ include/mbedtls/cmac.h \ include/mbedtls/compat-1.3.h \ include/mbedtls/config.h \ include/mbedtls/ctr_drbg.h \ include/mbedtls/debug.h \ include/mbedtls/des.h \ include/mbedtls/dhm.h \ include/mbedtls/ecdh.h \ include/mbedtls/ecdsa.h \ include/mbedtls/ecjpake.h \ include/mbedtls/ecp.h \ include/mbedtls/ecp_internal.h \ include/mbedtls/entropy.h \ include/mbedtls/entropy_poll.h \ include/mbedtls/error.h \ include/mbedtls/gcm.h \ include/mbedtls/havege.h \ include/mbedtls/hkdf.h \ include/mbedtls/hmac_drbg.h \ include/mbedtls/md2.h \ include/mbedtls/md4.h \ include/mbedtls/md5.h \ include/mbedtls/md.h \ include/mbedtls/md_internal.h \ include/mbedtls/memory_buffer_alloc.h \ include/mbedtls/net.h \ include/mbedtls/net_sockets.h \ include/mbedtls/nist_kw.h \ include/mbedtls/oid.h \ include/mbedtls/padlock.h \ include/mbedtls/pem.h \ include/mbedtls/pkcs11.h \ include/mbedtls/pkcs12.h \ include/mbedtls/pkcs5.h \ include/mbedtls/pk.h \ include/mbedtls/pk_internal.h \ include/mbedtls/platform.h \ include/mbedtls/platform_time.h \ include/mbedtls/platform_util.h \ include/mbedtls/poly1305.h \ include/mbedtls/ripemd160.h \ include/mbedtls/rsa.h \ include/mbedtls/rsa_internal.h \ include/mbedtls/sha1.h \ include/mbedtls/sha256.h \ include/mbedtls/sha512.h \ include/mbedtls/ssl_cache.h \ include/mbedtls/ssl_ciphersuites.h \ include/mbedtls/ssl_cookie.h \ include/mbedtls/ssl.h \ include/mbedtls/ssl_internal.h \ include/mbedtls/ssl_ticket.h \ include/mbedtls/threading.h \ include/mbedtls/timing.h \ include/mbedtls/version.h \ include/mbedtls/x509_crl.h \ include/mbedtls/x509_crt.h \ include/mbedtls/x509_csr.h \ include/mbedtls/x509.h \ include/mbedtls/xtea.h # packet/pkt.cxx # include/pkt.h # Sources that are part of the distribution but are not compiled directly EXTRA_fldigi_SOURCES = $(HAMLIB_SRC) $(XMLRPC_SRC) \ $(FLDIGI_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) \ $(BENCHMARK_SRC) $(REGEX_SRC) $(STACK_SRC) $(MINGW32_SRC) \ $(NLS_SRC) $(XMLRPCPP_SRC) $(LIBMBEDTLS_SRC) blank/blank.cxx \ blank/blank.h dialogs/fl_digi_main.cxx dxcluster/arc-help.cxx \ dxcluster/CCC_Commands.cxx dxcluster/DXClusterServers.cxx \ dxcluster/DXSpiderCommandReference.cxx \ fileselector/flnfc_common.cxx feld/Feld7x7-14.cxx \ feld/Feld7x7n-14.cxx feld/FeldDx-14.cxx feld/FeldFat-14.cxx \ feld/FeldHell-12.cxx feld/FeldLittle-12.cxx \ feld/FeldLo8-14.cxx feld/FeldLow-14.cxx feld/FeldModern-14.cxx \ feld/FeldModern8-14.cxx feld/FeldNarr-14.cxx \ feld/FeldReal-14.cxx feld/FeldStyl-14.cxx feld/FeldVert-14.cxx \ feld/FeldWide-14.cxx fsq/fsq_varicode.cxx include/crc8.h \ include/Fl_Text_Buffer_mod.H include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H fsq/fsq-pic.cxx fsq/bitmaps.cxx \ ifkp/ifkp_bitmaps.cxx ifkp/ifkp_varicode.cxx ifkp/ifkp-pic.cxx \ mfsk/mfsk-pic.cxx mt63/alias_1k.dat mt63/alias_2k.dat \ mt63/morse.dat mt63/symbol.dat mt63/alias_k5.dat \ mt63/mt63intl.dat rsid/rsid_defs.cxx thor/thor-pic.cxx \ trx/tune.cxx dialogs/guide.cxx include/adif_def.h \ include/adif_io.h include/analysis.h include/arq_io.h \ include/ascii.h include/audio_alert.h include/ax25_decode.h \ include/calendar.h include/charsetdistiller.h \ include/charsetlist.h include/colorbox.h include/combo.h \ include/complex.h include/confdialog.h include/configuration.h \ include/contest.h include/contestia.h include/coordinate.h \ include/counties.h include/cw.h include/data_io.h \ include/date.h include/debug.h include/digiscope.h \ include/dominoex.h include/dominovar.h include/dsp.h \ include/dtmf.h include/dxcc.h include/dx_cluster.h \ include/dx_dialog.h include/estrings.h include/fd_logger.h \ include/fd_view.h include/feld.h include/fftfilt.h \ include/fft-monitor.h include/field_def.h include/fileselect.h \ include/filters.h include/fldigi-config.h include/fl_digi.h \ include/flinput2.h include/fl_lock.h include/flmisc.h \ include/flslider2.h include/font_browser.h include/fontdef.h \ include/FreqControl.h include/fsq.h include/FTextRXTX.h \ include/FTextView.h include/gettext.h include/gfft.h \ include/globals.h include/htmlstrings.h include/https.h \ include/icons.h include/ifkp.h include/interleave.h \ include/jalocha/pj_cmpx.h include/jalocha/pj_fft.h \ include/jalocha/pj_fht.h include/jalocha/pj_fifo.h \ include/jalocha/pj_gray.h include/jalocha/pj_lowpass3.h \ include/jalocha/pj_mfsk.h include/jalocha/pj_struc.h \ include/kiss_io.h include/kmlserver.h include/lgbook.h \ include/locator.h include/logbook.h include/logger.h \ include/log.h include/logsupport.h include/lookupcall.h \ include/maclogger.h include/macroedit.h include/macros.h \ include/main.h include/mbuffer.h include/metar.h \ include/mfsk.h include/mfskvaricode.h include/misc.h \ include/modem.h include/morse.h include/mt63base.h \ include/mt63.h include/n3fjp_logger.h include/nanoIO.h \ include/Nav.h include/navtex.h include/navtex.h include/nco.h \ include/network.h include/newinstall.h include/notifydialog.h \ include/notify.h include/nullmodem.h include/olivia.h \ include/outputencoder.h include/Panel.h include/picture.h \ include/pixmaps.h include/pkg.h include/play.pa.h \ include/progress.h include/psk_browser.h include/pskcoeff.h \ include/pskeval.h include/psk.h include/pskrep.h \ include/pskvaricode.h include/ptt.h include/pwrmeter.h \ include/qrunner.h include/qrzlib.h include/qso_db.h \ include/raster.h include/record_browse.h \ include/record_loader_gui.h include/record_loader.h \ include/re.h include/rigCAT.h include/rigio.h \ include/rigsupport.h include/rigxml.h include/ringbuffer.h \ include/rsid.h include/rtty.h include/rx_extract.h \ include/serial.h include/smeter.h include/socket.h \ include/soundconf.h include/sound.h include/speak.h \ include/spectrum.h include/spectrum_viewer.h include/spot.h \ include/ssb.h include/stacktrace.h include/status.h \ include/strutil.h include/synop.h include/table.h \ include/testmodem.h include/test_signal.h include/testsigs.h \ include/textio.h include/thor.h include/thorvaricode.h \ include/threads.h include/throb.h include/timeops.h \ include/trx.h include/utf8file_io.h include/util.h \ include/view_cw.h include/Viewer.h include/viewpsk.h \ include/view_rtty.h include/viterbi.h include/waterfall.h \ include/weather.h include/wefax.h include/wefax_map.h \ include/wefax-pic.h include/winkeyer.h include/wwv.h \ include/xmlreader.h libtiniconv/tiniconv.h \ libtiniconv/tiniconv_int.h libtiniconv/encdec/ascii.h \ libtiniconv/encdec/big5.h libtiniconv/encdec/ces_big5.h \ libtiniconv/encdec/ces_gbk.h libtiniconv/encdec/cp1250.h \ libtiniconv/encdec/cp1251.h libtiniconv/encdec/cp1252.h \ libtiniconv/encdec/cp1253.h libtiniconv/encdec/cp1254.h \ libtiniconv/encdec/cp1255.h libtiniconv/encdec/cp1256.h \ libtiniconv/encdec/cp1257.h libtiniconv/encdec/cp1258.h \ libtiniconv/encdec/cp866.h libtiniconv/encdec/cp936ext.h \ libtiniconv/encdec/cp936.h libtiniconv/encdec/euc_cn.h \ libtiniconv/encdec/flushwc.h libtiniconv/encdec/gb2312.h \ libtiniconv/encdec/gbkext1.h libtiniconv/encdec/gbkext2.h \ libtiniconv/encdec/gbkext_inv.h libtiniconv/encdec/gbk.h \ libtiniconv/encdec/iso2022_jp.h \ libtiniconv/encdec/iso8859_10.h \ libtiniconv/encdec/iso8859_11.h \ libtiniconv/encdec/iso8859_13.h \ libtiniconv/encdec/iso8859_14.h \ libtiniconv/encdec/iso8859_15.h \ libtiniconv/encdec/iso8859_16.h libtiniconv/encdec/iso8859_1.h \ libtiniconv/encdec/iso8859_2.h libtiniconv/encdec/iso8859_3.h \ libtiniconv/encdec/iso8859_4.h libtiniconv/encdec/iso8859_5.h \ libtiniconv/encdec/iso8859_6.h libtiniconv/encdec/iso8859_7.h \ libtiniconv/encdec/iso8859_8.h libtiniconv/encdec/iso8859_9.h \ libtiniconv/encdec/jisx0201.h libtiniconv/encdec/jisx0208.h \ libtiniconv/encdec/koi8_r.h libtiniconv/encdec/koi8_ru.h \ libtiniconv/encdec/koi8_u.h libtiniconv/encdec/mac_cyrillic.h \ libtiniconv/encdec/ucs2.h libtiniconv/encdec/utf7.h \ libtiniconv/encdec/utf8.h libtiniconv/encdec/vietcomb.h EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) $(XMLRPCPP_SRC) # Sources that we build. It is OK to have headers here. fldigi_SOURCES = $(XMLRPC_SRC) $(am__append_5) $(am__append_15) \ $(am__append_20) $(am__append_21) $(am__append_22) \ $(am__append_23) $(am__append_25) $(am__append_27) \ $(am__append_29) $(am__append_31) combo/combo.cxx \ config_script/create_default_script.cxx \ config_script/run_script.h config_script/run_scripts.cxx \ config_script/script_parsing.cxx \ config_script/script_parsing.h contestia/contestia.cxx \ cw_rtty/cw.cxx cw_rtty/morse.cxx cw_rtty/nanoIO.cxx \ cw_rtty/Nav.cxx cw_rtty/rtty.cxx cw_rtty/view_cw.cxx \ cw_rtty/view_rtty.cxx cw_rtty/winkeyer.cxx \ dialogs/confdialog.cxx dialogs/fl_digi.cxx \ dialogs/font_browser.cxx dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx dialogs/record_browse.cxx \ dialogs/testsigs.cxx dialogs/tod_clock.cxx dialogs/Viewer.cxx \ dominoex/dominoex.cxx dominoex/dominovar.cxx dtmf/dtmf.cxx \ dxcluster/dxcluster.cxx dxcluster/dx_dialog.cxx feld/feld.cxx \ feld/feldfonts.cxx fft-monitor/fft-monitor.cxx \ fft-monitor/spectrum.cxx fft-monitor/spectrum_viewer.cxx \ fileselector/fileselect.cxx filters/fftfilt.cxx \ filters/filters.cxx filters/viterbi.cxx fsq/fsq.cxx \ fsq/fsq_monitor.cxx globals/globals.cxx ifkp/ifkp.cxx \ ifkp/tux.cxx irrxml/CXMLReaderImpl.h irrxml/fast_atof.h \ irrxml/heapsort.h irrxml/irrArray.h irrxml/irrString.h \ irrxml/irrTypes.h irrxml/irrXML.cpp irrxml/irrXML.h \ libtiniconv/tiniconv.c libtiniconv/tiniconv_desc.c \ logbook/adif_io.cxx logbook/calendar.cxx logbook/contest.cxx \ logbook/counties.cxx logbook/county_lists.cxx \ logbook/cty-dat.cxx logbook/date.cxx logbook/fd_logger.cxx \ logbook/fd_view.cxx logbook/lgbook.cxx logbook/logbook.cxx \ logbook/logsupport.cxx logbook/lookupcall.cxx \ logbook/maclogger.cxx logbook/n3fjp_logger.cxx \ logbook/qrzlib.cxx logbook/qso_db.cxx logbook/table.cxx \ logbook/textio.cxx logbook/xmlrpc_log.cxx logger/logger.cxx \ logger/rx_extract.cxx logger/speak.cxx main.cxx \ mfsk/interleave.cxx mfsk/mfsk.cxx mfsk/mfskvaricode.cxx \ misc/arq_io.cxx misc/ascii.cxx misc/ax25_decode.cxx \ misc/charsetdistiller.cxx misc/charsetlist.cxx \ misc/configuration.cxx misc/coordinate.cxx misc/debug.cxx \ misc/dxcc.cxx misc/estrings.cxx misc/icons.cxx \ misc/kiss_io.cxx misc/kmlserver.cxx misc/locator.cxx \ misc/log.cxx misc/macroedit.cxx misc/macros.cxx misc/misc.cxx \ misc/newinstall.cxx misc/outputencoder.cxx misc/pixmaps.cxx \ misc/pixmaps_tango.cxx misc/record_loader.cxx misc/re.cxx \ misc/stacktrace.cxx misc/status.cxx misc/strutil.cxx \ misc/threads.cxx misc/timeops.cxx misc/utf8file_io.cxx \ misc/util.cxx mt63/dsp.cxx mt63/mt63base.cxx mt63/mt63.cxx \ navtex/navtex.cxx network/ca_cert.cxx network/metar.cxx \ network/network.cxx network/socket.cxx network/weather.cxx \ olivia/olivia.cxx psk/pskcoeff.cxx psk/psk.cxx psk/pskeval.cxx \ psk/pskvaricode.cxx psk/viewpsk.cxx psm/psm.cxx psm/psm.h \ qrunner/fqueue.h qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx rigcontrol/norig.cxx \ rigcontrol/ptt.cxx rigcontrol/rigio.cxx \ rigcontrol/rigsupport.cxx rigcontrol/rigxml.cxx \ rigcontrol/serial.cxx rigcontrol/xmlrpc_rig.cxx rsid/rsid.cxx \ soundcard/audio_alert.cxx soundcard/bark.cxx \ soundcard/checkout.cxx soundcard/diesel.cxx \ soundcard/dinnerbell.cxx soundcard/doesnot.cxx \ soundcard/play.pa.cxx soundcard/soundconf.cxx \ soundcard/sound.cxx soundcard/steam_train.cxx spot/notify.cxx \ spot/pskrep.cxx spot/spot.cxx ssb/ssb.cxx synop-src/synop.cxx \ thor/thor.cxx thor/thorvaricode.cxx throb/throb.cxx \ trx/modem.cxx trx/nullmodem.cxx trx/test_signal.cxx \ trx/trx.cxx waterfall/colorbox.cxx waterfall/digiscope.cxx \ waterfall/raster.cxx waterfall/waterfall.cxx wefax/wefax.cxx \ wefax/wefax_map.cxx wefax/wefax-pic.cxx widgets/flinput2.cxx \ widgets/flmisc.cxx widgets/flslider2.cxx \ widgets/Fl_Text_Buffer_mod.cxx widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx widgets/FTextRXTX.cxx \ widgets/FTextView.cxx widgets/Panel.cxx widgets/picture.cxx \ widgets/progress.cxx widgets/psk_browser.cxx \ widgets/pwrmeter.cxx widgets/smeter.cxx wwv/analysis.cxx \ wwv/wwv.cxx flarq_SOURCES = $(am__append_6) $(am__append_24) $(am__append_26) \ $(am__append_28) $(am__append_30) $(am__append_32) \ dialogs/font_browser.cxx flarq-src/arq.cxx \ flarq-src/arqdialogs.cxx flarq-src/arqhelp.cxx \ flarq-src/b64.cxx flarq-src/flarq.cxx flarq-src/flarqenv.cxx \ flarq-src/xml_server.cxx flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h flarq-src/include/b64.h \ flarq-src/include/flarq.h flarq-src/include/flarqenv.h \ flarq-src/include/xml_server.h include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H include/FTextView.h \ include/debug.h include/fileselect.h include/flinput2.h \ include/flmisc.h include/flslider2.h include/font_browser.h \ include/icons.h include/pixmaps.h include/re.h \ include/socket.h include/stacktrace.h include/threads.h \ include/table.h include/util.h combo/combo.cxx \ fileselector/fileselect.cxx logbook/table.cxx misc/ascii.cxx \ misc/debug.cxx misc/stacktrace.cxx misc/threads.cxx \ misc/timeops.cxx network/socket.cxx widgets/flinput2.cxx \ widgets/flmisc.cxx widgets/flslider2.cxx misc/icons.cxx \ misc/pixmaps.cxx misc/pixmaps_tango.cxx misc/re.cxx \ misc/util.cxx widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx # Sources that are generated, BUILT_SOURCES = # not distributed, nodist_fldigi_SOURCES = $(BUILT_SOURCES) # and deleted by the clean targets CLEANFILES = $(BUILT_SOURCES) $(am__append_34) CLEAN_LOCAL = $(am__append_33) $(am__append_35) FLDIGI_FL_SRC = \ dialogs/confdialog.fl \ dialogs/notifydialog.fl \ dialogs/record_browse.fl \ dialogs/testsigs.fl \ logbook/lgbook.fl \ logbook/fd_view.fl \ dxcluster/dx_dialog.fl FLARQ_FL_SRC = flarq-src/arqdialogs.fl @WANT_FLDIGI_TRUE@WANT_FLDIGI = yes @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@INSTALLER_FILE = flarq-$(FLARQ_VERSION)_setup.exe @WANT_FLDIGI_TRUE@INSTALLER_FILE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)_setup.exe @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@APPBUNDLE = flarq-$(FLARQ_VERSION) @WANT_FLDIGI_TRUE@APPBUNDLE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@APPBUNDLE_NOLIBS = $(APPBUNDLE)-nolibs @WANT_FLDIGI_TRUE@APPBUNDLE_NOLIBS = $(APPBUNDLE)-nolibs @WANT_FLARQ_TRUE@WANT_FLARQ = yes tmp_srcdir_var = $(srcdir) TESTS = $(tmp_srcdir_var)/../scripts/tests/config-h.sh $(tmp_srcdir_var)/../scripts/tests/cr.sh # Additional files that we distribute EXTRA_DIST = \ $(srcdir)/../build-aux/config.rpath \ $(srcdir)/../scripts/mkappbundle.sh \ $(srcdir)/../scripts/mkhamlibstatic.sh \ $(srcdir)/../scripts/mknsisinst.sh \ $(srcdir)/../scripts/buildmxe.sh \ $(srcdir)/../scripts/builddist.sh \ $(srcdir)/../scripts/tests/cr.sh \ $(srcdir)/../scripts/tests/config-h.sh \ $(srcdir)/../data/fldigi-psk.png \ $(srcdir)/../data/fldigi-rtty.png \ $(srcdir)/../data/fldigi.xpm \ $(srcdir)/../data/fldigi.desktop \ $(srcdir)/../data/NAVTEX_Stations.csv \ $(srcdir)/../data/nsd_bbsss.txt \ $(srcdir)/../data/station_table.txt \ $(srcdir)/../data/ToR-Stats-SHIP.csv \ $(srcdir)/../data/mac/Info.plist.in \ $(srcdir)/../data/mac/fldigi.icns \ $(srcdir)/../data/win32/fldigi.ico \ $(srcdir)/../data/win32/fldigi.nsi \ $(srcdir)/../data/flarq.desktop \ $(srcdir)/../data/flarq.xpm \ $(srcdir)/../data/mac/flarq.icns \ $(srcdir)/../data/win32/flarq.ico \ $(srcdir)/mbedtls/libmbedtls.pc \ $(srcdir)/mbedtls/LICENSE \ $(srcdir)/mbedtls/gpl-2.0.txt \ $(srcdir)/synop-src/synop_tool.cxx \ $(srcdir)/synop-src/README \ $(srcdir)/synop-src/Makefile \ $(FLDIGI_FL_SRC) \ $(FLARQ_FL_SRC) all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .cxx .log .o .obj .rc .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ 2>c$${pid}_.err &2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad xmlrpcpp/$(am__dirstamp): @$(MKDIR_P) xmlrpcpp @: > xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) xmlrpcpp/$(DEPDIR) @: > xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcClient.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcDispatch.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcMutex.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcServerConnection.$(OBJEXT): \ xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcServer.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcServerMethod.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcSocket.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcSource.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcUtil.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcValue.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) compat/$(am__dirstamp): @$(MKDIR_P) compat @: > compat/$(am__dirstamp) compat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) compat/$(DEPDIR) @: > compat/$(DEPDIR)/$(am__dirstamp) compat/flarq-regex.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/$(am__dirstamp): @$(MKDIR_P) misc @: > misc/$(am__dirstamp) misc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) misc/$(DEPDIR) @: > misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-stack.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) compat/flarq-getsysinfo.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) compat/flarq-mingw.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/flarq-nls.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) flarq-src/$(am__dirstamp): @$(MKDIR_P) flarq-src @: > flarq-src/$(am__dirstamp) flarq-src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) flarq-src/$(DEPDIR) @: > flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarqrc.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) dialogs/$(am__dirstamp): @$(MKDIR_P) dialogs @: > dialogs/$(am__dirstamp) dialogs/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dialogs/$(DEPDIR) @: > dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/flarq-font_browser.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-arq.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-arqdialogs.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-arqhelp.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-b64.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-flarq.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-flarqenv.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-xml_server.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) combo/$(am__dirstamp): @$(MKDIR_P) combo @: > combo/$(am__dirstamp) combo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) combo/$(DEPDIR) @: > combo/$(DEPDIR)/$(am__dirstamp) combo/flarq-combo.$(OBJEXT): combo/$(am__dirstamp) \ combo/$(DEPDIR)/$(am__dirstamp) fileselector/$(am__dirstamp): @$(MKDIR_P) fileselector @: > fileselector/$(am__dirstamp) fileselector/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fileselector/$(DEPDIR) @: > fileselector/$(DEPDIR)/$(am__dirstamp) fileselector/flarq-fileselect.$(OBJEXT): fileselector/$(am__dirstamp) \ fileselector/$(DEPDIR)/$(am__dirstamp) logbook/$(am__dirstamp): @$(MKDIR_P) logbook @: > logbook/$(am__dirstamp) logbook/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) logbook/$(DEPDIR) @: > logbook/$(DEPDIR)/$(am__dirstamp) logbook/flarq-table.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) misc/flarq-ascii.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-debug.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-stacktrace.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-threads.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-timeops.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) network/$(am__dirstamp): @$(MKDIR_P) network @: > network/$(am__dirstamp) network/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) network/$(DEPDIR) @: > network/$(DEPDIR)/$(am__dirstamp) network/flarq-socket.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) widgets/$(am__dirstamp): @$(MKDIR_P) widgets @: > widgets/$(am__dirstamp) widgets/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) widgets/$(DEPDIR) @: > widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-flinput2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-flmisc.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-flslider2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) misc/flarq-icons.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-pixmaps.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-pixmaps_tango.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-re.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-util.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) widgets/flarq-Fl_Text_Buffer_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-Fl_Text_Display_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-Fl_Text_Editor_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-FTextView.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) flarq$(EXEEXT): $(flarq_OBJECTS) $(flarq_DEPENDENCIES) $(EXTRA_flarq_DEPENDENCIES) @rm -f flarq$(EXEEXT) $(AM_V_CXXLD)$(flarq_LINK) $(flarq_OBJECTS) $(flarq_LDADD) $(LIBS) network/fldigi-xmlrpc.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcClient.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcDispatch.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcMutex.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcServerConnection.$(OBJEXT): \ xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcServer.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcServerMethod.$(OBJEXT): \ xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcSocket.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcSource.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcUtil.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcValue.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) mbedtls/$(am__dirstamp): @$(MKDIR_P) mbedtls @: > mbedtls/$(am__dirstamp) mbedtls/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mbedtls/$(DEPDIR) @: > mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-aes.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-aesni.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-arc4.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-aria.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-asn1parse.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-asn1write.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-base64.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-bignum.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-blowfish.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-camellia.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ccm.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-certs.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-chacha20.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-chachapoly.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-cipher.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-cipher_wrap.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-cmac.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ctr_drbg.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-debug.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-des.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-dhm.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecdh.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecdsa.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecjpake.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecp.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecp_curves.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-entropy.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-entropy_poll.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-error.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-gcm.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-havege.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-hkdf.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-hmac_drbg.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md2.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md4.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md5.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md_wrap.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-memory_buffer_alloc.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-net_sockets.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-nist_kw.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-oid.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-padlock.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pem.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pk.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkcs11.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkcs12.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkcs5.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkparse.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pk_wrap.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkwrite.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-platform.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-platform_util.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-poly1305.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ripemd160.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-rsa.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-rsa_internal.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-sha1.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-sha256.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-sha512.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_cache.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_ciphersuites.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_cli.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_cookie.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_srv.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_ticket.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_tls.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-threading.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-timing.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-version.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-version_features.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_create.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_crl.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_crt.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_csr.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509write_crt.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509write_csr.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-xtea.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) rigcontrol/$(am__dirstamp): @$(MKDIR_P) rigcontrol @: > rigcontrol/$(am__dirstamp) rigcontrol/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) rigcontrol/$(DEPDIR) @: > rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-hamlib.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigclass.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) misc/fldigi-benchmark.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) compat/fldigi-regex.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/fldigi-stack.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) compat/fldigi-getsysinfo.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) compat/fldigi-mingw.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/fldigi-nls.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) combo/fldigi-combo.$(OBJEXT): combo/$(am__dirstamp) \ combo/$(DEPDIR)/$(am__dirstamp) config_script/$(am__dirstamp): @$(MKDIR_P) config_script @: > config_script/$(am__dirstamp) config_script/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) config_script/$(DEPDIR) @: > config_script/$(DEPDIR)/$(am__dirstamp) config_script/fldigi-create_default_script.$(OBJEXT): \ config_script/$(am__dirstamp) \ config_script/$(DEPDIR)/$(am__dirstamp) config_script/fldigi-run_scripts.$(OBJEXT): \ config_script/$(am__dirstamp) \ config_script/$(DEPDIR)/$(am__dirstamp) config_script/fldigi-script_parsing.$(OBJEXT): \ config_script/$(am__dirstamp) \ config_script/$(DEPDIR)/$(am__dirstamp) contestia/$(am__dirstamp): @$(MKDIR_P) contestia @: > contestia/$(am__dirstamp) contestia/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) contestia/$(DEPDIR) @: > contestia/$(DEPDIR)/$(am__dirstamp) contestia/fldigi-contestia.$(OBJEXT): contestia/$(am__dirstamp) \ contestia/$(DEPDIR)/$(am__dirstamp) cw_rtty/$(am__dirstamp): @$(MKDIR_P) cw_rtty @: > cw_rtty/$(am__dirstamp) cw_rtty/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) cw_rtty/$(DEPDIR) @: > cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-cw.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-morse.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-nanoIO.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-Nav.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-rtty.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-view_cw.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-view_rtty.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) cw_rtty/fldigi-winkeyer.$(OBJEXT): cw_rtty/$(am__dirstamp) \ cw_rtty/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-confdialog.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-fl_digi.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-font_browser.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-htmlstrings.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-notifydialog.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-record_browse.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-testsigs.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-tod_clock.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-Viewer.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dominoex/$(am__dirstamp): @$(MKDIR_P) dominoex @: > dominoex/$(am__dirstamp) dominoex/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dominoex/$(DEPDIR) @: > dominoex/$(DEPDIR)/$(am__dirstamp) dominoex/fldigi-dominoex.$(OBJEXT): dominoex/$(am__dirstamp) \ dominoex/$(DEPDIR)/$(am__dirstamp) dominoex/fldigi-dominovar.$(OBJEXT): dominoex/$(am__dirstamp) \ dominoex/$(DEPDIR)/$(am__dirstamp) dtmf/$(am__dirstamp): @$(MKDIR_P) dtmf @: > dtmf/$(am__dirstamp) dtmf/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dtmf/$(DEPDIR) @: > dtmf/$(DEPDIR)/$(am__dirstamp) dtmf/fldigi-dtmf.$(OBJEXT): dtmf/$(am__dirstamp) \ dtmf/$(DEPDIR)/$(am__dirstamp) dxcluster/$(am__dirstamp): @$(MKDIR_P) dxcluster @: > dxcluster/$(am__dirstamp) dxcluster/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dxcluster/$(DEPDIR) @: > dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-dxcluster.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-dx_dialog.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) feld/$(am__dirstamp): @$(MKDIR_P) feld @: > feld/$(am__dirstamp) feld/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) feld/$(DEPDIR) @: > feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-feld.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-feldfonts.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) fft-monitor/$(am__dirstamp): @$(MKDIR_P) fft-monitor @: > fft-monitor/$(am__dirstamp) fft-monitor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fft-monitor/$(DEPDIR) @: > fft-monitor/$(DEPDIR)/$(am__dirstamp) fft-monitor/fldigi-fft-monitor.$(OBJEXT): fft-monitor/$(am__dirstamp) \ fft-monitor/$(DEPDIR)/$(am__dirstamp) fft-monitor/fldigi-spectrum.$(OBJEXT): fft-monitor/$(am__dirstamp) \ fft-monitor/$(DEPDIR)/$(am__dirstamp) fft-monitor/fldigi-spectrum_viewer.$(OBJEXT): \ fft-monitor/$(am__dirstamp) \ fft-monitor/$(DEPDIR)/$(am__dirstamp) fileselector/fldigi-fileselect.$(OBJEXT): \ fileselector/$(am__dirstamp) \ fileselector/$(DEPDIR)/$(am__dirstamp) filters/$(am__dirstamp): @$(MKDIR_P) filters @: > filters/$(am__dirstamp) filters/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) filters/$(DEPDIR) @: > filters/$(DEPDIR)/$(am__dirstamp) filters/fldigi-fftfilt.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) filters/fldigi-filters.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) filters/fldigi-viterbi.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) fsq/$(am__dirstamp): @$(MKDIR_P) fsq @: > fsq/$(am__dirstamp) fsq/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fsq/$(DEPDIR) @: > fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq_monitor.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) globals/$(am__dirstamp): @$(MKDIR_P) globals @: > globals/$(am__dirstamp) globals/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) globals/$(DEPDIR) @: > globals/$(DEPDIR)/$(am__dirstamp) globals/fldigi-globals.$(OBJEXT): globals/$(am__dirstamp) \ globals/$(DEPDIR)/$(am__dirstamp) ifkp/$(am__dirstamp): @$(MKDIR_P) ifkp @: > ifkp/$(am__dirstamp) ifkp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ifkp/$(DEPDIR) @: > ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-tux.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) irrxml/$(am__dirstamp): @$(MKDIR_P) irrxml @: > irrxml/$(am__dirstamp) irrxml/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) irrxml/$(DEPDIR) @: > irrxml/$(DEPDIR)/$(am__dirstamp) irrxml/fldigi-irrXML.$(OBJEXT): irrxml/$(am__dirstamp) \ irrxml/$(DEPDIR)/$(am__dirstamp) libtiniconv/$(am__dirstamp): @$(MKDIR_P) libtiniconv @: > libtiniconv/$(am__dirstamp) libtiniconv/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libtiniconv/$(DEPDIR) @: > libtiniconv/$(DEPDIR)/$(am__dirstamp) libtiniconv/fldigi-tiniconv.$(OBJEXT): libtiniconv/$(am__dirstamp) \ libtiniconv/$(DEPDIR)/$(am__dirstamp) libtiniconv/fldigi-tiniconv_desc.$(OBJEXT): \ libtiniconv/$(am__dirstamp) \ libtiniconv/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-adif_io.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-calendar.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-contest.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-counties.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-county_lists.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-cty-dat.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-date.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-fd_logger.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-fd_view.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-lgbook.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-logbook.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-logsupport.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-lookupcall.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-maclogger.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-n3fjp_logger.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-qrzlib.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-qso_db.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-table.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-textio.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-xmlrpc_log.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logger/$(am__dirstamp): @$(MKDIR_P) logger @: > logger/$(am__dirstamp) logger/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) logger/$(DEPDIR) @: > logger/$(DEPDIR)/$(am__dirstamp) logger/fldigi-logger.$(OBJEXT): logger/$(am__dirstamp) \ logger/$(DEPDIR)/$(am__dirstamp) logger/fldigi-rx_extract.$(OBJEXT): logger/$(am__dirstamp) \ logger/$(DEPDIR)/$(am__dirstamp) logger/fldigi-speak.$(OBJEXT): logger/$(am__dirstamp) \ logger/$(DEPDIR)/$(am__dirstamp) mfsk/$(am__dirstamp): @$(MKDIR_P) mfsk @: > mfsk/$(am__dirstamp) mfsk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mfsk/$(DEPDIR) @: > mfsk/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-interleave.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-mfsk.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-mfskvaricode.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) misc/fldigi-arq_io.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-ascii.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-ax25_decode.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-charsetdistiller.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-charsetlist.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-configuration.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-coordinate.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-debug.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-dxcc.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-estrings.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-icons.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-kiss_io.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-kmlserver.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-locator.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-log.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-macroedit.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-macros.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-misc.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-newinstall.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-outputencoder.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-pixmaps.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-pixmaps_tango.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-record_loader.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-re.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-stacktrace.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-status.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-strutil.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-threads.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-timeops.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-utf8file_io.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-util.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) mt63/$(am__dirstamp): @$(MKDIR_P) mt63 @: > mt63/$(am__dirstamp) mt63/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mt63/$(DEPDIR) @: > mt63/$(DEPDIR)/$(am__dirstamp) mt63/fldigi-dsp.$(OBJEXT): mt63/$(am__dirstamp) \ mt63/$(DEPDIR)/$(am__dirstamp) mt63/fldigi-mt63base.$(OBJEXT): mt63/$(am__dirstamp) \ mt63/$(DEPDIR)/$(am__dirstamp) mt63/fldigi-mt63.$(OBJEXT): mt63/$(am__dirstamp) \ mt63/$(DEPDIR)/$(am__dirstamp) navtex/$(am__dirstamp): @$(MKDIR_P) navtex @: > navtex/$(am__dirstamp) navtex/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) navtex/$(DEPDIR) @: > navtex/$(DEPDIR)/$(am__dirstamp) navtex/fldigi-navtex.$(OBJEXT): navtex/$(am__dirstamp) \ navtex/$(DEPDIR)/$(am__dirstamp) network/fldigi-ca_cert.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-metar.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-network.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-socket.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-weather.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) olivia/$(am__dirstamp): @$(MKDIR_P) olivia @: > olivia/$(am__dirstamp) olivia/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) olivia/$(DEPDIR) @: > olivia/$(DEPDIR)/$(am__dirstamp) olivia/fldigi-olivia.$(OBJEXT): olivia/$(am__dirstamp) \ olivia/$(DEPDIR)/$(am__dirstamp) psk/$(am__dirstamp): @$(MKDIR_P) psk @: > psk/$(am__dirstamp) psk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) psk/$(DEPDIR) @: > psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-pskcoeff.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-psk.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-pskeval.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-pskvaricode.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-viewpsk.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psm/$(am__dirstamp): @$(MKDIR_P) psm @: > psm/$(am__dirstamp) psm/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) psm/$(DEPDIR) @: > psm/$(DEPDIR)/$(am__dirstamp) psm/fldigi-psm.$(OBJEXT): psm/$(am__dirstamp) \ psm/$(DEPDIR)/$(am__dirstamp) qrunner/$(am__dirstamp): @$(MKDIR_P) qrunner @: > qrunner/$(am__dirstamp) qrunner/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) qrunner/$(DEPDIR) @: > qrunner/$(DEPDIR)/$(am__dirstamp) qrunner/fldigi-qrunner.$(OBJEXT): qrunner/$(am__dirstamp) \ qrunner/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-FreqControl.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-norig.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-ptt.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigio.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigsupport.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigxml.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-serial.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-xmlrpc_rig.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rsid/$(am__dirstamp): @$(MKDIR_P) rsid @: > rsid/$(am__dirstamp) rsid/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) rsid/$(DEPDIR) @: > rsid/$(DEPDIR)/$(am__dirstamp) rsid/fldigi-rsid.$(OBJEXT): rsid/$(am__dirstamp) \ rsid/$(DEPDIR)/$(am__dirstamp) soundcard/$(am__dirstamp): @$(MKDIR_P) soundcard @: > soundcard/$(am__dirstamp) soundcard/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) soundcard/$(DEPDIR) @: > soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-audio_alert.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-bark.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-checkout.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-diesel.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-dinnerbell.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-doesnot.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-play.pa.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-soundconf.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-sound.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-steam_train.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) spot/$(am__dirstamp): @$(MKDIR_P) spot @: > spot/$(am__dirstamp) spot/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) spot/$(DEPDIR) @: > spot/$(DEPDIR)/$(am__dirstamp) spot/fldigi-notify.$(OBJEXT): spot/$(am__dirstamp) \ spot/$(DEPDIR)/$(am__dirstamp) spot/fldigi-pskrep.$(OBJEXT): spot/$(am__dirstamp) \ spot/$(DEPDIR)/$(am__dirstamp) spot/fldigi-spot.$(OBJEXT): spot/$(am__dirstamp) \ spot/$(DEPDIR)/$(am__dirstamp) ssb/$(am__dirstamp): @$(MKDIR_P) ssb @: > ssb/$(am__dirstamp) ssb/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ssb/$(DEPDIR) @: > ssb/$(DEPDIR)/$(am__dirstamp) ssb/fldigi-ssb.$(OBJEXT): ssb/$(am__dirstamp) \ ssb/$(DEPDIR)/$(am__dirstamp) synop-src/$(am__dirstamp): @$(MKDIR_P) synop-src @: > synop-src/$(am__dirstamp) synop-src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) synop-src/$(DEPDIR) @: > synop-src/$(DEPDIR)/$(am__dirstamp) synop-src/fldigi-synop.$(OBJEXT): synop-src/$(am__dirstamp) \ synop-src/$(DEPDIR)/$(am__dirstamp) thor/$(am__dirstamp): @$(MKDIR_P) thor @: > thor/$(am__dirstamp) thor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) thor/$(DEPDIR) @: > thor/$(DEPDIR)/$(am__dirstamp) thor/fldigi-thor.$(OBJEXT): thor/$(am__dirstamp) \ thor/$(DEPDIR)/$(am__dirstamp) thor/fldigi-thorvaricode.$(OBJEXT): thor/$(am__dirstamp) \ thor/$(DEPDIR)/$(am__dirstamp) throb/$(am__dirstamp): @$(MKDIR_P) throb @: > throb/$(am__dirstamp) throb/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) throb/$(DEPDIR) @: > throb/$(DEPDIR)/$(am__dirstamp) throb/fldigi-throb.$(OBJEXT): throb/$(am__dirstamp) \ throb/$(DEPDIR)/$(am__dirstamp) trx/$(am__dirstamp): @$(MKDIR_P) trx @: > trx/$(am__dirstamp) trx/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) trx/$(DEPDIR) @: > trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-modem.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-nullmodem.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-test_signal.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-trx.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) waterfall/$(am__dirstamp): @$(MKDIR_P) waterfall @: > waterfall/$(am__dirstamp) waterfall/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) waterfall/$(DEPDIR) @: > waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-colorbox.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-digiscope.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-raster.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-waterfall.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) wefax/$(am__dirstamp): @$(MKDIR_P) wefax @: > wefax/$(am__dirstamp) wefax/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) wefax/$(DEPDIR) @: > wefax/$(DEPDIR)/$(am__dirstamp) wefax/fldigi-wefax.$(OBJEXT): wefax/$(am__dirstamp) \ wefax/$(DEPDIR)/$(am__dirstamp) wefax/fldigi-wefax_map.$(OBJEXT): wefax/$(am__dirstamp) \ wefax/$(DEPDIR)/$(am__dirstamp) wefax/fldigi-wefax-pic.$(OBJEXT): wefax/$(am__dirstamp) \ wefax/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-flinput2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-flmisc.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-flslider2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Fl_Text_Buffer_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Fl_Text_Display_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Fl_Text_Editor_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-FTextRXTX.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-FTextView.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Panel.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-picture.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-progress.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-psk_browser.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-pwrmeter.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-smeter.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) wwv/$(am__dirstamp): @$(MKDIR_P) wwv @: > wwv/$(am__dirstamp) wwv/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) wwv/$(DEPDIR) @: > wwv/$(DEPDIR)/$(am__dirstamp) wwv/fldigi-analysis.$(OBJEXT): wwv/$(am__dirstamp) \ wwv/$(DEPDIR)/$(am__dirstamp) wwv/fldigi-wwv.$(OBJEXT): wwv/$(am__dirstamp) \ wwv/$(DEPDIR)/$(am__dirstamp) blank/$(am__dirstamp): @$(MKDIR_P) blank @: > blank/$(am__dirstamp) blank/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) blank/$(DEPDIR) @: > blank/$(DEPDIR)/$(am__dirstamp) blank/fldigi-blank.$(OBJEXT): blank/$(am__dirstamp) \ blank/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-fl_digi_main.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-arc-help.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-CCC_Commands.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-DXClusterServers.$(OBJEXT): \ dxcluster/$(am__dirstamp) dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-DXSpiderCommandReference.$(OBJEXT): \ dxcluster/$(am__dirstamp) dxcluster/$(DEPDIR)/$(am__dirstamp) fileselector/fldigi-flnfc_common.$(OBJEXT): \ fileselector/$(am__dirstamp) \ fileselector/$(DEPDIR)/$(am__dirstamp) feld/fldigi-Feld7x7-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-Feld7x7n-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldDx-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldFat-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldHell-12.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldLittle-12.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldLo8-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldLow-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldModern-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldModern8-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldNarr-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldReal-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldStyl-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldVert-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldWide-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq_varicode.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq-pic.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-bitmaps.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp_bitmaps.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp_varicode.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp-pic.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-mfsk-pic.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) rsid/fldigi-rsid_defs.$(OBJEXT): rsid/$(am__dirstamp) \ rsid/$(DEPDIR)/$(am__dirstamp) thor/fldigi-thor-pic.$(OBJEXT): thor/$(am__dirstamp) \ thor/$(DEPDIR)/$(am__dirstamp) trx/fldigi-tune.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-guide.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) fldigi$(EXEEXT): $(fldigi_OBJECTS) $(fldigi_DEPENDENCIES) $(EXTRA_fldigi_DEPENDENCIES) @rm -f fldigi$(EXEEXT) $(AM_V_CXXLD)$(fldigi_LINK) $(fldigi_OBJECTS) $(fldigi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f blank/*.$(OBJEXT) -rm -f combo/*.$(OBJEXT) -rm -f compat/*.$(OBJEXT) -rm -f config_script/*.$(OBJEXT) -rm -f contestia/*.$(OBJEXT) -rm -f cw_rtty/*.$(OBJEXT) -rm -f dialogs/*.$(OBJEXT) -rm -f dominoex/*.$(OBJEXT) -rm -f dtmf/*.$(OBJEXT) -rm -f dxcluster/*.$(OBJEXT) -rm -f feld/*.$(OBJEXT) -rm -f fft-monitor/*.$(OBJEXT) -rm -f fileselector/*.$(OBJEXT) -rm -f filters/*.$(OBJEXT) -rm -f flarq-src/*.$(OBJEXT) -rm -f fsq/*.$(OBJEXT) -rm -f globals/*.$(OBJEXT) -rm -f ifkp/*.$(OBJEXT) -rm -f irrxml/*.$(OBJEXT) -rm -f libtiniconv/*.$(OBJEXT) -rm -f logbook/*.$(OBJEXT) -rm -f logger/*.$(OBJEXT) -rm -f mbedtls/*.$(OBJEXT) -rm -f mfsk/*.$(OBJEXT) -rm -f misc/*.$(OBJEXT) -rm -f mt63/*.$(OBJEXT) -rm -f navtex/*.$(OBJEXT) -rm -f network/*.$(OBJEXT) -rm -f olivia/*.$(OBJEXT) -rm -f psk/*.$(OBJEXT) -rm -f psm/*.$(OBJEXT) -rm -f qrunner/*.$(OBJEXT) -rm -f rigcontrol/*.$(OBJEXT) -rm -f rsid/*.$(OBJEXT) -rm -f soundcard/*.$(OBJEXT) -rm -f spot/*.$(OBJEXT) -rm -f ssb/*.$(OBJEXT) -rm -f synop-src/*.$(OBJEXT) -rm -f thor/*.$(OBJEXT) -rm -f throb/*.$(OBJEXT) -rm -f trx/*.$(OBJEXT) -rm -f waterfall/*.$(OBJEXT) -rm -f wefax/*.$(OBJEXT) -rm -f widgets/*.$(OBJEXT) -rm -f wwv/*.$(OBJEXT) -rm -f xmlrpcpp/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@blank/$(DEPDIR)/fldigi-blank.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@combo/$(DEPDIR)/flarq-combo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@combo/$(DEPDIR)/fldigi-combo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/flarq-getsysinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/flarq-mingw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/flarq-regex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/fldigi-getsysinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/fldigi-mingw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/fldigi-regex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@config_script/$(DEPDIR)/fldigi-create_default_script.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@config_script/$(DEPDIR)/fldigi-run_scripts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@config_script/$(DEPDIR)/fldigi-script_parsing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@contestia/$(DEPDIR)/fldigi-contestia.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-Nav.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-cw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-morse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-nanoIO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-rtty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-view_cw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-view_rtty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@cw_rtty/$(DEPDIR)/fldigi-winkeyer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/flarq-font_browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-Viewer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-confdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-fl_digi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-font_browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-guide.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-htmlstrings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-notifydialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-record_browse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-testsigs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-tod_clock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dominoex/$(DEPDIR)/fldigi-dominoex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dominoex/$(DEPDIR)/fldigi-dominovar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dtmf/$(DEPDIR)/fldigi-dtmf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-arc-help.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-dxcluster.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-Feld7x7-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldDx-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldFat-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldHell-12.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldLittle-12.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldLo8-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldLow-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldModern-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldModern8-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldNarr-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldReal-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldStyl-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldVert-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldWide-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-feld.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-feldfonts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fft-monitor/$(DEPDIR)/fldigi-spectrum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fileselector/$(DEPDIR)/flarq-fileselect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fileselector/$(DEPDIR)/fldigi-fileselect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fileselector/$(DEPDIR)/fldigi-flnfc_common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/fldigi-fftfilt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/fldigi-filters.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/fldigi-viterbi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-arq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-arqdialogs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-arqhelp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-b64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-flarq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-flarqenv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-xml_server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-bitmaps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq-pic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq_monitor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq_varicode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@globals/$(DEPDIR)/fldigi-globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-tux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@irrxml/$(DEPDIR)/fldigi-irrXML.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/flarq-table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-adif_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-calendar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-contest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-counties.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-county_lists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-cty-dat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-date.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-fd_logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-fd_view.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-lgbook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-logbook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-logsupport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-lookupcall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-maclogger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-qrzlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-qso_db.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-textio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logger/$(DEPDIR)/fldigi-logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logger/$(DEPDIR)/fldigi-rx_extract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@logger/$(DEPDIR)/fldigi-speak.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-aes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-aesni.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-arc4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-aria.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-asn1parse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-asn1write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-bignum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-blowfish.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-camellia.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ccm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-certs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-chacha20.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-chachapoly.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-cipher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-cmac.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-des.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-dhm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecdh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecdsa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecjpake.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-entropy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-gcm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-havege.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-hkdf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md_wrap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-net_sockets.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-nist_kw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-oid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-padlock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkcs11.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkcs12.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkcs5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkwrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-platform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-platform_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-poly1305.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ripemd160.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-rsa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-sha256.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-sha512.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-threading.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-timing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-version_features.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_create.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_crl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_crt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_csr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-xtea.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-interleave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-mfsk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-ascii.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-icons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-nls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-pixmaps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-pixmaps_tango.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-re.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-stack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-stacktrace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-timeops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-arq_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-ascii.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-ax25_decode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-benchmark.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-charsetdistiller.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-charsetlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-configuration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-coordinate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-dxcc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-estrings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-icons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-kiss_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-kmlserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-locator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-macroedit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-newinstall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-nls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-outputencoder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-pixmaps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-pixmaps_tango.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-re.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-record_loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-stack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-stacktrace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-status.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-strutil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-timeops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-utf8file_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mt63/$(DEPDIR)/fldigi-dsp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mt63/$(DEPDIR)/fldigi-mt63.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mt63/$(DEPDIR)/fldigi-mt63base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@navtex/$(DEPDIR)/fldigi-navtex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/flarq-socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-ca_cert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-metar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-network.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-weather.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-xmlrpc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@olivia/$(DEPDIR)/fldigi-olivia.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-psk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-pskcoeff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-pskeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-pskvaricode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-viewpsk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@psm/$(DEPDIR)/fldigi-psm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@qrunner/$(DEPDIR)/fldigi-qrunner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-hamlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-norig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-ptt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigclass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigxml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-serial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rsid/$(DEPDIR)/fldigi-rsid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@rsid/$(DEPDIR)/fldigi-rsid_defs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-audio_alert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-bark.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-checkout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-diesel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-dinnerbell.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-doesnot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-play.pa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-soundconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-steam_train.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@spot/$(DEPDIR)/fldigi-notify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@spot/$(DEPDIR)/fldigi-pskrep.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@spot/$(DEPDIR)/fldigi-spot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ssb/$(DEPDIR)/fldigi-ssb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@synop-src/$(DEPDIR)/fldigi-synop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@thor/$(DEPDIR)/fldigi-thor-pic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@thor/$(DEPDIR)/fldigi-thor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@thor/$(DEPDIR)/fldigi-thorvaricode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@throb/$(DEPDIR)/fldigi-throb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-modem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-nullmodem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-test_signal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-trx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-tune.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-colorbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-digiscope.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-raster.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-waterfall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wefax/$(DEPDIR)/fldigi-wefax-pic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wefax/$(DEPDIR)/fldigi-wefax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wefax/$(DEPDIR)/fldigi-wefax_map.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-FTextView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-flinput2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-flmisc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-flslider2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-FTextRXTX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-FTextView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Panel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-flinput2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-flmisc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-flslider2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-picture.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-progress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-psk_browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-pwrmeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-smeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wwv/$(DEPDIR)/fldigi-analysis.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wwv/$(DEPDIR)/fldigi-wwv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` compat/flarq-regex.o: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-regex.o -MD -MP -MF compat/$(DEPDIR)/flarq-regex.Tpo -c -o compat/flarq-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-regex.Tpo compat/$(DEPDIR)/flarq-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/flarq-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c compat/flarq-regex.obj: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-regex.obj -MD -MP -MF compat/$(DEPDIR)/flarq-regex.Tpo -c -o compat/flarq-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-regex.Tpo compat/$(DEPDIR)/flarq-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/flarq-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` compat/flarq-getsysinfo.o: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-getsysinfo.o -MD -MP -MF compat/$(DEPDIR)/flarq-getsysinfo.Tpo -c -o compat/flarq-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-getsysinfo.Tpo compat/$(DEPDIR)/flarq-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/flarq-getsysinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c compat/flarq-getsysinfo.obj: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-getsysinfo.obj -MD -MP -MF compat/$(DEPDIR)/flarq-getsysinfo.Tpo -c -o compat/flarq-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-getsysinfo.Tpo compat/$(DEPDIR)/flarq-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/flarq-getsysinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` compat/flarq-mingw.o: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-mingw.o -MD -MP -MF compat/$(DEPDIR)/flarq-mingw.Tpo -c -o compat/flarq-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-mingw.Tpo compat/$(DEPDIR)/flarq-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/flarq-mingw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c compat/flarq-mingw.obj: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-mingw.obj -MD -MP -MF compat/$(DEPDIR)/flarq-mingw.Tpo -c -o compat/flarq-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-mingw.Tpo compat/$(DEPDIR)/flarq-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/flarq-mingw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` mbedtls/fldigi-aes.o: mbedtls/aes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aes.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aes.Tpo -c -o mbedtls/fldigi-aes.o `test -f 'mbedtls/aes.c' || echo '$(srcdir)/'`mbedtls/aes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aes.Tpo mbedtls/$(DEPDIR)/fldigi-aes.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aes.c' object='mbedtls/fldigi-aes.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aes.o `test -f 'mbedtls/aes.c' || echo '$(srcdir)/'`mbedtls/aes.c mbedtls/fldigi-aes.obj: mbedtls/aes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aes.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aes.Tpo -c -o mbedtls/fldigi-aes.obj `if test -f 'mbedtls/aes.c'; then $(CYGPATH_W) 'mbedtls/aes.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aes.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aes.Tpo mbedtls/$(DEPDIR)/fldigi-aes.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aes.c' object='mbedtls/fldigi-aes.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aes.obj `if test -f 'mbedtls/aes.c'; then $(CYGPATH_W) 'mbedtls/aes.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aes.c'; fi` mbedtls/fldigi-aesni.o: mbedtls/aesni.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aesni.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aesni.Tpo -c -o mbedtls/fldigi-aesni.o `test -f 'mbedtls/aesni.c' || echo '$(srcdir)/'`mbedtls/aesni.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aesni.Tpo mbedtls/$(DEPDIR)/fldigi-aesni.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aesni.c' object='mbedtls/fldigi-aesni.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aesni.o `test -f 'mbedtls/aesni.c' || echo '$(srcdir)/'`mbedtls/aesni.c mbedtls/fldigi-aesni.obj: mbedtls/aesni.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aesni.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aesni.Tpo -c -o mbedtls/fldigi-aesni.obj `if test -f 'mbedtls/aesni.c'; then $(CYGPATH_W) 'mbedtls/aesni.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aesni.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aesni.Tpo mbedtls/$(DEPDIR)/fldigi-aesni.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aesni.c' object='mbedtls/fldigi-aesni.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aesni.obj `if test -f 'mbedtls/aesni.c'; then $(CYGPATH_W) 'mbedtls/aesni.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aesni.c'; fi` mbedtls/fldigi-arc4.o: mbedtls/arc4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-arc4.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-arc4.Tpo -c -o mbedtls/fldigi-arc4.o `test -f 'mbedtls/arc4.c' || echo '$(srcdir)/'`mbedtls/arc4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-arc4.Tpo mbedtls/$(DEPDIR)/fldigi-arc4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/arc4.c' object='mbedtls/fldigi-arc4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-arc4.o `test -f 'mbedtls/arc4.c' || echo '$(srcdir)/'`mbedtls/arc4.c mbedtls/fldigi-arc4.obj: mbedtls/arc4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-arc4.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-arc4.Tpo -c -o mbedtls/fldigi-arc4.obj `if test -f 'mbedtls/arc4.c'; then $(CYGPATH_W) 'mbedtls/arc4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/arc4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-arc4.Tpo mbedtls/$(DEPDIR)/fldigi-arc4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/arc4.c' object='mbedtls/fldigi-arc4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-arc4.obj `if test -f 'mbedtls/arc4.c'; then $(CYGPATH_W) 'mbedtls/arc4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/arc4.c'; fi` mbedtls/fldigi-aria.o: mbedtls/aria.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aria.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aria.Tpo -c -o mbedtls/fldigi-aria.o `test -f 'mbedtls/aria.c' || echo '$(srcdir)/'`mbedtls/aria.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aria.Tpo mbedtls/$(DEPDIR)/fldigi-aria.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aria.c' object='mbedtls/fldigi-aria.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aria.o `test -f 'mbedtls/aria.c' || echo '$(srcdir)/'`mbedtls/aria.c mbedtls/fldigi-aria.obj: mbedtls/aria.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aria.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aria.Tpo -c -o mbedtls/fldigi-aria.obj `if test -f 'mbedtls/aria.c'; then $(CYGPATH_W) 'mbedtls/aria.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aria.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aria.Tpo mbedtls/$(DEPDIR)/fldigi-aria.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aria.c' object='mbedtls/fldigi-aria.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aria.obj `if test -f 'mbedtls/aria.c'; then $(CYGPATH_W) 'mbedtls/aria.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aria.c'; fi` mbedtls/fldigi-asn1parse.o: mbedtls/asn1parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1parse.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo -c -o mbedtls/fldigi-asn1parse.o `test -f 'mbedtls/asn1parse.c' || echo '$(srcdir)/'`mbedtls/asn1parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo mbedtls/$(DEPDIR)/fldigi-asn1parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1parse.c' object='mbedtls/fldigi-asn1parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1parse.o `test -f 'mbedtls/asn1parse.c' || echo '$(srcdir)/'`mbedtls/asn1parse.c mbedtls/fldigi-asn1parse.obj: mbedtls/asn1parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1parse.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo -c -o mbedtls/fldigi-asn1parse.obj `if test -f 'mbedtls/asn1parse.c'; then $(CYGPATH_W) 'mbedtls/asn1parse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1parse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo mbedtls/$(DEPDIR)/fldigi-asn1parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1parse.c' object='mbedtls/fldigi-asn1parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1parse.obj `if test -f 'mbedtls/asn1parse.c'; then $(CYGPATH_W) 'mbedtls/asn1parse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1parse.c'; fi` mbedtls/fldigi-asn1write.o: mbedtls/asn1write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1write.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo -c -o mbedtls/fldigi-asn1write.o `test -f 'mbedtls/asn1write.c' || echo '$(srcdir)/'`mbedtls/asn1write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo mbedtls/$(DEPDIR)/fldigi-asn1write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1write.c' object='mbedtls/fldigi-asn1write.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1write.o `test -f 'mbedtls/asn1write.c' || echo '$(srcdir)/'`mbedtls/asn1write.c mbedtls/fldigi-asn1write.obj: mbedtls/asn1write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1write.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo -c -o mbedtls/fldigi-asn1write.obj `if test -f 'mbedtls/asn1write.c'; then $(CYGPATH_W) 'mbedtls/asn1write.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1write.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo mbedtls/$(DEPDIR)/fldigi-asn1write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1write.c' object='mbedtls/fldigi-asn1write.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1write.obj `if test -f 'mbedtls/asn1write.c'; then $(CYGPATH_W) 'mbedtls/asn1write.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1write.c'; fi` mbedtls/fldigi-base64.o: mbedtls/base64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-base64.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-base64.Tpo -c -o mbedtls/fldigi-base64.o `test -f 'mbedtls/base64.c' || echo '$(srcdir)/'`mbedtls/base64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-base64.Tpo mbedtls/$(DEPDIR)/fldigi-base64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/base64.c' object='mbedtls/fldigi-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-base64.o `test -f 'mbedtls/base64.c' || echo '$(srcdir)/'`mbedtls/base64.c mbedtls/fldigi-base64.obj: mbedtls/base64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-base64.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-base64.Tpo -c -o mbedtls/fldigi-base64.obj `if test -f 'mbedtls/base64.c'; then $(CYGPATH_W) 'mbedtls/base64.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/base64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-base64.Tpo mbedtls/$(DEPDIR)/fldigi-base64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/base64.c' object='mbedtls/fldigi-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-base64.obj `if test -f 'mbedtls/base64.c'; then $(CYGPATH_W) 'mbedtls/base64.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/base64.c'; fi` mbedtls/fldigi-bignum.o: mbedtls/bignum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-bignum.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-bignum.Tpo -c -o mbedtls/fldigi-bignum.o `test -f 'mbedtls/bignum.c' || echo '$(srcdir)/'`mbedtls/bignum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-bignum.Tpo mbedtls/$(DEPDIR)/fldigi-bignum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/bignum.c' object='mbedtls/fldigi-bignum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-bignum.o `test -f 'mbedtls/bignum.c' || echo '$(srcdir)/'`mbedtls/bignum.c mbedtls/fldigi-bignum.obj: mbedtls/bignum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-bignum.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-bignum.Tpo -c -o mbedtls/fldigi-bignum.obj `if test -f 'mbedtls/bignum.c'; then $(CYGPATH_W) 'mbedtls/bignum.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/bignum.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-bignum.Tpo mbedtls/$(DEPDIR)/fldigi-bignum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/bignum.c' object='mbedtls/fldigi-bignum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-bignum.obj `if test -f 'mbedtls/bignum.c'; then $(CYGPATH_W) 'mbedtls/bignum.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/bignum.c'; fi` mbedtls/fldigi-blowfish.o: mbedtls/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-blowfish.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo -c -o mbedtls/fldigi-blowfish.o `test -f 'mbedtls/blowfish.c' || echo '$(srcdir)/'`mbedtls/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo mbedtls/$(DEPDIR)/fldigi-blowfish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/blowfish.c' object='mbedtls/fldigi-blowfish.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-blowfish.o `test -f 'mbedtls/blowfish.c' || echo '$(srcdir)/'`mbedtls/blowfish.c mbedtls/fldigi-blowfish.obj: mbedtls/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-blowfish.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo -c -o mbedtls/fldigi-blowfish.obj `if test -f 'mbedtls/blowfish.c'; then $(CYGPATH_W) 'mbedtls/blowfish.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/blowfish.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo mbedtls/$(DEPDIR)/fldigi-blowfish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/blowfish.c' object='mbedtls/fldigi-blowfish.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-blowfish.obj `if test -f 'mbedtls/blowfish.c'; then $(CYGPATH_W) 'mbedtls/blowfish.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/blowfish.c'; fi` mbedtls/fldigi-camellia.o: mbedtls/camellia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-camellia.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-camellia.Tpo -c -o mbedtls/fldigi-camellia.o `test -f 'mbedtls/camellia.c' || echo '$(srcdir)/'`mbedtls/camellia.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-camellia.Tpo mbedtls/$(DEPDIR)/fldigi-camellia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/camellia.c' object='mbedtls/fldigi-camellia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-camellia.o `test -f 'mbedtls/camellia.c' || echo '$(srcdir)/'`mbedtls/camellia.c mbedtls/fldigi-camellia.obj: mbedtls/camellia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-camellia.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-camellia.Tpo -c -o mbedtls/fldigi-camellia.obj `if test -f 'mbedtls/camellia.c'; then $(CYGPATH_W) 'mbedtls/camellia.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/camellia.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-camellia.Tpo mbedtls/$(DEPDIR)/fldigi-camellia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/camellia.c' object='mbedtls/fldigi-camellia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-camellia.obj `if test -f 'mbedtls/camellia.c'; then $(CYGPATH_W) 'mbedtls/camellia.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/camellia.c'; fi` mbedtls/fldigi-ccm.o: mbedtls/ccm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ccm.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ccm.Tpo -c -o mbedtls/fldigi-ccm.o `test -f 'mbedtls/ccm.c' || echo '$(srcdir)/'`mbedtls/ccm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ccm.Tpo mbedtls/$(DEPDIR)/fldigi-ccm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ccm.c' object='mbedtls/fldigi-ccm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ccm.o `test -f 'mbedtls/ccm.c' || echo '$(srcdir)/'`mbedtls/ccm.c mbedtls/fldigi-ccm.obj: mbedtls/ccm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ccm.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ccm.Tpo -c -o mbedtls/fldigi-ccm.obj `if test -f 'mbedtls/ccm.c'; then $(CYGPATH_W) 'mbedtls/ccm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ccm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ccm.Tpo mbedtls/$(DEPDIR)/fldigi-ccm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ccm.c' object='mbedtls/fldigi-ccm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ccm.obj `if test -f 'mbedtls/ccm.c'; then $(CYGPATH_W) 'mbedtls/ccm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ccm.c'; fi` mbedtls/fldigi-certs.o: mbedtls/certs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-certs.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-certs.Tpo -c -o mbedtls/fldigi-certs.o `test -f 'mbedtls/certs.c' || echo '$(srcdir)/'`mbedtls/certs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-certs.Tpo mbedtls/$(DEPDIR)/fldigi-certs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/certs.c' object='mbedtls/fldigi-certs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-certs.o `test -f 'mbedtls/certs.c' || echo '$(srcdir)/'`mbedtls/certs.c mbedtls/fldigi-certs.obj: mbedtls/certs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-certs.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-certs.Tpo -c -o mbedtls/fldigi-certs.obj `if test -f 'mbedtls/certs.c'; then $(CYGPATH_W) 'mbedtls/certs.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/certs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-certs.Tpo mbedtls/$(DEPDIR)/fldigi-certs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/certs.c' object='mbedtls/fldigi-certs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-certs.obj `if test -f 'mbedtls/certs.c'; then $(CYGPATH_W) 'mbedtls/certs.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/certs.c'; fi` mbedtls/fldigi-chacha20.o: mbedtls/chacha20.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chacha20.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo -c -o mbedtls/fldigi-chacha20.o `test -f 'mbedtls/chacha20.c' || echo '$(srcdir)/'`mbedtls/chacha20.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo mbedtls/$(DEPDIR)/fldigi-chacha20.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chacha20.c' object='mbedtls/fldigi-chacha20.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chacha20.o `test -f 'mbedtls/chacha20.c' || echo '$(srcdir)/'`mbedtls/chacha20.c mbedtls/fldigi-chacha20.obj: mbedtls/chacha20.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chacha20.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo -c -o mbedtls/fldigi-chacha20.obj `if test -f 'mbedtls/chacha20.c'; then $(CYGPATH_W) 'mbedtls/chacha20.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chacha20.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo mbedtls/$(DEPDIR)/fldigi-chacha20.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chacha20.c' object='mbedtls/fldigi-chacha20.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chacha20.obj `if test -f 'mbedtls/chacha20.c'; then $(CYGPATH_W) 'mbedtls/chacha20.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chacha20.c'; fi` mbedtls/fldigi-chachapoly.o: mbedtls/chachapoly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chachapoly.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo -c -o mbedtls/fldigi-chachapoly.o `test -f 'mbedtls/chachapoly.c' || echo '$(srcdir)/'`mbedtls/chachapoly.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo mbedtls/$(DEPDIR)/fldigi-chachapoly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chachapoly.c' object='mbedtls/fldigi-chachapoly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chachapoly.o `test -f 'mbedtls/chachapoly.c' || echo '$(srcdir)/'`mbedtls/chachapoly.c mbedtls/fldigi-chachapoly.obj: mbedtls/chachapoly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chachapoly.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo -c -o mbedtls/fldigi-chachapoly.obj `if test -f 'mbedtls/chachapoly.c'; then $(CYGPATH_W) 'mbedtls/chachapoly.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chachapoly.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo mbedtls/$(DEPDIR)/fldigi-chachapoly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chachapoly.c' object='mbedtls/fldigi-chachapoly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chachapoly.obj `if test -f 'mbedtls/chachapoly.c'; then $(CYGPATH_W) 'mbedtls/chachapoly.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chachapoly.c'; fi` mbedtls/fldigi-cipher.o: mbedtls/cipher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher.Tpo -c -o mbedtls/fldigi-cipher.o `test -f 'mbedtls/cipher.c' || echo '$(srcdir)/'`mbedtls/cipher.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher.Tpo mbedtls/$(DEPDIR)/fldigi-cipher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher.c' object='mbedtls/fldigi-cipher.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher.o `test -f 'mbedtls/cipher.c' || echo '$(srcdir)/'`mbedtls/cipher.c mbedtls/fldigi-cipher.obj: mbedtls/cipher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher.Tpo -c -o mbedtls/fldigi-cipher.obj `if test -f 'mbedtls/cipher.c'; then $(CYGPATH_W) 'mbedtls/cipher.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher.Tpo mbedtls/$(DEPDIR)/fldigi-cipher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher.c' object='mbedtls/fldigi-cipher.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher.obj `if test -f 'mbedtls/cipher.c'; then $(CYGPATH_W) 'mbedtls/cipher.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher.c'; fi` mbedtls/fldigi-cipher_wrap.o: mbedtls/cipher_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher_wrap.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo -c -o mbedtls/fldigi-cipher_wrap.o `test -f 'mbedtls/cipher_wrap.c' || echo '$(srcdir)/'`mbedtls/cipher_wrap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher_wrap.c' object='mbedtls/fldigi-cipher_wrap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher_wrap.o `test -f 'mbedtls/cipher_wrap.c' || echo '$(srcdir)/'`mbedtls/cipher_wrap.c mbedtls/fldigi-cipher_wrap.obj: mbedtls/cipher_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher_wrap.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo -c -o mbedtls/fldigi-cipher_wrap.obj `if test -f 'mbedtls/cipher_wrap.c'; then $(CYGPATH_W) 'mbedtls/cipher_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher_wrap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher_wrap.c' object='mbedtls/fldigi-cipher_wrap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher_wrap.obj `if test -f 'mbedtls/cipher_wrap.c'; then $(CYGPATH_W) 'mbedtls/cipher_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher_wrap.c'; fi` mbedtls/fldigi-cmac.o: mbedtls/cmac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cmac.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cmac.Tpo -c -o mbedtls/fldigi-cmac.o `test -f 'mbedtls/cmac.c' || echo '$(srcdir)/'`mbedtls/cmac.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cmac.Tpo mbedtls/$(DEPDIR)/fldigi-cmac.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cmac.c' object='mbedtls/fldigi-cmac.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cmac.o `test -f 'mbedtls/cmac.c' || echo '$(srcdir)/'`mbedtls/cmac.c mbedtls/fldigi-cmac.obj: mbedtls/cmac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cmac.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cmac.Tpo -c -o mbedtls/fldigi-cmac.obj `if test -f 'mbedtls/cmac.c'; then $(CYGPATH_W) 'mbedtls/cmac.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cmac.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cmac.Tpo mbedtls/$(DEPDIR)/fldigi-cmac.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cmac.c' object='mbedtls/fldigi-cmac.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cmac.obj `if test -f 'mbedtls/cmac.c'; then $(CYGPATH_W) 'mbedtls/cmac.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cmac.c'; fi` mbedtls/fldigi-ctr_drbg.o: mbedtls/ctr_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ctr_drbg.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo -c -o mbedtls/fldigi-ctr_drbg.o `test -f 'mbedtls/ctr_drbg.c' || echo '$(srcdir)/'`mbedtls/ctr_drbg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ctr_drbg.c' object='mbedtls/fldigi-ctr_drbg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ctr_drbg.o `test -f 'mbedtls/ctr_drbg.c' || echo '$(srcdir)/'`mbedtls/ctr_drbg.c mbedtls/fldigi-ctr_drbg.obj: mbedtls/ctr_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ctr_drbg.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo -c -o mbedtls/fldigi-ctr_drbg.obj `if test -f 'mbedtls/ctr_drbg.c'; then $(CYGPATH_W) 'mbedtls/ctr_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ctr_drbg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ctr_drbg.c' object='mbedtls/fldigi-ctr_drbg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ctr_drbg.obj `if test -f 'mbedtls/ctr_drbg.c'; then $(CYGPATH_W) 'mbedtls/ctr_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ctr_drbg.c'; fi` mbedtls/fldigi-debug.o: mbedtls/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-debug.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-debug.Tpo -c -o mbedtls/fldigi-debug.o `test -f 'mbedtls/debug.c' || echo '$(srcdir)/'`mbedtls/debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-debug.Tpo mbedtls/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/debug.c' object='mbedtls/fldigi-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-debug.o `test -f 'mbedtls/debug.c' || echo '$(srcdir)/'`mbedtls/debug.c mbedtls/fldigi-debug.obj: mbedtls/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-debug.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-debug.Tpo -c -o mbedtls/fldigi-debug.obj `if test -f 'mbedtls/debug.c'; then $(CYGPATH_W) 'mbedtls/debug.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/debug.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-debug.Tpo mbedtls/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/debug.c' object='mbedtls/fldigi-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-debug.obj `if test -f 'mbedtls/debug.c'; then $(CYGPATH_W) 'mbedtls/debug.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/debug.c'; fi` mbedtls/fldigi-des.o: mbedtls/des.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-des.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-des.Tpo -c -o mbedtls/fldigi-des.o `test -f 'mbedtls/des.c' || echo '$(srcdir)/'`mbedtls/des.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-des.Tpo mbedtls/$(DEPDIR)/fldigi-des.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/des.c' object='mbedtls/fldigi-des.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-des.o `test -f 'mbedtls/des.c' || echo '$(srcdir)/'`mbedtls/des.c mbedtls/fldigi-des.obj: mbedtls/des.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-des.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-des.Tpo -c -o mbedtls/fldigi-des.obj `if test -f 'mbedtls/des.c'; then $(CYGPATH_W) 'mbedtls/des.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/des.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-des.Tpo mbedtls/$(DEPDIR)/fldigi-des.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/des.c' object='mbedtls/fldigi-des.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-des.obj `if test -f 'mbedtls/des.c'; then $(CYGPATH_W) 'mbedtls/des.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/des.c'; fi` mbedtls/fldigi-dhm.o: mbedtls/dhm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-dhm.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-dhm.Tpo -c -o mbedtls/fldigi-dhm.o `test -f 'mbedtls/dhm.c' || echo '$(srcdir)/'`mbedtls/dhm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-dhm.Tpo mbedtls/$(DEPDIR)/fldigi-dhm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/dhm.c' object='mbedtls/fldigi-dhm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-dhm.o `test -f 'mbedtls/dhm.c' || echo '$(srcdir)/'`mbedtls/dhm.c mbedtls/fldigi-dhm.obj: mbedtls/dhm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-dhm.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-dhm.Tpo -c -o mbedtls/fldigi-dhm.obj `if test -f 'mbedtls/dhm.c'; then $(CYGPATH_W) 'mbedtls/dhm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/dhm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-dhm.Tpo mbedtls/$(DEPDIR)/fldigi-dhm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/dhm.c' object='mbedtls/fldigi-dhm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-dhm.obj `if test -f 'mbedtls/dhm.c'; then $(CYGPATH_W) 'mbedtls/dhm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/dhm.c'; fi` mbedtls/fldigi-ecdh.o: mbedtls/ecdh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdh.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo -c -o mbedtls/fldigi-ecdh.o `test -f 'mbedtls/ecdh.c' || echo '$(srcdir)/'`mbedtls/ecdh.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo mbedtls/$(DEPDIR)/fldigi-ecdh.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdh.c' object='mbedtls/fldigi-ecdh.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdh.o `test -f 'mbedtls/ecdh.c' || echo '$(srcdir)/'`mbedtls/ecdh.c mbedtls/fldigi-ecdh.obj: mbedtls/ecdh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdh.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo -c -o mbedtls/fldigi-ecdh.obj `if test -f 'mbedtls/ecdh.c'; then $(CYGPATH_W) 'mbedtls/ecdh.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdh.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo mbedtls/$(DEPDIR)/fldigi-ecdh.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdh.c' object='mbedtls/fldigi-ecdh.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdh.obj `if test -f 'mbedtls/ecdh.c'; then $(CYGPATH_W) 'mbedtls/ecdh.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdh.c'; fi` mbedtls/fldigi-ecdsa.o: mbedtls/ecdsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdsa.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo -c -o mbedtls/fldigi-ecdsa.o `test -f 'mbedtls/ecdsa.c' || echo '$(srcdir)/'`mbedtls/ecdsa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo mbedtls/$(DEPDIR)/fldigi-ecdsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdsa.c' object='mbedtls/fldigi-ecdsa.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdsa.o `test -f 'mbedtls/ecdsa.c' || echo '$(srcdir)/'`mbedtls/ecdsa.c mbedtls/fldigi-ecdsa.obj: mbedtls/ecdsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdsa.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo -c -o mbedtls/fldigi-ecdsa.obj `if test -f 'mbedtls/ecdsa.c'; then $(CYGPATH_W) 'mbedtls/ecdsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdsa.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo mbedtls/$(DEPDIR)/fldigi-ecdsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdsa.c' object='mbedtls/fldigi-ecdsa.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdsa.obj `if test -f 'mbedtls/ecdsa.c'; then $(CYGPATH_W) 'mbedtls/ecdsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdsa.c'; fi` mbedtls/fldigi-ecjpake.o: mbedtls/ecjpake.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecjpake.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo -c -o mbedtls/fldigi-ecjpake.o `test -f 'mbedtls/ecjpake.c' || echo '$(srcdir)/'`mbedtls/ecjpake.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo mbedtls/$(DEPDIR)/fldigi-ecjpake.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecjpake.c' object='mbedtls/fldigi-ecjpake.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecjpake.o `test -f 'mbedtls/ecjpake.c' || echo '$(srcdir)/'`mbedtls/ecjpake.c mbedtls/fldigi-ecjpake.obj: mbedtls/ecjpake.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecjpake.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo -c -o mbedtls/fldigi-ecjpake.obj `if test -f 'mbedtls/ecjpake.c'; then $(CYGPATH_W) 'mbedtls/ecjpake.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecjpake.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo mbedtls/$(DEPDIR)/fldigi-ecjpake.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecjpake.c' object='mbedtls/fldigi-ecjpake.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecjpake.obj `if test -f 'mbedtls/ecjpake.c'; then $(CYGPATH_W) 'mbedtls/ecjpake.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecjpake.c'; fi` mbedtls/fldigi-ecp.o: mbedtls/ecp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp.Tpo -c -o mbedtls/fldigi-ecp.o `test -f 'mbedtls/ecp.c' || echo '$(srcdir)/'`mbedtls/ecp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp.Tpo mbedtls/$(DEPDIR)/fldigi-ecp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp.c' object='mbedtls/fldigi-ecp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp.o `test -f 'mbedtls/ecp.c' || echo '$(srcdir)/'`mbedtls/ecp.c mbedtls/fldigi-ecp.obj: mbedtls/ecp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp.Tpo -c -o mbedtls/fldigi-ecp.obj `if test -f 'mbedtls/ecp.c'; then $(CYGPATH_W) 'mbedtls/ecp.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp.Tpo mbedtls/$(DEPDIR)/fldigi-ecp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp.c' object='mbedtls/fldigi-ecp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp.obj `if test -f 'mbedtls/ecp.c'; then $(CYGPATH_W) 'mbedtls/ecp.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp.c'; fi` mbedtls/fldigi-ecp_curves.o: mbedtls/ecp_curves.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp_curves.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo -c -o mbedtls/fldigi-ecp_curves.o `test -f 'mbedtls/ecp_curves.c' || echo '$(srcdir)/'`mbedtls/ecp_curves.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp_curves.c' object='mbedtls/fldigi-ecp_curves.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp_curves.o `test -f 'mbedtls/ecp_curves.c' || echo '$(srcdir)/'`mbedtls/ecp_curves.c mbedtls/fldigi-ecp_curves.obj: mbedtls/ecp_curves.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp_curves.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo -c -o mbedtls/fldigi-ecp_curves.obj `if test -f 'mbedtls/ecp_curves.c'; then $(CYGPATH_W) 'mbedtls/ecp_curves.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp_curves.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp_curves.c' object='mbedtls/fldigi-ecp_curves.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp_curves.obj `if test -f 'mbedtls/ecp_curves.c'; then $(CYGPATH_W) 'mbedtls/ecp_curves.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp_curves.c'; fi` mbedtls/fldigi-entropy.o: mbedtls/entropy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy.Tpo -c -o mbedtls/fldigi-entropy.o `test -f 'mbedtls/entropy.c' || echo '$(srcdir)/'`mbedtls/entropy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy.Tpo mbedtls/$(DEPDIR)/fldigi-entropy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy.c' object='mbedtls/fldigi-entropy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy.o `test -f 'mbedtls/entropy.c' || echo '$(srcdir)/'`mbedtls/entropy.c mbedtls/fldigi-entropy.obj: mbedtls/entropy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy.Tpo -c -o mbedtls/fldigi-entropy.obj `if test -f 'mbedtls/entropy.c'; then $(CYGPATH_W) 'mbedtls/entropy.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy.Tpo mbedtls/$(DEPDIR)/fldigi-entropy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy.c' object='mbedtls/fldigi-entropy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy.obj `if test -f 'mbedtls/entropy.c'; then $(CYGPATH_W) 'mbedtls/entropy.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy.c'; fi` mbedtls/fldigi-entropy_poll.o: mbedtls/entropy_poll.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy_poll.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo -c -o mbedtls/fldigi-entropy_poll.o `test -f 'mbedtls/entropy_poll.c' || echo '$(srcdir)/'`mbedtls/entropy_poll.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy_poll.c' object='mbedtls/fldigi-entropy_poll.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy_poll.o `test -f 'mbedtls/entropy_poll.c' || echo '$(srcdir)/'`mbedtls/entropy_poll.c mbedtls/fldigi-entropy_poll.obj: mbedtls/entropy_poll.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy_poll.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo -c -o mbedtls/fldigi-entropy_poll.obj `if test -f 'mbedtls/entropy_poll.c'; then $(CYGPATH_W) 'mbedtls/entropy_poll.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy_poll.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy_poll.c' object='mbedtls/fldigi-entropy_poll.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy_poll.obj `if test -f 'mbedtls/entropy_poll.c'; then $(CYGPATH_W) 'mbedtls/entropy_poll.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy_poll.c'; fi` mbedtls/fldigi-error.o: mbedtls/error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-error.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-error.Tpo -c -o mbedtls/fldigi-error.o `test -f 'mbedtls/error.c' || echo '$(srcdir)/'`mbedtls/error.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-error.Tpo mbedtls/$(DEPDIR)/fldigi-error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/error.c' object='mbedtls/fldigi-error.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-error.o `test -f 'mbedtls/error.c' || echo '$(srcdir)/'`mbedtls/error.c mbedtls/fldigi-error.obj: mbedtls/error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-error.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-error.Tpo -c -o mbedtls/fldigi-error.obj `if test -f 'mbedtls/error.c'; then $(CYGPATH_W) 'mbedtls/error.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/error.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-error.Tpo mbedtls/$(DEPDIR)/fldigi-error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/error.c' object='mbedtls/fldigi-error.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-error.obj `if test -f 'mbedtls/error.c'; then $(CYGPATH_W) 'mbedtls/error.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/error.c'; fi` mbedtls/fldigi-gcm.o: mbedtls/gcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-gcm.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-gcm.Tpo -c -o mbedtls/fldigi-gcm.o `test -f 'mbedtls/gcm.c' || echo '$(srcdir)/'`mbedtls/gcm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-gcm.Tpo mbedtls/$(DEPDIR)/fldigi-gcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/gcm.c' object='mbedtls/fldigi-gcm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-gcm.o `test -f 'mbedtls/gcm.c' || echo '$(srcdir)/'`mbedtls/gcm.c mbedtls/fldigi-gcm.obj: mbedtls/gcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-gcm.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-gcm.Tpo -c -o mbedtls/fldigi-gcm.obj `if test -f 'mbedtls/gcm.c'; then $(CYGPATH_W) 'mbedtls/gcm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/gcm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-gcm.Tpo mbedtls/$(DEPDIR)/fldigi-gcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/gcm.c' object='mbedtls/fldigi-gcm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-gcm.obj `if test -f 'mbedtls/gcm.c'; then $(CYGPATH_W) 'mbedtls/gcm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/gcm.c'; fi` mbedtls/fldigi-havege.o: mbedtls/havege.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-havege.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-havege.Tpo -c -o mbedtls/fldigi-havege.o `test -f 'mbedtls/havege.c' || echo '$(srcdir)/'`mbedtls/havege.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-havege.Tpo mbedtls/$(DEPDIR)/fldigi-havege.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/havege.c' object='mbedtls/fldigi-havege.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-havege.o `test -f 'mbedtls/havege.c' || echo '$(srcdir)/'`mbedtls/havege.c mbedtls/fldigi-havege.obj: mbedtls/havege.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-havege.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-havege.Tpo -c -o mbedtls/fldigi-havege.obj `if test -f 'mbedtls/havege.c'; then $(CYGPATH_W) 'mbedtls/havege.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/havege.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-havege.Tpo mbedtls/$(DEPDIR)/fldigi-havege.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/havege.c' object='mbedtls/fldigi-havege.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-havege.obj `if test -f 'mbedtls/havege.c'; then $(CYGPATH_W) 'mbedtls/havege.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/havege.c'; fi` mbedtls/fldigi-hkdf.o: mbedtls/hkdf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hkdf.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo -c -o mbedtls/fldigi-hkdf.o `test -f 'mbedtls/hkdf.c' || echo '$(srcdir)/'`mbedtls/hkdf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo mbedtls/$(DEPDIR)/fldigi-hkdf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hkdf.c' object='mbedtls/fldigi-hkdf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hkdf.o `test -f 'mbedtls/hkdf.c' || echo '$(srcdir)/'`mbedtls/hkdf.c mbedtls/fldigi-hkdf.obj: mbedtls/hkdf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hkdf.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo -c -o mbedtls/fldigi-hkdf.obj `if test -f 'mbedtls/hkdf.c'; then $(CYGPATH_W) 'mbedtls/hkdf.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hkdf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo mbedtls/$(DEPDIR)/fldigi-hkdf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hkdf.c' object='mbedtls/fldigi-hkdf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hkdf.obj `if test -f 'mbedtls/hkdf.c'; then $(CYGPATH_W) 'mbedtls/hkdf.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hkdf.c'; fi` mbedtls/fldigi-hmac_drbg.o: mbedtls/hmac_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hmac_drbg.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo -c -o mbedtls/fldigi-hmac_drbg.o `test -f 'mbedtls/hmac_drbg.c' || echo '$(srcdir)/'`mbedtls/hmac_drbg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hmac_drbg.c' object='mbedtls/fldigi-hmac_drbg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hmac_drbg.o `test -f 'mbedtls/hmac_drbg.c' || echo '$(srcdir)/'`mbedtls/hmac_drbg.c mbedtls/fldigi-hmac_drbg.obj: mbedtls/hmac_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hmac_drbg.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo -c -o mbedtls/fldigi-hmac_drbg.obj `if test -f 'mbedtls/hmac_drbg.c'; then $(CYGPATH_W) 'mbedtls/hmac_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hmac_drbg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hmac_drbg.c' object='mbedtls/fldigi-hmac_drbg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hmac_drbg.obj `if test -f 'mbedtls/hmac_drbg.c'; then $(CYGPATH_W) 'mbedtls/hmac_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hmac_drbg.c'; fi` mbedtls/fldigi-md2.o: mbedtls/md2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md2.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md2.Tpo -c -o mbedtls/fldigi-md2.o `test -f 'mbedtls/md2.c' || echo '$(srcdir)/'`mbedtls/md2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md2.Tpo mbedtls/$(DEPDIR)/fldigi-md2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md2.c' object='mbedtls/fldigi-md2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md2.o `test -f 'mbedtls/md2.c' || echo '$(srcdir)/'`mbedtls/md2.c mbedtls/fldigi-md2.obj: mbedtls/md2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md2.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md2.Tpo -c -o mbedtls/fldigi-md2.obj `if test -f 'mbedtls/md2.c'; then $(CYGPATH_W) 'mbedtls/md2.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md2.Tpo mbedtls/$(DEPDIR)/fldigi-md2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md2.c' object='mbedtls/fldigi-md2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md2.obj `if test -f 'mbedtls/md2.c'; then $(CYGPATH_W) 'mbedtls/md2.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md2.c'; fi` mbedtls/fldigi-md4.o: mbedtls/md4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md4.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md4.Tpo -c -o mbedtls/fldigi-md4.o `test -f 'mbedtls/md4.c' || echo '$(srcdir)/'`mbedtls/md4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md4.Tpo mbedtls/$(DEPDIR)/fldigi-md4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md4.c' object='mbedtls/fldigi-md4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md4.o `test -f 'mbedtls/md4.c' || echo '$(srcdir)/'`mbedtls/md4.c mbedtls/fldigi-md4.obj: mbedtls/md4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md4.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md4.Tpo -c -o mbedtls/fldigi-md4.obj `if test -f 'mbedtls/md4.c'; then $(CYGPATH_W) 'mbedtls/md4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md4.Tpo mbedtls/$(DEPDIR)/fldigi-md4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md4.c' object='mbedtls/fldigi-md4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md4.obj `if test -f 'mbedtls/md4.c'; then $(CYGPATH_W) 'mbedtls/md4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md4.c'; fi` mbedtls/fldigi-md5.o: mbedtls/md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md5.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md5.Tpo -c -o mbedtls/fldigi-md5.o `test -f 'mbedtls/md5.c' || echo '$(srcdir)/'`mbedtls/md5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md5.Tpo mbedtls/$(DEPDIR)/fldigi-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md5.c' object='mbedtls/fldigi-md5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md5.o `test -f 'mbedtls/md5.c' || echo '$(srcdir)/'`mbedtls/md5.c mbedtls/fldigi-md5.obj: mbedtls/md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md5.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md5.Tpo -c -o mbedtls/fldigi-md5.obj `if test -f 'mbedtls/md5.c'; then $(CYGPATH_W) 'mbedtls/md5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md5.Tpo mbedtls/$(DEPDIR)/fldigi-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md5.c' object='mbedtls/fldigi-md5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md5.obj `if test -f 'mbedtls/md5.c'; then $(CYGPATH_W) 'mbedtls/md5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md5.c'; fi` mbedtls/fldigi-md.o: mbedtls/md.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md.Tpo -c -o mbedtls/fldigi-md.o `test -f 'mbedtls/md.c' || echo '$(srcdir)/'`mbedtls/md.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md.Tpo mbedtls/$(DEPDIR)/fldigi-md.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md.c' object='mbedtls/fldigi-md.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md.o `test -f 'mbedtls/md.c' || echo '$(srcdir)/'`mbedtls/md.c mbedtls/fldigi-md.obj: mbedtls/md.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md.Tpo -c -o mbedtls/fldigi-md.obj `if test -f 'mbedtls/md.c'; then $(CYGPATH_W) 'mbedtls/md.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md.Tpo mbedtls/$(DEPDIR)/fldigi-md.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md.c' object='mbedtls/fldigi-md.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md.obj `if test -f 'mbedtls/md.c'; then $(CYGPATH_W) 'mbedtls/md.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md.c'; fi` mbedtls/fldigi-md_wrap.o: mbedtls/md_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md_wrap.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo -c -o mbedtls/fldigi-md_wrap.o `test -f 'mbedtls/md_wrap.c' || echo '$(srcdir)/'`mbedtls/md_wrap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-md_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md_wrap.c' object='mbedtls/fldigi-md_wrap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md_wrap.o `test -f 'mbedtls/md_wrap.c' || echo '$(srcdir)/'`mbedtls/md_wrap.c mbedtls/fldigi-md_wrap.obj: mbedtls/md_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md_wrap.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo -c -o mbedtls/fldigi-md_wrap.obj `if test -f 'mbedtls/md_wrap.c'; then $(CYGPATH_W) 'mbedtls/md_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md_wrap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-md_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md_wrap.c' object='mbedtls/fldigi-md_wrap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md_wrap.obj `if test -f 'mbedtls/md_wrap.c'; then $(CYGPATH_W) 'mbedtls/md_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md_wrap.c'; fi` mbedtls/fldigi-memory_buffer_alloc.o: mbedtls/memory_buffer_alloc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-memory_buffer_alloc.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo -c -o mbedtls/fldigi-memory_buffer_alloc.o `test -f 'mbedtls/memory_buffer_alloc.c' || echo '$(srcdir)/'`mbedtls/memory_buffer_alloc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/memory_buffer_alloc.c' object='mbedtls/fldigi-memory_buffer_alloc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-memory_buffer_alloc.o `test -f 'mbedtls/memory_buffer_alloc.c' || echo '$(srcdir)/'`mbedtls/memory_buffer_alloc.c mbedtls/fldigi-memory_buffer_alloc.obj: mbedtls/memory_buffer_alloc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-memory_buffer_alloc.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo -c -o mbedtls/fldigi-memory_buffer_alloc.obj `if test -f 'mbedtls/memory_buffer_alloc.c'; then $(CYGPATH_W) 'mbedtls/memory_buffer_alloc.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/memory_buffer_alloc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/memory_buffer_alloc.c' object='mbedtls/fldigi-memory_buffer_alloc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-memory_buffer_alloc.obj `if test -f 'mbedtls/memory_buffer_alloc.c'; then $(CYGPATH_W) 'mbedtls/memory_buffer_alloc.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/memory_buffer_alloc.c'; fi` mbedtls/fldigi-net_sockets.o: mbedtls/net_sockets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-net_sockets.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo -c -o mbedtls/fldigi-net_sockets.o `test -f 'mbedtls/net_sockets.c' || echo '$(srcdir)/'`mbedtls/net_sockets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo mbedtls/$(DEPDIR)/fldigi-net_sockets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/net_sockets.c' object='mbedtls/fldigi-net_sockets.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-net_sockets.o `test -f 'mbedtls/net_sockets.c' || echo '$(srcdir)/'`mbedtls/net_sockets.c mbedtls/fldigi-net_sockets.obj: mbedtls/net_sockets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-net_sockets.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo -c -o mbedtls/fldigi-net_sockets.obj `if test -f 'mbedtls/net_sockets.c'; then $(CYGPATH_W) 'mbedtls/net_sockets.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/net_sockets.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo mbedtls/$(DEPDIR)/fldigi-net_sockets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/net_sockets.c' object='mbedtls/fldigi-net_sockets.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-net_sockets.obj `if test -f 'mbedtls/net_sockets.c'; then $(CYGPATH_W) 'mbedtls/net_sockets.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/net_sockets.c'; fi` mbedtls/fldigi-nist_kw.o: mbedtls/nist_kw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-nist_kw.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo -c -o mbedtls/fldigi-nist_kw.o `test -f 'mbedtls/nist_kw.c' || echo '$(srcdir)/'`mbedtls/nist_kw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo mbedtls/$(DEPDIR)/fldigi-nist_kw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/nist_kw.c' object='mbedtls/fldigi-nist_kw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-nist_kw.o `test -f 'mbedtls/nist_kw.c' || echo '$(srcdir)/'`mbedtls/nist_kw.c mbedtls/fldigi-nist_kw.obj: mbedtls/nist_kw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-nist_kw.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo -c -o mbedtls/fldigi-nist_kw.obj `if test -f 'mbedtls/nist_kw.c'; then $(CYGPATH_W) 'mbedtls/nist_kw.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/nist_kw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo mbedtls/$(DEPDIR)/fldigi-nist_kw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/nist_kw.c' object='mbedtls/fldigi-nist_kw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-nist_kw.obj `if test -f 'mbedtls/nist_kw.c'; then $(CYGPATH_W) 'mbedtls/nist_kw.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/nist_kw.c'; fi` mbedtls/fldigi-oid.o: mbedtls/oid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-oid.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-oid.Tpo -c -o mbedtls/fldigi-oid.o `test -f 'mbedtls/oid.c' || echo '$(srcdir)/'`mbedtls/oid.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-oid.Tpo mbedtls/$(DEPDIR)/fldigi-oid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/oid.c' object='mbedtls/fldigi-oid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-oid.o `test -f 'mbedtls/oid.c' || echo '$(srcdir)/'`mbedtls/oid.c mbedtls/fldigi-oid.obj: mbedtls/oid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-oid.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-oid.Tpo -c -o mbedtls/fldigi-oid.obj `if test -f 'mbedtls/oid.c'; then $(CYGPATH_W) 'mbedtls/oid.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/oid.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-oid.Tpo mbedtls/$(DEPDIR)/fldigi-oid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/oid.c' object='mbedtls/fldigi-oid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-oid.obj `if test -f 'mbedtls/oid.c'; then $(CYGPATH_W) 'mbedtls/oid.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/oid.c'; fi` mbedtls/fldigi-padlock.o: mbedtls/padlock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-padlock.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-padlock.Tpo -c -o mbedtls/fldigi-padlock.o `test -f 'mbedtls/padlock.c' || echo '$(srcdir)/'`mbedtls/padlock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-padlock.Tpo mbedtls/$(DEPDIR)/fldigi-padlock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/padlock.c' object='mbedtls/fldigi-padlock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-padlock.o `test -f 'mbedtls/padlock.c' || echo '$(srcdir)/'`mbedtls/padlock.c mbedtls/fldigi-padlock.obj: mbedtls/padlock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-padlock.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-padlock.Tpo -c -o mbedtls/fldigi-padlock.obj `if test -f 'mbedtls/padlock.c'; then $(CYGPATH_W) 'mbedtls/padlock.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/padlock.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-padlock.Tpo mbedtls/$(DEPDIR)/fldigi-padlock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/padlock.c' object='mbedtls/fldigi-padlock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-padlock.obj `if test -f 'mbedtls/padlock.c'; then $(CYGPATH_W) 'mbedtls/padlock.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/padlock.c'; fi` mbedtls/fldigi-pem.o: mbedtls/pem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pem.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pem.Tpo -c -o mbedtls/fldigi-pem.o `test -f 'mbedtls/pem.c' || echo '$(srcdir)/'`mbedtls/pem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pem.Tpo mbedtls/$(DEPDIR)/fldigi-pem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pem.c' object='mbedtls/fldigi-pem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pem.o `test -f 'mbedtls/pem.c' || echo '$(srcdir)/'`mbedtls/pem.c mbedtls/fldigi-pem.obj: mbedtls/pem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pem.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pem.Tpo -c -o mbedtls/fldigi-pem.obj `if test -f 'mbedtls/pem.c'; then $(CYGPATH_W) 'mbedtls/pem.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pem.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pem.Tpo mbedtls/$(DEPDIR)/fldigi-pem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pem.c' object='mbedtls/fldigi-pem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pem.obj `if test -f 'mbedtls/pem.c'; then $(CYGPATH_W) 'mbedtls/pem.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pem.c'; fi` mbedtls/fldigi-pk.o: mbedtls/pk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk.Tpo -c -o mbedtls/fldigi-pk.o `test -f 'mbedtls/pk.c' || echo '$(srcdir)/'`mbedtls/pk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk.Tpo mbedtls/$(DEPDIR)/fldigi-pk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk.c' object='mbedtls/fldigi-pk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk.o `test -f 'mbedtls/pk.c' || echo '$(srcdir)/'`mbedtls/pk.c mbedtls/fldigi-pk.obj: mbedtls/pk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk.Tpo -c -o mbedtls/fldigi-pk.obj `if test -f 'mbedtls/pk.c'; then $(CYGPATH_W) 'mbedtls/pk.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk.Tpo mbedtls/$(DEPDIR)/fldigi-pk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk.c' object='mbedtls/fldigi-pk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk.obj `if test -f 'mbedtls/pk.c'; then $(CYGPATH_W) 'mbedtls/pk.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk.c'; fi` mbedtls/fldigi-pkcs11.o: mbedtls/pkcs11.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs11.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo -c -o mbedtls/fldigi-pkcs11.o `test -f 'mbedtls/pkcs11.c' || echo '$(srcdir)/'`mbedtls/pkcs11.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs11.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs11.c' object='mbedtls/fldigi-pkcs11.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs11.o `test -f 'mbedtls/pkcs11.c' || echo '$(srcdir)/'`mbedtls/pkcs11.c mbedtls/fldigi-pkcs11.obj: mbedtls/pkcs11.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs11.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo -c -o mbedtls/fldigi-pkcs11.obj `if test -f 'mbedtls/pkcs11.c'; then $(CYGPATH_W) 'mbedtls/pkcs11.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs11.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs11.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs11.c' object='mbedtls/fldigi-pkcs11.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs11.obj `if test -f 'mbedtls/pkcs11.c'; then $(CYGPATH_W) 'mbedtls/pkcs11.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs11.c'; fi` mbedtls/fldigi-pkcs12.o: mbedtls/pkcs12.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs12.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo -c -o mbedtls/fldigi-pkcs12.o `test -f 'mbedtls/pkcs12.c' || echo '$(srcdir)/'`mbedtls/pkcs12.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs12.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs12.c' object='mbedtls/fldigi-pkcs12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs12.o `test -f 'mbedtls/pkcs12.c' || echo '$(srcdir)/'`mbedtls/pkcs12.c mbedtls/fldigi-pkcs12.obj: mbedtls/pkcs12.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs12.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo -c -o mbedtls/fldigi-pkcs12.obj `if test -f 'mbedtls/pkcs12.c'; then $(CYGPATH_W) 'mbedtls/pkcs12.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs12.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs12.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs12.c' object='mbedtls/fldigi-pkcs12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs12.obj `if test -f 'mbedtls/pkcs12.c'; then $(CYGPATH_W) 'mbedtls/pkcs12.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs12.c'; fi` mbedtls/fldigi-pkcs5.o: mbedtls/pkcs5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs5.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo -c -o mbedtls/fldigi-pkcs5.o `test -f 'mbedtls/pkcs5.c' || echo '$(srcdir)/'`mbedtls/pkcs5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs5.c' object='mbedtls/fldigi-pkcs5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs5.o `test -f 'mbedtls/pkcs5.c' || echo '$(srcdir)/'`mbedtls/pkcs5.c mbedtls/fldigi-pkcs5.obj: mbedtls/pkcs5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs5.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo -c -o mbedtls/fldigi-pkcs5.obj `if test -f 'mbedtls/pkcs5.c'; then $(CYGPATH_W) 'mbedtls/pkcs5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs5.c' object='mbedtls/fldigi-pkcs5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs5.obj `if test -f 'mbedtls/pkcs5.c'; then $(CYGPATH_W) 'mbedtls/pkcs5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs5.c'; fi` mbedtls/fldigi-pkparse.o: mbedtls/pkparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkparse.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo -c -o mbedtls/fldigi-pkparse.o `test -f 'mbedtls/pkparse.c' || echo '$(srcdir)/'`mbedtls/pkparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo mbedtls/$(DEPDIR)/fldigi-pkparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkparse.c' object='mbedtls/fldigi-pkparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkparse.o `test -f 'mbedtls/pkparse.c' || echo '$(srcdir)/'`mbedtls/pkparse.c mbedtls/fldigi-pkparse.obj: mbedtls/pkparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkparse.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo -c -o mbedtls/fldigi-pkparse.obj `if test -f 'mbedtls/pkparse.c'; then $(CYGPATH_W) 'mbedtls/pkparse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo mbedtls/$(DEPDIR)/fldigi-pkparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkparse.c' object='mbedtls/fldigi-pkparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkparse.obj `if test -f 'mbedtls/pkparse.c'; then $(CYGPATH_W) 'mbedtls/pkparse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkparse.c'; fi` mbedtls/fldigi-pk_wrap.o: mbedtls/pk_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk_wrap.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo -c -o mbedtls/fldigi-pk_wrap.o `test -f 'mbedtls/pk_wrap.c' || echo '$(srcdir)/'`mbedtls/pk_wrap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk_wrap.c' object='mbedtls/fldigi-pk_wrap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk_wrap.o `test -f 'mbedtls/pk_wrap.c' || echo '$(srcdir)/'`mbedtls/pk_wrap.c mbedtls/fldigi-pk_wrap.obj: mbedtls/pk_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk_wrap.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo -c -o mbedtls/fldigi-pk_wrap.obj `if test -f 'mbedtls/pk_wrap.c'; then $(CYGPATH_W) 'mbedtls/pk_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk_wrap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk_wrap.c' object='mbedtls/fldigi-pk_wrap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk_wrap.obj `if test -f 'mbedtls/pk_wrap.c'; then $(CYGPATH_W) 'mbedtls/pk_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk_wrap.c'; fi` mbedtls/fldigi-pkwrite.o: mbedtls/pkwrite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkwrite.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo -c -o mbedtls/fldigi-pkwrite.o `test -f 'mbedtls/pkwrite.c' || echo '$(srcdir)/'`mbedtls/pkwrite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo mbedtls/$(DEPDIR)/fldigi-pkwrite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkwrite.c' object='mbedtls/fldigi-pkwrite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkwrite.o `test -f 'mbedtls/pkwrite.c' || echo '$(srcdir)/'`mbedtls/pkwrite.c mbedtls/fldigi-pkwrite.obj: mbedtls/pkwrite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkwrite.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo -c -o mbedtls/fldigi-pkwrite.obj `if test -f 'mbedtls/pkwrite.c'; then $(CYGPATH_W) 'mbedtls/pkwrite.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkwrite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo mbedtls/$(DEPDIR)/fldigi-pkwrite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkwrite.c' object='mbedtls/fldigi-pkwrite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkwrite.obj `if test -f 'mbedtls/pkwrite.c'; then $(CYGPATH_W) 'mbedtls/pkwrite.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkwrite.c'; fi` mbedtls/fldigi-platform.o: mbedtls/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform.Tpo -c -o mbedtls/fldigi-platform.o `test -f 'mbedtls/platform.c' || echo '$(srcdir)/'`mbedtls/platform.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform.Tpo mbedtls/$(DEPDIR)/fldigi-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform.c' object='mbedtls/fldigi-platform.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform.o `test -f 'mbedtls/platform.c' || echo '$(srcdir)/'`mbedtls/platform.c mbedtls/fldigi-platform.obj: mbedtls/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform.Tpo -c -o mbedtls/fldigi-platform.obj `if test -f 'mbedtls/platform.c'; then $(CYGPATH_W) 'mbedtls/platform.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform.Tpo mbedtls/$(DEPDIR)/fldigi-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform.c' object='mbedtls/fldigi-platform.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform.obj `if test -f 'mbedtls/platform.c'; then $(CYGPATH_W) 'mbedtls/platform.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform.c'; fi` mbedtls/fldigi-platform_util.o: mbedtls/platform_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform_util.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo -c -o mbedtls/fldigi-platform_util.o `test -f 'mbedtls/platform_util.c' || echo '$(srcdir)/'`mbedtls/platform_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo mbedtls/$(DEPDIR)/fldigi-platform_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform_util.c' object='mbedtls/fldigi-platform_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform_util.o `test -f 'mbedtls/platform_util.c' || echo '$(srcdir)/'`mbedtls/platform_util.c mbedtls/fldigi-platform_util.obj: mbedtls/platform_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform_util.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo -c -o mbedtls/fldigi-platform_util.obj `if test -f 'mbedtls/platform_util.c'; then $(CYGPATH_W) 'mbedtls/platform_util.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo mbedtls/$(DEPDIR)/fldigi-platform_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform_util.c' object='mbedtls/fldigi-platform_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform_util.obj `if test -f 'mbedtls/platform_util.c'; then $(CYGPATH_W) 'mbedtls/platform_util.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform_util.c'; fi` mbedtls/fldigi-poly1305.o: mbedtls/poly1305.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-poly1305.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo -c -o mbedtls/fldigi-poly1305.o `test -f 'mbedtls/poly1305.c' || echo '$(srcdir)/'`mbedtls/poly1305.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo mbedtls/$(DEPDIR)/fldigi-poly1305.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/poly1305.c' object='mbedtls/fldigi-poly1305.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-poly1305.o `test -f 'mbedtls/poly1305.c' || echo '$(srcdir)/'`mbedtls/poly1305.c mbedtls/fldigi-poly1305.obj: mbedtls/poly1305.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-poly1305.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo -c -o mbedtls/fldigi-poly1305.obj `if test -f 'mbedtls/poly1305.c'; then $(CYGPATH_W) 'mbedtls/poly1305.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/poly1305.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo mbedtls/$(DEPDIR)/fldigi-poly1305.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/poly1305.c' object='mbedtls/fldigi-poly1305.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-poly1305.obj `if test -f 'mbedtls/poly1305.c'; then $(CYGPATH_W) 'mbedtls/poly1305.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/poly1305.c'; fi` mbedtls/fldigi-ripemd160.o: mbedtls/ripemd160.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ripemd160.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo -c -o mbedtls/fldigi-ripemd160.o `test -f 'mbedtls/ripemd160.c' || echo '$(srcdir)/'`mbedtls/ripemd160.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo mbedtls/$(DEPDIR)/fldigi-ripemd160.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ripemd160.c' object='mbedtls/fldigi-ripemd160.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ripemd160.o `test -f 'mbedtls/ripemd160.c' || echo '$(srcdir)/'`mbedtls/ripemd160.c mbedtls/fldigi-ripemd160.obj: mbedtls/ripemd160.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ripemd160.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo -c -o mbedtls/fldigi-ripemd160.obj `if test -f 'mbedtls/ripemd160.c'; then $(CYGPATH_W) 'mbedtls/ripemd160.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ripemd160.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo mbedtls/$(DEPDIR)/fldigi-ripemd160.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ripemd160.c' object='mbedtls/fldigi-ripemd160.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ripemd160.obj `if test -f 'mbedtls/ripemd160.c'; then $(CYGPATH_W) 'mbedtls/ripemd160.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ripemd160.c'; fi` mbedtls/fldigi-rsa.o: mbedtls/rsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa.Tpo -c -o mbedtls/fldigi-rsa.o `test -f 'mbedtls/rsa.c' || echo '$(srcdir)/'`mbedtls/rsa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa.Tpo mbedtls/$(DEPDIR)/fldigi-rsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa.c' object='mbedtls/fldigi-rsa.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa.o `test -f 'mbedtls/rsa.c' || echo '$(srcdir)/'`mbedtls/rsa.c mbedtls/fldigi-rsa.obj: mbedtls/rsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa.Tpo -c -o mbedtls/fldigi-rsa.obj `if test -f 'mbedtls/rsa.c'; then $(CYGPATH_W) 'mbedtls/rsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa.Tpo mbedtls/$(DEPDIR)/fldigi-rsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa.c' object='mbedtls/fldigi-rsa.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa.obj `if test -f 'mbedtls/rsa.c'; then $(CYGPATH_W) 'mbedtls/rsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa.c'; fi` mbedtls/fldigi-rsa_internal.o: mbedtls/rsa_internal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa_internal.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo -c -o mbedtls/fldigi-rsa_internal.o `test -f 'mbedtls/rsa_internal.c' || echo '$(srcdir)/'`mbedtls/rsa_internal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa_internal.c' object='mbedtls/fldigi-rsa_internal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa_internal.o `test -f 'mbedtls/rsa_internal.c' || echo '$(srcdir)/'`mbedtls/rsa_internal.c mbedtls/fldigi-rsa_internal.obj: mbedtls/rsa_internal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa_internal.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo -c -o mbedtls/fldigi-rsa_internal.obj `if test -f 'mbedtls/rsa_internal.c'; then $(CYGPATH_W) 'mbedtls/rsa_internal.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa_internal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa_internal.c' object='mbedtls/fldigi-rsa_internal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa_internal.obj `if test -f 'mbedtls/rsa_internal.c'; then $(CYGPATH_W) 'mbedtls/rsa_internal.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa_internal.c'; fi` mbedtls/fldigi-sha1.o: mbedtls/sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha1.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha1.Tpo -c -o mbedtls/fldigi-sha1.o `test -f 'mbedtls/sha1.c' || echo '$(srcdir)/'`mbedtls/sha1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha1.Tpo mbedtls/$(DEPDIR)/fldigi-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha1.c' object='mbedtls/fldigi-sha1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha1.o `test -f 'mbedtls/sha1.c' || echo '$(srcdir)/'`mbedtls/sha1.c mbedtls/fldigi-sha1.obj: mbedtls/sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha1.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha1.Tpo -c -o mbedtls/fldigi-sha1.obj `if test -f 'mbedtls/sha1.c'; then $(CYGPATH_W) 'mbedtls/sha1.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha1.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha1.Tpo mbedtls/$(DEPDIR)/fldigi-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha1.c' object='mbedtls/fldigi-sha1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha1.obj `if test -f 'mbedtls/sha1.c'; then $(CYGPATH_W) 'mbedtls/sha1.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha1.c'; fi` mbedtls/fldigi-sha256.o: mbedtls/sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha256.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha256.Tpo -c -o mbedtls/fldigi-sha256.o `test -f 'mbedtls/sha256.c' || echo '$(srcdir)/'`mbedtls/sha256.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha256.Tpo mbedtls/$(DEPDIR)/fldigi-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha256.c' object='mbedtls/fldigi-sha256.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha256.o `test -f 'mbedtls/sha256.c' || echo '$(srcdir)/'`mbedtls/sha256.c mbedtls/fldigi-sha256.obj: mbedtls/sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha256.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha256.Tpo -c -o mbedtls/fldigi-sha256.obj `if test -f 'mbedtls/sha256.c'; then $(CYGPATH_W) 'mbedtls/sha256.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha256.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha256.Tpo mbedtls/$(DEPDIR)/fldigi-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha256.c' object='mbedtls/fldigi-sha256.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha256.obj `if test -f 'mbedtls/sha256.c'; then $(CYGPATH_W) 'mbedtls/sha256.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha256.c'; fi` mbedtls/fldigi-sha512.o: mbedtls/sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha512.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha512.Tpo -c -o mbedtls/fldigi-sha512.o `test -f 'mbedtls/sha512.c' || echo '$(srcdir)/'`mbedtls/sha512.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha512.Tpo mbedtls/$(DEPDIR)/fldigi-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha512.c' object='mbedtls/fldigi-sha512.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha512.o `test -f 'mbedtls/sha512.c' || echo '$(srcdir)/'`mbedtls/sha512.c mbedtls/fldigi-sha512.obj: mbedtls/sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha512.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha512.Tpo -c -o mbedtls/fldigi-sha512.obj `if test -f 'mbedtls/sha512.c'; then $(CYGPATH_W) 'mbedtls/sha512.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha512.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha512.Tpo mbedtls/$(DEPDIR)/fldigi-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha512.c' object='mbedtls/fldigi-sha512.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha512.obj `if test -f 'mbedtls/sha512.c'; then $(CYGPATH_W) 'mbedtls/sha512.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha512.c'; fi` mbedtls/fldigi-ssl_cache.o: mbedtls/ssl_cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cache.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo -c -o mbedtls/fldigi-ssl_cache.o `test -f 'mbedtls/ssl_cache.c' || echo '$(srcdir)/'`mbedtls/ssl_cache.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cache.c' object='mbedtls/fldigi-ssl_cache.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cache.o `test -f 'mbedtls/ssl_cache.c' || echo '$(srcdir)/'`mbedtls/ssl_cache.c mbedtls/fldigi-ssl_cache.obj: mbedtls/ssl_cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cache.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo -c -o mbedtls/fldigi-ssl_cache.obj `if test -f 'mbedtls/ssl_cache.c'; then $(CYGPATH_W) 'mbedtls/ssl_cache.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cache.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cache.c' object='mbedtls/fldigi-ssl_cache.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cache.obj `if test -f 'mbedtls/ssl_cache.c'; then $(CYGPATH_W) 'mbedtls/ssl_cache.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cache.c'; fi` mbedtls/fldigi-ssl_ciphersuites.o: mbedtls/ssl_ciphersuites.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ciphersuites.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo -c -o mbedtls/fldigi-ssl_ciphersuites.o `test -f 'mbedtls/ssl_ciphersuites.c' || echo '$(srcdir)/'`mbedtls/ssl_ciphersuites.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ciphersuites.c' object='mbedtls/fldigi-ssl_ciphersuites.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ciphersuites.o `test -f 'mbedtls/ssl_ciphersuites.c' || echo '$(srcdir)/'`mbedtls/ssl_ciphersuites.c mbedtls/fldigi-ssl_ciphersuites.obj: mbedtls/ssl_ciphersuites.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ciphersuites.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo -c -o mbedtls/fldigi-ssl_ciphersuites.obj `if test -f 'mbedtls/ssl_ciphersuites.c'; then $(CYGPATH_W) 'mbedtls/ssl_ciphersuites.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ciphersuites.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ciphersuites.c' object='mbedtls/fldigi-ssl_ciphersuites.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ciphersuites.obj `if test -f 'mbedtls/ssl_ciphersuites.c'; then $(CYGPATH_W) 'mbedtls/ssl_ciphersuites.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ciphersuites.c'; fi` mbedtls/fldigi-ssl_cli.o: mbedtls/ssl_cli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cli.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo -c -o mbedtls/fldigi-ssl_cli.o `test -f 'mbedtls/ssl_cli.c' || echo '$(srcdir)/'`mbedtls/ssl_cli.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cli.c' object='mbedtls/fldigi-ssl_cli.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cli.o `test -f 'mbedtls/ssl_cli.c' || echo '$(srcdir)/'`mbedtls/ssl_cli.c mbedtls/fldigi-ssl_cli.obj: mbedtls/ssl_cli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cli.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo -c -o mbedtls/fldigi-ssl_cli.obj `if test -f 'mbedtls/ssl_cli.c'; then $(CYGPATH_W) 'mbedtls/ssl_cli.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cli.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cli.c' object='mbedtls/fldigi-ssl_cli.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cli.obj `if test -f 'mbedtls/ssl_cli.c'; then $(CYGPATH_W) 'mbedtls/ssl_cli.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cli.c'; fi` mbedtls/fldigi-ssl_cookie.o: mbedtls/ssl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cookie.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo -c -o mbedtls/fldigi-ssl_cookie.o `test -f 'mbedtls/ssl_cookie.c' || echo '$(srcdir)/'`mbedtls/ssl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cookie.c' object='mbedtls/fldigi-ssl_cookie.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cookie.o `test -f 'mbedtls/ssl_cookie.c' || echo '$(srcdir)/'`mbedtls/ssl_cookie.c mbedtls/fldigi-ssl_cookie.obj: mbedtls/ssl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cookie.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo -c -o mbedtls/fldigi-ssl_cookie.obj `if test -f 'mbedtls/ssl_cookie.c'; then $(CYGPATH_W) 'mbedtls/ssl_cookie.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cookie.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cookie.c' object='mbedtls/fldigi-ssl_cookie.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cookie.obj `if test -f 'mbedtls/ssl_cookie.c'; then $(CYGPATH_W) 'mbedtls/ssl_cookie.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cookie.c'; fi` mbedtls/fldigi-ssl_srv.o: mbedtls/ssl_srv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_srv.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo -c -o mbedtls/fldigi-ssl_srv.o `test -f 'mbedtls/ssl_srv.c' || echo '$(srcdir)/'`mbedtls/ssl_srv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_srv.c' object='mbedtls/fldigi-ssl_srv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_srv.o `test -f 'mbedtls/ssl_srv.c' || echo '$(srcdir)/'`mbedtls/ssl_srv.c mbedtls/fldigi-ssl_srv.obj: mbedtls/ssl_srv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_srv.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo -c -o mbedtls/fldigi-ssl_srv.obj `if test -f 'mbedtls/ssl_srv.c'; then $(CYGPATH_W) 'mbedtls/ssl_srv.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_srv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_srv.c' object='mbedtls/fldigi-ssl_srv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_srv.obj `if test -f 'mbedtls/ssl_srv.c'; then $(CYGPATH_W) 'mbedtls/ssl_srv.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_srv.c'; fi` mbedtls/fldigi-ssl_ticket.o: mbedtls/ssl_ticket.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ticket.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo -c -o mbedtls/fldigi-ssl_ticket.o `test -f 'mbedtls/ssl_ticket.c' || echo '$(srcdir)/'`mbedtls/ssl_ticket.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ticket.c' object='mbedtls/fldigi-ssl_ticket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ticket.o `test -f 'mbedtls/ssl_ticket.c' || echo '$(srcdir)/'`mbedtls/ssl_ticket.c mbedtls/fldigi-ssl_ticket.obj: mbedtls/ssl_ticket.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ticket.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo -c -o mbedtls/fldigi-ssl_ticket.obj `if test -f 'mbedtls/ssl_ticket.c'; then $(CYGPATH_W) 'mbedtls/ssl_ticket.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ticket.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ticket.c' object='mbedtls/fldigi-ssl_ticket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ticket.obj `if test -f 'mbedtls/ssl_ticket.c'; then $(CYGPATH_W) 'mbedtls/ssl_ticket.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ticket.c'; fi` mbedtls/fldigi-ssl_tls.o: mbedtls/ssl_tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_tls.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo -c -o mbedtls/fldigi-ssl_tls.o `test -f 'mbedtls/ssl_tls.c' || echo '$(srcdir)/'`mbedtls/ssl_tls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_tls.c' object='mbedtls/fldigi-ssl_tls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_tls.o `test -f 'mbedtls/ssl_tls.c' || echo '$(srcdir)/'`mbedtls/ssl_tls.c mbedtls/fldigi-ssl_tls.obj: mbedtls/ssl_tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_tls.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo -c -o mbedtls/fldigi-ssl_tls.obj `if test -f 'mbedtls/ssl_tls.c'; then $(CYGPATH_W) 'mbedtls/ssl_tls.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_tls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_tls.c' object='mbedtls/fldigi-ssl_tls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_tls.obj `if test -f 'mbedtls/ssl_tls.c'; then $(CYGPATH_W) 'mbedtls/ssl_tls.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_tls.c'; fi` mbedtls/fldigi-threading.o: mbedtls/threading.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-threading.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-threading.Tpo -c -o mbedtls/fldigi-threading.o `test -f 'mbedtls/threading.c' || echo '$(srcdir)/'`mbedtls/threading.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-threading.Tpo mbedtls/$(DEPDIR)/fldigi-threading.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/threading.c' object='mbedtls/fldigi-threading.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-threading.o `test -f 'mbedtls/threading.c' || echo '$(srcdir)/'`mbedtls/threading.c mbedtls/fldigi-threading.obj: mbedtls/threading.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-threading.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-threading.Tpo -c -o mbedtls/fldigi-threading.obj `if test -f 'mbedtls/threading.c'; then $(CYGPATH_W) 'mbedtls/threading.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/threading.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-threading.Tpo mbedtls/$(DEPDIR)/fldigi-threading.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/threading.c' object='mbedtls/fldigi-threading.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-threading.obj `if test -f 'mbedtls/threading.c'; then $(CYGPATH_W) 'mbedtls/threading.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/threading.c'; fi` mbedtls/fldigi-timing.o: mbedtls/timing.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-timing.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-timing.Tpo -c -o mbedtls/fldigi-timing.o `test -f 'mbedtls/timing.c' || echo '$(srcdir)/'`mbedtls/timing.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-timing.Tpo mbedtls/$(DEPDIR)/fldigi-timing.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/timing.c' object='mbedtls/fldigi-timing.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-timing.o `test -f 'mbedtls/timing.c' || echo '$(srcdir)/'`mbedtls/timing.c mbedtls/fldigi-timing.obj: mbedtls/timing.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-timing.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-timing.Tpo -c -o mbedtls/fldigi-timing.obj `if test -f 'mbedtls/timing.c'; then $(CYGPATH_W) 'mbedtls/timing.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/timing.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-timing.Tpo mbedtls/$(DEPDIR)/fldigi-timing.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/timing.c' object='mbedtls/fldigi-timing.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-timing.obj `if test -f 'mbedtls/timing.c'; then $(CYGPATH_W) 'mbedtls/timing.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/timing.c'; fi` mbedtls/fldigi-version.o: mbedtls/version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version.Tpo -c -o mbedtls/fldigi-version.o `test -f 'mbedtls/version.c' || echo '$(srcdir)/'`mbedtls/version.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version.Tpo mbedtls/$(DEPDIR)/fldigi-version.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version.c' object='mbedtls/fldigi-version.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version.o `test -f 'mbedtls/version.c' || echo '$(srcdir)/'`mbedtls/version.c mbedtls/fldigi-version.obj: mbedtls/version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version.Tpo -c -o mbedtls/fldigi-version.obj `if test -f 'mbedtls/version.c'; then $(CYGPATH_W) 'mbedtls/version.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version.Tpo mbedtls/$(DEPDIR)/fldigi-version.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version.c' object='mbedtls/fldigi-version.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version.obj `if test -f 'mbedtls/version.c'; then $(CYGPATH_W) 'mbedtls/version.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version.c'; fi` mbedtls/fldigi-version_features.o: mbedtls/version_features.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version_features.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version_features.Tpo -c -o mbedtls/fldigi-version_features.o `test -f 'mbedtls/version_features.c' || echo '$(srcdir)/'`mbedtls/version_features.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version_features.Tpo mbedtls/$(DEPDIR)/fldigi-version_features.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version_features.c' object='mbedtls/fldigi-version_features.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version_features.o `test -f 'mbedtls/version_features.c' || echo '$(srcdir)/'`mbedtls/version_features.c mbedtls/fldigi-version_features.obj: mbedtls/version_features.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version_features.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version_features.Tpo -c -o mbedtls/fldigi-version_features.obj `if test -f 'mbedtls/version_features.c'; then $(CYGPATH_W) 'mbedtls/version_features.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version_features.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version_features.Tpo mbedtls/$(DEPDIR)/fldigi-version_features.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version_features.c' object='mbedtls/fldigi-version_features.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version_features.obj `if test -f 'mbedtls/version_features.c'; then $(CYGPATH_W) 'mbedtls/version_features.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version_features.c'; fi` mbedtls/fldigi-x509.o: mbedtls/x509.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509.Tpo -c -o mbedtls/fldigi-x509.o `test -f 'mbedtls/x509.c' || echo '$(srcdir)/'`mbedtls/x509.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509.Tpo mbedtls/$(DEPDIR)/fldigi-x509.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509.c' object='mbedtls/fldigi-x509.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509.o `test -f 'mbedtls/x509.c' || echo '$(srcdir)/'`mbedtls/x509.c mbedtls/fldigi-x509.obj: mbedtls/x509.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509.Tpo -c -o mbedtls/fldigi-x509.obj `if test -f 'mbedtls/x509.c'; then $(CYGPATH_W) 'mbedtls/x509.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509.Tpo mbedtls/$(DEPDIR)/fldigi-x509.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509.c' object='mbedtls/fldigi-x509.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509.obj `if test -f 'mbedtls/x509.c'; then $(CYGPATH_W) 'mbedtls/x509.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509.c'; fi` mbedtls/fldigi-x509_create.o: mbedtls/x509_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_create.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo -c -o mbedtls/fldigi-x509_create.o `test -f 'mbedtls/x509_create.c' || echo '$(srcdir)/'`mbedtls/x509_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo mbedtls/$(DEPDIR)/fldigi-x509_create.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_create.c' object='mbedtls/fldigi-x509_create.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_create.o `test -f 'mbedtls/x509_create.c' || echo '$(srcdir)/'`mbedtls/x509_create.c mbedtls/fldigi-x509_create.obj: mbedtls/x509_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_create.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo -c -o mbedtls/fldigi-x509_create.obj `if test -f 'mbedtls/x509_create.c'; then $(CYGPATH_W) 'mbedtls/x509_create.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_create.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo mbedtls/$(DEPDIR)/fldigi-x509_create.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_create.c' object='mbedtls/fldigi-x509_create.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_create.obj `if test -f 'mbedtls/x509_create.c'; then $(CYGPATH_W) 'mbedtls/x509_create.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_create.c'; fi` mbedtls/fldigi-x509_crl.o: mbedtls/x509_crl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crl.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo -c -o mbedtls/fldigi-x509_crl.o `test -f 'mbedtls/x509_crl.c' || echo '$(srcdir)/'`mbedtls/x509_crl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crl.c' object='mbedtls/fldigi-x509_crl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crl.o `test -f 'mbedtls/x509_crl.c' || echo '$(srcdir)/'`mbedtls/x509_crl.c mbedtls/fldigi-x509_crl.obj: mbedtls/x509_crl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crl.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo -c -o mbedtls/fldigi-x509_crl.obj `if test -f 'mbedtls/x509_crl.c'; then $(CYGPATH_W) 'mbedtls/x509_crl.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crl.c' object='mbedtls/fldigi-x509_crl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crl.obj `if test -f 'mbedtls/x509_crl.c'; then $(CYGPATH_W) 'mbedtls/x509_crl.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crl.c'; fi` mbedtls/fldigi-x509_crt.o: mbedtls/x509_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crt.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo -c -o mbedtls/fldigi-x509_crt.o `test -f 'mbedtls/x509_crt.c' || echo '$(srcdir)/'`mbedtls/x509_crt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crt.c' object='mbedtls/fldigi-x509_crt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crt.o `test -f 'mbedtls/x509_crt.c' || echo '$(srcdir)/'`mbedtls/x509_crt.c mbedtls/fldigi-x509_crt.obj: mbedtls/x509_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crt.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo -c -o mbedtls/fldigi-x509_crt.obj `if test -f 'mbedtls/x509_crt.c'; then $(CYGPATH_W) 'mbedtls/x509_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crt.c' object='mbedtls/fldigi-x509_crt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crt.obj `if test -f 'mbedtls/x509_crt.c'; then $(CYGPATH_W) 'mbedtls/x509_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crt.c'; fi` mbedtls/fldigi-x509_csr.o: mbedtls/x509_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_csr.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo -c -o mbedtls/fldigi-x509_csr.o `test -f 'mbedtls/x509_csr.c' || echo '$(srcdir)/'`mbedtls/x509_csr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_csr.c' object='mbedtls/fldigi-x509_csr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_csr.o `test -f 'mbedtls/x509_csr.c' || echo '$(srcdir)/'`mbedtls/x509_csr.c mbedtls/fldigi-x509_csr.obj: mbedtls/x509_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_csr.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo -c -o mbedtls/fldigi-x509_csr.obj `if test -f 'mbedtls/x509_csr.c'; then $(CYGPATH_W) 'mbedtls/x509_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_csr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_csr.c' object='mbedtls/fldigi-x509_csr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_csr.obj `if test -f 'mbedtls/x509_csr.c'; then $(CYGPATH_W) 'mbedtls/x509_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_csr.c'; fi` mbedtls/fldigi-x509write_crt.o: mbedtls/x509write_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_crt.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo -c -o mbedtls/fldigi-x509write_crt.o `test -f 'mbedtls/x509write_crt.c' || echo '$(srcdir)/'`mbedtls/x509write_crt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_crt.c' object='mbedtls/fldigi-x509write_crt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_crt.o `test -f 'mbedtls/x509write_crt.c' || echo '$(srcdir)/'`mbedtls/x509write_crt.c mbedtls/fldigi-x509write_crt.obj: mbedtls/x509write_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_crt.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo -c -o mbedtls/fldigi-x509write_crt.obj `if test -f 'mbedtls/x509write_crt.c'; then $(CYGPATH_W) 'mbedtls/x509write_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_crt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_crt.c' object='mbedtls/fldigi-x509write_crt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_crt.obj `if test -f 'mbedtls/x509write_crt.c'; then $(CYGPATH_W) 'mbedtls/x509write_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_crt.c'; fi` mbedtls/fldigi-x509write_csr.o: mbedtls/x509write_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_csr.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo -c -o mbedtls/fldigi-x509write_csr.o `test -f 'mbedtls/x509write_csr.c' || echo '$(srcdir)/'`mbedtls/x509write_csr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_csr.c' object='mbedtls/fldigi-x509write_csr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_csr.o `test -f 'mbedtls/x509write_csr.c' || echo '$(srcdir)/'`mbedtls/x509write_csr.c mbedtls/fldigi-x509write_csr.obj: mbedtls/x509write_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_csr.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo -c -o mbedtls/fldigi-x509write_csr.obj `if test -f 'mbedtls/x509write_csr.c'; then $(CYGPATH_W) 'mbedtls/x509write_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_csr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_csr.c' object='mbedtls/fldigi-x509write_csr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_csr.obj `if test -f 'mbedtls/x509write_csr.c'; then $(CYGPATH_W) 'mbedtls/x509write_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_csr.c'; fi` mbedtls/fldigi-xtea.o: mbedtls/xtea.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-xtea.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-xtea.Tpo -c -o mbedtls/fldigi-xtea.o `test -f 'mbedtls/xtea.c' || echo '$(srcdir)/'`mbedtls/xtea.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-xtea.Tpo mbedtls/$(DEPDIR)/fldigi-xtea.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/xtea.c' object='mbedtls/fldigi-xtea.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-xtea.o `test -f 'mbedtls/xtea.c' || echo '$(srcdir)/'`mbedtls/xtea.c mbedtls/fldigi-xtea.obj: mbedtls/xtea.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-xtea.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-xtea.Tpo -c -o mbedtls/fldigi-xtea.obj `if test -f 'mbedtls/xtea.c'; then $(CYGPATH_W) 'mbedtls/xtea.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/xtea.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-xtea.Tpo mbedtls/$(DEPDIR)/fldigi-xtea.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/xtea.c' object='mbedtls/fldigi-xtea.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-xtea.obj `if test -f 'mbedtls/xtea.c'; then $(CYGPATH_W) 'mbedtls/xtea.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/xtea.c'; fi` compat/fldigi-regex.o: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-regex.o -MD -MP -MF compat/$(DEPDIR)/fldigi-regex.Tpo -c -o compat/fldigi-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-regex.Tpo compat/$(DEPDIR)/fldigi-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/fldigi-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c compat/fldigi-regex.obj: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-regex.obj -MD -MP -MF compat/$(DEPDIR)/fldigi-regex.Tpo -c -o compat/fldigi-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-regex.Tpo compat/$(DEPDIR)/fldigi-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/fldigi-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` compat/fldigi-getsysinfo.o: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-getsysinfo.o -MD -MP -MF compat/$(DEPDIR)/fldigi-getsysinfo.Tpo -c -o compat/fldigi-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-getsysinfo.Tpo compat/$(DEPDIR)/fldigi-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/fldigi-getsysinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c compat/fldigi-getsysinfo.obj: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-getsysinfo.obj -MD -MP -MF compat/$(DEPDIR)/fldigi-getsysinfo.Tpo -c -o compat/fldigi-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-getsysinfo.Tpo compat/$(DEPDIR)/fldigi-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/fldigi-getsysinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` compat/fldigi-mingw.o: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-mingw.o -MD -MP -MF compat/$(DEPDIR)/fldigi-mingw.Tpo -c -o compat/fldigi-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-mingw.Tpo compat/$(DEPDIR)/fldigi-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/fldigi-mingw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c compat/fldigi-mingw.obj: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-mingw.obj -MD -MP -MF compat/$(DEPDIR)/fldigi-mingw.Tpo -c -o compat/fldigi-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-mingw.Tpo compat/$(DEPDIR)/fldigi-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/fldigi-mingw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` libtiniconv/fldigi-tiniconv.o: libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv.o -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo -c -o libtiniconv/fldigi-tiniconv.o `test -f 'libtiniconv/tiniconv.c' || echo '$(srcdir)/'`libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv.c' object='libtiniconv/fldigi-tiniconv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv.o `test -f 'libtiniconv/tiniconv.c' || echo '$(srcdir)/'`libtiniconv/tiniconv.c libtiniconv/fldigi-tiniconv.obj: libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv.obj -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo -c -o libtiniconv/fldigi-tiniconv.obj `if test -f 'libtiniconv/tiniconv.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv.c' object='libtiniconv/fldigi-tiniconv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv.obj `if test -f 'libtiniconv/tiniconv.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv.c'; fi` libtiniconv/fldigi-tiniconv_desc.o: libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv_desc.o -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo -c -o libtiniconv/fldigi-tiniconv_desc.o `test -f 'libtiniconv/tiniconv_desc.c' || echo '$(srcdir)/'`libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv_desc.c' object='libtiniconv/fldigi-tiniconv_desc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv_desc.o `test -f 'libtiniconv/tiniconv_desc.c' || echo '$(srcdir)/'`libtiniconv/tiniconv_desc.c libtiniconv/fldigi-tiniconv_desc.obj: libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv_desc.obj -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo -c -o libtiniconv/fldigi-tiniconv_desc.obj `if test -f 'libtiniconv/tiniconv_desc.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv_desc.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv_desc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv_desc.c' object='libtiniconv/fldigi-tiniconv_desc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv_desc.obj `if test -f 'libtiniconv/tiniconv_desc.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv_desc.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv_desc.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` xmlrpcpp/flarq-XmlRpcClient.o: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcClient.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo -c -o xmlrpcpp/flarq-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/flarq-XmlRpcClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/flarq-XmlRpcClient.obj: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcClient.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo -c -o xmlrpcpp/flarq-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/flarq-XmlRpcClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` xmlrpcpp/flarq-XmlRpcDispatch.o: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcDispatch.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo -c -o xmlrpcpp/flarq-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/flarq-XmlRpcDispatch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/flarq-XmlRpcDispatch.obj: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcDispatch.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo -c -o xmlrpcpp/flarq-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/flarq-XmlRpcDispatch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` xmlrpcpp/flarq-XmlRpcMutex.o: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcMutex.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo -c -o xmlrpcpp/flarq-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/flarq-XmlRpcMutex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp xmlrpcpp/flarq-XmlRpcMutex.obj: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcMutex.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo -c -o xmlrpcpp/flarq-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/flarq-XmlRpcMutex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` xmlrpcpp/flarq-XmlRpcServerConnection.o: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerConnection.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/flarq-XmlRpcServerConnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp xmlrpcpp/flarq-XmlRpcServerConnection.obj: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerConnection.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/flarq-XmlRpcServerConnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` xmlrpcpp/flarq-XmlRpcServer.o: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServer.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo -c -o xmlrpcpp/flarq-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/flarq-XmlRpcServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp xmlrpcpp/flarq-XmlRpcServer.obj: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServer.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo -c -o xmlrpcpp/flarq-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/flarq-XmlRpcServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` xmlrpcpp/flarq-XmlRpcServerMethod.o: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerMethod.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/flarq-XmlRpcServerMethod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp xmlrpcpp/flarq-XmlRpcServerMethod.obj: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerMethod.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/flarq-XmlRpcServerMethod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` xmlrpcpp/flarq-XmlRpcSocket.o: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSocket.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo -c -o xmlrpcpp/flarq-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/flarq-XmlRpcSocket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp xmlrpcpp/flarq-XmlRpcSocket.obj: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSocket.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo -c -o xmlrpcpp/flarq-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/flarq-XmlRpcSocket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` xmlrpcpp/flarq-XmlRpcSource.o: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSource.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo -c -o xmlrpcpp/flarq-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/flarq-XmlRpcSource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp xmlrpcpp/flarq-XmlRpcSource.obj: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSource.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo -c -o xmlrpcpp/flarq-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/flarq-XmlRpcSource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` xmlrpcpp/flarq-XmlRpcUtil.o: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcUtil.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo -c -o xmlrpcpp/flarq-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/flarq-XmlRpcUtil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp xmlrpcpp/flarq-XmlRpcUtil.obj: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcUtil.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo -c -o xmlrpcpp/flarq-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/flarq-XmlRpcUtil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` xmlrpcpp/flarq-XmlRpcValue.o: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcValue.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo -c -o xmlrpcpp/flarq-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/flarq-XmlRpcValue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp xmlrpcpp/flarq-XmlRpcValue.obj: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcValue.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo -c -o xmlrpcpp/flarq-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/flarq-XmlRpcValue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` misc/flarq-stack.o: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stack.o -MD -MP -MF misc/$(DEPDIR)/flarq-stack.Tpo -c -o misc/flarq-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stack.Tpo misc/$(DEPDIR)/flarq-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/flarq-stack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx misc/flarq-stack.obj: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stack.obj -MD -MP -MF misc/$(DEPDIR)/flarq-stack.Tpo -c -o misc/flarq-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stack.Tpo misc/$(DEPDIR)/flarq-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/flarq-stack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` misc/flarq-nls.o: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-nls.o -MD -MP -MF misc/$(DEPDIR)/flarq-nls.Tpo -c -o misc/flarq-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-nls.Tpo misc/$(DEPDIR)/flarq-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/flarq-nls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx misc/flarq-nls.obj: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-nls.obj -MD -MP -MF misc/$(DEPDIR)/flarq-nls.Tpo -c -o misc/flarq-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-nls.Tpo misc/$(DEPDIR)/flarq-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/flarq-nls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` dialogs/flarq-font_browser.o: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT dialogs/flarq-font_browser.o -MD -MP -MF dialogs/$(DEPDIR)/flarq-font_browser.Tpo -c -o dialogs/flarq-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/flarq-font_browser.Tpo dialogs/$(DEPDIR)/flarq-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/flarq-font_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/flarq-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx dialogs/flarq-font_browser.obj: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT dialogs/flarq-font_browser.obj -MD -MP -MF dialogs/$(DEPDIR)/flarq-font_browser.Tpo -c -o dialogs/flarq-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/flarq-font_browser.Tpo dialogs/$(DEPDIR)/flarq-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/flarq-font_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/flarq-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` flarq-src/flarq-arq.o: flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arq.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arq.Tpo -c -o flarq-src/flarq-arq.o `test -f 'flarq-src/arq.cxx' || echo '$(srcdir)/'`flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arq.Tpo flarq-src/$(DEPDIR)/flarq-arq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arq.cxx' object='flarq-src/flarq-arq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arq.o `test -f 'flarq-src/arq.cxx' || echo '$(srcdir)/'`flarq-src/arq.cxx flarq-src/flarq-arq.obj: flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arq.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arq.Tpo -c -o flarq-src/flarq-arq.obj `if test -f 'flarq-src/arq.cxx'; then $(CYGPATH_W) 'flarq-src/arq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arq.Tpo flarq-src/$(DEPDIR)/flarq-arq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arq.cxx' object='flarq-src/flarq-arq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arq.obj `if test -f 'flarq-src/arq.cxx'; then $(CYGPATH_W) 'flarq-src/arq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arq.cxx'; fi` flarq-src/flarq-arqdialogs.o: flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqdialogs.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo -c -o flarq-src/flarq-arqdialogs.o `test -f 'flarq-src/arqdialogs.cxx' || echo '$(srcdir)/'`flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo flarq-src/$(DEPDIR)/flarq-arqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqdialogs.cxx' object='flarq-src/flarq-arqdialogs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqdialogs.o `test -f 'flarq-src/arqdialogs.cxx' || echo '$(srcdir)/'`flarq-src/arqdialogs.cxx flarq-src/flarq-arqdialogs.obj: flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqdialogs.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo -c -o flarq-src/flarq-arqdialogs.obj `if test -f 'flarq-src/arqdialogs.cxx'; then $(CYGPATH_W) 'flarq-src/arqdialogs.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqdialogs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo flarq-src/$(DEPDIR)/flarq-arqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqdialogs.cxx' object='flarq-src/flarq-arqdialogs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqdialogs.obj `if test -f 'flarq-src/arqdialogs.cxx'; then $(CYGPATH_W) 'flarq-src/arqdialogs.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqdialogs.cxx'; fi` flarq-src/flarq-arqhelp.o: flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqhelp.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo -c -o flarq-src/flarq-arqhelp.o `test -f 'flarq-src/arqhelp.cxx' || echo '$(srcdir)/'`flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo flarq-src/$(DEPDIR)/flarq-arqhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqhelp.cxx' object='flarq-src/flarq-arqhelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqhelp.o `test -f 'flarq-src/arqhelp.cxx' || echo '$(srcdir)/'`flarq-src/arqhelp.cxx flarq-src/flarq-arqhelp.obj: flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqhelp.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo -c -o flarq-src/flarq-arqhelp.obj `if test -f 'flarq-src/arqhelp.cxx'; then $(CYGPATH_W) 'flarq-src/arqhelp.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqhelp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo flarq-src/$(DEPDIR)/flarq-arqhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqhelp.cxx' object='flarq-src/flarq-arqhelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqhelp.obj `if test -f 'flarq-src/arqhelp.cxx'; then $(CYGPATH_W) 'flarq-src/arqhelp.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqhelp.cxx'; fi` flarq-src/flarq-b64.o: flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-b64.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-b64.Tpo -c -o flarq-src/flarq-b64.o `test -f 'flarq-src/b64.cxx' || echo '$(srcdir)/'`flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-b64.Tpo flarq-src/$(DEPDIR)/flarq-b64.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/b64.cxx' object='flarq-src/flarq-b64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-b64.o `test -f 'flarq-src/b64.cxx' || echo '$(srcdir)/'`flarq-src/b64.cxx flarq-src/flarq-b64.obj: flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-b64.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-b64.Tpo -c -o flarq-src/flarq-b64.obj `if test -f 'flarq-src/b64.cxx'; then $(CYGPATH_W) 'flarq-src/b64.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/b64.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-b64.Tpo flarq-src/$(DEPDIR)/flarq-b64.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/b64.cxx' object='flarq-src/flarq-b64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-b64.obj `if test -f 'flarq-src/b64.cxx'; then $(CYGPATH_W) 'flarq-src/b64.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/b64.cxx'; fi` flarq-src/flarq-flarq.o: flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarq.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarq.Tpo -c -o flarq-src/flarq-flarq.o `test -f 'flarq-src/flarq.cxx' || echo '$(srcdir)/'`flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarq.Tpo flarq-src/$(DEPDIR)/flarq-flarq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarq.cxx' object='flarq-src/flarq-flarq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarq.o `test -f 'flarq-src/flarq.cxx' || echo '$(srcdir)/'`flarq-src/flarq.cxx flarq-src/flarq-flarq.obj: flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarq.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarq.Tpo -c -o flarq-src/flarq-flarq.obj `if test -f 'flarq-src/flarq.cxx'; then $(CYGPATH_W) 'flarq-src/flarq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarq.Tpo flarq-src/$(DEPDIR)/flarq-flarq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarq.cxx' object='flarq-src/flarq-flarq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarq.obj `if test -f 'flarq-src/flarq.cxx'; then $(CYGPATH_W) 'flarq-src/flarq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarq.cxx'; fi` flarq-src/flarq-flarqenv.o: flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarqenv.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo -c -o flarq-src/flarq-flarqenv.o `test -f 'flarq-src/flarqenv.cxx' || echo '$(srcdir)/'`flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo flarq-src/$(DEPDIR)/flarq-flarqenv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarqenv.cxx' object='flarq-src/flarq-flarqenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarqenv.o `test -f 'flarq-src/flarqenv.cxx' || echo '$(srcdir)/'`flarq-src/flarqenv.cxx flarq-src/flarq-flarqenv.obj: flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarqenv.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo -c -o flarq-src/flarq-flarqenv.obj `if test -f 'flarq-src/flarqenv.cxx'; then $(CYGPATH_W) 'flarq-src/flarqenv.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarqenv.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo flarq-src/$(DEPDIR)/flarq-flarqenv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarqenv.cxx' object='flarq-src/flarq-flarqenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarqenv.obj `if test -f 'flarq-src/flarqenv.cxx'; then $(CYGPATH_W) 'flarq-src/flarqenv.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarqenv.cxx'; fi` flarq-src/flarq-xml_server.o: flarq-src/xml_server.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-xml_server.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-xml_server.Tpo -c -o flarq-src/flarq-xml_server.o `test -f 'flarq-src/xml_server.cxx' || echo '$(srcdir)/'`flarq-src/xml_server.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-xml_server.Tpo flarq-src/$(DEPDIR)/flarq-xml_server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/xml_server.cxx' object='flarq-src/flarq-xml_server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-xml_server.o `test -f 'flarq-src/xml_server.cxx' || echo '$(srcdir)/'`flarq-src/xml_server.cxx flarq-src/flarq-xml_server.obj: flarq-src/xml_server.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-xml_server.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-xml_server.Tpo -c -o flarq-src/flarq-xml_server.obj `if test -f 'flarq-src/xml_server.cxx'; then $(CYGPATH_W) 'flarq-src/xml_server.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/xml_server.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-xml_server.Tpo flarq-src/$(DEPDIR)/flarq-xml_server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/xml_server.cxx' object='flarq-src/flarq-xml_server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-xml_server.obj `if test -f 'flarq-src/xml_server.cxx'; then $(CYGPATH_W) 'flarq-src/xml_server.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/xml_server.cxx'; fi` combo/flarq-combo.o: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT combo/flarq-combo.o -MD -MP -MF combo/$(DEPDIR)/flarq-combo.Tpo -c -o combo/flarq-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/flarq-combo.Tpo combo/$(DEPDIR)/flarq-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/flarq-combo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o combo/flarq-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx combo/flarq-combo.obj: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT combo/flarq-combo.obj -MD -MP -MF combo/$(DEPDIR)/flarq-combo.Tpo -c -o combo/flarq-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/flarq-combo.Tpo combo/$(DEPDIR)/flarq-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/flarq-combo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o combo/flarq-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` fileselector/flarq-fileselect.o: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT fileselector/flarq-fileselect.o -MD -MP -MF fileselector/$(DEPDIR)/flarq-fileselect.Tpo -c -o fileselector/flarq-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/flarq-fileselect.Tpo fileselector/$(DEPDIR)/flarq-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/flarq-fileselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/flarq-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx fileselector/flarq-fileselect.obj: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT fileselector/flarq-fileselect.obj -MD -MP -MF fileselector/$(DEPDIR)/flarq-fileselect.Tpo -c -o fileselector/flarq-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/flarq-fileselect.Tpo fileselector/$(DEPDIR)/flarq-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/flarq-fileselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/flarq-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` logbook/flarq-table.o: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT logbook/flarq-table.o -MD -MP -MF logbook/$(DEPDIR)/flarq-table.Tpo -c -o logbook/flarq-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/flarq-table.Tpo logbook/$(DEPDIR)/flarq-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/flarq-table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o logbook/flarq-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx logbook/flarq-table.obj: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT logbook/flarq-table.obj -MD -MP -MF logbook/$(DEPDIR)/flarq-table.Tpo -c -o logbook/flarq-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/flarq-table.Tpo logbook/$(DEPDIR)/flarq-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/flarq-table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o logbook/flarq-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` misc/flarq-ascii.o: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-ascii.o -MD -MP -MF misc/$(DEPDIR)/flarq-ascii.Tpo -c -o misc/flarq-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-ascii.Tpo misc/$(DEPDIR)/flarq-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/flarq-ascii.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx misc/flarq-ascii.obj: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-ascii.obj -MD -MP -MF misc/$(DEPDIR)/flarq-ascii.Tpo -c -o misc/flarq-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-ascii.Tpo misc/$(DEPDIR)/flarq-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/flarq-ascii.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` misc/flarq-debug.o: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-debug.o -MD -MP -MF misc/$(DEPDIR)/flarq-debug.Tpo -c -o misc/flarq-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-debug.Tpo misc/$(DEPDIR)/flarq-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='misc/flarq-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx misc/flarq-debug.obj: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-debug.obj -MD -MP -MF misc/$(DEPDIR)/flarq-debug.Tpo -c -o misc/flarq-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-debug.Tpo misc/$(DEPDIR)/flarq-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='misc/flarq-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` misc/flarq-stacktrace.o: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stacktrace.o -MD -MP -MF misc/$(DEPDIR)/flarq-stacktrace.Tpo -c -o misc/flarq-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stacktrace.Tpo misc/$(DEPDIR)/flarq-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/flarq-stacktrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx misc/flarq-stacktrace.obj: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stacktrace.obj -MD -MP -MF misc/$(DEPDIR)/flarq-stacktrace.Tpo -c -o misc/flarq-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stacktrace.Tpo misc/$(DEPDIR)/flarq-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/flarq-stacktrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` misc/flarq-threads.o: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-threads.o -MD -MP -MF misc/$(DEPDIR)/flarq-threads.Tpo -c -o misc/flarq-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-threads.Tpo misc/$(DEPDIR)/flarq-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/flarq-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx misc/flarq-threads.obj: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-threads.obj -MD -MP -MF misc/$(DEPDIR)/flarq-threads.Tpo -c -o misc/flarq-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-threads.Tpo misc/$(DEPDIR)/flarq-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/flarq-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` misc/flarq-timeops.o: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-timeops.o -MD -MP -MF misc/$(DEPDIR)/flarq-timeops.Tpo -c -o misc/flarq-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-timeops.Tpo misc/$(DEPDIR)/flarq-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/flarq-timeops.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx misc/flarq-timeops.obj: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-timeops.obj -MD -MP -MF misc/$(DEPDIR)/flarq-timeops.Tpo -c -o misc/flarq-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-timeops.Tpo misc/$(DEPDIR)/flarq-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/flarq-timeops.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` network/flarq-socket.o: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT network/flarq-socket.o -MD -MP -MF network/$(DEPDIR)/flarq-socket.Tpo -c -o network/flarq-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/flarq-socket.Tpo network/$(DEPDIR)/flarq-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/flarq-socket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o network/flarq-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx network/flarq-socket.obj: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT network/flarq-socket.obj -MD -MP -MF network/$(DEPDIR)/flarq-socket.Tpo -c -o network/flarq-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/flarq-socket.Tpo network/$(DEPDIR)/flarq-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/flarq-socket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o network/flarq-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` widgets/flarq-flinput2.o: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flinput2.o -MD -MP -MF widgets/$(DEPDIR)/flarq-flinput2.Tpo -c -o widgets/flarq-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flinput2.Tpo widgets/$(DEPDIR)/flarq-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/flarq-flinput2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx widgets/flarq-flinput2.obj: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flinput2.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-flinput2.Tpo -c -o widgets/flarq-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flinput2.Tpo widgets/$(DEPDIR)/flarq-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/flarq-flinput2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` widgets/flarq-flmisc.o: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flmisc.o -MD -MP -MF widgets/$(DEPDIR)/flarq-flmisc.Tpo -c -o widgets/flarq-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flmisc.Tpo widgets/$(DEPDIR)/flarq-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/flarq-flmisc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx widgets/flarq-flmisc.obj: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flmisc.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-flmisc.Tpo -c -o widgets/flarq-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flmisc.Tpo widgets/$(DEPDIR)/flarq-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/flarq-flmisc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` widgets/flarq-flslider2.o: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flslider2.o -MD -MP -MF widgets/$(DEPDIR)/flarq-flslider2.Tpo -c -o widgets/flarq-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flslider2.Tpo widgets/$(DEPDIR)/flarq-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/flarq-flslider2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx widgets/flarq-flslider2.obj: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flslider2.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-flslider2.Tpo -c -o widgets/flarq-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flslider2.Tpo widgets/$(DEPDIR)/flarq-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/flarq-flslider2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` misc/flarq-icons.o: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-icons.o -MD -MP -MF misc/$(DEPDIR)/flarq-icons.Tpo -c -o misc/flarq-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-icons.Tpo misc/$(DEPDIR)/flarq-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/flarq-icons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx misc/flarq-icons.obj: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-icons.obj -MD -MP -MF misc/$(DEPDIR)/flarq-icons.Tpo -c -o misc/flarq-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-icons.Tpo misc/$(DEPDIR)/flarq-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/flarq-icons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` misc/flarq-pixmaps.o: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps.o -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps.Tpo -c -o misc/flarq-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps.Tpo misc/$(DEPDIR)/flarq-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/flarq-pixmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx misc/flarq-pixmaps.obj: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps.obj -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps.Tpo -c -o misc/flarq-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps.Tpo misc/$(DEPDIR)/flarq-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/flarq-pixmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` misc/flarq-pixmaps_tango.o: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps_tango.o -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo -c -o misc/flarq-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo misc/$(DEPDIR)/flarq-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/flarq-pixmaps_tango.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx misc/flarq-pixmaps_tango.obj: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps_tango.obj -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo -c -o misc/flarq-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo misc/$(DEPDIR)/flarq-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/flarq-pixmaps_tango.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` misc/flarq-re.o: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-re.o -MD -MP -MF misc/$(DEPDIR)/flarq-re.Tpo -c -o misc/flarq-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-re.Tpo misc/$(DEPDIR)/flarq-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/flarq-re.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx misc/flarq-re.obj: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-re.obj -MD -MP -MF misc/$(DEPDIR)/flarq-re.Tpo -c -o misc/flarq-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-re.Tpo misc/$(DEPDIR)/flarq-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/flarq-re.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` misc/flarq-util.o: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-util.o -MD -MP -MF misc/$(DEPDIR)/flarq-util.Tpo -c -o misc/flarq-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-util.Tpo misc/$(DEPDIR)/flarq-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/flarq-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx misc/flarq-util.obj: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-util.obj -MD -MP -MF misc/$(DEPDIR)/flarq-util.Tpo -c -o misc/flarq-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-util.Tpo misc/$(DEPDIR)/flarq-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/flarq-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` widgets/flarq-Fl_Text_Buffer_mod.o: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Buffer_mod.o -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo -c -o widgets/flarq-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/flarq-Fl_Text_Buffer_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx widgets/flarq-Fl_Text_Buffer_mod.obj: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Buffer_mod.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo -c -o widgets/flarq-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/flarq-Fl_Text_Buffer_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` widgets/flarq-Fl_Text_Display_mod.o: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Display_mod.o -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo -c -o widgets/flarq-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/flarq-Fl_Text_Display_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx widgets/flarq-Fl_Text_Display_mod.obj: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Display_mod.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo -c -o widgets/flarq-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/flarq-Fl_Text_Display_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` widgets/flarq-Fl_Text_Editor_mod.o: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Editor_mod.o -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo -c -o widgets/flarq-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/flarq-Fl_Text_Editor_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx widgets/flarq-Fl_Text_Editor_mod.obj: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Editor_mod.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo -c -o widgets/flarq-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/flarq-Fl_Text_Editor_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` widgets/flarq-FTextView.o: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-FTextView.o -MD -MP -MF widgets/$(DEPDIR)/flarq-FTextView.Tpo -c -o widgets/flarq-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-FTextView.Tpo widgets/$(DEPDIR)/flarq-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/flarq-FTextView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx widgets/flarq-FTextView.obj: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-FTextView.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-FTextView.Tpo -c -o widgets/flarq-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-FTextView.Tpo widgets/$(DEPDIR)/flarq-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/flarq-FTextView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` network/fldigi-xmlrpc.o: network/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-xmlrpc.o -MD -MP -MF network/$(DEPDIR)/fldigi-xmlrpc.Tpo -c -o network/fldigi-xmlrpc.o `test -f 'network/xmlrpc.cxx' || echo '$(srcdir)/'`network/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-xmlrpc.Tpo network/$(DEPDIR)/fldigi-xmlrpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/xmlrpc.cxx' object='network/fldigi-xmlrpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-xmlrpc.o `test -f 'network/xmlrpc.cxx' || echo '$(srcdir)/'`network/xmlrpc.cxx network/fldigi-xmlrpc.obj: network/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-xmlrpc.obj -MD -MP -MF network/$(DEPDIR)/fldigi-xmlrpc.Tpo -c -o network/fldigi-xmlrpc.obj `if test -f 'network/xmlrpc.cxx'; then $(CYGPATH_W) 'network/xmlrpc.cxx'; else $(CYGPATH_W) '$(srcdir)/network/xmlrpc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-xmlrpc.Tpo network/$(DEPDIR)/fldigi-xmlrpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/xmlrpc.cxx' object='network/fldigi-xmlrpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-xmlrpc.obj `if test -f 'network/xmlrpc.cxx'; then $(CYGPATH_W) 'network/xmlrpc.cxx'; else $(CYGPATH_W) '$(srcdir)/network/xmlrpc.cxx'; fi` xmlrpcpp/fldigi-XmlRpcClient.o: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcClient.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo -c -o xmlrpcpp/fldigi-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/fldigi-XmlRpcClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/fldigi-XmlRpcClient.obj: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcClient.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo -c -o xmlrpcpp/fldigi-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/fldigi-XmlRpcClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` xmlrpcpp/fldigi-XmlRpcDispatch.o: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcDispatch.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo -c -o xmlrpcpp/fldigi-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/fldigi-XmlRpcDispatch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/fldigi-XmlRpcDispatch.obj: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcDispatch.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo -c -o xmlrpcpp/fldigi-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/fldigi-XmlRpcDispatch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` xmlrpcpp/fldigi-XmlRpcMutex.o: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcMutex.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo -c -o xmlrpcpp/fldigi-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/fldigi-XmlRpcMutex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp xmlrpcpp/fldigi-XmlRpcMutex.obj: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcMutex.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo -c -o xmlrpcpp/fldigi-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/fldigi-XmlRpcMutex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` xmlrpcpp/fldigi-XmlRpcServerConnection.o: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerConnection.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/fldigi-XmlRpcServerConnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp xmlrpcpp/fldigi-XmlRpcServerConnection.obj: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerConnection.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/fldigi-XmlRpcServerConnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` xmlrpcpp/fldigi-XmlRpcServer.o: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServer.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/fldigi-XmlRpcServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp xmlrpcpp/fldigi-XmlRpcServer.obj: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServer.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/fldigi-XmlRpcServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` xmlrpcpp/fldigi-XmlRpcServerMethod.o: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerMethod.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/fldigi-XmlRpcServerMethod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp xmlrpcpp/fldigi-XmlRpcServerMethod.obj: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerMethod.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/fldigi-XmlRpcServerMethod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` xmlrpcpp/fldigi-XmlRpcSocket.o: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSocket.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/fldigi-XmlRpcSocket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp xmlrpcpp/fldigi-XmlRpcSocket.obj: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSocket.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/fldigi-XmlRpcSocket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` xmlrpcpp/fldigi-XmlRpcSource.o: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSource.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/fldigi-XmlRpcSource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp xmlrpcpp/fldigi-XmlRpcSource.obj: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSource.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/fldigi-XmlRpcSource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` xmlrpcpp/fldigi-XmlRpcUtil.o: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcUtil.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo -c -o xmlrpcpp/fldigi-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/fldigi-XmlRpcUtil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp xmlrpcpp/fldigi-XmlRpcUtil.obj: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcUtil.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo -c -o xmlrpcpp/fldigi-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/fldigi-XmlRpcUtil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` xmlrpcpp/fldigi-XmlRpcValue.o: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcValue.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo -c -o xmlrpcpp/fldigi-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/fldigi-XmlRpcValue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp xmlrpcpp/fldigi-XmlRpcValue.obj: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcValue.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo -c -o xmlrpcpp/fldigi-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/fldigi-XmlRpcValue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` rigcontrol/fldigi-hamlib.o: rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-hamlib.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo -c -o rigcontrol/fldigi-hamlib.o `test -f 'rigcontrol/hamlib.cxx' || echo '$(srcdir)/'`rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo rigcontrol/$(DEPDIR)/fldigi-hamlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/hamlib.cxx' object='rigcontrol/fldigi-hamlib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-hamlib.o `test -f 'rigcontrol/hamlib.cxx' || echo '$(srcdir)/'`rigcontrol/hamlib.cxx rigcontrol/fldigi-hamlib.obj: rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-hamlib.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo -c -o rigcontrol/fldigi-hamlib.obj `if test -f 'rigcontrol/hamlib.cxx'; then $(CYGPATH_W) 'rigcontrol/hamlib.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/hamlib.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo rigcontrol/$(DEPDIR)/fldigi-hamlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/hamlib.cxx' object='rigcontrol/fldigi-hamlib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-hamlib.obj `if test -f 'rigcontrol/hamlib.cxx'; then $(CYGPATH_W) 'rigcontrol/hamlib.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/hamlib.cxx'; fi` rigcontrol/fldigi-rigclass.o: rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigclass.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo -c -o rigcontrol/fldigi-rigclass.o `test -f 'rigcontrol/rigclass.cxx' || echo '$(srcdir)/'`rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo rigcontrol/$(DEPDIR)/fldigi-rigclass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigclass.cxx' object='rigcontrol/fldigi-rigclass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigclass.o `test -f 'rigcontrol/rigclass.cxx' || echo '$(srcdir)/'`rigcontrol/rigclass.cxx rigcontrol/fldigi-rigclass.obj: rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigclass.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo -c -o rigcontrol/fldigi-rigclass.obj `if test -f 'rigcontrol/rigclass.cxx'; then $(CYGPATH_W) 'rigcontrol/rigclass.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigclass.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo rigcontrol/$(DEPDIR)/fldigi-rigclass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigclass.cxx' object='rigcontrol/fldigi-rigclass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigclass.obj `if test -f 'rigcontrol/rigclass.cxx'; then $(CYGPATH_W) 'rigcontrol/rigclass.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigclass.cxx'; fi` misc/fldigi-benchmark.o: misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-benchmark.o -MD -MP -MF misc/$(DEPDIR)/fldigi-benchmark.Tpo -c -o misc/fldigi-benchmark.o `test -f 'misc/benchmark.cxx' || echo '$(srcdir)/'`misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-benchmark.Tpo misc/$(DEPDIR)/fldigi-benchmark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/benchmark.cxx' object='misc/fldigi-benchmark.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-benchmark.o `test -f 'misc/benchmark.cxx' || echo '$(srcdir)/'`misc/benchmark.cxx misc/fldigi-benchmark.obj: misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-benchmark.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-benchmark.Tpo -c -o misc/fldigi-benchmark.obj `if test -f 'misc/benchmark.cxx'; then $(CYGPATH_W) 'misc/benchmark.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/benchmark.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-benchmark.Tpo misc/$(DEPDIR)/fldigi-benchmark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/benchmark.cxx' object='misc/fldigi-benchmark.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-benchmark.obj `if test -f 'misc/benchmark.cxx'; then $(CYGPATH_W) 'misc/benchmark.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/benchmark.cxx'; fi` misc/fldigi-stack.o: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stack.o -MD -MP -MF misc/$(DEPDIR)/fldigi-stack.Tpo -c -o misc/fldigi-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stack.Tpo misc/$(DEPDIR)/fldigi-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/fldigi-stack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx misc/fldigi-stack.obj: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stack.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-stack.Tpo -c -o misc/fldigi-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stack.Tpo misc/$(DEPDIR)/fldigi-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/fldigi-stack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` misc/fldigi-nls.o: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-nls.o -MD -MP -MF misc/$(DEPDIR)/fldigi-nls.Tpo -c -o misc/fldigi-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-nls.Tpo misc/$(DEPDIR)/fldigi-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/fldigi-nls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx misc/fldigi-nls.obj: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-nls.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-nls.Tpo -c -o misc/fldigi-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-nls.Tpo misc/$(DEPDIR)/fldigi-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/fldigi-nls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` combo/fldigi-combo.o: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT combo/fldigi-combo.o -MD -MP -MF combo/$(DEPDIR)/fldigi-combo.Tpo -c -o combo/fldigi-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/fldigi-combo.Tpo combo/$(DEPDIR)/fldigi-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/fldigi-combo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o combo/fldigi-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx combo/fldigi-combo.obj: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT combo/fldigi-combo.obj -MD -MP -MF combo/$(DEPDIR)/fldigi-combo.Tpo -c -o combo/fldigi-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/fldigi-combo.Tpo combo/$(DEPDIR)/fldigi-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/fldigi-combo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o combo/fldigi-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` config_script/fldigi-create_default_script.o: config_script/create_default_script.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-create_default_script.o -MD -MP -MF config_script/$(DEPDIR)/fldigi-create_default_script.Tpo -c -o config_script/fldigi-create_default_script.o `test -f 'config_script/create_default_script.cxx' || echo '$(srcdir)/'`config_script/create_default_script.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-create_default_script.Tpo config_script/$(DEPDIR)/fldigi-create_default_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/create_default_script.cxx' object='config_script/fldigi-create_default_script.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-create_default_script.o `test -f 'config_script/create_default_script.cxx' || echo '$(srcdir)/'`config_script/create_default_script.cxx config_script/fldigi-create_default_script.obj: config_script/create_default_script.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-create_default_script.obj -MD -MP -MF config_script/$(DEPDIR)/fldigi-create_default_script.Tpo -c -o config_script/fldigi-create_default_script.obj `if test -f 'config_script/create_default_script.cxx'; then $(CYGPATH_W) 'config_script/create_default_script.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/create_default_script.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-create_default_script.Tpo config_script/$(DEPDIR)/fldigi-create_default_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/create_default_script.cxx' object='config_script/fldigi-create_default_script.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-create_default_script.obj `if test -f 'config_script/create_default_script.cxx'; then $(CYGPATH_W) 'config_script/create_default_script.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/create_default_script.cxx'; fi` config_script/fldigi-run_scripts.o: config_script/run_scripts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-run_scripts.o -MD -MP -MF config_script/$(DEPDIR)/fldigi-run_scripts.Tpo -c -o config_script/fldigi-run_scripts.o `test -f 'config_script/run_scripts.cxx' || echo '$(srcdir)/'`config_script/run_scripts.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-run_scripts.Tpo config_script/$(DEPDIR)/fldigi-run_scripts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/run_scripts.cxx' object='config_script/fldigi-run_scripts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-run_scripts.o `test -f 'config_script/run_scripts.cxx' || echo '$(srcdir)/'`config_script/run_scripts.cxx config_script/fldigi-run_scripts.obj: config_script/run_scripts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-run_scripts.obj -MD -MP -MF config_script/$(DEPDIR)/fldigi-run_scripts.Tpo -c -o config_script/fldigi-run_scripts.obj `if test -f 'config_script/run_scripts.cxx'; then $(CYGPATH_W) 'config_script/run_scripts.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/run_scripts.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-run_scripts.Tpo config_script/$(DEPDIR)/fldigi-run_scripts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/run_scripts.cxx' object='config_script/fldigi-run_scripts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-run_scripts.obj `if test -f 'config_script/run_scripts.cxx'; then $(CYGPATH_W) 'config_script/run_scripts.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/run_scripts.cxx'; fi` config_script/fldigi-script_parsing.o: config_script/script_parsing.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-script_parsing.o -MD -MP -MF config_script/$(DEPDIR)/fldigi-script_parsing.Tpo -c -o config_script/fldigi-script_parsing.o `test -f 'config_script/script_parsing.cxx' || echo '$(srcdir)/'`config_script/script_parsing.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-script_parsing.Tpo config_script/$(DEPDIR)/fldigi-script_parsing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/script_parsing.cxx' object='config_script/fldigi-script_parsing.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-script_parsing.o `test -f 'config_script/script_parsing.cxx' || echo '$(srcdir)/'`config_script/script_parsing.cxx config_script/fldigi-script_parsing.obj: config_script/script_parsing.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-script_parsing.obj -MD -MP -MF config_script/$(DEPDIR)/fldigi-script_parsing.Tpo -c -o config_script/fldigi-script_parsing.obj `if test -f 'config_script/script_parsing.cxx'; then $(CYGPATH_W) 'config_script/script_parsing.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/script_parsing.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-script_parsing.Tpo config_script/$(DEPDIR)/fldigi-script_parsing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/script_parsing.cxx' object='config_script/fldigi-script_parsing.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-script_parsing.obj `if test -f 'config_script/script_parsing.cxx'; then $(CYGPATH_W) 'config_script/script_parsing.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/script_parsing.cxx'; fi` contestia/fldigi-contestia.o: contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT contestia/fldigi-contestia.o -MD -MP -MF contestia/$(DEPDIR)/fldigi-contestia.Tpo -c -o contestia/fldigi-contestia.o `test -f 'contestia/contestia.cxx' || echo '$(srcdir)/'`contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) contestia/$(DEPDIR)/fldigi-contestia.Tpo contestia/$(DEPDIR)/fldigi-contestia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contestia/contestia.cxx' object='contestia/fldigi-contestia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o contestia/fldigi-contestia.o `test -f 'contestia/contestia.cxx' || echo '$(srcdir)/'`contestia/contestia.cxx contestia/fldigi-contestia.obj: contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT contestia/fldigi-contestia.obj -MD -MP -MF contestia/$(DEPDIR)/fldigi-contestia.Tpo -c -o contestia/fldigi-contestia.obj `if test -f 'contestia/contestia.cxx'; then $(CYGPATH_W) 'contestia/contestia.cxx'; else $(CYGPATH_W) '$(srcdir)/contestia/contestia.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) contestia/$(DEPDIR)/fldigi-contestia.Tpo contestia/$(DEPDIR)/fldigi-contestia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contestia/contestia.cxx' object='contestia/fldigi-contestia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o contestia/fldigi-contestia.obj `if test -f 'contestia/contestia.cxx'; then $(CYGPATH_W) 'contestia/contestia.cxx'; else $(CYGPATH_W) '$(srcdir)/contestia/contestia.cxx'; fi` cw_rtty/fldigi-cw.o: cw_rtty/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-cw.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-cw.Tpo -c -o cw_rtty/fldigi-cw.o `test -f 'cw_rtty/cw.cxx' || echo '$(srcdir)/'`cw_rtty/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-cw.Tpo cw_rtty/$(DEPDIR)/fldigi-cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/cw.cxx' object='cw_rtty/fldigi-cw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-cw.o `test -f 'cw_rtty/cw.cxx' || echo '$(srcdir)/'`cw_rtty/cw.cxx cw_rtty/fldigi-cw.obj: cw_rtty/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-cw.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-cw.Tpo -c -o cw_rtty/fldigi-cw.obj `if test -f 'cw_rtty/cw.cxx'; then $(CYGPATH_W) 'cw_rtty/cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/cw.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-cw.Tpo cw_rtty/$(DEPDIR)/fldigi-cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/cw.cxx' object='cw_rtty/fldigi-cw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-cw.obj `if test -f 'cw_rtty/cw.cxx'; then $(CYGPATH_W) 'cw_rtty/cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/cw.cxx'; fi` cw_rtty/fldigi-morse.o: cw_rtty/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-morse.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-morse.Tpo -c -o cw_rtty/fldigi-morse.o `test -f 'cw_rtty/morse.cxx' || echo '$(srcdir)/'`cw_rtty/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-morse.Tpo cw_rtty/$(DEPDIR)/fldigi-morse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/morse.cxx' object='cw_rtty/fldigi-morse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-morse.o `test -f 'cw_rtty/morse.cxx' || echo '$(srcdir)/'`cw_rtty/morse.cxx cw_rtty/fldigi-morse.obj: cw_rtty/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-morse.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-morse.Tpo -c -o cw_rtty/fldigi-morse.obj `if test -f 'cw_rtty/morse.cxx'; then $(CYGPATH_W) 'cw_rtty/morse.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/morse.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-morse.Tpo cw_rtty/$(DEPDIR)/fldigi-morse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/morse.cxx' object='cw_rtty/fldigi-morse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-morse.obj `if test -f 'cw_rtty/morse.cxx'; then $(CYGPATH_W) 'cw_rtty/morse.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/morse.cxx'; fi` cw_rtty/fldigi-nanoIO.o: cw_rtty/nanoIO.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-nanoIO.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-nanoIO.Tpo -c -o cw_rtty/fldigi-nanoIO.o `test -f 'cw_rtty/nanoIO.cxx' || echo '$(srcdir)/'`cw_rtty/nanoIO.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-nanoIO.Tpo cw_rtty/$(DEPDIR)/fldigi-nanoIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/nanoIO.cxx' object='cw_rtty/fldigi-nanoIO.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-nanoIO.o `test -f 'cw_rtty/nanoIO.cxx' || echo '$(srcdir)/'`cw_rtty/nanoIO.cxx cw_rtty/fldigi-nanoIO.obj: cw_rtty/nanoIO.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-nanoIO.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-nanoIO.Tpo -c -o cw_rtty/fldigi-nanoIO.obj `if test -f 'cw_rtty/nanoIO.cxx'; then $(CYGPATH_W) 'cw_rtty/nanoIO.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/nanoIO.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-nanoIO.Tpo cw_rtty/$(DEPDIR)/fldigi-nanoIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/nanoIO.cxx' object='cw_rtty/fldigi-nanoIO.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-nanoIO.obj `if test -f 'cw_rtty/nanoIO.cxx'; then $(CYGPATH_W) 'cw_rtty/nanoIO.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/nanoIO.cxx'; fi` cw_rtty/fldigi-Nav.o: cw_rtty/Nav.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-Nav.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-Nav.Tpo -c -o cw_rtty/fldigi-Nav.o `test -f 'cw_rtty/Nav.cxx' || echo '$(srcdir)/'`cw_rtty/Nav.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-Nav.Tpo cw_rtty/$(DEPDIR)/fldigi-Nav.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/Nav.cxx' object='cw_rtty/fldigi-Nav.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-Nav.o `test -f 'cw_rtty/Nav.cxx' || echo '$(srcdir)/'`cw_rtty/Nav.cxx cw_rtty/fldigi-Nav.obj: cw_rtty/Nav.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-Nav.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-Nav.Tpo -c -o cw_rtty/fldigi-Nav.obj `if test -f 'cw_rtty/Nav.cxx'; then $(CYGPATH_W) 'cw_rtty/Nav.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/Nav.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-Nav.Tpo cw_rtty/$(DEPDIR)/fldigi-Nav.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/Nav.cxx' object='cw_rtty/fldigi-Nav.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-Nav.obj `if test -f 'cw_rtty/Nav.cxx'; then $(CYGPATH_W) 'cw_rtty/Nav.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/Nav.cxx'; fi` cw_rtty/fldigi-rtty.o: cw_rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-rtty.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-rtty.Tpo -c -o cw_rtty/fldigi-rtty.o `test -f 'cw_rtty/rtty.cxx' || echo '$(srcdir)/'`cw_rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-rtty.Tpo cw_rtty/$(DEPDIR)/fldigi-rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/rtty.cxx' object='cw_rtty/fldigi-rtty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-rtty.o `test -f 'cw_rtty/rtty.cxx' || echo '$(srcdir)/'`cw_rtty/rtty.cxx cw_rtty/fldigi-rtty.obj: cw_rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-rtty.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-rtty.Tpo -c -o cw_rtty/fldigi-rtty.obj `if test -f 'cw_rtty/rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/rtty.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-rtty.Tpo cw_rtty/$(DEPDIR)/fldigi-rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/rtty.cxx' object='cw_rtty/fldigi-rtty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-rtty.obj `if test -f 'cw_rtty/rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/rtty.cxx'; fi` cw_rtty/fldigi-view_cw.o: cw_rtty/view_cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-view_cw.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-view_cw.Tpo -c -o cw_rtty/fldigi-view_cw.o `test -f 'cw_rtty/view_cw.cxx' || echo '$(srcdir)/'`cw_rtty/view_cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-view_cw.Tpo cw_rtty/$(DEPDIR)/fldigi-view_cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/view_cw.cxx' object='cw_rtty/fldigi-view_cw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-view_cw.o `test -f 'cw_rtty/view_cw.cxx' || echo '$(srcdir)/'`cw_rtty/view_cw.cxx cw_rtty/fldigi-view_cw.obj: cw_rtty/view_cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-view_cw.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-view_cw.Tpo -c -o cw_rtty/fldigi-view_cw.obj `if test -f 'cw_rtty/view_cw.cxx'; then $(CYGPATH_W) 'cw_rtty/view_cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/view_cw.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-view_cw.Tpo cw_rtty/$(DEPDIR)/fldigi-view_cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/view_cw.cxx' object='cw_rtty/fldigi-view_cw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-view_cw.obj `if test -f 'cw_rtty/view_cw.cxx'; then $(CYGPATH_W) 'cw_rtty/view_cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/view_cw.cxx'; fi` cw_rtty/fldigi-view_rtty.o: cw_rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-view_rtty.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-view_rtty.Tpo -c -o cw_rtty/fldigi-view_rtty.o `test -f 'cw_rtty/view_rtty.cxx' || echo '$(srcdir)/'`cw_rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-view_rtty.Tpo cw_rtty/$(DEPDIR)/fldigi-view_rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/view_rtty.cxx' object='cw_rtty/fldigi-view_rtty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-view_rtty.o `test -f 'cw_rtty/view_rtty.cxx' || echo '$(srcdir)/'`cw_rtty/view_rtty.cxx cw_rtty/fldigi-view_rtty.obj: cw_rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-view_rtty.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-view_rtty.Tpo -c -o cw_rtty/fldigi-view_rtty.obj `if test -f 'cw_rtty/view_rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/view_rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/view_rtty.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-view_rtty.Tpo cw_rtty/$(DEPDIR)/fldigi-view_rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/view_rtty.cxx' object='cw_rtty/fldigi-view_rtty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-view_rtty.obj `if test -f 'cw_rtty/view_rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/view_rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/view_rtty.cxx'; fi` cw_rtty/fldigi-winkeyer.o: cw_rtty/winkeyer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-winkeyer.o -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-winkeyer.Tpo -c -o cw_rtty/fldigi-winkeyer.o `test -f 'cw_rtty/winkeyer.cxx' || echo '$(srcdir)/'`cw_rtty/winkeyer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-winkeyer.Tpo cw_rtty/$(DEPDIR)/fldigi-winkeyer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/winkeyer.cxx' object='cw_rtty/fldigi-winkeyer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-winkeyer.o `test -f 'cw_rtty/winkeyer.cxx' || echo '$(srcdir)/'`cw_rtty/winkeyer.cxx cw_rtty/fldigi-winkeyer.obj: cw_rtty/winkeyer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw_rtty/fldigi-winkeyer.obj -MD -MP -MF cw_rtty/$(DEPDIR)/fldigi-winkeyer.Tpo -c -o cw_rtty/fldigi-winkeyer.obj `if test -f 'cw_rtty/winkeyer.cxx'; then $(CYGPATH_W) 'cw_rtty/winkeyer.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/winkeyer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw_rtty/$(DEPDIR)/fldigi-winkeyer.Tpo cw_rtty/$(DEPDIR)/fldigi-winkeyer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/winkeyer.cxx' object='cw_rtty/fldigi-winkeyer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw_rtty/fldigi-winkeyer.obj `if test -f 'cw_rtty/winkeyer.cxx'; then $(CYGPATH_W) 'cw_rtty/winkeyer.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/winkeyer.cxx'; fi` dialogs/fldigi-confdialog.o: dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-confdialog.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-confdialog.Tpo -c -o dialogs/fldigi-confdialog.o `test -f 'dialogs/confdialog.cxx' || echo '$(srcdir)/'`dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-confdialog.Tpo dialogs/$(DEPDIR)/fldigi-confdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/confdialog.cxx' object='dialogs/fldigi-confdialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-confdialog.o `test -f 'dialogs/confdialog.cxx' || echo '$(srcdir)/'`dialogs/confdialog.cxx dialogs/fldigi-confdialog.obj: dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-confdialog.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-confdialog.Tpo -c -o dialogs/fldigi-confdialog.obj `if test -f 'dialogs/confdialog.cxx'; then $(CYGPATH_W) 'dialogs/confdialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/confdialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-confdialog.Tpo dialogs/$(DEPDIR)/fldigi-confdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/confdialog.cxx' object='dialogs/fldigi-confdialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-confdialog.obj `if test -f 'dialogs/confdialog.cxx'; then $(CYGPATH_W) 'dialogs/confdialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/confdialog.cxx'; fi` dialogs/fldigi-fl_digi.o: dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo -c -o dialogs/fldigi-fl_digi.o `test -f 'dialogs/fl_digi.cxx' || echo '$(srcdir)/'`dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi.cxx' object='dialogs/fldigi-fl_digi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi.o `test -f 'dialogs/fl_digi.cxx' || echo '$(srcdir)/'`dialogs/fl_digi.cxx dialogs/fldigi-fl_digi.obj: dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo -c -o dialogs/fldigi-fl_digi.obj `if test -f 'dialogs/fl_digi.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi.cxx' object='dialogs/fldigi-fl_digi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi.obj `if test -f 'dialogs/fl_digi.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi.cxx'; fi` dialogs/fldigi-font_browser.o: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-font_browser.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-font_browser.Tpo -c -o dialogs/fldigi-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-font_browser.Tpo dialogs/$(DEPDIR)/fldigi-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/fldigi-font_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx dialogs/fldigi-font_browser.obj: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-font_browser.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-font_browser.Tpo -c -o dialogs/fldigi-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-font_browser.Tpo dialogs/$(DEPDIR)/fldigi-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/fldigi-font_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` dialogs/fldigi-htmlstrings.o: dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-htmlstrings.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo -c -o dialogs/fldigi-htmlstrings.o `test -f 'dialogs/htmlstrings.cxx' || echo '$(srcdir)/'`dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo dialogs/$(DEPDIR)/fldigi-htmlstrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/htmlstrings.cxx' object='dialogs/fldigi-htmlstrings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-htmlstrings.o `test -f 'dialogs/htmlstrings.cxx' || echo '$(srcdir)/'`dialogs/htmlstrings.cxx dialogs/fldigi-htmlstrings.obj: dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-htmlstrings.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo -c -o dialogs/fldigi-htmlstrings.obj `if test -f 'dialogs/htmlstrings.cxx'; then $(CYGPATH_W) 'dialogs/htmlstrings.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/htmlstrings.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo dialogs/$(DEPDIR)/fldigi-htmlstrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/htmlstrings.cxx' object='dialogs/fldigi-htmlstrings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-htmlstrings.obj `if test -f 'dialogs/htmlstrings.cxx'; then $(CYGPATH_W) 'dialogs/htmlstrings.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/htmlstrings.cxx'; fi` dialogs/fldigi-notifydialog.o: dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-notifydialog.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo -c -o dialogs/fldigi-notifydialog.o `test -f 'dialogs/notifydialog.cxx' || echo '$(srcdir)/'`dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo dialogs/$(DEPDIR)/fldigi-notifydialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/notifydialog.cxx' object='dialogs/fldigi-notifydialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-notifydialog.o `test -f 'dialogs/notifydialog.cxx' || echo '$(srcdir)/'`dialogs/notifydialog.cxx dialogs/fldigi-notifydialog.obj: dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-notifydialog.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo -c -o dialogs/fldigi-notifydialog.obj `if test -f 'dialogs/notifydialog.cxx'; then $(CYGPATH_W) 'dialogs/notifydialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/notifydialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo dialogs/$(DEPDIR)/fldigi-notifydialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/notifydialog.cxx' object='dialogs/fldigi-notifydialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-notifydialog.obj `if test -f 'dialogs/notifydialog.cxx'; then $(CYGPATH_W) 'dialogs/notifydialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/notifydialog.cxx'; fi` dialogs/fldigi-record_browse.o: dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-record_browse.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-record_browse.Tpo -c -o dialogs/fldigi-record_browse.o `test -f 'dialogs/record_browse.cxx' || echo '$(srcdir)/'`dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-record_browse.Tpo dialogs/$(DEPDIR)/fldigi-record_browse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/record_browse.cxx' object='dialogs/fldigi-record_browse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-record_browse.o `test -f 'dialogs/record_browse.cxx' || echo '$(srcdir)/'`dialogs/record_browse.cxx dialogs/fldigi-record_browse.obj: dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-record_browse.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-record_browse.Tpo -c -o dialogs/fldigi-record_browse.obj `if test -f 'dialogs/record_browse.cxx'; then $(CYGPATH_W) 'dialogs/record_browse.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/record_browse.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-record_browse.Tpo dialogs/$(DEPDIR)/fldigi-record_browse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/record_browse.cxx' object='dialogs/fldigi-record_browse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-record_browse.obj `if test -f 'dialogs/record_browse.cxx'; then $(CYGPATH_W) 'dialogs/record_browse.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/record_browse.cxx'; fi` dialogs/fldigi-testsigs.o: dialogs/testsigs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-testsigs.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-testsigs.Tpo -c -o dialogs/fldigi-testsigs.o `test -f 'dialogs/testsigs.cxx' || echo '$(srcdir)/'`dialogs/testsigs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-testsigs.Tpo dialogs/$(DEPDIR)/fldigi-testsigs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/testsigs.cxx' object='dialogs/fldigi-testsigs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-testsigs.o `test -f 'dialogs/testsigs.cxx' || echo '$(srcdir)/'`dialogs/testsigs.cxx dialogs/fldigi-testsigs.obj: dialogs/testsigs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-testsigs.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-testsigs.Tpo -c -o dialogs/fldigi-testsigs.obj `if test -f 'dialogs/testsigs.cxx'; then $(CYGPATH_W) 'dialogs/testsigs.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/testsigs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-testsigs.Tpo dialogs/$(DEPDIR)/fldigi-testsigs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/testsigs.cxx' object='dialogs/fldigi-testsigs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-testsigs.obj `if test -f 'dialogs/testsigs.cxx'; then $(CYGPATH_W) 'dialogs/testsigs.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/testsigs.cxx'; fi` dialogs/fldigi-tod_clock.o: dialogs/tod_clock.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-tod_clock.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo -c -o dialogs/fldigi-tod_clock.o `test -f 'dialogs/tod_clock.cxx' || echo '$(srcdir)/'`dialogs/tod_clock.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo dialogs/$(DEPDIR)/fldigi-tod_clock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/tod_clock.cxx' object='dialogs/fldigi-tod_clock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-tod_clock.o `test -f 'dialogs/tod_clock.cxx' || echo '$(srcdir)/'`dialogs/tod_clock.cxx dialogs/fldigi-tod_clock.obj: dialogs/tod_clock.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-tod_clock.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo -c -o dialogs/fldigi-tod_clock.obj `if test -f 'dialogs/tod_clock.cxx'; then $(CYGPATH_W) 'dialogs/tod_clock.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/tod_clock.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo dialogs/$(DEPDIR)/fldigi-tod_clock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/tod_clock.cxx' object='dialogs/fldigi-tod_clock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-tod_clock.obj `if test -f 'dialogs/tod_clock.cxx'; then $(CYGPATH_W) 'dialogs/tod_clock.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/tod_clock.cxx'; fi` dialogs/fldigi-Viewer.o: dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-Viewer.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-Viewer.Tpo -c -o dialogs/fldigi-Viewer.o `test -f 'dialogs/Viewer.cxx' || echo '$(srcdir)/'`dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-Viewer.Tpo dialogs/$(DEPDIR)/fldigi-Viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/Viewer.cxx' object='dialogs/fldigi-Viewer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-Viewer.o `test -f 'dialogs/Viewer.cxx' || echo '$(srcdir)/'`dialogs/Viewer.cxx dialogs/fldigi-Viewer.obj: dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-Viewer.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-Viewer.Tpo -c -o dialogs/fldigi-Viewer.obj `if test -f 'dialogs/Viewer.cxx'; then $(CYGPATH_W) 'dialogs/Viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/Viewer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-Viewer.Tpo dialogs/$(DEPDIR)/fldigi-Viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/Viewer.cxx' object='dialogs/fldigi-Viewer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-Viewer.obj `if test -f 'dialogs/Viewer.cxx'; then $(CYGPATH_W) 'dialogs/Viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/Viewer.cxx'; fi` dominoex/fldigi-dominoex.o: dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominoex.o -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominoex.Tpo -c -o dominoex/fldigi-dominoex.o `test -f 'dominoex/dominoex.cxx' || echo '$(srcdir)/'`dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominoex.Tpo dominoex/$(DEPDIR)/fldigi-dominoex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominoex.cxx' object='dominoex/fldigi-dominoex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominoex.o `test -f 'dominoex/dominoex.cxx' || echo '$(srcdir)/'`dominoex/dominoex.cxx dominoex/fldigi-dominoex.obj: dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominoex.obj -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominoex.Tpo -c -o dominoex/fldigi-dominoex.obj `if test -f 'dominoex/dominoex.cxx'; then $(CYGPATH_W) 'dominoex/dominoex.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominoex.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominoex.Tpo dominoex/$(DEPDIR)/fldigi-dominoex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominoex.cxx' object='dominoex/fldigi-dominoex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominoex.obj `if test -f 'dominoex/dominoex.cxx'; then $(CYGPATH_W) 'dominoex/dominoex.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominoex.cxx'; fi` dominoex/fldigi-dominovar.o: dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominovar.o -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominovar.Tpo -c -o dominoex/fldigi-dominovar.o `test -f 'dominoex/dominovar.cxx' || echo '$(srcdir)/'`dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominovar.Tpo dominoex/$(DEPDIR)/fldigi-dominovar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominovar.cxx' object='dominoex/fldigi-dominovar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominovar.o `test -f 'dominoex/dominovar.cxx' || echo '$(srcdir)/'`dominoex/dominovar.cxx dominoex/fldigi-dominovar.obj: dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominovar.obj -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominovar.Tpo -c -o dominoex/fldigi-dominovar.obj `if test -f 'dominoex/dominovar.cxx'; then $(CYGPATH_W) 'dominoex/dominovar.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominovar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominovar.Tpo dominoex/$(DEPDIR)/fldigi-dominovar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominovar.cxx' object='dominoex/fldigi-dominovar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominovar.obj `if test -f 'dominoex/dominovar.cxx'; then $(CYGPATH_W) 'dominoex/dominovar.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominovar.cxx'; fi` dtmf/fldigi-dtmf.o: dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dtmf/fldigi-dtmf.o -MD -MP -MF dtmf/$(DEPDIR)/fldigi-dtmf.Tpo -c -o dtmf/fldigi-dtmf.o `test -f 'dtmf/dtmf.cxx' || echo '$(srcdir)/'`dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dtmf/$(DEPDIR)/fldigi-dtmf.Tpo dtmf/$(DEPDIR)/fldigi-dtmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dtmf/dtmf.cxx' object='dtmf/fldigi-dtmf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dtmf/fldigi-dtmf.o `test -f 'dtmf/dtmf.cxx' || echo '$(srcdir)/'`dtmf/dtmf.cxx dtmf/fldigi-dtmf.obj: dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dtmf/fldigi-dtmf.obj -MD -MP -MF dtmf/$(DEPDIR)/fldigi-dtmf.Tpo -c -o dtmf/fldigi-dtmf.obj `if test -f 'dtmf/dtmf.cxx'; then $(CYGPATH_W) 'dtmf/dtmf.cxx'; else $(CYGPATH_W) '$(srcdir)/dtmf/dtmf.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dtmf/$(DEPDIR)/fldigi-dtmf.Tpo dtmf/$(DEPDIR)/fldigi-dtmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dtmf/dtmf.cxx' object='dtmf/fldigi-dtmf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dtmf/fldigi-dtmf.obj `if test -f 'dtmf/dtmf.cxx'; then $(CYGPATH_W) 'dtmf/dtmf.cxx'; else $(CYGPATH_W) '$(srcdir)/dtmf/dtmf.cxx'; fi` dxcluster/fldigi-dxcluster.o: dxcluster/dxcluster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dxcluster.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo -c -o dxcluster/fldigi-dxcluster.o `test -f 'dxcluster/dxcluster.cxx' || echo '$(srcdir)/'`dxcluster/dxcluster.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo dxcluster/$(DEPDIR)/fldigi-dxcluster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dxcluster.cxx' object='dxcluster/fldigi-dxcluster.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dxcluster.o `test -f 'dxcluster/dxcluster.cxx' || echo '$(srcdir)/'`dxcluster/dxcluster.cxx dxcluster/fldigi-dxcluster.obj: dxcluster/dxcluster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dxcluster.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo -c -o dxcluster/fldigi-dxcluster.obj `if test -f 'dxcluster/dxcluster.cxx'; then $(CYGPATH_W) 'dxcluster/dxcluster.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dxcluster.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo dxcluster/$(DEPDIR)/fldigi-dxcluster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dxcluster.cxx' object='dxcluster/fldigi-dxcluster.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dxcluster.obj `if test -f 'dxcluster/dxcluster.cxx'; then $(CYGPATH_W) 'dxcluster/dxcluster.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dxcluster.cxx'; fi` dxcluster/fldigi-dx_dialog.o: dxcluster/dx_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dx_dialog.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo -c -o dxcluster/fldigi-dx_dialog.o `test -f 'dxcluster/dx_dialog.cxx' || echo '$(srcdir)/'`dxcluster/dx_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dx_dialog.cxx' object='dxcluster/fldigi-dx_dialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dx_dialog.o `test -f 'dxcluster/dx_dialog.cxx' || echo '$(srcdir)/'`dxcluster/dx_dialog.cxx dxcluster/fldigi-dx_dialog.obj: dxcluster/dx_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dx_dialog.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo -c -o dxcluster/fldigi-dx_dialog.obj `if test -f 'dxcluster/dx_dialog.cxx'; then $(CYGPATH_W) 'dxcluster/dx_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dx_dialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dx_dialog.cxx' object='dxcluster/fldigi-dx_dialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dx_dialog.obj `if test -f 'dxcluster/dx_dialog.cxx'; then $(CYGPATH_W) 'dxcluster/dx_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dx_dialog.cxx'; fi` feld/fldigi-feld.o: feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feld.o -MD -MP -MF feld/$(DEPDIR)/fldigi-feld.Tpo -c -o feld/fldigi-feld.o `test -f 'feld/feld.cxx' || echo '$(srcdir)/'`feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feld.Tpo feld/$(DEPDIR)/fldigi-feld.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feld.cxx' object='feld/fldigi-feld.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feld.o `test -f 'feld/feld.cxx' || echo '$(srcdir)/'`feld/feld.cxx feld/fldigi-feld.obj: feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feld.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-feld.Tpo -c -o feld/fldigi-feld.obj `if test -f 'feld/feld.cxx'; then $(CYGPATH_W) 'feld/feld.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feld.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feld.Tpo feld/$(DEPDIR)/fldigi-feld.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feld.cxx' object='feld/fldigi-feld.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feld.obj `if test -f 'feld/feld.cxx'; then $(CYGPATH_W) 'feld/feld.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feld.cxx'; fi` feld/fldigi-feldfonts.o: feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feldfonts.o -MD -MP -MF feld/$(DEPDIR)/fldigi-feldfonts.Tpo -c -o feld/fldigi-feldfonts.o `test -f 'feld/feldfonts.cxx' || echo '$(srcdir)/'`feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feldfonts.Tpo feld/$(DEPDIR)/fldigi-feldfonts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feldfonts.cxx' object='feld/fldigi-feldfonts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feldfonts.o `test -f 'feld/feldfonts.cxx' || echo '$(srcdir)/'`feld/feldfonts.cxx feld/fldigi-feldfonts.obj: feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feldfonts.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-feldfonts.Tpo -c -o feld/fldigi-feldfonts.obj `if test -f 'feld/feldfonts.cxx'; then $(CYGPATH_W) 'feld/feldfonts.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feldfonts.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feldfonts.Tpo feld/$(DEPDIR)/fldigi-feldfonts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feldfonts.cxx' object='feld/fldigi-feldfonts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feldfonts.obj `if test -f 'feld/feldfonts.cxx'; then $(CYGPATH_W) 'feld/feldfonts.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feldfonts.cxx'; fi` fft-monitor/fldigi-fft-monitor.o: fft-monitor/fft-monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-fft-monitor.o -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo -c -o fft-monitor/fldigi-fft-monitor.o `test -f 'fft-monitor/fft-monitor.cxx' || echo '$(srcdir)/'`fft-monitor/fft-monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/fft-monitor.cxx' object='fft-monitor/fldigi-fft-monitor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-fft-monitor.o `test -f 'fft-monitor/fft-monitor.cxx' || echo '$(srcdir)/'`fft-monitor/fft-monitor.cxx fft-monitor/fldigi-fft-monitor.obj: fft-monitor/fft-monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-fft-monitor.obj -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo -c -o fft-monitor/fldigi-fft-monitor.obj `if test -f 'fft-monitor/fft-monitor.cxx'; then $(CYGPATH_W) 'fft-monitor/fft-monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/fft-monitor.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/fft-monitor.cxx' object='fft-monitor/fldigi-fft-monitor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-fft-monitor.obj `if test -f 'fft-monitor/fft-monitor.cxx'; then $(CYGPATH_W) 'fft-monitor/fft-monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/fft-monitor.cxx'; fi` fft-monitor/fldigi-spectrum.o: fft-monitor/spectrum.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum.o -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo -c -o fft-monitor/fldigi-spectrum.o `test -f 'fft-monitor/spectrum.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum.cxx' object='fft-monitor/fldigi-spectrum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum.o `test -f 'fft-monitor/spectrum.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum.cxx fft-monitor/fldigi-spectrum.obj: fft-monitor/spectrum.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum.obj -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo -c -o fft-monitor/fldigi-spectrum.obj `if test -f 'fft-monitor/spectrum.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum.cxx' object='fft-monitor/fldigi-spectrum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum.obj `if test -f 'fft-monitor/spectrum.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum.cxx'; fi` fft-monitor/fldigi-spectrum_viewer.o: fft-monitor/spectrum_viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum_viewer.o -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo -c -o fft-monitor/fldigi-spectrum_viewer.o `test -f 'fft-monitor/spectrum_viewer.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum_viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum_viewer.cxx' object='fft-monitor/fldigi-spectrum_viewer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum_viewer.o `test -f 'fft-monitor/spectrum_viewer.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum_viewer.cxx fft-monitor/fldigi-spectrum_viewer.obj: fft-monitor/spectrum_viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum_viewer.obj -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo -c -o fft-monitor/fldigi-spectrum_viewer.obj `if test -f 'fft-monitor/spectrum_viewer.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum_viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum_viewer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum_viewer.cxx' object='fft-monitor/fldigi-spectrum_viewer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum_viewer.obj `if test -f 'fft-monitor/spectrum_viewer.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum_viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum_viewer.cxx'; fi` fileselector/fldigi-fileselect.o: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-fileselect.o -MD -MP -MF fileselector/$(DEPDIR)/fldigi-fileselect.Tpo -c -o fileselector/fldigi-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-fileselect.Tpo fileselector/$(DEPDIR)/fldigi-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/fldigi-fileselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx fileselector/fldigi-fileselect.obj: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-fileselect.obj -MD -MP -MF fileselector/$(DEPDIR)/fldigi-fileselect.Tpo -c -o fileselector/fldigi-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-fileselect.Tpo fileselector/$(DEPDIR)/fldigi-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/fldigi-fileselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` filters/fldigi-fftfilt.o: filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-fftfilt.o -MD -MP -MF filters/$(DEPDIR)/fldigi-fftfilt.Tpo -c -o filters/fldigi-fftfilt.o `test -f 'filters/fftfilt.cxx' || echo '$(srcdir)/'`filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-fftfilt.Tpo filters/$(DEPDIR)/fldigi-fftfilt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/fftfilt.cxx' object='filters/fldigi-fftfilt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-fftfilt.o `test -f 'filters/fftfilt.cxx' || echo '$(srcdir)/'`filters/fftfilt.cxx filters/fldigi-fftfilt.obj: filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-fftfilt.obj -MD -MP -MF filters/$(DEPDIR)/fldigi-fftfilt.Tpo -c -o filters/fldigi-fftfilt.obj `if test -f 'filters/fftfilt.cxx'; then $(CYGPATH_W) 'filters/fftfilt.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/fftfilt.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-fftfilt.Tpo filters/$(DEPDIR)/fldigi-fftfilt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/fftfilt.cxx' object='filters/fldigi-fftfilt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-fftfilt.obj `if test -f 'filters/fftfilt.cxx'; then $(CYGPATH_W) 'filters/fftfilt.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/fftfilt.cxx'; fi` filters/fldigi-filters.o: filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-filters.o -MD -MP -MF filters/$(DEPDIR)/fldigi-filters.Tpo -c -o filters/fldigi-filters.o `test -f 'filters/filters.cxx' || echo '$(srcdir)/'`filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-filters.Tpo filters/$(DEPDIR)/fldigi-filters.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/filters.cxx' object='filters/fldigi-filters.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-filters.o `test -f 'filters/filters.cxx' || echo '$(srcdir)/'`filters/filters.cxx filters/fldigi-filters.obj: filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-filters.obj -MD -MP -MF filters/$(DEPDIR)/fldigi-filters.Tpo -c -o filters/fldigi-filters.obj `if test -f 'filters/filters.cxx'; then $(CYGPATH_W) 'filters/filters.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/filters.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-filters.Tpo filters/$(DEPDIR)/fldigi-filters.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/filters.cxx' object='filters/fldigi-filters.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-filters.obj `if test -f 'filters/filters.cxx'; then $(CYGPATH_W) 'filters/filters.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/filters.cxx'; fi` filters/fldigi-viterbi.o: filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-viterbi.o -MD -MP -MF filters/$(DEPDIR)/fldigi-viterbi.Tpo -c -o filters/fldigi-viterbi.o `test -f 'filters/viterbi.cxx' || echo '$(srcdir)/'`filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-viterbi.Tpo filters/$(DEPDIR)/fldigi-viterbi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/viterbi.cxx' object='filters/fldigi-viterbi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-viterbi.o `test -f 'filters/viterbi.cxx' || echo '$(srcdir)/'`filters/viterbi.cxx filters/fldigi-viterbi.obj: filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-viterbi.obj -MD -MP -MF filters/$(DEPDIR)/fldigi-viterbi.Tpo -c -o filters/fldigi-viterbi.obj `if test -f 'filters/viterbi.cxx'; then $(CYGPATH_W) 'filters/viterbi.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/viterbi.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-viterbi.Tpo filters/$(DEPDIR)/fldigi-viterbi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/viterbi.cxx' object='filters/fldigi-viterbi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-viterbi.obj `if test -f 'filters/viterbi.cxx'; then $(CYGPATH_W) 'filters/viterbi.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/viterbi.cxx'; fi` fsq/fldigi-fsq.o: fsq/fsq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq.Tpo -c -o fsq/fldigi-fsq.o `test -f 'fsq/fsq.cxx' || echo '$(srcdir)/'`fsq/fsq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq.Tpo fsq/$(DEPDIR)/fldigi-fsq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq.cxx' object='fsq/fldigi-fsq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq.o `test -f 'fsq/fsq.cxx' || echo '$(srcdir)/'`fsq/fsq.cxx fsq/fldigi-fsq.obj: fsq/fsq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq.Tpo -c -o fsq/fldigi-fsq.obj `if test -f 'fsq/fsq.cxx'; then $(CYGPATH_W) 'fsq/fsq.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq.Tpo fsq/$(DEPDIR)/fldigi-fsq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq.cxx' object='fsq/fldigi-fsq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq.obj `if test -f 'fsq/fsq.cxx'; then $(CYGPATH_W) 'fsq/fsq.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq.cxx'; fi` fsq/fldigi-fsq_monitor.o: fsq/fsq_monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_monitor.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo -c -o fsq/fldigi-fsq_monitor.o `test -f 'fsq/fsq_monitor.cxx' || echo '$(srcdir)/'`fsq/fsq_monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo fsq/$(DEPDIR)/fldigi-fsq_monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_monitor.cxx' object='fsq/fldigi-fsq_monitor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_monitor.o `test -f 'fsq/fsq_monitor.cxx' || echo '$(srcdir)/'`fsq/fsq_monitor.cxx fsq/fldigi-fsq_monitor.obj: fsq/fsq_monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_monitor.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo -c -o fsq/fldigi-fsq_monitor.obj `if test -f 'fsq/fsq_monitor.cxx'; then $(CYGPATH_W) 'fsq/fsq_monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_monitor.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo fsq/$(DEPDIR)/fldigi-fsq_monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_monitor.cxx' object='fsq/fldigi-fsq_monitor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_monitor.obj `if test -f 'fsq/fsq_monitor.cxx'; then $(CYGPATH_W) 'fsq/fsq_monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_monitor.cxx'; fi` globals/fldigi-globals.o: globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT globals/fldigi-globals.o -MD -MP -MF globals/$(DEPDIR)/fldigi-globals.Tpo -c -o globals/fldigi-globals.o `test -f 'globals/globals.cxx' || echo '$(srcdir)/'`globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) globals/$(DEPDIR)/fldigi-globals.Tpo globals/$(DEPDIR)/fldigi-globals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='globals/globals.cxx' object='globals/fldigi-globals.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o globals/fldigi-globals.o `test -f 'globals/globals.cxx' || echo '$(srcdir)/'`globals/globals.cxx globals/fldigi-globals.obj: globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT globals/fldigi-globals.obj -MD -MP -MF globals/$(DEPDIR)/fldigi-globals.Tpo -c -o globals/fldigi-globals.obj `if test -f 'globals/globals.cxx'; then $(CYGPATH_W) 'globals/globals.cxx'; else $(CYGPATH_W) '$(srcdir)/globals/globals.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) globals/$(DEPDIR)/fldigi-globals.Tpo globals/$(DEPDIR)/fldigi-globals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='globals/globals.cxx' object='globals/fldigi-globals.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o globals/fldigi-globals.obj `if test -f 'globals/globals.cxx'; then $(CYGPATH_W) 'globals/globals.cxx'; else $(CYGPATH_W) '$(srcdir)/globals/globals.cxx'; fi` ifkp/fldigi-ifkp.o: ifkp/ifkp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp.Tpo -c -o ifkp/fldigi-ifkp.o `test -f 'ifkp/ifkp.cxx' || echo '$(srcdir)/'`ifkp/ifkp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp.Tpo ifkp/$(DEPDIR)/fldigi-ifkp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp.cxx' object='ifkp/fldigi-ifkp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp.o `test -f 'ifkp/ifkp.cxx' || echo '$(srcdir)/'`ifkp/ifkp.cxx ifkp/fldigi-ifkp.obj: ifkp/ifkp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp.Tpo -c -o ifkp/fldigi-ifkp.obj `if test -f 'ifkp/ifkp.cxx'; then $(CYGPATH_W) 'ifkp/ifkp.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp.Tpo ifkp/$(DEPDIR)/fldigi-ifkp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp.cxx' object='ifkp/fldigi-ifkp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp.obj `if test -f 'ifkp/ifkp.cxx'; then $(CYGPATH_W) 'ifkp/ifkp.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp.cxx'; fi` ifkp/fldigi-tux.o: ifkp/tux.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-tux.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-tux.Tpo -c -o ifkp/fldigi-tux.o `test -f 'ifkp/tux.cxx' || echo '$(srcdir)/'`ifkp/tux.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-tux.Tpo ifkp/$(DEPDIR)/fldigi-tux.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/tux.cxx' object='ifkp/fldigi-tux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-tux.o `test -f 'ifkp/tux.cxx' || echo '$(srcdir)/'`ifkp/tux.cxx ifkp/fldigi-tux.obj: ifkp/tux.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-tux.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-tux.Tpo -c -o ifkp/fldigi-tux.obj `if test -f 'ifkp/tux.cxx'; then $(CYGPATH_W) 'ifkp/tux.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/tux.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-tux.Tpo ifkp/$(DEPDIR)/fldigi-tux.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/tux.cxx' object='ifkp/fldigi-tux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-tux.obj `if test -f 'ifkp/tux.cxx'; then $(CYGPATH_W) 'ifkp/tux.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/tux.cxx'; fi` irrxml/fldigi-irrXML.o: irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT irrxml/fldigi-irrXML.o -MD -MP -MF irrxml/$(DEPDIR)/fldigi-irrXML.Tpo -c -o irrxml/fldigi-irrXML.o `test -f 'irrxml/irrXML.cpp' || echo '$(srcdir)/'`irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) irrxml/$(DEPDIR)/fldigi-irrXML.Tpo irrxml/$(DEPDIR)/fldigi-irrXML.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='irrxml/irrXML.cpp' object='irrxml/fldigi-irrXML.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o irrxml/fldigi-irrXML.o `test -f 'irrxml/irrXML.cpp' || echo '$(srcdir)/'`irrxml/irrXML.cpp irrxml/fldigi-irrXML.obj: irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT irrxml/fldigi-irrXML.obj -MD -MP -MF irrxml/$(DEPDIR)/fldigi-irrXML.Tpo -c -o irrxml/fldigi-irrXML.obj `if test -f 'irrxml/irrXML.cpp'; then $(CYGPATH_W) 'irrxml/irrXML.cpp'; else $(CYGPATH_W) '$(srcdir)/irrxml/irrXML.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) irrxml/$(DEPDIR)/fldigi-irrXML.Tpo irrxml/$(DEPDIR)/fldigi-irrXML.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='irrxml/irrXML.cpp' object='irrxml/fldigi-irrXML.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o irrxml/fldigi-irrXML.obj `if test -f 'irrxml/irrXML.cpp'; then $(CYGPATH_W) 'irrxml/irrXML.cpp'; else $(CYGPATH_W) '$(srcdir)/irrxml/irrXML.cpp'; fi` logbook/fldigi-adif_io.o: logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-adif_io.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-adif_io.Tpo -c -o logbook/fldigi-adif_io.o `test -f 'logbook/adif_io.cxx' || echo '$(srcdir)/'`logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-adif_io.Tpo logbook/$(DEPDIR)/fldigi-adif_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/adif_io.cxx' object='logbook/fldigi-adif_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-adif_io.o `test -f 'logbook/adif_io.cxx' || echo '$(srcdir)/'`logbook/adif_io.cxx logbook/fldigi-adif_io.obj: logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-adif_io.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-adif_io.Tpo -c -o logbook/fldigi-adif_io.obj `if test -f 'logbook/adif_io.cxx'; then $(CYGPATH_W) 'logbook/adif_io.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/adif_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-adif_io.Tpo logbook/$(DEPDIR)/fldigi-adif_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/adif_io.cxx' object='logbook/fldigi-adif_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-adif_io.obj `if test -f 'logbook/adif_io.cxx'; then $(CYGPATH_W) 'logbook/adif_io.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/adif_io.cxx'; fi` logbook/fldigi-calendar.o: logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-calendar.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-calendar.Tpo -c -o logbook/fldigi-calendar.o `test -f 'logbook/calendar.cxx' || echo '$(srcdir)/'`logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-calendar.Tpo logbook/$(DEPDIR)/fldigi-calendar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/calendar.cxx' object='logbook/fldigi-calendar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-calendar.o `test -f 'logbook/calendar.cxx' || echo '$(srcdir)/'`logbook/calendar.cxx logbook/fldigi-calendar.obj: logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-calendar.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-calendar.Tpo -c -o logbook/fldigi-calendar.obj `if test -f 'logbook/calendar.cxx'; then $(CYGPATH_W) 'logbook/calendar.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/calendar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-calendar.Tpo logbook/$(DEPDIR)/fldigi-calendar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/calendar.cxx' object='logbook/fldigi-calendar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-calendar.obj `if test -f 'logbook/calendar.cxx'; then $(CYGPATH_W) 'logbook/calendar.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/calendar.cxx'; fi` logbook/fldigi-contest.o: logbook/contest.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-contest.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-contest.Tpo -c -o logbook/fldigi-contest.o `test -f 'logbook/contest.cxx' || echo '$(srcdir)/'`logbook/contest.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-contest.Tpo logbook/$(DEPDIR)/fldigi-contest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/contest.cxx' object='logbook/fldigi-contest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-contest.o `test -f 'logbook/contest.cxx' || echo '$(srcdir)/'`logbook/contest.cxx logbook/fldigi-contest.obj: logbook/contest.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-contest.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-contest.Tpo -c -o logbook/fldigi-contest.obj `if test -f 'logbook/contest.cxx'; then $(CYGPATH_W) 'logbook/contest.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/contest.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-contest.Tpo logbook/$(DEPDIR)/fldigi-contest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/contest.cxx' object='logbook/fldigi-contest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-contest.obj `if test -f 'logbook/contest.cxx'; then $(CYGPATH_W) 'logbook/contest.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/contest.cxx'; fi` logbook/fldigi-counties.o: logbook/counties.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-counties.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-counties.Tpo -c -o logbook/fldigi-counties.o `test -f 'logbook/counties.cxx' || echo '$(srcdir)/'`logbook/counties.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-counties.Tpo logbook/$(DEPDIR)/fldigi-counties.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/counties.cxx' object='logbook/fldigi-counties.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-counties.o `test -f 'logbook/counties.cxx' || echo '$(srcdir)/'`logbook/counties.cxx logbook/fldigi-counties.obj: logbook/counties.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-counties.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-counties.Tpo -c -o logbook/fldigi-counties.obj `if test -f 'logbook/counties.cxx'; then $(CYGPATH_W) 'logbook/counties.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/counties.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-counties.Tpo logbook/$(DEPDIR)/fldigi-counties.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/counties.cxx' object='logbook/fldigi-counties.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-counties.obj `if test -f 'logbook/counties.cxx'; then $(CYGPATH_W) 'logbook/counties.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/counties.cxx'; fi` logbook/fldigi-county_lists.o: logbook/county_lists.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-county_lists.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-county_lists.Tpo -c -o logbook/fldigi-county_lists.o `test -f 'logbook/county_lists.cxx' || echo '$(srcdir)/'`logbook/county_lists.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-county_lists.Tpo logbook/$(DEPDIR)/fldigi-county_lists.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/county_lists.cxx' object='logbook/fldigi-county_lists.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-county_lists.o `test -f 'logbook/county_lists.cxx' || echo '$(srcdir)/'`logbook/county_lists.cxx logbook/fldigi-county_lists.obj: logbook/county_lists.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-county_lists.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-county_lists.Tpo -c -o logbook/fldigi-county_lists.obj `if test -f 'logbook/county_lists.cxx'; then $(CYGPATH_W) 'logbook/county_lists.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/county_lists.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-county_lists.Tpo logbook/$(DEPDIR)/fldigi-county_lists.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/county_lists.cxx' object='logbook/fldigi-county_lists.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-county_lists.obj `if test -f 'logbook/county_lists.cxx'; then $(CYGPATH_W) 'logbook/county_lists.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/county_lists.cxx'; fi` logbook/fldigi-cty-dat.o: logbook/cty-dat.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-cty-dat.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-cty-dat.Tpo -c -o logbook/fldigi-cty-dat.o `test -f 'logbook/cty-dat.cxx' || echo '$(srcdir)/'`logbook/cty-dat.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-cty-dat.Tpo logbook/$(DEPDIR)/fldigi-cty-dat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/cty-dat.cxx' object='logbook/fldigi-cty-dat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-cty-dat.o `test -f 'logbook/cty-dat.cxx' || echo '$(srcdir)/'`logbook/cty-dat.cxx logbook/fldigi-cty-dat.obj: logbook/cty-dat.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-cty-dat.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-cty-dat.Tpo -c -o logbook/fldigi-cty-dat.obj `if test -f 'logbook/cty-dat.cxx'; then $(CYGPATH_W) 'logbook/cty-dat.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/cty-dat.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-cty-dat.Tpo logbook/$(DEPDIR)/fldigi-cty-dat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/cty-dat.cxx' object='logbook/fldigi-cty-dat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-cty-dat.obj `if test -f 'logbook/cty-dat.cxx'; then $(CYGPATH_W) 'logbook/cty-dat.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/cty-dat.cxx'; fi` logbook/fldigi-date.o: logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-date.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-date.Tpo -c -o logbook/fldigi-date.o `test -f 'logbook/date.cxx' || echo '$(srcdir)/'`logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-date.Tpo logbook/$(DEPDIR)/fldigi-date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/date.cxx' object='logbook/fldigi-date.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-date.o `test -f 'logbook/date.cxx' || echo '$(srcdir)/'`logbook/date.cxx logbook/fldigi-date.obj: logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-date.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-date.Tpo -c -o logbook/fldigi-date.obj `if test -f 'logbook/date.cxx'; then $(CYGPATH_W) 'logbook/date.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/date.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-date.Tpo logbook/$(DEPDIR)/fldigi-date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/date.cxx' object='logbook/fldigi-date.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-date.obj `if test -f 'logbook/date.cxx'; then $(CYGPATH_W) 'logbook/date.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/date.cxx'; fi` logbook/fldigi-fd_logger.o: logbook/fd_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_logger.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_logger.Tpo -c -o logbook/fldigi-fd_logger.o `test -f 'logbook/fd_logger.cxx' || echo '$(srcdir)/'`logbook/fd_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_logger.Tpo logbook/$(DEPDIR)/fldigi-fd_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_logger.cxx' object='logbook/fldigi-fd_logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_logger.o `test -f 'logbook/fd_logger.cxx' || echo '$(srcdir)/'`logbook/fd_logger.cxx logbook/fldigi-fd_logger.obj: logbook/fd_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_logger.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_logger.Tpo -c -o logbook/fldigi-fd_logger.obj `if test -f 'logbook/fd_logger.cxx'; then $(CYGPATH_W) 'logbook/fd_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_logger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_logger.Tpo logbook/$(DEPDIR)/fldigi-fd_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_logger.cxx' object='logbook/fldigi-fd_logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_logger.obj `if test -f 'logbook/fd_logger.cxx'; then $(CYGPATH_W) 'logbook/fd_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_logger.cxx'; fi` logbook/fldigi-fd_view.o: logbook/fd_view.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_view.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_view.Tpo -c -o logbook/fldigi-fd_view.o `test -f 'logbook/fd_view.cxx' || echo '$(srcdir)/'`logbook/fd_view.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_view.Tpo logbook/$(DEPDIR)/fldigi-fd_view.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_view.cxx' object='logbook/fldigi-fd_view.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_view.o `test -f 'logbook/fd_view.cxx' || echo '$(srcdir)/'`logbook/fd_view.cxx logbook/fldigi-fd_view.obj: logbook/fd_view.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_view.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_view.Tpo -c -o logbook/fldigi-fd_view.obj `if test -f 'logbook/fd_view.cxx'; then $(CYGPATH_W) 'logbook/fd_view.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_view.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_view.Tpo logbook/$(DEPDIR)/fldigi-fd_view.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_view.cxx' object='logbook/fldigi-fd_view.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_view.obj `if test -f 'logbook/fd_view.cxx'; then $(CYGPATH_W) 'logbook/fd_view.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_view.cxx'; fi` logbook/fldigi-lgbook.o: logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lgbook.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-lgbook.Tpo -c -o logbook/fldigi-lgbook.o `test -f 'logbook/lgbook.cxx' || echo '$(srcdir)/'`logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lgbook.Tpo logbook/$(DEPDIR)/fldigi-lgbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lgbook.cxx' object='logbook/fldigi-lgbook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lgbook.o `test -f 'logbook/lgbook.cxx' || echo '$(srcdir)/'`logbook/lgbook.cxx logbook/fldigi-lgbook.obj: logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lgbook.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-lgbook.Tpo -c -o logbook/fldigi-lgbook.obj `if test -f 'logbook/lgbook.cxx'; then $(CYGPATH_W) 'logbook/lgbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lgbook.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lgbook.Tpo logbook/$(DEPDIR)/fldigi-lgbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lgbook.cxx' object='logbook/fldigi-lgbook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lgbook.obj `if test -f 'logbook/lgbook.cxx'; then $(CYGPATH_W) 'logbook/lgbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lgbook.cxx'; fi` logbook/fldigi-logbook.o: logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logbook.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-logbook.Tpo -c -o logbook/fldigi-logbook.o `test -f 'logbook/logbook.cxx' || echo '$(srcdir)/'`logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logbook.Tpo logbook/$(DEPDIR)/fldigi-logbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logbook.cxx' object='logbook/fldigi-logbook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logbook.o `test -f 'logbook/logbook.cxx' || echo '$(srcdir)/'`logbook/logbook.cxx logbook/fldigi-logbook.obj: logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logbook.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-logbook.Tpo -c -o logbook/fldigi-logbook.obj `if test -f 'logbook/logbook.cxx'; then $(CYGPATH_W) 'logbook/logbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logbook.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logbook.Tpo logbook/$(DEPDIR)/fldigi-logbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logbook.cxx' object='logbook/fldigi-logbook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logbook.obj `if test -f 'logbook/logbook.cxx'; then $(CYGPATH_W) 'logbook/logbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logbook.cxx'; fi` logbook/fldigi-logsupport.o: logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logsupport.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-logsupport.Tpo -c -o logbook/fldigi-logsupport.o `test -f 'logbook/logsupport.cxx' || echo '$(srcdir)/'`logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logsupport.Tpo logbook/$(DEPDIR)/fldigi-logsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logsupport.cxx' object='logbook/fldigi-logsupport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logsupport.o `test -f 'logbook/logsupport.cxx' || echo '$(srcdir)/'`logbook/logsupport.cxx logbook/fldigi-logsupport.obj: logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logsupport.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-logsupport.Tpo -c -o logbook/fldigi-logsupport.obj `if test -f 'logbook/logsupport.cxx'; then $(CYGPATH_W) 'logbook/logsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logsupport.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logsupport.Tpo logbook/$(DEPDIR)/fldigi-logsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logsupport.cxx' object='logbook/fldigi-logsupport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logsupport.obj `if test -f 'logbook/logsupport.cxx'; then $(CYGPATH_W) 'logbook/logsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logsupport.cxx'; fi` logbook/fldigi-lookupcall.o: logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lookupcall.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-lookupcall.Tpo -c -o logbook/fldigi-lookupcall.o `test -f 'logbook/lookupcall.cxx' || echo '$(srcdir)/'`logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lookupcall.Tpo logbook/$(DEPDIR)/fldigi-lookupcall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lookupcall.cxx' object='logbook/fldigi-lookupcall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lookupcall.o `test -f 'logbook/lookupcall.cxx' || echo '$(srcdir)/'`logbook/lookupcall.cxx logbook/fldigi-lookupcall.obj: logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lookupcall.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-lookupcall.Tpo -c -o logbook/fldigi-lookupcall.obj `if test -f 'logbook/lookupcall.cxx'; then $(CYGPATH_W) 'logbook/lookupcall.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lookupcall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lookupcall.Tpo logbook/$(DEPDIR)/fldigi-lookupcall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lookupcall.cxx' object='logbook/fldigi-lookupcall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lookupcall.obj `if test -f 'logbook/lookupcall.cxx'; then $(CYGPATH_W) 'logbook/lookupcall.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lookupcall.cxx'; fi` logbook/fldigi-maclogger.o: logbook/maclogger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-maclogger.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-maclogger.Tpo -c -o logbook/fldigi-maclogger.o `test -f 'logbook/maclogger.cxx' || echo '$(srcdir)/'`logbook/maclogger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-maclogger.Tpo logbook/$(DEPDIR)/fldigi-maclogger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/maclogger.cxx' object='logbook/fldigi-maclogger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-maclogger.o `test -f 'logbook/maclogger.cxx' || echo '$(srcdir)/'`logbook/maclogger.cxx logbook/fldigi-maclogger.obj: logbook/maclogger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-maclogger.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-maclogger.Tpo -c -o logbook/fldigi-maclogger.obj `if test -f 'logbook/maclogger.cxx'; then $(CYGPATH_W) 'logbook/maclogger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/maclogger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-maclogger.Tpo logbook/$(DEPDIR)/fldigi-maclogger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/maclogger.cxx' object='logbook/fldigi-maclogger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-maclogger.obj `if test -f 'logbook/maclogger.cxx'; then $(CYGPATH_W) 'logbook/maclogger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/maclogger.cxx'; fi` logbook/fldigi-n3fjp_logger.o: logbook/n3fjp_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-n3fjp_logger.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo -c -o logbook/fldigi-n3fjp_logger.o `test -f 'logbook/n3fjp_logger.cxx' || echo '$(srcdir)/'`logbook/n3fjp_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/n3fjp_logger.cxx' object='logbook/fldigi-n3fjp_logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-n3fjp_logger.o `test -f 'logbook/n3fjp_logger.cxx' || echo '$(srcdir)/'`logbook/n3fjp_logger.cxx logbook/fldigi-n3fjp_logger.obj: logbook/n3fjp_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-n3fjp_logger.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo -c -o logbook/fldigi-n3fjp_logger.obj `if test -f 'logbook/n3fjp_logger.cxx'; then $(CYGPATH_W) 'logbook/n3fjp_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/n3fjp_logger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/n3fjp_logger.cxx' object='logbook/fldigi-n3fjp_logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-n3fjp_logger.obj `if test -f 'logbook/n3fjp_logger.cxx'; then $(CYGPATH_W) 'logbook/n3fjp_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/n3fjp_logger.cxx'; fi` logbook/fldigi-qrzlib.o: logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qrzlib.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-qrzlib.Tpo -c -o logbook/fldigi-qrzlib.o `test -f 'logbook/qrzlib.cxx' || echo '$(srcdir)/'`logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qrzlib.Tpo logbook/$(DEPDIR)/fldigi-qrzlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qrzlib.cxx' object='logbook/fldigi-qrzlib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qrzlib.o `test -f 'logbook/qrzlib.cxx' || echo '$(srcdir)/'`logbook/qrzlib.cxx logbook/fldigi-qrzlib.obj: logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qrzlib.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-qrzlib.Tpo -c -o logbook/fldigi-qrzlib.obj `if test -f 'logbook/qrzlib.cxx'; then $(CYGPATH_W) 'logbook/qrzlib.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qrzlib.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qrzlib.Tpo logbook/$(DEPDIR)/fldigi-qrzlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qrzlib.cxx' object='logbook/fldigi-qrzlib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qrzlib.obj `if test -f 'logbook/qrzlib.cxx'; then $(CYGPATH_W) 'logbook/qrzlib.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qrzlib.cxx'; fi` logbook/fldigi-qso_db.o: logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qso_db.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-qso_db.Tpo -c -o logbook/fldigi-qso_db.o `test -f 'logbook/qso_db.cxx' || echo '$(srcdir)/'`logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qso_db.Tpo logbook/$(DEPDIR)/fldigi-qso_db.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qso_db.cxx' object='logbook/fldigi-qso_db.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qso_db.o `test -f 'logbook/qso_db.cxx' || echo '$(srcdir)/'`logbook/qso_db.cxx logbook/fldigi-qso_db.obj: logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qso_db.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-qso_db.Tpo -c -o logbook/fldigi-qso_db.obj `if test -f 'logbook/qso_db.cxx'; then $(CYGPATH_W) 'logbook/qso_db.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qso_db.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qso_db.Tpo logbook/$(DEPDIR)/fldigi-qso_db.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qso_db.cxx' object='logbook/fldigi-qso_db.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qso_db.obj `if test -f 'logbook/qso_db.cxx'; then $(CYGPATH_W) 'logbook/qso_db.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qso_db.cxx'; fi` logbook/fldigi-table.o: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-table.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-table.Tpo -c -o logbook/fldigi-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-table.Tpo logbook/$(DEPDIR)/fldigi-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/fldigi-table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx logbook/fldigi-table.obj: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-table.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-table.Tpo -c -o logbook/fldigi-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-table.Tpo logbook/$(DEPDIR)/fldigi-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/fldigi-table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` logbook/fldigi-textio.o: logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-textio.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-textio.Tpo -c -o logbook/fldigi-textio.o `test -f 'logbook/textio.cxx' || echo '$(srcdir)/'`logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-textio.Tpo logbook/$(DEPDIR)/fldigi-textio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/textio.cxx' object='logbook/fldigi-textio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-textio.o `test -f 'logbook/textio.cxx' || echo '$(srcdir)/'`logbook/textio.cxx logbook/fldigi-textio.obj: logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-textio.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-textio.Tpo -c -o logbook/fldigi-textio.obj `if test -f 'logbook/textio.cxx'; then $(CYGPATH_W) 'logbook/textio.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/textio.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-textio.Tpo logbook/$(DEPDIR)/fldigi-textio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/textio.cxx' object='logbook/fldigi-textio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-textio.obj `if test -f 'logbook/textio.cxx'; then $(CYGPATH_W) 'logbook/textio.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/textio.cxx'; fi` logbook/fldigi-xmlrpc_log.o: logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-xmlrpc_log.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo -c -o logbook/fldigi-xmlrpc_log.o `test -f 'logbook/xmlrpc_log.cxx' || echo '$(srcdir)/'`logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/xmlrpc_log.cxx' object='logbook/fldigi-xmlrpc_log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-xmlrpc_log.o `test -f 'logbook/xmlrpc_log.cxx' || echo '$(srcdir)/'`logbook/xmlrpc_log.cxx logbook/fldigi-xmlrpc_log.obj: logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-xmlrpc_log.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo -c -o logbook/fldigi-xmlrpc_log.obj `if test -f 'logbook/xmlrpc_log.cxx'; then $(CYGPATH_W) 'logbook/xmlrpc_log.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/xmlrpc_log.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/xmlrpc_log.cxx' object='logbook/fldigi-xmlrpc_log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-xmlrpc_log.obj `if test -f 'logbook/xmlrpc_log.cxx'; then $(CYGPATH_W) 'logbook/xmlrpc_log.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/xmlrpc_log.cxx'; fi` logger/fldigi-logger.o: logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-logger.o -MD -MP -MF logger/$(DEPDIR)/fldigi-logger.Tpo -c -o logger/fldigi-logger.o `test -f 'logger/logger.cxx' || echo '$(srcdir)/'`logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-logger.Tpo logger/$(DEPDIR)/fldigi-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/logger.cxx' object='logger/fldigi-logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-logger.o `test -f 'logger/logger.cxx' || echo '$(srcdir)/'`logger/logger.cxx logger/fldigi-logger.obj: logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-logger.obj -MD -MP -MF logger/$(DEPDIR)/fldigi-logger.Tpo -c -o logger/fldigi-logger.obj `if test -f 'logger/logger.cxx'; then $(CYGPATH_W) 'logger/logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/logger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-logger.Tpo logger/$(DEPDIR)/fldigi-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/logger.cxx' object='logger/fldigi-logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-logger.obj `if test -f 'logger/logger.cxx'; then $(CYGPATH_W) 'logger/logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/logger.cxx'; fi` logger/fldigi-rx_extract.o: logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-rx_extract.o -MD -MP -MF logger/$(DEPDIR)/fldigi-rx_extract.Tpo -c -o logger/fldigi-rx_extract.o `test -f 'logger/rx_extract.cxx' || echo '$(srcdir)/'`logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-rx_extract.Tpo logger/$(DEPDIR)/fldigi-rx_extract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/rx_extract.cxx' object='logger/fldigi-rx_extract.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-rx_extract.o `test -f 'logger/rx_extract.cxx' || echo '$(srcdir)/'`logger/rx_extract.cxx logger/fldigi-rx_extract.obj: logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-rx_extract.obj -MD -MP -MF logger/$(DEPDIR)/fldigi-rx_extract.Tpo -c -o logger/fldigi-rx_extract.obj `if test -f 'logger/rx_extract.cxx'; then $(CYGPATH_W) 'logger/rx_extract.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/rx_extract.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-rx_extract.Tpo logger/$(DEPDIR)/fldigi-rx_extract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/rx_extract.cxx' object='logger/fldigi-rx_extract.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-rx_extract.obj `if test -f 'logger/rx_extract.cxx'; then $(CYGPATH_W) 'logger/rx_extract.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/rx_extract.cxx'; fi` logger/fldigi-speak.o: logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-speak.o -MD -MP -MF logger/$(DEPDIR)/fldigi-speak.Tpo -c -o logger/fldigi-speak.o `test -f 'logger/speak.cxx' || echo '$(srcdir)/'`logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-speak.Tpo logger/$(DEPDIR)/fldigi-speak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/speak.cxx' object='logger/fldigi-speak.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-speak.o `test -f 'logger/speak.cxx' || echo '$(srcdir)/'`logger/speak.cxx logger/fldigi-speak.obj: logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-speak.obj -MD -MP -MF logger/$(DEPDIR)/fldigi-speak.Tpo -c -o logger/fldigi-speak.obj `if test -f 'logger/speak.cxx'; then $(CYGPATH_W) 'logger/speak.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/speak.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-speak.Tpo logger/$(DEPDIR)/fldigi-speak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/speak.cxx' object='logger/fldigi-speak.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-speak.obj `if test -f 'logger/speak.cxx'; then $(CYGPATH_W) 'logger/speak.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/speak.cxx'; fi` fldigi-main.o: main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-main.o -MD -MP -MF $(DEPDIR)/fldigi-main.Tpo -c -o fldigi-main.o `test -f 'main.cxx' || echo '$(srcdir)/'`main.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-main.Tpo $(DEPDIR)/fldigi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cxx' object='fldigi-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-main.o `test -f 'main.cxx' || echo '$(srcdir)/'`main.cxx fldigi-main.obj: main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-main.obj -MD -MP -MF $(DEPDIR)/fldigi-main.Tpo -c -o fldigi-main.obj `if test -f 'main.cxx'; then $(CYGPATH_W) 'main.cxx'; else $(CYGPATH_W) '$(srcdir)/main.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-main.Tpo $(DEPDIR)/fldigi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cxx' object='fldigi-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-main.obj `if test -f 'main.cxx'; then $(CYGPATH_W) 'main.cxx'; else $(CYGPATH_W) '$(srcdir)/main.cxx'; fi` mfsk/fldigi-interleave.o: mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-interleave.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-interleave.Tpo -c -o mfsk/fldigi-interleave.o `test -f 'mfsk/interleave.cxx' || echo '$(srcdir)/'`mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-interleave.Tpo mfsk/$(DEPDIR)/fldigi-interleave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/interleave.cxx' object='mfsk/fldigi-interleave.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-interleave.o `test -f 'mfsk/interleave.cxx' || echo '$(srcdir)/'`mfsk/interleave.cxx mfsk/fldigi-interleave.obj: mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-interleave.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-interleave.Tpo -c -o mfsk/fldigi-interleave.obj `if test -f 'mfsk/interleave.cxx'; then $(CYGPATH_W) 'mfsk/interleave.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/interleave.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-interleave.Tpo mfsk/$(DEPDIR)/fldigi-interleave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/interleave.cxx' object='mfsk/fldigi-interleave.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-interleave.obj `if test -f 'mfsk/interleave.cxx'; then $(CYGPATH_W) 'mfsk/interleave.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/interleave.cxx'; fi` mfsk/fldigi-mfsk.o: mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk.Tpo -c -o mfsk/fldigi-mfsk.o `test -f 'mfsk/mfsk.cxx' || echo '$(srcdir)/'`mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk.Tpo mfsk/$(DEPDIR)/fldigi-mfsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk.cxx' object='mfsk/fldigi-mfsk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk.o `test -f 'mfsk/mfsk.cxx' || echo '$(srcdir)/'`mfsk/mfsk.cxx mfsk/fldigi-mfsk.obj: mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk.Tpo -c -o mfsk/fldigi-mfsk.obj `if test -f 'mfsk/mfsk.cxx'; then $(CYGPATH_W) 'mfsk/mfsk.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk.Tpo mfsk/$(DEPDIR)/fldigi-mfsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk.cxx' object='mfsk/fldigi-mfsk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk.obj `if test -f 'mfsk/mfsk.cxx'; then $(CYGPATH_W) 'mfsk/mfsk.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk.cxx'; fi` mfsk/fldigi-mfskvaricode.o: mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfskvaricode.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo -c -o mfsk/fldigi-mfskvaricode.o `test -f 'mfsk/mfskvaricode.cxx' || echo '$(srcdir)/'`mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfskvaricode.cxx' object='mfsk/fldigi-mfskvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfskvaricode.o `test -f 'mfsk/mfskvaricode.cxx' || echo '$(srcdir)/'`mfsk/mfskvaricode.cxx mfsk/fldigi-mfskvaricode.obj: mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfskvaricode.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo -c -o mfsk/fldigi-mfskvaricode.obj `if test -f 'mfsk/mfskvaricode.cxx'; then $(CYGPATH_W) 'mfsk/mfskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfskvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfskvaricode.cxx' object='mfsk/fldigi-mfskvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfskvaricode.obj `if test -f 'mfsk/mfskvaricode.cxx'; then $(CYGPATH_W) 'mfsk/mfskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfskvaricode.cxx'; fi` misc/fldigi-arq_io.o: misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-arq_io.o -MD -MP -MF misc/$(DEPDIR)/fldigi-arq_io.Tpo -c -o misc/fldigi-arq_io.o `test -f 'misc/arq_io.cxx' || echo '$(srcdir)/'`misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-arq_io.Tpo misc/$(DEPDIR)/fldigi-arq_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/arq_io.cxx' object='misc/fldigi-arq_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-arq_io.o `test -f 'misc/arq_io.cxx' || echo '$(srcdir)/'`misc/arq_io.cxx misc/fldigi-arq_io.obj: misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-arq_io.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-arq_io.Tpo -c -o misc/fldigi-arq_io.obj `if test -f 'misc/arq_io.cxx'; then $(CYGPATH_W) 'misc/arq_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/arq_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-arq_io.Tpo misc/$(DEPDIR)/fldigi-arq_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/arq_io.cxx' object='misc/fldigi-arq_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-arq_io.obj `if test -f 'misc/arq_io.cxx'; then $(CYGPATH_W) 'misc/arq_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/arq_io.cxx'; fi` misc/fldigi-ascii.o: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ascii.o -MD -MP -MF misc/$(DEPDIR)/fldigi-ascii.Tpo -c -o misc/fldigi-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ascii.Tpo misc/$(DEPDIR)/fldigi-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/fldigi-ascii.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx misc/fldigi-ascii.obj: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ascii.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-ascii.Tpo -c -o misc/fldigi-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ascii.Tpo misc/$(DEPDIR)/fldigi-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/fldigi-ascii.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` misc/fldigi-ax25_decode.o: misc/ax25_decode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ax25_decode.o -MD -MP -MF misc/$(DEPDIR)/fldigi-ax25_decode.Tpo -c -o misc/fldigi-ax25_decode.o `test -f 'misc/ax25_decode.cxx' || echo '$(srcdir)/'`misc/ax25_decode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ax25_decode.Tpo misc/$(DEPDIR)/fldigi-ax25_decode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ax25_decode.cxx' object='misc/fldigi-ax25_decode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ax25_decode.o `test -f 'misc/ax25_decode.cxx' || echo '$(srcdir)/'`misc/ax25_decode.cxx misc/fldigi-ax25_decode.obj: misc/ax25_decode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ax25_decode.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-ax25_decode.Tpo -c -o misc/fldigi-ax25_decode.obj `if test -f 'misc/ax25_decode.cxx'; then $(CYGPATH_W) 'misc/ax25_decode.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ax25_decode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ax25_decode.Tpo misc/$(DEPDIR)/fldigi-ax25_decode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ax25_decode.cxx' object='misc/fldigi-ax25_decode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ax25_decode.obj `if test -f 'misc/ax25_decode.cxx'; then $(CYGPATH_W) 'misc/ax25_decode.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ax25_decode.cxx'; fi` misc/fldigi-charsetdistiller.o: misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetdistiller.o -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo -c -o misc/fldigi-charsetdistiller.o `test -f 'misc/charsetdistiller.cxx' || echo '$(srcdir)/'`misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo misc/$(DEPDIR)/fldigi-charsetdistiller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetdistiller.cxx' object='misc/fldigi-charsetdistiller.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetdistiller.o `test -f 'misc/charsetdistiller.cxx' || echo '$(srcdir)/'`misc/charsetdistiller.cxx misc/fldigi-charsetdistiller.obj: misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetdistiller.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo -c -o misc/fldigi-charsetdistiller.obj `if test -f 'misc/charsetdistiller.cxx'; then $(CYGPATH_W) 'misc/charsetdistiller.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetdistiller.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo misc/$(DEPDIR)/fldigi-charsetdistiller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetdistiller.cxx' object='misc/fldigi-charsetdistiller.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetdistiller.obj `if test -f 'misc/charsetdistiller.cxx'; then $(CYGPATH_W) 'misc/charsetdistiller.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetdistiller.cxx'; fi` misc/fldigi-charsetlist.o: misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetlist.o -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetlist.Tpo -c -o misc/fldigi-charsetlist.o `test -f 'misc/charsetlist.cxx' || echo '$(srcdir)/'`misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetlist.Tpo misc/$(DEPDIR)/fldigi-charsetlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetlist.cxx' object='misc/fldigi-charsetlist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetlist.o `test -f 'misc/charsetlist.cxx' || echo '$(srcdir)/'`misc/charsetlist.cxx misc/fldigi-charsetlist.obj: misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetlist.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetlist.Tpo -c -o misc/fldigi-charsetlist.obj `if test -f 'misc/charsetlist.cxx'; then $(CYGPATH_W) 'misc/charsetlist.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetlist.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetlist.Tpo misc/$(DEPDIR)/fldigi-charsetlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetlist.cxx' object='misc/fldigi-charsetlist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetlist.obj `if test -f 'misc/charsetlist.cxx'; then $(CYGPATH_W) 'misc/charsetlist.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetlist.cxx'; fi` misc/fldigi-configuration.o: misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-configuration.o -MD -MP -MF misc/$(DEPDIR)/fldigi-configuration.Tpo -c -o misc/fldigi-configuration.o `test -f 'misc/configuration.cxx' || echo '$(srcdir)/'`misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-configuration.Tpo misc/$(DEPDIR)/fldigi-configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/configuration.cxx' object='misc/fldigi-configuration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-configuration.o `test -f 'misc/configuration.cxx' || echo '$(srcdir)/'`misc/configuration.cxx misc/fldigi-configuration.obj: misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-configuration.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-configuration.Tpo -c -o misc/fldigi-configuration.obj `if test -f 'misc/configuration.cxx'; then $(CYGPATH_W) 'misc/configuration.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/configuration.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-configuration.Tpo misc/$(DEPDIR)/fldigi-configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/configuration.cxx' object='misc/fldigi-configuration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-configuration.obj `if test -f 'misc/configuration.cxx'; then $(CYGPATH_W) 'misc/configuration.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/configuration.cxx'; fi` misc/fldigi-coordinate.o: misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-coordinate.o -MD -MP -MF misc/$(DEPDIR)/fldigi-coordinate.Tpo -c -o misc/fldigi-coordinate.o `test -f 'misc/coordinate.cxx' || echo '$(srcdir)/'`misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-coordinate.Tpo misc/$(DEPDIR)/fldigi-coordinate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/coordinate.cxx' object='misc/fldigi-coordinate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-coordinate.o `test -f 'misc/coordinate.cxx' || echo '$(srcdir)/'`misc/coordinate.cxx misc/fldigi-coordinate.obj: misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-coordinate.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-coordinate.Tpo -c -o misc/fldigi-coordinate.obj `if test -f 'misc/coordinate.cxx'; then $(CYGPATH_W) 'misc/coordinate.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/coordinate.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-coordinate.Tpo misc/$(DEPDIR)/fldigi-coordinate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/coordinate.cxx' object='misc/fldigi-coordinate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-coordinate.obj `if test -f 'misc/coordinate.cxx'; then $(CYGPATH_W) 'misc/coordinate.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/coordinate.cxx'; fi` misc/fldigi-debug.o: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-debug.o -MD -MP -MF misc/$(DEPDIR)/fldigi-debug.Tpo -c -o misc/fldigi-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-debug.Tpo misc/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='misc/fldigi-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx misc/fldigi-debug.obj: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-debug.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-debug.Tpo -c -o misc/fldigi-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-debug.Tpo misc/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='misc/fldigi-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` misc/fldigi-dxcc.o: misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-dxcc.o -MD -MP -MF misc/$(DEPDIR)/fldigi-dxcc.Tpo -c -o misc/fldigi-dxcc.o `test -f 'misc/dxcc.cxx' || echo '$(srcdir)/'`misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-dxcc.Tpo misc/$(DEPDIR)/fldigi-dxcc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/dxcc.cxx' object='misc/fldigi-dxcc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-dxcc.o `test -f 'misc/dxcc.cxx' || echo '$(srcdir)/'`misc/dxcc.cxx misc/fldigi-dxcc.obj: misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-dxcc.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-dxcc.Tpo -c -o misc/fldigi-dxcc.obj `if test -f 'misc/dxcc.cxx'; then $(CYGPATH_W) 'misc/dxcc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/dxcc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-dxcc.Tpo misc/$(DEPDIR)/fldigi-dxcc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/dxcc.cxx' object='misc/fldigi-dxcc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-dxcc.obj `if test -f 'misc/dxcc.cxx'; then $(CYGPATH_W) 'misc/dxcc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/dxcc.cxx'; fi` misc/fldigi-estrings.o: misc/estrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-estrings.o -MD -MP -MF misc/$(DEPDIR)/fldigi-estrings.Tpo -c -o misc/fldigi-estrings.o `test -f 'misc/estrings.cxx' || echo '$(srcdir)/'`misc/estrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-estrings.Tpo misc/$(DEPDIR)/fldigi-estrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/estrings.cxx' object='misc/fldigi-estrings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-estrings.o `test -f 'misc/estrings.cxx' || echo '$(srcdir)/'`misc/estrings.cxx misc/fldigi-estrings.obj: misc/estrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-estrings.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-estrings.Tpo -c -o misc/fldigi-estrings.obj `if test -f 'misc/estrings.cxx'; then $(CYGPATH_W) 'misc/estrings.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/estrings.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-estrings.Tpo misc/$(DEPDIR)/fldigi-estrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/estrings.cxx' object='misc/fldigi-estrings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-estrings.obj `if test -f 'misc/estrings.cxx'; then $(CYGPATH_W) 'misc/estrings.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/estrings.cxx'; fi` misc/fldigi-icons.o: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-icons.o -MD -MP -MF misc/$(DEPDIR)/fldigi-icons.Tpo -c -o misc/fldigi-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-icons.Tpo misc/$(DEPDIR)/fldigi-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/fldigi-icons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx misc/fldigi-icons.obj: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-icons.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-icons.Tpo -c -o misc/fldigi-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-icons.Tpo misc/$(DEPDIR)/fldigi-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/fldigi-icons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` misc/fldigi-kiss_io.o: misc/kiss_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-kiss_io.o -MD -MP -MF misc/$(DEPDIR)/fldigi-kiss_io.Tpo -c -o misc/fldigi-kiss_io.o `test -f 'misc/kiss_io.cxx' || echo '$(srcdir)/'`misc/kiss_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-kiss_io.Tpo misc/$(DEPDIR)/fldigi-kiss_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kiss_io.cxx' object='misc/fldigi-kiss_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-kiss_io.o `test -f 'misc/kiss_io.cxx' || echo '$(srcdir)/'`misc/kiss_io.cxx misc/fldigi-kiss_io.obj: misc/kiss_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-kiss_io.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-kiss_io.Tpo -c -o misc/fldigi-kiss_io.obj `if test -f 'misc/kiss_io.cxx'; then $(CYGPATH_W) 'misc/kiss_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kiss_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-kiss_io.Tpo misc/$(DEPDIR)/fldigi-kiss_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kiss_io.cxx' object='misc/fldigi-kiss_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-kiss_io.obj `if test -f 'misc/kiss_io.cxx'; then $(CYGPATH_W) 'misc/kiss_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kiss_io.cxx'; fi` misc/fldigi-kmlserver.o: misc/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-kmlserver.o -MD -MP -MF misc/$(DEPDIR)/fldigi-kmlserver.Tpo -c -o misc/fldigi-kmlserver.o `test -f 'misc/kmlserver.cxx' || echo '$(srcdir)/'`misc/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-kmlserver.Tpo misc/$(DEPDIR)/fldigi-kmlserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kmlserver.cxx' object='misc/fldigi-kmlserver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-kmlserver.o `test -f 'misc/kmlserver.cxx' || echo '$(srcdir)/'`misc/kmlserver.cxx misc/fldigi-kmlserver.obj: misc/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-kmlserver.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-kmlserver.Tpo -c -o misc/fldigi-kmlserver.obj `if test -f 'misc/kmlserver.cxx'; then $(CYGPATH_W) 'misc/kmlserver.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kmlserver.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-kmlserver.Tpo misc/$(DEPDIR)/fldigi-kmlserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kmlserver.cxx' object='misc/fldigi-kmlserver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-kmlserver.obj `if test -f 'misc/kmlserver.cxx'; then $(CYGPATH_W) 'misc/kmlserver.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kmlserver.cxx'; fi` misc/fldigi-locator.o: misc/locator.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-locator.o -MD -MP -MF misc/$(DEPDIR)/fldigi-locator.Tpo -c -o misc/fldigi-locator.o `test -f 'misc/locator.cxx' || echo '$(srcdir)/'`misc/locator.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-locator.Tpo misc/$(DEPDIR)/fldigi-locator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/locator.cxx' object='misc/fldigi-locator.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-locator.o `test -f 'misc/locator.cxx' || echo '$(srcdir)/'`misc/locator.cxx misc/fldigi-locator.obj: misc/locator.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-locator.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-locator.Tpo -c -o misc/fldigi-locator.obj `if test -f 'misc/locator.cxx'; then $(CYGPATH_W) 'misc/locator.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/locator.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-locator.Tpo misc/$(DEPDIR)/fldigi-locator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/locator.cxx' object='misc/fldigi-locator.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-locator.obj `if test -f 'misc/locator.cxx'; then $(CYGPATH_W) 'misc/locator.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/locator.cxx'; fi` misc/fldigi-log.o: misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-log.o -MD -MP -MF misc/$(DEPDIR)/fldigi-log.Tpo -c -o misc/fldigi-log.o `test -f 'misc/log.cxx' || echo '$(srcdir)/'`misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-log.Tpo misc/$(DEPDIR)/fldigi-log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/log.cxx' object='misc/fldigi-log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-log.o `test -f 'misc/log.cxx' || echo '$(srcdir)/'`misc/log.cxx misc/fldigi-log.obj: misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-log.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-log.Tpo -c -o misc/fldigi-log.obj `if test -f 'misc/log.cxx'; then $(CYGPATH_W) 'misc/log.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/log.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-log.Tpo misc/$(DEPDIR)/fldigi-log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/log.cxx' object='misc/fldigi-log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-log.obj `if test -f 'misc/log.cxx'; then $(CYGPATH_W) 'misc/log.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/log.cxx'; fi` misc/fldigi-macroedit.o: misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macroedit.o -MD -MP -MF misc/$(DEPDIR)/fldigi-macroedit.Tpo -c -o misc/fldigi-macroedit.o `test -f 'misc/macroedit.cxx' || echo '$(srcdir)/'`misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macroedit.Tpo misc/$(DEPDIR)/fldigi-macroedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macroedit.cxx' object='misc/fldigi-macroedit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macroedit.o `test -f 'misc/macroedit.cxx' || echo '$(srcdir)/'`misc/macroedit.cxx misc/fldigi-macroedit.obj: misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macroedit.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-macroedit.Tpo -c -o misc/fldigi-macroedit.obj `if test -f 'misc/macroedit.cxx'; then $(CYGPATH_W) 'misc/macroedit.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macroedit.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macroedit.Tpo misc/$(DEPDIR)/fldigi-macroedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macroedit.cxx' object='misc/fldigi-macroedit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macroedit.obj `if test -f 'misc/macroedit.cxx'; then $(CYGPATH_W) 'misc/macroedit.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macroedit.cxx'; fi` misc/fldigi-macros.o: misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macros.o -MD -MP -MF misc/$(DEPDIR)/fldigi-macros.Tpo -c -o misc/fldigi-macros.o `test -f 'misc/macros.cxx' || echo '$(srcdir)/'`misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macros.Tpo misc/$(DEPDIR)/fldigi-macros.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macros.cxx' object='misc/fldigi-macros.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macros.o `test -f 'misc/macros.cxx' || echo '$(srcdir)/'`misc/macros.cxx misc/fldigi-macros.obj: misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macros.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-macros.Tpo -c -o misc/fldigi-macros.obj `if test -f 'misc/macros.cxx'; then $(CYGPATH_W) 'misc/macros.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macros.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macros.Tpo misc/$(DEPDIR)/fldigi-macros.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macros.cxx' object='misc/fldigi-macros.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macros.obj `if test -f 'misc/macros.cxx'; then $(CYGPATH_W) 'misc/macros.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macros.cxx'; fi` misc/fldigi-misc.o: misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-misc.o -MD -MP -MF misc/$(DEPDIR)/fldigi-misc.Tpo -c -o misc/fldigi-misc.o `test -f 'misc/misc.cxx' || echo '$(srcdir)/'`misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-misc.Tpo misc/$(DEPDIR)/fldigi-misc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/misc.cxx' object='misc/fldigi-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-misc.o `test -f 'misc/misc.cxx' || echo '$(srcdir)/'`misc/misc.cxx misc/fldigi-misc.obj: misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-misc.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-misc.Tpo -c -o misc/fldigi-misc.obj `if test -f 'misc/misc.cxx'; then $(CYGPATH_W) 'misc/misc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/misc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-misc.Tpo misc/$(DEPDIR)/fldigi-misc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/misc.cxx' object='misc/fldigi-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-misc.obj `if test -f 'misc/misc.cxx'; then $(CYGPATH_W) 'misc/misc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/misc.cxx'; fi` misc/fldigi-newinstall.o: misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-newinstall.o -MD -MP -MF misc/$(DEPDIR)/fldigi-newinstall.Tpo -c -o misc/fldigi-newinstall.o `test -f 'misc/newinstall.cxx' || echo '$(srcdir)/'`misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-newinstall.Tpo misc/$(DEPDIR)/fldigi-newinstall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/newinstall.cxx' object='misc/fldigi-newinstall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-newinstall.o `test -f 'misc/newinstall.cxx' || echo '$(srcdir)/'`misc/newinstall.cxx misc/fldigi-newinstall.obj: misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-newinstall.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-newinstall.Tpo -c -o misc/fldigi-newinstall.obj `if test -f 'misc/newinstall.cxx'; then $(CYGPATH_W) 'misc/newinstall.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/newinstall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-newinstall.Tpo misc/$(DEPDIR)/fldigi-newinstall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/newinstall.cxx' object='misc/fldigi-newinstall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-newinstall.obj `if test -f 'misc/newinstall.cxx'; then $(CYGPATH_W) 'misc/newinstall.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/newinstall.cxx'; fi` misc/fldigi-outputencoder.o: misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-outputencoder.o -MD -MP -MF misc/$(DEPDIR)/fldigi-outputencoder.Tpo -c -o misc/fldigi-outputencoder.o `test -f 'misc/outputencoder.cxx' || echo '$(srcdir)/'`misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-outputencoder.Tpo misc/$(DEPDIR)/fldigi-outputencoder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/outputencoder.cxx' object='misc/fldigi-outputencoder.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-outputencoder.o `test -f 'misc/outputencoder.cxx' || echo '$(srcdir)/'`misc/outputencoder.cxx misc/fldigi-outputencoder.obj: misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-outputencoder.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-outputencoder.Tpo -c -o misc/fldigi-outputencoder.obj `if test -f 'misc/outputencoder.cxx'; then $(CYGPATH_W) 'misc/outputencoder.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/outputencoder.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-outputencoder.Tpo misc/$(DEPDIR)/fldigi-outputencoder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/outputencoder.cxx' object='misc/fldigi-outputencoder.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-outputencoder.obj `if test -f 'misc/outputencoder.cxx'; then $(CYGPATH_W) 'misc/outputencoder.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/outputencoder.cxx'; fi` misc/fldigi-pixmaps.o: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps.o -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps.Tpo -c -o misc/fldigi-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps.Tpo misc/$(DEPDIR)/fldigi-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/fldigi-pixmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx misc/fldigi-pixmaps.obj: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps.Tpo -c -o misc/fldigi-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps.Tpo misc/$(DEPDIR)/fldigi-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/fldigi-pixmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` misc/fldigi-pixmaps_tango.o: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps_tango.o -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo -c -o misc/fldigi-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo misc/$(DEPDIR)/fldigi-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/fldigi-pixmaps_tango.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx misc/fldigi-pixmaps_tango.obj: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps_tango.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo -c -o misc/fldigi-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo misc/$(DEPDIR)/fldigi-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/fldigi-pixmaps_tango.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` misc/fldigi-record_loader.o: misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-record_loader.o -MD -MP -MF misc/$(DEPDIR)/fldigi-record_loader.Tpo -c -o misc/fldigi-record_loader.o `test -f 'misc/record_loader.cxx' || echo '$(srcdir)/'`misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-record_loader.Tpo misc/$(DEPDIR)/fldigi-record_loader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/record_loader.cxx' object='misc/fldigi-record_loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-record_loader.o `test -f 'misc/record_loader.cxx' || echo '$(srcdir)/'`misc/record_loader.cxx misc/fldigi-record_loader.obj: misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-record_loader.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-record_loader.Tpo -c -o misc/fldigi-record_loader.obj `if test -f 'misc/record_loader.cxx'; then $(CYGPATH_W) 'misc/record_loader.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/record_loader.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-record_loader.Tpo misc/$(DEPDIR)/fldigi-record_loader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/record_loader.cxx' object='misc/fldigi-record_loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-record_loader.obj `if test -f 'misc/record_loader.cxx'; then $(CYGPATH_W) 'misc/record_loader.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/record_loader.cxx'; fi` misc/fldigi-re.o: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-re.o -MD -MP -MF misc/$(DEPDIR)/fldigi-re.Tpo -c -o misc/fldigi-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-re.Tpo misc/$(DEPDIR)/fldigi-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/fldigi-re.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx misc/fldigi-re.obj: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-re.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-re.Tpo -c -o misc/fldigi-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-re.Tpo misc/$(DEPDIR)/fldigi-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/fldigi-re.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` misc/fldigi-stacktrace.o: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stacktrace.o -MD -MP -MF misc/$(DEPDIR)/fldigi-stacktrace.Tpo -c -o misc/fldigi-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stacktrace.Tpo misc/$(DEPDIR)/fldigi-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/fldigi-stacktrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx misc/fldigi-stacktrace.obj: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stacktrace.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-stacktrace.Tpo -c -o misc/fldigi-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stacktrace.Tpo misc/$(DEPDIR)/fldigi-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/fldigi-stacktrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` misc/fldigi-status.o: misc/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-status.o -MD -MP -MF misc/$(DEPDIR)/fldigi-status.Tpo -c -o misc/fldigi-status.o `test -f 'misc/status.cxx' || echo '$(srcdir)/'`misc/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-status.Tpo misc/$(DEPDIR)/fldigi-status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/status.cxx' object='misc/fldigi-status.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-status.o `test -f 'misc/status.cxx' || echo '$(srcdir)/'`misc/status.cxx misc/fldigi-status.obj: misc/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-status.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-status.Tpo -c -o misc/fldigi-status.obj `if test -f 'misc/status.cxx'; then $(CYGPATH_W) 'misc/status.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/status.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-status.Tpo misc/$(DEPDIR)/fldigi-status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/status.cxx' object='misc/fldigi-status.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-status.obj `if test -f 'misc/status.cxx'; then $(CYGPATH_W) 'misc/status.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/status.cxx'; fi` misc/fldigi-strutil.o: misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-strutil.o -MD -MP -MF misc/$(DEPDIR)/fldigi-strutil.Tpo -c -o misc/fldigi-strutil.o `test -f 'misc/strutil.cxx' || echo '$(srcdir)/'`misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-strutil.Tpo misc/$(DEPDIR)/fldigi-strutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/strutil.cxx' object='misc/fldigi-strutil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-strutil.o `test -f 'misc/strutil.cxx' || echo '$(srcdir)/'`misc/strutil.cxx misc/fldigi-strutil.obj: misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-strutil.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-strutil.Tpo -c -o misc/fldigi-strutil.obj `if test -f 'misc/strutil.cxx'; then $(CYGPATH_W) 'misc/strutil.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/strutil.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-strutil.Tpo misc/$(DEPDIR)/fldigi-strutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/strutil.cxx' object='misc/fldigi-strutil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-strutil.obj `if test -f 'misc/strutil.cxx'; then $(CYGPATH_W) 'misc/strutil.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/strutil.cxx'; fi` misc/fldigi-threads.o: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-threads.o -MD -MP -MF misc/$(DEPDIR)/fldigi-threads.Tpo -c -o misc/fldigi-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-threads.Tpo misc/$(DEPDIR)/fldigi-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/fldigi-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx misc/fldigi-threads.obj: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-threads.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-threads.Tpo -c -o misc/fldigi-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-threads.Tpo misc/$(DEPDIR)/fldigi-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/fldigi-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` misc/fldigi-timeops.o: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-timeops.o -MD -MP -MF misc/$(DEPDIR)/fldigi-timeops.Tpo -c -o misc/fldigi-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-timeops.Tpo misc/$(DEPDIR)/fldigi-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/fldigi-timeops.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx misc/fldigi-timeops.obj: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-timeops.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-timeops.Tpo -c -o misc/fldigi-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-timeops.Tpo misc/$(DEPDIR)/fldigi-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/fldigi-timeops.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` misc/fldigi-utf8file_io.o: misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-utf8file_io.o -MD -MP -MF misc/$(DEPDIR)/fldigi-utf8file_io.Tpo -c -o misc/fldigi-utf8file_io.o `test -f 'misc/utf8file_io.cxx' || echo '$(srcdir)/'`misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-utf8file_io.Tpo misc/$(DEPDIR)/fldigi-utf8file_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/utf8file_io.cxx' object='misc/fldigi-utf8file_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-utf8file_io.o `test -f 'misc/utf8file_io.cxx' || echo '$(srcdir)/'`misc/utf8file_io.cxx misc/fldigi-utf8file_io.obj: misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-utf8file_io.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-utf8file_io.Tpo -c -o misc/fldigi-utf8file_io.obj `if test -f 'misc/utf8file_io.cxx'; then $(CYGPATH_W) 'misc/utf8file_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/utf8file_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-utf8file_io.Tpo misc/$(DEPDIR)/fldigi-utf8file_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/utf8file_io.cxx' object='misc/fldigi-utf8file_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-utf8file_io.obj `if test -f 'misc/utf8file_io.cxx'; then $(CYGPATH_W) 'misc/utf8file_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/utf8file_io.cxx'; fi` misc/fldigi-util.o: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-util.o -MD -MP -MF misc/$(DEPDIR)/fldigi-util.Tpo -c -o misc/fldigi-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-util.Tpo misc/$(DEPDIR)/fldigi-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/fldigi-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx misc/fldigi-util.obj: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-util.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-util.Tpo -c -o misc/fldigi-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-util.Tpo misc/$(DEPDIR)/fldigi-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/fldigi-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` mt63/fldigi-dsp.o: mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-dsp.o -MD -MP -MF mt63/$(DEPDIR)/fldigi-dsp.Tpo -c -o mt63/fldigi-dsp.o `test -f 'mt63/dsp.cxx' || echo '$(srcdir)/'`mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-dsp.Tpo mt63/$(DEPDIR)/fldigi-dsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/dsp.cxx' object='mt63/fldigi-dsp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-dsp.o `test -f 'mt63/dsp.cxx' || echo '$(srcdir)/'`mt63/dsp.cxx mt63/fldigi-dsp.obj: mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-dsp.obj -MD -MP -MF mt63/$(DEPDIR)/fldigi-dsp.Tpo -c -o mt63/fldigi-dsp.obj `if test -f 'mt63/dsp.cxx'; then $(CYGPATH_W) 'mt63/dsp.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/dsp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-dsp.Tpo mt63/$(DEPDIR)/fldigi-dsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/dsp.cxx' object='mt63/fldigi-dsp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-dsp.obj `if test -f 'mt63/dsp.cxx'; then $(CYGPATH_W) 'mt63/dsp.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/dsp.cxx'; fi` mt63/fldigi-mt63base.o: mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63base.o -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63base.Tpo -c -o mt63/fldigi-mt63base.o `test -f 'mt63/mt63base.cxx' || echo '$(srcdir)/'`mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63base.Tpo mt63/$(DEPDIR)/fldigi-mt63base.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63base.cxx' object='mt63/fldigi-mt63base.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63base.o `test -f 'mt63/mt63base.cxx' || echo '$(srcdir)/'`mt63/mt63base.cxx mt63/fldigi-mt63base.obj: mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63base.obj -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63base.Tpo -c -o mt63/fldigi-mt63base.obj `if test -f 'mt63/mt63base.cxx'; then $(CYGPATH_W) 'mt63/mt63base.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63base.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63base.Tpo mt63/$(DEPDIR)/fldigi-mt63base.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63base.cxx' object='mt63/fldigi-mt63base.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63base.obj `if test -f 'mt63/mt63base.cxx'; then $(CYGPATH_W) 'mt63/mt63base.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63base.cxx'; fi` mt63/fldigi-mt63.o: mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63.o -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63.Tpo -c -o mt63/fldigi-mt63.o `test -f 'mt63/mt63.cxx' || echo '$(srcdir)/'`mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63.Tpo mt63/$(DEPDIR)/fldigi-mt63.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63.cxx' object='mt63/fldigi-mt63.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63.o `test -f 'mt63/mt63.cxx' || echo '$(srcdir)/'`mt63/mt63.cxx mt63/fldigi-mt63.obj: mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63.obj -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63.Tpo -c -o mt63/fldigi-mt63.obj `if test -f 'mt63/mt63.cxx'; then $(CYGPATH_W) 'mt63/mt63.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63.Tpo mt63/$(DEPDIR)/fldigi-mt63.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63.cxx' object='mt63/fldigi-mt63.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63.obj `if test -f 'mt63/mt63.cxx'; then $(CYGPATH_W) 'mt63/mt63.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63.cxx'; fi` navtex/fldigi-navtex.o: navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT navtex/fldigi-navtex.o -MD -MP -MF navtex/$(DEPDIR)/fldigi-navtex.Tpo -c -o navtex/fldigi-navtex.o `test -f 'navtex/navtex.cxx' || echo '$(srcdir)/'`navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) navtex/$(DEPDIR)/fldigi-navtex.Tpo navtex/$(DEPDIR)/fldigi-navtex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='navtex/navtex.cxx' object='navtex/fldigi-navtex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o navtex/fldigi-navtex.o `test -f 'navtex/navtex.cxx' || echo '$(srcdir)/'`navtex/navtex.cxx navtex/fldigi-navtex.obj: navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT navtex/fldigi-navtex.obj -MD -MP -MF navtex/$(DEPDIR)/fldigi-navtex.Tpo -c -o navtex/fldigi-navtex.obj `if test -f 'navtex/navtex.cxx'; then $(CYGPATH_W) 'navtex/navtex.cxx'; else $(CYGPATH_W) '$(srcdir)/navtex/navtex.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) navtex/$(DEPDIR)/fldigi-navtex.Tpo navtex/$(DEPDIR)/fldigi-navtex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='navtex/navtex.cxx' object='navtex/fldigi-navtex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o navtex/fldigi-navtex.obj `if test -f 'navtex/navtex.cxx'; then $(CYGPATH_W) 'navtex/navtex.cxx'; else $(CYGPATH_W) '$(srcdir)/navtex/navtex.cxx'; fi` network/fldigi-ca_cert.o: network/ca_cert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-ca_cert.o -MD -MP -MF network/$(DEPDIR)/fldigi-ca_cert.Tpo -c -o network/fldigi-ca_cert.o `test -f 'network/ca_cert.cxx' || echo '$(srcdir)/'`network/ca_cert.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-ca_cert.Tpo network/$(DEPDIR)/fldigi-ca_cert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/ca_cert.cxx' object='network/fldigi-ca_cert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-ca_cert.o `test -f 'network/ca_cert.cxx' || echo '$(srcdir)/'`network/ca_cert.cxx network/fldigi-ca_cert.obj: network/ca_cert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-ca_cert.obj -MD -MP -MF network/$(DEPDIR)/fldigi-ca_cert.Tpo -c -o network/fldigi-ca_cert.obj `if test -f 'network/ca_cert.cxx'; then $(CYGPATH_W) 'network/ca_cert.cxx'; else $(CYGPATH_W) '$(srcdir)/network/ca_cert.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-ca_cert.Tpo network/$(DEPDIR)/fldigi-ca_cert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/ca_cert.cxx' object='network/fldigi-ca_cert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-ca_cert.obj `if test -f 'network/ca_cert.cxx'; then $(CYGPATH_W) 'network/ca_cert.cxx'; else $(CYGPATH_W) '$(srcdir)/network/ca_cert.cxx'; fi` network/fldigi-metar.o: network/metar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-metar.o -MD -MP -MF network/$(DEPDIR)/fldigi-metar.Tpo -c -o network/fldigi-metar.o `test -f 'network/metar.cxx' || echo '$(srcdir)/'`network/metar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-metar.Tpo network/$(DEPDIR)/fldigi-metar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/metar.cxx' object='network/fldigi-metar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-metar.o `test -f 'network/metar.cxx' || echo '$(srcdir)/'`network/metar.cxx network/fldigi-metar.obj: network/metar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-metar.obj -MD -MP -MF network/$(DEPDIR)/fldigi-metar.Tpo -c -o network/fldigi-metar.obj `if test -f 'network/metar.cxx'; then $(CYGPATH_W) 'network/metar.cxx'; else $(CYGPATH_W) '$(srcdir)/network/metar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-metar.Tpo network/$(DEPDIR)/fldigi-metar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/metar.cxx' object='network/fldigi-metar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-metar.obj `if test -f 'network/metar.cxx'; then $(CYGPATH_W) 'network/metar.cxx'; else $(CYGPATH_W) '$(srcdir)/network/metar.cxx'; fi` network/fldigi-network.o: network/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-network.o -MD -MP -MF network/$(DEPDIR)/fldigi-network.Tpo -c -o network/fldigi-network.o `test -f 'network/network.cxx' || echo '$(srcdir)/'`network/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-network.Tpo network/$(DEPDIR)/fldigi-network.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/network.cxx' object='network/fldigi-network.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-network.o `test -f 'network/network.cxx' || echo '$(srcdir)/'`network/network.cxx network/fldigi-network.obj: network/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-network.obj -MD -MP -MF network/$(DEPDIR)/fldigi-network.Tpo -c -o network/fldigi-network.obj `if test -f 'network/network.cxx'; then $(CYGPATH_W) 'network/network.cxx'; else $(CYGPATH_W) '$(srcdir)/network/network.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-network.Tpo network/$(DEPDIR)/fldigi-network.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/network.cxx' object='network/fldigi-network.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-network.obj `if test -f 'network/network.cxx'; then $(CYGPATH_W) 'network/network.cxx'; else $(CYGPATH_W) '$(srcdir)/network/network.cxx'; fi` network/fldigi-socket.o: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-socket.o -MD -MP -MF network/$(DEPDIR)/fldigi-socket.Tpo -c -o network/fldigi-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-socket.Tpo network/$(DEPDIR)/fldigi-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/fldigi-socket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx network/fldigi-socket.obj: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-socket.obj -MD -MP -MF network/$(DEPDIR)/fldigi-socket.Tpo -c -o network/fldigi-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-socket.Tpo network/$(DEPDIR)/fldigi-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/fldigi-socket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` network/fldigi-weather.o: network/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-weather.o -MD -MP -MF network/$(DEPDIR)/fldigi-weather.Tpo -c -o network/fldigi-weather.o `test -f 'network/weather.cxx' || echo '$(srcdir)/'`network/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-weather.Tpo network/$(DEPDIR)/fldigi-weather.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/weather.cxx' object='network/fldigi-weather.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-weather.o `test -f 'network/weather.cxx' || echo '$(srcdir)/'`network/weather.cxx network/fldigi-weather.obj: network/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-weather.obj -MD -MP -MF network/$(DEPDIR)/fldigi-weather.Tpo -c -o network/fldigi-weather.obj `if test -f 'network/weather.cxx'; then $(CYGPATH_W) 'network/weather.cxx'; else $(CYGPATH_W) '$(srcdir)/network/weather.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-weather.Tpo network/$(DEPDIR)/fldigi-weather.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/weather.cxx' object='network/fldigi-weather.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-weather.obj `if test -f 'network/weather.cxx'; then $(CYGPATH_W) 'network/weather.cxx'; else $(CYGPATH_W) '$(srcdir)/network/weather.cxx'; fi` olivia/fldigi-olivia.o: olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT olivia/fldigi-olivia.o -MD -MP -MF olivia/$(DEPDIR)/fldigi-olivia.Tpo -c -o olivia/fldigi-olivia.o `test -f 'olivia/olivia.cxx' || echo '$(srcdir)/'`olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) olivia/$(DEPDIR)/fldigi-olivia.Tpo olivia/$(DEPDIR)/fldigi-olivia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='olivia/olivia.cxx' object='olivia/fldigi-olivia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o olivia/fldigi-olivia.o `test -f 'olivia/olivia.cxx' || echo '$(srcdir)/'`olivia/olivia.cxx olivia/fldigi-olivia.obj: olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT olivia/fldigi-olivia.obj -MD -MP -MF olivia/$(DEPDIR)/fldigi-olivia.Tpo -c -o olivia/fldigi-olivia.obj `if test -f 'olivia/olivia.cxx'; then $(CYGPATH_W) 'olivia/olivia.cxx'; else $(CYGPATH_W) '$(srcdir)/olivia/olivia.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) olivia/$(DEPDIR)/fldigi-olivia.Tpo olivia/$(DEPDIR)/fldigi-olivia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='olivia/olivia.cxx' object='olivia/fldigi-olivia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o olivia/fldigi-olivia.obj `if test -f 'olivia/olivia.cxx'; then $(CYGPATH_W) 'olivia/olivia.cxx'; else $(CYGPATH_W) '$(srcdir)/olivia/olivia.cxx'; fi` psk/fldigi-pskcoeff.o: psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskcoeff.o -MD -MP -MF psk/$(DEPDIR)/fldigi-pskcoeff.Tpo -c -o psk/fldigi-pskcoeff.o `test -f 'psk/pskcoeff.cxx' || echo '$(srcdir)/'`psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskcoeff.Tpo psk/$(DEPDIR)/fldigi-pskcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskcoeff.cxx' object='psk/fldigi-pskcoeff.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskcoeff.o `test -f 'psk/pskcoeff.cxx' || echo '$(srcdir)/'`psk/pskcoeff.cxx psk/fldigi-pskcoeff.obj: psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskcoeff.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-pskcoeff.Tpo -c -o psk/fldigi-pskcoeff.obj `if test -f 'psk/pskcoeff.cxx'; then $(CYGPATH_W) 'psk/pskcoeff.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskcoeff.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskcoeff.Tpo psk/$(DEPDIR)/fldigi-pskcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskcoeff.cxx' object='psk/fldigi-pskcoeff.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskcoeff.obj `if test -f 'psk/pskcoeff.cxx'; then $(CYGPATH_W) 'psk/pskcoeff.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskcoeff.cxx'; fi` psk/fldigi-psk.o: psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-psk.o -MD -MP -MF psk/$(DEPDIR)/fldigi-psk.Tpo -c -o psk/fldigi-psk.o `test -f 'psk/psk.cxx' || echo '$(srcdir)/'`psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-psk.Tpo psk/$(DEPDIR)/fldigi-psk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/psk.cxx' object='psk/fldigi-psk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-psk.o `test -f 'psk/psk.cxx' || echo '$(srcdir)/'`psk/psk.cxx psk/fldigi-psk.obj: psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-psk.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-psk.Tpo -c -o psk/fldigi-psk.obj `if test -f 'psk/psk.cxx'; then $(CYGPATH_W) 'psk/psk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/psk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-psk.Tpo psk/$(DEPDIR)/fldigi-psk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/psk.cxx' object='psk/fldigi-psk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-psk.obj `if test -f 'psk/psk.cxx'; then $(CYGPATH_W) 'psk/psk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/psk.cxx'; fi` psk/fldigi-pskeval.o: psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskeval.o -MD -MP -MF psk/$(DEPDIR)/fldigi-pskeval.Tpo -c -o psk/fldigi-pskeval.o `test -f 'psk/pskeval.cxx' || echo '$(srcdir)/'`psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskeval.Tpo psk/$(DEPDIR)/fldigi-pskeval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskeval.cxx' object='psk/fldigi-pskeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskeval.o `test -f 'psk/pskeval.cxx' || echo '$(srcdir)/'`psk/pskeval.cxx psk/fldigi-pskeval.obj: psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskeval.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-pskeval.Tpo -c -o psk/fldigi-pskeval.obj `if test -f 'psk/pskeval.cxx'; then $(CYGPATH_W) 'psk/pskeval.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskeval.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskeval.Tpo psk/$(DEPDIR)/fldigi-pskeval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskeval.cxx' object='psk/fldigi-pskeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskeval.obj `if test -f 'psk/pskeval.cxx'; then $(CYGPATH_W) 'psk/pskeval.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskeval.cxx'; fi` psk/fldigi-pskvaricode.o: psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskvaricode.o -MD -MP -MF psk/$(DEPDIR)/fldigi-pskvaricode.Tpo -c -o psk/fldigi-pskvaricode.o `test -f 'psk/pskvaricode.cxx' || echo '$(srcdir)/'`psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskvaricode.Tpo psk/$(DEPDIR)/fldigi-pskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskvaricode.cxx' object='psk/fldigi-pskvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskvaricode.o `test -f 'psk/pskvaricode.cxx' || echo '$(srcdir)/'`psk/pskvaricode.cxx psk/fldigi-pskvaricode.obj: psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskvaricode.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-pskvaricode.Tpo -c -o psk/fldigi-pskvaricode.obj `if test -f 'psk/pskvaricode.cxx'; then $(CYGPATH_W) 'psk/pskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskvaricode.Tpo psk/$(DEPDIR)/fldigi-pskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskvaricode.cxx' object='psk/fldigi-pskvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskvaricode.obj `if test -f 'psk/pskvaricode.cxx'; then $(CYGPATH_W) 'psk/pskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskvaricode.cxx'; fi` psk/fldigi-viewpsk.o: psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-viewpsk.o -MD -MP -MF psk/$(DEPDIR)/fldigi-viewpsk.Tpo -c -o psk/fldigi-viewpsk.o `test -f 'psk/viewpsk.cxx' || echo '$(srcdir)/'`psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-viewpsk.Tpo psk/$(DEPDIR)/fldigi-viewpsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/viewpsk.cxx' object='psk/fldigi-viewpsk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-viewpsk.o `test -f 'psk/viewpsk.cxx' || echo '$(srcdir)/'`psk/viewpsk.cxx psk/fldigi-viewpsk.obj: psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-viewpsk.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-viewpsk.Tpo -c -o psk/fldigi-viewpsk.obj `if test -f 'psk/viewpsk.cxx'; then $(CYGPATH_W) 'psk/viewpsk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/viewpsk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-viewpsk.Tpo psk/$(DEPDIR)/fldigi-viewpsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/viewpsk.cxx' object='psk/fldigi-viewpsk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-viewpsk.obj `if test -f 'psk/viewpsk.cxx'; then $(CYGPATH_W) 'psk/viewpsk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/viewpsk.cxx'; fi` psm/fldigi-psm.o: psm/psm.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psm/fldigi-psm.o -MD -MP -MF psm/$(DEPDIR)/fldigi-psm.Tpo -c -o psm/fldigi-psm.o `test -f 'psm/psm.cxx' || echo '$(srcdir)/'`psm/psm.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psm/$(DEPDIR)/fldigi-psm.Tpo psm/$(DEPDIR)/fldigi-psm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psm/psm.cxx' object='psm/fldigi-psm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psm/fldigi-psm.o `test -f 'psm/psm.cxx' || echo '$(srcdir)/'`psm/psm.cxx psm/fldigi-psm.obj: psm/psm.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psm/fldigi-psm.obj -MD -MP -MF psm/$(DEPDIR)/fldigi-psm.Tpo -c -o psm/fldigi-psm.obj `if test -f 'psm/psm.cxx'; then $(CYGPATH_W) 'psm/psm.cxx'; else $(CYGPATH_W) '$(srcdir)/psm/psm.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psm/$(DEPDIR)/fldigi-psm.Tpo psm/$(DEPDIR)/fldigi-psm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psm/psm.cxx' object='psm/fldigi-psm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psm/fldigi-psm.obj `if test -f 'psm/psm.cxx'; then $(CYGPATH_W) 'psm/psm.cxx'; else $(CYGPATH_W) '$(srcdir)/psm/psm.cxx'; fi` qrunner/fldigi-qrunner.o: qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT qrunner/fldigi-qrunner.o -MD -MP -MF qrunner/$(DEPDIR)/fldigi-qrunner.Tpo -c -o qrunner/fldigi-qrunner.o `test -f 'qrunner/qrunner.cxx' || echo '$(srcdir)/'`qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) qrunner/$(DEPDIR)/fldigi-qrunner.Tpo qrunner/$(DEPDIR)/fldigi-qrunner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='qrunner/qrunner.cxx' object='qrunner/fldigi-qrunner.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o qrunner/fldigi-qrunner.o `test -f 'qrunner/qrunner.cxx' || echo '$(srcdir)/'`qrunner/qrunner.cxx qrunner/fldigi-qrunner.obj: qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT qrunner/fldigi-qrunner.obj -MD -MP -MF qrunner/$(DEPDIR)/fldigi-qrunner.Tpo -c -o qrunner/fldigi-qrunner.obj `if test -f 'qrunner/qrunner.cxx'; then $(CYGPATH_W) 'qrunner/qrunner.cxx'; else $(CYGPATH_W) '$(srcdir)/qrunner/qrunner.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) qrunner/$(DEPDIR)/fldigi-qrunner.Tpo qrunner/$(DEPDIR)/fldigi-qrunner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='qrunner/qrunner.cxx' object='qrunner/fldigi-qrunner.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o qrunner/fldigi-qrunner.obj `if test -f 'qrunner/qrunner.cxx'; then $(CYGPATH_W) 'qrunner/qrunner.cxx'; else $(CYGPATH_W) '$(srcdir)/qrunner/qrunner.cxx'; fi` rigcontrol/fldigi-FreqControl.o: rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-FreqControl.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo -c -o rigcontrol/fldigi-FreqControl.o `test -f 'rigcontrol/FreqControl.cxx' || echo '$(srcdir)/'`rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/FreqControl.cxx' object='rigcontrol/fldigi-FreqControl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-FreqControl.o `test -f 'rigcontrol/FreqControl.cxx' || echo '$(srcdir)/'`rigcontrol/FreqControl.cxx rigcontrol/fldigi-FreqControl.obj: rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-FreqControl.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo -c -o rigcontrol/fldigi-FreqControl.obj `if test -f 'rigcontrol/FreqControl.cxx'; then $(CYGPATH_W) 'rigcontrol/FreqControl.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/FreqControl.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/FreqControl.cxx' object='rigcontrol/fldigi-FreqControl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-FreqControl.obj `if test -f 'rigcontrol/FreqControl.cxx'; then $(CYGPATH_W) 'rigcontrol/FreqControl.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/FreqControl.cxx'; fi` rigcontrol/fldigi-norig.o: rigcontrol/norig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-norig.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-norig.Tpo -c -o rigcontrol/fldigi-norig.o `test -f 'rigcontrol/norig.cxx' || echo '$(srcdir)/'`rigcontrol/norig.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-norig.Tpo rigcontrol/$(DEPDIR)/fldigi-norig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/norig.cxx' object='rigcontrol/fldigi-norig.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-norig.o `test -f 'rigcontrol/norig.cxx' || echo '$(srcdir)/'`rigcontrol/norig.cxx rigcontrol/fldigi-norig.obj: rigcontrol/norig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-norig.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-norig.Tpo -c -o rigcontrol/fldigi-norig.obj `if test -f 'rigcontrol/norig.cxx'; then $(CYGPATH_W) 'rigcontrol/norig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/norig.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-norig.Tpo rigcontrol/$(DEPDIR)/fldigi-norig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/norig.cxx' object='rigcontrol/fldigi-norig.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-norig.obj `if test -f 'rigcontrol/norig.cxx'; then $(CYGPATH_W) 'rigcontrol/norig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/norig.cxx'; fi` rigcontrol/fldigi-ptt.o: rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-ptt.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo -c -o rigcontrol/fldigi-ptt.o `test -f 'rigcontrol/ptt.cxx' || echo '$(srcdir)/'`rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo rigcontrol/$(DEPDIR)/fldigi-ptt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/ptt.cxx' object='rigcontrol/fldigi-ptt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-ptt.o `test -f 'rigcontrol/ptt.cxx' || echo '$(srcdir)/'`rigcontrol/ptt.cxx rigcontrol/fldigi-ptt.obj: rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-ptt.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo -c -o rigcontrol/fldigi-ptt.obj `if test -f 'rigcontrol/ptt.cxx'; then $(CYGPATH_W) 'rigcontrol/ptt.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/ptt.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo rigcontrol/$(DEPDIR)/fldigi-ptt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/ptt.cxx' object='rigcontrol/fldigi-ptt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-ptt.obj `if test -f 'rigcontrol/ptt.cxx'; then $(CYGPATH_W) 'rigcontrol/ptt.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/ptt.cxx'; fi` rigcontrol/fldigi-rigio.o: rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigio.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo -c -o rigcontrol/fldigi-rigio.o `test -f 'rigcontrol/rigio.cxx' || echo '$(srcdir)/'`rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo rigcontrol/$(DEPDIR)/fldigi-rigio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigio.cxx' object='rigcontrol/fldigi-rigio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigio.o `test -f 'rigcontrol/rigio.cxx' || echo '$(srcdir)/'`rigcontrol/rigio.cxx rigcontrol/fldigi-rigio.obj: rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigio.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo -c -o rigcontrol/fldigi-rigio.obj `if test -f 'rigcontrol/rigio.cxx'; then $(CYGPATH_W) 'rigcontrol/rigio.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigio.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo rigcontrol/$(DEPDIR)/fldigi-rigio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigio.cxx' object='rigcontrol/fldigi-rigio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigio.obj `if test -f 'rigcontrol/rigio.cxx'; then $(CYGPATH_W) 'rigcontrol/rigio.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigio.cxx'; fi` rigcontrol/fldigi-rigsupport.o: rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigsupport.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo -c -o rigcontrol/fldigi-rigsupport.o `test -f 'rigcontrol/rigsupport.cxx' || echo '$(srcdir)/'`rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigsupport.cxx' object='rigcontrol/fldigi-rigsupport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigsupport.o `test -f 'rigcontrol/rigsupport.cxx' || echo '$(srcdir)/'`rigcontrol/rigsupport.cxx rigcontrol/fldigi-rigsupport.obj: rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigsupport.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo -c -o rigcontrol/fldigi-rigsupport.obj `if test -f 'rigcontrol/rigsupport.cxx'; then $(CYGPATH_W) 'rigcontrol/rigsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigsupport.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigsupport.cxx' object='rigcontrol/fldigi-rigsupport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigsupport.obj `if test -f 'rigcontrol/rigsupport.cxx'; then $(CYGPATH_W) 'rigcontrol/rigsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigsupport.cxx'; fi` rigcontrol/fldigi-rigxml.o: rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigxml.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo -c -o rigcontrol/fldigi-rigxml.o `test -f 'rigcontrol/rigxml.cxx' || echo '$(srcdir)/'`rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo rigcontrol/$(DEPDIR)/fldigi-rigxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigxml.cxx' object='rigcontrol/fldigi-rigxml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigxml.o `test -f 'rigcontrol/rigxml.cxx' || echo '$(srcdir)/'`rigcontrol/rigxml.cxx rigcontrol/fldigi-rigxml.obj: rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigxml.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo -c -o rigcontrol/fldigi-rigxml.obj `if test -f 'rigcontrol/rigxml.cxx'; then $(CYGPATH_W) 'rigcontrol/rigxml.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigxml.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo rigcontrol/$(DEPDIR)/fldigi-rigxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigxml.cxx' object='rigcontrol/fldigi-rigxml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigxml.obj `if test -f 'rigcontrol/rigxml.cxx'; then $(CYGPATH_W) 'rigcontrol/rigxml.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigxml.cxx'; fi` rigcontrol/fldigi-serial.o: rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-serial.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-serial.Tpo -c -o rigcontrol/fldigi-serial.o `test -f 'rigcontrol/serial.cxx' || echo '$(srcdir)/'`rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-serial.Tpo rigcontrol/$(DEPDIR)/fldigi-serial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/serial.cxx' object='rigcontrol/fldigi-serial.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-serial.o `test -f 'rigcontrol/serial.cxx' || echo '$(srcdir)/'`rigcontrol/serial.cxx rigcontrol/fldigi-serial.obj: rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-serial.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-serial.Tpo -c -o rigcontrol/fldigi-serial.obj `if test -f 'rigcontrol/serial.cxx'; then $(CYGPATH_W) 'rigcontrol/serial.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/serial.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-serial.Tpo rigcontrol/$(DEPDIR)/fldigi-serial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/serial.cxx' object='rigcontrol/fldigi-serial.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-serial.obj `if test -f 'rigcontrol/serial.cxx'; then $(CYGPATH_W) 'rigcontrol/serial.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/serial.cxx'; fi` rigcontrol/fldigi-xmlrpc_rig.o: rigcontrol/xmlrpc_rig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-xmlrpc_rig.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo -c -o rigcontrol/fldigi-xmlrpc_rig.o `test -f 'rigcontrol/xmlrpc_rig.cxx' || echo '$(srcdir)/'`rigcontrol/xmlrpc_rig.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/xmlrpc_rig.cxx' object='rigcontrol/fldigi-xmlrpc_rig.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-xmlrpc_rig.o `test -f 'rigcontrol/xmlrpc_rig.cxx' || echo '$(srcdir)/'`rigcontrol/xmlrpc_rig.cxx rigcontrol/fldigi-xmlrpc_rig.obj: rigcontrol/xmlrpc_rig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-xmlrpc_rig.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo -c -o rigcontrol/fldigi-xmlrpc_rig.obj `if test -f 'rigcontrol/xmlrpc_rig.cxx'; then $(CYGPATH_W) 'rigcontrol/xmlrpc_rig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/xmlrpc_rig.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/xmlrpc_rig.cxx' object='rigcontrol/fldigi-xmlrpc_rig.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-xmlrpc_rig.obj `if test -f 'rigcontrol/xmlrpc_rig.cxx'; then $(CYGPATH_W) 'rigcontrol/xmlrpc_rig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/xmlrpc_rig.cxx'; fi` rsid/fldigi-rsid.o: rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid.o -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid.Tpo -c -o rsid/fldigi-rsid.o `test -f 'rsid/rsid.cxx' || echo '$(srcdir)/'`rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid.Tpo rsid/$(DEPDIR)/fldigi-rsid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid.cxx' object='rsid/fldigi-rsid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid.o `test -f 'rsid/rsid.cxx' || echo '$(srcdir)/'`rsid/rsid.cxx rsid/fldigi-rsid.obj: rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid.obj -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid.Tpo -c -o rsid/fldigi-rsid.obj `if test -f 'rsid/rsid.cxx'; then $(CYGPATH_W) 'rsid/rsid.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid.Tpo rsid/$(DEPDIR)/fldigi-rsid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid.cxx' object='rsid/fldigi-rsid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid.obj `if test -f 'rsid/rsid.cxx'; then $(CYGPATH_W) 'rsid/rsid.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid.cxx'; fi` soundcard/fldigi-audio_alert.o: soundcard/audio_alert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-audio_alert.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo -c -o soundcard/fldigi-audio_alert.o `test -f 'soundcard/audio_alert.cxx' || echo '$(srcdir)/'`soundcard/audio_alert.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo soundcard/$(DEPDIR)/fldigi-audio_alert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/audio_alert.cxx' object='soundcard/fldigi-audio_alert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-audio_alert.o `test -f 'soundcard/audio_alert.cxx' || echo '$(srcdir)/'`soundcard/audio_alert.cxx soundcard/fldigi-audio_alert.obj: soundcard/audio_alert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-audio_alert.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo -c -o soundcard/fldigi-audio_alert.obj `if test -f 'soundcard/audio_alert.cxx'; then $(CYGPATH_W) 'soundcard/audio_alert.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/audio_alert.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo soundcard/$(DEPDIR)/fldigi-audio_alert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/audio_alert.cxx' object='soundcard/fldigi-audio_alert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-audio_alert.obj `if test -f 'soundcard/audio_alert.cxx'; then $(CYGPATH_W) 'soundcard/audio_alert.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/audio_alert.cxx'; fi` soundcard/fldigi-bark.o: soundcard/bark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-bark.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-bark.Tpo -c -o soundcard/fldigi-bark.o `test -f 'soundcard/bark.cxx' || echo '$(srcdir)/'`soundcard/bark.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-bark.Tpo soundcard/$(DEPDIR)/fldigi-bark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/bark.cxx' object='soundcard/fldigi-bark.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-bark.o `test -f 'soundcard/bark.cxx' || echo '$(srcdir)/'`soundcard/bark.cxx soundcard/fldigi-bark.obj: soundcard/bark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-bark.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-bark.Tpo -c -o soundcard/fldigi-bark.obj `if test -f 'soundcard/bark.cxx'; then $(CYGPATH_W) 'soundcard/bark.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/bark.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-bark.Tpo soundcard/$(DEPDIR)/fldigi-bark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/bark.cxx' object='soundcard/fldigi-bark.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-bark.obj `if test -f 'soundcard/bark.cxx'; then $(CYGPATH_W) 'soundcard/bark.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/bark.cxx'; fi` soundcard/fldigi-checkout.o: soundcard/checkout.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-checkout.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-checkout.Tpo -c -o soundcard/fldigi-checkout.o `test -f 'soundcard/checkout.cxx' || echo '$(srcdir)/'`soundcard/checkout.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-checkout.Tpo soundcard/$(DEPDIR)/fldigi-checkout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/checkout.cxx' object='soundcard/fldigi-checkout.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-checkout.o `test -f 'soundcard/checkout.cxx' || echo '$(srcdir)/'`soundcard/checkout.cxx soundcard/fldigi-checkout.obj: soundcard/checkout.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-checkout.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-checkout.Tpo -c -o soundcard/fldigi-checkout.obj `if test -f 'soundcard/checkout.cxx'; then $(CYGPATH_W) 'soundcard/checkout.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/checkout.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-checkout.Tpo soundcard/$(DEPDIR)/fldigi-checkout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/checkout.cxx' object='soundcard/fldigi-checkout.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-checkout.obj `if test -f 'soundcard/checkout.cxx'; then $(CYGPATH_W) 'soundcard/checkout.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/checkout.cxx'; fi` soundcard/fldigi-diesel.o: soundcard/diesel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-diesel.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-diesel.Tpo -c -o soundcard/fldigi-diesel.o `test -f 'soundcard/diesel.cxx' || echo '$(srcdir)/'`soundcard/diesel.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-diesel.Tpo soundcard/$(DEPDIR)/fldigi-diesel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/diesel.cxx' object='soundcard/fldigi-diesel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-diesel.o `test -f 'soundcard/diesel.cxx' || echo '$(srcdir)/'`soundcard/diesel.cxx soundcard/fldigi-diesel.obj: soundcard/diesel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-diesel.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-diesel.Tpo -c -o soundcard/fldigi-diesel.obj `if test -f 'soundcard/diesel.cxx'; then $(CYGPATH_W) 'soundcard/diesel.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/diesel.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-diesel.Tpo soundcard/$(DEPDIR)/fldigi-diesel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/diesel.cxx' object='soundcard/fldigi-diesel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-diesel.obj `if test -f 'soundcard/diesel.cxx'; then $(CYGPATH_W) 'soundcard/diesel.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/diesel.cxx'; fi` soundcard/fldigi-dinnerbell.o: soundcard/dinnerbell.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-dinnerbell.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo -c -o soundcard/fldigi-dinnerbell.o `test -f 'soundcard/dinnerbell.cxx' || echo '$(srcdir)/'`soundcard/dinnerbell.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo soundcard/$(DEPDIR)/fldigi-dinnerbell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/dinnerbell.cxx' object='soundcard/fldigi-dinnerbell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-dinnerbell.o `test -f 'soundcard/dinnerbell.cxx' || echo '$(srcdir)/'`soundcard/dinnerbell.cxx soundcard/fldigi-dinnerbell.obj: soundcard/dinnerbell.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-dinnerbell.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo -c -o soundcard/fldigi-dinnerbell.obj `if test -f 'soundcard/dinnerbell.cxx'; then $(CYGPATH_W) 'soundcard/dinnerbell.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/dinnerbell.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo soundcard/$(DEPDIR)/fldigi-dinnerbell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/dinnerbell.cxx' object='soundcard/fldigi-dinnerbell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-dinnerbell.obj `if test -f 'soundcard/dinnerbell.cxx'; then $(CYGPATH_W) 'soundcard/dinnerbell.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/dinnerbell.cxx'; fi` soundcard/fldigi-doesnot.o: soundcard/doesnot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-doesnot.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-doesnot.Tpo -c -o soundcard/fldigi-doesnot.o `test -f 'soundcard/doesnot.cxx' || echo '$(srcdir)/'`soundcard/doesnot.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-doesnot.Tpo soundcard/$(DEPDIR)/fldigi-doesnot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/doesnot.cxx' object='soundcard/fldigi-doesnot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-doesnot.o `test -f 'soundcard/doesnot.cxx' || echo '$(srcdir)/'`soundcard/doesnot.cxx soundcard/fldigi-doesnot.obj: soundcard/doesnot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-doesnot.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-doesnot.Tpo -c -o soundcard/fldigi-doesnot.obj `if test -f 'soundcard/doesnot.cxx'; then $(CYGPATH_W) 'soundcard/doesnot.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/doesnot.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-doesnot.Tpo soundcard/$(DEPDIR)/fldigi-doesnot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/doesnot.cxx' object='soundcard/fldigi-doesnot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-doesnot.obj `if test -f 'soundcard/doesnot.cxx'; then $(CYGPATH_W) 'soundcard/doesnot.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/doesnot.cxx'; fi` soundcard/fldigi-play.pa.o: soundcard/play.pa.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-play.pa.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-play.pa.Tpo -c -o soundcard/fldigi-play.pa.o `test -f 'soundcard/play.pa.cxx' || echo '$(srcdir)/'`soundcard/play.pa.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-play.pa.Tpo soundcard/$(DEPDIR)/fldigi-play.pa.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/play.pa.cxx' object='soundcard/fldigi-play.pa.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-play.pa.o `test -f 'soundcard/play.pa.cxx' || echo '$(srcdir)/'`soundcard/play.pa.cxx soundcard/fldigi-play.pa.obj: soundcard/play.pa.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-play.pa.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-play.pa.Tpo -c -o soundcard/fldigi-play.pa.obj `if test -f 'soundcard/play.pa.cxx'; then $(CYGPATH_W) 'soundcard/play.pa.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/play.pa.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-play.pa.Tpo soundcard/$(DEPDIR)/fldigi-play.pa.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/play.pa.cxx' object='soundcard/fldigi-play.pa.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-play.pa.obj `if test -f 'soundcard/play.pa.cxx'; then $(CYGPATH_W) 'soundcard/play.pa.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/play.pa.cxx'; fi` soundcard/fldigi-soundconf.o: soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-soundconf.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-soundconf.Tpo -c -o soundcard/fldigi-soundconf.o `test -f 'soundcard/soundconf.cxx' || echo '$(srcdir)/'`soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-soundconf.Tpo soundcard/$(DEPDIR)/fldigi-soundconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/soundconf.cxx' object='soundcard/fldigi-soundconf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-soundconf.o `test -f 'soundcard/soundconf.cxx' || echo '$(srcdir)/'`soundcard/soundconf.cxx soundcard/fldigi-soundconf.obj: soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-soundconf.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-soundconf.Tpo -c -o soundcard/fldigi-soundconf.obj `if test -f 'soundcard/soundconf.cxx'; then $(CYGPATH_W) 'soundcard/soundconf.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/soundconf.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-soundconf.Tpo soundcard/$(DEPDIR)/fldigi-soundconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/soundconf.cxx' object='soundcard/fldigi-soundconf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-soundconf.obj `if test -f 'soundcard/soundconf.cxx'; then $(CYGPATH_W) 'soundcard/soundconf.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/soundconf.cxx'; fi` soundcard/fldigi-sound.o: soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-sound.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-sound.Tpo -c -o soundcard/fldigi-sound.o `test -f 'soundcard/sound.cxx' || echo '$(srcdir)/'`soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-sound.Tpo soundcard/$(DEPDIR)/fldigi-sound.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/sound.cxx' object='soundcard/fldigi-sound.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-sound.o `test -f 'soundcard/sound.cxx' || echo '$(srcdir)/'`soundcard/sound.cxx soundcard/fldigi-sound.obj: soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-sound.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-sound.Tpo -c -o soundcard/fldigi-sound.obj `if test -f 'soundcard/sound.cxx'; then $(CYGPATH_W) 'soundcard/sound.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/sound.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-sound.Tpo soundcard/$(DEPDIR)/fldigi-sound.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/sound.cxx' object='soundcard/fldigi-sound.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-sound.obj `if test -f 'soundcard/sound.cxx'; then $(CYGPATH_W) 'soundcard/sound.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/sound.cxx'; fi` soundcard/fldigi-steam_train.o: soundcard/steam_train.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-steam_train.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-steam_train.Tpo -c -o soundcard/fldigi-steam_train.o `test -f 'soundcard/steam_train.cxx' || echo '$(srcdir)/'`soundcard/steam_train.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-steam_train.Tpo soundcard/$(DEPDIR)/fldigi-steam_train.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/steam_train.cxx' object='soundcard/fldigi-steam_train.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-steam_train.o `test -f 'soundcard/steam_train.cxx' || echo '$(srcdir)/'`soundcard/steam_train.cxx soundcard/fldigi-steam_train.obj: soundcard/steam_train.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-steam_train.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-steam_train.Tpo -c -o soundcard/fldigi-steam_train.obj `if test -f 'soundcard/steam_train.cxx'; then $(CYGPATH_W) 'soundcard/steam_train.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/steam_train.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-steam_train.Tpo soundcard/$(DEPDIR)/fldigi-steam_train.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/steam_train.cxx' object='soundcard/fldigi-steam_train.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-steam_train.obj `if test -f 'soundcard/steam_train.cxx'; then $(CYGPATH_W) 'soundcard/steam_train.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/steam_train.cxx'; fi` spot/fldigi-notify.o: spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-notify.o -MD -MP -MF spot/$(DEPDIR)/fldigi-notify.Tpo -c -o spot/fldigi-notify.o `test -f 'spot/notify.cxx' || echo '$(srcdir)/'`spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-notify.Tpo spot/$(DEPDIR)/fldigi-notify.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/notify.cxx' object='spot/fldigi-notify.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-notify.o `test -f 'spot/notify.cxx' || echo '$(srcdir)/'`spot/notify.cxx spot/fldigi-notify.obj: spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-notify.obj -MD -MP -MF spot/$(DEPDIR)/fldigi-notify.Tpo -c -o spot/fldigi-notify.obj `if test -f 'spot/notify.cxx'; then $(CYGPATH_W) 'spot/notify.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/notify.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-notify.Tpo spot/$(DEPDIR)/fldigi-notify.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/notify.cxx' object='spot/fldigi-notify.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-notify.obj `if test -f 'spot/notify.cxx'; then $(CYGPATH_W) 'spot/notify.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/notify.cxx'; fi` spot/fldigi-pskrep.o: spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-pskrep.o -MD -MP -MF spot/$(DEPDIR)/fldigi-pskrep.Tpo -c -o spot/fldigi-pskrep.o `test -f 'spot/pskrep.cxx' || echo '$(srcdir)/'`spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-pskrep.Tpo spot/$(DEPDIR)/fldigi-pskrep.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/pskrep.cxx' object='spot/fldigi-pskrep.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-pskrep.o `test -f 'spot/pskrep.cxx' || echo '$(srcdir)/'`spot/pskrep.cxx spot/fldigi-pskrep.obj: spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-pskrep.obj -MD -MP -MF spot/$(DEPDIR)/fldigi-pskrep.Tpo -c -o spot/fldigi-pskrep.obj `if test -f 'spot/pskrep.cxx'; then $(CYGPATH_W) 'spot/pskrep.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/pskrep.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-pskrep.Tpo spot/$(DEPDIR)/fldigi-pskrep.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/pskrep.cxx' object='spot/fldigi-pskrep.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-pskrep.obj `if test -f 'spot/pskrep.cxx'; then $(CYGPATH_W) 'spot/pskrep.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/pskrep.cxx'; fi` spot/fldigi-spot.o: spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-spot.o -MD -MP -MF spot/$(DEPDIR)/fldigi-spot.Tpo -c -o spot/fldigi-spot.o `test -f 'spot/spot.cxx' || echo '$(srcdir)/'`spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-spot.Tpo spot/$(DEPDIR)/fldigi-spot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/spot.cxx' object='spot/fldigi-spot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-spot.o `test -f 'spot/spot.cxx' || echo '$(srcdir)/'`spot/spot.cxx spot/fldigi-spot.obj: spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-spot.obj -MD -MP -MF spot/$(DEPDIR)/fldigi-spot.Tpo -c -o spot/fldigi-spot.obj `if test -f 'spot/spot.cxx'; then $(CYGPATH_W) 'spot/spot.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/spot.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-spot.Tpo spot/$(DEPDIR)/fldigi-spot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/spot.cxx' object='spot/fldigi-spot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-spot.obj `if test -f 'spot/spot.cxx'; then $(CYGPATH_W) 'spot/spot.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/spot.cxx'; fi` ssb/fldigi-ssb.o: ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ssb/fldigi-ssb.o -MD -MP -MF ssb/$(DEPDIR)/fldigi-ssb.Tpo -c -o ssb/fldigi-ssb.o `test -f 'ssb/ssb.cxx' || echo '$(srcdir)/'`ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ssb/$(DEPDIR)/fldigi-ssb.Tpo ssb/$(DEPDIR)/fldigi-ssb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssb/ssb.cxx' object='ssb/fldigi-ssb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ssb/fldigi-ssb.o `test -f 'ssb/ssb.cxx' || echo '$(srcdir)/'`ssb/ssb.cxx ssb/fldigi-ssb.obj: ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ssb/fldigi-ssb.obj -MD -MP -MF ssb/$(DEPDIR)/fldigi-ssb.Tpo -c -o ssb/fldigi-ssb.obj `if test -f 'ssb/ssb.cxx'; then $(CYGPATH_W) 'ssb/ssb.cxx'; else $(CYGPATH_W) '$(srcdir)/ssb/ssb.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ssb/$(DEPDIR)/fldigi-ssb.Tpo ssb/$(DEPDIR)/fldigi-ssb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssb/ssb.cxx' object='ssb/fldigi-ssb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ssb/fldigi-ssb.obj `if test -f 'ssb/ssb.cxx'; then $(CYGPATH_W) 'ssb/ssb.cxx'; else $(CYGPATH_W) '$(srcdir)/ssb/ssb.cxx'; fi` synop-src/fldigi-synop.o: synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT synop-src/fldigi-synop.o -MD -MP -MF synop-src/$(DEPDIR)/fldigi-synop.Tpo -c -o synop-src/fldigi-synop.o `test -f 'synop-src/synop.cxx' || echo '$(srcdir)/'`synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) synop-src/$(DEPDIR)/fldigi-synop.Tpo synop-src/$(DEPDIR)/fldigi-synop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='synop-src/synop.cxx' object='synop-src/fldigi-synop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o synop-src/fldigi-synop.o `test -f 'synop-src/synop.cxx' || echo '$(srcdir)/'`synop-src/synop.cxx synop-src/fldigi-synop.obj: synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT synop-src/fldigi-synop.obj -MD -MP -MF synop-src/$(DEPDIR)/fldigi-synop.Tpo -c -o synop-src/fldigi-synop.obj `if test -f 'synop-src/synop.cxx'; then $(CYGPATH_W) 'synop-src/synop.cxx'; else $(CYGPATH_W) '$(srcdir)/synop-src/synop.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) synop-src/$(DEPDIR)/fldigi-synop.Tpo synop-src/$(DEPDIR)/fldigi-synop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='synop-src/synop.cxx' object='synop-src/fldigi-synop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o synop-src/fldigi-synop.obj `if test -f 'synop-src/synop.cxx'; then $(CYGPATH_W) 'synop-src/synop.cxx'; else $(CYGPATH_W) '$(srcdir)/synop-src/synop.cxx'; fi` thor/fldigi-thor.o: thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor.o -MD -MP -MF thor/$(DEPDIR)/fldigi-thor.Tpo -c -o thor/fldigi-thor.o `test -f 'thor/thor.cxx' || echo '$(srcdir)/'`thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor.Tpo thor/$(DEPDIR)/fldigi-thor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor.cxx' object='thor/fldigi-thor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor.o `test -f 'thor/thor.cxx' || echo '$(srcdir)/'`thor/thor.cxx thor/fldigi-thor.obj: thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor.obj -MD -MP -MF thor/$(DEPDIR)/fldigi-thor.Tpo -c -o thor/fldigi-thor.obj `if test -f 'thor/thor.cxx'; then $(CYGPATH_W) 'thor/thor.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor.Tpo thor/$(DEPDIR)/fldigi-thor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor.cxx' object='thor/fldigi-thor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor.obj `if test -f 'thor/thor.cxx'; then $(CYGPATH_W) 'thor/thor.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor.cxx'; fi` thor/fldigi-thorvaricode.o: thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thorvaricode.o -MD -MP -MF thor/$(DEPDIR)/fldigi-thorvaricode.Tpo -c -o thor/fldigi-thorvaricode.o `test -f 'thor/thorvaricode.cxx' || echo '$(srcdir)/'`thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thorvaricode.Tpo thor/$(DEPDIR)/fldigi-thorvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thorvaricode.cxx' object='thor/fldigi-thorvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thorvaricode.o `test -f 'thor/thorvaricode.cxx' || echo '$(srcdir)/'`thor/thorvaricode.cxx thor/fldigi-thorvaricode.obj: thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thorvaricode.obj -MD -MP -MF thor/$(DEPDIR)/fldigi-thorvaricode.Tpo -c -o thor/fldigi-thorvaricode.obj `if test -f 'thor/thorvaricode.cxx'; then $(CYGPATH_W) 'thor/thorvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thorvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thorvaricode.Tpo thor/$(DEPDIR)/fldigi-thorvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thorvaricode.cxx' object='thor/fldigi-thorvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thorvaricode.obj `if test -f 'thor/thorvaricode.cxx'; then $(CYGPATH_W) 'thor/thorvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thorvaricode.cxx'; fi` throb/fldigi-throb.o: throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT throb/fldigi-throb.o -MD -MP -MF throb/$(DEPDIR)/fldigi-throb.Tpo -c -o throb/fldigi-throb.o `test -f 'throb/throb.cxx' || echo '$(srcdir)/'`throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) throb/$(DEPDIR)/fldigi-throb.Tpo throb/$(DEPDIR)/fldigi-throb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='throb/throb.cxx' object='throb/fldigi-throb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o throb/fldigi-throb.o `test -f 'throb/throb.cxx' || echo '$(srcdir)/'`throb/throb.cxx throb/fldigi-throb.obj: throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT throb/fldigi-throb.obj -MD -MP -MF throb/$(DEPDIR)/fldigi-throb.Tpo -c -o throb/fldigi-throb.obj `if test -f 'throb/throb.cxx'; then $(CYGPATH_W) 'throb/throb.cxx'; else $(CYGPATH_W) '$(srcdir)/throb/throb.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) throb/$(DEPDIR)/fldigi-throb.Tpo throb/$(DEPDIR)/fldigi-throb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='throb/throb.cxx' object='throb/fldigi-throb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o throb/fldigi-throb.obj `if test -f 'throb/throb.cxx'; then $(CYGPATH_W) 'throb/throb.cxx'; else $(CYGPATH_W) '$(srcdir)/throb/throb.cxx'; fi` trx/fldigi-modem.o: trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-modem.o -MD -MP -MF trx/$(DEPDIR)/fldigi-modem.Tpo -c -o trx/fldigi-modem.o `test -f 'trx/modem.cxx' || echo '$(srcdir)/'`trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-modem.Tpo trx/$(DEPDIR)/fldigi-modem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/modem.cxx' object='trx/fldigi-modem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-modem.o `test -f 'trx/modem.cxx' || echo '$(srcdir)/'`trx/modem.cxx trx/fldigi-modem.obj: trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-modem.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-modem.Tpo -c -o trx/fldigi-modem.obj `if test -f 'trx/modem.cxx'; then $(CYGPATH_W) 'trx/modem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/modem.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-modem.Tpo trx/$(DEPDIR)/fldigi-modem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/modem.cxx' object='trx/fldigi-modem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-modem.obj `if test -f 'trx/modem.cxx'; then $(CYGPATH_W) 'trx/modem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/modem.cxx'; fi` trx/fldigi-nullmodem.o: trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-nullmodem.o -MD -MP -MF trx/$(DEPDIR)/fldigi-nullmodem.Tpo -c -o trx/fldigi-nullmodem.o `test -f 'trx/nullmodem.cxx' || echo '$(srcdir)/'`trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-nullmodem.Tpo trx/$(DEPDIR)/fldigi-nullmodem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/nullmodem.cxx' object='trx/fldigi-nullmodem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-nullmodem.o `test -f 'trx/nullmodem.cxx' || echo '$(srcdir)/'`trx/nullmodem.cxx trx/fldigi-nullmodem.obj: trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-nullmodem.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-nullmodem.Tpo -c -o trx/fldigi-nullmodem.obj `if test -f 'trx/nullmodem.cxx'; then $(CYGPATH_W) 'trx/nullmodem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/nullmodem.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-nullmodem.Tpo trx/$(DEPDIR)/fldigi-nullmodem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/nullmodem.cxx' object='trx/fldigi-nullmodem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-nullmodem.obj `if test -f 'trx/nullmodem.cxx'; then $(CYGPATH_W) 'trx/nullmodem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/nullmodem.cxx'; fi` trx/fldigi-test_signal.o: trx/test_signal.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-test_signal.o -MD -MP -MF trx/$(DEPDIR)/fldigi-test_signal.Tpo -c -o trx/fldigi-test_signal.o `test -f 'trx/test_signal.cxx' || echo '$(srcdir)/'`trx/test_signal.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-test_signal.Tpo trx/$(DEPDIR)/fldigi-test_signal.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/test_signal.cxx' object='trx/fldigi-test_signal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-test_signal.o `test -f 'trx/test_signal.cxx' || echo '$(srcdir)/'`trx/test_signal.cxx trx/fldigi-test_signal.obj: trx/test_signal.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-test_signal.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-test_signal.Tpo -c -o trx/fldigi-test_signal.obj `if test -f 'trx/test_signal.cxx'; then $(CYGPATH_W) 'trx/test_signal.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/test_signal.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-test_signal.Tpo trx/$(DEPDIR)/fldigi-test_signal.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/test_signal.cxx' object='trx/fldigi-test_signal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-test_signal.obj `if test -f 'trx/test_signal.cxx'; then $(CYGPATH_W) 'trx/test_signal.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/test_signal.cxx'; fi` trx/fldigi-trx.o: trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-trx.o -MD -MP -MF trx/$(DEPDIR)/fldigi-trx.Tpo -c -o trx/fldigi-trx.o `test -f 'trx/trx.cxx' || echo '$(srcdir)/'`trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-trx.Tpo trx/$(DEPDIR)/fldigi-trx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/trx.cxx' object='trx/fldigi-trx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-trx.o `test -f 'trx/trx.cxx' || echo '$(srcdir)/'`trx/trx.cxx trx/fldigi-trx.obj: trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-trx.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-trx.Tpo -c -o trx/fldigi-trx.obj `if test -f 'trx/trx.cxx'; then $(CYGPATH_W) 'trx/trx.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/trx.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-trx.Tpo trx/$(DEPDIR)/fldigi-trx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/trx.cxx' object='trx/fldigi-trx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-trx.obj `if test -f 'trx/trx.cxx'; then $(CYGPATH_W) 'trx/trx.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/trx.cxx'; fi` waterfall/fldigi-colorbox.o: waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-colorbox.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-colorbox.Tpo -c -o waterfall/fldigi-colorbox.o `test -f 'waterfall/colorbox.cxx' || echo '$(srcdir)/'`waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-colorbox.Tpo waterfall/$(DEPDIR)/fldigi-colorbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/colorbox.cxx' object='waterfall/fldigi-colorbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-colorbox.o `test -f 'waterfall/colorbox.cxx' || echo '$(srcdir)/'`waterfall/colorbox.cxx waterfall/fldigi-colorbox.obj: waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-colorbox.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-colorbox.Tpo -c -o waterfall/fldigi-colorbox.obj `if test -f 'waterfall/colorbox.cxx'; then $(CYGPATH_W) 'waterfall/colorbox.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/colorbox.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-colorbox.Tpo waterfall/$(DEPDIR)/fldigi-colorbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/colorbox.cxx' object='waterfall/fldigi-colorbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-colorbox.obj `if test -f 'waterfall/colorbox.cxx'; then $(CYGPATH_W) 'waterfall/colorbox.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/colorbox.cxx'; fi` waterfall/fldigi-digiscope.o: waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-digiscope.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-digiscope.Tpo -c -o waterfall/fldigi-digiscope.o `test -f 'waterfall/digiscope.cxx' || echo '$(srcdir)/'`waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-digiscope.Tpo waterfall/$(DEPDIR)/fldigi-digiscope.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/digiscope.cxx' object='waterfall/fldigi-digiscope.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-digiscope.o `test -f 'waterfall/digiscope.cxx' || echo '$(srcdir)/'`waterfall/digiscope.cxx waterfall/fldigi-digiscope.obj: waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-digiscope.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-digiscope.Tpo -c -o waterfall/fldigi-digiscope.obj `if test -f 'waterfall/digiscope.cxx'; then $(CYGPATH_W) 'waterfall/digiscope.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/digiscope.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-digiscope.Tpo waterfall/$(DEPDIR)/fldigi-digiscope.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/digiscope.cxx' object='waterfall/fldigi-digiscope.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-digiscope.obj `if test -f 'waterfall/digiscope.cxx'; then $(CYGPATH_W) 'waterfall/digiscope.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/digiscope.cxx'; fi` waterfall/fldigi-raster.o: waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-raster.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-raster.Tpo -c -o waterfall/fldigi-raster.o `test -f 'waterfall/raster.cxx' || echo '$(srcdir)/'`waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-raster.Tpo waterfall/$(DEPDIR)/fldigi-raster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/raster.cxx' object='waterfall/fldigi-raster.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-raster.o `test -f 'waterfall/raster.cxx' || echo '$(srcdir)/'`waterfall/raster.cxx waterfall/fldigi-raster.obj: waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-raster.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-raster.Tpo -c -o waterfall/fldigi-raster.obj `if test -f 'waterfall/raster.cxx'; then $(CYGPATH_W) 'waterfall/raster.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/raster.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-raster.Tpo waterfall/$(DEPDIR)/fldigi-raster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/raster.cxx' object='waterfall/fldigi-raster.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-raster.obj `if test -f 'waterfall/raster.cxx'; then $(CYGPATH_W) 'waterfall/raster.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/raster.cxx'; fi` waterfall/fldigi-waterfall.o: waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-waterfall.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-waterfall.Tpo -c -o waterfall/fldigi-waterfall.o `test -f 'waterfall/waterfall.cxx' || echo '$(srcdir)/'`waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-waterfall.Tpo waterfall/$(DEPDIR)/fldigi-waterfall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/waterfall.cxx' object='waterfall/fldigi-waterfall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-waterfall.o `test -f 'waterfall/waterfall.cxx' || echo '$(srcdir)/'`waterfall/waterfall.cxx waterfall/fldigi-waterfall.obj: waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-waterfall.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-waterfall.Tpo -c -o waterfall/fldigi-waterfall.obj `if test -f 'waterfall/waterfall.cxx'; then $(CYGPATH_W) 'waterfall/waterfall.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/waterfall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-waterfall.Tpo waterfall/$(DEPDIR)/fldigi-waterfall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/waterfall.cxx' object='waterfall/fldigi-waterfall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-waterfall.obj `if test -f 'waterfall/waterfall.cxx'; then $(CYGPATH_W) 'waterfall/waterfall.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/waterfall.cxx'; fi` wefax/fldigi-wefax.o: wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax.o -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax.Tpo -c -o wefax/fldigi-wefax.o `test -f 'wefax/wefax.cxx' || echo '$(srcdir)/'`wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax.Tpo wefax/$(DEPDIR)/fldigi-wefax.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax.cxx' object='wefax/fldigi-wefax.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax.o `test -f 'wefax/wefax.cxx' || echo '$(srcdir)/'`wefax/wefax.cxx wefax/fldigi-wefax.obj: wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax.obj -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax.Tpo -c -o wefax/fldigi-wefax.obj `if test -f 'wefax/wefax.cxx'; then $(CYGPATH_W) 'wefax/wefax.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax.Tpo wefax/$(DEPDIR)/fldigi-wefax.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax.cxx' object='wefax/fldigi-wefax.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax.obj `if test -f 'wefax/wefax.cxx'; then $(CYGPATH_W) 'wefax/wefax.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax.cxx'; fi` wefax/fldigi-wefax_map.o: wefax/wefax_map.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax_map.o -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax_map.Tpo -c -o wefax/fldigi-wefax_map.o `test -f 'wefax/wefax_map.cxx' || echo '$(srcdir)/'`wefax/wefax_map.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax_map.Tpo wefax/$(DEPDIR)/fldigi-wefax_map.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax_map.cxx' object='wefax/fldigi-wefax_map.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax_map.o `test -f 'wefax/wefax_map.cxx' || echo '$(srcdir)/'`wefax/wefax_map.cxx wefax/fldigi-wefax_map.obj: wefax/wefax_map.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax_map.obj -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax_map.Tpo -c -o wefax/fldigi-wefax_map.obj `if test -f 'wefax/wefax_map.cxx'; then $(CYGPATH_W) 'wefax/wefax_map.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax_map.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax_map.Tpo wefax/$(DEPDIR)/fldigi-wefax_map.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax_map.cxx' object='wefax/fldigi-wefax_map.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax_map.obj `if test -f 'wefax/wefax_map.cxx'; then $(CYGPATH_W) 'wefax/wefax_map.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax_map.cxx'; fi` wefax/fldigi-wefax-pic.o: wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax-pic.o -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo -c -o wefax/fldigi-wefax-pic.o `test -f 'wefax/wefax-pic.cxx' || echo '$(srcdir)/'`wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo wefax/$(DEPDIR)/fldigi-wefax-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax-pic.cxx' object='wefax/fldigi-wefax-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax-pic.o `test -f 'wefax/wefax-pic.cxx' || echo '$(srcdir)/'`wefax/wefax-pic.cxx wefax/fldigi-wefax-pic.obj: wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax-pic.obj -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo -c -o wefax/fldigi-wefax-pic.obj `if test -f 'wefax/wefax-pic.cxx'; then $(CYGPATH_W) 'wefax/wefax-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo wefax/$(DEPDIR)/fldigi-wefax-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax-pic.cxx' object='wefax/fldigi-wefax-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax-pic.obj `if test -f 'wefax/wefax-pic.cxx'; then $(CYGPATH_W) 'wefax/wefax-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax-pic.cxx'; fi` widgets/fldigi-flinput2.o: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flinput2.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-flinput2.Tpo -c -o widgets/fldigi-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flinput2.Tpo widgets/$(DEPDIR)/fldigi-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/fldigi-flinput2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx widgets/fldigi-flinput2.obj: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flinput2.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-flinput2.Tpo -c -o widgets/fldigi-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flinput2.Tpo widgets/$(DEPDIR)/fldigi-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/fldigi-flinput2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` widgets/fldigi-flmisc.o: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flmisc.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-flmisc.Tpo -c -o widgets/fldigi-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flmisc.Tpo widgets/$(DEPDIR)/fldigi-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/fldigi-flmisc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx widgets/fldigi-flmisc.obj: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flmisc.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-flmisc.Tpo -c -o widgets/fldigi-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flmisc.Tpo widgets/$(DEPDIR)/fldigi-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/fldigi-flmisc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` widgets/fldigi-flslider2.o: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flslider2.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-flslider2.Tpo -c -o widgets/fldigi-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flslider2.Tpo widgets/$(DEPDIR)/fldigi-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/fldigi-flslider2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx widgets/fldigi-flslider2.obj: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flslider2.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-flslider2.Tpo -c -o widgets/fldigi-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flslider2.Tpo widgets/$(DEPDIR)/fldigi-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/fldigi-flslider2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` widgets/fldigi-Fl_Text_Buffer_mod.o: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Buffer_mod.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo -c -o widgets/fldigi-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/fldigi-Fl_Text_Buffer_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx widgets/fldigi-Fl_Text_Buffer_mod.obj: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Buffer_mod.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo -c -o widgets/fldigi-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/fldigi-Fl_Text_Buffer_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` widgets/fldigi-Fl_Text_Display_mod.o: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Display_mod.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo -c -o widgets/fldigi-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/fldigi-Fl_Text_Display_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx widgets/fldigi-Fl_Text_Display_mod.obj: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Display_mod.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo -c -o widgets/fldigi-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/fldigi-Fl_Text_Display_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` widgets/fldigi-Fl_Text_Editor_mod.o: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Editor_mod.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo -c -o widgets/fldigi-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/fldigi-Fl_Text_Editor_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx widgets/fldigi-Fl_Text_Editor_mod.obj: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Editor_mod.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo -c -o widgets/fldigi-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/fldigi-Fl_Text_Editor_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` widgets/fldigi-FTextRXTX.o: widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextRXTX.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo -c -o widgets/fldigi-FTextRXTX.o `test -f 'widgets/FTextRXTX.cxx' || echo '$(srcdir)/'`widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo widgets/$(DEPDIR)/fldigi-FTextRXTX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextRXTX.cxx' object='widgets/fldigi-FTextRXTX.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextRXTX.o `test -f 'widgets/FTextRXTX.cxx' || echo '$(srcdir)/'`widgets/FTextRXTX.cxx widgets/fldigi-FTextRXTX.obj: widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextRXTX.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo -c -o widgets/fldigi-FTextRXTX.obj `if test -f 'widgets/FTextRXTX.cxx'; then $(CYGPATH_W) 'widgets/FTextRXTX.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextRXTX.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo widgets/$(DEPDIR)/fldigi-FTextRXTX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextRXTX.cxx' object='widgets/fldigi-FTextRXTX.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextRXTX.obj `if test -f 'widgets/FTextRXTX.cxx'; then $(CYGPATH_W) 'widgets/FTextRXTX.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextRXTX.cxx'; fi` widgets/fldigi-FTextView.o: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextView.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextView.Tpo -c -o widgets/fldigi-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextView.Tpo widgets/$(DEPDIR)/fldigi-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/fldigi-FTextView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx widgets/fldigi-FTextView.obj: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextView.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextView.Tpo -c -o widgets/fldigi-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextView.Tpo widgets/$(DEPDIR)/fldigi-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/fldigi-FTextView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` widgets/fldigi-Panel.o: widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Panel.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Panel.Tpo -c -o widgets/fldigi-Panel.o `test -f 'widgets/Panel.cxx' || echo '$(srcdir)/'`widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Panel.Tpo widgets/$(DEPDIR)/fldigi-Panel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Panel.cxx' object='widgets/fldigi-Panel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Panel.o `test -f 'widgets/Panel.cxx' || echo '$(srcdir)/'`widgets/Panel.cxx widgets/fldigi-Panel.obj: widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Panel.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Panel.Tpo -c -o widgets/fldigi-Panel.obj `if test -f 'widgets/Panel.cxx'; then $(CYGPATH_W) 'widgets/Panel.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Panel.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Panel.Tpo widgets/$(DEPDIR)/fldigi-Panel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Panel.cxx' object='widgets/fldigi-Panel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Panel.obj `if test -f 'widgets/Panel.cxx'; then $(CYGPATH_W) 'widgets/Panel.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Panel.cxx'; fi` widgets/fldigi-picture.o: widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-picture.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-picture.Tpo -c -o widgets/fldigi-picture.o `test -f 'widgets/picture.cxx' || echo '$(srcdir)/'`widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-picture.Tpo widgets/$(DEPDIR)/fldigi-picture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/picture.cxx' object='widgets/fldigi-picture.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-picture.o `test -f 'widgets/picture.cxx' || echo '$(srcdir)/'`widgets/picture.cxx widgets/fldigi-picture.obj: widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-picture.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-picture.Tpo -c -o widgets/fldigi-picture.obj `if test -f 'widgets/picture.cxx'; then $(CYGPATH_W) 'widgets/picture.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/picture.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-picture.Tpo widgets/$(DEPDIR)/fldigi-picture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/picture.cxx' object='widgets/fldigi-picture.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-picture.obj `if test -f 'widgets/picture.cxx'; then $(CYGPATH_W) 'widgets/picture.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/picture.cxx'; fi` widgets/fldigi-progress.o: widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-progress.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-progress.Tpo -c -o widgets/fldigi-progress.o `test -f 'widgets/progress.cxx' || echo '$(srcdir)/'`widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-progress.Tpo widgets/$(DEPDIR)/fldigi-progress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/progress.cxx' object='widgets/fldigi-progress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-progress.o `test -f 'widgets/progress.cxx' || echo '$(srcdir)/'`widgets/progress.cxx widgets/fldigi-progress.obj: widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-progress.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-progress.Tpo -c -o widgets/fldigi-progress.obj `if test -f 'widgets/progress.cxx'; then $(CYGPATH_W) 'widgets/progress.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/progress.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-progress.Tpo widgets/$(DEPDIR)/fldigi-progress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/progress.cxx' object='widgets/fldigi-progress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-progress.obj `if test -f 'widgets/progress.cxx'; then $(CYGPATH_W) 'widgets/progress.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/progress.cxx'; fi` widgets/fldigi-psk_browser.o: widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-psk_browser.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-psk_browser.Tpo -c -o widgets/fldigi-psk_browser.o `test -f 'widgets/psk_browser.cxx' || echo '$(srcdir)/'`widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-psk_browser.Tpo widgets/$(DEPDIR)/fldigi-psk_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/psk_browser.cxx' object='widgets/fldigi-psk_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-psk_browser.o `test -f 'widgets/psk_browser.cxx' || echo '$(srcdir)/'`widgets/psk_browser.cxx widgets/fldigi-psk_browser.obj: widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-psk_browser.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-psk_browser.Tpo -c -o widgets/fldigi-psk_browser.obj `if test -f 'widgets/psk_browser.cxx'; then $(CYGPATH_W) 'widgets/psk_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/psk_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-psk_browser.Tpo widgets/$(DEPDIR)/fldigi-psk_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/psk_browser.cxx' object='widgets/fldigi-psk_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-psk_browser.obj `if test -f 'widgets/psk_browser.cxx'; then $(CYGPATH_W) 'widgets/psk_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/psk_browser.cxx'; fi` widgets/fldigi-pwrmeter.o: widgets/pwrmeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-pwrmeter.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo -c -o widgets/fldigi-pwrmeter.o `test -f 'widgets/pwrmeter.cxx' || echo '$(srcdir)/'`widgets/pwrmeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo widgets/$(DEPDIR)/fldigi-pwrmeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/pwrmeter.cxx' object='widgets/fldigi-pwrmeter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-pwrmeter.o `test -f 'widgets/pwrmeter.cxx' || echo '$(srcdir)/'`widgets/pwrmeter.cxx widgets/fldigi-pwrmeter.obj: widgets/pwrmeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-pwrmeter.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo -c -o widgets/fldigi-pwrmeter.obj `if test -f 'widgets/pwrmeter.cxx'; then $(CYGPATH_W) 'widgets/pwrmeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/pwrmeter.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo widgets/$(DEPDIR)/fldigi-pwrmeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/pwrmeter.cxx' object='widgets/fldigi-pwrmeter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-pwrmeter.obj `if test -f 'widgets/pwrmeter.cxx'; then $(CYGPATH_W) 'widgets/pwrmeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/pwrmeter.cxx'; fi` widgets/fldigi-smeter.o: widgets/smeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-smeter.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-smeter.Tpo -c -o widgets/fldigi-smeter.o `test -f 'widgets/smeter.cxx' || echo '$(srcdir)/'`widgets/smeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-smeter.Tpo widgets/$(DEPDIR)/fldigi-smeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/smeter.cxx' object='widgets/fldigi-smeter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-smeter.o `test -f 'widgets/smeter.cxx' || echo '$(srcdir)/'`widgets/smeter.cxx widgets/fldigi-smeter.obj: widgets/smeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-smeter.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-smeter.Tpo -c -o widgets/fldigi-smeter.obj `if test -f 'widgets/smeter.cxx'; then $(CYGPATH_W) 'widgets/smeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/smeter.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-smeter.Tpo widgets/$(DEPDIR)/fldigi-smeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/smeter.cxx' object='widgets/fldigi-smeter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-smeter.obj `if test -f 'widgets/smeter.cxx'; then $(CYGPATH_W) 'widgets/smeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/smeter.cxx'; fi` wwv/fldigi-analysis.o: wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-analysis.o -MD -MP -MF wwv/$(DEPDIR)/fldigi-analysis.Tpo -c -o wwv/fldigi-analysis.o `test -f 'wwv/analysis.cxx' || echo '$(srcdir)/'`wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-analysis.Tpo wwv/$(DEPDIR)/fldigi-analysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/analysis.cxx' object='wwv/fldigi-analysis.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-analysis.o `test -f 'wwv/analysis.cxx' || echo '$(srcdir)/'`wwv/analysis.cxx wwv/fldigi-analysis.obj: wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-analysis.obj -MD -MP -MF wwv/$(DEPDIR)/fldigi-analysis.Tpo -c -o wwv/fldigi-analysis.obj `if test -f 'wwv/analysis.cxx'; then $(CYGPATH_W) 'wwv/analysis.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/analysis.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-analysis.Tpo wwv/$(DEPDIR)/fldigi-analysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/analysis.cxx' object='wwv/fldigi-analysis.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-analysis.obj `if test -f 'wwv/analysis.cxx'; then $(CYGPATH_W) 'wwv/analysis.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/analysis.cxx'; fi` wwv/fldigi-wwv.o: wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-wwv.o -MD -MP -MF wwv/$(DEPDIR)/fldigi-wwv.Tpo -c -o wwv/fldigi-wwv.o `test -f 'wwv/wwv.cxx' || echo '$(srcdir)/'`wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-wwv.Tpo wwv/$(DEPDIR)/fldigi-wwv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/wwv.cxx' object='wwv/fldigi-wwv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-wwv.o `test -f 'wwv/wwv.cxx' || echo '$(srcdir)/'`wwv/wwv.cxx wwv/fldigi-wwv.obj: wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-wwv.obj -MD -MP -MF wwv/$(DEPDIR)/fldigi-wwv.Tpo -c -o wwv/fldigi-wwv.obj `if test -f 'wwv/wwv.cxx'; then $(CYGPATH_W) 'wwv/wwv.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/wwv.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-wwv.Tpo wwv/$(DEPDIR)/fldigi-wwv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/wwv.cxx' object='wwv/fldigi-wwv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-wwv.obj `if test -f 'wwv/wwv.cxx'; then $(CYGPATH_W) 'wwv/wwv.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/wwv.cxx'; fi` blank/fldigi-blank.o: blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT blank/fldigi-blank.o -MD -MP -MF blank/$(DEPDIR)/fldigi-blank.Tpo -c -o blank/fldigi-blank.o `test -f 'blank/blank.cxx' || echo '$(srcdir)/'`blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) blank/$(DEPDIR)/fldigi-blank.Tpo blank/$(DEPDIR)/fldigi-blank.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='blank/blank.cxx' object='blank/fldigi-blank.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o blank/fldigi-blank.o `test -f 'blank/blank.cxx' || echo '$(srcdir)/'`blank/blank.cxx blank/fldigi-blank.obj: blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT blank/fldigi-blank.obj -MD -MP -MF blank/$(DEPDIR)/fldigi-blank.Tpo -c -o blank/fldigi-blank.obj `if test -f 'blank/blank.cxx'; then $(CYGPATH_W) 'blank/blank.cxx'; else $(CYGPATH_W) '$(srcdir)/blank/blank.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) blank/$(DEPDIR)/fldigi-blank.Tpo blank/$(DEPDIR)/fldigi-blank.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='blank/blank.cxx' object='blank/fldigi-blank.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o blank/fldigi-blank.obj `if test -f 'blank/blank.cxx'; then $(CYGPATH_W) 'blank/blank.cxx'; else $(CYGPATH_W) '$(srcdir)/blank/blank.cxx'; fi` dialogs/fldigi-fl_digi_main.o: dialogs/fl_digi_main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi_main.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo -c -o dialogs/fldigi-fl_digi_main.o `test -f 'dialogs/fl_digi_main.cxx' || echo '$(srcdir)/'`dialogs/fl_digi_main.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi_main.cxx' object='dialogs/fldigi-fl_digi_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi_main.o `test -f 'dialogs/fl_digi_main.cxx' || echo '$(srcdir)/'`dialogs/fl_digi_main.cxx dialogs/fldigi-fl_digi_main.obj: dialogs/fl_digi_main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi_main.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo -c -o dialogs/fldigi-fl_digi_main.obj `if test -f 'dialogs/fl_digi_main.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi_main.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi_main.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi_main.cxx' object='dialogs/fldigi-fl_digi_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi_main.obj `if test -f 'dialogs/fl_digi_main.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi_main.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi_main.cxx'; fi` dxcluster/fldigi-arc-help.o: dxcluster/arc-help.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-arc-help.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo -c -o dxcluster/fldigi-arc-help.o `test -f 'dxcluster/arc-help.cxx' || echo '$(srcdir)/'`dxcluster/arc-help.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo dxcluster/$(DEPDIR)/fldigi-arc-help.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/arc-help.cxx' object='dxcluster/fldigi-arc-help.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-arc-help.o `test -f 'dxcluster/arc-help.cxx' || echo '$(srcdir)/'`dxcluster/arc-help.cxx dxcluster/fldigi-arc-help.obj: dxcluster/arc-help.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-arc-help.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo -c -o dxcluster/fldigi-arc-help.obj `if test -f 'dxcluster/arc-help.cxx'; then $(CYGPATH_W) 'dxcluster/arc-help.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/arc-help.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo dxcluster/$(DEPDIR)/fldigi-arc-help.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/arc-help.cxx' object='dxcluster/fldigi-arc-help.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-arc-help.obj `if test -f 'dxcluster/arc-help.cxx'; then $(CYGPATH_W) 'dxcluster/arc-help.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/arc-help.cxx'; fi` dxcluster/fldigi-CCC_Commands.o: dxcluster/CCC_Commands.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-CCC_Commands.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo -c -o dxcluster/fldigi-CCC_Commands.o `test -f 'dxcluster/CCC_Commands.cxx' || echo '$(srcdir)/'`dxcluster/CCC_Commands.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/CCC_Commands.cxx' object='dxcluster/fldigi-CCC_Commands.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-CCC_Commands.o `test -f 'dxcluster/CCC_Commands.cxx' || echo '$(srcdir)/'`dxcluster/CCC_Commands.cxx dxcluster/fldigi-CCC_Commands.obj: dxcluster/CCC_Commands.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-CCC_Commands.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo -c -o dxcluster/fldigi-CCC_Commands.obj `if test -f 'dxcluster/CCC_Commands.cxx'; then $(CYGPATH_W) 'dxcluster/CCC_Commands.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/CCC_Commands.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/CCC_Commands.cxx' object='dxcluster/fldigi-CCC_Commands.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-CCC_Commands.obj `if test -f 'dxcluster/CCC_Commands.cxx'; then $(CYGPATH_W) 'dxcluster/CCC_Commands.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/CCC_Commands.cxx'; fi` dxcluster/fldigi-DXClusterServers.o: dxcluster/DXClusterServers.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXClusterServers.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo -c -o dxcluster/fldigi-DXClusterServers.o `test -f 'dxcluster/DXClusterServers.cxx' || echo '$(srcdir)/'`dxcluster/DXClusterServers.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXClusterServers.cxx' object='dxcluster/fldigi-DXClusterServers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXClusterServers.o `test -f 'dxcluster/DXClusterServers.cxx' || echo '$(srcdir)/'`dxcluster/DXClusterServers.cxx dxcluster/fldigi-DXClusterServers.obj: dxcluster/DXClusterServers.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXClusterServers.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo -c -o dxcluster/fldigi-DXClusterServers.obj `if test -f 'dxcluster/DXClusterServers.cxx'; then $(CYGPATH_W) 'dxcluster/DXClusterServers.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXClusterServers.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXClusterServers.cxx' object='dxcluster/fldigi-DXClusterServers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXClusterServers.obj `if test -f 'dxcluster/DXClusterServers.cxx'; then $(CYGPATH_W) 'dxcluster/DXClusterServers.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXClusterServers.cxx'; fi` dxcluster/fldigi-DXSpiderCommandReference.o: dxcluster/DXSpiderCommandReference.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXSpiderCommandReference.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo -c -o dxcluster/fldigi-DXSpiderCommandReference.o `test -f 'dxcluster/DXSpiderCommandReference.cxx' || echo '$(srcdir)/'`dxcluster/DXSpiderCommandReference.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXSpiderCommandReference.cxx' object='dxcluster/fldigi-DXSpiderCommandReference.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXSpiderCommandReference.o `test -f 'dxcluster/DXSpiderCommandReference.cxx' || echo '$(srcdir)/'`dxcluster/DXSpiderCommandReference.cxx dxcluster/fldigi-DXSpiderCommandReference.obj: dxcluster/DXSpiderCommandReference.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXSpiderCommandReference.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo -c -o dxcluster/fldigi-DXSpiderCommandReference.obj `if test -f 'dxcluster/DXSpiderCommandReference.cxx'; then $(CYGPATH_W) 'dxcluster/DXSpiderCommandReference.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXSpiderCommandReference.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXSpiderCommandReference.cxx' object='dxcluster/fldigi-DXSpiderCommandReference.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXSpiderCommandReference.obj `if test -f 'dxcluster/DXSpiderCommandReference.cxx'; then $(CYGPATH_W) 'dxcluster/DXSpiderCommandReference.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXSpiderCommandReference.cxx'; fi` fileselector/fldigi-flnfc_common.o: fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-flnfc_common.o -MD -MP -MF fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo -c -o fileselector/fldigi-flnfc_common.o `test -f 'fileselector/flnfc_common.cxx' || echo '$(srcdir)/'`fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo fileselector/$(DEPDIR)/fldigi-flnfc_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/flnfc_common.cxx' object='fileselector/fldigi-flnfc_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-flnfc_common.o `test -f 'fileselector/flnfc_common.cxx' || echo '$(srcdir)/'`fileselector/flnfc_common.cxx fileselector/fldigi-flnfc_common.obj: fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-flnfc_common.obj -MD -MP -MF fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo -c -o fileselector/fldigi-flnfc_common.obj `if test -f 'fileselector/flnfc_common.cxx'; then $(CYGPATH_W) 'fileselector/flnfc_common.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/flnfc_common.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo fileselector/$(DEPDIR)/fldigi-flnfc_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/flnfc_common.cxx' object='fileselector/fldigi-flnfc_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-flnfc_common.obj `if test -f 'fileselector/flnfc_common.cxx'; then $(CYGPATH_W) 'fileselector/flnfc_common.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/flnfc_common.cxx'; fi` feld/fldigi-Feld7x7-14.o: feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo -c -o feld/fldigi-Feld7x7-14.o `test -f 'feld/Feld7x7-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7-14.cxx' object='feld/fldigi-Feld7x7-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7-14.o `test -f 'feld/Feld7x7-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7-14.cxx feld/fldigi-Feld7x7-14.obj: feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo -c -o feld/fldigi-Feld7x7-14.obj `if test -f 'feld/Feld7x7-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7-14.cxx' object='feld/fldigi-Feld7x7-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7-14.obj `if test -f 'feld/Feld7x7-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7-14.cxx'; fi` feld/fldigi-Feld7x7n-14.o: feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7n-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo -c -o feld/fldigi-Feld7x7n-14.o `test -f 'feld/Feld7x7n-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7n-14.cxx' object='feld/fldigi-Feld7x7n-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7n-14.o `test -f 'feld/Feld7x7n-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7n-14.cxx feld/fldigi-Feld7x7n-14.obj: feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7n-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo -c -o feld/fldigi-Feld7x7n-14.obj `if test -f 'feld/Feld7x7n-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7n-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7n-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7n-14.cxx' object='feld/fldigi-Feld7x7n-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7n-14.obj `if test -f 'feld/Feld7x7n-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7n-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7n-14.cxx'; fi` feld/fldigi-FeldDx-14.o: feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldDx-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo -c -o feld/fldigi-FeldDx-14.o `test -f 'feld/FeldDx-14.cxx' || echo '$(srcdir)/'`feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo feld/$(DEPDIR)/fldigi-FeldDx-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldDx-14.cxx' object='feld/fldigi-FeldDx-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldDx-14.o `test -f 'feld/FeldDx-14.cxx' || echo '$(srcdir)/'`feld/FeldDx-14.cxx feld/fldigi-FeldDx-14.obj: feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldDx-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo -c -o feld/fldigi-FeldDx-14.obj `if test -f 'feld/FeldDx-14.cxx'; then $(CYGPATH_W) 'feld/FeldDx-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldDx-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo feld/$(DEPDIR)/fldigi-FeldDx-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldDx-14.cxx' object='feld/fldigi-FeldDx-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldDx-14.obj `if test -f 'feld/FeldDx-14.cxx'; then $(CYGPATH_W) 'feld/FeldDx-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldDx-14.cxx'; fi` feld/fldigi-FeldFat-14.o: feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldFat-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo -c -o feld/fldigi-FeldFat-14.o `test -f 'feld/FeldFat-14.cxx' || echo '$(srcdir)/'`feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo feld/$(DEPDIR)/fldigi-FeldFat-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldFat-14.cxx' object='feld/fldigi-FeldFat-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldFat-14.o `test -f 'feld/FeldFat-14.cxx' || echo '$(srcdir)/'`feld/FeldFat-14.cxx feld/fldigi-FeldFat-14.obj: feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldFat-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo -c -o feld/fldigi-FeldFat-14.obj `if test -f 'feld/FeldFat-14.cxx'; then $(CYGPATH_W) 'feld/FeldFat-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldFat-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo feld/$(DEPDIR)/fldigi-FeldFat-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldFat-14.cxx' object='feld/fldigi-FeldFat-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldFat-14.obj `if test -f 'feld/FeldFat-14.cxx'; then $(CYGPATH_W) 'feld/FeldFat-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldFat-14.cxx'; fi` feld/fldigi-FeldHell-12.o: feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldHell-12.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo -c -o feld/fldigi-FeldHell-12.o `test -f 'feld/FeldHell-12.cxx' || echo '$(srcdir)/'`feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo feld/$(DEPDIR)/fldigi-FeldHell-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldHell-12.cxx' object='feld/fldigi-FeldHell-12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldHell-12.o `test -f 'feld/FeldHell-12.cxx' || echo '$(srcdir)/'`feld/FeldHell-12.cxx feld/fldigi-FeldHell-12.obj: feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldHell-12.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo -c -o feld/fldigi-FeldHell-12.obj `if test -f 'feld/FeldHell-12.cxx'; then $(CYGPATH_W) 'feld/FeldHell-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldHell-12.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo feld/$(DEPDIR)/fldigi-FeldHell-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldHell-12.cxx' object='feld/fldigi-FeldHell-12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldHell-12.obj `if test -f 'feld/FeldHell-12.cxx'; then $(CYGPATH_W) 'feld/FeldHell-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldHell-12.cxx'; fi` feld/fldigi-FeldLittle-12.o: feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLittle-12.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo -c -o feld/fldigi-FeldLittle-12.o `test -f 'feld/FeldLittle-12.cxx' || echo '$(srcdir)/'`feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo feld/$(DEPDIR)/fldigi-FeldLittle-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLittle-12.cxx' object='feld/fldigi-FeldLittle-12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLittle-12.o `test -f 'feld/FeldLittle-12.cxx' || echo '$(srcdir)/'`feld/FeldLittle-12.cxx feld/fldigi-FeldLittle-12.obj: feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLittle-12.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo -c -o feld/fldigi-FeldLittle-12.obj `if test -f 'feld/FeldLittle-12.cxx'; then $(CYGPATH_W) 'feld/FeldLittle-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLittle-12.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo feld/$(DEPDIR)/fldigi-FeldLittle-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLittle-12.cxx' object='feld/fldigi-FeldLittle-12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLittle-12.obj `if test -f 'feld/FeldLittle-12.cxx'; then $(CYGPATH_W) 'feld/FeldLittle-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLittle-12.cxx'; fi` feld/fldigi-FeldLo8-14.o: feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLo8-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo -c -o feld/fldigi-FeldLo8-14.o `test -f 'feld/FeldLo8-14.cxx' || echo '$(srcdir)/'`feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo feld/$(DEPDIR)/fldigi-FeldLo8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLo8-14.cxx' object='feld/fldigi-FeldLo8-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLo8-14.o `test -f 'feld/FeldLo8-14.cxx' || echo '$(srcdir)/'`feld/FeldLo8-14.cxx feld/fldigi-FeldLo8-14.obj: feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLo8-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo -c -o feld/fldigi-FeldLo8-14.obj `if test -f 'feld/FeldLo8-14.cxx'; then $(CYGPATH_W) 'feld/FeldLo8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLo8-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo feld/$(DEPDIR)/fldigi-FeldLo8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLo8-14.cxx' object='feld/fldigi-FeldLo8-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLo8-14.obj `if test -f 'feld/FeldLo8-14.cxx'; then $(CYGPATH_W) 'feld/FeldLo8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLo8-14.cxx'; fi` feld/fldigi-FeldLow-14.o: feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLow-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo -c -o feld/fldigi-FeldLow-14.o `test -f 'feld/FeldLow-14.cxx' || echo '$(srcdir)/'`feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo feld/$(DEPDIR)/fldigi-FeldLow-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLow-14.cxx' object='feld/fldigi-FeldLow-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLow-14.o `test -f 'feld/FeldLow-14.cxx' || echo '$(srcdir)/'`feld/FeldLow-14.cxx feld/fldigi-FeldLow-14.obj: feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLow-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo -c -o feld/fldigi-FeldLow-14.obj `if test -f 'feld/FeldLow-14.cxx'; then $(CYGPATH_W) 'feld/FeldLow-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLow-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo feld/$(DEPDIR)/fldigi-FeldLow-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLow-14.cxx' object='feld/fldigi-FeldLow-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLow-14.obj `if test -f 'feld/FeldLow-14.cxx'; then $(CYGPATH_W) 'feld/FeldLow-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLow-14.cxx'; fi` feld/fldigi-FeldModern-14.o: feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo -c -o feld/fldigi-FeldModern-14.o `test -f 'feld/FeldModern-14.cxx' || echo '$(srcdir)/'`feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern-14.cxx' object='feld/fldigi-FeldModern-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern-14.o `test -f 'feld/FeldModern-14.cxx' || echo '$(srcdir)/'`feld/FeldModern-14.cxx feld/fldigi-FeldModern-14.obj: feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo -c -o feld/fldigi-FeldModern-14.obj `if test -f 'feld/FeldModern-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern-14.cxx' object='feld/fldigi-FeldModern-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern-14.obj `if test -f 'feld/FeldModern-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern-14.cxx'; fi` feld/fldigi-FeldModern8-14.o: feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern8-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo -c -o feld/fldigi-FeldModern8-14.o `test -f 'feld/FeldModern8-14.cxx' || echo '$(srcdir)/'`feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern8-14.cxx' object='feld/fldigi-FeldModern8-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern8-14.o `test -f 'feld/FeldModern8-14.cxx' || echo '$(srcdir)/'`feld/FeldModern8-14.cxx feld/fldigi-FeldModern8-14.obj: feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern8-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo -c -o feld/fldigi-FeldModern8-14.obj `if test -f 'feld/FeldModern8-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern8-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern8-14.cxx' object='feld/fldigi-FeldModern8-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern8-14.obj `if test -f 'feld/FeldModern8-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern8-14.cxx'; fi` feld/fldigi-FeldNarr-14.o: feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldNarr-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo -c -o feld/fldigi-FeldNarr-14.o `test -f 'feld/FeldNarr-14.cxx' || echo '$(srcdir)/'`feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo feld/$(DEPDIR)/fldigi-FeldNarr-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldNarr-14.cxx' object='feld/fldigi-FeldNarr-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldNarr-14.o `test -f 'feld/FeldNarr-14.cxx' || echo '$(srcdir)/'`feld/FeldNarr-14.cxx feld/fldigi-FeldNarr-14.obj: feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldNarr-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo -c -o feld/fldigi-FeldNarr-14.obj `if test -f 'feld/FeldNarr-14.cxx'; then $(CYGPATH_W) 'feld/FeldNarr-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldNarr-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo feld/$(DEPDIR)/fldigi-FeldNarr-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldNarr-14.cxx' object='feld/fldigi-FeldNarr-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldNarr-14.obj `if test -f 'feld/FeldNarr-14.cxx'; then $(CYGPATH_W) 'feld/FeldNarr-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldNarr-14.cxx'; fi` feld/fldigi-FeldReal-14.o: feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldReal-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo -c -o feld/fldigi-FeldReal-14.o `test -f 'feld/FeldReal-14.cxx' || echo '$(srcdir)/'`feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo feld/$(DEPDIR)/fldigi-FeldReal-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldReal-14.cxx' object='feld/fldigi-FeldReal-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldReal-14.o `test -f 'feld/FeldReal-14.cxx' || echo '$(srcdir)/'`feld/FeldReal-14.cxx feld/fldigi-FeldReal-14.obj: feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldReal-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo -c -o feld/fldigi-FeldReal-14.obj `if test -f 'feld/FeldReal-14.cxx'; then $(CYGPATH_W) 'feld/FeldReal-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldReal-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo feld/$(DEPDIR)/fldigi-FeldReal-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldReal-14.cxx' object='feld/fldigi-FeldReal-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldReal-14.obj `if test -f 'feld/FeldReal-14.cxx'; then $(CYGPATH_W) 'feld/FeldReal-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldReal-14.cxx'; fi` feld/fldigi-FeldStyl-14.o: feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldStyl-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo -c -o feld/fldigi-FeldStyl-14.o `test -f 'feld/FeldStyl-14.cxx' || echo '$(srcdir)/'`feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo feld/$(DEPDIR)/fldigi-FeldStyl-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldStyl-14.cxx' object='feld/fldigi-FeldStyl-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldStyl-14.o `test -f 'feld/FeldStyl-14.cxx' || echo '$(srcdir)/'`feld/FeldStyl-14.cxx feld/fldigi-FeldStyl-14.obj: feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldStyl-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo -c -o feld/fldigi-FeldStyl-14.obj `if test -f 'feld/FeldStyl-14.cxx'; then $(CYGPATH_W) 'feld/FeldStyl-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldStyl-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo feld/$(DEPDIR)/fldigi-FeldStyl-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldStyl-14.cxx' object='feld/fldigi-FeldStyl-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldStyl-14.obj `if test -f 'feld/FeldStyl-14.cxx'; then $(CYGPATH_W) 'feld/FeldStyl-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldStyl-14.cxx'; fi` feld/fldigi-FeldVert-14.o: feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldVert-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo -c -o feld/fldigi-FeldVert-14.o `test -f 'feld/FeldVert-14.cxx' || echo '$(srcdir)/'`feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo feld/$(DEPDIR)/fldigi-FeldVert-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldVert-14.cxx' object='feld/fldigi-FeldVert-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldVert-14.o `test -f 'feld/FeldVert-14.cxx' || echo '$(srcdir)/'`feld/FeldVert-14.cxx feld/fldigi-FeldVert-14.obj: feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldVert-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo -c -o feld/fldigi-FeldVert-14.obj `if test -f 'feld/FeldVert-14.cxx'; then $(CYGPATH_W) 'feld/FeldVert-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldVert-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo feld/$(DEPDIR)/fldigi-FeldVert-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldVert-14.cxx' object='feld/fldigi-FeldVert-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldVert-14.obj `if test -f 'feld/FeldVert-14.cxx'; then $(CYGPATH_W) 'feld/FeldVert-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldVert-14.cxx'; fi` feld/fldigi-FeldWide-14.o: feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldWide-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo -c -o feld/fldigi-FeldWide-14.o `test -f 'feld/FeldWide-14.cxx' || echo '$(srcdir)/'`feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo feld/$(DEPDIR)/fldigi-FeldWide-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldWide-14.cxx' object='feld/fldigi-FeldWide-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldWide-14.o `test -f 'feld/FeldWide-14.cxx' || echo '$(srcdir)/'`feld/FeldWide-14.cxx feld/fldigi-FeldWide-14.obj: feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldWide-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo -c -o feld/fldigi-FeldWide-14.obj `if test -f 'feld/FeldWide-14.cxx'; then $(CYGPATH_W) 'feld/FeldWide-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldWide-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo feld/$(DEPDIR)/fldigi-FeldWide-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldWide-14.cxx' object='feld/fldigi-FeldWide-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldWide-14.obj `if test -f 'feld/FeldWide-14.cxx'; then $(CYGPATH_W) 'feld/FeldWide-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldWide-14.cxx'; fi` fsq/fldigi-fsq_varicode.o: fsq/fsq_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_varicode.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo -c -o fsq/fldigi-fsq_varicode.o `test -f 'fsq/fsq_varicode.cxx' || echo '$(srcdir)/'`fsq/fsq_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo fsq/$(DEPDIR)/fldigi-fsq_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_varicode.cxx' object='fsq/fldigi-fsq_varicode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_varicode.o `test -f 'fsq/fsq_varicode.cxx' || echo '$(srcdir)/'`fsq/fsq_varicode.cxx fsq/fldigi-fsq_varicode.obj: fsq/fsq_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_varicode.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo -c -o fsq/fldigi-fsq_varicode.obj `if test -f 'fsq/fsq_varicode.cxx'; then $(CYGPATH_W) 'fsq/fsq_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_varicode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo fsq/$(DEPDIR)/fldigi-fsq_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_varicode.cxx' object='fsq/fldigi-fsq_varicode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_varicode.obj `if test -f 'fsq/fsq_varicode.cxx'; then $(CYGPATH_W) 'fsq/fsq_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_varicode.cxx'; fi` fsq/fldigi-fsq-pic.o: fsq/fsq-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq-pic.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo -c -o fsq/fldigi-fsq-pic.o `test -f 'fsq/fsq-pic.cxx' || echo '$(srcdir)/'`fsq/fsq-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo fsq/$(DEPDIR)/fldigi-fsq-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq-pic.cxx' object='fsq/fldigi-fsq-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq-pic.o `test -f 'fsq/fsq-pic.cxx' || echo '$(srcdir)/'`fsq/fsq-pic.cxx fsq/fldigi-fsq-pic.obj: fsq/fsq-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq-pic.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo -c -o fsq/fldigi-fsq-pic.obj `if test -f 'fsq/fsq-pic.cxx'; then $(CYGPATH_W) 'fsq/fsq-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo fsq/$(DEPDIR)/fldigi-fsq-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq-pic.cxx' object='fsq/fldigi-fsq-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq-pic.obj `if test -f 'fsq/fsq-pic.cxx'; then $(CYGPATH_W) 'fsq/fsq-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq-pic.cxx'; fi` fsq/fldigi-bitmaps.o: fsq/bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-bitmaps.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-bitmaps.Tpo -c -o fsq/fldigi-bitmaps.o `test -f 'fsq/bitmaps.cxx' || echo '$(srcdir)/'`fsq/bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-bitmaps.Tpo fsq/$(DEPDIR)/fldigi-bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/bitmaps.cxx' object='fsq/fldigi-bitmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-bitmaps.o `test -f 'fsq/bitmaps.cxx' || echo '$(srcdir)/'`fsq/bitmaps.cxx fsq/fldigi-bitmaps.obj: fsq/bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-bitmaps.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-bitmaps.Tpo -c -o fsq/fldigi-bitmaps.obj `if test -f 'fsq/bitmaps.cxx'; then $(CYGPATH_W) 'fsq/bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/bitmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-bitmaps.Tpo fsq/$(DEPDIR)/fldigi-bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/bitmaps.cxx' object='fsq/fldigi-bitmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-bitmaps.obj `if test -f 'fsq/bitmaps.cxx'; then $(CYGPATH_W) 'fsq/bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/bitmaps.cxx'; fi` ifkp/fldigi-ifkp_bitmaps.o: ifkp/ifkp_bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_bitmaps.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo -c -o ifkp/fldigi-ifkp_bitmaps.o `test -f 'ifkp/ifkp_bitmaps.cxx' || echo '$(srcdir)/'`ifkp/ifkp_bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_bitmaps.cxx' object='ifkp/fldigi-ifkp_bitmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_bitmaps.o `test -f 'ifkp/ifkp_bitmaps.cxx' || echo '$(srcdir)/'`ifkp/ifkp_bitmaps.cxx ifkp/fldigi-ifkp_bitmaps.obj: ifkp/ifkp_bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_bitmaps.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo -c -o ifkp/fldigi-ifkp_bitmaps.obj `if test -f 'ifkp/ifkp_bitmaps.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_bitmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_bitmaps.cxx' object='ifkp/fldigi-ifkp_bitmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_bitmaps.obj `if test -f 'ifkp/ifkp_bitmaps.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_bitmaps.cxx'; fi` ifkp/fldigi-ifkp_varicode.o: ifkp/ifkp_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_varicode.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo -c -o ifkp/fldigi-ifkp_varicode.o `test -f 'ifkp/ifkp_varicode.cxx' || echo '$(srcdir)/'`ifkp/ifkp_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_varicode.cxx' object='ifkp/fldigi-ifkp_varicode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_varicode.o `test -f 'ifkp/ifkp_varicode.cxx' || echo '$(srcdir)/'`ifkp/ifkp_varicode.cxx ifkp/fldigi-ifkp_varicode.obj: ifkp/ifkp_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_varicode.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo -c -o ifkp/fldigi-ifkp_varicode.obj `if test -f 'ifkp/ifkp_varicode.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_varicode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_varicode.cxx' object='ifkp/fldigi-ifkp_varicode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_varicode.obj `if test -f 'ifkp/ifkp_varicode.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_varicode.cxx'; fi` ifkp/fldigi-ifkp-pic.o: ifkp/ifkp-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp-pic.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo -c -o ifkp/fldigi-ifkp-pic.o `test -f 'ifkp/ifkp-pic.cxx' || echo '$(srcdir)/'`ifkp/ifkp-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp-pic.cxx' object='ifkp/fldigi-ifkp-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp-pic.o `test -f 'ifkp/ifkp-pic.cxx' || echo '$(srcdir)/'`ifkp/ifkp-pic.cxx ifkp/fldigi-ifkp-pic.obj: ifkp/ifkp-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp-pic.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo -c -o ifkp/fldigi-ifkp-pic.obj `if test -f 'ifkp/ifkp-pic.cxx'; then $(CYGPATH_W) 'ifkp/ifkp-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp-pic.cxx' object='ifkp/fldigi-ifkp-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp-pic.obj `if test -f 'ifkp/ifkp-pic.cxx'; then $(CYGPATH_W) 'ifkp/ifkp-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp-pic.cxx'; fi` mfsk/fldigi-mfsk-pic.o: mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk-pic.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo -c -o mfsk/fldigi-mfsk-pic.o `test -f 'mfsk/mfsk-pic.cxx' || echo '$(srcdir)/'`mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk-pic.cxx' object='mfsk/fldigi-mfsk-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk-pic.o `test -f 'mfsk/mfsk-pic.cxx' || echo '$(srcdir)/'`mfsk/mfsk-pic.cxx mfsk/fldigi-mfsk-pic.obj: mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk-pic.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo -c -o mfsk/fldigi-mfsk-pic.obj `if test -f 'mfsk/mfsk-pic.cxx'; then $(CYGPATH_W) 'mfsk/mfsk-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk-pic.cxx' object='mfsk/fldigi-mfsk-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk-pic.obj `if test -f 'mfsk/mfsk-pic.cxx'; then $(CYGPATH_W) 'mfsk/mfsk-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk-pic.cxx'; fi` rsid/fldigi-rsid_defs.o: rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid_defs.o -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo -c -o rsid/fldigi-rsid_defs.o `test -f 'rsid/rsid_defs.cxx' || echo '$(srcdir)/'`rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo rsid/$(DEPDIR)/fldigi-rsid_defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid_defs.cxx' object='rsid/fldigi-rsid_defs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid_defs.o `test -f 'rsid/rsid_defs.cxx' || echo '$(srcdir)/'`rsid/rsid_defs.cxx rsid/fldigi-rsid_defs.obj: rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid_defs.obj -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo -c -o rsid/fldigi-rsid_defs.obj `if test -f 'rsid/rsid_defs.cxx'; then $(CYGPATH_W) 'rsid/rsid_defs.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid_defs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo rsid/$(DEPDIR)/fldigi-rsid_defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid_defs.cxx' object='rsid/fldigi-rsid_defs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid_defs.obj `if test -f 'rsid/rsid_defs.cxx'; then $(CYGPATH_W) 'rsid/rsid_defs.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid_defs.cxx'; fi` thor/fldigi-thor-pic.o: thor/thor-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor-pic.o -MD -MP -MF thor/$(DEPDIR)/fldigi-thor-pic.Tpo -c -o thor/fldigi-thor-pic.o `test -f 'thor/thor-pic.cxx' || echo '$(srcdir)/'`thor/thor-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor-pic.Tpo thor/$(DEPDIR)/fldigi-thor-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor-pic.cxx' object='thor/fldigi-thor-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor-pic.o `test -f 'thor/thor-pic.cxx' || echo '$(srcdir)/'`thor/thor-pic.cxx thor/fldigi-thor-pic.obj: thor/thor-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor-pic.obj -MD -MP -MF thor/$(DEPDIR)/fldigi-thor-pic.Tpo -c -o thor/fldigi-thor-pic.obj `if test -f 'thor/thor-pic.cxx'; then $(CYGPATH_W) 'thor/thor-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor-pic.Tpo thor/$(DEPDIR)/fldigi-thor-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor-pic.cxx' object='thor/fldigi-thor-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor-pic.obj `if test -f 'thor/thor-pic.cxx'; then $(CYGPATH_W) 'thor/thor-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor-pic.cxx'; fi` trx/fldigi-tune.o: trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-tune.o -MD -MP -MF trx/$(DEPDIR)/fldigi-tune.Tpo -c -o trx/fldigi-tune.o `test -f 'trx/tune.cxx' || echo '$(srcdir)/'`trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-tune.Tpo trx/$(DEPDIR)/fldigi-tune.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/tune.cxx' object='trx/fldigi-tune.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-tune.o `test -f 'trx/tune.cxx' || echo '$(srcdir)/'`trx/tune.cxx trx/fldigi-tune.obj: trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-tune.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-tune.Tpo -c -o trx/fldigi-tune.obj `if test -f 'trx/tune.cxx'; then $(CYGPATH_W) 'trx/tune.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/tune.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-tune.Tpo trx/$(DEPDIR)/fldigi-tune.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/tune.cxx' object='trx/fldigi-tune.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-tune.obj `if test -f 'trx/tune.cxx'; then $(CYGPATH_W) 'trx/tune.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/tune.cxx'; fi` dialogs/fldigi-guide.o: dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-guide.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-guide.Tpo -c -o dialogs/fldigi-guide.o `test -f 'dialogs/guide.cxx' || echo '$(srcdir)/'`dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-guide.Tpo dialogs/$(DEPDIR)/fldigi-guide.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/guide.cxx' object='dialogs/fldigi-guide.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-guide.o `test -f 'dialogs/guide.cxx' || echo '$(srcdir)/'`dialogs/guide.cxx dialogs/fldigi-guide.obj: dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-guide.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-guide.Tpo -c -o dialogs/fldigi-guide.obj `if test -f 'dialogs/guide.cxx'; then $(CYGPATH_W) 'dialogs/guide.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/guide.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-guide.Tpo dialogs/$(DEPDIR)/fldigi-guide.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/guide.cxx' object='dialogs/fldigi-guide.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-guide.obj `if test -f 'dialogs/guide.cxx'; then $(CYGPATH_W) 'dialogs/guide.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/guide.cxx'; fi` .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? $(tmp_srcdir_var)/../scripts/tests/config-h.sh.log: $(tmp_srcdir_var)/../scripts/tests/config-h.sh @p='$(tmp_srcdir_var)/../scripts/tests/config-h.sh'; \ b='$(tmp_srcdir_var)/../scripts/tests/config-h.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) $(tmp_srcdir_var)/../scripts/tests/cr.sh.log: $(tmp_srcdir_var)/../scripts/tests/cr.sh @p='$(tmp_srcdir_var)/../scripts/tests/cr.sh'; \ b='$(tmp_srcdir_var)/../scripts/tests/cr.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f blank/$(DEPDIR)/$(am__dirstamp) -rm -f blank/$(am__dirstamp) -rm -f combo/$(DEPDIR)/$(am__dirstamp) -rm -f combo/$(am__dirstamp) -rm -f compat/$(DEPDIR)/$(am__dirstamp) -rm -f compat/$(am__dirstamp) -rm -f config_script/$(DEPDIR)/$(am__dirstamp) -rm -f config_script/$(am__dirstamp) -rm -f contestia/$(DEPDIR)/$(am__dirstamp) -rm -f contestia/$(am__dirstamp) -rm -f cw_rtty/$(DEPDIR)/$(am__dirstamp) -rm -f cw_rtty/$(am__dirstamp) -rm -f dialogs/$(DEPDIR)/$(am__dirstamp) -rm -f dialogs/$(am__dirstamp) -rm -f dominoex/$(DEPDIR)/$(am__dirstamp) -rm -f dominoex/$(am__dirstamp) -rm -f dtmf/$(DEPDIR)/$(am__dirstamp) -rm -f dtmf/$(am__dirstamp) -rm -f dxcluster/$(DEPDIR)/$(am__dirstamp) -rm -f dxcluster/$(am__dirstamp) -rm -f feld/$(DEPDIR)/$(am__dirstamp) -rm -f feld/$(am__dirstamp) -rm -f fft-monitor/$(DEPDIR)/$(am__dirstamp) -rm -f fft-monitor/$(am__dirstamp) -rm -f fileselector/$(DEPDIR)/$(am__dirstamp) -rm -f fileselector/$(am__dirstamp) -rm -f filters/$(DEPDIR)/$(am__dirstamp) -rm -f filters/$(am__dirstamp) -rm -f flarq-src/$(DEPDIR)/$(am__dirstamp) -rm -f flarq-src/$(am__dirstamp) -rm -f fsq/$(DEPDIR)/$(am__dirstamp) -rm -f fsq/$(am__dirstamp) -rm -f globals/$(DEPDIR)/$(am__dirstamp) -rm -f globals/$(am__dirstamp) -rm -f ifkp/$(DEPDIR)/$(am__dirstamp) -rm -f ifkp/$(am__dirstamp) -rm -f irrxml/$(DEPDIR)/$(am__dirstamp) -rm -f irrxml/$(am__dirstamp) -rm -f libtiniconv/$(DEPDIR)/$(am__dirstamp) -rm -f libtiniconv/$(am__dirstamp) -rm -f logbook/$(DEPDIR)/$(am__dirstamp) -rm -f logbook/$(am__dirstamp) -rm -f logger/$(DEPDIR)/$(am__dirstamp) -rm -f logger/$(am__dirstamp) -rm -f mbedtls/$(DEPDIR)/$(am__dirstamp) -rm -f mbedtls/$(am__dirstamp) -rm -f mfsk/$(DEPDIR)/$(am__dirstamp) -rm -f mfsk/$(am__dirstamp) -rm -f misc/$(DEPDIR)/$(am__dirstamp) -rm -f misc/$(am__dirstamp) -rm -f mt63/$(DEPDIR)/$(am__dirstamp) -rm -f mt63/$(am__dirstamp) -rm -f navtex/$(DEPDIR)/$(am__dirstamp) -rm -f navtex/$(am__dirstamp) -rm -f network/$(DEPDIR)/$(am__dirstamp) -rm -f network/$(am__dirstamp) -rm -f olivia/$(DEPDIR)/$(am__dirstamp) -rm -f olivia/$(am__dirstamp) -rm -f psk/$(DEPDIR)/$(am__dirstamp) -rm -f psk/$(am__dirstamp) -rm -f psm/$(DEPDIR)/$(am__dirstamp) -rm -f psm/$(am__dirstamp) -rm -f qrunner/$(DEPDIR)/$(am__dirstamp) -rm -f qrunner/$(am__dirstamp) -rm -f rigcontrol/$(DEPDIR)/$(am__dirstamp) -rm -f rigcontrol/$(am__dirstamp) -rm -f rsid/$(DEPDIR)/$(am__dirstamp) -rm -f rsid/$(am__dirstamp) -rm -f soundcard/$(DEPDIR)/$(am__dirstamp) -rm -f soundcard/$(am__dirstamp) -rm -f spot/$(DEPDIR)/$(am__dirstamp) -rm -f spot/$(am__dirstamp) -rm -f ssb/$(DEPDIR)/$(am__dirstamp) -rm -f ssb/$(am__dirstamp) -rm -f synop-src/$(DEPDIR)/$(am__dirstamp) -rm -f synop-src/$(am__dirstamp) -rm -f thor/$(DEPDIR)/$(am__dirstamp) -rm -f thor/$(am__dirstamp) -rm -f throb/$(DEPDIR)/$(am__dirstamp) -rm -f throb/$(am__dirstamp) -rm -f trx/$(DEPDIR)/$(am__dirstamp) -rm -f trx/$(am__dirstamp) -rm -f waterfall/$(DEPDIR)/$(am__dirstamp) -rm -f waterfall/$(am__dirstamp) -rm -f wefax/$(DEPDIR)/$(am__dirstamp) -rm -f wefax/$(am__dirstamp) -rm -f widgets/$(DEPDIR)/$(am__dirstamp) -rm -f widgets/$(am__dirstamp) -rm -f wwv/$(DEPDIR)/$(am__dirstamp) -rm -f wwv/$(am__dirstamp) -rm -f xmlrpcpp/$(DEPDIR)/$(am__dirstamp) -rm -f xmlrpcpp/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) @HAVE_ASCIIDOC_FALSE@distclean-local: clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) blank/$(DEPDIR) combo/$(DEPDIR) compat/$(DEPDIR) config_script/$(DEPDIR) contestia/$(DEPDIR) cw_rtty/$(DEPDIR) dialogs/$(DEPDIR) dominoex/$(DEPDIR) dtmf/$(DEPDIR) dxcluster/$(DEPDIR) feld/$(DEPDIR) fft-monitor/$(DEPDIR) fileselector/$(DEPDIR) filters/$(DEPDIR) flarq-src/$(DEPDIR) fsq/$(DEPDIR) globals/$(DEPDIR) ifkp/$(DEPDIR) irrxml/$(DEPDIR) libtiniconv/$(DEPDIR) logbook/$(DEPDIR) logger/$(DEPDIR) mbedtls/$(DEPDIR) mfsk/$(DEPDIR) misc/$(DEPDIR) mt63/$(DEPDIR) navtex/$(DEPDIR) network/$(DEPDIR) olivia/$(DEPDIR) psk/$(DEPDIR) psm/$(DEPDIR) qrunner/$(DEPDIR) rigcontrol/$(DEPDIR) rsid/$(DEPDIR) soundcard/$(DEPDIR) spot/$(DEPDIR) ssb/$(DEPDIR) synop-src/$(DEPDIR) thor/$(DEPDIR) throb/$(DEPDIR) trx/$(DEPDIR) waterfall/$(DEPDIR) wefax/$(DEPDIR) widgets/$(DEPDIR) wwv/$(DEPDIR) xmlrpcpp/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-data-local install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-exec-local install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: installcheck-binPROGRAMS maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) blank/$(DEPDIR) combo/$(DEPDIR) compat/$(DEPDIR) config_script/$(DEPDIR) contestia/$(DEPDIR) cw_rtty/$(DEPDIR) dialogs/$(DEPDIR) dominoex/$(DEPDIR) dtmf/$(DEPDIR) dxcluster/$(DEPDIR) feld/$(DEPDIR) fft-monitor/$(DEPDIR) fileselector/$(DEPDIR) filters/$(DEPDIR) flarq-src/$(DEPDIR) fsq/$(DEPDIR) globals/$(DEPDIR) ifkp/$(DEPDIR) irrxml/$(DEPDIR) libtiniconv/$(DEPDIR) logbook/$(DEPDIR) logger/$(DEPDIR) mbedtls/$(DEPDIR) mfsk/$(DEPDIR) misc/$(DEPDIR) mt63/$(DEPDIR) navtex/$(DEPDIR) network/$(DEPDIR) olivia/$(DEPDIR) psk/$(DEPDIR) psm/$(DEPDIR) qrunner/$(DEPDIR) rigcontrol/$(DEPDIR) rsid/$(DEPDIR) soundcard/$(DEPDIR) spot/$(DEPDIR) ssb/$(DEPDIR) synop-src/$(DEPDIR) thor/$(DEPDIR) throb/$(DEPDIR) trx/$(DEPDIR) waterfall/$(DEPDIR) wefax/$(DEPDIR) widgets/$(DEPDIR) wwv/$(DEPDIR) xmlrpcpp/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-local .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-TESTS check-am clean clean-binPROGRAMS clean-generic \ clean-local cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-local distclean-tags distdir dvi dvi-am html html-am \ info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installcheck-binPROGRAMS installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-local .PRECIOUS: Makefile # Define the custom silent rule function @SILENT_CMDS@ .EXPORT_ALL_VARIABLES: appbundle nsisinst hamlib-static @HAVE_WINDRES_TRUE@@WIN32_TRUE@.rc.o: @HAVE_WINDRES_TRUE@@WIN32_TRUE@ $(call silent,WRES ,$@)$(WINDRES) -DRC_BUILD_TIME=\\\"$(shell date +%s)\\\" -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/../data/win32 $< -O coff $@ install-exec-local: @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../scripts/ftp_kml_files.sh; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ $(INSTALL_SCRIPT) $(srcdir)/../scripts/ftp_kml_files.sh $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ fi # TODO: xpm files should probably go to $(datadir)/pixmaps/fldigi instead of $(datadir)/pixmaps install-data-local: @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/fldigi.xpm; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/fldigi.xpm $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/fldigi.desktop; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/fldigi.desktop $(DESTDIR)/$(datadir)/applications; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/NAVTEX_Stations.csv; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/NAVTEX_Stations.csv $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/nsd_bbsss.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/nsd_bbsss.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/station_table.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/station_table.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/ToR-Stats-SHIP.csv; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/ToR-Stats-SHIP.csv $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/wmo_list.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/wmo_list.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../kml/styles.kml; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(pkgdatadir)/kml; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../kml/styles.kml $(DESTDIR)/$(pkgdatadir)/kml; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLARQ_TRUE@ if test -f $(srcdir)/../data/flarq.xpm; then \ @WANT_FLARQ_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLARQ_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/flarq.xpm $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLARQ_TRUE@ fi @WANT_FLARQ_TRUE@ if test -f $(srcdir)/../data/flarq.desktop; then \ @WANT_FLARQ_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ @WANT_FLARQ_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/flarq.desktop $(DESTDIR)/$(datadir)/applications; \ @WANT_FLARQ_TRUE@ fi uninstall-local: @WANT_FLDIGI_TRUE@ rm -f $(DESTDIR)/$(datadir)/pixmaps/fldigi.xpm @WANT_FLDIGI_TRUE@ rm -f $(DESTDIR)/$(datadir)/applications/fldigi.desktop @WANT_FLDIGI_TRUE@ rm -fr $(DESTDIR)/$(datadir)/fldigi @WANT_FLARQ_TRUE@ rm -f $(DESTDIR)/$(datadir)/pixmaps/flarq.xpm @WANT_FLARQ_TRUE@ rm -f $(DESTDIR)/$(datadir)/applications/flarq.desktop @HAVE_FLUID_TRUE@flgen: $(FLDIGI_FL_SRC) $(FLARQ_FL_SRC) @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ $(call silent,FLUID ,$(FLDIGI_FL_SRC))(cd $(srcdir)/include; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ for f in $(FLDIGI_FL_SRC); do \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ $(FLUID) -c -o ../$$c -h $$h ../$$f; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ done) @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ $(call silent,FLUID ,$(FLARQ_FL_SRC))(cd $(srcdir)/flarq-src/include; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ for f in $(FLARQ_FL_SRC); do \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ $(FLUID) -c -o ../../$$c -h $$h ../../$$f; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ done) @DARWIN_TRUE@appbundle: $(bin_PROGRAMS) @DARWIN_TRUE@ $(call silent,APPB ,$(APPBUNDLE_NOLIBS) $(APPBUNDLE))sh $(srcdir)/../scripts/mkappbundle.sh "$(srcdir)/../data" . @HAVE_NSIS_TRUE@nsisinst: $(bin_PROGRAMS) @HAVE_NSIS_TRUE@ $(call silent,NSIS ,$(INSTALLER_FILE))sh $(srcdir)/../scripts/mknsisinst.sh "$(srcdir)/../data" . @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@hamlib-static: $(fldigi_OBJECTS) @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@ $(call silent,HLS ,fldigi$(EXEEXT))sh $(srcdir)/../scripts/mkhamlibstatic.sh fldigi @HAVE_ASCIIDOC_TRUE@$(builddir)/../doc/guide.html: $(builddir)/../doc/guide.txt @HAVE_ASCIIDOC_TRUE@ @$(MAKE) -C $(builddir)/../doc $(AM_MAKEFLAGS) guide.html @HAVE_ASCIIDOC_TRUE@$(builddir)/dialogs/guide.cxx: $(builddir)/../doc/guide.html @HAVE_ASCIIDOC_TRUE@ @mkdir -p $(builddir)/dialogs @HAVE_ASCIIDOC_TRUE@ $(call silent,GUIDE ,$@)sed 's/\\/\\\\/g; s/"/\\"/g; s/$$/\\n\\/g; 1 s/.*/const char* szBeginner = "&/; $$ s/.*/&n";/' $< > $@ @HAVE_ASCIIDOC_TRUE@dialogs/htmlstrings.cxx: $(builddir)/dialogs/guide.cxx @HAVE_ASCIIDOC_TRUE@distclean-local: @HAVE_ASCIIDOC_TRUE@ @if test "$(builddir)" != "$(srcdir)"; then \ @HAVE_ASCIIDOC_TRUE@ rm -f $(builddir)/dialogs/guide.cxx; \ @HAVE_ASCIIDOC_TRUE@ fi clean-local: -rm -rf $(CLEAN_LOCAL) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-4.1.06/src/soundcard/0000775000175000017500000000000013515625027012622 500000000000000fldigi-4.1.06/src/soundcard/steam_train.cxx0000644000175000017500000116573713472116000015602 00000000000000#define STEAM_TRAIN_SIZE 50225 int int_steam_train[STEAM_TRAIN_SIZE] = { -1, 2, -2, 2, -2, 1, 0, -1, 3, -3, 2, -1, 1, -1, 2, -2, 0, 2, -3, 3, -4, 2, -2, 1, 0, 0, 2, -1, 0, 2, -4, 6, -3, 2, -1, -2, 2, 0, 0, 2, 0, 3, 3, 0, 4, 3, 4, 6, 2, 4, 1, 3, 0, 1, -3, -2, 0, -1, -1, -6, 0, -1, 10, 5, 5, 0, 5, 3, 3, 0, -4, 0, -4, -9, -7, -12, 1, 3, 1, -12, -15, -5, 0, -5, -16, -18, -11, -13, -9, -9, -10, -4, -6, 7, -4, -4, -8, 4, 11, 5, -4, -2, 1, -3, -8, -15, -4, 3, -1, -8, -14, -2, -3, 0, -10, -10, -8, -9, -17, -25, -22, -5, 4, 4, -1, 3, 17, 22, 14, 4, 0, -8, -21, -21, -23, -32, -33, -16, -6, -3, -15, -10, 9, 31, 34, 23, 29, 29, 14, -12, -11, -20, -44, -55, -68, -56, -29, -7, -25, -34, -33, -14, 7, 28, 22, 37, 44, 75, 73, 56, 5, -15, -30, -33, -44, -38, -38, -33, -46, -52, -33, -18, 16, 21, 29, 32, 26, 17, 5, 0, 3, 29, 40, 20, -2, -13, -23, -32, -40, -31, -26, -20, -5, -4, -1, 14, 26, 26, 13, 0, -1, -34, -60, -57, -49, -60, -43, -32, 1, 15, 36, 26, 10, 13, 18, -7, -35, -50, -44, -11, 17, 47, 69, 32, 0, 1, 42, 52, 69, 89, 75, 70, 106, 153, 204, 214, 149, 77, -30, -106, -150, -145, -139, -103, -60, 24, 92, 145, 148, 161, 210, 248, 210, 155, 107, 64, -7, -80, -101, -114, -152, -240, -257, -211, -149, -93, -17, 77, 140, 171, 191, 147, 120, 143, 141, 78, 47, 65, 25, -11, -39, -52, -120, -187, -232, -259, -306, -305, -254, -153, -41, 22, 148, 242, 299, 248, 143, 67, 28, 22, -55, -140, -202, -248, -212, -144, -51, 106, 241, 302, 285, 257, 116, -34, -160, -241, -360, -449, -382, -281, -144, -30, 147, 415, 581, 645, 596, 461, 266, 16, -233, -434, -562, -576, -474, -302, -124, -5, 152, 346, 462, 524, 490, 367, 339, 366, 355, 324, 232, 59, -115, -282, -369, -396, -401, -374, -350, -424, -486, -451, -286, -64, 103, 196, 267, 357, 421, 378, 321, 231, 157, 14, -258, -533, -813, -894, -825, -616, -429, -357, -283, -194, -4, 251, 462, 483, 408, 306, 120, -54, -135, -89, -40, 52, 57, -22, -196, -426, -514, -491, -337, -189, -45, 119, 232, 320, 252, 160, 40, -54, -33, 3, -79, -192, -214, -119, 1, 43, 12, 95, 298, 480, 498, 352, 247, 113, -76, -382, -656, -707, -660, -513, -360, -164, 41, 295, 492, 635, 736, 819, 916, 859, 764, 478, 15, -521, -970, -1242, -1444, -1396, -1218, -867, -455, -22, 520, 972, 1315, 1384, 1312, 1146, 826, 358, -220, -676, -979, -1005, -752, -475, -181, 123, 358, 448, 374, 96, -342, -608, -690, -684, -481, 40, 693, 1013, 1130, 1220, 1146, 992, 588, -3, -573, -1216, -1662, -1752, -1222, -525, 62, 640, 1024, 1184, 1154, 1093, 853, 470, 27, -461, -732, -866, -935, -724, -388, -99, 155, 321, 307, 474, 638, 504, 300, 9, -230, -344, -402, -553, -671, -639, -556, -314, 0, 284, 449, 459, 724, 969, 1219, 1317, 1089, 714, 315, -90, -764, -1352, -1806, -1802, -1518, -1111, -478, 95, 600, 876, 1084, 1334, 1462, 1273, 893, 413, 7, -75, -45, -125, -433, -629, -831, -1021, -1218, -1377, -1144, -797, -268, 274, 557, 813, 1063, 1369, 1606, 1535, 1148, 463, -422, -1141, -1220, -989, -635, -399, -240, -33, 149, 381, 337, 89, -223, -688, -996, -915, -599, 3, 533, 1123, 1796, 2165, 2078, 1347, 521, -528, -1468, -1857, -2133, -1917, -1256, -480, 266, 785, 1211, 1454, 1540, 1043, 114, -925, -1922, -2439, -2422, -1904, -937, 51, 1093, 1877, 2490, 2805, 2579, 1718, 227, -1065, -2216, -2770, -2873, -2778, -2225, -1566, -632, 252, 1055, 1743, 1922, 1892, 1505, 979, 515, 131, -101, -197, -134, -51, -319, -871, -1377, -1779, -1707, -1494, -1173, -731, -193, 141, 517, 1218, 1590, 1697, 1554, 1034, 479, -65, -361, -432, -315, -21, 227, 317, 184, -343, -969, -1525, -1784, -1622, -1336, -789, -51, 962, 1944, 2668, 3195, 2876, 2155, 836, -597, -1508, -2208, -2459, -2326, -1897, -1319, -490, 615, 1636, 2470, 2397, 1621, 756, -100, -679, -1147, -1355, -1300, -973, -152, 631, 1213, 1505, 1223, 932, 413, -69, -438, -764, -739, -675, -574, -582, -411, -158, -163, -446, -896, -1276, -1283, -1035, -571, 48, 648, 1564, 2283, 2663, 2460, 1596, 523, -682, -1590, -2138, -2459, -2539, -2360, -1678, -612, 487, 1220, 1405, 1251, 1075, 1194, 1468, 1872, 1903, 1662, 1085, 482, -226, -870, -1437, -1938, -2191, -2305, -1908, -1263, -447, 417, 1343, 2134, 2613, 2817, 1983, 685, -159, -684, -735, -112, 565, 897, 1070, 975, 407, -320, -1004, -1851, -2411, -2677, -2654, -1890, -827, 551, 1888, 3050, 3855, 3958, 3314, 1464, -386, -1936, -3282, -3776, -3739, -3029, -1751, 17, 1819, 3091, 3637, 3172, 2074, 576, -1180, -2528, -3259, -3320, -3139, -2790, -1852, -473, 1449, 3008, 3635, 3335, 2538, 1408, 313, -616, -1520, -1921, -1900, -1851, -1473, -1035, -919, -787, -515, -366, -287, -35, 111, 340, 717, 1332, 2340, 2977, 2845, 2225, 843, -737, -1981, -2570, -2311, -1934, -1683, -1320, -678, 211, 851, 828, 418, 107, -285, -419, -198, 299, 1146, 2280, 2918, 2981, 2577, 1060, -589, -2123, -3255, -3787, -4037, -3546, -2503, -864, 703, 1741, 2845, 3155, 2558, 1791, 632, -494, -1350, -1623, -1234, -709, -21, 842, 1216, 719, -272, -885, -1225, -1315, -1155, -1081, -971, -657, 489, 1684, 2491, 2509, 1072, -514, -2165, -3363, -3555, -2842, -1651, -355, 1495, 3201, 5012, 6505, 6049, 4399, 1016, -3342, -6548, -8578, -8974, -8626, -6710, -3794, -41, 5173, 8457, 9671, 9055, 6803, 4104, 1034, -1156, -3046, -4408, -3831, -2435, -463, 1203, 1277, 263, -1028, -2152, -3300, -3931, -3594, -2847, -771, 2166, 5000, 6689, 6184, 4890, 3663, 2236, 554, -690, -2408, -3842, -3726, -3031, -2086, -689, -71, -426, -1098, -1866, -1455, -73, 1161, 2355, 3930, 4841, 5000, 4303, 2085, -767, -2965, -4660, -5679, -5286, -4119, -1737, 1784, 4559, 5757, 5133, 3034, 128, -1859, -3262, -4643, -5263, -4870, -2885, -475, 1823, 3935, 5324, 5457, 3871, 2293, 643, -674, -989, -2066, -2363, -2364, -1528, 299, 970, 759, -852, -3444, -5060, -5135, -4669, -3259, -1598, 1605, 5601, 9527, 12825, 12566, 9299, 4048, -1797, -7357, -10709, -12020, -11747, -10112, -5862, -555, 4614, 8328, 9051, 8228, 5958, 3920, 1224, -1746, -3889, -4176, -2432, 257, 3301, 3795, 1960, 708, -535, -1863, -2485, -3558, -4566, -4043, -2323, -752, 572, 947, 1052, 1904, 2142, 2364, 3117, 3160, 2692, 2001, 657, -839, -1896, -4305, -6631, -6586, -5456, -3295, -384, 1466, 3991, 7311, 8229, 6789, 3861, -574, -4345, -6687, -9877, -10427, -8418, -3747, 3308, 8696, 12809, 13210, 10355, 5266, 231, -3368, -7512, -10458, -12119, -11756, -9633, -5471, 635, 6249, 9302, 9037, 7009, 4002, 887, -531, -832, -1375, -1174, 667, 2133, 2803, 2609, 953, -1124, -3872, -6152, -8293, -9157, -7998, -5431, -665, 4813, 9598, 10944, 9612, 6425, 2962, 1413, -141, -3196, -6331, -7033, -6732, -4389, 117, 2411, 2965, 1669, -441, -1171, -2047, -3049, -2910, -1687, 234, 2399, 1954, -29, -510, 502, 2404, 3427, 2598, 1415, 2085, 1866, 1501, 710, -1985, -3806, -5325, -6618, -5396, -3142, -241, 4357, 8283, 10334, 8352, 3844, -1372, -5200, -5973, -5790, -5386, -3006, -576, 4047, 9001, 12307, 14704, 11332, 4566, -4056, -11269, -15548, -16607, -15463, -11984, -4448, 4306, 11311, 15902, 16718, 15441, 12439, 6631, -359, -7843, -12006, -13221, -11762, -8430, -4843, -408, 3182, 5099, 5785, 3980, 359, -1397, -1705, -1461, -419, 168, 631, 1115, 2305, 3055, 2677, 1312, -47, -1231, -1372, 345, 822, 49, -2819, -4728, -5116, -4903, -2597, 967, 3471, 6182, 8648, 6993, 3452, -391, -3020, -4005, -5358, -6073, -5493, -3606, 258, 5645, 9361, 10696, 8254, 1206, -4677, -8283, -10596, -9418, -6484, -3252, 609, 3417, 6560, 8056, 7694, 6810, 4345, 866, -2531, -5051, -7010, -7499, -3745, 1784, 5171, 7482, 4231, -81, -1978, -4392, -4730, -4829, -4631, -2502, 12, 1839, 3608, 6156, 7557, 8189, 6710, 3441, 65, -4497, -7884, -8363, -7014, -5575, -5170, -6273, -5122, -1140, 3594, 9013, 11988, 10042, 7534, 3456, -338, -2052, -5685, -8734, -10935, -9977, -5941, -468, 4663, 10248, 14175, 12905, 8326, -83, -7806, -12319, -14083, -11716, -6939, -2454, 1898, 6040, 8868, 11875, 13250, 8957, 1784, -4476, -9545, -9892, -9365, -6795, -1369, 3424, 8077, 8712, 7930, 3979, -1584, -5454, -7987, -7365, -6400, -6550, -6148, -3227, 4761, 13601, 14461, 10912, 6397, 1012, -3470, -6844, -7771, -7500, -5982, -5473, -5403, -3702, -1198, 2387, 5339, 7831, 8659, 5754, 561, -3651, -3451, 383, 2722, 803, -2267, -3713, -3398, -1546, 570, 2129, 941, -688, -1952, -1539, 83, -1931, -1640, 353, 1272, 3396, 2955, 1851, 3655, 3959, 3447, 432, -5515, -7268, -9132, -9007, -3638, 2205, 7653, 10020, 10025, 7697, 5061, 1093, -4314, -7329, -9244, -10437, -11256, -8292, -904, 8190, 16224, 19173, 15829, 6667, -3510, -10305, -13474, -11763, -7854, -5833, -5488, -4080, 149, 7090, 11867, 12970, 10061, 3856, -2352, -7724, -9320, -8043, -4438, -486, 2369, 5925, 7400, 7324, 5796, 2913, 294, -4826, -9043, -11169, -10699, -6996, -2339, 2897, 6130, 8412, 8878, 7122, 4697, 1833, 1199, 302, -1697, -3636, -6638, -8599, -7089, -3488, 2009, 7761, 8961, 8056, 5533, 2040, -318, -2646, -4945, -5532, -7213, -7494, -5204, -381, 8028, 14146, 15432, 10858, 2453, -5165, -8822, -10870, -9942, -7862, -5568, -2168, 2940, 7953, 11005, 12919, 6760, -125, -7433, -12347, -12570, -11612, -4927, 2234, 10778, 15965, 15464, 12637, 4728, -1675, -5435, -9753, -12135, -14323, -15602, -13511, -4886, 6432, 15758, 20793, 18052, 11414, 2483, -5521, -9060, -10118, -9887, -8659, -6643, -2639, 1404, 5839, 9074, 10817, 9177, 2233, -4251, -10078, -10964, -7050, -3125, 2709, 5130, 5067, 5130, 5737, 8473, 8389, 4406, -2462, -8102, -11210, -11331, -9816, -6898, -2306, 1645, 5623, 8501, 7763, 6731, 6178, 4841, 2337, -2993, -8376, -14089, -15071, -9050, -1392, 6862, 13245, 16142, 14390, 9588, 2637, -4894, -7750, -10601, -13018, -12508, -9809, -5657, 825, 9658, 15661, 18441, 12806, 2079, -5973, -8753, -8627, -6406, -5054, -4730, -2392, 311, 6159, 9125, 9599, 5773, -1082, -7324, -11251, -10782, -9555, -4718, 1974, 8660, 12619, 11160, 6862, 4555, 3908, 1625, -2952, -7893, -11239, -11354, -8439, -5624, -1463, 1808, 3500, 5828, 7597, 7644, 4293, 1097, -695, -3074, -5391, -8252, -8892, -6529, -14, 7800, 11898, 13147, 10921, 4981, -462, -5584, -9476, -13051, -14098, -12344, -6857, 1178, 8687, 18265, 20294, 18266, 10455, -1884, -10062, -16739, -16854, -12958, -7507, 804, 7103, 11383, 13705, 13125, 9433, 1619, -6641, -13328, -17645, -17255, -13333, -6265, 3301, 11987, 17512, 18444, 15442, 8262, 1152, -4050, -8820, -12399, -13810, -12986, -8269, -2460, 3818, 7398, 6702, 6667, 4482, 2043, 283, -861, -2072, -1173, -501, -343, 716, 513, 2579, 2929, 2932, 3344, -483, -4263, -5436, -4116, -2782, -2918, -3811, -3469, -741, 2443, 7266, 10072, 9108, 7823, 4408, -81, -2850, -7275, -9608, -10403, -8232, -2414, 2071, 7268, 11175, 13239, 10962, 2997, -5497, -13045, -15081, -13212, -10714, -2122, 4294, 9702, 16524, 16475, 14737, 9050, -647, -8789, -14736, -16353, -15432, -11842, -6104, 3559, 13105, 16512, 15412, 9143, 1284, -5103, -9459, -11293, -10751, -8605, -4524, 2548, 12027, 18815, 18853, 12736, 3322, -4071, -10726, -14263, -14925, -14633, -11066, -6904, -783, 6062, 11531, 13887, 14796, 13283, 8574, 3327, -4183, -10489, -11091, -6362, -2469, 761, 1781, 838, 1952, 3477, 4189, 2799, -637, -4497, -5171, -3942, -3123, -2515, 133, 3840, 6782, 8891, 6952, 3944, 3314, 23, -3340, -6320, -10836, -12006, -11031, -7325, 19, 8260, 12778, 12129, 7480, 2228, -1175, -6236, -10305, -10382, -10507, -6782, -1015, 5020, 14854, 17953, 15806, 11085, 1433, -7951, -15613, -20691, -20529, -14517, -5672, 2300, 9135, 14031, 16437, 14560, 8732, 1569, -5767, -11628, -14330, -13270, -6792, 2655, 9851, 12689, 13288, 11082, 2660, -3689, -9959, -14035, -14093, -13836, -11981, -8021, -73, 8815, 17191, 20828, 17192, 9097, 888, -4566, -6885, -8829, -9223, -8761, -8091, -5615, -3794, -982, 4346, 7818, 8132, 5888, 1983, -1678, -2316, -1722, -899, -548, -434, -1120, -1297, 1751, 3934, 5224, 4750, 3240, 686, -2148, -5657, -8187, -7255, -4785, -2922, -1077, 1671, 4706, 8740, 9732, 8003, 4695, -2313, -7947, -10590, -9824, -3513, 2542, 7338, 11812, 12072, 9220, 4249, -3574, -8695, -10905, -13455, -13950, -11672, -6100, 2375, 11247, 19398, 22218, 16137, 6873, -2042, -7994, -10183, -11453, -10985, -9337, -4708, 757, 7046, 12415, 11377, 7478, 896, -7018, -10593, -11717, -11738, -6831, 1144, 9464, 13951, 14064, 12698, 9943, 4953, -1139, -7253, -12437, -15451, -15429, -10811, -3410, 4601, 8802, 9443, 9776, 8599, 5154, 1489, -2315, -1527, -511, -1065, -2679, -5587, -4087, -2755, 580, 3915, 4132, 1722, 331, 1024, 1737, 2307, -978, -5926, -9233, -8573, -4756, 1407, 6618, 10832, 11541, 8244, 6442, 3303, -1177, -4750, -8505, -11078, -9062, -6422, -1110, 6113, 8906, 10995, 7137, -2142, -8365, -12552, -13498, -8161, -2038, 5326, 12056, 14923, 18165, 17693, 10428, 1053, -9392, -17544, -19948, -19914, -16573, -7722, 2249, 10572, 17005, 14676, 8327, 3695, -2137, -5357, -6417, -7133, -6104, -3869, 1343, 6745, 10218, 10090, 3901, -2276, -6646, -10727, -11516, -10371, -6211, -1046, 2597, 6428, 6297, 6042, 6377, 6074, 5727, 3872, 218, -2894, -2406, -818, -1654, -2916, -4438, -6536, -4694, -1788, 1477, 5112, 8264, 8639, 5416, 1569, -3726, -7462, -8197, -6383, -3805, 156, 4204, 9042, 13060, 12210, 9315, 671, -6975, -13648, -19340, -17900, -13217, -4422, 5356, 13049, 14505, 14345, 10072, 1766, -2852, -8524, -12567, -13491, -10318, -2742, 9060, 17760, 20570, 15791, 5316, -4891, -14976, -19060, -20894, -17384, -12147, -5535, 6171, 13765, 20088, 19714, 14628, 9846, 1155, -6077, -12480, -13956, -10994, -5637, 1384, 5345, 4823, 3349, 649, -2041, -2377, -4022, -5331, -6014, -3055, 721, 5608, 8149, 7871, 6787, 4095, 2516, -387, -1422, -2543, -2307, -800, -2348, -4260, -7117, -7953, -4582, 251, 6405, 7800, 6435, 4653, 3753, 4399, 2535, -429, -5089, -9238, -11174, -9465, -1259, 7388, 14454, 17010, 12615, 5339, -4381, -10991, -14867, -16287, -12008, -7189, -1946, 5843, 11940, 17746, 18946, 13845, 5025, -6401, -14106, -18388, -14633, -6521, 1111, 8334, 10750, 11031, 9342, 4682, -830, -7088, -11342, -13740, -14356, -10608, -3763, 4911, 13288, 18104, 17316, 12103, 3850, -3644, -8056, -9934, -9030, -6578, -4565, -2129, -547, -85, 1968, 4748, 5140, 3373, -15, -3406, -3601, -1652, 2552, 3115, 2010, 1379, -927, -112, 2546, 3008, 2367, 1777, -293, -2651, -5695, -8623, -7900, -4328, -1418, 2651, 6173, 6137, 7456, 8809, 8744, 6814, 82, -7118, -13681, -15525, -9704, -1976, 5160, 11421, 14131, 12368, 8121, 987, -6118, -10701, -13412, -14235, -11170, -7300, -1802, 7560, 16291, 22501, 19104, 9155, -2410, -11697, -13283, -12520, -11350, -8267, -2851, 5404, 11640, 13670, 11356, 5287, -2172, -7810, -10366, -11057, -10356, -6967, 1201, 9911, 15789, 14390, 9730, 2046, -1756, -3640, -6126, -6415, -7389, -6091, -4470, -2104, 1182, 3436, 2494, 3306, 3379, 1499, 31, 1538, 1895, 2669, 1521, -3015, -5759, -5444, -2631, 749, 3749, 6272, 6806, 3878, 357, -4791, -6337, -7419, -8170, -7256, -4599, -612, 7948, 15241, 16200, 13532, 4761, -5946, -12940, -15763, -14432, -10618, -3028, 7196, 12949, 16799, 14934, 9106, 1581, -4941, -9745, -16325, -18879, -16789, -9817, 2837, 14108, 21772, 22036, 14576, 7058, -139, -6704, -12169, -14306, -15535, -12905, -5560, 1791, 8551, 11151, 11396, 6421, 839, -4323, -9611, -10161, -7516, -1702, 3310, 6915, 6030, 4152, 4057, 3947, 3194, 559, -3405, -7261, -7828, -6325, -3753, -2544, -3138, -3639, -3008, -495, 2420, 6238, 9614, 11477, 11278, 5591, -1722, -8330, -12536, -12507, -8249, -2583, 2557, 7142, 9493, 10893, 10606, 5891, -1080, -9353, -17495, -17223, -11812, -2824, 8654, 17032, 20667, 17441, 9647, 740, -7134, -12194, -15591, -13785, -8469, -3317, 4700, 11038, 17263, 17956, 11638, 1628, -12452, -20061, -21258, -17061, -7481, 1832, 11097, 16311, 18021, 18361, 12892, 5418, -4884, -14057, -17318, -19571, -16666, -9791, 826, 11436, 13876, 12104, 7047, 1666, -1288, -3748, -6386, -4954, -1038, 1200, 1182, 1794, 4371, 6259, 7479, 5721, 1462, -5291, -8844, -6132, -2648, -2280, -4933, -8844, -9823, -6269, -548, 7769, 13704, 17290, 17138, 12311, 4078, -4235, -11231, -17386, -17888, -15283, -10023, -4074, 7218, 17217, 20654, 19905, 9124, -3110, -12760, -19353, -17707, -13315, -8272, 2182, 10100, 18536, 23809, 20502, 11050, -1953, -10214, -15815, -18390, -19266, -14328, -4430, 6324, 17560, 21165, 14432, 5702, -2896, -9105, -10098, -8949, -7515, -5386, 1210, 10579, 16858, 16074, 10902, 2569, -4826, -10676, -13088, -14125, -11217, -4046, 178, 3704, 2312, 2658, 3789, 3879, 5790, 6138, 3941, 823, 1035, 3588, 3161, -332, -2912, -6673, -6161, -3583, -1349, 1924, 3519, 4562, 1109, -2683, -6860, -8757, -9290, -8368, -1021, 5157, 12108, 17423, 19953, 16866, 7495, -2393, -11806, -19158, -23385, -20735, -13611, -3023, 9910, 19169, 22662, 18979, 9888, 363, -8706, -14855, -18770, -17483, -13042, -4655, 9016, 19211, 25780, 25003, 14417, 1544, -10149, -18647, -21807, -21502, -17098, -7465, 3368, 12404, 16647, 15299, 11057, 4932, -471, -6240, -9593, -9017, -4582, 1777, 7726, 11563, 8630, 2345, -2338, -5975, -7088, -6654, -6631, -4640, -3211, -985, 196, 1007, 2033, 1598, 3099, 5949, 5953, 6346, 7222, 5282, 4290, -164, -5345, -10990, -15030, -14890, -11329, -3592, 5260, 9645, 10868, 9584, 3687, -1181, -6498, -9910, -10921, -7021, -1237, 7201, 15047, 16324, 15291, 6648, -3714, -11501, -19674, -23159, -20173, -11592, 1880, 13036, 20240, 21652, 16684, 10444, 2619, -7170, -15190, -18820, -17275, -10406, 2721, 13593, 20404, 22945, 15583, 7501, -4293, -13714, -17548, -18479, -16420, -11819, -3806, 3890, 11980, 15616, 16003, 12765, 6363, -264, -4798, -6307, -3687, 4, 1492, 1411, -2052, -5047, -5215, -4121, -2041, -812, -305, 787, 2137, 4135, 3421, 567, -2244, -3694, -1785, -221, 3417, 8143, 10557, 11981, 9156, 2544, -6086, -13883, -20102, -20804, -15635, -6879, 1373, 10399, 17065, 20191, 18034, 9782, 2239, -6575, -12894, -15965, -14314, -7449, 3191, 11569, 17505, 16422, 9462, 884, -9992, -15995, -16045, -14320, -11162, -4906, 2050, 10894, 17340, 18978, 14940, 6668, -3686, -11915, -14529, -11822, -6530, 135, 6370, 10030, 10522, 7665, 2327, -3291, -7235, -10080, -11520, -11566, -7580, -1817, 3305, 6350, 8057, 8005, 6753, 4409, 3600, 5616, 5236, 3178, -884, -7895, -13595, -15642, -14226, -7632, -937, 6330, 10120, 10403, 9424, 7841, 5136, -240, -4451, -10104, -11460, -7885, -183, 9211, 17270, 19287, 16485, 6192, -6226, -15582, -22710, -21993, -18659, -11715, -3877, 6235, 15337, 22220, 24560, 21206, 10955, -440, -11098, -17510, -17140, -14900, -6134, 1474, 7458, 10615, 9917, 7509, 3766, -1993, -4259, -8192, -10819, -7802, -6626, 1105, 8578, 11291, 10705, 5787, 568, -2491, -1570, -583, 1270, 891, -1128, -3862, -6991, -4315, -2872, -1708, -25, -173, 751, 301, 1020, 5017, 4924, 2363, -1539, -4676, -5724, -3122, 3820, 9467, 11488, 7727, 3274, -3132, -9460, -12920, -14366, -13257, -10522, -6811, -2743, 4191, 12204, 17579, 17339, 10879, 2067, -6093, -13447, -14968, -10693, -4256, 3417, 9440, 12771, 10606, 4749, -1451, -8840, -13082, -14693, -14975, -12467, -5208, 7436, 17736, 25154, 24144, 15353, 6004, -2904, -7663, -12354, -14325, -13415, -10553, -4654, 3270, 10559, 12792, 11547, 9299, 4607, -1897, -7280, -11623, -9931, -4423, 2952, 6878, 6433, 5928, 3707, 4321, 5138, 3480, 1229, -2444, -4649, -3013, -4922, -7019, -7492, -7552, -4865, -1594, 2579, 5786, 9407, 10552, 8685, 6067, -38, -6476, -11154, -9164, -4389, -1166, 3763, 6904, 9030, 9242, 6115, -1039, -6411, -12319, -17261, -16385, -12985, -3390, 7895, 16101, 21236, 19581, 12659, 4518, -4319, -7839, -11452, -13600, -12395, -6701, 2662, 7504, 12158, 10976, 4695, -1012, -8236, -12987, -12063, -8110, -2280, 4556, 9955, 14297, 14190, 11391, 6975, -535, -7628, -12475, -14596, -13161, -7825, -2287, 3605, 6709, 7821, 7827, 3439, -164, -2299, -3575, -2587, 95, 2372, 2583, 252, -620, -1472, -701, 2439, 5251, 5921, 5163, 4936, 1427, -2981, -7424, -13008, -16206, -14928, -9464, -896, 10078, 18061, 19652, 17087, 9525, 1511, -3494, -8841, -11807, -11537, -10210, -5751, 451, 8791, 13378, 11611, 6678, -2838, -10899, -15435, -15450, -11406, -5007, 2606, 9030, 14847, 17556, 16311, 11354, 2002, -6386, -13712, -16848, -14327, -10129, -2331, 3000, 6369, 7050, 4623, 2109, -1556, -3975, -5317, -3479, 314, 4064, 5883, 7243, 6897, 4082, 1908, -608, -3961, -6978, -6934, -4896, -1353, 477, 506, -2318, -3417, -3716, -3774, 113, 2707, 8292, 10589, 9194, 5419, -622, -5239, -9169, -9094, -6548, -4712, -760, 6674, 12469, 14142, 8983, -582, -8498, -13682, -16165, -15556, -11091, -4406, 5713, 15514, 20354, 20964, 15151, 7566, 516, -6669, -13519, -18361, -17894, -12653, -2789, 6079, 12449, 12359, 7578, 1411, -6745, -9226, -9049, -6501, -3054, 2726, 8552, 13396, 16319, 14018, 7955, -748, -6591, -12787, -14046, -11027, -7720, -2685, 1501, 2119, 1649, 980, -89, 1828, 3631, 5123, 5764, 6065, 6639, 5189, 1967, -2400, -7348, -8844, -6855, -3903, -865, 2318, 4506, 4609, 2971, -1207, -4636, -9182, -9228, -5550, 554, 8490, 12613, 14581, 14236, 10881, 2164, -5278, -12231, -16719, -15723, -10696, -2616, 7502, 13869, 15101, 12408, 4868, -1871, -8251, -12985, -14817, -11861, -7882, 1292, 10852, 18734, 24548, 19757, 11637, 1477, -9246, -15965, -19502, -19108, -12762, -4729, 4297, 10234, 9992, 8301, 2951, -634, -2432, -4373, -4711, -2974, 1592, 7935, 12841, 10791, 5984, 154, -3991, -6890, -9392, -10247, -8849, -5284, -518, 2004, 754, -1308, -2587, 299, 5128, 8921, 8762, 7232, 6408, 6949, 5647, -93, -6632, -12302, -14116, -12995, -6194, 2054, 5955, 9819, 8531, 5890, 1944, -3571, -7134, -9018, -6146, -387, 4451, 9373, 14068, 14380, 12385, 4213, -3565, -12923, -21064, -20780, -16412, -5719, 4765, 13354, 15756, 14439, 10583, 2249, -5299, -11819, -15978, -15413, -10717, -2614, 8602, 17634, 22568, 18891, 9982, -570, -11257, -17102, -19742, -16621, -10709, -4419, 512, 5339, 9050, 9436, 8963, 5783, 1155, -1789, -3715, -4118, 965, 5195, 6742, 5514, 1465, -2190, -6592, -8866, -8177, -6321, -3518, -278, 1464, 2835, 1805, -1461, -518, 1924, 3597, 6195, 4536, 3523, 6042, 7169, 8177, 2631, -6387, -14908, -19456, -16142, -9557, 771, 8286, 11591, 12738, 11545, 6243, -831, -5717, -10156, -11827, -8970, -4851, 1710, 11338, 16712, 18063, 13048, 1512, -8460, -17523, -21767, -18525, -11788, -3741, 4349, 11869, 16355, 17030, 11574, 4524, -2888, -11214, -13588, -13619, -9323, 1078, 9253, 16520, 18224, 12499, 5123, -5648, -13446, -15674, -14508, -11331, -8759, -4166, 2440, 10349, 15439, 14737, 12322, 6233, 840, -2469, -3634, -2443, -1585, 781, -612, -3368, -5905, -8846, -7979, -5494, -2120, 454, 2199, 2144, 4315, 4791, 3101, 1829, -2799, -5419, -4214, -1172, 4349, 11687, 12616, 11868, 4466, -6001, -11898, -15256, -15231, -11207, -4936, 1, 9124, 15334, 18166, 17229, 9922, 1335, -5656, -13441, -15756, -13395, -7438, 2357, 9515, 15889, 16371, 11359, 4761, -3634, -9986, -12825, -13849, -14731, -11798, -2818, 6839, 16774, 19837, 16112, 9247, -552, -5824, -9875, -8740, -4158, -1452, 3779, 6221, 6048, 3879, 1179, -269, -3781, -4793, -6751, -8238, -5670, -1911, 3267, 5702, 5077, 2702, 1131, 1391, 3395, 4798, 5925, 6639, 4266, 2335, -2774, -9514, -13480, -15466, -12984, -5908, 979, 6938, 11255, 14199, 15789, 11173, 5096, -3684, -12626, -14420, -11731, -4175, 3196, 10107, 13848, 11311, 5760, -3276, -9570, -12860, -14769, -12881, -10417, -3276, 4758, 11291, 17862, 17304, 13477, 5534, -6557, -14646, -17538, -14659, -7607, -270, 7069, 11114, 12245, 10705, 3640, -3636, -8906, -12730, -15121, -14252, -9892, -3553, 6940, 13348, 15056, 14049, 8456, 3067, -1147, -2300, -3666, -3249, -2150, -1883, -4417, -7226, -5943, -3993, 1618, 5682, 3613, 706, -153, -430, 2838, 3540, 878, -1849, -4170, -3452, -1087, 5426, 10474, 13272, 12761, 6375, -2717, -12183, -19367, -21760, -19777, -12163, -4330, 3164, 13552, 19514, 22871, 18839, 11252, 1624, -9082, -15658, -19547, -17291, -11005, -1289, 6507, 11792, 13334, 9997, 4223, -2030, -6542, -8524, -10975, -13606, -11048, -5571, 4153, 13741, 16338, 14421, 7971, 529, -4298, -5384, -5260, -4495, -2204, -1642, -540, 178, -1496, -1945, -329, -918, -444, -2885, -3745, -2579, 1097, 5949, 5669, 4505, 1206, 80, 707, 4553, 7816, 9438, 7351, 2666, -1919, -7218, -12203, -14023, -13048, -7844, -2943, 2142, 9737, 11961, 15150, 15006, 10405, 3780, -4363, -11670, -15380, -10907, -2184, 6258, 12214, 12010, 9130, 2423, -6054, -10355, -13279, -13969, -13256, -9836, -1479, 7627, 15723, 21808, 20890, 13599, 5475, -6230, -15513, -18050, -18138, -12382, -4777, 1887, 9050, 12052, 11834, 11127, 6399, 1636, -6134, -12156, -14352, -13409, -6414, 577, 8250, 11252, 10128, 8587, 5104, 5350, 4942, 2027, -221, -3498, -5550, -7702, -9962, -9469, -4961, -1440, 1715, 2348, 2933, 5220, 7961, 10086, 8923, 4713, -2205, -6687, -9484, -5468, -1217, 3286, 6883, 7075, 5789, 336, -3907, -8110, -10029, -11664, -12751, -9177, -3913, 3701, 14068, 21291, 24141, 18502, 5539, -5826, -12583, -15558, -15387, -13155, -9863, -3153, 3672, 9738, 13930, 10536, 5299, 798, -6109, -9374, -11772, -10262, -5308, 2410, 12041, 15464, 15337, 10234, 3635, -3097, -7243, -10591, -12045, -10035, -8557, -2335, 4756, 8595, 8492, 7510, 3971, 346, -2809, -7208, -7577, -5505, -1632, 1311, 2485, 3626, 6576, 8063, 8859, 8353, 3005, -2389, -8910, -11446, -9163, -8576, -7955, -8124, -7461, -3791, 2037, 9993, 14396, 16418, 16129, 11319, 3799, -5901, -11668, -14601, -14821, -10166, -5290, 741, 6525, 9330, 10982, 8782, 1627, -3745, -10624, -14505, -12071, -7992, 202, 8074, 14925, 18784, 18324, 12849, 4109, -5775, -13583, -17411, -18860, -14896, -9748, -1682, 7919, 14510, 18104, 14074, 7081, -1604, -9404, -11172, -9914, -7739, -4190, 313, 3601, 7992, 9266, 8140, 6387, 1592, -3518, -7325, -10273, -10178, -6157, -1580, 1511, 3073, 1508, -747, 231, 2475, 3709, 2595, 1872, 2222, 3950, 5597, 3197, 589, -1789, -4175, -3784, -3218, -2378, -2084, -1573, -1571, -1982, -1509, -4495, -6821, -5903, -2355, 4856, 11410, 15560, 16169, 11917, 8508, 3498, -5114, -12970, -18691, -21430, -16715, -11280, -1589, 12074, 18330, 21987, 16115, 5113, -3904, -11626, -15135, -13110, -8906, -4933, 2171, 8799, 15694, 18523, 13490, 5599, -3438, -13035, -18450, -18671, -14159, -5062, 2666, 8819, 12717, 11226, 8883, 5675, 958, -2728, -7396, -9666, -9349, -5183, 3799, 8543, 9181, 7793, 3848, 916, -2031, -6417, -6809, -4425, -1605, 360, -301, -4042, -4430, -2486, 667, 6577, 7542, 7051, 5863, 5471, 7757, 9026, 3673, -4781, -10846, -12742, -12385, -9281, -2857, 4086, 9849, 9984, 6754, 515, -3701, -5584, -5468, -1305, 1817, 3275, 5608, 10077, 14053, 14142, 7697, -4180, -12810, -19428, -21746, -15777, -8257, 1821, 11459, 15606, 16226, 13065, 6720, 443, -5444, -8084, -11229, -13756, -11708, -3797, 10234, 18412, 21722, 16862, 6341, -2127, -10481, -13812, -12700, -11911, -10937, -8206, -2738, 4974, 10412, 13591, 13517, 10462, 4524, -2389, -9413, -10791, -6156, -265, 3066, 4332, 3139, -1446, -2761, -1436, 1566, 903, -2252, -6049, -7943, -6714, -2810, -799, 927, 3436, 5048, 7881, 7770, 6320, 8183, 8141, 3066, -958, -9221, -17476, -20504, -19148, -11275, -753, 6201, 9803, 11382, 11461, 11072, 7654, 3742, -2848, -10750, -13665, -13217, -6984, 2647, 11298, 16198, 14359, 8857, 89, -9133, -14123, -12445, -9559, -7737, -5281, -1447, 5820, 13115, 17237, 14163, 7787, -1324, -9004, -13363, -14409, -9211, -2827, 6074, 9744, 11589, 12209, 7247, 2441, -2722, -7836, -11640, -15242, -15654, -10555, -3123, 7502, 14540, 17121, 15372, 8587, 3560, -991, -2368, -2836, -4683, -6272, -7798, -7846, -7382, -3714, 1023, 5180, 5650, 1590, -1847, -3724, -2447, 740, 2148, 2125, 636, -1006, 539, 3775, 9439, 11820, 9641, 3965, -3672, -9981, -16004, -18107, -15796, -11172, -5395, 1187, 7081, 14995, 19011, 19730, 17216, 7202, -3373, -12180, -18746, -19522, -14622, -6191, 4623, 11911, 16872, 15330, 10895, 5381, -1813, -6522, -11810, -15395, -16761, -14939, -5464, 6270, 15679, 20437, 17368, 12399, 4556, -2720, -4339, -6095, -7597, -6458, -5863, -2841, 1843, 3711, 5109, 5049, 1395, -3337, -8934, -11728, -9244, -4574, 1118, 5992, 8488, 9204, 9704, 11141, 11176, 7154, 102, -7887, -11552, -13148, -11830, -11955, -9330, -2683, -17, 3898, 5777, 6805, 8011, 9497, 9183, 7212, 2198, -6335, -11277, -11679, -5602, 188, 5353, 8714, 7345, 6674, 2864, -3768, -7444, -9375, -11381, -9855, -8281, -3479, 3909, 12570, 20302, 21060, 14836, 3116, -6003, -12473, -15519, -15167, -11750, -6561, 2289, 9450, 15020, 19118, 15196, 6877, -3037, -11369, -16679, -18193, -17474, -12125, -1469, 10299, 18736, 22427, 19553, 15837, 9742, 2269, -4039, -11268, -15548, -18960, -15306, -8629, -2055, 4598, 6188, 5790, 4645, 2750, 606, -283, 249, 2582, 3879, 4585, 4763, 3824, 4407, 2103, 384, -1702, -6266, -9969, -9461, -6891, -4305, -957, -2321, -2379, -2316, -1297, 3551, 8502, 11177, 11144, 8935, 3800, 510, -4637, -8011, -9832, -11635, -9624, -6318, -1305, 4849, 9575, 11043, 9746, 3329, -5021, -11545, -15548, -14407, -8733, -1169, 6893, 14500, 18457, 18454, 13930, 3947, -5942, -14072, -19125, -18734, -15444, -8384, 1914, 11356, 17235, 18060, 12259, 2378, -6986, -13340, -14099, -12155, -9789, -3130, 5849, 16352, 23560, 23404, 17584, 5698, -6685, -14951, -19629, -21057, -19366, -14248, -6396, 1479, 9990, 12914, 13150, 12031, 11168, 9150, 3784, -949, -5313, -4332, -5827, -4435, -3111, -5274, -5321, -3916, -1530, 2212, 4562, 2549, 614, -2161, -1805, -3466, -5323, -3863, -2311, 1574, 5633, 8863, 11662, 13173, 10072, 4254, -1902, -11539, -19284, -21865, -18471, -8943, -259, 8701, 14891, 16283, 15365, 8253, 397, -5166, -9547, -13058, -13401, -11514, -4466, 8828, 17119, 22119, 18973, 8631, -2046, -11455, -16491, -16587, -14266, -8582, -3236, 642, 5706, 10451, 13679, 10926, 6691, -430, -5833, -7285, -6468, -1970, 4425, 9194, 9991, 6538, 2280, 998, -3040, -5937, -9037, -12671, -13508, -12133, -5048, 3819, 11555, 16789, 16971, 14003, 8874, 2502, -882, -3035, -4723, -4419, -7294, -8906, -8496, -8724, -3167, 3692, 9185, 11481, 8000, 4161, 864, -887, -256, -2117, -6070, -8037, -9236, -7143, 520, 8162, 13902, 18040, 14356, 6058, -1477, -11054, -15227, -16499, -16318, -12177, -8479, -857, 8007, 15591, 19499, 18213, 11556, 1112, -7940, -14703, -15337, -9621, -2012, 5625, 10007, 10580, 9719, 5168, -271, -4638, -10201, -13375, -15455, -16335, -12932, -5043, 6783, 17269, 23583, 19122, 11117, 3722, -3638, -4081, -4673, -6984, -7758, -6477, -4830, -1750, 18, 1788, 2588, 594, -1848, -3618, -4084, -2566, 3012, 8343, 9200, 5542, 2043, -1098, -72, 417, -352, -366, -2371, -2676, -2386, -2970, -3540, -3239, -2916, -3083, -2420, -357, 2130, 5252, 8869, 10986, 6895, -1713, -9323, -13811, -13372, -6056, 1979, 9698, 16482, 17503, 14228, 6840, -1866, -9847, -16368, -21475, -25294, -21995, -13158, 574, 16170, 26205, 30853, 23098, 11750, 1181, -6711, -9599, -13483, -13646, -13328, -8892, -1365, 4848, 11161, 11538, 6136, -1926, -10454, -15533, -14934, -10354, -1956, 7124, 14966, 18470, 16957, 12173, 7502, 3910, -3856, -9856, -15270, -15378, -10369, -7213, -2476, 782, 2873, 1968, 926, 2451, 3425, 5950, 9204, 10014, 9972, 4644, -3328, -10884, -13967, -10746, -5954, -608, 3713, 8909, 10401, 9995, 6079, 1382, -3839, -12641, -18251, -18093, -13183, -2972, 8416, 17377, 20893, 15298, 7624, -874, -5817, -7704, -9115, -8637, -5558, 383, 4799, 9385, 11953, 8063, 1882, -7800, -17729, -19439, -17951, -11113, 1075, 11771, 21438, 24241, 22514, 17174, 10011, 2101, -7860, -16025, -21983, -20656, -15404, -7367, 3775, 9437, 10748, 10422, 6080, 1704, -2248, -4223, -2228, 1631, 5133, 6971, 5477, 2379, 1673, 768, -16, -1456, -6664, -7780, -5535, -3357, 543, 46, -2465, -5293, -6196, -5401, -506, 6888, 12793, 17054, 15308, 10106, 1740, -6861, -11201, -15051, -14902, -10955, -6758, 1333, 9325, 15285, 16079, 10622, 1607, -7576, -14953, -19057, -18847, -13344, -5921, 4561, 15593, 21525, 25327, 21517, 14689, 5211, -5979, -15347, -22045, -25231, -23043, -12950, -779, 9744, 12995, 10687, 7911, 3718, 937, -1598, -2235, -1477, 917, 3413, 6854, 11128, 9817, 5926, -909, -6480, -11643, -14288, -15273, -11021, -2937, 2610, 5599, 4413, 2307, 1891, 5357, 7672, 8398, 6117, 4273, 1611, 1372, 953, -4802, -9208, -11847, -12633, -9195, -3366, 2555, 10366, 12947, 12198, 6483, -2875, -8301, -12370, -11878, -7321, -1069, 5221, 11778, 15360, 17168, 16536, 8897, -1327, -11300, -20660, -23931, -18370, -9578, -252, 9737, 16143, 18064, 13755, 3087, -4852, -11582, -14641, -14815, -12643, -7253, 3095, 16954, 25529, 28997, 21134, 6927, -6776, -18771, -24250, -26520, -25145, -18091, -7681, 2948, 10811, 18313, 19253, 18254, 14107, 6838, 1227, -5998, -9726, -7591, -3394, 910, 2791, -1741, -5577, -7233, -4964, -1284, 2733, 2889, 583, 489, -606, 108, -480, -1047, 108, 1961, 5778, 7434, 7757, 9258, 7319, 5526, 905, -7985, -16619, -20164, -17869, -9352, 2423, 9337, 13920, 13667, 9991, 7232, 2063, -3940, -9150, -12206, -12753, -9529, -2239, 7500, 18764, 22958, 19905, 10723, -3269, -13728, -20314, -23499, -19642, -11919, -3666, 4526, 10295, 15663, 17814, 12437, 5244, -2451, -10468, -11662, -8642, -2049, 5766, 11176, 13251, 9720, 5111, -3311, -11508, -14547, -15092, -12596, -10384, -6866, -1218, 6605, 14505, 18425, 17711, 11379, 4204, -1469, -4388, -4456, -5880, -5602, -6376, -8226, -6584, -5071, -1056, 2886, 3830, 5664, 5668, 3502, 1845, 2029, 3663, 2273, -2189, -5964, -8998, -5505, 1778, 9233, 14174, 13582, 10583, 2964, -3426, -8636, -13354, -15786, -15663, -12023, -5812, 1650, 11818, 20126, 22334, 18459, 8664, -2057, -12003, -17297, -16435, -8497, 508, 8085, 12728, 13915, 11200, 5494, -1060, -7421, -13172, -17474, -18284, -16415, -8700, 1119, 10724, 19159, 20813, 16398, 10116, 2647, -2197, -5278, -8974, -11959, -11078, -8312, -5451, -2590, -1545, 870, 191, 429, -777, -2433, -1545, -1836, 2565, 6317, 6091, 2958, 114, -614, -1089, 55, 605, -477, -2670, -2829, -1728, -1380, -1974, -4140, -3984, -3872, -3914, -1486, 947, 3980, 8732, 11487, 9225, 4719, -3020, -8700, -9590, -6816, -604, 3487, 7363, 10836, 10523, 8726, 3040, -6165, -12336, -17269, -18405, -16566, -9436, 1102, 10005, 21079, 24392, 22514, 13970, 1730, -6589, -11972, -13997, -13345, -11664, -8081, -214, 7321, 13872, 15213, 7964, -2644, -10866, -16040, -16404, -13712, -7095, 2750, 12923, 19232, 21179, 18086, 12173, 5811, -2178, -10183, -17130, -18028, -18141, -13501, -4752, 4891, 11817, 12137, 9730, 5551, 2847, -234, -2172, -2610, -1300, 1377, 2018, 1267, -513, -276, 174, 263, 1071, 762, -1207, -1281, 1, 971, 441, -4245, -8561, -10309, -7913, -2387, 3061, 7895, 10698, 12703, 9002, 4218, 489, -4496, -5651, -7721, -6784, -2901, -868, 1999, 6374, 8593, 6826, 598, -9066, -14976, -15331, -12515, -5044, 4041, 11408, 17441, 19894, 19222, 17077, 9747, -2314, -12556, -19122, -21415, -18920, -12741, -4651, 6550, 12279, 13795, 12097, 5749, -1353, -5762, -7355, -4956, -2033, -1331, 841, 4766, 12522, 16645, 13587, 3529, -7260, -14833, -17609, -17040, -12182, -5870, -1572, 3213, 6644, 10542, 12534, 11113, 9027, 5489, 208, -5840, -11218, -13123, -8088, -2365, 1195, 5210, 5905, 6230, 6377, 5355, 2321, -193, -5179, -9182, -10399, -9198, -6061, -3830, -85, 4118, 7772, 10041, 10472, 9040, 9147, 6712, 4231, 952, -7958, -14825, -16838, -15635, -8199, -608, 2907, 6168, 5931, 5093, 5037, 1660, -667, -2381, -4265, -2833, -407, 2522, 6914, 11166, 11130, 8459, 1378, -8365, -14054, -16924, -15738, -10501, -5034, -172, 4985, 10253, 14758, 16465, 12767, 5585, -3051, -9761, -12361, -12756, -7627, -208, 6904, 8870, 9331, 8890, 2003, -1870, -4349, -7855, -9225, -8954, -9875, -7628, -1409, 6985, 14734, 16152, 12610, 6319, -2431, -6850, -6839, -5911, -5636, -4833, -2108, 961, 4397, 4350, 5365, 4420, 1203, -2397, -7904, -12647, -13395, -8518, -2537, 4197, 7613, 7330, 7388, 7548, 10479, 11433, 6597, 557, -5488, -9668, -11504, -13415, -12525, -10556, -6222, -123, 3577, 7135, 8912, 12710, 13268, 10806, 5861, -3138, -8602, -12499, -11084, -2303, 2983, 7020, 8714, 6637, 5016, 775, -4176, -7554, -10376, -13288, -12023, -6366, 1171, 10793, 18346, 19829, 16689, 7872, -2893, -9700, -12346, -11875, -9540, -7283, -2933, 2581, 8795, 14032, 12838, 9080, -414, -9960, -14766, -16009, -12993, -7237, 1768, 8831, 14985, 16013, 10834, 6633, 2104, -1807, -5366, -8172, -11370, -12310, -7046, -585, 7232, 11655, 9234, 3110, -4585, -8817, -9848, -10023, -6552, -659, 3284, 6720, 9041, 11726, 13060, 12407, 7888, 1764, -4891, -12427, -15337, -14040, -9028, -5450, -2946, -2085, -1044, 2583, 7955, 11275, 11483, 10859, 7059, 3347, -1840, -5882, -7178, -9209, -7801, -5718, -3165, 914, 5118, 9419, 9877, 8436, 2095, -6095, -10570, -13343, -10472, -4814, 887, 8025, 12608, 14651, 14445, 10579, 3505, -2751, -8179, -13192, -14620, -12906, -7052, 2758, 10787, 15096, 12676, 4993, -1588, -7154, -9066, -8483, -7328, -4863, -2944, 892, 8472, 14738, 17685, 14446, 7535, -2169, -10127, -14475, -16574, -13407, -10366, -4084, 1700, 5173, 7768, 7456, 5573, 3471, 1286, -870, -3879, -4615, -2442, 2785, 6635, 6650, 5845, 2152, -1266, -4558, -7745, -9708, -8487, -7131, -5937, -5484, -3727, 1190, 6260, 9948, 12589, 13919, 9617, 4013, 192, -1516, -2937, -4340, -10088, -14647, -13012, -9060, -186, 8899, 13232, 13734, 11459, 6834, 975, -6417, -10079, -10812, -10098, -7926, -4556, 553, 9370, 17741, 18921, 16401, 6107, -5700, -12125, -17804, -17144, -11946, -7593, -863, 4679, 9909, 13173, 12359, 7768, 1385, -4755, -8728, -9988, -9088, -3768, 2171, 9249, 13408, 14250, 8877, 638, -4804, -10005, -11337, -11118, -10121, -9632, -7233, -2334, 4099, 10506, 10917, 9483, 6647, 3374, 2250, 758, -440, -1838, -1275, -2858, -6528, -7731, -8790, -6437, -3335, 138, 1836, 1303, 1494, 2666, 5734, 5002, 1722, -1043, -3203, -3493, -64, 4013, 5227, 6168, 5127, -172, -4903, -9408, -12666, -12900, -9749, -2103, 4141, 8912, 12589, 11202, 9265, 7039, 217, -5061, -12201, -16752, -15447, -9121, 3455, 12371, 19277, 21033, 17010, 9692, -924, -9729, -14851, -17886, -16300, -13567, -8968, 389, 8639, 16792, 19533, 17628, 11807, 3214, -4785, -9714, -8135, -6546, -4991, -3888, -3209, 1162, 4138, 5131, 5391, 1916, -2043, -5995, -7739, -7781, -6104, -876, 4364, 9297, 10730, 8531, 5459, 2837, 3514, 2270, -2575, -7534, -10991, -11610, -10084, -6400, -371, 2557, 3112, 4398, 6161, 7349, 4308, 2865, 1710, 1316, 560, -3393, -6183, -5181, -866, 3746, 6188, 4972, 3158, 719, -2577, -3087, -2031, -2790, -3898, -5265, -3631, -144, 5283, 10561, 11140, 9274, 5204, -1242, -7079, -9108, -7351, -5052, -2167, 2654, 5610, 8148, 8744, 6580, 4709, 358, -6658, -12308, -16360, -16395, -10307, -2027, 5719, 12704, 17130, 17066, 13189, 6760, 2135, -3755, -9717, -13818, -15634, -12860, -9850, -2558, 4701, 7737, 10130, 7541, 2077, -1353, -3944, -4769, -2032, -812, -822, 1230, 2832, 8225, 11829, 9974, 7110, -151, -6946, -10839, -15392, -14498, -10200, -6500, -1373, 2246, 6262, 9684, 12017, 12262, 10033, 5453, -2030, -7775, -9242, -8047, -5127, -1345, -82, 173, 1000, -122, -1328, 520, 1239, 2249, 1861, -943, -1766, -4312, -3992, -2218, 283, 3510, 3478, 2614, 2109, 4795, 5653, 6311, 3795, -1795, -5063, -8710, -9410, -6979, -3667, 301, 3051, 2290, 2303, 2059, 129, 772, 1371, -998, -2152, -2323, -1258, 5222, 12121, 12645, 8614, 825, -6295, -10047, -12608, -12725, -12041, -10030, -6657, -1482, 5226, 11550, 13994, 12775, 10356, 5927, -14, -5556, -8191, -7785, -4735, -723, 3692, 5512, 5554, 3789, -878, -3922, -5698, -7824, -8309, -9657, -7368, -1597, 3990, 11244, 14269, 13391, 9778, 5353, 357, -3451, -7973, -10129, -9008, -8219, -5414, -2676, 1154, 5861, 9370, 9187, 5348, 1145, -3158, -5603, -3314, -746, -691, -2229, -1839, -1360, 2204, 6411, 8204, 8395, 5521, 1600, -2643, -6178, -8656, -8813, -6816, -4879, -4511, -3082, -1274, 1348, 5588, 9613, 10401, 8071, 3960, 332, -2546, -3232, -3618, -3975, -3130, -1928, 516, 2145, 2495, 1244, -1251, -4300, -6142, -6816, -5784, -3180, -1184, 1784, 8631, 14021, 16202, 12862, 4494, -769, -4741, -7907, -9899, -12438, -13116, -10555, -5617, 694, 8243, 11882, 10601, 7903, 2504, -2092, -5216, -7224, -5816, -3174, 102, 3198, 6307, 8909, 8189, 6685, 2413, -2809, -6447, -10214, -10593, -8298, -3813, 1324, 4219, 5422, 6060, 5740, 4357, 3115, 422, -3030, -4518, -3324, -1740, 425, 2226, 2527, 2784, 2002, 1613, 836, -999, -3214, -3083, -1816, -313, 1098, -853, -2208, -3017, -2476, 196, 3331, 5219, 6215, 6252, 5421, 6311, 4279, 119, -3246, -6353, -7540, -8929, -9317, -6682, -2882, 3431, 7211, 8105, 6854, 3460, 301, -1986, -2862, -3801, -3566, -3161, -1442, 2014, 5716, 7538, 6466, 2082, -2652, -5878, -8420, -9134, -8410, -4780, -188, 4638, 8760, 10305, 8328, 3768, 475, -1321, -2804, -4435, -6195, -6380, -5062, -1021, 4009, 7451, 8793, 7311, 3584, -1022, -3997, -6679, -6642, -5297, -3542, -464, 2789, 5068, 5473, 5617, 4383, 2590, -356, -3090, -6320, -7187, -4728, -1325, 909, 1560, 1180, 1311, 2574, 2801, 2431, -511, -3175, -4460, -4419, -3335, -1700, -760, -1354, -1202, 422, 2534, 4447, 4822, 4212, 4489, 3770, 1976, -646, -4324, -6825, -8325, -9323, -8245, -5431, -976, 3041, 7304, 9333, 9513, 7934, 3529, -37, -3594, -5305, -5598, -5914, -5215, -3017, -299, 2352, 4103, 3935, 3130, 1076, -1342, -2594, -4129, -4474, -3264, -1463, 1633, 4744, 6325, 6768, 5397, 3192, 508, -2692, -5043, -7498, -7313, -5153, -2670, 918, 4617, 7056, 7453, 6509, 3717, -80, -3592, -5639, -6274, -5234, -3191, -1094, 1908, 4393, 6158, 6910, 5953, 3090, -790, -4139, -6306, -5873, -4948, -2556, 750, 2923, 4903, 5125, 4117, 2003, -538, -2079, -3537, -3998, -2928, -1520, 1241, 3383, 4267, 4146, 2760, 1791, 1068, 227, -1104, -3005, -5763, -6483, -5015, -2803, 431, 2051, 2668, 2340, 1889, 2725, 3314, 4020, 4440, 3048, 1242, 440, -797, -2085, -3976, -5979, -5994, -5555, -3635, -603, 2243, 5170, 6535, 6613, 6187, 3458, -536, -2864, -4465, -4871, -4429, -3675, -2137, -494, 1198, 2862, 3564, 2711, 1308, -368, -2157, -2879, -3303, -2582, -1267, 24, 1986, 2311, 2687, 2644, 1401, -519, -2312, -2824, -2299, -1776, -652, 535, 910, 1605, 1414, 1331, 1029, 573, -621, -1483, -2093, -2435, -1581, -1327, -812, -425, 541, 1845, 2186, 2677, 2022, 1306, 549, -689, -1181, -1579, -1175, -455, 541, 587, 676, 1148, 1577, 1432, 1053, 690, 79, -532, -1503, -1988, -1789, -278, 1222, 2888, 3361, 3259, 2973, 1545, 289, -1256, -2619, -3402, -3647, -3365, -2638, -1762, -747, 1081, 2265, 3284, 3795, 3645, 3466, 2033, 801, -443, -1625, -2676, -4108, -4368, -3805, -3141, -1994, -666, 1152, 2952, 3916, 3026, 2461, 1918, 420, -1343, -3176, -3617, -3545, -2646, -1000, 757, 2082, 2239, 1667, 1172, 505, -98, -734, -711, -174, -267, -256, -193, -361, -435, -355, -348, -490, -809, -1508, -1168, -628, -536, 442, 953, 1683, 2417, 1907, 987, 433, 202, -44, -465, -1198, -1953, -1608, -1566, -2018, -1247, -581, -567, 96, 1193, 2008, 2243, 1975, 2047, 1668, 904, 90, -970, -1421, -1437, -1642, -1405, -822, 114, 575, 601, 639, 352, -44, -1083, -1562, -1218, -547, 368, 1743, 2421, 2744, 2846, 2752, 1747, 114, -1024, -1902, -2397, -2653, -2929, -2998, -2284, -639, 840, 1678, 2252, 1843, 1888, 1502, 677, -384, -1400, -1822, -1677, -1361, -1269, -735, -177, 776, 1214, 1261, 1486, 1398, 1141, 890, 263, 20, -283, -1002, -1395, -1337, -1447, -1396, -957, -583, 60, 641, 857, 1085, 1806, 2039, 2280, 2271, 1680, 964, 293, -212, -712, -952, -1594, -2265, -1969, -1411, -935, -352, 24, 233, 612, 1120, 1518, 1956, 1599, 1075, 439, -223, -397, -647, -645, -751, -791, -904, -1100, -1187, -1119, -1076, -944, -506, -487, -659, -205, 714, 1418, 1832, 1770, 1815, 1590, 1110, 928, 485, -494, -1268, -2040, -2408, -2424, -1991, -1095, -669, -188, 716, 1200, 1459, 1960, 1422, 556, -50, -573, -653, -336, 196, 910, 1094, 893, 548, 410, 518, 516, 341, 263, 8, -112, -280, -299, 219, 376, 195, -130, -316, -356, -334, -380, 43, 279, 219, 345, 528, 415, -79, -390, -266, 81, 313, 251, -120, -72, 79, -641, -1530, -1678, -1380, -800, -317, 258, 741, 1009, 1269, 1723, 2063, 1280, 182, -393, -512, -329, -497, -574, -362, -368, -441, -751, -673, -550, -690, -586, -424, -90, 19, -4, 203, 669, 898, 843, 418, -54, -42, -270, -390, -364, -182, -259, -841, -1502, -1587, -1162, -461, 232, -188, -896, -941, 166, 1420, 2093, 2053, 1146, 254, -162, -184, -84, -266, -695, -796, -723, -641, -368, -190, -364, -482, -241, 166, 752, 1326, 1165, 656, 261, 345, 345, 121, -185, -380, -209, 106, 409, 697, 712, 163, -361, -893, -943, -795, -627, -296, -134, -66, 182, 626, 991, 1178, 813, 153, -191, -289, -233, -10, 229, 312, 167, 159, 186, 128, -135, -626, -893, -757, -430, -44, 244, 594, 1179, 1359, 1088, 835, 443, 233, -28, -187, -355, -422, -287, -136, -224, -635, -1033, -1017, -297, 104, 346, 342, 127, 292, 533, 623, 585, 367, 162, 53, -14, -98, -146, -280, -424, -241, -151, -211, -314, -331, -472, -555, -202, -9, 56, 147, 72, -131, -79, 127, 284, 118, -48, -332, -575, -513, -199, 277, 283, -52, -254, -392, -340, -131, 249, 411, 438, 331, 266, 381, 472, 451, 322, 253, 87, -18, 3, 31, 4, 20, 91, 52, -28, -180, -324, -360, -123, 113, 152, -89, -382, -451, -152, -7, -15, 16, -156, -351, -393, -355, -203, -114, 86, 261, 191, 67, -127, -235, -106, 114, 181, 31, 21, 128, 185, 130, 100, 201, 37, -288, -548, -442, -190, -108, 5, 179, 405, 328, 134, 122, 251, 332, 180, -61, -11, 145, 95, -206, -321, -254, -313, -297, -360, -331, -203, -166, -138, -200, -284, -311, -84, 182, 307, 329, 337, 227, 62, -286, -422, -408, -381, -258, -148, -112, -127, -51, 55, 84, 83, 140, 147, 122, 134, 213, 308, 389, 363, 279, 153, 24, -112, -177, -147, -44, 60, 15, -83, -208, -233, -164, -79, 17, 28, 22, 16, 28, 48, 62, 204, 261, 216, 104, 27, 17, 92, 212, 186, 101, 110, 100, 199, 214, 150, 111, 21, 52, 224, 303, 273, 192, 203, 187, 154, 126, 144, 66, -58, -142, -89, 12, 74, 105, 104, 190, 265, 252, 191, 53, -17, 53, 95, 134, 96, 13, -122, -178, -186, -139, -187, -210, -128, -102, -99, -62, -42, -42, -31, -84, -19, 41, 61, 58, 24, -59, -108, -137, -145, -103, -69, -46, 7, 31, 8, -67, -68, 15, 94, 78, 41, 80, 153, 194, 199, 229, 233, 198, 175, 149, 172, 238, 289, 228, 198, 134, 33, 3, 20, 102, 183, 168, 206, 144, 83, 14, 20, 74, 90, 51, 44, 102, 173, 147, 73, 27, -22, -119, -147, -157, -93, -110, -152, -143, -109, -29, 40, 65, 39, -11, -67, -5, -8, -2, 6, -94, -183, -191, -181, -161, -208, -202, -251, -208, -180, -128, -68, -138, -92, -34, -2, -10, -4, -31, -108, -82, 19, 64, 90, 55, -6, -6, 59, 52, -60, -156, -159, -89, -60, -149, -307, -184, -1, -57, 45, 2, -46, -14, -197, -354, -254, -104, -87, 98, 52, -326, -477, -401, -265, -172, -215, -162, -31, 30, 195, 194, 40, 57, 59, 104, 158, 56, -4, -7, -16, 42, 80, 211, 164, 8, 201, 340, 408, 420, 405, 288, 211, 45, -245, -292, -240, -140, -56, 3, 78, -8, 22, 73, 165, 219, 133, 90, 62, -120, -345, -354, -254, -111, -123, -203, -242, -265, -100, 138, 155, 111, -101, -281, -135, -24, 77, 155, 138, 177, 195, 292, 286, 215, 47, -176, -65, 109, 203, 164, 13, -132, -233, -166, -83, -142, -61, -74, -11, 171, 173, 111, -22, -30, 73, 225, 243, 211, 223, 74, -11, -21, -71, -151, -116, -63, -34, -49, -155, -132, 0, 167, 195, 78, 67, 46, 150, 242, 175, 6, -65, -39, -43, -74, -145, -73, 18, 7, 49, 1, -62, -50, -129, -102, -35, -5, 101, 243, 207, 82, 95, 116, 147, 89, 59, 65, 43, 63, 69, 126, 199, 153, 139, 135, 266, 311, 338, 342, 244, 152, 119, 154, 165, 173, 174, 138, 85, 129, 120, 54, 74, 31, 33, 130, 117, 101, 110, 53, 50, -1, -58, -121, -113, -135, -112, -67, 5, -38, -196, -229, -222, -52, 55, 43, -19, -165, -227, -198, -117, -8, 8, -56, -138, -140, -178, -187, -142, -158, -122, -136, -219, -246, -152, -28, 106, 181, 134, 37, -25, -72, -125, -110, -96, -117, -117, -208, -93, 1, 27, -9, -19, 40, 38, 61, 32, 14, -5, 24, 62, 33, -18, -7, 33, 28, -4, -38, -98, -65, -80, -42, -1, 19, 70, 17, -101, -202, -110, 14, 61, 42, -44, -15, 61, 194, 266, 202, 125, 188, 196, 138, 45, -66, -72, -52, -39, -9, 44, -54, -140, -138, 11, 181, 259, 223, 108, -38, -78, -76, 7, -21, -69, -119, -124, -65, -63, -107, -133, -103, -112, -179, -232, -255, -229, -193, -124, -134, -114, -90, -46, 36, 106, 149, 81, -25, -102, -144, -132, -69, -32, -11, -37, -27, 33, 128, 132, 105, 118, 106, 131, 182, 147, 80, 19, -89, -83, -47, 26, 114, 145, 158, 224, 235, 207, 168, 146, 116, 91, 1, -5, -35, -91, -25, 76, 186, 229, 213, 127, 117, 120, 117, 133, 45, 37, 21, -8, 4, -3, -6, 82, 111, 103, 120, 151, 140, 130, 111, 52, -15, 25, 46, 73, 26, 4, -38, -23, -14, 11, -39, -77, -110, -106, -54, -56, -6, -10, -43, -51, -37, -43, 4, 116, 77, -2, -3, 32, 77, 27, -120, -151, -153, -112, -29, 53, 183, 191, 175, 139, -28, -84, -147, -153, -180, -250, -319, -249, -179, -89, 116, 174, 218, 282, 315, 298, 293, 223, -12, -281, -390, -423, -336, -235, -8, 241, 400, 463, 425, 333, 260, 165, 1, -99, -112, -88, -17, 34, 38, -11, -41, -115, -178, -151, -63, -92, -75, -59, 7, 64, 28, -106, -284, -423, -487, -361, -259, -45, 106, 145, 228, 187, 156, 113, 41, 23, 66, 229, 321, 260, 162, 52, -92, -155, -183, -190, -245, -249, -201, -121, 12, 89, 9, -216, -400, -490, -479, -367, -172, 44, 49, -72, -124, -134, -186, -156, -29, 91, 108, 79, 61, 32, -34, -59, 50, 210, 343, 464, 429, 319, 195, 177, 123, 34, -73, -133, -103, 64, 261, 417, 358, 193, 26, -45, -21, 63, 70, 104, 163, 236, 272, 310, 271, 133, 64, 2, 14, 40, -71, -158, -276, -303, -197, -118, -75, -57, -32, -25, 1, 64, 97, 10, -116, -188, -239, -159, -155, -164, -181, -34, 37, 23, 16, 15, -41, -123, -165, -131, 24, 89, 79, 51, 38, 24, -20, -41, -42, 20, 17, -111, -104, 15, 80, 172, 234, 208, 115, 71, -8, 21, 93, 107, 146, 195, 249, 250, 165, 55, -6, -10, 36, 69, 57, 71, 60, 77, 116, 139, 145, 191, 207, 142, 124, 99, 9, -10, 3, 4, -13, -40, -36, -21, -23, 82, 124, 97, 43, 17, 11, 30, -20, -98, -162, -174, -164, -111, -77, -120, -128, -78, 2, 68, 60, 60, 91, 122, 69, 28, -34, -77, -111, -54, -41, -64, -140, -145, -59, 69, 92, 106, 75, 8, -4, -33, -19, 17, 48, 40, -20, -34, -88, -64, -75, -44, -26, 11, 12, 53, 50, 71, 64, -21, -58, -71, -41, -9, -24, -57, -72, -19, 41, 65, 43, 21, -3, -30, -51, -52, -53, -38, -20, -21, -28, 4, -11, -9, -56, -78, -67, -59, -70, -91, -99, -93, -85, -27, -3, -3, -64, -72, -66, -58, -56, -27, 47, 47, 7, 23, 35, -10, -112, -134, -147, -110, -108, -42, -52, -59, 6, 51, 26, -20, -49, -22, -19, -14, 13, 12, 19, 46, 71, 87, 68, 94, 121, 141, 89, 5, -23, -47, -63, -28, 12, 87, 130, 174, 142, 155, 132, 81, 57, 52, 28, 16, -16, -17, -60, -65, -95, -80, -13, -14, 2, 3, -7, -29, -31, -31, -64, -141, -200, -172, -103, -33, 12, 0, -9, 35, 67, 50, 26, 28, 39, 63, 52, 67, 40, 9, 1, 65, 140, 202, 229, 214, 133, 113, 104, 72, 59, 54, 65, 58, 54, 90, 98, 138, 139, 158, 133, 112, 114, 147, 112, 62, 28, 70, 50, 38, -51, -70, -97, -54, -14, 76, 79, 46, 31, 5, 2, 32, 44, 23, 5, -31, -22, -28, -25, 15, 9, 38, 72, 88, 25, 10, 38, 53, 60, 19, -43, -56, -39, 17, 55, 56, -11, -59, -74, -26, -14, 49, 58, 62, 56, 38, 5, -3, 7, 19, -18, -47, -61, -59, -26, 47, 84, 83, 25, -14, 23, 7, 15, -27, -70, -105, -82, -73, -83, -98, -84, -101, -104, -117, -129, -87, -94, -20, 3, -9, -30, -63, -24, -10, 35, 65, 15, -20, -82, -61, -97, -75, -19, -31, -28, -33, -38, -1, -30, -20, -33, -18, 32, 43, 50, -17, 14, 1, 17, 9, 16, 79, 71, 89, 30, 103, 88, 69, 23, -20, -48, -62, -52, -10, -11, -45, -76, -82, -67, -58, -61, -79, -68, -45, -12, -5, 8, 31, 1, 11, -31, -11, 1, 12, 20, 42, 39, 15, 25, 32, 68, 84, 84, 41, 1, -33, -33, -15, -20, -30, -24, -32, -1, 47, 98, 49, 17, 0, 28, 28, 23, -17, -29, 17, 13, 44, 53, 97, 58, 40, 21, 27, 20, 7, -20, -16, -28, -26, -25, -45, -25, 0, 39, 39, -13, 14, -4, -6, 14, 46, 57, 73, 110, 51, -20, -59, -70, 3, -3, 38, 12, -2, -33, -11, -14, -26, -80, -90, -75, -32, -50, -3, -15, 1, 16, 53, 58, 78, 58, -2, 5, 24, 9, -26, -58, -15, 0, -18, -11, -16, -17, -53, -15, 46, 55, 72, 45, 37, 21, 80, 84, 82, 85, 96, 62, 25, 18, 10, 8, 48, 62, 77, 63, 99, 86, 61, 55, 100, 142, 111, 120, 87, 68, 48, 29, 16, -15, -36, -66, -98, -94, -58, -63, -28, -1, 14, 12, -5, -2, 38, 18, 42, 55, 13, 13, 2, 42, 79, 78, 77, 75, 79, 77, 72, 82, 86, -5, -59, -73, -24, 42, 59, -13, 8, -1, -14, -24, -60, -61, 38, 40, 42, 12, -21, 27, 0, 57, 54, 56, 60, 50, 44, 49, 75, 42, 40, 25, -12, -64, -56, -51, -85, -19, -4, -45, -22, -79, -113, -111, -57, -12, -73, -75, -82, -60, -64, 2, 101, 24, 54, 19, 36, 1, 63, -1, -79, -68, -69, -67, -113, -132, -105, -68, 32, 55, 92, 24, 0, 4, -19, 7, -30, -60, -85, -74, -42, 22, 105, 64, -17, -97, -63, -9, 59, 59, 17, -47, -20, -16, -25, -48, -5, 49, 115, 167, 155, 100, -5, -57, -86, -87, -73, -104, -124, -150, -106, -65, -29, -13, 38, 27, 47, 27, 28, -13, -14, -31, -65, -80, -79, -90, -77, -14, 86, 124, 129, 114, 118, 113, 155, 117, 22, -56, -130, -204, -264, -261, -239, -167, -100, -36, 77, 161, 238, 276, 350, 398, 344, 272, 148, -34, -170, -329, -384, -416, -392, -356, -267, -154, -37, 68, 176, 258, 346, 342, 300, 167, 77, -5, -38, -65, -101, -115, -113, -76, -45, -6, 24, 62, 67, 23, -44, -88, -112, -128, -101, -25, 59, 133, 229, 347, 454, 482, 467, 352, 242, 94, -77, -216, -301, -315, -313, -207, -132, -49, 62, 136, 222, 284, 264, 190, 56, -51, -94, -45, 6, 73, 71, 43, 44, 103, 184, 278, 289, 205, 73, -38, -178, -252, -296, -334, -341, -321, -236, -108, 29, 116, 201, 237, 263, 288, 305, 307, 292, 248, 154, 9, -126, -261, -322, -359, -353, -405, -416, -457, -396, -267, -118, 94, 305, 532, 651, 667, 607, 428, 256, 0, -158, -315, -383, -435, -395, -295, -165, 0, 115, 126, 93, 40, 12, -2, -5, 7, 1, 10, 94, 165, 269, 338, 382, 299, 136, -65, -239, -341, -371, -401, -347, -274, -106, 14, 136, 180, 164, 112, 101, 59, 50, 39, 5, -36, -70, -86, -79, -88, -72, -75, -79, -50, 45, 180, 197, 158, 50, -82, -178, -250, -242, -286, -321, -355, -248, -71, 189, 450, 641, 791, 804, 610, 325, -56, -433, -757, -936, -956, -874, -649, -402, -89, 253, 524, 691, 712, 584, 313, 33, -124, -176, -152, -145, -148, -169, -97, 1, 100, 119, 49, -103, -304, -455, -520, -425, -249, -53, 125, 279, 428, 576, 693, 670, 531, 346, 101, -157, -349, -503, -596, -546, -435, -258, -96, 46, 95, 113, 139, 181, 231, 182, 58, -15, -20, 85, 196, 275, 160, -65, -300, -368, -353, -184, 11, 120, 275, 350, 343, 271, 47, -205, -478, -593, -645, -566, -384, -235, 37, 325, 607, 879, 908, 770, 491, 185, -172, -369, -445, -425, -347, -254, -136, -49, 6, -29, -160, -219, -174, -16, 162, 292, 446, 548, 750, 955, 934, 623, 153, -455, -838, -996, -967, -846, -620, -281, 9, 385, 664, 820, 843, 661, 339, 15, -251, -365, -323, -249, -144, 77, 321, 547, 682, 529, 175, -226, -581, -751, -822, -775, -601, -317, 25, 459, 803, 1023, 1031, 770, 313, -166, -554, -680, -758, -715, -504, -243, 120, 514, 755, 820, 648, 419, 26, -335, -646, -868, -906, -820, -558, -204, 197, 445, 604, 685, 619, 494, 403, 331, 206, 10, -125, -218, -312, -407, -568, -615, -652, -608, -386, -129, 50, 234, 416, 545, 691, 722, 593, 443, 241, -50, -281, -452, -471, -375, -260, -210, -156, -132, -200, -270, -315, -295, -220, -12, 220, 357, 483, 596, 608, 571, 392, 38, -234, -411, -604, -621, -573, -334, 36, 349, 494, 480, 247, 5, -217, -346, -399, -340, -209, -166, -103, -1, 290, 503, 681, 611, 213, -161, -448, -561, -403, -328, -224, -110, 297, 1063, 1651, 1967, 890, -1108, -2988, -4760, -5483, -5295, -4244, -1956, 1007, 6015, 10645, 12955, 11279, 6893, 1417, -4474, -8404, -10894, -11430, -11277, -10847, -7939, -3023, 2462, 7478, 9581, 8972, 7397, 4934, 1659, -973, -3067, -3802, -2137, -178, 1129, 2582, 2708, 1209, -97, -1454, -2422, -3367, -4538, -5384, -5261, -3576, -680, 2797, 5542, 5913, 5113, 4231, 2136, 1570, 2008, 470, -840, -1616, -2380, -1633, 18, 247, -9, 400, 648, 956, 1351, 1016, 336, -234, -78, -153, 335, 723, -927, -2161, -2654, -1892, 778, 3452, 5412, 6741, 6939, 4881, 2772, 390, -2538, -3774, -5252, -6214, -5769, -4368, -2791, -1603, 1242, 3909, 5317, 4667, 1293, -803, -1024, -590, 602, 1375, 2231, 2981, 3611, 3482, 2238, 764, -3180, -7056, -9086, -10724, -9512, -6867, -3504, 251, 5387, 11079, 14504, 15810, 11534, 4470, -1389, -6070, -8968, -10805, -10878, -9801, -6844, -1185, 4684, 9815, 10809, 8279, 4642, -796, -4761, -7312, -8406, -8170, -5592, -741, 3445, 7587, 9244, 7759, 6516, 3922, 681, -2112, -5170, -7379, -7567, -5539, -2452, 1443, 3711, 4648, 4589, 2853, 1540, -141, -2305, -3551, -3376, -2162, -307, 534, -657, 5, 2788, 4877, 6310, 5462, 3537, 1763, 46, -939, -1302, -2643, -5139, -7945, -10185, -10673, -7747, -2294, 4007, 9896, 13313, 13906, 11599, 7317, 2008, -1219, -3996, -7811, -9055, -8912, -6383, -2645, 555, 4189, 6229, 5798, 2700, -1795, -5433, -7178, -6816, -4902, -1612, 1904, 5129, 7017, 7397, 7882, 7099, 3679, -1100, -7043, -10124, -10244, -8823, -4578, 229, 6237, 9831, 9196, 6710, 1700, -2594, -6249, -8797, -8619, -6961, -4896, -2273, 1378, 6128, 10368, 11250, 8956, 5679, 1408, -3051, -6250, -8398, -8166, -6092, -3014, -204, 1870, 2551, 1382, 341, -204, 122, 775, -1167, -2146, -1459, 34, 5411, 6891, 4684, 3684, 2665, 1186, -94, -307, -926, -2158, -3251, -4881, -6065, -7181, -8080, -7279, -3967, 920, 5606, 8991, 10074, 11025, 10387, 10307, 7265, -842, -7498, -13648, -16373, -16326, -12757, -5927, 713, 7748, 11921, 13354, 11481, 4983, -1154, -5639, -8657, -9568, -9399, -7610, -4805, 1041, 7753, 13426, 15978, 11407, 5401, -898, -6619, -8839, -9640, -8688, -6897, -3271, 1449, 5078, 7580, 5433, 3447, 1741, -2215, -5091, -7855, -8134, -5529, 307, 8105, 12473, 14364, 11026, 5428, 1192, -4025, -7326, -9775, -11526, -10896, -8172, -3518, 1429, 5431, 7736, 8246, 7571, 5571, 2657, -656, -3201, -2915, 291, 2514, 4087, 2517, -710, -1482, -2150, -2419, -2489, -2961, -4206, -3573, -2733, -2104, 451, 1735, 2322, 2752, 1070, 626, 1930, 4163, 6823, 7815, 6678, 3276, -1570, -5988, -8946, -10270, -9261, -7081, -4021, -859, 4478, 10539, 12383, 11622, 7730, 2215, -2466, -8230, -12463, -14555, -11321, -3442, 4586, 12606, 15969, 15789, 12168, 5903, 672, -3967, -8282, -12813, -15306, -15096, -11816, -5011, 2964, 11984, 16306, 14928, 10418, 3018, -2278, -4614, -4822, -4376, -3765, -2113, -6, 2792, 5324, 4380, 3890, 1556, -4248, -7707, -10994, -11117, -8627, -3161, 3694, 9711, 12751, 10865, 7587, 3349, 2058, 1103, -2297, -4960, -6917, -7685, -5105, -1464, 1277, 2867, 2670, 1905, 313, -1122, -2050, -2984, -1503, 147, 2539, 2990, -243, -1548, -2027, 295, 3378, 4217, 4215, 3025, 1273, -263, -1005, -597, -1543, -4099, -6659, -8675, -8001, -4514, 174, 6507, 10300, 10713, 7939, 1009, -4749, -8300, -8215, -6063, -4807, -2251, 2406, 7647, 11085, 13104, 13081, 6827, -1334, -9148, -15404, -18952, -20151, -15310, -7981, 3221, 12716, 17381, 19018, 14414, 9007, 4948, -113, -6123, -11565, -13994, -14323, -11917, -5337, 3641, 10622, 10430, 7245, 2673, -2553, -5692, -8001, -7404, -5406, -2588, 1202, 4753, 7399, 8756, 9938, 7330, 1681, -2903, -7622, -10822, -9987, -6285, -622, 4216, 4540, 4146, 3105, -52, -839, -1389, -2133, -2899, -3560, -2827, -1210, 1774, 3679, 5488, 5631, 4642, 4446, 2946, 337, -1756, -1395, -1441, -2556, -3758, -5730, -6014, -5554, -4368, -490, 4446, 7428, 7896, 6613, 4730, 4212, 4356, 1451, -3035, -5935, -6719, -5451, -3297, 257, 5432, 8745, 7571, 5129, -169, -6358, -10999, -13772, -11449, -6407, -451, 5270, 10325, 14752, 18605, 18841, 11735, 1974, -5749, -11774, -15835, -19012, -16344, -8898, -230, 8317, 12928, 13490, 9572, 4769, 934, -3179, -6177, -7532, -9733, -9358, -5665, 2227, 10816, 12772, 12026, 8786, 3888, -1601, -6216, -8208, -8740, -7307, -4126, -1735, 937, 2130, 916, 1142, 1179, 1022, 925, -1957, -4309, -1984, 3487, 7939, 8250, 5808, 1922, -1535, -4151, -4614, -4499, -3204, -353, -86, -584, -2211, -5057, -5424, -3665, 136, 3741, 4740, 4853, 4952, 7246, 9341, 8112, 3151, -2015, -6774, -10894, -12381, -10118, -4309, 1875, 8427, 10667, 9979, 6664, -349, -5162, -7869, -8370, -8448, -7478, -3785, 1661, 9272, 16685, 18851, 14727, 6639, -1978, -8650, -14087, -17440, -15609, -9631, -3487, 4081, 9660, 13936, 14802, 8864, 4330, -914, -6396, -10316, -14047, -13957, -10204, -308, 9989, 14887, 16655, 12697, 7647, 1665, -4898, -6962, -8739, -10154, -8960, -7502, -5034, -2077, -272, 3657, 7493, 7497, 6040, 2885, -1324, -1514, 1640, 2636, 2344, 1568, -796, -3085, -5730, -7918, -5191, -1714, -1457, -461, -267, 378, 552, -889, -75, 359, -592, -668, -125, 729, 4433, 9398, 9964, 6935, 809, -4640, -8865, -12398, -11138, -7060, -2179, 909, 4769, 8147, 7986, 5235, 1190, -1681, -3266, -5700, -7813, -7840, -6242, 1070, 10034, 15608, 16902, 12115, 4846, -2950, -10420, -12165, -12109, -10698, -8085, -5158, 594, 5178, 10182, 11221, 9984, 7912, 2216, -4313, -10276, -12165, -8174, -2042, 3795, 7635, 8430, 8144, 6487, 4242, -397, -4677, -9544, -12983, -13515, -12293, -7958, -2791, 4931, 11490, 13909, 12083, 8329, 2911, 152, -1532, -2511, -1777, -3943, -4666, -6199, -7798, -5586, 195, 4067, 5440, 4090, 1914, 1500, 1024, 320, -1411, -780, -2611, -3963, -2321, -1958, 2889, 9166, 12406, 12537, 6679, -425, -6603, -10814, -10272, -7603, -4613, -2689, -689, 2298, 5428, 8517, 8562, 6033, 2300, -2288, -6572, -8701, -8194, -4215, 4241, 11575, 14183, 13267, 7231, -1709, -7048, -9283, -9069, -8038, -6859, -7074, -6622, -3807, 798, 10591, 14405, 12684, 9633, 2405, -2509, -6080, -6479, -2273, 286, 1049, 566, -1058, -603, 205, 1409, 2656, 1822, -193, -4791, -9026, -7796, -2902, 2082, 5448, 4823, 4227, 3896, 3512, 4170, 4293, 3992, 1746, -1670, -5153, -7897, -8376, -6645, -2467, 2748, 5990, 5685, 1978, 352, -36, 1279, 819, -2988, -6186, -10261, -10460, -7148, -4, 10351, 18062, 18263, 13064, 5637, -3000, -8857, -12269, -13031, -10885, -8312, -5796, -2543, 2244, 7429, 12882, 14003, 8880, 2942, -4885, -10208, -11062, -7516, -762, 4457, 6660, 8191, 9153, 6435, 1387, -4439, -7034, -8639, -10315, -10130, -8989, -4470, 226, 6492, 13661, 14384, 12060, 5510, -1908, -4454, -4227, -2561, -3210, -3536, -4256, -5333, -3594, -1684, -5, 3067, 5092, 3783, 333, -3542, -5131, -3898, -615, 2292, 2476, 311, -2143, -2276, 1366, 4915, 6171, 5613, 4183, 912, -2394, -5478, -8350, -6930, -6068, -4129, -1633, -190, 3036, 5736, 6343, 6005, 4089, 210, -4377, -8762, -8236, -4048, 1739, 8443, 11738, 11016, 7788, 2789, -3701, -8939, -11928, -14892, -15049, -13565, -6944, 1913, 9266, 16932, 20091, 18977, 10147, 7, -7216, -11764, -11983, -9836, -5148, -1278, 1192, 3780, 5925, 6298, 4696, 1786, -2912, -7929, -9364, -8530, -5661, -1717, 3028, 9551, 13892, 12228, 8358, 4027, 548, -2511, -6515, -8247, -9825, -6890, -4345, -2737, 1612, 4919, 7119, 6949, 5288, 1603, -2587, -4041, -3588, -1403, 2209, 3333, 610, -1528, -746, 1499, 4211, 5462, 4681, 1491, -2190, -5412, -4975, -3703, -2641, -1735, -4045, -3312, -1841, -21, 4099, 8442, 10314, 8956, 4721, -1225, -4494, -4613, -5533, -7222, -5653, -1300, 2464, 4747, 5657, 6393, 3544, -2545, -6096, -9630, -11229, -10418, -6344, 3428, 12325, 18724, 19034, 12489, 4390, -4468, -7168, -9073, -12286, -11761, -11218, -9911, -5131, 4775, 13536, 17769, 15035, 6987, -295, -6263, -11623, -12206, -9447, -5893, -202, 2985, 7256, 10884, 11379, 10950, 7456, 1094, -5404, -9332, -12511, -10761, -5838, -1338, 3820, 7848, 9034, 8825, 7432, 3267, -26, -2817, -4024, -4283, -4251, -3408, -198, 3457, 5902, 7350, 5306, 2797, -2144, -6586, -5886, -3749, -1016, 717, -75, -1257, -3253, -4123, -973, 3465, 7002, 7896, 4700, 1575, -207, -411, -853, -4295, -7415, -8836, -9100, -7939, -4943, -1015, 5813, 12031, 11357, 7382, 1543, -5064, -7291, -6631, -5095, -1467, 626, 3017, 6134, 8337, 10212, 4933, -1789, -7139, -10487, -10759, -11901, -9995, -4799, 2985, 11036, 15957, 13771, 6191, -1058, -6416, -8320, -7663, -7531, -8618, -8965, -5110, 3657, 12230, 15013, 10930, 5203, -1035, -7630, -12182, -13040, -11522, -7673, -1817, 3731, 9001, 10200, 10470, 10342, 8522, 4320, -1543, -7132, -13077, -13650, -9028, -3033, 2220, 4160, 4217, 3489, 2697, 2007, 610, -1132, -3864, -3581, -2038, 124, 1765, 3021, 8332, 10285, 8527, 5606, 950, -3635, -6024, -5006, -4145, -4103, -6450, -8088, -6796, -5314, -665, 4318, 8291, 10884, 12084, 11091, 6918, 1562, -1688, -2479, -5276, -7579, -8388, -8071, -6426, -1353, 4498, 7412, 6956, 2376, -1537, -4713, -5862, -6316, -5119, -2016, 820, 6076, 9779, 12590, 12747, 7188, 1921, -3530, -7381, -9816, -13351, -12824, -8391, 535, 7245, 10618, 9487, 4125, 921, -1723, -2578, -2755, -3538, -5166, -4253, -735, 6407, 12779, 14328, 11068, 5496, -733, -8542, -13358, -15387, -13441, -7657, -1690, 3827, 7317, 7694, 7850, 7471, 6102, 3124, -2632, -8513, -9633, -5359, 1211, 6147, 6718, 5977, 4583, 2774, 706, -3110, -6309, -8770, -9983, -8184, -5493, -1266, 1921, 4768, 8350, 10005, 10950, 7826, 1420, -2047, -1840, -449, 63, -2310, -6985, -9530, -9257, -6012, 35, 5259, 7035, 7444, 5759, 3170, 1234, -1785, -3769, -4569, -3995, -3217, -2167, -122, 4165, 8184, 9743, 9111, 3258, -3684, -8436, -10370, -9335, -7028, -4612, -3915, 122, 5844, 9898, 12021, 8772, 2466, -2498, -5674, -7446, -8197, -6045, -1556, 3250, 10144, 13021, 11639, 5947, -1578, -6787, -9018, -10357, -10461, -11791, -10969, -4955, 3152, 12938, 15680, 14798, 11055, 6117, 419, -4057, -6245, -7777, -6179, -4123, -2093, -656, -249, 1317, 3274, 2992, 653, -4057, -8779, -9389, -5492, 1405, 7317, 7992, 6831, 4267, 3613, 5386, 6265, 1890, -3077, -6781, -10276, -9523, -8675, -5954, -2267, 1142, 4304, 6886, 6883, 5139, 3594, 1994, 1945, 1369, -4889, -9073, -11067, -11825, -5497, 2000, 8430, 10885, 11748, 8914, 4761, 101, -4220, -6719, -10065, -11091, -11486, -8891, -4629, 1011, 9283, 15327, 16098, 9867, 949, -6099, -9320, -5623, -2338, -2950, -3735, -2411, 2536, 7795, 11052, 10468, 4403, -2705, -9821, -13917, -13061, -12616, -7435, 374, 7506, 14710, 15281, 11940, 7387, 3939, 2236, -1700, -6275, -11306, -12032, -10891, -7475, -1165, 3598, 6474, 5590, 5548, 5447, 2162, -1361, -816, 352, 1568, 341, -4082, -5711, -3180, 2526, 7351, 8362, 4362, 1152, -2115, -3148, -673, -1090, -2449, -5293, -6565, -4174, -801, 3436, 7551, 9387, 7791, 4390, -1734, -7996, -8654, -7070, -3328, 1779, 4954, 8945, 10643, 9049, 8355, 4897, -822, -7981, -14461, -16907, -16759, -13120, -6509, 4771, 14587, 20083, 19485, 10655, 3140, -2155, -5618, -7283, -8966, -9240, -9862, -8438, -3797, 3601, 9810, 9872, 6654, 1401, -4129, -8212, -10276, -8791, -4298, -445, 2188, 4234, 5370, 8159, 11110, 9423, 4513, -1633, -7178, -10710, -10481, -5785, -2509, -428, 847, 1505, 2439, 3613, 5937, 6094, 3279, 2309, 394, -1165, -2320, -5898, -5648, -3209, 25, 2558, 4101, 5216, 6954, 8047, 6237, 4340, -1446, -8270, -10668, -11190, -9327, -5482, -731, 5357, 9965, 12349, 11838, 9665, 5294, 1686, -2312, -7490, -9964, -10493, -9093, -3643, 4648, 9673, 10845, 5514, -2166, -6638, -7982, -7175, -5920, -3956, -919, 4318, 10257, 15032, 15214, 8585, 2312, -4217, -10731, -13023, -15931, -15472, -10153, -2282, 5960, 11261, 12440, 11125, 8677, 4310, 360, -3264, -7617, -9852, -8607, -3725, 2273, 6394, 6969, 6412, 5910, 3956, 661, -3112, -6039, -6827, -5850, -3934, -1955, -1794, -580, 385, 3759, 7340, 7305, 3388, -977, -2175, -1546, -865, -3567, -6545, -6157, -4031, -1544, 3044, 5657, 7462, 6793, 3137, 141, -4276, -9889, -12113, -11799, -8331, -3295, 598, 6611, 13917, 18977, 17725, 12981, 2344, -7425, -13329, -17794, -18255, -14765, -9188, -4586, 2265, 8469, 13678, 15264, 10915, 5236, -96, -5027, -6700, -7171, -6672, -3924, 3, 5729, 8214, 7127, 4331, -780, -4228, -6473, -7541, -7500, -6814, -2958, 359, 6405, 10104, 9903, 9019, 4559, 112, -4416, -6173, -5444, -4774, -2978, -1653, -219, 472, -225, 1996, 5559, 6696, 4168, 307, -3662, -5635, -4028, -2144, -2013, -535, -1702, -2931, -106, 4000, 7323, 8891, 9222, 5674, 2770, -2963, -7907, -9502, -9357, -6191, -2657, 1039, 4187, 5919, 6342, 7217, 5396, 903, -3264, -7818, -11867, -9626, -3261, 4384, 12567, 17408, 17293, 11314, 1058, -7129, -11943, -15069, -16658, -14440, -10166, -4956, 4149, 12608, 20275, 23686, 19201, 9277, -3498, -13022, -15069, -12768, -10079, -7977, -3750, -104, 2663, 7324, 9445, 10212, 5957, 238, -4418, -8080, -9650, -9469, -3683, 1280, 6409, 8308, 4770, 626, -1134, 454, 255, -26, -310, -302, -1553, -1193, 931, 2520, 2320, 73, -1296, -3114, -4090, -4421, -1713, 2959, 6751, 5829, 661, -4792, -7564, -3638, 2690, 8019, 11278, 9539, 5090, 18, -3946, -4712, -5837, -8159, -11510, -12952, -11321, -5275, 6386, 15989, 20388, 17607, 8447, -948, -9529, -12542, -11890, -9794, -4348, 1862, 7154, 9745, 12085, 9621, 3659, -1690, -8880, -14648, -16732, -14336, -7691, 482, 10810, 17917, 19723, 16141, 6538, -355, -6145, -9811, -11314, -11638, -10191, -8048, -2091, 6333, 12435, 12747, 10599, 4963, -2655, -7793, -9960, -9577, -7215, -2823, 59, 2773, 3075, 3868, 6600, 7514, 8562, 6280, 489, -4933, -7831, -7032, -3062, -1331, -2101, -3267, -4395, -4159, -2763, -544, 2259, 5645, 7175, 7006, 4843, 707, -1612, -1412, -1454, -483, -127, -296, -90, 664, 2602, 2825, 519, -4889, -8717, -10354, -11363, -7653, -244, 6868, 16290, 18497, 15779, 9545, -997, -4150, -8620, -10707, -12134, -10672, -5983, -1467, 6749, 12221, 15674, 12311, 2879, -6403, -12871, -15367, -13221, -9675, -4966, 2262, 7970, 12282, 15504, 14461, 9092, 2396, -5180, -8856, -12003, -15070, -12407, -5185, 2340, 6413, 8470, 6599, 4227, 1291, -2215, -2808, -2300, -2793, -4560, -5224, -3359, 2666, 7538, 8693, 8115, 6871, 4652, -663, -6005, -6784, -4325, -2152, -3502, -7927, -10175, -9191, -5289, 2415, 9554, 12238, 12906, 10615, 6688, 5731, 1790, -4492, -8145, -11667, -11011, -7416, -4965, 272, 6660, 9663, 10353, 6128, -1112, -5277, -8289, -7995, -4889, -1026, 2322, 5650, 9540, 11890, 12396, 8355, -270, -7657, -12620, -13473, -10940, -8027, -916, 6046, 11218, 14346, 11800, 4676, -3337, -8864, -9375, -7655, -6081, -4689, -2344, 2739, 8748, 14491, 14613, 9229, 3594, -2883, -8166, -11182, -11595, -9024, -5912, -838, 2139, 2611, 2712, 3285, 4421, 4448, 3835, 2129, -505, -3562, -1922, 2245, 3991, 2347, -968, -2834, -2736, -641, 239, -1416, -2440, -2089, -2178, -2356, -4494, -6512, -4654, 732, 6451, 10652, 11049, 7915, 7458, 5992, 4522, -253, -8653, -13444, -18370, -16822, -11303, -3341, 6699, 12724, 15098, 13801, 9288, 1829, -2767, -6289, -9551, -10305, -7560, -5694, 709, 9913, 13205, 16823, 11854, 2883, -4784, -11352, -12705, -9765, -6204, -4586, -1977, 511, 4940, 7403, 6689, 6646, 4038, -1318, -4971, -7976, -7630, -2223, 4052, 8158, 8840, 7334, 2942, -1071, -4223, -5341, -5107, -5208, -5272, -5599, -5619, -3539, -1757, 1493, 5381, 6973, 8343, 6490, 3005, 1804, 3305, 2212, -26, -1832, -5468, -8026, -9196, -5968, -566, 3994, 4666, 2293, 1129, -443, -210, -1416, -1379, -2026, -3048, -1212, -306, 4178, 10407, 13188, 9952, 3623, -4102, -10811, -16674, -18353, -13022, -6121, 530, 5978, 11528, 15081, 14639, 11473, 4539, -2036, -8773, -14467, -16705, -15483, -6291, 6037, 14465, 17059, 16036, 10682, 1995, -4415, -7975, -9422, -10132, -12267, -11451, -7209, -3836, 5790, 12550, 13714, 13752, 6872, 1042, -3718, -4094, -1583, 24, 261, -2279, -3335, -4726, -2644, 478, 2240, 3385, 2343, -2377, -6466, -7669, -4576, 1004, 3352, 4163, 2738, 2079, 1730, 4452, 8806, 9892, 8023, 2997, -3203, -9885, -15060, -16123, -12877, -6408, -448, 4493, 6795, 8427, 10760, 9468, 7241, 1585, -3438, -7939, -11903, -10906, -5278, 1787, 6783, 10599, 11248, 8696, 3060, -3051, -5620, -5976, -7194, -8023, -8053, -5724, -2067, 6346, 14786, 18047, 13856, 2936, -6167, -13362, -11831, -5909, -2425, 771, 3629, 6256, 9154, 9533, 6995, 3193, -901, -7746, -13003, -16592, -18383, -13573, -4998, 7934, 15475, 16782, 15062, 10685, 7936, 6702, 1902, -4706, -9503, -12530, -13738, -12169, -7068, -1159, 2530, 4517, 7158, 6913, 3925, -770, -1407, 1533, 5540, 5409, -513, -4528, -3617, 700, 5133, 7668, 5693, 1751, -2598, -5696, -4846, -3858, -5340, -5362, -3202, -947, 1382, 2881, 6013, 9859, 12985, 11236, 2110, -5422, -9036, -10415, -8691, -5913, -3090, -126, 2972, 8788, 12511, 12865, 7459, -2366, -8560, -13935, -16943, -16333, -12626, -3757, 6275, 13954, 16314, 13748, 10067, 7154, 2755, -2474, -5279, -9594, -13063, -12440, -8232, -363, 5453, 5346, 4319, 1093, -2839, -5887, -6657, -4380, -331, 5764, 9855, 9435, 6842, 6703, 6442, 4582, 2773, -2377, -9067, -12192, -13912, -10754, -6056, -1576, 1093, 1852, 3820, 4695, 7462, 8084, 5507, 3194, -628, -1650, -2498, -5287, -5198, -3797, -810, 619, 1782, 2909, 3034, 4468, 5292, 4079, -774, -7590, -10795, -11402, -8039, -2951, 2875, 7455, 11401, 12097, 9416, 6288, 993, -3153, -7578, -9932, -10667, -7514, -4556, 1871, 9815, 13964, 11890, 3594, -5009, -11156, -12558, -13088, -10330, -4648, 472, 7475, 14864, 19322, 20213, 13620, 4735, -4976, -11711, -15655, -18579, -16905, -10739, -4027, 2752, 7962, 11136, 11554, 8011, 3636, -545, -2338, -4916, -6380, -6901, -2803, 3749, 7445, 6486, 4685, 2235, -1069, -3567, -5946, -5694, -5916, -4665, -1825, 1786, 1522, -247, 182, 2696, 5597, 6819, 4539, -624, -606, 1142, 530, -561, -3117, -4393, -4217, -3268, 415, 5007, 7244, 6478, 2773, -810, -4330, -7696, -9289, -8993, -4315, 990, 4279, 6819, 10977, 13738, 15987, 11724, 2614, -5102, -13223, -16825, -16995, -11715, -3800, 5015, 10704, 11796, 9900, 5260, -1873, -5346, -5861, -6349, -5183, -4792, -2907, 2467, 11193, 17091, 16686, 10343, 3342, -5270, -12593, -15966, -14830, -10172, -6433, -2248, 2924, 7860, 9515, 10961, 10951, 7816, 2242, -3976, -8242, -11293, -8530, -695, 3806, 6519, 5532, 3277, 1881, 478, 1659, 1182, -1808, -4426, -5891, -6726, -5786, -4527, -1056, 2695, 4193, 5196, 3233, -317, 238, 3882, 6571, 6148, 3009, -1935, -6906, -9001, -6914, -1720, 1186, 1503, 19, -2847, -3426, -1696, -2055, -1495, 125, 801, 1528, 1733, 4436, 11137, 14851, 13982, 9070, -1910, -10946, -15417, -16771, -13602, -8761, -5420, -679, 3772, 9374, 13949, 12634, 7046, 2638, -893, -6195, -9874, -10996, -7050, -461, 7789, 10777, 11473, 9153, 2125, -3697, -8895, -10099, -9909, -10771, -10754, -6743, -942, 6334, 13133, 14102, 12008, 6582, -1484, -6675, -8257, -7940, -6113, -4438, -2723, 814, 4017, 4968, 6976, 8454, 5358, 551, -7052, -11231, -10706, -8744, -3825, 760, 3204, 3552, 3638, 4084, 6294, 8337, 7281, 5358, 3640, 1058, -1279, -7809, -10267, -8099, -6544, -4241, -3255, -1389, -1429, -447, 2433, 6107, 8151, 6071, 2928, -192, -2442, -131, 2749, 3580, 4845, 2832, -882, -3543, -7013, -8235, -9155, -9457, -7556, -4948, -1503, 3144, 11844, 16421, 18304, 12660, 3280, -3772, -10627, -10861, -10340, -7979, -4371, -1363, 2053, 7335, 11870, 10625, 7590, 1876, -5076, -7876, -11442, -13285, -9614, -3271, 6053, 13581, 14999, 12176, 6808, 2342, -643, -2745, -5553, -9513, -9728, -7428, -812, 5152, 7669, 8616, 6936, 2736, -2484, -8095, -9900, -9713, -7593, -1816, 1788, 5924, 8646, 12202, 13535, 12209, 7691, 108, -7835, -13036, -11805, -8020, -3594, -2832, -3469, -4612, -3084, 1467, 6434, 7270, 7694, 8600, 6881, 5916, 2439, -1355, -2923, -4248, -3763, -3016, -4980, -4554, -2741, 195, 3404, 4907, 3046, -302, -4046, -6665, -4246, -1905, 1079, 5060, 8547, 9266, 9130, 6005, -317, -2743, -7058, -10514, -10636, -10581, -6742, 36, 9055, 14578, 13818, 8620, -67, -8119, -11248, -11769, -11576, -9663, -6253, 242, 7383, 14076, 17696, 15828, 9365, 1208, -5359, -11506, -14947, -15576, -11328, -3261, 2570, 7350, 8941, 6443, 4009, 647, -1871, -4204, -5956, -5934, -4437, 2360, 8909, 13325, 13200, 8858, 4776, -1821, -7190, -12066, -14261, -10952, -7979, -4724, 570, 3818, 6242, 9193, 9194, 8868, 6011, 406, -4266, -5422, -1984, 510, -1406, -3927, -4381, -5898, -4186, -2147, 1354, 5680, 5141, 2881, 2658, 2144, -2583, -5468, -6948, -6836, -4415, -2040, 504, 5462, 10149, 13140, 11548, 5280, 700, -4104, -10987, -13887, -10271, -6666, -2058, 1177, 4788, 9914, 9487, 6061, 2800, -935, -5595, -11040, -11477, -9368, -2609, 7192, 12185, 16433, 15380, 9841, 1376, -8643, -12708, -13061, -13346, -12936, -9921, -4237, 2880, 10068, 13026, 14121, 11255, 4008, -530, -5821, -7684, -5322, -3495, 109, 2505, 2398, 1922, 320, -299, -1288, -3386, -5399, -8461, -7567, -3847, 1926, 7440, 8462, 8429, 5442, 3370, 1843, -1176, -2301, -786, -1263, -2192, -2130, -3708, -3978, -3105, -513, 2428, 4949, 3960, 3406, 1354, 208, 1796, -311, -2626, -5317, -6986, -7311, -3677, 2853, 11914, 16880, 14326, 10566, 2070, -5899, -9747, -13267, -13936, -13077, -10730, -5380, 1048, 7542, 14591, 17077, 12993, 7685, 1101, -6677, -10918, -9036, -4723, -416, 2854, 6032, 7654, 7941, 5937, 2389, -904, -7477, -11178, -13247, -13672, -9645, -3847, 5196, 14509, 18863, 18255, 11992, 3733, -364, -3068, -6311, -9439, -10477, -9600, -6954, -1463, 3402, 7478, 8036, 5256, 1554, -2375, -5712, -6120, -3378, -1040, 2261, 3799, 3617, 3304, 1988, 3466, 5447, 3062, -151, -2247, -4809, -4888, -3721, -2788, -1554, -2450, -3145, -2459, -1333, 2068, 5467, 6805, 6731, 3345, -606, -3891, -7549, -5607, -1528, 1281, 5704, 8757, 8110, 5697, 2318, -779, -3849, -8601, -13849, -14673, -12812, -7825, 2023, 11031, 18960, 21797, 16953, 10521, 2477, -3946, -7856, -11814, -14078, -13592, -10144, -4950, 3371, 11999, 14154, 10446, 4415, -2998, -8525, -11582, -12085, -8766, -3325, 2944, 8110, 11066, 12733, 12868, 7797, 1510, -4863, -12410, -16072, -16203, -11344, -3452, 2276, 4339, 5780, 7567, 7289, 5485, 2543, -738, -3252, -3450, -3304, -1583, -1415, -1930, 279, 2811, 5102, 6238, 3246, -262, -559, -1375, -927, -3110, -6423, -7577, -9299, -8378, -3896, 1030, 5808, 9246, 11923, 11207, 8364, 4713, 997, -2334, -7909, -10414, -12454, -11302, -5824, 2781, 8523, 9577, 7519, 849, -5258, -8778, -9133, -8687, -5971, -2016, 5332, 12337, 17834, 21038, 15039, 6661, -3360, -12482, -17315, -19807, -18490, -14115, -5706, 4051, 11443, 17001, 15094, 11269, 7059, 386, -3449, -7059, -10084, -11190, -7953, -92, 7000, 11585, 11241, 7803, 3369, -3257, -8432, -11073, -11459, -8823, -5812, -2476, 1248, 3644, 6909, 10113, 10702, 8117, 1981, -5688, -8637, -5800, -1738, -26, -233, -324, -243, 213, 1671, 3452, 2131, 1101, -1395, -2687, -2608, -5701, -7508, -7576, -3777, 1799, 6488, 10044, 12207, 14813, 14608, 11311, 4024, -4776, -11458, -16249, -17777, -14717, -8575, -2143, 4429, 9742, 13330, 13951, 9468, 4929, 728, -3509, -6263, -7555, -7719, -3974, 6488, 14362, 17679, 14344, 4616, -5383, -12648, -14236, -11945, -11847, -10521, -5976, -109, 9199, 14957, 15823, 12790, 7810, 2001, -3696, -9500, -11401, -9216, -5121, -723, 3234, 7517, 7104, 6026, 4964, 2816, 88, -6440, -12370, -12782, -8662, -3206, 1696, 4914, 7057, 10756, 10531, 7350, 2663, -324, -318, -1070, -1420, -2868, -5417, -9562, -8386, -2876, 3460, 6322, 2817, -881, -3084, -1890, 83, -246, -1230, -3291, -2662, 721, 3776, 9056, 13328, 12300, 8482, 1693, -6735, -13207, -17621, -17104, -14947, -9379, -2750, 3241, 12035, 14844, 18119, 15672, 8940, 1827, -7541, -13320, -16721, -12900, -6427, 1550, 8964, 12509, 11980, 8211, 2162, -2183, -6747, -9764, -9326, -12509, -11503, -6232, 1362, 11231, 19162, 18855, 13350, 5692, -3046, -7171, -8413, -9158, -6759, -4931, -4592, 75, 3152, 5390, 6061, 3681, 440, -4474, -8202, -9382, -6904, -2399, 3320, 5572, 4793, 4281, 2142, 2664, 6711, 7536, 4612, 14, -5418, -7518, -8266, -9280, -6671, -4182, -2971, -1087, -790, -289, 1425, 3621, 7257, 9503, 5453, -519, -5287, -7430, -3620, 1433, 4810, 4151, 798, -1615, -4457, -4963, -4109, -3859, -5763, -8697, -7503, -2097, 4028, 9600, 15031, 15868, 12881, 6511, -1343, -8789, -13846, -13213, -9886, -6560, -1408, 3079, 8028, 11342, 11283, 8954, 2087, -5458, -11091, -14182, -13970, -10003, -496, 10312, 17702, 21861, 16030, 8447, 2351, -2849, -4277, -8718, -12728, -13930, -12736, -7387, 797, 9368, 13684, 11568, 4909, -1709, -6927, -11072, -9081, -5705, -1103, 2494, 5567, 7512, 8939, 12982, 12751, 7458, 614, -7019, -12826, -13661, -11566, -5424, -1531, -1350, -1541, -896, 1405, 3364, 6759, 9350, 10617, 8846, 5256, -1526, -7779, -5944, -6770, -7327, -4385, -3467, -2013, -607, 3767, 6677, 6755, 4061, -2807, -5480, -6956, -6491, -2568, 1723, 8541, 12837, 12688, 11123, 7714, 2393, -2162, -5747, -9767, -12465, -11978, -10330, -1673, 9583, 16682, 18232, 10555, 1882, -4343, -10157, -12177, -10720, -7173, -2359, 1765, 8286, 13170, 16516, 14641, 8836, 1580, -8090, -14224, -19379, -19820, -14470, -3867, 6329, 13217, 17112, 14349, 6820, 936, -2346, -4783, -7354, -9211, -8307, -4676, 2960, 9597, 12808, 12124, 6764, -778, -7307, -14716, -16571, -14245, -10554, -4459, -2107, 2668, 6130, 9909, 15525, 15853, 11185, 2807, -5896, -11309, -10834, -6511, -2340, -976, -2575, -2459, -883, 1407, 3150, 4564, 5311, 3093, -33, -1229, -2370, -4557, -2471, -1066, 685, 2612, 2520, 1614, 2086, 6047, 7254, 4807, -1196, -6738, -10683, -11698, -9543, -5551, 466, 5802, 8582, 9646, 9893, 4912, 143, -3506, -7374, -8096, -8016, -6921, -313, 7971, 13558, 14972, 10204, 3932, -4586, -11511, -14027, -12815, -8247, -4411, -1871, 311, 5866, 12928, 12211, 7893, 2999, -1699, -4482, -9173, -9010, -4297, 1827, 7765, 8110, 6447, 2265, -4043, -7643, -8478, -7860, -7388, -8861, -8035, -2681, 4912, 12036, 13886, 12508, 8168, 2387, -3920, -8578, -11263, -10061, -5687, -2674, 1308, 3215, 3634, 4883, 6234, 6052, 4065, -1584, -6804, -8191, -5527, -92, 1390, 798, 526, -1614, -912, 1872, 4211, 6483, 8710, 7486, 2829, -1595, -7337, -10586, -9741, -6254, -2588, 876, 2167, 2249, 3437, 6042, 7524, 4771, 1707, -3159, -6247, -6543, -2968, 3380, 9020, 10519, 8579, 4698, -2400, -7756, -9995, -8853, -9198, -8414, -6820, -1560, 6924, 13110, 17549, 15955, 9792, 1673, -7260, -13614, -14059, -8796, -2231, 3364, 7871, 9507, 8679, 2788, -737, -2451, -4111, -5911, -8143, -7241, -5222, 864, 7736, 14725, 15958, 9097, 2442, -5166, -10204, -9365, -8475, -6756, -3999, -322, 4432, 9108, 12410, 11709, 6602, -461, -6809, -11380, -12329, -11837, -8566, -2170, 3757, 8967, 10662, 8847, 5752, 4596, 4576, 1945, -2168, -5259, -6144, -5901, -3933, -1523, 782, 1781, -22, -2021, -3512, -5445, -4599, 2, 5714, 10031, 9372, 5378, 1017, -310, 3161, 4268, -172, -3265, -6802, -8779, -5322, -3247, -2390, -2112, -3130, -1717, 1815, 5394, 6118, 6691, 7195, 6005, 2582, -6054, -10648, -10977, -8594, -1807, 1818, 4289, 6214, 5525, 3736, 2515, -458, -3928, -7156, -9762, -9485, -6251, -1157, 5942, 13447, 15381, 14490, 6079, -3534, -8428, -11168, -10287, -9079, -6749, -2015, 3430, 7971, 11654, 11609, 6945, 293, -6247, -11331, -14160, -14050, -9750, -1662, 8008, 13955, 16940, 13984, 9520, 6372, 2153, -3013, -7309, -10806, -14520, -14753, -9544, 538, 8000, 10063, 6852, 3203, -303, -2573, -2897, -778, -60, 2621, 4248, 2784, 3831, 3888, 4894, 1710, -1539, -4572, -8635, -11897, -10904, -4500, 1582, 4157, 2742, 1484, 2114, 2777, 2784, 3766, 2360, -455, -1258, -3554, -4741, -3024, -1991, -1233, -697, 1346, 2602, 580, -502, 2468, 3483, 2666, -63, -6677, -9689, -9851, -6539, 725, 9148, 12140, 11773, 7650, 2509, 2091, -794, -4867, -9065, -10283, -9098, -6496, -1131, 5590, 12618, 14656, 11813, 3856, -4774, -10038, -14395, -13168, -7377, 501, 7208, 13035, 15215, 15218, 14919, 7213, -1645, -10170, -14696, -17404, -19280, -14254, -5369, 3922, 13375, 17279, 15290, 10348, 2103, -2796, -4469, -5255, -6844, -8692, -8557, -3407, 8098, 15847, 15273, 9286, 638, -6875, -12782, -14343, -12442, -8586, -2592, 2504, 8345, 11500, 9859, 7813, 5798, 3109, -881, -5527, -11641, -12514, -7211, -353, 8315, 11234, 10668, 7471, 1660, -1627, -3822, -6873, -8283, -9025, -8039, -4994, -728, 5101, 9339, 12747, 13492, 9210, 1505, -5230, -8580, -5924, -2585, -680, -1535, -4350, -5323, -3720, 2655, 8644, 8533, 5783, -610, -4688, -4401, -6234, -3983, -2881, 1191, 5495, 5220, 3716, 3969, 6935, 8797, 6868, 392, -7913, -15074, -17481, -14389, -5939, 1481, 8469, 10646, 9330, 9481, 7530, 4481, 2614, -972, -6344, -10552, -12077, -5675, 3052, 11068, 14027, 10167, 3489, -3796, -7680, -9418, -8770, -7047, -4185, -1419, 1923, 6130, 10476, 11944, 10209, 7356, -855, -9032, -16481, -17731, -12073, -1440, 7138, 10062, 10973, 7020, 4189, 384, -1644, -4270, -7739, -10600, -13671, -12029, -6167, 4180, 12294, 16369, 15238, 6952, -1185, -6637, -7458, -4289, -3492, -4033, -4842, -5154, -2628, 898, 5309, 9880, 7767, 3721, -4180, -10397, -9378, -5822, -93, 1963, 4112, 3927, 3011, 3160, 2339, 5298, 8882, 5487, 803, -3488, -10628, -15946, -15023, -9720, -3020, 5783, 7876, 9152, 11762, 10832, 8649, 2209, -3059, -9166, -14166, -13304, -11247, -3683, 8140, 15977, 16584, 11802, 4602, -3522, -9268, -9598, -8170, -5231, -5380, -3528, 2840, 8631, 13094, 12599, 9328, 2106, -7062, -15470, -18723, -15504, -5020, 9168, 16064, 17299, 14337, 7083, 940, -3426, -4380, -6776, -10837, -14024, -15499, -11180, -1377, 10485, 18905, 19778, 13070, 4795, -4596, -8951, -9602, -6613, -2762, -1230, -1000, -253, 46, 306, 5034, 6688, 5587, 1109, -5395, -8027, -6092, -1690, 1154, 2930, 3674, -488, -652, 639, 2655, 8285, 9108, 5716, -1420, -8824, -12794, -13204, -10040, -1911, 4674, 9251, 10121, 8286, 8601, 6483, 3333, -1017, -6325, -13304, -17034, -15190, -9917, 2932, 18723, 25248, 22714, 12372, 309, -6943, -12626, -12591, -12927, -10386, -7416, -3913, 4279, 11184, 15230, 14462, 9073, -1372, -9880, -15212, -17478, -12282, 2091, 13508, 17477, 17341, 12044, 5665, -1832, -8564, -12028, -14107, -15586, -15436, -10081, -206, 10924, 19961, 20242, 15596, 7550, -661, -7749, -12049, -8931, -4366, -1812, -2713, -1087, 2313, 4233, 6590, 6731, 5286, -247, -7328, -9807, -7113, -2409, 3063, 3215, 863, -348, 164, 2123, 1578, 3215, 5366, 4957, 2104, -1987, -7330, -10319, -9222, -4755, 2111, 6680, 6881, 6434, 6649, 6199, 3174, -407, -5102, -11444, -13798, -13262, -8988, 205, 13427, 22639, 23016, 17263, 5303, -7029, -15403, -21116, -17294, -13179, -10356, -4573, 1057, 9918, 16929, 17718, 13274, 4953, -4636, -10224, -14014, -13453, -7866, 905, 8329, 12827, 15208, 10106, 2462, -4456, -10584, -12933, -12737, -12717, -10265, -2607, 5776, 14130, 19636, 17161, 8870, -411, -6805, -11151, -10332, -7660, -1944, 160, 67, 3339, 1751, 1416, 3955, 4840, 2420, -2932, -9234, -10565, -8007, -3713, 2359, 6065, 4960, 2515, 2035, 1077, -25, 1366, 2786, 2178, 531, -1536, -4574, -7804, -5461, -1669, 3610, 6615, 4521, 2007, -1157, -1581, -991, -2483, -3166, -5591, -7584, -5976, -3786, 6173, 15771, 19384, 17270, 8699, -596, -11104, -16103, -16434, -14683, -9806, -6338, -2116, 6066, 12444, 18017, 19704, 13585, 4370, -5712, -14062, -17210, -12937, -3372, 5100, 10738, 13612, 12241, 7099, -575, -3678, -5374, -8238, -10239, -11501, -8113, -2140, 6482, 13940, 17550, 14545, 6023, -1075, -9600, -12417, -9315, -6667, -4753, -1187, 3381, 5503, 9035, 9898, 9407, 5698, -2755, -9321, -15158, -17668, -13669, -4959, 6074, 13326, 15480, 12220, 5388, 539, -1026, -885, -3363, -6352, -8636, -8261, -4177, 1488, 8442, 12686, 10775, 4212, -2698, -9300, -12186, -10829, -5716, 404, 5007, 7032, 6080, 7184, 9779, 10610, 7695, 1968, -3112, -8416, -12394, -12433, -9325, -5752, -4261, -375, 3023, 6379, 7223, 5602, 8582, 9509, 9045, 2734, -8726, -13661, -12237, -4507, 4406, 6853, 6741, 5130, 2729, 1703, 976, -1919, -6802, -11847, -12961, -9985, -5084, 1450, 10171, 17012, 17509, 14618, 3479, -5156, -9793, -12936, -11196, -8673, -3562, 1000, 6729, 10305, 11353, 9603, 2563, -5981, -13116, -16028, -14322, -10488, -3384, 8100, 14693, 17621, 14370, 5259, -573, -6260, -7480, -7928, -7878, -6926, -5055, -621, 4432, 12199, 12282, 5095, -2703, -9629, -12020, -11209, -7705, -943, 4290, 7996, 11519, 9647, 9009, 6752, 3061, -693, -7456, -8143, -8820, -8069, -6413, -3444, -448, 8, 1488, 3000, 5927, 5471, 5526, 4828, 4257, 3903, 3311, -1001, -7312, -9172, -7335, -3161, -18, 2811, 2931, 4933, 4897, 5185, 4145, -2032, -6327, -9989, -10179, -7137, -578, 6445, 10980, 12968, 12197, 7085, -939, -7089, -10546, -11596, -10579, -6297, -189, 4989, 9204, 10449, 8006, 1587, -5908, -10425, -12918, -12505, -8782, -3446, 3877, 13424, 18643, 17749, 12208, 2982, -4311, -10418, -14972, -15541, -13626, -9530, -2452, 7689, 14611, 15353, 9148, -1334, -6921, -9423, -11087, -10019, -6240, 727, 9680, 15329, 19042, 16803, 9207, 940, -7958, -13992, -16569, -16141, -14641, -10226, -817, 7608, 12813, 15911, 13606, 9901, 3938, -1354, -4689, -7494, -9055, -7296, -1505, 2016, 3787, 4310, 3875, 2299, 1486, -1571, -4157, -5440, -3166, -11, -363, 1185, 729, 169, 2471, 5861, 7631, 5159, 374, -2854, -1236, 821, 113, -2279, -4451, -4787, -2990, 22, 2320, 2854, 1930, 1422, -916, -692, -1616, -4653, -3954, -2198, 1578, 6109, 7154, 7085, 8132, 7996, 6732, 937, -6285, -12128, -15265, -13054, -7568, 228, 7831, 11156, 9545, 5558, 1915, -2817, -5674, -8015, -7859, -2994, 1101, 5506, 11162, 15276, 16908, 11407, -128, -9390, -16864, -20066, -19356, -14147, -6031, 2520, 9927, 14011, 18590, 16299, 9147, 2665, -4353, -6338, -8377, -10695, -9890, -6873, 1714, 8560, 9831, 8318, 2770, -2566, -6257, -7599, -4137, -2112, -1997, -2804, -964, 2890, 4177, 5721, 5583, 3571, 866, -2418, -4001, -2516, 1400, 3287, 2259, -1785, -4216, -4309, -3410, -103, 2496, 2659, 551, -2357, -2554, -1433, -3416, -3680, -2218, 168, 3873, 7084, 6487, 6935, 9792, 5821, 1037, -5505, -11981, -14390, -13747, -8436, -603, 6225, 7788, 6363, 4094, 2378, -856, -2981, -3968, -4479, -2124, 8, 2534, 7875, 14364, 13238, 7970, -64, -9115, -14539, -18870, -19076, -11166, -3270, 3562, 10140, 14958, 19245, 15175, 8145, 397, -7555, -10960, -13068, -14178, -12440, -5515, 4376, 11423, 14996, 12106, 4430, -3345, -7985, -7046, -6392, -7330, -9219, -7916, -3142, 2944, 7579, 8350, 6477, 3199, 987, -722, -2917, -2033, 937, 2581, 2625, 2602, 1970, 187, 266, 2155, 2428, 997, -2764, -7104, -6526, -5699, -3222, -675, 2993, 5572, 7232, 8866, 6403, 5494, 4283, 2040, -2366, -5207, -8196, -11527, -12209, -8973, -4346, 499, 3453, 3332, 4052, 3777, 3503, 2599, 1450, 357, -1358, -2128, -1582, 3800, 8057, 8140, 5646, 285, -5087, -11323, -14143, -13543, -10726, -4511, 1944, 8119, 14057, 14378, 13215, 8997, 1578, -3125, -8076, -12182, -12775, -8586, -2622, 6268, 15023, 16671, 13120, 6051, -4033, -7768, -7968, -9519, -11379, -11764, -7452, -316, 7273, 14558, 17436, 14143, 6727, -1221, -8628, -10044, -4860, -3704, -331, 3005, 3467, 3989, 1560, 1224, 2387, 2336, -416, -4235, -7175, -8984, -5950, 1428, 8029, 9744, 9658, 7137, 2574, 58, 15, -972, -2592, -1286, -1395, -1665, -4388, -6496, -4440, -2169, 897, 3032, -947, -3830, -4057, -987, 6271, 7785, 4982, 1769, -2951, -3610, 2031, 5748, 5982, 3434, -463, -3695, -6176, -8351, -6916, -4885, -2756, 191, 994, 2854, 5624, 7294, 9648, 8612, 2560, -3464, -12822, -17186, -12033, -4201, 3968, 11902, 14556, 12680, 7785, -138, -4141, -7503, -11246, -12427, -13632, -12416, -6862, 955, 9252, 16927, 18648, 13524, 4417, -4684, -8166, -6874, -5320, -5674, -3832, -1891, 1321, 5583, 7669, 9023, 5501, -962, -7036, -11452, -12262, -9680, -3693, 4170, 10937, 13598, 10344, 6695, 3601, 2376, 2528, -1712, -5329, -7509, -8667, -9084, -5881, -397, 2083, 3670, 3381, 1929, -155, -3130, -1770, 3380, 4303, 3168, -1540, -3242, -3773, -919, 5671, 5957, 1846, -1978, -2846, -6217, -5712, -4711, -4675, -3563, -2849, -2305, -435, 1777, 4997, 8640, 8992, 7134, -1388, -7863, -12725, -11990, -4290, 1171, 4730, 7322, 9274, 8178, 5361, 2017, -2841, -6991, -10231, -13860, -14164, -10753, -3221, 7721, 16932, 20696, 17567, 7452, -1311, -4649, -6949, -9064, -9314, -8581, -6502, -228, 4233, 9587, 10184, 3778, -849, -5992, -9390, -10159, -10165, -5251, 2043, 9903, 15657, 12812, 7742, 3829, 2018, 1008, -2105, -6332, -10382, -12202, -9072, -3597, 1789, 4196, 2182, 3109, 3804, 4162, 4869, 4295, 4666, 4757, 3932, 233, -4106, -5722, -5194, -2387, 51, 1074, 979, 543, 636, 3929, 5283, 780, -3998, -8206, -8814, -5703, 1, 5807, 9043, 9119, 8586, 4378, -2294, -6077, -9605, -7164, -3161, -1677, 690, 2845, 4670, 7597, 7475, 1871, -3972, -10249, -15974, -14931, -8832, 264, 10648, 16638, 17337, 14603, 9624, 3233, -3712, -10024, -14776, -15088, -12459, -9146, -1711, 7928, 14608, 14801, 8866, 1664, -4602, -8919, -9369, -7477, -3331, 1561, 7557, 12120, 14605, 14331, 8350, 2737, -5420, -10912, -13762, -16032, -12988, -5057, 3180, 9661, 12173, 10923, 8533, 3519, 1074, -604, -1886, -1889, -1484, -1935, -604, 1474, 1550, 2403, 2612, 381, -1739, -6290, -8510, -4050, 902, 4308, 3100, -547, -3888, -2695, 135, 3301, 3720, 1550, 369, -115, 1581, 3454, 483, -4042, -4866, -4492, -2443, -2001, -3077, -883, 3379, 4400, 4588, -1325, -8305, -9914, -9346, -3401, 3574, 9903, 13509, 12189, 9264, 6790, 387, -4503, -10812, -15250, -14888, -13153, -7656, -1129, 7901, 12814, 14707, 11475, 3163, -2652, -7282, -8660, -6440, -3325, -852, 3198, 7395, 11256, 11749, 7014, -149, -8871, -13959, -16710, -15989, -10268, -2426, 8024, 15970, 17072, 12284, 5841, -867, -5191, -5437, -7666, -9137, -8344, -4704, 1762, 8085, 11925, 8535, 3244, -3551, -7960, -10646, -10092, -7099, -2890, 2703, 5953, 9600, 9533, 7177, 2953, 254, -2015, -3055, -5025, -6742, -5339, -2332, 2212, 2392, 1931, 369, -2702, -5128, -5276, -4369, -1667, 1619, 3433, 3972, 1541, 2145, 3999, 5120, 5072, 2918, 1830, 352, -499, -1273, -3998, -8916, -10876, -12122, -11543, -6302, -655, 5407, 11048, 14107, 13091, 8928, 3024, 1110, -657, -2704, -4040, -4650, -2259, 1093, 2488, 1865, 441, -3064, -4762, -7858, -11451, -10194, -5690, 151, 10274, 17605, 19951, 18054, 9333, 2370, -3165, -8865, -11420, -13810, -11268, -6095, -2188, 5375, 9036, 9130, 5815, 813, -4103, -7443, -8121, -7396, -3346, 2135, 7998, 14022, 16043, 11526, 7531, -234, -7043, -9394, -9473, -11393, -11771, -7139, -3158, 3355, 6279, 6470, 4559, 592, -705, 510, 1289, 1314, 1196, 662, 2217, 3356, 3608, 2510, 1219, 1175, 862, -2665, -7369, -6834, -5527, -1593, -57, -1642, -2043, -3656, -1368, 2106, 6719, 8682, 10412, 9252, 8095, 5453, -952, -4929, -10526, -10238, -7788, -5339, -1845, 1639, 5105, 5442, 3151, -786, -4177, -6965, -7093, -3401, 1934, 7601, 10939, 12016, 11457, 11396, 5781, -2906, -10857, -16772, -17479, -15917, -9698, 361, 10527, 13056, 12532, 8969, 1508, -4671, -8515, -8731, -5125, -2532, 1403, 6042, 8928, 13116, 10826, 4301, -1831, -8020, -12358, -13870, -12834, -6139, 1919, 6979, 11555, 11344, 6241, 3105, -60, -2948, -3873, -5739, -6783, -3882, 1114, 7382, 12510, 9867, 5361, 641, -4801, -8930, -11813, -10290, -5978, -91, 3764, 3594, 1979, -1234, -447, 2470, 2964, 1777, -1476, -4480, -2080, 4019, 7717, 5820, -144, -4823, -5901, -4766, -4315, -4663, -5468, -3767, -1965, -216, 608, -1815, -2219, -680, 2818, 6936, 6556, 3630, 2142, 3361, 5573, 4393, -1988, -8559, -12282, -14856, -10662, -2574, 3205, 7609, 9561, 9416, 8272, 3384, -1277, -4818, -7798, -8270, -7548, -4414, 1160, 8848, 12436, 12653, 7818, -450, -6790, -12433, -13859, -10780, -4935, -455, 4119, 8264, 9565, 9564, 5870, 1473, -2634, -6735, -10738, -10439, -6812, 256, 8771, 12440, 14728, 10775, 4529, -2368, -9407, -11067, -10186, -8900, -7557, -5559, -1347, 4144, 10051, 11926, 9598, 5059, -244, -3833, -5800, -3444, -616, 1816, 3825, 5014, 5554, 3243, -1081, -3445, -5466, -6889, -7945, -8692, -4946, -1734, 2993, 7921, 9134, 9886, 8746, 4223, 970, -1078, -1307, 932, -605, -3263, -4971, -8885, -8465, -4461, -262, 5139, 4788, 4150, 4084, 3678, 5374, 2124, -1458, -3245, -5194, -4907, -3661, 714, 5948, 9738, 9884, 6527, 351, -7812, -12283, -12072, -8346, -4111, -2664, -44, 6487, 9817, 12973, 9366, 1766, -2425, -8912, -11789, -12256, -8350, 1056, 9384, 15960, 17517, 12333, 4843, -4267, -10686, -10944, -11033, -12677, -12719, -9726, -2477, 7132, 15219, 16874, 13624, 7635, 868, -3907, -5663, -4825, -4135, -1497, 263, 2170, 3527, 1969, 1675, -315, -2934, -5711, -7285, -6424, -5749, -2754, 3457, 10297, 10763, 9586, 6991, 2637, 2631, 1488, 123, -1748, -4154, -5879, -8109, -7000, -2170, 505, 3504, 4530, 4089, 3307, 550, 13, 1680, 4139, 1253, -2969, -6402, -5632, -1630, 3499, 7725, 8537, 9099, 5110, 122, -4972, -10230, -11158, -11046, -10273, -6697, -2849, 3794, 11114, 14720, 13936, 8553, -224, -7382, -13224, -14203, -9739, -3960, 3175, 9832, 14428, 14453, 8602, 334, -6088, -11858, -14660, -16013, -15805, -12768, -4509, 5585, 13580, 20179, 17410, 11376, 3509, -4137, -5245, -6446, -7967, -8065, -5926, -3296, 427, 2400, 3246, 2574, 405, -1786, -4317, -5358, -5242, -783, 2114, 5264, 6953, 5500, 4243, 3949, 3235, 1294, -666, -4593, -7243, -6058, -5722, -3438, -1661, -1194, 1080, 2162, 4262, 3792, 1263, 679, 2035, 4042, 2245, -3055, -5991, -6266, -3377, 2006, 7563, 8602, 8159, 6291, 2402, -2009, -8009, -11098, -13307, -12566, -7714, -3480, 3206, 11209, 14080, 15566, 11599, 3103, -3481, -8420, -11285, -10605, -7006, -2364, 2554, 7320, 10294, 10714, 6433, 712, -6282, -13154, -15977, -16162, -11204, -4132, 4300, 12923, 18530, 20757, 17345, 9541, 1203, -5395, -9303, -13121, -14550, -14834, -10523, -4100, 2533, 7954, 8843, 8444, 3752, 1371, 826, 464, -1681, -1948, -1168, 1125, 5614, 5458, 3377, 2100, -181, -2841, -5463, -8059, -8160, -6680, -2611, 1553, 5920, 6497, 4772, 3608, 3336, 4266, 3205, 1, -2623, -1320, -255, 617, -318, -1136, -776, -1319, 517, 2854, 838, 272, -915, -1943, 599, -1797, -4145, -3636, -1649, 2273, 4545, 5548, 6749, 8171, 7839, 5439, 798, -4669, -8665, -12063, -11196, -7988, -3533, 4365, 8891, 9764, 8155, 2225, -3980, -7282, -8742, -9187, -6616, -1784, 4132, 11942, 17469, 18858, 15334, 5423, -5094, -12528, -17594, -19067, -18223, -13737, -6597, 2631, 11606, 17171, 18372, 16384, 11870, 4023, -1982, -7111, -11965, -12961, -10663, -4405, 5019, 7866, 7991, 6002, 1121, -710, -2155, -3050, -6904, -8630, -7990, -5534, 1275, 5789, 8600, 9401, 6533, 3442, -398, -2808, -4464, -4567, -1826, -2248, -1437, -395, 344, 3444, 4225, 3480, -375, -5718, -8016, -8080, -5694, -296, 2091, 2348, 2842, 2526, 4632, 7215, 6737, 5085, 4147, 402, -3011, -6782, -10875, -10696, -8312, -4519, -809, 1754, 1798, 3109, 4408, 6925, 6929, 2012, -2657, -6264, -5668, -2122, 2180, 5544, 9544, 8702, 6194, 1669, -5709, -10112, -13044, -12534, -11272, -8649, -4903, 1919, 10437, 17425, 20950, 17229, 7652, -2297, -9085, -12782, -14006, -11914, -9749, -6779, 1073, 8172, 13670, 13272, 9571, 6730, 298, -4614, -9389, -12962, -12817, -8995, -534, 7704, 10877, 10768, 7867, 4343, 1814, -5, -2825, -5829, -7127, -7556, -5340, -2078, 3558, 6737, 5281, 3537, -67, -3964, -5630, -8090, -5439, 32, 3766, 7746, 4948, 2387, 4542, 6669, 7741, 3545, -1512, -4504, -7863, -6156, -4514, -3963, -4638, -6455, -5664, -1258, 2221, 4668, 7894, 8857, 9684, 7883, 2966, -3829, -7910, -7523, -4598, -2404, -1372, 402, 732, 984, 2286, 1173, -2442, -6348, -9504, -9025, -5086, 581, 6216, 12805, 15259, 15497, 10701, 304, -6921, -12102, -14724, -14358, -11519, -6433, -249, 7589, 15851, 18741, 14035, 5861, -4037, -12701, -15364, -14748, -10940, -5154, 2618, 9033, 14032, 18124, 14500, 8785, 1669, -4697, -8965, -11961, -11846, -8959, -4520, 1232, 7094, 8017, 6511, 3652, 617, -1039, -2956, -3387, -3816, -2010, -163, 3589, 7934, 6441, 4941, 1736, 560, -379, -2379, -3670, -4481, -3033, -3859, -3885, -3945, -2669, -1588, 663, 5120, 8841, 9256, 7582, 5125, 2632, 4075, 1172, -4756, -7828, -10195, -7933, -4555, -528, 3796, 5063, 5975, 3464, 1961, -19, -3707, -5736, -5474, -2233, 1735, 4425, 6388, 6756, 7057, 6413, -754, -5915, -10053, -12175, -10298, -5371, 1989, 7325, 11141, 9766, 6856, 3514, -2971, -7668, -10126, -12226, -9919, -6036, -1813, 6264, 14524, 19810, 17396, 10048, 831, -6987, -12450, -15607, -15472, -11611, -5067, 2071, 6359, 9302, 10683, 7140, 4594, 302, -2438, -3894, -6670, -9001, -8709, -2134, 4641, 10157, 11916, 8940, 5009, -1570, -6894, -8233, -9597, -9671, -7577, -4519, -233, 3517, 5496, 7529, 7379, 6008, 3684, -1033, -6251, -4840, -2084, -1326, -1050, -3047, -3114, -3319, -672, 3171, 4719, 3962, 2108, -585, -1064, -859, -4213, -4320, -4016, -2633, 846, 2555, 2280, 3567, 6213, 6498, 4151, 188, -4519, -8236, -9543, -6188, 1243, 5655, 8226, 6502, 4353, 3463, -2393, -6259, -7725, -9623, -8467, -4921, -1943, 7854, 17702, 20538, 17860, 9932, 335, -9639, -16903, -20171, -18102, -12402, -6268, 473, 6889, 13929, 16561, 13899, 9636, 2349, -2726, -8019, -12842, -12067, -7339, 1731, 8877, 12077, 13194, 7393, -734, -6311, -9947, -9153, -7877, -9202, -7172, -2340, 2283, 8781, 11901, 11119, 8411, 3175, -3078, -6557, -7255, -6509, -3756, -1707, -1077, 576, -146, 946, 6455, 8849, 6856, 2468, -2824, -5645, -5373, -4175, -3464, -2727, -2876, -2475, -229, 2206, 6522, 11308, 12407, 11222, 7725, 259, -8032, -13965, -13343, -8168, -2452, 2664, 3189, 3033, 2187, 2028, 3035, 1614, -618, -3021, -4562, -3931, 738, 8100, 14272, 14236, 10305, 2909, -5252, -11800, -15770, -16842, -16026, -8798, -3521, 4046, 11812, 15614, 18031, 13315, 6221, -743, -8532, -14103, -15997, -10790, -2750, 5131, 11646, 11874, 9181, 3819, -1425, -4630, -7553, -9728, -11025, -11592, -7245, -278, 8121, 15511, 16430, 12212, 4424, -3431, -10527, -11462, -8423, -6245, -2816, 237, 3068, 6213, 7711, 10296, 7553, 1705, -3349, -9550, -12497, -13261, -8749, -3371, 2881, 6868, 5922, 6446, 7640, 11481, 10432, 5549, 708, -3657, -6611, -9370, -9241, -7290, -4401, -2297, -1492, -249, 1242, 689, 2955, 6200, 7609, 7643, 2715, -1416, -4425, -1882, 2643, 1949, 2464, 1424, -474, -1371, -2145, -3311, -3795, -4250, -7006, -5635, -3060, 552, 6735, 10892, 12334, 9116, 3234, -1894, -4954, -6254, -7892, -6037, -4478, -1887, 4086, 6227, 7429, 8232, 3834, -488, -5041, -10281, -11953, -12381, -6922, 951, 9736, 14878, 15298, 12390, 3548, -2154, -5511, -7973, -8641, -11426, -10285, -4949, 452, 7037, 11765, 12492, 6436, -190, -8596, -11936, -11712, -10231, -6341, -2762, 2858, 8640, 14419, 15587, 14406, 8598, 606, -6899, -12404, -15897, -16195, -12598, -6197, 290, 4453, 5989, 6559, 7313, 7563, 7162, 4902, 1727, -1839, -3615, -4503, -681, 2334, 4007, 2825, 688, -570, -3463, -5023, -4109, -1694, 875, 2573, 1160, -830, -346, 907, 4077, 7229, 6370, 3727, -1113, -3613, -3819, -1827, -1701, -4324, -4669, -2608, 83, 3410, 7070, 9059, 6340, 2325, -2259, -8358, -11172, -11894, -9146, -3697, 1590, 3094, 6221, 8872, 11278, 11964, 6733, -309, -6437, -11521, -13671, -12515, -6981, 915, 6751, 10022, 9098, 6619, 203, -4731, -5432, -4652, -3638, -4234, -3593, 414, 8781, 16371, 17133, 13109, 4077, -4724, -10260, -14864, -14975, -12606, -10776, -7356, -961, 5852, 12223, 15013, 15312, 12120, 6896, 1459, -4137, -9518, -10530, -7762, -4722, -1116, 1647, 2649, 3588, 3592, 3069, 3006, -1128, -4761, -7553, -5443, -2891, -12, 3004, 3959, 6565, 6034, 4509, 663, -2819, -5288, -3900, -2997, -2455, -2562, -3627, -1489, 2679, 7654, 8836, 5357, -940, -3608, -4792, -4087, -2973, -4840, -5351, -3596, -499, 2528, 7375, 11380, 12339, 12785, 6991, 788, -5982, -12842, -13741, -12598, -8434, -4689, -1408, 862, 3998, 7004, 9575, 8463, 5364, 249, -4904, -7608, -6988, -1022, 2172, 6801, 9014, 7723, 6302, -199, -7416, -10270, -12020, -12866, -12036, -9517, -4376, 5463, 14220, 18326, 19366, 12645, 4335, -2026, -7961, -9299, -9965, -11723, -9713, -5971, -407, 5561, 10572, 10282, 8641, 5515, -1135, -5554, -9204, -11209, -10320, -4592, 3332, 10000, 11499, 7617, 5038, 2831, 1010, -555, -4289, -8120, -7276, -4980, -1859, 1720, 3722, 6173, 6018, 3033, -1532, -5299, -8009, -6470, -325, 3710, 3986, 1925, -70, 2794, 7969, 9156, 7087, 2412, -3062, -7646, -8379, -7574, -5918, -5155, -6475, -6181, -1935, 2578, 6619, 10169, 12599, 12194, 7539, -98, -8493, -10931, -10339, -6042, -2659, 1490, 6966, 5363, 4061, 2504, 201, -2631, -5616, -9097, -10034, -7124, -3036, 4269, 12681, 16391, 16002, 11424, 1922, -4586, -9187, -11274, -12263, -11785, -8728, -5073, 2032, 9783, 16808, 18568, 11535, 3413, -4564, -11072, -12530, -12102, -8720, -4090, 1338, 6276, 9605, 11808, 13227, 13146, 8248, 1237, -5192, -11767, -14503, -12453, -7574, -1472, 3606, 5610, 4662, 4097, 2717, 70, -74, -1212, -202, 1166, -511, 288, 2014, 4907, 5804, 4389, 2705, -768, -5256, -9398, -8956, -6163, -3036, -508, -2259, -1748, 10, 1021, 4671, 8721, 9452, 7632, 3041, -3703, -3671, -4203, -6631, -6074, -5019, -3235, -1960, 23, 4572, 8108, 8448, 6114, 1506, -2886, -7791, -10869, -9084, -3810, 2428, 5882, 8497, 8499, 8296, 7479, 1961, -1955, -5790, -9632, -12448, -12699, -6444, 2009, 10225, 14151, 11912, 7849, 461, -5980, -9001, -10778, -9261, -7423, -5029, -877, 5897, 14333, 19164, 17536, 12044, 2185, -7799, -16218, -20267, -18306, -13417, -5144, 1440, 5860, 9636, 10884, 9287, 8321, 5269, 1647, -3083, -7468, -10572, -9433, -3292, 3989, 10380, 10537, 8269, 1899, -4338, -8378, -8913, -7057, -6615, -5894, -4244, -1133, 4206, 8101, 13084, 14591, 9524, 2854, -6647, -11958, -10743, -5539, -1535, 134, -81, -715, 351, 4017, 6835, 6963, 4090, -171, -4268, -6383, -6078, -7789, -5206, -1084, 2161, 4393, 5337, 4221, 2402, 5092, 7339, 4894, 951, -4782, -9271, -10009, -8545, -3600, 2033, 5649, 6892, 5366, 2864, -1342, -4595, -5033, -5784, -6603, -6473, -4516, -441, 11102, 19471, 20474, 16123, 4004, -4663, -11662, -15601, -15375, -13694, -10357, -7237, -1666, 5992, 12725, 15437, 13473, 9262, 3122, -2849, -8765, -12820, -10276, -3298, 6025, 11908, 11342, 8378, 3327, -1340, -4356, -5639, -7720, -11349, -12144, -9193, -3861, 4887, 10926, 13781, 14216, 9961, 4442, -2580, -7895, -9204, -7052, -4119, -2486, 994, 2831, 2437, 7121, 11373, 9647, 3546, -4635, -11180, -12662, -8533, -2599, 1278, 2888, 3406, 3743, 6217, 7876, 9301, 9226, 5074, 917, -2506, -6559, -10120, -11395, -6926, -2922, -326, 2553, 1557, 1123, 1766, 4681, 6128, 2736, -1931, -7280, -8968, -5290, 769, 8014, 12117, 10876, 8856, 4972, -1206, -7127, -10768, -14354, -16091, -12221, -8746, -3367, 5487, 13148, 20330, 19039, 12024, 4108, -5186, -10960, -12509, -9182, -5465, -546, 3536, 5775, 8100, 7471, 4798, 984, -3863, -7101, -9032, -10555, -8492, -4105, 3178, 12459, 16612, 14357, 8157, 1221, -3878, -7778, -9356, -9572, -8208, -5939, -1623, 3132, 7379, 10057, 9132, 5832, -1367, -8596, -12553, -14728, -12418, -6061, 131, 5718, 8208, 9614, 10980, 10473, 8571, 4871, -516, -5889, -8981, -9507, -8075, -5991, -3082, -638, 2037, 2682, 1756, 1267, 281, 2212, 4964, 5885, 3700, -1198, -2537, -1655, 341, 4134, 4635, 2873, -121, -2783, -4835, -7031, -8113, -9138, -9337, -7136, -3915, -264, 7244, 13273, 17050, 15836, 7905, -152, -4911, -7143, -9975, -9959, -8789, -5334, 2454, 7219, 11311, 13519, 9096, 4459, -456, -6003, -9152, -11358, -10042, -5918, 734, 7380, 10393, 10236, 6515, 3057, -1634, -5693, -8771, -11703, -11825, -9499, -3759, 3111, 9717, 11734, 9069, 2429, -4608, -8909, -11098, -9402, -6063, -2831, 2554, 7337, 11385, 14341, 13818, 11644, 6229, -1402, -8224, -15075, -18679, -15629, -10530, -2025, 4441, 6379, 6335, 5945, 5911, 5029, 2593, -343, -1487, -3503, -2340, 980, 5309, 6507, 6268, 3946, 424, -2414, -7084, -8112, -6459, -3876, -1588, -1435, -1844, 408, 5021, 8577, 9944, 8401, 4728, 2269, 873, 2218, 1967, -1239, -4890, -7947, -8456, -7488, -3853, 342, 5898, 10070, 9678, 6757, 473, -4396, -6895, -9051, -5706, -2654, 963, 4613, 6741, 11007, 11935, 7873, 1042, -5105, -10273, -14397, -14822, -10309, -3823, 3095, 7823, 10164, 9874, 5294, -1211, -5586, -6777, -7119, -7293, -5705, -1391, 6281, 14924, 16948, 14086, 7693, -577, -8465, -13756, -16063, -14244, -10160, -5469, 819, 6661, 11512, 11738, 9563, 7788, 3846, -901, -3332, -6794, -8244, -3562, 1420, 5970, 9926, 9017, 4161, -1716, -5097, -6487, -5920, -7052, -7816, -5313, -3115, 1130, 6618, 11791, 13266, 11607, 6920, 909, -4516, -6477, -4728, -3225, -3132, -3454, -3911, -3387, -1897, 1432, 4968, 3555, 843, -3361, -4743, -3475, -1934, -226, -1103, -285, 26, -45, 1473, 3203, 5759, 7308, 6431, 2804, -2522, -7390, -10824, -10990, -8363, -4592, 937, 4066, 4274, 4940, 4238, 3986, 2086, -259, -3401, -8444, -9701, -7756, 1112, 11635, 16250, 15491, 11155, 2189, -5706, -9705, -12651, -13604, -13643, -11055, -7183, 756, 9013, 15471, 17497, 14252, 7767, 599, -6065, -11596, -11927, -7304, -2095, 3246, 8223, 8601, 6880, 2638, -1308, -4495, -6349, -8365, -11930, -13235, -11107, -3606, 7228, 16339, 19863, 15195, 8452, -164, -5792, -4973, -6243, -8310, -9298, -8789, -4980, 677, 6283, 10921, 10907, 6952, -156, -5651, -9355, -9690, -5019, -140, 4094, 7461, 7384, 4556, 2601, 3090, 5037, 3078, -2397, -5680, -5842, -5398, -3256, 107, 2316, 3912, 3374, 1184, -2291, -5195, -4926, -3981, -51, 2125, 1205, -928, -2979, -1258, 5403, 10630, 10078, 7033, 2596, -1489, -5179, -7419, -8925, -10514, -12739, -11508, -8721, -703, 8858, 15216, 19256, 18058, 13020, 5084, -2424, -10108, -11686, -9493, -6809, -2043, 2169, 4375, 5898, 6886, 4472, 1579, -3147, -9087, -12647, -12056, -8271, -1964, 7057, 15167, 18698, 14420, 7105, 1037, -3991, -6671, -9734, -12100, -12434, -9853, -5506, 1117, 9294, 13139, 11964, 6008, -2110, -7261, -8916, -9404, -5784, -1897, 967, 3049, 3886, 4991, 5670, 7586, 6524, 3024, -2104, -6590, -8999, -9318, -5469, -1286, 994, 1941, 1936, 2799, 2345, 859, 13, 1262, 3915, 3964, 1985, -2271, -4533, -1267, 4032, 8472, 8606, 5231, 2498, -1272, -3151, -3862, -7107, -10150, -11359, -9340, -5251, 2074, 8272, 13025, 17326, 15511, 11842, 4365, -4418, -9475, -11697, -9964, -8020, -4533, -576, 3333, 7725, 9996, 10918, 5385, -3722, -8681, -12637, -12253, -8456, -4718, 3397, 11344, 15874, 16099, 11005, 3731, -3476, -8953, -10827, -11506, -11340, -10694, -5891, 2368, 11373, 16854, 11698, 5156, -1633, -5877, -7242, -7828, -7458, -5574, -44, 4677, 8608, 9852, 9071, 6798, 3074, -1800, -5486, -8989, -11405, -9190, -4539, 1022, 5727, 6873, 4963, 2646, 50, -1653, -1875, -2854, -2377, -2000, -697, 1215, 2075, 4350, 4792, 4819, 4366, -387, -7004, -10793, -13560, -10412, -5857, -1759, 697, -306, -375, 2420, 9314, 11653, 10024, 5374, 1805, -2016, -1911, -3007, -8725, -9587, -9325, -6916, -1663, 2285, 4139, 6515, 6756, 7729, 5941, -424, -6407, -10293, -8891, -3065, 3524, 8022, 9919, 9725, 7291, 4366, 47, -4458, -7395, -10619, -10920, -9363, -6212, -1627, 4317, 9783, 11587, 9619, 4075, -788, -4458, -7247, -7128, -4941, -1863, 1737, 5192, 9073, 10869, 7230, 1044, -5563, -10500, -10525, -8829, -7578, -5568, -2163, 2795, 8238, 11833, 11494, 8595, 4747, 214, -2870, -2802, -3249, -5731, -3985, -1252, 1233, 4926, 4611, 2425, -613, -3608, -6825, -8764, -8660, -7059, -2669, 2860, 9354, 13192, 12784, 11605, 8025, 4103, -144, -6207, -9848, -12649, -12482, -10451, -7516, -2655, 2169, 6060, 8260, 7177, 4430, 1411, -1569, -72, 509, -179, -627, -2335, -2278, 564, 2060, 2761, 3227, 810, -454, -1745, -3399, -5486, -6512, -3836, -1228, -766, -211, 1282, 2596, 6195, 8791, 8371, 4202, -1730, -5147, -6519, -4192, -248, 2572, 4151, 6919, 7969, 5072, 2317, -2698, -6492, -6632, -8252, -8617, -7533, -4749, -153, 7598, 16336, 17914, 14564, 6567, -494, -3587, -6608, -8837, -10673, -10349, -6562, -1903, 3747, 8076, 8540, 4855, 435, -4432, -8544, -9316, -8503, -4567, 1529, 8338, 12862, 15178, 13386, 7997, 1131, -4705, -9154, -12803, -15015, -16552, -12234, -4499, 3656, 11033, 13272, 11589, 9560, 5177, 662, -2090, -2827, -3584, -4238, -3209, -1289, 3359, 6201, 7743, 7001, 2743, -3169, -8782, -10317, -10360, -7116, -2315, 172, 2519, 3266, 3714, 5053, 6743, 6989, 2399, -3681, -8275, -7474, -2774, 1003, 3548, 2419, 1840, 1104, -980, -882, -1309, -2964, -2445, -3114, -4261, -1762, -2511, -2646, 991, 4111, 7175, 8040, 4370, 2605, 3706, 4315, 2862, -875, -4090, -7390, -8364, -5780, -2574, 1155, 3894, 4202, 3621, 2263, -51, -4166, -5502, -4078, -3600, -116, 1730, 2787, 8105, 12937, 14222, 10911, 3140, -6484, -13910, -16796, -16068, -10887, -4208, -20, 5361, 10275, 11609, 10689, 6659, 1920, -906, -4645, -7747, -10225, -10032, -3782, 2956, 10433, 12866, 9362, 3158, -4645, -8503, -8405, -7782, -8185, -8091, -5671, -422, 5977, 11329, 12953, 11392, 6186, -213, -7239, -11683, -11195, -8477, -3705, 369, 5106, 8774, 7989, 5366, 2987, 305, -2581, -6198, -10684, -13756, -11168, -6138, 1125, 9498, 12115, 12398, 9369, 3973, 1088, -1466, -4336, -5457, -4907, -4028, -1388, -114, 1149, 2997, 3138, 3050, -765, -5902, -8947, -8698, -5248, 914, 5073, 4961, 4502, 4169, 5535, 8697, 9199, 4611, 910, -3102, -5843, -7568, -10646, -9440, -5682, -2446, 865, 3372, 4496, 5069, 5954, 7229, 7678, 5271, 1173, -3904, -8433, -8802, -5506, -479, 3653, 7061, 6803, 3935, 1208, -1457, -2787, -3551, -5694, -8460, -7501, -6145, -1342, 4674, 9746, 14441, 12389, 5653, -602, -5546, -7100, -6921, -7314, -4584, -1719, 718, 4521, 8275, 8987, 6856, 1509, -5654, -9862, -11693, -11421, -9307, -3384, 5186, 12314, 15232, 13537, 10017, 5785, 931, -3135, -6204, -8820, -10060, -8332, -4193, -232, 3507, 6776, 6699, 5504, 2109, -2957, -5342, -5075, -2618, 550, 2742, 6764, 9197, 7958, 7864, 4564, 137, -4777, -11459, -14029, -12195, -8040, -2430, 2081, 4505, 5605, 5276, 5272, 4181, 2811, 1589, 252, 407, -453, -1752, -3179, -4358, -2911, -1114, 889, 2531, 1766, 222, 1639, 2988, 2326, 1561, -2588, -7041, -7594, -7756, -4201, 1972, 5762, 9425, 10102, 8763, 5827, 1052, -2520, -5671, -7748, -9610, -10283, -7998, -1675, 7828, 12996, 13195, 9344, -323, -6328, -10288, -12775, -10735, -8591, -4026, 1882, 8303, 14352, 16694, 14364, 6706, -1661, -7153, -10854, -13166, -13640, -11038, -4844, 2693, 8398, 11113, 10246, 5163, -303, -2900, -3599, -3624, -4734, -4709, -1868, 3100, 8481, 10115, 8206, 5160, -423, -7455, -11644, -12105, -10312, -6827, -1694, 2558, 6068, 8280, 7960, 7826, 7604, 4204, -813, -7146, -10727, -10326, -5698, 95, 3173, 4746, 4468, 4276, 3980, 3391, 101, -3255, -4751, -4006, -2793, -1615, -3138, -5283, -3641, 322, 5023, 6795, 5552, 1530, 1000, 2838, 3899, 2006, -1731, -5542, -8376, -7463, -3394, 1632, 5670, 6765, 6255, 3854, -165, -4392, -8263, -7697, -6052, -4010, -1750, 932, 3588, 9178, 14413, 13296, 8357, 1653, -5303, -9975, -12241, -12687, -10187, -6005, 238, 5041, 8509, 10089, 8390, 4239, 1476, -1536, -4738, -7366, -9158, -8226, -3508, 3388, 8064, 11267, 9533, 4606, -32, -4317, -5239, -4465, -4470, -5307, -5346, -2063, 2706, 6942, 8588, 8309, 5412, 483, -4755, -9204, -9399, -7291, -1724, 3499, 6573, 8920, 7518, 5600, 4683, 2205, -955, -4066, -7465, -7286, -7037, -6438, -3443, -1576, 2762, 6017, 6517, 5033, 1792, -630, 243, 2485, 2670, 2425, 529, -3198, -4311, -2273, 85, 1239, 463, -1676, -2665, -1368, -1042, -1596, -2148, -2630, -3139, -3133, -994, 2695, 7205, 10050, 10203, 8344, 4903, -565, -6891, -10385, -10529, -9981, -8125, -5047, -1055, 4109, 9161, 10743, 8925, 5759, 1945, -1260, -4630, -6779, -6684, -5507, -2668, 1865, 6447, 9150, 7816, 4801, 3132, 1555, -773, -3630, -6029, -7539, -6726, -4244, -456, 4633, 7038, 6108, 3125, -786, -2958, -3807, -4447, -3422, -1668, 1104, 3390, 4566, 6152, 5275, 5056, 3273, -856, -5667, -9825, -12170, -11963, -7789, -2861, 2370, 5934, 7382, 8635, 9195, 9493, 7737, 2142, -2175, -4185, -5957, -6344, -6151, -5683, -3743, -1154, 100, 2338, 3397, 1940, 1934, 1619, 937, 245, -1846, -2966, -2464, 56, 2111, 3851, 5867, 5937, 4756, 1815, -1794, -4084, -6390, -7452, -7496, -7923, -6077, -2227, 1295, 6266, 11212, 11746, 10078, 5284, -624, -3746, -7120, -8896, -8535, -6876, -4691, -1834, 3436, 8223, 10323, 10486, 5969, -1, -4696, -7818, -8404, -7643, -6297, -4362, -823, 3329, 7951, 9785, 8301, 5361, 686, -2013, -4394, -7043, -6573, -5175, -2634, 1371, 4379, 5989, 4760, 1682, -2476, -6296, -7637, -7732, -6552, -4260, -692, 5407, 10523, 14568, 14058, 9588, 4638, -2144, -7707, -11888, -12405, -11157, -9200, -5809, -2003, 3977, 8297, 9943, 10893, 8555, 4561, -73, -4861, -5325, -3896, -2222, -1222, -950, -1182, -363, 923, 2032, 2521, 1984, -227, -2458, -2590, -2193, -726, -1129, -1778, -1223, -127, 1019, 2557, 4168, 5199, 5093, 4332, 2744, 554, -2647, -7220, -8191, -8038, -6262, -1702, 2221, 5500, 7611, 7461, 6641, 3637, 859, -1723, -5183, -6921, -8184, -6123, -2286, 2282, 7256, 9040, 8537, 5609, 1451, -2257, -4875, -5799, -6178, -5561, -4907, -2866, 944, 3364, 5387, 5964, 4362, 1433, -2055, -4942, -5616, -4528, -2221, 1018, 3975, 6481, 6917, 5823, 2907, -323, -4290, -8442, -9308, -9807, -8923, -6111, -2104, 3203, 9355, 14028, 13847, 11656, 7198, 1655, -3159, -6935, -8253, -8089, -7061, -6473, -3963, -145, 3919, 7306, 7880, 6712, 4279, 979, -1679, -3283, -3602, -3548, -1975, 1133, 3733, 4535, 4095, 2884, 1396, -438, -2404, -4351, -5966, -5597, -4541, -1955, 814, 1981, 1683, 1592, 1264, 2035, 3357, 1913, -55, -612, -1021, -1788, -1719, -2047, -2662, -2457, -1361, 115, 1565, 1401, 1894, 2301, 2596, 2767, 1635, -705, -3214, -5281, -6897, -5942, -2960, -65, 2085, 3530, 3998, 4728, 4094, 2327, 526, -1682, -2928, -3982, -3212, -726, 988, 2703, 3464, 2998, 1752, -1105, -3305, -4388, -4141, -2486, -93, 3474, 6633, 9894, 11389, 9714, 6700, 785, -4982, -9708, -12819, -13583, -12753, -9351, -4753, 1384, 7538, 12574, 14668, 13174, 9539, 2981, -2136, -5825, -8991, -10006, -9343, -6347, -3095, -284, 2178, 3968, 5505, 5180, 3425, 1006, -1476, -3360, -3980, -3372, -1991, -705, 959, 2548, 3615, 3824, 3062, 1490, -1023, -2779, -3329, -3422, -2245, -311, 1077, 2693, 3532, 4007, 2886, 806, -364, -1864, -2186, -2920, -3676, -3597, -2502, -24, 1315, 2319, 2883, 3083, 3809, 3497, 2656, 1312, -563, -2180, -3192, -3580, -2885, -2673, -2833, -2147, -1011, 278, 2099, 3633, 3578, 3276, 2578, 1652, 843, -344, -1198, -1412, -1450, -683, 606, 1472, 1012, -722, -2444, -4376, -5319, -4945, -4191, -3365, -1505, 1020, 4022, 7421, 10194, 9707, 7181, 3671, -352, -3544, -7265, -9542, -10589, -9201, -6717, -3148, 1758, 5208, 8039, 8928, 8566, 6479, 2940, -977, -4846, -7020, -7431, -6231, -3600, -561, 2382, 4159, 5251, 5279, 4183, 2188, -684, -2857, -4288, -4691, -3606, -2564, -1239, 353, 1877, 3337, 3355, 2553, 955, -1093, -2290, -2885, -2688, -1869, -661, 1607, 3419, 3885, 3768, 2640, 874, -1198, -2979, -4343, -4227, -3807, -3483, -1966, -15, 2241, 4140, 4494, 4320, 3514, 2685, 1472, -99, -1074, -1901, -2195, -1826, -801, -2, 135, 282, 215, 460, 726, 87, -750, -1827, -2611, -2566, -1288, 841, 2345, 3157, 3327, 3105, 3077, 2879, 2016, -117, -2161, -3081, -4482, -5878, -7052, -6591, -4768, -1910, 1300, 5119, 7840, 8521, 8530, 6465, 4037, 804, -2442, -4680, -6492, -6767, -6237, -4642, -1727, 1250, 3354, 4647, 4826, 3982, 1962, -160, -2330, -3573, -3394, -2477, -1275, 133, 1881, 3209, 4302, 4284, 3035, 1177, -1395, -3534, -4402, -4410, -3568, -2432, -1023, 287, 1492, 2652, 2778, 2348, 1473, 352, -736, -1909, -2412, -2037, -1208, -254, 730, 2037, 2922, 3675, 3916, 3334, 1976, -116, -1975, -3611, -4246, -4108, -3375, -1418, 397, 1786, 2508, 2580, 2300, 1787, 1415, 783, -78, -717, -1146, -854, -166, 517, 1561, 1979, 1663, 288, -1692, -3165, -4839, -5404, -5095, -4100, -2260, -73, 2810, 5118, 6703, 6981, 6519, 5086, 2047, -848, -3703, -5505, -6437, -6075, -4964, -3694, -1752, 10, 1495, 2755, 3688, 3584, 2729, 1195, -502, -1197, -838, -351, 30, 466, 103, 44, 214, 59, 287, 472, 77, -309, -1067, -1752, -1630, -1276, -978, -490, 150, 953, 1690, 2298, 2606, 2416, 2184, 1575, 717, 132, -612, -1823, -2459, -2318, -1557, -22, 940, 2027, 2569, 2193, 1302, 176, -820, -2156, -3011, -3261, -3044, -1898, -791, 542, 2126, 2768, 3148, 3160, 2570, 1555, 56, -1341, -2217, -2272, -2227, -1944, -1550, -1286, -988, -744, -258, 246, 478, 261, 0, 18, 536, 1231, 1897, 2352, 2713, 2702, 1946, 1326, 257, -1077, -2596, -4032, -4987, -5293, -4422, -2926, -1016, 1254, 3369, 4906, 5729, 6051, 5160, 3298, 993, -1542, -3581, -4961, -4934, -4120, -2484, -263, 1340, 2296, 2294, 1649, 460, -1050, -2433, -3295, -2986, -2270, -1393, 50, 1788, 3386, 4242, 4319, 3532, 1822, -164, -2141, -3879, -4989, -4863, -3536, -2104, 157, 1905, 2791, 3645, 3634, 3043, 2229, 404, -1109, -1973, -2275, -1896, -1219, -321, 745, 1527, 1931, 2382, 2018, 1556, 1068, 321, -569, -1801, -2223, -2329, -2133, -1318, -693, -487, -195, -258, 103, 685, 1223, 1395, 1406, 1572, 1640, 1803, 1592, 440, -430, -945, -1478, -1456, -1693, -1840, -1745, -1594, -1212, -651, -118, 243, 755, 1254, 1920, 2329, 3062, 3437, 3157, 2363, 1157, -512, -2187, -3143, -3991, -4249, -3928, -3026, -1298, 94, 1339, 2516, 2736, 2658, 2426, 1925, 868, -301, -873, -1505, -1495, -1010, -261, 798, 1481, 1647, 1265, 429, -889, -2240, -3056, -3394, -3205, -2621, -1192, 721, 2344, 3596, 4301, 4300, 3694, 1926, 250, -1482, -2959, -3822, -4345, -3762, -2375, -237, 1640, 3223, 4127, 3769, 2717, 845, -1091, -2564, -3578, -3854, -3424, -2259, -581, 1048, 2589, 3551, 4020, 3837, 2962, 1610, 106, -1166, -2011, -2553, -2717, -2203, -1730, -1439, -874, -120, 588, 1075, 1199, 820, 406, 198, 217, 522, 1037, 1523, 1940, 1975, 1816, 1463, 216, -1062, -2321, -3308, -3563, -3418, -2838, -1976, -796, 625, 1832, 2701, 3131, 3068, 2674, 1778, 873, 93, -633, -1284, -1615, -1695, -1473, -866, -190, 95, -28, -616, -1198, -1349, -1338, -927, -680, -188, 574, 1602, 2442, 2829, 2723, 1825, 1103, 155, -739, -1347, -1662, -1901, -2093, -1959, -1694, -1112, -360, 302, 914, 1191, 1282, 1345, 1450, 1221, 610, -88, -539, -626, -836, -912, -1270, -1249, -628, -130, 644, 1289, 1578, 1732, 1228, 392, -581, -1513, -2318, -2958, -2709, -2130, -1032, 235, 1474, 2685, 3259, 3205, 2509, 1548, 233, -932, -1616, -2025, -2147, -1963, -1621, -984, 86, 938, 1524, 1494, 946, -56, -1043, -1619, -1695, -1149, -147, 748, 1792, 2723, 3280, 3231, 2259, 906, -631, -2057, -3133, -3737, -3783, -3239, -2301, -1527, -194, 1224, 2375, 3008, 2832, 2235, 1588, 1048, 597, 312, 182, 125, 59, -48, -254, -560, -769, -1196, -1780, -1988, -2145, -2146, -1531, -659, 560, 1861, 2901, 3401, 3244, 2431, 1259, -38, -958, -1855, -2431, -2650, -2372, -1719, -995, 358, 1455, 2177, 2411, 2079, 1430, 586, -251, -941, -1770, -2331, -2046, -1257, 54, 1101, 1911, 2048, 1897, 1863, 1841, 1551, 569, -228, -982, -1571, -2037, -1838, -1421, -1314, -1138, -722, -104, 555, 1208, 1363, 1085, 844, 600, 275, 82, 88, -47, 32, 65, 137, 592, 858, 611, 15, -738, -1630, -2235, -2822, -2779, -2250, -1431, -328, 947, 2188, 2970, 3641, 3772, 3107, 2139, 821, -830, -2716, -3802, -4027, -3627, -2563, -1390, -346, 185, 841, 1355, 1469, 1333, 908, 467, 18, -118, 93, 448, 843, 1004, 790, 524, 165, -218, -684, -1423, -1949, -1986, -1502, -881, -146, 801, 1352, 1558, 1681, 1630, 1331, 897, 242, -487, -1048, -1291, -1168, -570, 151, 742, 1186, 1551, 1456, 1052, 758, 325, -293, -1020, -1888, -2268, -2037, -1106, -23, 884, 1534, 1804, 2021, 1859, 1410, 594, -78, -831, -1434, -1576, -1467, -874, -323, 86, 494, 578, 520, 188, -385, -925, -1525, -1926, -2174, -1823, -736, 434, 1772, 2826, 3390, 3747, 3202, 2064, 305, -1432, -2762, -3517, -3778, -3619, -2937, -1902, -602, 445, 1333, 2148, 2528, 2532, 2146, 1404, 580, -84, -369, -441, -200, -174, -152, -275, -515, -761, -834, -856, -826, -791, -804, -505, -25, 689, 1319, 1640, 1602, 1296, 917, 597, 290, 32, -350, -533, -633, -700, -696, -819, -725, -524, -384, -173, 230, 454, 516, 693, 746, 720, 496, 126, -244, -533, -662, -536, -381, -153, 8, 236, 422, 399, 375, 218, -206, -661, -1001, -995, -781, -536, -212, 40, 183, 314, 298, 240, 119, -99, -293, -320, 57, 565, 969, 1230, 1210, 1040, 649, 29, -692, -1338, -1875, -2255, -2173, -1856, -1200, -287, 580, 1442, 2049, 2505, 2551, 2134, 1364, 69, -1090, -1864, -2126, -1983, -1576, -850, -221, 500, 919, 1087, 1039, 696, 360, -100, -480, -586, -519, -132, 375, 786, 1046, 1113, 1094, 891, 430, -112, -655, -1113, -1464, -1557, -1386, -804, -38, 511, 894, 1040, 990, 901, 811, 560, 99, -239, -571, -816, -889, -719, -334, -38, 114, 229, 395, 363, 260, 69, -125, -349, -435, -523, -497, -460, -241, -38, 228, 416, 293, 186, 137, 83, 34, 90, 184, 291, 263, 195, 128, 47, -95, -283, -338, -496, -539, -458, -403, -325, -325, -85, 162, 546, 906, 1017, 1051, 619, 297, 35, -244, -460, -732, -936, -1070, -895, -648, -228, 146, 460, 596, 581, 647, 695, 732, 608, 395, 162, -97, -362, -588, -662, -618, -450, -190, 119, 479, 749, 725, 483, 220, 67, -51, -185, -262, -305, -151, 73, 425, 711, 829, 755, 365, -97, -528, -850, -1016, -1084, -938, -686, -152, 395, 917, 1275, 1254, 1048, 678, 209, -276, -811, -1104, -1299, -1283, -1003, -626, -281, -78, 245, 514, 692, 804, 660, 404, 159, 112, 146, 66, -23, -352, -714, -1009, -962, -659, -201, 223, 460, 591, 749, 766, 667, 492, 126, -240, -620, -861, -918, -890, -602, -348, -90, 297, 772, 1127, 1154, 1012, 593, 139, -233, -463, -496, -435, -345, -255, -169, -102, 36, 198, 338, 378, 263, 263, 333, 356, 249, 79, -58, -116, -50, -24, -77, -89, -36, -32, -10, 52, -16, -220, -631, -856, -935, -599, -127, 244, 435, 252, 127, 107, 272, 595, 729, 611, 516, 294, -30, -258, -656, -1098, -1431, -1676, -1583, -1099, -344, 514, 1376, 2066, 2458, 2508, 2267, 1660, 440, -689, -1583, -2049, -2145, -1974, -1466, -1093, -436, 51, 572, 896, 987, 1246, 751, 522, 247, -329, -370, -481, -632, -567, -192, 168, 552, 580, -91, -698, -850, -511, -271, -223, 10, 439, 723, 901, 590, 509, 489, 96, -98, -219, -452, -641, -441, -327, -88, 351, 681, 944, 1007, 661, 263, -184, -506, -638, -868, -816, -853, -692, -317, 238, 930, 1124, 962, 640, 402, 240, 246, 284, 175, 52, -156, -99, -88, -175, -327, -678, -863, -960, -1013, -664, -69, 223, 206, 279, 454, 881, 1064, 759, 225, -121, -514, -856, -811, -577, -141, 246, 380, 288, 37, -372, -802, -1186, -1485, -1567, -1357, -545, 549, 1476, 2130, 2741, 2680, 2015, 1033, -57, -816, -1569, -2170, -2281, -1881, -1268, -838, -51, 796, 1364, 1510, 1239, 819, 343, -64, -395, -492, -547, -470, -147, 330, 536, 532, 392, 21, -389, -799, -863, -660, -513, -337, -88, 146, 517, 856, 894, 501, 54, -276, -578, -570, -131, 511, 661, 521, 410, 348, 422, 472, 106, -582, -1243, -1635, -1456, -856, -449, 64, 629, 1118, 1505, 1534, 1213, 704, 145, -557, -1028, -1075, -834, -452, 94, 744, 1150, 1028, 301, -454, -935, -1173, -1278, -1165, -856, -645, -29, 733, 1482, 1952, 1790, 1233, 424, -264, -896, -1169, -1047, -790, -577, -479, -38, 592, 913, 735, 295, -143, -589, -1014, -1153, -920, -119, 925, 1749, 2078, 1996, 1621, 1023, 321, -378, -1053, -1427, -1693, -1515, -1098, -597, 29, 524, 749, 589, 327, 216, 260, 293, 357, 372, 466, 665, 731, 568, -79, -620, -807, -798, -663, -446, -460, -549, -397, 83, 436, 660, 589, 108, -403, -737, -631, 73, 826, 1298, 1574, 1715, 1564, 1054, 249, -828, -1937, -2787, -2859, -2337, -1820, -1018, -168, 1027, 2194, 2995, 2984, 2054, 868, -307, -1055, -1652, -1885, -1735, -1545, -1003, -339, 343, 1148, 1597, 1666, 1268, 535, -346, -1169, -1551, -1645, -1423, -891, -9, 1048, 1445, 1251, 737, -21, -136, 19, 107, 119, -17, -205, -232, -138, -200, -573, -1002, -1253, -1186, -588, 6, 579, 994, 1314, 1619, 1492, 1082, 487, -23, -524, -974, -1159, -1205, -876, -351, 379, 981, 1061, 645, 54, -247, -415, -685, -893, -980, -869, -179, 909, 1933, 2159, 1641, 843, -59, -704, -1203, -1327, -1281, -1015, -653, -235, 313, 785, 1074, 782, 75, -480, -739, -668, -307, -33, 194, 390, 689, 1068, 1314, 1407, 963, 95, -719, -1401, -1807, -2169, -2218, -1828, -857, 466, 1447, 2049, 2075, 1773, 1463, 1050, 573, -261, -907, -1297, -1464, -1306, -1083, -788, -487, -36, 292, 366, 499, 714, 784, 671, 476, 397, 340, 253, 58, -309, -565, -803, -796, -633, -334, -15, 284, 692, 855, 851, 552, -169, -742, -1079, -1307, -1159, -663, -144, 558, 1351, 1758, 1702, 1265, 489, -366, -1070, -1473, -1570, -1238, -766, -155, 650, 1332, 1570, 1252, 539, -275, -766, -1006, -1105, -1040, -840, -402, 336, 1003, 1580, 1679, 1013, 130, -490, -772, -699, -563, -563, -510, -284, 66, 367, 608, 339, -88, -322, -557, -627, -529, -191, 273, 897, 1448, 1284, 1025, 510, -34, -442, -902, -1434, -1764, -1844, -1883, -1309, -427, 428, 1429, 1867, 1789, 1476, 1131, 1049, 896, 371, -230, -645, -921, -902, -835, -922, -1028, -1063, -967, -642, -156, 312, 946, 1398, 1614, 1521, 998, 409, -151, -462, -716, -912, -713, -343, 90, 443, 472, 293, -107, -567, -886, -1015, -899, -636, -286, 262, 829, 1612, 2165, 2274, 1500, 379, -517, -1226, -1430, -1504, -1519, -1241, -628, 182, 985, 1490, 1526, 949, 204, -480, -807, -802, -710, -397, 70, 536, 806, 806, 427, -34, -305, -408, -545, -741, -775, -410, 178, 726, 1118, 1079, 582, 154, -121, -444, -692, -854, -956, -862, -329, 314, 904, 1081, 900, 701, 445, 312, 258, 199, -98, -497, -642, -660, -651, -795, -957, -1088, -974, -487, 336, 1072, 1737, 2450, 2448, 1883, 763, -502, -1380, -2197, -2370, -2207, -1778, -951, -20, 920, 1423, 1626, 1243, 537, 96, -411, -686, -646, -541, -93, 504, 972, 1128, 1053, 664, 15, -634, -1243, -1562, -1672, -1607, -1183, -552, 235, 964, 1528, 1652, 1326, 1034, 583, 63, -287, -478, -417, -305, -412, -423, -518, -795, -811, -774, -624, -363, -60, 202, 561, 917, 1110, 1138, 659, 136, -234, -634, -699, -531, -351, -157, 31, -11, 2, -163, -376, -288, -310, -271, -194, 56, 430, 754, 1111, 1149, 883, 241, -565, -1218, -1679, -1493, -930, -462, 228, 960, 1571, 1882, 1900, 1433, 525, -489, -1414, -1881, -1958, -1816, -1247, -432, 575, 1371, 1788, 1684, 1218, 714, 126, -285, -582, -834, -822, -615, -402, -186, 106, 92, 105, 77, -87, -181, -327, -447, -337, 50, 455, 836, 736, 374, 304, 310, 228, 218, 126, -239, -371, -351, -325, -161, -341, -680, -884, -974, -752, -139, 415, 1111, 1730, 1862, 1777, 1442, 662, -164, -757, -1291, -1474, -1527, -1297, -795, -141, 612, 1229, 1358, 984, 310, -122, -231, -192, -118, -112, -219, 79, 536, 795, 863, 424, -183, -786, -1215, -1292, -1110, -645, -242, 359, 932, 1259, 1243, 660, 32, -421, -705, -889, -1108, -1203, -843, -124, 514, 904, 1041, 893, 687, 395, 204, 108, -257, -480, -733, -877, -818, -735, -700, -463, -131, 208, 553, 618, 904, 1264, 1342, 1142, 470, -279, -912, -1389, -1422, -1380, -859, 317, 1554, 2656, 2871, 2441, 553, -2258, -4405, -5771, -5465, -4669, -2175, 2482, 8264, 12637, 12737, 11004, 6209, -29, -5162, -9431, -11474, -12168, -11241, -9686, -6303, -1213, 4472, 10036, 11075, 10406, 9067, 5645, 2702, 319, -1910, -3114, -2680, -2532, -2860, -3480, -3886, -3244, -2095, -653, 332, 719, 329, 246, 767, 2610, 4864, 4216, 1585, -1179, -3080, -2440, -1083, 87, 660, 466, 1370, 1257, 563, 141, -691, -1017, -2026, -3045, -3023, -2343, -1494, 162, 2030, 3020, 2422, -58, -2629, -3527, -2609, -1394, -408, 233, 1639, 3861, 4859, 5393, 3552, 69, -2698, -5785, -7231, -7368, -6597, -4892, -2259, 1397, 4893, 7761, 7863, 5589, 3899, 2794, 2019, 456, -1621, -3076, -2580, -792, 397, 2026, 1349, -136, -1189, -3067, -4088, -5334, -6354, -5007, -1688, 2288, 5854, 7437, 7398, 7361, 7484, 5948, 3846, 518, -3716, -5820, -6119, -6023, -5272, -4517, -5475, -4380, -2912, -1359, 1714, 3589, 5374, 7083, 8332, 7692, 5562, 1572, -2987, -4687, -6811, -7971, -7721, -6411, -3400, -188, 4406, 7310, 7544, 5135, 594, -2495, -3635, -4325, -4288, -4177, -3361, 319, 5309, 9780, 12019, 9880, 4627, -95, -4725, -8099, -9058, -8875, -7266, -3805, 871, 4326, 6751, 6503, 4503, 3052, 876, -1736, -4245, -6459, -5993, -2647, 1381, 5292, 6414, 5449, 4137, 2122, -722, -3092, -3796, -3642, -3523, -3898, -3332, -870, -30, 251, 783, -600, -2006, -2936, -2619, 795, 4943, 7283, 9141, 7459, 3781, 861, -2891, -5482, -7051, -7583, -6725, -4887, -1797, 261, 2584, 3961, 3975, 4193, 3704, 2436, 312, -1468, -1157, 2437, 5724, 6649, 5184, 1621, -2455, -4870, -6834, -8482, -8565, -7582, -5553, -2532, 1986, 6002, 9087, 10507, 8934, 6106, 2201, -1728, -3983, -5174, -4965, -3557, -1503, -30, 560, 1456, 1799, 1626, 831, -948, -3184, -5449, -5722, -3195, 646, 4642, 5260, 3820, 2898, 1695, 1429, 640, -590, -1621, -2245, -2624, -2900, -2219, -1051, 544, 1156, 618, 604, 1303, 1118, 1521, 2545, 2257, 2740, 1712, -1158, -2765, -4766, -5111, -3925, -3098, -306, 2546, 5477, 8101, 8627, 7137, 4005, 179, -4352, -7368, -9428, -10752, -9530, -6471, -723, 4727, 7961, 8769, 7626, 6130, 3911, 1692, -1054, -3355, -4351, -4064, -2962, -545, 1996, 2046, 792, -839, -2611, -3995, -5065, -5259, -3923, -807, 3067, 6109, 7848, 7859, 6569, 4604, 1128, -3006, -5820, -7352, -6744, -3819, -1526, 1139, 3518, 2493, 1473, -372, -3130, -4220, -3426, -1365, 875, 3596, 5377, 7510, 7554, 5407, 2358, -2046, -6258, -9067, -9766, -9227, -6108, -1135, 3781, 7102, 7976, 6422, 4041, 1810, -820, -2945, -4401, -5117, -4156, -1107, 2380, 5714, 6179, 3846, 837, -3095, -5344, -5346, -3640, -1604, -594, 1633, 3446, 6067, 7679, 4935, 2205, -1200, -4873, -7225, -8475, -6285, -2021, 2080, 5067, 7265, 8560, 7581, 5724, 3055, -558, -4702, -7564, -8968, -8404, -5442, -2159, 2029, 3778, 3054, 2404, 990, -225, -744, -1179, 21, 2625, 3636, 2907, 1750, -734, -3013, -4774, -5168, -4433, -4389, -2976, -1462, 617, 3696, 5440, 4817, 2307, -492, -2498, -3322, -2492, -151, 2699, 5197, 6684, 6598, 4114, -213, -3939, -6432, -8590, -9217, -8309, -7305, -4643, 1076, 8056, 14496, 16989, 13420, 7161, 962, -3691, -6235, -7700, -8454, -7905, -5391, -2249, 1876, 6153, 8514, 7845, 4204, -12, -3812, -5686, -5691, -4230, -1221, 2177, 4745, 6197, 4953, 2217, -28, -3058, -4754, -5596, -6409, -6564, -3795, 1364, 5332, 8909, 7838, 3663, -224, -4872, -6333, -5443, -3831, -1456, 1163, 2799, 2995, 3620, 2970, 1149, 98, -1803, -3628, -3803, -2953, -389, 2939, 5555, 6552, 4862, 1841, -2235, -5228, -6409, -7371, -6351, -5362, -3014, 1477, 6350, 11419, 12432, 9672, 4264, -1559, -5636, -7591, -6911, -5250, -3927, -3226, -988, 1719, 4018, 5046, 3458, 1821, -150, -2659, -2877, -575, 2091, 4215, 6225, 6977, 5803, 2980, -1409, -5702, -9203, -10637, -9510, -6158, -3591, -6, 4969, 8414, 11381, 10406, 8017, 4616, -374, -2621, -3256, -3715, -3923, -3986, -4403, -3584, -1904, -1016, 706, 994, 1114, 1566, 1490, 1388, 1869, 2953, 3150, 3949, 834, -2810, -4602, -5841, -4261, -914, 1330, 2395, 3358, 2176, 797, -751, -2874, -3525, -3907, -4755, -4037, -2363, -150, 3746, 7323, 9079, 8125, 3154, -2993, -8109, -10309, -9532, -7426, -4923, -1567, 3219, 7756, 10940, 11818, 11320, 7119, 209, -4777, -9612, -12742, -12139, -10116, -5522, -40, 4960, 9086, 10704, 10240, 9088, 6919, 2313, -2387, -6048, -8592, -8319, -5578, -1582, 2749, 4453, 3109, 949, -819, -2032, -2565, -2284, -2258, -1673, 942, 3740, 5320, 6816, 6062, 3772, 917, -2801, -5104, -6172, -6422, -5907, -3389, -446, 950, 2552, 1960, 534, 648, 398, 853, 1174, 848, 1088, 1062, 1417, 2454, 2230, -291, -3629, -5374, -6448, -6020, -4126, -603, 4187, 7777, 9995, 8419, 4340, -514, -5431, -7841, -7554, -6275, -4788, -3774, -1584, 2416, 7175, 10327, 8218, 3457, -1389, -4933, -6309, -5612, -2978, -273, 2238, 4609, 4995, 3698, 1503, -1598, -4453, -6516, -7515, -8237, -6986, -4738, 371, 8708, 13539, 15370, 11961, 5787, 2154, -1399, -3486, -6133, -8630, -10073, -10136, -7534, -3346, 783, 2814, 5078, 6111, 5854, 5338, 4412, 2818, 2804, 3980, 3795, 2367, -1712, -6445, -8269, -8296, -5748, -940, 2637, 4954, 4917, 4246, 3401, 1627, -180, -1940, -3596, -4955, -4832, -3102, -411, 5547, 10843, 12398, 10090, 2341, -4729, -9018, -11001, -10467, -8727, -6573, -3376, 1810, 7831, 11472, 12795, 10177, 4954, -941, -6937, -10674, -12831, -11013, -6288, -436, 4466, 7936, 10636, 10990, 9343, 7001, 3174, -2291, -7116, -9832, -11379, -10728, -7266, -3970, 344, 3963, 6047, 7181, 5998, 4009, 3984, 4810, 4142, 3204, 427, -2117, -2383, -2892, -3347, -2936, -3678, -3826, -3975, -4622, -3326, -1772, 1360, 4882, 5054, 3432, 2260, 732, 605, 2264, 3603, 4299, 3909, 2835, 235, -2430, -4923, -7794, -7835, -7233, -6519, -5559, -4151, -888, 3153, 8295, 11652, 12144, 8958, 2950, -2243, -5305, -5433, -4310, -4676, -5141, -4021, -849, 2942, 5489, 6457, 4782, 1841, -1490, -4479, -6157, -6981, -5936, -3600, 759, 4817, 7100, 7518, 5043, 3336, 1319, -628, -2758, -4800, -5069, -3377, -591, 2490, 5127, 5162, 3204, 700, -2215, -4793, -6743, -8300, -7298, -4510, -1088, 1223, 2743, 3694, 5985, 8688, 9811, 8093, 4266, 363, -2820, -4454, -5507, -6646, -8405, -9807, -10195, -8236, -4541, 309, 5756, 10954, 14289, 13801, 10138, 5213, 111, -2677, -5385, -6958, -7379, -6979, -4009, -1201, 2513, 5477, 5145, 2014, -1020, -4298, -5408, -5952, -4896, -1938, 1635, 5618, 8985, 9855, 7904, 6081, 2548, -1047, -5200, -8640, -9711, -9248, -7072, -4048, -595, 3824, 7102, 7819, 5522, 3384, 1143, -1499, -3169, -5575, -6517, -5566, -3101, 160, 3659, 4989, 4708, 3453, 2252, 1343, 319, -440, -927, -698, -1125, -860, -822, -3391, -5279, -5285, -4138, -1981, 806, 2885, 3477, 4819, 6327, 8226, 8608, 5605, 1636, -1964, -5143, -5684, -5247, -3450, -425, -99, -1118, -1910, -3695, -3858, -1770, -273, 857, 1933, 4441, 6221, 9863, 12232, 11151, 7246, -1491, -8258, -11248, -12173, -11969, -10411, -6106, -1508, 3804, 8114, 9321, 8595, 5096, 2303, 185, -1527, -2728, -4603, -5318, -4134, 1316, 7184, 8473, 7592, 3697, -1109, -4071, -6815, -8150, -8491, -8921, -6923, -1795, 3057, 8746, 11552, 9993, 6839, 2242, -2602, -5761, -7215, -6725, -4520, -2592, -961, 137, 2029, 4667, 6503, 6681, 4502, 130, -4268, -6163, -6788, -5474, -2548, -1657, -2435, -3206, -2476, -306, 3339, 6908, 8425, 9538, 8705, 5976, 2797, -2097, -5647, -7994, -10107, -10456, -9496, -5934, -2426, 3042, 7715, 10184, 9368, 3923, 641, -1163, -601, 953, 1258, 1018, 621, 981, 2769, 4429, 4472, 796, -4695, -9065, -12205, -11807, -9900, -5833, 557, 7432, 13258, 14659, 11289, 6885, 3855, 1457, -2027, -5455, -8531, -9951, -9126, -6213, -711, 3570, 4672, 4145, 1375, -1888, -3879, -5531, -5310, -2787, 1332, 4216, 6589, 7502, 6769, 6707, 4148, 191, -4505, -8645, -10502, -9813, -4975, -126, 4243, 6741, 5568, 4785, 3388, 1705, -703, -2980, -4459, -3797, -1875, -646, 1398, 2431, 3233, 3040, 2725, 3841, 4762, 4615, 3450, 2182, -520, -3050, -5314, -7428, -8465, -9049, -8406, -5240, -938, 4538, 10101, 10825, 10576, 9322, 6174, 3536, 67, -3910, -7777, -9895, -8173, -3262, 2111, 5517, 4695, 1432, -3634, -6889, -8123, -7073, -4435, -3159, -1848, -396, 4225, 10785, 16996, 17332, 10767, 2928, -4160, -9433, -13499, -15172, -14050, -10640, -5267, -726, 4212, 8030, 8497, 9513, 7488, 4250, 1182, -3162, -5678, -4575, -123, 4007, 4742, 3350, 1007, -1550, -2034, -2815, -3473, -4305, -3619, -2374, -975, 1085, 197, 478, 1441, 2305, 2629, 99, -2814, -2183, 1223, 4516, 5990, 3960, 235, -1432, -2525, -2526, -570, 679, -72, -1445, -2058, -1666, -2102, -4621, -5199, -4826, -3631, -1406, 177, 1407, 5805, 14090, 18424, 16052, 8611, -443, -7115, -10323, -11469, -10734, -9017, -7901, -4057, 698, 3649, 6782, 6468, 4138, 1069, -2574, -3695, -4047, -2764, 914, 5708, 9965, 10742, 8902, 4642, -369, -5093, -8705, -11340, -13238, -13315, -12472, -7646, -1859, 5214, 12250, 13762, 13909, 11590, 6994, 1608, -3896, -6052, -7267, -7430, -6431, -5466, -3139, -295, 4050, 7863, 8993, 6140, 360, -3864, -6111, -4881, -3763, -4533, -4941, -5516, -1068, 4114, 8727, 13817, 13714, 10009, 3674, -2553, -7956, -11388, -11279, -9229, -5152, -512, 1690, 4281, 6792, 7155, 7868, 3960, -2525, -7235, -8960, -7773, -4416, 1151, 7118, 11956, 13198, 11230, 7943, 2183, -2988, -6661, -10615, -11526, -12315, -13291, -11597, -4934, 3824, 11954, 14646, 10511, 8435, 4949, 3412, 4474, 2990, 1268, -2479, -4777, -6591, -7989, -5850, -3398, -1353, 355, -413, -1584, -2353, -1521, 2246, 5125, 5950, 1851, -2662, -3299, -142, 6087, 9331, 6420, 2095, -1307, -5641, -7129, -9732, -11614, -9850, -7689, -2011, 3889, 6987, 9476, 11179, 11286, 8078, 614, -8024, -13897, -13679, -9866, -2599, 4860, 8064, 11346, 12286, 11560, 9548, 2041, -5556, -13691, -16552, -15057, -13286, -7425, -519, 9640, 15432, 16845, 14345, 5847, 225, -3359, -5124, -3336, -1847, -2369, -1813, 624, 4656, 8416, 7179, 432, -6569, -10923, -11908, -9841, -6510, -3023, 1349, 5543, 8452, 9863, 9388, 9040, 8871, 6436, 2509, -1537, -8189, -10796, -10471, -9583, -7498, -7802, -7304, -6465, -2155, 3211, 8809, 11928, 11225, 8703, 4360, 1515, -3533, -6262, -7306, -8296, -5791, -2354, 2065, 7695, 10142, 8051, 3572, -4029, -9747, -13713, -14179, -10211, -4414, 2530, 8992, 14472, 15723, 16215, 10821, 1059, -4328, -9171, -11736, -11935, -11588, -8119, -242, 8175, 13332, 13706, 8534, 1531, -4366, -9842, -11721, -10255, -8321, -4705, 364, 5765, 11337, 13567, 12046, 8770, 5242, 565, -5325, -10155, -11324, -7641, -3871, -1463, -1986, -3971, -3569, -2047, 1192, 4516, 4092, 1900, 3470, 5907, 7513, 8528, 5723, 2258, -901, -2590, -1991, -3655, -5118, -3946, -2300, -2945, -3784, -6536, -8943, -8566, -4900, 2072, 6990, 11074, 12867, 13908, 12878, 9386, 4339, -3728, -12036, -17285, -16889, -13143, -7812, -2053, 4784, 10778, 12948, 11639, 5329, -1796, -5892, -8317, -8984, -8707, -7230, -2042, 5714, 12663, 17187, 14413, 6803, -1765, -7639, -8431, -8034, -9069, -8879, -6449, -3414, 4536, 9966, 9768, 8115, 5104, 1435, -2812, -5965, -8368, -6927, -1858, 2816, 6926, 9158, 8191, 6896, 6154, 4816, 2416, -3355, -8725, -12754, -12379, -8810, -6632, -3383, -838, 3479, 7703, 11053, 11761, 10797, 9977, 7208, 4445, -2151, -7919, -11143, -13657, -12325, -7784, -3032, -625, 3938, 6310, 5038, 3713, 93, -2278, -2795, -5171, -4354, -215, 3305, 9822, 13031, 10580, 6023, -2994, -10785, -14295, -15047, -12519, -10338, -7566, -1904, 5827, 11256, 15510, 15896, 9958, 4909, -3217, -8873, -10595, -10550, -6775, -2960, 2538, 6380, 8810, 9968, 6665, 4210, 1171, -4660, -7820, -10074, -11136, -8744, -4440, 2692, 8773, 9735, 9560, 8205, 4614, 1750, 8, -2200, -2287, -2607, -2204, -526, -36, 3124, 4452, 4327, 2410, -2016, -6519, -9402, -9513, -5526, -1681, -1899, -1008, 1264, 5408, 10805, 14532, 14174, 11028, 5554, -949, -6351, -13010, -15135, -14322, -12376, -7687, -2279, 3613, 8586, 14764, 15966, 13568, 7309, -3209, -7451, -9665, -9489, -6721, -2693, 3023, 6987, 8635, 9279, 7684, 2695, -1970, -7347, -11594, -11681, -10061, -7789, -3088, 3285, 10422, 14753, 11420, 6445, 1380, -3828, -7195, -8835, -7935, -6905, -4843, -3397, -1356, 3366, 5566, 5687, 1727, -2669, -4178, -5762, -6091, -5237, -1858, 1742, 299, -2120, -2753, -522, 3922, 6709, 8204, 6937, 4799, 462, -2082, -3084, -5328, -6509, -8025, -8994, -7078, -2334, 2925, 10801, 13988, 12878, 6841, -1275, -4597, -5473, -4321, -2545, 87, 3426, 7925, 10143, 7985, 5209, -1187, -8774, -11657, -15697, -14994, -11644, -5230, 6335, 15518, 22269, 21006, 13496, 5092, -2673, -7353, -9941, -13265, -14351, -13067, -7070, 1515, 9858, 16201, 14205, 7482, 779, -7946, -11860, -11446, -9003, -3414, 1574, 5116, 6876, 10448, 10215, 7685, 4083, -1695, -6834, -11191, -12832, -10538, -4213, 1155, 5054, 4206, 1304, 52, 919, 4620, 4781, 2471, -70, -1285, -3203, -2477, -1759, -3601, -3213, -3650, -936, 1408, 2461, 5045, 6698, 6718, 4925, -2524, -10762, -14662, -14969, -9795, -1995, 5602, 10553, 13377, 13609, 14026, 12836, 3723, -4633, -12280, -17811, -14598, -10824, -4355, 3940, 9190, 11775, 11386, 8290, 1502, -4755, -8247, -6690, -3461, -2022, -2188, -960, 7297, 15870, 18460, 12605, 1955, -7282, -13850, -14534, -12841, -7583, -2542, 1987, 5783, 7289, 10268, 9106, 8408, 3685, -1390, -3649, -9181, -10728, -6281, 1590, 7008, 8678, 5857, 1949, -982, -3230, -3528, -3664, -5848, -7893, -8310, -4403, 2861, 6057, 6706, 5786, 3923, 2917, 1077, -2301, -4289, -2510, 325, 1817, 372, -3930, -5171, -4224, 98, 5058, 8182, 7947, 2726, -1158, -3403, -3779, -4610, -4464, -5901, -6126, -1801, 2995, 9579, 16641, 17463, 12516, 4185, -6355, -12313, -14595, -14850, -11726, -8389, -6911, -1934, 5618, 11726, 17177, 15699, 7879, 830, -7105, -10341, -10335, -9232, -4350, 985, 8376, 8675, 7876, 5631, 2389, 221, -4442, -7788, -11755, -13611, -12316, -5345, 1152, 7894, 10695, 10349, 9133, 4098, 1724, -1010, -3723, -4763, -5271, -4986, -4900, -4646, -1294, 1842, 4480, 5643, 3132, 394, -1975, -3136, -2108, 1856, 2227, -1784, -4942, -7033, -3951, 2164, 7905, 8639, 7235, 5053, 2875, -310, -6304, -8650, -7507, -6040, -2834, -1161, -1279, 3361, 7409, 10861, 9994, 3061, -3470, -8430, -11823, -9301, -2108, 2625, 5880, 9601, 12509, 12907, 7144, -1422, -8217, -14148, -17521, -17294, -12002, -5345, 4619, 14120, 21036, 22370, 12775, 1907, -8094, -15700, -12548, -8574, -5471, -1818, 496, 6464, 11028, 13205, 10462, 3561, -4519, -10837, -13809, -12086, -9514, -4038, 2848, 8370, 13606, 11942, 8061, 3938, 859, -964, -3204, -7600, -8789, -6716, -5226, -1077, 2516, 4456, 3832, 903, 910, 936, -160, 689, 1259, 1641, 2444, -2064, -7227, -6931, -4822, 762, 6173, 7382, 9482, 8411, 3777, 1499, -2336, -4846, -8437, -13272, -14742, -11624, -4305, 5068, 15589, 20881, 19374, 12921, 1382, -7390, -11508, -14578, -13738, -10205, -3664, 4296, 10519, 13078, 15509, 12821, 2432, -7698, -14839, -18880, -15062, -8202, -554, 8051, 13791, 16680, 15591, 10631, 3396, -1204, -7807, -12975, -15109, -14376, -9296, 209, 6931, 11733, 13014, 8118, 4185, -2240, -5511, -7543, -6155, -2484, -1111, 925, 1511, 3729, 5412, 4313, 5124, 3227, 169, -3689, -8420, -7683, -3166, 144, 1561, -1123, -4923, -3724, -1355, 2582, 6431, 5690, 4107, 2034, -762, -105, -1294, -5365, -5829, -5039, -2956, -246, 3153, 7378, 10455, 10221, 4240, -3979, -12421, -16236, -16507, -12715, -4052, 5047, 11453, 16030, 18261, 17034, 13427, 2546, -7751, -14530, -18634, -19282, -15453, -7214, 1839, 10697, 14880, 15336, 13065, 4014, -3441, -7339, -8319, -6088, -6352, -5436, -1993, 6725, 15015, 18571, 14092, 3741, -3991, -11244, -12840, -9988, -7914, -4963, -2649, -529, 1457, 5132, 8052, 9302, 9442, 5595, 1746, -3127, -6788, -6348, -3811, -1736, -86, -412, -2199, -2343, 587, 3594, 4432, 2412, -1113, -2914, -5597, -3337, -2210, -3184, -2573, -3808, -1865, 550, 4322, 9612, 11834, 10590, 5346, -1587, -9073, -12533, -12191, -8859, -965, 3417, 4311, 4313, 3097, 2555, 1789, -564, -3113, -6688, -8034, -6105, 144, 9487, 15156, 18000, 15010, 8148, -1603, -11794, -15546, -16538, -14244, -10346, -6280, -348, 6509, 13546, 18874, 17211, 8702, -76, -7455, -11032, -10106, -5088, 212, 3655, 6107, 6659, 5320, 4017, 2182, -401, -3611, -7984, -10157, -11172, -8205, -2733, 4282, 9107, 10776, 10094, 6759, 3809, 1068, -653, -2972, -4103, -4456, -4323, -6668, -6310, -2960, 733, 3825, 3737, 1882, -131, -427, -1802, -201, -411, -4202, -7426, -8783, -6612, -702, 6523, 13934, 19173, 17224, 10915, -559, -12291, -16855, -16725, -14433, -11878, -8761, -5396, 2487, 12027, 16078, 18492, 13202, 3837, -3566, -11499, -13928, -11175, -4247, 2307, 8286, 12581, 12668, 10823, 4426, -5171, -12263, -15139, -15620, -13085, -10980, -4210, 4338, 15084, 24038, 18080, 10015, 1946, -4512, -5210, -5874, -3717, -3302, -2345, 554, 979, 2322, 1004, 920, 531, -888, -2928, -5638, -6357, -4405, 1981, 9774, 9892, 4704, 1140, -1631, 185, 3236, 6002, 4932, 397, -3519, -5506, -6051, -6915, -6547, -5662, -4478, -1163, 1562, 3548, 5880, 8191, 10181, 5877, -686, -7208, -11738, -7904, -1570, 3669, 7301, 9884, 9993, 5701, 2005, -4342, -9894, -14917, -19260, -18904, -14590, -6127, 6413, 19532, 26498, 26706, 17972, 5213, -6358, -13004, -14280, -13719, -11100, -6822, 167, 5980, 10491, 13339, 11918, 7060, -746, -9174, -14391, -13370, -10125, -1057, 7346, 11348, 13363, 8631, 5020, 4117, 3792, 2852, -2020, -6981, -9088, -8121, -4187, -2372, -546, -2376, -4868, -2966, 510, 4925, 7206, 7896, 9433, 7698, 3364, -1664, -8373, -9906, -9063, -5516, -1318, -482, 2682, 6432, 7741, 8628, 3772, -4283, -11660, -17658, -15805, -10699, -3053, 6376, 15262, 19873, 18754, 13481, 3185, -5724, -9878, -12700, -13607, -14099, -12418, -5544, 4695, 15193, 19060, 13840, 2124, -8047, -13292, -13130, -9264, -4435, 323, 5507, 11473, 14428, 15735, 13335, 6480, -1759, -9635, -16051, -18269, -15571, -10251, -1364, 6647, 10196, 9745, 4836, 2973, 1989, 2336, 3495, 234, -3394, -6007, -6473, -3158, 2369, 5155, 3840, 423, 36, 564, -46, -413, -349, -105, -828, -3542, -7922, -8777, -5626, -792, 7068, 11948, 11115, 9630, 5693, 3392, 2440, -3208, -10213, -15564, -16318, -10130, -4011, 4863, 14313, 16790, 13902, 5823, -4165, -11562, -15556, -14974, -10637, -4408, 1981, 7626, 14116, 18178, 20554, 16397, 3818, -8891, -18546, -22012, -20202, -14758, -6204, 540, 7505, 10577, 13777, 15915, 10499, 5390, -1713, -7491, -10232, -9644, -6599, -1945, 3970, 7813, 9364, 6139, 970, -2434, -5304, -6582, -5391, -4042, -3644, -2084, -2850, -282, 4956, 6690, 7558, 6502, 5056, 4604, 4147, 1210, -785, -2893, -2841, -4716, -6328, -6493, -5955, -865, 4462, 9904, 8487, 4018, -888, -3237, -3171, -4335, -5420, -5310, -2555, 3953, 8820, 12161, 14620, 12020, 5900, -3136, -9960, -13320, -14647, -14499, -9916, -3234, 3969, 10149, 14012, 13902, 10922, 4744, -2883, -7630, -13164, -13562, -8735, -1601, 7119, 12370, 14057, 12673, 7550, -146, -9627, -16153, -17082, -14256, -11551, -7087, -484, 6987, 12824, 16819, 18355, 13893, 6936, -1587, -8306, -10410, -9583, -8727, -5620, -4039, -1818, 3179, 4632, 6659, 7522, 3582, -700, -4285, -6793, -5792, -3892, -1952, -313, 207, 1778, 4439, 8008, 10954, 9150, 3892, -546, -3944, -6508, -6849, -9525, -9295, -5907, -4051, 250, 4316, 6760, 9363, 12614, 10488, 6404, -1439, -9755, -13529, -13919, -8379, -1075, 4207, 7865, 12967, 15171, 12032, 3959, -5621, -12607, -15323, -15782, -13523, -8813, -2781, 6122, 14720, 18681, 17488, 9533, 1162, -3959, -6719, -5985, -7146, -9480, -11155, -5073, 2990, 10124, 13869, 8009, 1507, -5098, -9731, -9448, -8846, -7084, -2189, 4067, 8293, 8865, 7935, 7541, 7757, 3480, -2423, -9040, -13794, -13633, -10143, -3441, 3055, 5467, 3010, 1838, 1586, 2871, 4054, 1881, -1672, -2502, -3034, -2081, 659, 702, 1315, 973, 2156, 4197, 2998, 98, -431, -1296, -2026, -3108, -7302, -9407, -7989, -3427, 3042, 9484, 12116, 13367, 10074, 5592, 3226, -2713, -6878, -11210, -14565, -9799, -2696, 3077, 9347, 14160, 14356, 10717, 3698, -7285, -13129, -15439, -15088, -10552, -5570, 1951, 9824, 17172, 23151, 21142, 11009, -1577, -12524, -18217, -18892, -15718, -11508, -3959, 2325, 6834, 11660, 12505, 9471, 5288, -771, -5147, -6982, -7882, -6687, -2611, 3118, 6468, 8575, 6525, 3549, 226, -1810, -4169, -5288, -5558, -6446, -6281, -4296, -1382, -1339, 1710, 3375, 5365, 7534, 6417, 4636, 5377, 5301, 3819, 224, -8632, -10191, -9731, -8632, -3719, 1454, 6790, 9034, 8404, 5378, 792, -4376, -5818, -6320, -6726, -4749, 408, 5489, 13424, 19256, 17059, 9493, -3684, -12208, -16227, -17904, -14354, -10011, -4949, 4412, 12874, 18202, 18096, 12565, 2815, -6257, -12435, -15894, -14720, -9429, 351, 10377, 16237, 17914, 14618, 6612, -81, -7988, -13130, -15291, -15495, -15476, -10217, -1437, 6146, 16656, 16455, 13035, 9022, 2928, -412, -4588, -6731, -5223, -2872, -1605, -1169, -1516, -2525, -2445, -20, 2189, 2019, -610, -2720, -3718, -114, 297, -1955, -4612, -6719, -1347, 4225, 11312, 17633, 18317, 13887, 4226, -7207, -14601, -20432, -22200, -18704, -10545, -1434, 5997, 13445, 17220, 21180, 17074, 8265, -192, -10914, -16441, -16948, -12857, -2211, 8625, 15168, 15926, 12320, 7590, 262, -7290, -12821, -14943, -14134, -11803, -4883, 2122, 8978, 15488, 14330, 10609, 4658, -1295, -4778, -7264, -5993, -1001, 1757, 2531, 2059, -1147, -1699, -2220, -2587, -3038, -6098, -9415, -5920, -676, 5109, 8754, 6517, 2548, -1210, -2044, 357, 5275, 5986, 6113, 5973, 1984, -2624, -8034, -12716, -13645, -13845, -10128, -4738, -780, 6706, 12700, 16344, 16049, 8832, 347, -8754, -14305, -12353, -5848, 1464, 5661, 9925, 12678, 13512, 7553, -3711, -11633, -18024, -20883, -17949, -12808, -2381, 9768, 21644, 28205, 25462, 16674, 2805, -7339, -12528, -14723, -13206, -11537, -8131, -2429, 4367, 11869, 10771, 7203, 1314, -6530, -9006, -10252, -8428, -2057, 3263, 8446, 10503, 6504, 2844, -170, -190, 2241, 2262, -1577, -1933, -3144, -991, 1903, -1993, -4112, -8358, -11054, -8387, -4004, 1497, 8401, 12318, 13074, 10041, 3948, -555, -2479, -4419, -5590, -4268, -322, 6034, 8572, 8426, 4560, -3423, -10157, -15041, -16697, -16245, -11936, -2541, 7857, 19365, 24691, 23117, 17035, 7233, -2471, -11804, -16680, -18607, -17255, -10349, -1138, 6647, 11977, 12833, 8659, 1099, -6123, -10503, -11048, -8498, -4421, 1827, 8568, 13530, 15201, 12591, 6082, -57, -5943, -9912, -13169, -12482, -8149, -2770, 4238, 5862, 3788, -1, -210, 2222, 4491, 4861, 3022, 1617, 2475, 2051, -47, -1032, -5084, -4237, -1816, 1644, 6529, 7638, 6263, 5078, 956, -3657, -8793, -16164, -16882, -14426, -6940, 3763, 14142, 19873, 19518, 14867, 9909, 3613, -5177, -11830, -17859, -17373, -11478, -3826, 2769, 9660, 12953, 8714, 3324, -4227, -11377, -12305, -10707, -5374, 1719, 8247, 13901, 15668, 15300, 11681, 5364, -3487, -14241, -20285, -19733, -14695, -6399, 2204, 8483, 7470, 7685, 7833, 5773, 4559, 113, -2662, -2927, -776, 1135, 2609, 1821, -663, -2199, -2122, -997, -1471, -1634, -477, 978, 3556, -58, -7103, -9474, -8812, -3635, 2099, 7863, 12676, 12643, 11287, 9570, 4329, -1201, -8147, -14410, -17665, -15583, -7629, -279, 7838, 14647, 17200, 13254, 5113, -3633, -10716, -14305, -15102, -12244, -4572, 4435, 13099, 21433, 21531, 14557, 6251, -4441, -12658, -17793, -18944, -17661, -11735, -3574, 4506, 11623, 12868, 14583, 11983, 6215, 1889, -2446, -4724, -3820, -1853, 1260, 447, 206, 1987, 738, -295, -2143, -4754, -5733, -4046, -1828, 768, -2700, -4992, -2640, -165, 3966, 8862, 8822, 8490, 9032, 8338, 5176, -3188, -9748, -14659, -14841, -11786, -6855, -29, 7130, 11460, 10502, 7689, 2289, -3288, -6753, -11354, -11344, -6941, -1949, 5570, 14731, 18834, 18544, 12460, 1174, -8440, -17366, -21472, -21583, -16233, -9278, -1177, 7725, 16736, 19685, 16354, 11970, 2264, -4314, -7947, -11682, -11306, -6846, 544, 8033, 12485, 12507, 6062, -1099, -6312, -8891, -9337, -9352, -8691, -7859, -2726, 2341, 6467, 11131, 11409, 9217, 6269, 1134, -1297, -73, -1860, -3670, -5824, -7727, -5730, -4193, -4213, -1010, 2806, 4536, 5979, 3231, 2825, 519, -3815, -4179, -7199, -6255, -2204, 1535, 10762, 15884, 14834, 12032, 2096, -7198, -12977, -17188, -18372, -15291, -9357, -2725, 9026, 15472, 17936, 15320, 7437, 2186, -5123, -9316, -12243, -12132, -4091, 4989, 13459, 18420, 13226, 6161, -2474, -12112, -16091, -17762, -16441, -13229, -5490, 5392, 16902, 24236, 23241, 18000, 8702, -2031, -11858, -16696, -14915, -11705, -5871, 1287, 8445, 11844, 9680, 6283, 2216, -1236, -3659, -8861, -12185, -9579, -5249, 1663, 6524, 8790, 8046, 5759, 3606, 4389, 5933, 3655, 3340, -780, -6660, -10686, -14680, -14268, -10570, -4633, 2786, 9951, 13740, 13565, 8604, 2715, 745, -3394, -9167, -13212, -12546, -5015, 7951, 17114, 20860, 16991, 5926, -4685, -14197, -19174, -19015, -18302, -15392, -6747, 4345, 15873, 21089, 21557, 19034, 11480, 164, -8713, -14075, -15943, -12281, -4487, 4658, 8789, 8239, 5444, 2912, 290, -2533, -7435, -11776, -11731, -8300, -972, 7738, 13865, 15319, 11998, 5001, -2866, -6363, -8273, -7697, -2300, 1758, 1805, 28, -2207, -2176, 1636, 3797, 3584, 1357, -2236, -3158, -3817, -3947, -2501, -3852, -3267, -3376, -781, 10227, 18173, 19928, 14610, 2491, -6101, -11504, -16229, -19890, -20592, -15712, -6680, 5739, 14346, 19807, 18969, 15215, 10272, 339, -8179, -16476, -19648, -12194, -510, 9393, 15333, 15620, 11745, 3987, -4067, -11053, -15811, -17688, -15735, -10264, -1907, 7701, 12065, 15592, 16435, 13980, 10065, 1673, -6023, -9848, -8500, -6120, -5061, -3665, -4657, -4362, -2869, 584, 4786, 4847, 3922, 2668, 3567, 2518, -1265, -3157, -6558, -6461, -6403, -4660, 4789, 11954, 14718, 13408, 7965, 18, -7654, -14191, -18768, -16701, -9674, -1071, 8639, 14711, 14205, 9227, 3810, -587, -6161, -11545, -14643, -12018, -1076, 12159, 20223, 22271, 16449, 7155, -3493, -13888, -20324, -24189, -23834, -18257, -7990, 7245, 18746, 24508, 24963, 18299, 11620, 1446, -8303, -13707, -15224, -10207, -2717, 3548, 7292, 6121, 2687, -70, -2760, -4723, -8079, -9226, -7207, -1075, 6013, 7410, 7654, 7715, 5081, 3211, 3396, 1411, 1096, 1762, 2725, 2436, -4514, -10355, -16016, -16672, -11324, -4550, 3382, 10954, 14812, 14737, 14465, 9567, 2224, -5791, -14541, -20613, -16456, -6980, 4861, 16040, 21597, 20862, 12241, 2438, -7627, -17241, -22133, -22464, -17776, -7444, 1300, 10882, 19749, 23476, 20141, 10478, -2346, -15049, -16102, -11557, -4838, 5675, 9703, 10453, 9055, 4375, 1563, -3923, -10179, -15925, -19986, -16073, -8134, 2792, 14687, 20852, 20849, 15387, 5808, -1445, -4321, -4259, -4724, -4240, -2273, -2695, -4401, -8174, -8488, -4573, -1286, -514, 1060, 3608, 6691, 7772, 5950, 3642, -2003, -6874, -9585, -7109, 1473, 12430, 17924, 15552, 5694, -3233, -10597, -17558, -19421, -18593, -13202, -5313, 5838, 14203, 21677, 23914, 19745, 12861, 271, -12621, -20866, -21121, -16006, -4560, 6735, 14008, 15480, 13458, 10831, 3144, -4500, -11884, -18167, -18412, -13566, -5225, 4536, 12029, 14589, 12983, 8116, 3280, 631, -1157, -3811, -2985, -1054, -265, -1487, -5411, -5693, -5903, -4489, -2192, -4228, -4388, -2692, 141, 7152, 9834, 8522, 4190, -819, -2754, -2121, 2664, 5095, 6958, 6726, 3261, -1276, -7336, -12141, -13796, -13928, -11378, -7697, -878, 9878, 15749, 20167, 17917, 10018, 2627, -6273, -12372, -13507, -9813, -2276, 5902, 8802, 9900, 8489, 1518, -6336, -11129, -14707, -16413, -14159, -8925, 1026, 10872, 19935, 24358, 20932, 15022, 5334, -6249, -14059, -18731, -15961, -10418, -5641, 3424, 7397, 7143, 5973, 4602, 2633, -2613, -7709, -10239, -7970, -996, 6525, 8959, 6728, 3526, 2215, 1385, 503, 2429, 5244, 5323, 5248, 330, -7353, -11616, -16032, -14544, -10200, -5674, 858, 7217, 12818, 16208, 15719, 12345, 5609, -3996, -10757, -12855, -9916, -3991, 3647, 7933, 9962, 8223, 1404, -4693, -11461, -13838, -13557, -12740, -9369, -4845, 4410, 15374, 24023, 26482, 18434, 6824, -4621, -10287, -10304, -7250, -4244, -5427, -2781, -2402, -2721, -1399, -1541, -110, -480, -2339, -2371, 28, 4732, 10799, 10365, 8003, 4425, -979, -2456, -3057, -783, 2381, -481, -2681, -4977, -9588, -9950, -9494, -6099, -1787, 290, 2611, 5825, 11078, 15173, 11610, 4524, -3870, -11876, -13968, -11519, -3812, 3302, 8305, 11193, 10279, 6915, -1122, -6685, -10756, -14547, -14002, -14632, -10364, -28, 12809, 22898, 24502, 18915, 9644, -188, -4600, -6511, -8684, -9992, -10129, -6331, -2743, 4545, 7382, 7503, 6571, -331, -7283, -12052, -12476, -5036, 2465, 5703, 8515, 10042, 12234, 12815, 11328, 3866, -2877, -9107, -12572, -11146, -9392, -8684, -8792, -6537, -4455, -4843, -3319, 1292, 5503, 13594, 16299, 14879, 9098, 2251, -464, -3420, -4944, -4167, -5464, -4872, 829, 3881, 3699, -1675, -5246, -6822, -8427, -10770, -8565, -4073, 3197, 11210, 18178, 21907, 12920, 6355, -897, -7415, -8403, -10751, -13102, -12268, -5476, 3440, 8207, 9872, 6248, -324, -6906, -10698, -9479, -7111, -3609, 1343, 8451, 15405, 19108, 17778, 13277, 4244, -4277, -13023, -18213, -18575, -13771, -7788, -1606, 5666, 5244, 7102, 5665, 2000, -126, -2916, -3636, -2233, 841, 5069, 9358, 9605, 7120, 3662, -520, -3503, -4049, -3870, -2115, -3684, -4216, -5997, -7837, -5489, -8051, -6650, -1548, 3234, 12460, 19187, 19159, 19047, 13495, 4435, -2357, -11073, -18014, -21734, -18878, -12795, -1825, 8357, 13338, 14052, 8776, 3133, -4579, -8918, -10748, -11957, -8053, 540, 11171, 20515, 22302, 18597, 9336, -3608, -10683, -18713, -21160, -20671, -18688, -8685, 1071, 13018, 15367, 12990, 9520, 4890, 1874, -4319, -6232, -5297, 772, 6110, 9432, 7666, 1832, -4153, -8836, -9074, -9169, -8942, -5258, -479, 7101, 11504, 6744, 2043, -4030, -6848, -6052, -4182, -1740, 5702, 13129, 14889, 13583, 7772, 455, -7017, -11525, -14580, -14072, -10047, -2137, 3659, 7579, 7848, 2560, 1124, -2505, -6274, -6454, -4567, 3229, 12096, 16899, 20768, 16962, 7332, -1607, -10921, -19511, -23665, -21320, -16427, -5892, 4038, 10156, 13808, 12815, 13097, 8482, 387, -3727, -7944, -6577, -2713, 2767, 9473, 9220, 5245, 1179, -4371, -9303, -11509, -11776, -10120, -6869, -2037, 1736, 5837, 6359, 5365, 4569, 2884, 4716, 5895, 4125, 4185, 6253, 4528, 559, -7136, -15617, -19263, -17042, -9516, -1743, 6378, 10796, 11417, 12590, 10456, 5059, -2008, -9949, -14404, -15412, -9971, 725, 11013, 19382, 20386, 14086, 5002, -4637, -10953, -14176, -14215, -11031, -10029, -8117, -2326, 4883, 11692, 15368, 14071, 9173, 600, -4374, -1895, 615, 2043, 1183, 74, -748, -1259, -930, 379, 10, -1817, -5948, -10227, -6771, -2471, 1568, 5396, 5428, 5859, 4937, 596, 1985, 7741, 9847, 8718, 7319, 3253, -3427, -10537, -15079, -15453, -13466, -9583, -7549, -926, 5692, 10075, 14242, 13395, 9541, 3301, -4856, -8848, -4754, -885, 483, 4129, 5943, 5311, 3018, -2822, -4939, -8053, -11834, -12989, -12643, -7849, 123, 9036, 19022, 21844, 14807, 7791, -3583, -9339, -9644, -13468, -12579, -7859, -2005, 4665, 11050, 15875, 13369, 5405, -2565, -10336, -15527, -17906, -14924, -8036, 2189, 11865, 15053, 14160, 11786, 10155, 7234, 2058, -4503, -7420, -8190, -6042, -3067, -2658, -921, -1106, -2822, -4882, -5869, -4087, 1477, 6523, 10281, 9022, 4410, 719, -2846, -1606, -1146, -162, 3216, 5572, 6851, 5392, 1358, -4062, -7922, -11184, -15857, -17034, -16319, -7566, 6623, 16031, 23597, 23264, 18163, 12455, 4654, -3992, -12977, -17424, -17762, -12652, -5078, 5262, 15683, 12548, 8292, 3509, -5287, -9667, -13998, -14531, -8601, -23, 10743, 16053, 15358, 12421, 4489, -1396, -5547, -8943, -9836, -7203, -1312, 4747, 6805, 3860, 642, -5419, -10043, -10733, -9253, -5355, 2896, 9650, 14541, 16448, 10870, 6440, -1482, -8102, -8490, -7039, -5602, -2303, 469, 2277, 3109, 1251, -1603, -9149, -13260, -14229, -11336, -2951, 7411, 15972, 19569, 17357, 11258, 3851, -5045, -12165, -15999, -14165, -8680, -901, 6448, 9862, 11620, 5860, -2039, -8396, -17293, -20004, -16993, -9709, 4401, 16595, 22620, 24883, 21133, 13026, 1354, -9626, -17614, -21553, -21744, -16657, -6358, 3739, 12418, 14778, 12102, 9043, 1876, -4341, -4880, -4850, -653, 3889, 5421, 8051, 7178, 3188, 1088, -1424, -2606, -3200, -3838, -3652, -696, 3411, 4501, -712, -5746, -8958, -9833, -3940, 2624, 10415, 14123, 14950, 12600, 8623, 2414, -3155, -9074, -14353, -15965, -12695, -7317, -34, 9674, 14270, 17017, 10089, 925, -10038, -15754, -15094, -10172, -3858, 394, 4949, 10466, 18477, 19096, 14235, 5367, -7476, -15981, -16097, -16902, -12098, -6020, -1039, 5574, 7555, 5551, 2431, 1239, 2292, 1928, 2498, 2472, 782, 3949, 6899, 6182, 2442, -3389, -9890, -12508, -11073, -6968, -2250, 3468, 4805, 6342, 5014, -190, -1054, -640, -909, -1318, 2184, 3107, 6186, 9748, 9830, 6402, 596, -5608, -12852, -14598, -13713, -9202, -797, 7861, 13246, 11665, 5144, -2089, -3929, -3573, -4991, -4808, -5622, -3871, 3171, 10678, 16057, 12731, 3224, -3767, -10529, -14881, -15354, -13548, -8042, -1717, 7446, 12972, 14659, 14452, 8367, 3125, -2744, -10450, -13071, -13008, -5963, 4409, 9894, 13333, 13034, 9196, 2179, -4038, -9516, -11848, -11243, -7548, -3524, 698, 2784, 2309, 3351, 3994, 7220, 8116, 5003, 3676, 3095, 1704, 1336, -2238, -5257, -11247, -14841, -14486, -8719, -93, 8139, 14938, 12850, 9578, 2300, -3186, -4195, -6305, -9221, -9374, -7654, -362, 9718, 16789, 18820, 12427, 2421, -8017, -16620, -19933, -17831, -13958, -6334, 2667, 9696, 15079, 17316, 16468, 13173, 5435, -4845, -11667, -14393, -13962, -6932, 1173, 8474, 10130, 6123, 2231, 36, -882, -2891, -4623, -5683, -2602, -498, 3575, 5012, 3224, 2795, -1182, -2339, -946, 1317, 3941, 6397, 9008, 9163, 2427, -6521, -12629, -13768, -9619, -3532, -207, 2454, 3896, 4382, 8383, 8144, 6145, -2146, -9613, -10764, -9724, -887, 6959, 11048, 12776, 7438, 139, -6053, -13122, -14892, -13676, -10534, -4492, 3806, 9209, 13518, 15665, 12063, 6207, -2459, -11268, -14848, -12188, -5624, 3693, 8741, 11274, 10576, 8952, 6361, -793, -7648, -14609, -17707, -15976, -10319, -948, 7389, 15099, 18934, 15143, 11358, 3202, -2721, -5167, -9936, -9499, -7943, -5781, -4153, -2064, 979, 4513, 4162, 1569, 280, 268, 3788, 3790, 5009, 1444, -5524, -8051, -10036, -6955, 789, 6706, 9831, 12319, 12080, 8585, 863, -4972, -8658, -12492, -15887, -15061, -7319, 520, 8649, 14761, 16430, 13477, 5893, 526, -4930, -9854, -9472, -9597, -7042, -326, 7073, 10760, 12653, 10235, 2296, -5339, -12458, -14511, -10799, -8371, -4352, 3085, 8945, 14284, 12977, 10308, 6471, -114, -5358, -9990, -9891, -6042, -2132, 1367, 1760, 567, -114, -990, 628, -51, -2695, -4980, -4812, -2107, 2873, 4714, 2844, 3134, 1789, 1378, 3120, 2117, 111, -370, -1231, -530, -2546, -8376, -10460, -7389, -413, 3909, 6410, 8664, 10074, 11552, 9815, 4129, -5075, -13134, -17776, -16113, -8875, 916, 10177, 16533, 20581, 17755, 9162, -446, -9860, -15437, -18268, -18986, -13997, -8025, 1251, 12642, 19649, 21191, 15594, 6325, -2736, -7007, -7935, -9158, -8570, -7850, -5149, 1592, 7393, 11593, 10619, 3277, -2975, -7022, -9308, -10281, -6128, -742, 2067, 5559, 7583, 7880, 9605, 7849, 3125, 743, -1334, -4362, -3309, -4067, -7299, -6135, -6511, -3847, -2355, 1330, 4889, 8659, 11852, 9166, 4623, -2786, -6316, -7375, -6229, -3412, -1309, 552, 5219, 8000, 9010, 5325, -1985, -6598, -10102, -12141, -13736, -10740, -2824, 7005, 15868, 17870, 13916, 7507, -1245, -7437, -11154, -13685, -13664, -12436, -4086, 5362, 12867, 18560, 13684, 8482, 641, -9018, -13089, -16332, -14136, -10594, -4621, 3807, 10521, 18818, 21574, 17865, 12543, 3345, -6104, -13470, -16673, -14100, -8902, -1249, 4532, 6149, 3213, -1386, -882, 734, 1132, 3158, 2329, 1310, 2567, -60, -655, -543, -3402, -4323, -2169, 2119, 3712, 3967, 3746, 1260, -2887, -7993, -14626, -16968, -13070, -5368, 3235, 11329, 18226, 19038, 19629, 12582, 3445, -4762, -15254, -20489, -21573, -16535, -6747, 5372, 15817, 19078, 13734, 5436, -3332, -8827, -11615, -13304, -12314, -5456, 6268, 15198, 23434, 21494, 12703, 3477, -8362, -14499, -17196, -16477, -10395, -2949, 5109, 11861, 11148, 9232, 4627, -1804, -5732, -9907, -10074, -7767, -2392, 5002, 12184, 14781, 10307, 3245, -353, -2181, -3511, -7034, -8970, -6144, -3284, -2437, -4252, -5012, -4985, -2995, 570, 5508, 8403, 10710, 12535, 13292, 11691, 1137, -8573, -16249, -19327, -14508, -8181, 2243, 12035, 14943, 12123, 6417, -1088, -7481, -12354, -13310, -11822, -7062, 1531, 13559, 27013, 29499, 23828, 11364, -1462, -12051, -20787, -24344, -24302, -19156, -9110, 718, 9443, 16497, 17706, 14686, 8943, 1913, -4842, -9826, -10052, -4667, 1270, 6657, 8017, 4540, 2066, 140, -1463, -3744, -6345, -10409, -8230, -3622, -2462, 116, 723, 4000, 7023, 8559, 7363, 3775, 3176, 3342, 3519, 2760, -3370, -8961, -11700, -10378, -3693, 2402, 4188, 3726, 4107, 2894, 3775, -1205, -5162, -5491, -8437, -7993, -4193, 3022, 14604, 19969, 17825, 11321, 893, -6703, -12546, -17343, -18934, -15991, -9905, 421, 8304, 13849, 14520, 10174, 7241, 584, -8104, -13435, -15197, -8823, 1090, 8194, 13702, 15462, 15748, 12198, 4659, -5515, -15766, -21641, -23241, -19569, -11476, -1658, 7717, 14127, 19210, 19623, 15848, 8490, 532, -2711, -4239, -3525, -4843, -6524, -6859, -5423, -2726, -694, 33, -1441, -463, 72, 1154, 308, -1703, -735, -902, 2210, 6446, 8296, 10588, 12566, 11011, 5553, -2336, -9815, -16102, -19620, -19079, -13439, -5990, 2840, 12891, 15171, 15855, 12355, 5300, 20, -8930, -13624, -15221, -14658, -5451, 6622, 16017, 19264, 15007, 8949, 2845, -4608, -12041, -17346, -19713, -15786, -9030, -1132, 8791, 14828, 17452, 16031, 10984, 4286, -4658, -9846, -8912, -4787, 844, 5320, 5902, 3793, 3963, 3088, 137, -4051, -8896, -13717, -13951, -9322, -2576, 2857, 5888, 9979, 11938, 11644, 10398, 8977, 6019, 6678, 2834, -929, -7595, -17544, -19140, -17822, -12340, -6534, -802, 5130, 9780, 11075, 12975, 11051, 6036, -1491, -9678, -10813, -5488, 2311, 7818, 10482, 9182, 6149, -1743, -9359, -13875, -18038, -18150, -13181, -6696, 2758, 11994, 17812, 23395, 20757, 14136, 5706, -6935, -15006, -18829, -15654, -8689, -801, 7273, 10315, 13372, 11654, 5496, -1501, -7288, -9981, -12927, -13869, -9941, -2198, 9047, 15928, 15615, 13003, 4718, 1853, -672, -4999, -5571, -5559, -5276, -6051, -3403, -1557, 580, 3887, 1351, -2589, -5556, -9062, -6635, -571, 3926, 5282, 3351, -1080, -1683, 3418, 8974, 9591, 7873, 6941, 3405, 1260, -6557, -15638, -18225, -20290, -17728, -10528, -2764, 7252, 17587, 22914, 24946, 19892, 8421, -3117, -11315, -14249, -13707, -8784, -2634, 1182, 4334, 7302, 6542, 4454, 959, -6368, -13624, -14380, -12366, -7940, 1853, 11442, 21485, 23530, 16152, 7161, -1332, -7106, -11142, -12902, -12656, -11119, -6432, 774, 5746, 8166, 8929, 5098, -874, -6432, -9347, -5760, 2067, 5263, 5315, 4097, -283, 644, 4112, 5686, 4129, 1559, -1271, -3324, -1016, -1932, -5606, -7477, -6241, -4152, -3205, -2502, -382, 6049, 13010, 14817, 10500, 1097, -7429, -9704, -6711, -3881, -1121, 3740, 7925, 13412, 13016, 6418, -1252, -9712, -15324, -19960, -21520, -16515, -6876, 7104, 18211, 25520, 27137, 18828, 10928, 2319, -5422, -12372, -17699, -15900, -12284, -5223, 2944, 6085, 8920, 7522, 3293, 432, -4380, -7949, -6944, -3244, 684, 5552, 7682, 8425, 9326, 9184, 4834, -83, -5065, -7398, -5911, -4064, -3093, -5589, -7086, -5913, -2005, 398, 94, -719, 4618, 10208, 9665, 7211, 1919, -2842, -4954, -6220, -5110, -2318, 2099, 6110, 8491, 7323, 705, -6959, -12270, -14222, -13739, -12003, -7989, 1484, 12468, 21220, 22472, 16320, 7853, -727, -7077, -11417, -15246, -13932, -9699, -3334, 5734, 11813, 13810, 10825, 5847, -3133, -13077, -20130, -20651, -13247, -2997, 8933, 17504, 19216, 18990, 16729, 12104, 2818, -6038, -11103, -13734, -12784, -11580, -9208, -5188, -101, 1567, 1807, 2761, 401, 1412, 7467, 11890, 12651, 5623, -2322, -5180, -2851, -465, -1934, -5192, -5348, -1819, 3620, 6279, 2357, -3324, -9886, -13420, -14990, -11784, -7576, 2192, 14378, 19190, 20111, 13101, 4850, 531, -6014, -11357, -14181, -14318, -9063, -2094, 7608, 11624, 8202, 3352, -4513, -10563, -13300, -13467, -9186, -2262, 8374, 15424, 17609, 17644, 14223, 9306, -686, -10640, -14633, -15284, -12067, -6578, -1440, 3041, 5867, 6956, 4407, 1449, -2175, -6527, -7427, -2881, 3375, 6864, 8038, 7320, 8999, 8486, 3908, -119, -2244, 122, 1869, 1662, -2227, -8132, -10872, -12870, -14526, -11514, -5277, -466, 9660, 19979, 25431, 21900, 11978, 1615, -7549, -12758, -15836, -16365, -13770, -5112, 2965, 8741, 10134, 7083, 2110, -3951, -9234, -11235, -11648, -9578, -806, 8783, 18386, 21515, 20046, 14361, 6570, -3576, -13098, -16909, -17313, -13378, -11159, -4394, 2465, 6469, 8894, 6083, 886, -3624, -7079, -4172, 3989, 8818, 10830, 8201, 6167, 3451, 116, -2538, -6188, -9565, -9449, -7011, -1907, 3135, 2760, 1076, -1633, -2952, -4928, -5739, -4176, 3530, 12026, 16462, 14480, 5840, -502, -4955, -6017, -5272, -5954, -6784, -3104, 2629, 7678, 7677, 3877, -1362, -7642, -13826, -15223, -11304, -2536, 9294, 16654, 22641, 22213, 15628, 7653, 155, -6193, -11775, -16369, -17827, -14893, -7226, 3609, 10395, 14009, 11622, 4002, -3542, -8896, -8953, -4467, -155, 4731, 9938, 12504, 13423, 8720, 3220, -3904, -12194, -16396, -15824, -10569, -4240, 3477, 3713, 1722, 511, -1088, -239, 1502, 3566, 5294, 9835, 10216, 5857, 1551, -2999, -7784, -10574, -11848, -10879, -7054, -1016, 4520, 9044, 7531, 1532, -2822, -8035, -10049, -8499, -4148, 1846, 11250, 19302, 20465, 15894, 10417, 1592, -8050, -14315, -19164, -19611, -17016, -5817, 5332, 13789, 18150, 12427, 6534, -181, -7244, -9889, -10135, -8338, -4224, 2425, 11040, 16224, 17939, 12942, 4905, -2716, -10981, -13993, -15383, -12688, -9171, -6636, -2444, 197, 4873, 6406, 6371, 8194, 7970, 6225, 5843, 5009, 4342, 2790, -4129, -8222, -10537, -12129, -9190, -5424, -2244, 593, 2070, 2689, 1380, -736, -1996, -2968, -1455, 685, 1709, 4333, 9543, 13580, 14237, 7647, -2728, -10548, -13773, -15512, -14034, -12399, -8887, 87, 8390, 14337, 13578, 9223, 3681, -1142, -4001, -5898, -6505, -3656, 1247, 6474, 10886, 11644, 7078, 1556, -4046, -10730, -14895, -15231, -13773, -9454, -1411, 8000, 15614, 14657, 11499, 6476, 2230, -2973, -7698, -10390, -9499, -3274, 2467, 8094, 9878, 6931, 2769, -254, -4322, -6974, -9529, -9049, -6368, -2825, -506, -1716, 1306, 5790, 8607, 9743, 9585, 9407, 9063, 7732, 2926, -2076, -8081, -13491, -14359, -15086, -12135, -6239, 3509, 9563, 12988, 15422, 7799, 2682, -704, -4221, -5554, -8308, -6897, -686, 9361, 16708, 16648, 10739, 837, -9015, -16222, -20117, -19008, -15187, -9005, 1248, 11332, 17837, 18419, 15941, 10720, 3099, -2632, -9469, -13917, -11246, -5656, 337, 5252, 5607, 2621, 177, -2381, -4501, -4676, -4105, -4715, -1160, 5064, 6724, 8312, 7471, 3031, -113, -2557, -3982, -3762, 575, 5336, 5057, 2848, -707, -4344, -7060, -6604, -4118, 1475, 6627, 7721, 7784, 3221, -2192, -4520, -6416, -7225, -6693, -5100, -1052, 10396, 20444, 20579, 14675, 3300, -7622, -14242, -17069, -18778, -17935, -13621, -5801, 4926, 14480, 18137, 17686, 13379, 5737, -1553, -7968, -11572, -13219, -8059, -785, 6399, 10735, 8499, 4421, 1898, -952, -4107, -9293, -12686, -9964, -5417, 1084, 4544, 7302, 8128, 6098, 5928, 4343, 2387, 2504, 2948, 3522, -193, -7597, -11406, -13877, -11298, -7259, -3668, 3129, 8563, 12392, 13736, 10336, 5018, 252, -5477, -9830, -10634, -8835, -3858, 4470, 11678, 13690, 9760, 2729, -2252, -6733, -9761, -12547, -13875, -9519, -291, 11434, 17587, 15636, 8496, 1060, -5252, -9285, -10112, -10443, -8970, -3630, 5213, 13186, 16495, 13016, 4556, -3563, -9762, -14844, -17901, -17354, -11226, -2570, 7920, 13600, 14905, 14036, 11499, 8986, 3065, -4100, -9040, -9971, -7297, -2715, 307, 1563, -1278, -3775, -3206, -3092, -727, 3384, 4478, 4009, 1477, -1673, -2473, -4126, -3369, -1002, 231, 5954, 11710, 12508, 11106, 3017, -4532, -11430, -17663, -21239, -20146, -14339, -4590, 9539, 19181, 23042, 19048, 12216, 6151, -1741, -7624, -13152, -17220, -14075, -6900, 4577, 10669, 11343, 11467, 4051, -357, -5423, -10222, -10746, -10553, -5823, -642, 6797, 10423, 10614, 10594, 6081, 2763, -333, -4501, -5717, -2651, -908, 630, 538, -1070, -2371, -4363, -2748, -752, -298, -214, -1965, 240, 4592, 3710, 1659, 564, -1472, -630, 3966, 7926, 9522, 8537, 5049, -803, -8927, -13595, -15471, -15554, -11514, -7851, -1626, 7444, 14679, 17707, 16199, 9517, 1413, -4347, -9991, -11211, -8605, -2805, 4989, 9137, 9205, 6641, 792, -4248, -9192, -12890, -14663, -15326, -13151, -5783, 7708, 17890, 23053, 22375, 16000, 7564, 1941, -4352, -11512, -14915, -16669, -14805, -7990, -731, 4469, 8460, 10144, 10659, 5929, -15, -5363, -6232, -2601, -929, -913, -10, -34, 2329, 5357, 9713, 9294, 3657, 2602, 3, -854, -5564, -10496, -13864, -13655, -10017, -4181, 4075, 10065, 14644, 15505, 11337, 5867, -799, -6937, -10235, -11855, -5741, -2962, 5097, 12510, 14383, 13972, 4385, -3720, -10711, -17989, -19275, -17195, -13457, -2488, 9871, 18810, 21635, 18955, 13286, 5855, 582, -4906, -13144, -15553, -12750, -7269, 58, 5789, 9494, 5908, 485, -4581, -7467, -8185, -9325, -6827, -2256, 6098, 12818, 13555, 13378, 11484, 8110, 3284, -3903, -9430, -10826, -9171, -8114, -8825, -9484, -8037, -5867, -1130, 6483, 9718, 13953, 15537, 14331, 9898, 1993, -4723, -11616, -15474, -13472, -7114, -1621, 5669, 12316, 13830, 10391, 4705, -4043, -9188, -14352, -19299, -16152, -8513, 5579, 15471, 18790, 19099, 13710, 7801, 427, -8041, -11440, -14493, -13750, -7690, -660, 5207, 8568, 9285, 7998, 4533, -1651, -8023, -13526, -13861, -5876, 1219, 6856, 10042, 7400, 9457, 10048, 8738, 6194, -1517, -8236, -10858, -8890, -5361, -3007, -5019, -6851, -5607, -4298, 573, 4067, 6718, 10185, 9729, 8969, 4417, -531, -4355, -7113, -4428, -2927, -1606, 2325, 3802, 3449, 776, -4992, -9073, -11847, -13538, -13296, -7743, 2448, 11621, 19687, 22440, 19363, 12735, 4997, -4381, -13308, -18273, -21181, -18302, -10514, -749, 6971, 10938, 13676, 11105, 6407, 188, -5248, -6974, -6858, -5955, -3560, -377, 2883, 7698, 8854, 8353, 5395, -277, -4879, -5386, -5183, -3846, -2897, -3837, -4646, -5613, -2456, -725, 1467, 4827, 5262, 4318, 5306, 7021, 7607, 3924, -1785, -6459, -9402, -7780, -4403, 95, 4586, 5568, 6511, 3702, -3348, -7494, -10825, -11082, -6651, -542, 4210, 10117, 15697, 17416, 16426, 8840, -402, -9722, -16259, -17776, -15015, -6475, 732, 6194, 9891, 9568, 6342, 2987, -1972, -5321, -5487, -6817, -6264, -3826, 1357, 11566, 16773, 15539, 9451, 1326, -4071, -9108, -10523, -11130, -11832, -9045, -4594, 107, 6214, 8842, 10556, 9492, 7128, 2387, -3455, -5916, -4083, -1166, -639, -1443, -2852, -1004, 502, 5176, 7053, 4677, 2371, 365, -2826, -5374, -8834, -9800, -8022, -5226, -1341, 2107, 7023, 12317, 17467, 15390, 10187, 1663, -7075, -14320, -16962, -14852, -10520, -4283, 246, 6293, 10940, 11814, 10022, 5375, 60, -5935, -11586, -12733, -11992, -4352, 6422, 11912, 17574, 16082, 9280, 2622, -5999, -10081, -11691, -13228, -13679, -10337, -3740, 5134, 12805, 15247, 12308, 4724, -2186, -6073, -5613, -3037, -1411, 202, 3142, 5381, 5690, 5720, 3044, -876, -4664, -8800, -9886, -8167, -2721, 379, 2750, 3956, 1724, -94, 1378, 5111, 8416, 10955, 7705, 2923, -3031, -8352, -10118, -11394, -11300, -8405, -4533, 3846, 10379, 13510, 13519, 4018, -3159, -7660, -11188, -10392, -9194, -4607, 3911, 12436, 19080, 18191, 10445, 2384, -3611, -9720, -14592, -18454, -18695, -11375, -1132, 7659, 14231, 15994, 14102, 8383, 819, -4895, -10193, -10426, -7793, -4091, 1877, 7155, 9342, 8635, 7409, 2411, -4742, -8730, -10927, -9905, -6858, -3613, 69, 3437, 5702, 6430, 4928, 3736, 4104, 1460, -134, 548, 511, 988, -290, -1523, -2659, -7210, -8143, -8034, -5105, -707, 1991, 2200, 3545, 4661, 2692, 1621, -2662, -2429, -1813, 1566, 8027, 11643, 10166, 6460, 522, -6376, -10041, -15232, -15936, -13730, -8249, -1301, 5897, 14580, 18751, 15819, 10097, 2744, -3403, -7040, -10075, -12437, -11519, -2782, 5206, 10626, 14156, 9127, 3946, -1551, -8150, -11170, -14980, -15258, -10162, -518, 9499, 15481, 14726, 11436, 9266, 5764, 1218, -4338, -8247, -10167, -7115, -3766, -1855, -1067, -1741, -911, 97, 266, -368, -364, 2479, 5473, 6536, 4144, -1560, -5179, -5553, -2950, 1967, 8343, 7497, 6696, 5403, 2378, 2601, -1467, -6968, -13801, -17717, -18270, -12260, -1340, 10165, 18932, 22354, 22183, 13033, 2963, -1120, -6609, -12065, -13896, -12620, -6401, 919, 6668, 10344, 8887, 4996, -2266, -11972, -15375, -15340, -8638, -1318, 5890, 13611, 16642, 17999, 14834, 9813, 1039, -8898, -16306, -20439, -17801, -10416, -4073, 2214, 8151, 12020, 10116, 3801, -815, -3391, -3561, -3182, -925, 886, 2708, 6122, 5456, 3906, 1514, -1149, -1160, -2400, -2093, -2031, -2124, -1285, -3353, -7072, -8533, -6728, -2762, 3665, 8590, 10773, 12764, 12367, 10733, 5739, -2628, -11019, -16317, -16667, -12838, -6163, 2451, 12358, 17027, 16116, 8672, -1335, -8708, -13773, -16789, -14428, -7881, 622, 11248, 17531, 24057, 22924, 12151, 2405, -8503, -14804, -16673, -16624, -13915, -7656, 973, 7940, 11728, 11368, 5700, 34, -2970, -4837, -5140, -4090, -1170, 2840, 8341, 13336, 13567, 7552, 461, -8323, -12963, -14586, -14822, -10713, -4982, 286, 5038, 6500, 4820, 4787, 3533, 4510, 3708, 1003, 257, 378, 2097, 2871, -1572, -7852, -11037, -10659, -5981, -2091, 665, 6477, 8177, 7266, 3495, -4045, -7134, -6765, -5231, -2071, 85, 2586, 9921, 14152, 16811, 12468, -418, -8895, -15115, -16678, -17122, -13264, -3226, 6544, 16991, 19929, 14173, 4266, -2389, -5427, -7842, -12412, -15295, -14621, -3540, 12833, 22650, 28530, 19795, 5423, -4344, -13201, -16941, -16639, -14320, -9796, -5620, 408, 5839, 11976, 13132, 11277, 7685, 1297, -4675, -8479, -5047, 992, 4880, 8648, 8273, -868, -6620, -9597, -9679, -5785, -3874, -5371, -2965, 1736, 5931, 9200, 8410, 4442, 1008, -1588, -2435, 1671, 2837, 5257, 5614, 2733, -1705, -8537, -12277, -13015, -10865, -5025, 1348, 4915, 8242, 9510, 11158, 9695, 3118, -3862, -12667, -15154, -10711, -3521, 5068, 11991, 15621, 13953, 6933, -1084, -8007, -12821, -15149, -16616, -12110, -6331, 3156, 12381, 17388, 19303, 12016, 1406, -8179, -15579, -15267, -9215, -3870, 4250, 10449, 13095, 14007, 11979, 4825, -4162, -11143, -17096, -18322, -15864, -10215, -1594, 7750, 16756, 19334, 14963, 8911, 3534, 1125, -1262, -3454, -5831, -5134, -1506, 2065, 3216, 422, -4527, -7066, -5605, -4633, -3431, -1306, 758, 4727, 10767, 10368, 5254, -599, -2609, -614, 1718, 2080, 1045, 361, -1611, -1211, -3651, -7640, -10587, -13109, -10009, -1695, 4937, 12623, 16685, 15243, 12464, 5775, -2066, -10164, -14258, -15065, -11310, -3144, 6195, 12722, 15793, 14656, 8435, 135, -7161, -14916, -19160, -18146, -14349, -2539, 8293, 16109, 19985, 19057, 13634, 6051, -1094, -10053, -15535, -14062, -10179, -6591, -613, 4390, 9950, 12466, 10095, 4530, -5111, -9897, -13352, -13746, -9635, -4561, 4257, 10935, 14042, 15263, 15685, 11321, 4849, -3691, -11199, -13373, -12601, -8804, -5846, -4787, -4163, -983, 2698, 5122, 6259, 5981, 5080, 7081, 6380, 3074, 1700, -1865, -5237, -6508, -4557, -3027, -2201, -108, 1596, 2886, 1041, -2276, -5318, -8519, -8446, -8092, -4469, 1397, 5153, 13353, 18046, 18853, 15613, 4320, -6761, -16902, -22495, -20225, -14974, -8355, -849, 7068, 15539, 17738, 13322, 4396, -7197, -13792, -14271, -11991, -8053, -1939, 6544, 14614, 20020, 20356, 13322, 4172, -5495, -12750, -17950, -18539, -14324, -7211, 2234, 9868, 12781, 9395, 6010, 3359, 1009, 500, -1205, -2879, -629, 2909, 7186, 7794, 5877, 1028, -2928, -4769, -7420, -7850, -4994, -1758, -1023, 1264, -841, -4174, -5011, -2293, 3118, 8506, 10654, 11994, 13096, 11748, 7999, -1052, -9544, -15851, -20004, -18988, -13135, -4651, 3834, 14999, 18775, 13636, 5809, -4214, -8004, -11167, -12316, -9307, -4826, 1890, 12454, 19739, 21752, 16088, 4652, -9060, -19131, -21218, -21705, -18294, -11422, -381, 7180, 11995, 16560, 15653, 11042, 6364, -1137, -5046, -7243, -9058, -6975, -2861, 4585, 9130, 6646, 2941, -966, -4159, -2901, -5878, -8272, -8446, -6546, -1881, 4913, 8754, 8041, 7051, 4440, 4469, 3380, 2108, 1557, 736, -1658, -4144, -6070, -10013, -9283, -6173, -2103, 3983, 5385, 4548, 4421, 1852, 2117, 4105, 335, -2674, -4737, -3828, 2857, 9287, 11734, 9320, 4882, -642, -3302, -6260, -9713, -11191, -12524, -10064, -4661, 1947, 8996, 12625, 14670, 13982, 8370, 1072, -4234, -8928, -9864, -6392, -2039, 2761, 6924, 10012, 8253, 3468, -3926, -9703, -16137, -18585, -16340, -10816, -2201, 7642, 17929, 23378, 23070, 16213, 6810, -4605, -11602, -16815, -18179, -16117, -10313, -3125, 2170, 7704, 9708, 10102, 6325, 661, -4138, -7359, -7966, -4641, -270, 3942, 5961, 6581, 5116, 3700, 2669, 681, -429, -3051, -1820, -2288, -2874, -696, -1569, -4444, -4705, -3564, -439, 2471, 3233, 7848, 9528, 10166, 6728, -617, -4993, -8311, -6093, -1551, -692, 3597, 7171, 6867, 9119, 3047, -5142, -10566, -14673, -14321, -13336, -9426, 190, 11870, 19417, 22067, 16591, 8170, 342, -6211, -10016, -11148, -12673, -10968, -3776, 2112, 7722, 7251, 3517, 1034, -4668, -9302, -10337, -8413, -4635, 1653, 9271, 14777, 17124, 15786, 11466, 3318, -7869, -17176, -21342, -20942, -13993, -6424, 404, 6736, 12584, 13783, 11282, 8152, 2464, -2866, -8464, -8664, -6520, -3818, -2154, 1964, 4142, 2930, 2927, 4699, 5694, 2870, -359, -4918, -4280, -1391, -1129, -3788, -5140, -3161, -2972, -2017, 1599, 5671, 9333, 10913, 9932, 9545, 3459, -3581, -5841, -8723, -8172, -8920, -6369, 2445, 8807, 10786, 6644, 504, -6133, -10095, -11231, -12041, -7056, -1460, 6411, 14934, 20092, 24139, 17584, 7355, -4500, -15315, -19795, -23273, -22015, -16813, -4736, 7606, 13957, 17202, 13023, 7959, 4386, 333, -3774, -6020, -8815, -8642, -2300, 6233, 11694, 8151, 3071, -1351, -4408, -6568, -8855, -9073, -6874, -1438, 919, 2554, 3723, 3463, 5533, 7332, 6711, 2535, -4217, -8628, -4618, 1330, 5439, 4461, 150, -1210, -327, 3008, 5453, 2469, -336, -3783, -6801, -6012, -7148, -7323, -6219, -4337, 314, 6558, 12321, 19009, 20500, 18315, 11864, 512, -10942, -18790, -23187, -22978, -16912, -6956, 3191, 9490, 14591, 15750, 13148, 6832, 191, -7853, -11164, -9510, -4865, 3083, 8188, 13084, 16701, 15394, 6997, -2656, -12216, -20370, -20517, -17974, -13838, -7306, -350, 8429, 16751, 21115, 20131, 14249, 6354, -1159, -6659, -10346, -11978, -10203, -6621, -2275, 1372, 3673, 3535, 3475, 2598, 988, -2654, -6983, -8239, -5843, -1908, 771, 4289, 5780, 4757, 5771, 6605, 4303, 4419, 4189, 1030, -1343, -4753, -10450, -11143, -8824, -6389, -3079, -676, 1692, 3140, 4344, 5369, 5154, 2805, 21, -2687, -2729, 1540, 5711, 8041, 11557, 10648, 6402, -714, -11743, -17072, -18077, -16833, -14294, -8303, -1456, 6006, 17376, 23897, 25998, 17358, 4828, -4404, -10288, -10179, -13060, -13532, -9397, -2288, 6274, 12055, 11233, 6539, -1064, -8670, -12701, -14439, -14498, -11603, -3721, 6364, 16262, 19715, 18374, 14713, 8807, 2280, -4454, -11517, -13259, -11305, -9165, -6800, -4799, -2083, -1750, -1502, 238, 2839, 4069, 6163, 6721, 6784, 7488, 3958, -108, -3373, -4950, -4874, -1780, 1020, 3926, 6333, 6390, 1988, -5469, -9956, -15579, -17958, -15580, -7234, 1634, 12031, 21545, 23308, 23175, 14105, 4905, -3243, -10754, -15292, -17441, -14202, -7120, 3139, 9941, 12358, 7084, 1108, -4017, -9061, -10382, -9535, -6061, -2359, 6907, 15130, 19115, 18727, 13033, 6736, -3280, -10805, -16125, -18010, -13666, -8699, -361, 6168, 7677, 7400, 3510, 199, -3521, -5798, -5661, -6372, -1446, 6011, 9329, 10567, 9689, 7228, 4656, 730, -2724, -5837, -6689, -8666, -8649, -6827, -5258, -4427, -6784, -6318, -3984, 1609, 9563, 14603, 17489, 18522, 15919, 11503, 2099, -9409, -17428, -23337, -22329, -14979, -8270, 2891, 12836, 17198, 17462, 9003, -1051, -8054, -13523, -13779, -8353, -2071, 4488, 10816, 18518, 22064, 19530, 8969, -6281, -16591, -21525, -23369, -20344, -13247, -3181, 7920, 14960, 18988, 17566, 10733, 2275, -5633, -9714, -8469, -7685, -4604, 2110, 8785, 14008, 13652, 6834, -302, -6107, -10662, -12073, -11286, -7022, -1736, 2039, 2403, 1545, -356, 522, 2799, 4402, 5935, 6067, 8178, 9260, 7810, 4876, -1386, -10394, -14231, -14889, -12965, -6359, -15, 4797, 6826, 3877, 1298, -1197, -3660, -2480, -2302, -238, 4763, 10460, 15156, 17542, 13294, 7088, -4865, -18305, -24302, -28571, -24866, -16072, -4802, 7629, 18427, 25122, 26460, 22032, 10654, -1722, -11053, -16961, -17155, -13128, -7576, -25, 10763, 17258, 16696, 9511, 151, -6321, -11868, -12772, -12713, -11619, -7834, -1025, 6898, 15034, 16593, 11966, 6183, 1220, -1947, -5604, -6466, -6313, -2370, 2017, 1955, 1106, -75, -2613, -1850, 832, 320, -3512, -6878, -7462, -3882, 2293, 4134, 3418, 1362, -230, 1839, 8494, 11537, 10748, 7546, 1273, -2813, -6933, -11816, -14905, -16455, -13564, -7409, -2259, 4613, 10662, 15000, 18100, 16351, 7870, -1628, -10024, -10807, -6121, -2455, 1519, 4610, 7736, 8493, 4441, -4385, -12228, -15563, -14384, -11970, -5194, 260, 7214, 16475, 21629, 22071, 13918, 3864, -7179, -13705, -14882, -13681, -11561, -7350, -664, 5126, 10327, 12045, 10270, 4434, -2887, -7792, -9979, -10204, -7361, -3100, 2807, 7283, 9571, 9157, 3514, 1662, 3021, 4464, 4442, 710, -2948, -3951, -4845, -5621, -6296, -9490, -9829, -7003, -1213, 4491, 7430, 13009, 14854, 12671, 8573, -879, -6473, -7234, -7072, -3986, -894, 2352, 5558, 5361, 2933, -2902, -7802, -9579, -13036, -12623, -10498, -4804, 4755, 15768, 24439, 24153, 17779, 4789, -6252, -12253, -14039, -15191, -14153, -11127, -5378, 1895, 10000, 14513, 12179, 8143, -2677, -9804, -13458, -12280, -7200, -1834, 4881, 9696, 13352, 14579, 10752, 3419, -2983, -9018, -12517, -13352, -11646, -6615, 626, 6092, 7566, 4978, 477, -1401, 230, 538, 324, 160, 830, 2494, 2951, 3905, 2240, -20, -958, -1653, 198, -656, -1256, -424, -1069, 783, -1117, -8411, -12971, -12469, -9303, -1656, 6671, 15645, 21849, 19578, 17633, 12220, 2978, -7296, -18114, -23429, -22794, -14234, -6596, 2733, 12819, 16293, 15657, 8630, -880, -8202, -12176, -12777, -8043, -1453, 5455, 12334, 19640, 21794, 16439, 6669, -7349, -18068, -22604, -21651, -17568, -10864, -416, 7953, 14271, 17820, 14423, 7669, -91, -4757, -6464, -7765, -5759, -2202, 4010, 8000, 8547, 6497, 0, -4492, -6974, -8565, -8569, -7656, -5218, -422, 2753, 6197, 6216, 3716, 2696, 1145, 3294, 4522, 3886, 3776, 4636, 4968, 3061, -2433, -9224, -13684, -13607, -11363, -5216, 3492, 8826, 12564, 11537, 7179, 147, -6161, -10448, -11720, -7663, -1898, 3284, 12898, 21942, 19848, 13443, 269, -12318, -18939, -22805, -20724, -15936, -8023, 2950, 10983, 19260, 22624, 16572, 7532, -3189, -8990, -8750, -9530, -8739, -3858, 3177, 10322, 13679, 13189, 6778, -1574, -10281, -14618, -15664, -13164, -9671, -6270, 692, 7750, 12702, 12605, 11432, 8331, 6211, 2820, -585, -3980, -4930, -2268, -1077, -2077, -4726, -9554, -11579, -6597, 485, 5222, 6159, 5364, 4561, 7510, 6427, 828, -5033, -8183, -8180, -5919, -290, 6375, 10390, 9271, 8215, 529, -8692, -12106, -15906, -12441, -3892, 1577, 7471, 12058, 13539, 13378, 8249, 2323, -1601, -8077, -13180, -12348, -5586, 4163, 14781, 19204, 16906, 9142, -1167, -8610, -14854, -17440, -17379, -16038, -12851, -3837, 7217, 16536, 21358, 17297, 11011, 3706, -6498, -11244, -11775, -10552, -4638, 1654, 6412, 9426, 6533, 1899, -2305, -7506, -8335, -10033, -11094, -8655, -2310, 4602, 12751, 16606, 14788, 10758, 3719, 1125, -1646, -5150, -8072, -9705, -9249, -7875, -5847, -4486, -1843, 1848, 6261, 10669, 10374, 6457, 2804, 3271, 4036, 2200, -1923, -8435, -11510, -8621, -1509, 6734, 10198, 9023, 5741, 1639, -1541, -6755, -9928, -11248, -10533, -5616, -254, 3919, 9107, 12425, 14092, 11836, 2120, -7637, -14012, -12527, -7238, -284, 7292, 9441, 9214, 10079, 7418, 2265, -5180, -14186, -20730, -21691, -15800, -8665, 3995, 13801, 21359, 24622, 16600, 6709, -2788, -8753, -12335, -12239, -9609, -7726, -4788, 129, 4747, 8980, 10591, 5461, -2849, -10872, -12585, -9479, -4947, 252, 5342, 10473, 12706, 14393, 12720, 6587, -372, -7514, -13480, -16482, -16144, -12125, -7132, 230, 7212, 8769, 9630, 7273, 5189, 4940, 3373, 2914, 899, -2120, -4439, -6843, -6828, -4784, -1639, 1270, 4218, 6524, 6384, 5424, 3912, 1480, -4220, -9702, -12684, -13058, -7706, -1221, 7287, 14095, 17577, 16788, 10485, 4369, -3016, -6971, -11145, -13398, -11463, -7226, -704, 8378, 14647, 12723, 5651, -5187, -11391, -14250, -13185, -7841, -1762, 3766, 12162, 19089, 21485, 22290, 12401, -145, -10621, -20802, -22898, -20920, -16513, -8699, 2725, 12994, 18877, 18284, 10576, 3392, -1831, -6778, -10237, -10409, -9639, -5451, 4178, 13750, 16516, 14354, 7108, -4369, -12174, -15165, -16891, -14357, -9386, -1945, 5229, 9821, 12052, 9852, 11366, 7329, 3149, -397, -7062, -9420, -9629, -5299, -555, 2152, 2322, 1064, 2295, 4683, 5235, 3242, 587, -1335, -4797, -4673, -5196, -5373, -2509, -1342, 1782, 5854, 8687, 8792, 11335, 11859, 6574, 1086, -7500, -16095, -18926, -17825, -9610, 887, 7573, 12965, 12521, 9521, 6327, 1190, -2584, -5834, -7074, -9240, -7803, -1116, 8521, 16111, 15220, 10670, 170, -10070, -16267, -18126, -15115, -9430, -4052, 3211, 7853, 11165, 16660, 16451, 10599, 2130, -6609, -13795, -14971, -10786, -3957, 1937, 8197, 9471, 6696, 2920, 1061, 49, -3287, -5732, -8612, -9162, -7423, -3088, 4493, 9595, 9735, 9787, 7864, 4642, 2278, -1710, -5044, -5175, -3564, -3463, -4624, -3589, -3588, 67, 5492, 7119, 5080, 1744, 595, -742, 787, 352, -2654, -4931, -7165, -6768, -2745, 4038, 11076, 14886, 13663, 8291, 799, -7902, -13043, -14212, -13872, -10311, -5613, -1898, 3019, 11417, 15536, 16432, 11562, 1486, -7536, -12730, -13443, -12270, -7099, -2593, 4857, 12458, 15290, 13181, 6127, -2104, -7922, -11135, -11668, -10593, -11084, -8190, 493, 9506, 17168, 17054, 10001, 3062, -2895, -6260, -8412, -7270, -7149, -3476, 370, 2872, 6203, 4655, 5130, 3974, 312, -2662, -9923, -10779, -7383, -1631, 5420, 7375, 5871, 3216, 2387, 3170, 4674, 3495, -328, -6495, -7594, -7320, -6347, -4458, -1550, 639, 1588, 2130, 5052, 5730, 3610, 2749, 2183, 802, -7015, -13235, -13264, -6122, 2760, 10790, 13487, 15252, 12240, 8090, 2483, -5428, -12063, -18582, -21066, -17645, -10288, -1241, 11559, 20376, 24913, 21063, 10996, -1599, -6678, -9367, -11247, -11036, -9087, -3994, 1282, 7884, 10568, 11972, 6398, -2638, -10914, -15437, -15859, -11090, -4891, 3609, 12387, 14677, 17602, 16138, 12429, 5582, -2717, -8594, -14891, -15736, -13706, -9485, -4506, -349, 6379, 10187, 10142, 6421, 884, -400, -1932, -4407, -4281, -535, 2089, 3761, 4398, 3354, 3962, 3689, 505, -3508, -6907, -9542, -6514, -4394, -1144, 299, -1789, -942, -1010, 3155, 6906, 5576, 3428, -374, -1486, 2185, 2113, -350, -872, -2205, -1982, -29, -653, 660, 3539, 3994, 2353, -3065, -10976, -13410, -13078, -9611, -575, 6929, 11643, 17176, 22887, 22862, 16906, 3648, -6994, -16235, -23017, -22735, -21446, -13207, -2438, 7763, 14640, 17227, 13977, 7157, 2927, -1412, -3155, -6595, -8689, -4648, 4390, 12587, 15551, 13925, 6715, -2143, -11935, -17665, -18613, -13860, -8082, -3301, 4112, 9026, 13281, 15236, 11143, 6723, 517, -5063, -7925, -8118, -3588, 469, 3049, 4087, 2374, -1528, -3516, -2158, -643, -1138, -2355, -4093, -3199, -1757, 1289, 3868, 2408, 530, -2215, -1564, 1828, 6524, 9164, 9327, 7335, 1936, -2180, -8277, -13250, -12353, -10787, -6184, 1469, 6492, 7336, 6268, 4445, 2785, -3127, -5949, -7425, -8274, -3246, 5242, 15432, 19963, 19770, 13145, 1573, -9434, -17533, -23909, -27152, -24386, -14604, -3142, 8567, 17513, 24521, 27532, 23434, 13890, -946, -11903, -21761, -22509, -15502, -6594, 3413, 8647, 10403, 10775, 6450, 2050, -3346, -9825, -13255, -13314, -9656, -5538, 3906, 12380, 16801, 16450, 12758, 5720, -344, -3661, -5280, -7691, -9134, -8066, -7459, -4655, -1982, 2312, 5116, 6348, 4877, 1340, -2560, -3648, -2735, 2231, 5154, 2979, 40, -3494, -2334, 2815, 7041, 6959, 4100, 922, -3586, -7244, -7010, -7470, -8159, -8606, -6815, -4224, 1272, 7767, 14878, 18602, 14775, 7150, -3625, -10232, -10880, -8399, -5074, -2355, 509, 4426, 7724, 12503, 8376, -2710, -10278, -15891, -17675, -14168, -7177, 3229, 11682, 20368, 25453, 21897, 12646, 918, -7279, -14701, -17948, -20501, -18893, -11168, 17, 12093, 18518, 19146, 12924, 3211, -6074, -13569, -15934, -13608, -9736, -3300, 6199, 15938, 21623, 21448, 15521, 3528, -7734, -14833, -19341, -18012, -15888, -10022, -2638, 6197, 13417, 12992, 9468, 5846, 2686, 241, -2030, -6260, -5502, -1719, 3252, 5765, 1786, -2475, -4282, -3541, 423, 3860, 2046, -1388, -2513, -989, 1897, -826, -5410, -8373, -8865, -3662, 3116, 9487, 12455, 14698, 13365, 8550, -26, -8857, -13478, -16310, -13417, -7019, -531, 6606, 11374, 11939, 9699, 3080, -3877, -10299, -16264, -15356, -8147, 4018, 14923, 24203, 27415, 20548, 10188, -2759, -12143, -20649, -25374, -25020, -18940, -5734, 6118, 15055, 20127, 21538, 14445, 2017, -6499, -11317, -12835, -8025, -4568, 1516, 10131, 12567, 14511, 10175, 1161, -6656, -14300, -16956, -15475, -12145, -5337, 2171, 9387, 14110, 13083, 10158, 6896, 3354, -803, -3517, -5534, -6927, -5617, -1709, 1270, 44, -2036, -2784, -1852, 169, 1113, 1339, -387, -274, 1534, 331, -443, -3047, -6329, -6103, -2875, 1745, 7421, 13290, 14968, 12885, 10135, 2830, -7260, -15418, -20828, -19735, -13117, -5200, 1349, 8111, 11206, 12594, 12487, 6539, 80, -5564, -9126, -8618, -4755, 1715, 9041, 16376, 16480, 10779, 1333, -12195, -21081, -24979, -23437, -15874, -8479, 3374, 14971, 21647, 28122, 22732, 13380, 2693, -10903, -16379, -18013, -13750, -6992, -323, 5552, 8262, 9594, 7314, 1618, -3241, -7276, -11266, -11407, -10397, -6497, 893, 11138, 16980, 14864, 11230, 3156, -3218, -4960, -6701, -6494, -4975, -5150, -4140, -3362, -1085, 1933, 3543, 3926, 2668, -25, -3242, -3906, -3190, 669, 1282, 1198, 200, -2234, -981, 3046, 12116, 13981, 12852, 7580, -1063, -5554, -10540, -11882, -13870, -16385, -13569, -9019, -2105, 8719, 17517, 23023, 21639, 13269, 2455, -5755, -8849, -9242, -9588, -7096, -2866, 2328, 5767, 6901, 5082, -176, -4882, -10091, -11395, -12758, -10606, -4283, 7671, 20202, 25782, 23677, 14672, 4879, -3905, -12134, -17642, -20135, -20781, -15118, -4825, 6669, 15058, 17011, 14579, 8903, 3669, -4713, -11723, -13071, -13782, -7813, -174, 9294, 14893, 15225, 12986, 7241, 1540, -6085, -13207, -15738, -12976, -8315, -3250, 522, 4010, 5599, 5900, 4731, 4031, 1058, -520, -115, 719, 1876, 1126, 1469, 21, -767, 805, 1693, 3795, 5719, 2294, -2076, -7821, -10706, -10165, -10515, -8804, -7153, -1993, 6736, 16453, 22176, 22255, 18184, 9829, 2097, -8883, -19322, -23110, -22224, -14611, -3271, 5359, 10011, 13223, 12796, 8316, 1578, -3110, -9663, -13390, -11025, -5965, 4092, 10250, 19166, 22367, 13323, 5128, -7319, -18030, -20910, -22044, -18613, -12443, -1012, 11054, 17260, 20672, 17045, 9835, -79, -8837, -11581, -12262, -9860, -2423, 6989, 14380, 13804, 10137, 5769, 20, -3651, -10493, -15692, -16123, -12510, -4665, 726, 6617, 9643, 10918, 11773, 10210, 7592, 978, -3434, -5127, -4339, -1628, -1189, -3499, -4400, -4832, -3320, 991, 1875, 1230, 1900, 928, 333, 959, -3343, -6347, -7154, -3283, 2070, 5751, 10578, 12401, 14546, 11954, 4783, -3616, -13214, -19560, -21177, -17310, -10077, -3189, 6808, 14013, 17636, 18188, 10609, 1274, -7287, -12262, -12344, -9993, -7652, -271, 10042, 19044, 22163, 15346, 1377, -10488, -17246, -21780, -20754, -16846, -8868, 1202, 11167, 19313, 21595, 17722, 9988, 1281, -7194, -13004, -12759, -11402, -7304, 1285, 7143, 12031, 10514, 3950, -2211, -8100, -10403, -10693, -9922, -6387, -2470, 4884, 13045, 16677, 16240, 10336, 4164, -1069, -6087, -9114, -9709, -8509, -5545, -2312, -1383, -48, 1771, 5003, 8304, 8039, 5569, 1585, -1869, -2368, -512, -1213, -6207, -9380, -8035, -2407, 5122, 8184, 11595, 11511, 7075, 3502, -4035, -11008, -14362, -13967, -11498, -5880, -2418, 1212, 9473, 16115, 17881, 13440, 3331, -5925, -11128, -12752, -9844, -6138, 795, 9163, 15125, 16592, 9552, 402, -7426, -13222, -15413, -16673, -15670, -11175, 1144, 14690, 25142, 28684, 19732, 7477, -4492, -11095, -14026, -14979, -13622, -11570, -5204, 1676, 7990, 10851, 8743, 5451, 888, -5504, -10565, -11215, -8740, -1156, 6856, 12242, 12099, 6191, 3023, -201, -2686, -4552, -7424, -9660, -10502, -6650, -1489, 4028, 6397, 6100, 4037, 964, -270, -1213, -325, 1460, 3731, 1715, -3761, -6869, -6963, -4257, 2407, 8306, 9843, 8403, 8145, 6556, 1965, -2885, -8514, -12833, -16254, -17049, -12246, -2319, 9157, 20279, 22648, 19924, 13251, 5743, -919, -9297, -12608, -14224, -12821, -7137, -500, 6702, 13087, 12293, 6737, -1199, -8949, -13426, -13480, -8975, -1575, 7065, 13962, 19045, 19558, 13680, 3851, -5518, -12474, -19392, -19856, -16236, -12624, 1221, 10853, 15439, 16986, 8453, 1359, -4688, -9729, -10093, -10112, -7067, -516, 5593, 13637, 15423, 11593, 6256, -2097, -6898, -11836, -14004, -10864, -5527, 835, 3898, 5765, 5780, 4336, 5521, 6321, 2845, -606, -4764, -8246, -5916, 1016, 5035, 3208, 1176, -424, 903, 3058, 4436, 2828, 872, 237, -1541, -4735, -10391, -14353, -13731, -7961, 785, 7383, 10322, 14369, 19683, 21148, 16136, 5233, -8776, -19582, -24066, -21099, -15339, -7715, 1469, 10081, 14679, 15388, 10777, 3367, -703, -5360, -7004, -8583, -8195, -4236, 5643, 14313, 18592, 15883, 5536, -3321, -10279, -13842, -14047, -12154, -9789, -3150, 1827, 7769, 10409, 7537, 5557, 2762, -599, -2750, -5240, -5324, -3032, 361, 5789, 6313, 4023, 1765, -815, -1860, -2815, -6802, -8265, -8284, -5812, -1947, -308, -1062, 931, 5314, 5643, 6138, 4379, 2952, 2388, 1131, 2920, 1195, -4061, -9584, -12414, -8319, -2895, 3623, 7394, 7330, 6313, 1966, -3219, -7670, -9821, -9828, -8519, -2917, 4462, 12320, 20679, 22412, 20832, 14976, -1087, -12573, -21358, -24964, -21556, -17190, -8320, -742, 9258, 17032, 21417, 18723, 10059, 1500, -5002, -7926, -9993, -9433, -5674, 1406, 8307, 14167, 13316, 7939, -738, -8838, -12886, -13453, -13085, -15078, -12094, -6025, 4012, 14236, 16065, 15986, 12868, 7726, 5206, -1285, -6787, -8401, -8540, -7152, -4424, -2308, -2069, -660, 1850, 2278, 1784, -376, -5361, -5668, -893, 4585, 6894, 7025, 4367, 2046, 4504, 5484, 3426, 683, -3321, -5590, -4611, -6428, -8735, -7870, -7886, -3345, 3014, 5677, 5467, 5875, 8021, 7424, 3660, -1794, -6766, -9103, -3911, -795, 4290, 10382, 12460, 11102, 6239, -1723, -9457, -11900, -15314, -17158, -15078, -9904, -3288, 8789, 18387, 24274, 23243, 17035, 7832, -2274, -8887, -14464, -13632, -11767, -6135, -387, 3180, 8244, 8674, 5743, 1026, -6746, -10992, -12522, -10180, -2077, 6044, 13272, 18324, 17169, 14404, 7943, -747, -6214, -11477, -12906, -13162, -9938, -7816, -3583, 3782, 4620, 4543, 3446, 700, -1202, -2891, -1555, 3597, 8237, 10480, 9662, 3703, -1292, -2789, -3349, -3878, -8140, -12361, -11154, -7029, 1058, 7020, 3231, -498, -3678, -2383, 1268, 4223, 5404, 5850, 7867, 6621, 6664, 2476, -2086, -4884, -7722, -8253, -6524, -3768, -497, 4316, 8333, 6853, 108, -6332, -12433, -15386, -11565, -4720, 3575, 12502, 19733, 24841, 25741, 17727, 5906, -6951, -21167, -26991, -26801, -21995, -12916, -1781, 8238, 14557, 17429, 13468, 6900, 577, -5424, -6330, -5641, -5539, -1328, 6899, 15335, 16437, 11571, 2936, -8066, -14838, -19231, -17689, -11318, -6501, -127, 4284, 8846, 10048, 8821, 9100, 5411, 1529, -753, -5244, -4250, 2823, 5168, 5908, 252, -6962, -9571, -10907, -5509, -261, 2605, 4446, 2863, 3856, 3749, -1535, -4325, -4693, -3792, -1899, 458, 4710, 9088, 14311, 14261, 7930, -766, -11402, -18294, -19809, -17425, -9279, -56, 7803, 13559, 14703, 12472, 4330, -3797, -9799, -14286, -13612, -10990, -4012, 10072, 22400, 26152, 21739, 11029, -3194, -14767, -21714, -26009, -24359, -16249, -8893, 2546, 15056, 23691, 27803, 20234, 10531, -1104, -9986, -12188, -12010, -7901, -2341, 4300, 9921, 9485, 4813, 738, -5052, -9513, -11014, -10688, -8722, -4188, 2186, 8985, 14227, 14058, 9373, 3162, -1206, -3044, -1844, -2345, -3996, -2207, -1816, -1636, -1327, -4490, -5927, -4497, -610, 2513, 1599, 1721, 990, 3395, 5067, 2041, -3223, -6008, -4173, -230, 5192, 8433, 12115, 11661, 6181, 195, -7669, -15945, -19841, -19661, -13102, -4298, 4799, 15018, 20302, 22242, 18544, 9322, -882, -11333, -18760, -18882, -13870, -3542, 6327, 14700, 19331, 16538, 10115, -75, -10628, -19281, -23040, -20905, -15257, -5166, 6479, 16725, 23794, 24016, 18047, 7461, -132, -7427, -12933, -13591, -12304, -7424, -1520, 2723, 2744, 2054, 288, -815, -1578, -2080, -3202, -3062, 1816, 6029, 9112, 8707, 7757, 5286, 930, -2364, -4335, -4361, -4389, -3433, -3840, -2392, -2250, -2424, -4961, -6045, -3802, -2922, 1079, 5008, 8764, 10867, 10850, 8618, 5168, -2692, -9231, -13012, -10919, -4499, -563, 4790, 7177, 7151, 5726, -848, -6351, -10269, -14381, -12411, -8308, 2541, 10380, 14355, 18728, 18339, 15838, 5457, -6189, -13472, -16195, -14305, -11229, -6196, -1767, 4594, 12423, 13847, 10889, 1032, -9493, -13554, -11181, -5204, -1196, 2013, 4403, 10087, 15058, 15780, 12466, 4286, -3873, -8008, -10005, -10087, -9992, -8846, -5797, -6517, -4536, -1842, 1172, 5860, 9736, 11464, 10162, 8385, 3151, 815, 1571, -472, -2387, -5208, -9047, -9216, -6795, -2946, 1113, 4685, 3847, 711, -2134, -6041, -7802, -7096, -3894, 768, 5409, 10662, 14966, 16280, 14094, 6657, -3024, -11204, -16919, -20684, -20463, -14097, -3844, 6548, 12953, 15010, 13771, 8238, 1819, -1388, -4947, -7602, -9101, -9091, -3081, 5713, 14641, 17985, 13419, 4554, -5315, -11788, -13204, -10338, -8209, -7522, -4407, 333, 6248, 9933, 10077, 9047, 4322, -2312, -7599, -8353, -2806, 1555, 6433, 8795, 6054, 4020, 1085, -231, -1392, -4212, -8249, -13119, -16160, -10548, -3487, 2787, 9100, 10282, 10316, 7713, 6449, 7346, 5465, 3379, -544, -3311, -3365, -6908, -10405, -11609, -8225, -2504, 3290, 3476, 1409, 1599, 2211, 7338, 7591, 1694, -5004, -8811, -6421, 2911, 9906, 12352, 12419, 6314, 1483, -3356, -8475, -12235, -16080, -17542, -13907, -6755, 262, 9809, 16329, 21675, 22335, 10271, -1446, -11019, -15349, -13854, -12701, -7244, -8, 6742, 13012, 17804, 14499, 7273, -3667, -15127, -19425, -20722, -15680, -7662, 3787, 15203, 19913, 20224, 14776, 7544, 2625, -5384, -10247, -10421, -10513, -8656, -3676, 6437, 12155, 10598, 6303, -1932, -8609, -12586, -14709, -9759, -4241, 1664, 6491, 9903, 13971, 14687, 14153, 9441, 3647, -1761, -6864, -7757, -6258, -5518, -8804, -10884, -8687, -7181, -3774, 2316, 6370, 12106, 15270, 13378, 10763, 4654, -222, -5342, -9701, -9434, -8980, -7874, -7, 8783, 12285, 9856, 874, -5531, -10984, -13692, -14995, -13323, -6833, -32, 10880, 21457, 25872, 22307, 11428, -1325, -12255, -19233, -19110, -18203, -12757, -1436, 6567, 13282, 16545, 13798, 5759, -5104, -11497, -14328, -14303, -10476, -3365, 4665, 13858, 22825, 21939, 16162, 6105, -4517, -10129, -14222, -13362, -12273, -9017, -2951, 3016, 8040, 6497, 4048, 527, -2470, -3205, -4457, -2929, 855, 5383, 10421, 11257, 7502, 2625, -2169, -4310, -5199, -6384, -7222, -5145, -3622, -2618, -1922, -4879, -6571, -6336, -2614, 3502, 7559, 11725, 13985, 15106, 15676, 9055, -1764, -11882, -20317, -21470, -19288, -14643, -3771, 8562, 16161, 14699, 9601, 2915, -2729, -6095, -8817, -10412, -8803, -4257, 6462, 19590, 23611, 19936, 10067, -1597, -11076, -18332, -22609, -23883, -17837, -6016, 5472, 12888, 18279, 17199, 13195, 11405, 1180, -6259, -12418, -16150, -10805, -2351, 8462, 14581, 12035, 8262, 4220, -1688, -7137, -12088, -12077, -10276, -5070, -2340, -104, 2593, 2671, 4851, 5367, 4641, 3673, 2661, 2832, 6669, 9484, 7161, 253, -10242, -13466, -12497, -10893, -4564, -1943, -603, 1991, 3910, 7460, 7304, 2642, -808, -4742, -5317, -3019, 3146, 12085, 16264, 15098, 9957, 563, -10551, -16422, -21022, -23472, -17265, -9684, -490, 10669, 16547, 22551, 20436, 12307, 2789, -8707, -14695, -14865, -9276, -1889, 5677, 10944, 13805, 12775, 5970, -133, -8068, -15609, -18519, -19939, -18123, -9276, 3479, 15220, 25620, 26845, 20257, 9259, 966, -5915, -11972, -15416, -15578, -11263, -7264, 660, 7541, 11208, 10572, 5390, -476, -5504, -9290, -9695, -6082, 1030, 6403, 5621, 1933, 1997, 5565, 8695, 8462, 7134, 4537, 123, -2504, -3423, -2632, -6274, -10408, -12656, -11239, -8911, -2863, 3375, 11026, 17962, 14537, 12152, 5700, 241, -2696, -6653, -5893, -4827, -4783, -2022, 3138, 5938, 6494, 2059, -6754, -11698, -14818, -14539, -8263, -2290, 7356, 18422, 22353, 22085, 16449, 6386, -3049, -10005, -15251, -20639, -21246, -12569, -100, 11568, 17486, 16368, 9064, -1281, -9549, -13996, -14428, -13013, -9596, -2918, 8517, 18498, 24691, 22016, 12821, 2800, -8194, -16686, -20908, -19446, -15666, -8483, 1582, 8711, 12122, 11684, 8702, 5610, 2134, -3636, -7346, -7109, -6593, -1394, 4000, 8703, 10172, 6660, 2649, 1467, 3019, 2011, -3535, -7049, -8620, -9561, -6601, -6842, -6984, -6815, -3957, 1329, 9062, 13975, 14735, 18911, 18640, 14816, 3397, -10011, -18605, -21033, -15869, -8843, -649, 6305, 9133, 11277, 12179, 7276, 822, -5688, -9586, -11510, -7634, -759, 9365, 20458, 20266, 15343, 6538, -7547, -17475, -24392, -28298, -25740, -18003, -5402, 3887, 14869, 20848, 20864, 16765, 8223, -1052, -10937, -14906, -12025, -4913, 2489, 8143, 9164, 11386, 8361, 2258, -2443, -9434, -14792, -14894, -11132, -9103, -4400, 1541, 7254, 12693, 13109, 10026, 5683, 2797, -30, -5620, -6900, -4846, -2661, -2720, -3782, -1146, 1380, 3341, 3702, 3518, 1690, -3167, -5222, -4920, -2255, -1621, -4698, -3177, -480, 6232, 13838, 13721, 12959, 11214, 6372, -107, -7311, -13941, -18367, -20532, -15847, -8977, -2269, 4876, 12692, 19461, 19843, 13693, 1947, -4932, -9093, -11116, -9607, -5391, -27, 4528, 10559, 14621, 12279, 4666, -5178, -16151, -20386, -21095, -19307, -12653, -2306, 11552, 22141, 29600, 25866, 15690, 5468, -5950, -9788, -13243, -16940, -18221, -12008, -1892, 5902, 14146, 12583, 6098, 1810, -5704, -9360, -9765, -8446, -5418, -1872, 6327, 12733, 15447, 15306, 11426, 4308, -2833, -10067, -13572, -13979, -11079, -5426, -390, 2550, 2704, 3559, 3359, 5409, 6691, 4603, 889, -248, -1490, -427, 1372, 2954, 3438, 1480, 1114, 3097, 3494, 1638, 1057, -3642, -5197, -4857, -6189, -10034, -10331, -6725, -1928, 5019, 10010, 14254, 15807, 14126, 12489, 6358, -3436, -11523, -19033, -18562, -13247, -5951, 631, 6189, 8550, 8920, 5831, -1076, -4015, -8181, -10399, -8919, -4478, 3426, 11325, 18345, 22540, 17296, 6411, -4003, -13729, -16805, -18531, -20199, -15118, -6804, 3823, 10186, 15025, 17754, 14222, 7446, -669, -5709, -8419, -9347, -8073, -2357, 4323, 9548, 8461, 7335, 6386, 2723, -1812, -8133, -10226, -9555, -8584, -8026, -4586, 543, 3769, 7513, 10582, 9712, 8603, 5048, 2538, 2436, 1587, -185, -5532, -9428, -10185, -8575, -4847, 147, 4347, 6146, 5200, 4493, 3591, -711, -5444, -9872, -12458, -9687, -5326, 5399, 17700, 21065, 22525, 17864, 4508, -8358, -19514, -24810, -23466, -18753, -11624, -3231, 6021, 13045, 19066, 19566, 15591, 7280, -5087, -13438, -16172, -11161, -4616, 2530, 9605, 13090, 13136, 9918, 3856, -6049, -13893, -17346, -17242, -16204, -10024, -2217, 7666, 18973, 19579, 16771, 8436, 1679, -1776, -5850, -6208, -5720, -4445, -6356, -3508, 474, 1002, 5022, 4857, 1278, -1932, -8233, -9102, -6206, -1730, 1761, 2048, 5241, 5448, 5615, 7574, 8707, 7493, 4298, -1286, -6599, -7712, -9264, -9704, -6062, -3205, -915, 1880, 5107, 8740, 11769, 10686, 4935, -1766, -7478, -11758, -12690, -6342, 85, 5917, 12361, 16552, 16156, 12343, 3936, -5177, -12580, -20565, -23088, -21885, -13821, -3744, 6923, 20560, 24326, 23804, 16949, 3600, -2776, -8781, -11849, -13375, -13363, -8254, -1121, 7275, 12935, 12161, 5447, -1763, -9906, -13108, -14573, -13266, -7798, -2255, 7717, 14881, 17161, 15880, 11492, 5867, -1181, -6813, -9572, -12169, -12154, -8200, -3667, 370, 2985, 2042, 2927, 2863, 616, 719, 745, -464, 344, 3316, 4798, 7043, 5780, 1414, -1838, -799, -1377, -4215, -6227, -6192, -3311, 898, 3551, -712, -4198, -5690, -2309, 3542, 7306, 6442, 4116, 1970, 905, 2851, 694, -1815, -2836, -3337, -3386, 13, 2331, 4417, 6584, 3307, -1175, -8147, -12566, -11531, -10969, -4655, 3126, 6990, 10148, 13438, 19243, 18652, 11150, 2259, -8034, -17125, -21079, -19806, -12744, -5748, 2738, 7316, 8174, 8946, 6292, 5931, 1178, -2304, -3394, -4532, -5330, -2591, 5459, 10132, 13389, 11676, 3917, -2493, -9554, -13306, -13216, -11789, -6603, -2620, -1441, 3023, 9113, 11018, 11447, 7703, 3560, -90, -3300, -2387, -1524, 699, 945, -1357, -3788, -5042, -2765, 22, 782, 823, 1196, -156, -1160, 1425, 2892, -123, -2473, -3116, -719, 1062, 3021, 8151, 8941, 8334, 6042, 626, -5396, -10722, -11632, -10448, -7320, -2224, 3593, 6565, 6189, 7573, 5073, 632, -3083, -8161, -11328, -10046, -3250, 6898, 14315, 18752, 20611, 13332, 2750, -8715, -18728, -21587, -23432, -20536, -14564, -5754, 4981, 14228, 23659, 23811, 17412, 7993, -2596, -8373, -10610, -10858, -7358, -3047, 3227, 7915, 6914, 4087, -594, -5209, -6206, -8009, -9675, -9243, -7751, -414, 10372, 15324, 13261, 10936, 6018, 3286, 945, -1949, -3633, -4897, -6209, -6186, -6199, -8877, -8142, -4676, 1313, 5518, 5836, 3864, 2203, 3715, 6379, 4887, 1025, -2186, -7157, -8343, -2923, 2963, 7525, 6720, 4837, 1793, -2520, -5681, -10112, -10386, -10832, -9337, -5089, 1204, 10455, 16184, 19070, 16172, 6791, -3373, -12297, -13453, -11199, -6200, 11, 4389, 8074, 9963, 11209, 6324, -974, -9539, -18621, -22676, -20928, -13947, 1009, 13858, 24318, 29914, 24045, 15195, 5687, -2605, -10863, -16743, -20413, -19973, -13156, -3430, 5064, 10687, 11837, 9575, 3631, -356, -5258, -6572, -3266, -911, 3496, 6198, 8177, 8031, 8078, 5524, 2761, -3219, -9245, -14274, -14880, -8795, -4031, -2186, -850, -416, -654, 2860, 6265, 10417, 9550, 9029, 7658, 5477, 4914, 291, -5540, -10126, -12070, -10710, -8099, -1874, 4228, 7790, 9996, 5406, 720, -5361, -9484, -8739, -6573, -1331, 3128, 6342, 12379, 14607, 15553, 14045, 4959, -5495, -13901, -16567, -18142, -15256, -8627, -480, 9253, 13143, 12529, 8451, 872, -4497, -6913, -7060, -5059, -2559, 310, 7324, 19983, 24686, 15709, 2040, -8787, -15180, -19319, -22375, -20669, -15770, -8676, 2322, 11193, 20255, 21300, 17249, 11623, 3228, -817, -6333, -9708, -9423, -5392, 698, 4394, 4816, 3064, -141, -4123, -6560, -7766, -10571, -12568, -7997, -1416, 6105, 11369, 13172, 14377, 11931, 9909, 7686, 3129, -3323, -8238, -8087, -8546, -9007, -8892, -9088, -7602, -4656, 976, 7186, 9949, 9371, 6346, 4462, 5061, 2197, -2812, -6971, -9903, -6326, -1251, 5631, 12254, 14054, 11243, 3957, -3051, -10692, -17702, -22050, -20120, -10233, -352, 6892, 14943, 19464, 21170, 15541, 6499, -649, -9798, -14918, -15390, -9204, -39, 7785, 11688, 10984, 7494, 990, -5861, -13706, -16689, -17066, -15885, -10459, 789, 13142, 22160, 26677, 21586, 14223, 3122, -8190, -12304, -14441, -14792, -10625, -5655, -982, 4114, 6551, 5977, 3720, -581, -5135, -10712, -10731, -6816, 316, 8141, 12890, 15800, 13666, 10463, 5352, 1529, -6141, -13237, -16562, -15486, -10623, -7272, -2348, 777, 4703, 8693, 8469, 8284, 5041, 1591, 1073, 242, 1602, 455, -4875, -7258, -5755, -1322, 2533, 4063, 5000, 3973, 3535, -844, -3622, -6917, -9345, -9289, -8449, -3456, 375, 5857, 13407, 18620, 17741, 11690, 1221, -6035, -9259, -13466, -14375, -10115, -6481, -215, 8592, 11025, 11472, 8998, -507, -8201, -14278, -17995, -15838, -8631, 3707, 14298, 22055, 24364, 19820, 12226, 1222, -9685, -17164, -20844, -18818, -16198, -10572, -363, 9804, 18109, 18614, 12333, 3547, -4931, -8186, -6977, -6168, -6536, -1862, 5185, 10895, 16907, 14497, 8139, 1176, -8160, -14514, -17335, -16278, -11954, -3167, 5109, 11642, 13413, 9200, 8326, 7929, 5878, 3051, -1928, -6217, -8765, -7449, -2505, 3106, 6396, 4142, 465, 140, 1783, 1487, -378, -2095, -3931, -4447, -6730, -8118, -4271, -79, 3228, 8436, 9141, 6657, 6145, 5339, 5281, 2374, -5662, -14399, -17444, -13157, -6029, 1332, 7588, 11975, 9626, 3066, -1589, -5478, -7331, -8805, -8931, -3145, 2194, 11001, 20464, 21782, 20819, 8757, -7203, -17929, -24753, -24258, -20953, -10852, -465, 7660, 15470, 18259, 19598, 14047, 5134, -3077, -11718, -15774, -15232, -8354, 1638, 11383, 15910, 15585, 10628, 3012, -5030, -11856, -13653, -15117, -15996, -13934, -3714, 6585, 15714, 20973, 17132, 11705, 2220, -4602, -6354, -6125, -6884, -8178, -4052, -1562, -924, 1676, 3739, 6645, 3986, -1001, -4533, -6222, -6297, -3547, 329, 1236, 1352, -2027, -2852, 893, 8933, 12015, 9716, 6783, 3654, 662, -5297, -9973, -13639, -14068, -12046, -7321, -802, 4282, 7496, 10935, 12465, 7535, -429, -7367, -10236, -7395, 946, 6375, 10199, 12819, 8741, 6463, 1021, -6092, -13358, -22830, -24552, -20366, -9082, 5206, 17036, 24908, 23927, 18331, 9148, -330, -8249, -14654, -17298, -12803, -5268, 1570, 8944, 14178, 15132, 10184, 2638, -8684, -17104, -18412, -16268, -12243, -5515, 4035, 12761, 20213, 22488, 18261, 11354, 2040, -7480, -13181, -17244, -16328, -10137, -2511, 3983, 7833, 9321, 8644, 6733, 3443, -1678, -6687, -8858, -6532, -2594, 255, 1590, 3243, 6015, 6666, 6738, 5934, 4615, 3541, 516, -2433, -5105, -6676, -8146, -9368, -7216, -5855, -4786, -1826, 2936, 8198, 12216, 11327, 8140, 4598, -1164, -5666, -7078, -4867, -2227, 1469, 3274, 5266, 3009, -665, -4063, -11524, -14133, -17563, -15667, -6627, 1720, 12759, 22930, 26230, 23897, 17961, 5779, -7921, -15896, -20785, -20645, -16263, -11013, 339, 11155, 18867, 20197, 10336, -319, -10244, -15077, -15829, -13616, -5439, 4296, 13749, 22482, 27691, 21641, 11217, -1064, -13308, -21113, -23078, -21170, -14972, -4343, 6158, 15068, 17793, 14331, 8209, 2793, -3172, -6929, -7375, -7745, -7028, -2230, 2690, 10405, 14856, 10783, 5873, -1103, -4475, -5114, -6456, -9193, -9516, -8837, -7598, -4484, -1669, 2194, 4445, 6585, 8858, 7656, 6333, 6712, 7364, 6855, 2504, -6366, -14854, -15089, -10825, -1834, 5114, 3327, 1563, -1871, -7178, -5387, -3417, -3861, -1272, 1076, 5997, 9762, 16050, 20754, 17132, 10171, -1307, -12537, -20695, -25769, -24283, -16269, -4489, 5777, 12515, 15517, 13576, 11474, 6550, 158, -5764, -12999, -15129, -10654, 1516, 14819, 21220, 21036, 13561, 3632, -7410, -15408, -18588, -19684, -16116, -11949, -5515, 4501, 11843, 15595, 19538, 15949, 9392, -753, -9747, -8761, -7646, -3911, 694, 2581, 3145, 4188, 5075, 4943, 2063, -4072, -10257, -11290, -10855, -9659, -7569, -3484, 2326, 8980, 12600, 11698, 13121, 11315, 9471, 6242, 903, -3957, -9543, -14978, -16851, -14423, -7879, -3342, -342, 2625, 3493, 3261, 5572, 6732, 3248, 3530, 2200, 1190, 1391, 2048, 3423, 6883, 6781, 4181, -1099, -8732, -12319, -14505, -11743, -8746, -6642, -2866, 1864, 7067, 13982, 17917, 16782, 12148, 3919, -5320, -8846, -11081, -10681, -4285, 973, 4175, 7149, 5633, 4189, 2933, -2801, -6433, -10204, -13501, -14743, -9473, -676, 10137, 19971, 22739, 19681, 10380, 3847, -2472, -8147, -9384, -13352, -16735, -16719, -8503, 3677, 10497, 13621, 9976, 3021, -2936, -8465, -10305, -7835, -2918, 1810, 3296, 4007, 8372, 14269, 16721, 13827, 7073, -3956, -15073, -20755, -20907, -13316, -6981, -3151, -1382, 680, 3316, 6533, 10874, 12525, 10809, 7871, 4908, -1431, -1527, -2018, -3799, -5219, -7430, -6370, -3900, -704, 546, 3379, 1901, -685, -621, -4317, -6586, -5606, -4457, 826, 6799, 10281, 13250, 11137, 11484, 10108, 93, -7341, -14726, -19199, -16368, -11487, -5212, 4475, 10977, 13429, 12841, 7168, 392, -4765, -10183, -11668, -4876, 2836, 8650, 12567, 14966, 14104, 7498, 242, -8334, -16439, -19220, -18853, -13334, -5046, 3888, 10849, 13974, 18149, 14497, 7246, 183, -8033, -8095, -8986, -8273, -4130, 1102, 8591, 12159, 12589, 7910, -876, -9709, -15681, -16752, -11620, -8544, -5051, 394, 4651, 6652, 9350, 13713, 13063, 10852, 4823, -1426, -8497, -9483, -6514, -5913, -2943, -3934, -3863, -3144, -2520, 3448, 8302, 9167, 7675, 875, -3975, -4676, -4078, -2943, -3216, -2146, 2442, 6023, 10430, 14003, 13339, 10477, 1856, -9473, -15785, -19918, -21312, -15073, -5165, 6747, 13644, 14915, 14423, 12523, 8370, 3152, -3365, -8330, -12920, -14327, -9391, -451, 11146, 13726, 11823, 7720, 1021, -6517, -11614, -11620, -7785, -6108, -5998, -2149, 5159, 13651, 14857, 13329, 9465, 1413, -5949, -12001, -9608, -3707, -1535, -864, -1773, -933, 2213, 2587, 4189, 5739, 1898, -3237, -8194, -8975, -6442, -1503, 1573, 1467, 1884, 2836, 5018, 7919, 7905, 6968, 4439, -1345, -7129, -13633, -14651, -12627, -8007, -2661, 2228, 7872, 14130, 14341, 10173, 5324, -1710, -7364, -12665, -13044, -8588, -794, 7367, 15993, 19532, 14466, 5396, -5260, -14389, -16833, -18380, -19473, -13684, -4084, 6157, 12886, 21269, 25111, 21382, 10700, -2583, -9788, -16053, -17177, -15093, -11041, -2072, 4407, 10696, 14070, 12614, 9721, 4803, -1106, -6658, -11247, -11985, -10178, -4749, 900, 5455, 9766, 9502, 7177, 4398, 3156, 1264, 268, -2779, -6476, -6911, -6950, -6548, -3797, -714, 847, 1963, 2137, 625, -538, 2463, 3482, 1463, -2770, -6104, -8057, -2853, 6239, 10489, 11093, 7681, 3879, 1311, -5905, -13385, -16282, -18572, -14901, -7855, 698, 7279, 16254, 22580, 19431, 16366, 5775, -6141, -12086, -15189, -12960, -8740, -5811, -222, 7832, 14705, 16023, 8036, -462, -8012, -13523, -12738, -10418, -8723, -1284, 9168, 16366, 21389, 18142, 11098, 4711, -4611, -11290, -15423, -16075, -13049, -9873, -1105, 6617, 14162, 14290, 8551, 3859, -1474, -2788, -3633, -5198, -6231, -5803, -4932, -285, 6587, 10213, 8014, 5289, 3216, 1157, -1628, -5904, -7820, -7236, -7377, -8178, -7536, -5854, -2113, 2540, 7714, 12046, 13374, 12054, 8978, 6740, 4057, -4282, -12856, -16819, -16082, -8782, 599, 8042, 12212, 9265, 5587, -1450, -7601, -10723, -14186, -11323, -3925, 3137, 12571, 21144, 22335, 20647, 11062, -1985, -12576, -19499, -23488, -22682, -16897, -7769, 3934, 12668, 19571, 20224, 13442, 5849, -3139, -11620, -14136, -14642, -9248, -1928, 7509, 15502, 17782, 16504, 8165, -739, -9705, -16105, -18328, -19500, -15779, -6352, 2490, 12565, 17880, 14844, 13444, 10729, 4716, 142, -7114, -13184, -13915, -10889, -4489, 2620, 7753, 7853, 7550, 6270, 1998, -2958, -6252, -9045, -7888, -6202, -5841, -5881, -3341, 4633, 10781, 15732, 15862, 8298, 4803, 3525, -74, -2945, -9813, -16295, -18377, -15396, -8314, 1387, 9840, 12740, 12208, 9418, 5504, -111, -5002, -7439, -9222, -7233, -3212, 850, 8003, 13911, 17350, 14679, 4106, -6788, -15691, -20634, -19108, -14286, -6187, 1250, 6764, 14358, 19539, 17424, 13147, 6270, -4238, -11689, -13475, -10097, -6005, -227, 6155, 7129, 7084, 5752, 782, -2307, -6860, -10084, -9239, -11034, -6861, -372, 6487, 17022, 19380, 16337, 9220, -574, -4065, -5401, -7771, -8235, -8332, -8594, -7993, -4237, 96, 5019, 8981, 8466, 5802, 1900, 174, -2348, -1219, -1629, -3518, -3060, -4452, -3661, 2912, 9338, 10441, 10596, 7230, -132, -5511, -9944, -13594, -11988, -10449, -6185, -2506, 2684, 12778, 16229, 14613, 10699, 2615, -4615, -11643, -14896, -11361, -5152, 1713, 6225, 10463, 11609, 11970, 7444, -2251, -8866, -13977, -17313, -16387, -12522, -4610, 4970, 14031, 20018, 19406, 13513, 6712, -127, -5529, -11842, -13255, -12161, -11982, -3408, 4378, 11663, 12256, 6779, 1420, -4620, -7415, -8909, -9585, -5255, 692, 7634, 14881, 15545, 13373, 6915, -922, -5674, -9283, -14278, -16659, -14615, -6148, 2194, 7652, 9530, 8477, 7404, 4196, 1872, -155, -2236, -6135, -6202, -4113, -188, 2320, 2018, 1566, 4672, 6106, 3110, -1337, -5202, -3356, -1641, 97, -3844, -7610, -8935, -7222, -3258, 3238, 6226, 7453, 9700, 8534, 8886, 3804, -2387, -7862, -11094, -11106, -8533, -2253, 4720, 8765, 9505, 5581, 66, -3134, -7057, -10128, -12287, -7492, 593, 8637, 16004, 19419, 20349, 13665, 4514, -3678, -14906, -20762, -23682, -21264, -10162, 1741, 12524, 17196, 17652, 13289, 5069, -1964, -8499, -11043, -11587, -9189, -3055, 4771, 14359, 18682, 14955, 6420, -1749, -9620, -17179, -20665, -16364, -9547, -1009, 7456, 11725, 16455, 15609, 13501, 7783, -1720, -9594, -15115, -16120, -11781, -4583, 3167, 10437, 13009, 12436, 9620, 4104, -1938, -6712, -9012, -11259, -11750, -10870, -9644, -2992, 5070, 9582, 11826, 12097, 7388, 4397, 3484, 5316, 5773, 2810, -3578, -12890, -15089, -13299, -9705, -2487, 2961, 4094, 6208, 5758, 6104, 6235, 6, -4352, -4028, -6939, -5924, -1322, 6535, 15176, 16168, 12730, 3283, -9251, -14560, -18261, -18852, -14226, -8241, -216, 5888, 14777, 18964, 20872, 16130, 6828, -3189, -13948, -17295, -14351, -7948, 647, 7943, 10252, 11812, 5991, -140, -2616, -6320, -9985, -11920, -10514, -7398, -1154, 11439, 19220, 21575, 15973, 2947, -5266, -9931, -11648, -10416, -6887, -6313, -3877, 1633, 7623, 12313, 12203, 6813, -2213, -7262, -9959, -13121, -11605, -4835, 1152, 5710, 7353, 7309, 9718, 12213, 11084, 7594, 1870, -6935, -14239, -15251, -10009, -5061, -4101, -3693, -3395, -500, 3747, 7134, 10480, 11724, 9855, 5255, -895, -4497, -5777, -6098, -5626, -4850, -2106, 2653, 7567, 8055, 6080, -66, -6378, -8197, -10914, -13705, -11827, -4104, 6766, 16231, 20454, 18709, 12747, 8554, -54, -8340, -13212, -18688, -19593, -14331, -4881, 4476, 9315, 12618, 12069, 7766, 2430, -6278, -9835, -8375, -6247, -3504, 553, 6339, 13651, 14367, 10061, 5174, -1429, -8733, -13903, -14305, -13004, -9543, -4553, 1592, 6076, 8278, 9275, 9473, 6746, 1975, -2260, -4972, -4920, -1065, 2427, 3625, 2727, 1886, 2696, 2770, -941, -5360, -8502, -10402, -7093, -2255, 1125, -747, -957, 1411, 4839, 8604, 9448, 7171, 7847, 9761, 5746, -373, -8707, -13628, -14883, -13435, -9750, -4878, 942, 8110, 11504, 14116, 10143, 1576, -3489, -8489, -10698, -9808, -5312, -462, 7019, 15101, 18306, 14946, 6781, -2951, -10846, -18326, -22412, -21788, -15111, -4111, 6366, 13672, 18149, 19398, 14530, 6979, -1482, -6536, -9237, -10020, -10081, -3012, 3082, 7817, 12598, 8147, 2653, -3279, -9687, -10848, -11295, -9161, -5031, -1569, 4217, 10422, 14130, 14056, 11856, 6108, 419, -6176, -8531, -8854, -6657, -4439, -5679, -4350, -930, 2658, 5310, 6472, 2173, -1541, -3861, -2773, 876, 1040, -2481, -4483, -3105, 179, 6124, 11295, 11626, 10274, 4531, -387, -6059, -12642, -12972, -14554, -12464, -7694, -3770, 3012, 11559, 18337, 18928, 12433, 3801, -3814, -9461, -11492, -8959, -4516, -1909, 1932, 7378, 11214, 11572, 6771, -383, -7981, -13869, -16081, -17196, -11850, -4433, 4533, 12723, 17111, 18975, 14626, 9299, 3535, -259, -4217, -8231, -13763, -15364, -10485, -2539, 4966, 4643, 3943, 2188, 1372, 1617, -163, -2705, 755, 3973, 5791, 7035, 2531, -387, 519, 259, -1442, -4520, -6715, -4697, -3196, 2213, 2748, -1325, -3932, -4638, -2592, 2856, 4401, 1605, 1988, 478, 2478, 1460, -1659, -4309, -4842, -1923, 2227, 6953, 8593, 6838, 4031, 2365, -3391, -8126, -12438, -17998, -17283, -11724, -3850, 6729, 15359, 20834, 21881, 17122, 9867, 1804, -5621, -14597, -18958, -15881, -9835, -2196, 4492, 9608, 10402, 9167, 3378, -4818, -9545, -11940, -10773, -6878, -631, 7713, 16473, 19130, 18726, 13158, 5363, -1586, -9460, -14221, -16655, -16508, -13230, -7736, -491, 6212, 9485, 7789, 6321, 6679, 6822, 6814, 3570, 2422, 2372, -903, -6148, -6950, -7177, -5110, 201, 388, 2007, 4717, 5129, 4406, 161, -5348, -9923, -12703, -11654, -5609, 2867, 8168, 13263, 13137, 12812, 9953, 2108, -3108, -11861, -16282, -13787, -9735, -2398, 6516, 10756, 12063, 7550, -324, -6020, -14084, -16360, -13303, -6778, 388, 8182, 17483, 24802, 26390, 17841, 6469, -6081, -17652, -23211, -25308, -19581, -10011, -906, 5560, 9742, 14515, 12089, 8122, 2722, -2177, -4401, -6348, -5782, -1025, 6580, 12172, 13771, 9114, 1561, -4913, -9539, -12854, -14016, -12468, -10004, -7119, -1168, 4259, 8839, 13035, 13015, 9490, 4731, -599, -3118, -1986, 162, 1153, -553, -3916, -5758, -5362, -2413, 910, 1106, -11, -1379, -1243, -430, -168, -2205, -3361, -3001, -2046, 3332, 6995, 11069, 14214, 11300, 7800, 207, -8939, -14030, -17390, -16102, -11943, -5234, 3365, 10175, 14738, 14439, 7645, -649, -8071, -14117, -13622, -9626, -4294, 5140, 16899, 23864, 24614, 18568, 4514, -5873, -17127, -26132, -26823, -24470, -15802, -5077, 5805, 15802, 21932, 20211, 13481, 5852, -708, -5658, -7790, -6603, -5554, -1753, 2517, 8167, 10330, 4884, -2731, -9858, -11802, -9954, -8802, -8029, -4209, 1164, 7195, 11842, 10931, 8997, 6228, 5477, 5391, 2261, 241, 179, -2484, -3169, -4837, -9309, -10330, -10006, -5010, -247, 2812, 2200, 2915, 6204, 8473, 10139, 7811, 1184, -3286, -2584, -1488, 2154, 2577, 3239, 3042, 676, -2341, -8684, -11807, -12323, -11194, -6315, -1473, 4687, 12192, 14422, 15458, 12722, 2966, -5964, -13767, -14845, -10865, -6388, 1718, 9412, 15327, 18094, 12430, 2377, -4699, -12225, -19802, -22752, -21772, -16994, -4611, 11088, 23253, 29144, 24229, 15619, 8206, -293, -6798, -11997, -15352, -15263, -11442, -5280, 480, 5021, 6346, 5285, 2210, -1658, -5681, -7370, -5664, -810, 5031, 8738, 9633, 9503, 8230, 6650, 5679, 1013, -3768, -9715, -13458, -11977, -9375, -8437, -8184, -5885, -3624, 2344, 9962, 14768, 14992, 13896, 11038, 7466, 2500, -4504, -10952, -14483, -12081, -9067, -3794, 2010, 7172, 10064, 10397, 4940, -3380, -7487, -12053, -12159, -5242, 1733, 8866, 14940, 16818, 16552, 11349, 3190, -5578, -13389, -18453, -19109, -13025, -5115, 3359, 13040, 16181, 15742, 8968, -621, -7268, -13634, -14773, -13898, -11556, -5461, 7177, 18636, 25408, 24756, 16146, 2793, -9221, -16632, -21537, -21794, -19770, -15309, -9494, 27, 8757, 16141, 17480, 14335, 8659, 762, -5017, -7382, -3711, 716, 4735, 5576, 3881, 112, -1762, -2886, -3774, -7493, -13054, -12474, -9499, -3687, 3195, 6581, 8660, 9920, 9162, 8437, 6434, 6845, 6257, 5048, 3468, -2627, -11120, -15249, -16524, -12610, -4895, -593, 4564, 6507, 10164, 10532, 8375, 5989, -1002, -7901, -12261, -10633, -3899, 3478, 9415, 14032, 11499, 7932, 1918, -6244, -10469, -14848, -15606, -13707, -11211, -3329, 6293, 14415, 18624, 14232, 5659, -5136, -11923, -12728, -9467, -4725, 362, 7895, 14305, 18461, 17201, 9670, -2386, -13200, -19275, -20738, -19577, -15139, -6822, 5074, 16652, 23176, 21862, 15772, 10008, 5043, 1100, -5784, -11614, -11424, -8834, -4602, 1163, 3218, 3042, 868, -2017, -4635, -5551, -5340, -3525, 2975, 7524, 7330, 4921, 2757, 3073, 5071, 4873, 1569, -2761, -1991, -2286, -196, -866, -6267, -8103, -11668, -10739, -5850, -477, 4482, 10689, 12344, 10738, 6464, -1478, -4867, -7411, -9274, -7276, -3152, 2596, 9490, 13209, 15403, 10474, -343, -7803, -15590, -18571, -18241, -15244, -6473, 5548, 19262, 24601, 25057, 16777, 4319, -4571, -12041, -12825, -14095, -13767, -6858, 2889, 11010, 14677, 10721, 3849, -3781, -10299, -12514, -12259, -7808, -4562, -608, 6793, 14617, 17597, 14766, 10452, 3112, -3489, -8276, -14259, -16217, -12899, -7330, 1368, 7855, 7324, 5381, 179, -2220, 1974, 3051, 1248, -422, -1611, -562, 2012, 2807, 2030, -149, -1766, -289, 1425, 612, 235, -484, 547, -132, -6269, -10909, -10626, -6316, 1088, 6245, 9946, 9902, 8208, 10997, 8159, 2473, -4373, -10546, -14409, -13167, -5846, -394, 7613, 12625, 9884, 4513, -4582, -8672, -12348, -13591, -11118, -6721, 470, 8450, 19929, 22819, 20665, 12982, 2865, -8527, -18517, -22123, -23775, -17996, -8370, 2914, 11124, 16130, 16989, 13318, 10471, 3657, -4198, -11844, -17384, -14940, -5513, 4421, 11654, 14659, 11612, 7081, 3545, -778, -5179, -7435, -10286, -11584, -7782, -4791, 262, 3981, 4954, 7180, 4910, 2723, 257, 196, 3012, 5003, 5585, 2069, -4365, -6830, -5342, -1641, 675, -350, -3053, -3922, -2156, -1209, 244, -1320, -2337, -4826, -3856, 895, 5416, 10951, 13723, 14573, 11137, 1364, -7258, -9761, -11586, -14148, -13516, -10162, -4378, 3659, 9582, 12713, 10496, 5291, -1104, -6726, -8783, -7136, -2798, 3165, 10733, 14722, 17102, 11513, 2883, -3977, -12482, -18478, -20333, -17131, -14749, -3943, 7202, 15203, 24419, 22173, 14359, 5579, -4790, -10850, -13947, -14633, -11403, -5419, 1939, 7743, 11557, 11476, 9029, 4720, -1960, -8953, -13942, -14355, -12281, -9165, -419, 4442, 6467, 9807, 10154, 13007, 12562, 7840, 3948, 1280, -1067, -3177, -7419, -11312, -10512, -8885, -8025, -4778, -1417, -224, 5113, 9695, 11564, 9642, 4735, -255, -3396, -797, 159, 1418, 4260, 8425, 10145, 8548, 2217, -8724, -15635, -19883, -21455, -17962, -12858, -4032, 9863, 21909, 29209, 26478, 17325, 5772, -3799, -10761, -16546, -16941, -13968, -7211, 1503, 7543, 11290, 9222, 3075, -3562, -12185, -14595, -14048, -10875, -2891, 4325, 13859, 20061, 19430, 16793, 8070, -2072, -7756, -12365, -13700, -11973, -6936, -111, 6163, 8038, 4956, 745, -3060, -5086, -6555, -6508, -5185, -371, 6613, 10593, 11952, 11478, 7444, 4676, 1885, 18, -1661, -3753, -4626, -6511, -5851, -6482, -10354, -15741, -15231, -11212, -3805, 5757, 14802, 22311, 22820, 20886, 16660, 6160, -6093, -16283, -22891, -20917, -12765, -4868, 3083, 8199, 9360, 6972, -1508, -7455, -10355, -10213, -9709, -5585, 4422, 13968, 21871, 26829, 25029, 13663, 387, -12548, -20261, -22415, -21846, -18152, -12313, -1567, 7508, 13241, 15669, 11372, 5756, -141, -5847, -7179, -6767, -4364, 3311, 9994, 13906, 12732, 7487, 2640, -2808, -7143, -11103, -15112, -15139, -11591, -4797, 1595, 981, 1262, 1866, 4069, 9474, 9991, 8261, 7181, 7537, 6671, 3173, -891, -6894, -13223, -12003, -9503, -5835, -532, 199, 1633, 3997, 4418, 650, -6467, -10533, -10012, -7038, 1516, 10157, 21180, 29062, 25803, 19221, 7439, -8967, -20292, -28221, -30882, -27614, -20449, -7769, 6761, 17753, 24617, 26793, 18252, 9222, -1567, -9356, -10590, -9769, -5844, -2273, 3451, 9987, 12549, 11376, 5473, -5700, -16434, -23661, -19745, -11570, -5174, 169, 4912, 12931, 15114, 13280, 9540, 3653, 2711, 1951, -1257, -2733, -1281, -1299, -1555, -3371, -5901, -8794, -11511, -8431, -4296, -1547, 367, 1809, 4580, 8448, 7663, 6903, 5341, 3304, 3645, 4846, 4680, 4478, 2292, -1238, -5037, -11026, -14372, -16623, -13264, -7404, 53, 2748, 8147, 15609, 17104, 16307, 8485, -682, -5061, -8674, -8335, -5383, -3090, 5422, 10324, 13591, 11198, 380, -9310, -15421, -17556, -16809, -14517, -11719, -4150, 8596, 20526, 29040, 28238, 19930, 8816, -3586, -11506, -15564, -16451, -17123, -13198, -4387, 3407, 10178, 12861, 10228, 6553, -551, -6256, -11313, -14189, -9475, -2791, 7826, 14977, 15316, 11475, 8801, 7056, 2281, -3283, -9117, -13773, -14398, -9529, -4691, -3180, -2423, -942, -797, 3469, 6650, 7176, 8261, 9356, 10420, 7819, 2936, -3227, -9446, -12252, -9805, -6432, -2007, 2171, 4150, 4258, 2444, -541, -2948, -7184, -9028, -7787, -3993, 3944, 13930, 20899, 21815, 13852, 3971, -2632, -10530, -15269, -19738, -19029, -13526, -1557, 9119, 16469, 20460, 13825, 5292, -826, -9661, -14745, -15609, -14913, -5236, 3966, 11504, 16831, 20010, 16829, 8142, -4453, -14371, -16399, -16416, -13536, -7562, -617, 4665, 9443, 10388, 9588, 4379, -1615, -4072, -6054, -5228, -2401, 4, 4324, 6605, 2596, -684, -3747, -1991, 477, -3055, -5975, -5499, -3290, 405, 1356, -790, -3296, -5161, -1283, 4415, 8011, 8385, 7435, 6184, 6404, 1990, -8180, -13158, -16394, -16518, -10750, -3854, 5929, 16110, 19337, 19715, 13305, 1742, -7794, -15539, -17820, -15583, -7891, -397, 8444, 17321, 17773, 16278, 9838, -1536, -12314, -20920, -21673, -16563, -6917, 3753, 12620, 21033, 22800, 17878, 8511, -3500, -13761, -19432, -20794, -17670, -11244, 418, 12782, 21737, 26085, 19014, 5690, -4641, -12730, -14810, -14440, -13848, -10924, -8210, 231, 8152, 13132, 14389, 12846, 7294, 951, -3548, -4504, -3560, -2901, -1464, -2970, -4164, -4077, -1415, 1038, 4341, 4533, 1998, 249, 774, 972, -335, -3691, -6358, -8507, -7848, -3416, 3883, 12666, 15461, 15194, 7374, -2911, -10388, -14478, -15905, -14066, -8494, -3196, 4866, 15496, 20425, 17945, 12184, 1568, -9187, -15509, -20134, -17769, -9293, -415, 10213, 17302, 22141, 21114, 11477, 1797, -8640, -15779, -18639, -18572, -13154, -4175, 6431, 15020, 18860, 13692, 4084, -3354, -9459, -11584, -9796, -7563, -1675, 6799, 13584, 16823, 14740, 10026, 3763, -5235, -12394, -16748, -17769, -17351, -10960, -1277, 6243, 13626, 15007, 15863, 11476, 6128, 1725, -4069, -5949, -6101, -5293, -1843, -953, -4542, -3908, -3643, -396, 6355, 5220, 2793, 539, -4219, -2388, -1872, -3667, -5769, -7433, -2510, 4409, 12724, 17179, 14675, 11990, 5306, -5540, -13418, -17882, -20727, -18877, -14122, -6962, 2788, 11982, 19645, 23474, 20932, 10283, -630, -9971, -14440, -14931, -11938, -5124, 1797, 8878, 13331, 14252, 8992, 2525, -3895, -12489, -17718, -18194, -16436, -7440, 3485, 14462, 20717, 16259, 13424, 10023, 4774, 97, -6185, -11144, -13178, -11201, -8386, -4375, 971, 1601, 1669, 1566, 204, -753, -2470, -763, 3349, 5609, 5844, 5271, 4427, 4745, 4881, 3929, 459, -4081, -6035, -7453, -7527, -4041, -3534, -5713, -6835, -6200, -2447, 1442, 5712, 9753, 10708, 10175, 8788, 6085, 1671, -4325, -8725, -8868, -7316, -4179, 176, 2740, 5674, 5271, 1182, -5241, -10309, -13283, -14632, -9298, -2632, 2211, 9684, 18071, 25071, 29654, 20234, 2854, -10287, -19567, -22961, -22892, -21299, -14003, -3684, 8595, 17843, 20445, 17418, 8272, 222, -4687, -7738, -10431, -10894, -8362, 2333, 13580, 18001, 19464, 11812, 2938, -4138, -10121, -16760, -22447, -21628, -16907, -6325, 7915, 14340, 15315, 15736, 14900, 12441, 6418, -1240, -7513, -7853, -6621, -2499, -388, -2845, -2891, -1713, 387, 371, -2671, -5398, -6489, -2713, 746, -632, -566, -196, 1952, 5561, 7520, 8989, 10752, 9712, 8251, 3805, -4986, -10638, -14684, -17796, -17792, -14282, -7179, 2712, 10356, 13055, 13184, 7958, 4045, 2039, -2114, -3160, -3969, -2295, 2538, 8542, 13211, 11264, 4699, -4837, -13157, -20213, -23339, -20607, -15293, -5326, 6579, 16912, 24781, 27363, 23436, 14332, 3865, -7692, -17666, -19592, -18925, -11087, 613, 6693, 11039, 10364, 6398, 1586, -3164, -7057, -9137, -10735, -12043, -5817, 5106, 13120, 18352, 15456, 11178, 5927, 2032, 94, -6542, -10063, -10471, -9645, -6295, -3740, -3904, -2173, 244, 3647, 7676, 7234, 3868, 1297, 3396, 8789, 7110, 707, -7375, -13300, -8682, -318, 5434, 8571, 6218, 3067, 2982, -941, -7069, -12147, -15081, -14867, -10785, -2958, 4343, 13780, 21355, 22804, 19974, 9006, -1624, -10902, -14162, -14238, -13948, -9036, -2542, 4422, 9658, 8530, 3369, 462, -4479, -7427, -8216, -5909, -1561, 6262, 15643, 18181, 17194, 10605, 2584, -2555, -11665, -17044, -20196, -19196, -13093, -4861, 5436, 11914, 16628, 14624, 11430, 5975, -1145, -6933, -10436, -8263, -4407, -2509, 396, 2936, 3327, 5502, 5609, 2251, -1181, -4470, -6332, -4025, -3319, -3891, -3369, -6656, -3987, 2106, 3402, 10670, 14217, 10870, 7162, 2337, -557, -5065, -9857, -11550, -12636, -9582, -4056, -1712, 5821, 13337, 15010, 13421, 4237, -7226, -13068, -16818, -15545, -6190, 756, 5180, 11376, 18826, 24114, 20325, 7565, -6234, -16775, -21679, -21932, -19826, -14178, -4905, 7234, 15499, 20003, 19373, 12988, 4696, -164, -4476, -10697, -14037, -13441, -6241, 4991, 12475, 12225, 7222, 21, -3521, -6780, -10166, -9094, -7121, -2172, 3909, 7688, 10773, 8247, 7855, 7418, 1893, -2144, -7452, -10971, -13135, -8210, -2992, 1594, 5681, 6348, 7642, 7679, 6725, 2955, -339, -4320, -7222, -8078, -7423, -5262, -3158, -1303, 947, 4601, 6462, 6059, 7338, 9123, 6299, 315, -8207, -13513, -15409, -13464, -7170, 783, 9496, 15670, 16571, 11597, 3924, -4218, -8881, -13297, -16024, -13535, -10908, -5174, 10055, 22875, 27100, 23699, 11845, -495, -10574, -17155, -19952, -20111, -16670, -9476, 1293, 13720, 20912, 21969, 15643, 6499, -2115, -12009, -19266, -18733, -13793, -4256, 6173, 14072, 18532, 13950, 8980, 3362, -1836, -6523, -11515, -15237, -14151, -8603, -1441, 7656, 9332, 8540, 5852, 818, -774, 40, -1780, -2167, 1539, 3441, 2133, -444, -630, -1534, 739, 3956, 708, -4094, -8716, -9617, -3642, 3126, 6505, 2970, -2912, -4254, -938, 7726, 10749, 10742, 7135, 1783, -384, -3375, -7718, -12518, -12386, -10494, -4185, 513, 5203, 11518, 12938, 15154, 8655, -3582, -13641, -20795, -16917, -5107, 4640, 11765, 17191, 20187, 19762, 12070, 1759, -8879, -18009, -23797, -25788, -21875, -12595, 2531, 15760, 24484, 26111, 17243, 5251, -4278, -9151, -7442, -6560, -6052, -4190, 260, 5538, 7582, 7964, 3882, -597, -6068, -11817, -12668, -11315, -6899, 1067, 5598, 7488, 7944, 7227, 7849, 8846, 6679, 3590, 847, -3535, -4369, -2565, -3361, -7471, -10965, -11278, -8245, -2979, 2139, 6055, 8830, 11228, 11387, 7135, 3134, -3568, -9648, -9295, -6031, -879, 6401, 7549, 7249, 6088, 2395, -874, -8183, -13923, -16493, -13986, -7903, 6, 7884, 14554, 17376, 16383, 10998, 1670, -5876, -10778, -13236, -10933, -5571, -1719, 4005, 10196, 14063, 13309, 4464, -6400, -17108, -22990, -20909, -14546, -4571, 4152, 13628, 20186, 26998, 27095, 16345, 4676, -7786, -15665, -17041, -17573, -16715, -11985, -4927, 3056, 9804, 9984, 5171, 2492, 2039, 3071, 4040, 2508, -1885, -4034, 554, 5574, 7753, 5276, -756, -3325, -3566, -3287, -3263, -5227, -7503, -5141, -2911, -1006, -1441, -1687, 3154, 7343, 11911, 11609, 5196, 43, -1060, -595, 788, -6803, -11848, -11419, -9631, -2325, 6056, 10669, 9367, 7789, 2544, -2765, -7075, -8799, -9324, -7812, -2385, 1825, 6996, 13015, 16737, 15168, 8037, -414, -7948, -11696, -15116, -15861, -9089, -1716, 3912, 8062, 8188, 5608, 3299, -2766, -4842, -6376, -7709, -7478, -1536, 9345, 14851, 18100, 16516, 11645, 2533, -7034, -14716, -21127, -22623, -16978, -12008, -6672, 2408, 11798, 18559, 19950, 18321, 12212, 4786, -2737, -5744, -9508, -10043, -5884, -4050, -3164, -3113, -3095, -1184, 2941, 5654, 5707, 736, -3689, -4935, -1697, 1534, 1453, -553, -2764, -128, 5227, 8322, 6639, 5289, 5189, 2241, -1274, -6277, -13649, -15473, -10544, -3174, 1709, 3051, 4901, 7610, 10259, 13036, 9423, -182, -8109, -13712, -12088, -4968, -231, 4038, 7689, 11406, 12191, 7647, 35, -5437, -8460, -12188, -13223, -11498, -10083, -4040, 7742, 16721, 20759, 14706, 3849, -2670, -4998, -5353, -5006, -3740, -4328, -3726, -625, 2488, 6923, 5928, -157, -5474, -9168, -10259, -9970, -4737, 4835, 12836, 11916, 9830, 6841, 4719, 3288, -950, -3506, -6819, -9650, -10461, -5219, -1025, 1121, 100, -1066, 839, 769, 704, 2352, 6904, 7692, 5930, 1063, -4589, -5233, -6557, -6340, -1690, 973, 4462, 10648, 13492, 12181, 4629, -6147, -11797, -14708, -17402, -16791, -12255, -3948, 10655, 20571, 24664, 22074, 12710, 3395, -7439, -12840, -15104, -16474, -15439, -9119, 1861, 10522, 15364, 16641, 9728, 393, -6740, -12426, -11672, -11327, -9705, -2316, 5599, 12042, 15942, 15925, 12285, 6197, 299, -6873, -12086, -14155, -13671, -7383, 108, 3335, 2815, -14, -1670, -303, 2735, 2576, 2138, 2426, 3155, 7110, 9282, 3584, -3415, -6682, -6723, -3606, -3051, -2414, -1209, 1318, 2203, 699, -897, -5318, -11022, -10011, -4351, 2209, 10246, 13450, 15731, 15435, 9830, 1857, -5561, -10733, -16398, -16886, -12817, -7513, 2785, 11304, 13918, 14875, 8005, -3702, -10369, -13925, -12613, -7767, -19, 7468, 15724, 21641, 21591, 18381, 7922, -6478, -17800, -24098, -23017, -19326, -10880, 944, 10178, 15982, 17861, 15375, 9069, 3122, -2490, -6264, -10817, -12371, -11753, -5511, 4465, 11267, 12136, 7124, 3958, 1685, -1209, -7663, -11165, -10945, -10013, -6973, -3762, 574, 2191, 5774, 9136, 8760, 8042, 4710, 2896, 3935, 4472, 1595, -4468, -10651, -12414, -10125, -4823, 1217, 6907, 5539, 1359, -75, -1392, -470, -1709, -4591, -3793, -1300, 3002, 6580, 12926, 16466, 12873, 9848, 1, -9146, -15597, -18947, -18508, -15869, -7889, -3474, 3127, 13254, 16415, 17205, 11678, 2459, -2746, -6363, -6673, -5086, -2947, -2102, 1307, 5820, 7406, 7269, 1229, -7976, -12049, -11754, -9640, -7575, -3036, 2366, 6178, 13842, 20358, 17117, 10441, 690, -7561, -11175, -14063, -12661, -8107, -1322, 5153, 8650, 8507, 6824, 5533, 1302, -2192, -4042, -10116, -15409, -14375, -5659, 6073, 13029, 13717, 10359, 7604, 7726, 5951, 2428, -2020, -7413, -10189, -10524, -8083, -6968, -4486, -2362, -1524, -11, 624, 783, 2975, 7056, 9308, 9735, 3955, -3513, -6636, -6932, -4211, 868, 5139, 6404, 5030, 4475, 125, -6642, -8372, -9572, -12541, -14902, -11266, -3228, 8434, 20915, 27889, 26175, 16223, 5468, -5753, -15203, -17442, -19339, -18950, -14264, -5831, 5837, 13742, 17658, 17523, 10671, 346, -9051, -12960, -10466, -6761, 468, 6486, 9706, 10759, 9219, 6689, 641, -2649, -8886, -12225, -12534, -8376, -75, 4218, 7080, 5013, 1915, -661, -1060, -1631, -1873, -4018, -2222, 146, 2082, 6776, 6680, 5672, 2373, -2013, -2113, -3240, -4350, -2158, -1638, 1595, 825, -3320, -7232, -9827, -8058, -2489, 3575, 9396, 14837, 15867, 13940, 12804, 7116, -4063, -14019, -20354, -19825, -14199, -7682, 1725, 10458, 13398, 15795, 9573, 255, -6072, -11126, -12937, -12136, -6598, 1479, 10654, 20982, 26131, 20382, 9469, -4775, -16427, -24166, -25975, -24192, -17016, -3431, 8500, 21068, 26009, 22772, 17035, 5647, -4496, -11461, -16183, -16280, -13799, -5154, 2570, 8711, 12021, 10176, 9964, 4777, -2437, -7878, -9086, -8641, -5954, -2155, -218, 2242, 2746, 4117, 4316, 4092, 3077, 1104, 211, 1659, 2049, 1827, -415, -6514, -9072, -9288, -6141, -1533, 4049, 6968, 7363, 6128, 1610, -4455, -9063, -8415, -7875, -6494, -997, 4262, 11784, 18451, 17834, 16040, 6556, -6952, -16419, -23778, -22302, -15644, -7397, 900, 8685, 16064, 17300, 14626, 9205, 808, -7549, -10474, -10726, -11628, -5648, 5587, 15490, 20274, 19252, 8322, -3706, -13392, -19786, -20595, -17304, -10628, -6212, 2218, 11975, 21306, 25440, 19444, 10982, 2218, -7785, -14259, -15777, -13497, -8559, -5402, -1735, 3394, 7325, 7881, 7385, 7274, 5223, -966, -8723, -10584, -8778, -3312, 2243, 3355, 4786, 2165, 924, 3297, 4737, 4977, 3651, -334, -5157, -5999, -6099, -6405, -5341, -4395, -4307, -2659, 2475, 5616, 6910, 7319, 6268, 3317, -1106, -6941, -9899, -4630, 733, 5852, 10659, 9290, 4770, 3197, -408, -5079, -6863, -11636, -15191, -13630, -9030, -1717, 7805, 16125, 17810, 14402, 9235, 1744, -2024, -3798, -6322, -7890, -8684, -3416, 2209, 5755, 7720, 2378, -3999, -8312, -12003, -11412, -9266, -4659, 3203, 10244, 16339, 20202, 18610, 10775, 5939, -1809, -10840, -15886, -19519, -17276, -12248, -4982, 3381, 8819, 12723, 13092, 9890, 5505, -569, -4098, -8421, -8951, -2619, 1537, 4707, 7867, 6417, 2976, 1925, 1796, -55, -4244, -8431, -7894, -4784, -1204, 359, -2279, -2942, -3126, 112, 4557, 5956, 4905, 3906, 4692, 6279, 4987, -1029, -7749, -9626, -6453, -2842, 168, 99, 2261, 3029, 1272, -50, -3253, -7934, -11833, -12819, -5856, 3175, 10191, 17681, 20602, 22520, 16256, 5759, -5338, -15988, -20587, -22789, -19302, -10337, -2523, 7030, 14010, 16655, 14530, 6488, -1664, -8199, -9371, -8337, -5630, -688, 6046, 15669, 21044, 18796, 10635, -2003, -12923, -22195, -24996, -23545, -17584, -6224, 3852, 15406, 22722, 22464, 18221, 9793, -745, -8654, -12449, -13647, -12715, -4464, 1992, 6815, 10148, 6899, 3732, -2524, -7017, -6951, -6945, -5504, -3421, -1064, 742, 2387, 5446, 5927, 4711, 1587, -2915, -2125, 2314, 6621, 7628, 5887, 862, -5367, -10304, -12245, -9592, -5909, 813, 3725, 5421, 5229, 3003, 4327, 1807, -1128, -6307, -8823, -3442, 3249, 10330, 17687, 16760, 13653, 3798, -10087, -16553, -21286, -20500, -15809, -7546, 826, 10344, 17784, 21391, 20612, 11499, -1309, -11207, -17250, -17689, -10575, -1161, 8010, 16501, 21289, 19432, 10338, -1843, -13958, -24290, -25710, -23005, -16156, -8269, 4856, 19055, 28867, 30774, 21004, 6872, -7550, -12469, -15352, -16909, -15675, -12768, -4833, 5522, 14075, 16240, 11393, 4803, -1679, -8080, -12248, -12501, -10400, -4809, 3151, 8500, 12297, 9175, 7079, 6937, 2466, -80, -3776, -6297, -5564, -5864, -3673, -1883, -3202, -4758, -6710, -5484, 275, 4845, 6726, 8211, 9156, 10402, 5899, -1805, -5334, -7705, -6566, -3832, 938, 5217, 4644, 2948, 1862, -52, -2419, -6471, -10212, -13856, -13649, -5388, 3512, 14717, 19795, 15771, 9150, 959, -3443, -8302, -12255, -12886, -8630, 140, 8499, 14787, 11993, 6848, 435, -7683, -13240, -20084, -22381, -15477, -4857, 9744, 22379, 27159, 26184, 18229, 7704, -3697, -13978, -21597, -24197, -19665, -11405, -2127, 11035, 16407, 18295, 17247, 5683, -3045, -10629, -15458, -12843, -7036, -1242, 2998, 6999, 12397, 17149, 16162, 9628, 491, -7579, -11260, -15573, -14709, -9805, -4561, -1297, 1606, 5786, 6458, 8227, 9664, 6842, 3319, 282, -5279, -4296, -444, 1326, -631, -2227, -1689, -1815, -439, 1252, 2721, 2298, 1026, -2648, -4687, -6007, -8700, -6558, -4432, -1429, 4011, 7106, 11204, 15754, 16967, 11527, 3096, -5020, -12755, -16231, -16863, -12696, -4793, 1259, 8105, 11088, 10132, 6499, 361, -4590, -8276, -11771, -9779, -3745, 1075, 10280, 16937, 20578, 19591, 8534, -2599, -12367, -21152, -22513, -18993, -10858, -2644, 2599, 8431, 15107, 18580, 13500, 5106, -2186, -5961, -6448, -6458, -7118, -5239, 2363, 8232, 11375, 11444, 7096, -1880, -9543, -11416, -10722, -9813, -11320, -7915, -2272, 6287, 13301, 15762, 15211, 8508, 3702, -1441, -5805, -7077, -6466, -4275, -3098, -1782, -1376, -1077, 1394, 4176, 4525, 1159, -3489, -6743, -7140, -3177, 641, 1597, 2775, 2004, 1473, 3358, 8105, 10549, 11003, 8734, 2698, -4099, -10118, -11613, -12855, -13196, -9998, -4147, -1639, 1929, 7717, 11945, 13940, 10516, 5654, 308, -7524, -11370, -8915, -5441, 2255, 10412, 13523, 11252, 4768, -2026, -9930, -14416, -14489, -16795, -15592, -10375, 1314, 14972, 23431, 26973, 20681, 11000, 43, -7607, -13512, -16296, -13277, -9803, -5922, -473, 6845, 10505, 10671, 9317, 2682, -8397, -13090, -15353, -13769, -6555, 2979, 13387, 17433, 15000, 9834, 6041, 1510, -3566, -8431, -13021, -14795, -10262, -4385, 421, 4186, 5100, 4263, 4016, 2343, -1833, -5349, -5669, -744, 5124, 6790, 1884, -3259, -2256, 2425, 6640, 7740, 3321, -87, 611, 258, -1639, -3575, -8229, -14007, -16163, -12587, -7008, -998, 8259, 17805, 22850, 22620, 14161, 4169, -1164, -9615, -14356, -14300, -13447, -8033, -536, 4506, 10284, 11824, 7273, -512, -6795, -11163, -14012, -10442, -4191, 4977, 12022, 16232, 19583, 17472, 10107, 1608, -7000, -14153, -18837, -17419, -15502, -9151, -536, 7341, 14290, 12915, 10080, 3031, -2507, -4850, -3354, -1627, -1467, -980, 758, 4705, 6863, 6710, 1847, -1911, -6500, -8749, -8799, -6272, -1643, 1551, 5078, 4770, -1, -2035, -1560, 174, 3230, 2210, 1336, 962, 2553, 5926, 5222, 1666, 62, -3253, -5283, -5684, -3296, 1331, 4530, 3698, -1370, -7453, -11377, -9185, -6589, -2038, 1582, 5465, 10220, 16173, 19282, 17691, 11368, 791, -6575, -13213, -18678, -22279, -22526, -11799, 1387, 11710, 15170, 13354, 9823, 4286, 3795, 488, -5035, -7821, -10041, -8510, 2269, 11566, 17413, 15376, 7905, -111, -9434, -13922, -15729, -15091, -11593, -5429, -84, 4239, 10902, 16520, 17891, 15004, 5194, -2993, -10659, -14641, -11308, -6198, -1139, 1716, 4167, 3927, 3257, 5407, 4758, 3171, -421, -6074, -8080, -6952, -3313, -1446, -1968, -882, -251, 234, 2851, 4372, 8000, 11857, 12231, 7938, 1019, -5996, -10763, -13660, -15013, -9280, -4273, -1016, 3414, 6351, 8663, 5568, 738, -763, -3067, -4586, -4090, 159, 9259, 15289, 17852, 16823, 8927, -2133, -12690, -20394, -23742, -22458, -18087, -9867, 821, 10713, 19276, 23203, 21924, 15403, 5439, -4587, -12081, -14472, -14501, -8957, 629, 8294, 11235, 8442, 4715, 540, -5549, -10394, -14601, -15884, -11513, -4732, 4220, 12475, 16814, 17368, 13349, 9365, 3676, -4396, -11003, -12518, -8167, -6622, -6140, -4781, -1727, 2532, 6570, 6989, 4804, 614, -1910, -4972, -6354, -3110, 554, 1878, -501, 924, 964, 4281, 9197, 10841, 9018, 5270, -231, -6705, -10991, -11908, -12005, -12350, -11129, -6968, -2412, 2619, 12432, 17229, 20639, 16120, 5243, -3603, -8815, -7590, -6302, -5145, -3345, -625, 4784, 7863, 5947, 2346, -4599, -10465, -14253, -15045, -13818, -10107, 690, 13240, 23165, 27001, 20134, 9207, 2635, -3041, -10305, -14057, -15239, -16962, -12481, -5784, 1024, 8190, 10316, 8950, 6844, 559, -3933, -5376, -4245, 1074, 4704, 7112, 5554, 7411, 7964, 6342, 3523, -1712, -6394, -11869, -14213, -10316, -4283, 341, 2978, 71, 1134, -113, 1864, 8618, 8691, 5670, 3776, 2124, 130, 1108, 1783, 15, -1893, -5019, -5051, -941, -816, 1356, 2164, 249, -2842, -6590, -9830, -11147, -7570, -2912, 5234, 13330, 20084, 21519, 17543, 13251, 2886, -7591, -15875, -24170, -25315, -20530, -10838, 1319, 13246, 18505, 17879, 12595, 5467, -1541, -10050, -13908, -12880, -7332, 407, 8233, 14138, 21441, 20710, 12109, 727, -11208, -18710, -24596, -22375, -18692, -12530, -2925, 6675, 16057, 19339, 18633, 14405, 7971, 2179, -3559, -6858, -8467, -7781, -4396, -4010, -992, 1781, 1968, 2656, 1870, -880, -4315, -5878, -5740, -3242, -1279, -208, -125, 2464, 6027, 8031, 9067, 8221, 5089, 3129, 1023, -744, -3950, -10908, -13495, -12459, -8589, -3325, 3793, 6591, 6138, 7943, 6572, 3070, -645, -3168, -4814, -4692, -982, 3078, 6005, 12170, 13807, 8558, 3022, -6501, -15918, -20453, -21721, -16501, -5666, 3739, 11512, 16801, 17120, 14764, 10722, 1633, -5970, -12164, -16427, -14835, -8403, 3910, 12370, 19044, 18604, 13258, 6686, -4084, -14828, -21354, -21926, -18379, -11753, -3267, 6499, 13827, 22644, 23778, 17660, 10590, -916, -9066, -11907, -13899, -13016, -8685, -4357, -441, 4829, 8870, 10255, 7135, 1612, -1463, -6451, -8049, -9883, -10459, -5405, 3497, 11890, 13966, 12459, 8124, 5196, 2201, -2645, -6467, -8835, -12622, -13472, -11274, -6179, 1189, 5319, 9106, 10122, 9689, 7063, 2897, 1759, 886, -1073, -4892, -8568, -8273, -5578, 776, 7159, 9067, 8015, 4504, -335, -4382, -5004, -6883, -8767, -7834, -5248, -694, 3656, 9310, 12905, 12114, 9867, 3171, -6568, -11388, -12473, -9858, -1819, 3470, 6677, 10321, 10513, 9242, 3733, -2466, -9091, -14819, -18052, -18613, -13482, -4450, 9608, 22266, 28361, 23880, 11110, 1291, -5561, -9213, -12577, -16856, -18859, -16032, -5072, 6137, 16487, 19993, 13045, 4875, -4234, -11841, -11255, -11002, -6158, 2366, 7186, 11423, 9972, 8860, 7777, 5931, 181, -7473, -14494, -18812, -15178, -4836, 3382, 8870, 8844, 6019, 5376, 5435, 7709, 5240, -250, -6952, -9307, -10338, -7242, -2180, 1180, 2949, 2406, 6142, 8985, 7128, 5545, 3839, -900, -2930, -9514, -14877, -16179, -12495, -3231, 5000, 12341, 14245, 13288, 10543, 8677, 5544, -2326, -9970, -15912, -14277, -6911, 443, 10012, 13622, 12404, 8978, 553, -7432, -14627, -18467, -17069, -11064, -632, 5996, 14070, 24002, 25546, 23530, 11790, -3557, -14382, -21120, -23028, -22698, -15615, -7487, 926, 10197, 17393, 20109, 14540, 6295, -1179, -6569, -8396, -8136, -6699, -5490, -2353, 4909, 8106, 8477, 7885, 3848, -709, -5343, -7287, -6144, -5601, -1913, 5, -516, 1062, 535, 1784, 4366, 4606, 3707, -548, -7057, -6501, -1401, 3338, 4386, 3928, 4278, 3263, 2778, 3084, 2688, -124, -2339, -6945, -9797, -10713, -12171, -9843, -2585, 4527, 10621, 15578, 13914, 14366, 13673, 7323, 299, -8964, -15978, -19801, -17827, -8673, -566, 7108, 12853, 9620, 5894, 3706, -2806, -5891, -6005, -9096, -7744, -3266, 2453, 10814, 20737, 23350, 17578, 6378, -10620, -19372, -23016, -22500, -16788, -10342, -3679, 4706, 13701, 20846, 23799, 16860, 6707, -2913, -12931, -16499, -16418, -12298, -2967, 2857, 8544, 10742, 12157, 13642, 8708, 131, -7560, -12942, -13721, -13988, -11248, -4781, 1839, 10475, 11754, 10005, 6832, 1815, 108, -428, -1465, -2950, -2613, -1747, 668, 2575, 528, -1090, -2608, -612, 760, -5052, -8408, -10282, -7342, 1983, 7177, 5241, 2906, 1820, 2857, 9347, 12891, 10292, 5690, -2048, -8738, -11939, -12771, -12554, -10456, -6936, -2968, 2234, 6681, 9624, 13753, 15246, 11200, 4247, -6381, -10794, -13157, -11076, -2924, 3354, 9113, 13048, 10967, 5300, 1251, -4610, -9899, -14435, -17531, -14906, -8377, -219, 12504, 22927, 25224, 19164, 8237, -3507, -10245, -13510, -12385, -7882, -5640, -4164, -1264, 6289, 12401, 14859, 10055, -2391, -12198, -16948, -14692, -6180, 564, 5281, 8580, 9451, 10407, 11851, 8563, 4088, -2446, -8135, -10168, -12473, -9216, -2940, 2318, 4998, 3791, 502, -1327, -1031, 1075, 3584, 3122, 1610, 1337, -760, 1304, 2617, 1482, -300, -3118, -1568, 2036, 3261, 987, -380, -1298, -3615, -4736, -4830, -8788, -9057, -6121, -351, 7181, 12616, 13081, 9956, 9867, 6822, 2258, -5153, -11275, -11984, -9625, -6268, -1623, 3700, 7407, 8899, 7439, 4499, -3160, -10722, -13776, -13662, -7729, -871, 6142, 11603, 15463, 19463, 16248, 9945, 1152, -10246, -16489, -21218, -19878, -14224, -7533, 1039, 8912, 16121, 16836, 13334, 6273, 1530, 15, -1651, -1790, -5541, -10315, -10151, -5548, 4239, 10439, 8273, 3420, -3457, -5684, -2931, -729, -606, -4379, -8518, -8467, -3588, 7102, 13103, 15259, 14227, 7458, -1308, -9136, -11900, -11320, -7226, -4410, -3303, -1536, 2014, 7509, 13318, 16329, 12216, 606, -13174, -21216, -19009, -10835, -3002, 963, 2072, 3879, 6994, 13057, 17005, 15746, 7933, -1146, -8516, -13758, -15074, -11722, -5104, -1103, 1056, 1035, 1065, 1913, 3879, 5316, 7030, 5009, 372, -1688, -1498, 1047, 2186, 4710, 3014, 535, -1044, -2632, -4717, -7854, -5829, -3901, -3724, -2715, -1806, -1126, 2420, 6809, 12697, 14864, 9130, 1702, -6869, -11633, -9890, -8971, -7943, -5809, -2899, 1571, 5635, 11193, 14071, 13318, 6968, -2139, -9026, -12448, -12161, -10346, -4854, 1434, 6374, 9553, 8412, 7335, 6885, 3412, 88, -6299, -9366, -8501, -6892, -355, 3149, 5805, 5911, 3698, 2098, -2238, -8230, -10298, -5792, 1251, 5799, 4760, 1746, 695, 6566, 11954, 11913, 7028, -2183, -5971, -7569, -9225, -7502, -7394, -7095, -5693, -5268, -1664, 2077, 7902, 15773, 17291, 14079, 6828, -5317, -12020, -10926, -8895, -7811, -7865, -5837, -2963, 2376, 8962, 13472, 14583, 7800, -1955, -8532, -10297, -8480, -6239, -6161, -2600, 4809, 9491, 10826, 8576, 6336, 3259, -2247, -5870, -7833, -7434, -6488, -4931, -535, 4189, 6337, 4055, 1628, 817, -723, -1575, -615, -552, -946, -2777, -3220, 853, 3380, 4203, 3999, 4331, 5016, 2250, -3227, -5432, -3933, -4502, -6038, -7314, -6680, -2675, 2185, 7944, 14692, 14977, 8454, 3502, -1344, -2472, -6248, -10961, -9705, -8369, -2756, 2223, 6672, 10002, 9205, 6382, -87, -4416, -8463, -11160, -10109, -8328, -2024, 4679, 8782, 14562, 14203, 10757, 8529, 451, -5642, -10408, -13908, -12583, -10965, -5684, 1732, 9057, 12958, 11057, 6331, 502, -3659, -5862, -6270, -6804, -5941, -3218, -877, 5824, 11799, 14517, 14453, 5505, -1114, -5864, -10697, -11272, -11940, -10766, -9499, -6505, 541, 7160, 10974, 14418, 14635, 10191, 3727, -3178, -10761, -12152, -7524, -3717, -761, 614, 2090, 3277, 3729, 3299, 2465, -1388, -6498, -6143, -5970, -3685, 1433, 3921, 7606, 8907, 7928, 3961, -2038, -4521, -2909, -1024, -344, -1738, -4492, -5365, -3162, 1308, 4147, 4782, 2892, -628, -4578, -6002, -5465, -2599, 452, 1194, 927, 1288, 2931, 8350, 15034, 15593, 11436, 2912, -7926, -17296, -19127, -14689, -10610, -6072, -4634, -2649, 3658, 12231, 20505, 19421, 11900, 3115, -5197, -8847, -8684, -6740, -2598, 361, 2501, 3494, 3269, 3317, 918, -766, -5103, -10511, -13727, -13783, -8204, -554, 10069, 17608, 17914, 15462, 9547, 3847, -746, -5289, -9249, -12857, -15833, -15738, -9893, -1136, 8261, 13825, 12922, 8796, 4708, 141, -4455, -6712, -5639, -5191, -5190, -2778, -1863, 2083, 8516, 12102, 13174, 8900, 158, -5515, -6514, -5493, -4461, -7302, -10886, -14093, -12381, -5532, 1739, 8843, 14476, 15933, 11742, 7397, 3904, 3664, 2467, -1449, -6693, -10662, -11302, -6189, 1589, 4953, 6147, 748, -6134, -7612, -7543, -5950, -2350, 799, 6121, 10730, 14866, 17265, 16103, 11778, 4481, -4155, -14114, -19249, -20128, -17079, -10683, -1901, 4181, 8031, 9955, 8926, 8442, 6320, 1585, -2415, -5950, -7405, -4917, -2500, 4866, 10126, 10159, 8193, 2936, -2082, -5147, -9125, -11531, -11555, -8146, -3559, 15, 4814, 6998, 9678, 9032, 6480, 2320, -2413, -6125, -6828, -3312, 1105, 1976, 1844, 3351, 5142, 6799, 5267, 1553, -4514, -7203, -11113, -10607, -8632, -8835, -5841, -2463, 2797, 9339, 14712, 15634, 15649, 15819, 11921, 1747, -7976, -14444, -17577, -17557, -16694, -12686, -4802, 2015, 8991, 13726, 14465, 11410, 5424, 161, -4995, -6229, -5434, -4245, -1813, 3853, 7466, 10838, 12671, 6698, -1177, -9585, -16758, -17949, -15573, -9245, -2456, 3909, 11624, 15505, 17792, 11990, 6720, 1663, -5704, -9056, -8519, -5882, -3641, 2145, 5955, 6957, 4897, 341, -5435, -7002, -6613, -6470, -5925, -4574, -1986, 3404, 8263, 8032, 9122, 6653, 3758, 2145, 859, 832, 106, 122, -61, -2433, -4682, -7869, -10152, -8109, -4593, 690, 3833, 3128, 2280, 2998, 5073, 6292, 5457, 1705, -3922, -6084, -3079, 2643, 8478, 11618, 7075, 286, -5598, -13464, -15159, -13927, -12367, -7303, -2003, 3324, 8805, 16278, 20268, 18372, 10814, -1032, -9849, -15710, -15466, -10709, -5148, 851, 6580, 9984, 9702, 8644, 4691, -1015, -6297, -10297, -11808, -11000, -8461, -3373, 4099, 9584, 13548, 13415, 10274, 7152, 5505, 2985, -1529, -5941, -11107, -13572, -12677, -8452, -5632, -2884, 1081, 1944, 3063, 5029, 6580, 7378, 8931, 9789, 5642, 815, -4635, -7274, -6209, -4307, -1514, 808, 726, 514, -321, -1689, -948, -2913, -5463, -8822, -6700, -1514, 3433, 8325, 12261, 15660, 11686, 5354, -469, -6141, -10464, -12026, -9954, -6759, -3056, 13, 3485, 8685, 12809, 12242, 4518, -4592, -11093, -13825, -11645, -5068, 999, 4118, 6095, 8836, 11065, 11817, 9774, 3953, -2107, -7603, -10595, -10937, -9349, -6369, -2231, 492, 2471, 2181, 1443, 2209, 3941, 5322, 5073, 395, -1586, 351, 1110, 4523, 4931, 4914, 2534, -2087, -5561, -6809, -7932, -7935, -7136, -8857, -7426, -3784, 319, 5681, 11884, 16569, 15746, 10961, 6117, 798, -4105, -6445, -7115, -10689, -13561, -13908, -10018, -2956, 4265, 10078, 10764, 8545, 5521, 1908, -287, 159, -1027, -3864, -5648, -5246, -2983, -583, 2849, 7426, 7348, 3817, -23, -3559, -3500, -1146, -88, -1681, -4941, -5615, -1824, 3979, 7985, 5635, 2429, -80, -922, 856, 612, -963, -2420, 310, 3319, 4806, 6920, 4479, 3082, 1243, -4000, -6458, -11046, -11158, -7444, -5645, -2570, 4, 4318, 8656, 13808, 17336, 14164, 6076, -3170, -9544, -9819, -7728, -5787, -4041, -3934, -4182, -2756, 951, 6767, 8195, 2542, -2485, -5391, -6096, -1894, 2506, 5501, 9198, 7858, 5766, 3330, 368, -2435, -4751, -5705, -8407, -10255, -11895, -10343, -2199, 6787, 12971, 13455, 9021, 5905, 2520, 559, -1102, -3921, -7151, -10126, -11155, -9889, -3860, 4003, 10328, 14607, 13979, 8842, -530, -8550, -8908, -5626, -4740, -4895, -6818, -8501, -2954, 3805, 11643, 15700, 11588, 4280, -3194, -6656, -7261, -3958, -1822, -3394, -2480, -2805, -2201, 2286, 5111, 7950, 7562, 1080, -4495, -9879, -9938, -3515, 675, 4200, 4965, 1544, 2388, 4266, 5051, 5876, 2021, -1722, -5346, -6430, -6030, -5107, -2803, -325, 1440, 895, 791, 1141, 1213, 2571, 4376, 4908, 4860, 2704, 74, -3543, -4948, -4276, -2896, -3419, -2624, 446, 960, 2064, 2702, 1865, 2781, 2848, 428, -918, -5306, -7041, -2723, 4037, 9302, 9834, 3446, -2496, -4180, -2906, -1864, -5239, -6271, -5110, -1290, 2368, 5561, 9793, 9191, 5280, 2398, -2944, -9002, -11139, -9978, -6516, 1322, 6814, 8877, 8825, 4981, 3884, 2350, -941, -4387, -7668, -9163, -8432, -3548, 2594, 7375, 11169, 9916, 5472, 257, -4740, -7714, -8034, -6390, -2803, 36, 1173, 2092, 4596, 7991, 9213, 7231, 2294, -1815, -5795, -6734, -5105, -1659, 1730, -184, -4330, -5938, -3373, 236, 3699, 6998, 8556, 7963, 4523, 1796, -875, -4484, -6981, -9758, -10879, -9292, -5316, 449, 7970, 16155, 16605, 8979, 736, -4513, -8698, -10499, -9505, -8274, -3771, 121, 4899, 7857, 10439, 11972, 5735, -1457, -8074, -11254, -10259, -7671, -1999, 3691, 6049, 7362, 7602, 6845, 2784, -1883, -6501, -9554, -9498, -7325, -5716, -6034, 1012, 10047, 14698, 13011, 8781, 4608, -570, -2653, -3005, -3037, -5283, -7923, -6692, -4040, -1201, 515, 1791, 2526, 2294, 4105, 3313, 1543, 374, 2590, 4428, 2124, 580, -2522, -4196, -1803, 1030, 3768, 3044, -1030, -2772, -4580, -5196, -6449, -5916, -3455, -564, 3723, 5770, 5878, 8005, 9351, 6392, 2065, -4755, -9384, -10118, -9935, -5651, -968, 2430, 6304, 7766, 9006, 8260, 3676, -3374, -6297, -7372, -8048, -7573, -7843, -5335, 703, 8504, 11981, 12846, 10100, 5429, 2293, -1443, -2656, -3833, -6408, -7509, -9275, -7496, -4288, -29, 3939, 5385, 7464, 5014, 1130, -1453, -3083, -737, 3220, 4192, 4385, 3408, 1839, 1794, 2261, 1621, -1141, -6613, -13314, -14868, -12166, -5702, 876, 3096, 4893, 5600, 6525, 7177, 8207, 9805, 8760, 5046, -1162, -5529, -8793, -8650, -6036, -5228, -6193, -5637, -3290, -2020, 3012, 6668, 7741, 7945, 5730, 2921, -1075, -4223, -3985, -2533, 723, 3506, 3705, 2421, 2963, 4873, 2317, 737, -3118, -7969, -10612, -11761, -9006, -3827, 3401, 11278, 14674, 11557, 5973, 1048, -191, -303, -1642, -4844, -7866, -7571, -2653, 3744, 8377, 8928, 5388, -202, -5336, -7754, -9343, -8606, -6736, -2384, 1322, 4503, 6609, 7132, 9725, 9927, 8713, 4012, -2913, -8043, -8312, -6018, -1527, 56, -4477, -5391, -5253, -2777, 832, 1519, 302, -4, 904, 2252, 5610, 5159, 3167, 1103, -862, 69, 997, 1795, 1383, 1226, -270, -3954, -6889, -7649, -9437, -11017, -8606, -6040, 73, 7330, 11465, 14934, 16063, 14582, 8992, -326, -6740, -10827, -12376, -12241, -10988, -8277, -3148, 3679, 9356, 12198, 9725, 4787, -1067, -6308, -8131, -6457, -4480, -2460, 737, 4908, 8794, 11533, 11118, 7109, 2907, -2593, -8865, -12639, -13764, -10336, -6778, -2373, 3287, 7341, 9465, 7289, 7282, 6538, 4911, 1203, -5001, -10037, -9229, -3005, 1207, 4585, 5604, 5119, 4034, 1788, 22, -1020, -2496, -3481, -5563, -5531, -4841, -6686, -3402, 1103, 4832, 6937, 6488, 4674, 3037, 5650, 6790, 3988, -60, -4009, -5546, -6442, -5927, -2822, -1195, -1670, -2069, -1379, 260, -248, -609, 540, 943, 2588, 4819, 5233, 4664, 7559, 9292, 7159, 1839, -5307, -9495, -12577, -11697, -8424, -5887, -3216, -1918, 1345, 7064, 11928, 12129, 8022, 3762, -189, -2343, -3085, -5395, -6994, -4353, -1877, 1664, 4268, 2566, 484, 551, 1782, 1895, 651, -2316, -3483, -3870, -2716, 143, 2437, 3371, 2496, 2464, 3141, 700, -1915, -2126, -1783, -1237, -756, -97, -1042, -1200, -677, 2463, 5551, 5617, 2846, -2059, -5326, -4974, -4459, -5973, -6326, -6193, -4477, -1417, 4436, 11390, 15073, 14362, 10984, 5973, -1240, -8124, -11604, -12607, -12800, -10057, -8992, -8061, -1636, 5943, 14466, 17343, 13967, 9037, 2211, -2982, -4283, -2832, -3344, -4973, -4954, -2481, -587, -1131, -519, 2878, 4660, 3891, -520, -4782, -5589, -3220, 568, 3992, 5429, 4445, 1598, -476, 1811, 3809, 2944, -656, -3445, -5601, -6435, -6479, -4403, 161, 3673, 4438, 4093, 3877, 2203, 501, 736, 1223, 314, -3390, -7772, -9213, -8429, -3858, 962, 4871, 6861, 6602, 5428, 3864, 3054, 2842, 360, -2750, -6339, -8560, -8134, -6774, -3392, -916, 1401, 2436, 3141, 1714, 868, 2391, 3520, 3632, 2865, 1853, 1535, 2380, 3017, 3076, -33, -4367, -8623, -9747, -8958, -5337, -596, 1049, 3276, 5924, 8496, 9429, 7935, 6440, 2933, -1030, -3547, -5430, -5919, -8238, -8044, -3829, 942, 5592, 5356, 2709, 1123, 519, -347, -1683, -1839, -2902, -1623, -854, 232, 2712, 3098, 2834, 2356, 1496, -1730, -4032, -4460, -2898, -542, 591, 1625, 1672, -328, -1709, -1541, 368, 1320, 77, 218, -395, -82, 1346, 750, 386, 123, -2529, -3395, -1620, 786, 4189, 7312, 7112, 5015, 2998, -2499, -6608, -8837, -8499, -7451, -5396, -1611, 727, 5373, 10117, 15463, 14825, 7212, 454, -4404, -6531, -6813, -6907, -5174, -3303, -998, 1491, 3142, 3525, 821, -101, -1886, -3026, -2068, -3986, -5282, -888, 4501, 7244, 6362, 4786, 3858, 2227, -16, -3912, -6599, -7799, -6669, -4302, -1150, 987, 52, -988, 1183, 5031, 7887, 8211, 4676, 1432, 1076, 365, -1431, -3506, -5056, -5403, -5301, -3478, -843, 3872, 6884, 6965, 5991, 2116, -3463, -7167, -6782, -5354, -3004, -1197, 672, 3669, 7898, 11965, 11553, 6813, 595, -6794, -11695, -11923, -8847, -4661, -1599, 395, 1537, 4634, 6210, 6893, 4733, 1052, -2518, -6717, -9143, -8036, -4344, 59, 4622, 5268, 4943, 4262, 2964, 3204, 4965, 3452, 662, -4011, -9322, -11243, -10760, -5443, 477, 3675, 4299, 4155, 1814, 3075, 7355, 7852, 7388, 4353, -327, -3896, -5177, -2755, 79, 910, 1321, 442, -2832, -5011, -5048, -2935, 810, 2114, -349, -1741, -288, 2273, 6095, 9470, 9765, 6170, 729, -3731, -7323, -8687, -7941, -6146, -4684, -4759, -3585, -2915, -1210, 3272, 6695, 9065, 9077, 7355, 2892, -2763, -4200, -3930, -3828, -5029, -5939, -5496, -4339, 426, 4258, 6883, 7311, 5175, 2880, -359, -2884, -5433, -5140, -2208, 293, 1992, 1547, 1333, 2856, 5051, 4225, 1177, -2620, -6203, -7012, -5846, -2714, 105, 2389, 3832, 5006, 5176, 4556, 2945, -288, -2655, -5659, -6882, -6958, -7141, -5232, -2627, 826, 6239, 9545, 8861, 7630, 5437, 1711, -288, -3320, -6132, -8391, -10681, -10960, -8654, -3588, 1886, 7585, 12147, 14387, 12488, 7627, 2823, -383, -3000, -6950, -9024, -8831, -8365, -4567, 1461, 7014, 9529, 6134, 3956, 1800, -1996, -3285, -3437, -2054, 1169, 4452, 5633, 4727, 3055, 1744, 141, -1598, -4127, -7964, -10958, -10155, -5093, 972, 5175, 5468, 5316, 5446, 2887, 866, 534, -217, 239, 141, -854, -1457, -3140, -3826, -2779, -2924, -3648, -4542, -4907, -1191, 3444, 5886, 5950, 5081, 3528, 1574, -262, -1404, -322, -228, -260, 872, 1792, 22, -1557, -2394, -2510, -1589, -2441, -2602, -807, 2338, 3624, 4343, 5797, 6888, 5759, 2768, 55, -2153, -4641, -6523, -6653, -5482, -2855, 117, 2016, 3972, 5470, 4601, 2903, 522, -841, -2794, -4980, -5013, -4063, -3144, -3410, -3454, -936, 1737, 5009, 6330, 6327, 6302, 3743, 1842, 96, -2999, -7393, -8785, -9119, -7687, -4686, -1907, 2194, 7029, 10796, 10277, 7684, 4056, 875, -971, -3572, -7253, -6854, -5258, -2471, 3160, 7976, 9868, 6759, 1548, -2827, -5169, -6652, -7754, -7156, -5820, -3328, -571, 3907, 11863, 15172, 13157, 9681, 3166, -3994, -9504, -11798, -11850, -10792, -7798, -5469, -2854, 603, 5620, 8883, 8445, 6873, 3551, 154, -2011, -1469, 1239, 2981, 1039, -1900, -3141, -4244, -4535, -1715, 175, 1405, 2938, 2515, 2453, 1409, 994, 1073, -497, -3070, -4557, -3919, -2326, 2548, 6624, 7663, 6856, 2134, -1790, -4094, -4966, -3247, -2194, -2754, -1496, 1879, 4181, 6472, 7065, 4429, 46, -5051, -9995, -11989, -10133, -5672, -1062, 3833, 9133, 12477, 12667, 8239, 3408, -101, -5315, -9606, -11577, -12717, -10458, -4857, 1102, 4872, 6530, 5835, 3259, 2074, 1547, 534, -1953, -3670, -2775, 525, 3989, 4843, 3505, 648, -976, -2020, -3229, -4387, -5248, -4496, -2026, 1071, 2231, 2708, 1422, 702, 2416, 2858, 3852, 4070, 4160, 6547, 6991, 4622, 350, -5592, -8909, -10374, -11583, -9828, -6935, -1538, 4760, 10994, 15575, 13975, 8272, 1702, -2299, -6421, -8556, -9643, -10413, -6416, -303, 4997, 7973, 8722, 6440, 2916, -1453, -4270, -5520, -6058, -5249, -2673, 953, 2802, 3746, 4223, 3859, 3310, 1702, -1801, -4759, -5704, -3438, 100, 3757, 5945, 4898, 2198, -989, -2375, -2802, -2685, -2336, -2703, -2394, -1430, -752, 456, 1548, 2113, 2247, 1028, -335, -378, 1432, 4425, 6416, 6090, 2336, -2508, -5946, -7801, -6761, -5847, -5807, -5363, -3812, 245, 4260, 7819, 9094, 6950, 3152, -1348, -2880, -2702, -650, 1761, 1779, 1809, 1426, -446, -2354, -3995, -5755, -5682, -6039, -6042, -5828, -3207, 2633, 7548, 11281, 13373, 11908, 6779, 1944, -752, -3310, -5589, -7834, -8613, -7581, -5063, -861, 1569, 4134, 5691, 6570, 5264, 2138, 508, -36, -511, -596, 110, -2067, -3967, -4732, -3121, 499, 2626, 3511, 3701, 2237, 1354, 1988, 2079, 1265, -1282, -5309, -7672, -7836, -6788, -3475, -313, 2371, 5713, 7651, 7145, 5276, 3766, 1976, -490, -2597, -4907, -5865, -5982, -4828, -1388, 1483, 2826, 1789, -201, -1890, -2659, -2117, -1412, -1258, -1231, -47, 3535, 7490, 9299, 8572, 4850, 1379, -1739, -3656, -3896, -4797, -5641, -5912, -5106, -4577, -3123, -938, 986, 2009, 2724, 3650, 3976, 5026, 7200, 9880, 10415, 6157, -212, -4546, -7370, -8154, -7978, -7193, -6664, -5494, -2840, 260, 4759, 7333, 6826, 4302, 2075, 562, -242, 182, 907, 1956, 3382, 3100, 1919, -316, -3040, -4052, -4796, -4788, -4267, -3378, -2291, -68, 2911, 4706, 5584, 4378, 1373, -1108, -2355, -2141, -1314, -1345, -599, 349, 1595, 2850, 2931, 2643, 1259, -752, -2926, -4715, -5952, -5822, -3739, -1330, 313, 840, 1524, 2962, 3600, 3865, 3685, 2786, 1250, -398, 107, 1825, 500, -2010, -4136, -6437, -5660, -3268, -648, 1890, 1157, -333, -1463, -1629, 380, 849, 148, -72, 1449, 3035, 3645, 5313, 7629, 8315, 6201, 551, -5130, -9732, -12254, -11135, -9378, -6947, -4607, -1492, 1885, 7598, 12461, 13544, 12249, 8657, 4020, -540, -3578, -4281, -3907, -3418, -2966, -4276, -5303, -4776, -3166, -2574, -2164, -1614, -1553, -678, 1141, 3936, 6861, 9322, 9782, 7618, 2851, -430, -1934, -3526, -4671, -5114, -5841, -6360, -5553, -3451, 83, 1630, 1501, 510, -748, -433, 2158, 3424, 2823, 3323, 4120, 4145, 2979, 2428, 1621, 174, -2506, -5724, -6639, -5901, -4271, -2764, -1320, -719, -551, 350, 1196, 2323, 2736, 1401, 332, 326, 517, 1688, 2778, 3593, 3063, 896, -1123, -3053, -3981, -3810, -2447, -1243, -713, -1393, -2816, -2302, -917, 1336, 2092, 1279, 1293, 1262, 1637, 2833, 5273, 6363, 5081, 2284, -622, -2347, -2343, -2111, -4031, -5010, -6050, -6575, -5395, -3337, 583, 3386, 4374, 4656, 4711, 5326, 6055, 6575, 6457, 5642, 3551, -147, -4462, -6973, -7804, -8075, -7410, -6591, -4357, -1998, -190, 2898, 5007, 6208, 5296, 4560, 4321, 2552, 2260, 1893, 1502, 1065, -631, -3164, -4103, -4442, -4091, -2601, -3010, -3116, -3460, -4013, -2599, -428, 786, 1732, 2685, 3800, 5435, 7486, 8847, 7769, 5933, 2479, -1914, -6222, -10116, -10867, -9120, -6926, -5123, -2423, -61, 2860, 5727, 6646, 6187, 3928, 2082, 978, 855, 1885, 2649, 2349, 1302, 66, -1820, -3590, -5439, -5884, -5760, -5198, -3383, -889, 2467, 4599, 5559, 4714, 3400, 1088, -1514, -2210, -934, 942, 2487, 3919, 4627, 3839, 546, -2214, -4846, -7128, -7539, -7549, -5947, -2291, 1872, 5888, 8138, 8718, 6815, 3648, 432, -1548, -2690, -3777, -3161, -1150, 1199, 1849, 2074, 1568, 537, -963, -2972, -4977, -4903, -3637, -1893, 969, 2998, 4338, 4071, 2689, 1845, 1308, 210, -920, -1213, -196, 1183, 2068, 2921, 2909, 1319, -1112, -4667, -6568, -6870, -6273, -4432, -1498, 1809, 3689, 4887, 5099, 5513, 5459, 3349, 1117, 275, 139, 245, 126, 274, 157, -1501, -4494, -6956, -8000, -8169, -6145, -2854, -252, 2797, 5770, 6499, 7179, 8251, 7330, 4462, 1740, -1509, -4405, -6045, -5831, -4730, -3893, -3197, -2781, -1484, -372, 1158, 3148, 4285, 4213, 3570, 1867, 1158, 1939, 1034, -1168, -2577, -4874, -3642, -2414, -1470, 1349, 1464, 2952, 1553, -1003, -1934, -1031, -609, 372, 2145, 1842, 3143, 3348, 2861, 2715, 2009, 63, -3125, -4920, -5449, -4537, -2610, -1720, -2091, -1800, 207, 1294, 1297, 1465, 2365, 2796, 2485, 1766, 1243, 331, -2457, -3868, -5803, -7389, -6901, -5185, -1258, 1838, 5141, 7812, 7281, 4874, 3030, 2134, -1068, -3889, -4994, -5776, -4888, -2432, 507, 3747, 5414, 4716, 3072, 784, -1495, -2602, -2873, -2154, -710, 645, 2015, 2688, 2438, 1510, 1269, 21, -1458, -2297, -2215, -203, 2182, 2076, 2288, 2667, 1724, 835, -1539, -2765, -3135, -2664, -1894, 136, 1678, 2914, 3467, 3063, 3132, 1568, -447, -2607, -3655, -3318, -2060, -1199, -169, 277, 331, 70, -996, -1226, -1568, -2209, -2478, -2308, -1007, 636, 2249, 3922, 5114, 4750, 2612, 854, -290, -540, -1093, -2036, -2334, -2318, -1754, -1529, -1072, -321, 214, 527, 523, 300, -393, -1113, -687, 576, 1642, 2533, 3700, 3928, 2977, 2286, 1230, 544, 26, -1625, -3606, -5794, -6600, -5855, -4390, -2316, -135, 2230, 3701, 4770, 5447, 5447, 5546, 5317, 4045, 1413, -1783, -4451, -5838, -5692, -4737, -4160, -3725, -2535, -1728, -789, 1059, 2668, 3499, 3437, 2783, 2050, 1109, 1024, 1244, 1154, 1153, 775, -241, -1199, -1465, -1786, -2512, -3184, -4115, -4484, -3840, -2624, -446, 1485, 2920, 3923, 4567, 4740, 4384, 3778, 2498, 1740, 816, -370, -1266, -1684, -2083, -2837, -2944, -2907, -2580, -1794, -1071, -614, 303, 1535, 2425, 2819, 2805, 2978, 2966, 2941, 2246, 1088, 126, -704, -1058, -1241, -1467, -2713, -3695, -3855, -3506, -2060, -649, 318, 742, 1201, 1747, 2035, 2087, 2075, 2130, 2017, 1754, 1433, 988, 183, -595, -964, -1633, -2825, -3956, -4174, -3569, -2122, -310, 377, 1129, 1997, 2396, 2512, 2546, 2140, 1097, -209, -1364, -1406, -747, 61, 399, 178, -188, -792, -1298, -1787, -2179, -1847, -1634, -1220, -132, 351, 1065, 2024, 2368, 1930, 859, -257, -593, -615, -726, -238, 84, -100, -466, -798, -610, -291, -222, -506, -1245, -1879, -1737, -1163, -479, 429, 677, 565, 574, 1318, 2389, 2549, 2628, 2231, 1250, -14, -1212, -1880, -2133, -2173, -2238, -2346, -2302, -1092, 708, 2049, 2917, 2872, 2298, 1273, 400, -9, -317, -480, -967, -1414, -1352, -557, 795, 1856, 1968, 1337, 263, -639, -1243, -1014, -333, 19, 149, 230, 461, 642, 807, 1248, 1008, 384, -590, -1617, -1944, -1809, -869, 67, 833, 862, 491, 254, 351, 518, 526, 566, -114, -636, -649, -804, -837, -488, -326, -332, -809, -1076, -917, -372, 488, 1107, 1156, 1050, 718, 243, 271, 149, 23, -43, -339, -599, -888, -1374, -1448, -1009, -777, -896, -1092, -600, 229, 1002, 1784, 2036, 1469, 837, 280, 601, 688, 23, -868, -1450, -1427, -681, -182, -420, -514, -507, -437, -414, -402, -435, -264, 110, 1050, 1390, 1104, 1086, 981, 1208, 1104, 240, -772, -1013, -688, -197, -106, -424, -626, -739, -319, 515, 647, 207, 326, 861, 1092, 855, 715, 396, 215, 146, -34, -66, -300, -138, 332, 378, 250, 103, -39, -210, -222, -246, -450, -522, -420, -288, -69, 175, 666, 1140, 1076, 970, 830, 381, -249, -513, -552, -823, -886, -874, -907, -990, -678, -538, -563, -198, -39, 48, -15, 171, 346, 367, 213, 84, -189, -167, 238, 397, 203, -428, -779, -940, -889, -662, -274, 64, 182, 284, 386, 614, 935, 1040, 1077, 644, 173, -16, -205, -510, -653, -218, 57, 101, 67, 145, 266, 550, 309, -277, -654, -535, -319, 1, 450, 865, 1213, 1047, 572, 235, 115, -239, -425, -534, -609, -565, -266, 178, 578, 1108, 1352, 1044, 527, -7, -780, -1191, -1304, -1213, -1194, -1340, -964, -132, 845, 1399, 1520, 1330, 973, 515, -214, -929, -1441, -1488, -1145, -616, -289, -164, 202, 571, 664, 318, -242, -744, -1141, -1227, -896, -233, 268, 543, 460, 431, 664, 814, 723, 202, -332, -580, -774, -979, -928, -734, -483, -323, -288, -386, -448, -323, -199, -6, 144, 195, 180, 609, 882, 817, 628, 372, 354, 199, -96, -585, -905, -851, -747, -916, -1082, -881, -502, 56, 952, 1689, 1894, 1850, 1395, 956, 855, 639, 62, -705, -1337, -1714, -1498, -1058, -723, -335, 364, 723, 851, 972, 905, 591, 294, 236, 159, 279, 207, 205, 343, 424, 299, -110, -530, -792, -787, -571, -440, -305, -28, 92, 185, 163, 138, 182, 214, 87, -54, -13, 85, 360, 682, 797, 683, 354, 40, -111, -447, -844, -881, -648, -395, -257, -143, -101, -26, -188, -155, 54, 312, 429, 497, 657, 678, 666, 805, 716, 314, -110, -511, -649, -865, -795, -895, -925, -704, -403, -65, 191, 596, 960, 1293, 1503, 1588, 1375, 889, 207, -305, -543, -759, -957, -1092, -1132, -943, -660, -285, -2, 211, 628, 834, 1015, 1228, 1161, 902, 538, 286, 10, -432, -1081, -1441, -1594, -1477, -1011, -494, -44, 251, 416, 540, 552, 564, 504, 97, -350, -554, -425, -175, 106, 306, 361, 363, 48, -251, -516, -626, -704, -623, -387, -79, 189, 304, 368, 397, 344, 227, 27, -125, -246, -224, -82, 111, 359, 550, 609, 441, 133, -176, -437, -638, -581, -474, -329, -56, 296, 476, 481, 394, 355, 458, 469, 372, 264, 276, 250, 177, -36, -252, -610, -809, -701, -276, 133, 261, 285, 137, 16, -45, -101, -199, -220, -155, 213, 630, 996, 994, 513, 241, -164, -673, -1182, -1671, -1793, -1430, -704, 91, 737, 1330, 1701, 1685, 1299, 647, -153, -784, -1135, -1261, -1104, -864, -556, -165, 162, 342, 415, 395, 235, -45, -145, -148, -118, -16, 152, 314, 283, 162, -45, -93, -64, -48, -141, -290, -429, -356, -353, -335, -171, -197, -248, -162, 95, 422, 670, 712, 637, 521, 355, 123, -180, -486, -694, -725, -525, -222, 19, 114, -20, -31, 36, -55, -33, 104, 168, 313, 628, 899, 1067, 731, 182, -226, -601, -796, -888, -815, -513, -180, 130, 303, 450, 509, 429, 181, -74, -247, -169, -90, 32, 171, 433, 719, 745, 561, 175, -191, -573, -974, -1217, -1223, -1129, -840, -422, 182, 737, 1175, 1320, 1303, 1224, 958, 546, 137, -161, -436, -641, -686, -595, -430, -235, -38, 134, 325, 412, 204, -155, -207, -231, -154, 90, 307, 626, 944, 1009, 943, 770, 299, -208, -641, -1142, -1145, -902, -693, -465, -337, -165, 83, 279, 380, 247, 127, 246, 303, 372, 319, 287, 213, 38, -113, -355, -581, -676, -644, -508, -420, -325, -433, -420, -148, 167, 459, 557, 648, 689, 672, 564, 426, 313, 153, -166, -504, -625, -640, -631, -628, -579, -483, -207, 15, 246, 475, 494, 384, 272, 228, 222, 228, 350, 509, 627, 508, 323, 33, -255, -526, -810, -867, -781, -524, -235, 51, 227, 343, 440, 478, 401, 308, 204, 310, 519, 603, 431, 152, -146, -417, -693, -759, -682, -511, -415, -303, -141, 119, 406, 485, 603, 644, 514, 356, 206, 122, 125, 92, -76, -280, -361, -248, -143, -84, -21, 29, -83, -147, -197, -155, -177, -201, -123, 31, 205, 404, 573, 702, 704, 669, 467, 99, -285, -673, -889, -943, -812, -608, -416, -61, 203, 356, 561, 637, 537, 317, 161, 2, -58, -85, -113, -190, -148, -81, -91, -170, -268, -408, -562, -456, -385, -239, -16, 153, 368, 425, 424, 239, 65, -28, -41, -22, 12, 99, 160, 178, 34, -183, -340, -366, -315, -235, -226, -132, -29, 86, 142, 155, 232, 245, 259, 194, 19, -56, -32, -75, -200, -363, -433, -433, -343, -290, -227, -62, 44, 152, 169, 134, 67, 1, 39, 105, 107, 37, -9, -10, 36, 106, 109, -31, -168, -305, -386, -361, -202, -76, -45, -21, 167, 348, 347, 312, 264, 135, -88, -340, -437, -270, 69, 386, 559, 482, 357, 177, -66, -246, -337, -409, -438, -273, -24, 104, 209, 341, 468, 499, 440, 331, 101, -7, -219, -329, -337, -229, -116, -81, -31, 12, 85, 88, 92, 133, 220, 170, 110, 44, -88, -190, -80, 8, 63, 122, 179, 237, 242, 187, 77, -28, -164, -273, -217, -21, 214, 353, 348, 344, 247, 142, 39, -135, -282, -265, -194, -116, 17, 222, 353, 444, 376, 159, -72, -221, -264, -220, -154, -96, -1, 151, 314, 378, 346, 225, 28, -225, -370, -366, -202, -46, 120, 264, 414, 403, 295, 238, 151, 115, 79, 4, -106, -162, -230, -204, -181, -103, -16, 6, -19, -33, -76, -106, -50, 44, 147, 171, 135, 58, -21, -94, -85, -98, -78, -77, -143, -150, -199, -243, -218, -182, -161, -105, 12, 128, 189, 156, 21, -203, -365, -418, -411, -340, -188, -32, 78, 144, 174, 236, 331, 253, 39, -162, -337, -345, -350, -249, -211, -180, -82, 54, 164, 289, 366, 460, 458, 237, 11, -166, -285, -232, -110, -3, 33, 41, 21, -13, 51, 169, 217, 176, 112, 64, 13, -7, 50, 163, 317, 292, 157, 34, -152, -281, -318, -359, -373, -298, -182, 2, 180, 319, 311, 262, 109, -46, -214, -257, -154, 1, 100, 189, 152, 51, -54, -122, -192, -321, -424, -437, -339, -124, 98, 290, 391, 434, 403, 318, 207, 90, -75, -164, -226, -253, -266, -209, -122, -71, 3, 118, 141, 50, -19, -10, 18, 29, -3, -49, -104, -93, -68, -30, -9, 40, 76, 65, 37, -5, -28, -108, -291, -378, -418, -398, -246, -104, 140, 283, 401, 434, 312, 213, 125, 28, -93, -153, -169, -193, -104, 13, 132, 190, 210, 209, 165, 83, 71, 0, -52, -19, 34, 66, 99, 152, 215, 173, 107, 4, -35, -11, 3, 10, -43, -92, -113, -110, -67, -23, 24, 63, 70, 56, 47, -29, -93, -83, -34, 27, 48, 27, 76, 109, 93, 59, 42, 14, -73, -173, -217, -171, -85, 13, 114, 136, 187, 204, 178, 128, 82, 70, 22, -1, -8, -24, -9, -60, -40, -48, -43, -82, -98, -88, -35, 19, 109, 159, 194, 178, 116, 83, 65, -7, -96, -181, -173, -174, -166, -190, -198, -179, -119, -47, -11, 52, 90, 154, 173, 156, 131, 57, -38, -105, -147, -134, -113, -86, -66, -48, 15, 75, 130, 103, 86, 52, 5, -66, -66, -26, -4, 40, 37, -1, -32, -53, -44, -28, -6, 16, 32, 56, 98, 158, 185, 118, 41, -5, -56, -87, -67, -37, 10, 21, 6, -16, 19, 51, 28, 31, 8, 15, -23, -16, -11, 20, 28, -4, -70, -96, -98, -82, -83, -47, 14, 73, 62, 84, 134, 151, 174, 136, 68, -35, -106, -139, -152, -169, -166, -139, -120, -38, 23, 93, 120, 171, 172, 149, 125, 50, -9, -61, -75, -62, -75, -121, -102, -85, -58, -22, -28, -123, -156, -125, -9, 91, 150, 199, 239, 182, 125, 56, -19, -89, -127, -170, -210, -198, -173, -96, 7, 79, 131, 99, 34, -25, -12, 28, 64, 61, 57, 61, 46, 24, 16, 21, 0, -45, -87, -73, -36, -3, 12, -5, -3, -10, -24, -35, -49, -19, 50, 118, 149, 87, 26, -20, -35, -61, -86, -110, -78, -5, 24, 59, 82, 67, 46, -3, -47, -124, -152, -140, -84, -3, 72, 100, 105, 106, 104, 58, -15, -77, -127, -133, -125, -91, -43, 23, 91, 117, 92, 36, -32, -98, -115, -79, -20, 42, 81, 108, 103, 76, 36, -10, -52, -77, -132, -142, -109, -33, 59, 119, 110, 89, 67, 45, 34, 19, 41, 60, 69, 55, 30, -17, -35, -32, -11, 1, 15, 23, 17, 24, 45, 76, 58, 29, -19, -39, -60, -40, -12, 35, 65, 66, 40, 29, -1, 3, -17, -39, -66, -70, -60, -33, 6, 49, 32, -17, -39, -39, -37, -41, -29, 4, 42, 48, 64, 82, 64, 36, -24, -78, -136, -133, -119, -77, -31, 18, 44, 29, -8, -28, -41, -26, -7, 16, 23, 52, 47, 52, 30, -22, -54, -75, -65, -36, 14, 63, 95, 97, 87, 45, -16, -29, -38, -31, -47, -47, -19, 4, 42, 55, 70, 69, 50, 31, 17, -9, -9, -34, -25, -28, -4, 16, 32, 52, 44, 35, 27, 54, 56, 34, 13, 8, -8, -10, -11, -5, -12, -5, -7, -14, -4, 7, -2, -3, -16, -32, -36, -33, -5, 16, 24, 22, 25, 29, 41, 37, 6, -21, -49, -73, -77, -83, -86, -51, -27, 15, 30, 54, 72, 78, 69, 53, 29, -27, -97, -110, -117, -112, -105, -64, 5, 45, 83, 80, 74, 44, 22, -9, -45, -56, -61, -40, -29, -2, 13, 16, 5, -1, 6, 24, 28, 8, -1, -25, -52, -71, -58, -58, -47, -29, 13, 45, 48, 31, 19, 22, 47, 57, 30, -7, -50, -57, -50, -12, 24, 56, 72, 57, 25, -19, -28, -39, -52, -54, -55, -46, -7, 27, 56, 78, 79, 78, 60, 24, -19, -65, -80, -78, -57, -41, -12, 0, 10, 18, 27, 15, 34, 42, 44, 54, 71, 83, 46, -16, -76, -83, -92, -70, -61, -39, -21, 13, 19, -8, -26, -1, 31, 36, 50, 58, 60, 30, 11, -9, -34, -56, -57, -59, -57, -42, -3, 49, 77, 96, 89, 66, 31, 5, -23, -43, -27, -6, -21, -38, -19, 2, 17, -2, -22, -31, -2, 14, 22, 20, 18, 21, 35, 33, 16, 29, 27, 23, 24, 22, 0, -44, -74, -80, -49, -16, 12, -27, -43, -15, 38, 47, 43, 51, 55, 53, 8, -28, -75, -98, -73, -16, -7, 6, 48, 75, 81, 49, 7, -17, -18, -34, -24, -25, -21, -6, 15, -5, -11, -6, 0, 27, 48, 93, 82, 47, -21, -61, -116, -114, -84, -80, -63, -38, 8, 41, 65, 89, 92, 76, 55, 28, -23, -62, -43, 3, 26, 38, 25, 21, -10, -36, -34, -48, -67, -46, -21, 3, 59, 106, 122, 96, 71, 48, 17, -30, -45, -31, -10, -15, -41, -72, -78, -30, -15, -10, 0, 21, 41, 9, 23, 29, 59, 74, 50, 5, -24, -26, -16, -11, -13, -30, -56, -79, -95, -90, -53, -6, 38, 69, 81, 75, 68, 50, 45, 33, 15, -23, -56, -82, -102, -95, -38, 16, 31, 30, 8, -7, -24, -16, -12, -2, 10, 12, 29, 33, 33, 38, 26, 7, 5, 6, -4, 10, 19, 34, 25, 12, -7, -1, 16, 28, 15, -10, -19, -19, -10, 4, 13, -3, -16, 0, 29, 48, 21, -4, -21, -18, -13, -27, -25, -22, -3, 9, -10, -9, 9, 31, 24, -8, -25, -25, 7, -1, -4, -32, -28, -24, -29, -26, -33, -23, -25, -16, -26, -35, -54, -23, 9, 42, 32, 26, 16, 28, 4, -18, -26, -18, -20, -26, -31, -5, 21, 36, 20, -4, -13, -27, -23, -40, -42, -18, 11, 23, 28, 21, 35, 49, 43, 25, 8, 8, -25, -27, -32, -29, -47, -37, -14, 1, 1, -11, 1, 39, 61, 62, 48, 60, 45, 11, -11, -17, -31, -59, -74, -79, -60, -13, -6, -24, -34, -30, 3, 21, 38, 39, 51, 82, 101, 95, 50, -3, -20, -38, -47, -50, -45, -31, -35, -50, -41, -28, 11, 34, 40, 43, 40, 23, 16, -4, 4, 10, 52, 39, 25, -3, -10, -22, -32, -33, -24, -21, -11, 3, -1, 17, 29, 47, 37, 23, 12, -5, -35, -58, -38, -46, -39, -24, -7, 17, 38, 35, 42, 13, 33, 10, -7, -34, -38, -16, 8, 35, 53, 52, 12, -4, 1, 23, 26, 43, 47, 45, 50, 93, 125, 167, 141, 110, 25, -32, -99, -102, -111, -85, -66, -18, 36, 76, 103, 99, 120, 146, 160, 114, 94, 54, 37, -22, -42, -63, -57, -102, -139, -133, -102, -62, -28, 24, 70, 102, 108, 108, 69, 64, 77, 59, 31, 33, 40, 24, 7, 2, -20, -52, -89, -110, -129, -161, -146, -112, -49, 1, 53, 112, 165, 167, 128, 69, 35, 16, -1, -51, -92, -120, -128, -94, -48, 12, 101, 154, 175, 166, 126, 57, -25, -73, -131, -188, -214, -168, -120, -49, 13, 119, 239, 291, 308, 265, 194, 91, -24, -129, -215, -244, -243, -172, -100, -21, 26, 113, 175, 214, 220, 179, 135, 125, 142, 119, 122, 60, 7, -56, -107, -118, -130, -119, -110, -114, -149, -168, -136, -72, 16, 59, 101, 114, 159, 154, 146, 116, 94, 61, -6, -111, -208, -290, -292, -248, -168, -120, -89, -71, -24, 41, 127, 178, 169, 140, 98, 21, -23, -43, -12, 2, 42, 20, -1, -88, -127, -167, -123, -80, -25, 25, 69, 102, 111, 85, 55, 18, -1, 10, 7, -39, -66, -61, -24, 12, 14, 17, 63, 133, 172, 164, 115, 89, 37, -33, -135, -196, -197, -181, -123, -90, -12, 30, 126, 159, 209, 231, 258, 278, 249, 216, 107, -27, -176, -286, -356, -399, -359, -309, -179, -78, 70, 207, 331, 393, 394, 362, 288, 189, 39, -120, -216, -286, -241, -157, -80, 22, 87, 153, 146, 106, 5, -117, -165, -190, -174, -88, 72, 224, 290, 318, 345, 301, 258, 106, -33, -204, -337, -443, -390, -242, -63, 85, 220, 299, 313, 302, 269, 189, 90, -27, -138, -175, -221, -198, -142, -54, 13, 71, 98, 99, 153, 163, 123, 68, 4, -41, -62, -88, -131, -146, -135, -107, -35, 27, 101, 107, 140, 197, 258, 306, 305, 234, 147, 53, -52, -216, -323, -400, -352, -288, -177, -42, 74, 176, 222, 270, 322, 324, 257, 177, 62, 3, 0, 2, -27, -98, -129, -175, -214, -254, -262, -197, -108, 7, 96, 150, 200, 259, 324, 342, 310, 202, 49, -134, -231, -226, -154, -99, -49, -12, 29, 71, 107, 65, 25, -69, -147, -195, -151, -75, 59, 150, 294, 402, 460, 395, 236, 60, -161, -312, -378, -407, -330, -178, -27, 110, 213, 277, 330, 302, 167, -26, -236, -409, -470, -443, -299, -107, 100, 289, 425, 532, 548, 471, 250, -35, -262, -464, -518, -534, -471, -354, -212, -27, 121, 273, 362, 371, 344, 250, 163, 74, 28, -21, -10, 2, 9, -72, -166, -272, -304, -293, -230, -173, -73, 16, 65, 158, 271, 307, 318, 259, 165, 57, -19, -60, -54, -15, 41, 79, 86, 28, -74, -200, -275, -302, -248, -191, -75, 67, 251, 406, 528, 564, 483, 314, 65, -149, -295, -385, -400, -354, -259, -157, 12, 188, 351, 453, 377, 242, 90, -40, -126, -193, -199, -187, -90, 42, 160, 239, 252, 196, 148, 53, -13, -69, -113, -91, -89, -73, -78, -31, -13, -25, -82, -166, -188, -178, -116, -30, 61, 165, 319, 401, 451, 361, 221, 27, -140, -270, -338, -382, -377, -329, -191, -20, 140, 225, 233, 209, 198, 236, 284, 331, 313, 251, 154, 52, -57, -156, -235, -304, -321, -321, -232, -127, 2, 132, 275, 371, 441, 425, 252, 77, -30, -92, -61, 47, 139, 164, 189, 134, 29, -71, -184, -296, -352, -392, -341, -215, -37, 175, 364, 529, 616, 596, 442, 128, -111, -353, -504, -551, -510, -386, -163, 102, 358, 517, 555, 447, 265, 16, -230, -409, -477, -472, -441, -363, -196, 37, 332, 519, 556, 492, 343, 171, 18, -139, -247, -280, -267, -240, -170, -117, -106, -72, -38, -23, -12, 20, 33, 74, 144, 261, 410, 468, 417, 300, 63, -154, -311, -361, -292, -263, -201, -160, -21, 86, 170, 129, 80, 23, -39, -48, -3, 83, 238, 387, 453, 444, 340, 85, -128, -360, -471, -558, -543, -460, -268, -25, 178, 336, 477, 461, 357, 221, 38, -115, -211, -208, -130, -52, 70, 178, 198, 78, -44, -135, -171, -179, -163, -153, -124, -36, 176, 318, 413, 334, 90, -135, -366, -497, -470, -334, -163, 80, 324, 955, 2392, 3483, 3441, 2347, -453, -3639, -6084, -7509, -7655, -6987, -4818, -2224, 1616, 5798, 7832, 8387, 7231, 5127, 2639, 186, -1471, -3095, -3695, -2826, -1503, 243, 1206, 846, -175, -1236, -2162, -3106, -3259, -2869, -1883, 277, 2800, 5032, 5772, 4954, 3839, 2812, 1437, 135, -961, -2541, -3301, -2909, -2316, -1347, -251, -136, -503, -1204, -1578, -829, 394, 1363, 2526, 3778, 4252, 4203, 3156, 929, -1358, -3012, -4330, -4780, -4143, -2909, -424, 2493, 4396, 4861, 3848, 1713, -613, -1972, -3205, -4175, -4418, -3606, -1624, 342, 2288, 3869, 4758, 4299, 2785, 1540, 37, -662, -1101, -1951, -1948, -1945, -713, 616, 914, 332, -1645, -3979, -4911, -4788, -4039, -2542, -600, 3094, 6866, 10811, 12985, 11552, 7504, 2015, -3831, -8710, -11195, -11902, -11186, -8770, -3864, 1281, 6218, 8764, 8879, 7496, 5213, 3156, 210, -2515, -4138, -3592, -1505, 1445, 3875, 3205, 1405, 371, -1041, -2056, -2727, -3942, -4527, -3437, -1712, -272, 828, 892, 1337, 2128, 2157, 2670, 3265, 3025, 2513, 1635, 87, -1175, -2545, -5308, -6796, -6163, -4784, -2168, 427, 2158, 5246, 7944, 7856, 5901, 2433, -2110, -5094, -7722, -10464, -9774, -7147, -1167, 5479, 10367, 13466, 12384, 8769, 3217, -1048, -4844, -8731, -11197, -12226, -11161, -8430, -3403, 2806, 7737, 9563, 8494, 6118, 2856, 221, -599, -922, -1423, -580, 1346, 2402, 2889, 2103, 280, -2056, -4752, -6886, -8871, -8862, -7314, -3896, 1268, 6761, 10544, 10690, 8739, 5092, 2298, 1060, -970, -4424, -6803, -6964, -6333, -2818, 1233, 2697, 2763, 827, -825, -1374, -2476, -3145, -2554, -1088, 1091, 2642, 1196, -373, -259, 1249, 3047, 3480, 2131, 1595, 2243, 1615, 1464, -159, -2782, -4251, -5903, -6434, -4517, -2241, 1374, 5977, 9398, 10153, 6927, 2070, -2995, -5689, -5769, -5691, -4575, -2019, 761, 6143, 10187, 13567, 14188, 9178, 1664, -6936, -13057, -16282, -16308, -14608, -9655, -1211, 7092, 13300, 16671, 16379, 14764, 10656, 4357, -3063, -9769, -12659, -13097, -10666, -7291, -3364, 1035, 3995, 5517, 5521, 2743, -504, -1493, -1684, -1107, -156, 315, 766, 1476, 2768, 3100, 2398, 833, -353, -1531, -771, 677, 712, -810, -3802, -4901, -5159, -4299, -1258, 2110, 4350, 7402, 8545, 5749, 2088, -1601, -3418, -4392, -5705, -5934, -4941, -2473, 2156, 7284, 10074, 10435, 6061, -1270, -6060, -9358, -10591, -8331, -5389, -1767, 1740, 4506, 7427, 7988, 7517, 6161, 3262, -354, -3453, -5779, -7480, -6720, -1604, 3137, 6302, 7067, 2341, -756, -2858, -4742, -4569, -4888, -3961, -1562, 776, 2338, 4523, 6841, 7899, 8106, 5631, 2379, -1462, -5996, -8396, -8010, -6520, -5267, -5558, -6321, -3857, 512, 5577, 10729, 11780, 9146, 6442, 1731, -899, -3210, -6907, -9635, -11031, -8745, -4061, 1469, 6554, 12207, 14247, 11687, 5673, -3229, -9717, -13369, -13678, -10086, -5180, -910, 3539, 7179, 9897, 12838, 12459, 6451, -434, -6572, -10185, -9587, -9022, -4843, 323, 5352, 8762, 8512, 7062, 1834, -3036, -6596, -8017, -6841, -6402, -6578, -5548, -1012, 8416, 14955, 13388, 9558, 4494, -660, -4887, -7419, -7770, -7088, -5563, -5638, -4941, -2939, 20, 3626, 6330, 8586, 8119, 4068, -1230, -4170, -2280, 1644, 2470, -385, -2960, -3816, -2827, -773, 1344, 2054, 257, -1099, -2217, -748, -391, -2380, -717, 708, 2062, 3751, 2307, 2353, 4106, 3733, 2998, -1819, -6638, -7710, -9795, -7397, -1476, 4381, 8964, 10292, 9477, 6677, 4009, -947, -5612, -8058, -9696, -10870, -10837, -6003, 2260, 11445, 18045, 18772, 13145, 2811, -6363, -11930, -13439, -10371, -6844, -5694, -5222, -3001, 2512, 9288, 12683, 12578, 8098, 1677, -4468, -8794, -9118, -7066, -2867, 523, 3658, 6818, 7430, 7094, 4763, 2156, -1238, -6657, -9981, -11524, -9661, -5522, -421, 4329, 7056, 9005, 8457, 6448, 3653, 1389, 1146, -437, -2346, -4676, -7712, -8516, -5941, -1782, 4444, 8796, 8789, 7460, 4247, 1049, -1083, -3645, -5279, -5965, -7737, -6803, -3934, 2515, 10778, 15267, 14508, 8112, -649, -6894, -9742, -10999, -9124, -7191, -4418, -621, 5090, 9021, 12298, 11586, 4032, -2428, -9992, -12577, -12742, -9760, -2267, 5111, 13561, 16153, 14973, 10309, 1911, -2979, -7033, -10843, -12905, -15082, -15485, -11260, -752, 10041, 18440, 20702, 16057, 8520, -731, -7272, -9608, -10246, -9562, -8175, -5443, -1170, 2923, 7311, 9872, 11026, 7114, -206, -6418, -11329, -9751, -5834, -1173, 4194, 5077, 5230, 5124, 6779, 9021, 7480, 2166, -4780, -9545, -11702, -10970, -9131, -5338, -777, 3081, 7074, 8698, 7305, 6705, 5772, 4267, 603, -5011, -10518, -15480, -13482, -6401, 1600, 9601, 14830, 16188, 12924, 7502, -344, -6418, -8556, -11879, -13159, -11879, -8440, -3816, 4092, 12242, 17304, 17660, 9111, -1285, -7551, -8924, -8140, -5589, -5199, -3962, -1679, 2247, 7820, 9532, 9008, 3357, -3297, -9296, -11394, -10568, -8379, -2379, 4419, 10675, 12764, 9785, 5762, 4430, 3417, 225, -4856, -9370, -11874, -10534, -7521, -4340, 52, 2489, 4399, 6699, 8022, 6871, 2883, 472, -1597, -3923, -6539, -8918, -8445, -4710, 3040, 9816, 12680, 12989, 9039, 2905, -2354, -7212, -10829, -13986, -13731, -11054, -3858, 3650, 12347, 20155, 19778, 16655, 5863, -5179, -12807, -17820, -15618, -11475, -4674, 3451, 8811, 12641, 13895, 12389, 7098, -1450, -9205, -15348, -18170, -16267, -11356, -3007, 6610, 14519, 18428, 18000, 13373, 5584, -760, -5775, -10378, -13220, -13981, -11844, -6236, -375, 5807, 7333, 6796, 6280, 3589, 1414, -143, -1372, -2140, -735, -754, 122, 549, 1071, 3160, 2739, 3465, 2448, -2090, -5009, -5277, -3553, -2821, -3250, -4061, -2616, 345, 4109, 8887, 10063, 8698, 7030, 2564, -1160, -4410, -8653, -9995, -10327, -6215, -649, 3918, 9059, 12206, 13276, 8535, -142, -8497, -14761, -14519, -12851, -8261, 891, 5809, 12644, 17345, 15935, 13591, 5644, -3772, -11387, -15879, -16381, -14563, -10105, -3172, 7561, 15071, 16756, 13832, 6308, -1167, -6988, -10510, -11472, -10283, -7545, -2429, 5816, 15181, 19729, 17470, 9555, 473, -6455, -12644, -14658, -15288, -13776, -9770, -5089, 1725, 8308, 12856, 14376, 14903, 11823, 6890, 822, -6963, -11663, -9862, -4843, -1441, 1570, 1366, 1121, 2623, 3992, 4022, 1809, -2180, -5249, -4864, -3670, -3053, -1896, 1537, 5006, 7859, 8858, 5697, 3717, 2554, -1523, -4219, -8107, -11795, -11847, -10156, -4964, 3210, 10635, 13234, 10968, 5464, 953, -2757, -8275, -10686, -10527, -9929, -4522, 733, 8626, 17246, 17489, 14824, 8089, -2137, -10900, -17960, -21436, -19084, -11493, -2671, 4945, 11268, 15374, 16493, 12904, 6322, -1069, -8201, -13086, -14567, -11712, -3486, 5647, 11453, 13059, 13392, 8601, 49, -5634, -12101, -14240, -14240, -13453, -11090, -5587, 3124, 12078, 19449, 20484, 14771, 6152, -1409, -5611, -7662, -9378, -9146, -8854, -7440, -4865, -3116, 918, 6109, 8423, 7717, 4745, 497, -2289, -2189, -1590, -779, -643, -531, -1558, -355, 2779, 4576, 5342, 4315, 2448, -398, -3345, -7004, -8269, -6476, -3992, -2356, -45, 2712, 6238, 9650, 9221, 7127, 2412, -4902, -9222, -11046, -8075, -1040, 4254, 9258, 12585, 11317, 7882, 1583, -6035, -9645, -11976, -14120, -13564, -10187, -3281, 5622, 14431, 21517, 21024, 12950, 3633, -4747, -9086, -10884, -11601, -10704, -8132, -2706, 2792, 9563, 12812, 10216, 5631, -2105, -8931, -11106, -12183, -10704, -4251, 4180, 11724, 14373, 13782, 12043, 8508, 2846, -3332, -9397, -13897, -16094, -14421, -8539, -491, 6680, 9296, 9672, 9845, 7617, 4028, -21, -2638, -866, -913, -1395, -4159, -5509, -3553, -1936, 2157, 4423, 3623, 918, 616, 1179, 2132, 1509, -2848, -7558, -9523, -7571, -2679, 3538, 8264, 11835, 10514, 7432, 5652, 1611, -2622, -6076, -9886, -10818, -8012, -5108, 1844, 7558, 9787, 10723, 3876, -4917, -10026, -13705, -12197, -5940, 273, 8236, 13395, 16128, 18965, 15759, 7230, -2573, -12952, -19051, -20231, -19442, -14049, -3986, 5303, 13489, 17453, 12408, 6793, 1773, -3748, -5760, -6888, -6996, -5605, -2408, 3482, 8207, 10931, 8508, 1461, -3750, -8248, -11429, -11325, -9456, -4246, 114, 4089, 6807, 5997, 6366, 6354, 6137, 5355, 2764, -1212, -3224, -1839, -970, -2373, -3327, -5440, -6313, -3519, -661, 2933, 6391, 8985, 7654, 4093, -329, -5508, -8166, -7839, -5535, -2553, 1799, 5773, 11104, 13195, 11625, 6849, -2647, -9124, -16429, -19533, -16601, -10498, -808, 8682, 14365, 14478, 13844, 6938, -141, -4756, -10446, -13331, -12946, -8167, 1229, 13017, 19470, 20110, 12282, 1839, -8832, -17133, -19975, -20601, -15340, -10627, -1464, 9428, 16191, 21269, 17919, 13406, 7067, -1636, -8518, -13886, -13246, -9572, -3175, 3273, 5563, 4289, 2774, -539, -2095, -2791, -4525, -5837, -5436, -1765, 2199, 7035, 8033, 7804, 5817, 3649, 1619, -964, -1648, -2897, -1646, -1183, -3206, -5224, -8068, -7021, -3063, 2630, 7716, 7440, 5987, 4043, 4034, 3941, 1436, -2001, -6967, -10206, -11304, -7069, 2160, 10145, 16337, 16067, 10367, 1939, -7412, -12570, -16092, -15397, -10171, -5688, 780, 8316, 14122, 19196, 17645, 11275, 838, -9687, -16234, -18249, -11805, -3944, 4001, 9789, 11003, 10917, 7983, 2850, -3036, -9009, -12349, -14479, -13631, -8526, -858, 8108, 15641, 18551, 16012, 9505, 938, -5523, -9065, -10020, -8310, -5936, -3889, -1401, -444, 447, 3123, 5343, 4738, 2446, -1474, -3814, -3272, -292, 3286, 2457, 1955, 566, -1092, 965, 3098, 2800, 2282, 1154, -1206, -3711, -7041, -9000, -6781, -3226, -202, 4370, 6467, 6376, 8239, 8846, 8496, 4750, -2727, -9667, -15375, -14166, -6926, 653, 7654, 13058, 13988, 11214, 5884, -1814, -8119, -11933, -14168, -13682, -9750, -5899, 1385, 10887, 19206, 22682, 15901, 5254, -6459, -13081, -13080, -12402, -10550, -6776, -89, 8129, 12849, 13461, 9553, 2731, -4597, -9013, -10931, -11002, -9821, -4481, 4326, 12657, 16061, 13071, 7316, -48, -2066, -4869, -6243, -6946, -7235, -5634, -3844, -1118, 2388, 3270, 2581, 3702, 2896, 760, 368, 1895, 1891, 2746, -118, -4327, -6070, -4561, -1456, 2005, 4695, 7028, 5913, 2784, -1612, -5876, -6627, -7955, -8067, -6485, -3402, 1945, 11389, 16143, 15814, 11078, 735, -9059, -14485, -15866, -13322, -8640, 854, 9766, 14648, 17066, 13095, 6690, -1159, -6569, -12179, -18073, -18652, -15164, -5719, 7308, 17326, 23153, 19924, 11857, 4562, -2530, -8937, -13373, -14862, -15503, -10550, -3017, 4494, 9952, 11635, 10370, 4202, -674, -6573, -10327, -9679, -5732, 187, 4759, 7142, 5101, 4132, 4092, 3974, 2500, -642, -4997, -7876, -7531, -5566, -3143, -2755, -3409, -3635, -2233, 583, 3718, 7731, 10406, 11894, 9780, 2847, -4253, -10353, -13095, -11473, -6190, -730, 4409, 8263, 10063, 11172, 9425, 3397, -3792, -12832, -18545, -15615, -9204, 1337, 12129, 19029, 20347, 14958, 6482, -2379, -9284, -13713, -15860, -11901, -6907, -617, 7251, 13294, 18678, 16124, 8721, -3413, -16311, -21017, -20686, -14008, -4133, 5187, 13716, 17037, 18661, 17071, 10362, 2237, -8869, -15681, -18408, -19434, -14522, -6637, 5225, 13161, 13591, 10772, 4992, 427, -2087, -4904, -6548, -3619, -85, 1280, 985, 2657, 5162, 6949, 7298, 4540, -707, -7321, -8393, -4771, -2215, -3107, -6413, -9875, -8898, -4536, 2356, 10428, 15260, 17952, 15880, 9706, 768, -6767, -13953, -18292, -17328, -13667, -8102, -747, 11759, 18904, 21331, 17096, 4367, -6734, -15866, -19809, -16066, -12154, -4927, 5476, 12795, 21473, 23414, 17972, 6291, -5465, -12478, -17150, -19037, -18538, -11044, -794, 10514, 20204, 19592, 11259, 2722, -5680, -9950, -9893, -8444, -7118, -3647, 4428, 13500, 17283, 14666, 8207, -304, -7087, -12065, -13461, -14031, -8610, -2414, 1625, 3648, 1854, 3437, 3651, 4515, 6180, 5654, 2682, 375, 1838, 3935, 1857, -1275, -4232, -7220, -5051, -2993, -22, 2573, 4148, 3751, -506, -4123, -8148, -8768, -9716, -6149, 1454, 7479, 14511, 18619, 19848, 13829, 3896, -5980, -14745, -21352, -23352, -18574, -10335, 1634, 13902, 21145, 22333, 16029, 6500, -3096, -11302, -16664, -19134, -16115, -10946, 36, 13271, 21937, 26808, 22076, 9811, -2763, -13762, -20401, -22109, -20650, -14207, -3578, 6829, 14633, 16645, 14150, 8968, 2971, -2498, -7938, -9819, -7940, -2380, 3844, 9548, 11298, 6376, 469, -3740, -6777, -6855, -6777, -6075, -4064, -2625, -349, 259, 1530, 1871, 1767, 4177, 6326, 5731, 7008, 6576, 4919, 3148, -2190, -7206, -12968, -15376, -14142, -9002, -288, 7496, 10127, 10987, 7650, 1778, -3043, -8067, -10628, -10151, -4960, 1245, 10733, 15927, 16367, 13118, 2519, -6573, -14567, -21811, -22761, -17868, -7051, 6416, 15996, 21661, 20338, 14473, 7933, -860, -10498, -17132, -18918, -15610, -6288, 7363, 16131, 22428, 21068, 12666, 3876, -8558, -15421, -18433, -17997, -15384, -9146, -1151, 6887, 13880, 16007, 15438, 10705, 3940, -2233, -5740, -5902, -2228, 637, 1657, 433, -3511, -5355, -4945, -3443, -1409, -665, 66, 1170, 2853, 4261, 2391, -501, -3158, -3309, -1147, 578, 5351, 9133, 11341, 11526, 7141, -498, -9033, -16463, -21192, -19602, -12769, -3846, 4404, 13347, 18393, 20397, 15278, 7054, -840, -9305, -14405, -16042, -12499, -3844, 6582, 13937, 18243, 14090, 6767, -3074, -12984, -16551, -15470, -13621, -9149, -2612, 5069, 13676, 18476, 18163, 12325, 3065, -7172, -13574, -14103, -10134, -4308, 2560, 7971, 10593, 9817, 5996, 146, -4876, -8480, -10743, -11894, -10651, -5583, 119, 4613, 7061, 8292, 7630, 6048, 3626, 4260, 5804, 4555, 2016, -3206, -10443, -14666, -15763, -12266, -5136, 1573, 8392, 10310, 10299, 8701, 7273, 3122, -1792, -6512, -11385, -10671, -5623, 3126, 12475, 18811, 18788, 13865, 1254, -9586, -18924, -23168, -21149, -16625, -9069, -576, 9779, 18033, 23735, 24045, 18296, 6627, -4161, -14458, -17694, -16955, -12374, -3056, 3608, 9062, 10645, 9134, 6455, 1717, -3258, -5068, -10068, -9798, -7509, -4805, 4407, 9750, 11590, 9204, 3820, -989, -2478, -1152, -51, 1634, 60, -1767, -5482, -6574, -3417, -2783, -938, -93, -4, 836, 10, 2449, 5606, 4054, 1135, -2996, -5201, -5528, -868, 6014, 10763, 10584, 6051, 1330, -5776, -10943, -13728, -14187, -12473, -9232, -5582, -667, 7097, 14540, 18196, 15556, 7677, -908, -8990, -14910, -13841, -8641, -1520, 5831, 11035, 12702, 8569, 2587, -4143, -10940, -13790, -15135, -14450, -10698, -939, 11593, 20734, 26163, 21297, 12079, 2481, -4999, -9326, -13695, -14193, -12799, -8750, -2070, 6216, 11958, 12568, 10864, 8044, 2213, -3927, -9224, -11852, -8220, -1996, 5076, 6751, 6385, 5156, 3507, 4884, 4705, 2714, 134, -3784, -4209, -3195, -6117, -7167, -7822, -6837, -3819, -185, 3817, 7008, 10371, 9938, 7990, 4188, -2464, -8554, -11415, -7280, -3421, 496, 5121, 7721, 9387, 8584, 3801, -3341, -8126, -14753, -17417, -15651, -10346, 845, 11110, 18332, 21543, 17306, 9979, 1085, -6158, -8852, -12781, -13377, -11230, -3184, 4726, 9114, 12765, 8744, 2680, -3529, -10557, -13286, -10836, -6315, 232, 6582, 11729, 14842, 13240, 10144, 4467, -3334, -9701, -13597, -14639, -11568, -5823, -222, 5229, 7037, 8272, 6571, 1833, -1019, -2968, -3577, -1747, 940, 2772, 1780, -305, -849, -1613, 312, 3544, 5844, 5573, 5183, 4078, -325, -4444, -9473, -14657, -16343, -13452, -6791, 2865, 13632, 19230, 19211, 14924, 6299, -454, -5362, -10475, -11917, -11355, -9020, -3757, 3200, 11299, 13145, 10346, 3621, -6161, -12902, -16081, -14347, -9444, -2300, 4963, 11148, 16287, 17415, 15084, 8290, -1293, -9054, -15704, -16245, -13174, -7601, 53, 4166, 7140, 6200, 3805, 763, -2622, -4680, -5095, -2215, 1750, 4920, 6293, 7519, 5934, 3218, 1038, -1743, -5326, -7324, -6449, -3703, -452, 671, -214, -3212, -3217, -4273, -2518, 1009, 4350, 9873, 10137, 8268, 3147, -2380, -6856, -9728, -8240, -5869, -3792, 1712, 9139, 13602, 13136, 5645, -3747, -10681, -14919, -16454, -14381, -8976, -1236, 9654, 17706, 21161, 19563, 12325, 5093, -2142, -9154, -15779, -18810, -16659, -9507, 667, 8646, 13398, 10721, 5782, -1733, -8338, -9311, -8470, -5341, -1410, 5054, 10156, 14983, 15912, 12366, 4746, -3086, -8800, -14167, -13060, -10008, -6086, -930, 2097, 1819, 1575, 364, 298, 2573, 4118, 5495, 5776, 6340, 6398, 4130, 563, -4285, -8452, -8380, -5905, -2829, 181, 3363, 4639, 4349, 1512, -2477, -6221, -10025, -8015, -3922, 3595, 10332, 13551, 14638, 13587, 8102, -904, -7671, -14495, -16922, -14398, -8128, 899, 10582, 14633, 14825, 9930, 2277, -4218, -10213, -14191, -14198, -10655, -5397, 5185, 13462, 21707, 23883, 16889, 8409, -2617, -12150, -17561, -20067, -17445, -9934, -1701, 7206, 10479, 9614, 6739, 1173, -1181, -3299, -4677, -4469, -1605, 3630, 10225, 12781, 9148, 3967, -1653, -5006, -7963, -9919, -10067, -7774, -3670, 851, 1742, 48, -2093, -2035, 1942, 6755, 9313, 8158, 6857, 6431, 7001, 3886, -2461, -8932, -13453, -14083, -11449, -2800, 3618, 7475, 10031, 7375, 4907, -204, -4986, -8187, -8589, -4229, 1532, 5962, 11422, 14518, 14060, 10067, 1002, -6332, -16795, -21633, -19870, -13140, -1710, 8147, 15120, 15348, 13666, 7821, -663, -7757, -13778, -16447, -14152, -8370, 1261, 12214, 20035, 22373, 15906, 6544, -4738, -13835, -18516, -19372, -14640, -8532, -2482, 2036, 7043, 9369, 9415, 8208, 4120, -166, -2449, -4372, -2825, 2906, 5857, 6755, 4086, 144, -3734, -7834, -8865, -7626, -5472, -2302, 493, 1930, 2927, 493, -1734, 518, 2406, 4622, 6174, 3555, 4402, 6496, 7713, 7116, -707, -9455, -17498, -18921, -14211, -6151, 4121, 9760, 12266, 12612, 10194, 3537, -2771, -7381, -11324, -11237, -7562, -3065, 5146, 13933, 17542, 17322, 9181, -2354, -11788, -19995, -21305, -16416, -8977, -882, 7238, 13862, 17155, 15757, 8872, 2185, -6211, -12822, -13687, -13067, -5881, 4363, 11876, 18282, 16613, 10158, 1579, -9180, -14718, -15703, -13474, -10472, -7551, -1996, 5101, 12876, 15605, 14141, 10602, 3944, -404, -3338, -3238, -2288, -811, 834, -1864, -4078, -7225, -8902, -7169, -4284, -1051, 1275, 2286, 2566, 5055, 3980, 2889, 370, -4227, -5368, -3223, 282, 7309, 12714, 12426, 10350, 258, -8507, -13518, -15626, -14443, -8795, -3369, 2943, 12072, 16549, 18591, 15221, 6654, -1204, -8538, -15273, -15161, -12038, -3963, 5182, 11974, 17091, 14895, 9289, 1879, -6316, -11337, -13328, -14247, -14537, -9040, 611, 10485, 19093, 18835, 14280, 5655, -2950, -7315, -10472, -6941, -3324, 190, 5178, 6242, 5633, 2696, 845, -1401, -4474, -5083, -7801, -7603, -4560, -130, 4549, 5693, 4342, 1926, 1076, 1991, 4163, 5097, 6539, 5974, 3514, 1038, -5443, -11280, -14516, -15305, -10776, -3277, 3170, 8815, 12313, 15277, 14784, 8933, 2525, -7510, -14015, -14015, -9494, -1307, 5598, 12220, 13455, 9708, 2775, -6175, -10799, -13969, -14397, -12146, -8593, -19, 6920, 14059, 18530, 16052, 11423, 1212, -10143, -16294, -17278, -12401, -5008, 2448, 9079, 11708, 12311, 8725, 810, -5666, -10480, -13817, -15449, -12976, -8136, -131, 10092, 14112, 15313, 12379, 6489, 1333, -1794, -2717, -3917, -2776, -2075, -2369, -5944, -7028, -5415, -2389, 3775, 5534, 2354, 313, -505, 331, 3698, 2508, -64, -3033, -4154, -2929, 924, 7776, 11651, 13839, 11055, 3276, -6214, -15284, -20891, -21702, -17760, -9011, -2096, 7014, 16297, 21183, 22554, 16167, 8358, -2591, -11823, -17661, -19540, -15578, -7830, 1916, 8608, 13052, 12662, 8255, 1996, -3843, -7497, -9131, -12353, -13370, -9447, -2763, 8131, 15393, 16130, 12664, 5202, -1506, -5079, -5261, -5293, -3664, -1901, -1452, -79, -195, -2064, -1204, -370, -758, -853, -3783, -3285, -1977, 3265, 6081, 5377, 3373, 493, 111, 1810, 6066, 8614, 9317, 5693, 1042, -3810, -9245, -13373, -14038, -11750, -5639, -1662, 5222, 11036, 12932, 15936, 13605, 8331, 849, -7156, -13769, -14770, -7917, 910, 8980, 12842, 11182, 7419, -888, -8005, -11545, -13907, -13834, -12637, -7279, 1930, 10689, 18437, 22636, 18725, 10899, 1780, -10480, -16941, -18597, -16907, -9606, -2499, 4532, 10910, 12089, 12052, 9901, 4795, -628, -8985, -13135, -14876, -11423, -3985, 3204, 10161, 10934, 9912, 7450, 4809, 5853, 3943, 1309, -1400, -4474, -6333, -8710, -10427, -8141, -3499, -270, 2436, 2312, 3840, 6102, 9096, 9924, 7891, 2139, -4090, -8141, -8819, -3522, 90, 5221, 7084, 7147, 4070, -1409, -5467, -9259, -10496, -12544, -11988, -7354, -1617, 7480, 17293, 23004, 23470, 14284, 1011, -8822, -14078, -15993, -14777, -12334, -7862, -494, 5838, 11899, 13672, 8465, 4020, -1682, -7776, -10263, -12070, -8630, -3237, 6212, 13947, 15861, 14137, 7892, 1279, -5018, -8298, -11795, -11399, -9770, -6973, 416, 6626, 8954, 8285, 6733, 2445, -479, -4574, -7913, -7139, -4393, -437, 1783, 2728, 4576, 7543, 8325, 9353, 6890, 1101, -4589, -10751, -10854, -8888, -8589, -7966, -8307, -6409, -1980, 4990, 12282, 15299, 16954, 14854, 8980, 263, -8715, -12926, -15406, -13579, -8403, -3355, 3145, 7896, 10106, 11020, 6449, -556, -5907, -13040, -14036, -11037, -5470, 3238, 10661, 16904, 19200, 17064, 9966, 671, -9159, -15310, -18526, -18121, -13143, -7512, 2000, 10579, 16509, 17652, 11736, 4396, -4899, -10675, -10989, -9313, -6864, -2598, 1431, 5082, 9088, 8930, 7900, 5092, -277, -4932, -8525, -10790, -9161, -4497, -423, 2245, 2881, 472, -687, 1060, 3236, 3533, 2165, 1901, 2546, 4793, 5082, 2025, -105, -2834, -4207, -3436, -2908, -2098, -2020, -1382, -1990, -1769, -2293, -5828, -6800, -5047, -17, 7631, 13227, 16558, 15023, 10534, 7187, 568, -8344, -15313, -20468, -20582, -14573, -8910, 3837, 15112, 20176, 21436, 12146, 1832, -6986, -13543, -15158, -11622, -7806, -2698, 4687, 11256, 17720, 17544, 10881, 2624, -6972, -15693, -19073, -17818, -11267, -1987, 4881, 10788, 12766, 10380, 8171, 4027, -347, -4315, -8754, -9789, -8749, -2193, 6206, 8978, 9083, 6642, 2690, 279, -3581, -7081, -6062, -3489, -792, 397, -1603, -4944, -3649, -1862, 2981, 7622, 7423, 6891, 5469, 6094, 8659, 7909, 544, -7405, -12035, -12721, -11771, -7090, -397, 6661, 10560, 9154, 4736, -1543, -4462, -6097, -4284, 129, 2431, 3977, 7070, 11870, 14709, 12790, 3626, -7916, -15245, -21346, -20308, -13178, -5043, 5828, 13657, 16282, 15764, 11062, 4505, -1855, -6854, -9002, -12761, -13595, -9981, 1070, 14140, 20096, 21421, 13194, 3349, -5191, -12455, -13698, -12389, -11862, -10289, -6795, -8, 7276, 11910, 14075, 12898, 8720, 2196, -5049, -10921, -9623, -4150, 1271, 3473, 4477, 1531, -2257, -2463, -196, 1966, -75, -3632, -7191, -8007, -5627, -1827, -570, 1975, 3955, 6196, 8452, 7241, 6721, 8992, 6485, 1536, -3357, -12895, -19180, -20778, -17124, -7429, 2363, 7837, 10784, 11555, 11621, 10194, 6190, 1844, -6110, -12465, -14012, -11847, -3601, 5933, 13820, 16287, 12782, 6127, -3412, -11676, -14252, -11295, -9039, -6936, -4282, 885, 8647, 15299, 17006, 12096, 4902, -4673, -10757, -14618, -13054, -7210, 258, 8271, 10191, 12589, 10917, 5517, 785, -4676, -9366, -13057, -16241, -14416, -8359, 399, 10775, 15779, 17412, 13272, 6687, 2002, -1931, -2297, -3564, -5314, -7060, -8007, -7894, -6489, -1911, 2687, 6152, 4527, 235, -2731, -3741, -1389, 1404, 2110, 1764, -230, -714, 1557, 5785, 11140, 11497, 8185, 1155, -6041, -12415, -17510, -17843, -14413, -9338, -2955, 3316, 9925, 17386, 19454, 19784, 14277, 3161, -6796, -15078, -20045, -18360, -12208, -2273, 7716, 14137, 17391, 13819, 9487, 2742, -3667, -8364, -13600, -16159, -16943, -12522, -1142, 9874, 18327, 20099, 15776, 10167, 1439, -3730, -4757, -7015, -7416, -6254, -5339, -1002, 2841, 4220, 5578, 4129, -172, -5275, -10618, -11385, -7834, -2703, 3001, 7155, 8913, 9440, 10244, 11721, 10278, 5077, -2964, -9744, -12407, -13116, -11636, -12057, -6802, -1476, 1276, 5097, 6176, 7423, 8608, 9806, 8513, 6036, -972, -8710, -12176, -10134, -3160, 1901, 7272, 8526, 7142, 5972, 491, -5611, -8118, -10427, -11239, -9307, -7189, -817, 6794, 16023, 21488, 19838, 10908, -631, -8621, -14137, -15870, -14341, -10234, -3792, 5461, 11363, 17308, 18720, 12661, 3418, -6320, -13788, -17715, -18398, -16438, -8933, 2853, 13780, 20869, 22146, 18284, 14403, 6933, 247, -6815, -13093, -17176, -18815, -12901, -6621, 652, 5721, 6172, 5585, 4162, 2018, 161, -283, 902, 3253, 3949, 4872, 4265, 4083, 3983, 1262, 68, -3163, -7827, -10423, -8512, -6310, -2928, -1103, -2810, -2079, -2408, 319, 5520, 10004, 11415, 10850, 7135, 2414, -1115, -6490, -8592, -10877, -11298, -8517, -4715, 957, 6953, 10506, 11029, 8073, 180, -7627, -13497, -15870, -12823, -6142, 1692, 9876, 16541, 18930, 17596, 10827, 126, -9036, -16559, -19599, -17918, -13523, -4883, 5592, 14008, 18289, 16831, 8966, -1166, -9804, -14372, -13501, -11687, -8007, -111, 9485, 19816, 24353, 22164, 14018, 1030, -10119, -17023, -20657, -20908, -18194, -11672, -3787, 4660, 11883, 13082, 13185, 11580, 11161, 7315, 2236, -3007, -5380, -4585, -6174, -3403, -3982, -5510, -4956, -3040, -337, 3707, 4106, 1897, -485, -2429, -1926, -4675, -4960, -3437, -1148, 3213, 6931, 10008, 12571, 12745, 7987, 2249, -5080, -15011, -20794, -21620, -15434, -5592, 2849, 11720, 15751, 16546, 13543, 5155, -1763, -6910, -11010, -13749, -12893, -10117, 236, 12500, 19322, 22377, 15683, 4835, -5683, -13909, -16993, -16071, -12698, -6349, -2021, 2466, 7366, 12192, 13291, 9552, 4558, -2969, -6579, -7425, -5256, 182, 6529, 9928, 9298, 4706, 1828, -70, -4423, -6713, -10661, -13223, -13554, -10309, -1819, 6689, 13949, 17475, 16223, 12572, 6616, 928, -1552, -3952, -4687, -5111, -8527, -8683, -8907, -7470, -460, 5792, 10789, 10781, 6556, 3027, -110, -779, -491, -3668, -7077, -8569, -9189, -4816, 3587, 10390, 15912, 17911, 11420, 3520, -4892, -13496, -15627, -17083, -15023, -10974, -6315, 2478, 10920, 17680, 19645, 16584, 7949, -2370, -10770, -15877, -13831, -7017, 790, 7762, 10507, 10580, 8641, 3080, -1733, -6604, -11752, -14079, -16234, -15660, -10782, -1029, 10837, 20378, 23366, 16069, 8836, 615, -4413, -3909, -5559, -7587, -7507, -6021, -3896, -866, 484, 2497, 2074, -216, -2630, -3855, -3986, -923, 5163, 9320, 8107, 4243, 747, -1206, 593, -18, -160, -1001, -2781, -2517, -2548, -3286, -3537, -3086, -2949, -2994, -1740, 544, 3203, 6515, 10053, 10318, 3986, -4786, -11351, -14470, -11385, -2939, 4618, 12654, 17578, 16853, 12072, 3700, -4816, -12481, -18288, -23318, -25156, -19287, -9022, 6536, 20364, 28915, 29595, 18830, 8174, -2425, -7832, -11069, -14018, -13525, -12626, -6098, 804, 7376, 12219, 10097, 3496, -5057, -12893, -15909, -13773, -7741, 1358, 10121, 16925, 18384, 15655, 10229, 6573, 1479, -6362, -11775, -16447, -13605, -9271, -5702, -1081, 1625, 2984, 1300, 1418, 2963, 4026, 7372, 9653, 10218, 8795, 1726, -6096, -12943, -13222, -9218, -3899, 919, 5706, 9967, 10412, 9126, 4156, -41, -6856, -15326, -18816, -16907, -10115, 1323, 11886, 19717, 19682, 12608, 4635, -3326, -6515, -8394, -9125, -7980, -3535, 2195, 6290, 10974, 11183, 5990, -1014, -11976, -19242, -19076, -16551, -6874, 5012, 15589, 23406, 23917, 21196, 14574, 7570, -1467, -10965, -18674, -22482, -18953, -13158, -3353, 6666, 10040, 11028, 9245, 4415, 340, -3376, -3889, -961, 3017, 6021, 6891, 4242, 1887, 1520, 349, -110, -3079, -7901, -6898, -5049, -1864, 925, -830, -3503, -5945, -6077, -4295, 2284, 9111, 14799, 17146, 13714, 7552, -1720, -8774, -12590, -15801, -13516, -9732, -4236, 4432, 11770, 16422, 14750, 7665, -1811, -10502, -16874, -19552, -17437, -10762, -2789, 9018, 18089, 23426, 24934, 19140, 11843, 1088, -9488, -18170, -23547, -25405, -20179, -8615, 3371, 11992, 12375, 9852, 6464, 2560, 64, -2130, -2013, -910, 1990, 4222, 8800, 11214, 8698, 3697, -3130, -8298, -12993, -14768, -14733, -8028, -750, 4159, 5496, 3696, 1699, 2936, 6454, 8217, 7895, 5315, 3500, 948, 1855, -806, -6704, -10292, -12456, -11974, -7075, -1447, 5414, 12085, 12824, 11089, 2946, -5148, -9986, -12872, -10570, -5157, 1178, 7619, 13536, 15999, 17641, 14544, 5263, -4891, -14881, -22876, -22757, -15313, -6386, 3381, 12656, 17284, 17579, 10179, -183, -7288, -13307, -14763, -14504, -10991, -4417, 8248, 20665, 27605, 27695, 16188, 2038, -11561, -21461, -25192, -26730, -23138, -14769, -3585, 5852, 13815, 19503, 18796, 17555, 11377, 4929, -1255, -8028, -9532, -6119, -1931, 2296, 1638, -3439, -6447, -6909, -3591, 146, 3561, 1810, 518, 83, -515, 205, -926, -726, 587, 3188, 6892, 7354, 8486, 8878, 6554, 4530, -2001, -11302, -18675, -19921, -15687, -4956, 5470, 11175, 14636, 12322, 9058, 5715, -126, -5902, -10564, -12678, -12181, -7221, 885, 11731, 21371, 22472, 17508, 5870, -7632, -16348, -22054, -22947, -16996, -9071, -573, 6820, 12193, 17227, 16632, 9770, 2783, -5685, -11751, -10819, -6795, 965, 7890, 12555, 12439, 8190, 2710, -6808, -12997, -15082, -14404, -11697, -9430, -5036, 1278, 9700, 16408, 18826, 15999, 8645, 2044, -3002, -4440, -4832, -6084, -5441, -7329, -7888, -5995, -4084, 765, 3317, 4407, 6062, 4987, 2758, 1640, 2597, 3758, 748, -3578, -7351, -8708, -2919, 4345, 11711, 14335, 12936, 8235, 268, -5179, -10544, -14435, -16129, -14763, -10009, -3334, 4980, 15433, 21532, 21796, 15361, 4851, -5872, -14538, -17796, -14227, -5102, 3357, 10202, 13505, 13498, 9335, 3261, -3453, -9457, -15058, -18042, -18057, -14338, -5122, 4489, 14173, 20733, 19651, 14352, 7463, 505, -3243, -6525, -10247, -12165, -10011, -7423, -4140, -2238, -645, 1007, -25, 547, -1772, -2011, -1781, -828, 4436, 6620, 5298, 1646, -213, -889, -799, 463, 435, -1246, -3085, -2363, -1542, -1339, -2732, -4424, -3709, -4123, -3205, -545, 1843, 5518, 10267, 11122, 7895, 2276, -5690, -9403, -9152, -4687, 1207, 4683, 8927, 11093, 10003, 7440, -264, -8725, -14219, -18257, -17930, -14936, -5449, 4054, 14090, 23394, 24070, 20547, 9359, -1651, -8892, -13017, -14011, -12716, -10897, -5574, 2626, 9852, 15334, 13520, 4155, -5912, -13158, -16683, -15711, -11877, -3791, 6497, 15762, 20366, 20759, 15998, 10110, 2993, -4940, -13134, -17974, -18069, -17359, -10484, -1429, 8129, 12464, 11545, 8269, 4424, 1883, -1224, -2386, -2504, -254, 1833, 1946, 611, -706, 15, 131, 547, 1233, 123, -1580, -787, 356, 1206, -847, -6067, -9473, -10049, -6041, -428, 4989, 9030, 11653, 12160, 6920, 3175, -1518, -5208, -6199, -8074, -5296, -2021, -80, 3518, 7620, 8400, 5235, -2758, -11908, -15575, -14739, -10407, -1652, 6806, 13789, 18784, 19849, 18724, 15311, 5606, -6342, -15379, -20408, -21118, -16879, -10259, -694, 9502, 12986, 13845, 10214, 3096, -3347, -6641, -7010, -3512, -1821, -669, 1781, 7337, 14772, 16453, 10634, -569, -10409, -16391, -17690, -15868, -9653, -4291, 153, 4559, 7955, 11735, 12263, 10417, 8010, 3758, -1915, -7930, -12532, -12059, -5620, -1159, 2820, 5805, 5934, 6366, 6259, 4411, 1432, -1595, -7095, -9749, -10400, -7984, -5290, -2682, 1390, 5559, 8711, 10539, 9954, 8984, 8707, 5516, 3655, -1774, -11034, -15904, -16925, -13656, -4942, 865, 4189, 6584, 5367, 5301, 4139, 487, -1087, -3308, -4094, -1960, 522, 3904, 8695, 11670, 10410, 6667, -2246, -10882, -15342, -17095, -14122, -8423, -3278, 1625, 6886, 12003, 15870, 15784, 10448, 2616, -5983, -10966, -12914, -11539, -5019, 2507, 8366, 8719, 9907, 6807, 10, -2551, -5645, -8677, -9073, -9220, -9678, -5719, 1337, 10182, 16083, 15231, 10748, 3212, -4801, -7047, -6565, -5626, -5651, -3908, -1156, 2428, 4683, 4486, 5576, 3245, 154, -4242, -9780, -13623, -12095, -6403, -171, 6101, 7599, 7328, 7302, 8277, 11519, 10182, 4423, -1604, -7358, -10386, -12226, -13479, -11766, -9561, -3826, 1304, 5010, 7822, 10050, 13607, 12400, 9682, 2714, -5592, -10037, -13132, -8231, 203, 4295, 8287, 8050, 6131, 3877, -1101, -5538, -8491, -11545, -13499, -10294, -3909, 4438, 14064, 19531, 19245, 14213, 3840, -5881, -11059, -12493, -11112, -8741, -6093, -917, 4560, 11256, 14218, 11820, 6437, -4399, -12034, -15737, -15247, -11364, -4178, 4595, 11063, 16378, 14406, 9189, 5084, 562, -3075, -6477, -9149, -12384, -10938, -4762, 2064, 9639, 11412, 7419, 299, -6655, -9342, -10066, -9362, -4396, 925, 4556, 7645, 9935, 12469, 13059, 11335, 5605, -283, -7832, -14029, -15375, -12439, -7427, -4511, -2369, -1985, -14, 4387, 9651, 11470, 11498, 9775, 5634, 1784, -3772, -6332, -7987, -9163, -6887, -5074, -1689, 2295, 6911, 10023, 9589, 6951, -1134, -7960, -11860, -13067, -8398, -2960, 3430, 10072, 13532, 14917, 13544, 8258, 1020, -4625, -10181, -14144, -14308, -11416, -3737, 6048, 12820, 15239, 10117, 2484, -3759, -8363, -8921, -8200, -6531, -4093, -2120, 3387, 11010, 16308, 17264, 12207, 4389, -5626, -11782, -15797, -15746, -12331, -8595, -1599, 2991, 6340, 7978, 6849, 4825, 2656, 563, -1942, -4572, -4139, -922, 4717, 6779, 6591, 4768, 797, -2381, -5737, -8708, -9588, -7867, -6759, -5604, -5290, -2164, 3031, 7806, 10838, 13527, 12970, 7477, 2388, -584, -2032, -3264, -5781, -12460, -14466, -11956, -6418, 3457, 11047, 13754, 13289, 9964, 4989, -1692, -8326, -10462, -10793, -9431, -6920, -2983, 3168, 12997, 18826, 18513, 13765, 1321, -8327, -14291, -18606, -15229, -10483, -5376, 1363, 6479, 11554, 13318, 11158, 5500, -855, -6621, -9305, -10155, -7520, -1703, 4628, 11231, 14068, 13264, 5665, -1415, -6854, -10948, -11283, -10860, -9847, -9247, -5608, -359, 6793, 11283, 10346, 8766, 5204, 2845, 1742, 286, -1005, -1909, -1255, -4388, -7097, -8264, -8384, -5252, -2221, 1189, 1626, 1313, 1612, 3769, 6071, 3826, 663, -1943, -3666, -2718, 1629, 4689, 5479, 6298, 3508, -2072, -6422, -10924, -13013, -12369, -7305, 498, 5822, 10601, 12660, 10198, 8958, 4849, -1888, -7211, -14672, -16643, -14118, -4806, 7233, 14980, 20851, 20018, 14923, 6115, -4474, -11821, -16210, -17857, -15125, -12552, -5805, 3463, 11682, 18640, 19151, 16157, 8764, 307, -7256, -9656, -7318, -6140, -4337, -3917, -1967, 2690, 4470, 5563, 4482, 452, -3483, -7005, -7773, -7621, -4499, 1061, 6196, 10400, 10121, 7529, 4233, 2785, 3614, 740, -4433, -9053, -11552, -11256, -9121, -4336, 1267, 2687, 3555, 4861, 6998, 6550, 3435, 2622, 1308, 1431, -640, -4688, -6309, -3841, 874, 5066, 6096, 4305, 2513, -491, -3183, -2559, -2111, -3116, -4443, -5090, -2430, 1477, 7593, 11285, 10676, 8154, 3119, -3596, -8292, -8792, -6404, -4298, -465, 3977, 6479, 8814, 8069, 5924, 3639, -2074, -8925, -13925, -17101, -14812, -7408, 812, 8271, 14726, 17544, 16109, 10894, 4852, 355, -6218, -11269, -15057, -14929, -11896, -7913, 572, 5975, 8774, 9939, 5529, 604, -2307, -4647, -4069, -1148, -1059, -147, 1691, 4240, 10275, 11435, 9168, 5050, -3089, -8353, -12569, -15965, -12898, -9008, -4710, 79, 3518, 7667, 10561, 12459, 11605, 8786, 2899, -4545, -8793, -9027, -7269, -3702, -568, -82, 490, 907, -854, -866, 1024, 1393, 2622, 748, -1292, -2523, -4769, -3229, -1681, 1707, 3727, 3253, 2131, 2865, 5423, 5766, 6156, 1661, -3080, -6368, -9471, -8736, -5859, -2317, 1646, 3048, 2028, 2511, 1319, -26, 1312, 685, -1721, -2200, -2376, 393, 8136, 13029, 11597, 6189, -2187, -7857, -11186, -12905, -12551, -11544, -8985, -5087, 796, 7657, 13023, 13747, 12077, 9007, 3932, -2207, -6859, -8390, -6908, -3389, 921, 4760, 5580, 5325, 2275, -2316, -4489, -6566, -8109, -8705, -9634, -5301, 174, 6609, 12938, 14268, 12330, 8220, 3582, -1165, -4881, -9375, -9722, -8826, -7360, -4363, -1502, 2876, 7392, 9885, 8090, 3813, -306, -4529, -5177, -2211, -364, -1315, -2297, -1694, -625, 4005, 7158, 8600, 7618, 4185, 51, -3978, -7262, -8999, -8307, -5923, -4706, -4181, -2429, -541, 2677, 7214, 10310, 9841, 6676, 2522, -821, -3097, -3238, -3928, -3718, -2828, -1131, 1267, 2422, 2241, 479, -2364, -5136, -6504, -6706, -4938, -2340, -528, 3904, 10989, 15095, 15911, 9945, 2131, -2143, -6129, -8611, -10825, -13050, -12591, -9000, -3581, 3366, 10272, 11689, 9833, 6216, 546, -3233, -6243, -7070, -4889, -2102, 1339, 4199, 7565, 8959, 7738, 5647, 346, -4092, -7905, -10812, -9967, -6991, -1831, 2620, 4756, 5654, 6096, 5241, 3909, 2375, -851, -3856, -4248, -2673, -1068, 1278, 2371, 2655, 2567, 1761, 1467, 295, -1790, -3450, -2475, -1406, 489, 662, -1472, -2400, -2998, -1610, 1332, 4099, 5430, 6274, 5643, 5491, 5914, 2659, -1075, -4300, -6715, -7579, -9079, -8224, -5344, -788, 5043, 7280, 7602, 5397, 2150, -695, -2246, -3078, -3655, -3233, -2666, -323, 3188, 6260, 7052, 4908, 168, -3646, -6514, -8293, -8533, -6957, -2921, 1354, 5878, 8954, 9342, 6301, 2160, -214, -1721, -3062, -4732, -5945, -5602, -3636, 813, 4980, 7538, 7809, 5685, 1695, -2002, -4542, -6396, -5508, -4386, -2254, 596, 3483, 4742, 5038, 4740, 3422, 1427, -1244, -3779, -6389, -5865, -3196, -283, 1052, 1341, 836, 1571, 2366, 2479, 1419, -1506, -3317, -4092, -3621, -2490, -1040, -800, -1324, -679, 988, 2829, 4176, 3907, 3648, 3770, 2684, 998, -1667, -4614, -6238, -7469, -7729, -6281, -3304, 415, 3777, 7019, 7828, 7768, 5344, 1756, -1104, -3780, -4505, -4770, -4837, -3793, -1693, 518, 2611, 3440, 3029, 2124, 78, -1516, -2529, -3674, -3360, -2211, -419, 2325, 4427, 5351, 5255, 3718, 1894, -553, -2876, -4798, -6311, -5267, -3497, -1175, 1824, 4584, 5896, 5813, 4560, 1922, -1128, -3576, -4759, -4841, -3567, -1992, -82, 2293, 3970, 5186, 5288, 4049, 1329, -1592, -4021, -4966, -4301, -3400, -978, 1231, 2884, 4035, 3749, 2719, 794, -912, -1983, -3030, -2837, -1931, -519, 1679, 2870, 3345, 2815, 1772, 1161, 609, -153, -1265, -3008, -4828, -4563, -3292, -1243, 936, 1723, 2027, 1516, 1573, 2223, 2605, 3198, 3086, 1715, 671, 62, -946, -1925, -3572, -4538, -4309, -3766, -1887, 281, 2438, 4294, 4824, 4774, 4035, 1403, -1143, -2542, -3483, -3442, -3075, -2322, -1112, 46, 1305, 2342, 2437, 1565, 552, -787, -1810, -2184, -2320, -1467, -664, 539, 1608, 1646, 1988, 1599, 541, -902, -1879, -1912, -1476, -1069, -83, 455, 817, 1125, 930, 880, 612, 165, -734, -1132, -1640, -1507, -981, -850, -436, -175, 740, 1363, 1604, 1774, 1125, 790, 30, -604, -920, -1020, -638, -53, 464, 354, 574, 866, 1096, 826, 657, 297, -61, -599, -1151, -1369, -893, 173, 1195, 2133, 2144, 2148, 1653, 689, -134, -1197, -1912, -2330, -2327, -2063, -1487, -967, -89, 1033, 1654, 2311, 2374, 2341, 1952, 956, 251, -600, -1246, -2040, -2789, -2644, -2299, -1753, -985, -60, 1146, 2158, 2353, 1659, 1497, 878, -102, -1308, -2167, -2252, -2076, -1310, -230, 807, 1403, 1255, 909, 572, 158, -206, -532, -303, -93, -198, -118, -154, -241, -260, -194, -248, -334, -653, -939, -533, -404, -160, 413, 652, 1213, 1387, 926, 429, 201, 68, -94, -408, -890, -1149, -838, -1055, -1094, -522, -347, -251, 264, 876, 1244, 1218, 1126, 1132, 791, 351, -170, -715, -809, -872, -916, -710, -290, 210, 321, 360, 304, 137, -211, -786, -840, -567, -165, 454, 1145, 1392, 1541, 1556, 1388, 616, -193, -758, -1160, -1373, -1494, -1639, -1545, -965, -3, 617, 1062, 1158, 960, 988, 633, 173, -442, -863, -991, -814, -725, -588, -293, 66, 552, 624, 708, 771, 678, 551, 353, 47, -16, -275, -627, -727, -688, -783, -633, -442, -201, 132, 368, 432, 654, 976, 1034, 1175, 1038, 713, 345, 53, -206, -404, -550, -949, -1120, -873, -621, -368, -97, 36, 164, 380, 608, 825, 930, 676, 426, 74, -156, -239, -325, -321, -380, -381, -474, -542, -559, -508, -504, -371, -204, -271, -283, 51, 452, 748, 839, 813, 823, 637, 464, 379, 76, -382, -698, -1036, -1104, -1082, -755, -406, -252, 47, 428, 557, 742, 839, 479, 126, -123, -315, -264, -101, 189, 444, 438, 322, 177, 175, 216, 186, 122, 66, -33, -83, -153, -74, 143, 128, 32, -109, -150, -150, -163, -119, 75, 106, 96, 166, 226, 94, -94, -174, -61, 65, 136, 50, -72, 17, -29, -417, -666, -659, -472, -255, -58, 181, 331, 436, 542, 757, 739, 329, -38, -195, -187, -136, -245, -189, -139, -150, -210, -318, -224, -239, -259, -210, -107, -2, 20, 11, 154, 305, 361, 283, 84, -46, -30, -148, -151, -127, -62, -172, -424, -632, -553, -364, -55, 81, -197, -403, -250, 270, 677, 861, 705, 319, 9, -74, -74, -54, -188, -331, -321, -308, -233, -116, -90, -166, -174, -31, 130, 400, 519, 381, 156, 62, 115, 72, -12, -145, -151, -64, 81, 184, 316, 216, -1, -232, -411, -376, -328, -213, -113, -59, -18, 121, 297, 413, 427, 209, -38, -120, -154, -81, -7, 79, 72, 17, 23, 29, -8, -122, -329, -381, -299, -136, 6, 111, 294, 501, 494, 374, 269, 107, 34, -51, -94, -140, -146, -82, -43, -143, -294, -431, -285, -12, 97, 159, 91, 57, 162, 247, 267, 230, 126, 54, -2, -16, -33, -39, -105, -100, -36, -49, -94, -121, -106, -186, -161, -29, 10, 30, 66, -5, -31, -2, 99, 107, 41, -21, -140, -197, -151, 2, 113, 32, -72, -134, -149, -88, 18, 112, 149, 148, 100, 110, 156, 176, 89, 33, -10, -55, -51, -47, -14, -39, -5, -13, -47, -45, -78, -82, -45, 27, 58, 37, -56, -123, -102, 3, -6, -8, -19, -83, -138, -130, -86, -49, -16, 48, 60, 37, 8, -54, -49, -11, 31, 25, -36, 32, 108, 121, 63, 46, 58, -47, -155, -191, -107, -46, -46, -28, 50, 132, 87, 60, 52, 95, 77, 15, -16, 36, 69, 20, -72, -53, -42, -64, -64, -80, -33, 4, 24, 10, -23, -61, -46, 22, 64, 108, 118, 118, 68, 20, -75, -111, -143, -154, -79, -31, 1, -3, 11, 24, 6, 14, 33, 37, 22, 26, 67, 83, 108, 66, 50, 22, -48, -83, -101, -66, -19, 22, 0, -31, -41, -38, -9, 4, 24, 33, 19, 20, 7, 6, 19, 43, 49, 7, -39, -69, -70, -26, -3, 17, -18, -33, -40, -38, -16, -19, -14, -23, -5, 34, 49, 57, 44, 46, 27, -5, -15, -36, -60, -58, -50, -27, -10, -1, 15, 16, 27, 25, 16, 24, 4, 4, -3, 11, 0, 33, 8, 6, -13, -26, -35, -31, -36, -17, -32, -16, -20, 4, 13, 19, 16, 23, 19, 29, 12, 17, -16, 8, -8, -6, -12, -6, -15, 0, -12, -1, -10, 1, -6, 12, 1, 21, 5, 27, 1, 12, 3, 3, 5, -1, -1, -6, 1, -6, 0, -11, -4, -5, 1, 3, -5, 8, -10, 2, -7, -5, 3, -8, 4, -6, -2, 2, -4 }; fldigi-4.1.06/src/soundcard/diesel.cxx0000644000175000017500000020014113472115777014537 00000000000000#define DIESEL_SIZE 7621 int int_audio_diesel[DIESEL_SIZE] = { -1556, -594, -3297, -4007, -3029, -2668, -1282, -1432, -615, -841, -1989, -1587, -1985, -1423, -2066, -2257, -1630, -1906, -2242, -848, 2031, 1619, 2520, 2703, 2144, 1447, 2108, 2767, 1488, 1866, 2604, 2398, 1802, 1724, 2145, 2034, 1407, 2703, 3012, 3546, 2611, 3072, 2911, 2392, 3402, 2498, 3559, 2929, 3036, 2349, 2281, 2277, 236, 899, 1209, 654, 113, 575, 1633, 1333, 565, 1720, 1912, 2883, 3117, 1447, 890, -443, -171, -416, -268, 1998, 1066, -1711, -4346, -6440, -7462, -4192, -1446, -115, 3224, 98, -1360, -551, 2340, 4792, 2344, -421, -6521, -11091, -12809, -9595, -4677, -4157, -5461, -1192, 5111, 5467, 2461, -840, -4078, -6382, -5641, -4193, -2654, -494, 1089, 7518, 14612, 11258, 4916, 1255, -2881, -10444, -16913, -14517, -9980, -9701, -9259, -4948, 3963, 10100, 15864, 18029, 9065, -242, -1903, 2475, 457, -7816, -10585, -6749, -1041, 1792, -1440, -9037, -14310, -9679, -2422, 1702, 3245, 4597, 9446, 17931, 22048, 18266, 12642, 7875, 714, -9549, -13794, -17073, -15171, -10174, -7600, -6192, -3186, 8222, 22598, 27969, 23145, 18219, 17774, 17979, 7061, -9297, -19575, -22125, -16869, -7695, -1994, -5627, -10844, -6984, 2016, 6637, 3012, 2202, 7818, 12689, 15117, 15791, 12961, 11141, 13479, 13476, 4462, -12353, -22296, -21900, -19561, -20846, -18859, -15136, -7151, 1844, 3741, 5062, 8508, 12443, 13807, 12119, 4293, -2720, 41, 6254, 5275, -55, -8499, -16093, -16879, -12863, -11824, -12028, -10513, -10163, -6576, -191, -583, -3241, 2541, 11289, 19760, 21880, 17055, 11385, 2837, -11459, -23125, -20481, -12913, -6486, 5309, 7929, 4556, 2861, 4528, 4442, -1675, -4690, -7459, -6890, -2700, -3770, -6395, -3445, -3808, -1562, 7080, 14333, 10011, 8670, 16552, 17990, 13408, 5871, -2529, -10225, -11285, -11432, -10814, -6088, 2598, 11583, 9452, -6058, -14994, -10039, -1349, 3306, 5986, 13208, 22715, 24436, 13696, -2649, -12412, -14594, -11005, -2024, 1915, 320, -2687, -2503, 680, 9820, 14981, 15097, 14223, 9558, -835, -8095, -13916, -18567, -15921, -11442, -7552, -8894, -7700, -3265, 11788, 20256, 13620, 10990, 18190, 20325, 11814, 696, -7622, -7466, -1230, 3096, -3921, -13264, -17551, -12974, -11049, -17693, -18218, -14145, -10474, -5812, 513, 4917, 11458, 27868, 31738, 27212, 23035, 17124, 7519, -8065, -17706, -20534, -20514, -16686, -11491, -11893, -11478, -17904, -16986, -12639, -3928, 10830, 15704, 18136, 19510, 22156, 20656, 15427, 7754, 4535, 8201, 6106, -9412, -22166, -25149, -22840, -21845, -21159, -16918, -13243, -987, 19321, 28225, 23173, 17333, 12351, 3131, -9263, -16349, -20045, -18271, -14706, -6339, 1831, 1897, 382, 678, 2861, 2048, 1782, 6510, 14288, 17594, 13743, 8169, 1279, -4333, 363, 4227, -5656, -17988, -17917, -12851, -9821, -8054, -7983, -4782, 8417, 13353, 18573, 31863, 30229, 25426, 19697, 12479, -1205, -13769, -15339, -11004, -8117, -7219, -7726, -9802, -9154, -10259, -8432, -9049, -8491, -7190, 2267, 12413, 11339, 20471, 29969, 30062, 25842, 19558, 12267, 5634, -6387, -24845, -30995, -24988, -20519, -16534, -4842, 420, -2038, -2973, -585, 8117, 6339, 1374, 3623, 3716, -2659, -5341, 2701, 4181, -1934, 1631, 12718, 9024, -5464, -11419, -7079, -4081, -5813, -9765, -14048, -7750, -648, 596, 3513, 3306, 3227, 7062, 2467, -7160, -13513, -12627, 1396, 15559, 13787, 15851, 23245, 21791, 11364, -6565, -19097, -23366, -17858, -8877, -2387, -5496, -6881, -3678, 2645, 9848, 10099, 5743, 4572, 4948, -7825, -14518, -15920, -14936, -7165, 4329, 8251, 2392, 5916, 16616, 22042, 16110, 2083, -10018, -11762, -7294, -8422, -8416, -6096, -2831, 3088, 9987, 4476, -6572, -5708, -5051, -2204, -10174, -8957, 2660, 12567, 18954, 18860, 21951, 20236, 15945, 13389, 12293, -3944, -17288, -20598, -18135, -13667, -10464, -8825, -8084, -1115, 2783, -1313, -5396, -9036, -10962, 399, 20022, 24056, 16661, 21355, 25510, 23423, 17067, 8959, -6500, -15856, -20843, -26480, -22604, -19926, -18508, -16425, -12724, -9179, -2034, 13453, 29208, 28651, 22476, 15470, 6391, 2619, -3672, -13748, -12231, -9797, -5445, 3860, 7941, -881, -14275, -16988, -17274, -10430, -5870, 1937, 7607, 13946, 20941, 17426, 12392, 9590, 5837, 2220, -4657, -21058, -22178, -12973, -6618, -4565, -3470, 3170, 6590, 6737, 9906, 7822, 4037, 1285, -410, 3356, 366, -10400, -11291, -7226, -5952, 1160, 5850, 5508, -1575, -10763, -16035, -13583, -9654, -8832, 2836, 25623, 28161, 17740, 18256, 19298, 18813, 10186, -3174, -15873, -21957, -22320, -19674, -19195, -17191, -11605, -694, 11858, 11470, 1695, -4863, 3464, 7115, 8173, 13081, 17715, 19070, 10113, 3378, -662, -6699, -13482, -16851, -12640, -12578, -13863, -7087, -980, 698, 2472, 5408, 7565, 13782, 18904, 14339, 6075, 7274, 7682, 3425, -507, -8939, -13875, -7813, 1058, 4945, 9084, 11602, 10509, 2455, -9385, -22699, -23579, -14615, -9893, 505, 8798, 9554, 10830, 15011, 11597, 1250, -3661, -2440, -3281, -3072, -2711, -2064, 1378, -492, -6138, -6685, -6619, -10586, -6065, 1505, 4166, 1446, -2545, -4709, -5219, -2510, -1468, -16, 4910, 8362, 8196, 6239, 2342, -5149, -8596, -3334, -3848, -3870, 1241, 4021, 8296, 7417, -21, 1277, 1874, -872, -896, -3609, -6325, -8707, -5325, 559, 5711, 8222, 7212, 695, -3206, -6432, -8387, -4263, -1674, 2784, 11749, 17113, 11006, 8492, 8422, 5974, 7343, 5191, -5407, -12027, -14834, -14188, -15327, -14846, -10235, -8880, -4403, -2611, 2090, 14202, 25005, 28035, 25877, 22630, 17849, 8498, -1370, -14177, -20218, -15689, -12256, -10172, -4619, -4272, -11613, -17960, -17557, -11351, -5043, 8672, 20157, 23875, 21795, 19754, 15174, 11301, 2209, -7770, -5618, -6389, -14600, -16079, -12492, -9450, -7770, -9307, -6960, -7451, -272, 2303, 4962, 10335, 7031, 8435, 10401, 5132, -4202, -4179, -3291, 1216, 11040, 6329, -2729, -4593, -7347, -12843, -14789, -12528, -12047, -1598, 13948, 19924, 17411, 15906, 6992, 226, -1665, -9047, -11040, -11856, -8029, -11757, -12438, -8397, -4532, 6309, 10194, 5713, 2589, 7318, 10815, 11944, 13015, 9391, 3285, 1057, -996, -4404, -2192, -5775, -16641, -17107, -13440, -9973, -5832, 2509, 2924, 3588, 9360, 5010, 10833, 16741, 19660, 20459, 14105, 8199, -3083, -9034, -9223, -17466, -19650, -12359, -4275, 3286, 5819, 3724, -2735, -4493, -5427, -9793, -6398, -3578, -1054, 8677, 14815, 20058, 19718, 16856, 10806, 646, -3705, -7915, -8651, -7014, -9024, -8903, -937, -3951, -10649, -8900, -7357, -8632, -4862, 3791, 10930, 15140, 9418, 2836, -4749, -3599, 3605, 4907, 10014, 13862, 5605, -1113, -2599, -10468, -14625, -14647, -13810, -10904, -1935, 5877, 4963, 7594, 5050, -1471, -2333, -3266, -3451, -2361, -117, -2038, -2362, 903, 1925, 7683, 14699, 5688, -4309, -6920, -11292, -9906, -8156, -6096, -4936, 3465, 11124, 8155, 7214, 5437, 2208, 4769, 5437, -2418, -8395, -7730, -9400, -12899, -4970, -858, 425, 7877, 12963, 14662, 16527, 16143, 14036, 13856, 5892, -2956, -6942, -9882, -10412, -8588, -8576, -9789, -9368, -3864, -2281, -8021, -9818, -9780, -3249, 13607, 27918, 31610, 29297, 25639, 19627, 12219, -857, -18376, -22128, -17848, -17194, -16037, -14407, -11273, -7153, -3702, -2589, -4905, -471, 10437, 15084, 14572, 8502, 2046, 4248, 5510, 5083, 5553, 3507, 5041, 594, -4810, -11660, -18757, -16669, -15577, -13718, -11939, -11300, -7900, 4814, 16113, 22377, 20564, 14465, 7481, 1510, -3212, -12437, -11847, -7944, 78, 2022, -930, -781, -1214, -1284, -3659, -3126, -5700, -2757, 5928, 6128, 4362, 5409, 4161, 3644, 5765, 3905, -598, -5069, -11148, -16257, -13920, -9120, -3240, 8869, 14773, 18211, 18157, 13205, 9488, 6942, 7365, 149, -6190, -8547, -13964, -15886, -14064, -11301, -7694, -1340, 6471, 10308, 10678, 7797, 1040, -2703, -4022, -7439, -1832, 7575, 15705, 22025, 19995, 17400, 8145, -3582, -11185, -16338, -14487, -11841, -10374, -8680, -5325, -2619, 1207, 5474, 4303, -550, -4105, -2917, -3227, 2803, 11220, 17342, 15875, 8403, 4737, 3458, 6051, -1328, -5233, -6438, -12264, -13906, -16678, -17700, -15507, -10588, -6156, 25, 11730, 20518, 19861, 14794, 3167, -10740, -11365, -7671, -4124, 3065, 7334, 9021, 6512, 4139, 426, -2791, -5354, -11875, -12927, -12297, -12208, -11988, -8624, -4208, 3001, 15944, 20387, 16074, 10947, 7833, 4136, -1356, -4365, -5947, -6215, 2167, 2686, 1463, 1155, -3143, -4059, -8563, -7981, -7405, -2577, 643, 2112, 4024, 4473, 5985, 10066, 13163, 6295, -1868, -6055, -9264, -15025, -11266, -6607, -4786, -1332, 1719, 10627, 18807, 18035, 17932, 17221, 13241, 476, -12777, -16876, -18029, -14586, -14075, -9512, -4084, 2380, 5065, 6115, 3801, -3013, -7434, -3811, 8657, 12041, 14989, 16565, 17513, 10700, 1254, -1815, -5362, -4011, -6453, -8750, -13805, -19275, -16404, -13247, -6281, -1545, -577, 1628, 8179, 14360, 10950, 6427, 8864, 11099, 8226, 10939, 7319, 5166, 3233, -4226, -5942, -13391, -18153, -17067, -14133, -13302, -12478, -9574, -5033, 2721, 12375, 20645, 20524, 15774, 13407, 9066, 1930, -1609, -5897, -10103, -9548, -10705, -11157, -8730, -6964, 2259, 7004, 9707, 6033, -3136, -3891, -3396, -506, -1203, -1415, 2931, 5376, 2242, -801, -2451, -4255, -3735, -2526, 2041, 4909, 4822, 7926, 8574, 6627, -1034, -8809, -6850, -1177, 161, -708, 246, -3989, -4925, -6768, -8189, -3231, 546, 4693, 8907, 7779, 3366, 312, 1046, 3659, -1326, -4555, -679, 5239, 11762, 11277, 5741, 1665, -225, -3652, -4027, -5712, -11562, -8042, -6449, -8245, -7263, -4058, -1266, 2948, 6290, 6100, 3510, 4874, 13411, 12066, 12012, 5753, -2726, -351, -1991, -5390, -6261, -5099, -4254, -1254, -1705, -5868, -6041, -6231, -3610, -1786, -521, -975, -2387, 748, 1061, 1010, 2747, 13761, 19768, 17707, 13645, 8424, 5714, -4898, -11595, -13167, -12115, -9024, -8735, -7889, -7514, -11973, -17097, -13400, -6030, 4192, 15603, 20701, 19878, 14182, 9349, 5789, 6500, 4349, -5146, -6741, -6208, -9808, -13389, -11953, -9962, -9737, -8314, -6814, 1144, 6033, 9640, 13442, 13029, 10730, 5208, 170, -2859, -5745, -11303, -9171, -5428, 1246, 5496, 4825, 5809, -2405, -5575, -5021, -3279, 1515, 4733, 7364, 7663, 8542, 177, -5679, -1144, -1460, -2487, -3157, -3478, -7331, -6233, -6206, -5965, -2320, 273, 7037, 7268, 8255, 8167, 10862, 14460, 14642, 10623, 3729, -1873, -5530, -4667, -8563, -10399, -8802, -11242, -13272, -10888, -4788, -1905, 1581, 6465, 3714, 9491, 15494, 18998, 21689, 18202, 15465, 10100, 2277, -8795, -14726, -16318, -16060, -17203, -15384, -10702, -5158, 3667, 7120, 6111, 1148, 290, 4840, 4978, 7586, 8353, 4560, 2444, 12, -1809, -722, 371, -2010, 415, 265, -493, -1086, -1871, 1160, -1226, -4228, -7202, -8487, -3728, 3843, 2807, 4873, 8098, 4390, 1795, -3994, -5147, -5188, -2331, 5580, 11902, 8567, 3691, 2996, 39, -1848, -10976, -15508, -8690, -3979, -251, 2570, 3708, 2848, 2128, 869, -2317, 1492, 638, -833, -955, -3674, -7248, -9569, -1706, 5666, 10789, 9572, 4889, 1472, 2443, 1457, -1485, -1804, -7221, -8739, -6078, -3625, -732, -1251, 3, 3181, 7101, 3310, -3614, -2894, -4786, -3736, -5079, -7866, -3771, 8084, 10433, 12845, 12990, 7314, 10875, 4235, 815, -1970, -5612, -10005, -11232, -6474, -5492, -3705, -2744, -1479, -2559, -3109, -7131, -10112, -2196, 6067, 15708, 24427, 24931, 19299, 15619, 15446, 6476, -4256, -14625, -17675, -17515, -18874, -18599, -16208, -12917, -7857, -3668, -3876, 6844, 14540, 20909, 21015, 11301, 4799, -1875, -7387, -6333, -254, -1188, -4442, -1862, -752, -2420, -4203, -8255, -11957, -12576, -9619, -7755, -3050, 3147, 11792, 17382, 18293, 15953, 4033, -1998, -4073, -6285, -9456, -14086, -12487, -6581, 524, 2684, 3660, 5913, 4628, 1495, 1488, 1056, -2254, 622, 1695, 1133, 2682, 2697, 2282, -227, 2714, 2117, -5507, -8759, -13250, -14236, -6957, -2093, -344, 7065, 9588, 16277, 25672, 19875, 12446, 3984, 5041, -369, -15536, -19995, -18774, -15877, -13433, -11834, -9176, -551, 6608, 12560, 12525, 4682, -558, 1033, 1732, 1511, 10096, 14443, 12461, 12683, 7408, -120, -9984, -15530, -14398, -13325, -9056, -6284, -6309, -2121, 6741, 9834, 9649, 5380, 3665, 4470, 4345, 173, -5783, -3791, -1223, 3173, 5730, 4001, 3558, 4022, 6247, 4075, -2793, -5186, -7656, -9403, -11107, -14340, -14849, -6731, 2791, 11485, 16398, 14704, 8696, 1190, -939, -5509, -4278, -5315, -2983, 534, 4250, 3970, -2559, -117, -633, 1247, -2848, -8913, -11591, -8704, -4882, -3916, -128, 3695, 8346, 10902, 9779, 2317, -1565, -2655, -1133, -3019, -8043, -3886, 1313, 3998, 4750, 275, 722, 591, 573, -392, -3191, -3673, -3437, 1960, 1445, 6463, 6233, 4609, 2119, -1427, 1664, 453, 84, -4949, -9182, -10036, -6621, -8238, -2534, 6423, 15321, 26484, 21755, 16989, 9886, 1525, -4200, -13500, -16282, -14720, -13491, -11707, -7592, -5524, -4192, 3719, 3549, 1821, 2480, 1259, 5542, 13030, 16856, 16099, 14785, 8805, 1325, -5342, -7163, -11393, -14432, -14451, -15794, -12534, -9010, -7117, -5462, -816, 1816, 7092, 14862, 20327, 20260, 15034, 7765, -4932, -10741, -4440, -3019, -1749, -1489, -5099, -4435, -6904, -4108, -3691, -3922, -4691, -8327, -7701, -2956, -1767, 4837, 13911, 11328, 15479, 13172, 5065, -1809, -8639, -10683, -11454, -10407, -9779, -9240, -1847, 5317, 5600, 1286, 4107, 5588, 4060, 5251, 207, -187, 2637, 2878, -4053, -6801, -6839, -5805, -4102, -4323, -7072, -6899, 922, 4795, 9663, 13209, 10627, 3749, 986, 3039, 6214, 8090, 6880, 4062, -3954, -11291, -14570, -15968, -11742, -6872, 1394, 5162, 7952, 9051, 8715, 13664, 8641, 1048, -7533, -6737, 1122, 3669, 1608, 4531, 6705, 273, -2625, -2648, -1886, -3314, -2239, -2064, -1110, -162, -2116, -1005, -3234, -4014, -5927, -4094, 6099, 9259, 9495, 10766, 7754, 351, 54, 2974, 4897, 3958, -4584, -8871, -6474, -4615, -12018, -11956, -6497, -4315, -835, -4931, -5138, -175, 4189, 8066, 9104, 9188, 7620, 2963, 3686, 1916, -5471, -1749, 372, 875, 384, -6253, -4779, -3730, -4863, -5635, -7104, -5218, -6779, -8150, -2975, 5268, 6334, 8856, 8861, 6286, 10305, 7215, 29, -7253, -5669, -1335, -2138, -2480, -4442, -7655, -9100, -11492, -12136, -2217, 8250, 16972, 19037, 13231, 7612, 2375, 159, -1627, -5406, -6674, -8026, -10006, -7384, -6655, -4459, 277, 1055, 225, 4592, 12377, 15347, 12333, 10218, 11273, 9039, 4312, -3648, -8133, -7572, -10622, -15011, -12624, -8432, -4187, 1384, 3106, 1106, 1258, 5969, 8376, 13222, 14886, 13905, 12554, 9083, 2007, -9105, -10356, -7427, -7199, -8903, -10152, -8500, -8955, -9092, -5571, -128, 2752, -561, -2680, 3454, 5738, 6257, 11400, 8013, 11347, 16018, 7562, 841, -5498, -7460, -9103, -15398, -17219, -14929, -9733, -1682, 2565, -2335, -552, 3078, 5031, 11036, 8894, 8417, 8022, 3846, -1951, -5523, -5817, -4997, -5750, -7327, -5497, -5508, 2948, 9358, 8666, 7490, 3275, -1567, -4471, -418, 3598, 4670, 1372, -1492, -2324, -5182, -7153, -9107, -7548, -4051, 2321, 5906, 7013, 9226, 10802, 12573, 7518, 716, -4463, -7906, -6208, -2589, -5274, -6847, 864, 1144, -705, 71, -1032, 320, 839, 3312, 2677, 1973, -1282, -3966, -1928, -159, -991, -4364, 2640, 8761, 10323, 9288, 3081, -3049, -3876, -1359, -1681, -3080, -5416, -8592, -4724, 1431, -4225, -8552, -635, 5349, 4968, -912, -7366, -2375, 2598, 5530, 8306, 9455, 10056, 7949, 8814, 7340, -2842, -12089, -9527, -5914, -5384, -4619, -4529, -3675, -2357, -2302, -6135, -5024, -757, -775, 1938, 6550, 5363, 2689, 7384, 13536, 14623, 10173, 1217, -5250, -5423, -3345, -8431, -10988, -8641, -11338, -11623, -11806, -12318, -6799, 6288, 17325, 21768, 21125, 14826, 5750, 593, 780, -5777, -11922, -10232, -7166, -5899, -967, -528, -4827, -3612, -5807, -4897, 1959, 4474, 5147, 5031, 7851, 11408, 8460, 3464, -1697, -2819, -4723, -9058, -14903, -11372, -6744, -6906, 351, 3705, 4562, 6683, 10232, 8810, 9550, 9149, 8308, 7059, 804, -6798, -14512, -8645, -4985, -4474, -4173, -3177, -2090, -4265, -1716, 2500, 5200, 756, -3889, -3480, 6844, 14217, 13258, 15637, 12301, 11651, 7195, -3560, -9900, -14582, -13874, -15320, -15148, -12803, -8823, 1061, 11660, 9914, -164, 3020, 7054, 8161, 7347, 2260, 2127, 7042, 8827, 2673, 1146, -1567, -8873, -12507, -11331, -8783, -8398, -4222, -221, 3620, 5079, 1445, -2261, 2879, 11724, 12319, 9694, 2047, -4365, -7717, -10185, -13356, -12886, -3345, 3562, 10126, 11321, 4879, 4116, 7976, 7343, -1447, -12273, -15411, -11291, -5484, -833, -516, 2032, 8125, 5926, 1284, 1028, -1621, -2204, -2437, -4317, -414, 5507, 6495, 5778, 5558, 3241, -3387, -7147, -3864, -1266, 1458, -1089, -7511, -8594, -2394, 3972, 8444, 7454, 2180, 399, 3807, 3866, -8806, -9916, -3547, -140, 1858, 224, 1080, 5983, 9106, 8925, 6713, 4682, 3672, -4057, -7449, -7608, -10781, -11096, -4219, 1506, 5714, 7478, 8284, 4603, -2745, -3825, -4224, -6464, -9533, -3383, 7987, 16766, 14137, 9187, 7115, 8091, 9347, 2095, -9084, -15328, -12456, -9198, -8951, -6283, -1968, -2235, -1130, -1263, -2149, -121, 9526, 14583, 12264, 7395, 3437, 4815, 5506, 6223, -79, -5156, -5416, -5369, -6508, -5705, -11926, -16969, -14503, -9987, -2564, 5041, 12412, 13848, 20306, 21391, 15020, 3083, -8546, -10716, -13230, -11846, -12791, -13577, -4315, 2426, 5318, 4833, 1356, -1074, -1645, -83, -2130, -1248, 2412, 5468, 5599, 5117, -1345, -3960, 15, -722, -3268, -7139, -8149, -12459, -9204, 395, 7440, 8363, 5591, 787, 6764, 17093, 8956, 3812, 4548, 208, -3558, -5389, -10031, -11759, -7809, -3000, -2365, -2048, -391, 2079, 6495, 8115, -2388, -7743, 322, 8128, 13064, 12080, 12512, 9162, 8669, 5220, -4109, -10314, -16747, -18852, -14769, -10714, -11248, -5672, 5328, 11664, 14902, 11641, 2283, -560, 2891, 3952, 2400, 1585, -973, -2003, -941, 2056, -6318, -10449, -1369, 2068, 7715, 2419, -4658, -70, 5031, 2520, -2041, -3598, -2491, 3441, 8453, 10281, 3311, -2653, -3454, -6464, -4501, -41, -241, -993, 4639, 11041, 7699, 4431, 1943, 245, -4547, -12390, -15836, -13909, -5694, 822, 7950, 4775, 1489, 1329, 1361, 7523, 7178, -2016, -7765, -4113, -272, -1065, -7844, -1046, 5770, 4145, 833, -4115, -2587, -1570, -2279, -3119, -3118, -1085, 709, -2579, 803, 2998, -2657, -3624, 3162, 7104, 3150, -850, -2944, -4185, -3315, -2572, -2815, -299, -1319, 2243, 6753, 8951, 6485, -4639, -3306, 2889, 2494, -4392, -9694, -5713, -958, 2850, 1944, 1049, 3025, 789, -7022, -10196, -5001, 4491, 16989, 20424, 20064, 16517, 7627, 2187, -611, -1338, -7786, -11516, -10958, -10387, -9128, -6665, -6856, -9085, -2743, -590, 9371, 16461, 14529, 11241, 10119, 15117, 6416, -1654, -5059, -5058, -3774, -11570, -17376, -10204, -2891, -3270, -2347, -2879, -6757, -4893, -2261, 1130, 6322, 13981, 15740, 7365, 4883, 2489, -8065, -9253, -1401, -7450, -6329, -1090, -2378, -7416, -5089, 7253, 3917, -2599, -1906, -901, 3235, 7226, 1569, -3892, 559, 6347, 2646, -5733, -5545, -2694, -4553, -3273, -7527, -7907, -1385, 7541, 11999, 6001, -967, -1875, 4694, 3606, 8375, 11254, 4369, 1583, 2821, -4335, -11249, -9606, -12499, -13272, -4066, 4472, -720, 2065, 13290, 12023, 10330, 6540, -2181, 1507, 7748, 10830, 3291, -5129, -2370, -4922, -8664, -10096, -13413, -12885, -3815, 3173, 4401, 160, 4387, 11528, 5393, -806, -774, -4389, -8920, 3898, 12764, 5905, -1512, -1576, -1125, -6528, -1462, 1933, -2382, -637, 5213, 6228, 372, 402, -1468, -8227, -7580, -5336, -9318, -3998, 6943, 7939, 2932, -1036, 2832, 2889, 9240, 16461, 4628, -5782, -1330, 330, -5716, -7041, -4649, -6671, -7729, -1889, -1453, -6933, -5404, -1228, 743, 4958, 6359, 5584, -796, 1765, 4566, -1584, -1423, 1186, 3911, 2101, 2959, 3137, -4782, -5721, -3110, -5834, -8887, -7943, -3997, -764, 11164, 13166, 1657, -1189, 7269, 8906, -64, -5958, -3112, -1889, -5075, 4032, 6657, -1726, -2257, -3501, -7504, -2395, 249, 3779, 11321, 14923, 13029, 4240, 2863, 4618, -2066, -4932, -5548, -10273, -12118, -7000, -1473, -2395, -11100, -10410, -551, 6169, 18070, 17796, 13208, 16746, 20289, 13085, -6580, -14962, -10119, -10506, -12666, -10297, -11731, -12450, -5252, -2971, -4587, -444, 593, 1154, 6517, 13162, 7453, 4269, 12759, 12864, 5505, -370, -2989, -5443, -8241, -6745, -8828, -15047, -15280, -6792, -232, 1038, 3983, 1597, -5578, -725, 11853, 8851, 13, -1086, 7891, 4004, -877, 791, -2250, 1558, 2877, -7, -9003, -7327, -2737, -2541, 1061, 625, -6437, -9333, 4606, 10945, 4692, 3519, 6847, 4776, 758, 809, -7780, -15344, -13200, -8530, -3178, 1478, 4003, 9344, 16503, 15409, 11713, -2465, -12157, -4250, 1220, 2844, -847, -5692, -4826, -602, -948, -9861, -12371, -1518, 6812, 6379, 7812, 5429, 820, 3292, 9898, 6653, -1039, 2321, 7005, 4834, 2171, 669, -8236, -9241, -4949, -3051, -1347, 1326, 1484, 3276, 8540, 10376, 4130, -5981, -3779, -6436, -7156, -8642, -11364, -798, 13051, 20939, 15172, 1485, 3351, 8567, 1541, -482, -3693, -9755, -10892, -7843, -8024, -8478, -10500, -2542, 4088, -2319, -2156, 520, -498, -871, 2563, 6220, 9942, 11304, 9519, 7200, 9071, 4265, -9692, -11712, -4443, -7781, -11394, -11370, -11829, -12184, -7680, -139, -1968, -289, 5877, 14284, 13499, 5746, 1531, -751, -322, 1021, 2954, 305, 99, 3702, 4237, 838, -3105, -6888, -13255, -15925, -12090, -6694, -2666, 8054, 17383, 18355, 19347, 11541, -1142, -5871, -2540, -2662, -7903, -12426, -11357, -7019, -751, 3400, -2884, -3673, 5892, 15724, 13777, 7505, 9262, 6903, 929, -265, -5007, -8663, -7262, -6014, -1272, -5736, -10508, -6571, -3067, 1639, -543, -2129, 3705, 7354, 11589, 23403, 22155, 16682, 9189, -1375, -3170, -15518, -22370, -16558, -10305, -7692, -4720, -6734, -6033, -1181, 8443, 13596, 3476, -631, 1706, 1312, -534, 4414, 1172, 4642, 14609, 11853, 3958, -1114, -4398, -10626, -14853, -14425, -12220, -9261, -4406, 255, 1272, 1142, -546, 3218, 11189, 11873, 13988, 3265, -3611, -5220, -5966, -1361, -2225, -841, -2001, 887, 7019, 3849, -6435, -4325, 398, -1791, -5541, -8387, -8291, -3197, 6246, 8334, 5956, 6913, 5828, -970, -2737, -7373, -14494, -7031, 8556, 13222, 8641, 9843, 11362, 5476, 252, -1467, -10268, -15040, -9728, -5918, -4337, -6284, -5540, -2391, 2303, 10350, 14833, 10267, 6857, 4881, 1506, -3621, -9854, -5941, -4750, -4681, 3063, -356, -4408, 6401, 10720, 5751, 1976, -1805, -6617, -2213, 3508, 2873, -4021, -3909, 2708, -2522, -282, 2504, -4510, -10022, -6323, -3705, -5002, 118, 8302, 13894, 17106, 18415, 13874, 7253, 3725, 1414, -5954, -14333, -18315, -16316, -12213, -5989, 110, -4966, -5435, 5544, 7048, 1986, 622, 831, 640, 6809, 15907, 11013, 3296, 11024, 11558, 859, -4022, -8227, -10610, -12566, -10323, -9760, -13672, -11522, -7689, -8912, -1952, 10925, 13675, 17769, 20479, 16498, 7591, -4202, -7801, -7110, -4434, -808, -4198, -9542, -6773, -194, 58, -5526, -11263, -12271, -7068, 4234, 10559, 5195, 8042, 16040, 14513, 7994, -542, -2387, -3739, -8328, -11548, -13994, -13232, -5552, 3259, 7488, 9185, 2875, -424, 2390, 10428, 13309, 3317, -1928, -3430, -6868, -8226, -8705, -12417, -9075, 1590, 7848, 1850, -4312, -965, 438, 4432, 7419, 3110, -1686, 5798, 15203, 8474, 647, -1947, 1217, 2523, -1622, -5453, -9156, -12054, -10531, -5803, -2069, 1827, 5302, 10605, 8385, 7831, 6793, -8879, -8964, 5184, 9238, 10672, 8566, 5147, 1044, -410, 2993, -6761, -11406, -8244, -7041, -3125, -3573, -8557, -6037, 5415, 7516, 4534, -2904, -1013, 5980, 7001, 6862, 415, 2132, 2527, 308, 1123, -1118, -4846, -1537, 2914, 2607, 6057, 3182, -6256, -9699, -7242, -9923, -15086, -8136, -474, 4197, 11749, 10340, -19, -2813, 4372, 4062, 6789, 6162, 1582, 3616, 5604, 3752, -6264, -9703, -6653, -7602, -12884, -11929, -10729, -7376, 1736, 5154, 6302, 7602, 10583, 9973, 5275, 6851, 5502, -3958, -7687, -4923, -469, -5077, -9753, -5012, -2756, -2793, -5, 2719, -448, 3080, 9869, 9508, 6061, 2309, -825, -1499, 2353, -1972, -12922, -11524, 106, -411, -2083, -665, -1224, -470, -457, 3808, 3164, 7811, 17043, 13549, 8907, 6419, -2031, -10351, -9127, -4172, -8041, -11439, -9915, -3387, 473, -798, -434, -2091, -5190, -4138, 2505, 8996, 14313, 18059, 21343, 18422, 15538, 3174, -9961, -7581, -7740, -10267, -13281, -13109, -9528, -9454, -4488, -3245, -10125, -7637, 2635, 14234, 19386, 16413, 12686, 8493, 4484, 4114, -2704, -7304, -3756, -1419, -5768, -7229, -9788, -14884, -6910, -4836, -2157, -2012, -1349, 2365, 5482, 13274, 13424, 6037, 2817, 4042, -4358, -7912, -9735, -10230, -3831, 4665, 5163, -2543, -496, 4704, 10943, 6232, -1935, -6643, -7043, -63, -2852, -2884, -2899, -2115, 5255, 2857, -1399, -2370, -3523, -5351, -2371, 2854, -1816, -855, 9305, 9721, 4617, 4586, -4567, -7230, 740, 3088, 5813, -585, -2932, -4583, -7274, 67, 612, -6701, -3754, 3258, 4092, 6571, 179, -3546, 3037, 654, -3552, -2836, 3688, 12191, 15019, 14407, 8790, 2168, -6141, -11402, -11933, -8081, -9194, -8817, 3016, 6082, 5331, 3940, -222, -5088, -5492, -2763, -2377, -1857, 1005, 2900, 5185, 8240, 2783, -1642, 7541, 15571, 10954, 3761, -5231, -8725, -7541, -8785, -12407, -11544, -6099, -4498, -6369, -2775, 1229, 1583, 9214, 9153, 5170, 4755, 2481, 4559, 7738, 8041, 5787, 901, -2528, -7000, -8634, -9238, -14903, -17276, -11191, -6308, -2091, 3165, 1641, 7443, 16156, 20129, 12342, 2189, 1213, -2008, -6642, -11073, -14736, -10803, 2847, 6926, 8122, 4677, -4060, -3748, -6220, -2814, 2227, 4527, 7900, 5117, 6260, 4771, -1708, -1585, 1471, 1198, -213, -4408, -7757, -4993, -3779, -3238, -2743, -552, -623, 8879, 20044, 15854, 10401, 5387, 7166, 416, -9577, -11018, -11069, -6732, -6670, -4143, -3003, -3523, -1990, -3024, -4540, -4720, -5124, -3278, 6125, 16177, 20513, 17289, 13434, 12209, 8628, -1506, -10251, -11940, -14434, -16466, -16552, -14670, -14678, -11382, -1366, 7983, 11297, 4729, 3201, 8407, 11993, 9778, 214, -3956, -2481, -991, 2107, 2980, 29, -4019, -2771, -2786, -7647, -8534, -5311, -3541, -2206, 1814, -2867, -3554, 4581, 9951, 10544, 9674, 544, -3600, 941, -4807, -5467, -8334, -7306, -996, 4043, 11638, 10001, 4812, 2871, -726, -3471, -9872, -16792, -11769, -1545, 2251, 4203, 8467, 4361, 2211, 5308, 2209, -5254, -5352, -659, -1252, -4209, -2235, 588, 3386, 12247, 12466, 3387, 2731, 3921, 412, 1980, -2627, -9516, -9341, -8391, -3516, 873, 4672, 5094, 4046, 7480, 6190, 1429, -3674, -7430, -9920, -7037, 110, 4311, 9011, 11365, 11554, 8085, -511, -12853, -10030, -349, -1958, -4390, -6157, -3499, -2255, 1805, 3508, 885, 721, -2216, -6943, -5080, -3103, -9735, -3008, 8301, 12353, 14807, 16166, 13237, 6797, 2531, -2946, -9254, -12875, -14720, -16947, -13114, -8858, -8947, -3732, 4837, 9495, 10987, 6191, 5462, 8908, 8427, 2625, -4673, -1114, 2438, 2551, 2276, 611, -6049, -8454, -2510, -3181, -5828, -9820, -13216, -10924, -4000, 2572, 5741, 14759, 17553, 13282, 7365, 1338, -2693, -9306, -6637, -4711, -5850, -4418, -2117, 1714, 6601, 5709, -2516, -2789, -4719, -2360, 697, -1002, -1034, -500, 7029, 8706, 10417, 3060, 511, 1842, -1090, -162, -9228, -8556, -7856, -7962, -2984, 4119, 2666, 6312, 19646, 17462, 15368, 12102, 3149, -3828, -8681, -11472, -11227, -10140, -7768, -3359, -983, -3094, -4434, -2702, 5992, 7124, 4410, -537, -5044, 4064, 11665, 11192, 8145, 7398, 3746, 354, -6000, -7731, -12090, -16875, -13519, -8871, -5339, -1619, 4712, 7378, 6591, 5138, 5073, 4100, 5015, 2796, -1298, -6634, -5557, -392, 3217, 5046, 5770, 417, -5170, -4035, -2081, -15, -6710, -9573, -2872, -603, -2467, -2033, -3944, 2586, 10961, 12490, 7661, 5573, 1862, -6438, -9589, -8077, -2746, -1016, 4649, 5055, 4709, 3498, 924, -2314, -3346, -3719, -8889, -7398, -3044, 1938, 4054, 4648, 3791, -718, -1780, -9, 4365, 5721, -1571, -6663, -2947, 5447, 5062, 4156, 3772, 2674, 346, -1202, -787, -2042, 167, -2013, -3937, -6666, -6420, -3215, 5234, 9765, 6437, 4716, 2081, 2624, 2834, 1374, -6108, -10242, -7029, -5537, -2120, 4505, 4967, 2561, 6634, 9370, 6198, 624, -1763, -1867, -1788, -1838, -7349, -7190, -5373, -6033, -71, 420, -2647, -3382, 1942, 1237, -306, 3303, 6183, 15123, 14687, 10680, 1798, -179, 3420, -3902, -8918, -10885, -16081, -16156, -5160, -3584, -2945, -3992, -7780, -2991, 7251, 12776, 10102, 12034, 9179, 3567, 586, 31, -3717, -4664, 1403, 406, -329, -5084, -9664, -5608, -822, -2610, -9187, -9868, -7053, -316, 6899, 9196, 7117, 7824, 13079, 7052, 1083, -1388, -6597, -7971, -2548, -1636, -6926, -2711, 308, -1405, -1582, -2342, -6748, -1756, 5759, 10290, 13731, 6347, -630, -3898, -1611, -764, -2549, -4210, -3336, -1914, -270, -4846, -12793, -5244, 4262, 10165, 11699, 4465, 2144, 9351, 11328, 8977, 2135, -5357, -4482, -4674, -5005, -7519, -14725, -14677, -7637, -1677, 4599, 7419, 6291, 7225, 4585, 3392, 2295, -1197, 2661, 7686, 10629, 7030, -1514, -8035, -6710, 1226, -1153, -8063, -8710, -6348, -2332, 1156, 2223, -2287, -2003, 3111, 2085, -1842, -4322, -3450, 3014, 14147, 11464, 2323, -1802, -2409, -1745, -3667, -3632, -1300, 1048, -2092, -951, 2201, -4034, -9358, -8048, -5154, -976, 2721, 6184, 8176, 8078, 6709, -1843, -7253, -1387, 2292, 6118, 8750, 828, -1307, 4964, 6540, 1370, -6948, -7510, -5811, -5865, 92, -232, -1367, 933, -1190, -2877, -963, -229, 3236, 7398, 6884, 5631, 2950, 3126, 345, 1943, 1208, -3561, -4174, -7360, -8268, -6281, 463, -4166, -7494, 3337, 8820, 14078, 8814, -1998, -717, 3926, 6840, 623, -7450, -6457, -5100, -5750, -1789, -4946, -7323, -251, 3575, 7637, 6442, 7845, 6833, 5629, 3783, -2906, -1750, -2371, -4159, -7717, -9647, -12205, -9720, -919, 1381, -767, -2216, -5626, -7189, 7090, 21506, 18464, 13221, 11739, 8250, 3799, -3123, -13285, -14139, -7584, -5419, -2994, -7731, -7216, -4040, -4108, -5540, -8916, -4050, 7362, 9511, 8624, 9649, -1422, 4779, 15381, 10831, 7180, 3128, -2651, -1762, -3195, -7588, -11199, -12627, -10589, -8852, -6124, -1527, -1097, -23, 9085, 10980, 17583, 12000, 2380, -3370, -4400, -2844, -4530, -1878, -2473, 814, -1090, -4739, -10006, -4791, 579, 2272, 772, -2742, -1487, 2058, 8962, 9273, 5007, 302, -2395, -5055, -4940, -8168, -13783, -12690, -5683, -4378, 3430, 10101, 10801, 13505, 8534, 4442, 3324, 666, -3326, -3289, -6708, -5518, -8800, -9773, -706, 1702, 2089, -3519, -2083, 3477, 4856, 4761, 1372, -2834, -3759, 2347, 3008, 3688, 5763, 8839, 14021, 11689, 8316, -4026, -11396, -9642, -8672, -6182, -3844, 1876, 2216, 2006, -1157, 120, -2172, -8081, -3012, -2648, -156, -437, 2800, 10639, 12059, 11041, 9291, 1025, -1758, 2808, -3452, -3375, -9325, -14413, -6181, -1107, 1609, -1095, -899, 758, 3247, 4355, 1513, 2901, 1293, -3095, -7879, -5378, 3333, 8315, 14841, 15835, 12708, 6017, -1403, -6929, -9237, -8830, -13791, -14097, -12324, -10604, -5432, -804, 614, 3707, 7918, 10285, 12667, 5860, -716, -494, -1363, 1152, -1379, -5389, -13, 4186, 752, -2821, -9695, -13314, -7520, -7958, -4707, 979, 5814, 11547, 12114, 9888, 8144, 3908, -1801, -2353, -9281, -13055, -14426, -15096, -6748, -1564, 3877, 7170, 6036, 6351, 12416, 16631, 13685, 7664, 486, -4592, -10123, -8955, -10007, -9235, -1018, 4113, 1873, -3167, -830, -2556, -4782, -2898, -3963, -4323, 2128, 9877, 15679, 20056, 16058, 10390, 8649, -1151, -4223, -4894, -11831, -16716, -16477, -10301, -9560, -6169, -3701, 895, 1890, 4308, 1318, -2112, 8652, 12125, 8370, 4583, 5660, 3069, 6416, 12336, 7159, -2908, -8840, -10955, -14747, -16326, -18689, -13684, -1864, 1124, 3322, 4948, 9563, 12887, 13920, 11782, 2010, -738, -6386, -14003, -12034, -3741, -7875, -5055, 4497, 5975, 8762, 8283, 6205, 870, -2226, -6754, -10135, -7143, -3125, -10, 4018, 3405, -2823, -2166, 4950, 5649, -189, -6419, -6658, -2870, 5928, 9469, 5963, 12687, 10946, 4327, 336, -3285, -8196, -7630, -3532, -5423, -2195, -5101, -4852, 880, 3284, 7429, 7122, 5711, 5053, -559, -2767, -6938, -15011, -8334, -2042, 1999, 13260, 12550, 9839, 12227, 9083, 2365, -11470, -14457, -9131, -8081, -7412, -7520, -9583, -3786, 6725, 7058, 6822, 3424, 632, -4176, -4952, -3728, -2647, 4104, 6002, 9203, 10041, 8744, 5344, 5371, 3999, -1958, -5756, -13333, -13291, -9041, -3847, -2625, -5317, -4901, -2307, 7009, 11669, 7464, -4164, -4914, 5130, 11041, 10644, 4999, 4407, 8991, 7742, 851, -7328, -11100, -8223, -10493, -13729, -15421, -15266, -9680, -3115, 1766, 11250, 14222, 18937, 20436, 14024, 6017, -5057, -10524, -13782, -10890, -8530, -7378, -7420, 611, 6646, 7080, 2967, -6141, -7036, -3833, 2439, 8024, 4764, 1378, 5346, 5503, 2769, -583, -5249, -4112, 1516, 651, -4547, -10608, -2042, 5945, 5919, 5542, 3525, 9062, 11586, 13364, 11336, 4665, -5407, -8673, -4464, -5611, -7298, -8723, -7590, -5283, -1003, 5141, 4881, 846, -978, -3848, -7024, -5973, -3894, 7325, 20540, 23229, 16308, 4067, -475, -2863, -1974, -7931, -19558, -18090, -12326, -12340, -10833, -8030, -4192, 6434, 12813, 11945, 7488, 7377, 7423, 2541, 2323, 3706, 860, 433, -204, -3591, -3988, -7454, -13653, -9100, -3370, 1, 3958, -1754, -4922, -2783, 962, 2290, 2770, 6186, 9146, 8476, 6411, -2646, -15378, -7669, 1703, -906, 2045, 4510, 5461, 7662, 7548, 8048, -442, -3273, -5870, -12237, -11189, -11567, -9031, 1347, 11232, 11596, 9067, 744, -1304, 244, 4562, 1579, -2688, 1389, -356, 2980, 6751, 473, -12040, -7232, 915, 4583, 2564, -1626, 3364, 3358, 2026, -5436, -8686, -2982, 1358, 6262, 6856, 2208, -3404, 2555, 4973, -8, -1828, -7225, -4209, 1110, 6055, 7624, 3876, 4707, 4089, -1516, -4619, -6355, -8949, -4265, -1946, 510, 3690, -3610, -4078, 2300, 5263, 335, -4470, -5166, -1577, 3677, 1487, 4031, 1283, 13082, 17255, 7277, 4329, -4426, -2400, -4296, -6189, -10556, -14885, -13666, -10521, -7833, -5456, -4755, -5626, 2789, 9209, 14999, 15418, 13452, 12483, 7735, 3246, 621, -1705, -6399, -9827, -7393, -7922, -11377, -14128, -8197, -2833, -3482, -4904, -10996, -739, 12823, 20366, 20879, 13833, 6825, 4134, -580, -8007, -9609, -10150, -5541, 1261, 4187, 480, -3990, -3734, -1542, -2066, -1428, -3714, -60, 5650, 7958, 7454, 3084, -2099, -5568, -1013, 4758, 3889, -3135, 152, -2537, 413, 4077, -5707, -4456, 1074, 4623, 3993, -59, -2405, 5944, 16074, 10250, 1037, -8200, -10429, -4435, -2019, -2024, -6950, -2837, 874, -881, -2231, -1604, -5161, 4038, 13320, 5247, 6103, 5126, 8080, 8693, 5365, -242, -7455, -10528, -10453, -8366, -7168, -9558, -11364, -4433, 5226, 11269, 8824, 3412, 2897, 6682, 6244, -291, -3111, 6916, 7344, 4200, 1061, -9193, -10556, -4021, -1325, -1436, -2482, -3703, -1903, -1663, 2703, 1069, -45, -2822, -5906, -2122, 5273, 2041, 1321, 7137, 3840, 5027, 1251, -5039, -3371, 3676, 6424, 8874, -457, -3574, -4044, -6362, -5142, -14780, -16097, -7588, 2571, 7043, 4541, 2284, 6182, 5472, 5841, -823, -3940, 2334, 4044, 2903, 3173, -2341, -5818, -443, 1728, 4225, -994, -6664, -11148, -4080, 1741, 650, -1333, -144, 214, 965, 4307, -670, -330, 5488, 12104, 9341, 288, -11103, -6690, 5466, 3620, -3731, -3654, 25, 2448, 4501, 901, -7009, -5459, 2952, 5300, 5637, 2831, 1412, -1402, 1382, 496, -4250, -2417, -2063, -5687, -3467, -3083, -7901, -3864, 4657, 15697, 22100, 16351, 5753, 5565, 1232, -3793, -7343, -12852, -13575, -10859, -8102, -8789, -10886, -7054, -655, 1574, 7724, 3043, 1890, 9265, 11376, 8695, 6107, 4027, 4120, 5486, 813, -3990, -9750, -11583, -9161, -7928, -9255, -9256, -4910, -2356, -1750, 3370, 5241, 9150, 9036, 10188, 11715, 1781, -6058, -11134, -5536, 3398, 6280, 650, -2492, -352, -1640, -1732, -4422, -7753, -5303, -4187, -2611, -3089, -4548, 4043, 9904, 13626, 11684, 1877, -825, 0, -2512, -4415, -7863, -10215, -5704, -2709, -1363, 7008, 7501, 6395, 6768, 5461, 7088, -1971, -4791, -4514, -2379, 913, -1223, -2541, -1068, 1108, -70, -2999, -8259, -4805, 4544, 9187, 4201, -970, 3250, 6400, 8301, 8754, 2632, 1543, 1857, -3523, -9204, -13588, -13805, -5966, -1550, 386, 3753, 4285, 7047, 7377, 7640, 6593, 2125, -2145, -6000, -10303, -3479, 1838, 1042, 5128, 10713, 11662, 5194, -3579, -7008, -3595, -2614, -4328, -9509, -6414, -2523, 1706, 3054, -423, -2346, 614, 6721, 7178, 6507, -2187, -6638, -2851, 1807, 4736, 4238, 10050, 11863, 3161, -31, -6433, -14071, -12790, -9309, -5689, -2860, -3665, -4389, -1298, 5978, 11206, 6079, 2220, 2682, 3904, 192, -4789, -9629, -6978, 3908, 6264, 6257, 1500, -2892, 4527, 4333, -5143, -11720, -13567, -10675, -7110, -5212, -2816, 1682, 10077, 19161, 15390, 10271, 3216, -2241, -6428, -10047, -10278, -11530, -2543, -279, 3509, 8895, 3199, -3940, -3535, -938, 4224, 5833, -2689, -3064, -1002, 4287, 3422, -1704, -2058, 637, 2805, 1045, -3166, -7287, -3363, -2565, 382, 828, -385, 7767, 16209, 17928, 12575, 9326, 5238, -3166, -9939, -14505, -16197, -15937, -11401, -5082, 1717, 8293, 6959, 5810, 7964, 5615, -1519, -698, -4279, -5426, 3458, 5064, 5579, 3165, 3870, 7100, 7611, 1347, -9009, -10129, -10992, -12702, -7821, -4805, -804, 3890, 5697, 6622, 5343, 7364, 9877, 8494, 5451, -1041, -6227, -6686, -4087, -215, -192, 1623, 874, -1382, -3153, -919, -435, -6993, -9695, -6958, -804, -124, -1271, 4250, 11336, 13609, 15923, 6439, -3808, -4686, -7133, -11223, -15143, -10759, -3751, 7044, 17299, 15348, 7049, 5004, 3340, -3538, -9274, -13404, -9085, -3379, -4533, -2747, -2978, -2041, 3921, 6912, 8541, 6957, -747, -686, -300, -2706, 1398, -1609, -3043, -244, 3644, 3728, 3485, 3648, 2207, 2416, -2875, -9595, -13716, -7902, -637, 2048, 4793, 3457, 7809, 12132, 7176, 91, -6502, -11325, -11680, -2615, 911, 3041, 6582, 9838, 9250, 5137, 3682, 2704, 2724, -4122, -11219, -14085, -9564, -9000, -3634, 4162, 7512, 10294, 4959, 1989, 585, 1886, 2736, -6510, -7047, -575, -726, 1457, 3125, 673, 1828, 8382, 4580, -1481, -8407, -8589, -6423, -8126, -7213, -9064, -6328, -833, 4798, 6543, 10338, 7355, 8138, 8928, -993, -4312, -4465, -5333, -4219, 843, 1753, 4120, 8747, 3662, -3913, -5964, -9477, -17159, -12354, -354, 8426, 13815, 10083, 8765, 6650, 8010, 6840, -104, -4376, -6571, -8596, -10570, -7002, -4398, 1875, 4088, 3862, 1824, 2009, 5439, 8602, 7628, -1444, -358, -160, -5212, -7332, -3001, -2050, -2251, 4554, 6475, 6783, 3351, -4005, -9879, -6569, -3573, -1998, 3846, 8132, 13558, 12875, 8420, -1770, -7859, -8405, -6942, -1583, -7151, -11089, -6512, -1093, 2370, 955, 2146, 6912, 5121, 705, -5744, -7901, -1007, 4970, 5952, 5127, 6318, 2863, 1578, 1531, -2577, -3944, -7248, -7320, -6060, -9774, -6841, -4071, -3013, -508, 1943, 10716, 15017, 8269, 5149, 4740, -1012, 590, -4078, -7061, -1980, -1994, -1665, -6560, -6109, -216, 6186, 3776, -1389, -2687, -5696, -4801, -3632, 307, 6408, 10737, 8546, 5019, 368, -5066, -7575, -7819, -3461, 1006, 3883, 2956, 4403, 6312, 6170, 3832, -1565, -3033, -3283, -2218, -2418, -3832, -3248, -2846, 390, 4218, 3138, -1401, 4968, 10355, 7430, 4603, -4298, -3902, -10, -2122, -6828, -5663, -4753, 657, 5385, 6611, 12133, 1704, -1130, -3660, -6431, -2261, -751, 299, 1360, 1421, -1049, 3211, -1567, -6605, -1687, -2075, -77, -1845, -2355, 2833, 7138, 8524, 2080, -1034, 265, 4279, -3663, -3192, -4802, -8624, -916, -159, -1846, -6529, -2210, 443, 871, -206, -1075, -974, 1911, -1203, -2825, 1356, -1536, 4377, 7797, 7110, 5815, 2462, 113, -1981, -1185, -7545, -11755, -6765, -5615, -4097, -5257, -7367, -6766, 5059, 13614, 13635, 10439, 2147, 2106, 4158, 7329, 3694, -1118, -1246, 1152, -1916, -8451, -9821, -10745, -6655, -5708, -4054, -1773, 346, 9205, 13281, 12990, 9070, 7376, 6344, -1455, -847, -1993, -7298, -8452, -2047, -705, -2645, 98, -4333, -517, 3780, 4156, 1883, 3833, 1615, 1177, 4885, 170, 1281, -5720, -4368, 3920, 7893, 3092, -3784, -3443, -3900, -5523, -8699, -2485, 1618, 3890, 5088, -1087, 1080, 6253, 5417, 2034, 988, 1257, -6548, -5282, 2035, 4959, -636, -4538, -4035, -6346, -3420, -2324, -2661, -4015, -3518, -1844, 6835, 10421, 4271, 7509, 10932, 7882, 7877, -4986, -8704, -2996, -7307, -11797, -14585, -10910, -5413, 1487, 1527, 4122, 2843, 4399, 5191, 3358, 1318, -1580, -1388, 53, 5637, -1003, -2159, -1279, -1331, 3157, 1365, 2417, -2919, -9077, -4220, -1917, 3099, -614, -745, 901, 1868, 4546, -1107, 1866, 2850, 2172, -2078, -4610, -3386, 9079, 13004, 7121, 5626, -549, 3300, 1297, -2760, -6125, -11813, -11518, -8305, -2018, 2487, 5958, 7265, 7748, 8491, 4105, 4755, 6390, 2432, -4366, -6609, -7181, -6638, -6144, -3778, 4392, 5826, 9179, 447, -1135, 2869, -1953, -3078, -5618, -794, 4232, 4362, 733, 1583, -427, -1025, 1582, -1563, -4562, -9920, -6789, -4724, -3508, 5134, 814, 1770, 7825, 4200, 4405, 6150, 1866, -3700, -4831, -3018, 3439, -1910, -5621, -1772, -458, -112, -2333, -2519, -3538, -2614, -4862, -9925, -12436, -745, 12638, 16142, 14409, 13311, 15705, 12805, 10147, 562, -11206, -14763, -15845, -17140, -16090, -11198, -7294, -2505, -336, 2450, 7811, 7378, 6676, 6237, 7781, 6403, 862, 1430, 2692, -114, 3297, 1031, -8225, -6127, -7260, -6645, -3955, -8416, -8569, -2583, 664, 2283, 4489, 8796, 14131, 16056, 10316, -109, -7258, -8905, -3803, -5908, -3854, -85, -553, 1816, 2518, 6001, 9967, 5505, -796, -6838, -8363, -3950, -5631, -578, 4617, 8350, 11873, 7270, 616, 2899, 2333, -5666, -11712, -11592, -10438, -10732, -337, 1444, 1539, 7201, 8785, 11231, 13566, 3845, 590, 2721, -4099, -7946, -9575, -2635, -584, -5475, -7006, -5278, -4906, -2513, 1854, 2250, 3475, 566, -5628, -3825, 3204, 9227, 9585, 14565, 17849, 7907, 1936, -8095, -13711, -14625, -14625, -9802, -2336, 986, -1533, 5975, 7208, 6165, 3461, -3930, -5848, -3434, -3181, -5989, -3067, 4315, 8047, 7125, 12349, 10937, 6333, 4313, 525, -6035, -11032, -11506, -10337, -9610, -10049, -5545, -6687, -4320, 5903, 12232, 12560, 9750, 2673, -1076, -4317, -3054, 2790, 3750, 2325, 3106, 5404, -916, -4693, -6303, -6679, -8427, -8309, -9993, -6286, 319, 4201, 8992, 9315, 12491, 13362, 7508, 2787, -1868, -10902, -9773, -9840, -7675, -1753, -701, 3639, 9082, 8171, 4256, 297, -1309, -3148, -9475, -8059, -234, 1378, 88, 3199, 5479, 11334, 6912, -3493, -3015, -125, -4980, -6991, -10047, -10104, -2291, -3377, -2937, 1951, 11712, 17601, 20186, 18045, 7182, -1430, -6429, -8108, -9781, -11950, -10761, -5836, -1989, -2993, -2607, -776, -3112, -5022, -4997, -3564, 3087, 10354, 14626, 18275, 20347, 14587, 6328, 3357, -2825, -11382, -16006, -19719, -17405, -8902, -7352, -6161, -5433, 2279, 7057, 6112, 10176, 8104, 7142, 10613, 2646, -7541, -6102, -6872, 367, 5864, 4287, 2333, 1506, -198, -3038, -8840, -11740, -7390, -6016, -3334, -5775, -3936, 5882, 8238, 12130, 16791, 9282, 8349, 1798, -8321, -8110, -6162, -6158, -4752, -1052, 928, 4555, 6974, 5688, -3083, -5747, -5912, -5094, -2145, -853, 1276, 5568, 7775, 4313, -484, 2748, 5003, -3606, -9605, -9315, -9346, -7373, 518, 1982, 6484, 8185, 6507, 5773, 9257, 8706, 2634, 3541, -2053, -4689, -9485, -11342, -12760, -10163, -913, 4833, 14765, 9447, 2447, 3884, 2712, -4065, -13050, -7504, -286, 4189, 7236, 9048, 9504, 11316, 7932, -5648, -5163, -6097, -6814, -4636, -4982, -4154, -5211, -1903, -2974, -2437, -399, 666, -4833, -3801, 3518, 1544, 9258, 8644, 3268, 7235, 7784, 10697, 6041, 2232, -909, -4719, -7407, -16187, -18375, -14078, -7856, -7115, -893, 2381, 7635, 13356, 11458, 8541, 5059, 5898, 1024, -231, -3218, -2893, -3227, 1024, 5727, -507, 1017, -2959, -5673, -5933, -8764, -7683, -8798, -4536, -4645, 1530, 13222, 12247, 9715, 6117, 5609, 4614, 3595, -5336, -5986, -3758, -5071, -2534, -1223, 6041, 1211, -3099, -2532, -4326, -6608, -1788, 5342, 9083, 10400, 2883, -2604, 1380, 3158, 1132, -1541, -4366, -2592, -6458, -10893, -8572, -8232, -8596, -1786, 4668, 15984, 17313, 13718, 16241, 11081, 4663, -4521, -12410, -14001, -9897, -12711, -11422, -8819, -5773, 93, 1338, 2189, 374, -433, 1742, 5541, 3654, 4332, 9437, 15618, 16365, 6617, -3496, -7413, -7803, -2664, -5562, -10541, -9313, -9778, -10743, -9874, -234, 876, 5114, 7481, 3646, 5173, 7003, 3127, 1558, 5959, 6231, 4843, 1713, 4111, 3077, 701, -2596, -8901, -10286, -9206, -8661, -5359, -4834, -6498, -2975, 3565, 7370, 13029, 13996, 13163, 11720, 3611, -284, -7901, -3886, -1355, -4112, -4226, -585, 1115, 264, 4358, 252, 726, 889, -5623, -5370, 629, 1793, 2285, 3611, 4133, 1437, -2694, -4718, -3890, -3457, 2595, 1518, 1433, 3566, -124, 4503, 3808, 4331, 2184, 1078, -1224, -300, -2078, -4950, -3804, -6651, -6341, -5994, 1162, 6210, 7010, 5794, 4320, -437, -4679, -4951, -11080, -10837, -496, 26, 29, 5880, 10728, 11396, 9022, 3628, -4482, -5195, -4097, -1423, -4208, -6882, -6896, -6715, -5924, -6490, -7920, -3357, 1358, -1223, 3841, -627, -1864, 5426, 7223, 10544, 10193, 11664, 8993, 3450, 479, -5275, -10656, -14411, -12125, -9801, -6549, -1507, -1896, -129, 1135, 1306, 4368, 3570, 1362, 5942, 5670, 2963, 2618, 4923, 12409, 11192, 7734, 4477, -1798, -3429, -8389, -10983, -9875, -9774, -7254, -7263, -3833, -2458, 3087, 11412, 17134, 19300, 14456, 6958, -288, -1180, -4272, -3212, -100, -207, -3928, -2946, 310, 327, -4647, -12689, -7940, -1724, 4243, 2644, 1609, 8077, 9623, 8168, 1526, 532, 2296, -2198, -7207, -11522, -12531, -13437, -8751, -1346, 5616, 7874, 10059, 15437, 11487, 9409, 1924, -1301, -4871, -9535, -11724, -11447, -3586, -6253, -1324, -493, 1544, 1707, -7084, -5031, -1409, 3015, -1125, -2684, 1896, 5226, 6545, 9825, 10798, 8013, 9766, 1694, -4448, -6434, -11147, -12702, -11684, -8697, -9150, -5992, 664, 5416, 7164, 4131, 1500, -3590, -1634, -1273, 1422, 11039, 10454, 10164, 12092, 12398, 7648, 2130, -10936, -14134, -11001, -13091, -13233, -9927, -72, 680, 8049, 7819, 6238, 8438, 6072, 8841, 1415, -580, -3235, -6848, -4046, -2285, -1529, 2013, 13119, 14003, 9573, 1280, -5153, -4680, -8899, -11577, -9520, -4791, -3159, 298, 4358, 10015, 7732, 479, 916, 1538, 5169, 2202, -3625, -4376, -1688, 2518, 4590, 7682, 9107, 3720, -2416, -5686, -12253, -13618, -11169, -6474, -273, 2817, 5909, 9598, 16879, 11153, 886, -1062, -5915, -8658, -10453, -12538, -11789, -5046, 2669, 7597, 13223, 13066, 9713, 3367, 364, 434, -3024, -4529, -8947, -9988, -8060, -4946, -7741, -6555, 852, 2089, 6615, 3092, -2599, -5079, -3160, -5575, -9273, 786, 9123, 16102, 21867, 17069, 7008, 261, -5687, -11380, -13537, -14290, -14385, -10292, -7500, -1023, 4789, 4428, 2462, -1031, -2769, -804, 1085, 1856, 3668, 4038, 12054, 14353, 11615, 12068, 11333, 5160, -4307, -8820, -14576, -15968, -13610, -13222, -11362, -8368, -1963, 6450, 14468, 16982, 15108, 17176, 11381, 4522, -2316, -7831, -9684, -9967, -6539, -3768, 1690, 2222, 2346, 4994, 4771, 535, -3623, -6628, -7833, -3490, -2029, 3264, 11366, 9541, 10127, 4827, -3086, -5641, -7732, -8276, -8315, -7418, -5673, 601, 8307, 15080, 12315, 11200, 7156, -57, -4521, -8763, -8179, -10353, -6942, -4349, -1855, 3720, 1727, 2397, 1083, -103, 306, -1428, 1340, -1304, -6576, -7263, -4084, -3327, 4087, 9532, 14129, 20812, 13058, 3218, -5062, -9755, -13276, -14487, -13922, -11190, -4987, -2201, 2312, 3458, 5774, 7011, 3958, 2668, -2952, -3807, -4189, 2247, 6963, 7697, 8279, 6803, 6741, -2302, -7144, -10262, -9069, -9380, -8213, -2643, 604, 974, 269, 3887, 3791, 4371, 3330, 4108, 4112, 2734, -3232, -10499, -1887, 3298, 5220, 10153, 11632, 10968, 4270, 1265, -2740, -8558, -11422, -16041, -14447, -8719, -9006, -6920, 4902, 10559, 15486, 17716, 11213, 8791, 2741, -1944, -6756, -7148, -1721, -3438, -4510, 3015, 6494, -2054, -1979, -2010, -2999, -4249, -7886, -3585, 3862, 8205, 3537, 6491, 7592, 3041, 3496, 2293, -2038, -9607, -7959, -7006, -4171, 1610, -304, 1140, 5606, 6565, 1298, 5093, 6643, 2412, 673, -6011, -9067, -8621, -5861, -3103, -1552, -639, 1866, 1908, 4648, 5459, -2736, -3326, -3705, -10079, -8945, -1974, 4090, 11487, 16090, 13995, 12639, 12267, 249, -8486, -8221, -12207, -12289, -9380, -6996, -4700, -4129, -2811, -2430, -1870, 2421, 5180, 10437, 12104, 7709, 8562, 6633, 6464, 4950, 251, -491, -1859, -2827, -9419, -12433, -11140, -11617, -8335, -6269, -338, 1145, -918, 3926, 10077, 14058, 14627, 9839, 2367, 749, -6546, -10789, -7261, -5463, 2176, 4056, 2752, 1452, 1515, 3370, 241, -3237, -8732, -6958, -3770, -2351, -1320, -447, 2163, 3427, 6627, 4279, 4502, 4761, 2614, -4390, -9513, -4693, 177, 4516, 1891, 592, 3865, 600, -5679, -4805, -1127, 2483, 3063, 2129, 3854, -785, -1523, 208, -2699, -1268, 1685, 4125, 1719, 1037, -2599, -5775, -912, 274, 3385, 3914, 3651, 7718, 9612, 5116, 1749, -1181, -8041, -11286, -8762, -4765, -6992, -4991, -147, 3896, 6736, 3024, 3590, 546, 886, -248, -9458, -2403, 5099, 8400, 8127, 1966, -993, -926, 46, 2464, 3057, -1472, -6153, -5536, -1900, -6664, -8522, -7289, -6173, -2972, -648, 2801, 4217, 7284, 4846, 2219, 6450, 7247, 6899, 6354, 5067, 3704, -2437, -6133, -7630, -9521, -8574, -9360, -10315, -6982, -1109, 512, 1728, 3297, 7360, 12961, 14461, 12448, 6149, 3089, -2860, -6661, -3035, -4703, -7178, -6279, -2250, 356, -1200, -3476, -2579, -943, -4399, -2865, -1194, 2057, 7807, 5199, 2745, 2381, 972, -1407, 655, 2173, 932, -4944, -6531, -572, 2833, 625, -3722, -682, 213, -76, 2638, 6100, 4880, 4443, 2931, 2543, 1786, -995, -4054, -6194, -564, -1273, -2971, -1974, -465, -2277, -4972, -5525, -1345, 2330, 5490, 8492, 10754, 11000, 6475, 1208, -1302, 513, -4193, -5766, -7722, -8528, -5826, -5035, -9704, -6909, -2658, 1894, 8899, 9333, 6367, 1411, 3360, 4970, 8721, 2773, 771, 5, -2216, -638, -2289, -4874, -7100, -4952, -4976, -6398, -3830, 721, -661, -441, -1167, -249, 1655, 7089, 8539, 6366, 1735, -83, 2435, 4028, 5744, 3286, 1618, -6129, -5271, -3300, -2458, 406, -2834, -3334, -2368, -3127, -5214, -4844, 992, 3148, 6906, 8369, 6476, 3575, -895, 845, -496, -1303, -337, 1026, 1655, 1010, -6390, -5881, -1567, -998, -26, -978, 3825, 2865, -69, -300, -361, -692, -1293, -2559, 1875, 4990, 916, -2123, -2696, -1847, -2398, -2858, -1256, 687, 639, -2944, -1902, 3338, 750, 161, 2791, 4916, -383, -4488, -331, 1761, 2074, -5550, -6672, -2984, -4903, -5196, -5525, -2471, 1653, 3010, 1399, 4135, 9612, 5509, 1720, 2180, 4898, 7862, 4197, 1781, 1257, -3065, -7982, -9322, -7324, -5208, -4483, 762, 1788, -1281, 330, 888, 4410, 6153, 7340, 6512, 5238, 6748, 3520, -222, -908, -2768, -5565, -5035, -5080, -3679, -4327, -4968, -4146, -1902, 2213, 2737, 873, 2846, 4175, 3922, 5519, 2244, 2257, 3008, 425, -1517, -50, -1859, -1702, -559, -2024, -3747, -5005, -1650, -862, 558, 1541, 2172, 1759, 4709, 4777, 2682, 2375, 768, 545, 786, -90, -2250, -4019, -5583, -2761, 1018, 852, -416, 567, 4001, 4385, 433, 4100, 2125, 755, -759, -4128, -5129, -4829, 880, -713, -1908, -3408, -3915, -4848, -3133, -3035, -2350, -1093, 256, 6342, 5736, 1838, -2270, -1759, 935, -353, 394, -489, -1587, -1043, -2804, -2653, -4839, -1758, -769, 175, 2531, 276, 119, 35, -1705, -3311, -1420, 2262, 5671, 5925, 7208, 2624, 919, 3689, 2135, 2294, -816, -2448, -3324, -7141, -4746, -761, 172, 1101, 2568, 3685, 2862, -322, 214, 2847, 1148, 2175, 3792, 3985, 3578, 2606, -784, -3012, -2010, -369, 984, -449, -994, -2053, -6019, -3850, -140, 4256, 5590, 2523, 3995, 777, 630, 593, 386, -536, -597, 850, 549, -1046, -6046, -5377, -4585, -488, 1208, 873, -163, -1493, 13, -3376, -2736, 585, 4352, 6370, 1519, 770, -923, -3126, -1599, -5340, -8797, -5311, -2958, -3045, 1082, -104, -1708, 458, 1059, 4224, 6713, 4798, 1045, -1237, -1287, -2924, -3014, 0, -1591, -5531, -6491, -6869, -5158, -1525, -711, -833, 2694, 4733, 1268, 2772, 4833, 3877, 1452, 2316, 3467, 2507, 1276, -2187, -4000, -4989, -3657, -4231, -23, 63, -1329, 1819, 1691, 1568, 2646, 4090, 624, 3563, 5084, 1098, 3076, 2994, 208, -2139, 406, 3294, 1129, -2464, -3317, -590, -1585, -553, -1008, 2786, 4620, -250, 162, 578, 3070, 3741, 3789, 649, 84, -387, -1321, 490, -876, -1627, -2659, -1878, -1788, -1875, -907, 2012, 1515, -391, -1036, -545, 3667, 1066, -1467, -1166, -470, 863, -1589, -1043, -2114, -1530, -1583, -2764, -1276, -2350, -1409, -3317, -3429, 511, 184, -794, 779, 149, -196, }; fldigi-4.1.06/src/soundcard/checkout.cxx0000644000175000017500000027476013472115777015121 00000000000000#define CHECKOUT_SIZE 11424 int int_audio_checkout[CHECKOUT_SIZE] = { -2, -1, 5, -258, -122, -154, -294, -219, -271, -234, -260, -243, -253, -249, -246, -260, -229, -289, -38, -58, -263, -266, -156, 10, 25, -134, -83, -21, -317, -165, -121, -112, -186, -287, -219, -276, -226, -270, -232, -265, -235, -262, -240, -256, -248, -245, -263, -223, -300, -78, -214, -160, -132, -45, -88, -125, 53, -34, 24, -17, 12, -8, 4, 0, -1, 2, -3, 4, -5, 6, -6, 3, 0, -3, 7, -12, 20, -39, 148, 67, 41, 296, 222, 268, 233, 275, 125, 127, 63, -66, 105, 107, 166, 278, 138, -72, 139, 89, 13, 285, 215, 43, -150, -248, 17, -11, 32, 301, 21, 85, 131, -32, 9, 1, -8, 8, 145, 62, -65, 99, 120, 5, -20, 26, -29, 28, -24, 18, -7, -15, -163, -115, -92, 34, -9, -11, 38, -204, -21, -361, -106, -444, 27, -929, 218, -2795, -171, 4311, -4495, 1126, 1644, -2751, 268, -2027, 2804, -872, -1618, 1728, -1493, -1131, -1936, 3635, -1361, -1380, -419, -3253, 5219, -2809, -2438, 3322, -2402, -628, 1133, -1437, -69, 550, -1577, 333, 38, -1317, -97, -136, -471, 40, -1008, 545, -768, -102, -1557, -4310, 5340, -1340, -3339, 4159, -3170, -175, 2002, -2386, 705, 730, -1397, 245, 870, -751, -385, 1125, 286, -2043, 2071, 1885, -4422, 3781, 39, -3190, 4409, -2744, 446, -338, 166, 1208, -2306, 1083, 1086, -1258, -1102, 3602, -4251, 2539, 26, -7065, 8304, -3004, -10612, 9143, -337, -4857, 5161, -3724, 573, 2304, -3527, 3708, 2296, -3069, -157, 38, 3539, -4162, -986, 1727, 1384, -1123, -2017, 2752, -324, -5502, 5511, 1650, -9192, 12584, -7326, -1704, 8610, -4484, 1308, 3413, -3318, 517, -1165, -4356, 14961, -8006, -1524, 5083, -13042, 6390, 1851, -4203, -1337, 2287, -2347, -42, 658, -3568, 6823, -8757, 5522, 4054, -9501, 5797, 4338, -9747, 5894, 1517, -5217, 3455, -1034, 1688, -5520, 8061, -4997, -608, 3061, -3766, 6377, -5458, -2953, 10207, -8512, -1090, 9148, -10271, 4762, 1225, -6817, 7993, -4667, -1512, 8032, -9284, 4364, 2400, -7243, 7624, -1223, -6397, 8641, -3416, -2869, 5475, -2791, 1736, -1656, -310, 6416, -10303, 6621, 5633, -14493, 12723, 72, -4105, 9333, -2986, 1115, 5807, -7445, 5179, 575, -3710, 6847, -4550, 834, 2583, 421, -2705, 1508, 5324, -8496, 1714, 12352, -16053, 8000, 1994, -7300, 8698, -8687, 8823, -8239, 4383, 6166, -12431, 8666, 413, -7168, 4484, 2886, -5014, 4604, -944, -6595, 9243, -3550, -5066, 5411, 1243, -4750, 4468, -3286, -7320, 23124, -23329, 12227, 17448, -26505, 25613, -5843, -16284, 20760, -6489, -11542, 19320, -12138, -2358, 15409, -19964, 8326, 7343, -15287, 13652, -5231, -10805, 16796, -6821, -6716, 11103, -9512, -1277, 14375, -14505, -2913, 10951, -3825, -7593, 9879, -4712, -6323, 15625, -16772, 13619, -300, -17095, 24445, -15638, -7647, 23657, -17787, -1049, 17515, -21120, 8510, 12493, -23727, 10250, 11994, -23413, 13750, 7083, -25561, 22862, -3109, -14125, 17173, -14526, 2791, 13345, -25442, 14916, 13032, -30109, 26373, -2302, -16135, 24645, -9372, -15417, 23603, -9891, -16787, 30440, -22114, 6850, 12562, -21726, 21696, -15706, 2367, 10770, -18794, 18212, -7891, -7698, 12892, -1867, -5171, -2535, 5019, 614, -1997, -9483, 15201, -9755, -4133, 16443, -18574, -487, 14889, -5214, -14003, 21165, -3558, -4722, -2460, 1769, 6277, -8853, -2249, 9280, -3658, -11380, 19151, -11722, -9877, 17417, -9048, -9552, 17915, -14217, 5404, -851, -1708, 7284, -12601, 15204, -8937, -4020, 13842, -9728, -78, 5431, -2160, 875, -11308, 15825, -10478, -4045, 18381, -23590, 13504, 1679, -9297, 6572, -7826, 13424, -11626, -1277, 16798, -16810, 7508, 4845, -6909, 3382, -1861, 5577, -8974, 4699, 7676, -18217, 8958, 8501, -13427, 3925, 3524, -4463, 3647, -2698, 973, -402, 4528, -4337, -431, 5666, -8707, 11928, -11587, 2673, 7653, -12050, 9801, -6826, 5732, -2133, -3331, 6723, -4119, 6266, -3201, -4417, 4198, 3350, -2585, -4151, -2024, 16363, -13523, -1819, 9386, -8661, 13445, -14085, 6890, 1945, -1697, 4312, -11511, 8810, 2887, -6693, 3130, 526, -1629, 2970, -3845, 2484, -1876, 117, 2670, -86, -4296, 5275, 1529, -7176, 3707, 833, -821, -2335, -23, 3758, -1520, -96, -666, 3610, 716, -3503, 1996, -3581, 1926, 600, -598, -4676, 9089, -5003, -3338, 4575, -869, 4416, -7755, 7447, 923, -2498, -1415, 3031, 4699, -6142, 6268, -2652, -1419, 10250, -8534, 3624, -3630, 6665, 1620, -10597, 8663, -85, 4577, -7970, 1860, 7912, -6832, 1087, 672, -1016, 2775, -4908, 4443, -5385, 7101, -1455, -8809, 14376, -7259, 4170, -3232, -40, 1691, 3069, 5512, -15918, 7173, 12540, -6108, -13814, 8278, 12616, -14639, 3809, 4063, -6496, 2129, 5156, -5296, -10679, 12796, 3844, -19565, 5700, 18274, -13348, -8499, 9664, 8431, -12771, 1510, 6040, -13188, 13201, 1355, -15269, 1201, 16068, -955, -21979, 11289, 15784, -13974, -1941, 5764, -2135, -1440, 1088, -1363, -2988, 7869, 2095, -13552, 4789, 12430, -8504, -6164, 4336, 2423, 86, -1537, -4564, 51, 7723, -2378, -7168, 2845, 4084, 1016, -7123, 4670, 4517, -4293, -23, -1261, 6322, -2195, -1265, 246, -2737, 7404, -473, -6627, 7623, 3153, -4988, 1147, -1097, 4386, -2425, -1603, 3742, -5772, 8715, -4476, -10095, 13211, -2929, -4968, -467, 2636, 3469, -8666, 2643, 5164, -6529, 381, 7649, -5958, -3209, 7426, 1722, -2763, -4122, 7175, 915, -12840, 8097, 4723, -8362, 368, 2851, 4408, -3947, 1031, 5252, -4494, 2729, 1915, -3636, 1223, 1298, 638, -2294, -2349, 4879, -2214, -3115, 6033, 1649, -3475, 3691, 3920, -4183, 5013, 6651, -1358, -491, 5929, 4324, -2416, -640, 4125, 232, -3997, 1982, -929, -2966, 1273, 409, -3783, 295, 3350, -137, -489, 851, 4182, 203, -1898, 2374, 2146, 1326, 1897, 1182, 3174, 1683, 1027, 629, -1130, 3525, -175, -3333, 259, -528, -590, -966, -3899, -1405, 205, -2994, -3742, -2429, -1469, -3880, -5717, -3834, -2679, -4964, -6916, -5979, -4062, -4230, -6618, -6869, -3430, -2010, -5250, -4999, -1990, -447, -1940, -1939, 32, -965, -1082, -2508, -2289, -1740, -2669, -5288, -4041, -1694, -3885, -3156, -2209, -529, -254, 736, 1856, 3882, 3775, 4660, 6175, 5318, 7206, 7742, 7525, 7914, 9728, 9845, 10547, 12391, 14410, 11765, 13669, 22130, 24146, 23609, 24040, 591, -2954, 29164, 7143, -31925, -13262, 3877, -16063, -31682, -25506, -7934, -18260, -25903, -12233, -7513, 896, 3395, -1773, 4260, 15104, 15915, 4791, -749, 9848, 6441, -10303, -13311, -10291, -12940, -19941, -26613, -22012, -16198, -19514, -21870, -17629, -7499, -4386, -10288, -6762, 1530, 2487, -2427, -5423, -1916, -1314, -7969, -12069, -10367, -9915, -11571, -13621, -12632, -9973, -7865, -6674, -5255, -2049, 1300, 2514, 1125, 3374, 5554, 5896, 4458, 3035, 4578, 3338, 2775, 1921, 1083, 3381, 4909, 4355, 7651, 7962, 11537, 11780, 11473, 12866, 18510, 20337, 17759, 18547, 25035, 28574, 27427, 13741, -32000, 9886, 29840, -28056, -30969, 38, 2414, -25315, -31906, -4779, 9171, -14170, -2558, 5461, 9632, 22947, 14452, 4129, 6642, 17383, 14208, -12687, -17740, -112, -9447, -23855, -27194, -17103, -10521, -16445, -16695, -7909, 548, 6528, 3129, 1607, 10203, 12650, 4854, -1298, -348, -473, -8526, -14747, -14179, -15487, -15991, -16439, -17793, -13584, -7416, -5733, -5278, -1072, 3920, 3791, 2786, 3838, 2372, -718, -2503, -5609, -7034, -6637, -8437, -8439, -5367, -2791, -1343, -159, 4803, 9471, 6876, 8667, 14314, 12871, 8965, 9786, 12813, 7299, 1290, 6162, 9293, 847, 1510, 9563, 7530, 3791, 6738, 9424, 10349, 12938, 17532, 20949, 17277, 20068, 1787, -12369, 12917, 6541, -24211, -20262, -4090, -5653, -17621, -16025, -228, 2809, 3008, 8003, 6653, 9965, 15703, 10062, 516, -778, 3472, -1810, -14147, -16334, -11082, -10397, -12995, -12531, -6780, -1114, 1336, 3754, 3867, 6041, 8823, 5257, -1341, -2133, -1697, -7351, -10648, -9851, -10534, -12377, -10430, -8694, -8150, -4660, -907, 460, -411, 1187, 3220, 1058, -2839, -1997, -1710, -5703, -7734, -8051, -7759, -7914, -5745, -5421, -4508, 248, 5270, 6462, 6541, 9288, 10799, 11367, 9308, 8353, 8940, 6607, 4166, 3800, 2022, 1188, 916, 1557, 5236, 6300, 5586, 7347, 9268, 11416, 9625, 7821, 10164, 12903, 14884, 16150, 14689, 15947, 9157, -14005, -8892, 7894, -4847, -24261, -16919, 606, -2034, -7098, -1183, 6271, 10173, 14868, 10825, 3343, 6153, 8549, 59, -11826, -10981, -6681, -9892, -14083, -12667, -7056, -924, 2382, 686, 3357, 8083, 8616, 4379, -868, -1429, -1336, -5116, -9538, -10621, -10001, -7698, -4743, -4728, -4563, 368, 3490, 764, -2167, -1167, -1960, -4154, -5983, -7634, -7260, -7020, -6785, -6559, -2643, -1471, -991, 502, -321, -327, 1277, 157, -1045, 2206, 3816, 1815, 1642, 6110, 7398, 6903, 7567, 8157, 6691, 9899, 7739, 2380, 3622, 8107, 6045, 113, 5500, 7903, 2977, 4004, 8371, 7821, 9109, 11999, 14080, 22062, 25951, 22051, 6333, -25751, -4480, 15168, -19132, -31681, -12603, 3768, -3453, -170, 6125, 9043, 21013, 24151, 8574, -4349, 3536, 4249, -13147, -22770, -17129, -10862, -8204, -6155, -5205, 589, 13178, 12670, 4451, 6119, 7977, 948, -8168, -10448, -11895, -13055, -11225, -9553, -6255, -2756, 1079, 2216, 6215, 9003, 5367, -2083, -6121, -5025, -9669, -15841, -16575, -12393, -7456, -4040, -3573, -558, 4494, 5363, 1908, -1392, -3058, -3382, -7066, -9255, -7269, -2356, 405, 1104, 4524, 6989, 7650, 8423, 7451, 2766, 1029, 3024, 3464, 3406, 3891, -208, 2372, 6811, 7936, 2695, 10227, 15055, 7176, 7875, 15221, 16637, 8822, 15033, 27260, 24658, 11864, -24929, -28161, 26071, 620, -32000, -13507, 9028, 10855, 9917, 12368, -1013, 11242, 29358, 5626, -24767, -14217, -640, -9068, -19735, -14633, -5776, 6958, 15458, 4558, -3187, 9689, 15828, -2519, -20986, -19852, -7946, -4704, -9832, -14258, -6933, 9375, 15338, 3835, -1875, 5741, 9003, -3099, -16692, -20752, -10248, -2340, -8591, -14008, -6823, 6402, 7255, -673, -7333, -4816, 167, -5731, -15051, -12630, -5346, -2280, -4333, -6550, -3604, 5571, 7867, -2125, -7042, 330, 4351, -2362, -7992, -4592, -502, 1658, 2902, 2506, 7952, 15164, 15363, 7663, 10059, 13147, 10673, 3518, 1537, 3454, 5919, 4708, 9740, 16157, 15308, 23625, 29031, 31581, 17213, -28237, -25068, 26960, -6475, -32000, -20223, 3365, 13161, 17238, 17653, -4131, 18449, 30978, 5720, -26340, -19919, -5353, -14461, -20583, -19546, -8716, 11575, 22817, 8875, -521, 12142, 18127, -7583, -21699, -21465, -17613, -9081, -8205, -11171, -6967, 11295, 16108, 5115, -250, 3669, 3370, -7834, -16987, -19292, -14914, -5265, -516, -5079, -3455, 5543, 6061, -964, -5435, -7015, -8261, -9371, -12098, -11395, -6934, -1848, 289, -2056, 774, 4856, 3031, -732, -3438, -4580, -2732, -1025, -3504, -5041, -3119, 2689, 2862, 3425, 8470, 13110, 14006, 9881, 9574, 7955, 13643, 12792, 6319, 4226, 10421, 16658, 9223, 11566, 21711, 21996, 26038, 31998, 8916, -29107, -22860, 15186, -6862, -31997, -18771, 2735, 12487, 14918, 14996, -669, 13110, 25573, 6872, -21236, -20925, -8381, -11925, -16310, -16250, -9756, 5786, 15533, 8323, -2068, 1609, 6360, -6506, -10812, -17116, -18389, -9779, -4188, -8278, -10006, 1110, 4983, 954, -2738, -1008, -2611, -6630, -11080, -14098, -11639, -4848, -942, -5244, -5911, 860, 2083, -2544, -5962, -7064, -7032, -6192, -5189, -7746, -7872, -3139, -1312, -2733, -2740, 1269, 1343, -625, -2564, -3107, 193, 968, -757, -1165, 461, 1353, 2349, 5341, 4798, 4961, 11195, 9126, 9348, 16221, 16306, 10018, 15442, 16009, 12778, 21943, 19711, 12277, 17011, 26395, 21983, 12084, 3192, -13800, -20401, -1028, -1699, -19948, -16389, 4106, 10697, 3515, 5741, 7817, 8657, 9176, 4185, -8412, -13464, -7458, -7023, -14532, -15380, -4900, 1101, -2455, -1978, -4779, -3723, 3475, -1408, -10202, -11436, -5727, -6054, -10091, -10810, -9133, -7094, -3853, -5117, -9349, -8200, -4482, -6166, -10251, -7225, -2824, -3779, -6768, -5279, -5292, -5034, -3404, -6023, -8248, -6072, -2935, -3390, -4139, -1575, 328, -531, -464, 64, -1885, -2860, -827, -1045, -1843, -458, 1888, 4041, 3694, 3937, 4799, 6444, 7197, 5884, 7291, 9666, 11277, 7283, 6889, 11737, 11673, 11570, 11066, 12410, 18667, 20346, 22833, 23363, 19524, 17889, 15142, 10486, -249, -5754, -7098, -9523, -10710, -8804, -7082, -6437, -787, 3490, 2974, 2618, 4736, 4602, 771, -1717, -3274, -6988, -8081, -7451, -9526, -10724, -10398, -9670, -7492, -6363, -6293, -7184, -5254, -3411, -5135, -8354, -7483, -4768, -7308, -10522, -10021, -8560, -10230, -12056, -10507, -6689, -5895, -6076, -4740, -2488, -2782, -3392, -3153, -4836, -5671, -6134, -7058, -8019, -7563, -6229, -3890, -2871, -957, 462, 2124, 3493, 1947, -41, 853, 3708, 2624, -659, 484, 3922, 4749, 4914, 3857, 6985, 8040, 8409, 8354, 9398, 7964, 9971, 12120, 7907, 5296, 9660, 14207, 5540, 2707, 9214, 16475, 9344, 4652, 10232, 19730, 15421, 7912, 11501, 19898, 17945, 2296, 1750, 7580, 6607, -7900, -10464, -4676, -3235, -9285, -10398, -5834, -3759, -3734, -4017, -2243, -2045, -24, -2171, -4616, -7028, -4375, -5652, -8827, -11231, -8183, -6181, -8113, -8744, -7611, -3916, -4187, -5373, -6847, -5116, -5715, -7692, -9088, -7573, -5622, -6781, -7721, -5003, -2573, -3276, -3383, -1858, -1112, -1454, -779, -1865, -2336, -1482, 117, -939, -877, 1916, 3121, 2658, 3545, 4482, 3259, 4944, 4708, 3971, 4817, 4829, 4931, 4601, 4362, 4620, 5696, 5332, 3732, 2940, 3981, 4231, 2567, 1604, 2501, 2317, 645, 784, 2347, 2936, 2258, 1465, 1027, 1354, 1132, 1518, 92, -812, 1370, 1720, 291, -541, 938, 1336, 491, 583, 920, 785, 345, 237, 305, 534, 486, 439, 308, 706, 779, 90, -263, 150, -849, -2025, -2024, -2388, -2881, -3323, -3224, -3148, -2524, -2949, -3322, -2653, -2182, -2524, -3242, -3395, -3304, -3365, -4213, -4460, -4541, -4280, -4195, -3916, -3948, -3933, -3549, -3895, -3395, -3305, -3731, -3794, -3646, -3647, -3562, -3516, -3345, -3246, -2804, -2458, -2476, -2211, -2427, -2294, -2083, -2207, -2630, -2628, -2114, -1747, -1546, -1555, -1686, -1122, -916, -1649, -2032, -1866, -1548, -1447, -1810, -1834, -1233, -962, -773, -737, -758, -750, -621, -426, -661, -563, -245, -144, 90, 133, 121, 354, 382, 373, 332, 55, 227, 169, -46, 68, 256, 416, 232, -91, 137, 384, 253, 405, -179, -53, 286, 222, 64, -54, 203, 3, 11, -22, -314, -562, -375, 408, 334, 259, 577, 422, 646, 710, 625, 602, 520, 410, 256, 24, 19, -169, -40, 25, -201, -534, -362, 19, -189, -434, -582, -542, -631, -553, -463, -125, -246, 62, 77, 56, 345, 126, -133, -73, 445, 293, -255, -132, 233, 262, 100, -257, -242, -246, -307, -529, -677, -796, -698, -612, -704, -983, -283, 203, -97, 143, 250, 487, 507, 326, 145, 109, 125, -249, -519, -15, -81, -521, -57, 267, 289, 503, 513, 177, 96, 485, 153, 100, 135, -298, -175, 112, 257, 65, 251, 238, 504, 385, 230, 514, 485, 514, 483, 521, 464, 634, 614, 646, 485, 508, 490, 515, 447, 216, 453, 517, 484, 518, 468, 698, 963, 603, 457, 609, 626, 446, 544, 443, 352, 490, 532, 386, 382, 541, 473, 521, 477, 530, 436, 348, 515, 514, 376, 398, 546, 468, 333, 561, 822, 656, 502, 657, 540, 467, 330, 114, -7, 5, -96, -336, -50, 276, 462, 511, 497, 497, 506, 491, 509, 490, 288, 225, 275, 221, 282, 207, 362, 510, 500, 501, 340, 457, 539, 422, -22, 162, 286, 221, 274, 227, 271, 415, 258, 252, 194, 76, 325, 178, 444, 490, 519, 476, 525, 472, 533, 414, 94, 133, 125, 109, -69, 179, 38, 66, 298, 414, 242, 266, 212, 416, 465, 334, 515, 324, 395, 389, 553, 461, 531, 469, 536, 424, 247, 235, -15, 141, 89, -149, -89, 34, -28, 43, 220, 413, 519, 493, 499, 507, 484, 531, 394, 251, 184, 107, 108, -46, 31, 146, 100, 278, 19, 416, 319, 228, 263, 53, 281, -62, -142, -118, 29, -33, 157, 270, 245, 243, 268, 215, 319, 381, 275, 374, 412, 287, 91, 120, 1, -104, -112, 24, 0, -14, 34, -152, -254, 97, 277, 248, 145, 140, 528, 7, 85, 119, 159, 226, 55, 338, 173, 324, 172, 333, 158, 359, 33, 73, -156, -74, -3, 13, -11, 5, 0, 0, -62, -67, 684, 212, 270, 15, 703, -739, 686, -2102, -910, -3050, -7506, 4897, 5405, -6833, -2067, 6493, -2903, -4200, 4362, 2107, -3913, 0, 2741, -949, -2765, 485, 1378, -1852, -1851, 850, 548, -1098, -384, 721, -432, -28, 72, 1193, 1130, 1007, 1651, -3007, -5893, -3941, 7178, 3484, 3354, -4968, -9888, 9678, -2081, -19394, 6485, 12436, -17638, -165, 16802, -5873, -1492, 12820, -16461, -13779, 20416, -28, -21296, -243, 5082, -12290, -2908, 8267, -5705, -7818, 5638, -3318, -13840, 3238, 5405, -3996, 2833, 6230, 2431, 4827, 753, -4806, 3089, 1686, -2859, 2454, 333, -7019, -425, -361, -5635, 1380, 2651, -2208, 2416, 3788, 24, 750, 2707, 3454, 1101, 1038, 2291, 1095, -4066, -1335, 239, -3798, -2409, 597, -725, -1077, 1806, 1469, 936, 1705, 2910, 1753, 1021, 2050, 1736, 445, 976, 1945, -1291, -555, 916, -1083, -1373, -54, -710, -2142, 166, -597, -887, 93, -345, -679, 277, 213, -179, -183, -791, -741, -144, -882, -1276, -659, -979, -1666, -824, -519, -2271, 339, -913, -1797, 1600, 1522, -55, 3275, 3938, 2041, 4525, 4492, 4689, 5906, 6218, 6680, 8408, 7402, 8857, 11827, 10653, 12336, 13707, 13982, 14611, 15942, 14507, 18433, 19889, 18267, 20781, 19409, 16803, 10771, 14063, 8350, 1331, -625, -3067, -6874, -12464, -13414, -16774, -14464, -18063, -16475, -13738, -11133, -10321, -7984, -2570, -958, 2877, 2251, 4602, 5623, 5750, 2768, 1812, 1208, -2964, -7062, -12116, -13400, -15318, -18981, -23113, -21145, -19071, -21080, -20012, -15914, -11633, -11125, -9475, -4639, -1223, -1650, -1074, 1901, 2064, 151, -1519, -806, -1267, -3147, -3355, -1890, -176, 1191, 3412, 6169, 11583, 14859, 17911, 22024, 27207, 29478, 29909, 29603, 29902, 29561, 30083, 27535, 17771, 17203, 6990, -2528, -8193, -14132, -20756, -25227, -26023, -27291, -22754, -22535, -15937, -11259, -3124, 1149, 6726, 12779, 15347, 18532, 17553, 16979, 13500, 10685, 1766, -1121, -9646, -14173, -18805, -25118, -26686, -25660, -24122, -25938, -18751, -14347, -9947, -8622, -2083, -229, 507, 1574, 516, 1, -2518, -4868, -9056, -9525, -13631, -16361, -17985, -15946, -16441, -15823, -11707, -8615, -5537, -2687, 399, 2112, 6313, 6176, 6583, 8259, 10399, 9520, 8644, 12648, 13695, 13447, 14139, 20736, 21632, 23889, 28220, 30915, 26468, 23229, 25623, 17884, 8625, 162, -2936, -10030, -16615, -23431, -22871, -20511, -21017, -19825, -13363, -3940, -1271, 3803, 8517, 15095, 15271, 14965, 12916, 11230, 7107, -573, -7700, -11525, -12715, -22260, -24339, -21088, -21518, -20209, -14427, -11226, -5747, 800, 2717, 4831, 8432, 8569, 4707, 2441, 893, -5888, -12043, -11855, -16354, -21553, -21526, -19551, -19098, -17577, -14105, -10196, -7199, -4862, -3714, -2135, 182, -956, -3157, -1641, -1803, -4571, -4580, -770, 231, 2449, 4825, 8856, 16249, 20636, 20913, 25597, 30407, 29100, 30468, 28892, 30849, 26223, 22854, -419, -34, 6462, -22098, -32000, -19569, -16883, -31829, -23733, -11033, 119, 1959, 9484, 15170, 25096, 27952, 15763, 11794, 14174, 9050, -9422, -16661, -18014, -18683, -28520, -29250, -21388, -14079, -12921, -7811, 952, 9277, 14225, 10750, 13655, 17250, 11364, 352, -1324, -5791, -12668, -19516, -23665, -22270, -19128, -19073, -18620, -11032, -4797, -4356, -3568, 1489, 1253, -2190, -5154, -7068, -9791, -12283, -15866, -16167, -13451, -11444, -11300, -7161, -529, 3506, 6800, 10878, 15344, 19428, 22210, 18867, 22607, 28471, 24272, 21112, 27689, 28661, 30955, 25409, 15005, -5574, -4587, 12072, -12956, -32000, -15066, -975, -18887, -20261, -3948, 8645, 10666, 9822, 11631, 17999, 23213, 10257, -2098, 1163, 3577, -9889, -19510, -17400, -11895, -12849, -15123, -11680, -1853, 4334, 2863, 1872, 8479, 10159, 4423, -1333, -1900, -2737, -8837, -13365, -13833, -11201, -10336, -8315, -6354, -2380, 533, 3082, 1767, -950, -911, -3375, -10584, -12955, -11945, -16913, -20101, -16533, -13860, -13988, -10297, -6776, -3125, 88, 3242, 3153, 3884, 6255, 7300, 5471, 4678, 8450, 9808, 9361, 10793, 16470, 20443, 23164, 28020, 30302, 29181, 30605, 22107, 16365, 8203, -12544, -12482, -13117, -28059, -27024, -13961, -8871, -6179, 4373, 16752, 21782, 24948, 24708, 16762, 12213, 5752, -7733, -18134, -19790, -20352, -23883, -21617, -12325, -5442, 866, 8749, 11484, 13334, 15562, 10889, -1004, -3172, -2133, -11970, -21216, -17797, -12569, -12196, -9624, -4144, 3362, 9519, 10480, 6721, 5630, 3800, -2685, -12876, -18613, -20478, -21785, -22198, -19996, -15649, -8963, -3466, -2171, -356, 3047, 3962, 734, -320, 485, -775, -3206, -1727, -510, 1980, 7727, 9665, 12071, 16964, 18864, 27976, 30108, 29584, 29858, 29680, 28924, 12962, -272, -12474, -18299, -16923, -21180, -25080, -12867, 2503, 7021, 10789, 19249, 25372, 23667, 16512, 6018, -3066, -9874, -16300, -24487, -23907, -16481, -9275, -4776, 2133, 9827, 13878, 14422, 10298, 3536, -1618, -6819, -18884, -19032, -13277, -16158, -13897, -3848, 1241, 2853, 7688, 7678, 4845, 4878, 2642, -3964, -9046, -12609, -16582, -14143, -12704, -17648, -14349, -7142, -6508, -7295, -5021, -5046, -6499, -5738, -7933, -8682, -6128, -4211, -4048, -3410, 2105, 3290, 3467, 5599, 6625, 9457, 13723, 15332, 11806, 17253, 24609, 27536, 30014, 29595, 29425, 19748, 7109, -8600, -25220, -13317, -9962, -23803, -17822, 2141, 12326, 11720, 17716, 17975, 16791, 15399, 5330, -11790, -18416, -13964, -18087, -20998, -12723, -1605, 5105, 10476, 13023, 10389, 8916, 7201, -2602, -13330, -13364, -16871, -21388, -8830, -1756, -4969, -112, 10240, 7591, 2234, 3050, -1604, -7907, -7677, -7980, -12037, -10601, -7136, -4830, -3696, -3646, -9155, -9274, -8376, -11154, -12405, -11746, -9796, -7211, -3571, -3316, -3203, -1208, 381, -1798, -2793, -207, 1279, 2296, 4467, 6613, 11193, 13641, 19181, 18215, 22845, 29907, 29767, 29463, 30364, 16767, -4524, -9799, -27802, -22807, -12625, -17730, -13457, 6032, 20365, 17144, 21397, 19605, 12453, 5731, -1310, -17993, -26598, -20670, -16985, -13408, -3804, 7723, 11857, 16434, 16816, 9122, 36, -4950, -12023, -19287, -18722, -20059, -12423, -1102, 4885, 5788, 6751, 9569, 4181, -1146, -8110, -11559, -13846, -13247, -10506, -6758, -1162, 1396, 3675, 2043, -2313, -7684, -11864, -16932, -18410, -13600, -11059, -9333, -4114, 47, -665, -2289, -3219, -5249, -3701, -2040, -327, 1441, 5246, 7044, 11732, 13231, 13850, 15379, 19888, 28559, 29642, 30031, 29316, 29585, 11356, -39, -21493, -32000, -13878, -6480, -11244, -8654, 15750, 20094, 26025, 26170, 10033, -2158, -2311, -7278, -25184, -27846, -21764, -11997, 729, 12905, 13143, 12340, 16617, 13260, -245, -11208, -19145, -26055, -17873, -19450, -12699, 4567, 10318, 10071, 8667, 8071, -2035, -4700, -9606, -18478, -18810, -11153, -6885, -3830, 3055, 2264, 550, 3533, -1243, -12905, -18458, -19694, -18078, -12672, -8665, -9060, -5596, -126, 320, -2299, -4087, -6539, -5437, -602, 1739, 240, 3455, 7977, 12651, 14275, 14447, 17041, 20313, 26810, 30347, 29260, 30355, 27443, 12497, -6389, -29763, -27310, -11775, -3209, -5356, 2531, 19430, 20699, 30892, 22750, 509, -13570, -11816, -16100, -24157, -19881, -18172, -4325, 13066, 22168, 16114, 10041, 5954, -2775, -8623, -15080, -23722, -24372, -13019, -8553, 3462, 13875, 10237, 6687, 4569, 258, -8586, -10427, -15657, -17868, -9886, -2684, -582, 548, 3508, 1157, 1592, -456, -9733, -19854, -21571, -14047, -9386, -6864, -6993, -7354, -3656, 1155, -102, -5832, -8052, -6297, -1329, 3450, 4983, 3653, 4796, 9545, 15138, 16428, 15978, 17661, 22999, 29721, 29400, 30127, 29392, 21432, -1967, -28522, -29707, -17752, -4327, 1199, 7248, 13830, 15979, 29511, 27001, 5211, -13791, -20212, -22359, -18334, -11251, -15941, -8196, 8897, 21623, 21309, 14737, 2067, -10704, -14028, -14739, -17057, -18466, -15382, -13506, 4852, 16172, 12806, 6267, -1189, -5611, -7972, -7151, -14612, -17636, -12099, -2780, 3248, 5909, 2263, -5184, -3520, -1175, -7630, -18044, -20820, -17397, -10411, -3281, -4161, -8929, -7745, -1720, 256, -799, -4930, -9182, -4638, 2584, 5640, 5725, 5765, 8396, 14917, 17638, 18427, 16899, 22046, 29056, 29583, 30044, 29364, 26463, -3048, -32000, -27018, -18125, -5738, 10004, 13074, 9502, 9065, 28609, 26402, 7500, -9699, -26375, -30473, -18666, -2658, -7388, -3752, 5618, 12780, 19883, 20934, 4327, -16170, -21719, -19836, -14335, -9380, -14370, -10958, 4036, 11910, 15383, 9041, -4301, -13354, -10308, -10099, -10860, -10466, -11318, -7053, 498, 4855, 1907, -2891, -6002, -9153, -10723, -13099, -14553, -14831, -11602, -6519, -5023, -4212, -4260, -4064, -4662, -3564, -3218, -2756, -1959, 1588, 4294, 8153, 10194, 12741, 13934, 15726, 20425, 24286, 29018, 30001, 29623, 29804, 28359, -694, -31449, -28487, -25185, -4251, 17084, 17355, 9091, 2212, 28556, 23875, 15040, -2496, -27472, -30881, -23974, -2850, -1921, 6192, 5353, 5137, 14535, 21366, 10553, -10164, -21799, -29164, -21267, -10707, -7466, -2477, 2988, 6126, 10773, 11571, 3610, -6488, -11310, -15766, -14038, -9993, -7877, -7562, -4234, -390, 1438, 3181, 62, -5618, -11609, -13690, -14489, -12246, -9244, -8673, -7959, -6649, -2393, -1561, -836, -1254, -2076, -1549, 1444, 3999, 5693, 10554, 12525, 14864, 19953, 24268, 27996, 29109, 29662, 29970, 29391, 28631, -6350, -31997, -28626, -25901, -776, 20530, 24620, 6040, 2846, 22163, 16500, 18737, 4785, -23141, -31542, -25050, -12207, -1233, 14226, 10553, 2959, 9593, 18005, 11811, -59, -12642, -29536, -27761, -20352, -12873, 3264, 7076, 5297, 5461, 8688, 4215, 477, -2034, -14384, -18510, -16233, -10848, -8542, -973, -1815, -4828, -2717, -942, 208, -2840, -6871, -15194, -16467, -12599, -8189, -4583, -2935, -4757, -5959, -1748, 1586, 2941, 3950, 2292, 1891, 5736, 12633, 17867, 21865, 24679, 28305, 29890, 29801, 29516, 30253, 13000, -24391, -30327, -30578, -21978, 8328, 23893, 19322, 6764, 11649, 15357, 17898, 21072, 1178, -24649, -30576, -28872, -20234, -740, 12463, 9401, 7570, 12410, 14793, 12935, 7284, -8165, -26266, -28341, -29918, -15838, -1304, 5768, 5488, 4100, 6158, 2718, 7568, 1913, -8953, -18686, -20992, -19168, -11827, -2425, -2559, -4407, -5303, -2893, -309, 2533, -974, -9964, -13913, -15127, -11986, -5397, -2555, -4082, -3505, -1730, -398, 4955, 7541, 6648, 8102, 11782, 14063, 21173, 26188, 28828, 29726, 29796, 29748, 28064, 5413, -28071, -29842, -30498, -18008, 4894, 17033, 15063, 7166, 13851, 16038, 21323, 20416, 4802, -18117, -30495, -29787, -26597, -8631, 4826, 6923, 8557, 9841, 12567, 12811, 12833, 1245, -15587, -27166, -30088, -19819, -7227, 3429, 5526, 2441, -805, 2399, 7633, 4789, -326, -11478, -20916, -20750, -15892, -10055, -7086, -4750, -6671, -4554, 76, 1351, 1949, -1282, -6699, -10548, -10401, -10202, -6781, -2876, -2199, -772, 2531, 6811, 11679, 18984, 22075, 22336, 23328, 25556, 28186, 28912, 30993, 19757, -875, -23729, -31507, -27517, -13184, 6071, 8668, 11366, 4396, 7238, 16893, 24050, 24776, 10608, -7138, -25830, -30124, -24593, -14198, -4141, -1409, -699, 1913, 7260, 15009, 16988, 14359, 1165, -11575, -23411, -27119, -16147, -9169, -1806, -1933, -1946, -3076, 2625, 8564, 6541, 4585, -7729, -14746, -17521, -15615, -12610, -10407, -7992, -10468, -6574, -3533, -682, 2430, 2480, 511, -2727, -2806, -3424, -798, 2236, 3769, 7615, 10569, 15934, 21826, 28712, 29939, 29687, 29578, 18871, 1104, -19538, -29752, -26572, -17385, -10794, -3945, -524, -208, 7643, 18257, 25375, 26750, 21209, 6984, -8263, -15627, -19147, -19142, -14973, -13485, -12748, -8873, -2281, 4677, 12066, 15918, 12869, 6764, -947, -6468, -10297, -15759, -12179, -12178, -12850, -9308, -7768, -3424, -1053, 4512, 2186, 338, -2073, -7079, -7236, -9585, -9807, -11899, -11824, -10711, -9992, -6349, -5156, -2500, -30, 2716, 6697, 9499, 13701, 14908, 15940, 15588, 16597, 20315, 25470, 27134, 20022, 11886, -4200, -16476, -17440, -16194, -11513, -7700, -5414, -7195, -5308, 3401, 10500, 18782, 22860, 18488, 9354, 44, -6000, -10847, -10496, -9416, -12246, -14243, -14332, -11547, -4856, 4710, 11647, 12602, 10125, 5753, -329, -3938, -2731, -4026, -9052, -8841, -12460, -15944, -10544, -7004, -3551, 76, 2397, 877, -2536, -1209, -2973, -4299, -2349, -5060, -7684, -8706, -8718, -7779, -5079, -1334, 22, 889, 3686, 6471, 9931, 15227, 19302, 21333, 22717, 22304, 18389, 13066, 6210, -3212, -10649, -12560, -14421, -13587, -9607, -7209, -5892, -2862, 1739, 5957, 10767, 14527, 14917, 10781, 6252, 2436, -1568, -3297, -3319, -5955, -9489, -11993, -13404, -12496, -8572, -2682, 1101, 2974, 4101, 3967, 2666, 3566, 4836, 3034, 712, -1946, -6550, -9703, -10459, -10052, -8125, -6304, -5152, -4331, -3448, -2115, -916, -430, -9, 36, -1109, -2319, -2893, -3689, -4027, -3779, -2791, -1170, 324, 1469, 3720, 6221, 7584, 10511, 14059, 16469, 18432, 18341, 16161, 12644, 5744, -992, -3758, -5076, -6930, -8349, -9669, -11127, -11109, -8759, -3701, 2064, 5897, 7418, 7483, 7102, 6366, 5937, 5781, 5005, 3582, 763, -2363, -3989, -4163, -3599, -3140, -3101, -4173, -5254, -5016, -4433, -2719, -1195, -448, 152, 716, 883, 701, 846, 1235, 1708, 1914, 1572, 155, -1319, -2680, -3259, -3109, -2500, -1384, -1267, -2268, -3290, -3774, -2735, -1787, -1508, -2178, -3448, -3731, -3103, -1967, -791, -306, -747, -639, -160, 680, 1561, 2318, 1979, 1524, 1459, 1797, 2329, 3345, 3828, 3750, 4076, 3944, 4398, 4464, 4565, 4274, 3462, 1848, 407, -633, -1785, -2789, -3282, -3225, -3429, -3864, -3863, -3530, -3027, -2864, -3291, -3204, -3628, -3864, -3893, -3242, -3002, -2831, -2222, -1776, -851, -13, 721, 1178, 1209, 755, 775, 722, 789, 997, 991, 1036, 789, 428, 252, -176, -468, -834, -1312, -1852, -2375, -2527, -2190, -1843, -1715, -1462, -1697, -1692, -1599, -1620, -1388, -1235, -1276, -1148, -835, -151, 364, 952, 1921, 3041, 3706, 4693, 5512, 5760, 6163, 5920, 5482, 4667, 4160, 3664, 3249, 2526, 1843, 973, 511, 212, -86, 8, -895, -1320, -2105, -2615, -2632, -2734, -2585, -2734, -2945, -3332, -3422, -2719, -2114, -1170, -233, 61, -247, -115, 432, 976, 1662, 1736, 1511, 962, 694, 506, 505, 481, 544, 133, -316, -640, -758, -82, 463, 480, 609, 780, 463, 658, 559, 505, 83, -951, -1573, -2200, -2747, -2758, -2718, -2492, -2380, -1828, -1220, -908, -625, -496, -526, -769, -739, -747, -846, -1248, -1174, -962, -833, -532, -179, -57, 50, 83, -35, 138, 159, 378, 690, 1350, 1936, 2179, 2359, 2642, 2844, 2965, 3202, 2989, 3042, 2532, 2234, 2248, 2264, 2154, 1611, 1367, 689, 200, -353, -672, -1330, -1889, -2391, -2583, -2919, -2986, -2733, -2598, -1934, -1655, -1040, -747, -623, -198, -4, 17, -61, -281, -55, -250, -250, -244, -265, -74, 68, 394, 535, 472, 525, 475, 524, 458, 20, -110, -562, -616, -809, -812, -833, -882, -958, -892, -897, -1063, -952, -1013, -557, -376, -628, -626, -612, -717, -799, -596, -425, -1101, -1096, -1179, -1204, -1022, -771, -605, -497, -208, -120, 338, 228, 576, 423, 46, -25, -356, -351, -687, -747, -866, -864, -964, -901, -472, -542, -316, -195, 36, -53, -151, -110, -328, -557, -988, -1247, -1688, -1890, -1876, -1982, -2044, -1861, -1754, -1428, -1254, -1043, -1751, -2351, -1732, -1228, -384, -1672, -3097, -3348, -2010, 732, 2223, 2480, 1782, 2207, 3636, 5189, 6562, 6582, 5694, 4637, 4714, 4970, 4341, 2907, 993, -438, -1157, -1605, -2875, -4068, -5158, -5208, -4543, -3842, -3731, -3765, -3352, -2068, -695, -147, 254, 437, 1359, 1932, 2190, 2356, 2520, 2487, 2524, 2149, 1837, 1338, 821, 233, -667, -1250, -1649, -1786, -2296, -2675, -2749, -2389, -2079, -1646, -1124, -393, 114, 394, 544, 932, 1345, 1432, 1535, 1838, 1756, 1386, 1395, 968, 581, 403, 156, -295, -543, -1887, -3036, -3349, -3876, -3827, -4163, -3847, -3420, -3565, -3668, -3831, -3321, -2953, -2460, -1516, -494, -218, -277, -126, 39, 294, 666, 1649, 2592, 3403, 3812, 4742, 6017, 7185, 8291, 9223, 9560, 9290, 8942, 8077, 7035, 5325, 3794, 2154, 530, -1010, -2714, -3532, -4460, -5486, -5649, -5364, -4911, -4163, -2974, -1790, -516, 805, 1797, 2590, 3241, 3775, 3975, 4027, 3735, 3041, 2387, 1313, 293, -293, -1325, -1894, -2542, -3105, -3465, -3740, -3756, -3750, -3696, -3311, -2750, -2008, -1195, -585, -101, 57, 555, 152, -1, -212, -409, -456, -1083, -1533, -2071, -2754, -3595, -4240, -4912, -5419, -5781, -5561, -5300, -4799, -3887, -3091, -2228, -1225, -303, 828, 2143, 3411, 4517, 5515, 6775, 7862, 8888, 9895, 11087, 11774, 11656, 10841, 9818, 8828, 6765, 5037, 3372, 1448, -1166, -3285, -4033, -5630, -6556, -5856, -5208, -5086, -3978, -2882, -2306, -1766, -339, 609, 880, 2201, 2889, 2280, 2291, 2404, 1059, -140, -615, -1386, -2818, -3268, -3535, -4106, -4632, -4761, -4868, -5019, -4318, -3800, -3500, -3117, -2816, -2719, -2683, -2156, -2214, -2519, -2765, -3105, -3506, -3962, -4255, -5021, -5233, -5421, -5515, -5511, -5128, -4592, -3941, -3252, -2456, -1585, -661, 395, 1640, 3308, 4648, 6234, 7413, 8645, 9840, 10949, 11730, 12734, 13637, 13771, 13678, 12934, 11169, 8632, 5229, 2256, -233, -3058, -3814, -3557, -3794, -4739, -5265, -5970, -6144, -4673, -3221, -2099, -995, 256, 817, 1332, 1714, 1459, 1239, 1052, 346, -302, -1271, -1772, -2051, -2891, -2830, -3133, -3680, -4192, -4479, -4500, -4652, -4276, -3694, -3262, -3250, -3248, -3256, -3230, -3450, -4055, -4403, -4710, -4843, -5032, -4974, -5102, -5475, -5491, -5521, -5260, -4850, -4067, -3317, -2512, -1137, 18, 650, 1925, 2994, 3773, 4931, 6282, 7623, 8555, 9647, 10262, 11265, 12004, 13014, 14144, 15044, 15127, 15036, 14331, 11532, 8008, 3934, 702, -2619, -4593, -5214, -5708, -6274, -6524, -6238, -6258, -6033, -5151, -3759, -2596, -1285, 332, 1134, 1844, 2201, 2015, 1680, 600, -248, -1343, -2498, -3473, -4106, -4580, -4971, -5531, -5778, -6109, -6323, -6192, -6289, -5750, -5135, -4330, -4004, -3414, -3460, -3517, -3538, -4186, -4224, -4904, -5266, -5492, -6118, -6285, -6178, -6012, -5788, -5152, -4286, -3679, -3099, -2194, -1153, -629, 99, 993, 1835, 2908, 3454, 4299, 5396, 6395, 7086, 7829, 8768, 9600, 11224, 12513, 14301, 16337, 17862, 18725, 18795, 17904, 15100, 10792, 6041, 1717, -2579, -5275, -6722, -7343, -8089, -8774, -8787, -8953, -7988, -6997, -5777, -4317, -2640, -865, 460, 2090, 3031, 3732, 4025, 3211, 1831, 170, -1475, -3197, -4312, -5272, -6416, -6936, -7279, -7725, -7787, -7571, -7264, -6770, -6107, -5072, -4200, -3530, -3158, -2958, -2591, -2931, -3393, -3622, -4184, -5437, -6503, -6915, -7042, -6977, -6671, -6052, -5394, -3905, -3223, -2407, -1267, -738, 257, 791, 1532, 2369, 3057, 3824, 4043, 4615, 5667, 5880, 6605, 7693, 8661, 10100, 11637, 13333, 15235, 17225, 19191, 20746, 21433, 21297, 18482, 13799, 7936, 1223, -4587, -8462, -10316, -12152, -12560, -11073, -10661, -10352, -8763, -7693, -6292, -4128, -2510, -716, 1458, 3457, 5138, 6489, 7277, 6749, 5493, 3295, 751, -2378, -5352, -7673, -10063, -10613, -11066, -11036, -10310, -9513, -8256, -7004, -5898, -4759, -3819, -3003, -2604, -2058, -1465, -1541, -1564, -2112, -2871, -3835, -5276, -6426, -7359, -8122, -7630, -7328, -6462, -4476, -2860, -938, 529, 1298, 1569, 1438, 2043, 2067, 2370, 3217, 3421, 4341, 5265, 5455, 6469, 7445, 7889, 9512, 10750, 12850, 14919, 17173, 20245, 22748, 24710, 25499, 24329, 20574, 15051, 7814, -13, -6959, -12044, -15801, -17274, -17178, -16483, -15072, -12627, -10034, -8123, -5512, -3342, -1644, 754, 3841, 6151, 8479, 10234, 10898, 10044, 7832, 4595, -189, -4861, -9308, -13152, -16579, -17455, -17703, -16958, -14250, -12270, -9944, -7459, -5569, -4138, -3273, -2360, -1676, -1344, -849, -1402, -2151, -3077, -4647, -6497, -8208, -9826, -10421, -10606, -9622, -7791, -5790, -3035, -927, 758, 1486, 1815, 1536, 1499, 1590, 1880, 2452, 2813, 3297, 3669, 4465, 5301, 6187, 7411, 8950, 10607, 12706, 14944, 17410, 20537, 23610, 26344, 28578, 28159, 24890, 19457, 11276, 1760, -7209, -14244, -19652, -22149, -21961, -20435, -17292, -13371, -9548, -6629, -3582, -461, 1875, 4478, 7410, 10229, 12513, 14131, 14273, 12264, 8237, 2939, -3447, -10049, -15792, -20671, -22304, -22708, -21088, -17265, -13830, -9230, -5557, -2950, -657, 41, 785, 1073, 539, 787, -429, -1822, -3199, -5700, -7848, -10140, -11491, -12074, -11505, -9405, -7372, -4198, -730, 1339, 2839, 3633, 3769, 3197, 2969, 3018, 2622, 2647, 2542, 2629, 3665, 4291, 5441, 7180, 8449, 10772, 12731, 14965, 17388, 19736, 22715, 26069, 28888, 29960, 29315, 24683, 17715, 7447, -4365, -13771, -21124, -25065, -26004, -23336, -19318, -14962, -9568, -5520, -2661, 814, 3503, 6328, 9874, 13217, 15925, 16725, 16078, 12232, 5620, -2174, -9583, -18153, -23117, -25852, -26429, -23315, -20569, -14562, -10060, -5893, -1993, -567, 1398, 2211, 2149, 2465, 1231, 319, -1855, -4792, -7430, -10871, -12449, -13285, -12858, -10916, -8642, -5593, -2854, -882, 1057, 1945, 2888, 3144, 2826, 2917, 2625, 2269, 2133, 1478, 1833, 2422, 3572, 5904, 8703, 11678, 14658, 17168, 19169, 20637, 22515, 24276, 27926, 29920, 29562, 29965, 21993, 13880, -1395, -16523, -23563, -29659, -28928, -24803, -16281, -10854, -7401, -1946, -1026, -352, 4639, 8378, 13167, 18400, 21171, 20094, 13416, 6574, -4704, -16347, -22257, -26527, -27032, -23670, -19463, -15891, -12646, -10457, -8375, -7139, -3108, 961, 3223, 6340, 6207, 3816, -1149, -7244, -12998, -16349, -16925, -15913, -12693, -8923, -6646, -4891, -3946, -3749, -3608, -2777, -1038, 60, 907, 955, -978, -2729, -4454, -5437, -4603, -1904, 1156, 4292, 7552, 10754, 12666, 15577, 18340, 20313, 23682, 26730, 29213, 29638, 29996, 29316, 30589, 17234, 4715, -9645, -27360, -29571, -29168, -22250, -16351, -7614, -3656, -6706, -3161, 630, 3964, 14816, 23746, 26874, 24289, 16670, 5115, -10084, -18541, -21017, -22326, -18111, -13286, -13367, -14376, -16184, -15023, -14237, -5714, 4104, 9731, 14617, 12683, 5555, -3271, -9402, -13373, -14324, -10984, -9506, -10439, -10904, -13792, -14644, -12068, -5958, 210, 5055, 7833, 4252, -1675, -6502, -10510, -10185, -7363, -4271, -2867, -3850, -5424, -7250, -5015, 60, 6619, 13123, 18823, 20638, 19914, 19304, 19537, 20715, 26310, 29368, 30130, 29190, 30868, 23363, 14, -11957, -26462, -30229, -22378, -13937, -8639, -10580, -7170, -11257, -8391, 5689, 17570, 26496, 30062, 25639, 10509, -5373, -12762, -16420, -16355, -9759, -9209, -15314, -20229, -21848, -20576, -11632, 3076, 11076, 12004, 8843, 1446, -7750, -7180, -2895, -676, 503, -3180, -13392, -22253, -23374, -19500, -11232, -936, 4070, 998, -2297, -6462, -7764, -4733, 848, 1677, -1859, -7194, -14479, -18271, -15014, -7442, -1898, 1648, 1315, -1832, -3165, 914, 7524, 15494, 20438, 22419, 18389, 16504, 16127, 20198, 27891, 30167, 29390, 30345, 22460, -2653, -13593, -22144, -20093, -12716, -8729, -10879, -21054, -15850, -10949, 2032, 19426, 27426, 25344, 14958, 6665, -412, -3637, 471, -1278, -10653, -19135, -25860, -26293, -18406, -4487, 4458, 4383, 4889, -1367, -3186, 217, 6165, 7110, -597, -2772, -13531, -17345, -14353, -11449, -8832, -10299, -7925, -10402, -8532, -575, 1980, 3791, 1002, -3083, -7883, -9411, -5436, -6855, -7659, -10166, -13808, -13870, -9242, -1957, -161, 2187, 2719, 1263, 3967, 9955, 15298, 17274, 18736, 18137, 15915, 19814, 26951, 29865, 29597, 30058, 25461, 1156, -9530, -11745, -15097, -10365, -11719, -14473, -22988, -15305, -800, 7293, 17796, 19011, 13802, 8087, 8858, 11145, 4969, -861, -9034, -19299, -21655, -16390, -11066, -9861, -8209, -5450, -5481, 2002, 7874, 7385, 4502, -1154, -626, -7388, -3485, -1196, -10738, -13060, -15394, -13962, -11732, -5901, -2132, -7118, -4443, -1021, -802, 1735, 907, -1982, -8022, -7322, -6053, -9203, -9334, -10666, -11839, -8763, -3790, -564, 275, 2985, 5723, 8574, 13806, 17785, 19093, 18833, 20415, 22141, 27215, 29201, 29760, 29306, 22407, 3923, -7434, -7849, -11249, -10359, -14017, -15822, -18360, -11607, 2368, 7673, 10185, 11621, 11479, 12087, 14286, 12196, 3384, -7136, -9850, -11108, -11661, -11246, -14067, -16381, -13898, -4858, -67, 976, 3912, -551, 290, 2887, 4441, 1358, -6255, -4240, -9250, -11618, -9125, -11432, -14829, -13702, -8336, -6350, -5524, -2979, -2423, -3687, -71, 1269, -2259, -4799, -5888, -6728, -7648, -7193, -7887, -10024, -8668, -3943, -1367, 1187, 5202, 7920, 11250, 15594, 20172, 21285, 22314, 26577, 28901, 29367, 29988, 24327, 9611, -1415, -3320, -6938, -12297, -15806, -19975, -19676, -12170, -2592, 707, 614, 5101, 11667, 16169, 18012, 14092, 5406, -522, -1443, -3073, -8370, -13563, -16318, -16461, -13149, -8582, -8050, -8541, -3652, 2421, 2241, 1735, 2708, 2774, 1451, 696, 671, -4749, -9735, -9231, -10265, -13765, -12482, -11071, -11439, -9006, -5806, -3937, -2913, -960, 445, 134, -440, -971, -2503, -4016, -5151, -6516, -7711, -8207, -6773, -3340, -62, 2026, 5019, 9746, 14688, 17355, 20073, 23643, 27532, 29353, 29774, 29310, 22033, 11962, 6152, 1873, -4857, -10736, -16507, -19220, -17785, -14496, -11562, -8791, -4814, 1367, 7913, 11408, 13118, 12836, 12486, 11255, 9069, 4308, -978, -4764, -7316, -10087, -13447, -15933, -15247, -12375, -10777, -9876, -8761, -5356, -394, 2137, 1833, 2963, 3401, 3289, 2571, -250, -4277, -6311, -7086, -8860, -10506, -11250, -10992, -9819, -7160, -5909, -4379, -2444, -242, 947, 1253, 1585, 900, 709, 678, -508, -1647, -792, 695, 1777, 2994, 4653, 5633, 7903, 11466, 14078, 15152, 16465, 19010, 19652, 18606, 17790, 15278, 11760, 9129, 6775, 3197, -714, -3187, -5799, -7149, -7075, -7434, -7918, -7378, -6115, -4648, -3049, -1493, -524, -154, 566, 1659, 2043, 1993, 1418, 529, 532, 423, 100, -1104, -2138, -2690, -3327, -3473, -3559, -3399, -3876, -4165, -4044, -4054, -4596, -4483, -3747, -4583, -4178, -3248, -3384, -3339, -2881, -2310, -2042, -1259, -992, -1204, -1371, -1702, -1759, -1860, -1881, -1997, -2546, -2312, -2236, -2551, -2486, -2390, -1941, -1339, -572, -3, 432, 647, 1288, 1780, 2022, 2611, 3126, 3800, 4145, 4441, 4264, 4229, 4282, 4196, 4481, 4426, 4147, 3866, 3597, 2979, 2444, 1652, 659, 26, -774, -1755, -2237, -2573, -3274, -3213, -3465, -3765, -3734, -3773, -3656, -3448, -3352, -3389, -3208, -3278, -3223, -3286, -3127, -3133, -3314, -3181, -3519, -3362, -3545, -3571, -3083, -2997, -2725, -2232, -1700, -1199, -666, -158, 285, 385, 585, 299, 124, 36, -273, -286, -596, -1161, -1305, -1678, -1933, -1750, -1884, -1839, -1589, -1157, -479, 285, 888, 1558, 2155, 3038, 3810, 4225, 4537, 4457, 4363, 4389, 4066, 3962, 4047, 3564, 3159, 2831, 2497, 2524, 2303, 2258, 2026, 1224, 1029, 825, 506, 501, 339, -202, -963, -1195, -1707, -2202, -2285, -2645, -2601, -2712, -2772, -2924, -2677, -2433, -2326, -2087, -1988, -1724, -1785, -1705, -1815, -1507, -1612, -1500, -1190, -1284, -1105, -699, -507, -461, -55, 166, 54, -16, 128, 364, 369, 93, 135, 19, -57, -212, -444, -713, -879, -1028, -1252, -1234, -1095, -1157, -811, -247, -287, 155, 591, 896, 1276, 1517, 1483, 1527, 1366, 1400, 1572, 1300, 1075, 1239, 1267, 1258, 1690, 1924, 2419, 2306, 2525, 2757, 2623, 2867, 2788, 2495, 2555, 2280, 1850, 1479, 1068, 836, 470, 479, 244, 105, -562, -733, -992, -1433, -1340, -1769, -1799, -2220, -2291, -2534, -2635, -2273, -2240, -2057, -2296, -1877, -1446, -1089, -1007, -910, -737, -275, 50, -41, 57, -277, -388, -438, -678, -812, -981, -1394, -1700, -1701, -1595, -1819, -1666, -1494, -1195, -1308, -1141, -711, -305, 101, -129, 127, 247, 318, 249, 402, -70, -216, 39, -357, 82, 77, -181, 239, 387, 597, 1009, 1119, 1272, 1366, 1487, 1368, 1154, 1116, 970, 783, 500, 665, 514, 623, 833, 574, 692, 759, 748, 766, 1042, 809, 751, 645, 445, 556, 319, 444, 151, -179, -45, 41, -51, 116, 238, 305, 492, 528, 419, 247, 231, 338, 524, 54, -108, -458, -800, -1154, -1628, -1672, -2087, -1890, -1872, -2031, -1929, -1720, -1376, -1101, -1011, -951, -641, -260, -282, -87, 0, -364, -539, -669, -485, -521, -753, -746, -750, -757, -591, -413, -242, -232, 365, 365, 236, 566, 437, 575, 309, 284, 133, 5, -54, -252, -262, -228, -281, -6, 343, 544, 450, 649, 581, 466, 526, 473, 527, 471, 506, 60, 28, -44, 54, -60, 65, -66, 58, 37, 561, 420, 576, 432, 548, 618, 568, 473, 300, 272, 152, 293, -95, 187, -3519, -134, 41, 66, -958, -2158, 1809, -332, 309, -51, 759, 181, 1083, 730, -745, 626, 363, -207, -518, -134, -422, -593, -452, -728, -993, -169, -258, -369, -176, -5, -90, 94, 512, 191, 23, 405, -43, 72, 12, 322, -165, -397, 148, -446, -30, -955, -468, -776, -523, -168, -718, -458, -520, -492, -591, -201, -929, -742, -1333, -663, -341, -724, -674, -663, -419, -528, 136, -595, -228, -230, -540, -332, -510, -513, -1030, 75, -762, -858, -327, -2478, -1177, -121, -747, -385, -1446, -847, 666, -1349, -406, 870, -340, 75, -94, 441, -667, -595, 278, 217, 202, -189, -341, 36, 62, -834, 285, -1227, 1070, -891, -459, 879, -1860, 381, -615, 543, -792, -211, 316, -1253, 1016, -475, -369, 242, -487, 1323, -1435, 1011, -324, -74, 156, -140, 333, -759, 346, -926, 414, -735, 402, -1086, 717, -1041, 113, 392, -402, 272, -405, 119, -314, 354, -238, 90, -83, 302, -618, -2, 756, -450, 990, -362, -211, 547, -1372, 1488, -1054, 374, -249, 721, -1761, 1587, -661, 1426, 1289, -1250, 573, -291, 1809, -1035, 1803, -1134, 2229, -2301, 2242, -2444, 1880, -645, 116, 977, -2413, 1100, -2553, -362, -2744, 1874, -2264, 2005, -1893, 1081, -1842, 536, -858, -157, 715, -1354, 796, -1362, 420, -1681, 1665, -1509, 782, -1600, 824, -1163, 418, -960, 402, -698, 81, -547, -70, 404, -2234, 2001, -2291, 1597, -662, 653, -1286, 639, -528, 1319, -333, 584, 727, -1437, 2399, -1083, 1518, -1301, 1954, -1472, 792, 992, -871, 855, -717, 1493, -1483, 2515, -754, -229, 1306, -504, 539, 344, 501, 154, 739, -1236, 2230, -845, 248, 1684, -1345, 1107, 262, 282, 1144, -454, 360, 600, -47, 893, -355, 37, 1696, -1092, 1208, 876, -2182, 3160, -2527, 2608, -1093, -975, 2361, -3559, 3585, -3267, 2503, -1756, 364, 645, -954, 583, -2735, 3098, -3891, 2923, -2392, 165, 446, -1752, 114, 747, -1708, -751, 754, -1354, 447, -112, -41, -1894, 3017, -4733, 3146, -3027, -450, 489, -2132, 1125, -2589, 915, -2851, 896, -2230, 1027, -1968, 838, -587, -2507, 3688, -4748, 2982, -3132, 939, -522, -468, 2, -878, 1334, -6219, 7620, -8130, 5684, -4854, 350, 2104, -4173, 3261, -4598, 4256, -4285, 4050, -4850, 2461, -1916, 350, 914, -1716, 1208, -1452, 588, -541, -556, -1013, 1787, -2133, 160, 827, -947, 517, -511, -1208, 2138, -3276, 4642, -6007, 4118, -1856, 3402, -1460, -1791, 2583, -6675, 7051, -7606, 5476, -7116, 6314, -5636, 3253, 215, -3086, 4750, -6041, 6579, -6082, 5636, -4443, 3063, -836, -142, 202, -155, -1799, 3434, -2475, 4052, -1310, 712, 2076, -5080, 5839, -5430, 7259, 1831, 1055, -10599, 4806, -539, 2545, -4515, 5860, -2815, 1280, 2249, -3770, 4191, -4999, 8517, -5328, 4292, -3708, 2652, -4015, 3940, -2802, 1952, -2360, 802, 271, 417, -554, -814, 1242, -2313, 5598, -7516, 7259, -5683, 2953, -368, -63, 1045, -1594, 1097, -1389, 1687, -2799, 3317, -2759, 1350, 52, -1281, 1778, -3622, 1988, -2448, 1647, -2504, 2974, -2668, 469, -42, -1634, 2948, -3499, 2434, -3156, 4519, -3722, 2724, -1068, -1034, 515, -447, 719, -730, 1433, -719, 1477, -2820, 3742, -1699, -131, 691, -439, 795, -646, 1173, -1180, 1054, -1313, 2580, -2795, 2994, -1911, 136, 1053, -994, 3533, -5655, 4764, -2328, 2360, -2129, 576, -629, -1633, 3114, -2601, 998, -1244, 911, 241, 410, -630, -110, -404, 983, -717, -1150, 679, -923, 1083, -1733, 712, -268, 257, -1113, 991, -1119, 922, -604, 304, -148, -2092, 3518, -6937, 8073, -7378, 6385, -5848, 1741, 2247, -5147, 6542, -8180, 6747, -7110, 5455, -3455, 1794, -461, -2248, 2571, -1360, -300, -1049, -283, 582, -151, -1763, 2646, -4233, 4621, -2281, 1333, 915, -3235, 3270, -2003, 1115, -1658, 818, 380, -3157, 2337, -2080, 740, -96, -333, -211, -1673, 1792, -3644, 3729, -4247, 1127, 480, -3459, 5074, -7944, 5121, -2889, 1003, -2043, 236, -1141, 1413, -1387, -1245, 2291, -4872, 5092, -5841, 5740, -5040, 4500, -4820, 3809, -794, -1010, 1321, -2208, 6387, -6885, 6324, -5440, 4656, -4210, 2913, -264, -1336, 2084, -2399, 3394, -3566, 5804, -6212, 6306, -4161, 1805, 1498, -2858, 5204, -4825, 4881, -5020, 5321, -5790, 5701, -4516, 2906, -1733, 1176, 2918, -5794, 8602, -10465, 10667, -9762, 9543, -5909, 2709, 1639, -2856, 5325, -7661, 6179, -6607, 4778, -3169, 1254, -2011, 2176, 573, -788, 864, -1037, 3496, -2668, 2534, 1561, -2308, 3490, -1101, 3126, -149, 454, -1150, 2363, -1842, -330, -108, -3180, 2313, -3732, 5802, -6741, 5362, -3429, 1161, 2354, -3486, 2197, -4567, 4130, -4467, 3526, -1784, -1050, 1534, -2903, 4950, -4685, 1781, -1603, -59, 1687, -2979, 1689, -2123, -103, 112, -350, -1793, 837, -2707, 1646, -1760, 1400, -750, -1059, -71, -917, 619, -319, -388, -951, 1448, -3423, 3508, -4998, 2599, -1922, 249, -354, -710, -435, -2015, 1526, -1993, 1965, -2452, 2494, -2656, 1961, -3382, 4820, -5756, 5248, -3338, -98, 3485, -7122, 9337, -10427, 6925, -4745, 1441, -520, -846, 1318, -2659, 847, 361, -1365, -1429, 1428, -3019, 3104, -4541, 5106, -4672, 3646, -3183, 2192, -1318, -1001, 3600, -4903, 3844, -3223, 4505, -5223, 5320, -4035, 413, 166, -678, 727, -2844, 2911, -3805, 3897, -4036, 2823, -644, -1194, 2453, -2315, 1198, -544, -28, 377, -682, 231, -1269, 925, -954, -702, 230, -1428, 605, -1184, -576, 342, -2597, 548, -1429, -3267, -3061, -2517, -546, -2697, -202, -1023, 726, -3569, 932, -3547, -803, -229, -2912, 379, -2542, 559, -1737, 652, -2378, -744, -2145, 786, -1859, -379, -369, -1259, -574, -2182, 582, -3281, 2046, -2614, 644, -833, -1719, 1126, -3404, 2035, -1584, 225, -145, -1474, 600, -1962, 742, -950, 986, -301, -220, -158, 341, 100, -899, 1313, -906, 2317, -212, 1153, 51, -275, 448, 220, 1567, 374, 2293, 925, 1283, 160, 1366, 93, 264, 416, 926, 743, 288, 1357, -42, 1359, -250, 911, 95, -197, 970, 961, 1545, 1366, 1501, 1148, 627, 18, 344, 851, 1667, 1171, 570, 491, 71, -651, -2053, -1560, -1650, -2076, -2229, -2660, -3401, -4015, -3646, -4913, -4610, -4409, -3968, -3246, -3133, -3193, -2644, -3301, -3234, -2303, -2262, -1230, -609, 439, 862, 970, 1295, 771, 1441, 1755, 2119, 3723, 3662, 4652, 5499, 5576, 5354, 6442, 7103, 7947, 8801, 10145, 12021, 12948, 14140, 15558, 14484, 11432, 10851, 9678, 7062, 4484, 4218, 3010, -706, -2507, -4607, -8592, -10733, -11295, -11568, -12657, -11495, -11251, -11455, -11149, -9610, -9518, -9011, -6938, -6250, -4456, -3477, -1796, -2538, -1448, -1577, -1976, -2519, -2617, -3387, -4552, -4460, -5325, -6018, -7130, -7680, -8638, -8281, -8517, -7984, -7842, -6717, -6473, -5157, -3798, -3395, -2461, -1472, -128, 370, 1565, 2111, 3177, 3849, 5178, 5347, 6754, 7683, 8645, 10516, 11656, 13659, 14717, 17700, 19833, 22257, 23870, 23912, 22583, 18193, 15951, 14876, 11260, 8443, 7815, 5448, 29, -3676, -6249, -11754, -14096, -13215, -13507, -14582, -13090, -12803, -14319, -12771, -10275, -9215, -7880, -4539, -3344, -2786, -1536, -1241, -1885, -960, 631, 0, 353, 777, -33, -1046, -1300, -2179, -3541, -4054, -4862, -5340, -5489, -5759, -7160, -7726, -8249, -8845, -9286, -9030, -9670, -9258, -8369, -8409, -7221, -6640, -5671, -5081, -3762, -2894, -1965, -604, 1023, 1625, 3282, 4108, 5303, 7472, 9152, 10655, 11435, 13791, 15316, 17893, 21376, 25241, 28239, 30130, 28910, 22106, 19080, 20383, 15295, 11071, 12139, 10269, 2369, -3541, -6288, -12708, -17002, -15377, -14591, -15835, -15237, -15845, -17453, -15530, -12430, -10463, -7558, -4646, -3636, -2751, -364, -325, -119, 144, 899, 2291, 2440, 1658, 612, 592, -1064, -2003, -1122, -1821, -3795, -4381, -5094, -6881, -8294, -9272, -10440, -11002, -10786, -10396, -10992, -11940, -12625, -11625, -10231, -9304, -8641, -7124, -5537, -4748, -2733, -1462, -256, 1306, 3747, 4881, 5586, 7179, 7835, 8900, 11791, 13660, 15778, 17935, 20848, 22933, 26657, 29815, 29965, 25979, 18018, 21397, 20283, 12242, 11760, 13030, 5704, -3634, -5162, -9408, -16329, -16735, -14049, -15779, -16950, -16363, -18508, -18225, -14151, -10798, -8321, -6032, -5306, -5042, -1853, -18, 117, 1190, 1365, 1716, 3084, 3190, 1235, 875, 994, -158, -340, -1258, -3684, -6256, -6819, -6708, -7983, -9482, -11394, -12607, -11936, -11907, -12932, -12710, -12596, -12252, -10452, -9247, -9238, -8407, -6588, -4852, -3680, -1590, -914, 170, 1962, 3584, 5049, 5927, 6899, 7847, 10292, 12480, 14681, 17375, 19125, 21637, 26908, 29425, 30258, 26241, 21369, 20940, 19428, 16298, 13433, 11666, 6742, -808, -5332, -8845, -13624, -15108, -14578, -14115, -16321, -18362, -18088, -16833, -14316, -10446, -7292, -6537, -6476, -4862, -1957, 84, 1231, 1792, 1557, 1871, 3708, 2635, 1336, 1873, 1718, 182, -308, -1050, -3891, -6164, -6614, -6512, -7931, -9597, -11545, -11916, -11327, -11770, -12125, -11770, -11813, -11446, -9601, -8173, -7909, -7113, -4999, -3499, -2125, -498, 310, 867, 2830, 4253, 5655, 6547, 6468, 7981, 10301, 12709, 14382, 16213, 18927, 21866, 25335, 28961, 29929, 24861, 19368, 21185, 21244, 15719, 13256, 13080, 7036, -898, -4222, -7842, -12800, -13964, -12963, -13721, -15032, -17315, -18661, -16396, -12551, -10486, -8279, -6504, -7055, -6321, -2280, 416, -318, 41, 781, 1606, 2863, 2127, 1101, 1227, 1086, 302, -99, -1551, -3980, -5385, -5657, -6103, -7589, -9476, -11059, -11392, -10794, -10861, -11546, -11422, -11508, -10529, -9008, -7955, -7599, -6315, -4544, -2703, -1460, -237, 89, 1383, 2920, 4750, 5455, 6040, 6859, 8304, 11295, 12527, 15414, 16322, 20341, 22322, 28370, 28441, 31831, 19517, 14455, 26617, 17290, 12676, 12302, 13833, -500, -2803, -5275, -12786, -17073, -17432, -13128, -14103, -14865, -20280, -17942, -14058, -9016, -6679, -7160, -7416, -6005, -1223, 3413, 198, -1010, -2807, 3425, 4722, 2208, -1334, -2562, 845, -900, 561, -5293, -6917, -9625, -5857, -8236, -10125, -15580, -16065, -10916, -11012, -10750, -14692, -9791, -9209, -5100, -7619, -7048, -6697, -3281, 380, -1430, -913, -286, 3220, 4430, 5010, 3480, 6321, 9326, 13989, 15875, 18073, 22460, 28283, 29316, 30442, 28778, 31224, 15745, 9615, 20578, 11422, 82, -12652, -9543, -13731, -15920, -24860, -30972, -24895, -17434, -7698, -5860, -5991, -6755, 3881, 14762, 12374, 10660, 14247, 13952, 12022, 5620, -1258, -8627, -7250, -10435, -17604, -17884, -19041, -21326, -16968, -12452, -12333, -8872, -2650, -874, -87, 2962, 2767, 4521, 3702, 45, -4331, -3575, -7413, -12726, -14136, -15654, -16500, -15374, -14294, -14583, -10654, -5669, -3685, -1408, 2231, 5039, 7996, 11462, 10607, 11416, 13263, 15307, 15576, 18195, 19761, 21125, 27337, 29971, 29622, 30100, 25649, 817, 12845, 15513, -568, -11867, -18818, -9599, -16755, -15673, -29866, -24954, -9585, -4313, 832, -1687, 6120, 8546, 18978, 17763, 5304, 12738, 15646, 8523, -3224, -11744, -13064, -11574, -14709, -26959, -25461, -14375, -14070, -15750, -12072, -6029, 1578, 6454, 4026, 821, 6475, 7872, 4756, -1583, -6669, -8696, -7589, -11972, -21449, -19644, -15334, -13116, -15162, -13377, -10182, -2794, 823, -845, 963, 6255, 8659, 7452, 7575, 8903, 11576, 13454, 13185, 12095, 18770, 23062, 25490, 28335, 30713, 28506, 30472, 155, 590, 23485, -3633, -13807, -24312, -15127, -14999, -21606, -24224, -32000, -5589, 118, 1437, 2067, 7554, 16443, 18355, 21965, 4961, 12496, 17571, 6596, -9533, -17746, -13842, -15452, -19450, -30690, -24223, -13149, -9937, -16009, -10972, 648, 8291, 9504, 4741, 4306, 7784, 10276, 1333, -5846, -8824, -8933, -11820, -17520, -22708, -20581, -13958, -13930, -16044, -10336, -3571, 637, 1884, 3455, 5823, 10831, 12627, 8498, 10578, 16281, 16252, 15336, 17761, 20495, 26552, 29762, 30012, 29438, 26730, -5583, 5712, 16590, -11228, -17983, -22600, -8554, -19174, -17724, -24623, -25078, 2239, 313, 2354, 2875, 16171, 16215, 13072, 14541, 4970, 12686, 9402, -522, -15985, -18798, -12312, -21082, -26375, -25935, -15576, -9740, -11567, -11936, -4453, 8022, 9911, 4706, 4607, 7971, 7517, 651, -5657, -8308, -7646, -9556, -16677, -19966, -17551, -14317, -14453, -14750, -10411, -3889, 1466, 1649, 2858, 8793, 13466, 13126, 12869, 14781, 16326, 20138, 19477, 20755, 26748, 31041, 28295, 31204, -3935, -593, 21529, -9192, -15182, -26248, -8689, -13305, -17458, -20885, -31093, 3224, 942, 1103, 2352, 12416, 20253, 10554, 13596, 4779, 7917, 11139, -177, -15087, -16577, -10551, -20786, -26338, -24653, -16972, -11500, -10522, -12470, -6151, 6962, 8620, 3011, 3096, 10253, 7264, 931, -4906, -6834, -6558, -7670, -14358, -17632, -12957, -10211, -11214, -10361, -5423, -224, 3455, 4841, 8068, 12825, 17284, 17416, 19756, 21392, 26725, 29204, 30498, 28590, 31733, 2353, -4013, 22469, -9360, -17843, -21587, -13271, -14630, -17723, -14588, -29980, 1095, 3613, 65, 5582, 14585, 20769, 9923, 13889, 8925, 4766, 8393, -797, -17668, -15414, -16069, -24138, -31227, -20485, -13851, -17765, -8327, -10342, -3177, 3772, 4908, 2808, 5765, 11310, 1651, -1446, -3908, -6751, -9046, -11879, -13647, -11841, -8560, -9676, -9152, -3359, 3577, 8600, 13194, 16300, 22861, 25767, 29634, 29194, 30591, 28506, 31586, 9267, -5800, 17134, -9054, -23822, -27980, -22133, -19144, -23112, -18091, -30413, -3072, 5139, 1733, 9660, 19499, 28541, 18763, 19229, 12515, 9557, 9411, -1078, -18399, -19770, -19850, -30016, -29813, -28074, -22998, -17986, -8064, -10842, -6109, 6514, 7122, 7884, 8932, 11158, 7970, 4492, -2541, -9196, -9151, -10997, -15380, -15267, -13069, -8153, -2984, 3464, 9607, 19035, 28580, 29978, 29559, 30030, 28766, 21455, 23310, 14135, -3901, -12460, -17910, -20660, -24134, -26207, -30196, -22853, -12695, -11098, -4734, 5963, 14303, 17058, 19116, 20048, 17779, 17586, 10251, -1250, -8054, -12424, -20778, -28733, -24240, -26824, -26177, -17987, -18375, -14935, -6962, -669, 1162, 5608, 10416, 9809, 9827, 7210, 2286, 2130, 305, -2740, -3167, 3431, 9185, 8187, 12541, 20652, 28273, 23569, 15929, 12179, 11780, 9297, -2133, -10507, -11416, -9539, -14857, -20873, -19241, -13757, -8458, -4489, -1506, 4972, 12627, 15599, 12988, 12805, 13937, 11708, 2101, -5358, -7561, -12012, -21643, -26489, -18280, -21612, -21386, -15451, -12115, -6612, -862, 974, 300, 7521, 9299, 4668, 4414, 3505, 1135, 1518, 1308, 2628, 8200, 14035, 13345, 18745, 23817, 20382, 14173, 11355, 10249, 4014, 1506, -5895, -11156, -8955, -11143, -16214, -17300, -11218, -7520, -4716, -768, 1978, 7012, 10923, 9761, 6746, 6754, 2633, 4566, -4223, -15669, -13182, -13547, -14243, -22041, -18708, -12724, -9883, -8240, -9369, -1836, 3010, 4500, 4056, 4666, 8468, 8676, 7276, 6660, 8478, 15802, 16625, 13950, 18041, 21098, 16936, 9424, 6893, 3664, -1167, -2369, -8735, -12837, -10734, -9078, -12244, -13324, -7954, -4749, -228, 2135, 3486, 7673, 11059, 9504, 6812, 2964, 1447, -2040, -7857, -11649, -16189, -11720, -14291, -17861, -14423, -11810, -9006, -8368, -5293, -3291, 1237, 4666, 2902, 4529, 5753, 7532, 9642, 10502, 14707, 15469, 17848, 20501, 16286, 11315, 8003, 7468, 282, -3833, -2602, -9183, -9342, -8076, -10736, -10512, -7603, -5695, -5590, -375, 2900, 1924, 3828, 5653, 5086, 672, -1576, -733, -8760, -9351, -8115, -13861, -13255, -10979, -10279, -11066, -7279, -5856, -5904, -527, 98, 769, 4967, 6593, 7403, 9877, 13959, 15175, 15298, 17617, 19102, 15717, 9705, 5423, 2818, 466, -5646, -9568, -9920, -10060, -9203, -10182, -9596, -6829, -2865, -31, 544, 3687, 5553, 7716, 5158, 2977, 2715, -1118, -4402, -8948, -8665, -11750, -13724, -11503, -12158, -10954, -8514, -6835, -5081, -2271, 576, 2400, 5263, 7600, 8300, 11260, 13494, 16081, 14883, 15861, 17549, 10866, 8071, 5279, 1267, -1352, -5748, -6594, -7786, -7836, -8433, -9716, -6842, -5576, -3217, -1318, -207, 2991, 2578, 3111, 4755, -289, -1544, -2868, -5613, -4660, -8776, -11428, -10433, -9277, -10409, -10196, -7172, -6947, -2743, 1408, 2558, 6971, 10208, 12778, 14800, 16794, 16431, 16341, 17969, 11955, 6627, 4360, 849, -3482, -7780, -9385, -11527, -9842, -8069, -10279, -8665, -5034, -3037, -1669, 1031, 1012, 1890, 6309, 3410, -1030, -844, -3796, -5307, -3824, -8383, -11540, -7062, -6004, -8113, -7146, -6725, -6357, -1863, 590, -276, 4711, 8895, 10303, 14033, 16275, 14931, 16206, 17824, 12885, 8348, 5822, 1812, -2117, -3851, -7912, -9480, -7906, -8083, -7464, -6761, -5113, -2876, -207, 1403, 1490, 3574, 2506, 360, 763, -4533, -5662, -3974, -7741, -9298, -8325, -8735, -8696, -6719, -6839, -6602, -1619, 1676, 2633, 7124, 9062, 10846, 15080, 16375, 14902, 14309, 14433, 10514, 7277, 4179, -2108, -3746, -4551, -8043, -9271, -9820, -8636, -6789, -4179, -2319, -2100, 946, 2721, 3601, 3356, -238, -1261, -3527, -6234, -5840, -8414, -10568, -9333, -8330, -8418, -7722, -6274, -5451, -2190, 1061, 3461, 7914, 10332, 12648, 15445, 18399, 17565, 15166, 14930, 9764, 6338, 3050, -2646, -5690, -9055, -10499, -10763, -10408, -9059, -8633, -5761, -3800, -2236, 1202, 2514, 4163, 2883, 1736, 1617, -3053, -3476, -4583, -8504, -9735, -10078, -10042, -10574, -8928, -8416, -7563, -3044, -830, 2738, 8046, 9634, 12322, 16134, 18449, 18735, 17213, 13554, 8657, 5948, 3653, -1577, -5299, -6896, -9907, -9018, -7844, -9287, -8505, -6673, -4639, -1841, 295, 807, -439, 1308, 1431, -2930, -2022, -2753, -6123, -5116, -5614, -7336, -7663, -6648, -6929, -6455, -2216, -1394, 2288, 7762, 9284, 12858, 16920, 18050, 17178, 16090, 12273, 8618, 7225, 2662, -3022, -5149, -8485, -10682, -9397, -10545, -11499, -9479, -7299, -4632, -1539, 932, 560, 816, 2958, 147, -621, 340, -3926, -5454, -4773, -6363, -7011, -6987, -7119, -8197, -5147, -2739, -570, 5375, 7999, 10735, 15210, 18271, 18851, 17403, 13117, 9299, 7572, 5136, -255, -5208, -7808, -9469, -9610, -10214, -11525, -11332, -9608, -6157, -2711, -1094, -455, -1884, 265, 368, -2190, -122, -2959, -5591, -3391, -4150, -5393, -6307, -6096, -5717, -4229, -1084, 513, 4584, 9216, 11365, 14530, 17156, 17691, 15120, 10806, 8375, 5278, 3790, 394, -5024, -6770, -8761, -8302, -8151, -10170, -9852, -9012, -5366, -2035, -394, -530, -1642, -917, -1875, -1438, -1435, -5263, -6413, -5299, -4856, -4859, -5567, -6168, -5692, -2026, 779, 4033, 8614, 10841, 14537, 17928, 19684, 17654, 11582, 8879, 5741, 4163, 1602, -4292, -7195, -9399, -7857, -7510, -9417, -9957, -10351, -6400, -1976, -184, -103, -2212, -1170, -2019, -1941, -108, -4956, -6333, -5042, -4625, -3096, -3873, -4931, -5377, -3264, 224, 2560, 6900, 9270, 11201, 15862, 18976, 18556, 12368, 6979, 5291, 3754, 3320, -2123, -8175, -9437, -9048, -6414, -7070, -9702, -10491, -8846, -3346, 20, 877, -782, -3770, -2128, -1817, -2074, -2168, -6801, -7841, -5897, -4744, -3244, -4774, -5702, -4681, -2077, 2377, 4655, 6901, 9990, 13376, 17230, 20683, 18022, 9404, 5968, 4010, 2599, 1346, -4462, -9454, -11091, -8430, -6761, -7591, -7964, -10128, -7647, -999, 1317, 2177, -689, -2484, -2261, -3407, -500, -3964, -8156, -7062, -7736, -5085, -2943, -4169, -4757, -4346, -853, 2417, 7242, 10610, 11020, 16182, 18306, 21043, 19316, 9471, 6225, 3569, 1417, 760, -4351, -8618, -10797, -9301, -7079, -7415, -7615, -9541, -7613, -1358, 1906, 3305, 1601, -2227, -1913, -3104, -2684, -1900, -7404, -8583, -6823, -6541, -4005, -3786, -5869, -5253, -2241, 1620, 4370, 8627, 10507, 12439, 17718, 20428, 20835, 14588, 7798, 4977, 2957, 2467, -745, -6411, -10704, -11350, -8860, -7125, -7725, -8844, -9369, -5729, 125, 2833, 3337, 1111, -1955, -793, -912, -3162, -3451, -6841, -9479, -7916, -6379, -5697, -5139, -5892, -5754, -3232, 73, 2513, 5740, 9068, 10606, 14958, 18892, 21259, 19747, 11700, 7296, 4240, 1634, 2185, -3089, -8229, -11886, -12773, -8854, -7548, -7281, -8146, -8416, -4278, -292, 3287, 5822, 2566, 337, -815, -902, -1729, -5534, -6097, -8046, -10338, -7818, -7322, -7728, -6363, -6346, -4316, -1065, 1453, 3408, 6079, 8910, 11035, 14929, 18527, 20956, 21239, 14503, 8596, 6098, 2667, 746, -2185, -7063, -10896, -11880, -10217, -7992, -6737, -6622, -7037, -4476, -910, 2355, 5219, 3886, 3089, 2478, -89, -25, -2666, -6958, -7003, -8670, -9995, -9168, -8850, -8492, -7102, -4232, -3583, -1791, 1161, 1635, 3913, 6812, 7613, 9286, 11856, 14144, 17478, 20226, 15757, 9083, 5694, 2333, 1152, 87, -3632, -9182, -11782, -10609, -8500, -5927, -5266, -7188, -6187, -2754, 219, 4548, 5468, 3397, 941, 990, 1583, -1443, -2358, -5394, -10625, -10489, -9248, -9258, -8351, -7200, -7736, -6526, -2622, -428, 912, 2079, 764, 788, 2570, 3558, 4521, 5816, 7460, 7895, 10504, 14280, 15207, 12833, 10561, 6884, 3474, 3487, 1667, -899, -3047, -5971, -7724, -7283, -6842, -6231, -6526, -5327, -4144, -2538, 1503, 3542, 4369, 4697, 3373, 1752, 678, -1470, -2830, -4694, -6635, -8601, -10596, -9554, -8317, -8326, -6389, -5342, -5116, -2758, -1096, -147, 162, -1094, -2975, -3495, -2979, -1596, -382, 1596, 2639, 4454, 8534, 11779, 15452, 19305, 20242, 17950, 16286, 13141, 9917, 6139, 1925, -2621, -7843, -9798, -10773, -11172, -9933, -8960, -7805, -5146, -2270, 1878, 5003, 7055, 8380, 7603, 7483, 6025, 2776, 588, -2716, -8243, -10138, -11196, -13436, -12770, -12697, -12489, -9692, -7363, -5660, -3089, -1462, -559, -154, 354, 0, -697, -1122, -2891, -3420, -3609, -4246, -3688, -2944, -1917, 313, 2566, 5481, 8633, 11208, 14182, 16656, 19025, 21935, 21907, 20038, 15899, 8731, 3821, -578, -4500, -5918, -8598, -10842, -11300, -11306, -9124, -6412, -2941, -40, 1384, 3561, 4853, 5649, 7213, 6630, 4688, 2250, -1550, -3729, -5981, -7133, -6916, -8173, -9257, -9232, -8727, -7789, -6381, -5106, -4639, -3626, -2635, -2605, -1760, -1589, -2491, -3038, -3180, -3699, -4178, -4552, -4731, -4961, -4001, -3155, -2657, -1794, -1660, -1814, -1251, 8, 182, 1160, 1581, 2241, 3488, 4946, 6621, 8591, 10636, 12995, 16095, 19490, 21685, 20583, 19291, 16369, 11633, 7945, 4529, -612, -4760, -7369, -9067, -10466, -10557, -9462, -8149, -5906, -2791, 166, 2089, 4350, 5077, 5977, 6099, 5563, 3271, 706, -1992, -4624, -6389, -7413, -8435, -9496, -8397, -9833, -7827, -4938, -3826, -824, 1170, 986, 297, -1065, -2258, -2659, -2820, -2253, -3703, -5996, -7962, -8458, -7940, -6668, -4925, -3540, -3624, -3481, -2836, -2459, -872, 151, -22, -421, -1934, -3923, -5208, -5792, -5606, -4606, -3446, -3170, -2425, -805, 1017, 3307, 6664, 8825, 10531, 11732, 12619, 14329, 16181, 17128, 18469, 20033, 19250, 17411, 14772, 11129, 7132, 3561, -408, -4167, -7667, -9553, -10841, -10521, -8717, -6769, -4638, -2166, -144, 1365, 3529, 4857, 6114, 6140, 5583, 3595, 1140, -865, -3336, -5237, -6366, -7921, -9019, -9873, -9496, -7875, -6173, -3356, -1102, 109, 620, 448, -308, 481, -365, 101, -27, -2332, -3299, -5402, -6094, -5722, -5607, -3493, -3596, -5299, -4217, -5386, -4788, -3529, -1870, -684, -2098, -1765, -2493, -4015, -3448, -3238, -3047, -2494, -3386, -3435, -4670, -4808, -3766, -3467, -2147, -1519, -2007, -1241, -1150, -330, 1552, 2441, 4175, 4538, 5236, 5868, 5436, 6212, 7038, 7275, 8237, 8509, 7968, 8936, 10102, 11070, 12494, 14116, 15158, 14463, 14175, 11736, 7768, 3748, -1232, -4736, -7219, -7859, -7543, -7291, -6742, -5821, -5045, -3007, -767, 1391, 3747, 4830, 5574, 5133, 4052, 2510, 401, -840, -2499, -3866, -4999, -6624, -7135, -7836, -7638, -6254, -4870, -3149, -1604, -633, -109, 153, -34, -899, -1171, -2419, -3642, -4207, -5434, -4785, -4041, -3908, -3341, -3068, -2533, -1668, -909, 541, 762, 503, 441, -642, -2354, -4133, -5241, -6189, -6884, -6335, -5957, -6390, -5563, -5235, -4672, -3497, -2180, -665, -176, 530, 234, -489, -279, -651, -732, -580, -654, -247, -579, -123, 456, 872, 2656, 3255, 4089, 5473, 5861, 6027, 6254, 6659, 6924, 6444, 6204, 6047, 5654, 6009, 6701, 7406, 8817, 10766, 11715, 11776, 12368, 14935, 15703, 13848, 8011, 2306, -2932, -8959, -10222, -9925, -9425, -8088, -7327, -7716, -7276, -6884, -3987, -668, 3174, 6751, 7808, 7053, 5161, 2413, 59, -1467, -2799, -3551, -5286, -6431, -9339, -10200, -10163, -9048, -6280, -3223, -441, 1734, 2806, 3259, 2880, 2038, 2143, 1254, 46, -1555, -2305, -4948, -6678, -6934, -7040, -6847, -5403, -3809, -2888, -1796, -59, 805, 1017, 2132, 2069, 1471, 435, -404, -2841, -4923, -5490, -6958, -7443, -5939, -5630, -4774, -3288, -3291, -3067, -2325, -1141, -159, 406, 1259, 1222, 212, -462, -1333, -1833, -1464, -787, -413, 71, 792, 1175, 2000, 3371, 4491, 5659, 6800, 6831, 6485, 6082, 6188, 5860, 4841, 4745, 3939, 3094, 2791, 3491, 3249, 4419, 6219, 7293, 8675, 9883, 10524, 11079, 12682, 14776, 12465, 5397, 2623, -4743, -10648, -11532, -11540, -10213, -8171, -5629, -4833, -4952, -3859, -1461, -475, 4652, 7349, 8121, 8255, 6487, 2410, -1502, -4260, -6425, -7774, -7898, -6782, -8048, -7690, -7596, -7798, -6272, -3222, -407, 2788, 4965, 6472, 5613, 3896, 2675, -77, -1680, -1978, -3181, -4045, -4245, -5771, -6542, -7511, -7036, -6360, -5113, -2200, -207, 867, 2514, 2353, 1769, 1255, 112, -304, -1536, -2061, -2854, -4260, -4941, -5647, -6582, -5873, -5335, -4267, -2928, -2274, -1187, -1313, -904, -174, -475, -138, 202, -285, -229, -1041, -1502, -2065, -2775, -1842, -834, 442, 1866, 2920, 3494, 4308, 4494, 4920, 5831, 6297, 6767, 6751, 6652, 5102, 3817, 3066, 2240, 2365, 3544, 4266, 4756, 5480, 5457, 5495, 5129, 5827, 6371, 7397, 8556, 9647, 9729, 9786, 4802, -463, -2740, -9131, -10304, -9322, -8708, -6614, -4811, -4161, -3301, -4248, -2654, -1313, -79, 4331, 5288, 6214, 6448, 4023, 1070, -1460, -4170, -4596, -5800, -4888, -3978, -4515, -3942, -4263, -5276, -4478, -3336, -1629, 920, 2510, 4187, 3731, 3135, 1490, -885, -2667, -2641, -3263, -2330, -1869, -2353, -2357, -3374, -3387, -3713, -3289, -1813, -257, 908, 2362, 2297, 1982, 1124, -1282, -3474, -5048, -5992, -5913, -5317, -3955, -3117, -3168, -3080, -3180, -3242, -2748, -2041, -1018, -270, -251, -372, -1533, -2644, -3666, -4477, -4100, -3420, -2846, -1349, -777, -437, -233, -220, 333, 810, 1835, 2754, 3399, 3856, 3886, 3487, 3170, 2807, 2970, 3001, 3190, 3852, 4004, 3822, 3947, 3358, 3311, 3833, 3693, 4134, 4108, 3744, 3845, 4040, 3974, 4014, 4021, 4880, 4851, 5188, 6060, 6095, 6500, 6788, 4415, 727, 276, -3896, -6206, -5802, -6853, -5887, -4943, -3791, -3309, -3167, -1944, -332, -175, 2166, 3584, 3592, 4300, 3823, 1992, 291, -1585, -3022, -4283, -5206, -4407, -5120, -4572, -3847, -3916, -3481, -2210, -1226, 83, 1290, 2303, 3233, 2971, 2915, 1627, 208, -520, -1849, -2987, -2970, -3094, -3280, -3206, -2954, -3229, -3105, -2024, -1033, -271, 1023, 2194, 2480, 2823, 2357, 1578, 450, 2, -308, -1115, -1193, -1694, -2377, -2991, -3379, -4545, -4834, -4333, -4294, -3333, -2525, -2386, -2255, -2126, -2807, -2663, -2960, -2538, -1961, -1894, -967, -1254, -1359, -1283, -2126, -2403, -2007, -1852, -944, -369, 156, 525, 597, 1262, 1881, 2000, 2806, 3296, 3597, 4106, 3779, 3799, 3553, 2872, 2133, 1695, 1990, 2207, 1918, 2313, 1997, 1742, 1660, 1727, 1927, 2282, 3367, 3413, 3548, 4142, 3802, 3489, 3500, 3066, 2816, 2912, 2867, 2244, 2019, 1763, 1486, 918, 1382, 398, -1070, -757, -2922, -3844, -3338, -3800, -3547, -2973, -2066, -1691, -1698, -693, -330, -655, 419, 873, 531, 1437, 1037, 121, -351, -1615, -2589, -3100, -3260, -3232, -3296, -2911, -2071, -2187, -1730, -1006, -1021, -553, -157, 334, 593, 747, 903, 504, -99, -271, -1137, -2039, -1720, -1784, -1693, -1258, -1247, -1248, -1264, -1073, -733, -687, 15, 419, 346, 816, 510, 203, -46, -824, -1635, -2798, -2800, -3331, -3993, -3473, -3555, -3335, -2852, -2239, -2156, -1498, -922, -877, -632, -377, -402, -950, -784, -1351, -2198, -2240, -2638, -3086, -2493, -2176, -1758, -1037, -446, -48, 138, 836, 1297, 1566, 2012, 2137, 2137, 2244, 2001, 1859, 1454, 1241, 1084, 420, 810, 1196, 1073, 1427, 2024, 2262, 2418, 2893, 3323, 3168, 3484, 3622, 2996, 2921, 2494, 2209, 1927, 2083, 1766, 1465, 1765, 1549, 923, 1215, 1382, 596, 1215, 1568, 1474, 2062, 2290, 2158, 2088, 1961, 1641, 1158, 806, 634, -233, -1988, -1872, -3444, -4404, -3530, -3735, -3199, -2497, -1536, -917, -145, 366, 566, 443, 1297, 1214, 895, 1346, 857, 40, -120, -1184, -2216, -2730, -3017, -2888, -2972, -2085, -1744, -1208, -528, 68, -85, 423, 667, 714, 1295, 1163, 694, 368, -99, -469, -1104, -1689, -1414, -1644, -1482, -1249, -860, -717, -790, -590, -301, -515, -340, -212, -272, -405, -929, -1409, -1559, -1811, -2228, -1986, -2038, -1926, -1875, -1857, -1503, -1515, -1176, -896, -1212, -821, -763, -577, -307, -496, -670, -556, -924, -965, -837, -886, -476, -952, -615, -475, -503, -322, -99, -317, -288, 83, -239, -195, 181, 215, 84, 132, 216, 586, 435, 891, 958, 1129, 1789, 1580, 1442, 1674, 1352, 930, 1187, 1017, 608, 490, 498, 514, 284, 258, 87, -195, 420, 490, 552, 908, 1026, 978, 1029, 903, 449, 538, 461, 542, 442, 640, 724, 842, 876, 733, 743, 773, 689, 527, 293, -482, -1132, -1837, -2530, -3088, -3084, -2876, -2557, -2204, -1755, -1173, -781, -584, -229, 114, 455, 513, 490, 498, 152, -162, -810, -1383, -1875, -2097, -2280, -2170, -1764, -1433, -1154, -907, -510, -181, 26, 409, 536, 483, 500, 525, 250, -237, -526, -857, -977, -1016, -1250, -1133, -783, -1021, -852, -676, -505, -488, -484, -54, 157, 412, 308, 293, 0, -276, -621, -1048, -1188, -1261, -1394, -1307, -1221, -1256, -983, -1016, -981, -1027, -823, -482, -539, -90, -33, -318, 4, -411, -458, -394, -774, -920, -715, -291, -55, 136, 105, 170, -147, 100, 395, 492, 511, 489, 510, 487, 513, 487, 511, 489, 509, 489, 513, 476, 637, 800, 633, 487, 730, 852, 1078, 1145, 993, 992, 1024, 813, 498, 497, 510, 472, 663, 763, 759, 575, 474, 515, 488, 508, 493, 504, 502, 333, 206, 292, 194, 385, 345, 455, 518, 488, 508, 492, 507, 492, 506, 255, 259, 232, 283, 87, 182, -97, -274, -523, -794, -552, -746, -753, -743, -758, -744, -1002, -994, -822, -703, -800, -880, -868, -1178, -1326, -1630, -1635, -1984, -1869, -1702, -1708, -1221, -1355, -1487, -1533, -1398, -1210, -1331, -1389, -1381, -1298, -1216, -1469, -1589, -1793, -1959, -2022, -1977, -1693, -1445, -1368, -1377, -1240, -1214, -858, -530, -495, -499, -507, -478, -681, -506, -623, -600, -430, -694, -527, -486, -668, -837, -1022, -774, -400, -80, 295, 517, 490, 516, 371, 188, 385, 350, 453, 520, 490, 500, 509, 266, 334, 543, 471, 517, 663, 818, 550, 545, 744, 780, 655, 625, 585, 461, 525, 480, 519, 467, 322, 529, 477, 525, 463, 354, 384, 221, 266, 233, 464, 513, 487, 514, 482, 519, 146, 121, 499, 498, 496, 518, 375, 384, 295, 216, 278, 225, 274, 483, 404, 333, 83, -210, -223, -291, -184, 170, 437, 284, 261, 215, 112, 120, -2, -29, 159, 58, -19, 7, -234, -255, -244, -258, -238, -70, 125, 251, 32, -121, -304, -423, -207, -298, -111, -165, -224, -43, -562, -639, -495, -693, -402, -195, -45, 37, -37, 48, -185, -252, -256, -241, -256, -248, -58, 41, -171, -288, -119, -140, -53, 151, 293, 134, -7, -22, 134, 244, 26, -177, 204, 67, -162, 73, -44, 22, 44, 314, 385, 289, 193, 115, 120, 152, 366, 513, 489, 518, 452, 103, 133, -36, 7, 133, 107, 241, 109, 130, 122, 111, -161, -73, -6, 116, 281, 235, 256, 248, 247, 260, 202, -37, 40, -98, -257, -261, -214, -457, -182, -119, -85, 31, -12, 1, 8, -25, 86, 140, -43, 28, -26, 37, -130, -115, -147, 15, -210, -259, -253, -206, 24, -13, 8, -7, 8, -12, 23, -73, -153, -117, -389, -479, -338, -491, -367, -383, -267, -214, -7, 3, 1, -10, 27, -89, -133, -137, -31, 10, -184, -76, -319, -452, -537, -465, -534, -460, -319, -175, -510, -377, -412, -456, -357, -353, -257, -554, -299, -493, -506, -476, -150, 41, -31, 28, -27, 28, -31, 35, -41, 56, 142, 22, -71, -425, -202, -106, -138, 28, -13, 6, -2, 0, 1, 0, -4, 161, 41, -37, 59, 227, 285, 172, 11, -35, 106, 123, 146, 16, -9, 5, -2, 0, 0, 0, 1, -1, 1, -2, 3, -3, 4, -5, 5, -4, 3, -2, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 2, -3, 4, -5, 6, -7, 10, -17, 31, -83, -142, 37, -20, 14, -11, 8, -6, 5, -3, 2, -3, 4, -5, 7, -11, 24, -132, -269, 49, -177, -41, 17, -12, 11, -11, 13, -18, 23, -257, -218, -302, -124, -158, -214, -86, -271, -264, -117, -171, -215, 53, -234, -269, -73, -238, -127, -156, -291, -225, -264, -243, -245, -276, -104, -175, -276, -237, -254, -250, -243, -262, -231, -274, -217, -294, -158, -117, -270, -247, -244, -261, -233, -274, -191, 22, -181, -6, -121, -309, -132, 30, -73, -151, -119, -57, 41, -38, 45, -199, -251, -255, -242, -258, -241, -257, -244, -250, -261, -131, -111, -142, }; fldigi-4.1.06/src/soundcard/dinnerbell.cxx0000644000175000017500000030137713472115777015425 00000000000000#define DINNER_BELL 15287 int int_dinner_bell[DINNER_BELL] = { 5877, 6488, 2883, -3586, -9223, -10177, -4970, 4043, 11723, 13116, 6765, -4037, -13025, -14654, -7598, 4196, 13747, 15211, 7567, -4771, -14435, -15610, -7483, 5234, 15026, 16093, 7741, -5217, -15299, -16721, -8662, 4345, 14939, 17162, 9766, -3068, -14220, -17478, -10978, 1725, 13572, 17915, 12218, -459, -13041, -18444, -13472, -750, 12653, 19107, 14852, 2143, -11919, -19363, -15893, -3413, 11070, 19347, 16679, 4576, -10101, -19034, -17164, -5598, 9056, 18497, 17435, 6564, -7945, -17930, -17850, -7814, 6501, 17048, 17998, 8846, -5222, -16312, -18159, -9789, 4021, 15464, 18087, 10472, -3025, -14786, -18114, -11116, 2224, 14265, 18141, 11675, -1405, -13628, -18024, -12124, 725, 13149, 18024, 12596, 18, -12481, -17788, -12920, -723, 11834, 17613, 13331, 1475, -11158, -17386, -13650, -2104, 10655, 17271, 13927, 2524, -10408, -17407, -14355, -2935, 10319, 17748, 14952, 3423, -10275, -18194, -15664, -3991, 10153, 18575, 16287, 4514, -9980, -18805, -16746, -4896, 9919, 19090, 17205, 5258, -9869, -19424, -17768, -5783, 9709, 19721, 18410, 6433, -9359, -19877, -18995, -7153, 8901, 19906, 19465, 7761, -8533, -20020, -20012, -8421, 8178, 20221, 20711, 9236, -7719, -20431, -21547, -10291, 6970, 20414, 22263, 11398, -6086, -20216, -22894, -12489, 5124, 19905, 23378, 13523, -4121, -19521, -23889, -14678, 2964, 19025, 24372, 15904, -1627, -18328, -24718, -17120, 234, 17534, 24955, 18251, 1126, -16715, -25188, -19383, -2516, 15909, 25411, 20554, 3970, -15009, -25639, -21798, -5544, 13982, 25705, 22907, 7046, -12933, -25688, -23906, -8482, 11879, 25587, 24763, 9801, -10864, -25457, -25621, -11140, 9792, 25249, 26391, 12462, -8626, -24891, -27008, -13687, 7479, 24472, 27536, 14891, -6305, -23977, -28008, -16060, 5116, 23440, 28469, 17281, -3761, -22690, -28735, -18414, 2380, 21828, 28848, 19442, -1025, -20870, -28788, -20261, -163, 20024, 28791, 21127, 1438, -19069, -28726, -22051, -2841, 17965, 28569, 22990, 4433, -16566, -28128, -23753, -5978, 15074, 27500, 24325, 7423, -13590, -26830, -24855, -8812, 12151, 26187, 25384, 10249, -10633, -25472, -25921, -11739, 9027, 24638, 26287, 13122, -7399, -23660, -26496, -14339, 5885, 22731, 26634, 15463, -4436, -21772, -26757, -16579, 2965, 20809, 26874, 17761, -1354, -19672, -26840, -18864, -257, 18450, 26724, 19908, 1912, -17136, -26468, -20890, -3534, 15759, 26147, 21798, 5186, -14286, -25674, -22545, -6722, 12850, 25095, 23126, 8094, -11482, -24496, -23601, -9302, 10260, 23983, 24078, 10484, -9031, -23408, -24490, -11656, 7780, 22764, 24771, 12715, -6537, -21981, -24856, -13533, 5482, 21287, 24880, 14217, -4551, -20669, -24916, -14865, 3710, 20152, 25053, 15609, -2744, -19524, -25105, -16305, 1815, 18857, 25089, 16928, -899, -18187, -24997, -17440, 132, 17647, 25016, 18042, 712, -17029, -25013, -18661, -1601, 16356, 24943, 19245, 2564, -15538, -24676, -19633, -3333, 14829, 24419, 19919, 3984, -14214, -24194, -20217, -4568, 13715, 24102, 20637, 5304, -13067, -23934, -21036, -6070, 12365, 23671, 21367, 6819, -11595, -23282, -21562, -7440, 10890, 22916, 21716, 8053, -10193, -22508, -21843, -8623, 9509, 22101, 21943, 9168, -8819, -21693, -22038, -9714, 8198, 21370, 22249, 10336, -7532, -21099, -22589, -11132, 6727, 20777, 22979, 12058, -5750, -20279, -23255, -12954, 4713, 19677, 23364, 13697, -3786, -19084, -23440, -14346, 2974, 18592, 23537, 14969, -2188, -18106, -23666, -15671, 1318, 17543, 23716, 16304, -439, -16935, -23753, -16996, -511, 16264, 23738, 17655, 1474, -15559, -23768, -18451, -2621, 14679, 23645, 19147, 3810, -13673, -23358, -19740, -4900, 12659, 22938, 20053, 5734, -11844, -22588, -20355, -6427, 11182, 22353, 20694, 7123, -10529, -22159, -21094, -7921, 9768, 21830, 21367, 8662, -8940, -21390, -21554, -9382, 8107, 20887, 21653, 10026, -7302, -20411, -21831, -10792, 6361, 19839, 21934, 11532, -5427, -19244, -22065, -12290, 4448, 18596, 22065, 12888, -3654, -18113, -22198, -13567, 2839, 17615, 22312, 14210, -2039, -17165, -22488, -14967, 1108, 16536, 22459, 15524, -296, -15912, -22395, -16024, -493, 15287, 22250, 16417, 1173, -14729, -22171, -16889, -1948, 14093, 22009, 17288, 2669, -13452, -21829, -17679, -3385, 12815, 21610, 17975, 3990, -12285, -21492, -18360, -4655, 11735, 21391, 18749, 5336, -11146, -21228, -19123, -6055, 10468, 20933, 19322, 6588, -9885, -20631, -19449, -7042, 9384, 20356, 19536, 7422, -8984, -20198, -19733, -7874, 8520, 19967, 19860, 8282, -8070, -19735, -19981, -8677, 7634, 19514, 20068, 8993, -7295, -19393, -20294, -9450, 6881, 19254, 20539, 9983, -6327, -19002, -20729, -10530, 5702, 18597, 20739, 10918, -5147, -18189, -20677, -11199, 4734, 17918, 20707, 11542, -4300, -17671, -20873, -12045, 3718, 17344, 21027, 12655, -2942, -16829, -21067, -13247, 2117, 16241, 21037, 13797, -1299, -15631, -21019, -14391, 464, 15058, 21061, 15040, 460, -14384, -21022, -15682, -1393, 13678, 20933, 16222, 2263, -12962, -20780, -16686, -3061, 12320, 20643, 17149, 3847, -11650, -20470, -17588, -4656, 10916, 20241, 17974, 5483, -10104, -19876, -18285, -6254, 9319, 19534, 18584, 7043, -8490, -19174, -18938, -7912, 7603, 18804, 19328, 8912, -6536, -18274, -19620, -9856, 5489, 17693, 19831, 10720, -4455, -17077, -19978, -11493, 3533, 16557, 20163, 12312, -2542, -15927, -20251, -13050, 1563, 15254, 20230, 13662, -642, -14537, -20081, -14121, -93, 13963, 19981, 14535, 764, -13435, -19942, -15014, -1481, 12918, 19936, 15570, 2318, -12246, -19794, -16042, -3123, 11537, 19583, 16384, 3830, -10890, -19345, -16686, -4451, 10342, 19213, 17056, 5126, -9748, -19050, -17449, -5858, 9086, 18817, 17767, 6562, -8360, -18452, -17957, -7150, 7710, 18119, 18092, 7692, -7096, -17795, -18265, -8242, 6491, 17490, 18448, 8853, -5795, -17097, -18578, -9411, 5140, 16718, 18697, 9940, -4501, -16374, -18846, -10515, 3869, 16052, 19054, 11157, -3132, -15639, -19226, -11815, 2333, 15127, 19224, 12316, -1609, -14580, -19128, -12671, 1049, 14136, 19030, 12945, -601, -13790, -19008, -13260, 143, 13448, 19000, 13593, 373, -13028, -18900, -13864, -858, 12623, 18783, 14089, 1280, -12238, -18688, -14325, -1715, 11884, 18645, 14671, 2290, -11405, -18526, -15013, -2893, 10869, 18366, 15334, 3524, -10268, -18145, -15592, -4112, 9716, 17974, 15929, 4770, -9107, -17792, -16301, -5503, 8434, 17531, 16624, 6248, -7660, -17155, -16811, -6860, 6998, 16791, 16933, 7346, -6444, -16518, -17094, -7818, 5954, 16346, 17344, 8409, -5335, -16039, -17528, -8965, 4723, 15691, 17618, 9460, -4096, -15259, -17613, -9829, 3597, 14944, 17677, 10256, -3054, -14605, -17752, -10718, 2483, 14254, 17861, 11238, -1798, -13761, -17812, -11624, 1226, 13347, 17782, 11967, -704, -12974, -17745, -12286, 270, 12688, 17820, 12693, 249, -12335, -17838, -13062, -768, 11952, 17785, 13373, 1257, -11546, -17667, -13582, -1668, 11200, 17587, 13825, 2106, -10819, -17491, -14082, -2564, 10411, 17378, 14335, 3062, -9919, -17170, -14503, -3503, 9503, 16996, 14696, 3928, -9077, -16837, -14894, -4374, 8664, 16707, 15121, 4849, -8197, -16481, -15245, -5207, 7803, 16279, 15314, 5486, -7512, -16146, -15413, -5732, 7292, 16114, 15617, 6072, -7004, -16059, -15848, -6496, 6576, 15842, 15943, 6843, -6152, -15558, -15927, -7104, 5804, 15293, 15880, 7256, -5565, -15178, -15987, -7533, 5286, 15067, 16160, 7928, -4886, -14884, -16319, -8353, 4417, 14607, 16369, 8689, -3966, -14332, -16394, -8991, 3595, 14085, 16427, 9276, -3209, -13834, -16454, -9587, 2806, 13527, 16394, 9778, -2481, -13269, -16345, -9949, 2212, 13069, 16328, 10124, -1980, -12955, -16464, -10463, 1574, 12718, 16550, 10865, -1063, -12363, -16548, -11236, 487, 11879, 16386, 11450, -61, -11500, -16290, -11690, -349, 11160, 16238, 11934, 747, -10882, -16286, -12324, -1300, 10471, 16213, 12637, 1811, -10053, -16125, -12954, -2342, 9569, 15961, 13167, 2805, -9152, -15857, -13450, -3351, 8627, 15623, 13642, 3842, -8141, -15436, -13869, -4362, 7600, 15158, 13986, 4770, -7186, -15035, -14282, -5330, 6668, 14870, 14581, 5954, -6066, -14652, -14899, -6682, 5308, 14243, 15029, 7264, -4612, -13817, -15113, -7767, 3979, 13411, 15148, 8202, -3450, -13115, -15288, -8705, 2855, 12781, 15392, 9204, -2257, -12417, -15451, -9646, 1671, 12017, 15432, 9977, -1216, -11723, -15479, -10345, 738, 11403, 15519, 10709, -241, -11062, -15529, -11084, -302, 10622, 15416, 11341, 767, -10206, -15279, -11523, -1149, 9873, 15179, 11727, 1515, -9565, -15136, -11976, -1920, 9239, 15069, 12226, 2355, -8840, -14930, -12396, -2713, 8518, 14805, 12547, 3026, -8227, -14724, -12714, -3352, 7942, 14651, 12914, 3732, -7565, -14492, -13051, -4099, 7177, 14261, 13087, 4348, -6877, -14099, -13144, -4582, 6611, 13977, 13242, 4838, -6379, -13944, -13481, -5252, 5993, 13774, 13623, 5632, -5581, -13567, -13723, -5982, 5175, 13327, 13747, 6231, -4892, -13187, -13887, -6559, 4536, 13042, 14033, 6951, -4130, -12837, -14166, -7367, 3651, 12521, 14176, 7670, -3229, -12252, -14182, -7924, 2905, 12070, 14268, 8245, -2544, -11877, -14415, -8645, 2076, 11626, 14497, 9056, -1567, -11253, -14453, -9348, 1117, 10894, 14366, 9555, -735, -10578, -14284, -9750, 386, 10270, 14213, 9944, -41, -9983, -14138, -10138, -311, 9676, 14056, 10331, 624, -9426, -14050, -10571, -980, 9180, 14099, 10921, 1483, -8815, -14078, -11281, -2019, 8369, 13962, 11554, 2560, -7854, -13711, -11674, -2929, 7466, 13529, 11791, 3262, -7134, -13411, -11948, -3609, 6829, 13352, 12212, 4070, -6404, -13200, -12429, -4509, 5970, 13038, 12623, 4968, -5530, -12850, -12806, -5419, 5097, 12704, 13054, 5954, -4555, -12448, -13216, -6446, 3993, 12110, 13285, 6863, -3451, -11729, -13241, -7132, 3053, 11468, 13265, 7436, -2672, -11247, -13357, -7793, 2252, 11012, 13490, 8246, -1688, -10645, -13486, -8604, 1189, 10274, 13448, 8905, -746, -9939, -13407, -9135, 387, 9704, 13457, 9474, 52, -9406, -13458, -9775, -493, 9065, 13394, 10030, 929, -8652, -13204, -10121, -1203, 8373, 13087, 10221, 1465, -8133, -13018, -10369, -1732, 7917, 13000, 10619, 2119, -7585, -12926, -10818, -2493, 7265, 12840, 11046, 2895, -6912, -12740, -11228, -3263, 6582, 12644, 11418, 3638, -6228, -12477, -11529, -3919, 5927, 12301, 11563, 4121, -5672, -12150, -11552, -4236, 5548, 12109, 11664, 4454, -5347, -12065, -11814, -4741, 5080, 11978, 11982, 5108, -4688, -11736, -11987, -5333, 4404, 11552, 12029, 5542, -4149, -11419, -12096, -5755, 3937, 11388, 12298, 6131, -3561, -11214, -12427, -6494, 3154, 10963, 12480, 6845, -2693, -10627, -12416, -7080, 2332, 10372, 12455, 7386, -1906, -10078, -12467, -7708, 1448, 9771, 12487, 8073, -934, -9378, -12418, -8341, 498, 9038, 12364, 8604, -97, -8739, -12364, -8890, -308, 8461, 12401, 9274, 834, -8049, -12331, -9579, -1381, 7579, 12172, 9826, 1863, -7107, -11982, -9992, -2300, 6690, 11862, 10252, 2804, -6261, -11774, -10602, -3404, 5739, 11640, 10959, 4076, -5123, -11421, -11243, -4698, 4509, 11179, 11501, 5292, -3935, -10940, -11753, -5895, 3312, 10644, 11937, 6467, -2660, -10257, -12023, -6962, 2012, 9789, 11936, 7282, -1519, -9414, -11899, -7578, 1046, 9050, 11859, 7886, -585, -8736, -11889, -8296, 17, 8296, 11846, 8651, 543, -7854, -11788, -8995, -1092, 7426, 11702, 9290, 1577, -7063, -11685, -9663, -2135, 6622, 11592, 9966, 2643, -6161, -11440, -10183, -3118, 5686, 11207, 10262, 3444, -5348, -11033, -10388, -3759, 5008, 10903, 10532, 4119, -4658, -10774, -10763, -4613, 4134, 10506, 10878, 5051, -3627, -10197, -10937, -5434, 3144, 9897, 10959, 5732, -2773, -9708, -11092, -6130, 2338, 9475, 11177, 6483, -1940, -9253, -11258, -6812, 1517, 8954, 11217, 7030, -1220, -8761, -11258, -7290, 879, 8538, 11285, 7562, -510, -8301, -11361, -7935, -1, 7909, 11285, 8221, 471, -7520, -11222, -8519, -973, 7110, 11130, 8775, 1419, -6776, -11124, -9162, -1995, 6315, 11015, 9451, 2502, -5867, -10888, -9711, -3025, 5356, 10643, 9812, 3362, -5015, -10530, -10029, -3807, 4584, 10337, 10211, 4256, -4103, -10135, -10415, -4819, 3446, 9709, 10420, 5245, -2865, -9296, -10415, -5618, 2336, 8912, 10387, 5932, -1899, -8666, -10501, -6370, 1401, 8398, 10644, 6853, -858, -8106, -10768, -7333, 285, 7752, 10830, 7754, 246, -7423, -10893, -8182, -804, 7028, 10889, 8574, 1395, -6566, -10781, -8870, -1939, 6066, 10581, 9051, 2380, -5605, -10346, -9168, -2741, 5222, 10176, 9304, 3115, -4848, -10037, -9501, -3536, 4431, 9863, 9683, 3995, -3938, -9621, -9790, -4397, 3503, 9390, 9909, 4780, -3110, -9217, -10086, -5199, 2678, 9044, 10283, 5678, -2149, -8775, -10410, -6139, 1619, 8414, 10400, 6452, -1172, -8093, -10362, -6689, 812, 7824, 10353, 6909, -480, -7619, -10394, -7211, 86, 7338, 10387, 7482, 305, -7024, -10309, -7680, -657, 6712, 10209, 7820, 946, -6471, -10169, -8018, -1264, 6216, 10132, 8231, 1630, -5905, -10026, -8410, -1975, 5567, 9883, 8507, 2254, -5294, -9782, -8637, -2524, 5056, 9717, 8808, 2808, -4812, -9701, -9030, -3194, 4465, 9560, 9163, 3520, -4130, -9386, -9221, -3758, 3855, 9212, 9239, 3913, -3675, -9148, -9328, -4136, 3459, 9064, 9462, 4408, -3175, -8929, -9545, -4702, 2838, 8724, 9597, 4971, -2487, -8487, -9589, -5204, 2164, 8287, 9648, 5499, -1777, -8007, -9629, -5739, 1428, 7749, 9628, 5982, -1058, -7455, -9542, -6133, 814, 7299, 9612, 6401, -498, -7124, -9703, -6731, 108, 6910, 9804, 7151, 457, -6479, -9723, -7433, -941, 6046, 9555, 7610, 1347, -5646, -9382, -7731, -1656, 5387, 9339, 7957, 2021, -5086, -9286, -8197, -2425, 4734, 9213, 8436, 2882, -4325, -9035, -8609, -3255, 3939, 8902, 8797, 3694, -3496, -8720, -8991, -4179, 2996, 8497, 9195, 4737, -2370, -8115, -9275, -5225, 1748, 7694, 9272, 5613, -1193, -7305, -9265, -5966, 695, 6974, 9316, 6375, -172, -6654, -9365, -6785, -365, 6281, 9366, 7146, 876, -5890, -9316, -7435, -1333, 5531, 9241, 7686, 1758, -5172, -9149, -7917, -2185, 4774, 9014, 8111, 2593, -4364, -8812, -8216, -2930, 4009, 8645, 8350, 3280, -3660, -8514, -8518, -3658, 3298, 8403, 8749, 4145, -2817, -8172, -8896, -4587, 2300, 7863, 8928, 4906, -1874, -7561, -8897, -5135, 1570, 7362, 8922, 5369, -1284, -7203, -9005, -5656, 955, 6989, 9033, 5907, -598, -6733, -8998, -6100, 286, 6482, 8941, 6243, -40, -6317, -8956, -6457, -236, 6141, 9026, 6767, 638, -5865, -9025, -7042, -1062, 5502, 8896, 7233, 1427, -5131, -8749, -7322, -1723, 4867, 8641, 7464, 1997, -4624, -8606, -7669, -2364, 4302, 8508, 7863, 2753, -3920, -8356, -8018, -3137, 3525, 8153, 8130, 3479, -3159, -7969, -8261, -3830, 2766, 7790, 8385, 4225, -2310, -7522, -8454, -4587, 1863, 7216, 8460, 4867, -1475, -6951, -8457, -5132, 1121, 6737, 8537, 5475, -710, -6495, -8619, -5864, 200, 6141, 8601, 6208, 322, -5714, -8509, -6474, -801, 5287, 8352, 6671, 1195, -4958, -8284, -6920, -1628, 4594, 8217, 7192, 2096, -4198, -8123, -7471, -2601, 3749, 7957, 7668, 3035, -3330, -7804, -7872, -3478, 2906, 7643, 8081, 3930, -2442, -7439, -8233, -4369, 1951, 7153, 8297, 4728, -1493, -6849, -8265, -4955, 1186, 6625, 8277, 5176, -882, -6451, -8321, -5455, 554, 6236, 8366, 5732, -149, -5937, -8320, -5965, -231, 5600, 8205, 6115, 535, -5314, -8112, -6261, -840, 5066, 8087, 6482, 1187, -4789, -8061, -6751, -1614, 4424, 7947, 6951, 2001, -4057, -7804, -7089, -2320, 3758, 7686, 7201, 2599, -3510, -7628, -7405, -2943, 3187, 7521, 7564, 3316, -2816, -7351, -7691, -3681, 2400, 7071, 7704, 3945, -2045, -6850, -7731, -4219, 1690, 6616, 7772, 4500, -1326, -6388, -7827, -4815, 915, 6092, 7777, 5028, -589, -5850, -7762, -5218, 318, 5657, 7765, 5391, -85, -5554, -7854, -5665, -235, 5342, 7870, 5886, 534, -5124, -7868, -6114, -887, 4833, 7748, 6206, 1094, -4647, -7723, -6363, -1369, 4408, 7653, 6495, 1634, -4165, -7584, -6670, -1964, 3827, 7397, 6709, 2181, -3573, -7249, -6765, -2394, 3328, 7122, 6816, 2577, -3152, -7093, -7001, -2910, 2838, 6977, 7142, 3259, -2482, -6801, -7272, -3602, 2094, 6582, 7307, 3876, -1769, -6420, -7423, -4207, 1399, 6218, 7505, 4540, -1023, -5994, -7580, -4874, 581, 5675, 7516, 5081, -251, -5402, -7453, -5242, -38, 5181, 7416, 5398, 302, -4991, -7426, -5643, -652, 4709, 7388, 5887, 1050, -4349, -7282, -6076, -1434, 3996, 7158, 6242, 1797, -3661, -7062, -6451, -2184, 3329, 6964, 6687, 2627, -2918, -6803, -6839, -3018, 2506, 6590, 6919, 3315, -2147, -6370, -6955, -3556, 1861, 6212, 7010, 3819, -1548, -6040, -7090, -4114, 1186, 5794, 7107, 4393, -805, -5501, -7074, -4610, 452, 5244, 7029, 4810, -149, -5034, -7056, -5077, -189, 4800, 7075, 5346, 573, -4525, -7051, -5573, -929, 4232, 6962, 5718, 1207, -3990, -6906, -5856, -1454, 3813, 6906, 6061, 1748, -3592, -6897, -6290, -2095, 3272, 6796, 6435, 2442, -2933, -6606, -6502, -2692, 2629, 6436, 6540, 2908, -2384, -6298, -6613, -3141, 2128, 6172, 6707, 3421, -1800, -5985, -6731, -3649, 1502, 5762, 6701, 3812, -1265, -5590, -6694, -3937, 1087, 5493, 6756, 4146, -846, -5373, -6833, -4392, 557, 5188, 6868, 4624, -231, -4953, -6845, -4814, -47, 4736, 6803, 4983, 327, -4532, -6793, -5195, -641, 4275, 6750, 5391, 970, -3970, -6634, -5511, -1262, 3693, 6501, 5598, 1488, -3456, -6416, -5694, -1720, 3248, 6381, 5885, 2051, -2952, -6279, -6047, -2390, 2600, 6118, 6153, 2717, -2245, -5900, -6186, -2942, 1967, 5756, 6265, 3204, -1717, -5655, -6409, -3523, 1366, 5509, 6534, 3882, -964, -5269, -6582, -4185, 561, 4972, 6539, 4400, -220, -4710, -6511, -4614, -107, 4477, 6505, 4865, 463, -4196, -6504, -5143, -886, 3859, 6430, 5391, 1325, -3463, -6282, -5536, -1684, 3122, 6154, 5722, 2067, -2736, -5987, -5837, -2389, 2405, 5832, 5965, 2738, -2023, -5600, -5984, -2938, 1783, 5507, 6098, 3210, -1510, -5390, -6197, -3479, 1261, 5311, 6375, 3846, -845, -5059, -6388, -4124, 481, 4762, 6332, 4292, -161, -4466, -6189, -4332, -18, 4317, 6169, 4487, 246, -4137, -6150, -4662, -517, 3939, 6168, 4929, 915, -3588, -6026, -5042, -1201, 3319, 5936, 5183, 1500, -3039, -5824, -5298, -1731, 2839, 5824, 5529, 2072, -2551, -5747, -5688, -2389, 2256, 5638, 5812, 2690, -1958, -5480, -5880, -2902, 1722, 5386, 5978, 3171, -1434, -5214, -6026, -3415, 1136, 5018, 6044, 3638, -801, -4748, -5950, -3754, 571, 4541, 5899, 3862, -379, -4391, -5883, -3986, 200, 4283, 5939, 4200, 75, -4097, -5938, -4388, -346, 3904, 5908, 4548, 590, -3686, -5857, -4657, -790, 3543, 5861, 4816, 1024, -3358, -5850, -4984, -1286, 3149, 5791, 5127, 1553, -2893, -5685, -5219, -1781, 2657, 5576, 5302, 1993, -2427, -5488, -5409, -2267, 2145, 5328, 5495, 2547, -1829, -5150, -5533, -2796, 1511, 4918, 5511, 2942, -1304, -4805, -5569, -3158, 1061, 4708, 5678, 3417, -800, -4596, -5823, -3759, 397, 4342, 5797, 3996, -65, -4058, -5735, -4154, -231, 3785, 5630, 4231, 420, -3641, -5641, -4431, -709, 3430, 5621, 4628, 1013, -3202, -5626, -4907, -1441, 2824, 5486, 5052, 1766, -2518, -5393, -5247, -2171, 2114, 5202, 5357, 2512, -1760, -5038, -5503, -2905, 1290, 4722, 5469, 3121, -968, -4495, -5477, -3354, 649, 4262, 5447, 3513, -434, -4158, -5558, -3843, 59, 3912, 5574, 4072, 286, -3686, -5566, -4328, -660, 3349, 5438, 4419, 890, -3160, -5407, -4583, -1153, 2926, 5351, 4734, 1417, -2721, -5336, -4955, -1789, 2359, 5156, 5044, 2073, -2046, -4999, -5115, -2350, 1724, 4784, 5112, 2533, -1490, -4664, -5192, -2769, 1200, 4492, 5216, 2976, -941, -4339, -5258, -3199, 678, 4164, 5263, 3368, -452, -4017, -5312, -3589, 180, 3852, 5344, 3816, 139, -3614, -5314, -4002, -437, 3343, 5196, 4081, 644, -3146, -5115, -4154, -801, 3000, 5085, 4242, 961, -2900, -5119, -4439, -1228, 2684, 5063, 4569, 1475, -2451, -4971, -4646, -1689, 2217, 4831, 4673, 1829, -2052, -4776, -4776, -2053, 1843, 4711, 4916, 2325, -1584, -4605, -5030, -2633, 1233, 4381, 5031, 2838, -960, -4194, -5027, -2991, 736, 4024, 5012, 3103, -588, -3953, -5082, -3294, 370, 3822, 5080, 3438, -174, -3693, -5092, -3582, -24, 3531, 5061, 3698, 206, -3404, -5093, -3875, -465, 3215, 5066, 4054, 744, -2976, -5011, -4223, -1071, 2649, 4853, 4278, 1297, -2403, -4715, -4328, -1480, 2205, 4626, 4411, 1667, -2013, -4577, -4527, -1913, 1785, 4479, 4640, 2176, -1507, -4329, -4684, -2389, 1270, 4198, 4767, 2634, -984, -4041, -4811, -2874, 694, 3864, 4873, 3134, -329, -3591, -4794, -3301, 42, 3338, 4703, 3403, 166, -3125, -4632, -3463, -297, 3063, 4702, 3655, 520, -2944, -4753, -3876, -790, 2756, 4777, 4110, 1151, -2451, -4639, -4202, -1377, 2210, 4538, 4284, 1601, -1970, -4412, -4319, -1769, 1803, 4355, 4450, 2027, -1540, -4217, -4509, -2229, 1302, 4108, 4594, 2500, -1008, -3934, -4635, -2690, 768, 3811, 4719, 2973, -437, -3586, -4696, -3158, 157, 3368, 4659, 3310, 105, -3135, -4569, -3377, -260, 3020, 4571, 3544, 494, -2856, -4588, -3728, -748, 2680, 4608, 3961, 1097, -2363, -4491, -4065, -1350, 2112, 4370, 4122, 1546, -1908, -4238, -4149, -1662, 1787, 4224, 4265, 1862, -1599, -4164, -4340, -2057, 1396, 4052, 4399, 2261, -1155, -3885, -4375, -2366, 986, 3762, 4391, 2515, -791, -3634, -4402, -2661, 589, 3499, 4444, 2866, -312, -3286, -4364, -2956, 124, 3112, 4327, 3059, 56, -2979, -4305, -3164, -203, 2904, 4355, 3352, 429, -2743, -4367, -3533, -674, 2554, 4338, 3663, 906, -2347, -4263, -3732, -1067, 2220, 4246, 3867, 1276, -2054, -4217, -3994, -1501, 1853, 4158, 4122, 1770, -1567, -3988, -4126, -1935, 1349, 3831, 4130, 2054, -1179, -3719, -4122, -2174, 1035, 3654, 4206, 2373, -823, -3542, -4273, -2595, 554, 3381, 4300, 2804, -273, -3194, -4312, -2989, 11, 3008, 4307, 3172, 262, -2814, -4298, -3376, -567, 2546, 4222, 3529, 849, -2284, -4121, -3613, -1091, 2037, 3987, 3669, 1264, -1862, -3936, -3788, -1496, 1634, 3847, 3895, 1740, -1397, -3751, -3989, -1988, 1111, 3567, 3987, 2151, -915, -3460, -4022, -2310, 736, 3363, 4089, 2472, -549, -3289, -4170, -2702, 274, 3105, 4164, 2876, -35, -2909, -4119, -2977, -178, 2714, 4012, 3027, 302, -2589, -3994, -3123, -459, 2453, 3977, 3232, 676, -2277, -3913, -3328, -860, 2095, 3843, 3406, 1027, -1926, -3760, -3445, -1150, 1806, 3744, 3541, 1313, -1673, -3713, -3634, -1485, 1524, 3652, 3702, 1628, -1384, -3569, -3711, -1701, 1293, 3537, 3731, 1759, -1245, -3537, -3801, -1871, 1134, 3487, 3841, 1996, -980, -3368, -3815, -2093, 825, 3218, 3745, 2109, -729, -3133, -3703, -2138, 671, 3105, 3751, 2241, -557, -3052, -3817, -2401, 374, 2945, 3834, 2537, -201, -2810, -3802, -2609, 74, 2719, 3800, 2681, 15, -2676, -3849, -2823, -184, 2574, 3880, 2981, 391, -2419, -3862, -3116, -620, 2206, 3747, 3158, 757, -2049, -3659, -3185, -865, 1936, 3628, 3236, 984, -1846, -3640, -3351, -1162, 1707, 3578, 3415, 1282, -1582, -3546, -3487, -1430, 1437, 3481, 3503, 1506, -1367, -3471, -3602, -1678, 1189, 3378, 3631, 1821, -1029, -3283, -3670, -1984, 805, 3107, 3623, 2073, -652, -2993, -3624, -2195, 456, 2838, 3603, 2314, -282, -2691, -3602, -2439, 70, 2534, 3532, 2504, 58, -2433, -3522, -2595, -161, 2377, 3582, 2726, 303, -2332, -3669, -2929, -518, 2187, 3679, 3075, 737, -2015, -3610, -3153, -898, 1845, 3522, 3158, 992, -1737, -3460, -3198, -1087, 1638, 3435, 3268, 1256, -1476, -3358, -3327, -1423, 1277, 3234, 3341, 1553, -1101, -3112, -3324, -1633, 998, 3056, 3379, 1761, -866, -3019, -3453, -1923, 712, 2947, 3519, 2097, -510, -2805, -3502, -2189, 352, 2696, 3483, 2273, -244, -2593, -3473, -2351, 121, 2527, 3509, 2488, 65, -2389, -3475, -2603, -238, 2237, 3436, 2686, 391, -2104, -3391, -2732, -503, 2036, 3405, 2846, 652, -1924, -3446, -3014, -874, 1765, 3414, 3147, 1104, -1545, -3312, -3190, -1282, 1343, 3179, 3198, 1381, -1199, -3093, -3208, -1488, 1079, 3028, 3231, 1599, -946, -2941, -3245, -1677, 840, 2875, 3254, 1758, -747, -2824, -3261, -1830, 674, 2808, 3357, 1987, -516, -2745, -3419, -2176, 286, 2588, 3432, 2350, -21, -2364, -3341, -2438, -157, 2188, 3298, 2531, 333, -2036, -3251, -2605, -482, 1931, 3272, 2767, 705, -1753, -3232, -2879, -905, 1579, 3158, 2954, 1081, -1401, -3084, -3001, -1231, 1247, 3019, 3099, 1442, -1020, -2896, -3152, -1639, 767, 2723, 3162, 1822, -511, -2544, -3126, -1954, 315, 2403, 3141, 2092, -141, -2313, -3215, -2305, -101, 2175, 3254, 2519, 370, -1983, -3240, -2672, -627, 1752, 3118, 2714, 765, -1599, -3049, -2753, -901, 1459, 2980, 2803, 1039, -1322, -2944, -2912, -1256, 1095, 2818, 2955, 1446, -872, -2685, -2997, -1618, 661, 2556, 3021, 1766, -475, -2467, -3077, -1971, 253, 2326, 3105, 2133, -26, -2181, -3102, -2270, -168, 2017, 3039, 2326, 297, -1915, -3028, -2417, -432, 1809, 3030, 2541, 611, -1669, -3018, -2675, -846, 1449, 2926, 2763, 1057, -1232, -2817, -2823, -1246, 1038, 2719, 2885, 1423, -856, -2645, -2962, -1612, 643, 2524, 2991, 1773, -440, -2393, -2985, -1869, 303, 2302, 2984, 1946, -213, -2273, -3044, -2075, 91, 2236, 3139, 2267, 112, -2113, -3165, -2447, -353, 1913, 3097, 2534, 551, -1705, -2967, -2537, -664, 1576, 2914, 2584, 783, -1451, -2866, -2651, -928, 1326, 2831, 2746, 1123, -1115, -2704, -2758, -1245, 955, 2600, 2738, 1338, -829, -2514, -2752, -1416, 732, 2483, 2830, 1586, -571, -2405, -2896, -1757, 375, 2294, 2922, 1928, -156, -2129, -2889, -2007, 13, 2024, 2878, 2113, 142, -1896, -2858, -2171, -251, 1812, 2839, 2231, 357, -1720, -2788, -2244, -395, 1692, 2796, 2308, 467, -1641, -2826, -2378, -566, 1585, 2853, 2514, 763, -1424, -2779, -2572, -898, 1253, 2704, 2609, 1056, -1084, -2579, -2593, -1138, 979, 2533, 2663, 1276, -807, -2443, -2677, -1414, 659, 2355, 2710, 1552, -477, -2217, -2683, -1599, 389, 2177, 2718, 1696, -303, -2140, -2781, -1834, 172, 2109, 2868, 2030, 66, -1936, -2834, -2144, -261, 1739, 2731, 2166, 384, -1587, -2609, -2135, -430, 1518, 2580, 2156, 489, -1465, -2589, -2220, -578, 1402, 2593, 2322, 733, -1274, -2542, -2367, -851, 1158, 2507, 2420, 969, -1049, -2451, -2478, -1086, 941, 2430, 2561, 1241, -786, -2356, -2585, -1336, 679, 2299, 2609, 1412, -598, -2267, -2640, -1482, 546, 2279, 2710, 1589, -467, -2254, -2765, -1708, 333, 2184, 2786, 1822, -172, -2056, -2750, -1876, 60, 1942, 2723, 1942, 68, -1831, -2674, -2008, -208, 1706, 2642, 2077, 329, -1583, -2586, -2113, -441, 1497, 2569, 2168, 508, -1447, -2599, -2258, -623, 1391, 2622, 2369, 775, -1270, -2582, -2438, -902, 1108, 2460, 2377, 938, -1025, -2352, -2304, -898, 1018, 2334, 2276, 880, -1050, -2390, -2371, -989, 974, 2396, 2478, 1161, -815, -2322, -2533, -1325, 603, 2170, 2482, 1384, -508, -2088, -2470, -1425, 437, 2029, 2460, 1470, -374, -2023, -2523, -1586, 251, 1932, 2507, 1649, -156, -1867, -2507, -1724, 36, 1758, 2498, 1791, 68, -1705, -2509, -1915, -225, 1584, 2495, 2004, 357, -1478, -2481, -2085, -505, 1353, 2456, 2132, 604, -1293, -2470, -2250, -757, 1179, 2459, 2349, 904, -1055, -2440, -2452, -1106, 845, 2315, 2468, 1227, -694, -2223, -2497, -1353, 515, 2091, 2468, 1436, -410, -2029, -2501, -1576, 226, 1872, 2442, 1616, -119, -1780, -2419, -1664, 28, 1687, 2357, 1648, -21, -1707, -2443, -1773, -111, 1653, 2476, 1919, 272, -1522, -2470, -2054, -500, 1302, 2353, 2066, 643, -1131, -2240, -2068, -732, 1001, 2150, 2065, 790, -948, -2148, -2126, -897, 864, 2131, 2199, 991, -779, -2128, -2270, -1105, 694, 2113, 2310, 1182, -633, -2127, -2425, -1356, 486, 2051, 2451, 1493, -321, -1920, -2436, -1581, 136, 1733, 2330, 1593, -29, -1596, -2246, -1579, -29, 1533, 2219, 1627, 117, -1472, -2232, -1727, -264, 1362, 2217, 1831, 416, -1224, -2175, -1897, -546, 1103, 2135, 1938, 644, -1026, -2132, -2024, -765, 945, 2138, 2106, 902, -838, -2095, -2170, -1024, 720, 2025, 2175, 1076, -649, -2000, -2187, -1124, 624, 1999, 2262, 1208, -538, -1985, -2300, -1307, 431, 1933, 2343, 1422, -295, -1819, -2300, -1463, 187, 1742, 2290, 1532, -79, -1656, -2284, -1617, -27, 1583, 2305, 1740, 196, -1434, -2253, -1792, -324, 1329, 2230, 1871, 452, -1229, -2222, -1964, -600, 1117, 2219, 2089, 793, -934, -2130, -2134, -942, 750, 2010, 2116, 1037, -605, -1880, -2059, -1052, 557, 1858, 2076, 1117, -512, -1850, -2141, -1221, 422, 1839, 2253, 1400, -222, -1715, -2231, -1489, 79, 1602, 2197, 1550, 25, -1502, -2165, -1564, -69, 1485, 2200, 1665, 186, -1409, -2186, -1759, -327, 1290, 2164, 1833, 479, -1122, -2065, -1821, -556, 1021, 1994, 1823, 604, -951, -1960, -1837, -652, 909, 1971, 1907, 762, -834, -1948, -1964, -837, 766, 1947, 2028, 946, -671, -1910, -2071, -1036, 581, 1879, 2123, 1158, -450, -1798, -2129, -1241, 332, 1716, 2112, 1297, -249, -1649, -2105, -1336, 200, 1612, 2123, 1407, -87, -1550, -2106, -1481, -14, 1441, 2058, 1512, 115, -1308, -1953, -1437, -91, 1300, 1912, 1404, 55, -1338, -1956, -1427, -53, 1391, 2062, 1580, 177, -1323, -2091, -1678, -304, 1228, 2078, 1738, 425, -1104, -1985, -1703, -442, 1087, 2000, 1776, 528, -1013, -1973, -1809, -592, 951, 1985, 1890, 748, -798, -1885, -1884, -810, 721, 1811, 1877, 873, -632, -1749, -1867, -885, 614, 1771, 1925, 977, -528, -1735, -1926, -1023, 488, 1730, 1986, 1106, -401, -1674, -1961, -1110, 398, 1687, 2024, 1209, -296, -1624, -2000, -1245, 239, 1576, 2008, 1303, -136, -1478, -1943, -1272, 135, 1466, 1942, 1308, -82, -1433, -1964, -1372, 19, 1408, 2017, 1489, 136, -1277, -1969, -1535, -262, 1159, 1887, 1545, 328, -1065, -1839, -1556, -374, 1020, 1839, 1610, 465, -959, -1836, -1698, -585, 849, 1811, 1740, 691, -755, -1746, -1750, -744, 689, 1736, 1765, 770, -683, -1748, -1815, -817, 655, 1781, 1884, 914, -585, -1757, -1927, -998, 496, 1701, 1931, 1055, -411, -1650, -1937, -1126, 316, 1590, 1959, 1216, -204, -1503, -1955, -1314, 49, 1377, 1905, 1358, 40, -1278, -1856, -1358, -75, 1216, 1809, 1339, 83, -1230, -1854, -1409, -146, 1221, 1902, 1507, 238, -1167, -1927, -1601, -369, 1061, 1900, 1657, 465, -993, -1893, -1720, -581, 889, 1855, 1756, 678, -796, -1812, -1805, -777, 667, 1707, 1751, 788, -612, -1634, -1712, -795, 570, 1581, 1667, 780, -560, -1591, -1724, -877, 461, 1520, 1721, 944, -369, -1477, -1770, -1068, 226, 1384, 1745, 1105, -181, -1392, -1836, -1237, 75, 1347, 1854, 1309, -8, -1332, -1913, -1419, -118, 1205, 1818, 1358, 109, -1205, -1813, -1343, -110, 1190, 1768, 1301, 57, -1241, -1850, -1413, -175, 1146, 1818, 1451, 280, -1060, -1798, -1541, -437, 890, 1691, 1530, 500, -835, -1697, -1618, -615, 733, 1682, 1674, 707, -687, -1696, -1781, -848, 560, 1639, 1782, 896, -509, -1617, -1798, -949, 443, 1569, 1777, 960, -404, -1538, -1794, -1036, 299, 1457, 1761, 1071, -218, -1365, -1716, -1090, 153, 1291, 1684, 1104, -102, -1266, -1711, -1181, 36, 1239, 1757, 1302, 105, -1139, -1751, -1372, -238, 1016, 1688, 1391, 321, -912, -1608, -1367, -337, 882, 1604, 1382, 384, -860, -1605, -1431, -443, 820, 1609, 1498, 534, -729, -1581, -1538, -628, 653, 1547, 1578, 710, -555, -1500, -1594, -792, 452, 1429, 1602, 878, -314, -1320, -1559, -935, 215, 1210, 1492, 927, -159, -1134, -1456, -925, 152, 1144, 1497, 974, -102, -1152, -1555, -1079, 33, 1138, 1634, 1191, 64, -1108, -1676, -1289, -160, 1077, 1716, 1381, 255, -1041, -1742, -1484, -378, 922, 1702, 1516, 482, -789, -1580, -1471, -538, 658, 1435, 1362, 502, -639, -1376, -1318, -484, 615, 1359, 1328, 536, -584, -1379, -1431, -675, 454, 1332, 1476, 796, -345, -1275, -1501, -864, 268, 1253, 1514, 898, -247, -1269, -1564, -956, 222, 1276, 1613, 1006, -163, -1256, -1617, -1057, 108, 1185, 1573, 1053, -60, -1117, -1535, -1066, 3, 1060, 1505, 1102, 91, -960, -1474, -1166, -205, 857, 1448, 1206, 297, -796, -1430, -1260, -343, 800, 1502, 1359, 411, -814, -1602, -1478, -495, 789, 1647, 1565, 593, -689, -1539, -1482, -578, 625, 1402, 1334, 481, -604, -1306, -1210, -425, 578, 1227, 1180, 489, -456, -1145, -1243, -699, 196, 995, 1283, 885, -15, -947, -1383, -1037, -35, 1058, 1592, 1142, -72, -1375, -1913, -1306, 169, 1584, 2090, 1332, -182, -1457, -1680, -793, 448, 1019, 460, -814, -1613, -901, 1271, 3552, 4163, 2055, -2183, -6368, -7883, -5290, 720, 7423, 11311, 10045, 3775, -4830, -11825, -13920, -10113, -1970, 7335, 14189, 15786, 11238, 2007, -8554, -16458, -18517, -13462, -2716, 9963, 19543, 21875, 15419, 2309, -12365, -22652, -24231, -16173, -1376, 14319, 24508, 25067, 15919, 704, -14705, -24560, -25182, -16280, -1187, 14419, 24621, 25651, 17132, 2141, -13857, -24817, -26405, -17888, -2486, 13930, 25068, 26703, 18184, 2760, -13717, -24942, -26593, -18086, -2765, 13421, 24322, 25913, 17763, 3033, -12652, -23264, -24882, -17180, -3394, 11211, 21321, 23478, 17102, 4802, -8872, -19112, -22466, -17903, -7061, 6299, 17538, 22666, 19699, 9514, -4353, -16857, -23332, -21233, -11158, 3242, 16599, 23858, 22230, 12226, -2397, -16136, -23829, -22624, -12974, 1536, 15400, 23399, 22628, 13535, -484, -14156, -22432, -22315, -14038, -826, 12421, 21006, 21999, 15227, 3107, -10105, -19807, -22570, -17244, -5620, 8328, 19621, 24025, 19609, 7666, -7535, -20262, -25590, -21232, -8666, 7470, 20952, 26562, 22034, 9066, -7393, -21025, -26623, -22129, -9304, 6936, 20369, 25990, 21856, 9720, -5798, -18945, -24910, -21673, -10572, 4143, 17106, 23673, 21614, 11773, -2162, -15123, -22515, -21768, -13262, -56, 13079, 21487, 22209, 14985, 2335, -11249, -20855, -23007, -16772, -4271, 9997, 20712, 23812, 18022, 5401, -9346, -20590, -24028, -18359, -5827, 8728, 19739, 23158, 17923, 6262, -7335, -17870, -21640, -17561, -7365, 5128, 15475, 20165, 17741, 9168, -2468, -13131, -19170, -18520, -11374, -174, 11245, 18806, 19753, 13565, 2318, -10003, -18885, -20928, -15203, -3711, 9311, 18932, 21479, 15994, 4541, -8538, -18339, -21247, -16258, -5386, 7274, 17054, 20474, 16446, 6588, -5454, -15385, -19721, -16995, -8232, 3403, 13742, 19154, 17721, 9958, -1384, -12277, -18830, -18681, -11767, -512, 11096, 18800, 19755, 13452, 2095, -10242, -18950, -20717, -14769, -3222, 9654, 18976, 21229, 15531, 4042, -8921, -18509, -21143, -15929, -4911, 7750, 17367, 20495, 16180, 6131, -5914, -15647, -19700, -16758, -7955, 3554, 13742, 19097, 17766, 10157, -1119, -12157, -19034, -19209, -12450, -995, 11060, 19290, 20530, 14160, 2363, -10505, -19597, -21438, -15240, -3290, 9873, 19299, 21444, 15585, 4004, -8887, -18323, -20896, -15822, -5126, 7195, 16661, 19989, 16171, 6685, -5036, -14858, -19386, -17056, -8711, 2730, 13228, 19101, 18186, 10722, -740, -12107, -19264, -19497, -12573, -862, 11370, 19579, 20591, 13891, 1884, -10974, -19812, -21239, -14667, -2554, 10499, 19507, 21128, 14857, 3173, -9505, -18444, -20492, -15063, -4339, 7716, 16776, 19732, 15673, 6126, -5509, -15140, -19436, -16874, -8289, 3319, 13868, 19549, 18240, 10278, -1578, -13053, -19918, -19534, -11911, 257, 12495, 20204, 20420, 12985, 624, -12041, -20210, -20807, -13616, -1367, 11289, 19625, 20571, 13898, 2220, -10081, -18469, -20013, -14295, -3566, 8257, 16920, 19437, 15031, 5340, -6174, -15479, -19313, -16296, -7430, 4221, 14495, 19669, 17732, 9229, -2850, -14104, -20283, -18977, -10502, 2071, 14009, 20743, 19646, 11109, -1657, -13774, -20652, -19702, -11361, 1156, 13079, 19967, 19350, 11612, -248, -11787, -18824, -18932, -12211, -1207, 10076, 17617, 18802, 13292, 3047, -8279, -16679, -19159, -14744, -4927, 6845, 16291, 19913, 16205, 6385, -5997, -16342, -20682, -17245, -7226, 5647, 16450, 21034, 17627, 7553, -5348, -16131, -20761, -17553, -7839, 4656, 15216, 19990, 17375, 8474, -3347, -13776, -19106, -17520, -9662, 1606, 12259, 18506, 18134, 11224, 230, -10973, -18314, -19055, -12816, -1749, 10140, 18439, 19984, 14087, 2835, -9616, -18572, -20606, -14869, -3497, 9245, 18522, 20791, 15249, 4010, -8652, -17959, -20452, -15305, -4550, 7709, 16944, 19831, 15452, 5544, -6205, -15549, -19187, -15924, -6974, 4431, 14255, 18985, 16922, 8724, -2720, -13322, -19202, -18108, -10287, 1505, 12938, 19705, 19178, 11422, -747, -12743, -20006, -19732, -11978, 300, 12463, 19869, 19764, 12271, 284, -11654, -19105, -19421, -12603, -1320, 10260, 17938, 19042, 13324, 2918, -8410, -16662, -18958, -14501, -4876, 6553, 15708, 19305, 15974, 6793, -5007, -15161, -19893, -17327, -8262, 4029, 14979, 20415, 18248, 9184, -3387, -14710, -20504, -18571, -9659, 2853, 14215, 20145, 18535, 10048, -2023, -13182, -19312, -18265, -10577, 828, 11759, 18296, 18190, 11586, 913, -10005, -17304, -18436, -12998, -2873, 8367, 16735, 19166, 14682, 4758, -7067, -16499, -19976, -16074, -6113, 6281, 16459, 20545, 16955, 7004, -5578, -16057, -20488, -17257, -7635, 4709, 15167, 19892, 17270, 8390, -3373, -13718, -18924, -17265, -9453, 1625, 11963, 17956, 17535, 10911, 444, -10185, -17227, -18165, -12592, -2413, 8787, 16968, 19064, 14199, 3989, -7884, -16992, -19877, -15319, -4957, 7391, 17024, 20290, 15890, 5523, -6905, -16671, -20122, -16035, -6008, 6133, 15841, 19569, 16080, 6783, -4814, -14494, -18802, -16294, -7990, 3077, 12951, 18177, 16942, 9685, -1010, -11420, -17828, -17909, -11537, -895, 10253, 17860, 19026, 13235, 2423, -9440, -17957, -19872, -14367, -3432, 8848, 17845, 20164, 14943, 4177, -8063, -17202, -19854, -15174, -4989, 6854, 16004, 19193, 15417, 6152, -5170, -14489, -18540, -15971, -7754, 3188, 12959, 18129, 16860, 9570, -1204, -11660, -18039, -17983, -11379, -515, 10703, 18152, 19013, 12837, 1818, -10035, -18252, -19744, -13855, -2763, 9392, 18009, 19875, 14325, 3483, -8542, -17277, -19541, -14624, -4451, 7159, 15992, 18912, 15002, 5793, -5369, -14503, -18412, -15759, -7541, 3372, 13087, 18169, 16775, 9336, -1556, -12015, -18254, -17911, -10997, 66, 11260, 18407, 18803, 12173, 934, -10766, -18487, -19322, -12900, -1639, 10204, 18151, 19253, 13169, 2255, -9349, -17342, -18832, -13435, -3215, 7983, 16127, 18326, 13924, 4584, -6324, -14902, -18145, -14898, -6311, 4583, 13897, 18279, 16074, 7974, -3164, -13312, -18705, -17258, -9369, 2130, 12973, 19055, 18033, 10219, -1483, -12656, -19076, -18313, -10673, 892, 12028, 18546, 18091, 10964, -93, -10933, -17591, -17742, -11468, -1169, 9405, 16464, 17571, 12382, 2817, -7742, -15530, -17786, -13668, -4581, 6254, 14971, 18330, 15025, 6154, -5141, -14682, -18906, -16143, -7313, 4341, 14480, 19239, 16827, 8094, -3663, -14027, -19110, -17048, -8676, 2827, 13150, 18496, 16989, 9308, -1635, -11833, -17608, -16966, -10249, 70, 10260, 16716, 17187, 11518, 1733, -8711, -16091, -17736, -12986, -3462, 7456, 15793, 18453, 14340, 4869, -6559, -15697, -19074, -15347, -5801, 6000, 15579, 19338, 15805, 6341, -5472, -15142, -19053, -15805, -6719, 4736, 14245, 18347, 15668, 7328, -3526, -12913, -17503, -15717, -8327, 1987, 11523, 16918, 16238, 9734, -327, -10356, -16722, -17074, -11169, -1045, 9645, 16924, 18020, 12389, 2022, -9257, -17156, -18666, -13106, -2554, 9001, 17178, 18850, 13412, 2974, -8499, -16673, -18520, -13466, -3510, 7595, 15737, 17995, 13688, 4486, -6217, -14550, -17557, -14240, -5813, 4672, 13495, 17465, 15153, 7336, -3228, -12717, -17673, -16187, -8734, 2046, 12201, 17943, 17088, 9845, -1141, -11805, -18108, -17674, -10625, 430, 11331, 17971, 17885, 11131, 285, -10564, -17396, -17707, -11499, -1157, 9446, 16466, 17412, 12053, 2444, -7937, -15365, -17240, -12931, -4004, 6379, 14503, 17464, 14131, 5634, -5006, -13972, -17897, -15282, -6957, 4056, 13699, 18334, 16172, 7941, -3291, -13355, -18428, -16601, -8573, 2649, 12815, 18146, 16690, 9083, -1798, -11855, -17422, -16513, -9611, 690, 10575, 16508, 16423, 10467, 825, -9026, -15613, -16593, -11658, -2494, 7638, 15111, 17203, 13031, 4025, -6634, -15015, -17944, -14211, -5084, 6089, 15101, 18497, 14912, 5680, -5742, -14981, -18536, -15102, -6003, 5235, 14381, 18054, 14986, 6467, -4276, -13268, -17285, -15001, -7353, 2817, 11864, 16593, 15369, 8659, -1149, -10571, -16270, -16140, -10186, -455, 9581, 16243, 17023, 11551, 1711, -8904, -16341, -17777, -12610, -2685, 8291, 16215, 18110, 13257, 3482, -7536, -15716, -18017, -13689, -4372, 6407, 14717, 17569, 14016, 5463, -4931, -13424, -17010, -14502, -6864, 3171, 12020, 16553, 15199, 8409, -1408, -10789, -16359, -16081, -9969, -166, 9815, 16321, 16902, 11272, 1395, -9099, -16333, -17546, -12262, -2369, 8439, 16124, 17797, 12867, 3169, -7658, -15579, -17697, -13299, -4083, 6523, 14598, 17289, 13683, 5201, -5057, -13395, -16863, -14302, -6645, 3343, 12132, 16579, 15105, 8215, -1678, -11045, -16506, -16048, -9744, 179, 10164, 16517, 16881, 11024, 1032, -9426, -16478, -17466, -11993, -2042, 8666, 16154, 17632, 12593, 2931, -7731, -15446, -17427, -13031, -3961, 6410, 14303, 16934, 13452, 5212, -4787, -12988, -16512, -14153, -6779, 3007, 11724, 16297, 15052, 8389, -1383, -10780, -16379, -16070, -9856, 69, 10087, 16487, 16848, 10924, 900, -9549, -16462, -17284, -11685, -1757, 8779, 15996, 17253, 12160, 2656, -7702, -15131, -16989, -12684, -3883, 6195, 13912, 16579, 13304, 5303, -4527, -12711, -16355, -14187, -6944, 2789, 11578, 16252, 15101, 8463, -1338, -10761, -16368, -16032, -9782, 163, 10135, 16430, 16643, 10651, 661, -9599, -16275, -16890, -11242, -1443, 8802, 15699, 16755, 11661, 2354, -7681, -14812, -16486, -12202, -3575, 6247, 13730, 16247, 12929, 5012, -4670, -12674, -16144, -13840, -6549, 3144, 11794, 16255, 14858, 8034, -1822, -11138, -16467, -15773, -9202, 844, 10678, 16598, 16372, 10020, -70, -10115, -16362, -16483, -10496, -686, 9263, 15681, 16280, 10946, 1729, -7970, -14651, -15976, -11571, -3078, 6423, 13581, 15858, 12486, 4650, -4855, -12658, -15960, -13531, -6154, 3541, 12063, 16282, 14569, 7455, -2507, -11660, -16558, -15321, -8333, 1818, 11360, 16674, 15763, 8976, -1143, -10776, -16348, -15818, -9459, 321, 9881, 15710, 15757, 10095, 864, -8582, -14815, -15688, -10933, -2294, 7124, 13970, 15811, 12009, 3883, -5664, -13245, -16090, -13130, -5357, 4480, 12792, 16505, 14161, 6546, -3592, -12477, -16777, -14814, -7293, 2980, 12139, 16741, 15083, 7812, -2288, -11436, -16229, -14999, -8280, 1357, 10364, 15480, 14953, 9064, -20, -9010, -14708, -15104, -10093, -1456, 7721, 14161, 15529, 11293, 2913, -6617, -13817, -16021, -12364, -4084, 5794, 13642, 16499, 13247, 5030, -5109, -13410, -16728, -13808, -5705, 4539, 13081, 16721, 14129, 6305, -3785, -12374, -16287, -14176, -6894, 2788, 11315, 15640, 14280, 7820, -1348, -9935, -14924, -14562, -9022, -252, 8630, 14487, 15177, 10387, 1771, -7599, -14315, -15857, -11546, -2902, 6946, 14290, 16372, 12322, 3645, -6449, -14130, -16518, -12698, -4145, 5928, 13704, 16324, 12861, 4685, -5127, -12919, -15879, -12989, -5408, 4050, 11933, 15412, 13312, 6435, -2705, -10843, -15045, -13852, -7651, 1333, 9895, 14938, 14605, 8936, -69, -9169, -15007, -15368, -10029, -870, 8699, 15119, 15936, 10783, 1556, -8271, -14997, -16101, -11177, -2129, 7641, 14482, 15899, 11456, 2889, -6621, -13589, -15549, -11872, -3967, 5258, 12528, 15247, 12516, 5307, -3789, -11544, -15171, -13357, -6711, 2423, 10751, 15236, 14194, 7951, -1312, -10177, -15359, -14907, -8905, 464, 9718, 15387, 15331, 9548, 185, -9218, -15174, -15442, -9973, -839, 8518, 14644, 15306, 10354, 1679, -7514, -13859, -15137, -10931, -2827, 6227, 12980, 15062, 11738, 4201, -4859, -12212, -15211, -12742, -5633, 3592, 11600, 15451, 13696, 6875, -2553, -11127, -15652, -14421, -7830, 1689, 10608, 15577, 14786, 8503, -878, -9878, -15189, -14869, -9106, -80, 8855, 14476, 14789, 9759, 1260, -7599, -13641, -14755, -10602, -2678, 6172, 12791, 14833, 11580, 4155, -4801, -12109, -15103, -12663, -5607, 3599, 11593, 15426, 13608, 6731, -2732, -11271, -15683, -14270, -7529, 2018, 10807, 15536, 14458, 8042, -1286, -10038, -15000, -14433, -8628, 200, 8835, 14167, 14352, 9411, 1155, -7448, -13340, -14475, -10465, -2733, 5955, 12564, 14697, 11577, 4269, -4651, -11977, -15051, -12693, -5690, 3468, 11458, 15305, 13545, 6736, -2622, -11084, -15461, -14113, -7516, 1873, 10524, 15212, 14227, 7969, -1183, -9785, -14710, -14172, -8501, 185, 8675, 13901, 14067, 9165, 1016, -7434, -13208, -14234, -10189, -2481, 6148, 12612, 14569, 11258, 3820, -5104, -12281, -15035, -12317, -5038, 4171, 11901, 15297, 13046, 5957, -3355, -11463, -15334, -13560, -6792, 2448, 10734, 15039, 13793, 7512, -1452, -9793, -14501, -13907, -8311, 198, 8544, 13735, 13979, 9238, 1237, -7172, -13022, -14240, -10376, -2783, 5864, 12467, 14631, 11488, 4111, -4845, -12141, -15026, -12390, -5134, 4084, 11826, 15193, 12909, 5813, -3449, -11395, -15072, -13126, -6346, 2732, 10716, 14670, 13199, 6901, -1843, -9824, -14152, -13288, -7613, 776, 8826, 13637, 13503, 8499, 424, -7797, -13213, -13865, -9516, -1687, 6809, 12905, 14341, 10564, 2871, -5966, -12716, -14846, -11501, -3847, 5308, 12561, 15146, 12095, 4496, -4770, -12241, -15101, -12326, -5023, 4063, 11499, 14632, 12353, 5635, -3027, -10457, -14043, -12562, -6590, 1695, 9352, 13631, 13025, 7723, -406, -8440, -13471, -13657, -8831, -717, 7768, 13451, 14213, 9724, 1578, -7201, -13365, -14568, -10359, -2280, 6658, 13110, 14689, 10815, 2953, -5977, -12635, -14577, -11118, -3605, 5179, 11967, 14301, 11406, 4379, -4147, -11086, -13940, -11741, -5335, 2966, 10165, 13713, 12324, 6507, -1704, -9346, -13664, -13019, -7599, 706, 8843, 13808, 13698, 8484, 66, -8423, -13780, -14007, -8993, -620, 7955, 13546, 14065, 9376, 1276, -7230, -12958, -13898, -9700, -1991, 6383, 12374, 13792, 10191, 2902, -5389, -11676, -13681, -10699, -3819, 4449, 11104, 13744, 11380, 4868, -3477, -10595, -13874, -12065, -5786, 2712, 10300, 14131, 12731, 6568, -2108, -10022, -14220, -13076, -7021, 1659, 9694, 14061, 13160, 7375, -1091, -9052, -13563, -13041, -7743, 337, 8182, 12976, 13007, 8325, 668, -7186, -12422, -13144, -9107, -1762, 6254, 12041, 13471, 9994, 2813, -5479, -11812, -13868, -10799, -3701, 4843, 11653, 14174, 11441, 4437, -4250, -11350, -14240, -11824, -5021, 3601, 10847, 14026, 12030, 5625, -2760, -10046, -13582, -12165, -6352, 1680, 9030, 13073, 12409, 7314, -396, -7968, -12694, -12870, -8399, -837, 7115, 12561, 13458, 9417, 1831, -6505, -12506, -13885, -10091, -2518, 6033, 12340, 14051, 10542, 3129, -5412, -11891, -13943, -10829, -3742, 4671, 11322, 13755, 11130, 4446, -3821, -10607, -13456, -11359, -5143, 2897, 9827, 13153, 11701, 6026, -1812, -8976, -12913, -12194, -7023, 744, 8318, 12931, 12844, 8015, 154, -7848, -12988, -13340, -8709, -818, 7394, 12854, 13529, 9204, 1503, -6697, -12380, -13474, -9659, -2353, 5745, 11700, 13374, 10190, 3356, -4660, -10946, -13231, -10754, -4404, 3510, 10127, 13096, 11347, 5521, -2301, -9297, -12984, -12006, -6680, 1107, 8573, 12975, 12698, 7749, -93, -7992, -13016, -13253, -8589, -712, 7444, 12836, 13466, 9107, 1420, -6725, -12325, -13373, -9539, -2325, 5650, 11475, 13115, 10032, 3388, -4419, -10590, -12957, -10697, -4611, 3124, 9739, 12874, 11380, 5766, -1958, -9032, -12874, -12070, -6869, 879, 8377, 12875, 12680, 7808, 28, -7843, -12859, -13140, -8539, -762, 7293, 12643, 13280, 9009, 1450, -6567, -12076, -13127, -9396, -2335, 5498, 11230, 12884, 9925, 3444, -4209, -10336, -12760, -10640, -4699, 2934, 9547, 12778, 11392, 5889, -1826, -8940, -12855, -12121, -6931, 853, 8377, 12864, 12628, 7731, -60, -7828, -12726, -12922, -8357, -743, 7105, 12296, 12955, 8879, 1616, -6165, -11636, -12858, -9442, -2658, 5030, 10863, 12760, 10080, 3794, -3846, -10105, -12748, -10805, -4960, 2706, 9443, 12792, 11523, 6023, -1715, -8895, -12868, -12138, -6931, 873, 8381, 12826, 12528, 7591, -139, -7812, -12580, -12693, -8168, -672, 6986, 12061, 12675, 8711, 1609, -6009, -11411, -12641, -9334, -2683, 4888, 10642, 12557, 9949, 3773, -3750, -9937, -12551, -10670, -4927, 2639, 9286, 12623, 11374, 5932, -1756, -8888, -12793, -11988, -6706, 1115, 8543, 12799, 12254, 7142, -615, -8093, -12526, -12284, -7529, -77, 7327, 11950, 12203, 8018, 964, -6379, -11352, -12211, -8661, -2000, 5361, 10766, 12276, 9354, 3043, -4381, -10237, -12420, -10098, -4106, 3426, 9773, 12600, 10818, 5026, -2666, -9466, -12784, -11383, -5730, 2062, 9097, 12751, 11666, 6264, -1413, -8512, -12418, -11747, -6802, 565, 7653, 11928, 11850, 7501, 461, -6715, -11452, -12040, -8275, -1509, 5809, 11034, 12253, 9022, 2488, -4971, -10640, -12476, -9740, -3415, 4228, 10364, 12729, 10395, 4159, -3673, -10195, -12922, -10826, -4655, 3261, 9945, 12876, 10983, 5021, -2764, -9426, -12544, -11018, -5475, 1989, 8637, 12096, 11135, 6165, -1012, -7789, -11733, -11424, -6970, 7, 7005, 11469, 11762, 7764, 900, -6334, -11286, -12117, -8487, -1693, 5783, 11169, 12429, 9062, 2289, -5371, -11054, -12594, -9423, -2721, 4965, 10758, 12499, 9595, 3153, -4387, -10236, -12276, -9803, -3786, 3562, 9568, 12060, 10152, 4569, -2691, -8969, -11985, -10638, -5390, 1845, 8437, 11950, 11090, 6129, -1127, -8005, -11961, -11511, -6805, 470, 7607, 11952, 11846, 7306, 17, -7301, -11883, -12016, -7646, -434, 6908, 11620, 11976, 7897, 918, -6304, -11136, -11841, -8212, -1629, 5494, 10570, 11777, 8704, 2470, -4649, -10088, -11858, -9329, -3361, 3853, 9718, 12034, 9928, 4108, -3274, -9513, -12252, -10435, -4719, 2809, 9303, 12337, 10737, 5116, -2434, -9037, -12245, -10872, -5468, 1925, 8542, 11940, 10910, 5892, -1247, -7855, -11557, -11026, -6500, 346, 7053, 11173, 11242, 7230, 595, -6284, -10898, -11573, -8025, -1509, 5608, 10722, 11917, 8706, 2230, -5145, -10656, -12221, -9217, -2738, 4786, 10508, 12278, 9427, 3045, -4435, -10215, -12127, -9525, -3410, 3893, 9676, 11831, 9617, 3916, -3195, -9082, -11635, -9928, -4610, 2401, 8521, 11542, 10317, 5300, -1707, -8098, -11547, -10731, -5951, 1050, 7691, 11487, 11045, 6481, -497, -7328, -11449, -11336, -7001, -46, 6942, 11355, 11522, 7378, 471, -6596, -11177, -11572, -7657, -928, 6086, 10769, 11452, 7916, 1506, -5387, -10272, -11402, -8392, -2356, 4529, 9774, 11472, 9005, 3213, -3802, -9472, -11712, -9632, -3976, 3210, 9263, 11900, 10108, 4529, -2777, -9053, -11947, -10381, -4941, 2352, 8723, 11833, 10509, 5280, -1868, -8278, -11579, -10573, -5678, 1252, 7680, 11233, 10656, 6189, -514, -7016, -10939, -10866, -6831, -281, 6393, 10742, 11171, 7488, 994, -5894, -10658, -11485, -8031, -1580, 5499, 10550, 11685, 8450, 2058, -5112, -10375, -11747, -8729, -2462, 4710, 10110, 11723, 8964, 2876, -4246, -9732, -11577, -9126, -3338, 3622, 9199, 11369, 9390, 3999, -2806, -8579, -11235, -9798, -4824, 1959, 8056, 11266, 10373, 5653, -1210, -7684, -11368, -10828, -6259, 689, 7408, 11383, 11103, 6681, -223, -7022, -11181, -11153, -6983, -234, 6552, 10869, 11129, 7272, 766, -5971, -10447, -11035, -7553, -1336, 5334, 9991, 10974, 7962, 2062, -4555, -9501, -10979, -8467, -2849, 3845, 9180, 11191, 9102, 3633, -3236, -8958, -11406, -9599, -4181, 2849, 8852, 11559, 9949, 4626, -2426, -8545, -11448, -10062, -4937, 1992, 8153, 11245, 10186, 5382, -1353, -7522, -10900, -10243, -5843, 656, 6907, 10606, 10456, 6490, 179, -6212, -10349, -10726, -7180, -965, 5655, 10259, 11124, 7873, 1672, -5197, -10188, -11384, -8318, -2096, 4922, 10124, 11514, 8589, 2473, -4524, -9771, -11334, -8668, -2828, 4000, 9298, 11117, 8865, 3397, -3249, -8670, -10902, -9158, -4068, 2505, 8174, 10867, 9608, 4823, -1748, -7704, -10875, -10032, -5503, 1103, 7335, 10894, 10445, 6133, -480, -6918, -10822, -10711, -6631, -84, 6486, 10659, 10871, 7059, 655, -5966, -10360, -10918, -7442, -1265, 5341, 9939, 10867, 7827, 1948, -4606, -9463, -10862, -8305, -2730, 3828, 8996, 10897, 8840, 3556, -3039, -8576, -11002, -9410, -4340, 2366, 8253, 11128, 9900, 4985, -1812, -7962, -11165, -10202, -5447, 1339, 7591, 10995, 10291, 5790, -814, -7043, -10631, -10257, -6152, 153, 6353, 10178, 10281, 6645, 609, -5621, -9821, -10449, -7267, -1417, 4993, 9609, 10723, 7869, 2070, -4574, -9557, -11034, -8387, -2587, 4213, 9455, 11155, 8662, 2910, -3921, -9267, -11127, -8832, -3275, 3447, 8828, 10896, 8920, 3675, -2873, -8308, -10661, -9105, -4247, 2140, 7704, 10441, 9361, 4856, -1421, -7202, -10356, -9755, -5557, 704, 6744, 10327, 10109, 6139, -150, -6431, -10375, -10461, -6656, -330, 6128, 10322, 10638, 6976, 686, -5856, -10185, -10702, -7234, -1082, 5427, 9873, 10606, 7408, 1497, -4934, -9485, -10519, -7676, -2043, 4314, 9045, 10440, 8002, 2642, -3717, -8713, -10540, -8489, -3298, 3145, 8465, 10677, 8936, 3828, -2740, -8348, -10864, -9328, -4299, 2349, 8113, 10844, 9506, 4629, -1963, -7784, -10709, -9637, -5028, 1411, 7267, 10408, 9706, 5461, -759, -6661, -10097, -9843, -5999, -5, 5982, 9787, 10047, 6632, 803, -5359, -9606, -10373, -7323, -1553, 4866, 9533, 10697, 7893, 2118, -4484, -9447, -10898, -8272, -2577, 4066, 9178, 10869, 8548, 3072, -3501, -8746, -10752, -8817, -3658, 2813, 8214, 10601, 9095, 4257, -2112, -7689, -10425, -9347, -4860, 1365, 7082, 10191, 9593, 5503, -601, -6494, -10040, -9948, -6194, -159, 5997, 9967, 10292, 6788, 732, -5645, -9943, -10551, -7210, -1170, 5291, 9754, 10552, 7426, 1566, -4818, -9353, -10412, -7627, -2106, 4129, 8780, 10203, 7903, 2772, -3343, -8231, -10120, -8346, -3549, 2560, 7763, 10160, 8847, 4262, -1947, -7479, -10294, -9313, -4862, 1419, 7214, 10330, 9617, 5308, -979, -6910, -10284, -9838, -5763, 445, 6474, 10094, 9984, 6170, 93, -6009, -9875, -10085, -6574, -660, 5456, 9523, 10068, 6926, 1275, -4792, -9083, -10044, -7362, -2017, 4052, 8639, 10123, 7907, 2799, -3391, -8407, -10358, -8488, -3439, 2948, 8275, 10533, 8853, 3858, -2594, -8063, -10498, -9023, -4203, 2122, 7611, 10259, 9121, 4651, -1485, -7035, -9991, -9292, -5207, 763, 6444, 9756, 9496, 5769, -50, -5852, -9509, -9699, -6325, -647, 5287, 9294, 9915, 6887, 1320, -4765, -9127, -10125, -7389, -1893, 4313, 8926, 10246, 7766, 2395, -3851, -8654, -10242, -8057, -2906, 3277, 8219, 10138, 8331, 3490, -2595, -7715, -9995, -8629, -4125, 1870, 7166, 9855, 8956, 4782, -1144, -6662, -9764, -9303, -5429, 458, 6214, 9701, 9632, 5998, 139, -5819, -9622, -9881, -6489, -673, 5374, 9437, 9992, 6881, 1231, -4857, -9132, -10040, -7278, -1849, 4224, 8737, 10040, 7671, 2517, -3539, -8276, -9987, -8063, -3228, 2759, 7732, 9888, 8460, 3978, -1950, -7177, -9811, -8889, -4721, 1192, 6695, 9806, 9329, 5419, -511, -6292, -9743, -9619, -5906, -21, 5882, 9599, 9766, 6339, 597, -5319, -9250, -9761, -6711, -1242, 4637, 8793, 9732, 7167, 2026, -3822, -8264, -9703, -7640, -2806, 3054, 7827, 9779, 8188, 3596, -2332, -7446, -9839, -8622, -4204, 1808, 7188, 9923, 8991, 4718, -1336, -6875, -9849, -9139, -5014, 972, 6576, 9725, 9250, 5370, -472, -6099, -9423, -9248, -5672, -32, 5590, 9124, 9316, 6110, 675, -4980, -8801, -9405, -6565, -1310, 4456, 8592, 9615, 7086, 1929, -3981, -8439, -9779, -7488, -2375, 3652, 8367, 9952, 7828, 2743, -3342, -8184, -9946, -7992, -3047, 2999, 7906, 9860, 8156, 3449, -2512, -7499, -9719, -8343, -3914, 1963, 7114, 9625, 8619, 4415, -1412, -6711, -9538, -8822, -4860, 901, 6322, 9410, 9013, 5306, -356, -5901, -9269, -9221, -5769, -162, 5518, 9177, 9431, 6166, 581, -5239, -9106, -9570, -6468, -950, 4891, 8883, 9540, 6675, 1364, -4402, -8503, -9469, -6979, -1965, 3733, 8058, 9439, 7410, 2686, -3021, -7644, -9500, -7910, -3422, 2353, 7310, 9631, 8405, 4082, -1798, -7045, -9715, -8785, -4572, 1357, 6800, 9697, 8985, 4929, -939, -6430, -9488, -9030, -5235, 434, 5904, 9154, 9048, 5653, 232, -5230, -8778, -9113, -6163, -949, 4610, 8516, 9320, 6718, 1661, -4046, -8272, -9485, -7184, -2216, 3582, 8080, 9595, 7562, 2724, -3156, -7856, -9656, -7864, -3121, 2790, 7665, 9671, 8058, 3446, -2446, -7399, -9558, -8148, -3715, 2055, 7025, 9350, 8205, 4068, -1544, -6549, -9134, -8380, -4565, 918, 6064, 8999, 8638, 5089, -363, -5710, -8981, -8948, -5582, -131, 5403, 8937, 9138, 5921, 474, -5165, -8888, -9309, -6256, -872, 4815, 8687, 9315, 6447, 1205, -4474, -8471, -9312, -6729, -1690, 3932, 8068, 9203, 6969, 2187, -3393, -7707, -9224, -7382, -2854, 2706, 7289, 9197, 7746, 3434, -2153, -6993, -9275, -8156, -4030, 1610, 6661, 9252, 8415, 4430, -1215, -6413, -9231, -8600, -4780, 809, 6073, 9048, 8647, 5023, -423, -5696, -8821, -8697, -5363, -83, 5211, 8568, 8771, 5747, 609, -4768, -8406, -8960, -6222, -1184, 4311, 8237, 9137, 6655, 1693, -3908, -8104, -9310, -7074, -2202, 3497, 7932, 9414, 7410, 2640, -3122, -7738, -9472, -7670, -3014, 2748, 7463, 9386, 7824, 3359, -2287, -7048, -9174, -7909, -3784, 1699, 6511, 8939, 8111, 4343, -1000, -5982, -8795, -8405, -4930, 380, 5586, 8762, 8710, 5423, 123, -5251, -8693, -8900, -5808, -562, 4900, 8543, 9016, 6142, 987, -4539, -8371, -9092, -6432, -1387, 4156, 8143, 9074, 6639, 1759, -3735, -7808, -8987, -6872, -2264, 3137, 7365, 8905, 7219, 2903, -2471, -6985, -8972, -7709, -3597, 1861, 6678, 9049, 8097, 4124, -1388, -6420, -9073, -8367, -4577, 871, 5995, 8881, 8492, 4991, -338, -5534, -8676, -8647, -5440, -260, 5012, 8407, 8714, 5814, 797, -4479, -8089, -8732, -6200, -1441, 3811, 7688, 8753, 6687, 2170, -3122, -7339, -8907, -7241, -2907, 2546, 7096, 9075, 7698, 3473, -2075, -6878, -9136, -8021, -3930, 1611, 6531, 9045, 8215, 4350, -1103, -6140, -8899, -8357, -4747, 613, 5713, 8690, 8456, 5114, -71, -5193, -8365, -8465, -5475, -518, 4593, 8043, 8567, 5986, 1231, -4001, -7805, -8779, -6530, -1837, 3583, 7718, 9007, 6945, 2249, -3273, -7575, -9027, -7108, -2530, 2942, 7282, 8896, 7204, 2887, -2450, -6830, -8666, -7318, -3290, 1932, 6423, 8553, 7531, 3754, -1397, -6031, -8441, -7733, -4176, 920, 5703, 8389, 8005, 4654, -430, -5379, -8369, -8259, -5081, 0, 5115, 8361, 8479, 5456, 380, -4823, -8224, -8558, -5719, -780, 4427, 7969, 8562, 6018, 1279, -3904, -7638, -8574, -6382, -1874, 3331, 7312, 8615, 6781, 2449, -2796, -7027, -8683, -7154, -2993, 2257, 6694, 8680, 7483, 3552, -1703, -6332, -8654, -7804, -4088, 1122, 5930, 8567, 8068, 4603, -561, -5516, -8448, -8263, -5043, 19, 5059, 8232, 8382, 5459, 564, -4529, -7955, -8445, -5855, -1130, 3990, 7679, 8541, 6302, 1754, -3441, -7375, -8622, -6705, -2315, 2934, 7132, 8710, 7087, 2859, -2423, -6811, -8678, -7354, -3315, 1940, 6473, 8631, 7599, 3806, -1397, -6054, -8467, -7762, -4208, 901, 5652, 8323, 7916, 4611, -372, -5185, -8072, -7960, -4934, -93, 4754, 7845, 8072, 5347, 685, -4221, -7598, -8175, -5761, -1208, 3824, 7493, 8426, 6252, 1726, -3469, -7413, -8604, -6572, -2069, 3225, 7311, 8670, 6789, 2403, -2850, -6995, -8533, -6927, -2784, 2320, 6571, 8382, 7155, 3313, -1696, -6094, -8261, -7423, -3846, 1135, 5717, 8205, 7689, 4349, -590, -5317, -8081, -7880, -4773, 80, 4914, 7949, 8049, 5204, 437, -4495, -7769, -8176, -5562, -901, 4103, 7591, 8261, 5871, 1333, -3693, -7333, -8258, -6138, -1756, 3263, 7051, 8233, 6372, 2154, -2841, -6788, -8229, -6626, -2581, 2415, 6506, 8178, 6825, 2947, -2026, -6247, -8177, -7094, -3398, 1575, 5963, 8166, 7343, 3797, -1179, -5748, -8207, -7616, -4211, 772, 5477, 8152, 7795, 4536, -398, -5180, -8016, -7897, -4861, -53, 4728, 7766, 7933, 5203, 579, -4242, -7496, -8019, -5613, -1150, 3736, 7239, 8095, 5983, 1662, -3279, -7029, -8192, -6338, -2149, 2841, 6786, 8223, 6631, 2583, -2413, -6521, -8224, -6891, -3026, 1955, 6203, 8160, 7092, 3418, -1508, -5849, -8026, -7254, -3823, 989, 5420, 7840, 7383, 4251, -437, -4971, -7677, -7604, -4738, -132, 4531, 7553, 7814, 5180, 631, -4188, -7482, -8012, -5587, -1083, 3817, 7309, 8104, 5890, 1504, -3430, -7101, -8130, -6208, -1988, 2920, 6755, 8100, 6482, 2493, -2389, -6381, -8028, -6754, -3028, 1774, 5919, 7900, 7004, 3577, -1154, -5463, -7784, -7267, -4120, 555, 5028, 7677, 7510, 4615, 5, -4619, -7567, -7741, -5076, -542, 4204, 7412, 7890, 5461, 1017, -3820, -7246, -8003, -5814, -1490, 3373, 6981, 7999, 6067, 1921, -2905, -6648, -7952, -6363, -2461, 2309, 6213, 7848, 6628, 2980, -1762, -5879, -7858, -6980, -3525, 1239, 5553, 7829, 7216, 3917, -842, -5302, -7793, -7422, -4299, 394, 4926, 7628, 7505, 4620, 36, -4548, -7460, -7623, -5002, -559, 4083, 7226, 7702, 5368, 1066, -3628, -6991, -7767, -5724, -1575, 3145, 6715, 7827, 6064, 2080, -2661, -6430, -7843, -6381, -2588, 2169, 6134, 7853, 6699, 3079, -1674, -5812, -7819, -6949, -3532, 1190, 5474, 7739, 7170, 3975, -654, -5032, -7548, -7301, -4393, 93, 4530, 7301, 7407, 4851, 557, -3930, -6966, -7488, -5305, -1209, 3326, 6665, 7609, 5802, 1878, -2748, -6398, -7727, -6213, -2405, 2318, 6213, 7827, 6555, 2850, -1914, -5963, -7797, -6732, -3192, 1513, 5632, 7669, 6897, 3616, -954, -5152, -7451, -7045, -4079, 343, 4660, 7274, 7269, 4636, 323, -4104, -7052, -7449, -5144, -955, 3585, 6828, 7617, 5645, 1614, -3006, -6551, -7712, -6076, -2208, 2473, 6270, 7789, 6461, 2754, -1963, -5950, -7750, -6680, -3175, 1483, 5566, 7608, 6846, 3615, -912, -5069, -7355, -6964, -4050, 331, 4576, 7141, 7113, 4488, 222, -4130, -6981, -7263, -4862, -675, 3778, 6834, 7370, 5175, 1054, -3466, -6700, -7467, -5434, -1405, 3167, 6547, 7499, 5652, 1697, -2884, -6400, -7530, -5873, -2033, 2538, 6151, 7476, 6044, 2383, -2124, -5828, -7388, -6247, -2848, 1567, 5387, 7251, 6490, 3398, -930, -4932, -7181, -6835, -4014, 293, 4525, 7145, 7165, 4533, 196, -4245, -7127, -7360, -4851, -554, 3929, 6925, 7361, 5072, 941, -3486, -6623, -7305, -5341, -1424, 2993, 6323, 7332, 5678, 1919, -2549, -6081, -7386, -5926, -2297, 2194, 5858, 7347, 6129, 2659, -1754, -5520, -7229, -6297, -3076, 1282, 5179, 7201, 6594, 3544, -837, -4962, -7262, -6862, -3885, 571, 4824, 7282, 6996, 4087, -320, -4583, -7097, -6968, -4269, -18, 4188, 6836, 6972, 4572, 526, -3702, -6582, -7063, -4972, -1061, 3256, 6384, 7183, 5334, 1500, -2882, -6221, -7254, -5617, -1910, 2492, 5971, 7244, 5849, 2314, -2083, -5705, -7245, -6102, -2740, 1673, 5458, 7243, 6344, 3089, -1338, -5247, -7215, -6506, -3386, 985, 4957, 7087, 6595, 3682, -552, -4569, -6899, -6736, -4109, 7, 4120, 6744, 6917, 4553, 507, -3742, -6645, -7115, -4955, -968, 3371, 6470, 7187, 5247, 1373, -2993, -6262, -7223, -5545, -1834, 2549, 5982, 7211, 5787, 2232, -2126, -5693, -7173, -6016, -2657, 1643, 5313, 7027, 6184, 3097, -1101, -4875, -6887, -6412, -3630, 490, 4428, 6780, 6666, 4136, 80, -4033, -6675, -6875, -4546, -536, 3685, 6549, 7001, 4883, 973, -3278, -6314, -7010, -5125, -1367, 2895, 6081, 7030, 5408, 1803, -2455, -5777, -6978, -5590, -2180, 2039, 5499, 6950, 5849, 2644, -1535, -5158, -6902, -6120, -3090, 1109, 4913, 6935, 6400, 3502, -711, -4661, -6890, -6558, -3787, 380, 4402, 6776, 6643, 4079, 16, -4039, -6589, -6717, -4367, -432, 3675, 6424, 6817, 4685, 819, -3340, -6270, -6871, -4945, -1192, 2968, 6029, 6861, 5173, 1608, -2543, -5750, -6875, -5482, -2093, 2071, 5492, 6917, 5788, 2526, -1691, -5311, -6954, -6043, -2882, 1337, 5049, 6881, 6145, 3154, -1010, -4766, -6782, -6282, -3478, 579, 4406, 6590, 6333, 3762, -204, -4065, -6431, -6434, -4105, -290, 3599, 6161, 6485, 4460, 807, -3143, -5983, -6672, -4935, -1413, 2678, 5805, 6828, 5340, 1861, -2334, -5683, -6941, -5637, -2261, 1938, 5387, 6849, 5780, 2611, -1487, -5004, -6711, -5967, -3085, 895, 4540, 6542, 6178, 3580, -309, -4093, -6403, -6403, -4094, -287, 3627, 6249, 6623, 4597, 896, -3165, -6102, -6826, -5073, -1440, 2736, 5925, 6965, 5422, 1909, -2325, -5680, -6943, -5658, -2318, 1836, 5282, 6772, 5813, 2767, -1223, -4748, -6529, -5973, -3289, 566, 4215, 6360, 6231, 3854, 87, -3734, -6212, -6437, -4327, -632, 3318, 6071, 6616, 4747, 1155, -2878, -5857, -6702, -5109, -1644, 2438, 5629, 6777, 5435, 2103, -2020, -5400, -6792, -5680, -2467, 1616, 5120, 6700, 5802, 2787, -1238, -4766, -6535, -5923, -3163, 702, 4280, 6300, 6034, 3578, -175, -3878, -6184, -6265, -4059, -370, 3472, 6061, 6428, 4443, 798, -3147, -5942, -6571, -4782, -1248, 2740, 5715, 6591, 5036, 1662, -2334, -5465, -6589, -5320, -2097, 1874, 5142, 6515, 5501, 2479, -1437, -4814, -6424, -5690, -2881, 964, 4427, 6279, 5826, 3262, -478, -4046, -6143, -6017, -3698, -20, 3678, 6050, 6235, 4122, 495, -3346, -5978, -6408, -4463, -870, 3060, 5860, 6499, 4744, 1248, -2679, -5610, -6461, -4944, -1639, 2252, 5301, 6423, 5209, 2101, -1753, -4966, -6350, -5421, -2497, 1316, 4668, 6316, 5655, 2954, -828, -4289, -6192, -5838, -3367, 345, 3951, 6132, 6099, 3828, 152, -3590, -6016, -6232, -4154, -535, 3279, 5883, 6338, 4473, 1009, -2797, -5563, -6297, -4729, -1477, 2312, 5257, 6303, 5088, 2023, -1759, -4910, -6262, -5350, -2476, 1286, 4572, 6206, 5600, 2971, -706, -4127, -6055, -5810, -3476, 142, 3707, 5976, 6098, 3994, 433, -3339, -5900, -6318, -4398, -865, 2995, 5740, 6351, 4655, 1247, -2553, -5399, -6255, -4866, -1746, 1948, 4931, 6122, 5137, 2317, -1328, -4517, -6085, -5483, -2891, 759, 4136, 6043, 5740, 3363, -259, -3793, -5954, -5954, -3815, -273, 3368, 5798, 6124, 4224, 773, -2955, -5632, -6235, -4580, -1256, 2499, 5343, 6221, 4852, 1746, -1972, -4958, -6144, -5131, -2295, 1365, 4532, 6071, 5422, 2822, -824, -4174, -6012, -5670, -3259, 341, 3816, 5891, 5815, 3627, 125, -3418, -5723, -5953, -4015, -609, 3038, 5595, 6113, 4383, 1020, -2734, -5488, -6190, -4602, -1306, 2451, 5265, 6114, 4703, 1608, -2026, -4868, -5916, -4833, -2034, 1460, 4418, 5793, 5101, 2577, -878, -4044, -5771, -5417, -3076, 411, 3800, 5815, 5711, 3490, -43, -3576, -5805, -5899, -3787, -288, 3323, 5718, 5992, 4075, 675, -2962, -5482, -5986, -4315, -1076, 2531, 5208, 5989, 4613, 1577, -2007, -4854, -5936, -4873, -2059, 1501, 4512, 5896, 5148, 2544, -968, -4140, -5821, -5389, -3018, 453, 3769, 5742, 5636, 3485, 50, -3424, -5671, -5854, -3886, -490, 3118, 5569, 5977, 4180, 858, -2769, -5341, -5944, -4389, -1251, 2287, 4965, 5832, 4608, 1752, -1702, -4547, -5761, -4933, -2344, 1106, 4182, 5767, 5273, 2868, -599, -3885, -5774, -5565, -3303, 188, 3618, 5741, 5754, 3671, 223, -3278, -5591, -5858, -3987, -672, 2903, 5397, 5938, 4321, 1163, -2427, -5116, -5953, -4629, -1643, 1936, 4812, 5949, 4937, 2156, -1395, -4433, -5863, -5182, -2631, 883, 4073, 5788, 5418, 3081, -359, -3678, -5645, -5551, -3425, -63, 3338, 5520, 5683, 3780, 500, -2958, -5318, -5728, -4037, -861, 2616, 5140, 5779, 4311, 1284, -2193, -4858, -5735, -4523, -1656, 1796, 4604, 5743, 4807, 2132, -1321, -4278, -5696, -5022, -2501, 936, 4052, 5686, 5251, 2898, -514, -3733, -5584, -5395, -3229, 117, 3436, 5510, 5587, 3623, 317, -3115, -5412, -5734, -3915, -661, 2867, 5320, 5815, 4145, 958, -2561, -5108, -5744, -4284, -1275, 2168, 4782, 5635, 4440, 1648, -1711, -4442, -5550, -4658, -2088, 1238, 4112, 5492, 4871, 2476, -856, -3886, -5499, -5107, -2826, 519, 3680, 5483, 5263, 3071, -266, -3521, -5463, -5380, -3299, -4, 3278, 5323, 5411, 3508, 314, -2961, -5163, -5465, -3794, -748, 2564, 4937, 5519, 4085, 1176, -2189, -4759, -5612, -4424, -1614, 1801, 4549, 5652, 4663, 1956, -1491, -4383, -5677, -4887, -2289, 1128, 4126, 5586, 4983, 2563, -790, -3847, -5478, -5099, -2878, 385, 3493, 5309, 5187, 3168, 7, -3157, -5168, -5288, -3490, -413, 2790, 4976, 5354, 3776, 818, -2425, -4805, -5429, -4071, -1228, 2077, 4633, 5494, 4332, 1569, -1780, -4490, -5551, -4553, -1884, 1483, 4300, 5528, 4702, 2149, -1194, -4096, -5488, -4863, -2455, 832, 3813, 5362, 4975, 2744, -448, -3485, -5247, -5093, -3121, -20, 3078, 5061, 5209, 3487, 485, -2709, -4934, -5372, -3857, -946, 2345, 4763, 5448, 4130, 1299, -2017, -4591, -5490, -4379, -1684, 1608, 4314, 5419, 4568, 2045, -1224, -4047, -5406, -4799, -2461, 768, 3713, 5299, 4943, 2800, -366, -3400, -5212, -5126, -3192, -118, 2999, 5024, 5235, 3531, 543, -2660, -4904, -5380, -3899, -977, 2291, 4736, 5438, 4139, 1315, -2003, -4576, -5459, -4342, -1631, 1670, 4329, 5391, 4461, 1916, -1324, -4058, -5307, -4628, -2266, 891, 3720, 5182, 4759, 2594, -510, -3432, -5112, -4938, -2962, 91, 3102, 4978, 5038, 3258, 267, -2811, -4884, -5178, -3584, -678, 2496, 4764, 5281, 3834, 950, -2318, -4726, -5378, -4022, -1178, 2087, 4543, 5296, 4077, 1366, -1802, -4284, -5187, -4214, -1745, 1330, 3908, 5075, 4424, 2170, -893, -3663, -5122, -4726, -2599, 486, 3410, 5076, 4892, 2917, -134, -3122, -4972, -4997, -3216, -287, 2747, 4774, 5080, 3541, 709, -2386, -4634, -5200, -3867, -1116, 2059, 4454, 5237, 4090, 1440, -1722, -4245, -5203, -4277, -1800, 1285, 3915, 5098, 4460, 2216, -820, -3568, -5040, -4709, -2688, 332, 3225, 4985, 4926, 3071, 80, -2952, -4912, -5069, -3364, -441, 2646, 4749, 5105, 3613, 812, -2257, -4496, -5098, -3853, -1226, 1853, 4236, 5091, 4088, 1615, -1458, -3974, -5053, -4294, -1989, 1019, 3657, 4964, 4498, 2416, -521, -3277, -4858, -4722, -2885, 19, 2943, 4830, 4977, 3297, 410, -2659, -4748, -5103, -3566, -730, 2358, 4577, 5109, 3799, 1132, -1910, -4241, -5035, -4010, -1552, 1462, 3960, 5050, 4332, 2049, -972, -3660, -5003, -4533, -2411, 604, 3402, 4972, 4736, 2801, -143, -3023, -4798, -4849, -3140, -296, 2660, 4660, 4990, 3525, 775, -2251, -4463, -5041, -3784, -1138, 1929, 4298, 5093, 4052, 1523, -1540, -4028, -5042, -4204, -1824, 1216, 3816, 5021, 4406, 2179, -822, -3501, -4902, -4499, -2464, 473, 3245, 4837, 4688, 2848, -23, -2873, -4692, -4789, -3133, -332, 2624, 4628, 4968, 3495, 756, -2264, -4451, -4998, -3696, -1035, 2036, 4347, 5078, 3948, 1386, -1667, -4063, -4970, -4025, -1619, 1357, 3838, 4924, 4231, 2040, -875, -3463, -4783, -4393, -2392, 488, 3223, 4802, 4656, 2811, -61, -2915, -4700, -4757, -3060, -237, 2682, 4619, 4873, 3367, 658, -2280, -4377, -4885, -3612, -1020, 1959, 4231, 4967, 3893, 1391, -1618, -4038, -4953, -4045, -1658, 1324, 3807, 4886, 4190, 1982, -924, -3487, -4786, -4338, -2341, 518, 3179, 4721, 4552, 2726, -85, -2875, -4634, -4686, -3045, -278, 2577, 4502, 4787, 3353, 696, -2195, -4284, -4820, -3606, -1099, 1825, 4077, 4854, 3872, 1488, -1431, -3830, -4825, -4059, -1838, 1046, 3538, 4751, 4244, 2209, -618, -3228, -4672, -4422, -2576, 209, 2926, 4579, 4578, 2891, 180, -2622, -4449, -4674, -3180, -566, 2264, 4245, 4707, 3440, 950, -1881, -4025, -4713, -3704, -1343, 1483, 3755, 4674, 3908, 1724, -1062, -3461, -4601, -4085, -2117, 628, 3137, 4541, 4307, 2534, -184, -2844, -4507, -4530, -2918, -196, 2613, 4493, 4713, 3213, 507, -2403, -4425, -4817, -3432, -787, 2152, 4270, 4811, 3580, 1040, -1855, -4053, -4736, -3690, -1314, 1514, 3752, 4618, 3809, 1631, -1118, -3450, -4541, -3993, -2005, 714, 3180, 4487, 4171, 2307, -413, -3013, -4519, -4369, -2598, 119, 2800, 4441, 4439, 2802, 115, -2595, -4356, -4532, -3035, -450, 2287, 4172, 4529, 3219, 726, -2024, -4036, -4562, -3438, -1059, 1680, 3796, 4494, 3550, 1318, -1393, -3590, -4493, -3766, -1696, 982, 3295, 4418, 3931, 1991, -701, -3166, -4488, -4183, -2335, 383, 2961, 4446, 4273, 2505, -183, -2804, -4388, -4364, -2758, -172, 2447, 4141, 4353, 2979, 524, -2117, -4024, -4482, -3335, -994, 1726, 3817, 4523, 3561, 1283, -1479, -3710, -4584, -3789, -1629, 1112, 3414, 4470, 3893, 1917, -742, -3137, -4411, -4106, -2331, 289, 2798, 4309, 4251, 2641, 61, -2543, -4224, -4384, -2957, -468, 2181, 4019, 4407, 3205, 843, -1815, -3816, -4435, -3464, -1244, 1424, 3574, 4440, 3694, 1602, -1051, -3350, -4427, -3898, -1965, 691, 3104, 4400, 4088, 2294, -351, -2871, -4348, -4241, -2588, 11, 2592, 4235, 4314, 2853, 356, -2266, -4059, -4403, -3154, -790, 1869, 3851, 4448, 3446, 1194, -1507, -3669, -4507, -3707, -1558, 1142, 3416, 4446, 3863, 1878, -769, -3135, -4363, -4036, -2242, 341, 2814, 4281, 4194, 2585, 24, -2553, -4200, -4329, -2866, -369, 2265, 4049, 4342, 3065, 684, -1928, -3825, -4341, -3295, -1085, 1495, 3532, 4292, 3519, 1465, -1114, -3298, -4294, -3743, -1846, 707, 3001, 4190, 3885, 2154, -335, -2704, -4118, -4039, -2546, -92, 2381, 4018, 4195, 2843, 430, -2178, -3994, -4343, -3097, -706, 1933, 3851, 4326, 3229, 959, -1636, -3615, -4274, -3389, -1301, 1246, 3324, 4218, 3582, 1661, -863, -3075, -4174, -3752, -1962, 532, 2832, 4104, 3891, 2256, -174, -2557, -3997, -3989, -2533, -131, 2328, 3968, 4150, 2825, 443, -2114, -3884, -4217, -2977, -645, 1933, 3785, 4250, 3177, 951, -1595, -3547, -4193, -3328, -1252, 1280, 3362, 4226, 3576, 1626, -901, -3113, -4185, -3736, -1908, 596, 2907, 4159, 3919, 2255, -207, -2590, -4028, -4009, -2529, -126, 2333, 3956, 4146, 2845, 508, -2020, -3816, -4227, -3103, -832, 1744, 3696, 4301, 3348, 1178, -1403, -3466, -4255, -3501, -1480, 1068, 3217, 4210, 3686, 1852, -638, -2890, -4103, -3838, -2199, 245, 2616, 4065, 4041, 2545, 115, -2366, -3978, -4138, -2771, -390, 2131, 3862, 4177, 2980, 702, -1798, -3637, -4155, -3187, -1065, 1410, 3389, 4143, 3419, 1462, -1011, -3129, -4109, -3625, -1831, 611, 2839, 4054, 3800, 2197, -208, -2522, -3938, -3924, -2497, -172, 2217, 3811, 4035, 2795, 549, -1909, -3669, -4099, -3026, -841, 1664, 3551, 4153, 3229, 1132, -1374, -3355, -4104, -3353, -1375, 1091, 3154, 4080, 3529, 1701, -724, -2898, -4017, -3685, -2007, 425, 2709, 4032, 3881, 2323, -105, -2496, -3960, -3964, -2491, -113, 2322, 3882, 4020, 2683, 390, -2032, -3686, -3978, -2829, -657, 1750, 3517, 4012, 3042, 986, -1435, -3329, -4004, -3210, -1238, 1196, 3195, 4036, 3389, 1502, -931, -3005, -3966, -3466, -1700, 678, 2809, 3895, 3579, 1947, -369, -2560, -3819, -3691, -2211, 79, 2346, 3761, 3809, 2456, 189, -2160, -3731, -3917, -2667, -414, 1972, 3647, 3969, 2823, 659, -1755, -3522, -3999, -3026, -962, 1440, 3319, 3987, 3215, 1272, -1119, -3126, -3994, -3431, -1630, 771, 2877, 3955, 3583, 1910, -459, -2667, -3908, -3730, -2223, 95, 2363, 3763, 3807, 2445, 200, -2138, -3709, -3922, -2711, -497, 1888, 3586, 3958, 2866, 709, -1706, -3494, -3987, -3012, -949, 1447, 3292, 3918, 3128, 1191, -1151, -3084, -3883, -3292, -1524, 797, 2831, 3848, 3468, 1845, -454, -2616, -3826, -3663, -2153, 150, 2413, 3810, 3811, 2421, 129, -2199, -3736, -3884, -2609, -380, 2001, 3632, 3928, 2777, 645, -1715, -3417, -3885, -2929, -941, 1388, 3189, 3854, 3137, 1304, -997, -2948, -3835, -3326, -1615, 696, 2766, 3842, 3520, 1914, -397, -2557, -3779, -3614, -2117, 160, 2373, 3731, 3719, 2351, 124, -2158, -3646, -3775, -2514, -311, 1994, 3572, 3824, 2675, 549, -1753, -3393, -3795, -2809, -801, 1470, 3219, 3797, 3005, 1121, -1179, -3060, -3841, -3220, -1427, 902, 2904, 3839, 3352, 1644, -683, -2741, -3796, -3460, -1867, 396, 2488, 3689, 3531, 2098, -109, -2272, -3634, -3658, -2344, -163, 2087, 3565, 3716, 2478, 322, -1948, -3478, -3730, -2606, -546, 1678, 3277, 3674, 2739, 837, -1383, -3091, -3706, -2971, -1155, 1083, 2941, 3732, 3168, 1413, -850, -2819, -3741, -3309, -1629, 630, 2663, 3711, 3394, 1847, -385, -2457, -3626, -3478, -2049, 113, 2244, 3547, 3562, 2273, 165, -1998, -3435, -3623, -2502, -469, 1744, 3338, 3709, 2749, 776, -1477, -3205, -3767, -2964, -1080, 1202, 3061, 3793, 3146, 1352, -923, -2858, -3749, -3292, -1630, 616, 2624, 3700, 3426, 1920, -272, -2355, -3580, -3505, -2161, -34, 2101, 3486, 3605, 2435, 405, -1754, -3275, -3622, -2670, -773, 1404, 3090, 3695, 2974, 1192, -1032, -2890, -3719, -3194, -1516, 742, 2720, 3722, 3371, 1810, -391, -2424, -3569, -3418, -2049, 39, 2108, 3433, 3530, 2375, 361, -1786, -3296, -3610, -2604, -651, 1562, 3193, 3665, 2778, 889, -1298, -2997, -3591, -2887, -1153, 969, 2746, 3539, 3071, 1515, -601, -2527, -3550, -3303, -1837, 324, 2387, 3584, 3467, 2056, -111, -2235, -3524, -3513, -2232, -153, 1949, 3331, 3507, 2428, 490, -1613, -3150, -3560, -2711, -878, 1264, 2983, 3630, 2972, 1236, -960, -2816, -3653, -3179, -1558, 629, 2578, 3616, 3346, 1883, -238, -2297, -3523, -3494, -2206, -123, 2037, 3463, 3643, 2477, 414, -1819, -3366, -3670, -2619, -618, 1574, 3165, 3573, 2675, 840, -1270, -2893, -3484, -2815, -1151, 917, 2663, 3467, 3023, 1472, -642, -2543, -3532, -3220, -1706, 466, 2469, 3576, 3342, 1877, -272, -2311, -3490, -3382, -2053, 19, 2068, 3369, 3458, 2300, 329, -1762, -3221, -3525, -2563, -672, 1461, 3097, 3603, 2814, 990, -1179, -2924, -3606, -2986, -1300, 847, 2675, 3534, 3144, 1618, -454, -2382, -3460, -3307, -1972, 82, 2123, 3413, 3483, 2277, 243, -1903, -3346, -3568, -2484, -497, 1646, 3168, 3531, 2607, 740, -1370, -2968, -3490, -2753, -1041, 1040, 2737, 3431, 2874, 1265, -801, -2555, -3384, -2984, -1517, 485, 2280, 3253, 3055, 1753, -168, -2054, -3222, -3252, -2116, -213, 1795, 3175, 3399, 2380, 473, -1630, -3152, -3521, -2605, -742, 1363, 2966, 3467, 2725, 1002, -1059, -2736, -3432, -2907, -1365, 664, 2428, 3336, 3046, 1672, -284, -2170, -3276, -3230, -2012, -89, 1885, 3175, 3328, 2272, 374, -1666, -3124, -3454, -2529, -691, 1402, 2979, 3481, 2685, 934, -1169, -2835, -3459, -2839, -1185, 880, 2628, 3413, 2967, 1427, -605, -2418, -3352, -3061, -1672, 326, 2191, 3279, 3170, 1932, -17, -1973, -3210, -3285, -2158, -230, 1795, 3193, 3418, 2383, 465, -1632, -3112, -3445, -2497, -638, 1457, 3004, 3462, 2645, 887, -1193, -2818, -3414, -2775, -1110, 941, 2663, 3402, 2899, 1335, -712, -2492, -3356, -2982, -1506, 505, 2324, 3295, 3043, 1680, -296, -2149, -3219, -3084, -1822, 97, 1988, 3132, 3131, 1978, 104, -1804, -3070, -3195, -2168, -343, 1620, 2997, 3273, 2345, 539, -1480, -2960, -3355, -2498, -715, 1335, 2868, 3333, 2550, 846, -1132, -2680, -3241, -2631, -1081, 821, 2425, 3157, 2753, 1371, -507, -2240, -3163, -2964, -1666, 250, 2102, 3187, 3108, 1871, -55, -1974, -3174, -3202, -2060, -167, 1787, 3086, 3269, 2244, 400, -1597, -3018, -3349, -2438, -637, 1401, 2913, 3356, 2550, 823, -1188, -2741, -3287, -2647, -1064, 872, 2485, 3202, 2758, 1346, -565, -2279, -3177, -2937, -1615, 290, 2100, 3139, 3031, 1812, -58, -1901, -3039, -3075, -2011, -228, 1622, 2905, 3154, 2271, 565, -1349, -2804, -3245, -2514, -852, 1140, 2741, 3331, 2701, 1071, -946, -2602, -3293, -2778, -1261, 706, 2403, 3233, 2897, 1548, -361, -2143, -3159, -3041, -1809, 89, 1982, 3172, 3221, 2095, 192, -1807, -3141, -3314, -2260, -371, 1661, 3076, 3364, 2413, 598, -1422, -2896, -3290, -2500, -807, 1153, 2671, 3231, 2625, 1084, -822, -2429, -3145, -2746, -1338, 536, 2213, 3103, 2874, 1588, -265, -2020, -3039, -2954, -1797, 23, 1829, 2984, 3071, 2017, 237, -1643, -2935, -3152, -2217, -446, 1486, 2888, 3223, 2375, 654, -1295, -2757, -3190, -2455, -845, 1057, 2546, 3136, 2596, 1137, -704, -2309, -3094, -2769, -1448, 417, 2158, 3127, 2956, 1670, -237, -2066, -3111, -3006, -1779, 86, 1914, 3015, 3004, 1921, 155, -1636, -2832, -2996, -2088, -427, 1406, 2750, 3117, 2336, 704, -1224, -2684, -3173, -2473, -847, 1089, 2613, 3170, 2558, 1031, -842, -2391, -3078, -2637, -1271, 555, 2193, 3062, 2830, 1574, -261, -2028, -3050, -2965, -1777, 73, 1903, 3031, 3042, 1955, 180, -1644, -2852, -3030, -2126, -479, 1349, 2699, 3104, 2410, 852, -1029, -2538, -3132, -2583, -1083, 785, 2381, 3092, 2696, 1334, -460, -2068, -2917, -2727, -1591, 90, 1755, 2827, 2897, 1948, 295, -1479, -2745, -3009, -2162, -512, 1358, 2726, 3101, 2335, 709, -1146, -2577, -3052, -2426, -918, 921, 2424, 3070, 2602, 1194, -643, -2263, -3061, -2737, -1414, 445, 2147, 3053, 2849, 1584, -233, -1951, -2951, -2879, -1758, -18, 1712, 2811, 2894, 1933, 294, -1457, -2674, -2943, -2160, -618, 1135, 2493, 2949, 2374, 935, -846, -2366, -3043, -2652, -1295, 552, 2220, 3070, 2808, 1497, -380, -2103, -3067, -2900, -1693, 112, 1851, 2892, 2897, 1868, 181, -1572, -2775, -3001, -2145, -512, 1331, 2705, 3088, 2324, 692, -1208, -2667, -3120, -2427, -840, 1037, 2512, 3039, 2449, 974, -840, -2352, -3017, -2585, -1225, 580, 2189, 3011, 2715, 1416, -433, -2112, -3018, -2805, -1556, 267, 1976, 2963, 2829, 1659, -112, -1827, -2870, -2853, -1797, -80, 1652, 2777, 2879, 1930, 273, -1474, -2676, -2891, -2042, -460, 1299, 2566, 2904, 2178, 665, -1086, -2439, -2900, -2311, -863, 892, 2330, 2919, 2440, 1073, -683, -2187, -2889, -2537, -1269, 458, 2023, 2846, 2645, 1471, -231, -1852, -2805, -2733, -1664, 14, 1697, 2754, 2808, 1828, 189, -1529, -2667, -2847, -1979, -391, 1326, 2562, 2875, 2132, 626, -1134, -2482, -2948, -2342, -878, 924, 2393, 2996, 2497, 1073, -760, -2317, -3026, -2634, -1279, 541, 2160, 2977, 2710, 1459, -321, -1966, -2902, -2794, -1684, 40, 1741, 2837, 2875, 1874, 189, -1581, -2777, -2956, -2058, -405, 1378, 2645, 2926, 2149, 589, -1144, -2456, -2868, -2263, -884, 818, 2212, 2826, 2460, 1218, -475, -2031, -2881, -2700, -1520, 230, 1923, 2928, 2846, 1700, -86, -1832, -2882, -2871, -1796, -93, 1636, 2734, 2838, 1910, 305, -1400, -2594, -2864, -2081, -571, 1154, 2451, 2860, 2246, 806, -927, -2320, -2883, -2398, -1055, 688, 2193, 2904, 2575, 1305, -447, -2054, -2904, -2714, -1521, 230, 1910, 2900, 2820, 1700, -46, -1760, -2834, -2849, -1835, -128, 1606, 2750, 2889, 1966, 348, -1385, -2590, -2848, -2077, -554, 1165, 2455, 2860, 2254, 829, -882, -2287, -2869, -2423, -1095, 642, 2171, 2924, 2618, 1369, -398, -2027, -2933, -2775, -1593, 191, 1906, 2927, 2889, 1791, 42, -1730, -2860, -2942, -1960, -262, 1511, 2731, 2961, 2123, 525, -1252, -2571, -2967, -2295, -796, 991, 2424, 2994, 2475, 1069, -741, -2277, -2991, -2616, -1287, 505, 2108, 2936, 2696, 1480, -248, -1884, -2832, -2754, -1700, -44, 1617, 2688, 2801, 1892, 303, -1410, -2611, -2874, -2074, -550, 1175, 2442, 2825, 2162, 739, -947, -2286, -2786, -2304, -998, 646, 2058, 2742, 2427, 1244, -397, -1910, -2744, -2603, -1496, 145, 1745, 2707, 2691, 1693, 91, -1560, -2638, -2760, -1892, -327, 1333, 2524, 2807, 2074, 596, -1093, -2380, -2809, -2219, -845, 823, 2185, 2776, 2364, 1113, -544, -2003, -2766, -2532, -1388, 270, 1840, 2750, 2670, 1616, -8, -1637, -2676, -2719, -1799, -228, 1412, 2549, 2783, 2028, 561, -1110, -2383, -2816, -2227, -849, 866, 2263, 2860, 2420, 1110, -596, -2085, -2794, -2504, -1315, 328, 1840, 2700, 2597, 1582, 16, -1556, -2582, -2680, -1833, -306, 1337, 2516, 2785, 2049, 590, -1099, -2368, -2790, -2196, -832, 839, 2199, 2784, 2380, 1120, -526, -1991, -2756, -2522, -1379, 272, 1827, 2732, 2642, 1581, -53, -1660, -2649, -2646, -1695, -130, 1453, 2511, 2653, 1831, 372, -1221, -2365, -2662, -2002, -600, 1004, 2258, 2685, 2116, 774, -854, -2178, -2706, -2248, -967, 651, 2030, 2649, 2318, 1127, -461, -1889, -2626, -2428, -1358, 212, 1692, 2573, 2519, 1548, 1, -1528, -2526, -2604, -1751, -258, 1322, 2430, 2669, 1941, 499, -1129, -2371, -2757, -2142, -737, 963, 2327, 2840, 2308, 918, -808, -2244, -2828, -2379, -1050, 658, 2110, 2792, 2467, 1266, -379, -1874, -2686, -2512, -1439, 150, 1685, 2633, 2645, 1707, 175, -1435, -2520, -2695, -1890, -387, 1270, 2485, 2807, 2117, 649, -1050, -2369, -2810, -2233, -815, 910, 2305, 2857, 2360, 1019, -678, -2110, -2743, -2395, -1162, 460, 1912, 2672, 2478, 1410, -150, -1645, -2531, -2510, -1581, -102, 1424, 2426, 2565, 1780, 370, -1151, -2256, -2541, -1918, -605, 930, 2135, 2567, 2071, 819, -726, -2020, -2552, -2165, -980, 549, 1879, 2513, 2242, 1178, -312, -1686, -2479, -2373, -1425, 57, 1556, 2506, 2553, 1646, 114, -1493, -2550, -2662, -1764, -216, 1396, 2466, 2613, 1815, 385, -1155, -2272, -2572, -1983, -689, 846, 2113, 2632, 2204, 951, -667, -2077, -2714, -2351, -1105, 542, 1974, 2666, 2355, 1197, -369, -1785, -2535, -2378, -1394, 91, 1535, 2454, 2493, 1619, 158, -1400, -2447, -2606, -1784, -299, 1280, 2389, 2592, 1850, 451, -1096, -2230, -2560, -1968, -697, 834, 2069, 2586, 2160, 961, -623, -1999, -2667, -2366, -1163, 473, 1960, 2714, 2471, 1309, -339, -1845, -2654, -2505, -1427, 149, 1652, 2560, 2545, 1621, 127, -1394, -2418, -2585, -1814, -398, 1181, 2348, 2660, 2028, 644, -961, -2222, -2656, -2110, -793, 817, 2129, 2654, 2213, 967, -612, -1964, -2586, -2270, -1114, 440, 1850, 2579, 2376, 1295, -244, -1706, -2529, -2423, -1423, 89, 1589, 2498, 2503, 1585, 104, -1404, -2402, -2533, -1737, -311, 1231, 2325, 2576, 1896, 535, -1022, -2188, -2563, -2005, -749, 773, 1991, 2516, 2139, 1010, -468, -1811, -2512, -2333, -1316, 200, 1665, 2543, 2481, 1491, -57, -1586, -2528, -2521, -1599, -100, 1379, 2329, 2429, 1660, 338, -1072, -2086, -2383, -1851, -696, 714, 1889, 2419, 2089, 1007, -452, -1767, -2461, -2271, -1238, 234, 1642, 2446, 2384, 1453, -6, -1466, -2405, -2484, -1663, -231, 1309, 2384, 2594, 1854, 420, -1166, -2333, -2638, -1988, -608, 979, 2188, 2606, 2090, 824, -712, -1983, -2546, -2208, -1101, 403, 1768, 2507, 2364, 1361, -120, -1572, -2464, -2475, -1571, -109, 1399, 2388, 2513, 1718, 312, -1189, -2261, -2496, -1836, -529, 966, 2102, 2482, 1983, 790, -695, -1924, -2475, -2120, -1008, 468, 1787, 2461, 2250, 1221, -248, -1630, -2422, -2339, -1401, 42, 1472, 2371, 2417, 1569, 166, -1308, -2298, -2452, -1704, -332, 1148, 2221, 2463, 1799, 484, -1000, -2113, -2438, -1888, -648, 794, 1958, 2389, 1963, 839, -597, -1817, -2386, -2104, -1065, 365, 1661, 2362, 2205, 1243, -189, -1558, -2385, -2336, -1445, -29, 1375, 2283, 2350, 1549, 201, -1246, -2232, -2436, -1752, -452, 1015, 2107, 2430, 1853, 594, -892, -2056, -2465, -1993, -803, 665, 1867, 2389, 2042, 961, -454, -1712, -2377, -2185, -1226, 174, 1500, 2292, 2258, 1406, 37, -1349, -2258, -2354, -1626, -297, 1115, 2132, 2376, 1767, 507, -931, -2049, -2438, -1933, -719, 765, 1954, 2436, 2006, 837, -636, -1860, -2387, -2047, -975, 442, 1669, 2284, 2092, 1142, -199, -1470, -2222, -2172, -1348, -27, 1297, 2179, 2272, 1556, 286, -1095, -2085, -2328, -1742, -510, 911, 2027, 2428, 1954, 762, -726, -1959, -2461, -2068, -897, 606, 1875, 2456, 2129, 1044, -414, -1698, -2350, -2146, -1168, 220, 1527, 2281, 2219, 1354, 11, -1339, -2205, -2250, -1487, -179, 1193, 2124, 2290, 1621, 371, -1006, -2024, -2303, -1747, -542, 857, 1942, 2326, 1844, 687, -731, -1862, -2307, -1902, -801, 573, 1734, 2261, 1971, 975, -372, -1594, -2265, -2129, -1225, 156, 1508, 2321, 2280, 1380, -47, -1486, -2370, -2363, -1479, -56, 1361, 2267, 2317, 1544, 236, -1135, -2092, -2311, -1726, -529, 857, 1955, 2369, 1930, 775, -684, -1911, -2437, -2047, -912, 567, 1814, 2373, 2048, 987, -422, -1646, -2287, -2100, -1161, 185, 1462, 2222, 2159, 1321, -39, -1402, -2257, -2270, -1447, -82, 1307, 2199, 2270, 1499, 213, -1151, -2081, -2263, -1641, -425, 941, 1994, 2339, 1832, 658, -773, -1934, -2389, -1958, -786, 675, 1888, 2386, 2010, 902, -497, -1704, -2276, -2029, -1062, 273, 1515, 2229, 2153, 1319, -2, -1345, -2198, -2257, -1478, -136, 1249, 2188, 2311, 1592, 298, -1089, -2064, -2286, -1679, -484, 883, 1921, 2276, 1817, 703, -667, -1812, -2297, -1944, -881, 513, 1729, 2318, 2050, 1021, -366, -1617, -2269, -2089, -1139, 208, 1471, 2191, 2118, 1295, 8, -1288, -2111, -2190, -1491, -240, 1099, 2052, 2284, 1676, 450, -958, -2019, -2355, -1814, -600, 827, 1954, 2336, 1875, 726, -672, -1810, -2273, -1917, -879, 462, 1640, 2209, 1982, 1060, -255, -1471, -2167, -2076, -1238, 54, 1327, 2117, 2143, 1398, 142, -1181, -2066, -2228, -1585, -355, 1006, 2015, 2305, 1731, 536, -872, -1959, -2330, -1846, -683, 702, 1835, 2280, 1913, 878, -473, -1640, -2220, -2004, -1074, 254, 1500, 2206, 2120, 1258, -58, -1369, -2168, -2171, -1364, -62, 1259, 2128, 2205, 1493, 231, -1090, -2029, -2203, -1592, -371, 981, 1981, 2256, 1693, 525, -834, -1859, -2202, -1729, -638, 692, 1760, 2198, 1853, 864, -437, -1594, -2166, -1960, -1032, 293, 1527, 2226, 2108, 1229, -126, -1427, -2188, -2149, -1307, 8, 1318, 2151, 2206, 1474, 208, -1121, -2065, -2253, -1620, -389, 1004, 2038, 2328, 1760, 541, -861, -1942, -2287, -1788, -649, 709, 1792, 2208, 1840, 841, -459, -1578, -2141, -1946, -1055, 218, 1444, 2161, 2099, 1269, -65, -1383, -2194, -2195, -1378, -32, 1327, 2183, 2232, 1461, 163, -1192, -2092, -2232, -1569, -336, 1004, 1989, 2259, 1705, 536, -820, -1908, -2292, -1843, -731, 654, 1786, 2272, 1923, 882, -471, -1653, -2226, -2001, -1070, 262, 1485, 2168, 2067, 1204, -86, -1366, -2132, -2126, -1344, -67, 1205, 2029, 2096, 1415, 219, -1034, -1916, -2102, -1547, -440, 825, 1791, 2132, 1720, 672, -639, -1740, -2217, -1873, -840, 515, 1683, 2238, 1962, 982, -381, -1591, -2226, -2048, -1135, 205, 1470, 2201, 2142, 1289, -41, -1375, -2203, -2237, -1447, -103, 1263, 2161, 2272, 1528, 243, -1140, -2094, -2291, -1662, -421, 939, 1967, 2261, 1738, 578, -782, -1856, -2240, -1820, -753, 569, 1669, 2161, 1887, 945, -336, -1494, -2119, -2001, -1147, 132, 1391, 2126, 2105, 1279, -30, -1326, -2136, -2120, -1321, -34, 1233, 2036, 2081, 1362, 170, -1070, -1920, -2078, -1499, -381, 879, 1836, 2121, 1631, 527, -784, -1819, -2164, -1727, -639, 650, 1695, 2111, 1735, 759, -500, -1566, -2056, -1829, -945, 280, 1411, 2033, 1911, 1083, -156, -1350, -2046, -1994, -1188, 49, 1254, 1993, 1995, 1259, 53, -1170, -1959, -2038, -1371, -207, 1036, 1903, 2063, 1456, 293, -976, -1883, -2079, -1522, -401, 866, 1796, 2064, 1573, 514, -736, -1714, -2065, -1686, -676, 567, 1619, 2074, 1780, 832, -444, -1555, -2121, -1890, -963, 323, 1501, 2126, 1969, 1091, -196, -1413, -2116, -2025, -1193, 80, 1308, 2039, 2023, 1278, 74, -1129, -1909, -2007, -1389, -290, 920, 1777, 2023, 1541, 508, -724, -1697, -2065, -1680, -655, 597, 1654, 2087, 1769, 797, -464, -1547, -2048, -1787, -885, 356, 1464, 2044, 1895, 1053, -164, -1315, -1993, -1931, -1167, 42, 1239, 1983, 2025, 1319, 153, -1061, -1886, -2026, -1418, -307, 930, 1824, 2073, 1571, 516, -736, -1723, -2067, -1678, -668, 576, 1634, 2091, 1808, 856, -394, -1514, -2059, -1868, -980, 278, 1425, 2056, 1925, 1111, -98, -1248, -1932, -1918, -1205, -81, 1064, 1826, 1963, 1405, 356, -822, -1734, -2036, -1591, -567, 693, 1716, 2126, 1744, 713, -606, -1679, -2136, -1779, -781, 499, 1570, 2058, 1788, 880, -333, -1420, -1984, -1844, -1029, 140, 1266, 1927, 1890, 1162, 3, -1164, -1881, -1931, -1248, -141, 1009, 1784, 1915, 1365, 318, -833, -1698, -1965, -1521, -514, 678, 1641, 1998, 1624, 637, -609, -1634, -2049, -1713, -745, 484, 1526, 2000, 1735, 837, -374, -1439, -2008, -1855, -1028, 189, 1340, 2017, 1936, 1141, -99, -1300, -2050, -2029, -1275, -48, 1197, 1984, 2049, 1358, 168, -1077, -1915, -2067, -1472, -346, 900, 1806, 2046, 1545, 493, -734, -1689, -2026, -1623, -643, 570, 1556, 1968, 1675, 770, -397, -1416, -1920, -1730, -924, 211, 1272, 1877, 1813, 1093, -39, -1173, -1898, -1940, -1248, -89, 1122, 1936, 2020, 1356, 163, -1065, -1904, -2006, -1391, -259, 938, 1774, 1972, 1451, 432, -741, -1648, -1971, -1593, -639, 548, 1533, 1978, 1692, 796, -394, -1452, -1975, -1775, -953, 202, 1270, 1878, 1816, 1133, 21, -1077, -1826, -1923, -1346, -276, 924, 1782, 2000, 1468, 400, -831, -1742, -2028, -1552, -542, 663, 1603, 1946, 1580, 646, -514, -1483, -1908, -1666, -808, 320, 1331, 1857, 1702, 935, -189, -1247, -1860, -1791, -1083, 19, 1118, 1806, 1844, 1206, 122, -1018, -1776, -1919, -1343, -299, 869, 1718, 1950, 1467, 468, -724, -1648, -1980, -1578, -620, 587, 1559, 1976, 1682, 775, -395, -1423, -1919, -1707, -886, 257, 1307, 1880, 1780, 1036, -78, -1155, -1809, -1778, -1089, -14, 1068, 1756, 1799, 1202, 173, -900, -1635, -1771, -1268, -306, 785, 1582, 1827, 1422, 488, -616, -1506, -1835, -1495, -585, 566, 1504, 1897, 1597, 715, -415, -1367, -1802, -1579, -772, 306, 1291, 1811, 1705, 991, -80, -1135, -1784, -1791, -1117, -15, 1141, 1877, 1941, 1266, 116, -1074, -1842, -1918, -1265, -151, 1012, 1795, 1927, 1367, 336, -799, -1634, -1891, -1447, -493, 668, 1584, 1943, 1587, 650, -533, -1510, -1926, -1633, -735, 427, 1414, 1891, 1667, 857, -278, -1304, -1860, -1748, -974, 149, 1224, 1846, 1781, 1052, -68, -1146, -1793, -1777, -1119, -77, 966, 1631, 1734, 1218, 281, -757, -1542, -1795, -1430, -540, 567, 1489, 1880, 1575, 660, -521, -1522, -1949, -1654, -734, 429, 1421, 1862, 1629, 808, -304, -1291, -1816, -1698, -983, 89, 1126, 1770, 1767, 1123, 33, -1063, -1788, -1842, -1228, -156, 943, 1701, 1812, 1290, 313, -761, -1553, -1799, -1408, -520, 554, 1447, 1828, 1563, 720, -397, -1386, -1868, -1632, -808, 333, 1342, 1849, 1676, 896, -194, -1198, -1748, -1672, -980, 47, 1063, 1712, 1748, 1161, 148, -929, -1672, -1821, -1280, -261, 868, 1687, 1895, 1406, 415, -733, -1624, -1912, -1500, -534, 628, 1566, 1935, 1598, 662, -510, -1507, -1927, -1645, -768, 388, 1384, 1868, 1668, 867, -231, -1241, -1801, -1714, -1029, 26, 1074, 1734, 1778, 1176, 142, -962, -1719, -1855, -1307, -292, 844, 1654, 1857, 1371, 375, -756, -1615, -1883, -1452, -517, 607, 1488, 1812, 1451, 576, -522, -1423, -1796, -1519, -712, 350, 1267, 1709, 1542, 813, -230, -1200, -1760, -1668, -993, 76, 1102, 1734, 1710, 1055, -24, -1065, -1727, -1738, -1121, -108, 914, 1587, 1695, 1200, 296, -709, -1477, -1722, -1371, -532, 507, 1371, 1750, 1498, 685, -384, -1327, -1772, -1583, -795, 265, 1217, 1703, 1577, 891, -118, -1068, -1641, -1627, -1047, -85, 912, 1598, 1711, 1222, 245, -817, -1595, -1789, -1303, -328, 769, 1581, 1794, 1360, 428, -622, -1438, -1719, -1386, -582, 437, 1298, 1712, 1535, 812, -221, -1185, -1728, -1626, -923, 137, 1156, 1741, 1691, 1016, -1, -1018, -1636, -1655, -1089, -135, 853, 1525, 1664, 1225, 328, -670, -1449, -1706, -1346, -486, 560, 1416, 1748, 1440, 590, -472, -1354, -1725, -1460, -672, 358, 1245, 1668, 1496, 771, -215, -1136, -1641, -1554, -907, 69, 1020, 1608, 1610, 1037, 46, -950, -1631, -1722, -1177, -210, 856, 1605, 1759, 1255, 289, -803, -1602, -1819, -1375, -436, 638, 1475, 1763, 1418, 564, -505, -1379, -1778, -1551, -796, 246, 1193, 1720, 1624, 951, -92, -1109, -1744, -1758, -1117, -82, 1001, 1702, 1772, 1187, 161, -928, -1668, -1787, -1247, -263, 792, 1544, 1722, 1276, 379, -652, -1438, -1709, -1359, -547, 475, 1312, 1685, 1454, 687, -338, -1236, -1699, -1539, -824, 204, 1173, 1714, 1638, 965, -73, -1088, -1701, -1689, -1041, -23, 1025, 1684, 1715, 1133, 127, -917, -1611, -1711, -1191, -234, 791, 1524, 1703, 1284, 400, -619, -1416, -1690, -1358, -548, 467, 1317, 1685, 1467, 721, -285, -1171, -1649, -1533, -855, 133, 1079, 1638, 1621, 1006, 13, -978, -1616, -1648, -1080, -117, 883, 1555, 1673, 1165, 252, -772, -1499, -1688, -1256, -372, 651, 1447, 1715, 1357, 477, -558, -1421, -1730, -1408, -576, 454, 1308, 1663, 1425, 672, -304, -1159, -1604, -1491, -849, 85, 989, 1543, 1576, 1013, 99, -881, -1552, -1653, -1163, -239, 775, 1499, 1664, 1244, 359, -658, -1425, -1687, -1333, -508, 504, 1332, 1662, 1419, 639, -377, -1260, -1673, -1499, -749, 252, 1151, 1625, 1508, 861, -103, -1002, -1551, -1542, -991, -83, 845, 1488, 1593, 1145, 265, -723, -1448, -1645, -1226, -352, 666, 1430, 1667, 1288, 455, -532, -1301, -1585, -1292, -523, 414, 1217, 1568, 1373, 684, -235, -1077, -1516, -1403, -768, 153, 1031, 1527, 1485, 908, 20, -855, -1420, -1458, -974, -124, 777, 1412, 1542, 1143, 316, -638, -1347, -1572, -1201, -384, 592, 1346, 1616, 1307, 524, -434, -1223, -1570, -1345, -630, 325, 1177, 1639, 1520, 844, -169, -1135, -1689, -1609, -916, 147, 1159, 1722, 1638, 942, -94, -1062, -1613, -1550, -940, -18, 894, 1457, 1511, 1062, 239, -668, -1334, -1558, -1211, -434, 529, 1306, 1620, 1345, 557, -450, -1307, -1679, -1421, -623, 410, 1272, 1662, 1421, 667, -318, -1180, -1591, -1430, -755, 165, 1007, 1486, 1434, 875, 23, -861, -1435, -1524, -1075, -241, 695, 1378, 1582, 1196, 363, -626, -1387, -1639, -1299, -473, 513, 1304, 1603, 1319, 558, -402, -1205, -1579, -1390, -706, 234, 1095, 1564, 1471, 832, -129, -1058, -1604, -1548, -916, 53, 982, 1549, 1537, 955, 41, -882, -1475, -1528, -1046, -192, 731, 1386, 1555, 1169, 351, -595, -1340, -1595, -1265, -470, 519, 1306, 1624, 1355, 589, -389, -1229, -1606, -1406, -671, 307, 1193, 1632, 1477, 787, -183, -1086, -1568, -1478, -854, 83, 957, 1507, 1500, 991, 127, -776, -1409, -1549, -1134, -291, 674, 1406, 1635, 1258, 409, -615, -1410, -1662, -1288, -421, 588, 1370, 1630, 1283, 481, -487, -1258, -1563, -1307, -576, 362, 1152, 1529, 1353, 701, -206, -1042, -1504, -1417, -823, 73, 950, 1489, 1481, 959, 61, -852, -1469, -1550, -1066, -195, 748, 1416, 1556, 1132, 310, -614, -1319, -1550, -1235, -479, 442, 1217, 1560, 1355, 652, -306, -1171, -1603, -1451, -746, 228, 1131, 1582, 1464, 801, -128, -1006, -1493, -1453, -905, -47, 821, 1385, 1463, 1035, 209, -697, -1365, -1549, -1159, -337, 611, 1316, 1546, 1178, 396, -532, -1250, -1508, -1217, -490, 391, 1140, 1462, 1263, 613, -262, -1049, -1475, -1345, -745, 129, 977, 1458, 1419, 858, -31, -912, -1466, -1473, -945, -67, 827, 1425, 1491, 1042, 207, -688, -1337, -1496, -1145, -376, 507, 1231, 1518, 1277, 563, -384, -1206, -1604, -1400, -668, 319, 1187, 1576, 1381, 672, -265, -1073, -1480, -1340, -750, 82, 877, 1358, 1370, 914, 104, -747, -1359, -1465, -1039, -196, 716, 1352, 1475, 1034, 236, -634, -1239, -1395, -1042, -355, 444, 1078, 1337, 1155, 564, -249, -1004, -1410, -1320, -722, 158, 1007, 1472, 1393, 801, -113, -963, -1460, -1414, -862, -3, 851, 1391, 1442, 989, 157, -729, -1384, -1524, -1113, -297, 647, 1352, 1546, 1171, 377, -546, -1268, -1523, -1230, -522, 381, 1127, 1470, 1299, 674, -221, -1033, -1490, -1408, -811, 73, 939, 1465, 1435, 883, 0, -879, -1437, -1465, -974, -140, 734, 1344, 1455, 1049, 259, -625, -1297, -1503, -1164, -414, 488, 1202, 1461, 1199, 500, -362, -1099, -1429, -1273, -668, 158, 933, 1375, 1344, 831, 8, -837, -1397, -1454, -973, -122, 776, 1396, 1484, 1031, 183, -716, -1351, -1479, -1062, -270, 603, 1246, 1438, 1119, 389, -479, -1181, -1436, -1180, -470, 413, 1125, 1435, 1214, 562, -305, -1029, -1372, -1203, -608, 201, 917, 1323, 1252, 753, -24, -802, -1292, -1323, -865, -69, 778, 1345, 1426, 968, 152, -730, -1330, -1425, -969, -170, 693, 1290, 1410, 1040, 298, -536, -1164, -1379, -1089, -419, 407, 1090, 1401, 1208, 587, -243, -972, -1349, -1239, -670, 138, 891, 1336, 1302, 830, 62, -708, -1234, -1307, -919, -195, 626, 1220, 1390, 1071, 351, -502, -1166, -1402, -1107, -404, 468, 1156, 1420, 1165, 485, -364, -1064, -1374, -1174, -552, 268, 968, 1338, 1203, 656, -125, -864, -1287, -1262, -767, -12, 765, 1257, 1307, 878, 126, -683, -1265, -1378, -1001, -235, 602, 1227, 1388, 1051, 315, -547, -1213, -1422, -1118, -397, 465, 1146, 1407, 1144, 484, -364, -1062, -1381, -1198, -591, 211, 931, 1314, 1228, 724, -57, -814, -1299, -1317, -856, -78, 740, 1298, 1380, 948, 154, -684, -1279, -1366, -942, -182, 640, 1204, 1332, 972, 280, -489, -1077, -1267, -999, -374, 400, 1031, 1294, 1107, 506, -278, -957, -1273, -1117, -547, 239, 935, 1297, 1191, 679, -84, -804, -1233, -1218, -734, 8, 790, 1297, 1334, 890, 103, -724, -1272, -1349, -911, -119, 717, 1280, 1373, 969, 222, -591, -1188, -1342, -1018, -335, 480, 1125, 1378, 1143, 488, -338, -1062, -1389, -1213, -593, 242, 985, 1378, 1259, 707, -92, -858, -1317, -1319, -857, -91, 719, 1276, 1383, 999, 239, -639, -1277, -1458, -1089, -342, 556, 1217, 1423, 1108, 384, -473, -1143, -1403, -1156, -514, 304, 1001, 1331, 1198, 624, -185, -924, -1370, -1303, -781, 37, 836, 1335, 1332, 829, 15, -827, -1359, -1402, -940, -136, 710, 1267, 1345, 922, 150, -679, -1253, -1371, -997, -272, 523, 1100, 1274, 989, 355, -407, -1030, -1299, -1103, -529, 239, 927, 1281, 1174, 632, -157, -908, -1328, -1269, -736, 66, 839, 1301, 1279, 799, 5, -770, -1276, -1299, -852, -100, 685, 1211, 1284, 904, 196, -586, -1139, -1263, -943, -281, 487, 1062, 1245, 998, 387, -337, -944, -1199, -1037, -493, 214, 859, 1207, 1130, 666, -49, -742, -1193, -1213, -783, -76, 696, 1219, 1306, 929, 197, -626, -1203, -1351, -982, -252, 574, 1191, 1378, 1057, 353, -484, -1134, -1356, -1081, -401, 428, 1093, 1342, 1118, 478, -325, -1002, -1304, -1136, -564, 202, 888, 1262, 1186, 690, -57, -786, -1247, -1262, -822, -93, 685, 1220, 1307, 940, 211, -594, -1189, -1352, -1030, -326, 481, 1117, 1345, 1092, 437, -376, -1054, -1348, -1147, -529, 258, 953, 1272, 1147, 588, -167, -850, -1233, -1164, -692, 12, 706, 1148, 1184, 796, 102, -642, -1166, -1264, -900, -191, 594, 1150, 1279, 908, 213, -570, -1129, -1270, -945, -296, 439, 1031, 1232, 1015, 420, -314, -962, -1280, -1130, -572, 226, 958, 1341, 1240, 674, -163, -925, -1360, -1280, -730, 94, 881, 1347, 1326, 838, 45, -754, -1296, -1344, -900, -128, 692, 1258, 1373, 985, 244, -562, -1140, -1287, -963, -302, 457, 1033, 1231, 997, 427, -282, -868, -1155, -1014, -515, 167, 804, 1145, 1084, 627, -53, -725, -1113, -1102, -666, 13, 703, 1143, 1166, 766, 84, -636, -1113, -1176, -802, -120, 606, 1101, 1188, 861, 222, -475, -992, -1146, -894, -328, 327, 896, 1141, 1016, 529, -160, -824, -1194, -1153, -665, 77, 808, 1247, 1214, 732, -42, -807, -1264, -1248, -766, -35, 721, 1185, 1235, 821, 109, -665, -1189, -1285, -916, -192, 582, 1140, 1252, 909, 226, -540, -1092, -1247, -968, -349, 377, 966, 1205, 1029, 472, -262, -931, -1300, -1187, -641, 162, 921, 1327, 1237, 680, -147, -909, -1332, -1260, -729, 35, 781, 1243, 1255, 815, 97, -669, -1195, -1282, -909, -197, 569, 1137, 1257, 936, 290, -435, -969, -1161, -926, -402, 252, 807, 1109, 1028, 596, -45, -714, -1106, -1104, -676, 37, 738, 1178, 1150, 680, -29, -717, -1086, -1041, -603, 33, 647, 1015, 1030, 698, 122, -487, -931, -1039, -745, -182, 489, 989, 1145, 880, 284, -407, -940, -1110, -867, -308, 364, 909, 1133, 970, 469, -199, -801, -1110, -1023, -569, 107, 753, 1141, 1118, 707, 26, -657, -1115, -1163, -780, -120, 590, 1092, 1197, 885, 239, -486, -1041, -1204, -950, -337, 380, 956, 1196, 1000, 451, -268, -906, -1225, -1090, -562, 179, 856, 1216, 1101, 593, -170, -846, -1212, -1130, -634, 71, 734, 1121, 1096, 692, 15, -658, -1139, -1194, -847, -178, 565, 1092, 1212, 886, 215, -542, -1095, -1260, -979, -359, 362, 957, 1194, 1035, 506, -225, -878, -1250, -1172, -667, 84, 827, 1253, 1219, 724, -39, -780, -1208, -1194, -735, -32, 668, 1113, 1158, 787, 145, -537, -1026, -1136, -835, -229, 451, 963, 1115, 867, 311, -331, -838, -1046, -888, -433, 175, 735, 1050, 1027, 643, 19, -643, -1069, -1130, -751, -85, 646, 1131, 1203, 827, 156, -550, -1047, -1140, -836, -222, 474, 993, 1155, 905, 317, -373, -926, -1088, -825, -230, 440, 901, 970, 637, 92, -416, -681, -597, }; fldigi-4.1.06/src/soundcard/audio_alert.cxx0000644000175000017500000000476313472115777015576 00000000000000// Class Caudio_alert // // play various canned play_sounds or wav file using port audio interface #include "audio_alert.h" void Caudio_alert::bark() { try { sc_audio->play_sound(int_audio_bark, BARK_SIZE, SCRATE); sc_audio->silence(0.5, SCRATE); sc_audio->play_sound(int_audio_bark, BARK_SIZE, SCRATE); } catch (...) { throw; } } void Caudio_alert::checkout() { try { sc_audio->play_sound(int_audio_checkout, CHECKOUT_SIZE, SCRATE); } catch (...) { throw; } } void Caudio_alert::doesnot() { try { sc_audio->play_sound(int_audio_doesnot, DOESNOT_SIZE, SCRATE); } catch (...) { throw; } } void Caudio_alert::diesel() { try { sc_audio->play_sound(int_audio_diesel, DIESEL_SIZE, SCRATE); sc_audio->silence(0.5, SCRATE); sc_audio->play_sound(int_audio_diesel, DIESEL_SIZE, SCRATE); } catch (...) { throw; } } void Caudio_alert::steam_train() { try { sc_audio->play_sound(int_steam_train, STEAM_TRAIN_SIZE, SCRATE); } catch (...) { throw; } } void Caudio_alert::beeboo() { try { sc_audio->play_sound(int_audio_beeboo, BEEBOO, SCRATE); } catch (...) { throw; } } void Caudio_alert::phone() { try { sc_audio->play_sound(phonering, PHONERING, SCRATE); sc_audio->silence(1.0, SCRATE); sc_audio->play_sound(phonering, PHONERING, SCRATE); } catch (...) { throw; } } void Caudio_alert::dinner_bell() { try { sc_audio->play_sound(int_dinner_bell, DINNER_BELL, SCRATE); } catch (...) { throw; } } void Caudio_alert::file(std::string sndfile) { try { sc_audio->play_file(sndfile); } catch (...) { throw; } } void Caudio_alert::create_beeboo() { float bee = 800; float boo = 500; float val; float sr = 8000; for (int i = 0; i < BEEBOO; i++) { val = sin( (2.0 * M_PI * i / sr) * (i / 2000 % 2 == 0 ? bee : boo)); if (i < 500) val *= 1.0 * i / 500; if (i > (BEEBOO-500)) val *= 1.0 * (BEEBOO - i) / 500; int_audio_beeboo[i] = 32500 * val; } } void Caudio_alert::create_phonering() { int attack = 40; int ntones = 60; float freq = 480; float sr = 8000; int duration = PHONERING/ntones; float val; float modulation[duration]; for (int i = 0; i < duration; i++) { val = 1.0; if (i < attack) val *= (1.0 * i / attack); if (i > duration - attack) val *= (1.0 * (duration - i) / attack); modulation[i] = val; } for (int i = 0; i < ntones; i++) { for (int j = 0; j < duration; j++) { val = modulation[j] * sin(2.0 * M_PI * freq * (duration * i + j) / sr); phonering[duration * i + j] = 32500 * val; } } } Caudio_alert *audio_alert = 0; fldigi-4.1.06/src/soundcard/bark.cxx0000644000175000017500000003170313472115777014217 00000000000000#define BARK_SIZE 1501 int int_audio_bark[BARK_SIZE] = { 936, 1012, -165, -994, -1724, -1893, -2394, -2472, -2530, -2478, -2377, -1798, -574, 240, 1147, 1832, 2081, 1781, 1121, 363, -126, -531, -1056, -1456, -1930, -2058, -1772, -1485, -960, -277, 73, 588, 1058, 1282, 1023, 828, 889, 712, 701, 287, 27, 497, 985, 1017, 854, 713, 338, -410, -1292, -2121, -3223, -4354, -4515, -4051, -3019, -1229, -117, 1009, 2652, 3638, 3629, 2928, 1942, 691, -1293, -3184, -3935, -4378, -3328, -41, 2266, 2492, 2523, 1577, -44, -45, 155, -364, -940, -2107, -4449, -6415, -5723, -3739, -2078, 56, 3138, 4747, 4378, 4291, 3015, 513, -853, -2185, -3250, -2605, 754, 4961, 3605, 209, -275, -1622, -1733, -40, 373, -1272, -3562, -5569, -8514, -7745, -2744, 184, 1580, 5788, 9343, 8273, 6635, 5903, 2383, 127, 1966, 1722, -137, -132, -1861, -7002, -8002, -5436, -5412, -3565, 2390, 4452, 1745, 479, -1214, -3168, -402, 4158, 4354, 3759, 4258, 113, -4875, -2847, -2208, -3926, 3478, 11668, 7096, 225, 896, -2384, -6413, -1740, -794, -5297, -4708, -4509, -10118, -9582, -1133, 36, -184, 7892, 12924, 8567, 6161, 6063, 593, 3687, 14336, 11291, -1108, -6415, -9802, -16218, -14248, -8233, -9858, -8053, 44, 1230, 1693, 9394, 10094, 3951, 5414, 10972, 6555, -2876, -6074, -9317, -9172, 3208, 11631, 2695, -1550, 1974, -3751, -5942, 2407, -542, -8052, -4900, -5805, -11478, -6965, -1141, -4676, -2477, 9446, 14724, 7207, 4214, 2972, 7579, 19004, 17455, 3588, -6083, -9614, -18211, -16633, -11363, -15225, -14954, -7853, -2617, 3209, 11494, 14397, 10225, 12131, 18116, 10910, -1454, -7281, -13869, -13528, 4811, 10350, -4212, -8812, -3876, -5286, -625, 5750, -601, -4767, -1347, -3984, -9676, -4969, -1856, -6471, -1204, 11722, 12850, 4181, 1196, 15349, 25327, 18329, 7884, -3696, -19158, -20968, -10813, -17773, -22533, -13301, -10423, -7369, 11890, 22983, 14818, 7810, 13141, 15361, 4242, -4747, -5864, -241, 9446, 8563, -10230, -19311, -13076, -5681, 2472, 3607, -5697, -8606, -7203, -5532, 341, 2147, -4430, -6233, 1405, 13652, 13307, 4018, 19570, 28053, 16682, 4530, -2067, -17958, -26346, -7441, -11308, -29067, -19319, -7781, -11919, 4714, 28605, 17228, -785, 11447, 17924, 5243, -4279, 1, 14107, 12187, 12, -13253, -24193, -24268, -4772, 8636, -4916, -7588, 2145, -8046, -17247, -351, 2005, -7647, -5020, 10575, 18192, 19692, 30367, 28053, 16641, -1468, -1291, -12838, -31744, -15404, -10644, -26448, -21098, -2201, -5854, 1832, 27703, 20793, -2394, 6293, 23145, 2787, -12228, 11296, 19544, -843, -11725, -9231, -25238, -19697, 12591, 8178, -8909, 84, -856, -25659, -19309, -3978, -6000, -6666, 9349, 28970, 31926, 28975, 19534, 6011, -18080, -20029, -9107, -24414, -30097, -17450, -9881, -7682, 6749, 19759, 11986, 3548, 12223, 19381, 7266, 12289, 25661, 19256, 5822, -10922, -19256, -31215, -25296, 1660, 9553, -968, -6738, -6500, -18006, -18714, -10223, -5107, 550, 19094, 31929, 31053, 26512, 13469, 3189, -23024, -30544, -14481, -21138, -25954, -7976, -4223, -14974, -1883, 7719, 884, 6146, 22875, 31914, 29998, 24109, 4974, -14461, -22935, -24797, -17795, -14789, -13832, -8670, -432, -3427, -8542, 2048, 2661, 9237, 29075, 31261, 28236, 12400, -11842, -23705, -24063, -9716, -6491, -16594, -12211, 1458, -845, -844, -7539, -12609, -7329, 1884, 27862, 30684, 25842, 6831, -10331, -21275, -26266, 2533, 7163, -16739, -17304, 1245, -7152, -5299, -2555, -10415, -3468, 11662, 31026, 30442, 25922, 8034, -10723, -19631, -18811, -8916, -10846, -21045, -19358, -1723, 1366, 4668, 2668, -3133, 3464, 19986, 31998, 28612, 22576, 132, -18698, -20657, -15745, -10566, -8693, -11602, -14383, -6920, -9175, -8875, -1112, 4186, 21197, 31999, 30408, 24591, 2149, -24948, -30958, -12877, 5521, -2230, -16516, -12786, -7488, -6300, -7181, -9104, -6620, 3578, 25174, 31999, 24941, 14499, -13284, -31931, -28243, -13763, 5311, 6285, -4213, -7190, -9360, -10081, -12681, -9851, -2659, 15117, 31999, 29568, 23112, 796, -25452, -25582, -8939, -542, 4582, 2081, -5272, -6590, -7479, -14715, -14488, -6697, 3016, 25870, 31956, 29541, 19706, -4835, -24007, -25261, -10607, 3234, -300, -11045, -3911, -2982, -12166, -9990, -5871, 4317, 24408, 31999, 28434, 20350, -297, -27436, -29567, -15817, -12041, -2307, 6562, 2102, 95, 2949, -7426, -14748, -9580, -1018, 23353, 31466, 24704, 13015, -15850, -29620, -25941, -7213, 16243, 10885, -10456, -8419, -5971, -16447, -14369, -9160, -1455, 19822, 31999, 27930, 21652, 3394, -24579, -30074, -12122, -7596, -6768, 3144, 197, -8471, -2829, -8499, -13842, -7725, 2288, 24928, 31999, 27185, 18209, -6668, -29686, -28663, -13368, 9273, 8225, -7642, -4414, -3833, -9987, -10276, -6239, 1616, 22168, 31999, 27334, 20837, 1415, -24768, -31999, -20551, -4357, 4742, 5127, 356, -4032, -4844, -12882, -14038, -8026, 10686, 30850, 29005, 21033, 9350, -16203, -32000, -27891, -13596, 6718, 13043, 8687, -6282, -12147, -9561, -11886, -8304, 6969, 28295, 31521, 24043, 15132, -6152, -29848, -31131, -20039, 250, 13175, 11101, -1625, -10136, -9616, -12640, -9990, -2999, 18273, 31807, 29140, 21120, 8462, -17648, -32000, -27791, -11847, 9884, 9121, 1407, -5398, -10948, -13920, -11279, -5213, 15793, 31795, 30110, 21766, 10917, -11199, -31633, -31002, -21127, -1559, 9856, 17196, 382, -11732, -7953, -13201, -11726, 1561, 24800, 31999, 24889, 16271, 220, -26090, -32000, -27284, -10109, 17726, 19837, 4567, -8426, -15495, -15754, -11364, -3298, 19691, 31999, 28403, 19775, 8253, -16187, -32000, -30113, -16680, 4045, 10444, 14000, -2600, -9931, -6983, -12484, -10200, 5011, 27682, 31771, 23326, 14333, -4539, -28281, -32000, -24526, -4585, 14968, 15942, 1665, -11861, -14263, -13242, -10450, 1270, 24450, 31997, 26465, 18127, 3850, -21630, -32000, -28418, -16430, 6721, 16318, 10995, -5254, -6544, -10073, -14134, -9135, 7383, 29755, 30811, 22630, 13540, -3071, -28032, -31389, -23573, -7034, 10361, 18960, 8887, -11746, -15475, -14819, -10901, -2365, 20469, 31999, 27977, 20066, 8822, -14329, -31646, -27428, -11530, 2328, 12632, 13815, -12001, -12201, -9347, -14814, -9289, 3251, 26002, 31999, 26700, 18407, 4157, -20192, -31998, -22323, -11358, -537, 17947, 14265, -6220, -5075, -11492, -18331, -11039, -1724, 19946, 31999, 28516, 20518, 7250, -14795, -31999, -26068, -11016, -629, 8037, 4099, -4158, -4015, -12356, -13103, -8146, 5233, 27637, 31720, 25351, 17085, 2504, -22742, -31801, -15273, -11086, -12292, 3868, 2549, -6352, 1512, -5507, -13363, -7965, 4842, 26479, 31999, 25523, 17976, 3371, -21242, -32000, -17205, -15026, -12288, 12136, 13755, -4516, -3463, -10561, -17743, -10117, -2063, 19417, 31878, 30175, 23333, 11433, -10541, -31593, -22008, -9095, -16697, -3705, 18791, 6812, -5435, -9458, -19052, -19205, -10210, -1500, 6013, 23983, 31999, 30215, 23733, 7859, 2826, -18765, -32000, -21540, -20006, -12581, 7719, 4250, -18201, -12457, -7005, -9744, -1979, 11865, 7870, 11615, 29961, 31496, 26911, 16898, 5528, -15805, -31997, -28977, -18660, -12119, 1840, 11757, -39, -8726, -5670, -9570, -12239, -3676, 9404, 10221, 14626, 31182, 29041, 20866, 9633, -3001, -21451, -31998, -22070, -9348, -10791, -4152, 727, -13144, -14568, -9153, -6885, -2215, 12700, 22125, 20075, 17814, 26993, 25058, 14259, 4335, -7653, -18061, -29436, -31498, -24277, -13427, -4860, 3650, 3984, 4070, 5790, 2996, -3240, -731, 8178, 11136, 15931, 22771, 20807, 12398, 7522, 1971, -10819, -21067, -16161, -15357, -19771, -14101, -5421, -4959, -929, 3026, -4095, -7006, 1087, 6354, 8738, 18065, 21681, 12249, 4183, 9509, 9421, -4460, -12737, -2305, 8339, 1874, -4743, -5120, -12055, -17144, -11378, -4506, -1654, -1176, -1206, -3412, -2590, 5685, 8281, 5652, 8619, 5930, -1817, -705, 4277, 4112, 651, -4495, -578, 8989, 7699, -2156, -3422, -3827, -12806, -13564, -8547, -6887, -7533, -4058, -5639, -6669, -1803, -1224, 2741, 10322, 11616, 10276, 9867, 7733, 8644, 1999, -11311, -8064, 1854, 1894, 1770, 5169, 394, -6014, -5899, -10927, -12454, -8572, -7984, -11217, -6953, -2204, 3472, 11824, 13147, 16342, 16156, 13183, 9500, 8509, -826, -9260, -12127, -10795, -4719, -1123, 3716, 3640, 2030, -858, -3266, -5789, -5418, -6052, -4763, -4468, -2729, 340, 15, 4738, 10496, 15512, 17715, 16331, 9072, 2200, -7337, -16003, -17596, -15856, -8008, 2678, 5681, 8624, 10768, 6940, 3621, -764, -1542, -1504, -1520, -5275, -8908, -9129, -8268, -6305, 1641, 8510, 8315, 11224, 8406, 3993, 4393, -1455, -8750, -8807, -7750, -5796, -4092, 1346, 7399, 9405, 8669, 6676, 6276, 5729, 2215, -4138, -6636, -13179, -17010, -18096, -18872, -11305, -835, 8367, 14494, 15900, 13728, 11562, 5132, 1460, -2076, -7508, -7469, -7680, -5235, -3153, -4185, -2915, -913, 2620, 7081, 8780, 11201, 11205, 3817, -4399, -13065, -19283, -19323, -17210, -11000, -2420, 5806, 12571, 13722, 11972, 9939, 5963, 1130, -1873, -4666, -7041, -7803, -7526, -5278, -3846, -1240, -497, 730, 4982, 7551, 8964, 9399, 7217, 1681, -2494, -10218, -14825, -14814, -12372, -7528, -3654, 2387, 6345, 9165, 11087, 11650, 7542, 2497, -3454, -7717, -8043, -6363, -2586, -1639, -1783, 436, 1615, 968, 4580, 4333, 4053, 6327, 7140, 6070, 3511, -286, -5409, -11013, -13447, -11203, -10047, -4833, -580, 2712, 6713, 8770, 9068, 7257, 2668, -33, -1007, -2742, -831, -838, -1809, -776, -168, -846, -191, -466, 315, 743, 1421, 3448, 1396, 1457, 3297, 3324, 2577, 1880, -173, -2415, -5141, -6259, -4832, -5202, -3332, -272, 1161, 1810, 1583, 1680, 1803, 1834, 2796, 2141, 145, 964, 1002, -1651, -2117, -2399, -3407, -2426, -1855, 1154, 3115, 1737, 2947, 2144, -223, 557, 2386, 2584, 2853, 3387, 1178, -2610, -4853, -5482, -7643, -7710, -5138, -3539, -1142, 751, 1385, 2853, 2744, 3294, 5644, 3552, 2271, 2108, -52, -1746, -2759, -3103, -3633, -3469, -2443, -457, -197, -269, 13, 1637, 3952, 3354, 4365, 4915, 1627, 428, -1217, -4111, -4566, -6259, -6458, -4675, -3812, -2087, -414, -300, 740, 1367, 1172, 1694, 1678, 2983, 2179, 684, 1369, -152, -1562, -1910, -2983, -2099, -277, -494, -407, -1549, -3224, -3460, -2999, -642, 861, 2495, 3523, 2934, 3613, 3332, 593, -1052, -2399, -3148, -3129, -4482, -4381, -4066, -4641, -3228, -1526, -742, 1535, 1896, 1898, 3105, 3555, 3259, 2215, 801, -74, -698, -1116, -1784, -3600, -4257, -4804, -3776, -2021, -354, 1070, 1759, 898, 1668, 2141, 419, 958, 864, 1112, 549, -535, -848, -828, -1400, -1375, -1228, -986, -73, -18, -24, -260, -260, -214, -394, -818, 352, 1004, 725, 332, -281, -206, }; fldigi-4.1.06/src/soundcard/sound.cxx0000644000175000017500000017274513472115777014444 00000000000000// ---------------------------------------------------------------------------- // // sound.cxx // // Copyright (C) 2006-2013 // Dave Freese, W1HKJ // // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if USE_OSS # include # if defined(__OpenBSD__) # include # else # include # endif #endif #include #if HAVE_DLOPEN # include #endif #include "gettext.h" #include "sound.h" #include "configuration.h" #include "status.h" #include "fileselect.h" #include "trx.h" #include "fl_digi.h" #include "threads.h" #include "timeops.h" #include "ringbuffer.h" #include "debug.h" #include "qrunner.h" #include "icons.h" #include "macros.h" #include "util.h" #include "estrings.h" #define SND_BUF_LEN 65536 #define SND_RW_LEN (8 * SND_BUF_LEN) // We never write duplicate/QSK/PTT tone/PseudoFSK data to the sound files //#define SNDFILE_CHANNELS 1 #define SNDFILE_CHANNELS 2 int sndfile_samplerate[7] = {8000, 11025, 16000, 22050, 24000, 44100, 48000}; using namespace std; LOG_FILE_SOURCE(debug::LOG_AUDIO); SoundBase::SoundBase() : sample_frequency(0), txppm(progdefaults.TX_corr), rxppm(progdefaults.RX_corr), tx_src_state(0), rx_src_state(0), wrt_buffer(new double[SND_BUF_LEN]), #if USE_SNDFILE ofCapture(0), ifPlayback(0), ofGenerate(0), #endif capture(false), playback(false), generate(false) { memset(wrt_buffer, 0, SND_BUF_LEN * sizeof(*wrt_buffer)); #if USE_SNDFILE int err; writ_src_data_left = new SRC_DATA; writ_src_data_right = new SRC_DATA; play_src_data = new SRC_DATA; writ_src_state_left = src_new(progdefaults.sample_converter, 1, &err); if (writ_src_state_left == 0) throw SndException(src_strerror(err)); writ_src_state_right = src_new(progdefaults.sample_converter, 1, &err); if (writ_src_state_right == 0) throw SndException(src_strerror(err)); play_src_state = src_new(progdefaults.sample_converter, 1, &err); if (play_src_state == 0) throw SndException(src_strerror(err)); if (play_src_state == 0) throw SndException(src_strerror(err)); src_write_buffer_left = new float [SND_RW_LEN]; if (!src_write_buffer_left) throw SndException(src_strerror(err)); src_write_buffer_right = new float [SND_RW_LEN]; if (!src_write_buffer_right) throw SndException(src_strerror(err)); src_rd_inp_buffer = new float [SND_RW_LEN]; if (!src_rd_inp_buffer) throw SndException(src_strerror(err)); src_rd_out_buffer = new float [SND_RW_LEN]; if (!src_rd_out_buffer) throw SndException(src_strerror(err)); modem_wr_sr = modem_play_sr = 0; out_pointer = src_rd_out_buffer; #endif } SoundBase::~SoundBase() { delete [] wrt_buffer; #if USE_SNDFILE if (ofGenerate) sf_close(ofGenerate); if (ofCapture) sf_close(ofCapture); if (ifPlayback) sf_close(ifPlayback); delete writ_src_data_left; delete writ_src_data_right; delete play_src_data; delete [] src_write_buffer_left; delete [] src_write_buffer_right; delete [] src_rd_inp_buffer; delete [] src_rd_out_buffer; #endif } #if USE_SNDFILE void SoundBase::get_file_params(std::string def_fname, std::string &fname, int &format) { std::string filters = _("Waveform Audio Format\t*.wav\n"); filters.append(_("AU\t*.{au,snd}\n")); if (format_supported(SF_FORMAT_FLAC | SF_FORMAT_PCM_16)) { filters.append(_("Free Lossless Audio Codec\t*.flac")); } format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; int fsel; const char *fn = 0; if (def_fname.find("playback") != std::string::npos) fn = FSEL::select(_("Audio file"), filters.c_str(), def_fname.c_str(), &fsel); else fn = FSEL::saveas(_("Audio file"), filters.c_str(), def_fname.c_str(), &fsel); if (!fn || !*fn) { fname = ""; return; } fname = fn; bool check_replace = false; fsel = 0; switch (fsel) { default: case 0: format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; if (fname.find(".wav") == std::string::npos) { fname.append(".wav"); check_replace = true; } break; case 1: format = SF_FORMAT_AU | SF_FORMAT_FLOAT | SF_ENDIAN_CPU; if (fname.find(".au") == std::string::npos || fname.find(".snd") == std::string::npos) { fname.append(".au"); check_replace = true; } break; case 2: format = SF_FORMAT_FLAC | SF_FORMAT_PCM_16; if (fname.find(".flac") == std::string::npos) { fname.append(".flac"); check_replace = true; } break; } if (check_replace) { FILE *f = fopen(fname.c_str(), "r"); if (f) { fclose(f); int ans = fl_choice("Replace %s?", "Yes", "No", 0, fname.c_str()); if ( ans == 1) fname = ""; } } } int SoundBase::Capture(bool val) { if (!val) { if (ofCapture) { int err; if ((err = sf_close(ofCapture)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ofCapture = 0; } capture = false; return 1; } std::string fname; int format; get_file_params("capture", fname, format); if (fname.empty()) return 0; // frames (ignored), freq, channels, format, sections (ignored), seekable (ignored) SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], progdefaults.record_both_channels ? 2 : 1, // SNDFILE_CHANNELS, format, 0, 0 }; if ((ofCapture = sf_open(fname.c_str(), SFM_WRITE, &info)) == NULL) { LOG_ERROR("Could not write %s:%s", fname.c_str(), sf_strerror(NULL) ); return 0; } if (sf_command(ofCapture, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) != SF_TRUE) LOG_ERROR("ofCapture update header command failed: %s", sf_strerror(ofCapture)); tag_file(ofCapture, "Captured audio"); capture = true; return 1; } int SoundBase::Generate(bool val) { if (!val) { if (ofGenerate) { int err; if ((err = sf_close(ofGenerate)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ofGenerate = 0; } generate = false; return 1; } std::string fname; int format; get_file_params("generate", fname, format); if (fname.empty()) return 0; SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], progdefaults.record_both_channels ? 2 : 1, // SNDFILE_CHANNELS, format, 0, 0 }; if ((ofGenerate = sf_open(fname.c_str(), SFM_WRITE, &info)) == NULL) { LOG_ERROR("Could not write %s", fname.c_str()); return 0; } if (sf_command(ofGenerate, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) != SF_TRUE) LOG_ERROR("ofGenerate update header command failed: %s", sf_strerror(ofGenerate)); tag_file(ofGenerate, "Generated audio"); generate = true; modem_wr_sr = sample_frequency; writ_src_data_left->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_left, writ_src_data_left->src_ratio); writ_src_data_right->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_right, writ_src_data_right->src_ratio); return 1; } int SoundBase::Playback(bool val) { if (!val) { if (ifPlayback) { int err; if ((err = sf_close(ifPlayback)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ifPlayback = 0; } playback = false; return 1; } std::string fname; int format; get_file_params("playback", fname, format); if (fname.empty()) return -1; play_info.frames = 0; play_info.samplerate = 0; play_info.channels = 0; play_info.format = 0; play_info.sections = 0; play_info.seekable = 0; if ((ifPlayback = sf_open(fname.c_str(), SFM_READ, &play_info)) == NULL) { LOG_ERROR("Could not read %s:%s", fname.c_str(), sf_strerror(NULL) ); return -2; } LOG_VERBOSE ("wav file stats:\n\ frames : %d\n\ samplerate : %d\n\ channels : %d\n\ format : %d\n\ sections : %d\n\ seekable : %d", static_cast(play_info.frames), play_info.samplerate, play_info.channels, play_info.format, play_info.sections, play_info.seekable); modem_play_sr = sample_frequency; play_src_data->src_ratio = 1.0 * modem_play_sr / play_info.samplerate; src_set_ratio(play_src_state, play_src_data->src_ratio); LOG_VERBOSE ("src ratio %f", play_src_data->src_ratio); progdefaults.loop_playback = fl_choice2(_("Playback continuous loop?"), _("No"), _("Yes"), NULL); playback = true; new_playback = true; return 0; } // --------------------------------------------------------------------- // read_file // can be simplified from the equivalent read audio stream // source sr is arbitrary, requested is either 8000 or 11025 depending // on the modem in use // read from file and resample until a "count" number of converted samples // is available, or until at the end of the input file // --------------------------------------------------------------------- sf_count_t SoundBase::read_file(SNDFILE* file, float* buf, size_t count) { sf_count_t r = 0, rd_count = 0; int err = 0; if (new_playback || modem_play_sr != sample_frequency) { modem_play_sr = sample_frequency; play_src_data->src_ratio = 1.0 * modem_play_sr / play_info.samplerate; src_set_ratio(play_src_state, play_src_data->src_ratio); LOG_VERBOSE("src ratio %f", play_src_data->src_ratio); new_playback = true; } #define RDBLKSIZE 1024 float rdbuf[2 * RDBLKSIZE]; int ch = play_info.channels; while ( static_cast(out_pointer - src_rd_out_buffer) < count) { memset(src_rd_inp_buffer, 0, RDBLKSIZE * sizeof(float)); if (new_playback) { new_playback = false; rd_count = RDBLKSIZE; } else { memset(rdbuf, 0, 2 * RDBLKSIZE * sizeof(float)); rd_count = sf_readf_float(file, rdbuf, RDBLKSIZE); if (!rd_count) break; for (int i = 0; i < rd_count; i++) src_rd_inp_buffer[i] = rdbuf[i * ch]; } play_src_data->data_in = src_rd_inp_buffer; play_src_data->input_frames = rd_count; play_src_data->data_out = out_pointer; play_src_data->output_frames = SND_RW_LEN - (out_pointer - src_rd_out_buffer); play_src_data->end_of_input = 0; if ((err = src_process(play_src_state, play_src_data)) != 0) throw SndException(src_strerror(err)); out_pointer += play_src_data->output_frames_gen; } if ( static_cast(out_pointer - src_rd_out_buffer) >= count) { memcpy(buf, src_rd_out_buffer, count * sizeof(float)); memmove(src_rd_out_buffer, src_rd_out_buffer + count, (SND_RW_LEN - count) * sizeof(float)); out_pointer -= count; r = count; } if (r == 0) { src_reset (play_src_state); out_pointer = src_rd_out_buffer; if (!progdefaults.loop_playback) { Playback(0); bHighSpeed = false; REQ(reset_mnuPlayback); } else { memset(buf, count, sizeof(*buf)); sf_seek(file, 0, SEEK_SET); } } return r; } // --------------------------------------------------------------------- // write_file // All sound buffer data is resampled to a specified sample rate // progdefaults.wavSampleRate // resultant data (left channel only) is written to a wav file //---------------------------------------------------------------------- void SoundBase::write_file(SNDFILE* file, float* bufleft, float* bufright, size_t count) { if (bufright == NULL || !progdefaults.record_both_channels) { bufright = new float[count]; memset(bufright, 0, count * sizeof(float)); } int err; size_t output_size = count; float *bufl = bufleft; float *bufr = bufright; if (modem_wr_sr != sample_frequency) { modem_wr_sr = sample_frequency; writ_src_data_left->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; writ_src_data_left->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_left, writ_src_data_left->src_ratio); writ_src_data_right->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; writ_src_data_right->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_right, writ_src_data_right->src_ratio); } writ_src_data_left->data_in = bufleft; writ_src_data_left->input_frames = count; writ_src_data_left->data_out = src_write_buffer_left; writ_src_data_left->output_frames = SND_RW_LEN; writ_src_data_left->end_of_input = 0; writ_src_data_right->data_in = bufright; writ_src_data_right->input_frames = count; writ_src_data_right->data_out = src_write_buffer_right; writ_src_data_right->output_frames = SND_RW_LEN; writ_src_data_right->end_of_input = 0; if ((err = src_process(writ_src_state_left, writ_src_data_left)) != 0) { throw SndException(src_strerror(err)); } if ((err = src_process(writ_src_state_right, writ_src_data_right)) != 0) { throw SndException(src_strerror(err)); } output_size = writ_src_data_left->output_frames_gen; bufl = src_write_buffer_left; bufr = src_write_buffer_right; if (output_size) { if (progdefaults.record_both_channels) { float buffer[2*output_size]; for (size_t i = 0; i < output_size; i++) { buffer[2*i] = 0.9 * bufl[i]; buffer[2*i + 1] = 0.9 * bufr[i]; } sf_write_float(file, buffer, 2 * output_size); } else { sf_write_float(file, bufl, output_size); } } return; } void SoundBase::write_file(SNDFILE* file, double* bufleft, double *bufright, size_t count) { float *outbuf_l = new float[count]; float *outbuf_r = new float[count]; for (size_t i = 0; i < count; i++) { outbuf_l[i] = bufleft[i]; outbuf_r[i] = (bufright ? bufright[i] : 0); } write_file(file, outbuf_l, outbuf_r, count); delete [] outbuf_l; delete [] outbuf_r; return; } bool SoundBase::format_supported(int format) { SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], progdefaults.record_both_channels ? 2 : 1, format, 0, 0 }; SNDFILE* sndf = sf_open("temp.audio", SFM_WRITE, &info); sf_close(sndf); remove("temp.audio"); if (sndf) return true; return false; } void SoundBase::tag_file(SNDFILE *sndfile, const char *title) { int err; if ((err = sf_set_string(sndfile, SF_STR_TITLE, title)) != 0) { LOG_VERBOSE("sf_set_string STR_TITLE: %s", sf_error_number(err)); return; } sf_set_string(sndfile, SF_STR_COPYRIGHT, progdefaults.myName.c_str()); sf_set_string(sndfile, SF_STR_SOFTWARE, PACKAGE_NAME "-" PACKAGE_VERSION); sf_set_string(sndfile, SF_STR_ARTIST, progdefaults.myCall.c_str()); char s[64]; snprintf(s, sizeof(s), "%s freq=%s", active_modem->get_mode_name(), inpFreq->value()); sf_set_string(sndfile, SF_STR_COMMENT, s); time_t t = time(0); struct tm zt; (void)gmtime_r(&t, &zt); if (strftime(s, sizeof(s), "%Y-%m-%dT%H:%M:%Sz", &zt) > 0) sf_set_string(sndfile, SF_STR_DATE, s); } #endif // USE_SNDFILE #if USE_OSS #define MAXSC 32767.0f #define maxsc 32000.0 SoundOSS::SoundOSS(const char *dev ) { device = dev; cbuff = 0; try { Open(O_RDONLY); getVersion(); getCapabilities(); getFormats(); Close(); } catch (const SndException& e) { LOG_ERROR("device %s error: %s", device.c_str(), e.what()); } snd_buffer = new float [2 * SND_BUF_LEN]; src_buffer = new float [2 * SND_BUF_LEN]; cbuff = new unsigned char [4 * SND_BUF_LEN]; memset(snd_buffer, 0, 2 * SND_BUF_LEN * sizeof(*snd_buffer)); memset(src_buffer, 0, 2 * SND_BUF_LEN * sizeof(*src_buffer)); memset(cbuff, 0, 4 * SND_BUF_LEN * sizeof(*cbuff)); tx_src_data = new SRC_DATA; rx_src_data = new SRC_DATA; int err; rx_src_state = src_new(progdefaults.sample_converter, 2, &err); if (rx_src_state == 0) throw SndException(src_strerror(err)); tx_src_state = src_new(progdefaults.sample_converter, 2, &err); if (tx_src_state == 0) throw SndException(src_strerror(err)); rx_src_data->src_ratio = 1.0/(1.0 + rxppm/1e6); src_set_ratio ( rx_src_state, 1.0/(1.0 + rxppm/1e6)); tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } SoundOSS::~SoundOSS() { Close(); delete tx_src_data; delete rx_src_data; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete [] snd_buffer; delete [] src_buffer; delete [] cbuff; } void SoundOSS::setfragsize() { int sndparam; // Try to get ~100ms worth of samples per fragment sndparam = (int)log2(sample_frequency * 0.1); // double since we are using 16 bit samples sndparam += 1; // Unlimited amount of buffers for RX, four for TX if (mode == O_RDONLY) sndparam |= 0x7FFF0000; else sndparam |= 0x00040000; if (ioctl(device_fd, SNDCTL_DSP_SETFRAGMENT, &sndparam) < 0) throw SndException(errno); } int SoundOSS::Open(int md, int freq) { Close(); mode = md; try { int oflags = md; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif device_fd = fl_open(device.c_str(), oflags, 0); if (device_fd == -1) throw SndException(errno); Format(AFMT_S16_LE); // default: 16 bit little endian Channels(2); // 2 channels Frequency(freq); setfragsize(); } catch (...) { throw; } return 0; } void SoundOSS::Close(unsigned dir) { if (device_fd == -1) return; close(device_fd); device_fd = -1; } void SoundOSS::getVersion() { version = 0; #ifndef __FreeBSD__ if (ioctl(device_fd, OSS_GETVERSION, &version) == -1) { version = -1; throw SndException("OSS Version"); } #endif } void SoundOSS::getCapabilities() { capability_mask = 0; if (ioctl(device_fd, SNDCTL_DSP_GETCAPS, &capability_mask) == -1) { capability_mask = 0; throw SndException("OSS capabilities"); } } void SoundOSS::getFormats() { format_mask = 0; if (ioctl(device_fd, SNDCTL_DSP_GETFMTS, &format_mask) == -1) { format_mask = 0; throw SndException("OSS formats"); } } void SoundOSS::Format(int format) { play_format = format; if (ioctl(device_fd, SNDCTL_DSP_SETFMT, &play_format) == -1) { device_fd = -1; formatok = false; throw SndException("Unsupported snd card format"); } formatok = true; } void SoundOSS::Channels(int nuchannels) { channels = nuchannels; if (ioctl(device_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) { device_fd = -1; throw "Snd card channel request failed"; } } void SoundOSS::Frequency(int frequency) { sample_frequency = frequency; if (ioctl(device_fd, SNDCTL_DSP_SPEED, &sample_frequency) == -1) { device_fd = -1; throw SndException("Cannot set frequency"); } } int SoundOSS::BufferSize( int seconds ) { int bytes_per_channel = 0; switch (play_format) { case AFMT_MU_LAW: case AFMT_A_LAW: case AFMT_IMA_ADPCM: bytes_per_channel = 0; /* format not supported by this program */ break; case AFMT_S16_BE: case AFMT_U16_LE: case AFMT_U16_BE: case AFMT_MPEG: case AFMT_S16_LE: bytes_per_channel = 2; break; case AFMT_U8: case AFMT_S8: bytes_per_channel = 1; break; } return seconds * sample_frequency * bytes_per_channel * channels; } bool SoundOSS::wait_till_finished() { if (ioctl(device_fd, SNDCTL_DSP_POST, (void*)1) == -1 ) return false; if (ioctl(device_fd, SNDCTL_DSP_SYNC, (void*)0) == -1) return false; /* format (or ioctl()) not supported by device */ return true; /* all sound has been played */ } bool SoundOSS::reset_device() { if (ioctl(device_fd, SNDCTL_DSP_RESET, 0) == -1) { device_fd = -1; return false; /* format (or ioctl()) not supported by device */ } return 1; /* sounddevice has been reset */ } size_t SoundOSS::Read(float *buffer, size_t buffersize) { short int *ibuff = (short int *)cbuff; int numread; numread = read(device_fd, cbuff, buffersize * 4); if (numread == -1) throw SndException(errno); for (size_t i = 0; i < buffersize * 2; i++) src_buffer[i] = ibuff[i] / MAXSC; for (size_t i = 0; i < buffersize; i++) buffer[i] = src_buffer[2*i + (progdefaults.ReverseRxAudio ? 1 : 0)]; #if USE_SNDFILE if (capture) write_file(ofCapture, buffer, NULL, buffersize); if (playback) { read_file(ifPlayback, buffer, buffersize); return buffersize; } #endif if (rxppm != progdefaults.RX_corr) { rxppm = progdefaults.RX_corr; rx_src_data->src_ratio = 1.0/(1.0 + rxppm/1e6); src_set_ratio ( rx_src_state, 1.0/(1.0 + rxppm/1e6)); } if (rxppm == 0) return buffersize; // process using samplerate library rx_src_data->data_in = src_buffer; rx_src_data->input_frames = buffersize; rx_src_data->data_out = snd_buffer; rx_src_data->output_frames = SND_BUF_LEN; rx_src_data->end_of_input = 0; if ((numread = src_process(rx_src_state, rx_src_data)) != 0) throw SndException(src_strerror(numread)); numread = rx_src_data->output_frames_gen; for (int i = 0; i < numread; i++) buffer[i] = snd_buffer[2*i + (progdefaults.sig_on_right_channel ? 1 : 0)]; return numread; } size_t SoundOSS::Write(double *buf, size_t count) { int retval; short int *wbuff; unsigned char *p; #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, NULL, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } if (txppm == 0) { wbuff = new short int[2*count]; p = (unsigned char *)wbuff; for (size_t i = 0; i < count; i++) { wbuff[2*i] = wbuff[2*i+1] = (short int)(buf[i] * maxsc); } count *= sizeof(short int); retval = write(device_fd, p, 2*count); delete [] wbuff; if (retval == -1) throw SndException(errno); } else { float *inbuf; inbuf = new float[2*count]; size_t bufsize; for (size_t i = 0; i < count; i++) inbuf[2*i] = inbuf[2*i+1] = buf[i]; tx_src_data->data_in = inbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; retval = src_process(tx_src_state, tx_src_data); delete [] inbuf; if (retval != 0) throw SndException(src_strerror(retval)); bufsize = tx_src_data->output_frames_gen; wbuff = new short int[2*bufsize]; p = (unsigned char *)wbuff; for (size_t i = 0; i < 2*bufsize; i++) wbuff[i] = (short int)(src_buffer[i] * maxsc); int num2write = bufsize * 2 * sizeof(short int); retval = write(device_fd, p, num2write); delete [] wbuff; if (retval != num2write) throw SndException(errno); retval = count; } return retval; } size_t SoundOSS::Write_stereo(double *bufleft, double *bufright, size_t count) { int retval; short int *wbuff; unsigned char *p; #if USE_SNDFILE if (generate) write_file(ofGenerate, bufleft, bufright, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } if (txppm == 0) { wbuff = new short int[2*count]; p = (unsigned char *)wbuff; for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { wbuff[2*i+1] = (short int)(bufleft[i] * maxsc); wbuff[2*i] = (short int)(bufright[i] * maxsc); } else { wbuff[2*i] = (short int)(bufleft[i] * maxsc); wbuff[2*i+1] = (short int)(bufright[i] * maxsc); } } count *= sizeof(short int); retval = write(device_fd, p, 2*count); delete [] wbuff; if (retval == -1) throw SndException(errno); } else { float *inbuf; inbuf = new float[2*count]; size_t bufsize; for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { inbuf[2*i+1] = bufleft[i]; inbuf[2*i] = bufright[i]; } else { inbuf[2*i] = bufleft[i]; inbuf[2*i+1] = bufright[i]; } } tx_src_data->data_in = inbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; retval = src_process(tx_src_state, tx_src_data); delete [] inbuf; if (retval != 0) throw SndException(src_strerror(retval)); bufsize = tx_src_data->output_frames_gen; wbuff = new short int[2*bufsize]; p = (unsigned char *)wbuff; for (size_t i = 0; i < 2*bufsize; i++) wbuff[i] = (short int)(src_buffer[i] * maxsc); int num2write = bufsize * 2 * sizeof(short int); retval = write(device_fd, p, num2write); delete [] wbuff; if (retval != num2write) throw SndException(errno); retval = count; } return retval; } #endif // USE_OSS #if USE_PORTAUDIO bool SoundPort::pa_init = false; std::vector SoundPort::devs; static ostringstream device_text[2]; static pthread_mutex_t device_mutex = PTHREAD_MUTEX_INITIALIZER; map > supported_rates[2]; void SoundPort::initialize(void) { if (pa_init) return; init_hostapi_ext(); int err; if ((err = Pa_Initialize()) != paNoError) { #if __WIN32__ LOG_PERROR(win_error_string(err).c_str()); #else LOG_PERROR("Portaudio Initialize error"); #endif throw SndPortException(err); } pa_init = true; PaDeviceIndex ndev; if ((ndev = Pa_GetDeviceCount()) < 0) { LOG_PERROR("Portaudio device count error"); throw SndPortException(ndev); } if (ndev == 0) { LOG_PERROR("Portaudio, no audio devices"); throw SndException(ENODEV, "No available audio devices"); } devs.reserve(ndev); for (PaDeviceIndex i = 0; i < ndev; i++) devs.push_back(Pa_GetDeviceInfo(i)); } void SoundPort::terminate(void) { if (!pa_init) return; static_cast(Pa_Terminate()); pa_init = false; devs.clear(); supported_rates[0].clear(); supported_rates[1].clear(); } const std::vector& SoundPort::devices(void) { return devs; } void SoundPort::devices_info(string& in, string& out) { guard_lock devices_lock(&device_mutex); in = device_text[0].str(); out = device_text[1].str(); } const vector& SoundPort::get_supported_rates(const string& name, unsigned dir) { return supported_rates[dir][name]; } SoundPort::SoundPort(const char *in_dev, const char *out_dev) : req_sample_rate(0) { sd[0].device = in_dev; sd[0].params.channelCount = 2; // init_stream can change this to 0 or 1 sd[0].stream = 0; sd[0].frames_per_buffer = paFramesPerBufferUnspecified; sd[0].dev_sample_rate = 0; sd[0].state = spa_continue; sd[0].rb = 0; sd[0].advance = 0; sd[1].device = out_dev; sd[1].params.channelCount = 2; sd[1].stream = 0; sd[1].frames_per_buffer = paFramesPerBufferUnspecified; sd[1].dev_sample_rate = 0; sd[1].state = spa_continue; sd[1].rb = 0; sd[1].advance = 0; sem_t** sems[] = { &sd[0].rwsem, &sd[1].rwsem }; #if USE_NAMED_SEMAPHORES char sname[32]; #endif for (size_t i = 0; i < sizeof(sems)/sizeof(*sems); i++) { #if USE_NAMED_SEMAPHORES unsigned int un = i; snprintf(sname, sizeof(sname), "%u-%u-%s", un, getpid(), PACKAGE_TARNAME); if ((*sems[i] = sem_open(sname, O_CREAT | O_EXCL, 0600, 0)) == (sem_t*)SEM_FAILED) { pa_perror(errno, sname); throw SndException(errno); } # if HAVE_SEM_UNLINK if (sem_unlink(sname) == -1) { pa_perror(errno, sname); throw SndException(errno); } # endif #else *sems[i] = new sem_t; if (sem_init(*sems[i], 0, 0) == -1) { #if __WIN32__ int err = GetLastError(); LOG_PERROR(win_error_string(err).c_str()); #endif pa_perror(errno, "sem_init error"); throw SndException(errno); } #endif // USE_NAMED_SEMAPHORES } for (size_t i = 0; i < 2; i++) { sd[i].cmutex = new pthread_mutex_t; pthread_mutex_init(sd[i].cmutex, NULL); sd[i].ccond = new pthread_cond_t; pthread_cond_init(sd[i].ccond, NULL); } tx_src_data = new SRC_DATA; src_buffer = new float[sd[1].params.channelCount * SND_BUF_LEN]; fbuf = new float[2 * SND_BUF_LEN]; memset(src_buffer, 0, sd[1].params.channelCount * SND_BUF_LEN * sizeof(*src_buffer)); memset(fbuf, 0, 2 * SND_BUF_LEN * sizeof(*fbuf)); } SoundPort::~SoundPort() { Close(); sem_t* sems[] = { sd[0].rwsem, sd[1].rwsem }; for (size_t i = 0; i < sizeof(sems)/sizeof(*sems); i++) { #if USE_NAMED_SEMAPHORES if (sem_close(sems[i]) == -1) LOG_PERROR("sem_close"); #else if (sem_destroy(sems[i]) == -1) LOG_PERROR("sem_destroy"); delete sems[i]; #endif } for (size_t i = 0; i < 2; i++) { if (pthread_mutex_destroy(sd[i].cmutex) == -1) { pa_perror(errno, "pthread mutex destroy"); terminate(); //throw SndException(errno); } delete sd[i].cmutex; if (pthread_cond_destroy(sd[i].ccond) == -1) { pa_perror(errno, "pthread cond destroy"); terminate(); //throw SndException(errno); } delete sd[i].ccond; } delete sd[0].rb; delete sd[1].rb; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete tx_src_data; delete [] src_buffer; delete [] fbuf; } int SoundPort::Open(int mode, int freq) { int old_sample_rate = (int)req_sample_rate; req_sample_rate = sample_frequency = freq; // do we need to (re)initialise the streams? int ret = 1; int sr[2] = { progdefaults.in_sample_rate, progdefaults.out_sample_rate }; // initialize stream if it is a JACK device, regardless of mode device_iterator idev; int device_type = 0; if (mode == O_WRONLY && (idev = name_to_device(sd[0].device, 0)) != devs.end() && (device_type = Pa_GetHostApiInfo((*idev)->hostApi)->type) == paJACK) mode = O_RDWR; if (mode == O_RDONLY && (idev = name_to_device(sd[1].device, 1)) != devs.end() && (device_type = Pa_GetHostApiInfo((*idev)->hostApi)->type) == paJACK) mode = O_RDWR; size_t start = (mode == O_RDONLY || mode == O_RDWR) ? 0 : 1, end = (mode == O_WRONLY || mode == O_RDWR) ? 1 : 0; for (size_t i = start; i <= end; i++) { if ( !(stream_active(i) && (Pa_GetHostApiInfo((*sd[i].idev)->hostApi)->type == paJACK || old_sample_rate == freq || sr[i] != SAMPLE_RATE_AUTO)) ) { Close(i); init_stream(i); src_data_reset(i); // reset the semaphore while (sem_trywait(sd[i].rwsem) == 0); if (errno && errno != EAGAIN) { pa_perror(errno, "open failed"); throw SndException(errno); } start_stream(i); ret = 0; } else { pause_stream(i); src_data_reset(i); sd[i].state = spa_continue; } } static char pa_open_str[500]; snprintf(pa_open_str, sizeof(pa_open_str), "\ Port Audio open mode = %s\n\ device type = %s\n\ device name = %s\n\ # input channels %d\n\ # output channels %d", mode == O_WRONLY ? "Write" : mode == O_RDONLY ? "Read" : mode == O_RDWR ? "Read/Write" : "unknown", device_type == 0 ? "paInDevelopment" : device_type == 1 ? "paDirectSound" : device_type == 2 ? "paMME" : device_type == 3 ? "paASIO" : device_type == 4 ? "paSoundManager" : device_type == 5 ? "paCoreAudio" : device_type == 7 ? "paOSS" : device_type == 8 ? "paALSA" : device_type == 9 ? "paAL" : device_type == 10 ? "paBeOS" : device_type == 11 ? "paWDMKS" : device_type == 12 ? "paJACK" : device_type == 13 ? "paWASAPI" : device_type == 14 ? "paAudioScienceHPI" : "unknown", mode == O_WRONLY ? sd[1].device.c_str() : mode == O_RDONLY ? sd[0].device.c_str() : "unknown", sd[0].params.channelCount, sd[1].params.channelCount ); LOG_VERBOSE( "%s", pa_open_str); return ret; } void SoundPort::pause_stream(unsigned dir) { if (sd[dir].stream == 0 || !stream_active(dir)) return; pthread_mutex_lock(sd[dir].cmutex); sd[dir].state = spa_pause; if (pthread_cond_timedwait_rel(sd[dir].ccond, sd[dir].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", dir); pthread_mutex_unlock(sd[dir].cmutex); } void SoundPort::Close(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; pthread_mutex_lock(sd[i].cmutex); sd[i].state = spa_complete; // first wait for buffers to be drained and for the // stop callback to signal us that the stream has // been stopped if (pthread_cond_timedwait_rel(sd[i].ccond, sd[i].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", i); pthread_mutex_unlock(sd[i].cmutex); sd[i].state = spa_continue; int err; if ((err = Pa_CloseStream(sd[i].stream)) != paNoError) pa_perror(err, "Pa_CloseStream"); sd[i].stream = 0; } } void SoundPort::Abort(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; int err; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; if ((err = Pa_AbortStream(sd[i].stream)) != paNoError) #if __WIN32__ LOG_PERROR(win_error_string(err).c_str()); #endif pa_perror(err, "Pa_AbortStream"); sd[i].stream = 0; } } #define WAIT_FOR_COND(cond, s, t) \ do { \ while (!(cond)) { \ if (sem_timedwait_rel(s, t) == -1) { \ if (errno == ETIMEDOUT) { \ timeout = true; \ break; \ } else if (errno == EINTR) { \ continue; \ } \ LOG_PERROR("sem_timedwait"); \ throw SndException(errno); \ } \ } \ } while (0) size_t SoundPort::Read(float *buf, size_t count) { #if USE_SNDFILE if (playback) { read_file(ifPlayback, buf, count); if (!capture) { if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / req_sample_rate)); return count; } } #endif if (rxppm != progdefaults.RX_corr) rxppm = progdefaults.RX_corr; sd[0].src_ratio = req_sample_rate / (sd[0].dev_sample_rate * (1.0 + rxppm / 1e6)); src_set_ratio(rx_src_state, sd[0].src_ratio); size_t maxframes = (size_t)floor(sd[0].rb->length() * sd[0].src_ratio / sd[0].params.channelCount); if (unlikely(count > maxframes)) { size_t n = 0; #define PA_TIMEOUT_TRIES 10 int pa_timeout = PA_TIMEOUT_TRIES; // possible to lock up in this while block if the Read(...) fails while (count > maxframes) { n += Read(buf, maxframes); buf += maxframes * sd[0].params.channelCount; count -= n;//maxframes; pa_timeout--; if (pa_timeout == 0) { #if __WIN32__ int err = GetLastError(); LOG_PERROR(win_error_string(err).c_str()); #endif pa_perror(1, "Portaudio read error #1"); throw SndException("Portaudio read error 1"); } } if (count > 0) n += Read(buf, count); return n; } float* rbuf = fbuf; if (req_sample_rate != sd[0].dev_sample_rate || rxppm != 0) { long r; size_t n = 0; sd[0].blocksize = SCBLOCKSIZE; while (n < count) { if ((r = src_callback_read(rx_src_state, sd[0].src_ratio, count - n, rbuf + n * sd[0].params.channelCount)) == 0) { pa_perror(2, "Portaudio read error #2"); throw SndException("Portaudio read error 2"); } n += r; } } else { bool timeout = false; WAIT_FOR_COND( (sd[0].rb->read_space() >= count * sd[0].params.channelCount / sd[0].src_ratio), sd[0].rwsem, (MAX(1.0, 2 * count * sd[0].params.channelCount / sd->dev_sample_rate)) ); if (timeout) { pa_perror(3, "Portaudio read error #3"); throw SndException("Portaudio read error 3"); } ringbuffer::vector_type vec[2]; sd[0].rb->get_rv(vec); if (vec[0].len >= count * sd[0].params.channelCount) { rbuf = vec[0].buf; sd[0].advance = vec[0].len; } else sd[0].rb->read(rbuf, count * sd[0].params.channelCount); } if (sd[0].advance) { sd[0].rb->read_advance(sd[0].advance); sd[0].advance = 0; } // transfer active input channel; left == 0, right == 1 size_t n; for (size_t i = 0; i < count; i++) { n = sd[0].params.channelCount * i; if (sd[0].params.channelCount == 2) n += progdefaults.ReverseRxAudio; buf[i] = rbuf[n]; } #if USE_SNDFILE if (capture) write_file(ofCapture, buf, NULL, count); #endif return count; } size_t SoundPort::Write(double *buf, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, NULL, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // copy input to both channels if right channel enabled for (size_t i = 0; i < count; i++) if (progdefaults.sig_on_right_channel) fbuf[sd[1].params.channelCount * i] = fbuf[sd[1].params.channelCount * i + 1] = buf[i]; else if (progdefaults.ReverseAudio) { fbuf[sd[1].params.channelCount * i + 1] = buf[i]; fbuf[sd[1].params.channelCount * i] = 0; } else { fbuf[sd[1].params.channelCount * i] = buf[i]; fbuf[sd[1].params.channelCount * i + 1] = 0; } return resample_write(fbuf, count); } size_t SoundPort::Write_stereo(double *bufleft, double *bufright, size_t count) { if (sd[1].params.channelCount != 2) return Write(bufleft, count); #if USE_SNDFILE if (generate) write_file(ofCapture, bufleft, bufright, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // interleave into fbuf for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { fbuf[sd[1].params.channelCount * i + 1] = bufleft[i]; fbuf[sd[1].params.channelCount * i] = bufright[i]; } else { fbuf[sd[1].params.channelCount * i] = bufleft[i]; fbuf[sd[1].params.channelCount * i + 1] = bufright[i]; } } return resample_write(fbuf, count); } size_t SoundPort::resample_write(float* buf, size_t count) { size_t maxframes = (size_t)floor((sd[1].rb->length() / sd[1].params.channelCount) / tx_src_data->src_ratio); maxframes /= 2; // don't fill the buffer if (unlikely(count > maxframes)) { size_t n = 0; #define PA_TIMEOUT_TRIES 10 int pa_timeout = PA_TIMEOUT_TRIES; // possible to lock up in this while block if the resample_write(...) fails while (count > maxframes) { n += resample_write(buf, maxframes); buf += sd[1].params.channelCount * maxframes; count -= maxframes; pa_timeout--; if (pa_timeout == 0) { pa_perror(1, "Portaudio write error #1"); throw SndException("Portaudio write error 1"); } } if (count > 0) n += resample_write(buf, count); return n; } assert(count * sd[1].params.channelCount * tx_src_data->src_ratio <= sd[1].rb->length()); ringbuffer::vector_type vec[2]; sd[1].rb->get_wv(vec); float* wbuf = buf; if (req_sample_rate != sd[1].dev_sample_rate || progdefaults.TX_corr != 0) { if (vec[0].len >= sd[1].params.channelCount * (size_t)ceil(count * tx_src_data->src_ratio)) wbuf = vec[0].buf; // direct write in the rb else wbuf = src_buffer; if (txppm != progdefaults.TX_corr) txppm = progdefaults.TX_corr; tx_src_data->src_ratio = sd[1].dev_sample_rate * (1.0 + txppm / 1e6) / req_sample_rate; src_set_ratio(tx_src_state, tx_src_data->src_ratio); tx_src_data->data_in = buf; tx_src_data->input_frames = count; tx_src_data->data_out = wbuf; tx_src_data->output_frames = (wbuf == vec[0].buf ? vec[0].len : SND_BUF_LEN); tx_src_data->end_of_input = 0; int r; if ((r = src_process(tx_src_state, tx_src_data)) != 0) { pa_perror(2, "Portaudio write error #2"); throw SndException("Portaudio write error 2"); } if (tx_src_data->output_frames_gen == 0) // input was too small return count; count = tx_src_data->output_frames_gen; if (wbuf == vec[0].buf) { // advance write pointer and return sd[1].rb->write_advance(sd[1].params.channelCount * count); sem_trywait(sd[1].rwsem); return count; } } // if we didn't do a direct resample into the rb, or didn't resample at all, // we must now copy buf into the ringbuffer, possibly waiting for space first bool timeout = false; WAIT_FOR_COND( (sd[1].rb->write_space() >= sd[1].params.channelCount * count), sd[1].rwsem, (MAX(1.0, 2 * sd[1].params.channelCount * count / sd[1].dev_sample_rate)) ); if (timeout) { pa_perror(3, "Portaudio write error #3"); throw SndException("Portaudio write error 3"); } sd[1].rb->write(wbuf, sd[1].params.channelCount * count); return count; } void SoundPort::flush(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; pthread_mutex_lock(sd[i].cmutex); sd[i].state = spa_drain; if (pthread_cond_timedwait_rel(sd[i].ccond, sd[i].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", i); pthread_mutex_unlock(sd[i].cmutex); sd[i].state = spa_continue; } } void SoundPort::src_data_reset(unsigned dir) { size_t rbsize; int err; if (dir == 0) { if (rx_src_state) src_delete(rx_src_state); rx_src_state = src_callback_new(src_read_cb, progdefaults.sample_converter, sd[0].params.channelCount, &err, &sd[0]); if (!rx_src_state) { pa_perror(err, src_strerror(err)); throw SndException(src_strerror(err)); } sd[0].src_ratio = req_sample_rate / (sd[0].dev_sample_rate * (1.0 + rxppm / 1e6)); } else if (dir == 1) { if (tx_src_state) src_delete(tx_src_state); tx_src_state = src_new(progdefaults.sample_converter, sd[1].params.channelCount, &err); if (!tx_src_state) { pa_perror(err, src_strerror(err)); throw SndException(src_strerror(err)); } tx_src_data->src_ratio = sd[1].dev_sample_rate * (1.0 + txppm / 1e6) / req_sample_rate; } rbsize = 2 * MAX(ceil2( (unsigned)(2 * sd[dir].params.channelCount * SCBLOCKSIZE * MAX(req_sample_rate, sd[dir].dev_sample_rate) / MIN(req_sample_rate, sd[dir].dev_sample_rate))), 8192); stringstream info; info << "rbsize = " << rbsize; LOG_VERBOSE("%s", info.str().c_str()); if (sd[dir].rb) delete sd[dir].rb; sd[dir].rb = new ringbuffer(rbsize); } long SoundPort::src_read_cb(void* arg, float** data) { struct stream_data* sd = reinterpret_cast(arg); // advance read pointer for previous read if (sd->advance) { sd->rb->read_advance(sd->advance); sd->advance = 0; } // wait for data bool timeout = false; WAIT_FOR_COND( (sd->rb->read_space() >= (size_t)sd[0].params.channelCount * SCBLOCKSIZE), sd->rwsem, (MAX(1.0, 2 * sd[0].params.channelCount * SCBLOCKSIZE / sd->dev_sample_rate)) ); if (timeout) { *data = 0; return 0; } ringbuffer::vector_type vec[2]; sd->rb->get_rv(vec); *data = vec[0].buf; sd->advance = vec[0].len; return vec[0].len / sd[0].params.channelCount; } SoundPort::device_iterator SoundPort::name_to_device(std::string &name, unsigned dir) { device_iterator i; for (i = devs.begin(); i != devs.end(); ++i) if (name == (*i)->name && (dir ? (*i)->maxOutputChannels : (*i)->maxInputChannels)) break; return i; } void SoundPort::init_stream(unsigned dir) { const char* dir_str[2] = { "input", "output" }; PaDeviceIndex idx = paNoDevice; LOG_DEBUG("looking for device \"%s\"", sd[dir].device.c_str()); if ((sd[dir].idev = name_to_device(sd[dir].device, dir)) != devs.end()) idx = sd[dir].idev - devs.begin(); if (idx == paNoDevice) { // no match LOG_ERROR("Could not find device \"%s\", using default device", sd[dir].device.c_str()); PaDeviceIndex def = (dir == 0 ? Pa_GetDefaultInputDevice() : Pa_GetDefaultOutputDevice()); if (def == paNoDevice) { pa_perror(paDeviceUnavailable, "Portaudio device unavailable"); throw SndPortException(paDeviceUnavailable); } sd[dir].idev = devs.begin() + def; idx = def; } else if (sd[dir].idev == devs.end()) // if we only found a near-match point the idev iterator to it sd[dir].idev = devs.begin() + idx; const PaHostApiInfo* host_api = Pa_GetHostApiInfo((*sd[dir].idev)->hostApi); int max_channels = dir ? (*sd[dir].idev)->maxOutputChannels : (*sd[dir].idev)->maxInputChannels; if ((host_api->type == paALSA || host_api->type == paOSS) && max_channels == 0) { pa_perror(EBUSY, "Portaudio device busy"); throw SndException(EBUSY); } if (dir == 0) { sd[0].params.device = idx; sd[0].params.sampleFormat = paFloat32; sd[0].params.suggestedLatency = (*sd[dir].idev)->defaultHighInputLatency; sd[0].params.hostApiSpecificStreamInfo = NULL; if (max_channels < 2) sd[0].params.channelCount = max_channels; if (max_channels == 0) { pa_perror(EBUSY, "Portaudio device cannot open for read"); throw SndException(EBUSY); } } else { sd[1].params.device = idx; sd[1].params.sampleFormat = paFloat32; if (host_api->type == paMME) sd[1].params.suggestedLatency = (*sd[dir].idev)->defaultLowOutputLatency; else sd[1].params.suggestedLatency = (*sd[dir].idev)->defaultHighOutputLatency; sd[1].params.hostApiSpecificStreamInfo = NULL; if (max_channels < 2) sd[1].params.channelCount = max_channels; } const vector& rates = supported_rates[dir][(*sd[dir].idev)->name]; if (rates.size() <= 1) probe_supported_rates(sd[dir].idev); ostringstream ss; if (rates.size() > 1) copy(rates.begin() + 1, rates.end(), ostream_iterator(ss, " ")); else ss << "Unknown"; { guard_lock devices_lock(&device_mutex); device_text[dir].str(""); device_text[dir] << "index: " << idx << "\nname: " << (*sd[dir].idev)->name << "\nhost API: " << host_api->name << "\nmax input channels: " << (*sd[dir].idev)->maxInputChannels << "\nmax output channels: " << (*sd[dir].idev)->maxOutputChannels << "\ndefault sample rate: " << (*sd[dir].idev)->defaultSampleRate << "\nsupported sample rates: " << ss.str() << boolalpha << "\ninput only: " << ((*sd[dir].idev)->maxOutputChannels == 0) << "\noutput only: " << ((*sd[dir].idev)->maxInputChannels == 0) << "\nfull duplex: " << full_duplex_device(*sd[dir].idev) << "\nsystem default input: " << (idx == Pa_GetDefaultInputDevice()) << "\nsystem default output: " << (idx == Pa_GetDefaultOutputDevice()) << "\nhost API default input: " << (idx == host_api->defaultInputDevice) << "\nhost API default output: " << (idx == host_api->defaultOutputDevice) << "\ndefault low input latency: " << (*sd[dir].idev)->defaultLowInputLatency << "\ndefault high input latency: " << (*sd[dir].idev)->defaultHighInputLatency << "\ndefault low output latency: " << (*sd[dir].idev)->defaultLowOutputLatency << "\ndefault high output latency: " << (*sd[dir].idev)->defaultHighOutputLatency << "\n"; } LOG_VERBOSE("using %s (%d ch) device \"%s\":\n%s", dir_str[dir], sd[dir].params.channelCount, sd[dir].device.c_str(), device_text[dir].str().c_str()); sd[dir].dev_sample_rate = find_srate(dir); if (sd[dir].dev_sample_rate != req_sample_rate) LOG_DEBUG("%s: resampling %f <=> %f", dir_str[dir], sd[dir].dev_sample_rate, req_sample_rate); if (progdefaults.PortFramesPerBuffer > 0) { sd[dir].frames_per_buffer = progdefaults.PortFramesPerBuffer; LOG_DEBUG("%s: frames_per_buffer=%u", dir_str[dir], sd[dir].frames_per_buffer); } } void SoundPort::start_stream(unsigned dir) { int err; PaStreamParameters* sp[2]; sp[dir] = &sd[dir].params; sp[!dir] = NULL; err = Pa_OpenStream(&sd[dir].stream, sp[0], sp[1], sd[dir].dev_sample_rate, sd[dir].frames_per_buffer, paNoFlag, stream_process, &sd[dir]); if (err != paNoError) { // pa_perror(err, "Portaudio open stream error"); throw SndPortException(err); } if ((err = Pa_SetStreamFinishedCallback(sd[dir].stream, stream_stopped)) != paNoError) throw SndPortException(err); if ((err = Pa_StartStream(sd[dir].stream)) != paNoError) { pa_perror(err, "Portaudio stream start stream error"); Close(); throw SndPortException(err); } } int SoundPort::stream_process( const void* in, void* out, unsigned long nframes, const PaStreamCallbackTimeInfo *time_info, PaStreamCallbackFlags flags, void* data) { struct stream_data* sd = reinterpret_cast(data); #ifndef NDEBUG struct { PaStreamCallbackFlags f; const char* s; } fa[] = { { paInputUnderflow, "Input underflow" }, { paInputOverflow, "Input overflow" }, { paOutputUnderflow, "Output underflow" }, { paOutputOverflow, "Output overflow" } }; for (size_t i = 0; i < sizeof(fa)/sizeof(*fa); i++) if (flags & fa[i].f) LOG_DEBUG("%s", fa[i].s); #endif if (unlikely(sd->state == spa_abort || sd->state == spa_complete)) // finished return sd->state; if (in) { switch (sd->state) { case spa_continue: // write into the rb, post rwsem if we wrote anything if (sd->rb->write(reinterpret_cast(in), sd->params.channelCount * nframes)) sem_post(sd->rwsem); break; case spa_drain: case spa_pause: // signal the cv pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); } } else if (out) { float* outf = reinterpret_cast(out); // if we are paused just pretend that the rb was empty size_t nread = (sd->state == spa_pause) ? 0 : sd->rb->read(outf, sd->params.channelCount * nframes); memset(outf + nread, 0, (sd->params.channelCount * nframes - nread) * sizeof(float)); // fill rest with 0 switch (sd->state) { case spa_continue: // post rwsem if we read anything if (nread > 0) sem_post(sd->rwsem); break; case spa_drain: // signal the cv when we have emptied the buffer if (nread > 0) break; // else fall through case spa_pause: pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); break; } } return paContinue; } void SoundPort::stream_stopped(void* data) { struct stream_data* sd = reinterpret_cast(data); if (sd->rb) sd->rb->reset(); pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); } bool SoundPort::stream_active(unsigned dir) { if (!sd[dir].stream) return false; int err; if ((err = Pa_IsStreamActive(sd[dir].stream)) < 0) { pa_perror(err, "Portaudio stream active error"); throw SndPortException(err); } return err == 1; } bool SoundPort::full_duplex_device(const PaDeviceInfo* dev) { return dev->maxInputChannels > 0 && dev->maxOutputChannels > 0; } bool SoundPort::must_close(int dir) { return Pa_GetHostApiInfo((*sd[dir].idev)->hostApi)->type != paJACK; } double SoundPort::find_srate(unsigned dir) { int sr = (dir == 0 ? progdefaults.in_sample_rate : progdefaults.out_sample_rate); switch (sr) { case SAMPLE_RATE_UNSET: case SAMPLE_RATE_AUTO: break; case SAMPLE_RATE_NATIVE: return (*sd[dir].idev)->defaultSampleRate; default: return sr; } const vector& rates = supported_rates[dir][(*sd[dir].idev)->name]; for (vector::const_iterator i = rates.begin(); i != rates.end(); i++) if (req_sample_rate == *i || (*sd[dir].idev)->defaultSampleRate == *i) return *i; pa_perror(0, "Portaudio - no supported sample rate found"); throw SndException("No supported sample rate found"); } void SoundPort::probe_supported_rates(const device_iterator& idev) { PaStreamParameters params[2]; params[0].device = params[1].device = idev - devs.begin(); params[0].channelCount = 2; params[1].channelCount = 2; params[0].sampleFormat = params[1].sampleFormat = paFloat32; params[0].suggestedLatency = (*idev)->defaultHighInputLatency; params[1].suggestedLatency = (*idev)->defaultHighOutputLatency; params[0].hostApiSpecificStreamInfo = params[1].hostApiSpecificStreamInfo = NULL; supported_rates[0][(*idev)->name].clear(); supported_rates[1][(*idev)->name].clear(); supported_rates[0][(*idev)->name].push_back((*idev)->defaultSampleRate); supported_rates[1][(*idev)->name].push_back((*idev)->defaultSampleRate); extern double std_sample_rates[]; for (const double* r = std_sample_rates; *r > 0.0; r++) { if (Pa_IsFormatSupported(¶ms[0], NULL, *r) == paFormatIsSupported) supported_rates[0][(*idev)->name].push_back(*r); if (Pa_IsFormatSupported(NULL, ¶ms[1], *r) == paFormatIsSupported) supported_rates[1][(*idev)->name].push_back(*r); } } void SoundPort::pa_perror(int err, const char* str) { if (str) LOG_ERROR("%s: %s", str, Pa_GetErrorText(err)); if (err == paUnanticipatedHostError) { const PaHostErrorInfo* hosterr = Pa_GetLastHostErrorInfo(); PaHostApiIndex i = Pa_HostApiTypeIdToHostApiIndex(hosterr->hostApiType); if (i < 0) { // PA failed without setting its "last host error" info. Sigh... LOG_ERROR("Host API error info not available"); if ( ((sd[0].stream && Pa_GetHostApiInfo((*sd[0].idev)->hostApi)->type == paOSS) || (sd[1].stream && Pa_GetHostApiInfo((*sd[1].idev)->hostApi)->type == paOSS)) && errno ) LOG_ERROR("Possible OSS error %d: %s", errno, strerror(errno)); } else LOG_ERROR("%s error %ld: %s", Pa_GetHostApiInfo(i)->name, hosterr->errorCode, hosterr->errorText); } } void SoundPort::init_hostapi_ext(void) { #if HAVE_DLOPEN && !defined(__WOE32__) void* handle = dlopen(NULL, RTLD_LAZY); if (!handle) return; PaError (*set_jack_client_name)(const char*); const char* err = dlerror(); set_jack_client_name = (PaError (*)(const char*))dlsym(handle, "PaJack_SetClientName"); if (!(err = dlerror())) set_jack_client_name(main_window_title.c_str()); # ifndef NDEBUG else LOG_VERBOSE("dlsym(PaJack_SetClientName) error: %s", err); # endif #endif } #endif // USE_PORTAUDIO #if USE_PULSEAUDIO SoundPulse::SoundPulse(const char *dev) { sd[0].stream = 0; sd[0].stream_params.channels = 2; sd[0].dir = PA_STREAM_RECORD; sd[0].stream_params.format = PA_SAMPLE_FLOAT32LE; sd[0].buffer_attrs.maxlength = (uint32_t)-1; sd[0].buffer_attrs.minreq = (uint32_t)-1; sd[0].buffer_attrs.prebuf = (uint32_t)-1; sd[0].buffer_attrs.fragsize = SCBLOCKSIZE * sizeof(float); sd[0].buffer_attrs.tlength = (uint32_t)-1; sd[1].stream = 0; sd[1].dir = PA_STREAM_PLAYBACK; sd[1].stream_params.format = PA_SAMPLE_FLOAT32LE; sd[1].stream_params.channels = 2; sd[1].buffer_attrs.maxlength = (uint32_t)-1; sd[1].buffer_attrs.minreq = (uint32_t)-1; sd[1].buffer_attrs.prebuf = (uint32_t)-1; sd[1].buffer_attrs.fragsize = (uint32_t)-1; sd[1].buffer_attrs.tlength = SCBLOCKSIZE * sizeof(float); tx_src_data = new SRC_DATA; snd_buffer = new float[sd[0].stream_params.channels * SND_BUF_LEN]; rbuf = new float[sd[0].stream_params.channels * SND_BUF_LEN]; src_buffer = new float[sd[1].stream_params.channels * SND_BUF_LEN]; fbuf = new float[sd[1].stream_params.channels * SND_BUF_LEN]; memset(snd_buffer, 0, sd[0].stream_params.channels * SND_BUF_LEN * sizeof(*snd_buffer)); memset(rbuf, 0, sd[0].stream_params.channels * SND_BUF_LEN * sizeof(*rbuf)); memset(src_buffer, 0, sd[1].stream_params.channels * SND_BUF_LEN * sizeof(*src_buffer)); memset(fbuf, 0, sd[1].stream_params.channels * SND_BUF_LEN * sizeof(*fbuf)); } SoundPulse::~SoundPulse() { Close(); delete tx_src_data; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete [] snd_buffer; delete [] src_buffer; delete [] fbuf; delete [] rbuf; } int SoundPulse::Open(int dir, int freq) { const char* server = (progdefaults.PulseServer.length() ? progdefaults.PulseServer.c_str() : NULL); char sname[32]; int err; sample_frequency = freq; src_data_reset(1 << O_RDONLY | 1 << O_WRONLY); if ((unsigned)freq != sd[dir].stream_params.rate) Close(dir); sd[dir].stream_params.rate = freq; snprintf(sname, sizeof(sname), "%s (%u)", (dir ? "playback" : "capture"), getpid()); setenv("PULSE_PROP_application.icon_name", PACKAGE_TARNAME, 1); sd[dir].stream = pa_simple_new(server, main_window_title.c_str(), sd[dir].dir, NULL, sname, &sd[dir].stream_params, NULL, &sd[dir].buffer_attrs, &err); if (!sd[dir].stream) throw SndPulseException(err); return 0; } void SoundPulse::Close(unsigned dir) { if (dir == 1 || dir == UINT_MAX) flush(1); Abort(dir); } void SoundPulse::Abort(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (sd[i].stream) { pa_simple_free(sd[i].stream); sd[i].stream = 0; } } } void SoundPulse::flush(unsigned dir) { int err = PA_OK; if ((dir == 1 || dir == UINT_MAX) && sd[1].stream) { // wait for audio to finish playing // pa_simple_drain(sd[1].stream, &err); MilliSleep(SCBLOCKSIZE * 1000 / sd[1].stream_params.rate); pa_simple_flush(sd[1].stream, &err); } if ((dir == 0 || dir == UINT_MAX) && sd[0].stream) { // We need to flush the captured audio that PA has been // buffering for us while we were transmitting. We will use // pa_simple_get_latency() which, contrary to the docs, also // works for capture streams. It tells us how much earlier the // data that would be returned by pa_simple_read() was actually // captured, and we read and discard all that data. pa_usec_t t = pa_simple_get_latency(sd[0].stream, &err); if (t && err == PA_OK) { size_t bytes = pa_usec_to_bytes(t, &sd[0].stream_params); while (bytes > SND_BUF_LEN) { pa_simple_read(sd[0].stream, snd_buffer, SND_BUF_LEN, &err); if (err != PA_OK) break; bytes -= SND_BUF_LEN; } if (bytes) pa_simple_read(sd[0].stream, snd_buffer, bytes, &err); } } } size_t SoundPulse::Write(double* buf, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, NULL, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // copy input to both channels for (size_t i = 0; i < count; i++) if (progdefaults.sig_on_right_channel) fbuf[sd[1].stream_params.channels * i] = fbuf[sd[1].stream_params.channels * i + 1] = buf[i]; else if (progdefaults.ReverseAudio) { fbuf[sd[1].stream_params.channels * i + 1] = buf[i]; fbuf[sd[1].stream_params.channels * i] = 0; } else { fbuf[sd[1].stream_params.channels * i] = buf[i]; fbuf[sd[1].stream_params.channels * i + 1] = 0; } return resample_write(fbuf, count); } size_t SoundPulse::Write_stereo(double* bufleft, double* bufright, size_t count) { if (sd[1].stream_params.channels != 2) return Write(bufleft, count); #if USE_SNDFILE if (generate) write_file(ofGenerate, bufleft, bufright, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { fbuf[sd[1].stream_params.channels * i + 1] = bufleft[i]; fbuf[sd[1].stream_params.channels * i] = bufright[i]; } else { fbuf[sd[1].stream_params.channels * i] = bufleft[i]; fbuf[sd[1].stream_params.channels * i + 1] = bufright[i]; } } return resample_write(fbuf, count); } size_t SoundPulse::resample_write(float* buf, size_t count) { int err; float *wbuf = buf; if (progdefaults.TX_corr != 0) { if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm / 1e6; src_set_ratio(tx_src_state, tx_src_data->src_ratio); } tx_src_data->data_in = wbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; if ((err = src_process(tx_src_state, tx_src_data)) != 0) throw SndException(src_strerror(err)); if (tx_src_data->output_frames_gen == 0) // input was too small return count; wbuf = tx_src_data->data_out; count = tx_src_data->output_frames_gen; } if (pa_simple_write(sd[1].stream, wbuf, count * sd[1].stream_params.channels * sizeof(float), &err) == -1) throw SndPulseException(err); return count; } long SoundPulse::src_read_cb(void* arg, float** data) { SoundPulse* p = reinterpret_cast(arg); int err; int nread = 0; if ((nread = pa_simple_read(p->sd[0].stream, p->snd_buffer, p->sd[0].stream_params.channels * sizeof(float) * p->sd[0].blocksize, &err)) == -1) { LOG_ERROR("%s", pa_strerror(err)); *data = 0; return 0; } *data = p->snd_buffer; return p->sd[0].blocksize; } size_t SoundPulse::Read(float *buf, size_t count) { #if USE_SNDFILE if (playback) { read_file(ifPlayback, buf, count); if (!capture) { flush(0); if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } } #endif size_t n = 0; long r = 0; if (progdefaults.RX_corr != 0) { if (rxppm != progdefaults.RX_corr) { rxppm = progdefaults.RX_corr; sd[0].src_ratio = 1.0 / (1.0 + rxppm / 1e6); src_set_ratio(rx_src_state, sd[0].src_ratio); } sd[0].blocksize = SCBLOCKSIZE; while (n < count) { if ((r = src_callback_read(rx_src_state, sd[0].src_ratio, count - n, rbuf + n)) == 0) break; n += r; } } else { int err; if ((r = pa_simple_read(sd[0].stream, rbuf, sd[0].stream_params.channels * sizeof(float) * count, &err)) == -1) throw SndPulseException(err); } // transfer active input channel; left == 0, right == 1 size_t i = 0; if (sd[0].stream_params.channels == 2) n = progdefaults.ReverseRxAudio; else n = 0; while (i < count) { buf[i] = rbuf[n]; i++; n += sd[0].stream_params.channels; } #if USE_SNDFILE if (capture) write_file(ofCapture, buf, NULL, count); #endif return count; } void SoundPulse::src_data_reset(int mode) { int err; if (mode & 1 << O_RDONLY) { if (rx_src_state) src_delete(rx_src_state); rx_src_state = src_callback_new(src_read_cb, progdefaults.sample_converter, sd[0].stream_params.channels, &err, this); if (!rx_src_state) throw SndException(src_strerror(err)); sd[0].src_ratio = 1.0 / (1.0 + rxppm / 1e6); } if (mode & 1 << O_WRONLY) { if (tx_src_state) src_delete(tx_src_state); tx_src_state = src_new(progdefaults.sample_converter, sd[1].stream_params.channels, &err); if (!tx_src_state) throw SndException(src_strerror(err)); tx_src_data->src_ratio = 1.0 + txppm / 1e6; } } #endif // USE_PULSEAUDIO size_t SoundNull::Write(double* buf, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, NULL, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } size_t SoundNull::Write_stereo(double* bufleft, double* bufright, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, bufleft, bufright, count); #endif MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } size_t SoundNull::Read(float *buf, size_t count) { #if USE_SNDFILE if (playback) { read_file(ifPlayback, buf, count); } else #endif memset(buf, 0, count * sizeof(*buf)); #if USE_SNDFILE if (capture) write_file(ofCapture, buf, NULL, count); #endif if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } fldigi-4.1.06/src/soundcard/soundconf.cxx0000664000175000017500000003526313507402064015270 00000000000000// ---------------------------------------------------------------------------- // soundconf.cxx // // Copyright (C) 2008-2010, Stelios Bounanos, M0GLD // Copyright (C) 2014 David Freese, W1HKJ // Copyright (C) 2015 Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #if USE_PORTAUDIO # include # include #endif #include #include #include #if USE_OSS # include #endif #include "soundconf.h" #include "sound.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "debug.h" #include "util.h" LOG_FILE_SOURCE(debug::LOG_AUDIO); using namespace std; double std_sample_rates[] = { 8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1.0 }; static void init_oss(void) { #if USE_OSS glob_t gbuf; glob("/dev/dsp*", 0, NULL, &gbuf); if (gbuf.gl_pathc == 0) { AudioOSS->deactivate(); btnAudioIO[SND_IDX_OSS]->deactivate(); menuOSSDev->deactivate(); return; } for (size_t i = 0; i < gbuf.gl_pathc; i++) menuOSSDev->add(gbuf.gl_pathv[i]); if (progdefaults.OSSdevice.length() == 0 && gbuf.gl_pathc) progdefaults.OSSdevice = gbuf.gl_pathv[0]; menuOSSDev->value(progdefaults.OSSdevice.c_str()); globfree(&gbuf); menuOSSDev->activate(); #endif // USE_OSS } #if USE_PORTAUDIO map pa_api_prio; struct padev { public: padev(const PaDeviceInfo* dev_, PaDeviceIndex idx_, PaHostApiTypeId api_) : dev(dev_), idx(idx_), api(api_) { } bool operator<(const padev& rhs) const { return pa_api_prio.find(api) != pa_api_prio.end() && pa_api_prio.find(rhs.api) != pa_api_prio.end() && pa_api_prio[api] < pa_api_prio[rhs.api]; } const PaDeviceInfo* dev; PaDeviceIndex idx; PaHostApiTypeId api; }; static PaDeviceIndex get_default_portaudio_device(int dir) { #ifndef __linux__ goto ret_def; #else // Recent PortAudio snapshots prefer ALSA over OSS for the default device, but there are // still versions out there that try OSS first. We check the default host api type and, // if it is not ALSA, return the ALSA default device instead. PaHostApiIndex api_idx; if ((api_idx = Pa_GetDefaultHostApi()) < 0) goto ret_def; const PaHostApiInfo* host_api; if ((host_api = Pa_GetHostApiInfo(api_idx)) == NULL || host_api->type == paALSA) goto ret_def; LOG_DEBUG("Default host API is %s, trying default ALSA %s device instead", host_api->name, (dir == 0 ? "input" : "output")); api_idx = Pa_GetHostApiCount(); if (api_idx < 0) goto ret_def; for (PaHostApiIndex i = 0; i < api_idx; i++) if ((host_api = Pa_GetHostApiInfo(i)) && host_api->type == paALSA) return dir == 0 ? host_api->defaultInputDevice : host_api->defaultOutputDevice; #endif // __linux__ ret_def: return dir == 0 ? Pa_GetDefaultInputDevice() : Pa_GetDefaultOutputDevice(); } #include std::string str_pa_devices; static void init_portaudio(void) { try { SoundPort::initialize(); } catch (const SndException& e) { // if (e.error() == ENODEV) // don't complain if there are no devices // return; str_pa_devices.assign("\nPortaudio devices init failure:"); str_pa_devices.assign(e.what()); AudioPort->deactivate(); btnAudioIO[SND_IDX_PORT]->deactivate(); if (progdefaults.btnAudioIOis == SND_IDX_PORT) progdefaults.btnAudioIOis = SND_IDX_NULL; return; } pa_api_prio.clear(); #if defined(__APPLE__) pa_api_prio[paASIO] = 0; pa_api_prio[paCoreAudio] = 1; #elif defined(__WOE32__) pa_api_prio[paASIO] = 0; pa_api_prio[paWASAPI] = 1; pa_api_prio[paMME] = 2; pa_api_prio[paDirectSound] = 3; #else pa_api_prio[paALSA] = 0; pa_api_prio[paJACK] = 1; pa_api_prio[paOSS] = 2; #endif list devlist; int devnbr = 0; for (SoundPort::device_iterator idev = SoundPort::devices().begin(); idev != SoundPort::devices().end(); ++idev) { devlist.push_back( padev(*idev, idev - SoundPort::devices().begin(), Pa_GetHostApiInfo((*idev)->hostApi)->type) ); devnbr++; } devlist.sort(); str_pa_devices.assign("\nPortaudio devices:\n"); PaHostApiTypeId first_api = devlist.begin()->api; for (list::const_iterator ilist = devlist.begin(); ilist != devlist.end(); ilist++) { string menu_item; string::size_type i = 0; if (ilist->api != first_api) { // add a submenu menu_item.append(Pa_GetHostApiInfo(ilist->dev->hostApi)->name).append(" devices/"); i = menu_item.length(); } menu_item.append(ilist->dev->name); str_pa_devices.append(menu_item).append("\n"); // backslash-escape any slashes in the device name while ((i = menu_item.find('/', i)) != string::npos) { menu_item.insert(i, 1, '\\'); i += 2; } // add to menu if (ilist->dev->maxInputChannels > 0) menuPortInDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); if (ilist->dev->maxOutputChannels > 0) menuPortOutDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); } if (progdefaults.PortInDevice.length() == 0) { if (progdefaults.PAdevice.length() == 0) { PaDeviceIndex def = get_default_portaudio_device(0); if (def != paNoDevice) { progdefaults.PortInDevice = (*(SoundPort::devices().begin() + def))->name; progdefaults.PortInIndex = def; } } else progdefaults.PortInDevice = progdefaults.PAdevice; } if (progdefaults.PortOutDevice.length() == 0) { if (progdefaults.PAdevice.length() == 0) { PaDeviceIndex def = get_default_portaudio_device(1); if (def != paNoDevice) { progdefaults.PortOutDevice = (*(SoundPort::devices().begin() + def))->name; progdefaults.PortOutIndex = def; } } else progdefaults.PortOutDevice = progdefaults.PAdevice; } // select the correct menu items pa_set_dev(menuPortInDev, progdefaults.PortInDevice, progdefaults.PortInIndex); pa_set_dev(menuPortOutDev, progdefaults.PortOutDevice, progdefaults.PortOutIndex); } int pa_set_dev(Fl_Choice *loc_choice, std::string loc_dev_name, int loc_dev_index) { const Fl_Menu_Item *loc_menu = (Fl_Menu_Item *)0; int loc_size = 0; int loc_dev_found = PA_DEV_NOT_FOUND; int loc_idx = -1; if(!loc_choice) return loc_dev_found; loc_menu = loc_choice->menu(); loc_size = loc_choice->size(); for (int loc_i = 0; loc_i < loc_size - 1; loc_i++, loc_menu++) { if (loc_menu->label() && loc_dev_name == loc_menu->label()) { loc_idx = loc_i; loc_dev_found = PA_DEV_FOUND; if (reinterpret_cast(loc_menu->user_data()) == loc_dev_index || loc_dev_found == -1) { // exact match, or index was never saved loc_dev_found = PA_EXACT_DEV_FOUND; } } } if (loc_idx >= 0) { loc_choice->value(loc_idx); loc_choice->set_changed(); } return loc_dev_found; } #else static void init_portaudio(void) { } #endif // USE_PORTAUDIO static void build_srate_listbox(Fl_ListBox* lbox, const double* rates, size_t length, double defrate = -1.0) { lbox->clear(); lbox->add("Auto"); lbox->add("Native"); char s[16]; for (size_t i = 0; i < length; i++) { if (defrate != rates[i]) snprintf(s, sizeof(s), "%.0f", rates[i]); else snprintf(s, sizeof(s), "%.0f (native)", rates[i]); lbox->add(s); } } int sample_rate_converters[FLDIGI_NUM_SRC] = { SRC_SINC_BEST_QUALITY, SRC_SINC_MEDIUM_QUALITY, SRC_SINC_FASTEST #if !(defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)) , SRC_LINEAR #endif }; static void sound_init_options(void) { build_srate_listbox(menuInSampleRate, std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); build_srate_listbox(menuOutSampleRate, std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); for (int i = 0; i < FLDIGI_NUM_SRC; i++) menuSampleConverter->add(src_get_name(sample_rate_converters[i])); // Warn if we are using ZOH if (progdefaults.sample_converter == SRC_ZERO_ORDER_HOLD) { progdefaults.sample_converter = SRC_LINEAR; LOG_WARN("The Zero Order Hold sample rate converter should not be used! " "Your setting has been changed to Linear."); } #if defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) // SRC_LINEAR may crash with 11025Hz modems. Change to SINC_FASTEST. if (progdefaults.sample_converter == SRC_LINEAR) { progdefaults.sample_converter = SRC_SINC_FASTEST; LOG_WARN("Linear sample rate converter may not work on this architecture. " "Your setting has been changed to Fastest Sinc"); } #endif for (int i = 0; i < FLDIGI_NUM_SRC; i++) { if (sample_rate_converters[i] == progdefaults.sample_converter) { menuSampleConverter->index(i); menuSampleConverter->tooltip(src_get_description(progdefaults.sample_converter)); break; } } menuOSSDev->value(progdefaults.OSSdevice.c_str()); inpPulseServer->value(progdefaults.PulseServer.c_str()); char sr[20]; if (progdefaults.in_sample_rate == SAMPLE_RATE_UNSET && (progdefaults.in_sample_rate = progdefaults.sample_rate) == SAMPLE_RATE_UNSET) progdefaults.in_sample_rate = SAMPLE_RATE_NATIVE; else if (progdefaults.in_sample_rate < SAMPLE_RATE_OTHER) menuInSampleRate->index(progdefaults.in_sample_rate); else { snprintf(sr, sizeof(sr), "%d", progdefaults.in_sample_rate); for (int i = SAMPLE_RATE_NATIVE + 1; i < menuInSampleRate->lsize(); i++) { menuInSampleRate->index(i); if (strstr(menuInSampleRate->value(), sr)) break; } } if (progdefaults.out_sample_rate == SAMPLE_RATE_UNSET && (progdefaults.out_sample_rate = progdefaults.sample_rate) == SAMPLE_RATE_UNSET) progdefaults.out_sample_rate = SAMPLE_RATE_NATIVE; else if (progdefaults.out_sample_rate < SAMPLE_RATE_OTHER) menuOutSampleRate->index(progdefaults.out_sample_rate); else { snprintf(sr, sizeof(sr), "%d", progdefaults.out_sample_rate); for (int i = SAMPLE_RATE_NATIVE + 1; i < menuOutSampleRate->lsize(); i++) { menuOutSampleRate->index(i); if (strstr(menuOutSampleRate->value(), sr)) break; } } cntRxRateCorr->value(progdefaults.RX_corr); cntTxRateCorr->value(progdefaults.TX_corr); cntTxOffset->value(progdefaults.TxOffset); } #if USE_PULSEAUDIO # include # include # include # if PA_API_VERSION < 12 static inline int PA_CONTEXT_IS_GOOD(pa_context_state_t x) { return x == PA_CONTEXT_CONNECTING || x == PA_CONTEXT_AUTHORIZING || x == PA_CONTEXT_SETTING_NAME || x == PA_CONTEXT_READY; } # endif static bool probe_pulseaudio(void) { pa_mainloop* loop = pa_mainloop_new(); if (!loop) return false; bool ok = false; pa_context* context = pa_context_new(pa_mainloop_get_api(loop), PACKAGE_TARNAME); if (context && pa_context_connect(context, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL) >= 0) { pa_context_state_t state; do { // iterate main loop until the context connection fails or becomes ready if (!(ok = (pa_mainloop_iterate(loop, 1, NULL) >= 0 && PA_CONTEXT_IS_GOOD(state = pa_context_get_state(context))))) break; } while (state != PA_CONTEXT_READY); } if (context) { pa_context_disconnect(context); pa_context_unref(context); } pa_mainloop_free(loop); return ok; } #else static bool probe_pulseaudio(void) { return false; } #endif // USE_PULSEAUDIO void sound_init(void) { init_oss(); init_portaudio(); // set the Sound Card configuration tab to the correct initial values #if !USE_OSS AudioOSS->deactivate(); btnAudioIO[SND_IDX_OSS]->deactivate(); #endif #if !USE_PORTAUDIO AudioPort->deactivate(); btnAudioIO[SND_IDX_PORT]->deactivate(); #endif #if !USE_PULSEAUDIO AudioPulse->deactivate(); btnAudioIO[SND_IDX_PULSE]->deactivate(); #endif if (progdefaults.btnAudioIOis == SND_IDX_UNKNOWN || !btnAudioIO[progdefaults.btnAudioIOis]->active()) { // or saved sound api now disabled int io[4] = { SND_IDX_PORT, SND_IDX_PULSE, SND_IDX_OSS, SND_IDX_NULL }; if (probe_pulseaudio()) { // prefer pulseaudio io[0] = SND_IDX_PULSE; io[1] = SND_IDX_PORT; } for (size_t i = 0; i < sizeof(io)/sizeof(*io); i++) { if (btnAudioIO[io[i]]->active()) { progdefaults.btnAudioIOis = io[i]; break; } } } sound_init_options(); sound_update(progdefaults.btnAudioIOis); } void sound_close(void) { #if USE_PORTAUDIO SoundPort::terminate(); #endif } void sound_update(unsigned idx) { // radio button for (size_t i = 0; i < sizeof(btnAudioIO)/sizeof(*btnAudioIO); i++) btnAudioIO[i]->value(i == idx); // devices menuOSSDev->deactivate(); menuPortInDev->deactivate(); menuPortOutDev->deactivate(); inpPulseServer->deactivate(); // settings menuInSampleRate->deactivate(); menuOutSampleRate->deactivate(); progdefaults.btnAudioIOis = idx; switch (idx) { #if USE_OSS case SND_IDX_OSS: scDevice[0] = scDevice[1] = menuOSSDev->value(); menuOSSDev->activate(); break; #endif #if USE_PORTAUDIO case SND_IDX_PORT: menuPortInDev->activate(); menuPortOutDev->activate(); if (menuPortInDev->text()) scDevice[0] = menuPortInDev->text(); if (menuPortOutDev->text()) scDevice[1] = menuPortOutDev->text(); { Fl_ListBox* listbox[2] = { menuInSampleRate, menuOutSampleRate }; for (size_t i = 0; i < 2; i++) { char* label = strdup(listbox[i]->value()); const vector& srates = SoundPort::get_supported_rates(scDevice[i], i); switch (srates.size()) { case 0: // startup; no devices initialised yet build_srate_listbox(listbox[i], std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); break; case 1: // default sample rate only, build menu with all std rates build_srate_listbox(listbox[i], std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1, srates[0]); break; default: // first element is default sample rate, build menu with rest build_srate_listbox(listbox[i], &srates[0] + 1, srates.size() - 1, srates[0]); break; } for (int j = 0; j < listbox[i]->lsize(); j++) { listbox[i]->index(j); if (strstr(listbox[i]->value(), label)) break; } free(label); listbox[i]->activate(); } } break; #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: inpPulseServer->activate(); scDevice[0] = scDevice[1] = inpPulseServer->value(); break; #endif case SND_IDX_NULL: scDevice[0] = scDevice[1] = ""; break; }; } fldigi-4.1.06/src/soundcard/play.pa.cxx0000644000175000017500000001615413472115777014647 00000000000000// Pulse Class #include #include "play.pa.h" #include "misc.h" #include "debug.h" static pthread_t alert_pthread; static pthread_mutex_t alert_mutex; bool alert_thread_running = false; static bool alert_terminate_flag = false; struct PLAYLIST { c_portaudio *cpa; float *fbuff; int bufflen; int sr; }; std::queue playlist; /********************************************************************************** * AUDIO_ALERT process event. **********************************************************************************/ void process_alert() { if (playlist.empty()) return; struct PLAYLIST *plist = playlist.front(); if (plist->cpa == 0) { //LOG_INFO("%s", "plist->cpa == 0"); guard_lock que_lock(&alert_mutex); playlist.pop(); delete [] plist->fbuff; delete plist; return; } // opening a stream creates a new service thread in port audio plist->cpa->open(plist->sr); if (!plist->cpa->stream) { plist->cpa->close(); playlist.pop(); return; } int paError = Pa_StartStream(plist->cpa->stream); if (paError == paNoError) { #define FBUFLEN 512 float fbuff[FBUFLEN]; int len = 2 * plist->bufflen; int n = 0; while (n < (len - FBUFLEN)) { memset(fbuff, 0, FBUFLEN * sizeof(*fbuff)); memcpy(fbuff, &plist->fbuff[n], FBUFLEN * sizeof(float)); paError = Pa_WriteStream(plist->cpa->stream, fbuff, FBUFLEN/2); n += FBUFLEN; } if (n < len) { memset(fbuff, 0, FBUFLEN * sizeof(*fbuff)); memcpy(fbuff, &plist->fbuff[n], (len - n) * sizeof(float)); paError = Pa_WriteStream(plist->cpa->stream, fbuff, FBUFLEN/2); } paError = Pa_StopStream(plist->cpa->stream); } if (paError != paNoError) LOG_ERROR("paError = %d", paError); // closing the stream terminates the service thread in port audio plist->cpa->close(); delete [] plist->fbuff; delete plist; guard_lock que_lock(&alert_mutex); playlist.pop(); //LOG_INFO("%d items remain in play list", (int)(playlist.size())); } /********************************************************************************** * AUDIO_ALERT processing loop. * syncs to requests for audio alert output **********************************************************************************/ static void * alert_loop(void *args) { SET_THREAD_ID(AUDIO_ALERT_TID); alert_thread_running = true; alert_terminate_flag = false; while(1) { MilliSleep(50); if (alert_terminate_flag) break; if(trx_state == STATE_RX) { process_alert(); } } return (void *)0; } /********************************************************************************** * Start AUDIO_ALERT Thread **********************************************************************************/ static void start_alert_thread(void) { if(alert_thread_running) return; memset((void *) &alert_pthread, 0, sizeof(alert_pthread)); memset((void *) &alert_mutex, 0, sizeof(alert_mutex)); if(pthread_mutex_init(&alert_mutex, NULL)) { LOG_ERROR("AUDIO_ALERT thread create fail (pthread_mutex_init)"); return; } memset((void *) &alert_pthread, 0, sizeof(alert_pthread)); if (pthread_create(&alert_pthread, NULL, alert_loop, NULL) < 0) { pthread_mutex_destroy(&alert_mutex); LOG_ERROR("AUDIO_ALERT thread create fail (pthread_create)"); } LOG_INFO("%s", "started audio alert thread"); MilliSleep(10); // Give the CPU time to set 'alert_thread_running' } /********************************************************************************** * Stop AUDIO_ALERT Thread **********************************************************************************/ static void stop_alert_thread(void) { if(!alert_thread_running) return; alert_terminate_flag = true; MilliSleep(10); pthread_join(alert_pthread, NULL); LOG_INFO("%s", "audio alert thread - stopped"); pthread_mutex_destroy(&alert_mutex); memset((void *) &alert_pthread, 0, sizeof(alert_pthread)); memset((void *) &alert_mutex, 0, sizeof(alert_mutex)); alert_thread_running = false; alert_terminate_flag = false; } /********************************************************************************** * Signal AUDIO_ALERT to process Waterfall power level information. **********************************************************************************/ static void add_alert(c_portaudio * _cpa, float *buffer, int len, int sr) { if(alert_thread_running) { struct PLAYLIST *plist = new PLAYLIST; plist->fbuff = new float[2*len]; plist->bufflen = len; plist->sr = sr; for (int i = 0; i < 2*len; i++) plist->fbuff[i] = buffer[i]; plist->cpa = _cpa; guard_lock que_lock(&alert_mutex); playlist.push(plist); //LOG_INFO("play list contains %d items", (int)(playlist.size())); } } // Initialize the c_portaudio class c_portaudio::c_portaudio() { PaError paError = Pa_Initialize(); if (paError != paNoError) throw cPA_exception(paError); stream = 0; paStreamParameters.device = Pa_GetDefaultOutputDevice(); paStreamParameters.channelCount = 2; paStreamParameters.sampleFormat = paFloat32; paStreamParameters.suggestedLatency = Pa_GetDeviceInfo(paStreamParameters.device)->defaultLowOutputLatency; paStreamParameters.hostApiSpecificStreamInfo = NULL; start_alert_thread(); } c_portaudio::~c_portaudio() { stop_alert_thread(); Pa_Terminate(); } void c_portaudio::open(int samplerate) { sr = samplerate; paError = Pa_OpenStream( &stream, 0, &paStreamParameters, sr, paFramesPerBufferUnspecified, paClipOff, 0, 0); if (paError != paNoError) { throw cPA_exception(paError); } // else //LOG_INFO("opened pa stream %p @ %d samples/sec", stream, samplerate); } void c_portaudio::close() { paError = Pa_CloseStream(stream); if (paError != paNoError) throw cPA_exception(paError); // else //LOG_INFO("closed stream %p", stream); } // Play stereo buffer void c_portaudio::play_buffer(float *buffer, int len, int _sr) { sr = _sr; add_alert(this, buffer, len, sr); return; } // play mono buffer void c_portaudio::play_sound(int *buffer, int len, int _sr) { try { float fbuff[2*len]; for (int i = 0; i < len; i++) fbuff[2*i] = fbuff[2*i+1] = buffer[i] / 32768.0; play_buffer(fbuff, len, _sr); } catch (...) { throw; } return; } // play mono buffer void c_portaudio::play_sound(float *buffer, int len, int _sr) { try { float fbuff[2*len]; for (int i = 0; i < len; i++) fbuff[2*i] = fbuff[2*i+1] = buffer[i]; play_buffer(fbuff, len, _sr); } catch (...) { throw; } return; } void c_portaudio::silence(float secs, int _sr) { int len = secs * SCRATE; int nosound[len]; memset(nosound, 0, sizeof(*nosound) * len); play_sound(nosound, len, _sr); } void c_portaudio::play_file(std::string fname) { playinfo.frames = 0; playinfo.samplerate = 0; playinfo.channels = 0; playinfo.format = 0; playinfo.sections = 0; playinfo.seekable = 0; if ((playback = sf_open(fname.c_str(), SFM_READ, &playinfo)) == NULL) return; // throw("SF open error"); int ch = playinfo.channels; int fsize = playinfo.frames * ch; float buffer[fsize]; memset(buffer, 0, fsize * sizeof(float)); if (sf_readf_float( playback, buffer, fsize )) { if (ch == 2) { play_buffer(buffer, fsize, playinfo.samplerate); } else { play_sound(buffer, fsize, playinfo.samplerate); } } sf_close(playback); } fldigi-4.1.06/src/soundcard/doesnot.cxx0000644000175000017500000024343013472115777014755 00000000000000#define DOESNOT_SIZE 9927 int int_audio_doesnot[DOESNOT_SIZE] = { 14, -241, -5, -258, 42, -392, -407, -1046, -825, 269, -648, 178, -355, 907, 59, -37, -472, -353, 300, 1445, 3439, 2079, 2224, -242, -158, 499, -196, 649, 1672, 2503, 988, 967, 1144, -164, 1398, 894, 114, 674, -163, -1479, -1924, -248, -585, 1087, 2381, 1989, 1095, 376, 520, 405, 2273, 1822, 1640, 2522, 2459, 1480, 540, 1235, 1166, 1269, 2486, 1911, 1667, 2252, 1997, 2669, 3137, 2966, 1354, 847, 329, -481, -375, 193, 0, -871, -350, -525, -772, -584, -1065, -1670, -844, -904, -1601, -670, -232, -1413, -1318, -1240, -1598, -1304, -589, -222, 175, 217, 40, -304, -1641, -1863, -2343, -2660, -3049, -2758, -3211, -3236, -2722, -2509, -1628, -1999, -2667, -2943, -2782, -2295, -1572, -761, -268, -493, -629, -776, -376, -99, 423, 1411, 883, 759, 577, -421, 110, 432, 636, 2104, 2917, 3169, 3581, 2002, -269, 441, -502, 787, 2638, 1444, 3067, 1699, 121, -278, -308, -53, 270, 2146, 569, -268, 204, -289, -349, 72, 9, -723, 8, -1221, -2370, -1181, -275, 76, 1105, 1911, 760, -396, -810, -1880, -1723, -236, -608, -1970, -3173, -2514, -3390, -1731, -9, -648, 219, -48, -126, -538, 678, 605, 627, 1077, 1200, 596, -181, 738, 1063, 2000, 2538, 2195, 1350, 133, 732, 463, 709, 1606, 114, 1203, 1606, 2109, 1541, 2139, 1083, -141, 1770, -202, 1655, 1795, 998, 980, 113, 232, -622, -572, -1708, -1115, 432, -78, 229, 144, -267, 48, 838, 1430, 1204, 1543, 507, -645, -716, -738, -314, -406, -1332, -1581, -1432, -1598, -1660, -919, -941, -1050, -502, 102, -545, -276, -24, -541, 226, 497, 487, -143, 464, -679, -634, 744, 1722, 2082, 2114, 1267, -333, 125, 208, 943, 2506, 2101, 1341, 599, -106, 377, 349, 1692, 156, 183, -537, -2332, -1384, -1044, 0, -562, -613, -385, 236, 1100, 545, 310, 417, -56, 147, 86, -19, -95, -301, 73, -81, -90, -182, -35, -365, -805, -339, 208, 541, 229, -105, -638, -748, -311, -36, 317, 42, -680, -736, 367, 2191, 2396, 2214, 2532, 1635, 1590, 2025, 2356, 2541, 1747, 1043, 1333, 1861, 2333, 2507, 2317, 1824, 1323, 1395, 1367, 1363, 318, -333, -9, 40, 471, 229, -94, -490, -718, -885, -1417, -1599, -1914, -1823, -1601, -1500, -1471, -1657, -1556, -1537, -1986, -1438, -855, -517, -340, -998, -930, -1227, -1543, -1966, -1996, -2052, -2383, -1771, -1527, -758, -1345, -2683, -2573, -2809, -1649, -486, 295, 84, 216, 314, -898, -614, 468, 1258, 64, 2336, 717, 327, 3112, 1614, 2994, 3352, 2962, 1139, 469, 185, -838, 1214, 2334, 1325, 1470, 1706, 590, 1160, 2825, 1985, 1322, 1331, 265, -237, 118, 654, -723, -66, -521, -1453, -489, -535, -495, -613, 259, -1250, -869, -224, -496, 936, 281, 721, -1618, -1938, -1673, -1874, -709, -1025, -180, -1500, -1177, -1907, -2547, -1601, -1544, -359, -792, -309, 20, -578, -21, 320, 1672, 1399, 1135, 1074, 83, 868, 1342, 2047, 2326, 2995, 3058, 3192, 3214, 1318, 1461, 1238, 1520, 2909, 2171, 1381, 489, 227, 584, 799, 561, 315, 884, 235, -59, -279, -566, -471, -767, -181, -187, 66, 199, -173, -729, -1004, -468, -1369, -1771, -2291, -2501, -1162, 683, 956, 155, 146, -1242, -1676, -1047, -988, -1010, -1442, -2108, -2591, -1250, -739, -67, 1673, 1574, 64, -935, -850, -822, 133, 466, 1245, 651, 484, 1610, 1854, 3856, 4110, 3961, 2605, 833, 1872, 2302, 2941, 2966, 2003, 1490, 1082, 2148, 2563, 3356, 3199, 1302, 1192, 139, 199, -24, 300, 848, -208, 31, -19, -273, -868, -619, -1354, -2034, -2015, -1119, -1195, -1053, -428, -1455, -536, -391, -500, -602, -756, -1117, -1945, -2376, -2804, -2066, -2793, -3937, -4006, -3598, -2261, -1698, -687, -816, -229, -347, 678, 2198, 1841, 634, 442, 175, -2530, 1964, 3751, 718, 642, -46, -385, 2683, 4954, 4092, 2657, -1648, -3250, 3952, 3954, 5638, 7496, -2166, -5170, -8494, -2713, 4267, 5633, 7805, 375, -6580, -5687, -2189, 2730, 5129, 4103, 1906, -8418, -4940, 25, 1174, 6276, 1824, -384, -6553, -6788, -106, -657, 1866, 1984, -5395, -6350, -4077, 3657, 7037, 5750, 4852, -8257, -11716, -8287, 336, 7368, 4454, 4912, -5277, -12082, -2949, 2466, 7883, 9484, 1275, -6813, -6398, 909, 5919, 9649, 4765, -3980, -5343, 1084, 10784, 10157, 6169, -2909, -9191, -1481, 6955, 12495, 4057, 3167, -2337, -7648, 5383, 4409, 5440, 1216, -2250, -643, -1791, 1834, -759, -1580, -2083, -156, 29, 103, 1097, 734, 955, 4730, 5402, -616, 819, 3000, 3668, -25059, -18042, 13013, -6744, 24161, 21023, -21063, -22263, -30351, 7375, 2614, 12302, 24724, -23840, -30082, -15107, 11693, 30148, 24769, 9894, -11316, -31120, 15533, 12814, 8856, 9610, -29809, -25882, -29114, 935, 5778, -9150, -1403, -19016, -13668, 21767, 29998, 29993, 5181, 624, -12204, -15536, 23619, 16640, -9750, -28730, -25793, -24874, -4465, 25667, 16311, 1614, 5591, 15336, 9497, 19655, 28203, -5231, -3706, 1634, -8008, -13086, -24997, -14624, -16574, 3122, 23905, 4541, 16274, 10268, 11216, 19875, 14988, 22091, -14038, -14804, -13467, -23728, -3024, -3199, -6551, -9312, -5146, 10791, 14453, 29180, 24618, -2208, -24905, -19045, 25479, 14274, 19016, 15384, -30375, -28417, -26370, 8053, 27567, 4261, 4672, -20913, -18885, 24436, 27659, 25652, 4717, -26073, -28501, -26585, 9635, 7650, -29846, -25335, -26911, -10533, 18593, 30359, 24883, -4434, 3239, 19526, 7575, 15342, -6011, -29661, -28235, -26856, -8022, -809, 11325, 383, -13493, 14841, 31958, 29467, 13940, -12228, -26213, -30797, -12935, -1344, -23255, -13780, 9924, 20615, 31999, 24332, -6036, -23871, -13790, 14454, 18718, 7223, -1007, -20557, -7433, 13481, 10459, 976, -6628, -4223, -3892, 13494, 21922, 8892, 7274, -1309, 1395, 16453, 16815, 2690, -20734, -23642, 15257, 28923, 24481, 13126, -21263, -30688, -26750, -4446, 29693, 15169, -10934, -12676, -11246, 15061, 31223, 8745, -23421, -29895, -27756, -12435, 12482, 7739, -18388, -28508, 6756, 28873, 30590, 20259, -13768, -30878, -23637, 11560, 23389, -5212, -19182, -26425, -14607, 15870, 31589, 8903, -17829, -13628, -10289, 8048, 27420, 10424, -15625, -25982, -18472, 2051, 21373, 19399, -4035, -15055, 6437, 15954, 9674, 6044, -8578, -14375, 2712, 16936, 22250, 8768, -6151, -5544, -8471, 4889, 8422, -736, 3580, 5887, 9498, 3869, -847, 1394, -9773, 5760, 15445, 15207, 11185, -17520, -31236, -3510, 27375, 27342, 20977, -11457, -31764, -29043, -10255, 26089, 21730, -20864, -26617, -7739, 10032, 31999, 13761, -23760, -31040, -27947, -4505, 12224, -1314, -14967, -29041, 1842, 29907, 22042, 5186, -20706, -27559, -15144, 12589, 17641, -9004, -8645, 3175, 12015, 25219, 12942, -10240, -24151, -12300, 1659, 7319, 17143, 11770, 5139, 1578, 2084, 3737, 6609, 11117, -4365, -20666, -10116, 10200, 13287, 17146, 15078, -2167, -3666, -3804, 547, -2146, -12874, -5896, 5430, 13522, 20362, 6817, -5759, -3775, -2378, -470, -12935, -15004, -6568, 18245, 27437, -13249, -28837, 17793, 26703, 13996, 16077, -21728, -31998, -27012, -4572, 30915, -3998, -18500, 7916, -6087, 17564, 27884, -18058, -28968, -28577, -15598, 3776, -483, 2547, -15708, -2331, 31999, 18597, 4615, -12128, -23497, -14692, 6675, 21550, -4780, -21769, 515, 13356, 25845, 26462, 1340, -20876, -20668, 6862, 7755, 1769, 2879, -13280, -10517, 13688, 21210, 13932, 17191, 6830, -19974, -25469, 483, 7580, 6398, 16513, -2651, -13587, -5265, 3078, 11227, 1822, -2822, 2610, 1378, 17847, 7978, -16101, -17686, -12562, 15443, 9695, -24407, -22440, 19952, 27688, 20056, 14406, -24340, -30956, -20149, 11620, 27003, -17399, -18943, 4906, 3230, 28489, 18780, -23053, -28135, -19856, 10333, 10960, 1418, 2952, -21983, 4434, 30442, 7394, -11592, -17172, -4278, 4986, 17058, 12687, -18235, -11222, 19404, 25900, 16881, -887, -16878, -26477, -6722, 26365, 14077, -6869, -2808, -9392, -5492, 10439, 2930, -2508, 7356, 12315, -10493, -13256, 13963, 8052, 83, -1590, -17369, -19064, -16714, -1620, 13185, 1875, 13205, 18579, 6314, 5657, -17217, -18194, -5864, -21493, -26607, 11335, 25457, 15639, 29756, -9899, -30710, -21355, 3942, 18598, -24337, -15356, 10927, 13360, 29174, 23053, -11039, -18859, 726, 14824, -12376, -27145, -18931, -18285, 11942, 29524, 17423, -6304, 105, 21763, 13405, 5356, -4809, -21904, -14322, 6503, 13932, 3375, -7312, -4102, 2755, 23401, 18692, -11707, -16331, 4880, 17575, 11178, 711, -18551, -18189, 8454, 20461, -4233, -25814, -3385, 18141, 25075, 20423, -7095, -24621, -26675, -22646, -9373, -9151, -4885, 8349, 20431, 30743, 14071, -21147, -27915, 12208, 11762, 5771, -664, -30408, -23544, 665, 31700, 13696, -20405, -4599, 3805, 15964, 27551, -6492, -26446, -17297, 16787, 24127, -5525, -9203, -19230, -8377, 23422, 21416, -8709, -20117, 4091, 14348, 14275, 12246, -6149, -15386, 5303, 16675, -6543, -22805, -18516, -2468, 19500, 31322, 18742, -5235, -16641, -19638, -11553, 7015, 5565, 3446, 16930, 15784, -1968, -28205, -22725, 5662, 11923, 16075, 323, -1852, 9673, -5125, -5090, -17193, -27830, -13050, 11875, 26516, -10503, -17238, 27215, 19418, 25284, 10337, -28689, -27088, -24177, 13570, -1900, -21160, 329, 13957, 27436, 28370, 14746, -14358, -23217, -1999, -7380, -21698, -11833, -18369, -6235, 12411, 21972, 6932, 5951, 21375, 11496, -5226, -7565, -4889, -13149, 3710, 15257, -1634, -8868, 953, 1450, 21, 6539, 11211, -2689, 263, 8765, -10469, -20038, -1704, 19806, 20282, 10229, -2028, -25427, -20443, 4096, 5092, -5934, -7503, 9722, 16801, 13386, 8714, -8299, -20633, -12929, 2679, -7830, -22550, 20859, 19220, 19987, 22906, -12944, -26705, -15403, 13387, -5007, -23323, -10260, 8688, 11007, 28836, 16417, -5296, 5203, 19578, 13032, -15248, -21355, -22746, -22473, -4094, 241, -16686, -4384, 18726, 27382, 15134, 6836, -1518, -4326, 16362, 13198, -16303, -24303, -10938, 626, -644, -1154, -9699, -8886, 18710, 27791, 6165, -11937, -2833, 11809, 20578, 6912, -8058, -27685, -22292, 5035, 3209, -9538, -20368, -4668, 12946, 24773, 19879, 5211, -7995, -576, 12088, 1044, -29118, -21421, 4146, 14750, 27493, 1484, -16990, -24678, 11665, 21717, -184, -20599, -14467, 2353, 11646, 23208, -6821, -14447, 5810, 28673, 11850, -3906, -12169, -18267, -3977, 4348, -10135, -25102, -16644, 10045, 15443, 9002, 2840, -678, 14101, 28655, 19083, -13146, -16889, -1819, 3280, 3588, -3784, -22660, -20970, -2839, 13529, -6000, -10864, 9151, 22628, 27424, 20362, -2459, -19780, -2421, 9347, -2037, -23834, -23897, -13485, 7205, 2301, 5205, -633, 10412, 22060, 13882, 9715, -6637, -9071, -18604, 9466, 7558, -1565, -6614, -8228, -3717, 7498, 11480, -3051, -1905, 1929, 3690, -3188, 6314, 3019, 356, -3838, -2546, -4247, 2939, 7997, 977, -4575, -9461, -3056, 2590, 6099, -2730, -14027, -10466, 9430, 14478, 3541, -10512, -6057, 8829, 10399, 9683, -1798, -17109, -12943, -1583, 4324, -7563, -13623, -769, 12725, 14137, 5461, -4594, -10660, -5506, 1432, 1974, -8375, -10710, -6968, 5483, 8126, 4048, -4725, -3462, 14337, 13716, 5142, -8280, -6061, -1503, 268, 3232, -2247, -8544, 213, 8829, 4347, 4537, 7675, 9456, 5208, 2365, -4392, -5136, 2189, 1679, -4936, -8271, -8451, -1024, 14687, 15386, 460, 997, 12693, 9505, 5198, -2200, -15941, -19676, -5238, 6458, 1189, -11408, -4356, 12094, 12067, 18748, 7377, -10783, -7970, 2192, 5431, -8496, -16433, -14028, -13182, -554, 10761, 5252, -2815, -65, 11088, 8763, 2308, -7249, -13687, -8885, -2804, -2693, -8577, -7844, 3532, 14153, 18194, 9568, 356, 4205, 5432, 3394, -6167, -14286, -13308, -4382, 3340, 2762, 3072, 9490, 10656, 7748, 9428, 3937, -383, -165, -1081, -5122, -10535, -5087, 69, 2594, 3575, 1779, 9447, 9925, 7609, 583, -7284, -4129, -244, -1989, -6416, -5622, -4298, 1619, 3840, 6281, 2255, 1834, 6425, 5031, 58, -11899, -12236, -10269, -5606, -3142, -4967, -4039, -4833, 5823, 16292, 11928, 4834, -2960, -4224, -1460, -1475, -7602, -16630, -13404, -1300, 9328, 10730, 3942, 3219, 11314, 15260, 10936, -3153, -11702, -11154, -5648, 112, -766, -3300, -3520, 2626, 12121, 8329, 2159, 2236, 1317, 5470, 2606, -6020, -9501, -4596, 3810, 1417, -4915, -2516, -1968, 3135, 6114, 2468, 1700, 2004, 1260, -632, -4667, -6804, -5769, -3649, 304, -2073, -1975, -1031, 7262, 7590, -61, -1625, -2935, -1590, -6328, -8575, -9574, -9400, -2337, 6366, 6629, 4818, 7580, 6438, 4545, 2618, -473, -4942, -7877, -4450, 1041, 312, -2765, 512, 6436, 12916, 15970, 7773, 1078, -2147, -3881, -2409, -1185, -3126, -7786, -1772, 3589, 7063, 5793, 3661, 4453, 5390, 7570, -675, -6748, -5729, -3, 162, -3518, -3105, -875, 1198, 5465, 4975, 1246, -933, -625, 1833, 277, 5, -3435, -1887, -2750, -2286, 1230, -22, 1717, -1063, -2583, -161, 986, 560, -263, -1583, -3957, -1148, 1476, -1276, -2996, 1758, 5174, 4677, 5645, 2986, 141, 307, 1302, -810, -3838, -2764, -1390, -872, 730, 2779, 3191, 5445, 11788, 7733, 110, -1058, -215, -1564, -3473, -2893, -5297, -7624, -1727, 5290, 5738, 7676, 2197, -1991, -800, 2635, 524, -9500, -7117, -4510, -3028, 286, 402, -71, -989, 3486, 2809, -1203, -3027, -6542, -4555, -1677, -2771, -6597, -7026, -1980, 1066, 921, 712, -3942, -2862, 2664, 1667, -142, -4044, -4287, -1739, -271, 553, -1017, -2713, -1009, 6165, 9484, 4601, 3452, 3985, 992, 689, -1318, -5503, -7301, -2948, 1743, 3612, 8029, 10377, 8521, 4455, 2299, 4410, 172, -5062, -5190, -5328, -2883, -314, 3436, 4361, 5090, 3797, 3428, 2424, 1208, -1093, -5525, -2630, -1577, -712, -2547, -3759, -833, 990, 3462, 4893, 1655, -1729, -2511, -978, -229, -2727, -3723, -5916, -6115, -1265, 477, 464, -113, -354, 1583, 4522, 6981, 354, -2728, -1625, -334, 1750, 67, -1670, -5036, -760, 4983, 5763, 6874, 6248, 4430, 3155, 3114, 1885, -3082, -5852, -3080, -965, 477, 5078, 5969, 2799, 4725, 8357, 5669, 2643, 1788, -4451, -7235, -4015, -1357, -3761, -3475, -278, 99, 5366, 8471, 2295, -1855, -1014, -27, -374, -3696, -3702, -6975, -5508, 1975, 896, -1136, -2788, -3601, 317, 2069, -482, -3550, -6151, -2797, -435, -782, -1219, -4460, -2992, 146, 3048, 3699, -58, 260, 2130, 4753, 3502, -1696, -2636, -1351, 1466, 3227, 2128, 1066, 1465, 5737, 8617, 4278, 146, -2540, -1243, 1886, 1716, -248, 997, 2061, 3901, 6260, 1738, -30, -392, 213, 1134, -1413, -1679, -2078, -561, 2252, -716, -2764, -940, 3483, 3416, -75, -1344, -758, -368, -880, -466, -4854, -4968, -661, 1281, -373, -4613, -3519, -1844, -247, 1415, -1191, -3610, -3112, -241, 1740, -378, -4478, -6216, -3211, 1456, 2294, 82, -1548, -69, 4141, 6148, 2928, -1537, -3073, -1186, 908, 608, -449, -245, 12, 4051, 6848, 3885, 411, 478, 2134, 265, 927, -955, -1788, -1, 2256, 5271, 1313, 451, 1956, -324, 1231, -383, -1706, -3197, -257, 2033, -814, 2067, -1880, 1398, 2190, 755, 1641, -2496, 472, -1566, -3991, -1948, -1985, -590, -447, 394, -391, -2267, 362, -1613, -1854, -862, -2290, 518, 625, -1588, -1238, -1389, 1265, 2168, 2293, 1315, -1733, 3061, 4029, 1920, 1689, 260, 727, 1291, 2339, 1233, -2057, -1182, 375, 2917, 4470, 3251, 2877, 1704, 1566, 2574, 1135, -1810, -624, -2200, -2753, 890, 236, -1394, -1180, 710, 1703, 2241, 2044, -220, -1039, -1208, -1840, -1957, -1914, -1558, -668, 1388, 1135, 269, 544, 291, 269, -1686, -2783, -3099, -4036, -3481, -1644, -317, -264, 469, -501, -680, -1120, -654, 528, -1159, 28, 409, 24, 933, 1007, 756, -783, 736, 2618, 2, 1530, 3092, 1643, 1964, 3720, 5342, 1710, -151, 449, -1638, -552, -87, -518, -23, 1314, 4982, 4226, 3085, 1902, -732, -31, -103, -1495, -2384, -2987, -767, 1662, 2527, 1706, -230, 1525, 3342, 1568, 263, -1668, -4390, -2594, -289, 438, -291, -1473, -1409, -739, 786, 128, -837, -1901, -2878, -1398, -780, -2285, -2113, -1953, -582, 270, -836, 833, -169, -303, 1897, 2199, 1717, 573, 1304, 816, -473, 617, -465, -405, 1069, 2500, 3015, 560, 2789, 3294, 557, 400, -139, 342, -459, -186, 1133, -847, -420, -262, -6, 1802, 1179, 1451, -20, -542, 1060, -1118, -1885, -907, -2303, -2672, -1402, -276, -138, 45, 3018, 2619, 558, 537, -294, -1637, -2635, -2098, -3127, -3266, -468, 265, 259, 899, 246, -753, 178, 883, -1358, -1636, -1840, -122, -2092, -264, 208, 792, 6313, 62, 1290, 3658, 529, 597, 2743, 492, -550, 436, 267, 1007, 1507, 1196, -157, 2750, 3487, -2204, 679, 1317, -6033, 2208, 3434, -839, -15, -2309, -3883, -1017, -56, 106, 887, 1097, 1418, -645, -627, -2438, -3240, -749, 2738, -1799, -2408, 840, 504, 464, 1206, 1875, 2654, -50, 100, 1901, -1933, -333, -3700, -814, -517, -3481, -700, 40, 1547, 234, 157, 994, 2318, 1633, 1638, 2544, 1192, 196, 1212, 4000, 3083, 506, 2356, 3576, 1041, -54, 798, -4926, 1433, 2964, 3042, 4239, -330, 4972, 3585, 5539, 2595, -222, -4192, -3265, -1923, -2272, -611, -3909, -1998, -29, 3364, -944, -1651, 9, 1555, -713, 400, -1136, -4509, -2553, -4343, 1880, -1059, 178, -1336, 33, 958, 1872, 466, -2562, -12539, -7432, 6957, 4375, 8101, -6450, -4631, -15375, -4008, 8122, 5052, 263, -8438, 572, -1357, 6747, 8876, 2877, -5480, -2749, 6405, 10046, 3666, 1868, -3994, -3715, -1572, 5507, 1037, -7743, -3513, -1080, 6291, 5710, 7122, -2447, -3017, 4064, 9112, 5036, 318, 333, 339, 2840, 1711, -791, -3428, -6689, -2667, -3990, -3120, -1005, 854, 1106, -5488, 1007, -1989, 1112, -1290, 25, -2132, -1736, 1176, -2571, -23346, -930, 13500, 13752, 20702, -10579, -3579, -29186, -1935, 10159, 3312, -9068, -22375, -5847, -12833, 16743, 18257, -1731, -11875, 4764, 24417, 23256, 10821, 7998, -16681, -14019, -1089, 7832, -6720, -26119, -14691, -15748, 5911, 14094, 20824, 1463, 236, 21333, 25034, 22371, 9937, 3487, -4705, 63, 11897, 1239, -12487, -19242, -17453, -16624, -7419, 1562, -1254, 1005, 4757, 19866, 16997, 19002, 12373, 1722, 379, -4963, -1347, -5500, -10416, -13581, -16397, -7988, 2119, -10521, -27129, 585, 12157, 24261, 25708, 182, -10005, -29004, 3511, 10277, 724, -16440, -29339, -18997, -13202, 19300, 23715, -3486, -14346, 4330, 20845, 26836, 17069, 7384, -21511, -21631, -3433, 5721, -7210, -26804, -20112, -22282, -1423, 18253, 22081, 1774, 520, 22015, 28059, 27286, 20938, 5572, -10833, -5314, 3839, -6595, -21074, -24276, -22507, -10250, 11503, 19169, 15820, 4249, 6756, 24358, 22523, 27886, 7153, -4554, -4583, -8353, -4141, -7349, -7854, -19575, -18857, -460, 526, -22250, 15172, 15887, 23255, 25095, 725, 220, -31596, 2701, 1452, -2950, -16844, -29306, -17991, -15853, 17422, 26263, 4261, -8848, 7900, 17318, 24304, 17555, 9643, -22014, -27262, -15757, -7554, -11166, -24910, -19008, -22079, 531, 21839, 27082, 10242, 5721, 16233, 20403, 22659, 17439, -204, -17264, -14413, -7340, -12750, -23564, -26515, -25839, -13054, 13249, 20686, 21116, 6419, 1597, 19446, 17633, 25368, 1637, -15079, -12280, -15651, -7519, -6847, -8332, -17834, -20627, -1984, 8597, -13935, -2178, 27777, 23044, 31359, 18410, -5677, -24041, -26366, 1583, -1247, -10450, -21206, -22782, -16348, 4768, 30576, 25565, 2165, 1477, 17895, 17742, 25619, 20760, -2423, -25990, -23346, -11428, -7602, -13614, -19299, -18318, -10567, 14942, 30353, 25537, 13589, 13573, 22309, 24281, 23148, 14052, -8258, -18441, -12877, -10867, -18744, -25125, -23734, -17846, -157, 20191, 23528, 23069, 7340, 13443, 22265, 18428, 17798, -7652, -13745, -17264, -16770, -9860, -8216, -12752, -18013, -13970, -2524, 9376, 818, -13899, 19100, 26522, 22475, 27088, -6120, -15684, -31130, -8676, 1145, -7629, -14279, -26566, -17547, -2085, 24868, 29248, 11420, -4408, 8384, 12220, 22854, 20193, 1456, -19634, -28909, -16256, -10159, -9319, -18748, -17779, -18318, 1391, 22316, 28815, 22440, 14599, 17612, 15777, 17398, 15386, 884, -13006, -15706, -17023, -21596, -25334, -20549, -18054, -8970, 8991, 18875, 23268, 21329, 14389, 17064, 12386, 16349, 3455, -9077, -11041, -18362, -17873, -13998, -8560, -14028, -11803, -4061, 3354, 6238, 1998, -6674, 29737, 17107, 23980, 17972, -9680, -10019, -29368, 1591, -8323, -3646, -13554, -15772, -11033, 756, 23690, 24655, 13893, 2428, 13413, 4623, 18036, 13506, 3020, -16915, -22921, -17538, -15640, -9221, -7393, -10484, -17331, -4662, 13625, 27298, 24640, 25626, 10676, 4606, 7211, 15078, 12958, -6713, -15062, -25189, -26506, -19814, -9529, -6748, -11930, -779, 11976, 24586, 24916, 11546, 14119, 1278, 6888, 2831, -1280, -5194, -21242, -19748, -17853, -9200, -9011, -5940, -6491, 70, 2732, 13689, -11809, 12662, 22870, 6391, 31061, -4187, 646, -26446, -12022, -4089, -4439, 7679, -11563, -6046, -19392, 7930, 24801, 25849, 7493, 9672, 212, 3056, 15447, 16391, 1450, -24356, -17744, -21652, -10510, -9375, 2556, -13575, -20358, 1386, 18233, 26510, 22547, 22994, 2315, -5065, 10988, 14616, 444, -8323, -15748, -24740, -23752, -9042, -382, -9232, -5350, 3722, 6680, 19337, 10086, 11942, 3448, -977, 8394, 488, 5141, -7159, -14766, -12515, -8681, -3397, -7241, -5592, -4749, -1282, 8190, 15588, -6118, 2461, 26685, 2862, 27951, 4382, -2251, -16362, -22440, 2200, -8154, 13947, -7518, 597, -15438, -4934, 15291, 21247, 17128, 9296, 7923, -9573, 3936, 8098, 10219, -8997, -9276, -18623, -21294, -11381, -574, -364, -7722, 4615, 3638, 10889, 17193, 23786, 11807, 3861, 4418, -3416, -2200, -885, -3740, -20537, -19496, -12575, -10625, -8328, 2911, 2765, -5775, 5605, 1118, 3660, 7863, 9658, 7899, -5813, 3110, -483, -5111, -5032, -4940, -8710, -16477, -2859, -812, 1768, -1643, 6317, 11043, 2557, -10053, 18095, 6058, 5869, 24823, -534, 2794, -27900, -4542, -9407, 2022, 12186, 5520, -527, -21953, -3794, 5559, 17315, 13397, 17226, -6173, -9267, -1885, 12747, 6425, -84, -3890, -17434, -18858, -13653, 5666, -573, 2443, 798, 762, 3276, 14184, 18086, 12963, 4378, -1027, -2926, -6314, -1426, -2104, -1893, -5536, -11372, -11288, -9021, -5949, -497, 5573, 4936, -4807, 2812, 5776, 15942, 13282, 7613, 7992, -12985, -6024, -6547, -3055, -440, -7151, -2946, -10353, -4701, 5789, 5199, 12253, 8866, 5582, -6652, -3455, 8534, 4354, 16638, 5554, 610, -11306, -10353, -5539, -7031, 1409, 2270, 1179, -8237, -2387, -3903, 1791, 5242, 11463, 7370, 2595, 5549, 4791, 5707, -2542, 1269, -6032, -10601, -11912, -10012, -5004, -8034, -4926, -4763, -5439, 579, 4634, 8935, 10582, 5439, 4546, 598, 3119, -705, 2713, -1757, -12227, -9050, -14554, -4791, -4407, 2790, 7655, -3362, 3976, 9429, 14297, 16264, 12777, 8353, -6751, -4550, -4703, -6464, -1206, -6640, -3367, -4166, -3209, 5708, 6056, 8183, 10041, 6710, 10060, 2763, 155, -569, -1119, 1102, 530, -321, -10653, -9413, -12221, -4750, 3276, 3646, 6041, -3474, 2705, -1449, 4627, 10617, 3689, 5669, 1992, -756, -4413, -6295, -3804, -6762, -6177, 25, -8508, -6306, -4413, -5996, 504, 7981, 7430, 4818, 1837, 1018, -127, -291, 486, -3791, -312, -920, 1257, 131, -574, 2227, -2922, 4969, 1815, 5033, 5182, -3659, 8470, -1799, 2617, 4726, -2390, -456, -5263, 36, 2181, -7579, 277, -1515, -969, 8181, 6485, 7319, -2518, -3164, -734, 1217, 2266, 5377, -2260, -4351, -4827, -2217, -2882, 548, 5313, -3370, -5997, -4925, -1397, 4590, 5811, 962, -877, -8385, -4819, -851, 2898, 744, -16, -5781, -4824, -3461, 1052, 4167, 750, 4112, -1128, 3015, -401, 1423, 2046, -765, 319, 1966, -4196, -1700, -781, 2043, 6405, 2448, 4466, -3984, 7229, 3048, 6243, 7514, -3412, -2868, -6341, 940, -1171, 5841, -989, -1711, -1188, -1811, -379, 3805, 5291, -5808, 2631, -3869, -875, 5490, 1990, -957, -5995, -4640, -1532, 368, 941, -2689, 1552, -4528, -1067, 231, -1316, 1435, -3059, 432, -3897, 2234, -1561, -2444, -77, -1760, -4508, 806, -2353, -3312, -1254, 562, 1832, 5419, 2314, -2689, 9272, -1123, 3325, 3507, 3284, -2049, -1377, 195, -1036, 2954, 4761, 2916, 3138, 65, 1354, 9151, -3446, 9158, 1518, 1610, 231, 2524, 7940, -4325, 2239, -2797, -2599, 622, -2100, -1179, -2797, -3489, 1906, -1306, 1967, 5139, -978, 1097, -502, 2206, 539, -1015, 3897, -3554, -3496, -2109, 1023, -7873, -575, -8192, -7991, 2451, -7571, 6972, -5309, -1144, 200, -953, 6520, 479, 215, -2611, -4964, -2238, 980, -2542, 3086, -3266, -375, 2839, -401, 5998, 575, 7495, 1644, -534, 2002, 348, 5005, -2275, 2232, 1262, 2794, 507, -66, 2520, 594, 2144, 530, 3152, -2177, 1857, 1608, 11, 4393, -3227, 2791, 847, -2646, 697, -3017, -1359, -3266, -1942, -1372, -2956, -800, -1433, -2171, -761, -1396, 1645, -46, -747, -747, -1286, -194, -818, -463, -2506, -3006, -4576, -1317, -1099, 1625, -704, 83, -88, -1339, 5523, 1703, 1861, 2877, -1187, -121, 223, 2282, 1609, 564, 2672, -675, 3540, 952, 3367, 5247, 916, 2806, 1193, 1673, 2555, 2542, 1386, 9, -165, -493, -45, 256, -333, -245, -1120, -13, -92, 2010, 561, -356, 1306, -837, 2454, -1220, -625, -544, -2333, 591, -505, 471, -1022, -1697, -1695, -395, -753, -931, -1806, -927, -686, -926, 377, -1453, -1417, -1743, -2390, -991, -1221, -503, -1433, -2213, -500, -320, 1158, 2585, 1552, 1096, 1090, 949, 2304, 988, 3332, 455, 1763, 990, 178, 2407, 1650, 2015, -40, 1725, 2066, 2394, 1031, 933, 485, 654, -6, 1895, -1671, -42, 127, -971, -505, -1847, 1227, -1931, 472, -1674, 467, -135, 81, -797, -320, -898, -869, 740, -1468, 681, -3420, -725, -1337, -788, 549, -1610, -1960, -778, -3022, -848, -1263, -24, -642, -1756, -271, -3417, 329, -1347, 1148, 414, 346, 1513, 63, 1724, 1145, 1065, 1191, 2029, 2605, 1368, 832, 1002, 2077, 1945, 2514, 1478, 737, 1227, 2030, 2965, 2291, 961, 124, 998, -268, 2451, 1307, 203, 823, -502, 1053, -142, 302, -186, -2343, -921, -742, 634, -731, -1113, 94, -570, 640, 1393, -509, -923, -808, -2082, -468, -1676, -1920, -2633, -1897, -880, -745, -673, -929, -1321, -1745, -138, -732, 303, -1136, -1312, -841, -862, 803, 749, 267, 113, 302, 1768, 1438, 606, 1233, 361, 1855, 2038, 2091, 1417, 991, 1129, 1790, 2066, 3186, 1679, -297, 217, -723, 1012, 146, 161, 77, -92, 149, 799, 913, 276, 565, 1472, 1303, 568, -220, -924, -532, -2139, -1050, 26, -75, -28, 318, 1048, -1208, -2050, -1188, -1307, -503, -1116, -1681, -1854, -2915, -2827, -1523, -671, -703, -1578, -519, -362, 220, 771, -296, 612, -40, 367, 389, 36, -124, -819, -1291, 515, 1125, 1247, 1968, 1987, 2944, 2792, 2776, 2105, 1912, 2192, 2307, 1453, 1322, 1083, 135, 6, 780, 1188, 742, -21, -136, -440, -79, 1371, 458, -654, -869, -769, -404, -272, 275, -301, -181, 411, 115, 1426, -628, -1582, -428, -95, 472, 232, -639, -3572, -6429, -3138, 598, -708, 525, 1424, -848, -4368, -2392, 244, -2542, -2353, -864, -1368, -2877, -576, 755, -821, 2166, 4391, 3663, 2559, 2821, 2234, 219, 2461, 3965, 2110, 1233, 904, -718, -2492, -210, 654, 1256, 1174, 1643, 1275, 116, 2933, 2511, 3111, 4505, 4458, 495, -951, -1311, -2920, -1457, 63, -557, -672, 2000, -415, -2017, -130, 912, 341, 64, 1487, 73, -754, 47, -2107, -2077, 288, -692, -1678, -672, -1100, -1818, -2609, -734, -6848, -5018, 8109, 588, 2578, 9464, 3775, -6105, -8174, 1043, -6816, -2398, 3483, -870, -2476, -1605, 2262, -2832, 6138, 7748, 1004, 2287, 3890, 2739, -259, 8300, 7573, -1959, -695, -3143, -6032, -6521, 622, 1345, -3124, 2322, 284, 1529, 4387, 7719, 3835, 3376, 1733, -637, -750, -42, 324, -4288, -110, -3500, -261, 684, 1707, -280, -3728, -1416, -2543, 3392, 2204, 1141, -520, -3756, -5651, -5995, -4290, -2179, -569, -3393, 402, 584, -6051, -11682, 9980, 11509, -464, 15567, 6972, -5876, -13860, -1980, -3024, -2248, 8764, -2333, -2791, 336, 3398, -2203, 8609, 15515, -1789, -1950, 3340, -916, 981, 8565, 10825, -1913, -2313, -5779, -11215, -5907, -1054, 1853, -4468, 3638, -1361, -2437, 5287, 7928, 6929, 3461, 2075, -3700, -346, -1141, 1402, 1737, -52, -3808, -3662, -1414, -49, 3477, -907, -799, -4320, -3958, -2912, -3136, 981, -804, -3465, -3580, -4399, -2044, 2069, 1740, 834, -5270, -11894, 8288, 4805, 872, 17804, 5402, -4874, -14379, -2291, -4274, -1912, 13026, 1171, 1066, -620, -1011, -1791, 9422, 16103, 680, 2201, 1404, -5836, -1455, 6225, 10924, 431, 667, -5872, -14553, -8404, -4427, 1113, 2300, 7544, -688, -3050, -396, 948, 6529, 7196, 5887, 191, 1245, -3261, -2195, 205, 2607, 1756, -1171, 4389, -5899, -4697, -3569, -3574, 890, 2150, -564, -8201, -6821, -7666, -1296, 3792, 5574, 756, 2176, 3262, -13481, -27482, 4612, 14088, 16882, 31997, 8548, -11688, -31996, -21430, -14114, 14745, 30417, 16147, 705, -22193, -18487, -5890, 19508, 31999, 21105, 5084, -15358, -27516, -19604, 4340, 27660, 12419, -1521, -20484, -29327, -17517, 8001, 27919, 27432, 20897, -5501, -15037, -5100, 14467, 21679, 14142, -2916, -19744, -27351, -21245, -1952, 14916, 14900, 2999, -6640, -1606, 9555, 20983, 14068, -1562, -7849, -17747, -6022, -118, 8739, 291, -13768, -19614, -19918, 4594, 27370, 12110, -23346, 12683, 16241, 6310, 31999, 17508, -12745, -30266, -29875, -26285, -6541, 27561, 22483, 6410, 730, -20819, -4920, 16970, 30322, 20811, -2352, -18474, -28680, -28963, -14782, 9003, 4829, -5296, -16614, -17242, -2589, 21640, 29860, 24572, 12112, -9827, -22086, -14464, 542, 7077, 4118, -9253, -21061, -22921, -7313, 11610, 22774, 24597, 10261, -7510, -5921, 7375, 17687, 13771, -10140, -19086, -23124, -18088, 1020, 9662, 18633, -3508, -17791, -9815, -1723, 22263, 30208, 22473, -191, -32000, -13533, 3934, 9743, 31999, 16269, -16359, -29221, -28680, -22248, 9451, 29788, 29450, -83, -17293, -22912, -8371, 25031, 29806, 17123, -17899, -28731, -27489, -20769, 10699, 30541, 12848, -4683, -18076, -13152, 6992, 23936, 30066, 10384, -9833, -18463, -19349, -5939, 9986, 11834, 944, -9936, -6086, 2565, 14031, 18406, 10110, -5255, -10866, -8165, 9972, 21386, 17161, 1810, -23632, -24820, -17102, 3725, 25985, 20947, 10055, -12921, -25430, -10420, 4149, 23509, 23044, 6923, -8590, -30146, -24601, 3210, 18837, 28668, 25782, -7888, -30332, -28128, -24869, 4511, 25536, 30906, 2927, -26732, -19086, -8380, 20608, 29129, 11135, -19427, -28852, -25111, -8941, 16307, 30646, 12914, -16590, -19707, -12858, 8054, 21067, 24106, 1269, -18004, -14350, -7697, 8947, 21677, 9452, -8192, -12932, -3576, 5280, 12948, 13918, -5571, -16909, -14510, -2060, 15632, 26114, 16484, -7516, -27769, -26382, -9540, 15488, 31401, 15867, -2166, -20021, -29044, -10394, 10506, 26999, 22019, 3156, -12900, -32000, -11077, 16711, 18954, 30583, 15012, -22936, -29856, -28283, -11347, 18226, 26098, 28505, -10860, -27451, -5705, 5413, 26596, 21978, -7883, -26812, -28698, -16224, 11916, 21911, 27561, 330, -28291, -19031, -1574, 15255, 15385, 10131, -7236, -19177, -8846, 8194, 12713, 12316, -2125, -14688, -13581, 3472, 14519, 10577, 10132, -8665, -21515, -14146, 3805, 20147, 24224, 17292, -7412, -29000, -20989, -5462, 14079, 26905, 12158, -7143, -19325, -21969, -1609, 12002, 21713, 24746, -2332, -25530, -27841, 3740, 19076, 22402, 29873, -6116, -30637, -28547, -22992, 10487, 24925, 28811, 12717, -29333, -17260, 3159, 18895, 27453, 1655, -23748, -28666, -24616, 5058, 23678, 20251, 11580, -20455, -25514, -6141, 16026, 14842, 3041, -7737, -16738, -12150, 7434, 20371, 8591, -3500, -13858, -14262, -2952, 17116, 14659, 1515, -4705, -17142, -18994, -6656, 10189, 20185, 15298, 4504, -16792, -24620, -7045, 4576, 17817, 15018, 1250, -7382, -20169, -8581, 8949, 16292, 25442, 5900, -24594, -24862, 9690, 24604, 23003, 29218, -5834, -29775, -28351, -19141, 16318, 23999, 27458, 10697, -28496, -15289, 15407, 27405, 21748, -1318, -25890, -28249, -23766, 8295, 25144, 13620, 4769, -17975, -15303, 338, 22081, 17482, -8055, -17416, -19750, -8203, 14942, 21022, 4774, -11418, -16681, -7034, 5728, 16680, 10415, -10777, -20433, -13354, -9474, -3166, 7896, 13033, 7494, -1063, -14274, -20152, -8082, 486, 15340, 11813, 896, -6717, -23862, -13035, 8567, 20277, 21763, -9878, -29999, 485, 21761, 23145, 30681, 1415, -27746, -27746, -21781, 11676, 20145, 22842, 9791, -21059, -5833, 20503, 29867, 12966, -10427, -21473, -24262, -17343, 14859, 12625, -2591, -7807, -3854, 13000, 16628, 28296, 11457, -13458, -20236, -8913, 815, 8515, 13238, 3015, -17658, -11387, 13842, 13983, 9939, 2121, -9927, -19168, -10037, 5902, 32, -14289, 7225, 18265, 8126, -4103, -18426, -14077, -11443, 10460, 25298, 11723, -5707, -22591, -22528, 2257, 20252, 20027, -12961, -26331, 12553, 16869, 21872, 25278, -13486, -27768, -29252, -7250, 20685, 2371, 3427, -6125, -15697, 13128, 28998, 25726, 4334, -26406, -17606, -15411, -5655, 14224, -9835, -22518, -22639, 3454, 26179, 23758, 13286, 5578, -13742, -4547, 11680, 1225, -13286, -22667, -5891, -953, 1851, 14719, 11160, -6320, 6132, 14596, 4290, -8884, -12767, -17488, -16618, 10675, 30777, 19072, -14570, -21826, -10757, -2065, 13356, 16005, 6830, -6455, -11924, 6144, 17260, 5256, -726, -20748, -18419, 22848, 19171, 25924, 8498, -22886, -24228, -15474, 16616, 22100, -7731, -23355, 2074, 1981, 22535, 26305, 8299, -3687, -11016, 14125, 3062, -13807, -23348, -16830, -19416, -8015, 8075, 3168, -5425, 5589, 24633, 27288, 17321, -1866, -7181, -23236, -11874, 6938, 421, -22356, -21536, -4424, 7857, 18809, 19873, 7558, -8142, -5160, -860, -5775, -160, 11249, 5118, -14897, -19375, -8010, -5251, 1773, 8280, 3070, 273, 762, 15049, 24796, 6008, -515, -5090, -24123, -15142, 21298, 10449, 9499, -5299, -8625, -4851, -6645, 26410, 5331, -13582, -9364, 10995, 2166, 4434, 8970, 3832, 3796, 2034, 14338, -5475, -15094, -6881, 95, -2444, -3793, -8648, -13560, -9381, 1921, 16055, 11154, 7193, 5386, -1262, -1093, 1439, 6297, 753, -7424, -6030, -4875, -1425, 1423, 2126, -2098, -11352, -14677, -16396, 1495, 23914, 15668, 1885, -17959, -13188, 3588, 10197, 9632, -5246, -6208, -3653, 1424, 1780, 1635, -5997, -11446, -1477, 8478, 7552, -381, -1344, 6750, 12205, 4869, 4850, -5453, -11728, -1541, 8478, 9239, -1398, -3721, -1343, 1912, 5940, 8139, 3443, -6297, -5116, 1347, 126, 55, 4438, 7015, -1035, -8084, -4690, 2762, 4388, 4704, 9506, -1738, -12977, -6713, 3812, 2416, 611, 2735, -4221, -5994, -1075, 5452, 3989, -2062, -1811, -5473, -6056, 202, 3439, -3923, -11079, -5568, 998, 1882, 3177, 6177, 1658, 587, 4477, 2613, -4376, -6840, -5132, -1567, 3049, 5093, 2310, 1876, 7555, 4599, 4488, -163, -5737, -5689, -6744, -564, 5377, 3437, 7086, 6622, 348, 2858, 2285, 3126, -363, -3563, -830, -2591, -6654, -2772, 2947, 3291, -353, -4969, 2353, 4629, 5392, 8191, 488, -5420, -8166, -2529, -1197, -6096, -6910, -892, 5212, 3536, 3840, 2456, -2578, -2841, 4828, 4030, -3837, -13083, -10283, -5116, -4398, 3411, 4706, 1536, -194, 6567, 14364, 10380, -142, -5573, -10594, -8597, -1492, 3482, 1021, -5233, 99, 10213, 16228, 11323, 5873, -2171, -5933, -2486, -624, -1511, -7790, -7508, 1966, 6995, 6170, 6821, 2856, -1640, 14, 6513, 7469, -2377, -8594, -6419, -1471, 1702, 2449, -712, -2032, -471, 4715, 8680, 1838, -552, -3159, -2675, -2867, -3581, -4388, -4878, -2495, -2836, 3669, 926, 203, 958, -449, 468, -4043, -6153, -3240, -1947, -4038, -3641, -2000, -3641, -601, 8600, 13777, 5833, -3158, -812, -2684, -868, 1145, 61, -6437, -8588, 3824, 11225, 6696, 3774, 5579, -283, 1678, 6549, 2220, -8467, -9159, -1336, 2949, 5409, 2334, 1126, -2262, 136, 5737, 7891, 5335, -6162, -5616, 539, 975, 2328, -675, -7251, -10121, -929, 7819, 4091, 1668, -781, -1211, 2571, 4511, 2776, -6130, -9839, -6802, -2457, 2390, 1880, -736, -3693, -2551, 289, 2864, 4272, 1749, -2625, -5921, -4448, -2620, -2088, -715, 3376, 3252, 511, 1159, 2773, 3266, 416, -347, -625, -4089, 1178, 6713, 4208, -852, -806, 4461, 3967, 3087, 2541, -2634, -4055, 1587, 5136, 6398, 1625, -333, 157, -1092, 329, 1204, -1344, -5192, 1035, 7356, 7088, 2733, 586, 234, -2919, -2022, 2030, 899, -4672, -4282, 264, 3182, 3354, 1312, -1116, -4746, -6115, -1842, 7, -2906, -3978, -3144, -1835, 1057, 3224, 2679, -595, -3248, -3797, -2900, -1049, -578, 1319, 1588, 1467, 893, -622, 581, 1916, 1926, 2824, 924, -276, 1167, 3707, 3850, -1122, -797, -84, -2237, -369, 2561, -2271, -727, 2343, 3904, 5433, 4631, 5340, -28, -759, -2204, -3691, -4993, -7573, -1449, 2981, 4561, 4399, 1454, -227, 1278, 916, 540, -1730, -5944, -3088, -2449, 743, 1095, 338, -1012, -2171, -2818, -2128, -1201, -4329, -1802, -3280, -958, 337, 412, 1735, -1634, -2827, -2011, -2121, -803, 568, -484, 1977, 1694, 1994, 1394, -899, -341, 1439, 812, 799, 2662, 2139, 5661, 1673, 3635, 624, -67, 2970, -2993, -2586, -4203, -456, 2045, 5995, 7042, 3847, 4301, 5544, 1884, 667, -2148, -3821, -6157, -4037, 1681, 2113, 4215, -64, 2556, 2041, 3857, 5284, 784, -4428, -3882, 521, -691, 1515, -530, -2925, -2332, -21, 396, -2372, -2179, -2890, -1212, 2600, 2048, 36, -1950, -2553, -1909, -781, 125, 1, 315, 1785, 3635, 4281, 4270, 1647, -1422, -1759, -1329, 2489, 314, -1198, 761, 676, 3027, 3583, 6021, 4586, 74, -1291, -2694, -5882, -2055, 129, -323, 1468, 527, 1861, 2013, 3069, 500, -1394, -2904, -4014, -1824, -1552, -2564, -2623, -1324, -2958, -1476, 1526, 543, -1926, -2600, -963, -1470, -1410, -431, -2673, -2137, -3123, -3652, -1505, -3259, -4481, -2557, -169, 1538, 1785, 1133, -98, -1750, -902, -641, -486, -1804, -1687, -182, 2313, 5036, 5558, 4239, 584, 826, 1404, 4075, 3278, 1105, 1240, 55, 2000, 3340, 5869, 6038, 3722, 2594, 2067, 1046, 1590, 1638, 853, 2093, 2519, 3936, 1641, 1721, 2430, -151, 75, -371, 1885, 761, -1490, 1243, 871, -178, -250, 43, 250, -1687, -2420, 704, 1199, -110, -321, -2360, -2567, -2735, -1462, -1929, -5890, -5340, -2970, -2106, 1295, 1895, -783, -974, -2465, -666, 1164, 149, -1512, -5214, -3703, 255, 2521, 5226, 2538, -853, -499, 553, 3295, 2669, 786, -1791, -2189, -589, 166, 2358, 1597, 912, 440, 986, 577, -260, -67, -1003, -69, 869, 2215, 710, -1674, -1007, -299, -438, -583, -3, -30, -1817, -946, 1699, 2502, 1152, -1608, -1610, -1683, -640, 475, 67, -741, -1609, -408, 496, 522, -53, -2060, -3765, -2875, -1425, 508, -424, -613, 948, 614, 465, 178, 171, 298, 805, 323, -763, 49, -752, 20, 3838, 2727, 1894, 1720, 1801, 3388, 1300, 327, 182, -851, 1431, 2714, 3125, 2112, 1743, 2028, 1135, 998, -209, -405, 160, 12, 1422, 2147, -709, 133, 242, -455, 1858, 576, 705, 355, -2316, 225, 757, 875, -66, -1576, -2236, -2390, -764, -919, -2284, -3435, -902, -92, 996, -66, -1276, -2777, -3896, -2132, -561, -1301, -2447, -2414, -820, 384, -63, 1008, 28, -462, 503, 1676, 928, 649, -921, -181, 429, 1285, 2719, 3298, 1979, 2391, 933, 2787, -848, 762, 6334, -2992, 3780, 4550, 840, -3965, 380, -643, 46, 2987, -1202, 5107, -1825, 115, 1851, 2333, -1921, -795, 1915, -1419, -4387, -4461, 6045, 1408, -4565, 607, 2998, -1660, -867, 3063, 1848, -2359, -1955, -1725, -2050, -3597, -2819, 2092, -1546, -1848, -727, 611, -137, -2479, -1373, -2543, 2358, 1280, -1965, 1916, 354, -92, -104, 3667, 2602, -1667, 3227, 3078, -166, -1007, -527, -626, 2178, 3248, 3150, 3213, -502, -507, 610, 2428, 4957, 4734, 531, -1535, -3289, -2458, 725, -545, -4695, -980, 4090, 702, -1986, 569, 4555, 1566, 2249, -727, -702, -346, -4939, -3404, -643, 583, -3544, -488, 364, -98, -1313, -1930, 516, -280, -2416, -1567, -1215, -4130, -2571, -2534, 2496, -1883, -6762, 594, 4837, 70, -2936, 3053, 1984, -847, 2831, 1106, -1153, 1338, -461, 445, 300, 1911, 5290, 1604, 1342, 3458, 5087, 5265, -1162, -704, 2699, 1971, -294, -1741, 3528, 2544, -167, -1715, 1727, 1309, -1154, 699, 892, 1859, 76, 136, -296, 624, -2348, -1422, 226, -289, -3308, -1708, -1294, -2037, 1700, -1250, -932, 832, -72, -1987, 285, -917, -1686, 341, 1141, -3591, -5221, -1432, 51, -1541, -4431, -1657, 1066, -389, 1477, -1965, 1526, 5287, 2260, 392, -6548, 812, 4000, -584, -2805, 830, 4747, 3245, -1929, 3425, 5555, 1721, 5364, 3963, 1373, -3417, 1750, 3974, 870, 998, 213, -825, 1331, 2266, 2119, 2989, -645, 1371, 3120, -645, -2038, 66, 2356, -129, -1119, 905, 4609, 4316, 1343, -274, -1257, -1770, -1836, -3583, -4971, -2726, -2563, -529, -2253, -2743, -328, 3021, 2445, 1206, -420, 2590, 2453, 806, -1150, -3602, -1991, -5215, -3664, -850, -4534, -6869, -186, 1451, 1690, -2317, 1195, 7912, 4821, 7052, 4677, -20100, -3845, 12690, 15357, 11278, -13359, -3359, 3945, -822, 117, -3696, -12632, -1627, -1875, 9701, 312, -11892, 895, 9337, 13876, 6179, -3378, 1892, 8554, 1344, 6571, -7657, -11932, -12046, -7866, -4573, -10269, -11541, -6260, -2337, 2426, 7054, 6522, 10654, 8062, 11058, 11404, 6399, 1585, -4129, -6551, -4499, -7118, -9163, -13001, -9907, -6172, -1088, -3071, -7817, 1094, 10193, 17926, 10249, 4297, 5889, 8527, 4063, 67, -2550, -1379, 4069, -26438, -13347, 16571, 23535, 24179, -7707, -11695, -5344, -8409, 12685, 24715, -10969, -16979, -15103, 4632, 20419, -3866, -589, 1885, 2607, 13833, 19385, 15267, 4672, -18977, -10487, -3063, -8474, -11432, -19402, -17142, -11421, -3625, 12583, 17613, 9178, 14865, 14208, 17208, 14313, 4580, -953, -11587, -17073, -14493, -16210, -17904, -16118, -15112, -8349, 2521, 16566, 27054, 17921, -2460, 2912, 13602, 17210, 3550, -17286, -15100, -14128, -19596, -13542, 3234, 4000, -1845, 6757, 23570, -15515, -5662, 27166, 22209, 30508, 7200, -11240, -22790, -30326, -16045, 16541, 2941, -5693, -15841, -15613, 10471, 20722, 27740, 28683, 6850, -8300, -11121, 401, 7924, -13244, -12640, -25411, -29107, -23538, -3812, 16742, 21714, 3034, 12794, 12744, 15459, 24822, 13592, 6947, -13543, -20663, -21556, -12616, -12180, -5979, -14692, -10651, -13174, 2002, 20367, 29741, 26660, 15097, 1347, -16406, -5883, -2109, 6791, -3230, -15973, -17542, -12467, -8738, 11027, 16609, 21226, 11952, 2270, 10974, 10098, -21138, -2337, 23437, 6572, 23835, -7863, -12180, -19419, -30970, -7791, 13974, 13972, 9088, 804, 1006, 665, 5311, 27910, 22373, 1156, -12338, -20072, -17905, -15030, -16806, 5816, -7838, -3428, -9141, -5306, 2906, 9496, 19513, 26222, 11794, -5407, -1793, -12747, 892, -12684, -5951, -6513, -10766, -14977, -10260, -6299, 2403, 4929, 10793, 16630, 2814, 4665, 499, 4282, -9135, 284, -1558, 1560, -8880, -12650, 4221, 1878, 610, 5500, 10363, 4683, 495, 3328, 14166, 7221, -4959, -28701, 3827, 11711, 12607, 28304, 5774, -5910, -26762, -28487, -13989, 5083, 19657, 24912, 17229, -1609, -21033, -12682, 6132, 17347, 13548, 15720, -4667, -19939, -25857, -25325, -7471, -1255, 10880, 2154, -215, -9400, -3708, -6153, 7619, 22869, 25223, 18208, -3852, -13648, -24029, -18699, -6975, 11484, 5165, -2262, -13403, -13997, -8094, 3720, 14254, 22542, 19943, 14128, -833, -15884, -2893, -2099, 10269, 5406, 1513, -3752, -16187, -14152, -227, 8043, 14368, 11949, 10929, 10404, -1735, -23515, -6241, 18562, 8635, 27060, 14618, -1089, -18365, -31876, -23742, -12600, 6051, 24449, 27800, 13167, -7754, -16629, -12139, 122, 8204, 16565, 21933, -1459, -9952, -23747, -26558, -22050, -10426, 7691, 9889, 5684, -2271, -9445, -12712, 2818, 14521, 18831, 15555, 6827, -7452, -15073, -16925, -9432, -3496, -3375, -318, -3195, -3624, -1392, 7098, 10313, 15702, 13218, 9867, -3676, -3793, 2095, 1374, 2344, -2995, 2672, -4654, -10555, -7010, 3993, 10564, 11867, 8528, 8657, 1637, -2221, -20111, -368, 18781, 4328, 19250, 9855, -273, -18353, -30820, -17685, -5456, 1822, 13289, 18959, 12489, -2673, -3756, -8573, -1247, 1237, 6242, 14324, 3054, 1410, -13981, -14880, -20705, -14324, -10768, -5811, 4369, 1208, 241, -1335, 4697, 9134, 9599, 7953, 9371, 3842, -4634, -8564, -7119, -6497, -5033, -6303, -3706, -1040, 2979, 4757, 6471, 7313, 5356, 5693, -5090, -272, 1581, 3585, 5923, 5426, 6878, 2001, -4327, -3136, -426, -2365, 3962, 3794, 6575, 1666, -3196, -9539, -5138, -7876, -571, 18801, 7573, 6059, 4165, -34, -7543, -11901, -288, 5718, 7294, 854, -2073, -3969, -16636, -10081, -3091, 8352, 6657, 2870, 4450, -2313, -3222, -8781, -801, -158, -228, -553, -5034, -6160, -4236, -1336, -1821, 3550, 6269, 4324, 546, -1184, 2165, 548, 922, 6907, 4828, 2496, 2960, 3473, 4006, 1081, -163, 2880, -498, -5316, -5555, -4232, 579, 2049, 3473, 7930, 7616, 5828, 4073, 378, -2886, -5666, -3041, -1326, -3791, -4886, -3416, -2268, -2773, 1921, 5470, -1505, 4785, 11521, 6109, 4623, 3324, 3511, -9093, -12794, -6102, -3261, -541, -6955, -5225, 632, -2824, -1924, 2266, 8052, 2915, -2372, -938, -2957, -1449, -5198, 1490, 7379, 1004, 724, 737, -3844, -3391, -4651, 1627, 5508, 1826, 3453, 105, -1193, 1088, 3275, 3737, 9120, 6889, 6670, 7439, -188, -1861, -3055, -2457, -1542, -609, 200, 1275, -2255, -1823, 639, 261, 5692, 5182, 5371, 4140, -2356, -6650, -7312, -3465, -2528, 559, 1937, 1209, -2953, -7405, -1534, 4136, 5015, -3406, -2302, 5828, 652, -5163, -1150, 4405, -4860, -11998, -5344, -47, 906, -4168, -3117, 3352, -4598, -9414, -5591, 1638, 4132, -1251, 4703, 9676, 4570, -640, 349, 5336, 2904, -5317, -5093, -1338, -2480, -6223, -4144, 3241, 4174, 2312, 5696, 10970, 7401, 6419, 4886, 3219, 666, -3441, -2687, -3446, -1808, -105, 1837, 1377, 3837, 3467, 3734, 3438, 1534, 950, 1848, -545, -2198, -1499, -5291, -3357, -5746, -3659, -563, -745, -641, 521, 1415, 1320, -461, -878, -117, -1775, -4562, -6825, -9924, -7048, 681, 578, 3966, 4030, 3126, -3274, -5062, -411, 3502, 2193, -2508, -2046, -3310, -3288, -2300, 4162, 9558, 6901, 1322, 1145, 261, -541, 374, 3570, 6790, 3731, 201, -2952, -4123, 137, 1625, 4538, 5693, 2038, -1349, -5777, -4848, -1736, 1404, 5927, 10047, 7880, 2757, 400, 922, 2999, 3560, 2959, 3264, 1001, -3985, -5296, -2589, -1470, 1743, 3184, 1529, -158, -2874, -1677, -22, -2237, -911, 260, -480, 217, -1082, -645, -1627, -1407, 6, 3770, 3526, 4246, 3766, 1640, -156, -166, 3347, 4367, 2715, -1561, 1469, 815, -685, -2294, 1990, 4475, 298, -2059, -2835, -2629, -3615, -2454, 1051, 5637, 3481, 2084, 1541, 49, -230, -432, -537, 385, -3466, -5674, -5879, -7424, -5160, -2951, -598, -546, -691, -342, 490, -827, -1453, 1501, 1116, -1435, -1615, -1633, -1597, -2470, -4252, -2418, -2605, -4153, -3815, -2733, -142, -1739, -2575, -817, -854, -588, -1378, -935, -1370, -671, -2036, -1850, 2610, 1929, 3067, 1582, 2324, 3292, 168, 1856, 1442, -449, 192, -337, 2300, 8173, 7332, 3633, 2993, 4765, 4140, 1621, 385, 176, -526, -2270, -3647, -1537, 1942, 626, 1171, 4466, 2464, 950, 1449, 1144, 545, -231, 942, 1146, 2285, 986, 333, 1156, -570, -943, -787, -157, -184, 623, -1173, -3453, -3208, -2128, -963, -867, 128, 237, -185, -664, -336, 829, 1193, -978, 71, 2480, 1625, 127, 718, 1152, 92, -86, 1698, 3338, 1850, 1089, -460, 500, -514, -1550, -243, 561, -988, 125, 1115, 416, 1031, 425, 2587, 421, 1961, 1974, -1134, -903, -535, -1004, -974, 1014, 545, -736, -1064, -533, -572, -1134, -170, 433, 692, -1036, -3125, -2281, -1896, -1995, -443, 2614, 1173, -1646, -3041, -1650, -419, -734, -405, -109, 727, -1171, -1491, -463, 1012, 1425, 1019, 2268, 2276, -184, -1269, -47, -752, -51, -378, 173, 2438, 1147, -484, -343, 1082, 1960, 3442, 3726, 5369, 4887, 1350, 628, 886, 1239, -1247, 266, 1959, 1262, 2011, 591, -985, -699, -80, 8, 126, -193, -753, -2162, -1138, -294, 376, 598, -664, 380, 814, -196, -212, 744, 619, -296, -768, -892, -643, -859, -2252, -2798, -404, -1036, -2316, -1651, -2473, -2733, -1829, -425, -200, -634, -584, -538, -614, 34, -335, 70, 180, -460, -1346, -21, 1310, 593, 1188, 1885, 1326, 1258, 2295, 2006, 2336, 1674, 961, 999, 1770, 968, 465, 426, -1080, -1573, -878, -59, 147, 1754, 1441, 1060, 713, 534, 179, -940, -638, -1897, -697, -2015, -1345, 96, -1070, -554, -702, 1559, 107, 163, -365, 971, 688, -547, 387, -1293, -262, -1972, -568, 105, -308, -29, -1872, -640, 1168, -1238, -916, 208, -141, -327, -363, 1616, 1594, 1048, 163, 1610, 1070, 923, 430, 1550, 2632, 1017, 2601, 2319, 2550, 2785, 1965, 1253, 2207, 2372, 1903, 2914, 2096, 1174, 591, 266, -738, -1397, -889, -1045, -113, 774, 151, 1031, 1197, -1460, -1644, -888, -847, -765, -403, -354, -983, -730, 535, -129, 108, 881, -205, 111, -1380, -1691, -1606, -1124, -2000, -2245, -679, -1458, -844, 84, -625, -670, 33, -491, 185, 187, -164, -132, -418, -158, 20, 1131, 1870, 910, 791, 2507, 2637, 1632, 1906, 1470, 1067, 590, 657, 1255, 1447, 6, 524, 2261, 1240, 1529, 860, 1719, 1483, -214, 741, 117, 264, -1008, -259, -1171, -1923, -436, -1040, 1374, -706, -22, -1675, -1648, -1786, -3362, -380, -1833, -999, -1331, -1622, -874, -899, -566, -699, -2227, -1330, -2733, -3406, -3185, -3772, -3586, -4422, -3508, -1644, -955, -1962, -990, -448, 129, 115, 946, 612, -407, 127, -633, 47, 1289, 793, 1089, 2000, 2774, 2008, 2283, 2542, 2744, 3400, 2082, 2190, 2206, 2069, 2322, 1929, 2745, 1902, 1283, 2183, 2149, 3444, 2126, 2317, 1512, 1365, 1637, 1225, 1440, -196, 441, 1066, 2458, 2007, 2187, 1543, -69, -419, 846, 1045, 153, 256, -236, 214, 18, -476, -807, -477, -1183, -1559, -863, -1545, -2378, -1911, -1484, -1651, -1238, -223, -515, 36, -390, -573, 354, 663, 1044, 627, 871, 222, 527, 79, 1169, 973, 870, 2094, 1192, 1102, 41, 228, -500, -75, -474, -692, 198, -1613, -113, -575, -445, 319, 636, 1060, -398, 477, -322, -811, 11, -254, -1660, -1510, -2360, -2104, -1601, 13, -77, -199, 112, -319, -524, 488, 1316, -4642, 103, -441, -2023, 2937, -783, -6629, -2878, 2363, -2502, -1519, 1826, -1623, -701, 2916, 1652, -541, -2264, -744, 309, -558, 137, 3776, 2022, -1820, 85, 3849, 1377, -876, 4301, 2850, 850, 2181, 2607, 1294, -323, 2298, 2471, 345, 23, 53, -782, 1101, 3391, -1066, 555, 3037, -1293, -97, 1950, 1898, -3253, 2041, 2977, -4279, -304, 1167, 516, -589, -3449, 184, 2389, -4724, 3375, 1463, -3061, -307, -6, 2532, -2384, -2450, -4, -1836, -1957, -2750, -268, 3902, -4556, -4122, 8821, 805, -7225, 5259, 1478, -6312, -1695, 7265, -1908, 98, 5801, 347, -3125, -165, 7081, 3338, 991, 1210, 6658, -1985, 375, 1650, 1556, 642, -2981, 4994, 731, -2786, 6533, -1257, -3892, 2413, 1066, 1744, -6072, 1343, 995, -2896, 4643, -538, -2218, 1743, -2333, -720, -2370, -3135, 1035, -3389, -139, -669, -2424, 2870, -1394, 1010, 1195, -3136, 543, 276, -3864, -392, -1861, -1069, -825, -2864, 6, -6174, -2350, 112, -1040, 652, -384, -2234, 195, 1318, 2375, -2859, -122, 4580, -3839, 1082, 2746, -2201, 2538, 2390, 1136, 1684, 4475, 2471, -2947, 3623, -118, 2199, 5647, -1064, 1343, 1032, 2358, 1503, -1105, 7719, -5391, -1967, 4394, -1712, 4240, -1413, 2178, -1690, -2994, 3644, -986, 431, 3689, -3815, 622, 325, -1565, 408, 238, 825, -6986, 646, 1976, -6578, 485, 388, -5948, 2333, 1503, -3478, -3785, 180, 1368, -6750, -2297, 1225, -6000, -801, 2894, -1125, -1189, 2755, 3166, -5928, 3321, 4256, -4553, 1813, 2916, -1000, 1620, 4081, 1071, 1655, 2416, 163, -1236, 5385, 77, -637, 5648, -1735, 3695, 4755, 401, -189, 2676, 1443, -1208, 1439, -817, 1946, 1322, -2356, 958, 1468, -1363, 2927, 5072, 1587, -2008, 1328, -1945, -1717, 4903, -2109, 218, 2382, -1309, 550, -1156, 1501, -2232, -1198, 2792, -7284, 3290, -764, -2353, 2579, -4522, 2574, -3500, -225, 40, -1680, 4176, -2865, 647, 6875, -3210, 806, 4699, -557, -1271, 1139, 3605, -6349, 786, 3000, -1545, 3977, 3583, -1174, 637, 3888, -306, -2279, 4022, 90, -4658, 5109, -1488, -2461, 2023, -682, -318, -2139, 964, -2665, -3254, 1691, -3187, 3385, 510, -4149, 3322, -451, -2773, 542, 1093, -2711, 791, -177, -3084, -468, -2200, -2247, 1957, -4780, -4168, 1018, -1512, 1918, -2432, 268, -2916, -3233, 1533, -3361, 2368, -1694, 370, 2020, -5041, 3454, -640, -877, 2612, 1776, 4286, -2, 1363, 2219, -311, 2548, 948, 1904, 5587, -2506, 1849, 2291, -2556, 910, 1420, 2192, 1833, 4448, 2617, -2143, 3324, 277, -4764, 756, -2854, -5559, -631, -954, -1192, 1283, 1983, 496, 147, 1530, -1081, 381, 447, -2226, -828, -40, -2114, -670, -854, -2270, -614, -918, -995, -1226, -693, 1777, -2553, -1612, 670, -1439, 98, -178, 3245, 1230, -1346, 2514, -598, -3009, 2357, -2119, -446, 1666, 559, 2004, 2444, 4549, 1055, 3525, 6351, -1840, 2163, 4416, -2236, 1939, 6784, 4050, 2167, 5687, 1625, -1683, 3372, 2115, -3919, 8634, -485, 99, 4959, -3968, 1775, -587, -1543, 141, 163, -646, -760, -1757, 1979, -4536, 194, 3565, -979, 1676, 1147, 2329, -1119, -311, 2211, -3559, -2520, -376, -5573, -7268, -2148, -3671, -8394, -4379, -2879, 250, -1349, -687, 259, -1312, 1664, -820, -1378, 2507, 666, 514, -259, 371, 1069, -1181, 10, 814, 799, -2750, -1812, 1859, -1072, 269, 895, -3710, 242, 1206, -1614, -271, 277, 3615, 7925, -952, 3984, 3396, -7715, 8918, 19935, -990, -5474, 11039, -2695, -6536, 378, -4831, -8025, -608, 4388, -6199, -5618, 5357, 1241, -1050, 6146, 4038, 5751, 6684, 7064, 3908, -1069, 2807, 127, -6181, -4576, -5365, -9442, -7988, -6211, -3513, -7939, -863, 4632, -5321, 2135, 11755, 8082, 2975, 6055, 7662, 2301, 1649, 3097, -2482, -7, 2770, 22, -3063, -2988, -2027, -7673, -4488, 2252, 461, -2920, 1785, 2529, 1143, -3194, 2228, 1645, -748, 7833, 5044, -16609, -17080, 22219, -4546, -4361, 23124, -10468, 601, 10638, -4722, -2603, -13748, 218, 12348, -19833, -12494, 12897, -2118, 2336, 2686, -2941, 9928, 229, 11562, 1610, -14581, 6129, 4614, -13261, -14306, -11240, -6022, -7270, -15825, -2968, -5269, -2975, 8685, 1565, 3665, 12193, 9357, 8437, 3307, 6041, 9900, -1495, 3695, 4392, -794, -74, 3043, -97, 595, -5652, -4848, 12680, 449, 1292, 3585, 1700, 12845, 4245, -186, 11391, 6638, 7468, 16207, -1300, -21773, 16708, 14837, -18643, 11528, -9363, -691, 13107, -18566, 1950, -6105, -16094, 17493, 2674, -26208, 883, 10163, 11285, 5458, -15695, 15936, 11210, -4329, 7156, -7242, -8145, -1143, -5050, -12409, -12876, -21216, -1026, -481, -17677, -4258, -1773, 7513, 4475, -1180, 6410, 7877, 2199, 15735, 7458, -5262, 2140, 3647, 991, -11576, -9175, 5023, 715, -12819, -4746, -13126, 5186, 7471, -10141, -550, -1932, 11554, 13929, -6385, 1734, 18379, 3756, 7218, 6500, -3199, -23095, -7357, 29367, -7566, -15140, -11952, -3067, 19760, -16282, -11703, 7914, -11520, -263, 17733, -6160, -16666, 4361, 14253, 24327, -7705, -16384, 20644, 11485, 1633, -6636, -12822, -4058, 837, -7946, -7379, -12864, -21715, 7444, 3676, -2067, -3842, -4452, 19341, 24413, 4896, 2274, 11200, 15364, 20804, -2792, -1388, -1342, -2798, 3626, -3675, -16062, -9537, -753, 2749, -9393, -16175, 17095, 15641, 325, -5157, 8841, 24252, 7975, -7667, 11931, 8576, -6586, 2535, 2344, -2273, -19660, -24679, 20781, 6789, -18146, -13960, -12582, 26781, 5501, -20474, 4450, -182, -11352, 20307, 5000, -17457, -8056, -5924, 23791, 11505, -26913, -5979, 12234, 12514, 203, -20502, -13495, -1342, -4668, -8198, -5603, -24896, -5705, 6272, 7679, 7215, -7142, 7672, 21126, 19187, 7145, 8799, -452, 11765, 6493, 222, -453, -13208, -2867, -539, -8842, -6583, -4042, -602, -41, -4667, 20164, 13864, 9092, 3381, 1839, 21998, 10105, -9659, 2514, 9561, -26, -8408, -8553, -426, -16952, -24014, 12435, 18482, -4627, -11670, -15961, 15025, 17333, -5523, -16, -965, -10684, 6122, 5393, -3632, -10811, -20214, 4392, 15777, -8014, -11005, -2221, 3341, 10333, -7282, -10142, -6158, -11142, -14643, 19, -5706, -6721, -6501, -7384, 16300, 14082, 4761, 6515, 8020, 9623, 19301, 5211, -1589, -2529, -4385, 4657, 1483, -6788, -7046, -5697, -4202, 7519, 1863, -979, -6590, 9313, 28004, 16798, 1773, -4590, 11847, 12006, 5119, -2474, 53, -2798, -2845, -873, -1734, -3650, -16052, -24466, 3044, 31295, 7096, -191, -15801, -4410, 20783, 1988, 1537, 7564, -16205, -14569, 6306, 6343, -914, -17607, -20484, 12877, 14263, 386, 3907, -9974, 4331, 5590, -2121, -1507, -4272, -19232, -7792, 977, 1304, -1136, -12168, 11572, 14673, 8418, 7142, 12115, 8614, 12170, -2562, 375, 5569, -9574, -5037, -5401, -163, -2763, -7003, -4693, 2056, -5475, -6536, -1096, 16621, 17817, 551, -2342, 3632, 9514, 1574, -9008, -4836, 6751, -4576, -9263, -6147, -4005, -7092, -16493, -10449, -214, -13618, 13271, 17501, 4072, 10900, -18385, -9070, 1388, -1191, 2253, 611, -15570, -13663, -8570, -14498, 1913, 7118, 2745, 3608, -6836, 6555, 21021, 9704, 4276, -8440, -11870, -8908, 5647, -1900, -10833, -16344, -7698, 7515, 6916, 11616, 6282, 6300, 10773, 18103, 14587, 11620, 964, 645, -4547, -9819, 553, 6931, 2518, -8786, -13443, -4297, 5340, -3395, -2908, -5053, 8254, 14094, 12804, 12297, 2720, 6434, 5314, -218, 2510, 4554, -1982, -3750, -6758, -7468, -4295, -7675, -8326, 241, -7285, -20691, 9972, 18538, 18235, 19250, -14960, -7451, -8233, -5547, 8633, 6473, -4707, -19415, -21918, -12349, 10458, 9826, 8182, 89, -4165, 5473, 5132, 11207, 15959, 285, -9603, -15209, -16073, -2295, 2499, -3165, -3593, -13331, -10290, 5357, 12780, 21366, 12643, 4953, 2237, 4698, 6252, 12803, 5107, 80, -7608, -16090, -1730, -820, -1221, -4302, -8421, -9724, -8164, -9218, 13200, 21365, 16422, 10102, -626, 6817, 6757, 1238, 446, 3807, -6371, -9430, -13126, -6513, 4359, -5358, -14445, -5220, 2735, 2611, -16438, 568, 24820, 18188, 27217, 341, 172, -6453, -22125, -4488, 18443, 16920, -10479, -20673, -22106, -7109, -1002, 12239, 24284, 11090, -3556, -8120, 12211, 27517, 14260, 1666, -6278, -11539, -17931, -13064, -6496, -2679, -10805, -17956, -8923, -1779, 8759, 10749, 19697, 16941, 7021, -3208, -548, 5878, 9150, 2356, -10294, -13885, -20481, -20526, -10015, 7866, 2127, -8306, -19298, -5775, 7435, 16990, 18714, 5760, 423, -12717, -13952, 2522, 10911, 2044, -3916, -11604, -3445, -1051, -2510, -4875, 1089, 992, -652, -1798, -5481, -11651, 1555, 23281, 21000, 29191, 4833, -5820, -14583, -16219, 1261, 11197, 5402, -4458, -12341, -20926, -9368, -4157, 12876, 25848, 20286, 12925, -416, -4904, 11666, 12459, 11538, 2528, -12529, -22903, -26805, -20532, -272, 7634, -111, -978, -5197, 7125, 10423, 13790, 15469, 13256, 4945, 6757, 78, -5427, -1870, -6835, -2902, -7551, -15795, -13487, -2395, -1487, 4581, -7613, -2808, 4577, 1290, 5889, 3964, 5858, 4139, -3108, -4596, 7552, 4805, 4151, 4462, -259, -3291, -2720, -7199, 3574, 5919, -3220, -4448, -1785, 4399, 6845, -14269, -2405, 21465, 9668, 25567, 1025, 198, -7122, -25995, -11026, 9471, 12581, -328, -4892, -17926, -5632, -5787, 3615, 18630, 19494, 12500, 260, -4502, -174, -3872, -165, 2829, -23, -11630, -23122, -23499, -12557, 249, -245, 8015, 6002, 3019, -7105, -1928, 14101, 23620, 14713, 7509, -5733, -13752, -12490, -13766, 3664, 7005, -5977, -16773, -11503, -2098, 11030, 1824, 4551, 7289, -913, -513, -3669, 5045, 12622, 7648, 1051, 5195, -423, 1083, 4088, 7068, 10230, 1439, -11492, -6853, 5071, -1041, -2381, -3232, -147, -3200, -6228, 950, 10229, -7158, -1, 11551, 8369, 26518, -375, -2907, -10874, -22676, -7650, 4990, 11762, 936, -9097, -15177, -4522, -4127, 6068, 15047, 12359, 7958, -8778, -8829, -2807, -1344, 3685, 602, -4903, -16076, -21292, -16875, 1174, 7875, 6577, 7318, -1622, -652, 2338, 13221, 17965, 13529, 401, -4404, -9262, -8579, -2023, 5353, 11965, 3884, -8204, -9629, -3831, 665, 15058, 8648, 6292, -3889, -10928, -6595, 1190, 7107, 3840, 918, -3984, 769, -1972, 8076, 7606, 6597, 7055, -2199, -7396, -221, 1866, 4976, -2146, -11484, -11056, -16058, -6822, 357, 11293, 7894, 1407, -3943, -5239, -14799, 10493, 13522, 13056, 18653, -14139, -15133, -23253, -9831, 5110, 14770, 5266, -5506, -15647, -21316, -2809, 10142, 20789, 14912, 1943, -7574, -7149, 2386, 14681, 16508, 10777, -2995, -15104, -18784, -7302, 439, 5488, 3308, -2997, -4528, -2033, 3311, 9432, 17541, 7769, 2930, 2571, 4665, 4835, 4690, 6158, 2198, -4569, -8259, -9548, -3205, 1751, -3486, -9083, -10628, -4555, 320, 12794, 9695, 698, -1347, -9371, -4578, 4260, 8456, 11400, 3336, -4474, -6219, -2528, 1596, -1658, -1708, -4726, -9906, -12941, -6174, -1849, -2227, -2750, -3440, -610, -3524, 1052, 8572, 14260, 11855, 1885, -3109, -3029, -10567, 938, 20808, 12141, 13036, -9045, -18459, -8059, -5678, 12107, 10671, 2144, -9049, -14034, -9423, 7556, 14503, 12340, 8271, -6220, -3344, 1726, 9141, 15203, 5246, -6362, -14352, -13220, -6069, 4411, 6209, -2765, -11606, -13607, -718, 6136, 12705, 9163, 2200, -1069, -2625, 5028, 9064, 6294, -1279, -4679, -5900, -6923, -5520, -840, -585, -3021, -6630, -5774, -4629, 260, 852, 1475, 7931, 4368, 2213, 121, -2505, -1457, 4723, 7550, 5437, 514, -411, -1819, -975, 3473, 5183, 2335, -4498, -3791, -4235, -337, 370, 1253, 3080, 108, -137, -785, 3776, 3243, 2925, 2560, 1006, 3446, 2082, -719, 1238, 4144, -1846, -7555, -12267, 7629, 8162, 883, 5630, -14386, -5932, -7971, 1404, 10712, -4686, -8081, -9004, 271, 1940, 5008, 2177, -2259, -4295, -808, 8740, 6721, 3006, -2617, -5189, -3697, -6834, -3044, -5366, -6571, -6488, -3312, 3284, 1406, 3133, 4448, 8179, 7411, 9875, 7772, 4982, 2598, 927, 4000, 1924, 690, -2499, -3794, -609, -738, 1049, 368, -2631, -4659, -3712, 8490, 5155, 6240, 597, -3397, 4734, 1172, 5295, 6318, 2783, -1398, -3658, -3289, 149, -1126, -5749, -3544, -1916, -599, 1064, -1211, -289, -3833, -2258, 2389, 1151, 1436, -1907, -3606, -4405, -806, -1442, -3376, -1523, -672, -471, -2687, -2708, -177, 253, -717, 766, 1488, 744, 590, -1959, 3250, 4646, 989, 3502, 3553, -3616, -2953, 8150, 1147, 5687, 2548, -9393, -1817, 89, 3910, 1204, -2253, 3721, 1330, 0, 3342, 657, -584, -3646, 2026, 6782, 2963, 1001, -995, 389, -1802, -380, 717, -1691, -5038, -2966, 254, -976, 2087, -416, -1929, -253, 2109, 3056, 1483, -1474, -2163, -652, -3078, -514, -1610, -2433, -3411, -3711, 469, -533, 1546, 165, 1041, 797, 3540, 3524, 58, 2237, -2014, 2273, -1499, -1767, 896, 353, 3541, 1726, -1812, 2251, 6811, 1794, 2549, 1619, 4021, 1219, -1023, -383, -412, 472, -1895, -2346, -30, 1886, -671, 87, 16, -476, -377, -181, -517, 1787, -1556, -4387, -895, 128, 1179, -1532, 10, 2364, 1827, 1667, 1737, 148, -519, -1002, -3546, -2195, -2474, -2561, -1626, -1601, -2876, -776, -756, -1357, 1397, 1166, 641, -661, 733, 333, -406, 553, 851, -1035, 2037, 2226, 823, 5359, 1327, -496, -31, 2223, 1049, -447, -831, -2240, 456, 202, 238, -706, 923, 340, 2704, 4812, 4750, 1568, 62, 831, -674, 2983, -354, -821, -1091, -2683, -649, -98, -1217, -1076, 36, -159, -495, 1321, 1998, 740, 901, 317, 1358, 611, 391, -555, -131, -635, -4470, -3683, -826, -2991, -3578, -1076, -1713, -690, -1551, -584, 542, 1279, 1779, -20, 1577, 176, -371, 1289, 627, -556, 342, 214, 251, 1476, 1449, 1037, 1193, 1558, -1033, -694, 2336, 2556, 454, 786, 616, 1755, 2121, 264, 988, 2539, -295, -2222, 421, -435, -421, -767, -131, -965, -2057, -1491, -1260, -291, 27, -886, -777, -147, -767, -797, -90, 1540, 605, 87, -2181, -2004, 1252, 1804, 1254, -123, -1958, -2806, -1763, -179, 1144, 786, -790, -1768, -883, -353, 512, -106, 365, -83, -1137, 274, 297, 1424, 2171, 2366, 1594, 3456, 2534, 2444, 3221, 4140, 4865, 3213, 3072, -1218, 2208, 1798, -964, -164, -480, -1229, -1062, 1911, 1545, 1259, 1575, 1734, -119, 520, 39, 623, 1148, 56, -1751, -1480, -1336, -1941, -461, -292, 1044, -881, -441, -1491, -1401, -641, -717, -310, -1644, -1535, -2465, -933, -143, -464, -470, -863, -2684, -2165, -1670, -2747, -2306, -1581, -1069, -515, 234, -1532, 278, 765, 828, 567, 1365, 2201, 895, 2958, 2256, 1947, 377, 242, 42, 1514, 2982, 802, 2089, 1402, 500, 2000, 1551, 391, 486, 354, 185, -104, 1712, -204, -507, 739, 147, 44, -2099, 1427, 630, -857, -726, -528, -140, -1688, 37, -965, 600, 676, -983, -775, -208, -354, -159, 387, 425, -831, 27, -167, -2530, -388, -3283, -2133, -167, -532, -840, -1740, -1493, 173, -765, -317, 811, -264, -555, 2522, 1500, -331, 1847, -617, 930, 959, 6603, 516, 1856, 2995, -4106, 4211, 1403, -1964, 4864, 2408, 85, 5777, 1239, -3311, -475, -3524, 3051, 97, 3581, 91, -1005, 2190, -5439, 2617, -1813, 4017, -4312, 3390, -6675, -2190, -1790, -1129, 2185, 12, 5518, -4040, 2568, -4619, 3191, -1896, 3618, -2958, -2489, -4519, -1868, -2947, 925, 833, -4759, -1213, -4159, 972, -1730, 2879, 94, 3643, -780, 2333, -3257, 2175, 499, -1778, 4376, 599, 4289, 2193, 2085, 1973, 1700, 1112, 2671, 4208, 6919, 3429, 4801, -1808, 1842, -715, 1547, 2431, 2193, 2381, -4079, 5855, -3057, 2585, -1330, 1390, -3187, -501, 1662, -2752, -83, -877, -195, -2345, 232, -2737, -1167, -3603, 1097, -2708, -34, -1486, -2172, -2123, -2154, -3234, -1935, -931, 133, -2014, -1005, -1014, -4225, -1766, -2132, -1556, -791, -4031, -1057, -1819, -434, 1559, -3687, 2542, -2625, 2642, -2133, 3365, 200, 750, -129, 1673, 2632, 2006, 3718, 528, 2152, 3380, 3470, 3271, 2908, 2031, 3846, -966, 6065, 1489, 6912, 75, 5476, 968, 2839, 1593, 2018, 224, 1889, 853, 624, 1556, 1756, 1996, 812, 3641, -4172, 4212, -6670, 3333, -2450, 4685, -3848, 3746, 402, 1057, -767, -1396, 521, -6044, 1178, -5173, 1971, -8044, 3250, -7779, 1041, -5328, 298, -3514, -1982, 2426, -5280, 3623, -5504, 2562, -3427, 3184, -3534, 2293, 883, 1976, -1215, 854, -958, -1111, 3330, -3196, 4456, -2524, 4608, -3125, 3584, -991, 965, -218, 877, 1775, 250, 558, -2086, -202, -2520, 346, -2980, 3060, -3270, 2315, -2564, 2048, -1996, 1433, -3185, 616, 394, -1944, 1879, -2549, 1483, -2673, 2244, -4806, 3979, -5369, 3111, -1489, 151, 124, -4257, 1680, -2762, 128, -2095, -2190, -2133, -894, -2591, 3400, -3948, 4185, -1655, 3761, 795, 1429, 2405, -2206, 4010, -242, 2620, -262, 3725, 693, 4332, 1658, 3898, 1133, 3399, 2236, 2270, 3109, 1687, 2904, 2059, 1508, 924, 1956, -349, 1472, -504, 1070, -1958, 3758, -3226, 1440, 41, -188, 969, -1725, 2329, -2753, 1648, 786, -916, -228, 1088, 2135, 1520, -2004, 424, -4215, -308, -1933, -1809, -2738, -3779, -1025, -1267, -706, -2594, -2208, -3012, 1405, -2346, 16, -362, -801, -1358, -166, -702, -577, 457, -1110, 76, 1821, 580, 2900, 3784, 2176, 3141, -101, 3096, 756, 965, -646, -812, 1545, 943, 343, 1318, 458, 723, 4378, 328, 561, -37, -2230, 382, -110, -1162, -406, 1045, -547, -197, 121, 416, 347, -1033, -301, -1731, 758, -601, -1082, -412, -1071, -887, -644, 166, -258, -1077, 621, -1612, -560, -762, -1743, 897, -2666, 1358, -2351, -1174, -176, -1926, 1481, -1908, 129, -468, 667, 2210, 96, 1802, -798, 3652, 3174, 1516, 2041, 1048, 1826, 525, 3664, 742, 558, 1866, 1882, 379, 2430, -268, -146, 509, 1022, 258, 655, 1375, -1122, 1506, 516, 1123, -377, -64, -2105, 430, -126, 980, 930, -150, -201, -1494, -1280, -2641, 307, -276, }; fldigi-4.1.06/src/dtmf/0000775000175000017500000000000013515625027011572 500000000000000fldigi-4.1.06/src/dtmf/dtmf.cxx0000644000175000017500000001526613472116001013165 00000000000000// ---------------------------------------------------------------------------- // // DTMF.cxx // // Copyright (C) 2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "trx.h" #include "dtmf.h" #include "misc.h" #include "fl_digi.h" #include "configuration.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "main.h" LOG_FILE_SOURCE(debug::LOG_MODEM); // tones in 4x4 array // 697 770 842 941 1209 1336 1447 1633 int cDTMF::row[] = {697, 770, 852, 941}; int cDTMF::col[] = {1209, 1336, 1477, 1633}; const char cDTMF::rc[] = "123A456B789C*0#D"; //====================================================================== // DTMF tone receive //====================================================================== // tone #s and coefficients // 8000 Hz sampling N == 240 // 11025 Hz sampling N == 331 /* * calculate the power of each tone using Goertzel filters */ void cDTMF::calc_power() { double sr = active_modem->get_samplerate(); // reset row freq filters for (int i = 0; i < 4; i++) filt[i]->reset(240, row[i], sr); // reset col freq filters for (int i = 0; i < 4; i++) filt[i+4]->reset(240, col[i], sr); for (int i = 0; i < framesize; i++) for (int j = 0; j < NUMTONES; j++) filt[j]->run(data[i]); for (int i = 0; i < NUMTONES; i++) power[i] = filt[i]->mag(); maxpower = 0; minpower = 1e6; for (int i = 0; i < NUMTONES;i++) { if (power[i] > maxpower) maxpower = power[i]; if (power[i] < minpower) minpower = power[i]; } if ( minpower == 0 ) minpower = 1e-3; } /* * detect which signals are present. * */ int cDTMF::decode() { calc_power(); if (maxpower < (10 * progStatus.sldrSquelchValue)) return ' '; int r = -1, c = -1; double pwr = 0; for (int i = 0; i < 4; i++) if (power[i] > pwr) { pwr = power[i]; r = i; } pwr = 0; for (int i = 0; i < 4; i++) if (power[i+4] > pwr) { pwr = power[i+4]; c = i; } if (r == -1 || c == -1) return ' '; return rc[r*4 + c]; } /* * read in frames, output the decoded * results */ void cDTMF::receive(const float* buf, size_t len) { int x; static size_t dptr = 0; size_t bufptr = 0; if (!progdefaults.DTMFdecode) return; framesize = (active_modem->get_samplerate() == 8000) ? 240 : 331; while (1) { int i; for ( i = dptr; i < framesize; i++) { data[i] = buf[bufptr]; bufptr++; if (bufptr == len) break; } if (i < framesize) { dptr = i + 1; return; } dptr = 0; x = decode(); if (x == ' ') { silence_time++; if (silence_time == 4 && !dtmfchars.empty()) dtmfchars += ' '; if (silence_time == FLUSH_TIME) { if (!dtmfchars.empty()) { REQ(showDTMF, dtmfchars); dtmfchars.clear(); } silence_time = 0; } } else { silence_time = 0; if (x != last && last == ' ') dtmfchars += x; } last = x; } } //====================================================================== // DTMF tone transmit //====================================================================== void cDTMF::makeshape() { for (int i = 0; i < 128; i++) shape[i] = 1.0; for (int i = 0; i < RT; i++) shape[i] = 0.5 * (1.0 - cos (M_PI * i / RT)); } //---------------------------------------------------------------------- // transmit silence for specified time duration in milliseconds //---------------------------------------------------------------------- void cDTMF::silence(int len) { double sr = active_modem->get_samplerate(); int length = len * sr / 1000; if (length > 16384) length = 16384; memset(outbuf, 0, length * sizeof(*outbuf)); active_modem->ModulateXmtr(outbuf, length); } //---------------------------------------------------------------------- // transmit DTMF tones for specific time interval //---------------------------------------------------------------------- void cDTMF::two_tones(int ch) { if (!strchr(rc, ch)) return; int pos = strchr(rc, ch) - rc; int r = pos / 4; int c = pos % 4; double sr = active_modem->get_samplerate(); double phaseincr = 2.0 * M_PI * row[r] / sr; double phase = 0; int length = duration * sr / 1000; if (length > 16384) length = 16384; for (int i = 0; i < length; i++) { outbuf[i] = 0.5 * sin(phase); phase += phaseincr; } phaseincr = 2.0 * M_PI * col[c] / sr; phase = 0; for (int i = 0; i < length; i++) { outbuf[i] += 0.5 * sin(phase); phase += phaseincr; } for (int i = 0; i < RT; i++) { outbuf[i] *= shape[i]; outbuf[length - 1 - i] *= shape[i]; } active_modem->ModulateXmtr(outbuf, length); } //---------------------------------------------------------------------- // transmit the string contained in progdefaults.DTMFstr and output as // dtmf valid characters, 0-9, *, #, A-D // each pair of tones is separated by 50ms silence // 500 msec silence for ' ', ',' or '-' // 50 msec silence for invalid characters //---------------------------------------------------------------------- void cDTMF::send() { int c = 0, delay = 0; duration = 50; RT = (int)(active_modem->get_samplerate() * 4 / 1000.0); // 4 msec edge makeshape(); size_t colon = std::string::npos; size_t modifier = progdefaults.DTMFstr.find("W"); if (modifier != std::string::npos) { delay = atoi(&progdefaults.DTMFstr[modifier + 1]); colon = progdefaults.DTMFstr.find(':', modifier); progdefaults.DTMFstr.erase(modifier, colon - modifier + 1); } modifier = progdefaults.DTMFstr.find('L'); if (modifier != std::string::npos) { duration = atoi(&progdefaults.DTMFstr[modifier + 1]); colon = progdefaults.DTMFstr.find(':', modifier); progdefaults.DTMFstr.erase(modifier, colon - modifier + 1); } while (delay > 50) { silence(50); delay -= 50;} if (delay) silence(delay); for(size_t i = 0; i < progdefaults.DTMFstr.length(); i++) { c = progdefaults.DTMFstr[i]; if (c == ' ' || c == ',' || c == '-') silence(duration); else if ( (c >= '0' && c <= '9') || c == '*' || c == '#' || (c >= 'A' && c <= 'D') ) two_tones(c); silence(duration); } progdefaults.DTMFstr.clear(); } fldigi-4.1.06/src/dialogs/0000775000175000017500000000000013515625030012254 500000000000000fldigi-4.1.06/src/dialogs/fl_digi_main.cxx0000644000175000017500000031427713472115774015350 00000000000000 void create_fl_digi_main_primary() { // bx used as a temporary spacer Fl_Box *bx; int Wmacrobtn; int xpos; int ypos; int wBLANK; int fnt = progdefaults.FreqControlFontnbr; int freqheight = Hentry; fl_font(fnt, freqheight); int freqwidth = (int)fl_width("9") * 10; fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); int Y = 0; #ifdef __APPLE__ fl_mac_set_about(cb_mnuAboutURL, 0); #endif IMAGE_WIDTH = 4000; Hwfall = progdefaults.wfheight; Wwfall = progStatus.mainW - 2 * DEFAULT_SW; int fixed_height = Hmenu + Hqsoframe + Hwfall + Hstatus; int hmacros = TB_HEIGHT * 4; fixed_height += hmacros; //---------------------------------------------------------------------- // needed to prevent user from manually modifying fldigi_def.xml // with values to would cause the UI to seg fault if (progdefaults.HellRcvHeight < 14) progdefaults.HellRcvHeight = 14; if (progdefaults.HellRcvHeight > 42) progdefaults.HellRcvHeight = 42; if (progdefaults.HellRcvWidth < 1) progdefaults.HellRcvWidth = 1; if (progdefaults.HellRcvWidth > 4) progdefaults.HellRcvWidth = 4; //---------------------------------------------------------------------- minhtext = 2 * progdefaults.HellRcvHeight + 4;//6; int Htext = 3 * minhtext; main_hmin = Htext + fixed_height; // developer usage //cout << "=============================================================" << endl; //cout << "min main_height ..... " << main_hmin << endl; //cout << " = Hmenu ............ " << Hmenu << endl; //cout << " + Hqsoframe ........ " << Hqsoframe << endl; //cout << " + Hwfall ........... " << Hwfall << endl; //cout << " + Hstatus ......... " << Hstatus << endl; //cout << " + Hmacros .......... " << hmacros << endl; //cout << " + text height ...... " << Htext << endl; //cout << "=============================================================" << endl; if (progStatus.mainH < main_hmin) { progStatus.mainH = main_hmin; } if (progStatus.tile_y > Htext) progStatus.tile_y = Htext / 2; int W = progStatus.mainW; int H = main_hmin; int xtmp = 0; fl_digi_main = new Fl_Double_Window( progStatus.mainX, progStatus.mainY, W, H); int lfont = fl_digi_main->labelfont(); int lsize = FL_NORMAL_SIZE; fl_font(lfont, lsize); { // mnuFrame mnuFrame = new Fl_Group(0,0, W, Hmenu); mnu = new Fl_Menu_Bar(0, 0, W - 325, Hmenu); // do some more work on the menu for (size_t i = 0; i < sizeof(menu_)/sizeof(menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items if (menu_[i].text) { menu_[i].labelsize_ = lsize; } // set the icon label for items with the multi label type if (menu_[i].labeltype() == _FL_MULTI_LABEL) icons::set_icon_label(&menu_[i]); } mnu->menu(menu_); toggle_visible_modes(NULL, NULL); tx_timer = new Fl_Box(W - 325, 0, 75, Hmenu, ""); tx_timer->box(FL_UP_BOX); tx_timer->color(FL_BACKGROUND_COLOR); tx_timer->labelcolor(FL_BACKGROUND_COLOR); tx_timer->labelsize(FL_NORMAL_SIZE - 1); tx_timer->labelfont(lfont); btnAutoSpot = new Fl_Light_Button(W - 250, 0, 50, Hmenu, "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); btnAutoSpot->labelsize(FL_NORMAL_SIZE - 1); btnAutoSpot->labelfont(lfont); btnRSID = new Fl_Light_Button(W - 200, 0, 50, Hmenu, "RxID"); btnRSID->tooltip("Receive RSID"); btnRSID->selection_color( progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor); btnRSID->value(progdefaults.rsid); btnRSID->callback(cbRSID, 0); btnRSID->labelsize(FL_NORMAL_SIZE - 1); btnRSID->labelfont(lfont); btnTxRSID = new Fl_Light_Button(W - 150, 0, 50, Hmenu, "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); btnTxRSID->labelsize(FL_NORMAL_SIZE - 1); btnTxRSID->labelfont(lfont); btnTune = new Fl_Light_Button(W - 100, 0, 50, Hmenu, "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); btnTune->labelsize(FL_NORMAL_SIZE - 1); btnTune->labelfont(lfont); btnMacroTimer = new Fl_Button(W - 50, 0, 50, Hmenu); btnMacroTimer->labelcolor(FL_DARK_RED); btnMacroTimer->callback(cbMacroTimerButton); btnMacroTimer->set_output(); btnMacroTimer->labelsize(FL_NORMAL_SIZE - 1); btnMacroTimer->labelfont(lfont); mnuFrame->resizable(mnu); mnuFrame->end(); } int alt_btn_width = 2 * DEFAULT_SW; { // Constants // reset the message dialog font fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); // reset the tooltip font Fl_Tooltip::font(FL_HELVETICA); Fl_Tooltip::size(FL_NORMAL_SIZE); Fl_Tooltip::hoverdelay(0.5); Fl_Tooltip::delay(2.0); Fl_Tooltip::enable(progdefaults.tooltips); Y += mnuFrame->h(); } TopFrame1 = new Fl_Group( 0, Y, fl_digi_main->w(), Hqsoframe); { // TopFrame1 int fnt1 = progdefaults.FreqControlFontnbr; int freqheight1 = 2 * Hentry + pad - 2; fl_font(fnt1, freqheight1); int freqwidth1 = (int)fl_width("9") * 10; int mode_cbo_w = (freqwidth1 - 2 * Wbtn - 3 * pad) / 2; int bw_cbo_w = freqwidth1 - 2 * Wbtn - 3 * pad - mode_cbo_w; int smeter_w = mode_cbo_w + bw_cbo_w + pad; int rig_control_frame_width = freqwidth1 + 3 * pad; fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); RigControlFrame = new Fl_Group( 0, TopFrame1->y(), rig_control_frame_width, Hqsoframe); { // RigControlFrame 1 RigControlFrame->box(FL_FLAT_BOX); qsoFreqDisp1 = new cFreqControl( pad, RigControlFrame->y() + pad, freqwidth1, freqheight1, "10"); qsoFreqDisp1->box(FL_DOWN_BOX); qsoFreqDisp1->color(FL_BACKGROUND_COLOR); qsoFreqDisp1->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp1->labeltype(FL_NORMAL_LABEL); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->labelsize(12); qsoFreqDisp1->labelcolor(FL_FOREGROUND_COLOR); qsoFreqDisp1->align(FL_ALIGN_CENTER); qsoFreqDisp1->when(FL_WHEN_RELEASE); qsoFreqDisp1->callback(qso_movFreq); qsoFreqDisp1->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp1->value(0); pwrmeter = new PWRmeter( qsoFreqDisp1->x(), qsoFreqDisp1->y() + qsoFreqDisp1->h() + pad, smeter_w, Hentry); pwrmeter->select(progdefaults.PWRselect); pwrmeter->tooltip(_("Click to set power level")); pwrmeter->callback( (Fl_Callback *) cb_meters); pwrmeter->hide(); smeter = new Smeter( qsoFreqDisp1->x(), qsoFreqDisp1->y() + qsoFreqDisp1->h() + pad, smeter_w, Hentry); set_smeter_colors(); smeter->tooltip(_("Click to set power level")); smeter->callback( (Fl_Callback *) cb_meters); smeter->hide(); pwrlevel_grp = new Fl_Group( smeter->x(), smeter->y(), smeter->w(), smeter->h()); pwr_level = new Fl_Value_Slider2( pwrlevel_grp->x(), pwrlevel_grp->y(), pwrlevel_grp->w() - 50, pwrlevel_grp->h()); pwr_level->type(FL_HOR_NICE_SLIDER); pwr_level->range(0, 100.0); pwr_level->step(1); pwr_level->callback( (Fl_Callback *) cb_set_pwr_level ); pwr_level->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); pwr_level->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); pwr_level->tooltip(_("Adjust Power Level")); set_pwr_level = new Fl_Button( pwr_level->x() + pwr_level->w(), pwr_level->y(), 50, pwr_level->h(), _("Done")); set_pwr_level->tooltip(_("Return to Smeter / Pmeter")); set_pwr_level->callback( (Fl_Callback *) cb_exit_pwr_level ); pwrlevel_grp->end(); pwrlevel_grp->hide(); qso_combos = new Fl_Group( qsoFreqDisp1->x(), qsoFreqDisp1->y() + qsoFreqDisp1->h() + pad, smeter_w, Hentry); qso_combos->box(FL_FLAT_BOX); qso_opMODE = new Fl_ListBox( smeter->x(), smeter->y(), mode_cbo_w, Hentry); qso_opMODE->box(FL_DOWN_BOX); qso_opMODE->color(FL_BACKGROUND2_COLOR); qso_opMODE->selection_color(FL_BACKGROUND_COLOR); qso_opMODE->labeltype(FL_NORMAL_LABEL); qso_opMODE->labelfont(0); qso_opMODE->labelsize(FL_NORMAL_SIZE); qso_opMODE->labelcolor(FL_FOREGROUND_COLOR); qso_opMODE->callback((Fl_Callback*)cb_qso_opMODE); qso_opMODE->align(FL_ALIGN_TOP); qso_opMODE->when(FL_WHEN_RELEASE); qso_opMODE->readonly(true); qso_opMODE->end(); qso_opBW = new Fl_ListBox( qso_opMODE->x() + mode_cbo_w + pad, smeter->y(), bw_cbo_w, Hentry); qso_opBW->box(FL_DOWN_BOX); qso_opBW->color(FL_BACKGROUND2_COLOR); qso_opBW->selection_color(FL_BACKGROUND_COLOR); qso_opBW->labeltype(FL_NORMAL_LABEL); qso_opBW->labelfont(0); qso_opBW->labelsize(FL_NORMAL_SIZE); qso_opBW->labelcolor(FL_FOREGROUND_COLOR); qso_opBW->callback((Fl_Callback*)cb_qso_opBW); qso_opBW->align(FL_ALIGN_TOP); qso_opBW->when(FL_WHEN_RELEASE); qso_opBW->readonly(true); qso_opBW->end(); qso_opGROUP = new Fl_Group( qso_opMODE->x() + mode_cbo_w + pad, smeter->y(), bw_cbo_w, Hentry); qso_opGROUP->box(FL_FLAT_BOX); qso_btnBW1 = new Fl_Button( qso_opGROUP->x(), qso_opGROUP->y(), qso_opGROUP->h() * 3 / 4, qso_opGROUP->h()); qso_btnBW1->callback((Fl_Callback*)cb_qso_btnBW1); qso_opBW1 = new Fl_ListBox( qso_btnBW1->x()+qso_btnBW1->w(), qso_btnBW1->y(), qso_opGROUP->w() - qso_btnBW1->w(), qso_btnBW1->h()); qso_opBW1->box(FL_DOWN_BOX); qso_opBW1->color(FL_BACKGROUND2_COLOR); qso_opBW1->selection_color(FL_BACKGROUND_COLOR); qso_opBW1->labeltype(FL_NORMAL_LABEL); qso_opBW1->labelfont(0); qso_opBW1->labelsize(FL_NORMAL_SIZE); qso_opBW1->labelcolor(FL_FOREGROUND_COLOR); qso_opBW1->callback((Fl_Callback*)cb_qso_opBW1); qso_opBW1->align(FL_ALIGN_TOP); qso_opBW1->when(FL_WHEN_RELEASE); qso_opBW1->end(); qso_btnBW1->hide(); qso_opBW1->hide(); qso_btnBW2 = new Fl_Button( qso_opGROUP->x(), qso_opGROUP->y(), qso_opGROUP->h() * 3 / 4, qso_opGROUP->h()); qso_btnBW2->callback((Fl_Callback*)cb_qso_btnBW2); qso_opBW2 = new Fl_ListBox( qso_btnBW2->x()+qso_btnBW2->w(), qso_btnBW2->y(), qso_opGROUP->w() - qso_btnBW2->w(), qso_btnBW2->h()); qso_opBW2->box(FL_DOWN_BOX); qso_opBW2->color(FL_BACKGROUND2_COLOR); qso_opBW2->selection_color(FL_BACKGROUND_COLOR); qso_opBW2->labeltype(FL_NORMAL_LABEL); qso_opBW2->labelfont(0); qso_opBW2->labelsize(FL_NORMAL_SIZE); qso_opBW2->labelcolor(FL_FOREGROUND_COLOR); qso_opBW2->callback((Fl_Callback*)cb_qso_opBW2); qso_opBW2->align(FL_ALIGN_TOP); qso_opBW2->when(FL_WHEN_RELEASE); qso_opBW2->end(); qso_opGROUP->end(); qso_opGROUP->hide(); qso_combos->end(); Fl_Button *smeter_toggle = new Fl_Button( qso_opBW->x() + qso_opBW->w() + pad, smeter->y(), Wbtn, Hentry); smeter_toggle->callback(cb_toggle_smeter, 0); smeter_toggle->tooltip(_("Toggle smeter / combo controls")); smeter_toggle->image(new Fl_Pixmap(tango_view_refresh)); qso_opPICK = new Fl_Button( smeter_toggle->x() + Wbtn + pad, smeter->y(), Wbtn, Hentry); addrbookpixmap = new Fl_Pixmap(address_book_icon); qso_opPICK->image(addrbookpixmap); qso_opPICK->callback(showOpBrowserView, 0); qso_opPICK->tooltip(_("Open List")); RigControlFrame->resizable(NULL); RigControlFrame->end(); } Fl_Group *rightframes = new Fl_Group( rightof(RigControlFrame) + pad, RigControlFrame->y(), W - rightof(RigControlFrame) - pad, Hqsoframe); rightframes->box(FL_FLAT_BOX); { // rightframes RigViewerFrame = new Fl_Group( rightframes->x(), rightframes->y(), rightframes->w(), rightframes->h()); { // RigViewerFrame qso_btnSelFreq = new Fl_Button( RigViewerFrame->x(), RigViewerFrame->y() + pad, Wbtn, Hentry); qso_btnSelFreq->image(new Fl_Pixmap(left_arrow_icon)); qso_btnSelFreq->tooltip(_("Select")); qso_btnSelFreq->callback((Fl_Callback*)cb_qso_btnSelFreq); qso_btnAddFreq = new Fl_Button( rightof(qso_btnSelFreq) + pad, RigViewerFrame->y() + pad, Wbtn, Hentry); qso_btnAddFreq->image(new Fl_Pixmap(plus_icon)); qso_btnAddFreq->tooltip(_("Add current frequency")); qso_btnAddFreq->callback((Fl_Callback*)cb_qso_btnAddFreq); qso_btnClearList = new Fl_Button( RigViewerFrame->x(), RigViewerFrame->y() + Hentry + 2 * pad, Wbtn, Hentry); qso_btnClearList->image(new Fl_Pixmap(trash_icon)); qso_btnClearList->tooltip(_("Clear list")); qso_btnClearList->callback((Fl_Callback*)cb_qso_btnClearList); qso_btnDelFreq = new Fl_Button( rightof(qso_btnClearList) + pad, RigViewerFrame->y() + Hentry + 2 * pad, Wbtn, Hentry); qso_btnDelFreq->image(new Fl_Pixmap(minus_icon)); qso_btnDelFreq->tooltip(_("Delete from list")); qso_btnDelFreq->callback((Fl_Callback*)cb_qso_btnDelFreq); qso_btnAct = new Fl_Button( RigViewerFrame->x(), RigViewerFrame->y() + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_btnAct->image(new Fl_Pixmap(chat_icon)); qso_btnAct->callback(cb_qso_inpAct); qso_btnAct->tooltip("Show active frequencies"); qso_inpAct = new Fl_Input2( rightof(qso_btnAct) + pad, RigViewerFrame->y() + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_inpAct->when(FL_WHEN_ENTER_KEY); qso_inpAct->callback(cb_qso_inpAct); qso_inpAct->tooltip("Grid prefix for activity list"); // fwidths set in rigsupport.cxx qso_opBrowser = new Fl_Browser( rightof(qso_btnDelFreq) + pad, RigViewerFrame->y() + pad, rightframes->w() - 2*Wbtn - pad, Hqsoframe - 2 * pad ); qso_opBrowser->column_widths(fwidths); qso_opBrowser->column_char('|'); qso_opBrowser->tooltip(_("Select operating parameters")); qso_opBrowser->callback((Fl_Callback*)cb_qso_opBrowser); qso_opBrowser->type(FL_MULTI_BROWSER); qso_opBrowser->box(FL_DOWN_BOX); qso_opBrowser->labelfont(4); qso_opBrowser->labelsize(12); #ifdef __APPLE__ qso_opBrowser->textfont(FL_SCREEN_BOLD); qso_opBrowser->textsize(13); #else qso_opBrowser->textfont(FL_HELVETICA); qso_opBrowser->textsize(13); #endif opUsageFrame = new Fl_Group( qso_opBrowser->x(), qso_opBrowser->y(), qso_opBrowser->w(), Hentry); opUsageFrame->box(FL_DOWN_BOX); opOutUsage = new Fl_Output( opUsageFrame->x() + pad, opUsageFrame->y() + opUsageFrame->h() / 2 - Hentry / 2, opUsageFrame->w() * 4 / 10, Hentry); opOutUsage->color(FL_BACKGROUND_COLOR); opUsage = new Fl_Input2( opOutUsage->x() + opOutUsage->w() + pad, opOutUsage->y(), opUsageFrame->w() - opOutUsage->w() - 50 - 3 * pad, Hentry); opUsageEnter = new Fl_Button( opUsage->x() + opUsage->w() , opUsage->y(), 50, Hentry, "Enter"); opUsageEnter->callback((Fl_Callback*)cb_opUsageEnter); opUsageFrame->end(); opUsageFrame->hide(); RigViewerFrame->resizable(qso_opBrowser); RigViewerFrame->end(); RigViewerFrame->hide(); } int y2 = TopFrame1->y() + Hentry + 2 * pad; int y3 = TopFrame1->y() + 2 * (Hentry + pad) + pad; x_qsoframe = RigViewerFrame->x(); Logging_frame = new Fl_Group( rightframes->x(), rightframes->y(), rightframes->w(), rightframes->h()); { // Logging frame { // buttons btnQRZ = new Fl_Button( x_qsoframe, qsoFreqDisp1->y(), Wbtn, Hentry); btnQRZ->image(new Fl_Pixmap(net_icon)); btnQRZ->callback(cb_QRZ, 0); btnQRZ->tooltip(_("QRZ")); qsoClear = new Fl_Button( x_qsoframe, btnQRZ->y() + pad + Wbtn, Wbtn, Hentry); qsoClear->image(new Fl_Pixmap(edit_clear_icon)); qsoClear->callback(qsoClear_cb, 0); qsoClear->tooltip(_("Clear")); qsoSave = new Fl_Button( x_qsoframe, qsoClear->y() + pad + Wbtn, Wbtn, Hentry); qsoSave->image(new Fl_Pixmap(save_icon)); qsoSave->callback(qsoSave_cb, 0); qsoSave->tooltip(_("Save")); } fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); wf1 = fl_width("xFreq") + 90 + Hentry + 40 + fl_width("xOff") + 40 + fl_width("xIn") + 35 + fl_width("xOut") + 35; Logging_frame_1 = new Fl_Group( rightof(btnQRZ) + pad, TopFrame1->y(), wf1, Hqsoframe); { // Logging frame 1 { // Line 1 inpFreq1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xFreq"), TopFrame1->y() + pad, 90, Hentry, _("Freq")); inpFreq1->type(FL_NORMAL_OUTPUT); inpFreq1->tooltip(_("frequency kHz")); inpFreq1->align(FL_ALIGN_LEFT); btnTimeOn = new Fl_Button( rightof(inpFreq1), TopFrame1->y() + pad, Hentry, Hentry, _("On")); btnTimeOn->tooltip(_("Press to update QSO start time")); btnTimeOn->callback(cb_btnTimeOn); inpTimeOn1 = new Fl_Input2( rightof(btnTimeOn), TopFrame1->y() + pad, 40, Hentry, ""); inpTimeOn1->tooltip(_("QSO start time")); inpTimeOn1->align(FL_ALIGN_LEFT); inpTimeOn1->type(FL_INT_INPUT); inpTimeOff1 = new Fl_Input2( rightof(inpTimeOn1) + fl_width("xOff"), TopFrame1->y() + pad, 40, Hentry, _("Off")); inpTimeOff1->tooltip(_("QSO end time")); inpRstIn1 = new Fl_Input2( rightof(inpTimeOff1) + fl_width("xIn"), TopFrame1->y() + pad, 35, Hentry, _("In")); inpRstIn1->tooltip("RST in"); inpRstIn1->align(FL_ALIGN_LEFT); inpRstOut1 = new Fl_Input2( rightof(inpRstIn1) + fl_width("xOut"), TopFrame1->y() + pad, 35, Hentry, _("Out")); inpRstOut1->tooltip("RST out"); inpRstOut1->align(FL_ALIGN_LEFT); inpCall1 = new Fl_Input2( inpFreq1->x(), y2, rightof(inpTimeOn1) - inpFreq1->x(), Hentry, _("Call")); inpCall1->tooltip(_("call sign")); inpCall1->align(FL_ALIGN_LEFT); inpName1 = new Fl_Input2( inpTimeOff1->x(), y2, rightof(inpRstIn1) - inpTimeOff1->x(),Hentry, _("Op")); inpName1->tooltip(_("Operator name")); inpName1->align(FL_ALIGN_LEFT); inpAZ = new Fl_Input2( inpRstOut1->x(), y2, 35, Hentry, "Az"); inpAZ->tooltip(_("Azimuth")); inpAZ->align(FL_ALIGN_LEFT); } gGEN_QSO_1 = new Fl_Group (x_qsoframe, y3, wf1, Hentry + pad); { // QSO frame 1 inpQth = new Fl_Input2( inpCall1->x(), y3, inpCall1->w(), Hentry, "Qth"); inpQth->tooltip(_("QTH City")); inpQth->align(FL_ALIGN_LEFT); inpQTH = inpQth; inpState1 = new Fl_Input2( rightof(inpQth) + 20, y3, 30, Hentry, "St"); inpState1->tooltip(_("US State")); inpState1->align(FL_ALIGN_LEFT); inpState = inpState1; inpVEprov = new Fl_Input2( rightof(inpState1) + 20, y3, 30, Hentry, "Pr"); inpVEprov->tooltip(_("Can. Province")); inpVEprov->align(FL_ALIGN_LEFT); inpLoc1 = new Fl_Input2( rightof(inpVEprov) + 15, y3, rightof(inpAZ) - (rightof(inpVEprov) + 15), Hentry, "L"); inpLoc1->tooltip(_("Maidenhead Locator")); inpLoc1->align(FL_ALIGN_LEFT); gGEN_QSO_1->end(); } gGEN_CONTEST = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // Contest - LOG_GENERIC outSerNo1 = new Fl_Input2( inpFreq1->x(), y3, 40, Hentry, "S#"); outSerNo1->align(FL_ALIGN_LEFT); outSerNo1->tooltip(_("Sent serial number (read only)")); outSerNo1->type(FL_NORMAL_OUTPUT); inpSerNo1 = new Fl_Input2( rightof(outSerNo1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inpSerNo1->align(FL_ALIGN_LEFT); inpSerNo1->tooltip(_("Received serial number")); xtmp = rightof(inpSerNo1) + fl_width("xXch"); inpXchgIn1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp, Hentry, "Xch"); inpXchgIn1->align(FL_ALIGN_LEFT); inpXchgIn1->tooltip(_("Contest exchange in")); gGEN_CONTEST->end(); gGEN_CONTEST->hide(); } gFD = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // Field Day - LOG_FD inp_FD_class1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xClass"), y3, 40, Hentry, "Class"); inp_FD_class1->align(FL_ALIGN_LEFT); inp_FD_class1->tooltip(_("Received FD class")); inp_FD_class1->type(FL_NORMAL_INPUT); inp_FD_section1 = new Fl_Input2( rightof(inp_FD_class1) + fl_width("xSection"), y3, 40, Hentry, "Section"); inp_FD_section1->align(FL_ALIGN_LEFT); inp_FD_section1->tooltip(_("Received FD section")); inp_FD_section1->type(FL_NORMAL_INPUT); gFD->end(); gFD->hide(); } gKD_1 = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // ARRL Kids Day - LOG_KD inp_KD_age1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "Age"); inp_KD_age1->align(FL_ALIGN_LEFT); inp_KD_age1->tooltip(_("Guest operators age")); inp_KD_age1->type(FL_NORMAL_INPUT); inp_KD_state1 = new Fl_Input2( rightof(inp_KD_age1) + fl_width("xSt"), y3, 40, Hentry, "St"); inp_KD_state1->align(FL_ALIGN_LEFT); inp_KD_state1->tooltip(_("Station state")); inp_KD_state1->type(FL_NORMAL_INPUT); inp_KD_VEprov1 = new Fl_Input2( rightof(inp_KD_state1) + fl_width("xPr"), y3, 40, Hentry, "Pr"); inp_KD_VEprov1->align(FL_ALIGN_LEFT); inp_KD_VEprov1->tooltip(_("Station province")); inp_KD_VEprov1->type(FL_NORMAL_INPUT); inp_KD_XchgIn1 = new Fl_Input2( rightof(inp_KD_VEprov1) + fl_width("xXchg"), y3, gKD_1->x() + gKD_1->w() - (rightof(inp_KD_VEprov1) + fl_width("xXchg")), Hentry, "Xch"); inp_KD_XchgIn1->align(FL_ALIGN_LEFT); inp_KD_XchgIn1->tooltip(_("Additional Exchange")); inp_KD_XchgIn1->type(FL_NORMAL_INPUT); gKD_1->end(); gKD_1->hide(); } gARR = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_ARR rookie roundup inp_ARR_check1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "Chk"); inp_ARR_check1->align(FL_ALIGN_LEFT); inp_ARR_check1->tooltip(_("Check / birth-year")); inp_ARR_check1->type(FL_NORMAL_INPUT); inp_ARR_XchgIn1 = new Fl_Input2( rightof(inp_ARR_check1) + fl_width("xXchg"), y3, gARR->x() + gARR->w() - (rightof(inp_ARR_check1) + fl_width("xXchg")), Hentry, "Xchg"); inp_ARR_XchgIn1->align(FL_ALIGN_LEFT); inp_ARR_XchgIn1->tooltip(_("Round Up Exchange - State, Province, Country")); inp_ARR_XchgIn1->type(FL_NORMAL_INPUT); gARR->end(); gARR->hide(); } g1010 = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_1010 inp_1010_nr1 = new Fl_Input2( g1010->x() + fl_width("x1010#"), y3, 60, Hentry, "1010#"); inp_1010_nr1->align(FL_ALIGN_LEFT); inp_1010_nr1->tooltip(_("1010 number")); inp_1010_nr1->type(FL_NORMAL_INPUT); inp_1010_XchgIn1 = new Fl_Input2( rightof(inp_1010_nr1) + fl_width("xXchg"), y3, g1010->x() + g1010->w() - (rightof(inp_1010_nr1) + fl_width("xXchg")), Hentry, "Xchg"); inp_1010_XchgIn1->align(FL_ALIGN_LEFT); inp_1010_XchgIn1->tooltip(_("1010 exchange")); inp_1010_XchgIn1->type(FL_NORMAL_INPUT); g1010->end(); g1010->hide(); } gVHF = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_VHF inp_vhf_RSTin1 = new Fl_Input2( gVHF->x() + fl_width("xRSTin"), y3, 60, Hentry, "RSTin"); inp_vhf_RSTin1->align(FL_ALIGN_LEFT); inp_vhf_RSTin1->tooltip(_("Received RST")); inp_vhf_RSTin1->type(FL_NORMAL_INPUT); inp_vhf_RSTout1 = new Fl_Input2( rightof(inp_vhf_RSTin1) + fl_width("xout"), y3, 60, Hentry, "out"); inp_vhf_RSTout1->align(FL_ALIGN_LEFT); inp_vhf_RSTout1->tooltip(_("Sent RST")); inp_vhf_RSTout1->type(FL_NORMAL_INPUT); inp_vhf_Loc1 = new Fl_Input2( rightof(inp_vhf_RSTout1) + fl_width("xGrid"), y3, 80, Hentry, "Grid"); inp_vhf_Loc1->align(FL_ALIGN_LEFT); inp_vhf_Loc1->tooltip(_("Grid Locator")); inp_vhf_Loc1->type(FL_NORMAL_INPUT); gVHF->end(); gVHF->hide(); } gCQWW_RTTY = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // CQWW RTTY - LOG_CQWW_RTTY inp_CQzone1 = new Fl_Input2( gCQWW_RTTY->x() + fl_width("xCQz"), y3, 40, Hentry, "CQz"); inp_CQzone1->align(FL_ALIGN_LEFT); inp_CQzone1->tooltip(_("Received CQ zone")); inp_CQzone1->type(FL_NORMAL_INPUT); inp_CQstate1 = new Fl_Input2( rightof(inp_CQzone1) + fl_width("xCQs"), y3, 40, Hentry, "CQs"); inp_CQstate1->align(FL_ALIGN_LEFT); inp_CQstate1->tooltip(_("Received State/Prov")); inp_CQstate1->type(FL_NORMAL_INPUT); gCQWW_RTTY->end(); gCQWW_RTTY->hide(); } gCQWW_DX = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // CQWW DX -- LOG_CQWWDX0 inp_CQDXzone1 = new Fl_Input2( gCQWW_DX->x() + fl_width("xCQz"), y3, 40, Hentry, "CQz"); inp_CQDXzone1->align(FL_ALIGN_LEFT); inp_CQDXzone1->tooltip(_("Received CQ zone")); inp_CQDXzone1->type(FL_NORMAL_INPUT); gCQWW_DX->end(); gCQWW_DX->hide(); } gCQWPX = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_CQWPX outSerNo_WPX1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "S #"); outSerNo_WPX1->align(FL_ALIGN_LEFT); outSerNo_WPX1->tooltip(_("Sent serno")); outSerNo_WPX1->type(FL_NORMAL_OUTPUT); inpSerNo_WPX1 = new Fl_Input2( rightof(outSerNo_WPX1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inpSerNo_WPX1->align(FL_ALIGN_LEFT); inpSerNo_WPX1->tooltip(_("Received serno")); inpSerNo_WPX1->type(FL_NORMAL_INPUT); gCQWPX->end(); gCQWPX->hide(); } gCWSS = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // CW Sweepstakes - LOG_CWSS outSerNo3 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "S#"); outSerNo3->align(FL_ALIGN_LEFT); outSerNo3->tooltip(_("Sent serno")); outSerNo3->type(FL_NORMAL_OUTPUT); inp_SS_SerialNoR1 = new Fl_Input2( rightof(outSerNo3) + fl_width("xR#"), y3, 40, Hentry, "R#"); inp_SS_SerialNoR1->align(FL_ALIGN_LEFT); inp_SS_SerialNoR1->tooltip(_("Received serno")); inp_SS_SerialNoR1->type(FL_NORMAL_INPUT); inp_SS_Precedence1 = new Fl_Input2( rightof(inp_SS_SerialNoR1) + fl_width("xPre"), y3, 40, Hentry, "Pre"); inp_SS_Precedence1->align(FL_ALIGN_LEFT); inp_SS_Precedence1->tooltip(_("SS Precedence")); inp_SS_Precedence1->type(FL_NORMAL_INPUT); inp_SS_Check1 = new Fl_Input2( rightof(inp_SS_Precedence1) + fl_width("xChk"), y3, 40, Hentry, "Chk"); inp_SS_Check1->align(FL_ALIGN_LEFT); inp_SS_Check1->tooltip(_("SS Check")); inp_SS_Check1->type(FL_NORMAL_INPUT); inp_SS_Section1 = new Fl_Input2( rightof(inp_SS_Check1) + fl_width("xSec"), y3, 40, Hentry, "Sec"); inp_SS_Section1->align(FL_ALIGN_LEFT); inp_SS_Section1->tooltip(_("SS section")); inp_SS_Section1->type(FL_NORMAL_INPUT); gCWSS->end(); gCWSS->hide(); } gASCR = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // School Roundup - LOG_ASCR inp_ASCR_class1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xClass"), y3, 30, Hentry, "Class"); inp_ASCR_class1->align(FL_ALIGN_LEFT); inp_ASCR_class1->tooltip(_("ASCR class, I/C/S")); inp_ASCR_class1->type(FL_NORMAL_INPUT); inp_ASCR_class1->hide(); xtmp = rightof(inp_ASCR_class1) + fl_width("xSPC"); inp_ASCR_XchgIn1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, "SPC"); inp_ASCR_XchgIn1->align(FL_ALIGN_LEFT); inp_ASCR_XchgIn1->tooltip(_("State/Province/Country received")); inp_ASCR_XchgIn1->type(FL_NORMAL_INPUT); inp_ASCR_XchgIn1->hide(); gASCR->end(); gASCR->hide(); } gIARI = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // IARI - Italian International DX LOG_IARI inp_IARI_PR1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "Pr"); inp_IARI_PR1->align(FL_ALIGN_LEFT); inp_IARI_PR1->tooltip(_("Received Province / Ser #")); inp_IARI_PR1->type(FL_NORMAL_INPUT); out_IARI_SerNo1 = new Fl_Input2( rightof(inp_IARI_PR1) + fl_width("xS#"), y3, 40, Hentry, "S#"); out_IARI_SerNo1->align(FL_ALIGN_LEFT); out_IARI_SerNo1->tooltip(_("Sent serno")); out_IARI_SerNo1->type(FL_NORMAL_OUTPUT); inp_IARI_SerNo1 = new Fl_Input2( rightof(out_IARI_SerNo1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inp_IARI_SerNo1->align(FL_ALIGN_LEFT); inp_IARI_SerNo1->tooltip(_("Received serno")); inp_IARI_SerNo1->type(FL_NORMAL_INPUT); gIARI->end(); gIARI->hide(); } gNAQP = new Fl_Group( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // North American Qso Party - LOG_NAQP inpSPCnum_NAQP1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xNAQP xchg"), y3, 100, Hentry, "NAQP xchg"); inpSPCnum_NAQP1->align(FL_ALIGN_LEFT); inpSPCnum_NAQP1->tooltip(_("Received State/Province/Country")); inpSPCnum_NAQP1->type(FL_NORMAL_INPUT); inpSPCnum_NAQP1->hide(); gNAQP->end(); gNAQP->hide(); } gARRL_RTTY = new Fl_Group( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_RTTY ARRL RTTY Roundup inpRTU_stpr1 = new Fl_Input2( inpCall1->x(), y3, fl_width("xWWW"), Hentry, "S/P"); inpRTU_stpr1->align(FL_ALIGN_LEFT); inpRTU_stpr1->tooltip(_("State/Province/#")); inpRTU_stpr1->type(FL_NORMAL_INPUT); xtmp = rightof(inpRTU_stpr1) + fl_width("xSer"); inpRTU_serno1 = new Fl_Input2( xtmp, y3, fl_width("x9999"), Hentry, "Ser"); inpRTU_serno1->align(FL_ALIGN_LEFT); inpRTU_serno1->tooltip(_("Serial number received")); inpRTU_serno1->type(FL_NORMAL_INPUT); gARRL_RTTY->end(); gARRL_RTTY->hide(); } gNAS = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // NA Sprint - LOG_NAS outSerNo5 = new Fl_Input2( Logging_frame_1->x() + fl_width("xS#"), y3, 40, Hentry, "S#"); outSerNo5->align(FL_ALIGN_LEFT); outSerNo5->tooltip(_("Sent serial number")); outSerNo5->type(FL_NORMAL_OUTPUT); outSerNo5->hide(); xtmp = rightof(outSerNo5) + fl_width("xR#"); inp_ser_NAS1 = new Fl_Input2( xtmp, y3, 40, Hentry, "R #"); inp_ser_NAS1->align(FL_ALIGN_LEFT); inp_ser_NAS1->tooltip(_("Received serial number")); inp_ser_NAS1->type(FL_NORMAL_INPUT); inp_ser_NAS1->hide(); xtmp = rightof(inp_ser_NAS1) + fl_width("xS/P/C"); inpSPCnum_NAS1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, "S/P/C"); inpSPCnum_NAS1->align(FL_ALIGN_LEFT); inpSPCnum_NAS1->tooltip(_("State/Province/Country received")); inpSPCnum_NAS1->type(FL_NORMAL_INPUT); inpSPCnum_NAS1->hide(); gASCR->end(); gASCR->hide(); } gAIDX = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_AAM outSerNo7 = new Fl_Input2( Logging_frame_1->x() + fl_width("xS#"), y3, 40, Hentry, "S#"); outSerNo7->align(FL_ALIGN_LEFT); outSerNo7->tooltip(_("Sent serial number")); outSerNo7->type(FL_NORMAL_OUTPUT); outSerNo7->hide(); xtmp = rightof(outSerNo7) + fl_width("xR#"); inpSerNo3 = new Fl_Input2( xtmp, y3, 40, Hentry, "R#"); inpSerNo3->align(FL_ALIGN_LEFT); inpSerNo3->tooltip(_("Received serial number")); inpSerNo3->type(FL_NORMAL_INPUT); inpSerNo3->hide(); gAIDX->end(); gAIDX->hide(); } gJOTA = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_JOTA - Jamboree On The Air xtmp = Logging_frame_1->x() + fl_width("xTroop"); inp_JOTA_troop1 = new Fl_Input2( xtmp, y3, 60, Hentry, "Troop"); inp_JOTA_troop1->align(FL_ALIGN_LEFT); inp_JOTA_troop1->tooltip(_("Troop received")); inp_JOTA_troop1->type(FL_NORMAL_INPUT); inp_JOTA_troop1->hide(); xtmp = rightof(inp_JOTA_troop1) + fl_width("xScout"); inp_JOTA_scout1 = new Fl_Input2( xtmp, y3, 80, Hentry, "Scout"); inp_JOTA_scout1->align(FL_ALIGN_LEFT); inp_JOTA_scout1->tooltip(_("Scout name received")); inp_JOTA_scout1->type(FL_NORMAL_INPUT); inp_JOTA_scout1->hide(); xtmp = rightof(inp_JOTA_scout1) + fl_width("xS/P/C"); inp_JOTA_spc1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, "S/P/C"); inp_JOTA_spc1->align(FL_ALIGN_LEFT); inp_JOTA_spc1->tooltip(_("State/Province/Country received")); inp_JOTA_spc1->type(FL_NORMAL_INPUT); inp_JOTA_spc1->hide(); gJOTA->end(); gJOTA->hide(); } gAICW = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_AICW - ARRL International DX - CW xtmp = Logging_frame_1->x() + fl_width("xPwr-R"); inpSPCnum_AICW1 = new Fl_Input2( xtmp, y3, 60, Hentry, "Pwr-R"); inpSPCnum_AICW1->align(FL_ALIGN_LEFT); inpSPCnum_AICW1->tooltip(_("Power received")); inpSPCnum_AICW1->type(FL_NORMAL_INPUT); inpSPCnum_AICW1->hide(); gAICW->end(); gAICW->hide(); } gSQSO = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_SQSO - all state QSO party controls xtmp = inpCall1->x(); inpSQSO_state1 = new Fl_Input2( xtmp, y3, fl_width("xWW"), Hentry, "St"); inpSQSO_state1->align(FL_ALIGN_LEFT); inpSQSO_state1->tooltip(_("State received")); inpSQSO_state1->type(FL_NORMAL_INPUT); inpSQSO_state1->hide(); xtmp = rightof(inpSQSO_state1) + fl_width("xCnty"); inpSQSO_county1 = new Fl_Input2( xtmp, y3, fl_width("WWWWW"), Hentry, "Cnty"); inpSQSO_county1->align(FL_ALIGN_LEFT); inpSQSO_county1->tooltip(_("County received")); inpSQSO_county1->type(FL_NORMAL_INPUT); inpSQSO_county1->hide(); inpCounty = inpSQSO_county1; xtmp = rightof(inpSQSO_county1) + fl_width("xS#"); outSQSO_serno1 = new Fl_Input2( xtmp, y3, fl_width("9999"), Hentry, "S#"); outSQSO_serno1->align(FL_ALIGN_LEFT); outSQSO_serno1->tooltip(_("Sent serial number")); outSQSO_serno1->type(FL_NORMAL_INPUT); outSQSO_serno1->hide(); xtmp = rightof(outSQSO_serno1) + fl_width("xR#"); inpSQSO_serno1 = new Fl_Input2( xtmp, y3, fl_width("9999"), Hentry, "R#"); inpSQSO_serno1->align(FL_ALIGN_LEFT); inpSQSO_serno1->tooltip(_("Received serial number")); inpSQSO_serno1->type(FL_NORMAL_INPUT); inpSQSO_serno1->hide(); xtmp = rightof(inpSQSO_serno1) + fl_width("x Cat"); inpSQSO_category1 = new Fl_Input2( xtmp, y3, gSQSO->x() + gSQSO->w() - xtmp - pad, Hentry, "Cat"); inpSQSO_category1->tooltip(_("Category: CLB, MOB, QRP, STD")); inpSQSO_category1->type(FL_NORMAL_INPUT); inpSQSO_category1->hide(); inpSQSO_category = inpSQSO_category1; gSQSO->end(); gSQSO->hide(); } gWAE = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_WAE outSerNo_WAE1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "S #"); outSerNo_WAE1->align(FL_ALIGN_LEFT); outSerNo_WAE1->tooltip(_("Sent serno")); outSerNo_WAE1->type(FL_NORMAL_OUTPUT); inpSerNo_WAE1 = new Fl_Input2( rightof(outSerNo_WAE1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inpSerNo_WAE1->align(FL_ALIGN_LEFT); inpSerNo_WAE1->tooltip(_("Received serno")); inpSerNo_WAE1->type(FL_NORMAL_INPUT); // xtmp = rightof(inpSerNo_WAE1) + fl_width("xCntry"); // cboCountryWAE1 = new Fl_ComboBox( // xtmp, y3, // Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, // "Cntry"); // cboCountryWAE1->align(FL_ALIGN_LEFT); // cboCountryWAE1->tooltip(_("Country")); // cboCountryWAE1->end(); gWAE->end(); gWAE->hide(); } Logging_frame_1->resizable(NULL); Logging_frame_1->end(); } { // NFtabs groups // Logging frame 2 int nfx = rightof(Logging_frame_1) + pad; int nfy = Logging_frame_1->y(); int nfw = W - nfx - pad; int nfh = Logging_frame_1->h(); NFtabs = new Fl_Tabs(nfx, nfy, nfw, nfh, ""); int cax = nfx + pad; int caw = nfw - 2*pad; int cay = nfy + Hentry; int cah = nfh - Hentry; Ccframe = new Fl_Group(cax, cay, caw, cah, "Cnty/Cntry"); cboCountyQSO = new Fl_ComboBox( cax + pad, inpCall1->y(), caw - 2*pad, Hentry, ""); cboCountyQSO->tooltip(_("County")); cboCountyQSO->callback(cb_CountyQSO); cboCountyQSO->readonly(); cboCountyQSO->end(); cboCountryQSO = new Fl_ComboBox( cax + pad, inpQth->y(), caw - 2*pad, Hentry, ""); cboCountryQSO->tooltip(_("Country")); cboCountryQSO->readonly(); cboCountryQSO->end(); Ccframe->end(); NotesFrame = new Fl_Group(cax, cay, caw, cah,"Notes"); inpNotes = new Fl_Input2( cax + pad, cay + pad, caw-2*pad, cah-2*pad, ""); inpNotes->type(FL_MULTILINE_INPUT); inpNotes->tooltip(_("Notes")); NotesFrame->end(); NFtabs->end(); } // NFtabs end ifkp_avatar = new picture( W - 59 - pad, NFtabs->y(), 59, 74); ifkp_avatar->box(FL_FLAT_BOX); ifkp_avatar->noslant(); ifkp_avatar->callback(cb_ifkp_send_avatar); ifkp_avatar->tooltip(_("Left click - save avatar\nRight click - send my avatar")); ifkp_load_avatar(); ifkp_avatar->hide(); thor_avatar = new picture( W - 59 - pad, NFtabs->y(), 59, 74); thor_avatar->box(FL_FLAT_BOX); thor_avatar->noslant(); thor_avatar->callback(cb_thor_send_avatar); thor_avatar->tooltip(_("Left click - save avatar\nRight click - send my avatar")); thor_load_avatar(); thor_avatar->hide(); Logging_frame->end(); Logging_frame->resizable(NFtabs); // Logging_frame->resizable(Logging_frame_2); } rightframes->end(); } TopFrame1->resizable(rightframes); TopFrame1->end(); } TopFrame2 = new Fl_Group(0, TopFrame1->y(), W, Hentry + 2 * pad); { // TopFrame2 int y = TopFrame1->y() + pad; int h = Hentry; qsoFreqDisp2 = new cFreqControl( pad, y, freqwidth, freqheight, "10"); qsoFreqDisp2->box(FL_DOWN_BOX); qsoFreqDisp2->color(FL_BACKGROUND_COLOR); qsoFreqDisp2->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp2->labeltype(FL_NORMAL_LABEL); qsoFreqDisp2->align(FL_ALIGN_CENTER); qsoFreqDisp2->when(FL_WHEN_RELEASE); qsoFreqDisp2->callback(qso_movFreq); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp2->value(0); qso_opPICK2 = new Fl_Button( rightof(qsoFreqDisp2), y, Wbtn, Hentry); qso_opPICK2->align(FL_ALIGN_INSIDE); qso_opPICK2->image(addrbookpixmap); qso_opPICK2->callback(showOpBrowserView2, 0); qso_opPICK2->tooltip(_("Open List")); btnQRZ2 = new Fl_Button( pad + rightof(qso_opPICK2), y, Wbtn, Hentry); btnQRZ2->align(FL_ALIGN_INSIDE); btnQRZ2->image(new Fl_Pixmap(net_icon)); btnQRZ2->callback(cb_QRZ, 0); btnQRZ2->tooltip(_("QRZ")); qsoClear2 = new Fl_Button( pad + rightof(btnQRZ2), y, Wbtn, Hentry); qsoClear2->align(FL_ALIGN_INSIDE); qsoClear2->image(new Fl_Pixmap(edit_clear_icon)); qsoClear2->callback(qsoClear_cb, 0); qsoClear2->tooltip(_("Clear")); qsoSave2 = new Fl_Button( pad + rightof(qsoClear2), y, Wbtn, Hentry); qsoSave2->align(FL_ALIGN_INSIDE); qsoSave2->image(new Fl_Pixmap(save_icon)); qsoSave2->callback(qsoSave_cb, 0); qsoSave2->tooltip(_("Save")); const char *label2 = _("On"); btnTimeOn2 = new Fl_Button( pad + rightof(qsoSave2), y, static_cast(fl_width(label2)), h, label2); btnTimeOn2->tooltip(_("Press to update")); btnTimeOn2->callback(cb_btnTimeOn); inpTimeOn2 = new Fl_Input2( pad + btnTimeOn2->x() + btnTimeOn2->w(), y, w_inpTime2, h, ""); inpTimeOn2->tooltip(_("Time On")); inpTimeOn2->type(FL_INT_INPUT); const char *label3 = _("Off"); Fl_Box *bx3 = new Fl_Box(pad + rightof(inpTimeOn2), y, static_cast(fl_width(label3)), h, label3); inpTimeOff2 = new Fl_Input2( pad + bx3->x() + bx3->w(), y, w_inpTime2, h, ""); inpTimeOff2->tooltip(_("Time Off")); inpTimeOff2->type(FL_NORMAL_OUTPUT); const char *label4 = _("Call"); Fl_Box *bx4 = new Fl_Box(pad + rightof(inpTimeOff2), y, static_cast(fl_width(label4)), h, label4); inpCall2 = new Fl_Input2( pad + bx4->x() + bx4->w(), y, w_inpCall2, h, ""); inpCall2->tooltip(_("Other call")); const char *label6 = _("In"); Fl_Box *bx6 = new Fl_Box(pad + rightof(inpCall2), y, static_cast(fl_width(label6)), h, label6); inpRstIn2 = new Fl_Input2( pad + bx6->x() + bx6->w(), y, w_inpRstIn2, h, ""); inpRstIn2->tooltip(_("Received RST")); const char *label7 = _("Out"); Fl_Box *bx7 = new Fl_Box(pad + rightof(inpRstIn2), y, static_cast(fl_width(label7)), h, label7); inpRstOut2 = new Fl_Input2( pad + bx7->x() + bx7->w(), y, w_inpRstOut2, h, ""); inpRstOut2->tooltip(_("Sent RST")); const char *label5 = _("Nm"); Fl_Box *bx5 = new Fl_Box(pad + rightof(inpRstOut2), y, static_cast(fl_width(label5)), h, label5); int xn = pad + bx5->x() + bx5->w(); inpName2 = new Fl_Input2( xn, y, W - xn - pad, h, ""); inpName2->tooltip(_("Other name")); TopFrame2->resizable(inpName2); TopFrame2->end(); TopFrame2->hide(); } TopFrame3 = new Fl_Group(0, TopFrame1->y(), W, Hentry + 2 * pad); { // TopFrame3 int y = TopFrame3->y() + pad; int h = Hentry; fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); const char *xData = "x8888"; const char *xCall = "xWW8WWW"; const char *xRST = "x599"; int wData = static_cast(fl_width(xData)); int wCall = static_cast(fl_width(xCall)); int wRST = static_cast(fl_width(xRST)); int w3a = pad + freqwidth + 3*(pad + Wbtn) + fl_width("xCall") + wCall; // Top Frame 3a // freqdisp, oppick, qsoclear, qsosave, call TopFrame3a = new Fl_Group( 0, TopFrame1->y(), w3a, Hentry,""); qsoFreqDisp3 = new cFreqControl( pad, y, freqwidth, freqheight, "10"); qsoFreqDisp3->box(FL_DOWN_BOX); qsoFreqDisp3->color(FL_BACKGROUND_COLOR); qsoFreqDisp3->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp3->labeltype(FL_NORMAL_LABEL); qsoFreqDisp3->align(FL_ALIGN_CENTER); qsoFreqDisp3->when(FL_WHEN_RELEASE); qsoFreqDisp3->callback(qso_movFreq); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp3->value(0); qso_opPICK3 = new Fl_Button( pad + rightof(qsoFreqDisp3), y, Wbtn, Hentry); qso_opPICK3->align(FL_ALIGN_INSIDE); qso_opPICK3->image(addrbookpixmap); qso_opPICK3->callback(showOpBrowserView2, 0); qso_opPICK3->tooltip(_("Open List")); qsoClear3 = new Fl_Button( pad + rightof(qso_opPICK3), y, Wbtn, Hentry); qsoClear3->align(FL_ALIGN_INSIDE); qsoClear3->image(new Fl_Pixmap(edit_clear_icon)); qsoClear3->callback(qsoClear_cb, 0); qsoClear3->tooltip(_("Clear")); qsoSave3 = new Fl_Button( pad + rightof(qsoClear3), y, Wbtn, Hentry); qsoSave3->align(FL_ALIGN_INSIDE); qsoSave3->image(new Fl_Pixmap(save_icon)); qsoSave3->callback(qsoSave_cb, 0); qsoSave3->tooltip(_("Save")); inpCall3 = new Fl_Input2( rightof(qsoSave3) + fl_width("Call"), y, wCall, h, "Call"); inpCall3->align(FL_ALIGN_LEFT); inpCall3->tooltip(_("Other call")); TopFrame3a->end(); TopFrame3b = new Fl_Group( rightof(TopFrame3a), TopFrame1->y(), W - rightof(TopFrame3a), Hentry,""); // LOG_GENERIC - partial log_generic_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); btnTimeOn3 = new Fl_Button( rightof(inpCall3) + pad, y, h, h, "On"); btnTimeOn3->tooltip(_("Press to update")); btnTimeOn3->callback(cb_btnTimeOn); inpTimeOn3 = new Fl_Input2( rightof(btnTimeOn3) + pad, y, wData, h, ""); inpTimeOn3->tooltip(_("Time On")); inpTimeOn3->type(FL_INT_INPUT); inpTimeOff3 = new Fl_Input2( rightof(inpTimeOn3) + fl_width("xOff"), y, wData, h, "Off"); inpTimeOff3->tooltip(_("Time Off")); inpTimeOff3->type(FL_NORMAL_OUTPUT); inpSerNo2 = new Fl_Input2( rightof(inpTimeOff3) + fl_width("xR#"), y, wData, h, "R#"); inpSerNo2->align(FL_ALIGN_LEFT); inpSerNo2->tooltip(_("Received serial number")); outSerNo2 = new Fl_Input2( rightof(inpSerNo2) + fl_width("xS#"), y, wData, h, "S#"); outSerNo2->align(FL_ALIGN_LEFT); outSerNo2->tooltip(_("Sent serial number (read only)")); inpXchgIn2 = new Fl_Input2( rightof(outSerNo2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(outSerNo2) + fl_width("xXchg"))- pad, h, "Xch"); inpXchgIn2->align(FL_ALIGN_LEFT); inpXchgIn2->tooltip(_("Contest exchange in")); Fl_Box lgf_box(rightof(inpXchgIn2), y, pad, h,""); lgf_box.box(FL_FLAT_BOX); log_generic_frame->end(); log_generic_frame->hide(); log_generic_frame->resizable(lgf_box); // end LOG_GENERIC - partial // LOG_FD - partial log_fd_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); btnTimeOn4 = new Fl_Button( rightof(inpCall3) + pad, y, h, h, "On"); btnTimeOn4->tooltip(_("Press to update")); btnTimeOn4->callback(cb_btnTimeOn); inpTimeOn4 = new Fl_Input2( rightof(btnTimeOn4) + pad, y, wData, h, ""); inpTimeOn4->tooltip(_("Time On")); inpTimeOn4->type(FL_INT_INPUT); inpTimeOff4 = new Fl_Input2( rightof(inpTimeOn4) + fl_width("xOff"), y, wData, h, "Off"); inpTimeOff4->tooltip(_("Time Off")); inpTimeOff4->type(FL_NORMAL_OUTPUT); inp_FD_class2 = new Fl_Input2( rightof(inpTimeOff4) + fl_width("xClass"), y, wData, h, " Class"); inp_FD_class2->align(FL_ALIGN_LEFT); inp_FD_class2->tooltip(_("Received FD class")); inp_FD_class2->type(FL_NORMAL_INPUT); inp_FD_section2 = new Fl_Input2( rightof(inp_FD_class2) + fl_width("xSect") - pad, y, wData, h, "Sect"); inp_FD_section2->align(FL_ALIGN_LEFT); inp_FD_section2->tooltip(_("Received FD section")); inp_FD_section2->type(FL_NORMAL_INPUT); Fl_Box lfd_box(rightof(inp_FD_section2), y, pad, h,""); lfd_box.box(FL_FLAT_BOX); log_fd_frame->end(); log_fd_frame->hide(); log_fd_frame->resizable(lfd_box); // end LOG_FD - partial // LOG_KD - partial log_kd_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_KD_name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xNam"), y, 70, h, "Nam"); inp_KD_name2->align(FL_ALIGN_LEFT); inp_KD_name2->tooltip("Guest operator"); inp_KD_name2->type(FL_NORMAL_INPUT); inp_KD_age2 = new Fl_Input2( rightof(inp_KD_name2) + fl_width("xAge"), y, wData, h, "Age"); inp_KD_age2->align(FL_ALIGN_LEFT); inp_KD_age2->tooltip(_("Guest operators age")); inp_KD_age2->type(FL_NORMAL_INPUT); inp_KD_state2 = new Fl_Input2( rightof(inp_KD_age2) + fl_width("xSt"), y, 40, h, "St"); inp_KD_state2->align(FL_ALIGN_LEFT); inp_KD_state2->tooltip(_("Station state")); inp_KD_state2->type(FL_NORMAL_INPUT); inp_KD_VEprov2 = new Fl_Input2( rightof(inp_KD_state2) + fl_width("xPr"), y, 40, h, "Pr"); inp_KD_VEprov2->align(FL_ALIGN_LEFT); inp_KD_VEprov2->tooltip(_("Station province")); inp_KD_VEprov2->type(FL_NORMAL_INPUT); inp_KD_XchgIn2 = new Fl_Input2( rightof(inp_KD_VEprov2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(inp_KD_state2) + fl_width("xXch")) - pad, h, "Xch"); inp_KD_XchgIn2->align(FL_ALIGN_LEFT); inp_KD_XchgIn2->tooltip(_("Special Kids Day Special Exchange")); inp_KD_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box lkd_box(rightof(inp_KD_XchgIn2), y, pad, h,""); lkd_box.box(FL_FLAT_BOX); log_kd_frame->end(); log_kd_frame->hide(); log_kd_frame->resizable(lkd_box); // end LOG_KD -partial // LOG_1010 - partial log_1010_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_1010_name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xOp"), y, 80, h, "Op"); inp_1010_name2->align(FL_ALIGN_LEFT); inp_1010_name2->tooltip("Operator's name"); inp_1010_name2->type(FL_NORMAL_INPUT); inp_1010_nr2 = new Fl_Input2( rightof(inp_1010_name2) + fl_width("x1010"), y, wData, h, "1010"); inp_1010_nr2->align(FL_ALIGN_LEFT); inp_1010_nr2->tooltip(_("1010 number")); inp_1010_nr2->type(FL_NORMAL_INPUT); inp_1010_XchgIn2 = new Fl_Input2( rightof(inp_1010_nr2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(inp_1010_nr2) + fl_width("xXch")) - pad, h, "Xch"); inp_1010_XchgIn2->align(FL_ALIGN_LEFT); inp_1010_XchgIn2->tooltip(_("1010 Exchange")); inp_1010_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box l1010_box(rightof(inp_1010_XchgIn2), y, pad, h,""); l1010_box.box(FL_FLAT_BOX); log_1010_frame->end(); log_1010_frame->hide(); log_1010_frame->resizable(l1010_box); // end LOG_1010 -partial // LOG_ARR - partial log_arr_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_ARR_Name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xNam"), y, 80, h, "Nam"); inp_ARR_Name2->align(FL_ALIGN_LEFT); inp_ARR_Name2->tooltip("Operator's name"); inp_ARR_Name2->type(FL_NORMAL_INPUT); inp_ARR_check2 = new Fl_Input2( rightof(inp_ARR_Name2) + fl_width("xChk"), y, 40, h, "Chk"); inp_ARR_check2->align(FL_ALIGN_LEFT); inp_ARR_check2->tooltip(_("Check / birth-year")); inp_ARR_check2->type(FL_NORMAL_INPUT); inp_ARR_XchgIn2 = new Fl_Input2( rightof(inp_ARR_check2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(inp_ARR_check2) + fl_width("xXch")) - pad, Hentry, "Xch"); inp_ARR_XchgIn2->align(FL_ALIGN_LEFT); inp_ARR_XchgIn2->tooltip(_("Round Up Exchange")); inp_ARR_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box larr_box(rightof(inp_ARR_XchgIn2), y, pad, h,""); larr_box.box(FL_FLAT_BOX); log_arr_frame->end(); log_arr_frame->hide(); log_arr_frame->resizable(larr_box); // end LOG_ARR - partial // LOG_VHF - partial log_vhf_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_vhf_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inp_vhf_RSTin2->align(FL_ALIGN_LEFT); inp_vhf_RSTin2->tooltip(_("Received RST")); inp_vhf_RSTin2->type(FL_NORMAL_INPUT); inp_vhf_RSTout2 = new Fl_Input2( rightof(inp_vhf_RSTin2) + fl_width("xOut"), y, wRST, h, "Out"); inp_vhf_RSTout2->align(FL_ALIGN_LEFT); inp_vhf_RSTout2->tooltip(_("Sent RST")); inp_vhf_RSTout2->type(FL_NORMAL_INPUT); inp_vhf_Loc2 = new Fl_Input2( rightof(inp_vhf_RSTout2) + fl_width("xGr")- pad, y, 80, h, "Gr"); inp_vhf_Loc2->align(FL_ALIGN_LEFT); inp_vhf_Loc2->tooltip(_("Grid Locator")); inp_vhf_Loc2->type(FL_NORMAL_INPUT); Fl_Box lvhf_box(rightof(inp_vhf_Loc2), y, pad, h,""); lvhf_box.box(FL_FLAT_BOX); log_vhf_frame->end(); log_vhf_frame->hide(); log_vhf_frame->resizable(lvhf_box); // end LOG_VHF - partial // LOG_CQWW_DX - partial log_cqww_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_CQDX_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inp_CQDX_RSTin2->align(FL_ALIGN_LEFT); inp_CQDX_RSTin2->tooltip(_("Received RST")); inp_CQDX_RSTin2->type(FL_NORMAL_INPUT); inp_CQDX_RSTout2 = new Fl_Input2( rightof(inp_CQDX_RSTin2) + fl_width("xOut"), y, wRST, h, "Out"); inp_CQDX_RSTout2->align(FL_ALIGN_LEFT); inp_CQDX_RSTout2->tooltip(_("Sent RST")); inp_CQDX_RSTout2->type(FL_NORMAL_INPUT); inp_CQDXzone2 = new Fl_Input2( rightof(inp_CQDX_RSTout2) + fl_width("xCQz"), y, 40, h, "CQz"); inp_CQDXzone2->align(FL_ALIGN_LEFT); inp_CQDXzone2->tooltip(_("Received CQ zone")); inp_CQDXzone2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_CQDXzone2) + fl_width("xCQc"); cboCountryCQDX2 = new Fl_ComboBox( xtmp, y, fl_digi_main->w() - xtmp - pad, Hentry, "CQc"); cboCountryCQDX2->align(FL_ALIGN_LEFT); cboCountryCQDX2->tooltip(_("Received CQ country")); cboCountryCQDX2->end(); Fl_Box lcqdx_box(rightof(cboCountryCQDX2), y, pad, h,""); lcqdx_box.box(FL_FLAT_BOX); log_cqww_frame->end(); log_cqww_frame->hide(); log_cqww_frame->resizable(lcqdx_box); // end LOG_CQWW_DX - partial // LOG_CQWW_RTTY - partial log_cqww_rtty_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_CQ_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inp_CQ_RSTin2->align(FL_ALIGN_LEFT); inp_CQ_RSTin2->tooltip(_("Received RST")); inp_CQ_RSTin2->type(FL_NORMAL_INPUT); inp_CQ_RSTout2 = new Fl_Input2( rightof(inp_CQ_RSTin2) + fl_width("xOut"), y, wRST, h, "Out"); inp_CQ_RSTout2->align(FL_ALIGN_LEFT); inp_CQ_RSTout2->tooltip(_("Sent RST")); inp_CQ_RSTout2->type(FL_NORMAL_INPUT); inp_CQzone2 = new Fl_Input2( rightof(inp_CQ_RSTout2) + fl_width("xCQz"), y, 40, h, "CQz"); inp_CQzone2->align(FL_ALIGN_LEFT); inp_CQzone2->tooltip(_("Received CQ zone")); inp_CQzone2->type(FL_NORMAL_INPUT); inp_CQstate2 = new Fl_Input2( rightof(inp_CQzone2) + fl_width("xCQst"), y, 40, h, "CQst"); inp_CQstate2->align(FL_ALIGN_LEFT); inp_CQstate2->tooltip(_("Received CQ State/Prov")); inp_CQstate2->type(FL_NORMAL_INPUT); cboCountryCQ2 = new Fl_ComboBox( rightof(inp_CQstate2) + fl_width("xCQc"), y, fl_digi_main->w() - (rightof(inp_CQstate2) + fl_width("xCQc")) - pad, Hentry, "CQc"); cboCountryCQ2->align(FL_ALIGN_LEFT); cboCountryCQ2->tooltip(_("Received CQ country")); cboCountryCQ2->end(); Fl_Box lcq_box(rightof(cboCountryCQ2), y, pad, h,""); lcq_box.box(FL_FLAT_BOX); log_cqww_rtty_frame->end(); log_cqww_rtty_frame->hide(); log_cqww_rtty_frame->resizable(lcq_box); // end LOG_CQWW_RTTY - partial // LOG CWSS - partial log_cqss_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); outSerNo4 = new Fl_Input2( rightof(inpCall3) + fl_width("xS#"), y, 40, h, "S#"); outSerNo4->align(FL_ALIGN_LEFT); outSerNo4->tooltip(_("Sent serno")); outSerNo4->type(FL_NORMAL_OUTPUT); inp_SS_SerialNoR2 = new Fl_Input2( rightof(outSerNo4) + fl_width("xR#"), y, 40, Hentry, "R#"); inp_SS_SerialNoR2->align(FL_ALIGN_LEFT); inp_SS_SerialNoR2->tooltip(_("Received serno")); inp_SS_SerialNoR2->type(FL_NORMAL_INPUT); inp_SS_Precedence2 = new Fl_Input2( rightof(inp_SS_SerialNoR2) + fl_width("xPre"), y, 40, Hentry, "Pre"); inp_SS_Precedence2->align(FL_ALIGN_LEFT); inp_SS_Precedence2->tooltip(_("SS Precedence")); inp_SS_Precedence2->type(FL_NORMAL_INPUT); inp_SS_Check2 = new Fl_Input2( rightof(inp_SS_Precedence2) + fl_width("xChk"), y, 40, Hentry, "Chk"); inp_SS_Check2->align(FL_ALIGN_LEFT); inp_SS_Check2->tooltip(_("SS Check")); inp_SS_Check2->type(FL_NORMAL_INPUT); inp_SS_Section2 = new Fl_Input2( rightof(inp_SS_Check2) + fl_width("xSec"), y, 40, Hentry, "Sec"); inp_SS_Section2->align(FL_ALIGN_LEFT); inp_SS_Section2->tooltip(_("SS section")); inp_SS_Section2->type(FL_NORMAL_INPUT); Fl_Box lss_box(rightof(inp_SS_Section2), y, pad, h,""); lss_box.box(FL_FLAT_BOX); log_cqss_frame->end(); log_cqss_frame->hide(); log_cqss_frame->resizable(lss_box); // end LOG CWSS - partial // LOG_CQWPX - partial log_cqwpx_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inpRstIn_WPX2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inpRstIn_WPX2->align(FL_ALIGN_LEFT); inpRstIn_WPX2->tooltip(_("Received RST")); inpRstIn_WPX2->type(FL_NORMAL_INPUT); inpRstOut_WPX2 = new Fl_Input2( rightof(inpRstIn_WPX2) + fl_width("xOut"), y, wRST, h, "Out"); inpRstOut_WPX2->align(FL_ALIGN_LEFT); inpRstOut_WPX2->tooltip(_("Sent RST")); inpRstOut_WPX2->type(FL_NORMAL_INPUT); outSerNo_WPX2 = new Fl_Input2( rightof(inpRstOut_WPX2) + fl_width("xS#"), y, 40, h, "S#"); outSerNo_WPX2->align(FL_ALIGN_LEFT); outSerNo_WPX2->tooltip(_("Sent serial number")); outSerNo_WPX2->type(FL_NORMAL_INPUT); inpSerNo_WPX2 = new Fl_Input2( rightof(outSerNo_WPX2) + fl_width("xR#") - pad, y, 40, h, "R#"); inpSerNo_WPX2->align(FL_ALIGN_LEFT); inpSerNo_WPX2->tooltip(_("Received serial number")); inpSerNo_WPX2->type(FL_NORMAL_INPUT); Fl_Box lwpx_box(rightof(inpSerNo_WPX2), y, pad, h,""); lwpx_box.box(FL_FLAT_BOX); log_cqwpx_frame->end(); log_cqwpx_frame->hide(); log_cqwpx_frame->resizable(lwpx_box); // end LOG_CQWPX - partial // LOG_ASCR - partial log_ascr_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_ASCR_name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xNam"), y, 80, h, "Nam"); inp_ASCR_name2->align(FL_ALIGN_LEFT); inp_ASCR_name2->tooltip(_("Rcvd name")); inp_ASCR_name2->type(FL_NORMAL_INPUT); inp_ASCR_RSTin2 = new Fl_Input2( rightof(inp_ASCR_name2) + fl_width("xIn"), y, wRST, Hentry, "In"); inp_ASCR_RSTin2->align(FL_ALIGN_LEFT); inp_ASCR_RSTin2->tooltip(_("Received RST")); inp_ASCR_RSTin2->type(FL_NORMAL_INPUT); inp_ASCR_RSTout2 = new Fl_Input2( rightof(inp_ASCR_RSTin2) + fl_width("xOut"), y, wRST, Hentry, "Out"); inp_ASCR_RSTout2->align(FL_ALIGN_LEFT); inp_ASCR_RSTout2->tooltip(_("Sent RST")); inp_ASCR_RSTout2->type(FL_NORMAL_INPUT); inp_ASCR_class2 = new Fl_Input2( rightof(inp_ASCR_RSTout2) + fl_width("xClass"), y, 30, Hentry, "Class"); inp_ASCR_class2->align(FL_ALIGN_LEFT); inp_ASCR_class2->tooltip(_("ASCR class")); inp_ASCR_class2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_ASCR_class2) + fl_width("xSPC"); inp_ASCR_XchgIn2 = new Fl_Input2( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "SPC"); inp_ASCR_XchgIn2->align(FL_ALIGN_LEFT); inp_ASCR_XchgIn2->tooltip(_("State/Province/Country received")); inp_ASCR_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box lascr_box(rightof(inp_ASCR_XchgIn2), y, pad, h,""); lascr_box.box(FL_FLAT_BOX); log_ascr_frame->end(); log_ascr_frame->hide(); log_ascr_frame->resizable(lascr_box); // end LOG_ASCR - partial // LOG_NAQP - partial log_naqp_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); btnTimeOn5 = new Fl_Button( rightof(inpCall3) + pad, y, h, h, "On"); btnTimeOn5->tooltip(_("Press to update")); btnTimeOn5->callback(cb_btnTimeOn); inpTimeOn5 = new Fl_Input2( rightof(btnTimeOn3) + pad, y, wData, h, ""); inpTimeOn5->tooltip(_("Time On")); inpTimeOn5->type(FL_INT_INPUT); inpTimeOff5 = new Fl_Input2( rightof(inpTimeOn5) + fl_width("xOff"), y, wData, h, "Off"); inpTimeOff5->tooltip(_("Time Off")); inpTimeOff5->type(FL_NORMAL_OUTPUT); inpNAQPname2 = new Fl_Input2( rightof(inpTimeOff5) + fl_width("xNam"), y, 100, h, "Nam"); inpNAQPname2->align(FL_ALIGN_LEFT); inpNAQPname2->tooltip(_("Received operator name")); inpNAQPname2->type(FL_NORMAL_INPUT); inpSPCnum_NAQP2 = new Fl_Input2( rightof(inpNAQPname2) + fl_width("xXch"), y, 80, h, "Xch"); inpSPCnum_NAQP2->align(FL_ALIGN_LEFT); inpSPCnum_NAQP2->tooltip(_("Received State/Province/Country")); inpSPCnum_NAQP2->type(FL_NORMAL_INPUT); Fl_Box lnaqp_box(rightof(inpSPCnum_NAQP2), y, pad, h,""); lnaqp_box.box(FL_FLAT_BOX); log_naqp_frame->end(); log_naqp_frame->hide(); log_naqp_frame->resizable(lnaqp_box); // LOG_NAQP - partial // LOG_RTTY - partial log_rtty_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inpRTU_stpr2 = new Fl_Input2( rightof(inpCall3) + fl_width("xS/P"), y, fl_width("xWW"), Hentry, "S/P"); inpRTU_stpr2->align(FL_ALIGN_LEFT); inpRTU_stpr2->tooltip(_("State/Province")); inpRTU_stpr2->type(FL_NORMAL_INPUT); inpRTU_serno2 = new Fl_Input2( rightof(inpRTU_stpr2) + fl_width("xSer"), y, fl_width("x9999"), Hentry, "Ser"); inpRTU_serno2->align(FL_ALIGN_LEFT); inpRTU_serno2->tooltip(_("Serial number received")); inpRTU_serno2->type(FL_NORMAL_INPUT); inpRTU_RSTin2 = new Fl_Input2( rightof(inpRTU_serno2) + fl_width("xR"), y, wRST, Hentry, "R"); inpRTU_RSTin2->align(FL_ALIGN_LEFT); inpRTU_RSTin2->tooltip("Received RST"); inpRTU_RSTin2->type(FL_NORMAL_INPUT); inpRTU_RSTout2 = new Fl_Input2( rightof(inpRTU_RSTin2) + fl_width("xS"), y, wRST, Hentry, "S"); inpRTU_RSTout2->align(FL_ALIGN_LEFT); inpRTU_RSTout2->tooltip("Sent RST"); inpRTU_RSTout2->type(FL_NORMAL_INPUT); xtmp = rightof(inpRTU_RSTout2) + fl_width("xCntry"); cboCountryRTU2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryRTU2->align(FL_ALIGN_LEFT); cboCountryRTU2->tooltip(_("Country")); cboCountryRTU2->end(); log_rtty_frame->end(); log_rtty_frame->hide(); log_rtty_frame->resizable(cboCountryRTU2); // end LOG_RTTY - partial // LOG_IARI - partial log_iari_frame = new Fl_Group( rightof(TopFrame3a), TopFrame1->y(), W - rightof(TopFrame3a), Hentry,""); inp_IARI_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("In"), y, wRST, h, "In"); inp_IARI_RSTin2->align(FL_ALIGN_LEFT); inp_IARI_RSTin2->tooltip(_("Received RST")); inp_IARI_RSTin2->type(FL_NORMAL_INPUT); inp_IARI_RSTout2 = new Fl_Input2( rightof(inp_IARI_RSTin2) + fl_width("Out"), y, wRST, h, "Out"); inp_IARI_RSTout2->align(FL_ALIGN_LEFT); inp_IARI_RSTout2->tooltip(_("Sent RST")); inp_IARI_RSTout2->type(FL_NORMAL_INPUT); inp_IARI_PR2 = new Fl_Input2( rightof(inp_IARI_RSTout2) + fl_width("xPr"), y, fl_width("WW"), Hentry, "Pr"); inp_IARI_PR2->align(FL_ALIGN_LEFT); inp_IARI_PR2->tooltip(_("Received IARI Province")); inp_IARI_PR2->type(FL_NORMAL_INPUT); out_IARI_SerNo2 = new Fl_Input2( rightof(inp_IARI_PR2) + fl_width("S#"), y, wRST, Hentry, "S#"); out_IARI_SerNo2->align(FL_ALIGN_LEFT); out_IARI_SerNo2->tooltip(_("Sent serno")); out_IARI_SerNo2->type(FL_NORMAL_OUTPUT); inp_IARI_SerNo2 = new Fl_Input2( rightof(out_IARI_SerNo2) + fl_width("R#"), y, wRST, Hentry, "R#"); inp_IARI_SerNo2->align(FL_ALIGN_LEFT); inp_IARI_SerNo2->tooltip(_("Received serno")); inp_IARI_SerNo2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_IARI_SerNo2) + fl_width("Cntry"); cboCountryIARI2 = new Fl_ComboBox( xtmp, y, fl_digi_main->w() - xtmp - pad, Hentry, "Cntry"); cboCountryIARI2->align(FL_ALIGN_LEFT); cboCountryIARI2->tooltip(_("Received IARI country")); cboCountryIARI2->end(); Fl_Box liari_box(rightof(cboCountryIARI2), y, pad, h,""); liari_box.box(FL_FLAT_BOX); log_iari_frame->end(); log_iari_frame->hide(); log_iari_frame->resizable(liari_box); // end LOG_IARI - partial // LOG_NAS - partial log_nas_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); outSerNo6 = new Fl_Input2( rightof(inpCall3) + fl_width("xS#"), y, 40, h, "S#"); outSerNo6->align(FL_ALIGN_LEFT); outSerNo6->tooltip(_("Sent serial number")); outSerNo6->type(FL_NORMAL_OUTPUT); inp_ser_NAS2 = new Fl_Input2( rightof(outSerNo6) + fl_width("xR#"), y, 40, Hentry, "R#"); inp_ser_NAS2->align(FL_ALIGN_LEFT); inp_ser_NAS2->tooltip(_("Received serno")); inp_ser_NAS2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_ser_NAS2) + fl_width("xS/P/C"); inpSPCnum_NAS2 = new Fl_Input2( xtmp, y, 80, Hentry, "S/P/C"); inpSPCnum_NAS2->align(FL_ALIGN_LEFT); inpSPCnum_NAS2->tooltip(_("Received State/Province/Country")); inpSPCnum_NAS2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSPCnum_NAS2) + fl_width("xNm"); inp_name_NAS2 = new Fl_Input2( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Nm"); inp_name_NAS2->align(FL_ALIGN_LEFT); inp_name_NAS2->tooltip(_("Name")); inp_name_NAS2->type(FL_NORMAL_INPUT); Fl_Box lnas_box(rightof(inp_name_NAS2), y, pad, h,""); lnas_box.box(FL_FLAT_BOX); log_nas_frame->end(); log_nas_frame->hide(); log_nas_frame->resizable(lnas_box); // end LOG_NAS - partial // LOG_AIDX - partial log_aidx_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); outSerNo8 = new Fl_Input2( rightof(inpCall3) + fl_width("xS#"), y, 40, Hentry, "S#"); outSerNo8->align(FL_ALIGN_LEFT); outSerNo8->tooltip(_("Sent serial number")); outSerNo8->type(FL_NORMAL_OUTPUT); inpSerNo4 = new Fl_Input2( rightof(outSerNo8) + fl_width("xR#"), y, 40, Hentry, "R#"); inpSerNo4->align(FL_ALIGN_LEFT); inpSerNo4->tooltip(_("Received serial number")); inpSerNo4->type(FL_NORMAL_INPUT); xtmp = rightof(inpSerNo4) + fl_width("xIn"); inpRstIn3 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn3->align(FL_ALIGN_LEFT); inpRstIn3->tooltip(_("Received RST")); inpRstIn3->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstIn3) + fl_width("xOut"); inpRstOut3 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut3->align(FL_ALIGN_LEFT); inpRstOut3->tooltip(_("Sent RST")); inpRstOut3->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstOut3) + fl_width("xCntry"); cboCountryAIDX2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryAIDX2->align(FL_ALIGN_LEFT); cboCountryAIDX2->tooltip(_("Received Country")); cboCountryAIDX2->end(); Fl_Box laam_box(rightof(cboCountryAIDX2), y, pad, h,""); laam_box.box(FL_FLAT_BOX); log_aidx_frame->end(); log_aidx_frame->hide(); log_aidx_frame->resizable(laam_box); // end LOG_AIDX - partial // LOG_JOTA - partial log_jota_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); xtmp = rightof(inpCall3) + fl_width("xIn"); inpRstIn4 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn4->align(FL_ALIGN_LEFT); inpRstIn4->tooltip(_("Received RST")); inpRstIn4->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstIn4) + fl_width("xOut"); inpRstOut4 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut4->align(FL_ALIGN_LEFT); inpRstOut4->tooltip(_("Sent RST")); inpRstOut4->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstOut4) + fl_width("xSc"); inp_JOTA_troop2 = new Fl_Input2( xtmp, y, 50, Hentry, "Tp"); inp_JOTA_troop2->align(FL_ALIGN_LEFT); inp_JOTA_troop2->tooltip(_("Received troop number")); inp_JOTA_troop2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_JOTA_troop2) + fl_width("xTNm"); inp_JOTA_scout2 = new Fl_Input2( xtmp, y, 80, Hentry, "Nm"); inp_JOTA_scout2->align(FL_ALIGN_LEFT); inp_JOTA_scout2->tooltip(_("Received scout name")); inp_JOTA_scout2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_JOTA_scout2) + fl_width("xSPC"); inp_JOTA_spc2 = new Fl_Input2( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "SPC"); inp_JOTA_spc2->align(FL_ALIGN_LEFT); inp_JOTA_spc2->tooltip(_("State/Province,Country received")); inp_JOTA_spc2->type(FL_NORMAL_INPUT); Fl_Box ljota_box(rightof(inp_JOTA_spc2), y, pad, h,""); ljota_box.box(FL_FLAT_BOX); log_jota_frame->end(); log_jota_frame->hide(); log_jota_frame->resizable(ljota_box); // LOG_JOTA - partial // LOG_AICW - partial log_aicw_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); xtmp = rightof(inpCall3) + fl_width("xIn"); inpRstIn_AICW2 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn_AICW2->align(FL_ALIGN_LEFT); inpRstIn_AICW2->tooltip(_("Received RST")); inpRstIn_AICW2->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstIn_AICW2) + fl_width("xOut"); inpRstOut_AICW2 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut_AICW2->align(FL_ALIGN_LEFT); inpRstOut_AICW2->tooltip(_("Sent RST")); inpRstOut_AICW2->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstOut_AICW2) + fl_width("xPwr-R"); inpSPCnum_AICW2 = new Fl_Input2( xtmp, y, 50, Hentry, "Pwr-R"); inpSPCnum_AICW2->align(FL_ALIGN_LEFT); inpSPCnum_AICW2->tooltip(_("Received power")); inpSPCnum_AICW2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSPCnum_AICW2) + fl_width("xCntry"); cboCountryAICW2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryAICW2->align(FL_ALIGN_LEFT); cboCountryAICW2->tooltip(_("Country received")); cboCountryAICW2->end(); Fl_Box laicw_box(rightof(cboCountryAICW2), y, pad, h,""); laicw_box.box(FL_FLAT_BOX); log_aicw_frame->end(); log_aicw_frame->hide(); log_aicw_frame->resizable(laicw_box); // LOG_AICW - partial // LOG_SQSO - partial log_sqso_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); xtmp = rightof(inpCall3) + fl_width("St"); inpSQSO_state2 = new Fl_Input2( xtmp, y, 35, Hentry, "St"); inpSQSO_state2->align(FL_ALIGN_LEFT); inpSQSO_state2->tooltip(_("State")); inpSQSO_state2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSQSO_state2) + fl_width("Co"); inpSQSO_county2 = new Fl_Input2( xtmp, y, 50, Hentry, "Cy"); inpSQSO_county2->align(FL_ALIGN_LEFT); inpSQSO_county2->tooltip(_("County")); inpSQSO_county2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSQSO_county2) + fl_width("Ca"); inpSQSO_category2 = new Fl_Input2( xtmp, y , 40, Hentry, "Cat"); inpSQSO_category2->align(FL_ALIGN_LEFT); inpSQSO_category2->tooltip(_("Category: CLB, MOB, QRP, STD")); inpSQSO_category2->type(FL_NORMAL_INPUT); inpSQSO_category2->hide(); xtmp = rightof(inpSQSO_county2) + fl_width("In"); inpRstIn_SQSO2 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn_SQSO2->align(FL_ALIGN_LEFT); inpRstIn_SQSO2->tooltip(_("Received RST")); inpRstIn_SQSO2->type(FL_NORMAL_INPUT); inpRstIn_SQSO2->hide(); xtmp = rightof(inpRstIn_SQSO2) + fl_width("Out"); inpRstOut_SQSO2 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut_SQSO2->align(FL_ALIGN_LEFT); inpRstOut_SQSO2->tooltip(_("Sent RST")); inpRstOut_SQSO2->type(FL_NORMAL_INPUT); inpRstOut_SQSO2->hide(); xtmp = rightof(inpRstOut_SQSO2) + fl_width("S#"); outSQSO_serno2 = new Fl_Input2( xtmp, y, 30, Hentry, "S#"); outSQSO_serno2->align(FL_ALIGN_LEFT); outSQSO_serno2->tooltip(_("Sent serial number")); outSQSO_serno2->type(FL_NORMAL_INPUT); outSQSO_serno2->hide(); xtmp = rightof(outSQSO_serno2) + fl_width("R#"); inpSQSO_serno2 = new Fl_Input2( xtmp, y, 30, Hentry, "R#"); inpSQSO_serno2->align(FL_ALIGN_LEFT); inpSQSO_serno2->tooltip(_("Received serial number")); inpSQSO_serno2->type(FL_NORMAL_INPUT); inpSQSO_serno2->hide(); xtmp = rightof(inpSQSO_serno2) + fl_width("Nm"); inpSQSO_name2 = new Fl_Input2( xtmp, y, TopFrame3b->x() + TopFrame3b->w() - xtmp - pad, Hentry, "Nm"); inpSQSO_name2->align(FL_ALIGN_LEFT); inpSQSO_name2->tooltip(_("Rx name")); inpSQSO_name2->type(FL_NORMAL_INPUT); inpSQSO_name2->hide(); Fl_Box lsqso_box(rightof(inpSQSO_name2), y, pad, h,""); lsqso_box.box(FL_FLAT_BOX); log_sqso_frame->end(); log_sqso_frame->hide(); log_sqso_frame->resizable(lsqso_box); // end LOG_SQSO - partial // LOG_WAE - partial log_wae_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inpRstIn_WAE2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inpRstIn_WAE2->align(FL_ALIGN_LEFT); inpRstIn_WAE2->tooltip(_("Received RST")); inpRstIn_WAE2->type(FL_NORMAL_INPUT); inpRstOut_WAE2 = new Fl_Input2( rightof(inpRstIn_WAE2) + fl_width("xOut"), y, wRST, h, "Out"); inpRstOut_WAE2->align(FL_ALIGN_LEFT); inpRstOut_WAE2->tooltip(_("Sent RST")); inpRstOut_WAE2->type(FL_NORMAL_INPUT); outSerNo_WAE2 = new Fl_Input2( rightof(inpRstOut_WAE2) + fl_width("xS#"), y, 40, h, "S#"); outSerNo_WAE2->align(FL_ALIGN_LEFT); outSerNo_WAE2->tooltip(_("Sent serial number")); outSerNo_WAE2->type(FL_NORMAL_INPUT); inpSerNo_WAE2 = new Fl_Input2( rightof(outSerNo_WAE2) + fl_width("xR#"), y, 40, h, "R#"); inpSerNo_WAE2->align(FL_ALIGN_LEFT); inpSerNo_WAE2->tooltip(_("Received serial number")); inpSerNo_WAE2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSerNo_WAE2) + fl_width("xCntry"); cboCountryWAE2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryWAE2->align(FL_ALIGN_LEFT); cboCountryWAE2->tooltip(_("Country worked")); cboCountryWAE2->end(); Fl_Box lwae_box(rightof(cboCountryWAE2), y, pad, h,""); lwae_box.box(FL_FLAT_BOX); log_wae_frame->end(); log_wae_frame->hide(); log_wae_frame->resizable(lwae_box); // LOG_WAE - partial TopFrame3b->end(); TopFrame3->end(); TopFrame3->resizable(TopFrame3b); TopFrame3->hide(); } { // default controls inpFreq = inpFreq1; inpCall = inpCall1; inpTimeOn = inpTimeOn1; inpTimeOff = inpTimeOff1; inpName = inpName1; inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; qsoFreqDisp = qsoFreqDisp1; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpXchgIn = inpXchgIn1; inpClass = inp_FD_class1; inpSection = inp_FD_section1; inp_CQzone = inp_CQzone1; inp_CQstate = inp_CQstate1; cboCountry = cboCountryQSO;//cboCountryCQ1; inpLoc = inpLoc1; inp_SS_Check = inp_SS_Check1; inp_SS_Precedence = inp_SS_Precedence1; inp_SS_Section = inp_SS_Section1; inp_SS_SerialNoR = inp_SS_SerialNoR1; inp_KD_age = inp_KD_age1; inp_1010_nr = inp_1010_nr1; inp_ARR_check = inp_ARR_check1; inpSPCnum = inpSPCnum_NAQP1; inp_JOTA_troop = inp_JOTA_troop1; inp_JOTA_scout = inp_JOTA_scout1; inp_JOTA_spc = inp_JOTA_spc1; qsoFreqDisp1->set_lsd(progdefaults.sel_lsd); qsoFreqDisp2->set_lsd(progdefaults.sel_lsd); qsoFreqDisp3->set_lsd(progdefaults.sel_lsd); } { // Top Macro group Y = TopFrame1->y() + Hqsoframe + pad; //------------------- 4 bar macros tbar = new Fl_Group(0, Y, fl_digi_main->w(), TB_HEIGHT * 4); { int xpos = tbar->x(); int ypos = Y; int Wbtn = tbar->w() / 12; int remainder = tbar->w() - Wbtn * 12; tbar->box(FL_FLAT_BOX); for (int i = 0; i < 48; i++) { btnDockMacro[i] = new Fl_Button( xpos, ypos, (remainder > 0) ? Wbtn + 1 : Wbtn, TB_HEIGHT, ""); remainder--; btnDockMacro[i]->box(FL_THIN_UP_BOX); btnDockMacro[i]->tooltip(_("Left Click - execute\nRight Click - edit")); btnDockMacro[i]->callback(macro_cb, reinterpret_cast(i | 0x80)); xpos += btnDockMacro[i]->w(); if (i == 11 || i == 23 || i == 35) { xpos = tbar->x(); remainder = tbar->w() - Wbtn * 12; ypos += TB_HEIGHT; } } tbar->end(); tbar->hide(); } //-------------------------------- macroFrame2 = new Fl_Group(0, Y, W, MACROBAR_MAX); macroFrame2->box(FL_FLAT_BOX); mf_group2 = new Fl_Group(0, Y, W - alt_btn_width, macroFrame2->h()); Wmacrobtn = (mf_group2->w()) / NUMMACKEYS; wBLANK = (mf_group2->w() - NUMMACKEYS * Wmacrobtn) / 2; xpos = 0; ypos = mf_group2->y(); for (int i = 0; i < NUMMACKEYS; i++) { if (i == 4 || i == 8) { bx = new Fl_Box(xpos, ypos, wBLANK, macroFrame2->h()); bx->box(FL_FLAT_BOX); xpos += wBLANK; } btnMacro[NUMMACKEYS + i] = new Fl_Button(xpos, ypos, Wmacrobtn, macroFrame2->h(), macros.name[NUMMACKEYS + i].c_str()); btnMacro[NUMMACKEYS + i]->callback(macro_cb, reinterpret_cast(NUMMACKEYS + i)); btnMacro[NUMMACKEYS + i]->tooltip( _("Left Click - execute\nShift-Fkey - execute\nRight Click - edit")); xpos += Wmacrobtn; } mf_group2->end(); btnAltMacros2 = new Fl_Button( W - alt_btn_width, ypos, alt_btn_width, MACROBAR_MAX, "2"); btnAltMacros2->callback(altmacro_cb, 0); btnAltMacros2->tooltip(_("Shift-key macro set")); macroFrame2->resizable(mf_group2); macroFrame2->end(); Y += Hmacros; } { // Center group Rx/Tx/Raster displays center_group = new Fl_Group(0, Y, W, Htext); center_group->box(FL_FLAT_BOX); text_group = new Fl_Group(0, Y, center_group->w(), center_group->h()); text_group->box(FL_FLAT_BOX); text_panel = new Panel(0, Y, center_group->w(), center_group->h()); text_panel->box(FL_FLAT_BOX); mvgroup = new Fl_Group( text_panel->x(), text_panel->y(), text_panel->w()/2, Htext, ""); mainViewer = new pskBrowser(mvgroup->x(), mvgroup->y(), mvgroup->w(), mvgroup->h()-42, ""); mainViewer->box(FL_DOWN_BOX); mainViewer->has_scrollbar(Fl_Browser_::VERTICAL); mainViewer->callback((Fl_Callback*)cb_mainViewer); mainViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); mainViewer->tooltip(_("Left click - select\nRight click - clear line")); // mainViewer uses same regular expression evaluator as Viewer mainViewer->seek_re = &seek_re; Fl_Group* gseek = new Fl_Group(mvgroup->x(), mvgroup->y() + mvgroup->h() - 42, mvgroup->w(), 20); // search field gseek->box(FL_FLAT_BOX); int seek_x = mvgroup->x(); int seek_y = mvgroup->y() + Htext - 42; int seek_w = mvgroup->w(); txtInpSeek = new Fl_Input2( seek_x, seek_y, seek_w, gseek->h(), ""); txtInpSeek->callback((Fl_Callback*)cb_mainViewer_Seek); txtInpSeek->when(FL_WHEN_CHANGED); txtInpSeek->textfont(FL_HELVETICA); txtInpSeek->value(progStatus.browser_search.c_str()); txtInpSeek->do_callback(); txtInpSeek->tooltip(_("seek - regular expression")); gseek->resizable(txtInpSeek); gseek->end(); Fl_Group *g = new Fl_Group( mvgroup->x(), mvgroup->y() + mvgroup->h() - 22, mvgroup->w(), 22); g->box(FL_DOWN_BOX); // squelch mvsquelch = new Fl_Value_Slider2(g->x(), g->y(), g->w() - 75, g->h()); mvsquelch->type(FL_HOR_NICE_SLIDER); mvsquelch->range(-3.0, 6.0); mvsquelch->value(progStatus.VIEWER_psksquelch); mvsquelch->step(0.1); mvsquelch->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); mvsquelch->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); mvsquelch->callback( (Fl_Callback *)cb_mvsquelch); mvsquelch->tooltip(_("Set Viewer Squelch")); // clear button btnClearMViewer = new Fl_Button( mvsquelch->x() + mvsquelch->w(), g->y(), 75, g->h(), icons::make_icon_label(_("Clear"), edit_clear_icon)); btnClearMViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnClearMViewer); btnClearMViewer->callback((Fl_Callback*)cb_btnClearMViewer); g->resizable(mvsquelch); g->end(); mvgroup->resizable(mainViewer); mvgroup->end(); save_mvx = mvgroup->w(); int rh = progStatus.tile_y_ratio * text_panel->h(); if (progdefaults.rxtx_swap) rh = text_panel->h() - rh; ReceiveText = new FTextRX( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), rh, "" ); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); ReceiveText->setFont(progdefaults.RxFontnbr); ReceiveText->setFontSize(progdefaults.RxFontsize); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); FHdisp = new Raster( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), rh, progdefaults.HellRcvHeight); FHdisp->align(FL_ALIGN_CLIP); FHdisp->reverse(progdefaults.HellBlackboard); FHdisp->clear(); FHdisp->hide(); TransmitText = new FTextTX( text_panel->x() + mvgroup->w(), text_panel->y() + ReceiveText->h(), text_panel->w() - mvgroup->w(), text_panel->h() - ReceiveText->h() ); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); TransmitText->setFont(progdefaults.TxFontnbr); TransmitText->setFontSize(progdefaults.TxFontsize); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->align(FL_ALIGN_CLIP); minbox = new Fl_Box( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); minbox->hide(); text_panel->resizable(minbox); text_panel->end(); text_group->end(); text_group->resizable(text_panel); wefax_group = new Fl_Group(0, Y, W, Htext); wefax_group->box(FL_FLAT_BOX); wefax_pic::create_both( true ); wefax_group->end(); fsq_group = new Fl_Group(0, Y, W, Htext); fsq_group->box(FL_FLAT_BOX); // left, resizable rx/tx widgets fsq_left = new Panel( 0, Y, W - 180, Htext); fsq_left->box(FL_FLAT_BOX); // add rx & monitor fsq_rx_text = new FTextRX( 0, Y, fsq_left->w(), fsq_left->h() / 2); fsq_rx_text->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); fsq_rx_text->setFont(progdefaults.RxFontnbr); fsq_rx_text->setFontSize(progdefaults.RxFontsize); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); fsq_rx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); fsq_rx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); fsq_rx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); fsq_tx_text = new FTextTX( 0, Y + fsq_rx_text->h(), fsq_left->w(), fsq_left->h() - fsq_rx_text->h()); fsq_tx_text->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); fsq_tx_text->setFont(progdefaults.TxFontnbr); fsq_tx_text->setFontSize(progdefaults.TxFontsize); fsq_tx_text->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); fsq_tx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); fsq_tx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); fsq_tx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); fsq_tx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); fsq_tx_text->align(FL_ALIGN_CLIP); fsq_minbox = new Fl_Box( 0, Y + minhtext, fsq_tx_text->w(), fsq_left->h() - 2 * minhtext); fsq_minbox->hide(); fsq_left->resizable(fsq_minbox); fsq_left->end(); // right, heard list, special fsq controls, s/n indicator Fl_Group *fsq_right = new Fl_Group( fsq_left->w(), Y, 180, fsq_left->h()); fsq_right->box(FL_FLAT_BOX); int bh = 20; int qh = bh + bh + 1 + 8 + image_s2n.h(); static int heard_widths[] = { 40*fsq_right->w()/100, 30*fsq_right->w()/100, 0 }; fsq_heard = new Fl_Browser( fsq_right->x(), fsq_right->y(), fsq_right->w(), fsq_right->h() - qh);//minhtext); fsq_heard->column_widths(heard_widths); fsq_heard->column_char(','); fsq_heard->tooltip(_("Select FSQ station")); fsq_heard->callback((Fl_Callback*)cb_fsq_heard); fsq_heard->type(FL_MULTI_BROWSER); fsq_heard->box(FL_DOWN_BOX); fsq_heard->add("allcall"); fsq_heard->labelfont(progdefaults.RxFontnbr); fsq_heard->labelsize(11); #ifdef __APPLE__ fsq_heard->textfont(FL_SCREEN_BOLD); fsq_heard->textsize(13); #else fsq_heard->textfont(FL_HELVETICA); fsq_heard->textsize(13); #endif int qw = fsq_right->w(); int bw2 = qw / 2; int bw4 = qw / 4; fsq_lower_right = new Fl_Group( fsq_right->x(), fsq_heard->y() + fsq_heard->h(), qw, qh); fsq_lower_right->box(FL_FLAT_BOX); fsq_lower_right->color(FL_WHITE); int _yp = fsq_lower_right->y(); int _xp = fsq_lower_right->x(); btn_FSQCALL = new Fl_Light_Button( _xp, _yp, bw2, bh, "FSQ-ON"); btn_FSQCALL->value(progdefaults.fsq_directed); btn_FSQCALL->selection_color(FL_DARK_GREEN); btn_FSQCALL->callback(cbFSQCALL, 0); btn_FSQCALL->tooltip("Left click - on/off"); _xp += bw2; btn_SELCAL = new Fl_Light_Button( _xp, _yp, bw2, bh, "ACTIVE"); btn_SELCAL->selection_color(FL_DARK_RED); btn_SELCAL->value(1); btn_SELCAL->callback(cbSELCAL, 0); btn_SELCAL->tooltip("Sleep / Active"); _xp = fsq_lower_right->x(); _yp += bh; btn_MONITOR = new Fl_Light_Button( _xp, _yp, bw4, bh, "MON"); btn_MONITOR->selection_color(FL_DARK_GREEN); btn_MONITOR->value(progdefaults.fsq_show_monitor = false); btn_MONITOR->callback(cbMONITOR, 0); btn_MONITOR->tooltip("Monitor Open/Close"); _xp += bw4; btn_FSQQTH = new Fl_Button( _xp, _yp, bw4, bh, "QTH"); btn_FSQQTH->callback(cbFSQQTH, 0); btn_FSQQTH->tooltip("QTH->tx panel"); _xp += bw4; btn_FSQQTC = new Fl_Button( _xp, _yp, bw4, bh, "QTC"); btn_FSQQTC->callback(cbFSQQTC, 0); btn_FSQQTC->tooltip("QTC->tx panel"); _xp += bw4; btn_FSQCQ = new Fl_Button( _xp, _yp, bw4, bh, "CQ"); btn_FSQCQ->callback(cbFSQCQ, 0); btn_FSQCQ->tooltip("Xmt cqcqcq"); _xp = fsq_lower_right->x(); _yp += (bh + 1); ind_fsq_s2n = new Progress( _xp + 10, _yp, qw - 20, 8, ""); ind_fsq_s2n->color(FL_WHITE, FL_DARK_GREEN); ind_fsq_s2n->type(Progress::HORIZONTAL); ind_fsq_s2n->value(40); _yp += 8; int th = fsq_tx_text->y() + fsq_tx_text->h(); th = (th - _yp); // Clear remainder of area if needed. if(th > image_s2n.h()) { Fl_Box *_nA = new Fl_Box(_xp, _yp, qw, th, ""); _nA->box(FL_FLAT_BOX); _nA->color(FL_WHITE); } // Add S/N rule Fl_Box *s2n = new Fl_Box( _xp + 10, _yp, qw - 20, image_s2n.h(), ""); s2n->box(FL_FLAT_BOX); s2n->color(FL_WHITE); s2n->align(FL_ALIGN_INSIDE | FL_ALIGN_TOP | FL_ALIGN_CENTER | FL_ALIGN_CLIP); s2n->image(image_s2n); fsq_lower_right->end(); fsq_right->resizable(fsq_heard); fsq_right->end(); fsq_group->resizable(fsq_left); fsq_group->end(); ifkp_group = new Fl_Group(0, Y, W, Htext); ifkp_group->box(FL_FLAT_BOX); // upper, receive ifkp widgets ifkp_left = new Panel( 0, Y, W - (image_s2n.w()+4), Htext); // add rx & tx ifkp_rx_text = new FTextRX( 0, Y, ifkp_left->w(), ifkp_group->h() / 2); ifkp_rx_text->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); ifkp_rx_text->setFont(progdefaults.RxFontnbr); ifkp_rx_text->setFontSize(progdefaults.RxFontsize); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ifkp_rx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ifkp_rx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ifkp_rx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ifkp_tx_text = new FTextTX( 0, Y + ifkp_rx_text->h(), ifkp_rx_text->w(), ifkp_group->h() - ifkp_rx_text->h()); ifkp_tx_text->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); ifkp_tx_text->setFont(progdefaults.TxFontnbr); ifkp_tx_text->setFontSize(progdefaults.TxFontsize); ifkp_tx_text->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); ifkp_tx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ifkp_tx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ifkp_tx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ifkp_tx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ifkp_tx_text->align(FL_ALIGN_CLIP); ifkp_minbox = new Fl_Box( 0, Y + minhtext, ifkp_tx_text->w(), ifkp_left->h() - 2 * minhtext); ifkp_minbox->hide(); ifkp_left->resizable(ifkp_minbox); ifkp_left->end(); ifkp_right = new Fl_Group( ifkp_left->w(), Y, image_s2n.w()+4, ifkp_group->h()); ifkp_right->box(FL_FLAT_BOX); static int ifkp_heard_widths[] = { 40*ifkp_right->w()/100, 30*ifkp_right->w()/100, 0 }; ifkp_heard = new Fl_Browser( ifkp_right->x(), ifkp_right->y(), image_s2n.w()+4, ifkp_right->h() - (14 + image_s2n.h())); ifkp_heard->column_widths(ifkp_heard_widths); ifkp_heard->type(FL_MULTI_BROWSER); ifkp_heard->callback((Fl_Callback*)cb_ifkp_heard); ifkp_heard->column_char(','); ifkp_heard->tooltip(_("Stations Heard")); ifkp_heard->box(FL_DOWN_BOX); ifkp_heard->labelfont(progdefaults.RxFontnbr); ifkp_heard->labelsize(11); #ifdef __APPLE__ ifkp_heard->textfont(FL_SCREEN_BOLD); ifkp_heard->textsize(13); #else ifkp_heard->textfont(FL_HELVETICA); ifkp_heard->textsize(13); #endif Fl_Group *ifkp_sn_box = new Fl_Group( ifkp_heard->x(), ifkp_heard->y() + ifkp_heard->h(), ifkp_heard->w(), 14 + image_s2n.h(), ""); ifkp_sn_box->box(FL_DOWN_BOX); ifkp_sn_box->color(FL_WHITE); ifkp_s2n_progress = new Progress( ifkp_sn_box->x() + 2, ifkp_sn_box->y() + 2, image_s2n.w(), 10, ""); ifkp_s2n_progress->color(FL_WHITE, FL_DARK_GREEN); ifkp_s2n_progress->type(Progress::HORIZONTAL); ifkp_s2n_progress->value(40); Fl_Box *ifkp_s2n = new Fl_Box( ifkp_s2n_progress->x(), ifkp_s2n_progress->y() + ifkp_s2n_progress->h(), image_s2n.w(), image_s2n.h(), ""); ifkp_s2n->box(FL_FLAT_BOX); ifkp_s2n->color(FL_WHITE); ifkp_s2n->align(FL_ALIGN_INSIDE | FL_ALIGN_TOP | FL_ALIGN_CENTER | FL_ALIGN_CLIP); ifkp_s2n->image(image_s2n); ifkp_sn_box->end(); ifkp_right->end(); ifkp_right->resizable(ifkp_heard); ifkp_right->end(); // lower, transmit ifkp widgets ifkp_group->resizable(ifkp_left); ifkp_group->end(); center_group->end(); text_group->show(); wefax_group->hide(); fsq_group->hide(); ifkp_group->hide(); } { // Bottom Macro group Y += center_group->h(); Fl::add_handler(default_handler); macroFrame1 = new Fl_Group(0, Y, W, MACROBAR_MAX); macroFrame1->box(FL_FLAT_BOX); mf_group1 = new Fl_Group(0, Y, W - alt_btn_width, macroFrame1->h()); Wmacrobtn = (mf_group1->w()) / NUMMACKEYS; wBLANK = (mf_group1->w() - NUMMACKEYS * Wmacrobtn) / 2; xpos = 0; ypos = mf_group1->y(); for (int i = 0; i < NUMMACKEYS; i++) { if (i == 4 || i == 8) { bx = new Fl_Box(xpos, ypos, wBLANK, macroFrame1->h()); bx->box(FL_FLAT_BOX); xpos += wBLANK; } btnMacro[i] = new Fl_Button(xpos, ypos, Wmacrobtn, macroFrame1->h(), macros.name[i].c_str()); btnMacro[i]->callback(macro_cb, reinterpret_cast(i)); btnMacro[i]->tooltip(_("Left Click - execute\nFkey - execute\nRight Click - edit")); xpos += Wmacrobtn; } mf_group1->end(); btnAltMacros1 = new Fl_Button( W - alt_btn_width, ypos, alt_btn_width, macroFrame1->h(), "1"); btnAltMacros1->callback(altmacro_cb, 0); btnAltMacros1->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros1->tooltip(_("Primary macro set")); macroFrame1->resizable(mf_group1); macroFrame1->end(); Y += Hmacros; } { // Waterfall group wf_group = new Fl_Pack(0, Y, W, Hwfall); wf_group->type(1); wf = new waterfall(0, Y, Wwfall, Hwfall); wf->end(); pgrsSquelch = new Progress( rightof(wf), Y, DEFAULT_SW, Hwfall, ""); pgrsSquelch->color(FL_BACKGROUND2_COLOR, FL_DARK_GREEN); pgrsSquelch->type(Progress::VERTICAL); pgrsSquelch->tooltip(_("Detected signal level")); sldrSquelch = new Fl_Slider2( rightof(pgrsSquelch), Y, DEFAULT_SW, Hwfall, ""); sldrSquelch->minimum(100); sldrSquelch->maximum(0); sldrSquelch->step(1); sldrSquelch->value(progStatus.sldrSquelchValue); sldrSquelch->callback((Fl_Callback*)cb_sldrSquelch); sldrSquelch->color(FL_INACTIVE_COLOR); sldrSquelch->tooltip(_("Squelch level")); // Fl_Group::current()->resizable(wf); wf_group->end(); wf_group->resizable(wf); } { // Status bar group Y += Hwfall; status_group = new Fl_Group(0, Y, W, Hstatus); MODEstatus = new Fl_Button(0, Y, Wmode, Hstatus, ""); MODEstatus->box(FL_DOWN_BOX); MODEstatus->color(FL_BACKGROUND2_COLOR); MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); MODEstatus->callback(status_cb, (void *)0); MODEstatus->when(FL_WHEN_CHANGED); MODEstatus->tooltip(_("Left click: change mode\nRight click: configure")); cntCW_WPM = new Fl_Counter2( rightof(MODEstatus), Y, Ws2n - Hstatus, Hstatus, ""); cntCW_WPM->callback(cb_cntCW_WPM); cntCW_WPM->minimum(progdefaults.CWlowerlimit); cntCW_WPM->maximum(progdefaults.CWupperlimit); cntCW_WPM->value(progdefaults.CWspeed); cntCW_WPM->type(1); cntCW_WPM->step(1); cntCW_WPM->tooltip(_("CW transmit WPM")); cntCW_WPM->hide(); btnCW_Default = new Fl_Button( rightof(cntCW_WPM), Y, Hstatus, Hstatus, "*"); btnCW_Default->callback(cb_btnCW_Default); btnCW_Default->tooltip(_("Default WPM")); btnCW_Default->hide(); Status1 = new Fl_Box( rightof(MODEstatus), Y, Ws2n, Hstatus, "STATUS1"); Status1->box(FL_DOWN_BOX); Status1->color(FL_BACKGROUND2_COLOR); Status1->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); Status2 = new Fl_Box( rightof(Status1), Y, Wimd, Hstatus, "STATUS2"); Status2->box(FL_DOWN_BOX); Status2->color(FL_BACKGROUND2_COLOR); Status2->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); inpCall4 = new Fl_Input2( rightof(Status1), Y, Wimd, Hstatus, ""); inpCall4->align(FL_ALIGN_LEFT); inpCall4->tooltip(_("Other call")); inpCall4->hide(); // see corner_box below // corner_box used to leave room for OS X corner drag handle #ifdef __APPLE__ #define cbwidth DEFAULT_SW #else #define cbwidth 0 #endif StatusBar = new Fl_Box( rightof(Status2), Y, W - rightof(Status2) - bwAfcOnOff - bwSqlOnOff - Wwarn - bwTxLevel - bwSqlOnOff - cbwidth, Hstatus, "STATUS BAR"); StatusBar->box(FL_DOWN_BOX); StatusBar->color(FL_BACKGROUND2_COLOR); StatusBar->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); cntTxLevel = new Fl_Counter2( rightof(StatusBar), Y, bwTxLevel, Hstatus, ""); cntTxLevel->minimum(-30); cntTxLevel->maximum(0); cntTxLevel->value(-6); cntTxLevel->callback((Fl_Callback*)cb_cntTxLevel); cntTxLevel->value(progdefaults.txlevel); cntTxLevel->lstep(1.0); cntTxLevel->tooltip(_("Tx level attenuator (dB)")); WARNstatus = new Fl_Box( rightof(cntTxLevel) + pad, Y, Wwarn, Hstatus, ""); WARNstatus->box(FL_DIAMOND_DOWN_BOX); WARNstatus->color(FL_BACKGROUND_COLOR); WARNstatus->labelcolor(FL_RED); WARNstatus->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); btnAFC = new Fl_Light_Button( rightof(WARNstatus) + pad, Y, bwAfcOnOff, Hstatus, "AFC"); btnSQL = new Fl_Light_Button( rightof(btnAFC), Y, bwSqlOnOff, Hstatus, "SQL"); // btnPSQL will be resized later depending on the state of the // configuration parameter to show that widget btnPSQL = new Fl_Light_Button( rightof(btnSQL), Y, bwSqlOnOff, Hstatus, "PSM"); btnSQL->selection_color(progdefaults.Sql1Color); btnAFC->callback(cbAFC, 0); btnAFC->value(1); btnAFC->tooltip(_("Automatic Frequency Control")); btnSQL->callback(cbSQL, 0); btnSQL->value(1); btnSQL->tooltip(_("Squelch")); btnPSQL->selection_color(progdefaults.Sql1Color); btnPSQL->value(progdefaults.kpsql_enabled); btnPSQL->callback(cbPwrSQL, 0); btnPSQL->tooltip(_("Power Signal Monitor")); corner_box = new Fl_Box( fl_digi_main->w() - cbwidth, Y, cbwidth, Hstatus, ""); corner_box->box(FL_FLAT_BOX); status_group->end(); status_group->resizable(StatusBar); Y += status_group->h(); } { // adjust callbacks showMacroSet(); Fl_Widget* logfields[] = { inpCall1, inpCall2, inpCall3, inpCall4, inpLoc1, inp_vhf_Loc1, inp_vhf_Loc2, inpName1, inpName1, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOff1, inpTimeOff2, inpTimeOff3, inpRstIn1, inpRstIn2, inpRstIn3, inpRstIn4, inpRstIn_AICW2, inpRstOut1, inpRstOut2, inpRstOut3, inpRstOut4, inpRstOut_AICW2, inpQth, inpVEprov, inpAZ, inpNotes, inpState1, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, outSerNo3, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, outSerNo4, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_class2, inp_FD_section1, inp_FD_section2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_vhf_RSTin1, inp_vhf_RSTin2, inp_vhf_RSTout1, inp_vhf_RSTout2, inp_1010_XchgIn1, inp_1010_XchgIn2, inp_1010_name2, inp_1010_nr1, inp_1010_nr2, inp_ARR_Name2, inp_ARR_XchgIn1, inp_ARR_XchgIn2, inp_ARR_check1, inp_ARR_check2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_serno1, inpRTU_serno2, cboCountryRTU2, inpRTU_RSTin2, inp_IARI_PR1, inp_IARI_PR2, inp_IARI_RSTin2, inp_IARI_RSTout2, out_IARI_SerNo1, inp_IARI_SerNo1, out_IARI_SerNo2, inp_IARI_SerNo2, inp_IARI_PR2, cboCountryIARI2, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_spc1, inp_JOTA_spc2, inp_JOTA_troop1, inp_JOTA_troop2, inp_CQzone1, inpSPCnum_AICW1, inpSPCnum_AICW2, inpSQSO_state1, inpSQSO_state2, inpSQSO_county1, inpSQSO_county2, inpSQSO_serno1, inpSQSO_serno2, outSQSO_serno1, outSQSO_serno2, inpSQSO_name2, inpSQSO_category1, inpSQSO_category2 }; for (size_t i = 0; i < sizeof(logfields)/sizeof(*logfields); i++) { logfields[i]->callback(cb_log); logfields[i]->when(FL_WHEN_CHANGED);//RELEASE || FL_WHEN_ENTER_KEY );//CHANGED); } Fl_ComboBox *country_fields[] = { cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2// , // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->callback(cb_country); country_fields[i]->when(FL_WHEN_CHANGED); } // exceptions inpCall1->callback(cb_call); inpCall1->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpCall2->callback(cb_call); inpCall2->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpCall3->callback(cb_call); inpCall3->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpCall4->callback(cb_call); inpCall4->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpNotes->when(FL_WHEN_RELEASE); } fl_digi_main->end(); fl_digi_main->callback(cb_wMain); fl_digi_main->resizable(center_group); { // scope view dialog scopeview = new Fl_Double_Window(0,0,140,140, _("Scope")); scopeview->xclass(PACKAGE_NAME); digiscope = new Digiscope (0, 0, 140, 140); scopeview->resizable(digiscope); scopeview->size_range(SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT); scopeview->end(); scopeview->hide(); } { // field day viewer dialog field_day_viewer = make_fd_view(); field_day_viewer->hide(); } { // adjust menu toggle items if (!progdefaults.menuicons) icons::toggle_icon_labels(); // Set the state of checked toggle menu items. Never changes. const struct { bool var; const char* label; } toggles[] = { { progStatus.LOGenabled, LOG_TO_FILE_MLABEL }, { progStatus.WF_UI, WF_MLABEL }, { progStatus.Rig_Log_UI, RIGLOG_PARTIAL_MLABEL }, { !progStatus.Rig_Log_UI, RIGLOG_FULL_MLABEL }, { progStatus.NO_RIGLOG, RIGLOG_NONE_MLABEL }, { progStatus.DOCKEDSCOPE, DOCKEDSCOPE_MLABEL } }; Fl_Menu_Item* toggle; for (size_t i = 0; i < sizeof(toggles)/sizeof(*toggles); i++) { if (toggles[i].var && (toggle = getMenuItem(toggles[i].label))) { toggle->set(); if (toggle->callback()) { mnu->value(toggle); toggle->do_callback(reinterpret_cast(mnu)); } } } } if (!dxcc_is_open()) getMenuItem(COUNTRIES_MLABEL)->hide(); toggle_smeter(); adjust_for_contest(0); UI_select(); wf->UI_select(progStatus.WF_UI); LOGGING_colors_font(); init_country_fields(); clearQSO(); fsqMonitor = create_fsqMonitor(); createConfig(); createRecordLoader(); switch (progdefaults.mbar_scheme) { case 0: btn_scheme_0->setonly(); break; case 1: btn_scheme_1->setonly(); break; case 2: btn_scheme_2->setonly(); break; case 3: btn_scheme_3->setonly(); break; case 4: btn_scheme_4->setonly(); break; case 5: btn_scheme_5->setonly(); break; case 6: btn_scheme_6->setonly(); break; case 7: btn_scheme_7->setonly(); break; case 8: btn_scheme_8->setonly(); break; case 9: btn_scheme_9->setonly(); break; case 10: btn_scheme_10->setonly(); break; case 11: btn_scheme_11->setonly(); break; case 12: btn_scheme_12->setonly(); break; } colorize_macros(); if (rx_only) { btnTune->deactivate(); wf->xmtrcv->deactivate(); } set_mode_controls(active_modem->get_mode()); } fldigi-4.1.06/src/dialogs/confdialog.fl0000664000175000017500000151516013511722445014641 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include "main.h"} {private local } decl {\#include "fl_digi.h"} {private local } decl {\#include "data_io.h"} {private local } decl {\#include "Viewer.h"} {private global } decl {\#include "font_browser.h"} {public global } decl {\#include "soundconf.h"} {private local } decl {\#include "globals.h"} {public local } decl {\#include "modem.h"} {public local } decl {\#include "configuration.h"} {public local } decl {\#include "combo.h"} {public local } decl {\#include "waterfall.h"} {private local } decl {\#include "rigxml.h"} {private local } decl {\#include "lookupcall.h"} {private local } decl {\#include "icons.h"} {private local } decl {\#include "Viewer.h"} {private local } decl {\#include "pskrep.h"} {private global } decl {\#include "flinput2.h"} {public local } decl {\#include "flslider2.h"} {public local } decl {\#include "flmisc.h"} {public local } decl {\#include "logsupport.h"} {private local } decl {\#include "notify.h"} {private local } decl {\#include "debug.h"} {private local } decl {\#include "status.h"} {private local } decl {\#include "rx_extract.h"} {private local } decl {\#include "kmlserver.h"} {private local } decl {\#include "macroedit.h"} {private local } decl {\#include "fileselect.h"} {private local } decl {\#include "psm/psm.h"} {private local } decl {\#include "dx_cluster.h"} {private local } decl {extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata);} {private local } decl {\#include "dx_dialog.h"} {private local } decl {\#if USE_HAMLIB \#include "hamlib.h" \#endif} {private local } decl {\#include "fsq.h"} {private local } decl {Fl_Double_Window *dlgConfig;} {public local } decl {Mode_Browser* mode_browser;} {public local } Function {choose_color(Fl_Color & c)} {open private return_type void } { code {unsigned char r, g, b; Fl::get_color(c, r, g, b); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b);} {} } Function {cbRxFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); RxText->textfont(font); RxText->textsize(size); RxText->textcolor(color); RxText->redraw(); progdefaults.RxFontnbr = font; progdefaults.RxFontsize = size; progdefaults.RxFontcolor = color; ReceiveText->setFont(font); ReceiveText->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFont(font); fsq_rx_text->setFontSize(size); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbTxFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); TxText->textfont(font); TxText->textsize(size); TxText->textcolor(color); TxText->redraw(); progdefaults.TxFontnbr = font; progdefaults.TxFontsize = size; progdefaults.TxFontcolor = color; TransmitText->setFont(font); TransmitText->setFontSize(size); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); fsq_tx_text->setFont(font); fsq_tx_text->setFontSize(size); fsq_tx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbDXfont_browser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXfontcolor = color; progdefaults.DXfontnbr = font; progdefaults.DXfontsize = size; brws_tcpip_stream->setFont(font); brws_tcpip_stream->setFontSize(size); brws_tcpip_stream->setFontColor(color, FTextBase::RECV); brws_tcpip_stream->redraw(); ed_telnet_cmds->setFont(font); ed_telnet_cmds->setFontSize(size); ed_telnet_cmds->setFontColor(color); ed_telnet_cmds->redraw(); StreamText->textcolor(color); StreamText->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(font); brws_dxc_help->setFontSize(size); brws_dxc_help->setFontColor(color, FTextBase::RECV); brws_dxc_help->redraw(); font_browser->hide(); dxcluster_hosts_load(); progdefaults.changed = true;} {} } Function {cbDXC_FontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXC_textfont = font; progdefaults.DXC_textsize = size; progdefaults.DXC_textcolor = color; DXC_display->textsize(size); DXC_display->textcolor(color); DXC_display->textfont(font); DXC_display->redraw(); font_browser->hide(); dxc_lines_redraw(); progdefaults.changed = true;} {} } Function {cbMacroEditFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); MacroText->textfont(font); MacroText->textsize(size); MacroText->redraw(); progdefaults.MacroEditFontnbr = font; progdefaults.MacroEditFontsize = size; update_macroedit_font(); MacroText->textfont(font); MacroText->textsize(size); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void } { code {Fl_Font fnt = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.WaterfallFontnbr = fnt; progdefaults.WaterfallFontsize = size; progdefaults.changed = true; font_browser->hide();} {} } Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {progdefaults.MacroBtnFontnbr = font_browser->fontNumber(); progdefaults.MacroBtnFontsize = font_browser->fontSize();; progdefaults.MacroBtnFontcolor = font_browser->fontColor(); font_browser->hide(); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->redraw_label(); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->redraw_label(); progdefaults.changed = true; colorize_macros();} {} } Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void } { code {progdefaults.ViewerFontnbr = font_browser->fontNumber(); progdefaults.ViewerFontsize = font_browser->fontSize(); initViewer(); progdefaults.changed = true; font_browser->hide();} {} } Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void } { code {Fl_Font fnt = font_browser->fontNumber(); progdefaults.FreqControlFontnbr = fnt; progdefaults.changed = true; FDdisplay->labelfont(progdefaults.FreqControlFontnbr); FDdisplay->redraw(); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->redraw(); qsoFreqDisp2->redraw(); qsoFreqDisp3->redraw(); font_browser->hide();} {} } Function {cbLOGGINGFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGGINGtextfont = font; progdefaults.LOGGINGtextsize = size; progdefaults.LOGGINGtextcolor = color; LOGGINGdisplay->textsize(size); LOGGINGdisplay->textcolor(color); LOGGINGdisplay->textfont(font); LOGGINGdisplay->redraw(); LOGGING_colors_font(); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbLOGBOOKFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGBOOKtextfont = font; progdefaults.LOGBOOKtextsize = size; progdefaults.LOGBOOKtextcolor = color; LOGBOOKdisplay->textsize(size); LOGBOOKdisplay->textcolor(color); LOGBOOKdisplay->textfont(font); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); font_browser->hide(); progdefaults.changed = true;} {} } Function {set_qrzxml_buttons(Fl_Button* b)} {open return_type void } { code {Fl_Button* qrzbxml[] = { btnQRZXMLnotavailable, btnQRZcdrom, btnQRZsub, btnHamcall, btnCALLOOK, btnHamQTH}; for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++) qrzbxml[i]->value(b == qrzbxml[i]);} {} } Function {set_qrzweb_buttons(Fl_Button* b)} {open return_type void } { code {Fl_Button* qrzbweb[] = { btnQRZWEBnotavailable, btnQRZonline, btnHAMCALLonline, btnHamQTHonline, btnCallookOnline }; for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++) qrzbweb[i]->value(b == qrzbweb[i]);} {} } Function {ConfigureDialog()} {open } { code {font_browser = new Font_Browser;} {} code {static const char szShifts[] = "23|85|160|170|182|200|240|350|425|850|Custom"; static const char szBauds[] = "45|45.45|50|56|75|100|110|150|200|300"; static const char szSelBits[] = "5 (baudot)|7 (ascii)|8 (ascii)"; static const char szParity[] = "none|even|odd|zero|one"; static const char szStopBits[] = "1|1.5|2"; static const char szOliviaTones[] = "2|4|8|16|32|64|128|256"; static const char szOliviaBandwidth[] = "125|250|500|1000|2000"; static const char szContestiaTones[] = "2|4|8|16|32|64|128|256"; static const char szContestiaBandwidth[] = "125|250|500|1000|2000"; static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800"; static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open xywh {438 155 600 425} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 675 390} color 50 selection_color 50 } { Fl_Group tabOperator { label Operator callback {progdefaults.changed = true;} open selected xywh {0 25 600 365} when 1 } { Fl_Group {} { label {Station / Operator} open xywh {5 35 590 285} box ENGRAVED_FRAME align 21 } { Fl_Input inpMyCallsign { label {Station Callsign:} callback {const char *triggers = " !\#$%&'()*+,-.;<=>?@[\\\\]^_{|}~"; std::string mycall = inpMyCallsign->value(); for (size_t k = 0; k < mycall.length(); k++) { for (size_t n = 0; n < strlen(triggers); n++) { if (mycall[k] == triggers[n]) { if ( fl_choice2("Replace FSQ trigger character with slash /", _("no"), _("yes"), NULL ) ) mycall[k] = '/'; } } } if (progdefaults.THORsecText.empty()) { progdefaults.THORsecText = mycall; progdefaults.THORsecText.append(" "); txtTHORSecondary->value(progdefaults.THORsecText.c_str()); } if (progdefaults.secText.empty()) { progdefaults.secText = mycall; progdefaults.secText.append(" "); txtSecondary->value(progdefaults.secText.c_str()); } progdefaults.myCall = mycall; inpMyCallsign->value(progdefaults.myCall.c_str()); inpMyCallsign->redraw(); update_main_title(); notify_change_callsign(); progdefaults.changed = true;} tooltip {Station callsign} xywh {195 64 110 24} when 1 code0 {inpMyCallsign->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpOperCallsign { label {Operator Callsign:} callback {progdefaults.operCall = o->value(); progdefaults.changed = true;} tooltip {Operator callsign (if different than station callsign)} xywh {195 94 110 24} code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.operCall.c_str());} class Fl_Input2 } Fl_Input inpMyName { label {Operator Name:} callback {progdefaults.myName = o->value(); progdefaults.changed = true;} tooltip {Operators name} xywh {195 125 140 24} code0 {inpMyName->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyAntenna { label {Antenna:} callback {progdefaults.myAntenna = o->value(); progdefaults.changed = true;} tooltip {Short description of antenna} xywh {195 155 320 24} code0 {inpMyAntenna->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyQth { label {Station QTH:} callback {progdefaults.myQth = o->value(); progdefaults.changed = true;} tooltip {Operators QTH} xywh {195 186 320 24} code0 {inpMyQth->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyLocator { label {Station Locator:} callback {progdefaults.myLocator = o->value(); progdefaults.changed = true;} tooltip {Maidenhead locator as in EM64qv} xywh {195 216 85 24} code0 {inpMyLocator->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Group listbox_states { label State callback {listbox_counties->clear(); listbox_counties->add(states.counties(o->value()).c_str()); listbox_counties->index(0); inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str()); inp_QP_state_short->value(states.state_short(o->value()).c_str()); progdefaults.SQSOstate = o->index(); progdefaults.changed = true;} open xywh {195 247 160 24} box DOWN_BOX color 7 align 4 code0 {\#include "counties.h"} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->add(states.names().c_str());} code3 {o->index(progdefaults.SQSOstate);} class Fl_ListBox } {} Fl_Input inp_QP_state_short { tooltip {Abbreviation for state} xywh {362 247 43 24} align 5 code0 {o->value(states.state_short(listbox_states->value()).c_str());} class Fl_Input2 } Fl_Group listbox_counties { label County callback {inp_QP_short_county->value(states.cnty_short(listbox_states->value(),o->value()).c_str()); progdefaults.SQSOcounty = o->index(); progdefaults.changed = true;} open xywh {195 278 284 24} box DOWN_BOX color 7 align 4 code0 {o->clear(); o->add(states.counties(listbox_states->value()).c_str());} code1 {o->index(progdefaults.SQSOcounty);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Input inp_QP_short_county { tooltip {Abbreviation for county} xywh {487 278 60 24} align 5 code0 {inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str());} class Fl_Input2 } } } Fl_Group tabUI { label UI open xywh {0 25 604 365} hide } { Fl_Tabs tabsUI {open xywh {0 25 604 365} selection_color 50 } { Fl_Group tabBrowser { label Browser open xywh {0 50 600 340} } { Fl_Group {} {open xywh {30 65 540 300} box ENGRAVED_FRAME } { Fl_Spinner cntChannels { label {Channels, first channel starts at waterfall lower limit} callback {progdefaults.VIEWERchannels = (int)(o->value()); initViewer();} tooltip {Change \# of psk viewer channels} xywh {46 75 50 24} align 8 maximum 30 value 30 code0 {o->minimum(5); o->maximum(30); o->step(1);} code1 {o->value(progdefaults.VIEWERchannels);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTimeout { label {Inactivity timeout} callback {progdefaults.VIEWERtimeout = (int)(o->value()); progdefaults.changed = true;} tooltip {Clear channel text after \# seconds of inactivity} xywh {46 111 50 24} align 8 value 10 code0 {o->minimum(1); o->maximum(180); o->step(1);} code1 {o->value(progdefaults.VIEWERtimeout);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Group listboxViewerLabel { label {Channel label} callback {progdefaults.VIEWERlabeltype = o->index(); initViewer(); progdefaults.changed = true;} open tooltip {Appearance of label on each channel} xywh {46 151 150 24} box DOWN_BOX color 7 align 8 code0 {listboxViewerLabel->add(_("None")); listboxViewerLabel->add(_("Audio frequency"));} code1 {listboxViewerLabel->add(_("Radio frequency")); listboxViewerLabel->add(_("Channel number"));} code3 {listboxViewerLabel->index(progdefaults.VIEWERlabeltype); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Button btnViewerFont { label {Font...} callback {font_browser->fontNumber(progdefaults.ViewerFontnbr); font_browser->fontSize(progdefaults.ViewerFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbViewerFontBrowser); font_browser->show();} tooltip {select browser font} xywh {331 151 70 24} } Fl_Check_Button btnFixedIntervals { label {Fixed Intervals} callback {progdefaults.VIEWERfixed = o->value(); progdefaults.changed = true; initViewer();} tooltip {Force channel spacing to even 100 Hz increments} xywh {236 137 165 20} down_box DOWN_BOX value 1 hide code0 {o->value(progdefaults.VIEWERfixed);} } Fl_Check_Button btnMarquee { label {Continuous scrolling} callback {progdefaults.VIEWERmarquee = o->value(); progdefaults.changed = true; initViewer();} tooltip {ON - Marquee style OFF - Clear & restart} xywh {46 189 165 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERmarquee);} } Fl_Check_Button btnAscend { label {Lowest freq on bottom of viewer} callback {progdefaults.VIEWERascend = o->value(); progdefaults.changed = true; initViewer();} tooltip {Change positions of low to high channels} xywh {46 213 253 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERascend);} } Fl_Check_Button btnBrowserHistory { label {Play back history when active channel selected} callback {progdefaults.VIEWERhistory = o->value(); progdefaults.changed = true;} tooltip {Audio stream history decoded on selected signal} xywh {46 238 356 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERhistory);} } Fl_Group {} { label {Detection Level} open xywh {40 287 144 60} box ENGRAVED_FRAME } { Fl_Button bwsrSliderColor { label Backgnd callback {uchar r, g, b; r = progdefaults.bwsrSliderColor.R; g = progdefaults.bwsrSliderColor.G; b = progdefaults.bwsrSliderColor.B; if (fl_color_chooser("Slider Color", r, g, b) == 0) return; progdefaults.bwsrSliderColor.R = r; progdefaults.bwsrSliderColor.G = g; progdefaults.bwsrSliderColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true;} tooltip {Background color of signal viewer squelch control} xywh {47 310 60 24} align 1 code0 {bwsrSliderColor->color(fl_rgb_color(progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G,progdefaults.bwsrSliderColor.B));} } Fl_Button bwsrSldrSelColor { label Button callback {uchar r, g, b; r = progdefaults.bwsrSldrSelColor.R; g = progdefaults.bwsrSldrSelColor.G; b = progdefaults.bwsrSldrSelColor.B; if (fl_color_chooser("Button Color", r, g, b) == 0) return; progdefaults.bwsrSldrSelColor.R = r; progdefaults.bwsrSldrSelColor.G = g; progdefaults.bwsrSldrSelColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->selection_color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->selection_color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true;} tooltip {Slider hilite color of signal viewer squelch control} xywh {115 310 60 24} align 1 code0 {bwsrSldrSelColor->color(fl_rgb_color(progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G,progdefaults.bwsrSliderColor.B));} } } Fl_Group {} { label {Browser Line Colors} open xywh {192 287 326 60} box ENGRAVED_FRAME } { Fl_Button bwsrHiLite_1_color { label {HiLite 1} callback {progdefaults.bwsrHiLight1 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight1); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); viewer_redraw(); progdefaults.changed = true;} tooltip {PSK/RTTY Viewer HiLite Color 1} xywh {198 309 60 24} align 1 code0 {bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1);} code1 {\#include "Viewer.h"} } Fl_Button bwsrHiLite_2_color { label {HiLite 2} callback {progdefaults.bwsrHiLight2 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight2); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); viewer_redraw(); progdefaults.changed = true;} tooltip {PSK/RTTY Viewer HiLite Color 2} xywh {261 309 60 24} align 1 code0 {bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2);} } Fl_Button bwsrHiLite_even_lines { label Even callback {progdefaults.bwsrBackgnd2 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd2); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); viewer_redraw(); progdefaults.changed = true;;} tooltip {Even lines} xywh {324 309 60 24} align 1 code0 {bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2);} } Fl_Button bwsrHiLite_odd_lines { label Odd callback {progdefaults.bwsrBackgnd1 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd1); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); viewer_redraw(); progdefaults.changed = true;} tooltip {Odd lines} xywh {387 309 60 24} align 1 code0 {bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1);} } Fl_Button bwsrHiLite_select { label Select callback {progdefaults.bwsrSelect = fl_show_colormap((Fl_Color)progdefaults.bwsrSelect); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); viewer_redraw(); progdefaults.changed = true;} tooltip {Select line} xywh {451 309 60 24} align 1 code0 {bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect);} } } } } Fl_Group tabUserInterface { label General open xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {5 59 590 76} box ENGRAVED_FRAME } { Fl_Check_Button btnShowTooltips { label {Show tooltips} callback {progdefaults.tooltips = o->value(); Fl_Tooltip::enable(progdefaults.tooltips); progdefaults.changed = true;} tooltip {Enable / disable tooltips} xywh {75 72 120 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.tooltips);} } Fl_Check_Button chkMenuIcons { label {Show menu icons} callback {progdefaults.menuicons = o->value(); icons::toggle_icon_labels(); progdefaults.changed = true;} tooltip {Enable / disable icons on menus} xywh {219 72 150 20} down_box DOWN_BOX code0 {o->value(progdefaults.menuicons);} } Fl_Group listboxScheme { label {UI scheme} callback {progdefaults.ui_scheme = o->value(); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.changed = true;} open tooltip {Change application look and feel} xywh {193 101 80 20} box DOWN_BOX color 7 align 8 code0 {listboxScheme->add("base");} code1 {listboxScheme->add("gtk+");} code2 {listboxScheme->add("plastic");} code3 {listboxScheme->value(progdefaults.ui_scheme.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Button bVisibleModes { label {Visible modes} callback {mode_browser->label(o->label()); mode_browser->callback(toggle_visible_modes); mode_browser->show_(&progdefaults.visible_modes); progdefaults.changed = true;} tooltip {Select modes for menu access} xywh {58 101 110 20} } Fl_Group listbox_language { label {UI language} callback {progdefaults.ui_language = o->index(); progdefaults.changed = true;} open tooltip {Changes take effect on next program startup} xywh {375 101 170 20} box DOWN_BOX color 7 labelsize 12 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group {} {open xywh {5 141 590 34} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_rx_lowercase { label {Print CW / RTTY / THROB / CONTESTIA in lowercase} callback {progdefaults.rx_lowercase = o->value(); progdefaults.changed = true;} xywh {45 148 441 20} down_box DOWN_BOX code0 {o->value(progdefaults.rx_lowercase);} } } Fl_Group {} {open xywh {5 177 294 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_tx_lowercase { label {Transmit lower case text} callback {progdefaults.tx_lowercase = o->value(); progdefaults.changed = true;} xywh {40 186 199 20} down_box DOWN_BOX code0 {o->value(progdefaults.tx_lowercase);} } } Fl_Group {} { label {Exit prompts} xywh {5 244 590 76} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_save_config_on_exit { label {Prompt to save Configuration} callback {progdefaults.SaveConfig = o->value(); progdefaults.changed = true;} xywh {45 268 264 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveConfig);} } Fl_Check_Button btn2_save_macros_on_exit { label {Prompt to save macro file} callback {btn_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true;} tooltip {Write current macro set on program exit} xywh {45 290 264 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveMacros);} } Fl_Check_Button btn2NagMe { label {Prompt to save log} callback {btnNagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true;} tooltip {Bug me about saving log entries} xywh {322 268 188 20} down_box DOWN_BOX code0 {o->value(progdefaults.NagMe);} } Fl_Check_Button btn2_confirm_exit { label {Confirm exit} callback {btn2_confirm_exit->value(o->value()); progdefaults.confirmExit=o->value(); progdefaults.changed = true;} xywh {322 290 226 20} down_box DOWN_BOX code0 {o->value(progdefaults.confirmExit);} } } Fl_Group {} { label {Check for updates} open xywh {5 323 590 60} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_check_for_updates { label {Check for updates when starting program} callback {progdefaults.check_for_updates = o->value(); progdefaults.changed = true;} xywh {45 346 367 20} down_box DOWN_BOX code0 {o->value(progdefaults.check_for_updates);} } } Fl_Group {} {open xywh {300 177 295 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_tx_show_timer { label {Show TX timer} callback {progdefaults.show_tx_timer = o->value(); progdefaults.changed = true;} xywh {319 186 219 20} down_box DOWN_BOX code0 {o->value(progdefaults.show_tx_timer);} } Fl_Spinner val_tx_timeout { label {TX deadmen timeout (mins)} callback {progdefaults.tx_timeout=o->value(); progdefaults.changed = true;} xywh {320 211 45 24} align 8 minimum 0 maximum 60 value 10 code0 {o->value(progdefaults.tx_timeout);} } } } Fl_Group tabLogServer { label Log xywh {0 50 600 340} hide } { Fl_Tabs tabsLog {open xywh {0 50 600 340} } { Fl_Group grp_Log_QSO { label QSO open xywh {0 75 600 315} } { Fl_Group {} { label {QSO logging} open xywh {45 99 515 250} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnNagMe { label {Prompt to save log on exit} callback {btn2NagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true;} tooltip {Bug me about saving log entries} xywh {77 134 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.NagMe);} } Fl_Check_Button btnClearOnSave { label {Clear on save} callback {progdefaults.ClearOnSave=o->value(); progdefaults.changed = true;} tooltip {Clear log entries after saving or using macro } xywh {77 163 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.ClearOnSave);} } Fl_Check_Button btnCallUpperCase { label {Convert callsign to upper case} callback {progdefaults.calluppercase = o->value(); progdefaults.changed = true;} tooltip {Force callsign field to UPPERCASE} xywh {77 192 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.calluppercase);} } Fl_Check_Button btnAutoFillQSO { label {Auto-fill Country and Azimuth} callback {progdefaults.autofill_qso_fields = o->value(); progdefaults.changed = true;} tooltip {Fill in Country / Azimuth using cty.dat information} xywh {77 222 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.autofill_qso_fields);} } Fl_Check_Button btnDateTimeSort { label {Sort by Date/Time OFF} callback {progdefaults.sort_date_time_off = o->value(); progdefaults.changed = true; reload_browser();} tooltip {Sort by date/time OFF - effects all ADIF/Cabrillo reports} xywh {330 134 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.sort_date_time_off);} } Fl_Check_Button btndate_time_force { label {Date time ON == OFF} callback {progdefaults.force_date_time = o->value(); progdefaults.changed = true;} tooltip {Force date/time ON == date/time OFF} xywh {330 163 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.force_date_time);} } Fl_Check_Button btnRSTindefault { label {Default RST in to 599/59} callback {progdefaults.RSTin_default = o->value(); progdefaults.changed = true;} tooltip {Clear log controls sets RST in to 599/59} xywh {330 192 213 20} down_box DOWN_BOX code0 {o->value(progdefaults.RSTin_default);} } Fl_Check_Button btnRSTdefault { label {Default RST out to 599/59} callback {progdefaults.RSTdefault = o->value(); progdefaults.changed = true;} tooltip {Clear log controls sets RST out to 599/59} xywh {330 222 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.RSTdefault);} } Fl_Input txt_cty_dat_pathname { label {cty.dat folder} callback {progdefaults.cty_dat_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-name for cty.dat folder} xywh {197 283 346 24} when 1 code0 {o->value(progdefaults.cty_dat_pathname.c_str());} code1 {\#include "dxcc.h"} class Fl_Input2 } Fl_Button btn_select_cty_dat { label Browse callback {select_cty_dat_pathname();} tooltip {Locate cty.dat file} xywh {78 312 75 24} } Fl_Button btn_default_cty_dat { label Default callback {default_cty_dat_pathname();} tooltip {Restore cty.dat default folder} xywh {173 312 75 24} } Fl_Button btn_reload_cty_dat { label Reload callback {reload_cty_dat();} tooltip {Reload cty.dat} xywh {268 312 75 24} } Fl_Input inpMyPower { label {Transmit Power} callback {progdefaults.mytxpower = o->value(); progdefaults.changed = true;} tooltip {Tx power used for logbook entries} xywh {493 312 50 24} code0 {o->value(progdefaults.mytxpower.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btnDisplayLogbookRead { label {Display logbook read datum at start} callback {progdefaults.DisplayLogbookRead = o->value(); progdefaults.changed = true;} tooltip {The filename is written to the RX text area} xywh {77 252 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.DisplayLogbookRead);} } } } Fl_Group grpRX_Text { label {Rx Text} open xywh {0 75 600 315} hide } { Fl_Group {} { label {Rx Text} open xywh {2 96 596 131} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnRXClicks { label {Single-click to capture} callback {progdefaults.rxtext_clicks_qso_data = o->value(); progdefaults.changed = true;} tooltip {Enable for single click capure of text in Rx panel} xywh {62 159 191 20} down_box DOWN_BOX code0 {o->value(progdefaults.rxtext_clicks_qso_data);} } Fl_Check_Button btnRXTooltips { label {callsign tooltips in received text} callback {progdefaults.rxtext_tooltips = o->value(); progdefaults.changed = true;} tooltip {Popup info after a 2 second hover on a callsign} xywh {304 159 254 20} down_box DOWN_BOX code0 {o->value(progdefaults.rxtext_tooltips);} } Fl_Input inpNonword { label {Word delimiters} callback {progdefaults.nonwordchars = o->value(); progdefaults.changed = true;} tooltip {RX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.} xywh {204 125 279 24} textfont 4 code0 {o->value(progdefaults.nonwordchars.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btnUSunits { label {US units of distance (QRB)} callback {progdefaults.us_units = o->value(); progdefaults.changed = true;} tooltip {Enable for single click capure of text in Rx panel} xywh {304 188 220 20} down_box DOWN_BOX code0 {o->value(progdefaults.us_units);} } Fl_Check_Button btn_clear_fields { label {Clear log fields - new CALL} callback {progdefaults.clear_fields=o->value(); progdefaults.changed = true;} xywh {62 188 198 20} down_box DOWN_BOX code0 {o->value(progdefaults.clear_fields);} } } } Fl_Group grpMacLogger { label MacLogger xywh {0 75 600 315} hide } { Fl_Check_Button btnConnectToMaclogger { label {Connect to MacLogger} callback {progdefaults.connect_to_maclogger = o->value(); if (progdefaults.connect_to_maclogger == false) maclogger_close(); else maclogger_init(); progdefaults.changed = true;} xywh {10 91 186 20} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_maclogger);} code1 {\#include "maclogger.h"} } Fl_Check_Button btn_capture_maclogger_radio { label {Capture Radio Report} callback {progdefaults.capture_maclogger_radio = o->value(); progdefaults.changed = true;} xywh {205 91 186 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.capture_maclogger_radio);} } Fl_Check_Button btn_capture_maclogger_log { label {Capture Log Report} callback {progdefaults.capture_maclogger_log = o->value(); progdefaults.changed = true;} xywh {205 116 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_log);} } Fl_Check_Button btn_capture_maclogger_lookup { label {Capture Lookup } callback {progdefaults.capture_maclogger_lookup = o->value(); progdefaults.changed = true;} xywh {405 91 186 20} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_lookup);} } Fl_Check_Button btn_capture_maclogger_spot_tune { label {Capture Spot Tune} callback {progdefaults.capture_maclogger_spot_tune = o->value(); progdefaults.changed = true;} xywh {405 116 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_spot_tune);} } Fl_Check_Button btn_capture_maclogger_spot_report { label {Capture Spot Report} callback {progdefaults.capture_maclogger_spot_report = o->value(); progdefaults.changed = true;} xywh {405 144 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_spot_report);} } Fl_Check_Button btn_enable_maclogger_log { label {Enable UDP log file} callback {progdefaults.enable_maclogger_log = o->value(); progdefaults.changed = true;} xywh {10 173 165 26} down_box DOWN_BOX code0 {o->value(progdefaults.enable_maclogger_log);} } Fl_Text_Display txt_UDP_data { label {UDP data stream} xywh {10 220 580 161} align 5 code0 {Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer();} code1 {o->buffer(txtbuffer);} } Fl_Output txt_maclogger_log_filename { xywh {178 173 272 26} code0 {o->value(progdefaults.maclogger_log_filename.c_str());} } Fl_Button {} { label {Clear UDP text} callback {txt_UDP_data->buffer()->text("");} xywh {460 173 129 26} } } Fl_Group grpN3FJP_logs { label {N3FJP logs} open xywh {0 75 600 315} hide } { Fl_Text_Display txt_N3FJP_data { label {TCP/IP Data Stream} xywh {5 145 590 150} align 5 code0 {Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer();} code1 {o->buffer(txtbuffer);} } Fl_Button {} { label {Clear text} callback {txt_N3FJP_data->buffer()->text("");} xywh {501 298 90 24} } Fl_Input txt_N3FJP_ip_address { label Address callback {progdefaults.N3FJP_address = o->value(); progdefaults.changed = true;} tooltip {N3FJP Server IP Address} xywh {5 100 350 25} align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.N3FJP_address.c_str());} class Fl_Input2 } Fl_Input txt_N3FJP_ip_port_no { label Port callback {progdefaults.N3FJP_port = o->value(); progdefaults.changed = true;} tooltip {N3FJP Server IP Port} xywh {365 100 55 25} align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.N3FJP_port.c_str());} class Fl_Input2 } Fl_Button btn_default_N3FJP_ip { label Default callback {txt_N3FJP_ip_address->value("127.0.0.1"); progdefaults.N3FJP_address = "127.0.0.1"; txt_N3FJP_ip_port_no->value("1100"); progdefaults.N3FJP_port = "1100"; progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {423 100 67 25} } Fl_Check_Button btn_enable_N3FJP_log { label {Enable Data Stream} callback {progdefaults.enable_N3FJP_log = o->value(); progdefaults.changed = true;} xywh {10 297 165 26} down_box DOWN_BOX code0 {o->value(progdefaults.enable_N3FJP_log);} } Fl_Check_Button btn_connect_to_n3fjp { label Connect callback {progdefaults.connect_to_n3fjp=o->value(); progdefaults.changed=true;} xywh {495 90 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_n3fjp);} } Fl_Box box_n3fjp_connected { label Connected xywh {495 117 16 16} box DIAMOND_DOWN_BOX color 52 selection_color 58 align 8 } Fl_Check_Button btn_N3FJP_sweet_spot { label {Center DXspot freq at sweet spot} callback {progdefaults.N3FJP_sweet_spot = o->value(); progdefaults.changed = true;} tooltip {N3FJP DX spots centered on mode sweet spot} xywh {10 350 255 26} down_box DOWN_BOX code0 {o->value(progdefaults.N3FJP_sweet_spot);} } Fl_Check_Button btn_N3FJP_modem_carrier { label {Report actual modem RF frequency} callback {progdefaults.N3FJP_modem_carrier = o->value(); progdefaults.changed = true;} tooltip {Suppressed carrier +/- AF injection frequency} xywh {275 350 255 26} down_box DOWN_BOX code0 {o->value(progdefaults.N3FJP_modem_carrier);} } Fl_Check_Button btn_enable_N3FJP_RIGTX { label {PTT via and } callback {progdefaults.enable_N3FJP_RIGTX = o->value(); progdefaults.changed = true;} xywh {10 324 165 26} down_box DOWN_BOX code0 {o->value(progdefaults.enable_N3FJP_RIGTX);} } } } } Fl_Group tabLogContests { label Contests open xywh {0 50 604 340} hide } { Fl_Tabs tabs_contests {open xywh {0 50 604 340} } { Fl_Group grpGeneral_contest { label General open xywh {0 75 600 315} } { Fl_Group listbox_contest { label Contest callback {progdefaults.logging = o->index(); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[progdefaults.SQSOcontest].notes; progdefaults.SQSOinstate = (QSOparties.qso_parties[progdefaults.SQSOcontest].instate[0] == 'T'); } else { listbox_QP_contests->index(0); progdefaults.CONTESTnotes = contests[progdefaults.logging].notes; } inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true;} open tooltip {Select Logging as QSO or Contest} xywh {86 84 500 24} box DOWN_BOX color 7 align 4 code0 {\#include "contest.h"} code1 {o->add(contest_names().c_str());} code2 {o->index(progdefaults.logging);} class Fl_ListBox } {} Fl_Group listbox_QP_contests { label {State QSO Party} callback {int n = o->index(); progdefaults.SQSOcontest = n; progdefaults.SQSOinstate = (QSOparties.qso_parties[n].instate[0] == 'T'); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[n].notes; inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); } else inp_contest_notes->value(""); adjust_for_contest(0); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true;} open xywh {166 118 420 24} box DOWN_BOX color 7 align 4 code0 {\#include "contest.h"} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->add(QSOparties.names().c_str());} code3 {o->index(progdefaults.SQSOcontest);} class Fl_ListBox } {} Fl_Input inp_contest_notes { label {Text capture order} tooltip {Context Notes} xywh {166 153 420 24} code0 {o->value(progdefaults.CONTESTnotes.c_str());} class Fl_Input2 } Fl_Group {} { label {Duplicate check, CALL plus} open xywh {3 192 590 86} box ENGRAVED_FRAME align 21 } { Fl_Light_Button btnDupCheckOn { label {On/Off} callback {progdefaults.EnableDupCheck = o->value(); progdefaults.changed = true;} tooltip {Check for duplicates} xywh {20 217 74 20} selection_color 2 code0 {o->value(progdefaults.EnableDupCheck);} } Fl_Check_Button btnDupBand { label Band callback {progdefaults.dupband = o->value(); progdefaults.changed = true;} tooltip {Bands must match} xywh {132 217 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupband);} } Fl_Check_Button btnDupMode { label Mode callback {progdefaults.dupmode = o->value(); progdefaults.changed = true;} tooltip {Mode must match} xywh {245 217 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupmode);} } Fl_Check_Button btnDupTimeSpan { label {Time span over} callback {progdefaults.duptimespan=(int)o->value(); progdefaults.changed = true;} tooltip {QSO must not occur within a time period of} xywh {370 217 129 20} down_box DOWN_BOX code0 {o->value(progdefaults.duptimespan);} } Fl_Button btnDupColor { label {Dup Color} callback {fl_color_chooser("Dup Check", progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); o->color( fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); o->redraw(); progdefaults.changed = true;} tooltip {Left click to select dup color} xywh {20 244 90 24} box DOWN_BOX down_box DOWN_BOX color 7 selection_color 7 code0 {o->color(fl_rgb_color(progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B));} code1 {\#include } } Fl_Button btnPossibleDupColor { label {? Dup Color} callback {fl_color_chooser("Possible_Dup Check", progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B); o->color( fl_rgb_color( progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B)); o->redraw(); progdefaults.changed = true;} tooltip {Left click to select possible dup color} xywh {132 244 90 24} box DOWN_BOX down_box DOWN_BOX color 7 selection_color 7 code0 {o->color(fl_rgb_color(progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B));} code1 {\#include } } Fl_Check_Button btnDupXchg1 { label {Exchange In} callback {progdefaults.dupxchg1 = o->value(); progdefaults.changed = true;} tooltip {free form 1 must match} xywh {245 246 105 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupxchg1);} } Fl_Check_Button btnDupState { label State callback {progdefaults.dupstate = o->value(); progdefaults.changed = true;} tooltip {State must match} xywh {370 246 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupstate);} } Fl_Value_Input nbrTimeSpan { label minutes callback {progdefaults.timespan = (int)o->value(); progdefaults.changed = true;} tooltip {Enter time span in minutes} xywh {463 244 53 24} align 8 maximum 1440 step 1 value 120 code0 {o->value(progdefaults.timespan);} class Fl_Value_Input2 } } Fl_Group {} { label {Contest Exchange / Serial \#} open xywh {3 276 590 100} box ENGRAVED_FRAME align 21 } { Fl_Input inpSend1 { label Send callback {progdefaults.myXchg=o->value(); progdefaults.changed = true;} tooltip {free form exchange} xywh {68 300 200 24} code0 {o->value(progdefaults.myXchg.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btn599 { label {RST always 599/59} callback {progdefaults.fixed599 = o->value(); progdefaults.changed = true;} tooltip {Force RST in/out to 599/59} xywh {283 302 130 20} down_box DOWN_BOX code0 {o->value(progdefaults.fixed599);} } Fl_Check_Button btnCutNbrs { label {Send CW cut \#'s} callback {progdefaults.cutnbrs=o->value(); progdefaults.changed = true;} tooltip {0 = T; 9 = N} xywh {443 302 139 20} down_box DOWN_BOX code0 {o->value(progdefaults.cutnbrs);} } Fl_Group {} {open xywh {10 329 576 42} box ENGRAVED_FRAME } { Fl_Value_Input nbrContestStart { label {Start Nbr} callback {progdefaults.ContestStart = (int)o->value(); progdefaults.changed = true;} tooltip {Starting number} xywh {97 338 45 24} maximum 10000 step 1 code0 {o->value(progdefaults.ContestStart);} class Fl_Value_Input2 } Fl_Value_Input nbrContestDigits { label Digits callback {progdefaults.ContestDigits = (int)o->value(); progdefaults.changed = true;} tooltip {Number of digits in serial number} xywh {219 338 46 24} minimum 1 maximum 5 step 1 value 3 class Fl_Value_Input2 } Fl_Check_Button btnUseLeadingZeros { label {Use leading zeros} callback {progdefaults.UseLeadingZeros = o->value(); progdefaults.changed = true;} tooltip {Insert leading zeros into Xmtd serial number} xywh {284 340 157 20} down_box DOWN_BOX value 1 } Fl_Button btnResetSerNbr { label Reset callback {cb_ResetSerNbr();} tooltip {Initialize the QSO logging fields} xywh {481 338 71 24} } } } } Fl_Group grpFD_contest { label {Field Day} xywh {0 75 600 315} hide } { Fl_Group {} { label {Field Day} open xywh {5 88 590 53} box ENGRAVED_BOX align 21 } { Fl_Input inp_my_FD_call { label {Operator Call} callback {progdefaults.fd_op_call=o->value(); progdefaults.changed = true;} tooltip {Field Day Callsign May be same as OP callsign} xywh {176 104 80 24} code0 {o->value(progdefaults.fd_op_call.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inp_my_FD_section { label {My Section} callback {progdefaults.my_FD_section=o->value(); progdefaults.changed = true;} tooltip {Field Day Section} xywh {484 104 45 24} code0 {o->value(progdefaults.my_FD_section.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inp_my_FD_class { label {My Class} callback {progdefaults.my_FD_class=o->value(); progdefaults.changed = true;} tooltip {Field Day Class} xywh {337 104 50 24} code0 {o->value(progdefaults.my_FD_class.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } } Fl_Group grpJOTA_contest { label {JOTA/School} open xywh {0 75 600 315} hide } { Fl_Group {} { label {School Round Up} open xywh {10 179 580 53} box ENGRAVED_BOX align 21 } { Fl_Input inp_my_SCR_class { label {My Class} callback {progdefaults.my_SCR_class=o->value(); progdefaults.changed = true;} tooltip {School Round Up - allowable I, H, O - see rules} xywh {196 201 69 24} code0 {o->value(progdefaults.my_SCR_class.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group {} { label {Jamboree OTA} open xywh {10 86 580 89} box ENGRAVED_BOX align 21 } { Fl_Input inp_my_JOTA_troop { label {My Troop} callback {progdefaults.my_JOTA_troop=o->value(); progdefaults.changed = true;} tooltip {My JOTA Troop} xywh {195 109 200 24} code0 {o->value(progdefaults.my_JOTA_troop.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inp_my_JOTA_scout { label {Scout Op'} callback {progdefaults.my_JOTA_scout = o->value(); progdefaults.changed=true;} tooltip {Scout Operator Name} xywh {195 140 200 24} code0 {o->value(progdefaults.my_JOTA_scout.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } } } } Fl_Group tabMBars { label Macros xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {5 240 590 35} box ENGRAVED_FRAME } { Fl_Check_Button btnMacroMouseWheel { label {Mouse wheel active on macro buttons} callback {progdefaults.macro_wheel = o->value(); progdefaults.changed = true;} tooltip {enable mouse wheel control of macro bar} xywh {62 248 296 20} down_box DOWN_BOX code0 {o->value(progdefaults.macro_wheel);} } } Fl_Group {} { label {Number and position of macro bars} open xywh {5 60 590 180} box ENGRAVED_FRAME align 21 } { Fl_Counter cnt_macro_height { label {Button Height} callback {progdefaults.macro_height = (int)o->value(); progdefaults.changed = true; set_macroLabels(); UI_select();} tooltip {Height of macro bar} xywh {215 85 89 22} type Simple align 8 minimum 18 maximum 30 step 1 value 20 code0 {o->value(progdefaults.macro_height);} } Fl_Round_Button btn_scheme_0 { label {One above Rx/Tx} callback {progdefaults.mbar_scheme = 0; set_macroLabels(); UI_select(); progdefaults.changed = true;} tooltip {Single macro bar below logging panel variable height} xywh {61 113 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_1 { label {One above waterfall} callback {progdefaults.mbar_scheme = 1; set_macroLabels(); UI_select(); progdefaults.changed = true;} xywh {61 138 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_2 { label {One below waterfall} callback {progdefaults.mbar_scheme = 2; set_macroLabels(); UI_select(); progdefaults.changed = true;} xywh {61 163 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_3 { label {Two scheme 1} callback {progdefaults.mbar_scheme = 3; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {228 113 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_4 { label {Two scheme 2} callback {progdefaults.mbar_scheme = 4; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {396 113 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_5 { label {Two scheme 3} callback {progdefaults.mbar_scheme = 5; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {228 138 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_6 { label {Two scheme 4} callback {progdefaults.mbar_scheme = 6; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {396 138 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_7 { label {Two scheme 5} callback {progdefaults.mbar_scheme = 7; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {228 163 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_8 { label {Two scheme 6} callback {progdefaults.mbar_scheme = 8; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {396 163 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_9 { label {Two scheme 7} callback {progdefaults.mbar_scheme = 9; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {228 188 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_10 { label {Two scheme 8} callback {progdefaults.mbar_scheme = 10; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {396 188 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_11 { label {Two scheme 9} callback {progdefaults.mbar_scheme = 11; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {228 213 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_12 { label {Two scheme 10} callback {progdefaults.mbar_scheme = 12; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {396 213 144 22} type Radio down_box ROUND_DOWN_BOX } } Fl_Group {} {open xywh {5 275 590 55} box ENGRAVED_FRAME } { Fl_Check_Button btnUseLastMacro { label {Load last used macro file at start} callback {progdefaults.UseLastMacro = o->value(); update_main_title(); progdefaults.changed = true;} tooltip {ON - use last set of macros OFF - use default set} xywh {62 280 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseLastMacro);} } Fl_Check_Button btnDisplayMacroFilename { label {Display macro filename at start} callback {progdefaults.DisplayMacroFilename = o->value(); progdefaults.changed = true;} tooltip {The filename is written to the RX text area} xywh {62 302 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.DisplayMacroFilename);} } Fl_Check_Button btn_save_macros_on_exit { label {Prompt to save macro file} callback {btn2_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true;} tooltip {Write current macro set on program exit} xywh {345 280 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveMacros);} } } Fl_Group {} {open xywh {5 330 295 45} box ENGRAVED_FRAME } { Fl_Check_Button btn_macro_post { label {Show macro control codes} callback {progdefaults.macro_post = o->value(); progdefaults.changed = true;} tooltip {print ^! execution codes in Rx panel} xywh {65 342 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.macro_post);} } } Fl_Group {} {open xywh {300 330 295 45} box ENGRAVED_FRAME } { Fl_Check_Button btn_4bar_position { label {4 bar macro set below Tx} callback {progdefaults.four_bar_position = o->value(); UI_select(); progdefaults.changed = true;} tooltip {Position the 4 bar macro set below Tx panel Default above Rx panel} xywh {332 342 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.four_bar_position);} } } } Fl_Group tabWF_UI { label {WF Ctrls} xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {52 83 496 253} box ENGRAVED_BOX } { Fl_Box {} { label {Enable check box to show each respective operator control} xywh {81 90 446 25} box FLAT_BOX align 16 } Fl_Check_Button btnWF_UIrev { label Reverse callback {progdefaults.WF_UIrev = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 123 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIrev);} } Fl_Check_Button btnWF_UIx1 { label {WF Magnification} callback {progdefaults.WF_UIx1 = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 123 162 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIx1);} } Fl_Check_Button btnWF_UIwfcarrier { label {WF carrier} callback {progdefaults.WF_UIwfcarrier = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 154 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfcarrier);} } Fl_Check_Button btnWF_UIwfshift { label {WF Shift Controls} callback {progdefaults.WF_UIwfshift = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 154 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfshift);} } Fl_Check_Button btnWF_UIwfreflevel { label {WF ref level} callback {progdefaults.WF_UIwfreflevel = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 186 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfreflevel);} } Fl_Check_Button btnWF_UIwfdrop { label {WF drop rate} callback {progdefaults.WF_UIwfdrop = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 186 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfdrop);} } Fl_Check_Button btnWF_UIwfampspan { label {WF amp span} callback {progdefaults.WF_UIwfampspan = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 218 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfampspan);} } Fl_Check_Button btnWF_UIwfstore { label {WF Store} callback {progdefaults.WF_UIwfstore = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 218 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfstore);} } Fl_Check_Button btnWF_UIwfmode { label {WF mode} callback {progdefaults.WF_UIwfmode = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 250 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfmode);} } Fl_Check_Button btnWF_UIqsy { label QSY callback {progdefaults.WF_UIqsy = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 250 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIqsy);} } Fl_Check_Button btnWF_UIxmtlock { label {XMT lock} callback {progdefaults.WF_UIxmtlock = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 282 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIxmtlock);} } Fl_Button btn_wf_enable_all { label {Enable all} callback {btnWF_UIrev->value(progdefaults.WF_UIrev = 1); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 1); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 1); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 1); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 1); btnWF_UIx1->value(progdefaults.WF_UIx1 = 1); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 1); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 1); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 1); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 1); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 1); progdefaults.changed = true; WF_UI();} xywh {152 305 88 20} } Fl_Button btn_wf_disable_all { label {Disable all} callback {btnWF_UIrev->value(progdefaults.WF_UIrev = 0); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 0); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 0); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 0); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 0); btnWF_UIx1->value(progdefaults.WF_UIx1 = 0); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 0); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 0); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 0); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 0); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 0); progdefaults.changed = true; WF_UI();} xywh {351 305 88 20} } } } Fl_Group tabColorsFonts { label {Clrs/Fnts} open xywh {0 50 600 340} hide } { Fl_Tabs tabsColors {open xywh {0 50 600 340} } { Fl_Group {} { label {Rx/Tx} open xywh {0 75 600 315} hide } { Fl_Group listbox_charset_status { label {Rx/Tx Character set} open tooltip {Select Rx/Tx Character Set} xywh {96 90 165 24} box BORDER_BOX color 55 align 8 code0 {\#include "fl_digi.h"} code1 {o->labelsize(FL_NORMAL_SIZE); listbox_charset_status->callback(cb_listbox_charset, 0);} class Fl_ListBox } {} Fl_Input RxText { xywh {96 121 220 36} code0 {RxText->value("Receive Text");} code1 {RxText->color(fl_rgb_color(progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B));} code2 {RxText->textfont(progdefaults.RxFontnbr); RxText->textsize(progdefaults.RxFontsize); RxText->textcolor(progdefaults.RxFontcolor);} code3 {RxText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnRxColor { label {Rx bkgnd} callback {uchar r, g, b; r = progdefaults.RxColor.R; g = progdefaults.RxColor.G; b = progdefaults.RxColor.B; if (!fl_color_chooser("Rx Color", r, g, b)) return; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; RxText->color(fl_rgb_color(r,g,b)); ReceiveText->color(RxText->color()); RxText->redraw(); ReceiveText->redraw(); progdefaults.changed = true;} xywh {326 128 75 21} } Fl_Button btnTxColor { label {Tx bkgnd} callback {uchar r, g, b; r = progdefaults.TxColor.R; g = progdefaults.TxColor.G; b = progdefaults.TxColor.B; if (!fl_color_chooser("Tx Color", r, g, b)) return; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(fl_rgb_color(r,g,b)); TransmitText->color(TxText->color()); TxText->redraw(); TransmitText->redraw(); progdefaults.changed = true;} xywh {326 171 75 21} } Fl_Input TxText { xywh {96 163 220 37} code0 {TxText->value("Transmit Text");} code1 {TxText->color(fl_rgb_color(progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B));} code2 {TxText->textfont(progdefaults.TxFontnbr); TxText->textsize(progdefaults.TxFontsize); TxText->textcolor(progdefaults.TxFontcolor);} code3 {TxText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnRxFont { label {Rx font} callback {font_browser->fontNumber(progdefaults.RxFontnbr); font_browser->fontSize(progdefaults.RxFontsize); font_browser->fontColor(progdefaults.RxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbRxFontBrowser); font_browser->show();} xywh {411 128 75 21} } Fl_Button btnTxFont { label {Tx font} callback {font_browser->fontNumber(progdefaults.TxFontnbr); font_browser->fontSize(progdefaults.TxFontsize); font_browser->fontColor(progdefaults.TxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbTxFontBrowser); font_browser->show();} xywh {411 171 75 21} } Fl_Input MacroText { xywh {96 206 220 37} code0 {MacroText->value("Macro editor text");} code1 {MacroText->textfont(progdefaults.MacroEditFontnbr);} code2 {MacroText->textsize(progdefaults.MacroEditFontsize);} code3 {MacroText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnMacroEditFont { label {Macro Edit Font} callback {font_browser->fontNumber(progdefaults.MacroEditFontnbr); font_browser->fontSize(progdefaults.MacroEditFontsize); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroEditFontBrowser); font_browser->show();} xywh {326 214 120 21} } Fl_Group {} { label {Text Highlighting} open xywh {86 253 404 81} box ENGRAVED_FRAME align 17 } { Fl_Button btnXMIT { label XMIT callback {choose_color(progdefaults.XMITcolor); btnXMIT->color( progdefaults.XMITcolor ); btnXMIT->redraw(); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); progdefaults.changed = true;} tooltip {Sent chars in Rx/Tx pane} xywh {104 281 40 21} align 2 code0 {btnXMIT->color(progdefaults.XMITcolor);} } Fl_Button btnCTRL { label CTRL callback {choose_color(progdefaults.CTRLcolor); btnCTRL->color( progdefaults.CTRLcolor ); btnCTRL->redraw(); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); progdefaults.changed = true;} tooltip {Control chars in Rx/Tx pane} xywh {147 281 40 21} align 2 code0 {btnCTRL->color(progdefaults.CTRLcolor);} } Fl_Button btnSKIP { label SKIP callback {choose_color(progdefaults.SKIPcolor); btnSKIP->color( progdefaults.SKIPcolor ); btnSKIP->redraw(); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); progdefaults.changed = true;} tooltip {Skipped chars in Tx pane (Tx on/off in CW)} xywh {191 281 40 21} align 2 code0 {btnSKIP->color(progdefaults.SKIPcolor);} } Fl_Button btnALTR { label ALTR callback {choose_color(progdefaults.ALTRcolor); btnALTR->color( progdefaults.ALTRcolor ); btnALTR->redraw(); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); progdefaults.changed = true;} tooltip {Alternate character color in Rx panelr} xywh {234 281 40 21} align 2 code0 {btnALTR->color(progdefaults.ALTRcolor);} } Fl_Button btnSEL { label SEL callback {choose_color(progdefaults.RxTxSelectcolor); btnSEL->color( progdefaults.RxTxSelectcolor ); btnSEL->redraw(); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); progdefaults.changed = true;} tooltip {Selection background color in Rx Tx panels} xywh {278 281 39 21} align 2 code0 {btnSEL->color(progdefaults.RxTxSelectcolor);} } Fl_Button btnNoTextColor { label System callback {uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true;} xywh {325 281 70 21} } Fl_Button btnTextDefaults { label Defaults callback {uchar r, g, b; Fl_Color clr; progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); r = 255; g = 242; b = 190; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); r = 200; g = 235; b = 255; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; clr = fl_rgb_color(r,g,b); TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true;} xywh {399 281 70 21} } } Fl_Check_Button btn_show_all_codes { label {display Rx control chars as ascii string} callback {progdefaults.show_all_codes=o->value(); progdefaults.changed = true;} xywh {110 345 25 25} down_box DOWN_BOX code0 {o->value(progdefaults.show_all_codes);} } } Fl_Group {} { label {FreqDisp / Meters} xywh {0 75 600 315} hide } { Fl_Group {} {open xywh {115 108 395 87} box ENGRAVED_FRAME } { Fl_Box FDdisplay { label {14070.150} xywh {195 112 235 45} box DOWN_BOX color 55 labelfont 4 labelsize 40 code0 {o->color(fl_rgb_color(progdefaults.FDbackground.R,progdefaults.FDbackground.G,progdefaults.FDbackground.B));} code1 {o->labelcolor(fl_rgb_color(progdefaults.FDforeground.R,progdefaults.FDforeground.G,progdefaults.FDforeground.B));} code2 {o->labelfont(progdefaults.FreqControlFontnbr);} } Fl_Button btn_freq_control_font { label Font callback {font_browser->fontNumber(progdefaults.FreqControlFontnbr); font_browser->fontSize(14); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbFreqControlFontBrowser); font_browser->show();} xywh {122 163 90 24} } Fl_Button btnBackgroundColor { label {Bg Color} callback {uchar r, g, b; r = progdefaults.FDbackground.R; g = progdefaults.FDbackground.G; b = progdefaults.FDbackground.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {218 163 90 24} } Fl_Button btnForegroundColor { label {Digit Color} callback {uchar r, g, b; r = progdefaults.FDforeground.R; g = progdefaults.FDforeground.G; b = progdefaults.FDforeground.B; if (!fl_color_chooser("Foreground", r, g, b)) return; progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; FDdisplay->labelcolor(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {314 163 90 24} } Fl_Button btnFD_SystemColor { label {Sys Colors} callback {uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(clr); clr = FL_FOREGROUND_COLOR; Fl::get_color(clr, r, g, b); FDdisplay->labelcolor(clr); FDdisplay->redraw(); progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {410 163 90 24} } } Fl_Group {} { label {S-meter} open xywh {115 199 395 62} box ENGRAVED_FRAME align 21 } { Fl_Button btnSmeter_bg_color { label {Bg Color} callback {uchar r, g, b; r = progdefaults.Smeter_bg_color.R; g = progdefaults.Smeter_bg_color.G; b = progdefaults.Smeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.Smeter_bg_color.R = r; progdefaults.Smeter_bg_color.G = g; progdefaults.Smeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {122 226 90 24} } Fl_Button btnSmeter_scale_color { label {Scale Color} callback {uchar r, g, b; r = progdefaults.Smeter_scale_color.R; g = progdefaults.Smeter_scale_color.G; b = progdefaults.Smeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.Smeter_scale_color.R = r; progdefaults.Smeter_scale_color.G = g; progdefaults.Smeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {218 226 90 24} } Fl_Button btnSmeter_meter_color { label {Meter Color} callback {uchar r, g, b; r = progdefaults.Smeter_meter_color.R; g = progdefaults.Smeter_meter_color.G; b = progdefaults.Smeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.Smeter_meter_color.R = r; progdefaults.Smeter_meter_color.G = g; progdefaults.Smeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {314 226 90 24} } } Fl_Group {} { label {PWR-meter} open xywh {115 268 395 67} box ENGRAVED_FRAME align 21 } { Fl_Button btnPWR_bg_color { label {Bg Color} callback {uchar r, g, b; r = progdefaults.PWRmeter_bg_color.R; g = progdefaults.PWRmeter_bg_color.G; b = progdefaults.PWRmeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.PWRmeter_bg_color.R = r; progdefaults.PWRmeter_bg_color.G = g; progdefaults.PWRmeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {122 295 90 24} } Fl_Button btnPWR_scale_color { label {Scale Color} callback {uchar r, g, b; r = progdefaults.PWRmeter_scale_color.R; g = progdefaults.PWRmeter_scale_color.G; b = progdefaults.PWRmeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.PWRmeter_scale_color.R = r; progdefaults.PWRmeter_scale_color.G = g; progdefaults.PWRmeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {218 295 90 24} } Fl_Button btnPWR_meter_Color { label {Meter Color} callback {uchar r, g, b; r = progdefaults.PWRmeter_meter_color.R; g = progdefaults.PWRmeter_meter_color.G; b = progdefaults.PWRmeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.PWRmeter_meter_color.R = r; progdefaults.PWRmeter_meter_color.G = g; progdefaults.PWRmeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {314 295 90 24} } Fl_Group listboxPWRselect { label {Power scale} callback {progdefaults.PWRselect = o->index(); set_smeter_colors(); progdefaults.changed = true;} open tooltip {Select the type of FFT prefilter} xywh {410 295 80 24} box DOWN_BOX color 7 code0 {o->add(_("25 W")); o->add("50 W");} code1 {o->add("100 W"); o->add("200 W"); o->add("AUTO");} code3 {o->index(progdefaults.PWRselect);o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } Fl_Group {} { label Log open xywh {0 75 600 315} hide } { Fl_Group {} { label {Logging Panel Controls} open xywh {5 101 590 65} box ENGRAVED_FRAME align 21 } { Fl_Output LOGGINGdisplay { xywh {33 125 184 25} code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGGINGtextcolor);} code1 {o->color(progdefaults.LOGGINGcolor);} code2 {o->value("W1HKJ");} code3 {o->redraw();} } Fl_Button btnLOGGING_color { label {Bg Color} callback {uchar r, g, b; Fl::get_color(progdefaults.LOGGINGcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGGINGcolor = fl_rgb_color(r, g, b); LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true;} xywh {276 125 80 25} } Fl_Button btn_LOGGING_font { label Font callback {font_browser->fontNumber(progdefaults.LOGGINGtextfont); font_browser->fontSize(progdefaults.LOGGINGtextsize); font_browser->fontColor(progdefaults.LOGGINGtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGGINGFontBrowser); font_browser->show();} xywh {366 125 55 25} } Fl_Button btnLOGGINGdefault_colors_font { label Default callback {progdefaults.LOGGINGcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGGINGtextfont = (Fl_Font)0; progdefaults.LOGGINGtextsize = 14; progdefaults.LOGGINGtextcolor = FL_BLACK; LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->textsize(progdefaults.LOGGINGtextsize); LOGGINGdisplay->textcolor(progdefaults.LOGGINGtextcolor); LOGGINGdisplay->textfont(progdefaults.LOGGINGtextfont); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true;} xywh {432 125 80 25} } } Fl_Group {} { label {Logbook Dialog} open xywh {5 167 590 65} box ENGRAVED_FRAME align 21 } { Fl_Output LOGBOOKdisplay { xywh {33 191 184 25} code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGBOOKtextcolor);} code1 {o->color(progdefaults.LOGBOOKcolor);} code2 {o->value("14.070000");} code3 {o->redraw();} } Fl_Button btnLOGBOOK_color { label {Bg Color} callback {uchar r, g, b; Fl::get_color(progdefaults.LOGBOOKcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGBOOKcolor = fl_rgb_color(r, g, b); LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {275 191 80 25} } Fl_Button btn_LOGBOOK_font { label Font callback {font_browser->fontNumber(progdefaults.LOGBOOKtextfont); font_browser->fontSize(progdefaults.LOGBOOKtextsize); font_browser->fontColor(progdefaults.LOGBOOKtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGBOOKFontBrowser); font_browser->show();} xywh {365 191 55 25} } Fl_Button btnLOGBOOKdefault_colors_font { label Default callback {progdefaults.LOGBOOKcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGBOOKtextfont = (Fl_Font)0; progdefaults.LOGBOOKtextsize = 14; progdefaults.LOGBOOKtextcolor = FL_BLACK; LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->textsize(progdefaults.LOGBOOKtextsize); LOGBOOKdisplay->textcolor(progdefaults.LOGBOOKtextcolor); LOGBOOKdisplay->textfont(progdefaults.LOGBOOKtextfont); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {431 191 80 25} } } Fl_Group {} { label {DX Cluster Dialog} open xywh {5 236 590 147} box ENGRAVED_FRAME align 21 } { Fl_Output DXC_display { label {Report Browser} xywh {33 271 184 25} align 5 code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);} code2 {o->value("DX de W1HKJ-1");} code3 {o->redraw();} } Fl_Button btn_DXC_font { label Font callback {font_browser->fontNumber(progdefaults.DXC_textfont); font_browser->fontSize(progdefaults.DXC_textsize); font_browser->fontColor(progdefaults.DXC_textcolor); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbDXC_FontBrowser); font_browser->show();} xywh {222 271 86 25} } Fl_Button btnDXCdefault_colors_font { label Default callback {progdefaults.DXC_textfont = FL_COURIER; progdefaults.DXC_textsize = 14; progdefaults.DXC_textcolor = FL_BLACK; progdefaults.DXC_even_color = 7; progdefaults.DXC_odd_color = 246; DXC_display->textsize(progdefaults.DXC_textsize); DXC_display->textcolor(progdefaults.DXC_textcolor); DXC_display->textfont(progdefaults.DXC_textfont); DXC_display->redraw();} xywh {314 271 86 25} } Fl_Button btn_DXC_even_lines { label {Even Lines} callback {progdefaults.DXC_even_color = fl_show_colormap((Fl_Color)progdefaults.DXC_even_color); o->color(progdefaults.DXC_even_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true} xywh {222 302 86 25} color 55 code0 {o->color(progdefaults.DXC_even_color);} } Fl_Button btn_DXC_odd_lines { label {Odd Lines} callback {progdefaults.DXC_odd_color = fl_show_colormap((Fl_Color)progdefaults.DXC_odd_color); o->color(progdefaults.DXC_odd_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true} xywh {314 302 86 25} color 246 code0 {o->color(progdefaults.DXC_odd_color);} } Fl_Input StreamText { label {Stream Text} xywh {33 341 184 25} align 5 code0 {o->value("DX de W1HKJ...");} code1 {o->color(fl_rgb_color(progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B));} code2 {o->textfont(progdefaults.DXfontnbr); o->textsize(progdefaults.DXfontsize); o->textcolor(progdefaults.DXfontcolor);} } Fl_Button btnDXcolor { label {Bg color} callback {uchar r, g, b; r = progdefaults.DX_Color.R; g = progdefaults.DX_Color.G; b = progdefaults.DX_Color.B; if (!fl_color_chooser("DX Color", r, g, b)) return; progdefaults.DX_Color.R = r; progdefaults.DX_Color.G = g; progdefaults.DX_Color.B = b; StreamText->color(fl_rgb_color(r,g,b)); StreamText->redraw(); brws_tcpip_stream->color(fl_rgb_color(r,g,b)); brws_tcpip_stream->redraw(); brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); brws_dxcluster_hosts->redraw(); brws_dxc_help->color(fl_rgb_color(r,g,b)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); ed_telnet_cmds->color(fl_rgb_color(r,g,b)); ed_telnet_cmds->redraw(); dxcluster_hosts_load(); progdefaults.changed = true;} xywh {222 341 86 25} } Fl_Button btnDXfont { label Font callback {font_browser->fontNumber(progdefaults.DXfontnbr); font_browser->fontSize(progdefaults.DXfontsize); font_browser->fontColor(progdefaults.DXfontcolor); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbDXfont_browser); font_browser->show();} xywh {314 341 86 25} } Fl_Button btnDXalt_color { label {Alt Color} callback {choose_color(progdefaults.DXalt_color); o->labelcolor(progdefaults.DXalt_color); o->redraw_label(); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); progdefaults.changed = true;} tooltip {Color for outgoing telnet text} xywh {406 340 86 25} code0 {o->labelcolor(progdefaults.DXalt_color);} } Fl_Button btnDXdefault_colors_font { label Default callback {progdefaults.DX_Color.R = 255; progdefaults.DX_Color.G = 255; progdefaults.DX_Color.B = 255; progdefaults.DXfontnbr = FL_COURIER; progdefaults.DXfontsize = 14; progdefaults.DXfontcolor = FL_BLACK; progdefaults.DXalt_color = fl_rgb_color(200, 0, 0); btnDXalt_color->labelcolor(progdefaults.DXalt_color); btnDXalt_color->redraw_label(); brws_tcpip_stream->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_tcpip_stream->setFont(progdefaults.DXfontnbr); brws_tcpip_stream->setFontSize(progdefaults.DXfontsize); brws_tcpip_stream->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); ed_telnet_cmds->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); ed_telnet_cmds->setFont(progdefaults.DXfontnbr); ed_telnet_cmds->setFontSize(progdefaults.DXfontsize); ed_telnet_cmds->setFontColor(progdefaults.DXfontcolor); ed_telnet_cmds->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); StreamText->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); StreamText->textcolor(progdefaults.DXfontcolor); StreamText->redraw(); dxcluster_hosts_load(); font_browser->hide(); progdefaults.changed = true;} xywh {500 340 86 25} } } } Fl_Group {} { label F_keys xywh {0 75 600 315} hide } { Fl_Check_Button btnUseGroupColors { label {Use colored buttons} callback {progdefaults.useGroupColors = o->value(); colorize_macros(); progdefaults.changed = true;} xywh {135 107 165 21} down_box DOWN_BOX code0 {btnUseGroupColors->value(progdefaults.useGroupColors);} } Fl_Button btnGroup1 { label {Group 1} callback {uchar r, g, b; r = progdefaults.btnGroup1.R; g = progdefaults.btnGroup1.G; b = progdefaults.btnGroup1.B; if (fl_color_chooser("Group 1", r, g, b) == 0) return; progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 1} xywh {103 155 90 30} code0 {btnGroup1->color(fl_rgb_color(progdefaults.btnGroup1.R, progdefaults.btnGroup1.G,progdefaults.btnGroup1.B));} code1 {btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor);} } Fl_Button btnGroup2 { label {Group 2} callback {uchar r, g, b; r = progdefaults.btnGroup2.R; g = progdefaults.btnGroup2.G; b = progdefaults.btnGroup2.B; if (fl_color_chooser("Group 2", r, g, b) == 0) return; progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 2} xywh {205 155 90 30} code0 {btnGroup2->color(fl_rgb_color(progdefaults.btnGroup2.R, progdefaults.btnGroup2.G,progdefaults.btnGroup2.B));} code1 {btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor);} } Fl_Button btnGroup3 { label {Group 3} callback {uchar r, g, b; r = progdefaults.btnGroup3.R; g = progdefaults.btnGroup3.G; b = progdefaults.btnGroup3.B; if (fl_color_chooser("Group 3", r, g, b) == 0) return; progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 3} xywh {307 155 90 30} code0 {btnGroup3->color(fl_rgb_color(progdefaults.btnGroup3.R, progdefaults.btnGroup3.G,progdefaults.btnGroup3.B));} code1 {btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor);} } Fl_Button btnFkeyDEfaults { label Defaults callback {uchar r, g, b; Fl_Color clr; r = 80; g = 144; b = 144; clr = fl_rgb_color(r,g,b); btnGroup1->color(clr); progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; r = 144; g = 80; b = 80; clr = fl_rgb_color(r,g,b); btnGroup2->color(clr); progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; r = 80; g = 80; b = 144; clr = fl_rgb_color(r,g,b); btnGroup3->color(clr); progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; progdefaults.MacroBtnFontcolor = FL_BLACK; progdefaults.MacroBtnFontnbr = FL_HELVETICA; progdefaults.MacroBtnFontsize = 12; btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->redraw_label(); btnGroup3->redraw_label(); colorize_macros(); progdefaults.changed = true;} xywh {410 155 90 30} } Fl_Button btnMacroBtnFont { label {Font/Color} callback {font_browser->fontNumber(progdefaults.MacroBtnFontnbr); font_browser->fontSize(progdefaults.MacroBtnFontsize); font_browser->fontColor(progdefaults.MacroBtnFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroBtnFontBrowser); font_browser->show();} xywh {307 102 90 30} } } Fl_Group {} { label Tabs open xywh {0 75 600 315} hide } { Fl_Button btnTabColor { label {Tab Color} callback {progdefaults.TabsColor = fl_show_colormap(progdefaults.TabsColor); setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {200 113 75 21} } Fl_Button btnTabDefaultColor { label System callback {progdefaults.TabsColor = FL_BACKGROUND2_COLOR; setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {330 113 75 21} } } Fl_Group {} { label Buttons open xywh {0 75 600 315} } { Fl_Button btnSpotColor { label Spot callback {progdefaults.SpotColor = fl_show_colormap(progdefaults.SpotColor); spotcolor->color(progdefaults.SpotColor); spotcolor->redraw(); spot_selection_color(); progdefaults.changed = true;} xywh {139 121 85 21} } Fl_Button btnRevColor { label Rev callback {progdefaults.RevColor = fl_show_colormap(progdefaults.RevColor); revcolor->color(progdefaults.RevColor); revcolor->redraw(); rev_selection_color(); progdefaults.changed = true;} xywh {139 157 85 21} } Fl_Button btnTuneColor { label Tune callback {progdefaults.TuneColor = fl_show_colormap(progdefaults.TuneColor); tunecolor->color(progdefaults.TuneColor); tunecolor->redraw(); tune_selection_color(); progdefaults.changed = true;} xywh {139 194 85 21} } Fl_Button btnRxIDColor { label {RxID nar} callback {progdefaults.RxIDColor = fl_show_colormap(progdefaults.RxIDColor); rxidcolor->color(progdefaults.RxIDColor); rxidcolor->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw();} xywh {139 229 85 21} } Fl_Button btnLkColor { label Lk callback {progdefaults.LkColor = fl_show_colormap(progdefaults.LkColor); lockcolor->color(progdefaults.LkColor); lockcolor->redraw(); xmtlock_selection_color(); progdefaults.changed = true;} xywh {274 121 85 21} } Fl_Button btnSql1Color { label {SQL-1} callback {progdefaults.Sql1Color = fl_show_colormap(progdefaults.Sql1Color); sql1color->color(progdefaults.Sql1Color); sql1color->redraw(); sql_selection_color(); progdefaults.changed = true;} xywh {275 157 85 21} } Fl_Button btnXmtColor { label {T/R} callback {progdefaults.XmtColor = fl_show_colormap(progdefaults.XmtColor); xmtcolor->color(progdefaults.XmtColor); xmtcolor->redraw(); xmtrcv_selection_color(); progdefaults.changed = true;} xywh {274 194 85 20} } Fl_Button btnRxIDwideColor { label {RxID wide} callback {progdefaults.RxIDwideColor = fl_show_colormap(progdefaults.RxIDwideColor); rxidcolorwide->color(progdefaults.RxIDwideColor); rxidcolorwide->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw();} xywh {274 229 85 21} } Fl_Button btnAfcColor { label AFC callback {progdefaults.AfcColor = fl_show_colormap(progdefaults.AfcColor); afccolor->color(progdefaults.AfcColor); afccolor->redraw(); afc_selection_color(); progdefaults.changed = true;} xywh {410 121 85 21} } Fl_Button btnSql2Color { label {SQL-2} callback {progdefaults.Sql2Color = fl_show_colormap(progdefaults.Sql2Color); sql2color->color(progdefaults.Sql2Color); sql2color->redraw(); sql_selection_color(); progdefaults.changed = true;} xywh {410 157 85 20} } Fl_Button btnTxIDColor { label TxID callback {progdefaults.TxIDColor = fl_show_colormap(progdefaults.TxIDColor); txidcolor->color(progdefaults.TxIDColor); txidcolor->redraw(); txid_selection_color(); progdefaults.changed = true; btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->redraw();} xywh {409 229 85 20} } Fl_Box spotcolor { xywh {115 122 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.SpotColor);} } Fl_Box revcolor { xywh {115 158 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RevColor);} } Fl_Box tunecolor { xywh {115 195 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.TuneColor);} } Fl_Box rxidcolor { xywh {115 230 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RxIDColor);} } Fl_Box lockcolor { xywh {250 122 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.LkColor);} } Fl_Box sql1color { xywh {250 158 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.Sql1Color);} } Fl_Box rxidcolorwide { xywh {250 230 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RxIDwideColor);} } Fl_Box xmtcolor { xywh {250 195 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.XmtColor);} } Fl_Box afccolor { xywh {385 122 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.AfcColor);} } Fl_Box sql2color { xywh {385 158 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.Sql2Color);} } Fl_Box txidcolor { xywh {385 230 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.TxIDColor);} } Fl_Box {} { label {Lighted button enabled colors} xywh {195 310 220 20} align 21 } Fl_Button btn_default_btn_color { label {All Others} callback {progdefaults.default_btn_color = fl_show_colormap(progdefaults.default_btn_color); default_btn_color->color(progdefaults.default_btn_color); default_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true;} xywh {274 264 85 21} } Fl_Box default_btn_color { xywh {250 264 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.default_btn_color);} } } Fl_Group {} { label SigLvl xywh {0 75 600 315} hide } { Fl_Button btnLowSignal { label Low callback {progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); progdefaults.changed = true;} xywh {210 142 70 21} } Fl_Box lowcolor { xywh {189 142 21 21} box DIAMOND_DOWN_BOX color 0 code0 {o->color(progdefaults.LowSignal);} } Fl_Button btnHighSignal { label High callback {progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); progdefaults.changed = true;} xywh {210 180 70 21} } Fl_Box highcolor { xywh {189 180 21 21} box DIAMOND_DOWN_BOX color 3 code0 {o->color(progdefaults.HighSignal);} } Fl_Button btnNormalSignal { label Normal callback {progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); progdefaults.changed = true;} xywh {333 142 70 21} } Fl_Box normalcolor { xywh {312 141 21 21} box DIAMOND_DOWN_BOX color 2 code0 {o->color(progdefaults.NormSignal);} } Fl_Button btnOverSignal { label Over callback {progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); progdefaults.changed = true;} xywh {333 180 70 21} } Fl_Box overcolor { xywh {312 180 21 21} box DIAMOND_DOWN_BOX color 1 code0 {o->color(progdefaults.OverSignal);} } Fl_Box {} { label {Signal Level Colors} xywh {135 110 316 21} } } } } Fl_Group tab_touch { label Touch xywh {0 50 600 340} hide } { Fl_Box {} { label {Note: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.} xywh {15 70 570 52} align 20 } Fl_Group {} { label {Arrow Key Control of Frequency Entry} open xywh {15 145 570 102} box ENGRAVED_BOX align 21 } { Fl_Box {} { label {Right/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSD} xywh {30 170 290 74} align 16 } Fl_Choice sel_lsd { label {Right/Left Select Least Signficant Digit} callback {progdefaults.sel_lsd = o->value(); set_freq_control_lsd(); progdefaults.changed = true;} open xywh {420 206 90 24} down_box BORDER_BOX align 1 code0 {o->add("1 Hz|10 Hz|100 Hz|1 kHz");} code1 {o->value(progdefaults.sel_lsd);} } {} } Fl_Group {} { label {Rx / Tx Panels} open xywh {15 256 570 64} box ENGRAVED_BOX align 21 } { Fl_Check_Button btn_rxtx_swap { label {Tx above Rx} callback {progdefaults.rxtx_swap = o->value(); progdefaults.changed = true; UI_select();} tooltip {Enable to put Tx panel above Rx panel} xywh {145 276 116 30} down_box DOWN_BOX code0 {o->value(progdefaults.rxtx_swap);} } } } } } Fl_Group tabWaterfall { label Waterfall open xywh {0 25 600 365} hide } { Fl_Tabs tabsWaterfall {open xywh {0 25 600 365} color 50 selection_color 50 } { Fl_Group {} { label Display open xywh {0 50 600 340} hide } { Fl_Group {} { label {Colors and cursors} open xywh {50 63 496 190} box ENGRAVED_FRAME align 21 } { Fl_Button WF_Palette { label aa callback {progdefaults.changed = true;} xywh {60 99 380 24} box DOWN_BOX color 0 labelsize 12 align 5 code0 {\#include "colorbox.h"} code1 {o->label(progdefaults.PaletteName.c_str());} code2 {o->labelsize(FL_NORMAL_SIZE);} class colorbox } Fl_Button {btnColor[0]} { callback {selectColor(0); progdefaults.changed = true;} tooltip {Change color} xywh {60 125 20 24} } Fl_Button {btnColor[1]} { callback {selectColor(1); progdefaults.changed = true;} tooltip {Change color} xywh {105 125 20 24} } Fl_Button {btnColor[2]} { callback {selectColor(2); progdefaults.changed = true;} tooltip {Change color} xywh {150 125 20 24} } Fl_Button {btnColor[3]} { callback {selectColor(3); progdefaults.changed = true;} tooltip {Change color} xywh {195 125 20 24} } Fl_Button {btnColor[4]} { callback {selectColor(4); progdefaults.changed = true;} tooltip {Change color} xywh {240 125 20 24} } Fl_Button {btnColor[5]} { callback {selectColor(5); progdefaults.changed = true;} tooltip {Change color} xywh {285 125 20 24} } Fl_Button {btnColor[6]} { callback {selectColor(6); progdefaults.changed = true;} tooltip {Change color} xywh {330 125 20 24} } Fl_Button {btnColor[7]} { callback {selectColor(7); progdefaults.changed = true;} tooltip {Change color} xywh {375 125 20 24} } Fl_Button {btnColor[8]} { callback {selectColor(8); progdefaults.changed = true;} tooltip {Change color} xywh {420 125 20 24} } Fl_Button btnLoadPalette { label {Load...} callback {loadPalette(); progdefaults.changed = true;} tooltip {Load a new palette} xywh {450 99 70 24} code0 {\#include "colorbox.h"} } Fl_Button btnSavePalette { label {Save...} callback {savePalette();} tooltip {Save this palette} xywh {450 125 70 24} code0 {\#include "colorbox.h"} } Fl_Group {} { label Bandwidth open xywh {59 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseCursorLines { label ON callback {progdefaults.UseCursorLines = o->value(); if (o->value()) btnCursorBWcolor->activate(); else btnCursorBWcolor->deactivate(); progdefaults.changed = true;} tooltip {Show cursor with bandwidth lines} xywh {61 173 56 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseCursorLines);} } Fl_Button btnCursorBWcolor { label Color callback {if (fl_color_chooser("Cursor BW Lines", progdefaults.cursorLineRGBI.R, progdefaults.cursorLineRGBI.G, progdefaults.cursorLineRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); o->redraw(); progdefaults.changed = true; }} tooltip {Change color} xywh {61 196 20 20} color 3 align 8 code0 {\#include } code1 {o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B));} } Fl_Check_Button btnUseWideCursor { label Wide callback {progdefaults.UseWideCursor = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {61 219 62 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideCursor);} } } Fl_Group {} { label {Center line} open xywh {183 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseCursorCenterLine { label ON callback {progdefaults.UseCursorCenterLine = o->value(); progdefaults.changed = true;} tooltip {Show cursor with center line} xywh {189 173 48 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseCursorCenterLine);} } Fl_Button btnCursorCenterLineColor { label Color callback {if (fl_color_chooser("Cursor Center Line", progdefaults.cursorCenterRGBI.R, progdefaults.cursorCenterRGBI.G, progdefaults.cursorCenterRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); o->redraw(); progdefaults.changed = true; }} tooltip {Change color} xywh {189 196 20 20} color 7 align 8 code0 {o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B));} } Fl_Check_Button btnUseWideCenter { label Wide callback {progdefaults.UseWideCenter = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {189 221 69 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideCenter);} } } Fl_Group {} { label {Signal tracks} open xywh {306 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseBWTracks { label ON callback {progdefaults.UseBWTracks = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {308 172 56 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseBWTracks);} } Fl_Button btnBwTracksColor { label Color callback {if (fl_color_chooser("Track Lines", progdefaults.bwTrackRGBI.R, progdefaults.bwTrackRGBI.G, progdefaults.bwTrackRGBI.B) ) { o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {308 195 20 20} color 1 align 8 code0 {o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B));} } Fl_Check_Button btnUseWideTracks { label Wide callback {progdefaults.UseWideTracks = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {308 219 74 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideTracks);} } } Fl_Group {} { label Notch open xywh {426 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Button btnNotchColor { label Color callback {if (fl_color_chooser("Notch Indicator", progdefaults.notchRGBI.R, progdefaults.notchRGBI.G, progdefaults.notchRGBI.B) ) { o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {428 195 20 20} color 1 align 8 code0 {o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B));} } } } Fl_Group {} { label {Frequency scale} open xywh {50 254 496 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkShowAudioScale { label {Always show audio frequencies} callback {progdefaults.wf_audioscale = o->value(); progdefaults.changed = true;} tooltip {Audio or RF frequencies on waterfall scale} xywh {60 277 241 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_audioscale);} } Fl_Button btnWaterfallFont { label {Font...} callback {font_browser->fontNumber(progdefaults.WaterfallFontnbr); font_browser->fontSize(progdefaults.WaterfallFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser); font_browser->show();} tooltip {Select waterfall scale font} xywh {360 277 71 24} } } Fl_Group {} { label {Transmit signal} open xywh {50 310 496 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnViewXmtSignal { label {Monitor transmitted signal} callback {progdefaults.viewXmtSignal=o->value(); progdefaults.changed = true;} tooltip {Show transmit signal on waterfall} xywh {60 336 208 20} down_box DOWN_BOX code0 {o->value(progdefaults.viewXmtSignal);} } Fl_Value_Slider valTxMonitorLevel { label {Signal level} callback {progdefaults.TxMonitorLevel = o->value(); progdefaults.changed = true;} tooltip {Set level for good viewing} xywh {318 336 203 20} type Horizontal align 1 step 0.05 value 0.5 textsize 14 code0 {o->value(progdefaults.TxMonitorLevel);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } } } Fl_Group {} { label {FFT Processing} open xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {55 71 490 135} box ENGRAVED_FRAME } { Fl_Counter cntLowFreqCutoff { label {Lower limit} callback {progdefaults.LowFreqCutoff=(int)(o->value()); progdefaults.changed = true; setwfrange();} tooltip {Low frequency limit in Hz} xywh {100 89 70 22} type Simple align 8 minimum 0 maximum 500 step 50 value 300 code0 {o->value(progdefaults.LowFreqCutoff);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnWFaveraging { label {FFT averaging} callback {progdefaults.WFaveraging = o->value(); progdefaults.changed = true;} tooltip {Use averaging to decrease waterfall noise} xywh {100 125 120 20} down_box DOWN_BOX code0 {o->value(progdefaults.WFaveraging);} } Fl_Group listboxFFTPrefilter { label {FFT prefilter window function} callback {progdefaults.wfPreFilter = o->index(); progdefaults.changed = true;} open tooltip {Select the type of FFT prefilter} xywh {100 155 120 24} box DOWN_BOX color 7 align 8 code0 {listboxFFTPrefilter->add(_("Rectangular")); listboxFFTPrefilter->add("Blackman");} code1 {listboxFFTPrefilter->add("Hamming"); listboxFFTPrefilter->add("Hanning");} code2 {listboxFFTPrefilter->add(_("Triangular"));} code3 {listboxFFTPrefilter->index(progdefaults.wfPreFilter); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter cntrWfwidth { label {Upper limit} callback {progdefaults.HighFreqCutoff = (int)o->value(); progdefaults.changed = true; setwfrange();} tooltip {High frequency limit in Hz} xywh {323 89 95 22} type Simple align 8 minimum 2000 maximum 4000 step 100 value 3000 code0 {o->value(progdefaults.HighFreqCutoff);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter wf_latency { label Latency callback {progdefaults.wf_latency = (int)o->value(); progdefaults.changed = true;} tooltip {Signal averaging over time 0 - least 4 - greatest} xywh {323 124 95 22} type Simple align 8 minimum 1 maximum 16 step 1 value 8 code0 {o->value(progdefaults.wf_latency);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} {open tooltip {Show me more or less waterfall} xywh {55 212 490 73} box ENGRAVED_FRAME align 17 } { Fl_Counter cntr_drop_speed { label {Slow drop rate} callback {progdefaults.drop_speed=(int)o->value(); progdefaults.changed=true;} tooltip {Normal drop speed / value} xywh {100 234 95 22} type Simple align 11 minimum 4 maximum 32 step 2 value 4 code0 {o->value(progdefaults.drop_speed);} } } Fl_Group {} { label {Changes take effect on next program startup} open tooltip {Show me more or less waterfall} xywh {55 292 490 73} box ENGRAVED_FRAME align 17 } { Fl_Counter cntrWfheight { label {Waterfall height in pixels} callback {progdefaults.wfheight = (int)o->value(); progdefaults.changed = true;} tooltip {CPU usage increases with waterfall height} xywh {100 322 120 22} align 8 minimum 100 maximum 500 step 5 value 120 code0 {o->value(progdefaults.wfheight);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(50);} class Fl_Counter2 } } } Fl_Group {} { label Mouse open xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {10 60 580 170} box ENGRAVED_FRAME } { Fl_Check_Button btnWaterfallHistoryDefault { label {Left or right click always replays audio history} callback {progdefaults.WaterfallHistoryDefault = o->value(); progdefaults.changed = true;} tooltip {Replay trackline audio} xywh {65 75 340 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallHistoryDefault);} } Fl_Check_Button btnWaterfallQSY { label {Dragging on the waterfall scale changes frequency} callback {progdefaults.WaterfallQSY = o->value(); progdefaults.changed = true;} tooltip {Enable drag cursor on waterfall scale} xywh {65 105 380 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallQSY);} } Fl_Check_Button btnWaterfallClickInsert { label {Insert text on single left click} callback {progdefaults.WaterfallClickInsert = o->value(); if (progdefaults.WaterfallClickInsert) inpWaterfallClickText->activate(); else inpWaterfallClickText->deactivate(); progdefaults.changed = true;} tooltip {Insert special text in Rx panel when waterfall clicked} xywh {65 147 225 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallClickInsert);} } Fl_Input inpWaterfallClickText { callback {progdefaults.WaterfallClickText = o->value(); progdefaults.changed = true;} tooltip {The string is replaced with the current modem and frequency} xywh {351 135 180 50} align 8 class Fl_Input2 } Fl_Group listboxWaterfallWheelAction { label {Wheel action} callback {progdefaults.WaterfallWheelAction = o->index(); progdefaults.changed = true;} open tooltip {Select how the mouse wheel behaves inside the waterfall} xywh {65 188 150 22} box DOWN_BOX color 7 align 8 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } Fl_Group {} { label Spectrum open xywh {0 50 600 340} } { Fl_Group {} { label {Spectrum Scope / Waterfall interaction} open xywh {10 65 580 150} box ENGRAVED_BOX align 17 } { Fl_Check_Button btnWFspectrum_center { label {left click transfers frequency to scope center frequency} callback {progdefaults.wf_spectrum_center = o->value(); progdefaults.changed = true;} tooltip {left click on WF recenters spectrum scope} xywh {75 107 365 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_spectrum_center);} } Fl_Check_Button btnWFspectrum_dbvals { label {use waterfall range/limit values} callback {progdefaults.wf_spectrum_dbvals = o->value(); progdefaults.changed = true;} tooltip {values left/below waterfall} xywh {75 138 221 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_spectrum_dbvals);} } Fl_Counter cntr_spectrum_freq_scale { label {freq scale = N * modem bandwidth} callback {progdefaults.wf_spectrum_scale_factor = o->value(); progdefaults.changed = true;} xywh {75 170 75 20} type Simple align 8 minimum 1 maximum 10 step 1 value 5 code0 {o->value(progdefaults.wf_spectrum_scale_factor);} } Fl_Check_Button btn_spectrum_modem_scale { label use callback {progdefaults.wf_spectrum_modem_scale = o->value(); progdefaults.changed = true;} tooltip {scale spectrum display linked to modem bandwidth} xywh {385 170 55 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_spectrum_modem_scale);} } } } } } Fl_Group tabModems { label Modems open xywh {0 25 609 365} hide } { Fl_Tabs tabsModems {open xywh {0 25 609 365} selection_color 50 align 9 } { Fl_Group tabCW { label CW open xywh {0 50 600 340} } { Fl_Tabs tabsCW {open xywh {0 50 600 340} selection_color 50 } { Fl_Group tabsCW_general { label General xywh {0 75 600 315} align 5 } { Fl_Group {} { label Receive open xywh {35 85 530 130} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnCWuseSOMdecoding { label {SOM decoding} callback {progdefaults.CWuseSOMdecoding = o->value(); progdefaults.changed = true;} tooltip {Self Organizing Mapping} xywh {96 108 125 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWuseSOMdecoding);} } Fl_Check_Button btnCWrcvTrack { label Tracking callback {progdefaults.CWtrack = o->value(); progdefaults.changed = true;} tooltip {Automatic Rx speed tracking} xywh {250 108 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWtrack);} } Fl_Value_Slider sldrCWbandwidth { label {Filter bandwidth} callback {progdefaults.CWbandwidth = (int)o->value(); progdefaults.changed = true;} tooltip {CW dsp filter bandwidth} xywh {50 149 250 20} type Horizontal align 5 minimum 10 maximum 400 step 1 value 66 textsize 14 code0 {o->value(progdefaults.CWbandwidth);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btnCWmfilt { label {Matched Filt'} callback {progdefaults.CWmfilt = o->value(); progdefaults.changed = true;} tooltip {Matched Filter bandwidth} xywh {303 149 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWmfilt);} } Fl_Value_Output valCWrcvWPM { label {Rx WPM} callback {progdefaults.changed = true;} xywh {50 188 35 20} color 7 align 5 } Fl_Progress prgsCWrcvWPM { tooltip {Tracked CW speed in WPM} xywh {86 188 214 20} color 49 selection_color 15 align 0 } Fl_Counter cntLower { label Lower callback {progdefaults.CWlower = o->value(); progdefaults.changed = true;} tooltip {Detector low threshold} xywh {209 108 65 20} type Simple align 1 minimum 0.01 maximum 0.99 step 0.01 value 0.45 hide code0 {o->value(progdefaults.CWlower);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntUpper { label Upper callback {progdefaults.CWupper = o->value(); progdefaults.changed = true;} tooltip {Detector high threshold} xywh {302 108 65 20} type Simple align 1 minimum 0.01 maximum 0.99 step 0.01 value 0.55 hide code0 {o->value(progdefaults.CWupper);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWrange { label Range callback {progdefaults.CWrange = (int)o->value(); progdefaults.changed = true;} tooltip {Range +/- wpm} xywh {303 187 65 20} type Simple align 8 minimum 5 maximum 25 step 1 value 10 code0 {o->value(progdefaults.CWrange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group {} { label Squelch open xywh {425 110 135 95} box ENGRAVED_BOX align 17 } { Fl_Choice mnu_cwrx_attack { label Attack callback {progdefaults.cwrx_attack = o->value(); progdefaults.changed = true;} open xywh {480 140 72 20} down_box BORDER_BOX code0 {o->add("Slow|Med|Fast");} code1 {o->value(progdefaults.cwrx_attack);} } {} Fl_Choice mnu_cwrx_decay { label Decay callback {progdefaults.cwrx_decay = o->value(); progdefaults.changed = true;} open xywh {480 175 72 20} down_box BORDER_BOX code0 {o->add("Slow|Med|Fast");} code1 {o->value(progdefaults.cwrx_decay);} } {} } } Fl_Group {} { label Transmit open xywh {35 215 530 150} box ENGRAVED_FRAME align 21 } { Fl_Value_Slider sldrCWxmtWPM { label {TX WPM} callback {progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters();} tooltip {My transmit CW WPM} xywh {50 240 440 20} type Horizontal align 8 minimum 5 maximum 100 step 1 value 20 textsize 14 code0 {o->value(progdefaults.CWspeed);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Counter cntCWdefWPM { label Default callback {progdefaults.defCWspeed = (int)o->value(); progdefaults.changed = true;} tooltip {The default CW speed} xywh {91 281 64 20} type Simple align 1 minimum 5 maximum 200 step 1 value 18 code0 {o->value(progdefaults.defCWspeed);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWlowerlimit { label {Lower limit} callback {progdefaults.CWlowerlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->minimum(progdefaults.CWlowerlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWupperlimit->minimum(progdefaults.CWlowerlimit+20); cntCW_WPM->minimum(progdefaults.CWlowerlimit);} tooltip {No slower than this} xywh {245 281 65 20} type Simple align 1 minimum 5 maximum 20 step 5 value 10 code0 {o->value(progdefaults.CWlowerlimit);} code1 {o->labelsize(FL_NORMAL_SIZE);} } Fl_Counter cntCWupperlimit { label {Upper limit} callback {progdefaults.CWupperlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->maximum(progdefaults.CWupperlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWlowerlimit->maximum(progdefaults.CWupperlimit-20); cntCW_WPM->maximum(progdefaults.CWupperlimit);} tooltip {No faster than this} xywh {401 281 65 20} type Simple align 1 minimum 25 maximum 200 step 5 value 100 code0 {o->value(progdefaults.CWupperlimit);} code1 {o->labelsize(FL_NORMAL_SIZE);} } Fl_Value_Slider sldrCWfarnsworth { label {F-WPM} callback {progdefaults.CWfarnsworth = (int)o->value(); progdefaults.changed = true;} tooltip {My transmit CW WPM} xywh {50 335 440 20} type Horizontal align 8 minimum 5 maximum 100 step 1 value 20 textsize 14 code0 {o->value(progdefaults.CWfarnsworth);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btnCWusefarnsworth { label {Use Farnsworth timing} callback {progdefaults.CWusefarnsworth=o->value(); progdefaults.changed = true;} xywh {70 312 180 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWusefarnsworth);} } } } Fl_Group tabsCW_timing { label {Timing and QSK} xywh {0 75 600 315} align 5 hide } { Fl_Group {} { label Timing open xywh {5 85 585 120} box ENGRAVED_FRAME align 21 } { Fl_Counter cntCWweight { label {Weight (%)} callback {progdefaults.CWweight=(int)o->value(); progdefaults.changed = true;} tooltip {Dot to dot-space ratio} xywh {20 110 65 20} type Simple align 8 minimum 20 maximum 80 step 1 value 50 code0 {o->value(progdefaults.CWweight);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWdash2dot { label {Dash/Dot} callback {progdefaults.CWdash2dot=o->value(); cnt_nanoCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true;} tooltip {Dash to dot ratio} xywh {245 110 80 20} type Simple align 8 minimum 2.5 maximum 4 value 3 code0 {o->value(progdefaults.CWdash2dot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWrisetime { label {Edge timing} callback {progdefaults.CWrisetime=o->value(); progdefaults.changed = true;} tooltip {Leading and Trailing edge risetimes (msec)} xywh {245 143 80 20} type Simple align 8 minimum 0 maximum 15 value 4 code0 {o->value(progdefaults.CWrisetime);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group i_listboxQSKshape { label {Edge shape} callback {progdefaults.QSKshape = o->index(); progdefaults.changed = true;} open tooltip {Hanning/Blackman - use edge timing BPF - use BPF bandwidth} xywh {20 143 112 20} box DOWN_BOX color 7 align 8 code0 {o->add("Hanning|Blackman");} code1 {o->index(progdefaults.QSKshape);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnCWnarrow { label {Edge decrease} callback {progdefaults.CWnarrow = o->value(); progdefaults.changed = true;} tooltip {Weight decreases with increasing edge timing} xywh {450 145 131 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWnarrow);} } Fl_Check_Button btnCW_bpf_on { label {BPF transmit audio} callback {progdefaults.CW_bpf_on = o->value(); progdefaults.changed = true;} tooltip {Enable LO/HI bfp of transmit audio} xywh {20 180 167 15} down_box DOWN_BOX code0 {o->value(progdefaults.CW_bpf_on);} } Fl_Counter cntCW_hpf { label {BPF bw} callback {progdefaults.CW_bpf=o->value(); progdefaults.changed = true;} tooltip {Low filter cutoff} xywh {235 177 100 20} align 8 minimum 10 maximum 1000 step 1 value 100 code0 {o->value(progdefaults.CW_bpf);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(10.0);} class Fl_Counter2 } } Fl_Group {} { label QSK open xywh {5 217 585 118} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnQSK { label {QSK on right audio channel} callback {progdefaults.QSK = o->value(); btnQSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }} tooltip {Generate square wave signal on right channel} xywh {16 245 233 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSK);} } Fl_Counter cntPreTiming { label {Pre-keydown timing (ms)} callback {progdefaults.CWpre=o->value(); progdefaults.changed = true;} tooltip {Msec pre-keydown (+ is earlier in time)} xywh {16 275 71 20} type Simple align 8 minimum 0 maximum 20 step 0.5 code0 {o->value(progdefaults.CWpre);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntPostTiming { label {Post-keydown timing (ms)} callback {progdefaults.CWpost=o->value(); progdefaults.changed = true;} tooltip {Msec post-keydown (+ is earlier in time)} xywh {16 305 71 20} type Simple align 8 minimum -20 maximum 20 step 0.5 code0 {o->value(progdefaults.CWpre);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnQSKadjust { label {Send continuously} callback {progdefaults.QSKadjust = o->value();} tooltip {Send a continuous stream of test characters} xywh {320 275 176 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSKadjust);} } Fl_Group i_listbox_test_char { label {Test char} callback {progdefaults.TestChar = o->index();} open tooltip {Test character for QSK adjustment} xywh {320 245 45 20} box DOWN_BOX color 7 align 8 code0 {extern char szTestChar[];} code1 {o->add(szTestChar);} code2 {o->index(progdefaults.TestChar);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } Fl_Group tabsCW_prosigns { label Prosigns xywh {0 75 600 315} align 5 hide } { Fl_Group {} {open xywh {35 85 530 283} box ENGRAVED_FRAME } { Fl_Check_Button btnCW_use_paren { label {Use '(' paren not KN} callback {progdefaults.CW_use_paren=o->value(); progdefaults.changed = true;} xywh {161 244 68 15} down_box DOWN_BOX code0 {o->value(progdefaults.CW_use_paren);} } Fl_Group {} { label {Use these for WinKeyer and nanoCW} open xywh {362 96 182 262} box ENGRAVED_FRAME align 17 } { Fl_Box {} { label {" RR} tooltip {.-..-.} xywh {422 127 59 22} } Fl_Box {} { label {$ SX} tooltip {...-..-} xywh {422 147 59 22} } Fl_Box {} { label {' WG} tooltip {.----.} xywh {422 166 59 22} } Fl_Box {} { label {( KN} tooltip {-.--.} xywh {422 185 59 22} } Fl_Box {} { label {) KK} tooltip {-.--.-} xywh {422 204 59 22} } Fl_Box {} { label {+ AR} tooltip {.-.-.} xywh {422 223 59 22} } Fl_Box {} { label {< AR} tooltip {.-.-.} xywh {422 242 59 22} } Fl_Box {} { label {> SK} tooltip {...-.-} xywh {422 261 59 22} } Fl_Box {} { label {= BT} tooltip {-...-} xywh {422 280 59 22} } Fl_Box {} { label {- DU} tooltip {-....-} xywh {422 299 59 22} } Fl_Box {} { label {@@ AC} tooltip {.--.-.} xywh {422 320 59 22} } } } Fl_Group {listbox_prosign[0]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[0] = ps[c]; progdefaults.changed = true;} open xywh {106 102 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[0];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[1]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[1] = ps[c]; progdefaults.changed = true;} open xywh {106 129 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[1];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[2]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[2] = ps[c]; progdefaults.changed = true;} open xywh {106 157 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[2];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[3]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[3] = ps[c]; progdefaults.changed = true;} open xywh {106 184 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[3];} code2 {o->value(s);} class Fl_ListBox } {} Fl_Group {listbox_prosign[4]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[4] = ps[c]; progdefaults.changed = true;} open xywh {106 212 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[4];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[5]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[5] = ps[c]; progdefaults.changed = true;} open xywh {106 240 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[5];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[6]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[6] = ps[c]; progdefaults.changed = true;} open xywh {106 267 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[6];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[7]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[7] = ps[c]; progdefaults.changed = true;;} open xywh {106 295 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[7];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[8]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[8] = ps[c]; progdefaults.changed = true;} open xywh {106 323 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[8];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group tabsCW_winkeyer { label WinKeyer xywh {0 75 600 315} align 5 hide } { Fl_Group select_WK_CommPort { label {Ser. Port} callback {progStatus.WK_serial_port_name = o->value(); select_WKFSK_CommPort->value(progStatus.WK_serial_port_name.c_str());} open tooltip {Xcvr serial port} xywh {69 85 405 23} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "winkeyer.h"} code2 {o->value(progStatus.WK_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_WKCW_connect { label Connect callback {WKCW_connect(o->value());} tooltip {Connect / Disconnect from WinKeyer} xywh {500 85 80 23} code0 {o->value(progStatus.WK_online);} } Fl_Group {} { label ModeReg open xywh {10 191 134 171} box ENGRAVED_FRAME align 17 } { Fl_Check_Button btn_WK_swap { label Swap callback {WK_change_btn_swap();} tooltip {Swap left/right keyer contacts} xywh {20 217 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_auto_space { label {Auto Space} callback {WK_change_btn_auto_space();} tooltip {Enable paddle auto spacing of characters} xywh {20 247 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_ct_space { label {CT space} callback {WK_change_btn_ct_space();} tooltip {Enable contest character spacing} xywh {20 277 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_paddledog { label {Paddle Dog} callback {WK_change_btn_paddledog();} xywh {20 307 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_cut_zeronine { label {Cut 0/9} callback {WK_change_btn_cut_zeronine();} tooltip {Use T/N for 0/9} xywh {20 337 70 15} down_box DOWN_BOX } } Fl_Group {} { label ModeReg open xywh {167 191 134 171} box ENGRAVED_FRAME align 17 } { Fl_Check_Button btn_WK_paddle_echo { label {Paddle echo} callback {WK_change_btn_paddle_echo();} tooltip {Echo paddle chars to Rx Panel} xywh {173 217 70 16} down_box DOWN_BOX } Fl_Check_Button btn_WK_serial_echo { label {Serial echo} callback {WK_change_btn_serial_echo();} xywh {173 247 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btn_WK_sidetone_on { label {Tone Keyer} callback {WK_change_btn_sidetone_on();} tooltip {Enable Winkeyer tone keying} xywh {173 277 103 16} down_box DOWN_BOX } Fl_Check_Button btn_WK_tone_on { label {Tone ON} callback {WK_change_btn_tone_on();} tooltip {Enable Winkeyer audio tone} xywh {173 307 87 16} down_box DOWN_BOX } Fl_Check_Button btn_WK_ptt_on { label {PTT ON} callback {WK_change_btn_ptt_on();} tooltip {Enable Winkeyer PTT output} xywh {173 337 87 16} down_box DOWN_BOX } } Fl_Group {} { label {WPM Settings} open xywh {310 191 112 192} box ENGRAVED_FRAME align 17 } { Fl_Counter cntr_WK_min_wpm { label {Min WPM} callback {WK_change_cntr_min_wpm(); if ((o->value() + cntr_WK_rng_wpm->value()) > 55) cntr_WK_rng_wpm->value(55 - o->value());} tooltip {Minimum WPM setting default = 10} xywh {331 215 64 22} type Simple minimum 10 maximum 30 step 1 value 10 } Fl_Counter cntr_WK_rng_wpm { label {Rng WPM} callback {WK_change_cntr_rng_wpm(); if ((cntr_WK_min_wpm->value() + o->value()) > 55) o->value(55 - cntr_WK_min_wpm->value());} tooltip {Range WPM setting default = 25} xywh {331 258 64 21} type Simple } Fl_Counter cntr_WK_farnsworth { label Farsnworth callback {WK_change_cntr_farnsworth();} tooltip {Farnsworth keying (0 = none) default = 0} xywh {331 300 64 22} type Simple } Fl_Counter cntr_WK_cmd_wpm { label {Cmd WPM} callback {WK_change_cntr_cmd_wpm();} tooltip {WPM speed for Winkeyer Command strings default = 18} xywh {331 343 64 22} type Simple } } Fl_Group {} { label {Timing/Settings} open xywh {430 191 160 192} box ENGRAVED_FRAME align 17 } { Fl_Counter cntr_WK_ratio { label Ratio callback {WK_change_cntr_ratio();} tooltip {Keying ratio default = 3.0} xywh {442 215 64 22} type Simple } Fl_Counter cntr_WK_comp { label Comp callback {WK_change_cntr_comp();} tooltip {Compensation in msec default = 0} xywh {442 258 64 21} type Simple } Fl_Counter cntr_WK_first_ext { label {1st Ext} callback {WK_change_cntr_first_ext();} tooltip {Extra duration to first dit/dot in msec default = 0} xywh {442 300 64 22} type Simple } Fl_Counter cntr_WK_sample { label Sample callback {WK_change_cntr_sample();} tooltip {Paddle sampling (see Winkeyer manual) default = 50} xywh {442 343 64 22} type Simple } Fl_Counter cntr_WK_weight { label Weight callback {WK_change_cntr_weight();} tooltip {Keying weight default = 50} xywh {513 215 64 22} type Simple } Fl_Counter cntr_WK_leadin { label Leadin callback {WK_change_cntr_leadin();} tooltip {Leadin in msec default = 0} xywh {513 258 64 21} type Simple } Fl_Counter cntr_WK_tail { label Tail callback {WK_change_cntr_tail();} tooltip {Extend last dit/dot in msec default = 0} xywh {513 300 64 22} type Simple } } Fl_Group {} {open xywh {10 143 580 47} box ENGRAVED_FRAME } { Fl_Group choice_WK_keyer_mode { label {Keyer Mode} callback {WK_change_choice_keyer_mode();} open xywh {35 148 90 22} box BORDER_BOX color 55 align 2 code0 {\#include "combo.h"} class Fl_ComboBox } {} Fl_Group choice_WK_hang { label Hang callback {WK_change_choice_hang();} open xywh {181 148 90 22} box BORDER_BOX color 55 align 2 class Fl_ComboBox } {} Fl_Group choice_WK_sidetone { label Sidetone callback {WK_change_choice_sidetone();} open xywh {328 148 90 22} box BORDER_BOX color 55 align 2 class Fl_ComboBox } {} Fl_Group choice_WK_output_pins { label {Output PIns} callback {WK_change_choice_output_pins();} open xywh {475 148 90 22} box BORDER_BOX color 55 align 2 class Fl_ComboBox } {} } Fl_Group {} {open xywh {10 113 397 25} box ENGRAVED_FRAME } { Fl_Box box_WK_wait { label Wait xywh {40 117 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_break_in { label Bk xywh {115 117 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_busy { label Busy xywh {190 117 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_xoff { label Bfr xywh {265 117 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_keydown { label Key xywh {341 117 16 16} box DIAMOND_DOWN_BOX align 8 } } Fl_Check_Button btn_WK_use_pot { label {Use Pot} callback {WK_use_pot_changed();} tooltip {Winkeyer pot controls WPM} xywh {418 117 20 15} down_box DOWN_BOX align 8 when 1 } Fl_Output txt_WK_wpm { tooltip {WPM setting} xywh {505 114 50 22} } Fl_Group {} {open xywh {10 363 291 23} box ENGRAVED_FRAME } { Fl_Check_Button btnK3NG { label {K3NG Arduino sketch emulation} callback {progdefaults.WK_K3NGsketch = o->value(); progdefaults.changed = true;} tooltip {Activate for Mortty K3NG sketch} xywh {20 367 223 15} down_box DOWN_BOX code0 {o->value(progdefaults.WK_K3NGsketch);} } } } Fl_Group tabsCW_ext_chars { label {Ext. Chars.} xywh {0 75 600 315} align 5 hide } { Fl_Group {} { label {Check to enable character encode/decode Select one character from each group} open xywh {5 85 590 266} box EMBOSSED_FRAME align 17 } { Fl_Group {} {open xywh {10 140 99 80} box ENGRAVED_FRAME } { Fl_Check_Button btn_A_aelig { label {A aelig} callback {progdefaults.A_aelig = o->value(); if (progdefaults.A_aelig) { progdefaults.A_umlaut = false; btn_A_umlaut->value(0); } btn_A_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {16 156 70 15} down_box DOWN_BOX code0 {\#include "cw.h"} code1 {o->value(progdefaults.A_aelig);} } Fl_Check_Button btn_A_umlaut { label { A umlaut} callback {progdefaults.A_umlaut = o->value(); if (progdefaults.A_umlaut) { progdefaults.A_aelig = false; btn_A_aelig->value(0); } btn_A_aelig->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {16 193 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.A_umlaut);} } } Fl_Check_Button btn_A_ring { label { A ring} callback {progdefaults.A_ring = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {16 230 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.A_ring);} } Fl_Group {} {open xywh {111 140 99 120} box ENGRAVED_FRAME } { Fl_Check_Button btn_O_acute { label { O acute} callback {progdefaults.O_acute = o->value(); if (progdefaults.O_acute) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_umlaut->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {116 156 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.O_acute);} } Fl_Check_Button btn_O_slash { label { O slash} callback {progdefaults.O_slash = o->value(); if (progdefaults.O_slash) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_acute = false; btn_O_acute->value(0); } btn_O_umlaut->redraw(); btn_O_acute->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {116 230 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.O_slash);} } Fl_Check_Button btn_O_umlaut { label { O umlaut} callback {progdefaults.O_umlaut = o->value(); if (progdefaults.O_umlaut) { progdefaults.O_acute = false; btn_O_acute->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_acute->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {116 193 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.O_umlaut);} } } Fl_Check_Button btn_C_cedilla { label { C cedilla} callback {progdefaults.C_cedilla = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {213 156 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.C_cedilla);} } Fl_Check_Button btn_E_grave { label { E grave} callback {progdefaults.E_grave = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {311 156 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.E_grave);} } Fl_Check_Button btn_E_acute { label { E acute} callback {progdefaults.E_acute = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {311 193 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.E_acute);} } Fl_Check_Button btn_N_tilde { label { N tilde} callback {progdefaults.N_tilde = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {404 156 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.N_tilde);} } Fl_Group {} {open xywh {490 140 99 80} box ENGRAVED_FRAME } { Fl_Check_Button btn_U_umlaut { label { U umlaut} callback {progdefaults.U_umlaut = o->value(); if (progdefaults.U_umlaut) { progdefaults.U_circ = false; btn_U_circ->value(0); } btn_U_circ->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {495 156 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.U_umlaut);} } Fl_Check_Button btn_U_circ { label { U circ} callback {progdefaults.U_circ = o->value(); if (progdefaults.U_circ) { progdefaults.U_umlaut = false; btn_U_umlaut->value(0); } btn_U_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {495 193 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.U_circ);} } } Fl_Group {} { label {See https://en.wikipedia.org/wiki/Morse_code for information regarding extended Morse characters.} open xywh {110 280 403 45} align 17 } {} } } Fl_Group tab_nanoCW { label nanoCW open xywh {0 75 600 315} align 5 hide } { Fl_Group select_nanoCW_CommPort { label {Ser. Port} callback {progdefaults.nanoIO_serial_port_name = o->value();} open tooltip {nanoIO serial port} xywh {70 85 435 22} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "nanoIO.h"} code2 {o->value(progdefaults.nanoIO_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_nanoCW_connect { label Connect callback {if (o->value()) { btn_nanoIO_connect->value(0); if (!open_nanoCW()) o->value(0); } else { close_nanoIO(); }} tooltip {Connect / Disconnect from nanoIO} xywh {511 85 80 22} } Fl_Button btn_cwfsk_save { label Save callback {nano_CW_save();} tooltip {Write state of nanoIO to Arduino EEPROM} xywh {511 138 80 22} } Fl_Button btn_cwfsk_query { label Status callback {nano_CW_query();} tooltip {Query state of nanoIO} xywh {511 165 80 22} } Fl_Counter cntr_nanoCW_paddle_WPM { label Paddle callback {progdefaults.CW_keyspeed = (int)o->value(); set_nano_keyerWPM(progdefaults.CW_keyspeed); progdefaults.changed = true;} tooltip {CW wpm using paddle keyer} xywh {70 113 110 22} align 4 minimum 5 maximum 100 step 1 value 20 code0 {o->value(progdefaults.CW_keyspeed);} code1 {o->lstep(5);} } Fl_Text_Display txt_nano_CW_io { label {USB serial I/O} xywh {4 210 590 175} align 5 code0 {\#include "FTextRXTX.h"} code1 {o->setFont(progdefaults.RxFontnbr);} code2 {o->setFontSize(12);} class FTextView } Fl_Counter cntr_nanoCW_WPM { label {Comp'} callback {progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); sldrCWxmtWPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters();} tooltip {CW wpm keyboard strings} xywh {70 139 110 22} align 4 minimum 5 maximum 100 step 1 value 20 code0 {o->value(progdefaults.CWspeed);} code1 {o->lstep(5);} } Fl_Counter cnt_nanoCWdash2dot { label {Dash/Dot} callback {progdefaults.CWdash2dot=o->value(); cntCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true;} tooltip {Dash to dot ratio} xywh {87 165 75 22} type Simple align 4 minimum 2.5 maximum 3.5 value 3 code0 {o->value(progdefaults.CWdash2dot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group listbox_nano_keyer { label Keyer callback {progdefaults.nanoIO_CW_keyer = o->index(); set_nanoIO_keyer(o->index()); progdefaults.changed = true;} open xywh {395 113 110 22} box DOWN_BOX color 7 align 4 code0 {o->add("Iambic-A|Iambic-B|Straight");} code1 {o->index(progdefaults.nanoIO_CW_keyer);} class Fl_ListBox } {} Fl_Group listbox_incr { label {Incr'} callback {progdefaults.nanoIO_CW_incr = o->index() + '1'; set_nanoIO_incr(); progdefaults.changed = true;} open xywh {445 138 60 22} box DOWN_BOX color 7 align 4 code0 {o->add("1|2|3|4|5");} code1 {o->index(progdefaults.nanoIO_CW_incr - '1');} class Fl_ListBox } {} Fl_Check_Button btn_disable_CW_PTT { label {PTT off} callback {progdefaults.disable_CW_PTT=o->value(); progdefaults.changed=true; nanoIO_set_cw_ptt();} tooltip {Disable PTT} xywh {435 165 70 22} down_box DOWN_BOX code0 {o->value(progdefaults.disable_CW_PTT);} } Fl_Group {} {open xywh {185 110 164 85} box ENGRAVED_FRAME } { Fl_Check_Button btn_nanoIO_pot { label {Use WPM pot'} callback {progdefaults.nanoIO_speed_pot=o->value(); progdefaults.changed=true; nanoIO_use_pot();} tooltip {WPM pot update to nanoIO required} xywh {312 113 21 22} down_box DOWN_BOX align 4 deactivate code0 {o->value(progdefaults.nanoIO_speed_pot);} } Fl_Counter cntr_nanoIO_min_wpm { label {Min WPM} callback {if ((o->value() + cntr_nanoIO_rng_wpm->value()) > 100) cntr_nanoIO_rng_wpm->value(100 - o->value()); set_nanoIO_min_max();} tooltip {Minimum WPM setting default = 10} xywh {257 139 75 22} type Simple align 4 minimum 10 maximum 30 step 1 value 10 deactivate } Fl_Counter cntr_nanoIO_rng_wpm { label {Rng WPM} callback {if ((cntr_nanoIO_min_wpm->value() + o->value()) > 100) o->value(100 - cntr_nanoIO_min_wpm->value()); set_nanoIO_min_max();} tooltip {Range WPM setting default = 20} xywh {257 165 75 22} type Simple align 4 minimum 10 maximum 40 step 1 value 20 deactivate } } } } } Fl_Group tabDomEX { label Dom xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {55 60 490 180} box ENGRAVED_FRAME } { Fl_Input txtSecondary { label {Secondary Text} callback {progdefaults.secText = o->value(); progdefaults.changed = true;} tooltip {Text to send during keyboard idle times} xywh {65 87 360 40} type Multiline align 5 when 1 code0 {txtSecondary->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button valDominoEX_FILTER { label Filtering callback {progdefaults.DOMINOEX_FILTER = o->value(); resetDOMEX(); progdefaults.changed = true;} tooltip {Use DSP filter before decoder} xywh {65 141 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.DOMINOEX_FILTER);} } Fl_Counter valDominoEX_BW { label {Filter bandwidth factor} callback {progdefaults.DOMINOEX_BW = o->value(); resetDOMEX(); progdefaults.changed = true;} tooltip {Filter bandwidth relative to signal width} xywh {206 141 63 20} type Simple align 8 minimum 1 maximum 2 value 1.5 code0 {o->value(progdefaults.DOMINOEX_BW);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button chkDominoEX_FEC { label FEC callback {progdefaults.DOMINOEX_FEC = o->value(); progdefaults.changed = true;} tooltip {Enable MultiPSK-compatible FEC} xywh {65 171 51 20} down_box DOWN_BOX code0 {o->value(progdefaults.DOMINOEX_FEC);} } Fl_Value_Slider valDomCWI { label {CWI threshold} callback {progdefaults.DomCWI = o->value(); progdefaults.changed = true;} tooltip {CWI detection and suppression} xywh {65 207 260 20} type Horizontal align 1 textsize 14 code0 {o->value(progdefaults.DomCWI);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Counter valDominoEX_PATHS { label {Paths (hidden)} callback {progdefaults.DOMINOEX_PATHS = (int)o->value(); progdefaults.changed = true;} xywh {389 194 63 20} type Simple minimum 4 maximum 8 step 1 value 5 code0 {o->value(progdefaults.DOMINOEX_PATHS);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->hide();} class Fl_Counter2 } } } Fl_Group tabFeld { label Feld xywh {0 50 600 340} hide } { Fl_Group {} { label {Hell Transmit Parameters} open xywh {55 72 500 133} box ENGRAVED_FRAME align 17 } { Fl_Group listboxHellFont { label {Transmit font} callback {progdefaults.feldfontnbr=o->index(); progdefaults.changed = true;} open tooltip {Select TX raster font} xywh {70 97 225 22} box DOWN_BOX color 7 align 8 code0 {\#include "fontdef.h"} code1 {o->add(szFeldFonts);} code2 {o->index(progdefaults.feldfontnbr); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group listboxHellPulse { label {Pulse shape} callback {progdefaults.HellPulseFast = o->index(); progdefaults.changed = true;} open tooltip {Raised cosine pulse shape factor} xywh {70 145 150 22} box DOWN_BOX color 7 align 5 code0 {o->add(_("Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying"));} code2 {o->index(progdefaults.HellPulseFast); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnFeldHellIdle { label {Transmit periods (.) when idle} callback {progdefaults.HellXmtIdle=o->value(); progdefaults.changed = true;} tooltip {Transmits a diddle dot when no keyboard activity} xywh {70 180 230 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.HellXmtIdle);} } Fl_Value_Slider valHellXmtWidth { label {Tx Width Multiplier} callback {progdefaults.HellXmtWidth=(int)o->value(); progdefaults.changed = true;} tooltip {Range 1...3} xywh {251 145 150 22} type {Horz Knob} color 54 align 8 minimum 1 maximum 3 step 1 value 1 textsize 14 code0 {o->value(progdefaults.HellXmtWidth);} } } Fl_Group {} { label {Hell Receive Parameters} open xywh {55 208 500 173} box ENGRAVED_FRAME align 17 } { Fl_Check_Button btnBlackboard { label {Reverse video} callback {progdefaults.HellBlackboard=o->value(); FHdisp->reverse(progdefaults.HellBlackboard); progdefaults.changed = true;} tooltip {Display RX in reverse video} xywh {70 232 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.HellBlackboard);} } Fl_Check_Button btnHellMarquee { label {Marquee text} callback {progdefaults.HellMarquee=o->value(); FHdisp->set_marquee(progdefaults.HellMarquee); progdefaults.changed = true;} tooltip {Display RX as a scrolling marquee} xywh {255 232 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.HellMarquee);} } Fl_Value_Slider valHellRcvWidth { label {Rx Width Multiplier} callback {progdefaults.HellRcvWidth=(int)o->value(); progdefaults.changed = true;} tooltip {Range 1...4} xywh {70 268 120 22} type {Horz Knob} color 54 align 8 minimum 1 maximum 4 step 1 value 1 textsize 14 code0 {o->value(progdefaults.HellRcvWidth);} } Fl_Value_Slider valHellRcvHeight { label {Rx Height in pixels} callback {FHdisp_char_height();} tooltip {May require resizing the Rx/Tx panel} xywh {70 307 250 22} type {Horz Knob} color 54 align 8 minimum 14 maximum 42 step 2 value 20 textsize 14 code0 {o->value(progdefaults.HellRcvHeight);} } Fl_Value_Slider sldrHellBW { label {Receive filter bandwidth} callback {progdefaults.HELL_BW = sldrHellBW->value();} tooltip {Adjust the DSP bandwidth} xywh {70 346 250 22} type Horizontal color 54 align 8 minimum 10 maximum 2400 step 5 value 400 textsize 14 code0 {o->value(progdefaults.HELL_BW);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Value_Slider val_hellagc { label {Rx AGC} callback {progdefaults.hellagc=(int)o->value(); progdefaults.changed = true;} tooltip {1 - Slow, 2 - Medium, 3 - Fast} xywh {335 268 120 22} type {Horz Knob} color 54 align 8 minimum 1 maximum 3 step 1 value 2 textsize 14 code0 {o->value(progdefaults.hellagc);} } } } Fl_Group tabFSQ { label FSQ xywh {0 50 600 340} hide } { Fl_Group {} { label {Rx Parameters} open xywh {5 60 585 65} box ENGRAVED_BOX align 21 } { Fl_Value_Slider valhits { label {Min Hits} callback {progdefaults.fsqhits=(int)o->value(); progdefaults.changed = true;} tooltip {Minimum \# hits in tone detector} xywh {140 65 125 22} type {Horz Knob} align 8 minimum 3 maximum 6 step 1 value 3 textsize 14 code0 {o->value(progdefaults.fsqhits);} } Fl_Choice sel_fsq_lpf { label {Image LPF} callback {progdefaults.fsq_img_filter=o->value(); progdefaults.changed = true;} open tooltip {Narrow LPF if image noisy} xywh {163 94 102 22} down_box BORDER_BOX code0 {o->add("None"); o->add("300 Hz"); o->add("400 Hz"); o->add("500 Hz");} code1 {o->value(progdefaults.fsq_img_filter);} } {} Fl_Value_Slider sldrMovAvg { label {MovAvg:} callback {progdefaults.fsq_movavg = o->value(); progdefaults.changed = true;} tooltip {Filter FFT output} xywh {410 65 125 22} type Horizontal align 4 minimum 1 maximum 15 step 1 value 4 textsize 14 code0 {o->value(progdefaults.fsq_movavg);} code1 {o->maximum(MOVAVGLIMIT);} } Fl_Choice sel_fsq_heard_aging { label {Heard aging} callback {progdefaults.fsq_heard_aging=o->value(); progdefaults.changed = true;} open tooltip {Remove call after ...} xywh {433 94 102 22} down_box BORDER_BOX code0 {o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min"); o->add("30 min"); o->add("60 min"); o->add("90 min"); o->add("120 min");} code1 {o->value(progdefaults.fsq_heard_aging);} } {} } Fl_Group {} { label {Tx Parameters} open xywh {5 125 585 95} box ENGRAVED_BOX align 21 } { Fl_Round_Button {btn_fsqbaud[0]} { label {1.5 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 1.5; btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {124 135 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 1.5);} } Fl_Round_Button {btn_fsqbaud[1]} { label {2 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 2; btn_fsqbaud[0]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {217 135 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 2);} } Fl_Round_Button {btn_fsqbaud[2]} { label {3 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 3; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {310 135 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 3);} } Fl_Round_Button {btn_fsqbaud[3]} { label {4.5 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 4.5; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {403 135 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 4.5);} } Fl_Round_Button {btn_fsqbaud[4]} { label {6 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 6; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); } progdefaults.changed = true;} xywh {497 135 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 6);} } Fl_Choice sel_fsq_frequency { label {Center freq} callback {progdefaults.fsq_frequency=o->value(); progdefaults.changed = true;} open xywh {250 199 102 21} down_box BORDER_BOX align 1 hide code0 {o->add("1150"); o->add("1500"); o->add("Variable");} code1 {o->value(progdefaults.fsq_frequency);} } {} Fl_Choice sel_fsq_sounder { label Sounder callback {progdefaults.fsq_sounder=o->value(); progdefaults.changed = true;} open tooltip {Send beacon every ...} xywh {80 156 100 22} down_box BORDER_BOX code0 {o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); o->add("60 min");} code1 {o->value(progdefaults.fsq_sounder);} } {} Fl_Check_Button btn_fsq_lowercase { label {MYCALL always lower case} callback {progdefaults.fsq_lowercase=o->value(); progdefaults.changed = true;} tooltip {convert operator callsign to lower case} xywh {366 159 214 15} down_box DOWN_BOX code0 {o->value(progdefaults.fsq_lowercase);} } Fl_Counter cntr_FSQ_time_out { label {Time out} callback {progdefaults.fsq_time_out = o->value(); progdefaults.changed = true;} tooltip {Time out xmt attempt in XX seconds} xywh {254 156 80 22} type Simple align 4 minimum 2 maximum 20 step 1 value 6 code0 {o->value(progdefaults.fsq_time_out);} } Fl_Input {} { label {QTC:} callback {progdefaults.fsqQTCtext = o->value(); progdefaults.changed = true;} tooltip {Enter QTC text} xywh {80 182 456 22} code0 {o->value(progdefaults.fsqQTCtext.c_str());} } } Fl_Group {} { label {Message Logging} open xywh {5 210 585 55} box ENGRAVED_BOX align 21 } { Fl_Check_Button btn_fsq_msg_dt_stamp { label {Add date/time} callback {progdefaults.add_fsq_msg_dt=o->value(); progdefaults.changed=true;} tooltip {Add date/time stamp to each \# received message} xywh {35 237 135 15} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.add_fsq_msg_dt);} } Fl_Check_Button btn_fsq_msg_append { label {always append to file(s)} callback {progdefaults.always_append=o->value(); progdefaults.changed=true;} tooltip {append \# directive msgs to named file} xywh {182 237 210 15} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.always_append);} } Fl_Counter cntr_FSQ_notify_time_out { label {Notify time out} callback {progdefaults.fsq_notify_time_out = o->value(); progdefaults.changed = true;} tooltip {Notification dialog closes after XX seconds;^j0 == dialog remains open} xywh {495 233 80 22} type Simple align 4 minimum 0 maximum 30 step 1 value 10 code0 {o->value(progdefaults.fsq_notify_time_out);} } } Fl_Group {} { label Logging open xywh {5 265 585 80} box ENGRAVED_BOX align 21 } { Fl_Output txtAuditLog { label {Audit log} xywh {82 285 325 22} code0 {o->value(progdefaults.fsq_audit_log.c_str());} } Fl_Light_Button btn_enable_auditlog { label Enable callback {progdefaults.fsq_enable_audit_log = o->value(); progdefaults.changed = true;} xywh {421 286 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_audit_log);} } Fl_Button btn_select_auditlog { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.fsq_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_audit_log = fl_filename_name(fname); txtAuditLog->value(progdefaults.fsq_audit_log.c_str()); progdefaults.changed = true;} xywh {509 286 70 20} } Fl_Output txtHeardLog { label {Heard log} xywh {82 313 325 22} code0 {o->value(progdefaults.fsq_heard_log.c_str());} } Fl_Light_Button btn_enable_fsq_heard_log { label Enable callback {progdefaults.fsq_enable_heard_log = o->value(); progdefaults.changed = true;} xywh {421 314 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_heard_log);} } Fl_Button btn_select_fsq_heard_log { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.fsq_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_heard_log = fl_filename_name(fname); txtHeardLog->value(progdefaults.fsq_heard_log.c_str()); progdefaults.changed = true;} xywh {509 314 70 20} } } Fl_Group {} { label {Text Colors} open xywh {5 345 585 35} box ENGRAVED_BOX align 21 } { Fl_Button btn_fsq_xmt_color { label XMIT callback {choose_color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->color( progdefaults.fsq_xmt_color ); btn_fsq_xmt_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); progdefaults.changed = true;} tooltip {Transmit text} xywh {145 352 40 20} align 4 code0 {btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color);} } Fl_Button btn_fsq_directed_color { label DIRECTED callback {choose_color(progdefaults.fsq_directed_color); btn_fsq_directed_color->color( progdefaults.fsq_directed_color ); btn_fsq_directed_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); progdefaults.changed = true;} tooltip {Directed received text} xywh {275 352 40 20} align 4 code0 {btn_fsq_directed_color->color(progdefaults.fsq_directed_color);} } Fl_Button btn_fsq_undirected_color { label UNDIRECTED callback {choose_color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->color( progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true;} tooltip {Undirected received text} xywh {425 352 40 20} align 4 code0 {btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color);} } Fl_Button btn_fsq_color_defaults { label Defaults callback {progdefaults.fsq_xmt_color = FL_RED; btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->redraw(); progdefaults.fsq_directed_color = FL_BLUE; btn_fsq_directed_color->color(progdefaults.fsq_directed_color); btn_fsq_directed_color->redraw(); progdefaults.fsq_undirected_color = FL_DARK_GREEN; btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true;} xywh {507 352 74 20} } } } Fl_Group tabIFKP { label IFKP xywh {0 50 600 340} hide } { Fl_Group {} { label {Tx Parameters} open xywh {5 65 587 120} box ENGRAVED_BOX align 21 } { Fl_Round_Button {btn_ifkpbaud[0]} { label {1/2 speed} callback {if (o->value() == 1) { progdefaults.ifkp_baud = 0; btn_ifkpbaud[1]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true;} xywh {100 93 100 17} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.ifkp_baud == 0);} } Fl_Round_Button {btn_ifkpbaud[1]} { label {1x speed} callback {if (o->value() == 1) { progdefaults.ifkp_baud = 1; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true;} tooltip default xywh {208 93 100 17} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.ifkp_baud == 1);} } Fl_Round_Button {btn_ifkpbaud[2]} { label {2x speed} callback {if (o->value() == 1) { progdefaults.ifkp_baud = 2; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[1]->value(0); } progdefaults.changed = true;} xywh {316 93 100 17} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.ifkp_baud == 2);} } Fl_Check_Button btn_ifkp_lowercase { label {MYCALL always lower case} callback {progdefaults.ifkp_lowercase=o->value(); progdefaults.changed = true;} tooltip {convert operator callsign to lower case} xywh {100 125 220 15} down_box DOWN_BOX code0 {o->value(progdefaults.ifkp_lowercase);} } Fl_Check_Button btn_ifkp_lowercase_call { label {CALLSIGN always lower case} callback {progdefaults.ifkp_lowercase_call=o->value(); progdefaults.changed = true;} tooltip {convert other callsign to lower case} xywh {325 125 220 15} down_box DOWN_BOX code0 {o->value(progdefaults.ifkp_lowercase_call);} } Fl_Check_Button btn_ifkp_freqlock { label {lock WF at 1500 Hz} callback {progdefaults.ifkp_freqlock=o->value(); if (active_modem == ifkp_modem && o->value() ) active_modem->set_freq(1500); progdefaults.changed = true;} tooltip {Always transmit at 1500 Hertz center freq.} xywh {100 155 220 15} down_box DOWN_BOX code0 {\#include "trx.h"} code1 {o->value(progdefaults.ifkp_freqlock);} } } Fl_Group {} { label Logging open xywh {5 190 587 100} box ENGRAVED_BOX align 21 } { Fl_Output txt_ifkp_audit_log { label {Audit log} xywh {92 220 323 25} code0 {o->value(progdefaults.ifkp_audit_log.c_str());} } Fl_Light_Button btn_enable_ifkp_audit_log { label Enable callback {progdefaults.ifkp_enable_audit_log = o->value(); progdefaults.changed = true;} xywh {429 220 73 25} selection_color 2 code0 {o->value(progdefaults.ifkp_enable_audit_log);} } Fl_Button btn_ifkp_select_auditlog { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.ifkp_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_audit_log = fl_filename_name(fname); txt_ifkp_audit_log->value(progdefaults.ifkp_audit_log.c_str()); progdefaults.changed = true;} xywh {510 220 70 25} } Fl_Output txt_ifkp_heard_log { label {Heard log} xywh {92 249 323 25} code0 {o->value(progdefaults.ifkp_heard_log.c_str());} } Fl_Light_Button btn_enable_ifkp_heard_log { label Enable callback {progdefaults.ifkp_enable_heard_log = o->value(); progdefaults.changed = true;} xywh {429 249 73 25} selection_color 2 code0 {o->value(progdefaults.ifkp_enable_heard_log);} } Fl_Button btn_select_ifkp_heard_log { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.ifkp_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_heard_log = fl_filename_name(fname); txt_ifkp_heard_log->value(progdefaults.ifkp_heard_log.c_str()); progdefaults.changed = true;} xywh {510 249 70 25} } } } Fl_Group tabMT63 { label {MT-63} xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {55 73 490 84} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnMT63_8bit { label {8-bit extended characters (UTF-8)} callback {progdefaults.mt63_8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 characters} xywh {200 87 205 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.mt63_8bit);} } Fl_Check_Button btnMT63_rx_integration { label {Long receive integration} callback {progdefaults.mt63_rx_integration = o->value(); progdefaults.changed = true;} tooltip {Enable for very weak signals} xywh {200 117 190 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.mt63_rx_integration);} } } Fl_Group {} {open xywh {55 169 490 178} box ENGRAVED_FRAME } { Fl_Check_Button btnMT63_usetones { label {Transmit lower start tone} callback {progdefaults.mt63_usetones = o->value(); if (!o->value()) { btnMT63_upper_lower->value(0); btnMT63_upper_lower->do_callback(); btnMT63_upper_lower->deactivate(); } else btnMT63_upper_lower->activate(); progdefaults.changed = true;} xywh {199 177 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_usetones);} } Fl_Check_Button btnMT63_upper_lower { label {Transmit upper start tone} callback {progdefaults.mt63_twotones = o->value(); progdefaults.changed = true;} xywh {199 207 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_twotones);} code1 {if (!btnMT63_usetones->value()) o->deactivate();} } Fl_Spinner MT63_tone_duration { label {Tone Duration (secs)} callback {progdefaults.mt63_tone_duration=(int)o->value(); progdefaults.changed = true;} xywh {199 233 40 20} align 8 maximum 10 value 4 code0 {o->value(progdefaults.mt63_tone_duration);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Check_Button btnMT63_at500 { label {Low tone at 500 Hz} callback {o->value(1); progdefaults.mt63_at500 = true; progdefaults.mt63_centered = false; btnMT63_centered->value(0); btnMT63_manual->value(0); progdefaults.changed = true;} xywh {199 262 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_at500);} } Fl_Check_Button btnMT63_centered { label {Centered at 1500 Hz (SHARES)} callback {o->value(1); progdefaults.mt63_centered = true; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_manual->value(0); progdefaults.changed = true;} xywh {199 287 248 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_centered);} } Fl_Check_Button btnMT63_manual { label {Manual tuning} callback {o->value(1); progdefaults.mt63_centered = false; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_centered->value(0); progdefaults.changed = true;} xywh {199 312 200 20} down_box DOWN_BOX code0 {o->value(!progdefaults.mt63_at500 && !progdefaults.mt63_centered);} } } } Fl_Group tabOlivia { label Oliv xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {55 76 490 280} box ENGRAVED_FRAME } { Fl_Group i_listbox_olivia_bandwidth { label Bandwidth callback {progdefaults.oliviabw = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select bandwidth} xywh {110 96 85 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaBandwidth);} code1 {o->index(progdefaults.oliviabw);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group i_listbox_olivia_tones { label Tones callback {progdefaults.oliviatones = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select number of tones} xywh {371 96 70 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaTones);} code1 {o->index(progdefaults.oliviatones);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {} { label {Receive synchronizer} open xywh {110 135 379 133} box ENGRAVED_FRAME align 21 } { Fl_Counter cntOlivia_smargin { label {Tune margin (tone frequency spacing)} callback {progdefaults.oliviasmargin = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {125 166 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 8 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.oliviasmargin);} class Fl_Counter2 } Fl_Counter cntOlivia_sinteg { label {Integration period (FEC blocks)} callback {progdefaults.oliviasinteg = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {125 198 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 4 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.oliviasinteg);} class Fl_Counter2 } Fl_Check_Button btn_olivia_reset_fec { label {Reset FEC blocks when changing BW or Tones} callback {progdefaults.olivia_reset_fec = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {126 230 349 20} down_box DOWN_BOX code0 {o->value(progdefaults.olivia_reset_fec);} } } Fl_Check_Button btnOlivia_8bit { label {8-bit extended characters (UTF-8)} callback {progdefaults.olivia8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {131 291 265 20} down_box DOWN_BOX code0 {o->value(progdefaults.olivia8bit);} } Fl_Check_Button btnOlivia_start_stop_tones { label {xmt start/stop tones} callback {progdefaults.olivia_start_tones = o->value(); progdefaults.changed = true;} tooltip {Enable this to send start/stop tones} xywh {131 315 265 20} down_box DOWN_BOX code0 {o->value(progdefaults.olivia_start_tones);} } } } Fl_Group tabContestia { label Cont xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {55 80 490 235} box ENGRAVED_FRAME } { Fl_Group i_listbox_contestia_bandwidth { label Bandwidth callback {progdefaults.contestiabw = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true;} open tooltip {Select bandwidth} xywh {110 100 85 22} box DOWN_BOX color 7 align 8 code0 {o->add(szContestiaBandwidth);} code1 {o->index(progdefaults.contestiabw);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group i_listbox_contestia_tones { label Tones callback {progdefaults.contestiatones = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true;} open tooltip {Select number of tones} xywh {371 100 70 22} box DOWN_BOX color 7 align 8 code0 {o->add(szContestiaTones);} code1 {o->index(progdefaults.contestiatones);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {} { label {Receive synchronizer} open xywh {93 139 414 131} box ENGRAVED_FRAME align 21 } { Fl_Counter cntContestia_smargin { label {Tune margin (tone frequency spacing)} callback {progdefaults.contestiasmargin = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {112 170 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 8 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntContestia_sinteg { label {Integration period (FEC blocks)} callback {progdefaults.contestiasinteg = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {112 202 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Check_Button btnContestia_8bit { label {8-bit extended characters} callback {progdefaults.contestia8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for Latin-1 accented characters} xywh {79 249 200 20} down_box DOWN_BOX hide } Fl_Check_Button btnContestia_start_stop_tones { label {xmt start/stop tones} callback {progdefaults.contestia_start_tones = o->value(); progdefaults.changed = true;} tooltip {Enable this to send start/stop tones} xywh {141 280 265 20} down_box DOWN_BOX code0 {o->value(progdefaults.contestia_start_tones);} } } } Fl_Group tabPSK { label PSK xywh {0 50 600 340} hide } { Fl_Tabs tabsPSK {open xywh {0 50 600 340} selection_color 50 } { Fl_Group grpPSK { label General open xywh {0 75 600 315} align 5 } { Fl_Group {} { label {AFC behavior} open xywh {55 87 490 86} box ENGRAVED_FRAME align 21 } { Fl_Counter cntSearchRange { label {Acquisition search range (Hz)} callback {progdefaults.SearchRange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Capture signals within this frequency range} xywh {200 111 75 20} type Simple align 8 minimum 10 maximum 500 step 10 value 200 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntACQsn { label {Acquisition S/N (dB)} callback {progdefaults.ACQsn = o->value(); progdefaults.changed = true;} tooltip {Capture signals over this threshold} xywh {200 140 75 20} type Simple align 8 minimum 3 maximum 20 step 1 value 6 code0 {o->value(progdefaults.ACQsn);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label {S/N and IMD behavior} open xywh {55 175 490 65} box ENGRAVED_FRAME align 21 } { Fl_Group listbox_psk_status_timeout { label after callback {progdefaults.StatusDim = o->index(); progdefaults.changed = true;} open tooltip {Behavior of s/n imd} xywh {180 206 80 20} box DOWN_BOX color 7 align 8 code0 {o->add(_("Clear")); o->add(_("Dim"));} code1 {o->index(progdefaults.StatusDim); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter {} { label seconds callback {progdefaults.StatusTimeout = (int)(o->value()); progdefaults.changed = true;} tooltip {Will occur after this time in seconds} xywh {321 206 75 20} type Simple align 8 minimum 0 maximum 30 step 1 code0 {o->value(progdefaults.StatusTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label {Multi-Channel Signal Processing} open xywh {55 245 490 80} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnEnablePSKbrowsing { label {Multi-channel detector} callback {progdefaults.pskbrowser_on = o->value(); progdefaults.changed = true;} xywh {225 295 180 20} down_box DOWN_BOX code0 {o->value(progdefaults.pskbrowser_on);} } Fl_Box {} { label {Disable on very slow CPUs of if signal browser is not used} xywh {65 272 440 20} align 20 } } Fl_Group {} { label {8 psk} open xywh {55 327 490 47} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnPSKpilot { label {Pilot tone} callback {progdefaults.pskpilot = o->value(); progdefaults.changed = true;} tooltip {Enable encode/decode vestigial pilot tone} xywh {100 340 113 20} down_box DOWN_BOX code0 {o->value(progdefaults.pskpilot);} } Fl_Counter cnt_pilot_power { label {pilot power (dB)} callback {progdefaults.pilot_power = o->value(); progdefaults.changed = true;} tooltip {Pilot tone power relative to signal} xywh {205 340 75 20} type Simple align 8 minimum -60 maximum -20 step 1 value -30 code0 {o->value(progdefaults.pilot_power);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnPSK8Preamble { label {Short Preamble} callback {progStatus.psk8DCDShortFlag = o->value();} tooltip {Enable short preamble for 8PSK transmission} xywh {410 340 113 20} down_box DOWN_BOX code0 {o->value(progStatus.psk8DCDShortFlag);} } } } } } Fl_Group tabRTTY { label TTY open xywh {0 50 609 340} hide } { Fl_Tabs tabsRTTY {open xywh {0 50 609 340} selection_color 50 } { Fl_Group tab_Rx_TTY { label Rx xywh {0 75 600 315} align 5 hide } { Fl_Group {} { label Receive open xywh {32 101 535 69} box ENGRAVED_FRAME align 21 } { Fl_Group i_listbox_rtty_afc_speed { label {AFC speed} callback {progdefaults.rtty_afcspeed = o->index(); progdefaults.changed = true;} open tooltip {AFC tracking speed} xywh {107 128 90 22} box DOWN_BOX color 7 code0 {o->add("Slow"); o->add("Normal"); o->add("Fast");} code1 {o->index(progdefaults.rtty_afcspeed);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button chkUOSrx { label {RX - unshift on space} callback {progdefaults.UOSrx=o->value(); progdefaults.changed = true;} tooltip {Revert to unshifted char's on a space} xywh {211 128 63 22} down_box DOWN_BOX code0 {o->value(progdefaults.UOSrx);} } Fl_Value_Input rtty_rx_shape { label {Filter Shape Factor} callback {progdefaults.rtty_filter = o->value(); progStatus.rtty_filter_changed = true; progdefaults.changed = true;} tooltip {rcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500} xywh {445 126 48 25} align 1 minimum 1 maximum 2 step 0.001 value 1.25 hide code0 {o->value(progdefaults.rtty_filter);} } } Fl_Group {} { label {Decode (CWI suppression)} open xywh {32 171 535 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button {btnRxTones[0]} { label {Mark-Space} callback {if (o->value()) { btnRxTones[1]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 0; }} xywh {120 198 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 0);} } Fl_Check_Button {btnRxTones[1]} { label {Mark only} callback {if (o->value()) { btnRxTones[0]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 1; }} xywh {253 198 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 1);} } Fl_Check_Button {btnRxTones[2]} { label {Space only} callback {if (o->value()) { btnRxTones[1]->value(0); btnRxTones[0]->value(0); progdefaults.rtty_cwi = 2; }} xywh {387 198 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 2);} } } Fl_Group {} { label {RTTY Scope Display} open xywh {32 228 535 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnPreferXhairScope { label {Use cross hair scope} callback {progdefaults.PreferXhairScope=o->value(); progdefaults.changed = true;} tooltip {Default to cross hair digiscope} xywh {120 250 165 22} down_box DOWN_BOX code0 {o->value(progdefaults.PreferXhairScope);} } Fl_Check_Button chk_true_scope { label {XY - classic scope} callback {progdefaults.true_scope=o->value(); progdefaults.changed = true;} tooltip {Enabled - use Mark/Space filter outputs Disabled - use pseudo signals} xywh {340 250 70 22} down_box DOWN_BOX code0 {o->value(progdefaults.true_scope);} } } Fl_Group {} { label {Log RTTY frequency} open xywh {32 285 535 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_useMARKfreq { label {Use MARK freq'} callback {progdefaults.useMARKfreq=o->value(); progdefaults.changed = true;} tooltip {Enabled - log QSO using Mark frequency Disabled - log QSO using center frequency} xywh {120 311 146 22} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.useMARKfreq);} } Fl_Button btnRTTY_mark_color { label {track color} callback {if (fl_color_chooser("MARK freq track", progdefaults.rttymarkRGBI.R, progdefaults.rttymarkRGBI.G, progdefaults.rttymarkRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Color of Mark Track} xywh {340 311 41 18} color 2 align 8 code0 {o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B));} } } } Fl_Group tab_SndCrd_FSK { label Tx xywh {0 75 600 315} align 5 hide } { Fl_Group {} { label {Sound Card FSK} xywh {5 85 590 225} box ENGRAVED_FRAME align 21 } { Fl_Group selShift { label {Carrier shift} callback {progdefaults.rtty_shift = o->index(); sel_xcvr_FSK_shift->index(progdefaults.rtty_shift); if (progdefaults.rtty_shift == o->lsize() - 1) selCustomShift->activate(); else selCustomShift->deactivate(); selCustomShift->redraw(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select carrier shift} xywh {75 109 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szShifts);o->index(progdefaults.rtty_shift); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter selCustomShift { label {Custom shift} callback {progdefaults.rtty_custom_shift = o->value(); resetRTTY(); progdefaults.changed = true;} tooltip {Input carrier shift} xywh {75 142 100 22} align 8 minimum 10 maximum 1200 step 10 value 450 code0 {o->lstep(100.0);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group selBaud { label {Baud rate} callback {progdefaults.rtty_baud = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select carrier baudrate} xywh {75 175 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szBauds);} code1 {o->index(progdefaults.rtty_baud);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selBits { label {Bits per character} callback {progdefaults.rtty_bits = o->index(); selParity->do_callback();} open tooltip {Select \# bits / char} xywh {75 208 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szSelBits);o->index(progdefaults.rtty_bits); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selParity { label Parity callback {if (progdefaults.rtty_bits == 0) { progdefaults.rtty_parity = rtty::RTTY_PARITY_NONE; o->index(progdefaults.rtty_parity); } else progdefaults.rtty_parity = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select parity} xywh {75 241 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szParity);o->index(progdefaults.rtty_parity); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selStopBits { label {Stop bits} callback {progdefaults.rtty_stop = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select \# stop bits} xywh {75 275 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szStopBits);o->index(progdefaults.rtty_stop); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnAUTOCRLF { label AutoCRLF callback {progdefaults.rtty_autocrlf = o->value(); progdefaults.changed = true;} tooltip {Add CRLF after page width characters} xywh {326 109 90 22} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_autocrlf);} } Fl_Counter cntrAUTOCRLF { label chars callback {progdefaults.rtty_autocount = (int)o->value(); progdefaults.changed = true;} tooltip {Auto CRLF line length} xywh {437 109 65 22} type Simple align 8 minimum 68 maximum 80 step 1 value 72 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnCRCRLF { label {CR-CR-LF} callback {progdefaults.rtty_crcrlf = o->value(); progdefaults.changed = true;} tooltip {Use "cr cr lf" for "cr lf"} xywh {326 142 90 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.rtty_crcrlf);} } Fl_Check_Button chkUOStx { label {TX - unshift on space} callback {progdefaults.UOStx=o->value(); progdefaults.changed = true;} tooltip {Revert to Unsifted char's on a space} xywh {326 175 63 22} down_box DOWN_BOX code0 {o->value(progdefaults.UOStx);} } Fl_Check_Button chk_shaped_rtty { label {Shaped Tx} callback {progStatus.shaped_rtty = o->value();} tooltip {Use wave shaping on Tx signal} xywh {326 241 212 22} down_box DOWN_BOX value 1 code0 {o->value(progStatus.shaped_rtty);} } Fl_Check_Button chkPseudoFSK { label {Pseudo-FSK - right channel} callback {progdefaults.PseudoFSK = o->value(); chkPseudoFSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }} tooltip {Create keyed square wave on right audio channel} xywh {326 208 212 22} down_box DOWN_BOX code0 {o->value(progdefaults.PseudoFSK);} } } Fl_Group {} { label {Transceiver FSK} xywh {5 312 590 72} box ENGRAVED_FRAME align 21 } { Fl_Counter cntr_xcvr_FSK_MARK { label Mark callback {progdefaults.xcvr_FSK_MARK = o->value();} tooltip {Mark frequency in Hertz} xywh {15 341 126 23} align 8 minimum 500 maximum 3000 step 1 value 2115 code0 {o->value(progdefaults.xcvr_FSK_MARK);} code1 {o->lstep(10);} } Fl_Group sel_xcvr_FSK_shift { label {Carrier shift} callback {progdefaults.rtty_shift = o->index(); selShift->index(progdefaults.rtty_shift); resetRTTY(); progdefaults.changed = true;} open tooltip {Carrier shift in Hertz} xywh {198 341 100 23} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szShifts);} code1 {o->index(progdefaults.rtty_shift);} class Fl_ListBox } {} Fl_Counter cnt_TTY_LTRS { label {LTRS at start} callback {progdefaults.TTY_LTRS = (int)o->value(); progdefaults.changed = true;} tooltip {Insert NN LTRS bytes at start of each transmission} xywh {405 341 80 23} type Simple align 8 minimum 0 maximum 10 step 1 value 2 code0 {o->value(progdefaults.TTY_LTRS);} } } } Fl_Group tab_nanoIO { label {nanoIO Tx} xywh {0 75 600 315} align 5 hide } { Fl_Group select_nanoIO_CommPort { label {Ser. Port} callback {progdefaults.nanoIO_serial_port_name = o->value();} open tooltip {nanoIO serial port} xywh {86 85 405 23} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "nanoIO.h"} class Fl_ComboBox } {} Fl_Light_Button btn_nanoIO_connect { label Connect callback {if (o->value()) { btn_nanoCW_connect->value(0); if (!open_nanoIO()) o->value(0); } else { close_nanoIO(); }} tooltip {Connect / Disconnect from nanoIO} xywh {501 85 80 23} } Fl_Group sel_nanoIO_baud { label {Baud rate} callback {progdefaults.nanoIO_baud = o->index(); nano_set_baud(progdefaults.nanoIO_baud); progdefaults.changed = true;} open tooltip {nanoIO - TTY baud} xywh {391 112 100 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("45.45|50.0|75.0|100.0");} code1 {o->index(progdefaults.nanoIO_baud);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button chk_nanoIO_polarity { label {MARK polarity} callback {progdefaults.nanoIO_polarity=o->value(); nano_mark_polarity(progdefaults.nanoIO_polarity); progdefaults.changed = true;} tooltip {Set - mark logical HIGH Read from nanoIO} xywh {84 112 63 22} down_box DOWN_BOX code0 {o->value(progdefaults.nanoIO_polarity);} } Fl_Text_Display txt_nano_io { label {USB serial I/O} xywh {4 155 590 230} align 5 code0 {\#include "FTextRXTX.h"} code1 {o->setFont(progdefaults.RxFontnbr);} code2 {o->setFontSize(12);} class FTextView } } Fl_Group tab_Nav { label Navigator xywh {0 75 600 315} align 5 hide code0 {\#include "Nav.h"} } { Fl_Group {} { label {FSK Interface} open xywh {5 82 590 55} box ENGRAVED_FRAME align 21 } { Fl_Group select_USN_FSK_port { label Port callback {progdefaults.Nav_FSK_port = o->value();} open tooltip {Navigator serial port} xywh {48 105 455 23} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "Nav.h"} code2 {o->value(progdefaults.Nav_FSK_port.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_Nav_connect { label FSK callback {if (o->value()) { if (!open_NavFSK()) o->value(0); } else { close_NavFSK(); }} tooltip {Connect / Disconnect from Nav FSK port} xywh {510 105 80 23} } } Fl_Group {} { label {Configuration Interface} open xywh {5 140 590 245} box ENGRAVED_FRAME align 21 } { Fl_Group select_Nav_config_port { label Port callback {progdefaults.Nav_config_port = o->value();} open tooltip {Navigator configuration port} xywh {49 161 455 23} box DOWN_BOX color 55 align 4 code0 {o->value(progdefaults.Nav_config_port.c_str());} class Fl_ComboBox } {} Fl_Group sel_Nav_ch1 { label {Channel 1 Attenuator} callback {progdefaults.Nav_channel_1_att = o->index(); Nav_set_channel_1_att(progdefaults.Nav_channel_1_att); progdefaults.changed = true;} open tooltip {Nav Channel 1 attenuator} xywh {177 188 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->add("15 db|Normal");} code2 {o->index(progdefaults.Nav_channel_1_att);} class Fl_ListBox } {} Fl_Group sel_Nav_ch2 { label {Channel 2 attenuator} callback {progdefaults.Nav_channel_2_att = o->index(); Nav_set_channel_2_att(progdefaults.Nav_channel_2_att); progdefaults.changed = true;} open tooltip {NavChannel 2 Attenuator} xywh {177 217 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->add("15 db|Normal");} code2 {o->index(progdefaults.Nav_channel_2_att);} class Fl_ListBox } {} Fl_Group sel_Nav_rf_att { label {RF attenuator} callback {progdefaults.Nav_rf_att = o->index(); Nav_set_rf_att(progdefaults.Nav_rf_att); progdefaults.changed = true;} open tooltip {NavRF Attenuator} xywh {177 247 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->add("20 db|Normal");} code2 {o->index(progdefaults.Nav_rf_att);} class Fl_ListBox } {} Fl_Group sel_Nav_wk_ptt { label {WinKey PTT} callback {progdefaults.Nav_wk_ptt = o->index(); Nav_set_wk_ptt(progdefaults.Nav_wk_ptt); progdefaults.changed = true;} open tooltip {NavWinkey PTT} xywh {177 277 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->index(progdefaults.Nav_wk_ptt);} code2 {o->add("On|Off");} class Fl_ListBox } {} Fl_Group sel_Nav_LED { label {LED brightness} callback {progdefaults.Nav_led = o->index(); Nav_set_led(progdefaults.Nav_led); progdefaults.changed = true;} open tooltip {NavLED brightness} xywh {177 307 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->index(progdefaults.Nav_led);} code2 {o->add("Dim|Normal");} class Fl_ListBox } {} Fl_Group sel_Nav_CAT_LED { label {CAT LED state} callback {progdefaults.Nav_cat_led = o->index(); Nav_set_cat_led(progdefaults.Nav_cat_led); progdefaults.changed = true;} open tooltip {NavCAT state LED} xywh {177 337 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->index(progdefaults.Nav_cat_led);} code2 {o->add("Steady|Polling");} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_baud { label {Baud rate} callback {progdefaults.Nav_FSK_baud = o->index(); Nav_set_baud(progdefaults.Nav_FSK_baud); progdefaults.changed = true;} open tooltip {Nav FSK baud rate} xywh {385 188 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("45.45|75|100");} code1 {o->index(progdefaults.Nav_FSK_baud);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_stopbits { label {Stop bits} callback {progdefaults.Nav_FSK_stopbits = o->index(); Nav_set_stopbits(progdefaults.Nav_FSK_stopbits); progdefaults.changed = true;} open tooltip {Nav FSK Stop bits} xywh {384 217 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("1|1.5|2");} code1 {o->index(progdefaults.Nav_FSK_stopbits);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_polarity { label {Mark Polarity} callback {progdefaults.Nav_FSK_polarity = o->index(); Nav_set_polarity(progdefaults.Nav_FSK_polarity); progdefaults.changed = true;} open tooltip {Nav FSK MARK Polarity} xywh {384 247 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Normal|Reverse");} code1 {o->index(progdefaults.Nav_FSK_polarity);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_sidetone { label {Side tone} callback {progdefaults.Nav_FSK_sidetone = o->index(); Nav_set_sidetone(progdefaults.Nav_FSK_sidetone); progdefaults.changed = true;} open tooltip {Nav FSK side tone} xywh {384 277 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("On|Off");} code1 {o->index(progdefaults.Nav_FSK_sidetone);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_ptt { label {FSK PTT} callback {progdefaults.Nav_FSK_ptt = o->index(); Nav_set_ptt(progdefaults.Nav_FSK_ptt); progdefaults.changed = true;} open tooltip {Nav FSK PTT - should always be on} xywh {384 307 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("On|Off");} code1 {o->index(progdefaults.Nav_FSK_ptt);} class Fl_ListBox } {} Fl_Light_Button btn_Nav_config { label Config callback {if (o->value()) { if (!open_NavConfig()) o->value(0); } else { close_NavConfig(); }} tooltip {Connect / Disconnect from Nav Config port} xywh {509 161 80 23} } } } Fl_Group tab_Synop { label Synop xywh {0 75 600 315} align 5 hide } { Fl_Check_Button btnSynopAdifDecoding { label {SYNOP to ADIF} callback {progdefaults.SynopAdifDecoding=o->value(); progdefaults.changed = true;} tooltip {Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file} xywh {190 91 126 22} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopAdifDecoding);} } Fl_Check_Button btnSynopKmlDecoding { label {SYNOP to KML} callback {progdefaults.SynopKmlDecoding=o->value(); progdefaults.changed = true;} tooltip {Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)} xywh {190 129 119 22} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopKmlDecoding);} } Fl_Check_Button btnSynopInterleaved { label {Interleave SYNOP and text} callback {progdefaults.SynopInterleaved=o->value(); progdefaults.changed = true;} tooltip {Interleave text with decoded SYNOP messages, or replacement.} xywh {190 168 210 22} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopInterleaved);} } } Fl_Group tab_WKFSK { label {Winkeyer 3} open xywh {0 75 609 315} align 5 code0 {\#include "winkeyer.h"} } { Fl_Group {} { label {Serial Interface} open xywh {5 82 590 55} box ENGRAVED_FRAME align 21 } { Fl_Group select_WKFSK_CommPort { label Port callback {progStatus.WK_serial_port_name = o->value(); select_WK_CommPort->value(progStatus.WK_serial_port_name.c_str());} open tooltip {Xcvr serial port} xywh {73 105 405 23} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {o->value(progStatus.WK_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_WKFSK_connect { label Connect callback {WKFSK_connect(o->value());} tooltip {Connect / Disconnect from WinKeyer} xywh {504 105 80 23} code0 {o->value(progStatus.WK_online);} } } Fl_Group {} { label {Configuration Interface} open xywh {5 140 590 245} box ENGRAVED_FRAME align 21 } { Fl_Group sel_WKFSK_baud { label {Baud rate} callback {progStatus.WKFSK_baud = o->index(); WKFSK_init();} open tooltip {Nav FSK baud rate} xywh {190 178 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("45.45|50|75|100");} code1 {o->index(progStatus.WKFSK_baud);} class Fl_ListBox } {} Fl_Group sel_WKFSK_stopbits { label {Stop bits} callback {progStatus.WKFSK_stopbits = o->index(); WKFSK_init();} open tooltip {Nav FSK Stop bits} xywh {190 207 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("2|1.5");} code1 {o->index(progStatus.WKFSK_stopbits);} class Fl_ListBox } {} Fl_Group sel_WKFSK_ptt { label {FSK port} callback {progStatus.WKFSK_ptt = o->index(); WKFSK_init();} open tooltip {NavWinkey PTT} xywh {190 236 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("On PTT|On KEY");} code1 {o->index(progStatus.WKFSK_ptt);} class Fl_ListBox } {} Fl_Group sel_WKFSK_polarity { label {Mark Polarity} callback {progStatus.WKFSK_polarity = o->index(); WKFSK_init();} open tooltip {Nav FSK MARK Polarity} xywh {190 266 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Normal|Reverse");} code1 {o->index(progStatus.WKFSK_polarity);} class Fl_ListBox } {} Fl_Group sel_WKFSK_sidetone { label Sidetone callback {progStatus.WKFSK_sidetone = o->index(); WKFSK_init();} open tooltip {Nav FSK side tone} xywh {190 295 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_sidetone);} class Fl_ListBox } {} Fl_Group sel_WKFSK_auto_crlf { label {Auto CRLF} callback {progStatus.WKFSK_auto_crlf = o->index(); WKFSK_init();} open tooltip {Nav FSK side tone} xywh {190 325 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_auto_crlf);} class Fl_ListBox } {} Fl_Group sel_WKFSK_diddle { label Diddle callback {progStatus.WKFSK_diddle = o->index(); WKFSK_init();} open tooltip {Diddle On/OFF} xywh {380 178 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_diddle);} class Fl_ListBox } {} Fl_Group sel_WKFSK_diddle_char { label {Diddle char} callback {progStatus.WKFSK_diddle_char = o->index(); WKFSK_init();} open tooltip {Diddle character} xywh {380 207 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("BLANK|LTRS");} code1 {o->index(progStatus.WKFSK_diddle_char);} class Fl_ListBox } {} Fl_Group sel_WKFSK_usos { label USOS callback {progStatus.WKFSK_usos = o->index(); WKFSK_init();} open tooltip {Unshift on space} xywh {380 236 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_usos);} class Fl_ListBox } {} Fl_Group sel_WKFSK_monitor { label Echo callback {progStatus.WKFSK_monitor = o->index(); WKFSK_init();} open tooltip {Unshift on space} xywh {380 266 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_monitor);} class Fl_ListBox } {} } } } } Fl_Group tabTHOR { label Thor xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {55 78 490 270} box ENGRAVED_FRAME } { Fl_Input txtTHORSecondary { label {Secondary Text} callback {progdefaults.THORsecText = o->value(); progdefaults.changed = true;} tooltip {Text to send during keyboard idle times} xywh {84 105 430 40} type Multiline align 5 when 1 code0 {txtTHORSecondary->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button valTHOR_FILTER { label Filtering callback {progdefaults.THOR_FILTER = o->value(); resetTHOR(); progdefaults.changed = true;} tooltip {Enable DSP prior to decoder} xywh {84 159 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.THOR_FILTER);} } Fl_Counter valTHOR_BW { label {Filter bandwidth factor} callback {progdefaults.THOR_BW = o->value(); resetTHOR(); progdefaults.changed = true;} tooltip {Filter bandwidth relative to signal width} xywh {229 159 63 20} type Simple align 8 minimum 1 maximum 2 value 1.5 code0 {o->value(progdefaults.THOR_BW);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Value_Slider valThorCWI { label {CWI threshold} callback {progdefaults.ThorCWI = o->value(); progdefaults.changed = true;} tooltip {CWI detection and suppression} xywh {84 212 260 20} type Horizontal align 1 textsize 14 code0 {o->value(progdefaults.ThorCWI);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button valTHOR_PREAMBLE { label {Preamble Detection} callback {progdefaults.THOR_PREAMBLE = o->value(); progdefaults.changed = true;} tooltip {Detect the THOR preamble Clear the Rx pipeline} xywh {84 254 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_PREAMBLE);} } Fl_Check_Button valTHOR_SOFTSYMBOLS { label {Soft-symbol decoding} callback {progdefaults.THOR_SOFTSYMBOLS = o->value(); progdefaults.changed = true;} tooltip {Use soft-decision decoding for symbol detection Assists soft-bit decoding} xywh {84 284 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_SOFTSYMBOLS);} } Fl_Check_Button valTHOR_SOFTBITS { label {Soft-bit decoding} callback {progdefaults.THOR_SOFTBITS = o->value(); progdefaults.changed = true;} tooltip {Use soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabled} xywh {84 314 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_SOFTBITS);} } Fl_Counter valTHOR_PATHS { label {Paths (hidden)} callback {progdefaults.THOR_PATHS = (int)o->value(); progdefaults.changed = true;} xywh {431 303 75 21} type Simple align 1 minimum 4 maximum 8 step 1 value 5 code0 {o->value(progdefaults.THOR_PATHS);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->hide();} class Fl_Counter2 } } } Fl_Group tabOther { label Other open xywh {0 50 600 340} hide } { Fl_Tabs tabsOther {open xywh {0 50 600 340} } { Fl_Group tabNavtex { label Nav xywh {0 75 600 315} hide } { Fl_Check_Button btnNvtxAdifLog { label {Log Navtex messages to Adif file} callback {progdefaults.NVTX_AdifLog=o->value(); progdefaults.changed = true;} xywh {181 109 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.NVTX_AdifLog);} } Fl_Check_Button btnNvtxKmlLog { label {Log Navtex messages to KML} callback {progdefaults.NVTX_KmlLog=o->value(); progdefaults.changed = true;} tooltip {Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)} xywh {180 155 270 30} down_box DOWN_BOX code0 {o->value(progdefaults.NVTX_KmlLog);} } } Fl_Group tabWefax { label WFx xywh {0 75 600 315} } { Fl_Group {} {open xywh {2 79 598 285} } { Fl_Check_Button btnWefaxAdifLog { label {Log Wefax messages to Adif file} callback {progdefaults.WEFAX_AdifLog=o->value(); progdefaults.changed = true;} tooltip {Sent and received faxes are logged to Adif file.} xywh {99 155 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_AdifLog);} } Fl_Check_Button btnWefaxEmbeddedGui { label {Embedded Wefax Gui} callback {progdefaults.WEFAX_EmbeddedGui=o->value(); progdefaults.changed = true;} tooltip {Display tx and rx in main fldigi window. Change requires restart of fldigi} xywh {99 92 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_EmbeddedGui);} } Fl_Input btnWefaxShift { label {Frequency shift (800 Hz)} callback {if( o->value() > 900 ) { o->value(900); return; } if( o->value() < 750 ) { o->value(750); return; } progdefaults.WEFAX_Shift=o->value(); progdefaults.changed = true;} tooltip {Default 800 Hz. Deutsche Wetterdienst 850Hz} xywh {99 195 80 20} type Int align 8 code0 {o->value(progdefaults.WEFAX_Shift);} class Fl_Value_Input2 } Fl_Input btnWefaxMaxRows { label {Received fax maximum rows number (5000)} callback {if(o->value() > 10000 ) { o->value(10000); return ; } if(o->value() < 1000 ) { o->value(1000); return ; } progdefaults.WEFAX_MaxRows=o->value(); progdefaults.changed = true;} tooltip {Maximum row number for a received fax image.} xywh {99 235 85 20} type Int align 8 code0 {o->value(progdefaults.WEFAX_MaxRows);} class Fl_Value_Input2 } Fl_Input btnWefaxSaveDir { label {Fax images destination directory} callback {progdefaults.wefax_save_dir=o->value(); progdefaults.changed = true;} xywh {99 285 310 20} align 5 code0 {o->value(progdefaults.wefax_save_dir.c_str());} } Fl_Button btnSelectFaxDestDir { label {Directory...} callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(WefaxDestDirSet); fc->show();} xywh {429 285 80 20} } Fl_Check_Button btnWefaxHideTx { label {Hide Transmission window} callback {progdefaults.WEFAX_HideTx=o->value(); progdefaults.changed = true;} tooltip {Hide transmission window by default.} xywh {99 125 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_HideTx);} } Fl_Check_Button btnWefaxSaveMonochrome { label {Save image as monochrome file} callback {progdefaults.WEFAX_SaveMonochrome=o->value(); progdefaults.changed = true;} tooltip {Save the fax image as a gray-level PNG file.} xywh {99 315 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_SaveMonochrome);} } } } } } } } Fl_Group tabRig { label Rig open xywh {0 25 600 365} hide } { Fl_Tabs tabsRig {open xywh {0 25 600 365} selection_color 50 } { Fl_Group tabFLRIG { label flrig open xywh {0 50 600 340} } { Fl_Group {} { label {"Disable PTT keys modem if multiple instances of fldigi (client) are connected to a single flrig (server).} open xywh {10 210 580 90} box ENGRAVED_BOX align 17 } { Fl_Check_Button chk_flrig_keys_modem { label {Flrig PTT keys modem} callback {progdefaults.flrig_keys_modem = o->value(); progdefaults.changed = true;} tooltip {" "} xywh {240 258 183 20} down_box DOWN_BOX code0 {o->value(progdefaults.flrig_keys_modem);} } } Fl_Group {} { label {flrig xmlrpc server parameters these controls are mirrored on the IO configuration tab} open xywh {10 125 580 81} box ENGRAVED_FRAME align 21 } { Fl_Button btnDefault_flrig_ip_mirror { label Default callback {set_ip_to_default(FLRIG_IO); txt_flrig_ip_address_mirror->value(progdefaults.flrig_ip_address.c_str()); txt_flrig_ip_port_mirror->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {414 171 73 24} } Fl_Input txt_flrig_ip_address_mirror { label Addr callback {progdefaults.flrig_ip_address = o->value(); txt_flrig_ip_address->value(progdefaults.flrig_ip_address.c_str()); progdefaults.changed = true;} tooltip {IP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {45 171 230 24} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_address.c_str());} class Fl_Input2 } Fl_Input txt_flrig_ip_port_mirror { label Port callback {progdefaults.flrig_ip_port = o->value(); txt_flrig_ip_port->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {319 171 55 24} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_port.c_str());} class Fl_Input2 } Fl_Button btn_reconnect_flrig_server_mirror { label Reconnect callback {reconnect_to_flrig();} tooltip {Press only if you change the address/port} xywh {494 171 82 24} code0 {\#include "rigsupport.h"} } } Fl_Group {} { label {flrig is the preferred method of tranceiver control} open xywh {10 68 580 52} box ENGRAVED_BOX align 17 } { Fl_Check_Button btn_fldigi_client_to_fldigi { label {Enable flrig xcvr control with fldigi as client} callback {progdefaults.fldigi_client_to_flrig=o->value(); if (o->value()) { progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = false; chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); } progdefaults.changed=true;} tooltip {Disable if flrig not used.} xywh {35 95 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.fldigi_client_to_flrig);} } } } Fl_Group {} { label RigCAT open xywh {0 50 600 340} hide } { Fl_Check_Button chkUSERIGCAT { label {Use RigCAT} callback {if (o->value() == 1) { chkUSEHAMLIB->value(0); btn_fldigi_client_to_fldigi->value(0); progdefaults.chkUSERIGCATis = true; progdefaults.fldigi_client_to_flrig = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } else { progdefaults.chkUSERIGCATis = false; progdefaults.initInterface(); } progdefaults.changed=true;} tooltip {RigCAT used for rig control} xywh {245 60 110 20} down_box DOWN_BOX } Fl_Group grpRigCAT {open xywh {55 83 490 279} box ENGRAVED_FRAME } { Fl_Output txtXmlRigFilename { label {Rig description file:} tooltip {Use Open to select descriptor file} xywh {65 107 130 22} color 52 align 5 code0 {o->value(fl_filename_name(progdefaults.XmlRigFilename.c_str()));} } Fl_Button btnSelectRigXmlFile { label {Open...} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); selectRigXmlFilename();} tooltip {Select rig descriptor file} xywh {198 107 60 22} } Fl_Group inpXmlRigDevice { label {Device:} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} open xywh {391 107 144 22} box DOWN_BOX color 7 align 4 code0 {o->value(progdefaults.XmlRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Value_Input cntRigCatRetries { label Retries callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {\# retries before giving up} xywh {80 150 60 22} align 5 maximum 1000 step 1 code0 {o->value(progdefaults.RigCatRetries);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntRigCatTimeout { label {Retry interval (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Time between retires in msec} xywh {210 150 60 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntRigCatWait { label {Write delay (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Wait for response to subsequent command} xywh {80 190 60 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatWait);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Group listbox_xml_rig_baudrate { label {Baud rate:} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} open xywh {436 150 99 22} box DOWN_BOX color 7 align 4 code0 {o->add(szBaudRates);} code1 {o->index(progdefaults.XmlRigBaudrate); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter valRigCatStopbits { label Stopbits callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw();} xywh {438 184 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 code0 {o->value(progdefaults.RigCatStopbits);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Button btnInitRIGCAT { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize RigCAT interface} xywh {415 321 113 24} } Fl_Check_Button btnRigCatEcho { label {Commands are echoed} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); progdefaults.changed = true;} tooltip {Rig or interface echos serial data} xywh {100 216 192 22} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatECHO);} } Fl_Round_Button btnRigCatCMDptt { label {CAT command for PTT} callback {if (o->value()== 1) { btnRigCatRTSptt->value(0); btnRigCatDTRptt->value(0); progdefaults.RigCatCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatCMDptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw();} tooltip {PTT is a CAT command (not hardware)} xywh {306 217 207 20} down_box DOWN_BOX selection_color 1 code0 {o->value(progdefaults.RigCatCMDptt);} } Fl_Round_Button btnRigCatRTSptt { label {Toggle RTS for PTT} callback {if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatRTSptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatRTSptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {RTS is ptt line} xywh {100 246 160 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSptt);} } Fl_Round_Button btnRigCatDTRptt { label {Toggle DTR for PTT} callback {if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatDTRptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatDTRptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {DTR is ptt line} xywh {306 244 160 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatDTRptt);} } Fl_Check_Button btnRigCatRTSplus { label {RTS +12 v} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Initial state of RTS} xywh {100 275 100 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSplus);} } Fl_Check_Button btnRigCatDTRplus { label {DTR +12 v} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Initial state of DTR} xywh {306 272 100 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatDTRplus);} } Fl_Check_Button chkRigCatRTSCTSflow { label {RTS/CTS flow control} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Rig uses RTS/CTS handshake} xywh {100 303 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSCTSflow);} } Fl_Check_Button chk_restore_tio { label {Restore UART Settings on Close} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Restore the serial (COM) port settings} xywh {100 332 205 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRestoreTIO);} } Fl_Check_Button chkRigCatVSP { label {VSP Enable} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Virtual Serial Port Emulator - suppress WARNINGS} xywh {306 300 100 25} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatVSP);} } Fl_Value_Input cntRigCatInitDelay { label {Init delay (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Wait for response to first CAT command} xywh {210 190 75 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatInitDelay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } } } Fl_Group tabHamlib { label Hamlib open xywh {0 50 600 340} hide } { Fl_Check_Button chkUSEHAMLIB { label {Use Hamlib} callback {progdefaults.chkUSEHAMLIBis = o->value(); if (o->value() == 1) { chkUSERIGCAT->value(0); btn_fldigi_client_to_fldigi->value(0); progdefaults.chkUSERIGCATis = false; progdefaults.fldigi_client_to_flrig = false; btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->activate(); btnInitHAMLIB->redraw(); } else { progdefaults.initInterface(); } progdefaults.changed = true;} tooltip {Hamlib used for rig control} xywh {250 59 100 20} down_box DOWN_BOX } Fl_Group grpHamlib {open xywh {5 88 585 294} box ENGRAVED_FRAME } { Fl_Group cboHamlibRig { label {Rig:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); \#if USE_HAMLIB hamlib_get_defaults(); \#endif} open xywh {41 98 250 22} box DOWN_BOX color 7 align 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group inpRIGdev { label {Device:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} open xywh {355 98 220 22} box DOWN_BOX color 7 align 4 code0 {o->value(progdefaults.HamRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Value_Input cntHamlibRetries { label Retries callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {\# times to resend command before giving up} xywh {40 138 70 24} align 5 maximum 1000 step 1 code0 {o->value(progdefaults.HamlibRetries);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibTimeout { label {Retry Interval (msec)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Msec's between retries} xywh {180 138 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibWriteDelay { label {Write delay (msec)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Msec's between sequential commands} xywh {40 181 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibWriteDelay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibWait { label {Post write delay (msec)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Wait interval (msecs) before reading response} xywh {180 181 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibWait);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Group listbox_baudrate { label {Baud rate:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} open xywh {476 126 99 22} box DOWN_BOX color 7 align 4 code0 {o->add(szBaudRates);} code1 {o->index(progdefaults.HamRigBaudrate); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter valHamRigStopbits { label Stopbits callback {progdefaults.HamRigStopbits = (int)o->value(); progdefaults.changed = true;} xywh {480 154 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 code0 {o->value(progdefaults.HamRigStopbits);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter valHamRigPollrate { label {Polling Interval (msec)} callback {progdefaults.HamRigPollrate = (int)o->value(); progdefaults.changed = true;} xywh {480 182 95 21} type Simple align 4 minimum 100 maximum 2000 step 50 value 100 code0 {o->value(progdefaults.HamRigPollrate);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnHamlibCMDptt { label {PTT via Hamlib command} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); if (o->value()) { progdefaults.HamlibCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = false; } else progdefaults.HamlibCMDptt = false; progdefaults.changed = true;} tooltip {PTT using hamlib command} xywh {55 229 215 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibCMDptt);} } Fl_Check_Button btnHamlibPTT_ON_DATA { label {Audio on Auxiliary Port} callback {progdefaults.hamlib_ptt_on_data = o->value();} tooltip {PTT enables auxiliary audio source} xywh {55 254 215 20} down_box DOWN_BOX code0 {o->value(progdefaults.hamlib_ptt_on_data);} } Fl_Check_Button btnHamlibDTRplus { label {DTR +12} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Initial state of DTR} xywh {55 280 90 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibDTRplus);} } Fl_Check_Button chkHamlibRTSplus { label {RTS +12} callback {if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Initial state of RTS} xywh {245 280 85 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSplus);} } Fl_Check_Button chkHamlibRTSCTSflow { label {RTS/CTS flow control} callback {if (o->value() == 1) { chkHamlibXONXOFFflow->value(0); chkHamlibRTSplus->deactivate(); } else chkHamlibRTSplus->activate(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Rig requires RTS/CTS flow control} xywh {55 306 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSCTSflow);} code1 {if (o->value()) chkHamlibRTSplus->deactivate();} } Fl_Check_Button chkHamlibXONXOFFflow { label {XON/XOFF flow control} callback {if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Rig requires Xon/Xoff flow control} xywh {245 306 185 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibXONXOFFflow);} } Fl_Check_Button chk_hamlib_cw_is_lsb { label {CW is LSB mode} callback {progdefaults.hamlib_cw_islsb = o->value();} tooltip {Check if xcvr uses LSB for CW} xywh {435 280 142 20} down_box DOWN_BOX code0 {o->value(progdefaults.hamlib_cw_islsb);} } Fl_Check_Button chk_hamlib_rtty_is_usb { label {RTTY is USB mode} callback {progdefaults.hamlib_rtty_isusb = o->value();} tooltip {Check if xcvr uses USB for RTTY} xywh {435 306 152 20} down_box DOWN_BOX code0 {o->value(progdefaults.hamlib_rtty_isusb);} } Fl_Counter val_hamlib_mode_delay { label {Mode delay (msec)} callback {progdefaults.hamlib_mode_delay = (int)o->value(); progdefaults.changed = true;} tooltip {Delay NN msec after executing mode change} xywh {480 228 95 21} type Simple align 4 minimum 0 maximum 2000 step 100 value 200 code0 {o->value(progdefaults.hamlib_mode_delay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group listbox_sideband { label {Sideband:} open xywh {431 253 144 22} box DOWN_BOX color 7 align 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Input inpHamlibConfig { label {Advanced configuration:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Optional configuration in format: param=val ...} xywh {30 350 460 24} align 5 code0 {inpHamlibConfig->value(progdefaults.HamConfig.c_str());} code1 {inpHamlibConfig->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnInitHAMLIB { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize hamlib interface} xywh {495 350 80 24} } } } Fl_Group {} { label {Hardware PTT} open xywh {0 50 600 340} hide } { Fl_Group {} { xywh {10 57 580 38} box ENGRAVED_FRAME } { Fl_Check_Button btnPTTrightchannel { label {PTT tone on right audio channel } callback {progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel2->value(o->value()); if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); } progdefaults.changed = true;} tooltip {Can be used in lieu of or in addition to other PTT types} xywh {74 66 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.PTTrightchannel);} } } Fl_Group grpHWPTT { label {h/w ptt device-pin} open xywh {10 97 580 184} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnTTYptt { label {Use separate serial port PTT} callback {btnUsePPortPTT->value(false); btnUseUHrouterPTT->value(false); if (o->value()) { progdefaults.TTYptt = true; progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.TTYptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {25 124 220 20} down_box DOWN_BOX selection_color 1 } Fl_Group inpTTYdev { label {Device:} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} open xywh {18 165 350 22} box DOWN_BOX color 7 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Round_Button btnSCU_17 { label {Port is second SCU-17 device} callback {progdefaults.SCU_17=o->value(); progdefaults.changed = true;} tooltip {Driver requires stop bits to be ZERO!} xywh {260 124 236 20} down_box DOWN_BOX selection_color 1 code0 {o->value(progdefaults.SCU_17);} } Fl_Round_Button btnUsePPortPTT { label {Use parallel port PTT} callback {btnTTYptt->value(0); btnUseUHrouterPTT->value(0); if (o->value()) { progdefaults.UsePPortPTT = true; progdefaults.TTYptt = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UsePPortPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {25 213 170 20} down_box DOWN_BOX selection_color 1 } Fl_Round_Button btnUseUHrouterPTT { label {Use uHRouter PTT} callback {btnTTYptt->value(0); btnUsePPortPTT->value(0); if (o->value()) { progdefaults.UseUHrouterPTT = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {25 245 170 20} down_box DOWN_BOX selection_color 1 } Fl_Round_Button btnRTSptt { label {Use RTS} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {RTS is PTT signal line} xywh {380 153 85 20} down_box DOWN_BOX } Fl_Round_Button btnRTSplusV { label {RTS = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {Initial voltage on RTS} xywh {471 153 100 20} down_box DOWN_BOX } Fl_Round_Button btnDTRptt { label {Use DTR} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {DTR is PTT signal line} xywh {380 185 85 20} down_box DOWN_BOX } Fl_Round_Button btnDTRplusV { label {DTR = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {Initial voltage on DTR} xywh {471 185 100 20} down_box DOWN_BOX } Fl_Button btnInitHWPTT { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize the H/W PTT interface} xywh {450 242 113 24} } } Fl_Group grpPTTdelays { label {PTT delays valid for all CAT/PTT types} xywh {10 284 580 91} box ENGRAVED_FRAME align 21 } { Fl_Counter cntPTT_on_delay { label {Start of transmit PTT delay} callback {progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true;} tooltip {Delay NN msec before starting audio} xywh {74 311 100 21} align 8 minimum 0 maximum 5000 step 10 code0 {o->value(progdefaults.PTT_on_delay);} code1 {o->lstep(100);} } Fl_Counter cntPTT_off_delay { label {PTT end of transmit delay} callback {progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true;} tooltip {Delay NN msec before releasing PTT} xywh {74 341 100 21} align 8 minimum 0 maximum 5000 step 10 code0 {o->value(progdefaults.PTT_off_delay);} code1 {o->lstep(100);} } } } Fl_Group {} { label GPIO open xywh {0 50 600 340} hide } { Fl_Box {} { label {BCM GPIO pin Value} xywh {70 96 189 17} labelfont 4 align 20 } Fl_Check_Button {btn_enable_gpio[0]} { label {17 00 11} callback {if (o->value()){ progdefaults.enable_gpio |= 1; export_gpio(0); } else { progdefaults.enable_gpio &= ~1; unexport_gpio(0); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 121 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.enable_gpio & 0x01);} } Fl_Check_Button {btn_enable_gpio[1]} { label {18 01 12} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<1); export_gpio(1); } else { progdefaults.enable_gpio &= ~(1<<1); unexport_gpio(1); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 150 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 1) & 0x01);} } Fl_Check_Button {btn_enable_gpio[2]} { label {27 02 13} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<2); export_gpio(2); } else { progdefaults.enable_gpio &= ~(1<<2); unexport_gpio(2); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 180 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 2) & 0x01);} } Fl_Check_Button {btn_enable_gpio[3]} { label {22 03 15} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<3); export_gpio(3); } else { progdefaults.enable_gpio &= ~(1<<3); unexport_gpio(3); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 210 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 3) & 0x01);} } Fl_Check_Button {btn_enable_gpio[4]} { label {23 04 16} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<4); export_gpio(4); } else { progdefaults.enable_gpio &= ~(1<<4); unexport_gpio(4); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 240 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 4) & 0x01);} } Fl_Check_Button {btn_enable_gpio[5]} { label {24 05 18} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<5); export_gpio(5); } else { progdefaults.enable_gpio &= ~(1<<5); unexport_gpio(5); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 270 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 5) & 0x01);} } Fl_Check_Button {btn_enable_gpio[6]} { label {25 06 22} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<6); export_gpio(6); } else { progdefaults.enable_gpio &= ~(1<<6); unexport_gpio(6); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 300 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 6) & 0x01);} } Fl_Check_Button {btn_enable_gpio[7]} { label { 4 07 7} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<7); export_gpio(7); } else { progdefaults.enable_gpio &= ~(1<<7); unexport_gpio(7); } progdefaults.changed = true;} tooltip {Select pin number} xywh {60 330 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 7) & 0x01);} } Fl_Check_Button {btn_enable_gpio[8]} { label { 5 21 29} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<8); export_gpio(8); } else { progdefaults.enable_gpio &= ~(1<<8); unexport_gpio(8); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 121 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 8) & 0x01);} } Fl_Check_Button {btn_enable_gpio[9]} { label { 6 22 31} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<9); export_gpio(9); } else { progdefaults.enable_gpio &= ~(1<<9); unexport_gpio(9); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 150 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 9) & 0x01);} } Fl_Check_Button {btn_enable_gpio[10]} { label {13 23 33} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<10); export_gpio(10); } else { progdefaults.enable_gpio &= ~(1<<10); unexport_gpio(10); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 180 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 10) & 0x01);} } Fl_Check_Button {btn_enable_gpio[11]} { label {19 24 35} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<11); export_gpio(11); } else { progdefaults.enable_gpio &= ~(1<<11); unexport_gpio(11); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 210 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 11) & 0x01);} } Fl_Check_Button {btn_enable_gpio[12]} { label {26 25 37} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<12); export_gpio(12); } else { progdefaults.enable_gpio &= ~(1<<12); unexport_gpio(12); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 240 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 12) & 0x01);} } Fl_Check_Button {btn_enable_gpio[13]} { label {12 26 32} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<13); export_gpio(13); } else { progdefaults.enable_gpio &= ~(1<<13); unexport_gpio(13); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 270 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 13) & 0x01);} } Fl_Check_Button {btn_enable_gpio[14]} { label {16 27 36} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<14); export_gpio(14); } else { progdefaults.enable_gpio &= ~(1<<14); unexport_gpio(14); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 300 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 14) & 0x01);} } Fl_Check_Button {btn_enable_gpio[15]} { label {20 28 38} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<15); export_gpio(15); } else { progdefaults.enable_gpio &= ~(1<<15); unexport_gpio(15); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 330 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 15) & 0x01);} } Fl_Check_Button {btn_enable_gpio[16]} { label {21 29 40} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<16); export_gpio(16); } else { progdefaults.enable_gpio &= ~(1<<16); unexport_gpio(16); } progdefaults.changed = true;} tooltip {Select pin number} xywh {320 360 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 16) & 0x01);} } Fl_Check_Button {btn_gpio_on[0]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= 1; } else { progdefaults.gpio_on &= ~1; } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 120 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on) & 0x01);} } Fl_Check_Button {btn_gpio_on[1]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<1); } else { progdefaults.gpio_on &= ~(1<<1); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 150 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 1) & 0x01);} } Fl_Check_Button {btn_gpio_on[2]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<2); } else { progdefaults.gpio_on &= ~(1<<2); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 180 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 2) & 0x01);} } Fl_Check_Button {btn_gpio_on[3]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<3); } else { progdefaults.gpio_on &= ~(1<<3); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 210 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 3) & 0x01);} } Fl_Check_Button {btn_gpio_on[4]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<4); } else { progdefaults.gpio_on &= ~(1<<4); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 240 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 4) & 0x01);} } Fl_Check_Button {btn_gpio_on[5]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<5); } else { progdefaults.gpio_on &= ~(1<<5); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 270 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 5) & 0x01);} } Fl_Check_Button {btn_gpio_on[6]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<6); } else { progdefaults.gpio_on &= ~(1<<6); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 300 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 6) & 0x01);} } Fl_Check_Button {btn_gpio_on[7]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<7); } else { progdefaults.gpio_on &= ~(1<<7); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {200 330 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 7) & 0x01);} } Fl_Check_Button {btn_gpio_on[8]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<8); } else { progdefaults.gpio_on &= ~(1<<8); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 121 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 8) & 0x01);} } Fl_Check_Button {btn_gpio_on[9]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<9); } else { progdefaults.gpio_on &= ~(1<<9); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 150 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 9) & 0x01);} } Fl_Check_Button {btn_gpio_on[10]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<10); } else { progdefaults.gpio_on &= ~(1<<10); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 180 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 10) & 0x01);} } Fl_Check_Button {btn_gpio_on[11]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<11); } else { progdefaults.gpio_on &= ~(1<<11); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 210 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 11) & 0x01);} } Fl_Check_Button {btn_gpio_on[12]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<12); } else { progdefaults.gpio_on &= ~(1<<12); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 240 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 12) & 0x01);} } Fl_Check_Button {btn_gpio_on[13]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<13); } else { progdefaults.gpio_on &= ~(1<<13); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 270 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 13) & 0x01);} } Fl_Check_Button {btn_gpio_on[14]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<14); } else { progdefaults.gpio_on &= ~(1<<14); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 300 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 14) & 0x01);} } Fl_Check_Button {btn_gpio_on[15]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<15); } else { progdefaults.gpio_on &= ~(1<<15); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 330 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 15) & 0x01);} } Fl_Check_Button {btn_gpio_on[16]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<16); } else { progdefaults.gpio_on &= ~(1<<16); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {460 360 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 16) & 0x01);} } Fl_Box {} { label {BCM GPIO pin Value} xywh {330 96 194 17} labelfont 4 align 20 } Fl_Box {} { label {Enable GPIO PTT (Pi specific controls)} xywh {170 68 283 17} } Fl_Counter cnt_gpio_pulse_width { label {Pulse width (msec)} callback {progdefaults.gpio_pulse_width=(int)o->value(); progdefaults.changed=true;} tooltip {Set >0 if pulsed PTT used} xywh {60 357 80 21} type Simple align 8 minimum 0 maximum 50 step 1 code0 {o->value(progdefaults.gpio_pulse_width);} } } } } Fl_Group tabSoundCard { label Audio open xywh {0 25 600 365} hide } { Fl_Tabs tabsSoundCard {open xywh {0 25 600 365} selection_color 50 } { Fl_Group tabAudio { label Devices open xywh {0 50 600 340} } { Fl_Group AudioOSS {open xywh {55 65 490 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[0]} { label OSS callback {sound_update(SND_IDX_OSS); progdefaults.changed = true; resetSoundCard();} tooltip {Use OSS audio server} xywh {65 75 53 25} down_box DOWN_BOX selection_color 1 } Fl_Input_Choice menuOSSDev { label {Device:} callback {scDevice[0] = scDevice[1] = progdefaults.OSSdevice = o->value(); resetSoundCard(); progdefaults.changed = true;} open tooltip {Select device} xywh {424 75 110 25} code0 {o->value(progdefaults.OSSdevice.c_str());} } {} } Fl_Group AudioPort {open xywh {55 110 490 80} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[1]} { label PortAudio callback {sound_update(SND_IDX_PORT); progdefaults.changed = true; resetSoundCard();} tooltip {Use Port Audio server} xywh {65 138 95 25} down_box DOWN_BOX selection_color 1 } Fl_Choice menuPortInDev { label {Capture:} callback {scDevice[0] = progdefaults.PortInDevice = o->text(); progdefaults.PortInIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true;} open tooltip {Audio input device} xywh {244 121 290 25} down_box BORDER_BOX } {} Fl_Choice menuPortOutDev { label {Playback:} callback {scDevice[1] = progdefaults.PortOutDevice = o->text(); progdefaults.PortOutIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true;} open tooltip {Audio output device} xywh {244 156 290 25} down_box BORDER_BOX } {} } Fl_Group AudioPulse {open xywh {55 190 490 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[2]} { label PulseAudio callback {sound_update(SND_IDX_PULSE); progdefaults.changed = true; resetSoundCard();} tooltip {Use Pulse Audio server} xywh {65 201 100 25} down_box DOWN_BOX selection_color 1 } Fl_Input inpPulseServer { label {Server string:} callback {scDevice[0] = scDevice[1] = progdefaults.PulseServer = o->value(); resetSoundCard(); progdefaults.changed = true;} tooltip {Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStrings} xywh {310 201 225 24} code0 {o->value(progdefaults.PulseServer.c_str());} code1 {inpPulseServer->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group AudioNull {open xywh {55 235 490 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[3]} { label {File I/O only} callback {sound_update(SND_IDX_NULL); progdefaults.changed = true; resetSoundCard();} tooltip {NO AUDIO DEVICE AVAILABLE (or testing)} xywh {66 245 100 25} down_box DOWN_BOX selection_color 1 } } Fl_Group AudioDuplex {open xywh {55 280 490 45} box ENGRAVED_FRAME } { Fl_Round_Button btn_is_full_duplex { label {Device supports full duplex} callback {progdefaults.is_full_duplex = o->value(); progdefaults.changed = true; resetSoundCard();} tooltip {NO AUDIO DEVICE AVAILABLE (or testing)} xywh {66 290 223 25} down_box DOWN_BOX value 1 selection_color 1 code0 {o->value(progdefaults.is_full_duplex);} } } } Fl_Group tabAudioOpt { label Settings open xywh {0 50 600 340} hide } { Fl_Group grpAudioSampleRate { label {Sample rate} open xywh {55 65 490 90} box ENGRAVED_FRAME align 21 } { Fl_Group menuInSampleRate { label Capture callback {progdefaults.in_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true;} open tooltip {Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.} xywh {65 94 100 22} box DOWN_BOX color 7 align 8 code0 {o->clear_changed();} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group menuOutSampleRate { label Playback callback {progdefaults.out_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true;} open xywh {65 124 100 22} box DOWN_BOX color 7 align 8 code0 {o->clear_changed();} code1 {o->tooltip(menuInSampleRate->tooltip());} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group menuSampleConverter { label Converter callback {if ((o->index()) == FLDIGI_SRC_BEST) fl_alert2("The best quality SINC interpolator has very high CPU overhead"); progdefaults.sample_converter = sample_rate_converters[o->index()]; resetSoundCard(); progdefaults.changed = true; o->tooltip(src_get_description(progdefaults.sample_converter));} open tooltip {Set the type of resampler used of offset correction} xywh {319 94 216 22} box DOWN_BOX color 7 align 5 code0 {\#include } code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group {} { label Corrections open xywh {55 155 490 62} box ENGRAVED_FRAME align 21 } { Fl_Spinner cntRxRateCorr { label {RX ppm} callback {progdefaults.RX_corr = (int)o->value(); progdefaults.changed = true;} tooltip {RX sound card correction} xywh {65 185 85 20} align 8 code0 {o->step(1);} code1 {o->minimum(-50000);} code2 {o->maximum(50000);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTxRateCorr { label {TX ppm} callback {progdefaults.TX_corr = (int)o->value(); progdefaults.changed = true;} tooltip {TX sound card correction} xywh {226 185 85 20} align 8 code0 {o->step(1);} code1 {o->minimum(-50000);} code2 {o->maximum(50000);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTxOffset { label {TX offset} callback {progdefaults.TxOffset = (int)o->value(); progdefaults.changed = true;} tooltip {Difference between Rx & Tx freq (rig offset)} xywh {388 185 85 20} align 8 code0 {o->value(progdefaults.TxOffset);} code1 {o->step(1);} code2 {o->minimum(-50); o->maximum(50);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } } } Fl_Group tabAudioRightChannel { label {Right channel} xywh {0 50 600 340} hide } { Fl_Group {} { label {Transmit Usage} open xywh {25 61 550 246} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkAudioStereoOut { label {Modem signal on left and right channels} callback {progdefaults.sig_on_right_channel = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }} tooltip {Left and right channels both contain modem audio} xywh {165 82 280 20} down_box DOWN_BOX code0 {chkAudioStereoOut->value(progdefaults.sig_on_right_channel);} } Fl_Check_Button chkReverseAudio { label {Reverse Left/Right channels} callback {progdefaults.ReverseAudio = o->value(); progdefaults.changed = true;} tooltip {Software reversal of left-right audio channels} xywh {165 112 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.ReverseAudio);} } Fl_Group {} { label {... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...} open xywh {75 135 454 162} box ENGRAVED_FRAME align 18 } { Fl_Check_Button btnPTTrightchannel2 { label {PTT tone on right audio channel } callback {progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); }} tooltip {1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types} xywh {165 142 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.PTTrightchannel);} } Fl_Check_Button btnQSK2 { label {CW QSK signal on right channel} callback {progdefaults.QSK = o->value(); btnQSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }} tooltip {Generate 1000 Hz square wave signal on right channel} xywh {165 172 211 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSK);} } Fl_Check_Button chkPseudoFSK2 { label {Pseudo-FSK on right audio channel} callback {progdefaults.PseudoFSK = o->value(); chkPseudoFSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }} tooltip {Create 1000 Hz square wave on right channel} xywh {165 203 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.PseudoFSK);} } } } Fl_Group {} { label {Receive Usage} open xywh {25 310 550 60} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkReverseRxAudio { label {Reverse Left/Right channels} callback {progdefaults.ReverseRxAudio = o->value(); progdefaults.changed = true;} tooltip {Software reversal of left-right audio channels} xywh {165 328 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.ReverseRxAudio);} } } } Fl_Group tabWavFile { label Wav open xywh {0 50 600 340} hide } { Fl_Group listbox_wav_samplerate { label {Wav write sample rate} callback {progdefaults.wavSampleRate = o->index(); progdefaults.changed = true;} open tooltip {Pick baud rate from list} xywh {225 96 150 24} box DOWN_BOX color 7 align 5 code0 {o->add("8000|11025|16000|22050|24000|44100|48000");} code1 {o->index(progdefaults.wavSampleRate);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btn_record_both { label {Record both channels} callback {progdefaults.record_both_channels=o->value(); progdefaults.changed=true;} xywh {225 145 176 15} down_box DOWN_BOX code0 {o->value(progdefaults.record_both_channels);} } } Fl_Group tabAlerts { label Alerts open xywh {0 50 600 340} color 50 selection_color 50 hide } { Fl_Group {} { label {Regex Match in Browser} open xywh {5 56 590 66} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_fname_regex { label {REGEX detected wav} xywh {10 80 304 35} align 5 code0 {o->value(progdefaults.BWSR_REGEX_MATCH.c_str());} } Fl_Button btn_select_regex_wav { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.wav\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_REGEX_MATCH = fnfc.filename(); inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); progdefaults.REGEX_ALERT_MENU = 0; mnu_regex_alert_menu->value(progdefaults.REGEX_ALERT_MENU); break; // FILE CHOSEN } }} xywh {316 91 60 24} code0 {\#include } } Fl_Choice mnu_regex_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_REGEX_MATCH = "bark"; break; case 2 : progdefaults.BWSR_REGEX_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_REGEX_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_REGEX_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_REGEX_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_REGEX_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_REGEX_MATCH = "phone"; break; case 8 : progdefaults.BWSR_REGEX_MATCH = "dinner_bell"; break; } inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); } progdefaults.REGEX_ALERT_MENU = o->value();} open xywh {380 91 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell");} code1 {o->value(progdefaults.REGEX_ALERT_MENU);} } {} Fl_Check_Button btn_enable_regex_match_wa { label Enable callback {progdefaults.ENABLE_BWSR_REGEX_MATCH=o->value();} xywh {514 69 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_BWSR_REGEX_MATCH);} } Fl_Button btn_test_regex_wav { label Test callback {audio_alert->alert(progdefaults.BWSR_REGEX_MATCH.c_str());} xywh {518 91 60 24} code0 {\#include "audio_alert.h"} } } Fl_Group {} { label {MYCALL Match in Browser} open xywh {5 123 590 66} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_fname_mycall { label {MYCALL detected wav} xywh {10 147 304 35} align 5 code0 {o->value(progdefaults.BWSR_MYCALL_MATCH.c_str());} } Fl_Button btn_select_mycall_wav { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.wav\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_MYCALL_MATCH = fnfc.filename(); inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); progdefaults.MYCALL_ALERT_MENU = 0; mnu_mycall_alert_menu->value(progdefaults.MYCALL_ALERT_MENU); break; // FILE CHOSEN } }} xywh {316 158 60 24} } Fl_Choice mnu_mycall_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_MYCALL_MATCH = "bark"; break; case 2 : progdefaults.BWSR_MYCALL_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_MYCALL_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_MYCALL_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_MYCALL_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_MYCALL_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_MYCALL_MATCH = "phone"; break; case 8 : progdefaults.BWSR_MYCALL_MATCH = "dinner_bell"; break; } inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); } progdefaults.MYCALL_ALERT_MENU = o->value();} open xywh {380 158 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell");} code1 {o->value(progdefaults.MYCALL_ALERT_MENU);} } {} Fl_Check_Button btn_enable_mycall_match_wav { label Enable callback {progdefaults.ENABLE_BWSR_MYCALL_MATCH=o->value();} xywh {514 136 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_BWSR_MYCALL_MATCH);} } Fl_Button btn_test_mycall_wav { label Test callback {audio_alert->alert(progdefaults.BWSR_MYCALL_MATCH.c_str());} xywh {518 158 60 24} } } Fl_Group {} { label {flmsg interface} open xywh {5 190 590 122} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_flmsg_rcvd { label {flmsg received wav} xywh {10 214 304 35} align 5 code0 {o->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str());} } Fl_Button btn_select_rx_extract_msg { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.wav\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_MSG_RCVD = fnfc.filename(); inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); progdefaults.RX_EXTRACT_ALERT_MENU = 0; mnu_rx_extract_alert_menu->value(progdefaults.RX_EXTRACT_ALERT_MENU); break; // FILE CHOSEN } }} xywh {316 225 60 24} } Fl_Choice mnu_rx_extract_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_MSG_RCVD = "bark"; break; case 2 : progdefaults.RX_EXTRACT_MSG_RCVD = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_MSG_RCVD = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_MSG_RCVD = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_MSG_RCVD = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_MSG_RCVD = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_MSG_RCVD = "phone"; break; case 8 : progdefaults.RX_EXTRACT_MSG_RCVD = "dinner_bell"; break; } inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } progdefaults.RX_EXTRACT_ALERT_MENU = o->value();} open xywh {380 225 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell");} code1 {o->value(progdefaults.RX_EXTRACT_ALERT_MENU);} } {} Fl_Check_Button btn_enable_flmsg_wav { label Enable callback {progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD=o->value();} xywh {514 203 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD);} } Fl_Button btn_test_flmsg_extract_wav { label Test callback {audio_alert->alert(progdefaults.RX_EXTRACT_MSG_RCVD.c_str());} xywh {518 225 60 24} } Fl_File_Input inp_wav_flmsg_timed_out { label {flmsg timed out wav} xywh {10 270 304 35} align 5 code0 {o->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str());} } Fl_Button btn_select_rx_extract_timed_out { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.wav\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_TIMED_OUT = fnfc.filename(); inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); progdefaults.TIMED_OUT_ALERT_MENU = 0; mnu_rx_timed_out_alert_menu->value(progdefaults.TIMED_OUT_ALERT_MENU); break; // FILE CHOSEN } }} xywh {316 281 60 24} } Fl_Choice mnu_rx_timed_out_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_TIMED_OUT = "bark"; break; case 2 : progdefaults.RX_EXTRACT_TIMED_OUT = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_TIMED_OUT = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_TIMED_OUT = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_TIMED_OUT = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_TIMED_OUT = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_TIMED_OUT = "phone"; break; case 8 : progdefaults.RX_EXTRACT_TIMED_OUT = "dinner_bell"; break; } inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } progdefaults.TIMED_OUT_ALERT_MENU = o->value();} open xywh {380 281 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell");} code1 {o->value(progdefaults.TIMED_OUT_ALERT_MENU);} } {} Fl_Button btn_test_rx_extract_timed_out { label Test callback {audio_alert->alert(progdefaults.RX_EXTRACT_TIMED_OUT.c_str());} xywh {518 281 60 24} } Fl_Check_Button btn_enable_flmsg_time_out_wav { label Enable callback {progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT=o->value();} xywh {515 260 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT);} } } Fl_Group {} { label {RsID detection} open xywh {5 314 590 66} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_fname_rsid { label {RsID audio alert wav} xywh {10 338 304 35} align 5 code0 {o->value(progdefaults.RSID_MATCH.c_str());} } Fl_Button btn_select_rsid_wav { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.wav\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RSID_MATCH = fnfc.filename(); inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); progdefaults.RSID_ALERT_MENU = 0; mnu_rsid_alert_menu->value(progdefaults.RSID_ALERT_MENU); break; // FILE CHOSEN } }} xywh {316 349 60 24} } Fl_Choice mnu_rsid_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RSID_MATCH = "bark"; break; case 2 : progdefaults.RSID_MATCH = "checkout"; break; case 3 : progdefaults.RSID_MATCH = "diesel"; break; case 4 : progdefaults.RSID_MATCH = "steam_train"; break; case 5 : progdefaults.RSID_MATCH = "doesnot"; break; case 6 : progdefaults.RSID_MATCH = "beeboo"; break; case 7 : progdefaults.RSID_MATCH = "phone"; break; case 8 : progdefaults.RSID_MATCH = "dinner_bell"; break; } inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); } progdefaults.RSID_ALERT_MENU = o->value();} open xywh {380 349 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell");} code1 {o->value(progdefaults.RSID_ALERT_MENU);} } {} Fl_Check_Button btn_enable_rsid_match_wav { label Enable callback {progdefaults.ENABLE_RSID_MATCH=o->value();} xywh {514 327 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_RSID_MATCH);} } Fl_Button btn_test_rsid_wav { label Test callback {audio_alert->alert(progdefaults.RSID_MATCH.c_str());} xywh {518 349 60 24} } } } } } Fl_Group tabID { label ID xywh {0 25 600 365} hide } { Fl_Tabs tabsID {open xywh {0 25 600 365} } { Fl_Group tabRsID { label RsID open xywh {0 50 600 340} } { Fl_Group {} { label {Reed-Solomon ID (Rx)} open xywh {32 55 535 210} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkRSidNotifyOnly { label {Notify only} callback {progdefaults.rsid_notify_only = o->value(); notify_create_rsid_event(progdefaults.rsid_notify_only); if (progdefaults.rsid_notify_only) { chkRetainFreqLock->deactivate(); chkDisableFreqChange->deactivate(); } else { chkRetainFreqLock->activate(); chkDisableFreqChange->activate(); } progdefaults.changed = true;} tooltip {Check this to be notified when an RSID is received without changing modem and frequency} xywh {40 112 168 20} down_box DOWN_BOX code0 {chkRSidNotifyOnly->value(progdefaults.rsid_notify_only);} } Fl_Button bRSIDRxModes { label {Receive modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_rx_modes); progdefaults.changed = true;} xywh {40 81 130 24} } Fl_Check_Button chkRSidWideSearch { label {Searches passband} callback {progdefaults.rsidWideSearch=o->value(); rxid_selection_color(); progdefaults.changed = true;} tooltip {ON - search over entire waterfall OFF - limit search to +/- 200 Hz} xywh {40 143 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.rsidWideSearch);} } Fl_Check_Button chkRSidMark { label {Mark prev freq/mode} callback {progdefaults.rsid_mark = o->value(); progdefaults.changed = true;} tooltip {Insert RX text marker before changing frequency and modem} xywh {40 175 203 20} down_box DOWN_BOX code0 {chkRSidMark->value(progdefaults.rsid_mark);} } Fl_Check_Button chkRSidAutoDisable { label {Disables detector} callback {progdefaults.rsid_auto_disable = o->value(); progdefaults.changed = true;} tooltip {Disable further detection when RSID is received} xywh {40 207 203 20} down_box DOWN_BOX code0 {if (progdefaults.rsid_notify_only) progdefaults.rsid_auto_disable = false;} code1 {chkRSidAutoDisable->value(progdefaults.rsid_auto_disable);} code2 {if (progdefaults.rsid_notify_only) chkRSidAutoDisable->deactivate();} } Fl_Group listbox_rsid_errors { label {Allow errors} callback {progdefaults.RsID_label_type = o->index(); progdefaults.changed = true;} open tooltip {Low = zero errors Medium = 1 error High = 2 errors} xywh {40 233 100 22} box DOWN_BOX color 7 align 8 code0 {listbox_rsid_errors->add(_("Low")); listbox_rsid_errors->add(_("Medium")); listbox_rsid_errors->add(_("High"));} code1 {listbox_rsid_errors->index(progdefaults.RsID_label_type);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Value_Slider sldrRSIDsquelch { label {Squelch open (sec)} callback {progdefaults.rsid_squelch = (int)o->value(); progdefaults.changed = true;} tooltip {Open squelch for nn sec if RSID detected} xywh {276 233 145 22} type Horizontal align 8 maximum 20 step 1 textsize 14 code0 {o->value(progdefaults.rsid_squelch);} code2 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button chkRSidShowAlert { label {Disable alert dialog} callback {progdefaults.disable_rsid_warning_dialog_box = o->value(); progdefaults.changed = true;} tooltip {Do not show RsID alert dialog box} xywh {276 143 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.disable_rsid_warning_dialog_box);} } Fl_Check_Button chkRetainFreqLock { label {Retain tx freq lock} callback {progdefaults.retain_freq_lock = o->value(); progdefaults.changed = true;} tooltip {Retain TX lock frequency (Lk) when changing to RX RsID frequency} xywh {276 175 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.retain_freq_lock);} } Fl_Check_Button chkDisableFreqChange { label {Disable freq change} callback {progdefaults.disable_rsid_freq_change = o->value(); progdefaults.changed = true;} tooltip {Do not automatically change to RX RsID frequency} xywh {276 207 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.disable_rsid_freq_change);} } Fl_Group {} { label {The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.} open xywh {216 74 330 60} box BORDER_BOX align 21 } {} } Fl_Group {} { label {Pre-Signal Tone} open xywh {32 267 265 97} box ENGRAVED_FRAME align 21 } { Fl_Counter val_pretone { label Seconds callback {progdefaults.pretone = o->value(); progdefaults.changed = true;} tooltip {Use for triggering amplifier carrier detect} xywh {88 305 140 21} minimum 0 maximum 10 code0 {o->value(progdefaults.pretone);} } } Fl_Group {} { label {Reed-Solomon ID (Tx)} open xywh {300 267 265 97} box ENGRAVED_FRAME align 21 } { Fl_Button bRSIDTxModes { label {Transmit modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_tx_modes); progdefaults.changed = true;} xywh {377 294 130 24} } Fl_Check_Button btn_post_rsid { label {End of xmt ID} callback {progdefaults.rsid_post=o->value(); progdefaults.changed = true;} tooltip {Add RsID signal to end of transmission} xywh {377 329 97 17} down_box DOWN_BOX code0 {o->value(progdefaults.rsid_post);} } } } Fl_Group tabVideoID { label Video open xywh {0 50 600 340} hide } { Fl_Group {} { label {Video Preamble ID} open xywh {32 115 536 189} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnsendid { label {Transmit mode ID} callback {progdefaults.sendid=o->value(); progdefaults.changed = true;} tooltip {Waterfall video ID} xywh {50 149 150 20} down_box DOWN_BOX } Fl_Check_Button btnsendvideotext { label {Transmit video text} callback {progdefaults.sendtextid=o->value(); progdefaults.changed = true;} tooltip {Waterfall video text} xywh {50 181 155 20} down_box DOWN_BOX code0 {o->value(progdefaults.sendtextid);} } Fl_Input valVideotext { label {:} callback {progdefaults.strTextid = o->value(); progdefaults.changed = true;} tooltip {Limit to a few characters, as in CQEM or IOTA etc.} xywh {217 179 323 24} code0 {o->value(progdefaults.strTextid.c_str());} code1 {valVideotext->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button chkID_SMALL { label {Use small font} callback {progdefaults.ID_SMALL=o->value(); progdefaults.changed = true;} tooltip {ON - small font OFF - large font} xywh {50 213 120 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.ID_SMALL);} } Fl_Value_Slider sldrVideowidth { label {Chars/Row:} callback {progdefaults.videowidth = (int)o->value(); progdefaults.changed = true;} tooltip {Set the number of characters per row} xywh {290 211 125 24} type Horizontal align 4 minimum 1 maximum 8 step 1 value 4 textsize 14 code0 {o->value(progdefaults.videowidth);} code2 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btn_vidlimit { label {500 Hz limit} callback {progdefaults.vidlimit=o->value(); progdefaults.changed = true;} xywh {50 245 110 15} down_box DOWN_BOX code0 {o->value(progdefaults.vidlimit);} } Fl_Check_Button btn_vidmodelimit { label {Mode width limit} callback {progdefaults.vidmodelimit=o->value(); progdefaults.changed=true;} xywh {50 273 110 15} down_box DOWN_BOX code0 {o->value(progdefaults.vidmodelimit);} } Fl_Button bVideoIDModes { label {Video ID modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.videoid_modes); progdefaults.changed = true;} xywh {420 146 120 24} } } } Fl_Group tabCwID { label CW xywh {0 50 600 340} hide } { Fl_Group sld { label {CW Postamble ID} open xywh {32 146 536 127} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnCWID { label {Transmit callsign} callback {progdefaults.CWid = o->value(); progdefaults.changed = true;} tooltip {Send Callsign in CW at end of every transmission} xywh {139 184 140 24} down_box DOWN_BOX code0 {o->value(progdefaults.CWid);} } Fl_Value_Slider sldrCWIDwpm { label {Speed (WPM):} callback {progdefaults.CWIDwpm = (int)o->value(); progdefaults.changed = true;} tooltip {Send at this WPM} xywh {139 227 180 20} type Horizontal align 1 minimum 15 maximum 40 step 1 value 18 textsize 14 code0 {o->value(progdefaults.CWIDwpm);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Button bCWIDModes { label {CW ID modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.cwid_modes); progdefaults.changed = true;} xywh {412 184 120 24} } } } } } Fl_Group tabMisc { label Misc open xywh {0 25 600 365} hide } { Fl_Tabs tabsMisc {open xywh {0 25 600 365} selection_color 50 } { Fl_Group tabCPUspeed { label CPU open xywh {0 50 600 340} } { Fl_Group {} {open xywh {55 75 490 51} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkSlowCpu { label {Slow CPU (less than 700MHz)} callback {progdefaults.slowcpu = o->value(); progdefaults.changed = true;} tooltip {Enable if you're computer does not decode properly} xywh {201 90 225 20} down_box DOWN_BOX code0 {o->value(progdefaults.slowcpu);} } } } Fl_Group tabNBEMS { label NBEMS open xywh {0 50 600 340} hide } { Fl_Group {} { label {NBEMS data file interface} open xywh {50 65 500 75} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkAutoExtract { label Enable callback {progdefaults.autoextract = o->value(); progdefaults.changed = true;} tooltip {Extract files for use with external "wrap / flmsg" program} xywh {104 96 75 20} down_box DOWN_BOX code0 {o->value(progdefaults.autoextract);} } Fl_Check_Button chk_open_wrap_folder { label {Open message folder} callback {progdefaults.open_nbems_folder = o->value(); progdefaults.changed = true;} tooltip {Opens NBEMS file folder upon successful capture} xywh {310 96 146 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_nbems_folder);} } } Fl_Group {} { label {Reception of flmsg files} open xywh {50 141 500 199} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_open_flmsg { label {Open with flmsg} callback {progdefaults.open_flmsg = o->value(); progdefaults.changed = true;} tooltip {Open message with flmsg} xywh {104 241 136 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_flmsg);} } Fl_Check_Button chk_open_flmsg_print { label {Open in browser} callback {progdefaults.open_flmsg_print = o->value(); progdefaults.changed = true;} tooltip {Open file with default browser} xywh {310 241 136 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_flmsg_print);} } Fl_Input txt_flmsg_pathname { label {flmsg:} callback {progdefaults.flmsg_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flmsg} xywh {104 271 330 24} when 1 code0 {o->value(progdefaults.flmsg_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_flmsg { label {Locate flmsg} callback {select_flmsg_pathname();} tooltip {Locate flmsg executable} xywh {441 271 100 24} } Fl_Value_Slider sldr_extract_timeout { label {Timeout (secs)} callback {progdefaults.extract_timeout=o->value(); progdefaults.changed=true;} tooltip {Extract times out after NN seconds of inactivity.} xywh {70 309 364 21} type {Horz Knob} color 54 selection_color 0 align 8 minimum 1 maximum 20 step 0.5 value 10 textsize 14 code0 {o->value(progdefaults.extract_timeout);} } Fl_Group {} { label {Selection of transfer direct takes precedence over all other flmsg reception settings} open xywh {55 160 490 76} box ENGRAVED_FRAME align 17 } { Fl_Check_Button chk_transfer__to_open_flmsg { label {Transfer direct to executing flmsg} callback {progdefaults.flmsg_transfer_direct = o->value(); progdefaults.changed = true;} tooltip {Send data stream directly to executing flmsg} xywh {160 204 271 20} down_box DOWN_BOX code0 {o->value(progdefaults.flmsg_transfer_direct);} } } } } Fl_Group tabPskmail { label Pskmail open xywh {0 50 600 340} align 5 hide } { Fl_Group {} { label {Mail Server Attributes} open xywh {55 58 490 174} box ENGRAVED_FRAME align 21 } { Fl_Counter cntServerCarrier { label {Carrier frequency (Hz)} callback {progdefaults.ServerCarrier = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Default listen / transmit frequency} xywh {106 86 80 20} type Simple align 8 minimum 500 maximum 2500 step 25 value 1500 code0 {o->value(progdefaults.ServerCarrier);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerOffset { label {Search range (Hz)} callback {progdefaults.ServerOffset = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Listen for signals within this range} xywh {106 123 80 20} type Simple align 8 minimum 10 maximum 500 step 10 value 100 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerACQsn { label {Acquisition S/N (dB)} callback {progdefaults.ServerACQsn = o->value(); progdefaults.changed = true;} tooltip {Capture signals over this threshold} xywh {106 160 80 20} type Simple align 8 minimum 3 maximum 20 step 1 value 6 code0 {o->value(progdefaults.ServerACQsn);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerAFCrange { label {AFC range (Hz)} callback {progdefaults.ServerAFCrange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Limit AFC movement to this range} xywh {106 197 80 20} type Simple align 8 minimum 10 maximum 500 step 10 value 25 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnPSKmailSweetSpot { label {Reset to Carrier} callback {progdefaults.PSKmailSweetSpot = o->value(); progdefaults.changed = true;} tooltip {When no signal present} xywh {361 86 142 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.PSKmailSweetSpot);} } } Fl_Group {} { label General open xywh {55 234 490 131} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_arq_s2n_report { label {Report ARQ frames average S/N} callback {progdefaults.Pskmails2nreport=o->value();} xywh {80 259 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.Pskmails2nreport);} } } } Fl_Group tabSpot { label Spotting open xywh {0 50 600 340} hide } { Fl_Group {} { label {PSK Reporter} open xywh {40 62 525 300} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnPSKRepAuto { label {Automatically spot callsigns in decoded text} callback {progdefaults.pskrep_auto = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Parse all incoming text} xywh {65 103 324 20} down_box DOWN_BOX code0 {btnPSKRepAuto->value(progdefaults.pskrep_auto);} } Fl_Check_Button btnPSKRepLog { label {Send reception report when logging a QSO} callback {progdefaults.pskrep_log = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Send report only when QSO is logged} xywh {65 134 327 20} down_box DOWN_BOX code0 {btnPSKRepLog->value(progdefaults.pskrep_log);} } Fl_Check_Button btnPSKRepQRG { label {Report rig frequency (enable only if you have rig control!)} callback {progdefaults.pskrep_qrg = o->value(); progdefaults.changed = true;} tooltip {Include the transmit frequency} xywh {65 166 416 20} down_box DOWN_BOX code0 {btnPSKRepQRG->value(progdefaults.pskrep_qrg);} } Fl_Check_Button btn_report_when_visible { label {Disable spotting when signal browser(s) are not visible.} callback {progdefaults.report_when_visible = o->value(); progdefaults.changed = true;} tooltip {Check to reduce CPU load in PSK and RTTY modes.} xywh {65 198 416 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.report_when_visible);} } Fl_Check_Button btn_pskrep_autostart { label {Log on to pskrep when starting fldigi} callback {progdefaults.pskrep_autostart = o->value(); progdefaults.changed = true;} tooltip {Automatically start psk reporter socket connection} xywh {65 230 291 20} down_box DOWN_BOX code0 {o->value(progdefaults.pskrep_autostart);} } Fl_Box box_connected_to_pskrep { label Connected xywh {375 231 18 18} box DIAMOND_DOWN_BOX color 7 align 8 } Fl_Input inpPSKRepHost { label {Host:} callback {progdefaults.pskrep_host = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {To whom the connection is made} xywh {108 268 220 24} when 1 code0 {inpPSKRepHost->value(progdefaults.pskrep_host.c_str());} code1 {inpPSKRepHost->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpPSKRepPort { label {Port:} callback {progdefaults.pskrep_port = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Using UDP port \#} xywh {477 268 60 24} when 1 code0 {inpPSKRepPort->value(progdefaults.pskrep_port.c_str());} code1 {inpPSKRepPort->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnPSKRepInit { label Initialize callback {pskrep_stop(); if (!pskrep_start()) { boxPSKRepMsg->copy_label(pskrep_error()); progdefaults.usepskrep = false; box_connected_to_pskrep->color(FL_WHITE); box_connected_to_pskrep->redraw(); } else { boxPSKRepMsg->label(0); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.usepskrep = true; box_connected_to_pskrep->color(FL_GREEN); box_connected_to_pskrep->redraw(); }} tooltip {Initialize the socket client} xywh {457 313 80 24} } Fl_Box boxPSKRepMsg { label {} xywh {67 297 300 48} labelfont 2 code0 {boxPSKRepMsg->label(0);} } } } Fl_Group tabSweetSpot { label {Sweet Spot} open xywh {0 50 600 340} hide } { Fl_Group {} {open xywh {55 71 490 75} box ENGRAVED_FRAME align 21 } { Fl_Value_Input valCWsweetspot { label CW callback {progdefaults.CWsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default CW tracking point} xywh {92 82 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.CWsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input valRTTYsweetspot { label RTTY callback {progdefaults.RTTYsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default RTTY tracking point} xywh {270 82 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.RTTYsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input valPSKsweetspot { label {PSK et al.} callback {progdefaults.PSKsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default for all other modems} xywh {470 82 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.PSKsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Check_Button btnStartAtSweetSpot { label {Always start new modems at these frequencies} callback {progdefaults.StartAtSweetSpot = o->value(); progdefaults.changed = true;} tooltip {ON - start at default OFF - keep current wf cursor position} xywh {65 112 348 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.StartAtSweetSpot);} } } Fl_Group {} { label {K3 A1A configuation} open xywh {55 151 490 60} box ENGRAVED_FRAME align 21 hide } { Fl_Check_Button btnCWIsLSB { label {CW is LSB} callback {progdefaults.CWIsLSB=o->value(); progdefaults.changed=true;} tooltip {Select this for Elecraft K3 Other radios should not need it.} xywh {270 172 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWIsLSB);} } } } Fl_Group tabText_IO { label {Text i/o} open xywh {0 50 600 340} hide } { Fl_Group grpTalker { label {Talker Socket (MS only)} open xywh {55 132 490 73} box ENGRAVED_FRAME align 21 } { Fl_Light_Button btnConnectTalker { label Talker callback {if (o->value()) open_talker(); else close_talker();} xywh {81 152 74 20} selection_color 60 code0 {extern void open_talker();} code1 {extern void close_talker();} } Fl_Box {} { label {Connect/disconnect to Talker socket server} xywh {160 152 345 20} align 20 } Fl_Check_Button btn_auto_talk { label {Auto connect when fldigi opens (server must be up)} callback {progdefaults.auto_talk = o->value();} xywh {81 180 391 15} down_box DOWN_BOX code0 {o->value(progdefaults.auto_talk);} } } Fl_Group {} { label {Capture rx text to external file} open xywh {55 72 490 56} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkRxStream { label {Enable rx text stream} callback {progdefaults.speak = o->value(); progdefaults.changed = true;} tooltip {Send rx text to file: textout.txt} xywh {81 99 175 20} down_box DOWN_BOX code0 {o->value(progdefaults.speak);} } } } Fl_Group tabDTMF { label DTMF open xywh {0 50 600 340} hide } { Fl_Check_Button chkDTMFdecode { label {Decode DTMF tones} callback {progdefaults.DTMFdecode = o->value();} tooltip {Decode received DTMF tones} xywh {212 103 175 20} down_box DOWN_BOX code0 {o->value(progdefaults.DTMFdecode);} } } Fl_Group tabWX { label WX open xywh {0 50 600 340} hide } { Fl_Group {} { label {Weather query specification} open xywh {5 60 590 320} box ENGRAVED_FRAME align 21 } { Fl_Input inpWXsta { label {METAR station ID code} callback {progdefaults.wx_sta = o->value(); progdefaults.changed = true;} tooltip {for example KMDQ for Huntsville-Madison Executive Airport, AL} xywh {95 131 50 24} align 8 code0 {o->value(progdefaults.wx_sta.c_str());} } Fl_Check_Button btn_wx_full { label {Full report} callback {progdefaults.wx_full=o->value(); progdefaults.changed = true;} tooltip {Insert full METAR report} xywh {260 170 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_full);} } Fl_Check_Button btn_wx_station_name { label {METAR station location} callback {progdefaults.wx_station_name = o->value(); progdefaults.changed = true;} tooltip {Add geopolitical name of METAR station} xywh {260 194 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_station_name);} } Fl_Check_Button btn_wx_condx { label Conditions callback {progdefaults.wx_condx=o->value(); progdefaults.changed = true;} tooltip {current wx conditions} xywh {260 220 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_condx);} } Fl_Check_Button btn_wx_fahrenheit { label Fahrenheit callback {progdefaults.wx_fahrenheit=o->value(); progdefaults.changed = true;} tooltip {report Fahrenheit} xywh {260 247 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_fahrenheit);} } Fl_Check_Button btn_wx_celsius { label Celsius callback {progdefaults.wx_celsius=o->value(); progdefaults.changed = true;} tooltip {report Celsius} xywh {388 247 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_celsius);} } Fl_Check_Button btn_wx_mph { label {Miles / Hour} callback {progdefaults.wx_mph=o->value(); progdefaults.changed = true;} tooltip {report miles per hour} xywh {260 273 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_mph);} } Fl_Check_Button btn_wx_kph { label {kilometers / hour} callback {progdefaults.wx_kph=o->value(); progdefaults.changed = true;} tooltip {report kilometers per hour} xywh {388 273 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_kph);} } Fl_Check_Button btn_wx_inches { label {Inches Hg.} callback {progdefaults.wx_inches=o->value(); progdefaults.changed = true;} tooltip {report inches mercury} xywh {260 300 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_inches);} } Fl_Check_Button btn_wx_mbars { label mbars callback {progdefaults.wx_mbars=o->value(); progdefaults.changed = true;} tooltip {report millibars} xywh {388 300 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_mbars);} } Fl_Box {} { label Temperature xywh {93 245 156 19} align 20 } Fl_Box {} { label {Wind speed/dir} xywh {93 271 156 19} align 20 } Fl_Box {} { label {Barometric pressure} xywh {93 298 156 19} align 20 } Fl_Button btn_metar_search { label {Search on web} callback {get_METAR_station();} xywh {337 131 130 24} code0 {\#include "weather.h"} } Fl_Input txt_wx_url { label {Access URL} callback {progdefaults.wx_url = o->value(); progdefaults.changed = true;} tooltip {Enter METAR data internet URL} xywh {95 95 430 25} when 1 code0 {o->value(progdefaults.wx_url.c_str());} } Fl_Button btn_default_wx_url { label Default callback {txt_wx_url->value( "https://tgftp.nws.noaa.gov/data/observations/metar/decoded"); progdefaults.wx_url=txt_wx_url->value(); progdefaults.changed=true;} tooltip {Default URL} xywh {530 95 60 25} } } } Fl_Group tabKML { label KML open xywh {0 50 600 340} hide } { Fl_Input btnKmlSaveDir { label {KML files directory} callback {progdefaults.kml_save_dir=o->value(); progdefaults.changed = true; kml_init();} tooltip {Where generated KML documents are stored.} xywh {26 75 390 24} align 69 code0 {o->value(progdefaults.kml_save_dir.c_str());} } Fl_Input inputKmlRootFile { label {KML root file} xywh {25 119 300 24} align 5 code0 {o->value("fldigi.kml");} } Fl_Counter cntKmlMergeDistance { label {Minimum distance for splitting aliases (Meters)} callback {progdefaults.kml_merge_distance = o->value(); progdefaults.changed = true; kml_init();} tooltip {Minimum distance for splitting alias nodes (Meters)} xywh {26 155 100 24} align 8 minimum 0 maximum 100000 step 10 value 1000 code0 {o->value(progdefaults.kml_merge_distance);} code1 {o->lstep(1000);} } Fl_Counter cntKmlRetentionTime { label {Data retention time, in hours (0 for no limit)} callback {progdefaults.kml_retention_time = o->value(); progdefaults.changed = true; kml_init();} tooltip {Number of hours data is kept for each node. Zero means keeping everything.} xywh {25 191 100 24} align 8 minimum 0 maximum 500 step 1 code0 {o->value(progdefaults.kml_retention_time);} code1 {o->lstep(24);} } Fl_Spinner cntKmlRefreshInterval { label {KML refresh interval (seconds)} callback {progdefaults.kml_refresh_interval = (int)(o->value()); progdefaults.changed = true; kml_init();} tooltip {Refresh time interval written in KML file (Seconds)} xywh {24 227 50 24} align 8 value 10 code0 {o->minimum(1); o->maximum(3600); o->step(1);} code1 {o->value(progdefaults.kml_refresh_interval);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Group listbox_kml_balloon_style { label {KML balloon display style} callback {progdefaults.kml_balloon_style = o->index(); progdefaults.changed = true; kml_init();} tooltip {KML balloon in plain text, or HTML, in plain tables or matrices.} xywh {24 263 201 24} box DOWN_BOX color 7 align 8 when 1 code0 {o->add("Plain text|HTML tables|Single HTML matrix");o->index(progdefaults.kml_balloon_style);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Input btnKmlCommand { label {Command run on KML creation} callback {progdefaults.kml_command=o->value(); progdefaults.changed = true; kml_init();} tooltip {Command started when KML files are generated. Subprocesses are started once, and restarted if needed.} xywh {24 299 246 24} align 72 code0 {o->value(progdefaults.kml_command.c_str());} } Fl_Button btlTestKmlCommand { label {Test command} callback {KmlServer::SpawnProcess();} tooltip {Execute command on KML files.} xywh {24 335 191 24} } Fl_Button btnSelectKmlDestDir { label {Change dir...} callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(KmlDestDirSet); fc->show();} tooltip {Choose directory to store KML documents} xywh {425 75 101 24} } Fl_Button btlPurge { label {Cleanup KML data now !} callback {KmlServer::GetInstance()->Reset();} tooltip {Cleanups KML documents, empties Google Earth display.} xywh {336 119 190 24} } Fl_Check_Button btnKmlPurgeOnStartup { label {Cleanup on startup} callback {progdefaults.kml_purge_on_startup = o->value(); progdefaults.changed = true;} tooltip {Empties KML documents when starting program.} xywh {322 231 172 15} down_box DOWN_BOX code0 {o->value(progdefaults.kml_purge_on_startup);} } Fl_Group {} {open xywh {283 327 310 40} box ENGRAVED_FRAME } { Fl_Check_Button btn_kml_enabled { label {KML server enabled (On / Off)} callback {progdefaults.kml_enabled = o->value(); if (progdefaults.kml_enabled) { kml_init(true); progdefaults.changed = true; } else { KmlServer::Exit(); }} tooltip {Uncheck if KML is never used} xywh {305 337 242 19} down_box DOWN_BOX code0 {o->value(progdefaults.kml_enabled);} } } } } } Fl_Group tabQRZ { label Web open xywh {0 25 675 365} hide } { Fl_Tabs tabsQRZ {open xywh {0 25 675 365} } { Fl_Group {} { label {Call Lookup} open xywh {0 50 675 340} } { Fl_Group {} { label {Web Browser lookup} open xywh {8 56 585 131} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZWEBnotavailable { label None callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZWEBNONE; progdefaults.changed = true;} tooltip {Do not use callsign lookup via web browser} xywh {48 75 61 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.QRZWEB == QRZWEBNONE);} } Fl_Round_Button btnQRZonline { label {QRS on line} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZHTML; progdefaults.changed = true;} tooltip {Visit QRZ web site} xywh {48 95 83 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == QRZHTML);} } Fl_Round_Button btnHAMCALLonline { label {HamCall online} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMCALLHTML; progdefaults.changed = true;} tooltip {Visit Hamcall web site} xywh {48 116 83 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMCALLHTML);} } Fl_Round_Button btnHamQTHonline { label {HamQTH online} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true;} tooltip {Visit hamQTH web site} xywh {48 137 20 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMQTHHTML);} } Fl_Round_Button btnCallookOnline { label {Callook online} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = CALLOOKHTML; progdefaults.changed = true;} tooltip {Visit hamQTH web site} xywh {48 158 20 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == CALLOOKHTML);} } Fl_Input inp_qrzurl { label QRZ callback {progdefaults.qrzurl = o->value(); progdefaults.changed=true;} xywh {302 69 270 22} code0 {o->value(progdefaults.qrzurl.c_str());} class Fl_Input2 } Fl_Input inp_hamcallurl { label Hamcall callback {progdefaults.hamcallurl = o->value(); progdefaults.changed = true;} xywh {302 96 270 22} code0 {o->value(progdefaults.hamcallurl.c_str());} class Fl_Input2 } Fl_Input inp_hamqthurl { label HamQTH callback {progdefaults.hamqthurl = o->value(); progdefaults.changed = true;} xywh {302 124 270 22} code0 {o->value(progdefaults.hamqthurl.c_str());} class Fl_Input2 } Fl_Input inp_callook_url { label Callook callback {progdefaults.callookurl = o->value(); progdefaults.changed = true;} tooltip {Callook.info web site} xywh {302 153 270 22} code0 {o->value(progdefaults.callookurl.c_str());} class Fl_Input2 } } Fl_Group {} { label {Data base lookup} open xywh {8 188 585 195} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZXMLnotavailable { label None callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZXMLNONE; progdefaults.changed = true;} tooltip {Do not use callsign database} xywh {55 211 69 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.QRZXML == QRZXMLNONE);} } Fl_Round_Button btnQRZcdrom { label {QRZ cdrom} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZCD; progdefaults.changed = true;} tooltip {Use CD or hard drive CD image} xywh {55 239 76 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZCD);} } Fl_Round_Button btnQRZsub { label {QRZ.com} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZNET; progdefaults.changed = true;} tooltip {You need a paid QRZ online subscription to access} xywh {55 267 137 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZNET);} } Fl_Round_Button btnHamcall { label {Hamcall.net} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = HAMCALLNET; progdefaults.changed = true;} tooltip {You need a paid Hamcall online subscription to access} xywh {55 296 137 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMCALLNET);} } Fl_Round_Button btnHamQTH { label {HamQTH.com} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = HAMQTH; progdefaults.changed = true;} tooltip {Free service courtesy of OK} xywh {55 324 137 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMQTH);} } Fl_Round_Button btnCALLOOK { label {Callook.info} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = CALLOOK; progdefaults.changed = true;} tooltip {Callook.info lookup (free service US callsigns only)} xywh {55 353 113 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == CALLOOK);} } Fl_Input txtQRZpathname { callback {progdefaults.QRZpathname = o->value(); progdefaults.QRZchanged = true; progdefaults.changed = true;} tooltip {ie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for database} xywh {172 238 401 22} code0 {o->value(progdefaults.QRZpathname.c_str());} code1 {txtQRZpathname->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpQRZusername { label {User name} callback {progdefaults.QRZusername = o->value(); progdefaults.changed = true;} tooltip {Login name for QRZ / Hamcall / HamQTH} xywh {282 273 163 22} code0 {o->value(progdefaults.QRZusername.c_str());} code1 {inpQRZusername->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpQRZuserpassword { label Password callback {progdefaults.QRZuserpassword = o->value(); progdefaults.changed = true;} tooltip {Password for QRZ / Hamcall / HamQTH} xywh {282 309 163 22} code0 {o->value(progdefaults.QRZuserpassword.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inpQRZuserpassword->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnQRZpasswordShow { label Show callback {inpQRZuserpassword->type(inpQRZuserpassword->type() ^ FL_SECRET_INPUT); inpQRZuserpassword->redraw(); o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide");} tooltip {Show password in plain text} xywh {457 309 76 22} } Fl_Group {} {open xywh {177 349 403 27} box ENGRAVED_FRAME } { Fl_Check_Button btn_notes_address { label {Add address to notes field} callback {progdefaults.notes_address = o->value(); progdefaults.changed = true;} xywh {201 355 207 15} down_box DOWN_BOX code0 {o->value(progdefaults.notes_address);} } Fl_Check_Button btn_clear_notes { label {clear old data} callback {progdefaults.clear_notes = o->value(); progdefaults.changed= true;} xywh {428 355 122 15} down_box DOWN_BOX code0 {o->value(progdefaults.clear_notes);} } } } } Fl_Group tabEQSL { label eQSL open xywh {0 50 600 340} hide } { Fl_Input inpEQSL_www_url { label {www url} callback {progdefaults.eqsl_www_url = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {155 59 390 22} code0 {o->value(progdefaults.eqsl_www_url.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpEQSL_id { label {User ID} callback {progdefaults.eqsl_id = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {154 82 150 22} code0 {o->value(progdefaults.eqsl_id.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpEQSL_pwd { label Password callback {progdefaults.eqsl_pwd = o->value(); progdefaults.changed = true;} tooltip {Your login password} xywh {154 105 150 22} code0 {o->value(progdefaults.eqsl_pwd.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnEQSL_pwd_show { label Show callback {inpEQSL_pwd->type(inpEQSL_pwd->type() ^ FL_SECRET_INPUT); inpEQSL_pwd->redraw(); o->label((inpEQSL_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide"));} tooltip {Show password in plain text} xywh {310 105 70 22} } Fl_Input inpEQSL_nick { label {QTH Nickname} callback {progdefaults.eqsl_nick = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {154 129 150 22} code0 {o->value(progdefaults.eqsl_nick.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btn_verify_eqsl { label Verify callback cb_btn_verify_eqsl tooltip {Verify database with eQSL download file} xywh {475 129 70 22} } Fl_Group {} { label Options open xywh {42 157 516 223} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_send_when_logged { label {send when logged (log button, , )} callback {progdefaults.eqsl_when_logged = o->value(); progdefaults.changed = true;} tooltip {automatic data upload} xywh {126 166 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_when_logged);} } Fl_Check_Button btn_send_datetime_off { label {Use date/time off for log entry} callback {progdefaults.eqsl_datetime_off = o->value(); progdefaults.changed = true;} tooltip {default uses date/time on} xywh {126 186 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_datetime_off);} } Fl_Check_Button btn_show_eqsl_delivery { label {Show delivery message} callback {progdefaults.eqsl_show_delivery = o->value(); progdefaults.changed = true;} tooltip {Display timed delivery message if enabled} xywh {126 206 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_show_delivery);} } Fl_Input txt_eqsl_default_message { label {Default message} callback {progdefaults.eqsl_default_message = o->value(); progdefaults.changed = true;} tooltip {default text to send with etc} xywh {95 247 451 40} type Multiline align 5 when 1 code0 {o->value(progdefaults.eqsl_default_message.c_str());} class Fl_Input2 } Fl_Group {} { label {Text Tags (tags use {} delimiters)} open xywh {58 293 481 81} box FLAT_BOX align 21 } { Fl_Box eqsl_txt1 { label { {CALL} other ops call sign} xywh {64 333 220 17} align 20 } Fl_Box eqsl_txt2 { label { {MODE} full mode / submode} xywh {62 352 220 17} align 20 } Fl_Box eqsl_txt3 { label {{NAME} other ops name} xywh {310 333 220 17} align 20 } Fl_Box {} { label {These tags can also be used in } xywh {80 312 440 17} } } } } Fl_Group tabLOTW { label LoTW open xywh {0 50 600 340} hide } { Fl_Input txt_lotw_pathname { label {tqsl:} callback {progdefaults.lotw_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for tqsl executable} xywh {82 91 422 24} when 1 code0 {o->value(progdefaults.lotw_pathname.c_str());} class Fl_Input2 } Fl_Input inpLOTW_pwd { label Password callback {progdefaults.lotw_pwd = o->value(); progdefaults.changed = true;} tooltip {Your tqsl login password} xywh {82 126 250 24} code0 {o->value(progdefaults.lotw_pwd.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inpLOTW_pwd->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btn_submit_lotw_password { label {Use password for tqsl access} callback {progdefaults.submit_lotw_password=o->value(); progdefaults.changed=true;} tooltip {Submit password with each upload} xywh {42 161 234 16} down_box DOWN_BOX code0 {o->value(progdefaults.submit_lotw_password);} } Fl_Input inpLOTW_location { label Location callback {progdefaults.lotw_location = o->value(); progdefaults.changed = true;} tooltip {tqsl station location} xywh {82 188 250 24} code0 {o->value(progdefaults.lotw_location.c_str());} code1 {inpLOTW_pwd->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btn_select_lotw { label Locate callback {std::string str = select_binary_pathname(progdefaults.lotw_pathname); txt_lotw_pathname->value(str.c_str()); progdefaults.lotw_pathname = str; progdefaults.changed = true;} tooltip {Locate tqsl executable} xywh {525 91 70 24} } Fl_Check_Button btn_lotw_quiet_mode { label {Quiet mode [-q], do not open tqsl dialog} callback {progdefaults.lotw_quiet_mode=o->value(); progdefaults.changed=true;} tooltip {Operate tqsl in batch mode (no dialog)} xywh {42 223 309 16} down_box DOWN_BOX code0 {o->value(progdefaults.lotw_quiet_mode);} } Fl_Check_Button btn_submit_lotw { label {Send QSO data to LoTW when logged} callback {progdefaults.submit_lotw=o->value(); progdefaults.changed=true;} tooltip {Submit each QSO as logged} xywh {42 247 289 16} down_box DOWN_BOX code0 {o->value(progdefaults.submit_lotw);} } Fl_Button btn_export_lotw { label Export callback {cb_btnExportLoTW();} tooltip {Export records for LoTW upload} xywh {15 273 70 24} } Fl_Button btn_review_lotw { label Check callback {cb_review_lotw();} tooltip {Review lotw.adif file before sending with tqsl} xywh {15 300 70 24} } Fl_Button btn_send_lotw { label Send callback {cb_send_lotw();} tooltip {Send lotw.adif via tqsl} xywh {15 328 70 24} } Fl_Box {} { label {Export logbook records for LoTW upload} xywh {90 273 346 24} align 20 } Fl_Box {} { label {Review / edit the exported LoTW upload adif file} xywh {90 300 346 24} align 20 } Fl_Box {} { label {Submit the upload adif file to LoTW} xywh {90 328 346 24} align 20 } Fl_Box {} { label {You must have tqsl installed and it's location recorded for LoTW updates to work!} xywh {11 60 574 24} align 16 } Fl_Button btnLOTW_pwd_show { label Show callback {inpLOTW_pwd->type(inpLOTW_pwd->type() ^ FL_SECRET_INPUT); inpLOTW_pwd->redraw(); o->label((inpLOTW_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide"));} tooltip {Show password in plain text} xywh {340 126 70 24} } Fl_Box {} { label {Use this tqsl station location} xywh {339 188 211 24} align 20 } Fl_Button btn_verify_lotw { label Match callback cb_btn_verify_lotw tooltip {Verify database with LoTW download file} xywh {15 356 70 24} } Fl_Box {} { label {Match logbook records with LoTW download file} xywh {90 356 346 24} align 20 } Fl_Button btn_view_unmatched { label {View Unmatched} callback cb_btn_view_unmatched tooltip {Verify database with LoTW download file} xywh {456 356 139 24} deactivate } Fl_Check_Button btn_show_lotw_delivery { label {Show delivery message} callback {progdefaults.lotw_show_delivery = o->value(); progdefaults.changed = true;} tooltip {Display timed delivery message if enabled} xywh {341 247 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.lotw_show_delivery);} } } } } Fl_Group tabAutoStart { label Autostart callback {progdefaults.changed = true;} open xywh {0 25 600 365} when 1 hide } { Fl_Group {} { label {Auto start programs with fldigi} open xywh {2 32 596 335} box ENGRAVED_BOX align 17 } { Fl_Input txt_auto_flrig_pathname { label {flrig:} callback {progdefaults.auto_flrig_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flrig} xywh {63 71 310 24} when 1 code0 {o->value(progdefaults.auto_flrig_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_flrig { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_flrig_pathname); txt_auto_flrig_pathname->value(str.c_str()); progdefaults.auto_flrig_pathname = str; progdefaults.changed = true;} tooltip {Locate flrig executable} xywh {395 71 70 24} } Fl_Input txt_auto_flamp_pathname { label {flamp:} callback {progdefaults.auto_flamp_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flamp} xywh {63 109 310 24} when 1 code0 {o->value(progdefaults.auto_flamp_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_auto_flamp { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_flamp_pathname); txt_auto_flamp_pathname->value(str.c_str()); progdefaults.auto_flamp_pathname = str; progdefaults.changed = true;} tooltip {Locate flamp executable} xywh {395 109 70 24} } Fl_Input txt_auto_flnet_pathname { label {flnet:} callback {progdefaults.auto_flnet_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flnet} xywh {63 147 310 24} when 1 code0 {o->value(progdefaults.auto_flnet_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_auto_flnet { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_flnet_pathname); txt_auto_flnet_pathname->value(str.c_str()); progdefaults.auto_flnet_pathname = str; progdefaults.changed = true;} tooltip {Locate flnet executable} xywh {395 147 70 24} } Fl_Input txt_auto_fllog_pathname { label {fllog:} callback {progdefaults.auto_fllog_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for fllog} xywh {63 186 310 24} when 1 code0 {o->value(progdefaults.auto_fllog_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_fllog { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_fllog_pathname); txt_auto_fllog_pathname->value(str.c_str()); progdefaults.auto_fllog_pathname = str; progdefaults.changed = true;} tooltip {Locate fllog executable} xywh {395 186 70 24} } Fl_Input txt_auto_prog1_pathname { label {Prog 1:} callback {progdefaults.auto_prog1_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program} xywh {63 224 310 24} when 1 code0 {o->value(progdefaults.auto_prog1_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog1 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog1_pathname); txt_auto_prog1_pathname->value(str.c_str()); progdefaults.auto_prog1_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#1 executable} xywh {395 224 70 24} } Fl_Input txt_auto_prog2_pathname { label {Prog 2:} callback {progdefaults.auto_prog2_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program} xywh {63 262 310 24} when 1 code0 {o->value(progdefaults.auto_prog2_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog2 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog2_pathname); txt_auto_prog2_pathname->value(str.c_str()); progdefaults.auto_prog2_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#2 executable} xywh {395 262 70 24} } Fl_Input txt_auto_prog3_pathname { label {Prog 3:} callback {progdefaults.auto_prog3_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program} xywh {63 301 310 24} when 1 code0 {o->value(progdefaults.auto_prog3_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog3 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog3_pathname); txt_auto_prog3_pathname->value(str.c_str()); progdefaults.auto_prog3_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#3 executable} xywh {395 301 70 24} } Fl_Check_Button btn_flrig_auto_enable { label {Enable -} callback {progdefaults.flrig_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 75 19 15} down_box DOWN_BOX align 1 code0 {o->value(progdefaults.flrig_auto_enable);} } Fl_Check_Button btn_flamp_auto_enable { callback {progdefaults.flamp_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 113 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.flamp_auto_enable);} } Fl_Check_Button btn_flnet_auto_enable { callback {progdefaults.flnet_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 151 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.flnet_auto_enable);} } Fl_Check_Button btn_fllog_auto_enable { callback {progdefaults.fllog_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 190 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.fllog_auto_enable);} } Fl_Check_Button btn_prog1_auto_enable { callback {progdefaults.prog1_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 228 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog1_auto_enable);} } Fl_Check_Button btn_prog2_auto_enable { callback {progdefaults.prog2_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 266 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog2_auto_enable);} } Fl_Check_Button btn_prog3_auto_enable { callback {progdefaults.prog3_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 305 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog3_auto_enable);} } Fl_Button btn_test_flrig { label Test callback {start_process(progdefaults.auto_flrig_pathname);} tooltip {Start flrig} xywh {505 71 70 24} } Fl_Button btn_test_flamp { label Test callback {start_process(progdefaults.auto_flamp_pathname);} tooltip {Start flamp} xywh {505 109 70 24} } Fl_Button btn_test_flnet { label Test callback {start_process(progdefaults.auto_flnet_pathname);} tooltip {Start flnet} xywh {505 147 70 24} } Fl_Button btn_test_fllog { label Test callback {start_process(progdefaults.auto_fllog_pathname);} tooltip {Start fllog} xywh {505 186 70 24} } Fl_Button btn_test_prog1 { label Test callback {start_process(progdefaults.auto_prog1_pathname);} tooltip {Start prog1} xywh {505 224 70 24} } Fl_Button btn_test_prog2 { label Test callback {start_process(progdefaults.auto_prog2_pathname);} tooltip {Start prog2} xywh {505 262 70 24} } Fl_Button btn_test_prog3 { label Test callback {start_process(progdefaults.auto_prog3_pathname);} tooltip {Start prog3} xywh {505 301 70 24} } } } Fl_Group tabIO { label IO callback {btnDisable_p2p_io_widgets->value(1);} xywh {0 25 600 365} hide code0 {btnDisable_p2p_io_widgets->value(1);} } { Fl_Group {} {open xywh {6 34 588 102} box ENGRAVED_BOX align 21 } { Fl_Check_Button btnDisable_p2p_io_widgets { label Lock user_data_type long callback {progStatus.ip_lock = o->value(); if(o->value()) disable_config_p2p_io_widgets(); else enable_config_p2p_io_widgets(); kiss_io_set_button_state(0);} tooltip {Allow/Disallow Changes} xywh {12 112 85 20} down_box DOWN_BOX code0 {o->value(progStatus.ip_lock);} } Fl_Check_Button btnEnable_arq { label {Enable ARQ} callback {if(o->value()) { enable_arq(); } progdefaults.changed = true;} tooltip {Used For PSKMail and FLDIGI Suite of Programs} xywh {96 112 115 20} type Radio down_box DOWN_BOX code0 {if(progStatus.data_io_enabled == ARQ_IO) o->value(true);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_kiss { label {Enable KISS} callback {if(o->value()) { enable_kiss(); } progdefaults.changed = true;} tooltip {Used for BPQ32} xywh {221 112 115 20} type Radio down_box DOWN_BOX code0 {if(progStatus.data_io_enabled == KISS_IO) o->value(true);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Box {} { label {Enable ARQ for programs that support TCP and FLDIGI ARQ protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol. Only one interface (ARQ/KISS) can be active at any given time. KISS/ARQ/XML Addr/Port changes require program restart.} xywh {8 37 582 72} } } Fl_Group {} { label KISS open xywh {6 138 588 85} box ENGRAVED_FRAME align 21 } { Fl_Button btnDefault_kiss_ip { label Default callback {set_ip_to_default(KISS_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {505 195 80 25} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Input txtKiss_ip_address { label Addr callback {progStatus.kiss_address = o->value(); progdefaults.kiss_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for KISS interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {55 195 230 25} align 8 when 1 code0 {txtKiss_ip_address->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.kiss_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtKiss_ip_io_port_no { label {I/O} callback {progStatus.kiss_io_port = o->value(); progdefaults.kiss_io_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {330 195 55 25} align 8 when 1 code0 {txtKiss_ip_io_port_no->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.kiss_io_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtKiss_ip_out_port_no { label O callback {progStatus.kiss_out_port = o->value(); progdefaults.kiss_out_port = o->value(); progdefaults.changed = true;} tooltip {Output port number when same IP address used} xywh {425 195 55 25} align 8 when 1 code0 {txtKiss_ip_out_port_no->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.kiss_out_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Check_Button btnEnable_dual_port { label DP callback {if(o->value()) { progStatus.kiss_dual_port_enabled = true; progdefaults.kiss_dual_port_enabled = true; } else { progStatus.kiss_dual_port_enabled = false; progdefaults.kiss_dual_port_enabled = false; } progdefaults.changed = true;} tooltip {Enable when both programs are using the same IP address} xywh {131 142 140 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_dual_port_enabled) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_restart_kiss { label Restart callback {//restart_kiss_server();} xywh {505 193 82 25} hide code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_connect_kiss_io { label Start callback {connect_to_kiss_io(true);} tooltip {Return KISS TCP IO connection to a Listening state} xywh {504 165 82 25} code0 {(progStatus.ip_lock || !progdefaults.kiss_tcp_io) ? o->deactivate() : o->activate();} } Fl_Check_Button btnKissTCPIO { label {TCP/IP} callback {if(o->value()) { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } else { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } kiss_io_set_button_state(0); progdefaults.changed = true;} tooltip {Check to enable TCP/IP IO Connection} xywh {280 142 70 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnKissUDPIO { label {UDP/IP} callback {if(o->value()) { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } else { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } kiss_io_set_button_state(0); progdefaults.changed = true;} tooltip {Check to enable UDP/IP IO} xywh {55 142 70 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnKissTCPListen { label {Listen / Bind} callback {if(o->value()) { progStatus.kiss_tcp_listen = true; progdefaults.kiss_tcp_listen = true; } else { progStatus.kiss_tcp_listen = false; progdefaults.kiss_tcp_listen = false; } progdefaults.changed = true;} tooltip {Monitor for TCP connection.} xywh {360 142 95 20} down_box DOWN_BOX code0 {if(progStatus.kiss_tcp_listen) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_7bit_modem_inhibit { label {Inhibit 7bit Modem} callback {if(o->value()) { progStatus.kiss_io_modem_change_inhibit = true; progdefaults.kiss_io_modem_change_inhibit = true; } else { progStatus.kiss_io_modem_change_inhibit = false; progdefaults.kiss_io_modem_change_inhibit = false; } progdefaults.changed = true;} tooltip {Inhibit 7 bit modem change notice on user or RSID reception} xywh {55 165 140 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_io_modem_change_inhibit) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_auto_connect { label {Auto Connect / Retry} callback {if(o->value()) { progdefaults.tcp_udp_auto_connect = true; } else { progdefaults.tcp_udp_auto_connect = false; } progdefaults.changed = true;} tooltip {Connect to host program on FLDIGI start up} xywh {280 165 155 20} down_box DOWN_BOX code0 {if(progdefaults.tcp_udp_auto_connect) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_ax25_decode { label {AX25 Decode} callback {if(o->value()) { progStatus.ax25_decode_enabled = true; progdefaults.ax25_decode_enabled = true; } else { progStatus.ax25_decode_enabled = false; progdefaults.ax25_decode_enabled = false; } progdefaults.changed = true;} tooltip {Decode AX25 Packets into human readable form} xywh {470 142 115 20} down_box DOWN_BOX code0 {if(progdefaults.ax25_decode_enabled) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Group {} { label ARQ open xywh {6 225 588 35} box ENGRAVED_FRAME align 21 } { Fl_Input txtArq_ip_address { label Addr callback {progdefaults.arq_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for ARQ interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {56 229 230 25} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.arq_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtArq_ip_port_no { label Port callback {progdefaults.arq_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {330 229 55 25} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.arq_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Button btnDefault_arq_ip { label Default callback {set_ip_to_default(ARQ_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {425 229 73 25} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_restart_arq { label Restart callback {//arq_restart();} xywh {505 229 82 25} hide code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Box {} { xywh {6 262 588 1} box BORDER_BOX } Fl_Group {} { label XML open xywh {6 266 588 35} box ENGRAVED_FRAME align 21 } { Fl_Button btnDefault_xmlrpc_ip { label Default callback {set_ip_to_default(XMLRPC_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {425 270 73 25} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Input txtXmlrpc_ip_address { label Addr callback {progdefaults.xmlrpc_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for XMLRPC interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {56 270 230 25} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.xmlrpc_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtXmlrpc_ip_port_no { label Port callback {progdefaults.xmlrpc_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {330 270 55 25} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.xmlrpc_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Button btn_restart_xml { label Restart callback {//restart_xml_server();} xywh {505 270 82 25} hide code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Group {} { label flrig open xywh {6 304 588 35} box ENGRAVED_FRAME align 21 } { Fl_Button btnDefault_flrig_ip { label Default callback {set_ip_to_default(FLRIG_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {425 309 73 25} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Input txt_flrig_ip_address { label Addr callback {progdefaults.flrig_ip_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {56 309 230 25} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txt_flrig_ip_port { label Port callback {progdefaults.flrig_ip_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {330 309 55 25} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Button btn_reconnect_flrig_server { label Reconnect callback {reconnect_to_flrig();} xywh {505 309 82 25} code0 {\#include "rigsupport.h"} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Group {} { label fllog open xywh {6 340 588 36} box ENGRAVED_FRAME align 21 } { Fl_Input txt_fllog_ip_address { label Addr callback {progdefaults.xmllog_address = o->value();} tooltip {IP Address for fllog interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {56 345 230 25} align 8 code0 {o->value(progdefaults.xmllog_address.c_str());} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Input txt_fllog_ip_port { label Port callback {progdefaults.xmllog_port = o->value();} tooltip {IP Address Port Number} xywh {330 345 55 25} align 8 code0 {o->value(progdefaults.xmllog_port.c_str());} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_reconnect_log_server { label Reconnect callback {progdefaults.xml_logbook = true; progdefaults.changed = true; connect_to_log_server();} xywh {505 345 82 25} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btnDefault_fllog_ip { label Default callback {set_ip_to_default(FLLOG_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {425 345 73 25} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } } Fl_Group tabKPSM { label PSM open xywh {0 25 600 365} hide } { Fl_Group {} {open xywh {0 33 590 105} box ENGRAVED_BOX align 21 } { Fl_Counter cntBusyChannelSeconds { label {Allow TX After Signal Detection (Seconds)} callback {progStatus.busyChannelSeconds = (int) o->value(); progdefaults.busyChannelSeconds = (int) o->value(); progdefaults.changed = true;} tooltip {Allow transmits after 'N' seconds of a signal detection.} xywh {180 39 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.busyChannelSeconds);} code1 {o->step(1,10);} } Fl_Check_Button btnEnableBusyChannel { label {Enable Busy Channel} callback {if(o->value()) { progStatus.enableBusyChannel = true; progdefaults.enableBusyChannel = true; } else { progStatus.enableBusyChannel = false; progdefaults.enableBusyChannel = false; } progdefaults.changed = true;} tooltip {Enable to inhibit TX on signal Detections} xywh {10 41 115 20} down_box DOWN_BOX code0 {if(progdefaults.enableBusyChannel) o->value(true);} code1 {else o->value(false);} } Fl_Counter cntPSMTXBufferFlushTimer { label {TX Buffer Flush Timer (Minutes, 0=Disable)} callback {progStatus.psm_flush_buffer_timeout = (int) o->value(); progdefaults.psm_flush_buffer_timeout = (int) o->value(); progdefaults.changed = true;} tooltip {Flushes the TX buffer after x period when Busy Channel remains on (TX inhibited)} xywh {180 64 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_flush_buffer_timeout);} code1 {o->step(1,10); o->minimum(0); o->maximum(999);} } Fl_Counter cntPSMBandwidthMargins { label {Modem Bandwidth Margins } callback {progStatus.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.changed = true;} tooltip {Monitor signals in modem bandwitdh plus margins.} xywh {180 89 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_minimum_bandwidth_margin);} code1 {o->step(1,10);} } Fl_Counter cntPSMValidSamplePeriod { label {Valid Signal Sample Period (Milliseconds)} callback {progStatus.psm_hit_time_window = (int) o->value(); progdefaults.psm_hit_time_window = (int) o->value(); progdefaults.changed = true;} tooltip {Valid signal sample period in Milliseconds} xywh {180 115 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_hit_time_window);} code1 {o->step(1,10);} } } Fl_Group {} {open xywh {0 142 593 92} box ENGRAVED_BOX align 21 } { Fl_Check_Button btnEnable_csma { label {Enable CSMA} callback {if(o->value()) { progStatus.csma_enabled = true; progdefaults.csma_enabled = true; } else { progStatus.csma_enabled = false; progdefaults.csma_enabled = false; } progdefaults.changed = true;} tooltip {Carrier Sense Mulitiple Access} xywh {10 156 115 20} down_box DOWN_BOX code0 {if(progdefaults.csma_enabled) o->value(true);} } Fl_Counter cntPersistance { label Persistance callback {progStatus.csma_persistance = (int) o->value(); progdefaults.csma_persistance = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_PERSISTANCE);} tooltip {Used to adjust the aggressiveness of TX} xywh {140 156 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.csma_persistance);} code1 {o->step(1,10); o->minimum(0); o->maximum(255);} } Fl_Counter cntSlotTime { label {Slot Time} callback {progStatus.csma_slot_time = (int) o->value(); progdefaults.csma_slot_time = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_SLOT_TIME);} tooltip {Non transmit window after a transmit period} xywh {140 181 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.csma_slot_time);} code1 {o->step(1,10); o->minimum(1); o->maximum(255);} } Fl_Counter cntTransmitDelay { label {Transmit Data Delay} callback {progStatus.csma_transmit_delay = (int) o->value(); progdefaults.csma_transmit_delay = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_TX_DELAY);} tooltip {Idle transmit before data sent} xywh {140 206 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.csma_transmit_delay);} code1 {o->step(1,10); o->minimum(1); o->maximum(255);} } Fl_Output OutputSlotTimeMS { label MilliSeconds tooltip {Displays the Slot Time in Milliseconds} xywh {397 181 95 20} align 8 } Fl_Output OutputTransmitDelayMS { label MilliSeconds tooltip {Displays the Transmit Delay in Milliseconds} xywh {397 206 95 20} align 8 } Fl_Output OutputPersistancePercent { label {Percent (%)} tooltip {Displays the Slot Time in Milliseconds} xywh {397 155 95 20} align 8 } } Fl_Group {} {open xywh {0 237 593 30} box ENGRAVED_BOX align 21 } { Fl_Check_Button btnEnable_histogram { label {Enable Histogram} callback {if(o->value()) { progStatus.psm_use_histogram = true; progdefaults.psm_use_histogram = true; } else { progStatus.psm_use_histogram = false; progdefaults.psm_use_histogram = false; } progdefaults.changed = true;} tooltip {Enable Histogram threshold signal monitoring} xywh {10 244 140 20} down_box DOWN_BOX code0 {if(progdefaults.psm_use_histogram) o->value(true);} } Fl_Counter cntPSMThreshold { label {PSM Histogram Threshold} callback {progStatus.psm_histogram_offset_threshold = (int) o->value(); progdefaults.psm_histogram_offset_threshold = (int) o->value(); progdefaults.changed = true;} tooltip {Sets the theshold level to x value above the noise level} xywh {180 244 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_histogram_offset_threshold);} code1 {o->step(1,10); o->minimum(1); o->maximum(20);} } } Fl_Group {} {open xywh {0 270 593 31} box ENGRAVED_BOX align 21 } { Fl_Counter cntKPSQLAttenuation { label {PSM Attenuate} callback {progStatus.kpsql_attenuation = (int) o->value(); progdefaults.kpsql_attenuation = (int) o->value(); update_kpsql_fractional_gain(progStatus.kpsql_attenuation); progdefaults.changed = true;} tooltip {Adjust sensitivity by 1/N fractional values.} xywh {180 275 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.kpsql_attenuation);} code1 {o->step(1,10); o->minimum(1); o->maximum(999);} code2 {update_kpsql_fractional_gain(progdefaults.kpsql_attenuation);} } } Fl_Button btnBuyChannelDefaults { label {Default Settings} callback {psm_set_defaults();} xywh {464 345 126 27} } Fl_Group {} {open xywh {0 304 593 31} box ENGRAVED_BOX align 21 } { Fl_Check_Button btn_show_psm_button { label {Show and enable Power Signal Monitor button (PSM)} callback {progdefaults.show_psm_btn = o->value(); UI_select(); progdefaults.changed = true;} tooltip {display PSM button on main dialog} xywh {10 310 151 20} down_box DOWN_BOX code0 {o->value(progdefaults.show_psm_btn);} } } } } Fl_Button btnSaveConfig { label Save callback {progdefaults.saveDefaults();} xywh {330 394 130 22} } Fl_Return_Button btnCloseConfig { label Close callback {closeDialog();} xywh {462 394 130 22} } Fl_Button btnResetConfig { label {Restore defaults} callback {if (fl_choice2("This will effect every configuration item!\\nConfirm", "Yes", "No", NULL)) { progdefaults.resetDefaults(); progdefaults.changed = false; }} tooltip {WARNING - this will over write ALL settings} xywh {20 394 130 22} } } } Function {openConfig()} {return_type void } { code {if (!dlgConfig) createConfig(); progdefaults.loadDefaults();} {} } Function {closeDialog()} {return_type void } { code {if (dlgConfig) dlgConfig->hide();} {} } Function {createConfig()} {return_type void } { code {if (!dlgConfig) { dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); }} {} } decl {class Fl_File_Chooser ;} {public global } Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->value( w->value() ); btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); }} {} } Function {KmlDestDirSet(Fl_File_Chooser *w, void *userdata)} {open return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->value( w->value() ); btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); }} {} } Function {make_window()} {} {} Function {make_window()} {open } {} fldigi-4.1.06/src/dialogs/tod_clock.cxx0000664000175000017500000001514513512070752014671 00000000000000// ===================================================================== // // TOD_clock.cxx // // interface to tcpip application fdserver.tcl // fdserver is a multiple client tcpip server // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "logsupport.h" #include "fd_logger.h" #include "fd_view.h" #include "confdialog.h" #include "timeops.h" #include "nanoIO.h" LOG_FILE_SOURCE(debug::LOG_FD); #define TX_TIMEOUT 60 //*5 // 5 minute timeout using namespace std; static pthread_t TOD_thread; static pthread_mutex_t TX_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t time_mutex = PTHREAD_MUTEX_INITIALIZER; static char ztbuf[20] = "20120602 123000"; static struct timeval tx_start_val; static struct timeval tx_last_val; static struct timeval start_val; static struct timeval now_val; extern void xmtrcv_cb(Fl_Widget *, void *); static int tx_timeout = 0; void kill_tx(void *) { wf->xmtrcv->value(0); xmtrcv_cb(wf->xmtrcv, 0); fl_alert2("TX timeout expired!\nAre you awake?"); } void service_deadman() { guard_lock txlock(&TX_mutex); if (!tx_timeout) return; if (--tx_timeout == 0) { Fl::awake(kill_tx); } } void start_deadman() { guard_lock txlock(&TX_mutex); tx_timeout = 60 * progdefaults.tx_timeout; } void stop_deadman() { guard_lock txlock(&TX_mutex); tx_timeout = 0; } const unsigned long zmsec(void) { struct timeval t1; { guard_lock lk(&time_mutex); t1 = now_val; } unsigned long msecs = (t1.tv_sec % 10000) * 1000; msecs += t1.tv_usec * 1000; return msecs; } const char* zdate(void) { return ztbuf; } const char* ztime(void) { return ztbuf + 9; } const char* zshowtime(void) { static char s[5]; strncpy(s, &ztbuf[9], 4); s[4] = 0; return (const char *)s; } static char tx_time[20]; static bool TOD_exit = false; static bool TOD_enabled = false; static bool tx_timer_active = false; void show_tx_timer() { if (!tx_timer) return; if (progdefaults.show_tx_timer && tx_timer_active) { snprintf(tx_time, sizeof(tx_time),"%02d:%02d", (int)((now_val.tv_sec - tx_start_val.tv_sec)/60), (int)((now_val.tv_sec - tx_start_val.tv_sec) % 60 )); tx_timer->color(FL_DARK_RED); tx_timer->labelcolor(FL_YELLOW); tx_timer->label(tx_time); tx_timer->redraw_label(); tx_timer->redraw(); } else { tx_timer->color(FL_BACKGROUND_COLOR); tx_timer->labelcolor(FL_BACKGROUND_COLOR); tx_timer->redraw_label(); tx_timer->redraw(); } } void start_tx_timer() { tx_last_val = tx_start_val = now_val; tx_timer_active = true; REQ(show_tx_timer); } void stop_tx_timer() { if (!tx_timer) return; tx_timer_active = false; } void update_tx_timer() { if (tx_last_val.tv_sec == now_val.tv_sec) return; tx_last_val = now_val; show_tx_timer(); service_deadman(); } void init_ztime() { struct tm tm; time_t t_temp; t_temp=(time_t)now_val.tv_sec; gmtime_r(&t_temp, &tm); if (!strftime(ztbuf, sizeof(ztbuf), "%Y%m%d %H%M%S", &tm)) memset(ztbuf, 0, sizeof(ztbuf)); else ztbuf[8] = '\0'; } //void ztimer(void *) static void ztimer() { struct tm tm; time_t t_temp; t_temp=(time_t)now_val.tv_sec; gmtime_r(&t_temp, &tm); if (!strftime(ztbuf, sizeof(ztbuf), "%Y%m%d %H%M%S", &tm)) memset(ztbuf, 0, sizeof(ztbuf)); else ztbuf[8] = '\0'; if (!inpTimeOff1) return; update_tx_timer(); inpTimeOff1->value(zshowtime()); inpTimeOff2->value(zshowtime()); inpTimeOff3->value(zshowtime()); inpTimeOff1->redraw(); inpTimeOff2->redraw(); inpTimeOff3->redraw(); } //====================================================================== // Use TOD loop for periodically redrawing the waterfall //====================================================================== extern pthread_mutex_t draw_mutex; //void wf_update(void *) void wf_update() { { guard_lock dlock(&draw_mutex); wf->redraw(); } } //====================================================================== // TOD Thread loop //====================================================================== static bool first_call = true; void *TOD_loop(void *args) { SET_THREAD_ID(TOD_TID); #define LOOP1 8 // update waterfall every 80 msec #define LOOP2 5 // update clock every 50 msec #define LOOP3 50 // update nanoIO pot reading every 500 msec int loop_nbr = 1; while(1) { if (TOD_exit) break; if (first_call) { guard_lock tmlock(&time_mutex); gettimeofday(&now_val, NULL); start_val = now_val; init_ztime(); first_call = false; } else { if (loop_nbr % LOOP2 == 0) { guard_lock tmlock(&time_mutex); gettimeofday(&now_val, NULL); REQ(ztimer); // Fl::awake(ztimer); } } if (loop_nbr % LOOP1 == 0) REQ(wf_update); // Fl::awake(wf_update); if (loop_nbr % LOOP3 == 0) REQ(nanoIO_read_pot); if (loop_nbr == (LOOP1 * LOOP2 * LOOP3)) loop_nbr = 0; loop_nbr++; MilliSleep(10); } // exit the TOD thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void TOD_init(void) { TOD_exit = false; if (pthread_create(&TOD_thread, NULL, TOD_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "Time Of Day thread started"); TOD_enabled = true; } //====================================================================== // //====================================================================== void TOD_close(void) { if (!TOD_enabled) return; TOD_exit = true; pthread_join(TOD_thread, NULL); TOD_enabled = false; LOG_INFO("%s", "Time Of Day thread terminated. "); } fldigi-4.1.06/src/dialogs/fl_digi.cxx0000664000175000017500000114715513507755043014344 00000000000000// ---------------------------------------------------------------------------- // // fl_digi.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #ifdef __WOE32__ # ifdef __CYGWIN__ # include # else # include # endif #endif #include #include #include #include #include #include #ifndef __WOE32__ #include #endif #include "gettext.h" #include "fl_digi.h" #include #include #include #include //#include #include #include #include #include #include #include #include #include #include "waterfall.h" #include "raster.h" #include "progress.h" #include "Panel.h" #include "main.h" #include "threads.h" #include "trx.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "timeops.h" #include "rigio.h" #include "nullmodem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "mt63.h" #include "view_rtty.h" #include "olivia.h" #include "contestia.h" #include "thor.h" #include "dominoex.h" #include "feld.h" #include "throb.h" //#include "pkt.h" #include "fsq.h" #include "ifkp.h" #include "wwv.h" #include "analysis.h" #include "ssb.h" #include "fileselect.h" #include "smeter.h" #include "pwrmeter.h" #include "ascii.h" #include "globals.h" #include "misc.h" #include "FTextRXTX.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "macros.h" #include "macroedit.h" #include "logger.h" #include "lookupcall.h" #include "fd_logger.h" #include "fd_view.h" #include "font_browser.h" #include "icons.h" #include "pixmaps.h" #include "rigsupport.h" #include "logsupport.h" #include "qrunner.h" #include "Viewer.h" #include "soundconf.h" #include "htmlstrings.h" # include "xmlrpc.h" #if BENCHMARK_MODE # include "benchmark.h" #endif #include "debug.h" #include "re.h" #include "network.h" #include "spot.h" #include "dxcc.h" #include "locator.h" #include "notify.h" #include "strutil.h" #include "test_signal.h" #include "logbook.h" #include "rx_extract.h" #include "speak.h" #include "flmisc.h" #include "arq_io.h" #include "data_io.h" #include "kmlserver.h" #include "psm/psm.h" #include "n3fjp_logger.h" #include "dx_cluster.h" #include "dx_dialog.h" #include "notifydialog.h" #include "macroedit.h" #include "rx_extract.h" #include "wefax-pic.h" #include "charsetdistiller.h" #include "charsetlist.h" #include "outputencoder.h" #include "record_loader.h" #include "record_browse.h" #include "winkeyer.h" #include "nanoIO.h" #include "audio_alert.h" #include "spectrum_viewer.h" #include "contest.h" #define CB_WHEN FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS | FL_WHEN_RELEASE_ALWAYS #define LOG_TO_FILE_MLABEL _("Log all RX/TX text") #define RIGCONTROL_MLABEL _("Rig control") #define OPMODES_MLABEL _("Op &Mode") #define OPMODES_FEWER _("Show fewer modes") #define OPMODES_ALL _("Show all modes") #define OLIVIA_MLABEL "Olivia" #define CONTESTIA_MLABEL "Contestia" #define RTTY_MLABEL "RTTY" #define VIEW_MLABEL _("&View") #define MFSK_IMAGE_MLABEL _("MFSK Image") #define THOR_IMAGE_MLABEL _("THOR Raw Image") #define IFKP_IMAGE_MLABEL _("IFKP Raw Image") #define WEFAX_RX_IMAGE_MLABEL _("Weather Fax Image RX") #define WEFAX_TX_IMAGE_MLABEL _("Weather Fax Image TX") #define CONTEST_MLABEL _("Contest") #define COUNTRIES_MLABEL _("C&ountries") #define UI_MLABEL _("&UI") #define RIGLOG_FULL_MLABEL _("Full") #define RIGLOG_PARTIAL_MLABEL _("Partial") #define RIGLOG_NONE_MLABEL _("None") #define DOCKEDSCOPE_MLABEL _("Docked scope") #define WF_MLABEL _("Minimal controls") #define SHOW_CHANNELS _("Show channels") #define LOG_CONNECT_SERVER _("Connect to server") // MAXIMUM allowable string lengths in log fields #define MAX_FREQ 14 #define MAX_TIME 4 #define MAX_RST 3 #define MAX_CALL 30 #define MAX_NAME 30 #define MAX_AZ 3 #define MAX_QTH 50 #define MAX_STATE 2 #define MAX_LOC 8 #define MAX_SERNO 10 #define MAX_XCHG_IN 50 #define MAX_COUNTRY 50 #define MAX_COUNTY 100 #define MAX_NOTES 400 #define MAX_SECTION 20 #define MAX_CLASS 10 using namespace std; void set599(); //regular expression parser using by mainViewer (pskbrowser) fre_t seek_re("CQ", REG_EXTENDED | REG_ICASE | REG_NOSUB); bool bWF_only = false; Fl_Double_Window *fl_digi_main = (Fl_Double_Window *)0; Fl_Button *btnDockMacro[48]; Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0; Fl_Double_Window *scopeview = (Fl_Double_Window *)0; Fl_Double_Window *field_day_viewer = (Fl_Double_Window *)0; Fl_Double_Window *dxcluster_viewer = (Fl_Double_Window *)0; static Fl_Group *mnuFrame; Fl_Menu_Bar *mnu; Fl_Box *tx_timer = (Fl_Box *)0; Fl_Light_Button *btnAutoSpot = (Fl_Light_Button *)0; Fl_Light_Button *btnTune = (Fl_Light_Button *)0; Fl_Light_Button *btnRSID = (Fl_Light_Button *)0; Fl_Light_Button *btnTxRSID = (Fl_Light_Button *)0; static Fl_Button *btnMacroTimer = (Fl_Button *)0; Fl_Group *center_group = (Fl_Group *)0; Fl_Group *text_group; Fl_Group *wefax_group = 0; Fl_Group *mvgroup = 0; Panel *text_panel = 0; //------------------------------------------------------------------------------ // groups and widgets used exclusively for FSQCALL Fl_Group *fsq_group = 0; Fl_Group *fsq_upper = 0; Fl_Group *fsq_lower = 0; Fl_Group *fsq_upper_left = 0; Fl_Group *fsq_upper_right = 0; Fl_Group *fsq_lower_left = 0; Fl_Group *fsq_lower_right = 0; Panel *fsq_left = (Panel *)0; Fl_Box *fsq_minbox = (Fl_Box *)0; FTextRX *fsq_rx_text = (FTextRX *)0; FTextTX *fsq_tx_text = (FTextTX *)0; Fl_Browser *fsq_heard = (Fl_Browser *)0; Fl_Light_Button *btn_FSQCALL = (Fl_Light_Button *)0; Fl_Light_Button *btn_SELCAL = (Fl_Light_Button *)0; Fl_Light_Button *btn_MONITOR = (Fl_Light_Button *)0; Fl_Button *btn_FSQQTH = (Fl_Button *)0; Fl_Button *btn_FSQQTC = (Fl_Button *)0; Fl_Button *btn_FSQCQ = (Fl_Button *)0; Progress *ind_fsq_speed = (Progress *)0; Progress *ind_fsq_s2n = (Progress *)0; //------------------------------------------------------------------------------ // groups and widgets used exclusively for IFKP Fl_Group *ifkp_group = (Fl_Group *)0; Fl_Box *ifkp_minbox = (Fl_Box *)0; Fl_Group *ifkp_left = (Fl_Group *)0; FTextRX *ifkp_rx_text = (FTextRX *)0; FTextTX *ifkp_tx_text = (FTextTX *)0; Fl_Group *ifkp_right = (Fl_Group *)0; Fl_Browser *ifkp_heard = (Fl_Browser *)0; Progress *ifkp_s2n_progress = (Progress *)0; picture *ifkp_avatar = (picture *)0; //------------------------------------------------------------------------------ // thor avatar picture *thor_avatar = (picture *)0; //------------------------------------------------------------------------------ Fl_Group *macroFrame1 = (Fl_Group *)0; Fl_Group *macroFrame2 = (Fl_Group *)0; Fl_Group *mf_group1 = (Fl_Group *)0; Fl_Group *mf_group2 = (Fl_Group *)0; Fl_Group *tbar = (Fl_Group *)0; FTextRX *ReceiveText = 0; FTextTX *TransmitText = 0; Raster *FHdisp; Fl_Box *minbox; int oix; pskBrowser *mainViewer = (pskBrowser *)0; Fl_Input2 *txtInpSeek = (Fl_Input2 *)0; static Fl_Box *StatusBar = (Fl_Box *)0; Fl_Box *Status2 = (Fl_Box *)0; Fl_Box *Status1 = (Fl_Box *)0; Fl_Counter2 *cntTxLevel = (Fl_Counter2 *)0; Fl_Counter2 *cntCW_WPM=(Fl_Counter2 *)0; static Fl_Button *btnCW_Default=(Fl_Button *)0; static Fl_Box *WARNstatus = (Fl_Box *)0; Fl_Button *MODEstatus = (Fl_Button *)0; Fl_Button *btnMacro[NUMMACKEYS * NUMKEYROWS]; Fl_Button *btnAltMacros1 = (Fl_Button *)0; Fl_Button *btnAltMacros2 = (Fl_Button *)0; Fl_Light_Button *btnAFC = (Fl_Light_Button *)0; Fl_Light_Button *btnSQL = (Fl_Light_Button *)0; Fl_Light_Button *btnPSQL = (Fl_Light_Button *)0; Fl_Box *corner_box = (Fl_Box *)0; Fl_Group *RigControlFrame = (Fl_Group *)0; Fl_Group *RigViewerFrame = (Fl_Group *)0; cFreqControl *qsoFreqDisp = (cFreqControl *)0; Fl_Group *qso_combos = (Fl_Group *)0; Fl_ListBox *qso_opMODE = (Fl_ListBox *)0; Fl_Group *qso_opGROUP = (Fl_Group *)0; Fl_ListBox *qso_opBW = (Fl_ListBox *)0; Fl_Button *qso_btnBW1 = (Fl_Button *)0; Fl_ListBox *qso_opBW1 = (Fl_ListBox *)0; Fl_Button *qso_btnBW2 = (Fl_Button *)0; Fl_ListBox *qso_opBW2 = (Fl_ListBox *)0; Fl_Button *qso_opPICK = (Fl_Button *)0; static Fl_Button *qsoClear; Fl_Button *qsoSave; Fl_Input2 *inpFreq = (Fl_Input2 *)0; Fl_Input2 *inpTimeOff = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn = (Fl_Input2 *)0; Fl_Button *btnTimeOn; Fl_Input2 *inpCall = (Fl_Input2 *)0; Fl_Input2 *inpName = (Fl_Input2 *)0; Fl_Input2 *inpRstIn = (Fl_Input2 *)0; Fl_Input2 *inpRstOut = (Fl_Input2 *)0; Fl_Input2 *inpQTH = (Fl_Input2 *)0; Fl_Input2 *inpQth = (Fl_Input2 *)0; Fl_Input2 *inpLoc = (Fl_Input2 *)0; Fl_Input2 *inpState = (Fl_Input2 *)0; Fl_Input2 *inpCounty = (Fl_Input2 *)0; Fl_ComboBox *cboCountyQSO = (Fl_ComboBox *)0; Fl_ComboBox *cboCountry = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryQSO = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryAICW2 = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryAIDX = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryWAE2 = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryAIDX2 = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryRTU2 = (Fl_ComboBox *)0; Fl_Input2 *inpSerNo = (Fl_Input2 *)0; Fl_Input2 *outSerNo = (Fl_Input2 *)0; Fl_Input2 *inpXchgIn = (Fl_Input2 *)0; // Field Day fields Fl_Input2 *inpClass = (Fl_Input2 *)0; Fl_Input2 *inpSection = (Fl_Input2 *)0; // CQWW fields Fl_Input2 *inp_CQzone = (Fl_Input2 *)0; Fl_Input2 *inp_CQstate = (Fl_Input2 *)0; // Kids Day fields Fl_Input2 *inp_KD_age = (Fl_Input2 *)0; Fl_Input2 *inpVEprov = (Fl_Input2 *)0; Fl_Input2 *inpNotes = (Fl_Input2 *)0; Fl_Input2 *inpAZ = (Fl_Input2 *)0; Fl_Button *qsoTime; Fl_Button *btnQRZ; //Fl_Button *CFtoggle = (Fl_Button *)0; // Top Frame 1 group controls Fl_Group *Logging_frame = (Fl_Group *)0; static Fl_Group *Logging_frame_1 = (Fl_Group *)0; //static Fl_Tabs *Logging_frame_2 = (Fl_Tabs *)0; static Fl_Tabs *NFtabs = (Fl_Tabs *)0; static Fl_Group *gGEN_QSO_1 = (Fl_Group *)0; static Fl_Group *NotesFrame = (Fl_Group *)0; static Fl_Group *Ccframe = (Fl_Group *)0; Fl_Group *TopFrame1 = (Fl_Group *)0; Fl_Input2 *inpFreq1 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOff1 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn1 = (Fl_Input2 *)0; Fl_Button *btnTimeOn1; Fl_Input2 *inpCall1 = (Fl_Input2 *)0; Fl_Input2 *inpName1 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn1 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut1 = (Fl_Input2 *)0; Fl_Input2 *inpState1 = (Fl_Input2 *)0; Fl_Input2 *inpLoc1 = (Fl_Input2 *)0; // Generic contest sub frame Fl_Group *gGEN_CONTEST = (Fl_Group *)0; Fl_Input2 *inpXchgIn1 = (Fl_Input2 *)0; Fl_Input2 *outSerNo1 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo1 = (Fl_Input2 *)0; // FD contest sub frame Fl_Group *gFD = (Fl_Group *)0; Fl_Input2 *inp_FD_class1 = (Fl_Input2 *)0; Fl_Input2 *inp_FD_section1 = (Fl_Input2 *)0; // Kids Day fields Fl_Group *gKD_1 = (Fl_Group *)0; Fl_Input2 *inp_KD_age1 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_state1 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_VEprov1 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_XchgIn1 = (Fl_Input2 *)0; // CQWW RTTY contest sub frame Fl_Group *gCQWW_RTTY = (Fl_Group *)0; Fl_Input2 *inp_CQzone1 = (Fl_Input2 *)0; Fl_Input2 *inp_CQstate1 = (Fl_Input2 *)0; // CQWW DX contest sub frame Fl_Group *gCQWW_DX = (Fl_Group *)0; Fl_Input2 *inp_CQDXzone1 = (Fl_Input2 *)0; // CW Sweepstakes contest sub frame Fl_Group *gCWSS = (Fl_Group *)0; Fl_Input2 *outSerNo3 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_SerialNoR = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Precedence = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Check = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Section = (Fl_Input2 *)0; Fl_Input2 *inp_SS_SerialNoR1 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Precedence1 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Check1 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Section1 = (Fl_Input2 *)0; // 1010 contest Fl_Group *g1010 = (Fl_Group *)0; Fl_Input2 *inp_1010_nr = (Fl_Input2 *)0; Fl_Input2 *inp_1010_nr1 = (Fl_Input2 *)0; Fl_Input2 *inp_1010_XchgIn1 = (Fl_Input2 *)0; // VHF contest Fl_Group *gVHF = (Fl_Group *)0; Fl_Input2 *inp_vhf_RSTin1 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_RSTout1 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_Loc1 = (Fl_Input2 *)0; // ARRL Round Up Contest Fl_Group *gARR = (Fl_Group *)0; Fl_Input2 *inp_ARR_Name2 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_check = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_check1 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_check2 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_XchgIn1 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_XchgIn2 = (Fl_Input2 *)0; // ARRL School Roundup - LOG_ASCR Fl_Group *gASCR = (Fl_Group *)0; Fl_Input2 *inp_ASCR_class1 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_XchgIn1 = (Fl_Input2 *)0; // LOG_NAQP - North American QSO Party Fl_Group *gNAQP = (Fl_Group *)0; Fl_Input2 *inpSPCnum = (Fl_Input2 *)0; // same name used in N3FJP loggers Fl_Input2 *inpSPCnum_NAQP1 = (Fl_Input2 *)0; // LOG_ARRL_RTTY - ARRL RTTY Roundup Fl_Group *gARRL_RTTY= (Fl_Group *)0; Fl_Input2 *inpRTU_stpr1 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_serno1 = (Fl_Input2 *)0; // LOG_IARI - Italian International DX Fl_Group *gIARI = (Fl_Group *)0; Fl_Input2 *inp_IARI_PR1 = (Fl_Input2 *)0; Fl_Input2 *out_IARI_SerNo1 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_SerNo1 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *out_IARI_SerNo2 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_SerNo2 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_PR2= (Fl_Input2 *)0; Fl_ComboBox *cboCountryIARI2 = (Fl_ComboBox *)0; // LOG_NAS - North American Sprint Fl_Group *gNAS = (Fl_Group *)0; Fl_Input2 *outSerNo5 = (Fl_Input2 *)0; Fl_Input2 *inp_ser_NAS1 = (Fl_Input2 *)0; Fl_Input2 *inpSPCnum_NAS1 = (Fl_Input2 *)0; // LOG_AIDX - African All Mode Fl_Group *gAIDX = (Fl_Group *)0; Fl_Input2 *outSerNo7 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo3 = (Fl_Input2 *)0; // LOG_JOTA - Jamboree On The Air Fl_Group *gJOTA = (Fl_Group *)0; Fl_Input2 *inp_JOTA_troop = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_scout = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_scout1 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_troop1 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_spc = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_spc1 = (Fl_Input2 *)0; // LOG_AICW - ARRL International DX (cw) Fl_Group *gAICW = (Fl_Group *)0; Fl_Input2 *inpSPCnum_AICW1 = (Fl_Input2 *)0; // LOG_SQSO Fl_Group *gSQSO = (Fl_Group *)0; Fl_Input2 *inpSQSO_state1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_state2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_county1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_county2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_serno1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_serno2 = (Fl_Input2 *)0; Fl_Input2 *outSQSO_serno1 = (Fl_Input2 *)0; Fl_Input2 *outSQSO_serno2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn_SQSO2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_SQSO2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_name2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_category = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_category1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_category2 = (Fl_Input2 *)0; // LOG_CQ_WPX Fl_Group *gCQWPX = (Fl_Group *)0; Fl_Input2 *inpSerNo_WPX1 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo_WPX2 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WPX1 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WPX2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn_WPX2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_WPX2 = (Fl_Input2 *)0; // LOG_WAE Fl_Group *gWAE = (Fl_Group *)0; Fl_Input2 *inpSerNo_WAE1 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo_WAE2 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WAE1 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WAE2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn_WAE2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_WAE2 = (Fl_Input2 *)0; //---------------------------------------------------------------------- // Single Line Rig / Logging Controls cFreqControl *qsoFreqDisp1 = (cFreqControl *)0; // Top Frame 2 group controls - no contest Fl_Group *TopFrame2 = (Fl_Group *)0; cFreqControl *qsoFreqDisp2 = (cFreqControl *)0; Fl_Input2 *inpTimeOff2 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn2 = (Fl_Input2 *)0; Fl_Button *btnTimeOn2; Fl_Input2 *inpCall2 = (Fl_Input2 *)0; Fl_Input2 *inpName2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut2 = (Fl_Input2 *)0; Fl_Button *qso_opPICK2; static Fl_Button *qsoClear2; static Fl_Button *qsoSave2; Fl_Button *btnQRZ2; // Top Frame 3 group controls - contest static Fl_Group *TopFrame3 = (Fl_Group *)0; static Fl_Group *TopFrame3a = (Fl_Group *)0; static Fl_Group *log_generic_frame = (Fl_Group *)0; static Fl_Group *log_fd_frame = (Fl_Group *)0; static Fl_Group *log_kd_frame = (Fl_Group *)0; static Fl_Group *log_1010_frame = (Fl_Group *)0; static Fl_Group *log_arr_frame = (Fl_Group *)0; static Fl_Group *log_vhf_frame = (Fl_Group *)0; static Fl_Group *log_cqww_frame = (Fl_Group *)0; static Fl_Group *log_cqww_rtty_frame = (Fl_Group *)0; static Fl_Group *log_cqss_frame = (Fl_Group *)0; static Fl_Group *log_cqwpx_frame = (Fl_Group *)0; static Fl_Group *log_ascr_frame = (Fl_Group *)0; static Fl_Group *log_naqp_frame = (Fl_Group *)0; static Fl_Group *log_rtty_frame = (Fl_Group *)0; static Fl_Group *log_iari_frame = (Fl_Group *)0; static Fl_Group *log_nas_frame = (Fl_Group *)0; static Fl_Group *log_aidx_frame = (Fl_Group *)0; static Fl_Group *log_jota_frame = (Fl_Group *)0; static Fl_Group *log_aicw_frame = (Fl_Group *)0; static Fl_Group *log_sqso_frame = (Fl_Group *)0; static Fl_Group *log_wae_frame = (Fl_Group *)0; cFreqControl *qsoFreqDisp3 = (cFreqControl *)0; static Fl_Button *qso_opPICK3; static Fl_Button *qsoClear3; static Fl_Button *qsoSave3; static Fl_Group *TopFrame3b = (Fl_Group *)0; Fl_Input2 *inpCall3 = (Fl_Input2 *)0; // Generic contest fields Fl_Input2 *inpTimeOff3 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn3 = (Fl_Input2 *)0; Fl_Button *btnTimeOn3; Fl_Input2 *outSerNo2 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo2 = (Fl_Input2 *)0; Fl_Input2 *inpXchgIn2 = (Fl_Input2 *)0; // Field Day fields Fl_Input2 *inpTimeOff4 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn4 = (Fl_Input2 *)0; Fl_Button *btnTimeOn4; Fl_Input2 *inp_FD_class2 = (Fl_Input2 *)0; Fl_Input2 *inp_FD_section2 = (Fl_Input2 *)0; // Kids Day fields Fl_Input2 *inp_KD_name2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_age2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_state2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_VEprov2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_XchgIn2 = (Fl_Input2 *)0; // CQWW RTTY fields Fl_Input2 *inp_CQ_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQ_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQzone2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQstate2 = (Fl_Input2 *)0; Fl_ComboBox *cboCountryCQ2 = (Fl_ComboBox *)0; // CQWW DX fields Fl_Input2 *inp_CQDX_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQDX_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQDXzone2 = (Fl_Input2 *)0; Fl_ComboBox *cboCountryCQDX2 = (Fl_ComboBox *)0; // CW Sweepstakes contest sub frame Fl_Input2 *outSerNo4 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_SerialNoR2 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Precedence2 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Check2 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Section2 = (Fl_Input2 *)0; // 1010 contest Fl_Input2 *inp_1010_name2 = (Fl_Input2 *)0; Fl_Input2 *inp_1010_nr2 = (Fl_Input2 *)0; Fl_Input2 *inp_1010_XchgIn2 = (Fl_Input2 *)0; // VHF contest Fl_Input2 *inp_vhf_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_Loc2 = (Fl_Input2 *)0; // ARRL School Roundup - LOG_ASCR Fl_Input2 *inp_ASCR_name2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_class2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_XchgIn2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_RSTout2 = (Fl_Input2 *)0; // LOG_NAQP Fl_Input2 *inpTimeOff5 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn5 = (Fl_Input2 *)0; Fl_Button *btnTimeOn5; Fl_Input2 *inpNAQPname2; Fl_Input2 *inpSPCnum_NAQP2 = (Fl_Input2 *)0; // LOG_ARRL_RTTY - ARRL RTTY Roundup Fl_Input2 *inpRTU_stpr2 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_serno2 = (Fl_Input2 *)0; // LOG_NAS - NA Sprint Fl_Input2 *outSerNo6 = (Fl_Input2 *)0; Fl_Input2 *inp_ser_NAS2 = (Fl_Input2 *)0; Fl_Input2 *inpSPCnum_NAS2 = (Fl_Input2 *)0; Fl_Input2 *inp_name_NAS2 = (Fl_Input2 *)0; // LOG_AIDX - African All Mode Fl_Input2 *inpRstIn3 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut3 = (Fl_Input2 *)0; Fl_Input2 *outSerNo8 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo4 = (Fl_Input2 *)0; // LOG_JOTA - Jamboree On The Air Fl_Input2 *inpRstIn4 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut4 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_scout2 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_troop2 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_spc2 = (Fl_Input2 *)0; // LOG_AICW - ARRL International DX (cw) Fl_Input2 *inpRstIn_AICW2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_AICW2 = (Fl_Input2 *)0; Fl_Input2 *inpSPCnum_AICW2 = (Fl_Input2 *)0; // Used when no logging frame visible Fl_Input2 *inpCall4 = (Fl_Input2 *)0; Fl_Browser *qso_opBrowser = (Fl_Browser *)0; static Fl_Button *qso_btnAddFreq = (Fl_Button *)0; static Fl_Button *qso_btnSelFreq = (Fl_Button *)0; static Fl_Button *qso_btnDelFreq = (Fl_Button *)0; static Fl_Button *qso_btnClearList = (Fl_Button *)0; static Fl_Button *qso_btnAct = 0; static Fl_Input2 *qso_inpAct = (Fl_Input2 *)0; static Fl_Group *opUsageFrame = (Fl_Group *)0; static Fl_Output *opOutUsage = (Fl_Output *)0; static Fl_Input2 *opUsage = (Fl_Input2 *)0; static Fl_Button *opUsageEnter = (Fl_Button *)0; static Fl_Group *wf_group = (Fl_Group *)0; static Fl_Group *status_group = (Fl_Group *)0; Fl_Value_Slider2 *mvsquelch = (Fl_Value_Slider2 *)0; static Fl_Button *btnClearMViewer = 0; static const int pad = 1; static const int Hentry = 24; static const int Wbtn = Hentry; static int x_qsoframe = Wbtn; int Hmenu = 22; static const int Hqsoframe = 2*pad + 3 * (Hentry + pad); int Hstatus = 20; int Hmacros = 20; #define TB_HEIGHT 20 #define MACROBAR_MIN 18 #define MACROBAR_MAX 30 static int wf1 = 355; static const int w_inpTime2 = 40; static const int w_inpCall2 = 100; static const int w_inpRstIn2 = 30; static const int w_inpRstOut2 = 30; // maximum 1 row height for raster display, FeldHell static int minhtext = 42*2+6; static int main_hmin;// = HMIN; time_t program_start_time = 0; bool xmlrpc_address_override_flag = false; bool xmlrpc_port_override_flag = false; bool arq_address_override_flag = false; bool arq_port_override_flag = false; bool kiss_address_override_flag = false; std::string override_xmlrpc_address = ""; std::string override_xmlrpc_port = ""; std::string override_arq_address = ""; std::string override_arq_port = ""; std::string override_kiss_address = ""; std::string override_kiss_io_port = ""; std::string override_kiss_out_port = ""; int override_kiss_dual_port_enabled = -1; // Ensure this remains negative until assigned int override_data_io_enabled = DISABLED_IO; int IMAGE_WIDTH; int Hwfall; int Wwfall; // The following are deprecated and should be removed after thorough testing //int HNOM = DEFAULT_HNOM; // WNOM must be large enough to contain ALL of the horizontal widgets // when the main dialog is initially created. //int WNOM = WMIN;//progStatus.mainW ? progStatus.mainW : WMIN; int altMacros = 0; waterfall *wf = (waterfall *)0; Digiscope *digiscope = (Digiscope *)0; Fl_Slider2 *sldrSquelch = (Fl_Slider2 *)0; Progress *pgrsSquelch = (Progress *)0; Smeter *smeter = (Smeter *)0; PWRmeter *pwrmeter = (PWRmeter *)0; Fl_Group *pwrlevel_grp = (Fl_Group *)0; Fl_Value_Slider2 *pwr_level = (Fl_Value_Slider2 *)0; Fl_Button *set_pwr_level = (Fl_Button *)0; static Fl_Pixmap *addrbookpixmap = 0; #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X Pixmap fldigi_icon_pixmap; #endif // for character set conversion int rxtx_charset; static CharsetDistiller rx_chd; static CharsetDistiller echo_chd; static OutputEncoder tx_encoder; Fl_Menu_Item *getMenuItem(const char *caption, Fl_Menu_Item* submenu = 0); void UI_select(); bool clean_exit(bool ask); void cb_init_mode(Fl_Widget *, void *arg); void cb_oliviaCustom(Fl_Widget *w, void *arg); void cb_contestiaCustom(Fl_Widget *w, void *arg); void cb_rtty45(Fl_Widget *w, void *arg); void cb_rtty50(Fl_Widget *w, void *arg); void cb_rtty75N(Fl_Widget *w, void *arg); void cb_rtty75W(Fl_Widget *w, void *arg); void cb_rtty100(Fl_Widget *w, void *arg); void cb_rttyCustom(Fl_Widget *w, void *arg); void cb_fsq2(Fl_Widget *w, void *arg); void cb_fsq3(Fl_Widget *w, void *arg); void cb_fsq4p5(Fl_Widget *w, void *arg); void cb_fsq6(Fl_Widget *w, void *arg); void cb_fsq1p5(Fl_Widget *w, void *arg); void cb_ifkp0p5(Fl_Widget *w, void *arg); void cb_ifkp1p0(Fl_Widget *w, void *arg); void cb_ifkp2p0(Fl_Widget *w, void *arg); void cb_ifkp0p5a(Fl_Widget *w, void *arg); void cb_ifkp1p0a(Fl_Widget *w, void *arg); void cb_ifkp2p0a(Fl_Widget *w, void *arg); void set_colors(); //void cb_pkt1200(Fl_Widget *w, void *arg); //void cb_pkt300(Fl_Widget *w, void *arg); //void cb_pkt2400(Fl_Widget *w, void *arg); Fl_Widget *modem_config_tab; static const Fl_Menu_Item *quick_change; static const Fl_Menu_Item quick_change_psk[] = { { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31 }, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63 }, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F }, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125 }, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250 }, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500 }, { mode_info[MODE_PSK1000].name, 0, cb_init_mode, (void *)MODE_PSK1000 }, { 0 } }; static const Fl_Menu_Item quick_change_qpsk[] = { { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31 }, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63 }, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125 }, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250 }, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500 }, { 0 } }; static const Fl_Menu_Item quick_change_8psk[] = { { mode_info[MODE_8PSK125].name, 0, cb_init_mode, (void *)MODE_8PSK125 }, { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250 }, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500 }, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000 }, { mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL }, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F }, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F }, { mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL }, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F }, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F }, { mode_info[MODE_8PSK1200F].name, 0, cb_init_mode, (void *)MODE_8PSK1200F }, { 0 } }; static const Fl_Menu_Item quick_change_pskr[] = { { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R }, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R }, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R }, { mode_info[MODE_PSK1000R].name, 0, cb_init_mode, (void *)MODE_PSK1000R }, { 0 } }; static const Fl_Menu_Item quick_change_psk_multiR[] = { { mode_info[MODE_4X_PSK63R].name, 0, cb_init_mode, (void *)MODE_4X_PSK63R }, { mode_info[MODE_5X_PSK63R].name, 0, cb_init_mode, (void *)MODE_5X_PSK63R }, { mode_info[MODE_10X_PSK63R].name, 0, cb_init_mode, (void *)MODE_10X_PSK63R }, { mode_info[MODE_20X_PSK63R].name, 0, cb_init_mode, (void *)MODE_20X_PSK63R }, { mode_info[MODE_32X_PSK63R].name, 0, cb_init_mode, (void *)MODE_32X_PSK63R }, { mode_info[MODE_4X_PSK125R].name, 0, cb_init_mode, (void *)MODE_4X_PSK125R }, { mode_info[MODE_5X_PSK125R].name, 0, cb_init_mode, (void *)MODE_5X_PSK125R }, { mode_info[MODE_10X_PSK125R].name, 0, cb_init_mode, (void *)MODE_10X_PSK125R }, { mode_info[MODE_12X_PSK125R].name, 0, cb_init_mode, (void *)MODE_12X_PSK125R }, { mode_info[MODE_16X_PSK125R].name, 0, cb_init_mode, (void *)MODE_16X_PSK125R }, { mode_info[MODE_2X_PSK250R].name, 0, cb_init_mode, (void *)MODE_2X_PSK250R }, { mode_info[MODE_3X_PSK250R].name, 0, cb_init_mode, (void *)MODE_3X_PSK250R }, { mode_info[MODE_5X_PSK250R].name, 0, cb_init_mode, (void *)MODE_5X_PSK250R }, { mode_info[MODE_6X_PSK250R].name, 0, cb_init_mode, (void *)MODE_6X_PSK250R }, { mode_info[MODE_7X_PSK250R].name, 0, cb_init_mode, (void *)MODE_7X_PSK250R }, { mode_info[MODE_2X_PSK500R].name, 0, cb_init_mode, (void *)MODE_2X_PSK500R }, { mode_info[MODE_3X_PSK500R].name, 0, cb_init_mode, (void *)MODE_3X_PSK500R }, { mode_info[MODE_4X_PSK500R].name, 0, cb_init_mode, (void *)MODE_4X_PSK500R }, { mode_info[MODE_2X_PSK800R].name, 0, cb_init_mode, (void *)MODE_2X_PSK800R }, { mode_info[MODE_2X_PSK1000R].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000R }, { 0 } }; static const Fl_Menu_Item quick_change_psk_multi[] = { { mode_info[MODE_12X_PSK125].name, 0, cb_init_mode, (void *)MODE_12X_PSK125 }, { mode_info[MODE_6X_PSK250].name, 0, cb_init_mode, (void *)MODE_6X_PSK250 }, { mode_info[MODE_2X_PSK500].name, 0, cb_init_mode, (void *)MODE_2X_PSK500 }, { mode_info[MODE_4X_PSK500].name, 0, cb_init_mode, (void *)MODE_4X_PSK500 }, { mode_info[MODE_2X_PSK800].name, 0, cb_init_mode, (void *)MODE_2X_PSK800 }, { mode_info[MODE_2X_PSK1000].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000 }, { 0 } }; static const Fl_Menu_Item quick_change_mfsk[] = { { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4 }, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8 }, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16 }, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11 }, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22 }, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31 }, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32 }, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64 }, { mode_info[MODE_MFSK128].name, 0, cb_init_mode, (void *)MODE_MFSK128 }, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L }, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L }, { 0 } }; static const Fl_Menu_Item quick_change_wefax[] = { { mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576 }, { mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288 }, { 0 } }; static const Fl_Menu_Item quick_change_navtex[] = { { mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX }, { mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB }, { 0 } }; static const Fl_Menu_Item quick_change_mt63[] = { { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S }, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L }, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S }, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L }, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S }, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L }, { 0 } }; static const Fl_Menu_Item quick_change_thor[] = { { mode_info[MODE_THORMICRO].name, 0, cb_init_mode, (void *)MODE_THORMICRO }, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4 }, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5 }, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8 }, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11 }, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16 }, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22 }, { mode_info[MODE_THOR25x4].name, 0, cb_init_mode, (void *)MODE_THOR25x4 }, { mode_info[MODE_THOR50x1].name, 0, cb_init_mode, (void *)MODE_THOR50x1 }, { mode_info[MODE_THOR50x2].name, 0, cb_init_mode, (void *)MODE_THOR50x2 }, { mode_info[MODE_THOR100].name, 0, cb_init_mode, (void *)MODE_THOR100 }, { 0 } }; static const Fl_Menu_Item quick_change_domino[] = { { mode_info[MODE_DOMINOEXMICRO].name, 0, cb_init_mode, (void *)MODE_DOMINOEXMICRO }, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4 }, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5 }, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8 }, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11 }, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16 }, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22 }, { mode_info[MODE_DOMINOEX44].name, 0, cb_init_mode, (void *)MODE_DOMINOEX44 }, { mode_info[MODE_DOMINOEX88].name, 0, cb_init_mode, (void *)MODE_DOMINOEX88 }, { 0 } }; static const Fl_Menu_Item quick_change_feld[] = { { mode_info[MODE_FELDHELL].name, 0, cb_init_mode, (void *)MODE_FELDHELL }, { mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL }, { mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5 }, { mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9 }, { mode_info[MODE_FSKHELL].name, 0, cb_init_mode, (void *)MODE_FSKHELL }, { mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105 }, { mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80 }, { 0 } }; static const Fl_Menu_Item quick_change_throb[] = { { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1 }, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2 }, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4 }, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1 }, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2 }, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4 }, { 0 } }; static const Fl_Menu_Item quick_change_olivia[] = { { mode_info[MODE_OLIVIA_4_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_125 }, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250 }, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500 }, { mode_info[MODE_OLIVIA_4_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_1000 }, { mode_info[MODE_OLIVIA_4_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_2000 }, { mode_info[MODE_OLIVIA_8_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_125 }, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250 }, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500 }, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000 }, { mode_info[MODE_OLIVIA_8_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_2000 }, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500 }, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000 }, { mode_info[MODE_OLIVIA_16_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_2000 }, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000 }, { mode_info[MODE_OLIVIA_32_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_2000 }, { mode_info[MODE_OLIVIA_64_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_500 }, { mode_info[MODE_OLIVIA_64_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_1000 }, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000 }, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA }, { 0 } }; static const Fl_Menu_Item quick_change_contestia[] = { { mode_info[MODE_CONTESTIA_4_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_125 }, { mode_info[MODE_CONTESTIA_4_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_250 }, { mode_info[MODE_CONTESTIA_4_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_500 }, { mode_info[MODE_CONTESTIA_4_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_1000 }, { mode_info[MODE_CONTESTIA_4_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_2000 }, { mode_info[MODE_CONTESTIA_8_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_125 }, { mode_info[MODE_CONTESTIA_8_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_250 }, { mode_info[MODE_CONTESTIA_8_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_500 }, { mode_info[MODE_CONTESTIA_8_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_1000 }, { mode_info[MODE_CONTESTIA_8_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_2000 }, { mode_info[MODE_CONTESTIA_16_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_500 }, { mode_info[MODE_CONTESTIA_16_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_1000 }, { mode_info[MODE_CONTESTIA_16_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_2000 }, { mode_info[MODE_CONTESTIA_32_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_1000 }, { mode_info[MODE_CONTESTIA_32_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_2000 }, { mode_info[MODE_CONTESTIA_64_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_500 }, { mode_info[MODE_CONTESTIA_64_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_1000 }, { mode_info[MODE_CONTESTIA_64_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_2000 }, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA }, { 0 } }; static const Fl_Menu_Item quick_change_rtty[] = { { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY }, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY }, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY }, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY }, { "RTTY-100", 0, cb_rtty100, (void *)MODE_RTTY }, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY }, { 0 } }; static const Fl_Menu_Item quick_change_fsq[] = { { "FSQ1.5", 0, cb_fsq1p5, (void *)MODE_FSQ }, { "FSQ2", 0, cb_fsq2, (void *)MODE_FSQ }, { "FSQ3", 0, cb_fsq3, (void *)MODE_FSQ }, { "FSQ4.5", 0, cb_fsq4p5, (void *)MODE_FSQ }, { "FSQ6", 0, cb_fsq6, (void *)MODE_FSQ }, { 0 } }; static const Fl_Menu_Item quick_change_ifkp[] = { { "IFKP 0.5", 0, cb_ifkp0p5a, (void *)MODE_IFKP }, { "IFKP 1.0", 0, cb_ifkp1p0a, (void *)MODE_IFKP }, { "IFKP 2.0", 0, cb_ifkp2p0a, (void *)MODE_IFKP }, { 0} }; //Fl_Menu_Item quick_change_pkt[] = { // { " 300 baud", 0, cb_pkt300, (void *)MODE_PACKET }, // { "1200 baud", 0, cb_pkt1200, (void *)MODE_PACKET }, // { "2400 baud", 0, cb_pkt2400, (void *)MODE_PACKET }, // { 0 } //}; inline int minmax(int val, int min, int max) { val = val < max ? val : max; return val > min ? val : min; } // Olivia void set_olivia_default_integ() { if (!progdefaults.olivia_reset_fec) return; int tones = progdefaults.oliviatones; int bw = progdefaults.oliviabw; if (tones < 1) tones = 1; int depth = minmax( (8 * (1 << bw)) / (1 << tones), 4, 4 * (1 << bw)); progdefaults.oliviasinteg = depth; cntOlivia_sinteg->value(depth); } void set_olivia_tab_widgets() { i_listbox_olivia_bandwidth->index(progdefaults.oliviabw); i_listbox_olivia_tones->index(progdefaults.oliviatones); set_olivia_default_integ(); } void cb_oliviaCustom(Fl_Widget *w, void *arg) { modem_config_tab = tabOlivia; tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); dlgConfig->show(); cb_init_mode(w, arg); } // Contestia void set_contestia_default_integ() { if (!progdefaults.contestia_reset_fec) return; int tones = progdefaults.contestiatones; int bw = progdefaults.contestiabw; if (tones < 1) tones = 1; int depth = minmax( (8 * (1 << bw)) / (1 << tones), 4, 4 * (1 << bw)); progdefaults.contestiasinteg = depth; cntContestia_sinteg->value(depth); } void set_contestia_tab_widgets() { i_listbox_contestia_bandwidth->index(progdefaults.contestiabw); i_listbox_contestia_tones->index(progdefaults.contestiatones); set_contestia_default_integ(); } void cb_contestiaCustom(Fl_Widget *w, void *arg) { modem_config_tab = tabContestia; tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); dlgConfig->show(); cb_init_mode(w, arg); } // rtty void set_rtty_tab_widgets() { selShift->index(progdefaults.rtty_shift); selCustomShift->deactivate(); selBits->index(progdefaults.rtty_bits); selBaud->index(progdefaults.rtty_baud); selParity->index(progdefaults.rtty_parity); selStopBits->index(progdefaults.rtty_stop); } void enable_rtty_quickchange() { if (active_modem->get_mode() == MODE_RTTY) quick_change = quick_change_rtty; } void disable_rtty_quickchange() { if (active_modem->get_mode() == MODE_RTTY) quick_change = 0; } void cb_rtty45(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 1; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty50(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 2; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty75N(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty75W(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 9; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty100(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rttyCustom(Fl_Widget *w, void *arg) { modem_config_tab = tabRTTY; tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); dlgConfig->show(); cb_init_mode(w, arg); } void set_fsq_tab_widgets() { btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); if (progdefaults.fsqbaud == 1.5) btn_fsqbaud[0]->value(1); else if (progdefaults.fsqbaud == 2.0) btn_fsqbaud[1]->value(1); else if (progdefaults.fsqbaud == 3.0) btn_fsqbaud[2]->value(1); else if (progdefaults.fsqbaud == 4.5) btn_fsqbaud[3]->value(1); else btn_fsqbaud[4]->value(1); } void cb_fsq1p5(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 1.5; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq2(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 2.0; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq3(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 3.0; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq4p5(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 4.5; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq6(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 6.0; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void set_ifkp_tab_widgets() { btn_ifkpbaud[0]->value(0); btn_ifkpbaud[1]->value(0); btn_ifkpbaud[2]->value(0); if (progdefaults.ifkp_baud == 0) { btn_ifkpbaud[0]->value(1); put_MODEstatus("IFKP 0.5"); } else if (progdefaults.ifkp_baud == 1) { btn_ifkpbaud[1]->value(1); put_MODEstatus("IFKP 1.0"); } else { btn_ifkpbaud[2]->value(1); put_MODEstatus("IFKP 2.0"); } } void cb_ifkp0p5 (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 0; set_ifkp_tab_widgets(); cb_init_mode(w, arg); } void cb_ifkp0p5a (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 0; set_ifkp_tab_widgets(); } void cb_ifkp1p0 (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 1; set_ifkp_tab_widgets(); cb_init_mode(w, arg); } void cb_ifkp1p0a (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 1; set_ifkp_tab_widgets(); } void cb_ifkp2p0 (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 2; set_ifkp_tab_widgets(); cb_init_mode(w, arg); } void cb_ifkp2p0a (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 2; set_ifkp_tab_widgets(); } void set_dominoex_tab_widgets() { chkDominoEX_FEC->value(progdefaults.DOMINOEX_FEC); } //void cb_pkt1200(Fl_Widget *w, void *arg) //{ // progdefaults.PKT_BAUD_SELECT = 0; // selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT); // cb_init_mode(w, arg); //} //void cb_pkt300(Fl_Widget *w, void *arg) //{ // progdefaults.PKT_BAUD_SELECT = 1; // selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT); // cb_init_mode(w, arg); //} //void cb_pkt2400(Fl_Widget *w, void *arg) //{ // progdefaults.PKT_BAUD_SELECT = 2; // selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT); // cb_init_mode(w, arg); //} void set_mode_controls(trx_mode id) { if (id == MODE_CW) { cntCW_WPM->show(); btnCW_Default->show(); Status1->hide(); if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_cwsquelch); mvsquelch->range(0, 40.0); mvsquelch->redraw(); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_cwsquelch); sldrViewerSquelch->range(0, 40.0); sldrViewerSquelch->redraw(); } } else { cntCW_WPM->hide(); btnCW_Default->hide(); Status1->show(); } if (id == MODE_RTTY) { if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_rttysquelch); mvsquelch->range(-6.0, 34.0); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_rttysquelch); sldrViewerSquelch->range(-12.0, 6.0); } } if (id >= MODE_PSK_FIRST && id <= MODE_PSK_LAST) { if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_psksquelch); mvsquelch->range(-3.0, 6.0); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); sldrViewerSquelch->range(-3.0, 6.0); } } if (!bWF_only) { if (id >= MODE_WEFAX_FIRST && id <= MODE_WEFAX_LAST) { text_group->hide(); fsq_group->hide(); ifkp_group->hide(); wefax_group->show(); center_group->redraw(); } else if (id == MODE_FSQ) { text_group->hide(); wefax_group->hide(); ifkp_group->hide(); fsq_group->show(); center_group->redraw(); } else if (id == MODE_IFKP) { text_group->hide(); wefax_group->hide(); fsq_group->hide(); ifkp_group->show(); center_group->redraw(); } else { text_group->show(); wefax_group->hide(); fsq_group->hide(); ifkp_group->hide(); if (id >= MODE_HELL_FIRST && id <= MODE_HELL_LAST) { ReceiveText->hide(); FHdisp->show(); } else { FHdisp->hide(); ReceiveText->show(); } center_group->redraw(); } ifkp_avatar->hide(); thor_avatar->hide(); string call = inpCall->value(); if (id == MODE_IFKP) { NFtabs->resize( NFtabs->x(), NFtabs->y(), fl_digi_main->w() - NFtabs->x() - 59 - pad, NFtabs->h()); ifkp_avatar->resize(fl_digi_main->w() - 59 - pad, NFtabs->y(), 59, 74); ifkp_avatar->show(); if (!call.empty()) ifkp_load_avatar(inpCall->value()); else ifkp_load_avatar(); } else if ( ((id >= MODE_THOR11) && (id <= MODE_THOR22))) { NFtabs->resize( NFtabs->x(), NFtabs->y(), fl_digi_main->w() - NFtabs->x() - 59 - pad, NFtabs->h()); thor_avatar->resize(fl_digi_main->w() - 59 - pad, NFtabs->y(), 59, 74); thor_avatar->show(); if (!call.empty()) thor_load_avatar(inpCall->value()); else thor_load_avatar(); } else { NFtabs->resize( NFtabs->x(), NFtabs->y(), fl_digi_main->w() - NFtabs->x() - 2*pad, NFtabs->h()); } ifkp_avatar->redraw(); thor_avatar->redraw(); NFtabs->init_sizes(); NFtabs->redraw(); } } void startup_modem(modem* m, int f) { trx_start_modem(m, f); #if BENCHMARK_MODE return; #endif restoreFocus(1); trx_mode id = m->get_mode(); set_mode_controls(id); if (id >= MODE_PSK_FIRST && id <= MODE_PSK_LAST) { m->set_sigsearch(SIGSEARCH); } if (m->get_cap() & modem::CAP_AFC) { btnAFC->value(progStatus.afconoff); btnAFC->activate(); } else { btnAFC->value(0); btnAFC->deactivate(); } if (m->get_cap() & modem::CAP_REV) { wf->btnRev->value(wf->Reverse()); wf->btnRev->activate(); } else { wf->btnRev->value(0); wf->btnRev->deactivate(); } } void cb_mnuOpenMacro(Fl_Menu_*, void*) { if (macros.changed) { switch (fl_choice2(_("Save changed macros?"), _("Cancel"), _("Save"), _("Don't save"))) { case 0: return; case 1: macros.saveMacroFile(); // fall through case 2: break; } } macros.openMacroFile(); macros.changed = false; restoreFocus(2); } void cb_mnuSaveMacro(Fl_Menu_*, void*) { macros.saveMacroFile(); restoreFocus(3); } void remove_windows() { if (scopeview) { LOG_INFO("Deleting %s", "scopeview"); scopeview->hide(); delete scopeview; } if (dlgViewer) { LOG_INFO("Deleting %s", "dlgViewer"); dlgViewer->hide(); delete dlgViewer; } if (dlgLogbook) { LOG_INFO("Deleting %s", "dlgLogbook"); dlgLogbook->hide(); delete dlgLogbook; } if (lotw_review_dialog) { LOG_INFO("Deleting %s", "lotw_review_dialog"); lotw_review_dialog->hide(); delete lotw_review_dialog; } if (dlgConfig) { LOG_INFO("Deleting %s", "dlgConfig"); dlgConfig->hide(); delete cboHamlibRig; delete dlgConfig; } if (font_browser) { LOG_INFO("Deleting %s", "font-browser"); font_browser->hide(); delete font_browser; } if (notify_window) { LOG_INFO("Deleting %s", "notify_window"); notify_window->hide(); delete notify_window; } if (dxcc_window) { LOG_INFO("Deleting %s", "dxcc_window"); dxcc_window->hide(); delete dxcc_window; } if (picRxWin) { LOG_INFO("Deleting %s", "picRxWin"); picRxWin->hide(); delete picRxWin; } if (picTxWin) { LOG_INFO("Deleting %s", "picTxWin"); picTxWin->hide(); delete picTxWin; } if (fsqpicRxWin){ LOG_INFO("Deleting %s", "fsqpicRxWin"); fsqpicRxWin->hide(); delete fsqpicRxWin; } if (fsqpicTxWin){ LOG_INFO("Deleting %s", "fsqpicTxWin"); fsqpicTxWin->hide(); delete fsqpicTxWin; } if (ifkppicRxWin){ LOG_INFO("Deleting %s", "ifppicRxWin"); ifkppicRxWin->hide(); delete ifkppicRxWin; } if (ifkppicTxWin){ LOG_INFO("Deleting %s", "ifppicTxWin"); ifkppicTxWin->hide(); delete ifkppicTxWin; } if (thorpicRxWin){ LOG_INFO("Deleting %s", "thorpicRxWin"); thorpicRxWin->hide(); delete thorpicRxWin; } if (thorpicTxWin){ LOG_INFO("Deleting %s", "thorpicTxWin"); thorpicTxWin->hide(); delete thorpicTxWin; } if (wefax_pic_rx_win) { LOG_INFO("Deleting %s", "wefax_pic_rxin"); wefax_pic_rx_win->hide(); delete wefax_pic_rx_win; } if (wefax_pic_tx_win) { LOG_INFO("Deleting %s", "wefax_pic_txin"); wefax_pic_tx_win->hide(); delete wefax_pic_tx_win; } if (wExport) { LOG_INFO("Deleting %s", "wExport"); wExport->hide(); delete wExport; } if (wCabrillo) { LOG_INFO("Deleting %s", "wCabrillo"); wCabrillo->hide(); delete wCabrillo; } if (MacroEditDialog) { LOG_INFO("Deleting %s", "MacroEditDialog"); MacroEditDialog->hide(); delete MacroEditDialog; } LOG_INFO("Deleting %s", "fsqMonitor"); if (fsqMonitor) { fsqMonitor->hide(); delete fsqMonitor; } if (dxcluster_viewer) { LOG_INFO("Deleting %s", "dxcluster_viewer"); dxcluster_viewer->hide(); delete dxcluster_viewer; } if (test_signal_window) { LOG_INFO("Deleting %s", "test signal window"); test_signal_window->hide(); delete test_signal_window; } // if (fsqDebug) { // fsqDebug->hide(); // delete fsqDebug; // } LOG_ERROR("stopping debug session\n"); debug::stop(); } // callback executed from Escape / Window decoration 'X' or OS X cmd-Q void cb_wMain(Fl_Widget*, void*) { if (!clean_exit(true)) return; remove_windows(); fl_digi_main->hide(); } // callback executed from menu item File/Exit void cb_E(Fl_Menu_*, void*) { if (!clean_exit(true)) return; remove_windows(); // this will make Fl::run return fl_digi_main->hide(); } static int squelch_val; void rsid_squelch_timer(void*) { progStatus.sqlonoff = squelch_val; if (progStatus.sqlonoff) btnSQL->value(1); } void init_modem_squelch(trx_mode mode, int freq) { squelch_val = progStatus.sqlonoff; progStatus.sqlonoff = 0; btnSQL->value(0); Fl::add_timeout(progdefaults.rsid_squelch, rsid_squelch_timer); init_modem(mode, freq); } extern bool valid_kiss_modem(std::string modem_name); void init_modem(trx_mode mode, int freq) { ENSURE_THREAD(FLMAIN_TID); if (bWF_only) if (mode == MODE_FSQ || mode == MODE_IFKP || mode == MODE_FELDHELL || mode == MODE_SLOWHELL || mode == MODE_HELLX5 || mode == MODE_HELLX9 || mode == MODE_FSKHELL || mode == MODE_FSKH105 || mode == MODE_HELL80 || mode == MODE_WEFAX_576 || mode == MODE_WEFAX_288 || mode == MODE_NAVTEX || mode == MODE_SITORB ) mode = MODE_PSK31; stopMacroTimer(); if (data_io_enabled == KISS_IO) { trx_mode current_mode = active_modem->get_mode(); if(!bcast_rsid_kiss_frame(freq, mode, (int) active_modem->get_txfreq(), current_mode, progdefaults.rsid_notify_only ? RSID_KISS_NOTIFY : RSID_KISS_ACTIVE)) { LOG_INFO("Invaild Modem for KISS I/O (%s)", mode_info[mode].sname); int _yes = false; if(!progdefaults.kiss_io_modem_change_inhibit) _yes = fl_choice2(_("Switch to ARQ I/O"), _("No"), _("Yes"), NULL); if(_yes) { enable_arq(); } else { std::string modem_name; modem_name.assign(mode_info[current_mode].sname); bool valid = valid_kiss_modem(modem_name); if(!valid) current_mode = MODE_PSK250; mode = current_mode; } } } //LOG_INFO("mode: %d, freq: %d", (int)mode, freq); #if !BENCHMARK_MODE quick_change = 0; modem_config_tab = tabsModems->child(0); #endif switch (mode) { case MODE_NEXT: if ((mode = active_modem->get_mode() + 1) == NUM_MODES) mode = 0; return init_modem(mode, freq); case MODE_PREV: if ((mode = active_modem->get_mode() - 1) < 0) mode = NUM_MODES - 1; return init_modem(mode, freq); case MODE_NULL: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new NULLMODEM, freq); break; case MODE_CW: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new cw, freq); modem_config_tab = tabCW; break; case MODE_THORMICRO: case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: case MODE_THOR25x4: case MODE_THOR50x1: case MODE_THOR50x2: case MODE_THOR100: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new thor(mode), freq); quick_change = quick_change_thor; modem_config_tab = tabTHOR; break; case MODE_DOMINOEXMICRO: case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: case MODE_DOMINOEX44: case MODE_DOMINOEX88: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new dominoex(mode), freq); quick_change = quick_change_domino; modem_config_tab = tabDomEX; break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new feld(mode), freq); quick_change = quick_change_feld; modem_config_tab = tabFeld; break; case MODE_MFSK4: case MODE_MFSK11: case MODE_MFSK22: case MODE_MFSK31: case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: case MODE_MFSK128: case MODE_MFSK64L: case MODE_MFSK128L: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new mfsk(mode), freq); quick_change = quick_change_mfsk; break; case MODE_WEFAX_576: case MODE_WEFAX_288: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new wefax(mode), freq); quick_change = quick_change_wefax; modem_config_tab = tabWefax; break; case MODE_NAVTEX: case MODE_SITORB: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new navtex(mode), freq); quick_change = quick_change_navtex; modem_config_tab = tabNavtex; break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new mt63(mode), freq); quick_change = quick_change_mt63; modem_config_tab = tabMT63; break; case MODE_PSK31: case MODE_PSK63: case MODE_PSK63F: case MODE_PSK125: case MODE_PSK250: case MODE_PSK500: case MODE_PSK1000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk; modem_config_tab = tabPSK; break; case MODE_QPSK31: case MODE_QPSK63: case MODE_QPSK125: case MODE_QPSK250: case MODE_QPSK500: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_qpsk; modem_config_tab = tabPSK; break; case MODE_8PSK125: case MODE_8PSK250: case MODE_8PSK500: case MODE_8PSK1000: case MODE_8PSK125FL: case MODE_8PSK125F: case MODE_8PSK250FL: case MODE_8PSK250F: case MODE_8PSK500F: case MODE_8PSK1000F: case MODE_8PSK1200F: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_8psk; modem_config_tab = tabPSK; break; case MODE_PSK125R: case MODE_PSK250R: case MODE_PSK500R: case MODE_PSK1000R: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_pskr; modem_config_tab = tabPSK; break; case MODE_12X_PSK125 : case MODE_6X_PSK250 : case MODE_2X_PSK500 : case MODE_4X_PSK500 : case MODE_2X_PSK800 : case MODE_2X_PSK1000 : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk_multi; modem_config_tab = tabPSK; break; case MODE_4X_PSK63R : case MODE_5X_PSK63R : case MODE_10X_PSK63R : case MODE_20X_PSK63R : case MODE_32X_PSK63R : case MODE_4X_PSK125R : case MODE_5X_PSK125R : case MODE_10X_PSK125R : case MODE_12X_PSK125R : case MODE_16X_PSK125R : case MODE_2X_PSK250R : case MODE_3X_PSK250R : case MODE_5X_PSK250R : case MODE_6X_PSK250R : case MODE_7X_PSK250R : case MODE_2X_PSK500R : case MODE_3X_PSK500R : case MODE_4X_PSK500R : case MODE_2X_PSK800R : case MODE_2X_PSK1000R : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk_multiR; modem_config_tab = tabPSK; break; case MODE_OLIVIA: case MODE_OLIVIA_4_125: case MODE_OLIVIA_4_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_4_1000: case MODE_OLIVIA_4_2000: case MODE_OLIVIA_8_125: case MODE_OLIVIA_8_250: case MODE_OLIVIA_8_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_8_2000: case MODE_OLIVIA_16_500: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_16_2000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_32_2000: case MODE_OLIVIA_64_500: case MODE_OLIVIA_64_1000: case MODE_OLIVIA_64_2000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new olivia(mode), freq); modem_config_tab = tabOlivia; quick_change = quick_change_olivia; break; case MODE_CONTESTIA: case MODE_CONTESTIA_4_125: case MODE_CONTESTIA_4_250: case MODE_CONTESTIA_4_500: case MODE_CONTESTIA_4_1000: case MODE_CONTESTIA_4_2000: case MODE_CONTESTIA_8_125: case MODE_CONTESTIA_8_250: case MODE_CONTESTIA_8_500: case MODE_CONTESTIA_8_1000: case MODE_CONTESTIA_8_2000: case MODE_CONTESTIA_16_500: case MODE_CONTESTIA_16_1000: case MODE_CONTESTIA_16_2000: case MODE_CONTESTIA_32_1000: case MODE_CONTESTIA_32_2000: case MODE_CONTESTIA_64_500: case MODE_CONTESTIA_64_1000: case MODE_CONTESTIA_64_2000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new contestia(mode), freq); modem_config_tab = tabContestia; quick_change = quick_change_contestia; break; case MODE_FSQ: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new fsq(mode), freq); modem_config_tab = tabFSQ; quick_change = quick_change_fsq; break; case MODE_IFKP: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new ifkp(mode), freq); modem_config_tab = tabIFKP; quick_change = quick_change_ifkp; break; case MODE_RTTY: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new rtty(mode), freq); modem_config_tab = tabRTTY; if (progStatus.nanoFSK_online || progStatus.Nav_online) quick_change = 0; else quick_change = quick_change_rtty; break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new throb(mode), freq); quick_change = quick_change_throb; break; // case MODE_PACKET: // startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : // *mode_info[mode].modem = new pkt(mode), freq); // modem_config_tab = tabNavtex; // quick_change = quick_change_pkt; // break; case MODE_WWV: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new wwv, freq); break; case MODE_ANALYSIS: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new anal, freq); break; case MODE_SSB: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new ssb, freq); break; default: LOG_ERROR("Unknown mode: %" PRIdPTR, mode); mode = MODE_PSK31; startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk; modem_config_tab = tabPSK; break; } #if BENCHMARK_MODE return; #endif clear_StatusMessages(); progStatus.lastmode = mode; if (wf->xmtlock->value() == 1 && !mailserver) { if(!progdefaults.retain_freq_lock) { wf->xmtlock->value(0); wf->xmtlock->damage(); active_modem->set_freqlock(false); } } // if (FD_logged_on) FD_mode_check(); } void init_modem_sync(trx_mode m, int f) { ENSURE_THREAD(FLMAIN_TID); int count = 2000; if (trx_state != STATE_RX) { LOG_INFO("Waiting for %s", mode_info[active_modem->get_mode()].name); abort_tx(); while (trx_state != STATE_RX && count) { LOG_DEBUG("%0.2f secs remaining", count / 100.0); Fl::awake(); MilliSleep(10); count--; } if (count == 0) { LOG_ERROR("%s", "TIMED OUT!!"); return; // abort modem selection } } init_modem(m, f); count = 500; if (trx_state != STATE_RX) { while (trx_state != STATE_RX && count) { Fl::awake(); MilliSleep(10); count--; } if (count == 0) LOG_ERROR("%s", "Wait for STATE_RX timed out"); } REQ_FLUSH(TRX_TID); } void cb_init_mode(Fl_Widget *, void *mode) { init_modem(reinterpret_cast(mode)); } // character set selection menu void set_charset_listbox(int rxtx_charset) { int tiniconv_id = charset_list[rxtx_charset].tiniconv_id; // order all converters to switch to the new encoding rx_chd.set_input_encoding(tiniconv_id); echo_chd.set_input_encoding(tiniconv_id); tx_encoder.set_output_encoding(tiniconv_id); if (mainViewer) mainViewer->set_input_encoding(tiniconv_id); if (brwsViewer) brwsViewer->set_input_encoding(tiniconv_id); // update the button progdefaults.charset_name = charset_list[rxtx_charset].name; listbox_charset_status->value(progdefaults.charset_name.c_str()); restoreFocus(4); } void cb_listbox_charset(Fl_Widget *w, void *) { Fl_ListBox * lbox = (Fl_ListBox *)w; set_charset_listbox(lbox->index()); } void populate_charset_listbox(void) { for (unsigned int i = 0; i < number_of_charsets; i++) listbox_charset_status->add( charset_list[i].name ); listbox_charset_status->value(progdefaults.charset_name.c_str()); } // find the position of the default charset in charset_list[] and trigger the callback void set_default_charset(void) { for (unsigned int i = 0; i < number_of_charsets; i++) { if (strcmp(charset_list[i].name, progdefaults.charset_name.c_str()) == 0) { set_charset_listbox(i); return; } } } // if w is not NULL, give focus to TransmitText only if the last event was an Enter keypress void restoreFocus(int n) { if (Fl::focus() == NULL) return; if (!active_modem) { TransmitText->take_focus(); return; } if (active_modem->get_mode() == MODE_FSQ && fsq_tx_text) fsq_tx_text->take_focus(); else if (active_modem->get_mode() == MODE_IFKP && ifkp_tx_text) ifkp_tx_text->take_focus(); else if (TransmitText) TransmitText->take_focus(); } void macro_cb(Fl_Widget *w, void *v) { // if (active_modem->get_mode() == MODE_FSQ) // return; int b = (int)(reinterpret_cast (v)); if (b & 0x80) { // 4 bar docked macros b &= 0x7F; } else { if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (b >= NUMMACKEYS) b += (altMacros - 1) * NUMMACKEYS; } else { b += altMacros * NUMMACKEYS; } } int mouse = Fl::event_button(); if (mouse == FL_LEFT_MOUSE && !macros.text[b].empty()) { if (progStatus.timer) return; stopMacroTimer(); macros.execute(b); } else if (mouse == FL_RIGHT_MOUSE) editMacro(b); if (Fl::focus() != qsoFreqDisp) restoreFocus(5); } void colorize_48macros(int i) { if (progdefaults.useGroupColors == true) { int k = i / 4; if (k == 0 || k == 3 || k == 6 || k == 9) btnDockMacro[i]->color(fl_rgb_color( progdefaults.btnGroup1.R, progdefaults.btnGroup1.G, progdefaults.btnGroup1.B)); else if (k == 1 || k == 4 || k == 7 || k == 10) btnDockMacro[i]->color(fl_rgb_color( progdefaults.btnGroup2.R, progdefaults.btnGroup2.G, progdefaults.btnGroup2.B)); else btnDockMacro[i]->color(fl_rgb_color( progdefaults.btnGroup3.R, progdefaults.btnGroup3.G, progdefaults.btnGroup3.B)); btnDockMacro[i]->labelcolor( fl_rgb_color( progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.G, progdefaults.btnFkeyTextColor.B )); btnDockMacro[i]->labelcolor(progdefaults.MacroBtnFontcolor); btnDockMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnDockMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } else { btnDockMacro[i]->color(FL_BACKGROUND_COLOR); btnDockMacro[i]->labelcolor(FL_FOREGROUND_COLOR); btnDockMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnDockMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } } void colorize_macro(int i) { int j = i % NUMMACKEYS; if (progdefaults.useGroupColors == true) { if (j < 4) { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup1.R, progdefaults.btnGroup1.G, progdefaults.btnGroup1.B)); } else if (j < 8) { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup2.R, progdefaults.btnGroup2.G, progdefaults.btnGroup2.B)); } else { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup3.R, progdefaults.btnGroup3.G, progdefaults.btnGroup3.B)); } btnMacro[i]->labelcolor( fl_rgb_color( progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.G, progdefaults.btnFkeyTextColor.B )); btnMacro[i]->labelcolor(progdefaults.MacroBtnFontcolor); btnMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } else { btnMacro[i]->color(FL_BACKGROUND_COLOR); btnMacro[i]->labelcolor(FL_FOREGROUND_COLOR); btnMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } btnMacro[i]->redraw_label(); } void colorize_macros() { FL_LOCK_D(); for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) colorize_macro(i); for (int i = 0; i < 48; i++) colorize_48macros(i); btnAltMacros1->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros1->redraw_label(); btnAltMacros2->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros2->redraw_label(); FL_UNLOCK_D(); } void altmacro_cb(Fl_Widget *w, void *v) { static char alt_text[2] = "1"; intptr_t arg = reinterpret_cast(v); if (arg) altMacros += arg; else altMacros = altMacros + (Fl::event_button() == FL_RIGHT_MOUSE ? -1 : 1); if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { // alternate set altMacros = WCLAMP(altMacros, 1, 3); alt_text[0] = '1' + altMacros; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i + NUMMACKEYS]->label(macros.name[i + (altMacros * NUMMACKEYS)].c_str()); btnMacro[i + NUMMACKEYS]->redraw_label(); } btnAltMacros2->label(alt_text); btnAltMacros2->redraw_label(); } else { // primary set altMacros = WCLAMP(altMacros, 0, 3); alt_text[0] = '1' + altMacros; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i + (altMacros * NUMMACKEYS)].c_str()); btnMacro[i]->redraw_label(); } btnAltMacros1->label(alt_text); btnAltMacros1->redraw_label(); } restoreFocus(6); } void cb_mnuConfigOperator(Fl_Menu_*, void*) { tabsConfigure->value(tabOperator); dlgConfig->show(); } void cb_mnuConfigWaterfall(Fl_Menu_*, void*) { tabsConfigure->value(tabWaterfall); dlgConfig->show(); } void cb_mnuConfigID(Fl_Menu_*, void*) { tabsConfigure->value(tabID); dlgConfig->show(); } void cb_mnuConfigQRZ(Fl_Menu_*, void*) { tabsConfigure->value(tabQRZ); dlgConfig->show(); } void cb_mnuConfigCPU_speed(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabCPUspeed); dlgConfig->show(); } void cb_mnuConfigNBEMS(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabNBEMS); dlgConfig->show(); } void cb_mnuConfigPSKmail(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabPskmail); dlgConfig->show(); } void cb_mnuConfigPSKreporter(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabSpot); dlgConfig->show(); } void cb_mnuConfigSweetspot(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabSweetSpot); dlgConfig->show(); } void cb_mnuConfigTextIO(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabText_IO); dlgConfig->show(); } void cb_mnuConfigDTMF(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabDTMF); dlgConfig->show(); } void cb_mnuConfigWX(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabWX); dlgConfig->show(); } void cb_mnuConfigKML(Fl_Menu_*, void*) { tabsConfigure->value(tabMisc); tabsMisc->value(tabKML); dlgConfig->show(); } void cb_mnuConfigAutostart(Fl_Menu_*, void*) { tabsConfigure->value(tabAutoStart); dlgConfig->show(); } void cb_mnuConfigIO(Fl_Menu_*, void*) { tabsConfigure->value(tabIO); dlgConfig->show(); } void cb_mnuConfigPSM(Fl_Menu_*, void*) { tabsConfigure->value(tabKPSM); dlgConfig->show(); } void cb_mnuConfigNotify(Fl_Menu_*, void*) { notify_show(); } void cb_mnuTestSignals(Fl_Menu_*, void*) { show_testdialog(); } void cb_mnuUI(Fl_Menu_*, void *) { tabsConfigure->value(tabUI); dlgConfig->show(); } void cb_mnuConfigContest(Fl_Menu_*, void*) { tabsConfigure->value(tabUI); tabsUI->value(tabLogContests); dlgConfig->show(); } void cb_mnuConfigRigCtrl(Fl_Menu_*, void*) { tabsConfigure->value(tabRig); dlgConfig->show(); } void cb_mnuConfigSoundCard(Fl_Menu_*, void*) { tabsConfigure->value(tabSoundCard); dlgConfig->show(); } void cb_mnuConfigModems(Fl_Menu_*, void*) { switch (active_modem->get_mode()) { case MODE_CW: modem_config_tab = tabCW; break; case MODE_THORMICRO: case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: case MODE_THOR25x4: case MODE_THOR50x1: case MODE_THOR50x2: case MODE_THOR100: modem_config_tab = tabTHOR; break; case MODE_DOMINOEXMICRO: case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: case MODE_DOMINOEX44: case MODE_DOMINOEX88: modem_config_tab = tabDomEX; break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: case MODE_FSKHELL: case MODE_FSKH105:case MODE_HELL80: modem_config_tab = tabFeld; break; case MODE_WEFAX_576: case MODE_WEFAX_288: modem_config_tab = tabWefax; break; case MODE_NAVTEX: case MODE_SITORB: modem_config_tab = tabNavtex; break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : quick_change = quick_change_mt63; modem_config_tab = tabMT63; break; case MODE_OLIVIA: case MODE_OLIVIA_4_125: case MODE_OLIVIA_4_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_4_1000: case MODE_OLIVIA_4_2000: case MODE_OLIVIA_8_125: case MODE_OLIVIA_8_250: case MODE_OLIVIA_8_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_8_2000: case MODE_OLIVIA_16_500: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_16_2000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_32_2000: case MODE_OLIVIA_64_500: case MODE_OLIVIA_64_1000: case MODE_OLIVIA_64_2000: modem_config_tab = tabOlivia; break; case MODE_CONTESTIA: case MODE_CONTESTIA_4_125: case MODE_CONTESTIA_4_250: case MODE_CONTESTIA_4_500: case MODE_CONTESTIA_4_1000: case MODE_CONTESTIA_4_2000: case MODE_CONTESTIA_8_125: case MODE_CONTESTIA_8_250: case MODE_CONTESTIA_8_500: case MODE_CONTESTIA_8_1000: case MODE_CONTESTIA_8_2000: case MODE_CONTESTIA_16_500: case MODE_CONTESTIA_16_1000: case MODE_CONTESTIA_16_2000: case MODE_CONTESTIA_32_1000: case MODE_CONTESTIA_32_2000: case MODE_CONTESTIA_64_500: case MODE_CONTESTIA_64_1000: case MODE_CONTESTIA_64_2000: modem_config_tab = tabContestia; break; case MODE_FSQ: modem_config_tab = tabFSQ; break; case MODE_IFKP: modem_config_tab = tabIFKP; break; case MODE_RTTY: modem_config_tab = tabRTTY; break; default: // case MODE_PSK31: case MODE_PSK63: case MODE_PSK63F: // case MODE_PSK125: case MODE_PSK250: case MODE_PSK500: // case MODE_PSK1000: // case MODE_QPSK31: case MODE_QPSK63: case MODE_QPSK125: case MODE_QPSK250: // case MODE_QPSK500: // case MODE_8PSK125: case MODE_8PSK250: case MODE_8PSK500: case MODE_8PSK1000: // case MODE_8PSK125FL: case MODE_8PSK125F: case MODE_8PSK250FL: case MODE_8PSK250F: // case MODE_8PSK500F: case MODE_8PSK1000F: case MODE_8PSK1200F: // case MODE_PSK125R: case MODE_PSK250R: case MODE_PSK500R: case MODE_PSK1000R: // case MODE_12X_PSK125 : case MODE_6X_PSK250 : case MODE_2X_PSK500 : // case MODE_4X_PSK500 : case MODE_2X_PSK800 : case MODE_2X_PSK1000 : // case MODE_4X_PSK63R : case MODE_5X_PSK63R : case MODE_10X_PSK63R : // case MODE_20X_PSK63R : case MODE_32X_PSK63R : // case MODE_4X_PSK125R : case MODE_5X_PSK125R : case MODE_10X_PSK125R : // case MODE_12X_PSK125R : case MODE_16X_PSK125R : // case MODE_2X_PSK250R : case MODE_3X_PSK250R : case MODE_5X_PSK250R : // case MODE_6X_PSK250R : case MODE_7X_PSK250R : // case MODE_2X_PSK500R : case MODE_3X_PSK500R : case MODE_4X_PSK500R : // case MODE_2X_PSK800R : case MODE_2X_PSK1000R : // case MODE_MFSK4: case MODE_MFSK11: case MODE_MFSK22: case MODE_MFSK31: // case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: // case MODE_MFSK128: case MODE_MFSK64L: case MODE_MFSK128L: // case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: // case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: modem_config_tab = tabPSK; break; } tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); dlgConfig->show(); } void cb_mnuConfigWinkeyer(Fl_Menu_*, void*) { tabsConfigure->value(tabModems); tabsModems->value(tabCW); tabsCW->value(tabsCW_winkeyer); dlgConfig->show(); } void cb_mnuConfigWFcontrols(Fl_Menu_ *, void*) { tabsConfigure->value(tabUI); tabsUI->value(tabWF_UI); dlgConfig->show(); } void cb_n3fjp_logs(Fl_Menu_ *, void*) { tabsConfigure->value(tabUI); tabsUI->value(tabLogServer); tabsLog->value(grpN3FJP_logs); dlgConfig->show(); } void cb_maclogger(Fl_Menu_ *, void*) { tabsConfigure->value(tabUI); tabsUI->value(tabLogServer); tabsLog->value(grpMacLogger); dlgConfig->show(); } void cb_mnuConfigLoTW(Fl_Menu_ *, void *) { tabsConfigure->value(tabQRZ); tabsQRZ->value(tabLOTW); dlgConfig->show(); } void cb_logfile(Fl_Widget* w, void*) { progStatus.LOGenabled = reinterpret_cast(w)->mvalue()->value(); if (progStatus.LOGenabled == true) { Date tdy; string lfname = HomeDir; lfname.append("fldigi"); lfname.append(tdy.szDate(2)); lfname.append(".log"); logfile = new cLogfile(lfname); logfile->log_to_file_start(); } else { logfile->log_to_file_stop(); delete logfile; logfile = 0; } } // LOGBOOK server connect void cb_log_server(Fl_Widget* w, void*) { progdefaults.xml_logbook = reinterpret_cast(w)->mvalue()->value(); close_logbook(); connect_to_log_server(); } void cb_fd_viewer(Fl_Widget* w, void*) { if (field_day_viewer->visible()) field_day_viewer->hide(); else field_day_viewer->show(); } void cb_dxc_viewer(Fl_Widget* w, void*) { if (dxcluster_viewer->visible()) dxcluster_viewer->hide(); else dxcluster_viewer->show(); } void set_server_label(bool val) { Fl_Menu_Item *m = getMenuItem(LOG_CONNECT_SERVER); if (val) m->set(); else m->clear(); } static int save_mvx = 0; void cb_view_hide_channels(Fl_Menu_ *w, void *d) { int mvgw = mvgroup->w(); progStatus.show_channels = !(mvgw > mvgroup->x()); if (!progStatus.show_channels) { save_mvx = mvgw; progStatus.tile_x = mvgroup->x(); } else { progStatus.tile_x = save_mvx; } if (progdefaults.rxtx_swap) { progStatus.tile_y = TransmitText->h(); progStatus.tile_y_ratio = 1.0 * TransmitText->h() / text_panel->h(); } else { progStatus.tile_y = ReceiveText->h(); progStatus.tile_y_ratio = 1.0 * ReceiveText->h() / text_panel->h(); } UI_select(); return; } #if USE_SNDFILE static bool capval = false; static bool genval = false; static bool playval = false; void cb_mnuCapture(Fl_Widget *w, void *d) { if (!RXscard) return; Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); //eek if (playval || genval) { m->clear(); return; } capval = m->value(); if(!RXscard->Capture(capval)) { m->clear(); capval = false; } } void cb_mnuGenerate(Fl_Widget *w, void *d) { Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); if (capval || playval) { m->clear(); return; } if (!TXscard) return; genval = m->value(); if (!TXscard->Generate(genval)) { m->clear(); genval = false; } } Fl_Menu_Item *Playback_menu_item = (Fl_Menu_Item *)0; void reset_mnuPlayback() { if (Playback_menu_item == 0) return; Playback_menu_item->clear(); playval = false; } void cb_mnuPlayback(Fl_Widget *w, void *d) { if (!RXscard) return; Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); Playback_menu_item = m; if (capval || genval) { m->clear(); bHighSpeed = false; return; } playval = m->value(); if (!playval) bHighSpeed = false; int err = RXscard->Playback(playval); if(err < 0) { switch (err) { case -1: fl_alert2(_("No file name given")); break; case -2: fl_alert2(_("Unsupported format")); break; case -3: fl_alert2(_("channels != 1")); break; default: fl_alert2(_("unknown wave file error")); } m->clear(); playval = false; bHighSpeed = false; } else if (btnAutoSpot->value()) { put_status(_("Spotting disabled"), 3.0); btnAutoSpot->value(0); btnAutoSpot->do_callback(); } } #endif // USE_SNDFILE void cb_mnuConfigFonts(Fl_Menu_*, void *) { tabsConfigure->value(tabUI); tabsUI->value(tabColorsFonts); dlgConfig->show(); } void cb_mnuSaveConfig(Fl_Menu_ *, void *) { progdefaults.saveDefaults(); restoreFocus(7); } // This function may be called by the QRZ thread void cb_mnuVisitURL(Fl_Widget*, void* arg) { const char* url = reinterpret_cast(arg); #ifndef __WOE32__ const char* browsers[] = { # ifdef __APPLE__ getenv("FLDIGI_BROWSER"), // valid for any OS - set by user "open" // OS X # else "fl-xdg-open", // Puppy Linux "xdg-open", // other Unix-Linux distros getenv("FLDIGI_BROWSER"), // force use of spec'd browser getenv("BROWSER"), // most Linux distributions "sensible-browser", "firefox", "mozilla" // must be something out there! # endif }; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif for (size_t i = 0; i < sizeof(browsers)/sizeof(browsers[0]); i++) if (browsers[i]) execlp(browsers[i], browsers[i], url, (char*)0); exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not run a web browser:\n%s\n\n" "Open this URL manually:\n%s"), strerror(errno), url); } #else // gurgle... gurgle... HOWL // "The return value is cast as an HINSTANCE for backward // compatibility with 16-bit Windows applications. It is // not a true HINSTANCE, however. The only thing that can // be done with the returned HINSTANCE is to cast it to an // int and compare it with the value 32 or one of the error // codes below." (Error codes omitted to preserve sanity). if ((int)ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL) <= 32) fl_alert2(_("Could not open url:\n%s\n"), url); #endif } void open_recv_folder(const char *folder) { cb_mnuVisitURL(0, (void*)folder); } void cb_mnuVisitPSKRep(Fl_Widget*, void*) { cb_mnuVisitURL(0, (void*)string("http://pskreporter.info/pskmap?").append(progdefaults.myCall).c_str()); } void html_help( const string &Html) { if (!help_dialog) help_dialog = new Fl_Help_Dialog; help_dialog->value(Html.c_str()); help_dialog->show(); } void cb_mnuBeginnersURL(Fl_Widget*, void*) { string deffname = HelpDir; deffname.append("beginners.html"); ofstream f(deffname.c_str()); if (!f) return; f << szBeginner; f.close(); #ifndef __WOE32__ cb_mnuVisitURL(NULL, (void *)deffname.insert(0, "file://").c_str()); #else cb_mnuVisitURL(NULL, (void *)deffname.c_str()); #endif } void cb_mnuOnLineDOCS(Fl_Widget *, void *) { string helpfile = HelpDir; helpfile.append("fldigi-help/index.html"); ifstream f(helpfile.c_str()); if (!f) { cb_mnuVisitURL(0, (void *)PACKAGE_DOCS); } else { f.close(); cb_mnuVisitURL(0, (void *)helpfile.c_str()); } } inline int version_check(string v1, string v2) { long v1a, v1b, v1c, v1d = 0; long v2a, v2b, v2c, v2d = 0; size_t p; p = v1.find("."); v1a = atol(v1.substr(0, p).c_str()); v1.erase(0, p+1); p = v1.find("."); v1b = atol(v1.substr(0,p).c_str()); v1.erase(0, p+1); p = v1.find("."); v1c = atol(v1.c_str()); v1.erase(0, p+1); if (!v1.empty()) v1d = atol(v1.c_str()); p = v2.find("."); v2a = atol(v2.substr(0, p).c_str()); v2.erase(0, p+1); p = v2.find("."); v2b = atol(v2.substr(0,p).c_str()); v2.erase(0, p+1); p = v2.find("."); v2c = atol(v2.c_str()); v2.erase(0, p+1); if (!v2.empty()) v2d = atol(v2.c_str()); if (v1a < v2a) return -1; if (v1a > v2a) return 1; if (v1b < v2b) return -1; if (v1b > v2b) return 1; if (v1c < v2c) return -1; if (v1c > v2c) return 1; if (v1d < v2d) return -1; if (v1d > v2d) return 1; return 0; } static notify_dialog *latest_dialog = 0; void cb_mnuCheckUpdate(Fl_Widget *, void *) { const char *url = "http://www.w1hkj.com/files/fldigi/"; string version_str; string reply; put_status(_("Checking for updates...")); // int ret = get_http_gui(url, reply, 20.0); int ret = get_http(url, reply, 5.0); if (!ret) { put_status(_("Update site not available"), 10); return; } size_t p = reply.find("_setup.exe"); size_t p2 = reply.rfind("fldigi", p); p2 += 7; version_str = reply.substr(p2, p - p2); int is_ok = version_check(string(PACKAGE_VERSION), version_str); if (!latest_dialog) latest_dialog = new notify_dialog; if (is_ok == 0) { latest_dialog->notify(_("You are running the latest version"), 5.0); REQ(show_notifier, latest_dialog); } else if (is_ok > 0) { std::string probable; probable.assign(_("You are probably running an alpha version ")); probable.append( PACKAGE_VERSION ).append(_("\nPosted version: ")); probable.append(version_str); latest_dialog->notify(probable.c_str(), 5.0); REQ(show_notifier, latest_dialog); } else fl_message2(_("Version %s is available at Source Forge"), version_str.c_str()); put_status(""); } void cb_mnuAboutURL(Fl_Widget*, void*) { if (!help_dialog) help_dialog = new Fl_Help_Dialog; help_dialog->value(szAbout); help_dialog->resize(help_dialog->x(), help_dialog->y(), help_dialog->w(), 440); help_dialog->show(); } void fldigi_help(const string& theHelp) { string htmlHelp = "" "" "" PACKAGE " Help" "" "" "" "

"; for (size_t i = 0; i < theHelp.length(); i++) { if (theHelp[i] == '\n') { if (theHelp[i+1] == '\n') { htmlHelp += "

"; i++; } else htmlHelp += "
"; } else if (theHelp[i] == ' ' && theHelp[i+1] == ' ') { htmlHelp += "  "; i++; } else htmlHelp += theHelp[i]; } htmlHelp += "

" "" ""; html_help(htmlHelp); } void cb_mnuCmdLineHelp(Fl_Widget*, void*) { extern string option_help; fldigi_help(option_help); restoreFocus(8); } void cb_mnuBuildInfo(Fl_Widget*, void*) { extern string build_text; fldigi_help(build_text); restoreFocus(9); } void cb_mnuDebug(Fl_Widget*, void*) { debug::show(); } #ifndef NDEBUG void cb_mnuFun(Fl_Widget*, void*) { fl_message2(_("Sunspot creation underway!")); } #endif void cb_mnuAudioInfo(Fl_Widget*, void*) { if (progdefaults.btnAudioIOis != SND_IDX_PORT) { fl_alert2(_("Audio device information is only available for the PortAudio backend")); return; } #if USE_PORTAUDIO size_t ndev; string devtext[2], headers[2]; SoundPort::devices_info(devtext[0], devtext[1]); if (devtext[0] != devtext[1]) { headers[0] = _("Capture device"); headers[1] = _("Playback device"); ndev = 2; } else { headers[0] = _("Capture and playback devices"); ndev = 1; } string audio_info; for (size_t i = 0; i < ndev; i++) { audio_info.append("

").append(headers[i]).append("

\n\n"); string::size_type j, n = 0; while ((j = devtext[i].find(": ", n)) != string::npos) { audio_info.append("") .append(""); if ((n = devtext[i].find('\n', j)) == string::npos) { devtext[i] += '\n'; n = devtext[i].length() - 1; } audio_info.append("") .append("\n"); } audio_info.append("
") .append(devtext[i].substr(n, j-n)) .append("") .append(devtext[i].substr(j+2, n-j-2)) .append("

\n"); } fldigi_help(audio_info); #endif } void cb_ShowConfig(Fl_Widget*, void*) { cb_mnuVisitURL(0, (void*)HomeDir.c_str()); } static void cb_ShowDATA(Fl_Widget*, void*) { /// Must be already created by createRecordLoader() dlgRecordLoader->show(); } bool ask_dir_creation( const std::string & dir ) { if ( 0 == directory_is_created(dir.c_str())) { int ans = fl_choice2(_("%s: Do not exist, create?"), _("No"), _("Yes"), 0, dir.c_str() ); if (!ans) return false ; return true ; } return false ; } void cb_ShowNBEMS(Fl_Widget*, void*) { if ( ask_dir_creation(NBEMS_dir)) { check_nbems_dirs(); } cb_mnuVisitURL(0, (void*)NBEMS_dir.c_str()); } void cb_ShowFLMSG(Fl_Widget*, void*) { if ( ask_dir_creation(FLMSG_dir)) { check_nbems_dirs(); } cb_mnuVisitURL(0, (void*)FLMSG_dir.c_str()); } void cbTune(Fl_Widget *w, void *) { Fl_Button *b = (Fl_Button *)w; if (!(active_modem->get_cap() & modem::CAP_TX)) { b->value(0); return; } if (b->value() == 1) { b->labelcolor(FL_RED); trx_tune(); } else { b->labelcolor(FL_FOREGROUND_COLOR); trx_receive(); } restoreFocus(10); } void cb_quick_rsid (Fl_Widget *w, void *) { progdefaults.rsidWideSearch = !progdefaults.rsidWideSearch; if (progdefaults.rsidWideSearch) chkRSidWideSearch->set(); else chkRSidWideSearch->clear(); } static Fl_Menu_Item quick_change_rsid[] = { { "Passband", 0, cb_quick_rsid, 0, FL_MENU_TOGGLE }, {0,0,0,0,0,0,0,0,0} }; void cbRSID(Fl_Widget *w, void *) { if (Fl::focus() != btnRSID) { progdefaults.rsid = btnRSID->value(); btnRSID->redraw(); return; } switch (Fl::event_button()) { case FL_LEFT_MOUSE: progdefaults.rsid = btnRSID->value(); progdefaults.changed = true; break; case FL_RIGHT_MOUSE: { btnRSID->value(progdefaults.rsid); btnRSID->redraw(); if (progdefaults.rsidWideSearch) quick_change_rsid[0].set(); else quick_change_rsid[0].clear(); const Fl_Menu_Item *m = quick_change_rsid->popup( btnRSID->x(), btnRSID->y() + btnRSID->h()); if (m && m->callback()) m->do_callback(0); break; } default: break; } Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw(); restoreFocus(11); } void cbTxRSID(Fl_Widget *w, void*) { progdefaults.TransmitRSid = btnTxRSID->value(); if (Fl::focus() != btnTxRSID) { btnTxRSID->redraw(); return; } progdefaults.changed = true; restoreFocus(12); } void cbAutoSpot(Fl_Widget* w, void*) { progStatus.spot_recv = static_cast(w)->value(); } void toggleRSID() { progdefaults.rsid = !progdefaults.rsid; cbRSID(NULL, NULL); } void cb_mnuDigiscope(Fl_Menu_ *w, void *d) { if (scopeview) scopeview->show(); } void cb_mnuViewer(Fl_Menu_ *, void *) { openViewer(); } void cb_mnuSpectrum (Fl_Menu_ *, void *) { open_spectrum_viewer(); } void cb_mnuShowCountries(Fl_Menu_ *, void *) { notify_dxcc_show(); } void set_macroLabels() { if (bWF_only) return; if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { altMacros = 1; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i].c_str()); btnMacro[i]->redraw_label(); btnMacro[NUMMACKEYS + i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[NUMMACKEYS + i]->redraw_label(); } btnAltMacros1->label("1"); btnAltMacros1->redraw_label(); btnAltMacros2->label("2"); btnAltMacros2->redraw_label(); } else { altMacros = 0; btnAltMacros1->label("1"); btnAltMacros1->redraw_label(); for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i].c_str()); btnMacro[i]->redraw_label(); } } for (int i = 0; i < 48; i++) { btnDockMacro[i]->label(macros.name[i].c_str()); btnDockMacro[i]->redraw_label(); } } void cb_mnuPicViewer(Fl_Menu_ *, void *) { if (picRxWin) { picRx->redraw(); picRxWin->show(); } } void cb_mnuThorViewRaw(Fl_Menu_ *, void *) { thor_load_raw_video(); } void cb_mnuIfkpViewRaw(Fl_Menu_ *, void *) { ifkp_load_raw_video(); } void cb_sldrSquelch(Fl_Slider* o, void*) { if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { progStatus.sldrPwrSquelchValue = o->value(); } else { progStatus.sldrSquelchValue = o->value(); } restoreFocus(13); } bool oktoclear = true; void updateOutSerNo() { Fl_Input2* outsn[] = { outSQSO_serno1, outSQSO_serno2, outSerNo1, outSerNo2, outSerNo3, outSerNo4, outSerNo5, outSerNo6, outSerNo7, outSerNo8, out_IARI_SerNo1, out_IARI_SerNo2, // outSerNo_WAE1, outSerNo_WAE2, outSerNo_WPX1, outSerNo_WPX2 }; size_t num_fields = sizeof(outsn)/sizeof(*outsn); for (size_t i = 0; i < num_fields; i++) { outsn[i]->value(""); outsn[i]->redraw(); } int nr = contest_count.count; if (!n3fjp_serno.empty()) { sscanf(n3fjp_serno.c_str(), "%d", &nr); } char szcnt[10] = ""; contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(szcnt, sizeof(szcnt), contest_count.fmt.c_str(), nr); for (size_t i = 0; i < num_fields; i++) { outsn[i]->value(szcnt); outsn[i]->redraw(); } } static string old_call; static string new_call; void set599() { if (bWF_only) return; Fl_Input2* rstin[] = { inpRstIn1, inpRstIn2, inpRstIn3, inpRstIn4, inpRstIn_AICW2, inpRstIn_SQSO2, inp_IARI_RSTin2, // inpRstIn_WAE2, inpRstIn_WPX2}; Fl_Input2* rstout[] = { inpRstOut1, inpRstOut2, inpRstOut3, inpRstOut4, inpRstIn_AICW2, inpRstOut_SQSO2, inp_IARI_RSTout2, // inpRstOut_WAE2, inpRstOut_WPX2}; if (!active_modem) return; string defrst = (active_modem->get_mode() == MODE_SSB) ? "59" : "599"; if (progdefaults.RSTin_default) { size_t num_fields = sizeof(rstin)/sizeof(*rstin); for (size_t i = 0; i < num_fields; i++) rstin[i]->value(defrst.c_str()); } if (progdefaults.RSTdefault) { size_t num_fields = sizeof(rstout)/sizeof(*rstout); for (size_t i = 0; i < num_fields; i++) rstout[i]->value(defrst.c_str()); } if (progdefaults.logging > 0 && progdefaults.fixed599) { size_t num_fields = sizeof(rstout)/sizeof(*rstout); for (size_t i = 0; i < num_fields; i++) rstout[i]->value(defrst.c_str()); } } void init_country_fields() { Fl_ComboBox *country_fields[] = { cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2//, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->add(cbolist.c_str()); } cboCountyQSO->add(counties().c_str()); } void set_log_colors() { Fl_Input2* qso_fields[] = { inpCall1, inpCall2, inpCall3, inpCall4, inpName1, inpName2, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc1, inpAZ, inpVEprov, inpState1, inpSerNo1, inpSerNo2, inpSerNo3, inpSerNo4, outSerNo1, outSerNo2, outSerNo3, outSerNo4, outSerNo5, outSerNo6, outSerNo7, outSerNo8, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_section1, inp_FD_class2, inp_FD_section2, inp_KD_name2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inp_CQ_RSTin2, inp_CQDX_RSTin2, inp_CQ_RSTout2, inp_CQDX_RSTout2, inp_CQstate1, inp_CQstate2, inp_CQzone1, inp_CQzone2, inp_CQDXzone1, inp_CQDXzone2, inp_1010_XchgIn1, inp_1010_XchgIn2, inp_1010_name2, inp_1010_nr1, inp_1010_nr2, inp_ARR_Name2, inp_ARR_XchgIn1, inp_ARR_XchgIn2, inp_ARR_check1, inp_ARR_check2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inp_vhf_Loc1, inp_vhf_Loc2, inp_vhf_RSTin1, inp_vhf_RSTin2, inp_vhf_RSTout1, inp_vhf_RSTout2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpNAQPname2, inp_name_NAS2, inp_ser_NAS1, inpSPCnum_NAS1, inp_ser_NAS2, inpSPCnum_NAS2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_RSTin2, inpRTU_RSTout2, inpRTU_serno1, inpRTU_serno2, inp_IARI_PR1, inp_IARI_PR2, inp_IARI_RSTin2, inp_IARI_RSTout2, out_IARI_SerNo1, inp_IARI_SerNo1, out_IARI_SerNo2, inp_IARI_SerNo2, inpRstIn3, inpRstOut3, inpRstIn4, inpRstOut4, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_troop1, inp_JOTA_troop2, inp_JOTA_spc1, inp_JOTA_spc2, inpRstIn_AICW2, inpRstOut_AICW2, inpSPCnum_AICW1, inpSPCnum_AICW2, inpSQSO_state1, inpSQSO_state2, inpSQSO_county1, inpSQSO_county2, inpSQSO_serno1, inpSQSO_serno2, outSQSO_serno1, outSQSO_serno2, inpRstIn_SQSO2, inpRstOut_SQSO2, inpSQSO_name2, inpSQSO_category1, inpSQSO_category2, inpSerNo_WPX1, inpSerNo_WPX2, inpRstIn_WPX2, inpRstOut_WPX2, outSerNo_WPX1, outSerNo_WPX2, inpSerNo_WAE1, inpSerNo_WAE2, outSerNo_WAE1, outSerNo_WAE2, inpRstIn_WAE2, inpRstOut_WAE2, inpNotes }; if (!bWF_only) { Fl_ComboBox *country_fields[] = { cboCountyQSO, cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->redraw(); combo_color_font(country_fields[i]); } size_t num_fields = sizeof(qso_fields)/sizeof(*qso_fields); for (size_t i = 0; i < num_fields; i++) { qso_fields[i]->textsize(progdefaults.LOGGINGtextsize); qso_fields[i]->textfont(progdefaults.LOGGINGtextfont); qso_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); qso_fields[i]->color(progdefaults.LOGGINGcolor); qso_fields[i]->labelfont(progdefaults.LOGGINGtextfont); qso_fields[i]->redraw_label(); } if (!progdefaults.SQSOlogstate) { inpSQSO_state1->hide(); inpSQSO_state2->hide(); } if (!progdefaults.SQSOlogcounty) { inpSQSO_county1->hide(); inpSQSO_county2->hide(); } if (!progdefaults.SQSOlogserno) { inpSQSO_serno1->hide(); inpSQSO_serno2->hide(); outSQSO_serno1->hide(); outSQSO_serno2->hide(); } if (!progdefaults.SQSOlogrst) { inpRstIn_SQSO2->hide(); inpRstOut_SQSO2->hide(); } if (!progdefaults.SQSOlogname) { inpSQSO_name2->hide(); } if (!progdefaults.SQSOlogcat) { inpSQSO_category1->hide(); inpSQSO_category2->hide(); } for (size_t i = 0; i < num_fields; i++) { qso_fields[i]->redraw(); } } } void clear_time_on() { Fl_Input2* log_fields[] = { inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5 }; size_t num_fields = sizeof(log_fields)/sizeof(*log_fields); for (size_t i = 0; i < num_fields; i++) { log_fields[i]->value(""); log_fields[i]->textsize(progdefaults.LOGGINGtextsize); log_fields[i]->textfont(progdefaults.LOGGINGtextfont); log_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); log_fields[i]->color(progdefaults.LOGGINGcolor); log_fields[i]->labelfont(progdefaults.LOGGINGtextfont); log_fields[i]->show(); log_fields[i]->redraw_label(); log_fields[i]->redraw(); } } void clear_log_fields() { Fl_Input2* log_fields[] = { inpName1, inpName2, // inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc1, inpAZ, inpVEprov, inpState1, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, outSerNo3, outSerNo4, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_section1, inp_FD_class2, inp_FD_section2, inp_KD_name2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inp_CQ_RSTin2, inp_CQDX_RSTin2, inp_CQ_RSTout2, inp_CQDX_RSTout2, inp_CQstate1, inp_CQstate2, inp_CQzone1, inp_CQzone2, inp_CQDXzone1, inp_CQDXzone2, inp_1010_XchgIn1, inp_1010_XchgIn2, inp_1010_name2, inp_1010_nr1, inp_1010_nr2, inp_ARR_Name2, inp_ARR_XchgIn1, inp_ARR_XchgIn2, inp_ARR_check1, inp_ARR_check2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inp_vhf_Loc1, inp_vhf_Loc2, inp_vhf_RSTin1, inp_vhf_RSTin2, inp_vhf_RSTout1, inp_vhf_RSTout2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpNAQPname2, inp_name_NAS2, outSerNo4, inp_ser_NAS1, inpSPCnum_NAS1, outSerNo5, inp_ser_NAS2, inpSPCnum_NAS2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_RSTin2, inpRTU_RSTout2, inpRTU_serno1, inpRTU_serno2, inp_IARI_RSTin2, inp_IARI_RSTout2, out_IARI_SerNo1, inp_IARI_SerNo1, out_IARI_SerNo2, inp_IARI_SerNo2, inp_IARI_PR1, inp_IARI_PR2, inpSerNo3, inpSerNo4, outSerNo7, outSerNo8, inpRstIn3, inpRstOut3, inpRstIn4, inpRstOut4, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_troop1, inp_JOTA_troop2, inp_JOTA_spc1, inp_JOTA_spc2, inpRstIn_AICW2, inpRstOut_AICW2, inpSPCnum_AICW1, inpSPCnum_AICW2, inpSerNo_WPX1, inpSerNo_WPX2, inpRstIn_WPX2, inpRstOut_WPX2, inpSerNo_WAE1, inpSerNo_WAE2, outSerNo_WAE1, outSerNo_WAE2, inpRstIn_WAE2, inpRstOut_WAE2, inpSQSO_category1, inpSQSO_category2, inpSQSO_county1, inpSQSO_county2, inpSQSO_name2, inpSQSO_serno1, inpSQSO_serno2, inpSQSO_state1, inpSQSO_state2, inpNotes }; size_t num_fields = sizeof(log_fields)/sizeof(*log_fields); for (size_t i = 0; i < num_fields; i++) { log_fields[i]->value(""); log_fields[i]->textsize(progdefaults.LOGGINGtextsize); log_fields[i]->textfont(progdefaults.LOGGINGtextfont); log_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); log_fields[i]->color(progdefaults.LOGGINGcolor); log_fields[i]->labelfont(progdefaults.LOGGINGtextfont); log_fields[i]->show(); log_fields[i]->redraw_label(); log_fields[i]->redraw(); } Fl_ComboBox *country_fields[] = { cboCountyQSO, cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->value(""); country_fields[i]->redraw(); combo_color_font(country_fields[i]); } if (!progdefaults.SQSOlogstate) { inpSQSO_state1->hide(); inpSQSO_state2->hide(); } if (!progdefaults.SQSOlogcounty) { inpSQSO_county1->hide(); inpSQSO_county2->hide(); } if (!progdefaults.SQSOlogserno) { inpSQSO_serno1->hide(); inpSQSO_serno2->hide(); outSQSO_serno1->hide(); outSQSO_serno2->hide(); } if (!progdefaults.SQSOlogrst) { inpRstIn_SQSO2->hide(); inpRstOut_SQSO2->hide(); } if (!progdefaults.SQSOlogname) { inpSQSO_name2->hide(); } if (!progdefaults.SQSOlogcat) { inpSQSO_category1->hide(); inpSQSO_category2->hide(); } if (progdefaults.logging == LOG_SQSO) { std::string tmp = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (!progdefaults.SQSOinstate && (tmp != "7QP") && (tmp != "6NE")) inpState->value(tmp.c_str()); } set599(); updateOutSerNo(); } void clearQSO() { if (bWF_only) return; Fl_Input2* call_fields[] = { inpCall1, inpCall2, inpCall3, inpCall4 }; size_t num_fields = sizeof(call_fields)/sizeof(*call_fields); for (size_t i = 0; i < num_fields; i++) { call_fields[i]->value(""); call_fields[i]->textsize(progdefaults.LOGGINGtextsize); call_fields[i]->textfont(progdefaults.LOGGINGtextfont); call_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); call_fields[i]->color(progdefaults.LOGGINGcolor); call_fields[i]->labelfont(progdefaults.LOGGINGtextfont); call_fields[i]->show(); call_fields[i]->redraw_label(); call_fields[i]->redraw(); } clear_log_fields(); clear_time_on(); if (inpSearchString) inpSearchString->value (""); old_call.clear(); new_call.clear(); qso_time.clear(); qso_exchange.clear(); oktoclear = true; inpCall->take_focus(); if (n3fjp_connected) n3fjp_clear_record(); set599(); updateOutSerNo(); } void cb_ResetSerNbr() { contest_count.count = progdefaults.ContestStart; updateOutSerNo(); } void cb_btnTimeOn(Fl_Widget* w, void*) { inpTimeOn->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn1->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn2->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn3->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn4->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn5->value(inpTimeOff->value(), inpTimeOff->size()); sTime_on = sTime_off = ztime(); sDate_on = sDate_off = zdate(); restoreFocus(14); } void cb_loc(Fl_Widget* w, void*) { Fl_Input2 *inp = (Fl_Input2 *) w; inpLoc1->value(inp->value()); inp_vhf_Loc1->value(inp->value()); inp_vhf_Loc2->value(inp->value()); std::string s; s = inp->value(); if (s.length() < 3) return; double lon[2], lat[2], distance, azimuth; size_t len = s.length(); if (len > MAX_LOC) { s.erase(MAX_LOC); len = MAX_LOC; } bool ok = true; for (size_t i = 0; i < len; i++) { if (ok) switch (i) { case 0 : case 1 : case 4 : case 5 : ok = isalpha(s[i]); break; case 2 : case 3 : case 6 : case 7 : ok = (s[i] >= '0' && s[i] <= '9'); } } if ( !ok) { inpLoc1->value(""); inp_vhf_Loc1->value(""); inp_vhf_Loc2->value(""); return; } if (QRB::locator2longlat(&lon[0], &lat[0], progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon[1], &lat[1], s.c_str()) == QRB::QRB_OK && QRB::qrb(lon[0], lat[0], lon[1], lat[1], &distance, &azimuth) == QRB::QRB_OK) { char az[4]; snprintf(az, sizeof(az), "%3.0f", azimuth); inpAZ->value(az); } else inpAZ->value(""); if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) restoreFocus(15); } } void cb_call(Fl_Widget* w, void*) { if (bWF_only) return; qsodb.isdirty(1); if (progdefaults.calluppercase) { int pos = inpCall->position(); char* uc = new char[inpCall->size()]; transform(inpCall->value(), inpCall->value() + inpCall->size(), uc, static_cast(std::toupper)); inpCall->value(uc, inpCall->size()); inpCall->position(pos); delete [] uc; } new_call = inpCall->value(); if (new_call.length() > MAX_CALL) { new_call.erase(MAX_CALL); } if (new_call != old_call) clear_log_fields(); inpCall1->value(new_call.c_str()); inpCall2->value(new_call.c_str()); inpCall3->value(new_call.c_str()); inpCall4->value(new_call.c_str()); sDate_on = sDate_off = zdate(); sTime_on = sTime_off = ztime(); inpTimeOn->value(inpTimeOff->value()); inpTimeOn1->value(inpTimeOff->value()); inpTimeOn2->value(inpTimeOff->value()); inpTimeOn3->value(inpTimeOff->value()); inpTimeOn4->value(inpTimeOff->value()); inpTimeOn5->value(inpTimeOff->value()); if (progStatus.timer && (Fl::event() != FL_HIDE)) stopMacroTimer(); if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) { restoreFocus(16); n3fjp_calltab = true; } if (k == FL_Tab) { n3fjp_calltab = true; } } if (old_call == new_call) { if (n3fjp_calltab && n3fjp_connected) SearchLastQSO(inpCall->value()); return; } if (new_call.empty()) { if (n3fjp_connected) n3fjp_clear_record(); ifkp_load_avatar(); thor_load_avatar(); updateOutSerNo(); oktoclear = true; return; } old_call = new_call; oktoclear = false; SearchLastQSO(inpCall->value()); if (active_modem->get_mode() == MODE_IFKP) ifkp_load_avatar(inpCall->value()); if (active_modem->get_mode() >= MODE_THOR11 && active_modem->get_mode() <= MODE_THOR22) thor_load_avatar(inpCall->value()); const struct dxcc* e = dxcc_lookup(inpCall->value()); if (e) { if (progdefaults.autofill_qso_fields || progdefaults.logging != LOG_QSO) { double lon, lat, distance, azimuth; if (QRB::locator2longlat(&lon, &lat, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::qrb(lon, lat, -e->longitude, e->latitude, &distance, &azimuth) == QRB::QRB_OK) { char az[4]; snprintf(az, sizeof(az), "%3.0f", azimuth); inpAZ->value(az, sizeof(az) - 1); } } std::string cntry = e->country; std::ostringstream zone; zone << e->cq_zone; if (cntry.find("United States") != std::string::npos) cntry = "USA"; cboCountry->value(cntry.c_str()); inp_CQzone->value(zone.str().c_str()); } if (progdefaults.EnableDupCheck || FD_logged_on) { DupCheck(); } updateOutSerNo(); if (w != inpCall) restoreFocus(17); } void cb_country(Fl_Widget *w, void*) { Fl_ComboBox * inp = (Fl_ComboBox *) w; std::string str = inp->value(); Fl_ComboBox *country_fields[] = { cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->value(str.c_str()); country_fields[i]->position(0); country_fields[i]->redraw(); } if (progdefaults.EnableDupCheck || FD_logged_on) { DupCheck(); } if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) restoreFocus(18); } } void cb_log(Fl_Widget* w, void*) { Fl_Input2 *inp = (Fl_Input2 *) w; if (inp == inpName1 || inp == inpName2 || inp == inp_KD_name2 || inp == inp_1010_name2 || inp == inp_ARR_Name2 || inp == inpNAQPname2 ) { int p = inp->position(); std::string val = inp->value(); inpName1->value(val.c_str()); inpName2->value(val.c_str()); inp_KD_name2->value(val.c_str()); inp_1010_name2->value(val.c_str()); inp_ARR_Name2->value(val.c_str()); inpNAQPname2->value(val.c_str()); inp->position(p); } else if (inp == inp_KD_name2 || inp == inp_1010_name2 || inp == inp_ARR_Name2 || inp == inpNAQPname2) { int p = inp->position(); std::string val = inp->value(); inpName1->value(val.c_str()); inpName2->value(val.c_str()); inp_KD_name2->value(val.c_str()); inp_1010_name2->value(val.c_str()); inp_ARR_Name2->value(val.c_str()); inpNAQPname2->value(val.c_str()); inp->position(p); } else if (inp == inpRstIn1 || inp == inpRstIn2 || inp == inpRstIn3 || inp == inpRstIn4 || inp == inpRstIn_AICW2 || inp == inpRTU_RSTin2 || inp == inp_CQ_RSTin2 || inp == inp_vhf_RSTin1 || inp == inp_vhf_RSTin2 ) { int p = inp->position(); std::string val = inp->value(); inpRstIn1->value(val.c_str()); inpRstIn2->value(val.c_str()); inpRstIn3->value(val.c_str()); inpRstIn4->value(val.c_str()); inpRstIn_AICW2->value(val.c_str()); inpRTU_RSTin2->value(val.c_str()); inp_vhf_RSTin1->value(val.c_str()); inp_vhf_RSTin2->value(val.c_str()); inp_CQ_RSTin2->value(val.c_str()); inp->position(p); } else if (inp == inpRstOut1 || inp == inpRstOut2 || inp == inp_CQ_RSTout2 || inp == inpRTU_RSTout2 || inp == inpRstOut3 || inp == inpRstOut4 || inp == inpRstOut_AICW2 || inp == inp_vhf_RSTout1 || inp == inp_vhf_RSTout2 ) { int p = inp->position(); std::string val = inp->value(); inpRstOut1->value(val.c_str()); inpRstOut2->value(val.c_str()); inpRstOut3->value(val.c_str()); inpRstOut4->value(val.c_str()); inpRTU_RSTout2->value(val.c_str()); inpRstOut_AICW2->value(val.c_str()); inp_CQ_RSTout2->value(val.c_str()); inp_vhf_RSTout1->value(val.c_str()); inp_vhf_RSTout2->value(val.c_str()); inp->position(p); } else if (inp == inpTimeOn1 || inp == inpTimeOn2 || inp == inpTimeOn3 || inp == inpTimeOn4 || inp == inpTimeOn5) { int p = inp->position(); std::string val = inp->value(); inpTimeOn1->value(val.c_str()); inpTimeOn2->value(val.c_str()); inpTimeOn3->value(val.c_str()); inpTimeOn4->value(val.c_str()); inpTimeOn5->value(val.c_str()); inp->position(p); } else if (inp == inpTimeOff1 || inp == inpTimeOff2 || inp == inpTimeOff3 || inp == inpTimeOff4 || inp == inpTimeOff5) { int p = inp->position(); std::string val = inp->value(); inpTimeOff1->value(val.c_str()); inpTimeOff2->value(val.c_str()); inpTimeOff3->value(val.c_str()); inpTimeOff4->value(val.c_str()); inpTimeOff5->value(val.c_str()); inp->position(p); } else if (inp == inpXchgIn1 || inp == inpXchgIn2 ) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inp_KD_XchgIn1 || inp == inp_KD_XchgIn2) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inp_1010_XchgIn1 || inp == inp_1010_XchgIn2) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inp_ARR_XchgIn1 || inp == inp_ARR_XchgIn2) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inpSerNo1 || inp == inpSerNo2 || inp == inpRTU_serno1 || inp == inpRTU_serno2 || inp == inp_SS_SerialNoR1 || inp == inp_SS_SerialNoR2 ) { int p = inp->position(); std::string val = inp->value(); inpSerNo1->value(val.c_str()); inpSerNo2->value(val.c_str()); inp_SS_SerialNoR1->value(val.c_str()); inp_SS_SerialNoR2->value(val.c_str()); inpRTU_serno1->value(val.c_str()); inpRTU_serno2->value(val.c_str()); inp->position(p); } else if (inp == inp_SS_Precedence1 || inp == inp_SS_Precedence2) { int p = inp->position(); std::string val = inp->value(); inp_SS_Precedence1->value(val.c_str()); inp_SS_Precedence2->value(val.c_str()); inp->position(p); } else if (inp == inp_SS_Check1 || inp == inp_SS_Check2) { int p = inp->position(); std::string val = inp->value(); inp_SS_Check1->value(val.c_str()); inp_SS_Check2->value(val.c_str()); inp->position(p); } else if (inp == inp_SS_Section1 || inp == inp_SS_Section2) { int p = inp->position(); std::string val = inp->value(); inp_SS_Section1->value(val.c_str()); inp_SS_Section2->value(val.c_str()); inp->position(p); } else if (inp == inpSPCnum_NAQP1 || inp == inpSPCnum_NAQP2) { int p = inp->position(); std::string val = inp->value(); inpSPCnum_NAQP1->value(val.c_str()); inpSPCnum_NAQP2->value(val.c_str()); inp->position(p); } else if (inp == inpSPCnum_AICW1 || inp == inpSPCnum_AICW2) { // Rx power int p = inp->position(); std::string val = inp->value(); inpSPCnum_AICW1->value(val.c_str()); inpSPCnum_AICW2->value(val.c_str()); inp->position(p); } else if (inp == inp_ARR_check1 || inp == inp_ARR_check2) { int p = inp->position(); std::string val = inp->value(); inp_ARR_check1->value(val.c_str()); inp_ARR_check2->value(val.c_str()); inp->position(p); } else if (inp == inp_1010_nr1 || inp == inp_1010_nr2) { int p = inp->position(); std::string val = inp->value(); inp_1010_nr1->value(val.c_str()); inp_1010_nr2->value(val.c_str()); inp->position(p); } else if (inp == inp_FD_class1 || inp == inp_FD_class2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_FD_class1->value(str.c_str()); inp_FD_class2->value(str.c_str()); inp->position(p); } else if (inp == inp_ASCR_class1 || inp == inp_ASCR_class2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_ASCR_class1->value(str.c_str()); inp_ASCR_class2->value(str.c_str()); inp->position(p); } else if (inp == inp_FD_section1 || inp == inp_FD_section2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_FD_section1->value(str.c_str()); inp_FD_section2->value(str.c_str()); inp->position(p); } else if (inp == inp_KD_age1 || inp == inp_KD_age2) { int p = inp->position(); std::string val = inp->value(); inp_KD_age1->value(val.c_str()); inp_KD_age2->value(val.c_str()); inp->position(p); } else if (inp == inp_KD_state1 || inp == inp_KD_state2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_KD_state1->value(str.c_str()); inp_KD_state2->value(str.c_str()); inp->position(p); } else if (inp == inp_KD_VEprov1 || inp == inp_KD_VEprov2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_KD_VEprov1->value(str.c_str()); inp_KD_VEprov2->value(str.c_str()); inp->position(p); } else if (inp == inp_ser_NAS1 || inp == inp_ser_NAS2) { int p = inp->position(); std::string val = inp->value(); inp_ser_NAS1->value(val.c_str()); inp_ser_NAS2->value(val.c_str()); inp->position(p); } else if (inp == inp_JOTA_scout1 || inp == inp_JOTA_scout2) { int p = inp->position(); std::string val = inp->value(); inp_JOTA_scout1->value(val.c_str()); inp_JOTA_scout2->value(val.c_str()); inp->position(p); } else if (inp == inp_JOTA_troop1 || inp == inp_JOTA_troop2) { int p = inp->position(); std::string val = inp->value(); inp_JOTA_troop1->value(val.c_str()); inp_JOTA_troop2->value(val.c_str()); inp->position(p); } else if (inp == inp_JOTA_spc1 || inp == inp_JOTA_spc2) { int p = inp->position(); std::string val = inp->value(); inp_JOTA_spc1->value(val.c_str()); inp_JOTA_spc2->value(val.c_str()); inp->position(p); } else if (inp == inpState) { Cstates st; if (inpCounty->value()[0]) cboCountyQSO->value( string(st.state_short(inpState->value())).append(" "). append(st.county(inpState->value(), inpCounty->value())).c_str()); else cboCountyQSO->clear_entry(); cboCountyQSO->redraw(); } else if (inp == inpCounty) { Cstates st; if (inpState->value()[0]) cboCountyQSO->value( string(st.state_short(inpState->value())).append(" "). append(st.county(inpState->value(), inpCounty->value())).c_str()); else cboCountyQSO->clear_entry(); cboCountyQSO->redraw(); } if (progdefaults.EnableDupCheck || FD_logged_on) { DupCheck(); } if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) restoreFocus(18); } } void cbClearCall(Fl_Widget *b, void *) { clearQSO(); } void qsoClear_cb(Fl_Widget *b, void *) { bool CLEARLOG = true; if (progdefaults.NagMe && !oktoclear) CLEARLOG = (fl_choice2(_("Clear log fields?"), _("Cancel"), _("OK"), NULL) == 1); if (CLEARLOG) { clearQSO(); } clear_Lookup(); if (active_modem->get_mode() == MODE_IFKP) ifkp_clear_avatar(); if (active_modem->get_mode() >= MODE_THOR11 && active_modem->get_mode() <= MODE_THOR22) thor_clear_avatar(); qsodb.isdirty(0); } extern cQsoDb qsodb; void qso_save_now() { // if (!qsodb.isdirty()) return; string havecall = inpCall->value(); string timeon = inpTimeOn->value(); while (!havecall.empty() && havecall[0] <= ' ') havecall.erase(0,1); while (!havecall.empty() && havecall[havecall.length() - 1] <= ' ') havecall.erase(havecall.length()-1, 1); if (havecall.empty()) return; sDate_off = zdate(); sTime_off = ztime(); if (!timeon.empty()) sTime_on = timeon.c_str(); else sTime_on = sTime_off; submit_log(); if (progdefaults.ClearOnSave) clearQSO(); } void qsoSave_cb(Fl_Widget *b, void *) { qso_save_now(); ReceiveText->mark(FTextBase::XMIT); restoreFocus(20); } void cb_QRZ(Fl_Widget *b, void *) { if (!*inpCall->value()) return restoreFocus(21); switch (Fl::event_button()) { case FL_LEFT_MOUSE: CALLSIGNquery(); oktoclear = false; break; case FL_RIGHT_MOUSE: if (quick_choice(string("Spot \"").append(inpCall->value()).append("\"?").c_str(), 2, _("Confirm"), _("Cancel"), NULL) == 1) spot_manual(inpCall->value(), inpLoc->value()); break; default: break; } restoreFocus(22); } void status_cb(Fl_Widget *b, void *arg) { if (Fl::event_button() == FL_RIGHT_MOUSE) { trx_mode md = active_modem->get_mode(); if (md >= MODE_OLIVIA && md <= MODE_OLIVIA_64_2000) { cb_oliviaCustom((Fl_Widget *)0, (void *)MODE_OLIVIA); } else { tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); // rigCAT_restore_defaults(); dlgConfig->show(); } } else { if (!quick_change) return; const Fl_Menu_Item *m = quick_change->popup(Fl::event_x(), Fl::event_y()); if (m && m->callback()) m->do_callback(0); } static_cast(b)->clear(); restoreFocus(23); } void cbAFC(Fl_Widget *w, void *vi) { FL_LOCK_D(); Fl_Button *b = (Fl_Button *)w; int v = b->value(); FL_UNLOCK_D(); progStatus.afconoff = v; } void cbSQL(Fl_Widget *w, void *vi) { FL_LOCK_D(); Fl_Button *b = (Fl_Button *)w; int v = b->value(); FL_UNLOCK_D(); progStatus.sqlonoff = v ? true : false; } extern void set_wf_mode(void); void cbPwrSQL(Fl_Widget *w, void *vi) { FL_LOCK_D(); Fl_Button *b = (Fl_Button *)w; int v = b->value(); if(!v) { sldrSquelch->value(progStatus.sldrSquelchValue); progStatus.kpsql_enabled = false; progdefaults.kpsql_enabled = false; b->clear(); } else { sldrSquelch->value(progStatus.sldrPwrSquelchValue); progStatus.kpsql_enabled = true; progdefaults.kpsql_enabled = true; set_wf_mode(); b->set(); } FL_UNLOCK_D(); } void startMacroTimer() { ENSURE_THREAD(FLMAIN_TID); btnMacroTimer->color(fl_rgb_color(240, 240, 0)); btnMacroTimer->clear_output(); Fl::add_timeout(0.0, macro_timer); } void stopMacroTimer() { ENSURE_THREAD(FLMAIN_TID); progStatus.timer = 0; progStatus.repeatMacro = -1; Fl::remove_timeout(macro_timer); Fl::remove_timeout(macro_timed_execute); btnMacroTimer->label(0); btnMacroTimer->color(FL_BACKGROUND_COLOR); btnMacroTimer->set_output(); } void macro_timer(void*) { char buf[8]; snprintf(buf, sizeof(buf), "%d", progStatus.timer); btnMacroTimer->copy_label(buf); if (progStatus.timer-- == 0) { stopMacroTimer(); if (active_modem->get_mode() == MODE_IFKP) { ifkp_tx_text->clear(); } else { TransmitText->clear(); } macros.execute(progStatus.timerMacro); } else Fl::repeat_timeout(1.0, macro_timer); } void macro_timed_execute(void *) { if (exec_date == zdate() && exec_time == ztime()) { macros.timed_execute(); btnMacroTimer->label(0); btnMacroTimer->color(FL_BACKGROUND_COLOR); btnMacroTimer->set_output(); } else { Fl::repeat_timeout(1.0, macro_timed_execute); } } void startTimedExecute(std::string &title) { ENSURE_THREAD(FLMAIN_TID); Fl::add_timeout(0.0, macro_timed_execute); string txt = "Macro '"; txt.append(title).append("' scheduled at "); txt.append(exec_time).append(", on ").append(exec_date).append("\n"); btnMacroTimer->label("SKED"); btnMacroTimer->color(fl_rgb_color(240, 240, 0)); btnMacroTimer->redraw_label(); ReceiveText->clear(); ReceiveText->addstr(txt, FTextBase::CTRL); } void cbMacroTimerButton(Fl_Widget*, void*) { stopMacroTimer(); restoreFocus(24); } void cb_mvsquelch(Fl_Widget *w, void *d) { progStatus.squelch_value = mvsquelch->value(); if (active_modem->get_mode() == MODE_CW) progStatus.VIEWER_cwsquelch = progStatus.squelch_value; else if (active_modem->get_mode() == MODE_RTTY) progStatus.VIEWER_rttysquelch = progStatus.squelch_value; else progStatus.VIEWER_psksquelch = progStatus.squelch_value; if (sldrViewerSquelch) sldrViewerSquelch->value(progStatus.squelch_value); } void cb_btnClearMViewer(Fl_Widget *w, void *d) { if (brwsViewer) brwsViewer->clear(); mainViewer->clear(); active_modem->clear_viewer(); } int default_handler(int event) { if (bWF_only) { if (Fl::event_key() == FL_Escape) return 1; return 0; } if (event != FL_SHORTCUT) return 0; if (RigViewerFrame && Fl::event_key() == FL_Escape && RigViewerFrame->visible() && Fl::event_inside(RigViewerFrame)) { CloseQsoView(); return 1; } Fl_Widget* w = Fl::focus(); int key = Fl::event_key(); if ((key == FL_F + 4) && Fl::event_alt()) clean_exit(true); if (fl_digi_main->contains(w)) { if (key == FL_Escape || (key >= FL_F && key <= FL_F_Last) || ((key == '1' || key == '2' || key == '3' || key == '4') && Fl::event_alt())) { TransmitText->take_focus(); TransmitText->handle(FL_KEYBOARD); return 1; } #ifdef __APPLE__ if ((key == '=') && (Fl::event_state() == FL_COMMAND)) #else if (key == '=' && Fl::event_alt()) #endif { progdefaults.txlevel += 0.1; if (progdefaults.txlevel > 0) progdefaults.txlevel = 0; cntTxLevel->value(progdefaults.txlevel); return 1; } #ifdef __APPLE__ if ((key == '-') && (Fl::event_state() == FL_COMMAND)) #else if (key == '-' && Fl::event_alt()) #endif { progdefaults.txlevel -= 0.1; if (progdefaults.txlevel < -30) progdefaults.txlevel = -30; cntTxLevel->value(progdefaults.txlevel); return 1; } } else if (dlgLogbook->contains(w)) return log_search_handler(event); else if (Fl::event_key() == FL_Escape) return 1; else if ( (fl_digi_main->contains(w) || dlgLogbook->contains(w)) && Fl::event_ctrl() ) return w->handle(FL_KEYBOARD); return 0; } int wo_default_handler(int event) { if (event != FL_SHORTCUT) return 0; if (RigViewerFrame && Fl::event_key() == FL_Escape && RigViewerFrame->visible() && Fl::event_inside(RigViewerFrame)) { CloseQsoView(); return 1; } Fl_Widget* w = Fl::focus(); int key = Fl::event_key(); if ((key == FL_F + 4) && Fl::event_alt()) clean_exit(true); if (fl_digi_main->contains(w)) { if (key == FL_Escape || (key >= FL_F && key <= FL_F_Last) || ((key == '1' || key == '2' || key == '3' || key == '4') && Fl::event_alt())) { return 1; } #ifdef __APPLE__ if ((key == '=') && (Fl::event_state() == FL_COMMAND)) #else if (key == '=' && Fl::event_alt()) #endif { progdefaults.txlevel += 0.1; if (progdefaults.txlevel > 0) progdefaults.txlevel = 0; cntTxLevel->value(progdefaults.txlevel); return 1; } #ifdef __APPLE__ if ((key == '-') && (Fl::event_state() == FL_COMMAND)) #else if (key == '-' && Fl::event_alt()) #endif { progdefaults.txlevel -= 0.1; if (progdefaults.txlevel < -30) progdefaults.txlevel = -30; cntTxLevel->value(progdefaults.txlevel); return 1; } } else if (Fl::event_ctrl()) return w->handle(FL_KEYBOARD); return 0; } void save_on_exit() { if (progdefaults.changed && progdefaults.SaveConfig) { switch (fl_choice2(_("Save changed configuration?"), NULL, _("Yes"), _("No"))) { case 1: progdefaults.saveDefaults(); default: break; } } if (macros.changed && progdefaults.SaveMacros) { switch (fl_choice2(_("Save changed macros?"), NULL, _("Yes"), _("No"))) { case 1: macros.writeMacroFile(); default: break; } } if (!oktoclear && progdefaults.NagMe) { switch (fl_choice2(_("Save log entry?"), NULL, _("Yes"), _("No"))) { case 1: qsoSave_cb(0, 0); default: break; } } return; } bool first_use = false; bool bEXITING = false; bool clean_exit(bool ask) { if (ask && first_use) { switch(fl_choice2(_("Confirm Quit"), NULL, _("Yes"), _("No"))) { case 2: return false; default: break; } progdefaults.saveDefaults(); macros.writeMacroFile(); if (!oktoclear) { switch (fl_choice2(_("Save log entry?"), NULL, _("Yes"), _("No"))) { case 1: qsoSave_cb(0, 0); default: break; } } } else { if (ask && progdefaults.confirmExit && (!(progdefaults.changed && progdefaults.SaveConfig) || !(macros.changed && progdefaults.SaveMacros) || !(!oktoclear && progdefaults.NagMe))) { switch (fl_choice2(_("Confirm quit?"), NULL, _("Yes"), _("No"))) { case 1: break; default: return false; } } if (ask) save_on_exit(); } bEXITING = true; if (Maillogfile) Maillogfile->log_to_file_stop(); if (logfile) logfile->log_to_file_stop(); saveFreqList(); progStatus.saveLastState(); if (scopeview) scopeview->hide(); if (dlgViewer) dlgViewer->hide(); if (dlgLogbook) dlgLogbook->hide(); delete push2talk; #if USE_HAMLIB LOG_INFO("hamlib_close"); hamlib_close(); #endif LOG_INFO("rigCAT_close"); rigCAT_close(); LOG_INFO("ADIF_RW_close"); ADIF_RW_close(); LOG_INFO("trx_close"); trx_close(); #if USE_HAMLIB LOG_INFO("delete xcvr %p", xcvr); if (xcvr) delete xcvr; #endif LOG_INFO("close_logbook"); close_logbook(); MilliSleep(50); LOG_INFO("stop_flrig_thread"); stop_flrig_thread(); LOG_INFO("Stopping N3FJP thread"); n3fjp_close(); LOG_INFO("Closing WinKeyer interface"); WK_exit(); LOG_INFO("Stopping TOD clock"); TOD_close(); LOG_INFO("Deleting audio_alert"); delete audio_alert; LOG_INFO("exit_process"); exit_process(); if (field_day_viewer) if (field_day_viewer->visible()) field_day_viewer->hide(); if (dxcluster_viewer) if (dxcluster_viewer->visible()) dxcluster_viewer->hide(); save_counties(); return true; } bool first_check = true; void UI_check_swap() { int mv_x = text_panel->x(); int mv_y = text_panel->y(); int mv_w = mvgroup->w() > 1 ? mvgroup->w() : text_panel->w() / 2; int mv_h = text_panel->h(); int tx_y = 0, tx_h = 0, tx_x = 0, tx_w = 0; int rx_y = 0, rx_h = 0, rx_x = 0, rx_w = 0; if (progdefaults.rxtx_swap && (ReceiveText->y() <= TransmitText->y())) { tx_y = ReceiveText->y(); tx_h = first_check ? progStatus.tile_y : TransmitText->h(); tx_x = mv_x + mv_w; tx_w = text_panel->w() - mv_w; rx_y = tx_y + tx_h; rx_h = mv_h - tx_h; rx_x = tx_x; rx_w = tx_w; text_panel->remove(minbox); text_panel->remove(TransmitText); text_panel->remove(FHdisp); text_panel->remove(ReceiveText); text_panel->remove(mvgroup); mvgroup->resize(mv_x, mv_y, mv_w, mv_h); TransmitText->resize(tx_x, tx_y, tx_w, tx_h); ReceiveText->resize(rx_x, rx_y, rx_w, rx_h); FHdisp->resize(rx_x, rx_y, rx_w, rx_h); minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); text_panel->add(mvgroup); text_panel->add(TransmitText); text_panel->add(ReceiveText); text_panel->add(FHdisp); text_panel->add(minbox); text_panel->resizable(minbox); progStatus.tile_y = TransmitText->h(); progStatus.tile_y_ratio = 1.0 * TransmitText->h() / text_panel->h(); } else if (!progdefaults.rxtx_swap && ReceiveText->y() > TransmitText->y()) { rx_y = TransmitText->y(); rx_h = first_check ? progStatus.tile_y : ReceiveText->h(); rx_x = mv_x + mv_w; rx_w = text_panel->w() - mv_w; tx_y = rx_y + rx_h; tx_h = mv_h - rx_h; tx_x = rx_x; tx_w = rx_w; text_panel->remove(minbox); text_panel->remove(TransmitText); text_panel->remove(FHdisp); text_panel->remove(ReceiveText); text_panel->remove(mvgroup); mvgroup->resize(mv_x, mv_y, mv_w, mv_h); TransmitText->resize(tx_x, tx_y, tx_w, tx_h); ReceiveText->resize(rx_x, rx_y, rx_w, rx_h); FHdisp->resize(rx_x, rx_y, rx_w, rx_h); minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); text_panel->add(mvgroup); text_panel->add(ReceiveText); text_panel->add(FHdisp); text_panel->add(TransmitText); text_panel->add(minbox); text_panel->resizable(minbox); progStatus.tile_y = ReceiveText->h(); progStatus.tile_y_ratio = 1.0 * ReceiveText->h() / text_panel->h(); } // resize fsq UI int fsq_rx_h = text_panel->h() * progStatus.fsq_ratio; if (fsq_rx_h < minhtext) fsq_rx_h = minhtext; int fsq_tx_h = text_panel->h() - fsq_rx_h; if (fsq_tx_h < minhtext) { fsq_tx_h = minhtext; fsq_rx_h = text_panel->h() - fsq_tx_h; } fsq_left->remove(fsq_minbox); fsq_left->remove(fsq_rx_text); fsq_left->remove(fsq_tx_text); fsq_rx_text->resize(fsq_left->x(), fsq_left->y(), fsq_left->w(), fsq_rx_h); fsq_tx_text->resize(fsq_left->x(), fsq_left->y() + fsq_rx_text->h(), fsq_left->w(), fsq_tx_h); fsq_minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); fsq_left->add(fsq_rx_text); fsq_left->add(fsq_tx_text); fsq_left->add(fsq_minbox); fsq_left->resizable(fsq_minbox); // resize IFKP UI int ifkp_rx_h = text_panel->h() * progStatus.ifkp_ratio; if (ifkp_rx_h < minhtext) ifkp_rx_h = minhtext; int ifkp_tx_h = text_panel->h() - ifkp_rx_h; if (ifkp_tx_h < minhtext) { ifkp_tx_h = minhtext; ifkp_rx_h = text_panel->h() - ifkp_tx_h; } ifkp_left->remove(ifkp_minbox); ifkp_left->remove(ifkp_rx_text); ifkp_left->remove(ifkp_tx_text); ifkp_rx_text->resize( ifkp_left->x(), ifkp_left->y(), ifkp_left->w(), ifkp_rx_h); ifkp_tx_text->resize( ifkp_left->x(), ifkp_left->y() + ifkp_rx_text->h(), ifkp_left->w(), ifkp_tx_h); ifkp_minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); ifkp_left->add(ifkp_rx_text); ifkp_left->add(ifkp_tx_text); ifkp_left->add(ifkp_minbox); ifkp_left->resizable(ifkp_minbox); first_check = false; } static bool restore_minimize = false; void UI_select_central_frame(int y, int ht) { text_panel->resize(0, y, fl_digi_main->w(), ht); center_group->init_sizes(); } void resize_macroframe_1(int x, int y, int w, int h) { macroFrame1->resize(x, y, w, h); macroFrame1->init_sizes(); macroFrame1->redraw(); } void resize_macroframe_2(int x, int y, int w, int h) { macroFrame2->resize(x, y, w, h); macroFrame2->init_sizes(); macroFrame2->redraw(); } void UI_position_macros(int x, int y1, int w, int HTh) { int mh = progdefaults.macro_height; if (progdefaults.display_48macros) { macroFrame2->hide(); macroFrame1->hide(); if (!progdefaults.four_bar_position) { tbar->resize(x, y1, w, 4 * TB_HEIGHT); tbar->show(); y1 += tbar->h(); HTh -= tbar->h(); center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); } else { int htbar = 4 * TB_HEIGHT; HTh -= htbar; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; tbar->resize(x, y1, w, htbar); tbar->show(); y1 += htbar; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); } fl_digi_main->init_sizes(); return; } tbar->hide(); switch (progdefaults.mbar_scheme) { // 0, 1, 2 one bar schema case 0: resize_macroframe_2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; default: case 1: resize_macroframe_2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); HTh -= mh; center_group->resize(x, y1, w, HTh); // text_panel->resize(x, y1, w, HTh); // wefax_group->resize(x, y1, w, HTh); // fsq_group->resize(x, y1, w, HTh); // ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 2: resize_macroframe_2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; status_group->position(x, y1); break; case 3: resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; HTh -= mh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 4: resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; HTh -= mh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 5: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 6: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); y1 += HTh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 7: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); y1 += mh; status_group->position(x, y1); break; case 8: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); y1 += HTh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; status_group->position(x, y1); break; case 9: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; status_group->position(x, y1); break; case 10: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; status_group->position(x, y1); break; case 11: resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 12: resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; } fl_digi_main->init_sizes(); return; } bool UI_first = true; void UI_select() { if (bWF_only) { int Y = cntTxLevel->y(); int psm_width = progdefaults.show_psm_btn ? bwSqlOnOff : 0; int X = rightof(Status2); int W = fl_digi_main->w() - X - bwTxLevel - Wwarn - bwAfcOnOff - bwSqlOnOff - psm_width; StatusBar->resize( X, Y, W, StatusBar->h()); cntTxLevel->position(rightof(StatusBar), Y); WARNstatus->position(rightof(cntTxLevel), Y); btnAFC->position(rightof(WARNstatus), Y); btnSQL->position(rightof(btnAFC), Y); btnPSQL->resize(rightof(btnSQL), Y, psm_width, btnPSQL->h()); if (progdefaults.show_psm_btn) btnPSQL->show(); else btnPSQL->hide(); cntTxLevel->redraw(); WARNstatus->redraw(); btnAFC->redraw(); btnSQL->redraw(); btnPSQL->redraw(); StatusBar->redraw(); status_group->init_sizes(); status_group->redraw(); fl_digi_main->init_sizes(); fl_digi_main->redraw(); return; } int x = 0; int y1 = Hmenu; int w = fl_digi_main->w(); int HTh = fl_digi_main->h() - y1; if (cnt_macro_height) { cnt_macro_height->minimum(MACROBAR_MIN); cnt_macro_height->maximum(MACROBAR_MAX); cnt_macro_height->step(1); if (progdefaults.macro_height < MACROBAR_MIN) progdefaults.macro_height = MACROBAR_MIN; if (progdefaults.macro_height > MACROBAR_MAX) progdefaults.macro_height = MACROBAR_MAX; cnt_macro_height->value(progdefaults.macro_height); } HTh -= wf_group->h(); HTh -= status_group->h(); if (progStatus.NO_RIGLOG && !restore_minimize) { TopFrame1->hide(); TopFrame2->hide(); TopFrame3->hide(); Status2->hide(); inpCall4->show(); inpCall = inpCall4; UI_position_macros(x, y1, w, HTh); goto UI_return; } if (!progStatus.Rig_Log_UI || restore_minimize) { TopFrame1->resize( x, y1, w, Hqsoframe ); y1 += (TopFrame1->h()); HTh -= (TopFrame1->h()); UI_position_macros(x, y1, w, HTh); TopFrame2->hide(); TopFrame3->hide(); TopFrame1->show(); inpFreq = inpFreq1; inpCall = inpCall1; inpTimeOn = inpTimeOn1; inpTimeOff = inpTimeOff1; inpName = inpName1; inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpXchgIn = inpXchgIn1; inpState = inpState1; inpLoc = inpLoc1; inpQTH = inpQth; inp_JOTA_scout = inp_JOTA_scout1; inp_JOTA_troop = inp_JOTA_troop1; cboCountry = cboCountryQSO; gGEN_QSO_1->hide(); gGEN_CONTEST->hide(); gCQWW_RTTY->hide(); gCQWW_DX->hide(); gFD->hide(); gCWSS->hide(); gKD_1->hide(); gARR->hide(); g1010->hide(); gVHF->hide(); gASCR->hide(); gNAQP->hide(); gARRL_RTTY->hide(); gIARI->hide(); gNAS->hide(); gAIDX->hide(); gJOTA->hide(); gAICW->hide(); gSQSO->hide(); gCQWPX->hide(); gWAE->hide(); switch (progdefaults.logging) { case LOG_FD: inpClass = inp_FD_class1; inpSection = inp_FD_section1; gFD->show(); break; case LOG_WFD: inpClass = inp_FD_class1; inpSection = inp_FD_section1; gFD->show(); break; case LOG_KD: inp_KD_age = inp_KD_age1; inpState = inp_KD_state1; inpVEprov = inp_KD_VEprov1; inpXchgIn = inp_KD_XchgIn1; gKD_1->show(); break; case LOG_ARR: inpCall = inpCall1; inpName = inpName; inp_ARR_check = inp_ARR_check1; inpXchgIn = inp_ARR_XchgIn1; gARR->show(); break; case LOG_1010: inp_1010_nr = inp_1010_nr1; inpXchgIn = inp_1010_XchgIn1; g1010->show(); break; case LOG_VHF: inpRstIn = inp_vhf_RSTin1; inpRstOut = inp_vhf_RSTout1; inpLoc = inp_vhf_Loc1; inp_vhf_Loc1->show(); inp_vhf_RSTin1->show(); inp_vhf_RSTout1->show(); gVHF->show(); break; case LOG_CQ_WPX: inpSerNo = inpSerNo_WPX1; outSerNo = outSerNo_WPX1; inpSerNo_WPX1->show(); outSerNo_WPX1->show(); gCQWPX->show(); break; case LOG_CQWW_DX: cboCountry = cboCountryQSO; inp_CQzone = inp_CQDXzone1; inp_CQDXzone1->show(); gCQWW_DX->show(); break; case LOG_CQWW_RTTY: inpState = inp_CQstate = inp_CQstate1; cboCountry = cboCountryQSO; inp_CQzone = inp_CQzone1; gCQWW_RTTY->show(); break; case LOG_CWSS: outSerNo = outSerNo3; inpSerNo = inp_SS_SerialNoR1; inp_SS_SerialNoR = inp_SS_SerialNoR1; inp_SS_Check = inp_SS_Check1; inp_SS_Precedence = inp_SS_Precedence1; inp_SS_Section = inp_SS_Section1; gCWSS->show(); break; case LOG_ASCR: inpClass = inp_ASCR_class1; inpXchgIn = inp_ASCR_XchgIn1; inp_ASCR_class1->show(); inp_ASCR_XchgIn1->show(); gASCR->show(); break; case LOG_IARI: inpXchgIn = inp_IARI_PR1; cboCountry = cboCountryQSO; inp_IARI_PR1->show(); gIARI->show(); break; case LOG_NAQP: inpSPCnum = inpSPCnum_NAQP1; inpSPCnum_NAQP1->show(); gNAQP->show(); break; case LOG_RTTY: inpState = inpRTU_stpr1; inpSerNo = inpRTU_serno1; cboCountry = cboCountryQSO; gARRL_RTTY->show(); break; case LOG_NAS: inpSerNo = inp_ser_NAS1; inpXchgIn = inpSPCnum_NAS1; outSerNo5->show(); inp_ser_NAS1->show(); inpSPCnum_NAS1->show(); gNAS->show(); break; case LOG_AIDX: outSerNo = outSerNo7; inpSerNo = inpSerNo3; cboCountry = cboCountryAIDX = cboCountryQSO; outSerNo7->show(); inpSerNo3->show(); gAIDX->show(); break; case LOG_JOTA: inp_JOTA_scout = inp_JOTA_scout1; inp_JOTA_troop = inp_JOTA_troop1; inpXchgIn = inp_JOTA_spc1; inp_JOTA_scout1->show(); inp_JOTA_spc1->show(); inp_JOTA_troop1->show(); gJOTA->show(); break; case LOG_AICW: inpSPCnum = inpSPCnum_AICW1; cboCountry = cboCountryQSO;//cboCountryAICW1; inpSPCnum_AICW1->show(); gAICW->show(); break; case LOG_SQSO: inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; inpCounty = inpSQSO_county1; inpSQSO_county1->show(); outSerNo = outSQSO_serno1; outSQSO_serno1->show(); inpSerNo = inpSQSO_serno1; inpSQSO_serno1->show(); inpState = inpSQSO_state1; inpSQSO_state1->show(); if (progdefaults.SQSOlogcat) { inpSQSO_category1->show(); inpSQSO_category = inpSQSO_category1; } else { inpSQSO_category1->hide(); } gSQSO->show(); break; // case LOG_WAE: // inpSerNo = inpSerNo_WAE1; // inpSerNo_WAE1->show(); // outSerNo = outSerNo_WAE1; // outSerNo_WAE1->show(); // cboCountry = cboCountryWAE1; // cboCountryWAE1->show(); // gWAE->show(); // break; case LOG_BART: case LOG_GENERIC: gGEN_CONTEST->show(); break; default: // no contest gGEN_QSO_1->show(); } gGEN_QSO_1->redraw(); gGEN_CONTEST->redraw(); gCQWW_RTTY->redraw(); gCQWW_DX->redraw(); gFD->redraw(); gCWSS->redraw(); gKD_1->redraw(); gARR->redraw(); g1010->redraw(); gVHF->redraw(); gIARI->redraw(); gAICW->redraw(); gSQSO->redraw(); gCQWPX->redraw(); gWAE->redraw(); qsoFreqDisp = qsoFreqDisp1; TopFrame1->init_sizes(); goto UI_return; } else { if (progdefaults.logging == LOG_QSO) { // no contest TopFrame2->resize( x, y1, w, Hentry + 2 * pad); y1 += TopFrame2->h(); HTh -= TopFrame2->h(); UI_position_macros(x, y1, w, HTh); TopFrame1->hide(); TopFrame3->hide(); TopFrame2->show(); inpCall = inpCall2; inpTimeOn = inpTimeOn2; inpTimeOff = inpTimeOff2; inpName = inpName2; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpRstIn = inpRstIn2; inpRstOut = inpRstOut2; inpState = inpState1; inpLoc = inpLoc1; inpQTH = inpQth; qsoFreqDisp = qsoFreqDisp2; inpCall4->hide(); Status2->show(); goto UI_return; } TopFrame3->resize( x, y1, w, Hentry + 2 * pad); y1 += TopFrame3->h(); HTh -= TopFrame3->h(); UI_position_macros(x, y1, w, HTh); TopFrame1->hide(); TopFrame2->hide(); TopFrame3->show(); inpCall = inpCall3; inpTimeOn = inpTimeOn3; inpTimeOff = inpTimeOff3; inpSerNo = inpSerNo2; outSerNo = outSerNo2; inpXchgIn = inpXchgIn2; // inpSQSO_category2->hide(); log_generic_frame->hide(); log_fd_frame->hide(); log_kd_frame->hide(); log_1010_frame->hide(); log_arr_frame->hide(); log_vhf_frame->hide(); log_cqww_frame->hide(); log_cqww_rtty_frame->hide(); log_cqss_frame->hide(); log_cqwpx_frame->hide(); log_ascr_frame->hide(); log_naqp_frame->hide(); log_rtty_frame->hide(); log_iari_frame->hide(); log_nas_frame->hide(); log_aidx_frame->hide(); log_jota_frame->hide(); log_aicw_frame->hide(); log_sqso_frame->hide(); log_wae_frame->hide(); switch (progdefaults.logging) { case LOG_QSO: log_generic_frame->show(); break; case LOG_FD: log_fd_frame->show(); inpClass = inp_FD_class2; inpSection = inp_FD_section2; break; case LOG_WFD: log_fd_frame->show(); inpClass = inp_FD_class2; inpSection = inp_FD_section2; break; case LOG_KD: log_kd_frame->show(); inpName = inp_KD_name2; inp_KD_age = inp_KD_age2; inpState = inp_KD_state2; inpVEprov = inp_KD_VEprov2; inpXchgIn = inp_KD_XchgIn2; break; case LOG_ARR: log_arr_frame->show(); inpCall = inpCall3; inpName = inp_ARR_Name2; inp_ARR_check = inp_ARR_check2; inpXchgIn = inp_ARR_XchgIn2; break; case LOG_1010: log_1010_frame->show(); inpName = inp_1010_name2; inp_1010_nr = inp_1010_nr1; inpXchgIn = inp_1010_XchgIn2; break; case LOG_VHF: log_vhf_frame->show(); inpRstIn = inp_vhf_RSTin2; inpRstOut = inp_vhf_RSTout2; inpLoc = inp_vhf_Loc2; break; case LOG_CQWW_DX: log_cqww_frame->show(); inpRstIn = inp_CQDX_RSTin2; inpRstOut = inp_CQDX_RSTout2; inp_CQzone = inp_CQDXzone2; cboCountry = cboCountryCQDX2; break; case LOG_CQWW_RTTY: log_cqww_rtty_frame->show(); inpRstIn = inp_CQ_RSTin2; inpRstOut = inp_CQ_RSTout2; inpState = inp_CQstate = inp_CQstate2; inp_CQzone = inp_CQzone2; cboCountry = cboCountryCQ2; break; case LOG_CWSS: log_cqss_frame->show(); outSerNo = outSerNo4; inpSerNo = inp_SS_SerialNoR2; inpTimeOff = inpTimeOff3; inpTimeOn = inpTimeOn3; inp_SS_Check = inp_SS_Check2; inp_SS_Precedence = inp_SS_Precedence2; inp_SS_Section = inp_SS_Section2; inp_SS_SerialNoR = inp_SS_SerialNoR2; break; case LOG_ASCR: log_ascr_frame->show(); inpName = inp_ASCR_name2; inpRstIn = inp_ASCR_RSTin2; inpRstOut = inp_ASCR_RSTout2; inpClass = inp_ASCR_class2; inpXchgIn = inp_ASCR_XchgIn2; break; case LOG_IARI: log_iari_frame->show(); inpRstIn = inp_IARI_RSTin2; inpRstOut = inp_IARI_RSTout2; inpSerNo = inp_IARI_SerNo2; outSerNo = out_IARI_SerNo2; inpXchgIn = inp_IARI_PR2; cboCountry = cboCountryIARI2; break; case LOG_NAQP: log_naqp_frame->show(); inpName = inpNAQPname2; inpSPCnum = inpSPCnum_NAQP2; break; case LOG_RTTY: log_rtty_frame->show(); inpState = inpRTU_stpr2; inpRstIn = inpRTU_RSTin2; inpRstOut = inpRTU_RSTout2; inpSerNo = inpRTU_serno2; cboCountry = cboCountryRTU2; break; case LOG_AIDX: log_aidx_frame->show(); inpRstIn = inpRstIn3; inpRstOut = inpRstOut3; outSerNo = outSerNo8; inpSerNo = inpSerNo4; cboCountry = cboCountryAIDX = cboCountryAIDX2; break; case LOG_JOTA: log_jota_frame->show(); inpRstIn = inpRstIn4; inpRstOut = inpRstOut4; inp_JOTA_scout = inp_JOTA_scout2; inp_JOTA_troop = inp_JOTA_troop2; inpXchgIn = inp_JOTA_spc2; break; case LOG_AICW: log_aicw_frame->show(); inpRstIn = inpRstIn_AICW2; inpRstOut = inpRstOut_AICW2; cboCountry = cboCountryAICW2; inpSPCnum = inpSPCnum_AICW2; break; case LOG_SQSO: inpSQSO_category2->hide(); inpSQSO_name2->hide(); inpSQSO_serno2->hide(); inpRstOut_SQSO2->hide(); inpRstIn_SQSO2->hide(); inpState = inpSQSO_state2; inpSQSO_state2->show(); inpCounty = inpSQSO_county2; inpSQSO_county2->show(); if (progdefaults.SQSOlogcat) { inpSQSO_category2->show(); inpSQSO_category2->redraw(); inpSQSO_category = inpSQSO_category2; } if (progdefaults.SQSOlogrst) { inpRstIn = inpRstIn_SQSO2; inpRstIn_SQSO2->show(); inpRstOut = inpRstOut_SQSO2; inpRstOut_SQSO2->show(); } if (progdefaults.SQSOlogserno) { inpSerNo = inpSQSO_serno2; inpSQSO_serno2->show(); outSerNo = outSQSO_serno2; outSQSO_serno2->show(); } if (progdefaults.SQSOlogname) { inpName = inpSQSO_name2; inpSQSO_name2->show(); } inpSQSO_category2->redraw(); inpSQSO_name2->redraw(); inpSQSO_serno2->redraw(); inpRstOut_SQSO2->redraw(); inpRstIn_SQSO2->redraw(); inpSQSO_state2->redraw(); inpSQSO_county2->redraw(); log_sqso_frame->show(); break; case LOG_NAS: inpSerNo = inp_ser_NAS2; inpXchgIn = inpSPCnum_NAS2; inpName = inp_name_NAS2; log_nas_frame->show(); break; case LOG_CQ_WPX: log_cqwpx_frame->show(); inpSerNo = inpSerNo_WPX2; outSerNo = outSerNo_WPX2; inpRstIn = inpRstIn_WPX2; inpRstOut = inpRstOut_WPX2; break; // case LOG_WAE: // log_wae_frame->show(); // inpSerNo = inpSerNo_WAE2; // outSerNo = outSerNo_WAE2; // inpRstIn = inpRstIn_WAE2; // inpRstOut = inpRstOut_WAE2; // cboCountry = cboCountryWAE2; // break; case LOG_BART: case LOG_GENERIC: default: log_generic_frame->show(); inpTimeOn = inpTimeOn3; inpTimeOff = inpTimeOff3; inpSerNo = inpSerNo2; inpXchgIn = inpXchgIn2; break; } qsoFreqDisp = qsoFreqDisp3; TopFrame3->redraw(); inpCall4->hide(); Status2->show(); goto UI_return; } UI_return: UI_check_swap(); if (UI_first) { UI_first = false; } else { int orgx = text_panel->orgx(); int orgy = text_panel->orgy(); int nux = text_panel->x() + progStatus.tile_x; int nuy = text_panel->y() + progStatus.tile_y_ratio * text_panel->h(); text_panel->position(orgx, orgy, nux, nuy); } { int Y = status_group->y(); int W = fl_digi_main->w(); int psm_width = progdefaults.show_psm_btn ? bwSqlOnOff : 0; StatusBar->resize( rightof(Status2), Y, W - rightof(Status2) - bwTxLevel - // tx level control Wwarn - // Warn indicator bwAfcOnOff - // afc button bwSqlOnOff - // sql button psm_width - // psm button, bwSqlOnOff / 0 corner_box->w(), StatusBar->h()); cntTxLevel->position(rightof(StatusBar), Y); WARNstatus->position(rightof(cntTxLevel), Y); btnAFC->position(rightof(WARNstatus), Y); btnSQL->position(rightof(btnAFC), Y); btnPSQL->resize(rightof(btnSQL), Y, psm_width, btnPSQL->h()); if (progdefaults.show_psm_btn) btnPSQL->show(); else btnPSQL->hide(); status_group->init_sizes(); status_group->redraw(); } RigControlFrame->init_sizes(); RigControlFrame->redraw(); smeter->redraw(); pwrmeter->redraw(); center_group->redraw(); text_panel->redraw(); wefax_group->redraw(); fsq_group->redraw(); ifkp_group->redraw(); macroFrame1->redraw(); macroFrame2->redraw(); viewer_redraw(); fl_digi_main->init_sizes(); update_main_title(); LOGBOOK_colors_font(); fl_digi_main->redraw(); Fl::flush(); } void cb_mnu_wf_all(Fl_Menu_* w, void *d) { wf->UI_select(progStatus.WF_UI = w->mvalue()->value()); } void cb_mnu_riglog_all(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.Rig_Log_UI = false; progStatus.NO_RIGLOG = false; UI_select(); } void cb_mnu_riglog_partial(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.Rig_Log_UI = true; progStatus.NO_RIGLOG = false; UI_select(); } void cb_mnu_riglog_none(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.NO_RIGLOG = true; progStatus.Rig_Log_UI = false; UI_select(); } void cb_mnuDockedscope(Fl_Menu_ *w, void *d) { wf->show_scope(progStatus.DOCKEDSCOPE = w->mvalue()->value()); } void WF_UI() { wf->UI_select(progStatus.WF_UI); } void toggle_smeter() { if (progStatus.meters && !smeter->visible()) { pwrmeter->hide(); smeter->show(); qso_combos->hide(); } else if (!progStatus.meters && smeter->visible()) { pwrmeter->hide(); smeter->hide(); qso_combos->show(); } RigControlFrame->redraw(); } void cb_toggle_smeter(Fl_Widget *w, void *v) { progStatus.meters = !progStatus.meters; toggle_smeter(); } extern void cb_scripts(bool); void cb_menu_scripts(Fl_Widget*, void*) { cb_scripts(false); } extern void cb_create_default_script(void); void cb_menu_make_default_scripts(Fl_Widget*, void*) { cb_create_default_script(); } void cb_48macros(Fl_Widget*, void*) { progdefaults.display_48macros = !progdefaults.display_48macros; UI_select(); } static void cb_opmode_show(Fl_Widget* w, void*); static Fl_Menu_Item menu_[] = { {_("&File"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Folders")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Fldigi config..."), folder_open_icon), 0, cb_ShowConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("FLMSG files..."), folder_open_icon), 0, cb_ShowFLMSG, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("NBEMS files..."), folder_open_icon), 0, cb_ShowNBEMS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Data files..."), folder_open_icon), 0, cb_ShowDATA, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Macros")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Open ..."), file_open_icon), 0, (Fl_Callback*)cb_mnuOpenMacro, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Save ..."), save_as_icon), 0, (Fl_Callback*)cb_mnuSaveMacro, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Config Scripts")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { _("Execute"), 0, (Fl_Callback*)cb_menu_scripts, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Generate"), 0, (Fl_Callback*)cb_menu_make_default_scripts, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { 0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Text Capture")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { LOG_TO_FILE_MLABEL, 0, cb_logfile, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, #if USE_SNDFILE { icons::make_icon_label(_("Audio")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, {_("RX capture"), 0, (Fl_Callback*)cb_mnuCapture, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {_("TX generate"), 0, (Fl_Callback*)cb_mnuGenerate, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {_("Playback"), 0, (Fl_Callback*)cb_mnuPlayback, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, #endif { icons::make_icon_label(_("Exit"), log_out_icon), 'x', (Fl_Callback*)cb_E, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { OPMODES_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Contestia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEXMICRO].name, 0, cb_init_mode, (void *)MODE_DOMINOEXMICRO, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX44].name, 0, cb_init_mode, (void *)MODE_DOMINOEX44, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX88].name, 0, cb_init_mode, (void *)MODE_DOMINOEX88, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { "FSQ", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-6", 0, cb_fsq6, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-4.5", 0, cb_fsq4p5, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-3", 0, cb_fsq3, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-2", 0, cb_fsq2, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-1.5", 0, cb_fsq1p5, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Hell", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FELDHELL].name, 0, cb_init_mode, (void *)MODE_FELDHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FSKHELL].name, 0, cb_init_mode, (void *)MODE_FSKHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { "IFKP", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "IFKP 0.5", 0, cb_ifkp0p5, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "IFKP 1.0", 0, cb_ifkp1p0, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "IFKP 2.0", 0, cb_ifkp2p0, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128].name, 0, cb_init_mode, (void *)MODE_MFSK128, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MT63", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { OLIVIA_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000].name, 0, cb_init_mode, (void *)MODE_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125].name, 0, cb_init_mode, (void *)MODE_12X_PSK125, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250].name, 0, cb_init_mode, (void *)MODE_6X_PSK250, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500].name, 0, cb_init_mode, (void *)MODE_2X_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500].name, 0, cb_init_mode, (void *)MODE_4X_PSK500, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800].name, 0, cb_init_mode, (void *)MODE_2X_PSK800, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {"QPSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"8PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125].name, 0, cb_init_mode, (void *)MODE_8PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1200F].name, 0, cb_init_mode, (void *)MODE_8PSK1200F, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSKR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000R].name, 0, cb_init_mode, (void *)MODE_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK63R].name, 0, cb_init_mode, (void *)MODE_4X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK63R].name, 0, cb_init_mode, (void *)MODE_5X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK63R].name, 0, cb_init_mode, (void *)MODE_10X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_20X_PSK63R].name, 0, cb_init_mode, (void *)MODE_20X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_32X_PSK63R].name, 0, cb_init_mode, (void *)MODE_32X_PSK63R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK125R].name, 0, cb_init_mode, (void *)MODE_4X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK125R].name, 0, cb_init_mode, (void *)MODE_5X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK125R].name, 0, cb_init_mode, (void *)MODE_10X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125R].name, 0, cb_init_mode, (void *)MODE_12X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_16X_PSK125R].name, 0, cb_init_mode, (void *)MODE_16X_PSK125R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK250R].name, 0, cb_init_mode, (void *)MODE_2X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK250R].name, 0, cb_init_mode, (void *)MODE_3X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK250R].name, 0, cb_init_mode, (void *)MODE_5X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250R].name, 0, cb_init_mode, (void *)MODE_6X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_7X_PSK250R].name, 0, cb_init_mode, (void *)MODE_7X_PSK250R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500R].name, 0, cb_init_mode, (void *)MODE_2X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK500R].name, 0, cb_init_mode, (void *)MODE_3X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500R].name, 0, cb_init_mode, (void *)MODE_4X_PSK500R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800R].name, 0, cb_init_mode, (void *)MODE_2X_PSK800R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000R].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { RTTY_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"THOR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THORMICRO].name, 0, cb_init_mode, (void *)MODE_THORMICRO, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR25x4].name, 0, cb_init_mode, (void *)MODE_THOR25x4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x1].name, 0, cb_init_mode, (void *)MODE_THOR50x1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x2].name, 0, cb_init_mode, (void *)MODE_THOR50x2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR100].name, 0, cb_init_mode, (void *)MODE_THOR100, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, //{ "Packet", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, //{ " 300 baud", 0, cb_pkt300, (void *)MODE_PACKET, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{ "1200 baud", 0, cb_pkt1200, (void *)MODE_PACKET, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{ "2400 baud", 0, cb_pkt2400, (void *)MODE_PACKET, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{0,0,0,0,0,0,0,0,0}, {"WEFAX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Navtex/SitorB", 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NULL].name, 0, cb_init_mode, (void *)MODE_NULL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, { OPMODES_FEWER, 0, cb_opmode_show, 0, FL_MENU_INVISIBLE, FL_NORMAL_LABEL, FL_HELVETICA_ITALIC, 14, 0 }, {0,0,0,0,0,0,0,0,0}, {_("&Configure"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { _("UI"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Colors && Fonts")), 0, (Fl_Callback*)cb_mnuConfigFonts, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Operator"), system_users_icon), 0, (Fl_Callback*)cb_mnuConfigOperator, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("User Interface")), 0, (Fl_Callback*)cb_mnuUI, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Waterfall"), waterfall_icon), 0, (Fl_Callback*)cb_mnuConfigWaterfall, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Waterfall controls")), 0, (Fl_Callback*)cb_mnuConfigWFcontrols, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { _("Operating"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Active Modem"), emblems_system_icon), 0, (Fl_Callback*)cb_mnuConfigModems, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Winkeyer"), emblems_system_icon), 0, (Fl_Callback*)cb_mnuConfigWinkeyer, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(RIGCONTROL_MLABEL, multimedia_player_icon), 0, (Fl_Callback*)cb_mnuConfigRigCtrl, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Sound Card"), audio_card_icon), 0, (Fl_Callback*)cb_mnuConfigSoundCard, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { _("Miscellaneous"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("CPU speed")), 0, (Fl_Callback*)cb_mnuConfigCPU_speed, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("NBEMS")), 0, (Fl_Callback*)cb_mnuConfigNBEMS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("PSKmail")), 0, (Fl_Callback*)cb_mnuConfigPSKmail, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("PSK reporter")), 0, (Fl_Callback*)cb_mnuConfigPSKreporter, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Sweet spot")), 0, (Fl_Callback*)cb_mnuConfigSweetspot, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Text IO")), 0, (Fl_Callback*)cb_mnuConfigTextIO, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("DTMF")), 0, (Fl_Callback*)cb_mnuConfigDTMF, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("WX")), 0, (Fl_Callback*)cb_mnuConfigWX, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("KML")), 0, (Fl_Callback*)cb_mnuConfigKML, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Autostart")), 0, (Fl_Callback*)cb_mnuConfigAutostart, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("IDs")), 0, (Fl_Callback*)cb_mnuConfigID, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("IO")), 0, (Fl_Callback*)cb_mnuConfigIO, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Notifications")), 0, (Fl_Callback*)cb_mnuConfigNotify, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("PSM")), 0, (Fl_Callback*)cb_mnuConfigPSM, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Test Signals")), 0, (Fl_Callback*)cb_mnuTestSignals, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { _("Contest/Logging"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("QRZ/eQSL"), net_icon), 0, (Fl_Callback*)cb_mnuConfigQRZ, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(CONTEST_MLABEL), 0, (Fl_Callback*)cb_mnuConfigContest, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("N3FJP logs")), 0, (Fl_Callback*)cb_n3fjp_logs, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("MacLogger")), 0, (Fl_Callback*)cb_maclogger, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Save Config"), save_icon), 0, (Fl_Callback*)cb_mnuSaveConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("View/Hide Channels")), 'c', (Fl_Callback*)cb_view_hide_channels, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Signal browser")), 'b', (Fl_Callback*)cb_mnuViewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("View/Hide 48 macros")), 'm', (Fl_Callback*)cb_48macros, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("DX Cluster")), 'd', (Fl_Callback*)cb_dxc_viewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Floating scope"), utilities_system_monitor_icon), 'f', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Spectrum scope"), utilities_system_monitor_icon), 's', (Fl_Callback*)cb_mnuSpectrum, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(THOR_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuThorViewRaw,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(IFKP_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuIfkpViewRaw,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_RX_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_rx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(COUNTRIES_MLABEL), 0, (Fl_Callback*)cb_mnuShowCountries, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Rig/Log Controls")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { RIGLOG_FULL_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_all, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { RIGLOG_PARTIAL_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_partial, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { RIGLOG_NONE_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_none, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Waterfall")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { DOCKEDSCOPE_MLABEL, 0, (Fl_Callback*)cb_mnuDockedscope, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, { WF_MLABEL, 0, (Fl_Callback*)cb_mnu_wf_all, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { _("&Logbook"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("View")), 'l', (Fl_Callback*)cb_mnuShowLogbook, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Files")), 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Open...")), 0, (Fl_Callback*)cb_mnuOpenLogbook, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Save")), 0, (Fl_Callback*)cb_mnuSaveLogbook, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("New")), 0, (Fl_Callback*)cb_mnuNewLogbook, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("ADIF")), 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Merge...")), 0, (Fl_Callback*)cb_mnuMergeADIF_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Export...")), 0, (Fl_Callback*)cb_mnuExportADIF_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("LoTW")), 0, (Fl_Callback*)cb_mnuConfigLoTW, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Reports")), 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Text...")), 0, (Fl_Callback*)cb_mnuExportTEXT_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("CSV...")), 0, (Fl_Callback*)cb_mnuExportCSV_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Cabrillo...")), 0, (Fl_Callback*)cb_Export_Cabrillo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { LOG_CONNECT_SERVER, 0, (Fl_Callback*)cb_log_server, 0, FL_MENU_TOGGLE | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Field Day Logging")), 0, (Fl_Callback*)cb_fd_viewer, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, {_("&Help"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, #ifndef NDEBUG // settle the gmfsk vs fldigi argument once and for all { icons::make_icon_label(_("Create sunspots"), weather_clear_icon), 0, cb_mnuFun, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, #endif { icons::make_icon_label(_("Beginners' Guide"), start_here_icon), 0, cb_mnuBeginnersURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Online documentation..."), help_browser_icon), 0, cb_mnuOnLineDOCS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Fldigi web site..."), net_icon), 0, cb_mnuVisitURL, (void *)PACKAGE_HOME, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Reception reports..."), pskr_icon), 0, cb_mnuVisitPSKRep, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Command line options"), utilities_terminal_icon), 0, cb_mnuCmdLineHelp, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Audio device info"), audio_card_icon), 0, cb_mnuAudioInfo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Build info"), executable_icon), 0, cb_mnuBuildInfo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Event log"), dialog_information_icon), 0, cb_mnuDebug, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Check for updates..."), system_software_update_icon), 0, cb_mnuCheckUpdate, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("&About"), help_about_icon), 'a', cb_mnuAboutURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, }; static int count_visible_items(Fl_Menu_Item* menu) { int n = 0; if (menu->flags & FL_SUBMENU) menu++; while (menu->label()) { if (!(menu->flags & FL_SUBMENU) && menu->visible()) n++; menu++; } return n; } static bool modes_hidden; static void cb_opmode_show(Fl_Widget* w, void*) { Fl_Menu_* m = (Fl_Menu_*)w; const char* label = m->mvalue()->label(); Fl_Menu_Item *item = 0, *first = 0, *last = 0; item = first = getMenuItem(OPMODES_MLABEL) + 1; if (!strcmp(label, OPMODES_ALL)) { last = getMenuItem(OPMODES_ALL); while (item != last) { if (item->label()) item->show(); item++; } menu_[m->value()].label(OPMODES_FEWER); modes_hidden = false; } else { last = getMenuItem(OPMODES_FEWER); while (item != last) { if (item->label() && item->callback() == cb_init_mode) { intptr_t mode = (intptr_t)item->user_data(); if (mode < NUM_MODES) { if (progdefaults.visible_modes.test(mode)) item->show(); else item->hide(); } } item++; } item = first; while (item != last) { if (item->flags & FL_SUBMENU) { if (count_visible_items(item)) item->show(); else item->hide(); } item++; } if (progdefaults.visible_modes.test(MODE_OLIVIA)) getMenuItem("Olivia")->show(); else getMenuItem("Olivia")->hide(); if (progdefaults.visible_modes.test(MODE_CONTESTIA)) getMenuItem("Contestia")->show(); else getMenuItem("Contestia")->hide(); if (progdefaults.visible_modes.test(MODE_RTTY)) getMenuItem("RTTY")->show(); else getMenuItem("RTTY")->hide(); if (progdefaults.visible_modes.test(MODE_IFKP)) getMenuItem("IFKP")->show(); else getMenuItem("IFKP")->hide(); if (progdefaults.visible_modes.test(MODE_FSQ)) getMenuItem("FSQ")->show(); else getMenuItem("FSQ")->hide(); menu_[m->value()].label(OPMODES_ALL); modes_hidden = true; } m->redraw(); } void toggle_visible_modes(Fl_Widget*, void*) { Fl_Menu_Item* show_modes = modes_hidden ? getMenuItem(OPMODES_ALL) : getMenuItem(OPMODES_FEWER); if (!(~progdefaults.visible_modes).none()) { // some modes disabled show_modes->label(OPMODES_FEWER); show_modes->show(); (show_modes - 1)->flags |= FL_MENU_DIVIDER; mnu->value(show_modes); show_modes->do_callback(mnu, (void*)0); } else { mnu->value(show_modes); show_modes->do_callback(mnu, (void*)0); show_modes->hide(); (show_modes - 1)->flags &= ~FL_MENU_DIVIDER; } } Fl_Menu_Item *getMenuItem(const char *caption, Fl_Menu_Item* submenu) { if (submenu == 0 || !(submenu->flags & FL_SUBMENU)) { if ( menu_->size() != sizeof(menu_)/sizeof(*menu_) ) { LOG_ERROR("FIXME: the menu_ table is corrupt!"); abort(); } submenu = menu_; } int size = submenu->size() - 1; Fl_Menu_Item *item = 0; const char* label; for (int i = 0; i < size; i++) { label = (submenu[i].labeltype() == _FL_MULTI_LABEL) ? icons::get_icon_label_text(&submenu[i]) : submenu[i].text; if (label && !strcmp(label, caption)) { item = submenu + i; break; } } if (!item) { LOG_ERROR("FIXME: could not find menu item \"%s\"", caption); abort(); } return item; } void activate_wefax_image_item(bool b) { /// Maybe do not do anything if the new modem has activated this menu item. /// This is necessary because of trx_start_modem_loop which deletes /// the current modem after the new one is created.. if( ( b == false ) && ( active_modem->get_cap() & modem::CAP_IMG ) && ( active_modem->get_mode() >= MODE_WEFAX_FIRST ) && ( active_modem->get_mode() <= MODE_WEFAX_LAST ) ) { return ; } Fl_Menu_Item *wefax_rx_item = getMenuItem(WEFAX_RX_IMAGE_MLABEL); if (wefax_rx_item) icons::set_active(wefax_rx_item, b); Fl_Menu_Item *wefax_tx_item = getMenuItem(WEFAX_TX_IMAGE_MLABEL); if (wefax_tx_item) icons::set_active(wefax_tx_item, b); } void activate_menu_item(const char *caption, bool val) { Fl_Menu_Item *m = getMenuItem(caption); icons::set_active(m, val); } void activate_mfsk_image_item(bool b) { Fl_Menu_Item *mfsk_item = getMenuItem(MFSK_IMAGE_MLABEL); if (mfsk_item) icons::set_active(mfsk_item, b); } void activate_thor_image_item(bool b) { Fl_Menu_Item *menu_item = getMenuItem(THOR_IMAGE_MLABEL); if (menu_item) icons::set_active(menu_item, b); } void activate_ifkp_image_item(bool b) { Fl_Menu_Item *menu_item = getMenuItem(IFKP_IMAGE_MLABEL); if (menu_item) icons::set_active(menu_item, b); } inline int rightof(Fl_Widget* w) { return w->x() + w->w(); } inline int leftof(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->x(); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); int lw = static_cast(ceil(fl_width(w->label()))); if (a & (FL_ALIGN_TOP | FL_ALIGN_BOTTOM)) { if (a & FL_ALIGN_LEFT) return w->x(); else if (a & FL_ALIGN_RIGHT) return w->x() - (lw > w->w() ? lw - w->w() : 0); else return w->x() - (lw > w->w() ? (lw - w->w())/2 : 0); } else { if (a & FL_ALIGN_LEFT) return w->x() - lw; else return w->x(); } } inline int above(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->y(); return (a & FL_ALIGN_TOP) ? w->y() + FL_NORMAL_SIZE : w->y(); } inline int below(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->y() + w->h(); return (a & FL_ALIGN_BOTTOM) ? w->y() + w->h() + FL_NORMAL_SIZE : w->y() + w->h(); } string argv_window_title; string main_window_title; string xcvr_title; void update_main_title() { string buf = argv_window_title; buf.append(" ver").append(PACKAGE_VERSION); if (!xcvr_title.empty()) { buf.append(" / ").append(xcvr_title); } buf.append(" - "); if (bWF_only) buf.append(_("waterfall-only mode")); else { buf.append(progdefaults.myCall.empty() ? _("NO CALLSIGN SET") : progdefaults.myCall.c_str()); if (progdefaults.logging > LOG_QSO && progdefaults.logging < LOG_SQSO) buf.append(" : ").append(contests[progdefaults.logging].name); if (progdefaults.logging == LOG_SQSO) { buf.append(" : ").append(QSOparties.qso_parties[progdefaults.SQSOcontest].contest); } if (progdefaults.logging == 0 && n3fjp_connected) { buf.append(" : N3FJP Amateur Contact Log"); } } if (fl_digi_main) { fl_digi_main->copy_label(buf.c_str()); fl_digi_main->redraw(); } } void showOpBrowserView(Fl_Widget *, void *) { if (RigViewerFrame->visible()) return CloseQsoView(); Logging_frame->hide(); RigViewerFrame->show(); qso_opPICK->box(FL_DOWN_BOX); qso_opBrowser->take_focus(); qso_opPICK->tooltip(_("Close List")); } void CloseQsoView() { RigViewerFrame->hide(); Logging_frame->show(); qso_opPICK->box(FL_UP_BOX); qso_opPICK->tooltip(_("Open List")); if (restore_minimize) { restore_minimize = false; UI_select(); } } void showOpBrowserView2(Fl_Widget *w, void *) { restore_minimize = true; UI_select(); showOpBrowserView(w, NULL); } void cb_qso_btnSelFreq(Fl_Widget *, void *) { qso_selectFreq(); } void cb_qso_btnDelFreq(Fl_Widget *, void *) { qso_delFreq(); } void cb_qso_btnAddFreq(Fl_Widget *, void *) { qso_addFreq(); } void cb_qso_btnClearList(Fl_Widget *, void *) { if (quick_choice(_("Clear list?"), 2, _("Confirm"), _("Cancel"), NULL) == 1) clearList(); } void cb_qso_inpAct(Fl_Widget*, void*) { string data, url; data.reserve(128); url = "http://pskreporter.info/cgi-bin/psk-freq.pl"; url.append("?mode=").append(mode_info[active_modem->get_mode()].adif_name); if (qso_inpAct->size()) url.append("&?grid=").append(qso_inpAct->value()); else if (progdefaults.myLocator.length() > 2) url.append("&?grid=").append(progdefaults.myLocator, 0, 2); string::size_type i; if (!get_http(url, data, 10.0) || // if (!get_http_gui(url, data, 10.0) || (i = data.find("\r\n\r\n")) == string::npos) { LOG_ERROR("Error while fetching \"%s\": %s", url.c_str(), data.c_str()); return; } i += strlen("\r\n\r\n"); re_t re("([[:digit:]]{6,}) [[:digit:]]+ ([[:digit:]]+)[[:space:]]+", REG_EXTENDED); const size_t menu_max = 8; Fl_Menu_Item menu[menu_max + 1]; string str[menu_max]; size_t j = 0; memset(menu, 0, sizeof(menu)); while (re.match(data.c_str() + i) && j < menu_max) { i += re.submatch(0).length(); str[j].assign(re.submatch(1)).append(" (").append(re.submatch(2)). append(" ").append(atoi(re.submatch(2).c_str()) == 1 ? _("report") : _("reports")).append(")"); menu[j].label(str[j].c_str()); menu[++j].label(NULL); } if ((i = data.find(" grid ", i)) != string::npos) data.assign(data, i + strlen(" grid"), 3); else data = " (?)"; if (j) data.insert(0, _("Recent activity for grid")); else data = "No recent activity"; if ((j = quick_choice_menu(data.c_str(), 1, menu))) qsy(strtoll(str[j - 1].erase(str[j - 1].find(' ')).c_str(), NULL, 10)); } static int i_opUsage; static string s_opEntry; static string s_opUsageEntry; static string s_outEntry; void cb_opUsageEnter(Fl_Button *, void*) { s_opUsageEntry = opUsage->value(); s_opEntry.append(s_opUsageEntry); qso_opBrowser->text(i_opUsage, s_opEntry.c_str()); qso_updateEntry(i_opUsage, s_opUsageEntry); opUsageFrame->hide(); qso_opBrowser->show(); } void qso_opBrowser_amend(int i) { size_t pos; s_opEntry = qso_opBrowser->text(i); pos = s_opEntry.rfind('|'); s_opUsageEntry = s_opEntry.substr(pos+1); s_opEntry.erase(pos + 1); s_outEntry = s_opEntry.substr(0, pos); while ((pos = s_outEntry.find('|')) != string::npos) s_outEntry.replace(pos, 1, " "); opOutUsage->value(s_outEntry.c_str()); opUsage->value(s_opUsageEntry.c_str()); i_opUsage = i; qso_opBrowser->hide(); opUsageFrame->show(); } void cb_qso_opBrowser(Fl_Browser*, void*) { int i = qso_opBrowser->value(); if (!i) return; // This makes the multi browser behave more like a hold browser, // but with the ability to invoke the callback via space/return. qso_opBrowser->deselect(); qso_opBrowser->select(i); int ikey = Fl::event_key(); switch (ikey) { case FL_Enter: case FL_KP_Enter: case FL_Button + FL_LEFT_MOUSE: if (ikey == FL_Button + FL_LEFT_MOUSE && !Fl::event_clicks()) break; qso_selectFreq(); CloseQsoView(); break; case ' ': case FL_Button + FL_RIGHT_MOUSE: if ((Fl::event_state() & FL_SHIFT) == FL_SHIFT) { qso_opBrowser_amend(i); } else qso_setFreq(); break; case FL_Button + FL_MIDDLE_MOUSE: i = qso_opBrowser->value(); qso_delFreq(); qso_addFreq(); qso_opBrowser->select(i); break; } } void _show_frequency(long long freq) { qsoFreqDisp1->value(freq); qsoFreqDisp2->value(freq); qsoFreqDisp3->value(freq); // if (FD_logged_on) FD_band_check(); } void show_frequency(long long freq) { REQ(_show_frequency, freq); } void show_mode(const string sMode) { REQ(&Fl_ListBox::put_value, qso_opMODE, sMode.c_str()); } void show_bw(const string sWidth) { REQ(&Fl_ListBox::put_value, qso_opBW, sWidth.c_str()); } void show_bw1(const string sVal) { REQ(&Fl_ListBox::put_value, qso_opBW1, sVal.c_str()); } void show_bw2(const string sVal) { REQ(&Fl_ListBox::put_value, qso_opBW2, sVal.c_str()); } void show_spot(bool v) { //if (bWF_only) return; static bool oldval = false; if (v) { mnu->size(btnAutoSpot->x(), mnu->h()); if (oldval) progStatus.spot_recv = true; btnAutoSpot->value(progStatus.spot_recv); btnAutoSpot->activate(); } else { btnAutoSpot->deactivate(); oldval = btnAutoSpot->value(); btnAutoSpot->value(v); btnAutoSpot->do_callback(); mnu->size(btnRSID->x(), mnu->h()); } mnu->redraw(); } void setTabColors() { tabsColors->selection_color(progdefaults.TabsColor); tabsConfigure->selection_color(progdefaults.TabsColor); tabsUI->selection_color(progdefaults.TabsColor); tabsWaterfall->selection_color(progdefaults.TabsColor); tabsModems->selection_color(progdefaults.TabsColor); tabsCW->selection_color(progdefaults.TabsColor); tabsRig->selection_color(progdefaults.TabsColor); tabsSoundCard->selection_color(progdefaults.TabsColor); tabsMisc->selection_color(progdefaults.TabsColor); tabsID->selection_color(progdefaults.TabsColor); tabsQRZ->selection_color(progdefaults.TabsColor); if (dlgConfig->visible()) dlgConfig->redraw(); if (dxcluster_viewer) { cluster_tabs->selection_color(progdefaults.TabsColor); if (dxcluster_viewer->visible()) dxcluster_viewer->redraw(); } } void showMacroSet() { set_macroLabels(); } void showDTMF(const string s) { string dtmfstr = "\n "; dtmfstr.append(s); ReceiveText->addstr(dtmfstr); } void setwfrange() { wf->opmode(); } void sync_cw_parameters() { active_modem->sync_parameters(); active_modem->update_Status(); } void cb_cntCW_WPM(Fl_Widget * w, void *v) { Fl_Counter2 *cnt = (Fl_Counter2 *) w; if (progStatus.WK_online && progStatus.WK_use_pot) { cnt->value(progStatus.WK_speed_wpm); return; } if (progStatus.WK_online && cnt->value() > 55) cnt->value(55); if (use_nanoIO && cnt->value() > 60) cnt->value(60); if (use_nanoIO && cnt->value() < 5) cnt->value(5); progdefaults.CWspeed = (int)cnt->value(); sldrCWxmtWPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); if (progStatus.WK_online) WK_set_wpm(); restoreFocus(25); } void cb_btnCW_Default(Fl_Widget *w, void *v) { active_modem->toggleWPM(); restoreFocus(26); } static void cb_mainViewer_Seek(Fl_Input *, void *) { static const Fl_Color seek_color[2] = { FL_FOREGROUND_COLOR, adjust_color(FL_RED, FL_BACKGROUND2_COLOR) }; // invalid RE seek_re.recompile(*txtInpSeek->value() ? txtInpSeek->value() : "[invalid"); if (txtInpSeek->textcolor() != seek_color[!seek_re]) { txtInpSeek->textcolor(seek_color[!seek_re]); txtInpSeek->redraw(); } progStatus.browser_search = txtInpSeek->value(); if (viewer_inp_seek) viewer_inp_seek->value(progStatus.browser_search.c_str()); } static void cb_cntTxLevel(Fl_Counter2* o, void*) { progdefaults.txlevel = o->value(); } static void cb_mainViewer(Fl_Hold_Browser*, void*) { int sel = mainViewer->value(); if (sel == 0 || sel > progdefaults.VIEWERchannels) return; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (mainViewer->freq(sel) != NULLFREQ) { if (progdefaults.VIEWERhistory){ ReceiveText->addchr('\n', FTextBase::RECV); bHistory = true; } else { ReceiveText->addchr('\n', FTextBase::ALTR); ReceiveText->addstr(mainViewer->line(sel), FTextBase::ALTR); } active_modem->set_freq(mainViewer->freq(sel)); recenter_spectrum_viewer(); active_modem->set_sigsearch(SIGSEARCH); if (brwsViewer) brwsViewer->select(sel); } else mainViewer->deselect(); break; case FL_MIDDLE_MOUSE: // copy from modem // set_freq(sel, active_modem->get_freq()); break; case FL_RIGHT_MOUSE: // reset { int ch = progdefaults.VIEWERascend ? progdefaults.VIEWERchannels - sel : sel - 1; active_modem->clear_ch(ch); mainViewer->deselect(); if (brwsViewer) brwsViewer->deselect(); break; } default: break; } } void widget_color_font(Fl_Widget *widget) { widget->labelsize(progdefaults.LOGGINGtextsize); widget->labelfont(progdefaults.LOGGINGtextfont); widget->labelcolor(progdefaults.LOGGINGtextcolor); widget->color(progdefaults.LOGGINGcolor); widget->redraw_label(); widget->redraw(); } void input_color_font(Fl_Input *input) { input->textsize(progdefaults.LOGGINGtextsize); input->textfont(progdefaults.LOGGINGtextfont); input->textcolor(progdefaults.LOGGINGtextcolor); input->color(progdefaults.LOGGINGcolor); input->redraw(); } void counter_color_font(Fl_Counter2 * cntr) { cntr->textsize(progdefaults.LOGGINGtextsize); cntr->textfont(progdefaults.LOGGINGtextfont); cntr->textcolor(progdefaults.LOGGINGtextcolor); cntr->textbkcolor(progdefaults.LOGGINGcolor); cntr->redraw(); } void combo_color_font(Fl_ComboBox *cbo) { cbo->color(progdefaults.LOGGINGcolor); cbo->selection_color(progdefaults.LOGGINGcolor); cbo->textfont(progdefaults.LOGGINGtextfont); cbo->textsize(progdefaults.LOGGINGtextsize); cbo->textcolor(progdefaults.LOGGINGtextcolor); cbo->redraw(); cbo->redraw_label(); } void LOGGING_colors_font() { Fl_Input* in[] = { inpFreq1, inpCall1, inpCall2, inpCall3, inpCall4, inpName1, inpName2, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5, inpTimeOff1, inpTimeOff2, inpTimeOff3, inpTimeOff4, inpTimeOff5, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc, inpAZ, inpVEprov, inpState1, inpLoc1, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, outSerNo3, outSerNo4, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_class2, inp_FD_section1, inp_FD_section2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_CQ_RSTin2, inp_CQ_RSTout2, inp_CQzone1, inp_CQzone2, inp_CQstate1, inp_CQstate2, inp_CQDX_RSTin2, inp_CQDX_RSTout2, inp_CQDXzone1, inp_CQDXzone2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inpNAQPname2, inp_name_NAS2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_RSTin2, inpRTU_RSTout2, inpRTU_serno1, inpRTU_serno2, outSerNo4, inp_ser_NAS1, inpSPCnum_NAS1, outSerNo5, inp_ser_NAS2, inpSPCnum_NAS2, inpSerNo3, inpSerNo4, outSerNo7, outSerNo8, inpRstIn3, inpRstOut3, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_troop1, inp_JOTA_troop2, inp_JOTA_spc1, inp_JOTA_spc2, inpRstIn_AICW2, inpRstOut_AICW2, inpSPCnum_AICW1, inpSPCnum_AICW2 }; for (size_t i = 0; i < sizeof(in)/sizeof(*in); i++) { input_color_font(in[i]); } input_color_font(inpNotes); // buttons, boxes Fl_Widget *wid[] = { MODEstatus, Status1, Status2, StatusBar, WARNstatus }; for (size_t i = 0; i < sizeof(wid)/sizeof(*wid); i++) widget_color_font(wid[i]); // counters counter_color_font(cntCW_WPM); counter_color_font(cntTxLevel); counter_color_font(wf->wfRefLevel); counter_color_font(wf->wfAmpSpan); counter_color_font(wf->wfcarrier); // combo boxes Fl_ComboBox *cbo_widgets[] = { qso_opMODE, qso_opBW, qso_opBW1, qso_opBW2, cboCountyQSO, cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(cbo_widgets)/sizeof(*cbo_widgets); i++) { combo_color_font(cbo_widgets[i]); } fl_digi_main->redraw(); } inline void inp_font_pos(Fl_Input2* inp, int x, int y, int w, int h) { inp->textsize(progdefaults.LOGBOOKtextsize); inp->textfont(progdefaults.LOGBOOKtextfont); inp->textcolor(progdefaults.LOGBOOKtextcolor); inp->color(progdefaults.LOGBOOKcolor); inp->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 12 ? 12 : (ls > 14 ? 14 : ls); inp->labelsize(ls); inp->redraw_label(); inp->resize(x, y, w, h); inp->redraw(); } inline void date_font_pos(Fl_DateInput* inp, int x, int y, int w, int h) { inp->textsize(progdefaults.LOGBOOKtextsize); inp->textfont(progdefaults.LOGBOOKtextfont); inp->textcolor(progdefaults.LOGBOOKtextcolor); inp->color(progdefaults.LOGBOOKcolor); inp->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 10 ? 10 : (ls > 14 ? 14 : ls); inp->labelsize(ls); inp->redraw_label(); inp->resize(x, y, w, h); } inline void btn_font_pos(Fl_Widget* btn, int x, int y, int w, int h) { btn->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 10 ? 10 : (ls > 14 ? 14 : ls); btn->labelsize(ls); btn->redraw_label(); btn->resize(x, y, w, h); btn->redraw(); } inline void tab_font_pos(Fl_Widget* tab, int x, int y, int w, int h, int ls) { tab->labelfont(progdefaults.LOGBOOKtextfont); tab->labelsize(ls); tab->redraw_label(); tab->resize(x, y, w, h); tab->redraw(); } inline void chc_font_pos(Fl_Choice* chc, int x, int y, int w, int h) { chc->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 10 ? 10 : (ls > 14 ? 14 : ls); chc->labelsize(ls); chc->redraw_label(); chc->resize(x, y, w, h); chc->redraw(); } void LOGBOOK_colors_font() { if (!dlgLogbook) return; int ls = progdefaults.LOGBOOKtextsize; // input / output / date / text fields fl_font(progdefaults.LOGBOOKtextfont, ls); int wh = fl_height() + 4;// + 8; int width_date = fl_width("888888888") + wh; int width_time = fl_width("23:59:599"); int width_freq = fl_width("WW/WW8WWW/WW.");//fl_width("99.9999999"); int width_rst = fl_width("5999"); int width_pwr = fl_width("0000"); int width_loc = fl_width("XX88XXX"); int width_mode = fl_width("CONTESTIA"); int width_state = fl_width("WWWW"); int width_province = fl_width("WWW."); int width_country = fl_width("WWWWWWWWWWWWWWWWWWWW"); int dlg_width = 2 + width_date + 2 + width_time + 2 + width_freq + 2 + width_mode + 2 + width_pwr + 2 + width_rst + 2 + width_loc + 2; int newheight = 4*(wh + 20) + 3*wh + 2 + wh + 2 + wBrowser->h() + 2; //+ 24; if (dlg_width > progStatus.logbook_w) progStatus.logbook_w = dlg_width; else dlg_width = progStatus.logbook_w; if (newheight > progStatus.logbook_h) progStatus.logbook_h = newheight; else newheight = progStatus.logbook_h; dlgLogbook->resize( dlgLogbook->x(), dlgLogbook->y(), progStatus.logbook_w, progStatus.logbook_h); // row1 int ypos = 24; // date on int xpos = 2; date_font_pos(inpDate_log, xpos, ypos, width_date, wh); // timeon xpos += width_date + 2; inp_font_pos(inpTimeOn_log, xpos, ypos, width_time, wh); // call xpos += width_time + 2; inp_font_pos(inpCall_log, xpos, ypos, width_freq, wh); // name xpos += width_freq + 2; int wname = dlg_width - xpos - width_rst - width_loc - 6; inp_font_pos(inpName_log, xpos, ypos, wname, wh); // rcvd RST xpos += wname + 2; inp_font_pos(inpRstR_log, xpos, ypos, width_rst, wh); // nbr records xpos += width_rst + 2; inp_font_pos(txtNbrRecs_log, xpos, ypos, width_loc, wh); // row2 ypos += wh + 20; //date off xpos = 2; date_font_pos(inpDateOff_log, xpos, ypos, width_date, wh); //time off xpos += width_date + 2; inp_font_pos(inpTimeOff_log, xpos, ypos, width_time, wh); //frequency xpos += width_time + 2; inp_font_pos(inpFreq_log, xpos, ypos, width_freq, wh); //mode xpos += width_freq + 2; int wmode = dlg_width - xpos - width_rst - width_pwr - width_loc - 8; inp_font_pos(inpMode_log, xpos, ypos, wmode, wh); //power xpos += wmode + 2; inp_font_pos(inpTX_pwr_log, xpos, ypos, width_pwr, wh); //sent RST xpos += width_pwr + 2; inp_font_pos(inpRstS_log, xpos, ypos, width_rst, wh); // locator xpos += width_rst + 2; inp_font_pos(inpLoc_log, xpos, ypos, width_loc, wh); // row 3 // QTH ypos += wh + 20; xpos = 2; int wqth = dlg_width - 4 - width_state - 2 - width_province - 2 - width_country - 2; inp_font_pos(inpQth_log, xpos, ypos, wqth, wh); // state xpos += wqth + 2; inp_font_pos(inpState_log, xpos, ypos, width_state, wh); // province xpos += width_state + 2; inp_font_pos(inpVE_Prov_log, xpos, ypos, width_province, wh); // country xpos += width_province + 2; inp_font_pos(inpCountry_log, xpos, ypos, width_country, wh); ypos += wh + 2; grpTabsSearch->position(0, ypos); Tabs->position(2, grpTabsSearch->y() + 2); inp_font_pos(inpSearchString, Tabs->x() + Tabs->w() + 4, Tabs->y() + 30, dlgLogbook->w() - Tabs->w() - 8, wh); int tab_h = wh * 14 / progdefaults.LOGBOOKtextsize; int tab_grp_h = 4 * wh + 4; // Tabs->resize(2, ypos, dlg_width - 6 - inpSearchString->w(), tab_grp_h + tab_h); Tabs->selection_color(progdefaults.TabsColor); tab_font_pos(tab_log_qsl, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); tab_font_pos(tab_log_contest, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); tab_font_pos(tab_log_other, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); tab_font_pos(tab_log_notes, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); Fl_Input2* qso_fields[] = { inpTimeOn_log, inpCall_log, inpName_log, inpRstR_log, inpTimeOff_log, inpFreq_log, inpMode_log, inpTX_pwr_log, inpRstS_log, inpQth_log, inpState_log, inpVE_Prov_log, inpLoc_log, inpCountry_log, inpQSL_VIA_log, inpCNTY_log, inpIOTA_log, inpCQZ_log, inpCONT_log, inpITUZ_log, inpDXCC_log, inpNotes_log, inp_log_sta_call, inp_log_op_call, inp_log_sta_qth, inp_log_sta_loc, inpSerNoOut_log, inpMyXchg_log, inpSerNoIn_log, inpXchgIn_log, inpClass_log, inpSection_log, inp_age_log, inp_1010_log, inpBand_log, inp_check_log, inp_log_cwss_serno, inp_log_cwss_sec, inp_log_cwss_prec, inp_log_cwss_chk, inp_log_troop_s, inp_log_troop_r, inp_log_scout_s, inp_log_scout_r, inpSearchString, txtNbrRecs_log }; Fl_DateInput* dti[] = { inp_export_start_date, inp_export_stop_date, inpDate_log, inpDateOff_log, inpQSLrcvddate_log, inpEQSLrcvddate_log, inpLOTWrcvddate_log, inpQSLsentdate_log, inpEQSLsentdate_log, inpLOTWsentdate_log }; for (size_t i = 0; i < sizeof(qso_fields) / sizeof(*qso_fields); i++) inp_font_pos( qso_fields[i], qso_fields[i]->x(), qso_fields[i]->y(), qso_fields[i]->w(), wh); for (size_t i = 0; i < sizeof(dti) / sizeof(*dti); i++) date_font_pos( dti[i], dti[i]->x(), dti[i]->y(), dti[i]->w(), wh); inpNotes_log->resize( tab_log_notes->x() + 2, tab_log_notes->y() + 4, tab_log_notes->w() - 4, tab_log_notes->h() - 6); ypos += grpTabsSearch->h() + 2; grpFileButtons->resize(0, ypos, dlgLogbook->w(), grpFileButtons->h()); grpFileButtons->redraw(); txtLogFile->textsize(ls); txtLogFile->textfont(progdefaults.LOGBOOKtextfont); txtLogFile->textcolor(progdefaults.LOGBOOKtextcolor); txtLogFile->color(progdefaults.LOGBOOKcolor); ypos += grpFileButtons->h() + 2; wBrowser->font(progdefaults.LOGBOOKtextfont); wBrowser->fontsize(progdefaults.LOGBOOKtextsize); wBrowser->color(progdefaults.LOGBOOKcolor); wBrowser->selection_color(FL_SELECTION_COLOR); int datewidth = wBrowser->columnWidth(0); int timewidth = wBrowser->columnWidth(1); int callwidth = wBrowser->columnWidth(2); int namewidth = wBrowser->columnWidth(3); int freqwidth = wBrowser->columnWidth(4); int modewidth = wBrowser->columnWidth(5); int totalwidth = datewidth + timewidth + callwidth + namewidth + freqwidth + modewidth; int nuwidth = dlgLogbook->w() - 2*wBrowser->x(); wBrowser->resize(wBrowser->x(), ypos, nuwidth, dlgLogbook->h() - 2 - ypos); nuwidth -= wBrowser->vScrollWidth(); datewidth *= (1.0 * nuwidth / totalwidth); timewidth *= (1.0 * nuwidth / totalwidth); callwidth *= (1.0 * nuwidth / totalwidth); freqwidth *= (1.0 * nuwidth / totalwidth); modewidth *= (1.0 * nuwidth / totalwidth); namewidth = nuwidth - datewidth - timewidth - callwidth - freqwidth - modewidth; wBrowser->columnWidth (0, datewidth); // Date column wBrowser->columnWidth (1, timewidth); // Time column wBrowser->columnWidth (2, callwidth); // Callsign column wBrowser->columnWidth (3, namewidth); // Name column wBrowser->columnWidth (4, freqwidth); // Frequency column wBrowser->columnWidth (5, modewidth); // Mode column dlgLogbook->init_sizes(); dlgLogbook->damage(); dlgLogbook->redraw(); } void set_smeter_colors() { Fl_Color clr = fl_rgb_color( progdefaults.Smeter_bg_color.R, progdefaults.Smeter_bg_color.G, progdefaults.Smeter_bg_color.B); smeter->set_background(clr); clr = fl_rgb_color( progdefaults.Smeter_meter_color.R, progdefaults.Smeter_meter_color.G, progdefaults.Smeter_meter_color.B); smeter->set_metercolor(clr); clr = fl_rgb_color( progdefaults.Smeter_scale_color.R, progdefaults.Smeter_scale_color.G, progdefaults.Smeter_scale_color.B); smeter->set_scalecolor(clr); smeter->redraw(); clr = fl_rgb_color( progdefaults.PWRmeter_bg_color.R, progdefaults.PWRmeter_bg_color.G, progdefaults.PWRmeter_bg_color.B); pwrmeter->set_background(clr); clr = fl_rgb_color( progdefaults.PWRmeter_meter_color.R, progdefaults.PWRmeter_meter_color.G, progdefaults.PWRmeter_meter_color.B); pwrmeter->set_metercolor(clr); clr = fl_rgb_color( progdefaults.PWRmeter_scale_color.R, progdefaults.PWRmeter_scale_color.G, progdefaults.PWRmeter_scale_color.B); pwrmeter->set_scalecolor(clr); pwrmeter->select(progdefaults.PWRselect); pwrmeter->redraw(); } void FREQ_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_FREQ) s.erase(MAX_FREQ); w->value(s.c_str()); } void TIME_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_TIME) s.erase(MAX_TIME); w->value(s.c_str()); } void RST_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_RST) s.erase(MAX_RST); w->value(s.c_str()); } void CALL_callback(Fl_Input2 *w) { cb_call(w, NULL); } void NAME_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_NAME) s.erase(MAX_NAME); w->value(s.c_str()); } void AZ_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_AZ) s.erase(MAX_AZ); w->value(s.c_str()); } void QTH_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_QTH) s.erase(MAX_QTH); w->value(s.c_str()); } void STATE_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_STATE) s.erase(MAX_STATE); w->value(s.c_str()); } void VEPROV_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_STATE) s.erase(MAX_STATE); w->value(s.c_str()); } void LOC_callback(Fl_Input2 *w) { cb_loc(w, NULL); } void SERNO_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_SERNO) s.erase(MAX_SERNO); w->value(s.c_str()); } void XCHG_IN_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_XCHG_IN) s.erase(MAX_XCHG_IN); w->value(s.c_str()); } void COUNTRY_callback(Fl_ComboBox *w) { std::string s; s = w->value(); if (s.length() > MAX_COUNTRY) s.erase(MAX_COUNTRY); if (country_test(s)) w->value(country_match.c_str()); else w->value(s.c_str()); } void COUNTY_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_COUNTY) s.erase(MAX_COUNTY); w->value(s.c_str()); } void NOTES_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_NOTES) s.erase(MAX_NOTES); w->value(s.c_str()); } void log_callback(Fl_Widget *w) { if (w == inpCall) { n3fjp_calltab = true; CALL_callback((Fl_Input2 *)w); DupCheck(); return; } if (w == inpName) { NAME_callback((Fl_Input2 *)w); return; } if (w == cboCountry) { COUNTRY_callback((Fl_ComboBox *)w); return; } if (w == inpCounty) { COUNTY_callback((Fl_Input2 *)w); return; } if (w == inpNotes) { NOTES_callback((Fl_Input2 *)w); return; } if (w == inpLoc) { LOC_callback((Fl_Input2 *)w); return; } if (w == inpXchgIn) { XCHG_IN_callback((Fl_Input2 *)w); DupCheck(); return; } if (w == inpState) { STATE_callback((Fl_Input2 *)w); return; } if (w == inpVEprov) { VEPROV_callback((Fl_Input2 *)w); return; } if (w == inpQTH) { QTH_callback((Fl_Input2 *)w); return; } if (w == inpAZ) { AZ_callback((Fl_Input2 *)w); return; } if (w == inpSerNo) { SERNO_callback((Fl_Input2 *)w); return; } if (w == inpRstIn) { RST_callback((Fl_Input2 *)w); return; } if (w == inpTimeOff || w == inpTimeOn) { TIME_callback((Fl_Input2 *)w); return; } // LOG_ERROR("unknown widget %p", w); } void cb_CountyQSO(Fl_Widget *) { string sc = cboCountyQSO->value(); if (sc.empty()) return; Cstates st; string ST = sc.substr(0,2); string CNTY = st.cnty_short(sc.substr(0,2), sc.substr(3)); if (inpState) inpState->value(ST.c_str()); if (inpState1) inpState1->value(ST.c_str()); if (inp_CQstate1) inp_CQstate1->value(ST.c_str()); if (inp_CQstate2) inp_CQstate2->value(ST.c_str()); if (inpSQSO_state1) inpSQSO_state1->value(ST.c_str()); if (inpSQSO_state2) inpSQSO_state2->value(ST.c_str()); if (inpSQSO_county1) inpSQSO_county1->value(CNTY.c_str()); if (inpSQSO_county2) inpSQSO_county2->value(CNTY.c_str()); } void cb_meters(Fl_Widget *) { if (!rigCAT_active()) return; pwrlevel_grp->show(); } void cb_set_pwr_level(void *) { rigCAT_set_pwrlevel((int)pwr_level->value()); } void cb_exit_pwr_level(void*) { pwrlevel_grp->hide(); } #include "fl_digi_main.cxx" void cb_mnuAltDockedscope(Fl_Menu_ *w, void *d); static Fl_Menu_Item alt_menu_[] = { {_("&File"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Exit"), log_out_icon), 'x', (Fl_Callback*)cb_E, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("Op &Mode"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Contestia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MT63", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Olivia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"QPSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"8PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125].name, 0, cb_init_mode, (void *)MODE_8PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1200F].name, 0, cb_init_mode, (void *)MODE_8PSK1200F, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSKR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"RTTY", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"THOR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NULL].name, 0, cb_init_mode, (void *)MODE_NULL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("&Configure"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Waterfall"), waterfall_icon), 0, (Fl_Callback*)cb_mnuConfigWaterfall, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(RIGCONTROL_MLABEL, multimedia_player_icon), 0, (Fl_Callback*)cb_mnuConfigRigCtrl, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Sound Card"), audio_card_icon), 0, (Fl_Callback*)cb_mnuConfigSoundCard, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Active Modem"), emblems_system_icon), 0, (Fl_Callback*)cb_mnuConfigModems, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("IDs")), 0, (Fl_Callback*)cb_mnuConfigID, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("IO")), 0, (Fl_Callback*)cb_mnuConfigIO, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("PSM")), 0, (Fl_Callback*)cb_mnuConfigPSM, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Notifications")), 0, (Fl_Callback*)cb_mnuConfigNotify, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Test Signals")), 0, (Fl_Callback*)cb_mnuTestSignals, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Save Config"), save_icon), 0, (Fl_Callback*)cb_mnuSaveConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(THOR_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuThorViewRaw,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(IFKP_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuIfkpViewRaw,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_RX_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_rx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Signal Browser")), 0, (Fl_Callback*)cb_mnuViewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Spectrum scope")), 0, (Fl_Callback*)cb_mnuSpectrum, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { DOCKEDSCOPE_MLABEL, 0, (Fl_Callback*)cb_mnuAltDockedscope, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("&Help"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Online documentation..."), help_browser_icon), 0, cb_mnuOnLineDOCS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Event log"), dialog_information_icon), 0, cb_mnuDebug, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Check for updates..."), system_software_update_icon), 0, cb_mnuCheckUpdate, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("&About"), help_about_icon), 'a', cb_mnuAboutURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, }; void cb_mnuAltDockedscope(Fl_Menu_ *w, void *d) { Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label(), alt_menu_); progStatus.DOCKEDSCOPE = m->value(); wf->show_scope(progStatus.DOCKEDSCOPE); } #define defwidget 0, 0, 10, 10, "" void noop_controls() // create and then hide all controls not being used { Fl_Double_Window *dummywindow = new Fl_Double_Window(0,0,100,100,""); btnMacroTimer = new Fl_Button(defwidget); btnMacroTimer->hide(); ReceiveText = new FTextRX(0,0,100,100); ReceiveText->hide(); TransmitText = new FTextTX(0,0,100,100); TransmitText->hide(); FHdisp = new Raster(0,0,10,100); FHdisp->hide(); for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) { btnMacro[i] = new Fl_Button(defwidget); btnMacro[i]->hide(); } for (int i = 0; i < 48; i++) { btnDockMacro[i] = new Fl_Button(defwidget); btnDockMacro[i]->hide(); } inpQth = new Fl_Input2(defwidget); inpQth->hide(); inpLoc1 = new Fl_Input2(defwidget); inpLoc1->hide(); inpState1 = new Fl_Input2(defwidget); inpState1->hide(); cboCountryQSO = new Fl_ComboBox(defwidget); cboCountryQSO->end(); cboCountryQSO->hide(); cboCountyQSO = new Fl_ComboBox(defwidget); cboCountyQSO->hide(); cboCountyQSO->hide(); inpSerNo = new Fl_Input2(defwidget); inpSerNo->hide(); outSerNo = new Fl_Input2(defwidget); outSerNo->hide(); inpXchgIn = new Fl_Input2(defwidget); inpXchgIn->hide(); inpVEprov = new Fl_Input2(defwidget); inpVEprov->hide(); inpNotes = new Fl_Input2(defwidget); inpNotes->hide(); inpAZ = new Fl_Input2(defwidget); inpAZ->hide(); qsoTime = new Fl_Button(defwidget); qsoTime->hide(); btnQRZ = new Fl_Button(defwidget); btnQRZ->hide(); qsoClear = new Fl_Button(defwidget); qsoClear->hide(); qsoSave = new Fl_Button(defwidget); qsoSave->hide(); qsoFreqDisp = new cFreqControl(0,0,80,20,""); qsoFreqDisp->hide(); qso_opMODE = new Fl_ListBox(defwidget); qso_opMODE->hide(); qso_opBW = new Fl_ListBox(defwidget); qso_opBW->hide(); qso_opPICK = new Fl_Button(defwidget); qso_opPICK->hide(); qso_opGROUP = new Fl_Group(defwidget); qso_opGROUP->hide(); inpFreq = new Fl_Input2(defwidget); inpFreq->hide(); inpTimeOff = new Fl_Input2(defwidget); inpTimeOff->hide(); inpTimeOn = new Fl_Input2(defwidget); inpTimeOn->hide(); btnTimeOn = new Fl_Button(defwidget); btnTimeOn->hide(); inpCall = new Fl_Input2(defwidget); inpCall->hide(); inpName = new Fl_Input2(defwidget); inpName->hide(); inpRstIn = new Fl_Input2(defwidget); inpRstIn->hide(); inpRstOut = new Fl_Input2(defwidget); inpRstOut->hide(); inpFreq1 = new Fl_Input2(defwidget); inpFreq1->hide(); inpTimeOff1 = new Fl_Input2(defwidget); inpTimeOff1->hide(); inpTimeOn1 = new Fl_Input2(defwidget); inpTimeOn1->hide(); btnTimeOn1 = new Fl_Button(defwidget); btnTimeOn1->hide(); inpCall1 = new Fl_Input2(defwidget); inpCall1->hide(); inpName1 = new Fl_Input2(defwidget); inpName1->hide(); inpRstIn1 = new Fl_Input2(defwidget); inpRstIn1->hide(); inpRstOut1 = new Fl_Input2(defwidget); inpRstOut1->hide(); inpXchgIn1 = new Fl_Input2(defwidget); inpXchgIn1->hide(); outSerNo1 = new Fl_Input2(defwidget); outSerNo1->hide(); inpSerNo1 = new Fl_Input2(defwidget); inpSerNo1->hide(); qsoFreqDisp1 = new cFreqControl(0,0,80,20,""); qsoFreqDisp1->hide(); inp_FD_class1 = new Fl_Input2(defwidget); inp_FD_class1->hide(); inp_FD_class2 = new Fl_Input2(defwidget); inp_FD_class2->hide(); inp_FD_section1 = new Fl_Input2(defwidget); inp_FD_section1->hide(); inp_FD_section2 = new Fl_Input2(defwidget); inp_FD_section2->hide(); inp_KD_name2 = new Fl_Input2(defwidget); inp_KD_name2->hide(); inp_KD_age1 = new Fl_Input2(defwidget); inp_KD_age1->hide(); inp_KD_age2 = new Fl_Input2(defwidget); inp_KD_age2->hide(); inp_KD_state1 = new Fl_Input2(defwidget); inp_KD_state1->hide(); inp_KD_state2 = new Fl_Input2(defwidget); inp_KD_state2->hide(); inp_KD_VEprov1 = new Fl_Input2(defwidget); inp_KD_VEprov1->hide(); inp_KD_VEprov2 = new Fl_Input2(defwidget); inp_KD_VEprov2->hide(); inp_KD_XchgIn1 = new Fl_Input2(defwidget); inp_KD_XchgIn1->hide(); inp_KD_XchgIn2 = new Fl_Input2(defwidget); inp_KD_XchgIn2->hide(); inp_1010_XchgIn1 = new Fl_Input2(defwidget); inp_1010_XchgIn1->hide(); inp_1010_XchgIn2 = new Fl_Input2(defwidget); inp_1010_XchgIn2->hide(); inp_1010_nr1 = new Fl_Input2(defwidget); inp_1010_nr1->hide(); inp_1010_nr2 = new Fl_Input2(defwidget); inp_1010_nr2->hide(); inp_1010_name2 = new Fl_Input2(defwidget); inp_1010_name2->hide(); inp_ARR_Name2 = new Fl_Input2(defwidget); inp_ARR_Name2->hide(); inp_ARR_XchgIn1 = new Fl_Input2(defwidget); inp_ARR_XchgIn1->hide(); inp_ARR_XchgIn2 = new Fl_Input2(defwidget); inp_ARR_XchgIn2->hide(); inp_ARR_check1 = new Fl_Input2(defwidget); inp_ARR_check1->hide(); inp_ARR_check2 = new Fl_Input2(defwidget); inp_ARR_check2->hide(); inp_vhf_Loc1 = new Fl_Input2(defwidget); inp_vhf_Loc1->hide(); inp_vhf_Loc2 = new Fl_Input2(defwidget); inp_vhf_Loc2->hide(); inp_vhf_RSTin1 = new Fl_Input2(defwidget); inp_vhf_RSTin1->hide(); inp_vhf_RSTin2 = new Fl_Input2(defwidget); inp_vhf_RSTin2->hide(); inp_vhf_RSTout1 = new Fl_Input2(defwidget); inp_vhf_RSTout1->hide(); inp_vhf_RSTout2 = new Fl_Input2(defwidget); inp_vhf_RSTout2->hide(); inp_CQ_RSTin2 = new Fl_Input2(defwidget); inp_CQ_RSTin2->hide(); inp_CQ_RSTout2 = new Fl_Input2(defwidget); inp_CQ_RSTout2->hide(); inp_CQstate1 = new Fl_Input2(defwidget); inp_CQstate1->hide(); inp_CQstate2 = new Fl_Input2(defwidget); inp_CQstate2->hide(); inp_CQzone1 = new Fl_Input2(defwidget); inp_CQzone1->hide(); inp_CQzone2 = new Fl_Input2(defwidget); inp_CQzone2->hide(); cboCountryCQ2 = new Fl_ComboBox(defwidget); cboCountryCQ2->end(); cboCountryCQ2->hide(); inp_CQDX_RSTin2 = new Fl_Input2(defwidget); inp_CQDX_RSTin2->hide(); inp_CQDX_RSTout2 = new Fl_Input2(defwidget); inp_CQDX_RSTout2->hide(); cboCountryCQDX2 = new Fl_ComboBox(defwidget); cboCountryCQDX2->end(); cboCountryCQDX2->hide(); inp_CQDXzone1 = new Fl_Input2(defwidget); inp_CQDXzone1->hide(); inp_CQDXzone2 = new Fl_Input2(defwidget); inp_CQDXzone2->hide(); inpTimeOff2 = new Fl_Input2(defwidget); inpTimeOff2->hide(); inpTimeOn2 = new Fl_Input2(defwidget); inpTimeOn2->hide(); btnTimeOn2 = new Fl_Button(defwidget); btnTimeOn2->hide(); inpCall2 = new Fl_Input2(defwidget); inpCall2->hide(); inpName2 = new Fl_Input2(defwidget); inpName2->hide(); inpRstIn2 = new Fl_Input2(defwidget); inpRstIn2->hide(); inpRstOut2 = new Fl_Input2(defwidget); inpRstOut2->hide(); qsoFreqDisp2 = new cFreqControl(0,0,80,20,""); qsoFreqDisp2->hide(); qso_opPICK2 = new Fl_Button(defwidget); qso_opPICK2->hide(); qsoClear2 = new Fl_Button(defwidget); qsoClear2->hide(); qsoSave2 = new Fl_Button(defwidget); qsoSave2->hide(); btnQRZ2 = new Fl_Button(defwidget); btnQRZ2->hide(); inpTimeOff3 = new Fl_Input2(defwidget); inpTimeOff3->hide(); inpTimeOn3 = new Fl_Input2(defwidget); inpTimeOn3->hide(); btnTimeOn3 = new Fl_Button(defwidget); btnTimeOn3->hide(); inpCall3 = new Fl_Input2(defwidget); inpCall3->hide(); outSerNo2 = new Fl_Input2(defwidget); outSerNo2->hide(); inpSerNo2 = new Fl_Input2(defwidget); inpSerNo2->hide(); inpXchgIn2 = new Fl_Input2(defwidget); inpXchgIn2->hide(); qsoFreqDisp3 = new cFreqControl(0,0,80,20,""); qsoFreqDisp3->hide(); inpTimeOff4 = new Fl_Input2(defwidget); inpTimeOff4->hide(); inpTimeOn4 = new Fl_Input2(defwidget); inpTimeOn4->hide(); btnTimeOn4 = new Fl_Button(defwidget); btnTimeOn4->hide(); inpTimeOff5 = new Fl_Input2(defwidget); inpTimeOff5->hide(); inpTimeOn5 = new Fl_Input2(defwidget); inpTimeOn5->hide(); btnTimeOn5 = new Fl_Button(defwidget); btnTimeOn5->hide(); outSerNo3 = new Fl_Input2(defwidget); outSerNo3->hide(); inp_SS_SerialNoR1 = new Fl_Input2(defwidget); inp_SS_SerialNoR1->hide(); inp_SS_Precedence1 = new Fl_Input2(defwidget); inp_SS_Precedence1->hide(); inp_SS_Check1 = new Fl_Input2(defwidget); inp_SS_Check1->hide(); inp_SS_Section1 = new Fl_Input2(defwidget); inp_SS_Section1->hide(); outSerNo4 = new Fl_Input2(defwidget); outSerNo4->hide(); inp_SS_SerialNoR2 = new Fl_Input2(defwidget); inp_SS_SerialNoR2->hide(); inp_SS_Precedence2 = new Fl_Input2(defwidget); inp_SS_Precedence2->hide(); inp_SS_Check2 = new Fl_Input2(defwidget); inp_SS_Check2->hide(); inp_SS_Section2 = new Fl_Input2(defwidget); inp_SS_Section2->hide(); inp_ASCR_class1 = new Fl_Input2(defwidget); inp_ASCR_class1->hide(); inp_ASCR_XchgIn1 = new Fl_Input2(defwidget); inp_ASCR_XchgIn1->hide(); inp_ASCR_name2 = new Fl_Input2(defwidget); inp_ASCR_name2->hide(); inp_ASCR_class2 = new Fl_Input2(defwidget); inp_ASCR_class2->hide(); inp_ASCR_XchgIn2 = new Fl_Input2(defwidget); inp_ASCR_XchgIn2->hide(); inp_ASCR_RSTin2 = new Fl_Input2(defwidget); inp_ASCR_RSTin2->hide(); inp_ASCR_RSTout2 = new Fl_Input2(defwidget); inp_ASCR_RSTout2->hide(); inpNAQPname2 = new Fl_Input2(defwidget); inpNAQPname2->hide(); inpSPCnum_NAQP1 = new Fl_Input2(defwidget); inpSPCnum_NAQP1->hide(); inpSPCnum_NAQP2 = new Fl_Input2(defwidget); inpSPCnum_NAQP2->hide(); inpRTU_stpr1 = new Fl_Input2(defwidget); inpRTU_stpr1->hide(); inpRTU_serno1 = new Fl_Input2(defwidget); inpRTU_serno1->hide(); inpRTU_RSTin2 = new Fl_Input2(defwidget); inpRTU_RSTin2->hide(); inpRTU_RSTout2 = new Fl_Input2(defwidget); inpRTU_RSTout2->hide(); inpRTU_stpr2 = new Fl_Input2(defwidget); inpRTU_stpr2->hide(); inpRTU_serno2 = new Fl_Input2(defwidget); inpRTU_serno2->hide(); cboCountryRTU2 = new Fl_ComboBox(defwidget); cboCountryRTU2->end(); cboCountryRTU2->hide(); inp_IARI_PR1 = new Fl_Input2(defwidget); inp_IARI_PR1->hide(); inp_IARI_RSTin2 = new Fl_Input2(defwidget); inp_IARI_RSTin2->hide(); inp_IARI_RSTout2 = new Fl_Input2(defwidget); inp_IARI_RSTout2->hide(); out_IARI_SerNo1 = new Fl_Input2(defwidget); out_IARI_SerNo1->hide(); inp_IARI_SerNo1 = new Fl_Input2(defwidget); inp_IARI_SerNo1->hide(); out_IARI_SerNo2 = new Fl_Input2(defwidget); out_IARI_SerNo2->hide(); inp_IARI_SerNo2 = new Fl_Input2(defwidget); inp_IARI_SerNo2->hide(); inp_IARI_PR2 = new Fl_Input2(defwidget); inp_IARI_PR2->hide(); cboCountryIARI2 = new Fl_ComboBox(defwidget); cboCountryIARI2->end(); cboCountryIARI2->hide(); outSerNo5 = new Fl_Input2(defwidget); outSerNo4->hide(); inp_ser_NAS1 = new Fl_Input2(defwidget); inp_ser_NAS1->hide(); inpSPCnum_NAS1 = new Fl_Input2(defwidget); inpSPCnum_NAS1->hide(); outSerNo6 = new Fl_Input2(defwidget); outSerNo5->hide(); inp_ser_NAS2 = new Fl_Input2(defwidget); inp_ser_NAS2->hide(); inpSPCnum_NAS2 = new Fl_Input2(defwidget); inpSPCnum_NAS2->hide(); inp_name_NAS2 = new Fl_Input2(defwidget); inp_name_NAS2->hide(); outSerNo7 = new Fl_Input2(defwidget); outSerNo7->hide(); inpSerNo3 = new Fl_Input2(defwidget); inpSerNo3->hide(); cboCountryAIDX2 = new Fl_ComboBox(defwidget); cboCountryAIDX2->end(); cboCountryAIDX2->hide(); inpRstIn3 = new Fl_Input2(defwidget); inpRstIn3->hide(); inpRstOut3 = new Fl_Input2(defwidget); inpRstOut3->hide(); outSerNo8 = new Fl_Input2(defwidget); outSerNo8->hide(); inpSerNo4 = new Fl_Input2(defwidget); inpSerNo4->hide(); inp_JOTA_troop1 = new Fl_Input2(defwidget); inp_JOTA_troop1->hide(); inp_JOTA_troop2 = new Fl_Input2(defwidget); inp_JOTA_troop2->hide(); inp_JOTA_scout1 = new Fl_Input2(defwidget); inp_JOTA_scout1->hide(); inp_JOTA_scout2 = new Fl_Input2(defwidget); inp_JOTA_scout2->hide(); inp_JOTA_spc1 = new Fl_Input2(defwidget); inp_JOTA_spc1->hide(); inp_JOTA_spc2 = new Fl_Input2(defwidget); inp_JOTA_spc2->hide(); inpSPCnum_AICW1 = new Fl_Input2(defwidget); inpSPCnum_AICW1->hide(); inpSPCnum_AICW2 = new Fl_Input2(defwidget); inpSPCnum_AICW2->hide(); inpRstIn_AICW2 = new Fl_Input2(defwidget); inpRstIn_AICW2->hide(); inpRstOut_AICW2 = new Fl_Input2(defwidget); inpRstOut_AICW2->hide(); inpSQSO_state1 = new Fl_Input2(defwidget); inpSQSO_state1->hide(); inpSQSO_state2 = new Fl_Input2(defwidget); inpSQSO_state2->hide(); inpSQSO_county1 = new Fl_Input2(defwidget); inpSQSO_county1->hide(); inpSQSO_county2 = new Fl_Input2(defwidget); inpSQSO_county2->hide(); inpSQSO_serno1 = new Fl_Input2(defwidget); inpSQSO_serno1->hide(); inpSQSO_serno2 = new Fl_Input2(defwidget); inpSQSO_serno2->hide(); outSQSO_serno1 = new Fl_Input2(defwidget); outSQSO_serno1->hide(); outSQSO_serno2 = new Fl_Input2(defwidget); outSQSO_serno2->hide(); inpSQSO_name2 = new Fl_Input2(defwidget); inpSQSO_name2->hide(); inpRstIn_SQSO2 = new Fl_Input2(defwidget); inpRstIn_SQSO2->hide(); inpRstOut_SQSO2 = new Fl_Input2(defwidget); inpRstOut_SQSO2->hide(); inpSQSO_category1 = new Fl_Input2(defwidget); inpSQSO_category1->hide(); inpSQSO_category2 = new Fl_Input2(defwidget); inpSQSO_category2->hide(); inpSerNo_WPX1 = new Fl_Input2(defwidget); inpSerNo_WPX1->hide(); outSerNo_WPX1 = new Fl_Input2(defwidget); outSerNo_WPX1->hide(); inpSerNo_WPX2 = new Fl_Input2(defwidget); inpSerNo_WPX2->hide(); outSerNo_WPX2 = new Fl_Input2(defwidget); outSerNo_WPX2->hide(); inpRstIn_WPX2 = new Fl_Input2(defwidget); inpRstIn_WPX2->hide(); inpRstOut_WPX2 = new Fl_Input2(defwidget); inpRstOut_WPX2->hide(); inpSerNo_WAE1 = new Fl_Input2(defwidget); inpSerNo_WAE1->hide(); inpSerNo_WAE2 = new Fl_Input2(defwidget); inpSerNo_WAE2->hide(); outSerNo_WAE1 = new Fl_Input2(defwidget); outSerNo_WAE1->hide(); outSerNo_WAE2 = new Fl_Input2(defwidget); outSerNo_WAE2->hide(); inpRstIn_WAE2 = new Fl_Input2(defwidget); inpRstIn_WAE2->hide(); inpRstOut_WAE2 = new Fl_Input2(defwidget); inpRstOut_WAE2->hide(); cboCountryWAE2 = new Fl_ComboBox(defwidget); cboCountryWAE2->end(); cboCountryWAE2->hide(); qso_opPICK3 = new Fl_Button(defwidget); qso_opPICK3->hide(); qsoClear3 = new Fl_Button(defwidget); qsoClear3->hide(); qsoSave3 = new Fl_Button(defwidget); qsoSave3->hide(); inpCall4 = new Fl_Input2(defwidget); inpCall4->hide(); qso_opBrowser = new Fl_Browser(defwidget); qso_opBrowser->hide(); qso_btnAddFreq = new Fl_Button(defwidget); qso_btnAddFreq->hide(); qso_btnSelFreq = new Fl_Button(defwidget); qso_btnSelFreq->hide(); qso_btnDelFreq = new Fl_Button(defwidget); qso_btnDelFreq->hide(); qso_btnClearList = new Fl_Button(defwidget); qso_btnClearList->hide(); qso_btnAct = new Fl_Button(defwidget); qso_btnAct->hide(); qso_inpAct = new Fl_Input2(defwidget); qso_inpAct->hide(); pwrmeter = new PWRmeter(defwidget); pwrmeter->hide(); smeter = new Smeter(defwidget); smeter->hide(); pwr_level = new Fl_Value_Slider2(defwidget); pwr_level->hide(); set_pwr_level = new Fl_Button(defwidget); set_pwr_level->hide(); dummywindow->end(); dummywindow->hide(); } void make_scopeviewer() { scopeview = new Fl_Double_Window(0,0,140,140, _("Scope")); scopeview->xclass(PACKAGE_NAME); digiscope = new Digiscope (0, 0, 140, 140); scopeview->resizable(digiscope); scopeview->size_range(SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT); scopeview->end(); scopeview->hide(); } void altTabs() { tabsConfigure->remove(tabMisc); tabsConfigure->remove(tabQRZ); tabsUI->remove(tabUserInterface); tabsUI->remove(tabLogContests); tabsUI->remove(tabWF_UI); tabsUI->remove(tabMBars); tabsModems->remove(tabFeld); } static int WF_only_height = 0; void create_fl_digi_main_WF_only() { int fnt = fl_font(); int fsize = fl_size(); int freqheight = Hentry + 2 * pad; int Y = 0; fl_font(fnt, freqheight); fl_font(fnt, fsize); IMAGE_WIDTH = 4000; Hwfall = progdefaults.wfheight; Wwfall = progStatus.mainW - 2 * DEFAULT_SW - 2 * pad; WF_only_height = Hmenu + Hwfall + Hstatus + 4 * pad; fl_digi_main = new Fl_Double_Window(progStatus.mainW, WF_only_height); mnuFrame = new Fl_Group(0,0,progStatus.mainW, Hmenu); mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 275 - pad, Hmenu); // do some more work on the menu for (size_t i = 0; i < sizeof(alt_menu_)/sizeof(alt_menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items if (alt_menu_[i].text) { alt_menu_[i].labelsize_ = FL_NORMAL_SIZE; } // set the icon label for items with the multi label type if (alt_menu_[i].labeltype() == _FL_MULTI_LABEL) icons::set_icon_label(&alt_menu_[i]); } mnu->menu(alt_menu_); tx_timer = new Fl_Box(progStatus.mainW - 275 - pad, 0, 75 - pad, Hmenu, ""); tx_timer->box(FL_UP_BOX); tx_timer->color(FL_BACKGROUND_COLOR); tx_timer->labelcolor(FL_BACKGROUND_COLOR); btnAutoSpot = new Fl_Light_Button(progStatus.mainW - 200 - pad, 0, 50, Hmenu, "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); btnRSID = new Fl_Light_Button(progStatus.mainW - 150 - pad, 0, 50, Hmenu, "RxID"); btnRSID->tooltip("Receive RSID"); btnRSID->value(progdefaults.rsid); btnRSID->callback(cbRSID, 0); btnTxRSID = new Fl_Light_Button(progStatus.mainW - 100 - pad, 0, 50, Hmenu, "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); btnTune = new Fl_Light_Button(progStatus.mainW - 50 - pad, 0, 50, Hmenu, "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); mnuFrame->resizable(mnu); mnuFrame->end(); Y = Hmenu + pad; wf_group = new Fl_Group(0, Y, progStatus.mainW, Hwfall); wf = new waterfall(0, Y, Wwfall, Hwfall); wf->end(); pgrsSquelch = new Progress( rightof(wf), Y + pad, DEFAULT_SW, Hwfall - 2 * pad, ""); pgrsSquelch->color(FL_BACKGROUND2_COLOR, FL_DARK_GREEN); pgrsSquelch->type(Progress::VERTICAL); pgrsSquelch->tooltip(_("Detected signal level")); sldrSquelch = new Fl_Slider2( rightof(pgrsSquelch), Y + pad, DEFAULT_SW, Hwfall - 2 * pad, ""); sldrSquelch->minimum(100); sldrSquelch->maximum(0); sldrSquelch->step(1); sldrSquelch->value(progStatus.sldrSquelchValue); sldrSquelch->callback((Fl_Callback*)cb_sldrSquelch); sldrSquelch->color(FL_INACTIVE_COLOR); sldrSquelch->tooltip(_("Squelch level")); Fl_Group::current()->resizable(wf); wf_group->end(); Y += (Hwfall + pad); status_group = new Fl_Group(0, Y, progStatus.mainW, Hstatus); MODEstatus = new Fl_Button( 0, Y, Wmode, Hstatus, ""); MODEstatus->box(FL_DOWN_BOX); MODEstatus->color(FL_BACKGROUND2_COLOR); MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); MODEstatus->callback(status_cb, (void *)0); MODEstatus->when(FL_WHEN_CHANGED); MODEstatus->tooltip(_("Left click: change mode\nRight click: configure")); cntCW_WPM = new Fl_Counter2( rightof(MODEstatus), Y, Ws2n - Hstatus, Hstatus, ""); cntCW_WPM->callback(cb_cntCW_WPM); cntCW_WPM->minimum(progdefaults.CWlowerlimit); cntCW_WPM->maximum(progdefaults.CWupperlimit); cntCW_WPM->value(progdefaults.CWspeed); cntCW_WPM->tooltip(_("CW transmit WPM")); cntCW_WPM->type(1); cntCW_WPM->step(1); cntCW_WPM->hide(); btnCW_Default = new Fl_Button( rightof(cntCW_WPM), Y, Hstatus, Hstatus, "*"); btnCW_Default->callback(cb_btnCW_Default); btnCW_Default->tooltip(_("Default WPM")); btnCW_Default->hide(); Status1 = new Fl_Box( rightof(MODEstatus), Y, Ws2n, Hstatus, ""); Status1->box(FL_DOWN_BOX); Status1->color(FL_BACKGROUND2_COLOR); Status1->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); Status2 = new Fl_Box( rightof(Status1), Y, Wimd, Hstatus, ""); Status2->box(FL_DOWN_BOX); Status2->color(FL_BACKGROUND2_COLOR); Status2->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); StatusBar = new Fl_Box( rightof(Status2), Y, progStatus.mainW - rightof(Status2) - 2 * bwSqlOnOff - bwAfcOnOff - Wwarn - bwTxLevel, Hstatus, ""); StatusBar->box(FL_DOWN_BOX); StatusBar->color(FL_BACKGROUND2_COLOR); StatusBar->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); cntTxLevel = new Fl_Counter2( rightof(StatusBar), Y, bwTxLevel, Hstatus, ""); cntTxLevel->minimum(-30); cntTxLevel->maximum(0); cntTxLevel->value(-6); cntTxLevel->callback((Fl_Callback*)cb_cntTxLevel); cntTxLevel->value(progdefaults.txlevel); cntTxLevel->lstep(1.0); cntTxLevel->tooltip(_("Tx level attenuator (dB)")); WARNstatus = new Fl_Box( rightof(cntTxLevel), Y, Wwarn, Hstatus, ""); WARNstatus->box(FL_DIAMOND_DOWN_BOX); WARNstatus->color(FL_BACKGROUND_COLOR); WARNstatus->labelcolor(FL_RED); WARNstatus->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); btnAFC = new Fl_Light_Button( rightof(WARNstatus), Y, bwAfcOnOff, Hstatus, "AFC"); btnAFC->selection_color(progdefaults.AfcColor); btnSQL = new Fl_Light_Button( rightof(btnAFC), Y, bwSqlOnOff, Hstatus, "SQL"); // btnPSQL will be resized later depending on the state of the // configuration parameter to show that widget btnPSQL = new Fl_Light_Button( rightof(btnSQL), Y, bwSqlOnOff, Hstatus, "PSM"); btnAFC->callback(cbAFC, 0); btnAFC->value(1); btnAFC->tooltip(_("Automatic Frequency Control")); btnSQL->callback(cbSQL, 0); btnSQL->selection_color(progdefaults.Sql1Color); btnSQL->value(1); btnSQL->tooltip(_("Squelch")); btnPSQL->selection_color(progdefaults.Sql1Color); btnPSQL->callback(cbPwrSQL, 0); btnPSQL->value(progdefaults.kpsql_enabled); btnPSQL->tooltip(_("Power Signal Monitor")); Fl_Group::current()->resizable(StatusBar); status_group->end(); Fl::add_handler(wo_default_handler); fl_digi_main->end(); fl_digi_main->callback(cb_wMain); fl_digi_main->resizable(wf); const struct { bool var; const char* label; } toggles[] = { { progStatus.DOCKEDSCOPE, DOCKEDSCOPE_MLABEL } }; Fl_Menu_Item* toggle; for (size_t i = 0; i < sizeof(toggles)/sizeof(*toggles); i++) { if (toggles[i].var && (toggle = getMenuItem(toggles[i].label, alt_menu_))) { toggle->set(); if (toggle->callback()) { mnu->value(toggle); toggle->do_callback(reinterpret_cast(mnu)); } } } make_scopeviewer(); noop_controls(); progdefaults.WF_UIwfcarrier = progdefaults.WF_UIwfreflevel = progdefaults.WF_UIwfampspan = progdefaults.WF_UIwfmode = progdefaults.WF_UIx1 = progdefaults.WF_UIwfshift = progdefaults.WF_UIrev = progdefaults.WF_UIwfstore = progdefaults.WF_UIxmtlock = progdefaults.WF_UIwfdrop = true; progdefaults.WF_UIqsy = false; wf->UI_select(true); load_counties(); createConfig(); createRecordLoader(); altTabs(); if (rx_only) { btnTune->deactivate(); wf->xmtrcv->deactivate(); } UI_select(); } void create_fl_digi_main(int argc, char** argv) { if (bWF_only) create_fl_digi_main_WF_only(); else create_fl_digi_main_primary(); #if defined(__WOE32__) # ifndef IDI_ICON # define IDI_ICON 101 # endif fl_digi_main->icon((char*)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); #elif !defined(__APPLE__) && USE_X make_pixmap(&fldigi_icon_pixmap, fldigi_icon, argc, argv); fl_digi_main->icon((char *)fldigi_icon_pixmap); #endif fl_digi_main->xclass(PACKAGE_NAME); if (bWF_only) fl_digi_main->size_range(WMIN, WF_only_height, 0, WF_only_height); else fl_digi_main->size_range(WMIN, main_hmin, 0, 0); set_colors(); } void put_freq(double frequency) { wf->carrier((int)floor(frequency + 0.5)); } void put_Bandwidth(int bandwidth) { wf->Bandwidth ((int)bandwidth); } void callback_set_metric(double metric) { pgrsSquelch->value(metric); if (active_modem->get_mode() == MODE_FSQ) ind_fsq_s2n->value(metric); if (active_modem->get_mode() == MODE_IFKP) ifkp_s2n_progress->value(metric); if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { if ((metric >= progStatus.sldrPwrSquelchValue) || inhibit_tx_seconds) btnPSQL->selection_color(progdefaults.Sql2Color); else btnPSQL->selection_color(progdefaults.Sql1Color); btnPSQL->redraw_label(); } else if(progStatus.sqlonoff) { if (metric < progStatus.sldrSquelchValue) btnSQL->selection_color(progdefaults.Sql1Color); else btnSQL->selection_color(progdefaults.Sql2Color); btnSQL->redraw_label(); } } void put_cwRcvWPM(double wpm) { int U = progdefaults.CWupperlimit; int L = progdefaults.CWlowerlimit; double dWPM = 100.0*(wpm - L)/(U - L); FL_LOCK_D(); REQ_DROP(static_cast(&Fl_Progress::value), prgsCWrcvWPM, dWPM); REQ_DROP(static_cast(&Fl_Value_Output::value), valCWrcvWPM, (int)wpm); FL_UNLOCK_D(); FL_AWAKE_D(); } void set_scope_mode(Digiscope::scope_mode md) { if (digiscope) { digiscope->mode(md); REQ(&Fl_Window::size_range, scopeview, SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT, 0, 0, 0, 0, (md == Digiscope::PHASE || md == Digiscope::XHAIRS)); } wf->wfscope->mode(md); if (md == Digiscope::SCOPE) set_scope_clear_axis(); } void set_scope(double *data, int len, bool autoscale) { if (digiscope) digiscope->data(data, len, autoscale); wf->wfscope->data(data, len, autoscale); } void set_phase(double phase, double quality, bool highlight) { if (digiscope) digiscope->phase(phase, quality, highlight); wf->wfscope->phase(phase, quality, highlight); } void set_rtty(double flo, double fhi, double amp) { if (digiscope) digiscope->rtty(flo, fhi, amp); wf->wfscope->rtty(flo, fhi, amp); } void set_video(double *data, int len, bool dir) { if (digiscope) digiscope->video(data, len, dir); wf->wfscope->video(data, len, dir); } void set_zdata(cmplx *zarray, int len) { if (digiscope) digiscope->zdata(zarray, len); wf->wfscope->zdata(zarray, len); } void set_scope_xaxis_1(double y1) { if (digiscope) digiscope->xaxis_1(y1); wf->wfscope->xaxis_1(y1); } void set_scope_xaxis_2(double y2) { if (digiscope) digiscope->xaxis_2(y2); wf->wfscope->xaxis_2(y2); } void set_scope_yaxis_1(double x1) { if (digiscope) digiscope->yaxis_1(x1); wf->wfscope->yaxis_1(x1); } void set_scope_yaxis_2(double x2) { if (digiscope) digiscope->yaxis_2(x2); wf->wfscope->yaxis_2(x2); } void set_scope_clear_axis() { if (digiscope) { digiscope->xaxis_1(0); digiscope->xaxis_2(0); digiscope->yaxis_1(0); digiscope->yaxis_2(0); } wf->wfscope->xaxis_1(0); wf->wfscope->xaxis_2(0); wf->wfscope->yaxis_1(0); wf->wfscope->yaxis_2(0); } // raw buffer functions can ONLY be called by FLMAIN_TID //====================================================================== #define RAW_BUFF_LEN 4096 static char rxtx_raw_chars[RAW_BUFF_LEN+1] = ""; static char rxtx_raw_buff[RAW_BUFF_LEN+1] = ""; static int rxtx_raw_len = 0; char *get_rxtx_data() { ENSURE_THREAD(FLMAIN_TID); memset(rxtx_raw_chars, 0, RAW_BUFF_LEN+1); strcpy(rxtx_raw_chars, rxtx_raw_buff); memset(rxtx_raw_buff, 0, RAW_BUFF_LEN+1); rxtx_raw_len = 0; return rxtx_raw_chars; } void add_rxtx_char(int data) { ENSURE_THREAD(FLMAIN_TID); if (rxtx_raw_len == RAW_BUFF_LEN) { memset(rxtx_raw_buff, 0, RAW_BUFF_LEN+1); rxtx_raw_len = 0; } rxtx_raw_buff[rxtx_raw_len++] = (unsigned char)data; } //====================================================================== static char rx_raw_chars[RAW_BUFF_LEN+1] = ""; static char rx_raw_buff[RAW_BUFF_LEN+1] = ""; static int rx_raw_len = 0; char *get_rx_data() { ENSURE_THREAD(FLMAIN_TID); memset(rx_raw_chars, 0, RAW_BUFF_LEN+1); strcpy(rx_raw_chars, rx_raw_buff); memset(rx_raw_buff, 0, RAW_BUFF_LEN+1); rx_raw_len = 0; return rx_raw_chars; } void add_rx_char(int data) { ENSURE_THREAD(FLMAIN_TID); add_rxtx_char(data); if (rx_raw_len == RAW_BUFF_LEN) { memset(rx_raw_buff, 0, RAW_BUFF_LEN+1); rx_raw_len = 0; } rx_raw_buff[rx_raw_len++] = (unsigned char)data; } //====================================================================== static char tx_raw_chars[RAW_BUFF_LEN+1] = ""; static char tx_raw_buff[RAW_BUFF_LEN+1] = ""; static int tx_raw_len = 0; char *get_tx_data() { ENSURE_THREAD(FLMAIN_TID); memset(tx_raw_chars, 0, RAW_BUFF_LEN+1); strcpy(tx_raw_chars, tx_raw_buff); memset(tx_raw_buff, 0, RAW_BUFF_LEN+1); tx_raw_len = 0; return tx_raw_chars; } void add_tx_char(int data) { ENSURE_THREAD(FLMAIN_TID); add_rxtx_char(data); if (tx_raw_len == RAW_BUFF_LEN) { memset(tx_raw_buff, 0, RAW_BUFF_LEN+1); tx_raw_len = 0; } tx_raw_buff[tx_raw_len++] = (unsigned char)data; } //====================================================================== static void display_rx_data(const unsigned char data, int style) { if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(data,style); else if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(data,style); else ReceiveText->add(data, style); if (bWF_only) return; speak(data); if (Maillogfile) Maillogfile->log_to_file(cLogfile::LOG_RX, string(1, (const char)data)); if (progStatus.LOGenabled) logfile->log_to_file(cLogfile::LOG_RX, string(1, (const char)data)); } static void rx_parser(const unsigned char data, int style) { // assign a style to the incoming data if (extract_wrap || extract_flamp) style = FTextBase::RECV; if ((data < ' ') && iscntrl(data)) style = FTextBase::CTRL; if (wf->tmp_carrier()) style = FTextBase::ALTR; // Collapse the "\r\n" sequence into "\n". // // The 'data' variable possibly contains only a part of a multi-byte // UTF-8 character. This is not a problem. All data has passed // through a distiller before we got here, so we can be sure that // the input is valid UTF-8. All bytes of a multi-byte character // will therefore have the eight bit set and can not match either // '\r' or '\n'. static unsigned int lastdata = 0; if (data == '\n' && lastdata == '\r'); else if (data == '\r') { // add_rx_char('\n'); display_rx_data('\n', style); } else { // add_rx_char(data); display_rx_data(data, style); } lastdata = data; if (!(data < ' ' && iscntrl(data)) && progStatus.spot_recv) spot_recv(data); } static void put_rx_char_flmain(unsigned int data, int style) { ENSURE_THREAD(FLMAIN_TID); // possible destinations for the data enum dest_type { DEST_RECV, // ordinary received text DEST_ALTR // alternate received text }; static enum dest_type destination = DEST_RECV; static enum dest_type prev_destination = DEST_RECV; // Determine the destination of the incoming data. If the destination had // changed, clear the contents of the distiller. destination = (wf->tmp_carrier() ? DEST_ALTR : DEST_RECV); if (destination != prev_destination) { rx_chd.reset(); rx_chd.clear(); } // select a byte translation table trx_mode mode = active_modem->get_mode(); add_rx_char(data & 0xFF); if (mailclient || mailserver) rx_chd.rx((unsigned char *)ascii2[data & 0xFF]); else if (progdefaults.show_all_codes) rx_chd.rx((unsigned char *)ascii3[data & 0xFF]); else if (mode == MODE_RTTY || mode == MODE_CW) rx_chd.rx((unsigned char *)ascii[data & 0xFF]); else rx_chd.rx(data); // feed the decoded data into the RX parser if (rx_chd.data_length() > 0) { const char *ptr = rx_chd.data().data(); const char *end = ptr + rx_chd.data_length(); while (ptr < end) rx_parser((const unsigned char)*ptr++, style); rx_chd.clear(); } } static std::string rx_process_buf = ""; static std::string tx_process_buf = ""; static pthread_mutex_t rx_proc_mutex = PTHREAD_MUTEX_INITIALIZER; void put_rx_processed_char(unsigned int data, int style) { guard_lock rx_proc_lock(&rx_proc_mutex); if(style == FTextBase::XMIT) { tx_process_buf += (char) (data & 0xff); } else if(style == FTextBase::RECV) { rx_process_buf += (char) (data & 0xff); } } void disp_rx_processed_char(void) { guard_lock rx_proc_lock(&rx_proc_mutex); unsigned int index = 0; if(!rx_process_buf.empty()) { unsigned int count = rx_process_buf.size(); for(index = 0; index < count; index++) REQ(put_rx_char_flmain, rx_process_buf[index], FTextBase::RECV); rx_process_buf.clear(); } if(!tx_process_buf.empty()) { unsigned int count = tx_process_buf.size(); for(index = 0; index < count; index++) REQ(put_rx_char_flmain, tx_process_buf[index], FTextBase::XMIT); tx_process_buf.clear(); } } void put_rx_char(unsigned int data, int style) { #if BENCHMARK_MODE if (!benchmark.output.empty()) { if (unlikely(benchmark.buffer.length() + 16 > benchmark.buffer.capacity())) benchmark.buffer.reserve(benchmark.buffer.capacity() + BUFSIZ); benchmark.buffer += (char)data; } #else if (progdefaults.autoextract == true) rx_extract_add(data); if (active_modem->get_mode() == MODE_FSQ) { REQ(put_rx_char_flmain, data, style); return; } switch(data_io_enabled) { case ARQ_IO: WriteARQ(data); break; case KISS_IO: WriteKISS(data); break; } if(progdefaults.ax25_decode_enabled && data_io_enabled == KISS_IO) disp_rx_processed_char(); else REQ(put_rx_char_flmain, data, style); #endif } static string strSecText = ""; static void put_sec_char_flmain(char chr) { ENSURE_THREAD(FLMAIN_TID); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); char s[2] = "W"; int lc = (int)ceil(fl_width(s)); int w = StatusBar->w(); int lw = (int)ceil(fl_width(StatusBar->label())); int over = 2 * lc + lw - w; if (chr >= ' ' && chr <= 'z') { if ( over > 0 ) strSecText.erase(0, (int)(1.0 * over / lc + 0.5)); strSecText.append(1, chr); StatusBar->label(strSecText.c_str()); WARNstatus->damage(); } } void put_sec_char(char chr) { REQ(put_sec_char_flmain, chr); } static void clear_status_cb(void* arg) { reinterpret_cast(arg)->label(""); } static void dim_status_cb(void* arg) { reinterpret_cast(arg)->deactivate(); } static void (*const timeout_action[STATUS_NUM])(void*) = { clear_status_cb, dim_status_cb }; static void put_status_msg(Fl_Box* status, const char* msg, double timeout, status_timeout action) { status->activate(); status->label(msg); if (timeout > 0.0) { Fl::remove_timeout(timeout_action[action], status); Fl::add_timeout(timeout, timeout_action[action], status); } } void put_status(const char *msg, double timeout, status_timeout action) { static char m[50]; strncpy(m, msg, sizeof(m)); m[sizeof(m) - 1] = '\0'; REQ(put_status_msg, StatusBar, m, timeout, action); } void put_Status2(const char *msg, double timeout, status_timeout action) { static char m[60]; strncpy(m, msg, sizeof(m)); m[sizeof(m) - 1] = '\0'; info2msg = msg; REQ(put_status_msg, Status2, m, timeout, action); } void put_Status1(const char *msg, double timeout, status_timeout action) { static char m[60]; strncpy(m, msg, sizeof(m)); m[sizeof(m) - 1] = '\0'; info1msg = msg; if (!active_modem) return; if (progStatus.NO_RIGLOG && active_modem->get_mode() != MODE_FSQ) return; REQ(put_status_msg, Status1, m, timeout, action); } void put_WARNstatus(double val) { FL_LOCK_D(); if (val < 0.05) WARNstatus->color(progdefaults.LowSignal); if (val >= 0.05) WARNstatus->color(progdefaults.NormSignal); if (val >= 0.9) WARNstatus->color(progdefaults.HighSignal); if (val >= 0.98) WARNstatus->color(progdefaults.OverSignal); WARNstatus->redraw(); FL_UNLOCK_D(); } void set_CWwpm() { FL_LOCK_D(); sldrCWxmtWPM->value(progdefaults.CWspeed); cntCW_WPM->value(progdefaults.CWspeed); if (use_nanoIO) set_nanoWPM(progdefaults.CWspeed); FL_UNLOCK_D(); } void clear_StatusMessages() { FL_LOCK_D(); StatusBar->label(""); Status1->label(""); Status2->label(""); info1msg = ""; info2msg = ""; FL_UNLOCK_D(); FL_AWAKE_D(); } void put_MODEstatus(const char* fmt, ...) { static char s[32]; va_list args; va_start(args, fmt); vsnprintf(s, sizeof(s), fmt, args); va_end(args); REQ(static_cast(&Fl_Button::label), MODEstatus, s); REQ(static_cast(&Fl_Button::redraw_label), MODEstatus); } void put_MODEstatus(trx_mode mode) { put_MODEstatus("%s", mode_info[mode].sname); } void put_rx_data(int *data, int len) { FHdisp->data(data, len); } bool idling = false; void get_tx_char_idle(void *) { idling = false; progStatus.repeatIdleTime = 0; } int Qwait_time = 0; int Qidle_time = 0; static int que_timeout = 0; bool que_ok = true; bool tx_queue_done = true; bool que_waiting = true; void post_queue_execute(void*) { if (!que_timeout) { LOG_ERROR("%s", "timed out"); return; } while (!que_ok && trx_state != STATE_RX) { que_timeout--; Fl::repeat_timeout(0.05, post_queue_execute); Fl::awake(); } trx_transmit(); } void queue_execute_after_rx(void*) { que_waiting = false; if (!que_timeout) { LOG_ERROR("%s", "timed out"); return; } while (trx_state == STATE_TX) { que_timeout--; Fl::repeat_timeout(0.05, queue_execute_after_rx); Fl::awake(); return; } que_timeout = 100; // 5 seconds Fl::add_timeout(0.05, post_queue_execute); que_ok = false; tx_queue_done = false; Tx_queue_execute(); } void do_que_execute(void *) { tx_queue_done = false; que_ok = false; Tx_queue_execute(); que_waiting = false; } char szTestChar[] = "E|I|S|T|M|O|A|V"; //string bools = "------"; //char testbools[7]; extern int get_fsq_tx_char(); int get_tx_char(void) { enum { STATE_CHAR, STATE_CTRL }; static int state = STATE_CHAR; if (idling || csma_idling ) { return GET_TX_CHAR_NODATA; } // Keep this a the top of the list (CSMA TX delay). if (active_modem->get_mode() == MODE_FSQ) return get_fsq_tx_char(); if (!que_ok) { return GET_TX_CHAR_NODATA; } if (Qwait_time) { return GET_TX_CHAR_NODATA; } if (Qidle_time) { return GET_TX_CHAR_NODATA; } if (macro_idle_on) { return GET_TX_CHAR_NODATA; } if (!macrochar.empty()) { int ch = macrochar[0]; macrochar.erase(0,1); start_deadman(); return ch; } if (xmltest_char_available) { num_cps_chars++; start_deadman(); return xmltest_char(); } if (data_io_enabled == ARQ_IO && arq_text_available) { start_deadman(); return arq_get_char(); } else if (data_io_enabled == KISS_IO && kiss_text_available) { start_deadman(); return kiss_get_char(); } if (active_modem == cw_modem && progdefaults.QSKadjust) { start_deadman(); return szTestChar[2 * progdefaults.TestChar]; } if ( (progStatus.repeatMacro > -1) && progStatus.repeatIdleTime > 0 && !idling ) { Fl::add_timeout(progStatus.repeatIdleTime, get_tx_char_idle); idling = true; return GET_TX_CHAR_NODATA; } int c; if ((c = tx_encoder.pop()) != -1) { start_deadman(); return(c); } if ((progStatus.repeatMacro > -1) && text2repeat.length()) { string repeat_content; int utf8size = fl_utf8len1(text2repeat[repeatchar]); for (int i = 0; i < utf8size; i++) repeat_content += text2repeat[repeatchar + i]; repeatchar += utf8size; tx_encoder.push(repeat_content); if (repeatchar >= text2repeat.length()) { text2repeat.clear(); macros.repeat(progStatus.repeatMacro); } goto transmit; } if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else c = TransmitText->nextChar(); if (c == GET_TX_CHAR_ETX) { return c; } if (c == '^' && state == STATE_CHAR) { state = STATE_CTRL; if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else c = TransmitText->nextChar(); } if (c == -1) { return(GET_TX_CHAR_NODATA); } if (state == STATE_CTRL) { state = STATE_CHAR; switch (c) { case 'a': case 'A': if (active_modem->get_mode() == MODE_IFKP) active_modem->m_ifkp_send_avatar(); else if (active_modem->get_mode() >= MODE_THOR_FIRST && active_modem->get_mode() <= MODE_THOR_LAST) active_modem->m_thor_send_avatar(); return(GET_TX_CHAR_NODATA); case 'i': case 'I': { string fname; if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else c = TransmitText->nextChar(); if (c == '[') { if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else c = TransmitText->nextChar(); while (c != ']' && c != -1) { fname += c; if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else c = TransmitText->nextChar(); } if (c == -1) return (GET_TX_CHAR_NODATA); if (active_modem->get_mode() == MODE_IFKP) { ifkp_load_scaled_image(fname); return (GET_TX_CHAR_NODATA); } if (active_modem->get_mode() >= MODE_THOR_FIRST && active_modem->get_mode() <= MODE_THOR_LAST) { thor_load_scaled_image(fname); return (GET_TX_CHAR_NODATA); } active_modem->send_color_image(fname); } } return(GET_TX_CHAR_NODATA); case 'p': case 'P': TransmitText->pause(); break; case 'r': if (active_modem->get_mode() == MODE_IFKP) REQ(&FTextTX::clear, ifkp_tx_text); else REQ(&FTextTX::clear, TransmitText); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); break; case 'R': if (active_modem->get_mode() == MODE_IFKP) { if (ifkp_tx_text->eot()) { REQ(&FTextTX::clear, ifkp_tx_text); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); } else return(GET_TX_CHAR_NODATA); } else { if (TransmitText->eot()) { REQ(&FTextTX::clear, TransmitText); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); } else return(GET_TX_CHAR_NODATA); } break; case 'L': REQ(qso_save_now); return(GET_TX_CHAR_NODATA); break; case 'C': REQ(clearQSO); return(GET_TX_CHAR_NODATA); break; case '!': if (queue_must_rx()) { que_timeout = 400; // 20 seconds REQ(queue_execute_after_rx, (void *)0); while(que_waiting) { MilliSleep(10); Fl::awake(); } return(GET_TX_CHAR_ETX); } else { REQ(do_que_execute, (void*)0); while(que_waiting) { MilliSleep(10); Fl::awake(); } return (GET_TX_CHAR_NODATA); } break; default: char utf8_char[6]; int utf8_len = fl_utf8encode(c, utf8_char); tx_encoder.push("^" + string(utf8_char, utf8_len)); } } else if (c == '\n') { tx_encoder.push("\r\n"); } else { char utf8_char[6]; int utf8_len = fl_utf8encode(c, utf8_char); tx_encoder.push(string(utf8_char, utf8_len)); } transmit: c = tx_encoder.pop(); if (c == -1) { LOG_ERROR("TX encoding conversion error: pushed content, but got nothing back"); return(GET_TX_CHAR_NODATA); } if (progdefaults.tx_lowercase) c = fl_tolower(c); start_deadman(); return(c); } void put_echo_char(unsigned int data, int style) { // suppress print to rx widget when making timing tests if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) return; if(progdefaults.ax25_decode_enabled && data_io_enabled == KISS_IO) { disp_rx_processed_char(); return; } trx_mode mode = active_modem->get_mode(); if (mode == MODE_CW && progdefaults.QSKadjust) return; REQ(&add_tx_char, data); // select a byte translation table const char **asc = NULL;//ascii; if (mailclient || mailserver || arq_text_available) asc = ascii2; else if (progdefaults.show_all_codes) asc = ascii3; else if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) asc = ascii3; // assign a style to the data if (asc == ascii2 && iscntrl(data)) style = FTextBase::CTRL; // receive and convert the data static unsigned int lastdata = 0; if (data == '\r' && lastdata == '\r') // reject multiple CRs return; if (asc == NULL) echo_chd.rx(data); else echo_chd.rx((unsigned char *)asc[data & 0xFF]); lastdata = data; if (Maillogfile) { string s = iscntrl(data & 0x7F) ? ascii2[data & 0x7F] : string(1, data); Maillogfile->log_to_file(cLogfile::LOG_TX, s); } if (echo_chd.data_length() > 0) { if (active_modem->get_mode() == MODE_FSQ) REQ(&FTextRX::addstr, fsq_rx_text, echo_chd.data(), style); else if (active_modem->get_mode() == MODE_IFKP) REQ(&FTextRX::addstr, ifkp_rx_text, echo_chd.data(), style); else REQ(&FTextRX::addstr, ReceiveText, echo_chd.data(), style); if (progStatus.LOGenabled) logfile->log_to_file(cLogfile::LOG_TX, echo_chd.data()); echo_chd.clear(); } } void resetRTTY() { if (active_modem->get_mode() == MODE_RTTY) trx_start_modem(active_modem); } void resetOLIVIA() { trx_mode md = active_modem->get_mode(); if (md >= MODE_OLIVIA && md <= MODE_OLIVIA_64_2000) trx_start_modem(active_modem); } void resetCONTESTIA() { if (active_modem->get_mode() == MODE_CONTESTIA) trx_start_modem(active_modem); } //void updatePACKET() { // if (active_modem->get_mode() == MODE_PACKET) // trx_start_modem(active_modem); //} void resetTHOR() { trx_mode md = active_modem->get_mode(); if (md == MODE_THORMICRO || md == MODE_THOR4 || md == MODE_THOR5 || md == MODE_THOR8 || md == MODE_THOR11 || md == MODE_THOR16 || md == MODE_THOR22 || md == MODE_THOR25x4 || md == MODE_THOR50x1 || md == MODE_THOR50x2 || md == MODE_THOR100 ) trx_start_modem(active_modem); } void resetDOMEX() { trx_mode md = active_modem->get_mode(); if (md == MODE_DOMINOEXMICRO || md == MODE_DOMINOEX4 || md == MODE_DOMINOEX5 || md == MODE_DOMINOEX8 || md == MODE_DOMINOEX11 || md == MODE_DOMINOEX16 || md == MODE_DOMINOEX22 || md == MODE_DOMINOEX44 || md == MODE_DOMINOEX88 ) trx_start_modem(active_modem); } void resetSoundCard() { trx_reset(); } void setReverse(int rev) { active_modem->set_reverse(rev); } void start_tx() { if (!(active_modem->get_cap() & modem::CAP_TX)) return; trx_transmit(); } void abort_tx() { if (trx_state == STATE_TUNE) { btnTune->value(0); btnTune->do_callback(); return; } if (trx_state == STATE_TX) { queue_reset(); trx_start_modem(active_modem); } } void set_rx_tx() { abort_tx(); rx_only = false; btnTune->activate(); wf->xmtrcv->activate(); } void set_rx_only() { abort_tx(); rx_only = true; btnTune->deactivate(); wf->xmtrcv->deactivate(); } void qsy(long long rfc, int fmid) { if (rfc <= 0LL) { rfc = wf->rfcarrier(); } if (fmid > 0) { if (active_modem->freqlocked()) active_modem->set_freqlock(false); else active_modem->set_freq(fmid); // required for modems that will not change their freq (e.g. mt63) int adj = active_modem->get_freq() - fmid; if (adj) rfc += (wf->USB() ? adj : -adj); } if (rfc == wf->rfcarrier()) { return; } if (connected_to_flrig) REQ(xmlrpc_rig_set_qsy, rfc); else if (progdefaults.chkUSERIGCATis) REQ(rigCAT_set_qsy, rfc); #if USE_HAMLIB else if (progdefaults.chkUSEHAMLIBis) REQ(hamlib_set_qsy, rfc); #endif else qso_selectFreq((long int) rfc, fmid); string testmode = qso_opMODE->value(); bool xcvr_useFSK = (testmode.find("RTTY") != string::npos); if (xcvr_useFSK) { int fmid = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift]/2; wf->carrier(fmid); } } map qrg_marks; qrg_mode_t last_marked_qrg; void note_qrg(bool no_dup, const char* prefix, const char* suffix, trx_mode mode, long long rfc, int afreq) { qrg_mode_t m; m.rfcarrier = (rfc ? rfc : wf->rfcarrier()); m.carrier = (afreq ? afreq : active_modem->get_freq()); m.mode = (mode < NUM_MODES ? mode : active_modem->get_mode()); if (no_dup && last_marked_qrg == m) return; last_marked_qrg = m; char buf[64]; time_t t = time(NULL); struct tm tm; gmtime_r(&t, &tm); size_t r1; if ((r1 = strftime(buf, sizeof(buf), "<<%Y-%m-%dT%H:%MZ ", &tm)) == 0) return; size_t r2; if (m.rfcarrier) r2 = snprintf(buf+r1, sizeof(buf)-r1, "%s @ %lld%c%04d>>", mode_info[m.mode].name, m.rfcarrier, (wf->USB() ? '+' : '-'), m.carrier); else r2 = snprintf(buf+r1, sizeof(buf)-r1, "%s @ %04d>>", mode_info[m.mode].name, m.carrier); if (r2 >= sizeof(buf)-r1) return; qrg_marks[buf] = m; if (prefix && *prefix) ReceiveText->addstr(prefix); ReceiveText->addstr(buf, FTextBase::QSY); ReceiveText->mark(); if (suffix && *suffix) ReceiveText->addstr(suffix); } // To be called from the main thread. void * set_xmtrcv_button_true(void) { wf->xmtrcv->value(true); wf->xmtrcv->redraw(); return (void *)0; } // To be called from the main thread. void * set_xmtrcv_button_false(void) { wf->xmtrcv->value(false); wf->xmtrcv->redraw(); return (void *)0; } // To be called from the main thread. void * set_xmtrcv_selection_color_transmitting(void) { wf->xmtrcv_selection_color(progdefaults.XmtColor); return (void *)0; } // To be called from the main thread. void * set_xmtrcv_selection_color_pending(void) { wf->xmtrcv_selection_color(FL_YELLOW); return (void *)0; } void xmtrcv_selection_color(Fl_Color clr) { wf->xmtrcv_selection_color(clr); } void xmtrcv_selection_color() { wf->xmtrcv_selection_color(progdefaults.XmtColor); } void rev_selection_color() { wf->reverse_selection_color(progdefaults.RevColor); } void xmtlock_selection_color() { wf->xmtlock_selection_color(progdefaults.LkColor); } void sql_selection_color() { if (!btnSQL) return; btnSQL->selection_color(progdefaults.Sql1Color); btnSQL->redraw(); } void afc_selection_color() { if (!btnAFC) return; btnAFC->selection_color(progdefaults.AfcColor); btnAFC->redraw(); } void rxid_selection_color() { cbRSID(NULL, NULL); } void txid_selection_color() { if (!btnTxRSID) return; btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->redraw(); } void tune_selection_color() { if (!btnTune) return; btnTune->selection_color(progdefaults.TuneColor); btnTune->redraw(); } void spot_selection_color() { if (!btnAutoSpot) return; btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->redraw(); } void set_default_btn_color() { Fl_Light_Button *buttons[] = { btn_FSQCALL, btn_SELCAL, btn_MONITOR, btnPSQL, btnDupCheckOn, btn_WKCW_connect, btn_WKFSK_connect, btn_nanoCW_connect, btn_nanoIO_connect, btn_enable_auditlog, btn_enable_fsq_heard_log, btn_enable_ifkp_audit_log, btn_enable_ifkp_audit_log, btn_Nav_connect, btn_Nav_config, btnConnectTalker }; size_t nbtns = sizeof(buttons)/sizeof(*buttons); for (size_t i = 0; i < nbtns; i++) { if (buttons[i] != NULL) { buttons[i]->selection_color(progdefaults.default_btn_color); buttons[i]->redraw(); } } } void set_colors() { spot_selection_color(); tune_selection_color(); txid_selection_color(); rxid_selection_color(); sql_selection_color(); afc_selection_color(); xmtlock_selection_color(); tune_selection_color(); set_default_btn_color(); set_log_colors(); } // Olivia void set_olivia_bw(int bw) { int i; if (bw == 125) i = 0; else if (bw == 250) i = 1; else if (bw == 500) i = 2; else if (bw == 1000) i = 3; else i = 4; bool changed = progdefaults.changed; i_listbox_olivia_bandwidth->index(i); i_listbox_olivia_bandwidth->do_callback(); progdefaults.changed = changed; } void set_olivia_tones(int tones) { unsigned i = -1; while (tones >>= 1) i++; bool changed = progdefaults.changed; i_listbox_olivia_tones->index(i);//+1); i_listbox_olivia_tones->do_callback(); progdefaults.changed = changed; } //Contestia void set_contestia_bw(int bw) { int i; if (bw == 125) i = 0; else if (bw == 250) i = 1; else if (bw == 500) i = 2; else if (bw == 1000) i = 3; else i = 4; bool changed = progdefaults.changed; i_listbox_contestia_bandwidth->index(i); i_listbox_contestia_bandwidth->do_callback(); progdefaults.changed = changed; } void set_contestia_tones(int tones) { unsigned i = -1; while (tones >>= 1) i++; bool changed = progdefaults.changed; i_listbox_contestia_tones->index(i); i_listbox_contestia_tones->do_callback(); progdefaults.changed = changed; } void set_rtty_shift(int shift) { if (shift < selCustomShift->minimum() || shift > selCustomShift->maximum()) return; // Static const array otherwise will be built at each call. static const int shifts[] = { 23, 85, 160, 170, 182, 200, 240, 350, 425, 850 }; size_t i; for (i = 0; i < sizeof(shifts)/sizeof(*shifts); i++) if (shifts[i] == shift) break; selShift->index(i); selShift->do_callback(); if (i == sizeof(shifts)/sizeof(*shifts)) { selCustomShift->value(shift); selCustomShift->do_callback(); } } void set_rtty_baud(float baud) { // Static const array otherwise will be rebuilt at each call. static const float bauds[] = { 45.0f, 45.45f, 50.0f, 56.0f, 75.0f, 100.0f, 110.0f, 150.0f, 200.0f, 300.0f }; for (size_t i = 0; i < sizeof(bauds)/sizeof(*bauds); i++) { if (bauds[i] == baud) { selBaud->index(i); selBaud->do_callback(); break; } } } void set_rtty_bits(int bits) { // Static const array otherwise will be built at each call. static const int bits_[] = { 5, 7, 8 }; for (size_t i = 0; i < sizeof(bits_)/sizeof(*bits_); i++) { if (bits_[i] == bits) { selBits->index(i); selBits->do_callback(); break; } } } void set_rtty_bw(float bw) { } int notch_frequency = 0; void notch_on(int freq) { notch_frequency = freq; set_flrig_notch(); rigCAT_set_notch(notch_frequency); } void notch_off() { notch_frequency = 0; set_flrig_notch(); rigCAT_set_notch(notch_frequency); } void enable_kiss(void) { if(btnEnable_arq->value()) { btnEnable_arq->value(false); } progdefaults.changed = true; progdefaults.data_io_enabled = KISS_IO; progStatus.data_io_enabled = KISS_IO; data_io_enabled = KISS_IO; btnEnable_kiss->value(true); enable_disable_kpsql(); } void enable_arq(void) { if(btnEnable_kiss->value()) { btnEnable_kiss->value(false); } progdefaults.changed = true; progdefaults.data_io_enabled = ARQ_IO; progStatus.data_io_enabled = ARQ_IO; data_io_enabled = ARQ_IO; btnEnable_arq->value(true); enable_disable_kpsql(); } void enable_disable_kpsql(void) { if (progdefaults.data_io_enabled == KISS_IO) { check_kiss_modem(); //btnPSQL->activate(); //if(progStatus.kpsql_enabled || progdefaults.kpsql_enabled) { // btnPSQL->value(true); // btnPSQL->do_callback(); //} } else { sldrSquelch->value(progStatus.sldrSquelchValue); //btnPSQL->value(false); //btnPSQL->deactivate(); } progStatus.data_io_enabled = progdefaults.data_io_enabled; } void disable_config_p2p_io_widgets(void) { btnEnable_arq->deactivate(); btnEnable_kiss->deactivate(); btnEnable_ax25_decode->deactivate(); //btnEnable_csma->deactivate(); txtKiss_ip_address->deactivate(); txtKiss_ip_io_port_no->deactivate(); txtKiss_ip_out_port_no->deactivate(); btnEnable_dual_port->deactivate(); //btnEnableBusyChannel->deactivate(); //cntKPSQLAttenuation->deactivate(); //cntBusyChannelSeconds->deactivate(); btnDefault_kiss_ip->deactivate(); btn_restart_kiss->deactivate(); btnEnable_7bit_modem_inhibit->deactivate(); btnEnable_auto_connect->deactivate(); btnKissTCPIO->deactivate(); btnKissUDPIO->deactivate(); btnKissTCPListen->deactivate(); btn_connect_kiss_io->deactivate(); txtArq_ip_address->deactivate(); txtArq_ip_port_no->deactivate(); btnDefault_arq_ip->deactivate(); btn_restart_arq->deactivate(); txtXmlrpc_ip_address->deactivate(); txtXmlrpc_ip_port_no->deactivate(); btnDefault_xmlrpc_ip->deactivate(); btn_restart_xml->deactivate(); txt_flrig_ip_address->deactivate(); txt_flrig_ip_port->deactivate(); btnDefault_flrig_ip->deactivate(); btn_reconnect_flrig_server->deactivate(); txt_fllog_ip_address->deactivate(); txt_fllog_ip_port->deactivate(); btnDefault_fllog_ip->deactivate(); btn_reconnect_log_server->deactivate(); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void enable_config_p2p_io_widgets(void) { btnEnable_arq->activate(); btnEnable_kiss->activate(); btnEnable_ax25_decode->activate(); //btnEnable_csma->activate(); txtKiss_ip_address->activate(); txtKiss_ip_io_port_no->activate(); txtKiss_ip_out_port_no->activate(); btnEnable_dual_port->activate(); //btnEnableBusyChannel->activate(); //cntKPSQLAttenuation->activate(); //cntBusyChannelSeconds->activate(); btnDefault_kiss_ip->activate(); btn_restart_kiss->activate(); btnEnable_7bit_modem_inhibit->activate(); btnEnable_auto_connect->activate(); btnKissTCPIO->activate(); btnKissUDPIO->activate(); btnKissTCPListen->activate(); btn_connect_kiss_io->activate(); txtArq_ip_address->activate(); txtArq_ip_port_no->activate(); btnDefault_arq_ip->activate(); btn_restart_arq->activate(); txtXmlrpc_ip_address->activate(); txtXmlrpc_ip_port_no->activate(); btnDefault_xmlrpc_ip->activate(); btn_restart_xml->activate(); txt_flrig_ip_address->activate(); txt_flrig_ip_port->activate(); btnDefault_flrig_ip->activate(); btn_reconnect_flrig_server->activate(); txt_fllog_ip_address->activate(); txt_fllog_ip_port->activate(); btnDefault_fllog_ip->activate(); btn_reconnect_log_server->activate(); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void set_ip_to_default(int which_io) { switch(which_io) { case ARQ_IO: txtArq_ip_address->value(DEFAULT_ARQ_IP_ADDRESS); txtArq_ip_port_no->value(DEFAULT_ARQ_IP_PORT); txtArq_ip_address->do_callback(); txtArq_ip_port_no->do_callback(); break; case KISS_IO: txtKiss_ip_address->value(DEFAULT_KISS_IP_ADDRESS); txtKiss_ip_io_port_no->value(DEFAULT_KISS_IP_IO_PORT); txtKiss_ip_out_port_no->value(DEFAULT_KISS_IP_OUT_PORT); btnEnable_dual_port->value(false); txtKiss_ip_address->do_callback(); txtKiss_ip_io_port_no->do_callback(); txtKiss_ip_out_port_no->do_callback(); btnEnable_dual_port->do_callback(); break; case XMLRPC_IO: txtXmlrpc_ip_address->value(DEFAULT_XMLPRC_IP_ADDRESS); txtXmlrpc_ip_port_no->value(DEFAULT_XMLRPC_IP_PORT); txtXmlrpc_ip_address->do_callback(); txtXmlrpc_ip_port_no->do_callback(); break; case FLRIG_IO: txt_flrig_ip_address->value(DEFAULT_FLRIG_IP_ADDRESS); txt_flrig_ip_port->value(DEFAULT_FLRIG_IP_PORT); txt_flrig_ip_address->do_callback(); txt_flrig_ip_port->do_callback(); break; case FLLOG_IO: txt_fllog_ip_address->value(DEFAULT_FLLOG_IP_ADDRESS); txt_fllog_ip_port->value(DEFAULT_FLLOG_IP_PORT); txt_fllog_ip_address->do_callback(); txt_fllog_ip_port->do_callback(); break; } } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void kiss_io_set_button_state(void *ptr) { if(progStatus.kiss_tcp_io) { btn_connect_kiss_io->activate(); btn_connect_kiss_io->redraw(); btnKissTCPIO->activate(); btnKissTCPIO->value(true); btnKissTCPListen->activate(); btnKissUDPIO->value(false); btnKissUDPIO->activate(); btnEnable_dual_port->deactivate(); } else { btn_connect_kiss_io->activate(); btnKissTCPIO->value(false); btnKissTCPIO->activate(); btnKissTCPListen->activate(); btnKissUDPIO->value(true); btnKissUDPIO->activate(); btnEnable_dual_port->activate(); } char *label = (char *)0; if(ptr) label = (char *)ptr; if(label) { btn_connect_kiss_io->label(label); btn_connect_kiss_io->redraw(); } if(progStatus.ip_lock) { btn_connect_kiss_io->deactivate(); btnKissTCPIO->deactivate(); btnKissUDPIO->deactivate(); btnKissTCPListen->deactivate(); btnEnable_dual_port->deactivate(); } } //----------------------------------------------------------------------------- // Update CSMA Display Widgets in the IO Configuration Panel //----------------------------------------------------------------------------- void update_csma_io_config(int which) { char buf[32]; if(which & CSMA_PERSISTANCE) { cntPersistance->value(progStatus.csma_persistance); if(progStatus.csma_persistance >= 0) { float results = ((progStatus.csma_persistance + 1) / 256.0) * 100.0; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%f", results); OutputPersistancePercent->value(buf); } } if(which & CSMA_SLOT_TIME) { cntSlotTime->value(progStatus.csma_slot_time); int results = progStatus.csma_slot_time * 10; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%d", results); OutputSlotTimeMS->value(buf); } if(which & CSMA_TX_DELAY) { cntTransmitDelay->value(progStatus.csma_transmit_delay); int results = progStatus.csma_transmit_delay * 10; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%d", results); OutputTransmitDelayMS->value(buf); } } //----------------------------------------------------------------------------- // Set PSM configuration panel defaults values. //----------------------------------------------------------------------------- void psm_set_defaults(void) { progdefaults.csma_persistance = progStatus.csma_persistance = 63; progdefaults.csma_slot_time = progStatus.csma_slot_time = 10; progdefaults.csma_transmit_delay = progStatus.csma_transmit_delay = 50; progdefaults.psm_flush_buffer_timeout = progStatus.psm_flush_buffer_timeout = 15; progdefaults.psm_minimum_bandwidth_margin = progStatus.psm_minimum_bandwidth_margin = 10; progdefaults.psm_histogram_offset_threshold = progStatus.psm_histogram_offset_threshold = 3; progdefaults.psm_hit_time_window = progStatus.psm_hit_time_window = 15; progdefaults.kpsql_attenuation = progStatus.kpsql_attenuation = 2; progdefaults.busyChannelSeconds = progStatus.busyChannelSeconds = 3; cntPersistance->value(progStatus.csma_persistance); cntSlotTime->value(progStatus.csma_slot_time); cntTransmitDelay->value(progStatus.csma_transmit_delay); cntPSMTXBufferFlushTimer->value(progStatus.psm_flush_buffer_timeout); cntPSMBandwidthMargins->value(progStatus.psm_minimum_bandwidth_margin); cntPSMThreshold->value(progStatus.psm_histogram_offset_threshold); cntPSMValidSamplePeriod->value(progStatus.psm_hit_time_window); cntKPSQLAttenuation->value(progdefaults.kpsql_attenuation); cntBusyChannelSeconds->value(progStatus.busyChannelSeconds); update_csma_io_config(CSMA_ALL); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void set_CSV(int start) { if (active_modem->get_mode() != MODE_ANALYSIS) return; if (start == 1) active_modem->start_csv(); else if (start == 0) active_modem->stop_csv(); else if (active_modem->write_to_csv == true) active_modem->stop_csv(); else active_modem->start_csv(); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void set_freq_control_lsd() { qsoFreqDisp1->set_lsd(progdefaults.sel_lsd); qsoFreqDisp2->set_lsd(progdefaults.sel_lsd); qsoFreqDisp3->set_lsd(progdefaults.sel_lsd); } //----------------------------------------------------------------------------- // FSQ mode control interface functions //----------------------------------------------------------------------------- std::string fsq_selected_call = "allcall"; static int heard_picked; void clear_heard_list(); void cb_heard_delete(Fl_Widget *w, void *) { int sel = fl_choice2(_("Delete entry?"), _("All"), _("No"), _("Yes")); if (sel == 2) { fsq_heard->remove(heard_picked); fsq_heard->redraw(); } if (sel == 0) clear_heard_list(); } void cb_heard_copy(Fl_Widget *w, void *) { // copy to clipboard Fl::copy(fsq_selected_call.c_str(), fsq_selected_call.length(), 1); } void cb_heard_copy_to_log(Fl_Widget *w, void *) { inpCall->value(fsq_selected_call.c_str()); cb_call(inpCall, (void *)0); } void cb_heard_copy_all(Fl_Widget *w, void *) { if (fsq_heard->size() < 2) return; fsq_selected_call.clear(); for (int i = 2; i <= fsq_heard->size(); i++) { fsq_selected_call.append(fsq_heard->text(i)); size_t p = fsq_selected_call.find(','); if (p != std::string::npos) fsq_selected_call.erase(p); fsq_selected_call.append(" "); } Fl::copy(fsq_selected_call.c_str(), fsq_selected_call.length(), 1); } void cb_heard_query_snr(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("?"); fsq_xmt(s); } void cb_heard_query_heard(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("$"); fsq_xmt(s); } void cb_heard_query_at(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("@"); fsq_xmt(s); } void cb_heard_query_carat(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("^^"); fsq_xmt(s); } void cb_heard_query_amp(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("&"); fsq_xmt(s); } void cb_heard_send_file(Fl_Widget *w, void *) { std::string deffilename = TempDir; deffilename.append("fsq.txt"); const char* p = FSEL::select( "Select send file", "*.txt", deffilename.c_str()); if (!p) return; if (!*p) return; std::string fname = fl_filename_name(p); ifstream txfile(p); if (!txfile) return; stringstream text; char ch = txfile.get(); while (!txfile.eof()) { text << ch; ch = txfile.get(); } txfile.close(); std::string s = fsq_selected_call.c_str(); s.append("#["); s.append(fname.c_str()); s.append("]\n"); s.append(text.str().c_str()); fsq_xmt(s); } void cb_heard_read_file(Fl_Widget *w, void*) { const char *p = fl_input2("File name"); if (p == NULL) return; string fname = p; if (fname.empty()) return; std::string s = fsq_selected_call.c_str(); s.append("+["); s.append(fname.c_str()); s.append("]^r"); fsq_xmt(s); } void cb_heard_query_plus(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("+"); fsq_xmt(s); } void cb_heard_send_msg(Fl_Widget *w, void*) { const char *p = fl_input2("Send message"); if (p == NULL) return; string msg = p; if (msg.empty()) return; std::string s = fsq_selected_call.c_str(); s.append("#["); s.append(active_modem->fsq_mycall()); s.append("]"); s.append(msg.c_str()); fsq_xmt(s); } void cb_heard_send_image(Fl_Widget *w, void *) { fsq_showTxViewer('L'); } static const Fl_Menu_Item *heard_popup; static const Fl_Menu_Item all_popup[] = { { "Copy", 0, cb_heard_copy, 0 }, { "Copy All", 0, cb_heard_copy_all, 0 , FL_MENU_DIVIDER }, { "Send File To... (#)", 0, cb_heard_send_file, 0, FL_MENU_DIVIDER }, { "Send Image To... (%)", 0, cb_heard_send_image, 0 }, { 0, 0, 0, 0 } }; static const Fl_Menu_Item directed_popup[] = { { "Copy", 0, cb_heard_copy, 0 }, { "Log call", 0, cb_heard_copy_to_log, 0 }, { "Copy All", 0, cb_heard_copy_all, 0 }, { "Delete", 0, cb_heard_delete, 0, FL_MENU_DIVIDER }, { "Query SNR (?)", 0, cb_heard_query_snr, 0 }, { "Query Heard ($)", 0, cb_heard_query_heard, 0 }, { "Query Location (@@)", 0, cb_heard_query_at, 0 }, { "Query Station Msg (&&)", 0, cb_heard_query_amp, 0 }, { "Query program version (^)", 0, cb_heard_query_carat, 0, FL_MENU_DIVIDER }, { "Send Message To... (#)", 0, cb_heard_send_msg, 0 }, { "Read Messages From (+)", 0, cb_heard_query_plus, 0, FL_MENU_DIVIDER }, { "Send File To... (#)", 0, cb_heard_send_file, 0 }, { "Read File From... (+)", 0, cb_heard_read_file, 0, FL_MENU_DIVIDER }, { "Send Image To... (%)", 0, cb_heard_send_image, 0 }, { 0, 0, 0, 0 } }; std::string heard_list() { string heard; if (fsq_heard->size() < 2) return heard; for (int i = 2; i <= fsq_heard->size(); i++) heard.append(fsq_heard->text(i)).append("\n"); heard.erase(heard.length() - 1); // remove last LF size_t p = heard.find(","); while (p != std::string::npos) { heard.insert(p+1," "); p = heard.find(",", p+2); } return heard; } void clear_heard_list() { if (active_modem->get_mode() == MODE_FSQ) { fsq_heard->clear(); fsq_heard->add("allcall"); fsq_heard->redraw(); } else { ifkp_heard->clear(); ifkp_heard->redraw(); } } int tm2int(string s) { int t = (s[2]-'0')*10 + s[3] - '0'; t += 60*((s[0] - '0')*10 + s[1] - '0'); return t * 60; } void age_heard_list() { string entry; string now = ztime(); now.erase(4); int tnow = tm2int(now); string tm; int aging_secs; switch (progdefaults.fsq_heard_aging) { case 1: aging_secs = 60; break; // 1 minute case 2: aging_secs = 300; break; // 5 minutes case 3: aging_secs = 600; break; // 10 minutes case 4: aging_secs = 1200; break; // 20 minutes case 5: aging_secs = 1800; break; // 30 minutes case 6: aging_secs = 3600; break; // 60 minutes case 7: aging_secs = 5400; break; // 90 minutes case 8: aging_secs = 7200; break; // 120 minutes case 0: default: return; // no aging } if (active_modem->get_mode() == MODE_FSQ) { if (fsq_heard->size() < 2) return; for (int i = fsq_heard->size(); i > 1; i--) { entry = fsq_heard->text(i); size_t pos = entry.find(","); tm = entry.substr(pos+1,5); tm.erase(2,1); int tdiff = tnow - tm2int(tm); if (tdiff < 0) tdiff += 24*60*60; if (tdiff >= aging_secs) fsq_heard->remove(i); } fsq_heard->redraw(); } else { if (ifkp_heard->size() == 0) return; for (int i = ifkp_heard->size(); i > 0; i--) { entry = ifkp_heard->text(i); size_t pos = entry.find(","); tm = entry.substr(pos+1,5); tm.erase(2,1); int tdiff = tnow - tm2int(tm); if (tdiff < 0) tdiff += 24*60*60; if (tdiff >= aging_secs) ifkp_heard->remove(i); } ifkp_heard->redraw(); } } void add_to_heard_list(string szcall, string szdb) { int found = 0; size_t pos_comma; std::string testcall; std::string line; std::string time = inpTimeOff->value(); std::string str = szcall; str.append(","); str += time[0]; str += time[1]; str += ':'; str += time[2]; str += time[3]; str.append(",").append(szdb); if (active_modem->get_mode() == MODE_FSQ) { if (fsq_heard->size() < 2) { fsq_heard->add(str.c_str()); } else { for (int i = 2; i <= fsq_heard->size(); i++) { line = fsq_heard->text(i); pos_comma = line.find(","); if (pos_comma != std::string::npos) { testcall = line.substr(0, pos_comma); if (testcall == szcall) { found = i; break; } } } if (found) fsq_heard->remove(found); fsq_heard->insert(2, str.c_str()); } fsq_heard->redraw(); } else { if (ifkp_heard->size() == 0) { ifkp_heard->add(str.c_str()); } else { for (int i = 1; i <= ifkp_heard->size(); i++) { line = ifkp_heard->text(i); pos_comma = line.find(","); if (pos_comma != std::string::npos) { testcall = line.substr(0, pos_comma); if (testcall == szcall) { found = i; break; } } } if (found) ifkp_heard->remove(found); ifkp_heard->insert(1, str.c_str()); } ifkp_heard->redraw(); } if (progStatus.spot_recv) spot_log(szcall.c_str(), inpLoc->value(), wf->rfcarrier(), active_modem->get_mode()); } bool in_heard(string call) { std::string line; for (int i = 1; i <= fsq_heard->size(); i++) { line = fsq_heard->text(i); if (line.find(call) == 0) return true; } return false; } void fsq_repeat_last_heard() { fsq_tx_text->add(fsq_selected_call.c_str()); } void cb_fsq_heard(Fl_Browser*, void*) { heard_picked = fsq_heard->value(); if (!heard_picked) return; int k = Fl::event_key(); fsq_selected_call = fsq_heard->text(heard_picked); size_t p = fsq_selected_call.find(','); if (p != std::string::npos) fsq_selected_call.erase(p); switch (k) { case FL_Button + FL_LEFT_MOUSE: if (Fl::event_clicks()) { if (!fsq_tx_text->eot()) fsq_tx_text->add(" "); fsq_tx_text->add(fsq_selected_call.c_str()); } break; case FL_Button + FL_RIGHT_MOUSE: if (heard_picked == 1) heard_popup = all_popup; else heard_popup = directed_popup; const Fl_Menu_Item *m = heard_popup->popup(Fl::event_x(), Fl::event_y()); if (m && m->callback()) m->do_callback(0); break; } restoreFocus(); } void cb_ifkp_heard(Fl_Browser*, void*) { heard_picked = ifkp_heard->value(); if (!heard_picked) return; int k = Fl::event_key(); std::string selected_call = ifkp_heard->text(heard_picked); size_t p = selected_call.find(','); if (p != std::string::npos) selected_call.erase(p); switch (k) { case FL_Button + FL_LEFT_MOUSE: if (Fl::event_clicks()) { ifkp_tx_text->add(" "); ifkp_tx_text->add(selected_call.c_str()); } break; case FL_Button + FL_RIGHT_MOUSE: ifkp_heard->remove(heard_picked); break; } restoreFocus(); } static void do_fsq_rx_text(std::string text, int style) { for (size_t n = 0; n < text.length(); n++) rx_parser( text[n], style ); } void display_fsq_rx_text(std::string text, int style) { REQ(do_fsq_rx_text, text, style); } void display_fsq_mon_text(std::string text, int style) { REQ(&FTextRX::addstr, fsq_monitor, text, style); } void cbFSQQTC(Fl_Widget *w, void *d) { fsq_tx_text->add(progdefaults.fsqQTCtext.c_str()); restoreFocus(); } void cbFSQCQ(Fl_Widget *w, void *d) { fsq_xmt("cqcqcq"); restoreFocus(); } void cbFSQQTH(Fl_Widget *w, void *d) { fsq_tx_text->add(progdefaults.myQth.c_str()); restoreFocus(); } void cbMONITOR(Fl_Widget *w, void *d) { Fl_Light_Button *btn = (Fl_Light_Button *)w; if (btn->value() == 1) open_fsqMonitor(); else { progStatus.fsqMONITORxpos = fsqMonitor->x(); progStatus.fsqMONITORypos = fsqMonitor->y(); progStatus.fsqMONITORwidth = fsqMonitor->w(); progStatus.fsqMONITORheight = fsqMonitor->h(); fsqMonitor->hide(); } } void close_fsqMonitor() { if (!fsqMonitor) return; btn_MONITOR->value(0); progStatus.fsqMONITORxpos = fsqMonitor->x(); progStatus.fsqMONITORypos = fsqMonitor->y(); progStatus.fsqMONITORwidth = fsqMonitor->w(); progStatus.fsqMONITORheight = fsqMonitor->h(); fsqMonitor->hide(); } void cbSELCAL(Fl_Widget *w, void *d) { Fl_Light_Button *btn = (Fl_Light_Button *)w; int val = btn->value(); if (val) { btn->label("ACTIVE"); } else { btn->label("ASLEEP"); } btn->redraw_label(); restoreFocus(); } void enableSELCAL() { btn_SELCAL->value(1); cbSELCAL(btn_SELCAL, (void *)0); } void cbFSQCALL(Fl_Widget *w, void *d) { Fl_Light_Button *btn = (Fl_Light_Button *)w; int mouse = Fl::event_button(); int val = btn->value(); if (mouse == FL_LEFT_MOUSE) { progdefaults.fsq_directed = val; progdefaults.changed = true; if (val == 0) { btn_SELCAL->value(0); btn_SELCAL->deactivate(); btn->label("FSQ-OFF"); btn->redraw_label(); } else { btn_SELCAL->activate(); btn_SELCAL->value(1); cbSELCAL(btn_SELCAL, 0); btn->label("FSQ-ON"); btn->redraw_label(); } } restoreFocus(); } //====================================================================== //FeldHell resizable Rx character height //====================================================================== extern pthread_mutex_t feld_mutex; void FHdisp_char_height() { guard_lock raster_lock(&feld_mutex); int rh = progdefaults.HellRcvHeight = (int)valHellRcvHeight->value(); rh = FHdisp->change_rowheight(rh); if (rh != progdefaults.HellRcvHeight) { progdefaults.HellRcvHeight = rh; valHellRcvHeight->value(rh); valHellRcvHeight->redraw(); fl_alert2("Selection too large for current Rx height\nIncrease Rx height"); } else progdefaults.changed = true; trx_mode mode = active_modem->get_mode(); if ( (mode >= MODE_HELL_FIRST) && (mode <= MODE_HELL_LAST) ) active_modem->restart(); // adjust upper/lower bounds of Rx/Tx panel minhtext = 2 * progdefaults.HellRcvHeight + 4;//6; minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); minbox->redraw(); // UI_select(); } fldigi-4.1.06/src/dialogs/notifydialog.cxx0000644000175000017500000004205213511722452015413 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "gettext.h" #include "notifydialog.h" #include #include "notify.h" Fl_Group *grpNotifyEvent=(Fl_Group *)0; Fl_Choice *mnuNotifyEvent=(Fl_Choice *)0; Fl_Light_Button *btnNotifyEnabled=(Fl_Light_Button *)0; Fl_Input2 *inpNotifyRE=(Fl_Input2 *)0; Fl_Group *grpNotifyFilter=(Fl_Group *)0; Fl_Round_Button *chkNotifyFilterCall=(Fl_Round_Button *)0; static void cb_chkNotifyFilterCall(Fl_Round_Button* o, void*) { if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->show(); btnNotifyFilterDXCC->hide(); chkNotifyFilterDXCC->value(0); } Fl_Input2 *inpNotifyFilterCall=(Fl_Input2 *)0; Fl_Round_Button *chkNotifyFilterDXCC=(Fl_Round_Button *)0; static void cb_chkNotifyFilterDXCC(Fl_Round_Button* o, void*) { if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->show(); chkNotifyFilterCall->value(0); } Fl_Button *btnNotifyFilterDXCC=(Fl_Button *)0; Fl_Check_Button *chkNotifyFilterNWB=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyFilterLOTW=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyFilterEQSL=(Fl_Check_Button *)0; Fl_Group *grpNotifyDup=(Fl_Group *)0; Fl_Check_Button *chkNotifyDupIgnore=(Fl_Check_Button *)0; Fl_Choice *mnuNotifyDupWhich=(Fl_Choice *)0; Fl_Spinner2 *cntNotifyDupTime=(Fl_Spinner2 *)0; Fl_Check_Button *chkNotifyDupBand=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyDupMode=(Fl_Check_Button *)0; Fl_Group *grpNotifyAction=(Fl_Group *)0; Fl_Spinner2 *cntNotifyActionLimit=(Fl_Spinner2 *)0; Fl_Input2 *inpNotifyActionDialog=(Fl_Input2 *)0; Fl_Button *btnNotifyActionDialogDefault=(Fl_Button *)0; Fl_Spinner2 *cntNotifyActionDialogTimeout=(Fl_Spinner2 *)0; Fl_Input2 *inpNotifyActionRXMarker=(Fl_Input2 *)0; Fl_Button *btnNotifyActionMarkerDefault=(Fl_Button *)0; Fl_Input2 *inpNotifyActionMacro=(Fl_Input2 *)0; Fl_Button *btnNotifyActionMacro=(Fl_Button *)0; Fl_Input2 *inpNotifyActionProgram=(Fl_Input2 *)0; Fl_Button *btnNotifyActionProgram=(Fl_Button *)0; Fl_Button *btnNotifyAdd=(Fl_Button *)0; Fl_Button *btnNotifyRemove=(Fl_Button *)0; Fl_Button *btnNotifyUpdate=(Fl_Button *)0; Fl_Button *btnNotifyTest=(Fl_Button *)0; Fl_Button *btnNotifyClose=(Fl_Button *)0; static void cb_btnNotifyClose(Fl_Button* o, void*) { o->window()->hide(); } Table *tblNotifyList=(Table *)0; Fl_Double_Window* make_notify_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(500, 550, _("Notifications")); w = o; if (w) {/* empty */} { grpNotifyEvent = new Fl_Group(2, 2, 219, 126, _("Event")); grpNotifyEvent->box(FL_ENGRAVED_FRAME); grpNotifyEvent->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { mnuNotifyEvent = new Fl_Choice(10, 29, 205, 22); mnuNotifyEvent->down_box(FL_BORDER_BOX); } // Fl_Choice* mnuNotifyEvent { btnNotifyEnabled = new Fl_Light_Button(131, 94, 80, 23, _("Enabled")); } // Fl_Light_Button* btnNotifyEnabled { Fl_Input2* o = inpNotifyRE = new Fl_Input2(36, 61, 175, 23, _("RE:")); inpNotifyRE->box(FL_DOWN_BOX); inpNotifyRE->color(FL_BACKGROUND2_COLOR); inpNotifyRE->selection_color(FL_SELECTION_COLOR); inpNotifyRE->labeltype(FL_NORMAL_LABEL); inpNotifyRE->labelfont(0); inpNotifyRE->labelsize(14); inpNotifyRE->labelcolor(FL_FOREGROUND_COLOR); inpNotifyRE->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyRE->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyRE grpNotifyEvent->end(); } // Fl_Group* grpNotifyEvent { grpNotifyFilter = new Fl_Group(2, 130, 219, 176, _("Filter")); grpNotifyFilter->box(FL_ENGRAVED_FRAME); grpNotifyFilter->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkNotifyFilterCall = new Fl_Round_Button(12, 157, 80, 20, _("Callsign")); chkNotifyFilterCall->down_box(FL_ROUND_DOWN_BOX); chkNotifyFilterCall->callback((Fl_Callback*)cb_chkNotifyFilterCall); } // Fl_Round_Button* chkNotifyFilterCall { inpNotifyFilterCall = new Fl_Input2(131, 157, 80, 20); inpNotifyFilterCall->box(FL_DOWN_BOX); inpNotifyFilterCall->color(FL_BACKGROUND2_COLOR); inpNotifyFilterCall->selection_color(FL_SELECTION_COLOR); inpNotifyFilterCall->labeltype(FL_NORMAL_LABEL); inpNotifyFilterCall->labelfont(0); inpNotifyFilterCall->labelsize(14); inpNotifyFilterCall->labelcolor(FL_FOREGROUND_COLOR); inpNotifyFilterCall->align(Fl_Align(FL_ALIGN_CENTER)); inpNotifyFilterCall->when(FL_WHEN_RELEASE); } // Fl_Input2* inpNotifyFilterCall { chkNotifyFilterDXCC = new Fl_Round_Button(12, 186, 110, 20, _("DXCC entity")); chkNotifyFilterDXCC->down_box(FL_ROUND_DOWN_BOX); chkNotifyFilterDXCC->callback((Fl_Callback*)cb_chkNotifyFilterDXCC); } // Fl_Round_Button* chkNotifyFilterDXCC { btnNotifyFilterDXCC = new Fl_Button(183, 183, 28, 23); btnNotifyFilterDXCC->tooltip(_("Show DXCC entities")); } // Fl_Button* btnNotifyFilterDXCC { chkNotifyFilterNWB = new Fl_Check_Button(12, 216, 155, 20, _("Not worked before")); chkNotifyFilterNWB->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterNWB { chkNotifyFilterLOTW = new Fl_Check_Button(12, 246, 100, 20, _("LotW user")); chkNotifyFilterLOTW->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterLOTW { chkNotifyFilterEQSL = new Fl_Check_Button(12, 276, 100, 20, _("eQSL user")); chkNotifyFilterEQSL->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterEQSL grpNotifyFilter->end(); } // Fl_Group* grpNotifyFilter { grpNotifyDup = new Fl_Group(2, 308, 219, 149, _("Duplicates")); grpNotifyDup->box(FL_ENGRAVED_FRAME); grpNotifyDup->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkNotifyDupIgnore = new Fl_Check_Button(12, 337, 145, 20, _("Ignore duplicates")); chkNotifyDupIgnore->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupIgnore { mnuNotifyDupWhich = new Fl_Choice(33, 367, 120, 20, _("in:")); mnuNotifyDupWhich->down_box(FL_BORDER_BOX); } // Fl_Choice* mnuNotifyDupWhich { Fl_Spinner2* o = cntNotifyDupTime = new Fl_Spinner2(93, 397, 60, 20, _("Time (s):")); cntNotifyDupTime->box(FL_NO_BOX); cntNotifyDupTime->color(FL_BACKGROUND_COLOR); cntNotifyDupTime->selection_color(FL_BACKGROUND_COLOR); cntNotifyDupTime->labeltype(FL_NORMAL_LABEL); cntNotifyDupTime->labelfont(0); cntNotifyDupTime->labelsize(14); cntNotifyDupTime->labelcolor(FL_FOREGROUND_COLOR); cntNotifyDupTime->minimum(0); cntNotifyDupTime->maximum(97200); cntNotifyDupTime->value(600); cntNotifyDupTime->align(Fl_Align(FL_ALIGN_LEFT)); cntNotifyDupTime->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyDupTime { chkNotifyDupBand = new Fl_Check_Button(12, 427, 65, 20, _("Band")); chkNotifyDupBand->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupBand { chkNotifyDupMode = new Fl_Check_Button(94, 427, 60, 20, _("Mode")); chkNotifyDupMode->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupMode grpNotifyDup->end(); } // Fl_Group* grpNotifyDup { grpNotifyAction = new Fl_Group(222, 2, 276, 394, _("Action")); grpNotifyAction->box(FL_ENGRAVED_FRAME); grpNotifyAction->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Spinner2* o = cntNotifyActionLimit = new Fl_Spinner2(232, 40, 52, 20, _("Trigger limit (s):")); cntNotifyActionLimit->tooltip(_("Minimum time between events")); cntNotifyActionLimit->box(FL_NO_BOX); cntNotifyActionLimit->color(FL_BACKGROUND_COLOR); cntNotifyActionLimit->selection_color(FL_BACKGROUND_COLOR); cntNotifyActionLimit->labeltype(FL_NORMAL_LABEL); cntNotifyActionLimit->labelfont(0); cntNotifyActionLimit->labelsize(14); cntNotifyActionLimit->labelcolor(FL_FOREGROUND_COLOR); cntNotifyActionLimit->minimum(0); cntNotifyActionLimit->maximum(3600); cntNotifyActionLimit->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntNotifyActionLimit->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyActionLimit { Fl_Input2* o = inpNotifyActionDialog = new Fl_Input2(232, 82, 218, 60, _("Show alert window:")); inpNotifyActionDialog->type(4); inpNotifyActionDialog->box(FL_DOWN_BOX); inpNotifyActionDialog->color(FL_BACKGROUND2_COLOR); inpNotifyActionDialog->selection_color(FL_SELECTION_COLOR); inpNotifyActionDialog->labeltype(FL_NORMAL_LABEL); inpNotifyActionDialog->labelfont(0); inpNotifyActionDialog->labelsize(14); inpNotifyActionDialog->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionDialog->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionDialog->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionDialog { btnNotifyActionDialogDefault = new Fl_Button(460, 100, 28, 23); btnNotifyActionDialogDefault->tooltip(_("Insert default text")); } // Fl_Button* btnNotifyActionDialogDefault { Fl_Spinner2* o = cntNotifyActionDialogTimeout = new Fl_Spinner2(232, 164, 52, 20, _("Hide window after (s):")); cntNotifyActionDialogTimeout->box(FL_NO_BOX); cntNotifyActionDialogTimeout->color(FL_BACKGROUND_COLOR); cntNotifyActionDialogTimeout->selection_color(FL_BACKGROUND_COLOR); cntNotifyActionDialogTimeout->labeltype(FL_NORMAL_LABEL); cntNotifyActionDialogTimeout->labelfont(0); cntNotifyActionDialogTimeout->labelsize(14); cntNotifyActionDialogTimeout->labelcolor(FL_FOREGROUND_COLOR); cntNotifyActionDialogTimeout->minimum(0); cntNotifyActionDialogTimeout->maximum(3600); cntNotifyActionDialogTimeout->value(5); cntNotifyActionDialogTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntNotifyActionDialogTimeout->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyActionDialogTimeout { Fl_Input2* o = inpNotifyActionRXMarker = new Fl_Input2(232, 205, 218, 60, _("Append to RX text:")); inpNotifyActionRXMarker->type(4); inpNotifyActionRXMarker->box(FL_DOWN_BOX); inpNotifyActionRXMarker->color(FL_BACKGROUND2_COLOR); inpNotifyActionRXMarker->selection_color(FL_SELECTION_COLOR); inpNotifyActionRXMarker->labeltype(FL_NORMAL_LABEL); inpNotifyActionRXMarker->labelfont(0); inpNotifyActionRXMarker->labelsize(14); inpNotifyActionRXMarker->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionRXMarker->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionRXMarker->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionRXMarker { btnNotifyActionMarkerDefault = new Fl_Button(460, 223, 28, 23); btnNotifyActionMarkerDefault->tooltip(_("Insert default text")); } // Fl_Button* btnNotifyActionMarkerDefault { Fl_Input2* o = inpNotifyActionMacro = new Fl_Input2(232, 287, 218, 60, _("Append to TX text:")); inpNotifyActionMacro->type(4); inpNotifyActionMacro->box(FL_DOWN_BOX); inpNotifyActionMacro->color(FL_BACKGROUND2_COLOR); inpNotifyActionMacro->selection_color(FL_SELECTION_COLOR); inpNotifyActionMacro->labeltype(FL_NORMAL_LABEL); inpNotifyActionMacro->labelfont(0); inpNotifyActionMacro->labelsize(14); inpNotifyActionMacro->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionMacro->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionMacro->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionMacro { btnNotifyActionMacro = new Fl_Button(460, 305, 28, 23); btnNotifyActionMacro->tooltip(_("Show macro editor")); } // Fl_Button* btnNotifyActionMacro { Fl_Input2* o = inpNotifyActionProgram = new Fl_Input2(232, 368, 218, 23, _("Run program:")); inpNotifyActionProgram->box(FL_DOWN_BOX); inpNotifyActionProgram->color(FL_BACKGROUND2_COLOR); inpNotifyActionProgram->selection_color(FL_SELECTION_COLOR); inpNotifyActionProgram->labeltype(FL_NORMAL_LABEL); inpNotifyActionProgram->labelfont(0); inpNotifyActionProgram->labelsize(14); inpNotifyActionProgram->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionProgram->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionProgram->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionProgram { btnNotifyActionProgram = new Fl_Button(460, 368, 28, 23); } // Fl_Button* btnNotifyActionProgram grpNotifyAction->end(); } // Fl_Group* grpNotifyAction { btnNotifyAdd = new Fl_Button(223, 402, 90, 23); } // Fl_Button* btnNotifyAdd { btnNotifyRemove = new Fl_Button(316, 402, 90, 23); } // Fl_Button* btnNotifyRemove { btnNotifyUpdate = new Fl_Button(223, 431, 90, 23); } // Fl_Button* btnNotifyUpdate { btnNotifyTest = new Fl_Button(316, 431, 90, 23); } // Fl_Button* btnNotifyTest { btnNotifyClose = new Fl_Button(408, 431, 90, 23); btnNotifyClose->callback((Fl_Callback*)cb_btnNotifyClose); } // Fl_Button* btnNotifyClose { tblNotifyList = new Table(2, 460, 496, 88); tblNotifyList->box(FL_UP_FRAME); tblNotifyList->color(FL_BACKGROUND_COLOR); tblNotifyList->selection_color(FL_SELECTION_COLOR); tblNotifyList->labeltype(FL_NORMAL_LABEL); tblNotifyList->labelfont(0); tblNotifyList->labelsize(14); tblNotifyList->labelcolor(FL_FOREGROUND_COLOR); tblNotifyList->align(Fl_Align(FL_ALIGN_CENTER)); tblNotifyList->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(tblNotifyList); } // Table* tblNotifyList o->size_range(500, 550); o->end(); } // Fl_Double_Window* o return w; } Table *tblNotifyFilterDXCC=(Table *)0; Fl_Input2 *inpNotifyDXCCSearchCountry=(Fl_Input2 *)0; Fl_Input2 *inpNotifyDXCCSearchCallsign=(Fl_Input2 *)0; Fl_Button *btnNotifyDXCCSelect=(Fl_Button *)0; Fl_Button *btnNotifyDXCCDeselect=(Fl_Button *)0; Fl_Button *btnNotifyDXCCClose=(Fl_Button *)0; static void cb_btnNotifyDXCCClose(Fl_Button* o, void*) { o->window()->hide(); } Fl_Double_Window* make_dxcc_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(435, 450, _("DXCC entities")); w = o; if (w) {/* empty */} { tblNotifyFilterDXCC = new Table(2, 2, 432, 370); tblNotifyFilterDXCC->box(FL_UP_FRAME); tblNotifyFilterDXCC->color(FL_BACKGROUND2_COLOR); tblNotifyFilterDXCC->selection_color(FL_SELECTION_COLOR); tblNotifyFilterDXCC->labeltype(FL_NORMAL_LABEL); tblNotifyFilterDXCC->labelfont(0); tblNotifyFilterDXCC->labelsize(14); tblNotifyFilterDXCC->labelcolor(FL_FOREGROUND_COLOR); tblNotifyFilterDXCC->align(Fl_Align(FL_ALIGN_CENTER)); tblNotifyFilterDXCC->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(tblNotifyFilterDXCC); } // Table* tblNotifyFilterDXCC { Fl_Input2* o = inpNotifyDXCCSearchCountry = new Fl_Input2(104, 382, 120, 23, _("Find country:")); inpNotifyDXCCSearchCountry->tooltip(_("Press return to continue the search")); inpNotifyDXCCSearchCountry->box(FL_DOWN_BOX); inpNotifyDXCCSearchCountry->color(FL_BACKGROUND2_COLOR); inpNotifyDXCCSearchCountry->selection_color(FL_SELECTION_COLOR); inpNotifyDXCCSearchCountry->labeltype(FL_NORMAL_LABEL); inpNotifyDXCCSearchCountry->labelfont(0); inpNotifyDXCCSearchCountry->labelsize(14); inpNotifyDXCCSearchCountry->labelcolor(FL_FOREGROUND_COLOR); inpNotifyDXCCSearchCountry->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyDXCCSearchCountry->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyDXCCSearchCountry { Fl_Input2* o = inpNotifyDXCCSearchCallsign = new Fl_Input2(104, 415, 120, 23, _("Find prefix:")); inpNotifyDXCCSearchCallsign->box(FL_DOWN_BOX); inpNotifyDXCCSearchCallsign->color(FL_BACKGROUND2_COLOR); inpNotifyDXCCSearchCallsign->selection_color(FL_SELECTION_COLOR); inpNotifyDXCCSearchCallsign->labeltype(FL_NORMAL_LABEL); inpNotifyDXCCSearchCallsign->labelfont(0); inpNotifyDXCCSearchCallsign->labelsize(14); inpNotifyDXCCSearchCallsign->labelcolor(FL_FOREGROUND_COLOR); inpNotifyDXCCSearchCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyDXCCSearchCallsign->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyDXCCSearchCallsign { btnNotifyDXCCSelect = new Fl_Button(234, 382, 90, 23); } // Fl_Button* btnNotifyDXCCSelect { btnNotifyDXCCDeselect = new Fl_Button(234, 415, 90, 23); } // Fl_Button* btnNotifyDXCCDeselect { btnNotifyDXCCClose = new Fl_Button(334, 415, 90, 23); btnNotifyDXCCClose->callback((Fl_Callback*)cb_btnNotifyDXCCClose); } // Fl_Button* btnNotifyDXCCClose o->size_range(300, 400); o->end(); } // Fl_Double_Window* o return w; } fldigi-4.1.06/src/dialogs/confdialog.cxx0000664000175000017500000272262713511722452015051 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "gettext.h" #include "confdialog.h" #include #include #include #include #include #include #include "main.h" #include "fl_digi.h" #include "data_io.h" #include "Viewer.h" #include "soundconf.h" #include "waterfall.h" #include "rigxml.h" #include "lookupcall.h" #include "icons.h" #include "Viewer.h" #include "pskrep.h" #include "logsupport.h" #include "notify.h" #include "debug.h" #include "status.h" #include "rx_extract.h" #include "kmlserver.h" #include "macroedit.h" #include "fileselect.h" #include "psm/psm.h" #include "dx_cluster.h" extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata); #include "dx_dialog.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "fsq.h" Fl_Double_Window *dlgConfig; Mode_Browser* mode_browser; static void choose_color(Fl_Color & c) { unsigned char r, g, b; Fl::get_color(c, r, g, b); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b); } static void cbRxFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); RxText->textfont(font); RxText->textsize(size); RxText->textcolor(color); RxText->redraw(); progdefaults.RxFontnbr = font; progdefaults.RxFontsize = size; progdefaults.RxFontcolor = color; ReceiveText->setFont(font); ReceiveText->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFont(font); fsq_rx_text->setFontSize(size); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true; } static void cbTxFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); TxText->textfont(font); TxText->textsize(size); TxText->textcolor(color); TxText->redraw(); progdefaults.TxFontnbr = font; progdefaults.TxFontsize = size; progdefaults.TxFontcolor = color; TransmitText->setFont(font); TransmitText->setFontSize(size); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); fsq_tx_text->setFont(font); fsq_tx_text->setFontSize(size); fsq_tx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true; } static void cbDXfont_browser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXfontcolor = color; progdefaults.DXfontnbr = font; progdefaults.DXfontsize = size; brws_tcpip_stream->setFont(font); brws_tcpip_stream->setFontSize(size); brws_tcpip_stream->setFontColor(color, FTextBase::RECV); brws_tcpip_stream->redraw(); ed_telnet_cmds->setFont(font); ed_telnet_cmds->setFontSize(size); ed_telnet_cmds->setFontColor(color); ed_telnet_cmds->redraw(); StreamText->textcolor(color); StreamText->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(font); brws_dxc_help->setFontSize(size); brws_dxc_help->setFontColor(color, FTextBase::RECV); brws_dxc_help->redraw(); font_browser->hide(); dxcluster_hosts_load(); progdefaults.changed = true; } static void cbDXC_FontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXC_textfont = font; progdefaults.DXC_textsize = size; progdefaults.DXC_textcolor = color; DXC_display->textsize(size); DXC_display->textcolor(color); DXC_display->textfont(font); DXC_display->redraw(); font_browser->hide(); dxc_lines_redraw(); progdefaults.changed = true; } static void cbMacroEditFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); MacroText->textfont(font); MacroText->textsize(size); MacroText->redraw(); progdefaults.MacroEditFontnbr = font; progdefaults.MacroEditFontsize = size; update_macroedit_font(); MacroText->textfont(font); MacroText->textsize(size); font_browser->hide(); progdefaults.changed = true; } void cbWaterfallFontBrowser(Fl_Widget*, void*) { Fl_Font fnt = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.WaterfallFontnbr = fnt; progdefaults.WaterfallFontsize = size; progdefaults.changed = true; font_browser->hide(); } static void cbMacroBtnFontBrowser(Fl_Widget*, void*) { progdefaults.MacroBtnFontnbr = font_browser->fontNumber(); progdefaults.MacroBtnFontsize = font_browser->fontSize();; progdefaults.MacroBtnFontcolor = font_browser->fontColor(); font_browser->hide(); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->redraw_label(); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->redraw_label(); progdefaults.changed = true; colorize_macros(); } void cbViewerFontBrowser(Fl_Widget*, void*) { progdefaults.ViewerFontnbr = font_browser->fontNumber(); progdefaults.ViewerFontsize = font_browser->fontSize(); initViewer(); progdefaults.changed = true; font_browser->hide(); } void cbFreqControlFontBrowser(Fl_Widget*, void*) { Fl_Font fnt = font_browser->fontNumber(); progdefaults.FreqControlFontnbr = fnt; progdefaults.changed = true; FDdisplay->labelfont(progdefaults.FreqControlFontnbr); FDdisplay->redraw(); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->redraw(); qsoFreqDisp2->redraw(); qsoFreqDisp3->redraw(); font_browser->hide(); } static void cbLOGGINGFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGGINGtextfont = font; progdefaults.LOGGINGtextsize = size; progdefaults.LOGGINGtextcolor = color; LOGGINGdisplay->textsize(size); LOGGINGdisplay->textcolor(color); LOGGINGdisplay->textfont(font); LOGGINGdisplay->redraw(); LOGGING_colors_font(); font_browser->hide(); progdefaults.changed = true; } static void cbLOGBOOKFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGBOOKtextfont = font; progdefaults.LOGBOOKtextsize = size; progdefaults.LOGBOOKtextcolor = color; LOGBOOKdisplay->textsize(size); LOGBOOKdisplay->textcolor(color); LOGBOOKdisplay->textfont(font); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); font_browser->hide(); progdefaults.changed = true; } void set_qrzxml_buttons(Fl_Button* b) { Fl_Button* qrzbxml[] = { btnQRZXMLnotavailable, btnQRZcdrom, btnQRZsub, btnHamcall, btnCALLOOK, btnHamQTH}; for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++) qrzbxml[i]->value(b == qrzbxml[i]); } void set_qrzweb_buttons(Fl_Button* b) { Fl_Button* qrzbweb[] = { btnQRZWEBnotavailable, btnQRZonline, btnHAMCALLonline, btnHamQTHonline, btnCallookOnline }; for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++) qrzbweb[i]->value(b == qrzbweb[i]); } Fl_Tabs *tabsConfigure=(Fl_Tabs *)0; Fl_Group *tabOperator=(Fl_Group *)0; static void cb_tabOperator(Fl_Group*, void*) { progdefaults.changed = true; } Fl_Input2 *inpMyCallsign=(Fl_Input2 *)0; static void cb_inpMyCallsign(Fl_Input2*, void*) { const char *triggers = " !#$%&'()*+,-.;<=>?@[\\]^_{|}~"; std::string mycall = inpMyCallsign->value(); for (size_t k = 0; k < mycall.length(); k++) { for (size_t n = 0; n < strlen(triggers); n++) { if (mycall[k] == triggers[n]) { if ( fl_choice2("Replace FSQ trigger character with slash /", _("no"), _("yes"), NULL ) ) mycall[k] = '/'; } } } if (progdefaults.THORsecText.empty()) { progdefaults.THORsecText = mycall; progdefaults.THORsecText.append(" "); txtTHORSecondary->value(progdefaults.THORsecText.c_str()); } if (progdefaults.secText.empty()) { progdefaults.secText = mycall; progdefaults.secText.append(" "); txtSecondary->value(progdefaults.secText.c_str()); } progdefaults.myCall = mycall; inpMyCallsign->value(progdefaults.myCall.c_str()); inpMyCallsign->redraw(); update_main_title(); notify_change_callsign(); progdefaults.changed = true; } Fl_Input2 *inpOperCallsign=(Fl_Input2 *)0; static void cb_inpOperCallsign(Fl_Input2* o, void*) { progdefaults.operCall = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyName=(Fl_Input2 *)0; static void cb_inpMyName(Fl_Input2* o, void*) { progdefaults.myName = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyAntenna=(Fl_Input2 *)0; static void cb_inpMyAntenna(Fl_Input2* o, void*) { progdefaults.myAntenna = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyQth=(Fl_Input2 *)0; static void cb_inpMyQth(Fl_Input2* o, void*) { progdefaults.myQth = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyLocator=(Fl_Input2 *)0; static void cb_inpMyLocator(Fl_Input2* o, void*) { progdefaults.myLocator = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_states=(Fl_ListBox *)0; static void cb_listbox_states(Fl_ListBox* o, void*) { listbox_counties->clear(); listbox_counties->add(states.counties(o->value()).c_str()); listbox_counties->index(0); inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str()); inp_QP_state_short->value(states.state_short(o->value()).c_str()); progdefaults.SQSOstate = o->index(); progdefaults.changed = true; } Fl_Input2 *inp_QP_state_short=(Fl_Input2 *)0; Fl_ListBox *listbox_counties=(Fl_ListBox *)0; static void cb_listbox_counties(Fl_ListBox* o, void*) { inp_QP_short_county->value(states.cnty_short(listbox_states->value(),o->value()).c_str()); progdefaults.SQSOcounty = o->index(); progdefaults.changed = true; } Fl_Input2 *inp_QP_short_county=(Fl_Input2 *)0; Fl_Group *tabUI=(Fl_Group *)0; Fl_Tabs *tabsUI=(Fl_Tabs *)0; Fl_Group *tabBrowser=(Fl_Group *)0; Fl_Spinner2 *cntChannels=(Fl_Spinner2 *)0; static void cb_cntChannels(Fl_Spinner2* o, void*) { progdefaults.VIEWERchannels = (int)(o->value()); initViewer(); } Fl_Spinner2 *cntTimeout=(Fl_Spinner2 *)0; static void cb_cntTimeout(Fl_Spinner2* o, void*) { progdefaults.VIEWERtimeout = (int)(o->value()); progdefaults.changed = true; } Fl_ListBox *listboxViewerLabel=(Fl_ListBox *)0; static void cb_listboxViewerLabel(Fl_ListBox* o, void*) { progdefaults.VIEWERlabeltype = o->index(); initViewer(); progdefaults.changed = true; } Fl_Button *btnViewerFont=(Fl_Button *)0; static void cb_btnViewerFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.ViewerFontnbr); font_browser->fontSize(progdefaults.ViewerFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbViewerFontBrowser); font_browser->show(); } Fl_Check_Button *btnFixedIntervals=(Fl_Check_Button *)0; static void cb_btnFixedIntervals(Fl_Check_Button* o, void*) { progdefaults.VIEWERfixed = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnMarquee=(Fl_Check_Button *)0; static void cb_btnMarquee(Fl_Check_Button* o, void*) { progdefaults.VIEWERmarquee = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnAscend=(Fl_Check_Button *)0; static void cb_btnAscend(Fl_Check_Button* o, void*) { progdefaults.VIEWERascend = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnBrowserHistory=(Fl_Check_Button *)0; static void cb_btnBrowserHistory(Fl_Check_Button* o, void*) { progdefaults.VIEWERhistory = o->value(); progdefaults.changed = true; } Fl_Button *bwsrSliderColor=(Fl_Button *)0; static void cb_bwsrSliderColor(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.bwsrSliderColor.R; g = progdefaults.bwsrSliderColor.G; b = progdefaults.bwsrSliderColor.B; if (fl_color_chooser("Slider Color", r, g, b) == 0) return; progdefaults.bwsrSliderColor.R = r; progdefaults.bwsrSliderColor.G = g; progdefaults.bwsrSliderColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true; } Fl_Button *bwsrSldrSelColor=(Fl_Button *)0; static void cb_bwsrSldrSelColor(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.bwsrSldrSelColor.R; g = progdefaults.bwsrSldrSelColor.G; b = progdefaults.bwsrSldrSelColor.B; if (fl_color_chooser("Button Color", r, g, b) == 0) return; progdefaults.bwsrSldrSelColor.R = r; progdefaults.bwsrSldrSelColor.G = g; progdefaults.bwsrSldrSelColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->selection_color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->selection_color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_1_color=(Fl_Button *)0; static void cb_bwsrHiLite_1_color(Fl_Button*, void*) { progdefaults.bwsrHiLight1 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight1); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_2_color=(Fl_Button *)0; static void cb_bwsrHiLite_2_color(Fl_Button*, void*) { progdefaults.bwsrHiLight2 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight2); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_even_lines=(Fl_Button *)0; static void cb_bwsrHiLite_even_lines(Fl_Button*, void*) { progdefaults.bwsrBackgnd2 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd2); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); viewer_redraw(); progdefaults.changed = true;; } Fl_Button *bwsrHiLite_odd_lines=(Fl_Button *)0; static void cb_bwsrHiLite_odd_lines(Fl_Button*, void*) { progdefaults.bwsrBackgnd1 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd1); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_select=(Fl_Button *)0; static void cb_bwsrHiLite_select(Fl_Button*, void*) { progdefaults.bwsrSelect = fl_show_colormap((Fl_Color)progdefaults.bwsrSelect); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); viewer_redraw(); progdefaults.changed = true; } Fl_Group *tabUserInterface=(Fl_Group *)0; Fl_Check_Button *btnShowTooltips=(Fl_Check_Button *)0; static void cb_btnShowTooltips(Fl_Check_Button* o, void*) { progdefaults.tooltips = o->value(); Fl_Tooltip::enable(progdefaults.tooltips); progdefaults.changed = true; } Fl_Check_Button *chkMenuIcons=(Fl_Check_Button *)0; static void cb_chkMenuIcons(Fl_Check_Button* o, void*) { progdefaults.menuicons = o->value(); icons::toggle_icon_labels(); progdefaults.changed = true; } Fl_ListBox *listboxScheme=(Fl_ListBox *)0; static void cb_listboxScheme(Fl_ListBox* o, void*) { progdefaults.ui_scheme = o->value(); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.changed = true; } Fl_Button *bVisibleModes=(Fl_Button *)0; static void cb_bVisibleModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(toggle_visible_modes); mode_browser->show_(&progdefaults.visible_modes); progdefaults.changed = true; } Fl_ListBox *listbox_language=(Fl_ListBox *)0; static void cb_listbox_language(Fl_ListBox* o, void*) { progdefaults.ui_language = o->index(); progdefaults.changed = true; } Fl_Check_Button *btn_rx_lowercase=(Fl_Check_Button *)0; static void cb_btn_rx_lowercase(Fl_Check_Button* o, void*) { progdefaults.rx_lowercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_tx_lowercase=(Fl_Check_Button *)0; static void cb_btn_tx_lowercase(Fl_Check_Button* o, void*) { progdefaults.tx_lowercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_save_config_on_exit=(Fl_Check_Button *)0; static void cb_btn_save_config_on_exit(Fl_Check_Button* o, void*) { progdefaults.SaveConfig = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2_save_macros_on_exit=(Fl_Check_Button *)0; static void cb_btn2_save_macros_on_exit(Fl_Check_Button* o, void*) { btn_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2NagMe=(Fl_Check_Button *)0; static void cb_btn2NagMe(Fl_Check_Button* o, void*) { btnNagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2_confirm_exit=(Fl_Check_Button *)0; static void cb_btn2_confirm_exit(Fl_Check_Button* o, void*) { btn2_confirm_exit->value(o->value()); progdefaults.confirmExit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_check_for_updates=(Fl_Check_Button *)0; static void cb_btn_check_for_updates(Fl_Check_Button* o, void*) { progdefaults.check_for_updates = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_tx_show_timer=(Fl_Check_Button *)0; static void cb_btn_tx_show_timer(Fl_Check_Button* o, void*) { progdefaults.show_tx_timer = o->value(); progdefaults.changed = true; } Fl_Spinner *val_tx_timeout=(Fl_Spinner *)0; static void cb_val_tx_timeout(Fl_Spinner* o, void*) { progdefaults.tx_timeout=o->value(); progdefaults.changed = true; } Fl_Group *tabLogServer=(Fl_Group *)0; Fl_Tabs *tabsLog=(Fl_Tabs *)0; Fl_Group *grp_Log_QSO=(Fl_Group *)0; Fl_Check_Button *btnNagMe=(Fl_Check_Button *)0; static void cb_btnNagMe(Fl_Check_Button* o, void*) { btn2NagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnClearOnSave=(Fl_Check_Button *)0; static void cb_btnClearOnSave(Fl_Check_Button* o, void*) { progdefaults.ClearOnSave=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCallUpperCase=(Fl_Check_Button *)0; static void cb_btnCallUpperCase(Fl_Check_Button* o, void*) { progdefaults.calluppercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnAutoFillQSO=(Fl_Check_Button *)0; static void cb_btnAutoFillQSO(Fl_Check_Button* o, void*) { progdefaults.autofill_qso_fields = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDateTimeSort=(Fl_Check_Button *)0; static void cb_btnDateTimeSort(Fl_Check_Button* o, void*) { progdefaults.sort_date_time_off = o->value(); progdefaults.changed = true; reload_browser(); } Fl_Check_Button *btndate_time_force=(Fl_Check_Button *)0; static void cb_btndate_time_force(Fl_Check_Button* o, void*) { progdefaults.force_date_time = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRSTindefault=(Fl_Check_Button *)0; static void cb_btnRSTindefault(Fl_Check_Button* o, void*) { progdefaults.RSTin_default = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRSTdefault=(Fl_Check_Button *)0; static void cb_btnRSTdefault(Fl_Check_Button* o, void*) { progdefaults.RSTdefault = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_cty_dat_pathname=(Fl_Input2 *)0; static void cb_txt_cty_dat_pathname(Fl_Input2* o, void*) { progdefaults.cty_dat_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_cty_dat=(Fl_Button *)0; static void cb_btn_select_cty_dat(Fl_Button*, void*) { select_cty_dat_pathname(); } Fl_Button *btn_default_cty_dat=(Fl_Button *)0; static void cb_btn_default_cty_dat(Fl_Button*, void*) { default_cty_dat_pathname(); } Fl_Button *btn_reload_cty_dat=(Fl_Button *)0; static void cb_btn_reload_cty_dat(Fl_Button*, void*) { reload_cty_dat(); } Fl_Input2 *inpMyPower=(Fl_Input2 *)0; static void cb_inpMyPower(Fl_Input2* o, void*) { progdefaults.mytxpower = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDisplayLogbookRead=(Fl_Check_Button *)0; static void cb_btnDisplayLogbookRead(Fl_Check_Button* o, void*) { progdefaults.DisplayLogbookRead = o->value(); progdefaults.changed = true; } Fl_Group *grpRX_Text=(Fl_Group *)0; Fl_Check_Button *btnRXClicks=(Fl_Check_Button *)0; static void cb_btnRXClicks(Fl_Check_Button* o, void*) { progdefaults.rxtext_clicks_qso_data = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRXTooltips=(Fl_Check_Button *)0; static void cb_btnRXTooltips(Fl_Check_Button* o, void*) { progdefaults.rxtext_tooltips = o->value(); progdefaults.changed = true; } Fl_Input2 *inpNonword=(Fl_Input2 *)0; static void cb_inpNonword(Fl_Input2* o, void*) { progdefaults.nonwordchars = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUSunits=(Fl_Check_Button *)0; static void cb_btnUSunits(Fl_Check_Button* o, void*) { progdefaults.us_units = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_clear_fields=(Fl_Check_Button *)0; static void cb_btn_clear_fields(Fl_Check_Button* o, void*) { progdefaults.clear_fields=o->value(); progdefaults.changed = true; } Fl_Group *grpMacLogger=(Fl_Group *)0; Fl_Check_Button *btnConnectToMaclogger=(Fl_Check_Button *)0; static void cb_btnConnectToMaclogger(Fl_Check_Button* o, void*) { progdefaults.connect_to_maclogger = o->value(); if (progdefaults.connect_to_maclogger == false) maclogger_close(); else maclogger_init(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_radio=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_radio(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_radio = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_log=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_log(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_log = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_lookup=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_lookup(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_lookup = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_spot_tune=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_spot_tune(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_spot_tune = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_spot_report=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_spot_report(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_spot_report = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_enable_maclogger_log=(Fl_Check_Button *)0; static void cb_btn_enable_maclogger_log(Fl_Check_Button* o, void*) { progdefaults.enable_maclogger_log = o->value(); progdefaults.changed = true; } Fl_Text_Display *txt_UDP_data=(Fl_Text_Display *)0; Fl_Output *txt_maclogger_log_filename=(Fl_Output *)0; static void cb_Clear(Fl_Button*, void*) { txt_UDP_data->buffer()->text(""); } Fl_Group *grpN3FJP_logs=(Fl_Group *)0; Fl_Text_Display *txt_N3FJP_data=(Fl_Text_Display *)0; static void cb_Clear1(Fl_Button*, void*) { txt_N3FJP_data->buffer()->text(""); } Fl_Input2 *txt_N3FJP_ip_address=(Fl_Input2 *)0; static void cb_txt_N3FJP_ip_address(Fl_Input2* o, void*) { progdefaults.N3FJP_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_N3FJP_ip_port_no=(Fl_Input2 *)0; static void cb_txt_N3FJP_ip_port_no(Fl_Input2* o, void*) { progdefaults.N3FJP_port = o->value(); progdefaults.changed = true; } Fl_Button *btn_default_N3FJP_ip=(Fl_Button *)0; static void cb_btn_default_N3FJP_ip(Fl_Button*, void*) { txt_N3FJP_ip_address->value("127.0.0.1"); progdefaults.N3FJP_address = "127.0.0.1"; txt_N3FJP_ip_port_no->value("1100"); progdefaults.N3FJP_port = "1100"; progdefaults.changed = true; } Fl_Check_Button *btn_enable_N3FJP_log=(Fl_Check_Button *)0; static void cb_btn_enable_N3FJP_log(Fl_Check_Button* o, void*) { progdefaults.enable_N3FJP_log = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_connect_to_n3fjp=(Fl_Check_Button *)0; static void cb_btn_connect_to_n3fjp(Fl_Check_Button* o, void*) { progdefaults.connect_to_n3fjp=o->value(); progdefaults.changed=true; } Fl_Box *box_n3fjp_connected=(Fl_Box *)0; Fl_Check_Button *btn_N3FJP_sweet_spot=(Fl_Check_Button *)0; static void cb_btn_N3FJP_sweet_spot(Fl_Check_Button* o, void*) { progdefaults.N3FJP_sweet_spot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_N3FJP_modem_carrier=(Fl_Check_Button *)0; static void cb_btn_N3FJP_modem_carrier(Fl_Check_Button* o, void*) { progdefaults.N3FJP_modem_carrier = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_enable_N3FJP_RIGTX=(Fl_Check_Button *)0; static void cb_btn_enable_N3FJP_RIGTX(Fl_Check_Button* o, void*) { progdefaults.enable_N3FJP_RIGTX = o->value(); progdefaults.changed = true; } Fl_Group *tabLogContests=(Fl_Group *)0; Fl_Tabs *tabs_contests=(Fl_Tabs *)0; Fl_Group *grpGeneral_contest=(Fl_Group *)0; Fl_ListBox *listbox_contest=(Fl_ListBox *)0; static void cb_listbox_contest(Fl_ListBox* o, void*) { progdefaults.logging = o->index(); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[progdefaults.SQSOcontest].notes; progdefaults.SQSOinstate = (QSOparties.qso_parties[progdefaults.SQSOcontest].instate[0] == 'T'); } else { listbox_QP_contests->index(0); progdefaults.CONTESTnotes = contests[progdefaults.logging].notes; } inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true; } Fl_ListBox *listbox_QP_contests=(Fl_ListBox *)0; static void cb_listbox_QP_contests(Fl_ListBox* o, void*) { int n = o->index(); progdefaults.SQSOcontest = n; progdefaults.SQSOinstate = (QSOparties.qso_parties[n].instate[0] == 'T'); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[n].notes; inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); } else inp_contest_notes->value(""); adjust_for_contest(0); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true; } Fl_Input2 *inp_contest_notes=(Fl_Input2 *)0; Fl_Light_Button *btnDupCheckOn=(Fl_Light_Button *)0; static void cb_btnDupCheckOn(Fl_Light_Button* o, void*) { progdefaults.EnableDupCheck = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupBand=(Fl_Check_Button *)0; static void cb_btnDupBand(Fl_Check_Button* o, void*) { progdefaults.dupband = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupMode=(Fl_Check_Button *)0; static void cb_btnDupMode(Fl_Check_Button* o, void*) { progdefaults.dupmode = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupTimeSpan=(Fl_Check_Button *)0; static void cb_btnDupTimeSpan(Fl_Check_Button* o, void*) { progdefaults.duptimespan=(int)o->value(); progdefaults.changed = true; } Fl_Button *btnDupColor=(Fl_Button *)0; static void cb_btnDupColor(Fl_Button* o, void*) { fl_color_chooser("Dup Check", progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); o->color( fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); o->redraw(); progdefaults.changed = true; } Fl_Button *btnPossibleDupColor=(Fl_Button *)0; static void cb_btnPossibleDupColor(Fl_Button* o, void*) { fl_color_chooser("Possible_Dup Check", progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B); o->color( fl_rgb_color( progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B)); o->redraw(); progdefaults.changed = true; } Fl_Check_Button *btnDupXchg1=(Fl_Check_Button *)0; static void cb_btnDupXchg1(Fl_Check_Button* o, void*) { progdefaults.dupxchg1 = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupState=(Fl_Check_Button *)0; static void cb_btnDupState(Fl_Check_Button* o, void*) { progdefaults.dupstate = o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrTimeSpan=(Fl_Value_Input2 *)0; static void cb_nbrTimeSpan(Fl_Value_Input2* o, void*) { progdefaults.timespan = (int)o->value(); progdefaults.changed = true; } Fl_Input2 *inpSend1=(Fl_Input2 *)0; static void cb_inpSend1(Fl_Input2* o, void*) { progdefaults.myXchg=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn599=(Fl_Check_Button *)0; static void cb_btn599(Fl_Check_Button* o, void*) { progdefaults.fixed599 = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCutNbrs=(Fl_Check_Button *)0; static void cb_btnCutNbrs(Fl_Check_Button* o, void*) { progdefaults.cutnbrs=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrContestStart=(Fl_Value_Input2 *)0; static void cb_nbrContestStart(Fl_Value_Input2* o, void*) { progdefaults.ContestStart = (int)o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrContestDigits=(Fl_Value_Input2 *)0; static void cb_nbrContestDigits(Fl_Value_Input2* o, void*) { progdefaults.ContestDigits = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseLeadingZeros=(Fl_Check_Button *)0; static void cb_btnUseLeadingZeros(Fl_Check_Button* o, void*) { progdefaults.UseLeadingZeros = o->value(); progdefaults.changed = true; } Fl_Button *btnResetSerNbr=(Fl_Button *)0; static void cb_btnResetSerNbr(Fl_Button*, void*) { cb_ResetSerNbr(); } Fl_Group *grpFD_contest=(Fl_Group *)0; Fl_Input2 *inp_my_FD_call=(Fl_Input2 *)0; static void cb_inp_my_FD_call(Fl_Input2* o, void*) { progdefaults.fd_op_call=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_FD_section=(Fl_Input2 *)0; static void cb_inp_my_FD_section(Fl_Input2* o, void*) { progdefaults.my_FD_section=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_FD_class=(Fl_Input2 *)0; static void cb_inp_my_FD_class(Fl_Input2* o, void*) { progdefaults.my_FD_class=o->value(); progdefaults.changed = true; } Fl_Group *grpJOTA_contest=(Fl_Group *)0; Fl_Input2 *inp_my_SCR_class=(Fl_Input2 *)0; static void cb_inp_my_SCR_class(Fl_Input2* o, void*) { progdefaults.my_SCR_class=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_JOTA_troop=(Fl_Input2 *)0; static void cb_inp_my_JOTA_troop(Fl_Input2* o, void*) { progdefaults.my_JOTA_troop=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_JOTA_scout=(Fl_Input2 *)0; static void cb_inp_my_JOTA_scout(Fl_Input2* o, void*) { progdefaults.my_JOTA_scout = o->value(); progdefaults.changed=true; } Fl_Group *tabMBars=(Fl_Group *)0; Fl_Check_Button *btnMacroMouseWheel=(Fl_Check_Button *)0; static void cb_btnMacroMouseWheel(Fl_Check_Button* o, void*) { progdefaults.macro_wheel = o->value(); progdefaults.changed = true; } Fl_Counter *cnt_macro_height=(Fl_Counter *)0; static void cb_cnt_macro_height(Fl_Counter* o, void*) { progdefaults.macro_height = (int)o->value(); progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_0=(Fl_Round_Button *)0; static void cb_btn_scheme_0(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 0; set_macroLabels(); UI_select(); progdefaults.changed = true; } Fl_Round_Button *btn_scheme_1=(Fl_Round_Button *)0; static void cb_btn_scheme_1(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 1; set_macroLabels(); UI_select(); progdefaults.changed = true; } Fl_Round_Button *btn_scheme_2=(Fl_Round_Button *)0; static void cb_btn_scheme_2(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 2; set_macroLabels(); UI_select(); progdefaults.changed = true; } Fl_Round_Button *btn_scheme_3=(Fl_Round_Button *)0; static void cb_btn_scheme_3(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 3; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_4=(Fl_Round_Button *)0; static void cb_btn_scheme_4(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 4; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_5=(Fl_Round_Button *)0; static void cb_btn_scheme_5(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 5; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_6=(Fl_Round_Button *)0; static void cb_btn_scheme_6(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 6; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_7=(Fl_Round_Button *)0; static void cb_btn_scheme_7(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 7; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_8=(Fl_Round_Button *)0; static void cb_btn_scheme_8(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 8; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_9=(Fl_Round_Button *)0; static void cb_btn_scheme_9(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 9; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_10=(Fl_Round_Button *)0; static void cb_btn_scheme_10(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 10; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_11=(Fl_Round_Button *)0; static void cb_btn_scheme_11(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 11; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_12=(Fl_Round_Button *)0; static void cb_btn_scheme_12(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 12; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Check_Button *btnUseLastMacro=(Fl_Check_Button *)0; static void cb_btnUseLastMacro(Fl_Check_Button* o, void*) { progdefaults.UseLastMacro = o->value(); update_main_title(); progdefaults.changed = true; } Fl_Check_Button *btnDisplayMacroFilename=(Fl_Check_Button *)0; static void cb_btnDisplayMacroFilename(Fl_Check_Button* o, void*) { progdefaults.DisplayMacroFilename = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_save_macros_on_exit=(Fl_Check_Button *)0; static void cb_btn_save_macros_on_exit(Fl_Check_Button* o, void*) { btn2_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_macro_post=(Fl_Check_Button *)0; static void cb_btn_macro_post(Fl_Check_Button* o, void*) { progdefaults.macro_post = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_4bar_position=(Fl_Check_Button *)0; static void cb_btn_4bar_position(Fl_Check_Button* o, void*) { progdefaults.four_bar_position = o->value(); UI_select(); progdefaults.changed = true; } Fl_Group *tabWF_UI=(Fl_Group *)0; Fl_Check_Button *btnWF_UIrev=(Fl_Check_Button *)0; static void cb_btnWF_UIrev(Fl_Check_Button* o, void*) { progdefaults.WF_UIrev = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIx1=(Fl_Check_Button *)0; static void cb_btnWF_UIx1(Fl_Check_Button* o, void*) { progdefaults.WF_UIx1 = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfcarrier=(Fl_Check_Button *)0; static void cb_btnWF_UIwfcarrier(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfcarrier = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfshift=(Fl_Check_Button *)0; static void cb_btnWF_UIwfshift(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfshift = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfreflevel=(Fl_Check_Button *)0; static void cb_btnWF_UIwfreflevel(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfreflevel = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfdrop=(Fl_Check_Button *)0; static void cb_btnWF_UIwfdrop(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfdrop = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfampspan=(Fl_Check_Button *)0; static void cb_btnWF_UIwfampspan(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfampspan = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfstore=(Fl_Check_Button *)0; static void cb_btnWF_UIwfstore(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfstore = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfmode=(Fl_Check_Button *)0; static void cb_btnWF_UIwfmode(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfmode = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIqsy=(Fl_Check_Button *)0; static void cb_btnWF_UIqsy(Fl_Check_Button* o, void*) { progdefaults.WF_UIqsy = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIxmtlock=(Fl_Check_Button *)0; static void cb_btnWF_UIxmtlock(Fl_Check_Button* o, void*) { progdefaults.WF_UIxmtlock = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Button *btn_wf_enable_all=(Fl_Button *)0; static void cb_btn_wf_enable_all(Fl_Button*, void*) { btnWF_UIrev->value(progdefaults.WF_UIrev = 1); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 1); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 1); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 1); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 1); btnWF_UIx1->value(progdefaults.WF_UIx1 = 1); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 1); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 1); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 1); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 1); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 1); progdefaults.changed = true; WF_UI(); } Fl_Button *btn_wf_disable_all=(Fl_Button *)0; static void cb_btn_wf_disable_all(Fl_Button*, void*) { btnWF_UIrev->value(progdefaults.WF_UIrev = 0); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 0); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 0); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 0); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 0); btnWF_UIx1->value(progdefaults.WF_UIx1 = 0); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 0); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 0); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 0); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 0); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 0); progdefaults.changed = true; WF_UI(); } Fl_Group *tabColorsFonts=(Fl_Group *)0; Fl_Tabs *tabsColors=(Fl_Tabs *)0; Fl_ListBox *listbox_charset_status=(Fl_ListBox *)0; Fl_Input *RxText=(Fl_Input *)0; Fl_Button *btnRxColor=(Fl_Button *)0; static void cb_btnRxColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.RxColor.R; g = progdefaults.RxColor.G; b = progdefaults.RxColor.B; if (!fl_color_chooser("Rx Color", r, g, b)) return; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; RxText->color(fl_rgb_color(r,g,b)); ReceiveText->color(RxText->color()); RxText->redraw(); ReceiveText->redraw(); progdefaults.changed = true; } Fl_Button *btnTxColor=(Fl_Button *)0; static void cb_btnTxColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.TxColor.R; g = progdefaults.TxColor.G; b = progdefaults.TxColor.B; if (!fl_color_chooser("Tx Color", r, g, b)) return; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(fl_rgb_color(r,g,b)); TransmitText->color(TxText->color()); TxText->redraw(); TransmitText->redraw(); progdefaults.changed = true; } Fl_Input *TxText=(Fl_Input *)0; Fl_Button *btnRxFont=(Fl_Button *)0; static void cb_btnRxFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.RxFontnbr); font_browser->fontSize(progdefaults.RxFontsize); font_browser->fontColor(progdefaults.RxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbRxFontBrowser); font_browser->show(); } Fl_Button *btnTxFont=(Fl_Button *)0; static void cb_btnTxFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.TxFontnbr); font_browser->fontSize(progdefaults.TxFontsize); font_browser->fontColor(progdefaults.TxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbTxFontBrowser); font_browser->show(); } Fl_Input *MacroText=(Fl_Input *)0; Fl_Button *btnMacroEditFont=(Fl_Button *)0; static void cb_btnMacroEditFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.MacroEditFontnbr); font_browser->fontSize(progdefaults.MacroEditFontsize); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroEditFontBrowser); font_browser->show(); } Fl_Button *btnXMIT=(Fl_Button *)0; static void cb_btnXMIT(Fl_Button*, void*) { choose_color(progdefaults.XMITcolor); btnXMIT->color( progdefaults.XMITcolor ); btnXMIT->redraw(); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); progdefaults.changed = true; } Fl_Button *btnCTRL=(Fl_Button *)0; static void cb_btnCTRL(Fl_Button*, void*) { choose_color(progdefaults.CTRLcolor); btnCTRL->color( progdefaults.CTRLcolor ); btnCTRL->redraw(); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); progdefaults.changed = true; } Fl_Button *btnSKIP=(Fl_Button *)0; static void cb_btnSKIP(Fl_Button*, void*) { choose_color(progdefaults.SKIPcolor); btnSKIP->color( progdefaults.SKIPcolor ); btnSKIP->redraw(); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); progdefaults.changed = true; } Fl_Button *btnALTR=(Fl_Button *)0; static void cb_btnALTR(Fl_Button*, void*) { choose_color(progdefaults.ALTRcolor); btnALTR->color( progdefaults.ALTRcolor ); btnALTR->redraw(); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); progdefaults.changed = true; } Fl_Button *btnSEL=(Fl_Button *)0; static void cb_btnSEL(Fl_Button*, void*) { choose_color(progdefaults.RxTxSelectcolor); btnSEL->color( progdefaults.RxTxSelectcolor ); btnSEL->redraw(); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); progdefaults.changed = true; } Fl_Button *btnNoTextColor=(Fl_Button *)0; static void cb_btnNoTextColor(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true; } Fl_Button *btnTextDefaults=(Fl_Button *)0; static void cb_btnTextDefaults(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr; progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); r = 255; g = 242; b = 190; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); r = 200; g = 235; b = 255; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; clr = fl_rgb_color(r,g,b); TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true; } Fl_Check_Button *btn_show_all_codes=(Fl_Check_Button *)0; static void cb_btn_show_all_codes(Fl_Check_Button* o, void*) { progdefaults.show_all_codes=o->value(); progdefaults.changed = true; } Fl_Box *FDdisplay=(Fl_Box *)0; Fl_Button *btn_freq_control_font=(Fl_Button *)0; static void cb_btn_freq_control_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.FreqControlFontnbr); font_browser->fontSize(14); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbFreqControlFontBrowser); font_browser->show(); } Fl_Button *btnBackgroundColor=(Fl_Button *)0; static void cb_btnBackgroundColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.FDbackground.R; g = progdefaults.FDbackground.G; b = progdefaults.FDbackground.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnForegroundColor=(Fl_Button *)0; static void cb_btnForegroundColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.FDforeground.R; g = progdefaults.FDforeground.G; b = progdefaults.FDforeground.B; if (!fl_color_chooser("Foreground", r, g, b)) return; progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; FDdisplay->labelcolor(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnFD_SystemColor=(Fl_Button *)0; static void cb_btnFD_SystemColor(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(clr); clr = FL_FOREGROUND_COLOR; Fl::get_color(clr, r, g, b); FDdisplay->labelcolor(clr); FDdisplay->redraw(); progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnSmeter_bg_color=(Fl_Button *)0; static void cb_btnSmeter_bg_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.Smeter_bg_color.R; g = progdefaults.Smeter_bg_color.G; b = progdefaults.Smeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.Smeter_bg_color.R = r; progdefaults.Smeter_bg_color.G = g; progdefaults.Smeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnSmeter_scale_color=(Fl_Button *)0; static void cb_btnSmeter_scale_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.Smeter_scale_color.R; g = progdefaults.Smeter_scale_color.G; b = progdefaults.Smeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.Smeter_scale_color.R = r; progdefaults.Smeter_scale_color.G = g; progdefaults.Smeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnSmeter_meter_color=(Fl_Button *)0; static void cb_btnSmeter_meter_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.Smeter_meter_color.R; g = progdefaults.Smeter_meter_color.G; b = progdefaults.Smeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.Smeter_meter_color.R = r; progdefaults.Smeter_meter_color.G = g; progdefaults.Smeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnPWR_bg_color=(Fl_Button *)0; static void cb_btnPWR_bg_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.PWRmeter_bg_color.R; g = progdefaults.PWRmeter_bg_color.G; b = progdefaults.PWRmeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.PWRmeter_bg_color.R = r; progdefaults.PWRmeter_bg_color.G = g; progdefaults.PWRmeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnPWR_scale_color=(Fl_Button *)0; static void cb_btnPWR_scale_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.PWRmeter_scale_color.R; g = progdefaults.PWRmeter_scale_color.G; b = progdefaults.PWRmeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.PWRmeter_scale_color.R = r; progdefaults.PWRmeter_scale_color.G = g; progdefaults.PWRmeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnPWR_meter_Color=(Fl_Button *)0; static void cb_btnPWR_meter_Color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.PWRmeter_meter_color.R; g = progdefaults.PWRmeter_meter_color.G; b = progdefaults.PWRmeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.PWRmeter_meter_color.R = r; progdefaults.PWRmeter_meter_color.G = g; progdefaults.PWRmeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_ListBox *listboxPWRselect=(Fl_ListBox *)0; static void cb_listboxPWRselect(Fl_ListBox* o, void*) { progdefaults.PWRselect = o->index(); set_smeter_colors(); progdefaults.changed = true; } Fl_Output *LOGGINGdisplay=(Fl_Output *)0; Fl_Button *btnLOGGING_color=(Fl_Button *)0; static void cb_btnLOGGING_color(Fl_Button*, void*) { uchar r, g, b; Fl::get_color(progdefaults.LOGGINGcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGGINGcolor = fl_rgb_color(r, g, b); LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true; } Fl_Button *btn_LOGGING_font=(Fl_Button *)0; static void cb_btn_LOGGING_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.LOGGINGtextfont); font_browser->fontSize(progdefaults.LOGGINGtextsize); font_browser->fontColor(progdefaults.LOGGINGtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGGINGFontBrowser); font_browser->show(); } Fl_Button *btnLOGGINGdefault_colors_font=(Fl_Button *)0; static void cb_btnLOGGINGdefault_colors_font(Fl_Button*, void*) { progdefaults.LOGGINGcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGGINGtextfont = (Fl_Font)0; progdefaults.LOGGINGtextsize = 14; progdefaults.LOGGINGtextcolor = FL_BLACK; LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->textsize(progdefaults.LOGGINGtextsize); LOGGINGdisplay->textcolor(progdefaults.LOGGINGtextcolor); LOGGINGdisplay->textfont(progdefaults.LOGGINGtextfont); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true; } Fl_Output *LOGBOOKdisplay=(Fl_Output *)0; Fl_Button *btnLOGBOOK_color=(Fl_Button *)0; static void cb_btnLOGBOOK_color(Fl_Button*, void*) { uchar r, g, b; Fl::get_color(progdefaults.LOGBOOKcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGBOOKcolor = fl_rgb_color(r, g, b); LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Button *btn_LOGBOOK_font=(Fl_Button *)0; static void cb_btn_LOGBOOK_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.LOGBOOKtextfont); font_browser->fontSize(progdefaults.LOGBOOKtextsize); font_browser->fontColor(progdefaults.LOGBOOKtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGBOOKFontBrowser); font_browser->show(); } Fl_Button *btnLOGBOOKdefault_colors_font=(Fl_Button *)0; static void cb_btnLOGBOOKdefault_colors_font(Fl_Button*, void*) { progdefaults.LOGBOOKcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGBOOKtextfont = (Fl_Font)0; progdefaults.LOGBOOKtextsize = 14; progdefaults.LOGBOOKtextcolor = FL_BLACK; LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->textsize(progdefaults.LOGBOOKtextsize); LOGBOOKdisplay->textcolor(progdefaults.LOGBOOKtextcolor); LOGBOOKdisplay->textfont(progdefaults.LOGBOOKtextfont); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Output *DXC_display=(Fl_Output *)0; Fl_Button *btn_DXC_font=(Fl_Button *)0; static void cb_btn_DXC_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.DXC_textfont); font_browser->fontSize(progdefaults.DXC_textsize); font_browser->fontColor(progdefaults.DXC_textcolor); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbDXC_FontBrowser); font_browser->show(); } Fl_Button *btnDXCdefault_colors_font=(Fl_Button *)0; static void cb_btnDXCdefault_colors_font(Fl_Button*, void*) { progdefaults.DXC_textfont = FL_COURIER; progdefaults.DXC_textsize = 14; progdefaults.DXC_textcolor = FL_BLACK; progdefaults.DXC_even_color = 7; progdefaults.DXC_odd_color = 246; DXC_display->textsize(progdefaults.DXC_textsize); DXC_display->textcolor(progdefaults.DXC_textcolor); DXC_display->textfont(progdefaults.DXC_textfont); DXC_display->redraw(); } Fl_Button *btn_DXC_even_lines=(Fl_Button *)0; static void cb_btn_DXC_even_lines(Fl_Button* o, void*) { progdefaults.DXC_even_color = fl_show_colormap((Fl_Color)progdefaults.DXC_even_color); o->color(progdefaults.DXC_even_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true; } Fl_Button *btn_DXC_odd_lines=(Fl_Button *)0; static void cb_btn_DXC_odd_lines(Fl_Button* o, void*) { progdefaults.DXC_odd_color = fl_show_colormap((Fl_Color)progdefaults.DXC_odd_color); o->color(progdefaults.DXC_odd_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true; } Fl_Input *StreamText=(Fl_Input *)0; Fl_Button *btnDXcolor=(Fl_Button *)0; static void cb_btnDXcolor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.DX_Color.R; g = progdefaults.DX_Color.G; b = progdefaults.DX_Color.B; if (!fl_color_chooser("DX Color", r, g, b)) return; progdefaults.DX_Color.R = r; progdefaults.DX_Color.G = g; progdefaults.DX_Color.B = b; StreamText->color(fl_rgb_color(r,g,b)); StreamText->redraw(); brws_tcpip_stream->color(fl_rgb_color(r,g,b)); brws_tcpip_stream->redraw(); brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); brws_dxcluster_hosts->redraw(); brws_dxc_help->color(fl_rgb_color(r,g,b)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); ed_telnet_cmds->color(fl_rgb_color(r,g,b)); ed_telnet_cmds->redraw(); dxcluster_hosts_load(); progdefaults.changed = true; } Fl_Button *btnDXfont=(Fl_Button *)0; static void cb_btnDXfont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.DXfontnbr); font_browser->fontSize(progdefaults.DXfontsize); font_browser->fontColor(progdefaults.DXfontcolor); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbDXfont_browser); font_browser->show(); } Fl_Button *btnDXalt_color=(Fl_Button *)0; static void cb_btnDXalt_color(Fl_Button* o, void*) { choose_color(progdefaults.DXalt_color); o->labelcolor(progdefaults.DXalt_color); o->redraw_label(); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); progdefaults.changed = true; } Fl_Button *btnDXdefault_colors_font=(Fl_Button *)0; static void cb_btnDXdefault_colors_font(Fl_Button*, void*) { progdefaults.DX_Color.R = 255; progdefaults.DX_Color.G = 255; progdefaults.DX_Color.B = 255; progdefaults.DXfontnbr = FL_COURIER; progdefaults.DXfontsize = 14; progdefaults.DXfontcolor = FL_BLACK; progdefaults.DXalt_color = fl_rgb_color(200, 0, 0); btnDXalt_color->labelcolor(progdefaults.DXalt_color); btnDXalt_color->redraw_label(); brws_tcpip_stream->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_tcpip_stream->setFont(progdefaults.DXfontnbr); brws_tcpip_stream->setFontSize(progdefaults.DXfontsize); brws_tcpip_stream->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); ed_telnet_cmds->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); ed_telnet_cmds->setFont(progdefaults.DXfontnbr); ed_telnet_cmds->setFontSize(progdefaults.DXfontsize); ed_telnet_cmds->setFontColor(progdefaults.DXfontcolor); ed_telnet_cmds->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); StreamText->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); StreamText->textcolor(progdefaults.DXfontcolor); StreamText->redraw(); dxcluster_hosts_load(); font_browser->hide(); progdefaults.changed = true; } Fl_Check_Button *btnUseGroupColors=(Fl_Check_Button *)0; static void cb_btnUseGroupColors(Fl_Check_Button* o, void*) { progdefaults.useGroupColors = o->value(); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup1=(Fl_Button *)0; static void cb_btnGroup1(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup1.R; g = progdefaults.btnGroup1.G; b = progdefaults.btnGroup1.B; if (fl_color_chooser("Group 1", r, g, b) == 0) return; progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup2=(Fl_Button *)0; static void cb_btnGroup2(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup2.R; g = progdefaults.btnGroup2.G; b = progdefaults.btnGroup2.B; if (fl_color_chooser("Group 2", r, g, b) == 0) return; progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup3=(Fl_Button *)0; static void cb_btnGroup3(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup3.R; g = progdefaults.btnGroup3.G; b = progdefaults.btnGroup3.B; if (fl_color_chooser("Group 3", r, g, b) == 0) return; progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnFkeyDEfaults=(Fl_Button *)0; static void cb_btnFkeyDEfaults(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr; r = 80; g = 144; b = 144; clr = fl_rgb_color(r,g,b); btnGroup1->color(clr); progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; r = 144; g = 80; b = 80; clr = fl_rgb_color(r,g,b); btnGroup2->color(clr); progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; r = 80; g = 80; b = 144; clr = fl_rgb_color(r,g,b); btnGroup3->color(clr); progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; progdefaults.MacroBtnFontcolor = FL_BLACK; progdefaults.MacroBtnFontnbr = FL_HELVETICA; progdefaults.MacroBtnFontsize = 12; btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->redraw_label(); btnGroup3->redraw_label(); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnMacroBtnFont=(Fl_Button *)0; static void cb_btnMacroBtnFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.MacroBtnFontnbr); font_browser->fontSize(progdefaults.MacroBtnFontsize); font_browser->fontColor(progdefaults.MacroBtnFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroBtnFontBrowser); font_browser->show(); } Fl_Button *btnTabColor=(Fl_Button *)0; static void cb_btnTabColor(Fl_Button*, void*) { progdefaults.TabsColor = fl_show_colormap(progdefaults.TabsColor); setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Button *btnTabDefaultColor=(Fl_Button *)0; static void cb_btnTabDefaultColor(Fl_Button*, void*) { progdefaults.TabsColor = FL_BACKGROUND2_COLOR; setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Button *btnSpotColor=(Fl_Button *)0; static void cb_btnSpotColor(Fl_Button*, void*) { progdefaults.SpotColor = fl_show_colormap(progdefaults.SpotColor); spotcolor->color(progdefaults.SpotColor); spotcolor->redraw(); spot_selection_color(); progdefaults.changed = true; } Fl_Button *btnRevColor=(Fl_Button *)0; static void cb_btnRevColor(Fl_Button*, void*) { progdefaults.RevColor = fl_show_colormap(progdefaults.RevColor); revcolor->color(progdefaults.RevColor); revcolor->redraw(); rev_selection_color(); progdefaults.changed = true; } Fl_Button *btnTuneColor=(Fl_Button *)0; static void cb_btnTuneColor(Fl_Button*, void*) { progdefaults.TuneColor = fl_show_colormap(progdefaults.TuneColor); tunecolor->color(progdefaults.TuneColor); tunecolor->redraw(); tune_selection_color(); progdefaults.changed = true; } Fl_Button *btnRxIDColor=(Fl_Button *)0; static void cb_btnRxIDColor(Fl_Button*, void*) { progdefaults.RxIDColor = fl_show_colormap(progdefaults.RxIDColor); rxidcolor->color(progdefaults.RxIDColor); rxidcolor->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw(); } Fl_Button *btnLkColor=(Fl_Button *)0; static void cb_btnLkColor(Fl_Button*, void*) { progdefaults.LkColor = fl_show_colormap(progdefaults.LkColor); lockcolor->color(progdefaults.LkColor); lockcolor->redraw(); xmtlock_selection_color(); progdefaults.changed = true; } Fl_Button *btnSql1Color=(Fl_Button *)0; static void cb_btnSql1Color(Fl_Button*, void*) { progdefaults.Sql1Color = fl_show_colormap(progdefaults.Sql1Color); sql1color->color(progdefaults.Sql1Color); sql1color->redraw(); sql_selection_color(); progdefaults.changed = true; } Fl_Button *btnXmtColor=(Fl_Button *)0; static void cb_btnXmtColor(Fl_Button*, void*) { progdefaults.XmtColor = fl_show_colormap(progdefaults.XmtColor); xmtcolor->color(progdefaults.XmtColor); xmtcolor->redraw(); xmtrcv_selection_color(); progdefaults.changed = true; } Fl_Button *btnRxIDwideColor=(Fl_Button *)0; static void cb_btnRxIDwideColor(Fl_Button*, void*) { progdefaults.RxIDwideColor = fl_show_colormap(progdefaults.RxIDwideColor); rxidcolorwide->color(progdefaults.RxIDwideColor); rxidcolorwide->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw(); } Fl_Button *btnAfcColor=(Fl_Button *)0; static void cb_btnAfcColor(Fl_Button*, void*) { progdefaults.AfcColor = fl_show_colormap(progdefaults.AfcColor); afccolor->color(progdefaults.AfcColor); afccolor->redraw(); afc_selection_color(); progdefaults.changed = true; } Fl_Button *btnSql2Color=(Fl_Button *)0; static void cb_btnSql2Color(Fl_Button*, void*) { progdefaults.Sql2Color = fl_show_colormap(progdefaults.Sql2Color); sql2color->color(progdefaults.Sql2Color); sql2color->redraw(); sql_selection_color(); progdefaults.changed = true; } Fl_Button *btnTxIDColor=(Fl_Button *)0; static void cb_btnTxIDColor(Fl_Button*, void*) { progdefaults.TxIDColor = fl_show_colormap(progdefaults.TxIDColor); txidcolor->color(progdefaults.TxIDColor); txidcolor->redraw(); txid_selection_color(); progdefaults.changed = true; btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->redraw(); } Fl_Box *spotcolor=(Fl_Box *)0; Fl_Box *revcolor=(Fl_Box *)0; Fl_Box *tunecolor=(Fl_Box *)0; Fl_Box *rxidcolor=(Fl_Box *)0; Fl_Box *lockcolor=(Fl_Box *)0; Fl_Box *sql1color=(Fl_Box *)0; Fl_Box *rxidcolorwide=(Fl_Box *)0; Fl_Box *xmtcolor=(Fl_Box *)0; Fl_Box *afccolor=(Fl_Box *)0; Fl_Box *sql2color=(Fl_Box *)0; Fl_Box *txidcolor=(Fl_Box *)0; Fl_Button *btn_default_btn_color=(Fl_Button *)0; static void cb_btn_default_btn_color(Fl_Button*, void*) { progdefaults.default_btn_color = fl_show_colormap(progdefaults.default_btn_color); default_btn_color->color(progdefaults.default_btn_color); default_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true; } Fl_Box *default_btn_color=(Fl_Box *)0; Fl_Button *btnLowSignal=(Fl_Button *)0; static void cb_btnLowSignal(Fl_Button*, void*) { progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); progdefaults.changed = true; } Fl_Box *lowcolor=(Fl_Box *)0; Fl_Button *btnHighSignal=(Fl_Button *)0; static void cb_btnHighSignal(Fl_Button*, void*) { progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); progdefaults.changed = true; } Fl_Box *highcolor=(Fl_Box *)0; Fl_Button *btnNormalSignal=(Fl_Button *)0; static void cb_btnNormalSignal(Fl_Button*, void*) { progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); progdefaults.changed = true; } Fl_Box *normalcolor=(Fl_Box *)0; Fl_Button *btnOverSignal=(Fl_Button *)0; static void cb_btnOverSignal(Fl_Button*, void*) { progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); progdefaults.changed = true; } Fl_Box *overcolor=(Fl_Box *)0; Fl_Group *tab_touch=(Fl_Group *)0; Fl_Choice *sel_lsd=(Fl_Choice *)0; static void cb_sel_lsd(Fl_Choice* o, void*) { progdefaults.sel_lsd = o->value(); set_freq_control_lsd(); progdefaults.changed = true; } Fl_Check_Button *btn_rxtx_swap=(Fl_Check_Button *)0; static void cb_btn_rxtx_swap(Fl_Check_Button* o, void*) { progdefaults.rxtx_swap = o->value(); progdefaults.changed = true; UI_select(); } Fl_Group *tabWaterfall=(Fl_Group *)0; Fl_Tabs *tabsWaterfall=(Fl_Tabs *)0; colorbox *WF_Palette=(colorbox *)0; static void cb_WF_Palette(colorbox*, void*) { progdefaults.changed = true; } static void cb_btnColor(Fl_Button*, void*) { selectColor(0); progdefaults.changed = true; } static void cb_btnColor1(Fl_Button*, void*) { selectColor(1); progdefaults.changed = true; } static void cb_btnColor2(Fl_Button*, void*) { selectColor(2); progdefaults.changed = true; } static void cb_btnColor3(Fl_Button*, void*) { selectColor(3); progdefaults.changed = true; } static void cb_btnColor4(Fl_Button*, void*) { selectColor(4); progdefaults.changed = true; } static void cb_btnColor5(Fl_Button*, void*) { selectColor(5); progdefaults.changed = true; } static void cb_btnColor6(Fl_Button*, void*) { selectColor(6); progdefaults.changed = true; } static void cb_btnColor7(Fl_Button*, void*) { selectColor(7); progdefaults.changed = true; } Fl_Button *btnColor[9]={(Fl_Button *)0}; static void cb_btnColor8(Fl_Button*, void*) { selectColor(8); progdefaults.changed = true; } Fl_Button *btnLoadPalette=(Fl_Button *)0; static void cb_btnLoadPalette(Fl_Button*, void*) { loadPalette(); progdefaults.changed = true; } Fl_Button *btnSavePalette=(Fl_Button *)0; static void cb_btnSavePalette(Fl_Button*, void*) { savePalette(); } Fl_Check_Button *btnUseCursorLines=(Fl_Check_Button *)0; static void cb_btnUseCursorLines(Fl_Check_Button* o, void*) { progdefaults.UseCursorLines = o->value(); if (o->value()) btnCursorBWcolor->activate(); else btnCursorBWcolor->deactivate(); progdefaults.changed = true; } Fl_Button *btnCursorBWcolor=(Fl_Button *)0; static void cb_btnCursorBWcolor(Fl_Button* o, void*) { if (fl_color_chooser("Cursor BW Lines", progdefaults.cursorLineRGBI.R, progdefaults.cursorLineRGBI.G, progdefaults.cursorLineRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); o->redraw(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideCursor=(Fl_Check_Button *)0; static void cb_btnUseWideCursor(Fl_Check_Button* o, void*) { progdefaults.UseWideCursor = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseCursorCenterLine=(Fl_Check_Button *)0; static void cb_btnUseCursorCenterLine(Fl_Check_Button* o, void*) { progdefaults.UseCursorCenterLine = o->value(); progdefaults.changed = true; } Fl_Button *btnCursorCenterLineColor=(Fl_Button *)0; static void cb_btnCursorCenterLineColor(Fl_Button* o, void*) { if (fl_color_chooser("Cursor Center Line", progdefaults.cursorCenterRGBI.R, progdefaults.cursorCenterRGBI.G, progdefaults.cursorCenterRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); o->redraw(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideCenter=(Fl_Check_Button *)0; static void cb_btnUseWideCenter(Fl_Check_Button* o, void*) { progdefaults.UseWideCenter = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseBWTracks=(Fl_Check_Button *)0; static void cb_btnUseBWTracks(Fl_Check_Button* o, void*) { progdefaults.UseBWTracks = o->value(); progdefaults.changed = true; } Fl_Button *btnBwTracksColor=(Fl_Button *)0; static void cb_btnBwTracksColor(Fl_Button* o, void*) { if (fl_color_chooser("Track Lines", progdefaults.bwTrackRGBI.R, progdefaults.bwTrackRGBI.G, progdefaults.bwTrackRGBI.B) ) { o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideTracks=(Fl_Check_Button *)0; static void cb_btnUseWideTracks(Fl_Check_Button* o, void*) { progdefaults.UseWideTracks = o->value(); progdefaults.changed = true; } Fl_Button *btnNotchColor=(Fl_Button *)0; static void cb_btnNotchColor(Fl_Button* o, void*) { if (fl_color_chooser("Notch Indicator", progdefaults.notchRGBI.R, progdefaults.notchRGBI.G, progdefaults.notchRGBI.B) ) { o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Check_Button *chkShowAudioScale=(Fl_Check_Button *)0; static void cb_chkShowAudioScale(Fl_Check_Button* o, void*) { progdefaults.wf_audioscale = o->value(); progdefaults.changed = true; } Fl_Button *btnWaterfallFont=(Fl_Button *)0; static void cb_btnWaterfallFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.WaterfallFontnbr); font_browser->fontSize(progdefaults.WaterfallFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser); font_browser->show(); } Fl_Check_Button *btnViewXmtSignal=(Fl_Check_Button *)0; static void cb_btnViewXmtSignal(Fl_Check_Button* o, void*) { progdefaults.viewXmtSignal=o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *valTxMonitorLevel=(Fl_Value_Slider2 *)0; static void cb_valTxMonitorLevel(Fl_Value_Slider2* o, void*) { progdefaults.TxMonitorLevel = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntLowFreqCutoff=(Fl_Counter2 *)0; static void cb_cntLowFreqCutoff(Fl_Counter2* o, void*) { progdefaults.LowFreqCutoff=(int)(o->value()); progdefaults.changed = true; setwfrange(); } Fl_Check_Button *btnWFaveraging=(Fl_Check_Button *)0; static void cb_btnWFaveraging(Fl_Check_Button* o, void*) { progdefaults.WFaveraging = o->value(); progdefaults.changed = true; } Fl_ListBox *listboxFFTPrefilter=(Fl_ListBox *)0; static void cb_listboxFFTPrefilter(Fl_ListBox* o, void*) { progdefaults.wfPreFilter = o->index(); progdefaults.changed = true; } Fl_Counter2 *cntrWfwidth=(Fl_Counter2 *)0; static void cb_cntrWfwidth(Fl_Counter2* o, void*) { progdefaults.HighFreqCutoff = (int)o->value(); progdefaults.changed = true; setwfrange(); } Fl_Counter2 *wf_latency=(Fl_Counter2 *)0; static void cb_wf_latency(Fl_Counter2* o, void*) { progdefaults.wf_latency = (int)o->value(); progdefaults.changed = true; } Fl_Counter *cntr_drop_speed=(Fl_Counter *)0; static void cb_cntr_drop_speed(Fl_Counter* o, void*) { progdefaults.drop_speed=(int)o->value(); progdefaults.changed=true; } Fl_Counter2 *cntrWfheight=(Fl_Counter2 *)0; static void cb_cntrWfheight(Fl_Counter2* o, void*) { progdefaults.wfheight = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallHistoryDefault=(Fl_Check_Button *)0; static void cb_btnWaterfallHistoryDefault(Fl_Check_Button* o, void*) { progdefaults.WaterfallHistoryDefault = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallQSY=(Fl_Check_Button *)0; static void cb_btnWaterfallQSY(Fl_Check_Button* o, void*) { progdefaults.WaterfallQSY = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallClickInsert=(Fl_Check_Button *)0; static void cb_btnWaterfallClickInsert(Fl_Check_Button* o, void*) { progdefaults.WaterfallClickInsert = o->value(); if (progdefaults.WaterfallClickInsert) inpWaterfallClickText->activate(); else inpWaterfallClickText->deactivate(); progdefaults.changed = true; } Fl_Input2 *inpWaterfallClickText=(Fl_Input2 *)0; static void cb_inpWaterfallClickText(Fl_Input2* o, void*) { progdefaults.WaterfallClickText = o->value(); progdefaults.changed = true; } Fl_ListBox *listboxWaterfallWheelAction=(Fl_ListBox *)0; static void cb_listboxWaterfallWheelAction(Fl_ListBox* o, void*) { progdefaults.WaterfallWheelAction = o->index(); progdefaults.changed = true; } Fl_Check_Button *btnWFspectrum_center=(Fl_Check_Button *)0; static void cb_btnWFspectrum_center(Fl_Check_Button* o, void*) { progdefaults.wf_spectrum_center = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWFspectrum_dbvals=(Fl_Check_Button *)0; static void cb_btnWFspectrum_dbvals(Fl_Check_Button* o, void*) { progdefaults.wf_spectrum_dbvals = o->value(); progdefaults.changed = true; } Fl_Counter *cntr_spectrum_freq_scale=(Fl_Counter *)0; static void cb_cntr_spectrum_freq_scale(Fl_Counter* o, void*) { progdefaults.wf_spectrum_scale_factor = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_spectrum_modem_scale=(Fl_Check_Button *)0; static void cb_btn_spectrum_modem_scale(Fl_Check_Button* o, void*) { progdefaults.wf_spectrum_modem_scale = o->value(); progdefaults.changed = true; } Fl_Group *tabModems=(Fl_Group *)0; Fl_Tabs *tabsModems=(Fl_Tabs *)0; Fl_Group *tabCW=(Fl_Group *)0; Fl_Tabs *tabsCW=(Fl_Tabs *)0; Fl_Group *tabsCW_general=(Fl_Group *)0; Fl_Check_Button *btnCWuseSOMdecoding=(Fl_Check_Button *)0; static void cb_btnCWuseSOMdecoding(Fl_Check_Button* o, void*) { progdefaults.CWuseSOMdecoding = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWrcvTrack=(Fl_Check_Button *)0; static void cb_btnCWrcvTrack(Fl_Check_Button* o, void*) { progdefaults.CWtrack = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWbandwidth=(Fl_Value_Slider2 *)0; static void cb_sldrCWbandwidth(Fl_Value_Slider2* o, void*) { progdefaults.CWbandwidth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWmfilt=(Fl_Check_Button *)0; static void cb_btnCWmfilt(Fl_Check_Button* o, void*) { progdefaults.CWmfilt = o->value(); progdefaults.changed = true; } Fl_Value_Output *valCWrcvWPM=(Fl_Value_Output *)0; static void cb_valCWrcvWPM(Fl_Value_Output*, void*) { progdefaults.changed = true; } Fl_Progress *prgsCWrcvWPM=(Fl_Progress *)0; Fl_Counter2 *cntLower=(Fl_Counter2 *)0; static void cb_cntLower(Fl_Counter2* o, void*) { progdefaults.CWlower = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntUpper=(Fl_Counter2 *)0; static void cb_cntUpper(Fl_Counter2* o, void*) { progdefaults.CWupper = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWrange=(Fl_Counter2 *)0; static void cb_cntCWrange(Fl_Counter2* o, void*) { progdefaults.CWrange = (int)o->value(); progdefaults.changed = true; } Fl_Choice *mnu_cwrx_attack=(Fl_Choice *)0; static void cb_mnu_cwrx_attack(Fl_Choice* o, void*) { progdefaults.cwrx_attack = o->value(); progdefaults.changed = true; } Fl_Choice *mnu_cwrx_decay=(Fl_Choice *)0; static void cb_mnu_cwrx_decay(Fl_Choice* o, void*) { progdefaults.cwrx_decay = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWxmtWPM=(Fl_Value_Slider2 *)0; static void cb_sldrCWxmtWPM(Fl_Value_Slider2* o, void*) { progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); } Fl_Counter2 *cntCWdefWPM=(Fl_Counter2 *)0; static void cb_cntCWdefWPM(Fl_Counter2* o, void*) { progdefaults.defCWspeed = (int)o->value(); progdefaults.changed = true; } Fl_Counter *cntCWlowerlimit=(Fl_Counter *)0; static void cb_cntCWlowerlimit(Fl_Counter* o, void*) { progdefaults.CWlowerlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->minimum(progdefaults.CWlowerlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWupperlimit->minimum(progdefaults.CWlowerlimit+20); cntCW_WPM->minimum(progdefaults.CWlowerlimit); } Fl_Counter *cntCWupperlimit=(Fl_Counter *)0; static void cb_cntCWupperlimit(Fl_Counter* o, void*) { progdefaults.CWupperlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->maximum(progdefaults.CWupperlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWlowerlimit->maximum(progdefaults.CWupperlimit-20); cntCW_WPM->maximum(progdefaults.CWupperlimit); } Fl_Value_Slider2 *sldrCWfarnsworth=(Fl_Value_Slider2 *)0; static void cb_sldrCWfarnsworth(Fl_Value_Slider2* o, void*) { progdefaults.CWfarnsworth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWusefarnsworth=(Fl_Check_Button *)0; static void cb_btnCWusefarnsworth(Fl_Check_Button* o, void*) { progdefaults.CWusefarnsworth=o->value(); progdefaults.changed = true; } Fl_Group *tabsCW_timing=(Fl_Group *)0; Fl_Counter2 *cntCWweight=(Fl_Counter2 *)0; static void cb_cntCWweight(Fl_Counter2* o, void*) { progdefaults.CWweight=(int)o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWdash2dot=(Fl_Counter2 *)0; static void cb_cntCWdash2dot(Fl_Counter2* o, void*) { progdefaults.CWdash2dot=o->value(); cnt_nanoCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true; } Fl_Counter2 *cntCWrisetime=(Fl_Counter2 *)0; static void cb_cntCWrisetime(Fl_Counter2* o, void*) { progdefaults.CWrisetime=o->value(); progdefaults.changed = true; } Fl_ListBox *i_listboxQSKshape=(Fl_ListBox *)0; static void cb_i_listboxQSKshape(Fl_ListBox* o, void*) { progdefaults.QSKshape = o->index(); progdefaults.changed = true; } Fl_Check_Button *btnCWnarrow=(Fl_Check_Button *)0; static void cb_btnCWnarrow(Fl_Check_Button* o, void*) { progdefaults.CWnarrow = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCW_bpf_on=(Fl_Check_Button *)0; static void cb_btnCW_bpf_on(Fl_Check_Button* o, void*) { progdefaults.CW_bpf_on = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCW_hpf=(Fl_Counter2 *)0; static void cb_cntCW_hpf(Fl_Counter2* o, void*) { progdefaults.CW_bpf=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnQSK=(Fl_Check_Button *)0; static void cb_btnQSK(Fl_Check_Button* o, void*) { progdefaults.QSK = o->value(); btnQSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }; } Fl_Counter2 *cntPreTiming=(Fl_Counter2 *)0; static void cb_cntPreTiming(Fl_Counter2* o, void*) { progdefaults.CWpre=o->value(); progdefaults.changed = true; } Fl_Counter2 *cntPostTiming=(Fl_Counter2 *)0; static void cb_cntPostTiming(Fl_Counter2* o, void*) { progdefaults.CWpost=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnQSKadjust=(Fl_Check_Button *)0; static void cb_btnQSKadjust(Fl_Check_Button* o, void*) { progdefaults.QSKadjust = o->value(); } Fl_ListBox *i_listbox_test_char=(Fl_ListBox *)0; static void cb_i_listbox_test_char(Fl_ListBox* o, void*) { progdefaults.TestChar = o->index(); } Fl_Group *tabsCW_prosigns=(Fl_Group *)0; Fl_Check_Button *btnCW_use_paren=(Fl_Check_Button *)0; static void cb_btnCW_use_paren(Fl_Check_Button* o, void*) { progdefaults.CW_use_paren=o->value(); progdefaults.changed = true; } static void cb_listbox_prosign(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[0] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign1(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[1] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign2(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[2] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign3(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[3] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign4(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[4] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign5(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[5] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign6(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[6] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign7(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[7] = ps[c]; progdefaults.changed = true;; } Fl_ListBox *listbox_prosign[9]={(Fl_ListBox *)0}; static void cb_listbox_prosign8(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[8] = ps[c]; progdefaults.changed = true; } Fl_Group *tabsCW_winkeyer=(Fl_Group *)0; Fl_ComboBox *select_WK_CommPort=(Fl_ComboBox *)0; static void cb_select_WK_CommPort(Fl_ComboBox* o, void*) { progStatus.WK_serial_port_name = o->value(); select_WKFSK_CommPort->value(progStatus.WK_serial_port_name.c_str()); } Fl_Light_Button *btn_WKCW_connect=(Fl_Light_Button *)0; static void cb_btn_WKCW_connect(Fl_Light_Button* o, void*) { WKCW_connect(o->value()); } Fl_Check_Button *btn_WK_swap=(Fl_Check_Button *)0; static void cb_btn_WK_swap(Fl_Check_Button*, void*) { WK_change_btn_swap(); } Fl_Check_Button *btn_WK_auto_space=(Fl_Check_Button *)0; static void cb_btn_WK_auto_space(Fl_Check_Button*, void*) { WK_change_btn_auto_space(); } Fl_Check_Button *btn_WK_ct_space=(Fl_Check_Button *)0; static void cb_btn_WK_ct_space(Fl_Check_Button*, void*) { WK_change_btn_ct_space(); } Fl_Check_Button *btn_WK_paddledog=(Fl_Check_Button *)0; static void cb_btn_WK_paddledog(Fl_Check_Button*, void*) { WK_change_btn_paddledog(); } Fl_Check_Button *btn_WK_cut_zeronine=(Fl_Check_Button *)0; static void cb_btn_WK_cut_zeronine(Fl_Check_Button*, void*) { WK_change_btn_cut_zeronine(); } Fl_Check_Button *btn_WK_paddle_echo=(Fl_Check_Button *)0; static void cb_btn_WK_paddle_echo(Fl_Check_Button*, void*) { WK_change_btn_paddle_echo(); } Fl_Check_Button *btn_WK_serial_echo=(Fl_Check_Button *)0; static void cb_btn_WK_serial_echo(Fl_Check_Button*, void*) { WK_change_btn_serial_echo(); } Fl_Check_Button *btn_WK_sidetone_on=(Fl_Check_Button *)0; static void cb_btn_WK_sidetone_on(Fl_Check_Button*, void*) { WK_change_btn_sidetone_on(); } Fl_Check_Button *btn_WK_tone_on=(Fl_Check_Button *)0; static void cb_btn_WK_tone_on(Fl_Check_Button*, void*) { WK_change_btn_tone_on(); } Fl_Check_Button *btn_WK_ptt_on=(Fl_Check_Button *)0; static void cb_btn_WK_ptt_on(Fl_Check_Button*, void*) { WK_change_btn_ptt_on(); } Fl_Counter *cntr_WK_min_wpm=(Fl_Counter *)0; static void cb_cntr_WK_min_wpm(Fl_Counter* o, void*) { WK_change_cntr_min_wpm(); if ((o->value() + cntr_WK_rng_wpm->value()) > 55) cntr_WK_rng_wpm->value(55 - o->value()); } Fl_Counter *cntr_WK_rng_wpm=(Fl_Counter *)0; static void cb_cntr_WK_rng_wpm(Fl_Counter* o, void*) { WK_change_cntr_rng_wpm(); if ((cntr_WK_min_wpm->value() + o->value()) > 55) o->value(55 - cntr_WK_min_wpm->value()); } Fl_Counter *cntr_WK_farnsworth=(Fl_Counter *)0; static void cb_cntr_WK_farnsworth(Fl_Counter*, void*) { WK_change_cntr_farnsworth(); } Fl_Counter *cntr_WK_cmd_wpm=(Fl_Counter *)0; static void cb_cntr_WK_cmd_wpm(Fl_Counter*, void*) { WK_change_cntr_cmd_wpm(); } Fl_Counter *cntr_WK_ratio=(Fl_Counter *)0; static void cb_cntr_WK_ratio(Fl_Counter*, void*) { WK_change_cntr_ratio(); } Fl_Counter *cntr_WK_comp=(Fl_Counter *)0; static void cb_cntr_WK_comp(Fl_Counter*, void*) { WK_change_cntr_comp(); } Fl_Counter *cntr_WK_first_ext=(Fl_Counter *)0; static void cb_cntr_WK_first_ext(Fl_Counter*, void*) { WK_change_cntr_first_ext(); } Fl_Counter *cntr_WK_sample=(Fl_Counter *)0; static void cb_cntr_WK_sample(Fl_Counter*, void*) { WK_change_cntr_sample(); } Fl_Counter *cntr_WK_weight=(Fl_Counter *)0; static void cb_cntr_WK_weight(Fl_Counter*, void*) { WK_change_cntr_weight(); } Fl_Counter *cntr_WK_leadin=(Fl_Counter *)0; static void cb_cntr_WK_leadin(Fl_Counter*, void*) { WK_change_cntr_leadin(); } Fl_Counter *cntr_WK_tail=(Fl_Counter *)0; static void cb_cntr_WK_tail(Fl_Counter*, void*) { WK_change_cntr_tail(); } Fl_ComboBox *choice_WK_keyer_mode=(Fl_ComboBox *)0; static void cb_choice_WK_keyer_mode(Fl_ComboBox*, void*) { WK_change_choice_keyer_mode(); } Fl_ComboBox *choice_WK_hang=(Fl_ComboBox *)0; static void cb_choice_WK_hang(Fl_ComboBox*, void*) { WK_change_choice_hang(); } Fl_ComboBox *choice_WK_sidetone=(Fl_ComboBox *)0; static void cb_choice_WK_sidetone(Fl_ComboBox*, void*) { WK_change_choice_sidetone(); } Fl_ComboBox *choice_WK_output_pins=(Fl_ComboBox *)0; static void cb_choice_WK_output_pins(Fl_ComboBox*, void*) { WK_change_choice_output_pins(); } Fl_Box *box_WK_wait=(Fl_Box *)0; Fl_Box *box_WK_break_in=(Fl_Box *)0; Fl_Box *box_WK_busy=(Fl_Box *)0; Fl_Box *box_WK_xoff=(Fl_Box *)0; Fl_Box *box_WK_keydown=(Fl_Box *)0; Fl_Check_Button *btn_WK_use_pot=(Fl_Check_Button *)0; static void cb_btn_WK_use_pot(Fl_Check_Button*, void*) { WK_use_pot_changed(); } Fl_Output *txt_WK_wpm=(Fl_Output *)0; Fl_Check_Button *btnK3NG=(Fl_Check_Button *)0; static void cb_btnK3NG(Fl_Check_Button* o, void*) { progdefaults.WK_K3NGsketch = o->value(); progdefaults.changed = true; } Fl_Group *tabsCW_ext_chars=(Fl_Group *)0; Fl_Check_Button *btn_A_aelig=(Fl_Check_Button *)0; static void cb_btn_A_aelig(Fl_Check_Button* o, void*) { progdefaults.A_aelig = o->value(); if (progdefaults.A_aelig) { progdefaults.A_umlaut = false; btn_A_umlaut->value(0); } btn_A_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_A_umlaut=(Fl_Check_Button *)0; static void cb_btn_A_umlaut(Fl_Check_Button* o, void*) { progdefaults.A_umlaut = o->value(); if (progdefaults.A_umlaut) { progdefaults.A_aelig = false; btn_A_aelig->value(0); } btn_A_aelig->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_A_ring=(Fl_Check_Button *)0; static void cb_btn_A_ring(Fl_Check_Button* o, void*) { progdefaults.A_ring = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_O_acute=(Fl_Check_Button *)0; static void cb_btn_O_acute(Fl_Check_Button* o, void*) { progdefaults.O_acute = o->value(); if (progdefaults.O_acute) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_umlaut->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_O_slash=(Fl_Check_Button *)0; static void cb_btn_O_slash(Fl_Check_Button* o, void*) { progdefaults.O_slash = o->value(); if (progdefaults.O_slash) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_acute = false; btn_O_acute->value(0); } btn_O_umlaut->redraw(); btn_O_acute->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_O_umlaut=(Fl_Check_Button *)0; static void cb_btn_O_umlaut(Fl_Check_Button* o, void*) { progdefaults.O_umlaut = o->value(); if (progdefaults.O_umlaut) { progdefaults.O_acute = false; btn_O_acute->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_acute->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_C_cedilla=(Fl_Check_Button *)0; static void cb_btn_C_cedilla(Fl_Check_Button* o, void*) { progdefaults.C_cedilla = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_E_grave=(Fl_Check_Button *)0; static void cb_btn_E_grave(Fl_Check_Button* o, void*) { progdefaults.E_grave = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_E_acute=(Fl_Check_Button *)0; static void cb_btn_E_acute(Fl_Check_Button* o, void*) { progdefaults.E_acute = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_N_tilde=(Fl_Check_Button *)0; static void cb_btn_N_tilde(Fl_Check_Button* o, void*) { progdefaults.N_tilde = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_U_umlaut=(Fl_Check_Button *)0; static void cb_btn_U_umlaut(Fl_Check_Button* o, void*) { progdefaults.U_umlaut = o->value(); if (progdefaults.U_umlaut) { progdefaults.U_circ = false; btn_U_circ->value(0); } btn_U_circ->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_U_circ=(Fl_Check_Button *)0; static void cb_btn_U_circ(Fl_Check_Button* o, void*) { progdefaults.U_circ = o->value(); if (progdefaults.U_circ) { progdefaults.U_umlaut = false; btn_U_umlaut->value(0); } btn_U_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Group *tab_nanoCW=(Fl_Group *)0; Fl_ComboBox *select_nanoCW_CommPort=(Fl_ComboBox *)0; static void cb_select_nanoCW_CommPort(Fl_ComboBox* o, void*) { progdefaults.nanoIO_serial_port_name = o->value(); } Fl_Light_Button *btn_nanoCW_connect=(Fl_Light_Button *)0; static void cb_btn_nanoCW_connect(Fl_Light_Button* o, void*) { if (o->value()) { btn_nanoIO_connect->value(0); if (!open_nanoCW()) o->value(0); } else { close_nanoIO(); }; } Fl_Button *btn_cwfsk_save=(Fl_Button *)0; static void cb_btn_cwfsk_save(Fl_Button*, void*) { nano_CW_save(); } Fl_Button *btn_cwfsk_query=(Fl_Button *)0; static void cb_btn_cwfsk_query(Fl_Button*, void*) { nano_CW_query(); } Fl_Counter *cntr_nanoCW_paddle_WPM=(Fl_Counter *)0; static void cb_cntr_nanoCW_paddle_WPM(Fl_Counter* o, void*) { progdefaults.CW_keyspeed = (int)o->value(); set_nano_keyerWPM(progdefaults.CW_keyspeed); progdefaults.changed = true; } FTextView *txt_nano_CW_io=(FTextView *)0; Fl_Counter *cntr_nanoCW_WPM=(Fl_Counter *)0; static void cb_cntr_nanoCW_WPM(Fl_Counter* o, void*) { progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); sldrCWxmtWPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); } Fl_Counter2 *cnt_nanoCWdash2dot=(Fl_Counter2 *)0; static void cb_cnt_nanoCWdash2dot(Fl_Counter2* o, void*) { progdefaults.CWdash2dot=o->value(); cntCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true; } Fl_ListBox *listbox_nano_keyer=(Fl_ListBox *)0; static void cb_listbox_nano_keyer(Fl_ListBox* o, void*) { progdefaults.nanoIO_CW_keyer = o->index(); set_nanoIO_keyer(o->index()); progdefaults.changed = true; } Fl_ListBox *listbox_incr=(Fl_ListBox *)0; static void cb_listbox_incr(Fl_ListBox* o, void*) { progdefaults.nanoIO_CW_incr = o->index() + '1'; set_nanoIO_incr(); progdefaults.changed = true; } Fl_Check_Button *btn_disable_CW_PTT=(Fl_Check_Button *)0; static void cb_btn_disable_CW_PTT(Fl_Check_Button* o, void*) { progdefaults.disable_CW_PTT=o->value(); progdefaults.changed=true; nanoIO_set_cw_ptt(); } Fl_Check_Button *btn_nanoIO_pot=(Fl_Check_Button *)0; static void cb_btn_nanoIO_pot(Fl_Check_Button* o, void*) { progdefaults.nanoIO_speed_pot=o->value(); progdefaults.changed=true; nanoIO_use_pot(); } Fl_Counter *cntr_nanoIO_min_wpm=(Fl_Counter *)0; static void cb_cntr_nanoIO_min_wpm(Fl_Counter* o, void*) { if ((o->value() + cntr_nanoIO_rng_wpm->value()) > 100) cntr_nanoIO_rng_wpm->value(100 - o->value()); set_nanoIO_min_max(); } Fl_Counter *cntr_nanoIO_rng_wpm=(Fl_Counter *)0; static void cb_cntr_nanoIO_rng_wpm(Fl_Counter* o, void*) { if ((cntr_nanoIO_min_wpm->value() + o->value()) > 100) o->value(100 - cntr_nanoIO_min_wpm->value()); set_nanoIO_min_max(); } Fl_Group *tabDomEX=(Fl_Group *)0; Fl_Input2 *txtSecondary=(Fl_Input2 *)0; static void cb_txtSecondary(Fl_Input2* o, void*) { progdefaults.secText = o->value(); progdefaults.changed = true; } Fl_Check_Button *valDominoEX_FILTER=(Fl_Check_Button *)0; static void cb_valDominoEX_FILTER(Fl_Check_Button* o, void*) { progdefaults.DOMINOEX_FILTER = o->value(); resetDOMEX(); progdefaults.changed = true; } Fl_Counter2 *valDominoEX_BW=(Fl_Counter2 *)0; static void cb_valDominoEX_BW(Fl_Counter2* o, void*) { progdefaults.DOMINOEX_BW = o->value(); resetDOMEX(); progdefaults.changed = true; } Fl_Check_Button *chkDominoEX_FEC=(Fl_Check_Button *)0; static void cb_chkDominoEX_FEC(Fl_Check_Button* o, void*) { progdefaults.DOMINOEX_FEC = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *valDomCWI=(Fl_Value_Slider2 *)0; static void cb_valDomCWI(Fl_Value_Slider2* o, void*) { progdefaults.DomCWI = o->value(); progdefaults.changed = true; } Fl_Counter2 *valDominoEX_PATHS=(Fl_Counter2 *)0; static void cb_valDominoEX_PATHS(Fl_Counter2* o, void*) { progdefaults.DOMINOEX_PATHS = (int)o->value(); progdefaults.changed = true; } Fl_Group *tabFeld=(Fl_Group *)0; Fl_ListBox *listboxHellFont=(Fl_ListBox *)0; static void cb_listboxHellFont(Fl_ListBox* o, void*) { progdefaults.feldfontnbr=o->index(); progdefaults.changed = true; } Fl_ListBox *listboxHellPulse=(Fl_ListBox *)0; static void cb_listboxHellPulse(Fl_ListBox* o, void*) { progdefaults.HellPulseFast = o->index(); progdefaults.changed = true; } Fl_Check_Button *btnFeldHellIdle=(Fl_Check_Button *)0; static void cb_btnFeldHellIdle(Fl_Check_Button* o, void*) { progdefaults.HellXmtIdle=o->value(); progdefaults.changed = true; } Fl_Value_Slider *valHellXmtWidth=(Fl_Value_Slider *)0; static void cb_valHellXmtWidth(Fl_Value_Slider* o, void*) { progdefaults.HellXmtWidth=(int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnBlackboard=(Fl_Check_Button *)0; static void cb_btnBlackboard(Fl_Check_Button* o, void*) { progdefaults.HellBlackboard=o->value(); FHdisp->reverse(progdefaults.HellBlackboard); progdefaults.changed = true; } Fl_Check_Button *btnHellMarquee=(Fl_Check_Button *)0; static void cb_btnHellMarquee(Fl_Check_Button* o, void*) { progdefaults.HellMarquee=o->value(); FHdisp->set_marquee(progdefaults.HellMarquee); progdefaults.changed = true; } Fl_Value_Slider *valHellRcvWidth=(Fl_Value_Slider *)0; static void cb_valHellRcvWidth(Fl_Value_Slider* o, void*) { progdefaults.HellRcvWidth=(int)o->value(); progdefaults.changed = true; } Fl_Value_Slider *valHellRcvHeight=(Fl_Value_Slider *)0; static void cb_valHellRcvHeight(Fl_Value_Slider*, void*) { FHdisp_char_height(); } Fl_Value_Slider2 *sldrHellBW=(Fl_Value_Slider2 *)0; static void cb_sldrHellBW(Fl_Value_Slider2*, void*) { progdefaults.HELL_BW = sldrHellBW->value(); } Fl_Value_Slider *val_hellagc=(Fl_Value_Slider *)0; static void cb_val_hellagc(Fl_Value_Slider* o, void*) { progdefaults.hellagc=(int)o->value(); progdefaults.changed = true; } Fl_Group *tabFSQ=(Fl_Group *)0; Fl_Value_Slider *valhits=(Fl_Value_Slider *)0; static void cb_valhits(Fl_Value_Slider* o, void*) { progdefaults.fsqhits=(int)o->value(); progdefaults.changed = true; } Fl_Choice *sel_fsq_lpf=(Fl_Choice *)0; static void cb_sel_fsq_lpf(Fl_Choice* o, void*) { progdefaults.fsq_img_filter=o->value(); progdefaults.changed = true; } Fl_Value_Slider *sldrMovAvg=(Fl_Value_Slider *)0; static void cb_sldrMovAvg(Fl_Value_Slider* o, void*) { progdefaults.fsq_movavg = o->value(); progdefaults.changed = true; } Fl_Choice *sel_fsq_heard_aging=(Fl_Choice *)0; static void cb_sel_fsq_heard_aging(Fl_Choice* o, void*) { progdefaults.fsq_heard_aging=o->value(); progdefaults.changed = true; } static void cb_btn_fsqbaud(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 1.5; btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } static void cb_btn_fsqbaud1(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 2; btn_fsqbaud[0]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } static void cb_btn_fsqbaud2(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 3; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } static void cb_btn_fsqbaud3(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 4.5; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } Fl_Round_Button *btn_fsqbaud[5]={(Fl_Round_Button *)0}; static void cb_btn_fsqbaud4(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 6; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); } progdefaults.changed = true; } Fl_Choice *sel_fsq_frequency=(Fl_Choice *)0; static void cb_sel_fsq_frequency(Fl_Choice* o, void*) { progdefaults.fsq_frequency=o->value(); progdefaults.changed = true; } Fl_Choice *sel_fsq_sounder=(Fl_Choice *)0; static void cb_sel_fsq_sounder(Fl_Choice* o, void*) { progdefaults.fsq_sounder=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fsq_lowercase=(Fl_Check_Button *)0; static void cb_btn_fsq_lowercase(Fl_Check_Button* o, void*) { progdefaults.fsq_lowercase=o->value(); progdefaults.changed = true; } Fl_Counter *cntr_FSQ_time_out=(Fl_Counter *)0; static void cb_cntr_FSQ_time_out(Fl_Counter* o, void*) { progdefaults.fsq_time_out = o->value(); progdefaults.changed = true; } static void cb_QTC(Fl_Input* o, void*) { progdefaults.fsqQTCtext = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fsq_msg_dt_stamp=(Fl_Check_Button *)0; static void cb_btn_fsq_msg_dt_stamp(Fl_Check_Button* o, void*) { progdefaults.add_fsq_msg_dt=o->value(); progdefaults.changed=true; } Fl_Check_Button *btn_fsq_msg_append=(Fl_Check_Button *)0; static void cb_btn_fsq_msg_append(Fl_Check_Button* o, void*) { progdefaults.always_append=o->value(); progdefaults.changed=true; } Fl_Counter *cntr_FSQ_notify_time_out=(Fl_Counter *)0; static void cb_cntr_FSQ_notify_time_out(Fl_Counter* o, void*) { progdefaults.fsq_notify_time_out = o->value(); progdefaults.changed = true; } Fl_Output *txtAuditLog=(Fl_Output *)0; Fl_Light_Button *btn_enable_auditlog=(Fl_Light_Button *)0; static void cb_btn_enable_auditlog(Fl_Light_Button* o, void*) { progdefaults.fsq_enable_audit_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auditlog=(Fl_Button *)0; static void cb_btn_select_auditlog(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.fsq_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_audit_log = fl_filename_name(fname); txtAuditLog->value(progdefaults.fsq_audit_log.c_str()); progdefaults.changed = true; } Fl_Output *txtHeardLog=(Fl_Output *)0; Fl_Light_Button *btn_enable_fsq_heard_log=(Fl_Light_Button *)0; static void cb_btn_enable_fsq_heard_log(Fl_Light_Button* o, void*) { progdefaults.fsq_enable_heard_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_fsq_heard_log=(Fl_Button *)0; static void cb_btn_select_fsq_heard_log(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.fsq_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_heard_log = fl_filename_name(fname); txtHeardLog->value(progdefaults.fsq_heard_log.c_str()); progdefaults.changed = true; } Fl_Button *btn_fsq_xmt_color=(Fl_Button *)0; static void cb_btn_fsq_xmt_color(Fl_Button*, void*) { choose_color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->color( progdefaults.fsq_xmt_color ); btn_fsq_xmt_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); progdefaults.changed = true; } Fl_Button *btn_fsq_directed_color=(Fl_Button *)0; static void cb_btn_fsq_directed_color(Fl_Button*, void*) { choose_color(progdefaults.fsq_directed_color); btn_fsq_directed_color->color( progdefaults.fsq_directed_color ); btn_fsq_directed_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); progdefaults.changed = true; } Fl_Button *btn_fsq_undirected_color=(Fl_Button *)0; static void cb_btn_fsq_undirected_color(Fl_Button*, void*) { choose_color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->color( progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true; } Fl_Button *btn_fsq_color_defaults=(Fl_Button *)0; static void cb_btn_fsq_color_defaults(Fl_Button*, void*) { progdefaults.fsq_xmt_color = FL_RED; btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->redraw(); progdefaults.fsq_directed_color = FL_BLUE; btn_fsq_directed_color->color(progdefaults.fsq_directed_color); btn_fsq_directed_color->redraw(); progdefaults.fsq_undirected_color = FL_DARK_GREEN; btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true; } Fl_Group *tabIFKP=(Fl_Group *)0; static void cb_btn_ifkpbaud(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.ifkp_baud = 0; btn_ifkpbaud[1]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true; } static void cb_btn_ifkpbaud1(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.ifkp_baud = 1; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true; } Fl_Round_Button *btn_ifkpbaud[3]={(Fl_Round_Button *)0}; static void cb_btn_ifkpbaud2(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.ifkp_baud = 2; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[1]->value(0); } progdefaults.changed = true; } Fl_Check_Button *btn_ifkp_lowercase=(Fl_Check_Button *)0; static void cb_btn_ifkp_lowercase(Fl_Check_Button* o, void*) { progdefaults.ifkp_lowercase=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_ifkp_lowercase_call=(Fl_Check_Button *)0; static void cb_btn_ifkp_lowercase_call(Fl_Check_Button* o, void*) { progdefaults.ifkp_lowercase_call=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_ifkp_freqlock=(Fl_Check_Button *)0; static void cb_btn_ifkp_freqlock(Fl_Check_Button* o, void*) { progdefaults.ifkp_freqlock=o->value(); if (active_modem == ifkp_modem && o->value() ) active_modem->set_freq(1500); progdefaults.changed = true; } Fl_Output *txt_ifkp_audit_log=(Fl_Output *)0; Fl_Light_Button *btn_enable_ifkp_audit_log=(Fl_Light_Button *)0; static void cb_btn_enable_ifkp_audit_log(Fl_Light_Button* o, void*) { progdefaults.ifkp_enable_audit_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_ifkp_select_auditlog=(Fl_Button *)0; static void cb_btn_ifkp_select_auditlog(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.ifkp_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_audit_log = fl_filename_name(fname); txt_ifkp_audit_log->value(progdefaults.ifkp_audit_log.c_str()); progdefaults.changed = true; } Fl_Output *txt_ifkp_heard_log=(Fl_Output *)0; Fl_Light_Button *btn_enable_ifkp_heard_log=(Fl_Light_Button *)0; static void cb_btn_enable_ifkp_heard_log(Fl_Light_Button* o, void*) { progdefaults.ifkp_enable_heard_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_ifkp_heard_log=(Fl_Button *)0; static void cb_btn_select_ifkp_heard_log(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.ifkp_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_heard_log = fl_filename_name(fname); txt_ifkp_heard_log->value(progdefaults.ifkp_heard_log.c_str()); progdefaults.changed = true; } Fl_Group *tabMT63=(Fl_Group *)0; Fl_Check_Button *btnMT63_8bit=(Fl_Check_Button *)0; static void cb_btnMT63_8bit(Fl_Check_Button* o, void*) { progdefaults.mt63_8bit = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_rx_integration=(Fl_Check_Button *)0; static void cb_btnMT63_rx_integration(Fl_Check_Button* o, void*) { progdefaults.mt63_rx_integration = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_usetones=(Fl_Check_Button *)0; static void cb_btnMT63_usetones(Fl_Check_Button* o, void*) { progdefaults.mt63_usetones = o->value(); if (!o->value()) { btnMT63_upper_lower->value(0); btnMT63_upper_lower->do_callback(); btnMT63_upper_lower->deactivate(); } else btnMT63_upper_lower->activate(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_upper_lower=(Fl_Check_Button *)0; static void cb_btnMT63_upper_lower(Fl_Check_Button* o, void*) { progdefaults.mt63_twotones = o->value(); progdefaults.changed = true; } Fl_Spinner2 *MT63_tone_duration=(Fl_Spinner2 *)0; static void cb_MT63_tone_duration(Fl_Spinner2* o, void*) { progdefaults.mt63_tone_duration=(int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_at500=(Fl_Check_Button *)0; static void cb_btnMT63_at500(Fl_Check_Button* o, void*) { o->value(1); progdefaults.mt63_at500 = true; progdefaults.mt63_centered = false; btnMT63_centered->value(0); btnMT63_manual->value(0); progdefaults.changed = true; } Fl_Check_Button *btnMT63_centered=(Fl_Check_Button *)0; static void cb_btnMT63_centered(Fl_Check_Button* o, void*) { o->value(1); progdefaults.mt63_centered = true; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_manual->value(0); progdefaults.changed = true; } Fl_Check_Button *btnMT63_manual=(Fl_Check_Button *)0; static void cb_btnMT63_manual(Fl_Check_Button* o, void*) { o->value(1); progdefaults.mt63_centered = false; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_centered->value(0); progdefaults.changed = true; } Fl_Group *tabOlivia=(Fl_Group *)0; Fl_ListBox *i_listbox_olivia_bandwidth=(Fl_ListBox *)0; static void cb_i_listbox_olivia_bandwidth(Fl_ListBox* o, void*) { progdefaults.oliviabw = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true; } Fl_ListBox *i_listbox_olivia_tones=(Fl_ListBox *)0; static void cb_i_listbox_olivia_tones(Fl_ListBox* o, void*) { progdefaults.oliviatones = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true; } Fl_Counter2 *cntOlivia_smargin=(Fl_Counter2 *)0; static void cb_cntOlivia_smargin(Fl_Counter2* o, void*) { progdefaults.oliviasmargin = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true; } Fl_Counter2 *cntOlivia_sinteg=(Fl_Counter2 *)0; static void cb_cntOlivia_sinteg(Fl_Counter2* o, void*) { progdefaults.oliviasinteg = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true; } Fl_Check_Button *btn_olivia_reset_fec=(Fl_Check_Button *)0; static void cb_btn_olivia_reset_fec(Fl_Check_Button* o, void*) { progdefaults.olivia_reset_fec = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnOlivia_8bit=(Fl_Check_Button *)0; static void cb_btnOlivia_8bit(Fl_Check_Button* o, void*) { progdefaults.olivia8bit = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnOlivia_start_stop_tones=(Fl_Check_Button *)0; static void cb_btnOlivia_start_stop_tones(Fl_Check_Button* o, void*) { progdefaults.olivia_start_tones = o->value(); progdefaults.changed = true; } Fl_Group *tabContestia=(Fl_Group *)0; Fl_ListBox *i_listbox_contestia_bandwidth=(Fl_ListBox *)0; static void cb_i_listbox_contestia_bandwidth(Fl_ListBox* o, void*) { progdefaults.contestiabw = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true; } Fl_ListBox *i_listbox_contestia_tones=(Fl_ListBox *)0; static void cb_i_listbox_contestia_tones(Fl_ListBox* o, void*) { progdefaults.contestiatones = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true; } Fl_Counter2 *cntContestia_smargin=(Fl_Counter2 *)0; static void cb_cntContestia_smargin(Fl_Counter2* o, void*) { progdefaults.contestiasmargin = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true; } Fl_Counter2 *cntContestia_sinteg=(Fl_Counter2 *)0; static void cb_cntContestia_sinteg(Fl_Counter2* o, void*) { progdefaults.contestiasinteg = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true; } Fl_Check_Button *btnContestia_8bit=(Fl_Check_Button *)0; static void cb_btnContestia_8bit(Fl_Check_Button* o, void*) { progdefaults.contestia8bit = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnContestia_start_stop_tones=(Fl_Check_Button *)0; static void cb_btnContestia_start_stop_tones(Fl_Check_Button* o, void*) { progdefaults.contestia_start_tones = o->value(); progdefaults.changed = true; } Fl_Group *tabPSK=(Fl_Group *)0; Fl_Tabs *tabsPSK=(Fl_Tabs *)0; Fl_Group *grpPSK=(Fl_Group *)0; Fl_Counter2 *cntSearchRange=(Fl_Counter2 *)0; static void cb_cntSearchRange(Fl_Counter2* o, void*) { progdefaults.SearchRange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntACQsn=(Fl_Counter2 *)0; static void cb_cntACQsn(Fl_Counter2* o, void*) { progdefaults.ACQsn = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_psk_status_timeout=(Fl_ListBox *)0; static void cb_listbox_psk_status_timeout(Fl_ListBox* o, void*) { progdefaults.StatusDim = o->index(); progdefaults.changed = true; } static void cb_seconds(Fl_Counter2* o, void*) { progdefaults.StatusTimeout = (int)(o->value()); progdefaults.changed = true; } Fl_Check_Button *btnEnablePSKbrowsing=(Fl_Check_Button *)0; static void cb_btnEnablePSKbrowsing(Fl_Check_Button* o, void*) { progdefaults.pskbrowser_on = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnPSKpilot=(Fl_Check_Button *)0; static void cb_btnPSKpilot(Fl_Check_Button* o, void*) { progdefaults.pskpilot = o->value(); progdefaults.changed = true; } Fl_Counter2 *cnt_pilot_power=(Fl_Counter2 *)0; static void cb_cnt_pilot_power(Fl_Counter2* o, void*) { progdefaults.pilot_power = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnPSK8Preamble=(Fl_Check_Button *)0; static void cb_btnPSK8Preamble(Fl_Check_Button* o, void*) { progStatus.psk8DCDShortFlag = o->value(); } Fl_Group *tabRTTY=(Fl_Group *)0; Fl_Tabs *tabsRTTY=(Fl_Tabs *)0; Fl_Group *tab_Rx_TTY=(Fl_Group *)0; Fl_ListBox *i_listbox_rtty_afc_speed=(Fl_ListBox *)0; static void cb_i_listbox_rtty_afc_speed(Fl_ListBox* o, void*) { progdefaults.rtty_afcspeed = o->index(); progdefaults.changed = true; } Fl_Check_Button *chkUOSrx=(Fl_Check_Button *)0; static void cb_chkUOSrx(Fl_Check_Button* o, void*) { progdefaults.UOSrx=o->value(); progdefaults.changed = true; } Fl_Value_Input *rtty_rx_shape=(Fl_Value_Input *)0; static void cb_rtty_rx_shape(Fl_Value_Input* o, void*) { progdefaults.rtty_filter = o->value(); progStatus.rtty_filter_changed = true; progdefaults.changed = true; } static void cb_btnRxTones(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[1]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 0; }; } static void cb_btnRxTones1(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[0]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 1; }; } Fl_Check_Button *btnRxTones[3]={(Fl_Check_Button *)0}; static void cb_btnRxTones2(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[1]->value(0); btnRxTones[0]->value(0); progdefaults.rtty_cwi = 2; }; } Fl_Check_Button *btnPreferXhairScope=(Fl_Check_Button *)0; static void cb_btnPreferXhairScope(Fl_Check_Button* o, void*) { progdefaults.PreferXhairScope=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_true_scope=(Fl_Check_Button *)0; static void cb_chk_true_scope(Fl_Check_Button* o, void*) { progdefaults.true_scope=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_useMARKfreq=(Fl_Check_Button *)0; static void cb_chk_useMARKfreq(Fl_Check_Button* o, void*) { progdefaults.useMARKfreq=o->value(); progdefaults.changed = true; } Fl_Button *btnRTTY_mark_color=(Fl_Button *)0; static void cb_btnRTTY_mark_color(Fl_Button* o, void*) { if (fl_color_chooser("MARK freq track", progdefaults.rttymarkRGBI.R, progdefaults.rttymarkRGBI.G, progdefaults.rttymarkRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Group *tab_SndCrd_FSK=(Fl_Group *)0; Fl_ListBox *selShift=(Fl_ListBox *)0; static void cb_selShift(Fl_ListBox* o, void*) { progdefaults.rtty_shift = o->index(); sel_xcvr_FSK_shift->index(progdefaults.rtty_shift); if (progdefaults.rtty_shift == o->lsize() - 1) selCustomShift->activate(); else selCustomShift->deactivate(); selCustomShift->redraw(); resetRTTY(); progdefaults.changed = true; } Fl_Counter2 *selCustomShift=(Fl_Counter2 *)0; static void cb_selCustomShift(Fl_Counter2* o, void*) { progdefaults.rtty_custom_shift = o->value(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selBaud=(Fl_ListBox *)0; static void cb_selBaud(Fl_ListBox* o, void*) { progdefaults.rtty_baud = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selBits=(Fl_ListBox *)0; static void cb_selBits(Fl_ListBox* o, void*) { progdefaults.rtty_bits = o->index(); selParity->do_callback(); } Fl_ListBox *selParity=(Fl_ListBox *)0; static void cb_selParity(Fl_ListBox* o, void*) { if (progdefaults.rtty_bits == 0) { progdefaults.rtty_parity = rtty::RTTY_PARITY_NONE; o->index(progdefaults.rtty_parity); } else progdefaults.rtty_parity = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selStopBits=(Fl_ListBox *)0; static void cb_selStopBits(Fl_ListBox* o, void*) { progdefaults.rtty_stop = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_Check_Button *btnAUTOCRLF=(Fl_Check_Button *)0; static void cb_btnAUTOCRLF(Fl_Check_Button* o, void*) { progdefaults.rtty_autocrlf = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntrAUTOCRLF=(Fl_Counter2 *)0; static void cb_cntrAUTOCRLF(Fl_Counter2* o, void*) { progdefaults.rtty_autocount = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCRCRLF=(Fl_Check_Button *)0; static void cb_btnCRCRLF(Fl_Check_Button* o, void*) { progdefaults.rtty_crcrlf = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkUOStx=(Fl_Check_Button *)0; static void cb_chkUOStx(Fl_Check_Button* o, void*) { progdefaults.UOStx=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_shaped_rtty=(Fl_Check_Button *)0; static void cb_chk_shaped_rtty(Fl_Check_Button* o, void*) { progStatus.shaped_rtty = o->value(); } Fl_Check_Button *chkPseudoFSK=(Fl_Check_Button *)0; static void cb_chkPseudoFSK(Fl_Check_Button* o, void*) { progdefaults.PseudoFSK = o->value(); chkPseudoFSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }; } Fl_Counter *cntr_xcvr_FSK_MARK=(Fl_Counter *)0; static void cb_cntr_xcvr_FSK_MARK(Fl_Counter* o, void*) { progdefaults.xcvr_FSK_MARK = o->value(); } Fl_ListBox *sel_xcvr_FSK_shift=(Fl_ListBox *)0; static void cb_sel_xcvr_FSK_shift(Fl_ListBox* o, void*) { progdefaults.rtty_shift = o->index(); selShift->index(progdefaults.rtty_shift); resetRTTY(); progdefaults.changed = true; } Fl_Counter *cnt_TTY_LTRS=(Fl_Counter *)0; static void cb_cnt_TTY_LTRS(Fl_Counter* o, void*) { progdefaults.TTY_LTRS = (int)o->value(); progdefaults.changed = true; } Fl_Group *tab_nanoIO=(Fl_Group *)0; Fl_ComboBox *select_nanoIO_CommPort=(Fl_ComboBox *)0; static void cb_select_nanoIO_CommPort(Fl_ComboBox* o, void*) { progdefaults.nanoIO_serial_port_name = o->value(); } Fl_Light_Button *btn_nanoIO_connect=(Fl_Light_Button *)0; static void cb_btn_nanoIO_connect(Fl_Light_Button* o, void*) { if (o->value()) { btn_nanoCW_connect->value(0); if (!open_nanoIO()) o->value(0); } else { close_nanoIO(); }; } Fl_ListBox *sel_nanoIO_baud=(Fl_ListBox *)0; static void cb_sel_nanoIO_baud(Fl_ListBox* o, void*) { progdefaults.nanoIO_baud = o->index(); nano_set_baud(progdefaults.nanoIO_baud); progdefaults.changed = true; } Fl_Check_Button *chk_nanoIO_polarity=(Fl_Check_Button *)0; static void cb_chk_nanoIO_polarity(Fl_Check_Button* o, void*) { progdefaults.nanoIO_polarity=o->value(); nano_mark_polarity(progdefaults.nanoIO_polarity); progdefaults.changed = true; } FTextView *txt_nano_io=(FTextView *)0; Fl_Group *tab_Nav=(Fl_Group *)0; Fl_ComboBox *select_USN_FSK_port=(Fl_ComboBox *)0; static void cb_select_USN_FSK_port(Fl_ComboBox* o, void*) { progdefaults.Nav_FSK_port = o->value(); } Fl_Light_Button *btn_Nav_connect=(Fl_Light_Button *)0; static void cb_btn_Nav_connect(Fl_Light_Button* o, void*) { if (o->value()) { if (!open_NavFSK()) o->value(0); } else { close_NavFSK(); }; } Fl_ComboBox *select_Nav_config_port=(Fl_ComboBox *)0; static void cb_select_Nav_config_port(Fl_ComboBox* o, void*) { progdefaults.Nav_config_port = o->value(); } Fl_ListBox *sel_Nav_ch1=(Fl_ListBox *)0; static void cb_sel_Nav_ch1(Fl_ListBox* o, void*) { progdefaults.Nav_channel_1_att = o->index(); Nav_set_channel_1_att(progdefaults.Nav_channel_1_att); progdefaults.changed = true; } Fl_ListBox *sel_Nav_ch2=(Fl_ListBox *)0; static void cb_sel_Nav_ch2(Fl_ListBox* o, void*) { progdefaults.Nav_channel_2_att = o->index(); Nav_set_channel_2_att(progdefaults.Nav_channel_2_att); progdefaults.changed = true; } Fl_ListBox *sel_Nav_rf_att=(Fl_ListBox *)0; static void cb_sel_Nav_rf_att(Fl_ListBox* o, void*) { progdefaults.Nav_rf_att = o->index(); Nav_set_rf_att(progdefaults.Nav_rf_att); progdefaults.changed = true; } Fl_ListBox *sel_Nav_wk_ptt=(Fl_ListBox *)0; static void cb_sel_Nav_wk_ptt(Fl_ListBox* o, void*) { progdefaults.Nav_wk_ptt = o->index(); Nav_set_wk_ptt(progdefaults.Nav_wk_ptt); progdefaults.changed = true; } Fl_ListBox *sel_Nav_LED=(Fl_ListBox *)0; static void cb_sel_Nav_LED(Fl_ListBox* o, void*) { progdefaults.Nav_led = o->index(); Nav_set_led(progdefaults.Nav_led); progdefaults.changed = true; } Fl_ListBox *sel_Nav_CAT_LED=(Fl_ListBox *)0; static void cb_sel_Nav_CAT_LED(Fl_ListBox* o, void*) { progdefaults.Nav_cat_led = o->index(); Nav_set_cat_led(progdefaults.Nav_cat_led); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_baud=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_baud(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_baud = o->index(); Nav_set_baud(progdefaults.Nav_FSK_baud); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_stopbits=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_stopbits(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_stopbits = o->index(); Nav_set_stopbits(progdefaults.Nav_FSK_stopbits); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_polarity=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_polarity(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_polarity = o->index(); Nav_set_polarity(progdefaults.Nav_FSK_polarity); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_sidetone=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_sidetone(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_sidetone = o->index(); Nav_set_sidetone(progdefaults.Nav_FSK_sidetone); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_ptt=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_ptt(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_ptt = o->index(); Nav_set_ptt(progdefaults.Nav_FSK_ptt); progdefaults.changed = true; } Fl_Light_Button *btn_Nav_config=(Fl_Light_Button *)0; static void cb_btn_Nav_config(Fl_Light_Button* o, void*) { if (o->value()) { if (!open_NavConfig()) o->value(0); } else { close_NavConfig(); }; } Fl_Group *tab_Synop=(Fl_Group *)0; Fl_Check_Button *btnSynopAdifDecoding=(Fl_Check_Button *)0; static void cb_btnSynopAdifDecoding(Fl_Check_Button* o, void*) { progdefaults.SynopAdifDecoding=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnSynopKmlDecoding=(Fl_Check_Button *)0; static void cb_btnSynopKmlDecoding(Fl_Check_Button* o, void*) { progdefaults.SynopKmlDecoding=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnSynopInterleaved=(Fl_Check_Button *)0; static void cb_btnSynopInterleaved(Fl_Check_Button* o, void*) { progdefaults.SynopInterleaved=o->value(); progdefaults.changed = true; } Fl_Group *tab_WKFSK=(Fl_Group *)0; Fl_ComboBox *select_WKFSK_CommPort=(Fl_ComboBox *)0; static void cb_select_WKFSK_CommPort(Fl_ComboBox* o, void*) { progStatus.WK_serial_port_name = o->value(); select_WK_CommPort->value(progStatus.WK_serial_port_name.c_str()); } Fl_Light_Button *btn_WKFSK_connect=(Fl_Light_Button *)0; static void cb_btn_WKFSK_connect(Fl_Light_Button* o, void*) { WKFSK_connect(o->value()); } Fl_ListBox *sel_WKFSK_baud=(Fl_ListBox *)0; static void cb_sel_WKFSK_baud(Fl_ListBox* o, void*) { progStatus.WKFSK_baud = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_stopbits=(Fl_ListBox *)0; static void cb_sel_WKFSK_stopbits(Fl_ListBox* o, void*) { progStatus.WKFSK_stopbits = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_ptt=(Fl_ListBox *)0; static void cb_sel_WKFSK_ptt(Fl_ListBox* o, void*) { progStatus.WKFSK_ptt = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_polarity=(Fl_ListBox *)0; static void cb_sel_WKFSK_polarity(Fl_ListBox* o, void*) { progStatus.WKFSK_polarity = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_sidetone=(Fl_ListBox *)0; static void cb_sel_WKFSK_sidetone(Fl_ListBox* o, void*) { progStatus.WKFSK_sidetone = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_auto_crlf=(Fl_ListBox *)0; static void cb_sel_WKFSK_auto_crlf(Fl_ListBox* o, void*) { progStatus.WKFSK_auto_crlf = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_diddle=(Fl_ListBox *)0; static void cb_sel_WKFSK_diddle(Fl_ListBox* o, void*) { progStatus.WKFSK_diddle = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_diddle_char=(Fl_ListBox *)0; static void cb_sel_WKFSK_diddle_char(Fl_ListBox* o, void*) { progStatus.WKFSK_diddle_char = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_usos=(Fl_ListBox *)0; static void cb_sel_WKFSK_usos(Fl_ListBox* o, void*) { progStatus.WKFSK_usos = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_monitor=(Fl_ListBox *)0; static void cb_sel_WKFSK_monitor(Fl_ListBox* o, void*) { progStatus.WKFSK_monitor = o->index(); WKFSK_init(); } Fl_Group *tabTHOR=(Fl_Group *)0; Fl_Input2 *txtTHORSecondary=(Fl_Input2 *)0; static void cb_txtTHORSecondary(Fl_Input2* o, void*) { progdefaults.THORsecText = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_FILTER=(Fl_Check_Button *)0; static void cb_valTHOR_FILTER(Fl_Check_Button* o, void*) { progdefaults.THOR_FILTER = o->value(); resetTHOR(); progdefaults.changed = true; } Fl_Counter2 *valTHOR_BW=(Fl_Counter2 *)0; static void cb_valTHOR_BW(Fl_Counter2* o, void*) { progdefaults.THOR_BW = o->value(); resetTHOR(); progdefaults.changed = true; } Fl_Value_Slider2 *valThorCWI=(Fl_Value_Slider2 *)0; static void cb_valThorCWI(Fl_Value_Slider2* o, void*) { progdefaults.ThorCWI = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_PREAMBLE=(Fl_Check_Button *)0; static void cb_valTHOR_PREAMBLE(Fl_Check_Button* o, void*) { progdefaults.THOR_PREAMBLE = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_SOFTSYMBOLS=(Fl_Check_Button *)0; static void cb_valTHOR_SOFTSYMBOLS(Fl_Check_Button* o, void*) { progdefaults.THOR_SOFTSYMBOLS = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_SOFTBITS=(Fl_Check_Button *)0; static void cb_valTHOR_SOFTBITS(Fl_Check_Button* o, void*) { progdefaults.THOR_SOFTBITS = o->value(); progdefaults.changed = true; } Fl_Counter2 *valTHOR_PATHS=(Fl_Counter2 *)0; static void cb_valTHOR_PATHS(Fl_Counter2* o, void*) { progdefaults.THOR_PATHS = (int)o->value(); progdefaults.changed = true; } Fl_Group *tabOther=(Fl_Group *)0; Fl_Tabs *tabsOther=(Fl_Tabs *)0; Fl_Group *tabNavtex=(Fl_Group *)0; Fl_Check_Button *btnNvtxAdifLog=(Fl_Check_Button *)0; static void cb_btnNvtxAdifLog(Fl_Check_Button* o, void*) { progdefaults.NVTX_AdifLog=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnNvtxKmlLog=(Fl_Check_Button *)0; static void cb_btnNvtxKmlLog(Fl_Check_Button* o, void*) { progdefaults.NVTX_KmlLog=o->value(); progdefaults.changed = true; } Fl_Group *tabWefax=(Fl_Group *)0; Fl_Check_Button *btnWefaxAdifLog=(Fl_Check_Button *)0; static void cb_btnWefaxAdifLog(Fl_Check_Button* o, void*) { progdefaults.WEFAX_AdifLog=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWefaxEmbeddedGui=(Fl_Check_Button *)0; static void cb_btnWefaxEmbeddedGui(Fl_Check_Button* o, void*) { progdefaults.WEFAX_EmbeddedGui=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *btnWefaxShift=(Fl_Value_Input2 *)0; static void cb_btnWefaxShift(Fl_Value_Input2* o, void*) { if( o->value() > 900 ) { o->value(900); return; } if( o->value() < 750 ) { o->value(750); return; } progdefaults.WEFAX_Shift=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *btnWefaxMaxRows=(Fl_Value_Input2 *)0; static void cb_btnWefaxMaxRows(Fl_Value_Input2* o, void*) { if(o->value() > 10000 ) { o->value(10000); return ; } if(o->value() < 1000 ) { o->value(1000); return ; } progdefaults.WEFAX_MaxRows=o->value(); progdefaults.changed = true; } Fl_Input *btnWefaxSaveDir=(Fl_Input *)0; static void cb_btnWefaxSaveDir(Fl_Input* o, void*) { progdefaults.wefax_save_dir=o->value(); progdefaults.changed = true; } Fl_Button *btnSelectFaxDestDir=(Fl_Button *)0; static void cb_btnSelectFaxDestDir(Fl_Button*, void*) { Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(WefaxDestDirSet); fc->show(); } Fl_Check_Button *btnWefaxHideTx=(Fl_Check_Button *)0; static void cb_btnWefaxHideTx(Fl_Check_Button* o, void*) { progdefaults.WEFAX_HideTx=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWefaxSaveMonochrome=(Fl_Check_Button *)0; static void cb_btnWefaxSaveMonochrome(Fl_Check_Button* o, void*) { progdefaults.WEFAX_SaveMonochrome=o->value(); progdefaults.changed = true; } Fl_Group *tabRig=(Fl_Group *)0; Fl_Tabs *tabsRig=(Fl_Tabs *)0; Fl_Group *tabFLRIG=(Fl_Group *)0; Fl_Check_Button *chk_flrig_keys_modem=(Fl_Check_Button *)0; static void cb_chk_flrig_keys_modem(Fl_Check_Button* o, void*) { progdefaults.flrig_keys_modem = o->value(); progdefaults.changed = true; } Fl_Button *btnDefault_flrig_ip_mirror=(Fl_Button *)0; static void cb_btnDefault_flrig_ip_mirror(Fl_Button*, void*) { set_ip_to_default(FLRIG_IO); txt_flrig_ip_address_mirror->value(progdefaults.flrig_ip_address.c_str()); txt_flrig_ip_port_mirror->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_address_mirror=(Fl_Input2 *)0; static void cb_txt_flrig_ip_address_mirror(Fl_Input2* o, void*) { progdefaults.flrig_ip_address = o->value(); txt_flrig_ip_address->value(progdefaults.flrig_ip_address.c_str()); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_port_mirror=(Fl_Input2 *)0; static void cb_txt_flrig_ip_port_mirror(Fl_Input2* o, void*) { progdefaults.flrig_ip_port = o->value(); txt_flrig_ip_port->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true; } Fl_Button *btn_reconnect_flrig_server_mirror=(Fl_Button *)0; static void cb_btn_reconnect_flrig_server_mirror(Fl_Button*, void*) { reconnect_to_flrig(); } Fl_Check_Button *btn_fldigi_client_to_fldigi=(Fl_Check_Button *)0; static void cb_btn_fldigi_client_to_fldigi(Fl_Check_Button* o, void*) { progdefaults.fldigi_client_to_flrig=o->value(); if (o->value()) { progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = false; chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); } progdefaults.changed=true; } Fl_Check_Button *chkUSERIGCAT=(Fl_Check_Button *)0; static void cb_chkUSERIGCAT(Fl_Check_Button* o, void*) { if (o->value() == 1) { chkUSEHAMLIB->value(0); btn_fldigi_client_to_fldigi->value(0); progdefaults.chkUSERIGCATis = true; progdefaults.fldigi_client_to_flrig = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } else { progdefaults.chkUSERIGCATis = false; progdefaults.initInterface(); } progdefaults.changed=true; } Fl_Group *grpRigCAT=(Fl_Group *)0; Fl_Output *txtXmlRigFilename=(Fl_Output *)0; Fl_Button *btnSelectRigXmlFile=(Fl_Button *)0; static void cb_btnSelectRigXmlFile(Fl_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); selectRigXmlFilename(); } Fl_ComboBox *inpXmlRigDevice=(Fl_ComboBox *)0; static void cb_inpXmlRigDevice(Fl_ComboBox*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatRetries=(Fl_Value_Input2 *)0; static void cb_cntRigCatRetries(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatTimeout=(Fl_Value_Input2 *)0; static void cb_cntRigCatTimeout(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatWait=(Fl_Value_Input2 *)0; static void cb_cntRigCatWait(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_ListBox *listbox_xml_rig_baudrate=(Fl_ListBox *)0; static void cb_listbox_xml_rig_baudrate(Fl_ListBox*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Counter2 *valRigCatStopbits=(Fl_Counter2 *)0; static void cb_valRigCatStopbits(Fl_Counter2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } Fl_Button *btnInitRIGCAT=(Fl_Button *)0; static void cb_btnInitRIGCAT(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Check_Button *btnRigCatEcho=(Fl_Check_Button *)0; static void cb_btnRigCatEcho(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); progdefaults.changed = true; } Fl_Round_Button *btnRigCatCMDptt=(Fl_Round_Button *)0; static void cb_btnRigCatCMDptt(Fl_Round_Button* o, void*) { if (o->value()== 1) { btnRigCatRTSptt->value(0); btnRigCatDTRptt->value(0); progdefaults.RigCatCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatCMDptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } Fl_Round_Button *btnRigCatRTSptt=(Fl_Round_Button *)0; static void cb_btnRigCatRTSptt(Fl_Round_Button* o, void*) { if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatRTSptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatRTSptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Round_Button *btnRigCatDTRptt=(Fl_Round_Button *)0; static void cb_btnRigCatDTRptt(Fl_Round_Button* o, void*) { if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatDTRptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatDTRptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *btnRigCatRTSplus=(Fl_Check_Button *)0; static void cb_btnRigCatRTSplus(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *btnRigCatDTRplus=(Fl_Check_Button *)0; static void cb_btnRigCatDTRplus(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *chkRigCatRTSCTSflow=(Fl_Check_Button *)0; static void cb_chkRigCatRTSCTSflow(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *chk_restore_tio=(Fl_Check_Button *)0; static void cb_chk_restore_tio(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *chkRigCatVSP=(Fl_Check_Button *)0; static void cb_chkRigCatVSP(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatInitDelay=(Fl_Value_Input2 *)0; static void cb_cntRigCatInitDelay(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Group *tabHamlib=(Fl_Group *)0; Fl_Check_Button *chkUSEHAMLIB=(Fl_Check_Button *)0; static void cb_chkUSEHAMLIB(Fl_Check_Button* o, void*) { progdefaults.chkUSEHAMLIBis = o->value(); if (o->value() == 1) { chkUSERIGCAT->value(0); btn_fldigi_client_to_fldigi->value(0); progdefaults.chkUSERIGCATis = false; progdefaults.fldigi_client_to_flrig = false; btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->activate(); btnInitHAMLIB->redraw(); } else { progdefaults.initInterface(); } progdefaults.changed = true; } Fl_Group *grpHamlib=(Fl_Group *)0; Fl_ListBox *cboHamlibRig=(Fl_ListBox *)0; static void cb_cboHamlibRig(Fl_ListBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); #if USE_HAMLIB hamlib_get_defaults(); #endif } Fl_ComboBox *inpRIGdev=(Fl_ComboBox *)0; static void cb_inpRIGdev(Fl_ComboBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibRetries=(Fl_Value_Input2 *)0; static void cb_cntHamlibRetries(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibTimeout=(Fl_Value_Input2 *)0; static void cb_cntHamlibTimeout(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibWriteDelay=(Fl_Value_Input2 *)0; static void cb_cntHamlibWriteDelay(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibWait=(Fl_Value_Input2 *)0; static void cb_cntHamlibWait(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_ListBox *listbox_baudrate=(Fl_ListBox *)0; static void cb_listbox_baudrate(Fl_ListBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Counter2 *valHamRigStopbits=(Fl_Counter2 *)0; static void cb_valHamRigStopbits(Fl_Counter2* o, void*) { progdefaults.HamRigStopbits = (int)o->value(); progdefaults.changed = true; } Fl_Counter2 *valHamRigPollrate=(Fl_Counter2 *)0; static void cb_valHamRigPollrate(Fl_Counter2* o, void*) { progdefaults.HamRigPollrate = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnHamlibCMDptt=(Fl_Check_Button *)0; static void cb_btnHamlibCMDptt(Fl_Check_Button* o, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); if (o->value()) { progdefaults.HamlibCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = false; } else progdefaults.HamlibCMDptt = false; progdefaults.changed = true; } Fl_Check_Button *btnHamlibPTT_ON_DATA=(Fl_Check_Button *)0; static void cb_btnHamlibPTT_ON_DATA(Fl_Check_Button* o, void*) { progdefaults.hamlib_ptt_on_data = o->value(); } Fl_Check_Button *btnHamlibDTRplus=(Fl_Check_Button *)0; static void cb_btnHamlibDTRplus(Fl_Check_Button*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chkHamlibRTSplus=(Fl_Check_Button *)0; static void cb_chkHamlibRTSplus(Fl_Check_Button* o, void*) { if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chkHamlibRTSCTSflow=(Fl_Check_Button *)0; static void cb_chkHamlibRTSCTSflow(Fl_Check_Button* o, void*) { if (o->value() == 1) { chkHamlibXONXOFFflow->value(0); chkHamlibRTSplus->deactivate(); } else chkHamlibRTSplus->activate(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chkHamlibXONXOFFflow=(Fl_Check_Button *)0; static void cb_chkHamlibXONXOFFflow(Fl_Check_Button* o, void*) { if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chk_hamlib_cw_is_lsb=(Fl_Check_Button *)0; static void cb_chk_hamlib_cw_is_lsb(Fl_Check_Button* o, void*) { progdefaults.hamlib_cw_islsb = o->value(); } Fl_Check_Button *chk_hamlib_rtty_is_usb=(Fl_Check_Button *)0; static void cb_chk_hamlib_rtty_is_usb(Fl_Check_Button* o, void*) { progdefaults.hamlib_rtty_isusb = o->value(); } Fl_Counter2 *val_hamlib_mode_delay=(Fl_Counter2 *)0; static void cb_val_hamlib_mode_delay(Fl_Counter2* o, void*) { progdefaults.hamlib_mode_delay = (int)o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_sideband=(Fl_ListBox *)0; Fl_Input2 *inpHamlibConfig=(Fl_Input2 *)0; static void cb_inpHamlibConfig(Fl_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Button *btnInitHAMLIB=(Fl_Button *)0; static void cb_btnInitHAMLIB(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0; static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) { progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel2->value(o->value()); if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); } progdefaults.changed = true; } Fl_Group *grpHWPTT=(Fl_Group *)0; Fl_Round_Button *btnTTYptt=(Fl_Round_Button *)0; static void cb_btnTTYptt(Fl_Round_Button* o, void*) { btnUsePPortPTT->value(false); btnUseUHrouterPTT->value(false); if (o->value()) { progdefaults.TTYptt = true; progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.TTYptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_ComboBox *inpTTYdev=(Fl_ComboBox *)0; static void cb_inpTTYdev(Fl_ComboBox*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnSCU_17=(Fl_Round_Button *)0; static void cb_btnSCU_17(Fl_Round_Button* o, void*) { progdefaults.SCU_17=o->value(); progdefaults.changed = true; } Fl_Round_Button *btnUsePPortPTT=(Fl_Round_Button *)0; static void cb_btnUsePPortPTT(Fl_Round_Button* o, void*) { btnTTYptt->value(0); btnUseUHrouterPTT->value(0); if (o->value()) { progdefaults.UsePPortPTT = true; progdefaults.TTYptt = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UsePPortPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnUseUHrouterPTT=(Fl_Round_Button *)0; static void cb_btnUseUHrouterPTT(Fl_Round_Button* o, void*) { btnTTYptt->value(0); btnUsePPortPTT->value(0); if (o->value()) { progdefaults.UseUHrouterPTT = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnRTSptt=(Fl_Round_Button *)0; static void cb_btnRTSptt(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnRTSplusV=(Fl_Round_Button *)0; static void cb_btnRTSplusV(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnDTRptt=(Fl_Round_Button *)0; static void cb_btnDTRptt(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnDTRplusV=(Fl_Round_Button *)0; static void cb_btnDTRplusV(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Button *btnInitHWPTT=(Fl_Button *)0; static void cb_btnInitHWPTT(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Group *grpPTTdelays=(Fl_Group *)0; Fl_Counter *cntPTT_on_delay=(Fl_Counter *)0; static void cb_cntPTT_on_delay(Fl_Counter* o, void*) { progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true; } Fl_Counter *cntPTT_off_delay=(Fl_Counter *)0; static void cb_cntPTT_off_delay(Fl_Counter* o, void*) { progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true; } static void cb_btn_enable_gpio(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= 1; export_gpio(0); } else { progdefaults.enable_gpio &= ~1; unexport_gpio(0); } progdefaults.changed = true; } static void cb_btn_enable_gpio1(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<1); export_gpio(1); } else { progdefaults.enable_gpio &= ~(1<<1); unexport_gpio(1); } progdefaults.changed = true; } static void cb_btn_enable_gpio2(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<2); export_gpio(2); } else { progdefaults.enable_gpio &= ~(1<<2); unexport_gpio(2); } progdefaults.changed = true; } static void cb_btn_enable_gpio3(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<3); export_gpio(3); } else { progdefaults.enable_gpio &= ~(1<<3); unexport_gpio(3); } progdefaults.changed = true; } static void cb_btn_enable_gpio4(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<4); export_gpio(4); } else { progdefaults.enable_gpio &= ~(1<<4); unexport_gpio(4); } progdefaults.changed = true; } static void cb_btn_enable_gpio5(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<5); export_gpio(5); } else { progdefaults.enable_gpio &= ~(1<<5); unexport_gpio(5); } progdefaults.changed = true; } static void cb_btn_enable_gpio6(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<6); export_gpio(6); } else { progdefaults.enable_gpio &= ~(1<<6); unexport_gpio(6); } progdefaults.changed = true; } static void cb_btn_enable_gpio7(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<7); export_gpio(7); } else { progdefaults.enable_gpio &= ~(1<<7); unexport_gpio(7); } progdefaults.changed = true; } static void cb_btn_enable_gpio8(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<8); export_gpio(8); } else { progdefaults.enable_gpio &= ~(1<<8); unexport_gpio(8); } progdefaults.changed = true; } static void cb_btn_enable_gpio9(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<9); export_gpio(9); } else { progdefaults.enable_gpio &= ~(1<<9); unexport_gpio(9); } progdefaults.changed = true; } static void cb_btn_enable_gpioa(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<10); export_gpio(10); } else { progdefaults.enable_gpio &= ~(1<<10); unexport_gpio(10); } progdefaults.changed = true; } static void cb_btn_enable_gpiob(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<11); export_gpio(11); } else { progdefaults.enable_gpio &= ~(1<<11); unexport_gpio(11); } progdefaults.changed = true; } static void cb_btn_enable_gpioc(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<12); export_gpio(12); } else { progdefaults.enable_gpio &= ~(1<<12); unexport_gpio(12); } progdefaults.changed = true; } static void cb_btn_enable_gpiod(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<13); export_gpio(13); } else { progdefaults.enable_gpio &= ~(1<<13); unexport_gpio(13); } progdefaults.changed = true; } static void cb_btn_enable_gpioe(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<14); export_gpio(14); } else { progdefaults.enable_gpio &= ~(1<<14); unexport_gpio(14); } progdefaults.changed = true; } static void cb_btn_enable_gpiof(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<15); export_gpio(15); } else { progdefaults.enable_gpio &= ~(1<<15); unexport_gpio(15); } progdefaults.changed = true; } Fl_Check_Button *btn_enable_gpio[17]={(Fl_Check_Button *)0}; static void cb_btn_enable_gpio10(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<16); export_gpio(16); } else { progdefaults.enable_gpio &= ~(1<<16); unexport_gpio(16); } progdefaults.changed = true; } static void cb_btn_gpio_on(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= 1; } else { progdefaults.gpio_on &= ~1; } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on1(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<1); } else { progdefaults.gpio_on &= ~(1<<1); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on2(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<2); } else { progdefaults.gpio_on &= ~(1<<2); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on3(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<3); } else { progdefaults.gpio_on &= ~(1<<3); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on4(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<4); } else { progdefaults.gpio_on &= ~(1<<4); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on5(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<5); } else { progdefaults.gpio_on &= ~(1<<5); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on6(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<6); } else { progdefaults.gpio_on &= ~(1<<6); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on7(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<7); } else { progdefaults.gpio_on &= ~(1<<7); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on8(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<8); } else { progdefaults.gpio_on &= ~(1<<8); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on9(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<9); } else { progdefaults.gpio_on &= ~(1<<9); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_ona(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<10); } else { progdefaults.gpio_on &= ~(1<<10); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_onb(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<11); } else { progdefaults.gpio_on &= ~(1<<11); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_onc(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<12); } else { progdefaults.gpio_on &= ~(1<<12); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_ond(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<13); } else { progdefaults.gpio_on &= ~(1<<13); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_one(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<14); } else { progdefaults.gpio_on &= ~(1<<14); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_onf(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<15); } else { progdefaults.gpio_on &= ~(1<<15); } wf->xmtrcv->value(0); progdefaults.changed = true; } Fl_Check_Button *btn_gpio_on[17]={(Fl_Check_Button *)0}; static void cb_btn_gpio_on10(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<16); } else { progdefaults.gpio_on &= ~(1<<16); } wf->xmtrcv->value(0); progdefaults.changed = true; } Fl_Counter *cnt_gpio_pulse_width=(Fl_Counter *)0; static void cb_cnt_gpio_pulse_width(Fl_Counter* o, void*) { progdefaults.gpio_pulse_width=(int)o->value(); progdefaults.changed=true; } Fl_Group *tabSoundCard=(Fl_Group *)0; Fl_Tabs *tabsSoundCard=(Fl_Tabs *)0; Fl_Group *tabAudio=(Fl_Group *)0; Fl_Group *AudioOSS=(Fl_Group *)0; static void cb_btnAudioIO(Fl_Round_Button*, void*) { sound_update(SND_IDX_OSS); progdefaults.changed = true; resetSoundCard(); } Fl_Input_Choice *menuOSSDev=(Fl_Input_Choice *)0; static void cb_menuOSSDev(Fl_Input_Choice* o, void*) { scDevice[0] = scDevice[1] = progdefaults.OSSdevice = o->value(); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioPort=(Fl_Group *)0; static void cb_btnAudioIO1(Fl_Round_Button*, void*) { sound_update(SND_IDX_PORT); progdefaults.changed = true; resetSoundCard(); } Fl_Choice *menuPortInDev=(Fl_Choice *)0; static void cb_menuPortInDev(Fl_Choice* o, void*) { scDevice[0] = progdefaults.PortInDevice = o->text(); progdefaults.PortInIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true; } Fl_Choice *menuPortOutDev=(Fl_Choice *)0; static void cb_menuPortOutDev(Fl_Choice* o, void*) { scDevice[1] = progdefaults.PortOutDevice = o->text(); progdefaults.PortOutIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioPulse=(Fl_Group *)0; static void cb_btnAudioIO2(Fl_Round_Button*, void*) { sound_update(SND_IDX_PULSE); progdefaults.changed = true; resetSoundCard(); } Fl_Input2 *inpPulseServer=(Fl_Input2 *)0; static void cb_inpPulseServer(Fl_Input2* o, void*) { scDevice[0] = scDevice[1] = progdefaults.PulseServer = o->value(); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioNull=(Fl_Group *)0; Fl_Round_Button *btnAudioIO[4]={(Fl_Round_Button *)0}; static void cb_btnAudioIO3(Fl_Round_Button*, void*) { sound_update(SND_IDX_NULL); progdefaults.changed = true; resetSoundCard(); } Fl_Group *AudioDuplex=(Fl_Group *)0; Fl_Round_Button *btn_is_full_duplex=(Fl_Round_Button *)0; static void cb_btn_is_full_duplex(Fl_Round_Button* o, void*) { progdefaults.is_full_duplex = o->value(); progdefaults.changed = true; resetSoundCard(); } Fl_Group *tabAudioOpt=(Fl_Group *)0; Fl_Group *grpAudioSampleRate=(Fl_Group *)0; Fl_ListBox *menuInSampleRate=(Fl_ListBox *)0; static void cb_menuInSampleRate(Fl_ListBox* o, void*) { progdefaults.in_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true; } Fl_ListBox *menuOutSampleRate=(Fl_ListBox *)0; static void cb_menuOutSampleRate(Fl_ListBox* o, void*) { progdefaults.out_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true; } Fl_ListBox *menuSampleConverter=(Fl_ListBox *)0; static void cb_menuSampleConverter(Fl_ListBox* o, void*) { if ((o->index()) == FLDIGI_SRC_BEST) fl_alert2("The best quality SINC interpolator has very high CPU overhead"); progdefaults.sample_converter = sample_rate_converters[o->index()]; resetSoundCard(); progdefaults.changed = true; o->tooltip(src_get_description(progdefaults.sample_converter)); } Fl_Spinner2 *cntRxRateCorr=(Fl_Spinner2 *)0; static void cb_cntRxRateCorr(Fl_Spinner2* o, void*) { progdefaults.RX_corr = (int)o->value(); progdefaults.changed = true; } Fl_Spinner2 *cntTxRateCorr=(Fl_Spinner2 *)0; static void cb_cntTxRateCorr(Fl_Spinner2* o, void*) { progdefaults.TX_corr = (int)o->value(); progdefaults.changed = true; } Fl_Spinner2 *cntTxOffset=(Fl_Spinner2 *)0; static void cb_cntTxOffset(Fl_Spinner2* o, void*) { progdefaults.TxOffset = (int)o->value(); progdefaults.changed = true; } Fl_Group *tabAudioRightChannel=(Fl_Group *)0; Fl_Check_Button *chkAudioStereoOut=(Fl_Check_Button *)0; static void cb_chkAudioStereoOut(Fl_Check_Button* o, void*) { progdefaults.sig_on_right_channel = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }; } Fl_Check_Button *chkReverseAudio=(Fl_Check_Button *)0; static void cb_chkReverseAudio(Fl_Check_Button* o, void*) { progdefaults.ReverseAudio = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnPTTrightchannel2=(Fl_Check_Button *)0; static void cb_btnPTTrightchannel2(Fl_Check_Button* o, void*) { progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); }; } Fl_Check_Button *btnQSK2=(Fl_Check_Button *)0; static void cb_btnQSK2(Fl_Check_Button* o, void*) { progdefaults.QSK = o->value(); btnQSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }; } Fl_Check_Button *chkPseudoFSK2=(Fl_Check_Button *)0; static void cb_chkPseudoFSK2(Fl_Check_Button* o, void*) { progdefaults.PseudoFSK = o->value(); chkPseudoFSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }; } Fl_Check_Button *chkReverseRxAudio=(Fl_Check_Button *)0; static void cb_chkReverseRxAudio(Fl_Check_Button* o, void*) { progdefaults.ReverseRxAudio = o->value(); progdefaults.changed = true; } Fl_Group *tabWavFile=(Fl_Group *)0; Fl_ListBox *listbox_wav_samplerate=(Fl_ListBox *)0; static void cb_listbox_wav_samplerate(Fl_ListBox* o, void*) { progdefaults.wavSampleRate = o->index(); progdefaults.changed = true; } Fl_Check_Button *btn_record_both=(Fl_Check_Button *)0; static void cb_btn_record_both(Fl_Check_Button* o, void*) { progdefaults.record_both_channels=o->value(); progdefaults.changed=true; } Fl_Group *tabAlerts=(Fl_Group *)0; Fl_File_Input *inp_wav_fname_regex=(Fl_File_Input *)0; Fl_Button *btn_select_regex_wav=(Fl_Button *)0; static void cb_btn_select_regex_wav(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.wav\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_REGEX_MATCH = fnfc.filename(); inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); progdefaults.REGEX_ALERT_MENU = 0; mnu_regex_alert_menu->value(progdefaults.REGEX_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_regex_alert_menu=(Fl_Choice *)0; static void cb_mnu_regex_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_REGEX_MATCH = "bark"; break; case 2 : progdefaults.BWSR_REGEX_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_REGEX_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_REGEX_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_REGEX_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_REGEX_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_REGEX_MATCH = "phone"; break; case 8 : progdefaults.BWSR_REGEX_MATCH = "dinner_bell"; break; } inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); } progdefaults.REGEX_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_regex_match_wa=(Fl_Check_Button *)0; static void cb_btn_enable_regex_match_wa(Fl_Check_Button* o, void*) { progdefaults.ENABLE_BWSR_REGEX_MATCH=o->value(); } Fl_Button *btn_test_regex_wav=(Fl_Button *)0; static void cb_btn_test_regex_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.BWSR_REGEX_MATCH.c_str()); } Fl_File_Input *inp_wav_fname_mycall=(Fl_File_Input *)0; Fl_Button *btn_select_mycall_wav=(Fl_Button *)0; static void cb_btn_select_mycall_wav(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.wav\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_MYCALL_MATCH = fnfc.filename(); inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); progdefaults.MYCALL_ALERT_MENU = 0; mnu_mycall_alert_menu->value(progdefaults.MYCALL_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_mycall_alert_menu=(Fl_Choice *)0; static void cb_mnu_mycall_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_MYCALL_MATCH = "bark"; break; case 2 : progdefaults.BWSR_MYCALL_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_MYCALL_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_MYCALL_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_MYCALL_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_MYCALL_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_MYCALL_MATCH = "phone"; break; case 8 : progdefaults.BWSR_MYCALL_MATCH = "dinner_bell"; break; } inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); } progdefaults.MYCALL_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_mycall_match_wav=(Fl_Check_Button *)0; static void cb_btn_enable_mycall_match_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_BWSR_MYCALL_MATCH=o->value(); } Fl_Button *btn_test_mycall_wav=(Fl_Button *)0; static void cb_btn_test_mycall_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.BWSR_MYCALL_MATCH.c_str()); } Fl_File_Input *inp_wav_flmsg_rcvd=(Fl_File_Input *)0; Fl_Button *btn_select_rx_extract_msg=(Fl_Button *)0; static void cb_btn_select_rx_extract_msg(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.wav\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_MSG_RCVD = fnfc.filename(); inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); progdefaults.RX_EXTRACT_ALERT_MENU = 0; mnu_rx_extract_alert_menu->value(progdefaults.RX_EXTRACT_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_rx_extract_alert_menu=(Fl_Choice *)0; static void cb_mnu_rx_extract_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_MSG_RCVD = "bark"; break; case 2 : progdefaults.RX_EXTRACT_MSG_RCVD = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_MSG_RCVD = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_MSG_RCVD = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_MSG_RCVD = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_MSG_RCVD = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_MSG_RCVD = "phone"; break; case 8 : progdefaults.RX_EXTRACT_MSG_RCVD = "dinner_bell"; break; } inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } progdefaults.RX_EXTRACT_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_flmsg_wav=(Fl_Check_Button *)0; static void cb_btn_enable_flmsg_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD=o->value(); } Fl_Button *btn_test_flmsg_extract_wav=(Fl_Button *)0; static void cb_btn_test_flmsg_extract_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } Fl_File_Input *inp_wav_flmsg_timed_out=(Fl_File_Input *)0; Fl_Button *btn_select_rx_extract_timed_out=(Fl_Button *)0; static void cb_btn_select_rx_extract_timed_out(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.wav\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_TIMED_OUT = fnfc.filename(); inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); progdefaults.TIMED_OUT_ALERT_MENU = 0; mnu_rx_timed_out_alert_menu->value(progdefaults.TIMED_OUT_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_rx_timed_out_alert_menu=(Fl_Choice *)0; static void cb_mnu_rx_timed_out_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_TIMED_OUT = "bark"; break; case 2 : progdefaults.RX_EXTRACT_TIMED_OUT = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_TIMED_OUT = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_TIMED_OUT = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_TIMED_OUT = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_TIMED_OUT = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_TIMED_OUT = "phone"; break; case 8 : progdefaults.RX_EXTRACT_TIMED_OUT = "dinner_bell"; break; } inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } progdefaults.TIMED_OUT_ALERT_MENU = o->value(); } Fl_Button *btn_test_rx_extract_timed_out=(Fl_Button *)0; static void cb_btn_test_rx_extract_timed_out(Fl_Button*, void*) { audio_alert->alert(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } Fl_Check_Button *btn_enable_flmsg_time_out_wav=(Fl_Check_Button *)0; static void cb_btn_enable_flmsg_time_out_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT=o->value(); } Fl_File_Input *inp_wav_fname_rsid=(Fl_File_Input *)0; Fl_Button *btn_select_rsid_wav=(Fl_Button *)0; static void cb_btn_select_rsid_wav(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.wav\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RSID_MATCH = fnfc.filename(); inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); progdefaults.RSID_ALERT_MENU = 0; mnu_rsid_alert_menu->value(progdefaults.RSID_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_rsid_alert_menu=(Fl_Choice *)0; static void cb_mnu_rsid_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RSID_MATCH = "bark"; break; case 2 : progdefaults.RSID_MATCH = "checkout"; break; case 3 : progdefaults.RSID_MATCH = "diesel"; break; case 4 : progdefaults.RSID_MATCH = "steam_train"; break; case 5 : progdefaults.RSID_MATCH = "doesnot"; break; case 6 : progdefaults.RSID_MATCH = "beeboo"; break; case 7 : progdefaults.RSID_MATCH = "phone"; break; case 8 : progdefaults.RSID_MATCH = "dinner_bell"; break; } inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); } progdefaults.RSID_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_rsid_match_wav=(Fl_Check_Button *)0; static void cb_btn_enable_rsid_match_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_RSID_MATCH=o->value(); } Fl_Button *btn_test_rsid_wav=(Fl_Button *)0; static void cb_btn_test_rsid_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.RSID_MATCH.c_str()); } Fl_Group *tabID=(Fl_Group *)0; Fl_Tabs *tabsID=(Fl_Tabs *)0; Fl_Group *tabRsID=(Fl_Group *)0; Fl_Check_Button *chkRSidNotifyOnly=(Fl_Check_Button *)0; static void cb_chkRSidNotifyOnly(Fl_Check_Button* o, void*) { progdefaults.rsid_notify_only = o->value(); notify_create_rsid_event(progdefaults.rsid_notify_only); if (progdefaults.rsid_notify_only) { chkRetainFreqLock->deactivate(); chkDisableFreqChange->deactivate(); } else { chkRetainFreqLock->activate(); chkDisableFreqChange->activate(); } progdefaults.changed = true; } Fl_Button *bRSIDRxModes=(Fl_Button *)0; static void cb_bRSIDRxModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_rx_modes); progdefaults.changed = true; } Fl_Check_Button *chkRSidWideSearch=(Fl_Check_Button *)0; static void cb_chkRSidWideSearch(Fl_Check_Button* o, void*) { progdefaults.rsidWideSearch=o->value(); rxid_selection_color(); progdefaults.changed = true; } Fl_Check_Button *chkRSidMark=(Fl_Check_Button *)0; static void cb_chkRSidMark(Fl_Check_Button* o, void*) { progdefaults.rsid_mark = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRSidAutoDisable=(Fl_Check_Button *)0; static void cb_chkRSidAutoDisable(Fl_Check_Button* o, void*) { progdefaults.rsid_auto_disable = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_rsid_errors=(Fl_ListBox *)0; static void cb_listbox_rsid_errors(Fl_ListBox* o, void*) { progdefaults.RsID_label_type = o->index(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrRSIDsquelch=(Fl_Value_Slider2 *)0; static void cb_sldrRSIDsquelch(Fl_Value_Slider2* o, void*) { progdefaults.rsid_squelch = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRSidShowAlert=(Fl_Check_Button *)0; static void cb_chkRSidShowAlert(Fl_Check_Button* o, void*) { progdefaults.disable_rsid_warning_dialog_box = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRetainFreqLock=(Fl_Check_Button *)0; static void cb_chkRetainFreqLock(Fl_Check_Button* o, void*) { progdefaults.retain_freq_lock = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkDisableFreqChange=(Fl_Check_Button *)0; static void cb_chkDisableFreqChange(Fl_Check_Button* o, void*) { progdefaults.disable_rsid_freq_change = o->value(); progdefaults.changed = true; } Fl_Counter *val_pretone=(Fl_Counter *)0; static void cb_val_pretone(Fl_Counter* o, void*) { progdefaults.pretone = o->value(); progdefaults.changed = true; } Fl_Button *bRSIDTxModes=(Fl_Button *)0; static void cb_bRSIDTxModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_tx_modes); progdefaults.changed = true; } Fl_Check_Button *btn_post_rsid=(Fl_Check_Button *)0; static void cb_btn_post_rsid(Fl_Check_Button* o, void*) { progdefaults.rsid_post=o->value(); progdefaults.changed = true; } Fl_Group *tabVideoID=(Fl_Group *)0; Fl_Check_Button *btnsendid=(Fl_Check_Button *)0; static void cb_btnsendid(Fl_Check_Button* o, void*) { progdefaults.sendid=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnsendvideotext=(Fl_Check_Button *)0; static void cb_btnsendvideotext(Fl_Check_Button* o, void*) { progdefaults.sendtextid=o->value(); progdefaults.changed = true; } Fl_Input2 *valVideotext=(Fl_Input2 *)0; static void cb_valVideotext(Fl_Input2* o, void*) { progdefaults.strTextid = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkID_SMALL=(Fl_Check_Button *)0; static void cb_chkID_SMALL(Fl_Check_Button* o, void*) { progdefaults.ID_SMALL=o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrVideowidth=(Fl_Value_Slider2 *)0; static void cb_sldrVideowidth(Fl_Value_Slider2* o, void*) { progdefaults.videowidth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_vidlimit=(Fl_Check_Button *)0; static void cb_btn_vidlimit(Fl_Check_Button* o, void*) { progdefaults.vidlimit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_vidmodelimit=(Fl_Check_Button *)0; static void cb_btn_vidmodelimit(Fl_Check_Button* o, void*) { progdefaults.vidmodelimit=o->value(); progdefaults.changed=true; } Fl_Button *bVideoIDModes=(Fl_Button *)0; static void cb_bVideoIDModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.videoid_modes); progdefaults.changed = true; } Fl_Group *tabCwID=(Fl_Group *)0; Fl_Group *sld=(Fl_Group *)0; Fl_Check_Button *btnCWID=(Fl_Check_Button *)0; static void cb_btnCWID(Fl_Check_Button* o, void*) { progdefaults.CWid = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWIDwpm=(Fl_Value_Slider2 *)0; static void cb_sldrCWIDwpm(Fl_Value_Slider2* o, void*) { progdefaults.CWIDwpm = (int)o->value(); progdefaults.changed = true; } Fl_Button *bCWIDModes=(Fl_Button *)0; static void cb_bCWIDModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.cwid_modes); progdefaults.changed = true; } Fl_Group *tabMisc=(Fl_Group *)0; Fl_Tabs *tabsMisc=(Fl_Tabs *)0; Fl_Group *tabCPUspeed=(Fl_Group *)0; Fl_Check_Button *chkSlowCpu=(Fl_Check_Button *)0; static void cb_chkSlowCpu(Fl_Check_Button* o, void*) { progdefaults.slowcpu = o->value(); progdefaults.changed = true; } Fl_Group *tabNBEMS=(Fl_Group *)0; Fl_Check_Button *chkAutoExtract=(Fl_Check_Button *)0; static void cb_chkAutoExtract(Fl_Check_Button* o, void*) { progdefaults.autoextract = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_wrap_folder=(Fl_Check_Button *)0; static void cb_chk_open_wrap_folder(Fl_Check_Button* o, void*) { progdefaults.open_nbems_folder = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_flmsg=(Fl_Check_Button *)0; static void cb_chk_open_flmsg(Fl_Check_Button* o, void*) { progdefaults.open_flmsg = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_flmsg_print=(Fl_Check_Button *)0; static void cb_chk_open_flmsg_print(Fl_Check_Button* o, void*) { progdefaults.open_flmsg_print = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_flmsg_pathname=(Fl_Input2 *)0; static void cb_txt_flmsg_pathname(Fl_Input2* o, void*) { progdefaults.flmsg_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_flmsg=(Fl_Button *)0; static void cb_btn_select_flmsg(Fl_Button*, void*) { select_flmsg_pathname(); } Fl_Value_Slider *sldr_extract_timeout=(Fl_Value_Slider *)0; static void cb_sldr_extract_timeout(Fl_Value_Slider* o, void*) { progdefaults.extract_timeout=o->value(); progdefaults.changed=true; } Fl_Check_Button *chk_transfer__to_open_flmsg=(Fl_Check_Button *)0; static void cb_chk_transfer__to_open_flmsg(Fl_Check_Button* o, void*) { progdefaults.flmsg_transfer_direct = o->value(); progdefaults.changed = true; } Fl_Group *tabPskmail=(Fl_Group *)0; Fl_Counter2 *cntServerCarrier=(Fl_Counter2 *)0; static void cb_cntServerCarrier(Fl_Counter2* o, void*) { progdefaults.ServerCarrier = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntServerOffset=(Fl_Counter2 *)0; static void cb_cntServerOffset(Fl_Counter2* o, void*) { progdefaults.ServerOffset = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntServerACQsn=(Fl_Counter2 *)0; static void cb_cntServerACQsn(Fl_Counter2* o, void*) { progdefaults.ServerACQsn = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntServerAFCrange=(Fl_Counter2 *)0; static void cb_cntServerAFCrange(Fl_Counter2* o, void*) { progdefaults.ServerAFCrange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Check_Button *btnPSKmailSweetSpot=(Fl_Check_Button *)0; static void cb_btnPSKmailSweetSpot(Fl_Check_Button* o, void*) { progdefaults.PSKmailSweetSpot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_arq_s2n_report=(Fl_Check_Button *)0; static void cb_btn_arq_s2n_report(Fl_Check_Button* o, void*) { progdefaults.Pskmails2nreport=o->value(); } Fl_Group *tabSpot=(Fl_Group *)0; Fl_Check_Button *btnPSKRepAuto=(Fl_Check_Button *)0; static void cb_btnPSKRepAuto(Fl_Check_Button* o, void*) { progdefaults.pskrep_auto = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Check_Button *btnPSKRepLog=(Fl_Check_Button *)0; static void cb_btnPSKRepLog(Fl_Check_Button* o, void*) { progdefaults.pskrep_log = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Check_Button *btnPSKRepQRG=(Fl_Check_Button *)0; static void cb_btnPSKRepQRG(Fl_Check_Button* o, void*) { progdefaults.pskrep_qrg = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_report_when_visible=(Fl_Check_Button *)0; static void cb_btn_report_when_visible(Fl_Check_Button* o, void*) { progdefaults.report_when_visible = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_pskrep_autostart=(Fl_Check_Button *)0; static void cb_btn_pskrep_autostart(Fl_Check_Button* o, void*) { progdefaults.pskrep_autostart = o->value(); progdefaults.changed = true; } Fl_Box *box_connected_to_pskrep=(Fl_Box *)0; Fl_Input2 *inpPSKRepHost=(Fl_Input2 *)0; static void cb_inpPSKRepHost(Fl_Input2* o, void*) { progdefaults.pskrep_host = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Input2 *inpPSKRepPort=(Fl_Input2 *)0; static void cb_inpPSKRepPort(Fl_Input2* o, void*) { progdefaults.pskrep_port = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Button *btnPSKRepInit=(Fl_Button *)0; static void cb_btnPSKRepInit(Fl_Button* o, void*) { pskrep_stop(); if (!pskrep_start()) { boxPSKRepMsg->copy_label(pskrep_error()); progdefaults.usepskrep = false; box_connected_to_pskrep->color(FL_WHITE); box_connected_to_pskrep->redraw(); } else { boxPSKRepMsg->label(0); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.usepskrep = true; box_connected_to_pskrep->color(FL_GREEN); box_connected_to_pskrep->redraw(); }; } Fl_Box *boxPSKRepMsg=(Fl_Box *)0; Fl_Group *tabSweetSpot=(Fl_Group *)0; Fl_Value_Input2 *valCWsweetspot=(Fl_Value_Input2 *)0; static void cb_valCWsweetspot(Fl_Value_Input2* o, void*) { progdefaults.CWsweetspot=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *valRTTYsweetspot=(Fl_Value_Input2 *)0; static void cb_valRTTYsweetspot(Fl_Value_Input2* o, void*) { progdefaults.RTTYsweetspot=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *valPSKsweetspot=(Fl_Value_Input2 *)0; static void cb_valPSKsweetspot(Fl_Value_Input2* o, void*) { progdefaults.PSKsweetspot=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnStartAtSweetSpot=(Fl_Check_Button *)0; static void cb_btnStartAtSweetSpot(Fl_Check_Button* o, void*) { progdefaults.StartAtSweetSpot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWIsLSB=(Fl_Check_Button *)0; static void cb_btnCWIsLSB(Fl_Check_Button* o, void*) { progdefaults.CWIsLSB=o->value(); progdefaults.changed=true; } Fl_Group *tabText_IO=(Fl_Group *)0; Fl_Group *grpTalker=(Fl_Group *)0; Fl_Light_Button *btnConnectTalker=(Fl_Light_Button *)0; static void cb_btnConnectTalker(Fl_Light_Button* o, void*) { if (o->value()) open_talker(); else close_talker(); } Fl_Check_Button *btn_auto_talk=(Fl_Check_Button *)0; static void cb_btn_auto_talk(Fl_Check_Button* o, void*) { progdefaults.auto_talk = o->value(); } Fl_Check_Button *chkRxStream=(Fl_Check_Button *)0; static void cb_chkRxStream(Fl_Check_Button* o, void*) { progdefaults.speak = o->value(); progdefaults.changed = true; } Fl_Group *tabDTMF=(Fl_Group *)0; Fl_Check_Button *chkDTMFdecode=(Fl_Check_Button *)0; static void cb_chkDTMFdecode(Fl_Check_Button* o, void*) { progdefaults.DTMFdecode = o->value(); } Fl_Group *tabWX=(Fl_Group *)0; Fl_Input *inpWXsta=(Fl_Input *)0; static void cb_inpWXsta(Fl_Input* o, void*) { progdefaults.wx_sta = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_full=(Fl_Check_Button *)0; static void cb_btn_wx_full(Fl_Check_Button* o, void*) { progdefaults.wx_full=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_station_name=(Fl_Check_Button *)0; static void cb_btn_wx_station_name(Fl_Check_Button* o, void*) { progdefaults.wx_station_name = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_condx=(Fl_Check_Button *)0; static void cb_btn_wx_condx(Fl_Check_Button* o, void*) { progdefaults.wx_condx=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_fahrenheit=(Fl_Check_Button *)0; static void cb_btn_wx_fahrenheit(Fl_Check_Button* o, void*) { progdefaults.wx_fahrenheit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_celsius=(Fl_Check_Button *)0; static void cb_btn_wx_celsius(Fl_Check_Button* o, void*) { progdefaults.wx_celsius=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_mph=(Fl_Check_Button *)0; static void cb_btn_wx_mph(Fl_Check_Button* o, void*) { progdefaults.wx_mph=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_kph=(Fl_Check_Button *)0; static void cb_btn_wx_kph(Fl_Check_Button* o, void*) { progdefaults.wx_kph=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_inches=(Fl_Check_Button *)0; static void cb_btn_wx_inches(Fl_Check_Button* o, void*) { progdefaults.wx_inches=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_mbars=(Fl_Check_Button *)0; static void cb_btn_wx_mbars(Fl_Check_Button* o, void*) { progdefaults.wx_mbars=o->value(); progdefaults.changed = true; } Fl_Button *btn_metar_search=(Fl_Button *)0; static void cb_btn_metar_search(Fl_Button*, void*) { get_METAR_station(); } Fl_Input *txt_wx_url=(Fl_Input *)0; static void cb_txt_wx_url(Fl_Input* o, void*) { progdefaults.wx_url = o->value(); progdefaults.changed = true; } Fl_Button *btn_default_wx_url=(Fl_Button *)0; static void cb_btn_default_wx_url(Fl_Button*, void*) { txt_wx_url->value( "https://tgftp.nws.noaa.gov/data/observations/metar/decoded"); progdefaults.wx_url=txt_wx_url->value(); progdefaults.changed=true; } Fl_Group *tabKML=(Fl_Group *)0; Fl_Input *btnKmlSaveDir=(Fl_Input *)0; static void cb_btnKmlSaveDir(Fl_Input* o, void*) { progdefaults.kml_save_dir=o->value(); progdefaults.changed = true; kml_init(); } Fl_Input *inputKmlRootFile=(Fl_Input *)0; Fl_Counter *cntKmlMergeDistance=(Fl_Counter *)0; static void cb_cntKmlMergeDistance(Fl_Counter* o, void*) { progdefaults.kml_merge_distance = o->value(); progdefaults.changed = true; kml_init(); } Fl_Counter *cntKmlRetentionTime=(Fl_Counter *)0; static void cb_cntKmlRetentionTime(Fl_Counter* o, void*) { progdefaults.kml_retention_time = o->value(); progdefaults.changed = true; kml_init(); } Fl_Spinner2 *cntKmlRefreshInterval=(Fl_Spinner2 *)0; static void cb_cntKmlRefreshInterval(Fl_Spinner2* o, void*) { progdefaults.kml_refresh_interval = (int)(o->value()); progdefaults.changed = true; kml_init(); } Fl_ListBox *listbox_kml_balloon_style=(Fl_ListBox *)0; static void cb_listbox_kml_balloon_style(Fl_ListBox* o, void*) { progdefaults.kml_balloon_style = o->index(); progdefaults.changed = true; kml_init(); } Fl_Input *btnKmlCommand=(Fl_Input *)0; static void cb_btnKmlCommand(Fl_Input* o, void*) { progdefaults.kml_command=o->value(); progdefaults.changed = true; kml_init(); } Fl_Button *btlTestKmlCommand=(Fl_Button *)0; static void cb_btlTestKmlCommand(Fl_Button*, void*) { KmlServer::SpawnProcess(); } Fl_Button *btnSelectKmlDestDir=(Fl_Button *)0; static void cb_btnSelectKmlDestDir(Fl_Button*, void*) { Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(KmlDestDirSet); fc->show(); } Fl_Button *btlPurge=(Fl_Button *)0; static void cb_btlPurge(Fl_Button*, void*) { KmlServer::GetInstance()->Reset(); } Fl_Check_Button *btnKmlPurgeOnStartup=(Fl_Check_Button *)0; static void cb_btnKmlPurgeOnStartup(Fl_Check_Button* o, void*) { progdefaults.kml_purge_on_startup = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_kml_enabled=(Fl_Check_Button *)0; static void cb_btn_kml_enabled(Fl_Check_Button* o, void*) { progdefaults.kml_enabled = o->value(); if (progdefaults.kml_enabled) { kml_init(true); progdefaults.changed = true; } else { KmlServer::Exit(); }; } Fl_Group *tabQRZ=(Fl_Group *)0; Fl_Tabs *tabsQRZ=(Fl_Tabs *)0; Fl_Round_Button *btnQRZWEBnotavailable=(Fl_Round_Button *)0; static void cb_btnQRZWEBnotavailable(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZWEBNONE; progdefaults.changed = true; } Fl_Round_Button *btnQRZonline=(Fl_Round_Button *)0; static void cb_btnQRZonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZHTML; progdefaults.changed = true; } Fl_Round_Button *btnHAMCALLonline=(Fl_Round_Button *)0; static void cb_btnHAMCALLonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMCALLHTML; progdefaults.changed = true; } Fl_Round_Button *btnHamQTHonline=(Fl_Round_Button *)0; static void cb_btnHamQTHonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true; } Fl_Round_Button *btnCallookOnline=(Fl_Round_Button *)0; static void cb_btnCallookOnline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = CALLOOKHTML; progdefaults.changed = true; } Fl_Input2 *inp_qrzurl=(Fl_Input2 *)0; static void cb_inp_qrzurl(Fl_Input2* o, void*) { progdefaults.qrzurl = o->value(); progdefaults.changed=true; } Fl_Input2 *inp_hamcallurl=(Fl_Input2 *)0; static void cb_inp_hamcallurl(Fl_Input2* o, void*) { progdefaults.hamcallurl = o->value(); progdefaults.changed = true; } Fl_Input2 *inp_hamqthurl=(Fl_Input2 *)0; static void cb_inp_hamqthurl(Fl_Input2* o, void*) { progdefaults.hamqthurl = o->value(); progdefaults.changed = true; } Fl_Input2 *inp_callook_url=(Fl_Input2 *)0; static void cb_inp_callook_url(Fl_Input2* o, void*) { progdefaults.callookurl = o->value(); progdefaults.changed = true; } Fl_Round_Button *btnQRZXMLnotavailable=(Fl_Round_Button *)0; static void cb_btnQRZXMLnotavailable(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZXMLNONE; progdefaults.changed = true; } Fl_Round_Button *btnQRZcdrom=(Fl_Round_Button *)0; static void cb_btnQRZcdrom(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZCD; progdefaults.changed = true; } Fl_Round_Button *btnQRZsub=(Fl_Round_Button *)0; static void cb_btnQRZsub(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZNET; progdefaults.changed = true; } Fl_Round_Button *btnHamcall=(Fl_Round_Button *)0; static void cb_btnHamcall(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = HAMCALLNET; progdefaults.changed = true; } Fl_Round_Button *btnHamQTH=(Fl_Round_Button *)0; static void cb_btnHamQTH(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = HAMQTH; progdefaults.changed = true; } Fl_Round_Button *btnCALLOOK=(Fl_Round_Button *)0; static void cb_btnCALLOOK(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = CALLOOK; progdefaults.changed = true; } Fl_Input2 *txtQRZpathname=(Fl_Input2 *)0; static void cb_txtQRZpathname(Fl_Input2* o, void*) { progdefaults.QRZpathname = o->value(); progdefaults.QRZchanged = true; progdefaults.changed = true; } Fl_Input2 *inpQRZusername=(Fl_Input2 *)0; static void cb_inpQRZusername(Fl_Input2* o, void*) { progdefaults.QRZusername = o->value(); progdefaults.changed = true; } Fl_Input2 *inpQRZuserpassword=(Fl_Input2 *)0; static void cb_inpQRZuserpassword(Fl_Input2* o, void*) { progdefaults.QRZuserpassword = o->value(); progdefaults.changed = true; } Fl_Button *btnQRZpasswordShow=(Fl_Button *)0; static void cb_btnQRZpasswordShow(Fl_Button* o, void*) { inpQRZuserpassword->type(inpQRZuserpassword->type() ^ FL_SECRET_INPUT); inpQRZuserpassword->redraw(); o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide"); } Fl_Check_Button *btn_notes_address=(Fl_Check_Button *)0; static void cb_btn_notes_address(Fl_Check_Button* o, void*) { progdefaults.notes_address = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_clear_notes=(Fl_Check_Button *)0; static void cb_btn_clear_notes(Fl_Check_Button* o, void*) { progdefaults.clear_notes = o->value(); progdefaults.changed= true; } Fl_Group *tabEQSL=(Fl_Group *)0; Fl_Input2 *inpEQSL_www_url=(Fl_Input2 *)0; static void cb_inpEQSL_www_url(Fl_Input2* o, void*) { progdefaults.eqsl_www_url = o->value(); progdefaults.changed = true; } Fl_Input2 *inpEQSL_id=(Fl_Input2 *)0; static void cb_inpEQSL_id(Fl_Input2* o, void*) { progdefaults.eqsl_id = o->value(); progdefaults.changed = true; } Fl_Input2 *inpEQSL_pwd=(Fl_Input2 *)0; static void cb_inpEQSL_pwd(Fl_Input2* o, void*) { progdefaults.eqsl_pwd = o->value(); progdefaults.changed = true; } Fl_Button *btnEQSL_pwd_show=(Fl_Button *)0; static void cb_btnEQSL_pwd_show(Fl_Button* o, void*) { inpEQSL_pwd->type(inpEQSL_pwd->type() ^ FL_SECRET_INPUT); inpEQSL_pwd->redraw(); o->label((inpEQSL_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide")); } Fl_Input2 *inpEQSL_nick=(Fl_Input2 *)0; static void cb_inpEQSL_nick(Fl_Input2* o, void*) { progdefaults.eqsl_nick = o->value(); progdefaults.changed = true; } Fl_Button *btn_verify_eqsl=(Fl_Button *)0; Fl_Check_Button *btn_send_when_logged=(Fl_Check_Button *)0; static void cb_btn_send_when_logged(Fl_Check_Button* o, void*) { progdefaults.eqsl_when_logged = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_send_datetime_off=(Fl_Check_Button *)0; static void cb_btn_send_datetime_off(Fl_Check_Button* o, void*) { progdefaults.eqsl_datetime_off = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_show_eqsl_delivery=(Fl_Check_Button *)0; static void cb_btn_show_eqsl_delivery(Fl_Check_Button* o, void*) { progdefaults.eqsl_show_delivery = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_eqsl_default_message=(Fl_Input2 *)0; static void cb_txt_eqsl_default_message(Fl_Input2* o, void*) { progdefaults.eqsl_default_message = o->value(); progdefaults.changed = true; } Fl_Box *eqsl_txt1=(Fl_Box *)0; Fl_Box *eqsl_txt2=(Fl_Box *)0; Fl_Box *eqsl_txt3=(Fl_Box *)0; Fl_Group *tabLOTW=(Fl_Group *)0; Fl_Input2 *txt_lotw_pathname=(Fl_Input2 *)0; static void cb_txt_lotw_pathname(Fl_Input2* o, void*) { progdefaults.lotw_pathname = o->value(); progdefaults.changed = true; } Fl_Input2 *inpLOTW_pwd=(Fl_Input2 *)0; static void cb_inpLOTW_pwd(Fl_Input2* o, void*) { progdefaults.lotw_pwd = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_submit_lotw_password=(Fl_Check_Button *)0; static void cb_btn_submit_lotw_password(Fl_Check_Button* o, void*) { progdefaults.submit_lotw_password=o->value(); progdefaults.changed=true; } Fl_Input2 *inpLOTW_location=(Fl_Input2 *)0; static void cb_inpLOTW_location(Fl_Input2* o, void*) { progdefaults.lotw_location = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_lotw=(Fl_Button *)0; static void cb_btn_select_lotw(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.lotw_pathname); txt_lotw_pathname->value(str.c_str()); progdefaults.lotw_pathname = str; progdefaults.changed = true; } Fl_Check_Button *btn_lotw_quiet_mode=(Fl_Check_Button *)0; static void cb_btn_lotw_quiet_mode(Fl_Check_Button* o, void*) { progdefaults.lotw_quiet_mode=o->value(); progdefaults.changed=true; } Fl_Check_Button *btn_submit_lotw=(Fl_Check_Button *)0; static void cb_btn_submit_lotw(Fl_Check_Button* o, void*) { progdefaults.submit_lotw=o->value(); progdefaults.changed=true; } Fl_Button *btn_export_lotw=(Fl_Button *)0; static void cb_btn_export_lotw(Fl_Button*, void*) { cb_btnExportLoTW(); } Fl_Button *btn_review_lotw=(Fl_Button *)0; static void cb_btn_review_lotw(Fl_Button*, void*) { cb_review_lotw(); } Fl_Button *btn_send_lotw=(Fl_Button *)0; static void cb_btn_send_lotw(Fl_Button*, void*) { cb_send_lotw(); } Fl_Button *btnLOTW_pwd_show=(Fl_Button *)0; static void cb_btnLOTW_pwd_show(Fl_Button* o, void*) { inpLOTW_pwd->type(inpLOTW_pwd->type() ^ FL_SECRET_INPUT); inpLOTW_pwd->redraw(); o->label((inpLOTW_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide")); } Fl_Button *btn_verify_lotw=(Fl_Button *)0; Fl_Button *btn_view_unmatched=(Fl_Button *)0; Fl_Check_Button *btn_show_lotw_delivery=(Fl_Check_Button *)0; static void cb_btn_show_lotw_delivery(Fl_Check_Button* o, void*) { progdefaults.lotw_show_delivery = o->value(); progdefaults.changed = true; } Fl_Group *tabAutoStart=(Fl_Group *)0; static void cb_tabAutoStart(Fl_Group*, void*) { progdefaults.changed = true; } Fl_Input2 *txt_auto_flrig_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flrig_pathname(Fl_Input2* o, void*) { progdefaults.auto_flrig_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_flrig=(Fl_Button *)0; static void cb_btn_select_flrig(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_flrig_pathname); txt_auto_flrig_pathname->value(str.c_str()); progdefaults.auto_flrig_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_flamp_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flamp_pathname(Fl_Input2* o, void*) { progdefaults.auto_flamp_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auto_flamp=(Fl_Button *)0; static void cb_btn_select_auto_flamp(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_flamp_pathname); txt_auto_flamp_pathname->value(str.c_str()); progdefaults.auto_flamp_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_flnet_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flnet_pathname(Fl_Input2* o, void*) { progdefaults.auto_flnet_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auto_flnet=(Fl_Button *)0; static void cb_btn_select_auto_flnet(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_flnet_pathname); txt_auto_flnet_pathname->value(str.c_str()); progdefaults.auto_flnet_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_fllog_pathname=(Fl_Input2 *)0; static void cb_txt_auto_fllog_pathname(Fl_Input2* o, void*) { progdefaults.auto_fllog_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_fllog=(Fl_Button *)0; static void cb_btn_select_fllog(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_fllog_pathname); txt_auto_fllog_pathname->value(str.c_str()); progdefaults.auto_fllog_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog1_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog1_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog1_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog1=(Fl_Button *)0; static void cb_btn_select_prog1(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog1_pathname); txt_auto_prog1_pathname->value(str.c_str()); progdefaults.auto_prog1_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog2_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog2_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog2_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog2=(Fl_Button *)0; static void cb_btn_select_prog2(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog2_pathname); txt_auto_prog2_pathname->value(str.c_str()); progdefaults.auto_prog2_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog3_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog3_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog3_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog3=(Fl_Button *)0; static void cb_btn_select_prog3(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog3_pathname); txt_auto_prog3_pathname->value(str.c_str()); progdefaults.auto_prog3_pathname = str; progdefaults.changed = true; } Fl_Check_Button *btn_flrig_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flrig_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flrig_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_flamp_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flamp_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flamp_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_flnet_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flnet_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flnet_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fllog_auto_enable=(Fl_Check_Button *)0; static void cb_btn_fllog_auto_enable(Fl_Check_Button* o, void*) { progdefaults.fllog_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog1_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog1_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog1_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog2_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog2_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog2_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog3_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog3_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog3_auto_enable = o->value(); progdefaults.changed = true; } Fl_Button *btn_test_flrig=(Fl_Button *)0; static void cb_btn_test_flrig(Fl_Button*, void*) { start_process(progdefaults.auto_flrig_pathname); } Fl_Button *btn_test_flamp=(Fl_Button *)0; static void cb_btn_test_flamp(Fl_Button*, void*) { start_process(progdefaults.auto_flamp_pathname); } Fl_Button *btn_test_flnet=(Fl_Button *)0; static void cb_btn_test_flnet(Fl_Button*, void*) { start_process(progdefaults.auto_flnet_pathname); } Fl_Button *btn_test_fllog=(Fl_Button *)0; static void cb_btn_test_fllog(Fl_Button*, void*) { start_process(progdefaults.auto_fllog_pathname); } Fl_Button *btn_test_prog1=(Fl_Button *)0; static void cb_btn_test_prog1(Fl_Button*, void*) { start_process(progdefaults.auto_prog1_pathname); } Fl_Button *btn_test_prog2=(Fl_Button *)0; static void cb_btn_test_prog2(Fl_Button*, void*) { start_process(progdefaults.auto_prog2_pathname); } Fl_Button *btn_test_prog3=(Fl_Button *)0; static void cb_btn_test_prog3(Fl_Button*, void*) { start_process(progdefaults.auto_prog3_pathname); } Fl_Group *tabIO=(Fl_Group *)0; static void cb_tabIO(Fl_Group*, void*) { btnDisable_p2p_io_widgets->value(1); } Fl_Check_Button *btnDisable_p2p_io_widgets=(Fl_Check_Button *)0; static void cb_btnDisable_p2p_io_widgets(Fl_Check_Button* o, long) { progStatus.ip_lock = o->value(); if(o->value()) disable_config_p2p_io_widgets(); else enable_config_p2p_io_widgets(); kiss_io_set_button_state(0); } Fl_Check_Button *btnEnable_arq=(Fl_Check_Button *)0; static void cb_btnEnable_arq(Fl_Check_Button* o, void*) { if(o->value()) { enable_arq(); } progdefaults.changed = true; } Fl_Check_Button *btnEnable_kiss=(Fl_Check_Button *)0; static void cb_btnEnable_kiss(Fl_Check_Button* o, void*) { if(o->value()) { enable_kiss(); } progdefaults.changed = true; } Fl_Button *btnDefault_kiss_ip=(Fl_Button *)0; static void cb_btnDefault_kiss_ip(Fl_Button*, void*) { set_ip_to_default(KISS_IO); progdefaults.changed = true; } Fl_Input2 *txtKiss_ip_address=(Fl_Input2 *)0; static void cb_txtKiss_ip_address(Fl_Input2* o, void*) { progStatus.kiss_address = o->value(); progdefaults.kiss_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txtKiss_ip_io_port_no=(Fl_Input2 *)0; static void cb_txtKiss_ip_io_port_no(Fl_Input2* o, void*) { progStatus.kiss_io_port = o->value(); progdefaults.kiss_io_port = o->value(); progdefaults.changed = true; } Fl_Input2 *txtKiss_ip_out_port_no=(Fl_Input2 *)0; static void cb_txtKiss_ip_out_port_no(Fl_Input2* o, void*) { progStatus.kiss_out_port = o->value(); progdefaults.kiss_out_port = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnEnable_dual_port=(Fl_Check_Button *)0; static void cb_btnEnable_dual_port(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_dual_port_enabled = true; progdefaults.kiss_dual_port_enabled = true; } else { progStatus.kiss_dual_port_enabled = false; progdefaults.kiss_dual_port_enabled = false; } progdefaults.changed = true; } Fl_Button *btn_restart_kiss=(Fl_Button *)0; static void cb_btn_restart_kiss(Fl_Button*, void*) { //restart_kiss_server(); } Fl_Button *btn_connect_kiss_io=(Fl_Button *)0; static void cb_btn_connect_kiss_io(Fl_Button*, void*) { connect_to_kiss_io(true); } Fl_Check_Button *btnKissTCPIO=(Fl_Check_Button *)0; static void cb_btnKissTCPIO(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } else { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } kiss_io_set_button_state(0); progdefaults.changed = true; } Fl_Check_Button *btnKissUDPIO=(Fl_Check_Button *)0; static void cb_btnKissUDPIO(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } else { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } kiss_io_set_button_state(0); progdefaults.changed = true; } Fl_Check_Button *btnKissTCPListen=(Fl_Check_Button *)0; static void cb_btnKissTCPListen(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_tcp_listen = true; progdefaults.kiss_tcp_listen = true; } else { progStatus.kiss_tcp_listen = false; progdefaults.kiss_tcp_listen = false; } progdefaults.changed = true; } Fl_Check_Button *btnEnable_7bit_modem_inhibit=(Fl_Check_Button *)0; static void cb_btnEnable_7bit_modem_inhibit(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_io_modem_change_inhibit = true; progdefaults.kiss_io_modem_change_inhibit = true; } else { progStatus.kiss_io_modem_change_inhibit = false; progdefaults.kiss_io_modem_change_inhibit = false; } progdefaults.changed = true; } Fl_Check_Button *btnEnable_auto_connect=(Fl_Check_Button *)0; static void cb_btnEnable_auto_connect(Fl_Check_Button* o, void*) { if(o->value()) { progdefaults.tcp_udp_auto_connect = true; } else { progdefaults.tcp_udp_auto_connect = false; } progdefaults.changed = true; } Fl_Check_Button *btnEnable_ax25_decode=(Fl_Check_Button *)0; static void cb_btnEnable_ax25_decode(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.ax25_decode_enabled = true; progdefaults.ax25_decode_enabled = true; } else { progStatus.ax25_decode_enabled = false; progdefaults.ax25_decode_enabled = false; } progdefaults.changed = true; } Fl_Input2 *txtArq_ip_address=(Fl_Input2 *)0; static void cb_txtArq_ip_address(Fl_Input2* o, void*) { progdefaults.arq_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txtArq_ip_port_no=(Fl_Input2 *)0; static void cb_txtArq_ip_port_no(Fl_Input2* o, void*) { progdefaults.arq_port = o->value(); progdefaults.changed = true; } Fl_Button *btnDefault_arq_ip=(Fl_Button *)0; static void cb_btnDefault_arq_ip(Fl_Button*, void*) { set_ip_to_default(ARQ_IO); progdefaults.changed = true; } Fl_Button *btn_restart_arq=(Fl_Button *)0; static void cb_btn_restart_arq(Fl_Button*, void*) { //arq_restart(); } Fl_Button *btnDefault_xmlrpc_ip=(Fl_Button *)0; static void cb_btnDefault_xmlrpc_ip(Fl_Button*, void*) { set_ip_to_default(XMLRPC_IO); progdefaults.changed = true; } Fl_Input2 *txtXmlrpc_ip_address=(Fl_Input2 *)0; static void cb_txtXmlrpc_ip_address(Fl_Input2* o, void*) { progdefaults.xmlrpc_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txtXmlrpc_ip_port_no=(Fl_Input2 *)0; static void cb_txtXmlrpc_ip_port_no(Fl_Input2* o, void*) { progdefaults.xmlrpc_port = o->value(); progdefaults.changed = true; } Fl_Button *btn_restart_xml=(Fl_Button *)0; static void cb_btn_restart_xml(Fl_Button*, void*) { //restart_xml_server(); } Fl_Button *btnDefault_flrig_ip=(Fl_Button *)0; static void cb_btnDefault_flrig_ip(Fl_Button*, void*) { set_ip_to_default(FLRIG_IO); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_address=(Fl_Input2 *)0; static void cb_txt_flrig_ip_address(Fl_Input2* o, void*) { progdefaults.flrig_ip_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_port=(Fl_Input2 *)0; static void cb_txt_flrig_ip_port(Fl_Input2* o, void*) { progdefaults.flrig_ip_port = o->value(); progdefaults.changed = true; } Fl_Button *btn_reconnect_flrig_server=(Fl_Button *)0; static void cb_btn_reconnect_flrig_server(Fl_Button*, void*) { reconnect_to_flrig(); } Fl_Input *txt_fllog_ip_address=(Fl_Input *)0; static void cb_txt_fllog_ip_address(Fl_Input* o, void*) { progdefaults.xmllog_address = o->value(); } Fl_Input *txt_fllog_ip_port=(Fl_Input *)0; static void cb_txt_fllog_ip_port(Fl_Input* o, void*) { progdefaults.xmllog_port = o->value(); } Fl_Button *btn_reconnect_log_server=(Fl_Button *)0; static void cb_btn_reconnect_log_server(Fl_Button*, void*) { progdefaults.xml_logbook = true; progdefaults.changed = true; connect_to_log_server(); } Fl_Button *btnDefault_fllog_ip=(Fl_Button *)0; static void cb_btnDefault_fllog_ip(Fl_Button*, void*) { set_ip_to_default(FLLOG_IO); progdefaults.changed = true; } Fl_Group *tabKPSM=(Fl_Group *)0; Fl_Counter *cntBusyChannelSeconds=(Fl_Counter *)0; static void cb_cntBusyChannelSeconds(Fl_Counter* o, void*) { progStatus.busyChannelSeconds = (int) o->value(); progdefaults.busyChannelSeconds = (int) o->value(); progdefaults.changed = true; } Fl_Check_Button *btnEnableBusyChannel=(Fl_Check_Button *)0; static void cb_btnEnableBusyChannel(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.enableBusyChannel = true; progdefaults.enableBusyChannel = true; } else { progStatus.enableBusyChannel = false; progdefaults.enableBusyChannel = false; } progdefaults.changed = true; } Fl_Counter *cntPSMTXBufferFlushTimer=(Fl_Counter *)0; static void cb_cntPSMTXBufferFlushTimer(Fl_Counter* o, void*) { progStatus.psm_flush_buffer_timeout = (int) o->value(); progdefaults.psm_flush_buffer_timeout = (int) o->value(); progdefaults.changed = true; } Fl_Counter *cntPSMBandwidthMargins=(Fl_Counter *)0; static void cb_cntPSMBandwidthMargins(Fl_Counter* o, void*) { progStatus.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.changed = true; } Fl_Counter *cntPSMValidSamplePeriod=(Fl_Counter *)0; static void cb_cntPSMValidSamplePeriod(Fl_Counter* o, void*) { progStatus.psm_hit_time_window = (int) o->value(); progdefaults.psm_hit_time_window = (int) o->value(); progdefaults.changed = true; } Fl_Check_Button *btnEnable_csma=(Fl_Check_Button *)0; static void cb_btnEnable_csma(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.csma_enabled = true; progdefaults.csma_enabled = true; } else { progStatus.csma_enabled = false; progdefaults.csma_enabled = false; } progdefaults.changed = true; } Fl_Counter *cntPersistance=(Fl_Counter *)0; static void cb_cntPersistance(Fl_Counter* o, void*) { progStatus.csma_persistance = (int) o->value(); progdefaults.csma_persistance = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_PERSISTANCE); } Fl_Counter *cntSlotTime=(Fl_Counter *)0; static void cb_cntSlotTime(Fl_Counter* o, void*) { progStatus.csma_slot_time = (int) o->value(); progdefaults.csma_slot_time = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_SLOT_TIME); } Fl_Counter *cntTransmitDelay=(Fl_Counter *)0; static void cb_cntTransmitDelay(Fl_Counter* o, void*) { progStatus.csma_transmit_delay = (int) o->value(); progdefaults.csma_transmit_delay = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_TX_DELAY); } Fl_Output *OutputSlotTimeMS=(Fl_Output *)0; Fl_Output *OutputTransmitDelayMS=(Fl_Output *)0; Fl_Output *OutputPersistancePercent=(Fl_Output *)0; Fl_Check_Button *btnEnable_histogram=(Fl_Check_Button *)0; static void cb_btnEnable_histogram(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.psm_use_histogram = true; progdefaults.psm_use_histogram = true; } else { progStatus.psm_use_histogram = false; progdefaults.psm_use_histogram = false; } progdefaults.changed = true; } Fl_Counter *cntPSMThreshold=(Fl_Counter *)0; static void cb_cntPSMThreshold(Fl_Counter* o, void*) { progStatus.psm_histogram_offset_threshold = (int) o->value(); progdefaults.psm_histogram_offset_threshold = (int) o->value(); progdefaults.changed = true; } Fl_Counter *cntKPSQLAttenuation=(Fl_Counter *)0; static void cb_cntKPSQLAttenuation(Fl_Counter* o, void*) { progStatus.kpsql_attenuation = (int) o->value(); progdefaults.kpsql_attenuation = (int) o->value(); update_kpsql_fractional_gain(progStatus.kpsql_attenuation); progdefaults.changed = true; } Fl_Button *btnBuyChannelDefaults=(Fl_Button *)0; static void cb_btnBuyChannelDefaults(Fl_Button*, void*) { psm_set_defaults(); } Fl_Check_Button *btn_show_psm_button=(Fl_Check_Button *)0; static void cb_btn_show_psm_button(Fl_Check_Button* o, void*) { progdefaults.show_psm_btn = o->value(); UI_select(); progdefaults.changed = true; } Fl_Button *btnSaveConfig=(Fl_Button *)0; static void cb_btnSaveConfig(Fl_Button*, void*) { progdefaults.saveDefaults(); } Fl_Return_Button *btnCloseConfig=(Fl_Return_Button *)0; static void cb_btnCloseConfig(Fl_Return_Button*, void*) { closeDialog(); } Fl_Button *btnResetConfig=(Fl_Button *)0; static void cb_btnResetConfig(Fl_Button*, void*) { if (fl_choice2("This will effect every configuration item!\nConfirm", "Yes", "No", NULL)) { progdefaults.resetDefaults(); progdefaults.changed = false; }; } Fl_Double_Window* ConfigureDialog() { Fl_Double_Window* w; font_browser = new Font_Browser; static const char szShifts[] = "23|85|160|170|182|200|240|350|425|850|Custom"; static const char szBauds[] = "45|45.45|50|56|75|100|110|150|200|300"; static const char szSelBits[] = "5 (baudot)|7 (ascii)|8 (ascii)"; static const char szParity[] = "none|even|odd|zero|one"; static const char szStopBits[] = "1|1.5|2"; static const char szOliviaTones[] = "2|4|8|16|32|64|128|256"; static const char szOliviaBandwidth[] = "125|250|500|1000|2000"; static const char szContestiaTones[] = "2|4|8|16|32|64|128|256"; static const char szContestiaBandwidth[] = "125|250|500|1000|2000"; static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800"; static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| "; { Fl_Double_Window* o = new Fl_Double_Window(600, 425, _("Fldigi configuration")); w = o; if (w) {/* empty */} o->color(FL_DARK2); o->selection_color((Fl_Color)51); o->labelsize(18); o->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE)); { tabsConfigure = new Fl_Tabs(0, 0, 675, 390); tabsConfigure->color(FL_LIGHT1); tabsConfigure->selection_color(FL_LIGHT1); { tabOperator = new Fl_Group(0, 25, 600, 365, _("Operator")); tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->when(FL_WHEN_CHANGED); { Fl_Group* o = new Fl_Group(5, 35, 590, 285, _("Station / Operator")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { inpMyCallsign = new Fl_Input2(195, 64, 110, 24, _("Station Callsign:")); inpMyCallsign->tooltip(_("Station callsign")); inpMyCallsign->box(FL_DOWN_BOX); inpMyCallsign->color(FL_BACKGROUND2_COLOR); inpMyCallsign->selection_color(FL_SELECTION_COLOR); inpMyCallsign->labeltype(FL_NORMAL_LABEL); inpMyCallsign->labelfont(0); inpMyCallsign->labelsize(14); inpMyCallsign->labelcolor(FL_FOREGROUND_COLOR); inpMyCallsign->callback((Fl_Callback*)cb_inpMyCallsign); inpMyCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpMyCallsign->when(FL_WHEN_CHANGED); inpMyCallsign->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyCallsign { Fl_Input2* o = inpOperCallsign = new Fl_Input2(195, 94, 110, 24, _("Operator Callsign:")); inpOperCallsign->tooltip(_("Operator callsign (if different than station callsign)")); inpOperCallsign->box(FL_DOWN_BOX); inpOperCallsign->color(FL_BACKGROUND2_COLOR); inpOperCallsign->selection_color(FL_SELECTION_COLOR); inpOperCallsign->labeltype(FL_NORMAL_LABEL); inpOperCallsign->labelfont(0); inpOperCallsign->labelsize(14); inpOperCallsign->labelcolor(FL_FOREGROUND_COLOR); inpOperCallsign->callback((Fl_Callback*)cb_inpOperCallsign); inpOperCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpOperCallsign->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.operCall.c_str()); } // Fl_Input2* inpOperCallsign { inpMyName = new Fl_Input2(195, 125, 140, 24, _("Operator Name:")); inpMyName->tooltip(_("Operators name")); inpMyName->box(FL_DOWN_BOX); inpMyName->color(FL_BACKGROUND2_COLOR); inpMyName->selection_color(FL_SELECTION_COLOR); inpMyName->labeltype(FL_NORMAL_LABEL); inpMyName->labelfont(0); inpMyName->labelsize(14); inpMyName->labelcolor(FL_FOREGROUND_COLOR); inpMyName->callback((Fl_Callback*)cb_inpMyName); inpMyName->align(Fl_Align(FL_ALIGN_LEFT)); inpMyName->when(FL_WHEN_RELEASE); inpMyName->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyName { inpMyAntenna = new Fl_Input2(195, 155, 320, 24, _("Antenna:")); inpMyAntenna->tooltip(_("Short description of antenna")); inpMyAntenna->box(FL_DOWN_BOX); inpMyAntenna->color(FL_BACKGROUND2_COLOR); inpMyAntenna->selection_color(FL_SELECTION_COLOR); inpMyAntenna->labeltype(FL_NORMAL_LABEL); inpMyAntenna->labelfont(0); inpMyAntenna->labelsize(14); inpMyAntenna->labelcolor(FL_FOREGROUND_COLOR); inpMyAntenna->callback((Fl_Callback*)cb_inpMyAntenna); inpMyAntenna->align(Fl_Align(FL_ALIGN_LEFT)); inpMyAntenna->when(FL_WHEN_RELEASE); inpMyAntenna->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyAntenna { inpMyQth = new Fl_Input2(195, 186, 320, 24, _("Station QTH:")); inpMyQth->tooltip(_("Operators QTH")); inpMyQth->box(FL_DOWN_BOX); inpMyQth->color(FL_BACKGROUND2_COLOR); inpMyQth->selection_color(FL_SELECTION_COLOR); inpMyQth->labeltype(FL_NORMAL_LABEL); inpMyQth->labelfont(0); inpMyQth->labelsize(14); inpMyQth->labelcolor(FL_FOREGROUND_COLOR); inpMyQth->callback((Fl_Callback*)cb_inpMyQth); inpMyQth->align(Fl_Align(FL_ALIGN_LEFT)); inpMyQth->when(FL_WHEN_RELEASE); inpMyQth->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyQth { inpMyLocator = new Fl_Input2(195, 216, 85, 24, _("Station Locator:")); inpMyLocator->tooltip(_("Maidenhead locator as in EM64qv")); inpMyLocator->box(FL_DOWN_BOX); inpMyLocator->color(FL_BACKGROUND2_COLOR); inpMyLocator->selection_color(FL_SELECTION_COLOR); inpMyLocator->labeltype(FL_NORMAL_LABEL); inpMyLocator->labelfont(0); inpMyLocator->labelsize(14); inpMyLocator->labelcolor(FL_FOREGROUND_COLOR); inpMyLocator->callback((Fl_Callback*)cb_inpMyLocator); inpMyLocator->align(Fl_Align(FL_ALIGN_LEFT)); inpMyLocator->when(FL_WHEN_RELEASE); inpMyLocator->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyLocator { Fl_ListBox* o = listbox_states = new Fl_ListBox(195, 247, 160, 24, _("State")); listbox_states->box(FL_DOWN_BOX); listbox_states->color(FL_BACKGROUND2_COLOR); listbox_states->selection_color(FL_BACKGROUND_COLOR); listbox_states->labeltype(FL_NORMAL_LABEL); listbox_states->labelfont(0); listbox_states->labelsize(14); listbox_states->labelcolor(FL_FOREGROUND_COLOR); listbox_states->callback((Fl_Callback*)cb_listbox_states); listbox_states->align(Fl_Align(FL_ALIGN_LEFT)); listbox_states->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->add(states.names().c_str()); o->index(progdefaults.SQSOstate); listbox_states->end(); } // Fl_ListBox* listbox_states { Fl_Input2* o = inp_QP_state_short = new Fl_Input2(362, 247, 43, 24); inp_QP_state_short->tooltip(_("Abbreviation for state")); inp_QP_state_short->box(FL_DOWN_BOX); inp_QP_state_short->color(FL_BACKGROUND2_COLOR); inp_QP_state_short->selection_color(FL_SELECTION_COLOR); inp_QP_state_short->labeltype(FL_NORMAL_LABEL); inp_QP_state_short->labelfont(0); inp_QP_state_short->labelsize(14); inp_QP_state_short->labelcolor(FL_FOREGROUND_COLOR); inp_QP_state_short->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_QP_state_short->when(FL_WHEN_RELEASE); o->value(states.state_short(listbox_states->value()).c_str()); } // Fl_Input2* inp_QP_state_short { Fl_ListBox* o = listbox_counties = new Fl_ListBox(195, 278, 284, 24, _("County")); listbox_counties->box(FL_DOWN_BOX); listbox_counties->color(FL_BACKGROUND2_COLOR); listbox_counties->selection_color(FL_BACKGROUND_COLOR); listbox_counties->labeltype(FL_NORMAL_LABEL); listbox_counties->labelfont(0); listbox_counties->labelsize(14); listbox_counties->labelcolor(FL_FOREGROUND_COLOR); listbox_counties->callback((Fl_Callback*)cb_listbox_counties); listbox_counties->align(Fl_Align(FL_ALIGN_LEFT)); listbox_counties->when(FL_WHEN_RELEASE); o->clear(); o->add(states.counties(listbox_states->value()).c_str()); o->index(progdefaults.SQSOcounty); o->labelsize(FL_NORMAL_SIZE); listbox_counties->end(); } // Fl_ListBox* listbox_counties { inp_QP_short_county = new Fl_Input2(487, 278, 60, 24); inp_QP_short_county->tooltip(_("Abbreviation for county")); inp_QP_short_county->box(FL_DOWN_BOX); inp_QP_short_county->color(FL_BACKGROUND2_COLOR); inp_QP_short_county->selection_color(FL_SELECTION_COLOR); inp_QP_short_county->labeltype(FL_NORMAL_LABEL); inp_QP_short_county->labelfont(0); inp_QP_short_county->labelsize(14); inp_QP_short_county->labelcolor(FL_FOREGROUND_COLOR); inp_QP_short_county->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_QP_short_county->when(FL_WHEN_RELEASE); inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str()); } // Fl_Input2* inp_QP_short_county o->end(); } // Fl_Group* o tabOperator->end(); } // Fl_Group* tabOperator { tabUI = new Fl_Group(0, 25, 604, 365, _("UI")); tabUI->hide(); { tabsUI = new Fl_Tabs(0, 25, 604, 365); tabsUI->selection_color(FL_LIGHT1); { tabBrowser = new Fl_Group(0, 50, 600, 340, _("Browser")); { Fl_Group* o = new Fl_Group(30, 65, 540, 300); o->box(FL_ENGRAVED_FRAME); { Fl_Spinner2* o = cntChannels = new Fl_Spinner2(46, 75, 50, 24, _("Channels, first channel starts at waterfall lower limit")); cntChannels->tooltip(_("Change # of psk viewer channels")); cntChannels->box(FL_NO_BOX); cntChannels->color(FL_BACKGROUND_COLOR); cntChannels->selection_color(FL_BACKGROUND_COLOR); cntChannels->labeltype(FL_NORMAL_LABEL); cntChannels->labelfont(0); cntChannels->labelsize(14); cntChannels->labelcolor(FL_FOREGROUND_COLOR); cntChannels->maximum(30); cntChannels->value(30); cntChannels->callback((Fl_Callback*)cb_cntChannels); cntChannels->align(Fl_Align(FL_ALIGN_RIGHT)); cntChannels->when(FL_WHEN_RELEASE); o->minimum(5); o->maximum(30); o->step(1); o->value(progdefaults.VIEWERchannels); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntChannels { Fl_Spinner2* o = cntTimeout = new Fl_Spinner2(46, 111, 50, 24, _("Inactivity timeout")); cntTimeout->tooltip(_("Clear channel text after\n# seconds of inactivity")); cntTimeout->box(FL_NO_BOX); cntTimeout->color(FL_BACKGROUND_COLOR); cntTimeout->selection_color(FL_BACKGROUND_COLOR); cntTimeout->labeltype(FL_NORMAL_LABEL); cntTimeout->labelfont(0); cntTimeout->labelsize(14); cntTimeout->labelcolor(FL_FOREGROUND_COLOR); cntTimeout->value(10); cntTimeout->callback((Fl_Callback*)cb_cntTimeout); cntTimeout->align(Fl_Align(FL_ALIGN_RIGHT)); cntTimeout->when(FL_WHEN_RELEASE); o->minimum(1); o->maximum(180); o->step(1); o->value(progdefaults.VIEWERtimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTimeout { Fl_ListBox* o = listboxViewerLabel = new Fl_ListBox(46, 151, 150, 24, _("Channel label")); listboxViewerLabel->tooltip(_("Appearance of label on each channel")); listboxViewerLabel->box(FL_DOWN_BOX); listboxViewerLabel->color(FL_BACKGROUND2_COLOR); listboxViewerLabel->selection_color(FL_BACKGROUND_COLOR); listboxViewerLabel->labeltype(FL_NORMAL_LABEL); listboxViewerLabel->labelfont(0); listboxViewerLabel->labelsize(14); listboxViewerLabel->labelcolor(FL_FOREGROUND_COLOR); listboxViewerLabel->callback((Fl_Callback*)cb_listboxViewerLabel); listboxViewerLabel->align(Fl_Align(FL_ALIGN_RIGHT)); listboxViewerLabel->when(FL_WHEN_RELEASE); listboxViewerLabel->add(_("None")); listboxViewerLabel->add(_("Audio frequency")); listboxViewerLabel->add(_("Radio frequency")); listboxViewerLabel->add(_("Channel number")); listboxViewerLabel->index(progdefaults.VIEWERlabeltype); o->labelsize(FL_NORMAL_SIZE); listboxViewerLabel->end(); } // Fl_ListBox* listboxViewerLabel { btnViewerFont = new Fl_Button(331, 151, 70, 24, _("Font...")); btnViewerFont->tooltip(_("select browser font")); btnViewerFont->callback((Fl_Callback*)cb_btnViewerFont); } // Fl_Button* btnViewerFont { Fl_Check_Button* o = btnFixedIntervals = new Fl_Check_Button(236, 137, 165, 20, _("Fixed Intervals")); btnFixedIntervals->tooltip(_("Force channel spacing to even 100 Hz increments")); btnFixedIntervals->down_box(FL_DOWN_BOX); btnFixedIntervals->value(1); btnFixedIntervals->callback((Fl_Callback*)cb_btnFixedIntervals); btnFixedIntervals->hide(); o->value(progdefaults.VIEWERfixed); } // Fl_Check_Button* btnFixedIntervals { Fl_Check_Button* o = btnMarquee = new Fl_Check_Button(46, 189, 165, 20, _("Continuous scrolling")); btnMarquee->tooltip(_("ON - Marquee style\nOFF - Clear & restart")); btnMarquee->down_box(FL_DOWN_BOX); btnMarquee->callback((Fl_Callback*)cb_btnMarquee); o->value(progdefaults.VIEWERmarquee); } // Fl_Check_Button* btnMarquee { Fl_Check_Button* o = btnAscend = new Fl_Check_Button(46, 213, 253, 20, _("Lowest freq on bottom of viewer")); btnAscend->tooltip(_("Change positions of low to high channels")); btnAscend->down_box(FL_DOWN_BOX); btnAscend->callback((Fl_Callback*)cb_btnAscend); o->value(progdefaults.VIEWERascend); } // Fl_Check_Button* btnAscend { Fl_Check_Button* o = btnBrowserHistory = new Fl_Check_Button(46, 238, 356, 20, _("Play back history when active channel selected")); btnBrowserHistory->tooltip(_("Audio stream history decoded on selected signal")); btnBrowserHistory->down_box(FL_DOWN_BOX); btnBrowserHistory->callback((Fl_Callback*)cb_btnBrowserHistory); o->value(progdefaults.VIEWERhistory); } // Fl_Check_Button* btnBrowserHistory { Fl_Group* o = new Fl_Group(40, 287, 144, 60, _("Detection Level")); o->box(FL_ENGRAVED_FRAME); { bwsrSliderColor = new Fl_Button(47, 310, 60, 24, _("Backgnd")); bwsrSliderColor->tooltip(_("Background color of signal viewer squelch control")); bwsrSliderColor->callback((Fl_Callback*)cb_bwsrSliderColor); bwsrSliderColor->align(Fl_Align(FL_ALIGN_TOP)); bwsrSliderColor->color(fl_rgb_color(progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G,progdefaults.bwsrSliderColor.B)); } // Fl_Button* bwsrSliderColor { bwsrSldrSelColor = new Fl_Button(115, 310, 60, 24, _("Button")); bwsrSldrSelColor->tooltip(_("Slider hilite color of signal viewer squelch control")); bwsrSldrSelColor->callback((Fl_Callback*)cb_bwsrSldrSelColor); bwsrSldrSelColor->align(Fl_Align(FL_ALIGN_TOP)); bwsrSldrSelColor->color(fl_rgb_color(progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G,progdefaults.bwsrSliderColor.B)); } // Fl_Button* bwsrSldrSelColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(192, 287, 326, 60, _("Browser Line Colors")); o->box(FL_ENGRAVED_FRAME); { bwsrHiLite_1_color = new Fl_Button(198, 309, 60, 24, _("HiLite 1")); bwsrHiLite_1_color->tooltip(_("PSK/RTTY Viewer HiLite Color 1")); bwsrHiLite_1_color->callback((Fl_Callback*)cb_bwsrHiLite_1_color); bwsrHiLite_1_color->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); } // Fl_Button* bwsrHiLite_1_color { bwsrHiLite_2_color = new Fl_Button(261, 309, 60, 24, _("HiLite 2")); bwsrHiLite_2_color->tooltip(_("PSK/RTTY Viewer HiLite Color 2")); bwsrHiLite_2_color->callback((Fl_Callback*)cb_bwsrHiLite_2_color); bwsrHiLite_2_color->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); } // Fl_Button* bwsrHiLite_2_color { bwsrHiLite_even_lines = new Fl_Button(324, 309, 60, 24, _("Even")); bwsrHiLite_even_lines->tooltip(_("Even lines")); bwsrHiLite_even_lines->callback((Fl_Callback*)cb_bwsrHiLite_even_lines); bwsrHiLite_even_lines->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); } // Fl_Button* bwsrHiLite_even_lines { bwsrHiLite_odd_lines = new Fl_Button(387, 309, 60, 24, _("Odd")); bwsrHiLite_odd_lines->tooltip(_("Odd lines")); bwsrHiLite_odd_lines->callback((Fl_Callback*)cb_bwsrHiLite_odd_lines); bwsrHiLite_odd_lines->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); } // Fl_Button* bwsrHiLite_odd_lines { bwsrHiLite_select = new Fl_Button(451, 309, 60, 24, _("Select")); bwsrHiLite_select->tooltip(_("Select line")); bwsrHiLite_select->callback((Fl_Callback*)cb_bwsrHiLite_select); bwsrHiLite_select->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); } // Fl_Button* bwsrHiLite_select o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabBrowser->end(); } // Fl_Group* tabBrowser { tabUserInterface = new Fl_Group(0, 50, 600, 340, _("General")); tabUserInterface->hide(); { Fl_Group* o = new Fl_Group(5, 59, 590, 76); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnShowTooltips = new Fl_Check_Button(75, 72, 120, 20, _("Show tooltips")); btnShowTooltips->tooltip(_("Enable / disable tooltips")); btnShowTooltips->down_box(FL_DOWN_BOX); btnShowTooltips->value(1); btnShowTooltips->callback((Fl_Callback*)cb_btnShowTooltips); o->value(progdefaults.tooltips); } // Fl_Check_Button* btnShowTooltips { Fl_Check_Button* o = chkMenuIcons = new Fl_Check_Button(219, 72, 150, 20, _("Show menu icons")); chkMenuIcons->tooltip(_("Enable / disable icons on menus")); chkMenuIcons->down_box(FL_DOWN_BOX); chkMenuIcons->callback((Fl_Callback*)cb_chkMenuIcons); o->value(progdefaults.menuicons); } // Fl_Check_Button* chkMenuIcons { Fl_ListBox* o = listboxScheme = new Fl_ListBox(193, 101, 80, 20, _("UI scheme")); listboxScheme->tooltip(_("Change application look and feel")); listboxScheme->box(FL_DOWN_BOX); listboxScheme->color(FL_BACKGROUND2_COLOR); listboxScheme->selection_color(FL_BACKGROUND_COLOR); listboxScheme->labeltype(FL_NORMAL_LABEL); listboxScheme->labelfont(0); listboxScheme->labelsize(14); listboxScheme->labelcolor(FL_FOREGROUND_COLOR); listboxScheme->callback((Fl_Callback*)cb_listboxScheme); listboxScheme->align(Fl_Align(FL_ALIGN_RIGHT)); listboxScheme->when(FL_WHEN_RELEASE); listboxScheme->add("base"); listboxScheme->add("gtk+"); listboxScheme->add("plastic"); listboxScheme->value(progdefaults.ui_scheme.c_str()); o->labelsize(FL_NORMAL_SIZE); listboxScheme->end(); } // Fl_ListBox* listboxScheme { bVisibleModes = new Fl_Button(58, 101, 110, 20, _("Visible modes")); bVisibleModes->tooltip(_("Select modes for menu access")); bVisibleModes->callback((Fl_Callback*)cb_bVisibleModes); } // Fl_Button* bVisibleModes { Fl_ListBox* o = listbox_language = new Fl_ListBox(375, 101, 170, 20, _("UI language")); listbox_language->tooltip(_("Changes take effect on next program startup")); listbox_language->box(FL_DOWN_BOX); listbox_language->color(FL_BACKGROUND2_COLOR); listbox_language->selection_color(FL_BACKGROUND_COLOR); listbox_language->labeltype(FL_NORMAL_LABEL); listbox_language->labelfont(0); listbox_language->labelsize(12); listbox_language->labelcolor(FL_FOREGROUND_COLOR); listbox_language->callback((Fl_Callback*)cb_listbox_language); listbox_language->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listbox_language->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_language->end(); } // Fl_ListBox* listbox_language o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 141, 590, 34); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_rx_lowercase = new Fl_Check_Button(45, 148, 441, 20, _("Print CW / RTTY / THROB / CONTESTIA in lowercase")); btn_rx_lowercase->down_box(FL_DOWN_BOX); btn_rx_lowercase->callback((Fl_Callback*)cb_btn_rx_lowercase); o->value(progdefaults.rx_lowercase); } // Fl_Check_Button* btn_rx_lowercase o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 177, 294, 65); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_tx_lowercase = new Fl_Check_Button(40, 186, 199, 20, _("Transmit lower case text")); btn_tx_lowercase->down_box(FL_DOWN_BOX); btn_tx_lowercase->callback((Fl_Callback*)cb_btn_tx_lowercase); o->value(progdefaults.tx_lowercase); } // Fl_Check_Button* btn_tx_lowercase o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 244, 590, 76, _("Exit prompts")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_save_config_on_exit = new Fl_Check_Button(45, 268, 264, 20, _("Prompt to save Configuration")); btn_save_config_on_exit->down_box(FL_DOWN_BOX); btn_save_config_on_exit->callback((Fl_Callback*)cb_btn_save_config_on_exit); o->value(progdefaults.SaveConfig); } // Fl_Check_Button* btn_save_config_on_exit { Fl_Check_Button* o = btn2_save_macros_on_exit = new Fl_Check_Button(45, 290, 264, 20, _("Prompt to save macro file")); btn2_save_macros_on_exit->tooltip(_("Write current macro set on program exit")); btn2_save_macros_on_exit->down_box(FL_DOWN_BOX); btn2_save_macros_on_exit->callback((Fl_Callback*)cb_btn2_save_macros_on_exit); o->value(progdefaults.SaveMacros); } // Fl_Check_Button* btn2_save_macros_on_exit { Fl_Check_Button* o = btn2NagMe = new Fl_Check_Button(322, 268, 188, 20, _("Prompt to save log")); btn2NagMe->tooltip(_("Bug me about saving log entries")); btn2NagMe->down_box(FL_DOWN_BOX); btn2NagMe->callback((Fl_Callback*)cb_btn2NagMe); o->value(progdefaults.NagMe); } // Fl_Check_Button* btn2NagMe { Fl_Check_Button* o = btn2_confirm_exit = new Fl_Check_Button(322, 290, 226, 20, _("Confirm exit")); btn2_confirm_exit->down_box(FL_DOWN_BOX); btn2_confirm_exit->callback((Fl_Callback*)cb_btn2_confirm_exit); o->value(progdefaults.confirmExit); } // Fl_Check_Button* btn2_confirm_exit o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 323, 590, 60, _("Check for updates")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_check_for_updates = new Fl_Check_Button(45, 346, 367, 20, _("Check for updates when starting program")); btn_check_for_updates->down_box(FL_DOWN_BOX); btn_check_for_updates->callback((Fl_Callback*)cb_btn_check_for_updates); o->value(progdefaults.check_for_updates); } // Fl_Check_Button* btn_check_for_updates o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(300, 177, 295, 65); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_tx_show_timer = new Fl_Check_Button(319, 186, 219, 20, _("Show TX timer")); btn_tx_show_timer->down_box(FL_DOWN_BOX); btn_tx_show_timer->callback((Fl_Callback*)cb_btn_tx_show_timer); o->value(progdefaults.show_tx_timer); } // Fl_Check_Button* btn_tx_show_timer { Fl_Spinner* o = val_tx_timeout = new Fl_Spinner(320, 211, 45, 24, _("TX deadmen timeout (mins)")); val_tx_timeout->minimum(0); val_tx_timeout->maximum(60); val_tx_timeout->value(10); val_tx_timeout->callback((Fl_Callback*)cb_val_tx_timeout); val_tx_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.tx_timeout); } // Fl_Spinner* val_tx_timeout o->end(); } // Fl_Group* o tabUserInterface->end(); } // Fl_Group* tabUserInterface { tabLogServer = new Fl_Group(0, 50, 600, 340, _("Log")); tabLogServer->hide(); { tabsLog = new Fl_Tabs(0, 50, 600, 340); { grp_Log_QSO = new Fl_Group(0, 75, 600, 315, _("QSO")); { Fl_Group* o = new Fl_Group(45, 99, 515, 250, _("QSO logging")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnNagMe = new Fl_Check_Button(77, 134, 236, 20, _("Prompt to save log on exit")); btnNagMe->tooltip(_("Bug me about saving log entries")); btnNagMe->down_box(FL_DOWN_BOX); btnNagMe->callback((Fl_Callback*)cb_btnNagMe); o->value(progdefaults.NagMe); } // Fl_Check_Button* btnNagMe { Fl_Check_Button* o = btnClearOnSave = new Fl_Check_Button(77, 163, 236, 20, _("Clear on save")); btnClearOnSave->tooltip(_("Clear log entries after saving or using macro ")); btnClearOnSave->down_box(FL_DOWN_BOX); btnClearOnSave->callback((Fl_Callback*)cb_btnClearOnSave); o->value(progdefaults.ClearOnSave); } // Fl_Check_Button* btnClearOnSave { Fl_Check_Button* o = btnCallUpperCase = new Fl_Check_Button(77, 192, 236, 20, _("Convert callsign to upper case")); btnCallUpperCase->tooltip(_("Force callsign field to UPPERCASE")); btnCallUpperCase->down_box(FL_DOWN_BOX); btnCallUpperCase->callback((Fl_Callback*)cb_btnCallUpperCase); o->value(progdefaults.calluppercase); } // Fl_Check_Button* btnCallUpperCase { Fl_Check_Button* o = btnAutoFillQSO = new Fl_Check_Button(77, 222, 236, 20, _("Auto-fill Country and Azimuth")); btnAutoFillQSO->tooltip(_("Fill in Country / Azimuth using cty.dat information")); btnAutoFillQSO->down_box(FL_DOWN_BOX); btnAutoFillQSO->callback((Fl_Callback*)cb_btnAutoFillQSO); o->value(progdefaults.autofill_qso_fields); } // Fl_Check_Button* btnAutoFillQSO { Fl_Check_Button* o = btnDateTimeSort = new Fl_Check_Button(330, 134, 190, 20, _("Sort by Date/Time OFF")); btnDateTimeSort->tooltip(_("Sort by date/time OFF - effects all ADIF/Cabrillo reports")); btnDateTimeSort->down_box(FL_DOWN_BOX); btnDateTimeSort->callback((Fl_Callback*)cb_btnDateTimeSort); o->value(progdefaults.sort_date_time_off); } // Fl_Check_Button* btnDateTimeSort { Fl_Check_Button* o = btndate_time_force = new Fl_Check_Button(330, 163, 190, 20, _("Date time ON == OFF")); btndate_time_force->tooltip(_("Force date/time ON == date/time OFF")); btndate_time_force->down_box(FL_DOWN_BOX); btndate_time_force->callback((Fl_Callback*)cb_btndate_time_force); o->value(progdefaults.force_date_time); } // Fl_Check_Button* btndate_time_force { Fl_Check_Button* o = btnRSTindefault = new Fl_Check_Button(330, 192, 213, 20, _("Default RST in to 599/59")); btnRSTindefault->tooltip(_("Clear log controls sets RST in to 599/59")); btnRSTindefault->down_box(FL_DOWN_BOX); btnRSTindefault->callback((Fl_Callback*)cb_btnRSTindefault); o->value(progdefaults.RSTin_default); } // Fl_Check_Button* btnRSTindefault { Fl_Check_Button* o = btnRSTdefault = new Fl_Check_Button(330, 222, 216, 20, _("Default RST out to 599/59")); btnRSTdefault->tooltip(_("Clear log controls sets RST out to 599/59")); btnRSTdefault->down_box(FL_DOWN_BOX); btnRSTdefault->callback((Fl_Callback*)cb_btnRSTdefault); o->value(progdefaults.RSTdefault); } // Fl_Check_Button* btnRSTdefault { Fl_Input2* o = txt_cty_dat_pathname = new Fl_Input2(197, 283, 346, 24, _("cty.dat folder")); txt_cty_dat_pathname->tooltip(_("Enter full path-name for cty.dat folder")); txt_cty_dat_pathname->box(FL_DOWN_BOX); txt_cty_dat_pathname->color(FL_BACKGROUND2_COLOR); txt_cty_dat_pathname->selection_color(FL_SELECTION_COLOR); txt_cty_dat_pathname->labeltype(FL_NORMAL_LABEL); txt_cty_dat_pathname->labelfont(0); txt_cty_dat_pathname->labelsize(14); txt_cty_dat_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_cty_dat_pathname->callback((Fl_Callback*)cb_txt_cty_dat_pathname); txt_cty_dat_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_cty_dat_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.cty_dat_pathname.c_str()); } // Fl_Input2* txt_cty_dat_pathname { btn_select_cty_dat = new Fl_Button(78, 312, 75, 24, _("Browse")); btn_select_cty_dat->tooltip(_("Locate cty.dat file")); btn_select_cty_dat->callback((Fl_Callback*)cb_btn_select_cty_dat); } // Fl_Button* btn_select_cty_dat { btn_default_cty_dat = new Fl_Button(173, 312, 75, 24, _("Default")); btn_default_cty_dat->tooltip(_("Restore cty.dat default folder")); btn_default_cty_dat->callback((Fl_Callback*)cb_btn_default_cty_dat); } // Fl_Button* btn_default_cty_dat { btn_reload_cty_dat = new Fl_Button(268, 312, 75, 24, _("Reload")); btn_reload_cty_dat->tooltip(_("Reload cty.dat")); btn_reload_cty_dat->callback((Fl_Callback*)cb_btn_reload_cty_dat); } // Fl_Button* btn_reload_cty_dat { Fl_Input2* o = inpMyPower = new Fl_Input2(493, 312, 50, 24, _("Transmit Power")); inpMyPower->tooltip(_("Tx power used for logbook entries")); inpMyPower->box(FL_DOWN_BOX); inpMyPower->color(FL_BACKGROUND2_COLOR); inpMyPower->selection_color(FL_SELECTION_COLOR); inpMyPower->labeltype(FL_NORMAL_LABEL); inpMyPower->labelfont(0); inpMyPower->labelsize(14); inpMyPower->labelcolor(FL_FOREGROUND_COLOR); inpMyPower->callback((Fl_Callback*)cb_inpMyPower); inpMyPower->align(Fl_Align(FL_ALIGN_LEFT)); inpMyPower->when(FL_WHEN_RELEASE); o->value(progdefaults.mytxpower.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyPower { Fl_Check_Button* o = btnDisplayLogbookRead = new Fl_Check_Button(77, 252, 277, 20, _("Display logbook read datum at start")); btnDisplayLogbookRead->tooltip(_("The filename is written to the RX text area")); btnDisplayLogbookRead->down_box(FL_DOWN_BOX); btnDisplayLogbookRead->callback((Fl_Callback*)cb_btnDisplayLogbookRead); o->value(progdefaults.DisplayLogbookRead); } // Fl_Check_Button* btnDisplayLogbookRead o->end(); } // Fl_Group* o grp_Log_QSO->end(); } // Fl_Group* grp_Log_QSO { grpRX_Text = new Fl_Group(0, 75, 600, 315, _("Rx Text")); grpRX_Text->hide(); { Fl_Group* o = new Fl_Group(2, 96, 596, 131, _("Rx Text")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnRXClicks = new Fl_Check_Button(62, 159, 191, 20, _("Single-click to capture")); btnRXClicks->tooltip(_("Enable for single click capure of text in Rx panel")); btnRXClicks->down_box(FL_DOWN_BOX); btnRXClicks->callback((Fl_Callback*)cb_btnRXClicks); o->value(progdefaults.rxtext_clicks_qso_data); } // Fl_Check_Button* btnRXClicks { Fl_Check_Button* o = btnRXTooltips = new Fl_Check_Button(304, 159, 254, 20, _("callsign tooltips in received text")); btnRXTooltips->tooltip(_("Popup info after a 2 second hover on a callsign")); btnRXTooltips->down_box(FL_DOWN_BOX); btnRXTooltips->callback((Fl_Callback*)cb_btnRXTooltips); o->value(progdefaults.rxtext_tooltips); } // Fl_Check_Button* btnRXTooltips { Fl_Input2* o = inpNonword = new Fl_Input2(204, 125, 279, 24, _("Word delimiters")); inpNonword->tooltip(_("RX text QSO data entry is bounded by the non-word characters\ndefined here. T\ ab and newline are automatically included.")); inpNonword->box(FL_DOWN_BOX); inpNonword->color(FL_BACKGROUND2_COLOR); inpNonword->selection_color(FL_SELECTION_COLOR); inpNonword->labeltype(FL_NORMAL_LABEL); inpNonword->labelfont(0); inpNonword->labelsize(14); inpNonword->labelcolor(FL_FOREGROUND_COLOR); inpNonword->textfont(4); inpNonword->callback((Fl_Callback*)cb_inpNonword); inpNonword->align(Fl_Align(FL_ALIGN_LEFT)); inpNonword->when(FL_WHEN_RELEASE); o->value(progdefaults.nonwordchars.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNonword { Fl_Check_Button* o = btnUSunits = new Fl_Check_Button(304, 188, 220, 20, _("US units of distance (QRB)")); btnUSunits->tooltip(_("Enable for single click capure of text in Rx panel")); btnUSunits->down_box(FL_DOWN_BOX); btnUSunits->callback((Fl_Callback*)cb_btnUSunits); o->value(progdefaults.us_units); } // Fl_Check_Button* btnUSunits { Fl_Check_Button* o = btn_clear_fields = new Fl_Check_Button(62, 188, 198, 20, _("Clear log fields - new CALL")); btn_clear_fields->down_box(FL_DOWN_BOX); btn_clear_fields->callback((Fl_Callback*)cb_btn_clear_fields); o->value(progdefaults.clear_fields); } // Fl_Check_Button* btn_clear_fields o->end(); } // Fl_Group* o grpRX_Text->end(); } // Fl_Group* grpRX_Text { grpMacLogger = new Fl_Group(0, 75, 600, 315, _("MacLogger")); grpMacLogger->hide(); { Fl_Check_Button* o = btnConnectToMaclogger = new Fl_Check_Button(10, 91, 186, 20, _("Connect to MacLogger")); btnConnectToMaclogger->down_box(FL_DOWN_BOX); btnConnectToMaclogger->callback((Fl_Callback*)cb_btnConnectToMaclogger); o->value(progdefaults.connect_to_maclogger); } // Fl_Check_Button* btnConnectToMaclogger { Fl_Check_Button* o = btn_capture_maclogger_radio = new Fl_Check_Button(205, 91, 186, 20, _("Capture Radio Report")); btn_capture_maclogger_radio->down_box(FL_DOWN_BOX); btn_capture_maclogger_radio->value(1); btn_capture_maclogger_radio->callback((Fl_Callback*)cb_btn_capture_maclogger_radio); o->value(progdefaults.capture_maclogger_radio); } // Fl_Check_Button* btn_capture_maclogger_radio { Fl_Check_Button* o = btn_capture_maclogger_log = new Fl_Check_Button(205, 116, 186, 21, _("Capture Log Report")); btn_capture_maclogger_log->down_box(FL_DOWN_BOX); btn_capture_maclogger_log->callback((Fl_Callback*)cb_btn_capture_maclogger_log); o->value(progdefaults.capture_maclogger_log); } // Fl_Check_Button* btn_capture_maclogger_log { Fl_Check_Button* o = btn_capture_maclogger_lookup = new Fl_Check_Button(405, 91, 186, 20, _("Capture Lookup ")); btn_capture_maclogger_lookup->down_box(FL_DOWN_BOX); btn_capture_maclogger_lookup->callback((Fl_Callback*)cb_btn_capture_maclogger_lookup); o->value(progdefaults.capture_maclogger_lookup); } // Fl_Check_Button* btn_capture_maclogger_lookup { Fl_Check_Button* o = btn_capture_maclogger_spot_tune = new Fl_Check_Button(405, 116, 186, 21, _("Capture Spot Tune")); btn_capture_maclogger_spot_tune->down_box(FL_DOWN_BOX); btn_capture_maclogger_spot_tune->callback((Fl_Callback*)cb_btn_capture_maclogger_spot_tune); o->value(progdefaults.capture_maclogger_spot_tune); } // Fl_Check_Button* btn_capture_maclogger_spot_tune { Fl_Check_Button* o = btn_capture_maclogger_spot_report = new Fl_Check_Button(405, 144, 186, 21, _("Capture Spot Report")); btn_capture_maclogger_spot_report->down_box(FL_DOWN_BOX); btn_capture_maclogger_spot_report->callback((Fl_Callback*)cb_btn_capture_maclogger_spot_report); o->value(progdefaults.capture_maclogger_spot_report); } // Fl_Check_Button* btn_capture_maclogger_spot_report { Fl_Check_Button* o = btn_enable_maclogger_log = new Fl_Check_Button(10, 173, 165, 26, _("Enable UDP log file")); btn_enable_maclogger_log->down_box(FL_DOWN_BOX); btn_enable_maclogger_log->callback((Fl_Callback*)cb_btn_enable_maclogger_log); o->value(progdefaults.enable_maclogger_log); } // Fl_Check_Button* btn_enable_maclogger_log { Fl_Text_Display* o = txt_UDP_data = new Fl_Text_Display(10, 220, 580, 161, _("UDP data stream")); txt_UDP_data->align(Fl_Align(FL_ALIGN_TOP_LEFT)); Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer(); o->buffer(txtbuffer); } // Fl_Text_Display* txt_UDP_data { Fl_Output* o = txt_maclogger_log_filename = new Fl_Output(178, 173, 272, 26); o->value(progdefaults.maclogger_log_filename.c_str()); } // Fl_Output* txt_maclogger_log_filename { Fl_Button* o = new Fl_Button(460, 173, 129, 26, _("Clear UDP text")); o->callback((Fl_Callback*)cb_Clear); } // Fl_Button* o grpMacLogger->end(); } // Fl_Group* grpMacLogger { grpN3FJP_logs = new Fl_Group(0, 75, 600, 315, _("N3FJP logs")); grpN3FJP_logs->hide(); { Fl_Text_Display* o = txt_N3FJP_data = new Fl_Text_Display(5, 145, 590, 150, _("TCP/IP Data Stream")); txt_N3FJP_data->align(Fl_Align(FL_ALIGN_TOP_LEFT)); Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer(); o->buffer(txtbuffer); } // Fl_Text_Display* txt_N3FJP_data { Fl_Button* o = new Fl_Button(501, 298, 90, 24, _("Clear text")); o->callback((Fl_Callback*)cb_Clear1); } // Fl_Button* o { Fl_Input2* o = txt_N3FJP_ip_address = new Fl_Input2(5, 100, 350, 25, _("Address")); txt_N3FJP_ip_address->tooltip(_("N3FJP Server IP Address")); txt_N3FJP_ip_address->box(FL_DOWN_BOX); txt_N3FJP_ip_address->color(FL_BACKGROUND2_COLOR); txt_N3FJP_ip_address->selection_color(FL_SELECTION_COLOR); txt_N3FJP_ip_address->labeltype(FL_NORMAL_LABEL); txt_N3FJP_ip_address->labelfont(0); txt_N3FJP_ip_address->labelsize(14); txt_N3FJP_ip_address->labelcolor(FL_FOREGROUND_COLOR); txt_N3FJP_ip_address->callback((Fl_Callback*)cb_txt_N3FJP_ip_address); txt_N3FJP_ip_address->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_N3FJP_ip_address->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.N3FJP_address.c_str()); } // Fl_Input2* txt_N3FJP_ip_address { Fl_Input2* o = txt_N3FJP_ip_port_no = new Fl_Input2(365, 100, 55, 25, _("Port")); txt_N3FJP_ip_port_no->tooltip(_("N3FJP Server IP Port")); txt_N3FJP_ip_port_no->box(FL_DOWN_BOX); txt_N3FJP_ip_port_no->color(FL_BACKGROUND2_COLOR); txt_N3FJP_ip_port_no->selection_color(FL_SELECTION_COLOR); txt_N3FJP_ip_port_no->labeltype(FL_NORMAL_LABEL); txt_N3FJP_ip_port_no->labelfont(0); txt_N3FJP_ip_port_no->labelsize(14); txt_N3FJP_ip_port_no->labelcolor(FL_FOREGROUND_COLOR); txt_N3FJP_ip_port_no->callback((Fl_Callback*)cb_txt_N3FJP_ip_port_no); txt_N3FJP_ip_port_no->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_N3FJP_ip_port_no->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.N3FJP_port.c_str()); } // Fl_Input2* txt_N3FJP_ip_port_no { btn_default_N3FJP_ip = new Fl_Button(423, 100, 67, 25, _("Default")); btn_default_N3FJP_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btn_default_N3FJP_ip->callback((Fl_Callback*)cb_btn_default_N3FJP_ip); } // Fl_Button* btn_default_N3FJP_ip { Fl_Check_Button* o = btn_enable_N3FJP_log = new Fl_Check_Button(10, 297, 165, 26, _("Enable Data Stream")); btn_enable_N3FJP_log->down_box(FL_DOWN_BOX); btn_enable_N3FJP_log->callback((Fl_Callback*)cb_btn_enable_N3FJP_log); o->value(progdefaults.enable_N3FJP_log); } // Fl_Check_Button* btn_enable_N3FJP_log { Fl_Check_Button* o = btn_connect_to_n3fjp = new Fl_Check_Button(495, 90, 70, 15, _("Connect")); btn_connect_to_n3fjp->down_box(FL_DOWN_BOX); btn_connect_to_n3fjp->callback((Fl_Callback*)cb_btn_connect_to_n3fjp); o->value(progdefaults.connect_to_n3fjp); } // Fl_Check_Button* btn_connect_to_n3fjp { box_n3fjp_connected = new Fl_Box(495, 117, 16, 16, _("Connected")); box_n3fjp_connected->box(FL_DIAMOND_DOWN_BOX); box_n3fjp_connected->color(FL_LIGHT2); box_n3fjp_connected->selection_color((Fl_Color)58); box_n3fjp_connected->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_n3fjp_connected { Fl_Check_Button* o = btn_N3FJP_sweet_spot = new Fl_Check_Button(10, 350, 255, 26, _("Center DXspot freq at sweet spot")); btn_N3FJP_sweet_spot->tooltip(_("N3FJP DX spots centered on mode sweet spot")); btn_N3FJP_sweet_spot->down_box(FL_DOWN_BOX); btn_N3FJP_sweet_spot->callback((Fl_Callback*)cb_btn_N3FJP_sweet_spot); o->value(progdefaults.N3FJP_sweet_spot); } // Fl_Check_Button* btn_N3FJP_sweet_spot { Fl_Check_Button* o = btn_N3FJP_modem_carrier = new Fl_Check_Button(275, 350, 255, 26, _("Report actual modem RF frequency")); btn_N3FJP_modem_carrier->tooltip(_("Suppressed carrier +/- AF injection frequency")); btn_N3FJP_modem_carrier->down_box(FL_DOWN_BOX); btn_N3FJP_modem_carrier->callback((Fl_Callback*)cb_btn_N3FJP_modem_carrier); o->value(progdefaults.N3FJP_modem_carrier); } // Fl_Check_Button* btn_N3FJP_modem_carrier { Fl_Check_Button* o = btn_enable_N3FJP_RIGTX = new Fl_Check_Button(10, 324, 165, 26, _("PTT via and ")); btn_enable_N3FJP_RIGTX->down_box(FL_DOWN_BOX); btn_enable_N3FJP_RIGTX->callback((Fl_Callback*)cb_btn_enable_N3FJP_RIGTX); o->value(progdefaults.enable_N3FJP_RIGTX); } // Fl_Check_Button* btn_enable_N3FJP_RIGTX grpN3FJP_logs->end(); } // Fl_Group* grpN3FJP_logs tabsLog->end(); } // Fl_Tabs* tabsLog tabLogServer->end(); } // Fl_Group* tabLogServer { tabLogContests = new Fl_Group(0, 50, 604, 340, _("Contests")); tabLogContests->hide(); { tabs_contests = new Fl_Tabs(0, 50, 604, 340); { grpGeneral_contest = new Fl_Group(0, 75, 600, 315, _("General")); { Fl_ListBox* o = listbox_contest = new Fl_ListBox(86, 84, 500, 24, _("Contest")); listbox_contest->tooltip(_("Select Logging as QSO or Contest")); listbox_contest->box(FL_DOWN_BOX); listbox_contest->color(FL_BACKGROUND2_COLOR); listbox_contest->selection_color(FL_BACKGROUND_COLOR); listbox_contest->labeltype(FL_NORMAL_LABEL); listbox_contest->labelfont(0); listbox_contest->labelsize(14); listbox_contest->labelcolor(FL_FOREGROUND_COLOR); listbox_contest->callback((Fl_Callback*)cb_listbox_contest); listbox_contest->align(Fl_Align(FL_ALIGN_LEFT)); listbox_contest->when(FL_WHEN_RELEASE); o->add(contest_names().c_str()); o->index(progdefaults.logging); listbox_contest->end(); } // Fl_ListBox* listbox_contest { Fl_ListBox* o = listbox_QP_contests = new Fl_ListBox(166, 118, 420, 24, _("State QSO Party")); listbox_QP_contests->box(FL_DOWN_BOX); listbox_QP_contests->color(FL_BACKGROUND2_COLOR); listbox_QP_contests->selection_color(FL_BACKGROUND_COLOR); listbox_QP_contests->labeltype(FL_NORMAL_LABEL); listbox_QP_contests->labelfont(0); listbox_QP_contests->labelsize(14); listbox_QP_contests->labelcolor(FL_FOREGROUND_COLOR); listbox_QP_contests->callback((Fl_Callback*)cb_listbox_QP_contests); listbox_QP_contests->align(Fl_Align(FL_ALIGN_LEFT)); listbox_QP_contests->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->add(QSOparties.names().c_str()); o->index(progdefaults.SQSOcontest); listbox_QP_contests->end(); } // Fl_ListBox* listbox_QP_contests { Fl_Input2* o = inp_contest_notes = new Fl_Input2(166, 153, 420, 24, _("Text capture order")); inp_contest_notes->tooltip(_("Context Notes")); inp_contest_notes->box(FL_DOWN_BOX); inp_contest_notes->color(FL_BACKGROUND2_COLOR); inp_contest_notes->selection_color(FL_SELECTION_COLOR); inp_contest_notes->labeltype(FL_NORMAL_LABEL); inp_contest_notes->labelfont(0); inp_contest_notes->labelsize(14); inp_contest_notes->labelcolor(FL_FOREGROUND_COLOR); inp_contest_notes->align(Fl_Align(FL_ALIGN_LEFT)); inp_contest_notes->when(FL_WHEN_RELEASE); o->value(progdefaults.CONTESTnotes.c_str()); } // Fl_Input2* inp_contest_notes { Fl_Group* o = new Fl_Group(3, 192, 590, 86, _("Duplicate check, CALL plus")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Light_Button* o = btnDupCheckOn = new Fl_Light_Button(20, 217, 74, 20, _("On/Off")); btnDupCheckOn->tooltip(_("Check for duplicates")); btnDupCheckOn->selection_color((Fl_Color)2); btnDupCheckOn->callback((Fl_Callback*)cb_btnDupCheckOn); o->value(progdefaults.EnableDupCheck); } // Fl_Light_Button* btnDupCheckOn { Fl_Check_Button* o = btnDupBand = new Fl_Check_Button(132, 217, 70, 20, _("Band")); btnDupBand->tooltip(_("Bands must match")); btnDupBand->down_box(FL_DOWN_BOX); btnDupBand->callback((Fl_Callback*)cb_btnDupBand); o->value(progdefaults.dupband); } // Fl_Check_Button* btnDupBand { Fl_Check_Button* o = btnDupMode = new Fl_Check_Button(245, 217, 70, 20, _("Mode")); btnDupMode->tooltip(_("Mode must match")); btnDupMode->down_box(FL_DOWN_BOX); btnDupMode->callback((Fl_Callback*)cb_btnDupMode); o->value(progdefaults.dupmode); } // Fl_Check_Button* btnDupMode { Fl_Check_Button* o = btnDupTimeSpan = new Fl_Check_Button(370, 217, 129, 20, _("Time span over")); btnDupTimeSpan->tooltip(_("QSO must not occur within a time period of")); btnDupTimeSpan->down_box(FL_DOWN_BOX); btnDupTimeSpan->callback((Fl_Callback*)cb_btnDupTimeSpan); o->value(progdefaults.duptimespan); } // Fl_Check_Button* btnDupTimeSpan { Fl_Button* o = btnDupColor = new Fl_Button(20, 244, 90, 24, _("Dup Color")); btnDupColor->tooltip(_("Left click to select dup color")); btnDupColor->box(FL_DOWN_BOX); btnDupColor->down_box(FL_DOWN_BOX); btnDupColor->color(FL_BACKGROUND2_COLOR); btnDupColor->selection_color(FL_BACKGROUND2_COLOR); btnDupColor->callback((Fl_Callback*)cb_btnDupColor); o->color(fl_rgb_color(progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); } // Fl_Button* btnDupColor { Fl_Button* o = btnPossibleDupColor = new Fl_Button(132, 244, 90, 24, _("? Dup Color")); btnPossibleDupColor->tooltip(_("Left click to select possible dup color")); btnPossibleDupColor->box(FL_DOWN_BOX); btnPossibleDupColor->down_box(FL_DOWN_BOX); btnPossibleDupColor->color(FL_BACKGROUND2_COLOR); btnPossibleDupColor->selection_color(FL_BACKGROUND2_COLOR); btnPossibleDupColor->callback((Fl_Callback*)cb_btnPossibleDupColor); o->color(fl_rgb_color(progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B)); } // Fl_Button* btnPossibleDupColor { Fl_Check_Button* o = btnDupXchg1 = new Fl_Check_Button(245, 246, 105, 20, _("Exchange In")); btnDupXchg1->tooltip(_("free form 1 must match")); btnDupXchg1->down_box(FL_DOWN_BOX); btnDupXchg1->callback((Fl_Callback*)cb_btnDupXchg1); o->value(progdefaults.dupxchg1); } // Fl_Check_Button* btnDupXchg1 { Fl_Check_Button* o = btnDupState = new Fl_Check_Button(370, 246, 70, 20, _("State")); btnDupState->tooltip(_("State must match")); btnDupState->down_box(FL_DOWN_BOX); btnDupState->callback((Fl_Callback*)cb_btnDupState); o->value(progdefaults.dupstate); } // Fl_Check_Button* btnDupState { Fl_Value_Input2* o = nbrTimeSpan = new Fl_Value_Input2(463, 244, 53, 24, _("minutes")); nbrTimeSpan->tooltip(_("Enter time span in minutes")); nbrTimeSpan->box(FL_DOWN_BOX); nbrTimeSpan->color(FL_BACKGROUND2_COLOR); nbrTimeSpan->selection_color(FL_SELECTION_COLOR); nbrTimeSpan->labeltype(FL_NORMAL_LABEL); nbrTimeSpan->labelfont(0); nbrTimeSpan->labelsize(14); nbrTimeSpan->labelcolor(FL_FOREGROUND_COLOR); nbrTimeSpan->maximum(1440); nbrTimeSpan->step(1); nbrTimeSpan->value(120); nbrTimeSpan->callback((Fl_Callback*)cb_nbrTimeSpan); nbrTimeSpan->align(Fl_Align(FL_ALIGN_RIGHT)); nbrTimeSpan->when(FL_WHEN_CHANGED); o->value(progdefaults.timespan); } // Fl_Value_Input2* nbrTimeSpan o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(3, 276, 590, 100, _("Contest Exchange / Serial #")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inpSend1 = new Fl_Input2(68, 300, 200, 24, _("Send")); inpSend1->tooltip(_("free form exchange")); inpSend1->box(FL_DOWN_BOX); inpSend1->color(FL_BACKGROUND2_COLOR); inpSend1->selection_color(FL_SELECTION_COLOR); inpSend1->labeltype(FL_NORMAL_LABEL); inpSend1->labelfont(0); inpSend1->labelsize(14); inpSend1->labelcolor(FL_FOREGROUND_COLOR); inpSend1->callback((Fl_Callback*)cb_inpSend1); inpSend1->align(Fl_Align(FL_ALIGN_LEFT)); inpSend1->when(FL_WHEN_RELEASE); o->value(progdefaults.myXchg.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpSend1 { Fl_Check_Button* o = btn599 = new Fl_Check_Button(283, 302, 130, 20, _("RST always 599/59")); btn599->tooltip(_("Force RST in/out to 599/59")); btn599->down_box(FL_DOWN_BOX); btn599->callback((Fl_Callback*)cb_btn599); o->value(progdefaults.fixed599); } // Fl_Check_Button* btn599 { Fl_Check_Button* o = btnCutNbrs = new Fl_Check_Button(443, 302, 139, 20, _("Send CW cut #\'s")); btnCutNbrs->tooltip(_("0 = T; 9 = N")); btnCutNbrs->down_box(FL_DOWN_BOX); btnCutNbrs->callback((Fl_Callback*)cb_btnCutNbrs); o->value(progdefaults.cutnbrs); } // Fl_Check_Button* btnCutNbrs { Fl_Group* o = new Fl_Group(10, 329, 576, 42); o->box(FL_ENGRAVED_FRAME); { Fl_Value_Input2* o = nbrContestStart = new Fl_Value_Input2(97, 338, 45, 24, _("Start Nbr")); nbrContestStart->tooltip(_("Starting number")); nbrContestStart->box(FL_DOWN_BOX); nbrContestStart->color(FL_BACKGROUND2_COLOR); nbrContestStart->selection_color(FL_SELECTION_COLOR); nbrContestStart->labeltype(FL_NORMAL_LABEL); nbrContestStart->labelfont(0); nbrContestStart->labelsize(14); nbrContestStart->labelcolor(FL_FOREGROUND_COLOR); nbrContestStart->maximum(10000); nbrContestStart->step(1); nbrContestStart->callback((Fl_Callback*)cb_nbrContestStart); nbrContestStart->align(Fl_Align(FL_ALIGN_LEFT)); nbrContestStart->when(FL_WHEN_CHANGED); o->value(progdefaults.ContestStart); } // Fl_Value_Input2* nbrContestStart { nbrContestDigits = new Fl_Value_Input2(219, 338, 46, 24, _("Digits")); nbrContestDigits->tooltip(_("Number of digits in serial number")); nbrContestDigits->box(FL_DOWN_BOX); nbrContestDigits->color(FL_BACKGROUND2_COLOR); nbrContestDigits->selection_color(FL_SELECTION_COLOR); nbrContestDigits->labeltype(FL_NORMAL_LABEL); nbrContestDigits->labelfont(0); nbrContestDigits->labelsize(14); nbrContestDigits->labelcolor(FL_FOREGROUND_COLOR); nbrContestDigits->minimum(1); nbrContestDigits->maximum(5); nbrContestDigits->step(1); nbrContestDigits->value(3); nbrContestDigits->callback((Fl_Callback*)cb_nbrContestDigits); nbrContestDigits->align(Fl_Align(FL_ALIGN_LEFT)); nbrContestDigits->when(FL_WHEN_CHANGED); } // Fl_Value_Input2* nbrContestDigits { btnUseLeadingZeros = new Fl_Check_Button(284, 340, 157, 20, _("Use leading zeros")); btnUseLeadingZeros->tooltip(_("Insert leading zeros into Xmtd serial number")); btnUseLeadingZeros->down_box(FL_DOWN_BOX); btnUseLeadingZeros->value(1); btnUseLeadingZeros->callback((Fl_Callback*)cb_btnUseLeadingZeros); } // Fl_Check_Button* btnUseLeadingZeros { btnResetSerNbr = new Fl_Button(481, 338, 71, 24, _("Reset")); btnResetSerNbr->tooltip(_("Initialize the QSO logging fields")); btnResetSerNbr->callback((Fl_Callback*)cb_btnResetSerNbr); } // Fl_Button* btnResetSerNbr o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o grpGeneral_contest->end(); } // Fl_Group* grpGeneral_contest { grpFD_contest = new Fl_Group(0, 75, 600, 315, _("Field Day")); grpFD_contest->hide(); { Fl_Group* o = new Fl_Group(5, 88, 590, 53, _("Field Day")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inp_my_FD_call = new Fl_Input2(176, 104, 80, 24, _("Operator Call")); inp_my_FD_call->tooltip(_("Field Day Callsign\nMay be same as OP callsign")); inp_my_FD_call->box(FL_DOWN_BOX); inp_my_FD_call->color(FL_BACKGROUND2_COLOR); inp_my_FD_call->selection_color(FL_SELECTION_COLOR); inp_my_FD_call->labeltype(FL_NORMAL_LABEL); inp_my_FD_call->labelfont(0); inp_my_FD_call->labelsize(14); inp_my_FD_call->labelcolor(FL_FOREGROUND_COLOR); inp_my_FD_call->callback((Fl_Callback*)cb_inp_my_FD_call); inp_my_FD_call->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_FD_call->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_op_call.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_FD_call { Fl_Input2* o = inp_my_FD_section = new Fl_Input2(484, 104, 45, 24, _("My Section")); inp_my_FD_section->tooltip(_("Field Day Section")); inp_my_FD_section->box(FL_DOWN_BOX); inp_my_FD_section->color(FL_BACKGROUND2_COLOR); inp_my_FD_section->selection_color(FL_SELECTION_COLOR); inp_my_FD_section->labeltype(FL_NORMAL_LABEL); inp_my_FD_section->labelfont(0); inp_my_FD_section->labelsize(14); inp_my_FD_section->labelcolor(FL_FOREGROUND_COLOR); inp_my_FD_section->callback((Fl_Callback*)cb_inp_my_FD_section); inp_my_FD_section->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_FD_section->when(FL_WHEN_RELEASE); o->value(progdefaults.my_FD_section.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_FD_section { Fl_Input2* o = inp_my_FD_class = new Fl_Input2(337, 104, 50, 24, _("My Class")); inp_my_FD_class->tooltip(_("Field Day Class")); inp_my_FD_class->box(FL_DOWN_BOX); inp_my_FD_class->color(FL_BACKGROUND2_COLOR); inp_my_FD_class->selection_color(FL_SELECTION_COLOR); inp_my_FD_class->labeltype(FL_NORMAL_LABEL); inp_my_FD_class->labelfont(0); inp_my_FD_class->labelsize(14); inp_my_FD_class->labelcolor(FL_FOREGROUND_COLOR); inp_my_FD_class->callback((Fl_Callback*)cb_inp_my_FD_class); inp_my_FD_class->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_FD_class->when(FL_WHEN_RELEASE); o->value(progdefaults.my_FD_class.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_FD_class o->end(); } // Fl_Group* o grpFD_contest->end(); } // Fl_Group* grpFD_contest { grpJOTA_contest = new Fl_Group(0, 75, 600, 315, _("JOTA/School")); grpJOTA_contest->hide(); { Fl_Group* o = new Fl_Group(10, 179, 580, 53, _("School Round Up")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inp_my_SCR_class = new Fl_Input2(196, 201, 69, 24, _("My Class")); inp_my_SCR_class->tooltip(_("School Round Up - allowable I, H, O - see rules")); inp_my_SCR_class->box(FL_DOWN_BOX); inp_my_SCR_class->color(FL_BACKGROUND2_COLOR); inp_my_SCR_class->selection_color(FL_SELECTION_COLOR); inp_my_SCR_class->labeltype(FL_NORMAL_LABEL); inp_my_SCR_class->labelfont(0); inp_my_SCR_class->labelsize(14); inp_my_SCR_class->labelcolor(FL_FOREGROUND_COLOR); inp_my_SCR_class->callback((Fl_Callback*)cb_inp_my_SCR_class); inp_my_SCR_class->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_SCR_class->when(FL_WHEN_RELEASE); o->value(progdefaults.my_SCR_class.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_SCR_class o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(10, 86, 580, 89, _("Jamboree OTA")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inp_my_JOTA_troop = new Fl_Input2(195, 109, 200, 24, _("My Troop")); inp_my_JOTA_troop->tooltip(_("My JOTA Troop")); inp_my_JOTA_troop->box(FL_DOWN_BOX); inp_my_JOTA_troop->color(FL_BACKGROUND2_COLOR); inp_my_JOTA_troop->selection_color(FL_SELECTION_COLOR); inp_my_JOTA_troop->labeltype(FL_NORMAL_LABEL); inp_my_JOTA_troop->labelfont(0); inp_my_JOTA_troop->labelsize(14); inp_my_JOTA_troop->labelcolor(FL_FOREGROUND_COLOR); inp_my_JOTA_troop->callback((Fl_Callback*)cb_inp_my_JOTA_troop); inp_my_JOTA_troop->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_JOTA_troop->when(FL_WHEN_RELEASE); o->value(progdefaults.my_JOTA_troop.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_JOTA_troop { Fl_Input2* o = inp_my_JOTA_scout = new Fl_Input2(195, 140, 200, 24, _("Scout Op\'")); inp_my_JOTA_scout->tooltip(_("Scout Operator Name")); inp_my_JOTA_scout->box(FL_DOWN_BOX); inp_my_JOTA_scout->color(FL_BACKGROUND2_COLOR); inp_my_JOTA_scout->selection_color(FL_SELECTION_COLOR); inp_my_JOTA_scout->labeltype(FL_NORMAL_LABEL); inp_my_JOTA_scout->labelfont(0); inp_my_JOTA_scout->labelsize(14); inp_my_JOTA_scout->labelcolor(FL_FOREGROUND_COLOR); inp_my_JOTA_scout->callback((Fl_Callback*)cb_inp_my_JOTA_scout); inp_my_JOTA_scout->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_JOTA_scout->when(FL_WHEN_RELEASE); o->value(progdefaults.my_JOTA_scout.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_JOTA_scout o->end(); } // Fl_Group* o grpJOTA_contest->end(); } // Fl_Group* grpJOTA_contest tabs_contests->end(); } // Fl_Tabs* tabs_contests tabLogContests->end(); } // Fl_Group* tabLogContests { tabMBars = new Fl_Group(0, 50, 600, 340, _("Macros")); tabMBars->hide(); { Fl_Group* o = new Fl_Group(5, 240, 590, 35); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnMacroMouseWheel = new Fl_Check_Button(62, 248, 296, 20, _("Mouse wheel active on macro buttons")); btnMacroMouseWheel->tooltip(_("enable mouse wheel control of macro bar")); btnMacroMouseWheel->down_box(FL_DOWN_BOX); btnMacroMouseWheel->callback((Fl_Callback*)cb_btnMacroMouseWheel); o->value(progdefaults.macro_wheel); } // Fl_Check_Button* btnMacroMouseWheel o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 60, 590, 180, _("Number and position of macro bars")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cnt_macro_height = new Fl_Counter(215, 85, 89, 22, _("Button Height")); cnt_macro_height->tooltip(_("Height of macro bar")); cnt_macro_height->type(1); cnt_macro_height->minimum(18); cnt_macro_height->maximum(30); cnt_macro_height->step(1); cnt_macro_height->value(20); cnt_macro_height->callback((Fl_Callback*)cb_cnt_macro_height); cnt_macro_height->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.macro_height); } // Fl_Counter* cnt_macro_height { btn_scheme_0 = new Fl_Round_Button(61, 113, 144, 22, _("One above Rx/Tx")); btn_scheme_0->tooltip(_("Single macro bar below logging panel\nvariable height")); btn_scheme_0->type(102); btn_scheme_0->down_box(FL_ROUND_DOWN_BOX); btn_scheme_0->callback((Fl_Callback*)cb_btn_scheme_0); } // Fl_Round_Button* btn_scheme_0 { btn_scheme_1 = new Fl_Round_Button(61, 138, 144, 22, _("One above waterfall")); btn_scheme_1->type(102); btn_scheme_1->down_box(FL_ROUND_DOWN_BOX); btn_scheme_1->callback((Fl_Callback*)cb_btn_scheme_1); } // Fl_Round_Button* btn_scheme_1 { btn_scheme_2 = new Fl_Round_Button(61, 163, 144, 22, _("One below waterfall")); btn_scheme_2->type(102); btn_scheme_2->down_box(FL_ROUND_DOWN_BOX); btn_scheme_2->callback((Fl_Callback*)cb_btn_scheme_2); } // Fl_Round_Button* btn_scheme_2 { btn_scheme_3 = new Fl_Round_Button(228, 113, 144, 22, _("Two scheme 1")); btn_scheme_3->type(102); btn_scheme_3->down_box(FL_ROUND_DOWN_BOX); btn_scheme_3->callback((Fl_Callback*)cb_btn_scheme_3); } // Fl_Round_Button* btn_scheme_3 { btn_scheme_4 = new Fl_Round_Button(396, 113, 144, 22, _("Two scheme 2")); btn_scheme_4->type(102); btn_scheme_4->down_box(FL_ROUND_DOWN_BOX); btn_scheme_4->callback((Fl_Callback*)cb_btn_scheme_4); } // Fl_Round_Button* btn_scheme_4 { btn_scheme_5 = new Fl_Round_Button(228, 138, 144, 22, _("Two scheme 3")); btn_scheme_5->type(102); btn_scheme_5->down_box(FL_ROUND_DOWN_BOX); btn_scheme_5->callback((Fl_Callback*)cb_btn_scheme_5); } // Fl_Round_Button* btn_scheme_5 { btn_scheme_6 = new Fl_Round_Button(396, 138, 144, 22, _("Two scheme 4")); btn_scheme_6->type(102); btn_scheme_6->down_box(FL_ROUND_DOWN_BOX); btn_scheme_6->callback((Fl_Callback*)cb_btn_scheme_6); } // Fl_Round_Button* btn_scheme_6 { btn_scheme_7 = new Fl_Round_Button(228, 163, 144, 22, _("Two scheme 5")); btn_scheme_7->type(102); btn_scheme_7->down_box(FL_ROUND_DOWN_BOX); btn_scheme_7->callback((Fl_Callback*)cb_btn_scheme_7); } // Fl_Round_Button* btn_scheme_7 { btn_scheme_8 = new Fl_Round_Button(396, 163, 144, 22, _("Two scheme 6")); btn_scheme_8->type(102); btn_scheme_8->down_box(FL_ROUND_DOWN_BOX); btn_scheme_8->callback((Fl_Callback*)cb_btn_scheme_8); } // Fl_Round_Button* btn_scheme_8 { btn_scheme_9 = new Fl_Round_Button(228, 188, 144, 22, _("Two scheme 7")); btn_scheme_9->type(102); btn_scheme_9->down_box(FL_ROUND_DOWN_BOX); btn_scheme_9->callback((Fl_Callback*)cb_btn_scheme_9); } // Fl_Round_Button* btn_scheme_9 { btn_scheme_10 = new Fl_Round_Button(396, 188, 144, 22, _("Two scheme 8")); btn_scheme_10->type(102); btn_scheme_10->down_box(FL_ROUND_DOWN_BOX); btn_scheme_10->callback((Fl_Callback*)cb_btn_scheme_10); } // Fl_Round_Button* btn_scheme_10 { btn_scheme_11 = new Fl_Round_Button(228, 213, 144, 22, _("Two scheme 9")); btn_scheme_11->type(102); btn_scheme_11->down_box(FL_ROUND_DOWN_BOX); btn_scheme_11->callback((Fl_Callback*)cb_btn_scheme_11); } // Fl_Round_Button* btn_scheme_11 { btn_scheme_12 = new Fl_Round_Button(396, 213, 144, 22, _("Two scheme 10")); btn_scheme_12->type(102); btn_scheme_12->down_box(FL_ROUND_DOWN_BOX); btn_scheme_12->callback((Fl_Callback*)cb_btn_scheme_12); } // Fl_Round_Button* btn_scheme_12 o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 275, 590, 55); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnUseLastMacro = new Fl_Check_Button(62, 280, 277, 20, _("Load last used macro file at start")); btnUseLastMacro->tooltip(_("ON - use last set of macros\nOFF - use default set")); btnUseLastMacro->down_box(FL_DOWN_BOX); btnUseLastMacro->callback((Fl_Callback*)cb_btnUseLastMacro); o->value(progdefaults.UseLastMacro); } // Fl_Check_Button* btnUseLastMacro { Fl_Check_Button* o = btnDisplayMacroFilename = new Fl_Check_Button(62, 302, 277, 20, _("Display macro filename at start")); btnDisplayMacroFilename->tooltip(_("The filename is written to the RX text area")); btnDisplayMacroFilename->down_box(FL_DOWN_BOX); btnDisplayMacroFilename->callback((Fl_Callback*)cb_btnDisplayMacroFilename); o->value(progdefaults.DisplayMacroFilename); } // Fl_Check_Button* btnDisplayMacroFilename { Fl_Check_Button* o = btn_save_macros_on_exit = new Fl_Check_Button(345, 280, 216, 20, _("Prompt to save macro file")); btn_save_macros_on_exit->tooltip(_("Write current macro set on program exit")); btn_save_macros_on_exit->down_box(FL_DOWN_BOX); btn_save_macros_on_exit->callback((Fl_Callback*)cb_btn_save_macros_on_exit); o->value(progdefaults.SaveMacros); } // Fl_Check_Button* btn_save_macros_on_exit o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 330, 295, 45); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_macro_post = new Fl_Check_Button(65, 342, 216, 20, _("Show macro control codes")); btn_macro_post->tooltip(_("print ^! execution codes in Rx panel")); btn_macro_post->down_box(FL_DOWN_BOX); btn_macro_post->callback((Fl_Callback*)cb_btn_macro_post); o->value(progdefaults.macro_post); } // Fl_Check_Button* btn_macro_post o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(300, 330, 295, 45); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_4bar_position = new Fl_Check_Button(332, 342, 216, 20, _("4 bar macro set below Tx")); btn_4bar_position->tooltip(_("Position the 4 bar macro set below Tx panel\nDefault above Rx panel")); btn_4bar_position->down_box(FL_DOWN_BOX); btn_4bar_position->callback((Fl_Callback*)cb_btn_4bar_position); o->value(progdefaults.four_bar_position); } // Fl_Check_Button* btn_4bar_position o->end(); } // Fl_Group* o tabMBars->end(); } // Fl_Group* tabMBars { tabWF_UI = new Fl_Group(0, 50, 600, 340, _("WF Ctrls")); tabWF_UI->hide(); { Fl_Group* o = new Fl_Group(52, 83, 496, 253); o->box(FL_ENGRAVED_BOX); { Fl_Box* o = new Fl_Box(81, 90, 446, 25, _("Enable check box to show each respective operator control")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btnWF_UIrev = new Fl_Check_Button(108, 123, 150, 20, _("Reverse")); btnWF_UIrev->down_box(FL_DOWN_BOX); btnWF_UIrev->value(1); btnWF_UIrev->callback((Fl_Callback*)cb_btnWF_UIrev); o->value(progdefaults.WF_UIrev); } // Fl_Check_Button* btnWF_UIrev { Fl_Check_Button* o = btnWF_UIx1 = new Fl_Check_Button(327, 123, 162, 20, _("WF Magnification")); btnWF_UIx1->down_box(FL_DOWN_BOX); btnWF_UIx1->value(1); btnWF_UIx1->callback((Fl_Callback*)cb_btnWF_UIx1); o->value(progdefaults.WF_UIx1); } // Fl_Check_Button* btnWF_UIx1 { Fl_Check_Button* o = btnWF_UIwfcarrier = new Fl_Check_Button(108, 154, 150, 20, _("WF carrier")); btnWF_UIwfcarrier->down_box(FL_DOWN_BOX); btnWF_UIwfcarrier->value(1); btnWF_UIwfcarrier->callback((Fl_Callback*)cb_btnWF_UIwfcarrier); o->value(progdefaults.WF_UIwfcarrier); } // Fl_Check_Button* btnWF_UIwfcarrier { Fl_Check_Button* o = btnWF_UIwfshift = new Fl_Check_Button(327, 154, 150, 20, _("WF Shift Controls")); btnWF_UIwfshift->down_box(FL_DOWN_BOX); btnWF_UIwfshift->value(1); btnWF_UIwfshift->callback((Fl_Callback*)cb_btnWF_UIwfshift); o->value(progdefaults.WF_UIwfshift); } // Fl_Check_Button* btnWF_UIwfshift { Fl_Check_Button* o = btnWF_UIwfreflevel = new Fl_Check_Button(108, 186, 150, 20, _("WF ref level")); btnWF_UIwfreflevel->down_box(FL_DOWN_BOX); btnWF_UIwfreflevel->value(1); btnWF_UIwfreflevel->callback((Fl_Callback*)cb_btnWF_UIwfreflevel); o->value(progdefaults.WF_UIwfreflevel); } // Fl_Check_Button* btnWF_UIwfreflevel { Fl_Check_Button* o = btnWF_UIwfdrop = new Fl_Check_Button(327, 186, 150, 20, _("WF drop rate")); btnWF_UIwfdrop->down_box(FL_DOWN_BOX); btnWF_UIwfdrop->value(1); btnWF_UIwfdrop->callback((Fl_Callback*)cb_btnWF_UIwfdrop); o->value(progdefaults.WF_UIwfdrop); } // Fl_Check_Button* btnWF_UIwfdrop { Fl_Check_Button* o = btnWF_UIwfampspan = new Fl_Check_Button(108, 218, 150, 20, _("WF amp span")); btnWF_UIwfampspan->down_box(FL_DOWN_BOX); btnWF_UIwfampspan->value(1); btnWF_UIwfampspan->callback((Fl_Callback*)cb_btnWF_UIwfampspan); o->value(progdefaults.WF_UIwfampspan); } // Fl_Check_Button* btnWF_UIwfampspan { Fl_Check_Button* o = btnWF_UIwfstore = new Fl_Check_Button(327, 218, 150, 20, _("WF Store")); btnWF_UIwfstore->down_box(FL_DOWN_BOX); btnWF_UIwfstore->value(1); btnWF_UIwfstore->callback((Fl_Callback*)cb_btnWF_UIwfstore); o->value(progdefaults.WF_UIwfstore); } // Fl_Check_Button* btnWF_UIwfstore { Fl_Check_Button* o = btnWF_UIwfmode = new Fl_Check_Button(108, 250, 150, 20, _("WF mode")); btnWF_UIwfmode->down_box(FL_DOWN_BOX); btnWF_UIwfmode->value(1); btnWF_UIwfmode->callback((Fl_Callback*)cb_btnWF_UIwfmode); o->value(progdefaults.WF_UIwfmode); } // Fl_Check_Button* btnWF_UIwfmode { Fl_Check_Button* o = btnWF_UIqsy = new Fl_Check_Button(327, 250, 150, 20, _("QSY")); btnWF_UIqsy->down_box(FL_DOWN_BOX); btnWF_UIqsy->value(1); btnWF_UIqsy->callback((Fl_Callback*)cb_btnWF_UIqsy); o->value(progdefaults.WF_UIqsy); } // Fl_Check_Button* btnWF_UIqsy { Fl_Check_Button* o = btnWF_UIxmtlock = new Fl_Check_Button(327, 282, 150, 20, _("XMT lock")); btnWF_UIxmtlock->down_box(FL_DOWN_BOX); btnWF_UIxmtlock->value(1); btnWF_UIxmtlock->callback((Fl_Callback*)cb_btnWF_UIxmtlock); o->value(progdefaults.WF_UIxmtlock); } // Fl_Check_Button* btnWF_UIxmtlock { btn_wf_enable_all = new Fl_Button(152, 305, 88, 20, _("Enable all")); btn_wf_enable_all->callback((Fl_Callback*)cb_btn_wf_enable_all); } // Fl_Button* btn_wf_enable_all { btn_wf_disable_all = new Fl_Button(351, 305, 88, 20, _("Disable all")); btn_wf_disable_all->callback((Fl_Callback*)cb_btn_wf_disable_all); } // Fl_Button* btn_wf_disable_all o->end(); } // Fl_Group* o tabWF_UI->end(); } // Fl_Group* tabWF_UI { tabColorsFonts = new Fl_Group(0, 50, 600, 340, _("Clrs/Fnts")); tabColorsFonts->hide(); { tabsColors = new Fl_Tabs(0, 50, 600, 340); { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("Rx/Tx")); o->hide(); { Fl_ListBox* o = listbox_charset_status = new Fl_ListBox(96, 90, 165, 24, _("Rx/Tx Character set")); listbox_charset_status->tooltip(_("Select Rx/Tx Character Set")); listbox_charset_status->box(FL_BORDER_BOX); listbox_charset_status->color((Fl_Color)55); listbox_charset_status->selection_color(FL_BACKGROUND_COLOR); listbox_charset_status->labeltype(FL_NORMAL_LABEL); listbox_charset_status->labelfont(0); listbox_charset_status->labelsize(14); listbox_charset_status->labelcolor(FL_FOREGROUND_COLOR); listbox_charset_status->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_charset_status->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_charset_status->callback(cb_listbox_charset, 0); listbox_charset_status->end(); } // Fl_ListBox* listbox_charset_status { RxText = new Fl_Input(96, 121, 220, 36); RxText->value("Receive Text"); RxText->color(fl_rgb_color(progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B)); RxText->textfont(progdefaults.RxFontnbr); RxText->textsize(progdefaults.RxFontsize); RxText->textcolor(progdefaults.RxFontcolor); RxText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* RxText { btnRxColor = new Fl_Button(326, 128, 75, 21, _("Rx bkgnd")); btnRxColor->callback((Fl_Callback*)cb_btnRxColor); } // Fl_Button* btnRxColor { btnTxColor = new Fl_Button(326, 171, 75, 21, _("Tx bkgnd")); btnTxColor->callback((Fl_Callback*)cb_btnTxColor); } // Fl_Button* btnTxColor { TxText = new Fl_Input(96, 163, 220, 37); TxText->value("Transmit Text"); TxText->color(fl_rgb_color(progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B)); TxText->textfont(progdefaults.TxFontnbr); TxText->textsize(progdefaults.TxFontsize); TxText->textcolor(progdefaults.TxFontcolor); TxText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* TxText { btnRxFont = new Fl_Button(411, 128, 75, 21, _("Rx font")); btnRxFont->callback((Fl_Callback*)cb_btnRxFont); } // Fl_Button* btnRxFont { btnTxFont = new Fl_Button(411, 171, 75, 21, _("Tx font")); btnTxFont->callback((Fl_Callback*)cb_btnTxFont); } // Fl_Button* btnTxFont { MacroText = new Fl_Input(96, 206, 220, 37); MacroText->value("Macro editor text"); MacroText->textfont(progdefaults.MacroEditFontnbr); MacroText->textsize(progdefaults.MacroEditFontsize); MacroText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* MacroText { btnMacroEditFont = new Fl_Button(326, 214, 120, 21, _("Macro Edit Font")); btnMacroEditFont->callback((Fl_Callback*)cb_btnMacroEditFont); } // Fl_Button* btnMacroEditFont { Fl_Group* o = new Fl_Group(86, 253, 404, 81, _("Text Highlighting")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { btnXMIT = new Fl_Button(104, 281, 40, 21, _("XMIT")); btnXMIT->tooltip(_("Sent chars in Rx/Tx pane")); btnXMIT->callback((Fl_Callback*)cb_btnXMIT); btnXMIT->align(Fl_Align(FL_ALIGN_BOTTOM)); btnXMIT->color(progdefaults.XMITcolor); } // Fl_Button* btnXMIT { btnCTRL = new Fl_Button(147, 281, 40, 21, _("CTRL")); btnCTRL->tooltip(_("Control chars in Rx/Tx pane")); btnCTRL->callback((Fl_Callback*)cb_btnCTRL); btnCTRL->align(Fl_Align(FL_ALIGN_BOTTOM)); btnCTRL->color(progdefaults.CTRLcolor); } // Fl_Button* btnCTRL { btnSKIP = new Fl_Button(191, 281, 40, 21, _("SKIP")); btnSKIP->tooltip(_("Skipped chars in Tx pane\n(Tx on/off in CW)")); btnSKIP->callback((Fl_Callback*)cb_btnSKIP); btnSKIP->align(Fl_Align(FL_ALIGN_BOTTOM)); btnSKIP->color(progdefaults.SKIPcolor); } // Fl_Button* btnSKIP { btnALTR = new Fl_Button(234, 281, 40, 21, _("ALTR")); btnALTR->tooltip(_("Alternate character color in Rx panelr")); btnALTR->callback((Fl_Callback*)cb_btnALTR); btnALTR->align(Fl_Align(FL_ALIGN_BOTTOM)); btnALTR->color(progdefaults.ALTRcolor); } // Fl_Button* btnALTR { btnSEL = new Fl_Button(278, 281, 39, 21, _("SEL")); btnSEL->tooltip(_("Selection background color in Rx Tx panels")); btnSEL->callback((Fl_Callback*)cb_btnSEL); btnSEL->align(Fl_Align(FL_ALIGN_BOTTOM)); btnSEL->color(progdefaults.RxTxSelectcolor); } // Fl_Button* btnSEL { btnNoTextColor = new Fl_Button(325, 281, 70, 21, _("System")); btnNoTextColor->callback((Fl_Callback*)cb_btnNoTextColor); } // Fl_Button* btnNoTextColor { btnTextDefaults = new Fl_Button(399, 281, 70, 21, _("Defaults")); btnTextDefaults->callback((Fl_Callback*)cb_btnTextDefaults); } // Fl_Button* btnTextDefaults o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_show_all_codes = new Fl_Check_Button(110, 345, 25, 25, _("display Rx control chars as ascii string")); btn_show_all_codes->down_box(FL_DOWN_BOX); btn_show_all_codes->callback((Fl_Callback*)cb_btn_show_all_codes); o->value(progdefaults.show_all_codes); } // Fl_Check_Button* btn_show_all_codes o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("FreqDisp / Meters")); o->hide(); { Fl_Group* o = new Fl_Group(115, 108, 395, 87); o->box(FL_ENGRAVED_FRAME); { Fl_Box* o = FDdisplay = new Fl_Box(195, 112, 235, 45, _("14070.150")); FDdisplay->box(FL_DOWN_BOX); FDdisplay->color((Fl_Color)55); FDdisplay->labelfont(4); FDdisplay->labelsize(40); o->color(fl_rgb_color(progdefaults.FDbackground.R,progdefaults.FDbackground.G,progdefaults.FDbackground.B)); o->labelcolor(fl_rgb_color(progdefaults.FDforeground.R,progdefaults.FDforeground.G,progdefaults.FDforeground.B)); o->labelfont(progdefaults.FreqControlFontnbr); } // Fl_Box* FDdisplay { btn_freq_control_font = new Fl_Button(122, 163, 90, 24, _("Font")); btn_freq_control_font->callback((Fl_Callback*)cb_btn_freq_control_font); } // Fl_Button* btn_freq_control_font { btnBackgroundColor = new Fl_Button(218, 163, 90, 24, _("Bg Color")); btnBackgroundColor->callback((Fl_Callback*)cb_btnBackgroundColor); } // Fl_Button* btnBackgroundColor { btnForegroundColor = new Fl_Button(314, 163, 90, 24, _("Digit Color")); btnForegroundColor->callback((Fl_Callback*)cb_btnForegroundColor); } // Fl_Button* btnForegroundColor { btnFD_SystemColor = new Fl_Button(410, 163, 90, 24, _("Sys Colors")); btnFD_SystemColor->callback((Fl_Callback*)cb_btnFD_SystemColor); } // Fl_Button* btnFD_SystemColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(115, 199, 395, 62, _("S-meter")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnSmeter_bg_color = new Fl_Button(122, 226, 90, 24, _("Bg Color")); btnSmeter_bg_color->callback((Fl_Callback*)cb_btnSmeter_bg_color); } // Fl_Button* btnSmeter_bg_color { btnSmeter_scale_color = new Fl_Button(218, 226, 90, 24, _("Scale Color")); btnSmeter_scale_color->callback((Fl_Callback*)cb_btnSmeter_scale_color); } // Fl_Button* btnSmeter_scale_color { btnSmeter_meter_color = new Fl_Button(314, 226, 90, 24, _("Meter Color")); btnSmeter_meter_color->callback((Fl_Callback*)cb_btnSmeter_meter_color); } // Fl_Button* btnSmeter_meter_color o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(115, 268, 395, 67, _("PWR-meter")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnPWR_bg_color = new Fl_Button(122, 295, 90, 24, _("Bg Color")); btnPWR_bg_color->callback((Fl_Callback*)cb_btnPWR_bg_color); } // Fl_Button* btnPWR_bg_color { btnPWR_scale_color = new Fl_Button(218, 295, 90, 24, _("Scale Color")); btnPWR_scale_color->callback((Fl_Callback*)cb_btnPWR_scale_color); } // Fl_Button* btnPWR_scale_color { btnPWR_meter_Color = new Fl_Button(314, 295, 90, 24, _("Meter Color")); btnPWR_meter_Color->callback((Fl_Callback*)cb_btnPWR_meter_Color); } // Fl_Button* btnPWR_meter_Color { Fl_ListBox* o = listboxPWRselect = new Fl_ListBox(410, 295, 80, 24, _("Power scale")); listboxPWRselect->tooltip(_("Select the type of FFT prefilter")); listboxPWRselect->box(FL_DOWN_BOX); listboxPWRselect->color(FL_BACKGROUND2_COLOR); listboxPWRselect->selection_color(FL_BACKGROUND_COLOR); listboxPWRselect->labeltype(FL_NORMAL_LABEL); listboxPWRselect->labelfont(0); listboxPWRselect->labelsize(14); listboxPWRselect->labelcolor(FL_FOREGROUND_COLOR); listboxPWRselect->callback((Fl_Callback*)cb_listboxPWRselect); listboxPWRselect->align(Fl_Align(FL_ALIGN_TOP)); listboxPWRselect->when(FL_WHEN_RELEASE); o->add(_("25 W")); o->add("50 W"); o->add("100 W"); o->add("200 W"); o->add("AUTO"); o->index(progdefaults.PWRselect);o->labelsize(FL_NORMAL_SIZE); listboxPWRselect->end(); } // Fl_ListBox* listboxPWRselect o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("Log")); o->hide(); { Fl_Group* o = new Fl_Group(5, 101, 590, 65, _("Logging Panel Controls")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = LOGGINGdisplay = new Fl_Output(33, 125, 184, 25); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGGINGtextcolor); o->color(progdefaults.LOGGINGcolor); o->value("W1HKJ"); o->redraw(); } // Fl_Output* LOGGINGdisplay { btnLOGGING_color = new Fl_Button(276, 125, 80, 25, _("Bg Color")); btnLOGGING_color->callback((Fl_Callback*)cb_btnLOGGING_color); } // Fl_Button* btnLOGGING_color { btn_LOGGING_font = new Fl_Button(366, 125, 55, 25, _("Font")); btn_LOGGING_font->callback((Fl_Callback*)cb_btn_LOGGING_font); } // Fl_Button* btn_LOGGING_font { btnLOGGINGdefault_colors_font = new Fl_Button(432, 125, 80, 25, _("Default")); btnLOGGINGdefault_colors_font->callback((Fl_Callback*)cb_btnLOGGINGdefault_colors_font); } // Fl_Button* btnLOGGINGdefault_colors_font o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 167, 590, 65, _("Logbook Dialog")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = LOGBOOKdisplay = new Fl_Output(33, 191, 184, 25); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGBOOKtextcolor); o->color(progdefaults.LOGBOOKcolor); o->value("14.070000"); o->redraw(); } // Fl_Output* LOGBOOKdisplay { btnLOGBOOK_color = new Fl_Button(275, 191, 80, 25, _("Bg Color")); btnLOGBOOK_color->callback((Fl_Callback*)cb_btnLOGBOOK_color); } // Fl_Button* btnLOGBOOK_color { btn_LOGBOOK_font = new Fl_Button(365, 191, 55, 25, _("Font")); btn_LOGBOOK_font->callback((Fl_Callback*)cb_btn_LOGBOOK_font); } // Fl_Button* btn_LOGBOOK_font { btnLOGBOOKdefault_colors_font = new Fl_Button(431, 191, 80, 25, _("Default")); btnLOGBOOKdefault_colors_font->callback((Fl_Callback*)cb_btnLOGBOOKdefault_colors_font); } // Fl_Button* btnLOGBOOKdefault_colors_font o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 236, 590, 147, _("DX Cluster Dialog")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = DXC_display = new Fl_Output(33, 271, 184, 25, _("Report Browser")); DXC_display->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize); o->value("DX de W1HKJ-1"); o->redraw(); } // Fl_Output* DXC_display { btn_DXC_font = new Fl_Button(222, 271, 86, 25, _("Font")); btn_DXC_font->callback((Fl_Callback*)cb_btn_DXC_font); } // Fl_Button* btn_DXC_font { btnDXCdefault_colors_font = new Fl_Button(314, 271, 86, 25, _("Default")); btnDXCdefault_colors_font->callback((Fl_Callback*)cb_btnDXCdefault_colors_font); } // Fl_Button* btnDXCdefault_colors_font { Fl_Button* o = btn_DXC_even_lines = new Fl_Button(222, 302, 86, 25, _("Even Lines")); btn_DXC_even_lines->color((Fl_Color)55); btn_DXC_even_lines->callback((Fl_Callback*)cb_btn_DXC_even_lines); o->color(progdefaults.DXC_even_color); } // Fl_Button* btn_DXC_even_lines { Fl_Button* o = btn_DXC_odd_lines = new Fl_Button(314, 302, 86, 25, _("Odd Lines")); btn_DXC_odd_lines->color((Fl_Color)246); btn_DXC_odd_lines->callback((Fl_Callback*)cb_btn_DXC_odd_lines); o->color(progdefaults.DXC_odd_color); } // Fl_Button* btn_DXC_odd_lines { Fl_Input* o = StreamText = new Fl_Input(33, 341, 184, 25, _("Stream Text")); StreamText->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value("DX de W1HKJ..."); o->color(fl_rgb_color(progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); o->textfont(progdefaults.DXfontnbr); o->textsize(progdefaults.DXfontsize); o->textcolor(progdefaults.DXfontcolor); } // Fl_Input* StreamText { btnDXcolor = new Fl_Button(222, 341, 86, 25, _("Bg color")); btnDXcolor->callback((Fl_Callback*)cb_btnDXcolor); } // Fl_Button* btnDXcolor { btnDXfont = new Fl_Button(314, 341, 86, 25, _("Font")); btnDXfont->callback((Fl_Callback*)cb_btnDXfont); } // Fl_Button* btnDXfont { Fl_Button* o = btnDXalt_color = new Fl_Button(406, 340, 86, 25, _("Alt Color")); btnDXalt_color->tooltip(_("Color for outgoing telnet text")); btnDXalt_color->callback((Fl_Callback*)cb_btnDXalt_color); o->labelcolor(progdefaults.DXalt_color); } // Fl_Button* btnDXalt_color { btnDXdefault_colors_font = new Fl_Button(500, 340, 86, 25, _("Default")); btnDXdefault_colors_font->callback((Fl_Callback*)cb_btnDXdefault_colors_font); } // Fl_Button* btnDXdefault_colors_font o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("F_keys")); o->hide(); { btnUseGroupColors = new Fl_Check_Button(135, 107, 165, 21, _("Use colored buttons")); btnUseGroupColors->down_box(FL_DOWN_BOX); btnUseGroupColors->callback((Fl_Callback*)cb_btnUseGroupColors); btnUseGroupColors->value(progdefaults.useGroupColors); } // Fl_Check_Button* btnUseGroupColors { btnGroup1 = new Fl_Button(103, 155, 90, 30, _("Group 1")); btnGroup1->tooltip(_("Background color for Function key group 1")); btnGroup1->callback((Fl_Callback*)cb_btnGroup1); btnGroup1->color(fl_rgb_color(progdefaults.btnGroup1.R, progdefaults.btnGroup1.G,progdefaults.btnGroup1.B)); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); } // Fl_Button* btnGroup1 { btnGroup2 = new Fl_Button(205, 155, 90, 30, _("Group 2")); btnGroup2->tooltip(_("Background color for Function key group 2")); btnGroup2->callback((Fl_Callback*)cb_btnGroup2); btnGroup2->color(fl_rgb_color(progdefaults.btnGroup2.R, progdefaults.btnGroup2.G,progdefaults.btnGroup2.B)); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); } // Fl_Button* btnGroup2 { btnGroup3 = new Fl_Button(307, 155, 90, 30, _("Group 3")); btnGroup3->tooltip(_("Background color for Function key group 3")); btnGroup3->callback((Fl_Callback*)cb_btnGroup3); btnGroup3->color(fl_rgb_color(progdefaults.btnGroup3.R, progdefaults.btnGroup3.G,progdefaults.btnGroup3.B)); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); } // Fl_Button* btnGroup3 { btnFkeyDEfaults = new Fl_Button(410, 155, 90, 30, _("Defaults")); btnFkeyDEfaults->callback((Fl_Callback*)cb_btnFkeyDEfaults); } // Fl_Button* btnFkeyDEfaults { btnMacroBtnFont = new Fl_Button(307, 102, 90, 30, _("Font/Color")); btnMacroBtnFont->callback((Fl_Callback*)cb_btnMacroBtnFont); } // Fl_Button* btnMacroBtnFont o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("Tabs")); o->hide(); { btnTabColor = new Fl_Button(200, 113, 75, 21, _("Tab Color")); btnTabColor->callback((Fl_Callback*)cb_btnTabColor); } // Fl_Button* btnTabColor { btnTabDefaultColor = new Fl_Button(330, 113, 75, 21, _("System")); btnTabDefaultColor->callback((Fl_Callback*)cb_btnTabDefaultColor); } // Fl_Button* btnTabDefaultColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("Buttons")); { btnSpotColor = new Fl_Button(139, 121, 85, 21, _("Spot")); btnSpotColor->callback((Fl_Callback*)cb_btnSpotColor); } // Fl_Button* btnSpotColor { btnRevColor = new Fl_Button(139, 157, 85, 21, _("Rev")); btnRevColor->callback((Fl_Callback*)cb_btnRevColor); } // Fl_Button* btnRevColor { btnTuneColor = new Fl_Button(139, 194, 85, 21, _("Tune")); btnTuneColor->callback((Fl_Callback*)cb_btnTuneColor); } // Fl_Button* btnTuneColor { btnRxIDColor = new Fl_Button(139, 229, 85, 21, _("RxID nar")); btnRxIDColor->callback((Fl_Callback*)cb_btnRxIDColor); } // Fl_Button* btnRxIDColor { btnLkColor = new Fl_Button(274, 121, 85, 21, _("Lk")); btnLkColor->callback((Fl_Callback*)cb_btnLkColor); } // Fl_Button* btnLkColor { btnSql1Color = new Fl_Button(275, 157, 85, 21, _("SQL-1")); btnSql1Color->callback((Fl_Callback*)cb_btnSql1Color); } // Fl_Button* btnSql1Color { btnXmtColor = new Fl_Button(274, 194, 85, 20, _("T/R")); btnXmtColor->callback((Fl_Callback*)cb_btnXmtColor); } // Fl_Button* btnXmtColor { btnRxIDwideColor = new Fl_Button(274, 229, 85, 21, _("RxID wide")); btnRxIDwideColor->callback((Fl_Callback*)cb_btnRxIDwideColor); } // Fl_Button* btnRxIDwideColor { btnAfcColor = new Fl_Button(410, 121, 85, 21, _("AFC")); btnAfcColor->callback((Fl_Callback*)cb_btnAfcColor); } // Fl_Button* btnAfcColor { btnSql2Color = new Fl_Button(410, 157, 85, 20, _("SQL-2")); btnSql2Color->callback((Fl_Callback*)cb_btnSql2Color); } // Fl_Button* btnSql2Color { btnTxIDColor = new Fl_Button(409, 229, 85, 20, _("TxID")); btnTxIDColor->callback((Fl_Callback*)cb_btnTxIDColor); } // Fl_Button* btnTxIDColor { Fl_Box* o = spotcolor = new Fl_Box(115, 122, 18, 19); spotcolor->box(FL_THIN_DOWN_BOX); spotcolor->color((Fl_Color)3); o->color(progdefaults.SpotColor); } // Fl_Box* spotcolor { Fl_Box* o = revcolor = new Fl_Box(115, 158, 18, 19); revcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RevColor); } // Fl_Box* revcolor { Fl_Box* o = tunecolor = new Fl_Box(115, 195, 18, 19); tunecolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.TuneColor); } // Fl_Box* tunecolor { Fl_Box* o = rxidcolor = new Fl_Box(115, 230, 18, 19); rxidcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RxIDColor); } // Fl_Box* rxidcolor { Fl_Box* o = lockcolor = new Fl_Box(250, 122, 18, 19); lockcolor->box(FL_THIN_DOWN_BOX); lockcolor->color((Fl_Color)3); o->color(progdefaults.LkColor); } // Fl_Box* lockcolor { Fl_Box* o = sql1color = new Fl_Box(250, 158, 18, 19); sql1color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.Sql1Color); } // Fl_Box* sql1color { Fl_Box* o = rxidcolorwide = new Fl_Box(250, 230, 18, 19); rxidcolorwide->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RxIDwideColor); } // Fl_Box* rxidcolorwide { Fl_Box* o = xmtcolor = new Fl_Box(250, 195, 18, 18); xmtcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.XmtColor); } // Fl_Box* xmtcolor { Fl_Box* o = afccolor = new Fl_Box(385, 122, 18, 19); afccolor->box(FL_THIN_DOWN_BOX); afccolor->color((Fl_Color)3); o->color(progdefaults.AfcColor); } // Fl_Box* afccolor { Fl_Box* o = sql2color = new Fl_Box(385, 158, 18, 18); sql2color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.Sql2Color); } // Fl_Box* sql2color { Fl_Box* o = txidcolor = new Fl_Box(385, 230, 18, 18); txidcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.TxIDColor); } // Fl_Box* txidcolor { Fl_Box* o = new Fl_Box(195, 310, 220, 20, _("Lighted button enabled colors")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_default_btn_color = new Fl_Button(274, 264, 85, 21, _("All Others")); btn_default_btn_color->callback((Fl_Callback*)cb_btn_default_btn_color); } // Fl_Button* btn_default_btn_color { Fl_Box* o = default_btn_color = new Fl_Box(250, 264, 18, 19); default_btn_color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.default_btn_color); } // Fl_Box* default_btn_color o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("SigLvl")); o->hide(); { btnLowSignal = new Fl_Button(210, 142, 70, 21, _("Low")); btnLowSignal->callback((Fl_Callback*)cb_btnLowSignal); } // Fl_Button* btnLowSignal { Fl_Box* o = lowcolor = new Fl_Box(189, 142, 21, 21); lowcolor->box(FL_DIAMOND_DOWN_BOX); lowcolor->color(FL_FOREGROUND_COLOR); o->color(progdefaults.LowSignal); } // Fl_Box* lowcolor { btnHighSignal = new Fl_Button(210, 180, 70, 21, _("High")); btnHighSignal->callback((Fl_Callback*)cb_btnHighSignal); } // Fl_Button* btnHighSignal { Fl_Box* o = highcolor = new Fl_Box(189, 180, 21, 21); highcolor->box(FL_DIAMOND_DOWN_BOX); highcolor->color((Fl_Color)3); o->color(progdefaults.HighSignal); } // Fl_Box* highcolor { btnNormalSignal = new Fl_Button(333, 142, 70, 21, _("Normal")); btnNormalSignal->callback((Fl_Callback*)cb_btnNormalSignal); } // Fl_Button* btnNormalSignal { Fl_Box* o = normalcolor = new Fl_Box(312, 141, 21, 21); normalcolor->box(FL_DIAMOND_DOWN_BOX); normalcolor->color((Fl_Color)2); o->color(progdefaults.NormSignal); } // Fl_Box* normalcolor { btnOverSignal = new Fl_Button(333, 180, 70, 21, _("Over")); btnOverSignal->callback((Fl_Callback*)cb_btnOverSignal); } // Fl_Button* btnOverSignal { Fl_Box* o = overcolor = new Fl_Box(312, 180, 21, 21); overcolor->box(FL_DIAMOND_DOWN_BOX); overcolor->color((Fl_Color)1); o->color(progdefaults.OverSignal); } // Fl_Box* overcolor { new Fl_Box(135, 110, 316, 21, _("Signal Level Colors")); } // Fl_Box* o o->end(); } // Fl_Group* o tabsColors->end(); } // Fl_Tabs* tabsColors tabColorsFonts->end(); } // Fl_Group* tabColorsFonts { tab_touch = new Fl_Group(0, 50, 600, 340, _("Touch")); tab_touch->hide(); { Fl_Box* o = new Fl_Box(15, 70, 570, 52, _("Note:\nThese configuration items are useful for but not unique to using fldig\ i on a\ntouch screen device such as a tablet.")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Group* o = new Fl_Group(15, 145, 570, 102, _("Arrow Key Control of Frequency Entry")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Box* o = new Fl_Box(30, 170, 290, 74, _("Right/Left = 1 x LSD\nUp/Dn= 10 x LSD\nShift - Right/Left = 100 x LSD\nShift \ - Up/Dn = 1000 x LSD")); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Choice* o = sel_lsd = new Fl_Choice(420, 206, 90, 24, _("Right/Left\nSelect Least Signficant Digit")); sel_lsd->down_box(FL_BORDER_BOX); sel_lsd->callback((Fl_Callback*)cb_sel_lsd); sel_lsd->align(Fl_Align(FL_ALIGN_TOP)); o->add("1 Hz|10 Hz|100 Hz|1 kHz"); o->value(progdefaults.sel_lsd); } // Fl_Choice* sel_lsd o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(15, 256, 570, 64, _("Rx / Tx Panels")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_rxtx_swap = new Fl_Check_Button(145, 276, 116, 30, _("Tx above Rx")); btn_rxtx_swap->tooltip(_("Enable to put Tx panel above Rx panel")); btn_rxtx_swap->down_box(FL_DOWN_BOX); btn_rxtx_swap->callback((Fl_Callback*)cb_btn_rxtx_swap); o->value(progdefaults.rxtx_swap); } // Fl_Check_Button* btn_rxtx_swap o->end(); } // Fl_Group* o tab_touch->end(); } // Fl_Group* tab_touch tabsUI->end(); } // Fl_Tabs* tabsUI tabUI->end(); } // Fl_Group* tabUI { tabWaterfall = new Fl_Group(0, 25, 600, 365, _("Waterfall")); tabWaterfall->hide(); { tabsWaterfall = new Fl_Tabs(0, 25, 600, 365); tabsWaterfall->color(FL_LIGHT1); tabsWaterfall->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 50, 600, 340, _("Display")); o->hide(); { Fl_Group* o = new Fl_Group(50, 63, 496, 190, _("Colors and cursors")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { colorbox* o = WF_Palette = new colorbox(60, 99, 380, 24, _("aa")); WF_Palette->box(FL_DOWN_BOX); WF_Palette->color(FL_FOREGROUND_COLOR); WF_Palette->selection_color(FL_BACKGROUND_COLOR); WF_Palette->labeltype(FL_NORMAL_LABEL); WF_Palette->labelfont(0); WF_Palette->labelsize(12); WF_Palette->labelcolor(FL_FOREGROUND_COLOR); WF_Palette->callback((Fl_Callback*)cb_WF_Palette); WF_Palette->align(Fl_Align(FL_ALIGN_TOP_LEFT)); WF_Palette->when(FL_WHEN_RELEASE); o->label(progdefaults.PaletteName.c_str()); o->labelsize(FL_NORMAL_SIZE); } // colorbox* WF_Palette { btnColor[0] = new Fl_Button(60, 125, 20, 24); btnColor[0]->tooltip(_("Change color")); btnColor[0]->callback((Fl_Callback*)cb_btnColor); } // Fl_Button* btnColor[0] { btnColor[1] = new Fl_Button(105, 125, 20, 24); btnColor[1]->tooltip(_("Change color")); btnColor[1]->callback((Fl_Callback*)cb_btnColor1); } // Fl_Button* btnColor[1] { btnColor[2] = new Fl_Button(150, 125, 20, 24); btnColor[2]->tooltip(_("Change color")); btnColor[2]->callback((Fl_Callback*)cb_btnColor2); } // Fl_Button* btnColor[2] { btnColor[3] = new Fl_Button(195, 125, 20, 24); btnColor[3]->tooltip(_("Change color")); btnColor[3]->callback((Fl_Callback*)cb_btnColor3); } // Fl_Button* btnColor[3] { btnColor[4] = new Fl_Button(240, 125, 20, 24); btnColor[4]->tooltip(_("Change color")); btnColor[4]->callback((Fl_Callback*)cb_btnColor4); } // Fl_Button* btnColor[4] { btnColor[5] = new Fl_Button(285, 125, 20, 24); btnColor[5]->tooltip(_("Change color")); btnColor[5]->callback((Fl_Callback*)cb_btnColor5); } // Fl_Button* btnColor[5] { btnColor[6] = new Fl_Button(330, 125, 20, 24); btnColor[6]->tooltip(_("Change color")); btnColor[6]->callback((Fl_Callback*)cb_btnColor6); } // Fl_Button* btnColor[6] { btnColor[7] = new Fl_Button(375, 125, 20, 24); btnColor[7]->tooltip(_("Change color")); btnColor[7]->callback((Fl_Callback*)cb_btnColor7); } // Fl_Button* btnColor[7] { btnColor[8] = new Fl_Button(420, 125, 20, 24); btnColor[8]->tooltip(_("Change color")); btnColor[8]->callback((Fl_Callback*)cb_btnColor8); } // Fl_Button* btnColor[8] { btnLoadPalette = new Fl_Button(450, 99, 70, 24, _("Load...")); btnLoadPalette->tooltip(_("Load a new palette")); btnLoadPalette->callback((Fl_Callback*)cb_btnLoadPalette); } // Fl_Button* btnLoadPalette { btnSavePalette = new Fl_Button(450, 125, 70, 24, _("Save...")); btnSavePalette->tooltip(_("Save this palette")); btnSavePalette->callback((Fl_Callback*)cb_btnSavePalette); } // Fl_Button* btnSavePalette { Fl_Group* o = new Fl_Group(59, 153, 113, 96, _("Bandwidth")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseCursorLines = new Fl_Check_Button(61, 173, 56, 20, _("ON")); btnUseCursorLines->tooltip(_("Show cursor with bandwidth lines")); btnUseCursorLines->down_box(FL_DOWN_BOX); btnUseCursorLines->callback((Fl_Callback*)cb_btnUseCursorLines); o->value(progdefaults.UseCursorLines); } // Fl_Check_Button* btnUseCursorLines { Fl_Button* o = btnCursorBWcolor = new Fl_Button(61, 196, 20, 20, _("Color")); btnCursorBWcolor->tooltip(_("Change color")); btnCursorBWcolor->color((Fl_Color)3); btnCursorBWcolor->callback((Fl_Callback*)cb_btnCursorBWcolor); btnCursorBWcolor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); } // Fl_Button* btnCursorBWcolor { Fl_Check_Button* o = btnUseWideCursor = new Fl_Check_Button(61, 219, 62, 20, _("Wide")); btnUseWideCursor->tooltip(_("Show bandwidth tracks on waterfall")); btnUseWideCursor->down_box(FL_DOWN_BOX); btnUseWideCursor->callback((Fl_Callback*)cb_btnUseWideCursor); o->value(progdefaults.UseWideCursor); } // Fl_Check_Button* btnUseWideCursor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(183, 153, 113, 96, _("Center line")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseCursorCenterLine = new Fl_Check_Button(189, 173, 48, 20, _("ON")); btnUseCursorCenterLine->tooltip(_("Show cursor with center line")); btnUseCursorCenterLine->down_box(FL_DOWN_BOX); btnUseCursorCenterLine->callback((Fl_Callback*)cb_btnUseCursorCenterLine); o->value(progdefaults.UseCursorCenterLine); } // Fl_Check_Button* btnUseCursorCenterLine { Fl_Button* o = btnCursorCenterLineColor = new Fl_Button(189, 196, 20, 20, _("Color")); btnCursorCenterLineColor->tooltip(_("Change color")); btnCursorCenterLineColor->color(FL_BACKGROUND2_COLOR); btnCursorCenterLineColor->callback((Fl_Callback*)cb_btnCursorCenterLineColor); btnCursorCenterLineColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); } // Fl_Button* btnCursorCenterLineColor { Fl_Check_Button* o = btnUseWideCenter = new Fl_Check_Button(189, 221, 69, 20, _("Wide")); btnUseWideCenter->tooltip(_("Show bandwidth tracks on waterfall")); btnUseWideCenter->down_box(FL_DOWN_BOX); btnUseWideCenter->callback((Fl_Callback*)cb_btnUseWideCenter); o->value(progdefaults.UseWideCenter); } // Fl_Check_Button* btnUseWideCenter o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(306, 153, 113, 96, _("Signal tracks")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseBWTracks = new Fl_Check_Button(308, 172, 56, 20, _("ON")); btnUseBWTracks->tooltip(_("Show bandwidth tracks on waterfall")); btnUseBWTracks->down_box(FL_DOWN_BOX); btnUseBWTracks->callback((Fl_Callback*)cb_btnUseBWTracks); o->value(progdefaults.UseBWTracks); } // Fl_Check_Button* btnUseBWTracks { Fl_Button* o = btnBwTracksColor = new Fl_Button(308, 195, 20, 20, _("Color")); btnBwTracksColor->tooltip(_("Change color")); btnBwTracksColor->color((Fl_Color)1); btnBwTracksColor->callback((Fl_Callback*)cb_btnBwTracksColor); btnBwTracksColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); } // Fl_Button* btnBwTracksColor { Fl_Check_Button* o = btnUseWideTracks = new Fl_Check_Button(308, 219, 74, 20, _("Wide")); btnUseWideTracks->tooltip(_("Show bandwidth tracks on waterfall")); btnUseWideTracks->down_box(FL_DOWN_BOX); btnUseWideTracks->callback((Fl_Callback*)cb_btnUseWideTracks); o->value(progdefaults.UseWideTracks); } // Fl_Check_Button* btnUseWideTracks o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(426, 153, 113, 96, _("Notch")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnNotchColor = new Fl_Button(428, 195, 20, 20, _("Color")); btnNotchColor->tooltip(_("Change color")); btnNotchColor->color((Fl_Color)1); btnNotchColor->callback((Fl_Callback*)cb_btnNotchColor); btnNotchColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); } // Fl_Button* btnNotchColor o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(50, 254, 496, 55, _("Frequency scale")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkShowAudioScale = new Fl_Check_Button(60, 277, 241, 20, _("Always show audio frequencies")); chkShowAudioScale->tooltip(_("Audio or RF frequencies on waterfall scale")); chkShowAudioScale->down_box(FL_DOWN_BOX); chkShowAudioScale->callback((Fl_Callback*)cb_chkShowAudioScale); o->value(progdefaults.wf_audioscale); } // Fl_Check_Button* chkShowAudioScale { btnWaterfallFont = new Fl_Button(360, 277, 71, 24, _("Font...")); btnWaterfallFont->tooltip(_("Select waterfall scale font")); btnWaterfallFont->callback((Fl_Callback*)cb_btnWaterfallFont); } // Fl_Button* btnWaterfallFont o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(50, 310, 496, 65, _("Transmit signal")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(60, 336, 208, 20, _("Monitor transmitted signal")); btnViewXmtSignal->tooltip(_("Show transmit signal on waterfall")); btnViewXmtSignal->down_box(FL_DOWN_BOX); btnViewXmtSignal->callback((Fl_Callback*)cb_btnViewXmtSignal); o->value(progdefaults.viewXmtSignal); } // Fl_Check_Button* btnViewXmtSignal { Fl_Value_Slider2* o = valTxMonitorLevel = new Fl_Value_Slider2(318, 336, 203, 20, _("Signal level")); valTxMonitorLevel->tooltip(_("Set level for good viewing")); valTxMonitorLevel->type(1); valTxMonitorLevel->box(FL_DOWN_BOX); valTxMonitorLevel->color(FL_BACKGROUND_COLOR); valTxMonitorLevel->selection_color(FL_BACKGROUND_COLOR); valTxMonitorLevel->labeltype(FL_NORMAL_LABEL); valTxMonitorLevel->labelfont(0); valTxMonitorLevel->labelsize(14); valTxMonitorLevel->labelcolor(FL_FOREGROUND_COLOR); valTxMonitorLevel->step(0.05); valTxMonitorLevel->value(0.5); valTxMonitorLevel->textsize(14); valTxMonitorLevel->callback((Fl_Callback*)cb_valTxMonitorLevel); valTxMonitorLevel->align(Fl_Align(FL_ALIGN_TOP)); valTxMonitorLevel->when(FL_WHEN_CHANGED); o->value(progdefaults.TxMonitorLevel); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valTxMonitorLevel o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 340, _("FFT Processing")); o->hide(); { Fl_Group* o = new Fl_Group(55, 71, 490, 135); o->box(FL_ENGRAVED_FRAME); { Fl_Counter2* o = cntLowFreqCutoff = new Fl_Counter2(100, 89, 70, 22, _("Lower limit")); cntLowFreqCutoff->tooltip(_("Low frequency limit in Hz")); cntLowFreqCutoff->type(1); cntLowFreqCutoff->box(FL_UP_BOX); cntLowFreqCutoff->color(FL_BACKGROUND_COLOR); cntLowFreqCutoff->selection_color(FL_INACTIVE_COLOR); cntLowFreqCutoff->labeltype(FL_NORMAL_LABEL); cntLowFreqCutoff->labelfont(0); cntLowFreqCutoff->labelsize(14); cntLowFreqCutoff->labelcolor(FL_FOREGROUND_COLOR); cntLowFreqCutoff->minimum(0); cntLowFreqCutoff->maximum(500); cntLowFreqCutoff->step(50); cntLowFreqCutoff->value(300); cntLowFreqCutoff->callback((Fl_Callback*)cb_cntLowFreqCutoff); cntLowFreqCutoff->align(Fl_Align(FL_ALIGN_RIGHT)); cntLowFreqCutoff->when(FL_WHEN_CHANGED); o->value(progdefaults.LowFreqCutoff); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntLowFreqCutoff { Fl_Check_Button* o = btnWFaveraging = new Fl_Check_Button(100, 125, 120, 20, _("FFT averaging")); btnWFaveraging->tooltip(_("Use averaging to decrease waterfall noise")); btnWFaveraging->down_box(FL_DOWN_BOX); btnWFaveraging->callback((Fl_Callback*)cb_btnWFaveraging); o->value(progdefaults.WFaveraging); } // Fl_Check_Button* btnWFaveraging { Fl_ListBox* o = listboxFFTPrefilter = new Fl_ListBox(100, 155, 120, 24, _("FFT prefilter window function")); listboxFFTPrefilter->tooltip(_("Select the type of FFT prefilter")); listboxFFTPrefilter->box(FL_DOWN_BOX); listboxFFTPrefilter->color(FL_BACKGROUND2_COLOR); listboxFFTPrefilter->selection_color(FL_BACKGROUND_COLOR); listboxFFTPrefilter->labeltype(FL_NORMAL_LABEL); listboxFFTPrefilter->labelfont(0); listboxFFTPrefilter->labelsize(14); listboxFFTPrefilter->labelcolor(FL_FOREGROUND_COLOR); listboxFFTPrefilter->callback((Fl_Callback*)cb_listboxFFTPrefilter); listboxFFTPrefilter->align(Fl_Align(FL_ALIGN_RIGHT)); listboxFFTPrefilter->when(FL_WHEN_RELEASE); listboxFFTPrefilter->add(_("Rectangular")); listboxFFTPrefilter->add("Blackman"); listboxFFTPrefilter->add("Hamming"); listboxFFTPrefilter->add("Hanning"); listboxFFTPrefilter->add(_("Triangular")); listboxFFTPrefilter->index(progdefaults.wfPreFilter); o->labelsize(FL_NORMAL_SIZE); listboxFFTPrefilter->end(); } // Fl_ListBox* listboxFFTPrefilter { Fl_Counter2* o = cntrWfwidth = new Fl_Counter2(323, 89, 95, 22, _("Upper limit")); cntrWfwidth->tooltip(_("High frequency limit in Hz")); cntrWfwidth->type(1); cntrWfwidth->box(FL_UP_BOX); cntrWfwidth->color(FL_BACKGROUND_COLOR); cntrWfwidth->selection_color(FL_INACTIVE_COLOR); cntrWfwidth->labeltype(FL_NORMAL_LABEL); cntrWfwidth->labelfont(0); cntrWfwidth->labelsize(14); cntrWfwidth->labelcolor(FL_FOREGROUND_COLOR); cntrWfwidth->minimum(2000); cntrWfwidth->maximum(4000); cntrWfwidth->step(100); cntrWfwidth->value(3000); cntrWfwidth->callback((Fl_Callback*)cb_cntrWfwidth); cntrWfwidth->align(Fl_Align(FL_ALIGN_RIGHT)); cntrWfwidth->when(FL_WHEN_CHANGED); o->value(progdefaults.HighFreqCutoff); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntrWfwidth { Fl_Counter2* o = wf_latency = new Fl_Counter2(323, 124, 95, 22, _("Latency")); wf_latency->tooltip(_("Signal averaging over time\n0 - least\n4 - greatest")); wf_latency->type(1); wf_latency->box(FL_UP_BOX); wf_latency->color(FL_BACKGROUND_COLOR); wf_latency->selection_color(FL_INACTIVE_COLOR); wf_latency->labeltype(FL_NORMAL_LABEL); wf_latency->labelfont(0); wf_latency->labelsize(14); wf_latency->labelcolor(FL_FOREGROUND_COLOR); wf_latency->minimum(1); wf_latency->maximum(16); wf_latency->step(1); wf_latency->value(8); wf_latency->callback((Fl_Callback*)cb_wf_latency); wf_latency->align(Fl_Align(FL_ALIGN_RIGHT)); wf_latency->when(FL_WHEN_CHANGED); o->value(progdefaults.wf_latency); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* wf_latency o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 212, 490, 73); o->tooltip(_("Show me more or less waterfall")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntr_drop_speed = new Fl_Counter(100, 234, 95, 22, _("Slow drop rate")); cntr_drop_speed->tooltip(_("Normal drop speed / value")); cntr_drop_speed->type(1); cntr_drop_speed->minimum(4); cntr_drop_speed->maximum(32); cntr_drop_speed->step(2); cntr_drop_speed->value(4); cntr_drop_speed->callback((Fl_Callback*)cb_cntr_drop_speed); cntr_drop_speed->align(Fl_Align(FL_ALIGN_RIGHT_TOP)); o->value(progdefaults.drop_speed); } // Fl_Counter* cntr_drop_speed o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 292, 490, 73, _("Changes take effect on next program startup")); o->tooltip(_("Show me more or less waterfall")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntrWfheight = new Fl_Counter2(100, 322, 120, 22, _("Waterfall height in pixels")); cntrWfheight->tooltip(_("CPU usage increases with waterfall height")); cntrWfheight->box(FL_UP_BOX); cntrWfheight->color(FL_BACKGROUND_COLOR); cntrWfheight->selection_color(FL_INACTIVE_COLOR); cntrWfheight->labeltype(FL_NORMAL_LABEL); cntrWfheight->labelfont(0); cntrWfheight->labelsize(14); cntrWfheight->labelcolor(FL_FOREGROUND_COLOR); cntrWfheight->minimum(100); cntrWfheight->maximum(500); cntrWfheight->step(5); cntrWfheight->value(120); cntrWfheight->callback((Fl_Callback*)cb_cntrWfheight); cntrWfheight->align(Fl_Align(FL_ALIGN_RIGHT)); cntrWfheight->when(FL_WHEN_CHANGED); o->value(progdefaults.wfheight); o->labelsize(FL_NORMAL_SIZE); o->lstep(50); } // Fl_Counter2* cntrWfheight o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 340, _("Mouse")); o->hide(); { Fl_Group* o = new Fl_Group(10, 60, 580, 170); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnWaterfallHistoryDefault = new Fl_Check_Button(65, 75, 340, 20, _("Left or right click always replays audio history")); btnWaterfallHistoryDefault->tooltip(_("Replay trackline audio")); btnWaterfallHistoryDefault->down_box(FL_DOWN_BOX); btnWaterfallHistoryDefault->callback((Fl_Callback*)cb_btnWaterfallHistoryDefault); o->value(progdefaults.WaterfallHistoryDefault); } // Fl_Check_Button* btnWaterfallHistoryDefault { Fl_Check_Button* o = btnWaterfallQSY = new Fl_Check_Button(65, 105, 380, 20, _("Dragging on the waterfall scale changes frequency")); btnWaterfallQSY->tooltip(_("Enable drag cursor on waterfall scale")); btnWaterfallQSY->down_box(FL_DOWN_BOX); btnWaterfallQSY->callback((Fl_Callback*)cb_btnWaterfallQSY); o->value(progdefaults.WaterfallQSY); } // Fl_Check_Button* btnWaterfallQSY { Fl_Check_Button* o = btnWaterfallClickInsert = new Fl_Check_Button(65, 147, 225, 20, _("Insert text on single left click")); btnWaterfallClickInsert->tooltip(_("Insert special text in Rx panel\nwhen waterfall clicked")); btnWaterfallClickInsert->down_box(FL_DOWN_BOX); btnWaterfallClickInsert->callback((Fl_Callback*)cb_btnWaterfallClickInsert); o->value(progdefaults.WaterfallClickInsert); } // Fl_Check_Button* btnWaterfallClickInsert { inpWaterfallClickText = new Fl_Input2(351, 135, 180, 50); inpWaterfallClickText->tooltip(_("The string is replaced with\nthe current modem and frequency")); inpWaterfallClickText->box(FL_DOWN_BOX); inpWaterfallClickText->color(FL_BACKGROUND2_COLOR); inpWaterfallClickText->selection_color(FL_SELECTION_COLOR); inpWaterfallClickText->labeltype(FL_NORMAL_LABEL); inpWaterfallClickText->labelfont(0); inpWaterfallClickText->labelsize(14); inpWaterfallClickText->labelcolor(FL_FOREGROUND_COLOR); inpWaterfallClickText->callback((Fl_Callback*)cb_inpWaterfallClickText); inpWaterfallClickText->align(Fl_Align(FL_ALIGN_RIGHT)); inpWaterfallClickText->when(FL_WHEN_RELEASE); } // Fl_Input2* inpWaterfallClickText { Fl_ListBox* o = listboxWaterfallWheelAction = new Fl_ListBox(65, 188, 150, 22, _("Wheel action")); listboxWaterfallWheelAction->tooltip(_("Select how the mouse wheel\nbehaves inside the waterfall")); listboxWaterfallWheelAction->box(FL_DOWN_BOX); listboxWaterfallWheelAction->color(FL_BACKGROUND2_COLOR); listboxWaterfallWheelAction->selection_color(FL_BACKGROUND_COLOR); listboxWaterfallWheelAction->labeltype(FL_NORMAL_LABEL); listboxWaterfallWheelAction->labelfont(0); listboxWaterfallWheelAction->labelsize(14); listboxWaterfallWheelAction->labelcolor(FL_FOREGROUND_COLOR); listboxWaterfallWheelAction->callback((Fl_Callback*)cb_listboxWaterfallWheelAction); listboxWaterfallWheelAction->align(Fl_Align(FL_ALIGN_RIGHT)); listboxWaterfallWheelAction->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listboxWaterfallWheelAction->end(); } // Fl_ListBox* listboxWaterfallWheelAction o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 340, _("Spectrum")); { Fl_Group* o = new Fl_Group(10, 65, 580, 150, _("Spectrum Scope / Waterfall interaction")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnWFspectrum_center = new Fl_Check_Button(75, 107, 365, 20, _("left click transfers frequency to scope center frequency")); btnWFspectrum_center->tooltip(_("left click on WF recenters spectrum scope")); btnWFspectrum_center->down_box(FL_DOWN_BOX); btnWFspectrum_center->callback((Fl_Callback*)cb_btnWFspectrum_center); o->value(progdefaults.wf_spectrum_center); } // Fl_Check_Button* btnWFspectrum_center { Fl_Check_Button* o = btnWFspectrum_dbvals = new Fl_Check_Button(75, 138, 221, 20, _("use waterfall range/limit values")); btnWFspectrum_dbvals->tooltip(_("values left/below waterfall")); btnWFspectrum_dbvals->down_box(FL_DOWN_BOX); btnWFspectrum_dbvals->callback((Fl_Callback*)cb_btnWFspectrum_dbvals); o->value(progdefaults.wf_spectrum_dbvals); } // Fl_Check_Button* btnWFspectrum_dbvals { Fl_Counter* o = cntr_spectrum_freq_scale = new Fl_Counter(75, 170, 75, 20, _("freq scale = N * modem bandwidth")); cntr_spectrum_freq_scale->type(1); cntr_spectrum_freq_scale->minimum(1); cntr_spectrum_freq_scale->maximum(10); cntr_spectrum_freq_scale->step(1); cntr_spectrum_freq_scale->value(5); cntr_spectrum_freq_scale->callback((Fl_Callback*)cb_cntr_spectrum_freq_scale); cntr_spectrum_freq_scale->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.wf_spectrum_scale_factor); } // Fl_Counter* cntr_spectrum_freq_scale { Fl_Check_Button* o = btn_spectrum_modem_scale = new Fl_Check_Button(385, 170, 55, 20, _("use")); btn_spectrum_modem_scale->tooltip(_("scale spectrum display linked to modem bandwidth")); btn_spectrum_modem_scale->down_box(FL_DOWN_BOX); btn_spectrum_modem_scale->callback((Fl_Callback*)cb_btn_spectrum_modem_scale); o->value(progdefaults.wf_spectrum_modem_scale); } // Fl_Check_Button* btn_spectrum_modem_scale o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabsWaterfall->end(); } // Fl_Tabs* tabsWaterfall tabWaterfall->end(); } // Fl_Group* tabWaterfall { tabModems = new Fl_Group(0, 25, 609, 365, _("Modems")); tabModems->hide(); { tabsModems = new Fl_Tabs(0, 25, 609, 365); tabsModems->selection_color(FL_LIGHT1); tabsModems->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); { tabCW = new Fl_Group(0, 50, 600, 340, _("CW")); { tabsCW = new Fl_Tabs(0, 50, 600, 340); tabsCW->selection_color(FL_LIGHT1); { tabsCW_general = new Fl_Group(0, 75, 600, 315, _("General")); tabsCW_general->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Group* o = new Fl_Group(35, 85, 530, 130, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnCWuseSOMdecoding = new Fl_Check_Button(96, 108, 125, 20, _("SOM decoding")); btnCWuseSOMdecoding->tooltip(_("Self Organizing Mapping")); btnCWuseSOMdecoding->down_box(FL_DOWN_BOX); btnCWuseSOMdecoding->value(1); btnCWuseSOMdecoding->callback((Fl_Callback*)cb_btnCWuseSOMdecoding); o->value(progdefaults.CWuseSOMdecoding); } // Fl_Check_Button* btnCWuseSOMdecoding { Fl_Check_Button* o = btnCWrcvTrack = new Fl_Check_Button(250, 108, 80, 20, _("Tracking")); btnCWrcvTrack->tooltip(_("Automatic Rx speed tracking")); btnCWrcvTrack->down_box(FL_DOWN_BOX); btnCWrcvTrack->value(1); btnCWrcvTrack->callback((Fl_Callback*)cb_btnCWrcvTrack); o->value(progdefaults.CWtrack); } // Fl_Check_Button* btnCWrcvTrack { Fl_Value_Slider2* o = sldrCWbandwidth = new Fl_Value_Slider2(50, 149, 250, 20, _("Filter bandwidth")); sldrCWbandwidth->tooltip(_("CW dsp filter bandwidth")); sldrCWbandwidth->type(1); sldrCWbandwidth->box(FL_DOWN_BOX); sldrCWbandwidth->color(FL_BACKGROUND_COLOR); sldrCWbandwidth->selection_color(FL_BACKGROUND_COLOR); sldrCWbandwidth->labeltype(FL_NORMAL_LABEL); sldrCWbandwidth->labelfont(0); sldrCWbandwidth->labelsize(14); sldrCWbandwidth->labelcolor(FL_FOREGROUND_COLOR); sldrCWbandwidth->minimum(10); sldrCWbandwidth->maximum(400); sldrCWbandwidth->step(1); sldrCWbandwidth->value(66); sldrCWbandwidth->textsize(14); sldrCWbandwidth->callback((Fl_Callback*)cb_sldrCWbandwidth); sldrCWbandwidth->align(Fl_Align(FL_ALIGN_TOP_LEFT)); sldrCWbandwidth->when(FL_WHEN_CHANGED); o->value(progdefaults.CWbandwidth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWbandwidth { Fl_Check_Button* o = btnCWmfilt = new Fl_Check_Button(303, 149, 80, 20, _("Matched Filt\'")); btnCWmfilt->tooltip(_("Matched Filter bandwidth")); btnCWmfilt->down_box(FL_DOWN_BOX); btnCWmfilt->value(1); btnCWmfilt->callback((Fl_Callback*)cb_btnCWmfilt); o->value(progdefaults.CWmfilt); } // Fl_Check_Button* btnCWmfilt { valCWrcvWPM = new Fl_Value_Output(50, 188, 35, 20, _("Rx WPM")); valCWrcvWPM->color(FL_BACKGROUND2_COLOR); valCWrcvWPM->callback((Fl_Callback*)cb_valCWrcvWPM); valCWrcvWPM->align(Fl_Align(FL_ALIGN_TOP_LEFT)); } // Fl_Value_Output* valCWrcvWPM { prgsCWrcvWPM = new Fl_Progress(86, 188, 214, 20); prgsCWrcvWPM->tooltip(_("Tracked CW speed in WPM")); prgsCWrcvWPM->color(FL_BACKGROUND_COLOR); prgsCWrcvWPM->selection_color(FL_SELECTION_COLOR); prgsCWrcvWPM->align(Fl_Align(FL_ALIGN_CENTER)); } // Fl_Progress* prgsCWrcvWPM { Fl_Counter2* o = cntLower = new Fl_Counter2(209, 108, 65, 20, _("Lower")); cntLower->tooltip(_("Detector low threshold")); cntLower->type(1); cntLower->box(FL_UP_BOX); cntLower->color(FL_BACKGROUND_COLOR); cntLower->selection_color(FL_INACTIVE_COLOR); cntLower->labeltype(FL_NORMAL_LABEL); cntLower->labelfont(0); cntLower->labelsize(14); cntLower->labelcolor(FL_FOREGROUND_COLOR); cntLower->minimum(0.01); cntLower->maximum(0.99); cntLower->step(0.01); cntLower->value(0.45); cntLower->callback((Fl_Callback*)cb_cntLower); cntLower->align(Fl_Align(FL_ALIGN_TOP)); cntLower->when(FL_WHEN_CHANGED); cntLower->hide(); o->value(progdefaults.CWlower); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntLower { Fl_Counter2* o = cntUpper = new Fl_Counter2(302, 108, 65, 20, _("Upper")); cntUpper->tooltip(_("Detector high threshold")); cntUpper->type(1); cntUpper->box(FL_UP_BOX); cntUpper->color(FL_BACKGROUND_COLOR); cntUpper->selection_color(FL_INACTIVE_COLOR); cntUpper->labeltype(FL_NORMAL_LABEL); cntUpper->labelfont(0); cntUpper->labelsize(14); cntUpper->labelcolor(FL_FOREGROUND_COLOR); cntUpper->minimum(0.01); cntUpper->maximum(0.99); cntUpper->step(0.01); cntUpper->value(0.55); cntUpper->callback((Fl_Callback*)cb_cntUpper); cntUpper->align(Fl_Align(FL_ALIGN_TOP)); cntUpper->when(FL_WHEN_CHANGED); cntUpper->hide(); o->value(progdefaults.CWupper); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntUpper { Fl_Counter2* o = cntCWrange = new Fl_Counter2(303, 187, 65, 20, _("Range")); cntCWrange->tooltip(_("Range +/- wpm")); cntCWrange->type(1); cntCWrange->box(FL_UP_BOX); cntCWrange->color(FL_BACKGROUND_COLOR); cntCWrange->selection_color(FL_INACTIVE_COLOR); cntCWrange->labeltype(FL_NORMAL_LABEL); cntCWrange->labelfont(0); cntCWrange->labelsize(14); cntCWrange->labelcolor(FL_FOREGROUND_COLOR); cntCWrange->minimum(5); cntCWrange->maximum(25); cntCWrange->step(1); cntCWrange->value(10); cntCWrange->callback((Fl_Callback*)cb_cntCWrange); cntCWrange->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWrange->when(FL_WHEN_CHANGED); o->value(progdefaults.CWrange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWrange { Fl_Group* o = new Fl_Group(425, 110, 135, 95, _("Squelch")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Choice* o = mnu_cwrx_attack = new Fl_Choice(480, 140, 72, 20, _("Attack")); mnu_cwrx_attack->down_box(FL_BORDER_BOX); mnu_cwrx_attack->callback((Fl_Callback*)cb_mnu_cwrx_attack); o->add("Slow|Med|Fast"); o->value(progdefaults.cwrx_attack); } // Fl_Choice* mnu_cwrx_attack { Fl_Choice* o = mnu_cwrx_decay = new Fl_Choice(480, 175, 72, 20, _("Decay")); mnu_cwrx_decay->down_box(FL_BORDER_BOX); mnu_cwrx_decay->callback((Fl_Callback*)cb_mnu_cwrx_decay); o->add("Slow|Med|Fast"); o->value(progdefaults.cwrx_decay); } // Fl_Choice* mnu_cwrx_decay o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(35, 215, 530, 150, _("Transmit")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Slider2* o = sldrCWxmtWPM = new Fl_Value_Slider2(50, 240, 440, 20, _("TX WPM")); sldrCWxmtWPM->tooltip(_("My transmit CW WPM")); sldrCWxmtWPM->type(1); sldrCWxmtWPM->box(FL_DOWN_BOX); sldrCWxmtWPM->color(FL_BACKGROUND_COLOR); sldrCWxmtWPM->selection_color(FL_BACKGROUND_COLOR); sldrCWxmtWPM->labeltype(FL_NORMAL_LABEL); sldrCWxmtWPM->labelfont(0); sldrCWxmtWPM->labelsize(14); sldrCWxmtWPM->labelcolor(FL_FOREGROUND_COLOR); sldrCWxmtWPM->minimum(5); sldrCWxmtWPM->maximum(100); sldrCWxmtWPM->step(1); sldrCWxmtWPM->value(20); sldrCWxmtWPM->textsize(14); sldrCWxmtWPM->callback((Fl_Callback*)cb_sldrCWxmtWPM); sldrCWxmtWPM->align(Fl_Align(FL_ALIGN_RIGHT)); sldrCWxmtWPM->when(FL_WHEN_CHANGED); o->value(progdefaults.CWspeed); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWxmtWPM { Fl_Counter2* o = cntCWdefWPM = new Fl_Counter2(91, 281, 64, 20, _("Default")); cntCWdefWPM->tooltip(_("The default CW speed")); cntCWdefWPM->type(1); cntCWdefWPM->box(FL_UP_BOX); cntCWdefWPM->color(FL_BACKGROUND_COLOR); cntCWdefWPM->selection_color(FL_INACTIVE_COLOR); cntCWdefWPM->labeltype(FL_NORMAL_LABEL); cntCWdefWPM->labelfont(0); cntCWdefWPM->labelsize(14); cntCWdefWPM->labelcolor(FL_FOREGROUND_COLOR); cntCWdefWPM->minimum(5); cntCWdefWPM->maximum(200); cntCWdefWPM->step(1); cntCWdefWPM->value(18); cntCWdefWPM->callback((Fl_Callback*)cb_cntCWdefWPM); cntCWdefWPM->align(Fl_Align(FL_ALIGN_TOP)); cntCWdefWPM->when(FL_WHEN_CHANGED); o->value(progdefaults.defCWspeed); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWdefWPM { Fl_Counter* o = cntCWlowerlimit = new Fl_Counter(245, 281, 65, 20, _("Lower limit")); cntCWlowerlimit->tooltip(_("No slower than this")); cntCWlowerlimit->type(1); cntCWlowerlimit->minimum(5); cntCWlowerlimit->maximum(20); cntCWlowerlimit->step(5); cntCWlowerlimit->value(10); cntCWlowerlimit->callback((Fl_Callback*)cb_cntCWlowerlimit); cntCWlowerlimit->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.CWlowerlimit); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter* cntCWlowerlimit { Fl_Counter* o = cntCWupperlimit = new Fl_Counter(401, 281, 65, 20, _("Upper limit")); cntCWupperlimit->tooltip(_("No faster than this")); cntCWupperlimit->type(1); cntCWupperlimit->minimum(25); cntCWupperlimit->maximum(200); cntCWupperlimit->step(5); cntCWupperlimit->value(100); cntCWupperlimit->callback((Fl_Callback*)cb_cntCWupperlimit); cntCWupperlimit->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.CWupperlimit); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter* cntCWupperlimit { Fl_Value_Slider2* o = sldrCWfarnsworth = new Fl_Value_Slider2(50, 335, 440, 20, _("F-WPM")); sldrCWfarnsworth->tooltip(_("My transmit CW WPM")); sldrCWfarnsworth->type(1); sldrCWfarnsworth->box(FL_DOWN_BOX); sldrCWfarnsworth->color(FL_BACKGROUND_COLOR); sldrCWfarnsworth->selection_color(FL_BACKGROUND_COLOR); sldrCWfarnsworth->labeltype(FL_NORMAL_LABEL); sldrCWfarnsworth->labelfont(0); sldrCWfarnsworth->labelsize(14); sldrCWfarnsworth->labelcolor(FL_FOREGROUND_COLOR); sldrCWfarnsworth->minimum(5); sldrCWfarnsworth->maximum(100); sldrCWfarnsworth->step(1); sldrCWfarnsworth->value(20); sldrCWfarnsworth->textsize(14); sldrCWfarnsworth->callback((Fl_Callback*)cb_sldrCWfarnsworth); sldrCWfarnsworth->align(Fl_Align(FL_ALIGN_RIGHT)); sldrCWfarnsworth->when(FL_WHEN_CHANGED); o->value(progdefaults.CWfarnsworth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWfarnsworth { Fl_Check_Button* o = btnCWusefarnsworth = new Fl_Check_Button(70, 312, 180, 15, _("Use Farnsworth timing")); btnCWusefarnsworth->down_box(FL_DOWN_BOX); btnCWusefarnsworth->callback((Fl_Callback*)cb_btnCWusefarnsworth); o->value(progdefaults.CWusefarnsworth); } // Fl_Check_Button* btnCWusefarnsworth o->end(); } // Fl_Group* o tabsCW_general->end(); } // Fl_Group* tabsCW_general { tabsCW_timing = new Fl_Group(0, 75, 600, 315, _("Timing and QSK")); tabsCW_timing->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tabsCW_timing->hide(); { Fl_Group* o = new Fl_Group(5, 85, 585, 120, _("Timing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntCWweight = new Fl_Counter2(20, 110, 65, 20, _("Weight (%)")); cntCWweight->tooltip(_("Dot to dot-space ratio")); cntCWweight->type(1); cntCWweight->box(FL_UP_BOX); cntCWweight->color(FL_BACKGROUND_COLOR); cntCWweight->selection_color(FL_INACTIVE_COLOR); cntCWweight->labeltype(FL_NORMAL_LABEL); cntCWweight->labelfont(0); cntCWweight->labelsize(14); cntCWweight->labelcolor(FL_FOREGROUND_COLOR); cntCWweight->minimum(20); cntCWweight->maximum(80); cntCWweight->step(1); cntCWweight->value(50); cntCWweight->callback((Fl_Callback*)cb_cntCWweight); cntCWweight->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWweight->when(FL_WHEN_CHANGED); o->value(progdefaults.CWweight); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWweight { Fl_Counter2* o = cntCWdash2dot = new Fl_Counter2(245, 110, 80, 20, _("Dash/Dot")); cntCWdash2dot->tooltip(_("Dash to dot ratio")); cntCWdash2dot->type(1); cntCWdash2dot->box(FL_UP_BOX); cntCWdash2dot->color(FL_BACKGROUND_COLOR); cntCWdash2dot->selection_color(FL_INACTIVE_COLOR); cntCWdash2dot->labeltype(FL_NORMAL_LABEL); cntCWdash2dot->labelfont(0); cntCWdash2dot->labelsize(14); cntCWdash2dot->labelcolor(FL_FOREGROUND_COLOR); cntCWdash2dot->minimum(2.5); cntCWdash2dot->maximum(4); cntCWdash2dot->value(3); cntCWdash2dot->callback((Fl_Callback*)cb_cntCWdash2dot); cntCWdash2dot->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWdash2dot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWdash2dot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWdash2dot { Fl_Counter2* o = cntCWrisetime = new Fl_Counter2(245, 143, 80, 20, _("Edge timing")); cntCWrisetime->tooltip(_("Leading and Trailing edge risetimes (msec)")); cntCWrisetime->type(1); cntCWrisetime->box(FL_UP_BOX); cntCWrisetime->color(FL_BACKGROUND_COLOR); cntCWrisetime->selection_color(FL_INACTIVE_COLOR); cntCWrisetime->labeltype(FL_NORMAL_LABEL); cntCWrisetime->labelfont(0); cntCWrisetime->labelsize(14); cntCWrisetime->labelcolor(FL_FOREGROUND_COLOR); cntCWrisetime->minimum(0); cntCWrisetime->maximum(15); cntCWrisetime->value(4); cntCWrisetime->callback((Fl_Callback*)cb_cntCWrisetime); cntCWrisetime->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWrisetime->when(FL_WHEN_CHANGED); o->value(progdefaults.CWrisetime); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWrisetime { Fl_ListBox* o = i_listboxQSKshape = new Fl_ListBox(20, 143, 112, 20, _("Edge shape")); i_listboxQSKshape->tooltip(_("Hanning/Blackman - use edge timing\nBPF - use BPF bandwidth")); i_listboxQSKshape->box(FL_DOWN_BOX); i_listboxQSKshape->color(FL_BACKGROUND2_COLOR); i_listboxQSKshape->selection_color(FL_BACKGROUND_COLOR); i_listboxQSKshape->labeltype(FL_NORMAL_LABEL); i_listboxQSKshape->labelfont(0); i_listboxQSKshape->labelsize(14); i_listboxQSKshape->labelcolor(FL_FOREGROUND_COLOR); i_listboxQSKshape->callback((Fl_Callback*)cb_i_listboxQSKshape); i_listboxQSKshape->align(Fl_Align(FL_ALIGN_RIGHT)); i_listboxQSKshape->when(FL_WHEN_RELEASE); o->add("Hanning|Blackman"); o->index(progdefaults.QSKshape); o->labelsize(FL_NORMAL_SIZE); i_listboxQSKshape->end(); } // Fl_ListBox* i_listboxQSKshape { Fl_Check_Button* o = btnCWnarrow = new Fl_Check_Button(450, 145, 131, 15, _("Edge decrease")); btnCWnarrow->tooltip(_("Weight decreases with increasing edge timing")); btnCWnarrow->down_box(FL_DOWN_BOX); btnCWnarrow->callback((Fl_Callback*)cb_btnCWnarrow); o->value(progdefaults.CWnarrow); } // Fl_Check_Button* btnCWnarrow { Fl_Check_Button* o = btnCW_bpf_on = new Fl_Check_Button(20, 180, 167, 15, _("BPF transmit audio")); btnCW_bpf_on->tooltip(_("Enable LO/HI bfp of transmit audio")); btnCW_bpf_on->down_box(FL_DOWN_BOX); btnCW_bpf_on->callback((Fl_Callback*)cb_btnCW_bpf_on); o->value(progdefaults.CW_bpf_on); } // Fl_Check_Button* btnCW_bpf_on { Fl_Counter2* o = cntCW_hpf = new Fl_Counter2(235, 177, 100, 20, _("BPF bw")); cntCW_hpf->tooltip(_("Low filter cutoff")); cntCW_hpf->box(FL_UP_BOX); cntCW_hpf->color(FL_BACKGROUND_COLOR); cntCW_hpf->selection_color(FL_INACTIVE_COLOR); cntCW_hpf->labeltype(FL_NORMAL_LABEL); cntCW_hpf->labelfont(0); cntCW_hpf->labelsize(14); cntCW_hpf->labelcolor(FL_FOREGROUND_COLOR); cntCW_hpf->minimum(10); cntCW_hpf->maximum(1000); cntCW_hpf->step(1); cntCW_hpf->value(100); cntCW_hpf->callback((Fl_Callback*)cb_cntCW_hpf); cntCW_hpf->align(Fl_Align(FL_ALIGN_RIGHT)); cntCW_hpf->when(FL_WHEN_CHANGED); o->value(progdefaults.CW_bpf); o->labelsize(FL_NORMAL_SIZE); o->lstep(10.0); } // Fl_Counter2* cntCW_hpf o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 217, 585, 118, _("QSK")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnQSK = new Fl_Check_Button(16, 245, 233, 20, _("QSK on right audio channel")); btnQSK->tooltip(_("Generate square wave signal on right channel")); btnQSK->down_box(FL_DOWN_BOX); btnQSK->callback((Fl_Callback*)cb_btnQSK); o->value(progdefaults.QSK); } // Fl_Check_Button* btnQSK { Fl_Counter2* o = cntPreTiming = new Fl_Counter2(16, 275, 71, 20, _("Pre-keydown timing (ms)")); cntPreTiming->tooltip(_("Msec pre-keydown (+ is earlier in time)")); cntPreTiming->type(1); cntPreTiming->box(FL_UP_BOX); cntPreTiming->color(FL_BACKGROUND_COLOR); cntPreTiming->selection_color(FL_INACTIVE_COLOR); cntPreTiming->labeltype(FL_NORMAL_LABEL); cntPreTiming->labelfont(0); cntPreTiming->labelsize(14); cntPreTiming->labelcolor(FL_FOREGROUND_COLOR); cntPreTiming->minimum(0); cntPreTiming->maximum(20); cntPreTiming->step(0.5); cntPreTiming->callback((Fl_Callback*)cb_cntPreTiming); cntPreTiming->align(Fl_Align(FL_ALIGN_RIGHT)); cntPreTiming->when(FL_WHEN_CHANGED); o->value(progdefaults.CWpre); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntPreTiming { Fl_Counter2* o = cntPostTiming = new Fl_Counter2(16, 305, 71, 20, _("Post-keydown timing (ms)")); cntPostTiming->tooltip(_("Msec post-keydown (+ is earlier in time)")); cntPostTiming->type(1); cntPostTiming->box(FL_UP_BOX); cntPostTiming->color(FL_BACKGROUND_COLOR); cntPostTiming->selection_color(FL_INACTIVE_COLOR); cntPostTiming->labeltype(FL_NORMAL_LABEL); cntPostTiming->labelfont(0); cntPostTiming->labelsize(14); cntPostTiming->labelcolor(FL_FOREGROUND_COLOR); cntPostTiming->minimum(-20); cntPostTiming->maximum(20); cntPostTiming->step(0.5); cntPostTiming->callback((Fl_Callback*)cb_cntPostTiming); cntPostTiming->align(Fl_Align(FL_ALIGN_RIGHT)); cntPostTiming->when(FL_WHEN_CHANGED); o->value(progdefaults.CWpre); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntPostTiming { Fl_Check_Button* o = btnQSKadjust = new Fl_Check_Button(320, 275, 176, 20, _("Send continuously")); btnQSKadjust->tooltip(_("Send a continuous stream of test characters")); btnQSKadjust->down_box(FL_DOWN_BOX); btnQSKadjust->callback((Fl_Callback*)cb_btnQSKadjust); o->value(progdefaults.QSKadjust); } // Fl_Check_Button* btnQSKadjust { Fl_ListBox* o = i_listbox_test_char = new Fl_ListBox(320, 245, 45, 20, _("Test char")); i_listbox_test_char->tooltip(_("Test character for QSK adjustment")); i_listbox_test_char->box(FL_DOWN_BOX); i_listbox_test_char->color(FL_BACKGROUND2_COLOR); i_listbox_test_char->selection_color(FL_BACKGROUND_COLOR); i_listbox_test_char->labeltype(FL_NORMAL_LABEL); i_listbox_test_char->labelfont(0); i_listbox_test_char->labelsize(14); i_listbox_test_char->labelcolor(FL_FOREGROUND_COLOR); i_listbox_test_char->callback((Fl_Callback*)cb_i_listbox_test_char); i_listbox_test_char->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_test_char->when(FL_WHEN_RELEASE); o->add(szTestChar); o->index(progdefaults.TestChar); o->labelsize(FL_NORMAL_SIZE); i_listbox_test_char->end(); } // Fl_ListBox* i_listbox_test_char o->end(); } // Fl_Group* o tabsCW_timing->end(); } // Fl_Group* tabsCW_timing { tabsCW_prosigns = new Fl_Group(0, 75, 600, 315, _("Prosigns")); tabsCW_prosigns->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tabsCW_prosigns->hide(); { Fl_Group* o = new Fl_Group(35, 85, 530, 283); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnCW_use_paren = new Fl_Check_Button(161, 244, 68, 15, _("Use \'(\' paren not KN")); btnCW_use_paren->down_box(FL_DOWN_BOX); btnCW_use_paren->callback((Fl_Callback*)cb_btnCW_use_paren); o->value(progdefaults.CW_use_paren); } // Fl_Check_Button* btnCW_use_paren { Fl_Group* o = new Fl_Group(362, 96, 182, 262, _("Use these for WinKeyer\nand nanoCW")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Box* o = new Fl_Box(422, 127, 59, 22, _("\" RR")); o->tooltip(_(".-..-.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 147, 59, 22, _("$ SX")); o->tooltip(_("...-..-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 166, 59, 22, _("\' WG")); o->tooltip(_(".----.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 185, 59, 22, _("( KN")); o->tooltip(_("-.--.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 204, 59, 22, _(") KK")); o->tooltip(_("-.--.-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 223, 59, 22, _("+ AR")); o->tooltip(_(".-.-.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 242, 59, 22, _("< AR")); o->tooltip(_(".-.-.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 261, 59, 22, _("> SK")); o->tooltip(_("...-.-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 280, 59, 22, _("= BT")); o->tooltip(_("-...-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 299, 59, 22, _("- DU")); o->tooltip(_("-....-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(422, 320, 59, 22, _("@@ AC")); o->tooltip(_(".--.-.")); } // Fl_Box* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_ListBox* o = listbox_prosign[0] = new Fl_ListBox(106, 102, 47, 22, _("")); listbox_prosign[0]->box(FL_DOWN_BOX); listbox_prosign[0]->color(FL_BACKGROUND2_COLOR); listbox_prosign[0]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[0]->labeltype(FL_NORMAL_LABEL); listbox_prosign[0]->labelfont(0); listbox_prosign[0]->labelsize(14); listbox_prosign[0]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[0]->callback((Fl_Callback*)cb_listbox_prosign); listbox_prosign[0]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[0]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[0]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[0]->end(); } // Fl_ListBox* listbox_prosign[0] { Fl_ListBox* o = listbox_prosign[1] = new Fl_ListBox(106, 129, 47, 22, _("")); listbox_prosign[1]->box(FL_DOWN_BOX); listbox_prosign[1]->color(FL_BACKGROUND2_COLOR); listbox_prosign[1]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[1]->labeltype(FL_NORMAL_LABEL); listbox_prosign[1]->labelfont(0); listbox_prosign[1]->labelsize(14); listbox_prosign[1]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[1]->callback((Fl_Callback*)cb_listbox_prosign1); listbox_prosign[1]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[1]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[1]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[1]->end(); } // Fl_ListBox* listbox_prosign[1] { Fl_ListBox* o = listbox_prosign[2] = new Fl_ListBox(106, 157, 47, 22, _("")); listbox_prosign[2]->box(FL_DOWN_BOX); listbox_prosign[2]->color(FL_BACKGROUND2_COLOR); listbox_prosign[2]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[2]->labeltype(FL_NORMAL_LABEL); listbox_prosign[2]->labelfont(0); listbox_prosign[2]->labelsize(14); listbox_prosign[2]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[2]->callback((Fl_Callback*)cb_listbox_prosign2); listbox_prosign[2]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[2]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[2]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[2]->end(); } // Fl_ListBox* listbox_prosign[2] { Fl_ListBox* o = listbox_prosign[3] = new Fl_ListBox(106, 184, 47, 22, _("")); listbox_prosign[3]->box(FL_DOWN_BOX); listbox_prosign[3]->color(FL_BACKGROUND2_COLOR); listbox_prosign[3]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[3]->labeltype(FL_NORMAL_LABEL); listbox_prosign[3]->labelfont(0); listbox_prosign[3]->labelsize(14); listbox_prosign[3]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[3]->callback((Fl_Callback*)cb_listbox_prosign3); listbox_prosign[3]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[3]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[3]; o->value(s); listbox_prosign[3]->end(); } // Fl_ListBox* listbox_prosign[3] { Fl_ListBox* o = listbox_prosign[4] = new Fl_ListBox(106, 212, 47, 22, _("")); listbox_prosign[4]->box(FL_DOWN_BOX); listbox_prosign[4]->color(FL_BACKGROUND2_COLOR); listbox_prosign[4]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[4]->labeltype(FL_NORMAL_LABEL); listbox_prosign[4]->labelfont(0); listbox_prosign[4]->labelsize(14); listbox_prosign[4]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[4]->callback((Fl_Callback*)cb_listbox_prosign4); listbox_prosign[4]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[4]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[4]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[4]->end(); } // Fl_ListBox* listbox_prosign[4] { Fl_ListBox* o = listbox_prosign[5] = new Fl_ListBox(106, 240, 47, 22, _("")); listbox_prosign[5]->box(FL_DOWN_BOX); listbox_prosign[5]->color(FL_BACKGROUND2_COLOR); listbox_prosign[5]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[5]->labeltype(FL_NORMAL_LABEL); listbox_prosign[5]->labelfont(0); listbox_prosign[5]->labelsize(14); listbox_prosign[5]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[5]->callback((Fl_Callback*)cb_listbox_prosign5); listbox_prosign[5]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[5]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[5]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[5]->end(); } // Fl_ListBox* listbox_prosign[5] { Fl_ListBox* o = listbox_prosign[6] = new Fl_ListBox(106, 267, 47, 22, _("")); listbox_prosign[6]->box(FL_DOWN_BOX); listbox_prosign[6]->color(FL_BACKGROUND2_COLOR); listbox_prosign[6]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[6]->labeltype(FL_NORMAL_LABEL); listbox_prosign[6]->labelfont(0); listbox_prosign[6]->labelsize(14); listbox_prosign[6]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[6]->callback((Fl_Callback*)cb_listbox_prosign6); listbox_prosign[6]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[6]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[6]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[6]->end(); } // Fl_ListBox* listbox_prosign[6] { Fl_ListBox* o = listbox_prosign[7] = new Fl_ListBox(106, 295, 47, 22, _("")); listbox_prosign[7]->box(FL_DOWN_BOX); listbox_prosign[7]->color(FL_BACKGROUND2_COLOR); listbox_prosign[7]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[7]->labeltype(FL_NORMAL_LABEL); listbox_prosign[7]->labelfont(0); listbox_prosign[7]->labelsize(14); listbox_prosign[7]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[7]->callback((Fl_Callback*)cb_listbox_prosign7); listbox_prosign[7]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[7]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[7]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[7]->end(); } // Fl_ListBox* listbox_prosign[7] { Fl_ListBox* o = listbox_prosign[8] = new Fl_ListBox(106, 323, 47, 22, _("")); listbox_prosign[8]->box(FL_DOWN_BOX); listbox_prosign[8]->color(FL_BACKGROUND2_COLOR); listbox_prosign[8]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[8]->labeltype(FL_NORMAL_LABEL); listbox_prosign[8]->labelfont(0); listbox_prosign[8]->labelsize(14); listbox_prosign[8]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[8]->callback((Fl_Callback*)cb_listbox_prosign8); listbox_prosign[8]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[8]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[8]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[8]->end(); } // Fl_ListBox* listbox_prosign[8] tabsCW_prosigns->end(); } // Fl_Group* tabsCW_prosigns { tabsCW_winkeyer = new Fl_Group(0, 75, 600, 315, _("WinKeyer")); tabsCW_winkeyer->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tabsCW_winkeyer->hide(); { Fl_ComboBox* o = select_WK_CommPort = new Fl_ComboBox(69, 85, 405, 23, _("Ser. Port")); select_WK_CommPort->tooltip(_("Xcvr serial port")); select_WK_CommPort->box(FL_DOWN_BOX); select_WK_CommPort->color((Fl_Color)55); select_WK_CommPort->selection_color(FL_BACKGROUND_COLOR); select_WK_CommPort->labeltype(FL_NORMAL_LABEL); select_WK_CommPort->labelfont(0); select_WK_CommPort->labelsize(14); select_WK_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_WK_CommPort->callback((Fl_Callback*)cb_select_WK_CommPort); select_WK_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_WK_CommPort->when(FL_WHEN_RELEASE); o->value(progStatus.WK_serial_port_name.c_str()); select_WK_CommPort->end(); } // Fl_ComboBox* select_WK_CommPort { Fl_Light_Button* o = btn_WKCW_connect = new Fl_Light_Button(500, 85, 80, 23, _("Connect")); btn_WKCW_connect->tooltip(_("Connect / Disconnect from WinKeyer")); btn_WKCW_connect->callback((Fl_Callback*)cb_btn_WKCW_connect); o->value(progStatus.WK_online); } // Fl_Light_Button* btn_WKCW_connect { Fl_Group* o = new Fl_Group(10, 191, 134, 171, _("ModeReg")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { btn_WK_swap = new Fl_Check_Button(20, 217, 70, 15, _("Swap")); btn_WK_swap->tooltip(_("Swap left/right keyer contacts")); btn_WK_swap->down_box(FL_DOWN_BOX); btn_WK_swap->callback((Fl_Callback*)cb_btn_WK_swap); } // Fl_Check_Button* btn_WK_swap { btn_WK_auto_space = new Fl_Check_Button(20, 247, 70, 15, _("Auto Space")); btn_WK_auto_space->tooltip(_("Enable paddle auto spacing of characters")); btn_WK_auto_space->down_box(FL_DOWN_BOX); btn_WK_auto_space->callback((Fl_Callback*)cb_btn_WK_auto_space); } // Fl_Check_Button* btn_WK_auto_space { btn_WK_ct_space = new Fl_Check_Button(20, 277, 70, 15, _("CT space")); btn_WK_ct_space->tooltip(_("Enable contest character spacing")); btn_WK_ct_space->down_box(FL_DOWN_BOX); btn_WK_ct_space->callback((Fl_Callback*)cb_btn_WK_ct_space); } // Fl_Check_Button* btn_WK_ct_space { btn_WK_paddledog = new Fl_Check_Button(20, 307, 70, 15, _("Paddle Dog")); btn_WK_paddledog->down_box(FL_DOWN_BOX); btn_WK_paddledog->callback((Fl_Callback*)cb_btn_WK_paddledog); } // Fl_Check_Button* btn_WK_paddledog { btn_WK_cut_zeronine = new Fl_Check_Button(20, 337, 70, 15, _("Cut 0/9")); btn_WK_cut_zeronine->tooltip(_("Use T/N for 0/9")); btn_WK_cut_zeronine->down_box(FL_DOWN_BOX); btn_WK_cut_zeronine->callback((Fl_Callback*)cb_btn_WK_cut_zeronine); } // Fl_Check_Button* btn_WK_cut_zeronine o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(167, 191, 134, 171, _("ModeReg")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { btn_WK_paddle_echo = new Fl_Check_Button(173, 217, 70, 16, _("Paddle echo")); btn_WK_paddle_echo->tooltip(_("Echo paddle chars to Rx Panel")); btn_WK_paddle_echo->down_box(FL_DOWN_BOX); btn_WK_paddle_echo->callback((Fl_Callback*)cb_btn_WK_paddle_echo); } // Fl_Check_Button* btn_WK_paddle_echo { btn_WK_serial_echo = new Fl_Check_Button(173, 247, 70, 16, _("Serial echo")); btn_WK_serial_echo->down_box(FL_DOWN_BOX); btn_WK_serial_echo->value(1); btn_WK_serial_echo->callback((Fl_Callback*)cb_btn_WK_serial_echo); } // Fl_Check_Button* btn_WK_serial_echo { btn_WK_sidetone_on = new Fl_Check_Button(173, 277, 103, 16, _("Tone Keyer")); btn_WK_sidetone_on->tooltip(_("Enable Winkeyer tone keying")); btn_WK_sidetone_on->down_box(FL_DOWN_BOX); btn_WK_sidetone_on->callback((Fl_Callback*)cb_btn_WK_sidetone_on); } // Fl_Check_Button* btn_WK_sidetone_on { btn_WK_tone_on = new Fl_Check_Button(173, 307, 87, 16, _("Tone ON")); btn_WK_tone_on->tooltip(_("Enable Winkeyer audio tone")); btn_WK_tone_on->down_box(FL_DOWN_BOX); btn_WK_tone_on->callback((Fl_Callback*)cb_btn_WK_tone_on); } // Fl_Check_Button* btn_WK_tone_on { btn_WK_ptt_on = new Fl_Check_Button(173, 337, 87, 16, _("PTT ON")); btn_WK_ptt_on->tooltip(_("Enable Winkeyer PTT output")); btn_WK_ptt_on->down_box(FL_DOWN_BOX); btn_WK_ptt_on->callback((Fl_Callback*)cb_btn_WK_ptt_on); } // Fl_Check_Button* btn_WK_ptt_on o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(310, 191, 112, 192, _("WPM Settings")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { cntr_WK_min_wpm = new Fl_Counter(331, 215, 64, 22, _("Min WPM")); cntr_WK_min_wpm->tooltip(_("Minimum WPM setting\ndefault = 10")); cntr_WK_min_wpm->type(1); cntr_WK_min_wpm->minimum(10); cntr_WK_min_wpm->maximum(30); cntr_WK_min_wpm->step(1); cntr_WK_min_wpm->value(10); cntr_WK_min_wpm->callback((Fl_Callback*)cb_cntr_WK_min_wpm); } // Fl_Counter* cntr_WK_min_wpm { cntr_WK_rng_wpm = new Fl_Counter(331, 258, 64, 21, _("Rng WPM")); cntr_WK_rng_wpm->tooltip(_("Range WPM setting\ndefault = 25")); cntr_WK_rng_wpm->type(1); cntr_WK_rng_wpm->callback((Fl_Callback*)cb_cntr_WK_rng_wpm); } // Fl_Counter* cntr_WK_rng_wpm { cntr_WK_farnsworth = new Fl_Counter(331, 300, 64, 22, _("Farsnworth")); cntr_WK_farnsworth->tooltip(_("Farnsworth keying (0 = none)\ndefault = 0")); cntr_WK_farnsworth->type(1); cntr_WK_farnsworth->callback((Fl_Callback*)cb_cntr_WK_farnsworth); } // Fl_Counter* cntr_WK_farnsworth { cntr_WK_cmd_wpm = new Fl_Counter(331, 343, 64, 22, _("Cmd WPM")); cntr_WK_cmd_wpm->tooltip(_("WPM speed for Winkeyer Command strings\ndefault = 18")); cntr_WK_cmd_wpm->type(1); cntr_WK_cmd_wpm->callback((Fl_Callback*)cb_cntr_WK_cmd_wpm); } // Fl_Counter* cntr_WK_cmd_wpm o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(430, 191, 160, 192, _("Timing/Settings")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { cntr_WK_ratio = new Fl_Counter(442, 215, 64, 22, _("Ratio")); cntr_WK_ratio->tooltip(_("Keying ratio\ndefault = 3.0")); cntr_WK_ratio->type(1); cntr_WK_ratio->callback((Fl_Callback*)cb_cntr_WK_ratio); } // Fl_Counter* cntr_WK_ratio { cntr_WK_comp = new Fl_Counter(442, 258, 64, 21, _("Comp")); cntr_WK_comp->tooltip(_("Compensation in msec\ndefault = 0")); cntr_WK_comp->type(1); cntr_WK_comp->callback((Fl_Callback*)cb_cntr_WK_comp); } // Fl_Counter* cntr_WK_comp { cntr_WK_first_ext = new Fl_Counter(442, 300, 64, 22, _("1st Ext")); cntr_WK_first_ext->tooltip(_("Extra duration to first dit/dot in msec\ndefault = 0")); cntr_WK_first_ext->type(1); cntr_WK_first_ext->callback((Fl_Callback*)cb_cntr_WK_first_ext); } // Fl_Counter* cntr_WK_first_ext { cntr_WK_sample = new Fl_Counter(442, 343, 64, 22, _("Sample")); cntr_WK_sample->tooltip(_("Paddle sampling (see Winkeyer manual)\ndefault = 50")); cntr_WK_sample->type(1); cntr_WK_sample->callback((Fl_Callback*)cb_cntr_WK_sample); } // Fl_Counter* cntr_WK_sample { cntr_WK_weight = new Fl_Counter(513, 215, 64, 22, _("Weight")); cntr_WK_weight->tooltip(_("Keying weight\ndefault = 50")); cntr_WK_weight->type(1); cntr_WK_weight->callback((Fl_Callback*)cb_cntr_WK_weight); } // Fl_Counter* cntr_WK_weight { cntr_WK_leadin = new Fl_Counter(513, 258, 64, 21, _("Leadin")); cntr_WK_leadin->tooltip(_("Leadin in msec\ndefault = 0")); cntr_WK_leadin->type(1); cntr_WK_leadin->callback((Fl_Callback*)cb_cntr_WK_leadin); } // Fl_Counter* cntr_WK_leadin { cntr_WK_tail = new Fl_Counter(513, 300, 64, 22, _("Tail")); cntr_WK_tail->tooltip(_("Extend last dit/dot in msec\ndefault = 0")); cntr_WK_tail->type(1); cntr_WK_tail->callback((Fl_Callback*)cb_cntr_WK_tail); } // Fl_Counter* cntr_WK_tail o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(10, 143, 580, 47); o->box(FL_ENGRAVED_FRAME); { choice_WK_keyer_mode = new Fl_ComboBox(35, 148, 90, 22, _("Keyer Mode")); choice_WK_keyer_mode->box(FL_BORDER_BOX); choice_WK_keyer_mode->color((Fl_Color)55); choice_WK_keyer_mode->selection_color(FL_BACKGROUND_COLOR); choice_WK_keyer_mode->labeltype(FL_NORMAL_LABEL); choice_WK_keyer_mode->labelfont(0); choice_WK_keyer_mode->labelsize(14); choice_WK_keyer_mode->labelcolor(FL_FOREGROUND_COLOR); choice_WK_keyer_mode->callback((Fl_Callback*)cb_choice_WK_keyer_mode); choice_WK_keyer_mode->align(Fl_Align(FL_ALIGN_BOTTOM)); choice_WK_keyer_mode->when(FL_WHEN_RELEASE); choice_WK_keyer_mode->end(); } // Fl_ComboBox* choice_WK_keyer_mode { choice_WK_hang = new Fl_ComboBox(181, 148, 90, 22, _("Hang")); choice_WK_hang->box(FL_BORDER_BOX); choice_WK_hang->color((Fl_Color)55); choice_WK_hang->selection_color(FL_BACKGROUND_COLOR); choice_WK_hang->labeltype(FL_NORMAL_LABEL); choice_WK_hang->labelfont(0); choice_WK_hang->labelsize(14); choice_WK_hang->labelcolor(FL_FOREGROUND_COLOR); choice_WK_hang->callback((Fl_Callback*)cb_choice_WK_hang); choice_WK_hang->align(Fl_Align(FL_ALIGN_BOTTOM)); choice_WK_hang->when(FL_WHEN_RELEASE); choice_WK_hang->end(); } // Fl_ComboBox* choice_WK_hang { choice_WK_sidetone = new Fl_ComboBox(328, 148, 90, 22, _("Sidetone")); choice_WK_sidetone->box(FL_BORDER_BOX); choice_WK_sidetone->color((Fl_Color)55); choice_WK_sidetone->selection_color(FL_BACKGROUND_COLOR); choice_WK_sidetone->labeltype(FL_NORMAL_LABEL); choice_WK_sidetone->labelfont(0); choice_WK_sidetone->labelsize(14); choice_WK_sidetone->labelcolor(FL_FOREGROUND_COLOR); choice_WK_sidetone->callback((Fl_Callback*)cb_choice_WK_sidetone); choice_WK_sidetone->align(Fl_Align(FL_ALIGN_BOTTOM)); choice_WK_sidetone->when(FL_WHEN_RELEASE); choice_WK_sidetone->end(); } // Fl_ComboBox* choice_WK_sidetone { choice_WK_output_pins = new Fl_ComboBox(475, 148, 90, 22, _("Output PIns")); choice_WK_output_pins->box(FL_BORDER_BOX); choice_WK_output_pins->color((Fl_Color)55); choice_WK_output_pins->selection_color(FL_BACKGROUND_COLOR); choice_WK_output_pins->labeltype(FL_NORMAL_LABEL); choice_WK_output_pins->labelfont(0); choice_WK_output_pins->labelsize(14); choice_WK_output_pins->labelcolor(FL_FOREGROUND_COLOR); choice_WK_output_pins->callback((Fl_Callback*)cb_choice_WK_output_pins); choice_WK_output_pins->align(Fl_Align(FL_ALIGN_BOTTOM)); choice_WK_output_pins->when(FL_WHEN_RELEASE); choice_WK_output_pins->end(); } // Fl_ComboBox* choice_WK_output_pins o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(10, 113, 397, 25); o->box(FL_ENGRAVED_FRAME); { box_WK_wait = new Fl_Box(40, 117, 16, 16, _("Wait")); box_WK_wait->box(FL_DIAMOND_DOWN_BOX); box_WK_wait->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_wait { box_WK_break_in = new Fl_Box(115, 117, 16, 16, _("Bk")); box_WK_break_in->box(FL_DIAMOND_DOWN_BOX); box_WK_break_in->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_break_in { box_WK_busy = new Fl_Box(190, 117, 16, 16, _("Busy")); box_WK_busy->box(FL_DIAMOND_DOWN_BOX); box_WK_busy->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_busy { box_WK_xoff = new Fl_Box(265, 117, 16, 16, _("Bfr")); box_WK_xoff->box(FL_DIAMOND_DOWN_BOX); box_WK_xoff->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_xoff { box_WK_keydown = new Fl_Box(341, 117, 16, 16, _("Key")); box_WK_keydown->box(FL_DIAMOND_DOWN_BOX); box_WK_keydown->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_keydown o->end(); } // Fl_Group* o { btn_WK_use_pot = new Fl_Check_Button(418, 117, 20, 15, _("Use Pot")); btn_WK_use_pot->tooltip(_("Winkeyer pot controls WPM")); btn_WK_use_pot->down_box(FL_DOWN_BOX); btn_WK_use_pot->callback((Fl_Callback*)cb_btn_WK_use_pot); btn_WK_use_pot->align(Fl_Align(FL_ALIGN_RIGHT)); btn_WK_use_pot->when(FL_WHEN_CHANGED); } // Fl_Check_Button* btn_WK_use_pot { txt_WK_wpm = new Fl_Output(505, 114, 50, 22); txt_WK_wpm->tooltip(_("WPM setting")); } // Fl_Output* txt_WK_wpm { Fl_Group* o = new Fl_Group(10, 363, 291, 23); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnK3NG = new Fl_Check_Button(20, 367, 223, 15, _("K3NG Arduino sketch emulation")); btnK3NG->tooltip(_("Activate for Mortty K3NG sketch")); btnK3NG->down_box(FL_DOWN_BOX); btnK3NG->callback((Fl_Callback*)cb_btnK3NG); o->value(progdefaults.WK_K3NGsketch); } // Fl_Check_Button* btnK3NG o->end(); } // Fl_Group* o tabsCW_winkeyer->end(); } // Fl_Group* tabsCW_winkeyer { tabsCW_ext_chars = new Fl_Group(0, 75, 600, 315, _("Ext. Chars.")); tabsCW_ext_chars->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tabsCW_ext_chars->hide(); { Fl_Group* o = new Fl_Group(5, 85, 590, 266, _("Check to enable character encode/decode\nSelect one character from each group")); o->box(FL_EMBOSSED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Group* o = new Fl_Group(10, 140, 99, 80); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_A_aelig = new Fl_Check_Button(16, 156, 70, 15, _("A aelig")); btn_A_aelig->tooltip(_("Swap left/right keyer contacts")); btn_A_aelig->down_box(FL_DOWN_BOX); btn_A_aelig->callback((Fl_Callback*)cb_btn_A_aelig); o->value(progdefaults.A_aelig); } // Fl_Check_Button* btn_A_aelig { Fl_Check_Button* o = btn_A_umlaut = new Fl_Check_Button(16, 193, 70, 15, _(" A umlaut")); btn_A_umlaut->tooltip(_("Swap left/right keyer contacts")); btn_A_umlaut->down_box(FL_DOWN_BOX); btn_A_umlaut->callback((Fl_Callback*)cb_btn_A_umlaut); o->value(progdefaults.A_umlaut); } // Fl_Check_Button* btn_A_umlaut o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_A_ring = new Fl_Check_Button(16, 230, 70, 15, _(" A ring")); btn_A_ring->tooltip(_("Swap left/right keyer contacts")); btn_A_ring->down_box(FL_DOWN_BOX); btn_A_ring->callback((Fl_Callback*)cb_btn_A_ring); o->value(progdefaults.A_ring); } // Fl_Check_Button* btn_A_ring { Fl_Group* o = new Fl_Group(111, 140, 99, 120); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_O_acute = new Fl_Check_Button(116, 156, 70, 15, _(" O acute")); btn_O_acute->tooltip(_("Swap left/right keyer contacts")); btn_O_acute->down_box(FL_DOWN_BOX); btn_O_acute->callback((Fl_Callback*)cb_btn_O_acute); o->value(progdefaults.O_acute); } // Fl_Check_Button* btn_O_acute { Fl_Check_Button* o = btn_O_slash = new Fl_Check_Button(116, 230, 70, 15, _(" O slash")); btn_O_slash->tooltip(_("Swap left/right keyer contacts")); btn_O_slash->down_box(FL_DOWN_BOX); btn_O_slash->callback((Fl_Callback*)cb_btn_O_slash); o->value(progdefaults.O_slash); } // Fl_Check_Button* btn_O_slash { Fl_Check_Button* o = btn_O_umlaut = new Fl_Check_Button(116, 193, 70, 15, _(" O umlaut")); btn_O_umlaut->tooltip(_("Swap left/right keyer contacts")); btn_O_umlaut->down_box(FL_DOWN_BOX); btn_O_umlaut->callback((Fl_Callback*)cb_btn_O_umlaut); o->value(progdefaults.O_umlaut); } // Fl_Check_Button* btn_O_umlaut o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_C_cedilla = new Fl_Check_Button(213, 156, 70, 15, _(" C cedilla")); btn_C_cedilla->tooltip(_("Swap left/right keyer contacts")); btn_C_cedilla->down_box(FL_DOWN_BOX); btn_C_cedilla->callback((Fl_Callback*)cb_btn_C_cedilla); o->value(progdefaults.C_cedilla); } // Fl_Check_Button* btn_C_cedilla { Fl_Check_Button* o = btn_E_grave = new Fl_Check_Button(311, 156, 70, 15, _(" E grave")); btn_E_grave->tooltip(_("Swap left/right keyer contacts")); btn_E_grave->down_box(FL_DOWN_BOX); btn_E_grave->callback((Fl_Callback*)cb_btn_E_grave); o->value(progdefaults.E_grave); } // Fl_Check_Button* btn_E_grave { Fl_Check_Button* o = btn_E_acute = new Fl_Check_Button(311, 193, 70, 15, _(" E acute")); btn_E_acute->tooltip(_("Swap left/right keyer contacts")); btn_E_acute->down_box(FL_DOWN_BOX); btn_E_acute->callback((Fl_Callback*)cb_btn_E_acute); o->value(progdefaults.E_acute); } // Fl_Check_Button* btn_E_acute { Fl_Check_Button* o = btn_N_tilde = new Fl_Check_Button(404, 156, 70, 15, _(" N tilde")); btn_N_tilde->tooltip(_("Swap left/right keyer contacts")); btn_N_tilde->down_box(FL_DOWN_BOX); btn_N_tilde->callback((Fl_Callback*)cb_btn_N_tilde); o->value(progdefaults.N_tilde); } // Fl_Check_Button* btn_N_tilde { Fl_Group* o = new Fl_Group(490, 140, 99, 80); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_U_umlaut = new Fl_Check_Button(495, 156, 70, 15, _(" U umlaut")); btn_U_umlaut->tooltip(_("Swap left/right keyer contacts")); btn_U_umlaut->down_box(FL_DOWN_BOX); btn_U_umlaut->callback((Fl_Callback*)cb_btn_U_umlaut); o->value(progdefaults.U_umlaut); } // Fl_Check_Button* btn_U_umlaut { Fl_Check_Button* o = btn_U_circ = new Fl_Check_Button(495, 193, 70, 15, _(" U circ")); btn_U_circ->tooltip(_("Swap left/right keyer contacts")); btn_U_circ->down_box(FL_DOWN_BOX); btn_U_circ->callback((Fl_Callback*)cb_btn_U_circ); o->value(progdefaults.U_circ); } // Fl_Check_Button* btn_U_circ o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(110, 280, 403, 45, _("See https://en.wikipedia.org/wiki/Morse_code\nfor information regarding exten\ ded Morse characters.")); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabsCW_ext_chars->end(); } // Fl_Group* tabsCW_ext_chars { tab_nanoCW = new Fl_Group(0, 75, 600, 315, _("nanoCW")); tab_nanoCW->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tab_nanoCW->hide(); { Fl_ComboBox* o = select_nanoCW_CommPort = new Fl_ComboBox(70, 85, 435, 22, _("Ser. Port")); select_nanoCW_CommPort->tooltip(_("nanoIO serial port")); select_nanoCW_CommPort->box(FL_DOWN_BOX); select_nanoCW_CommPort->color((Fl_Color)55); select_nanoCW_CommPort->selection_color(FL_BACKGROUND_COLOR); select_nanoCW_CommPort->labeltype(FL_NORMAL_LABEL); select_nanoCW_CommPort->labelfont(0); select_nanoCW_CommPort->labelsize(14); select_nanoCW_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_nanoCW_CommPort->callback((Fl_Callback*)cb_select_nanoCW_CommPort); select_nanoCW_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_nanoCW_CommPort->when(FL_WHEN_RELEASE); o->value(progdefaults.nanoIO_serial_port_name.c_str()); select_nanoCW_CommPort->end(); } // Fl_ComboBox* select_nanoCW_CommPort { btn_nanoCW_connect = new Fl_Light_Button(511, 85, 80, 22, _("Connect")); btn_nanoCW_connect->tooltip(_("Connect / Disconnect from nanoIO")); btn_nanoCW_connect->callback((Fl_Callback*)cb_btn_nanoCW_connect); } // Fl_Light_Button* btn_nanoCW_connect { btn_cwfsk_save = new Fl_Button(511, 138, 80, 22, _("Save")); btn_cwfsk_save->tooltip(_("Write state of nanoIO to Arduino EEPROM")); btn_cwfsk_save->callback((Fl_Callback*)cb_btn_cwfsk_save); } // Fl_Button* btn_cwfsk_save { btn_cwfsk_query = new Fl_Button(511, 165, 80, 22, _("Status")); btn_cwfsk_query->tooltip(_("Query state of nanoIO")); btn_cwfsk_query->callback((Fl_Callback*)cb_btn_cwfsk_query); } // Fl_Button* btn_cwfsk_query { Fl_Counter* o = cntr_nanoCW_paddle_WPM = new Fl_Counter(70, 113, 110, 22, _("Paddle")); cntr_nanoCW_paddle_WPM->tooltip(_("CW wpm using paddle keyer")); cntr_nanoCW_paddle_WPM->minimum(5); cntr_nanoCW_paddle_WPM->maximum(100); cntr_nanoCW_paddle_WPM->step(1); cntr_nanoCW_paddle_WPM->value(20); cntr_nanoCW_paddle_WPM->callback((Fl_Callback*)cb_cntr_nanoCW_paddle_WPM); cntr_nanoCW_paddle_WPM->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.CW_keyspeed); o->lstep(5); } // Fl_Counter* cntr_nanoCW_paddle_WPM { FTextView* o = txt_nano_CW_io = new FTextView(4, 210, 590, 175, _("USB serial I/O")); txt_nano_CW_io->box(FL_DOWN_FRAME); txt_nano_CW_io->color(FL_BACKGROUND2_COLOR); txt_nano_CW_io->selection_color(FL_SELECTION_COLOR); txt_nano_CW_io->labeltype(FL_NORMAL_LABEL); txt_nano_CW_io->labelfont(0); txt_nano_CW_io->labelsize(14); txt_nano_CW_io->labelcolor(FL_FOREGROUND_COLOR); txt_nano_CW_io->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_nano_CW_io->when(FL_WHEN_RELEASE); o->setFont(progdefaults.RxFontnbr); o->setFontSize(12); } // FTextView* txt_nano_CW_io { Fl_Counter* o = cntr_nanoCW_WPM = new Fl_Counter(70, 139, 110, 22, _("Comp\'")); cntr_nanoCW_WPM->tooltip(_("CW wpm keyboard strings")); cntr_nanoCW_WPM->minimum(5); cntr_nanoCW_WPM->maximum(100); cntr_nanoCW_WPM->step(1); cntr_nanoCW_WPM->value(20); cntr_nanoCW_WPM->callback((Fl_Callback*)cb_cntr_nanoCW_WPM); cntr_nanoCW_WPM->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.CWspeed); o->lstep(5); } // Fl_Counter* cntr_nanoCW_WPM { Fl_Counter2* o = cnt_nanoCWdash2dot = new Fl_Counter2(87, 165, 75, 22, _("Dash/Dot")); cnt_nanoCWdash2dot->tooltip(_("Dash to dot ratio")); cnt_nanoCWdash2dot->type(1); cnt_nanoCWdash2dot->box(FL_UP_BOX); cnt_nanoCWdash2dot->color(FL_BACKGROUND_COLOR); cnt_nanoCWdash2dot->selection_color(FL_INACTIVE_COLOR); cnt_nanoCWdash2dot->labeltype(FL_NORMAL_LABEL); cnt_nanoCWdash2dot->labelfont(0); cnt_nanoCWdash2dot->labelsize(14); cnt_nanoCWdash2dot->labelcolor(FL_FOREGROUND_COLOR); cnt_nanoCWdash2dot->minimum(2.5); cnt_nanoCWdash2dot->maximum(3.5); cnt_nanoCWdash2dot->value(3); cnt_nanoCWdash2dot->callback((Fl_Callback*)cb_cnt_nanoCWdash2dot); cnt_nanoCWdash2dot->align(Fl_Align(FL_ALIGN_LEFT)); cnt_nanoCWdash2dot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWdash2dot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cnt_nanoCWdash2dot { Fl_ListBox* o = listbox_nano_keyer = new Fl_ListBox(395, 113, 110, 22, _("Keyer")); listbox_nano_keyer->box(FL_DOWN_BOX); listbox_nano_keyer->color(FL_BACKGROUND2_COLOR); listbox_nano_keyer->selection_color(FL_BACKGROUND_COLOR); listbox_nano_keyer->labeltype(FL_NORMAL_LABEL); listbox_nano_keyer->labelfont(0); listbox_nano_keyer->labelsize(14); listbox_nano_keyer->labelcolor(FL_FOREGROUND_COLOR); listbox_nano_keyer->callback((Fl_Callback*)cb_listbox_nano_keyer); listbox_nano_keyer->align(Fl_Align(FL_ALIGN_LEFT)); listbox_nano_keyer->when(FL_WHEN_RELEASE); o->add("Iambic-A|Iambic-B|Straight"); o->index(progdefaults.nanoIO_CW_keyer); listbox_nano_keyer->end(); } // Fl_ListBox* listbox_nano_keyer { Fl_ListBox* o = listbox_incr = new Fl_ListBox(445, 138, 60, 22, _("Incr\'")); listbox_incr->box(FL_DOWN_BOX); listbox_incr->color(FL_BACKGROUND2_COLOR); listbox_incr->selection_color(FL_BACKGROUND_COLOR); listbox_incr->labeltype(FL_NORMAL_LABEL); listbox_incr->labelfont(0); listbox_incr->labelsize(14); listbox_incr->labelcolor(FL_FOREGROUND_COLOR); listbox_incr->callback((Fl_Callback*)cb_listbox_incr); listbox_incr->align(Fl_Align(FL_ALIGN_LEFT)); listbox_incr->when(FL_WHEN_RELEASE); o->add("1|2|3|4|5"); o->index(progdefaults.nanoIO_CW_incr - '1'); listbox_incr->end(); } // Fl_ListBox* listbox_incr { Fl_Check_Button* o = btn_disable_CW_PTT = new Fl_Check_Button(435, 165, 70, 22, _("PTT off")); btn_disable_CW_PTT->tooltip(_("Disable PTT")); btn_disable_CW_PTT->down_box(FL_DOWN_BOX); btn_disable_CW_PTT->callback((Fl_Callback*)cb_btn_disable_CW_PTT); o->value(progdefaults.disable_CW_PTT); } // Fl_Check_Button* btn_disable_CW_PTT { Fl_Group* o = new Fl_Group(185, 110, 164, 85); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_nanoIO_pot = new Fl_Check_Button(312, 113, 21, 22, _("Use WPM pot\'")); btn_nanoIO_pot->tooltip(_("WPM pot update to nanoIO required")); btn_nanoIO_pot->down_box(FL_DOWN_BOX); btn_nanoIO_pot->callback((Fl_Callback*)cb_btn_nanoIO_pot); btn_nanoIO_pot->align(Fl_Align(FL_ALIGN_LEFT)); btn_nanoIO_pot->deactivate(); o->value(progdefaults.nanoIO_speed_pot); } // Fl_Check_Button* btn_nanoIO_pot { cntr_nanoIO_min_wpm = new Fl_Counter(257, 139, 75, 22, _("Min WPM")); cntr_nanoIO_min_wpm->tooltip(_("Minimum WPM setting\ndefault = 10")); cntr_nanoIO_min_wpm->type(1); cntr_nanoIO_min_wpm->minimum(10); cntr_nanoIO_min_wpm->maximum(30); cntr_nanoIO_min_wpm->step(1); cntr_nanoIO_min_wpm->value(10); cntr_nanoIO_min_wpm->callback((Fl_Callback*)cb_cntr_nanoIO_min_wpm); cntr_nanoIO_min_wpm->align(Fl_Align(FL_ALIGN_LEFT)); cntr_nanoIO_min_wpm->deactivate(); } // Fl_Counter* cntr_nanoIO_min_wpm { cntr_nanoIO_rng_wpm = new Fl_Counter(257, 165, 75, 22, _("Rng WPM")); cntr_nanoIO_rng_wpm->tooltip(_("Range WPM setting\ndefault = 20")); cntr_nanoIO_rng_wpm->type(1); cntr_nanoIO_rng_wpm->minimum(10); cntr_nanoIO_rng_wpm->maximum(40); cntr_nanoIO_rng_wpm->step(1); cntr_nanoIO_rng_wpm->value(20); cntr_nanoIO_rng_wpm->callback((Fl_Callback*)cb_cntr_nanoIO_rng_wpm); cntr_nanoIO_rng_wpm->align(Fl_Align(FL_ALIGN_LEFT)); cntr_nanoIO_rng_wpm->deactivate(); } // Fl_Counter* cntr_nanoIO_rng_wpm o->end(); } // Fl_Group* o tab_nanoCW->end(); } // Fl_Group* tab_nanoCW tabsCW->end(); } // Fl_Tabs* tabsCW tabCW->end(); } // Fl_Group* tabCW { tabDomEX = new Fl_Group(0, 50, 600, 340, _("Dom")); tabDomEX->hide(); { Fl_Group* o = new Fl_Group(55, 60, 490, 180); o->box(FL_ENGRAVED_FRAME); { txtSecondary = new Fl_Input2(65, 87, 360, 40, _("Secondary Text")); txtSecondary->tooltip(_("Text to send during keyboard idle times")); txtSecondary->type(4); txtSecondary->box(FL_DOWN_BOX); txtSecondary->color(FL_BACKGROUND2_COLOR); txtSecondary->selection_color(FL_SELECTION_COLOR); txtSecondary->labeltype(FL_NORMAL_LABEL); txtSecondary->labelfont(0); txtSecondary->labelsize(14); txtSecondary->labelcolor(FL_FOREGROUND_COLOR); txtSecondary->callback((Fl_Callback*)cb_txtSecondary); txtSecondary->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtSecondary->when(FL_WHEN_CHANGED); txtSecondary->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtSecondary { Fl_Check_Button* o = valDominoEX_FILTER = new Fl_Check_Button(65, 141, 80, 20, _("Filtering")); valDominoEX_FILTER->tooltip(_("Use DSP filter before decoder")); valDominoEX_FILTER->down_box(FL_DOWN_BOX); valDominoEX_FILTER->value(1); valDominoEX_FILTER->callback((Fl_Callback*)cb_valDominoEX_FILTER); o->value(progdefaults.DOMINOEX_FILTER); } // Fl_Check_Button* valDominoEX_FILTER { Fl_Counter2* o = valDominoEX_BW = new Fl_Counter2(206, 141, 63, 20, _("Filter bandwidth factor")); valDominoEX_BW->tooltip(_("Filter bandwidth relative to signal width")); valDominoEX_BW->type(1); valDominoEX_BW->box(FL_UP_BOX); valDominoEX_BW->color(FL_BACKGROUND_COLOR); valDominoEX_BW->selection_color(FL_INACTIVE_COLOR); valDominoEX_BW->labeltype(FL_NORMAL_LABEL); valDominoEX_BW->labelfont(0); valDominoEX_BW->labelsize(14); valDominoEX_BW->labelcolor(FL_FOREGROUND_COLOR); valDominoEX_BW->minimum(1); valDominoEX_BW->maximum(2); valDominoEX_BW->value(1.5); valDominoEX_BW->callback((Fl_Callback*)cb_valDominoEX_BW); valDominoEX_BW->align(Fl_Align(FL_ALIGN_RIGHT)); valDominoEX_BW->when(FL_WHEN_CHANGED); o->value(progdefaults.DOMINOEX_BW); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valDominoEX_BW { Fl_Check_Button* o = chkDominoEX_FEC = new Fl_Check_Button(65, 171, 51, 20, _("FEC")); chkDominoEX_FEC->tooltip(_("Enable MultiPSK-compatible FEC")); chkDominoEX_FEC->down_box(FL_DOWN_BOX); chkDominoEX_FEC->callback((Fl_Callback*)cb_chkDominoEX_FEC); o->value(progdefaults.DOMINOEX_FEC); } // Fl_Check_Button* chkDominoEX_FEC { Fl_Value_Slider2* o = valDomCWI = new Fl_Value_Slider2(65, 207, 260, 20, _("CWI threshold")); valDomCWI->tooltip(_("CWI detection and suppression")); valDomCWI->type(1); valDomCWI->box(FL_DOWN_BOX); valDomCWI->color(FL_BACKGROUND_COLOR); valDomCWI->selection_color(FL_BACKGROUND_COLOR); valDomCWI->labeltype(FL_NORMAL_LABEL); valDomCWI->labelfont(0); valDomCWI->labelsize(14); valDomCWI->labelcolor(FL_FOREGROUND_COLOR); valDomCWI->textsize(14); valDomCWI->callback((Fl_Callback*)cb_valDomCWI); valDomCWI->align(Fl_Align(FL_ALIGN_TOP)); valDomCWI->when(FL_WHEN_CHANGED); o->value(progdefaults.DomCWI); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valDomCWI { Fl_Counter2* o = valDominoEX_PATHS = new Fl_Counter2(389, 194, 63, 20, _("Paths (hidden)")); valDominoEX_PATHS->type(1); valDominoEX_PATHS->box(FL_UP_BOX); valDominoEX_PATHS->color(FL_BACKGROUND_COLOR); valDominoEX_PATHS->selection_color(FL_INACTIVE_COLOR); valDominoEX_PATHS->labeltype(FL_NORMAL_LABEL); valDominoEX_PATHS->labelfont(0); valDominoEX_PATHS->labelsize(14); valDominoEX_PATHS->labelcolor(FL_FOREGROUND_COLOR); valDominoEX_PATHS->minimum(4); valDominoEX_PATHS->maximum(8); valDominoEX_PATHS->step(1); valDominoEX_PATHS->value(5); valDominoEX_PATHS->callback((Fl_Callback*)cb_valDominoEX_PATHS); valDominoEX_PATHS->align(Fl_Align(FL_ALIGN_BOTTOM)); valDominoEX_PATHS->when(FL_WHEN_CHANGED); o->value(progdefaults.DOMINOEX_PATHS); o->labelsize(FL_NORMAL_SIZE); o->hide(); } // Fl_Counter2* valDominoEX_PATHS o->end(); } // Fl_Group* o tabDomEX->end(); } // Fl_Group* tabDomEX { tabFeld = new Fl_Group(0, 50, 600, 340, _("Feld")); tabFeld->hide(); { Fl_Group* o = new Fl_Group(55, 72, 500, 133, _("Hell Transmit Parameters")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_ListBox* o = listboxHellFont = new Fl_ListBox(70, 97, 225, 22, _("Transmit font")); listboxHellFont->tooltip(_("Select TX raster font")); listboxHellFont->box(FL_DOWN_BOX); listboxHellFont->color(FL_BACKGROUND2_COLOR); listboxHellFont->selection_color(FL_BACKGROUND_COLOR); listboxHellFont->labeltype(FL_NORMAL_LABEL); listboxHellFont->labelfont(0); listboxHellFont->labelsize(14); listboxHellFont->labelcolor(FL_FOREGROUND_COLOR); listboxHellFont->callback((Fl_Callback*)cb_listboxHellFont); listboxHellFont->align(Fl_Align(FL_ALIGN_RIGHT)); listboxHellFont->when(FL_WHEN_RELEASE); o->add(szFeldFonts); o->index(progdefaults.feldfontnbr); o->labelsize(FL_NORMAL_SIZE); listboxHellFont->end(); } // Fl_ListBox* listboxHellFont { Fl_ListBox* o = listboxHellPulse = new Fl_ListBox(70, 145, 150, 22, _("Pulse shape")); listboxHellPulse->tooltip(_("Raised cosine pulse shape factor")); listboxHellPulse->box(FL_DOWN_BOX); listboxHellPulse->color(FL_BACKGROUND2_COLOR); listboxHellPulse->selection_color(FL_BACKGROUND_COLOR); listboxHellPulse->labeltype(FL_NORMAL_LABEL); listboxHellPulse->labelfont(0); listboxHellPulse->labelsize(14); listboxHellPulse->labelcolor(FL_FOREGROUND_COLOR); listboxHellPulse->callback((Fl_Callback*)cb_listboxHellPulse); listboxHellPulse->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listboxHellPulse->when(FL_WHEN_RELEASE); o->add(_("Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying")); o->index(progdefaults.HellPulseFast); o->labelsize(FL_NORMAL_SIZE); listboxHellPulse->end(); } // Fl_ListBox* listboxHellPulse { Fl_Check_Button* o = btnFeldHellIdle = new Fl_Check_Button(70, 180, 230, 20, _("Transmit periods (.) when idle")); btnFeldHellIdle->tooltip(_("Transmits a diddle dot when no keyboard activity")); btnFeldHellIdle->down_box(FL_DOWN_BOX); btnFeldHellIdle->value(1); btnFeldHellIdle->callback((Fl_Callback*)cb_btnFeldHellIdle); o->value(progdefaults.HellXmtIdle); } // Fl_Check_Button* btnFeldHellIdle { Fl_Value_Slider* o = valHellXmtWidth = new Fl_Value_Slider(251, 145, 150, 22, _("Tx Width Multiplier")); valHellXmtWidth->tooltip(_("Range 1...3")); valHellXmtWidth->type(5); valHellXmtWidth->color(FL_LIGHT3); valHellXmtWidth->minimum(1); valHellXmtWidth->maximum(3); valHellXmtWidth->step(1); valHellXmtWidth->value(1); valHellXmtWidth->textsize(14); valHellXmtWidth->callback((Fl_Callback*)cb_valHellXmtWidth); valHellXmtWidth->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.HellXmtWidth); } // Fl_Value_Slider* valHellXmtWidth o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 208, 500, 173, _("Hell Receive Parameters")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnBlackboard = new Fl_Check_Button(70, 232, 125, 20, _("Reverse video")); btnBlackboard->tooltip(_("Display RX in reverse video")); btnBlackboard->down_box(FL_DOWN_BOX); btnBlackboard->callback((Fl_Callback*)cb_btnBlackboard); o->value(progdefaults.HellBlackboard); } // Fl_Check_Button* btnBlackboard { Fl_Check_Button* o = btnHellMarquee = new Fl_Check_Button(255, 232, 125, 20, _("Marquee text")); btnHellMarquee->tooltip(_("Display RX as a scrolling marquee")); btnHellMarquee->down_box(FL_DOWN_BOX); btnHellMarquee->callback((Fl_Callback*)cb_btnHellMarquee); o->value(progdefaults.HellMarquee); } // Fl_Check_Button* btnHellMarquee { Fl_Value_Slider* o = valHellRcvWidth = new Fl_Value_Slider(70, 268, 120, 22, _("Rx Width Multiplier")); valHellRcvWidth->tooltip(_("Range 1...4")); valHellRcvWidth->type(5); valHellRcvWidth->color(FL_LIGHT3); valHellRcvWidth->minimum(1); valHellRcvWidth->maximum(4); valHellRcvWidth->step(1); valHellRcvWidth->value(1); valHellRcvWidth->textsize(14); valHellRcvWidth->callback((Fl_Callback*)cb_valHellRcvWidth); valHellRcvWidth->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.HellRcvWidth); } // Fl_Value_Slider* valHellRcvWidth { Fl_Value_Slider* o = valHellRcvHeight = new Fl_Value_Slider(70, 307, 250, 22, _("Rx Height in pixels")); valHellRcvHeight->tooltip(_("May require resizing the Rx/Tx panel")); valHellRcvHeight->type(5); valHellRcvHeight->color(FL_LIGHT3); valHellRcvHeight->minimum(14); valHellRcvHeight->maximum(42); valHellRcvHeight->step(2); valHellRcvHeight->value(20); valHellRcvHeight->textsize(14); valHellRcvHeight->callback((Fl_Callback*)cb_valHellRcvHeight); valHellRcvHeight->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.HellRcvHeight); } // Fl_Value_Slider* valHellRcvHeight { Fl_Value_Slider2* o = sldrHellBW = new Fl_Value_Slider2(70, 346, 250, 22, _("Receive filter bandwidth")); sldrHellBW->tooltip(_("Adjust the DSP bandwidth")); sldrHellBW->type(1); sldrHellBW->box(FL_DOWN_BOX); sldrHellBW->color(FL_LIGHT3); sldrHellBW->selection_color(FL_BACKGROUND_COLOR); sldrHellBW->labeltype(FL_NORMAL_LABEL); sldrHellBW->labelfont(0); sldrHellBW->labelsize(14); sldrHellBW->labelcolor(FL_FOREGROUND_COLOR); sldrHellBW->minimum(10); sldrHellBW->maximum(2400); sldrHellBW->step(5); sldrHellBW->value(400); sldrHellBW->textsize(14); sldrHellBW->callback((Fl_Callback*)cb_sldrHellBW); sldrHellBW->align(Fl_Align(FL_ALIGN_RIGHT)); sldrHellBW->when(FL_WHEN_CHANGED); o->value(progdefaults.HELL_BW); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrHellBW { Fl_Value_Slider* o = val_hellagc = new Fl_Value_Slider(335, 268, 120, 22, _("Rx AGC")); val_hellagc->tooltip(_("1 - Slow, 2 - Medium, 3 - Fast")); val_hellagc->type(5); val_hellagc->color(FL_LIGHT3); val_hellagc->minimum(1); val_hellagc->maximum(3); val_hellagc->step(1); val_hellagc->value(2); val_hellagc->textsize(14); val_hellagc->callback((Fl_Callback*)cb_val_hellagc); val_hellagc->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.hellagc); } // Fl_Value_Slider* val_hellagc o->end(); } // Fl_Group* o tabFeld->end(); } // Fl_Group* tabFeld { tabFSQ = new Fl_Group(0, 50, 600, 340, _("FSQ")); tabFSQ->hide(); { Fl_Group* o = new Fl_Group(5, 60, 585, 65, _("Rx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Slider* o = valhits = new Fl_Value_Slider(140, 65, 125, 22, _("Min Hits")); valhits->tooltip(_("Minimum # hits in tone detector")); valhits->type(5); valhits->minimum(3); valhits->maximum(6); valhits->step(1); valhits->value(3); valhits->textsize(14); valhits->callback((Fl_Callback*)cb_valhits); valhits->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.fsqhits); } // Fl_Value_Slider* valhits { Fl_Choice* o = sel_fsq_lpf = new Fl_Choice(163, 94, 102, 22, _("Image LPF")); sel_fsq_lpf->tooltip(_("Narrow LPF if image noisy")); sel_fsq_lpf->down_box(FL_BORDER_BOX); sel_fsq_lpf->callback((Fl_Callback*)cb_sel_fsq_lpf); o->add("None"); o->add("300 Hz"); o->add("400 Hz"); o->add("500 Hz"); o->value(progdefaults.fsq_img_filter); } // Fl_Choice* sel_fsq_lpf { Fl_Value_Slider* o = sldrMovAvg = new Fl_Value_Slider(410, 65, 125, 22, _("MovAvg:")); sldrMovAvg->tooltip(_("Filter FFT output")); sldrMovAvg->type(1); sldrMovAvg->minimum(1); sldrMovAvg->maximum(15); sldrMovAvg->step(1); sldrMovAvg->value(4); sldrMovAvg->textsize(14); sldrMovAvg->callback((Fl_Callback*)cb_sldrMovAvg); sldrMovAvg->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_movavg); o->maximum(MOVAVGLIMIT); } // Fl_Value_Slider* sldrMovAvg { Fl_Choice* o = sel_fsq_heard_aging = new Fl_Choice(433, 94, 102, 22, _("Heard aging")); sel_fsq_heard_aging->tooltip(_("Remove call after ...")); sel_fsq_heard_aging->down_box(FL_BORDER_BOX); sel_fsq_heard_aging->callback((Fl_Callback*)cb_sel_fsq_heard_aging); o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min"); o->add("30 min"); o->add("60 min"); o->add("90 min"); o->add("120 min"); o->value(progdefaults.fsq_heard_aging); } // Fl_Choice* sel_fsq_heard_aging o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 125, 585, 95, _("Tx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btn_fsqbaud[0] = new Fl_Round_Button(124, 135, 55, 15, _("1.5 baud")); btn_fsqbaud[0]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[0]->callback((Fl_Callback*)cb_btn_fsqbaud); o->value(progdefaults.fsqbaud == 1.5); } // Fl_Round_Button* btn_fsqbaud[0] { Fl_Round_Button* o = btn_fsqbaud[1] = new Fl_Round_Button(217, 135, 55, 15, _("2 baud")); btn_fsqbaud[1]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[1]->callback((Fl_Callback*)cb_btn_fsqbaud1); o->value(progdefaults.fsqbaud == 2); } // Fl_Round_Button* btn_fsqbaud[1] { Fl_Round_Button* o = btn_fsqbaud[2] = new Fl_Round_Button(310, 135, 55, 15, _("3 baud")); btn_fsqbaud[2]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[2]->callback((Fl_Callback*)cb_btn_fsqbaud2); o->value(progdefaults.fsqbaud == 3); } // Fl_Round_Button* btn_fsqbaud[2] { Fl_Round_Button* o = btn_fsqbaud[3] = new Fl_Round_Button(403, 135, 55, 15, _("4.5 baud")); btn_fsqbaud[3]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[3]->callback((Fl_Callback*)cb_btn_fsqbaud3); o->value(progdefaults.fsqbaud == 4.5); } // Fl_Round_Button* btn_fsqbaud[3] { Fl_Round_Button* o = btn_fsqbaud[4] = new Fl_Round_Button(497, 135, 55, 15, _("6 baud")); btn_fsqbaud[4]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[4]->callback((Fl_Callback*)cb_btn_fsqbaud4); o->value(progdefaults.fsqbaud == 6); } // Fl_Round_Button* btn_fsqbaud[4] { Fl_Choice* o = sel_fsq_frequency = new Fl_Choice(250, 199, 102, 21, _("Center freq")); sel_fsq_frequency->down_box(FL_BORDER_BOX); sel_fsq_frequency->callback((Fl_Callback*)cb_sel_fsq_frequency); sel_fsq_frequency->align(Fl_Align(FL_ALIGN_TOP)); sel_fsq_frequency->hide(); o->add("1150"); o->add("1500"); o->add("Variable"); o->value(progdefaults.fsq_frequency); } // Fl_Choice* sel_fsq_frequency { Fl_Choice* o = sel_fsq_sounder = new Fl_Choice(80, 156, 100, 22, _("Sounder")); sel_fsq_sounder->tooltip(_("Send beacon every ...")); sel_fsq_sounder->down_box(FL_BORDER_BOX); sel_fsq_sounder->callback((Fl_Callback*)cb_sel_fsq_sounder); o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); o->add("60 min"); o->value(progdefaults.fsq_sounder); } // Fl_Choice* sel_fsq_sounder { Fl_Check_Button* o = btn_fsq_lowercase = new Fl_Check_Button(366, 159, 214, 15, _("MYCALL always lower case")); btn_fsq_lowercase->tooltip(_("convert operator callsign to lower case")); btn_fsq_lowercase->down_box(FL_DOWN_BOX); btn_fsq_lowercase->callback((Fl_Callback*)cb_btn_fsq_lowercase); o->value(progdefaults.fsq_lowercase); } // Fl_Check_Button* btn_fsq_lowercase { Fl_Counter* o = cntr_FSQ_time_out = new Fl_Counter(254, 156, 80, 22, _("Time out")); cntr_FSQ_time_out->tooltip(_("Time out xmt attempt in XX seconds")); cntr_FSQ_time_out->type(1); cntr_FSQ_time_out->minimum(2); cntr_FSQ_time_out->maximum(20); cntr_FSQ_time_out->step(1); cntr_FSQ_time_out->value(6); cntr_FSQ_time_out->callback((Fl_Callback*)cb_cntr_FSQ_time_out); cntr_FSQ_time_out->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_time_out); } // Fl_Counter* cntr_FSQ_time_out { Fl_Input* o = new Fl_Input(80, 182, 456, 22, _("QTC:")); o->tooltip(_("Enter QTC text")); o->callback((Fl_Callback*)cb_QTC); o->value(progdefaults.fsqQTCtext.c_str()); } // Fl_Input* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 210, 585, 55, _("Message Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_fsq_msg_dt_stamp = new Fl_Check_Button(35, 237, 135, 15, _("Add date/time")); btn_fsq_msg_dt_stamp->tooltip(_("Add date/time stamp to each # received message")); btn_fsq_msg_dt_stamp->down_box(FL_DOWN_BOX); btn_fsq_msg_dt_stamp->value(1); btn_fsq_msg_dt_stamp->callback((Fl_Callback*)cb_btn_fsq_msg_dt_stamp); o->value(progdefaults.add_fsq_msg_dt); } // Fl_Check_Button* btn_fsq_msg_dt_stamp { Fl_Check_Button* o = btn_fsq_msg_append = new Fl_Check_Button(182, 237, 210, 15, _("always append to file(s)")); btn_fsq_msg_append->tooltip(_("append # directive msgs to named file")); btn_fsq_msg_append->down_box(FL_DOWN_BOX); btn_fsq_msg_append->value(1); btn_fsq_msg_append->callback((Fl_Callback*)cb_btn_fsq_msg_append); o->value(progdefaults.always_append); } // Fl_Check_Button* btn_fsq_msg_append { Fl_Counter* o = cntr_FSQ_notify_time_out = new Fl_Counter(495, 233, 80, 22, _("Notify time out")); cntr_FSQ_notify_time_out->tooltip(_("Notification dialog closes after XX seconds;^j0 == dialog remains open")); cntr_FSQ_notify_time_out->type(1); cntr_FSQ_notify_time_out->minimum(0); cntr_FSQ_notify_time_out->maximum(30); cntr_FSQ_notify_time_out->step(1); cntr_FSQ_notify_time_out->value(10); cntr_FSQ_notify_time_out->callback((Fl_Callback*)cb_cntr_FSQ_notify_time_out); cntr_FSQ_notify_time_out->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_notify_time_out); } // Fl_Counter* cntr_FSQ_notify_time_out o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 265, 585, 80, _("Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = txtAuditLog = new Fl_Output(82, 285, 325, 22, _("Audit log")); o->value(progdefaults.fsq_audit_log.c_str()); } // Fl_Output* txtAuditLog { Fl_Light_Button* o = btn_enable_auditlog = new Fl_Light_Button(421, 286, 74, 20, _("Enable")); btn_enable_auditlog->selection_color((Fl_Color)2); btn_enable_auditlog->callback((Fl_Callback*)cb_btn_enable_auditlog); o->value(progdefaults.fsq_enable_audit_log); } // Fl_Light_Button* btn_enable_auditlog { btn_select_auditlog = new Fl_Button(509, 286, 70, 20, _("Select")); btn_select_auditlog->callback((Fl_Callback*)cb_btn_select_auditlog); } // Fl_Button* btn_select_auditlog { Fl_Output* o = txtHeardLog = new Fl_Output(82, 313, 325, 22, _("Heard log")); o->value(progdefaults.fsq_heard_log.c_str()); } // Fl_Output* txtHeardLog { Fl_Light_Button* o = btn_enable_fsq_heard_log = new Fl_Light_Button(421, 314, 74, 20, _("Enable")); btn_enable_fsq_heard_log->selection_color((Fl_Color)2); btn_enable_fsq_heard_log->callback((Fl_Callback*)cb_btn_enable_fsq_heard_log); o->value(progdefaults.fsq_enable_heard_log); } // Fl_Light_Button* btn_enable_fsq_heard_log { btn_select_fsq_heard_log = new Fl_Button(509, 314, 70, 20, _("Select")); btn_select_fsq_heard_log->callback((Fl_Callback*)cb_btn_select_fsq_heard_log); } // Fl_Button* btn_select_fsq_heard_log o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 345, 585, 35, _("Text Colors")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btn_fsq_xmt_color = new Fl_Button(145, 352, 40, 20, _("XMIT")); btn_fsq_xmt_color->tooltip(_("Transmit text")); btn_fsq_xmt_color->callback((Fl_Callback*)cb_btn_fsq_xmt_color); btn_fsq_xmt_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); } // Fl_Button* btn_fsq_xmt_color { btn_fsq_directed_color = new Fl_Button(275, 352, 40, 20, _("DIRECTED")); btn_fsq_directed_color->tooltip(_("Directed received text")); btn_fsq_directed_color->callback((Fl_Callback*)cb_btn_fsq_directed_color); btn_fsq_directed_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_directed_color->color(progdefaults.fsq_directed_color); } // Fl_Button* btn_fsq_directed_color { btn_fsq_undirected_color = new Fl_Button(425, 352, 40, 20, _("UNDIRECTED")); btn_fsq_undirected_color->tooltip(_("Undirected received text")); btn_fsq_undirected_color->callback((Fl_Callback*)cb_btn_fsq_undirected_color); btn_fsq_undirected_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); } // Fl_Button* btn_fsq_undirected_color { btn_fsq_color_defaults = new Fl_Button(507, 352, 74, 20, _("Defaults")); btn_fsq_color_defaults->callback((Fl_Callback*)cb_btn_fsq_color_defaults); } // Fl_Button* btn_fsq_color_defaults o->end(); } // Fl_Group* o tabFSQ->end(); } // Fl_Group* tabFSQ { tabIFKP = new Fl_Group(0, 50, 600, 340, _("IFKP")); tabIFKP->hide(); { Fl_Group* o = new Fl_Group(5, 65, 587, 120, _("Tx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btn_ifkpbaud[0] = new Fl_Round_Button(100, 93, 100, 17, _("1/2 speed")); btn_ifkpbaud[0]->down_box(FL_ROUND_DOWN_BOX); btn_ifkpbaud[0]->callback((Fl_Callback*)cb_btn_ifkpbaud); o->value(progdefaults.ifkp_baud == 0); } // Fl_Round_Button* btn_ifkpbaud[0] { Fl_Round_Button* o = btn_ifkpbaud[1] = new Fl_Round_Button(208, 93, 100, 17, _("1x speed")); btn_ifkpbaud[1]->tooltip(_("default")); btn_ifkpbaud[1]->down_box(FL_ROUND_DOWN_BOX); btn_ifkpbaud[1]->callback((Fl_Callback*)cb_btn_ifkpbaud1); o->value(progdefaults.ifkp_baud == 1); } // Fl_Round_Button* btn_ifkpbaud[1] { Fl_Round_Button* o = btn_ifkpbaud[2] = new Fl_Round_Button(316, 93, 100, 17, _("2x speed")); btn_ifkpbaud[2]->down_box(FL_ROUND_DOWN_BOX); btn_ifkpbaud[2]->callback((Fl_Callback*)cb_btn_ifkpbaud2); o->value(progdefaults.ifkp_baud == 2); } // Fl_Round_Button* btn_ifkpbaud[2] { Fl_Check_Button* o = btn_ifkp_lowercase = new Fl_Check_Button(100, 125, 220, 15, _("MYCALL always lower case")); btn_ifkp_lowercase->tooltip(_("convert operator callsign to lower case")); btn_ifkp_lowercase->down_box(FL_DOWN_BOX); btn_ifkp_lowercase->callback((Fl_Callback*)cb_btn_ifkp_lowercase); o->value(progdefaults.ifkp_lowercase); } // Fl_Check_Button* btn_ifkp_lowercase { Fl_Check_Button* o = btn_ifkp_lowercase_call = new Fl_Check_Button(325, 125, 220, 15, _("CALLSIGN always lower case")); btn_ifkp_lowercase_call->tooltip(_("convert other callsign to lower case")); btn_ifkp_lowercase_call->down_box(FL_DOWN_BOX); btn_ifkp_lowercase_call->callback((Fl_Callback*)cb_btn_ifkp_lowercase_call); o->value(progdefaults.ifkp_lowercase_call); } // Fl_Check_Button* btn_ifkp_lowercase_call { Fl_Check_Button* o = btn_ifkp_freqlock = new Fl_Check_Button(100, 155, 220, 15, _("lock WF at 1500 Hz")); btn_ifkp_freqlock->tooltip(_("Always transmit at 1500 Hertz center freq.")); btn_ifkp_freqlock->down_box(FL_DOWN_BOX); btn_ifkp_freqlock->callback((Fl_Callback*)cb_btn_ifkp_freqlock); o->value(progdefaults.ifkp_freqlock); } // Fl_Check_Button* btn_ifkp_freqlock o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 190, 587, 100, _("Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = txt_ifkp_audit_log = new Fl_Output(92, 220, 323, 25, _("Audit log")); o->value(progdefaults.ifkp_audit_log.c_str()); } // Fl_Output* txt_ifkp_audit_log { Fl_Light_Button* o = btn_enable_ifkp_audit_log = new Fl_Light_Button(429, 220, 73, 25, _("Enable")); btn_enable_ifkp_audit_log->selection_color((Fl_Color)2); btn_enable_ifkp_audit_log->callback((Fl_Callback*)cb_btn_enable_ifkp_audit_log); o->value(progdefaults.ifkp_enable_audit_log); } // Fl_Light_Button* btn_enable_ifkp_audit_log { btn_ifkp_select_auditlog = new Fl_Button(510, 220, 70, 25, _("Select")); btn_ifkp_select_auditlog->callback((Fl_Callback*)cb_btn_ifkp_select_auditlog); } // Fl_Button* btn_ifkp_select_auditlog { Fl_Output* o = txt_ifkp_heard_log = new Fl_Output(92, 249, 323, 25, _("Heard log")); o->value(progdefaults.ifkp_heard_log.c_str()); } // Fl_Output* txt_ifkp_heard_log { Fl_Light_Button* o = btn_enable_ifkp_heard_log = new Fl_Light_Button(429, 249, 73, 25, _("Enable")); btn_enable_ifkp_heard_log->selection_color((Fl_Color)2); btn_enable_ifkp_heard_log->callback((Fl_Callback*)cb_btn_enable_ifkp_heard_log); o->value(progdefaults.ifkp_enable_heard_log); } // Fl_Light_Button* btn_enable_ifkp_heard_log { btn_select_ifkp_heard_log = new Fl_Button(510, 249, 70, 25, _("Select")); btn_select_ifkp_heard_log->callback((Fl_Callback*)cb_btn_select_ifkp_heard_log); } // Fl_Button* btn_select_ifkp_heard_log o->end(); } // Fl_Group* o tabIFKP->end(); } // Fl_Group* tabIFKP { tabMT63 = new Fl_Group(0, 50, 600, 340, _("MT-63")); tabMT63->hide(); { Fl_Group* o = new Fl_Group(55, 73, 490, 84); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnMT63_8bit = new Fl_Check_Button(200, 87, 205, 20, _("8-bit extended characters (UTF-8)")); btnMT63_8bit->tooltip(_("Enable this for UTF-8 characters")); btnMT63_8bit->down_box(FL_DOWN_BOX); btnMT63_8bit->value(1); btnMT63_8bit->callback((Fl_Callback*)cb_btnMT63_8bit); o->value(progdefaults.mt63_8bit); } // Fl_Check_Button* btnMT63_8bit { Fl_Check_Button* o = btnMT63_rx_integration = new Fl_Check_Button(200, 117, 190, 20, _("Long receive integration")); btnMT63_rx_integration->tooltip(_("Enable for very weak signals")); btnMT63_rx_integration->down_box(FL_DOWN_BOX); btnMT63_rx_integration->value(1); btnMT63_rx_integration->callback((Fl_Callback*)cb_btnMT63_rx_integration); o->value(progdefaults.mt63_rx_integration); } // Fl_Check_Button* btnMT63_rx_integration o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 169, 490, 178); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnMT63_usetones = new Fl_Check_Button(199, 177, 200, 20, _("Transmit lower start tone")); btnMT63_usetones->down_box(FL_DOWN_BOX); btnMT63_usetones->callback((Fl_Callback*)cb_btnMT63_usetones); o->value(progdefaults.mt63_usetones); } // Fl_Check_Button* btnMT63_usetones { Fl_Check_Button* o = btnMT63_upper_lower = new Fl_Check_Button(199, 207, 200, 20, _("Transmit upper start tone")); btnMT63_upper_lower->down_box(FL_DOWN_BOX); btnMT63_upper_lower->callback((Fl_Callback*)cb_btnMT63_upper_lower); o->value(progdefaults.mt63_twotones); if (!btnMT63_usetones->value()) o->deactivate(); } // Fl_Check_Button* btnMT63_upper_lower { Fl_Spinner2* o = MT63_tone_duration = new Fl_Spinner2(199, 233, 40, 20, _("Tone Duration (secs)")); MT63_tone_duration->box(FL_NO_BOX); MT63_tone_duration->color(FL_BACKGROUND_COLOR); MT63_tone_duration->selection_color(FL_BACKGROUND_COLOR); MT63_tone_duration->labeltype(FL_NORMAL_LABEL); MT63_tone_duration->labelfont(0); MT63_tone_duration->labelsize(14); MT63_tone_duration->labelcolor(FL_FOREGROUND_COLOR); MT63_tone_duration->maximum(10); MT63_tone_duration->value(4); MT63_tone_duration->callback((Fl_Callback*)cb_MT63_tone_duration); MT63_tone_duration->align(Fl_Align(FL_ALIGN_RIGHT)); MT63_tone_duration->when(FL_WHEN_RELEASE); o->value(progdefaults.mt63_tone_duration); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* MT63_tone_duration { Fl_Check_Button* o = btnMT63_at500 = new Fl_Check_Button(199, 262, 200, 20, _("Low tone at 500 Hz")); btnMT63_at500->down_box(FL_DOWN_BOX); btnMT63_at500->callback((Fl_Callback*)cb_btnMT63_at500); o->value(progdefaults.mt63_at500); } // Fl_Check_Button* btnMT63_at500 { Fl_Check_Button* o = btnMT63_centered = new Fl_Check_Button(199, 287, 248, 20, _("Centered at 1500 Hz (SHARES)")); btnMT63_centered->down_box(FL_DOWN_BOX); btnMT63_centered->callback((Fl_Callback*)cb_btnMT63_centered); o->value(progdefaults.mt63_centered); } // Fl_Check_Button* btnMT63_centered { Fl_Check_Button* o = btnMT63_manual = new Fl_Check_Button(199, 312, 200, 20, _("Manual tuning")); btnMT63_manual->down_box(FL_DOWN_BOX); btnMT63_manual->callback((Fl_Callback*)cb_btnMT63_manual); o->value(!progdefaults.mt63_at500 && !progdefaults.mt63_centered); } // Fl_Check_Button* btnMT63_manual o->end(); } // Fl_Group* o tabMT63->end(); } // Fl_Group* tabMT63 { tabOlivia = new Fl_Group(0, 50, 600, 340, _("Oliv")); tabOlivia->hide(); { Fl_Group* o = new Fl_Group(55, 76, 490, 280); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = i_listbox_olivia_bandwidth = new Fl_ListBox(110, 96, 85, 22, _("Bandwidth")); i_listbox_olivia_bandwidth->tooltip(_("Select bandwidth")); i_listbox_olivia_bandwidth->box(FL_DOWN_BOX); i_listbox_olivia_bandwidth->color(FL_BACKGROUND2_COLOR); i_listbox_olivia_bandwidth->selection_color(FL_BACKGROUND_COLOR); i_listbox_olivia_bandwidth->labeltype(FL_NORMAL_LABEL); i_listbox_olivia_bandwidth->labelfont(0); i_listbox_olivia_bandwidth->labelsize(14); i_listbox_olivia_bandwidth->labelcolor(FL_FOREGROUND_COLOR); i_listbox_olivia_bandwidth->callback((Fl_Callback*)cb_i_listbox_olivia_bandwidth); i_listbox_olivia_bandwidth->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_olivia_bandwidth->when(FL_WHEN_RELEASE); o->add(szOliviaBandwidth); o->index(progdefaults.oliviabw); o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_bandwidth->end(); } // Fl_ListBox* i_listbox_olivia_bandwidth { Fl_ListBox* o = i_listbox_olivia_tones = new Fl_ListBox(371, 96, 70, 22, _("Tones")); i_listbox_olivia_tones->tooltip(_("Select number of tones")); i_listbox_olivia_tones->box(FL_DOWN_BOX); i_listbox_olivia_tones->color(FL_BACKGROUND2_COLOR); i_listbox_olivia_tones->selection_color(FL_BACKGROUND_COLOR); i_listbox_olivia_tones->labeltype(FL_NORMAL_LABEL); i_listbox_olivia_tones->labelfont(0); i_listbox_olivia_tones->labelsize(14); i_listbox_olivia_tones->labelcolor(FL_FOREGROUND_COLOR); i_listbox_olivia_tones->callback((Fl_Callback*)cb_i_listbox_olivia_tones); i_listbox_olivia_tones->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_olivia_tones->when(FL_WHEN_RELEASE); o->add(szOliviaTones); o->index(progdefaults.oliviatones); o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_tones->end(); } // Fl_ListBox* i_listbox_olivia_tones { Fl_Group* o = new Fl_Group(110, 135, 379, 133, _("Receive synchronizer")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntOlivia_smargin = new Fl_Counter2(125, 166, 70, 22, _("Tune margin (tone frequency spacing)")); cntOlivia_smargin->tooltip(_("Change ONLY to experiment")); cntOlivia_smargin->type(1); cntOlivia_smargin->box(FL_UP_BOX); cntOlivia_smargin->color(FL_BACKGROUND_COLOR); cntOlivia_smargin->selection_color(FL_INACTIVE_COLOR); cntOlivia_smargin->labeltype(FL_NORMAL_LABEL); cntOlivia_smargin->labelfont(0); cntOlivia_smargin->labelsize(14); cntOlivia_smargin->labelcolor(FL_FOREGROUND_COLOR); cntOlivia_smargin->minimum(2); cntOlivia_smargin->maximum(128); cntOlivia_smargin->step(1); cntOlivia_smargin->value(8); cntOlivia_smargin->callback((Fl_Callback*)cb_cntOlivia_smargin); cntOlivia_smargin->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_smargin->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.oliviasmargin); } // Fl_Counter2* cntOlivia_smargin { Fl_Counter2* o = cntOlivia_sinteg = new Fl_Counter2(125, 198, 70, 22, _("Integration period (FEC blocks)")); cntOlivia_sinteg->tooltip(_("Change ONLY to experiment")); cntOlivia_sinteg->type(1); cntOlivia_sinteg->box(FL_UP_BOX); cntOlivia_sinteg->color(FL_BACKGROUND_COLOR); cntOlivia_sinteg->selection_color(FL_INACTIVE_COLOR); cntOlivia_sinteg->labeltype(FL_NORMAL_LABEL); cntOlivia_sinteg->labelfont(0); cntOlivia_sinteg->labelsize(14); cntOlivia_sinteg->labelcolor(FL_FOREGROUND_COLOR); cntOlivia_sinteg->minimum(2); cntOlivia_sinteg->maximum(128); cntOlivia_sinteg->step(1); cntOlivia_sinteg->value(4); cntOlivia_sinteg->callback((Fl_Callback*)cb_cntOlivia_sinteg); cntOlivia_sinteg->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_sinteg->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.oliviasinteg); } // Fl_Counter2* cntOlivia_sinteg { Fl_Check_Button* o = btn_olivia_reset_fec = new Fl_Check_Button(126, 230, 349, 20, _("Reset FEC blocks when changing BW or Tones")); btn_olivia_reset_fec->tooltip(_("Enable this for UTF-8 character transmission")); btn_olivia_reset_fec->down_box(FL_DOWN_BOX); btn_olivia_reset_fec->callback((Fl_Callback*)cb_btn_olivia_reset_fec); o->value(progdefaults.olivia_reset_fec); } // Fl_Check_Button* btn_olivia_reset_fec o->end(); } // Fl_Group* o { Fl_Check_Button* o = btnOlivia_8bit = new Fl_Check_Button(131, 291, 265, 20, _("8-bit extended characters (UTF-8)")); btnOlivia_8bit->tooltip(_("Enable this for UTF-8 character transmission")); btnOlivia_8bit->down_box(FL_DOWN_BOX); btnOlivia_8bit->callback((Fl_Callback*)cb_btnOlivia_8bit); o->value(progdefaults.olivia8bit); } // Fl_Check_Button* btnOlivia_8bit { Fl_Check_Button* o = btnOlivia_start_stop_tones = new Fl_Check_Button(131, 315, 265, 20, _("xmt start/stop tones")); btnOlivia_start_stop_tones->tooltip(_("Enable this to send start/stop tones")); btnOlivia_start_stop_tones->down_box(FL_DOWN_BOX); btnOlivia_start_stop_tones->callback((Fl_Callback*)cb_btnOlivia_start_stop_tones); o->value(progdefaults.olivia_start_tones); } // Fl_Check_Button* btnOlivia_start_stop_tones o->end(); } // Fl_Group* o tabOlivia->end(); } // Fl_Group* tabOlivia { tabContestia = new Fl_Group(0, 50, 600, 340, _("Cont")); tabContestia->hide(); { Fl_Group* o = new Fl_Group(55, 80, 490, 235); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = i_listbox_contestia_bandwidth = new Fl_ListBox(110, 100, 85, 22, _("Bandwidth")); i_listbox_contestia_bandwidth->tooltip(_("Select bandwidth")); i_listbox_contestia_bandwidth->box(FL_DOWN_BOX); i_listbox_contestia_bandwidth->color(FL_BACKGROUND2_COLOR); i_listbox_contestia_bandwidth->selection_color(FL_BACKGROUND_COLOR); i_listbox_contestia_bandwidth->labeltype(FL_NORMAL_LABEL); i_listbox_contestia_bandwidth->labelfont(0); i_listbox_contestia_bandwidth->labelsize(14); i_listbox_contestia_bandwidth->labelcolor(FL_FOREGROUND_COLOR); i_listbox_contestia_bandwidth->callback((Fl_Callback*)cb_i_listbox_contestia_bandwidth); i_listbox_contestia_bandwidth->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_contestia_bandwidth->when(FL_WHEN_RELEASE); o->add(szContestiaBandwidth); o->index(progdefaults.contestiabw); o->labelsize(FL_NORMAL_SIZE); i_listbox_contestia_bandwidth->end(); } // Fl_ListBox* i_listbox_contestia_bandwidth { Fl_ListBox* o = i_listbox_contestia_tones = new Fl_ListBox(371, 100, 70, 22, _("Tones")); i_listbox_contestia_tones->tooltip(_("Select number of tones")); i_listbox_contestia_tones->box(FL_DOWN_BOX); i_listbox_contestia_tones->color(FL_BACKGROUND2_COLOR); i_listbox_contestia_tones->selection_color(FL_BACKGROUND_COLOR); i_listbox_contestia_tones->labeltype(FL_NORMAL_LABEL); i_listbox_contestia_tones->labelfont(0); i_listbox_contestia_tones->labelsize(14); i_listbox_contestia_tones->labelcolor(FL_FOREGROUND_COLOR); i_listbox_contestia_tones->callback((Fl_Callback*)cb_i_listbox_contestia_tones); i_listbox_contestia_tones->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_contestia_tones->when(FL_WHEN_RELEASE); o->add(szContestiaTones); o->index(progdefaults.contestiatones); o->labelsize(FL_NORMAL_SIZE); i_listbox_contestia_tones->end(); } // Fl_ListBox* i_listbox_contestia_tones { Fl_Group* o = new Fl_Group(93, 139, 414, 131, _("Receive synchronizer")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntContestia_smargin = new Fl_Counter2(112, 170, 70, 22, _("Tune margin (tone frequency spacing)")); cntContestia_smargin->tooltip(_("Change ONLY to experiment")); cntContestia_smargin->type(1); cntContestia_smargin->box(FL_UP_BOX); cntContestia_smargin->color(FL_BACKGROUND_COLOR); cntContestia_smargin->selection_color(FL_INACTIVE_COLOR); cntContestia_smargin->labeltype(FL_NORMAL_LABEL); cntContestia_smargin->labelfont(0); cntContestia_smargin->labelsize(14); cntContestia_smargin->labelcolor(FL_FOREGROUND_COLOR); cntContestia_smargin->minimum(2); cntContestia_smargin->maximum(128); cntContestia_smargin->step(1); cntContestia_smargin->value(8); cntContestia_smargin->callback((Fl_Callback*)cb_cntContestia_smargin); cntContestia_smargin->align(Fl_Align(FL_ALIGN_RIGHT)); cntContestia_smargin->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntContestia_smargin { Fl_Counter2* o = cntContestia_sinteg = new Fl_Counter2(112, 202, 70, 22, _("Integration period (FEC blocks)")); cntContestia_sinteg->tooltip(_("Change ONLY to experiment")); cntContestia_sinteg->type(1); cntContestia_sinteg->box(FL_UP_BOX); cntContestia_sinteg->color(FL_BACKGROUND_COLOR); cntContestia_sinteg->selection_color(FL_INACTIVE_COLOR); cntContestia_sinteg->labeltype(FL_NORMAL_LABEL); cntContestia_sinteg->labelfont(0); cntContestia_sinteg->labelsize(14); cntContestia_sinteg->labelcolor(FL_FOREGROUND_COLOR); cntContestia_sinteg->minimum(2); cntContestia_sinteg->maximum(128); cntContestia_sinteg->step(1); cntContestia_sinteg->value(4); cntContestia_sinteg->callback((Fl_Callback*)cb_cntContestia_sinteg); cntContestia_sinteg->align(Fl_Align(FL_ALIGN_RIGHT)); cntContestia_sinteg->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntContestia_sinteg o->end(); } // Fl_Group* o { btnContestia_8bit = new Fl_Check_Button(79, 249, 200, 20, _("8-bit extended characters")); btnContestia_8bit->tooltip(_("Enable this for Latin-1 accented characters")); btnContestia_8bit->down_box(FL_DOWN_BOX); btnContestia_8bit->callback((Fl_Callback*)cb_btnContestia_8bit); btnContestia_8bit->hide(); } // Fl_Check_Button* btnContestia_8bit { Fl_Check_Button* o = btnContestia_start_stop_tones = new Fl_Check_Button(141, 280, 265, 20, _("xmt start/stop tones")); btnContestia_start_stop_tones->tooltip(_("Enable this to send start/stop tones")); btnContestia_start_stop_tones->down_box(FL_DOWN_BOX); btnContestia_start_stop_tones->callback((Fl_Callback*)cb_btnContestia_start_stop_tones); o->value(progdefaults.contestia_start_tones); } // Fl_Check_Button* btnContestia_start_stop_tones o->end(); } // Fl_Group* o tabContestia->end(); } // Fl_Group* tabContestia { tabPSK = new Fl_Group(0, 50, 600, 340, _("PSK")); tabPSK->hide(); { tabsPSK = new Fl_Tabs(0, 50, 600, 340); tabsPSK->selection_color(FL_LIGHT1); { grpPSK = new Fl_Group(0, 75, 600, 315, _("General")); grpPSK->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Group* o = new Fl_Group(55, 87, 490, 86, _("AFC behavior")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntSearchRange = new Fl_Counter2(200, 111, 75, 20, _("Acquisition search range (Hz)")); cntSearchRange->tooltip(_("Capture signals within this frequency range")); cntSearchRange->type(1); cntSearchRange->box(FL_UP_BOX); cntSearchRange->color(FL_BACKGROUND_COLOR); cntSearchRange->selection_color(FL_INACTIVE_COLOR); cntSearchRange->labeltype(FL_NORMAL_LABEL); cntSearchRange->labelfont(0); cntSearchRange->labelsize(14); cntSearchRange->labelcolor(FL_FOREGROUND_COLOR); cntSearchRange->minimum(10); cntSearchRange->maximum(500); cntSearchRange->step(10); cntSearchRange->value(200); cntSearchRange->callback((Fl_Callback*)cb_cntSearchRange); cntSearchRange->align(Fl_Align(FL_ALIGN_RIGHT)); cntSearchRange->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntSearchRange { Fl_Counter2* o = cntACQsn = new Fl_Counter2(200, 140, 75, 20, _("Acquisition S/N (dB)")); cntACQsn->tooltip(_("Capture signals over this threshold")); cntACQsn->type(1); cntACQsn->box(FL_UP_BOX); cntACQsn->color(FL_BACKGROUND_COLOR); cntACQsn->selection_color(FL_INACTIVE_COLOR); cntACQsn->labeltype(FL_NORMAL_LABEL); cntACQsn->labelfont(0); cntACQsn->labelsize(14); cntACQsn->labelcolor(FL_FOREGROUND_COLOR); cntACQsn->minimum(3); cntACQsn->maximum(20); cntACQsn->step(1); cntACQsn->value(6); cntACQsn->callback((Fl_Callback*)cb_cntACQsn); cntACQsn->align(Fl_Align(FL_ALIGN_RIGHT)); cntACQsn->when(FL_WHEN_CHANGED); o->value(progdefaults.ACQsn); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntACQsn o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 175, 490, 65, _("S/N and IMD behavior")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = listbox_psk_status_timeout = new Fl_ListBox(180, 206, 80, 20, _("after")); listbox_psk_status_timeout->tooltip(_("Behavior of s/n imd")); listbox_psk_status_timeout->box(FL_DOWN_BOX); listbox_psk_status_timeout->color(FL_BACKGROUND2_COLOR); listbox_psk_status_timeout->selection_color(FL_BACKGROUND_COLOR); listbox_psk_status_timeout->labeltype(FL_NORMAL_LABEL); listbox_psk_status_timeout->labelfont(0); listbox_psk_status_timeout->labelsize(14); listbox_psk_status_timeout->labelcolor(FL_FOREGROUND_COLOR); listbox_psk_status_timeout->callback((Fl_Callback*)cb_listbox_psk_status_timeout); listbox_psk_status_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_psk_status_timeout->when(FL_WHEN_RELEASE); o->add(_("Clear")); o->add(_("Dim")); o->index(progdefaults.StatusDim); o->labelsize(FL_NORMAL_SIZE); listbox_psk_status_timeout->end(); } // Fl_ListBox* listbox_psk_status_timeout { Fl_Counter2* o = new Fl_Counter2(321, 206, 75, 20, _("seconds")); o->tooltip(_("Will occur after this time in seconds")); o->type(1); o->box(FL_UP_BOX); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_INACTIVE_COLOR); o->labeltype(FL_NORMAL_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->minimum(0); o->maximum(30); o->step(1); o->callback((Fl_Callback*)cb_seconds); o->align(Fl_Align(FL_ALIGN_RIGHT)); o->when(FL_WHEN_CHANGED); o->value(progdefaults.StatusTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 245, 490, 80, _("Multi-Channel Signal Processing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnEnablePSKbrowsing = new Fl_Check_Button(225, 295, 180, 20, _("Multi-channel detector")); btnEnablePSKbrowsing->down_box(FL_DOWN_BOX); btnEnablePSKbrowsing->callback((Fl_Callback*)cb_btnEnablePSKbrowsing); o->value(progdefaults.pskbrowser_on); } // Fl_Check_Button* btnEnablePSKbrowsing { Fl_Box* o = new Fl_Box(65, 272, 440, 20, _("Disable on very slow CPUs of if signal browser is not used")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 327, 490, 47, _("8 psk")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPSKpilot = new Fl_Check_Button(100, 340, 113, 20, _("Pilot tone")); btnPSKpilot->tooltip(_("Enable encode/decode vestigial pilot tone")); btnPSKpilot->down_box(FL_DOWN_BOX); btnPSKpilot->callback((Fl_Callback*)cb_btnPSKpilot); o->value(progdefaults.pskpilot); } // Fl_Check_Button* btnPSKpilot { Fl_Counter2* o = cnt_pilot_power = new Fl_Counter2(205, 340, 75, 20, _("pilot power (dB)")); cnt_pilot_power->tooltip(_("Pilot tone power relative to signal")); cnt_pilot_power->type(1); cnt_pilot_power->box(FL_UP_BOX); cnt_pilot_power->color(FL_BACKGROUND_COLOR); cnt_pilot_power->selection_color(FL_INACTIVE_COLOR); cnt_pilot_power->labeltype(FL_NORMAL_LABEL); cnt_pilot_power->labelfont(0); cnt_pilot_power->labelsize(14); cnt_pilot_power->labelcolor(FL_FOREGROUND_COLOR); cnt_pilot_power->minimum(-60); cnt_pilot_power->maximum(-20); cnt_pilot_power->step(1); cnt_pilot_power->value(-30); cnt_pilot_power->callback((Fl_Callback*)cb_cnt_pilot_power); cnt_pilot_power->align(Fl_Align(FL_ALIGN_RIGHT)); cnt_pilot_power->when(FL_WHEN_CHANGED); o->value(progdefaults.pilot_power); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cnt_pilot_power { Fl_Check_Button* o = btnPSK8Preamble = new Fl_Check_Button(410, 340, 113, 20, _("Short Preamble")); btnPSK8Preamble->tooltip(_("Enable short preamble for 8PSK transmission")); btnPSK8Preamble->down_box(FL_DOWN_BOX); btnPSK8Preamble->callback((Fl_Callback*)cb_btnPSK8Preamble); o->value(progStatus.psk8DCDShortFlag); } // Fl_Check_Button* btnPSK8Preamble o->end(); } // Fl_Group* o grpPSK->end(); } // Fl_Group* grpPSK tabsPSK->end(); } // Fl_Tabs* tabsPSK tabPSK->end(); } // Fl_Group* tabPSK { tabRTTY = new Fl_Group(0, 50, 609, 340, _("TTY")); tabRTTY->hide(); { tabsRTTY = new Fl_Tabs(0, 50, 609, 340); tabsRTTY->selection_color(FL_LIGHT1); { tab_Rx_TTY = new Fl_Group(0, 75, 600, 315, _("Rx")); tab_Rx_TTY->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tab_Rx_TTY->hide(); { Fl_Group* o = new Fl_Group(32, 101, 535, 69, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = i_listbox_rtty_afc_speed = new Fl_ListBox(107, 128, 90, 22, _("AFC speed")); i_listbox_rtty_afc_speed->tooltip(_("AFC tracking speed")); i_listbox_rtty_afc_speed->box(FL_DOWN_BOX); i_listbox_rtty_afc_speed->color(FL_BACKGROUND2_COLOR); i_listbox_rtty_afc_speed->selection_color(FL_BACKGROUND_COLOR); i_listbox_rtty_afc_speed->labeltype(FL_NORMAL_LABEL); i_listbox_rtty_afc_speed->labelfont(0); i_listbox_rtty_afc_speed->labelsize(14); i_listbox_rtty_afc_speed->labelcolor(FL_FOREGROUND_COLOR); i_listbox_rtty_afc_speed->callback((Fl_Callback*)cb_i_listbox_rtty_afc_speed); i_listbox_rtty_afc_speed->align(Fl_Align(FL_ALIGN_TOP)); i_listbox_rtty_afc_speed->when(FL_WHEN_RELEASE); o->add("Slow"); o->add("Normal"); o->add("Fast"); o->index(progdefaults.rtty_afcspeed); o->labelsize(FL_NORMAL_SIZE); i_listbox_rtty_afc_speed->end(); } // Fl_ListBox* i_listbox_rtty_afc_speed { Fl_Check_Button* o = chkUOSrx = new Fl_Check_Button(211, 128, 63, 22, _("RX - unshift on space")); chkUOSrx->tooltip(_("Revert to unshifted char\'s on a space")); chkUOSrx->down_box(FL_DOWN_BOX); chkUOSrx->callback((Fl_Callback*)cb_chkUOSrx); o->value(progdefaults.UOSrx); } // Fl_Check_Button* chkUOSrx { Fl_Value_Input* o = rtty_rx_shape = new Fl_Value_Input(445, 126, 48, 25, _("Filter Shape Factor")); rtty_rx_shape->tooltip(_("rcos timing coefficient:\n1.0 ... 2.0\nW1HKJ best 1.275\nDO2SMF best 1.500")); rtty_rx_shape->minimum(1); rtty_rx_shape->maximum(2); rtty_rx_shape->step(0.001); rtty_rx_shape->value(1.25); rtty_rx_shape->callback((Fl_Callback*)cb_rtty_rx_shape); rtty_rx_shape->align(Fl_Align(FL_ALIGN_TOP)); rtty_rx_shape->hide(); o->value(progdefaults.rtty_filter); } // Fl_Value_Input* rtty_rx_shape o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 171, 535, 55, _("Decode (CWI suppression)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnRxTones[0] = new Fl_Check_Button(120, 198, 70, 15, _("Mark-Space")); btnRxTones[0]->down_box(FL_DOWN_BOX); btnRxTones[0]->callback((Fl_Callback*)cb_btnRxTones); o->value(progdefaults.rtty_cwi == 0); } // Fl_Check_Button* btnRxTones[0] { Fl_Check_Button* o = btnRxTones[1] = new Fl_Check_Button(253, 198, 70, 15, _("Mark only")); btnRxTones[1]->down_box(FL_DOWN_BOX); btnRxTones[1]->callback((Fl_Callback*)cb_btnRxTones1); o->value(progdefaults.rtty_cwi == 1); } // Fl_Check_Button* btnRxTones[1] { Fl_Check_Button* o = btnRxTones[2] = new Fl_Check_Button(387, 198, 70, 15, _("Space only")); btnRxTones[2]->down_box(FL_DOWN_BOX); btnRxTones[2]->callback((Fl_Callback*)cb_btnRxTones2); o->value(progdefaults.rtty_cwi == 2); } // Fl_Check_Button* btnRxTones[2] o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 228, 535, 55, _("RTTY Scope Display")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPreferXhairScope = new Fl_Check_Button(120, 250, 165, 22, _("Use cross hair scope")); btnPreferXhairScope->tooltip(_("Default to cross hair digiscope")); btnPreferXhairScope->down_box(FL_DOWN_BOX); btnPreferXhairScope->callback((Fl_Callback*)cb_btnPreferXhairScope); o->value(progdefaults.PreferXhairScope); } // Fl_Check_Button* btnPreferXhairScope { Fl_Check_Button* o = chk_true_scope = new Fl_Check_Button(340, 250, 70, 22, _("XY - classic scope")); chk_true_scope->tooltip(_("Enabled - use Mark/Space filter outputs\nDisabled - use pseudo signals")); chk_true_scope->down_box(FL_DOWN_BOX); chk_true_scope->callback((Fl_Callback*)cb_chk_true_scope); o->value(progdefaults.true_scope); } // Fl_Check_Button* chk_true_scope o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 285, 535, 65, _("Log RTTY frequency")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_useMARKfreq = new Fl_Check_Button(120, 311, 146, 22, _("Use MARK freq\'")); chk_useMARKfreq->tooltip(_("Enabled - log QSO using Mark frequency\nDisabled - log QSO using center frequ\ ency")); chk_useMARKfreq->down_box(FL_DOWN_BOX); chk_useMARKfreq->value(1); chk_useMARKfreq->callback((Fl_Callback*)cb_chk_useMARKfreq); o->value(progdefaults.useMARKfreq); } // Fl_Check_Button* chk_useMARKfreq { Fl_Button* o = btnRTTY_mark_color = new Fl_Button(340, 311, 41, 18, _("track color")); btnRTTY_mark_color->tooltip(_("Color of Mark Track")); btnRTTY_mark_color->color((Fl_Color)2); btnRTTY_mark_color->callback((Fl_Callback*)cb_btnRTTY_mark_color); btnRTTY_mark_color->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); } // Fl_Button* btnRTTY_mark_color o->end(); } // Fl_Group* o tab_Rx_TTY->end(); } // Fl_Group* tab_Rx_TTY { tab_SndCrd_FSK = new Fl_Group(0, 75, 600, 315, _("Tx")); tab_SndCrd_FSK->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tab_SndCrd_FSK->hide(); { Fl_Group* o = new Fl_Group(5, 85, 590, 225, _("Sound Card FSK")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = selShift = new Fl_ListBox(75, 109, 100, 22, _("Carrier shift")); selShift->tooltip(_("Select carrier shift")); selShift->box(FL_DOWN_BOX); selShift->color(FL_BACKGROUND2_COLOR); selShift->selection_color(FL_BACKGROUND_COLOR); selShift->labeltype(FL_NORMAL_LABEL); selShift->labelfont(0); selShift->labelsize(14); selShift->labelcolor(FL_FOREGROUND_COLOR); selShift->callback((Fl_Callback*)cb_selShift); selShift->align(Fl_Align(FL_ALIGN_RIGHT)); selShift->when(FL_WHEN_CHANGED); o->add(szShifts);o->index(progdefaults.rtty_shift); o->labelsize(FL_NORMAL_SIZE); selShift->end(); } // Fl_ListBox* selShift { Fl_Counter2* o = selCustomShift = new Fl_Counter2(75, 142, 100, 22, _("Custom shift")); selCustomShift->tooltip(_("Input carrier shift")); selCustomShift->box(FL_UP_BOX); selCustomShift->color(FL_BACKGROUND_COLOR); selCustomShift->selection_color(FL_INACTIVE_COLOR); selCustomShift->labeltype(FL_NORMAL_LABEL); selCustomShift->labelfont(0); selCustomShift->labelsize(14); selCustomShift->labelcolor(FL_FOREGROUND_COLOR); selCustomShift->minimum(10); selCustomShift->maximum(1200); selCustomShift->step(10); selCustomShift->value(450); selCustomShift->callback((Fl_Callback*)cb_selCustomShift); selCustomShift->align(Fl_Align(FL_ALIGN_RIGHT)); selCustomShift->when(FL_WHEN_CHANGED); o->lstep(100.0); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* selCustomShift { Fl_ListBox* o = selBaud = new Fl_ListBox(75, 175, 100, 22, _("Baud rate")); selBaud->tooltip(_("Select carrier baudrate")); selBaud->box(FL_DOWN_BOX); selBaud->color(FL_BACKGROUND2_COLOR); selBaud->selection_color(FL_BACKGROUND_COLOR); selBaud->labeltype(FL_NORMAL_LABEL); selBaud->labelfont(0); selBaud->labelsize(14); selBaud->labelcolor(FL_FOREGROUND_COLOR); selBaud->callback((Fl_Callback*)cb_selBaud); selBaud->align(Fl_Align(FL_ALIGN_RIGHT)); selBaud->when(FL_WHEN_CHANGED); o->add(szBauds); o->index(progdefaults.rtty_baud); o->labelsize(FL_NORMAL_SIZE); selBaud->end(); } // Fl_ListBox* selBaud { Fl_ListBox* o = selBits = new Fl_ListBox(75, 208, 100, 22, _("Bits per character")); selBits->tooltip(_("Select # bits / char")); selBits->box(FL_DOWN_BOX); selBits->color(FL_BACKGROUND2_COLOR); selBits->selection_color(FL_BACKGROUND_COLOR); selBits->labeltype(FL_NORMAL_LABEL); selBits->labelfont(0); selBits->labelsize(14); selBits->labelcolor(FL_FOREGROUND_COLOR); selBits->callback((Fl_Callback*)cb_selBits); selBits->align(Fl_Align(FL_ALIGN_RIGHT)); selBits->when(FL_WHEN_CHANGED); o->add(szSelBits);o->index(progdefaults.rtty_bits); o->labelsize(FL_NORMAL_SIZE); selBits->end(); } // Fl_ListBox* selBits { Fl_ListBox* o = selParity = new Fl_ListBox(75, 241, 100, 22, _("Parity")); selParity->tooltip(_("Select parity")); selParity->box(FL_DOWN_BOX); selParity->color(FL_BACKGROUND2_COLOR); selParity->selection_color(FL_BACKGROUND_COLOR); selParity->labeltype(FL_NORMAL_LABEL); selParity->labelfont(0); selParity->labelsize(14); selParity->labelcolor(FL_FOREGROUND_COLOR); selParity->callback((Fl_Callback*)cb_selParity); selParity->align(Fl_Align(FL_ALIGN_RIGHT)); selParity->when(FL_WHEN_CHANGED); o->add(szParity);o->index(progdefaults.rtty_parity); o->labelsize(FL_NORMAL_SIZE); selParity->end(); } // Fl_ListBox* selParity { Fl_ListBox* o = selStopBits = new Fl_ListBox(75, 275, 100, 22, _("Stop bits")); selStopBits->tooltip(_("Select # stop bits")); selStopBits->box(FL_DOWN_BOX); selStopBits->color(FL_BACKGROUND2_COLOR); selStopBits->selection_color(FL_BACKGROUND_COLOR); selStopBits->labeltype(FL_NORMAL_LABEL); selStopBits->labelfont(0); selStopBits->labelsize(14); selStopBits->labelcolor(FL_FOREGROUND_COLOR); selStopBits->callback((Fl_Callback*)cb_selStopBits); selStopBits->align(Fl_Align(FL_ALIGN_RIGHT)); selStopBits->when(FL_WHEN_CHANGED); o->add(szStopBits);o->index(progdefaults.rtty_stop); o->labelsize(FL_NORMAL_SIZE); selStopBits->end(); } // Fl_ListBox* selStopBits { Fl_Check_Button* o = btnAUTOCRLF = new Fl_Check_Button(326, 109, 90, 22, _("AutoCRLF")); btnAUTOCRLF->tooltip(_("Add CRLF after page width characters")); btnAUTOCRLF->down_box(FL_DOWN_BOX); btnAUTOCRLF->callback((Fl_Callback*)cb_btnAUTOCRLF); o->value(progdefaults.rtty_autocrlf); } // Fl_Check_Button* btnAUTOCRLF { Fl_Counter2* o = cntrAUTOCRLF = new Fl_Counter2(437, 109, 65, 22, _("chars")); cntrAUTOCRLF->tooltip(_("Auto CRLF line length")); cntrAUTOCRLF->type(1); cntrAUTOCRLF->box(FL_UP_BOX); cntrAUTOCRLF->color(FL_BACKGROUND_COLOR); cntrAUTOCRLF->selection_color(FL_INACTIVE_COLOR); cntrAUTOCRLF->labeltype(FL_NORMAL_LABEL); cntrAUTOCRLF->labelfont(0); cntrAUTOCRLF->labelsize(14); cntrAUTOCRLF->labelcolor(FL_FOREGROUND_COLOR); cntrAUTOCRLF->minimum(68); cntrAUTOCRLF->maximum(80); cntrAUTOCRLF->step(1); cntrAUTOCRLF->value(72); cntrAUTOCRLF->callback((Fl_Callback*)cb_cntrAUTOCRLF); cntrAUTOCRLF->align(Fl_Align(FL_ALIGN_RIGHT)); cntrAUTOCRLF->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntrAUTOCRLF { Fl_Check_Button* o = btnCRCRLF = new Fl_Check_Button(326, 142, 90, 22, _("CR-CR-LF")); btnCRCRLF->tooltip(_("Use \"cr cr lf\" for \"cr lf\"")); btnCRCRLF->down_box(FL_DOWN_BOX); btnCRCRLF->callback((Fl_Callback*)cb_btnCRCRLF); btnCRCRLF->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.rtty_crcrlf); } // Fl_Check_Button* btnCRCRLF { Fl_Check_Button* o = chkUOStx = new Fl_Check_Button(326, 175, 63, 22, _("TX - unshift on space")); chkUOStx->tooltip(_("Revert to Unsifted char\'s on a space")); chkUOStx->down_box(FL_DOWN_BOX); chkUOStx->callback((Fl_Callback*)cb_chkUOStx); o->value(progdefaults.UOStx); } // Fl_Check_Button* chkUOStx { Fl_Check_Button* o = chk_shaped_rtty = new Fl_Check_Button(326, 241, 212, 22, _("Shaped Tx")); chk_shaped_rtty->tooltip(_("Use wave shaping on Tx signal")); chk_shaped_rtty->down_box(FL_DOWN_BOX); chk_shaped_rtty->value(1); chk_shaped_rtty->callback((Fl_Callback*)cb_chk_shaped_rtty); o->value(progStatus.shaped_rtty); } // Fl_Check_Button* chk_shaped_rtty { Fl_Check_Button* o = chkPseudoFSK = new Fl_Check_Button(326, 208, 212, 22, _("Pseudo-FSK - right channel")); chkPseudoFSK->tooltip(_("Create keyed square wave on right audio channel")); chkPseudoFSK->down_box(FL_DOWN_BOX); chkPseudoFSK->callback((Fl_Callback*)cb_chkPseudoFSK); o->value(progdefaults.PseudoFSK); } // Fl_Check_Button* chkPseudoFSK o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 312, 590, 72, _("Transceiver FSK")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntr_xcvr_FSK_MARK = new Fl_Counter(15, 341, 126, 23, _("Mark")); cntr_xcvr_FSK_MARK->tooltip(_("Mark frequency in Hertz")); cntr_xcvr_FSK_MARK->minimum(500); cntr_xcvr_FSK_MARK->maximum(3000); cntr_xcvr_FSK_MARK->step(1); cntr_xcvr_FSK_MARK->value(2115); cntr_xcvr_FSK_MARK->callback((Fl_Callback*)cb_cntr_xcvr_FSK_MARK); cntr_xcvr_FSK_MARK->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.xcvr_FSK_MARK); o->lstep(10); } // Fl_Counter* cntr_xcvr_FSK_MARK { Fl_ListBox* o = sel_xcvr_FSK_shift = new Fl_ListBox(198, 341, 100, 23, _("Carrier shift")); sel_xcvr_FSK_shift->tooltip(_("Carrier shift in Hertz")); sel_xcvr_FSK_shift->box(FL_DOWN_BOX); sel_xcvr_FSK_shift->color(FL_BACKGROUND2_COLOR); sel_xcvr_FSK_shift->selection_color(FL_BACKGROUND_COLOR); sel_xcvr_FSK_shift->labeltype(FL_NORMAL_LABEL); sel_xcvr_FSK_shift->labelfont(0); sel_xcvr_FSK_shift->labelsize(14); sel_xcvr_FSK_shift->labelcolor(FL_FOREGROUND_COLOR); sel_xcvr_FSK_shift->callback((Fl_Callback*)cb_sel_xcvr_FSK_shift); sel_xcvr_FSK_shift->align(Fl_Align(FL_ALIGN_RIGHT)); sel_xcvr_FSK_shift->when(FL_WHEN_CHANGED); o->add(szShifts); o->index(progdefaults.rtty_shift); sel_xcvr_FSK_shift->end(); } // Fl_ListBox* sel_xcvr_FSK_shift { Fl_Counter* o = cnt_TTY_LTRS = new Fl_Counter(405, 341, 80, 23, _("LTRS at start")); cnt_TTY_LTRS->tooltip(_("Insert NN LTRS bytes at start of each transmission")); cnt_TTY_LTRS->type(1); cnt_TTY_LTRS->minimum(0); cnt_TTY_LTRS->maximum(10); cnt_TTY_LTRS->step(1); cnt_TTY_LTRS->value(2); cnt_TTY_LTRS->callback((Fl_Callback*)cb_cnt_TTY_LTRS); cnt_TTY_LTRS->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.TTY_LTRS); } // Fl_Counter* cnt_TTY_LTRS o->end(); } // Fl_Group* o tab_SndCrd_FSK->end(); } // Fl_Group* tab_SndCrd_FSK { tab_nanoIO = new Fl_Group(0, 75, 600, 315, _("nanoIO Tx")); tab_nanoIO->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tab_nanoIO->hide(); { select_nanoIO_CommPort = new Fl_ComboBox(86, 85, 405, 23, _("Ser. Port")); select_nanoIO_CommPort->tooltip(_("nanoIO serial port")); select_nanoIO_CommPort->box(FL_DOWN_BOX); select_nanoIO_CommPort->color((Fl_Color)55); select_nanoIO_CommPort->selection_color(FL_BACKGROUND_COLOR); select_nanoIO_CommPort->labeltype(FL_NORMAL_LABEL); select_nanoIO_CommPort->labelfont(0); select_nanoIO_CommPort->labelsize(14); select_nanoIO_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_nanoIO_CommPort->callback((Fl_Callback*)cb_select_nanoIO_CommPort); select_nanoIO_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_nanoIO_CommPort->when(FL_WHEN_RELEASE); select_nanoIO_CommPort->end(); } // Fl_ComboBox* select_nanoIO_CommPort { btn_nanoIO_connect = new Fl_Light_Button(501, 85, 80, 23, _("Connect")); btn_nanoIO_connect->tooltip(_("Connect / Disconnect from nanoIO")); btn_nanoIO_connect->callback((Fl_Callback*)cb_btn_nanoIO_connect); } // Fl_Light_Button* btn_nanoIO_connect { Fl_ListBox* o = sel_nanoIO_baud = new Fl_ListBox(391, 112, 100, 23, _("Baud rate")); sel_nanoIO_baud->tooltip(_("nanoIO - TTY baud")); sel_nanoIO_baud->box(FL_DOWN_BOX); sel_nanoIO_baud->color(FL_BACKGROUND2_COLOR); sel_nanoIO_baud->selection_color(FL_BACKGROUND_COLOR); sel_nanoIO_baud->labeltype(FL_NORMAL_LABEL); sel_nanoIO_baud->labelfont(0); sel_nanoIO_baud->labelsize(14); sel_nanoIO_baud->labelcolor(FL_FOREGROUND_COLOR); sel_nanoIO_baud->callback((Fl_Callback*)cb_sel_nanoIO_baud); sel_nanoIO_baud->align(Fl_Align(FL_ALIGN_LEFT)); sel_nanoIO_baud->when(FL_WHEN_CHANGED); o->add("45.45|50.0|75.0|100.0"); o->index(progdefaults.nanoIO_baud); o->labelsize(FL_NORMAL_SIZE); sel_nanoIO_baud->end(); } // Fl_ListBox* sel_nanoIO_baud { Fl_Check_Button* o = chk_nanoIO_polarity = new Fl_Check_Button(84, 112, 63, 22, _("MARK polarity")); chk_nanoIO_polarity->tooltip(_("Set - mark logical HIGH\nRead from nanoIO")); chk_nanoIO_polarity->down_box(FL_DOWN_BOX); chk_nanoIO_polarity->callback((Fl_Callback*)cb_chk_nanoIO_polarity); o->value(progdefaults.nanoIO_polarity); } // Fl_Check_Button* chk_nanoIO_polarity { FTextView* o = txt_nano_io = new FTextView(4, 155, 590, 230, _("USB serial I/O")); txt_nano_io->box(FL_DOWN_FRAME); txt_nano_io->color(FL_BACKGROUND2_COLOR); txt_nano_io->selection_color(FL_SELECTION_COLOR); txt_nano_io->labeltype(FL_NORMAL_LABEL); txt_nano_io->labelfont(0); txt_nano_io->labelsize(14); txt_nano_io->labelcolor(FL_FOREGROUND_COLOR); txt_nano_io->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_nano_io->when(FL_WHEN_RELEASE); o->setFont(progdefaults.RxFontnbr); o->setFontSize(12); } // FTextView* txt_nano_io tab_nanoIO->end(); } // Fl_Group* tab_nanoIO { tab_Nav = new Fl_Group(0, 75, 600, 315, _("Navigator")); tab_Nav->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tab_Nav->hide(); { Fl_Group* o = new Fl_Group(5, 82, 590, 55, _("FSK Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ComboBox* o = select_USN_FSK_port = new Fl_ComboBox(48, 105, 455, 23, _("Port")); select_USN_FSK_port->tooltip(_("Navigator serial port")); select_USN_FSK_port->box(FL_DOWN_BOX); select_USN_FSK_port->color((Fl_Color)55); select_USN_FSK_port->selection_color(FL_BACKGROUND_COLOR); select_USN_FSK_port->labeltype(FL_NORMAL_LABEL); select_USN_FSK_port->labelfont(0); select_USN_FSK_port->labelsize(14); select_USN_FSK_port->labelcolor(FL_FOREGROUND_COLOR); select_USN_FSK_port->callback((Fl_Callback*)cb_select_USN_FSK_port); select_USN_FSK_port->align(Fl_Align(FL_ALIGN_LEFT)); select_USN_FSK_port->when(FL_WHEN_RELEASE); o->value(progdefaults.Nav_FSK_port.c_str()); select_USN_FSK_port->end(); } // Fl_ComboBox* select_USN_FSK_port { btn_Nav_connect = new Fl_Light_Button(510, 105, 80, 23, _("FSK")); btn_Nav_connect->tooltip(_("Connect / Disconnect from Nav FSK port")); btn_Nav_connect->callback((Fl_Callback*)cb_btn_Nav_connect); } // Fl_Light_Button* btn_Nav_connect o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 140, 590, 245, _("Configuration Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ComboBox* o = select_Nav_config_port = new Fl_ComboBox(49, 161, 455, 23, _("Port")); select_Nav_config_port->tooltip(_("Navigator configuration port")); select_Nav_config_port->box(FL_DOWN_BOX); select_Nav_config_port->color((Fl_Color)55); select_Nav_config_port->selection_color(FL_BACKGROUND_COLOR); select_Nav_config_port->labeltype(FL_NORMAL_LABEL); select_Nav_config_port->labelfont(0); select_Nav_config_port->labelsize(14); select_Nav_config_port->labelcolor(FL_FOREGROUND_COLOR); select_Nav_config_port->callback((Fl_Callback*)cb_select_Nav_config_port); select_Nav_config_port->align(Fl_Align(FL_ALIGN_LEFT)); select_Nav_config_port->when(FL_WHEN_RELEASE); o->value(progdefaults.Nav_config_port.c_str()); select_Nav_config_port->end(); } // Fl_ComboBox* select_Nav_config_port { Fl_ListBox* o = sel_Nav_ch1 = new Fl_ListBox(177, 188, 80, 23, _("Channel 1 Attenuator")); sel_Nav_ch1->tooltip(_("Nav Channel 1 attenuator")); sel_Nav_ch1->box(FL_DOWN_BOX); sel_Nav_ch1->color(FL_BACKGROUND2_COLOR); sel_Nav_ch1->selection_color(FL_BACKGROUND_COLOR); sel_Nav_ch1->labeltype(FL_NORMAL_LABEL); sel_Nav_ch1->labelfont(0); sel_Nav_ch1->labelsize(14); sel_Nav_ch1->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_ch1->callback((Fl_Callback*)cb_sel_Nav_ch1); sel_Nav_ch1->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_ch1->when(FL_WHEN_CHANGED); o->add("15 db|Normal"); o->index(progdefaults.Nav_channel_1_att); sel_Nav_ch1->end(); } // Fl_ListBox* sel_Nav_ch1 { Fl_ListBox* o = sel_Nav_ch2 = new Fl_ListBox(177, 217, 80, 23, _("Channel 2 attenuator")); sel_Nav_ch2->tooltip(_("NavChannel 2 Attenuator")); sel_Nav_ch2->box(FL_DOWN_BOX); sel_Nav_ch2->color(FL_BACKGROUND2_COLOR); sel_Nav_ch2->selection_color(FL_BACKGROUND_COLOR); sel_Nav_ch2->labeltype(FL_NORMAL_LABEL); sel_Nav_ch2->labelfont(0); sel_Nav_ch2->labelsize(14); sel_Nav_ch2->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_ch2->callback((Fl_Callback*)cb_sel_Nav_ch2); sel_Nav_ch2->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_ch2->when(FL_WHEN_CHANGED); o->add("15 db|Normal"); o->index(progdefaults.Nav_channel_2_att); sel_Nav_ch2->end(); } // Fl_ListBox* sel_Nav_ch2 { Fl_ListBox* o = sel_Nav_rf_att = new Fl_ListBox(177, 247, 80, 23, _("RF attenuator")); sel_Nav_rf_att->tooltip(_("NavRF Attenuator")); sel_Nav_rf_att->box(FL_DOWN_BOX); sel_Nav_rf_att->color(FL_BACKGROUND2_COLOR); sel_Nav_rf_att->selection_color(FL_BACKGROUND_COLOR); sel_Nav_rf_att->labeltype(FL_NORMAL_LABEL); sel_Nav_rf_att->labelfont(0); sel_Nav_rf_att->labelsize(14); sel_Nav_rf_att->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_rf_att->callback((Fl_Callback*)cb_sel_Nav_rf_att); sel_Nav_rf_att->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_rf_att->when(FL_WHEN_CHANGED); o->add("20 db|Normal"); o->index(progdefaults.Nav_rf_att); sel_Nav_rf_att->end(); } // Fl_ListBox* sel_Nav_rf_att { Fl_ListBox* o = sel_Nav_wk_ptt = new Fl_ListBox(177, 277, 80, 23, _("WinKey PTT")); sel_Nav_wk_ptt->tooltip(_("NavWinkey PTT")); sel_Nav_wk_ptt->box(FL_DOWN_BOX); sel_Nav_wk_ptt->color(FL_BACKGROUND2_COLOR); sel_Nav_wk_ptt->selection_color(FL_BACKGROUND_COLOR); sel_Nav_wk_ptt->labeltype(FL_NORMAL_LABEL); sel_Nav_wk_ptt->labelfont(0); sel_Nav_wk_ptt->labelsize(14); sel_Nav_wk_ptt->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_wk_ptt->callback((Fl_Callback*)cb_sel_Nav_wk_ptt); sel_Nav_wk_ptt->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_wk_ptt->when(FL_WHEN_CHANGED); o->index(progdefaults.Nav_wk_ptt); o->add("On|Off"); sel_Nav_wk_ptt->end(); } // Fl_ListBox* sel_Nav_wk_ptt { Fl_ListBox* o = sel_Nav_LED = new Fl_ListBox(177, 307, 80, 23, _("LED brightness")); sel_Nav_LED->tooltip(_("NavLED brightness")); sel_Nav_LED->box(FL_DOWN_BOX); sel_Nav_LED->color(FL_BACKGROUND2_COLOR); sel_Nav_LED->selection_color(FL_BACKGROUND_COLOR); sel_Nav_LED->labeltype(FL_NORMAL_LABEL); sel_Nav_LED->labelfont(0); sel_Nav_LED->labelsize(14); sel_Nav_LED->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_LED->callback((Fl_Callback*)cb_sel_Nav_LED); sel_Nav_LED->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_LED->when(FL_WHEN_CHANGED); o->index(progdefaults.Nav_led); o->add("Dim|Normal"); sel_Nav_LED->end(); } // Fl_ListBox* sel_Nav_LED { Fl_ListBox* o = sel_Nav_CAT_LED = new Fl_ListBox(177, 337, 80, 23, _("CAT LED state")); sel_Nav_CAT_LED->tooltip(_("NavCAT state LED")); sel_Nav_CAT_LED->box(FL_DOWN_BOX); sel_Nav_CAT_LED->color(FL_BACKGROUND2_COLOR); sel_Nav_CAT_LED->selection_color(FL_BACKGROUND_COLOR); sel_Nav_CAT_LED->labeltype(FL_NORMAL_LABEL); sel_Nav_CAT_LED->labelfont(0); sel_Nav_CAT_LED->labelsize(14); sel_Nav_CAT_LED->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_CAT_LED->callback((Fl_Callback*)cb_sel_Nav_CAT_LED); sel_Nav_CAT_LED->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_CAT_LED->when(FL_WHEN_CHANGED); o->index(progdefaults.Nav_cat_led); o->add("Steady|Polling"); sel_Nav_CAT_LED->end(); } // Fl_ListBox* sel_Nav_CAT_LED { Fl_ListBox* o = sel_Nav_FSK_baud = new Fl_ListBox(385, 188, 80, 23, _("Baud rate")); sel_Nav_FSK_baud->tooltip(_("Nav FSK baud rate")); sel_Nav_FSK_baud->box(FL_DOWN_BOX); sel_Nav_FSK_baud->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_baud->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_baud->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_baud->labelfont(0); sel_Nav_FSK_baud->labelsize(14); sel_Nav_FSK_baud->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_baud->callback((Fl_Callback*)cb_sel_Nav_FSK_baud); sel_Nav_FSK_baud->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_baud->when(FL_WHEN_CHANGED); o->add("45.45|75|100"); o->index(progdefaults.Nav_FSK_baud); sel_Nav_FSK_baud->end(); } // Fl_ListBox* sel_Nav_FSK_baud { Fl_ListBox* o = sel_Nav_FSK_stopbits = new Fl_ListBox(384, 217, 80, 23, _("Stop bits")); sel_Nav_FSK_stopbits->tooltip(_("Nav FSK Stop bits")); sel_Nav_FSK_stopbits->box(FL_DOWN_BOX); sel_Nav_FSK_stopbits->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_stopbits->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_stopbits->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_stopbits->labelfont(0); sel_Nav_FSK_stopbits->labelsize(14); sel_Nav_FSK_stopbits->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_stopbits->callback((Fl_Callback*)cb_sel_Nav_FSK_stopbits); sel_Nav_FSK_stopbits->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_stopbits->when(FL_WHEN_CHANGED); o->add("1|1.5|2"); o->index(progdefaults.Nav_FSK_stopbits); sel_Nav_FSK_stopbits->end(); } // Fl_ListBox* sel_Nav_FSK_stopbits { Fl_ListBox* o = sel_Nav_FSK_polarity = new Fl_ListBox(384, 247, 80, 23, _("Mark Polarity")); sel_Nav_FSK_polarity->tooltip(_("Nav FSK MARK Polarity")); sel_Nav_FSK_polarity->box(FL_DOWN_BOX); sel_Nav_FSK_polarity->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_polarity->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_polarity->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_polarity->labelfont(0); sel_Nav_FSK_polarity->labelsize(14); sel_Nav_FSK_polarity->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_polarity->callback((Fl_Callback*)cb_sel_Nav_FSK_polarity); sel_Nav_FSK_polarity->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_polarity->when(FL_WHEN_CHANGED); o->add("Normal|Reverse"); o->index(progdefaults.Nav_FSK_polarity); sel_Nav_FSK_polarity->end(); } // Fl_ListBox* sel_Nav_FSK_polarity { Fl_ListBox* o = sel_Nav_FSK_sidetone = new Fl_ListBox(384, 277, 80, 23, _("Side tone")); sel_Nav_FSK_sidetone->tooltip(_("Nav FSK side tone")); sel_Nav_FSK_sidetone->box(FL_DOWN_BOX); sel_Nav_FSK_sidetone->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_sidetone->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_sidetone->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_sidetone->labelfont(0); sel_Nav_FSK_sidetone->labelsize(14); sel_Nav_FSK_sidetone->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_sidetone->callback((Fl_Callback*)cb_sel_Nav_FSK_sidetone); sel_Nav_FSK_sidetone->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_sidetone->when(FL_WHEN_CHANGED); o->add("On|Off"); o->index(progdefaults.Nav_FSK_sidetone); sel_Nav_FSK_sidetone->end(); } // Fl_ListBox* sel_Nav_FSK_sidetone { Fl_ListBox* o = sel_Nav_FSK_ptt = new Fl_ListBox(384, 307, 80, 23, _("FSK PTT")); sel_Nav_FSK_ptt->tooltip(_("Nav FSK PTT - should always be on")); sel_Nav_FSK_ptt->box(FL_DOWN_BOX); sel_Nav_FSK_ptt->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_ptt->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_ptt->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_ptt->labelfont(0); sel_Nav_FSK_ptt->labelsize(14); sel_Nav_FSK_ptt->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_ptt->callback((Fl_Callback*)cb_sel_Nav_FSK_ptt); sel_Nav_FSK_ptt->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_ptt->when(FL_WHEN_CHANGED); o->add("On|Off"); o->index(progdefaults.Nav_FSK_ptt); sel_Nav_FSK_ptt->end(); } // Fl_ListBox* sel_Nav_FSK_ptt { btn_Nav_config = new Fl_Light_Button(509, 161, 80, 23, _("Config")); btn_Nav_config->tooltip(_("Connect / Disconnect from Nav Config port")); btn_Nav_config->callback((Fl_Callback*)cb_btn_Nav_config); } // Fl_Light_Button* btn_Nav_config o->end(); } // Fl_Group* o tab_Nav->end(); } // Fl_Group* tab_Nav { tab_Synop = new Fl_Group(0, 75, 600, 315, _("Synop")); tab_Synop->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tab_Synop->hide(); { Fl_Check_Button* o = btnSynopAdifDecoding = new Fl_Check_Button(190, 91, 126, 22, _("SYNOP to ADIF")); btnSynopAdifDecoding->tooltip(_("Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file")); btnSynopAdifDecoding->down_box(FL_DOWN_BOX); btnSynopAdifDecoding->callback((Fl_Callback*)cb_btnSynopAdifDecoding); btnSynopAdifDecoding->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopAdifDecoding); } // Fl_Check_Button* btnSynopAdifDecoding { Fl_Check_Button* o = btnSynopKmlDecoding = new Fl_Check_Button(190, 129, 119, 22, _("SYNOP to KML")); btnSynopKmlDecoding->tooltip(_("Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Goog\ le Earth)")); btnSynopKmlDecoding->down_box(FL_DOWN_BOX); btnSynopKmlDecoding->callback((Fl_Callback*)cb_btnSynopKmlDecoding); btnSynopKmlDecoding->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopKmlDecoding); } // Fl_Check_Button* btnSynopKmlDecoding { Fl_Check_Button* o = btnSynopInterleaved = new Fl_Check_Button(190, 168, 210, 22, _("Interleave SYNOP and text")); btnSynopInterleaved->tooltip(_("Interleave text with decoded SYNOP messages, or replacement.")); btnSynopInterleaved->down_box(FL_DOWN_BOX); btnSynopInterleaved->callback((Fl_Callback*)cb_btnSynopInterleaved); btnSynopInterleaved->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopInterleaved); } // Fl_Check_Button* btnSynopInterleaved tab_Synop->end(); } // Fl_Group* tab_Synop { tab_WKFSK = new Fl_Group(0, 75, 609, 315, _("Winkeyer 3")); tab_WKFSK->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Group* o = new Fl_Group(5, 82, 590, 55, _("Serial Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ComboBox* o = select_WKFSK_CommPort = new Fl_ComboBox(73, 105, 405, 23, _("Port")); select_WKFSK_CommPort->tooltip(_("Xcvr serial port")); select_WKFSK_CommPort->box(FL_DOWN_BOX); select_WKFSK_CommPort->color((Fl_Color)55); select_WKFSK_CommPort->selection_color(FL_BACKGROUND_COLOR); select_WKFSK_CommPort->labeltype(FL_NORMAL_LABEL); select_WKFSK_CommPort->labelfont(0); select_WKFSK_CommPort->labelsize(14); select_WKFSK_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_WKFSK_CommPort->callback((Fl_Callback*)cb_select_WKFSK_CommPort); select_WKFSK_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_WKFSK_CommPort->when(FL_WHEN_RELEASE); o->value(progStatus.WK_serial_port_name.c_str()); select_WKFSK_CommPort->end(); } // Fl_ComboBox* select_WKFSK_CommPort { Fl_Light_Button* o = btn_WKFSK_connect = new Fl_Light_Button(504, 105, 80, 23, _("Connect")); btn_WKFSK_connect->tooltip(_("Connect / Disconnect from WinKeyer")); btn_WKFSK_connect->callback((Fl_Callback*)cb_btn_WKFSK_connect); o->value(progStatus.WK_online); } // Fl_Light_Button* btn_WKFSK_connect o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 140, 590, 245, _("Configuration Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = sel_WKFSK_baud = new Fl_ListBox(190, 178, 78, 23, _("Baud rate")); sel_WKFSK_baud->tooltip(_("Nav FSK baud rate")); sel_WKFSK_baud->box(FL_DOWN_BOX); sel_WKFSK_baud->color(FL_BACKGROUND2_COLOR); sel_WKFSK_baud->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_baud->labeltype(FL_NORMAL_LABEL); sel_WKFSK_baud->labelfont(0); sel_WKFSK_baud->labelsize(14); sel_WKFSK_baud->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_baud->callback((Fl_Callback*)cb_sel_WKFSK_baud); sel_WKFSK_baud->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_baud->when(FL_WHEN_CHANGED); o->add("45.45|50|75|100"); o->index(progStatus.WKFSK_baud); sel_WKFSK_baud->end(); } // Fl_ListBox* sel_WKFSK_baud { Fl_ListBox* o = sel_WKFSK_stopbits = new Fl_ListBox(190, 207, 78, 23, _("Stop bits")); sel_WKFSK_stopbits->tooltip(_("Nav FSK Stop bits")); sel_WKFSK_stopbits->box(FL_DOWN_BOX); sel_WKFSK_stopbits->color(FL_BACKGROUND2_COLOR); sel_WKFSK_stopbits->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_stopbits->labeltype(FL_NORMAL_LABEL); sel_WKFSK_stopbits->labelfont(0); sel_WKFSK_stopbits->labelsize(14); sel_WKFSK_stopbits->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_stopbits->callback((Fl_Callback*)cb_sel_WKFSK_stopbits); sel_WKFSK_stopbits->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_stopbits->when(FL_WHEN_CHANGED); o->add("2|1.5"); o->index(progStatus.WKFSK_stopbits); sel_WKFSK_stopbits->end(); } // Fl_ListBox* sel_WKFSK_stopbits { Fl_ListBox* o = sel_WKFSK_ptt = new Fl_ListBox(190, 236, 78, 23, _("FSK port")); sel_WKFSK_ptt->tooltip(_("NavWinkey PTT")); sel_WKFSK_ptt->box(FL_DOWN_BOX); sel_WKFSK_ptt->color(FL_BACKGROUND2_COLOR); sel_WKFSK_ptt->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_ptt->labeltype(FL_NORMAL_LABEL); sel_WKFSK_ptt->labelfont(0); sel_WKFSK_ptt->labelsize(14); sel_WKFSK_ptt->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_ptt->callback((Fl_Callback*)cb_sel_WKFSK_ptt); sel_WKFSK_ptt->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_ptt->when(FL_WHEN_CHANGED); o->add("On PTT|On KEY"); o->index(progStatus.WKFSK_ptt); sel_WKFSK_ptt->end(); } // Fl_ListBox* sel_WKFSK_ptt { Fl_ListBox* o = sel_WKFSK_polarity = new Fl_ListBox(190, 266, 78, 23, _("Mark Polarity")); sel_WKFSK_polarity->tooltip(_("Nav FSK MARK Polarity")); sel_WKFSK_polarity->box(FL_DOWN_BOX); sel_WKFSK_polarity->color(FL_BACKGROUND2_COLOR); sel_WKFSK_polarity->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_polarity->labeltype(FL_NORMAL_LABEL); sel_WKFSK_polarity->labelfont(0); sel_WKFSK_polarity->labelsize(14); sel_WKFSK_polarity->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_polarity->callback((Fl_Callback*)cb_sel_WKFSK_polarity); sel_WKFSK_polarity->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_polarity->when(FL_WHEN_CHANGED); o->add("Normal|Reverse"); o->index(progStatus.WKFSK_polarity); sel_WKFSK_polarity->end(); } // Fl_ListBox* sel_WKFSK_polarity { Fl_ListBox* o = sel_WKFSK_sidetone = new Fl_ListBox(190, 295, 78, 23, _("Sidetone")); sel_WKFSK_sidetone->tooltip(_("Nav FSK side tone")); sel_WKFSK_sidetone->box(FL_DOWN_BOX); sel_WKFSK_sidetone->color(FL_BACKGROUND2_COLOR); sel_WKFSK_sidetone->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_sidetone->labeltype(FL_NORMAL_LABEL); sel_WKFSK_sidetone->labelfont(0); sel_WKFSK_sidetone->labelsize(14); sel_WKFSK_sidetone->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_sidetone->callback((Fl_Callback*)cb_sel_WKFSK_sidetone); sel_WKFSK_sidetone->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_sidetone->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_sidetone); sel_WKFSK_sidetone->end(); } // Fl_ListBox* sel_WKFSK_sidetone { Fl_ListBox* o = sel_WKFSK_auto_crlf = new Fl_ListBox(190, 325, 78, 23, _("Auto CRLF")); sel_WKFSK_auto_crlf->tooltip(_("Nav FSK side tone")); sel_WKFSK_auto_crlf->box(FL_DOWN_BOX); sel_WKFSK_auto_crlf->color(FL_BACKGROUND2_COLOR); sel_WKFSK_auto_crlf->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_auto_crlf->labeltype(FL_NORMAL_LABEL); sel_WKFSK_auto_crlf->labelfont(0); sel_WKFSK_auto_crlf->labelsize(14); sel_WKFSK_auto_crlf->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_auto_crlf->callback((Fl_Callback*)cb_sel_WKFSK_auto_crlf); sel_WKFSK_auto_crlf->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_auto_crlf->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_auto_crlf); sel_WKFSK_auto_crlf->end(); } // Fl_ListBox* sel_WKFSK_auto_crlf { Fl_ListBox* o = sel_WKFSK_diddle = new Fl_ListBox(380, 178, 78, 23, _("Diddle")); sel_WKFSK_diddle->tooltip(_("Diddle On/OFF")); sel_WKFSK_diddle->box(FL_DOWN_BOX); sel_WKFSK_diddle->color(FL_BACKGROUND2_COLOR); sel_WKFSK_diddle->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_diddle->labeltype(FL_NORMAL_LABEL); sel_WKFSK_diddle->labelfont(0); sel_WKFSK_diddle->labelsize(14); sel_WKFSK_diddle->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_diddle->callback((Fl_Callback*)cb_sel_WKFSK_diddle); sel_WKFSK_diddle->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_diddle->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_diddle); sel_WKFSK_diddle->end(); } // Fl_ListBox* sel_WKFSK_diddle { Fl_ListBox* o = sel_WKFSK_diddle_char = new Fl_ListBox(380, 207, 78, 23, _("Diddle char")); sel_WKFSK_diddle_char->tooltip(_("Diddle character")); sel_WKFSK_diddle_char->box(FL_DOWN_BOX); sel_WKFSK_diddle_char->color(FL_BACKGROUND2_COLOR); sel_WKFSK_diddle_char->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_diddle_char->labeltype(FL_NORMAL_LABEL); sel_WKFSK_diddle_char->labelfont(0); sel_WKFSK_diddle_char->labelsize(14); sel_WKFSK_diddle_char->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_diddle_char->callback((Fl_Callback*)cb_sel_WKFSK_diddle_char); sel_WKFSK_diddle_char->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_diddle_char->when(FL_WHEN_CHANGED); o->add("BLANK|LTRS"); o->index(progStatus.WKFSK_diddle_char); sel_WKFSK_diddle_char->end(); } // Fl_ListBox* sel_WKFSK_diddle_char { Fl_ListBox* o = sel_WKFSK_usos = new Fl_ListBox(380, 236, 78, 23, _("USOS")); sel_WKFSK_usos->tooltip(_("Unshift on space")); sel_WKFSK_usos->box(FL_DOWN_BOX); sel_WKFSK_usos->color(FL_BACKGROUND2_COLOR); sel_WKFSK_usos->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_usos->labeltype(FL_NORMAL_LABEL); sel_WKFSK_usos->labelfont(0); sel_WKFSK_usos->labelsize(14); sel_WKFSK_usos->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_usos->callback((Fl_Callback*)cb_sel_WKFSK_usos); sel_WKFSK_usos->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_usos->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_usos); sel_WKFSK_usos->end(); } // Fl_ListBox* sel_WKFSK_usos { Fl_ListBox* o = sel_WKFSK_monitor = new Fl_ListBox(380, 266, 78, 23, _("Echo")); sel_WKFSK_monitor->tooltip(_("Unshift on space")); sel_WKFSK_monitor->box(FL_DOWN_BOX); sel_WKFSK_monitor->color(FL_BACKGROUND2_COLOR); sel_WKFSK_monitor->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_monitor->labeltype(FL_NORMAL_LABEL); sel_WKFSK_monitor->labelfont(0); sel_WKFSK_monitor->labelsize(14); sel_WKFSK_monitor->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_monitor->callback((Fl_Callback*)cb_sel_WKFSK_monitor); sel_WKFSK_monitor->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_monitor->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_monitor); sel_WKFSK_monitor->end(); } // Fl_ListBox* sel_WKFSK_monitor o->end(); } // Fl_Group* o tab_WKFSK->end(); } // Fl_Group* tab_WKFSK tabsRTTY->end(); } // Fl_Tabs* tabsRTTY tabRTTY->end(); } // Fl_Group* tabRTTY { tabTHOR = new Fl_Group(0, 50, 600, 340, _("Thor")); tabTHOR->hide(); { Fl_Group* o = new Fl_Group(55, 78, 490, 270); o->box(FL_ENGRAVED_FRAME); { txtTHORSecondary = new Fl_Input2(84, 105, 430, 40, _("Secondary Text")); txtTHORSecondary->tooltip(_("Text to send during keyboard idle times")); txtTHORSecondary->type(4); txtTHORSecondary->box(FL_DOWN_BOX); txtTHORSecondary->color(FL_BACKGROUND2_COLOR); txtTHORSecondary->selection_color(FL_SELECTION_COLOR); txtTHORSecondary->labeltype(FL_NORMAL_LABEL); txtTHORSecondary->labelfont(0); txtTHORSecondary->labelsize(14); txtTHORSecondary->labelcolor(FL_FOREGROUND_COLOR); txtTHORSecondary->callback((Fl_Callback*)cb_txtTHORSecondary); txtTHORSecondary->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtTHORSecondary->when(FL_WHEN_CHANGED); txtTHORSecondary->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtTHORSecondary { Fl_Check_Button* o = valTHOR_FILTER = new Fl_Check_Button(84, 159, 80, 20, _("Filtering")); valTHOR_FILTER->tooltip(_("Enable DSP prior to decoder")); valTHOR_FILTER->down_box(FL_DOWN_BOX); valTHOR_FILTER->value(1); valTHOR_FILTER->callback((Fl_Callback*)cb_valTHOR_FILTER); o->value(progdefaults.THOR_FILTER); } // Fl_Check_Button* valTHOR_FILTER { Fl_Counter2* o = valTHOR_BW = new Fl_Counter2(229, 159, 63, 20, _("Filter bandwidth factor")); valTHOR_BW->tooltip(_("Filter bandwidth relative to signal width")); valTHOR_BW->type(1); valTHOR_BW->box(FL_UP_BOX); valTHOR_BW->color(FL_BACKGROUND_COLOR); valTHOR_BW->selection_color(FL_INACTIVE_COLOR); valTHOR_BW->labeltype(FL_NORMAL_LABEL); valTHOR_BW->labelfont(0); valTHOR_BW->labelsize(14); valTHOR_BW->labelcolor(FL_FOREGROUND_COLOR); valTHOR_BW->minimum(1); valTHOR_BW->maximum(2); valTHOR_BW->value(1.5); valTHOR_BW->callback((Fl_Callback*)cb_valTHOR_BW); valTHOR_BW->align(Fl_Align(FL_ALIGN_RIGHT)); valTHOR_BW->when(FL_WHEN_CHANGED); o->value(progdefaults.THOR_BW); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valTHOR_BW { Fl_Value_Slider2* o = valThorCWI = new Fl_Value_Slider2(84, 212, 260, 20, _("CWI threshold")); valThorCWI->tooltip(_("CWI detection and suppression")); valThorCWI->type(1); valThorCWI->box(FL_DOWN_BOX); valThorCWI->color(FL_BACKGROUND_COLOR); valThorCWI->selection_color(FL_BACKGROUND_COLOR); valThorCWI->labeltype(FL_NORMAL_LABEL); valThorCWI->labelfont(0); valThorCWI->labelsize(14); valThorCWI->labelcolor(FL_FOREGROUND_COLOR); valThorCWI->textsize(14); valThorCWI->callback((Fl_Callback*)cb_valThorCWI); valThorCWI->align(Fl_Align(FL_ALIGN_TOP)); valThorCWI->when(FL_WHEN_CHANGED); o->value(progdefaults.ThorCWI); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valThorCWI { Fl_Check_Button* o = valTHOR_PREAMBLE = new Fl_Check_Button(84, 254, 200, 20, _("Preamble Detection")); valTHOR_PREAMBLE->tooltip(_("Detect the THOR preamble\nClear the Rx pipeline")); valTHOR_PREAMBLE->down_box(FL_DOWN_BOX); valTHOR_PREAMBLE->callback((Fl_Callback*)cb_valTHOR_PREAMBLE); o->value(progdefaults.THOR_PREAMBLE); } // Fl_Check_Button* valTHOR_PREAMBLE { Fl_Check_Button* o = valTHOR_SOFTSYMBOLS = new Fl_Check_Button(84, 284, 190, 20, _("Soft-symbol decoding")); valTHOR_SOFTSYMBOLS->tooltip(_("Use soft-decision decoding for symbol detection\nAssists soft-bit decoding")); valTHOR_SOFTSYMBOLS->down_box(FL_DOWN_BOX); valTHOR_SOFTSYMBOLS->callback((Fl_Callback*)cb_valTHOR_SOFTSYMBOLS); o->value(progdefaults.THOR_SOFTSYMBOLS); } // Fl_Check_Button* valTHOR_SOFTSYMBOLS { Fl_Check_Button* o = valTHOR_SOFTBITS = new Fl_Check_Button(84, 314, 170, 20, _("Soft-bit decoding")); valTHOR_SOFTBITS->tooltip(_("Use soft-bit viterbi decoding for better Forward Error Correction\nWorks best\ with soft-symbol decoding enabled")); valTHOR_SOFTBITS->down_box(FL_DOWN_BOX); valTHOR_SOFTBITS->callback((Fl_Callback*)cb_valTHOR_SOFTBITS); o->value(progdefaults.THOR_SOFTBITS); } // Fl_Check_Button* valTHOR_SOFTBITS { Fl_Counter2* o = valTHOR_PATHS = new Fl_Counter2(431, 303, 75, 21, _("Paths (hidden)")); valTHOR_PATHS->type(1); valTHOR_PATHS->box(FL_UP_BOX); valTHOR_PATHS->color(FL_BACKGROUND_COLOR); valTHOR_PATHS->selection_color(FL_INACTIVE_COLOR); valTHOR_PATHS->labeltype(FL_NORMAL_LABEL); valTHOR_PATHS->labelfont(0); valTHOR_PATHS->labelsize(14); valTHOR_PATHS->labelcolor(FL_FOREGROUND_COLOR); valTHOR_PATHS->minimum(4); valTHOR_PATHS->maximum(8); valTHOR_PATHS->step(1); valTHOR_PATHS->value(5); valTHOR_PATHS->callback((Fl_Callback*)cb_valTHOR_PATHS); valTHOR_PATHS->align(Fl_Align(FL_ALIGN_TOP)); valTHOR_PATHS->when(FL_WHEN_CHANGED); o->value(progdefaults.THOR_PATHS); o->labelsize(FL_NORMAL_SIZE); o->hide(); } // Fl_Counter2* valTHOR_PATHS o->end(); } // Fl_Group* o tabTHOR->end(); } // Fl_Group* tabTHOR { tabOther = new Fl_Group(0, 50, 600, 340, _("Other")); tabOther->hide(); { tabsOther = new Fl_Tabs(0, 50, 600, 340); { tabNavtex = new Fl_Group(0, 75, 600, 315, _("Nav")); tabNavtex->hide(); { Fl_Check_Button* o = btnNvtxAdifLog = new Fl_Check_Button(181, 109, 235, 30, _("Log Navtex messages to Adif file")); btnNvtxAdifLog->down_box(FL_DOWN_BOX); btnNvtxAdifLog->callback((Fl_Callback*)cb_btnNvtxAdifLog); o->value(progdefaults.NVTX_AdifLog); } // Fl_Check_Button* btnNvtxAdifLog { Fl_Check_Button* o = btnNvtxKmlLog = new Fl_Check_Button(180, 155, 270, 30, _("Log Navtex messages to KML")); btnNvtxKmlLog->tooltip(_("Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)")); btnNvtxKmlLog->down_box(FL_DOWN_BOX); btnNvtxKmlLog->callback((Fl_Callback*)cb_btnNvtxKmlLog); o->value(progdefaults.NVTX_KmlLog); } // Fl_Check_Button* btnNvtxKmlLog tabNavtex->end(); } // Fl_Group* tabNavtex { tabWefax = new Fl_Group(0, 75, 600, 315, _("WFx")); { Fl_Group* o = new Fl_Group(2, 79, 598, 285); { Fl_Check_Button* o = btnWefaxAdifLog = new Fl_Check_Button(99, 155, 235, 30, _("Log Wefax messages to Adif file")); btnWefaxAdifLog->tooltip(_("Sent and received faxes are logged to Adif file.")); btnWefaxAdifLog->down_box(FL_DOWN_BOX); btnWefaxAdifLog->callback((Fl_Callback*)cb_btnWefaxAdifLog); o->value(progdefaults.WEFAX_AdifLog); } // Fl_Check_Button* btnWefaxAdifLog { Fl_Check_Button* o = btnWefaxEmbeddedGui = new Fl_Check_Button(99, 92, 235, 30, _("Embedded Wefax Gui")); btnWefaxEmbeddedGui->tooltip(_("Display tx and rx in main fldigi window.\nChange requires restart of fldigi")); btnWefaxEmbeddedGui->down_box(FL_DOWN_BOX); btnWefaxEmbeddedGui->callback((Fl_Callback*)cb_btnWefaxEmbeddedGui); o->value(progdefaults.WEFAX_EmbeddedGui); } // Fl_Check_Button* btnWefaxEmbeddedGui { Fl_Value_Input2* o = btnWefaxShift = new Fl_Value_Input2(99, 195, 80, 20, _("Frequency shift (800 Hz)")); btnWefaxShift->tooltip(_("Default 800 Hz. Deutsche Wetterdienst 850Hz")); btnWefaxShift->type(2); btnWefaxShift->box(FL_DOWN_BOX); btnWefaxShift->color(FL_BACKGROUND2_COLOR); btnWefaxShift->selection_color(FL_SELECTION_COLOR); btnWefaxShift->labeltype(FL_NORMAL_LABEL); btnWefaxShift->labelfont(0); btnWefaxShift->labelsize(14); btnWefaxShift->labelcolor(FL_FOREGROUND_COLOR); btnWefaxShift->callback((Fl_Callback*)cb_btnWefaxShift); btnWefaxShift->align(Fl_Align(FL_ALIGN_RIGHT)); btnWefaxShift->when(FL_WHEN_RELEASE); o->value(progdefaults.WEFAX_Shift); } // Fl_Value_Input2* btnWefaxShift { Fl_Value_Input2* o = btnWefaxMaxRows = new Fl_Value_Input2(99, 235, 85, 20, _("Received fax maximum rows number (5000)")); btnWefaxMaxRows->tooltip(_("Maximum row number for a received fax image.")); btnWefaxMaxRows->type(2); btnWefaxMaxRows->box(FL_DOWN_BOX); btnWefaxMaxRows->color(FL_BACKGROUND2_COLOR); btnWefaxMaxRows->selection_color(FL_SELECTION_COLOR); btnWefaxMaxRows->labeltype(FL_NORMAL_LABEL); btnWefaxMaxRows->labelfont(0); btnWefaxMaxRows->labelsize(14); btnWefaxMaxRows->labelcolor(FL_FOREGROUND_COLOR); btnWefaxMaxRows->callback((Fl_Callback*)cb_btnWefaxMaxRows); btnWefaxMaxRows->align(Fl_Align(FL_ALIGN_RIGHT)); btnWefaxMaxRows->when(FL_WHEN_RELEASE); o->value(progdefaults.WEFAX_MaxRows); } // Fl_Value_Input2* btnWefaxMaxRows { Fl_Input* o = btnWefaxSaveDir = new Fl_Input(99, 285, 310, 20, _("Fax images destination directory")); btnWefaxSaveDir->callback((Fl_Callback*)cb_btnWefaxSaveDir); btnWefaxSaveDir->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.wefax_save_dir.c_str()); } // Fl_Input* btnWefaxSaveDir { btnSelectFaxDestDir = new Fl_Button(429, 285, 80, 20, _("Directory...")); btnSelectFaxDestDir->callback((Fl_Callback*)cb_btnSelectFaxDestDir); } // Fl_Button* btnSelectFaxDestDir { Fl_Check_Button* o = btnWefaxHideTx = new Fl_Check_Button(99, 125, 235, 30, _("Hide Transmission window")); btnWefaxHideTx->tooltip(_("Hide transmission window by default.")); btnWefaxHideTx->down_box(FL_DOWN_BOX); btnWefaxHideTx->callback((Fl_Callback*)cb_btnWefaxHideTx); o->value(progdefaults.WEFAX_HideTx); } // Fl_Check_Button* btnWefaxHideTx { Fl_Check_Button* o = btnWefaxSaveMonochrome = new Fl_Check_Button(99, 315, 235, 30, _("Save image as monochrome file")); btnWefaxSaveMonochrome->tooltip(_("Save the fax image as a gray-level PNG file.")); btnWefaxSaveMonochrome->down_box(FL_DOWN_BOX); btnWefaxSaveMonochrome->callback((Fl_Callback*)cb_btnWefaxSaveMonochrome); o->value(progdefaults.WEFAX_SaveMonochrome); } // Fl_Check_Button* btnWefaxSaveMonochrome o->end(); } // Fl_Group* o tabWefax->end(); } // Fl_Group* tabWefax tabsOther->end(); } // Fl_Tabs* tabsOther tabOther->end(); } // Fl_Group* tabOther tabsModems->end(); } // Fl_Tabs* tabsModems tabModems->end(); } // Fl_Group* tabModems { tabRig = new Fl_Group(0, 25, 600, 365, _("Rig")); tabRig->hide(); { tabsRig = new Fl_Tabs(0, 25, 600, 365); tabsRig->selection_color(FL_LIGHT1); { tabFLRIG = new Fl_Group(0, 50, 600, 340, _("flrig")); { Fl_Group* o = new Fl_Group(10, 210, 580, 90, _("\"Disable PTT keys modem if multiple instances of fldigi (client)\nare connec\ ted to a single flrig (server).")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_flrig_keys_modem = new Fl_Check_Button(240, 258, 183, 20, _("Flrig PTT keys modem")); chk_flrig_keys_modem->tooltip(_("\" \"")); chk_flrig_keys_modem->down_box(FL_DOWN_BOX); chk_flrig_keys_modem->callback((Fl_Callback*)cb_chk_flrig_keys_modem); o->value(progdefaults.flrig_keys_modem); } // Fl_Check_Button* chk_flrig_keys_modem o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(10, 125, 580, 81, _("flrig xmlrpc server parameters\nthese controls are mirrored on the IO configu\ ration tab")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnDefault_flrig_ip_mirror = new Fl_Button(414, 171, 73, 24, _("Default")); btnDefault_flrig_ip_mirror->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_flrig_ip_mirror->callback((Fl_Callback*)cb_btnDefault_flrig_ip_mirror); } // Fl_Button* btnDefault_flrig_ip_mirror { Fl_Input2* o = txt_flrig_ip_address_mirror = new Fl_Input2(45, 171, 230, 24, _("Addr")); txt_flrig_ip_address_mirror->tooltip(_("IP Address for flrig interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: \ i.e. localhost")); txt_flrig_ip_address_mirror->box(FL_DOWN_BOX); txt_flrig_ip_address_mirror->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_address_mirror->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_address_mirror->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_address_mirror->labelfont(0); txt_flrig_ip_address_mirror->labelsize(14); txt_flrig_ip_address_mirror->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_address_mirror->callback((Fl_Callback*)cb_txt_flrig_ip_address_mirror); txt_flrig_ip_address_mirror->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_address_mirror->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_address.c_str()); } // Fl_Input2* txt_flrig_ip_address_mirror { Fl_Input2* o = txt_flrig_ip_port_mirror = new Fl_Input2(319, 171, 55, 24, _("Port")); txt_flrig_ip_port_mirror->tooltip(_("IP Address Port Number")); txt_flrig_ip_port_mirror->box(FL_DOWN_BOX); txt_flrig_ip_port_mirror->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_port_mirror->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_port_mirror->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_port_mirror->labelfont(0); txt_flrig_ip_port_mirror->labelsize(14); txt_flrig_ip_port_mirror->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_port_mirror->callback((Fl_Callback*)cb_txt_flrig_ip_port_mirror); txt_flrig_ip_port_mirror->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_port_mirror->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_port.c_str()); } // Fl_Input2* txt_flrig_ip_port_mirror { btn_reconnect_flrig_server_mirror = new Fl_Button(494, 171, 82, 24, _("Reconnect")); btn_reconnect_flrig_server_mirror->tooltip(_("Press only if you change the address/port")); btn_reconnect_flrig_server_mirror->callback((Fl_Callback*)cb_btn_reconnect_flrig_server_mirror); } // Fl_Button* btn_reconnect_flrig_server_mirror o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(10, 68, 580, 52, _("flrig is the preferred method of tranceiver control")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_fldigi_client_to_fldigi = new Fl_Check_Button(35, 95, 70, 15, _("Enable flrig xcvr control with fldigi as client")); btn_fldigi_client_to_fldigi->tooltip(_("Disable if flrig not used.")); btn_fldigi_client_to_fldigi->down_box(FL_DOWN_BOX); btn_fldigi_client_to_fldigi->callback((Fl_Callback*)cb_btn_fldigi_client_to_fldigi); o->value(progdefaults.fldigi_client_to_flrig); } // Fl_Check_Button* btn_fldigi_client_to_fldigi o->end(); } // Fl_Group* o tabFLRIG->end(); } // Fl_Group* tabFLRIG { Fl_Group* o = new Fl_Group(0, 50, 600, 340, _("RigCAT")); o->hide(); { chkUSERIGCAT = new Fl_Check_Button(245, 60, 110, 20, _("Use RigCAT")); chkUSERIGCAT->tooltip(_("RigCAT used for rig control")); chkUSERIGCAT->down_box(FL_DOWN_BOX); chkUSERIGCAT->callback((Fl_Callback*)cb_chkUSERIGCAT); } // Fl_Check_Button* chkUSERIGCAT { grpRigCAT = new Fl_Group(55, 83, 490, 279); grpRigCAT->box(FL_ENGRAVED_FRAME); { Fl_Output* o = txtXmlRigFilename = new Fl_Output(65, 107, 130, 22, _("Rig description file:")); txtXmlRigFilename->tooltip(_("Use Open to select descriptor file")); txtXmlRigFilename->color(FL_LIGHT2); txtXmlRigFilename->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(fl_filename_name(progdefaults.XmlRigFilename.c_str())); } // Fl_Output* txtXmlRigFilename { btnSelectRigXmlFile = new Fl_Button(198, 107, 60, 22, _("Open...")); btnSelectRigXmlFile->tooltip(_("Select rig descriptor file")); btnSelectRigXmlFile->callback((Fl_Callback*)cb_btnSelectRigXmlFile); } // Fl_Button* btnSelectRigXmlFile { Fl_ComboBox* o = inpXmlRigDevice = new Fl_ComboBox(391, 107, 144, 22, _("Device:")); inpXmlRigDevice->box(FL_DOWN_BOX); inpXmlRigDevice->color(FL_BACKGROUND2_COLOR); inpXmlRigDevice->selection_color(FL_BACKGROUND_COLOR); inpXmlRigDevice->labeltype(FL_NORMAL_LABEL); inpXmlRigDevice->labelfont(0); inpXmlRigDevice->labelsize(14); inpXmlRigDevice->labelcolor(FL_FOREGROUND_COLOR); inpXmlRigDevice->callback((Fl_Callback*)cb_inpXmlRigDevice); inpXmlRigDevice->align(Fl_Align(FL_ALIGN_LEFT)); inpXmlRigDevice->when(FL_WHEN_RELEASE); o->value(progdefaults.XmlRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE); inpXmlRigDevice->end(); } // Fl_ComboBox* inpXmlRigDevice { Fl_Value_Input2* o = cntRigCatRetries = new Fl_Value_Input2(80, 150, 60, 22, _("Retries")); cntRigCatRetries->tooltip(_("# retries before giving up")); cntRigCatRetries->box(FL_DOWN_BOX); cntRigCatRetries->color(FL_BACKGROUND2_COLOR); cntRigCatRetries->selection_color(FL_SELECTION_COLOR); cntRigCatRetries->labeltype(FL_NORMAL_LABEL); cntRigCatRetries->labelfont(0); cntRigCatRetries->labelsize(14); cntRigCatRetries->labelcolor(FL_FOREGROUND_COLOR); cntRigCatRetries->maximum(1000); cntRigCatRetries->step(1); cntRigCatRetries->callback((Fl_Callback*)cb_cntRigCatRetries); cntRigCatRetries->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatRetries->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatRetries); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatRetries { Fl_Value_Input2* o = cntRigCatTimeout = new Fl_Value_Input2(210, 150, 60, 22, _("Retry interval (ms)")); cntRigCatTimeout->tooltip(_("Time between retires in msec")); cntRigCatTimeout->box(FL_DOWN_BOX); cntRigCatTimeout->color(FL_BACKGROUND2_COLOR); cntRigCatTimeout->selection_color(FL_SELECTION_COLOR); cntRigCatTimeout->labeltype(FL_NORMAL_LABEL); cntRigCatTimeout->labelfont(0); cntRigCatTimeout->labelsize(14); cntRigCatTimeout->labelcolor(FL_FOREGROUND_COLOR); cntRigCatTimeout->maximum(10000); cntRigCatTimeout->step(1); cntRigCatTimeout->callback((Fl_Callback*)cb_cntRigCatTimeout); cntRigCatTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatTimeout->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatTimeout { Fl_Value_Input2* o = cntRigCatWait = new Fl_Value_Input2(80, 190, 60, 22, _("Write delay (ms)")); cntRigCatWait->tooltip(_("Wait for response to subsequent command")); cntRigCatWait->box(FL_DOWN_BOX); cntRigCatWait->color(FL_BACKGROUND2_COLOR); cntRigCatWait->selection_color(FL_SELECTION_COLOR); cntRigCatWait->labeltype(FL_NORMAL_LABEL); cntRigCatWait->labelfont(0); cntRigCatWait->labelsize(14); cntRigCatWait->labelcolor(FL_FOREGROUND_COLOR); cntRigCatWait->maximum(10000); cntRigCatWait->step(1); cntRigCatWait->callback((Fl_Callback*)cb_cntRigCatWait); cntRigCatWait->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatWait->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatWait); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatWait { Fl_ListBox* o = listbox_xml_rig_baudrate = new Fl_ListBox(436, 150, 99, 22, _("Baud rate:")); listbox_xml_rig_baudrate->box(FL_DOWN_BOX); listbox_xml_rig_baudrate->color(FL_BACKGROUND2_COLOR); listbox_xml_rig_baudrate->selection_color(FL_BACKGROUND_COLOR); listbox_xml_rig_baudrate->labeltype(FL_NORMAL_LABEL); listbox_xml_rig_baudrate->labelfont(0); listbox_xml_rig_baudrate->labelsize(14); listbox_xml_rig_baudrate->labelcolor(FL_FOREGROUND_COLOR); listbox_xml_rig_baudrate->callback((Fl_Callback*)cb_listbox_xml_rig_baudrate); listbox_xml_rig_baudrate->align(Fl_Align(FL_ALIGN_LEFT)); listbox_xml_rig_baudrate->when(FL_WHEN_RELEASE); o->add(szBaudRates); o->index(progdefaults.XmlRigBaudrate); o->labelsize(FL_NORMAL_SIZE); listbox_xml_rig_baudrate->end(); } // Fl_ListBox* listbox_xml_rig_baudrate { Fl_Counter2* o = valRigCatStopbits = new Fl_Counter2(438, 184, 95, 21, _("Stopbits")); valRigCatStopbits->type(1); valRigCatStopbits->box(FL_UP_BOX); valRigCatStopbits->color(FL_BACKGROUND_COLOR); valRigCatStopbits->selection_color(FL_INACTIVE_COLOR); valRigCatStopbits->labeltype(FL_NORMAL_LABEL); valRigCatStopbits->labelfont(0); valRigCatStopbits->labelsize(14); valRigCatStopbits->labelcolor(FL_FOREGROUND_COLOR); valRigCatStopbits->minimum(1); valRigCatStopbits->maximum(2); valRigCatStopbits->step(1); valRigCatStopbits->value(1); valRigCatStopbits->callback((Fl_Callback*)cb_valRigCatStopbits); valRigCatStopbits->align(Fl_Align(FL_ALIGN_LEFT)); valRigCatStopbits->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatStopbits); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valRigCatStopbits { btnInitRIGCAT = new Fl_Button(415, 321, 113, 24, _("Initialize")); btnInitRIGCAT->tooltip(_("Initialize RigCAT interface")); btnInitRIGCAT->callback((Fl_Callback*)cb_btnInitRIGCAT); } // Fl_Button* btnInitRIGCAT { Fl_Check_Button* o = btnRigCatEcho = new Fl_Check_Button(100, 216, 192, 22, _("Commands are echoed")); btnRigCatEcho->tooltip(_("Rig or interface echos serial data")); btnRigCatEcho->down_box(FL_DOWN_BOX); btnRigCatEcho->callback((Fl_Callback*)cb_btnRigCatEcho); o->value(progdefaults.RigCatECHO); } // Fl_Check_Button* btnRigCatEcho { Fl_Round_Button* o = btnRigCatCMDptt = new Fl_Round_Button(306, 217, 207, 20, _("CAT command for PTT")); btnRigCatCMDptt->tooltip(_("PTT is a CAT command (not hardware)")); btnRigCatCMDptt->down_box(FL_DOWN_BOX); btnRigCatCMDptt->selection_color((Fl_Color)1); btnRigCatCMDptt->callback((Fl_Callback*)cb_btnRigCatCMDptt); o->value(progdefaults.RigCatCMDptt); } // Fl_Round_Button* btnRigCatCMDptt { Fl_Round_Button* o = btnRigCatRTSptt = new Fl_Round_Button(100, 246, 160, 20, _("Toggle RTS for PTT")); btnRigCatRTSptt->tooltip(_("RTS is ptt line")); btnRigCatRTSptt->down_box(FL_DOWN_BOX); btnRigCatRTSptt->callback((Fl_Callback*)cb_btnRigCatRTSptt); o->value(progdefaults.RigCatRTSptt); } // Fl_Round_Button* btnRigCatRTSptt { Fl_Round_Button* o = btnRigCatDTRptt = new Fl_Round_Button(306, 244, 160, 20, _("Toggle DTR for PTT")); btnRigCatDTRptt->tooltip(_("DTR is ptt line")); btnRigCatDTRptt->down_box(FL_DOWN_BOX); btnRigCatDTRptt->callback((Fl_Callback*)cb_btnRigCatDTRptt); o->value(progdefaults.RigCatDTRptt); } // Fl_Round_Button* btnRigCatDTRptt { Fl_Check_Button* o = btnRigCatRTSplus = new Fl_Check_Button(100, 275, 100, 20, _("RTS +12 v")); btnRigCatRTSplus->tooltip(_("Initial state of RTS")); btnRigCatRTSplus->down_box(FL_DOWN_BOX); btnRigCatRTSplus->callback((Fl_Callback*)cb_btnRigCatRTSplus); o->value(progdefaults.RigCatRTSplus); } // Fl_Check_Button* btnRigCatRTSplus { Fl_Check_Button* o = btnRigCatDTRplus = new Fl_Check_Button(306, 272, 100, 20, _("DTR +12 v")); btnRigCatDTRplus->tooltip(_("Initial state of DTR")); btnRigCatDTRplus->down_box(FL_DOWN_BOX); btnRigCatDTRplus->callback((Fl_Callback*)cb_btnRigCatDTRplus); o->value(progdefaults.RigCatDTRplus); } // Fl_Check_Button* btnRigCatDTRplus { Fl_Check_Button* o = chkRigCatRTSCTSflow = new Fl_Check_Button(100, 303, 170, 20, _("RTS/CTS flow control")); chkRigCatRTSCTSflow->tooltip(_("Rig uses RTS/CTS handshake")); chkRigCatRTSCTSflow->down_box(FL_DOWN_BOX); chkRigCatRTSCTSflow->callback((Fl_Callback*)cb_chkRigCatRTSCTSflow); o->value(progdefaults.RigCatRTSCTSflow); } // Fl_Check_Button* chkRigCatRTSCTSflow { Fl_Check_Button* o = chk_restore_tio = new Fl_Check_Button(100, 332, 205, 20, _("Restore UART Settings on Close")); chk_restore_tio->tooltip(_("Restore the serial (COM) port settings")); chk_restore_tio->down_box(FL_DOWN_BOX); chk_restore_tio->callback((Fl_Callback*)cb_chk_restore_tio); o->value(progdefaults.RigCatRestoreTIO); } // Fl_Check_Button* chk_restore_tio { Fl_Check_Button* o = chkRigCatVSP = new Fl_Check_Button(306, 300, 100, 25, _("VSP Enable")); chkRigCatVSP->tooltip(_("Virtual Serial Port Emulator - suppress WARNINGS")); chkRigCatVSP->down_box(FL_DOWN_BOX); chkRigCatVSP->callback((Fl_Callback*)cb_chkRigCatVSP); o->value(progdefaults.RigCatVSP); } // Fl_Check_Button* chkRigCatVSP { Fl_Value_Input2* o = cntRigCatInitDelay = new Fl_Value_Input2(210, 190, 75, 22, _("Init delay (ms)")); cntRigCatInitDelay->tooltip(_("Wait for response to first CAT command")); cntRigCatInitDelay->box(FL_DOWN_BOX); cntRigCatInitDelay->color(FL_BACKGROUND2_COLOR); cntRigCatInitDelay->selection_color(FL_SELECTION_COLOR); cntRigCatInitDelay->labeltype(FL_NORMAL_LABEL); cntRigCatInitDelay->labelfont(0); cntRigCatInitDelay->labelsize(14); cntRigCatInitDelay->labelcolor(FL_FOREGROUND_COLOR); cntRigCatInitDelay->maximum(10000); cntRigCatInitDelay->step(1); cntRigCatInitDelay->callback((Fl_Callback*)cb_cntRigCatInitDelay); cntRigCatInitDelay->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatInitDelay->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatInitDelay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatInitDelay grpRigCAT->end(); } // Fl_Group* grpRigCAT o->end(); } // Fl_Group* o { tabHamlib = new Fl_Group(0, 50, 600, 340, _("Hamlib")); tabHamlib->hide(); { chkUSEHAMLIB = new Fl_Check_Button(250, 59, 100, 20, _("Use Hamlib")); chkUSEHAMLIB->tooltip(_("Hamlib used for rig control")); chkUSEHAMLIB->down_box(FL_DOWN_BOX); chkUSEHAMLIB->callback((Fl_Callback*)cb_chkUSEHAMLIB); } // Fl_Check_Button* chkUSEHAMLIB { grpHamlib = new Fl_Group(5, 88, 585, 294); grpHamlib->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = cboHamlibRig = new Fl_ListBox(41, 98, 250, 22, _("Rig:")); cboHamlibRig->box(FL_DOWN_BOX); cboHamlibRig->color(FL_BACKGROUND2_COLOR); cboHamlibRig->selection_color(FL_BACKGROUND_COLOR); cboHamlibRig->labeltype(FL_NORMAL_LABEL); cboHamlibRig->labelfont(0); cboHamlibRig->labelsize(14); cboHamlibRig->labelcolor(FL_FOREGROUND_COLOR); cboHamlibRig->callback((Fl_Callback*)cb_cboHamlibRig); cboHamlibRig->align(Fl_Align(FL_ALIGN_LEFT)); cboHamlibRig->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); cboHamlibRig->end(); } // Fl_ListBox* cboHamlibRig { Fl_ComboBox* o = inpRIGdev = new Fl_ComboBox(355, 98, 220, 22, _("Device:")); inpRIGdev->box(FL_DOWN_BOX); inpRIGdev->color(FL_BACKGROUND2_COLOR); inpRIGdev->selection_color(FL_BACKGROUND_COLOR); inpRIGdev->labeltype(FL_NORMAL_LABEL); inpRIGdev->labelfont(0); inpRIGdev->labelsize(14); inpRIGdev->labelcolor(FL_FOREGROUND_COLOR); inpRIGdev->callback((Fl_Callback*)cb_inpRIGdev); inpRIGdev->align(Fl_Align(FL_ALIGN_LEFT)); inpRIGdev->when(FL_WHEN_RELEASE); o->value(progdefaults.HamRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE); inpRIGdev->end(); } // Fl_ComboBox* inpRIGdev { Fl_Value_Input2* o = cntHamlibRetries = new Fl_Value_Input2(40, 138, 70, 24, _("Retries")); cntHamlibRetries->tooltip(_("# times to resend command before giving up")); cntHamlibRetries->box(FL_DOWN_BOX); cntHamlibRetries->color(FL_BACKGROUND2_COLOR); cntHamlibRetries->selection_color(FL_SELECTION_COLOR); cntHamlibRetries->labeltype(FL_NORMAL_LABEL); cntHamlibRetries->labelfont(0); cntHamlibRetries->labelsize(14); cntHamlibRetries->labelcolor(FL_FOREGROUND_COLOR); cntHamlibRetries->maximum(1000); cntHamlibRetries->step(1); cntHamlibRetries->callback((Fl_Callback*)cb_cntHamlibRetries); cntHamlibRetries->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibRetries->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibRetries); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibRetries { Fl_Value_Input2* o = cntHamlibTimeout = new Fl_Value_Input2(180, 138, 70, 24, _("Retry Interval (msec)")); cntHamlibTimeout->tooltip(_("Msec\'s between retries")); cntHamlibTimeout->box(FL_DOWN_BOX); cntHamlibTimeout->color(FL_BACKGROUND2_COLOR); cntHamlibTimeout->selection_color(FL_SELECTION_COLOR); cntHamlibTimeout->labeltype(FL_NORMAL_LABEL); cntHamlibTimeout->labelfont(0); cntHamlibTimeout->labelsize(14); cntHamlibTimeout->labelcolor(FL_FOREGROUND_COLOR); cntHamlibTimeout->maximum(10000); cntHamlibTimeout->step(1); cntHamlibTimeout->callback((Fl_Callback*)cb_cntHamlibTimeout); cntHamlibTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibTimeout->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibTimeout { Fl_Value_Input2* o = cntHamlibWriteDelay = new Fl_Value_Input2(40, 181, 70, 24, _("Write delay (msec)")); cntHamlibWriteDelay->tooltip(_("Msec\'s between sequential commands")); cntHamlibWriteDelay->box(FL_DOWN_BOX); cntHamlibWriteDelay->color(FL_BACKGROUND2_COLOR); cntHamlibWriteDelay->selection_color(FL_SELECTION_COLOR); cntHamlibWriteDelay->labeltype(FL_NORMAL_LABEL); cntHamlibWriteDelay->labelfont(0); cntHamlibWriteDelay->labelsize(14); cntHamlibWriteDelay->labelcolor(FL_FOREGROUND_COLOR); cntHamlibWriteDelay->maximum(10000); cntHamlibWriteDelay->step(1); cntHamlibWriteDelay->callback((Fl_Callback*)cb_cntHamlibWriteDelay); cntHamlibWriteDelay->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibWriteDelay->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibWriteDelay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibWriteDelay { Fl_Value_Input2* o = cntHamlibWait = new Fl_Value_Input2(180, 181, 70, 24, _("Post write delay (msec)")); cntHamlibWait->tooltip(_("Wait interval (msecs) before reading response")); cntHamlibWait->box(FL_DOWN_BOX); cntHamlibWait->color(FL_BACKGROUND2_COLOR); cntHamlibWait->selection_color(FL_SELECTION_COLOR); cntHamlibWait->labeltype(FL_NORMAL_LABEL); cntHamlibWait->labelfont(0); cntHamlibWait->labelsize(14); cntHamlibWait->labelcolor(FL_FOREGROUND_COLOR); cntHamlibWait->maximum(10000); cntHamlibWait->step(1); cntHamlibWait->callback((Fl_Callback*)cb_cntHamlibWait); cntHamlibWait->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibWait->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibWait); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibWait { Fl_ListBox* o = listbox_baudrate = new Fl_ListBox(476, 126, 99, 22, _("Baud rate:")); listbox_baudrate->box(FL_DOWN_BOX); listbox_baudrate->color(FL_BACKGROUND2_COLOR); listbox_baudrate->selection_color(FL_BACKGROUND_COLOR); listbox_baudrate->labeltype(FL_NORMAL_LABEL); listbox_baudrate->labelfont(0); listbox_baudrate->labelsize(14); listbox_baudrate->labelcolor(FL_FOREGROUND_COLOR); listbox_baudrate->callback((Fl_Callback*)cb_listbox_baudrate); listbox_baudrate->align(Fl_Align(FL_ALIGN_LEFT)); listbox_baudrate->when(FL_WHEN_RELEASE); o->add(szBaudRates); o->index(progdefaults.HamRigBaudrate); o->labelsize(FL_NORMAL_SIZE); listbox_baudrate->end(); } // Fl_ListBox* listbox_baudrate { Fl_Counter2* o = valHamRigStopbits = new Fl_Counter2(480, 154, 95, 21, _("Stopbits")); valHamRigStopbits->type(1); valHamRigStopbits->box(FL_UP_BOX); valHamRigStopbits->color(FL_BACKGROUND_COLOR); valHamRigStopbits->selection_color(FL_INACTIVE_COLOR); valHamRigStopbits->labeltype(FL_NORMAL_LABEL); valHamRigStopbits->labelfont(0); valHamRigStopbits->labelsize(14); valHamRigStopbits->labelcolor(FL_FOREGROUND_COLOR); valHamRigStopbits->minimum(1); valHamRigStopbits->maximum(2); valHamRigStopbits->step(1); valHamRigStopbits->value(1); valHamRigStopbits->callback((Fl_Callback*)cb_valHamRigStopbits); valHamRigStopbits->align(Fl_Align(FL_ALIGN_LEFT)); valHamRigStopbits->when(FL_WHEN_CHANGED); o->value(progdefaults.HamRigStopbits); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valHamRigStopbits { Fl_Counter2* o = valHamRigPollrate = new Fl_Counter2(480, 182, 95, 21, _("Polling Interval (msec)")); valHamRigPollrate->type(1); valHamRigPollrate->box(FL_UP_BOX); valHamRigPollrate->color(FL_BACKGROUND_COLOR); valHamRigPollrate->selection_color(FL_INACTIVE_COLOR); valHamRigPollrate->labeltype(FL_NORMAL_LABEL); valHamRigPollrate->labelfont(0); valHamRigPollrate->labelsize(14); valHamRigPollrate->labelcolor(FL_FOREGROUND_COLOR); valHamRigPollrate->minimum(100); valHamRigPollrate->maximum(2000); valHamRigPollrate->step(50); valHamRigPollrate->value(100); valHamRigPollrate->callback((Fl_Callback*)cb_valHamRigPollrate); valHamRigPollrate->align(Fl_Align(FL_ALIGN_LEFT)); valHamRigPollrate->when(FL_WHEN_CHANGED); o->value(progdefaults.HamRigPollrate); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valHamRigPollrate { Fl_Check_Button* o = btnHamlibCMDptt = new Fl_Check_Button(55, 229, 215, 20, _("PTT via Hamlib command")); btnHamlibCMDptt->tooltip(_("PTT using hamlib command")); btnHamlibCMDptt->down_box(FL_DOWN_BOX); btnHamlibCMDptt->callback((Fl_Callback*)cb_btnHamlibCMDptt); o->value(progdefaults.HamlibCMDptt); } // Fl_Check_Button* btnHamlibCMDptt { Fl_Check_Button* o = btnHamlibPTT_ON_DATA = new Fl_Check_Button(55, 254, 215, 20, _("Audio on Auxiliary Port")); btnHamlibPTT_ON_DATA->tooltip(_("PTT enables auxiliary audio source")); btnHamlibPTT_ON_DATA->down_box(FL_DOWN_BOX); btnHamlibPTT_ON_DATA->callback((Fl_Callback*)cb_btnHamlibPTT_ON_DATA); o->value(progdefaults.hamlib_ptt_on_data); } // Fl_Check_Button* btnHamlibPTT_ON_DATA { Fl_Check_Button* o = btnHamlibDTRplus = new Fl_Check_Button(55, 280, 90, 20, _("DTR +12")); btnHamlibDTRplus->tooltip(_("Initial state of DTR")); btnHamlibDTRplus->down_box(FL_DOWN_BOX); btnHamlibDTRplus->callback((Fl_Callback*)cb_btnHamlibDTRplus); o->value(progdefaults.HamlibDTRplus); } // Fl_Check_Button* btnHamlibDTRplus { Fl_Check_Button* o = chkHamlibRTSplus = new Fl_Check_Button(245, 280, 85, 20, _("RTS +12")); chkHamlibRTSplus->tooltip(_("Initial state of RTS")); chkHamlibRTSplus->down_box(FL_DOWN_BOX); chkHamlibRTSplus->callback((Fl_Callback*)cb_chkHamlibRTSplus); o->value(progdefaults.HamlibRTSplus); } // Fl_Check_Button* chkHamlibRTSplus { Fl_Check_Button* o = chkHamlibRTSCTSflow = new Fl_Check_Button(55, 306, 170, 20, _("RTS/CTS flow control")); chkHamlibRTSCTSflow->tooltip(_("Rig requires RTS/CTS flow control")); chkHamlibRTSCTSflow->down_box(FL_DOWN_BOX); chkHamlibRTSCTSflow->callback((Fl_Callback*)cb_chkHamlibRTSCTSflow); o->value(progdefaults.HamlibRTSCTSflow); if (o->value()) chkHamlibRTSplus->deactivate(); } // Fl_Check_Button* chkHamlibRTSCTSflow { Fl_Check_Button* o = chkHamlibXONXOFFflow = new Fl_Check_Button(245, 306, 185, 20, _("XON/XOFF flow control")); chkHamlibXONXOFFflow->tooltip(_("Rig requires Xon/Xoff flow control")); chkHamlibXONXOFFflow->down_box(FL_DOWN_BOX); chkHamlibXONXOFFflow->callback((Fl_Callback*)cb_chkHamlibXONXOFFflow); o->value(progdefaults.HamlibXONXOFFflow); } // Fl_Check_Button* chkHamlibXONXOFFflow { Fl_Check_Button* o = chk_hamlib_cw_is_lsb = new Fl_Check_Button(435, 280, 142, 20, _("CW is LSB mode")); chk_hamlib_cw_is_lsb->tooltip(_("Check if xcvr uses LSB for CW")); chk_hamlib_cw_is_lsb->down_box(FL_DOWN_BOX); chk_hamlib_cw_is_lsb->callback((Fl_Callback*)cb_chk_hamlib_cw_is_lsb); o->value(progdefaults.hamlib_cw_islsb); } // Fl_Check_Button* chk_hamlib_cw_is_lsb { Fl_Check_Button* o = chk_hamlib_rtty_is_usb = new Fl_Check_Button(435, 306, 152, 20, _("RTTY is USB mode")); chk_hamlib_rtty_is_usb->tooltip(_("Check if xcvr uses USB for RTTY")); chk_hamlib_rtty_is_usb->down_box(FL_DOWN_BOX); chk_hamlib_rtty_is_usb->callback((Fl_Callback*)cb_chk_hamlib_rtty_is_usb); o->value(progdefaults.hamlib_rtty_isusb); } // Fl_Check_Button* chk_hamlib_rtty_is_usb { Fl_Counter2* o = val_hamlib_mode_delay = new Fl_Counter2(480, 228, 95, 21, _("Mode delay (msec)")); val_hamlib_mode_delay->tooltip(_("Delay NN msec after executing mode change")); val_hamlib_mode_delay->type(1); val_hamlib_mode_delay->box(FL_UP_BOX); val_hamlib_mode_delay->color(FL_BACKGROUND_COLOR); val_hamlib_mode_delay->selection_color(FL_INACTIVE_COLOR); val_hamlib_mode_delay->labeltype(FL_NORMAL_LABEL); val_hamlib_mode_delay->labelfont(0); val_hamlib_mode_delay->labelsize(14); val_hamlib_mode_delay->labelcolor(FL_FOREGROUND_COLOR); val_hamlib_mode_delay->minimum(0); val_hamlib_mode_delay->maximum(2000); val_hamlib_mode_delay->step(100); val_hamlib_mode_delay->value(200); val_hamlib_mode_delay->callback((Fl_Callback*)cb_val_hamlib_mode_delay); val_hamlib_mode_delay->align(Fl_Align(FL_ALIGN_LEFT)); val_hamlib_mode_delay->when(FL_WHEN_CHANGED); o->value(progdefaults.hamlib_mode_delay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* val_hamlib_mode_delay { Fl_ListBox* o = listbox_sideband = new Fl_ListBox(431, 253, 144, 22, _("Sideband:")); listbox_sideband->box(FL_DOWN_BOX); listbox_sideband->color(FL_BACKGROUND2_COLOR); listbox_sideband->selection_color(FL_BACKGROUND_COLOR); listbox_sideband->labeltype(FL_NORMAL_LABEL); listbox_sideband->labelfont(0); listbox_sideband->labelsize(14); listbox_sideband->labelcolor(FL_FOREGROUND_COLOR); listbox_sideband->align(Fl_Align(FL_ALIGN_LEFT)); listbox_sideband->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_sideband->end(); } // Fl_ListBox* listbox_sideband { inpHamlibConfig = new Fl_Input2(30, 350, 460, 24, _("Advanced configuration:")); inpHamlibConfig->tooltip(_("Optional configuration\nin format: param=val ...")); inpHamlibConfig->box(FL_DOWN_BOX); inpHamlibConfig->color(FL_BACKGROUND2_COLOR); inpHamlibConfig->selection_color(FL_SELECTION_COLOR); inpHamlibConfig->labeltype(FL_NORMAL_LABEL); inpHamlibConfig->labelfont(0); inpHamlibConfig->labelsize(14); inpHamlibConfig->labelcolor(FL_FOREGROUND_COLOR); inpHamlibConfig->callback((Fl_Callback*)cb_inpHamlibConfig); inpHamlibConfig->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpHamlibConfig->when(FL_WHEN_RELEASE); inpHamlibConfig->value(progdefaults.HamConfig.c_str()); inpHamlibConfig->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpHamlibConfig { btnInitHAMLIB = new Fl_Button(495, 350, 80, 24, _("Initialize")); btnInitHAMLIB->tooltip(_("Initialize hamlib interface")); btnInitHAMLIB->callback((Fl_Callback*)cb_btnInitHAMLIB); } // Fl_Button* btnInitHAMLIB grpHamlib->end(); } // Fl_Group* grpHamlib tabHamlib->end(); } // Fl_Group* tabHamlib { Fl_Group* o = new Fl_Group(0, 50, 600, 340, _("Hardware PTT")); o->hide(); { Fl_Group* o = new Fl_Group(10, 57, 580, 38); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnPTTrightchannel = new Fl_Check_Button(74, 66, 250, 20, _("PTT tone on right audio channel ")); btnPTTrightchannel->tooltip(_("Can be used in lieu of or in addition to other PTT types")); btnPTTrightchannel->down_box(FL_DOWN_BOX); btnPTTrightchannel->callback((Fl_Callback*)cb_btnPTTrightchannel); o->value(progdefaults.PTTrightchannel); } // Fl_Check_Button* btnPTTrightchannel o->end(); } // Fl_Group* o { grpHWPTT = new Fl_Group(10, 97, 580, 184, _("h/w ptt device-pin")); grpHWPTT->box(FL_ENGRAVED_FRAME); grpHWPTT->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnTTYptt = new Fl_Round_Button(25, 124, 220, 20, _("Use separate serial port PTT")); btnTTYptt->down_box(FL_DOWN_BOX); btnTTYptt->selection_color((Fl_Color)1); btnTTYptt->callback((Fl_Callback*)cb_btnTTYptt); } // Fl_Round_Button* btnTTYptt { Fl_ComboBox* o = inpTTYdev = new Fl_ComboBox(18, 165, 350, 22, _("Device:")); inpTTYdev->box(FL_DOWN_BOX); inpTTYdev->color(FL_BACKGROUND2_COLOR); inpTTYdev->selection_color(FL_BACKGROUND_COLOR); inpTTYdev->labeltype(FL_NORMAL_LABEL); inpTTYdev->labelfont(0); inpTTYdev->labelsize(14); inpTTYdev->labelcolor(FL_FOREGROUND_COLOR); inpTTYdev->callback((Fl_Callback*)cb_inpTTYdev); inpTTYdev->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTTYdev->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); inpTTYdev->end(); } // Fl_ComboBox* inpTTYdev { Fl_Round_Button* o = btnSCU_17 = new Fl_Round_Button(260, 124, 236, 20, _("Port is second SCU-17 device")); btnSCU_17->tooltip(_("Driver requires stop bits to be ZERO!")); btnSCU_17->down_box(FL_DOWN_BOX); btnSCU_17->selection_color((Fl_Color)1); btnSCU_17->callback((Fl_Callback*)cb_btnSCU_17); o->value(progdefaults.SCU_17); } // Fl_Round_Button* btnSCU_17 { btnUsePPortPTT = new Fl_Round_Button(25, 213, 170, 20, _("Use parallel port PTT")); btnUsePPortPTT->down_box(FL_DOWN_BOX); btnUsePPortPTT->selection_color((Fl_Color)1); btnUsePPortPTT->callback((Fl_Callback*)cb_btnUsePPortPTT); } // Fl_Round_Button* btnUsePPortPTT { btnUseUHrouterPTT = new Fl_Round_Button(25, 245, 170, 20, _("Use uHRouter PTT")); btnUseUHrouterPTT->down_box(FL_DOWN_BOX); btnUseUHrouterPTT->selection_color((Fl_Color)1); btnUseUHrouterPTT->callback((Fl_Callback*)cb_btnUseUHrouterPTT); } // Fl_Round_Button* btnUseUHrouterPTT { btnRTSptt = new Fl_Round_Button(380, 153, 85, 20, _("Use RTS")); btnRTSptt->tooltip(_("RTS is PTT signal line")); btnRTSptt->down_box(FL_DOWN_BOX); btnRTSptt->callback((Fl_Callback*)cb_btnRTSptt); } // Fl_Round_Button* btnRTSptt { btnRTSplusV = new Fl_Round_Button(471, 153, 100, 20, _("RTS = +V")); btnRTSplusV->tooltip(_("Initial voltage on RTS")); btnRTSplusV->down_box(FL_DOWN_BOX); btnRTSplusV->callback((Fl_Callback*)cb_btnRTSplusV); } // Fl_Round_Button* btnRTSplusV { btnDTRptt = new Fl_Round_Button(380, 185, 85, 20, _("Use DTR")); btnDTRptt->tooltip(_("DTR is PTT signal line")); btnDTRptt->down_box(FL_DOWN_BOX); btnDTRptt->callback((Fl_Callback*)cb_btnDTRptt); } // Fl_Round_Button* btnDTRptt { btnDTRplusV = new Fl_Round_Button(471, 185, 100, 20, _("DTR = +V")); btnDTRplusV->tooltip(_("Initial voltage on DTR")); btnDTRplusV->down_box(FL_DOWN_BOX); btnDTRplusV->callback((Fl_Callback*)cb_btnDTRplusV); } // Fl_Round_Button* btnDTRplusV { btnInitHWPTT = new Fl_Button(450, 242, 113, 24, _("Initialize")); btnInitHWPTT->tooltip(_("Initialize the H/W PTT interface")); btnInitHWPTT->callback((Fl_Callback*)cb_btnInitHWPTT); } // Fl_Button* btnInitHWPTT grpHWPTT->end(); } // Fl_Group* grpHWPTT { grpPTTdelays = new Fl_Group(10, 284, 580, 91, _("PTT delays valid for all CAT/PTT types")); grpPTTdelays->box(FL_ENGRAVED_FRAME); grpPTTdelays->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(74, 311, 100, 21, _("Start of transmit PTT delay")); cntPTT_on_delay->tooltip(_("Delay NN msec before starting audio")); cntPTT_on_delay->minimum(0); cntPTT_on_delay->maximum(5000); cntPTT_on_delay->step(10); cntPTT_on_delay->callback((Fl_Callback*)cb_cntPTT_on_delay); cntPTT_on_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_on_delay); o->lstep(100); } // Fl_Counter* cntPTT_on_delay { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(74, 341, 100, 21, _("PTT end of transmit delay")); cntPTT_off_delay->tooltip(_("Delay NN msec before releasing PTT")); cntPTT_off_delay->minimum(0); cntPTT_off_delay->maximum(5000); cntPTT_off_delay->step(10); cntPTT_off_delay->callback((Fl_Callback*)cb_cntPTT_off_delay); cntPTT_off_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_off_delay); o->lstep(100); } // Fl_Counter* cntPTT_off_delay grpPTTdelays->end(); } // Fl_Group* grpPTTdelays o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 340, _("GPIO")); o->hide(); { Fl_Box* o = new Fl_Box(70, 96, 189, 17, _("BCM GPIO pin Value")); o->labelfont(4); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn_enable_gpio[0] = new Fl_Check_Button(60, 121, 125, 15, _("17 00 11")); btn_enable_gpio[0]->tooltip(_("Select pin number")); btn_enable_gpio[0]->down_box(FL_DOWN_BOX); btn_enable_gpio[0]->labelfont(4); btn_enable_gpio[0]->callback((Fl_Callback*)cb_btn_enable_gpio); o->value(progdefaults.enable_gpio & 0x01); } // Fl_Check_Button* btn_enable_gpio[0] { Fl_Check_Button* o = btn_enable_gpio[1] = new Fl_Check_Button(60, 150, 125, 15, _("18 01 12")); btn_enable_gpio[1]->tooltip(_("Select pin number")); btn_enable_gpio[1]->down_box(FL_DOWN_BOX); btn_enable_gpio[1]->labelfont(4); btn_enable_gpio[1]->callback((Fl_Callback*)cb_btn_enable_gpio1); o->value((progdefaults.enable_gpio >> 1) & 0x01); } // Fl_Check_Button* btn_enable_gpio[1] { Fl_Check_Button* o = btn_enable_gpio[2] = new Fl_Check_Button(60, 180, 125, 15, _("27 02 13")); btn_enable_gpio[2]->tooltip(_("Select pin number")); btn_enable_gpio[2]->down_box(FL_DOWN_BOX); btn_enable_gpio[2]->labelfont(4); btn_enable_gpio[2]->callback((Fl_Callback*)cb_btn_enable_gpio2); o->value((progdefaults.enable_gpio >> 2) & 0x01); } // Fl_Check_Button* btn_enable_gpio[2] { Fl_Check_Button* o = btn_enable_gpio[3] = new Fl_Check_Button(60, 210, 125, 15, _("22 03 15")); btn_enable_gpio[3]->tooltip(_("Select pin number")); btn_enable_gpio[3]->down_box(FL_DOWN_BOX); btn_enable_gpio[3]->labelfont(4); btn_enable_gpio[3]->callback((Fl_Callback*)cb_btn_enable_gpio3); o->value((progdefaults.enable_gpio >> 3) & 0x01); } // Fl_Check_Button* btn_enable_gpio[3] { Fl_Check_Button* o = btn_enable_gpio[4] = new Fl_Check_Button(60, 240, 125, 15, _("23 04 16")); btn_enable_gpio[4]->tooltip(_("Select pin number")); btn_enable_gpio[4]->down_box(FL_DOWN_BOX); btn_enable_gpio[4]->labelfont(4); btn_enable_gpio[4]->callback((Fl_Callback*)cb_btn_enable_gpio4); o->value((progdefaults.enable_gpio >> 4) & 0x01); } // Fl_Check_Button* btn_enable_gpio[4] { Fl_Check_Button* o = btn_enable_gpio[5] = new Fl_Check_Button(60, 270, 125, 15, _("24 05 18")); btn_enable_gpio[5]->tooltip(_("Select pin number")); btn_enable_gpio[5]->down_box(FL_DOWN_BOX); btn_enable_gpio[5]->labelfont(4); btn_enable_gpio[5]->callback((Fl_Callback*)cb_btn_enable_gpio5); o->value((progdefaults.enable_gpio >> 5) & 0x01); } // Fl_Check_Button* btn_enable_gpio[5] { Fl_Check_Button* o = btn_enable_gpio[6] = new Fl_Check_Button(60, 300, 125, 15, _("25 06 22")); btn_enable_gpio[6]->tooltip(_("Select pin number")); btn_enable_gpio[6]->down_box(FL_DOWN_BOX); btn_enable_gpio[6]->labelfont(4); btn_enable_gpio[6]->callback((Fl_Callback*)cb_btn_enable_gpio6); o->value((progdefaults.enable_gpio >> 6) & 0x01); } // Fl_Check_Button* btn_enable_gpio[6] { Fl_Check_Button* o = btn_enable_gpio[7] = new Fl_Check_Button(60, 330, 125, 15, _(" 4 07 7")); btn_enable_gpio[7]->tooltip(_("Select pin number")); btn_enable_gpio[7]->down_box(FL_DOWN_BOX); btn_enable_gpio[7]->labelfont(4); btn_enable_gpio[7]->callback((Fl_Callback*)cb_btn_enable_gpio7); o->value((progdefaults.enable_gpio >> 7) & 0x01); } // Fl_Check_Button* btn_enable_gpio[7] { Fl_Check_Button* o = btn_enable_gpio[8] = new Fl_Check_Button(320, 121, 125, 15, _(" 5 21 29")); btn_enable_gpio[8]->tooltip(_("Select pin number")); btn_enable_gpio[8]->down_box(FL_DOWN_BOX); btn_enable_gpio[8]->labelfont(4); btn_enable_gpio[8]->callback((Fl_Callback*)cb_btn_enable_gpio8); o->value((progdefaults.enable_gpio >> 8) & 0x01); } // Fl_Check_Button* btn_enable_gpio[8] { Fl_Check_Button* o = btn_enable_gpio[9] = new Fl_Check_Button(320, 150, 125, 15, _(" 6 22 31")); btn_enable_gpio[9]->tooltip(_("Select pin number")); btn_enable_gpio[9]->down_box(FL_DOWN_BOX); btn_enable_gpio[9]->labelfont(4); btn_enable_gpio[9]->callback((Fl_Callback*)cb_btn_enable_gpio9); o->value((progdefaults.enable_gpio >> 9) & 0x01); } // Fl_Check_Button* btn_enable_gpio[9] { Fl_Check_Button* o = btn_enable_gpio[10] = new Fl_Check_Button(320, 180, 125, 15, _("13 23 33")); btn_enable_gpio[10]->tooltip(_("Select pin number")); btn_enable_gpio[10]->down_box(FL_DOWN_BOX); btn_enable_gpio[10]->labelfont(4); btn_enable_gpio[10]->callback((Fl_Callback*)cb_btn_enable_gpioa); o->value((progdefaults.enable_gpio >> 10) & 0x01); } // Fl_Check_Button* btn_enable_gpio[10] { Fl_Check_Button* o = btn_enable_gpio[11] = new Fl_Check_Button(320, 210, 125, 15, _("19 24 35")); btn_enable_gpio[11]->tooltip(_("Select pin number")); btn_enable_gpio[11]->down_box(FL_DOWN_BOX); btn_enable_gpio[11]->labelfont(4); btn_enable_gpio[11]->callback((Fl_Callback*)cb_btn_enable_gpiob); o->value((progdefaults.enable_gpio >> 11) & 0x01); } // Fl_Check_Button* btn_enable_gpio[11] { Fl_Check_Button* o = btn_enable_gpio[12] = new Fl_Check_Button(320, 240, 125, 15, _("26 25 37")); btn_enable_gpio[12]->tooltip(_("Select pin number")); btn_enable_gpio[12]->down_box(FL_DOWN_BOX); btn_enable_gpio[12]->labelfont(4); btn_enable_gpio[12]->callback((Fl_Callback*)cb_btn_enable_gpioc); o->value((progdefaults.enable_gpio >> 12) & 0x01); } // Fl_Check_Button* btn_enable_gpio[12] { Fl_Check_Button* o = btn_enable_gpio[13] = new Fl_Check_Button(320, 270, 125, 15, _("12 26 32")); btn_enable_gpio[13]->tooltip(_("Select pin number")); btn_enable_gpio[13]->down_box(FL_DOWN_BOX); btn_enable_gpio[13]->labelfont(4); btn_enable_gpio[13]->callback((Fl_Callback*)cb_btn_enable_gpiod); o->value((progdefaults.enable_gpio >> 13) & 0x01); } // Fl_Check_Button* btn_enable_gpio[13] { Fl_Check_Button* o = btn_enable_gpio[14] = new Fl_Check_Button(320, 300, 125, 15, _("16 27 36")); btn_enable_gpio[14]->tooltip(_("Select pin number")); btn_enable_gpio[14]->down_box(FL_DOWN_BOX); btn_enable_gpio[14]->labelfont(4); btn_enable_gpio[14]->callback((Fl_Callback*)cb_btn_enable_gpioe); o->value((progdefaults.enable_gpio >> 14) & 0x01); } // Fl_Check_Button* btn_enable_gpio[14] { Fl_Check_Button* o = btn_enable_gpio[15] = new Fl_Check_Button(320, 330, 125, 15, _("20 28 38")); btn_enable_gpio[15]->tooltip(_("Select pin number")); btn_enable_gpio[15]->down_box(FL_DOWN_BOX); btn_enable_gpio[15]->labelfont(4); btn_enable_gpio[15]->callback((Fl_Callback*)cb_btn_enable_gpiof); o->value((progdefaults.enable_gpio >> 15) & 0x01); } // Fl_Check_Button* btn_enable_gpio[15] { Fl_Check_Button* o = btn_enable_gpio[16] = new Fl_Check_Button(320, 360, 125, 15, _("21 29 40")); btn_enable_gpio[16]->tooltip(_("Select pin number")); btn_enable_gpio[16]->down_box(FL_DOWN_BOX); btn_enable_gpio[16]->labelfont(4); btn_enable_gpio[16]->callback((Fl_Callback*)cb_btn_enable_gpio10); o->value((progdefaults.enable_gpio >> 16) & 0x01); } // Fl_Check_Button* btn_enable_gpio[16] { Fl_Check_Button* o = btn_gpio_on[0] = new Fl_Check_Button(200, 120, 84, 15, _("= 1 (on)")); btn_gpio_on[0]->tooltip(_("Select PTT on state")); btn_gpio_on[0]->down_box(FL_DOWN_BOX); btn_gpio_on[0]->labelfont(4); btn_gpio_on[0]->callback((Fl_Callback*)cb_btn_gpio_on); o->value((progdefaults.gpio_on) & 0x01); } // Fl_Check_Button* btn_gpio_on[0] { Fl_Check_Button* o = btn_gpio_on[1] = new Fl_Check_Button(200, 150, 84, 15, _("= 1 (on)")); btn_gpio_on[1]->tooltip(_("Select PTT on state")); btn_gpio_on[1]->down_box(FL_DOWN_BOX); btn_gpio_on[1]->labelfont(4); btn_gpio_on[1]->callback((Fl_Callback*)cb_btn_gpio_on1); o->value((progdefaults.gpio_on >> 1) & 0x01); } // Fl_Check_Button* btn_gpio_on[1] { Fl_Check_Button* o = btn_gpio_on[2] = new Fl_Check_Button(200, 180, 84, 15, _("= 1 (on)")); btn_gpio_on[2]->tooltip(_("Select PTT on state")); btn_gpio_on[2]->down_box(FL_DOWN_BOX); btn_gpio_on[2]->labelfont(4); btn_gpio_on[2]->callback((Fl_Callback*)cb_btn_gpio_on2); o->value((progdefaults.gpio_on >> 2) & 0x01); } // Fl_Check_Button* btn_gpio_on[2] { Fl_Check_Button* o = btn_gpio_on[3] = new Fl_Check_Button(200, 210, 84, 15, _("= 1 (on)")); btn_gpio_on[3]->tooltip(_("Select PTT on state")); btn_gpio_on[3]->down_box(FL_DOWN_BOX); btn_gpio_on[3]->labelfont(4); btn_gpio_on[3]->callback((Fl_Callback*)cb_btn_gpio_on3); o->value((progdefaults.gpio_on >> 3) & 0x01); } // Fl_Check_Button* btn_gpio_on[3] { Fl_Check_Button* o = btn_gpio_on[4] = new Fl_Check_Button(200, 240, 84, 15, _("= 1 (on)")); btn_gpio_on[4]->tooltip(_("Select PTT on state")); btn_gpio_on[4]->down_box(FL_DOWN_BOX); btn_gpio_on[4]->labelfont(4); btn_gpio_on[4]->callback((Fl_Callback*)cb_btn_gpio_on4); o->value((progdefaults.gpio_on >> 4) & 0x01); } // Fl_Check_Button* btn_gpio_on[4] { Fl_Check_Button* o = btn_gpio_on[5] = new Fl_Check_Button(200, 270, 84, 15, _("= 1 (on)")); btn_gpio_on[5]->tooltip(_("Select PTT on state")); btn_gpio_on[5]->down_box(FL_DOWN_BOX); btn_gpio_on[5]->labelfont(4); btn_gpio_on[5]->callback((Fl_Callback*)cb_btn_gpio_on5); o->value((progdefaults.gpio_on >> 5) & 0x01); } // Fl_Check_Button* btn_gpio_on[5] { Fl_Check_Button* o = btn_gpio_on[6] = new Fl_Check_Button(200, 300, 84, 15, _("= 1 (on)")); btn_gpio_on[6]->tooltip(_("Select PTT on state")); btn_gpio_on[6]->down_box(FL_DOWN_BOX); btn_gpio_on[6]->labelfont(4); btn_gpio_on[6]->callback((Fl_Callback*)cb_btn_gpio_on6); o->value((progdefaults.gpio_on >> 6) & 0x01); } // Fl_Check_Button* btn_gpio_on[6] { Fl_Check_Button* o = btn_gpio_on[7] = new Fl_Check_Button(200, 330, 84, 15, _("= 1 (on)")); btn_gpio_on[7]->tooltip(_("Select PTT on state")); btn_gpio_on[7]->down_box(FL_DOWN_BOX); btn_gpio_on[7]->labelfont(4); btn_gpio_on[7]->callback((Fl_Callback*)cb_btn_gpio_on7); o->value((progdefaults.gpio_on >> 7) & 0x01); } // Fl_Check_Button* btn_gpio_on[7] { Fl_Check_Button* o = btn_gpio_on[8] = new Fl_Check_Button(460, 121, 84, 15, _("= 1 (on)")); btn_gpio_on[8]->tooltip(_("Select PTT on state")); btn_gpio_on[8]->down_box(FL_DOWN_BOX); btn_gpio_on[8]->labelfont(4); btn_gpio_on[8]->callback((Fl_Callback*)cb_btn_gpio_on8); o->value((progdefaults.gpio_on >> 8) & 0x01); } // Fl_Check_Button* btn_gpio_on[8] { Fl_Check_Button* o = btn_gpio_on[9] = new Fl_Check_Button(460, 150, 84, 15, _("= 1 (on)")); btn_gpio_on[9]->tooltip(_("Select PTT on state")); btn_gpio_on[9]->down_box(FL_DOWN_BOX); btn_gpio_on[9]->labelfont(4); btn_gpio_on[9]->callback((Fl_Callback*)cb_btn_gpio_on9); o->value((progdefaults.gpio_on >> 9) & 0x01); } // Fl_Check_Button* btn_gpio_on[9] { Fl_Check_Button* o = btn_gpio_on[10] = new Fl_Check_Button(460, 180, 84, 15, _("= 1 (on)")); btn_gpio_on[10]->tooltip(_("Select PTT on state")); btn_gpio_on[10]->down_box(FL_DOWN_BOX); btn_gpio_on[10]->labelfont(4); btn_gpio_on[10]->callback((Fl_Callback*)cb_btn_gpio_ona); o->value((progdefaults.gpio_on >> 10) & 0x01); } // Fl_Check_Button* btn_gpio_on[10] { Fl_Check_Button* o = btn_gpio_on[11] = new Fl_Check_Button(460, 210, 84, 15, _("= 1 (on)")); btn_gpio_on[11]->tooltip(_("Select PTT on state")); btn_gpio_on[11]->down_box(FL_DOWN_BOX); btn_gpio_on[11]->labelfont(4); btn_gpio_on[11]->callback((Fl_Callback*)cb_btn_gpio_onb); o->value((progdefaults.gpio_on >> 11) & 0x01); } // Fl_Check_Button* btn_gpio_on[11] { Fl_Check_Button* o = btn_gpio_on[12] = new Fl_Check_Button(460, 240, 84, 15, _("= 1 (on)")); btn_gpio_on[12]->tooltip(_("Select PTT on state")); btn_gpio_on[12]->down_box(FL_DOWN_BOX); btn_gpio_on[12]->labelfont(4); btn_gpio_on[12]->callback((Fl_Callback*)cb_btn_gpio_onc); o->value((progdefaults.gpio_on >> 12) & 0x01); } // Fl_Check_Button* btn_gpio_on[12] { Fl_Check_Button* o = btn_gpio_on[13] = new Fl_Check_Button(460, 270, 84, 15, _("= 1 (on)")); btn_gpio_on[13]->tooltip(_("Select PTT on state")); btn_gpio_on[13]->down_box(FL_DOWN_BOX); btn_gpio_on[13]->labelfont(4); btn_gpio_on[13]->callback((Fl_Callback*)cb_btn_gpio_ond); o->value((progdefaults.gpio_on >> 13) & 0x01); } // Fl_Check_Button* btn_gpio_on[13] { Fl_Check_Button* o = btn_gpio_on[14] = new Fl_Check_Button(460, 300, 84, 15, _("= 1 (on)")); btn_gpio_on[14]->tooltip(_("Select PTT on state")); btn_gpio_on[14]->down_box(FL_DOWN_BOX); btn_gpio_on[14]->labelfont(4); btn_gpio_on[14]->callback((Fl_Callback*)cb_btn_gpio_one); o->value((progdefaults.gpio_on >> 14) & 0x01); } // Fl_Check_Button* btn_gpio_on[14] { Fl_Check_Button* o = btn_gpio_on[15] = new Fl_Check_Button(460, 330, 84, 15, _("= 1 (on)")); btn_gpio_on[15]->tooltip(_("Select PTT on state")); btn_gpio_on[15]->down_box(FL_DOWN_BOX); btn_gpio_on[15]->labelfont(4); btn_gpio_on[15]->callback((Fl_Callback*)cb_btn_gpio_onf); o->value((progdefaults.gpio_on >> 15) & 0x01); } // Fl_Check_Button* btn_gpio_on[15] { Fl_Check_Button* o = btn_gpio_on[16] = new Fl_Check_Button(460, 360, 84, 15, _("= 1 (on)")); btn_gpio_on[16]->tooltip(_("Select PTT on state")); btn_gpio_on[16]->down_box(FL_DOWN_BOX); btn_gpio_on[16]->labelfont(4); btn_gpio_on[16]->callback((Fl_Callback*)cb_btn_gpio_on10); o->value((progdefaults.gpio_on >> 16) & 0x01); } // Fl_Check_Button* btn_gpio_on[16] { Fl_Box* o = new Fl_Box(330, 96, 194, 17, _("BCM GPIO pin Value")); o->labelfont(4); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { new Fl_Box(170, 68, 283, 17, _("Enable GPIO PTT (Pi specific controls)")); } // Fl_Box* o { Fl_Counter* o = cnt_gpio_pulse_width = new Fl_Counter(60, 357, 80, 21, _("Pulse width (msec)")); cnt_gpio_pulse_width->tooltip(_("Set >0 if pulsed PTT used")); cnt_gpio_pulse_width->type(1); cnt_gpio_pulse_width->minimum(0); cnt_gpio_pulse_width->maximum(50); cnt_gpio_pulse_width->step(1); cnt_gpio_pulse_width->callback((Fl_Callback*)cb_cnt_gpio_pulse_width); cnt_gpio_pulse_width->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.gpio_pulse_width); } // Fl_Counter* cnt_gpio_pulse_width o->end(); } // Fl_Group* o tabsRig->end(); } // Fl_Tabs* tabsRig tabRig->end(); } // Fl_Group* tabRig { tabSoundCard = new Fl_Group(0, 25, 600, 365, _("Audio")); tabSoundCard->hide(); { tabsSoundCard = new Fl_Tabs(0, 25, 600, 365); tabsSoundCard->selection_color(FL_LIGHT1); { tabAudio = new Fl_Group(0, 50, 600, 340, _("Devices")); { AudioOSS = new Fl_Group(55, 65, 490, 45); AudioOSS->box(FL_ENGRAVED_FRAME); { btnAudioIO[0] = new Fl_Round_Button(65, 75, 53, 25, _("OSS")); btnAudioIO[0]->tooltip(_("Use OSS audio server")); btnAudioIO[0]->down_box(FL_DOWN_BOX); btnAudioIO[0]->selection_color((Fl_Color)1); btnAudioIO[0]->callback((Fl_Callback*)cb_btnAudioIO); } // Fl_Round_Button* btnAudioIO[0] { Fl_Input_Choice* o = menuOSSDev = new Fl_Input_Choice(424, 75, 110, 25, _("Device:")); menuOSSDev->tooltip(_("Select device")); menuOSSDev->callback((Fl_Callback*)cb_menuOSSDev); o->value(progdefaults.OSSdevice.c_str()); } // Fl_Input_Choice* menuOSSDev AudioOSS->end(); } // Fl_Group* AudioOSS { AudioPort = new Fl_Group(55, 110, 490, 80); AudioPort->box(FL_ENGRAVED_FRAME); { btnAudioIO[1] = new Fl_Round_Button(65, 138, 95, 25, _("PortAudio")); btnAudioIO[1]->tooltip(_("Use Port Audio server")); btnAudioIO[1]->down_box(FL_DOWN_BOX); btnAudioIO[1]->selection_color((Fl_Color)1); btnAudioIO[1]->callback((Fl_Callback*)cb_btnAudioIO1); } // Fl_Round_Button* btnAudioIO[1] { menuPortInDev = new Fl_Choice(244, 121, 290, 25, _("Capture:")); menuPortInDev->tooltip(_("Audio input device")); menuPortInDev->down_box(FL_BORDER_BOX); menuPortInDev->callback((Fl_Callback*)cb_menuPortInDev); } // Fl_Choice* menuPortInDev { menuPortOutDev = new Fl_Choice(244, 156, 290, 25, _("Playback:")); menuPortOutDev->tooltip(_("Audio output device")); menuPortOutDev->down_box(FL_BORDER_BOX); menuPortOutDev->callback((Fl_Callback*)cb_menuPortOutDev); } // Fl_Choice* menuPortOutDev AudioPort->end(); } // Fl_Group* AudioPort { AudioPulse = new Fl_Group(55, 190, 490, 45); AudioPulse->box(FL_ENGRAVED_FRAME); { btnAudioIO[2] = new Fl_Round_Button(65, 201, 100, 25, _("PulseAudio")); btnAudioIO[2]->tooltip(_("Use Pulse Audio server")); btnAudioIO[2]->down_box(FL_DOWN_BOX); btnAudioIO[2]->selection_color((Fl_Color)1); btnAudioIO[2]->callback((Fl_Callback*)cb_btnAudioIO2); } // Fl_Round_Button* btnAudioIO[2] { Fl_Input2* o = inpPulseServer = new Fl_Input2(310, 201, 225, 24, _("Server string:")); inpPulseServer->tooltip(_("Leave this blank or refer to\nhttp://www.pulseaudio.org/wiki/ServerStrings")); inpPulseServer->box(FL_DOWN_BOX); inpPulseServer->color(FL_BACKGROUND2_COLOR); inpPulseServer->selection_color(FL_SELECTION_COLOR); inpPulseServer->labeltype(FL_NORMAL_LABEL); inpPulseServer->labelfont(0); inpPulseServer->labelsize(14); inpPulseServer->labelcolor(FL_FOREGROUND_COLOR); inpPulseServer->callback((Fl_Callback*)cb_inpPulseServer); inpPulseServer->align(Fl_Align(FL_ALIGN_LEFT)); inpPulseServer->when(FL_WHEN_RELEASE); o->value(progdefaults.PulseServer.c_str()); inpPulseServer->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPulseServer AudioPulse->end(); } // Fl_Group* AudioPulse { AudioNull = new Fl_Group(55, 235, 490, 45); AudioNull->box(FL_ENGRAVED_FRAME); { btnAudioIO[3] = new Fl_Round_Button(66, 245, 100, 25, _("File I/O only")); btnAudioIO[3]->tooltip(_("NO AUDIO DEVICE AVAILABLE (or testing)")); btnAudioIO[3]->down_box(FL_DOWN_BOX); btnAudioIO[3]->selection_color((Fl_Color)1); btnAudioIO[3]->callback((Fl_Callback*)cb_btnAudioIO3); } // Fl_Round_Button* btnAudioIO[3] AudioNull->end(); } // Fl_Group* AudioNull { AudioDuplex = new Fl_Group(55, 280, 490, 45); AudioDuplex->box(FL_ENGRAVED_FRAME); { Fl_Round_Button* o = btn_is_full_duplex = new Fl_Round_Button(66, 290, 223, 25, _("Device supports full duplex")); btn_is_full_duplex->tooltip(_("NO AUDIO DEVICE AVAILABLE (or testing)")); btn_is_full_duplex->down_box(FL_DOWN_BOX); btn_is_full_duplex->value(1); btn_is_full_duplex->selection_color((Fl_Color)1); btn_is_full_duplex->callback((Fl_Callback*)cb_btn_is_full_duplex); o->value(progdefaults.is_full_duplex); } // Fl_Round_Button* btn_is_full_duplex AudioDuplex->end(); } // Fl_Group* AudioDuplex tabAudio->end(); } // Fl_Group* tabAudio { tabAudioOpt = new Fl_Group(0, 50, 600, 340, _("Settings")); tabAudioOpt->hide(); { grpAudioSampleRate = new Fl_Group(55, 65, 490, 90, _("Sample rate")); grpAudioSampleRate->box(FL_ENGRAVED_FRAME); grpAudioSampleRate->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = menuInSampleRate = new Fl_ListBox(65, 94, 100, 22, _("Capture")); menuInSampleRate->tooltip(_("Force a specific sample rate. Select \"Native\" if \"Auto\"\ndoes not work we\ ll with your audio device.")); menuInSampleRate->box(FL_DOWN_BOX); menuInSampleRate->color(FL_BACKGROUND2_COLOR); menuInSampleRate->selection_color(FL_BACKGROUND_COLOR); menuInSampleRate->labeltype(FL_NORMAL_LABEL); menuInSampleRate->labelfont(0); menuInSampleRate->labelsize(14); menuInSampleRate->labelcolor(FL_FOREGROUND_COLOR); menuInSampleRate->callback((Fl_Callback*)cb_menuInSampleRate); menuInSampleRate->align(Fl_Align(FL_ALIGN_RIGHT)); menuInSampleRate->when(FL_WHEN_RELEASE); o->clear_changed(); o->labelsize(FL_NORMAL_SIZE); menuInSampleRate->end(); } // Fl_ListBox* menuInSampleRate { Fl_ListBox* o = menuOutSampleRate = new Fl_ListBox(65, 124, 100, 22, _("Playback")); menuOutSampleRate->box(FL_DOWN_BOX); menuOutSampleRate->color(FL_BACKGROUND2_COLOR); menuOutSampleRate->selection_color(FL_BACKGROUND_COLOR); menuOutSampleRate->labeltype(FL_NORMAL_LABEL); menuOutSampleRate->labelfont(0); menuOutSampleRate->labelsize(14); menuOutSampleRate->labelcolor(FL_FOREGROUND_COLOR); menuOutSampleRate->callback((Fl_Callback*)cb_menuOutSampleRate); menuOutSampleRate->align(Fl_Align(FL_ALIGN_RIGHT)); menuOutSampleRate->when(FL_WHEN_RELEASE); o->clear_changed(); o->tooltip(menuInSampleRate->tooltip()); o->labelsize(FL_NORMAL_SIZE); menuOutSampleRate->end(); } // Fl_ListBox* menuOutSampleRate { Fl_ListBox* o = menuSampleConverter = new Fl_ListBox(319, 94, 216, 22, _("Converter")); menuSampleConverter->tooltip(_("Set the type of resampler used of offset correction")); menuSampleConverter->box(FL_DOWN_BOX); menuSampleConverter->color(FL_BACKGROUND2_COLOR); menuSampleConverter->selection_color(FL_BACKGROUND_COLOR); menuSampleConverter->labeltype(FL_NORMAL_LABEL); menuSampleConverter->labelfont(0); menuSampleConverter->labelsize(14); menuSampleConverter->labelcolor(FL_FOREGROUND_COLOR); menuSampleConverter->callback((Fl_Callback*)cb_menuSampleConverter); menuSampleConverter->align(Fl_Align(FL_ALIGN_TOP_LEFT)); menuSampleConverter->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); menuSampleConverter->end(); } // Fl_ListBox* menuSampleConverter grpAudioSampleRate->end(); } // Fl_Group* grpAudioSampleRate { Fl_Group* o = new Fl_Group(55, 155, 490, 62, _("Corrections")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Spinner2* o = cntRxRateCorr = new Fl_Spinner2(65, 185, 85, 20, _("RX ppm")); cntRxRateCorr->tooltip(_("RX sound card correction")); cntRxRateCorr->box(FL_NO_BOX); cntRxRateCorr->color(FL_BACKGROUND_COLOR); cntRxRateCorr->selection_color(FL_BACKGROUND_COLOR); cntRxRateCorr->labeltype(FL_NORMAL_LABEL); cntRxRateCorr->labelfont(0); cntRxRateCorr->labelsize(14); cntRxRateCorr->labelcolor(FL_FOREGROUND_COLOR); cntRxRateCorr->callback((Fl_Callback*)cb_cntRxRateCorr); cntRxRateCorr->align(Fl_Align(FL_ALIGN_RIGHT)); cntRxRateCorr->when(FL_WHEN_RELEASE); o->step(1); o->minimum(-50000); o->maximum(50000); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntRxRateCorr { Fl_Spinner2* o = cntTxRateCorr = new Fl_Spinner2(226, 185, 85, 20, _("TX ppm")); cntTxRateCorr->tooltip(_("TX sound card correction")); cntTxRateCorr->box(FL_NO_BOX); cntTxRateCorr->color(FL_BACKGROUND_COLOR); cntTxRateCorr->selection_color(FL_BACKGROUND_COLOR); cntTxRateCorr->labeltype(FL_NORMAL_LABEL); cntTxRateCorr->labelfont(0); cntTxRateCorr->labelsize(14); cntTxRateCorr->labelcolor(FL_FOREGROUND_COLOR); cntTxRateCorr->callback((Fl_Callback*)cb_cntTxRateCorr); cntTxRateCorr->align(Fl_Align(FL_ALIGN_RIGHT)); cntTxRateCorr->when(FL_WHEN_RELEASE); o->step(1); o->minimum(-50000); o->maximum(50000); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTxRateCorr { Fl_Spinner2* o = cntTxOffset = new Fl_Spinner2(388, 185, 85, 20, _("TX offset")); cntTxOffset->tooltip(_("Difference between Rx & Tx freq (rig offset)")); cntTxOffset->box(FL_NO_BOX); cntTxOffset->color(FL_BACKGROUND_COLOR); cntTxOffset->selection_color(FL_BACKGROUND_COLOR); cntTxOffset->labeltype(FL_NORMAL_LABEL); cntTxOffset->labelfont(0); cntTxOffset->labelsize(14); cntTxOffset->labelcolor(FL_FOREGROUND_COLOR); cntTxOffset->callback((Fl_Callback*)cb_cntTxOffset); cntTxOffset->align(Fl_Align(FL_ALIGN_RIGHT)); cntTxOffset->when(FL_WHEN_RELEASE); o->value(progdefaults.TxOffset); o->step(1); o->minimum(-50); o->maximum(50); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTxOffset o->end(); } // Fl_Group* o tabAudioOpt->end(); } // Fl_Group* tabAudioOpt { tabAudioRightChannel = new Fl_Group(0, 50, 600, 340, _("Right channel")); tabAudioRightChannel->hide(); { Fl_Group* o = new Fl_Group(25, 61, 550, 246, _("Transmit Usage")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkAudioStereoOut = new Fl_Check_Button(165, 82, 280, 20, _("Modem signal on left and right channels")); chkAudioStereoOut->tooltip(_("Left and right channels both contain modem audio")); chkAudioStereoOut->down_box(FL_DOWN_BOX); chkAudioStereoOut->callback((Fl_Callback*)cb_chkAudioStereoOut); chkAudioStereoOut->value(progdefaults.sig_on_right_channel); } // Fl_Check_Button* chkAudioStereoOut { Fl_Check_Button* o = chkReverseAudio = new Fl_Check_Button(165, 112, 270, 20, _("Reverse Left/Right channels")); chkReverseAudio->tooltip(_("Software reversal of left-right audio channels")); chkReverseAudio->down_box(FL_DOWN_BOX); chkReverseAudio->callback((Fl_Callback*)cb_chkReverseAudio); o->value(progdefaults.ReverseAudio); } // Fl_Check_Button* chkReverseAudio { Fl_Group* o = new Fl_Group(75, 135, 454, 162, _("...\nThese controls are on other tabs.\nThey are replicated here for convenie\ nce.\nYou may change the state from either location.\n...")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPTTrightchannel2 = new Fl_Check_Button(165, 142, 250, 20, _("PTT tone on right audio channel ")); btnPTTrightchannel2->tooltip(_("1000 Hz tone when PTT enabled\nCan be used in lieu of or in addition to other\ PTT types")); btnPTTrightchannel2->down_box(FL_DOWN_BOX); btnPTTrightchannel2->callback((Fl_Callback*)cb_btnPTTrightchannel2); o->value(progdefaults.PTTrightchannel); } // Fl_Check_Button* btnPTTrightchannel2 { Fl_Check_Button* o = btnQSK2 = new Fl_Check_Button(165, 172, 211, 20, _("CW QSK signal on right channel")); btnQSK2->tooltip(_("Generate 1000 Hz square wave signal on right channel")); btnQSK2->down_box(FL_DOWN_BOX); btnQSK2->callback((Fl_Callback*)cb_btnQSK2); o->value(progdefaults.QSK); } // Fl_Check_Button* btnQSK2 { Fl_Check_Button* o = chkPseudoFSK2 = new Fl_Check_Button(165, 203, 270, 20, _("Pseudo-FSK on right audio channel")); chkPseudoFSK2->tooltip(_("Create 1000 Hz square wave on right channel")); chkPseudoFSK2->down_box(FL_DOWN_BOX); chkPseudoFSK2->callback((Fl_Callback*)cb_chkPseudoFSK2); o->value(progdefaults.PseudoFSK); } // Fl_Check_Button* chkPseudoFSK2 o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(25, 310, 550, 60, _("Receive Usage")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkReverseRxAudio = new Fl_Check_Button(165, 328, 270, 20, _("Reverse Left/Right channels")); chkReverseRxAudio->tooltip(_("Software reversal of left-right audio channels")); chkReverseRxAudio->down_box(FL_DOWN_BOX); chkReverseRxAudio->callback((Fl_Callback*)cb_chkReverseRxAudio); o->value(progdefaults.ReverseRxAudio); } // Fl_Check_Button* chkReverseRxAudio o->end(); } // Fl_Group* o tabAudioRightChannel->end(); } // Fl_Group* tabAudioRightChannel { tabWavFile = new Fl_Group(0, 50, 600, 340, _("Wav")); tabWavFile->hide(); { Fl_ListBox* o = listbox_wav_samplerate = new Fl_ListBox(225, 96, 150, 24, _("Wav write sample rate")); listbox_wav_samplerate->tooltip(_("Pick baud rate from list")); listbox_wav_samplerate->box(FL_DOWN_BOX); listbox_wav_samplerate->color(FL_BACKGROUND2_COLOR); listbox_wav_samplerate->selection_color(FL_BACKGROUND_COLOR); listbox_wav_samplerate->labeltype(FL_NORMAL_LABEL); listbox_wav_samplerate->labelfont(0); listbox_wav_samplerate->labelsize(14); listbox_wav_samplerate->labelcolor(FL_FOREGROUND_COLOR); listbox_wav_samplerate->callback((Fl_Callback*)cb_listbox_wav_samplerate); listbox_wav_samplerate->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listbox_wav_samplerate->when(FL_WHEN_RELEASE); o->add("8000|11025|16000|22050|24000|44100|48000"); o->index(progdefaults.wavSampleRate); o->labelsize(FL_NORMAL_SIZE); listbox_wav_samplerate->end(); } // Fl_ListBox* listbox_wav_samplerate { Fl_Check_Button* o = btn_record_both = new Fl_Check_Button(225, 145, 176, 15, _("Record both channels")); btn_record_both->down_box(FL_DOWN_BOX); btn_record_both->callback((Fl_Callback*)cb_btn_record_both); o->value(progdefaults.record_both_channels); } // Fl_Check_Button* btn_record_both tabWavFile->end(); } // Fl_Group* tabWavFile { tabAlerts = new Fl_Group(0, 50, 600, 340, _("Alerts")); tabAlerts->color(FL_LIGHT1); tabAlerts->selection_color(FL_LIGHT1); tabAlerts->hide(); { Fl_Group* o = new Fl_Group(5, 56, 590, 66, _("Regex Match in Browser")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_fname_regex = new Fl_File_Input(10, 80, 304, 35, _("REGEX detected wav")); inp_wav_fname_regex->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.BWSR_REGEX_MATCH.c_str()); } // Fl_File_Input* inp_wav_fname_regex { btn_select_regex_wav = new Fl_Button(316, 91, 60, 24, _("Select")); btn_select_regex_wav->callback((Fl_Callback*)cb_btn_select_regex_wav); } // Fl_Button* btn_select_regex_wav { Fl_Choice* o = mnu_regex_alert_menu = new Fl_Choice(380, 91, 135, 24, _("Sound:")); mnu_regex_alert_menu->box(FL_DOWN_BOX); mnu_regex_alert_menu->down_box(FL_BORDER_BOX); mnu_regex_alert_menu->color((Fl_Color)53); mnu_regex_alert_menu->callback((Fl_Callback*)cb_mnu_regex_alert_menu); mnu_regex_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell"); o->value(progdefaults.REGEX_ALERT_MENU); } // Fl_Choice* mnu_regex_alert_menu { Fl_Check_Button* o = btn_enable_regex_match_wa = new Fl_Check_Button(514, 69, 70, 15, _("Enable")); btn_enable_regex_match_wa->down_box(FL_DOWN_BOX); btn_enable_regex_match_wa->callback((Fl_Callback*)cb_btn_enable_regex_match_wa); o->value(progdefaults.ENABLE_BWSR_REGEX_MATCH); } // Fl_Check_Button* btn_enable_regex_match_wa { btn_test_regex_wav = new Fl_Button(518, 91, 60, 24, _("Test")); btn_test_regex_wav->callback((Fl_Callback*)cb_btn_test_regex_wav); } // Fl_Button* btn_test_regex_wav o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 123, 590, 66, _("MYCALL Match in Browser")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_fname_mycall = new Fl_File_Input(10, 147, 304, 35, _("MYCALL detected wav")); inp_wav_fname_mycall->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); } // Fl_File_Input* inp_wav_fname_mycall { btn_select_mycall_wav = new Fl_Button(316, 158, 60, 24, _("Select")); btn_select_mycall_wav->callback((Fl_Callback*)cb_btn_select_mycall_wav); } // Fl_Button* btn_select_mycall_wav { Fl_Choice* o = mnu_mycall_alert_menu = new Fl_Choice(380, 158, 135, 24, _("Sound:")); mnu_mycall_alert_menu->box(FL_DOWN_BOX); mnu_mycall_alert_menu->down_box(FL_BORDER_BOX); mnu_mycall_alert_menu->color((Fl_Color)53); mnu_mycall_alert_menu->callback((Fl_Callback*)cb_mnu_mycall_alert_menu); mnu_mycall_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell"); o->value(progdefaults.MYCALL_ALERT_MENU); } // Fl_Choice* mnu_mycall_alert_menu { Fl_Check_Button* o = btn_enable_mycall_match_wav = new Fl_Check_Button(514, 136, 70, 15, _("Enable")); btn_enable_mycall_match_wav->down_box(FL_DOWN_BOX); btn_enable_mycall_match_wav->callback((Fl_Callback*)cb_btn_enable_mycall_match_wav); o->value(progdefaults.ENABLE_BWSR_MYCALL_MATCH); } // Fl_Check_Button* btn_enable_mycall_match_wav { btn_test_mycall_wav = new Fl_Button(518, 158, 60, 24, _("Test")); btn_test_mycall_wav->callback((Fl_Callback*)cb_btn_test_mycall_wav); } // Fl_Button* btn_test_mycall_wav o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 190, 590, 122, _("flmsg interface")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_flmsg_rcvd = new Fl_File_Input(10, 214, 304, 35, _("flmsg received wav")); inp_wav_flmsg_rcvd->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } // Fl_File_Input* inp_wav_flmsg_rcvd { btn_select_rx_extract_msg = new Fl_Button(316, 225, 60, 24, _("Select")); btn_select_rx_extract_msg->callback((Fl_Callback*)cb_btn_select_rx_extract_msg); } // Fl_Button* btn_select_rx_extract_msg { Fl_Choice* o = mnu_rx_extract_alert_menu = new Fl_Choice(380, 225, 135, 24, _("Sound:")); mnu_rx_extract_alert_menu->box(FL_DOWN_BOX); mnu_rx_extract_alert_menu->down_box(FL_BORDER_BOX); mnu_rx_extract_alert_menu->color((Fl_Color)53); mnu_rx_extract_alert_menu->callback((Fl_Callback*)cb_mnu_rx_extract_alert_menu); mnu_rx_extract_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell"); o->value(progdefaults.RX_EXTRACT_ALERT_MENU); } // Fl_Choice* mnu_rx_extract_alert_menu { Fl_Check_Button* o = btn_enable_flmsg_wav = new Fl_Check_Button(514, 203, 70, 15, _("Enable")); btn_enable_flmsg_wav->down_box(FL_DOWN_BOX); btn_enable_flmsg_wav->callback((Fl_Callback*)cb_btn_enable_flmsg_wav); o->value(progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD); } // Fl_Check_Button* btn_enable_flmsg_wav { btn_test_flmsg_extract_wav = new Fl_Button(518, 225, 60, 24, _("Test")); btn_test_flmsg_extract_wav->callback((Fl_Callback*)cb_btn_test_flmsg_extract_wav); } // Fl_Button* btn_test_flmsg_extract_wav { Fl_File_Input* o = inp_wav_flmsg_timed_out = new Fl_File_Input(10, 270, 304, 35, _("flmsg timed out wav")); inp_wav_flmsg_timed_out->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } // Fl_File_Input* inp_wav_flmsg_timed_out { btn_select_rx_extract_timed_out = new Fl_Button(316, 281, 60, 24, _("Select")); btn_select_rx_extract_timed_out->callback((Fl_Callback*)cb_btn_select_rx_extract_timed_out); } // Fl_Button* btn_select_rx_extract_timed_out { Fl_Choice* o = mnu_rx_timed_out_alert_menu = new Fl_Choice(380, 281, 135, 24, _("Sound:")); mnu_rx_timed_out_alert_menu->box(FL_DOWN_BOX); mnu_rx_timed_out_alert_menu->down_box(FL_BORDER_BOX); mnu_rx_timed_out_alert_menu->color((Fl_Color)53); mnu_rx_timed_out_alert_menu->callback((Fl_Callback*)cb_mnu_rx_timed_out_alert_menu); mnu_rx_timed_out_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell"); o->value(progdefaults.TIMED_OUT_ALERT_MENU); } // Fl_Choice* mnu_rx_timed_out_alert_menu { btn_test_rx_extract_timed_out = new Fl_Button(518, 281, 60, 24, _("Test")); btn_test_rx_extract_timed_out->callback((Fl_Callback*)cb_btn_test_rx_extract_timed_out); } // Fl_Button* btn_test_rx_extract_timed_out { Fl_Check_Button* o = btn_enable_flmsg_time_out_wav = new Fl_Check_Button(515, 260, 70, 15, _("Enable")); btn_enable_flmsg_time_out_wav->down_box(FL_DOWN_BOX); btn_enable_flmsg_time_out_wav->callback((Fl_Callback*)cb_btn_enable_flmsg_time_out_wav); o->value(progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT); } // Fl_Check_Button* btn_enable_flmsg_time_out_wav o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 314, 590, 66, _("RsID detection")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_fname_rsid = new Fl_File_Input(10, 338, 304, 35, _("RsID audio alert wav")); inp_wav_fname_rsid->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.RSID_MATCH.c_str()); } // Fl_File_Input* inp_wav_fname_rsid { btn_select_rsid_wav = new Fl_Button(316, 349, 60, 24, _("Select")); btn_select_rsid_wav->callback((Fl_Callback*)cb_btn_select_rsid_wav); } // Fl_Button* btn_select_rsid_wav { Fl_Choice* o = mnu_rsid_alert_menu = new Fl_Choice(380, 349, 135, 24, _("Sound:")); mnu_rsid_alert_menu->box(FL_DOWN_BOX); mnu_rsid_alert_menu->down_box(FL_BORDER_BOX); mnu_rsid_alert_menu->color((Fl_Color)53); mnu_rsid_alert_menu->callback((Fl_Callback*)cb_mnu_rsid_alert_menu); mnu_rsid_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell"); o->value(progdefaults.RSID_ALERT_MENU); } // Fl_Choice* mnu_rsid_alert_menu { Fl_Check_Button* o = btn_enable_rsid_match_wav = new Fl_Check_Button(514, 327, 70, 15, _("Enable")); btn_enable_rsid_match_wav->down_box(FL_DOWN_BOX); btn_enable_rsid_match_wav->callback((Fl_Callback*)cb_btn_enable_rsid_match_wav); o->value(progdefaults.ENABLE_RSID_MATCH); } // Fl_Check_Button* btn_enable_rsid_match_wav { btn_test_rsid_wav = new Fl_Button(518, 349, 60, 24, _("Test")); btn_test_rsid_wav->callback((Fl_Callback*)cb_btn_test_rsid_wav); } // Fl_Button* btn_test_rsid_wav o->end(); } // Fl_Group* o tabAlerts->end(); } // Fl_Group* tabAlerts tabsSoundCard->end(); } // Fl_Tabs* tabsSoundCard tabSoundCard->end(); } // Fl_Group* tabSoundCard { tabID = new Fl_Group(0, 25, 600, 365, _("ID")); tabID->hide(); { tabsID = new Fl_Tabs(0, 25, 600, 365); { tabRsID = new Fl_Group(0, 50, 600, 340, _("RsID")); { Fl_Group* o = new Fl_Group(32, 55, 535, 210, _("Reed-Solomon ID (Rx)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkRSidNotifyOnly = new Fl_Check_Button(40, 112, 168, 20, _("Notify only")); chkRSidNotifyOnly->tooltip(_("Check this to be notified when an RSID is received\nwithout changing modem an\ d frequency")); chkRSidNotifyOnly->down_box(FL_DOWN_BOX); chkRSidNotifyOnly->callback((Fl_Callback*)cb_chkRSidNotifyOnly); chkRSidNotifyOnly->value(progdefaults.rsid_notify_only); } // Fl_Check_Button* chkRSidNotifyOnly { bRSIDRxModes = new Fl_Button(40, 81, 130, 24, _("Receive modes")); bRSIDRxModes->callback((Fl_Callback*)cb_bRSIDRxModes); } // Fl_Button* bRSIDRxModes { Fl_Check_Button* o = chkRSidWideSearch = new Fl_Check_Button(40, 143, 203, 20, _("Searches passband")); chkRSidWideSearch->tooltip(_("ON - search over entire waterfall\nOFF - limit search to +/- 200 Hz")); chkRSidWideSearch->down_box(FL_DOWN_BOX); chkRSidWideSearch->callback((Fl_Callback*)cb_chkRSidWideSearch); o->value(progdefaults.rsidWideSearch); } // Fl_Check_Button* chkRSidWideSearch { chkRSidMark = new Fl_Check_Button(40, 175, 203, 20, _("Mark prev freq/mode")); chkRSidMark->tooltip(_("Insert RX text marker before\nchanging frequency and modem")); chkRSidMark->down_box(FL_DOWN_BOX); chkRSidMark->callback((Fl_Callback*)cb_chkRSidMark); chkRSidMark->value(progdefaults.rsid_mark); } // Fl_Check_Button* chkRSidMark { chkRSidAutoDisable = new Fl_Check_Button(40, 207, 203, 20, _("Disables detector")); chkRSidAutoDisable->tooltip(_("Disable further detection when RSID is received")); chkRSidAutoDisable->down_box(FL_DOWN_BOX); chkRSidAutoDisable->callback((Fl_Callback*)cb_chkRSidAutoDisable); if (progdefaults.rsid_notify_only) progdefaults.rsid_auto_disable = false; chkRSidAutoDisable->value(progdefaults.rsid_auto_disable); if (progdefaults.rsid_notify_only) chkRSidAutoDisable->deactivate(); } // Fl_Check_Button* chkRSidAutoDisable { Fl_ListBox* o = listbox_rsid_errors = new Fl_ListBox(40, 233, 100, 22, _("Allow errors")); listbox_rsid_errors->tooltip(_("Low = zero errors\nMedium = 1 error\nHigh = 2 errors")); listbox_rsid_errors->box(FL_DOWN_BOX); listbox_rsid_errors->color(FL_BACKGROUND2_COLOR); listbox_rsid_errors->selection_color(FL_BACKGROUND_COLOR); listbox_rsid_errors->labeltype(FL_NORMAL_LABEL); listbox_rsid_errors->labelfont(0); listbox_rsid_errors->labelsize(14); listbox_rsid_errors->labelcolor(FL_FOREGROUND_COLOR); listbox_rsid_errors->callback((Fl_Callback*)cb_listbox_rsid_errors); listbox_rsid_errors->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_rsid_errors->when(FL_WHEN_RELEASE); listbox_rsid_errors->add(_("Low")); listbox_rsid_errors->add(_("Medium")); listbox_rsid_errors->add(_("High")); listbox_rsid_errors->index(progdefaults.RsID_label_type); o->labelsize(FL_NORMAL_SIZE); listbox_rsid_errors->end(); } // Fl_ListBox* listbox_rsid_errors { Fl_Value_Slider2* o = sldrRSIDsquelch = new Fl_Value_Slider2(276, 233, 145, 22, _("Squelch open (sec)")); sldrRSIDsquelch->tooltip(_("Open squelch for nn sec if RSID detected")); sldrRSIDsquelch->type(1); sldrRSIDsquelch->box(FL_DOWN_BOX); sldrRSIDsquelch->color(FL_BACKGROUND_COLOR); sldrRSIDsquelch->selection_color(FL_BACKGROUND_COLOR); sldrRSIDsquelch->labeltype(FL_NORMAL_LABEL); sldrRSIDsquelch->labelfont(0); sldrRSIDsquelch->labelsize(14); sldrRSIDsquelch->labelcolor(FL_FOREGROUND_COLOR); sldrRSIDsquelch->maximum(20); sldrRSIDsquelch->step(1); sldrRSIDsquelch->textsize(14); sldrRSIDsquelch->callback((Fl_Callback*)cb_sldrRSIDsquelch); sldrRSIDsquelch->align(Fl_Align(FL_ALIGN_RIGHT)); sldrRSIDsquelch->when(FL_WHEN_CHANGED); o->value(progdefaults.rsid_squelch); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrRSIDsquelch { Fl_Check_Button* o = chkRSidShowAlert = new Fl_Check_Button(276, 143, 203, 20, _("Disable alert dialog")); chkRSidShowAlert->tooltip(_("Do not show RsID alert dialog box")); chkRSidShowAlert->down_box(FL_DOWN_BOX); chkRSidShowAlert->callback((Fl_Callback*)cb_chkRSidShowAlert); o->value(progdefaults.disable_rsid_warning_dialog_box); } // Fl_Check_Button* chkRSidShowAlert { Fl_Check_Button* o = chkRetainFreqLock = new Fl_Check_Button(276, 175, 203, 20, _("Retain tx freq lock")); chkRetainFreqLock->tooltip(_("Retain TX lock frequency (Lk) when changing to RX RsID frequency")); chkRetainFreqLock->down_box(FL_DOWN_BOX); chkRetainFreqLock->callback((Fl_Callback*)cb_chkRetainFreqLock); o->value(progdefaults.retain_freq_lock); } // Fl_Check_Button* chkRetainFreqLock { Fl_Check_Button* o = chkDisableFreqChange = new Fl_Check_Button(276, 207, 203, 20, _("Disable freq change")); chkDisableFreqChange->tooltip(_("Do not automatically change to RX RsID frequency")); chkDisableFreqChange->down_box(FL_DOWN_BOX); chkDisableFreqChange->callback((Fl_Callback*)cb_chkDisableFreqChange); o->value(progdefaults.disable_rsid_freq_change); } // Fl_Check_Button* chkDisableFreqChange { Fl_Group* o = new Fl_Group(216, 74, 330, 60, _("The RsID notification message contents and\ndisplay characteristics are confi\ gured on the\n\"Notifications\" configure dialog.")); o->box(FL_BORDER_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 267, 265, 97, _("Pre-Signal Tone")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = val_pretone = new Fl_Counter(88, 305, 140, 21, _("Seconds")); val_pretone->tooltip(_("Use for triggering amplifier carrier detect")); val_pretone->minimum(0); val_pretone->maximum(10); val_pretone->callback((Fl_Callback*)cb_val_pretone); o->value(progdefaults.pretone); } // Fl_Counter* val_pretone o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(300, 267, 265, 97, _("Reed-Solomon ID (Tx)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { bRSIDTxModes = new Fl_Button(377, 294, 130, 24, _("Transmit modes")); bRSIDTxModes->callback((Fl_Callback*)cb_bRSIDTxModes); } // Fl_Button* bRSIDTxModes { Fl_Check_Button* o = btn_post_rsid = new Fl_Check_Button(377, 329, 97, 17, _("End of xmt ID")); btn_post_rsid->tooltip(_("Add RsID signal to end of transmission")); btn_post_rsid->down_box(FL_DOWN_BOX); btn_post_rsid->callback((Fl_Callback*)cb_btn_post_rsid); o->value(progdefaults.rsid_post); } // Fl_Check_Button* btn_post_rsid o->end(); } // Fl_Group* o tabRsID->end(); } // Fl_Group* tabRsID { tabVideoID = new Fl_Group(0, 50, 600, 340, _("Video")); tabVideoID->hide(); { Fl_Group* o = new Fl_Group(32, 115, 536, 189, _("Video Preamble ID")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnsendid = new Fl_Check_Button(50, 149, 150, 20, _("Transmit mode ID")); btnsendid->tooltip(_("Waterfall video ID")); btnsendid->down_box(FL_DOWN_BOX); btnsendid->callback((Fl_Callback*)cb_btnsendid); } // Fl_Check_Button* btnsendid { Fl_Check_Button* o = btnsendvideotext = new Fl_Check_Button(50, 181, 155, 20, _("Transmit video text")); btnsendvideotext->tooltip(_("Waterfall video text")); btnsendvideotext->down_box(FL_DOWN_BOX); btnsendvideotext->callback((Fl_Callback*)cb_btnsendvideotext); o->value(progdefaults.sendtextid); } // Fl_Check_Button* btnsendvideotext { Fl_Input2* o = valVideotext = new Fl_Input2(217, 179, 323, 24, _(":")); valVideotext->tooltip(_("Limit to a few characters,\nas in CQEM or IOTA etc.")); valVideotext->box(FL_DOWN_BOX); valVideotext->color(FL_BACKGROUND2_COLOR); valVideotext->selection_color(FL_SELECTION_COLOR); valVideotext->labeltype(FL_NORMAL_LABEL); valVideotext->labelfont(0); valVideotext->labelsize(14); valVideotext->labelcolor(FL_FOREGROUND_COLOR); valVideotext->callback((Fl_Callback*)cb_valVideotext); valVideotext->align(Fl_Align(FL_ALIGN_LEFT)); valVideotext->when(FL_WHEN_RELEASE); o->value(progdefaults.strTextid.c_str()); valVideotext->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* valVideotext { Fl_Check_Button* o = chkID_SMALL = new Fl_Check_Button(50, 213, 120, 20, _("Use small font")); chkID_SMALL->tooltip(_("ON - small font\nOFF - large font")); chkID_SMALL->down_box(FL_DOWN_BOX); chkID_SMALL->value(1); chkID_SMALL->callback((Fl_Callback*)cb_chkID_SMALL); o->value(progdefaults.ID_SMALL); } // Fl_Check_Button* chkID_SMALL { Fl_Value_Slider2* o = sldrVideowidth = new Fl_Value_Slider2(290, 211, 125, 24, _("Chars/Row:")); sldrVideowidth->tooltip(_("Set the number of characters per row")); sldrVideowidth->type(1); sldrVideowidth->box(FL_DOWN_BOX); sldrVideowidth->color(FL_BACKGROUND_COLOR); sldrVideowidth->selection_color(FL_BACKGROUND_COLOR); sldrVideowidth->labeltype(FL_NORMAL_LABEL); sldrVideowidth->labelfont(0); sldrVideowidth->labelsize(14); sldrVideowidth->labelcolor(FL_FOREGROUND_COLOR); sldrVideowidth->minimum(1); sldrVideowidth->maximum(8); sldrVideowidth->step(1); sldrVideowidth->value(4); sldrVideowidth->textsize(14); sldrVideowidth->callback((Fl_Callback*)cb_sldrVideowidth); sldrVideowidth->align(Fl_Align(FL_ALIGN_LEFT)); sldrVideowidth->when(FL_WHEN_CHANGED); o->value(progdefaults.videowidth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrVideowidth { Fl_Check_Button* o = btn_vidlimit = new Fl_Check_Button(50, 245, 110, 15, _("500 Hz limit")); btn_vidlimit->down_box(FL_DOWN_BOX); btn_vidlimit->callback((Fl_Callback*)cb_btn_vidlimit); o->value(progdefaults.vidlimit); } // Fl_Check_Button* btn_vidlimit { Fl_Check_Button* o = btn_vidmodelimit = new Fl_Check_Button(50, 273, 110, 15, _("Mode width limit")); btn_vidmodelimit->down_box(FL_DOWN_BOX); btn_vidmodelimit->callback((Fl_Callback*)cb_btn_vidmodelimit); o->value(progdefaults.vidmodelimit); } // Fl_Check_Button* btn_vidmodelimit { bVideoIDModes = new Fl_Button(420, 146, 120, 24, _("Video ID modes")); bVideoIDModes->callback((Fl_Callback*)cb_bVideoIDModes); } // Fl_Button* bVideoIDModes o->end(); } // Fl_Group* o tabVideoID->end(); } // Fl_Group* tabVideoID { tabCwID = new Fl_Group(0, 50, 600, 340, _("CW")); tabCwID->hide(); { sld = new Fl_Group(32, 146, 536, 127, _("CW Postamble ID")); sld->box(FL_ENGRAVED_FRAME); sld->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnCWID = new Fl_Check_Button(139, 184, 140, 24, _("Transmit callsign")); btnCWID->tooltip(_("Send Callsign in CW at end of every transmission")); btnCWID->down_box(FL_DOWN_BOX); btnCWID->callback((Fl_Callback*)cb_btnCWID); o->value(progdefaults.CWid); } // Fl_Check_Button* btnCWID { Fl_Value_Slider2* o = sldrCWIDwpm = new Fl_Value_Slider2(139, 227, 180, 20, _("Speed (WPM):")); sldrCWIDwpm->tooltip(_("Send at this WPM")); sldrCWIDwpm->type(1); sldrCWIDwpm->box(FL_DOWN_BOX); sldrCWIDwpm->color(FL_BACKGROUND_COLOR); sldrCWIDwpm->selection_color(FL_BACKGROUND_COLOR); sldrCWIDwpm->labeltype(FL_NORMAL_LABEL); sldrCWIDwpm->labelfont(0); sldrCWIDwpm->labelsize(14); sldrCWIDwpm->labelcolor(FL_FOREGROUND_COLOR); sldrCWIDwpm->minimum(15); sldrCWIDwpm->maximum(40); sldrCWIDwpm->step(1); sldrCWIDwpm->value(18); sldrCWIDwpm->textsize(14); sldrCWIDwpm->callback((Fl_Callback*)cb_sldrCWIDwpm); sldrCWIDwpm->align(Fl_Align(FL_ALIGN_TOP)); sldrCWIDwpm->when(FL_WHEN_CHANGED); o->value(progdefaults.CWIDwpm); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWIDwpm { bCWIDModes = new Fl_Button(412, 184, 120, 24, _("CW ID modes")); bCWIDModes->callback((Fl_Callback*)cb_bCWIDModes); } // Fl_Button* bCWIDModes sld->end(); } // Fl_Group* sld tabCwID->end(); } // Fl_Group* tabCwID tabsID->end(); } // Fl_Tabs* tabsID tabID->end(); } // Fl_Group* tabID { tabMisc = new Fl_Group(0, 25, 600, 365, _("Misc")); tabMisc->hide(); { tabsMisc = new Fl_Tabs(0, 25, 600, 365); tabsMisc->selection_color(FL_LIGHT1); { tabCPUspeed = new Fl_Group(0, 50, 600, 340, _("CPU")); { Fl_Group* o = new Fl_Group(55, 75, 490, 51); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkSlowCpu = new Fl_Check_Button(201, 90, 225, 20, _("Slow CPU (less than 700MHz)")); chkSlowCpu->tooltip(_("Enable if you\'re computer does not decode properly")); chkSlowCpu->down_box(FL_DOWN_BOX); chkSlowCpu->callback((Fl_Callback*)cb_chkSlowCpu); o->value(progdefaults.slowcpu); } // Fl_Check_Button* chkSlowCpu o->end(); } // Fl_Group* o tabCPUspeed->end(); } // Fl_Group* tabCPUspeed { tabNBEMS = new Fl_Group(0, 50, 600, 340, _("NBEMS")); tabNBEMS->hide(); { Fl_Group* o = new Fl_Group(50, 65, 500, 75, _("NBEMS data file interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkAutoExtract = new Fl_Check_Button(104, 96, 75, 20, _("Enable")); chkAutoExtract->tooltip(_("Extract files for use with external \"wrap / flmsg\" program")); chkAutoExtract->down_box(FL_DOWN_BOX); chkAutoExtract->callback((Fl_Callback*)cb_chkAutoExtract); o->value(progdefaults.autoextract); } // Fl_Check_Button* chkAutoExtract { Fl_Check_Button* o = chk_open_wrap_folder = new Fl_Check_Button(310, 96, 146, 20, _("Open message folder")); chk_open_wrap_folder->tooltip(_("Opens NBEMS file folder upon successful capture")); chk_open_wrap_folder->down_box(FL_DOWN_BOX); chk_open_wrap_folder->callback((Fl_Callback*)cb_chk_open_wrap_folder); o->value(progdefaults.open_nbems_folder); } // Fl_Check_Button* chk_open_wrap_folder o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(50, 141, 500, 199, _("Reception of flmsg files")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_open_flmsg = new Fl_Check_Button(104, 241, 136, 20, _("Open with flmsg")); chk_open_flmsg->tooltip(_("Open message with flmsg")); chk_open_flmsg->down_box(FL_DOWN_BOX); chk_open_flmsg->callback((Fl_Callback*)cb_chk_open_flmsg); o->value(progdefaults.open_flmsg); } // Fl_Check_Button* chk_open_flmsg { Fl_Check_Button* o = chk_open_flmsg_print = new Fl_Check_Button(310, 241, 136, 20, _("Open in browser")); chk_open_flmsg_print->tooltip(_("Open file with default browser")); chk_open_flmsg_print->down_box(FL_DOWN_BOX); chk_open_flmsg_print->callback((Fl_Callback*)cb_chk_open_flmsg_print); o->value(progdefaults.open_flmsg_print); } // Fl_Check_Button* chk_open_flmsg_print { Fl_Input2* o = txt_flmsg_pathname = new Fl_Input2(104, 271, 330, 24, _("flmsg:")); txt_flmsg_pathname->tooltip(_("Enter full path-filename for flmsg")); txt_flmsg_pathname->box(FL_DOWN_BOX); txt_flmsg_pathname->color(FL_BACKGROUND2_COLOR); txt_flmsg_pathname->selection_color(FL_SELECTION_COLOR); txt_flmsg_pathname->labeltype(FL_NORMAL_LABEL); txt_flmsg_pathname->labelfont(0); txt_flmsg_pathname->labelsize(14); txt_flmsg_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_flmsg_pathname->callback((Fl_Callback*)cb_txt_flmsg_pathname); txt_flmsg_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_flmsg_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.flmsg_pathname.c_str()); } // Fl_Input2* txt_flmsg_pathname { btn_select_flmsg = new Fl_Button(441, 271, 100, 24, _("Locate flmsg")); btn_select_flmsg->tooltip(_("Locate flmsg executable")); btn_select_flmsg->callback((Fl_Callback*)cb_btn_select_flmsg); } // Fl_Button* btn_select_flmsg { Fl_Value_Slider* o = sldr_extract_timeout = new Fl_Value_Slider(70, 309, 364, 21, _("Timeout (secs)")); sldr_extract_timeout->tooltip(_("Extract times out after NN seconds of inactivity.")); sldr_extract_timeout->type(5); sldr_extract_timeout->color(FL_LIGHT3); sldr_extract_timeout->selection_color(FL_FOREGROUND_COLOR); sldr_extract_timeout->minimum(1); sldr_extract_timeout->maximum(20); sldr_extract_timeout->step(0.5); sldr_extract_timeout->value(10); sldr_extract_timeout->textsize(14); sldr_extract_timeout->callback((Fl_Callback*)cb_sldr_extract_timeout); sldr_extract_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.extract_timeout); } // Fl_Value_Slider* sldr_extract_timeout { Fl_Group* o = new Fl_Group(55, 160, 490, 76, _("Selection of transfer direct takes precedence\nover all other flmsg reception\ settings")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_transfer__to_open_flmsg = new Fl_Check_Button(160, 204, 271, 20, _("Transfer direct to executing flmsg")); chk_transfer__to_open_flmsg->tooltip(_("Send data stream directly to executing flmsg")); chk_transfer__to_open_flmsg->down_box(FL_DOWN_BOX); chk_transfer__to_open_flmsg->callback((Fl_Callback*)cb_chk_transfer__to_open_flmsg); o->value(progdefaults.flmsg_transfer_direct); } // Fl_Check_Button* chk_transfer__to_open_flmsg o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabNBEMS->end(); } // Fl_Group* tabNBEMS { tabPskmail = new Fl_Group(0, 50, 600, 340, _("Pskmail")); tabPskmail->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tabPskmail->hide(); { Fl_Group* o = new Fl_Group(55, 58, 490, 174, _("Mail Server Attributes")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntServerCarrier = new Fl_Counter2(106, 86, 80, 20, _("Carrier frequency (Hz)")); cntServerCarrier->tooltip(_("Default listen / transmit frequency")); cntServerCarrier->type(1); cntServerCarrier->box(FL_UP_BOX); cntServerCarrier->color(FL_BACKGROUND_COLOR); cntServerCarrier->selection_color(FL_INACTIVE_COLOR); cntServerCarrier->labeltype(FL_NORMAL_LABEL); cntServerCarrier->labelfont(0); cntServerCarrier->labelsize(14); cntServerCarrier->labelcolor(FL_FOREGROUND_COLOR); cntServerCarrier->minimum(500); cntServerCarrier->maximum(2500); cntServerCarrier->step(25); cntServerCarrier->value(1500); cntServerCarrier->callback((Fl_Callback*)cb_cntServerCarrier); cntServerCarrier->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerCarrier->when(FL_WHEN_CHANGED); o->value(progdefaults.ServerCarrier); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerCarrier { Fl_Counter2* o = cntServerOffset = new Fl_Counter2(106, 123, 80, 20, _("Search range (Hz)")); cntServerOffset->tooltip(_("Listen for signals within this range")); cntServerOffset->type(1); cntServerOffset->box(FL_UP_BOX); cntServerOffset->color(FL_BACKGROUND_COLOR); cntServerOffset->selection_color(FL_INACTIVE_COLOR); cntServerOffset->labeltype(FL_NORMAL_LABEL); cntServerOffset->labelfont(0); cntServerOffset->labelsize(14); cntServerOffset->labelcolor(FL_FOREGROUND_COLOR); cntServerOffset->minimum(10); cntServerOffset->maximum(500); cntServerOffset->step(10); cntServerOffset->value(100); cntServerOffset->callback((Fl_Callback*)cb_cntServerOffset); cntServerOffset->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerOffset->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerOffset { Fl_Counter2* o = cntServerACQsn = new Fl_Counter2(106, 160, 80, 20, _("Acquisition S/N (dB)")); cntServerACQsn->tooltip(_("Capture signals over this threshold")); cntServerACQsn->type(1); cntServerACQsn->box(FL_UP_BOX); cntServerACQsn->color(FL_BACKGROUND_COLOR); cntServerACQsn->selection_color(FL_INACTIVE_COLOR); cntServerACQsn->labeltype(FL_NORMAL_LABEL); cntServerACQsn->labelfont(0); cntServerACQsn->labelsize(14); cntServerACQsn->labelcolor(FL_FOREGROUND_COLOR); cntServerACQsn->minimum(3); cntServerACQsn->maximum(20); cntServerACQsn->step(1); cntServerACQsn->value(6); cntServerACQsn->callback((Fl_Callback*)cb_cntServerACQsn); cntServerACQsn->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerACQsn->when(FL_WHEN_CHANGED); o->value(progdefaults.ServerACQsn); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerACQsn { Fl_Counter2* o = cntServerAFCrange = new Fl_Counter2(106, 197, 80, 20, _("AFC range (Hz)")); cntServerAFCrange->tooltip(_("Limit AFC movement to this range")); cntServerAFCrange->type(1); cntServerAFCrange->box(FL_UP_BOX); cntServerAFCrange->color(FL_BACKGROUND_COLOR); cntServerAFCrange->selection_color(FL_INACTIVE_COLOR); cntServerAFCrange->labeltype(FL_NORMAL_LABEL); cntServerAFCrange->labelfont(0); cntServerAFCrange->labelsize(14); cntServerAFCrange->labelcolor(FL_FOREGROUND_COLOR); cntServerAFCrange->minimum(10); cntServerAFCrange->maximum(500); cntServerAFCrange->step(10); cntServerAFCrange->value(25); cntServerAFCrange->callback((Fl_Callback*)cb_cntServerAFCrange); cntServerAFCrange->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerAFCrange->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerAFCrange { Fl_Check_Button* o = btnPSKmailSweetSpot = new Fl_Check_Button(361, 86, 142, 20, _("Reset to Carrier")); btnPSKmailSweetSpot->tooltip(_("When no signal present")); btnPSKmailSweetSpot->down_box(FL_DOWN_BOX); btnPSKmailSweetSpot->value(1); btnPSKmailSweetSpot->callback((Fl_Callback*)cb_btnPSKmailSweetSpot); o->value(progdefaults.PSKmailSweetSpot); } // Fl_Check_Button* btnPSKmailSweetSpot o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 234, 490, 131, _("General")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_arq_s2n_report = new Fl_Check_Button(80, 259, 250, 20, _("Report ARQ frames average S/N")); btn_arq_s2n_report->down_box(FL_DOWN_BOX); btn_arq_s2n_report->callback((Fl_Callback*)cb_btn_arq_s2n_report); o->value(progdefaults.Pskmails2nreport); } // Fl_Check_Button* btn_arq_s2n_report o->end(); } // Fl_Group* o tabPskmail->end(); } // Fl_Group* tabPskmail { tabSpot = new Fl_Group(0, 50, 600, 340, _("Spotting")); tabSpot->hide(); { Fl_Group* o = new Fl_Group(40, 62, 525, 300, _("PSK Reporter")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnPSKRepAuto = new Fl_Check_Button(65, 103, 324, 20, _("Automatically spot callsigns in decoded text")); btnPSKRepAuto->tooltip(_("Parse all incoming text")); btnPSKRepAuto->down_box(FL_DOWN_BOX); btnPSKRepAuto->callback((Fl_Callback*)cb_btnPSKRepAuto); btnPSKRepAuto->value(progdefaults.pskrep_auto); } // Fl_Check_Button* btnPSKRepAuto { btnPSKRepLog = new Fl_Check_Button(65, 134, 327, 20, _("Send reception report when logging a QSO")); btnPSKRepLog->tooltip(_("Send report only when QSO is logged")); btnPSKRepLog->down_box(FL_DOWN_BOX); btnPSKRepLog->callback((Fl_Callback*)cb_btnPSKRepLog); btnPSKRepLog->value(progdefaults.pskrep_log); } // Fl_Check_Button* btnPSKRepLog { btnPSKRepQRG = new Fl_Check_Button(65, 166, 416, 20, _("Report rig frequency (enable only if you have rig control!)")); btnPSKRepQRG->tooltip(_("Include the transmit frequency")); btnPSKRepQRG->down_box(FL_DOWN_BOX); btnPSKRepQRG->callback((Fl_Callback*)cb_btnPSKRepQRG); btnPSKRepQRG->value(progdefaults.pskrep_qrg); } // Fl_Check_Button* btnPSKRepQRG { Fl_Check_Button* o = btn_report_when_visible = new Fl_Check_Button(65, 198, 416, 20, _("Disable spotting when signal browser(s) are not visible.")); btn_report_when_visible->tooltip(_("Check to reduce CPU load in PSK and RTTY modes.")); btn_report_when_visible->down_box(FL_DOWN_BOX); btn_report_when_visible->value(1); btn_report_when_visible->callback((Fl_Callback*)cb_btn_report_when_visible); o->value(progdefaults.report_when_visible); } // Fl_Check_Button* btn_report_when_visible { Fl_Check_Button* o = btn_pskrep_autostart = new Fl_Check_Button(65, 230, 291, 20, _("Log on to pskrep when starting fldigi")); btn_pskrep_autostart->tooltip(_("Automatically start psk reporter socket connection")); btn_pskrep_autostart->down_box(FL_DOWN_BOX); btn_pskrep_autostart->callback((Fl_Callback*)cb_btn_pskrep_autostart); o->value(progdefaults.pskrep_autostart); } // Fl_Check_Button* btn_pskrep_autostart { box_connected_to_pskrep = new Fl_Box(375, 231, 18, 18, _("Connected")); box_connected_to_pskrep->box(FL_DIAMOND_DOWN_BOX); box_connected_to_pskrep->color(FL_BACKGROUND2_COLOR); box_connected_to_pskrep->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_connected_to_pskrep { inpPSKRepHost = new Fl_Input2(108, 268, 220, 24, _("Host:")); inpPSKRepHost->tooltip(_("To whom the connection is made")); inpPSKRepHost->box(FL_DOWN_BOX); inpPSKRepHost->color(FL_BACKGROUND2_COLOR); inpPSKRepHost->selection_color(FL_SELECTION_COLOR); inpPSKRepHost->labeltype(FL_NORMAL_LABEL); inpPSKRepHost->labelfont(0); inpPSKRepHost->labelsize(14); inpPSKRepHost->labelcolor(FL_FOREGROUND_COLOR); inpPSKRepHost->callback((Fl_Callback*)cb_inpPSKRepHost); inpPSKRepHost->align(Fl_Align(FL_ALIGN_LEFT)); inpPSKRepHost->when(FL_WHEN_CHANGED); inpPSKRepHost->value(progdefaults.pskrep_host.c_str()); inpPSKRepHost->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPSKRepHost { inpPSKRepPort = new Fl_Input2(477, 268, 60, 24, _("Port:")); inpPSKRepPort->tooltip(_("Using UDP port #")); inpPSKRepPort->box(FL_DOWN_BOX); inpPSKRepPort->color(FL_BACKGROUND2_COLOR); inpPSKRepPort->selection_color(FL_SELECTION_COLOR); inpPSKRepPort->labeltype(FL_NORMAL_LABEL); inpPSKRepPort->labelfont(0); inpPSKRepPort->labelsize(14); inpPSKRepPort->labelcolor(FL_FOREGROUND_COLOR); inpPSKRepPort->callback((Fl_Callback*)cb_inpPSKRepPort); inpPSKRepPort->align(Fl_Align(FL_ALIGN_LEFT)); inpPSKRepPort->when(FL_WHEN_CHANGED); inpPSKRepPort->value(progdefaults.pskrep_port.c_str()); inpPSKRepPort->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPSKRepPort { btnPSKRepInit = new Fl_Button(457, 313, 80, 24, _("Initialize")); btnPSKRepInit->tooltip(_("Initialize the socket client")); btnPSKRepInit->callback((Fl_Callback*)cb_btnPSKRepInit); } // Fl_Button* btnPSKRepInit { boxPSKRepMsg = new Fl_Box(67, 297, 300, 48, _("")); boxPSKRepMsg->labelfont(2); boxPSKRepMsg->label(0); } // Fl_Box* boxPSKRepMsg o->end(); } // Fl_Group* o tabSpot->end(); } // Fl_Group* tabSpot { tabSweetSpot = new Fl_Group(0, 50, 600, 340, _("Sweet Spot")); tabSweetSpot->hide(); { Fl_Group* o = new Fl_Group(55, 71, 490, 75); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Input2* o = valCWsweetspot = new Fl_Value_Input2(92, 82, 65, 20, _("CW")); valCWsweetspot->tooltip(_("Default CW tracking point")); valCWsweetspot->box(FL_DOWN_BOX); valCWsweetspot->color(FL_BACKGROUND2_COLOR); valCWsweetspot->selection_color(FL_SELECTION_COLOR); valCWsweetspot->labeltype(FL_NORMAL_LABEL); valCWsweetspot->labelfont(0); valCWsweetspot->labelsize(14); valCWsweetspot->labelcolor(FL_FOREGROUND_COLOR); valCWsweetspot->minimum(200); valCWsweetspot->maximum(4000); valCWsweetspot->step(1); valCWsweetspot->value(1000); valCWsweetspot->callback((Fl_Callback*)cb_valCWsweetspot); valCWsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valCWsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valCWsweetspot { Fl_Value_Input2* o = valRTTYsweetspot = new Fl_Value_Input2(270, 82, 65, 20, _("RTTY")); valRTTYsweetspot->tooltip(_("Default RTTY tracking point")); valRTTYsweetspot->box(FL_DOWN_BOX); valRTTYsweetspot->color(FL_BACKGROUND2_COLOR); valRTTYsweetspot->selection_color(FL_SELECTION_COLOR); valRTTYsweetspot->labeltype(FL_NORMAL_LABEL); valRTTYsweetspot->labelfont(0); valRTTYsweetspot->labelsize(14); valRTTYsweetspot->labelcolor(FL_FOREGROUND_COLOR); valRTTYsweetspot->minimum(200); valRTTYsweetspot->maximum(4000); valRTTYsweetspot->step(1); valRTTYsweetspot->value(1000); valRTTYsweetspot->callback((Fl_Callback*)cb_valRTTYsweetspot); valRTTYsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valRTTYsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.RTTYsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valRTTYsweetspot { Fl_Value_Input2* o = valPSKsweetspot = new Fl_Value_Input2(470, 82, 65, 20, _("PSK et al.")); valPSKsweetspot->tooltip(_("Default for all other modems")); valPSKsweetspot->box(FL_DOWN_BOX); valPSKsweetspot->color(FL_BACKGROUND2_COLOR); valPSKsweetspot->selection_color(FL_SELECTION_COLOR); valPSKsweetspot->labeltype(FL_NORMAL_LABEL); valPSKsweetspot->labelfont(0); valPSKsweetspot->labelsize(14); valPSKsweetspot->labelcolor(FL_FOREGROUND_COLOR); valPSKsweetspot->minimum(200); valPSKsweetspot->maximum(4000); valPSKsweetspot->step(1); valPSKsweetspot->value(1000); valPSKsweetspot->callback((Fl_Callback*)cb_valPSKsweetspot); valPSKsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valPSKsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.PSKsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valPSKsweetspot { Fl_Check_Button* o = btnStartAtSweetSpot = new Fl_Check_Button(65, 112, 348, 20, _("Always start new modems at these frequencies")); btnStartAtSweetSpot->tooltip(_("ON - start at default\nOFF - keep current wf cursor position")); btnStartAtSweetSpot->down_box(FL_DOWN_BOX); btnStartAtSweetSpot->value(1); btnStartAtSweetSpot->callback((Fl_Callback*)cb_btnStartAtSweetSpot); o->value(progdefaults.StartAtSweetSpot); } // Fl_Check_Button* btnStartAtSweetSpot o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 151, 490, 60, _("K3 A1A configuation")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = btnCWIsLSB = new Fl_Check_Button(270, 172, 70, 15, _("CW is LSB")); btnCWIsLSB->tooltip(_("Select this for Elecraft K3\nOther radios should not need it.")); btnCWIsLSB->down_box(FL_DOWN_BOX); btnCWIsLSB->callback((Fl_Callback*)cb_btnCWIsLSB); o->value(progdefaults.CWIsLSB); } // Fl_Check_Button* btnCWIsLSB o->end(); } // Fl_Group* o tabSweetSpot->end(); } // Fl_Group* tabSweetSpot { tabText_IO = new Fl_Group(0, 50, 600, 340, _("Text i/o")); tabText_IO->hide(); { grpTalker = new Fl_Group(55, 132, 490, 73, _("Talker Socket (MS only)")); grpTalker->box(FL_ENGRAVED_FRAME); grpTalker->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnConnectTalker = new Fl_Light_Button(81, 152, 74, 20, _("Talker")); btnConnectTalker->selection_color(FL_DARK_GREEN); btnConnectTalker->callback((Fl_Callback*)cb_btnConnectTalker); } // Fl_Light_Button* btnConnectTalker { Fl_Box* o = new Fl_Box(160, 152, 345, 20, _("Connect/disconnect to Talker socket server")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn_auto_talk = new Fl_Check_Button(81, 180, 391, 15, _("Auto connect when fldigi opens (server must be up)")); btn_auto_talk->down_box(FL_DOWN_BOX); btn_auto_talk->callback((Fl_Callback*)cb_btn_auto_talk); o->value(progdefaults.auto_talk); } // Fl_Check_Button* btn_auto_talk grpTalker->end(); } // Fl_Group* grpTalker { Fl_Group* o = new Fl_Group(55, 72, 490, 56, _("Capture rx text to external file")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkRxStream = new Fl_Check_Button(81, 99, 175, 20, _("Enable rx text stream")); chkRxStream->tooltip(_("Send rx text to file: textout.txt")); chkRxStream->down_box(FL_DOWN_BOX); chkRxStream->callback((Fl_Callback*)cb_chkRxStream); o->value(progdefaults.speak); } // Fl_Check_Button* chkRxStream o->end(); } // Fl_Group* o tabText_IO->end(); } // Fl_Group* tabText_IO { tabDTMF = new Fl_Group(0, 50, 600, 340, _("DTMF")); tabDTMF->hide(); { Fl_Check_Button* o = chkDTMFdecode = new Fl_Check_Button(212, 103, 175, 20, _("Decode DTMF tones")); chkDTMFdecode->tooltip(_("Decode received DTMF tones")); chkDTMFdecode->down_box(FL_DOWN_BOX); chkDTMFdecode->callback((Fl_Callback*)cb_chkDTMFdecode); o->value(progdefaults.DTMFdecode); } // Fl_Check_Button* chkDTMFdecode tabDTMF->end(); } // Fl_Group* tabDTMF { tabWX = new Fl_Group(0, 50, 600, 340, _("WX")); tabWX->hide(); { Fl_Group* o = new Fl_Group(5, 60, 590, 320, _("Weather query specification")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input* o = inpWXsta = new Fl_Input(95, 131, 50, 24, _("METAR station ID code")); inpWXsta->tooltip(_("for example KMDQ for\nHuntsville-Madison Executive Airport, AL")); inpWXsta->callback((Fl_Callback*)cb_inpWXsta); inpWXsta->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.wx_sta.c_str()); } // Fl_Input* inpWXsta { Fl_Check_Button* o = btn_wx_full = new Fl_Check_Button(260, 170, 70, 15, _("Full report")); btn_wx_full->tooltip(_("Insert full METAR report")); btn_wx_full->down_box(FL_DOWN_BOX); btn_wx_full->callback((Fl_Callback*)cb_btn_wx_full); o->value(progdefaults.wx_full); } // Fl_Check_Button* btn_wx_full { Fl_Check_Button* o = btn_wx_station_name = new Fl_Check_Button(260, 194, 70, 15, _("METAR station location")); btn_wx_station_name->tooltip(_("Add geopolitical name of METAR station")); btn_wx_station_name->down_box(FL_DOWN_BOX); btn_wx_station_name->callback((Fl_Callback*)cb_btn_wx_station_name); o->value(progdefaults.wx_station_name); } // Fl_Check_Button* btn_wx_station_name { Fl_Check_Button* o = btn_wx_condx = new Fl_Check_Button(260, 220, 70, 15, _("Conditions")); btn_wx_condx->tooltip(_("current wx conditions")); btn_wx_condx->down_box(FL_DOWN_BOX); btn_wx_condx->callback((Fl_Callback*)cb_btn_wx_condx); o->value(progdefaults.wx_condx); } // Fl_Check_Button* btn_wx_condx { Fl_Check_Button* o = btn_wx_fahrenheit = new Fl_Check_Button(260, 247, 70, 15, _("Fahrenheit")); btn_wx_fahrenheit->tooltip(_("report Fahrenheit")); btn_wx_fahrenheit->down_box(FL_DOWN_BOX); btn_wx_fahrenheit->callback((Fl_Callback*)cb_btn_wx_fahrenheit); o->value(progdefaults.wx_fahrenheit); } // Fl_Check_Button* btn_wx_fahrenheit { Fl_Check_Button* o = btn_wx_celsius = new Fl_Check_Button(388, 247, 70, 15, _("Celsius")); btn_wx_celsius->tooltip(_("report Celsius")); btn_wx_celsius->down_box(FL_DOWN_BOX); btn_wx_celsius->callback((Fl_Callback*)cb_btn_wx_celsius); o->value(progdefaults.wx_celsius); } // Fl_Check_Button* btn_wx_celsius { Fl_Check_Button* o = btn_wx_mph = new Fl_Check_Button(260, 273, 70, 15, _("Miles / Hour")); btn_wx_mph->tooltip(_("report miles per hour")); btn_wx_mph->down_box(FL_DOWN_BOX); btn_wx_mph->callback((Fl_Callback*)cb_btn_wx_mph); o->value(progdefaults.wx_mph); } // Fl_Check_Button* btn_wx_mph { Fl_Check_Button* o = btn_wx_kph = new Fl_Check_Button(388, 273, 70, 15, _("kilometers / hour")); btn_wx_kph->tooltip(_("report kilometers per hour")); btn_wx_kph->down_box(FL_DOWN_BOX); btn_wx_kph->callback((Fl_Callback*)cb_btn_wx_kph); o->value(progdefaults.wx_kph); } // Fl_Check_Button* btn_wx_kph { Fl_Check_Button* o = btn_wx_inches = new Fl_Check_Button(260, 300, 70, 15, _("Inches Hg.")); btn_wx_inches->tooltip(_("report inches mercury")); btn_wx_inches->down_box(FL_DOWN_BOX); btn_wx_inches->callback((Fl_Callback*)cb_btn_wx_inches); o->value(progdefaults.wx_inches); } // Fl_Check_Button* btn_wx_inches { Fl_Check_Button* o = btn_wx_mbars = new Fl_Check_Button(388, 300, 70, 15, _("mbars")); btn_wx_mbars->tooltip(_("report millibars")); btn_wx_mbars->down_box(FL_DOWN_BOX); btn_wx_mbars->callback((Fl_Callback*)cb_btn_wx_mbars); o->value(progdefaults.wx_mbars); } // Fl_Check_Button* btn_wx_mbars { Fl_Box* o = new Fl_Box(93, 245, 156, 19, _("Temperature")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(93, 271, 156, 19, _("Wind speed/dir")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(93, 298, 156, 19, _("Barometric pressure")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_metar_search = new Fl_Button(337, 131, 130, 24, _("Search on web")); btn_metar_search->callback((Fl_Callback*)cb_btn_metar_search); } // Fl_Button* btn_metar_search { Fl_Input* o = txt_wx_url = new Fl_Input(95, 95, 430, 25, _("Access URL")); txt_wx_url->tooltip(_("Enter METAR data internet URL")); txt_wx_url->callback((Fl_Callback*)cb_txt_wx_url); txt_wx_url->when(FL_WHEN_CHANGED); o->value(progdefaults.wx_url.c_str()); } // Fl_Input* txt_wx_url { btn_default_wx_url = new Fl_Button(530, 95, 60, 25, _("Default")); btn_default_wx_url->tooltip(_("Default URL")); btn_default_wx_url->callback((Fl_Callback*)cb_btn_default_wx_url); } // Fl_Button* btn_default_wx_url o->end(); } // Fl_Group* o tabWX->end(); } // Fl_Group* tabWX { tabKML = new Fl_Group(0, 50, 600, 340, _("KML")); tabKML->hide(); { Fl_Input* o = btnKmlSaveDir = new Fl_Input(26, 75, 390, 24, _("KML files directory")); btnKmlSaveDir->tooltip(_("Where generated KML documents are stored.")); btnKmlSaveDir->callback((Fl_Callback*)cb_btnKmlSaveDir); btnKmlSaveDir->align(Fl_Align(69)); o->value(progdefaults.kml_save_dir.c_str()); } // Fl_Input* btnKmlSaveDir { Fl_Input* o = inputKmlRootFile = new Fl_Input(25, 119, 300, 24, _("KML root file")); inputKmlRootFile->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value("fldigi.kml"); } // Fl_Input* inputKmlRootFile { Fl_Counter* o = cntKmlMergeDistance = new Fl_Counter(26, 155, 100, 24, _("Minimum distance for splitting aliases (Meters)")); cntKmlMergeDistance->tooltip(_("Minimum distance for splitting alias nodes (Meters)")); cntKmlMergeDistance->minimum(0); cntKmlMergeDistance->maximum(100000); cntKmlMergeDistance->step(10); cntKmlMergeDistance->value(1000); cntKmlMergeDistance->callback((Fl_Callback*)cb_cntKmlMergeDistance); cntKmlMergeDistance->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kml_merge_distance); o->lstep(1000); } // Fl_Counter* cntKmlMergeDistance { Fl_Counter* o = cntKmlRetentionTime = new Fl_Counter(25, 191, 100, 24, _("Data retention time, in hours (0 for no limit)")); cntKmlRetentionTime->tooltip(_("Number of hours data is kept for each node. Zero means keeping everything.")); cntKmlRetentionTime->minimum(0); cntKmlRetentionTime->maximum(500); cntKmlRetentionTime->step(1); cntKmlRetentionTime->callback((Fl_Callback*)cb_cntKmlRetentionTime); cntKmlRetentionTime->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kml_retention_time); o->lstep(24); } // Fl_Counter* cntKmlRetentionTime { Fl_Spinner2* o = cntKmlRefreshInterval = new Fl_Spinner2(24, 227, 50, 24, _("KML refresh interval (seconds)")); cntKmlRefreshInterval->tooltip(_("Refresh time interval written in KML file (Seconds)")); cntKmlRefreshInterval->box(FL_NO_BOX); cntKmlRefreshInterval->color(FL_BACKGROUND_COLOR); cntKmlRefreshInterval->selection_color(FL_BACKGROUND_COLOR); cntKmlRefreshInterval->labeltype(FL_NORMAL_LABEL); cntKmlRefreshInterval->labelfont(0); cntKmlRefreshInterval->labelsize(14); cntKmlRefreshInterval->labelcolor(FL_FOREGROUND_COLOR); cntKmlRefreshInterval->value(10); cntKmlRefreshInterval->callback((Fl_Callback*)cb_cntKmlRefreshInterval); cntKmlRefreshInterval->align(Fl_Align(FL_ALIGN_RIGHT)); cntKmlRefreshInterval->when(FL_WHEN_RELEASE); o->minimum(1); o->maximum(3600); o->step(1); o->value(progdefaults.kml_refresh_interval); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntKmlRefreshInterval { Fl_ListBox* o = listbox_kml_balloon_style = new Fl_ListBox(24, 263, 201, 24, _("KML balloon display style")); listbox_kml_balloon_style->tooltip(_("KML balloon in plain text, or HTML, in plain tables or matrices.")); listbox_kml_balloon_style->box(FL_DOWN_BOX); listbox_kml_balloon_style->color(FL_BACKGROUND2_COLOR); listbox_kml_balloon_style->selection_color(FL_BACKGROUND_COLOR); listbox_kml_balloon_style->labeltype(FL_NORMAL_LABEL); listbox_kml_balloon_style->labelfont(0); listbox_kml_balloon_style->labelsize(14); listbox_kml_balloon_style->labelcolor(FL_FOREGROUND_COLOR); listbox_kml_balloon_style->callback((Fl_Callback*)cb_listbox_kml_balloon_style); listbox_kml_balloon_style->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_kml_balloon_style->when(FL_WHEN_CHANGED); o->add("Plain text|HTML tables|Single HTML matrix");o->index(progdefaults.kml_balloon_style); o->labelsize(FL_NORMAL_SIZE); listbox_kml_balloon_style->end(); } // Fl_ListBox* listbox_kml_balloon_style { Fl_Input* o = btnKmlCommand = new Fl_Input(24, 299, 246, 24, _("Command run on KML creation")); btnKmlCommand->tooltip(_("Command started when KML files are generated. Subprocesses are started once, \ and restarted if needed.")); btnKmlCommand->callback((Fl_Callback*)cb_btnKmlCommand); btnKmlCommand->align(Fl_Align(72)); o->value(progdefaults.kml_command.c_str()); } // Fl_Input* btnKmlCommand { btlTestKmlCommand = new Fl_Button(24, 335, 191, 24, _("Test command")); btlTestKmlCommand->tooltip(_("Execute command on KML files.")); btlTestKmlCommand->callback((Fl_Callback*)cb_btlTestKmlCommand); } // Fl_Button* btlTestKmlCommand { btnSelectKmlDestDir = new Fl_Button(425, 75, 101, 24, _("Change dir...")); btnSelectKmlDestDir->tooltip(_("Choose directory to store KML documents")); btnSelectKmlDestDir->callback((Fl_Callback*)cb_btnSelectKmlDestDir); } // Fl_Button* btnSelectKmlDestDir { btlPurge = new Fl_Button(336, 119, 190, 24, _("Cleanup KML data now !")); btlPurge->tooltip(_("Cleanups KML documents, empties Google Earth display.")); btlPurge->callback((Fl_Callback*)cb_btlPurge); } // Fl_Button* btlPurge { Fl_Check_Button* o = btnKmlPurgeOnStartup = new Fl_Check_Button(322, 231, 172, 15, _("Cleanup on startup")); btnKmlPurgeOnStartup->tooltip(_("Empties KML documents when starting program.")); btnKmlPurgeOnStartup->down_box(FL_DOWN_BOX); btnKmlPurgeOnStartup->callback((Fl_Callback*)cb_btnKmlPurgeOnStartup); o->value(progdefaults.kml_purge_on_startup); } // Fl_Check_Button* btnKmlPurgeOnStartup { Fl_Group* o = new Fl_Group(283, 327, 310, 40); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_kml_enabled = new Fl_Check_Button(305, 337, 242, 19, _("KML server enabled (On / Off)")); btn_kml_enabled->tooltip(_("Uncheck if KML is never used")); btn_kml_enabled->down_box(FL_DOWN_BOX); btn_kml_enabled->callback((Fl_Callback*)cb_btn_kml_enabled); o->value(progdefaults.kml_enabled); } // Fl_Check_Button* btn_kml_enabled o->end(); } // Fl_Group* o tabKML->end(); } // Fl_Group* tabKML tabsMisc->end(); } // Fl_Tabs* tabsMisc tabMisc->end(); } // Fl_Group* tabMisc { tabQRZ = new Fl_Group(0, 25, 675, 365, _("Web")); tabQRZ->hide(); { tabsQRZ = new Fl_Tabs(0, 25, 675, 365); { Fl_Group* o = new Fl_Group(0, 50, 675, 340, _("Call Lookup")); { Fl_Group* o = new Fl_Group(8, 56, 585, 131, _("Web Browser lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZWEBnotavailable = new Fl_Round_Button(48, 75, 61, 20, _("None")); btnQRZWEBnotavailable->tooltip(_("Do not use callsign lookup via web browser")); btnQRZWEBnotavailable->down_box(FL_DOWN_BOX); btnQRZWEBnotavailable->value(1); btnQRZWEBnotavailable->callback((Fl_Callback*)cb_btnQRZWEBnotavailable); o->value(progdefaults.QRZWEB == QRZWEBNONE); } // Fl_Round_Button* btnQRZWEBnotavailable { Fl_Round_Button* o = btnQRZonline = new Fl_Round_Button(48, 95, 83, 20, _("QRS on line")); btnQRZonline->tooltip(_("Visit QRZ web site")); btnQRZonline->down_box(FL_DOWN_BOX); btnQRZonline->callback((Fl_Callback*)cb_btnQRZonline); o->value(progdefaults.QRZWEB == QRZHTML); } // Fl_Round_Button* btnQRZonline { Fl_Round_Button* o = btnHAMCALLonline = new Fl_Round_Button(48, 116, 83, 20, _("HamCall online")); btnHAMCALLonline->tooltip(_("Visit Hamcall web site")); btnHAMCALLonline->down_box(FL_DOWN_BOX); btnHAMCALLonline->callback((Fl_Callback*)cb_btnHAMCALLonline); o->value(progdefaults.QRZWEB == HAMCALLHTML); } // Fl_Round_Button* btnHAMCALLonline { Fl_Round_Button* o = btnHamQTHonline = new Fl_Round_Button(48, 137, 20, 20, _("HamQTH online")); btnHamQTHonline->tooltip(_("Visit hamQTH web site")); btnHamQTHonline->down_box(FL_DOWN_BOX); btnHamQTHonline->callback((Fl_Callback*)cb_btnHamQTHonline); o->value(progdefaults.QRZWEB == HAMQTHHTML); } // Fl_Round_Button* btnHamQTHonline { Fl_Round_Button* o = btnCallookOnline = new Fl_Round_Button(48, 158, 20, 20, _("Callook online")); btnCallookOnline->tooltip(_("Visit hamQTH web site")); btnCallookOnline->down_box(FL_DOWN_BOX); btnCallookOnline->callback((Fl_Callback*)cb_btnCallookOnline); o->value(progdefaults.QRZWEB == CALLOOKHTML); } // Fl_Round_Button* btnCallookOnline { Fl_Input2* o = inp_qrzurl = new Fl_Input2(302, 69, 270, 22, _("QRZ")); inp_qrzurl->box(FL_DOWN_BOX); inp_qrzurl->color(FL_BACKGROUND2_COLOR); inp_qrzurl->selection_color(FL_SELECTION_COLOR); inp_qrzurl->labeltype(FL_NORMAL_LABEL); inp_qrzurl->labelfont(0); inp_qrzurl->labelsize(14); inp_qrzurl->labelcolor(FL_FOREGROUND_COLOR); inp_qrzurl->callback((Fl_Callback*)cb_inp_qrzurl); inp_qrzurl->align(Fl_Align(FL_ALIGN_LEFT)); inp_qrzurl->when(FL_WHEN_RELEASE); o->value(progdefaults.qrzurl.c_str()); } // Fl_Input2* inp_qrzurl { Fl_Input2* o = inp_hamcallurl = new Fl_Input2(302, 96, 270, 22, _("Hamcall")); inp_hamcallurl->box(FL_DOWN_BOX); inp_hamcallurl->color(FL_BACKGROUND2_COLOR); inp_hamcallurl->selection_color(FL_SELECTION_COLOR); inp_hamcallurl->labeltype(FL_NORMAL_LABEL); inp_hamcallurl->labelfont(0); inp_hamcallurl->labelsize(14); inp_hamcallurl->labelcolor(FL_FOREGROUND_COLOR); inp_hamcallurl->callback((Fl_Callback*)cb_inp_hamcallurl); inp_hamcallurl->align(Fl_Align(FL_ALIGN_LEFT)); inp_hamcallurl->when(FL_WHEN_RELEASE); o->value(progdefaults.hamcallurl.c_str()); } // Fl_Input2* inp_hamcallurl { Fl_Input2* o = inp_hamqthurl = new Fl_Input2(302, 124, 270, 22, _("HamQTH")); inp_hamqthurl->box(FL_DOWN_BOX); inp_hamqthurl->color(FL_BACKGROUND2_COLOR); inp_hamqthurl->selection_color(FL_SELECTION_COLOR); inp_hamqthurl->labeltype(FL_NORMAL_LABEL); inp_hamqthurl->labelfont(0); inp_hamqthurl->labelsize(14); inp_hamqthurl->labelcolor(FL_FOREGROUND_COLOR); inp_hamqthurl->callback((Fl_Callback*)cb_inp_hamqthurl); inp_hamqthurl->align(Fl_Align(FL_ALIGN_LEFT)); inp_hamqthurl->when(FL_WHEN_RELEASE); o->value(progdefaults.hamqthurl.c_str()); } // Fl_Input2* inp_hamqthurl { Fl_Input2* o = inp_callook_url = new Fl_Input2(302, 153, 270, 22, _("Callook")); inp_callook_url->tooltip(_("Callook.info web site")); inp_callook_url->box(FL_DOWN_BOX); inp_callook_url->color(FL_BACKGROUND2_COLOR); inp_callook_url->selection_color(FL_SELECTION_COLOR); inp_callook_url->labeltype(FL_NORMAL_LABEL); inp_callook_url->labelfont(0); inp_callook_url->labelsize(14); inp_callook_url->labelcolor(FL_FOREGROUND_COLOR); inp_callook_url->callback((Fl_Callback*)cb_inp_callook_url); inp_callook_url->align(Fl_Align(FL_ALIGN_LEFT)); inp_callook_url->when(FL_WHEN_RELEASE); o->value(progdefaults.callookurl.c_str()); } // Fl_Input2* inp_callook_url o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(8, 188, 585, 195, _("Data base lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZXMLnotavailable = new Fl_Round_Button(55, 211, 69, 20, _("None")); btnQRZXMLnotavailable->tooltip(_("Do not use callsign database")); btnQRZXMLnotavailable->down_box(FL_DOWN_BOX); btnQRZXMLnotavailable->value(1); btnQRZXMLnotavailable->callback((Fl_Callback*)cb_btnQRZXMLnotavailable); o->value(progdefaults.QRZXML == QRZXMLNONE); } // Fl_Round_Button* btnQRZXMLnotavailable { Fl_Round_Button* o = btnQRZcdrom = new Fl_Round_Button(55, 239, 76, 20, _("QRZ cdrom")); btnQRZcdrom->tooltip(_("Use CD or hard drive CD image")); btnQRZcdrom->down_box(FL_DOWN_BOX); btnQRZcdrom->callback((Fl_Callback*)cb_btnQRZcdrom); o->value(progdefaults.QRZXML == QRZCD); } // Fl_Round_Button* btnQRZcdrom { Fl_Round_Button* o = btnQRZsub = new Fl_Round_Button(55, 267, 137, 20, _("QRZ.com")); btnQRZsub->tooltip(_("You need a paid QRZ online\nsubscription to access")); btnQRZsub->down_box(FL_DOWN_BOX); btnQRZsub->callback((Fl_Callback*)cb_btnQRZsub); o->value(progdefaults.QRZXML == QRZNET); } // Fl_Round_Button* btnQRZsub { Fl_Round_Button* o = btnHamcall = new Fl_Round_Button(55, 296, 137, 20, _("Hamcall.net")); btnHamcall->tooltip(_("You need a paid Hamcall online\nsubscription to access")); btnHamcall->down_box(FL_DOWN_BOX); btnHamcall->callback((Fl_Callback*)cb_btnHamcall); o->value(progdefaults.QRZXML == HAMCALLNET); } // Fl_Round_Button* btnHamcall { Fl_Round_Button* o = btnHamQTH = new Fl_Round_Button(55, 324, 137, 20, _("HamQTH.com")); btnHamQTH->tooltip(_("Free service courtesy of OK")); btnHamQTH->down_box(FL_DOWN_BOX); btnHamQTH->callback((Fl_Callback*)cb_btnHamQTH); o->value(progdefaults.QRZXML == HAMQTH); } // Fl_Round_Button* btnHamQTH { Fl_Round_Button* o = btnCALLOOK = new Fl_Round_Button(55, 353, 113, 20, _("Callook.info")); btnCALLOOK->tooltip(_("Callook.info lookup (free service US callsigns only)")); btnCALLOOK->down_box(FL_DOWN_BOX); btnCALLOOK->callback((Fl_Callback*)cb_btnCALLOOK); o->value(progdefaults.QRZXML == CALLOOK); } // Fl_Round_Button* btnCALLOOK { Fl_Input2* o = txtQRZpathname = new Fl_Input2(172, 238, 401, 22); txtQRZpathname->tooltip(_("ie: /home/dave/CALLBK/ or C:/CALLBK/\nLeave blank to search for database")); txtQRZpathname->box(FL_DOWN_BOX); txtQRZpathname->color(FL_BACKGROUND2_COLOR); txtQRZpathname->selection_color(FL_SELECTION_COLOR); txtQRZpathname->labeltype(FL_NORMAL_LABEL); txtQRZpathname->labelfont(0); txtQRZpathname->labelsize(14); txtQRZpathname->labelcolor(FL_FOREGROUND_COLOR); txtQRZpathname->callback((Fl_Callback*)cb_txtQRZpathname); txtQRZpathname->align(Fl_Align(FL_ALIGN_LEFT)); txtQRZpathname->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZpathname.c_str()); txtQRZpathname->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtQRZpathname { Fl_Input2* o = inpQRZusername = new Fl_Input2(282, 273, 163, 22, _("User name")); inpQRZusername->tooltip(_("Login name for QRZ / Hamcall / HamQTH")); inpQRZusername->box(FL_DOWN_BOX); inpQRZusername->color(FL_BACKGROUND2_COLOR); inpQRZusername->selection_color(FL_SELECTION_COLOR); inpQRZusername->labeltype(FL_NORMAL_LABEL); inpQRZusername->labelfont(0); inpQRZusername->labelsize(14); inpQRZusername->labelcolor(FL_FOREGROUND_COLOR); inpQRZusername->callback((Fl_Callback*)cb_inpQRZusername); inpQRZusername->align(Fl_Align(FL_ALIGN_LEFT)); inpQRZusername->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZusername.c_str()); inpQRZusername->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZusername { Fl_Input2* o = inpQRZuserpassword = new Fl_Input2(282, 309, 163, 22, _("Password")); inpQRZuserpassword->tooltip(_("Password for QRZ / Hamcall / HamQTH")); inpQRZuserpassword->box(FL_DOWN_BOX); inpQRZuserpassword->color(FL_BACKGROUND2_COLOR); inpQRZuserpassword->selection_color(FL_SELECTION_COLOR); inpQRZuserpassword->labeltype(FL_NORMAL_LABEL); inpQRZuserpassword->labelfont(0); inpQRZuserpassword->labelsize(14); inpQRZuserpassword->labelcolor(FL_FOREGROUND_COLOR); inpQRZuserpassword->callback((Fl_Callback*)cb_inpQRZuserpassword); inpQRZuserpassword->align(Fl_Align(FL_ALIGN_LEFT)); inpQRZuserpassword->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZuserpassword.c_str()); o->type(FL_SECRET_INPUT); inpQRZuserpassword->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZuserpassword { btnQRZpasswordShow = new Fl_Button(457, 309, 76, 22, _("Show")); btnQRZpasswordShow->tooltip(_("Show password in plain text")); btnQRZpasswordShow->callback((Fl_Callback*)cb_btnQRZpasswordShow); } // Fl_Button* btnQRZpasswordShow { Fl_Group* o = new Fl_Group(177, 349, 403, 27); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_notes_address = new Fl_Check_Button(201, 355, 207, 15, _("Add address to notes field")); btn_notes_address->down_box(FL_DOWN_BOX); btn_notes_address->callback((Fl_Callback*)cb_btn_notes_address); o->value(progdefaults.notes_address); } // Fl_Check_Button* btn_notes_address { Fl_Check_Button* o = btn_clear_notes = new Fl_Check_Button(428, 355, 122, 15, _("clear old data")); btn_clear_notes->down_box(FL_DOWN_BOX); btn_clear_notes->callback((Fl_Callback*)cb_btn_clear_notes); o->value(progdefaults.clear_notes); } // Fl_Check_Button* btn_clear_notes o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { tabEQSL = new Fl_Group(0, 50, 600, 340, _("eQSL")); tabEQSL->hide(); { Fl_Input2* o = inpEQSL_www_url = new Fl_Input2(155, 59, 390, 22, _("www url")); inpEQSL_www_url->tooltip(_("Your login name")); inpEQSL_www_url->box(FL_DOWN_BOX); inpEQSL_www_url->color(FL_BACKGROUND2_COLOR); inpEQSL_www_url->selection_color(FL_SELECTION_COLOR); inpEQSL_www_url->labeltype(FL_NORMAL_LABEL); inpEQSL_www_url->labelfont(0); inpEQSL_www_url->labelsize(14); inpEQSL_www_url->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_www_url->callback((Fl_Callback*)cb_inpEQSL_www_url); inpEQSL_www_url->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_www_url->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_www_url.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_www_url { Fl_Input2* o = inpEQSL_id = new Fl_Input2(154, 82, 150, 22, _("User ID")); inpEQSL_id->tooltip(_("Your login name")); inpEQSL_id->box(FL_DOWN_BOX); inpEQSL_id->color(FL_BACKGROUND2_COLOR); inpEQSL_id->selection_color(FL_SELECTION_COLOR); inpEQSL_id->labeltype(FL_NORMAL_LABEL); inpEQSL_id->labelfont(0); inpEQSL_id->labelsize(14); inpEQSL_id->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_id->callback((Fl_Callback*)cb_inpEQSL_id); inpEQSL_id->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_id->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_id.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_id { Fl_Input2* o = inpEQSL_pwd = new Fl_Input2(154, 105, 150, 22, _("Password")); inpEQSL_pwd->tooltip(_("Your login password")); inpEQSL_pwd->box(FL_DOWN_BOX); inpEQSL_pwd->color(FL_BACKGROUND2_COLOR); inpEQSL_pwd->selection_color(FL_SELECTION_COLOR); inpEQSL_pwd->labeltype(FL_NORMAL_LABEL); inpEQSL_pwd->labelfont(0); inpEQSL_pwd->labelsize(14); inpEQSL_pwd->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_pwd->callback((Fl_Callback*)cb_inpEQSL_pwd); inpEQSL_pwd->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_pwd->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_pwd.c_str()); o->type(FL_SECRET_INPUT); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_pwd { btnEQSL_pwd_show = new Fl_Button(310, 105, 70, 22, _("Show")); btnEQSL_pwd_show->tooltip(_("Show password in plain text")); btnEQSL_pwd_show->callback((Fl_Callback*)cb_btnEQSL_pwd_show); } // Fl_Button* btnEQSL_pwd_show { Fl_Input2* o = inpEQSL_nick = new Fl_Input2(154, 129, 150, 22, _("QTH Nickname")); inpEQSL_nick->tooltip(_("Your login name")); inpEQSL_nick->box(FL_DOWN_BOX); inpEQSL_nick->color(FL_BACKGROUND2_COLOR); inpEQSL_nick->selection_color(FL_SELECTION_COLOR); inpEQSL_nick->labeltype(FL_NORMAL_LABEL); inpEQSL_nick->labelfont(0); inpEQSL_nick->labelsize(14); inpEQSL_nick->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_nick->callback((Fl_Callback*)cb_inpEQSL_nick); inpEQSL_nick->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_nick->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_nick.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_nick { btn_verify_eqsl = new Fl_Button(475, 129, 70, 22, _("Verify")); btn_verify_eqsl->tooltip(_("Verify database with eQSL download file")); btn_verify_eqsl->callback((Fl_Callback*)cb_btn_verify_eqsl); } // Fl_Button* btn_verify_eqsl { Fl_Group* o = new Fl_Group(42, 157, 516, 223, _("Options")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_send_when_logged = new Fl_Check_Button(126, 166, 70, 15, _("send when logged (log button, , )")); btn_send_when_logged->tooltip(_("automatic data upload")); btn_send_when_logged->down_box(FL_DOWN_BOX); btn_send_when_logged->callback((Fl_Callback*)cb_btn_send_when_logged); o->value(progdefaults.eqsl_when_logged); } // Fl_Check_Button* btn_send_when_logged { Fl_Check_Button* o = btn_send_datetime_off = new Fl_Check_Button(126, 186, 70, 15, _("Use date/time off for log entry")); btn_send_datetime_off->tooltip(_("default uses date/time on")); btn_send_datetime_off->down_box(FL_DOWN_BOX); btn_send_datetime_off->callback((Fl_Callback*)cb_btn_send_datetime_off); o->value(progdefaults.eqsl_datetime_off); } // Fl_Check_Button* btn_send_datetime_off { Fl_Check_Button* o = btn_show_eqsl_delivery = new Fl_Check_Button(126, 206, 70, 15, _("Show delivery message")); btn_show_eqsl_delivery->tooltip(_("Display timed delivery message if enabled")); btn_show_eqsl_delivery->down_box(FL_DOWN_BOX); btn_show_eqsl_delivery->callback((Fl_Callback*)cb_btn_show_eqsl_delivery); o->value(progdefaults.eqsl_show_delivery); } // Fl_Check_Button* btn_show_eqsl_delivery { Fl_Input2* o = txt_eqsl_default_message = new Fl_Input2(95, 247, 451, 40, _("Default message")); txt_eqsl_default_message->tooltip(_("default text to send with etc")); txt_eqsl_default_message->type(4); txt_eqsl_default_message->box(FL_DOWN_BOX); txt_eqsl_default_message->color(FL_BACKGROUND2_COLOR); txt_eqsl_default_message->selection_color(FL_SELECTION_COLOR); txt_eqsl_default_message->labeltype(FL_NORMAL_LABEL); txt_eqsl_default_message->labelfont(0); txt_eqsl_default_message->labelsize(14); txt_eqsl_default_message->labelcolor(FL_FOREGROUND_COLOR); txt_eqsl_default_message->callback((Fl_Callback*)cb_txt_eqsl_default_message); txt_eqsl_default_message->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_eqsl_default_message->when(FL_WHEN_CHANGED); o->value(progdefaults.eqsl_default_message.c_str()); } // Fl_Input2* txt_eqsl_default_message { Fl_Group* o = new Fl_Group(58, 293, 481, 81, _("Text Tags (tags use {} delimiters)")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { eqsl_txt1 = new Fl_Box(64, 333, 220, 17, _(" {CALL} other ops call sign")); eqsl_txt1->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt1 { eqsl_txt2 = new Fl_Box(62, 352, 220, 17, _(" {MODE} full mode / submode")); eqsl_txt2->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt2 { eqsl_txt3 = new Fl_Box(310, 333, 220, 17, _("{NAME} other ops name")); eqsl_txt3->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt3 { new Fl_Box(80, 312, 440, 17, _("These tags can also be used in ")); } // Fl_Box* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabEQSL->end(); } // Fl_Group* tabEQSL { tabLOTW = new Fl_Group(0, 50, 600, 340, _("LoTW")); tabLOTW->hide(); { Fl_Input2* o = txt_lotw_pathname = new Fl_Input2(82, 91, 422, 24, _("tqsl:")); txt_lotw_pathname->tooltip(_("Enter full path-filename for tqsl executable")); txt_lotw_pathname->box(FL_DOWN_BOX); txt_lotw_pathname->color(FL_BACKGROUND2_COLOR); txt_lotw_pathname->selection_color(FL_SELECTION_COLOR); txt_lotw_pathname->labeltype(FL_NORMAL_LABEL); txt_lotw_pathname->labelfont(0); txt_lotw_pathname->labelsize(14); txt_lotw_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_lotw_pathname->callback((Fl_Callback*)cb_txt_lotw_pathname); txt_lotw_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_lotw_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.lotw_pathname.c_str()); } // Fl_Input2* txt_lotw_pathname { Fl_Input2* o = inpLOTW_pwd = new Fl_Input2(82, 126, 250, 24, _("Password")); inpLOTW_pwd->tooltip(_("Your tqsl login password")); inpLOTW_pwd->box(FL_DOWN_BOX); inpLOTW_pwd->color(FL_BACKGROUND2_COLOR); inpLOTW_pwd->selection_color(FL_SELECTION_COLOR); inpLOTW_pwd->labeltype(FL_NORMAL_LABEL); inpLOTW_pwd->labelfont(0); inpLOTW_pwd->labelsize(14); inpLOTW_pwd->labelcolor(FL_FOREGROUND_COLOR); inpLOTW_pwd->callback((Fl_Callback*)cb_inpLOTW_pwd); inpLOTW_pwd->align(Fl_Align(FL_ALIGN_LEFT)); inpLOTW_pwd->when(FL_WHEN_RELEASE); o->value(progdefaults.lotw_pwd.c_str()); o->type(FL_SECRET_INPUT); inpLOTW_pwd->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpLOTW_pwd { Fl_Check_Button* o = btn_submit_lotw_password = new Fl_Check_Button(42, 161, 234, 16, _("Use password for tqsl access")); btn_submit_lotw_password->tooltip(_("Submit password with each upload")); btn_submit_lotw_password->down_box(FL_DOWN_BOX); btn_submit_lotw_password->callback((Fl_Callback*)cb_btn_submit_lotw_password); o->value(progdefaults.submit_lotw_password); } // Fl_Check_Button* btn_submit_lotw_password { Fl_Input2* o = inpLOTW_location = new Fl_Input2(82, 188, 250, 24, _("Location")); inpLOTW_location->tooltip(_("tqsl station location")); inpLOTW_location->box(FL_DOWN_BOX); inpLOTW_location->color(FL_BACKGROUND2_COLOR); inpLOTW_location->selection_color(FL_SELECTION_COLOR); inpLOTW_location->labeltype(FL_NORMAL_LABEL); inpLOTW_location->labelfont(0); inpLOTW_location->labelsize(14); inpLOTW_location->labelcolor(FL_FOREGROUND_COLOR); inpLOTW_location->callback((Fl_Callback*)cb_inpLOTW_location); inpLOTW_location->align(Fl_Align(FL_ALIGN_LEFT)); inpLOTW_location->when(FL_WHEN_RELEASE); o->value(progdefaults.lotw_location.c_str()); inpLOTW_pwd->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpLOTW_location { btn_select_lotw = new Fl_Button(525, 91, 70, 24, _("Locate")); btn_select_lotw->tooltip(_("Locate tqsl executable")); btn_select_lotw->callback((Fl_Callback*)cb_btn_select_lotw); } // Fl_Button* btn_select_lotw { Fl_Check_Button* o = btn_lotw_quiet_mode = new Fl_Check_Button(42, 223, 309, 16, _("Quiet mode [-q], do not open tqsl dialog")); btn_lotw_quiet_mode->tooltip(_("Operate tqsl in batch mode (no dialog)")); btn_lotw_quiet_mode->down_box(FL_DOWN_BOX); btn_lotw_quiet_mode->callback((Fl_Callback*)cb_btn_lotw_quiet_mode); o->value(progdefaults.lotw_quiet_mode); } // Fl_Check_Button* btn_lotw_quiet_mode { Fl_Check_Button* o = btn_submit_lotw = new Fl_Check_Button(42, 247, 289, 16, _("Send QSO data to LoTW when logged")); btn_submit_lotw->tooltip(_("Submit each QSO as logged")); btn_submit_lotw->down_box(FL_DOWN_BOX); btn_submit_lotw->callback((Fl_Callback*)cb_btn_submit_lotw); o->value(progdefaults.submit_lotw); } // Fl_Check_Button* btn_submit_lotw { btn_export_lotw = new Fl_Button(15, 273, 70, 24, _("Export")); btn_export_lotw->tooltip(_("Export records for LoTW upload")); btn_export_lotw->callback((Fl_Callback*)cb_btn_export_lotw); } // Fl_Button* btn_export_lotw { btn_review_lotw = new Fl_Button(15, 300, 70, 24, _("Check")); btn_review_lotw->tooltip(_("Review lotw.adif file before sending with tqsl")); btn_review_lotw->callback((Fl_Callback*)cb_btn_review_lotw); } // Fl_Button* btn_review_lotw { btn_send_lotw = new Fl_Button(15, 328, 70, 24, _("Send")); btn_send_lotw->tooltip(_("Send lotw.adif via tqsl")); btn_send_lotw->callback((Fl_Callback*)cb_btn_send_lotw); } // Fl_Button* btn_send_lotw { Fl_Box* o = new Fl_Box(90, 273, 346, 24, _("Export logbook records for LoTW upload")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(90, 300, 346, 24, _("Review / edit the exported LoTW upload adif file")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(90, 328, 346, 24, _("Submit the upload adif file to LoTW")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(11, 60, 574, 24, _("You must have tqsl installed and it\'s location recorded for LoTW updates to \ work!")); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { btnLOTW_pwd_show = new Fl_Button(340, 126, 70, 24, _("Show")); btnLOTW_pwd_show->tooltip(_("Show password in plain text")); btnLOTW_pwd_show->callback((Fl_Callback*)cb_btnLOTW_pwd_show); } // Fl_Button* btnLOTW_pwd_show { Fl_Box* o = new Fl_Box(339, 188, 211, 24, _("Use this tqsl station location")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_verify_lotw = new Fl_Button(15, 356, 70, 24, _("Match")); btn_verify_lotw->tooltip(_("Verify database with LoTW download file")); btn_verify_lotw->callback((Fl_Callback*)cb_btn_verify_lotw); } // Fl_Button* btn_verify_lotw { Fl_Box* o = new Fl_Box(90, 356, 346, 24, _("Match logbook records with LoTW download file")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_view_unmatched = new Fl_Button(456, 356, 139, 24, _("View Unmatched")); btn_view_unmatched->tooltip(_("Verify database with LoTW download file")); btn_view_unmatched->callback((Fl_Callback*)cb_btn_view_unmatched); btn_view_unmatched->deactivate(); } // Fl_Button* btn_view_unmatched { Fl_Check_Button* o = btn_show_lotw_delivery = new Fl_Check_Button(341, 247, 70, 15, _("Show delivery message")); btn_show_lotw_delivery->tooltip(_("Display timed delivery message if enabled")); btn_show_lotw_delivery->down_box(FL_DOWN_BOX); btn_show_lotw_delivery->callback((Fl_Callback*)cb_btn_show_lotw_delivery); o->value(progdefaults.lotw_show_delivery); } // Fl_Check_Button* btn_show_lotw_delivery tabLOTW->end(); } // Fl_Group* tabLOTW tabsQRZ->end(); } // Fl_Tabs* tabsQRZ tabQRZ->end(); } // Fl_Group* tabQRZ { tabAutoStart = new Fl_Group(0, 25, 600, 365, _("Autostart")); tabAutoStart->callback((Fl_Callback*)cb_tabAutoStart); tabAutoStart->when(FL_WHEN_CHANGED); tabAutoStart->hide(); { Fl_Group* o = new Fl_Group(2, 32, 596, 335, _("Auto start programs with fldigi")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Input2* o = txt_auto_flrig_pathname = new Fl_Input2(63, 71, 310, 24, _("flrig:")); txt_auto_flrig_pathname->tooltip(_("Enter full path-filename for flrig")); txt_auto_flrig_pathname->box(FL_DOWN_BOX); txt_auto_flrig_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flrig_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flrig_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flrig_pathname->labelfont(0); txt_auto_flrig_pathname->labelsize(14); txt_auto_flrig_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flrig_pathname->callback((Fl_Callback*)cb_txt_auto_flrig_pathname); txt_auto_flrig_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flrig_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flrig_pathname.c_str()); } // Fl_Input2* txt_auto_flrig_pathname { btn_select_flrig = new Fl_Button(395, 71, 70, 24, _("Locate")); btn_select_flrig->tooltip(_("Locate flrig executable")); btn_select_flrig->callback((Fl_Callback*)cb_btn_select_flrig); } // Fl_Button* btn_select_flrig { Fl_Input2* o = txt_auto_flamp_pathname = new Fl_Input2(63, 109, 310, 24, _("flamp:")); txt_auto_flamp_pathname->tooltip(_("Enter full path-filename for flamp")); txt_auto_flamp_pathname->box(FL_DOWN_BOX); txt_auto_flamp_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flamp_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flamp_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flamp_pathname->labelfont(0); txt_auto_flamp_pathname->labelsize(14); txt_auto_flamp_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flamp_pathname->callback((Fl_Callback*)cb_txt_auto_flamp_pathname); txt_auto_flamp_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flamp_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flamp_pathname.c_str()); } // Fl_Input2* txt_auto_flamp_pathname { btn_select_auto_flamp = new Fl_Button(395, 109, 70, 24, _("Locate")); btn_select_auto_flamp->tooltip(_("Locate flamp executable")); btn_select_auto_flamp->callback((Fl_Callback*)cb_btn_select_auto_flamp); } // Fl_Button* btn_select_auto_flamp { Fl_Input2* o = txt_auto_flnet_pathname = new Fl_Input2(63, 147, 310, 24, _("flnet:")); txt_auto_flnet_pathname->tooltip(_("Enter full path-filename for flnet")); txt_auto_flnet_pathname->box(FL_DOWN_BOX); txt_auto_flnet_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flnet_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flnet_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flnet_pathname->labelfont(0); txt_auto_flnet_pathname->labelsize(14); txt_auto_flnet_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flnet_pathname->callback((Fl_Callback*)cb_txt_auto_flnet_pathname); txt_auto_flnet_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flnet_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flnet_pathname.c_str()); } // Fl_Input2* txt_auto_flnet_pathname { btn_select_auto_flnet = new Fl_Button(395, 147, 70, 24, _("Locate")); btn_select_auto_flnet->tooltip(_("Locate flnet executable")); btn_select_auto_flnet->callback((Fl_Callback*)cb_btn_select_auto_flnet); } // Fl_Button* btn_select_auto_flnet { Fl_Input2* o = txt_auto_fllog_pathname = new Fl_Input2(63, 186, 310, 24, _("fllog:")); txt_auto_fllog_pathname->tooltip(_("Enter full path-filename for fllog")); txt_auto_fllog_pathname->box(FL_DOWN_BOX); txt_auto_fllog_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_fllog_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_fllog_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_fllog_pathname->labelfont(0); txt_auto_fllog_pathname->labelsize(14); txt_auto_fllog_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_fllog_pathname->callback((Fl_Callback*)cb_txt_auto_fllog_pathname); txt_auto_fllog_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_fllog_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_fllog_pathname.c_str()); } // Fl_Input2* txt_auto_fllog_pathname { btn_select_fllog = new Fl_Button(395, 186, 70, 24, _("Locate")); btn_select_fllog->tooltip(_("Locate fllog executable")); btn_select_fllog->callback((Fl_Callback*)cb_btn_select_fllog); } // Fl_Button* btn_select_fllog { Fl_Input2* o = txt_auto_prog1_pathname = new Fl_Input2(63, 224, 310, 24, _("Prog 1:")); txt_auto_prog1_pathname->tooltip(_("Enter full path-filename for external program")); txt_auto_prog1_pathname->box(FL_DOWN_BOX); txt_auto_prog1_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog1_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog1_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog1_pathname->labelfont(0); txt_auto_prog1_pathname->labelsize(14); txt_auto_prog1_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog1_pathname->callback((Fl_Callback*)cb_txt_auto_prog1_pathname); txt_auto_prog1_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog1_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog1_pathname.c_str()); } // Fl_Input2* txt_auto_prog1_pathname { btn_select_prog1 = new Fl_Button(395, 224, 70, 24, _("Locate")); btn_select_prog1->tooltip(_("Locate program #1 executable")); btn_select_prog1->callback((Fl_Callback*)cb_btn_select_prog1); } // Fl_Button* btn_select_prog1 { Fl_Input2* o = txt_auto_prog2_pathname = new Fl_Input2(63, 262, 310, 24, _("Prog 2:")); txt_auto_prog2_pathname->tooltip(_("Enter full path-filename for external program")); txt_auto_prog2_pathname->box(FL_DOWN_BOX); txt_auto_prog2_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog2_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog2_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog2_pathname->labelfont(0); txt_auto_prog2_pathname->labelsize(14); txt_auto_prog2_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog2_pathname->callback((Fl_Callback*)cb_txt_auto_prog2_pathname); txt_auto_prog2_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog2_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog2_pathname.c_str()); } // Fl_Input2* txt_auto_prog2_pathname { btn_select_prog2 = new Fl_Button(395, 262, 70, 24, _("Locate")); btn_select_prog2->tooltip(_("Locate program #2 executable")); btn_select_prog2->callback((Fl_Callback*)cb_btn_select_prog2); } // Fl_Button* btn_select_prog2 { Fl_Input2* o = txt_auto_prog3_pathname = new Fl_Input2(63, 301, 310, 24, _("Prog 3:")); txt_auto_prog3_pathname->tooltip(_("Enter full path-filename for external program")); txt_auto_prog3_pathname->box(FL_DOWN_BOX); txt_auto_prog3_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog3_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog3_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog3_pathname->labelfont(0); txt_auto_prog3_pathname->labelsize(14); txt_auto_prog3_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog3_pathname->callback((Fl_Callback*)cb_txt_auto_prog3_pathname); txt_auto_prog3_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog3_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog3_pathname.c_str()); } // Fl_Input2* txt_auto_prog3_pathname { btn_select_prog3 = new Fl_Button(395, 301, 70, 24, _("Locate")); btn_select_prog3->tooltip(_("Locate program #3 executable")); btn_select_prog3->callback((Fl_Callback*)cb_btn_select_prog3); } // Fl_Button* btn_select_prog3 { Fl_Check_Button* o = btn_flrig_auto_enable = new Fl_Check_Button(475, 75, 19, 15, _("Enable\n-")); btn_flrig_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flrig_auto_enable->down_box(FL_DOWN_BOX); btn_flrig_auto_enable->callback((Fl_Callback*)cb_btn_flrig_auto_enable); btn_flrig_auto_enable->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.flrig_auto_enable); } // Fl_Check_Button* btn_flrig_auto_enable { Fl_Check_Button* o = btn_flamp_auto_enable = new Fl_Check_Button(475, 113, 23, 15); btn_flamp_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flamp_auto_enable->down_box(FL_DOWN_BOX); btn_flamp_auto_enable->callback((Fl_Callback*)cb_btn_flamp_auto_enable); o->value(progdefaults.flamp_auto_enable); } // Fl_Check_Button* btn_flamp_auto_enable { Fl_Check_Button* o = btn_flnet_auto_enable = new Fl_Check_Button(475, 151, 23, 15); btn_flnet_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flnet_auto_enable->down_box(FL_DOWN_BOX); btn_flnet_auto_enable->callback((Fl_Callback*)cb_btn_flnet_auto_enable); o->value(progdefaults.flnet_auto_enable); } // Fl_Check_Button* btn_flnet_auto_enable { Fl_Check_Button* o = btn_fllog_auto_enable = new Fl_Check_Button(475, 190, 23, 15); btn_fllog_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_fllog_auto_enable->down_box(FL_DOWN_BOX); btn_fllog_auto_enable->callback((Fl_Callback*)cb_btn_fllog_auto_enable); o->value(progdefaults.fllog_auto_enable); } // Fl_Check_Button* btn_fllog_auto_enable { Fl_Check_Button* o = btn_prog1_auto_enable = new Fl_Check_Button(475, 228, 23, 15); btn_prog1_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog1_auto_enable->down_box(FL_DOWN_BOX); btn_prog1_auto_enable->callback((Fl_Callback*)cb_btn_prog1_auto_enable); o->value(progdefaults.prog1_auto_enable); } // Fl_Check_Button* btn_prog1_auto_enable { Fl_Check_Button* o = btn_prog2_auto_enable = new Fl_Check_Button(475, 266, 23, 15); btn_prog2_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog2_auto_enable->down_box(FL_DOWN_BOX); btn_prog2_auto_enable->callback((Fl_Callback*)cb_btn_prog2_auto_enable); o->value(progdefaults.prog2_auto_enable); } // Fl_Check_Button* btn_prog2_auto_enable { Fl_Check_Button* o = btn_prog3_auto_enable = new Fl_Check_Button(475, 305, 23, 15); btn_prog3_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog3_auto_enable->down_box(FL_DOWN_BOX); btn_prog3_auto_enable->callback((Fl_Callback*)cb_btn_prog3_auto_enable); o->value(progdefaults.prog3_auto_enable); } // Fl_Check_Button* btn_prog3_auto_enable { btn_test_flrig = new Fl_Button(505, 71, 70, 24, _("Test")); btn_test_flrig->tooltip(_("Start flrig")); btn_test_flrig->callback((Fl_Callback*)cb_btn_test_flrig); } // Fl_Button* btn_test_flrig { btn_test_flamp = new Fl_Button(505, 109, 70, 24, _("Test")); btn_test_flamp->tooltip(_("Start flamp")); btn_test_flamp->callback((Fl_Callback*)cb_btn_test_flamp); } // Fl_Button* btn_test_flamp { btn_test_flnet = new Fl_Button(505, 147, 70, 24, _("Test")); btn_test_flnet->tooltip(_("Start flnet")); btn_test_flnet->callback((Fl_Callback*)cb_btn_test_flnet); } // Fl_Button* btn_test_flnet { btn_test_fllog = new Fl_Button(505, 186, 70, 24, _("Test")); btn_test_fllog->tooltip(_("Start fllog")); btn_test_fllog->callback((Fl_Callback*)cb_btn_test_fllog); } // Fl_Button* btn_test_fllog { btn_test_prog1 = new Fl_Button(505, 224, 70, 24, _("Test")); btn_test_prog1->tooltip(_("Start prog1")); btn_test_prog1->callback((Fl_Callback*)cb_btn_test_prog1); } // Fl_Button* btn_test_prog1 { btn_test_prog2 = new Fl_Button(505, 262, 70, 24, _("Test")); btn_test_prog2->tooltip(_("Start prog2")); btn_test_prog2->callback((Fl_Callback*)cb_btn_test_prog2); } // Fl_Button* btn_test_prog2 { btn_test_prog3 = new Fl_Button(505, 301, 70, 24, _("Test")); btn_test_prog3->tooltip(_("Start prog3")); btn_test_prog3->callback((Fl_Callback*)cb_btn_test_prog3); } // Fl_Button* btn_test_prog3 o->end(); } // Fl_Group* o tabAutoStart->end(); } // Fl_Group* tabAutoStart { tabIO = new Fl_Group(0, 25, 600, 365, _("IO")); tabIO->callback((Fl_Callback*)cb_tabIO); tabIO->hide(); { Fl_Group* o = new Fl_Group(6, 34, 588, 102); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnDisable_p2p_io_widgets = new Fl_Check_Button(12, 112, 85, 20, _("Lock")); btnDisable_p2p_io_widgets->tooltip(_("Allow/Disallow Changes")); btnDisable_p2p_io_widgets->down_box(FL_DOWN_BOX); btnDisable_p2p_io_widgets->callback((Fl_Callback*)cb_btnDisable_p2p_io_widgets); o->value(progStatus.ip_lock); } // Fl_Check_Button* btnDisable_p2p_io_widgets { Fl_Check_Button* o = btnEnable_arq = new Fl_Check_Button(96, 112, 115, 20, _("Enable ARQ")); btnEnable_arq->tooltip(_("Used For PSKMail and FLDIGI Suite of Programs")); btnEnable_arq->type(102); btnEnable_arq->down_box(FL_DOWN_BOX); btnEnable_arq->callback((Fl_Callback*)cb_btnEnable_arq); if(progStatus.data_io_enabled == ARQ_IO) o->value(true); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_arq { Fl_Check_Button* o = btnEnable_kiss = new Fl_Check_Button(221, 112, 115, 20, _("Enable KISS")); btnEnable_kiss->tooltip(_("Used for BPQ32")); btnEnable_kiss->type(102); btnEnable_kiss->down_box(FL_DOWN_BOX); btnEnable_kiss->callback((Fl_Callback*)cb_btnEnable_kiss); if(progStatus.data_io_enabled == KISS_IO) o->value(true); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_kiss { new Fl_Box(8, 37, 582, 72, _("Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\nEnable KIS\ S for programs that supports TCP/UDP and TNC-2 KISS protocol.\nOnly one interf\ ace (ARQ/KISS) can be active at any given time.\nKISS/ARQ/XML Addr/Port change\ s require program restart.")); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(6, 138, 588, 85, _("KISS")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnDefault_kiss_ip = new Fl_Button(505, 195, 80, 25, _("Default")); btnDefault_kiss_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_kiss_ip->callback((Fl_Callback*)cb_btnDefault_kiss_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_kiss_ip { Fl_Input2* o = txtKiss_ip_address = new Fl_Input2(55, 195, 230, 25, _("Addr")); txtKiss_ip_address->tooltip(_("IP Address for KISS interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: i\ .e. localhost")); txtKiss_ip_address->box(FL_DOWN_BOX); txtKiss_ip_address->color(FL_BACKGROUND2_COLOR); txtKiss_ip_address->selection_color(FL_SELECTION_COLOR); txtKiss_ip_address->labeltype(FL_NORMAL_LABEL); txtKiss_ip_address->labelfont(0); txtKiss_ip_address->labelsize(14); txtKiss_ip_address->labelcolor(FL_FOREGROUND_COLOR); txtKiss_ip_address->callback((Fl_Callback*)cb_txtKiss_ip_address); txtKiss_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txtKiss_ip_address->when(FL_WHEN_CHANGED); txtKiss_ip_address->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.kiss_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtKiss_ip_address { Fl_Input2* o = txtKiss_ip_io_port_no = new Fl_Input2(330, 195, 55, 25, _("I/O")); txtKiss_ip_io_port_no->tooltip(_("IP Address Port Number")); txtKiss_ip_io_port_no->box(FL_DOWN_BOX); txtKiss_ip_io_port_no->color(FL_BACKGROUND2_COLOR); txtKiss_ip_io_port_no->selection_color(FL_SELECTION_COLOR); txtKiss_ip_io_port_no->labeltype(FL_NORMAL_LABEL); txtKiss_ip_io_port_no->labelfont(0); txtKiss_ip_io_port_no->labelsize(14); txtKiss_ip_io_port_no->labelcolor(FL_FOREGROUND_COLOR); txtKiss_ip_io_port_no->callback((Fl_Callback*)cb_txtKiss_ip_io_port_no); txtKiss_ip_io_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtKiss_ip_io_port_no->when(FL_WHEN_CHANGED); txtKiss_ip_io_port_no->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.kiss_io_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtKiss_ip_io_port_no { Fl_Input2* o = txtKiss_ip_out_port_no = new Fl_Input2(425, 195, 55, 25, _("O")); txtKiss_ip_out_port_no->tooltip(_("Output port number when same IP address used")); txtKiss_ip_out_port_no->box(FL_DOWN_BOX); txtKiss_ip_out_port_no->color(FL_BACKGROUND2_COLOR); txtKiss_ip_out_port_no->selection_color(FL_SELECTION_COLOR); txtKiss_ip_out_port_no->labeltype(FL_NORMAL_LABEL); txtKiss_ip_out_port_no->labelfont(0); txtKiss_ip_out_port_no->labelsize(14); txtKiss_ip_out_port_no->labelcolor(FL_FOREGROUND_COLOR); txtKiss_ip_out_port_no->callback((Fl_Callback*)cb_txtKiss_ip_out_port_no); txtKiss_ip_out_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtKiss_ip_out_port_no->when(FL_WHEN_CHANGED); txtKiss_ip_out_port_no->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.kiss_out_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtKiss_ip_out_port_no { Fl_Check_Button* o = btnEnable_dual_port = new Fl_Check_Button(131, 142, 140, 20, _("DP")); btnEnable_dual_port->tooltip(_("Enable when both programs are using the same IP address")); btnEnable_dual_port->down_box(FL_DOWN_BOX); btnEnable_dual_port->callback((Fl_Callback*)cb_btnEnable_dual_port); if(progdefaults.kiss_dual_port_enabled) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_dual_port { Fl_Button* o = btn_restart_kiss = new Fl_Button(505, 193, 82, 25, _("Restart")); btn_restart_kiss->callback((Fl_Callback*)cb_btn_restart_kiss); btn_restart_kiss->hide(); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_restart_kiss { Fl_Button* o = btn_connect_kiss_io = new Fl_Button(504, 165, 82, 25, _("Start")); btn_connect_kiss_io->tooltip(_("Return KISS TCP IO connection to a Listening state")); btn_connect_kiss_io->callback((Fl_Callback*)cb_btn_connect_kiss_io); (progStatus.ip_lock || !progdefaults.kiss_tcp_io) ? o->deactivate() : o->activate(); } // Fl_Button* btn_connect_kiss_io { Fl_Check_Button* o = btnKissTCPIO = new Fl_Check_Button(280, 142, 70, 20, _("TCP/IP")); btnKissTCPIO->tooltip(_("Check to enable TCP/IP IO Connection")); btnKissTCPIO->down_box(FL_DOWN_BOX); btnKissTCPIO->callback((Fl_Callback*)cb_btnKissTCPIO); if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnKissTCPIO { Fl_Check_Button* o = btnKissUDPIO = new Fl_Check_Button(55, 142, 70, 20, _("UDP/IP")); btnKissUDPIO->tooltip(_("Check to enable UDP/IP IO")); btnKissUDPIO->down_box(FL_DOWN_BOX); btnKissUDPIO->callback((Fl_Callback*)cb_btnKissUDPIO); if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnKissUDPIO { Fl_Check_Button* o = btnKissTCPListen = new Fl_Check_Button(360, 142, 95, 20, _("Listen / Bind")); btnKissTCPListen->tooltip(_("Monitor for TCP connection.")); btnKissTCPListen->down_box(FL_DOWN_BOX); btnKissTCPListen->callback((Fl_Callback*)cb_btnKissTCPListen); if(progStatus.kiss_tcp_listen) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnKissTCPListen { Fl_Check_Button* o = btnEnable_7bit_modem_inhibit = new Fl_Check_Button(55, 165, 140, 20, _("Inhibit 7bit Modem")); btnEnable_7bit_modem_inhibit->tooltip(_("Inhibit 7 bit modem change notice on user or RSID reception")); btnEnable_7bit_modem_inhibit->down_box(FL_DOWN_BOX); btnEnable_7bit_modem_inhibit->callback((Fl_Callback*)cb_btnEnable_7bit_modem_inhibit); if(progdefaults.kiss_io_modem_change_inhibit) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_7bit_modem_inhibit { Fl_Check_Button* o = btnEnable_auto_connect = new Fl_Check_Button(280, 165, 155, 20, _("Auto Connect / Retry")); btnEnable_auto_connect->tooltip(_("Connect to host program on FLDIGI start up")); btnEnable_auto_connect->down_box(FL_DOWN_BOX); btnEnable_auto_connect->callback((Fl_Callback*)cb_btnEnable_auto_connect); if(progdefaults.tcp_udp_auto_connect) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_auto_connect { Fl_Check_Button* o = btnEnable_ax25_decode = new Fl_Check_Button(470, 142, 115, 20, _("AX25 Decode")); btnEnable_ax25_decode->tooltip(_("Decode AX25 Packets into human readable form")); btnEnable_ax25_decode->down_box(FL_DOWN_BOX); btnEnable_ax25_decode->callback((Fl_Callback*)cb_btnEnable_ax25_decode); if(progdefaults.ax25_decode_enabled) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_ax25_decode o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(6, 225, 588, 35, _("ARQ")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = txtArq_ip_address = new Fl_Input2(56, 229, 230, 25, _("Addr")); txtArq_ip_address->tooltip(_("IP Address for ARQ interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: i.\ e. localhost")); txtArq_ip_address->box(FL_DOWN_BOX); txtArq_ip_address->color(FL_BACKGROUND2_COLOR); txtArq_ip_address->selection_color(FL_SELECTION_COLOR); txtArq_ip_address->labeltype(FL_NORMAL_LABEL); txtArq_ip_address->labelfont(0); txtArq_ip_address->labelsize(14); txtArq_ip_address->labelcolor(FL_FOREGROUND_COLOR); txtArq_ip_address->callback((Fl_Callback*)cb_txtArq_ip_address); txtArq_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txtArq_ip_address->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.arq_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtArq_ip_address { Fl_Input2* o = txtArq_ip_port_no = new Fl_Input2(330, 229, 55, 25, _("Port")); txtArq_ip_port_no->tooltip(_("IP Address Port Number")); txtArq_ip_port_no->box(FL_DOWN_BOX); txtArq_ip_port_no->color(FL_BACKGROUND2_COLOR); txtArq_ip_port_no->selection_color(FL_SELECTION_COLOR); txtArq_ip_port_no->labeltype(FL_NORMAL_LABEL); txtArq_ip_port_no->labelfont(0); txtArq_ip_port_no->labelsize(14); txtArq_ip_port_no->labelcolor(FL_FOREGROUND_COLOR); txtArq_ip_port_no->callback((Fl_Callback*)cb_txtArq_ip_port_no); txtArq_ip_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtArq_ip_port_no->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.arq_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtArq_ip_port_no { Fl_Button* o = btnDefault_arq_ip = new Fl_Button(425, 229, 73, 25, _("Default")); btnDefault_arq_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_arq_ip->callback((Fl_Callback*)cb_btnDefault_arq_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_arq_ip { Fl_Button* o = btn_restart_arq = new Fl_Button(505, 229, 82, 25, _("Restart")); btn_restart_arq->callback((Fl_Callback*)cb_btn_restart_arq); btn_restart_arq->hide(); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_restart_arq o->end(); } // Fl_Group* o { Fl_Box* o = new Fl_Box(6, 262, 588, 1); o->box(FL_BORDER_BOX); } // Fl_Box* o { Fl_Group* o = new Fl_Group(6, 266, 588, 35, _("XML")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnDefault_xmlrpc_ip = new Fl_Button(425, 270, 73, 25, _("Default")); btnDefault_xmlrpc_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_xmlrpc_ip->callback((Fl_Callback*)cb_btnDefault_xmlrpc_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_xmlrpc_ip { Fl_Input2* o = txtXmlrpc_ip_address = new Fl_Input2(56, 270, 230, 25, _("Addr")); txtXmlrpc_ip_address->tooltip(_("IP Address for XMLRPC interface\nIP Address format: nnn.nnn.nnn.nnn\nor name:\ i.e. localhost")); txtXmlrpc_ip_address->box(FL_DOWN_BOX); txtXmlrpc_ip_address->color(FL_BACKGROUND2_COLOR); txtXmlrpc_ip_address->selection_color(FL_SELECTION_COLOR); txtXmlrpc_ip_address->labeltype(FL_NORMAL_LABEL); txtXmlrpc_ip_address->labelfont(0); txtXmlrpc_ip_address->labelsize(14); txtXmlrpc_ip_address->labelcolor(FL_FOREGROUND_COLOR); txtXmlrpc_ip_address->callback((Fl_Callback*)cb_txtXmlrpc_ip_address); txtXmlrpc_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txtXmlrpc_ip_address->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.xmlrpc_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtXmlrpc_ip_address { Fl_Input2* o = txtXmlrpc_ip_port_no = new Fl_Input2(330, 270, 55, 25, _("Port")); txtXmlrpc_ip_port_no->tooltip(_("IP Address Port Number")); txtXmlrpc_ip_port_no->box(FL_DOWN_BOX); txtXmlrpc_ip_port_no->color(FL_BACKGROUND2_COLOR); txtXmlrpc_ip_port_no->selection_color(FL_SELECTION_COLOR); txtXmlrpc_ip_port_no->labeltype(FL_NORMAL_LABEL); txtXmlrpc_ip_port_no->labelfont(0); txtXmlrpc_ip_port_no->labelsize(14); txtXmlrpc_ip_port_no->labelcolor(FL_FOREGROUND_COLOR); txtXmlrpc_ip_port_no->callback((Fl_Callback*)cb_txtXmlrpc_ip_port_no); txtXmlrpc_ip_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtXmlrpc_ip_port_no->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.xmlrpc_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtXmlrpc_ip_port_no { Fl_Button* o = btn_restart_xml = new Fl_Button(505, 270, 82, 25, _("Restart")); btn_restart_xml->callback((Fl_Callback*)cb_btn_restart_xml); btn_restart_xml->hide(); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_restart_xml o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(6, 304, 588, 35, _("flrig")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnDefault_flrig_ip = new Fl_Button(425, 309, 73, 25, _("Default")); btnDefault_flrig_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_flrig_ip->callback((Fl_Callback*)cb_btnDefault_flrig_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_flrig_ip { Fl_Input2* o = txt_flrig_ip_address = new Fl_Input2(56, 309, 230, 25, _("Addr")); txt_flrig_ip_address->tooltip(_("IP Address for flrig interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: \ i.e. localhost")); txt_flrig_ip_address->box(FL_DOWN_BOX); txt_flrig_ip_address->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_address->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_address->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_address->labelfont(0); txt_flrig_ip_address->labelsize(14); txt_flrig_ip_address->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_address->callback((Fl_Callback*)cb_txt_flrig_ip_address); txt_flrig_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_address->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txt_flrig_ip_address { Fl_Input2* o = txt_flrig_ip_port = new Fl_Input2(330, 309, 55, 25, _("Port")); txt_flrig_ip_port->tooltip(_("IP Address Port Number")); txt_flrig_ip_port->box(FL_DOWN_BOX); txt_flrig_ip_port->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_port->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_port->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_port->labelfont(0); txt_flrig_ip_port->labelsize(14); txt_flrig_ip_port->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_port->callback((Fl_Callback*)cb_txt_flrig_ip_port); txt_flrig_ip_port->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_port->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txt_flrig_ip_port { Fl_Button* o = btn_reconnect_flrig_server = new Fl_Button(505, 309, 82, 25, _("Reconnect")); btn_reconnect_flrig_server->callback((Fl_Callback*)cb_btn_reconnect_flrig_server); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_reconnect_flrig_server o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(6, 340, 588, 36, _("fllog")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input* o = txt_fllog_ip_address = new Fl_Input(56, 345, 230, 25, _("Addr")); txt_fllog_ip_address->tooltip(_("IP Address for fllog interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: \ i.e. localhost")); txt_fllog_ip_address->callback((Fl_Callback*)cb_txt_fllog_ip_address); txt_fllog_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.xmllog_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input* txt_fllog_ip_address { Fl_Input* o = txt_fllog_ip_port = new Fl_Input(330, 345, 55, 25, _("Port")); txt_fllog_ip_port->tooltip(_("IP Address Port Number")); txt_fllog_ip_port->callback((Fl_Callback*)cb_txt_fllog_ip_port); txt_fllog_ip_port->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.xmllog_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input* txt_fllog_ip_port { Fl_Button* o = btn_reconnect_log_server = new Fl_Button(505, 345, 82, 25, _("Reconnect")); btn_reconnect_log_server->callback((Fl_Callback*)cb_btn_reconnect_log_server); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_reconnect_log_server { Fl_Button* o = btnDefault_fllog_ip = new Fl_Button(425, 345, 73, 25, _("Default")); btnDefault_fllog_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_fllog_ip->callback((Fl_Callback*)cb_btnDefault_fllog_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_fllog_ip o->end(); } // Fl_Group* o btnDisable_p2p_io_widgets->value(1); tabIO->end(); } // Fl_Group* tabIO { tabKPSM = new Fl_Group(0, 25, 600, 365, _("PSM")); tabKPSM->hide(); { Fl_Group* o = new Fl_Group(0, 33, 590, 105); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntBusyChannelSeconds = new Fl_Counter(180, 39, 110, 20, _("Allow TX After Signal Detection (Seconds)")); cntBusyChannelSeconds->tooltip(_("Allow transmits after \'N\' seconds of a signal detection.")); cntBusyChannelSeconds->minimum(1); cntBusyChannelSeconds->maximum(999); cntBusyChannelSeconds->step(1); cntBusyChannelSeconds->value(1); cntBusyChannelSeconds->callback((Fl_Callback*)cb_cntBusyChannelSeconds); cntBusyChannelSeconds->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.busyChannelSeconds); o->step(1,10); } // Fl_Counter* cntBusyChannelSeconds { Fl_Check_Button* o = btnEnableBusyChannel = new Fl_Check_Button(10, 41, 115, 20, _("Enable Busy Channel")); btnEnableBusyChannel->tooltip(_("Enable to inhibit TX on signal Detections")); btnEnableBusyChannel->down_box(FL_DOWN_BOX); btnEnableBusyChannel->callback((Fl_Callback*)cb_btnEnableBusyChannel); if(progdefaults.enableBusyChannel) o->value(true); else o->value(false); } // Fl_Check_Button* btnEnableBusyChannel { Fl_Counter* o = cntPSMTXBufferFlushTimer = new Fl_Counter(180, 64, 110, 20, _("TX Buffer Flush Timer (Minutes, 0=Disable)")); cntPSMTXBufferFlushTimer->tooltip(_("Flushes the TX buffer after x period when Busy Channel remains on (TX inhibit\ ed)")); cntPSMTXBufferFlushTimer->minimum(1); cntPSMTXBufferFlushTimer->maximum(999); cntPSMTXBufferFlushTimer->step(1); cntPSMTXBufferFlushTimer->value(1); cntPSMTXBufferFlushTimer->callback((Fl_Callback*)cb_cntPSMTXBufferFlushTimer); cntPSMTXBufferFlushTimer->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_flush_buffer_timeout); o->step(1,10); o->minimum(0); o->maximum(999); } // Fl_Counter* cntPSMTXBufferFlushTimer { Fl_Counter* o = cntPSMBandwidthMargins = new Fl_Counter(180, 89, 110, 20, _("Modem Bandwidth Margins ")); cntPSMBandwidthMargins->tooltip(_("Monitor signals in modem bandwitdh plus margins.")); cntPSMBandwidthMargins->minimum(1); cntPSMBandwidthMargins->maximum(999); cntPSMBandwidthMargins->step(1); cntPSMBandwidthMargins->value(1); cntPSMBandwidthMargins->callback((Fl_Callback*)cb_cntPSMBandwidthMargins); cntPSMBandwidthMargins->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_minimum_bandwidth_margin); o->step(1,10); } // Fl_Counter* cntPSMBandwidthMargins { Fl_Counter* o = cntPSMValidSamplePeriod = new Fl_Counter(180, 115, 110, 20, _("Valid Signal Sample Period (Milliseconds)")); cntPSMValidSamplePeriod->tooltip(_("Valid signal sample period in Milliseconds")); cntPSMValidSamplePeriod->minimum(1); cntPSMValidSamplePeriod->maximum(999); cntPSMValidSamplePeriod->step(1); cntPSMValidSamplePeriod->value(1); cntPSMValidSamplePeriod->callback((Fl_Callback*)cb_cntPSMValidSamplePeriod); cntPSMValidSamplePeriod->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_hit_time_window); o->step(1,10); } // Fl_Counter* cntPSMValidSamplePeriod o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 142, 593, 92); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnEnable_csma = new Fl_Check_Button(10, 156, 115, 20, _("Enable CSMA")); btnEnable_csma->tooltip(_("Carrier Sense Mulitiple Access")); btnEnable_csma->down_box(FL_DOWN_BOX); btnEnable_csma->callback((Fl_Callback*)cb_btnEnable_csma); if(progdefaults.csma_enabled) o->value(true); } // Fl_Check_Button* btnEnable_csma { Fl_Counter* o = cntPersistance = new Fl_Counter(140, 156, 110, 20, _("Persistance")); cntPersistance->tooltip(_("Used to adjust the aggressiveness of TX")); cntPersistance->minimum(1); cntPersistance->maximum(999); cntPersistance->step(1); cntPersistance->value(1); cntPersistance->callback((Fl_Callback*)cb_cntPersistance); cntPersistance->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.csma_persistance); o->step(1,10); o->minimum(0); o->maximum(255); } // Fl_Counter* cntPersistance { Fl_Counter* o = cntSlotTime = new Fl_Counter(140, 181, 110, 20, _("Slot Time")); cntSlotTime->tooltip(_("Non transmit window after a transmit period")); cntSlotTime->minimum(1); cntSlotTime->maximum(999); cntSlotTime->step(1); cntSlotTime->value(1); cntSlotTime->callback((Fl_Callback*)cb_cntSlotTime); cntSlotTime->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.csma_slot_time); o->step(1,10); o->minimum(1); o->maximum(255); } // Fl_Counter* cntSlotTime { Fl_Counter* o = cntTransmitDelay = new Fl_Counter(140, 206, 110, 20, _("Transmit Data Delay")); cntTransmitDelay->tooltip(_("Idle transmit before data sent")); cntTransmitDelay->minimum(1); cntTransmitDelay->maximum(999); cntTransmitDelay->step(1); cntTransmitDelay->value(1); cntTransmitDelay->callback((Fl_Callback*)cb_cntTransmitDelay); cntTransmitDelay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.csma_transmit_delay); o->step(1,10); o->minimum(1); o->maximum(255); } // Fl_Counter* cntTransmitDelay { OutputSlotTimeMS = new Fl_Output(397, 181, 95, 20, _("MilliSeconds")); OutputSlotTimeMS->tooltip(_("Displays the Slot Time in Milliseconds")); OutputSlotTimeMS->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Output* OutputSlotTimeMS { OutputTransmitDelayMS = new Fl_Output(397, 206, 95, 20, _("MilliSeconds")); OutputTransmitDelayMS->tooltip(_("Displays the Transmit Delay in Milliseconds")); OutputTransmitDelayMS->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Output* OutputTransmitDelayMS { OutputPersistancePercent = new Fl_Output(397, 155, 95, 20, _("Percent (%)")); OutputPersistancePercent->tooltip(_("Displays the Slot Time in Milliseconds")); OutputPersistancePercent->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Output* OutputPersistancePercent o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 237, 593, 30); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnEnable_histogram = new Fl_Check_Button(10, 244, 140, 20, _("Enable Histogram")); btnEnable_histogram->tooltip(_("Enable Histogram threshold signal monitoring")); btnEnable_histogram->down_box(FL_DOWN_BOX); btnEnable_histogram->callback((Fl_Callback*)cb_btnEnable_histogram); if(progdefaults.psm_use_histogram) o->value(true); } // Fl_Check_Button* btnEnable_histogram { Fl_Counter* o = cntPSMThreshold = new Fl_Counter(180, 244, 110, 20, _("PSM Histogram Threshold")); cntPSMThreshold->tooltip(_("Sets the theshold level to x value above the noise level")); cntPSMThreshold->minimum(1); cntPSMThreshold->maximum(999); cntPSMThreshold->step(1); cntPSMThreshold->value(1); cntPSMThreshold->callback((Fl_Callback*)cb_cntPSMThreshold); cntPSMThreshold->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_histogram_offset_threshold); o->step(1,10); o->minimum(1); o->maximum(20); } // Fl_Counter* cntPSMThreshold o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 270, 593, 31); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntKPSQLAttenuation = new Fl_Counter(180, 275, 110, 20, _("PSM Attenuate")); cntKPSQLAttenuation->tooltip(_("Adjust sensitivity by 1/N fractional values.")); cntKPSQLAttenuation->minimum(1); cntKPSQLAttenuation->maximum(999); cntKPSQLAttenuation->step(1); cntKPSQLAttenuation->value(1); cntKPSQLAttenuation->callback((Fl_Callback*)cb_cntKPSQLAttenuation); cntKPSQLAttenuation->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kpsql_attenuation); o->step(1,10); o->minimum(1); o->maximum(999); update_kpsql_fractional_gain(progdefaults.kpsql_attenuation); } // Fl_Counter* cntKPSQLAttenuation o->end(); } // Fl_Group* o { btnBuyChannelDefaults = new Fl_Button(464, 345, 126, 27, _("Default Settings")); btnBuyChannelDefaults->callback((Fl_Callback*)cb_btnBuyChannelDefaults); } // Fl_Button* btnBuyChannelDefaults { Fl_Group* o = new Fl_Group(0, 304, 593, 31); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_show_psm_button = new Fl_Check_Button(10, 310, 151, 20, _("Show and enable Power Signal Monitor button (PSM)")); btn_show_psm_button->tooltip(_("display PSM button on main dialog")); btn_show_psm_button->down_box(FL_DOWN_BOX); btn_show_psm_button->callback((Fl_Callback*)cb_btn_show_psm_button); o->value(progdefaults.show_psm_btn); } // Fl_Check_Button* btn_show_psm_button o->end(); } // Fl_Group* o tabKPSM->end(); } // Fl_Group* tabKPSM tabsConfigure->end(); } // Fl_Tabs* tabsConfigure { btnSaveConfig = new Fl_Button(330, 394, 130, 22, _("Save")); btnSaveConfig->callback((Fl_Callback*)cb_btnSaveConfig); } // Fl_Button* btnSaveConfig { btnCloseConfig = new Fl_Return_Button(462, 394, 130, 22, _("Close")); btnCloseConfig->callback((Fl_Callback*)cb_btnCloseConfig); } // Fl_Return_Button* btnCloseConfig { btnResetConfig = new Fl_Button(20, 394, 130, 22, _("Restore defaults")); btnResetConfig->tooltip(_("WARNING - this will over write ALL settings")); btnResetConfig->callback((Fl_Callback*)cb_btnResetConfig); } // Fl_Button* btnResetConfig o->set_non_modal(); o->end(); } // Fl_Double_Window* o return w; } void openConfig() { if (!dlgConfig) createConfig(); progdefaults.loadDefaults(); } void closeDialog() { if (dlgConfig) dlgConfig->hide(); } void createConfig() { if (!dlgConfig) { dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); } } void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata) { /* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->value( w->value() ); btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); } } void KmlDestDirSet(Fl_File_Chooser *w, void *userdata) { /* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->value( w->value() ); btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); } } fldigi-4.1.06/src/dialogs/record_browse.cxx0000644000175000017500000000450513511722452015563 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "gettext.h" #include "record_browse.h" #include Fl_Group *tabDataFiles=(Fl_Group *)0; Fl_Input_Choice *inpDataSources=(Fl_Input_Choice *)0; Fl_Light_Button *btnDataSourceUpdate=(Fl_Light_Button *)0; static void cb_btnDataSourceUpdate(Fl_Light_Button*, void*) { DerivedRecordLst::cbGuiUpdate(); } Fl_Button *btnDataSourceReset=(Fl_Button *)0; static void cb_btnDataSourceReset(Fl_Button*, void*) { DerivedRecordLst::cbGuiReset(); } Fl_Double_Window* make_record_loader_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(540, 280, _("Data files sources")); w = o; if (w) {/* empty */} o->tooltip(_("Data files update")); { tabDataFiles = new Fl_Group(5, 25, 570, 275); tabDataFiles->tooltip(_("Tabular data sources")); { DerivedRecordLst* o = new DerivedRecordLst(6, 25, 529, 217, _("Data files sources")); o->box(FL_THIN_DOWN_FRAME); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NO_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->align(Fl_Align(FL_ALIGN_TOP)); o->when(FL_WHEN_RELEASE); o->end(); Fl_Group::current()->resizable(o); } // DerivedRecordLst* o { inpDataSources = new Fl_Input_Choice(6, 254, 284, 21, _("Data source")); inpDataSources->tooltip(_("Data files repository")); inpDataSources->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Input_Choice* inpDataSources { btnDataSourceUpdate = new Fl_Light_Button(387, 254, 74, 20, _("Update")); btnDataSourceUpdate->tooltip(_("Update selected local data files with repository content")); btnDataSourceUpdate->callback((Fl_Callback*)cb_btnDataSourceUpdate); } // Fl_Light_Button* btnDataSourceUpdate { btnDataSourceReset = new Fl_Button(465, 254, 70, 20, _("Reset")); btnDataSourceReset->tooltip(_("Delete local data files if selected.")); btnDataSourceReset->callback((Fl_Callback*)cb_btnDataSourceReset); } // Fl_Button* btnDataSourceReset tabDataFiles->end(); Fl_Group::current()->resizable(tabDataFiles); } // Fl_Group* tabDataFiles o->end(); } // Fl_Double_Window* o return w; } fldigi-4.1.06/src/dialogs/htmlstrings.cxx0000644000175000017500000000476213472115774015320 00000000000000// ---------------------------------------------------------------------------- // // htmlstrings.cxx // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "dialogs/guide.cxx" const char* szAbout = "\n\ \n\ \n\ About\n\ \n\ \n\ \n\
\n\

Fldigi " PACKAGE_VERSION "

\n\
\n\ Fast and Light DIGItal modem program\n\
\n\

\n\ Copyright \251 2008-2014\n\

\n\ Distributed under the GNU General Public License version 3 or later.
\n\ This is free software: you are free to change and redistribute it.
\n\ There is NO WARRANTY, to the extent permitted by law.\n\

Programmers:

\n\
\
Dave Freese        W1HKJ\n\
Stelios Bounanos   M0GLD\n\
Rem\355 Chateauneu    F4ECW\n\
John Douyere       VK2ETA\n\
Stefan Fendt       DL1SMF\n\
Leigh Klotz        WA5ZNU\n\
John Phelps        KL4YFD\n\
Andrej Lajovic     S57LN\n\
Rik van Riel       AB1KW\n\
Robert Stiles      KK5VD\n\
\

Beginners' Guide:

\n\
\
Murray Greenman      ZL1BPU
\n\
\

Localization:

\n\
\
Espa\361ol     Spanish      Pavel Milanes Costa CO7WT\n\
                         Christian W. Correa HK4QWC\n\
Deutsch     German       Marc Richter        DF2MR\n\
Fran\347ais    French       Bernard Seront      F4GAR\n\
Italiano    Italian      Pierfrancesco Caci  IK5PVX\n\
Język       Polish       Roman Bagiński      SP4JEU\n\
Nederlands  Dutch        Peter van der Post  PA1POS\n\
PуÑÑкий     Russian      Alexandr Kalugin    RX9CDR\n\
Ελληνικά    Greek        Haris Andrianos     SV1GRB\n\
\ \n\ \n\ "; fldigi-4.1.06/src/dialogs/font_browser.cxx0000644000175000017500000002120713472115774015444 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "font_browser.h" #include "flslider2.h" #include "gettext.h" using namespace std; Font_Browser* font_browser; // Font Color selected void Font_Browser::ColorSelect() { unsigned char r, g, b; Fl::get_color(fontcolor, r, g, b); if (fl_color_chooser(_("Font color"), r, g, b) == 0) return; fontcolor = fl_rgb_color(r, g, b); btn_Color->color(fontcolor); btn_Color->labelcolor( fl_contrast(FL_BLACK, fontcolor)); } void Font_Browser::fb_callback(Fl_Widget* w, void* arg) { Font_Browser* fb = reinterpret_cast(arg); if (w == fb->btn_Cancel) fb->hide(); else if (w == fb->btn_OK) { if (fb->callback_) (*fb->callback_)(fb, fb->data_); } else if (w == fb->btn_Color) fb->ColorSelect(); else if (w == fb->lst_Font) fb->FontNameSelect(); else { if (w == fb->lst_Size) fb->txt_Size->value(strtol(fb->lst_Size->text(fb->lst_Size->value()), NULL, 10)); fb->fontsize = static_cast(fb->txt_Size->value()); } fb->box_Example->SetFont(fb->fontnbr, fb->fontsize, fb->fontcolor); } // Sort the font list void Font_Browser::FontSort() { int size = lst_Font->size(); for ( int t = 1; t <= size - 1; t++ ) for ( int r = t+1; r <= size; r++ ) if ( strcasecmp(lst_Font->text(t), lst_Font->text(r)) > 0 ) lst_Font->swap(t,r); } // Font Name changed callback void Font_Browser::FontNameSelect() { int fn = lst_Font->value(); if (!fn) return; fontnbr = (Fl_Font)reinterpret_cast(lst_Font->data(fn)); // get sizes and fill browser; skip first element if it is zero lst_Size->clear(); int nsizes, *sizes; char buf[4]; nsizes = Fl::get_font_sizes(fontnbr, sizes); // for (int i = !*sizes; i < nsizes; i++) if ((size_t)snprintf(buf, sizeof(buf), "%d", sizes[i]) < sizeof(buf)) lst_Size->add(buf, reinterpret_cast(sizes[i])); // scalable font with no suggested sizes if (!lst_Size->size()) { for (int i = 1; i <= 48; i++) { snprintf(buf, sizeof(buf), "%d", i); lst_Size->add(buf, reinterpret_cast(i)); } } fontSize(fontsize); } Font_Browser::Font_Browser(int x, int y, int w, int h, const char *lbl ) : Fl_Window(x, y, w, h, lbl) { lst_Font = new Fl_Browser(5, 15, 280, 125, _("Font:")); lst_Font->align(FL_ALIGN_TOP_LEFT); lst_Font->type(FL_HOLD_BROWSER); lst_Font->callback(fb_callback, this); txt_Size = new Fl_Value_Input2(290, 15, 50, 22, _("Size:")); txt_Size->align(FL_ALIGN_TOP_LEFT); txt_Size->range(1.0, 48.0); txt_Size->step(1.0); txt_Size->callback(fb_callback, this); lst_Size = new Fl_Browser(290, 40, 50, 100); lst_Size->type(FL_HOLD_BROWSER); lst_Size->callback(fb_callback, this); btn_OK = new Fl_Return_Button(345, 40, 80, 25, _("&OK")); btn_OK->shortcut(0x8006f); btn_OK->callback(fb_callback, this); btn_Cancel = new Fl_Button(345, 70, 80, 25, _("Cancel")); btn_Cancel->labelsize(12); btn_Cancel->callback(fb_callback, this); btn_Color = new Fl_Button(345, 100, 80, 25, _("Color")); btn_Color->down_box(FL_BORDER_BOX); btn_Color->color(FL_FOREGROUND_COLOR); btn_Color->labelcolor( fl_contrast(FL_BLACK, FL_FOREGROUND_COLOR)); btn_Color->callback(fb_callback, this); box_Example = new Preview_Box(5, 145, 420, 75, _("That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~")); box_Example->box(FL_DOWN_BOX); box_Example->align(FL_ALIGN_WRAP|FL_ALIGN_CLIP|FL_ALIGN_CENTER|FL_ALIGN_INSIDE); resizable(box_Example); set_modal(); end(); // Initializations this->callback_ = 0; // Initialize Widgets callback this->data_ = 0; // And the data numfonts = Fl::set_fonts(0); // Nr of fonts available on the server const char* name; for(int i = 0; i < numfonts; i++) { name = Fl::get_font_name((Fl_Font)i); if (isalpha(*name)) lst_Font->add(name, reinterpret_cast(i)); } FontSort(); fontnbr = FL_HELVETICA;; fontsize = FL_NORMAL_SIZE; // Font Size to be used fontcolor = FL_FOREGROUND_COLOR; filter = ALL_TYPES; lst_Font->value(1); FontNameSelect(); //! Fl::focus(lst_Font); xclass(PACKAGE_NAME); } void Font_Browser::fontNumber(Fl_Font n) { fontnbr = n; lst_Font->value(1); int s = lst_Font->size(); for (int i = 1; i < s; i++ ) { if ((Fl_Font)reinterpret_cast(lst_Font->data(i)) == n) { lst_Font->value(i); FontNameSelect(); break; } } } void Font_Browser::fontSize(int s) { fontsize = s; int n = lst_Size->size(); for (int i = 1; i < n; i++) { if ((intptr_t)lst_Size->data(i) == fontsize) { lst_Size->value(i); break; } } txt_Size->value(s); } void Font_Browser::fontColor(Fl_Color c) { btn_Color->color(fontcolor = c); box_Example->SetFont(fontnbr, fontsize, fontcolor); box_Example->redraw(); } void Font_Browser::fontName(const char* n) { int s = lst_Font->size(); for (int i = 1; i < s; i++) { if (!strcmp(lst_Font->text(i), n)) { lst_Font->value(i); FontNameSelect(); } } } bool Font_Browser::fixed_width(Fl_Font f) { fl_font(f, FL_NORMAL_SIZE); return fl_width('X') == fl_width('i'); } #include #include #include class Progress_Window : public Fl_Double_Window { public: Progress_Window(float min = 0.0f, float max = 100.0f, const char* l = 0) : Fl_Double_Window(200, 34), ps(5, 5, 190, 24, l) { end(); range(min, max); ps.align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); ps.selection_color(FL_SELECTION_COLOR); set_modal(); callback(nop); if (l && *l) { fl_font(FL_HELVETICA, FL_NORMAL_SIZE); int s = (int)(fl_width(l) + fl_width('W')); if (s > ps.w()) { ps.size(s, ps.h()); size(ps.w() + 10, h()); } } position(Fl::event_x_root() - w() / 2, Fl::event_y_root() - h()); xclass(PACKAGE_TARNAME); show(); } void range(float min, float max) { ps.minimum(min); ps.maximum(max); } void value(float val) { ps.value(val); } static void nop(Fl_Widget*, void*) { } private: Fl_Progress ps; }; void Font_Browser::fontFilter(filter_t filter) { if (this->filter == filter) return; int s = lst_Font->size(); static vector fixed; if (fixed.empty()) { Progress_Window pw(1, s, _("Reading fonts...")); fixed.resize(s); for (int i = 1; i < s; i++) { fixed[i] = fixed_width((Fl_Font)(intptr_t)(lst_Font->data(i))); pw.value(i); Fl::check(); } } switch (this->filter = filter) { case FIXED_WIDTH: for (int i = 1; i < s; i++) { if (fixed[i]) lst_Font->show(i); else lst_Font->hide(i); } break; case VARIABLE_WIDTH: for (int i = 1; i < s; i++) { if (!fixed[i]) lst_Font->show(i); else lst_Font->hide(i); } break; case ALL_TYPES: for (int i = 1; i < s; i++) lst_Font->show(i); break; } lst_Font->topline(lst_Font->value()); } ////////////////////////////////////////////////////////////////////// Preview_Box::Preview_Box(int x, int y, int w, int h, const char* l) : Fl_Widget(x, y, w, h, l) { fontName = 1; fontSize = FL_NORMAL_SIZE; box(FL_DOWN_BOX); color(FL_BACKGROUND2_COLOR); fontColor = FL_FOREGROUND_COLOR; } void Preview_Box::draw() { draw_box(); fl_font((Fl_Font)fontName, fontSize); fl_color(fontColor); fl_draw(label(), x()+3, y()+3, w()-6, h()-6, align()); } void Preview_Box::SetFont(int fontname, int fontsize, Fl_Color c) { fontName = fontname; fontSize = fontsize; fontColor = c; redraw(); } fldigi-4.1.06/src/dialogs/guide.cxx0000664000175000017500000030735613507437307014044 00000000000000const char* szBeginner = "\n\ \n\ \n\ \n\ \n\ Beginners' Guide to Fldigi\n\ \n\ \n\ \n\ \n\
\n\

Beginners' Guide to Fldigi

\n\
\n\
Table of Contents
\n\ \n\
\n\
\n\
\n\
\n\
\n\
\n\
\n\

Of necessity, this Beginners' Guide contains only as much as you need to know to\n\ get started. You should learn how to make best use of the program by reading the\n\ Online Documentation. You can also access it from within the Fldigi program from the Help\n\ menu item.

\n\

You can install the entire html help system by downloading from Source Forge:

\n\ \n\

Unzip the downloaded file into the same folder as this document. The menu\n\ item \"Help / Online documentation…\" will then open the local copy of the fldigi help system.

\n\
\n\
\n\
\n\
\n\

1. Beginners' Questions Answered

\n\
\n\
\n\

1.1. What is Fldigi?

\n\

Fldigi is a computer program intended for Amateur Radio Digital Modes\n\ operation using a PC (Personal Computer). Fldigi operates (as does most similar\n\ software) in conjunction with a conventional HF SSB radio transceiver, and uses\n\ the PC sound card as the main means of input from the radio, and output to the\n\ radio. These are audio-frequency signals. The software also controls the radio\n\ by means of another connection, typically a serial port.

\n\

Fldigi is multi-mode, which means that it is able to operate many popular\n\ digital modes without switching programs, so you only have one program to\n\ learn. Fldigi includes all the popular modes, such as DominoEX, MFSK16, PSK31,\n\ and RTTY.

\n\

Unusually, Fldigi is available for multiple computer operating systems;\n\ FreeBSD™; Linux™, OS X™ and Windows™.

\n\
\n\
\n\

1.2. What is a Digital Mode?

\n\

Digital Modes are a means of operating Amateur radio from the computer\n\ keyboard. The computer acts as modem (modulator - demodulator), as well as\n\ allowing you to type, and see what the other person types. It also controls the\n\ transmitter, changes modes as required, and provides various convenient features\n\ such as easy tuning of signals and prearranged messages.

\n\

In this context, we are talking about modes used on the HF (high frequency)\n\ bands, specifically chat modes, those used to have a regular conversation in a\n\ similar way to voice or Morse, where one operator talks for a minute or two,\n\ then another does the same. These chat modes allow multiple operators to take\n\ part in a net.

\n\

Because of sophisticated digital signal processing which takes place inside the\n\ computer, digital modes can offer performance that cannot be achieved using\n\ voice (and in some cases even Morse), through reduced bandwidth, improved\n\ signal-to-noise performance and reduced transmitter power requirement. Some\n\ modes also offer built-in automatic error correction.

\n\

Digital Mode operating procedure is not unlike Morse operation, and many of the\n\ same abbreviations are used. Software such as Fldigi makes this very simple as\n\ most of the procedural business is set up for you using the Function Keys at the\n\ top of the keyboard. These are easy to learn.

\n\
\n\
\n\

1.3. Why all the different modes?

\n\

HF propagation is very dependent on the ionosphere, which reflects the signals\n\ back to earth. There are strong interactions between different signals arriving\n\ from different paths. Experience has shown that particular modulation systems,\n\ speeds and bandwidths suit different operating conditions.

\n\

Other factors such as available band space, operating speed and convenience,\n\ noise level, signal level and available power also affect the choice of\n\ mode. While in many cases several different modes might be suitable, having a\n\ choice adds to the operating pleasure. It is difficult to advise which mode is\n\ best for each particular occasion, and experience plays an important role.\n\
[To gain a good insight into each mode and its capabilities, you might\n\ consider purchasing Digital Modes for All Occasions (ISBN 1-872309-82-8) by\n\ Murray Greenman ZL1BPU, published by the RSGB and also available from\n\ FUNKAMATEUR and CQ Communications; or the ARRL’s HF Digital Handbook (ISBN\n\ 0-87259-103-4) by Steve Ford, WB8IMY.]

\n\
\n\
\n\

1.4. How do I recognise and tune in the signals?

\n\

Recognising the different modes comes with experience. It is a matter of\n\ listening to the signal, and observing the appearance of the signal on the\n\ tuning display. You can also practise transmitting with the transceiver\n\ disconnected, listening to the sound of the signals coming from the\n\ computer. There is also (see later paragraph) an automatic tuning option which\n\ can recognise and tune in most modes for you.

\n\

The software provides a tuning display which shows the radio signals that are\n\ receivable within the transceiver passband. Using a point and click technique\n\ with the mouse, you can click on the centre of a signal to select it, and the\n\ software will tune it in for you. Some modes require more care than others, and\n\ of course you need to have the software set for the correct mode first — not\n\ always so easy!

\n\

The RSID (automatic mode detection and tuning) feature uses a\n\ special sequence of tones transmitted at the beginning of each transmission to\n\ identify and tune in the signals received. For this feature to work, not only do\n\ you need to enable the feature in the receiver, but in addition the stations you\n\ are wishing to tune in need to have this feature enabled on transmission. Other\n\ programs also offer this RSID feature as an option.

\n\
\n\
\n\
\n\
\n\

2. Setting Up

\n\
\n\
\n\

2.1. Fldigi settings

\n\
Essentials
    \n\
  • \n\

    \n\ Use the menu Configure→Operator item to set the operator name, callsign,\n\ locator and so on.\n\

    \n\
  • \n\
  • \n\

    \n\ If you have more than one sound card, use the menu Configure→Sound Card,\n\ Audio Devices tab, to select the sound card you wish to use. You can ignore\n\ the other tabs for now.\n\

    \n\
  • \n\
\n\
Rig Control
    \n\
  • \n\

    \n\ Use the menu Configure→Rig Control item to set how you will control the\n\ rig. If you will key the rig via a serial port, in the Hardware PTT tab\n\ select Use serial port PTT, the device name you will use, and which line\n\ controls PTT. If in doubt, check both RTS and DTR. You must then press\n\ the Initialize button.\n\

    \n\
  • \n\
  • \n\

    \n\ If you plan to use CAT control of the rig via the COM port, check Use Hamlib\n\ in the Hamlib tab. Select your rig model from the drop-down menu and set the\n\ serial port device name, baud rate, and RTS/CTS options as needed. If in\n\ addition you wish to use PTT control via CAT, also check PTT via Hamlib\n\ command. You must then press the Initialize button.\n\

    \n\
  • \n\
\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

If your rig is CAT-capable but not yet supported by\n\ Hamlib, it may still be possible to control it via\n\ Fldigi’s RigCAT system. Refer to the Online Documentation for details.

\n\
\n\
\n\
CPU Speed
    \n\
  • \n\

    \n\ When you start Fldigi for the very first time, it makes a series of\n\ measurements to determine your computer’s processing speed. Although these\n\ measurements are usually accurate, if you have a very slow processor (under\n\ 700MHz), you should verify that Slow CPU under Configure→Misc→CPU has\n\ been enabled. The receiver decoding strategy of certain modems uses fewer\n\ processor cycles in this mode.\n\

    \n\
  • \n\
\n\
Modems
    \n\
  • \n\

    \n\ Each of the modems can be individually set up from the Configure→Modems\n\ multi-tabbed dialog. You need not change anything here to start with, although\n\ it might be a good idea to set the secondary text for DominoEX and THOR to\n\ something useful, such as your call and locator.
    [Secondary text is\n\ transmitted when the text you type does not keep up with the typing speed of\n\ the mode — this handy text appears in a small window at the very bottom of the\n\ screen.]
    Note that this set of tabs is also where you set the RTTY modem speed\n\ and shift, although the default values should be fine for normal operation.\n\

    \n\
  • \n\
\n\
Other settings
    \n\
  • \n\

    \n\ Use the menu Configure→UI, Restart tab, to set the aspect ratio of the\n\ waterfall display and whether or not you want to dock a second digiscope to\n\ the main window.\n\

    \n\
  • \n\
  • \n\

    \n\ Use the menu Configure→IDs item to set whether you wish to transmit RSID\n\ data at the start of each over (this is for the benefit of others and does not\n\ affect RSID reception). If you plan to regularly use the RSID feature on\n\ receive, you should deselect the option that starts new modems at the “sweet\n\ spot” frequencies in Misc→Sweet Spot.\n\

    \n\
  • \n\
\n\

Finally, use the menu item Configure→Save Config to save the new\n\ configuration.

\n\
\n\
\n\

2.2. Sound Card Mixer

\n\
    \n\
  • \n\

    \n\ Use your sound card Master Volume applet to select the sound card, the Wave\n\ output and set the transmit audio level. You can check the level using the\n\ Tune button, top right, beyond the Menu.\n\

    \n\
  • \n\
  • \n\

    \n\ On Windows, the Volume applet can usually be opened by clicking\n\ Start→Run… and entering sndvol32, or from the Control Panel.\n\

    \n\
  • \n\
  • \n\

    \n\ Use your sound card Recording Control applet to select the sound card, the\n\ Line or Mic input and set the receiver audio level. Watch the waterfall\n\ display for receiver noise when setting the level. If you see any dark blue\n\ noise, you have the right input and about the right level. The actual setting\n\ is not very important, provided you see blue noise. If the audio level is too\n\ high, the little diamond shaped indicator (bottom right) will show red. The\n\ waterfall may also show red bands. Performance will be degraded if the level\n\ is too high.\n\

    \n\
  • \n\
  • \n\

    \n\ On Windows, the Record applet can usually be opened by clicking\n\ Start→Run… and entering sndvol32, or from the Control Panel. If opened\n\ from the Control Panel, you’ll end up with the Master Volume applet, and need\n\ to switch using Options→Properties, and selecting the Recording radio\n\ button.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

3. Guided Tour

\n\
\n\

The main window consists of three main panes. Study it carefully as you read\n\ these notes. From top to bottom, these are the Receive pane (navajo white), the\n\ Transmit pane (light cyan), and the Waterfall pane (black). At the top is the\n\ collection of entry items which form the Log Data, and at the very top, a\n\ conventional drop-down Menu system, with entries for File, Op Mode, Configure,\n\ View and Help.

\n\

Between the Transmit and the Waterfall panes is a line of boxes (buttons) which\n\ represent the Function Keys F1 - F12. This is the Macro group. Below the\n\ Waterfall pane is another line of boxes (buttons), which provide various control\n\ features. This is the Controls group. The program and various buttons can mostly\n\ be operated using the mouse or the keyboard, and users generally find it\n\ convenient to use the mouse while tuning around, and the keyboard and function\n\ keys during a QSO.

\n\
\n\

3.1. Receive Pane

\n\

This is where the text from decoded incoming signals is displayed, in black\n\ text. When you transmit, the transmitted text is also displayed here, but in red,\n\ so the Receive pane becomes a complete record of the QSO. The information in\n\ this pane can also be logged to a file.

\n\

The line at the bottom of this pane can be dragged up and down with the\n\ mouse. You might prefer to drag it down a bit to enlarge the Receive pane and\n\ reduce the size of the Transmit pane.

\n\
\n\
\n\

3.2. Transmit Pane

\n\

This is where you type what you want to transmit. The mouse must click in here\n\ before you type (to obtain focus) otherwise your text will go nowhere. You can\n\ type in here while you are receiving, and when you start transmitting, the text\n\ already typed will be sent first. This trick is a cool way to impress others\n\ with your typing speed! As the text is transmitted, the text colour changes from\n\ black to red. At the end of the over, all the transmitted text (and any as yet\n\ not transmitted) will be deleted.

\n\
\n\
\n\

3.3. Waterfall Pane

\n\

This is the main tuning facility. There are three modes, Waterfall, FFT and\n\ Signal, selected by a button in the Control group. For now, leave it in\n\ Waterfall mode, as this is the easiest to tune with, and gives the best\n\ identification of the signal.

\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\ WF (Waterfall)\n\
\n\
\n\

\n\ A spectrogram display of signal strength versus frequency over passing\n\ time. The receiver passband is analysed and displayed with lower frequencies\n\ to the left, higher to the right. Weak signals and background noise are dark\n\ while stronger signals show as brighter colours. As time passes (over a few\n\ seconds), the historic signals move downwards like a waterfall.\n\

\n\
\n\ FFT (Fast Fourier Transform)\n\
\n\
\n\

\n\ A spectrum display of the mean signal strength versus frequency. Again\n\ frequency is displayed from left to right, but now the vertical direction\n\ shows signal strength and there is no brightness or historic information.\n\

\n\
\n\ SIG (Signal)\n\
\n\
\n\

\n\ An oscilloscope type of display showing the raw audio being captured by the\n\ sound card.\n\

\n\
\n\

At the top of the pane is a scale of frequency in Hz, which corresponds to the\n\ frequency displayed immediately below it. This scale can be moved around and\n\ zoomed using buttons in the Control group.

\n\

As you move the mouse around in this pane you will see a yellow group of tuning\n\ marks following the mouse pointer. Tuning is achieved by left-clicking on a\n\ signal displayed by the waterfall in this pane. Use these yellow marks to\n\ exactly straddle the signal and then left-click on the centre of the signal. The\n\ tuning marks change to red. The red vertical lines will show the approximate\n\ width of the active signal area (the expected signal bandwidth), while a red\n\ horizontal bar above will indicate the receiver software’s active decoding\n\ range. When you left-click, the red marks move to where you clicked, and will\n\ attempt to auto-track the signal from there.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\
Audio history and “casual tuning”
\n\

You can temporarily “monitor” a different signal by right-clicking on it. As\n\ long as you hold the mouse button down, the signal under it will be decoded; as\n\ soon as you release the mouse, decoding will revert to the previously tuned spot\n\ (where the red marks are). If you also hold the Control key down before\n\ right-clicking, Fldigi will first decode all of its buffered audio at that\n\ frequency.

\n\
\n\
\n\
\n\
\n\

3.4. Log Data

\n\

Fldigi provides two QSO entry views, one for casual QSO logging and the second\n\ for contesting. The View→Contest fields menu item switches between the two\n\ modes.

\n\

The Frequency, Time Off, and (when in contest mode) #Out fields are filled\n\ by the program. All the others can be populated by manual keyboard entry or by\n\ selection from the Receive pane. The Time Off field is\n\ continuously updated with the current GMT time. The Time On field will be\n\ filled in when the Call is updated, but can be modified later by the operator.

\n\

A right click on the Receive pane brings up a context sensitive menu that will\n\ reflect which of the two QSO capture views you have open. If you highlight text\n\ in the Receive pane then the menu selection will operate on that text. If you\n\ simply point to a word of text and right click then the menu selection will\n\ operate on the single word.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\
Quick log entry
\n\

Certain fields (Call, Name, RST In, QTH and Locator) may also be\n\ populated semi-automatically. Point to a word in the Receive pane and either\n\ double-left-click or hold a Shift key down and left-click. The program will\n\ then use some simple heuristics to decide which log field will receive the text.

\n\
\n\
\n\

It is generally not possible to distinguish between Operator and QTH names. For\n\ this reason, Fldigi will use the first non-Call and non-Locator word to fill the\n\ Name field, and subsequent clicks will send text to the QTH field.\n\ Likewise, a text string may be both a valid callsign and a valid\n\ IARU (Maidenhead) locator.\n\ For best results, you should attempt to fill the log fields in the order in\n\ which they appear on the main window, and clear the log fields after logging the\n\ QSO. Of course, text can always be manually typed or pasted into any of the log\n\ fields!

\n\

You can query online and local (e.g. CD) database systems for data regarding a\n\ callsign. You make the query by either clicking on the globe button, or\n\ selecting Look up call from the popup menu. The latter will also move the\n\ call to the Call field.

\n\

When the Call field is filled in, the logbook will be searched for the most\n\ recent QSO with that station and, if an entry is found, the Name, QTH and\n\ other fields will be pre-filled. If the logbook dialog is open, that last QSO\n\ will also be selected for viewing in the logbook.

\n\

You open the logbook by selecting from the View menu; View→Logbook. The\n\ logbook title bar will show you which logbook you currently have open. Fldigi\n\ can maintain an unlimited (except for disk space) number of logbooks.

\n\
\n\
\n\

3.5. Menu

\n\

At the very top of the program window is a conventional drop-down menu. If you\n\ click on any of the items, a list of optional functions will appear. Keyboard\n\ menu selection is also provided. Where underscored characters are shown in the\n\ menu, you can select these menu items from the keyboard using the marked\n\ character and Alt at the same time, then moving around with the\n\ up/down/left/right keys. Press Esc to quit from the menu with no\n\ change.

\n\
\n\

3.5.1. Menu functions

\n\
File

Allows you to open or save Macros (we won’t get into that here), turn on/off\n\ logging to file, record/play audio samples, and exit the program. You can also\n\ exit the program by clicking on the X in the top right corner of the window,\n\ in the usual manner.

\n\
Op Mode

This is where you select the operating modem used for transmission and\n\ reception. Some modes only have one option. Where more are offered, drag the\n\ mouse down the list and sideways following the arrow to a secondary list, before\n\ releasing it. When you start the program next time, it will remember the last\n\ mode you used.

\n\

Not all the modes are widely used, so choose a mode which (a) maximises your\n\ chance of a QSO, and (b) is appropriate for the band, conditions, bandwidth\n\ requirements and permissions relevant to your operating licence.

\n\

At the bottom of the list are two “modes” which aren’t modes at all, and do not\n\ transmit (see Online Documentation for details). WWV mode allows you to receive a\n\ standard time signal so the beeps it transmits can be used for sound card\n\ calibration. Freq Analysis provides just a waterfall display with a very\n\ narrow cursor, and a frequency meter which indicates the received frequency in\n\ Hz to two decimal places. This is useful for on-air frequency measurement.

\n\
Configure

This is where you set up the program to suit your computer, yourself and your\n\ operating preferences. The operating settings of the program are grouped into\n\ several categories and there are menu items in which you enter your personal\n\ information, or define your computer sound card, for example. Modems can be\n\ individually changed, each having different adjustments. The Modems dialog has\n\ multiple tabs, so you can edit any one of them. Don’t fool with the settings\n\ until you know what you are doing! The final item, Save Config allows you to\n\ save the altered configuration for next time you start the program (otherwise\n\ changes are temporary).

\n\
View

This menu item allows you to open extra windows. Most will be greyed out, but\n\ two that are available are the Digiscope, and the PSK Browser. The Digiscope\n\ provides a mode-specific graphical analysis of the received signal, and can have\n\ more than one view (left click in the new window to change the view), or maybe\n\ none at all. The PSK Browser is a rather cool tool that allows you to monitor\n\ several PSK31 signals all at the same time! These windows can be resized to\n\ suit.

\n\
Help

Brings up the Online Documentation, the Fldigi Home Page, and various\n\ information about the program.

\n\
\n\
\n\

3.5.2. Other controls

\n\
RSID

The RxID button turns on the receive RSID (automatic mode detection and tuning)\n\ feature. When in use, the button turns yellow and no text reception is possible\n\ until a signal is identified, or the feature is turned off again. If you plan to\n\ use the RSID feature on receive, you must leave the Start New Modem at Sweet\n\ Spot item in the menu Configure→Defaults→Misc tab unchecked.

\n\
TUNE

This button transmits a continuous tone at the current audio frequency. The tone\n\ level will be at the maximum signal level for any modem, which makes this\n\ function useful for adjusting your transceiver’s output power.

\n\
\n\
\n\
\n\

3.6. Macro buttons

\n\

This line of buttons provides user-editable QSO features. For example, the first\n\ button on the left sends CQ for you. Both the function of these buttons (we call\n\ them Macros) and the label on each button, can be changed.

\n\

Select each button to use it by pressing the corresponding Function Key (F1 -\n\ F12, you’ll notice the buttons are grouped in patterns four to a group, just as\n\ the Function Keys are). You can also select them with a left-click of the\n\ mouse. If you right-click on the button, you are able to edit the button’s label\n\ and its function. A handy dialog pops up to allow this to be done. There are\n\ many standard shortcuts, such as <MYCALL>, which you can use within the\n\ Macros. Notice that the buttons also turn the transmitter on and off as\n\ necessary.

\n\

You can just about hold a complete QSO using these buttons from left to right\n\ (but please don’t!). Notice that at the right are two spare buttons you can set\n\ as you wish, and then a button labelled 1. Yes, this is the first set of\n\ four sets of Macros, and you can access the others using this button, which\n\ changes to read 2, 3, 4 then 1 again (right-click to go backwards), or\n\ by pressing Alt and the corresponding number (1-4, not F1-F4) at the same\n\ time.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

If you really mess up the Macros and can’t see how to fix them, just close the\n\ program without saving them, and reopen it.

\n\
\n\
\n\
\n\
\n\

3.7. Controls

\n\

The line of buttons under the waterfall is used to control the program (as\n\ opposed to the QSO). If you hover the mouse over these buttons, you’ll see a\n\ little yellow hint box appear which tells you what each button does.

\n\

The first button switches between Waterfall, FFT and Scope modes. The next two\n\ buttons adjust the signal level over which the waterfall works. The default\n\ range is from 0dB downwards 70dB (i.e. to -70dB). Both of these values can be\n\ adjusted to suit your sound card and receiver audio level.

\n\

The next button sets the scale zoom factor (visible display width, ×1, ×2 or\n\ ×4), and the next three buttons move the visible waterfall area in relation to\n\ the bandwidth cursor.

\n\

The next button selects the waterfall speed. NORM or SLOW setting is best unless\n\ you have a very fast computer.

\n\

The next four buttons (two on either side of a number, the audio frequency in\n\ Hz) control the receiving frequency (they move the red cursor lines).

\n\

The QSY button moves the signal under the bandwidth cursor to a preset audio\n\ frequency (typically, the centre of the transceiver’s passband). The Store\n\ button allows you to store or recall the current frequency and mode. See the\n\ Online Documentation for details on these functions.

\n\

The Lk button locks the transmit frequency (and illuminates a green marker), and the\n\ Rv button turns the signal decoding upside down (some modes are sideband\n\ sensitive, and if they are the wrong way up, can’t be received\n\ correctly). Remember to turn this one off when you’re done, or you won’t receive\n\ anything! If every signal you hear is upside down, check your transceiver\n\ sideband setting.

\n\

The T/R button forces the transmitter on or off.

\n\
\n\ \n\ \n\ \n\
\n\ \"Caution\"\n\ \n\

Use the T/R button with care, as it will stop transmission immediately, losing\n\ whatever is in the buffer (what you have typed in the Transmit pane), or start\n\ it immediately, even if nothing is ready to transmit.

\n\
\n\
\n\

There are two further controls in the bottom right corner of the program, to the\n\ right of the Status line:

\n\
\n\
\n\ AFC (AFC) control\n\
\n\
\n\

\n\ When this button is pressed, an indicator on the button turns yellow, and the\n\ program will automatically retune to drifting signals. When the button is\n\ again pressed, AFC is off, and the tuning will stay where you leave it.\n\

\n\
\n\
\n\ SQL (Squelch) control\n\
\n\
\n\

\n\ When off (no coloured indicator on the button), the receiver displays all\n\ “text” received, even if there is no signal present, and the receiver is\n\ simply attempting to decode noise. When activated by pressing the button, the\n\ indicator turns yellow. If the incoming signal strength exceeds that set by\n\ the adjacent slider control (above the SQL button), the indicator turns\n\ green and the incoming signal is decoded and printed. The signal strength is\n\ indicated on the green bar beside the Squelch level slider. If nothing seems\n\ to be printing, the first thing to do is check the Squelch!\n\

\n\
\n\
\n\
\n\
\n\

3.8. Status Line

\n\

At the very bottom line of the Fldigi window is a row of useful information. At\n\ the left is the current operating mode. Next (some modes) is the measured\n\ signal-to-noise ratio at the receiver, and (in some modes) the measured signal\n\ intermodulation level (IMD).

\n\

The larger central box shows (in DominoEX and THOR modes) the received\n\ Secondary Text. This is information (such as station identification) which is\n\ transmitted automatically whenever the transmitter has completed all user text\n\ that is available to send. It is transmitted using special characters, and is\n\ automatically directed to this special window. Secondary text you transmit is\n\ also shown here. This box changes size when you enlarge the program window.

\n\
\n\
\n\
\n\
\n\

4. Operating

\n\
\n\
\n\

4.1. Procedure

\n\

Operating procedure for digital modes is similar to that for Morse. Some of the\n\ same abbreviations are used. For example, at the beginning of an over, you might\n\ send VK3XYZ de WB8ABC or just RR Jack and so on. At the end of an over, it\n\ is usual to send ZL1ABC de AA3AR K, and at the end of a QSO 73 F3XYZ de 3D2ZZ\n\ SK. When operating in a group or net it is usual to sign AA3AE es gp de ZK8WW\n\ K.

\n\

It is also considered a courtesy to send a blank line or two (press Enter)\n\ before any text at the start of an over, and following the last text at the end\n\ of an over. You can also place these in the macros. The purpose is to separate\n\ your text from the previous text, and especially from any rubbish that was\n\ printed between overs.

\n\

Fldigi does all of this for you. The Function Keys are set up to provide these\n\ start and end of over facilities, and can be edited to suit your preferences. In\n\ order that the other station’s callsign can appear when these keys are used, you\n\ need to set the other station’s callsign in the log data — it does not matter if\n\ you use the log facility or not.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\
Macro symbols
\n\

Some Function Key Macro buttons have graphic symbols on them which imply\n\ the following:

\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\ >>\n\
\n\
\n\

\n\ The transmitter comes on and stays on when you use this button/macro.\n\

\n\
\n\ ||\n\
\n\
\n\

\n\ The transmitter goes off when the text from this button/macro has been\n\ sent.\n\

\n\
\n\ >|\n\
\n\
\n\

\n\ The transmitter comes on, sends the text from this button/macro, and\n\ goes off when the text from this button/macro has been sent.\n\

\n\
\n\
\n\
\n\

The Macros are set up to control the transmitter as necessary, but you can also\n\ switch the transmitter on at the start of an over with Ctrl and T or the TX\n\ macro button, and off again with Ctrl and R or the RX macro button. If you\n\ have Macros copied into or text already typed in the Transmit pane when you\n\ start the transmitter, this is sent first.

\n\

Calling another station you have tuned in is as simple as pushing a button. Put\n\ his callsign into the log data (right click, select Call) and press the ANS\n\ Macro button (or F2) when you are ready. If he replies, you are in business!\n\ Then press QSO (F3) to start each over, and BTU (F4) to end it, and SK\n\ (F5) to sign off.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

When typing text, the correct use of upper and lower case is important:

\n\
    \n\
  • \n\

    \n\ Modes such as RTTY and THROB have no lower case capability.\n\

    \n\
  • \n\
  • \n\

    \n\ In most other modes, excessive use of upper case is considered impolite, like\n\ SHOUTING!\n\

    \n\
  • \n\
  • \n\

    \n\ Modes such as PSK31, MFSK16, DominoEX and THOR use character sets which are\n\ optimised for lower case. You should use lower case as much as possible in\n\ these modes to achieve maximum text speed. In these modes upper case\n\ characters are noticeably slower to send and also slightly more prone to\n\ errors.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

4.2. Adjustment

\n\

Most digital modes do not require much transmitter power, as the receiver\n\ software is very sensitive. Many modes (PSK31, THROB, MT63) also require very\n\ high transmitter linearity, which is another reason to keep transmitter power\n\ below 30% of maximum. Some modes (Hellschreiber, Morse) have high peak power\n\ output, which may not indicate well on the conventional power meter, another\n\ reason to keep the average transmitted power low to prevent a very broad signal\n\ being transmitted.

\n\

Adjust the transmitter output power using the TUNE button, top right, beyond the\n\ Menu. The output will be the same as the peak power in other modes. Adjust the\n\ master Volume applet Wave Out and Master Volume controls to achieve the\n\ appropriate power. Use of excessive drive will result in distortion (signal\n\ difficult to tune in, and often poorer reception) and a very broad signal.

\n\

Some multi-carrier modes (MT63 for example) may require individual adjustment as\n\ the average power may be rather low.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\

Where possible, use the area above 1200Hz on the waterfall.

\n\
    \n\
  • \n\

    \n\ Below 1200Hz the second harmonic of the transmitted audio will pass through\n\ the transmitter filters.\n\

    \n\
  • \n\
  • \n\

    \n\ When using lower frequency tones, adjust the transmitter and audio level with\n\ great care, as the second (and even third) harmonic will appear in the\n\ transmitter passband, causing excessive signal width.\n\

    \n\
  • \n\
  • \n\

    \n\ A narrow (CW) filter in the rig is no help in this regard, as it is only used\n\ on receive. When you do use a narrow filter, this will restrict the area over\n\ which the receiver and transmitter will operate (without retuning of\n\ course). Try adjusting the passband tuning (if available).\n\

    \n\
  • \n\
  • \n\

    \n\ Keep the sound card audio level to a minimum and set the transmitter gain to a\n\ similar level used for SSB.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

4.3. Waterfall Tuning

\n\

When using this program, as with most other digital modes programs, tuning is\n\ generally accomplished by leaving the transceiver VFO at a popular spot (for\n\ example 14.070MHz, USB), and performing all the tuning by moving around within\n\ the software.

\n\

The Fldigi software has a second “VFO” which is tuned by clicking on the\n\ waterfall. On a busy band, you may see many signals at the same time (especially\n\ with PSK31 or Morse), and so you can click with the mouse on any one of these\n\ signals to tune it in, receive it, and if the opportunity allows, reply to the\n\ station.

\n\

The software “VFO” operates in a transceive mode, so the transmitter signal is\n\ automatically and exactly tuned to the received frequency. If you click\n\ correctly on the signal, your reply will always be in tune with the other\n\ station.

\n\
\n\ \n\ \n\ \n\
\n\ \"Important\"\n\ \n\

You must not use RIT (Clarifier) when using digital modes.

\n\
    \n\
  • \n\

    \n\ With RIT on, you will probably have to retune after every over.\n\

    \n\
  • \n\
  • \n\

    \n\ Use of the RIT will also cause the other station to change frequency, and you\n\ will chase each other across the band.\n\

    \n\
  • \n\
  • \n\

    \n\ Older transceivers without digital synthesis may have an unwanted offset\n\ (frequency difference) between transmit and receive frequencies. Such rigs\n\ should not be used for digital modes.\n\

    \n\
  • \n\
\n\
\n\
\n\

Wider digital modes (MT63, Olivia) can be tuned using the rig if necessary, as\n\ tuning is not at all critical. The software tuning still operates, but because\n\ the signal is so wide, there is limited ability to move around in the waterfall\n\ tuning.

\n\
\n\
\n\
\n\
\n\

5. Special Keys

\n\
\n\

Several special keyboard controls are provided to make operating easier.

\n\
Start Transmission

Press Ctrl and T to start transmission if there is text ready in the transmit\n\ buffer.

\n\
Pause Transmission

Press Pause or Break while in receive, and the program will switch to\n\ transmit mode. It will continue with the text in the transmit buffer (the\n\ Transmit pane text) from the current point, i.e. where the red (previously sent)\n\ text ends and the black (yet to be sent) text begins. If the buffer only\n\ contains unsent text, then it will begin at the first character in the\n\ buffer. If the buffer is empty, the program will switch to transmit mode, and\n\ depending on the mode of operation, will send idle characters or nothing at all\n\ until characters are entered into the buffer.

\n\

If you press Pause or Break while in transmit mode, the program will return\n\ to receive mode. There may be a slight delay for some modes like MFSK, PSK and\n\ others, that requires the transmitter to send a postamble at the end of a\n\ transmission. The transmit text buffer stays intact, ready for the\n\ Pause/Break key to return you to the transmit mode .

\n\

Pressing Alt or Meta and R has the same effect as Pause/Break. You\n\ could think of the Pause/Break key as a software break-in capability.

\n\
Escape

Pressing Esc while transmitting will abort the transmission. Transmission\n\ stops as soon as possible, (any necessary postamble is sent), and the program\n\ returns to receive. Any unsent text in the transmit buffer will be lost.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\

If you press Esc Esc (i.e. twice in quick succession), transmission stops\n\ immediately, without sending any postamble, and the program returns to\n\ receive. Any unsent text in the transmit buffer will be lost. Use this feature\n\ as an emergency stop.

\n\
\n\
\n\
Return to Receive

Press Ctrl and R to insert the ^r command in the transmit buffer at the\n\ current typing point. When transmission reaches this point, transmission will\n\ stop.

\n\
Move Typing Cursor

Press Tab to move the cursor (typing insertion point) to the end of the\n\ transmit buffer. This will also pause transmission. A Tab press at that\n\ position moves the cursor back to the character following the last one\n\ transmitted. Morse operation is slightly different. See the Online Documentation for CW.

\n\
Send Any ASCII Character

Press Ctrl and (at the same time) any three-digit number (on the numeric\n\ keypad or the normal numeric keys) to insert the ASCII character designated by\n\ that entry value into the transmit buffer. For example, Ctrl 177 is “±”\n\ (plus/minus) and Ctrl 176 is “°” (degree). If you press a key other than the\n\ numeric keypad’s 0-9 the sequence will be discarded.

\n\

Credits

\n\

Copyright © 2008 Murray Greenman, ZL1BPU.

\n\

Copyright © 2008-2009 David Freese, W1HKJ.

\n\

Copyright © 2009 Stelios Bounanos, M0GLD.

\n\ \n\
\n\
\n\
\n\

\n\
\n\
\n\ Last updated\n\ 2018-02-24 13:42:49 \n\
\n\
\n\ \n\ \"Valid\n\ \n\ \n\ \"Valid\n\ \n\
\n\
\n\ \n\ \n\n"; fldigi-4.1.06/src/dialogs/testsigs.fl0000644000175000017500000000303113472115774014372 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include "configuration.h"} {private local } Function {make_testdialog()} {open } { Fl_Window {} { label {Test Signals} open xywh {999 31 480 100} type Double visible } { Fl_Counter noiseDB { label {Noise level (db)} callback {progdefaults.s2n = o->value();} selected xywh {10 41 127 21} align 1 minimum -30 maximum 60 value 20 code0 {o->value(progdefaults.s2n);} code1 {o->lstep(1);} code2 {\#include "flslider2.h"} class Fl_Counter2 } Fl_Check_Button btnNoiseOn { label {Noise on} callback {progdefaults.noise = o->value();} xywh {39 73 68 12} down_box DOWN_BOX code0 {o->value(progdefaults.noise);} } Fl_Counter ctrl_freq_offset { label {freq-offset} tooltip {ONLY FOR TESTING !} xywh {174 41 127 21} align 1 minimum -250 maximum 250 code0 {o->lstep(10);} } Fl_Check_Button btnOffsetOn { label {Offset on} xywh {203 73 68 12} down_box DOWN_BOX } Fl_Counter xmtimd { label {PSK IMD level (db)} xywh {339 41 127 21} align 1 minimum -40 maximum -15 value -30 code0 {o->lstep(1.0);} class Fl_Counter2 } Fl_Check_Button btn_imd_on { label {IMD on} xywh {368 73 68 12} down_box DOWN_BOX } Fl_Box {} { label {!! DO NOT USE ON LIVE TRANSMITER !!} xywh {2 2 368 20} labelcolor 80 } } } fldigi-4.1.06/src/dialogs/notifydialog.fl0000644000175000017500000001440413472115774015223 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0300 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include "table.h"} {public global } decl {\#include "flinput2.h"} {public global } decl {\#include "flslider2.h"} {public global } decl {\#include "notify.h"} {private local } Function {make_notify_window()} {open } { Fl_Window {} { label Notifications open xywh {671 439 500 550} type Double resizable size_range {500 550 0 0} visible } { Fl_Group grpNotifyEvent { label Event open xywh {2 2 219 126} box ENGRAVED_FRAME align 21 } { Fl_Choice mnuNotifyEvent {open selected xywh {10 29 205 22} down_box BORDER_BOX } {} Fl_Light_Button btnNotifyEnabled { label Enabled xywh {131 94 80 23} } Fl_Input inpNotifyRE { label {RE:} xywh {36 61 175 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group grpNotifyFilter { label Filter open xywh {2 130 219 176} box ENGRAVED_FRAME align 21 } { Fl_Round_Button chkNotifyFilterCall { label Callsign callback {if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->show(); btnNotifyFilterDXCC->hide(); chkNotifyFilterDXCC->value(0);} xywh {12 157 80 20} down_box ROUND_DOWN_BOX } Fl_Input inpNotifyFilterCall { xywh {131 157 80 20} align 0 class Fl_Input2 } Fl_Round_Button chkNotifyFilterDXCC { label {DXCC entity} callback {if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->show(); chkNotifyFilterCall->value(0);} xywh {12 186 110 20} down_box ROUND_DOWN_BOX } Fl_Button btnNotifyFilterDXCC { tooltip {Show DXCC entities} xywh {183 183 28 23} } Fl_Check_Button chkNotifyFilterNWB { label {Not worked before} xywh {12 216 155 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyFilterLOTW { label {LotW user} xywh {12 246 100 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyFilterEQSL { label {eQSL user} xywh {12 276 100 20} down_box DOWN_BOX } } Fl_Group grpNotifyDup { label Duplicates xywh {2 308 219 149} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkNotifyDupIgnore { label {Ignore duplicates} xywh {12 337 145 20} down_box DOWN_BOX } Fl_Choice mnuNotifyDupWhich { label {in:} open xywh {33 367 120 20} down_box BORDER_BOX } {} Fl_Spinner cntNotifyDupTime { label {Time (s):} xywh {93 397 60 20} minimum 0 maximum 97200 value 600 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Check_Button chkNotifyDupBand { label Band xywh {12 427 65 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyDupMode { label Mode xywh {94 427 60 20} down_box DOWN_BOX } } Fl_Group grpNotifyAction { label Action open xywh {222 2 276 394} box ENGRAVED_FRAME align 21 } { Fl_Spinner cntNotifyActionLimit { label {Trigger limit (s):} tooltip {Minimum time between events} xywh {232 40 52 20} align 5 minimum 0 maximum 3600 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Input inpNotifyActionDialog { label {Show alert window:} xywh {232 82 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionDialogDefault { tooltip {Insert default text} xywh {460 100 28 23} } Fl_Spinner cntNotifyActionDialogTimeout { label {Hide window after (s):} xywh {232 164 52 20} align 5 minimum 0 maximum 3600 value 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Input inpNotifyActionRXMarker { label {Append to RX text:} xywh {232 205 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionMarkerDefault { tooltip {Insert default text} xywh {460 223 28 23} } Fl_Input inpNotifyActionMacro { label {Append to TX text:} xywh {232 287 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionMacro { tooltip {Show macro editor} xywh {460 305 28 23} } Fl_Input inpNotifyActionProgram { label {Run program:} xywh {232 368 218 23} align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionProgram { xywh {460 368 28 23} } } Fl_Button btnNotifyAdd { xywh {223 402 90 23} } Fl_Button btnNotifyRemove { xywh {316 402 90 23} } Fl_Button btnNotifyUpdate { xywh {223 431 90 23} } Fl_Button btnNotifyTest { xywh {316 431 90 23} } Fl_Button btnNotifyClose { callback {o->window()->hide();} xywh {408 431 90 23} } Fl_Box tblNotifyList { xywh {2 460 496 88} box UP_FRAME selection_color 15 resizable class Table } } } Function {make_dxcc_window()} {open } { Fl_Window {} { label {DXCC entities} open xywh {618 147 435 450} type Double hide resizable size_range {300 400 0 0} } { Fl_Box tblNotifyFilterDXCC { xywh {2 2 432 370} box UP_FRAME color 7 selection_color 15 resizable class Table } Fl_Input inpNotifyDXCCSearchCountry { label {Find country:} tooltip {Press return to continue the search} xywh {104 382 120 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpNotifyDXCCSearchCallsign { label {Find prefix:} xywh {104 415 120 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyDXCCSelect { xywh {234 382 90 23} } Fl_Button btnNotifyDXCCDeselect { xywh {234 415 90 23} } Fl_Button btnNotifyDXCCClose { callback {o->window()->hide();} xywh {334 415 90 23} } } } fldigi-4.1.06/src/dialogs/record_browse.fl0000644000175000017500000000252413472115774015372 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0302 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include "record_loader_gui.h"} {public global } decl {\#include } {public local } Function {make_record_loader_window()} {open } { Fl_Window {} { label {Data files sources} open tooltip {Data files update} xywh {614 112 540 280} type Double resizable visible } { Fl_Group tabDataFiles {open tooltip {Tabular data sources} xywh {5 25 570 275} resizable } { Fl_Table {} { label {Data files sources} open xywh {6 25 529 217} labeltype NO_LABEL resizable class DerivedRecordLst } {} Fl_Input_Choice inpDataSources { label {Data source} open tooltip {Data files repository} xywh {6 254 284 21} align 8 } {} Fl_Light_Button btnDataSourceUpdate { label Update callback {DerivedRecordLst::cbGuiUpdate();} tooltip {Update selected local data files with repository content} xywh {387 254 74 20} } Fl_Button btnDataSourceReset { label Reset callback {DerivedRecordLst::cbGuiReset();} tooltip {Delete local data files if selected.} xywh {465 254 70 20} } } } } fldigi-4.1.06/src/dialogs/Viewer.cxx0000644000175000017500000002765513472115774014211 00000000000000// ---------------------------------------------------------------------------- // // Viewer.cxx -- PSK browser // // Copyright (C) 2008-2009 // David Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "Viewer.h" #include "trx.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "re.h" #include "gettext.h" #include "flmisc.h" #include "spot.h" #include "icons.h" #include "psk_browser.h" #include "view_rtty.h" #include "spectrum_viewer.h" extern pskBrowser *mainViewer; using namespace std; // // External viewer dialog // Fl_Double_Window *dlgViewer = 0; static Fl_Button *btnCloseViewer; static Fl_Button *btnClearViewer; Fl_Input2 *viewer_inp_seek; Fl_Value_Slider2 *sldrViewerSquelch; pskBrowser *brwsViewer; static long long rfc; static bool usb; void initViewer() { usb = wf->USB(); rfc = wf->rfcarrier(); if (mainViewer) { mainViewer->usb = usb; mainViewer->rfc = rfc; mainViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); mainViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); mainViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); mainViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); mainViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); mainViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); mainViewer->makecolors(); mainViewer->clear(); if (active_modem->get_mode() == MODE_RTTY) { mvsquelch->range(-12.0, 6.0); mvsquelch->value(progStatus.VIEWER_rttysquelch); } else if (active_modem->get_mode() == MODE_CW) { mvsquelch->range(0.0, 40.0); mvsquelch->value(progStatus.VIEWER_cwsquelch); } else { mvsquelch->range(-3.0, 6.0); mvsquelch->value(progStatus.VIEWER_psksquelch); } mvsquelch->redraw(); } if (brwsViewer) { brwsViewer->usb = usb; brwsViewer->rfc = rfc; brwsViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); brwsViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); brwsViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); brwsViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); brwsViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); brwsViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); brwsViewer->makecolors(); brwsViewer->clear(); dlgViewer->size(dlgViewer->w(), dlgViewer->h() - brwsViewer->h() + pskBrowser::cheight * progdefaults.VIEWERchannels + 4); if (active_modem->get_mode() == MODE_RTTY) { sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->value(progStatus.VIEWER_rttysquelch); } else if (active_modem->get_mode() == MODE_CW) { sldrViewerSquelch->range(0.0, 40.0); sldrViewerSquelch->value(progStatus.VIEWER_cwsquelch); } else { sldrViewerSquelch->range(-3.0, 6.0); sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); } sldrViewerSquelch->redraw(); } active_modem->clear_viewer(); } void viewaddchr(int ch, int freq, char c, int md) { if (mainViewer) { if (mainViewer->rfc != wf->rfcarrier() || mainViewer->usb != wf->USB()) { mainViewer->rfc = wf->rfcarrier(); mainViewer->usb = wf->USB(); mainViewer->redraw(); } mainViewer->addchr(ch, freq, c, md, true); } if (dlgViewer) { if (brwsViewer->rfc != wf->rfcarrier() || brwsViewer->usb != wf->USB()) { brwsViewer->rfc = wf->rfcarrier(); brwsViewer->usb = wf->USB(); brwsViewer->redraw(); } brwsViewer->addchr(ch, freq, c, md); } if (progStatus.spot_recv && freq != NULLFREQ) spot_recv(c, ch, freq, md); } void viewclearchannel(int ch) // 0 < ch < channels - 1 { if (mainViewer) mainViewer->clearch(ch, NULLFREQ); if (dlgViewer) brwsViewer->clearch(ch, NULLFREQ); } void viewerswap(int i, int j) { if (mainViewer) mainViewer->swap(i,j); if (dlgViewer) brwsViewer->swap(i,j); } void viewer_redraw() { usb = wf->USB(); rfc = wf->rfcarrier(); if (mainViewer) { mainViewer->usb = usb; mainViewer->rfc = rfc; mainViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); mainViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); mainViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); mainViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); mainViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); mainViewer->makecolors(); mainViewer->resize(mainViewer->x(), mainViewer->y(), mainViewer->w(), mainViewer->h()); } if (dlgViewer) { brwsViewer->usb = usb; brwsViewer->rfc = rfc; brwsViewer->resize( brwsViewer->x(), brwsViewer->y(), brwsViewer->w(), brwsViewer->h()); brwsViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); brwsViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); brwsViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); brwsViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); brwsViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); brwsViewer->makecolors(); dlgViewer->redraw(); } } static void cb_btnCloseViewer(Fl_Button*, void*) { progStatus.VIEWERxpos = dlgViewer->x(); progStatus.VIEWERypos = dlgViewer->y(); progStatus.VIEWERwidth = dlgViewer->w(); progStatus.VIEWERheight = dlgViewer->h(); dlgViewer->hide(); } static void cb_btnClearViewer(Fl_Button*, void*) { brwsViewer->clear(); if (mainViewer) mainViewer->clear(); active_modem->clear_viewer(); } static void cb_brwsViewer(Fl_Hold_Browser*, void*) { int sel = brwsViewer->value(); if (sel == 0 || sel > progdefaults.VIEWERchannels) return; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (brwsViewer->freq(sel) != NULLFREQ) { if (progdefaults.VIEWERhistory) { ReceiveText->addchr('\n', FTextBase::RECV); bHistory = true; } else { ReceiveText->addchr('\n', FTextBase::ALTR); ReceiveText->addstr(brwsViewer->line(sel).c_str(), FTextBase::ALTR); } active_modem->set_freq(brwsViewer->freq(sel)); recenter_spectrum_viewer(); active_modem->set_sigsearch(SIGSEARCH); if (mainViewer) mainViewer->select(sel); } else brwsViewer->deselect(); break; case FL_MIDDLE_MOUSE: // copy from modem // set_freq(sel, active_modem->get_freq()); break; case FL_RIGHT_MOUSE: // reset { int ch = progdefaults.VIEWERascend ? progdefaults.VIEWERchannels - sel : sel - 1; active_modem->clear_ch(ch); brwsViewer->deselect(); if (mainViewer) mainViewer->deselect(); } default: break; } } static void cb_Squelch(Fl_Slider *, void *) { if (active_modem->get_mode() == MODE_RTTY) progStatus.VIEWER_rttysquelch = sldrViewerSquelch->value(); else if (active_modem->get_mode() == MODE_CW) progStatus.VIEWER_cwsquelch = sldrViewerSquelch->value(); else progStatus.VIEWER_psksquelch = sldrViewerSquelch->value(); if (mainViewer) mvsquelch->value(sldrViewerSquelch->value()); } static void cb_Seek(Fl_Input *, void *) { static Fl_Color seek_color[2] = { FL_FOREGROUND_COLOR, adjust_color(FL_RED, FL_BACKGROUND2_COLOR) }; // invalid RE seek_re.recompile(*viewer_inp_seek->value() ? viewer_inp_seek->value() : "[invalid"); if (viewer_inp_seek->textcolor() != seek_color[!seek_re]) { viewer_inp_seek->textcolor(seek_color[!seek_re]); viewer_inp_seek->redraw(); } progStatus.browser_search = viewer_inp_seek->value(); if (mainViewer) txtInpSeek->value(progStatus.browser_search.c_str()); } Fl_Double_Window* createViewer(void) { fl_font(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); pskBrowser::cwidth = (int)fl_width("W"); pskBrowser::cheight = fl_height(); progStatus.VIEWERnchars = progStatus.VIEWERnchars > 30 ? progStatus.VIEWERnchars : 30; int pad = BWSR_BORDER / 2; int viewerwidth = progStatus.VIEWERwidth - 2*BWSR_BORDER; int viewerheight = progStatus.VIEWERheight - 2 * BWSR_BORDER - pad - 20; Fl_Double_Window* w = new Fl_Double_Window(progStatus.VIEWERxpos, progStatus.VIEWERypos, viewerwidth + 2 * BWSR_BORDER, viewerheight + 2 * BWSR_BORDER + pad + 20 + 20, _("Signal Browser")); Fl_Group* gseek = new Fl_Group(BWSR_BORDER, BWSR_BORDER, viewerwidth, 20); // search field const char* label = _("Find: "); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); viewer_inp_seek = new Fl_Input2(static_cast(BWSR_BORDER + fl_width(label) + fl_width("X")), BWSR_BORDER, 200, gseek->h(), label); viewer_inp_seek->labelfont(FL_HELVETICA); viewer_inp_seek->callback((Fl_Callback*)cb_Seek); viewer_inp_seek->when(FL_WHEN_CHANGED); viewer_inp_seek->textfont(FL_HELVETICA); viewer_inp_seek->value(progStatus.browser_search.c_str()); viewer_inp_seek->do_callback(); gseek->resizable(0); gseek->end(); brwsViewer = new pskBrowser(BWSR_BORDER, viewer_inp_seek->y() + viewer_inp_seek->h(), viewerwidth, viewerheight); brwsViewer->callback((Fl_Callback*)cb_brwsViewer); brwsViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); brwsViewer->seek_re = &seek_re; Fl_Group *g = new Fl_Group(BWSR_BORDER, brwsViewer->y() + brwsViewer->h() + pad, viewerwidth, 20); // close button btnCloseViewer = new Fl_Button(g->w() + BWSR_BORDER - 75, g->y(), 75, g->h(), icons::make_icon_label(_("Close"), close_icon)); btnCloseViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnCloseViewer); btnCloseViewer->callback((Fl_Callback*)cb_btnCloseViewer); // clear button btnClearViewer = new Fl_Button(btnCloseViewer->x() - btnCloseViewer->w() - pad, btnCloseViewer->y(), btnCloseViewer->w(), btnCloseViewer->h(), icons::make_icon_label(_("Clear"), edit_clear_icon)); btnClearViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnClearViewer); btnClearViewer->callback((Fl_Callback*)cb_btnClearViewer); btnClearViewer->tooltip(_("Left click to clear text\nRight click to reset frequencies")); // squelch sldrViewerSquelch = new Fl_Value_Slider2(BWSR_BORDER, g->y(), btnClearViewer->x() - BWSR_BORDER - pad, g->h()); sldrViewerSquelch->align(FL_ALIGN_RIGHT); sldrViewerSquelch->tooltip(_("Set Viewer Squelch")); sldrViewerSquelch->type(FL_HOR_NICE_SLIDER); sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->step(0.1); sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); sldrViewerSquelch->callback((Fl_Callback*)cb_Squelch); sldrViewerSquelch->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); sldrViewerSquelch->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); g->resizable(sldrViewerSquelch); g->end(); w->end(); w->callback((Fl_Callback*)cb_btnCloseViewer); w->resizable(brwsViewer); w->size_range( (30 * pskBrowser::cwidth) + pskBrowser::sbarwidth + 2 * BWSR_BORDER, 5 * pskBrowser::cheight + 20 + 2 * BWSR_BORDER + pad); w->xclass(PACKAGE_NAME); w->hide(); return w; } void openViewer() { if (!dlgViewer) { dlgViewer = createViewer(); } initViewer(); dlgViewer->show(); dlgViewer->redraw(); } void viewer_paste_freq(int freq) { for (int i = 0; i < progdefaults.VIEWERchannels; i++) { int ftest = active_modem->viewer_get_freq(i); if (ftest == NULLFREQ) continue; if (fabs(ftest - freq) <= 50) { if (progdefaults.VIEWERascend) i = (progdefaults.VIEWERchannels - i); else i++; if (mainViewer) mainViewer->select(i); if (brwsViewer) brwsViewer->select(i); return; } } } fldigi-4.1.06/src/dialogs/testsigs.cxx0000644000175000017500000000605413511722452014572 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #include "gettext.h" #include "testsigs.h" #include "configuration.h" Fl_Counter2 *noiseDB=(Fl_Counter2 *)0; static void cb_noiseDB(Fl_Counter2* o, void*) { progdefaults.s2n = o->value(); } Fl_Check_Button *btnNoiseOn=(Fl_Check_Button *)0; static void cb_btnNoiseOn(Fl_Check_Button* o, void*) { progdefaults.noise = o->value(); } Fl_Counter *ctrl_freq_offset=(Fl_Counter *)0; Fl_Check_Button *btnOffsetOn=(Fl_Check_Button *)0; Fl_Counter2 *xmtimd=(Fl_Counter2 *)0; Fl_Check_Button *btn_imd_on=(Fl_Check_Button *)0; Fl_Double_Window* make_testdialog() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(480, 100, _("Test Signals")); w = o; if (w) {/* empty */} { Fl_Counter2* o = noiseDB = new Fl_Counter2(10, 41, 127, 21, _("Noise level (db)")); noiseDB->box(FL_UP_BOX); noiseDB->color(FL_BACKGROUND_COLOR); noiseDB->selection_color(FL_INACTIVE_COLOR); noiseDB->labeltype(FL_NORMAL_LABEL); noiseDB->labelfont(0); noiseDB->labelsize(14); noiseDB->labelcolor(FL_FOREGROUND_COLOR); noiseDB->minimum(-30); noiseDB->maximum(60); noiseDB->value(20); noiseDB->callback((Fl_Callback*)cb_noiseDB); noiseDB->align(Fl_Align(FL_ALIGN_TOP)); noiseDB->when(FL_WHEN_CHANGED); o->value(progdefaults.s2n); o->lstep(1); } // Fl_Counter2* noiseDB { Fl_Check_Button* o = btnNoiseOn = new Fl_Check_Button(39, 73, 68, 12, _("Noise on")); btnNoiseOn->down_box(FL_DOWN_BOX); btnNoiseOn->callback((Fl_Callback*)cb_btnNoiseOn); o->value(progdefaults.noise); } // Fl_Check_Button* btnNoiseOn { Fl_Counter* o = ctrl_freq_offset = new Fl_Counter(174, 41, 127, 21, _("freq-offset")); ctrl_freq_offset->tooltip(_("ONLY FOR TESTING !")); ctrl_freq_offset->minimum(-250); ctrl_freq_offset->maximum(250); ctrl_freq_offset->align(Fl_Align(FL_ALIGN_TOP)); o->lstep(10); } // Fl_Counter* ctrl_freq_offset { btnOffsetOn = new Fl_Check_Button(203, 73, 68, 12, _("Offset on")); btnOffsetOn->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnOffsetOn { Fl_Counter2* o = xmtimd = new Fl_Counter2(339, 41, 127, 21, _("PSK IMD\nlevel (db)")); xmtimd->box(FL_UP_BOX); xmtimd->color(FL_BACKGROUND_COLOR); xmtimd->selection_color(FL_INACTIVE_COLOR); xmtimd->labeltype(FL_NORMAL_LABEL); xmtimd->labelfont(0); xmtimd->labelsize(14); xmtimd->labelcolor(FL_FOREGROUND_COLOR); xmtimd->minimum(-40); xmtimd->maximum(-15); xmtimd->value(-30); xmtimd->align(Fl_Align(FL_ALIGN_TOP)); xmtimd->when(FL_WHEN_CHANGED); o->lstep(1.0); } // Fl_Counter2* xmtimd { btn_imd_on = new Fl_Check_Button(368, 73, 68, 12, _("IMD on")); btn_imd_on->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btn_imd_on { Fl_Box* o = new Fl_Box(2, 2, 368, 20, _("!! DO NOT USE ON LIVE TRANSMITER !!")); o->labelcolor((Fl_Color)80); } // Fl_Box* o o->end(); } // Fl_Double_Window* o return w; } fldigi-4.1.06/src/network/0000775000175000017500000000000013515625027012331 500000000000000fldigi-4.1.06/src/network/socket.cxx0000664000175000017500000010340513511112557014263 00000000000000// ---------------------------------------------------------------------------- // socket.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #define LOG_QRZ_DEBUG 1 #ifndef __MINGW32__ # include # include # if defined(__OpenBSD__) && defined(nitems) # undef nitems # endif # include # include # include # include #else # include "compat.h" #define socklen_t int /* //#define _WIN32_WINNT 0x0501 #define NI_NOFQDN 0x01 #define NI_NUMERICHOST 0x02 #define NI_NAMEREQD 0x04 #define NI_NUMERICSERV 0x08 #define NI_DGRAM 0x10 */ #endif #define DEFAULT_BUFFER_SIZE 1024 #include #include #include #include #include #include #include #include #include #include #include //#undef NDEBUG #include "debug.h" #ifdef BUILD_FLARQ # include "flarq.h" #else # include "main.h" #endif #include "socket.h" #include "estrings.h" #if HAVE_GETADDRINFO && !defined(AI_NUMERICSERV) # define AI_NUMERICSERV 0 #endif using namespace std; static int dummy_value = 0; // // utility functions // #if HAVE_GETADDRINFO static void copy_addrinfo(struct addrinfo** info, const struct addrinfo* src) { struct addrinfo* p = *info; for (const struct addrinfo* rp = src; rp; rp = rp->ai_next) { if (p) { p->ai_next = new struct addrinfo; p = p->ai_next; } else { p = new struct addrinfo; if (!*info) *info = p; } p->ai_flags = rp->ai_flags; p->ai_family = rp->ai_family; p->ai_socktype = rp->ai_socktype; p->ai_protocol = rp->ai_protocol; p->ai_addrlen = rp->ai_addrlen; if (rp->ai_addr) { p->ai_addr = reinterpret_cast(new struct sockaddr_storage); memcpy(p->ai_addr, rp->ai_addr, rp->ai_addrlen); } else p->ai_addr = NULL; if (rp->ai_canonname) p->ai_canonname = strdup(rp->ai_canonname); else p->ai_canonname = NULL; p->ai_next = NULL; } } static void free_addrinfo(struct addrinfo* ai) { for (struct addrinfo *next, *p = ai; p; p = next) { next = p->ai_next; delete reinterpret_cast(p->ai_addr); free(p->ai_canonname); delete p; } } #else static void copy_charpp(char*** dst, const char* const* src) { if (src == NULL) { *dst = NULL; return; } size_t n = 0; for (const char* const* s = src; *s; s++) n++; *dst = new char*[n+1]; for (size_t i = 0; i < n; i++) (*dst)[i] = strdup(src[i]); (*dst)[n] = NULL; } static void copy_hostent(struct hostent* dst, const struct hostent* src) { if (src->h_name) dst->h_name = strdup(src->h_name); else dst->h_name = NULL; copy_charpp(&dst->h_aliases, src->h_aliases); dst->h_length = src->h_length; if (src->h_addr_list) { size_t n = 0; for (const char* const* p = src->h_addr_list; *p; p++) n++; dst->h_addr_list = new char*[n+1]; for (size_t i = 0; i < n; i++) { dst->h_addr_list[i] = new char[src->h_length]; memcpy(dst->h_addr_list[i], src->h_addr_list[i], src->h_length); } dst->h_addr_list[n] = NULL; } else dst->h_addr_list = NULL; } static void copy_servent(struct servent* dst, const struct servent* src) { if (src->s_name) dst->s_name = strdup(src->s_name); else dst->s_name = NULL; copy_charpp(&dst->s_aliases, src->s_aliases); dst->s_port = src->s_port; if (src->s_proto) dst->s_proto = strdup(src->s_proto); else dst->s_proto = NULL; } static void free_charpp(char** pp) { if (!pp) return; for (char** p = pp; *p; p++) free(*p); delete [] pp; } static void free_hostent(struct hostent* hp) { free(const_cast(hp->h_name)); free_charpp(hp->h_aliases); if (hp->h_addr_list) { for (char** p = hp->h_addr_list; *p; p++) delete [] *p; delete [] hp->h_addr_list; } } static void free_servent(struct servent* sp) { free(const_cast(sp->s_name)); free_charpp(sp->s_aliases); free(sp->s_proto); } #endif // HAVE_GETADDRINFO // // Address class // Address::Address(const char* host, int port, const char* proto_name) : node(host), copied(false) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif if (node.empty() && (port == 0)) return; ostringstream s; s << port; service = s.str(); try { lookup(proto_name); } catch (...) { throw; } } Address::Address(const char* host, const char* port_name, const char* proto_name) : node(host), service(port_name), copied(false) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif try { lookup(proto_name); } catch (...) { throw; } } Address::Address(const Address &addr) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif *this = addr; } Address::~Address() { #if HAVE_GETADDRINFO if (info) { if (!copied) freeaddrinfo(info); else free_addrinfo(info); } #else free_hostent(&host_entry); free_servent(&service_entry); #endif } Address& Address::operator=(const Address& rhs) { if (this == &rhs) return *this; node = rhs.node; service = rhs.service; #if HAVE_GETADDRINFO if (info) { if (!copied) freeaddrinfo(info); else free_addrinfo(info); } copy_addrinfo(&info, rhs.info); #else free_hostent(&host_entry); free_servent(&service_entry); copy_hostent(&host_entry, &rhs.host_entry); copy_servent(&service_entry, &rhs.service_entry); addr.ai_protocol = rhs.addr.ai_protocol; addr.ai_socktype = rhs.addr.ai_socktype; #endif copied = true; return *this; } void Address::lookup(const char* proto_name) { //std::cout << "proto_name: " << proto_name << std::endl; int proto; if (!strcasecmp(proto_name, "tcp")) proto = IPPROTO_TCP; else if (!strcasecmp(proto_name, "udp")) proto = IPPROTO_UDP; else throw SocketException("Bad protocol name"); #if HAVE_GETADDRINFO struct addrinfo hints; memset(&hints, 0, sizeof(hints)); # ifdef AI_ADDRCONFIG hints.ai_flags = AI_ADDRCONFIG; # endif hints.ai_family = AF_UNSPEC; hints.ai_socktype = (proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM); if (service.find_first_not_of("0123456789") == string::npos) hints.ai_flags |= AI_NUMERICSERV; //std::cout << "getaddrinfo(" << node << ", " << service << ")" << std::endl; int r = getaddrinfo(node.empty() ? NULL : node.c_str(), service.c_str(), &hints, &info); if (r != 0) { throw SocketException(gai_strerror(r)); } #else // use gethostbyname etc. memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); if (node.empty()) node = "0.0.0.0"; struct hostent* hp; if ((hp = gethostbyname(node.c_str())) == NULL) throw SocketException(hstrerror(HOST_NOT_FOUND)); copy_hostent(&host_entry, hp); int port; struct servent* sp; if ((sp = getservbyname(service.c_str(), NULL)) == NULL) { // if a service name string could not be looked up by name, it must be numeric if (service.find_first_not_of("0123456789") != string::npos) throw SocketException("Unknown service name"); port = htons(atoi(service.c_str())); sp = getservbyport(port, NULL); } if (!sp) service_entry.s_port = port; else copy_servent(&service_entry, sp); memset(&addr, 0, sizeof(addr)); addr.ai_protocol = proto; addr.ai_socktype = (proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM); #endif } /// /// Returns the number of addresses available for /// the node and service /// size_t Address::size(void) const { size_t n = 0; #if HAVE_GETADDRINFO if (!info) return 0; for (struct addrinfo* p = info; p; p = p->ai_next) n++; #else if (!host_entry.h_addr_list) return 0; for (char** p = host_entry.h_addr_list; *p; p++) n++; #endif return n; } /// /// Returns an address from the list of those available /// for the node and service /// const addr_info_t* Address::get(size_t n) const { #if HAVE_GETADDRINFO if (!info) return NULL; struct addrinfo* p = info; for (size_t i = 0; i < n; i++) p = p->ai_next; # ifndef NDEBUG if (LOG_QRZ_DEBUG) LOG_INFO("Found address %s", get_str(p).c_str()); LOG_DEBUG("Found address %s", get_str(p).c_str()); # endif return p; #else if (!host_entry.h_addr_list) return NULL; memset(&saddr, 0, sizeof(saddr)); #ifdef __WIN32__ saddr.sin_family = AF_INET; saddr.sin_addr = *(struct in_addr*)host_entry.h_addr_list[n]; saddr.sin_port = service_entry.s_port; addr.ai_family = saddr.sin_family; #else saddr.sin6_family = AF_INET6; saddr.sin6_addr = *(struct in6_addr*)host_entry.h_addr_list[n]; saddr.sin6_port = service_entry.s_port; addr.ai_family = saddr.sin6_family; #endif addr.ai_addrlen = sizeof(saddr); addr.ai_addr = (struct sockaddr*)&saddr; # ifndef NDEBUG if (LOG_QRZ_DEBUG) LOG_INFO("Found address %s", get_str(&addr).c_str()); LOG_DEBUG("Found address %s", get_str(&addr).c_str()); # endif return &addr; #endif } /// /// Returns the string representation of an address /// string Address::get_str(const addr_info_t* addr) { if (!addr) return ""; #if HAVE_GETADDRINFO char host[NI_MAXHOST], port[NI_MAXSERV]; memset(host, 0, sizeof(host)); if (getnameinfo(addr->ai_addr, sizeof(struct sockaddr_storage), host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV) == 0) return string("[").append(host).append("]:").append(port); else return ""; #else char* host, port[8]; #ifdef __WIN32__ host = inet_ntoa(((struct sockaddr_in*)addr->ai_addr)->sin_addr); snprintf(port, sizeof(port), "%u", htons(((struct sockaddr_in*)addr->ai_addr)->sin_port)); #else host = inet_ntoa(((struct sockaddr_in6*)addr->ai_addr)->sin6_addr); snprintf(port, sizeof(port), "%u", htons(((struct sockaddr_in6*)addr->ai_addr)->sin6_port)); #endif return string("[").append(host).append("]:").append(port); #endif } // // Socket class // #ifdef __MINGW32__ void windows_init(void) { static WSADATA wsaData; static int wsa_init_ = 0; if (wsa_init_) return; wsa_init_ = 1; if (WSAStartup(MAKEWORD(WSA_MAJOR, WSA_MINOR), &wsaData)) { fprintf(stderr, "unable to initialize winsock: error %d", WSAGetLastError()); exit(EXIT_FAILURE); } atexit((void(*)(void)) WSACleanup); } #endif /// Constructs a Socket object and associates the address addr with it. /// This address will be used by subsequent calls to the bind() or connect() /// methods /// /// @param addr An Address object /// Socket::Socket(const Address &addr) { #ifdef __MINGW32__ windows_init(); #endif buffer = new char[S_BUFSIZ]; memset(&timeout, 0, sizeof(timeout)); anum = 0; nonblocking = false; autoclose = true; saddr_size = sizeof(saddr); use_kiss_dual_port = &dummy_value; open(addr); } /// Constructs a Socket object from a file descriptor /// /// @param fd A file descriptor /// Socket::Socket(int fd) : sockfd(fd) { #ifdef __MINGW32__ windows_init(); #endif buffer = new char[S_BUFSIZ]; anum = 0; memset(&timeout, 0, sizeof(timeout)); if (sockfd == -1) return; #ifndef __MINGW32__ int r = fcntl(sockfd, F_GETFL); if (r == -1) throw SocketException(errno, "fcntl"); nonblocking = r & O_NONBLOCK; #else // no way to retrieve nonblocking status on woe32(?!) set_nonblocking(false); #endif autoclose = true; } /// /// Constructs a Socket object by copying another instance /// Socket::Socket(const Socket& s) : sockfd(s.sockfd), address(s.address), anum(s.anum), nonblocking(s.nonblocking), autoclose(true) { #ifdef __MINGW32__ windows_init(); #endif buffer = new char[S_BUFSIZ]; ainfo = address.get(anum); memcpy(&timeout, &s.timeout, sizeof(timeout)); s.set_autoclose(false); } Socket::~Socket() { if(buffer) delete [] buffer; if (autoclose) close(); } Socket& Socket::operator=(const Socket& rhs) { if (this == &rhs) return *this; sockfd = rhs.sockfd; address = rhs.address; anum = rhs.anum; ainfo = address.get(anum); memcpy(&timeout, &rhs.timeout, sizeof(timeout)); nonblocking = rhs.nonblocking; autoclose = rhs.autoclose; rhs.set_autoclose(false); return *this; } void Socket::dual_port(int * dual_port) { if(dual_port) use_kiss_dual_port = dual_port; else use_kiss_dual_port = &dummy_value; } void Socket::set_dual_port_number(unsigned int port) { dual_port_number = port; } void Socket::set_dual_port_number(std::string port) { if(!port.empty()) { dual_port_number = (unsigned int) atoi(port.c_str()); } else { use_kiss_dual_port = &dummy_value; } } /// /// Associates the Socket with an address /// /// This address will be used by subsequent calls to the bind() or connect /// methods. /// /// @params addr An address object /// void Socket::open(const Address& addr) { address = addr; size_t n = address.size(); const addr_info_t* info = (addr_info_t *)0; ainfo = info; for (anum = 0; anum < n; anum++) { info = address.get(anum); if (LOG_QRZ_DEBUG) LOG_INFO("\n\ Address %s\n\ Family %s\n\ Sock type %s\n\ Protocol %s", address.get_str(info).c_str(), (info->ai_family == AF_INET6 ? "AF_INET6" :\ (info->ai_family == AF_INET ? "AF_INET" : "unknown")), (info->ai_socktype == SOCK_STREAM ? "stream" : "dgram"), (info->ai_protocol == IPPROTO_TCP ? "tcp" : (info->ai_protocol == IPPROTO_UDP ? "udp" : "unknown protocol"))); LOG_DEBUG("\n\ Address %s\n\ Family %s\n\ Sock type %s\n\ Protocol %s", address.get_str(info).c_str(), (info->ai_family == AF_INET6 ? "AF_INET6" :\ (info->ai_family == AF_INET ? "AF_INET" : "unknown")), (info->ai_socktype == SOCK_STREAM ? "stream" : "dgram"), (info->ai_protocol == IPPROTO_TCP ? "tcp" : (info->ai_protocol == IPPROTO_UDP ? "udp" : "unknown protocol"))); if (info->ai_family == AF_INET) ainfo = info; } if (ainfo == (addr_info_t *)0) { LOG_ERROR("Cannot find IPv4 address"); throw SocketException("Cannot find IPv4 address"); } LOG_INFO("Trying %s", address.get_str(ainfo).c_str()); if ((sockfd = socket(ainfo->ai_family, ainfo->ai_socktype, ainfo->ai_protocol)) == -1) { //!= -1) { throw SocketException(errno, "Open socket"); } set_close_on_exec(true); } /// /// Shuts down the socket /// void Socket::close(void) { LOG_INFO("sockfd %d", sockfd); #ifdef __MINGW32__ ::closesocket(sockfd); #else ::close(sockfd); #endif connected_flag = false; } /// /// Waits for the socket file descriptor to become ready for I/O /// /// @params dir Specifies the I/O direction. 0 is input, 1 is output. /// /// @return True if the file descriptor became ready within the timeout /// period, false otherwise. @see Socket::set_timeout bool Socket::wait(int dir) { fd_set fdset; FD_ZERO(&fdset); FD_SET((unsigned)sockfd, &fdset); struct timeval t = { timeout.tv_sec, timeout.tv_usec }; int r; if (dir == 0) r = select(sockfd + 1, &fdset, NULL, NULL, &t); else if (dir == 1) r = select(sockfd + 1, NULL, &fdset, NULL, &t); else throw SocketException(EINVAL, "Socket::wait"); if (r == -1) throw SocketException(errno, "select"); return r; } /// /// Binds the socket to the address associated with the object /// @see Socket::open /// void Socket::bind(void) { int r = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&r, sizeof(r)) == -1) #ifndef NDEBUG perror("setsockopt SO_REUSEADDR"); #else ; #endif if (::bind(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) { if(errno != EADDRINUSE) // EADDRINUSE == 48 throw SocketException(errno, "bind"); } } /// /// Binds the socket to the address associated with the object /// @see Socket::open /// void Socket::bindUDP(void) { #ifdef HAVE_GETADDRINFO struct addrinfo hints; struct addrinfo *res = NULL; struct addrinfo *ai_p = NULL; #ifdef __WIN32__ struct sockaddr_in *addr_in = NULL; struct sockaddr addr; #else struct sockaddr_in6 *addr_in = NULL; struct sockaddr_in6 addr; #endif int r = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&r, sizeof(r)) == -1) throw SocketException(r, "setsockopt SO_REUSEADDR"); memset(&hints, 0, sizeof(hints)); # ifdef AI_ADDRCONFIG hints.ai_flags = AI_ADDRCONFIG; # endif #ifdef __WIN32__ hints.ai_family = AF_INET; #else hints.ai_family = AF_INET6; #endif hints.ai_socktype = SOCK_DGRAM; //hints.ai_protocol = ainfo->ai_protocol; hints.ai_flags |= AI_NUMERICSERV; std::string port_io = address.get_service(); std::string addrStr = address.get_node(); if ((r = getaddrinfo(NULL, port_io.c_str(), &hints, &res)) < 0) throw SocketException(r, "getaddrinfo"); memset(&addr, 0, sizeof(addr)); #ifdef __WIN32__ addr_in = (sockaddr_in *) &addr; #else addr_in = (sockaddr_in6 *) &addr; #endif for(ai_p = res; ai_p != NULL; ai_p = ai_p->ai_next) { #ifdef __WIN32__ if (ai_p->ai_family == AF_INET) { #else if (ai_p->ai_family == AF_INET6) { #endif memcpy(addr_in, ai_p->ai_addr, sizeof(addr)); break; } } #ifdef __WIN32__ addr_in->sin_addr.s_addr = INADDR_ANY; #else addr_in->sin6_addr = in6addr_any; #endif if (::bind(sockfd, (const struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) { freeaddrinfo(res); throw SocketException(errno, "bind"); } freeaddrinfo(res); #else int r = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&r, sizeof(r)) == -1) #ifndef NDEBUG perror("setsockopt SO_REUSEADDR"); #else ; #endif #ifdef __WIN32__ struct sockaddr_in *addr; #else struct sockaddr_in6 *addr; #endif struct sockaddr_storage store_addr; memset(&store_addr, 0, sizeof(store_addr)); #ifdef __WIN32__ memcpy(&store_addr, ainfo->ai_addr, sizeof(struct sockaddr_in)); addr = (struct sockaddr_in *) &store_addr; addr->sin_addr.s_addr = INADDR_ANY; #else memcpy(&store_addr, ainfo->ai_addr, sizeof(struct sockaddr_in6)); addr = (struct sockaddr_in6 *) &store_addr; addr->sin6_addr.s6_addr = in6addr_any; #endif if (::bind(sockfd, (const struct sockaddr *)addr, sizeof(struct sockaddr)) == -1) throw SocketException(errno, "bind"); #endif } /// /// Calls listen(2) on the socket file desriptor /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @params backlog The maximum number of pending connections (default SOMAXCONN) /// void Socket::listen(int backlog) { if (::listen(sockfd, backlog) == -1) throw SocketException(errno, "listen"); } /// /// Accepts a connection /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @return A Socket instance for the accepted connection /// Socket Socket::accept(void) { connected_flag = false; Socket s; listen(); // wait for fd to become readable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(0)) throw SocketException(ETIMEDOUT, "select"); int r; if ((r = ::accept(sockfd, NULL, 0)) == -1) throw SocketException(errno, "accept"); set_close_on_exec(true, r); connected_flag = true; s = Socket(r); s.connected_flag = true; return s; } /// /// Accepts a single connection and then closes the listening socket /// @see Socket::accept /// /// @return A Socket instance for the accepted connection /// Socket Socket::accept1(void) { bind(); Socket s = accept(); close(); s.set_close_on_exec(true); return s; } /// /// Accepts a connection /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @return A Socket instance pointer for the accepted connection /// Socket * Socket::accept2(void) { connected_flag = false; Socket * s = 0; listen(); // wait for fd to become readable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(0)) throw SocketException(ETIMEDOUT, "select"); int r; if ((r = ::accept(sockfd, NULL, 0)) == -1) return (Socket *)0; set_close_on_exec(true, r); connected_flag = true; s = new Socket(r); if(s) s->connected_flag = true; return s; } /// /// Connects the socket to the address that is associated with the object /// int Socket::connect(void) { connected_flag = false; int res = ::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen); if (res == -1) { if (errno == 0 || errno == EISCONN) { LOG_INFO("Connected to sockfd %d: %s : %s", sockfd, address.get_str(ainfo).c_str(), strerror(errno) ); connected_flag = true; return errno; } if (errno == EWOULDBLOCK || errno == EINPROGRESS || errno == EALREADY) { LOG_INFO("Connect attempt to %s : %d, %s", address.get_str(ainfo).c_str(), errno, strerror(errno)); return errno; } LOG_ERROR("Connect to %s failed: %d, %s", address.get_str(ainfo).c_str(), errno, strerror(errno)); throw SocketException(errno, "connect"); } LOG_INFO(" Connected to sockfd %d: %s", sockfd, address.get_str(ainfo).c_str()); connected_flag = true; return EISCONN; } /// /// Connects the socket to the address that is associated with the object /// Return connect state (T/F) /// bool Socket::connect1(void) { connected_flag = false; #ifndef NDEBUG if (LOG_QRZ_DEBUG) LOG_INFO("Connecting to %s", address.get_str(ainfo).c_str()); LOG_DEBUG("Connecting to %s", address.get_str(ainfo).c_str()); #endif if (::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) { return false; } connected_flag = true; return true; } /// /// Return T/F connected state. /// bool Socket::is_connected(void) { return connected_flag; } /// Set socket to allow for broadcasting. /// void Socket::broadcast(bool flag) { int option = 0; if(flag) option = 1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,(char *) &option, sizeof(option)); } /// /// Connects the socket to an address /// /// @param addr The address to connect to /// int Socket::connect(const Address& addr) { close(); open(addr); return connect(); } /// /// Sends a buffer /// /// @param buf /// @param len /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::send(const void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(1)) { LOG_ERROR("Select failed on %d", sockfd); return 0; } size_t nToWrite = len; int r = 0; const char *sp = (const char *)buf; while ( nToWrite > 0) { #if defined(__WIN32__) r = ::send(sockfd, sp, nToWrite, 0); if (r > 0) { sp += r; nToWrite -= r; } else { if (r == 0) { shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r < 0) { switch(errno) { case EAGAIN: break; case ENOTCONN: case EBADF: default: throw SocketException(errno, "send"); } r = 0; } } #else r = ::write(sockfd, sp, nToWrite); if (r > 0) { sp += r; nToWrite -= r; } else { if (r == 0) { shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r == -1) { switch(errno) { case EAGAIN: case ENOTCONN: case EBADF: break; default: throw SocketException(errno, "send"); } r = 0; } } #endif } return r; } /// /// Sends a string /// /// @param buf /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::send(const string& buf) { size_t ret; try { ret = send(buf.data(), buf.length()); } catch (...) { throw; } return ret; } /// /// Receives data into a buffer /// /// @arg buf /// @arg len The maximum number of bytes to write to buf. /// /// @return The amount of data that was received. This may be less than len /// if the socket is non-blocking. size_t Socket::recv(void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(0)) { return 0; } ssize_t r = 0; try { r = ::recv(sockfd, (char*)buf, len, 0); } catch (SocketException &e) { throw e; } if (r < 0) r = 0; return r; } /// /// Receives all available data and appends it to a string. /// /// @arg buf /// /// @return The amount of data that was received. /// size_t Socket::recv(string& buf) { ssize_t r = 0; // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) { if (!wait(0)) { buf.clear(); return 0; } } int tout = 2; try { buf.clear(); while (tout > 0) { memset(buffer, 0, S_BUFSIZ); r = ::recv(sockfd, buffer, S_BUFSIZ, 0); if (r > 0) buf.append(buffer); MilliSleep(50); tout--; } } catch (SocketException &e) { throw e; } return buf.length(); } /// /// Sends a buffer (UDP) /// /// @param buf /// @param len /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::sendTo(const void* buf, size_t len) { struct sockaddr * useAddr = (struct sockaddr *)0; size_t addr_size = 0; if(use_kiss_dual_port && *use_kiss_dual_port) { memset(&saddr_dp, 0, sizeof(saddr_dp)); memcpy(&saddr_dp, ainfo->ai_addr, ainfo->ai_addrlen); set_port((struct sockaddr *) &saddr_dp, dual_port_number); useAddr = (struct sockaddr * ) &saddr_dp; addr_size = ainfo->ai_addrlen; } else { useAddr = (struct sockaddr *) ainfo->ai_addr; addr_size = ainfo->ai_addrlen; } #ifndef NDEBUG { unsigned long host_addr = get_address4((struct sockaddr *)useAddr); unsigned int host_port = get_port((struct sockaddr *) useAddr); LOG_INFO("HAP:%lX:%d count=%d buf=%s", host_addr, host_port, len, buf); } #endif // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(1)) return 0; size_t nToWrite = len; int r = 0; const char *sp = (const char *)buf; while ( nToWrite > 0) { try { r = ::sendto(sockfd, sp, nToWrite, 0, useAddr, addr_size); } catch (...) { throw; } if (r > 0) { sp += r; nToWrite -= r; } else { if (r == 0) { shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r == -1) { if (errno != EAGAIN && errno != 0) { LOG_INFO("errno = %d (%s) r %d buff %s", errno, strerror(errno), r, sp); } r = 0; } } } return r; } /// /// Sends a string /// /// @param buf /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::sendTo(const std::string& buf) { try { return sendTo(buf.data(), buf.length()); } catch (...) { throw; } } // // Get the port number from a sockaddr pointer // void Socket::set_port(struct sockaddr *sa, unsigned int port) { #ifdef __WIN32__ if (sa->sa_family == AF_INET) { struct sockaddr_in *saddr_in = (sockaddr_in *) sa; saddr_in->sin_port = htons(port); } #else if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *saddr_in = (sockaddr_in6 *) sa; saddr_in->sin6_port = htons(port); } #endif } // // Get the port number from a sockaddr pointer // unsigned int Socket::get_port(struct sockaddr *sa) { unsigned short int port_number = 0; #ifdef __WIN32__ if (sa->sa_family == AF_INET) { struct sockaddr_in *saddr_in = (sockaddr_in *) sa; port_number = (unsigned short int) saddr_in->sin_port; } #else if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *saddr_in = (sockaddr_in6 *) sa; port_number = (unsigned short int) saddr_in->sin6_port; } #endif return (unsigned int) ntohs(port_number); } // // Get the IP Address number from a sockaddr pointer // unsigned long Socket::get_address4(struct sockaddr *sa) { #ifdef __WIN32__ unsigned long IPAddr = 0; if (sa->sa_family == AF_INET) { struct sockaddr_in *saddr_in = (sockaddr_in *) sa; IPAddr = saddr_in->sin_addr.s_addr; } return (unsigned long) ntohl(IPAddr); #else return 0L; #endif } unsigned long Socket::get_to_address(void) { return (unsigned long) ntohl(inet_addr(address.get_node().c_str())); }; /// /// Receives data into a buffer (UDP) /// /// @arg buf /// @arg len The maximum number of bytes to write to buf. /// /// @return The amount of data that was received. This may be less than len /// if the socket is non-blocking. size_t Socket::recvFrom(void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && (timeout.tv_sec > 0 || timeout.tv_usec > 0)) if (!wait(0)) return 0; struct sockaddr_storage temp_saddr; unsigned int temp_saddr_size; temp_saddr_size = sizeof(temp_saddr); memset(&temp_saddr, 0, temp_saddr_size); int r = 0; try { r = ::recvfrom(sockfd, (char *)buf, len, 0, (struct sockaddr *)&temp_saddr, (socklen_t *)&temp_saddr_size); if (r == 0) shutdown(sockfd, SHUT_RD); else if (r < 0) { if((errno == EAGAIN) || (errno == 0)) { if (errno) LOG_INFO("ErrorNo: %d (%s)", errno, strerror(errno)); memset(buf, 0, len); return 0; } else { LOG_INFO("ErrorNo: %d (%s)", errno, strerror(errno)); throw SocketException(errno, "recv"); } } } catch (...) { throw; } if(r > 0) { // To prevent loop back and except only from address x unsigned long srvr_addr = 0x7F000001L; unsigned long srvr_to_addr = get_to_address(); unsigned int srvr_dp_port = get_dual_port_number(); unsigned int srvr_port = get_local_port(); unsigned int local_port = get_local_port(); unsigned long host_addr = get_address4((struct sockaddr *)&temp_saddr); unsigned int host_port = get_port((struct sockaddr *)&temp_saddr); if(use_dual_port()) { srvr_port = srvr_dp_port; } if((srvr_port == host_port) && (srvr_to_addr == host_addr)) { if((srvr_addr == host_addr) && (local_port == host_port)) { LOG_INFO("Loopback Warning: %X:%u", (unsigned int)host_addr, host_port); memset(buf, 0, len); return 0; } } } return r; } #ifdef USE_ME_ONCE_I_WORK /// /// Return the local Ip Address /// /// #ifdef __WIN32__ sockaddr_in * Socket::localIPAddress(void) #else sockaddr_in6 * Socket::localIPAddress(void) #endif { char buf[512]; #ifdef __WIN32__ static struct sockaddr_in localaddr; #else static struct sockaddr_in6 localaddr; #endif struct msghdr hmsg; struct cmsghdr *cmsg; struct in_pktinfo *pkt = 0; unsigned char *cdat = 0; memset(&hmsg, 0, sizeof(hmsg)); memset(&cmsg, 0, sizeof(cmsg)); hmsg.msg_name = &localaddr; hmsg.msg_namelen = sizeof(localaddr); hmsg.msg_control = buf; hmsg.msg_controllen = sizeof(buf); size_t st = ::recvmsg(sockfd, &hmsg, 0); if(CMSG_FIRSTHDR(&hmsg)) { cmsg = CMSG_FIRSTHDR(&hmsg); for (; cmsg != NULL; cmsg = CMSG_NXTHDR(&hmsg, cmsg)) { if (cmsg->cmsg_level != IPPROTO_IP || cmsg->cmsg_type != IP_PKTINFO) { continue; } cdat = CMSG_DATA(cmsg); pkt = (struct in_pktinfo *) cdat; } } } #endif /// /// Receives all available data and appends it to a string. /// /// @arg buf /// /// @return The amount of data that was received. /// size_t Socket::recvFrom(std::string& buf) { size_t n = 0; ssize_t r; try { while ((r = recvFrom(buffer, S_BUFSIZ)) > 0) { buf.reserve(buf.length() + r); buf.append(buffer, r); n += r; } } catch (...) { throw; } return n; } /// /// Signal to unblock sockets /// /// void Socket::shut_down(void) { ::shutdown(sockfd, SHUT_RDWR); } /// /// Retrieves the socket's receive or send buffer size /// /// @param dir Specifies the I/O direction. 0 is input, 1 is output. /// int Socket::get_bufsize(int dir) { int len; if (::get_bufsize(sockfd, dir, &len) == -1) throw SocketException(errno, "get_bufsize"); return len; } /// /// Sets the socket's receive or send buffer size /// /// @param dir Specifies the I/O direction. 0 is input, 1 is output. /// @param len Specifies the new buffer size /// void Socket::set_bufsize(int dir, int len) { if (::set_bufsize(sockfd, dir, len) == -1) throw SocketException(errno, "set_bufsize"); } /// /// Sets the socket's blocking mode /// /// @param v If true, the socket is set to non-blocking /// void Socket::set_nonblocking(bool v) { if (set_nonblock(sockfd, v) == -1) throw SocketException(errno, "set_nonblock"); nonblocking = v; } /// /// Enables the use of Nagle's algorithm for the socket /// /// @param v If true, Nagle's algorithm is disabled. /// void Socket::set_nodelay(bool v) { if (::set_nodelay(sockfd, v) == -1) throw SocketException(errno, "set_nodelay"); } /// /// Sets the timeout associated with non-blocking operations /// /// @param t /// void Socket::set_timeout(const struct timeval& t) { timeout.tv_sec = t.tv_sec; timeout.tv_usec = t.tv_usec; } void Socket::set_timeout(double t) { timeout.tv_sec = (time_t)floor(t); timeout.tv_usec = (suseconds_t)((t - timeout.tv_sec) * 1e6); } /// /// Sets the socket's autoclose mode. /// /// If autoclose is disabled, the socket file descriptor will not be closed when /// the Socket object is destructed. /// /// @param v If true, the socket will be closed by the destructor /// void Socket::set_autoclose(bool v) const { autoclose = v; } /// /// Sets the socket's close-on-exec flag /// void Socket::set_close_on_exec(bool v, int fd) { if (fd == -1) fd = sockfd; if (set_cloexec(fd, v) == -1) throw SocketException(errno, "set_cloexec"); } /// /// Returns the Socket's file descriptor. /// /// The descriptor should only be used for reading and writing. /// /// @return the socket file descriptor /// int Socket::fd(void) { return sockfd; } fldigi-4.1.06/src/network/network.cxx0000664000175000017500000002664713507402064014500 00000000000000// ---------------------------------------------------------------------------- // network.cxx // // Copyright (C) 2008...2019 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "socket.h" #include "timeops.h" #include "gettext.h" #include "debug.h" #include "main.h" #include "network.h" #include "socket.h" //#include "https.h" using namespace std; //---------------------------------------------------------------------- // //---------------------------------------------------------------------- static void my_debug( void *ctx, int level, const char *file, int line, const char *str ) { ((void) level); fprintf( (FILE *) ctx, "%s:%04d: %s", file, line, str ); fflush( (FILE *) ctx ); } std::string stripped(std::string s) { while (s[0] == ' ') s.erase(0,1); while (s[s.length()-1] == ' ') s.erase(s.length() - 1); return s; } void Url::parse(std::string url) { _https = false; _host.clear(); _port.clear(); _request.clear(); _url = url; if (_url.find("https://") == 0) { _https = true; _url.erase(0,8); _port = "443"; } else if (url.find("http://") == 0) { _url.erase(0,7); _port = "80"; } size_t p = _url.find(":"); if (p != std::string::npos) { _port = _url.substr(p+1); _url.erase(p); } p = _url.find("/"); if (p != std::string::npos) { _host = _url.substr(0, p); _request = _url.substr(p); } else { _host = _url; } _host = stripped(_host); _url = stripped(url); _request = stripped(_request); if (debug_file) { debug_file << "parser:" << std::endl; debug_file << "url: " << url << std::endl; debug_file << "host: " << _host << std::endl; debug_file << "port: " << _port << std::endl; debug_file << "req: " << _request << std::endl; } } int Url::http_get(std::string &response) { std::ostringstream REQUEST; size_t len, rcvd; bool ret = true; const char service[] = "http"; REQUEST << "GET " << _request << " HTTP/1.1\r\n" << "User-Agent: fldigi " << FLDIGI_VERSION << "\r\n\ Host: " << _host << "\r\n\ Connection: close\r\n\r\n"; len = REQUEST.str().length(); if (debug_file) { debug_file << "Url::http_get(...)" << std::endl; debug_file << "Host: " << _host << std::endl; debug_file << "Service: " << service << std::endl; debug_file << "Request: " << REQUEST.str() << std::endl; } try { Address addr(_host.c_str(), service); Socket s(addr); // Socket s(Address(_host.c_str(), service)); s.connect(); s.set_nonblocking(); s.set_timeout(_timeout); if (s.send(REQUEST.str()) != len) { if (debug_file) debug_file << "send timed out: " << REQUEST.str() << std::endl; response = "Send timed out"; ret = false; goto recv_exit; } if (debug_file) debug_file << "sent: " << len << " bytes." << std::endl; int wait = 1; // allow up to 5 seconds to receive response while ((rcvd = s.recv(response)) == 0) { wait++; if (wait > 5) { if (debug_file) debug_file << "s.recv(...) failed after " << wait << " attempts" << std::endl; return false; } MilliSleep(100); } if (debug_file) debug_file << "s.recv(...) response required " << wait << " request" << (wait > 1 ? "s" : "") << std::endl; } catch (const SocketException& e) { response = e.what(); if (response.empty()) response = "UNKNOWN ERROR"; if (debug_file) { debug_file << "Caught socket exception: " << errno << ": " << response << std::endl; } ret = false; } if (debug_file) { debug_file << "s.recv(...) " << rcvd << " bytes." << std::endl; debug_file << "Response: " << response << std::endl; } recv_exit: return ret; } int Url::https_get(std::string &response) { int ret = 1, len; _err = MBEDTLS_EXIT_FAILURE; std::ostringstream REQUEST; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; #if defined(MBEDTLS_DEBUG_C) mbedtls_debug_set_threshold( 1 ); #endif /* * 0. Initialize the RNG and the session data */ mbedtls_net_init( &server_fd ); mbedtls_ssl_init( &ssl ); mbedtls_ssl_config_init( &conf ); mbedtls_x509_crt_init( &cacert ); mbedtls_ctr_drbg_init( &ctr_drbg ); if (debug_file) { debug_file << "\n . Seeding the random number generator..."; debug_file.flush(); } mbedtls_entropy_init( &entropy ); if ( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)_pers.c_str(), _pers.length() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 0. Initialize certificates */ if (debug_file) { debug_file << " . Loading the CA root certificate ..."; debug_file.flush(); } ca_crt_rsa[ca_crt_rsa_size - 1] = 0; ret = mbedtls_x509_crt_parse(&cacert, (uint8_t *)ca_crt_rsa, ca_crt_rsa_size); if( ret < 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n", -ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok (" << ret << " skipped)\n"; } /* * 1. Start the connection */ if (debug_file) { debug_file << " . Connecting to tcp/" << _host << ":" << _port << "..."; debug_file.flush(); } if( ( ret = mbedtls_net_connect( &server_fd, _host.c_str(), _port.c_str(), MBEDTLS_NET_PROTO_TCP ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_net_connect returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 2. Setup stuff */ if (debug_file) { debug_file << " . Setting up the SSL/TLS structure..."; debug_file.flush(); } if( ( ret = mbedtls_ssl_config_defaults( &conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* OPTIONAL is not optimal for security, * but makes interop easier in this simplified example */ mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL ); mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL ); mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg ); mbedtls_ssl_conf_dbg( &conf, my_debug, stdout ); if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_setup returned %d\n\n", ret ); _err = ret; goto exit; } if( ( ret = mbedtls_ssl_set_hostname( &ssl, _host.c_str() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret ); _err = ret; goto exit; } mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL ); /* * 4. Handshake */ if (debug_file) { debug_file << " . Performing the SSL/TLS handshake..."; debug_file.flush(); } while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n", -ret ); _err = ret; goto exit; } } if (debug_file) { debug_file << " ok\n"; } /* * 5. Verify the server certificate */ if (debug_file) { debug_file << " . Verifying peer X.509 certificate..."; } /* In real life, we probably want to bail out when ret != 0 */ if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 ) { char vrfy_buf[512]; if (debug_file) { debug_file << " failed\n"; } mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), " ! ", flags ); if (debug_file) { debug_file << vrfy_buf << std::endl; } } else if (debug_file) { debug_file << " ok\n"; } /* * 3. Write the GET request */ if (debug_file) { debug_file << " > Write to server:"; debug_file.flush(); } REQUEST << "GET " << _request << " HTTP/1.1\r\n"; REQUEST << "User-Agent: fldigi-4.1.02.10\r\n\ Host: tgftp.nws.noaa.gov:443\r\n\ Content-Type: application/json; charset=utf-8\r\n\ Connection: Keep-Alive\r\n\r\n"; len = REQUEST.str().length(); while( ( ret = mbedtls_ssl_write( &ssl, (const unsigned char *)REQUEST.str().c_str(), len ) ) <= 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_write returned %d\n\n", ret ); _err = ret; goto exit; } } len = ret; if (debug_file) { debug_file << len << " bytes written\n\"" << REQUEST.str() << "\""; debug_file.flush(); } /* * 7. Read the HTTP response */ if (debug_file) { debug_file << "\n < Read from server:"; debug_file.flush(); } do { len = sizeof( buf ) - 1; memset( buf, 0, sizeof( buf ) ); ret = mbedtls_ssl_read( &ssl, (unsigned char *)buf, len ); if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE ) continue; if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY ) break; if( ret < 0 ) { if (debug_file) { debug_file << "failed\n ! mbedtls_ssl_read returned " << ret << std::endl; } break; } if( ret == 0 ) { if (debug_file) { debug_file << "\n\nEOF\n\n"; } break; } len = ret; if (debug_file) { debug_file << len << " bytes read\n\n" << (char *) buf << std::endl; } _data.append(buf); break; } while( 1 ); mbedtls_ssl_close_notify( &ssl ); response = _data; _err = MBEDTLS_EXIT_SUCCESS; exit: #ifdef MBEDTLS_ERROR_C if( _err != MBEDTLS_EXIT_SUCCESS ) { char error_buf[100]; mbedtls_strerror( _err, error_buf, 100 ); snprintf(err_string, sizeof(err_string), "Last error was: %d - %s\n\n", _err, error_buf ); } #endif mbedtls_net_free( &server_fd ); mbedtls_x509_crt_free( &cacert ); mbedtls_ssl_free( &ssl ); mbedtls_ssl_config_free( &conf ); mbedtls_ctr_drbg_free( &ctr_drbg ); mbedtls_entropy_free( &entropy ); return( _err ); } int Url::get(std::string url, std::string &response) { if (url.empty()) return -1; parse(url); int ret = 0; if (_https) ret = https_get(response); else ret = http_get(response); return ret; } int Url::_rotate_log = 0; void Url::debug() { std::string fname = DebugDir; fname.append("network_debug.txt"); if (!_rotate_log) { rotate_log(fname); _rotate_log = 1; } debug_file.open(fname.c_str(), ios::app); } bool get_http(const std::string& url, std::string& reply, double timeout) { Url target_url; target_url.timeout(timeout); return target_url.get(url, reply); } fldigi-4.1.06/src/network/ca_cert.cxx0000664000175000017500000023563213507401434014403 00000000000000#include #include char ca_crt_rsa[] = {//70369] = { "-----BEGIN CERTIFICATE-----\r\n" "MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD\r\n" "VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\r\n" "bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\r\n" "b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV\r\n" "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\r\n" "cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\r\n" "b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH\r\n" "iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS\r\n" "r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4\r\n" "04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r\r\n" "GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9\r\n" "3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P\r\n" "lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\r\n" "UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy\r\n" "dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1\r\n" "MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx\r\n" "dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B\r\n" "AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f\r\n" "BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A\r\n" "cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC\r\n" "AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ\r\n" "MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm\r\n" "aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw\r\n" "ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj\r\n" "IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF\r\n" "MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\r\n" "A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y\r\n" "7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh\r\n" "1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ\r\n" "BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh\r\n" "c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy\r\n" "MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp\r\n" "emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X\r\n" "DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw\r\n" "FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg\r\n" "UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo\r\n" "YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5\r\n" "MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB\r\n" "AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4\r\n" "pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0\r\n" "13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID\r\n" "AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk\r\n" "U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i\r\n" "F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY\r\n" "oJ2daZH9\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\r\n" "A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\r\n" "b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\r\n" "MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\r\n" "YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\r\n" "aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\r\n" "jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\r\n" "xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\r\n" "1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\r\n" "snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\r\n" "U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\r\n" "9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\r\n" "BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\r\n" "AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\r\n" "yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\r\n" "38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\r\n" "AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\r\n" "DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\r\n" "HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G\r\n" "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp\r\n" "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1\r\n" "MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG\r\n" "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\r\n" "hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL\r\n" "v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8\r\n" "eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq\r\n" "tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd\r\n" "C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa\r\n" "zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB\r\n" "mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH\r\n" "V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n\r\n" "bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG\r\n" "3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs\r\n" "J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO\r\n" "291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS\r\n" "ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd\r\n" "AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\r\n" "TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\r\n" "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\r\n" "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\r\n" "MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\r\n" "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\r\n" "hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\r\n" "RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\r\n" "gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\r\n" "KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\r\n" "QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\r\n" "XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\r\n" "DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\r\n" "LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\r\n" "RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\r\n" "jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\r\n" "6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\r\n" "mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\r\n" "Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\r\n" "WD9f\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx\r\n" "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\r\n" "VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\r\n" "biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy\r\n" "dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t\r\n" "MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB\r\n" "MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG\r\n" "A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp\r\n" "b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl\r\n" "cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv\r\n" "bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE\r\n" "VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ\r\n" "ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR\r\n" "uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG\r\n" "9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI\r\n" "hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM\r\n" "pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx\r\n" "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\r\n" "VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\r\n" "biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm\r\n" "MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx\r\n" "MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT\r\n" "DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3\r\n" "dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl\r\n" "cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3\r\n" "DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD\r\n" "gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91\r\n" "yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX\r\n" "L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj\r\n" "EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG\r\n" "7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e\r\n" "QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ\r\n" "qdq5snUb9kLy78fyGPmJvKP/iiMucEc=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\r\n" "yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\r\n" "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\r\n" "U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\r\n" "ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\r\n" "aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\r\n" "MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\r\n" "ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\r\n" "biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\r\n" "U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\r\n" "aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\r\n" "nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\r\n" "t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\r\n" "SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\r\n" "BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\r\n" "rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\r\n" "NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\r\n" "BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\r\n" "BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\r\n" "aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\r\n" "MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\r\n" "p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\r\n" "5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\r\n" "WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\r\n" "4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\r\n" "hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\r\n" "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\r\n" "cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\r\n" "LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\r\n" "aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\r\n" "dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\r\n" "VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\r\n" "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\r\n" "bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\r\n" "IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\r\n" "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b\r\n" "N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t\r\n" "KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu\r\n" "kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm\r\n" "CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ\r\n" "Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu\r\n" "imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te\r\n" "2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe\r\n" "DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\r\n" "/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p\r\n" "F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt\r\n" "TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL\r\n" "MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\r\n" "ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln\r\n" "biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\r\n" "U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\r\n" "aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG\r\n" "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp\r\n" "U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg\r\n" "SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln\r\n" "biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\r\n" "IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm\r\n" "GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve\r\n" "fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw\r\n" "AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ\r\n" "aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj\r\n" "aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW\r\n" "kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC\r\n" "4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga\r\n" "FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB\r\n" "vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\r\n" "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp\r\n" "U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W\r\n" "ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe\r\n" "Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX\r\n" "MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0\r\n" "IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y\r\n" "IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh\r\n" "bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\r\n" "AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF\r\n" "9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH\r\n" "H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H\r\n" "LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN\r\n" "/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT\r\n" "rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud\r\n" "EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw\r\n" "WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs\r\n" "exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\r\n" "DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4\r\n" "sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+\r\n" "seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz\r\n" "4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+\r\n" "BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR\r\n" "lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3\r\n" "7M2CYfE45k+XmCpajQ==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\r\n" "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\r\n" "cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\r\n" "LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\r\n" "aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\r\n" "dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\r\n" "VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\r\n" "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\r\n" "bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\r\n" "IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\r\n" "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1\r\n" "GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ\r\n" "+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd\r\n" "U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm\r\n" "NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY\r\n" "ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/\r\n" "ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1\r\n" "CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq\r\n" "g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm\r\n" "fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c\r\n" "2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/\r\n" "bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW\r\n" "MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg\r\n" "Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh\r\n" "dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9\r\n" "MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi\r\n" "U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh\r\n" "cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\r\n" "A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk\r\n" "pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf\r\n" "OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C\r\n" "Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT\r\n" "Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi\r\n" "HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM\r\n" "Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w\r\n" "+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+\r\n" "Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3\r\n" "Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B\r\n" "26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID\r\n" "AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\r\n" "FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j\r\n" "ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js\r\n" "LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM\r\n" "BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0\r\n" "Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy\r\n" "dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh\r\n" "cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh\r\n" "YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg\r\n" "dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp\r\n" "bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ\r\n" "YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT\r\n" "TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ\r\n" "9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8\r\n" "jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW\r\n" "FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz\r\n" "ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1\r\n" "ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L\r\n" "EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu\r\n" "L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\r\n" "yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC\r\n" "O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V\r\n" "um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh\r\n" "NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\r\n" "IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\r\n" "BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\r\n" "aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\r\n" "9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\r\n" "NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\r\n" "azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\r\n" "YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\r\n" "Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\r\n" "cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\r\n" "dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\r\n" "WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\r\n" "v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\r\n" "UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\r\n" "IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\r\n" "W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\r\n" "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\r\n" "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\r\n" "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\r\n" "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1\r\n" "MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE\r\n" "ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j\r\n" "b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\r\n" "bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg\r\n" "U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA\r\n" "A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/\r\n" "I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3\r\n" "wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC\r\n" "AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb\r\n" "oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5\r\n" "BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\r\n" "dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk\r\n" "MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\r\n" "b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\r\n" "dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0\r\n" "MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi\r\n" "E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa\r\n" "MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI\r\n" "hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN\r\n" "95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd\r\n" "2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\r\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" "d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\r\n" "ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\r\n" "MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\r\n" "LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\r\n" "RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\r\n" "+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\r\n" "PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\r\n" "xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\r\n" "Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\r\n" "hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\r\n" "EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\r\n" "MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\r\n" "FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\r\n" "nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\r\n" "eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\r\n" "hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\r\n" "Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\r\n" "vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\r\n" "+OkuE6N36B9K\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl\r\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" "d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv\r\n" "b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG\r\n" "EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl\r\n" "cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi\r\n" "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c\r\n" "JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP\r\n" "mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+\r\n" "wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4\r\n" "VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/\r\n" "AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB\r\n" "AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\r\n" "BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun\r\n" "pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC\r\n" "dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf\r\n" "fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm\r\n" "NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx\r\n" "H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\r\n" "+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n" "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\n" "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\n" "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n" "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\r\n" "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\r\n" "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\r\n" "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\r\n" "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\r\n" "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\r\n" "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\r\n" "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\r\n" "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\r\n" "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\r\n" "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\r\n" "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\r\n" "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\r\n" "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc\r\n" "MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT\r\n" "ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw\r\n" "MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj\r\n" "dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l\r\n" "c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC\r\n" "UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc\r\n" "58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/\r\n" "o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH\r\n" "MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr\r\n" "aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA\r\n" "A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA\r\n" "Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv\r\n" "8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc\r\n" "MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT\r\n" "ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw\r\n" "MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j\r\n" "LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ\r\n" "KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo\r\n" "RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu\r\n" "WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw\r\n" "Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD\r\n" "AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK\r\n" "eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM\r\n" "zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+\r\n" "WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN\r\n" "/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\r\n" "MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\r\n" "YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\r\n" "EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\r\n" "R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\r\n" "9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\r\n" "fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\r\n" "iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\r\n" "1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\r\n" "bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\r\n" "MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\r\n" "ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\r\n" "uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\r\n" "Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\r\n" "tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\r\n" "PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\r\n" "hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\r\n" "5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW\r\n" "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs\r\n" "IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG\r\n" "EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg\r\n" "R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A\r\n" "PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8\r\n" "Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL\r\n" "TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL\r\n" "5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7\r\n" "S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe\r\n" "2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\r\n" "FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap\r\n" "EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td\r\n" "EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv\r\n" "/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN\r\n" "A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0\r\n" "abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF\r\n" "I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz\r\n" "4iIprn2DQKi6bA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY\r\n" "MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo\r\n" "R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx\r\n" "MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\r\n" "Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp\r\n" "ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\r\n" "AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9\r\n" "AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA\r\n" "ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0\r\n" "7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W\r\n" "kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI\r\n" "mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\r\n" "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ\r\n" "KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1\r\n" "6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl\r\n" "4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K\r\n" "oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj\r\n" "UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU\r\n" "AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB\r\n" "mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT\r\n" "MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s\r\n" "eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv\r\n" "cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ\r\n" "BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\r\n" "MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0\r\n" "BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\r\n" "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz\r\n" "+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm\r\n" "hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn\r\n" "5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W\r\n" "JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL\r\n" "DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC\r\n" "huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\r\n" "HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB\r\n" "AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB\r\n" "zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN\r\n" "kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\r\n" "AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH\r\n" "SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G\r\n" "spki4cErx5z481+oghLrGREt\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW\r\n" "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy\r\n" "c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE\r\n" "BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0\r\n" "IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV\r\n" "VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8\r\n" "cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT\r\n" "QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh\r\n" "F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v\r\n" "c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w\r\n" "mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd\r\n" "VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX\r\n" "teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ\r\n" "f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe\r\n" "Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+\r\n" "nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB\r\n" "/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY\r\n" "MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG\r\n" "9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\r\n" "aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX\r\n" "IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn\r\n" "ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z\r\n" "uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN\r\n" "Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja\r\n" "QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW\r\n" "koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9\r\n" "ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt\r\n" "DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm\r\n" "bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW\r\n" "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy\r\n" "c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD\r\n" "VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1\r\n" "c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\r\n" "AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81\r\n" "WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG\r\n" "FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq\r\n" "XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL\r\n" "se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb\r\n" "KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd\r\n" "IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73\r\n" "y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt\r\n" "hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc\r\n" "QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4\r\n" "Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV\r\n" "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV\r\n" "HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ\r\n" "KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\r\n" "dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ\r\n" "L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr\r\n" "Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo\r\n" "ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY\r\n" "T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz\r\n" "GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m\r\n" "1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV\r\n" "OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH\r\n" "6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX\r\n" "QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh\r\n" "MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE\r\n" "YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3\r\n" "MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo\r\n" "ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg\r\n" "MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\r\n" "ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA\r\n" "PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w\r\n" "wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi\r\n" "EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY\r\n" "avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+\r\n" "YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE\r\n" "sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h\r\n" "/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5\r\n" "IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj\r\n" "YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD\r\n" "ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy\r\n" "OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P\r\n" "TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\r\n" "HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER\r\n" "dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf\r\n" "ReYNnyicsbkqWletNw+vHX/bvZ8=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx\r\n" "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT\r\n" "EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp\r\n" "ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz\r\n" "NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH\r\n" "EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE\r\n" "AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw\r\n" "DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD\r\n" "E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH\r\n" "/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy\r\n" "DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh\r\n" "GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR\r\n" "tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA\r\n" "AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\r\n" "FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX\r\n" "WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu\r\n" "9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr\r\n" "gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo\r\n" "2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\r\n" "LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI\r\n" "4uJEvlz36hz1\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\r\n" "MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\r\n" "U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\r\n" "NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\r\n" "ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\r\n" "ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\r\n" "DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\r\n" "8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\r\n" "+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\r\n" "X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\r\n" "K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\r\n" "1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\r\n" "A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\r\n" "zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\r\n" "YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\r\n" "bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\r\n" "DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\r\n" "L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\r\n" "eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\r\n" "xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\r\n" "VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\r\n" "WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx\r\n" "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\r\n" "HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs\r\n" "ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw\r\n" "MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\r\n" "b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj\r\n" "aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp\r\n" "Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\r\n" "ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg\r\n" "nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1\r\n" "HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N\r\n" "Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN\r\n" "dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0\r\n" "HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO\r\n" "BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G\r\n" "CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU\r\n" "sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3\r\n" "4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg\r\n" "8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\r\n" "pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1\r\n" "mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\r\n" "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\r\n" "HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\r\n" "ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\r\n" "MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\r\n" "VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\r\n" "ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\r\n" "dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\r\n" "hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\r\n" "OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\r\n" "8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\r\n" "Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\r\n" "hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\r\n" "6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\r\n" "DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\r\n" "AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\r\n" "bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\r\n" "ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\r\n" "qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\r\n" "iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\r\n" "0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\r\n" "sSi6\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW\r\n" "MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm\r\n" "aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1\r\n" "OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG\r\n" "A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G\r\n" "CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ\r\n" "JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD\r\n" "vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo\r\n" "D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/\r\n" "Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW\r\n" "RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK\r\n" "HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN\r\n" "nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM\r\n" "0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i\r\n" "UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9\r\n" "Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg\r\n" "TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE\r\n" "AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL\r\n" "BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K\r\n" "2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX\r\n" "UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl\r\n" "6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK\r\n" "9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ\r\n" "HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI\r\n" "wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY\r\n" "XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l\r\n" "IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo\r\n" "hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr\r\n" "so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB\r\n" "qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf\r\n" "Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw\r\n" "MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV\r\n" "BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw\r\n" "NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j\r\n" "LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG\r\n" "A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\r\n" "IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG\r\n" "SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs\r\n" "W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta\r\n" "3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk\r\n" "6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6\r\n" "Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J\r\n" "NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA\r\n" "MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP\r\n" "r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU\r\n" "DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz\r\n" "YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\r\n" "xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2\r\n" "/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/\r\n" "LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7\r\n" "jVaMaA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL\r\n" "MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp\r\n" "IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi\r\n" "BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw\r\n" "MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\r\n" "d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig\r\n" "YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v\r\n" "dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/\r\n" "BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6\r\n" "papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E\r\n" "BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K\r\n" "DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3\r\n" "KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox\r\n" "XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB\r\n" "rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf\r\n" "Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw\r\n" "MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV\r\n" "BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa\r\n" "Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl\r\n" "LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u\r\n" "MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl\r\n" "ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz\r\n" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm\r\n" "gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8\r\n" "YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf\r\n" "b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9\r\n" "9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S\r\n" "zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk\r\n" "OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\r\n" "HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA\r\n" "2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW\r\n" "oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\r\n" "t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c\r\n" "KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM\r\n" "m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu\r\n" "MdRAGmI0Nj81Aa6sY6A=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU\r\n" "MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs\r\n" "IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290\r\n" "MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux\r\n" "FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h\r\n" "bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v\r\n" "dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt\r\n" "H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9\r\n" "uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX\r\n" "mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX\r\n" "a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN\r\n" "E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0\r\n" "WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD\r\n" "VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0\r\n" "Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU\r\n" "cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx\r\n" "IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN\r\n" "AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH\r\n" "YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\r\n" "6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC\r\n" "Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX\r\n" "c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a\r\n" "mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb\r\n" "MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\r\n" "GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj\r\n" "YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL\r\n" "MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\r\n" "BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM\r\n" "GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\r\n" "ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua\r\n" "BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe\r\n" "3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4\r\n" "YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR\r\n" "rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm\r\n" "ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU\r\n" "oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\r\n" "MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v\r\n" "QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t\r\n" "b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF\r\n" "AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q\r\n" "GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\r\n" "Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2\r\n" "G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi\r\n" "l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3\r\n" "smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB\r\n" "lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\r\n" "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\r\n" "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt\r\n" "SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG\r\n" "A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe\r\n" "MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v\r\n" "d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh\r\n" "cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn\r\n" "0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ\r\n" "M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a\r\n" "MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd\r\n" "oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI\r\n" "DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy\r\n" "oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD\r\n" "VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0\r\n" "dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy\r\n" "bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF\r\n" "BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\r\n" "//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli\r\n" "CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE\r\n" "CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t\r\n" "3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS\r\n" "KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\r\n" "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\r\n" "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\r\n" "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\r\n" "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\r\n" "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\r\n" "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\r\n" "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\r\n" "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\r\n" "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\r\n" "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\r\n" "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\r\n" "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\r\n" "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\r\n" "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\r\n" "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\r\n" "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\r\n" "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\r\n" "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\r\n" "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\r\n" "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\r\n" "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\r\n" "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\r\n" "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\r\n" "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\r\n" "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\r\n" "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\r\n" "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\r\n" "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\r\n" "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\r\n" "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\r\n" "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\r\n" "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\r\n" "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\r\n" "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\r\n" "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\r\n" "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\r\n" "Cm26OWMohpLzGITY+9HPBVZkVw==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx\r\n" "KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd\r\n" "BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl\r\n" "YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1\r\n" "OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy\r\n" "aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50\r\n" "ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G\r\n" "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd\r\n" "AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC\r\n" "FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi\r\n" "1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq\r\n" "jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ\r\n" "wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj\r\n" "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/\r\n" "WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy\r\n" "NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC\r\n" "uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw\r\n" "IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6\r\n" "g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\r\n" "9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP\r\n" "BSeOE6Fuwg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx\r\n" "KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd\r\n" "BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl\r\n" "YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1\r\n" "OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy\r\n" "aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50\r\n" "ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G\r\n" "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN\r\n" "8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/\r\n" "RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4\r\n" "hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5\r\n" "ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM\r\n" "EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj\r\n" "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1\r\n" "A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy\r\n" "WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ\r\n" "1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30\r\n" "6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT\r\n" "91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\r\n" "e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p\r\n" "TpPDpFQUWw==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\r\n" "BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln\r\n" "biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF\r\n" "MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT\r\n" "d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\r\n" "CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8\r\n" "76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+\r\n" "bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c\r\n" "6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE\r\n" "emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd\r\n" "MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt\r\n" "MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y\r\n" "MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y\r\n" "FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi\r\n" "aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM\r\n" "gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB\r\n" "qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7\r\n" "lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn\r\n" "8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\r\n" "L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6\r\n" "45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO\r\n" "UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5\r\n" "O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC\r\n" "bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv\r\n" "GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a\r\n" "77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC\r\n" "hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3\r\n" "92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp\r\n" "Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w\r\n" "ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt\r\n" "Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE\r\n" "BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu\r\n" "IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw\r\n" "WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD\r\n" "ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" "ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y\r\n" "IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn\r\n" "IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+\r\n" "6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob\r\n" "jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw\r\n" "izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl\r\n" "+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY\r\n" "zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP\r\n" "pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF\r\n" "KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW\r\n" "ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB\r\n" "AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O\r\n" "BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0\r\n" "ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW\r\n" "IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA\r\n" "A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0\r\n" "uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+\r\n" "FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7\r\n" "jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/\r\n" "u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D\r\n" "YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1\r\n" "puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa\r\n" "icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG\r\n" "DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x\r\n" "kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z\r\n" "Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE\r\n" "BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu\r\n" "IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow\r\n" "RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY\r\n" "U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\r\n" "MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv\r\n" "Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br\r\n" "YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF\r\n" "nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH\r\n" "6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt\r\n" "eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/\r\n" "c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ\r\n" "MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH\r\n" "HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf\r\n" "jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6\r\n" "5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB\r\n" "rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\r\n" "F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c\r\n" "wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\r\n" "cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB\r\n" "AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp\r\n" "WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9\r\n" "xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ\r\n" "2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ\r\n" "IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8\r\n" "aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X\r\n" "em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR\r\n" "dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/\r\n" "OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+\r\n" "hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy\r\n" "tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/\r\n" "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\r\n" "DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow\r\n" "PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD\r\n" "Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\r\n" "AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O\r\n" "rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq\r\n" "OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b\r\n" "xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw\r\n" "7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD\r\n" "aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\r\n" "HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG\r\n" "SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69\r\n" "ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr\r\n" "AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz\r\n" "R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5\r\n" "JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo\r\n" "Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG\r\n" "EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3\r\n" "MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl\r\n" "cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR\r\n" "dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB\r\n" "pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM\r\n" "b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm\r\n" "aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz\r\n" "IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\r\n" "MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT\r\n" "lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz\r\n" "AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5\r\n" "VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG\r\n" "ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2\r\n" "BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG\r\n" "AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M\r\n" "U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh\r\n" "bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C\r\n" "+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\r\n" "bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F\r\n" "uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2\r\n" "XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\r\n" "-----END CERTIFICATE-----\r\n" " " }; size_t ca_crt_rsa_size = sizeof(ca_crt_rsa); //#define ca_crt_rsa_size 70369 fldigi-4.1.06/src/network/xmlrpc.cxx0000664000175000017500000030235313507402064014303 00000000000000// ---------------------------------------------------------------------------- // xmlrpc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2008-2010 // Dave Freese, W1HKJ // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // See EOF for a list of method names. Run "fldigi --xmlrpc-list" // to see a list of method names, signatures and descriptions. // // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "xmlrpc.h" #include #include #include #include #include #include #include #include #include #include "threads.h" struct XmlRpcImpl; #include "globals.h" #include "configuration.h" #ifdef HAVE_VALUES_H # include #endif #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "ascii.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "rigio.h" #include "debug.h" #include "re.h" #include "pskrep.h" // required for flrig support #include "fl_digi.h" #include "rigsupport.h" #include "confdialog.h" #include "arq_io.h" #include "status.h" LOG_FILE_SOURCE(debug::LOG_RPC); using namespace std; using namespace XmlRpc; /// Not defined the usual way on Mingw #ifndef DBL_MAX #define DBL_MAX 1.7976931348623157e+308 #endif namespace xmlrpc_c { struct method { const char * _signature ; const char * _help ; virtual std::string help(void) const { return _help;} const char * signature() const { return _signature; } virtual ~method() {} }; typedef method * methodPtr ; typedef XmlRpcValue value ; typedef XmlRpcValue value_string ; typedef XmlRpcValue value_bytestring ; typedef XmlRpcValue value_struct ; typedef XmlRpcValue value_nil ; typedef XmlRpcValue value_array ; typedef XmlRpcValue value_double ; typedef XmlRpcValue value_int ; typedef XmlRpcValue value_boolean ; struct fault : public std::runtime_error { typedef enum { CODE_INTERNAL } Codes; fault( const char * msg, Codes cd = CODE_INTERNAL ) : std::runtime_error(msg) {} }; struct paramList { const XmlRpcValue & _params ; paramList( const XmlRpcValue & prm ) : _params(prm) {} int getInt(int i, int mini = INT_MIN, int maxi = INT_MAX ) const { int tmp = _params[i]; if( tmp < mini ) tmp = mini ; else if(tmp > maxi) tmp = maxi ; return tmp ; } string getString(int i) const { return _params[i]; } std::vector getBytestring(int i) const { return _params[i]; } double getDouble(int i, double mini = -DBL_MAX, double maxi = DBL_MAX) const { double tmp = _params[i]; if( tmp < mini ) tmp = mini ; else if(tmp > maxi) tmp = maxi ; return tmp ; } bool getBoolean(int i) const { return _params[i]; } const std::vector & getArray(int i) const { return _params[i]; } void verifyEnd(size_t sz) const { const std::vector & tmpRef = _params ; if( sz != tmpRef.size() ) throw std::runtime_error("Bad size"); } }; } template< class RPC_METHOD > struct Method : public RPC_METHOD, public XmlRpcServerMethod { Method( const char * n ) : XmlRpcServerMethod( n ) {} void execute (XmlRpcValue ¶ms, XmlRpcValue &result) { xmlrpc_c::paramList params2(params) ; RPC_METHOD::execute( params2, &result ); } }; typedef XmlRpcServerMethod * (*RpcFactory)( const char * ); template struct RpcBuilder { static XmlRpcServerMethod * factory( const char * name ) { return new Method< RPC_METHOD >( name ); } }; struct XmlRpcImpl : public XmlRpcServer { void fl_open(const char * port) { bindAndListen( atoi( port ) ); enableIntrospection(true); } void run() { double milli_secs = -1.0 ; // Tell our server to wait indefinately for messages work(milli_secs); } /// BEWARE IT IS CALLED FROM ANOTHER THREAD. void close() { exit(); shutdown(); } }; struct rpc_method { RpcFactory m_fact ; ~rpc_method() { delete method ; } xmlrpc_c::method * method ; const char* name; }; typedef list methods_t; static methods_t* methods = 0; pthread_t* server_thread; pthread_mutex_t* server_mutex; XML_RPC_Server* XML_RPC_Server::inst = 0; XML_RPC_Server::XML_RPC_Server() { server_impl = new XmlRpcImpl; add_methods(); for( methods_t::iterator it = methods->begin(), en = methods->end(); it != en; ++it ) { XmlRpcServerMethod * mth = dynamic_cast< XmlRpcServerMethod * >( it->method ); server_impl->addMethod( mth ); } server_thread = new pthread_t; server_mutex = new pthread_mutex_t; pthread_mutex_init(server_mutex, NULL); // run = true; } XML_RPC_Server::~XML_RPC_Server() { // run = false; // the xmlrpc server is closed and deleted when // XML_RPC_Server::stop(); // is called from main // delete methods; } void XML_RPC_Server::start(const char* node, const char* service) { if (inst) return; inst = new XML_RPC_Server; try { inst->server_impl->fl_open(service); if (pthread_create(server_thread, NULL, thread_func, NULL) != 0) throw runtime_error(strerror(errno)); } catch (const exception& e) { LOG_ERROR("Could not start XML-RPC server (%s)", e.what()); delete server_thread; server_thread = 0; delete inst; inst = 0; return; } } /// BEWARE IT IS CALLED FROM ANOTHER THREAD. void XML_RPC_Server::stop(void) { // FIXME: uncomment when we have an xmlrpc server that can be interrupted // if (!inst) // return; inst->server_impl->close(); delete inst; inst = 0; } void* XML_RPC_Server::thread_func(void*) { SET_THREAD_ID(XMLRPC_TID); save_signals(); inst->server_impl->run(); restore_signals(); SET_THREAD_CANCEL(); return NULL; } ostream& XML_RPC_Server::list_methods(ostream& out) { add_methods(); ios_base::fmtflags f = out.flags(ios::left); for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i) out << setw(32) << i->name << setw(8) << i->method->signature() << i->method->help() << '\n'; return out << setiosflags(f); } // ============================================================================= // Methods that change the server state must call XMLRPC_LOCK // guard_lock (include/threads.h) ensures that mutex are always unlocked. #define XMLRPC_LOCK SET_THREAD_ID(XMLRPC_TID); guard_lock autolock_(server_mutex) // ============================================================================= // generic helper functions static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } static void set_valuator(Fl_Valuator* valuator, double value) { valuator->value(value); valuator->do_callback(); } static void set_text(Fl_Input* textw, string& value) { textw->value(value.c_str()); textw->do_callback(); } static void set_text2(Fl_Input2* textw, string& value) { textw->value(value.c_str()); textw->do_callback(); } static void set_combo_contents(Fl_ComboBox* box, const vector* items) { box->clear(); if (items->empty()) { box->add(""); box->index(0); box->deactivate(); return; } for (vector::const_iterator i = items->begin(); i != items->end(); ++i) { box->add(i->c_str()); } box->index(0); box->activate(); } static void set_combo_value(Fl_ComboBox* box, const string& s) { box->value(s.c_str()); box->do_callback(); } static void get_combo_contents(Fl_ComboBox* box, vector* items) { int n = box->lsize(), p = box->index(); items->reserve(n); for (int i = 0; i < n; i++) { box->index(i); items->push_back(xmlrpc_c::value_string(box->value())); } box->index(p); } // ============================================================================= // XML-RPC interface definition // ============================================================================= class Fldigi_list : public xmlrpc_c::method { public: Fldigi_list() { _signature = "A:n"; _help = "Returns the list of methods."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { vector help; for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i) { map item; item["name"] = xmlrpc_c::value_string(i->name); item["signature"] = xmlrpc_c::value_string(i->method->signature()); item["help"] = xmlrpc_c::value_string(i->method->help()); help.push_back(xmlrpc_c::value_struct(item)); } *retval = xmlrpc_c::value_array(help); } }; class Fldigi_name : public xmlrpc_c::method { public: Fldigi_name() { _signature = "s:n"; _help = "Returns the program name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(PACKAGE_TARNAME); } }; class Fldigi_version_struct : public xmlrpc_c::method { public: Fldigi_version_struct() { _signature = "S:n"; _help = "Returns the program version as a struct."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { map vstruct; vstruct["major"] = xmlrpc_c::value_int(FLDIGI_VERSION_MAJOR); vstruct["minor"] = xmlrpc_c::value_int(FLDIGI_VERSION_MINOR); vstruct["patch"] = xmlrpc_c::value_string(FLDIGI_VERSION_PATCH); *retval = xmlrpc_c::value_struct(vstruct); } }; class Fldigi_version_string : public xmlrpc_c::method { public: Fldigi_version_string() { _signature = "s:n"; _help = "Returns the program version as a string."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("fldigi.version_string: %s", PACKAGE_VERSION); *retval = xmlrpc_c::value_string(PACKAGE_VERSION); } }; class Fldigi_name_version : public xmlrpc_c::method { public: Fldigi_name_version() { _signature = "s:n"; _help = "Returns the program name and version."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("fldigi.name_version: %s", PACKAGE_STRING); *retval = xmlrpc_c::value_string(PACKAGE_STRING); } }; class Fldigi_config_dir : public xmlrpc_c::method { public: Fldigi_config_dir() { _signature = "s:n"; _help = "Returns the name of the configuration directory."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("fldigi.config_dir %s", HomeDir.c_str()); *retval = xmlrpc_c::value_string(HomeDir); } }; class Fldigi_terminate : public xmlrpc_c::method { public: Fldigi_terminate() { _signature = "n:i"; _help = "Terminates fldigi. ``i'' is bitmask specifying data to save: 0=options; 1=log; 2=macros."; } enum { TERM_SAVE_OPTIONS = 1 << 0, TERM_SAVE_LOG = 1 << 1, TERM_SAVE_MACROS = 1 << 2 }; static void terminate(int how) { if (how & TERM_SAVE_OPTIONS) progdefaults.saveDefaults(); progdefaults.changed = false; extern bool oktoclear; if (how & TERM_SAVE_LOG && !oktoclear) qsoSave->do_callback(); oktoclear = true; progdefaults.NagMe = false; if (how & TERM_SAVE_MACROS && macros.changed) macros.saveMacroFile(); macros.changed = false; fl_digi_main->do_callback(); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("fldigi.terminate: %d", int(params.getInt(0))); REQ(terminate, params.getInt(0)); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Modem_get_name : public xmlrpc_c::method { public: Modem_get_name() { _signature = "s:n"; _help = "Returns the name of the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { const char* cur = mode_info[active_modem->get_mode()].sname; LOG_VERBOSE("modem.get_name: %s", cur); *retval = xmlrpc_c::value_string(cur); } }; class Modem_get_names : public xmlrpc_c::method { public: Modem_get_names() { _signature = "A:n"; _help = "Returns all modem names."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { vector names; names.reserve(NUM_MODES); string snames; for (size_t i = 0; i < NUM_MODES; i++) { names.push_back(xmlrpc_c::value_string(mode_info[i].sname)); snames.append("\n").append(mode_info[i].sname); } LOG_VERBOSE("modem.get_names: %s", snames.c_str()); *retval = xmlrpc_c::value_array(names); } }; class Modem_get_id : public xmlrpc_c::method { public: Modem_get_id() { _signature = "i:n"; _help = "Returns the ID of the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int md = active_modem->get_mode(); LOG_VERBOSE("modem.get_id %d", md); *retval = xmlrpc_c::value_int(md); } }; class Modem_get_max_id : public xmlrpc_c::method { public: Modem_get_max_id() { _signature = "i:n"; _help = "Returns the maximum modem ID number."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("modem.get_max_id: %d", NUM_MODES -1); *retval = xmlrpc_c::value_int(NUM_MODES - 1); } }; class Modem_set_by_name : public xmlrpc_c::method { public: Modem_set_by_name() { _signature = "s:s"; _help = "Sets the current modem. Returns old name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; const char* cur = mode_info[active_modem->get_mode()].sname; string s = params.getString(0); LOG_VERBOSE("modem.set_by_name: %s", s.c_str()); for (size_t i = 0; i < NUM_MODES; i++) { if (s == mode_info[i].sname) { REQ_SYNC(init_modem_sync, i, 0); *retval = xmlrpc_c::value_string(cur); return; } } *retval = "No such modem"; return; } }; class Modem_set_by_id : public xmlrpc_c::method { public: Modem_set_by_id() { _signature = "i:i"; _help = "Sets the current modem. Returns old ID."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_mode(); int i = params.getInt(0, 0, NUM_MODES-1); REQ_SYNC(init_modem_sync, i, 0); *retval = xmlrpc_c::value_int(cur); } }; // ============================================================================= class Modem_set_carrier : public xmlrpc_c::method { public: Modem_set_carrier() { _signature = "i:i"; _help = "Sets modem carrier. Returns old carrier."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_freq(); LOG_VERBOSE("modem.set_carrier: %d", int(params.getInt(0,1))); active_modem->set_freq(params.getInt(0, 1)); *retval = xmlrpc_c::value_int(cur); } }; class Modem_inc_carrier : public xmlrpc_c::method { public: Modem_inc_carrier() { _signature = "i:i"; _help = "Increments the modem carrier frequency. Returns the new carrier."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_freq(); LOG_VERBOSE("modem.inc_carrier: %d", int(params.getInt(0))); active_modem->set_freq(cur + params.getInt(0)); *retval = xmlrpc_c::value_int(active_modem->get_freq()); } }; class Modem_get_carrier : public xmlrpc_c::method { public: Modem_get_carrier() { _signature = "i:n"; _help = "Returns the modem carrier frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("modem.get_carrier: %d", int(active_modem->get_freq())); *retval = xmlrpc_c::value_int(active_modem->get_freq()); } }; // ============================================================================= class Modem_get_afc_sr : public xmlrpc_c::method { public: Modem_get_afc_sr() { _signature = "i:n"; _help = "Returns the modem AFC search range."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { LOG_VERBOSE("modem.get_afc_sr: %s", "Operation not supported by modem"); *retval = "Operation not supported by modem"; } else { LOG_VERBOSE("modem.get_afc_sr: %d", int(cntSearchRange->value())); *retval = xmlrpc_c::value_int((int)cntSearchRange->value()); } } }; class Modem_set_afc_sr : public xmlrpc_c::method { public: Modem_set_afc_sr() { _signature = "i:i"; _help = "Sets the modem AFC search range. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { LOG_VERBOSE("modem.set_afc_sr %s", "Operation not supported by modem"); *retval = "Operation not supported by modem"; return; } int v = (int)(cntSearchRange->value()); LOG_VERBOSE("modem.set_afc_sr: %d", v); REQ(set_valuator, cntSearchRange, params.getInt(0, (int)cntSearchRange->minimum(), (int)cntSearchRange->maximum())); *retval = xmlrpc_c::value_int(v); } }; class Modem_inc_afc_sr : public xmlrpc_c::method { public: Modem_inc_afc_sr() { _signature = "i:i"; _help = "Increments the modem AFC search range. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { LOG_VERBOSE("modem.inc_afc_sr: %s", "Operation not supported by modem"); *retval = "Operation not supported by modem"; return; } int v = (int)(cntSearchRange->value() + params.getInt(0)); LOG_VERBOSE("modem.inc_afc_sr: %d", v); REQ(set_valuator, cntSearchRange, v); *retval = xmlrpc_c::value_int(v); } }; // ============================================================================= static Fl_Valuator* get_bw_val(void) { if (!(active_modem->get_cap() & modem::CAP_BW)) return 0; trx_mode m = active_modem->get_mode(); if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST) return sldrHellBW; else if (m == MODE_CW) return sldrCWbandwidth; return 0; } class Modem_get_bw : public xmlrpc_c::method { public: Modem_get_bw() { _signature = "i:n"; _help = "Returns the modem bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { Fl_Valuator* val = get_bw_val(); LOG_VERBOSE("modem.get_bw: %d", int(get_bw_val()->value())); if (val) *retval = xmlrpc_c::value_int((int)get_bw_val()->value()); else *retval = xmlrpc_c::value_int(0); } }; class Modem_set_bw : public xmlrpc_c::method { public: Modem_set_bw() { _signature = "i:i"; _help = "Sets the modem bandwidth. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; Fl_Valuator* val = get_bw_val(); if (val) { int v = (int)(val->value()); LOG_VERBOSE("modem.set_bw: %d", v); REQ(set_valuator, val, params.getInt(0, (int)val->minimum(), (int)val->maximum())); *retval = xmlrpc_c::value_int(v); } else *retval = xmlrpc_c::value_int(0); } }; class Modem_inc_bw : public xmlrpc_c::method { public: Modem_inc_bw() { _signature = "i:i"; _help = "Increments the modem bandwidth. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; Fl_Valuator* val = get_bw_val(); if (val) { int v = (int)(val->value() + params.getInt(0)); LOG_VERBOSE("modem.inc_bw: %d", v); REQ(set_valuator, val, v); *retval = xmlrpc_c::value_int(v); } else *retval = xmlrpc_c::value_int(0); } }; // ============================================================================= class Modem_get_quality : public xmlrpc_c::method { public: Modem_get_quality() { _signature = "d:n"; _help = "Returns the modem signal quality in the range [0:100]."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("modem.get_quality: %f", pgrsSquelch->value()); *retval = xmlrpc_c::value_double(pgrsSquelch->value()); } }; class Modem_search_up : public xmlrpc_c::method { public: Modem_search_up() { _signature = "n:n"; _help = "Searches upward in frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("%s","modem.search_up"); REQ(&modem::searchUp, active_modem); *retval = xmlrpc_c::value_nil(); } }; class Modem_search_down : public xmlrpc_c::method { public: Modem_search_down() { _signature = "n:n"; _help = "Searches downward in frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("%s", "modem.search_down"); REQ(&modem::searchDown, active_modem); *retval = xmlrpc_c::value_nil(); } }; class Modem_olivia_set_bandwidth : public xmlrpc_c::method { public: Modem_olivia_set_bandwidth() { _signature = "n:i"; _help = "Sets the Olivia bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int bw; switch (bw = params.getInt(0)) { case 125: case 250: case 500: case 1000: case 2000: { XMLRPC_LOCK; LOG_VERBOSE("modem.olivia_set_bandwidth: %d", bw); REQ_SYNC(set_olivia_bw, bw); *retval = xmlrpc_c::value_nil(); } break; default: LOG_VERBOSE("modem.olivia_set_bandiwidth: %s", "Invalid bandwidth"); *retval = "Invalid Olivia bandwidth"; } } }; class Modem_olivia_get_bandwidth : public xmlrpc_c::method { public: Modem_olivia_get_bandwidth() { _signature = "i:n"; _help = "Returns the Olivia bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int bw, v = i_listbox_olivia_bandwidth->index() + 1; if (v == 0) bw = 125; else if (v == 1) bw = 250; else if (v == 2) bw = 500; else if (v == 3) bw = 1000; else bw = 2000; LOG_VERBOSE("modem.olivia_get_bandwidth: %d", bw); *retval = xmlrpc_c::value_int(bw); } }; class Modem_olivia_set_tones : public xmlrpc_c::method { public: Modem_olivia_set_tones() { _signature = "n:i"; _help = "Sets the Olivia tones."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int tones = params.getInt(0, 2, 256); if (powerof2(tones)) { XMLRPC_LOCK; LOG_VERBOSE("modem.olivia_set_tones: %d", tones); REQ_SYNC(set_olivia_tones, tones); *retval = xmlrpc_c::value_nil(); } else { LOG_VERBOSE("modem.olivia_set_tones: %s", "Invalid olivia tones"); *retval = "Invalid Olivia tones"; } } }; class Modem_olivia_get_tones : public xmlrpc_c::method { public: Modem_olivia_get_tones() { _signature = "i:n"; _help = "Returns the Olivia tones."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("modem.olivia_get_tones: %d", int(1 << (i_listbox_olivia_tones->index() + 1))); *retval = xmlrpc_c::value_int(1 << (i_listbox_olivia_tones->index() + 1)); } }; // ============================================================================= class Main_get_status1 : public xmlrpc_c::method { public: Main_get_status1() { _signature = "s:n"; _help = "Returns the contents of the first status field (typically s/n)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_status1: %s", Status1->label()); *retval = xmlrpc_c::value_string(Status1->label()); } }; class Main_get_status2 : public xmlrpc_c::method { public: Main_get_status2() { _signature = "s:n"; _help = "Returns the contents of the second status field."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_status2: %s", Status2->label()); *retval = xmlrpc_c::value_string(Status2->label()); } }; class Main_get_sb : public xmlrpc_c::method { public: Main_get_sb() { _signature = "s:n"; _help = "[DEPRECATED; use main.get_wf_sideband and/or rig.get_mode]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_sb (DEPRECATED): %s", wf->USB() ? "USB" : "LSB"); *retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB"); } }; class Main_set_sb : public xmlrpc_c::method { public: Main_set_sb() { _signature = "n:s"; _help = "[DEPRECATED; use main.set_wf_sideband and/or rig.set_mode]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; string s = params.getString(0); if (s != "LSB" && s != "USB") { *retval = "Invalid argument"; return; } LOG_VERBOSE("main.set_sb (DEPRECATED): %s", s.c_str()); REQ(static_cast(&waterfall::USB), wf, s == "USB"); *retval = xmlrpc_c::value_nil(); } }; class Main_get_wf_sideband : public xmlrpc_c::method { public: Main_get_wf_sideband() { _signature = "s:n"; _help = "Returns the current waterfall sideband."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_wf_sideband: %s", wf->USB() ? "USB" : "LSB"); *retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB"); } }; class Main_set_wf_sideband : public xmlrpc_c::method { public: Main_set_wf_sideband() { _signature = "n:s"; _help = "Sets the waterfall sideband to USB or LSB."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; string s = params.getString(0); if (s != "USB" && s != "LSB") *retval = "Invalid argument"; else REQ(static_cast(&waterfall::USB), wf, s == "USB"); LOG_VERBOSE("main.set_wf_sideband %s", s.c_str()); *retval = xmlrpc_c::value_nil(); } }; void xmlrpc_set_qsy(long long rfc) { wf->rfcarrier(rfc); wf->movetocenter(); show_frequency(rfc); } class Main_set_freq : public xmlrpc_c::method { public: Main_set_freq() { _signature = "d:d"; _help = "Sets the RF carrier frequency. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = wf->rfcarrier(); LOG_VERBOSE("main.set_freq: %f", rfc); qsy((long long int)params.getDouble(0, 0.0)); *retval = xmlrpc_c::value_double(rfc); } }; class Main_inc_freq : public xmlrpc_c::method { public: Main_inc_freq() { _signature = "d:d"; _help = "Increments the RF carrier frequency. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = wf->rfcarrier() + params.getDouble(0); qsy((long long int)rfc); LOG_VERBOSE("main.inc_freq: %f", rfc); *retval = xmlrpc_c::value_double(rfc); } }; // ============================================================================= class Main_get_afc : public xmlrpc_c::method { public: Main_get_afc() { _signature = "b:n"; _help = "Returns the AFC state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_afc: %s", (btnAFC->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnAFC->value()); } }; class Main_set_afc : public xmlrpc_c::method { public: Main_set_afc() { _signature = "b:b"; _help = "Sets the AFC state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnAFC->value(); LOG_VERBOSE("main.set_afc: %s", (v ? "ON" : "OFF")); REQ(set_button, btnAFC, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_afc : public xmlrpc_c::method { public: Main_toggle_afc() { _signature = "b:n"; _help = "Toggles the AFC state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnAFC->value(); LOG_VERBOSE("main.toggle_afc: %s", (v ? "ON" : "OFF")); REQ(set_button, btnAFC, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_sql : public xmlrpc_c::method { public: Main_get_sql() { _signature = "b:n"; _help = "Returns the squelch state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_sql: %s", (btnSQL->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnSQL->value()); } }; class Main_set_sql : public xmlrpc_c::method { public: Main_set_sql() { _signature = "b:b"; _help = "Sets the squelch state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnSQL->value(); LOG_VERBOSE("main.set_sql: %s", (btnSQL->value() ? "ON" : "OFF")); REQ(set_button, btnSQL, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_sql : public xmlrpc_c::method { public: Main_toggle_sql() { _signature = "b:n"; _help = "Toggles the squelch state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnSQL->value(); LOG_VERBOSE("main.toggle_sql: %s", (v ? "ON" : "OFF")); REQ(set_button, btnSQL, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_sql_level : public xmlrpc_c::method { public: Main_get_sql_level() { _signature = "d:n"; _help = "Returns the squelch level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_sql_level: %f", sldrSquelch->value()); *retval = xmlrpc_c::value_double(sldrSquelch->value()); } }; class Main_set_sql_level : public xmlrpc_c::method { public: Main_set_sql_level() { _signature = "d:d"; _help = "Sets the squelch level. Returns the old level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double v = sldrSquelch->value(); LOG_VERBOSE("main.set_sql_level: %f", v); REQ(set_valuator, sldrSquelch, params.getDouble(0, sldrSquelch->maximum(), sldrSquelch->minimum())); *retval = xmlrpc_c::value_double(v); } }; class Main_inc_sql_level : public xmlrpc_c::method { public: Main_inc_sql_level() { _signature = "d:d"; _help = "Increments the squelch level. Returns the new level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double v = sldrSquelch->value(); LOG_VERBOSE("main.inc_sql_level: %f", v); REQ(set_valuator, sldrSquelch, v + params.getDouble(0)); // FIXME: check range *retval = xmlrpc_c::value_double(sldrSquelch->value()); } }; // ============================================================================= class Main_get_rev : public xmlrpc_c::method { public: Main_get_rev() { _signature = "b:n"; _help = "Returns the Reverse Sideband state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_rev: %s", (wf->btnRev->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(wf->btnRev->value()); } }; class Main_set_rev : public xmlrpc_c::method { public: Main_set_rev() { _signature = "b:b"; _help = "Sets the Reverse Sideband state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = wf->btnRev->value(); LOG_VERBOSE("main.set_rev: %s", (v ? "ON" : "OFF")); REQ(set_button, wf->btnRev, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_rev : public xmlrpc_c::method { public: Main_toggle_rev() { _signature = "b:n"; _help = "Toggles the Reverse Sideband state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !wf->btnRev->value(); LOG_VERBOSE("main.toggle_rev: %s", (v ? "ON" : "OFF")); REQ(set_button, wf->btnRev, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_lock : public xmlrpc_c::method { public: Main_get_lock() { _signature = "b:n"; _help = "Returns the Transmit Lock state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_lock: %s", (wf->xmtlock->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(wf->xmtlock->value()); } }; class Main_set_lock : public xmlrpc_c::method { public: Main_set_lock() { _signature = "b:b"; _help = "Sets the Transmit Lock state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = wf->xmtlock->value(); LOG_VERBOSE("main.set_lock: %s", (v ? "ON" : "OFF")); REQ(set_button, wf->xmtlock, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_lock : public xmlrpc_c::method { public: Main_toggle_lock() { _signature = "b:n"; _help = "Toggles the Transmit Lock state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !wf->xmtlock->value(); LOG_VERBOSE("main.toggle_lock: %s", (v ? "ON" : "OFF")); REQ(set_button, wf->xmtlock, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_txid : public xmlrpc_c::method { public: Main_get_txid() { _signature = "b:n"; _help = "Returns the TXID state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_txid: %s", (btnTxRSID->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnTxRSID->value()); } }; class Main_set_txid : public xmlrpc_c::method { public: Main_set_txid() { _signature = "b:b"; _help = "Sets the TXID state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnTxRSID->value(); LOG_VERBOSE("main.set_txid: %s", (v ? "ON" : "OFF")); REQ(set_button, btnTxRSID, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_txid : public xmlrpc_c::method { public: Main_toggle_txid() { _signature = "b:n"; _help = "Toggles the TXID state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnTxRSID->value(); LOG_VERBOSE("main.toggle_txid: %s", (v ? "ON" : "OFF")); REQ(set_button, btnTxRSID, v); *retval = xmlrpc_c::value_boolean(v); } }; class Main_get_rsid : public xmlrpc_c::method { public: Main_get_rsid() { _signature = "b:n"; _help = "Returns the RSID state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_rsid: %s", (btnRSID->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnRSID->value()); } }; class Main_set_rsid : public xmlrpc_c::method { public: Main_set_rsid() { _signature = "b:b"; _help = "Sets the RSID state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnRSID->value(); LOG_VERBOSE("main.set_rsid: %s", (v ? "ON" : "OFF")); REQ(set_button, btnRSID, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_rsid : public xmlrpc_c::method { public: Main_toggle_rsid() { _signature = "b:n"; _help = "Toggles the RSID state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnRSID->value(); LOG_VERBOSE("main.toggle_rsid: %s", (v ? "ON" : "OFF")); REQ(set_button, btnRSID, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_trx_status : public xmlrpc_c::method { public: Main_get_trx_status() { _signature = "s:n"; _help = "Returns transmit/tune/receive status."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { string st; if (btnTune->value()) st = "tune"; else if (wf->xmtrcv->value()) st = "tx"; else st = "rx"; LOG_VERBOSE("main.get_trx_status: %s", st.c_str()); *retval = xmlrpc_c::value_string(st.c_str()); } }; class Main_tx : public xmlrpc_c::method { public: Main_tx() { _signature = "n:n"; _help = "Transmits."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!wf->xmtrcv->value()) { LOG_VERBOSE("%s", "main.tx"); REQ(set_button, wf->xmtrcv, true); } *retval = xmlrpc_c::value_nil(); } }; class Main_tune : public xmlrpc_c::method { public: Main_tune() { _signature = "n:n"; _help = "Tunes."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!btnTune->value()) { LOG_VERBOSE("%s", "main.tune"); REQ(set_button, btnTune, !btnTune->value()); } *retval = xmlrpc_c::value_nil(); } }; class Main_rx : public xmlrpc_c::method { public: Main_rx() { _signature = "n:n"; _help = "Receives."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (wf->xmtrcv->value()) { LOG_VERBOSE("%s", "main.rx"); REQ(set_button, wf->xmtrcv, false); } *retval = xmlrpc_c::value_nil(); } }; class Main_abort : public xmlrpc_c::method { public: Main_abort() { _signature = "n:n"; _help = "Aborts a transmit or tune."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); REQ(AbortARQ); } LOG_VERBOSE("%s", "main.abort"); *retval = xmlrpc_c::value_nil(); } }; class Main_rx_tx : public xmlrpc_c::method { public: Main_rx_tx() { _signature = "n:n"; _help = "Sets normal Rx/Tx switching."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); REQ(AbortARQ); } LOG_VERBOSE("%s", "main.rx_tx"); REQ(set_rx_tx); *retval = xmlrpc_c::value_nil(); } }; class Main_rx_only : public xmlrpc_c::method { public: Main_rx_only() { _signature = "n:n"; _help = "Disables Tx."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); REQ(AbortARQ); } LOG_VERBOSE("%s", "main.rx_only"); REQ(set_rx_only); *retval = xmlrpc_c::value_nil(); } }; //---------------------------------------------------------------------- // flmsg i/o //---------------------------------------------------------------------- bool flmsg_online = false; void flmsg_defeat(void *) { flmsg_online = false; } class Main_flmsg_online : public xmlrpc_c::method { public: Main_flmsg_online() { _signature = "n:n"; _help = "flmsg online indication"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("main.flmsg_online: %s", "true"); flmsg_online = true; Fl::remove_timeout(flmsg_defeat); Fl::add_timeout(0.5, flmsg_defeat); } }; string flmsg_data; class Main_flmsg_available : public xmlrpc_c::method { public: Main_flmsg_available() { _signature = "n:n"; _help = "flmsg data available"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int data_ready = (int)flmsg_data.size(); LOG_VERBOSE("main.flmsg_available: %d", data_ready); *retval = xmlrpc_c::value_int(data_ready); } }; class Main_flmsg_transfer : public xmlrpc_c::method { public: Main_flmsg_transfer() { _signature = "n:n"; _help = "data transfer to flmsg"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; string tempstr = flmsg_data; LOG_VERBOSE("main.flmsg_transfer:\n%s", tempstr.c_str()); *retval = xmlrpc_c::value_string(tempstr); flmsg_data.clear(); } }; class Main_flmsg_squelch : public xmlrpc_c::method { public: Main_flmsg_squelch() { _signature = "b:n"; _help = "Returns the squelch state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.flmsg_squelch: %s", (active_modem->get_metric() > progStatus.sldrSquelchValue ? "ACTIVE" : "NOT ACTIVE")); *retval = xmlrpc_c::value_boolean(active_modem->get_metric() > progStatus.sldrSquelchValue); } }; //---------------------------------------------------------------------- class Main_run_macro : public xmlrpc_c::method { public: Main_run_macro() { _signature = "n:i"; _help = "Runs a macro."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("main.run_macro: %d", int(params.getInt(0,0,MAXMACROS-1))); REQ(&Main_run_macro::run_macro, params.getInt(0, 0, MAXMACROS-1)); *retval = xmlrpc_c::value_nil(); } static void run_macro(int i) { macros.execute(i); } }; class Main_get_max_macro_id : public xmlrpc_c::method { public: Main_get_max_macro_id() { _signature = "i:n"; _help = "Returns the maximum macro ID number."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("main.get_max_macro_id: %d", MAXMACROS - 1); *retval = xmlrpc_c::value_int(MAXMACROS - 1); } }; class Main_rsid : public xmlrpc_c::method { public: Main_rsid() { _signature = "n:n"; _help = "[DEPRECATED; use main.{get,set,toggle}_rsid]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(wf->xmtrcv->value() || btnTune->value() || btnRSID->value())) { LOG_VERBOSE("main.rsid: %s", "ENABLE"); REQ(set_button, btnRSID, true); } *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= // classes added to support flrig // // dhf 6/23/09 class Main_get_trx_state : public xmlrpc_c::method { public: Main_get_trx_state() { _signature = "s:n"; _help = "Returns T/R state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { string st; if (trx_state == STATE_TX || trx_state == STATE_TUNE) st = "TX"; else if (trx_state == STATE_RX) st = "RX"; else st = "OTHER"; LOG_VERBOSE("main.get_trx_state: %s", st.c_str()); *retval = xmlrpc_c::value_string(st.c_str()); } }; pthread_mutex_t tx_queue_mutex = PTHREAD_MUTEX_INITIALIZER; static string xmlchars; bool xmltest_char_available; static size_t pxmlchar = 0; static char xml_status_msg[50]; int xmltest_char() { guard_lock xmlchr_lock(&tx_queue_mutex); if (xmlchars.empty() || !xmltest_char_available) return -3; if (pxmlchar >= xmlchars.length() ) { xmlchars.clear(); pxmlchar = 0; xmltest_char_available = false; return -3; } snprintf(xml_status_msg, sizeof(xml_status_msg), "%d%% sent", static_cast(100*pxmlchar/xmlchars.length())); put_status(xml_status_msg, 1.0); return xmlchars[pxmlchar++] & 0xFF; } void reset_xmlchars() { xmlchars.clear(); pxmlchar = 0; xmltest_char_available = false; } int number_of_samples( string s) { active_modem->XMLRPC_CPS_TEST = true; xmlchars = s; pxmlchar = 0; xmltest_char_available = true; active_modem->set_stopflag(false); trx_transmit(); MilliSleep(10); while(trx_state != STATE_RX) { MilliSleep(10); Fl::awake(); } xmltest_char_available = false; active_modem->XMLRPC_CPS_TEST = false; return active_modem->tx_sample_count; } class Main_get_char_rates : public xmlrpc_c::method { public: Main_get_char_rates() { _signature = "s:n"; _help = "Returns table of char rates."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) { *retval = xmlrpc_c::value_string("0:1:0"); return; } XMLRPC_LOCK; REQ(stopMacroTimer); int s0 = 0;//number_of_samples(""); int s1 = 0; string xmlbuf; static char result[100]; static string line; int chsamples = 0; int i = 0; for (int m = 0; m < 32; m++) { line.clear(); for (int n = 0; n < 8; n++) { i = m*8+n; if ( (id >= MODE_PSK31 && id <= MODE_PSK1000R) || (id >= MODE_4X_PSK63R && id <= MODE_2X_PSK1000R) || id == MODE_CW || id == MODE_RTTY ) { s1 = number_of_samples(string(1,i)); chsamples = active_modem->char_samples; } else { s0 = number_of_samples(string(1, i)); int j; for(j = 2; j < 32; j++) { s1 = number_of_samples(string(j, i)); if(s1 > s0) break; } chsamples = (s1 - s0) / (j-1); } snprintf(result, sizeof(result), n == 7 ? " %.8f\n" : n == 0 ? "%.8f," : " %.8f,", 1.0 * chsamples / active_modem->get_samplerate()); line.append(result); } xmlbuf.append(line); } LOG_VERBOSE("main.get_char_rates:\n%s", xmlbuf.c_str()); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Main_get_char_timing : public xmlrpc_c::method { public: Main_get_char_timing() { _signature = "n:i"; _help = "Input: value of character. Returns transmit duration for specified character (samples:sample rate)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) { *retval = xmlrpc_c::value_string("0:1:0"); return; } XMLRPC_LOCK; REQ(stopMacroTimer); vector bytes = params.getBytestring(0); bytes.push_back(0); std::string totest = (const char*)&bytes[0]; if (totest.empty() || !active_modem) { *retval = xmlrpc_c::value_string("0:1:0"); return; } static std::string xmlbuf; char result[64]; int character = 0; int count = sscanf(totest.c_str(), "%d", &character); if(count != 1) { *retval = xmlrpc_c::value_string("0:1:0"); return; } unsigned int s0 = 0, chsamples = 0, over_head = 0; int factor = 4; unsigned int min_char = 2; bool psk_8_flag = false; bool fast_flag = false; if((id >= MODE_8PSK_FIRST) && (id <= MODE_8PSK_LAST)) psk_8_flag = true; if (((id >= MODE_4X_PSK63R) && (id <= MODE_2X_PSK1000R)) || ((id >= MODE_PSK31) && (id <= MODE_PSK1000R)) || (id == MODE_CW) || (id == MODE_RTTY)) { if(psk_8_flag) fast_flag = false; else fast_flag = true; } if(((id >= MODE_THOR_FIRST) && (id <= MODE_THOR_LAST)) || ((id >= MODE_OLIVIA_FIRST) && (id <= MODE_OLIVIA_LAST))) { fast_flag = false; psk_8_flag = false; } if(fast_flag) { s0 = number_of_samples(string(1,character)); chsamples = active_modem->char_samples; over_head = active_modem->ovhd_samples; } else if(psk_8_flag) { // This doens't seem to work with the MFSK modes int n = 16; over_head = number_of_samples(""); chsamples = number_of_samples(string(n, character)) - over_head; chsamples /= n; } else { // This works for all of the remaining modes. unsigned int s1 = 0, s2 = 0; unsigned int temp = 0, no_of_chars = 1, k = 0; s0 = s1 = s2 = number_of_samples(string(no_of_chars, character)); for(int i = no_of_chars + 1; i < 32; i++) { s2 = number_of_samples(string(i, character)); if(s2 > s1 && temp++ > min_char) { break; } s0 = s2; no_of_chars++; } k = no_of_chars * factor; s1 = number_of_samples(string(k, character)); chsamples = (s1 - s0) / (k - no_of_chars); over_head = s1 - (chsamples * k); } snprintf(result, sizeof(result), "%5u:%6u:%6u", chsamples, active_modem->get_samplerate(), over_head); xmlbuf.assign(result); LOG_VERBOSE("main.get_char_timing:\n%s", xmlbuf.c_str()); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Main_get_tx_timing : public xmlrpc_c::method { public: Main_get_tx_timing() { _signature = "n:s"; _help = "Returns transmit duration for test string (samples:sample rate:secs)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { *retval = xmlrpc_c::value_string("0:1:0.0"); return; } XMLRPC_LOCK; vector bytes = params.getBytestring(0); bytes.push_back(0); std::string totest = (const char*)&bytes[0]; if (totest.empty() || !active_modem) { *retval = xmlrpc_c::value_string("0:1:0.0"); return; } int chsamples = number_of_samples(totest);// - start_stop_samples; std::string xmlbuf; char buf[64]; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%u : %u : %.9f", \ chsamples, active_modem->tx_sample_rate, 1.0 * chsamples / active_modem->tx_sample_rate); xmlbuf.assign(buf); LOG_VERBOSE("main.get_tx_timing:\n%s", xmlbuf.c_str()); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Rig_set_name : public xmlrpc_c::method { public: Rig_set_name() { _signature = "n:s"; _help = "Sets the rig name for xmlrpc rig"; } static void set_rig_name(const string& name) { windowTitle = name; if (main_window_title.find(windowTitle) == string::npos) setTitle(); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("main.set_name: %s", string(params.getString(0)).c_str()); REQ(set_rig_name, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_name : public xmlrpc_c::method { public: Rig_get_name() { _signature = "s:n"; _help = "Returns the rig name previously set via rig.set_name"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("rig.get_name: %s", windowTitle.c_str()); *retval = xmlrpc_c::value_string(windowTitle); } }; class Rig_set_frequency : public xmlrpc_c::method { public: Rig_set_frequency() { _signature = "d:d"; _help = "Sets the RF carrier frequency. Returns the old value."; } static void set_frequency(long long rfc) { wf->rfcarrier(rfc); show_frequency(rfc); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = wf->rfcarrier(); long int f = (long int)(params.getDouble(0,0.0)); LOG_VERBOSE("rig.set_frequency: %ld", f); REQ(set_frequency, (long long int)params.getDouble(0, 0.0)); *retval = xmlrpc_c::value_double(rfc); } }; class Rig_get_freq : public xmlrpc_c::method { public: Rig_get_freq() { _signature = "d:n"; _help = "Returns the RF carrier frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { double rfc = wf->rfcarrier(); LOG_INFO("rig.get_freq: %f", rfc); *retval = xmlrpc_c::value_double(rfc); } }; class Rig_set_smeter : public xmlrpc_c::method { public: Rig_set_smeter() { _signature = "n:i"; _help = "Sets the smeter returns null."; } static void set_smeter(int rfc) { if (smeter && pwrmeter && progStatus.meters) { smeter->value(rfc); pwrmeter->hide(); smeter->show(); } } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("rig.set_smeter: %d", int(params.getInt(0))); REQ(set_smeter, params.getInt(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_pwrmeter : public xmlrpc_c::method { public: Rig_set_pwrmeter() { _signature = "n:i"; _help = "Sets the power meter returns null."; } static void set_pwrmeter(int rfc) { if (pwrmeter && smeter && progStatus.meters) { pwrmeter->value(rfc); smeter->hide(); pwrmeter->show(); } } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("rig.set_pwrmeter: %d", int(params.getInt(0))); REQ(set_pwrmeter, params.getInt(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_modes : public xmlrpc_c::method { public: Rig_set_modes() { _signature = "n:A"; _help = "Sets the list of available rig modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector v = params.getArray(0); vector modes; string smodes; modes.reserve(v.size()); // copy for (vector::const_iterator i = v.begin(); i != v.end(); ++i) { modes.push_back(static_cast(xmlrpc_c::value_string(*i))); smodes.append("\n").append(static_cast(xmlrpc_c::value_string(*i))); } LOG_VERBOSE("rig.set_modes:%s", smodes.c_str()); REQ_SYNC(set_combo_contents, qso_opMODE, &modes); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_mode : public xmlrpc_c::method { public: Rig_set_mode() { _signature = "n:s"; _help = "Selects a mode previously added by rig.set_modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("rig_set_mode: %s", string(params.getString(0)).c_str()); REQ(set_combo_value, qso_opMODE, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_modes : public xmlrpc_c::method { public: Rig_get_modes() { _signature = "A:n"; _help = "Returns the list of available rig modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector modes; REQ_SYNC(get_combo_contents, qso_opMODE, &modes); string smodes; for (size_t n = 0; n < modes.size(); n++) smodes.append("\n").append(string(modes[n])); LOG_VERBOSE("rig.get_modes:%s", smodes.c_str()); *retval = xmlrpc_c::value_array(modes); } }; class Rig_get_mode : public xmlrpc_c::method { public: Rig_get_mode() { _signature = "s:n"; _help = "Returns the name of the current transceiver mode"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("rig.get_mode: %s", qso_opMODE->value()); *retval = xmlrpc_c::value_string(qso_opMODE->value()); } }; class Rig_set_bandwidths : public xmlrpc_c::method { public: Rig_set_bandwidths() { _signature = "n:A"; _help = "Sets the list of available rig bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector v = params.getArray(0); vector bws; string s_bws; bws.reserve(v.size()); for (vector::const_iterator i = v.begin(); i != v.end(); ++i) { bws.push_back(static_cast(xmlrpc_c::value_string(*i))); s_bws.append("\n").append(static_cast(xmlrpc_c::value_string(*i))); } LOG_VERBOSE("rig.set_bandwidths:%s", s_bws.c_str()); REQ_SYNC(set_combo_contents, qso_opBW, &bws); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_bandwidth : public xmlrpc_c::method { public: Rig_set_bandwidth() { _signature = "n:s"; _help = "Selects a bandwidth previously added by rig.set_bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("rig.set_bandwidth: %s", string(params.getString(0)).c_str()); REQ(set_combo_value, qso_opBW, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_bandwidths : public xmlrpc_c::method { public: Rig_get_bandwidths() { _signature = "A:n"; _help = "Returns the list of available rig bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector bws; REQ_SYNC(get_combo_contents, qso_opBW, &bws); string sbws; for (size_t n = 0; n < bws.size(); n++) sbws.append("\n").append(string(bws[n])); LOG_VERBOSE("rig.get_modes:%s", sbws.c_str()); *retval = xmlrpc_c::value_array(bws); } }; class Rig_get_bandwidth : public xmlrpc_c::method { public: Rig_get_bandwidth() { _signature = "s:n"; _help = "Returns the name of the current transceiver bandwidth"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("rig.get_bandwidth: %s", string(qso_opBW->value()).c_str()); *retval = xmlrpc_c::value_string(qso_opBW->value()); } }; class Rig_get_notch : public xmlrpc_c::method { public: Rig_get_notch() { _signature = "s:n"; _help = "Reports a notch filter frequency based on WF action"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("rig.get_notch: %d", notch_frequency); *retval = xmlrpc_c::value_int(notch_frequency); } }; class Rig_set_notch : public xmlrpc_c::method { public: Rig_set_notch() { _signature = "n:i"; _help = "Sets the notch filter position on WF"; } static void set_notch(int freq) { notch_frequency = freq; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int notch = notch_frequency; REQ(set_notch, params.getInt(0)); LOG_VERBOSE("rig.set_notch: %d", notch); *retval = xmlrpc_c::value_int(notch); } }; // ============================================================================= class Main_set_rig_name : public Rig_set_name { public: Main_set_rig_name() { _help = "[DEPRECATED; use rig.set_name]"; } }; class Main_set_rig_frequency : public Rig_set_frequency { public: Main_set_rig_frequency() { _help = "[DEPRECATED; use rig.set_frequency]"; } }; class Main_set_rig_modes : public Rig_set_modes { public: Main_set_rig_modes() { _help = "[DEPRECATED; use rig.set_modes"; } }; class Main_set_rig_mode : public Rig_set_mode { public: Main_set_rig_mode() { _help = "[DEPRECATED; use rig.set_mode"; } }; class Main_get_freq : public Rig_get_freq { public: Main_get_freq() {_help = "[DEPRECATED; use rig.get_frequency"; } }; class Main_get_rig_modes : public Rig_get_modes { public: Main_get_rig_modes() { _help = "[DEPRECATED; use rig.get_modes]"; } }; class Main_get_rig_mode : public Rig_get_mode { public: Main_get_rig_mode() { _help = "[DEPRECATED; use rig.get_mode]"; } }; class Main_set_rig_bandwidths : public Rig_set_bandwidths { public: Main_set_rig_bandwidths() { _help = "[DEPRECATED; use rig.set_bandwidths]"; } }; class Main_set_rig_bandwidth : public Rig_set_bandwidth { public: Main_set_rig_bandwidth() { _help = "[DEPRECATED; use rig.set_bandwidth]"; } }; class Main_get_rig_bandwidths : public Rig_set_bandwidths { public: Main_get_rig_bandwidths() { _help = "[DEPRECATED; use rig.get_bandwidths]"; } }; class Main_get_rig_bandwidth : public Rig_get_bandwidth { public: Main_get_rig_bandwidth() { _help = "[DEPRECATED; use rig.get_bandwidth]"; } }; // ============================================================================= class Log_get_freq : public xmlrpc_c::method { public: Log_get_freq() { _signature = "s:n"; _help = "Returns the Frequency field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_freq: %s", inpFreq->value()); *retval = xmlrpc_c::value_string(inpFreq->value()); } }; class Log_get_time_on : public xmlrpc_c::method { public: Log_get_time_on() { _signature = "s:n"; _help = "Returns the Time-On field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_time_on: %s", inpTimeOn->value()); *retval = xmlrpc_c::value_string(inpTimeOn->value()); } }; class Log_get_time_off : public xmlrpc_c::method { public: Log_get_time_off() { _signature = "s:n"; _help = "Returns the Time-Off field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_time_off: %s", inpTimeOff->value()); *retval = xmlrpc_c::value_string(inpTimeOff->value()); } }; class Log_get_call : public xmlrpc_c::method { public: Log_get_call() { _signature = "s:n"; _help = "Returns the Call field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_call: %s", inpCall->value()); *retval = xmlrpc_c::value_string(inpCall->value()); } }; class Log_set_call : public xmlrpc_c::method { public: Log_set_call() { _signature = "n:s"; _help = "Sets the Call field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_call: %s", string(params.getString(0)).c_str()); REQ(set_text, inpCall, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_name : public xmlrpc_c::method { public: Log_get_name() { _signature = "s:n"; _help = "Returns the Name field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_Name: %s", inpName->value()); *retval = xmlrpc_c::value_string(inpName->value()); } }; class Log_set_name : public xmlrpc_c::method { public: Log_set_name() { _signature = "n:s"; _help = "Sets the Name field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_name: %s", string(params.getString(0)).c_str()); REQ(set_text, inpName, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_set_qth : public xmlrpc_c::method { public: Log_set_qth() { _signature = "n:s"; _help = "Sets the QTH field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_qth: %s", string(params.getString(0)).c_str()); REQ(set_text, inpQth, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_set_locator : public xmlrpc_c::method { public: Log_set_locator() { _signature = "n:s"; _help = "Sets the Locator field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_locator: %s", string(params.getString(0)).c_str()); REQ(set_text, inpLoc, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_rst_in : public xmlrpc_c::method { public: Log_get_rst_in() { _signature = "s:n"; _help = "Returns the RST(r) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_rst_in: %s", inpRstIn->value()); *retval = xmlrpc_c::value_string(inpRstIn->value()); } }; class Log_set_rst_in : public xmlrpc_c::method { public: Log_set_rst_in() { _signature = "n:s"; _help = "Sets the RST(r) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_rst_in: %s", string(params.getString(0)).c_str()); REQ(set_text2, inpRstIn, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_rst_out : public xmlrpc_c::method { public: Log_get_rst_out() { _signature = "s:n"; _help = "Returns the RST(s) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_rst_out: %s", inpRstOut->value()); *retval = xmlrpc_c::value_string(inpRstOut->value()); } }; class Log_set_rst_out : public xmlrpc_c::method { public: Log_set_rst_out() { _signature = "n:s"; _help = "Sets the RST(s) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_rst_out: %s", string(params.getString(0)).c_str()); REQ(set_text2, inpRstOut, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_serial_number : public xmlrpc_c::method { public: Log_get_serial_number() { _signature = "s:n"; _help = "Returns the serial number field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_serial_number: %s", inpSerNo->value()); *retval = xmlrpc_c::value_string(inpSerNo->value()); } }; class Log_set_serial_number : public xmlrpc_c::method { public: Log_set_serial_number() { _signature = "n:s"; _help = "Sets the serial number field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_serial_number: %s", string(params.getString(0)).c_str()); REQ(set_text, inpSerNo, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_serial_number_sent : public xmlrpc_c::method { public: Log_get_serial_number_sent() { _signature = "s:n"; _help = "Returns the serial number (sent) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_serial_number_sent: %s", outSerNo->value()); *retval = xmlrpc_c::value_string(outSerNo->value()); } }; class Log_get_exchange : public xmlrpc_c::method { public: Log_get_exchange() { _signature = "s:n"; _help = "Returns the contest exchange field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_exchange: %s", inpXchgIn->value()); *retval = xmlrpc_c::value_string(inpXchgIn->value()); } }; class Log_set_exchange : public xmlrpc_c::method { public: Log_set_exchange() { _signature = "n:s"; _help = "Sets the contest exchange field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("log.set_exchange: %s", string(params.getString(0)).c_str()); REQ(set_text, inpXchgIn, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_state : public xmlrpc_c::method { public: Log_get_state() { _signature = "s:n"; _help = "Returns the State field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_state: %s", inpState->value()); *retval = xmlrpc_c::value_string(inpState->value()); } }; class Log_get_province : public xmlrpc_c::method { public: Log_get_province() { _signature = "s:n"; _help = "Returns the Province field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_province: %s", inpVEprov->value()); *retval = xmlrpc_c::value_string(inpVEprov->value()); } }; class Log_get_country : public xmlrpc_c::method { public: Log_get_country() { _signature = "s:n"; _help = "Returns the Country field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_country: %s", cboCountry->value()); *retval = xmlrpc_c::value_string(cboCountry->value()); } }; class Log_get_qth : public xmlrpc_c::method { public: Log_get_qth() { _signature = "s:n"; _help = "Returns the QTH field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_qth: %s", inpQTH->value()); *retval = xmlrpc_c::value_string(inpQth->value()); } }; class Log_get_band : public xmlrpc_c::method { public: Log_get_band() { _signature = "s:n"; _help = "Returns the current band name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_band: %s", band_name(band(wf->rfcarrier()))); *retval = xmlrpc_c::value_string(band_name(band(wf->rfcarrier()))); } }; class Log_get_sb : public Main_get_wf_sideband { public: Log_get_sb() { _help = "[DEPRECATED; use main.get_wf_sideband]"; } }; class Log_get_notes : public xmlrpc_c::method { public: Log_get_notes() { _signature = "s:n"; _help = "Returns the Notes field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_notes: %s", inpNotes->value()); *retval = xmlrpc_c::value_string(inpNotes->value()); } }; class Log_get_locator : public xmlrpc_c::method { public: Log_get_locator() { _signature = "s:n"; _help = "Returns the Locator field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_locator: %s", inpLoc->value()); *retval = xmlrpc_c::value_string(inpLoc->value()); } }; class Log_get_az : public xmlrpc_c::method { public: Log_get_az() { _signature = "s:n"; _help = "Returns the AZ field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("log.get_az: %s", inpAZ->value()); *retval = xmlrpc_c::value_string(inpAZ->value()); } }; class Log_clear : public xmlrpc_c::method { public: Log_clear() { _signature = "n:n"; _help = "Clears the contents of the log fields."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("%s", "log.clear"); REQ(clearQSO); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Io_in_use : public xmlrpc_c::method { public: Io_in_use() { _signature = "s:n"; _help = "Returns the IO port in use (ARQ/KISS)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { string s; if(data_io_enabled == KISS_IO) s = "KISS"; else if(data_io_enabled == ARQ_IO) s = "ARQ"; else s = ""; LOG_VERBOSE("Io.in_use: %s", s.c_str()); *retval = xmlrpc_c::value_string(s.c_str()); } }; class Io_enable_kiss : public xmlrpc_c::method { public: Io_enable_kiss() { _signature = "n:n"; _help = "Switch to KISS I/O"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("%s", "Io.enable_kiss"); REQ(enable_kiss); *retval = xmlrpc_c::value_nil(); } }; class Io_enable_arq : public xmlrpc_c::method { public: Io_enable_arq() { _signature = "n:n"; _help = "Switch to ARQ I/O"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("%s", "Io.enable_arq"); REQ(enable_arq); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Text_get_rx_length : public xmlrpc_c::method { public: Text_get_rx_length() { _signature = "i:n"; _help = "Returns the number of characters in the RX widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("Text.get_rx_length: %d", (int)(ReceiveText->buffer()->length())); *retval = xmlrpc_c::value_int(ReceiveText->buffer()->length()); } }; class Text_get_rx : public xmlrpc_c::method { public: Text_get_rx() { _signature = "6:ii"; _help = "Returns a range of characters (start, length) from the RX text widget."; } static void get_rx_text_range(const xmlrpc_c::paramList* params, xmlrpc_c::fault** err, char** text, int* size) { // the get* methods may throw but this function is not allowed to do so try { params->verifyEnd(2); Fl_Text_Buffer_mod* tbuf = ReceiveText->buffer(); int len = tbuf->length(); int start = params->getInt(0, 0, len - 1); int n = params->getInt(1, -1, len - start); if (n == -1) n = len; // we can request more text than is available *text = tbuf->text_range(start, start + n); *size = n; } catch (const xmlrpc_c::fault& f) { *err = new xmlrpc_c::fault(f); } catch (const exception& e) { *err = new xmlrpc_c::fault(e.what(), xmlrpc_c::fault::CODE_INTERNAL); } } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; xmlrpc_c::fault* err = NULL; char* text; int size; REQ_SYNC(get_rx_text_range, ¶ms, &err, &text, &size); if (unlikely(err)) { xmlrpc_c::fault f(*err); delete err; throw f; } if (size == 0) { *retval = xmlrpc_c::value_bytestring(""); // *retval = xmlrpc_c::value_bytestring("empty rx buffer!"); } else { vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } LOG_VERBOSE("Text.get_rx: %s", text); free(text); } }; class Text_clear_rx : public xmlrpc_c::method { public: Text_clear_rx() { _signature = "n:n"; _help = "Clears the RX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&FTextBase::clear, ReceiveText); LOG_VERBOSE("%s", "Text.clear_rx"); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx_queu : public xmlrpc_c::method { public: Text_add_tx_queu() { _signature = "n:s"; _help = "Adds a string to the TX transmit queu."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; guard_lock xmlchr_lock(&tx_queue_mutex); std::string txt2send = params.getString(0); if (xmlchars.empty()) { xmlchars = txt2send; xmltest_char_available = true; pxmlchar = 0; } else { xmlchars.append(txt2send); } LOG_VERBOSE("Text.add_tx_queue: %s", txt2send.c_str()); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx : public xmlrpc_c::method { public: Text_add_tx() { _signature = "n:s"; _help = "Adds a string to the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_VERBOSE("Text.add_tx: %s", string(params.getString(0)).c_str()); REQ_SYNC(&FTextTX::add_text, TransmitText, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx_bytes : public xmlrpc_c::method { public: Text_add_tx_bytes() { _signature = "n:6"; _help = "Adds a byte string to the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector bytes = params.getBytestring(0); bytes.push_back(0); LOG_VERBOSE("Text.add_tx_bytes: %s", string((const char*)&bytes[0]).c_str()); REQ_SYNC(&FTextTX::add_text, TransmitText, string((const char*)&bytes[0])); *retval = xmlrpc_c::value_nil(); } }; class Text_clear_tx : public xmlrpc_c::method { public: Text_clear_tx() { _signature = "n:n"; _help = "Clears the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&FTextBase::clear, TransmitText); LOG_VERBOSE("%s", "Text.clear_tx"); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class RXTX_get_data : public xmlrpc_c::method { public: RXTX_get_data() { _signature = "6:n"; _help = "Returns all RXTX combined data since last query."; } static void get_rxtx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_rxtx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_rxtx, &text, &size); if (size == 0) { *retval = xmlrpc_c::value_bytestring(""); } else { vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } LOG_VERBOSE("RXTX.get_data: %s", text); } }; // ============================================================================= class RX_get_data : public xmlrpc_c::method { public: RX_get_data() { _signature = "6:n"; _help = "Returns all RX data received since last query."; } static void get_rx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_rx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_rx, &text, &size); if (size == 0) { *retval = xmlrpc_c::value_bytestring(""); } else { vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } LOG_VERBOSE("RX.get_data: %s", text); } }; // ============================================================================= class TX_get_data : public xmlrpc_c::method { public: TX_get_data() { _signature = "6:n"; _help = "Returns all TX data transmitted since last query."; } static void get_tx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_tx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_tx, &text, &size); if (size == 0) { *retval = xmlrpc_c::value_bytestring(""); } else { vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } LOG_VERBOSE("TX.get_data: %s", text); } }; // ============================================================================= class Spot_get_auto : public xmlrpc_c::method { public: Spot_get_auto() { _signature = "b:n"; _help = "Returns the autospotter state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_VERBOSE("Spot.get_auto: %s", (btnAutoSpot->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnAutoSpot->value()); } }; class Spot_set_auto : public xmlrpc_c::method { public: Spot_set_auto() { _signature = "b:b"; _help = "Sets the autospotter state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnAutoSpot->value(); REQ(set_button, (Fl_Button *) btnAutoSpot, params.getBoolean(0)); LOG_VERBOSE("Spot.set_auto: %s", (v ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(v); } }; class Spot_toggle_auto : public xmlrpc_c::method { public: Spot_toggle_auto() { _signature = "b:n"; _help = "Toggles the autospotter state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnAutoSpot->value(); LOG_VERBOSE("Spot.toggle_auto: %s", (v ? "ON" : "OFF")); REQ(set_button, (Fl_Button *) btnAutoSpot, v); *retval = xmlrpc_c::value_boolean(v); } }; class Spot_pskrep_get_count : public xmlrpc_c::method { public: Spot_pskrep_get_count() { _signature = "i:n"; _help = "Returns the number of callsigns spotted in the current session."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int cnt = static_cast(pskrep_count()); LOG_VERBOSE("Spot.pskrep_get_count: %d", cnt); *retval = xmlrpc_c::value_int(cnt); } }; // ============================================================================= // Returns the current wefax modem pointer. static wefax * get_wefax(void) { if( ( active_modem->get_mode() >= MODE_WEFAX_FIRST ) && ( active_modem->get_mode() <= MODE_WEFAX_LAST ) ) { wefax * ptr = dynamic_cast( active_modem ); if( ptr == NULL ) throw runtime_error("Inconsistent wefax object"); return ptr ; } throw runtime_error("Not in wefax mode"); } struct Wefax_state_string : public xmlrpc_c::method { Wefax_state_string() { _signature = "s:n"; _help = "Returns Wefax engine state (tx and rx) for information."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { string wfs = get_wefax()->state_string(); LOG_VERBOSE("wefax.state_string: %s", wfs.c_str()); *retval = xmlrpc_c::value_string( wfs.c_str() ); } catch( const exception & e ) { LOG_VERBOSE("wefax.state_string: %s", e.what()); *retval = xmlrpc_c::value_string( e.what()); } }; struct Wefax_skip_apt : public xmlrpc_c::method { Wefax_skip_apt() { _signature = "s:n"; _help = "Skip APT during Wefax reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->skip_apt(); LOG_VERBOSE("%s", "wefax.skip_apt"); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { LOG_VERBOSE("wefax.skip_apt: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; /// TODO: Refresh the screen with the new value. struct Wefax_skip_phasing : public xmlrpc_c::method { Wefax_skip_phasing() { _signature = "s:n"; _help = "Skip phasing during Wefax reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->skip_phasing(true); LOG_VERBOSE("%s", "wefax.skip_phasing"); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { LOG_VERBOSE("wefax.skip_phasing: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; // TODO: The image should be reloaded just like cancelling from the GUI. struct Wefax_set_tx_abort_flag : public xmlrpc_c::method { Wefax_set_tx_abort_flag() { _signature = "s:n"; _help = "Cancels Wefax image transmission"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->set_tx_abort_flag(); LOG_VERBOSE("%s","wefax.set_tx_abort_flag"); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { LOG_VERBOSE("wefax.set_tx_abort_flag: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_end_reception : public xmlrpc_c::method { Wefax_end_reception() { _signature = "s:n"; _help = "End Wefax image reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->end_reception(); LOG_VERBOSE("%s","wefax.end_reception"); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { LOG_VERBOSE("wefax.end_reception: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_start_manual_reception : public xmlrpc_c::method { Wefax_start_manual_reception() { _signature = "s:n"; _help = "Starts fax image reception in manual mode"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->set_rx_manual_mode(true); get_wefax()->skip_apt(); get_wefax()->skip_phasing(true); LOG_VERBOSE("%s", "wefax.start_manual_reception"); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { LOG_VERBOSE("wefax.start_manual_reception: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_set_adif_log : public xmlrpc_c::method { Wefax_set_adif_log() { _signature = "s:b"; _help = "Set/reset logging to received/transmit images to ADIF log file"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { progdefaults.WEFAX_AdifLog = params.getBoolean(0); LOG_VERBOSE("%s", "wefax.set_adif_log"); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { LOG_VERBOSE("wefax.set_adif_log: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_set_max_lines : public xmlrpc_c::method { Wefax_set_max_lines() { _signature = "s:i"; _help = "Set maximum lines for fax image reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { progdefaults.WEFAX_MaxRows = params.getInt(0); /// This updates the GUI. LOG_VERBOSE("wefax.set_max_lines: %d", progdefaults.WEFAX_MaxRows); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { LOG_VERBOSE("wefax.set_max_lines: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_get_received_file : public xmlrpc_c::method { Wefax_get_received_file() { _signature = "s:i"; _help = "Waits for next received fax file, returns its name with a delay. Empty string if timeout."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string filename = get_wefax()->get_received_file( params.getInt(0)); LOG_VERBOSE("wefax.get_received_file: %s", filename.c_str()); *retval = xmlrpc_c::value_string( filename ); } catch( const exception & e ) { LOG_VERBOSE("wefax.get_received_file: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_send_file : public xmlrpc_c::method { Wefax_send_file() { _signature = "s:si"; _help = "Send file. returns an empty string if OK otherwise an error message."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string status = get_wefax()->send_file( params.getString(0), params.getInt(1) ); LOG_VERBOSE("wefax.send_file: %s", status.c_str()); *retval = xmlrpc_c::value_string( status ); } catch( const exception & e ) { LOG_VERBOSE("wefax.send_file: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; // ============================================================================= // Returns the current navtex modem pointer. static navtex * get_navtex(void) { if( ( active_modem->get_mode() != MODE_NAVTEX ) && ( active_modem->get_mode() != MODE_SITORB ) ) { navtex * ptr = dynamic_cast( active_modem ); if( ptr == NULL ) throw runtime_error("Inconsistent navtex object"); return ptr ; } throw runtime_error("Not in navtex or sitorB mode"); } struct Navtex_get_message : public xmlrpc_c::method { Navtex_get_message() { _signature = "s:i"; _help = "Returns next Navtex/SitorB message with a max delay in seconds.. Empty string if timeout."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { LOG_VERBOSE("navtex.get_message: %s", string( get_navtex()->get_message( params.getInt(0))).c_str()); *retval = xmlrpc_c::value_string( get_navtex()->get_message( params.getInt(0)) ); } catch( const exception & e ) { LOG_VERBOSE("navtex.get_message: %s", e.what()); *retval = xmlrpc_c::value_string( e.what()); } }; struct Navtex_send_message : public xmlrpc_c::method { Navtex_send_message() { _signature = "s:s"; _help = "Send a Navtex/SitorB message. Returns an empty string if OK otherwise an error message."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string status = get_navtex()->send_message( params.getString(0) ); LOG_VERBOSE("navtex.send_message: %s", status.c_str()); *retval = xmlrpc_c::value_string( status ); } catch( const exception & e ) { LOG_VERBOSE("navtex.send_message: %s", e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; // ============================================================================= // End XML-RPC interface // method list: ELEM_(class_name, "method_name") #undef ELEM_ #define METHOD_LIST \ ELEM_(Fldigi_list, "fldigi.list") \ ELEM_(Fldigi_name, "fldigi.name") \ ELEM_(Fldigi_version_struct, "fldigi.version_struct") \ ELEM_(Fldigi_version_string, "fldigi.version") \ ELEM_(Fldigi_name_version, "fldigi.name_version") \ ELEM_(Fldigi_config_dir, "fldigi.config_dir") \ ELEM_(Fldigi_terminate, "fldigi.terminate") \ \ ELEM_(Modem_get_name, "modem.get_name") \ ELEM_(Modem_get_names, "modem.get_names") \ ELEM_(Modem_get_id, "modem.get_id") \ ELEM_(Modem_get_max_id, "modem.get_max_id") \ ELEM_(Modem_set_by_name, "modem.set_by_name") \ ELEM_(Modem_set_by_id, "modem.set_by_id") \ \ ELEM_(Modem_set_carrier, "modem.set_carrier") \ ELEM_(Modem_inc_carrier, "modem.inc_carrier") \ ELEM_(Modem_get_carrier, "modem.get_carrier") \ \ ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \ ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \ ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \ \ ELEM_(Modem_get_bw, "modem.get_bandwidth") \ ELEM_(Modem_set_bw, "modem.set_bandwidth") \ ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \ \ ELEM_(Modem_get_quality, "modem.get_quality") \ ELEM_(Modem_search_up, "modem.search_up") \ ELEM_(Modem_search_down, "modem.search_down") \ \ ELEM_(Modem_olivia_set_bandwidth, "modem.olivia.set_bandwidth") \ ELEM_(Modem_olivia_get_bandwidth, "modem.olivia.get_bandwidth") \ ELEM_(Modem_olivia_set_tones, "modem.olivia.set_tones") \ ELEM_(Modem_olivia_get_tones, "modem.olivia.get_tones") \ \ ELEM_(Main_get_status1, "main.get_status1") \ ELEM_(Main_get_status2, "main.get_status2") \ \ ELEM_(Main_get_sb, "main.get_sideband") \ ELEM_(Main_set_sb, "main.set_sideband") \ ELEM_(Main_get_wf_sideband, "main.get_wf_sideband") \ ELEM_(Main_set_wf_sideband, "main.set_wf_sideband") \ ELEM_(Main_get_freq, "main.get_frequency") \ ELEM_(Main_set_freq, "main.set_frequency") \ ELEM_(Main_inc_freq, "main.inc_frequency") \ \ ELEM_(Main_get_afc, "main.get_afc") \ ELEM_(Main_set_afc, "main.set_afc") \ ELEM_(Main_toggle_afc, "main.toggle_afc") \ \ ELEM_(Main_get_sql, "main.get_squelch") \ ELEM_(Main_set_sql, "main.set_squelch") \ ELEM_(Main_toggle_sql, "main.toggle_squelch") \ \ ELEM_(Main_get_sql_level, "main.get_squelch_level") \ ELEM_(Main_set_sql_level, "main.set_squelch_level") \ ELEM_(Main_inc_sql_level, "main.inc_squelch_level") \ \ ELEM_(Main_get_rev, "main.get_reverse") \ ELEM_(Main_set_rev, "main.set_reverse") \ ELEM_(Main_toggle_rev, "main.toggle_reverse") \ \ ELEM_(Main_get_lock, "main.get_lock") \ ELEM_(Main_set_lock, "main.set_lock") \ ELEM_(Main_toggle_lock, "main.toggle_lock") \ \ ELEM_(Main_get_txid, "main.get_txid") \ ELEM_(Main_set_txid, "main.set_txid") \ ELEM_(Main_toggle_txid, "main.toggle_txid") \ \ ELEM_(Main_get_rsid, "main.get_rsid") \ ELEM_(Main_set_rsid, "main.set_rsid") \ ELEM_(Main_toggle_rsid, "main.toggle_rsid") \ \ ELEM_(Main_get_trx_status, "main.get_trx_status") \ ELEM_(Main_tx, "main.tx") \ ELEM_(Main_tune, "main.tune") \ ELEM_(Main_rsid, "main.rsid") \ ELEM_(Main_rx, "main.rx") \ ELEM_(Main_rx_tx, "main.rx_tx") \ ELEM_(Main_rx_only, "main.rx_only") \ ELEM_(Main_abort, "main.abort") \ \ ELEM_(Main_get_trx_state, "main.get_trx_state") \ ELEM_(Main_get_tx_timing, "main.get_tx_timing") \ ELEM_(Main_get_char_rates, "main.get_char_rates") \ ELEM_(Main_get_char_timing, "main.get_char_timing") \ ELEM_(Main_set_rig_name, "main.set_rig_name") \ ELEM_(Main_set_rig_frequency, "main.set_rig_frequency") \ ELEM_(Main_set_rig_modes, "main.set_rig_modes") \ ELEM_(Main_set_rig_mode, "main.set_rig_mode") \ ELEM_(Main_get_rig_modes, "main.get_rig_modes") \ ELEM_(Main_get_rig_mode, "main.get_rig_mode") \ ELEM_(Main_set_rig_bandwidths, "main.set_rig_bandwidths") \ ELEM_(Main_set_rig_bandwidth, "main.set_rig_bandwidth") \ ELEM_(Main_get_rig_bandwidth, "main.get_rig_bandwidth") \ ELEM_(Main_get_rig_bandwidths, "main.get_rig_bandwidths") \ \ ELEM_(Main_run_macro, "main.run_macro") \ ELEM_(Main_get_max_macro_id, "main.get_max_macro_id") \ \ ELEM_(Rig_set_name, "rig.set_name") \ ELEM_(Rig_get_name, "rig.get_name") \ ELEM_(Rig_set_frequency, "rig.set_frequency") \ ELEM_(Rig_set_smeter, "rig.set_smeter") \ ELEM_(Rig_set_pwrmeter, "rig.set_pwrmeter") \ ELEM_(Rig_set_modes, "rig.set_modes") \ ELEM_(Rig_set_mode, "rig.set_mode") \ ELEM_(Rig_get_modes, "rig.get_modes") \ ELEM_(Rig_get_mode, "rig.get_mode") \ ELEM_(Rig_set_bandwidths, "rig.set_bandwidths") \ ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \ ELEM_(Rig_get_freq, "rig.get_frequency") \ ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \ ELEM_(Rig_get_bandwidths, "rig.get_bandwidths") \ ELEM_(Rig_get_notch, "rig.get_notch") \ ELEM_(Rig_set_notch, "rig.set_notch") \ \ ELEM_(Log_get_freq, "log.get_frequency") \ ELEM_(Log_get_time_on, "log.get_time_on") \ ELEM_(Log_get_time_off, "log.get_time_off") \ ELEM_(Log_get_call, "log.get_call") \ ELEM_(Log_get_name, "log.get_name") \ ELEM_(Log_get_rst_in, "log.get_rst_in") \ ELEM_(Log_get_rst_out, "log.get_rst_out") \ ELEM_(Log_set_rst_in, "log.set_rst_in") \ ELEM_(Log_set_rst_out, "log.set_rst_out") \ ELEM_(Log_get_serial_number, "log.get_serial_number") \ ELEM_(Log_set_serial_number, "log.set_serial_number") \ ELEM_(Log_get_serial_number_sent, "log.get_serial_number_sent") \ ELEM_(Log_get_exchange, "log.get_exchange") \ ELEM_(Log_set_exchange, "log.set_exchange") \ ELEM_(Log_get_state, "log.get_state") \ ELEM_(Log_get_province, "log.get_province") \ ELEM_(Log_get_country, "log.get_country") \ ELEM_(Log_get_qth, "log.get_qth") \ ELEM_(Log_get_band, "log.get_band") \ ELEM_(Log_get_sb, "log.get_sideband") \ ELEM_(Log_get_notes, "log.get_notes") \ ELEM_(Log_get_locator, "log.get_locator") \ ELEM_(Log_get_az, "log.get_az") \ ELEM_(Log_clear, "log.clear") \ ELEM_(Log_set_call, "log.set_call") \ ELEM_(Log_set_name, "log.set_name") \ ELEM_(Log_set_qth, "log.set_qth") \ ELEM_(Log_set_locator, "log.set_locator") \ ELEM_(Log_set_rst_in, "log.set_rst_in") \ ELEM_(Log_set_rst_out, "log.set_rst_out") \ \ ELEM_(Main_flmsg_online, "main.flmsg_online") \ ELEM_(Main_flmsg_available, "main.flmsg_available") \ ELEM_(Main_flmsg_transfer, "main.flmsg_transfer") \ ELEM_(Main_flmsg_squelch, "main.flmsg_squelch") \ \ ELEM_(Io_in_use, "io.in_use") \ ELEM_(Io_enable_kiss, "io.enable_kiss") \ ELEM_(Io_enable_arq, "io.enable_arq") \ \ ELEM_(Text_get_rx_length, "text.get_rx_length") \ ELEM_(Text_get_rx, "text.get_rx") \ ELEM_(Text_clear_rx, "text.clear_rx") \ ELEM_(Text_add_tx, "text.add_tx") \ ELEM_(Text_add_tx_queu, "text.add_tx_queu") \ ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \ ELEM_(Text_clear_tx, "text.clear_tx") \ \ ELEM_(RXTX_get_data, "rxtx.get_data") \ ELEM_(RX_get_data, "rx.get_data") \ ELEM_(TX_get_data, "tx.get_data") \ \ ELEM_(Spot_get_auto, "spot.get_auto") \ ELEM_(Spot_set_auto, "spot.set_auto") \ ELEM_(Spot_toggle_auto, "spot.toggle_auto") \ ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \ \ ELEM_(Wefax_state_string, "wefax.state_string") \ ELEM_(Wefax_skip_apt, "wefax.skip_apt") \ ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \ ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \ ELEM_(Wefax_end_reception, "wefax.end_reception") \ ELEM_(Wefax_start_manual_reception, "wefax.start_manual_reception") \ ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \ ELEM_(Wefax_set_max_lines, "wefax.set_max_lines") \ ELEM_(Wefax_get_received_file, "wefax.get_received_file") \ ELEM_(Wefax_send_file, "wefax.send_file") \ \ ELEM_(Navtex_get_message, "navtex.get_message") \ ELEM_(Navtex_send_message, "navtex.send_message") \ struct rm_pred { re_t filter; bool allow; rm_pred(const char* re, bool allow_) : filter(re, REG_EXTENDED | REG_NOSUB), allow(allow_) { } bool operator()(const methods_t::value_type& v) { return filter.match(v.name) ^ allow && !strstr(v.name, "fldigi."); } }; void XML_RPC_Server::add_methods(void) { if (methods) return; #undef ELEM_ #define ELEM_(class_, name_) { RpcBuilder::factory, NULL, name_ }, rpc_method m[] = { METHOD_LIST }; methods = new methods_t(m, m + sizeof(m)/sizeof(*m)); if (!progdefaults.xmlrpc_deny.empty()) methods->remove_if(rm_pred(progdefaults.xmlrpc_deny.c_str(), false)); else if (!progdefaults.xmlrpc_allow.empty()) methods->remove_if(rm_pred(progdefaults.xmlrpc_allow.c_str(), true)); for( methods_t::iterator it = methods->begin(), en = methods->end(); it != en; ++it ) { XmlRpcServerMethod * mth = it->m_fact( it->name ); it->method = dynamic_cast< xmlrpc_c::method * >( mth ); } } fldigi-4.1.06/src/network/metar.cxx0000664000175000017500000002427013507402064014105 00000000000000// ---------------------------------------------------------------------------- // metar.cxx // // Copyright (C) 2019 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "metar.h" /*====================================================================== * * WEATHER The weather group * iiddppooxx * ii is intensity group * ii Description * - light * moderate * + heavy * VC in the vicinity * * dd is the descriptor group * dd Description * MI shallow * PR partial * BC patches * DR low drifting * BL blowing * SH shower * TS thunderstorm * FZ freezing * * pp is the precipitation group * pp Description * DZ drizzle * RA rain * SN snow * SG snow grains * IC ice crystals * PE ice pellets * GR hail * GS small hail/snow pellets * UP unknown * * oo is the obscuration group * oo Description * BR mist * FG fog * FU smoke * VA volcanic ash * DU dust * SA sand * HZ haze * PY spray * * xx is the misc group * xx Description * PO dust whirls * SQ squalls * FC funnel cloud/tornado/waterspout * SS duststorm * * CLOUDS * The cloud levels * ccchhhtt * ccc is the coverage * CLR or SKC = clear * FEW = 1/8 coverage * SCT = 2,3,4/8 coverage * BKN = 5,6,7/8 coverage * OVC = overcast * VV = vertical visibility for obscuration * hhh is the height of base in 30m or 100ft increments. ie 30 = 3000 feet * tt is an optional type * CU = cumulus * CB = cumulonumbus * TCU = towering cumulus * CI = cirrus */ struct wxpairs {const char *grp; const char *name;}; static wxpairs precip[] = { {"DZ", "drizzle"}, {"RA", "rain"}, {"SN", "snow"}, {"SG", "snow grains"}, {"IC", "ice crystals"}, {"PE", "ice pellets"}, {"GR", "hail"}, {"GS", "small hail / show pellets"}, {"UP", "unknown"}, {NULL, NULL} }; static wxpairs intensity[] = { {"-", "light"}, {"+", "heavy"}, {"VC", "in the vicinity"}, {NULL, NULL} }; static wxpairs descriptor[] = { {"MI", "shallow "}, {"PR", "partial"}, {"BC", "patches"}, {"DR", "low drifting"}, {"BL", "blowing"}, {"SH", "shower"}, {"TS", "thunderstorm"}, {"FZ", "freezing"}, {NULL, NULL} }; static wxpairs obscure[] = { {"BR", "mist"}, {"FG", "fog"}, {"FU", "smoke"}, {"VA", "volcanic ash"}, {"DU", "dust"}, {"SA", "sand"}, {"HZ", "haze"}, {"PY", "spray"}, {NULL, NULL} }; static wxpairs misc[] = { {"PO", "dust whirls"}, {"SQ", "squalls"}, {"FC", "funnel cloud/tornado/waterspout"}, {"SS", "duststorm"}, {NULL, NULL} }; static wxpairs clouds[] = { {"CLR", "clear skies"}, {"SKC", "clear skies"}, {"FEW", "few clouds"}, {"SCT", "scattered clouds"}, {"BKN", "broken cloud cover"}, {"OVC", "overcast"}, {NULL, NULL} }; static wxpairs cloud_type[] = { {"CU", "cumulus"}, {"CB", "cumulonumbus"}, {"TCU", "towering cumulus"}, {"CI", "cirrus"}, {NULL, NULL} }; void Metar::parse() { size_t p, p1, p2, p3; p = _metar_text.find(_metar_station); if (p == std::string::npos) { _wx_text_full.assign(_metar_station).append(" not found in url response!"); _wx_text_full.append("\n").append(_metar_text).append("\n"); return; } const char *cl = "Content-Length:"; int content_length; p1 = _metar_text.find(cl); if (p1 != std::string::npos) { content_length = atol(&_metar_text[p1 + strlen(cl)]); _metar_text.erase(0, _metar_text.length() - content_length); } else { p2 = _metar_text.find("("); if (p2 != std::string::npos) { p3 = _metar_text.rfind("\n", p2); if (p3 != std::string::npos) _metar_text.erase(0,p3 + 1); } else while ( (p2 = _metar_text.find("\r\n")) != std::string::npos) _metar_text.erase(0, p2 + 2); } p1 = _metar_text.find("\n"); _station_name = _metar_text.substr(0, p1); if ((p2 = _station_name.find("(")) != std::string::npos) _station_name.erase(p2 - 1); p3 = _metar_text.find("ob:"); if (p3 == std::string::npos) { _wx_text_full.assign(_metar_station).append(" observations not available"); _wx_text_parsed.assign(_wx_text_full); return; } _wx_text_full.assign(_metar_text.substr(0, p3)); p = _metar_text.find(_metar_station, p3 + 1); _metar_text.erase(0, p + 1 + _metar_station.length()); p = _metar_text.find("\n"); if (p != std::string::npos) _metar_text.erase(p); // parse field contents bool parsed = false; _conditions.clear(); while(_metar_text.length()) { // each ob: field is separated by a space or end of file parsed = false; p = _metar_text.find(" "); if (p != std::string::npos) { _field = _metar_text.substr(0, p); _metar_text.erase(0, p+1); } else { _field = _metar_text; _metar_text.clear(); } if (_field == "RMK") break; // parse for general weather // iiddppooxx if (_field == "AUTO") ; else if ((p = _field.rfind("KT")) != std::string::npos) { if (p == _field.length() - 2) { // wind dir / speed int knots; _winds.clear(); if (sscanf(_field.substr(3,2).c_str(), "%d", &knots) == 1) { _winds.append(_field.substr(0,3)).append(" at "); char ctemp[10]; if (_mph) { snprintf(ctemp, sizeof(ctemp), "%d mph ", (int)ceil(knots * 600.0 / 528.0 )); _winds.append(ctemp); } if (_kph) { snprintf(ctemp, sizeof(ctemp), "%d km/h ", (int)ceil(knots * 600.0 * 1.6094 / 528.0)); _winds.append(ctemp); } } } } else if ((p = _field.rfind("MPS")) != std::string::npos) { if (p == _field.length() - 3) { // wind dir / speed in meters / second int mps; _winds.clear(); if (sscanf(_field.substr(3,2).c_str(), "%d", &mps) == 1) { _winds.append(_field.substr(0,3)).append(" at "); char ctemp[10]; if (_mph) { snprintf(ctemp, sizeof(ctemp), "%d mph ", (int)ceil(mps * 2.2369)); _winds.append(ctemp); } if (_kph) { snprintf(ctemp, sizeof(ctemp), "%d km/h ", (int)ceil(mps * 3.6)); _winds.append(ctemp); } } } } else if ((p = _field.find("/") ) != std::string::npos) { // temperature / dewpoint std::string cent = _field.substr(0, p); if (cent[0] == 'M') cent[0] = '-'; int tempC, tempF; _temp.clear(); if (sscanf(cent.c_str(), "%d", &tempC) == 1) { tempF = (int)(tempC * 1.8 + 32); char ctemp[10]; if (_fahrenheit) { snprintf(ctemp, sizeof(ctemp), "%d F ", tempF); _temp.append(ctemp); } if (_celsius) { snprintf(ctemp, sizeof(ctemp), "%d C", tempC); _temp.append(ctemp); } } } else if ((_field[0] == 'A' && _field.length() == 5) || _field[0] == 'Q') { float inches; _baro.clear(); if (sscanf(_field.substr(1).c_str(), "%f", &inches) == 1) { if (_field[0] == 'A') inches /= 100.0; else inches /= 33.87; char ctemp[20]; if (_inches) { snprintf(ctemp, sizeof(ctemp), "%.2f in. Hg ", inches); _baro.append(ctemp); } if (_mbars) { snprintf(ctemp, sizeof(ctemp), "%.0f mbar", floor(inches * 33.87)); _baro.append(ctemp); } } } if (!parsed) { for (wxpairs *pp = precip; pp->grp != NULL; pp++) { if (_field.find(pp->grp) != std::string::npos) { // found a precip group wxpairs *ii, *dd, *oo, *xx; for (ii = intensity; ii->grp != NULL; ii++) if (_field.find(ii->grp) != std::string::npos) break; for (dd = descriptor; dd->grp != NULL; dd++) if (_field.find(dd->grp) != std::string::npos) break; for (oo = obscure; oo->grp != NULL; oo++) if (_field.find(oo->grp) != std::string::npos) break; for (xx = misc; xx->grp != NULL; xx++) if (_field.find(xx->grp) != std::string::npos) break; if (ii->grp != NULL) _conditions.append(ii->name).append(" "); if (dd->grp != NULL) _conditions.append(dd->name).append(" "); _conditions.append(pp->name); if (oo->grp != NULL) _conditions.append(", ").append(oo->name); if (xx->grp != NULL) _conditions.append(", ").append(xx->name); parsed = true; } } } if (!parsed) { wxpairs *oo; for (oo = obscure; oo->grp != NULL; oo++) if (_field.find(oo->grp) != std::string::npos) break; if (oo->grp != NULL) { _conditions.append(" ").append(oo->name); parsed = true; } } if (!parsed) { // parse for cloud cover // use only the first occurance of sky cover report; it is lowest altitude // cloud cover is reported multiple times for sounding stations for (wxpairs *cc = clouds; cc->grp != NULL; cc++) { if (_field.find(cc->grp) != std::string::npos) { if (_conditions.find(cc->name) != std::string::npos) break; if (_conditions.empty()) _conditions.append(cc->name); else _conditions.append(", ").append(cc->name); wxpairs *ct; for (ct = cloud_type; ct->grp != NULL; ct++) { if (_field.find(ct->grp) != std::string::npos) { if (ct->grp != NULL) _conditions.append(" ").append(ct->name); break; } } parsed = true; break; } } } } _wx_text_parsed.clear(); if (_name && !_station_name.empty()) { _wx_text_parsed.append("Loc: ").append(_station_name).append("\n"); } if (_condx && !_conditions.empty()) { _wx_text_parsed.append("Cond: ").append(_conditions).append("\n"); } if ((_mph || _kph) && !_winds.empty()){ _wx_text_parsed.append("Wind: ").append(_winds).append("\n"); } if ((_fahrenheit || _celsius) && !_temp.empty() ) { _wx_text_parsed.append("Temp: ").append(_temp).append("\n"); } if ((_inches || _mbars) && !_baro.empty()) { _wx_text_parsed.append("Baro: ").append(_baro).append("\n"); } return; } int Metar::get() { std::string metar_url = "https://tgftp.nws.noaa.gov/data/observations/metar/decoded/"; metar_url.append(_metar_station).append(".TXT"); int ret = url.get(metar_url, _metar_text); if (_debug) std::cout << "url.get(...) returned " << ret << std::endl; if (ret == 0) parse(); return ret; } fldigi-4.1.06/src/network/weather.cxx0000664000175000017500000000420513507401434014430 00000000000000// ---------------------------------------------------------------------------- // weather.cxx -- a part of fldigi // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "signal.h" #include #include #include #include #include #include "threads.h" #include "misc.h" #include "configuration.h" #include "main.h" #include "confdialog.h" #include "fl_digi.h" #include "trx.h" #include "xmlreader.h" #include "qrunner.h" #include "debug.h" #include "network.h" #include "weather.h" #include "metar.h" void getwx(std::string& wx, std::string wxsta) { std::string metar; if (wxsta.empty()) metar = progdefaults.wx_sta; else metar = wxsta; for (size_t n = 0; n < metar.length(); n++) metar[n] = toupper(metar[n]); Metar local_wx; local_wx.params( progdefaults.wx_inches, progdefaults.wx_mbars, progdefaults.wx_fahrenheit, progdefaults.wx_celsius, progdefaults.wx_mph, progdefaults.wx_kph, progdefaults.wx_condx, progdefaults.wx_station_name); local_wx.debug(true); if (local_wx.get(metar) == 0) { if (progdefaults.wx_full) { wx = local_wx.full(); return; } wx = local_wx.parsed(); } else wx.clear(); return; } void get_METAR_station() { cb_mnuVisitURL(0, (void*)std::string("http://www.rap.ucar.edu/weather/surface/stations.txt").c_str()); } fldigi-4.1.06/src/mbedtls/0000775000175000017500000000000013515625030012264 500000000000000fldigi-4.1.06/src/mbedtls/sha256.c0000664000175000017500000004033213507401434013363 00000000000000/* * FIPS-180-2 compliant SHA-256 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SHA-256 Secure Hash Standard was published by NIST in 2002. * * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SHA256_C) #include "mbedtls/sha256.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define SHA256_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA ) #define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond ) #if !defined(MBEDTLS_SHA256_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ do { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } while( 0 ) #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ do { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } while( 0 ) #endif void mbedtls_sha256_init( mbedtls_sha256_context *ctx ) { SHA256_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_sha256_context ) ); } void mbedtls_sha256_free( mbedtls_sha256_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) ); } void mbedtls_sha256_clone( mbedtls_sha256_context *dst, const mbedtls_sha256_context *src ) { SHA256_VALIDATE( dst != NULL ); SHA256_VALIDATE( src != NULL ); *dst = *src; } /* * SHA-256 context setup */ int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 ) { SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 ); ctx->total[0] = 0; ctx->total[1] = 0; if( is224 == 0 ) { /* SHA-256 */ ctx->state[0] = 0x6A09E667; ctx->state[1] = 0xBB67AE85; ctx->state[2] = 0x3C6EF372; ctx->state[3] = 0xA54FF53A; ctx->state[4] = 0x510E527F; ctx->state[5] = 0x9B05688C; ctx->state[6] = 0x1F83D9AB; ctx->state[7] = 0x5BE0CD19; } else { /* SHA-224 */ ctx->state[0] = 0xC1059ED8; ctx->state[1] = 0x367CD507; ctx->state[2] = 0x3070DD17; ctx->state[3] = 0xF70E5939; ctx->state[4] = 0xFFC00B31; ctx->state[5] = 0x68581511; ctx->state[6] = 0x64F98FA7; ctx->state[7] = 0xBEFA4FA4; } ctx->is224 = is224; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 ) { mbedtls_sha256_starts_ret( ctx, is224 ); } #endif #if !defined(MBEDTLS_SHA256_PROCESS_ALT) static const uint32_t K[] = { 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, }; #define SHR(x,n) ((x & 0xFFFFFFFF) >> n) #define ROTR(x,n) (SHR(x,n) | (x << (32 - n))) #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3)) #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10)) #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22)) #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25)) #define F0(x,y,z) ((x & y) | (z & (x | y))) #define F1(x,y,z) (z ^ (x & (y ^ z))) #define R(t) \ ( \ W[t] = S1(W[t - 2]) + W[t - 7] + \ S0(W[t - 15]) + W[t - 16] \ ) #define P(a,b,c,d,e,f,g,h,x,K) \ { \ temp1 = h + S3(e) + F1(e,f,g) + K + x; \ temp2 = S2(a) + F0(a,b,c); \ d += temp1; h = temp1 + temp2; \ } int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ) { uint32_t temp1, temp2, W[64]; uint32_t A[8]; unsigned int i; SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( (const unsigned char *)data != NULL ); for( i = 0; i < 8; i++ ) A[i] = ctx->state[i]; #if defined(MBEDTLS_SHA256_SMALLER) for( i = 0; i < 64; i++ ) { if( i < 16 ) GET_UINT32_BE( W[i], data, 4 * i ); else R( i ); P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] ); temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3]; A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1; } #else /* MBEDTLS_SHA256_SMALLER */ for( i = 0; i < 16; i++ ) GET_UINT32_BE( W[i], data, 4 * i ); for( i = 0; i < 16; i += 8 ) { P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] ); P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] ); P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] ); P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] ); P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] ); P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] ); P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] ); P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] ); } for( i = 16; i < 64; i += 8 ) { P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] ); P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] ); P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] ); P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] ); P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] ); P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] ); P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] ); P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] ); } #endif /* MBEDTLS_SHA256_SMALLER */ for( i = 0; i < 8; i++ ) ctx->state[i] += A[i]; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ) { mbedtls_internal_sha256_process( ctx, data ); } #endif #endif /* !MBEDTLS_SHA256_PROCESS_ALT */ /* * SHA-256 process buffer */ int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( ilen == 0 || input != NULL ); if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) memcpy( (void *) (ctx->buffer + left), input, ilen ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_sha256_update_ret( ctx, input, ilen ); } #endif /* * SHA-256 final digest */ int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx, unsigned char output[32] ) { int ret; uint32_t used; uint32_t high, low; SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( (unsigned char *)output != NULL ); /* * Add padding: 0x80 then 0x00 until 8 bytes remain for the length */ used = ctx->total[0] & 0x3F; ctx->buffer[used++] = 0x80; if( used <= 56 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 56 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 64 - used ); if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 56 ); } /* * Add message length */ high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_BE( high, ctx->buffer, 56 ); PUT_UINT32_BE( low, ctx->buffer, 60 ); if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT32_BE( ctx->state[0], output, 0 ); PUT_UINT32_BE( ctx->state[1], output, 4 ); PUT_UINT32_BE( ctx->state[2], output, 8 ); PUT_UINT32_BE( ctx->state[3], output, 12 ); PUT_UINT32_BE( ctx->state[4], output, 16 ); PUT_UINT32_BE( ctx->state[5], output, 20 ); PUT_UINT32_BE( ctx->state[6], output, 24 ); if( ctx->is224 == 0 ) PUT_UINT32_BE( ctx->state[7], output, 28 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] ) { mbedtls_sha256_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_SHA256_ALT */ /* * output = SHA-256( input buffer ) */ int mbedtls_sha256_ret( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ) { int ret; mbedtls_sha256_context ctx; SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 ); SHA256_VALIDATE_RET( ilen == 0 || input != NULL ); SHA256_VALIDATE_RET( (unsigned char *)output != NULL ); mbedtls_sha256_init( &ctx ); if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_sha256_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ) { mbedtls_sha256_ret( input, ilen, output, is224 ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * FIPS-180-2 test vectors */ static const unsigned char sha256_test_buf[3][57] = { { "abc" }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, { "" } }; static const size_t sha256_test_buflen[3] = { 3, 56, 1000 }; static const unsigned char sha256_test_sum[6][32] = { /* * SHA-224 test vectors */ { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22, 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3, 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7, 0xE3, 0x6C, 0x9D, 0xA7 }, { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC, 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50, 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19, 0x52, 0x52, 0x25, 0x25 }, { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8, 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B, 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE, 0x4E, 0xE7, 0xAD, 0x67 }, /* * SHA-256 test vectors */ { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA, 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23, 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C, 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD }, { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8, 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39, 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67, 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 }, { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92, 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67, 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E, 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 } }; /* * Checkup routine */ int mbedtls_sha256_self_test( int verbose ) { int i, j, k, buflen, ret = 0; unsigned char *buf; unsigned char sha256sum[32]; mbedtls_sha256_context ctx; buf = mbedtls_calloc( 1024, sizeof(unsigned char) ); if( NULL == buf ) { if( verbose != 0 ) mbedtls_printf( "Buffer allocation failed\n" ); return( 1 ); } mbedtls_sha256_init( &ctx ); for( i = 0; i < 6; i++ ) { j = i % 3; k = i < 3; if( verbose != 0 ) mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 ); if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 ) goto fail; if( j == 2 ) { memset( buf, 'a', buflen = 1000 ); for( j = 0; j < 1000; j++ ) { ret = mbedtls_sha256_update_ret( &ctx, buf, buflen ); if( ret != 0 ) goto fail; } } else { ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j], sha256_test_buflen[j] ); if( ret != 0 ) goto fail; } if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 ) goto fail; if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); goto exit; fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); exit: mbedtls_sha256_free( &ctx ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_SHA256_C */ fldigi-4.1.06/src/mbedtls/certs.c0000664000175000017500000005253513507401434013503 00000000000000/* * X.509 test certificates * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "mbedtls/certs.h" #if defined(MBEDTLS_CERTS_C) #if defined(MBEDTLS_ECDSA_C) #define TEST_CA_CRT_EC \ "-----BEGIN CERTIFICATE-----\r\n" \ "MIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\r\n" \ "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ "QyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\r\n" \ "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ "QyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\r\n" \ "ww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\r\n" \ "aY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\r\n" \ "JEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\r\n" \ "NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\r\n" \ "AxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\r\n" \ "CgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\r\n" \ "t4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\r\n" \ "uCjn8pwUOkABXK8Mss90fzCfCEOtIA==\r\n" \ "-----END CERTIFICATE-----\r\n" const char mbedtls_test_ca_crt_ec[] = TEST_CA_CRT_EC; const size_t mbedtls_test_ca_crt_ec_len = sizeof( mbedtls_test_ca_crt_ec ); const char mbedtls_test_ca_key_ec[] = "-----BEGIN EC PRIVATE KEY-----\r\n" "Proc-Type: 4,ENCRYPTED\r\n" "DEK-Info: DES-EDE3-CBC,307EAB469933D64E\r\n" "\r\n" "IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG\r\n" "ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq\r\n" "UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb\r\n" "a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm\r\n" "-----END EC PRIVATE KEY-----\r\n"; const size_t mbedtls_test_ca_key_ec_len = sizeof( mbedtls_test_ca_key_ec ); const char mbedtls_test_ca_pwd_ec[] = "PolarSSLTest"; const size_t mbedtls_test_ca_pwd_ec_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1; const char mbedtls_test_srv_crt_ec[] = "-----BEGIN CERTIFICATE-----\r\n" "MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG\r\n" "CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA\r\n" "2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd\r\n" "BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB\r\n" "PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh\r\n" "clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG\r\n" "CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S\r\n" "C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V\r\n" "fGa5kHvHARBPc8YAIVIqDvHH1Q==\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_srv_crt_ec_len = sizeof( mbedtls_test_srv_crt_ec ); const char mbedtls_test_srv_key_ec[] = "-----BEGIN EC PRIVATE KEY-----\r\n" "MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49\r\n" "AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/\r\n" "6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w==\r\n" "-----END EC PRIVATE KEY-----\r\n"; const size_t mbedtls_test_srv_key_ec_len = sizeof( mbedtls_test_srv_key_ec ); const char mbedtls_test_cli_crt_ec[] = "-----BEGIN CERTIFICATE-----\r\n" "MIICLDCCAbKgAwIBAgIBDTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjBBMQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxHzAdBgNVBAMTFlBvbGFyU1NMIFRlc3QgQ2xpZW50IDIw\r\n" "WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARX5a6xc9/TrLuTuIH/Eq7u5lOszlVT\r\n" "9jQOzC7jYyUL35ji81xgNpbA1RgUcOV/n9VLRRjlsGzVXPiWj4dwo+THo4GdMIGa\r\n" "MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMG4GA1Ud\r\n" "IwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDER\r\n" "MA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GC\r\n" "CQDBQ+J+YkPM6DAKBggqhkjOPQQDAgNoADBlAjBKZQ17IIOimbmoD/yN7o89u3BM\r\n" "lgOsjnhw3fIOoLIWy2WOGsk/LGF++DzvrRzuNiACMQCd8iem1XS4JK7haj8xocpU\r\n" "LwjQje5PDGHfd3h9tP38Qknu5bJqws0md2KOKHyeV0U=\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_cli_crt_ec_len = sizeof( mbedtls_test_cli_crt_ec ); const char mbedtls_test_cli_key_ec[] = "-----BEGIN EC PRIVATE KEY-----\r\n" "MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\r\n" "AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\r\n" "wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\r\n" "-----END EC PRIVATE KEY-----\r\n"; const size_t mbedtls_test_cli_key_ec_len = sizeof( mbedtls_test_cli_key_ec ); #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_RSA_C) #if defined(MBEDTLS_SHA256_C) #define TEST_CA_CRT_RSA_SHA256 \ "-----BEGIN CERTIFICATE-----\r\n" \ "MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ "MTcwNTA0MTY1NzAxWhcNMjcwNTA1MTY1NzAxWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ "A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ "gZUwgZIwHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/MGMGA1UdIwRcMFqA\r\n" \ "FLRa5KWz3tJS9rnVppUP6z68x/3/oT+kPTA7MQswCQYDVQQGEwJOTDERMA8GA1UE\r\n" \ "CgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0GCAQAwDAYDVR0T\r\n" \ "BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAHK/HHrTZMnnVMpde1io+voAtql7j\r\n" \ "4sRhLrjD7o3THtwRbDa2diCvpq0Sq23Ng2LMYoXsOxoL/RQK3iN7UKxV3MKPEr0w\r\n" \ "XQS+kKQqiT2bsfrjnWMVHZtUOMpm6FNqcdGm/Rss3vKda2lcKl8kUnq/ylc1+QbB\r\n" \ "G6A6tUvQcr2ZyWfVg+mM5XkhTrOOXus2OLikb4WwEtJTJRNE0f+yPODSUz0/vT57\r\n" \ "ApH0CnB80bYJshYHPHHymOtleAB8KSYtqm75g/YNobjnjB6cm4HkW3OZRVIl6fYY\r\n" \ "n20NRVA1Vjs6GAROr4NqW4k/+LofY9y0LLDE+p0oIEKXIsIvhPr39swxSA==\r\n" \ "-----END CERTIFICATE-----\r\n" const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA_SHA256; const size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa ); #define TEST_CA_CRT_RSA_SOME static const char mbedtls_test_ca_crt_rsa_sha256[] = TEST_CA_CRT_RSA_SHA256; #endif #if !defined(TEST_CA_CRT_RSA_SOME) || defined(MBEDTLS_SHA1_C) #define TEST_CA_CRT_RSA_SHA1 \ "-----BEGIN CERTIFICATE-----\r\n" \ "MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \ "MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ "MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ "A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ "gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\r\n" \ "/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\r\n" \ "BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\r\n" \ "dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\r\n" \ "SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\r\n" \ "DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\r\n" \ "pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\r\n" \ "m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\r\n" \ "7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\r\n" \ "-----END CERTIFICATE-----\r\n" #if !defined (TEST_CA_CRT_RSA_SOME) const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA_SHA1; const size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa ); #endif static const char mbedtls_test_ca_crt_rsa_sha1[] = TEST_CA_CRT_RSA_SHA1; #endif const char mbedtls_test_ca_key_rsa[] = "-----BEGIN RSA PRIVATE KEY-----\r\n" "Proc-Type: 4,ENCRYPTED\r\n" "DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B\r\n" "\r\n" "9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA\r\n" "7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq\r\n" "Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo\r\n" "PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb\r\n" "GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9\r\n" "gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq\r\n" "QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w\r\n" "PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x\r\n" "vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU\r\n" "WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X\r\n" "JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR\r\n" "KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe\r\n" "Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J\r\n" "9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2\r\n" "iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/\r\n" "tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT\r\n" "P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL\r\n" "1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb\r\n" "nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5\r\n" "X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq\r\n" "rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz\r\n" "L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l\r\n" "I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR\r\n" "wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde\r\n" "P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2\r\n" "-----END RSA PRIVATE KEY-----\r\n"; const size_t mbedtls_test_ca_key_rsa_len = sizeof( mbedtls_test_ca_key_rsa ); const char mbedtls_test_ca_pwd_rsa[] = "PolarSSLTest"; const size_t mbedtls_test_ca_pwd_rsa_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1; /* tests/data_files/server2.crt */ const char mbedtls_test_srv_crt_rsa[] = "-----BEGIN CERTIFICATE-----\r\n" "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAAFzC0rF\r\n" "y6De8WMcdgQrEw3AhBHFjzqnxZw1ene4IBSC7lTw8rBSy3jOWQdPUWn+0y/pCeeF\r\n" "kti6sevFdl1hLemGtd4q+T9TKEKGg3ND4ARfB5AUZZ9uEHq8WBkiwus5clGS17Qd\r\n" "dS/TOisB59tQruLx1E1bPLtBKyqk4koC5WAULJwfpswGSyWJTpYwIpxcWE3D2tBu\r\n" "UB6MZfXZFzWmWEOyKbeoXjXe8GBCGgHLywvYDsGQ36HSGtEsAvR2QaTLSxWYcfk1\r\n" "fbDn4jSWkb4yZy1r01UEigFQtONieGwRFaUqEcFJHJvEEGVgh9keaVlOj2vrwf5r\r\n" "4mN4lW7gLdenN6g=\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_srv_crt_rsa_len = sizeof( mbedtls_test_srv_crt_rsa ); /* tests/data_files/server2.key */ const char mbedtls_test_srv_key_rsa[] = "-----BEGIN RSA PRIVATE KEY-----\r\n" "MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\r\n" "lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\r\n" "2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\r\n" "Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\r\n" "GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\r\n" "y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\r\n" "++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\r\n" "Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\r\n" "/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\r\n" "WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\r\n" "GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\r\n" "TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\r\n" "CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\r\n" "nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\r\n" "AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\r\n" "sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\r\n" "mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\r\n" "BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\r\n" "whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\r\n" "vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\r\n" "3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\r\n" "3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\r\n" "ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\r\n" "4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\r\n" "TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\r\n" "-----END RSA PRIVATE KEY-----\r\n"; const size_t mbedtls_test_srv_key_rsa_len = sizeof( mbedtls_test_srv_key_rsa ); /* tests/data_files/cli-rsa-sha256.crt */ const char mbedtls_test_cli_crt_rsa[] = "-----BEGIN CERTIFICATE-----\r\n" "MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\r\n" "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\r\n" "M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\r\n" "1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\r\n" "MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\r\n" "4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\r\n" "/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\r\n" "o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf\r\n" "BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC\r\n" "AQEAlHabem2Tu69VUN7EipwnQn1dIHdgvT5i+iQHpSxY1crPnBbAeSdAXwsVEqLQ\r\n" "gOOIAQD5VIITNuoGgo4i+4OpNh9u7ZkpRHla+/swsfrFWRRbBNP5Bcu74AGLstwU\r\n" "zM8gIkBiyfM1Q1qDQISV9trlCG6O8vh8dp/rbI3rfzo99BOHXgFCrzXjCuW4vDsF\r\n" "r+Dao26bX3sJ6UnEWg1H3o2x6PpUcvQ36h71/bz4TEbbUUEpe02V4QWuL+wrhHJL\r\n" "U7o3SVE3Og7jPF8sat0a50YUWhwEFI256m02KAXLg89ueUyYKEr6rNwhcvXJpvU9\r\n" "giIVvd0Sbjjnn7NC4VDbcXV8vw==\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_cli_crt_rsa_len = sizeof( mbedtls_test_cli_crt_rsa ); /* tests/data_files/cli-rsa.key */ const char mbedtls_test_cli_key_rsa[] = "-----BEGIN RSA PRIVATE KEY-----\r\n" "MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\r\n" "B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\r\n" "bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\r\n" "Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\r\n" "7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\r\n" "dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\r\n" "yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\r\n" "4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\r\n" "ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\r\n" "zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\r\n" "l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\r\n" "DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\r\n" "VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\r\n" "Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\r\n" "wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\r\n" "c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\r\n" "33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\r\n" "ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\r\n" "BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\r\n" "KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\r\n" "UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\r\n" "7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\r\n" "gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\r\n" "bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\r\n" "8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\r\n" "-----END RSA PRIVATE KEY-----\r\n"; const size_t mbedtls_test_cli_key_rsa_len = sizeof( mbedtls_test_cli_key_rsa ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_PEM_PARSE_C) /* Concatenation of all available CA certificates */ const char mbedtls_test_cas_pem[] = #ifdef TEST_CA_CRT_RSA_SHA1 TEST_CA_CRT_RSA_SHA1 #endif #ifdef TEST_CA_CRT_RSA_SHA256 TEST_CA_CRT_RSA_SHA256 #endif #ifdef TEST_CA_CRT_EC TEST_CA_CRT_EC #endif ""; const size_t mbedtls_test_cas_pem_len = sizeof( mbedtls_test_cas_pem ); #endif /* List of all available CA certificates */ const char * mbedtls_test_cas[] = { #if defined(TEST_CA_CRT_RSA_SHA1) mbedtls_test_ca_crt_rsa_sha1, #endif #if defined(TEST_CA_CRT_RSA_SHA256) mbedtls_test_ca_crt_rsa_sha256, #endif #if defined(MBEDTLS_ECDSA_C) mbedtls_test_ca_crt_ec, #endif NULL }; const size_t mbedtls_test_cas_len[] = { #if defined(TEST_CA_CRT_RSA_SHA1) sizeof( mbedtls_test_ca_crt_rsa_sha1 ), #endif #if defined(TEST_CA_CRT_RSA_SHA256) sizeof( mbedtls_test_ca_crt_rsa_sha256 ), #endif #if defined(MBEDTLS_ECDSA_C) sizeof( mbedtls_test_ca_crt_ec ), #endif 0 }; #if defined(MBEDTLS_RSA_C) const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_rsa; /* SHA1 or SHA256 */ const char *mbedtls_test_ca_key = mbedtls_test_ca_key_rsa; const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_rsa; const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_rsa; const char *mbedtls_test_srv_key = mbedtls_test_srv_key_rsa; const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_rsa; const char *mbedtls_test_cli_key = mbedtls_test_cli_key_rsa; const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_rsa ); const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_rsa ); const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1; const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_rsa ); const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_rsa ); const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_rsa ); const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_rsa ); #else /* ! MBEDTLS_RSA_C, so MBEDTLS_ECDSA_C */ const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_ec; const char *mbedtls_test_ca_key = mbedtls_test_ca_key_ec; const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_ec; const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_ec; const char *mbedtls_test_srv_key = mbedtls_test_srv_key_ec; const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_ec; const char *mbedtls_test_cli_key = mbedtls_test_cli_key_ec; const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_ec ); const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_ec ); const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1; const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_ec ); const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_ec ); const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_ec ); const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_ec ); #endif /* MBEDTLS_RSA_C */ #endif /* MBEDTLS_CERTS_C */ fldigi-4.1.06/src/mbedtls/ecdh.c0000664000175000017500000004741313507401434013265 00000000000000/* * Elliptic curve Diffie-Hellman * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * SEC1 http://www.secg.org/index.php?action=secg,docs_secg * RFC 4492 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECDH_C) #include "mbedtls/ecdh.h" #include "mbedtls/platform_util.h" #include /* Parameter validation macros based on platform_util.h */ #define ECDH_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECDH_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) typedef mbedtls_ecdh_context mbedtls_ecdh_context_mbed; #endif #if !defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) /* * Generate public key (restartable version) * * Note: this internal function relies on its caller preserving the value of * the output parameter 'd' across continuation calls. This would not be * acceptable for a public function but is OK here as we control call sites. */ static int ecdh_gen_public_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; /* If multiplication is in progress, we already generated a privkey */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx == NULL || rs_ctx->rsm == NULL ) #endif MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, d, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, Q, d, &grp->G, f_rng, p_rng, rs_ctx ) ); cleanup: return( ret ); } /* * Generate public key */ int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDH_VALIDATE_RET( grp != NULL ); ECDH_VALIDATE_RET( d != NULL ); ECDH_VALIDATE_RET( Q != NULL ); ECDH_VALIDATE_RET( f_rng != NULL ); return( ecdh_gen_public_restartable( grp, d, Q, f_rng, p_rng, NULL ) ); } #endif /* !MBEDTLS_ECDH_GEN_PUBLIC_ALT */ #if !defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) /* * Compute shared secret (SEC1 3.3.1) */ static int ecdh_compute_shared_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *z, const mbedtls_ecp_point *Q, const mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; mbedtls_ecp_point P; mbedtls_ecp_point_init( &P ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, &P, d, Q, f_rng, p_rng, rs_ctx ) ); if( mbedtls_ecp_is_zero( &P ) ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_copy( z, &P.X ) ); cleanup: mbedtls_ecp_point_free( &P ); return( ret ); } /* * Compute shared secret (SEC1 3.3.1) */ int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z, const mbedtls_ecp_point *Q, const mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDH_VALIDATE_RET( grp != NULL ); ECDH_VALIDATE_RET( Q != NULL ); ECDH_VALIDATE_RET( d != NULL ); ECDH_VALIDATE_RET( z != NULL ); return( ecdh_compute_shared_restartable( grp, z, Q, d, f_rng, p_rng, NULL ) ); } #endif /* !MBEDTLS_ECDH_COMPUTE_SHARED_ALT */ static void ecdh_init_internal( mbedtls_ecdh_context_mbed *ctx ) { mbedtls_ecp_group_init( &ctx->grp ); mbedtls_mpi_init( &ctx->d ); mbedtls_ecp_point_init( &ctx->Q ); mbedtls_ecp_point_init( &ctx->Qp ); mbedtls_mpi_init( &ctx->z ); #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_init( &ctx->rs ); #endif } /* * Initialize context */ void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx ) { ECDH_VALIDATE( ctx != NULL ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) ecdh_init_internal( ctx ); mbedtls_ecp_point_init( &ctx->Vi ); mbedtls_ecp_point_init( &ctx->Vf ); mbedtls_mpi_init( &ctx->_d ); #else memset( ctx, 0, sizeof( mbedtls_ecdh_context ) ); ctx->var = MBEDTLS_ECDH_VARIANT_NONE; #endif ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; #if defined(MBEDTLS_ECP_RESTARTABLE) ctx->restart_enabled = 0; #endif } static int ecdh_setup_internal( mbedtls_ecdh_context_mbed *ctx, mbedtls_ecp_group_id grp_id ) { int ret; ret = mbedtls_ecp_group_load( &ctx->grp, grp_id ); if( ret != 0 ) { return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); } return( 0 ); } /* * Setup context */ int mbedtls_ecdh_setup( mbedtls_ecdh_context *ctx, mbedtls_ecp_group_id grp_id ) { ECDH_VALIDATE_RET( ctx != NULL ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_setup_internal( ctx, grp_id ) ); #else switch( grp_id ) { default: ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; ctx->var = MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0; ctx->grp_id = grp_id; ecdh_init_internal( &ctx->ctx.mbed_ecdh ); return( ecdh_setup_internal( &ctx->ctx.mbed_ecdh, grp_id ) ); } #endif } static void ecdh_free_internal( mbedtls_ecdh_context_mbed *ctx ) { mbedtls_ecp_group_free( &ctx->grp ); mbedtls_mpi_free( &ctx->d ); mbedtls_ecp_point_free( &ctx->Q ); mbedtls_ecp_point_free( &ctx->Qp ); mbedtls_mpi_free( &ctx->z ); #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_free( &ctx->rs ); #endif } #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Enable restartable operations for context */ void mbedtls_ecdh_enable_restart( mbedtls_ecdh_context *ctx ) { ECDH_VALIDATE( ctx != NULL ); ctx->restart_enabled = 1; } #endif /* * Free context */ void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) mbedtls_ecp_point_free( &ctx->Vi ); mbedtls_ecp_point_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->_d ); ecdh_free_internal( ctx ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: ecdh_free_internal( &ctx->ctx.mbed_ecdh ); break; default: break; } ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; ctx->var = MBEDTLS_ECDH_VARIANT_NONE; ctx->grp_id = MBEDTLS_ECP_DP_NONE; #endif } static int ecdh_make_params_internal( mbedtls_ecdh_context_mbed *ctx, size_t *olen, int point_format, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int restart_enabled ) { int ret; size_t grp_len, pt_len; #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx *rs_ctx = NULL; #endif if( ctx->grp.pbits == 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( restart_enabled ) rs_ctx = &ctx->rs; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( ( ret = ecdh_gen_public_restartable( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng, rs_ctx ) ) != 0 ) return( ret ); #else if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ) != 0 ) return( ret ); #endif /* MBEDTLS_ECP_RESTARTABLE */ if( ( ret = mbedtls_ecp_tls_write_group( &ctx->grp, &grp_len, buf, blen ) ) != 0 ) return( ret ); buf += grp_len; blen -= grp_len; if( ( ret = mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, point_format, &pt_len, buf, blen ) ) != 0 ) return( ret ); *olen = grp_len + pt_len; return( 0 ); } /* * Setup and write the ServerKeyExhange parameters (RFC 4492) * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int restart_enabled = 0; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( olen != NULL ); ECDH_VALIDATE_RET( buf != NULL ); ECDH_VALIDATE_RET( f_rng != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) restart_enabled = ctx->restart_enabled; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_make_params_internal( ctx, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_make_params_internal( &ctx->ctx.mbed_ecdh, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_read_params_internal( mbedtls_ecdh_context_mbed *ctx, const unsigned char **buf, const unsigned char *end ) { return( mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, buf, end - *buf ) ); } /* * Read the ServerKeyExhange parameters (RFC 4492) * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx, const unsigned char **buf, const unsigned char *end ) { int ret; mbedtls_ecp_group_id grp_id; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( buf != NULL ); ECDH_VALIDATE_RET( *buf != NULL ); ECDH_VALIDATE_RET( end != NULL ); if( ( ret = mbedtls_ecp_tls_read_group_id( &grp_id, buf, end - *buf ) ) != 0 ) return( ret ); if( ( ret = mbedtls_ecdh_setup( ctx, grp_id ) ) != 0 ) return( ret ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_read_params_internal( ctx, buf, end ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_read_params_internal( &ctx->ctx.mbed_ecdh, buf, end ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_get_params_internal( mbedtls_ecdh_context_mbed *ctx, const mbedtls_ecp_keypair *key, mbedtls_ecdh_side side ) { int ret; /* If it's not our key, just import the public part as Qp */ if( side == MBEDTLS_ECDH_THEIRS ) return( mbedtls_ecp_copy( &ctx->Qp, &key->Q ) ); /* Our key: import public (as Q) and private parts */ if( side != MBEDTLS_ECDH_OURS ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); if( ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 || ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 ) return( ret ); return( 0 ); } /* * Get parameters from a keypair */ int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key, mbedtls_ecdh_side side ) { int ret; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( key != NULL ); ECDH_VALIDATE_RET( side == MBEDTLS_ECDH_OURS || side == MBEDTLS_ECDH_THEIRS ); if( ( ret = mbedtls_ecdh_setup( ctx, key->grp.id ) ) != 0 ) return( ret ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_get_params_internal( ctx, key, side ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_get_params_internal( &ctx->ctx.mbed_ecdh, key, side ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_make_public_internal( mbedtls_ecdh_context_mbed *ctx, size_t *olen, int point_format, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int restart_enabled ) { int ret; #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx *rs_ctx = NULL; #endif if( ctx->grp.pbits == 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( restart_enabled ) rs_ctx = &ctx->rs; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( ( ret = ecdh_gen_public_restartable( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng, rs_ctx ) ) != 0 ) return( ret ); #else if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ) != 0 ) return( ret ); #endif /* MBEDTLS_ECP_RESTARTABLE */ return mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, point_format, olen, buf, blen ); } /* * Setup and export the client public value */ int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int restart_enabled = 0; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( olen != NULL ); ECDH_VALIDATE_RET( buf != NULL ); ECDH_VALIDATE_RET( f_rng != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) restart_enabled = ctx->restart_enabled; #endif #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_make_public_internal( ctx, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_make_public_internal( &ctx->ctx.mbed_ecdh, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_read_public_internal( mbedtls_ecdh_context_mbed *ctx, const unsigned char *buf, size_t blen ) { int ret; const unsigned char *p = buf; if( ( ret = mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, &p, blen ) ) != 0 ) return( ret ); if( (size_t)( p - buf ) != blen ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); return( 0 ); } /* * Parse and import the client's public value */ int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx, const unsigned char *buf, size_t blen ) { ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( buf != NULL ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_read_public_internal( ctx, buf, blen ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_read_public_internal( &ctx->ctx.mbed_ecdh, buf, blen ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_calc_secret_internal( mbedtls_ecdh_context_mbed *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int restart_enabled ) { int ret; #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx *rs_ctx = NULL; #endif if( ctx == NULL || ctx->grp.pbits == 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( restart_enabled ) rs_ctx = &ctx->rs; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( ( ret = ecdh_compute_shared_restartable( &ctx->grp, &ctx->z, &ctx->Qp, &ctx->d, f_rng, p_rng, rs_ctx ) ) != 0 ) { return( ret ); } #else if( ( ret = mbedtls_ecdh_compute_shared( &ctx->grp, &ctx->z, &ctx->Qp, &ctx->d, f_rng, p_rng ) ) != 0 ) { return( ret ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ if( mbedtls_mpi_size( &ctx->z ) > blen ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); *olen = ctx->grp.pbits / 8 + ( ( ctx->grp.pbits % 8 ) != 0 ); return mbedtls_mpi_write_binary( &ctx->z, buf, *olen ); } /* * Derive and export the shared secret */ int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int restart_enabled = 0; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( olen != NULL ); ECDH_VALIDATE_RET( buf != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) restart_enabled = ctx->restart_enabled; #endif #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_calc_secret_internal( ctx, olen, buf, blen, f_rng, p_rng, restart_enabled ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_calc_secret_internal( &ctx->ctx.mbed_ecdh, olen, buf, blen, f_rng, p_rng, restart_enabled ) ); default: return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } #endif } #endif /* MBEDTLS_ECDH_C */ fldigi-4.1.06/src/mbedtls/asn1parse.c0000664000175000017500000002237413507401434014256 00000000000000/* * Generic ASN.1 parsing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ASN1_PARSE_C) #include "mbedtls/asn1.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_BIGNUM_C) #include "mbedtls/bignum.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif /* * ASN.1 DER decoding routines */ int mbedtls_asn1_get_len( unsigned char **p, const unsigned char *end, size_t *len ) { if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( ( **p & 0x80 ) == 0 ) *len = *(*p)++; else { switch( **p & 0x7F ) { case 1: if( ( end - *p ) < 2 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = (*p)[1]; (*p) += 2; break; case 2: if( ( end - *p ) < 3 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = ( (size_t)(*p)[1] << 8 ) | (*p)[2]; (*p) += 3; break; case 3: if( ( end - *p ) < 4 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = ( (size_t)(*p)[1] << 16 ) | ( (size_t)(*p)[2] << 8 ) | (*p)[3]; (*p) += 4; break; case 4: if( ( end - *p ) < 5 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = ( (size_t)(*p)[1] << 24 ) | ( (size_t)(*p)[2] << 16 ) | ( (size_t)(*p)[3] << 8 ) | (*p)[4]; (*p) += 5; break; default: return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); } } if( *len > (size_t) ( end - *p ) ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); return( 0 ); } int mbedtls_asn1_get_tag( unsigned char **p, const unsigned char *end, size_t *len, int tag ) { if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( **p != tag ) return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); (*p)++; return( mbedtls_asn1_get_len( p, end, len ) ); } int mbedtls_asn1_get_bool( unsigned char **p, const unsigned char *end, int *val ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_BOOLEAN ) ) != 0 ) return( ret ); if( len != 1 ) return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); *val = ( **p != 0 ) ? 1 : 0; (*p)++; return( 0 ); } int mbedtls_asn1_get_int( unsigned char **p, const unsigned char *end, int *val ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( ret ); if( len == 0 || len > sizeof( int ) || ( **p & 0x80 ) != 0 ) return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); *val = 0; while( len-- > 0 ) { *val = ( *val << 8 ) | **p; (*p)++; } return( 0 ); } #if defined(MBEDTLS_BIGNUM_C) int mbedtls_asn1_get_mpi( unsigned char **p, const unsigned char *end, mbedtls_mpi *X ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( ret ); ret = mbedtls_mpi_read_binary( X, *p, len ); *p += len; return( ret ); } #endif /* MBEDTLS_BIGNUM_C */ int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, mbedtls_asn1_bitstring *bs) { int ret; /* Certificate type is a single byte bitstring */ if( ( ret = mbedtls_asn1_get_tag( p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 ) return( ret ); /* Check length, subtract one for actual bit string length */ if( bs->len < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); bs->len -= 1; /* Get number of unused bits, ensure unused bits <= 7 */ bs->unused_bits = **p; if( bs->unused_bits > 7 ) return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); (*p)++; /* Get actual bitstring */ bs->p = *p; *p += bs->len; if( *p != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Get a bit string without unused bits */ int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, size_t *len ) { int ret; if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 ) return( ret ); if( (*len)-- < 2 || *(*p)++ != 0 ) return( MBEDTLS_ERR_ASN1_INVALID_DATA ); return( 0 ); } /* * Parses and splits an ASN.1 "SEQUENCE OF " */ int mbedtls_asn1_get_sequence_of( unsigned char **p, const unsigned char *end, mbedtls_asn1_sequence *cur, int tag) { int ret; size_t len; mbedtls_asn1_buf *buf; /* Get main sequence tag */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); if( *p + len != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); while( *p < end ) { buf = &(cur->buf); buf->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &buf->len, tag ) ) != 0 ) return( ret ); buf->p = *p; *p += buf->len; /* Allocate and assign next pointer */ if( *p < end ) { cur->next = (mbedtls_asn1_sequence*)mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_ASN1_ALLOC_FAILED ); cur = cur->next; } } /* Set final sequence entry's next pointer to NULL */ cur->next = NULL; if( *p != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } int mbedtls_asn1_get_alg( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); alg->tag = **p; end = *p + len; if( ( ret = mbedtls_asn1_get_tag( p, end, &alg->len, MBEDTLS_ASN1_OID ) ) != 0 ) return( ret ); alg->p = *p; *p += alg->len; if( *p == end ) { mbedtls_platform_zeroize( params, sizeof(mbedtls_asn1_buf) ); return( 0 ); } params->tag = **p; (*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, ¶ms->len ) ) != 0 ) return( ret ); params->p = *p; *p += params->len; if( *p != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } int mbedtls_asn1_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg ) { int ret; mbedtls_asn1_buf params; memset( ¶ms, 0, sizeof(mbedtls_asn1_buf) ); if( ( ret = mbedtls_asn1_get_alg( p, end, alg, ¶ms ) ) != 0 ) return( ret ); if( ( params.tag != MBEDTLS_ASN1_NULL && params.tag != 0 ) || params.len != 0 ) return( MBEDTLS_ERR_ASN1_INVALID_DATA ); return( 0 ); } void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *cur ) { if( cur == NULL ) return; mbedtls_free( cur->oid.p ); mbedtls_free( cur->val.p ); mbedtls_platform_zeroize( cur, sizeof( mbedtls_asn1_named_data ) ); } void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ) { mbedtls_asn1_named_data *cur; while( ( cur = *head ) != NULL ) { *head = cur->next; mbedtls_asn1_free_named_data( cur ); mbedtls_free( cur ); } } mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, const char *oid, size_t len ) { while( list != NULL ) { if( list->oid.len == len && memcmp( list->oid.p, oid, len ) == 0 ) { break; } list = list->next; } return( list ); } #endif /* MBEDTLS_ASN1_PARSE_C */ fldigi-4.1.06/src/mbedtls/debug.c0000664000175000017500000003122013507401434013435 00000000000000/* * Debugging routines * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_DEBUG_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #define mbedtls_time_t time_t #define mbedtls_snprintf snprintf #endif #include "mbedtls/debug.h" #include #include #include #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #define DEBUG_BUF_SIZE 512 static int debug_threshold = 0; void mbedtls_debug_set_threshold( int threshold ) { debug_threshold = threshold; } /* * All calls to f_dbg must be made via this function */ static inline void debug_send_line( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *str ) { /* * If in a threaded environment, we need a thread identifier. * Since there is no portable way to get one, use the address of the ssl * context instead, as it shouldn't be shared between threads. */ #if defined(MBEDTLS_THREADING_C) char idstr[20 + DEBUG_BUF_SIZE]; /* 0x + 16 nibbles + ': ' */ mbedtls_snprintf( idstr, sizeof( idstr ), "%p: %s", (void*)ssl, str ); ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, idstr ); #else ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, str ); #endif } void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *format, ... ) { va_list argp; char str[DEBUG_BUF_SIZE]; int ret; if( NULL == ssl || NULL == ssl->conf || NULL == ssl->conf->f_dbg || level > debug_threshold ) return; va_start( argp, format ); #if defined(_WIN32) #if defined(_TRUNCATE) && !defined(__MINGW32__) ret = _vsnprintf_s( str, DEBUG_BUF_SIZE, _TRUNCATE, format, argp ); #else ret = _vsnprintf( str, DEBUG_BUF_SIZE, format, argp ); if( ret < 0 || (size_t) ret == DEBUG_BUF_SIZE ) { str[DEBUG_BUF_SIZE-1] = '\0'; ret = -1; } #endif #else ret = vsnprintf( str, DEBUG_BUF_SIZE, format, argp ); #endif va_end( argp ); if( ret >= 0 && ret < DEBUG_BUF_SIZE - 1 ) { str[ret] = '\n'; str[ret + 1] = '\0'; } debug_send_line( ssl, level, file, line, str ); } void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, int ret ) { char str[DEBUG_BUF_SIZE]; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) return; /* * With non-blocking I/O and examples that just retry immediately, * the logs would be quickly flooded with WANT_READ, so ignore that. * Don't ignore WANT_WRITE however, since is is usually rare. */ if( ret == MBEDTLS_ERR_SSL_WANT_READ ) return; mbedtls_snprintf( str, sizeof( str ), "%s() returned %d (-0x%04x)\n", text, ret, -ret ); debug_send_line( ssl, level, file, line, str ); } void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const unsigned char *buf, size_t len ) { char str[DEBUG_BUF_SIZE]; char txt[17]; size_t i, idx = 0; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) return; mbedtls_snprintf( str + idx, sizeof( str ) - idx, "dumping '%s' (%u bytes)\n", text, (unsigned int) len ); debug_send_line( ssl, level, file, line, str ); idx = 0; memset( txt, 0, sizeof( txt ) ); for( i = 0; i < len; i++ ) { if( i >= 4096 ) break; if( i % 16 == 0 ) { if( i > 0 ) { mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %s\n", txt ); debug_send_line( ssl, level, file, line, str ); idx = 0; memset( txt, 0, sizeof( txt ) ); } idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, "%04x: ", (unsigned int) i ); } idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %02x", (unsigned int) buf[i] ); txt[i % 16] = ( buf[i] > 31 && buf[i] < 127 ) ? buf[i] : '.' ; } if( len > 0 ) { for( /* i = i */; i % 16 != 0; i++ ) idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " " ); mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %s\n", txt ); debug_send_line( ssl, level, file, line, str ); } } #if defined(MBEDTLS_ECP_C) void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_ecp_point *X ) { char str[DEBUG_BUF_SIZE]; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) return; mbedtls_snprintf( str, sizeof( str ), "%s(X)", text ); mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->X ); mbedtls_snprintf( str, sizeof( str ), "%s(Y)", text ); mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->Y ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_BIGNUM_C) void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_mpi *X ) { char str[DEBUG_BUF_SIZE]; int j, k, zeros = 1; size_t i, n, idx = 0; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || X == NULL || level > debug_threshold ) return; for( n = X->n - 1; n > 0; n-- ) if( X->p[n] != 0 ) break; for( j = ( sizeof(mbedtls_mpi_uint) << 3 ) - 1; j >= 0; j-- ) if( ( ( X->p[n] >> j ) & 1 ) != 0 ) break; mbedtls_snprintf( str + idx, sizeof( str ) - idx, "value of '%s' (%d bits) is:\n", text, (int) ( ( n * ( sizeof(mbedtls_mpi_uint) << 3 ) ) + j + 1 ) ); debug_send_line( ssl, level, file, line, str ); idx = 0; for( i = n + 1, j = 0; i > 0; i-- ) { if( zeros && X->p[i - 1] == 0 ) continue; for( k = sizeof( mbedtls_mpi_uint ) - 1; k >= 0; k-- ) { if( zeros && ( ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF ) == 0 ) continue; else zeros = 0; if( j % 16 == 0 ) { if( j > 0 ) { mbedtls_snprintf( str + idx, sizeof( str ) - idx, "\n" ); debug_send_line( ssl, level, file, line, str ); idx = 0; } } idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %02x", (unsigned int) ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF ); j++; } } if( zeros == 1 ) idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " 00" ); mbedtls_snprintf( str + idx, sizeof( str ) - idx, "\n" ); debug_send_line( ssl, level, file, line, str ); } #endif /* MBEDTLS_BIGNUM_C */ #if defined(MBEDTLS_X509_CRT_PARSE_C) static void debug_print_pk( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_pk_context *pk ) { size_t i; mbedtls_pk_debug_item items[MBEDTLS_PK_DEBUG_MAX_ITEMS]; char name[16]; memset( items, 0, sizeof( items ) ); if( mbedtls_pk_debug( pk, items ) != 0 ) { debug_send_line( ssl, level, file, line, "invalid PK context\n" ); return; } for( i = 0; i < MBEDTLS_PK_DEBUG_MAX_ITEMS; i++ ) { if( items[i].type == MBEDTLS_PK_DEBUG_NONE ) return; mbedtls_snprintf( name, sizeof( name ), "%s%s", text, items[i].name ); name[sizeof( name ) - 1] = '\0'; if( items[i].type == MBEDTLS_PK_DEBUG_MPI ) mbedtls_debug_print_mpi( ssl, level, file, line, name, items[i].value ); else #if defined(MBEDTLS_ECP_C) if( items[i].type == MBEDTLS_PK_DEBUG_ECP ) mbedtls_debug_print_ecp( ssl, level, file, line, name, items[i].value ); else #endif debug_send_line( ssl, level, file, line, "should not happen\n" ); } } static void debug_print_line_by_line( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text ) { char str[DEBUG_BUF_SIZE]; const char *start, *cur; start = text; for( cur = text; *cur != '\0'; cur++ ) { if( *cur == '\n' ) { size_t len = cur - start + 1; if( len > DEBUG_BUF_SIZE - 1 ) len = DEBUG_BUF_SIZE - 1; memcpy( str, start, len ); str[len] = '\0'; debug_send_line( ssl, level, file, line, str ); start = cur + 1; } } } void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_x509_crt *crt ) { char str[DEBUG_BUF_SIZE]; int i = 0; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || crt == NULL || level > debug_threshold ) return; while( crt != NULL ) { char buf[1024]; mbedtls_snprintf( str, sizeof( str ), "%s #%d:\n", text, ++i ); debug_send_line( ssl, level, file, line, str ); mbedtls_x509_crt_info( buf, sizeof( buf ) - 1, "", crt ); debug_print_line_by_line( ssl, level, file, line, buf ); debug_print_pk( ssl, level, file, line, "crt->", &crt->pk ); crt = crt->next; } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_ECDH_C) static void mbedtls_debug_printf_ecdh_internal( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const mbedtls_ecdh_context *ecdh, mbedtls_debug_ecdh_attr attr ) { #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) const mbedtls_ecdh_context* ctx = ecdh; #else const mbedtls_ecdh_context_mbed* ctx = &ecdh->ctx.mbed_ecdh; #endif switch( attr ) { case MBEDTLS_DEBUG_ECDH_Q: mbedtls_debug_print_ecp( ssl, level, file, line, "ECDH: Q", &ctx->Q ); break; case MBEDTLS_DEBUG_ECDH_QP: mbedtls_debug_print_ecp( ssl, level, file, line, "ECDH: Qp", &ctx->Qp ); break; case MBEDTLS_DEBUG_ECDH_Z: mbedtls_debug_print_mpi( ssl, level, file, line, "ECDH: z", &ctx->z ); break; default: break; } } void mbedtls_debug_printf_ecdh( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const mbedtls_ecdh_context *ecdh, mbedtls_debug_ecdh_attr attr ) { #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) mbedtls_debug_printf_ecdh_internal( ssl, level, file, line, ecdh, attr ); #else switch( ecdh->var ) { default: mbedtls_debug_printf_ecdh_internal( ssl, level, file, line, ecdh, attr ); } #endif } #endif /* MBEDTLS_ECDH_C */ #endif /* MBEDTLS_DEBUG_C */ fldigi-4.1.06/src/mbedtls/ecp_curves.c0000664000175000017500000016077713507401434014531 00000000000000/* * Elliptic curves over GF(p): curve-specific data and functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_ECP_ALT) /* Parameter validation macros based on platform_util.h */ #define ECP_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECP_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* * Conversion macros for embedded constants: * build lists of mbedtls_mpi_uint's from lists of unsigned char's grouped by 8, 4 or 2 */ #if defined(MBEDTLS_HAVE_INT32) #define BYTES_TO_T_UINT_4( a, b, c, d ) \ ( (mbedtls_mpi_uint) a << 0 ) | \ ( (mbedtls_mpi_uint) b << 8 ) | \ ( (mbedtls_mpi_uint) c << 16 ) | \ ( (mbedtls_mpi_uint) d << 24 ) #define BYTES_TO_T_UINT_2( a, b ) \ BYTES_TO_T_UINT_4( a, b, 0, 0 ) #define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \ BYTES_TO_T_UINT_4( a, b, c, d ), \ BYTES_TO_T_UINT_4( e, f, g, h ) #else /* 64-bits */ #define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \ ( (mbedtls_mpi_uint) a << 0 ) | \ ( (mbedtls_mpi_uint) b << 8 ) | \ ( (mbedtls_mpi_uint) c << 16 ) | \ ( (mbedtls_mpi_uint) d << 24 ) | \ ( (mbedtls_mpi_uint) e << 32 ) | \ ( (mbedtls_mpi_uint) f << 40 ) | \ ( (mbedtls_mpi_uint) g << 48 ) | \ ( (mbedtls_mpi_uint) h << 56 ) #define BYTES_TO_T_UINT_4( a, b, c, d ) \ BYTES_TO_T_UINT_8( a, b, c, d, 0, 0, 0, 0 ) #define BYTES_TO_T_UINT_2( a, b ) \ BYTES_TO_T_UINT_8( a, b, 0, 0, 0, 0, 0, 0 ) #endif /* bits in mbedtls_mpi_uint */ /* * Note: the constants are in little-endian order * to be directly usable in MPIs */ /* * Domain parameters for secp192r1 */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) static const mbedtls_mpi_uint secp192r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp192r1_b[] = { BYTES_TO_T_UINT_8( 0xB1, 0xB9, 0x46, 0xC1, 0xEC, 0xDE, 0xB8, 0xFE ), BYTES_TO_T_UINT_8( 0x49, 0x30, 0x24, 0x72, 0xAB, 0xE9, 0xA7, 0x0F ), BYTES_TO_T_UINT_8( 0xE7, 0x80, 0x9C, 0xE5, 0x19, 0x05, 0x21, 0x64 ), }; static const mbedtls_mpi_uint secp192r1_gx[] = { BYTES_TO_T_UINT_8( 0x12, 0x10, 0xFF, 0x82, 0xFD, 0x0A, 0xFF, 0xF4 ), BYTES_TO_T_UINT_8( 0x00, 0x88, 0xA1, 0x43, 0xEB, 0x20, 0xBF, 0x7C ), BYTES_TO_T_UINT_8( 0xF6, 0x90, 0x30, 0xB0, 0x0E, 0xA8, 0x8D, 0x18 ), }; static const mbedtls_mpi_uint secp192r1_gy[] = { BYTES_TO_T_UINT_8( 0x11, 0x48, 0x79, 0x1E, 0xA1, 0x77, 0xF9, 0x73 ), BYTES_TO_T_UINT_8( 0xD5, 0xCD, 0x24, 0x6B, 0xED, 0x11, 0x10, 0x63 ), BYTES_TO_T_UINT_8( 0x78, 0xDA, 0xC8, 0xFF, 0x95, 0x2B, 0x19, 0x07 ), }; static const mbedtls_mpi_uint secp192r1_n[] = { BYTES_TO_T_UINT_8( 0x31, 0x28, 0xD2, 0xB4, 0xB1, 0xC9, 0x6B, 0x14 ), BYTES_TO_T_UINT_8( 0x36, 0xF8, 0xDE, 0x99, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ /* * Domain parameters for secp224r1 */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) static const mbedtls_mpi_uint secp224r1_p[] = { BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp224r1_b[] = { BYTES_TO_T_UINT_8( 0xB4, 0xFF, 0x55, 0x23, 0x43, 0x39, 0x0B, 0x27 ), BYTES_TO_T_UINT_8( 0xBA, 0xD8, 0xBF, 0xD7, 0xB7, 0xB0, 0x44, 0x50 ), BYTES_TO_T_UINT_8( 0x56, 0x32, 0x41, 0xF5, 0xAB, 0xB3, 0x04, 0x0C ), BYTES_TO_T_UINT_4( 0x85, 0x0A, 0x05, 0xB4 ), }; static const mbedtls_mpi_uint secp224r1_gx[] = { BYTES_TO_T_UINT_8( 0x21, 0x1D, 0x5C, 0x11, 0xD6, 0x80, 0x32, 0x34 ), BYTES_TO_T_UINT_8( 0x22, 0x11, 0xC2, 0x56, 0xD3, 0xC1, 0x03, 0x4A ), BYTES_TO_T_UINT_8( 0xB9, 0x90, 0x13, 0x32, 0x7F, 0xBF, 0xB4, 0x6B ), BYTES_TO_T_UINT_4( 0xBD, 0x0C, 0x0E, 0xB7 ), }; static const mbedtls_mpi_uint secp224r1_gy[] = { BYTES_TO_T_UINT_8( 0x34, 0x7E, 0x00, 0x85, 0x99, 0x81, 0xD5, 0x44 ), BYTES_TO_T_UINT_8( 0x64, 0x47, 0x07, 0x5A, 0xA0, 0x75, 0x43, 0xCD ), BYTES_TO_T_UINT_8( 0xE6, 0xDF, 0x22, 0x4C, 0xFB, 0x23, 0xF7, 0xB5 ), BYTES_TO_T_UINT_4( 0x88, 0x63, 0x37, 0xBD ), }; static const mbedtls_mpi_uint secp224r1_n[] = { BYTES_TO_T_UINT_8( 0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13 ), BYTES_TO_T_UINT_8( 0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ /* * Domain parameters for secp256r1 */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) static const mbedtls_mpi_uint secp256r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp256r1_b[] = { BYTES_TO_T_UINT_8( 0x4B, 0x60, 0xD2, 0x27, 0x3E, 0x3C, 0xCE, 0x3B ), BYTES_TO_T_UINT_8( 0xF6, 0xB0, 0x53, 0xCC, 0xB0, 0x06, 0x1D, 0x65 ), BYTES_TO_T_UINT_8( 0xBC, 0x86, 0x98, 0x76, 0x55, 0xBD, 0xEB, 0xB3 ), BYTES_TO_T_UINT_8( 0xE7, 0x93, 0x3A, 0xAA, 0xD8, 0x35, 0xC6, 0x5A ), }; static const mbedtls_mpi_uint secp256r1_gx[] = { BYTES_TO_T_UINT_8( 0x96, 0xC2, 0x98, 0xD8, 0x45, 0x39, 0xA1, 0xF4 ), BYTES_TO_T_UINT_8( 0xA0, 0x33, 0xEB, 0x2D, 0x81, 0x7D, 0x03, 0x77 ), BYTES_TO_T_UINT_8( 0xF2, 0x40, 0xA4, 0x63, 0xE5, 0xE6, 0xBC, 0xF8 ), BYTES_TO_T_UINT_8( 0x47, 0x42, 0x2C, 0xE1, 0xF2, 0xD1, 0x17, 0x6B ), }; static const mbedtls_mpi_uint secp256r1_gy[] = { BYTES_TO_T_UINT_8( 0xF5, 0x51, 0xBF, 0x37, 0x68, 0x40, 0xB6, 0xCB ), BYTES_TO_T_UINT_8( 0xCE, 0x5E, 0x31, 0x6B, 0x57, 0x33, 0xCE, 0x2B ), BYTES_TO_T_UINT_8( 0x16, 0x9E, 0x0F, 0x7C, 0x4A, 0xEB, 0xE7, 0x8E ), BYTES_TO_T_UINT_8( 0x9B, 0x7F, 0x1A, 0xFE, 0xE2, 0x42, 0xE3, 0x4F ), }; static const mbedtls_mpi_uint secp256r1_n[] = { BYTES_TO_T_UINT_8( 0x51, 0x25, 0x63, 0xFC, 0xC2, 0xCA, 0xB9, 0xF3 ), BYTES_TO_T_UINT_8( 0x84, 0x9E, 0x17, 0xA7, 0xAD, 0xFA, 0xE6, 0xBC ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ /* * Domain parameters for secp384r1 */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) static const mbedtls_mpi_uint secp384r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp384r1_b[] = { BYTES_TO_T_UINT_8( 0xEF, 0x2A, 0xEC, 0xD3, 0xED, 0xC8, 0x85, 0x2A ), BYTES_TO_T_UINT_8( 0x9D, 0xD1, 0x2E, 0x8A, 0x8D, 0x39, 0x56, 0xC6 ), BYTES_TO_T_UINT_8( 0x5A, 0x87, 0x13, 0x50, 0x8F, 0x08, 0x14, 0x03 ), BYTES_TO_T_UINT_8( 0x12, 0x41, 0x81, 0xFE, 0x6E, 0x9C, 0x1D, 0x18 ), BYTES_TO_T_UINT_8( 0x19, 0x2D, 0xF8, 0xE3, 0x6B, 0x05, 0x8E, 0x98 ), BYTES_TO_T_UINT_8( 0xE4, 0xE7, 0x3E, 0xE2, 0xA7, 0x2F, 0x31, 0xB3 ), }; static const mbedtls_mpi_uint secp384r1_gx[] = { BYTES_TO_T_UINT_8( 0xB7, 0x0A, 0x76, 0x72, 0x38, 0x5E, 0x54, 0x3A ), BYTES_TO_T_UINT_8( 0x6C, 0x29, 0x55, 0xBF, 0x5D, 0xF2, 0x02, 0x55 ), BYTES_TO_T_UINT_8( 0x38, 0x2A, 0x54, 0x82, 0xE0, 0x41, 0xF7, 0x59 ), BYTES_TO_T_UINT_8( 0x98, 0x9B, 0xA7, 0x8B, 0x62, 0x3B, 0x1D, 0x6E ), BYTES_TO_T_UINT_8( 0x74, 0xAD, 0x20, 0xF3, 0x1E, 0xC7, 0xB1, 0x8E ), BYTES_TO_T_UINT_8( 0x37, 0x05, 0x8B, 0xBE, 0x22, 0xCA, 0x87, 0xAA ), }; static const mbedtls_mpi_uint secp384r1_gy[] = { BYTES_TO_T_UINT_8( 0x5F, 0x0E, 0xEA, 0x90, 0x7C, 0x1D, 0x43, 0x7A ), BYTES_TO_T_UINT_8( 0x9D, 0x81, 0x7E, 0x1D, 0xCE, 0xB1, 0x60, 0x0A ), BYTES_TO_T_UINT_8( 0xC0, 0xB8, 0xF0, 0xB5, 0x13, 0x31, 0xDA, 0xE9 ), BYTES_TO_T_UINT_8( 0x7C, 0x14, 0x9A, 0x28, 0xBD, 0x1D, 0xF4, 0xF8 ), BYTES_TO_T_UINT_8( 0x29, 0xDC, 0x92, 0x92, 0xBF, 0x98, 0x9E, 0x5D ), BYTES_TO_T_UINT_8( 0x6F, 0x2C, 0x26, 0x96, 0x4A, 0xDE, 0x17, 0x36 ), }; static const mbedtls_mpi_uint secp384r1_n[] = { BYTES_TO_T_UINT_8( 0x73, 0x29, 0xC5, 0xCC, 0x6A, 0x19, 0xEC, 0xEC ), BYTES_TO_T_UINT_8( 0x7A, 0xA7, 0xB0, 0x48, 0xB2, 0x0D, 0x1A, 0x58 ), BYTES_TO_T_UINT_8( 0xDF, 0x2D, 0x37, 0xF4, 0x81, 0x4D, 0x63, 0xC7 ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ /* * Domain parameters for secp521r1 */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) static const mbedtls_mpi_uint secp521r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_2( 0xFF, 0x01 ), }; static const mbedtls_mpi_uint secp521r1_b[] = { BYTES_TO_T_UINT_8( 0x00, 0x3F, 0x50, 0x6B, 0xD4, 0x1F, 0x45, 0xEF ), BYTES_TO_T_UINT_8( 0xF1, 0x34, 0x2C, 0x3D, 0x88, 0xDF, 0x73, 0x35 ), BYTES_TO_T_UINT_8( 0x07, 0xBF, 0xB1, 0x3B, 0xBD, 0xC0, 0x52, 0x16 ), BYTES_TO_T_UINT_8( 0x7B, 0x93, 0x7E, 0xEC, 0x51, 0x39, 0x19, 0x56 ), BYTES_TO_T_UINT_8( 0xE1, 0x09, 0xF1, 0x8E, 0x91, 0x89, 0xB4, 0xB8 ), BYTES_TO_T_UINT_8( 0xF3, 0x15, 0xB3, 0x99, 0x5B, 0x72, 0xDA, 0xA2 ), BYTES_TO_T_UINT_8( 0xEE, 0x40, 0x85, 0xB6, 0xA0, 0x21, 0x9A, 0x92 ), BYTES_TO_T_UINT_8( 0x1F, 0x9A, 0x1C, 0x8E, 0x61, 0xB9, 0x3E, 0x95 ), BYTES_TO_T_UINT_2( 0x51, 0x00 ), }; static const mbedtls_mpi_uint secp521r1_gx[] = { BYTES_TO_T_UINT_8( 0x66, 0xBD, 0xE5, 0xC2, 0x31, 0x7E, 0x7E, 0xF9 ), BYTES_TO_T_UINT_8( 0x9B, 0x42, 0x6A, 0x85, 0xC1, 0xB3, 0x48, 0x33 ), BYTES_TO_T_UINT_8( 0xDE, 0xA8, 0xFF, 0xA2, 0x27, 0xC1, 0x1D, 0xFE ), BYTES_TO_T_UINT_8( 0x28, 0x59, 0xE7, 0xEF, 0x77, 0x5E, 0x4B, 0xA1 ), BYTES_TO_T_UINT_8( 0xBA, 0x3D, 0x4D, 0x6B, 0x60, 0xAF, 0x28, 0xF8 ), BYTES_TO_T_UINT_8( 0x21, 0xB5, 0x3F, 0x05, 0x39, 0x81, 0x64, 0x9C ), BYTES_TO_T_UINT_8( 0x42, 0xB4, 0x95, 0x23, 0x66, 0xCB, 0x3E, 0x9E ), BYTES_TO_T_UINT_8( 0xCD, 0xE9, 0x04, 0x04, 0xB7, 0x06, 0x8E, 0x85 ), BYTES_TO_T_UINT_2( 0xC6, 0x00 ), }; static const mbedtls_mpi_uint secp521r1_gy[] = { BYTES_TO_T_UINT_8( 0x50, 0x66, 0xD1, 0x9F, 0x76, 0x94, 0xBE, 0x88 ), BYTES_TO_T_UINT_8( 0x40, 0xC2, 0x72, 0xA2, 0x86, 0x70, 0x3C, 0x35 ), BYTES_TO_T_UINT_8( 0x61, 0x07, 0xAD, 0x3F, 0x01, 0xB9, 0x50, 0xC5 ), BYTES_TO_T_UINT_8( 0x40, 0x26, 0xF4, 0x5E, 0x99, 0x72, 0xEE, 0x97 ), BYTES_TO_T_UINT_8( 0x2C, 0x66, 0x3E, 0x27, 0x17, 0xBD, 0xAF, 0x17 ), BYTES_TO_T_UINT_8( 0x68, 0x44, 0x9B, 0x57, 0x49, 0x44, 0xF5, 0x98 ), BYTES_TO_T_UINT_8( 0xD9, 0x1B, 0x7D, 0x2C, 0xB4, 0x5F, 0x8A, 0x5C ), BYTES_TO_T_UINT_8( 0x04, 0xC0, 0x3B, 0x9A, 0x78, 0x6A, 0x29, 0x39 ), BYTES_TO_T_UINT_2( 0x18, 0x01 ), }; static const mbedtls_mpi_uint secp521r1_n[] = { BYTES_TO_T_UINT_8( 0x09, 0x64, 0x38, 0x91, 0x1E, 0xB7, 0x6F, 0xBB ), BYTES_TO_T_UINT_8( 0xAE, 0x47, 0x9C, 0x89, 0xB8, 0xC9, 0xB5, 0x3B ), BYTES_TO_T_UINT_8( 0xD0, 0xA5, 0x09, 0xF7, 0x48, 0x01, 0xCC, 0x7F ), BYTES_TO_T_UINT_8( 0x6B, 0x96, 0x2F, 0xBF, 0x83, 0x87, 0x86, 0x51 ), BYTES_TO_T_UINT_8( 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_2( 0xFF, 0x01 ), }; #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) static const mbedtls_mpi_uint secp192k1_p[] = { BYTES_TO_T_UINT_8( 0x37, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp192k1_a[] = { BYTES_TO_T_UINT_2( 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp192k1_b[] = { BYTES_TO_T_UINT_2( 0x03, 0x00 ), }; static const mbedtls_mpi_uint secp192k1_gx[] = { BYTES_TO_T_UINT_8( 0x7D, 0x6C, 0xE0, 0xEA, 0xB1, 0xD1, 0xA5, 0x1D ), BYTES_TO_T_UINT_8( 0x34, 0xF4, 0xB7, 0x80, 0x02, 0x7D, 0xB0, 0x26 ), BYTES_TO_T_UINT_8( 0xAE, 0xE9, 0x57, 0xC0, 0x0E, 0xF1, 0x4F, 0xDB ), }; static const mbedtls_mpi_uint secp192k1_gy[] = { BYTES_TO_T_UINT_8( 0x9D, 0x2F, 0x5E, 0xD9, 0x88, 0xAA, 0x82, 0x40 ), BYTES_TO_T_UINT_8( 0x34, 0x86, 0xBE, 0x15, 0xD0, 0x63, 0x41, 0x84 ), BYTES_TO_T_UINT_8( 0xA7, 0x28, 0x56, 0x9C, 0x6D, 0x2F, 0x2F, 0x9B ), }; static const mbedtls_mpi_uint secp192k1_n[] = { BYTES_TO_T_UINT_8( 0x8D, 0xFD, 0xDE, 0x74, 0x6A, 0x46, 0x69, 0x0F ), BYTES_TO_T_UINT_8( 0x17, 0xFC, 0xF2, 0x26, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) static const mbedtls_mpi_uint secp224k1_p[] = { BYTES_TO_T_UINT_8( 0x6D, 0xE5, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp224k1_a[] = { BYTES_TO_T_UINT_2( 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp224k1_b[] = { BYTES_TO_T_UINT_2( 0x05, 0x00 ), }; static const mbedtls_mpi_uint secp224k1_gx[] = { BYTES_TO_T_UINT_8( 0x5C, 0xA4, 0xB7, 0xB6, 0x0E, 0x65, 0x7E, 0x0F ), BYTES_TO_T_UINT_8( 0xA9, 0x75, 0x70, 0xE4, 0xE9, 0x67, 0xA4, 0x69 ), BYTES_TO_T_UINT_8( 0xA1, 0x28, 0xFC, 0x30, 0xDF, 0x99, 0xF0, 0x4D ), BYTES_TO_T_UINT_4( 0x33, 0x5B, 0x45, 0xA1 ), }; static const mbedtls_mpi_uint secp224k1_gy[] = { BYTES_TO_T_UINT_8( 0xA5, 0x61, 0x6D, 0x55, 0xDB, 0x4B, 0xCA, 0xE2 ), BYTES_TO_T_UINT_8( 0x59, 0xBD, 0xB0, 0xC0, 0xF7, 0x19, 0xE3, 0xF7 ), BYTES_TO_T_UINT_8( 0xD6, 0xFB, 0xCA, 0x82, 0x42, 0x34, 0xBA, 0x7F ), BYTES_TO_T_UINT_4( 0xED, 0x9F, 0x08, 0x7E ), }; static const mbedtls_mpi_uint secp224k1_n[] = { BYTES_TO_T_UINT_8( 0xF7, 0xB1, 0x9F, 0x76, 0x71, 0xA9, 0xF0, 0xCA ), BYTES_TO_T_UINT_8( 0x84, 0x61, 0xEC, 0xD2, 0xE8, 0xDC, 0x01, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ), }; #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) static const mbedtls_mpi_uint secp256k1_p[] = { BYTES_TO_T_UINT_8( 0x2F, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp256k1_a[] = { BYTES_TO_T_UINT_2( 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp256k1_b[] = { BYTES_TO_T_UINT_2( 0x07, 0x00 ), }; static const mbedtls_mpi_uint secp256k1_gx[] = { BYTES_TO_T_UINT_8( 0x98, 0x17, 0xF8, 0x16, 0x5B, 0x81, 0xF2, 0x59 ), BYTES_TO_T_UINT_8( 0xD9, 0x28, 0xCE, 0x2D, 0xDB, 0xFC, 0x9B, 0x02 ), BYTES_TO_T_UINT_8( 0x07, 0x0B, 0x87, 0xCE, 0x95, 0x62, 0xA0, 0x55 ), BYTES_TO_T_UINT_8( 0xAC, 0xBB, 0xDC, 0xF9, 0x7E, 0x66, 0xBE, 0x79 ), }; static const mbedtls_mpi_uint secp256k1_gy[] = { BYTES_TO_T_UINT_8( 0xB8, 0xD4, 0x10, 0xFB, 0x8F, 0xD0, 0x47, 0x9C ), BYTES_TO_T_UINT_8( 0x19, 0x54, 0x85, 0xA6, 0x48, 0xB4, 0x17, 0xFD ), BYTES_TO_T_UINT_8( 0xA8, 0x08, 0x11, 0x0E, 0xFC, 0xFB, 0xA4, 0x5D ), BYTES_TO_T_UINT_8( 0x65, 0xC4, 0xA3, 0x26, 0x77, 0xDA, 0x3A, 0x48 ), }; static const mbedtls_mpi_uint secp256k1_n[] = { BYTES_TO_T_UINT_8( 0x41, 0x41, 0x36, 0xD0, 0x8C, 0x5E, 0xD2, 0xBF ), BYTES_TO_T_UINT_8( 0x3B, 0xA0, 0x48, 0xAF, 0xE6, 0xDC, 0xAE, 0xBA ), BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ /* * Domain parameters for brainpoolP256r1 (RFC 5639 3.4) */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) static const mbedtls_mpi_uint brainpoolP256r1_p[] = { BYTES_TO_T_UINT_8( 0x77, 0x53, 0x6E, 0x1F, 0x1D, 0x48, 0x13, 0x20 ), BYTES_TO_T_UINT_8( 0x28, 0x20, 0x26, 0xD5, 0x23, 0xF6, 0x3B, 0x6E ), BYTES_TO_T_UINT_8( 0x72, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ), BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ), }; static const mbedtls_mpi_uint brainpoolP256r1_a[] = { BYTES_TO_T_UINT_8( 0xD9, 0xB5, 0x30, 0xF3, 0x44, 0x4B, 0x4A, 0xE9 ), BYTES_TO_T_UINT_8( 0x6C, 0x5C, 0xDC, 0x26, 0xC1, 0x55, 0x80, 0xFB ), BYTES_TO_T_UINT_8( 0xE7, 0xFF, 0x7A, 0x41, 0x30, 0x75, 0xF6, 0xEE ), BYTES_TO_T_UINT_8( 0x57, 0x30, 0x2C, 0xFC, 0x75, 0x09, 0x5A, 0x7D ), }; static const mbedtls_mpi_uint brainpoolP256r1_b[] = { BYTES_TO_T_UINT_8( 0xB6, 0x07, 0x8C, 0xFF, 0x18, 0xDC, 0xCC, 0x6B ), BYTES_TO_T_UINT_8( 0xCE, 0xE1, 0xF7, 0x5C, 0x29, 0x16, 0x84, 0x95 ), BYTES_TO_T_UINT_8( 0xBF, 0x7C, 0xD7, 0xBB, 0xD9, 0xB5, 0x30, 0xF3 ), BYTES_TO_T_UINT_8( 0x44, 0x4B, 0x4A, 0xE9, 0x6C, 0x5C, 0xDC, 0x26 ), }; static const mbedtls_mpi_uint brainpoolP256r1_gx[] = { BYTES_TO_T_UINT_8( 0x62, 0x32, 0xCE, 0x9A, 0xBD, 0x53, 0x44, 0x3A ), BYTES_TO_T_UINT_8( 0xC2, 0x23, 0xBD, 0xE3, 0xE1, 0x27, 0xDE, 0xB9 ), BYTES_TO_T_UINT_8( 0xAF, 0xB7, 0x81, 0xFC, 0x2F, 0x48, 0x4B, 0x2C ), BYTES_TO_T_UINT_8( 0xCB, 0x57, 0x7E, 0xCB, 0xB9, 0xAE, 0xD2, 0x8B ), }; static const mbedtls_mpi_uint brainpoolP256r1_gy[] = { BYTES_TO_T_UINT_8( 0x97, 0x69, 0x04, 0x2F, 0xC7, 0x54, 0x1D, 0x5C ), BYTES_TO_T_UINT_8( 0x54, 0x8E, 0xED, 0x2D, 0x13, 0x45, 0x77, 0xC2 ), BYTES_TO_T_UINT_8( 0xC9, 0x1D, 0x61, 0x14, 0x1A, 0x46, 0xF8, 0x97 ), BYTES_TO_T_UINT_8( 0xFD, 0xC4, 0xDA, 0xC3, 0x35, 0xF8, 0x7E, 0x54 ), }; static const mbedtls_mpi_uint brainpoolP256r1_n[] = { BYTES_TO_T_UINT_8( 0xA7, 0x56, 0x48, 0x97, 0x82, 0x0E, 0x1E, 0x90 ), BYTES_TO_T_UINT_8( 0xF7, 0xA6, 0x61, 0xB5, 0xA3, 0x7A, 0x39, 0x8C ), BYTES_TO_T_UINT_8( 0x71, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ), BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ), }; #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ /* * Domain parameters for brainpoolP384r1 (RFC 5639 3.6) */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) static const mbedtls_mpi_uint brainpoolP384r1_p[] = { BYTES_TO_T_UINT_8( 0x53, 0xEC, 0x07, 0x31, 0x13, 0x00, 0x47, 0x87 ), BYTES_TO_T_UINT_8( 0x71, 0x1A, 0x1D, 0x90, 0x29, 0xA7, 0xD3, 0xAC ), BYTES_TO_T_UINT_8( 0x23, 0x11, 0xB7, 0x7F, 0x19, 0xDA, 0xB1, 0x12 ), BYTES_TO_T_UINT_8( 0xB4, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ), BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ), BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ), }; static const mbedtls_mpi_uint brainpoolP384r1_a[] = { BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ), BYTES_TO_T_UINT_8( 0xEB, 0xD4, 0x3A, 0x50, 0x4A, 0x81, 0xA5, 0x8A ), BYTES_TO_T_UINT_8( 0x0F, 0xF9, 0x91, 0xBA, 0xEF, 0x65, 0x91, 0x13 ), BYTES_TO_T_UINT_8( 0x87, 0x27, 0xB2, 0x4F, 0x8E, 0xA2, 0xBE, 0xC2 ), BYTES_TO_T_UINT_8( 0xA0, 0xAF, 0x05, 0xCE, 0x0A, 0x08, 0x72, 0x3C ), BYTES_TO_T_UINT_8( 0x0C, 0x15, 0x8C, 0x3D, 0xC6, 0x82, 0xC3, 0x7B ), }; static const mbedtls_mpi_uint brainpoolP384r1_b[] = { BYTES_TO_T_UINT_8( 0x11, 0x4C, 0x50, 0xFA, 0x96, 0x86, 0xB7, 0x3A ), BYTES_TO_T_UINT_8( 0x94, 0xC9, 0xDB, 0x95, 0x02, 0x39, 0xB4, 0x7C ), BYTES_TO_T_UINT_8( 0xD5, 0x62, 0xEB, 0x3E, 0xA5, 0x0E, 0x88, 0x2E ), BYTES_TO_T_UINT_8( 0xA6, 0xD2, 0xDC, 0x07, 0xE1, 0x7D, 0xB7, 0x2F ), BYTES_TO_T_UINT_8( 0x7C, 0x44, 0xF0, 0x16, 0x54, 0xB5, 0x39, 0x8B ), BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ), }; static const mbedtls_mpi_uint brainpoolP384r1_gx[] = { BYTES_TO_T_UINT_8( 0x1E, 0xAF, 0xD4, 0x47, 0xE2, 0xB2, 0x87, 0xEF ), BYTES_TO_T_UINT_8( 0xAA, 0x46, 0xD6, 0x36, 0x34, 0xE0, 0x26, 0xE8 ), BYTES_TO_T_UINT_8( 0xE8, 0x10, 0xBD, 0x0C, 0xFE, 0xCA, 0x7F, 0xDB ), BYTES_TO_T_UINT_8( 0xE3, 0x4F, 0xF1, 0x7E, 0xE7, 0xA3, 0x47, 0x88 ), BYTES_TO_T_UINT_8( 0x6B, 0x3F, 0xC1, 0xB7, 0x81, 0x3A, 0xA6, 0xA2 ), BYTES_TO_T_UINT_8( 0xFF, 0x45, 0xCF, 0x68, 0xF0, 0x64, 0x1C, 0x1D ), }; static const mbedtls_mpi_uint brainpoolP384r1_gy[] = { BYTES_TO_T_UINT_8( 0x15, 0x53, 0x3C, 0x26, 0x41, 0x03, 0x82, 0x42 ), BYTES_TO_T_UINT_8( 0x11, 0x81, 0x91, 0x77, 0x21, 0x46, 0x46, 0x0E ), BYTES_TO_T_UINT_8( 0x28, 0x29, 0x91, 0xF9, 0x4F, 0x05, 0x9C, 0xE1 ), BYTES_TO_T_UINT_8( 0x64, 0x58, 0xEC, 0xFE, 0x29, 0x0B, 0xB7, 0x62 ), BYTES_TO_T_UINT_8( 0x52, 0xD5, 0xCF, 0x95, 0x8E, 0xEB, 0xB1, 0x5C ), BYTES_TO_T_UINT_8( 0xA4, 0xC2, 0xF9, 0x20, 0x75, 0x1D, 0xBE, 0x8A ), }; static const mbedtls_mpi_uint brainpoolP384r1_n[] = { BYTES_TO_T_UINT_8( 0x65, 0x65, 0x04, 0xE9, 0x02, 0x32, 0x88, 0x3B ), BYTES_TO_T_UINT_8( 0x10, 0xC3, 0x7F, 0x6B, 0xAF, 0xB6, 0x3A, 0xCF ), BYTES_TO_T_UINT_8( 0xA7, 0x25, 0x04, 0xAC, 0x6C, 0x6E, 0x16, 0x1F ), BYTES_TO_T_UINT_8( 0xB3, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ), BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ), BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ), }; #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ /* * Domain parameters for brainpoolP512r1 (RFC 5639 3.7) */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) static const mbedtls_mpi_uint brainpoolP512r1_p[] = { BYTES_TO_T_UINT_8( 0xF3, 0x48, 0x3A, 0x58, 0x56, 0x60, 0xAA, 0x28 ), BYTES_TO_T_UINT_8( 0x85, 0xC6, 0x82, 0x2D, 0x2F, 0xFF, 0x81, 0x28 ), BYTES_TO_T_UINT_8( 0xE6, 0x80, 0xA3, 0xE6, 0x2A, 0xA1, 0xCD, 0xAE ), BYTES_TO_T_UINT_8( 0x42, 0x68, 0xC6, 0x9B, 0x00, 0x9B, 0x4D, 0x7D ), BYTES_TO_T_UINT_8( 0x71, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ), BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ), BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ), BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ), }; static const mbedtls_mpi_uint brainpoolP512r1_a[] = { BYTES_TO_T_UINT_8( 0xCA, 0x94, 0xFC, 0x77, 0x4D, 0xAC, 0xC1, 0xE7 ), BYTES_TO_T_UINT_8( 0xB9, 0xC7, 0xF2, 0x2B, 0xA7, 0x17, 0x11, 0x7F ), BYTES_TO_T_UINT_8( 0xB5, 0xC8, 0x9A, 0x8B, 0xC9, 0xF1, 0x2E, 0x0A ), BYTES_TO_T_UINT_8( 0xA1, 0x3A, 0x25, 0xA8, 0x5A, 0x5D, 0xED, 0x2D ), BYTES_TO_T_UINT_8( 0xBC, 0x63, 0x98, 0xEA, 0xCA, 0x41, 0x34, 0xA8 ), BYTES_TO_T_UINT_8( 0x10, 0x16, 0xF9, 0x3D, 0x8D, 0xDD, 0xCB, 0x94 ), BYTES_TO_T_UINT_8( 0xC5, 0x4C, 0x23, 0xAC, 0x45, 0x71, 0x32, 0xE2 ), BYTES_TO_T_UINT_8( 0x89, 0x3B, 0x60, 0x8B, 0x31, 0xA3, 0x30, 0x78 ), }; static const mbedtls_mpi_uint brainpoolP512r1_b[] = { BYTES_TO_T_UINT_8( 0x23, 0xF7, 0x16, 0x80, 0x63, 0xBD, 0x09, 0x28 ), BYTES_TO_T_UINT_8( 0xDD, 0xE5, 0xBA, 0x5E, 0xB7, 0x50, 0x40, 0x98 ), BYTES_TO_T_UINT_8( 0x67, 0x3E, 0x08, 0xDC, 0xCA, 0x94, 0xFC, 0x77 ), BYTES_TO_T_UINT_8( 0x4D, 0xAC, 0xC1, 0xE7, 0xB9, 0xC7, 0xF2, 0x2B ), BYTES_TO_T_UINT_8( 0xA7, 0x17, 0x11, 0x7F, 0xB5, 0xC8, 0x9A, 0x8B ), BYTES_TO_T_UINT_8( 0xC9, 0xF1, 0x2E, 0x0A, 0xA1, 0x3A, 0x25, 0xA8 ), BYTES_TO_T_UINT_8( 0x5A, 0x5D, 0xED, 0x2D, 0xBC, 0x63, 0x98, 0xEA ), BYTES_TO_T_UINT_8( 0xCA, 0x41, 0x34, 0xA8, 0x10, 0x16, 0xF9, 0x3D ), }; static const mbedtls_mpi_uint brainpoolP512r1_gx[] = { BYTES_TO_T_UINT_8( 0x22, 0xF8, 0xB9, 0xBC, 0x09, 0x22, 0x35, 0x8B ), BYTES_TO_T_UINT_8( 0x68, 0x5E, 0x6A, 0x40, 0x47, 0x50, 0x6D, 0x7C ), BYTES_TO_T_UINT_8( 0x5F, 0x7D, 0xB9, 0x93, 0x7B, 0x68, 0xD1, 0x50 ), BYTES_TO_T_UINT_8( 0x8D, 0xD4, 0xD0, 0xE2, 0x78, 0x1F, 0x3B, 0xFF ), BYTES_TO_T_UINT_8( 0x8E, 0x09, 0xD0, 0xF4, 0xEE, 0x62, 0x3B, 0xB4 ), BYTES_TO_T_UINT_8( 0xC1, 0x16, 0xD9, 0xB5, 0x70, 0x9F, 0xED, 0x85 ), BYTES_TO_T_UINT_8( 0x93, 0x6A, 0x4C, 0x9C, 0x2E, 0x32, 0x21, 0x5A ), BYTES_TO_T_UINT_8( 0x64, 0xD9, 0x2E, 0xD8, 0xBD, 0xE4, 0xAE, 0x81 ), }; static const mbedtls_mpi_uint brainpoolP512r1_gy[] = { BYTES_TO_T_UINT_8( 0x92, 0x08, 0xD8, 0x3A, 0x0F, 0x1E, 0xCD, 0x78 ), BYTES_TO_T_UINT_8( 0x06, 0x54, 0xF0, 0xA8, 0x2F, 0x2B, 0xCA, 0xD1 ), BYTES_TO_T_UINT_8( 0xAE, 0x63, 0x27, 0x8A, 0xD8, 0x4B, 0xCA, 0x5B ), BYTES_TO_T_UINT_8( 0x5E, 0x48, 0x5F, 0x4A, 0x49, 0xDE, 0xDC, 0xB2 ), BYTES_TO_T_UINT_8( 0x11, 0x81, 0x1F, 0x88, 0x5B, 0xC5, 0x00, 0xA0 ), BYTES_TO_T_UINT_8( 0x1A, 0x7B, 0xA5, 0x24, 0x00, 0xF7, 0x09, 0xF2 ), BYTES_TO_T_UINT_8( 0xFD, 0x22, 0x78, 0xCF, 0xA9, 0xBF, 0xEA, 0xC0 ), BYTES_TO_T_UINT_8( 0xEC, 0x32, 0x63, 0x56, 0x5D, 0x38, 0xDE, 0x7D ), }; static const mbedtls_mpi_uint brainpoolP512r1_n[] = { BYTES_TO_T_UINT_8( 0x69, 0x00, 0xA9, 0x9C, 0x82, 0x96, 0x87, 0xB5 ), BYTES_TO_T_UINT_8( 0xDD, 0xDA, 0x5D, 0x08, 0x81, 0xD3, 0xB1, 0x1D ), BYTES_TO_T_UINT_8( 0x47, 0x10, 0xAC, 0x7F, 0x19, 0x61, 0x86, 0x41 ), BYTES_TO_T_UINT_8( 0x19, 0x26, 0xA9, 0x4C, 0x41, 0x5C, 0x3E, 0x55 ), BYTES_TO_T_UINT_8( 0x70, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ), BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ), BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ), BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ), }; #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ /* * Create an MPI from embedded constants * (assumes len is an exact multiple of sizeof mbedtls_mpi_uint) */ static inline void ecp_mpi_load( mbedtls_mpi *X, const mbedtls_mpi_uint *p, size_t len ) { X->s = 1; X->n = len / sizeof( mbedtls_mpi_uint ); X->p = (mbedtls_mpi_uint *) p; } /* * Set an MPI to static value 1 */ static inline void ecp_mpi_set1( mbedtls_mpi *X ) { static mbedtls_mpi_uint one[] = { 1 }; X->s = 1; X->n = 1; X->p = one; } /* * Make group available from embedded constants */ static int ecp_group_load( mbedtls_ecp_group *grp, const mbedtls_mpi_uint *p, size_t plen, const mbedtls_mpi_uint *a, size_t alen, const mbedtls_mpi_uint *b, size_t blen, const mbedtls_mpi_uint *gx, size_t gxlen, const mbedtls_mpi_uint *gy, size_t gylen, const mbedtls_mpi_uint *n, size_t nlen) { ecp_mpi_load( &grp->P, p, plen ); if( a != NULL ) ecp_mpi_load( &grp->A, a, alen ); ecp_mpi_load( &grp->B, b, blen ); ecp_mpi_load( &grp->N, n, nlen ); ecp_mpi_load( &grp->G.X, gx, gxlen ); ecp_mpi_load( &grp->G.Y, gy, gylen ); ecp_mpi_set1( &grp->G.Z ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); grp->nbits = mbedtls_mpi_bitlen( &grp->N ); grp->h = 1; return( 0 ); } #if defined(MBEDTLS_ECP_NIST_OPTIM) /* Forward declarations */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) static int ecp_mod_p192( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) static int ecp_mod_p224( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) static int ecp_mod_p256( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) static int ecp_mod_p384( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) static int ecp_mod_p521( mbedtls_mpi * ); #endif #define NIST_MODP( P ) grp->modp = ecp_mod_ ## P; #else #define NIST_MODP( P ) #endif /* MBEDTLS_ECP_NIST_OPTIM */ /* Additional forward declarations */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) static int ecp_mod_p255( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) static int ecp_mod_p448( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) static int ecp_mod_p192k1( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) static int ecp_mod_p224k1( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) static int ecp_mod_p256k1( mbedtls_mpi * ); #endif #define LOAD_GROUP_A( G ) ecp_group_load( grp, \ G ## _p, sizeof( G ## _p ), \ G ## _a, sizeof( G ## _a ), \ G ## _b, sizeof( G ## _b ), \ G ## _gx, sizeof( G ## _gx ), \ G ## _gy, sizeof( G ## _gy ), \ G ## _n, sizeof( G ## _n ) ) #define LOAD_GROUP( G ) ecp_group_load( grp, \ G ## _p, sizeof( G ## _p ), \ NULL, 0, \ G ## _b, sizeof( G ## _b ), \ G ## _gx, sizeof( G ## _gx ), \ G ## _gy, sizeof( G ## _gy ), \ G ## _n, sizeof( G ## _n ) ) #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) /* * Specialized function for creating the Curve25519 group */ static int ecp_use_curve25519( mbedtls_ecp_group *grp ) { int ret; /* Actually ( A + 2 ) / 4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->A, 16, "01DB42" ) ); /* P = 2^255 - 19 */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 255 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 19 ) ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); /* N = 2^252 + 27742317777372353535851937790883648493 */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->N, 16, "14DEF9DEA2F79CD65812631A5CF5D3ED" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( &grp->N, 252, 1 ) ); /* Y intentionally not set, since we use x/z coordinates. * This is used as a marker to identify Montgomery curves! */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.X, 9 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.Z, 1 ) ); mbedtls_mpi_free( &grp->G.Y ); /* Actually, the required msb for private keys */ grp->nbits = 254; cleanup: if( ret != 0 ) mbedtls_ecp_group_free( grp ); return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) /* * Specialized function for creating the Curve448 group */ static int ecp_use_curve448( mbedtls_ecp_group *grp ) { mbedtls_mpi Ns; int ret; mbedtls_mpi_init( &Ns ); /* Actually ( A + 2 ) / 4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->A, 16, "98AA" ) ); /* P = 2^448 - 2^224 - 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 1 ) ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); /* Y intentionally not set, since we use x/z coordinates. * This is used as a marker to identify Montgomery curves! */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.X, 5 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.Z, 1 ) ); mbedtls_mpi_free( &grp->G.Y ); /* N = 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885 */ MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( &grp->N, 446, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &Ns, 16, "8335DC163BB124B65129C96FDE933D8D723A70AADC873D6D54A7BB0D" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &grp->N, &grp->N, &Ns ) ); /* Actually, the required msb for private keys */ grp->nbits = 447; cleanup: mbedtls_mpi_free( &Ns ); if( ret != 0 ) mbedtls_ecp_group_free( grp ); return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ /* * Set a group using well-known domain parameters */ int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id ) { ECP_VALIDATE_RET( grp != NULL ); mbedtls_ecp_group_free( grp ); grp->id = id; switch( id ) { #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) case MBEDTLS_ECP_DP_SECP192R1: NIST_MODP( p192 ); return( LOAD_GROUP( secp192r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) case MBEDTLS_ECP_DP_SECP224R1: NIST_MODP( p224 ); return( LOAD_GROUP( secp224r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) case MBEDTLS_ECP_DP_SECP256R1: NIST_MODP( p256 ); return( LOAD_GROUP( secp256r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) case MBEDTLS_ECP_DP_SECP384R1: NIST_MODP( p384 ); return( LOAD_GROUP( secp384r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) case MBEDTLS_ECP_DP_SECP521R1: NIST_MODP( p521 ); return( LOAD_GROUP( secp521r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) case MBEDTLS_ECP_DP_SECP192K1: grp->modp = ecp_mod_p192k1; return( LOAD_GROUP_A( secp192k1 ) ); #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) case MBEDTLS_ECP_DP_SECP224K1: grp->modp = ecp_mod_p224k1; return( LOAD_GROUP_A( secp224k1 ) ); #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) case MBEDTLS_ECP_DP_SECP256K1: grp->modp = ecp_mod_p256k1; return( LOAD_GROUP_A( secp256k1 ) ); #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) case MBEDTLS_ECP_DP_BP256R1: return( LOAD_GROUP_A( brainpoolP256r1 ) ); #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) case MBEDTLS_ECP_DP_BP384R1: return( LOAD_GROUP_A( brainpoolP384r1 ) ); #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) case MBEDTLS_ECP_DP_BP512R1: return( LOAD_GROUP_A( brainpoolP512r1 ) ); #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) case MBEDTLS_ECP_DP_CURVE25519: grp->modp = ecp_mod_p255; return( ecp_use_curve25519( grp ) ); #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) case MBEDTLS_ECP_DP_CURVE448: grp->modp = ecp_mod_p448; return( ecp_use_curve448( grp ) ); #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ default: mbedtls_ecp_group_free( grp ); return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); } } #if defined(MBEDTLS_ECP_NIST_OPTIM) /* * Fast reduction modulo the primes used by the NIST curves. * * These functions are critical for speed, but not needed for correct * operations. So, we make the choice to heavily rely on the internals of our * bignum library, which creates a tight coupling between these functions and * our MPI implementation. However, the coupling between the ECP module and * MPI remains loose, since these functions can be deactivated at will. */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) /* * Compared to the way things are presented in FIPS 186-3 D.2, * we proceed in columns, from right (least significant chunk) to left, * adding chunks to N in place, and keeping a carry for the next chunk. * This avoids moving things around in memory, and uselessly adding zeros, * compared to the more straightforward, line-oriented approach. * * For this prime we need to handle data in chunks of 64 bits. * Since this is always a multiple of our basic mbedtls_mpi_uint, we can * use a mbedtls_mpi_uint * to designate such a chunk, and small loops to handle it. */ /* Add 64-bit chunks (dst += src) and update carry */ static inline void add64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *src, mbedtls_mpi_uint *carry ) { unsigned char i; mbedtls_mpi_uint c = 0; for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++, src++ ) { *dst += c; c = ( *dst < c ); *dst += *src; c += ( *dst < *src ); } *carry += c; } /* Add carry to a 64-bit chunk and update carry */ static inline void carry64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *carry ) { unsigned char i; for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++ ) { *dst += *carry; *carry = ( *dst < *carry ); } } #define WIDTH 8 / sizeof( mbedtls_mpi_uint ) #define A( i ) N->p + i * WIDTH #define ADD( i ) add64( p, A( i ), &c ) #define NEXT p += WIDTH; carry64( p, &c ) #define LAST p += WIDTH; *p = c; while( ++p < end ) *p = 0 /* * Fast quasi-reduction modulo p192 (FIPS 186-3 D.2.1) */ static int ecp_mod_p192( mbedtls_mpi *N ) { int ret; mbedtls_mpi_uint c = 0; mbedtls_mpi_uint *p, *end; /* Make sure we have enough blocks so that A(5) is legal */ MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, 6 * WIDTH ) ); p = N->p; end = p + N->n; ADD( 3 ); ADD( 5 ); NEXT; // A0 += A3 + A5 ADD( 3 ); ADD( 4 ); ADD( 5 ); NEXT; // A1 += A3 + A4 + A5 ADD( 4 ); ADD( 5 ); LAST; // A2 += A4 + A5 cleanup: return( ret ); } #undef WIDTH #undef A #undef ADD #undef NEXT #undef LAST #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) /* * The reader is advised to first understand ecp_mod_p192() since the same * general structure is used here, but with additional complications: * (1) chunks of 32 bits, and (2) subtractions. */ /* * For these primes, we need to handle data in chunks of 32 bits. * This makes it more complicated if we use 64 bits limbs in MPI, * which prevents us from using a uniform access method as for p192. * * So, we define a mini abstraction layer to access 32 bit chunks, * load them in 'cur' for work, and store them back from 'cur' when done. * * While at it, also define the size of N in terms of 32-bit chunks. */ #define LOAD32 cur = A( i ); #if defined(MBEDTLS_HAVE_INT32) /* 32 bit */ #define MAX32 N->n #define A( j ) N->p[j] #define STORE32 N->p[i] = cur; #else /* 64-bit */ #define MAX32 N->n * 2 #define A( j ) j % 2 ? (uint32_t)( N->p[j/2] >> 32 ) : (uint32_t)( N->p[j/2] ) #define STORE32 \ if( i % 2 ) { \ N->p[i/2] &= 0x00000000FFFFFFFF; \ N->p[i/2] |= ((mbedtls_mpi_uint) cur) << 32; \ } else { \ N->p[i/2] &= 0xFFFFFFFF00000000; \ N->p[i/2] |= (mbedtls_mpi_uint) cur; \ } #endif /* sizeof( mbedtls_mpi_uint ) */ /* * Helpers for addition and subtraction of chunks, with signed carry. */ static inline void add32( uint32_t *dst, uint32_t src, signed char *carry ) { *dst += src; *carry += ( *dst < src ); } static inline void sub32( uint32_t *dst, uint32_t src, signed char *carry ) { *carry -= ( *dst < src ); *dst -= src; } #define ADD( j ) add32( &cur, A( j ), &c ); #define SUB( j ) sub32( &cur, A( j ), &c ); /* * Helpers for the main 'loop' * (see fix_negative for the motivation of C) */ #define INIT( b ) \ int ret; \ signed char c = 0, cc; \ uint32_t cur; \ size_t i = 0, bits = b; \ mbedtls_mpi C; \ mbedtls_mpi_uint Cp[ b / 8 / sizeof( mbedtls_mpi_uint) + 1 ]; \ \ C.s = 1; \ C.n = b / 8 / sizeof( mbedtls_mpi_uint) + 1; \ C.p = Cp; \ memset( Cp, 0, C.n * sizeof( mbedtls_mpi_uint ) ); \ \ MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, b * 2 / 8 / sizeof( mbedtls_mpi_uint ) ) ); \ LOAD32; #define NEXT \ STORE32; i++; LOAD32; \ cc = c; c = 0; \ if( cc < 0 ) \ sub32( &cur, -cc, &c ); \ else \ add32( &cur, cc, &c ); \ #define LAST \ STORE32; i++; \ cur = c > 0 ? c : 0; STORE32; \ cur = 0; while( ++i < MAX32 ) { STORE32; } \ if( c < 0 ) fix_negative( N, c, &C, bits ); /* * If the result is negative, we get it in the form * c * 2^(bits + 32) + N, with c negative and N positive shorter than 'bits' */ static inline int fix_negative( mbedtls_mpi *N, signed char c, mbedtls_mpi *C, size_t bits ) { int ret; /* C = - c * 2^(bits + 32) */ #if !defined(MBEDTLS_HAVE_INT64) ((void) bits); #else if( bits == 224 ) C->p[ C->n - 1 ] = ((mbedtls_mpi_uint) -c) << 32; else #endif C->p[ C->n - 1 ] = (mbedtls_mpi_uint) -c; /* N = - ( C - N ) */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, C, N ) ); N->s = -1; cleanup: return( ret ); } #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) /* * Fast quasi-reduction modulo p224 (FIPS 186-3 D.2.2) */ static int ecp_mod_p224( mbedtls_mpi *N ) { INIT( 224 ); SUB( 7 ); SUB( 11 ); NEXT; // A0 += -A7 - A11 SUB( 8 ); SUB( 12 ); NEXT; // A1 += -A8 - A12 SUB( 9 ); SUB( 13 ); NEXT; // A2 += -A9 - A13 SUB( 10 ); ADD( 7 ); ADD( 11 ); NEXT; // A3 += -A10 + A7 + A11 SUB( 11 ); ADD( 8 ); ADD( 12 ); NEXT; // A4 += -A11 + A8 + A12 SUB( 12 ); ADD( 9 ); ADD( 13 ); NEXT; // A5 += -A12 + A9 + A13 SUB( 13 ); ADD( 10 ); LAST; // A6 += -A13 + A10 cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) /* * Fast quasi-reduction modulo p256 (FIPS 186-3 D.2.3) */ static int ecp_mod_p256( mbedtls_mpi *N ) { INIT( 256 ); ADD( 8 ); ADD( 9 ); SUB( 11 ); SUB( 12 ); SUB( 13 ); SUB( 14 ); NEXT; // A0 ADD( 9 ); ADD( 10 ); SUB( 12 ); SUB( 13 ); SUB( 14 ); SUB( 15 ); NEXT; // A1 ADD( 10 ); ADD( 11 ); SUB( 13 ); SUB( 14 ); SUB( 15 ); NEXT; // A2 ADD( 11 ); ADD( 11 ); ADD( 12 ); ADD( 12 ); ADD( 13 ); SUB( 15 ); SUB( 8 ); SUB( 9 ); NEXT; // A3 ADD( 12 ); ADD( 12 ); ADD( 13 ); ADD( 13 ); ADD( 14 ); SUB( 9 ); SUB( 10 ); NEXT; // A4 ADD( 13 ); ADD( 13 ); ADD( 14 ); ADD( 14 ); ADD( 15 ); SUB( 10 ); SUB( 11 ); NEXT; // A5 ADD( 14 ); ADD( 14 ); ADD( 15 ); ADD( 15 ); ADD( 14 ); ADD( 13 ); SUB( 8 ); SUB( 9 ); NEXT; // A6 ADD( 15 ); ADD( 15 ); ADD( 15 ); ADD( 8 ); SUB( 10 ); SUB( 11 ); SUB( 12 ); SUB( 13 ); LAST; // A7 cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) /* * Fast quasi-reduction modulo p384 (FIPS 186-3 D.2.4) */ static int ecp_mod_p384( mbedtls_mpi *N ) { INIT( 384 ); ADD( 12 ); ADD( 21 ); ADD( 20 ); SUB( 23 ); NEXT; // A0 ADD( 13 ); ADD( 22 ); ADD( 23 ); SUB( 12 ); SUB( 20 ); NEXT; // A2 ADD( 14 ); ADD( 23 ); SUB( 13 ); SUB( 21 ); NEXT; // A2 ADD( 15 ); ADD( 12 ); ADD( 20 ); ADD( 21 ); SUB( 14 ); SUB( 22 ); SUB( 23 ); NEXT; // A3 ADD( 21 ); ADD( 21 ); ADD( 16 ); ADD( 13 ); ADD( 12 ); ADD( 20 ); ADD( 22 ); SUB( 15 ); SUB( 23 ); SUB( 23 ); NEXT; // A4 ADD( 22 ); ADD( 22 ); ADD( 17 ); ADD( 14 ); ADD( 13 ); ADD( 21 ); ADD( 23 ); SUB( 16 ); NEXT; // A5 ADD( 23 ); ADD( 23 ); ADD( 18 ); ADD( 15 ); ADD( 14 ); ADD( 22 ); SUB( 17 ); NEXT; // A6 ADD( 19 ); ADD( 16 ); ADD( 15 ); ADD( 23 ); SUB( 18 ); NEXT; // A7 ADD( 20 ); ADD( 17 ); ADD( 16 ); SUB( 19 ); NEXT; // A8 ADD( 21 ); ADD( 18 ); ADD( 17 ); SUB( 20 ); NEXT; // A9 ADD( 22 ); ADD( 19 ); ADD( 18 ); SUB( 21 ); NEXT; // A10 ADD( 23 ); ADD( 20 ); ADD( 19 ); SUB( 22 ); LAST; // A11 cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #undef A #undef LOAD32 #undef STORE32 #undef MAX32 #undef INIT #undef NEXT #undef LAST #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED || MBEDTLS_ECP_DP_SECP256R1_ENABLED || MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) /* * Here we have an actual Mersenne prime, so things are more straightforward. * However, chunks are aligned on a 'weird' boundary (521 bits). */ /* Size of p521 in terms of mbedtls_mpi_uint */ #define P521_WIDTH ( 521 / 8 / sizeof( mbedtls_mpi_uint ) + 1 ) /* Bits to keep in the most significant mbedtls_mpi_uint */ #define P521_MASK 0x01FF /* * Fast quasi-reduction modulo p521 (FIPS 186-3 D.2.5) * Write N as A1 + 2^521 A0, return A0 + A1 */ static int ecp_mod_p521( mbedtls_mpi *N ) { int ret; size_t i; mbedtls_mpi M; mbedtls_mpi_uint Mp[P521_WIDTH + 1]; /* Worst case for the size of M is when mbedtls_mpi_uint is 16 bits: * we need to hold bits 513 to 1056, which is 34 limbs, that is * P521_WIDTH + 1. Otherwise P521_WIDTH is enough. */ if( N->n < P521_WIDTH ) return( 0 ); /* M = A1 */ M.s = 1; M.n = N->n - ( P521_WIDTH - 1 ); if( M.n > P521_WIDTH + 1 ) M.n = P521_WIDTH + 1; M.p = Mp; memcpy( Mp, N->p + P521_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 521 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) ); /* N = A0 */ N->p[P521_WIDTH - 1] &= P521_MASK; for( i = P521_WIDTH; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); cleanup: return( ret ); } #undef P521_WIDTH #undef P521_MASK #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #endif /* MBEDTLS_ECP_NIST_OPTIM */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) /* Size of p255 in terms of mbedtls_mpi_uint */ #define P255_WIDTH ( 255 / 8 / sizeof( mbedtls_mpi_uint ) + 1 ) /* * Fast quasi-reduction modulo p255 = 2^255 - 19 * Write N as A0 + 2^255 A1, return A0 + 19 * A1 */ static int ecp_mod_p255( mbedtls_mpi *N ) { int ret; size_t i; mbedtls_mpi M; mbedtls_mpi_uint Mp[P255_WIDTH + 2]; if( N->n < P255_WIDTH ) return( 0 ); /* M = A1 */ M.s = 1; M.n = N->n - ( P255_WIDTH - 1 ); if( M.n > P255_WIDTH + 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); M.p = Mp; memset( Mp, 0, sizeof Mp ); memcpy( Mp, N->p + P255_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 255 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) ); M.n++; /* Make room for multiplication by 19 */ /* N = A0 */ MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( N, 255, 0 ) ); for( i = P255_WIDTH; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + 19 * A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &M, 19 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) /* Size of p448 in terms of mbedtls_mpi_uint */ #define P448_WIDTH ( 448 / 8 / sizeof( mbedtls_mpi_uint ) ) /* Number of limbs fully occupied by 2^224 (max), and limbs used by it (min) */ #define DIV_ROUND_UP( X, Y ) ( ( ( X ) + ( Y ) - 1 ) / ( Y ) ) #define P224_WIDTH_MIN ( 28 / sizeof( mbedtls_mpi_uint ) ) #define P224_WIDTH_MAX DIV_ROUND_UP( 28, sizeof( mbedtls_mpi_uint ) ) #define P224_UNUSED_BITS ( ( P224_WIDTH_MAX * sizeof( mbedtls_mpi_uint ) * 8 ) - 224 ) /* * Fast quasi-reduction modulo p448 = 2^448 - 2^224 - 1 * Write N as A0 + 2^448 A1 and A1 as B0 + 2^224 B1, and return * A0 + A1 + B1 + (B0 + B1) * 2^224. This is different to the reference * implementation of Curve448, which uses its own special 56-bit limbs rather * than a generic bignum library. We could squeeze some extra speed out on * 32-bit machines by splitting N up into 32-bit limbs and doing the * arithmetic using the limbs directly as we do for the NIST primes above, * but for 64-bit targets it should use half the number of operations if we do * the reduction with 224-bit limbs, since mpi_add_mpi will then use 64-bit adds. */ static int ecp_mod_p448( mbedtls_mpi *N ) { int ret; size_t i; mbedtls_mpi M, Q; mbedtls_mpi_uint Mp[P448_WIDTH + 1], Qp[P448_WIDTH]; if( N->n <= P448_WIDTH ) return( 0 ); /* M = A1 */ M.s = 1; M.n = N->n - ( P448_WIDTH ); if( M.n > P448_WIDTH ) /* Shouldn't be called with N larger than 2^896! */ return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); M.p = Mp; memset( Mp, 0, sizeof( Mp ) ); memcpy( Mp, N->p + P448_WIDTH, M.n * sizeof( mbedtls_mpi_uint ) ); /* N = A0 */ for( i = P448_WIDTH; i < N->n; i++ ) N->p[i] = 0; /* N += A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &M ) ); /* Q = B1, N += B1 */ Q = M; Q.p = Qp; memcpy( Qp, Mp, sizeof( Qp ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Q, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &Q ) ); /* M = (B0 + B1) * 2^224, N += M */ if( sizeof( mbedtls_mpi_uint ) > 4 ) Mp[P224_WIDTH_MIN] &= ( (mbedtls_mpi_uint)-1 ) >> ( P224_UNUSED_BITS ); for( i = P224_WIDTH_MAX; i < M.n; ++i ) Mp[i] = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &M, &M, &Q ) ); M.n = P448_WIDTH + 1; /* Make room for shifted carry bit from the addition */ MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &M, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &M ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) /* * Fast quasi-reduction modulo P = 2^s - R, * with R about 33 bits, used by the Koblitz curves. * * Write N as A0 + 2^224 A1, return A0 + R * A1. * Actually do two passes, since R is big. */ #define P_KOBLITZ_MAX ( 256 / 8 / sizeof( mbedtls_mpi_uint ) ) // Max limbs in P #define P_KOBLITZ_R ( 8 / sizeof( mbedtls_mpi_uint ) ) // Limbs in R static inline int ecp_mod_koblitz( mbedtls_mpi *N, mbedtls_mpi_uint *Rp, size_t p_limbs, size_t adjust, size_t shift, mbedtls_mpi_uint mask ) { int ret; size_t i; mbedtls_mpi M, R; mbedtls_mpi_uint Mp[P_KOBLITZ_MAX + P_KOBLITZ_R + 1]; if( N->n < p_limbs ) return( 0 ); /* Init R */ R.s = 1; R.p = Rp; R.n = P_KOBLITZ_R; /* Common setup for M */ M.s = 1; M.p = Mp; /* M = A1 */ M.n = N->n - ( p_limbs - adjust ); if( M.n > p_limbs + adjust ) M.n = p_limbs + adjust; memset( Mp, 0, sizeof Mp ); memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) ); if( shift != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) ); M.n += R.n; /* Make room for multiplication by R */ /* N = A0 */ if( mask != 0 ) N->p[p_limbs - 1] &= mask; for( i = p_limbs; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + R * A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); /* Second pass */ /* M = A1 */ M.n = N->n - ( p_limbs - adjust ); if( M.n > p_limbs + adjust ) M.n = p_limbs + adjust; memset( Mp, 0, sizeof Mp ); memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) ); if( shift != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) ); M.n += R.n; /* Make room for multiplication by R */ /* N = A0 */ if( mask != 0 ) N->p[p_limbs - 1] &= mask; for( i = p_limbs; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + R * A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED) || MBEDTLS_ECP_DP_SECP224K1_ENABLED) || MBEDTLS_ECP_DP_SECP256K1_ENABLED) */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) /* * Fast quasi-reduction modulo p192k1 = 2^192 - R, * with R = 2^32 + 2^12 + 2^8 + 2^7 + 2^6 + 2^3 + 1 = 0x0100001119 */ static int ecp_mod_p192k1( mbedtls_mpi *N ) { static mbedtls_mpi_uint Rp[] = { BYTES_TO_T_UINT_8( 0xC9, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) }; return( ecp_mod_koblitz( N, Rp, 192 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) ); } #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) /* * Fast quasi-reduction modulo p224k1 = 2^224 - R, * with R = 2^32 + 2^12 + 2^11 + 2^9 + 2^7 + 2^4 + 2 + 1 = 0x0100001A93 */ static int ecp_mod_p224k1( mbedtls_mpi *N ) { static mbedtls_mpi_uint Rp[] = { BYTES_TO_T_UINT_8( 0x93, 0x1A, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) }; #if defined(MBEDTLS_HAVE_INT64) return( ecp_mod_koblitz( N, Rp, 4, 1, 32, 0xFFFFFFFF ) ); #else return( ecp_mod_koblitz( N, Rp, 224 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) ); #endif } #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) /* * Fast quasi-reduction modulo p256k1 = 2^256 - R, * with R = 2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1 = 0x01000003D1 */ static int ecp_mod_p256k1( mbedtls_mpi *N ) { static mbedtls_mpi_uint Rp[] = { BYTES_TO_T_UINT_8( 0xD1, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) }; return( ecp_mod_koblitz( N, Rp, 256 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) ); } #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #endif /* !MBEDTLS_ECP_ALT */ #endif /* MBEDTLS_ECP_C */ fldigi-4.1.06/src/mbedtls/pkwrite.c0000664000175000017500000004272713507401434014052 00000000000000/* * Public Key layer for writing key files and structures * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_WRITE_C) #include "mbedtls/pk.h" #include "mbedtls/asn1write.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #if defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA ) #define PK_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_RSA_C) /* * RSAPublicKey ::= SEQUENCE { * modulus INTEGER, -- n * publicExponent INTEGER -- e * } */ static int pk_write_rsa_pubkey( unsigned char **p, unsigned char *start, mbedtls_rsa_context *rsa ) { int ret; size_t len = 0; mbedtls_mpi T; mbedtls_mpi_init( &T ); /* Export E */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, NULL, NULL, &T ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( p, start, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export N */ if ( ( ret = mbedtls_rsa_export( rsa, &T, NULL, NULL, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( p, start, &T ) ) < 0 ) goto end_of_export; len += ret; end_of_export: mbedtls_mpi_free( &T ); if( ret < 0 ) return( ret ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * EC public key is an EC point */ static int pk_write_ec_pubkey( unsigned char **p, unsigned char *start, mbedtls_ecp_keypair *ec ) { int ret; size_t len = 0; unsigned char buf[MBEDTLS_ECP_MAX_PT_LEN]; if( ( ret = mbedtls_ecp_point_write_binary( &ec->grp, &ec->Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &len, buf, sizeof( buf ) ) ) != 0 ) { return( ret ); } if( *p < start || (size_t)( *p - start ) < len ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *p -= len; memcpy( *p, buf, len ); return( (int) len ); } /* * ECParameters ::= CHOICE { * namedCurve OBJECT IDENTIFIER * } */ static int pk_write_ec_param( unsigned char **p, unsigned char *start, mbedtls_ecp_keypair *ec ) { int ret; size_t len = 0; const char *oid; size_t oid_len; if( ( ret = mbedtls_oid_get_oid_by_ec_grp( ec->grp.id, &oid, &oid_len ) ) != 0 ) return( ret ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) ); return( (int) len ); } #endif /* MBEDTLS_ECP_C */ int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start, const mbedtls_pk_context *key ) { int ret; size_t len = 0; PK_VALIDATE_RET( p != NULL ); PK_VALIDATE_RET( *p != NULL ); PK_VALIDATE_RET( start != NULL ); PK_VALIDATE_RET( key != NULL ); #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA ) MBEDTLS_ASN1_CHK_ADD( len, pk_write_rsa_pubkey( p, start, mbedtls_pk_rsa( *key ) ) ); else #endif #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) MBEDTLS_ASN1_CHK_ADD( len, pk_write_ec_pubkey( p, start, mbedtls_pk_ec( *key ) ) ); else #endif return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); return( (int) len ); } int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char *c; size_t len = 0, par_len = 0, oid_len; const char *oid; PK_VALIDATE_RET( key != NULL ); if( size == 0 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); PK_VALIDATE_RET( buf != NULL ); c = buf + size; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, key ) ); if( c - buf < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); /* * SubjectPublicKeyInfo ::= SEQUENCE { * algorithm AlgorithmIdentifier, * subjectPublicKey BIT STRING } */ *--c = 0; len += 1; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) ); if( ( ret = mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_get_type( key ), &oid, &oid_len ) ) != 0 ) { return( ret ); } #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) { MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, mbedtls_pk_ec( *key ) ) ); } #endif MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, buf, oid, oid_len, par_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } int mbedtls_pk_write_key_der( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char *c; size_t len = 0; PK_VALIDATE_RET( key != NULL ); if( size == 0 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); PK_VALIDATE_RET( buf != NULL ); c = buf + size; #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA ) { mbedtls_mpi T; /* Temporary holding the exported parameters */ mbedtls_rsa_context *rsa = mbedtls_pk_rsa( *key ); /* * Export the parameters one after another to avoid simultaneous copies. */ mbedtls_mpi_init( &T ); /* Export QP */ if( ( ret = mbedtls_rsa_export_crt( rsa, NULL, NULL, &T ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export DQ */ if( ( ret = mbedtls_rsa_export_crt( rsa, NULL, &T, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export DP */ if( ( ret = mbedtls_rsa_export_crt( rsa, &T, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export Q */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, &T, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export P */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, &T, NULL, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export D */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, NULL, &T, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export E */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, NULL, NULL, &T ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export N */ if ( ( ret = mbedtls_rsa_export( rsa, &T, NULL, NULL, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; end_of_export: mbedtls_mpi_free( &T ); if( ret < 0 ) return( ret ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 0 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); } else #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) { mbedtls_ecp_keypair *ec = mbedtls_pk_ec( *key ); size_t pub_len = 0, par_len = 0; /* * RFC 5915, or SEC1 Appendix C.4 * * ECPrivateKey ::= SEQUENCE { * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), * privateKey OCTET STRING, * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, * publicKey [1] BIT STRING OPTIONAL * } */ /* publicKey */ MBEDTLS_ASN1_CHK_ADD( pub_len, pk_write_ec_pubkey( &c, buf, ec ) ); if( c - buf < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--c = 0; pub_len += 1; MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ); len += pub_len; /* parameters */ MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, ec ) ); MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_len( &c, buf, par_len ) ); MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ); len += par_len; /* privateKey: write as MPI then fix tag */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &ec->d ) ); *c = MBEDTLS_ASN1_OCTET_STRING; /* version */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 1 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); } else #endif /* MBEDTLS_ECP_C */ return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); return( (int) len ); } #if defined(MBEDTLS_PEM_WRITE_C) #define PEM_BEGIN_PUBLIC_KEY "-----BEGIN PUBLIC KEY-----\n" #define PEM_END_PUBLIC_KEY "-----END PUBLIC KEY-----\n" #define PEM_BEGIN_PRIVATE_KEY_RSA "-----BEGIN RSA PRIVATE KEY-----\n" #define PEM_END_PRIVATE_KEY_RSA "-----END RSA PRIVATE KEY-----\n" #define PEM_BEGIN_PRIVATE_KEY_EC "-----BEGIN EC PRIVATE KEY-----\n" #define PEM_END_PRIVATE_KEY_EC "-----END EC PRIVATE KEY-----\n" /* * Max sizes of key per types. Shown as tag + len (+ content). */ #if defined(MBEDTLS_RSA_C) /* * RSA public keys: * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 3 * algorithm AlgorithmIdentifier, 1 + 1 (sequence) * + 1 + 1 + 9 (rsa oid) * + 1 + 1 (params null) * subjectPublicKey BIT STRING } 1 + 3 + (1 + below) * RSAPublicKey ::= SEQUENCE { 1 + 3 * modulus INTEGER, -- n 1 + 3 + MPI_MAX + 1 * publicExponent INTEGER -- e 1 + 3 + MPI_MAX + 1 * } */ #define RSA_PUB_DER_MAX_BYTES 38 + 2 * MBEDTLS_MPI_MAX_SIZE /* * RSA private keys: * RSAPrivateKey ::= SEQUENCE { 1 + 3 * version Version, 1 + 1 + 1 * modulus INTEGER, 1 + 3 + MPI_MAX + 1 * publicExponent INTEGER, 1 + 3 + MPI_MAX + 1 * privateExponent INTEGER, 1 + 3 + MPI_MAX + 1 * prime1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * prime2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * exponent1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * exponent2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * coefficient INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * otherPrimeInfos OtherPrimeInfos OPTIONAL 0 (not supported) * } */ #define MPI_MAX_SIZE_2 MBEDTLS_MPI_MAX_SIZE / 2 + \ MBEDTLS_MPI_MAX_SIZE % 2 #define RSA_PRV_DER_MAX_BYTES 47 + 3 * MBEDTLS_MPI_MAX_SIZE \ + 5 * MPI_MAX_SIZE_2 #else /* MBEDTLS_RSA_C */ #define RSA_PUB_DER_MAX_BYTES 0 #define RSA_PRV_DER_MAX_BYTES 0 #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * EC public keys: * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 2 * algorithm AlgorithmIdentifier, 1 + 1 (sequence) * + 1 + 1 + 7 (ec oid) * + 1 + 1 + 9 (namedCurve oid) * subjectPublicKey BIT STRING 1 + 2 + 1 [1] * + 1 (point format) [1] * + 2 * ECP_MAX (coords) [1] * } */ #define ECP_PUB_DER_MAX_BYTES 30 + 2 * MBEDTLS_ECP_MAX_BYTES /* * EC private keys: * ECPrivateKey ::= SEQUENCE { 1 + 2 * version INTEGER , 1 + 1 + 1 * privateKey OCTET STRING, 1 + 1 + ECP_MAX * parameters [0] ECParameters OPTIONAL, 1 + 1 + (1 + 1 + 9) * publicKey [1] BIT STRING OPTIONAL 1 + 2 + [1] above * } */ #define ECP_PRV_DER_MAX_BYTES 29 + 3 * MBEDTLS_ECP_MAX_BYTES #else /* MBEDTLS_ECP_C */ #define ECP_PUB_DER_MAX_BYTES 0 #define ECP_PRV_DER_MAX_BYTES 0 #endif /* MBEDTLS_ECP_C */ #define PUB_DER_MAX_BYTES RSA_PUB_DER_MAX_BYTES > ECP_PUB_DER_MAX_BYTES ? \ RSA_PUB_DER_MAX_BYTES : ECP_PUB_DER_MAX_BYTES #define PRV_DER_MAX_BYTES RSA_PRV_DER_MAX_BYTES > ECP_PRV_DER_MAX_BYTES ? \ RSA_PRV_DER_MAX_BYTES : ECP_PRV_DER_MAX_BYTES int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char output_buf[PUB_DER_MAX_BYTES]; size_t olen = 0; PK_VALIDATE_RET( key != NULL ); PK_VALIDATE_RET( buf != NULL || size == 0 ); if( ( ret = mbedtls_pk_write_pubkey_der( key, output_buf, sizeof(output_buf) ) ) < 0 ) { return( ret ); } if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_PUBLIC_KEY, PEM_END_PUBLIC_KEY, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } int mbedtls_pk_write_key_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char output_buf[PRV_DER_MAX_BYTES]; const char *begin, *end; size_t olen = 0; PK_VALIDATE_RET( key != NULL ); PK_VALIDATE_RET( buf != NULL || size == 0 ); if( ( ret = mbedtls_pk_write_key_der( key, output_buf, sizeof(output_buf) ) ) < 0 ) return( ret ); #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA ) { begin = PEM_BEGIN_PRIVATE_KEY_RSA; end = PEM_END_PRIVATE_KEY_RSA; } else #endif #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) { begin = PEM_BEGIN_PRIVATE_KEY_EC; end = PEM_END_PRIVATE_KEY_EC; } else #endif return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); if( ( ret = mbedtls_pem_write_buffer( begin, end, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PK_WRITE_C */ fldigi-4.1.06/src/mbedtls/ecdsa.c0000664000175000017500000006574613507401434013452 00000000000000/* * Elliptic curve DSA * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * SEC1 http://www.secg.org/index.php?action=secg,docs_secg */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #include "mbedtls/asn1write.h" #include #if defined(MBEDTLS_ECDSA_DETERMINISTIC) #include "mbedtls/hmac_drbg.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/platform_util.h" /* Parameter validation macros based on platform_util.h */ #define ECDSA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECDSA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Sub-context for ecdsa_verify() */ struct mbedtls_ecdsa_restart_ver { mbedtls_mpi u1, u2; /* intermediate values */ enum { /* what to do next? */ ecdsa_ver_init = 0, /* getting started */ ecdsa_ver_muladd, /* muladd step */ } state; }; /* * Init verify restart sub-context */ static void ecdsa_restart_ver_init( mbedtls_ecdsa_restart_ver_ctx *ctx ) { mbedtls_mpi_init( &ctx->u1 ); mbedtls_mpi_init( &ctx->u2 ); ctx->state = ecdsa_ver_init; } /* * Free the components of a verify restart sub-context */ static void ecdsa_restart_ver_free( mbedtls_ecdsa_restart_ver_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->u1 ); mbedtls_mpi_free( &ctx->u2 ); ecdsa_restart_ver_init( ctx ); } /* * Sub-context for ecdsa_sign() */ struct mbedtls_ecdsa_restart_sig { int sign_tries; int key_tries; mbedtls_mpi k; /* per-signature random */ mbedtls_mpi r; /* r value */ enum { /* what to do next? */ ecdsa_sig_init = 0, /* getting started */ ecdsa_sig_mul, /* doing ecp_mul() */ ecdsa_sig_modn, /* mod N computations */ } state; }; /* * Init verify sign sub-context */ static void ecdsa_restart_sig_init( mbedtls_ecdsa_restart_sig_ctx *ctx ) { ctx->sign_tries = 0; ctx->key_tries = 0; mbedtls_mpi_init( &ctx->k ); mbedtls_mpi_init( &ctx->r ); ctx->state = ecdsa_sig_init; } /* * Free the components of a sign restart sub-context */ static void ecdsa_restart_sig_free( mbedtls_ecdsa_restart_sig_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->k ); mbedtls_mpi_free( &ctx->r ); } #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /* * Sub-context for ecdsa_sign_det() */ struct mbedtls_ecdsa_restart_det { mbedtls_hmac_drbg_context rng_ctx; /* DRBG state */ enum { /* what to do next? */ ecdsa_det_init = 0, /* getting started */ ecdsa_det_sign, /* make signature */ } state; }; /* * Init verify sign_det sub-context */ static void ecdsa_restart_det_init( mbedtls_ecdsa_restart_det_ctx *ctx ) { mbedtls_hmac_drbg_init( &ctx->rng_ctx ); ctx->state = ecdsa_det_init; } /* * Free the components of a sign_det restart sub-context */ static void ecdsa_restart_det_free( mbedtls_ecdsa_restart_det_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_hmac_drbg_free( &ctx->rng_ctx ); ecdsa_restart_det_init( ctx ); } #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ #define ECDSA_RS_ECP &rs_ctx->ecp /* Utility macro for checking and updating ops budget */ #define ECDSA_BUDGET( ops ) \ MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, &rs_ctx->ecp, ops ) ); /* Call this when entering a function that needs its own sub-context */ #define ECDSA_RS_ENTER( SUB ) do { \ /* reset ops count for this call if top-level */ \ if( rs_ctx != NULL && rs_ctx->ecp.depth++ == 0 ) \ rs_ctx->ecp.ops_done = 0; \ \ /* set up our own sub-context if needed */ \ if( mbedtls_ecp_restart_is_enabled() && \ rs_ctx != NULL && rs_ctx->SUB == NULL ) \ { \ rs_ctx->SUB = mbedtls_calloc( 1, sizeof( *rs_ctx->SUB ) ); \ if( rs_ctx->SUB == NULL ) \ return( MBEDTLS_ERR_ECP_ALLOC_FAILED ); \ \ ecdsa_restart_## SUB ##_init( rs_ctx->SUB ); \ } \ } while( 0 ) /* Call this when leaving a function that needs its own sub-context */ #define ECDSA_RS_LEAVE( SUB ) do { \ /* clear our sub-context when not in progress (done or error) */ \ if( rs_ctx != NULL && rs_ctx->SUB != NULL && \ ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) \ { \ ecdsa_restart_## SUB ##_free( rs_ctx->SUB ); \ mbedtls_free( rs_ctx->SUB ); \ rs_ctx->SUB = NULL; \ } \ \ if( rs_ctx != NULL ) \ rs_ctx->ecp.depth--; \ } while( 0 ) #else /* MBEDTLS_ECP_RESTARTABLE */ #define ECDSA_RS_ECP NULL #define ECDSA_BUDGET( ops ) /* no-op; for compatibility */ #define ECDSA_RS_ENTER( SUB ) (void) rs_ctx #define ECDSA_RS_LEAVE( SUB ) (void) rs_ctx #endif /* MBEDTLS_ECP_RESTARTABLE */ /* * Derive a suitable integer for group grp from a buffer of length len * SEC1 4.1.3 step 5 aka SEC1 4.1.4 step 3 */ static int derive_mpi( const mbedtls_ecp_group *grp, mbedtls_mpi *x, const unsigned char *buf, size_t blen ) { int ret; size_t n_size = ( grp->nbits + 7 ) / 8; size_t use_size = blen > n_size ? n_size : blen; MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( x, buf, use_size ) ); if( use_size * 8 > grp->nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( x, use_size * 8 - grp->nbits ) ); /* While at it, reduce modulo N */ if( mbedtls_mpi_cmp_mpi( x, &grp->N ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( x, x, &grp->N ) ); cleanup: return( ret ); } #if !defined(MBEDTLS_ECDSA_SIGN_ALT) /* * Compute ECDSA signature of a hashed message (SEC1 4.1.3) * Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message) */ static int ecdsa_sign_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret, key_tries, sign_tries; int *p_sign_tries = &sign_tries, *p_key_tries = &key_tries; mbedtls_ecp_point R; mbedtls_mpi k, e, t; mbedtls_mpi *pk = &k, *pr = r; /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */ if( grp->N.p == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* Make sure d is in range 1..n-1 */ if( mbedtls_mpi_cmp_int( d, 1 ) < 0 || mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); mbedtls_ecp_point_init( &R ); mbedtls_mpi_init( &k ); mbedtls_mpi_init( &e ); mbedtls_mpi_init( &t ); ECDSA_RS_ENTER( sig ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) { /* redirect to our context */ p_sign_tries = &rs_ctx->sig->sign_tries; p_key_tries = &rs_ctx->sig->key_tries; pk = &rs_ctx->sig->k; pr = &rs_ctx->sig->r; /* jump to current step */ if( rs_ctx->sig->state == ecdsa_sig_mul ) goto mul; if( rs_ctx->sig->state == ecdsa_sig_modn ) goto modn; } #endif /* MBEDTLS_ECP_RESTARTABLE */ *p_sign_tries = 0; do { if( *p_sign_tries++ > 10 ) { ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; goto cleanup; } /* * Steps 1-3: generate a suitable ephemeral keypair * and set r = xR mod n */ *p_key_tries = 0; do { if( *p_key_tries++ > 10 ) { ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, pk, f_rng, p_rng ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) rs_ctx->sig->state = ecdsa_sig_mul; mul: #endif MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, &R, pk, &grp->G, f_rng, p_rng, ECDSA_RS_ECP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( pr, &R.X, &grp->N ) ); } while( mbedtls_mpi_cmp_int( pr, 0 ) == 0 ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) rs_ctx->sig->state = ecdsa_sig_modn; modn: #endif /* * Accounting for everything up to the end of the loop * (step 6, but checking now avoids saving e and t) */ ECDSA_BUDGET( MBEDTLS_ECP_OPS_INV + 4 ); /* * Step 5: derive MPI from hashed message */ MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) ); /* * Generate a random value to blind inv_mod in next step, * avoiding a potential timing leak. */ MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, &t, f_rng, p_rng ) ); /* * Step 6: compute s = (e + r * d) / k = t (e + rd) / (kt) mod n */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, pr, d ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &e, &e, s ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &e, &e, &t ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( pk, pk, &t ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( s, pk, &grp->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, s, &e ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( s, s, &grp->N ) ); } while( mbedtls_mpi_cmp_int( s, 0 ) == 0 ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) mbedtls_mpi_copy( r, pr ); #endif cleanup: mbedtls_ecp_point_free( &R ); mbedtls_mpi_free( &k ); mbedtls_mpi_free( &e ); mbedtls_mpi_free( &t ); ECDSA_RS_LEAVE( sig ); return( ret ); } /* * Compute ECDSA signature of a hashed message */ int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDSA_VALIDATE_RET( grp != NULL ); ECDSA_VALIDATE_RET( r != NULL ); ECDSA_VALIDATE_RET( s != NULL ); ECDSA_VALIDATE_RET( d != NULL ); ECDSA_VALIDATE_RET( f_rng != NULL ); ECDSA_VALIDATE_RET( buf != NULL || blen == 0 ); return( ecdsa_sign_restartable( grp, r, s, d, buf, blen, f_rng, p_rng, NULL ) ); } #endif /* !MBEDTLS_ECDSA_SIGN_ALT */ #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /* * Deterministic signature wrapper */ static int ecdsa_sign_det_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, mbedtls_md_type_t md_alg, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; mbedtls_hmac_drbg_context rng_ctx; mbedtls_hmac_drbg_context *p_rng = &rng_ctx; unsigned char data[2 * MBEDTLS_ECP_MAX_BYTES]; size_t grp_len = ( grp->nbits + 7 ) / 8; const mbedtls_md_info_t *md_info; mbedtls_mpi h; if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); mbedtls_mpi_init( &h ); mbedtls_hmac_drbg_init( &rng_ctx ); ECDSA_RS_ENTER( det ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->det != NULL ) { /* redirect to our context */ p_rng = &rs_ctx->det->rng_ctx; /* jump to current step */ if( rs_ctx->det->state == ecdsa_det_sign ) goto sign; } #endif /* MBEDTLS_ECP_RESTARTABLE */ /* Use private key and message hash (reduced) to initialize HMAC_DRBG */ MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( d, data, grp_len ) ); MBEDTLS_MPI_CHK( derive_mpi( grp, &h, buf, blen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, data + grp_len, grp_len ) ); mbedtls_hmac_drbg_seed_buf( p_rng, md_info, data, 2 * grp_len ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->det != NULL ) rs_ctx->det->state = ecdsa_det_sign; sign: #endif #if defined(MBEDTLS_ECDSA_SIGN_ALT) ret = mbedtls_ecdsa_sign( grp, r, s, d, buf, blen, mbedtls_hmac_drbg_random, p_rng ); #else ret = ecdsa_sign_restartable( grp, r, s, d, buf, blen, mbedtls_hmac_drbg_random, p_rng, rs_ctx ); #endif /* MBEDTLS_ECDSA_SIGN_ALT */ cleanup: mbedtls_hmac_drbg_free( &rng_ctx ); mbedtls_mpi_free( &h ); ECDSA_RS_LEAVE( det ); return( ret ); } /* * Deterministic signature wrapper */ int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, mbedtls_md_type_t md_alg ) { ECDSA_VALIDATE_RET( grp != NULL ); ECDSA_VALIDATE_RET( r != NULL ); ECDSA_VALIDATE_RET( s != NULL ); ECDSA_VALIDATE_RET( d != NULL ); ECDSA_VALIDATE_RET( buf != NULL || blen == 0 ); return( ecdsa_sign_det_restartable( grp, r, s, d, buf, blen, md_alg, NULL ) ); } #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ #if !defined(MBEDTLS_ECDSA_VERIFY_ALT) /* * Verify ECDSA signature of hashed message (SEC1 4.1.4) * Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message) */ static int ecdsa_verify_restartable( mbedtls_ecp_group *grp, const unsigned char *buf, size_t blen, const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; mbedtls_mpi e, s_inv, u1, u2; mbedtls_ecp_point R; mbedtls_mpi *pu1 = &u1, *pu2 = &u2; mbedtls_ecp_point_init( &R ); mbedtls_mpi_init( &e ); mbedtls_mpi_init( &s_inv ); mbedtls_mpi_init( &u1 ); mbedtls_mpi_init( &u2 ); /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */ if( grp->N.p == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); ECDSA_RS_ENTER( ver ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ver != NULL ) { /* redirect to our context */ pu1 = &rs_ctx->ver->u1; pu2 = &rs_ctx->ver->u2; /* jump to current step */ if( rs_ctx->ver->state == ecdsa_ver_muladd ) goto muladd; } #endif /* MBEDTLS_ECP_RESTARTABLE */ /* * Step 1: make sure r and s are in range 1..n-1 */ if( mbedtls_mpi_cmp_int( r, 1 ) < 0 || mbedtls_mpi_cmp_mpi( r, &grp->N ) >= 0 || mbedtls_mpi_cmp_int( s, 1 ) < 0 || mbedtls_mpi_cmp_mpi( s, &grp->N ) >= 0 ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } /* * Step 3: derive MPI from hashed message */ MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) ); /* * Step 4: u1 = e / s mod n, u2 = r / s mod n */ ECDSA_BUDGET( MBEDTLS_ECP_OPS_CHK + MBEDTLS_ECP_OPS_INV + 2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &s_inv, s, &grp->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( pu1, &e, &s_inv ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( pu1, pu1, &grp->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( pu2, r, &s_inv ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( pu2, pu2, &grp->N ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ver != NULL ) rs_ctx->ver->state = ecdsa_ver_muladd; muladd: #endif /* * Step 5: R = u1 G + u2 Q */ MBEDTLS_MPI_CHK( mbedtls_ecp_muladd_restartable( grp, &R, pu1, &grp->G, pu2, Q, ECDSA_RS_ECP ) ); if( mbedtls_ecp_is_zero( &R ) ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } /* * Step 6: convert xR to an integer (no-op) * Step 7: reduce xR mod n (gives v) */ MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &R.X, &R.X, &grp->N ) ); /* * Step 8: check if v (that is, R.X) is equal to r */ if( mbedtls_mpi_cmp_mpi( &R.X, r ) != 0 ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } cleanup: mbedtls_ecp_point_free( &R ); mbedtls_mpi_free( &e ); mbedtls_mpi_free( &s_inv ); mbedtls_mpi_free( &u1 ); mbedtls_mpi_free( &u2 ); ECDSA_RS_LEAVE( ver ); return( ret ); } /* * Verify ECDSA signature of hashed message */ int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, const unsigned char *buf, size_t blen, const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s) { ECDSA_VALIDATE_RET( grp != NULL ); ECDSA_VALIDATE_RET( Q != NULL ); ECDSA_VALIDATE_RET( r != NULL ); ECDSA_VALIDATE_RET( s != NULL ); ECDSA_VALIDATE_RET( buf != NULL || blen == 0 ); return( ecdsa_verify_restartable( grp, buf, blen, Q, r, s, NULL ) ); } #endif /* !MBEDTLS_ECDSA_VERIFY_ALT */ /* * Convert a signature (given by context) to ASN.1 */ static int ecdsa_signature_to_asn1( const mbedtls_mpi *r, const mbedtls_mpi *s, unsigned char *sig, size_t *slen ) { int ret; unsigned char buf[MBEDTLS_ECDSA_MAX_LEN]; unsigned char *p = buf + sizeof( buf ); size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, s ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, r ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &p, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &p, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); memcpy( sig, p, len ); *slen = len; return( 0 ); } /* * Compute and write signature */ int mbedtls_ecdsa_write_signature_restartable( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; mbedtls_mpi r, s; ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); ECDSA_VALIDATE_RET( slen != NULL ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s ); #if defined(MBEDTLS_ECDSA_DETERMINISTIC) (void) f_rng; (void) p_rng; MBEDTLS_MPI_CHK( ecdsa_sign_det_restartable( &ctx->grp, &r, &s, &ctx->d, hash, hlen, md_alg, rs_ctx ) ); #else (void) md_alg; #if defined(MBEDTLS_ECDSA_SIGN_ALT) MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign( &ctx->grp, &r, &s, &ctx->d, hash, hlen, f_rng, p_rng ) ); #else MBEDTLS_MPI_CHK( ecdsa_sign_restartable( &ctx->grp, &r, &s, &ctx->d, hash, hlen, f_rng, p_rng, rs_ctx ) ); #endif /* MBEDTLS_ECDSA_SIGN_ALT */ #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ MBEDTLS_MPI_CHK( ecdsa_signature_to_asn1( &r, &s, sig, slen ) ); cleanup: mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s ); return( ret ); } /* * Compute and write signature */ int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); ECDSA_VALIDATE_RET( slen != NULL ); return( mbedtls_ecdsa_write_signature_restartable( ctx, md_alg, hash, hlen, sig, slen, f_rng, p_rng, NULL ) ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) && \ defined(MBEDTLS_ECDSA_DETERMINISTIC) int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, mbedtls_md_type_t md_alg ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); ECDSA_VALIDATE_RET( slen != NULL ); return( mbedtls_ecdsa_write_signature( ctx, md_alg, hash, hlen, sig, slen, NULL, NULL ) ); } #endif /* * Read and check signature */ int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); return( mbedtls_ecdsa_read_signature_restartable( ctx, hash, hlen, sig, slen, NULL ) ); } /* * Restartable read and check signature */ int mbedtls_ecdsa_read_signature_restartable( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; unsigned char *p = (unsigned char *) sig; const unsigned char *end = sig + slen; size_t len; mbedtls_mpi r, s; ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } if( p + len != end ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; goto cleanup; } if( ( ret = mbedtls_asn1_get_mpi( &p, end, &r ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &s ) ) != 0 ) { ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } #if defined(MBEDTLS_ECDSA_VERIFY_ALT) if( ( ret = mbedtls_ecdsa_verify( &ctx->grp, hash, hlen, &ctx->Q, &r, &s ) ) != 0 ) goto cleanup; #else if( ( ret = ecdsa_verify_restartable( &ctx->grp, hash, hlen, &ctx->Q, &r, &s, rs_ctx ) ) != 0 ) goto cleanup; #endif /* MBEDTLS_ECDSA_VERIFY_ALT */ /* At this point we know that the buffer starts with a valid signature. * Return 0 if the buffer just contains the signature, and a specific * error code if the valid signature is followed by more data. */ if( p != end ) ret = MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH; cleanup: mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s ); return( ret ); } #if !defined(MBEDTLS_ECDSA_GENKEY_ALT) /* * Generate key pair */ int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( f_rng != NULL ); return( mbedtls_ecp_group_load( &ctx->grp, gid ) || mbedtls_ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ); } #endif /* !MBEDTLS_ECDSA_GENKEY_ALT */ /* * Set context from an mbedtls_ecp_keypair */ int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key ) { int ret; ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( key != NULL ); if( ( ret = mbedtls_ecp_group_copy( &ctx->grp, &key->grp ) ) != 0 || ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 || ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 ) { mbedtls_ecdsa_free( ctx ); } return( ret ); } /* * Initialize context */ void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx ) { ECDSA_VALIDATE( ctx != NULL ); mbedtls_ecp_keypair_init( ctx ); } /* * Free context */ void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx ) { if( ctx == NULL ) return; mbedtls_ecp_keypair_free( ctx ); } #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Initialize a restart context */ void mbedtls_ecdsa_restart_init( mbedtls_ecdsa_restart_ctx *ctx ) { ECDSA_VALIDATE( ctx != NULL ); mbedtls_ecp_restart_init( &ctx->ecp ); ctx->ver = NULL; ctx->sig = NULL; #if defined(MBEDTLS_ECDSA_DETERMINISTIC) ctx->det = NULL; #endif } /* * Free the components of a restart context */ void mbedtls_ecdsa_restart_free( mbedtls_ecdsa_restart_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_ecp_restart_free( &ctx->ecp ); ecdsa_restart_ver_free( ctx->ver ); mbedtls_free( ctx->ver ); ctx->ver = NULL; ecdsa_restart_sig_free( ctx->sig ); mbedtls_free( ctx->sig ); ctx->sig = NULL; #if defined(MBEDTLS_ECDSA_DETERMINISTIC) ecdsa_restart_det_free( ctx->det ); mbedtls_free( ctx->det ); ctx->det = NULL; #endif } #endif /* MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_ECDSA_C */ fldigi-4.1.06/src/mbedtls/padlock.c0000664000175000017500000001155113507401434013771 00000000000000/* * VIA PadLock support functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * This implementation is based on the VIA PadLock Programming Guide: * * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/ * programming_guide.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PADLOCK_C) #include "mbedtls/padlock.h" #include #ifndef asm #define asm __asm #endif #if defined(MBEDTLS_HAVE_X86) /* * PadLock detection routine */ int mbedtls_padlock_has_support( int feature ) { static int flags = -1; int ebx = 0, edx = 0; if( flags == -1 ) { asm( "movl %%ebx, %0 \n\t" "movl $0xC0000000, %%eax \n\t" "cpuid \n\t" "cmpl $0xC0000001, %%eax \n\t" "movl $0, %%edx \n\t" "jb unsupported \n\t" "movl $0xC0000001, %%eax \n\t" "cpuid \n\t" "unsupported: \n\t" "movl %%edx, %1 \n\t" "movl %2, %%ebx \n\t" : "=m" (ebx), "=m" (edx) : "m" (ebx) : "eax", "ecx", "edx" ); flags = edx; } return( flags & feature ); } /* * PadLock AES-ECB block en(de)cryption */ int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { int ebx = 0; uint32_t *rk; uint32_t *blk; uint32_t *ctrl; unsigned char buf[256]; rk = ctx->rk; blk = MBEDTLS_PADLOCK_ALIGN16( buf ); memcpy( blk, input, 16 ); ctrl = blk + 4; *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 ); asm( "pushfl \n\t" "popfl \n\t" "movl %%ebx, %0 \n\t" "movl $1, %%ecx \n\t" "movl %2, %%edx \n\t" "movl %3, %%ebx \n\t" "movl %4, %%esi \n\t" "movl %4, %%edi \n\t" ".byte 0xf3,0x0f,0xa7,0xc8 \n\t" "movl %1, %%ebx \n\t" : "=m" (ebx) : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk) : "memory", "ecx", "edx", "esi", "edi" ); memcpy( output, blk, 16 ); return( 0 ); } /* * PadLock AES-CBC buffer en(de)cryption */ int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int ebx = 0; size_t count; uint32_t *rk; uint32_t *iw; uint32_t *ctrl; unsigned char buf[256]; if( ( (long) input & 15 ) != 0 || ( (long) output & 15 ) != 0 ) return( MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED ); rk = ctx->rk; iw = MBEDTLS_PADLOCK_ALIGN16( buf ); memcpy( iw, iv, 16 ); ctrl = iw + 4; *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode ^ 1 ) - 10 ) << 9 ); count = ( length + 15 ) >> 4; asm( "pushfl \n\t" "popfl \n\t" "movl %%ebx, %0 \n\t" "movl %2, %%ecx \n\t" "movl %3, %%edx \n\t" "movl %4, %%ebx \n\t" "movl %5, %%esi \n\t" "movl %6, %%edi \n\t" "movl %7, %%eax \n\t" ".byte 0xf3,0x0f,0xa7,0xd0 \n\t" "movl %1, %%ebx \n\t" : "=m" (ebx) : "m" (ebx), "m" (count), "m" (ctrl), "m" (rk), "m" (input), "m" (output), "m" (iw) : "memory", "eax", "ecx", "edx", "esi", "edi" ); memcpy( iv, iw, 16 ); return( 0 ); } #endif /* MBEDTLS_HAVE_X86 */ #endif /* MBEDTLS_PADLOCK_C */ fldigi-4.1.06/src/mbedtls/pkcs5.c0000664000175000017500000002742113507401434013404 00000000000000/** * \file pkcs5.c * * \brief PKCS#5 functions * * \author Mathias Olsson * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * PKCS#5 includes PBKDF2 and more * * http://tools.ietf.org/html/rfc2898 (Specification) * http://tools.ietf.org/html/rfc6070 (Test vectors) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PKCS5_C) #include "mbedtls/pkcs5.h" #if defined(MBEDTLS_ASN1_PARSE_C) #include "mbedtls/asn1.h" #include "mbedtls/cipher.h" #include "mbedtls/oid.h" #endif /* MBEDTLS_ASN1_PARSE_C */ #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif #if defined(MBEDTLS_ASN1_PARSE_C) static int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params, mbedtls_asn1_buf *salt, int *iterations, int *keylen, mbedtls_md_type_t *md_type ) { int ret; mbedtls_asn1_buf prf_alg_oid; unsigned char *p = params->p; const unsigned char *end = params->p + params->len; if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); /* * PBKDF2-params ::= SEQUENCE { * salt OCTET STRING, * iterationCount INTEGER, * keyLength INTEGER OPTIONAL * prf AlgorithmIdentifier DEFAULT algid-hmacWithSHA1 * } * */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); salt->p = p; p += salt->len; if( ( ret = mbedtls_asn1_get_int( &p, end, iterations ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); if( p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_int( &p, end, keylen ) ) != 0 ) { if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); } if( p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_alg_null( &p, end, &prf_alg_oid ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); if( mbedtls_oid_get_md_hmac( &prf_alg_oid, md_type ) != 0 ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); if( p != end ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t datalen, unsigned char *output ) { int ret, iterations = 0, keylen = 0; unsigned char *p, *end; mbedtls_asn1_buf kdf_alg_oid, enc_scheme_oid, kdf_alg_params, enc_scheme_params; mbedtls_asn1_buf salt; mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1; unsigned char key[32], iv[32]; size_t olen = 0; const mbedtls_md_info_t *md_info; const mbedtls_cipher_info_t *cipher_info; mbedtls_md_context_t md_ctx; mbedtls_cipher_type_t cipher_alg; mbedtls_cipher_context_t cipher_ctx; p = pbe_params->p; end = p + pbe_params->len; /* * PBES2-params ::= SEQUENCE { * keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, * encryptionScheme AlgorithmIdentifier {{PBES2-Encs}} * } */ if( pbe_params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); if( ( ret = mbedtls_asn1_get_alg( &p, end, &kdf_alg_oid, &kdf_alg_params ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); // Only PBKDF2 supported at the moment // if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBKDF2, &kdf_alg_oid ) != 0 ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); if( ( ret = pkcs5_parse_pbkdf2_params( &kdf_alg_params, &salt, &iterations, &keylen, &md_type ) ) != 0 ) { return( ret ); } md_info = mbedtls_md_info_from_type( md_type ); if( md_info == NULL ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); if( ( ret = mbedtls_asn1_get_alg( &p, end, &enc_scheme_oid, &enc_scheme_params ) ) != 0 ) { return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); } if( mbedtls_oid_get_cipher_alg( &enc_scheme_oid, &cipher_alg ) != 0 ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); cipher_info = mbedtls_cipher_info_from_type( cipher_alg ); if( cipher_info == NULL ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); /* * The value of keylen from pkcs5_parse_pbkdf2_params() is ignored * since it is optional and we don't know if it was set or not */ keylen = cipher_info->key_bitlen / 8; if( enc_scheme_params.tag != MBEDTLS_ASN1_OCTET_STRING || enc_scheme_params.len != cipher_info->iv_size ) { return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT ); } mbedtls_md_init( &md_ctx ); mbedtls_cipher_init( &cipher_ctx ); memcpy( iv, enc_scheme_params.p, enc_scheme_params.len ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) goto exit; if( ( ret = mbedtls_pkcs5_pbkdf2_hmac( &md_ctx, pwd, pwdlen, salt.p, salt.len, iterations, keylen, key ) ) != 0 ) { goto exit; } if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_crypt( &cipher_ctx, iv, enc_scheme_params.len, data, datalen, output, &olen ) ) != 0 ) ret = MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH; exit: mbedtls_md_free( &md_ctx ); mbedtls_cipher_free( &cipher_ctx ); return( ret ); } #endif /* MBEDTLS_ASN1_PARSE_C */ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password, size_t plen, const unsigned char *salt, size_t slen, unsigned int iteration_count, uint32_t key_length, unsigned char *output ) { int ret, j; unsigned int i; unsigned char md1[MBEDTLS_MD_MAX_SIZE]; unsigned char work[MBEDTLS_MD_MAX_SIZE]; unsigned char md_size = mbedtls_md_get_size( ctx->md_info ); size_t use_len; unsigned char *out_p = output; unsigned char counter[4]; memset( counter, 0, 4 ); counter[3] = 1; #if UINT_MAX > 0xFFFFFFFF if( iteration_count > 0xFFFFFFFF ) return( MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA ); #endif while( key_length ) { // U1 ends up in work // if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_update( ctx, salt, slen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_update( ctx, counter, 4 ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_finish( ctx, work ) ) != 0 ) return( ret ); memcpy( md1, work, md_size ); for( i = 1; i < iteration_count; i++ ) { // U2 ends up in md1 // if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_update( ctx, md1, md_size ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_finish( ctx, md1 ) ) != 0 ) return( ret ); // U1 xor U2 // for( j = 0; j < md_size; j++ ) work[j] ^= md1[j]; } use_len = ( key_length < md_size ) ? key_length : md_size; memcpy( out_p, work, use_len ); key_length -= (uint32_t) use_len; out_p += use_len; for( i = 4; i > 0; i-- ) if( ++counter[i - 1] != 0 ) break; } return( 0 ); } #if defined(MBEDTLS_SELF_TEST) #if !defined(MBEDTLS_SHA1_C) int mbedtls_pkcs5_self_test( int verbose ) { if( verbose != 0 ) mbedtls_printf( " PBKDF2 (SHA1): skipped\n\n" ); return( 0 ); } #else #define MAX_TESTS 6 static const size_t plen[MAX_TESTS] = { 8, 8, 8, 24, 9 }; static const unsigned char password[MAX_TESTS][32] = { "password", "password", "password", "passwordPASSWORDpassword", "pass\0word", }; static const size_t slen[MAX_TESTS] = { 4, 4, 4, 36, 5 }; static const unsigned char salt[MAX_TESTS][40] = { "salt", "salt", "salt", "saltSALTsaltSALTsaltSALTsaltSALTsalt", "sa\0lt", }; static const uint32_t it_cnt[MAX_TESTS] = { 1, 2, 4096, 4096, 4096 }; static const uint32_t key_len[MAX_TESTS] = { 20, 20, 20, 25, 16 }; static const unsigned char result_key[MAX_TESTS][32] = { { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, 0x2f, 0xe0, 0x37, 0xa6 }, { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, 0xd8, 0xde, 0x89, 0x57 }, { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, 0x65, 0xa4, 0x29, 0xc1 }, { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, 0x38 }, { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 }, }; int mbedtls_pkcs5_self_test( int verbose ) { mbedtls_md_context_t sha1_ctx; const mbedtls_md_info_t *info_sha1; int ret, i; unsigned char key[64]; mbedtls_md_init( &sha1_ctx ); info_sha1 = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ); if( info_sha1 == NULL ) { ret = 1; goto exit; } if( ( ret = mbedtls_md_setup( &sha1_ctx, info_sha1, 1 ) ) != 0 ) { ret = 1; goto exit; } for( i = 0; i < MAX_TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " PBKDF2 (SHA1) #%d: ", i ); ret = mbedtls_pkcs5_pbkdf2_hmac( &sha1_ctx, password[i], plen[i], salt[i], slen[i], it_cnt[i], key_len[i], key ); if( ret != 0 || memcmp( result_key[i], key, key_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_md_free( &sha1_ctx ); return( ret ); } #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_PKCS5_C */ fldigi-4.1.06/src/mbedtls/ssl_srv.c0000664000175000017500000045212713507401434014057 00000000000000/* * SSLv3/TLSv1 server-side functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_SRV_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, const unsigned char *info, size_t ilen ) { if( ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); mbedtls_free( ssl->cli_id ); if( ( ssl->cli_id = mbedtls_calloc( 1, ilen ) ) == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); memcpy( ssl->cli_id, info, ilen ); ssl->cli_id_len = ilen; return( 0 ); } void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf, mbedtls_ssl_cookie_write_t *f_cookie_write, mbedtls_ssl_cookie_check_t *f_cookie_check, void *p_cookie ) { conf->f_cookie_write = f_cookie_write; conf->f_cookie_check = f_cookie_check; conf->p_cookie = p_cookie; } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; size_t servername_list_size, hostname_len; const unsigned char *p; MBEDTLS_SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) ); if( len < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); if( servername_list_size + 2 != len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } p = buf + 2; while( servername_list_size > 2 ) { hostname_len = ( ( p[1] << 8 ) | p[2] ); if( hostname_len + 3 > servername_list_size ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) { ret = ssl->conf->f_sni( ssl->conf->p_sni, ssl, p + 3, hostname_len ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } return( 0 ); } servername_list_size -= hostname_len + 3; p += hostname_len + 3; } if( servername_list_size != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } return( 0 ); } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { /* Check verify-data in constant-time. The length OTOH is no secret */ if( len != 1 + ssl->verify_data_len || buf[0] != ssl->verify_data_len || mbedtls_ssl_safer_memcmp( buf + 1, ssl->peer_verify_data, ssl->verify_data_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { if( len != 1 || buf[0] != 0x0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; } return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Status of the implementation of signature-algorithms extension: * * Currently, we are only considering the signature-algorithm extension * to pick a ciphersuite which allows us to send the ServerKeyExchange * message with a signature-hash combination that the user allows. * * We do *not* check whether all certificates in our certificate * chain are signed with an allowed signature-hash pair. * This needs to be done at a later stage. * */ static int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t sig_alg_list_size; const unsigned char *p; const unsigned char *end = buf + len; mbedtls_md_type_t md_cur; mbedtls_pk_type_t sig_cur; if ( len < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); if( sig_alg_list_size + 2 != len || sig_alg_list_size % 2 != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Currently we only guarantee signing the ServerKeyExchange message according * to the constraints specified in this extension (see above), so it suffices * to remember only one suitable hash for each possible signature algorithm. * * This will change when we also consider certificate signatures, * in which case we will need to remember the whole signature-hash * pair list from the extension. */ for( p = buf + 2; p < end; p += 2 ) { /* Silently ignore unknown signature or hash algorithms. */ if( ( sig_cur = mbedtls_ssl_pk_alg_from_sig( p[1] ) ) == MBEDTLS_PK_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext" " unknown sig alg encoding %d", p[1] ) ); continue; } /* Check if we support the hash the user proposes */ md_cur = mbedtls_ssl_md_alg_from_hash( p[0] ); if( md_cur == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:" " unknown hash alg encoding %d", p[0] ) ); continue; } if( mbedtls_ssl_check_sig_hash( ssl, md_cur ) == 0 ) { mbedtls_ssl_sig_hash_set_add( &ssl->handshake->hash_algs, sig_cur, md_cur ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:" " match sig %d and hash %d", sig_cur, md_cur ) ); } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: " "hash alg %d not supported", md_cur ) ); } } return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_size, our_size; const unsigned char *p; const mbedtls_ecp_curve_info *curve_info, **curves; if ( len < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); if( list_size + 2 != len || list_size % 2 != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Should never happen unless client duplicates the extension */ if( ssl->handshake->curves != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Don't allow our peer to make us allocate too much memory, * and leave room for a final 0 */ our_size = list_size / 2 + 1; if( our_size > MBEDTLS_ECP_DP_MAX ) our_size = MBEDTLS_ECP_DP_MAX; if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } ssl->handshake->curves = curves; p = buf + 2; while( list_size > 0 && our_size > 1 ) { curve_info = mbedtls_ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] ); if( curve_info != NULL ) { *curves++ = curve_info; our_size--; } list_size -= 2; p += 2; } return( 0 ); } static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_size; const unsigned char *p; if( len == 0 || (size_t)( buf[0] + 1 ) != len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } list_size = buf[0]; p = buf + 1; while( list_size > 0 ) { if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED || p[0] == MBEDTLS_ECP_PF_COMPRESSED ) { #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) ssl->handshake->ecdh_ctx.point_format = p[0]; #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl->handshake->ecjpake_ctx.point_format = p[0]; #endif MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) ); return( 0 ); } list_size--; p++; } return( 0 ); } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) ); return( 0 ); } if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx, buf, len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( ret ); } /* Only mark the extension as OK when we're sure it is */ ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->session_negotiate->mfl_code = buf[0]; return( 0 ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ((void) buf); if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED ) ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ((void) buf); if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED && ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; } return( 0 ); } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ((void) buf); if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED && ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; } return( 0 ); } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ) { int ret; mbedtls_ssl_session session; mbedtls_ssl_session_init( &session ); if( ssl->conf->f_ticket_parse == NULL || ssl->conf->f_ticket_write == NULL ) { return( 0 ); } /* Remember the client asked us to send a new ticket */ ssl->handshake->new_session_ticket = 1; MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) ); if( len == 0 ) return( 0 ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* * Failures are ok: just ignore the ticket and proceed. */ if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket, &session, buf, len ) ) != 0 ) { mbedtls_ssl_session_free( &session ); if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is not authentic" ) ); else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED ) MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is expired" ) ); else MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_parse", ret ); return( 0 ); } /* * Keep the session ID sent by the client, since we MUST send it back to * inform them we're accepting the ticket (RFC 5077 section 3.4) */ session.id_len = ssl->session_negotiate->id_len; memcpy( &session.id, ssl->session_negotiate->id, session.id_len ); mbedtls_ssl_session_free( ssl->session_negotiate ); memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) ); /* Zeroize instead of free as we copied the content */ mbedtls_platform_zeroize( &session, sizeof( mbedtls_ssl_session ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) ); ssl->handshake->resume = 1; /* Don't send a new ticket after all, this one is OK */ ssl->handshake->new_session_ticket = 0; return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_ALPN) static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_len, cur_len, ours_len; const unsigned char *theirs, *start, *end; const char **ours; /* If ALPN not configured, just ignore the extension */ if( ssl->conf->alpn_list == NULL ) return( 0 ); /* * opaque ProtocolName<1..2^8-1>; * * struct { * ProtocolName protocol_name_list<2..2^16-1> * } ProtocolNameList; */ /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ if( len < 4 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } list_len = ( buf[0] << 8 ) | buf[1]; if( list_len != len - 2 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* * Validate peer's list (lengths) */ start = buf + 2; end = buf + len; for( theirs = start; theirs != end; theirs += cur_len ) { cur_len = *theirs++; /* Current identifier must fit in list */ if( cur_len > (size_t)( end - theirs ) ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Empty strings MUST NOT be included */ if( cur_len == 0 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } /* * Use our order of preference */ for( ours = ssl->conf->alpn_list; *ours != NULL; ours++ ) { ours_len = strlen( *ours ); for( theirs = start; theirs != end; theirs += cur_len ) { cur_len = *theirs++; if( cur_len == ours_len && memcmp( theirs, *ours, cur_len ) == 0 ) { ssl->alpn_chosen = *ours; return( 0 ); } } } /* If we get there, no match was found */ mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif /* MBEDTLS_SSL_ALPN */ /* * Auxiliary functions for ServerHello parsing and related actions */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * Return 0 if the given key uses one of the acceptable curves, -1 otherwise */ #if defined(MBEDTLS_ECDSA_C) static int ssl_check_key_curve( mbedtls_pk_context *pk, const mbedtls_ecp_curve_info **curves ) { const mbedtls_ecp_curve_info **crv = curves; mbedtls_ecp_group_id grp_id = mbedtls_pk_ec( *pk )->grp.id; while( *crv != NULL ) { if( (*crv)->grp_id == grp_id ) return( 0 ); crv++; } return( -1 ); } #endif /* MBEDTLS_ECDSA_C */ /* * Try picking a certificate for this ciphersuite, * return 0 on success and -1 on failure. */ static int ssl_pick_cert( mbedtls_ssl_context *ssl, const mbedtls_ssl_ciphersuite_t * ciphersuite_info ) { mbedtls_ssl_key_cert *cur, *list, *fallback = NULL; mbedtls_pk_type_t pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); uint32_t flags; #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_key_cert != NULL ) list = ssl->handshake->sni_key_cert; else #endif list = ssl->conf->key_cert; if( pk_alg == MBEDTLS_PK_NONE ) return( 0 ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite requires certificate" ) ); if( list == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) ); return( -1 ); } for( cur = list; cur != NULL; cur = cur->next ) { MBEDTLS_SSL_DEBUG_CRT( 3, "candidate certificate chain, certificate", cur->cert ); if( ! mbedtls_pk_can_do( &cur->cert->pk, pk_alg ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: key type" ) ); continue; } /* * This avoids sending the client a cert it'll reject based on * keyUsage or other extensions. * * It also allows the user to provision different certificates for * different uses based on keyUsage, eg if they want to avoid signing * and decrypting with the same RSA key. */ if( mbedtls_ssl_check_cert_usage( cur->cert, ciphersuite_info, MBEDTLS_SSL_IS_SERVER, &flags ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: " "(extended) key usage extension" ) ); continue; } #if defined(MBEDTLS_ECDSA_C) if( pk_alg == MBEDTLS_PK_ECDSA && ssl_check_key_curve( &cur->cert->pk, ssl->handshake->curves ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: elliptic curve" ) ); continue; } #endif /* * Try to select a SHA-1 certificate for pre-1.2 clients, but still * present them a SHA-higher cert rather than failing if it's the only * one we got that satisfies the other conditions. */ if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 && cur->cert->sig_md != MBEDTLS_MD_SHA1 ) { if( fallback == NULL ) fallback = cur; { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate not preferred: " "sha-2 with pre-TLS 1.2 client" ) ); continue; } } /* If we get there, we got a winner */ break; } if( cur == NULL ) cur = fallback; /* Do not update ssl->handshake->key_cert unless there is a match */ if( cur != NULL ) { ssl->handshake->key_cert = cur; MBEDTLS_SSL_DEBUG_CRT( 3, "selected certificate chain, certificate", ssl->handshake->key_cert->cert ); return( 0 ); } return( -1 ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ /* * Check if a given ciphersuite is suitable for use with our config/keys/etc * Sets ciphersuite_info only if the suite matches. */ static int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id, const mbedtls_ssl_ciphersuite_t **ciphersuite_info ) { const mbedtls_ssl_ciphersuite_t *suite_info; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) mbedtls_pk_type_t sig_type; #endif suite_info = mbedtls_ssl_ciphersuite_from_id( suite_id ); if( suite_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "trying ciphersuite: %s", suite_info->name ) ); if( suite_info->min_minor_ver > ssl->minor_ver || suite_info->max_minor_ver < ssl->minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: version" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) ) return( 0 ); #endif #if defined(MBEDTLS_ARC4_C) if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED && suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: rc4" ) ); return( 0 ); } #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE && ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: ecjpake " "not configured or ext missing" ) ); return( 0 ); } #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) && ( ssl->handshake->curves == NULL || ssl->handshake->curves[0] == NULL ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: " "no common elliptic curve" ) ); return( 0 ); } #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) /* If the ciphersuite requires a pre-shared key and we don't * have one, skip it now rather than failing later */ if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) && ssl->conf->f_psk == NULL && ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL || ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no pre-shared key" ) ); return( 0 ); } #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* If the ciphersuite requires signing, check whether * a suitable hash algorithm is present. */ if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { sig_type = mbedtls_ssl_get_ciphersuite_sig_alg( suite_info ); if( sig_type != MBEDTLS_PK_NONE && mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_type ) == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no suitable hash algorithm " "for signature algorithm %d", sig_type ) ); return( 0 ); } } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * Final check: if ciphersuite requires us to have a * certificate/key of a particular type: * - select the appropriate certificate if we have one, or * - try the next ciphersuite if we don't * This must be done last since we modify the key_cert list. */ if( ssl_pick_cert( ssl, suite_info ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: " "no suitable certificate" ) ); return( 0 ); } #endif *ciphersuite_info = suite_info; return( 0 ); } #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) static int ssl_parse_client_hello_v2( mbedtls_ssl_context *ssl ) { int ret, got_common_suite; unsigned int i, j; size_t n; unsigned int ciph_len, sess_len, chal_len; unsigned char *buf, *p; const int *ciphersuites; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ buf = ssl->in_hdr; MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, 5 ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d", buf[2] ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d", ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]", buf[3], buf[4] ) ); /* * SSLv2 Client Hello * * Record layer: * 0 . 1 message length * * SSL layer: * 2 . 2 message type * 3 . 4 protocol version */ if( buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO || buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF; if( n < 17 || n > 512 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; ssl->minor_ver = ( buf[4] <= ssl->conf->max_minor_ver ) ? buf[4] : ssl->conf->max_minor_ver; if( ssl->minor_ver < ssl->conf->min_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver, ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } ssl->handshake->max_major_ver = buf[3]; ssl->handshake->max_minor_ver = buf[4]; if( ( ret = mbedtls_ssl_fetch_input( ssl, 2 + n ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } ssl->handshake->update_checksum( ssl, buf + 2, n ); buf = ssl->in_msg; n = ssl->in_left - 5; /* * 0 . 1 ciphersuitelist length * 2 . 3 session id length * 4 . 5 challenge length * 6 . .. ciphersuitelist * .. . .. session id * .. . .. challenge */ MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, n ); ciph_len = ( buf[0] << 8 ) | buf[1]; sess_len = ( buf[2] << 8 ) | buf[3]; chal_len = ( buf[4] << 8 ) | buf[5]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d", ciph_len, sess_len, chal_len ) ); /* * Make sure each parameter length is valid */ if( ciph_len < 3 || ( ciph_len % 3 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( sess_len > 32 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( chal_len < 8 || chal_len > 32 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( n != 6 + ciph_len + sess_len + chal_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", buf + 6, ciph_len ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 6 + ciph_len, sess_len ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, challenge", buf + 6 + ciph_len + sess_len, chal_len ); p = buf + 6 + ciph_len; ssl->session_negotiate->id_len = sess_len; memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) ); memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->id_len ); p += sess_len; memset( ssl->handshake->randbytes, 0, 64 ); memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len ); /* * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 ) { if( p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV " "during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; break; } } #if defined(MBEDTLS_SSL_FALLBACK_SCSV) for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 ) { if( p[0] == 0 && p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) && p[2] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "received FALLBACK_SCSV" ) ); if( ssl->minor_ver < ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } break; } } #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ got_common_suite = 0; ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; ciphersuite_info = NULL; #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 ) for( i = 0; ciphersuites[i] != 0; i++ ) #else for( i = 0; ciphersuites[i] != 0; i++ ) for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 ) #endif { if( p[0] != 0 || p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) || p[2] != ( ( ciphersuites[i] ) & 0xFF ) ) continue; got_common_suite = 1; if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i], &ciphersuite_info ) ) != 0 ) return( ret ); if( ciphersuite_info != NULL ) goto have_ciphersuite_v2; } if( got_common_suite ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, " "but none of them usable" ) ); return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE ); } else { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); } have_ciphersuite_v2: MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) ); ssl->session_negotiate->ciphersuite = ciphersuites[i]; ssl->transform_negotiate->ciphersuite_info = ciphersuite_info; /* * SSLv2 Client Hello relevant renegotiation security checks */ if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->in_left = 0; ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ /* This function doesn't alert on errors that happen early during ClientHello parsing because they might indicate that the client is not talking SSL/TLS at all and would not understand our alert. */ static int ssl_parse_client_hello( mbedtls_ssl_context *ssl ) { int ret, got_common_suite; size_t i, j; size_t ciph_offset, comp_offset, ext_offset; size_t msg_len, ciph_len, sess_len, comp_len, ext_len; #if defined(MBEDTLS_SSL_PROTO_DTLS) size_t cookie_offset, cookie_len; #endif unsigned char *buf, *p, *ext; #if defined(MBEDTLS_SSL_RENEGOTIATION) int renegotiation_info_seen = 0; #endif int handshake_failure = 0; const int *ciphersuites; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; int major, minor; /* If there is no signature-algorithm extension present, * we need to fall back to the default values for allowed * signature-hash pairs. */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) int sig_hash_alg_ext_present = 0; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) ); #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) read_record_header: #endif /* * If renegotiating, then the input was read with mbedtls_ssl_read_record(), * otherwise read it ourselves manually in order to support SSLv2 * ClientHello, which doesn't use the same record layer format. */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 ) { /* No alert on a read error. */ MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } } buf = ssl->in_hdr; #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM ) #endif if( ( buf[0] & 0x80 ) != 0 ) return( ssl_parse_client_hello_v2( ssl ) ); #endif MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_hdr_len( ssl ) ); /* * SSLv3/TLS Client Hello * * Record layer: * 0 . 0 message type * 1 . 2 protocol version * 3 . 11 DTLS: epoch + record sequence number * 3 . 4 message length */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d", buf[0] ) ); if( buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d", ( ssl->in_len[0] << 8 ) | ssl->in_len[1] ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, protocol version: [%d:%d]", buf[1], buf[2] ) ); mbedtls_ssl_read_version( &major, &minor, ssl->conf->transport, buf + 1 ); /* According to RFC 5246 Appendix E.1, the version here is typically * "{03,00}, the lowest version number supported by the client, [or] the * value of ClientHello.client_version", so the only meaningful check here * is the major version shouldn't be less than 3 */ if( major < MBEDTLS_SSL_MAJOR_VERSION_3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* For DTLS if this is the initial handshake, remember the client sequence * number to use it in our next message (RFC 6347 4.2.1) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM #if defined(MBEDTLS_SSL_RENEGOTIATION) && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE #endif ) { /* Epoch should be 0 for initial handshakes */ if( ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } memcpy( ssl->cur_out_ctr + 2, ssl->in_ctr + 2, 6 ); #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) if( mbedtls_ssl_dtls_replay_check( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record, discarding" ) ); ssl->next_record_offset = 0; ssl->in_left = 0; goto read_record_header; } /* No MAC to check yet, so we can update right now */ mbedtls_ssl_dtls_replay_update( ssl ); #endif } #endif /* MBEDTLS_SSL_PROTO_DTLS */ msg_len = ( ssl->in_len[0] << 8 ) | ssl->in_len[1]; #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { /* Set by mbedtls_ssl_read_record() */ msg_len = ssl->in_hslen; } else #endif { if( msg_len > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) + msg_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } /* Done reading this record, get ready for the next one */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) ssl->next_record_offset = msg_len + mbedtls_ssl_hdr_len( ssl ); else #endif ssl->in_left = 0; } buf = ssl->in_msg; MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, msg_len ); ssl->handshake->update_checksum( ssl, buf, msg_len ); /* * Handshake layer: * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 5 DTLS only: message seqence number * 6 . 8 DTLS only: fragment offset * 9 . 11 DTLS only: fragment length */ if( msg_len < mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d", buf[0] ) ); if( buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d", ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) ); /* We don't support fragmentation of ClientHello (yet?) */ if( buf[1] != 0 || msg_len != mbedtls_ssl_hs_hdr_len( ssl ) + ( ( buf[2] << 8 ) | buf[3] ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { /* * Copy the client's handshake message_seq on initial handshakes, * check sequence number on renego. */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { /* This couldn't be done in ssl_prepare_handshake_record() */ unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; if( cli_msg_seq != ssl->handshake->in_msg_seq ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message_seq: " "%d (expected %d)", cli_msg_seq, ssl->handshake->in_msg_seq ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->handshake->in_msg_seq++; } else #endif { unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; ssl->handshake->out_msg_seq = cli_msg_seq; ssl->handshake->in_msg_seq = cli_msg_seq + 1; } /* * For now we don't support fragmentation, so make sure * fragment_offset == 0 and fragment_length == length */ if( ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 || memcmp( ssl->in_msg + 1, ssl->in_msg + 9, 3 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "ClientHello fragmentation not supported" ) ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ buf += mbedtls_ssl_hs_hdr_len( ssl ); msg_len -= mbedtls_ssl_hs_hdr_len( ssl ); /* * ClientHello layer: * 0 . 1 protocol version * 2 . 33 random bytes (starting with 4 bytes of Unix time) * 34 . 35 session id length (1 byte) * 35 . 34+x session id * 35+x . 35+x DTLS only: cookie length (1 byte) * 36+x . .. DTLS only: cookie * .. . .. ciphersuite list length (2 bytes) * .. . .. ciphersuite list * .. . .. compression alg. list length (1 byte) * .. . .. compression alg. list * .. . .. extensions length (2 bytes, optional) * .. . .. extensions (optional) */ /* * Minimal length (with everything empty and extensions ommitted) is * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can * read at least up to session id length without worrying. */ if( msg_len < 38 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* * Check and save the protocol version */ MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, version", buf, 2 ); mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver, ssl->conf->transport, buf ); ssl->handshake->max_major_ver = ssl->major_ver; ssl->handshake->max_minor_ver = ssl->minor_ver; if( ssl->major_ver < ssl->conf->min_major_ver || ssl->minor_ver < ssl->conf->min_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver, ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } if( ssl->major_ver > ssl->conf->max_major_ver ) { ssl->major_ver = ssl->conf->max_major_ver; ssl->minor_ver = ssl->conf->max_minor_ver; } else if( ssl->minor_ver > ssl->conf->max_minor_ver ) ssl->minor_ver = ssl->conf->max_minor_ver; /* * Save client random (inc. Unix time) */ MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 2, 32 ); memcpy( ssl->handshake->randbytes, buf + 2, 32 ); /* * Check the session ID length and save session ID */ sess_len = buf[34]; if( sess_len > sizeof( ssl->session_negotiate->id ) || sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 35, sess_len ); ssl->session_negotiate->id_len = sess_len; memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) ); memcpy( ssl->session_negotiate->id, buf + 35, ssl->session_negotiate->id_len ); /* * Check the cookie length and content */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { cookie_offset = 35 + sess_len; cookie_len = buf[cookie_offset]; if( cookie_offset + 1 + cookie_len + 2 > msg_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie", buf + cookie_offset + 1, cookie_len ); #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) if( ssl->conf->f_cookie_check != NULL #if defined(MBEDTLS_SSL_RENEGOTIATION) && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE #endif ) { if( ssl->conf->f_cookie_check( ssl->conf->p_cookie, buf + cookie_offset + 1, cookie_len, ssl->cli_id, ssl->cli_id_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification failed" ) ); ssl->handshake->verify_cookie_len = 1; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification passed" ) ); ssl->handshake->verify_cookie_len = 0; } } else #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ { /* We know we didn't send a cookie, so it should be empty */ if( cookie_len != 0 ) { /* This may be an attacker's probe, so don't send an alert */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification skipped" ) ); } /* * Check the ciphersuitelist length (will be parsed later) */ ciph_offset = cookie_offset + 1 + cookie_len; } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ ciph_offset = 35 + sess_len; ciph_len = ( buf[ciph_offset + 0] << 8 ) | ( buf[ciph_offset + 1] ); if( ciph_len < 2 || ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */ ( ciph_len % 2 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", buf + ciph_offset + 2, ciph_len ); /* * Check the compression algorithms length and pick one */ comp_offset = ciph_offset + 2 + ciph_len; comp_len = buf[comp_offset]; if( comp_len < 1 || comp_len > 16 || comp_len + comp_offset + 1 > msg_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, compression", buf + comp_offset + 1, comp_len ); ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; #if defined(MBEDTLS_ZLIB_SUPPORT) for( i = 0; i < comp_len; ++i ) { if( buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE ) { ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE; break; } } #endif /* See comments in ssl_write_client_hello() */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; #endif /* Do not parse the extensions if the protocol is SSLv3 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) ) { #endif /* * Check the extension length */ ext_offset = comp_offset + 1 + comp_len; if( msg_len > ext_offset ) { if( msg_len < ext_offset + 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ext_len = ( buf[ext_offset + 0] << 8 ) | ( buf[ext_offset + 1] ); if( ( ext_len > 0 && ext_len < 4 ) || msg_len != ext_offset + 2 + ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } else ext_len = 0; ext = buf + ext_offset + 2; MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", ext, ext_len ); while( ext_len != 0 ) { unsigned int ext_id; unsigned int ext_size; if ( ext_len < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ext_id = ( ( ext[0] << 8 ) | ( ext[1] ) ); ext_size = ( ( ext[2] << 8 ) | ( ext[3] ) ); if( ext_size + 4 > ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } switch( ext_id ) { #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) case MBEDTLS_TLS_EXT_SERVERNAME: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) ); if( ssl->conf->f_sni == NULL ) break; ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) renegotiation_info_seen = 1; #endif ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) case MBEDTLS_TLS_EXT_SIG_ALG: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) ); ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); sig_hash_alg_ext_present = 1; break; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) ); ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) ); ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT; ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_ECJPAKE_KKPP: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake kkpp extension" ) ); ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) ); ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) case MBEDTLS_TLS_EXT_TRUNCATED_HMAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) ); ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) ); ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) ); ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) case MBEDTLS_TLS_EXT_SESSION_TICKET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) ); ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_ALPN) case MBEDTLS_TLS_EXT_ALPN: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) ); ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_SESSION_TICKETS */ default: MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", ext_id ) ); } ext_len -= 4 + ext_size; ext += 4 + ext_size; if( ext_len > 0 && ext_len < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } #if defined(MBEDTLS_SSL_PROTO_SSL3) } #endif #if defined(MBEDTLS_SSL_FALLBACK_SCSV) for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 ) { if( p[0] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) && p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received FALLBACK_SCSV" ) ); if( ssl->minor_ver < ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } break; } } #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Try to fall back to default hash SHA1 if the client * hasn't provided any preferred signature-hash combinations. */ if( sig_hash_alg_ext_present == 0 ) { mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1; if( mbedtls_ssl_check_sig_hash( ssl, md_default ) != 0 ) md_default = MBEDTLS_MD_NONE; mbedtls_ssl_sig_hash_set_const_hash( &ssl->handshake->hash_algs, md_default ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /* * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 ) { if( p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV " "during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; break; } } /* * Renegotiation security checks */ if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); handshake_failure = 1; } #if defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION && renegotiation_info_seen == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && renegotiation_info_seen == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) ); handshake_failure = 1; } #endif /* MBEDTLS_SSL_RENEGOTIATION */ if( handshake_failure == 1 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* * Search for a matching ciphersuite * (At the end because we need information from the EC-based extensions * and certificate from the SNI callback triggered by the SNI extension.) */ got_common_suite = 0; ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; ciphersuite_info = NULL; #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 ) for( i = 0; ciphersuites[i] != 0; i++ ) #else for( i = 0; ciphersuites[i] != 0; i++ ) for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 ) #endif { if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) || p[1] != ( ( ciphersuites[i] ) & 0xFF ) ) continue; got_common_suite = 1; if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i], &ciphersuite_info ) ) != 0 ) return( ret ); if( ciphersuite_info != NULL ) goto have_ciphersuite; } if( got_common_suite ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, " "but none of them usable" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE ); } else { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); } have_ciphersuite: MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) ); ssl->session_negotiate->ciphersuite = ciphersuites[i]; ssl->transform_negotiate->ciphersuite_info = ciphersuite_info; ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_recv_flight_completed( ssl ); #endif /* Debugging-only output for testsuite */ #if defined(MBEDTLS_DEBUG_C) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg( ciphersuite_info ); if( sig_alg != MBEDTLS_PK_NONE ) { mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_alg ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d", mbedtls_ssl_hash_from_md_alg( md_alg ) ) ); } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "no hash algorithm for signature algorithm " "%d - should not happen", sig_alg ) ); } } #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const mbedtls_ssl_ciphersuite_t *suite = NULL; const mbedtls_cipher_info_t *cipher = NULL; if( ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { *olen = 0; return; } /* * RFC 7366: "If a server receives an encrypt-then-MAC request extension * from a client and then selects a stream or Authenticated Encryption * with Associated Data (AEAD) ciphersuite, it MUST NOT send an * encrypt-then-MAC response extension back to the client." */ if( ( suite = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite ) ) == NULL || ( cipher = mbedtls_cipher_info_from_type( suite->cipher ) ) == NULL || cipher->mode != MBEDTLS_MODE_CBC ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding encrypt then mac extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding extended master secret " "extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->handshake->new_session_ticket == 0 ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { *p++ = 0x00; *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF; *p++ = ssl->verify_data_len * 2 & 0xFF; memcpy( p, ssl->peer_verify_data, ssl->verify_data_len ); p += ssl->verify_data_len; memcpy( p, ssl->own_verify_data, ssl->verify_data_len ); p += ssl->verify_data_len; } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { *p++ = 0x00; *p++ = 0x01; *p++ = 0x00; } *olen = p - buf; } #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF ); *p++ = 0x00; *p++ = 1; *p++ = ssl->session_negotiate->mfl_code; *olen = 5; } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; ((void) ssl); if( ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, supported_point_formats extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF ); *p++ = 0x00; *p++ = 2; *p++ = 1; *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED; *olen = 6; } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { int ret; unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t kkpp_len; *olen = 0; /* Skip costly computation if not needed */ if( ssl->transform_negotiate->ciphersuite_info->key_exchange != MBEDTLS_KEY_EXCHANGE_ECJPAKE ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, ecjpake kkpp extension" ) ); if( end - p < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF ); ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx, p + 2, end - p - 2, &kkpp_len, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret ); return; } *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( kkpp_len ) & 0xFF ); *olen = kkpp_len + 4; } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN ) static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { if( ssl->alpn_chosen == NULL ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding alpn extension" ) ); /* * 0 . 1 ext identifier * 2 . 3 ext length * 4 . 5 protocol list length * 6 . 6 protocol name length * 7 . 7+n protocol name */ buf[0] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF ); buf[1] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF ); *olen = 7 + strlen( ssl->alpn_chosen ); buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF ); buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF ); buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF ); buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF ); buf[6] = (unsigned char)( ( ( *olen - 7 ) ) & 0xFF ); memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 ); } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) static int ssl_write_hello_verify_request( mbedtls_ssl_context *ssl ) { int ret; unsigned char *p = ssl->out_msg + 4; unsigned char *cookie_len_byte; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello verify request" ) ); /* * struct { * ProtocolVersion server_version; * opaque cookie<0..2^8-1>; * } HelloVerifyRequest; */ /* The RFC is not clear on this point, but sending the actual negotiated * version looks like the most interoperable thing to do. */ mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, p ); MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 ); p += 2; /* If we get here, f_cookie_check is not null */ if( ssl->conf->f_cookie_write == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "inconsistent cookie callbacks" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* Skip length byte until we know the length */ cookie_len_byte = p++; if( ( ret = ssl->conf->f_cookie_write( ssl->conf->p_cookie, &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN, ssl->cli_id, ssl->cli_id_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "f_cookie_write", ret ); return( ret ); } *cookie_len_byte = (unsigned char)( p - ( cookie_len_byte + 1 ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte ); ssl->out_msglen = p - ssl->out_msg; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello verify request" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ static int ssl_write_server_hello( mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t; #endif int ret; size_t olen, ext_len = 0, n; unsigned char *buf, *p; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) ); #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->verify_cookie_len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "client hello was not authenticated" ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) ); return( ssl_write_hello_verify_request( ssl ) ); } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ if( ssl->conf->f_rng == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") ); return( MBEDTLS_ERR_SSL_NO_RNG ); } /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 5 protocol version * 6 . 9 UNIX time() * 10 . 37 random bytes */ buf = ssl->out_msg; p = buf + 4; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, p ); p += 2; MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]", buf[4], buf[5] ) ); #if defined(MBEDTLS_HAVE_TIME) t = mbedtls_time( NULL ); *p++ = (unsigned char)( t >> 24 ); *p++ = (unsigned char)( t >> 16 ); *p++ = (unsigned char)( t >> 8 ); *p++ = (unsigned char)( t ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) ); #else if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 ) return( ret ); p += 4; #endif /* MBEDTLS_HAVE_TIME */ if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 ) return( ret ); p += 28; memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 ); /* * Resume is 0 by default, see ssl_handshake_init(). * It may be already set to 1 by ssl_parse_session_ticket_ext(). * If not, try looking up session ID in our cache. */ if( ssl->handshake->resume == 0 && #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE && #endif ssl->session_negotiate->id_len != 0 && ssl->conf->f_get_cache != NULL && ssl->conf->f_get_cache( ssl->conf->p_cache, ssl->session_negotiate ) == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from cache" ) ); ssl->handshake->resume = 1; } if( ssl->handshake->resume == 0 ) { /* * New session, create a new session id, * unless we're about to issue a session ticket */ ssl->state++; #if defined(MBEDTLS_HAVE_TIME) ssl->session_negotiate->start = mbedtls_time( NULL ); #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) if( ssl->handshake->new_session_ticket != 0 ) { ssl->session_negotiate->id_len = n = 0; memset( ssl->session_negotiate->id, 0, 32 ); } else #endif /* MBEDTLS_SSL_SESSION_TICKETS */ { ssl->session_negotiate->id_len = n = 32; if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, n ) ) != 0 ) return( ret ); } } else { /* * Resuming a session */ n = ssl->session_negotiate->id_len; ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } } /* * 38 . 38 session id length * 39 . 38+n session id * 39+n . 40+n chosen ciphersuite * 41+n . 41+n chosen compression alg. * 42+n . 43+n extensions length * 44+n . 43+n+m extensions */ *p++ = (unsigned char) ssl->session_negotiate->id_len; memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->id_len ); p += ssl->session_negotiate->id_len; MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed", ssl->handshake->resume ? "a" : "no" ) ); *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 ); *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite ); *p++ = (unsigned char)( ssl->session_negotiate->compression ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", mbedtls_ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: 0x%02X", ssl->session_negotiate->compression ) ); /* Do not write the extensions if the protocol is SSLv3 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) ) { #endif /* * First write extensions, then the total length */ ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if ( mbedtls_ssl_ciphersuite_uses_ec( mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite ) ) ) { ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; } #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ALPN) ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) ); if( ext_len > 0 ) { *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ext_len ) & 0xFF ); p += ext_len; } #if defined(MBEDTLS_SSL_PROTO_SSL3) } #endif ssl->out_msglen = p - buf; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO; ret = mbedtls_ssl_write_handshake_msg( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) ); return( ret ); } #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_write_certificate_request( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else static int ssl_write_certificate_request( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; size_t dn_size, total_dn_size; /* excluding length bytes */ size_t ct_len, sa_len; /* including length bytes */ unsigned char *buf, *p; const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; const mbedtls_x509_crt *crt; int authmode; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) ); ssl->state++; #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET ) authmode = ssl->handshake->sni_authmode; else #endif authmode = ssl->conf->authmode; if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE || authmode == MBEDTLS_SSL_VERIFY_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) ); return( 0 ); } /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 4 cert type count * 5 .. m-1 cert types * m .. m+1 sig alg length (TLS 1.2 only) * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only) * n .. n+1 length of all DNs * n+2 .. n+3 length of DN 1 * n+4 .. ... Distinguished Name #1 * ... .. ... length of DN 2, etc. */ buf = ssl->out_msg; p = buf + 4; /* * Supported certificate types * * ClientCertificateType certificate_types<1..2^8-1>; * enum { (255) } ClientCertificateType; */ ct_len = 0; #if defined(MBEDTLS_RSA_C) p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN; #endif #if defined(MBEDTLS_ECDSA_C) p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN; #endif p[0] = (unsigned char) ct_len++; p += ct_len; sa_len = 0; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * Add signature_algorithms for verify (TLS 1.2) * * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>; * * struct { * HashAlgorithm hash; * SignatureAlgorithm signature; * } SignatureAndHashAlgorithm; * * enum { (255) } HashAlgorithm; * enum { (255) } SignatureAlgorithm; */ if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { const int *cur; /* * Supported signature algorithms */ for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ ) { unsigned char hash = mbedtls_ssl_hash_from_md_alg( *cur ); if( MBEDTLS_SSL_HASH_NONE == hash || mbedtls_ssl_set_calc_verify_md( ssl, hash ) ) continue; #if defined(MBEDTLS_RSA_C) p[2 + sa_len++] = hash; p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA; #endif #if defined(MBEDTLS_ECDSA_C) p[2 + sa_len++] = hash; p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA; #endif } p[0] = (unsigned char)( sa_len >> 8 ); p[1] = (unsigned char)( sa_len ); sa_len += 2; p += sa_len; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ /* * DistinguishedName certificate_authorities<0..2^16-1>; * opaque DistinguishedName<1..2^16-1>; */ p += 2; total_dn_size = 0; if( ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED ) { #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_ca_chain != NULL ) crt = ssl->handshake->sni_ca_chain; else #endif crt = ssl->conf->ca_chain; while( crt != NULL && crt->version != 0 ) { dn_size = crt->subject_raw.len; if( end < p || (size_t)( end - p ) < dn_size || (size_t)( end - p ) < 2 + dn_size ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "skipping CAs: buffer too short" ) ); break; } *p++ = (unsigned char)( dn_size >> 8 ); *p++ = (unsigned char)( dn_size ); memcpy( p, crt->subject_raw.p, dn_size ); p += dn_size; MBEDTLS_SSL_DEBUG_BUF( 3, "requested DN", p - dn_size, dn_size ); total_dn_size += 2 + dn_size; crt = crt->next; } } ssl->out_msglen = p - buf; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST; ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size >> 8 ); ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size ); ret = mbedtls_ssl_write_handshake_msg( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl ) { int ret; if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECKEY ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, mbedtls_pk_ec( *mbedtls_ssl_own_key( ssl ) ), MBEDTLS_ECDH_OURS ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && \ defined(MBEDTLS_SSL_ASYNC_PRIVATE) static int ssl_resume_server_key_exchange( mbedtls_ssl_context *ssl, size_t *signature_len ) { /* Append the signature to ssl->out_msg, leaving 2 bytes for the * signature length which will be added in ssl_write_server_key_exchange * after the call to ssl_prepare_server_key_exchange. * ssl_write_server_key_exchange also takes care of incrementing * ssl->out_msglen. */ unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2; size_t sig_max_len = ( ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN - sig_start ); int ret = ssl->conf->f_async_resume( ssl, sig_start, signature_len, sig_max_len ); if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) { ssl->handshake->async_in_progress = 0; mbedtls_ssl_set_async_operation_data( ssl, NULL ); } MBEDTLS_SSL_DEBUG_RET( 2, "ssl_resume_server_key_exchange", ret ); return( ret ); } #endif /* defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && defined(MBEDTLS_SSL_ASYNC_PRIVATE) */ /* Prepare the ServerKeyExchange message, up to and including * calculating the signature if any, but excluding formatting the * signature and sending the message. */ static int ssl_prepare_server_key_exchange( mbedtls_ssl_context *ssl, size_t *signature_len ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; #if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED) #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) unsigned char *dig_signed = NULL; #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ #endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */ (void) ciphersuite_info; /* unused in some configurations */ #if !defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) (void) signature_len; #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */ /* * * Part 1: Provide key exchange parameters for chosen ciphersuite. * */ /* * - ECJPAKE key exchanges */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { int ret; size_t len = 0; ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx, ssl->out_msg + ssl->out_msglen, MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret ); return( ret ); } ssl->out_msglen += len; } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ /* * For (EC)DHE key exchanges with PSK, parameters are prefixed by support * identity hint (RFC 4279, Sec. 3). Until someone needs this feature, * we use empty support identity hints here. **/ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { ssl->out_msg[ssl->out_msglen++] = 0x00; ssl->out_msg[ssl->out_msglen++] = 0x00; } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ /* * - DHE key exchanges */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) if( mbedtls_ssl_ciphersuite_uses_dhe( ciphersuite_info ) ) { int ret; size_t len = 0; if( ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no DH parameters set" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * Ephemeral DH parameters: * * struct { * opaque dh_p<1..2^16-1>; * opaque dh_g<1..2^16-1>; * opaque dh_Ys<1..2^16-1>; * } ServerDHParams; */ if( ( ret = mbedtls_dhm_set_group( &ssl->handshake->dhm_ctx, &ssl->conf->dhm_P, &ssl->conf->dhm_G ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_set_group", ret ); return( ret ); } if( ( ret = mbedtls_dhm_make_params( &ssl->handshake->dhm_ctx, (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ), ssl->out_msg + ssl->out_msglen, &len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_params", ret ); return( ret ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) dig_signed = ssl->out_msg + ssl->out_msglen; #endif ssl->out_msglen += len; MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED */ /* * - ECDHE key exchanges */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) if( mbedtls_ssl_ciphersuite_uses_ecdhe( ciphersuite_info ) ) { /* * Ephemeral ECDH parameters: * * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ const mbedtls_ecp_curve_info **curve = NULL; const mbedtls_ecp_group_id *gid; int ret; size_t len = 0; /* Match our preference list against the offered curves */ for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ ) for( curve = ssl->handshake->curves; *curve != NULL; curve++ ) if( (*curve)->grp_id == *gid ) goto curve_matching_done; curve_matching_done: if( curve == NULL || *curve == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching curve for ECDHE" ) ); return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDHE curve: %s", (*curve)->name ) ); if( ( ret = mbedtls_ecdh_setup( &ssl->handshake->ecdh_ctx, (*curve)->grp_id ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecp_group_load", ret ); return( ret ); } if( ( ret = mbedtls_ecdh_make_params( &ssl->handshake->ecdh_ctx, &len, ssl->out_msg + ssl->out_msglen, MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_params", ret ); return( ret ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) dig_signed = ssl->out_msg + ssl->out_msglen; #endif ssl->out_msglen += len; MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Q ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED */ /* * * Part 2: For key exchanges involving the server signing the * exchange parameters, compute and add the signature here. * */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) ) { size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed; size_t hashlen = 0; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; int ret; /* * 2.1: Choose hash algorithm: * A: For TLS 1.2, obey signature-hash-algorithm extension * to choose appropriate hash. * B: For SSL3, TLS1.0, TLS1.1 and ECDHE_ECDSA, use SHA1 * (RFC 4492, Sec. 5.4) * C: Otherwise, use MD5 + SHA1 (RFC 4346, Sec. 7.4.3) */ mbedtls_md_type_t md_alg; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { /* A: For TLS 1.2, obey signature-hash-algorithm extension * (RFC 5246, Sec. 7.4.1.4.1). */ if( sig_alg == MBEDTLS_PK_NONE || ( md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_alg ) ) == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); /* (... because we choose a cipher suite * only if there is a matching hash.) */ return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ) { /* B: Default hash SHA1 */ md_alg = MBEDTLS_MD_SHA1; } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ { /* C: MD5 + SHA1 */ md_alg = MBEDTLS_MD_NONE; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "pick hash algorithm %d for signing", md_alg ) ); /* * 2.2: Compute the hash to be signed */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( md_alg == MBEDTLS_MD_NONE ) { hashlen = 36; ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, dig_signed, dig_signed_len ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( md_alg != MBEDTLS_MD_NONE ) { ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen, dig_signed, dig_signed_len, md_alg ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen ); /* * 2.3: Compute and add the signature */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { /* * For TLS 1.2, we need to specify signature and hash algorithm * explicitly through a prefix to the signature. * * struct { * HashAlgorithm hash; * SignatureAlgorithm signature; * } SignatureAndHashAlgorithm; * * struct { * SignatureAndHashAlgorithm algorithm; * opaque signature<0..2^16-1>; * } DigitallySigned; * */ ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg( md_alg ); ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg( sig_alg ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if( ssl->conf->f_async_sign_start != NULL ) { ret = ssl->conf->f_async_sign_start( ssl, mbedtls_ssl_own_cert( ssl ), md_alg, hash, hashlen ); switch( ret ) { case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH: /* act as if f_async_sign was null */ break; case 0: ssl->handshake->async_in_progress = 1; return( ssl_resume_server_key_exchange( ssl, signature_len ) ); case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS: ssl->handshake->async_in_progress = 1; return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ); default: MBEDTLS_SSL_DEBUG_RET( 1, "f_async_sign_start", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ if( mbedtls_ssl_own_key( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } /* Append the signature to ssl->out_msg, leaving 2 bytes for the * signature length which will be added in ssl_write_server_key_exchange * after the call to ssl_prepare_server_key_exchange. * ssl_write_server_key_exchange also takes care of incrementing * ssl->out_msglen. */ if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash, hashlen, ssl->out_msg + ssl->out_msglen + 2, signature_len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret ); return( ret ); } } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ return( 0 ); } /* Prepare the ServerKeyExchange message and send it. For ciphersuites * that do not include a ServerKeyExchange message, do nothing. Either * way, if successful, move on to the next step in the SSL state * machine. */ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl ) { int ret; size_t signature_len = 0; #if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED) const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; #endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED) /* Extract static ECDH parameters and abort if ServerKeyExchange * is not needed. */ if( mbedtls_ssl_ciphersuite_no_pfs( ciphersuite_info ) ) { /* For suites involving ECDH, extract DH parameters * from certificate at this point. */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED) if( mbedtls_ssl_ciphersuite_uses_ecdh( ciphersuite_info ) ) { ssl_get_ecdh_params_from_cert( ssl ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */ /* Key exchanges not involving ephemeral keys don't use * ServerKeyExchange, so end here. */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) ); ssl->state++; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && \ defined(MBEDTLS_SSL_ASYNC_PRIVATE) /* If we have already prepared the message and there is an ongoing * signature operation, resume signing. */ if( ssl->handshake->async_in_progress != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming signature operation" ) ); ret = ssl_resume_server_key_exchange( ssl, &signature_len ); } else #endif /* defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && defined(MBEDTLS_SSL_ASYNC_PRIVATE) */ { /* ServerKeyExchange is needed. Prepare the message. */ ret = ssl_prepare_server_key_exchange( ssl, &signature_len ); } if( ret != 0 ) { /* If we're starting to write a new message, set ssl->out_msglen * to 0. But if we're resuming after an asynchronous message, * out_msglen is the amount of data written so far and mst be * preserved. */ if( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange (pending)" ) ); else ssl->out_msglen = 0; return( ret ); } /* If there is a signature, write its length. * ssl_prepare_server_key_exchange already wrote the signature * itself at its proper place in the output buffer. */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) if( signature_len != 0 ) { ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len >> 8 ); ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len ); MBEDTLS_SSL_DEBUG_BUF( 3, "my signature", ssl->out_msg + ssl->out_msglen, signature_len ); /* Skip over the already-written signature */ ssl->out_msglen += signature_len; } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ /* Add header and send. */ ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) ); return( 0 ); } static int ssl_write_server_hello_done( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) ); ssl->out_msglen = 4; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE; ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_send_flight_completed( ssl ); #endif if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) ); return( 0 ); } #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) static int ssl_parse_client_dh_public( mbedtls_ssl_context *ssl, unsigned char **p, const unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t n; /* * Receive G^Y mod P, premaster = (G^Y)^X mod P */ if( *p + 2 > end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } n = ( (*p)[0] << 8 ) | (*p)[1]; *p += 2; if( *p + n > end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_read_public", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); } *p += n; MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY ); return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) static int ssl_resume_decrypt_pms( mbedtls_ssl_context *ssl, unsigned char *peer_pms, size_t *peer_pmslen, size_t peer_pmssize ) { int ret = ssl->conf->f_async_resume( ssl, peer_pms, peer_pmslen, peer_pmssize ); if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) { ssl->handshake->async_in_progress = 0; mbedtls_ssl_set_async_operation_data( ssl, NULL ); } MBEDTLS_SSL_DEBUG_RET( 2, "ssl_decrypt_encrypted_pms", ret ); return( ret ); } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ static int ssl_decrypt_encrypted_pms( mbedtls_ssl_context *ssl, const unsigned char *p, const unsigned char *end, unsigned char *peer_pms, size_t *peer_pmslen, size_t peer_pmssize ) { int ret; mbedtls_pk_context *private_key = mbedtls_ssl_own_key( ssl ); mbedtls_pk_context *public_key = &mbedtls_ssl_own_cert( ssl )->pk; size_t len = mbedtls_pk_get_len( public_key ); #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) /* If we have already started decoding the message and there is an ongoing * decryption operation, resume signing. */ if( ssl->handshake->async_in_progress != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming decryption operation" ) ); return( ssl_resume_decrypt_pms( ssl, peer_pms, peer_pmslen, peer_pmssize ) ); } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /* * Prepare to decrypt the premaster using own private RSA key */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { if ( p + 2 > end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( *p++ != ( ( len >> 8 ) & 0xFF ) || *p++ != ( ( len ) & 0xFF ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } } #endif if( p + len != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } /* * Decrypt the premaster secret */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if( ssl->conf->f_async_decrypt_start != NULL ) { ret = ssl->conf->f_async_decrypt_start( ssl, mbedtls_ssl_own_cert( ssl ), p, len ); switch( ret ) { case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH: /* act as if f_async_decrypt_start was null */ break; case 0: ssl->handshake->async_in_progress = 1; return( ssl_resume_decrypt_pms( ssl, peer_pms, peer_pmslen, peer_pmssize ) ); case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS: ssl->handshake->async_in_progress = 1; return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ); default: MBEDTLS_SSL_DEBUG_RET( 1, "f_async_decrypt_start", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ if( ! mbedtls_pk_can_do( private_key, MBEDTLS_PK_RSA ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no RSA private key" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } ret = mbedtls_pk_decrypt( private_key, p, len, peer_pms, peer_pmslen, peer_pmssize, ssl->conf->f_rng, ssl->conf->p_rng ); return( ret ); } static int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl, const unsigned char *p, const unsigned char *end, size_t pms_offset ) { int ret; unsigned char *pms = ssl->handshake->premaster + pms_offset; unsigned char ver[2]; unsigned char fake_pms[48], peer_pms[48]; unsigned char mask; size_t i, peer_pmslen; unsigned int diff; /* In case of a failure in decryption, the decryption may write less than * 2 bytes of output, but we always read the first two bytes. It doesn't * matter in the end because diff will be nonzero in that case due to * peer_pmslen being less than 48, and we only care whether diff is 0. * But do initialize peer_pms for robustness anyway. This also makes * memory analyzers happy (don't access uninitialized memory, even * if it's an unsigned char). */ peer_pms[0] = peer_pms[1] = ~0; ret = ssl_decrypt_encrypted_pms( ssl, p, end, peer_pms, &peer_pmslen, sizeof( peer_pms ) ); #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if ( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) return( ret ); #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ mbedtls_ssl_write_version( ssl->handshake->max_major_ver, ssl->handshake->max_minor_ver, ssl->conf->transport, ver ); /* Avoid data-dependent branches while checking for invalid * padding, to protect against timing-based Bleichenbacher-type * attacks. */ diff = (unsigned int) ret; diff |= peer_pmslen ^ 48; diff |= peer_pms[0] ^ ver[0]; diff |= peer_pms[1] ^ ver[1]; /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */ /* MSVC has a warning about unary minus on unsigned, but this is * well-defined and precisely what we want to do here */ #if defined(_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4146 ) #endif mask = - ( ( diff | - diff ) >> ( sizeof( unsigned int ) * 8 - 1 ) ); #if defined(_MSC_VER) #pragma warning( pop ) #endif /* * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding * must not cause the connection to end immediately; instead, send a * bad_record_mac later in the handshake. * To protect against timing-based variants of the attack, we must * not have any branch that depends on whether the decryption was * successful. In particular, always generate the fake premaster secret, * regardless of whether it will ultimately influence the output or not. */ ret = ssl->conf->f_rng( ssl->conf->p_rng, fake_pms, sizeof( fake_pms ) ); if( ret != 0 ) { /* It's ok to abort on an RNG failure, since this does not reveal * anything about the RSA decryption. */ return( ret ); } #if defined(MBEDTLS_SSL_DEBUG_ALL) if( diff != 0 ) MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); #endif if( sizeof( ssl->handshake->premaster ) < pms_offset || sizeof( ssl->handshake->premaster ) - pms_offset < 48 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->handshake->pmslen = 48; /* Set pms to either the true or the fake PMS, without * data-dependent branches. */ for( i = 0; i < ssl->handshake->pmslen; i++ ) pms[i] = ( mask & fake_pms[i] ) | ( (~mask) & peer_pms[i] ); return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned char **p, const unsigned char *end ) { int ret = 0; size_t n; if( ssl->conf->f_psk == NULL && ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL || ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } /* * Receive client pre-shared key identity name */ if( end - *p < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } n = ( (*p)[0] << 8 ) | (*p)[1]; *p += 2; if( n < 1 || n > 65535 || n > (size_t) ( end - *p ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ssl->conf->f_psk != NULL ) { if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 ) ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; } else { /* Identity is not a big secret since clients send it in the clear, * but treat it carefully anyway, just in case */ if( n != ssl->conf->psk_identity_len || mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 ) { ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; } } if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY ) { MBEDTLS_SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY ); return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY ); } *p += n; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; unsigned char *p, *end; ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) ); #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \ ( defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) ) if( ( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) && ( ssl->handshake->async_in_progress != 0 ) ) { /* We've already read a record and there is an asynchronous * operation in progress to decrypt it. So skip reading the * record. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "will resume decryption of previously-read record" ) ); } else #endif if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); end = ssl->in_msg + ssl->in_hslen; if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ) { if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret ); return( ret ); } if( p != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, ssl->handshake->premaster, MBEDTLS_PREMASTER_SIZE, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ) { if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx, p, end - p) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_QP ); if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &ssl->handshake->pmslen, ssl->handshake->premaster, MBEDTLS_MPI_MAX_SIZE, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Z ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ) { if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( p != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if ( ssl->handshake->async_in_progress != 0 ) { /* There is an asynchronous operation in progress to * decrypt the encrypted premaster secret, so skip * directly to resuming this operation. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "PSK identity already parsed" ) ); /* Update p to skip the PSK identity. ssl_parse_encrypted_pms * won't actually use it, but maintain p anyway for robustness. */ p += ssl->conf->psk_identity_len + 2; } else #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_encrypted_pms" ), ret ); return( ret ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret ); return( ret ); } if( p != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx, p, end - p ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_QP ); if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) { if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 0 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_parse_encrypted_pms_secret" ), ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx, p, end - p ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx, ssl->handshake->premaster, 32, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) ); return( 0 ); } #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t i, sig_len; unsigned char hash[48]; unsigned char *hash_start = hash; size_t hashlen; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) mbedtls_pk_type_t pk_alg; #endif mbedtls_md_type_t md_alg; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE || ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) ); ssl->state++; return( 0 ); } /* Read the message without adding it to the checksum */ ret = mbedtls_ssl_read_record( ssl, 0 /* no checksum update */ ); if( 0 != ret ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_read_record" ), ret ); return( ret ); } ssl->state++; /* Process the message contents */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE || ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } i = mbedtls_ssl_hs_hdr_len( ssl ); /* * struct { * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only * opaque signature<0..2^16-1>; * } DigitallySigned; */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) { md_alg = MBEDTLS_MD_NONE; hashlen = 36; /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */ if( mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, MBEDTLS_PK_ECDSA ) ) { hash_start += 16; hashlen -= 16; md_alg = MBEDTLS_MD_SHA1; } } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { if( i + 2 > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } /* * Hash */ md_alg = mbedtls_ssl_md_alg_from_hash( ssl->in_msg[i] ); if( md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md( ssl, ssl->in_msg[i] ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg" " for verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } #if !defined(MBEDTLS_MD_SHA1) if( MBEDTLS_MD_SHA1 == md_alg ) hash_start += 16; #endif /* Info from md_alg will be used instead */ hashlen = 0; i++; /* * Signature */ if( ( pk_alg = mbedtls_ssl_pk_alg_from_sig( ssl->in_msg[i] ) ) == MBEDTLS_PK_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg" " for verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } /* * Check the certificate's key type matches the signature alg */ if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "sig_alg doesn't match cert key" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } i++; } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( i + 2 > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } sig_len = ( ssl->in_msg[i] << 8 ) | ssl->in_msg[i+1]; i += 2; if( i + sig_len != ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } /* Calculate hash and verify signature */ ssl->handshake->calc_verify( ssl, hash ); if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk, md_alg, hash_start, hashlen, ssl->in_msg + i, sig_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); return( ret ); } mbedtls_ssl_update_handshake_status( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_write_new_session_ticket( mbedtls_ssl_context *ssl ) { int ret; size_t tlen; uint32_t lifetime; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) ); ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET; /* * struct { * uint32 ticket_lifetime_hint; * opaque ticket<0..2^16-1>; * } NewSessionTicket; * * 4 . 7 ticket_lifetime_hint (0 = unspecified) * 8 . 9 ticket_len (n) * 10 . 9+n ticket content */ if( ( ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket, ssl->session_negotiate, ssl->out_msg + 10, ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN, &tlen, &lifetime ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_write", ret ); tlen = 0; } ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF; ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF; ssl->out_msg[6] = ( lifetime >> 8 ) & 0xFF; ssl->out_msg[7] = ( lifetime ) & 0xFF; ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF ); ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF ); ssl->out_msglen = 10 + tlen; /* * Morally equivalent to updating ssl->state, but NewSessionTicket and * ChangeCipherSpec share the same state. */ ssl->handshake->new_session_ticket = 0; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ /* * SSL handshake -- server side -- single step */ int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ) { int ret = 0; if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) ); if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ switch( ssl->state ) { case MBEDTLS_SSL_HELLO_REQUEST: ssl->state = MBEDTLS_SSL_CLIENT_HELLO; break; /* * <== ClientHello */ case MBEDTLS_SSL_CLIENT_HELLO: ret = ssl_parse_client_hello( ssl ); break; #if defined(MBEDTLS_SSL_PROTO_DTLS) case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT: return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); #endif /* * ==> ServerHello * Certificate * ( ServerKeyExchange ) * ( CertificateRequest ) * ServerHelloDone */ case MBEDTLS_SSL_SERVER_HELLO: ret = ssl_write_server_hello( ssl ); break; case MBEDTLS_SSL_SERVER_CERTIFICATE: ret = mbedtls_ssl_write_certificate( ssl ); break; case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: ret = ssl_write_server_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_REQUEST: ret = ssl_write_certificate_request( ssl ); break; case MBEDTLS_SSL_SERVER_HELLO_DONE: ret = ssl_write_server_hello_done( ssl ); break; /* * <== ( Certificate/Alert ) * ClientKeyExchange * ( CertificateVerify ) * ChangeCipherSpec * Finished */ case MBEDTLS_SSL_CLIENT_CERTIFICATE: ret = mbedtls_ssl_parse_certificate( ssl ); break; case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: ret = ssl_parse_client_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_VERIFY: ret = ssl_parse_certificate_verify( ssl ); break; case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: ret = mbedtls_ssl_parse_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_CLIENT_FINISHED: ret = mbedtls_ssl_parse_finished( ssl ); break; /* * ==> ( NewSessionTicket ) * ChangeCipherSpec * Finished */ case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: #if defined(MBEDTLS_SSL_SESSION_TICKETS) if( ssl->handshake->new_session_ticket != 0 ) ret = ssl_write_new_session_ticket( ssl ); else #endif ret = mbedtls_ssl_write_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_SERVER_FINISHED: ret = mbedtls_ssl_write_finished( ssl ); break; case MBEDTLS_SSL_FLUSH_BUFFERS: MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; break; case MBEDTLS_SSL_HANDSHAKE_WRAPUP: mbedtls_ssl_handshake_wrapup( ssl ); break; default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } return( ret ); } #endif /* MBEDTLS_SSL_SRV_C */ fldigi-4.1.06/src/mbedtls/pk_wrap.c0000664000175000017500000005042013507401434014015 00000000000000/* * Public Key abstraction layer: wrapper functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_C) #include "mbedtls/pk_internal.h" /* Even if RSA not activated, for the sake of RSA-alt */ #include "mbedtls/rsa.h" #include #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) #include "mbedtls/platform_util.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include #include #if defined(MBEDTLS_RSA_C) static int rsa_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_RSA || type == MBEDTLS_PK_RSASSA_PSS ); } static size_t rsa_get_bitlen( const void *ctx ) { const mbedtls_rsa_context * rsa = (const mbedtls_rsa_context *) ctx; return( 8 * mbedtls_rsa_get_len( rsa ) ); } static int rsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { int ret; mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; size_t rsa_len = mbedtls_rsa_get_len( rsa ); #if SIZE_MAX > UINT_MAX if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ if( sig_len < rsa_len ) return( MBEDTLS_ERR_RSA_VERIFY_FAILED ); if( ( ret = mbedtls_rsa_pkcs1_verify( rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, md_alg, (unsigned int) hash_len, hash, sig ) ) != 0 ) return( ret ); /* The buffer contains a valid signature followed by extra data. * We have a special error code for that so that so that callers can * use mbedtls_pk_verify() to check "Does the buffer start with a * valid signature?" and not just "Does the buffer contain a valid * signature?". */ if( sig_len > rsa_len ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( 0 ); } static int rsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; #if SIZE_MAX > UINT_MAX if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ *sig_len = mbedtls_rsa_get_len( rsa ); return( mbedtls_rsa_pkcs1_sign( rsa, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, md_alg, (unsigned int) hash_len, hash, sig ) ); } static int rsa_decrypt_wrap( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; if( ilen != mbedtls_rsa_get_len( rsa ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); return( mbedtls_rsa_pkcs1_decrypt( rsa, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) ); } static int rsa_encrypt_wrap( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; *olen = mbedtls_rsa_get_len( rsa ); if( *olen > osize ) return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE ); return( mbedtls_rsa_pkcs1_encrypt( rsa, f_rng, p_rng, MBEDTLS_RSA_PUBLIC, ilen, input, output ) ); } static int rsa_check_pair_wrap( const void *pub, const void *prv ) { return( mbedtls_rsa_check_pub_priv( (const mbedtls_rsa_context *) pub, (const mbedtls_rsa_context *) prv ) ); } static void *rsa_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_context ) ); if( ctx != NULL ) mbedtls_rsa_init( (mbedtls_rsa_context *) ctx, 0, 0 ); return( ctx ); } static void rsa_free_wrap( void *ctx ) { mbedtls_rsa_free( (mbedtls_rsa_context *) ctx ); mbedtls_free( ctx ); } static void rsa_debug( const void *ctx, mbedtls_pk_debug_item *items ) { items->type = MBEDTLS_PK_DEBUG_MPI; items->name = "rsa.N"; items->value = &( ((mbedtls_rsa_context *) ctx)->N ); items++; items->type = MBEDTLS_PK_DEBUG_MPI; items->name = "rsa.E"; items->value = &( ((mbedtls_rsa_context *) ctx)->E ); } const mbedtls_pk_info_t mbedtls_rsa_info = { MBEDTLS_PK_RSA, "RSA", rsa_get_bitlen, rsa_can_do, rsa_verify_wrap, rsa_sign_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif rsa_decrypt_wrap, rsa_encrypt_wrap, rsa_check_pair_wrap, rsa_alloc_wrap, rsa_free_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif rsa_debug, }; #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * Generic EC key */ static int eckey_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_ECKEY || type == MBEDTLS_PK_ECKEY_DH || type == MBEDTLS_PK_ECDSA ); } static size_t eckey_get_bitlen( const void *ctx ) { return( ((mbedtls_ecp_keypair *) ctx)->grp.pbits ); } #if defined(MBEDTLS_ECDSA_C) /* Forward declarations */ static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); static int eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { int ret; mbedtls_ecdsa_context ecdsa; mbedtls_ecdsa_init( &ecdsa ); if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 ) ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len ); mbedtls_ecdsa_free( &ecdsa ); return( ret ); } static int eckey_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecdsa_context ecdsa; mbedtls_ecdsa_init( &ecdsa ); if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 ) ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ); mbedtls_ecdsa_free( &ecdsa ); return( ret ); } #if defined(MBEDTLS_ECP_RESTARTABLE) /* Forward declarations */ static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ); static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ); /* * Restart context for ECDSA operations with ECKEY context * * We need to store an actual ECDSA context, as we need to pass the same to * the underlying ecdsa function, so we can't create it on the fly every time. */ typedef struct { mbedtls_ecdsa_restart_ctx ecdsa_rs; mbedtls_ecdsa_context ecdsa_ctx; } eckey_restart_ctx; static void *eckey_rs_alloc( void ) { eckey_restart_ctx *rs_ctx; void *ctx = mbedtls_calloc( 1, sizeof( eckey_restart_ctx ) ); if( ctx != NULL ) { rs_ctx = ctx; mbedtls_ecdsa_restart_init( &rs_ctx->ecdsa_rs ); mbedtls_ecdsa_init( &rs_ctx->ecdsa_ctx ); } return( ctx ); } static void eckey_rs_free( void *ctx ) { eckey_restart_ctx *rs_ctx; if( ctx == NULL) return; rs_ctx = ctx; mbedtls_ecdsa_restart_free( &rs_ctx->ecdsa_rs ); mbedtls_ecdsa_free( &rs_ctx->ecdsa_ctx ); mbedtls_free( ctx ); } static int eckey_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ) { int ret; eckey_restart_ctx *rs = rs_ctx; /* Should never happen */ if( rs == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); /* set up our own sub-context if needed (that is, on first run) */ if( rs->ecdsa_ctx.grp.pbits == 0 ) MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) ); MBEDTLS_MPI_CHK( ecdsa_verify_rs_wrap( &rs->ecdsa_ctx, md_alg, hash, hash_len, sig, sig_len, &rs->ecdsa_rs ) ); cleanup: return( ret ); } static int eckey_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ) { int ret; eckey_restart_ctx *rs = rs_ctx; /* Should never happen */ if( rs == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); /* set up our own sub-context if needed (that is, on first run) */ if( rs->ecdsa_ctx.grp.pbits == 0 ) MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) ); MBEDTLS_MPI_CHK( ecdsa_sign_rs_wrap( &rs->ecdsa_ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, &rs->ecdsa_rs ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_ECDSA_C */ static int eckey_check_pair( const void *pub, const void *prv ) { return( mbedtls_ecp_check_pub_priv( (const mbedtls_ecp_keypair *) pub, (const mbedtls_ecp_keypair *) prv ) ); } static void *eckey_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) ); if( ctx != NULL ) mbedtls_ecp_keypair_init( ctx ); return( ctx ); } static void eckey_free_wrap( void *ctx ) { mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx ); mbedtls_free( ctx ); } static void eckey_debug( const void *ctx, mbedtls_pk_debug_item *items ) { items->type = MBEDTLS_PK_DEBUG_ECP; items->name = "eckey.Q"; items->value = &( ((mbedtls_ecp_keypair *) ctx)->Q ); } const mbedtls_pk_info_t mbedtls_eckey_info = { MBEDTLS_PK_ECKEY, "EC", eckey_get_bitlen, eckey_can_do, #if defined(MBEDTLS_ECDSA_C) eckey_verify_wrap, eckey_sign_wrap, #if defined(MBEDTLS_ECP_RESTARTABLE) eckey_verify_rs_wrap, eckey_sign_rs_wrap, #endif #else /* MBEDTLS_ECDSA_C */ NULL, NULL, #endif /* MBEDTLS_ECDSA_C */ NULL, NULL, eckey_check_pair, eckey_alloc_wrap, eckey_free_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) eckey_rs_alloc, eckey_rs_free, #endif eckey_debug, }; /* * EC key restricted to ECDH */ static int eckeydh_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_ECKEY || type == MBEDTLS_PK_ECKEY_DH ); } const mbedtls_pk_info_t mbedtls_eckeydh_info = { MBEDTLS_PK_ECKEY_DH, "EC_DH", eckey_get_bitlen, /* Same underlying key structure */ eckeydh_can_do, NULL, NULL, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif NULL, NULL, eckey_check_pair, eckey_alloc_wrap, /* Same underlying key structure */ eckey_free_wrap, /* Same underlying key structure */ #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif eckey_debug, /* Same underlying key structure */ }; #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_ECDSA_C) static int ecdsa_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_ECDSA ); } static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { int ret; ((void) md_alg); ret = mbedtls_ecdsa_read_signature( (mbedtls_ecdsa_context *) ctx, hash, hash_len, sig, sig_len ); if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( ret ); } static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { return( mbedtls_ecdsa_write_signature( (mbedtls_ecdsa_context *) ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) ); } #if defined(MBEDTLS_ECP_RESTARTABLE) static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ) { int ret; ((void) md_alg); ret = mbedtls_ecdsa_read_signature_restartable( (mbedtls_ecdsa_context *) ctx, hash, hash_len, sig, sig_len, (mbedtls_ecdsa_restart_ctx *) rs_ctx ); if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( ret ); } static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ) { return( mbedtls_ecdsa_write_signature_restartable( (mbedtls_ecdsa_context *) ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, (mbedtls_ecdsa_restart_ctx *) rs_ctx ) ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ static void *ecdsa_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_context ) ); if( ctx != NULL ) mbedtls_ecdsa_init( (mbedtls_ecdsa_context *) ctx ); return( ctx ); } static void ecdsa_free_wrap( void *ctx ) { mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx ); mbedtls_free( ctx ); } #if defined(MBEDTLS_ECP_RESTARTABLE) static void *ecdsa_rs_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_restart_ctx ) ); if( ctx != NULL ) mbedtls_ecdsa_restart_init( ctx ); return( ctx ); } static void ecdsa_rs_free( void *ctx ) { mbedtls_ecdsa_restart_free( ctx ); mbedtls_free( ctx ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ const mbedtls_pk_info_t mbedtls_ecdsa_info = { MBEDTLS_PK_ECDSA, "ECDSA", eckey_get_bitlen, /* Compatible key structures */ ecdsa_can_do, ecdsa_verify_wrap, ecdsa_sign_wrap, #if defined(MBEDTLS_ECP_RESTARTABLE) ecdsa_verify_rs_wrap, ecdsa_sign_rs_wrap, #endif NULL, NULL, eckey_check_pair, /* Compatible key structures */ ecdsa_alloc_wrap, ecdsa_free_wrap, #if defined(MBEDTLS_ECP_RESTARTABLE) ecdsa_rs_alloc, ecdsa_rs_free, #endif eckey_debug, /* Compatible key structures */ }; #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /* * Support for alternative RSA-private implementations */ static int rsa_alt_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_RSA ); } static size_t rsa_alt_get_bitlen( const void *ctx ) { const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx; return( 8 * rsa_alt->key_len_func( rsa_alt->key ) ); } static int rsa_alt_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx; #if SIZE_MAX > UINT_MAX if( UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ *sig_len = rsa_alt->key_len_func( rsa_alt->key ); return( rsa_alt->sign_func( rsa_alt->key, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, md_alg, (unsigned int) hash_len, hash, sig ) ); } static int rsa_alt_decrypt_wrap( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx; ((void) f_rng); ((void) p_rng); if( ilen != rsa_alt->key_len_func( rsa_alt->key ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); return( rsa_alt->decrypt_func( rsa_alt->key, MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) ); } #if defined(MBEDTLS_RSA_C) static int rsa_alt_check_pair( const void *pub, const void *prv ) { unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; unsigned char hash[32]; size_t sig_len = 0; int ret; if( rsa_alt_get_bitlen( prv ) != rsa_get_bitlen( pub ) ) return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); memset( hash, 0x2a, sizeof( hash ) ); if( ( ret = rsa_alt_sign_wrap( (void *) prv, MBEDTLS_MD_NONE, hash, sizeof( hash ), sig, &sig_len, NULL, NULL ) ) != 0 ) { return( ret ); } if( rsa_verify_wrap( (void *) pub, MBEDTLS_MD_NONE, hash, sizeof( hash ), sig, sig_len ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } return( 0 ); } #endif /* MBEDTLS_RSA_C */ static void *rsa_alt_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_alt_context ) ); if( ctx != NULL ) memset( ctx, 0, sizeof( mbedtls_rsa_alt_context ) ); return( ctx ); } static void rsa_alt_free_wrap( void *ctx ) { mbedtls_platform_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) ); mbedtls_free( ctx ); } const mbedtls_pk_info_t mbedtls_rsa_alt_info = { MBEDTLS_PK_RSA_ALT, "RSA-alt", rsa_alt_get_bitlen, rsa_alt_can_do, NULL, rsa_alt_sign_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif rsa_alt_decrypt_wrap, NULL, #if defined(MBEDTLS_RSA_C) rsa_alt_check_pair, #else NULL, #endif rsa_alt_alloc_wrap, rsa_alt_free_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif NULL, }; #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ #endif /* MBEDTLS_PK_C */ fldigi-4.1.06/src/mbedtls/entropy.c0000664000175000017500000005064513507401434014063 00000000000000/* * Entropy accumulator implementation * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ENTROPY_C) #if defined(MBEDTLS_TEST_NULL_ENTROPY) #warning "**** WARNING! MBEDTLS_TEST_NULL_ENTROPY defined! " #warning "**** THIS BUILD HAS NO DEFINED ENTROPY SOURCES " #warning "**** THIS BUILD IS *NOT* SUITABLE FOR PRODUCTION USE " #endif #include "mbedtls/entropy.h" #include "mbedtls/entropy_poll.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_FS_IO) #include #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) #include "mbedtls/platform.h" #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" #endif #define ENTROPY_MAX_LOOP 256 /**< Maximum amount to loop before error */ void mbedtls_entropy_init( mbedtls_entropy_context *ctx ) { ctx->source_count = 0; memset( ctx->source, 0, sizeof( ctx->source ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif ctx->accumulator_started = 0; #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) mbedtls_sha512_init( &ctx->accumulator ); #else mbedtls_sha256_init( &ctx->accumulator ); #endif #if defined(MBEDTLS_HAVEGE_C) mbedtls_havege_init( &ctx->havege_data ); #endif /* Reminder: Update ENTROPY_HAVE_STRONG in the test files * when adding more strong entropy sources here. */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) mbedtls_entropy_add_source( ctx, mbedtls_null_entropy_poll, NULL, 1, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll, NULL, MBEDTLS_ENTROPY_MIN_PLATFORM, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if defined(MBEDTLS_TIMING_C) mbedtls_entropy_add_source( ctx, mbedtls_hardclock_poll, NULL, MBEDTLS_ENTROPY_MIN_HARDCLOCK, MBEDTLS_ENTROPY_SOURCE_WEAK ); #endif #if defined(MBEDTLS_HAVEGE_C) mbedtls_entropy_add_source( ctx, mbedtls_havege_poll, &ctx->havege_data, MBEDTLS_ENTROPY_MIN_HAVEGE, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll, NULL, MBEDTLS_ENTROPY_MIN_HARDWARE, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) mbedtls_entropy_add_source( ctx, mbedtls_nv_seed_poll, NULL, MBEDTLS_ENTROPY_BLOCK_SIZE, MBEDTLS_ENTROPY_SOURCE_STRONG ); ctx->initial_entropy_run = 0; #endif #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ } void mbedtls_entropy_free( mbedtls_entropy_context *ctx ) { #if defined(MBEDTLS_HAVEGE_C) mbedtls_havege_free( &ctx->havege_data ); #endif #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) mbedtls_sha512_free( &ctx->accumulator ); #else mbedtls_sha256_free( &ctx->accumulator ); #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) ctx->initial_entropy_run = 0; #endif ctx->source_count = 0; mbedtls_platform_zeroize( ctx->source, sizeof( ctx->source ) ); ctx->accumulator_started = 0; } int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, mbedtls_entropy_f_source_ptr f_source, void *p_source, size_t threshold, int strong ) { int idx, ret = 0; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif idx = ctx->source_count; if( idx >= MBEDTLS_ENTROPY_MAX_SOURCES ) { ret = MBEDTLS_ERR_ENTROPY_MAX_SOURCES; goto exit; } ctx->source[idx].f_source = f_source; ctx->source[idx].p_source = p_source; ctx->source[idx].threshold = threshold; ctx->source[idx].strong = strong; ctx->source_count++; exit: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Entropy accumulator update */ static int entropy_update( mbedtls_entropy_context *ctx, unsigned char source_id, const unsigned char *data, size_t len ) { unsigned char header[2]; unsigned char tmp[MBEDTLS_ENTROPY_BLOCK_SIZE]; size_t use_len = len; const unsigned char *p = data; int ret = 0; if( use_len > MBEDTLS_ENTROPY_BLOCK_SIZE ) { #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) if( ( ret = mbedtls_sha512_ret( data, len, tmp, 0 ) ) != 0 ) goto cleanup; #else if( ( ret = mbedtls_sha256_ret( data, len, tmp, 0 ) ) != 0 ) goto cleanup; #endif p = tmp; use_len = MBEDTLS_ENTROPY_BLOCK_SIZE; } header[0] = source_id; header[1] = use_len & 0xFF; /* * Start the accumulator if this has not already happened. Note that * it is sufficient to start the accumulator here only because all calls to * gather entropy eventually execute this code. */ #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) if( ctx->accumulator_started == 0 && ( ret = mbedtls_sha512_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto cleanup; else ctx->accumulator_started = 1; if( ( ret = mbedtls_sha512_update_ret( &ctx->accumulator, header, 2 ) ) != 0 ) goto cleanup; ret = mbedtls_sha512_update_ret( &ctx->accumulator, p, use_len ); #else if( ctx->accumulator_started == 0 && ( ret = mbedtls_sha256_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto cleanup; else ctx->accumulator_started = 1; if( ( ret = mbedtls_sha256_update_ret( &ctx->accumulator, header, 2 ) ) != 0 ) goto cleanup; ret = mbedtls_sha256_update_ret( &ctx->accumulator, p, use_len ); #endif cleanup: mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); return( ret ); } int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx, const unsigned char *data, size_t len ) { int ret; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = entropy_update( ctx, MBEDTLS_ENTROPY_SOURCE_MANUAL, data, len ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Run through the different sources to add entropy to our accumulator */ static int entropy_gather_internal( mbedtls_entropy_context *ctx ) { int ret, i, have_one_strong = 0; unsigned char buf[MBEDTLS_ENTROPY_MAX_GATHER]; size_t olen; if( ctx->source_count == 0 ) return( MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED ); /* * Run through our entropy sources */ for( i = 0; i < ctx->source_count; i++ ) { if( ctx->source[i].strong == MBEDTLS_ENTROPY_SOURCE_STRONG ) have_one_strong = 1; olen = 0; if( ( ret = ctx->source[i].f_source( ctx->source[i].p_source, buf, MBEDTLS_ENTROPY_MAX_GATHER, &olen ) ) != 0 ) { goto cleanup; } /* * Add if we actually gathered something */ if( olen > 0 ) { if( ( ret = entropy_update( ctx, (unsigned char) i, buf, olen ) ) != 0 ) return( ret ); ctx->source[i].size += olen; } } if( have_one_strong == 0 ) ret = MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE; cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } /* * Thread-safe wrapper for entropy_gather_internal() */ int mbedtls_entropy_gather( mbedtls_entropy_context *ctx ) { int ret; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = entropy_gather_internal( ctx ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } int mbedtls_entropy_func( void *data, unsigned char *output, size_t len ) { int ret, count = 0, i, done; mbedtls_entropy_context *ctx = (mbedtls_entropy_context *) data; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; if( len > MBEDTLS_ENTROPY_BLOCK_SIZE ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); #if defined(MBEDTLS_ENTROPY_NV_SEED) /* Update the NV entropy seed before generating any entropy for outside * use. */ if( ctx->initial_entropy_run == 0 ) { ctx->initial_entropy_run = 1; if( ( ret = mbedtls_entropy_update_nv_seed( ctx ) ) != 0 ) return( ret ); } #endif #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif /* * Always gather extra entropy before a call */ do { if( count++ > ENTROPY_MAX_LOOP ) { ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; goto exit; } if( ( ret = entropy_gather_internal( ctx ) ) != 0 ) goto exit; done = 1; for( i = 0; i < ctx->source_count; i++ ) if( ctx->source[i].size < ctx->source[i].threshold ) done = 0; } while( ! done ); memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE ); #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) /* * Note that at this stage it is assumed that the accumulator was started * in a previous call to entropy_update(). If this is not guaranteed, the * code below will fail. */ if( ( ret = mbedtls_sha512_finish_ret( &ctx->accumulator, buf ) ) != 0 ) goto exit; /* * Reset accumulator and counters and recycle existing entropy */ mbedtls_sha512_free( &ctx->accumulator ); mbedtls_sha512_init( &ctx->accumulator ); if( ( ret = mbedtls_sha512_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha512_update_ret( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) goto exit; /* * Perform second SHA-512 on entropy */ if( ( ret = mbedtls_sha512_ret( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 ) ) != 0 ) goto exit; #else /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ if( ( ret = mbedtls_sha256_finish_ret( &ctx->accumulator, buf ) ) != 0 ) goto exit; /* * Reset accumulator and counters and recycle existing entropy */ mbedtls_sha256_free( &ctx->accumulator ); mbedtls_sha256_init( &ctx->accumulator ); if( ( ret = mbedtls_sha256_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha256_update_ret( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) goto exit; /* * Perform second SHA-256 on entropy */ if( ( ret = mbedtls_sha256_ret( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 ) ) != 0 ) goto exit; #endif /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ for( i = 0; i < ctx->source_count; i++ ) ctx->source[i].size = 0; memcpy( output, buf, len ); ret = 0; exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } #if defined(MBEDTLS_ENTROPY_NV_SEED) int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx ) { int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; /* Read new seed and write it to NV */ if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) return( ret ); if( mbedtls_nv_seed_write( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) < 0 ) return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR ); /* Manually update the remaining stream with a separator value to diverge */ memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE ); ret = mbedtls_entropy_update_manual( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ); return( ret ); } #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if defined(MBEDTLS_FS_IO) int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path ) { int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; FILE *f; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; if( ( f = fopen( path, "wb" ) ) == NULL ) return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR ); if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) goto exit; if( fwrite( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) != MBEDTLS_ENTROPY_BLOCK_SIZE ) { ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; goto exit; } ret = 0; exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); fclose( f ); return( ret ); } int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path ) { int ret = 0; FILE *f; size_t n; unsigned char buf[ MBEDTLS_ENTROPY_MAX_SEED_SIZE ]; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR ); fseek( f, 0, SEEK_END ); n = (size_t) ftell( f ); fseek( f, 0, SEEK_SET ); if( n > MBEDTLS_ENTROPY_MAX_SEED_SIZE ) n = MBEDTLS_ENTROPY_MAX_SEED_SIZE; if( fread( buf, 1, n, f ) != n ) ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; else ret = mbedtls_entropy_update_manual( ctx, buf, n ); fclose( f ); mbedtls_platform_zeroize( buf, sizeof( buf ) ); if( ret != 0 ) return( ret ); return( mbedtls_entropy_write_seed_file( ctx, path ) ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) #if !defined(MBEDTLS_TEST_NULL_ENTROPY) /* * Dummy source function */ static int entropy_dummy_source( void *data, unsigned char *output, size_t len, size_t *olen ) { ((void) data); memset( output, 0x2a, len ); *olen = len; return( 0 ); } #endif /* !MBEDTLS_TEST_NULL_ENTROPY */ #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) static int mbedtls_entropy_source_self_test_gather( unsigned char *buf, size_t buf_len ) { int ret = 0; size_t entropy_len = 0; size_t olen = 0; size_t attempts = buf_len; while( attempts > 0 && entropy_len < buf_len ) { if( ( ret = mbedtls_hardware_poll( NULL, buf + entropy_len, buf_len - entropy_len, &olen ) ) != 0 ) return( ret ); entropy_len += olen; attempts--; } if( entropy_len < buf_len ) { ret = 1; } return( ret ); } static int mbedtls_entropy_source_self_test_check_bits( const unsigned char *buf, size_t buf_len ) { unsigned char set= 0xFF; unsigned char unset = 0x00; size_t i; for( i = 0; i < buf_len; i++ ) { set &= buf[i]; unset |= buf[i]; } return( set == 0xFF || unset == 0x00 ); } /* * A test to ensure hat the entropy sources are functioning correctly * and there is no obvious failure. The test performs the following checks: * - The entropy source is not providing only 0s (all bits unset) or 1s (all * bits set). * - The entropy source is not providing values in a pattern. Because the * hardware could be providing data in an arbitrary length, this check polls * the hardware entropy source twice and compares the result to ensure they * are not equal. * - The error code returned by the entropy source is not an error. */ int mbedtls_entropy_source_self_test( int verbose ) { int ret = 0; unsigned char buf0[2 * sizeof( unsigned long long int )]; unsigned char buf1[2 * sizeof( unsigned long long int )]; if( verbose != 0 ) mbedtls_printf( " ENTROPY_BIAS test: " ); memset( buf0, 0x00, sizeof( buf0 ) ); memset( buf1, 0x00, sizeof( buf1 ) ); if( ( ret = mbedtls_entropy_source_self_test_gather( buf0, sizeof( buf0 ) ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_entropy_source_self_test_gather( buf1, sizeof( buf1 ) ) ) != 0 ) goto cleanup; /* Make sure that the returned values are not all 0 or 1 */ if( ( ret = mbedtls_entropy_source_self_test_check_bits( buf0, sizeof( buf0 ) ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_entropy_source_self_test_check_bits( buf1, sizeof( buf1 ) ) ) != 0 ) goto cleanup; /* Make sure that the entropy source is not returning values in a * pattern */ ret = memcmp( buf0, buf1, sizeof( buf0 ) ) == 0; cleanup: if( verbose != 0 ) { if( ret != 0 ) mbedtls_printf( "failed\n" ); else mbedtls_printf( "passed\n" ); mbedtls_printf( "\n" ); } return( ret != 0 ); } #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ /* * The actual entropy quality is hard to test, but we can at least * test that the functions don't cause errors and write the correct * amount of data to buffers. */ int mbedtls_entropy_self_test( int verbose ) { int ret = 1; #if !defined(MBEDTLS_TEST_NULL_ENTROPY) mbedtls_entropy_context ctx; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 }; unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 }; size_t i, j; #endif /* !MBEDTLS_TEST_NULL_ENTROPY */ if( verbose != 0 ) mbedtls_printf( " ENTROPY test: " ); #if !defined(MBEDTLS_TEST_NULL_ENTROPY) mbedtls_entropy_init( &ctx ); /* First do a gather to make sure we have default sources */ if( ( ret = mbedtls_entropy_gather( &ctx ) ) != 0 ) goto cleanup; ret = mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL, 16, MBEDTLS_ENTROPY_SOURCE_WEAK ); if( ret != 0 ) goto cleanup; if( ( ret = mbedtls_entropy_update_manual( &ctx, buf, sizeof buf ) ) != 0 ) goto cleanup; /* * To test that mbedtls_entropy_func writes correct number of bytes: * - use the whole buffer and rely on ASan to detect overruns * - collect entropy 8 times and OR the result in an accumulator: * any byte should then be 0 with probably 2^(-64), so requiring * each of the 32 or 64 bytes to be non-zero has a false failure rate * of at most 2^(-58) which is acceptable. */ for( i = 0; i < 8; i++ ) { if( ( ret = mbedtls_entropy_func( &ctx, buf, sizeof( buf ) ) ) != 0 ) goto cleanup; for( j = 0; j < sizeof( buf ); j++ ) acc[j] |= buf[j]; } for( j = 0; j < sizeof( buf ); j++ ) { if( acc[j] == 0 ) { ret = 1; goto cleanup; } } #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) if( ( ret = mbedtls_entropy_source_self_test( 0 ) ) != 0 ) goto cleanup; #endif cleanup: mbedtls_entropy_free( &ctx ); #endif /* !MBEDTLS_TEST_NULL_ENTROPY */ if( verbose != 0 ) { if( ret != 0 ) mbedtls_printf( "failed\n" ); else mbedtls_printf( "passed\n" ); mbedtls_printf( "\n" ); } return( ret != 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ENTROPY_C */ fldigi-4.1.06/src/mbedtls/pkcs11.c0000664000175000017500000001463713507401434013466 00000000000000/** * \file pkcs11.c * * \brief Wrapper for PKCS#11 library libpkcs11-helper * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #include "mbedtls/pkcs11.h" #if defined(MBEDTLS_PKCS11_C) #include "mbedtls/md.h" #include "mbedtls/oid.h" #include "mbedtls/x509_crt.h" #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include void mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_pkcs11_context ) ); } int mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11_cert ) { int ret = 1; unsigned char *cert_blob = NULL; size_t cert_blob_size = 0; if( cert == NULL ) { ret = 2; goto cleanup; } if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, NULL, &cert_blob_size ) != CKR_OK ) { ret = 3; goto cleanup; } cert_blob = mbedtls_calloc( 1, cert_blob_size ); if( NULL == cert_blob ) { ret = 4; goto cleanup; } if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, cert_blob, &cert_blob_size ) != CKR_OK ) { ret = 5; goto cleanup; } if( 0 != mbedtls_x509_crt_parse( cert, cert_blob, cert_blob_size ) ) { ret = 6; goto cleanup; } ret = 0; cleanup: if( NULL != cert_blob ) mbedtls_free( cert_blob ); return( ret ); } int mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key, pkcs11h_certificate_t pkcs11_cert ) { int ret = 1; mbedtls_x509_crt cert; mbedtls_x509_crt_init( &cert ); if( priv_key == NULL ) goto cleanup; if( 0 != mbedtls_pkcs11_x509_cert_bind( &cert, pkcs11_cert ) ) goto cleanup; priv_key->len = mbedtls_pk_get_len( &cert.pk ); priv_key->pkcs11h_cert = pkcs11_cert; ret = 0; cleanup: mbedtls_x509_crt_free( &cert ); return( ret ); } void mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key ) { if( NULL != priv_key ) pkcs11h_certificate_freeCertificate( priv_key->pkcs11h_cert ); } int mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { size_t input_len, output_len; if( NULL == ctx ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( MBEDTLS_RSA_PRIVATE != mode ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); output_len = input_len = ctx->len; if( input_len < 16 || input_len > output_max_len ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* Determine size of output buffer */ if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input, input_len, NULL, &output_len ) != CKR_OK ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } if( output_len > output_max_len ) return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE ); if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input, input_len, output, &output_len ) != CKR_OK ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } *olen = output_len; return( 0 ); } int mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { size_t sig_len = 0, asn_len = 0, oid_size = 0; unsigned char *p = sig; const char *oid; if( NULL == ctx ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( MBEDTLS_RSA_PRIVATE != mode ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( md_alg != MBEDTLS_MD_NONE ) { const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); asn_len = 10 + oid_size; } sig_len = ctx->len; if( hashlen > sig_len || asn_len > sig_len || hashlen + asn_len > sig_len ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } if( md_alg != MBEDTLS_MD_NONE ) { /* * DigestInfo ::= SEQUENCE { * digestAlgorithm DigestAlgorithmIdentifier, * digest Digest } * * DigestAlgorithmIdentifier ::= AlgorithmIdentifier * * Digest ::= OCTET STRING */ *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char) ( 0x08 + oid_size + hashlen ); *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char) ( 0x04 + oid_size ); *p++ = MBEDTLS_ASN1_OID; *p++ = oid_size & 0xFF; memcpy( p, oid, oid_size ); p += oid_size; *p++ = MBEDTLS_ASN1_NULL; *p++ = 0x00; *p++ = MBEDTLS_ASN1_OCTET_STRING; *p++ = hashlen; } memcpy( p, hash, hashlen ); if( pkcs11h_certificate_signAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, sig, asn_len + hashlen, sig, &sig_len ) != CKR_OK ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } return( 0 ); } #endif /* defined(MBEDTLS_PKCS11_C) */ fldigi-4.1.06/src/mbedtls/pk.c0000664000175000017500000003711013507401434012765 00000000000000/* * Public Key abstraction layer * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_C) #include "mbedtls/pk.h" #include "mbedtls/pk_internal.h" #include "mbedtls/platform_util.h" #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #include #include /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA ) #define PK_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * Initialise a mbedtls_pk_context */ void mbedtls_pk_init( mbedtls_pk_context *ctx ) { PK_VALIDATE( ctx != NULL ); ctx->pk_info = NULL; ctx->pk_ctx = NULL; } /* * Free (the components of) a mbedtls_pk_context */ void mbedtls_pk_free( mbedtls_pk_context *ctx ) { if( ctx == NULL ) return; if ( ctx->pk_info != NULL ) ctx->pk_info->ctx_free_func( ctx->pk_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_pk_context ) ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* * Initialize a restart context */ void mbedtls_pk_restart_init( mbedtls_pk_restart_ctx *ctx ) { PK_VALIDATE( ctx != NULL ); ctx->pk_info = NULL; ctx->rs_ctx = NULL; } /* * Free the components of a restart context */ void mbedtls_pk_restart_free( mbedtls_pk_restart_ctx *ctx ) { if( ctx == NULL || ctx->pk_info == NULL || ctx->pk_info->rs_free_func == NULL ) { return; } ctx->pk_info->rs_free_func( ctx->rs_ctx ); ctx->pk_info = NULL; ctx->rs_ctx = NULL; } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* * Get pk_info structure from type */ const mbedtls_pk_info_t * mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ) { switch( pk_type ) { #if defined(MBEDTLS_RSA_C) case MBEDTLS_PK_RSA: return( &mbedtls_rsa_info ); #endif #if defined(MBEDTLS_ECP_C) case MBEDTLS_PK_ECKEY: return( &mbedtls_eckey_info ); case MBEDTLS_PK_ECKEY_DH: return( &mbedtls_eckeydh_info ); #endif #if defined(MBEDTLS_ECDSA_C) case MBEDTLS_PK_ECDSA: return( &mbedtls_ecdsa_info ); #endif /* MBEDTLS_PK_RSA_ALT omitted on purpose */ default: return( NULL ); } } /* * Initialise context */ int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ) { PK_VALIDATE_RET( ctx != NULL ); if( info == NULL || ctx->pk_info != NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); ctx->pk_info = info; return( 0 ); } #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /* * Initialize an RSA-alt context */ int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, mbedtls_pk_rsa_alt_decrypt_func decrypt_func, mbedtls_pk_rsa_alt_sign_func sign_func, mbedtls_pk_rsa_alt_key_len_func key_len_func ) { mbedtls_rsa_alt_context *rsa_alt; const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info; PK_VALIDATE_RET( ctx != NULL ); if( ctx->pk_info != NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); ctx->pk_info = info; rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx; rsa_alt->key = key; rsa_alt->decrypt_func = decrypt_func; rsa_alt->sign_func = sign_func; rsa_alt->key_len_func = key_len_func; return( 0 ); } #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ /* * Tell if a PK can do the operations of the given type */ int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ) { /* A context with null pk_info is not set up yet and can't do anything. * For backward compatibility, also accept NULL instead of a context * pointer. */ if( ctx == NULL || ctx->pk_info == NULL ) return( 0 ); return( ctx->pk_info->can_do( type ) ); } /* * Helper for mbedtls_pk_sign and mbedtls_pk_verify */ static inline int pk_hashlen_helper( mbedtls_md_type_t md_alg, size_t *hash_len ) { const mbedtls_md_info_t *md_info; if( *hash_len != 0 ) return( 0 ); if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL ) return( -1 ); *hash_len = mbedtls_md_get_size( md_info ); return( 0 ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* * Helper to set up a restart context if needed */ static int pk_restart_setup( mbedtls_pk_restart_ctx *ctx, const mbedtls_pk_info_t *info ) { /* Don't do anything if already set up or invalid */ if( ctx == NULL || ctx->pk_info != NULL ) return( 0 ); /* Should never happen when we're called */ if( info->rs_alloc_func == NULL || info->rs_free_func == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ( ctx->rs_ctx = info->rs_alloc_func() ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); ctx->pk_info = info; return( 0 ); } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* * Verify a signature (restartable) */ int mbedtls_pk_verify_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, mbedtls_pk_restart_ctx *rs_ctx ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) || hash != NULL ); PK_VALIDATE_RET( sig != NULL ); if( ctx->pk_info == NULL || pk_hashlen_helper( md_alg, &hash_len ) != 0 ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* optimization: use non-restartable version if restart disabled */ if( rs_ctx != NULL && mbedtls_ecp_restart_is_enabled() && ctx->pk_info->verify_rs_func != NULL ) { int ret; if( ( ret = pk_restart_setup( rs_ctx, ctx->pk_info ) ) != 0 ) return( ret ); ret = ctx->pk_info->verify_rs_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, rs_ctx->rs_ctx ); if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) mbedtls_pk_restart_free( rs_ctx ); return( ret ); } #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ (void) rs_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ if( ctx->pk_info->verify_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->verify_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len ) ); } /* * Verify a signature */ int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { return( mbedtls_pk_verify_restartable( ctx, md_alg, hash, hash_len, sig, sig_len, NULL ) ); } /* * Verify a signature with options */ int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) || hash != NULL ); PK_VALIDATE_RET( sig != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ! mbedtls_pk_can_do( ctx, type ) ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); if( type == MBEDTLS_PK_RSASSA_PSS ) { #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21) int ret; const mbedtls_pk_rsassa_pss_options *pss_opts; #if SIZE_MAX > UINT_MAX if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ if( options == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); pss_opts = (const mbedtls_pk_rsassa_pss_options *) options; if( sig_len < mbedtls_pk_get_len( ctx ) ) return( MBEDTLS_ERR_RSA_VERIFY_FAILED ); ret = mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_pk_rsa( *ctx ), NULL, NULL, MBEDTLS_RSA_PUBLIC, md_alg, (unsigned int) hash_len, hash, pss_opts->mgf1_hash_id, pss_opts->expected_salt_len, sig ); if( ret != 0 ) return( ret ); if( sig_len > mbedtls_pk_get_len( ctx ) ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( 0 ); #else return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); #endif /* MBEDTLS_RSA_C && MBEDTLS_PKCS1_V21 */ } /* General case: no options */ if( options != NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); return( mbedtls_pk_verify( ctx, md_alg, hash, hash_len, sig, sig_len ) ); } /* * Make a signature (restartable) */ int mbedtls_pk_sign_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_pk_restart_ctx *rs_ctx ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) || hash != NULL ); PK_VALIDATE_RET( sig != NULL ); if( ctx->pk_info == NULL || pk_hashlen_helper( md_alg, &hash_len ) != 0 ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* optimization: use non-restartable version if restart disabled */ if( rs_ctx != NULL && mbedtls_ecp_restart_is_enabled() && ctx->pk_info->sign_rs_func != NULL ) { int ret; if( ( ret = pk_restart_setup( rs_ctx, ctx->pk_info ) ) != 0 ) return( ret ); ret = ctx->pk_info->sign_rs_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, rs_ctx->rs_ctx ); if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) mbedtls_pk_restart_free( rs_ctx ); return( ret ); } #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ (void) rs_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ if( ctx->pk_info->sign_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->sign_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) ); } /* * Make a signature */ int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { return( mbedtls_pk_sign_restartable( ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, NULL ) ); } /* * Decrypt message */ int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( input != NULL || ilen == 0 ); PK_VALIDATE_RET( output != NULL || osize == 0 ); PK_VALIDATE_RET( olen != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ctx->pk_info->decrypt_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->decrypt_func( ctx->pk_ctx, input, ilen, output, olen, osize, f_rng, p_rng ) ); } /* * Encrypt message */ int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( input != NULL || ilen == 0 ); PK_VALIDATE_RET( output != NULL || osize == 0 ); PK_VALIDATE_RET( olen != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ctx->pk_info->encrypt_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->encrypt_func( ctx->pk_ctx, input, ilen, output, olen, osize, f_rng, p_rng ) ); } /* * Check public-private key pair */ int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ) { PK_VALIDATE_RET( pub != NULL ); PK_VALIDATE_RET( prv != NULL ); if( pub->pk_info == NULL || prv->pk_info == NULL || prv->pk_info->check_pair_func == NULL ) { return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); } if( prv->pk_info->type == MBEDTLS_PK_RSA_ALT ) { if( pub->pk_info->type != MBEDTLS_PK_RSA ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); } else { if( pub->pk_info != prv->pk_info ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); } return( prv->pk_info->check_pair_func( pub->pk_ctx, prv->pk_ctx ) ); } /* * Get key size in bits */ size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ) { /* For backward compatibility, accept NULL or a context that * isn't set up yet, and return a fake value that should be safe. */ if( ctx == NULL || ctx->pk_info == NULL ) return( 0 ); return( ctx->pk_info->get_bitlen( ctx->pk_ctx ) ); } /* * Export debug information */ int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ) { PK_VALIDATE_RET( ctx != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ctx->pk_info->debug_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); ctx->pk_info->debug_func( ctx->pk_ctx, items ); return( 0 ); } /* * Access the PK type name */ const char *mbedtls_pk_get_name( const mbedtls_pk_context *ctx ) { if( ctx == NULL || ctx->pk_info == NULL ) return( "invalid PK" ); return( ctx->pk_info->name ); } /* * Access the PK type */ mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ) { if( ctx == NULL || ctx->pk_info == NULL ) return( MBEDTLS_PK_NONE ); return( ctx->pk_info->type ); } #endif /* MBEDTLS_PK_C */ fldigi-4.1.06/src/mbedtls/poly1305.c0000664000175000017500000004170013507401434013647 00000000000000/** * \file poly1305.c * * \brief Poly1305 authentication algorithm. * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_POLY1305_C) #include "mbedtls/poly1305.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_POLY1305_ALT) #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Parameter validation macros */ #define POLY1305_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA ) #define POLY1305_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define POLY1305_BLOCK_SIZE_BYTES ( 16U ) #define BYTES_TO_U32_LE( data, offset ) \ ( (uint32_t) data[offset] \ | (uint32_t) ( (uint32_t) data[( offset ) + 1] << 8 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 2] << 16 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 3] << 24 ) \ ) /* * Our implementation is tuned for 32-bit platforms with a 64-bit multiplier. * However we provided an alternative for platforms without such a multiplier. */ #if defined(MBEDTLS_NO_64BIT_MULTIPLICATION) static uint64_t mul64( uint32_t a, uint32_t b ) { /* a = al + 2**16 ah, b = bl + 2**16 bh */ const uint16_t al = (uint16_t) a; const uint16_t bl = (uint16_t) b; const uint16_t ah = a >> 16; const uint16_t bh = b >> 16; /* ab = al*bl + 2**16 (ah*bl + bl*bh) + 2**32 ah*bh */ const uint32_t lo = (uint32_t) al * bl; const uint64_t me = (uint64_t)( (uint32_t) ah * bl ) + (uint32_t) al * bh; const uint32_t hi = (uint32_t) ah * bh; return( lo + ( me << 16 ) + ( (uint64_t) hi << 32 ) ); } #else static inline uint64_t mul64( uint32_t a, uint32_t b ) { return( (uint64_t) a * b ); } #endif /** * \brief Process blocks with Poly1305. * * \param ctx The Poly1305 context. * \param nblocks Number of blocks to process. Note that this * function only processes full blocks. * \param input Buffer containing the input block(s). * \param needs_padding Set to 0 if the padding bit has already been * applied to the input data before calling this * function. Otherwise, set this parameter to 1. */ static void poly1305_process( mbedtls_poly1305_context *ctx, size_t nblocks, const unsigned char *input, uint32_t needs_padding ) { uint64_t d0, d1, d2, d3; uint32_t acc0, acc1, acc2, acc3, acc4; uint32_t r0, r1, r2, r3; uint32_t rs1, rs2, rs3; size_t offset = 0U; size_t i; r0 = ctx->r[0]; r1 = ctx->r[1]; r2 = ctx->r[2]; r3 = ctx->r[3]; rs1 = r1 + ( r1 >> 2U ); rs2 = r2 + ( r2 >> 2U ); rs3 = r3 + ( r3 >> 2U ); acc0 = ctx->acc[0]; acc1 = ctx->acc[1]; acc2 = ctx->acc[2]; acc3 = ctx->acc[3]; acc4 = ctx->acc[4]; /* Process full blocks */ for( i = 0U; i < nblocks; i++ ) { /* The input block is treated as a 128-bit little-endian integer */ d0 = BYTES_TO_U32_LE( input, offset + 0 ); d1 = BYTES_TO_U32_LE( input, offset + 4 ); d2 = BYTES_TO_U32_LE( input, offset + 8 ); d3 = BYTES_TO_U32_LE( input, offset + 12 ); /* Compute: acc += (padded) block as a 130-bit integer */ d0 += (uint64_t) acc0; d1 += (uint64_t) acc1 + ( d0 >> 32U ); d2 += (uint64_t) acc2 + ( d1 >> 32U ); d3 += (uint64_t) acc3 + ( d2 >> 32U ); acc0 = (uint32_t) d0; acc1 = (uint32_t) d1; acc2 = (uint32_t) d2; acc3 = (uint32_t) d3; acc4 += (uint32_t) ( d3 >> 32U ) + needs_padding; /* Compute: acc *= r */ d0 = mul64( acc0, r0 ) + mul64( acc1, rs3 ) + mul64( acc2, rs2 ) + mul64( acc3, rs1 ); d1 = mul64( acc0, r1 ) + mul64( acc1, r0 ) + mul64( acc2, rs3 ) + mul64( acc3, rs2 ) + mul64( acc4, rs1 ); d2 = mul64( acc0, r2 ) + mul64( acc1, r1 ) + mul64( acc2, r0 ) + mul64( acc3, rs3 ) + mul64( acc4, rs2 ); d3 = mul64( acc0, r3 ) + mul64( acc1, r2 ) + mul64( acc2, r1 ) + mul64( acc3, r0 ) + mul64( acc4, rs3 ); acc4 *= r0; /* Compute: acc %= (2^130 - 5) (partial remainder) */ d1 += ( d0 >> 32 ); d2 += ( d1 >> 32 ); d3 += ( d2 >> 32 ); acc0 = (uint32_t) d0; acc1 = (uint32_t) d1; acc2 = (uint32_t) d2; acc3 = (uint32_t) d3; acc4 = (uint32_t) ( d3 >> 32 ) + acc4; d0 = (uint64_t) acc0 + ( acc4 >> 2 ) + ( acc4 & 0xFFFFFFFCU ); acc4 &= 3U; acc0 = (uint32_t) d0; d0 = (uint64_t) acc1 + ( d0 >> 32U ); acc1 = (uint32_t) d0; d0 = (uint64_t) acc2 + ( d0 >> 32U ); acc2 = (uint32_t) d0; d0 = (uint64_t) acc3 + ( d0 >> 32U ); acc3 = (uint32_t) d0; d0 = (uint64_t) acc4 + ( d0 >> 32U ); acc4 = (uint32_t) d0; offset += POLY1305_BLOCK_SIZE_BYTES; } ctx->acc[0] = acc0; ctx->acc[1] = acc1; ctx->acc[2] = acc2; ctx->acc[3] = acc3; ctx->acc[4] = acc4; } /** * \brief Compute the Poly1305 MAC * * \param ctx The Poly1305 context. * \param mac The buffer to where the MAC is written. Must be * big enough to contain the 16-byte MAC. */ static void poly1305_compute_mac( const mbedtls_poly1305_context *ctx, unsigned char mac[16] ) { uint64_t d; uint32_t g0, g1, g2, g3, g4; uint32_t acc0, acc1, acc2, acc3, acc4; uint32_t mask; uint32_t mask_inv; acc0 = ctx->acc[0]; acc1 = ctx->acc[1]; acc2 = ctx->acc[2]; acc3 = ctx->acc[3]; acc4 = ctx->acc[4]; /* Before adding 's' we ensure that the accumulator is mod 2^130 - 5. * We do this by calculating acc - (2^130 - 5), then checking if * the 131st bit is set. If it is, then reduce: acc -= (2^130 - 5) */ /* Calculate acc + -(2^130 - 5) */ d = ( (uint64_t) acc0 + 5U ); g0 = (uint32_t) d; d = ( (uint64_t) acc1 + ( d >> 32 ) ); g1 = (uint32_t) d; d = ( (uint64_t) acc2 + ( d >> 32 ) ); g2 = (uint32_t) d; d = ( (uint64_t) acc3 + ( d >> 32 ) ); g3 = (uint32_t) d; g4 = acc4 + (uint32_t) ( d >> 32U ); /* mask == 0xFFFFFFFF if 131st bit is set, otherwise mask == 0 */ mask = (uint32_t) 0U - ( g4 >> 2U ); mask_inv = ~mask; /* If 131st bit is set then acc=g, otherwise, acc is unmodified */ acc0 = ( acc0 & mask_inv ) | ( g0 & mask ); acc1 = ( acc1 & mask_inv ) | ( g1 & mask ); acc2 = ( acc2 & mask_inv ) | ( g2 & mask ); acc3 = ( acc3 & mask_inv ) | ( g3 & mask ); /* Add 's' */ d = (uint64_t) acc0 + ctx->s[0]; acc0 = (uint32_t) d; d = (uint64_t) acc1 + ctx->s[1] + ( d >> 32U ); acc1 = (uint32_t) d; d = (uint64_t) acc2 + ctx->s[2] + ( d >> 32U ); acc2 = (uint32_t) d; acc3 += ctx->s[3] + (uint32_t) ( d >> 32U ); /* Compute MAC (128 least significant bits of the accumulator) */ mac[ 0] = (unsigned char)( acc0 ); mac[ 1] = (unsigned char)( acc0 >> 8 ); mac[ 2] = (unsigned char)( acc0 >> 16 ); mac[ 3] = (unsigned char)( acc0 >> 24 ); mac[ 4] = (unsigned char)( acc1 ); mac[ 5] = (unsigned char)( acc1 >> 8 ); mac[ 6] = (unsigned char)( acc1 >> 16 ); mac[ 7] = (unsigned char)( acc1 >> 24 ); mac[ 8] = (unsigned char)( acc2 ); mac[ 9] = (unsigned char)( acc2 >> 8 ); mac[10] = (unsigned char)( acc2 >> 16 ); mac[11] = (unsigned char)( acc2 >> 24 ); mac[12] = (unsigned char)( acc3 ); mac[13] = (unsigned char)( acc3 >> 8 ); mac[14] = (unsigned char)( acc3 >> 16 ); mac[15] = (unsigned char)( acc3 >> 24 ); } void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx ) { POLY1305_VALIDATE( ctx != NULL ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) ); } void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) ); } int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx, const unsigned char key[32] ) { POLY1305_VALIDATE_RET( ctx != NULL ); POLY1305_VALIDATE_RET( key != NULL ); /* r &= 0x0ffffffc0ffffffc0ffffffc0fffffff */ ctx->r[0] = BYTES_TO_U32_LE( key, 0 ) & 0x0FFFFFFFU; ctx->r[1] = BYTES_TO_U32_LE( key, 4 ) & 0x0FFFFFFCU; ctx->r[2] = BYTES_TO_U32_LE( key, 8 ) & 0x0FFFFFFCU; ctx->r[3] = BYTES_TO_U32_LE( key, 12 ) & 0x0FFFFFFCU; ctx->s[0] = BYTES_TO_U32_LE( key, 16 ); ctx->s[1] = BYTES_TO_U32_LE( key, 20 ); ctx->s[2] = BYTES_TO_U32_LE( key, 24 ); ctx->s[3] = BYTES_TO_U32_LE( key, 28 ); /* Initial accumulator state */ ctx->acc[0] = 0U; ctx->acc[1] = 0U; ctx->acc[2] = 0U; ctx->acc[3] = 0U; ctx->acc[4] = 0U; /* Queue initially empty */ mbedtls_platform_zeroize( ctx->queue, sizeof( ctx->queue ) ); ctx->queue_len = 0U; return( 0 ); } int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx, const unsigned char *input, size_t ilen ) { size_t offset = 0U; size_t remaining = ilen; size_t queue_free_len; size_t nblocks; POLY1305_VALIDATE_RET( ctx != NULL ); POLY1305_VALIDATE_RET( ilen == 0 || input != NULL ); if( ( remaining > 0U ) && ( ctx->queue_len > 0U ) ) { queue_free_len = ( POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len ); if( ilen < queue_free_len ) { /* Not enough data to complete the block. * Store this data with the other leftovers. */ memcpy( &ctx->queue[ctx->queue_len], input, ilen ); ctx->queue_len += ilen; remaining = 0U; } else { /* Enough data to produce a complete block */ memcpy( &ctx->queue[ctx->queue_len], input, queue_free_len ); ctx->queue_len = 0U; poly1305_process( ctx, 1U, ctx->queue, 1U ); /* add padding bit */ offset += queue_free_len; remaining -= queue_free_len; } } if( remaining >= POLY1305_BLOCK_SIZE_BYTES ) { nblocks = remaining / POLY1305_BLOCK_SIZE_BYTES; poly1305_process( ctx, nblocks, &input[offset], 1U ); offset += nblocks * POLY1305_BLOCK_SIZE_BYTES; remaining %= POLY1305_BLOCK_SIZE_BYTES; } if( remaining > 0U ) { /* Store partial block */ ctx->queue_len = remaining; memcpy( ctx->queue, &input[offset], remaining ); } return( 0 ); } int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx, unsigned char mac[16] ) { POLY1305_VALIDATE_RET( ctx != NULL ); POLY1305_VALIDATE_RET( mac != NULL ); /* Process any leftover data */ if( ctx->queue_len > 0U ) { /* Add padding bit */ ctx->queue[ctx->queue_len] = 1U; ctx->queue_len++; /* Pad with zeroes */ memset( &ctx->queue[ctx->queue_len], 0, POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len ); poly1305_process( ctx, 1U, /* Process 1 block */ ctx->queue, 0U ); /* Already padded above */ } poly1305_compute_mac( ctx, mac ); return( 0 ); } int mbedtls_poly1305_mac( const unsigned char key[32], const unsigned char *input, size_t ilen, unsigned char mac[16] ) { mbedtls_poly1305_context ctx; int ret; POLY1305_VALIDATE_RET( key != NULL ); POLY1305_VALIDATE_RET( mac != NULL ); POLY1305_VALIDATE_RET( ilen == 0 || input != NULL ); mbedtls_poly1305_init( &ctx ); ret = mbedtls_poly1305_starts( &ctx, key ); if( ret != 0 ) goto cleanup; ret = mbedtls_poly1305_update( &ctx, input, ilen ); if( ret != 0 ) goto cleanup; ret = mbedtls_poly1305_finish( &ctx, mac ); cleanup: mbedtls_poly1305_free( &ctx ); return( ret ); } #endif /* MBEDTLS_POLY1305_ALT */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char test_keys[2][32] = { { 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33, 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8, 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd, 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b }, { 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a, 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0, 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09, 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0 } }; static const unsigned char test_data[2][127] = { { 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f, 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70 }, { 0x27, 0x54, 0x77, 0x61, 0x73, 0x20, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x67, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6c, 0x69, 0x74, 0x68, 0x79, 0x20, 0x74, 0x6f, 0x76, 0x65, 0x73, 0x0a, 0x44, 0x69, 0x64, 0x20, 0x67, 0x79, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x69, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x61, 0x62, 0x65, 0x3a, 0x0a, 0x41, 0x6c, 0x6c, 0x20, 0x6d, 0x69, 0x6d, 0x73, 0x79, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x72, 0x6f, 0x67, 0x6f, 0x76, 0x65, 0x73, 0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x61, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x67, 0x72, 0x61, 0x62, 0x65, 0x2e } }; static const size_t test_data_len[2] = { 34U, 127U }; static const unsigned char test_mac[2][16] = { { 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6, 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9 }, { 0x45, 0x41, 0x66, 0x9a, 0x7e, 0xaa, 0xee, 0x61, 0xe7, 0x08, 0xdc, 0x7c, 0xbc, 0xc5, 0xeb, 0x62 } }; #define ASSERT( cond, args ) \ do \ { \ if( ! ( cond ) ) \ { \ if( verbose != 0 ) \ mbedtls_printf args; \ \ return( -1 ); \ } \ } \ while( 0 ) int mbedtls_poly1305_self_test( int verbose ) { unsigned char mac[16]; unsigned i; int ret; for( i = 0U; i < 2U; i++ ) { if( verbose != 0 ) mbedtls_printf( " Poly1305 test %u ", i ); ret = mbedtls_poly1305_mac( test_keys[i], test_data[i], test_data_len[i], mac ); ASSERT( 0 == ret, ( "error code: %i\n", ret ) ); ASSERT( 0 == memcmp( mac, test_mac[i], 16U ), ( "failed (mac)\n" ) ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_POLY1305_C */ fldigi-4.1.06/src/mbedtls/ctr_drbg.c0000664000175000017500000005337513507401434014154 00000000000000/* * CTR_DRBG implementation based on AES-256 (NIST SP 800-90) * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The NIST SP 800-90 DRBGs are described in the following publication. * * http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CTR_DRBG_C) #include "mbedtls/ctr_drbg.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_FS_IO) #include #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ /* * CTR_DRBG context initialization */ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_ctr_drbg_context ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } /* * Non-public function wrapped by mbedtls_ctr_drbg_seed(). Necessary to allow * NIST tests to succeed (which require known length fixed entropy) */ /* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2) * mbedtls_ctr_drbg_seed_entropy_len(ctx, f_entropy, p_entropy, * custom, len, entropy_len) * implements * CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string, * security_strength) -> initial_working_state * with inputs * custom[:len] = nonce || personalization_string * where entropy_input comes from f_entropy for entropy_len bytes * and with outputs * ctx = initial_working_state */ int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len, size_t entropy_len ) { int ret; unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE]; memset( key, 0, MBEDTLS_CTR_DRBG_KEYSIZE ); mbedtls_aes_init( &ctx->aes_ctx ); ctx->f_entropy = f_entropy; ctx->p_entropy = p_entropy; ctx->entropy_len = entropy_len; ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL; /* * Initialize with an empty key */ if( ( ret = mbedtls_aes_setkey_enc( &ctx->aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) { return( ret ); } if( ( ret = mbedtls_ctr_drbg_reseed( ctx, custom, len ) ) != 0 ) { return( ret ); } return( 0 ); } int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ) { return( mbedtls_ctr_drbg_seed_entropy_len( ctx, f_entropy, p_entropy, custom, len, MBEDTLS_CTR_DRBG_ENTROPY_LEN ) ); } void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_aes_free( &ctx->aes_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ctr_drbg_context ) ); } void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance ) { ctx->prediction_resistance = resistance; } void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, size_t len ) { ctx->entropy_len = len; } void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, int interval ) { ctx->reseed_interval = interval; } static int block_cipher_df( unsigned char *output, const unsigned char *data, size_t data_len ) { unsigned char buf[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16]; unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN]; unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE]; unsigned char chain[MBEDTLS_CTR_DRBG_BLOCKSIZE]; unsigned char *p, *iv; mbedtls_aes_context aes_ctx; int ret = 0; int i, j; size_t buf_len, use_len; if( data_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ) return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG ); memset( buf, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16 ); mbedtls_aes_init( &aes_ctx ); /* * Construct IV (16 bytes) and S in buffer * IV = Counter (in 32-bits) padded to 16 with zeroes * S = Length input string (in 32-bits) || Length of output (in 32-bits) || * data || 0x80 * (Total is padded to a multiple of 16-bytes with zeroes) */ p = buf + MBEDTLS_CTR_DRBG_BLOCKSIZE; *p++ = ( data_len >> 24 ) & 0xff; *p++ = ( data_len >> 16 ) & 0xff; *p++ = ( data_len >> 8 ) & 0xff; *p++ = ( data_len ) & 0xff; p += 3; *p++ = MBEDTLS_CTR_DRBG_SEEDLEN; memcpy( p, data, data_len ); p[data_len] = 0x80; buf_len = MBEDTLS_CTR_DRBG_BLOCKSIZE + 8 + data_len + 1; for( i = 0; i < MBEDTLS_CTR_DRBG_KEYSIZE; i++ ) key[i] = i; if( ( ret = mbedtls_aes_setkey_enc( &aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) { goto exit; } /* * Reduce data to MBEDTLS_CTR_DRBG_SEEDLEN bytes of data */ for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE ) { p = buf; memset( chain, 0, MBEDTLS_CTR_DRBG_BLOCKSIZE ); use_len = buf_len; while( use_len > 0 ) { for( i = 0; i < MBEDTLS_CTR_DRBG_BLOCKSIZE; i++ ) chain[i] ^= p[i]; p += MBEDTLS_CTR_DRBG_BLOCKSIZE; use_len -= ( use_len >= MBEDTLS_CTR_DRBG_BLOCKSIZE ) ? MBEDTLS_CTR_DRBG_BLOCKSIZE : use_len; if( ( ret = mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, chain, chain ) ) != 0 ) { goto exit; } } memcpy( tmp + j, chain, MBEDTLS_CTR_DRBG_BLOCKSIZE ); /* * Update IV */ buf[3]++; } /* * Do final encryption with reduced data */ if( ( ret = mbedtls_aes_setkey_enc( &aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) { goto exit; } iv = tmp + MBEDTLS_CTR_DRBG_KEYSIZE; p = output; for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE ) { if( ( ret = mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, iv, iv ) ) != 0 ) { goto exit; } memcpy( p, iv, MBEDTLS_CTR_DRBG_BLOCKSIZE ); p += MBEDTLS_CTR_DRBG_BLOCKSIZE; } exit: mbedtls_aes_free( &aes_ctx ); /* * tidy up the stack */ mbedtls_platform_zeroize( buf, sizeof( buf ) ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); mbedtls_platform_zeroize( key, sizeof( key ) ); mbedtls_platform_zeroize( chain, sizeof( chain ) ); if( 0 != ret ) { /* * wipe partial seed from memory */ mbedtls_platform_zeroize( output, MBEDTLS_CTR_DRBG_SEEDLEN ); } return( ret ); } /* CTR_DRBG_Update (SP 800-90A §10.2.1.2) * ctr_drbg_update_internal(ctx, provided_data) * implements * CTR_DRBG_Update(provided_data, Key, V) * with inputs and outputs * ctx->aes_ctx = Key * ctx->counter = V */ static int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx, const unsigned char data[MBEDTLS_CTR_DRBG_SEEDLEN] ) { unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN]; unsigned char *p = tmp; int i, j; int ret = 0; memset( tmp, 0, MBEDTLS_CTR_DRBG_SEEDLEN ); for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE ) { /* * Increase counter */ for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- ) if( ++ctx->counter[i - 1] != 0 ) break; /* * Crypt counter block */ if( ( ret = mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, p ) ) != 0 ) goto exit; p += MBEDTLS_CTR_DRBG_BLOCKSIZE; } for( i = 0; i < MBEDTLS_CTR_DRBG_SEEDLEN; i++ ) tmp[i] ^= data[i]; /* * Update key and counter */ if( ( ret = mbedtls_aes_setkey_enc( &ctx->aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) goto exit; memcpy( ctx->counter, tmp + MBEDTLS_CTR_DRBG_KEYSIZE, MBEDTLS_CTR_DRBG_BLOCKSIZE ); exit: mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); return( ret ); } /* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2) * mbedtls_ctr_drbg_update(ctx, additional, add_len) * implements * CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string, * security_strength) -> initial_working_state * with inputs * ctx->counter = all-bits-0 * ctx->aes_ctx = context from all-bits-0 key * additional[:add_len] = entropy_input || nonce || personalization_string * and with outputs * ctx = initial_working_state */ int mbedtls_ctr_drbg_update_ret( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN]; int ret; if( add_len == 0 ) return( 0 ); if( ( ret = block_cipher_df( add_input, additional, add_len ) ) != 0 ) goto exit; if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 ) goto exit; exit: mbedtls_platform_zeroize( add_input, sizeof( add_input ) ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { /* MAX_INPUT would be more logical here, but we have to match * block_cipher_df()'s limits since we can't propagate errors */ if( add_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ) add_len = MBEDTLS_CTR_DRBG_MAX_SEED_INPUT; (void) mbedtls_ctr_drbg_update_ret( ctx, additional, add_len ); } #endif /* MBEDTLS_DEPRECATED_REMOVED */ /* CTR_DRBG_Reseed with derivation function (SP 800-90A §10.2.1.4.2) * mbedtls_ctr_drbg_reseed(ctx, additional, len) * implements * CTR_DRBG_Reseed(working_state, entropy_input, additional_input) * -> new_working_state * with inputs * ctx contains working_state * additional[:len] = additional_input * and entropy_input comes from calling ctx->f_entropy * and with output * ctx contains new_working_state */ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t len ) { unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT]; size_t seedlen = 0; int ret; if( ctx->entropy_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT || len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - ctx->entropy_len ) return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG ); memset( seed, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ); /* * Gather entropy_len bytes of entropy to seed state */ if( 0 != ctx->f_entropy( ctx->p_entropy, seed, ctx->entropy_len ) ) { return( MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED ); } seedlen += ctx->entropy_len; /* * Add additional data */ if( additional && len ) { memcpy( seed + seedlen, additional, len ); seedlen += len; } /* * Reduce to 384 bits */ if( ( ret = block_cipher_df( seed, seed, seedlen ) ) != 0 ) goto exit; /* * Update state */ if( ( ret = ctr_drbg_update_internal( ctx, seed ) ) != 0 ) goto exit; ctx->reseed_counter = 1; exit: mbedtls_platform_zeroize( seed, sizeof( seed ) ); return( ret ); } /* CTR_DRBG_Generate with derivation function (SP 800-90A §10.2.1.5.2) * mbedtls_ctr_drbg_random_with_add(ctx, output, output_len, additional, add_len) * implements * CTR_DRBG_Reseed(working_state, entropy_input, additional[:add_len]) * -> working_state_after_reseed * if required, then * CTR_DRBG_Generate(working_state_after_reseed, * requested_number_of_bits, additional_input) * -> status, returned_bits, new_working_state * with inputs * ctx contains working_state * requested_number_of_bits = 8 * output_len * additional[:add_len] = additional_input * and entropy_input comes from calling ctx->f_entropy * and with outputs * status = SUCCESS (this function does the reseed internally) * returned_bits = output[:output_len] * ctx contains new_working_state */ int mbedtls_ctr_drbg_random_with_add( void *p_rng, unsigned char *output, size_t output_len, const unsigned char *additional, size_t add_len ) { int ret = 0; mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng; unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN]; unsigned char *p = output; unsigned char tmp[MBEDTLS_CTR_DRBG_BLOCKSIZE]; int i; size_t use_len; if( output_len > MBEDTLS_CTR_DRBG_MAX_REQUEST ) return( MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG ); if( add_len > MBEDTLS_CTR_DRBG_MAX_INPUT ) return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG ); memset( add_input, 0, MBEDTLS_CTR_DRBG_SEEDLEN ); if( ctx->reseed_counter > ctx->reseed_interval || ctx->prediction_resistance ) { if( ( ret = mbedtls_ctr_drbg_reseed( ctx, additional, add_len ) ) != 0 ) { return( ret ); } add_len = 0; } if( add_len > 0 ) { if( ( ret = block_cipher_df( add_input, additional, add_len ) ) != 0 ) goto exit; if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 ) goto exit; } while( output_len > 0 ) { /* * Increase counter */ for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- ) if( ++ctx->counter[i - 1] != 0 ) break; /* * Crypt counter block */ if( ( ret = mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, tmp ) ) != 0 ) goto exit; use_len = ( output_len > MBEDTLS_CTR_DRBG_BLOCKSIZE ) ? MBEDTLS_CTR_DRBG_BLOCKSIZE : output_len; /* * Copy random block to destination */ memcpy( p, tmp, use_len ); p += use_len; output_len -= use_len; } if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 ) goto exit; ctx->reseed_counter++; exit: mbedtls_platform_zeroize( add_input, sizeof( add_input ) ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); return( 0 ); } int mbedtls_ctr_drbg_random( void *p_rng, unsigned char *output, size_t output_len ) { int ret; mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = mbedtls_ctr_drbg_random_with_add( ctx, output, output_len, NULL, 0 ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } #if defined(MBEDTLS_FS_IO) int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ) { int ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; FILE *f; unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ]; if( ( f = fopen( path, "wb" ) ) == NULL ) return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR ); if( ( ret = mbedtls_ctr_drbg_random( ctx, buf, MBEDTLS_CTR_DRBG_MAX_INPUT ) ) != 0 ) goto exit; if( fwrite( buf, 1, MBEDTLS_CTR_DRBG_MAX_INPUT, f ) != MBEDTLS_CTR_DRBG_MAX_INPUT ) ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; else ret = 0; exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); fclose( f ); return( ret ); } int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ) { int ret = 0; FILE *f = NULL; size_t n; unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ]; unsigned char c; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR ); n = fread( buf, 1, sizeof( buf ), f ); if( fread( &c, 1, 1, f ) != 0 ) { ret = MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; goto exit; } if( n == 0 || ferror( f ) ) { ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; goto exit; } fclose( f ); f = NULL; ret = mbedtls_ctr_drbg_update_ret( ctx, buf, n ); exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); if( f != NULL ) fclose( f ); if( ret != 0 ) return( ret ); return( mbedtls_ctr_drbg_write_seed_file( ctx, path ) ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char entropy_source_pr[96] = { 0xc1, 0x80, 0x81, 0xa6, 0x5d, 0x44, 0x02, 0x16, 0x19, 0xb3, 0xf1, 0x80, 0xb1, 0xc9, 0x20, 0x02, 0x6a, 0x54, 0x6f, 0x0c, 0x70, 0x81, 0x49, 0x8b, 0x6e, 0xa6, 0x62, 0x52, 0x6d, 0x51, 0xb1, 0xcb, 0x58, 0x3b, 0xfa, 0xd5, 0x37, 0x5f, 0xfb, 0xc9, 0xff, 0x46, 0xd2, 0x19, 0xc7, 0x22, 0x3e, 0x95, 0x45, 0x9d, 0x82, 0xe1, 0xe7, 0x22, 0x9f, 0x63, 0x31, 0x69, 0xd2, 0x6b, 0x57, 0x47, 0x4f, 0xa3, 0x37, 0xc9, 0x98, 0x1c, 0x0b, 0xfb, 0x91, 0x31, 0x4d, 0x55, 0xb9, 0xe9, 0x1c, 0x5a, 0x5e, 0xe4, 0x93, 0x92, 0xcf, 0xc5, 0x23, 0x12, 0xd5, 0x56, 0x2c, 0x4a, 0x6e, 0xff, 0xdc, 0x10, 0xd0, 0x68 }; static const unsigned char entropy_source_nopr[64] = { 0x5a, 0x19, 0x4d, 0x5e, 0x2b, 0x31, 0x58, 0x14, 0x54, 0xde, 0xf6, 0x75, 0xfb, 0x79, 0x58, 0xfe, 0xc7, 0xdb, 0x87, 0x3e, 0x56, 0x89, 0xfc, 0x9d, 0x03, 0x21, 0x7c, 0x68, 0xd8, 0x03, 0x38, 0x20, 0xf9, 0xe6, 0x5e, 0x04, 0xd8, 0x56, 0xf3, 0xa9, 0xc4, 0x4a, 0x4c, 0xbd, 0xc1, 0xd0, 0x08, 0x46, 0xf5, 0x98, 0x3d, 0x77, 0x1c, 0x1b, 0x13, 0x7e, 0x4e, 0x0f, 0x9d, 0x8e, 0xf4, 0x09, 0xf9, 0x2e }; static const unsigned char nonce_pers_pr[16] = { 0xd2, 0x54, 0xfc, 0xff, 0x02, 0x1e, 0x69, 0xd2, 0x29, 0xc9, 0xcf, 0xad, 0x85, 0xfa, 0x48, 0x6c }; static const unsigned char nonce_pers_nopr[16] = { 0x1b, 0x54, 0xb8, 0xff, 0x06, 0x42, 0xbf, 0xf5, 0x21, 0xf1, 0x5c, 0x1c, 0x0b, 0x66, 0x5f, 0x3f }; static const unsigned char result_pr[16] = { 0x34, 0x01, 0x16, 0x56, 0xb4, 0x29, 0x00, 0x8f, 0x35, 0x63, 0xec, 0xb5, 0xf2, 0x59, 0x07, 0x23 }; static const unsigned char result_nopr[16] = { 0xa0, 0x54, 0x30, 0x3d, 0x8a, 0x7e, 0xa9, 0x88, 0x9d, 0x90, 0x3e, 0x07, 0x7c, 0x6f, 0x21, 0x8f }; static size_t test_offset; static int ctr_drbg_self_test_entropy( void *data, unsigned char *buf, size_t len ) { const unsigned char *p = data; memcpy( buf, p + test_offset, len ); test_offset += len; return( 0 ); } #define CHK( c ) if( (c) != 0 ) \ { \ if( verbose != 0 ) \ mbedtls_printf( "failed\n" ); \ return( 1 ); \ } /* * Checkup routine */ int mbedtls_ctr_drbg_self_test( int verbose ) { mbedtls_ctr_drbg_context ctx; unsigned char buf[16]; mbedtls_ctr_drbg_init( &ctx ); /* * Based on a NIST CTR_DRBG test vector (PR = True) */ if( verbose != 0 ) mbedtls_printf( " CTR_DRBG (PR = TRUE) : " ); test_offset = 0; CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy, (void *) entropy_source_pr, nonce_pers_pr, 16, 32 ) ); mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) ); CHK( memcmp( buf, result_pr, MBEDTLS_CTR_DRBG_BLOCKSIZE ) ); mbedtls_ctr_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); /* * Based on a NIST CTR_DRBG test vector (PR = FALSE) */ if( verbose != 0 ) mbedtls_printf( " CTR_DRBG (PR = FALSE): " ); mbedtls_ctr_drbg_init( &ctx ); test_offset = 0; CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy, (void *) entropy_source_nopr, nonce_pers_nopr, 16, 32 ) ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) ); CHK( mbedtls_ctr_drbg_reseed( &ctx, NULL, 0 ) ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) ); CHK( memcmp( buf, result_nopr, 16 ) ); mbedtls_ctr_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CTR_DRBG_C */ fldigi-4.1.06/src/mbedtls/md5.c0000664000175000017500000003164413507401434013046 00000000000000/* * RFC 1321 compliant MD5 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The MD5 algorithm was designed by Ron Rivest in 1991. * * http://www.ietf.org/rfc/rfc1321.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD5_C) #include "mbedtls/md5.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD5_ALT) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif void mbedtls_md5_init( mbedtls_md5_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_md5_context ) ); } void mbedtls_md5_free( mbedtls_md5_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md5_context ) ); } void mbedtls_md5_clone( mbedtls_md5_context *dst, const mbedtls_md5_context *src ) { *dst = *src; } /* * MD5 context setup */ int mbedtls_md5_starts_ret( mbedtls_md5_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_starts( mbedtls_md5_context *ctx ) { mbedtls_md5_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_MD5_PROCESS_ALT) int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ) { uint32_t X[16], A, B, C, D; GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define P(a,b,c,d,k,s,t) \ { \ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x,y,z) (z ^ (x & (y ^ z))) P( A, B, C, D, 0, 7, 0xD76AA478 ); P( D, A, B, C, 1, 12, 0xE8C7B756 ); P( C, D, A, B, 2, 17, 0x242070DB ); P( B, C, D, A, 3, 22, 0xC1BDCEEE ); P( A, B, C, D, 4, 7, 0xF57C0FAF ); P( D, A, B, C, 5, 12, 0x4787C62A ); P( C, D, A, B, 6, 17, 0xA8304613 ); P( B, C, D, A, 7, 22, 0xFD469501 ); P( A, B, C, D, 8, 7, 0x698098D8 ); P( D, A, B, C, 9, 12, 0x8B44F7AF ); P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); P( B, C, D, A, 11, 22, 0x895CD7BE ); P( A, B, C, D, 12, 7, 0x6B901122 ); P( D, A, B, C, 13, 12, 0xFD987193 ); P( C, D, A, B, 14, 17, 0xA679438E ); P( B, C, D, A, 15, 22, 0x49B40821 ); #undef F #define F(x,y,z) (y ^ (z & (x ^ y))) P( A, B, C, D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B340 ); P( C, D, A, B, 11, 14, 0x265E5A51 ); P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( A, B, C, D, 5, 5, 0xD62F105D ); P( D, A, B, C, 10, 9, 0x02441453 ); P( C, D, A, B, 15, 14, 0xD8A1E681 ); P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); P( A, B, C, D, 9, 5, 0x21E1CDE6 ); P( D, A, B, C, 14, 9, 0xC33707D6 ); P( C, D, A, B, 3, 14, 0xF4D50D87 ); P( B, C, D, A, 8, 20, 0x455A14ED ); P( A, B, C, D, 13, 5, 0xA9E3E905 ); P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); P( C, D, A, B, 7, 14, 0x676F02D9 ); P( B, C, D, A, 12, 20, 0x8D2A4C8A ); #undef F #define F(x,y,z) (x ^ y ^ z) P( A, B, C, D, 5, 4, 0xFFFA3942 ); P( D, A, B, C, 8, 11, 0x8771F681 ); P( C, D, A, B, 11, 16, 0x6D9D6122 ); P( B, C, D, A, 14, 23, 0xFDE5380C ); P( A, B, C, D, 1, 4, 0xA4BEEA44 ); P( D, A, B, C, 4, 11, 0x4BDECFA9 ); P( C, D, A, B, 7, 16, 0xF6BB4B60 ); P( B, C, D, A, 10, 23, 0xBEBFBC70 ); P( A, B, C, D, 13, 4, 0x289B7EC6 ); P( D, A, B, C, 0, 11, 0xEAA127FA ); P( C, D, A, B, 3, 16, 0xD4EF3085 ); P( B, C, D, A, 6, 23, 0x04881D05 ); P( A, B, C, D, 9, 4, 0xD9D4D039 ); P( D, A, B, C, 12, 11, 0xE6DB99E5 ); P( C, D, A, B, 15, 16, 0x1FA27CF8 ); P( B, C, D, A, 2, 23, 0xC4AC5665 ); #undef F #define F(x,y,z) (y ^ (x | ~z)) P( A, B, C, D, 0, 6, 0xF4292244 ); P( D, A, B, C, 7, 10, 0x432AFF97 ); P( C, D, A, B, 14, 15, 0xAB9423A7 ); P( B, C, D, A, 5, 21, 0xFC93A039 ); P( A, B, C, D, 12, 6, 0x655B59C3 ); P( D, A, B, C, 3, 10, 0x8F0CCC92 ); P( C, D, A, B, 10, 15, 0xFFEFF47D ); P( B, C, D, A, 1, 21, 0x85845DD1 ); P( A, B, C, D, 8, 6, 0x6FA87E4F ); P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); P( C, D, A, B, 6, 15, 0xA3014314 ); P( B, C, D, A, 13, 21, 0x4E0811A1 ); P( A, B, C, D, 4, 6, 0xF7537E82 ); P( D, A, B, C, 11, 10, 0xBD3AF235 ); P( C, D, A, B, 2, 15, 0x2AD7D2BB ); P( B, C, D, A, 9, 21, 0xEB86D391 ); #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ) { mbedtls_internal_md5_process( ctx, data ); } #endif #endif /* !MBEDTLS_MD5_PROCESS_ALT */ /* * MD5 process buffer */ int mbedtls_md5_update_ret( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_md5_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) { memcpy( (void *) (ctx->buffer + left), input, ilen ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_md5_update_ret( ctx, input, ilen ); } #endif /* * MD5 final digest */ int mbedtls_md5_finish_ret( mbedtls_md5_context *ctx, unsigned char output[16] ) { int ret; uint32_t used; uint32_t high, low; /* * Add padding: 0x80 then 0x00 until 8 bytes remain for the length */ used = ctx->total[0] & 0x3F; ctx->buffer[used++] = 0x80; if( used <= 56 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 56 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 64 - used ); if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 56 ); } /* * Add message length */ high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_LE( low, ctx->buffer, 56 ); PUT_UINT32_LE( high, ctx->buffer, 60 ); if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT32_LE( ctx->state[0], output, 0 ); PUT_UINT32_LE( ctx->state[1], output, 4 ); PUT_UINT32_LE( ctx->state[2], output, 8 ); PUT_UINT32_LE( ctx->state[3], output, 12 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] ) { mbedtls_md5_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_MD5_ALT */ /* * output = MD5( input buffer ) */ int mbedtls_md5_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ) { int ret; mbedtls_md5_context ctx; mbedtls_md5_init( &ctx ); if( ( ret = mbedtls_md5_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_md5_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] ) { mbedtls_md5_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * RFC 1321 test vectors */ static const unsigned char md5_test_buf[7][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" } }; static const size_t md5_test_buflen[7] = { 0, 1, 3, 14, 26, 62, 80 }; static const unsigned char md5_test_sum[7][16] = { { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04, 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E }, { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8, 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 }, { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0, 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 }, { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D, 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 }, { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00, 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B }, { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5, 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F }, { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55, 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A } }; /* * Checkup routine */ int mbedtls_md5_self_test( int verbose ) { int i, ret = 0; unsigned char md5sum[16]; for( i = 0; i < 7; i++ ) { if( verbose != 0 ) mbedtls_printf( " MD5 test #%d: ", i + 1 ); ret = mbedtls_md5_ret( md5_test_buf[i], md5_test_buflen[i], md5sum ); if( ret != 0 ) goto fail; if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MD5_C */ fldigi-4.1.06/src/mbedtls/asn1write.c0000664000175000017500000002656113507401434014300 00000000000000/* * ASN.1 buffer writing functionality * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ASN1_WRITE_C) #include "mbedtls/asn1write.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len ) { if( len < 0x80 ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = (unsigned char) len; return( 1 ); } if( len <= 0xFF ) { if( *p - start < 2 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = (unsigned char) len; *--(*p) = 0x81; return( 2 ); } if( len <= 0xFFFF ) { if( *p - start < 3 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = ( len ) & 0xFF; *--(*p) = ( len >> 8 ) & 0xFF; *--(*p) = 0x82; return( 3 ); } if( len <= 0xFFFFFF ) { if( *p - start < 4 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = ( len ) & 0xFF; *--(*p) = ( len >> 8 ) & 0xFF; *--(*p) = ( len >> 16 ) & 0xFF; *--(*p) = 0x83; return( 4 ); } #if SIZE_MAX > 0xFFFFFFFF if( len <= 0xFFFFFFFF ) #endif { if( *p - start < 5 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = ( len ) & 0xFF; *--(*p) = ( len >> 8 ) & 0xFF; *--(*p) = ( len >> 16 ) & 0xFF; *--(*p) = ( len >> 24 ) & 0xFF; *--(*p) = 0x84; return( 5 ); } #if SIZE_MAX > 0xFFFFFFFF return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); #endif } int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = tag; return( 1 ); } int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ) { size_t len = 0; if( *p < start || (size_t)( *p - start ) < size ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len = size; (*p) -= len; memcpy( *p, buf, len ); return( (int) len ); } #if defined(MBEDTLS_BIGNUM_C) int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X ) { int ret; size_t len = 0; // Write the MPI // len = mbedtls_mpi_size( X ); if( *p < start || (size_t)( *p - start ) < len ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); (*p) -= len; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, *p, len ) ); // DER format assumes 2s complement for numbers, so the leftmost bit // should be 0 for positive numbers and 1 for negative numbers. // if( X->s ==1 && **p & 0x80 ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = 0x00; len += 1; } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) ); ret = (int) len; cleanup: return( ret ); } #endif /* MBEDTLS_BIGNUM_C */ int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start ) { int ret; size_t len = 0; // Write NULL // MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, 0) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_NULL ) ); return( (int) len ); } int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) oid, oid_len ) ); MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) ); return( (int) len ); } int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, size_t par_len ) { int ret; size_t len = 0; if( par_len == 0 ) MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_null( p, start ) ); else len += par_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean ) { int ret; size_t len = 0; if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = (boolean) ? 255 : 0; len++; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BOOLEAN ) ); return( (int) len ); } int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val ) { int ret; size_t len = 0; if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len += 1; *--(*p) = val; if( val > 0 && **p & 0x80 ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = 0x00; len += 1; } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) ); return( (int) len ); } int mbedtls_asn1_write_tagged_string( unsigned char **p, unsigned char *start, int tag, const char *text, size_t text_len ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) text, text_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, tag ) ); return( (int) len ); } int mbedtls_asn1_write_utf8_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ) { return( mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_UTF8_STRING, text, text_len) ); } int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ) { return( mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_PRINTABLE_STRING, text, text_len) ); } int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ) { return( mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_IA5_STRING, text, text_len) ); } int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t bits ) { int ret; size_t len = 0, size; size = ( bits / 8 ) + ( ( bits % 8 ) ? 1 : 0 ); // Calculate byte length // if( *p < start || (size_t)( *p - start ) < size + 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len = size + 1; (*p) -= size; memcpy( *p, buf, size ); // Write unused bits // *--(*p) = (unsigned char) (size * 8 - bits); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) ); return( (int) len ); } int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, buf, size ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) ); return( (int) len ); } /* This is a copy of the ASN.1 parsing function mbedtls_asn1_find_named_data(), * which is replicated to avoid a dependency ASN1_WRITE_C on ASN1_PARSE_C. */ static mbedtls_asn1_named_data *asn1_find_named_data( mbedtls_asn1_named_data *list, const char *oid, size_t len ) { while( list != NULL ) { if( list->oid.len == len && memcmp( list->oid.p, oid, len ) == 0 ) { break; } list = list->next; } return( list ); } mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ) { mbedtls_asn1_named_data *cur; if( ( cur = asn1_find_named_data( *head, oid, oid_len ) ) == NULL ) { // Add new entry if not present yet based on OID // cur = (mbedtls_asn1_named_data*)mbedtls_calloc( 1, sizeof(mbedtls_asn1_named_data) ); if( cur == NULL ) return( NULL ); cur->oid.len = oid_len; cur->oid.p = mbedtls_calloc( 1, oid_len ); if( cur->oid.p == NULL ) { mbedtls_free( cur ); return( NULL ); } memcpy( cur->oid.p, oid, oid_len ); cur->val.len = val_len; cur->val.p = mbedtls_calloc( 1, val_len ); if( cur->val.p == NULL ) { mbedtls_free( cur->oid.p ); mbedtls_free( cur ); return( NULL ); } cur->next = *head; *head = cur; } else if( cur->val.len < val_len ) { /* * Enlarge existing value buffer if needed * Preserve old data until the allocation succeeded, to leave list in * a consistent state in case allocation fails. */ void *p = mbedtls_calloc( 1, val_len ); if( p == NULL ) return( NULL ); mbedtls_free( cur->val.p ); cur->val.p = p; cur->val.len = val_len; } if( val != NULL ) memcpy( cur->val.p, val, val_len ); return( cur ); } #endif /* MBEDTLS_ASN1_WRITE_C */ fldigi-4.1.06/src/mbedtls/blowfish.c0000664000175000017500000006574513507401434014207 00000000000000/* * Blowfish implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The Blowfish block cipher was designed by Bruce Schneier in 1993. * http://www.schneier.com/blowfish.html * http://en.wikipedia.org/wiki/Blowfish_%28cipher%29 * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_BLOWFISH_C) #include "mbedtls/blowfish.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_BLOWFISH_ALT) /* Parameter validation macros */ #define BLOWFISH_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ) #define BLOWFISH_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif static const uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2] = { 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL, 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, 0x9216D5D9L, 0x8979FB1BL }; /* declarations of data at the end of this file */ static const uint32_t S[4][256]; static uint32_t F( mbedtls_blowfish_context *ctx, uint32_t x ) { unsigned short a, b, c, d; uint32_t y; d = (unsigned short)(x & 0xFF); x >>= 8; c = (unsigned short)(x & 0xFF); x >>= 8; b = (unsigned short)(x & 0xFF); x >>= 8; a = (unsigned short)(x & 0xFF); y = ctx->S[0][a] + ctx->S[1][b]; y = y ^ ctx->S[2][c]; y = y + ctx->S[3][d]; return( y ); } static void blowfish_enc( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr ) { uint32_t Xl, Xr, temp; short i; Xl = *xl; Xr = *xr; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS; ++i ) { Xl = Xl ^ ctx->P[i]; Xr = F( ctx, Xl ) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS]; Xl = Xl ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS + 1]; *xl = Xl; *xr = Xr; } static void blowfish_dec( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr ) { uint32_t Xl, Xr, temp; short i; Xl = *xl; Xr = *xr; for( i = MBEDTLS_BLOWFISH_ROUNDS + 1; i > 1; --i ) { Xl = Xl ^ ctx->P[i]; Xr = F( ctx, Xl ) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctx->P[1]; Xl = Xl ^ ctx->P[0]; *xl = Xl; *xr = Xr; } void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx ) { BLOWFISH_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_blowfish_context ) ); } void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_blowfish_context ) ); } /* * Blowfish key schedule */ int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key, unsigned int keybits ) { unsigned int i, j, k; uint32_t data, datal, datar; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( key != NULL ); if( keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS || keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS || keybits % 8 != 0 ) { return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ); } keybits >>= 3; for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j++ ) ctx->S[i][j] = S[i][j]; } j = 0; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i ) { data = 0x00000000; for( k = 0; k < 4; ++k ) { data = ( data << 8 ) | key[j++]; if( j >= keybits ) j = 0; } ctx->P[i] = P[i] ^ data; } datal = 0x00000000; datar = 0x00000000; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->P[i] = datal; ctx->P[i + 1] = datar; } for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->S[i][j] = datal; ctx->S[i][j + 1] = datar; } } return( 0 ); } /* * Blowfish-ECB block encryption/decryption */ int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx, int mode, const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] ) { uint32_t X0, X1; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT || mode == MBEDTLS_BLOWFISH_DECRYPT ); BLOWFISH_VALIDATE_RET( input != NULL ); BLOWFISH_VALIDATE_RET( output != NULL ); GET_UINT32_BE( X0, input, 0 ); GET_UINT32_BE( X1, input, 4 ); if( mode == MBEDTLS_BLOWFISH_DECRYPT ) { blowfish_dec( ctx, &X0, &X1 ); } else /* MBEDTLS_BLOWFISH_ENCRYPT */ { blowfish_enc( ctx, &X0, &X1 ); } PUT_UINT32_BE( X0, output, 0 ); PUT_UINT32_BE( X1, output, 4 ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * Blowfish-CBC buffer encryption/decryption */ int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[MBEDTLS_BLOWFISH_BLOCKSIZE]; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT || mode == MBEDTLS_BLOWFISH_DECRYPT ); BLOWFISH_VALIDATE_RET( iv != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || input != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || output != NULL ); if( length % MBEDTLS_BLOWFISH_BLOCKSIZE ) return( MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_BLOWFISH_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, MBEDTLS_BLOWFISH_BLOCKSIZE ); mbedtls_blowfish_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE;i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, MBEDTLS_BLOWFISH_BLOCKSIZE ); input += MBEDTLS_BLOWFISH_BLOCKSIZE; output += MBEDTLS_BLOWFISH_BLOCKSIZE; length -= MBEDTLS_BLOWFISH_BLOCKSIZE; } } else { while( length > 0 ) { for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_blowfish_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, MBEDTLS_BLOWFISH_BLOCKSIZE ); input += MBEDTLS_BLOWFISH_BLOCKSIZE; output += MBEDTLS_BLOWFISH_BLOCKSIZE; length -= MBEDTLS_BLOWFISH_BLOCKSIZE; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * Blowfish CFB buffer encryption/decryption */ int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int c; size_t n; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT || mode == MBEDTLS_BLOWFISH_DECRYPT ); BLOWFISH_VALIDATE_RET( iv != NULL ); BLOWFISH_VALIDATE_RET( iv_off != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || input != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || output != NULL ); n = *iv_off; if( n >= 8 ) return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ); if( mode == MBEDTLS_BLOWFISH_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv ); c = *input++; *output++ = (unsigned char)( c ^ iv[n] ); iv[n] = (unsigned char) c; n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE; } } else { while( length-- ) { if( n == 0 ) mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE; } } *iv_off = n; return( 0 ); } #endif /*MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * Blowfish CTR buffer encryption/decryption */ int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( nonce_counter != NULL ); BLOWFISH_VALIDATE_RET( stream_block != NULL ); BLOWFISH_VALIDATE_RET( nc_off != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || input != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || output != NULL ); n = *nc_off; if( n >= 8 ) return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, nonce_counter, stream_block ); for( i = MBEDTLS_BLOWFISH_BLOCKSIZE; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static const uint32_t S[4][256] = { { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L, 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL, 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL, 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L, 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL, 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L, 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L, 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L, 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL, 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L, 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL, 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L, 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL, 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L, 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL, 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L, 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL, 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L, 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L, 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL, 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL, 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L, 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL, 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L, 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L, 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L, 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL }, { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L, 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L, 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL, 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L, 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL, 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L, 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L, 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L, 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL, 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L, 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L, 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L, 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL, 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL, 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L, 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L, 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L, 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL, 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL, 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L, 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L, 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL, 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L, 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L, 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L, 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L, 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L, 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL, 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL, 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L, 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L, 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L, 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L, 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L, 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L, 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L, 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L, 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L, 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L, 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L, 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L, 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL, 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L, 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L, 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L, 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L }, { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L, 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L, 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL, 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L, 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L, 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L, 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL, 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL, 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL, 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L, 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L, 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL, 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L, 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL, 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L, 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL, 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L, 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL, 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L, 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL, 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L, 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L, 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL, 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L, 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L, 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L, 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L, 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL, 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L, 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL, 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L, 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL, 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L, 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL, 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL, 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL, 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L, 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L, 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL, 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL, 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL, 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL, 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL, 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L, 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L, 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L, 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L, 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL, 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL, 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L, 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L, 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L, 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L, 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L, 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L, 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L, 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L, 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L, 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L, 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL, 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L, 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL, 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L, 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L }, { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL, 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L, 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L, 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L, 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L, 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L, 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L, 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL, 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL, 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL, 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L, 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L, 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL, 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L, 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL, 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL, 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L, 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL, 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L, 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL, 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L, 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L, 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL, 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL, 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L, 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL, 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L } }; #endif /* !MBEDTLS_BLOWFISH_ALT */ #endif /* MBEDTLS_BLOWFISH_C */ fldigi-4.1.06/src/mbedtls/version.c0000664000175000017500000000300313507401434014032 00000000000000/* * Version information * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_VERSION_C) #include "mbedtls/version.h" #include unsigned int mbedtls_version_get_number( void ) { return( MBEDTLS_VERSION_NUMBER ); } void mbedtls_version_get_string( char *string ) { memcpy( string, MBEDTLS_VERSION_STRING, sizeof( MBEDTLS_VERSION_STRING ) ); } void mbedtls_version_get_string_full( char *string ) { memcpy( string, MBEDTLS_VERSION_STRING_FULL, sizeof( MBEDTLS_VERSION_STRING_FULL ) ); } #endif /* MBEDTLS_VERSION_C */ fldigi-4.1.06/src/mbedtls/x509_crt.c0000664000175000017500000023670213507401434013740 00000000000000/* * X.509 certificate parsing and verification * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf * * [SIRO] https://cabforum.org/wp-content/uploads/Chunghwatelecom201503cabforumV4.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) #include "mbedtls/x509_crt.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include #else #include #endif #if defined(MBEDTLS_FS_IO) #include #if !defined(_WIN32) || defined(EFIX64) || defined(EFI32) #include #include #include #endif /* !_WIN32 || EFIX64 || EFI32 */ #endif /* * Item in a verification chain: cert and flags for it */ typedef struct { mbedtls_x509_crt *crt; uint32_t flags; } x509_crt_verify_chain_item; /* * Max size of verification chain: end-entity + intermediates + trusted root */ #define X509_MAX_VERIFY_CHAIN_SIZE ( MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2 ) /* * Default profile */ const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default = { #if defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES) /* Allow SHA-1 (weak, but still safe in controlled environments) */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 ) | #endif /* Only SHA-2 hashes */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA224 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ), 0xFFFFFFF, /* Any PK alg */ 0xFFFFFFF, /* Any curve */ 2048, }; /* * Next-default profile */ const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next = { /* Hashes from SHA-256 and above */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ), 0xFFFFFFF, /* Any PK alg */ #if defined(MBEDTLS_ECP_C) /* Curves at or above 128-bit security level */ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP521R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP256R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP384R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP512R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256K1 ), #else 0, #endif 2048, }; /* * NSA Suite B Profile */ const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb = { /* Only SHA-256 and 384 */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ), /* Only ECDSA */ MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECDSA ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECKEY ), #if defined(MBEDTLS_ECP_C) /* Only NIST P-256 and P-384 */ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ), #else 0, #endif 0, }; /* * Check md_alg against profile * Return 0 if md_alg is acceptable for this profile, -1 otherwise */ static int x509_profile_check_md_alg( const mbedtls_x509_crt_profile *profile, mbedtls_md_type_t md_alg ) { if( md_alg == MBEDTLS_MD_NONE ) return( -1 ); if( ( profile->allowed_mds & MBEDTLS_X509_ID_FLAG( md_alg ) ) != 0 ) return( 0 ); return( -1 ); } /* * Check pk_alg against profile * Return 0 if pk_alg is acceptable for this profile, -1 otherwise */ static int x509_profile_check_pk_alg( const mbedtls_x509_crt_profile *profile, mbedtls_pk_type_t pk_alg ) { if( pk_alg == MBEDTLS_PK_NONE ) return( -1 ); if( ( profile->allowed_pks & MBEDTLS_X509_ID_FLAG( pk_alg ) ) != 0 ) return( 0 ); return( -1 ); } /* * Check key against profile * Return 0 if pk is acceptable for this profile, -1 otherwise */ static int x509_profile_check_key( const mbedtls_x509_crt_profile *profile, const mbedtls_pk_context *pk ) { const mbedtls_pk_type_t pk_alg = mbedtls_pk_get_type( pk ); #if defined(MBEDTLS_RSA_C) if( pk_alg == MBEDTLS_PK_RSA || pk_alg == MBEDTLS_PK_RSASSA_PSS ) { if( mbedtls_pk_get_bitlen( pk ) >= profile->rsa_min_bitlen ) return( 0 ); return( -1 ); } #endif #if defined(MBEDTLS_ECP_C) if( pk_alg == MBEDTLS_PK_ECDSA || pk_alg == MBEDTLS_PK_ECKEY || pk_alg == MBEDTLS_PK_ECKEY_DH ) { const mbedtls_ecp_group_id gid = mbedtls_pk_ec( *pk )->grp.id; if( gid == MBEDTLS_ECP_DP_NONE ) return( -1 ); if( ( profile->allowed_curves & MBEDTLS_X509_ID_FLAG( gid ) ) != 0 ) return( 0 ); return( -1 ); } #endif return( -1 ); } /* * Like memcmp, but case-insensitive and always returns -1 if different */ static int x509_memcasecmp( const void *s1, const void *s2, size_t len ) { size_t i; unsigned char diff; const unsigned char *n1 = s1, *n2 = s2; for( i = 0; i < len; i++ ) { diff = n1[i] ^ n2[i]; if( diff == 0 ) continue; if( diff == 32 && ( ( n1[i] >= 'a' && n1[i] <= 'z' ) || ( n1[i] >= 'A' && n1[i] <= 'Z' ) ) ) { continue; } return( -1 ); } return( 0 ); } /* * Return 0 if name matches wildcard, -1 otherwise */ static int x509_check_wildcard( const char *cn, const mbedtls_x509_buf *name ) { size_t i; size_t cn_idx = 0, cn_len = strlen( cn ); /* We can't have a match if there is no wildcard to match */ if( name->len < 3 || name->p[0] != '*' || name->p[1] != '.' ) return( -1 ); for( i = 0; i < cn_len; ++i ) { if( cn[i] == '.' ) { cn_idx = i; break; } } if( cn_idx == 0 ) return( -1 ); if( cn_len - cn_idx == name->len - 1 && x509_memcasecmp( name->p + 1, cn + cn_idx, name->len - 1 ) == 0 ) { return( 0 ); } return( -1 ); } /* * Compare two X.509 strings, case-insensitive, and allowing for some encoding * variations (but not all). * * Return 0 if equal, -1 otherwise. */ static int x509_string_cmp( const mbedtls_x509_buf *a, const mbedtls_x509_buf *b ) { if( a->tag == b->tag && a->len == b->len && memcmp( a->p, b->p, b->len ) == 0 ) { return( 0 ); } if( ( a->tag == MBEDTLS_ASN1_UTF8_STRING || a->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) && ( b->tag == MBEDTLS_ASN1_UTF8_STRING || b->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) && a->len == b->len && x509_memcasecmp( a->p, b->p, b->len ) == 0 ) { return( 0 ); } return( -1 ); } /* * Compare two X.509 Names (aka rdnSequence). * * See RFC 5280 section 7.1, though we don't implement the whole algorithm: * we sometimes return unequal when the full algorithm would return equal, * but never the other way. (In particular, we don't do Unicode normalisation * or space folding.) * * Return 0 if equal, -1 otherwise. */ static int x509_name_cmp( const mbedtls_x509_name *a, const mbedtls_x509_name *b ) { /* Avoid recursion, it might not be optimised by the compiler */ while( a != NULL || b != NULL ) { if( a == NULL || b == NULL ) return( -1 ); /* type */ if( a->oid.tag != b->oid.tag || a->oid.len != b->oid.len || memcmp( a->oid.p, b->oid.p, b->oid.len ) != 0 ) { return( -1 ); } /* value */ if( x509_string_cmp( &a->val, &b->val ) != 0 ) return( -1 ); /* structure of the list of sets */ if( a->next_merged != b->next_merged ) return( -1 ); a = a->next; b = b->next; } /* a == NULL == b */ return( 0 ); } /* * Reset (init or clear) a verify_chain */ static void x509_crt_verify_chain_reset( mbedtls_x509_crt_verify_chain *ver_chain ) { size_t i; for( i = 0; i < MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE; i++ ) { ver_chain->items[i].crt = NULL; ver_chain->items[i].flags = -1; } ver_chain->len = 0; } /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } */ static int x509_get_version( unsigned char **p, const unsigned char *end, int *ver ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { *ver = 0; return( 0 ); } return( ret ); } end = *p + len; if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_VERSION + ret ); if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_VERSION + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Validity ::= SEQUENCE { * notBefore Time, * notAfter Time } */ static int x509_get_dates( unsigned char **p, const unsigned char *end, mbedtls_x509_time *from, mbedtls_x509_time *to ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_DATE + ret ); end = *p + len; if( ( ret = mbedtls_x509_get_time( p, end, from ) ) != 0 ) return( ret ); if( ( ret = mbedtls_x509_get_time( p, end, to ) ) != 0 ) return( ret ); if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 v2/v3 unique identifier (not parsed) */ static int x509_get_uid( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *uid, int n ) { int ret; if( *p == end ) return( 0 ); uid->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &uid->len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | n ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } uid->p = *p; *p += uid->len; return( 0 ); } static int x509_get_basic_constraints( unsigned char **p, const unsigned char *end, int *ca_istrue, int *max_pathlen ) { int ret; size_t len; /* * BasicConstraints ::= SEQUENCE { * cA BOOLEAN DEFAULT FALSE, * pathLenConstraint INTEGER (0..MAX) OPTIONAL } */ *ca_istrue = 0; /* DEFAULT FALSE */ *max_pathlen = 0; /* endless */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_bool( p, end, ca_istrue ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ret = mbedtls_asn1_get_int( p, end, ca_istrue ); if( ret != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *ca_istrue != 0 ) *ca_istrue = 1; } if( *p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_int( p, end, max_pathlen ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); (*max_pathlen)++; return( 0 ); } static int x509_get_ns_cert_type( unsigned char **p, const unsigned char *end, unsigned char *ns_cert_type) { int ret; mbedtls_x509_bitstring bs = { 0, 0, NULL }; if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( bs.len != 1 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_INVALID_LENGTH ); /* Get actual bitstring */ *ns_cert_type = *bs.p; return( 0 ); } static int x509_get_key_usage( unsigned char **p, const unsigned char *end, unsigned int *key_usage) { int ret; size_t i; mbedtls_x509_bitstring bs = { 0, 0, NULL }; if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( bs.len < 1 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_INVALID_LENGTH ); /* Get actual bitstring */ *key_usage = 0; for( i = 0; i < bs.len && i < sizeof( unsigned int ); i++ ) { *key_usage |= (unsigned int) bs.p[i] << (8*i); } return( 0 ); } /* * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId * * KeyPurposeId ::= OBJECT IDENTIFIER */ static int x509_get_ext_key_usage( unsigned char **p, const unsigned char *end, mbedtls_x509_sequence *ext_key_usage) { int ret; if( ( ret = mbedtls_asn1_get_sequence_of( p, end, ext_key_usage, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); /* Sequence length must be >= 1 */ if( ext_key_usage->buf.p == NULL ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_INVALID_LENGTH ); return( 0 ); } /* * SubjectAltName ::= GeneralNames * * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName * * GeneralName ::= CHOICE { * otherName [0] OtherName, * rfc822Name [1] IA5String, * dNSName [2] IA5String, * x400Address [3] ORAddress, * directoryName [4] Name, * ediPartyName [5] EDIPartyName, * uniformResourceIdentifier [6] IA5String, * iPAddress [7] OCTET STRING, * registeredID [8] OBJECT IDENTIFIER } * * OtherName ::= SEQUENCE { * type-id OBJECT IDENTIFIER, * value [0] EXPLICIT ANY DEFINED BY type-id } * * EDIPartyName ::= SEQUENCE { * nameAssigner [0] DirectoryString OPTIONAL, * partyName [1] DirectoryString } * * NOTE: we only parse and use dNSName at this point. */ static int x509_get_subject_alt_name( unsigned char **p, const unsigned char *end, mbedtls_x509_sequence *subject_alt_name ) { int ret; size_t len, tag_len; mbedtls_asn1_buf *buf; unsigned char tag; mbedtls_asn1_sequence *cur = subject_alt_name; /* Get main sequence tag */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *p + len != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); while( *p < end ) { if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); tag = **p; (*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, &tag_len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( ( tag & MBEDTLS_ASN1_TAG_CLASS_MASK ) != MBEDTLS_ASN1_CONTEXT_SPECIFIC ) { return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } /* Skip everything but DNS name */ if( tag != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | 2 ) ) { *p += tag_len; continue; } /* Allocate and assign next pointer */ if( cur->buf.p != NULL ) { if( cur->next != NULL ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS ); cur->next = mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_ALLOC_FAILED ); cur = cur->next; } buf = &(cur->buf); buf->tag = tag; buf->p = *p; buf->len = tag_len; *p += buf->len; } /* Set final sequence entry's next pointer to NULL */ cur->next = NULL; if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 v3 extensions * */ static int x509_get_crt_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_crt *crt ) { int ret; size_t len; unsigned char *end_ext_data, *end_ext_octet; if( ( ret = mbedtls_x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } while( *p < end ) { /* * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING } */ mbedtls_x509_buf extn_oid = {0, 0, NULL}; int is_critical = 0; /* DEFAULT FALSE */ int ext_type = 0; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); end_ext_data = *p + len; /* Get extension ID */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &extn_oid.len, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); extn_oid.tag = MBEDTLS_ASN1_OID; extn_oid.p = *p; *p += extn_oid.len; /* Get optional critical */ if( ( ret = mbedtls_asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 && ( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); /* Data should be octet string type */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); end_ext_octet = *p + len; if( end_ext_octet != end_ext_data ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* * Detect supported extensions */ ret = mbedtls_oid_get_x509_ext_type( &extn_oid, &ext_type ); if( ret != 0 ) { /* No parser found, skip extension */ *p = end_ext_octet; #if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) if( is_critical ) { /* Data is marked as critical: fail */ return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } #endif continue; } /* Forbid repeated extensions */ if( ( crt->ext_types & ext_type ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS ); crt->ext_types |= ext_type; switch( ext_type ) { case MBEDTLS_X509_EXT_BASIC_CONSTRAINTS: /* Parse basic constraints */ if( ( ret = x509_get_basic_constraints( p, end_ext_octet, &crt->ca_istrue, &crt->max_pathlen ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_KEY_USAGE: /* Parse key usage */ if( ( ret = x509_get_key_usage( p, end_ext_octet, &crt->key_usage ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE: /* Parse extended key usage */ if( ( ret = x509_get_ext_key_usage( p, end_ext_octet, &crt->ext_key_usage ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_SUBJECT_ALT_NAME: /* Parse subject alt name */ if( ( ret = x509_get_subject_alt_name( p, end_ext_octet, &crt->subject_alt_names ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_NS_CERT_TYPE: /* Parse netscape certificate type */ if( ( ret = x509_get_ns_cert_type( p, end_ext_octet, &crt->ns_cert_type ) ) != 0 ) return( ret ); break; default: return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE ); } } if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Parse and fill a single X.509 certificate in DER format */ static int x509_crt_parse_der_core( mbedtls_x509_crt *crt, const unsigned char *buf, size_t buflen ) { int ret; size_t len; unsigned char *p, *end, *crt_end; mbedtls_x509_buf sig_params1, sig_params2, sig_oid2; memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) ); /* * Check for valid input */ if( crt == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); // Use the original buffer until we figure out actual length p = (unsigned char*) buf; len = buflen; end = p + len; /* * Certificate ::= SEQUENCE { * tbsCertificate TBSCertificate, * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT ); } if( len > (size_t) ( end - p ) ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } crt_end = p + len; // Create and populate a new buffer for the raw field crt->raw.len = crt_end - buf; crt->raw.p = p = mbedtls_calloc( 1, crt->raw.len ); if( p == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); memcpy( p, buf, crt->raw.len ); // Direct pointers to the new buffer p += crt->raw.len - len; end = crt_end = p + len; /* * TBSCertificate ::= SEQUENCE { */ crt->tbs.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } end = p + len; crt->tbs.len = end - crt->tbs.p; /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } * * CertificateSerialNumber ::= INTEGER * * signature AlgorithmIdentifier */ if( ( ret = x509_get_version( &p, end, &crt->version ) ) != 0 || ( ret = mbedtls_x509_get_serial( &p, end, &crt->serial ) ) != 0 || ( ret = mbedtls_x509_get_alg( &p, end, &crt->sig_oid, &sig_params1 ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } if( crt->version < 0 || crt->version > 2 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_UNKNOWN_VERSION ); } crt->version++; if( ( ret = mbedtls_x509_get_sig_alg( &crt->sig_oid, &sig_params1, &crt->sig_md, &crt->sig_pk, &crt->sig_opts ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } /* * issuer Name */ crt->issuer_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_x509_get_name( &p, p + len, &crt->issuer ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } crt->issuer_raw.len = p - crt->issuer_raw.p; /* * Validity ::= SEQUENCE { * notBefore Time, * notAfter Time } * */ if( ( ret = x509_get_dates( &p, end, &crt->valid_from, &crt->valid_to ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } /* * subject Name */ crt->subject_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( len && ( ret = mbedtls_x509_get_name( &p, p + len, &crt->subject ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } crt->subject_raw.len = p - crt->subject_raw.p; /* * SubjectPublicKeyInfo */ if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &crt->pk ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } /* * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, * -- If present, version shall be v2 or v3 * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, * -- If present, version shall be v2 or v3 * extensions [3] EXPLICIT Extensions OPTIONAL * -- If present, version shall be v3 */ if( crt->version == 2 || crt->version == 3 ) { ret = x509_get_uid( &p, end, &crt->issuer_id, 1 ); if( ret != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } } if( crt->version == 2 || crt->version == 3 ) { ret = x509_get_uid( &p, end, &crt->subject_id, 2 ); if( ret != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } } #if !defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3) if( crt->version == 3 ) #endif { ret = x509_get_crt_ext( &p, end, crt ); if( ret != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } } if( p != end ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } end = crt_end; /* * } * -- end of TBSCertificate * * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING */ if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } if( crt->sig_oid.len != sig_oid2.len || memcmp( crt->sig_oid.p, sig_oid2.p, crt->sig_oid.len ) != 0 || sig_params1.len != sig_params2.len || ( sig_params1.len != 0 && memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_SIG_MISMATCH ); } if( ( ret = mbedtls_x509_get_sig( &p, end, &crt->sig ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } if( p != end ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } return( 0 ); } /* * Parse one X.509 certificate in DER format from a buffer and add them to a * chained list */ int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ) { int ret; mbedtls_x509_crt *crt = chain, *prev = NULL; /* * Check for valid input */ if( crt == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); while( crt->version != 0 && crt->next != NULL ) { prev = crt; crt = crt->next; } /* * Add new certificate on the end of the chain if needed. */ if( crt->version != 0 && crt->next == NULL ) { crt->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ); if( crt->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); prev = crt; mbedtls_x509_crt_init( crt->next ); crt = crt->next; } if( ( ret = x509_crt_parse_der_core( crt, buf, buflen ) ) != 0 ) { if( prev ) prev->next = NULL; if( crt != chain ) mbedtls_free( crt ); return( ret ); } return( 0 ); } /* * Parse one or more PEM certificates from a buffer and add them to the chained * list */ int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ) { #if defined(MBEDTLS_PEM_PARSE_C) int success = 0, first_error = 0, total_failed = 0; int buf_format = MBEDTLS_X509_FORMAT_DER; #endif /* * Check for valid input */ if( chain == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); /* * Determine buffer content. Buffer contains either one DER certificate or * one or more PEM certificates. */ #if defined(MBEDTLS_PEM_PARSE_C) if( buflen != 0 && buf[buflen - 1] == '\0' && strstr( (const char *) buf, "-----BEGIN CERTIFICATE-----" ) != NULL ) { buf_format = MBEDTLS_X509_FORMAT_PEM; } if( buf_format == MBEDTLS_X509_FORMAT_DER ) return mbedtls_x509_crt_parse_der( chain, buf, buflen ); #else return mbedtls_x509_crt_parse_der( chain, buf, buflen ); #endif #if defined(MBEDTLS_PEM_PARSE_C) if( buf_format == MBEDTLS_X509_FORMAT_PEM ) { int ret; mbedtls_pem_context pem; /* 1 rather than 0 since the terminating NULL byte is counted in */ while( buflen > 1 ) { size_t use_len; mbedtls_pem_init( &pem ); /* If we get there, we know the string is null-terminated */ ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----", buf, NULL, 0, &use_len ); if( ret == 0 ) { /* * Was PEM encoded */ buflen -= use_len; buf += use_len; } else if( ret == MBEDTLS_ERR_PEM_BAD_INPUT_DATA ) { return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) { mbedtls_pem_free( &pem ); /* * PEM header and footer were found */ buflen -= use_len; buf += use_len; if( first_error == 0 ) first_error = ret; total_failed++; continue; } else break; ret = mbedtls_x509_crt_parse_der( chain, pem.buf, pem.buflen ); mbedtls_pem_free( &pem ); if( ret != 0 ) { /* * Quit parsing on a memory error */ if( ret == MBEDTLS_ERR_X509_ALLOC_FAILED ) return( ret ); if( first_error == 0 ) first_error = ret; total_failed++; continue; } success = 1; } } if( success ) return( total_failed ); else if( first_error ) return( first_error ); else return( MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT ); #endif /* MBEDTLS_PEM_PARSE_C */ } #if defined(MBEDTLS_FS_IO) /* * Load one or more certificates and add them to the chained list */ int mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path ) { int ret; size_t n; unsigned char *buf; if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_x509_crt_parse( chain, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) { int ret = 0; #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) int w_ret; WCHAR szDir[MAX_PATH]; char filename[MAX_PATH]; char *p; size_t len = strlen( path ); WIN32_FIND_DATAW file_data; HANDLE hFind; if( len > MAX_PATH - 3 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); memset( szDir, 0, sizeof(szDir) ); memset( filename, 0, MAX_PATH ); memcpy( filename, path, len ); filename[len++] = '\\'; p = filename + len; filename[len++] = '*'; w_ret = MultiByteToWideChar( CP_ACP, 0, filename, (int)len, szDir, MAX_PATH - 3 ); if( w_ret == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); hFind = FindFirstFileW( szDir, &file_data ); if( hFind == INVALID_HANDLE_VALUE ) return( MBEDTLS_ERR_X509_FILE_IO_ERROR ); len = MAX_PATH - len; do { memset( p, 0, len ); if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) continue; w_ret = WideCharToMultiByte( CP_ACP, 0, file_data.cFileName, lstrlenW( file_data.cFileName ), p, (int) len - 1, NULL, NULL ); if( w_ret == 0 ) { ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; goto cleanup; } w_ret = mbedtls_x509_crt_parse_file( chain, filename ); if( w_ret < 0 ) ret++; else ret += w_ret; } while( FindNextFileW( hFind, &file_data ) != 0 ); if( GetLastError() != ERROR_NO_MORE_FILES ) ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; cleanup: FindClose( hFind ); #else /* _WIN32 */ int t_ret; int snp_ret; struct stat sb; struct dirent *entry; char entry_name[MBEDTLS_X509_MAX_FILE_PATH_LEN]; DIR *dir = opendir( path ); if( dir == NULL ) return( MBEDTLS_ERR_X509_FILE_IO_ERROR ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &mbedtls_threading_readdir_mutex ) ) != 0 ) { closedir( dir ); return( ret ); } #endif /* MBEDTLS_THREADING_C */ while( ( entry = readdir( dir ) ) != NULL ) { snp_ret = mbedtls_snprintf( entry_name, sizeof entry_name, "%s/%s", path, entry->d_name ); if( snp_ret < 0 || (size_t)snp_ret >= sizeof entry_name ) { ret = MBEDTLS_ERR_X509_BUFFER_TOO_SMALL; goto cleanup; } else if( stat( entry_name, &sb ) == -1 ) { ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; goto cleanup; } if( !S_ISREG( sb.st_mode ) ) continue; // Ignore parse errors // t_ret = mbedtls_x509_crt_parse_file( chain, entry_name ); if( t_ret < 0 ) ret++; else ret += t_ret; } cleanup: closedir( dir ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &mbedtls_threading_readdir_mutex ) != 0 ) ret = MBEDTLS_ERR_THREADING_MUTEX_ERROR; #endif /* MBEDTLS_THREADING_C */ #endif /* _WIN32 */ return( ret ); } #endif /* MBEDTLS_FS_IO */ static int x509_info_subject_alt_name( char **buf, size_t *size, const mbedtls_x509_sequence *subject_alt_name ) { size_t i; size_t n = *size; char *p = *buf; const mbedtls_x509_sequence *cur = subject_alt_name; const char *sep = ""; size_t sep_len = 0; while( cur != NULL ) { if( cur->buf.len + sep_len >= n ) { *p = '\0'; return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ); } n -= cur->buf.len + sep_len; for( i = 0; i < sep_len; i++ ) *p++ = sep[i]; for( i = 0; i < cur->buf.len; i++ ) *p++ = cur->buf.p[i]; sep = ", "; sep_len = 2; cur = cur->next; } *p = '\0'; *size = n; *buf = p; return( 0 ); } #define PRINT_ITEM(i) \ { \ ret = mbedtls_snprintf( p, n, "%s" i, sep ); \ MBEDTLS_X509_SAFE_SNPRINTF; \ sep = ", "; \ } #define CERT_TYPE(type,name) \ if( ns_cert_type & type ) \ PRINT_ITEM( name ); static int x509_info_cert_type( char **buf, size_t *size, unsigned char ns_cert_type ) { int ret; size_t n = *size; char *p = *buf; const char *sep = ""; CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT, "SSL Client" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER, "SSL Server" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL, "Email" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING, "Object Signing" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_RESERVED, "Reserved" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CA, "SSL CA" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA, "Email CA" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA, "Object Signing CA" ); *size = n; *buf = p; return( 0 ); } #define KEY_USAGE(code,name) \ if( key_usage & code ) \ PRINT_ITEM( name ); static int x509_info_key_usage( char **buf, size_t *size, unsigned int key_usage ) { int ret; size_t n = *size; char *p = *buf; const char *sep = ""; KEY_USAGE( MBEDTLS_X509_KU_DIGITAL_SIGNATURE, "Digital Signature" ); KEY_USAGE( MBEDTLS_X509_KU_NON_REPUDIATION, "Non Repudiation" ); KEY_USAGE( MBEDTLS_X509_KU_KEY_ENCIPHERMENT, "Key Encipherment" ); KEY_USAGE( MBEDTLS_X509_KU_DATA_ENCIPHERMENT, "Data Encipherment" ); KEY_USAGE( MBEDTLS_X509_KU_KEY_AGREEMENT, "Key Agreement" ); KEY_USAGE( MBEDTLS_X509_KU_KEY_CERT_SIGN, "Key Cert Sign" ); KEY_USAGE( MBEDTLS_X509_KU_CRL_SIGN, "CRL Sign" ); KEY_USAGE( MBEDTLS_X509_KU_ENCIPHER_ONLY, "Encipher Only" ); KEY_USAGE( MBEDTLS_X509_KU_DECIPHER_ONLY, "Decipher Only" ); *size = n; *buf = p; return( 0 ); } static int x509_info_ext_key_usage( char **buf, size_t *size, const mbedtls_x509_sequence *extended_key_usage ) { int ret; const char *desc; size_t n = *size; char *p = *buf; const mbedtls_x509_sequence *cur = extended_key_usage; const char *sep = ""; while( cur != NULL ) { if( mbedtls_oid_get_extended_key_usage( &cur->buf, &desc ) != 0 ) desc = "???"; ret = mbedtls_snprintf( p, n, "%s%s", sep, desc ); MBEDTLS_X509_SAFE_SNPRINTF; sep = ", "; cur = cur->next; } *size = n; *buf = p; return( 0 ); } /* * Return an informational string about the certificate. */ #define BEFORE_COLON 18 #define BC "18" int mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crt *crt ) { int ret; size_t n; char *p; char key_size_str[BEFORE_COLON]; p = buf; n = size; if( NULL == crt ) { ret = mbedtls_snprintf( p, n, "\nCertificate is uninitialised!\n" ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } ret = mbedtls_snprintf( p, n, "%scert. version : %d\n", prefix, crt->version ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "%sserial number : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_serial_gets( p, n, &crt->serial ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sissuer name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &crt->issuer ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssubject name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &crt->subject ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sissued on : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crt->valid_from.year, crt->valid_from.mon, crt->valid_from.day, crt->valid_from.hour, crt->valid_from.min, crt->valid_from.sec ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sexpires on : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crt->valid_to.year, crt->valid_to.mon, crt->valid_to.day, crt->valid_to.hour, crt->valid_to.min, crt->valid_to.sec ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_sig_alg_gets( p, n, &crt->sig_oid, crt->sig_pk, crt->sig_md, crt->sig_opts ); MBEDTLS_X509_SAFE_SNPRINTF; /* Key size */ if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON, mbedtls_pk_get_name( &crt->pk ) ) ) != 0 ) { return( ret ); } ret = mbedtls_snprintf( p, n, "\n%s%-" BC "s: %d bits", prefix, key_size_str, (int) mbedtls_pk_get_bitlen( &crt->pk ) ); MBEDTLS_X509_SAFE_SNPRINTF; /* * Optional extensions */ if( crt->ext_types & MBEDTLS_X509_EXT_BASIC_CONSTRAINTS ) { ret = mbedtls_snprintf( p, n, "\n%sbasic constraints : CA=%s", prefix, crt->ca_istrue ? "true" : "false" ); MBEDTLS_X509_SAFE_SNPRINTF; if( crt->max_pathlen > 0 ) { ret = mbedtls_snprintf( p, n, ", max_pathlen=%d", crt->max_pathlen - 1 ); MBEDTLS_X509_SAFE_SNPRINTF; } } if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME ) { ret = mbedtls_snprintf( p, n, "\n%ssubject alt name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_subject_alt_name( &p, &n, &crt->subject_alt_names ) ) != 0 ) return( ret ); } if( crt->ext_types & MBEDTLS_X509_EXT_NS_CERT_TYPE ) { ret = mbedtls_snprintf( p, n, "\n%scert. type : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_cert_type( &p, &n, crt->ns_cert_type ) ) != 0 ) return( ret ); } if( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE ) { ret = mbedtls_snprintf( p, n, "\n%skey usage : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_key_usage( &p, &n, crt->key_usage ) ) != 0 ) return( ret ); } if( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE ) { ret = mbedtls_snprintf( p, n, "\n%sext key usage : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_ext_key_usage( &p, &n, &crt->ext_key_usage ) ) != 0 ) return( ret ); } ret = mbedtls_snprintf( p, n, "\n" ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } struct x509_crt_verify_string { int code; const char *string; }; static const struct x509_crt_verify_string x509_crt_verify_strings[] = { { MBEDTLS_X509_BADCERT_EXPIRED, "The certificate validity has expired" }, { MBEDTLS_X509_BADCERT_REVOKED, "The certificate has been revoked (is on a CRL)" }, { MBEDTLS_X509_BADCERT_CN_MISMATCH, "The certificate Common Name (CN) does not match with the expected CN" }, { MBEDTLS_X509_BADCERT_NOT_TRUSTED, "The certificate is not correctly signed by the trusted CA" }, { MBEDTLS_X509_BADCRL_NOT_TRUSTED, "The CRL is not correctly signed by the trusted CA" }, { MBEDTLS_X509_BADCRL_EXPIRED, "The CRL is expired" }, { MBEDTLS_X509_BADCERT_MISSING, "Certificate was missing" }, { MBEDTLS_X509_BADCERT_SKIP_VERIFY, "Certificate verification was skipped" }, { MBEDTLS_X509_BADCERT_OTHER, "Other reason (can be used by verify callback)" }, { MBEDTLS_X509_BADCERT_FUTURE, "The certificate validity starts in the future" }, { MBEDTLS_X509_BADCRL_FUTURE, "The CRL is from the future" }, { MBEDTLS_X509_BADCERT_KEY_USAGE, "Usage does not match the keyUsage extension" }, { MBEDTLS_X509_BADCERT_EXT_KEY_USAGE, "Usage does not match the extendedKeyUsage extension" }, { MBEDTLS_X509_BADCERT_NS_CERT_TYPE, "Usage does not match the nsCertType extension" }, { MBEDTLS_X509_BADCERT_BAD_MD, "The certificate is signed with an unacceptable hash." }, { MBEDTLS_X509_BADCERT_BAD_PK, "The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA)." }, { MBEDTLS_X509_BADCERT_BAD_KEY, "The certificate is signed with an unacceptable key (eg bad curve, RSA too short)." }, { MBEDTLS_X509_BADCRL_BAD_MD, "The CRL is signed with an unacceptable hash." }, { MBEDTLS_X509_BADCRL_BAD_PK, "The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA)." }, { MBEDTLS_X509_BADCRL_BAD_KEY, "The CRL is signed with an unacceptable key (eg bad curve, RSA too short)." }, { 0, NULL } }; int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix, uint32_t flags ) { int ret; const struct x509_crt_verify_string *cur; char *p = buf; size_t n = size; for( cur = x509_crt_verify_strings; cur->string != NULL ; cur++ ) { if( ( flags & cur->code ) == 0 ) continue; ret = mbedtls_snprintf( p, n, "%s%s\n", prefix, cur->string ); MBEDTLS_X509_SAFE_SNPRINTF; flags ^= cur->code; } if( flags != 0 ) { ret = mbedtls_snprintf( p, n, "%sUnknown reason " "(this should not happen)\n", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; } return( (int) ( size - n ) ); } #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt, unsigned int usage ) { unsigned int usage_must, usage_may; unsigned int may_mask = MBEDTLS_X509_KU_ENCIPHER_ONLY | MBEDTLS_X509_KU_DECIPHER_ONLY; if( ( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE ) == 0 ) return( 0 ); usage_must = usage & ~may_mask; if( ( ( crt->key_usage & ~may_mask ) & usage_must ) != usage_must ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); usage_may = usage & may_mask; if( ( ( crt->key_usage & may_mask ) | usage_may ) != usage_may ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); return( 0 ); } #endif #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt, const char *usage_oid, size_t usage_len ) { const mbedtls_x509_sequence *cur; /* Extension is not mandatory, absent means no restriction */ if( ( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE ) == 0 ) return( 0 ); /* * Look for the requested usage (or wildcard ANY) in our list */ for( cur = &crt->ext_key_usage; cur != NULL; cur = cur->next ) { const mbedtls_x509_buf *cur_oid = &cur->buf; if( cur_oid->len == usage_len && memcmp( cur_oid->p, usage_oid, usage_len ) == 0 ) { return( 0 ); } if( MBEDTLS_OID_CMP( MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE, cur_oid ) == 0 ) return( 0 ); } return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); } #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ #if defined(MBEDTLS_X509_CRL_PARSE_C) /* * Return 1 if the certificate is revoked, or 0 otherwise. */ int mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl ) { const mbedtls_x509_crl_entry *cur = &crl->entry; while( cur != NULL && cur->serial.len != 0 ) { if( crt->serial.len == cur->serial.len && memcmp( crt->serial.p, cur->serial.p, crt->serial.len ) == 0 ) { if( mbedtls_x509_time_is_past( &cur->revocation_date ) ) return( 1 ); } cur = cur->next; } return( 0 ); } /* * Check that the given certificate is not revoked according to the CRL. * Skip validation if no CRL for the given CA is present. */ static int x509_crt_verifycrl( mbedtls_x509_crt *crt, mbedtls_x509_crt *ca, mbedtls_x509_crl *crl_list, const mbedtls_x509_crt_profile *profile ) { int flags = 0; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; const mbedtls_md_info_t *md_info; if( ca == NULL ) return( flags ); while( crl_list != NULL ) { if( crl_list->version == 0 || x509_name_cmp( &crl_list->issuer, &ca->subject ) != 0 ) { crl_list = crl_list->next; continue; } /* * Check if the CA is configured to sign CRLs */ #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) if( mbedtls_x509_crt_check_key_usage( ca, MBEDTLS_X509_KU_CRL_SIGN ) != 0 ) { flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; break; } #endif /* * Check if CRL is correctly signed by the trusted CA */ if( x509_profile_check_md_alg( profile, crl_list->sig_md ) != 0 ) flags |= MBEDTLS_X509_BADCRL_BAD_MD; if( x509_profile_check_pk_alg( profile, crl_list->sig_pk ) != 0 ) flags |= MBEDTLS_X509_BADCRL_BAD_PK; md_info = mbedtls_md_info_from_type( crl_list->sig_md ); if( mbedtls_md( md_info, crl_list->tbs.p, crl_list->tbs.len, hash ) != 0 ) { /* Note: this can't happen except after an internal error */ flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; break; } if( x509_profile_check_key( profile, &ca->pk ) != 0 ) flags |= MBEDTLS_X509_BADCERT_BAD_KEY; if( mbedtls_pk_verify_ext( crl_list->sig_pk, crl_list->sig_opts, &ca->pk, crl_list->sig_md, hash, mbedtls_md_get_size( md_info ), crl_list->sig.p, crl_list->sig.len ) != 0 ) { flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; break; } /* * Check for validity of CRL (Do not drop out) */ if( mbedtls_x509_time_is_past( &crl_list->next_update ) ) flags |= MBEDTLS_X509_BADCRL_EXPIRED; if( mbedtls_x509_time_is_future( &crl_list->this_update ) ) flags |= MBEDTLS_X509_BADCRL_FUTURE; /* * Check if certificate is revoked */ if( mbedtls_x509_crt_is_revoked( crt, crl_list ) ) { flags |= MBEDTLS_X509_BADCERT_REVOKED; break; } crl_list = crl_list->next; } return( flags ); } #endif /* MBEDTLS_X509_CRL_PARSE_C */ /* * Check the signature of a certificate by its parent */ static int x509_crt_check_signature( const mbedtls_x509_crt *child, mbedtls_x509_crt *parent, mbedtls_x509_crt_restart_ctx *rs_ctx ) { const mbedtls_md_info_t *md_info; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; md_info = mbedtls_md_info_from_type( child->sig_md ); if( mbedtls_md( md_info, child->tbs.p, child->tbs.len, hash ) != 0 ) { /* Note: this can't happen except after an internal error */ return( -1 ); } /* Skip expensive computation on obvious mismatch */ if( ! mbedtls_pk_can_do( &parent->pk, child->sig_pk ) ) return( -1 ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && child->sig_pk == MBEDTLS_PK_ECDSA ) { return( mbedtls_pk_verify_restartable( &parent->pk, child->sig_md, hash, mbedtls_md_get_size( md_info ), child->sig.p, child->sig.len, &rs_ctx->pk ) ); } #else (void) rs_ctx; #endif return( mbedtls_pk_verify_ext( child->sig_pk, child->sig_opts, &parent->pk, child->sig_md, hash, mbedtls_md_get_size( md_info ), child->sig.p, child->sig.len ) ); } /* * Check if 'parent' is a suitable parent (signing CA) for 'child'. * Return 0 if yes, -1 if not. * * top means parent is a locally-trusted certificate */ static int x509_crt_check_parent( const mbedtls_x509_crt *child, const mbedtls_x509_crt *parent, int top ) { int need_ca_bit; /* Parent must be the issuer */ if( x509_name_cmp( &child->issuer, &parent->subject ) != 0 ) return( -1 ); /* Parent must have the basicConstraints CA bit set as a general rule */ need_ca_bit = 1; /* Exception: v1/v2 certificates that are locally trusted. */ if( top && parent->version < 3 ) need_ca_bit = 0; if( need_ca_bit && ! parent->ca_istrue ) return( -1 ); #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) if( need_ca_bit && mbedtls_x509_crt_check_key_usage( parent, MBEDTLS_X509_KU_KEY_CERT_SIGN ) != 0 ) { return( -1 ); } #endif return( 0 ); } /* * Find a suitable parent for child in candidates, or return NULL. * * Here suitable is defined as: * 1. subject name matches child's issuer * 2. if necessary, the CA bit is set and key usage allows signing certs * 3. for trusted roots, the signature is correct * (for intermediates, the signature is checked and the result reported) * 4. pathlen constraints are satisfied * * If there's a suitable candidate which is also time-valid, return the first * such. Otherwise, return the first suitable candidate (or NULL if there is * none). * * The rationale for this rule is that someone could have a list of trusted * roots with two versions on the same root with different validity periods. * (At least one user reported having such a list and wanted it to just work.) * The reason we don't just require time-validity is that generally there is * only one version, and if it's expired we want the flags to state that * rather than NOT_TRUSTED, as would be the case if we required it here. * * The rationale for rule 3 (signature for trusted roots) is that users might * have two versions of the same CA with different keys in their list, and the * way we select the correct one is by checking the signature (as we don't * rely on key identifier extensions). (This is one way users might choose to * handle key rollover, another relies on self-issued certs, see [SIRO].) * * Arguments: * - [in] child: certificate for which we're looking for a parent * - [in] candidates: chained list of potential parents * - [out] r_parent: parent found (or NULL) * - [out] r_signature_is_good: 1 if child signature by parent is valid, or 0 * - [in] top: 1 if candidates consists of trusted roots, ie we're at the top * of the chain, 0 otherwise * - [in] path_cnt: number of intermediates seen so far * - [in] self_cnt: number of self-signed intermediates seen so far * (will never be greater than path_cnt) * - [in-out] rs_ctx: context for restarting operations * * Return value: * - 0 on success * - MBEDTLS_ERR_ECP_IN_PROGRESS otherwise */ static int x509_crt_find_parent_in( mbedtls_x509_crt *child, mbedtls_x509_crt *candidates, mbedtls_x509_crt **r_parent, int *r_signature_is_good, int top, unsigned path_cnt, unsigned self_cnt, mbedtls_x509_crt_restart_ctx *rs_ctx ) { int ret; mbedtls_x509_crt *parent, *fallback_parent; int signature_is_good, fallback_signature_is_good; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* did we have something in progress? */ if( rs_ctx != NULL && rs_ctx->parent != NULL ) { /* restore saved state */ parent = rs_ctx->parent; fallback_parent = rs_ctx->fallback_parent; fallback_signature_is_good = rs_ctx->fallback_signature_is_good; /* clear saved state */ rs_ctx->parent = NULL; rs_ctx->fallback_parent = NULL; rs_ctx->fallback_signature_is_good = 0; /* resume where we left */ goto check_signature; } #endif fallback_parent = NULL; fallback_signature_is_good = 0; for( parent = candidates; parent != NULL; parent = parent->next ) { /* basic parenting skills (name, CA bit, key usage) */ if( x509_crt_check_parent( child, parent, top ) != 0 ) continue; /* +1 because stored max_pathlen is 1 higher that the actual value */ if( parent->max_pathlen > 0 && (size_t) parent->max_pathlen < 1 + path_cnt - self_cnt ) { continue; } /* Signature */ #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) check_signature: #endif ret = x509_crt_check_signature( child, parent, rs_ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { /* save state */ rs_ctx->parent = parent; rs_ctx->fallback_parent = fallback_parent; rs_ctx->fallback_signature_is_good = fallback_signature_is_good; return( ret ); } #else (void) ret; #endif signature_is_good = ret == 0; if( top && ! signature_is_good ) continue; /* optional time check */ if( mbedtls_x509_time_is_past( &parent->valid_to ) || mbedtls_x509_time_is_future( &parent->valid_from ) ) { if( fallback_parent == NULL ) { fallback_parent = parent; fallback_signature_is_good = signature_is_good; } continue; } break; } if( parent != NULL ) { *r_parent = parent; *r_signature_is_good = signature_is_good; } else { *r_parent = fallback_parent; *r_signature_is_good = fallback_signature_is_good; } return( 0 ); } /* * Find a parent in trusted CAs or the provided chain, or return NULL. * * Searches in trusted CAs first, and return the first suitable parent found * (see find_parent_in() for definition of suitable). * * Arguments: * - [in] child: certificate for which we're looking for a parent, followed * by a chain of possible intermediates * - [in] trust_ca: list of locally trusted certificates * - [out] parent: parent found (or NULL) * - [out] parent_is_trusted: 1 if returned `parent` is trusted, or 0 * - [out] signature_is_good: 1 if child signature by parent is valid, or 0 * - [in] path_cnt: number of links in the chain so far (EE -> ... -> child) * - [in] self_cnt: number of self-signed certs in the chain so far * (will always be no greater than path_cnt) * - [in-out] rs_ctx: context for restarting operations * * Return value: * - 0 on success * - MBEDTLS_ERR_ECP_IN_PROGRESS otherwise */ static int x509_crt_find_parent( mbedtls_x509_crt *child, mbedtls_x509_crt *trust_ca, mbedtls_x509_crt **parent, int *parent_is_trusted, int *signature_is_good, unsigned path_cnt, unsigned self_cnt, mbedtls_x509_crt_restart_ctx *rs_ctx ) { int ret; mbedtls_x509_crt *search_list; *parent_is_trusted = 1; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* restore then clear saved state if we have some stored */ if( rs_ctx != NULL && rs_ctx->parent_is_trusted != -1 ) { *parent_is_trusted = rs_ctx->parent_is_trusted; rs_ctx->parent_is_trusted = -1; } #endif while( 1 ) { search_list = *parent_is_trusted ? trust_ca : child->next; ret = x509_crt_find_parent_in( child, search_list, parent, signature_is_good, *parent_is_trusted, path_cnt, self_cnt, rs_ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { /* save state */ rs_ctx->parent_is_trusted = *parent_is_trusted; return( ret ); } #else (void) ret; #endif /* stop here if found or already in second iteration */ if( *parent != NULL || *parent_is_trusted == 0 ) break; /* prepare second iteration */ *parent_is_trusted = 0; } /* extra precaution against mistakes in the caller */ if( *parent == NULL ) { *parent_is_trusted = 0; *signature_is_good = 0; } return( 0 ); } /* * Check if an end-entity certificate is locally trusted * * Currently we require such certificates to be self-signed (actually only * check for self-issued as self-signatures are not checked) */ static int x509_crt_check_ee_locally_trusted( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca ) { mbedtls_x509_crt *cur; /* must be self-issued */ if( x509_name_cmp( &crt->issuer, &crt->subject ) != 0 ) return( -1 ); /* look for an exact match with trusted cert */ for( cur = trust_ca; cur != NULL; cur = cur->next ) { if( crt->raw.len == cur->raw.len && memcmp( crt->raw.p, cur->raw.p, crt->raw.len ) == 0 ) { return( 0 ); } } /* too bad */ return( -1 ); } /* * Build and verify a certificate chain * * Given a peer-provided list of certificates EE, C1, ..., Cn and * a list of trusted certs R1, ... Rp, try to build and verify a chain * EE, Ci1, ... Ciq [, Rj] * such that every cert in the chain is a child of the next one, * jumping to a trusted root as early as possible. * * Verify that chain and return it with flags for all issues found. * * Special cases: * - EE == Rj -> return a one-element list containing it * - EE, Ci1, ..., Ciq cannot be continued with a trusted root * -> return that chain with NOT_TRUSTED set on Ciq * * Tests for (aspects of) this function should include at least: * - trusted EE * - EE -> trusted root * - EE -> intermedate CA -> trusted root * - if relevant: EE untrusted * - if relevant: EE -> intermediate, untrusted * with the aspect under test checked at each relevant level (EE, int, root). * For some aspects longer chains are required, but usually length 2 is * enough (but length 1 is not in general). * * Arguments: * - [in] crt: the cert list EE, C1, ..., Cn * - [in] trust_ca: the trusted list R1, ..., Rp * - [in] ca_crl, profile: as in verify_with_profile() * - [out] ver_chain: the built and verified chain * Only valid when return value is 0, may contain garbage otherwise! * Restart note: need not be the same when calling again to resume. * - [in-out] rs_ctx: context for restarting operations * * Return value: * - non-zero if the chain could not be fully built and examined * - 0 is the chain was successfully built and examined, * even if it was found to be invalid */ static int x509_crt_verify_chain( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, mbedtls_x509_crt_verify_chain *ver_chain, mbedtls_x509_crt_restart_ctx *rs_ctx ) { /* Don't initialize any of those variables here, so that the compiler can * catch potential issues with jumping ahead when restarting */ int ret; uint32_t *flags; mbedtls_x509_crt_verify_chain_item *cur; mbedtls_x509_crt *child; mbedtls_x509_crt *parent; int parent_is_trusted; int child_is_trusted; int signature_is_good; unsigned self_cnt; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* resume if we had an operation in progress */ if( rs_ctx != NULL && rs_ctx->in_progress == x509_crt_rs_find_parent ) { /* restore saved state */ *ver_chain = rs_ctx->ver_chain; /* struct copy */ self_cnt = rs_ctx->self_cnt; /* restore derived state */ cur = &ver_chain->items[ver_chain->len - 1]; child = cur->crt; flags = &cur->flags; goto find_parent; } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ child = crt; self_cnt = 0; parent_is_trusted = 0; child_is_trusted = 0; while( 1 ) { /* Add certificate to the verification chain */ cur = &ver_chain->items[ver_chain->len]; cur->crt = child; cur->flags = 0; ver_chain->len++; flags = &cur->flags; /* Check time-validity (all certificates) */ if( mbedtls_x509_time_is_past( &child->valid_to ) ) *flags |= MBEDTLS_X509_BADCERT_EXPIRED; if( mbedtls_x509_time_is_future( &child->valid_from ) ) *flags |= MBEDTLS_X509_BADCERT_FUTURE; /* Stop here for trusted roots (but not for trusted EE certs) */ if( child_is_trusted ) return( 0 ); /* Check signature algorithm: MD & PK algs */ if( x509_profile_check_md_alg( profile, child->sig_md ) != 0 ) *flags |= MBEDTLS_X509_BADCERT_BAD_MD; if( x509_profile_check_pk_alg( profile, child->sig_pk ) != 0 ) *flags |= MBEDTLS_X509_BADCERT_BAD_PK; /* Special case: EE certs that are locally trusted */ if( ver_chain->len == 1 && x509_crt_check_ee_locally_trusted( child, trust_ca ) == 0 ) { return( 0 ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) find_parent: #endif /* Look for a parent in trusted CAs or up the chain */ ret = x509_crt_find_parent( child, trust_ca, &parent, &parent_is_trusted, &signature_is_good, ver_chain->len - 1, self_cnt, rs_ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { /* save state */ rs_ctx->in_progress = x509_crt_rs_find_parent; rs_ctx->self_cnt = self_cnt; rs_ctx->ver_chain = *ver_chain; /* struct copy */ return( ret ); } #else (void) ret; #endif /* No parent? We're done here */ if( parent == NULL ) { *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED; return( 0 ); } /* Count intermediate self-issued (not necessarily self-signed) certs. * These can occur with some strategies for key rollover, see [SIRO], * and should be excluded from max_pathlen checks. */ if( ver_chain->len != 1 && x509_name_cmp( &child->issuer, &child->subject ) == 0 ) { self_cnt++; } /* path_cnt is 0 for the first intermediate CA, * and if parent is trusted it's not an intermediate CA */ if( ! parent_is_trusted && ver_chain->len > MBEDTLS_X509_MAX_INTERMEDIATE_CA ) { /* return immediately to avoid overflow the chain array */ return( MBEDTLS_ERR_X509_FATAL_ERROR ); } /* signature was checked while searching parent */ if( ! signature_is_good ) *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED; /* check size of signing key */ if( x509_profile_check_key( profile, &parent->pk ) != 0 ) *flags |= MBEDTLS_X509_BADCERT_BAD_KEY; #if defined(MBEDTLS_X509_CRL_PARSE_C) /* Check trusted CA's CRL for the given crt */ *flags |= x509_crt_verifycrl( child, parent, ca_crl, profile ); #else (void) ca_crl; #endif /* prepare for next iteration */ child = parent; parent = NULL; child_is_trusted = parent_is_trusted; signature_is_good = 0; } } /* * Check for CN match */ static int x509_crt_check_cn( const mbedtls_x509_buf *name, const char *cn, size_t cn_len ) { /* try exact match */ if( name->len == cn_len && x509_memcasecmp( cn, name->p, cn_len ) == 0 ) { return( 0 ); } /* try wildcard match */ if( x509_check_wildcard( cn, name ) == 0 ) { return( 0 ); } return( -1 ); } /* * Verify the requested CN - only call this if cn is not NULL! */ static void x509_crt_verify_name( const mbedtls_x509_crt *crt, const char *cn, uint32_t *flags ) { const mbedtls_x509_name *name; const mbedtls_x509_sequence *cur; size_t cn_len = strlen( cn ); if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME ) { for( cur = &crt->subject_alt_names; cur != NULL; cur = cur->next ) { if( x509_crt_check_cn( &cur->buf, cn, cn_len ) == 0 ) break; } if( cur == NULL ) *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; } else { for( name = &crt->subject; name != NULL; name = name->next ) { if( MBEDTLS_OID_CMP( MBEDTLS_OID_AT_CN, &name->oid ) == 0 && x509_crt_check_cn( &name->val, cn, cn_len ) == 0 ) { break; } } if( name == NULL ) *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; } } /* * Merge the flags for all certs in the chain, after calling callback */ static int x509_crt_merge_flags_with_cb( uint32_t *flags, const mbedtls_x509_crt_verify_chain *ver_chain, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { int ret; unsigned i; uint32_t cur_flags; const mbedtls_x509_crt_verify_chain_item *cur; for( i = ver_chain->len; i != 0; --i ) { cur = &ver_chain->items[i-1]; cur_flags = cur->flags; if( NULL != f_vrfy ) if( ( ret = f_vrfy( p_vrfy, cur->crt, (int) i-1, &cur_flags ) ) != 0 ) return( ret ); *flags |= cur_flags; } return( 0 ); } /* * Verify the certificate validity (default profile, not restartable) */ int mbedtls_x509_crt_verify( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { return( mbedtls_x509_crt_verify_restartable( crt, trust_ca, ca_crl, &mbedtls_x509_crt_profile_default, cn, flags, f_vrfy, p_vrfy, NULL ) ); } /* * Verify the certificate validity (user-chosen profile, not restartable) */ int mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { return( mbedtls_x509_crt_verify_restartable( crt, trust_ca, ca_crl, profile, cn, flags, f_vrfy, p_vrfy, NULL ) ); } /* * Verify the certificate validity, with profile, restartable version * * This function: * - checks the requested CN (if any) * - checks the type and size of the EE cert's key, * as that isn't done as part of chain building/verification currently * - builds and verifies the chain * - then calls the callback and merges the flags */ int mbedtls_x509_crt_verify_restartable( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy, mbedtls_x509_crt_restart_ctx *rs_ctx ) { int ret; mbedtls_pk_type_t pk_type; mbedtls_x509_crt_verify_chain ver_chain; uint32_t ee_flags; *flags = 0; ee_flags = 0; x509_crt_verify_chain_reset( &ver_chain ); if( profile == NULL ) { ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA; goto exit; } /* check name if requested */ if( cn != NULL ) x509_crt_verify_name( crt, cn, &ee_flags ); /* Check the type and size of the key */ pk_type = mbedtls_pk_get_type( &crt->pk ); if( x509_profile_check_pk_alg( profile, pk_type ) != 0 ) ee_flags |= MBEDTLS_X509_BADCERT_BAD_PK; if( x509_profile_check_key( profile, &crt->pk ) != 0 ) ee_flags |= MBEDTLS_X509_BADCERT_BAD_KEY; /* Check the chain */ ret = x509_crt_verify_chain( crt, trust_ca, ca_crl, profile, &ver_chain, rs_ctx ); if( ret != 0 ) goto exit; /* Merge end-entity flags */ ver_chain.items[0].flags |= ee_flags; /* Build final flags, calling callback on the way if any */ ret = x509_crt_merge_flags_with_cb( flags, &ver_chain, f_vrfy, p_vrfy ); exit: #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) mbedtls_x509_crt_restart_free( rs_ctx ); #endif /* prevent misuse of the vrfy callback - VERIFY_FAILED would be ignored by * the SSL module for authmode optional, but non-zero return from the * callback means a fatal error so it shouldn't be ignored */ if( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ) ret = MBEDTLS_ERR_X509_FATAL_ERROR; if( ret != 0 ) { *flags = (uint32_t) -1; return( ret ); } if( *flags != 0 ) return( MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ); return( 0 ); } /* * Initialize a certificate chain */ void mbedtls_x509_crt_init( mbedtls_x509_crt *crt ) { memset( crt, 0, sizeof(mbedtls_x509_crt) ); } /* * Unallocate all certificate data */ void mbedtls_x509_crt_free( mbedtls_x509_crt *crt ) { mbedtls_x509_crt *cert_cur = crt; mbedtls_x509_crt *cert_prv; mbedtls_x509_name *name_cur; mbedtls_x509_name *name_prv; mbedtls_x509_sequence *seq_cur; mbedtls_x509_sequence *seq_prv; if( crt == NULL ) return; do { mbedtls_pk_free( &cert_cur->pk ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) mbedtls_free( cert_cur->sig_opts ); #endif name_cur = cert_cur->issuer.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } name_cur = cert_cur->subject.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } seq_cur = cert_cur->ext_key_usage.next; while( seq_cur != NULL ) { seq_prv = seq_cur; seq_cur = seq_cur->next; mbedtls_platform_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) ); mbedtls_free( seq_prv ); } seq_cur = cert_cur->subject_alt_names.next; while( seq_cur != NULL ) { seq_prv = seq_cur; seq_cur = seq_cur->next; mbedtls_platform_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) ); mbedtls_free( seq_prv ); } if( cert_cur->raw.p != NULL ) { mbedtls_platform_zeroize( cert_cur->raw.p, cert_cur->raw.len ); mbedtls_free( cert_cur->raw.p ); } cert_cur = cert_cur->next; } while( cert_cur != NULL ); cert_cur = crt; do { cert_prv = cert_cur; cert_cur = cert_cur->next; mbedtls_platform_zeroize( cert_prv, sizeof( mbedtls_x509_crt ) ); if( cert_prv != crt ) mbedtls_free( cert_prv ); } while( cert_cur != NULL ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* * Initialize a restart context */ void mbedtls_x509_crt_restart_init( mbedtls_x509_crt_restart_ctx *ctx ) { mbedtls_pk_restart_init( &ctx->pk ); ctx->parent = NULL; ctx->fallback_parent = NULL; ctx->fallback_signature_is_good = 0; ctx->parent_is_trusted = -1; ctx->in_progress = x509_crt_rs_none; ctx->self_cnt = 0; x509_crt_verify_chain_reset( &ctx->ver_chain ); } /* * Free the components of a restart context */ void mbedtls_x509_crt_restart_free( mbedtls_x509_crt_restart_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_pk_restart_free( &ctx->pk ); mbedtls_x509_crt_restart_init( ctx ); } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ fldigi-4.1.06/src/mbedtls/timing.c0000664000175000017500000003441213507401434013644 00000000000000/* * Portable interface to the CPU cycle counter * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif #if defined(MBEDTLS_TIMING_C) #include "mbedtls/timing.h" #if !defined(MBEDTLS_TIMING_ALT) #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ !defined(__HAIKU__) #error "This module only works on Unix and Windows, see MBEDTLS_TIMING_C in config.h" #endif #ifndef asm #define asm __asm #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include #include #include struct _hr_time { LARGE_INTEGER start; }; #else #include #include #include #include #include struct _hr_time { struct timeval start; }; #endif /* _WIN32 && !EFIX64 && !EFI32 */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ ( defined(_MSC_VER) && defined(_M_IX86) ) || defined(__WATCOMC__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tsc; __asm rdtsc __asm mov [tsc], eax return( tsc ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */ /* some versions of mingw-64 have 32-bit longs even on x84_64 */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && ( defined(__i386__) || ( \ ( defined(__amd64__) || defined( __x86_64__) ) && __SIZEOF_LONG__ == 4 ) ) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long lo, hi; asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) ); return( lo ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __i386__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && ( defined(__amd64__) || defined(__x86_64__) ) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long lo, hi; asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) ); return( lo | ( hi << 32 ) ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && ( __amd64__ || __x86_64__ ) */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && ( defined(__powerpc__) || defined(__ppc__) ) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tbl, tbu0, tbu1; do { asm volatile( "mftbu %0" : "=r" (tbu0) ); asm volatile( "mftb %0" : "=r" (tbl ) ); asm volatile( "mftbu %0" : "=r" (tbu1) ); } while( tbu0 != tbu1 ); return( tbl ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && ( __powerpc__ || __ppc__ ) */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__sparc64__) #if defined(__OpenBSD__) #warning OpenBSD does not allow access to tick register using software version instead #else #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tick; asm volatile( "rdpr %%tick, %0;" : "=&r" (tick) ); return( tick ); } #endif /* __OpenBSD__ */ #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __sparc64__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tick; asm volatile( ".byte 0x83, 0x41, 0x00, 0x00" ); asm volatile( "mov %%g1, %0" : "=r" (tick) ); return( tick ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __sparc__ && !__sparc64__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__alpha__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long cc; asm volatile( "rpcc %0" : "=r" (cc) ); return( cc & 0xFFFFFFFF ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __alpha__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__ia64__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long itc; asm volatile( "mov %0 = ar.itc" : "=r" (itc) ); return( itc ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __ia64__ */ #if !defined(HAVE_HARDCLOCK) && defined(_MSC_VER) && \ !defined(EFIX64) && !defined(EFI32) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { LARGE_INTEGER offset; QueryPerformanceCounter( &offset ); return( (unsigned long)( offset.QuadPart ) ); } #endif /* !HAVE_HARDCLOCK && _MSC_VER && !EFIX64 && !EFI32 */ #if !defined(HAVE_HARDCLOCK) #define HAVE_HARDCLOCK static int hardclock_init = 0; static struct timeval tv_init; unsigned long mbedtls_timing_hardclock( void ) { struct timeval tv_cur; if( hardclock_init == 0 ) { gettimeofday( &tv_init, NULL ); hardclock_init = 1; } gettimeofday( &tv_cur, NULL ); return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000 + ( tv_cur.tv_usec - tv_init.tv_usec ) ); } #endif /* !HAVE_HARDCLOCK */ volatile int mbedtls_timing_alarmed = 0; #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ) { struct _hr_time *t = (struct _hr_time *) val; if( reset ) { QueryPerformanceCounter( &t->start ); return( 0 ); } else { unsigned long delta; LARGE_INTEGER now, hfreq; QueryPerformanceCounter( &now ); QueryPerformanceFrequency( &hfreq ); delta = (unsigned long)( ( now.QuadPart - t->start.QuadPart ) * 1000ul / hfreq.QuadPart ); return( delta ); } } /* It's OK to use a global because alarm() is supposed to be global anyway */ static DWORD alarmMs; static void TimerProc( void *TimerContext ) { (void) TimerContext; Sleep( alarmMs ); mbedtls_timing_alarmed = 1; /* _endthread will be called implicitly on return * That ensures execution of thread funcition's epilogue */ } void mbedtls_set_alarm( int seconds ) { if( seconds == 0 ) { /* No need to create a thread for this simple case. * Also, this shorcut is more reliable at least on MinGW32 */ mbedtls_timing_alarmed = 1; return; } mbedtls_timing_alarmed = 0; alarmMs = seconds * 1000; (void) _beginthread( TimerProc, 0, NULL ); } #else /* _WIN32 && !EFIX64 && !EFI32 */ unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ) { struct _hr_time *t = (struct _hr_time *) val; if( reset ) { gettimeofday( &t->start, NULL ); return( 0 ); } else { unsigned long delta; struct timeval now; gettimeofday( &now, NULL ); delta = ( now.tv_sec - t->start.tv_sec ) * 1000ul + ( now.tv_usec - t->start.tv_usec ) / 1000; return( delta ); } } static void sighandler( int signum ) { mbedtls_timing_alarmed = 1; signal( signum, sighandler ); } void mbedtls_set_alarm( int seconds ) { mbedtls_timing_alarmed = 0; signal( SIGALRM, sighandler ); alarm( seconds ); if( seconds == 0 ) { /* alarm(0) cancelled any previous pending alarm, but the handler won't fire, so raise the flag straight away. */ mbedtls_timing_alarmed = 1; } } #endif /* _WIN32 && !EFIX64 && !EFI32 */ /* * Set delays to watch */ void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ) { mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data; ctx->int_ms = int_ms; ctx->fin_ms = fin_ms; if( fin_ms != 0 ) (void) mbedtls_timing_get_timer( &ctx->timer, 1 ); } /* * Get number of delays expired */ int mbedtls_timing_get_delay( void *data ) { mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data; unsigned long elapsed_ms; if( ctx->fin_ms == 0 ) return( -1 ); elapsed_ms = mbedtls_timing_get_timer( &ctx->timer, 0 ); if( elapsed_ms >= ctx->fin_ms ) return( 2 ); if( elapsed_ms >= ctx->int_ms ) return( 1 ); return( 0 ); } #endif /* !MBEDTLS_TIMING_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * Busy-waits for the given number of milliseconds. * Used for testing mbedtls_timing_hardclock. */ static void busy_msleep( unsigned long msec ) { struct mbedtls_timing_hr_time hires; unsigned long i = 0; /* for busy-waiting */ volatile unsigned long j; /* to prevent optimisation */ (void) mbedtls_timing_get_timer( &hires, 1 ); while( mbedtls_timing_get_timer( &hires, 0 ) < msec ) i++; j = i; (void) j; } #define FAIL do \ { \ if( verbose != 0 ) \ { \ mbedtls_printf( "failed at line %d\n", __LINE__ ); \ mbedtls_printf( " cycles=%lu ratio=%lu millisecs=%lu secs=%lu hardfail=%d a=%lu b=%lu\n", \ cycles, ratio, millisecs, secs, hardfail, \ (unsigned long) a, (unsigned long) b ); \ mbedtls_printf( " elapsed(hires)=%lu elapsed(ctx)=%lu status(ctx)=%d\n", \ mbedtls_timing_get_timer( &hires, 0 ), \ mbedtls_timing_get_timer( &ctx.timer, 0 ), \ mbedtls_timing_get_delay( &ctx ) ); \ } \ return( 1 ); \ } while( 0 ) /* * Checkup routine * * Warning: this is work in progress, some tests may not be reliable enough * yet! False positives may happen. */ int mbedtls_timing_self_test( int verbose ) { unsigned long cycles = 0, ratio = 0; unsigned long millisecs = 0, secs = 0; int hardfail = 0; struct mbedtls_timing_hr_time hires; uint32_t a = 0, b = 0; mbedtls_timing_delay_context ctx; if( verbose != 0 ) mbedtls_printf( " TIMING tests note: will take some time!\n" ); if( verbose != 0 ) mbedtls_printf( " TIMING test #1 (set_alarm / get_timer): " ); { secs = 1; (void) mbedtls_timing_get_timer( &hires, 1 ); mbedtls_set_alarm( (int) secs ); while( !mbedtls_timing_alarmed ) ; millisecs = mbedtls_timing_get_timer( &hires, 0 ); /* For some reason on Windows it looks like alarm has an extra delay * (maybe related to creating a new thread). Allow some room here. */ if( millisecs < 800 * secs || millisecs > 1200 * secs + 300 ) FAIL; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " TIMING test #2 (set/get_delay ): " ); { a = 800; b = 400; mbedtls_timing_set_delay( &ctx, a, a + b ); /* T = 0 */ busy_msleep( a - a / 4 ); /* T = a - a/4 */ if( mbedtls_timing_get_delay( &ctx ) != 0 ) FAIL; busy_msleep( a / 4 + b / 4 ); /* T = a + b/4 */ if( mbedtls_timing_get_delay( &ctx ) != 1 ) FAIL; busy_msleep( b ); /* T = a + b + b/4 */ if( mbedtls_timing_get_delay( &ctx ) != 2 ) FAIL; } mbedtls_timing_set_delay( &ctx, 0, 0 ); busy_msleep( 200 ); if( mbedtls_timing_get_delay( &ctx ) != -1 ) FAIL; if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " TIMING test #3 (hardclock / get_timer): " ); /* * Allow one failure for possible counter wrapping. * On a 4Ghz 32-bit machine the cycle counter wraps about once per second; * since the whole test is about 10ms, it shouldn't happen twice in a row. */ hard_test: if( hardfail > 1 ) { if( verbose != 0 ) mbedtls_printf( "failed (ignored)\n" ); goto hard_test_done; } /* Get a reference ratio cycles/ms */ millisecs = 1; cycles = mbedtls_timing_hardclock(); busy_msleep( millisecs ); cycles = mbedtls_timing_hardclock() - cycles; ratio = cycles / millisecs; /* Check that the ratio is mostly constant */ for( millisecs = 2; millisecs <= 4; millisecs++ ) { cycles = mbedtls_timing_hardclock(); busy_msleep( millisecs ); cycles = mbedtls_timing_hardclock() - cycles; /* Allow variation up to 20% */ if( cycles / millisecs < ratio - ratio / 5 || cycles / millisecs > ratio + ratio / 5 ) { hardfail++; goto hard_test; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); hard_test_done: if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_TIMING_C */ fldigi-4.1.06/src/mbedtls/x509.c0000664000175000017500000007033013507401434013061 00000000000000/* * X.509 common functions for parsing and verification * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_USE_C) #include "mbedtls/x509.h" #include "mbedtls/asn1.h" #include "mbedtls/oid.h" #include #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_printf printf #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" #endif #if defined(MBEDTLS_HAVE_TIME_DATE) #include "mbedtls/platform_util.h" #include #endif #define CHECK(code) if( ( ret = code ) != 0 ){ return( ret ); } #define CHECK_RANGE(min, max, val) if( val < min || val > max ){ return( ret ); } /* * CertificateSerialNumber ::= INTEGER */ int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *serial ) { int ret; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_SERIAL + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( **p != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_PRIMITIVE | 2 ) && **p != MBEDTLS_ASN1_INTEGER ) return( MBEDTLS_ERR_X509_INVALID_SERIAL + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); serial->tag = *(*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, &serial->len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_SERIAL + ret ); serial->p = *p; *p += serial->len; return( 0 ); } /* Get an algorithm identifier without parameters (eg for signatures) * * AlgorithmIdentifier ::= SEQUENCE { * algorithm OBJECT IDENTIFIER, * parameters ANY DEFINED BY algorithm OPTIONAL } */ int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg ) { int ret; if( ( ret = mbedtls_asn1_get_alg_null( p, end, alg ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); return( 0 ); } /* * Parse an algorithm identifier with (optional) paramaters */ int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg, mbedtls_x509_buf *params ) { int ret; if( ( ret = mbedtls_asn1_get_alg( p, end, alg, params ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); return( 0 ); } #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) /* * HashAlgorithm ::= AlgorithmIdentifier * * AlgorithmIdentifier ::= SEQUENCE { * algorithm OBJECT IDENTIFIER, * parameters ANY DEFINED BY algorithm OPTIONAL } * * For HashAlgorithm, parameters MUST be NULL or absent. */ static int x509_get_hash_alg( const mbedtls_x509_buf *alg, mbedtls_md_type_t *md_alg ) { int ret; unsigned char *p; const unsigned char *end; mbedtls_x509_buf md_oid; size_t len; /* Make sure we got a SEQUENCE and setup bounds */ if( alg->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); p = (unsigned char *) alg->p; end = p + alg->len; if( p >= end ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); /* Parse md_oid */ md_oid.tag = *p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &md_oid.len, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); md_oid.p = p; p += md_oid.len; /* Get md_alg from md_oid */ if( ( ret = mbedtls_oid_get_md_alg( &md_oid, md_alg ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); /* Make sure params is absent of NULL */ if( p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_NULL ) ) != 0 || len != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * RSASSA-PSS-params ::= SEQUENCE { * hashAlgorithm [0] HashAlgorithm DEFAULT sha1Identifier, * maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1Identifier, * saltLength [2] INTEGER DEFAULT 20, * trailerField [3] INTEGER DEFAULT 1 } * -- Note that the tags in this Sequence are explicit. * * RFC 4055 (which defines use of RSASSA-PSS in PKIX) states that the value * of trailerField MUST be 1, and PKCS#1 v2.2 doesn't even define any other * option. Enfore this at parsing time. */ int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params, mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, int *salt_len ) { int ret; unsigned char *p; const unsigned char *end, *end2; size_t len; mbedtls_x509_buf alg_id, alg_params; /* First set everything to defaults */ *md_alg = MBEDTLS_MD_SHA1; *mgf_md = MBEDTLS_MD_SHA1; *salt_len = 20; /* Make sure params is a SEQUENCE and setup bounds */ if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); p = (unsigned char *) params->p; end = p + params->len; if( p == end ) return( 0 ); /* * HashAlgorithm */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 ) { end2 = p + len; /* HashAlgorithm ::= AlgorithmIdentifier (without parameters) */ if( ( ret = mbedtls_x509_get_alg_null( &p, end2, &alg_id ) ) != 0 ) return( ret ); if( ( ret = mbedtls_oid_get_md_alg( &alg_id, md_alg ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p == end ) return( 0 ); /* * MaskGenAlgorithm */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 ) { end2 = p + len; /* MaskGenAlgorithm ::= AlgorithmIdentifier (params = HashAlgorithm) */ if( ( ret = mbedtls_x509_get_alg( &p, end2, &alg_id, &alg_params ) ) != 0 ) return( ret ); /* Only MFG1 is recognised for now */ if( MBEDTLS_OID_CMP( MBEDTLS_OID_MGF1, &alg_id ) != 0 ) return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE + MBEDTLS_ERR_OID_NOT_FOUND ); /* Parse HashAlgorithm */ if( ( ret = x509_get_hash_alg( &alg_params, mgf_md ) ) != 0 ) return( ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p == end ) return( 0 ); /* * salt_len */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 2 ) ) == 0 ) { end2 = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end2, salt_len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p == end ) return( 0 ); /* * trailer_field (if present, must be 1) */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 3 ) ) == 0 ) { int trailer_field; end2 = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end2, &trailer_field ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); if( trailer_field != 1 ) return( MBEDTLS_ERR_X509_INVALID_ALG ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ /* * AttributeTypeAndValue ::= SEQUENCE { * type AttributeType, * value AttributeValue } * * AttributeType ::= OBJECT IDENTIFIER * * AttributeValue ::= ANY DEFINED BY AttributeType */ static int x509_get_attr_type_value( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ) { int ret; size_t len; mbedtls_x509_buf *oid; mbedtls_x509_buf *val; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); oid = &cur->oid; oid->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &oid->len, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); oid->p = *p; *p += oid->len; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( **p != MBEDTLS_ASN1_BMP_STRING && **p != MBEDTLS_ASN1_UTF8_STRING && **p != MBEDTLS_ASN1_T61_STRING && **p != MBEDTLS_ASN1_PRINTABLE_STRING && **p != MBEDTLS_ASN1_IA5_STRING && **p != MBEDTLS_ASN1_UNIVERSAL_STRING && **p != MBEDTLS_ASN1_BIT_STRING ) return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); val = &cur->val; val->tag = *(*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, &val->len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); val->p = *p; *p += val->len; cur->next = NULL; return( 0 ); } /* * Name ::= CHOICE { -- only one possibility for now -- * rdnSequence RDNSequence } * * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName * * RelativeDistinguishedName ::= * SET OF AttributeTypeAndValue * * AttributeTypeAndValue ::= SEQUENCE { * type AttributeType, * value AttributeValue } * * AttributeType ::= OBJECT IDENTIFIER * * AttributeValue ::= ANY DEFINED BY AttributeType * * The data structure is optimized for the common case where each RDN has only * one element, which is represented as a list of AttributeTypeAndValue. * For the general case we still use a flat list, but we mark elements of the * same set so that they are "merged" together in the functions that consume * this list, eg mbedtls_x509_dn_gets(). */ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ) { int ret; size_t set_len; const unsigned char *end_set; /* don't use recursion, we'd risk stack overflow if not optimized */ while( 1 ) { /* * parse SET */ if( ( ret = mbedtls_asn1_get_tag( p, end, &set_len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); end_set = *p + set_len; while( 1 ) { if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 ) return( ret ); if( *p == end_set ) break; /* Mark this item as being no the only one in a set */ cur->next_merged = 1; cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); cur = cur->next; } /* * continue until end of SEQUENCE is reached */ if( *p == end ) return( 0 ); cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); cur = cur->next; } } static int x509_parse_int( unsigned char **p, size_t n, int *res ) { *res = 0; for( ; n > 0; --n ) { if( ( **p < '0') || ( **p > '9' ) ) return ( MBEDTLS_ERR_X509_INVALID_DATE ); *res *= 10; *res += ( *(*p)++ - '0' ); } return( 0 ); } static int x509_date_is_valid(const mbedtls_x509_time *t ) { int ret = MBEDTLS_ERR_X509_INVALID_DATE; int month_len; CHECK_RANGE( 0, 9999, t->year ); CHECK_RANGE( 0, 23, t->hour ); CHECK_RANGE( 0, 59, t->min ); CHECK_RANGE( 0, 59, t->sec ); switch( t->mon ) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: month_len = 31; break; case 4: case 6: case 9: case 11: month_len = 30; break; case 2: if( ( !( t->year % 4 ) && t->year % 100 ) || !( t->year % 400 ) ) month_len = 29; else month_len = 28; break; default: return( ret ); } CHECK_RANGE( 1, month_len, t->day ); return( 0 ); } /* * Parse an ASN1_UTC_TIME (yearlen=2) or ASN1_GENERALIZED_TIME (yearlen=4) * field. */ static int x509_parse_time( unsigned char **p, size_t len, size_t yearlen, mbedtls_x509_time *tm ) { int ret; /* * Minimum length is 10 or 12 depending on yearlen */ if ( len < yearlen + 8 ) return ( MBEDTLS_ERR_X509_INVALID_DATE ); len -= yearlen + 8; /* * Parse year, month, day, hour, minute */ CHECK( x509_parse_int( p, yearlen, &tm->year ) ); if ( 2 == yearlen ) { if ( tm->year < 50 ) tm->year += 100; tm->year += 1900; } CHECK( x509_parse_int( p, 2, &tm->mon ) ); CHECK( x509_parse_int( p, 2, &tm->day ) ); CHECK( x509_parse_int( p, 2, &tm->hour ) ); CHECK( x509_parse_int( p, 2, &tm->min ) ); /* * Parse seconds if present */ if ( len >= 2 ) { CHECK( x509_parse_int( p, 2, &tm->sec ) ); len -= 2; } else return ( MBEDTLS_ERR_X509_INVALID_DATE ); /* * Parse trailing 'Z' if present */ if ( 1 == len && 'Z' == **p ) { (*p)++; len--; } /* * We should have parsed all characters at this point */ if ( 0 != len ) return ( MBEDTLS_ERR_X509_INVALID_DATE ); CHECK( x509_date_is_valid( tm ) ); return ( 0 ); } /* * Time ::= CHOICE { * utcTime UTCTime, * generalTime GeneralizedTime } */ int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end, mbedtls_x509_time *tm ) { int ret; size_t len, year_len; unsigned char tag; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); tag = **p; if( tag == MBEDTLS_ASN1_UTC_TIME ) year_len = 2; else if( tag == MBEDTLS_ASN1_GENERALIZED_TIME ) year_len = 4; else return( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); (*p)++; ret = mbedtls_asn1_get_len( p, end, &len ); if( ret != 0 ) return( MBEDTLS_ERR_X509_INVALID_DATE + ret ); return x509_parse_time( p, len, year_len, tm ); } int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig ) { int ret; size_t len; int tag_type; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_SIGNATURE + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); tag_type = **p; if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_SIGNATURE + ret ); sig->tag = tag_type; sig->len = len; sig->p = *p; *p += len; return( 0 ); } /* * Get signature algorithm from alg OID and optional parameters */ int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, void **sig_opts ) { int ret; if( *sig_opts != NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); if( ( ret = mbedtls_oid_get_sig_alg( sig_oid, md_alg, pk_alg ) ) != 0 ) return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + ret ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) if( *pk_alg == MBEDTLS_PK_RSASSA_PSS ) { mbedtls_pk_rsassa_pss_options *pss_opts; pss_opts = mbedtls_calloc( 1, sizeof( mbedtls_pk_rsassa_pss_options ) ); if( pss_opts == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); ret = mbedtls_x509_get_rsassa_pss_params( sig_params, md_alg, &pss_opts->mgf1_hash_id, &pss_opts->expected_salt_len ); if( ret != 0 ) { mbedtls_free( pss_opts ); return( ret ); } *sig_opts = (void *) pss_opts; } else #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ { /* Make sure parameters are absent or NULL */ if( ( sig_params->tag != MBEDTLS_ASN1_NULL && sig_params->tag != 0 ) || sig_params->len != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG ); } return( 0 ); } /* * X.509 Extensions (No parsing of extensions, pointer should * be either manually updated or extensions should be parsed!) */ int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext, int tag ) { int ret; size_t len; if( *p == end ) return( 0 ); ext->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag ) ) != 0 ) return( ret ); ext->p = *p; end = *p + ext->len; /* * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension * * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING } */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( end != *p + len ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Store the name in printable form into buf; no more * than size characters will be written */ int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn ) { int ret; size_t i, n; unsigned char c, merge = 0; const mbedtls_x509_name *name; const char *short_name = NULL; char s[MBEDTLS_X509_MAX_DN_NAME_SIZE], *p; memset( s, 0, sizeof( s ) ); name = dn; p = buf; n = size; while( name != NULL ) { if( !name->oid.p ) { name = name->next; continue; } if( name != dn ) { ret = mbedtls_snprintf( p, n, merge ? " + " : ", " ); MBEDTLS_X509_SAFE_SNPRINTF; } ret = mbedtls_oid_get_attr_short_name( &name->oid, &short_name ); if( ret == 0 ) ret = mbedtls_snprintf( p, n, "%s=", short_name ); else ret = mbedtls_snprintf( p, n, "\?\?=" ); MBEDTLS_X509_SAFE_SNPRINTF; for( i = 0; i < name->val.len; i++ ) { if( i >= sizeof( s ) - 1 ) break; c = name->val.p[i]; if( c < 32 || c == 127 || ( c > 128 && c < 160 ) ) s[i] = '?'; else s[i] = c; } s[i] = '\0'; ret = mbedtls_snprintf( p, n, "%s", s ); MBEDTLS_X509_SAFE_SNPRINTF; merge = name->next_merged; name = name->next; } return( (int) ( size - n ) ); } /* * Store the serial in printable form into buf; no more * than size characters will be written */ int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial ) { int ret; size_t i, n, nr; char *p; p = buf; n = size; nr = ( serial->len <= 32 ) ? serial->len : 28; for( i = 0; i < nr; i++ ) { if( i == 0 && nr > 1 && serial->p[i] == 0x0 ) continue; ret = mbedtls_snprintf( p, n, "%02X%s", serial->p[i], ( i < nr - 1 ) ? ":" : "" ); MBEDTLS_X509_SAFE_SNPRINTF; } if( nr != serial->len ) { ret = mbedtls_snprintf( p, n, "...." ); MBEDTLS_X509_SAFE_SNPRINTF; } return( (int) ( size - n ) ); } /* * Helper for writing signature algorithms */ int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid, mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, const void *sig_opts ) { int ret; char *p = buf; size_t n = size; const char *desc = NULL; ret = mbedtls_oid_get_sig_alg_desc( sig_oid, &desc ); if( ret != 0 ) ret = mbedtls_snprintf( p, n, "???" ); else ret = mbedtls_snprintf( p, n, "%s", desc ); MBEDTLS_X509_SAFE_SNPRINTF; #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) if( pk_alg == MBEDTLS_PK_RSASSA_PSS ) { const mbedtls_pk_rsassa_pss_options *pss_opts; const mbedtls_md_info_t *md_info, *mgf_md_info; pss_opts = (const mbedtls_pk_rsassa_pss_options *) sig_opts; md_info = mbedtls_md_info_from_type( md_alg ); mgf_md_info = mbedtls_md_info_from_type( pss_opts->mgf1_hash_id ); ret = mbedtls_snprintf( p, n, " (%s, MGF1-%s, 0x%02X)", md_info ? mbedtls_md_get_name( md_info ) : "???", mgf_md_info ? mbedtls_md_get_name( mgf_md_info ) : "???", pss_opts->expected_salt_len ); MBEDTLS_X509_SAFE_SNPRINTF; } #else ((void) pk_alg); ((void) md_alg); ((void) sig_opts); #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ return( (int)( size - n ) ); } /* * Helper for writing "RSA key size", "EC key size", etc */ int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name ) { char *p = buf; size_t n = buf_size; int ret; ret = mbedtls_snprintf( p, n, "%s key size", name ); MBEDTLS_X509_SAFE_SNPRINTF; return( 0 ); } #if defined(MBEDTLS_HAVE_TIME_DATE) /* * Set the time structure to the current time. * Return 0 on success, non-zero on failure. */ static int x509_get_current_time( mbedtls_x509_time *now ) { struct tm *lt, tm_buf; mbedtls_time_t tt; int ret = 0; tt = mbedtls_time( NULL ); lt = mbedtls_platform_gmtime_r( &tt, &tm_buf ); if( lt == NULL ) ret = -1; else { now->year = lt->tm_year + 1900; now->mon = lt->tm_mon + 1; now->day = lt->tm_mday; now->hour = lt->tm_hour; now->min = lt->tm_min; now->sec = lt->tm_sec; } return( ret ); } /* * Return 0 if before <= after, 1 otherwise */ static int x509_check_time( const mbedtls_x509_time *before, const mbedtls_x509_time *after ) { if( before->year > after->year ) return( 1 ); if( before->year == after->year && before->mon > after->mon ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day > after->day ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day == after->day && before->hour > after->hour ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day == after->day && before->hour == after->hour && before->min > after->min ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day == after->day && before->hour == after->hour && before->min == after->min && before->sec > after->sec ) return( 1 ); return( 0 ); } int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ) { mbedtls_x509_time now; if( x509_get_current_time( &now ) != 0 ) return( 1 ); return( x509_check_time( &now, to ) ); } int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ) { mbedtls_x509_time now; if( x509_get_current_time( &now ) != 0 ) return( 1 ); return( x509_check_time( from, &now ) ); } #else /* MBEDTLS_HAVE_TIME_DATE */ int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ) { ((void) to); return( 0 ); } int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ) { ((void) from); return( 0 ); } #endif /* MBEDTLS_HAVE_TIME_DATE */ #if defined(MBEDTLS_SELF_TEST) #include "mbedtls/x509_crt.h" #include "mbedtls/certs.h" /* * Checkup routine */ int mbedtls_x509_self_test( int verbose ) { #if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_SHA256_C) int ret; uint32_t flags; mbedtls_x509_crt cacert; mbedtls_x509_crt clicert; if( verbose != 0 ) mbedtls_printf( " X.509 certificate load: " ); mbedtls_x509_crt_init( &clicert ); ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt, mbedtls_test_cli_crt_len ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } mbedtls_x509_crt_init( &cacert ); ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_ca_crt, mbedtls_test_ca_crt_len ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } if( verbose != 0 ) mbedtls_printf( "passed\n X.509 signature verify: "); ret = mbedtls_x509_crt_verify( &clicert, &cacert, NULL, NULL, &flags, NULL, NULL ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } if( verbose != 0 ) mbedtls_printf( "passed\n\n"); mbedtls_x509_crt_free( &cacert ); mbedtls_x509_crt_free( &clicert ); return( 0 ); #else ((void) verbose); return( 0 ); #endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA1_C */ } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_X509_USE_C */ fldigi-4.1.06/src/mbedtls/ssl_cache.c0000664000175000017500000002022413507401434014275 00000000000000/* * SSL session cache implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * These session callbacks use a simple chained list * to store and retrieve the session information. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_CACHE_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ssl_cache.h" #include void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache ) { memset( cache, 0, sizeof( mbedtls_ssl_cache_context ) ); cache->timeout = MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT; cache->max_entries = MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &cache->mutex ); #endif } int mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session ) { int ret = 1; #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t = mbedtls_time( NULL ); #endif mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data; mbedtls_ssl_cache_entry *cur, *entry; #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_lock( &cache->mutex ) != 0 ) return( 1 ); #endif cur = cache->chain; entry = NULL; while( cur != NULL ) { entry = cur; cur = cur->next; #if defined(MBEDTLS_HAVE_TIME) if( cache->timeout != 0 && (int) ( t - entry->timestamp ) > cache->timeout ) continue; #endif if( session->ciphersuite != entry->session.ciphersuite || session->compression != entry->session.compression || session->id_len != entry->session.id_len ) continue; if( memcmp( session->id, entry->session.id, entry->session.id_len ) != 0 ) continue; memcpy( session->master, entry->session.master, 48 ); session->verify_result = entry->session.verify_result; #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * Restore peer certificate (without rest of the original chain) */ if( entry->peer_cert.p != NULL ) { if( ( session->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) ) ) == NULL ) { ret = 1; goto exit; } mbedtls_x509_crt_init( session->peer_cert ); if( mbedtls_x509_crt_parse( session->peer_cert, entry->peer_cert.p, entry->peer_cert.len ) != 0 ) { mbedtls_free( session->peer_cert ); session->peer_cert = NULL; ret = 1; goto exit; } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ ret = 0; goto exit; } exit: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &cache->mutex ) != 0 ) ret = 1; #endif return( ret ); } int mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session ) { int ret = 1; #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t = mbedtls_time( NULL ), oldest = 0; mbedtls_ssl_cache_entry *old = NULL; #endif mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data; mbedtls_ssl_cache_entry *cur, *prv; int count = 0; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &cache->mutex ) ) != 0 ) return( ret ); #endif cur = cache->chain; prv = NULL; while( cur != NULL ) { count++; #if defined(MBEDTLS_HAVE_TIME) if( cache->timeout != 0 && (int) ( t - cur->timestamp ) > cache->timeout ) { cur->timestamp = t; break; /* expired, reuse this slot, update timestamp */ } #endif if( memcmp( session->id, cur->session.id, cur->session.id_len ) == 0 ) break; /* client reconnected, keep timestamp for session id */ #if defined(MBEDTLS_HAVE_TIME) if( oldest == 0 || cur->timestamp < oldest ) { oldest = cur->timestamp; old = cur; } #endif prv = cur; cur = cur->next; } if( cur == NULL ) { #if defined(MBEDTLS_HAVE_TIME) /* * Reuse oldest entry if max_entries reached */ if( count >= cache->max_entries ) { if( old == NULL ) { ret = 1; goto exit; } cur = old; } #else /* MBEDTLS_HAVE_TIME */ /* * Reuse first entry in chain if max_entries reached, * but move to last place */ if( count >= cache->max_entries ) { if( cache->chain == NULL ) { ret = 1; goto exit; } cur = cache->chain; cache->chain = cur->next; cur->next = NULL; prv->next = cur; } #endif /* MBEDTLS_HAVE_TIME */ else { /* * max_entries not reached, create new entry */ cur = mbedtls_calloc( 1, sizeof(mbedtls_ssl_cache_entry) ); if( cur == NULL ) { ret = 1; goto exit; } if( prv == NULL ) cache->chain = cur; else prv->next = cur; } #if defined(MBEDTLS_HAVE_TIME) cur->timestamp = t; #endif } memcpy( &cur->session, session, sizeof( mbedtls_ssl_session ) ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * If we're reusing an entry, free its certificate first */ if( cur->peer_cert.p != NULL ) { mbedtls_free( cur->peer_cert.p ); memset( &cur->peer_cert, 0, sizeof(mbedtls_x509_buf) ); } /* * Store peer certificate */ if( session->peer_cert != NULL ) { cur->peer_cert.p = mbedtls_calloc( 1, session->peer_cert->raw.len ); if( cur->peer_cert.p == NULL ) { ret = 1; goto exit; } memcpy( cur->peer_cert.p, session->peer_cert->raw.p, session->peer_cert->raw.len ); cur->peer_cert.len = session->peer_cert->raw.len; cur->session.peer_cert = NULL; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ ret = 0; exit: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &cache->mutex ) != 0 ) ret = 1; #endif return( ret ); } #if defined(MBEDTLS_HAVE_TIME) void mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout ) { if( timeout < 0 ) timeout = 0; cache->timeout = timeout; } #endif /* MBEDTLS_HAVE_TIME */ void mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max ) { if( max < 0 ) max = 0; cache->max_entries = max; } void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache ) { mbedtls_ssl_cache_entry *cur, *prv; cur = cache->chain; while( cur != NULL ) { prv = cur; cur = cur->next; mbedtls_ssl_session_free( &prv->session ); #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_free( prv->peer_cert.p ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ mbedtls_free( prv ); } #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &cache->mutex ); #endif cache->chain = NULL; } #endif /* MBEDTLS_SSL_CACHE_C */ fldigi-4.1.06/src/mbedtls/md4.c0000664000175000017500000002747613507401434013055 00000000000000/* * RFC 1186/1320 compliant MD4 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The MD4 algorithm was designed by Ron Rivest in 1990. * * http://www.ietf.org/rfc/rfc1186.txt * http://www.ietf.org/rfc/rfc1320.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD4_C) #include "mbedtls/md4.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD4_ALT) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif void mbedtls_md4_init( mbedtls_md4_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_md4_context ) ); } void mbedtls_md4_free( mbedtls_md4_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md4_context ) ); } void mbedtls_md4_clone( mbedtls_md4_context *dst, const mbedtls_md4_context *src ) { *dst = *src; } /* * MD4 context setup */ int mbedtls_md4_starts_ret( mbedtls_md4_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_starts( mbedtls_md4_context *ctx ) { mbedtls_md4_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_MD4_PROCESS_ALT) int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ) { uint32_t X[16], A, B, C, D; GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x, y, z) ((x & y) | ((~x) & z)) #define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); } P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 1], 7 ); P( C, D, A, B, X[ 2], 11 ); P( B, C, D, A, X[ 3], 19 ); P( A, B, C, D, X[ 4], 3 ); P( D, A, B, C, X[ 5], 7 ); P( C, D, A, B, X[ 6], 11 ); P( B, C, D, A, X[ 7], 19 ); P( A, B, C, D, X[ 8], 3 ); P( D, A, B, C, X[ 9], 7 ); P( C, D, A, B, X[10], 11 ); P( B, C, D, A, X[11], 19 ); P( A, B, C, D, X[12], 3 ); P( D, A, B, C, X[13], 7 ); P( C, D, A, B, X[14], 11 ); P( B, C, D, A, X[15], 19 ); #undef P #undef F #define F(x,y,z) ((x & y) | (x & z) | (y & z)) #define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); } P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 4], 5 ); P( C, D, A, B, X[ 8], 9 ); P( B, C, D, A, X[12], 13 ); P( A, B, C, D, X[ 1], 3 ); P( D, A, B, C, X[ 5], 5 ); P( C, D, A, B, X[ 9], 9 ); P( B, C, D, A, X[13], 13 ); P( A, B, C, D, X[ 2], 3 ); P( D, A, B, C, X[ 6], 5 ); P( C, D, A, B, X[10], 9 ); P( B, C, D, A, X[14], 13 ); P( A, B, C, D, X[ 3], 3 ); P( D, A, B, C, X[ 7], 5 ); P( C, D, A, B, X[11], 9 ); P( B, C, D, A, X[15], 13 ); #undef P #undef F #define F(x,y,z) (x ^ y ^ z) #define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); } P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 8], 9 ); P( C, D, A, B, X[ 4], 11 ); P( B, C, D, A, X[12], 15 ); P( A, B, C, D, X[ 2], 3 ); P( D, A, B, C, X[10], 9 ); P( C, D, A, B, X[ 6], 11 ); P( B, C, D, A, X[14], 15 ); P( A, B, C, D, X[ 1], 3 ); P( D, A, B, C, X[ 9], 9 ); P( C, D, A, B, X[ 5], 11 ); P( B, C, D, A, X[13], 15 ); P( A, B, C, D, X[ 3], 3 ); P( D, A, B, C, X[11], 9 ); P( C, D, A, B, X[ 7], 11 ); P( B, C, D, A, X[15], 15 ); #undef F #undef P ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ) { mbedtls_internal_md4_process( ctx, data ); } #endif #endif /* !MBEDTLS_MD4_PROCESS_ALT */ /* * MD4 process buffer */ int mbedtls_md4_update_ret( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), (void *) input, fill ); if( ( ret = mbedtls_internal_md4_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_md4_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) { memcpy( (void *) (ctx->buffer + left), (void *) input, ilen ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_md4_update_ret( ctx, input, ilen ); } #endif static const unsigned char md4_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* * MD4 final digest */ int mbedtls_md4_finish_ret( mbedtls_md4_context *ctx, unsigned char output[16] ) { int ret; uint32_t last, padn; uint32_t high, low; unsigned char msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_LE( low, msglen, 0 ); PUT_UINT32_LE( high, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); ret = mbedtls_md4_update_ret( ctx, (unsigned char *)md4_padding, padn ); if( ret != 0 ) return( ret ); if( ( ret = mbedtls_md4_update_ret( ctx, msglen, 8 ) ) != 0 ) return( ret ); PUT_UINT32_LE( ctx->state[0], output, 0 ); PUT_UINT32_LE( ctx->state[1], output, 4 ); PUT_UINT32_LE( ctx->state[2], output, 8 ); PUT_UINT32_LE( ctx->state[3], output, 12 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] ) { mbedtls_md4_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_MD4_ALT */ /* * output = MD4( input buffer ) */ int mbedtls_md4_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ) { int ret; mbedtls_md4_context ctx; mbedtls_md4_init( &ctx ); if( ( ret = mbedtls_md4_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md4_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md4_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_md4_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] ) { mbedtls_md4_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * RFC 1320 test vectors */ static const unsigned char md4_test_str[7][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" } }; static const size_t md4_test_strlen[7] = { 0, 1, 3, 14, 26, 62, 80 }; static const unsigned char md4_test_sum[7][16] = { { 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31, 0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 }, { 0xBD, 0xE5, 0x2C, 0xB3, 0x1D, 0xE3, 0x3E, 0x46, 0x24, 0x5E, 0x05, 0xFB, 0xDB, 0xD6, 0xFB, 0x24 }, { 0xA4, 0x48, 0x01, 0x7A, 0xAF, 0x21, 0xD8, 0x52, 0x5F, 0xC1, 0x0A, 0xE8, 0x7A, 0xA6, 0x72, 0x9D }, { 0xD9, 0x13, 0x0A, 0x81, 0x64, 0x54, 0x9F, 0xE8, 0x18, 0x87, 0x48, 0x06, 0xE1, 0xC7, 0x01, 0x4B }, { 0xD7, 0x9E, 0x1C, 0x30, 0x8A, 0xA5, 0xBB, 0xCD, 0xEE, 0xA8, 0xED, 0x63, 0xDF, 0x41, 0x2D, 0xA9 }, { 0x04, 0x3F, 0x85, 0x82, 0xF2, 0x41, 0xDB, 0x35, 0x1C, 0xE6, 0x27, 0xE1, 0x53, 0xE7, 0xF0, 0xE4 }, { 0xE3, 0x3B, 0x4D, 0xDC, 0x9C, 0x38, 0xF2, 0x19, 0x9C, 0x3E, 0x7B, 0x16, 0x4F, 0xCC, 0x05, 0x36 } }; /* * Checkup routine */ int mbedtls_md4_self_test( int verbose ) { int i, ret = 0; unsigned char md4sum[16]; for( i = 0; i < 7; i++ ) { if( verbose != 0 ) mbedtls_printf( " MD4 test #%d: ", i + 1 ); ret = mbedtls_md4_ret( md4_test_str[i], md4_test_strlen[i], md4sum ); if( ret != 0 ) goto fail; if( memcmp( md4sum, md4_test_sum[i], 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MD4_C */ fldigi-4.1.06/src/mbedtls/pkcs12.c0000664000175000017500000002544213507401434013463 00000000000000/* * PKCS#12 Personal Information Exchange Syntax * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The PKCS #12 Personal Information Exchange Syntax Standard v1.1 * * http://www.rsa.com/rsalabs/pkcs/files/h11301-wp-pkcs-12v1-1-personal-information-exchange-syntax.pdf * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1-1.asn */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PKCS12_C) #include "mbedtls/pkcs12.h" #include "mbedtls/asn1.h" #include "mbedtls/cipher.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #endif #if defined(MBEDTLS_ASN1_PARSE_C) static int pkcs12_parse_pbe_params( mbedtls_asn1_buf *params, mbedtls_asn1_buf *salt, int *iterations ) { int ret; unsigned char **p = ¶ms->p; const unsigned char *end = params->p + params->len; /* * pkcs-12PbeParams ::= SEQUENCE { * salt OCTET STRING, * iterations INTEGER * } * */ if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); if( ( ret = mbedtls_asn1_get_tag( p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret ); salt->p = *p; *p += salt->len; if( ( ret = mbedtls_asn1_get_int( p, end, iterations ) ) != 0 ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret ); if( *p != end ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #define PKCS12_MAX_PWDLEN 128 static int pkcs12_pbe_derive_key_iv( mbedtls_asn1_buf *pbe_params, mbedtls_md_type_t md_type, const unsigned char *pwd, size_t pwdlen, unsigned char *key, size_t keylen, unsigned char *iv, size_t ivlen ) { int ret, iterations = 0; mbedtls_asn1_buf salt; size_t i; unsigned char unipwd[PKCS12_MAX_PWDLEN * 2 + 2]; if( pwdlen > PKCS12_MAX_PWDLEN ) return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA ); memset( &salt, 0, sizeof(mbedtls_asn1_buf) ); memset( &unipwd, 0, sizeof(unipwd) ); if( ( ret = pkcs12_parse_pbe_params( pbe_params, &salt, &iterations ) ) != 0 ) return( ret ); for( i = 0; i < pwdlen; i++ ) unipwd[i * 2 + 1] = pwd[i]; if( ( ret = mbedtls_pkcs12_derivation( key, keylen, unipwd, pwdlen * 2 + 2, salt.p, salt.len, md_type, MBEDTLS_PKCS12_DERIVE_KEY, iterations ) ) != 0 ) { return( ret ); } if( iv == NULL || ivlen == 0 ) return( 0 ); if( ( ret = mbedtls_pkcs12_derivation( iv, ivlen, unipwd, pwdlen * 2 + 2, salt.p, salt.len, md_type, MBEDTLS_PKCS12_DERIVE_IV, iterations ) ) != 0 ) { return( ret ); } return( 0 ); } #undef PKCS12_MAX_PWDLEN int mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t len, unsigned char *output ) { #if !defined(MBEDTLS_ARC4_C) ((void) pbe_params); ((void) mode); ((void) pwd); ((void) pwdlen); ((void) data); ((void) len); ((void) output); return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE ); #else int ret; unsigned char key[16]; mbedtls_arc4_context ctx; ((void) mode); mbedtls_arc4_init( &ctx ); if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, MBEDTLS_MD_SHA1, pwd, pwdlen, key, 16, NULL, 0 ) ) != 0 ) { return( ret ); } mbedtls_arc4_setup( &ctx, key, 16 ); if( ( ret = mbedtls_arc4_crypt( &ctx, len, data, output ) ) != 0 ) goto exit; exit: mbedtls_platform_zeroize( key, sizeof( key ) ); mbedtls_arc4_free( &ctx ); return( ret ); #endif /* MBEDTLS_ARC4_C */ } int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode, mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t len, unsigned char *output ) { int ret, keylen = 0; unsigned char key[32]; unsigned char iv[16]; const mbedtls_cipher_info_t *cipher_info; mbedtls_cipher_context_t cipher_ctx; size_t olen = 0; cipher_info = mbedtls_cipher_info_from_type( cipher_type ); if( cipher_info == NULL ) return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE ); keylen = cipher_info->key_bitlen / 8; if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, md_type, pwd, pwdlen, key, keylen, iv, cipher_info->iv_size ) ) != 0 ) { return( ret ); } mbedtls_cipher_init( &cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_set_iv( &cipher_ctx, iv, cipher_info->iv_size ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_reset( &cipher_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_update( &cipher_ctx, data, len, output, &olen ) ) != 0 ) { goto exit; } if( ( ret = mbedtls_cipher_finish( &cipher_ctx, output + olen, &olen ) ) != 0 ) ret = MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH; exit: mbedtls_platform_zeroize( key, sizeof( key ) ); mbedtls_platform_zeroize( iv, sizeof( iv ) ); mbedtls_cipher_free( &cipher_ctx ); return( ret ); } #endif /* MBEDTLS_ASN1_PARSE_C */ static void pkcs12_fill_buffer( unsigned char *data, size_t data_len, const unsigned char *filler, size_t fill_len ) { unsigned char *p = data; size_t use_len; while( data_len > 0 ) { use_len = ( data_len > fill_len ) ? fill_len : data_len; memcpy( p, filler, use_len ); p += use_len; data_len -= use_len; } } int mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen, const unsigned char *pwd, size_t pwdlen, const unsigned char *salt, size_t saltlen, mbedtls_md_type_t md_type, int id, int iterations ) { int ret; unsigned int j; unsigned char diversifier[128]; unsigned char salt_block[128], pwd_block[128], hash_block[128]; unsigned char hash_output[MBEDTLS_MD_MAX_SIZE]; unsigned char *p; unsigned char c; size_t hlen, use_len, v, i; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; // This version only allows max of 64 bytes of password or salt if( datalen > 128 || pwdlen > 64 || saltlen > 64 ) return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA ); md_info = mbedtls_md_info_from_type( md_type ); if( md_info == NULL ) return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE ); mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) return( ret ); hlen = mbedtls_md_get_size( md_info ); if( hlen <= 32 ) v = 64; else v = 128; memset( diversifier, (unsigned char) id, v ); pkcs12_fill_buffer( salt_block, v, salt, saltlen ); pkcs12_fill_buffer( pwd_block, v, pwd, pwdlen ); p = data; while( datalen > 0 ) { // Calculate hash( diversifier || salt_block || pwd_block ) if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, diversifier, v ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, salt_block, v ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, pwd_block, v ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_finish( &md_ctx, hash_output ) ) != 0 ) goto exit; // Perform remaining ( iterations - 1 ) recursive hash calculations for( i = 1; i < (size_t) iterations; i++ ) { if( ( ret = mbedtls_md( md_info, hash_output, hlen, hash_output ) ) != 0 ) goto exit; } use_len = ( datalen > hlen ) ? hlen : datalen; memcpy( p, hash_output, use_len ); datalen -= use_len; p += use_len; if( datalen == 0 ) break; // Concatenating copies of hash_output into hash_block (B) pkcs12_fill_buffer( hash_block, v, hash_output, hlen ); // B += 1 for( i = v; i > 0; i-- ) if( ++hash_block[i - 1] != 0 ) break; // salt_block += B c = 0; for( i = v; i > 0; i-- ) { j = salt_block[i - 1] + hash_block[i - 1] + c; c = (unsigned char) (j >> 8); salt_block[i - 1] = j & 0xFF; } // pwd_block += B c = 0; for( i = v; i > 0; i-- ) { j = pwd_block[i - 1] + hash_block[i - 1] + c; c = (unsigned char) (j >> 8); pwd_block[i - 1] = j & 0xFF; } } ret = 0; exit: mbedtls_platform_zeroize( salt_block, sizeof( salt_block ) ); mbedtls_platform_zeroize( pwd_block, sizeof( pwd_block ) ); mbedtls_platform_zeroize( hash_block, sizeof( hash_block ) ); mbedtls_platform_zeroize( hash_output, sizeof( hash_output ) ); mbedtls_md_free( &md_ctx ); return( ret ); } #endif /* MBEDTLS_PKCS12_C */ fldigi-4.1.06/src/mbedtls/cmac.c0000664000175000017500000010070113507401434013253 00000000000000/** * \file cmac.c * * \brief NIST SP800-38B compliant CMAC implementation for AES and 3DES * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * - NIST SP 800-38B Recommendation for Block Cipher Modes of Operation: The * CMAC Mode for Authentication * http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38b.pdf * * - RFC 4493 - The AES-CMAC Algorithm * https://tools.ietf.org/html/rfc4493 * * - RFC 4615 - The Advanced Encryption Standard-Cipher-based Message * Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128) * Algorithm for the Internet Key Exchange Protocol (IKE) * https://tools.ietf.org/html/rfc4615 * * Additional test vectors: ISO/IEC 9797-1 * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CMAC_C) #include "mbedtls/cmac.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #if defined(MBEDTLS_SELF_TEST) #include #define mbedtls_printf printf #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_PLATFORM_C */ #if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) /* * Multiplication by u in the Galois field of GF(2^n) * * As explained in NIST SP 800-38B, this can be computed: * * If MSB(p) = 0, then p = (p << 1) * If MSB(p) = 1, then p = (p << 1) ^ R_n * with R_64 = 0x1B and R_128 = 0x87 * * Input and output MUST NOT point to the same buffer * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES. */ static int cmac_multiply_by_u( unsigned char *output, const unsigned char *input, size_t blocksize ) { const unsigned char R_128 = 0x87; const unsigned char R_64 = 0x1B; unsigned char R_n, mask; unsigned char overflow = 0x00; int i; if( blocksize == MBEDTLS_AES_BLOCK_SIZE ) { R_n = R_128; } else if( blocksize == MBEDTLS_DES3_BLOCK_SIZE ) { R_n = R_64; } else { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } for( i = (int)blocksize - 1; i >= 0; i-- ) { output[i] = input[i] << 1 | overflow; overflow = input[i] >> 7; } /* mask = ( input[0] >> 7 ) ? 0xff : 0x00 * using bit operations to avoid branches */ /* MSVC has a warning about unary minus on unsigned, but this is * well-defined and precisely what we want to do here */ #if defined(_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4146 ) #endif mask = - ( input[0] >> 7 ); #if defined(_MSC_VER) #pragma warning( pop ) #endif output[ blocksize - 1 ] ^= R_n & mask; return( 0 ); } /* * Generate subkeys * * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm */ static int cmac_generate_subkeys( mbedtls_cipher_context_t *ctx, unsigned char* K1, unsigned char* K2 ) { int ret; unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX]; size_t olen, block_size; mbedtls_platform_zeroize( L, sizeof( L ) ); block_size = ctx->cipher_info->block_size; /* Calculate Ek(0) */ if( ( ret = mbedtls_cipher_update( ctx, L, block_size, L, &olen ) ) != 0 ) goto exit; /* * Generate K1 and K2 */ if( ( ret = cmac_multiply_by_u( K1, L , block_size ) ) != 0 ) goto exit; if( ( ret = cmac_multiply_by_u( K2, K1 , block_size ) ) != 0 ) goto exit; exit: mbedtls_platform_zeroize( L, sizeof( L ) ); return( ret ); } #endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */ #if !defined(MBEDTLS_CMAC_ALT) static void cmac_xor_block( unsigned char *output, const unsigned char *input1, const unsigned char *input2, const size_t block_size ) { size_t idx; for( idx = 0; idx < block_size; idx++ ) output[ idx ] = input1[ idx ] ^ input2[ idx ]; } /* * Create padded last block from (partial) last block. * * We can't use the padding option from the cipher layer, as it only works for * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition. */ static void cmac_pad( unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX], size_t padded_block_len, const unsigned char *last_block, size_t last_block_len ) { size_t j; for( j = 0; j < padded_block_len; j++ ) { if( j < last_block_len ) padded_block[j] = last_block[j]; else if( j == last_block_len ) padded_block[j] = 0x80; else padded_block[j] = 0x00; } } int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx, const unsigned char *key, size_t keybits ) { mbedtls_cipher_type_t type; mbedtls_cmac_context_t *cmac_ctx; int retval; if( ctx == NULL || ctx->cipher_info == NULL || key == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( ( retval = mbedtls_cipher_setkey( ctx, key, (int)keybits, MBEDTLS_ENCRYPT ) ) != 0 ) return( retval ); type = ctx->cipher_info->type; switch( type ) { case MBEDTLS_CIPHER_AES_128_ECB: case MBEDTLS_CIPHER_AES_192_ECB: case MBEDTLS_CIPHER_AES_256_ECB: case MBEDTLS_CIPHER_DES_EDE3_ECB: break; default: return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } /* Allocated and initialise in the cipher context memory for the CMAC * context */ cmac_ctx = mbedtls_calloc( 1, sizeof( mbedtls_cmac_context_t ) ); if( cmac_ctx == NULL ) return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED ); ctx->cmac_ctx = cmac_ctx; mbedtls_platform_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) ); return 0; } int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen ) { mbedtls_cmac_context_t* cmac_ctx; unsigned char *state; int ret = 0; size_t n, j, olen, block_size; if( ctx == NULL || ctx->cipher_info == NULL || input == NULL || ctx->cmac_ctx == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cmac_ctx = ctx->cmac_ctx; block_size = ctx->cipher_info->block_size; state = ctx->cmac_ctx->state; /* Is there data still to process from the last call, that's greater in * size than a block? */ if( cmac_ctx->unprocessed_len > 0 && ilen > block_size - cmac_ctx->unprocessed_len ) { memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len], input, block_size - cmac_ctx->unprocessed_len ); cmac_xor_block( state, cmac_ctx->unprocessed_block, state, block_size ); if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state, &olen ) ) != 0 ) { goto exit; } input += block_size - cmac_ctx->unprocessed_len; ilen -= block_size - cmac_ctx->unprocessed_len; cmac_ctx->unprocessed_len = 0; } /* n is the number of blocks including any final partial block */ n = ( ilen + block_size - 1 ) / block_size; /* Iterate across the input data in block sized chunks, excluding any * final partial or complete block */ for( j = 1; j < n; j++ ) { cmac_xor_block( state, input, state, block_size ); if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state, &olen ) ) != 0 ) goto exit; ilen -= block_size; input += block_size; } /* If there is data left over that wasn't aligned to a block */ if( ilen > 0 ) { memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len], input, ilen ); cmac_ctx->unprocessed_len += ilen; } exit: return( ret ); } int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx, unsigned char *output ) { mbedtls_cmac_context_t* cmac_ctx; unsigned char *state, *last_block; unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX]; unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX]; unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX]; int ret; size_t olen, block_size; if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL || output == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cmac_ctx = ctx->cmac_ctx; block_size = ctx->cipher_info->block_size; state = cmac_ctx->state; mbedtls_platform_zeroize( K1, sizeof( K1 ) ); mbedtls_platform_zeroize( K2, sizeof( K2 ) ); cmac_generate_subkeys( ctx, K1, K2 ); last_block = cmac_ctx->unprocessed_block; /* Calculate last block */ if( cmac_ctx->unprocessed_len < block_size ) { cmac_pad( M_last, block_size, last_block, cmac_ctx->unprocessed_len ); cmac_xor_block( M_last, M_last, K2, block_size ); } else { /* Last block is complete block */ cmac_xor_block( M_last, last_block, K1, block_size ); } cmac_xor_block( state, M_last, state, block_size ); if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state, &olen ) ) != 0 ) { goto exit; } memcpy( output, state, block_size ); exit: /* Wipe the generated keys on the stack, and any other transients to avoid * side channel leakage */ mbedtls_platform_zeroize( K1, sizeof( K1 ) ); mbedtls_platform_zeroize( K2, sizeof( K2 ) ); cmac_ctx->unprocessed_len = 0; mbedtls_platform_zeroize( cmac_ctx->unprocessed_block, sizeof( cmac_ctx->unprocessed_block ) ); mbedtls_platform_zeroize( state, MBEDTLS_CIPHER_BLKSIZE_MAX ); return( ret ); } int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx ) { mbedtls_cmac_context_t* cmac_ctx; if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cmac_ctx = ctx->cmac_ctx; /* Reset the internal state */ cmac_ctx->unprocessed_len = 0; mbedtls_platform_zeroize( cmac_ctx->unprocessed_block, sizeof( cmac_ctx->unprocessed_block ) ); mbedtls_platform_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) ); return( 0 ); } int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ) { mbedtls_cipher_context_t ctx; int ret; if( cipher_info == NULL || key == NULL || input == NULL || output == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); mbedtls_cipher_init( &ctx ); if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 ) goto exit; ret = mbedtls_cipher_cmac_starts( &ctx, key, keylen ); if( ret != 0 ) goto exit; ret = mbedtls_cipher_cmac_update( &ctx, input, ilen ); if( ret != 0 ) goto exit; ret = mbedtls_cipher_cmac_finish( &ctx, output ); exit: mbedtls_cipher_free( &ctx ); return( ret ); } #if defined(MBEDTLS_AES_C) /* * Implementation of AES-CMAC-PRF-128 defined in RFC 4615 */ int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length, const unsigned char *input, size_t in_len, unsigned char *output ) { int ret; const mbedtls_cipher_info_t *cipher_info; unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE]; unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE]; if( key == NULL || input == NULL || output == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB ); if( cipher_info == NULL ) { /* Failing at this point must be due to a build issue */ ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; goto exit; } if( key_length == MBEDTLS_AES_BLOCK_SIZE ) { /* Use key as is */ memcpy( int_key, key, MBEDTLS_AES_BLOCK_SIZE ); } else { memset( zero_key, 0, MBEDTLS_AES_BLOCK_SIZE ); ret = mbedtls_cipher_cmac( cipher_info, zero_key, 128, key, key_length, int_key ); if( ret != 0 ) goto exit; } ret = mbedtls_cipher_cmac( cipher_info, int_key, 128, input, in_len, output ); exit: mbedtls_platform_zeroize( int_key, sizeof( int_key ) ); return( ret ); } #endif /* MBEDTLS_AES_C */ #endif /* !MBEDTLS_CMAC_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * CMAC test data for SP800-38B * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf * * AES-CMAC-PRF-128 test data from RFC 4615 * https://tools.ietf.org/html/rfc4615#page-4 */ #define NB_CMAC_TESTS_PER_KEY 4 #define NB_PRF_TESTS 3 #if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) /* All CMAC test inputs are truncated from the same 64 byte buffer. */ static const unsigned char test_message[] = { /* PT */ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }; #endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) /* Truncation point of message for AES CMAC tests */ static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = { /* Mlen */ 0, 16, 20, 64 }; /* CMAC-AES128 Test Data */ static const unsigned char aes_128_key[16] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }; static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { { /* K1 */ 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66, 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde }, { /* K2 */ 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc, 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b } }; static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = { { /* Example #1 */ 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28, 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 }, { /* Example #2 */ 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44, 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c }, { /* Example #3 */ 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8, 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde }, { /* Example #4 */ 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92, 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe } }; /* CMAC-AES192 Test Data */ static const unsigned char aes_192_key[24] = { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b }; static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { { /* K1 */ 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27, 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96 }, { /* K2 */ 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e, 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c } }; static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = { { /* Example #1 */ 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5, 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67 }, { /* Example #2 */ 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90, 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84 }, { /* Example #3 */ 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04, 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8 }, { /* Example #4 */ 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79, 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11 } }; /* CMAC-AES256 Test Data */ static const unsigned char aes_256_key[32] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 }; static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { { /* K1 */ 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac, 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f }, { /* K2 */ 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58, 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9 } }; static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = { { /* Example #1 */ 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e, 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83 }, { /* Example #2 */ 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82, 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c }, { /* Example #3 */ 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a, 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93 }, { /* Example #4 */ 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5, 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10 } }; #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_DES_C) /* Truncation point of message for 3DES CMAC tests */ static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = { 0, 16, 20, 32 }; /* CMAC-TDES (Generation) - 2 Key Test Data */ static const unsigned char des3_2key_key[24] = { /* Key1 */ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, /* Key2 */ 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01, /* Key3 */ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; static const unsigned char des3_2key_subkeys[2][8] = { { /* K1 */ 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9 }, { /* K2 */ 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2 } }; static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = { { /* Sample #1 */ 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60 }, { /* Sample #2 */ 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b }, { /* Sample #3 */ 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69 }, { /* Sample #4 */ 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb } }; /* CMAC-TDES (Generation) - 3 Key Test Data */ static const unsigned char des3_3key_key[24] = { /* Key1 */ 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef, /* Key2 */ 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, /* Key3 */ 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23 }; static const unsigned char des3_3key_subkeys[2][8] = { { /* K1 */ 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0 }, { /* K2 */ 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b } }; static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = { { /* Sample #1 */ 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50 }, { /* Sample #2 */ 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09 }, { /* Sample #3 */ 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2 }, { /* Sample #4 */ 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5 } }; #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) /* AES AES-CMAC-PRF-128 Test Data */ static const unsigned char PRFK[] = { /* Key */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xed, 0xcb }; /* Sizes in bytes */ static const size_t PRFKlen[NB_PRF_TESTS] = { 18, 16, 10 }; /* Message */ static const unsigned char PRFM[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 }; static const unsigned char PRFT[NB_PRF_TESTS][16] = { { 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b, 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a }, { 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52, 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d }, { 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee, 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d } }; #endif /* MBEDTLS_AES_C */ static int cmac_test_subkeys( int verbose, const char* testname, const unsigned char* key, int keybits, const unsigned char* subkeys, mbedtls_cipher_type_t cipher_type, int block_size, int num_tests ) { int i, ret = 0; mbedtls_cipher_context_t ctx; const mbedtls_cipher_info_t *cipher_info; unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX]; unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX]; cipher_info = mbedtls_cipher_info_from_type( cipher_type ); if( cipher_info == NULL ) { /* Failing at this point must be due to a build issue */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } for( i = 0; i < num_tests; i++ ) { if( verbose != 0 ) mbedtls_printf( " %s CMAC subkey #%u: ", testname, i + 1 ); mbedtls_cipher_init( &ctx ); if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "test execution failed\n" ); goto cleanup; } if( ( ret = mbedtls_cipher_setkey( &ctx, key, keybits, MBEDTLS_ENCRYPT ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "test execution failed\n" ); goto cleanup; } ret = cmac_generate_subkeys( &ctx, K1, K2 ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto cleanup; } if( ( ret = memcmp( K1, subkeys, block_size ) ) != 0 || ( ret = memcmp( K2, &subkeys[block_size], block_size ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_cipher_free( &ctx ); } ret = 0; goto exit; cleanup: mbedtls_cipher_free( &ctx ); exit: return( ret ); } static int cmac_test_wth_cipher( int verbose, const char* testname, const unsigned char* key, int keybits, const unsigned char* messages, const unsigned int message_lengths[4], const unsigned char* expected_result, mbedtls_cipher_type_t cipher_type, int block_size, int num_tests ) { const mbedtls_cipher_info_t *cipher_info; int i, ret = 0; unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX]; cipher_info = mbedtls_cipher_info_from_type( cipher_type ); if( cipher_info == NULL ) { /* Failing at this point must be due to a build issue */ ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; goto exit; } for( i = 0; i < num_tests; i++ ) { if( verbose != 0 ) mbedtls_printf( " %s CMAC #%u: ", testname, i + 1 ); if( ( ret = mbedtls_cipher_cmac( cipher_info, key, keybits, messages, message_lengths[i], output ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto exit; } if( ( ret = memcmp( output, &expected_result[i * block_size], block_size ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } ret = 0; exit: return( ret ); } #if defined(MBEDTLS_AES_C) static int test_aes128_cmac_prf( int verbose ) { int i; int ret; unsigned char output[MBEDTLS_AES_BLOCK_SIZE]; for( i = 0; i < NB_PRF_TESTS; i++ ) { mbedtls_printf( " AES CMAC 128 PRF #%u: ", i ); ret = mbedtls_aes_cmac_prf_128( PRFK, PRFKlen[i], PRFM, 20, output ); if( ret != 0 || memcmp( output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } else if( verbose != 0 ) { mbedtls_printf( "passed\n" ); } } return( ret ); } #endif /* MBEDTLS_AES_C */ int mbedtls_cmac_self_test( int verbose ) { int ret; #if defined(MBEDTLS_AES_C) /* AES-128 */ if( ( ret = cmac_test_subkeys( verbose, "AES 128", aes_128_key, 128, (const unsigned char*)aes_128_subkeys, MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "AES 128", aes_128_key, 128, test_message, aes_message_lengths, (const unsigned char*)aes_128_expected_result, MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } /* AES-192 */ if( ( ret = cmac_test_subkeys( verbose, "AES 192", aes_192_key, 192, (const unsigned char*)aes_192_subkeys, MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "AES 192", aes_192_key, 192, test_message, aes_message_lengths, (const unsigned char*)aes_192_expected_result, MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } /* AES-256 */ if( ( ret = cmac_test_subkeys( verbose, "AES 256", aes_256_key, 256, (const unsigned char*)aes_256_subkeys, MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher ( verbose, "AES 256", aes_256_key, 256, test_message, aes_message_lengths, (const unsigned char*)aes_256_expected_result, MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_DES_C) /* 3DES 2 key */ if( ( ret = cmac_test_subkeys( verbose, "3DES 2 key", des3_2key_key, 192, (const unsigned char*)des3_2key_subkeys, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "3DES 2 key", des3_2key_key, 192, test_message, des3_message_lengths, (const unsigned char*)des3_2key_expected_result, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } /* 3DES 3 key */ if( ( ret = cmac_test_subkeys( verbose, "3DES 3 key", des3_3key_key, 192, (const unsigned char*)des3_3key_subkeys, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "3DES 3 key", des3_3key_key, 192, test_message, des3_message_lengths, (const unsigned char*)des3_3key_expected_result, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) if( ( ret = test_aes128_cmac_prf( verbose ) ) != 0 ) return( ret ); #endif /* MBEDTLS_AES_C */ if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CMAC_C */ fldigi-4.1.06/src/mbedtls/ssl_tls.c0000664000175000017500000115735413507401434014054 00000000000000/* * SSLv3/TLSv1 shared functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SSL 3.0 specification was drafted by Netscape in 1996, * and became an IETF standard in 1999. * * http://wp.netscape.com/eng/ssl3/ * http://www.ietf.org/rfc/rfc2246.txt * http://www.ietf.org/rfc/rfc4346.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_TLS_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_X509_CRT_PARSE_C) #include "mbedtls/oid.h" #endif static void ssl_reset_in_out_pointers( mbedtls_ssl_context *ssl ); static uint32_t ssl_get_hs_total_len( mbedtls_ssl_context const *ssl ); /* Length of the "epoch" field in the record header */ static inline size_t ssl_ep_len( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 2 ); #else ((void) ssl); #endif return( 0 ); } /* * Start a timer. * Passing millisecs = 0 cancels a running timer. */ static void ssl_set_timer( mbedtls_ssl_context *ssl, uint32_t millisecs ) { if( ssl->f_set_timer == NULL ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "set_timer to %d ms", (int) millisecs ) ); ssl->f_set_timer( ssl->p_timer, millisecs / 4, millisecs ); } /* * Return -1 is timer is expired, 0 if it isn't. */ static int ssl_check_timer( mbedtls_ssl_context *ssl ) { if( ssl->f_get_timer == NULL ) return( 0 ); if( ssl->f_get_timer( ssl->p_timer ) == 2 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "timer expired" ) ); return( -1 ); } return( 0 ); } static void ssl_update_out_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ); static void ssl_update_in_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ); #define SSL_DONT_FORCE_FLUSH 0 #define SSL_FORCE_FLUSH 1 #if defined(MBEDTLS_SSL_PROTO_DTLS) /* Forward declarations for functions related to message buffering. */ static void ssl_buffering_free( mbedtls_ssl_context *ssl ); static void ssl_buffering_free_slot( mbedtls_ssl_context *ssl, uint8_t slot ); static void ssl_free_buffered_record( mbedtls_ssl_context *ssl ); static int ssl_load_buffered_message( mbedtls_ssl_context *ssl ); static int ssl_load_buffered_record( mbedtls_ssl_context *ssl ); static int ssl_buffer_message( mbedtls_ssl_context *ssl ); static int ssl_buffer_future_record( mbedtls_ssl_context *ssl ); static int ssl_next_record_is_in_datagram( mbedtls_ssl_context *ssl ); static size_t ssl_get_current_mtu( const mbedtls_ssl_context *ssl ); static size_t ssl_get_maximum_datagram_size( mbedtls_ssl_context const *ssl ) { size_t mtu = ssl_get_current_mtu( ssl ); if( mtu != 0 && mtu < MBEDTLS_SSL_OUT_BUFFER_LEN ) return( mtu ); return( MBEDTLS_SSL_OUT_BUFFER_LEN ); } static int ssl_get_remaining_space_in_datagram( mbedtls_ssl_context const *ssl ) { size_t const bytes_written = ssl->out_left; size_t const mtu = ssl_get_maximum_datagram_size( ssl ); /* Double-check that the write-index hasn't gone * past what we can transmit in a single datagram. */ if( bytes_written > mtu ) { /* Should never happen... */ return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } return( (int) ( mtu - bytes_written ) ); } static int ssl_get_remaining_payload_in_datagram( mbedtls_ssl_context const *ssl ) { int ret; size_t remaining, expansion; size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN; #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) const size_t mfl = mbedtls_ssl_get_max_frag_len( ssl ); if( max_len > mfl ) max_len = mfl; /* By the standard (RFC 6066 Sect. 4), the MFL extension * only limits the maximum record payload size, so in theory * we would be allowed to pack multiple records of payload size * MFL into a single datagram. However, this would mean that there's * no way to explicitly communicate MTU restrictions to the peer. * * The following reduction of max_len makes sure that we never * write datagrams larger than MFL + Record Expansion Overhead. */ if( max_len <= ssl->out_left ) return( 0 ); max_len -= ssl->out_left; #endif ret = ssl_get_remaining_space_in_datagram( ssl ); if( ret < 0 ) return( ret ); remaining = (size_t) ret; ret = mbedtls_ssl_get_record_expansion( ssl ); if( ret < 0 ) return( ret ); expansion = (size_t) ret; if( remaining <= expansion ) return( 0 ); remaining -= expansion; if( remaining >= max_len ) remaining = max_len; return( (int) remaining ); } /* * Double the retransmit timeout value, within the allowed range, * returning -1 if the maximum value has already been reached. */ static int ssl_double_retransmit_timeout( mbedtls_ssl_context *ssl ) { uint32_t new_timeout; if( ssl->handshake->retransmit_timeout >= ssl->conf->hs_timeout_max ) return( -1 ); /* Implement the final paragraph of RFC 6347 section 4.1.1.1 * in the following way: after the initial transmission and a first * retransmission, back off to a temporary estimated MTU of 508 bytes. * This value is guaranteed to be deliverable (if not guaranteed to be * delivered) of any compliant IPv4 (and IPv6) network, and should work * on most non-IP stacks too. */ if( ssl->handshake->retransmit_timeout != ssl->conf->hs_timeout_min ) { ssl->handshake->mtu = 508; MBEDTLS_SSL_DEBUG_MSG( 2, ( "mtu autoreduction to %d bytes", ssl->handshake->mtu ) ); } new_timeout = 2 * ssl->handshake->retransmit_timeout; /* Avoid arithmetic overflow and range overflow */ if( new_timeout < ssl->handshake->retransmit_timeout || new_timeout > ssl->conf->hs_timeout_max ) { new_timeout = ssl->conf->hs_timeout_max; } ssl->handshake->retransmit_timeout = new_timeout; MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs", ssl->handshake->retransmit_timeout ) ); return( 0 ); } static void ssl_reset_retransmit_timeout( mbedtls_ssl_context *ssl ) { ssl->handshake->retransmit_timeout = ssl->conf->hs_timeout_min; MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs", ssl->handshake->retransmit_timeout ) ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) /* * Convert max_fragment_length codes to length. * RFC 6066 says: * enum{ * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255) * } MaxFragmentLength; * and we add 0 -> extension unused */ static unsigned int ssl_mfl_code_to_length( int mfl ) { switch( mfl ) { case MBEDTLS_SSL_MAX_FRAG_LEN_NONE: return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ); case MBEDTLS_SSL_MAX_FRAG_LEN_512: return 512; case MBEDTLS_SSL_MAX_FRAG_LEN_1024: return 1024; case MBEDTLS_SSL_MAX_FRAG_LEN_2048: return 2048; case MBEDTLS_SSL_MAX_FRAG_LEN_4096: return 4096; default: return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ); } } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_CLI_C) static int ssl_session_copy( mbedtls_ssl_session *dst, const mbedtls_ssl_session *src ) { mbedtls_ssl_session_free( dst ); memcpy( dst, src, sizeof( mbedtls_ssl_session ) ); #if defined(MBEDTLS_X509_CRT_PARSE_C) if( src->peer_cert != NULL ) { int ret; dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) ); if( dst->peer_cert == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); mbedtls_x509_crt_init( dst->peer_cert ); if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p, src->peer_cert->raw.len ) ) != 0 ) { mbedtls_free( dst->peer_cert ); dst->peer_cert = NULL; return( ret ); } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) if( src->ticket != NULL ) { dst->ticket = mbedtls_calloc( 1, src->ticket_len ); if( dst->ticket == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); memcpy( dst->ticket, src->ticket, src->ticket_len ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ return( 0 ); } #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) int (*mbedtls_ssl_hw_record_init)( mbedtls_ssl_context *ssl, const unsigned char *key_enc, const unsigned char *key_dec, size_t keylen, const unsigned char *iv_enc, const unsigned char *iv_dec, size_t ivlen, const unsigned char *mac_enc, const unsigned char *mac_dec, size_t maclen ) = NULL; int (*mbedtls_ssl_hw_record_activate)( mbedtls_ssl_context *ssl, int direction) = NULL; int (*mbedtls_ssl_hw_record_reset)( mbedtls_ssl_context *ssl ) = NULL; int (*mbedtls_ssl_hw_record_write)( mbedtls_ssl_context *ssl ) = NULL; int (*mbedtls_ssl_hw_record_read)( mbedtls_ssl_context *ssl ) = NULL; int (*mbedtls_ssl_hw_record_finish)( mbedtls_ssl_context *ssl ) = NULL; #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ /* * Key material generation */ #if defined(MBEDTLS_SSL_PROTO_SSL3) static int ssl3_prf( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { int ret = 0; size_t i; mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char padding[16]; unsigned char sha1sum[20]; ((void)label); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); /* * SSLv3: * block = * MD5( secret + SHA1( 'A' + secret + random ) ) + * MD5( secret + SHA1( 'BB' + secret + random ) ) + * MD5( secret + SHA1( 'CCC' + secret + random ) ) + * ... */ for( i = 0; i < dlen / 16; i++ ) { memset( padding, (unsigned char) ('A' + i), 1 + i ); if( ( ret = mbedtls_sha1_starts_ret( &sha1 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &sha1, padding, 1 + i ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &sha1, secret, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &sha1, random, rlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_finish_ret( &sha1, sha1sum ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_starts_ret( &md5 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5, secret, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5, sha1sum, 20 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &md5, dstbuf + i * 16 ) ) != 0 ) goto exit; } exit: mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); mbedtls_platform_zeroize( padding, sizeof( padding ) ); mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) static int tls1_prf( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { size_t nb, hs; size_t i, j, k; const unsigned char *S1, *S2; unsigned char tmp[128]; unsigned char h_i[20]; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; int ret; mbedtls_md_init( &md_ctx ); if( sizeof( tmp ) < 20 + strlen( label ) + rlen ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); hs = ( slen + 1 ) / 2; S1 = secret; S2 = secret + slen - hs; nb = strlen( label ); memcpy( tmp + 20, label, nb ); memcpy( tmp + 20 + nb, random, rlen ); nb += rlen; /* * First compute P_md5(secret,label+random)[0..dlen] */ if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) return( ret ); mbedtls_md_hmac_starts( &md_ctx, S1, hs ); mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb ); mbedtls_md_hmac_finish( &md_ctx, 4 + tmp ); for( i = 0; i < dlen; i += 16 ) { mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb ); mbedtls_md_hmac_finish( &md_ctx, h_i ); mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 ); mbedtls_md_hmac_finish( &md_ctx, 4 + tmp ); k = ( i + 16 > dlen ) ? dlen % 16 : 16; for( j = 0; j < k; j++ ) dstbuf[i + j] = h_i[j]; } mbedtls_md_free( &md_ctx ); /* * XOR out with P_sha1(secret,label+random)[0..dlen] */ if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) return( ret ); mbedtls_md_hmac_starts( &md_ctx, S2, hs ); mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb ); mbedtls_md_hmac_finish( &md_ctx, tmp ); for( i = 0; i < dlen; i += 20 ) { mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb ); mbedtls_md_hmac_finish( &md_ctx, h_i ); mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, 20 ); mbedtls_md_hmac_finish( &md_ctx, tmp ); k = ( i + 20 > dlen ) ? dlen % 20 : 20; for( j = 0; j < k; j++ ) dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] ); } mbedtls_md_free( &md_ctx ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); mbedtls_platform_zeroize( h_i, sizeof( h_i ) ); return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) static int tls_prf_generic( mbedtls_md_type_t md_type, const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { size_t nb; size_t i, j, k, md_len; unsigned char tmp[128]; unsigned char h_i[MBEDTLS_MD_MAX_SIZE]; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; int ret; mbedtls_md_init( &md_ctx ); if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); md_len = mbedtls_md_get_size( md_info ); if( sizeof( tmp ) < md_len + strlen( label ) + rlen ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); nb = strlen( label ); memcpy( tmp + md_len, label, nb ); memcpy( tmp + md_len + nb, random, rlen ); nb += rlen; /* * Compute P_(secret, label + random)[0..dlen] */ if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) return( ret ); mbedtls_md_hmac_starts( &md_ctx, secret, slen ); mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb ); mbedtls_md_hmac_finish( &md_ctx, tmp ); for( i = 0; i < dlen; i += md_len ) { mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb ); mbedtls_md_hmac_finish( &md_ctx, h_i ); mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, md_len ); mbedtls_md_hmac_finish( &md_ctx, tmp ); k = ( i + md_len > dlen ) ? dlen % md_len : md_len; for( j = 0; j < k; j++ ) dstbuf[i + j] = h_i[j]; } mbedtls_md_free( &md_ctx ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); mbedtls_platform_zeroize( h_i, sizeof( h_i ) ); return( 0 ); } #if defined(MBEDTLS_SHA256_C) static int tls_prf_sha256( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen, label, random, rlen, dstbuf, dlen ) ); } #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) static int tls_prf_sha384( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen, label, random, rlen, dstbuf, dlen ) ); } #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t ); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t ); #endif #if defined(MBEDTLS_SSL_PROTO_SSL3) static void ssl_calc_verify_ssl( mbedtls_ssl_context *, unsigned char * ); static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_calc_verify_tls( mbedtls_ssl_context *, unsigned char * ); static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t ); static void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned char * ); static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int ); #endif #if defined(MBEDTLS_SHA512_C) static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t ); static void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *, unsigned char * ); static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ) { int ret = 0; unsigned char tmp[64]; unsigned char keyblk[256]; unsigned char *key1; unsigned char *key2; unsigned char *mac_enc; unsigned char *mac_dec; size_t mac_key_len; size_t iv_copy_len; const mbedtls_cipher_info_t *cipher_info; const mbedtls_md_info_t *md_info; mbedtls_ssl_session *session = ssl->session_negotiate; mbedtls_ssl_transform *transform = ssl->transform_negotiate; mbedtls_ssl_handshake_params *handshake = ssl->handshake; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) ); cipher_info = mbedtls_cipher_info_from_type( transform->ciphersuite_info->cipher ); if( cipher_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %d not found", transform->ciphersuite_info->cipher ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } md_info = mbedtls_md_info_from_type( transform->ciphersuite_info->mac ); if( md_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %d not found", transform->ciphersuite_info->mac ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { handshake->tls_prf = ssl3_prf; handshake->calc_verify = ssl_calc_verify_ssl; handshake->calc_finished = ssl_calc_finished_ssl; } else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) { handshake->tls_prf = tls1_prf; handshake->calc_verify = ssl_calc_verify_tls; handshake->calc_finished = ssl_calc_finished_tls; } else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA512_C) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && transform->ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) { handshake->tls_prf = tls_prf_sha384; handshake->calc_verify = ssl_calc_verify_tls_sha384; handshake->calc_finished = ssl_calc_finished_tls_sha384; } else #endif #if defined(MBEDTLS_SHA256_C) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { handshake->tls_prf = tls_prf_sha256; handshake->calc_verify = ssl_calc_verify_tls_sha256; handshake->calc_finished = ssl_calc_finished_tls_sha256; } else #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * SSLv3: * master = * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) + * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) + * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) ) * * TLSv1+: * master = PRF( premaster, "master secret", randbytes )[0..47] */ if( handshake->resume == 0 ) { MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster, handshake->pmslen ); #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED ) { unsigned char session_hash[48]; size_t hash_len; MBEDTLS_SSL_DEBUG_MSG( 3, ( "using extended master secret" ) ); ssl->handshake->calc_verify( ssl, session_hash ); #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { #if defined(MBEDTLS_SHA512_C) if( ssl->transform_negotiate->ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) { hash_len = 48; } else #endif hash_len = 32; } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ hash_len = 36; MBEDTLS_SSL_DEBUG_BUF( 3, "session hash", session_hash, hash_len ); ret = handshake->tls_prf( handshake->premaster, handshake->pmslen, "extended master secret", session_hash, hash_len, session->master, 48 ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); return( ret ); } } else #endif ret = handshake->tls_prf( handshake->premaster, handshake->pmslen, "master secret", handshake->randbytes, 64, session->master, 48 ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); return( ret ); } mbedtls_platform_zeroize( handshake->premaster, sizeof(handshake->premaster) ); } else MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) ); /* * Swap the client and server random values. */ memcpy( tmp, handshake->randbytes, 64 ); memcpy( handshake->randbytes, tmp + 32, 32 ); memcpy( handshake->randbytes + 32, tmp, 32 ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); /* * SSLv3: * key block = * MD5( master + SHA1( 'A' + master + randbytes ) ) + * MD5( master + SHA1( 'BB' + master + randbytes ) ) + * MD5( master + SHA1( 'CCC' + master + randbytes ) ) + * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) + * ... * * TLSv1: * key block = PRF( master, "key expansion", randbytes ) */ ret = handshake->tls_prf( session->master, 48, "key expansion", handshake->randbytes, 64, keyblk, 256 ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s", mbedtls_ssl_get_ciphersuite_name( session->ciphersuite ) ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", session->master, 48 ); MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 ); MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 ); mbedtls_platform_zeroize( handshake->randbytes, sizeof( handshake->randbytes ) ); /* * Determine the appropriate key, IV and MAC length. */ transform->keylen = cipher_info->key_bitlen / 8; if( cipher_info->mode == MBEDTLS_MODE_GCM || cipher_info->mode == MBEDTLS_MODE_CCM || cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY ) { size_t taglen, explicit_ivlen; transform->maclen = 0; mac_key_len = 0; /* All modes haves 96-bit IVs; * GCM and CCM has 4 implicit and 8 explicit bytes * ChachaPoly has all 12 bytes implicit */ transform->ivlen = 12; if( cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY ) transform->fixed_ivlen = 12; else transform->fixed_ivlen = 4; /* All modes have 128-bit tags, except CCM_8 (ciphersuite flag) */ taglen = transform->ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; /* Minimum length of encrypted record */ explicit_ivlen = transform->ivlen - transform->fixed_ivlen; transform->minlen = explicit_ivlen + taglen; } else { /* Initialize HMAC contexts */ if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 || ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret ); return( ret ); } /* Get MAC length */ mac_key_len = mbedtls_md_get_size( md_info ); transform->maclen = mac_key_len; #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) /* * If HMAC is to be truncated, we shall keep the leftmost bytes, * (rfc 6066 page 13 or rfc 2104 section 4), * so we only need to adjust the length here. */ if( session->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED ) { transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN; #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) /* Fall back to old, non-compliant version of the truncated * HMAC implementation which also truncates the key * (Mbed TLS versions from 1.3 to 2.6.0) */ mac_key_len = transform->maclen; #endif } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ /* IV length */ transform->ivlen = cipher_info->iv_size; /* Minimum length */ if( cipher_info->mode == MBEDTLS_MODE_STREAM ) transform->minlen = transform->maclen; else { /* * GenericBlockCipher: * 1. if EtM is in use: one block plus MAC * otherwise: * first multiple of blocklen greater than maclen * 2. IV except for SSL3 and TLS 1.0 */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) if( session->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED ) { transform->minlen = transform->maclen + cipher_info->block_size; } else #endif { transform->minlen = transform->maclen + cipher_info->block_size - transform->maclen % cipher_info->block_size; } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 ) ; /* No need to adjust minlen */ else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { transform->minlen += transform->ivlen; } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } } MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d", transform->keylen, transform->minlen, transform->ivlen, transform->maclen ) ); /* * Finally setup the cipher contexts, IVs and MAC secrets. */ #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) { key1 = keyblk + mac_key_len * 2; key2 = keyblk + mac_key_len * 2 + transform->keylen; mac_enc = keyblk; mac_dec = keyblk + mac_key_len; /* * This is not used in TLS v1.1. */ iv_copy_len = ( transform->fixed_ivlen ) ? transform->fixed_ivlen : transform->ivlen; memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len ); memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len, iv_copy_len ); } else #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) { key1 = keyblk + mac_key_len * 2 + transform->keylen; key2 = keyblk + mac_key_len * 2; mac_enc = keyblk + mac_key_len; mac_dec = keyblk; /* * This is not used in TLS v1.1. */ iv_copy_len = ( transform->fixed_ivlen ) ? transform->fixed_ivlen : transform->ivlen; memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len ); memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len, iv_copy_len ); } else #endif /* MBEDTLS_SSL_SRV_C */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { if( mac_key_len > sizeof transform->mac_enc ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } memcpy( transform->mac_enc, mac_enc, mac_key_len ); memcpy( transform->mac_dec, mac_dec, mac_key_len ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) { /* For HMAC-based ciphersuites, initialize the HMAC transforms. For AEAD-based ciphersuites, there is nothing to do here. */ if( mac_key_len != 0 ) { mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, mac_key_len ); mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, mac_key_len ); } } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_init != NULL ) { int ret = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) ); if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, transform->keylen, transform->iv_enc, transform->iv_dec, iv_copy_len, mac_enc, mac_dec, mac_key_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) if( ssl->conf->f_export_keys != NULL ) { ssl->conf->f_export_keys( ssl->conf->p_export_keys, session->master, keyblk, mac_key_len, transform->keylen, iv_copy_len ); } #endif if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc, cipher_info ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); return( ret ); } if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec, cipher_info ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); return( ret ); } if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1, cipher_info->key_bitlen, MBEDTLS_ENCRYPT ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret ); return( ret ); } if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2, cipher_info->key_bitlen, MBEDTLS_DECRYPT ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret ); return( ret ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) if( cipher_info->mode == MBEDTLS_MODE_CBC ) { if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc, MBEDTLS_PADDING_NONE ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret ); return( ret ); } if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec, MBEDTLS_PADDING_NONE ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret ); return( ret ); } } #endif /* MBEDTLS_CIPHER_MODE_CBC */ mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) ); #if defined(MBEDTLS_ZLIB_SUPPORT) // Initialize compression // if( session->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) { if( ssl->compress_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) ); ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_COMPRESS_BUFFER_LEN ); if( ssl->compress_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_COMPRESS_BUFFER_LEN ) ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } } MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) ); memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) ); memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) ); if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK || inflateInit( &transform->ctx_inflate ) != Z_OK ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) ); return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); } } #endif /* MBEDTLS_ZLIB_SUPPORT */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] ) { mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char pad_1[48]; unsigned char pad_2[48]; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); memset( pad_1, 0x36, 48 ); memset( pad_2, 0x5C, 48 ); mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 ); mbedtls_md5_update_ret( &md5, pad_1, 48 ); mbedtls_md5_finish_ret( &md5, hash ); mbedtls_md5_starts_ret( &md5 ); mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 ); mbedtls_md5_update_ret( &md5, pad_2, 48 ); mbedtls_md5_update_ret( &md5, hash, 16 ); mbedtls_md5_finish_ret( &md5, hash ); mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 ); mbedtls_sha1_update_ret( &sha1, pad_1, 40 ); mbedtls_sha1_finish_ret( &sha1, hash + 16 ); mbedtls_sha1_starts_ret( &sha1 ); mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 ); mbedtls_sha1_update_ret( &sha1, pad_2, 40 ); mbedtls_sha1_update_ret( &sha1, hash + 16, 20 ); mbedtls_sha1_finish_ret( &sha1, hash + 16 ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); return; } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] ) { mbedtls_md5_context md5; mbedtls_sha1_context sha1; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); mbedtls_md5_finish_ret( &md5, hash ); mbedtls_sha1_finish_ret( &sha1, hash + 16 ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); return; } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32] ) { mbedtls_sha256_context sha256; mbedtls_sha256_init( &sha256 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) ); mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 ); mbedtls_sha256_finish_ret( &sha256, hash ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_sha256_free( &sha256 ); return; } #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48] ) { mbedtls_sha512_context sha512; mbedtls_sha512_init( &sha512 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) ); mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 ); mbedtls_sha512_finish_ret( &sha512, hash ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_sha512_free( &sha512 ); return; } #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex ) { unsigned char *p = ssl->handshake->premaster; unsigned char *end = p + sizeof( ssl->handshake->premaster ); const unsigned char *psk = ssl->conf->psk; size_t psk_len = ssl->conf->psk_len; /* If the psk callback was called, use its result */ if( ssl->handshake->psk != NULL ) { psk = ssl->handshake->psk; psk_len = ssl->handshake->psk_len; } /* * PMS = struct { * opaque other_secret<0..2^16-1>; * opaque psk<0..2^16-1>; * }; * with "other_secret" depending on the particular key exchange */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK ) { if( end - p < 2 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); *(p++) = (unsigned char)( psk_len >> 8 ); *(p++) = (unsigned char)( psk_len ); if( end < p || (size_t)( end - p ) < psk_len ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); memset( p, 0, psk_len ); p += psk_len; } else #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { /* * other_secret already set by the ClientKeyExchange message, * and is 48 bytes long */ if( end - p < 2 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); *p++ = 0; *p++ = 48; p += 48; } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { int ret; size_t len; /* Write length only when we know the actual value */ if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, p + 2, end - ( p + 2 ), &len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); return( ret ); } *(p++) = (unsigned char)( len >> 8 ); *(p++) = (unsigned char)( len ); p += len; MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { int ret; size_t zlen; if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen, p + 2, end - ( p + 2 ), ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); return( ret ); } *(p++) = (unsigned char)( zlen >> 8 ); *(p++) = (unsigned char)( zlen ); p += zlen; MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Z ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* opaque psk<0..2^16-1>; */ if( end - p < 2 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); *(p++) = (unsigned char)( psk_len >> 8 ); *(p++) = (unsigned char)( psk_len ); if( end < p || (size_t)( end - p ) < psk_len ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); memcpy( p, psk, psk_len ); p += psk_len; ssl->handshake->pmslen = p - ssl->handshake->premaster; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_SSL_PROTO_SSL3) /* * SSLv3.0 MAC functions */ #define SSL_MAC_MAX_BYTES 20 /* MD-5 or SHA-1 */ static void ssl_mac( mbedtls_md_context_t *md_ctx, const unsigned char *secret, const unsigned char *buf, size_t len, const unsigned char *ctr, int type, unsigned char out[SSL_MAC_MAX_BYTES] ) { unsigned char header[11]; unsigned char padding[48]; int padlen; int md_size = mbedtls_md_get_size( md_ctx->md_info ); int md_type = mbedtls_md_get_type( md_ctx->md_info ); /* Only MD5 and SHA-1 supported */ if( md_type == MBEDTLS_MD_MD5 ) padlen = 48; else padlen = 40; memcpy( header, ctr, 8 ); header[ 8] = (unsigned char) type; header[ 9] = (unsigned char)( len >> 8 ); header[10] = (unsigned char)( len ); memset( padding, 0x36, padlen ); mbedtls_md_starts( md_ctx ); mbedtls_md_update( md_ctx, secret, md_size ); mbedtls_md_update( md_ctx, padding, padlen ); mbedtls_md_update( md_ctx, header, 11 ); mbedtls_md_update( md_ctx, buf, len ); mbedtls_md_finish( md_ctx, out ); memset( padding, 0x5C, padlen ); mbedtls_md_starts( md_ctx ); mbedtls_md_update( md_ctx, secret, md_size ); mbedtls_md_update( md_ctx, padding, padlen ); mbedtls_md_update( md_ctx, out, md_size ); mbedtls_md_finish( md_ctx, out ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ ( defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C)) ) #define SSL_SOME_MODES_USE_MAC #endif /* The function below is only used in the Lucky 13 counter-measure in * ssl_decrypt_buf(). These are the defines that guard the call site. */ #if defined(SSL_SOME_MODES_USE_MAC) && \ ( defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) ) /* This function makes sure every byte in the memory region is accessed * (in ascending addresses order) */ static void ssl_read_memory( unsigned char *p, size_t len ) { unsigned char acc = 0; volatile unsigned char force; for( ; len != 0; p++, len-- ) acc ^= *p; force = acc; (void) force; } #endif /* SSL_SOME_MODES_USE_MAC && ( TLS1 || TLS1_1 || TLS1_2 ) */ /* * Encryption/decryption functions */ static int ssl_encrypt_buf( mbedtls_ssl_context *ssl ) { mbedtls_cipher_mode_t mode; int auth_done = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) ); if( ssl->session_out == NULL || ssl->transform_out == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc ); MBEDTLS_SSL_DEBUG_BUF( 4, "before encrypt: output payload", ssl->out_msg, ssl->out_msglen ); /* * Add MAC before if needed */ #if defined(SSL_SOME_MODES_USE_MAC) if( mode == MBEDTLS_MODE_STREAM || ( mode == MBEDTLS_MODE_CBC #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && ssl->session_out->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED #endif ) ) { #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { unsigned char mac[SSL_MAC_MAX_BYTES]; ssl_mac( &ssl->transform_out->md_ctx_enc, ssl->transform_out->mac_enc, ssl->out_msg, ssl->out_msglen, ssl->out_ctr, ssl->out_msgtype, mac ); memcpy( ssl->out_msg + ssl->out_msglen, mac, ssl->transform_out->maclen ); } else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) { unsigned char mac[MBEDTLS_SSL_MAC_ADD]; mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 8 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_hdr, 3 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_len, 2 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_msg, ssl->out_msglen ); mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc, mac ); mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc ); memcpy( ssl->out_msg + ssl->out_msglen, mac, ssl->transform_out->maclen ); } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 4, "computed mac", ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen ); ssl->out_msglen += ssl->transform_out->maclen; auth_done++; } #endif /* AEAD not the only option */ /* * Encrypt */ #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) if( mode == MBEDTLS_MODE_STREAM ) { int ret; size_t olen = 0; MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " "including %d bytes of padding", ssl->out_msglen, 0 ) ); if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc, ssl->transform_out->iv_enc, ssl->transform_out->ivlen, ssl->out_msg, ssl->out_msglen, ssl->out_msg, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( ssl->out_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_GCM_C) || \ defined(MBEDTLS_CCM_C) || \ defined(MBEDTLS_CHACHAPOLY_C) if( mode == MBEDTLS_MODE_GCM || mode == MBEDTLS_MODE_CCM || mode == MBEDTLS_MODE_CHACHAPOLY ) { int ret; size_t enc_msglen, olen; unsigned char *enc_msg; unsigned char add_data[13]; unsigned char iv[12]; mbedtls_ssl_transform *transform = ssl->transform_out; unsigned char taglen = transform->ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; size_t explicit_ivlen = transform->ivlen - transform->fixed_ivlen; /* * Prepare additional authenticated data */ memcpy( add_data, ssl->out_ctr, 8 ); add_data[8] = ssl->out_msgtype; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, add_data + 9 ); add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF; add_data[12] = ssl->out_msglen & 0xFF; MBEDTLS_SSL_DEBUG_BUF( 4, "additional data for AEAD", add_data, 13 ); /* * Generate IV */ if( transform->ivlen == 12 && transform->fixed_ivlen == 4 ) { /* GCM and CCM: fixed || explicit (=seqnum) */ memcpy( iv, transform->iv_enc, transform->fixed_ivlen ); memcpy( iv + transform->fixed_ivlen, ssl->out_ctr, 8 ); memcpy( ssl->out_iv, ssl->out_ctr, 8 ); } else if( transform->ivlen == 12 && transform->fixed_ivlen == 12 ) { /* ChachaPoly: fixed XOR sequence number */ unsigned char i; memcpy( iv, transform->iv_enc, transform->fixed_ivlen ); for( i = 0; i < 8; i++ ) iv[i+4] ^= ssl->out_ctr[i]; } else { /* Reminder if we ever add an AEAD mode with a different size */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 4, "IV used (internal)", iv, transform->ivlen ); MBEDTLS_SSL_DEBUG_BUF( 4, "IV used (transmitted)", ssl->out_iv, explicit_ivlen ); /* * Fix message length with added IV */ enc_msg = ssl->out_msg; enc_msglen = ssl->out_msglen; ssl->out_msglen += explicit_ivlen; MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " "including 0 bytes of padding", ssl->out_msglen ) ); /* * Encrypt and authenticate */ if( ( ret = mbedtls_cipher_auth_encrypt( &transform->cipher_ctx_enc, iv, transform->ivlen, add_data, 13, enc_msg, enc_msglen, enc_msg, &olen, enc_msg + enc_msglen, taglen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_encrypt", ret ); return( ret ); } if( olen != enc_msglen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->out_msglen += taglen; auth_done++; MBEDTLS_SSL_DEBUG_BUF( 4, "after encrypt: tag", enc_msg + enc_msglen, taglen ); } else #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C) ) if( mode == MBEDTLS_MODE_CBC ) { int ret; unsigned char *enc_msg; size_t enc_msglen, padlen, olen = 0, i; padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) % ssl->transform_out->ivlen; if( padlen == ssl->transform_out->ivlen ) padlen = 0; for( i = 0; i <= padlen; i++ ) ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen; ssl->out_msglen += padlen + 1; enc_msglen = ssl->out_msglen; enc_msg = ssl->out_msg; #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * Prepend per-record IV for block cipher in TLS v1.1 and up as per * Method 1 (6.2.3.2. in RFC4346 and RFC5246) */ if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { /* * Generate IV */ ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->transform_out->iv_enc, ssl->transform_out->ivlen ); if( ret != 0 ) return( ret ); memcpy( ssl->out_iv, ssl->transform_out->iv_enc, ssl->transform_out->ivlen ); /* * Fix pointer positions and message length with added IV */ enc_msg = ssl->out_msg; enc_msglen = ssl->out_msglen; ssl->out_msglen += ssl->transform_out->ivlen; } #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " "including %d bytes of IV and %d bytes of padding", ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) ); if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc, ssl->transform_out->iv_enc, ssl->transform_out->ivlen, enc_msg, enc_msglen, enc_msg, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( enc_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ) { /* * Save IV in SSL3 and TLS1 */ memcpy( ssl->transform_out->iv_enc, ssl->transform_out->cipher_ctx_enc.iv, ssl->transform_out->ivlen ); } #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) if( auth_done == 0 ) { unsigned char mac[MBEDTLS_SSL_MAC_ADD]; /* * MAC(MAC_write_key, seq_num + * TLSCipherText.type + * TLSCipherText.version + * length_of( (IV +) ENC(...) ) + * IV + // except for TLS 1.0 * ENC(content + padding + padding_length)); */ unsigned char pseudo_hdr[13]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) ); memcpy( pseudo_hdr + 0, ssl->out_ctr, 8 ); memcpy( pseudo_hdr + 8, ssl->out_hdr, 3 ); pseudo_hdr[11] = (unsigned char)( ( ssl->out_msglen >> 8 ) & 0xFF ); pseudo_hdr[12] = (unsigned char)( ( ssl->out_msglen ) & 0xFF ); MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_iv, ssl->out_msglen ); mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc, mac ); mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc ); memcpy( ssl->out_iv + ssl->out_msglen, mac, ssl->transform_out->maclen ); ssl->out_msglen += ssl->transform_out->maclen; auth_done++; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ } else #endif /* MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C || MBEDTLS_ARIA_C ) */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* Make extra sure authentication was performed, exactly once */ if( auth_done != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) ); return( 0 ); } static int ssl_decrypt_buf( mbedtls_ssl_context *ssl ) { mbedtls_cipher_mode_t mode; int auth_done = 0; #if defined(SSL_SOME_MODES_USE_MAC) size_t padlen = 0, correct = 1; #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) ); if( ssl->session_in == NULL || ssl->transform_in == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_in->cipher_ctx_dec ); if( ssl->in_msglen < ssl->transform_in->minlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)", ssl->in_msglen, ssl->transform_in->minlen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) if( mode == MBEDTLS_MODE_STREAM ) { int ret; size_t olen = 0; padlen = 0; if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec, ssl->transform_in->iv_dec, ssl->transform_in->ivlen, ssl->in_msg, ssl->in_msglen, ssl->in_msg, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( ssl->in_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_GCM_C) || \ defined(MBEDTLS_CCM_C) || \ defined(MBEDTLS_CHACHAPOLY_C) if( mode == MBEDTLS_MODE_GCM || mode == MBEDTLS_MODE_CCM || mode == MBEDTLS_MODE_CHACHAPOLY ) { int ret; size_t dec_msglen, olen; unsigned char *dec_msg; unsigned char *dec_msg_result; unsigned char add_data[13]; unsigned char iv[12]; mbedtls_ssl_transform *transform = ssl->transform_in; unsigned char taglen = transform->ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; size_t explicit_iv_len = transform->ivlen - transform->fixed_ivlen; /* * Compute and update sizes */ if( ssl->in_msglen < explicit_iv_len + taglen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < explicit_iv_len (%d) " "+ taglen (%d)", ssl->in_msglen, explicit_iv_len, taglen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } dec_msglen = ssl->in_msglen - explicit_iv_len - taglen; dec_msg = ssl->in_msg; dec_msg_result = ssl->in_msg; ssl->in_msglen = dec_msglen; /* * Prepare additional authenticated data */ memcpy( add_data, ssl->in_ctr, 8 ); add_data[8] = ssl->in_msgtype; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, add_data + 9 ); add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF; add_data[12] = ssl->in_msglen & 0xFF; MBEDTLS_SSL_DEBUG_BUF( 4, "additional data for AEAD", add_data, 13 ); /* * Prepare IV */ if( transform->ivlen == 12 && transform->fixed_ivlen == 4 ) { /* GCM and CCM: fixed || explicit (transmitted) */ memcpy( iv, transform->iv_dec, transform->fixed_ivlen ); memcpy( iv + transform->fixed_ivlen, ssl->in_iv, 8 ); } else if( transform->ivlen == 12 && transform->fixed_ivlen == 12 ) { /* ChachaPoly: fixed XOR sequence number */ unsigned char i; memcpy( iv, transform->iv_dec, transform->fixed_ivlen ); for( i = 0; i < 8; i++ ) iv[i+4] ^= ssl->in_ctr[i]; } else { /* Reminder if we ever add an AEAD mode with a different size */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 4, "IV used", iv, transform->ivlen ); MBEDTLS_SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, taglen ); /* * Decrypt and authenticate */ if( ( ret = mbedtls_cipher_auth_decrypt( &ssl->transform_in->cipher_ctx_dec, iv, transform->ivlen, add_data, 13, dec_msg, dec_msglen, dec_msg_result, &olen, dec_msg + dec_msglen, taglen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_decrypt", ret ); if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED ) return( MBEDTLS_ERR_SSL_INVALID_MAC ); return( ret ); } auth_done++; if( olen != dec_msglen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C) ) if( mode == MBEDTLS_MODE_CBC ) { /* * Decrypt and check the padding */ int ret; unsigned char *dec_msg; unsigned char *dec_msg_result; size_t dec_msglen; size_t minlen = 0; size_t olen = 0; /* * Check immediate ciphertext sanity */ #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) minlen += ssl->transform_in->ivlen; #endif if( ssl->in_msglen < minlen + ssl->transform_in->ivlen || ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) " "+ 1 ) ( + expl IV )", ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } dec_msglen = ssl->in_msglen; dec_msg = ssl->in_msg; dec_msg_result = ssl->in_msg; /* * Authenticate before decrypt if enabled */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) if( ssl->session_in->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED ) { unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD]; unsigned char pseudo_hdr[13]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) ); dec_msglen -= ssl->transform_in->maclen; ssl->in_msglen -= ssl->transform_in->maclen; memcpy( pseudo_hdr + 0, ssl->in_ctr, 8 ); memcpy( pseudo_hdr + 8, ssl->in_hdr, 3 ); pseudo_hdr[11] = (unsigned char)( ( ssl->in_msglen >> 8 ) & 0xFF ); pseudo_hdr[12] = (unsigned char)( ( ssl->in_msglen ) & 0xFF ); MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_iv, ssl->in_msglen ); mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, mac_expect ); mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec ); MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", ssl->in_iv + ssl->in_msglen, ssl->transform_in->maclen ); MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect, ssl->transform_in->maclen ); if( mbedtls_ssl_safer_memcmp( ssl->in_iv + ssl->in_msglen, mac_expect, ssl->transform_in->maclen ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } auth_done++; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ /* * Check length sanity */ if( ssl->in_msglen % ssl->transform_in->ivlen != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0", ssl->in_msglen, ssl->transform_in->ivlen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * Initialize for prepended IV for block cipher in TLS v1.1 and up */ if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { unsigned char i; dec_msglen -= ssl->transform_in->ivlen; ssl->in_msglen -= ssl->transform_in->ivlen; for( i = 0; i < ssl->transform_in->ivlen; i++ ) ssl->transform_in->iv_dec[i] = ssl->in_iv[i]; } #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec, ssl->transform_in->iv_dec, ssl->transform_in->ivlen, dec_msg, dec_msglen, dec_msg_result, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( dec_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ) { /* * Save IV in SSL3 and TLS1 */ memcpy( ssl->transform_in->iv_dec, ssl->transform_in->cipher_ctx_dec.iv, ssl->transform_in->ivlen ); } #endif padlen = 1 + ssl->in_msg[ssl->in_msglen - 1]; if( ssl->in_msglen < ssl->transform_in->maclen + padlen && auth_done == 0 ) { #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)", ssl->in_msglen, ssl->transform_in->maclen, padlen ) ); #endif padlen = 0; correct = 0; } #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { if( padlen > ssl->transform_in->ivlen ) { #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, " "should be no more than %d", padlen, ssl->transform_in->ivlen ) ); #endif correct = 0; } } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 ) { /* * TLSv1+: always check the padding up to the first failure * and fake check up to 256 bytes of padding */ size_t pad_count = 0, real_count = 1; size_t padding_idx = ssl->in_msglen - padlen; size_t i; /* * Padding is guaranteed to be incorrect if: * 1. padlen > ssl->in_msglen * * 2. padding_idx > MBEDTLS_SSL_IN_CONTENT_LEN + * ssl->transform_in->maclen * * In both cases we reset padding_idx to a safe value (0) to * prevent out-of-buffer reads. */ correct &= ( padlen <= ssl->in_msglen ); correct &= ( padding_idx <= MBEDTLS_SSL_IN_CONTENT_LEN + ssl->transform_in->maclen ); padding_idx *= correct; for( i = 0; i < 256; i++ ) { real_count &= ( i < padlen ); pad_count += real_count * ( ssl->in_msg[padding_idx + i] == padlen - 1 ); } correct &= ( pad_count == padlen ); /* Only 1 on correct padding */ #if defined(MBEDTLS_SSL_DEBUG_ALL) if( padlen > 0 && correct == 0 ) MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) ); #endif padlen &= correct * 0x1FF; } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->in_msglen -= padlen; } else #endif /* MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C || MBEDTLS_ARIA_C ) */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_BUF( 4, "raw buffer after decryption", ssl->in_msg, ssl->in_msglen ); #endif /* * Authenticate if not done yet. * Compute the MAC regardless of the padding result (RFC4346, CBCTIME). */ #if defined(SSL_SOME_MODES_USE_MAC) if( auth_done == 0 ) { unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD]; ssl->in_msglen -= ssl->transform_in->maclen; ssl->in_len[0] = (unsigned char)( ssl->in_msglen >> 8 ); ssl->in_len[1] = (unsigned char)( ssl->in_msglen ); #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl_mac( &ssl->transform_in->md_ctx_dec, ssl->transform_in->mac_dec, ssl->in_msg, ssl->in_msglen, ssl->in_ctr, ssl->in_msgtype, mac_expect ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 ) { /* * Process MAC and always update for padlen afterwards to make * total time independent of padlen. * * Known timing attacks: * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf) * * To compensate for different timings for the MAC calculation * depending on how much padding was removed (which is determined * by padlen), process extra_run more blocks through the hash * function. * * The formula in the paper is * extra_run = ceil( (L1-55) / 64 ) - ceil( (L2-55) / 64 ) * where L1 is the size of the header plus the decrypted message * plus CBC padding and L2 is the size of the header plus the * decrypted message. This is for an underlying hash function * with 64-byte blocks. * We use ( (Lx+8) / 64 ) to handle 'negative Lx' values * correctly. We round down instead of up, so -56 is the correct * value for our calculations instead of -55. * * Repeat the formula rather than defining a block_size variable. * This avoids requiring division by a variable at runtime * (which would be marginally less efficient and would require * linking an extra division function in some builds). */ size_t j, extra_run = 0; /* * The next two sizes are the minimum and maximum values of * in_msglen over all padlen values. * * They're independent of padlen, since we previously did * in_msglen -= padlen. * * Note that max_len + maclen is never more than the buffer * length, as we previously did in_msglen -= maclen too. */ const size_t max_len = ssl->in_msglen + padlen; const size_t min_len = ( max_len > 256 ) ? max_len - 256 : 0; switch( ssl->transform_in->ciphersuite_info->mac ) { #if defined(MBEDTLS_MD5_C) || defined(MBEDTLS_SHA1_C) || \ defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_MD5: case MBEDTLS_MD_SHA1: case MBEDTLS_MD_SHA256: /* 8 bytes of message size, 64-byte compression blocks */ extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 - ( 13 + ssl->in_msglen + 8 ) / 64; break; #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_MD_SHA384: /* 16 bytes of message size, 128-byte compression blocks */ extra_run = ( 13 + ssl->in_msglen + padlen + 16 ) / 128 - ( 13 + ssl->in_msglen + 16 ) / 128; break; #endif default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } extra_run &= correct * 0xFF; mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 8 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_hdr, 3 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_len, 2 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg, ssl->in_msglen ); /* Make sure we access everything even when padlen > 0. This * makes the synchronisation requirements for just-in-time * Prime+Probe attacks much tighter and hopefully impractical. */ ssl_read_memory( ssl->in_msg + ssl->in_msglen, padlen ); mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, mac_expect ); /* Call mbedtls_md_process at least once due to cache attacks * that observe whether md_process() was called of not */ for( j = 0; j < extra_run + 1; j++ ) mbedtls_md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg ); mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec ); /* Make sure we access all the memory that could contain the MAC, * before we check it in the next code block. This makes the * synchronisation requirements for just-in-time Prime+Probe * attacks much tighter and hopefully impractical. */ ssl_read_memory( ssl->in_msg + min_len, max_len - min_len + ssl->transform_in->maclen ); } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect, ssl->transform_in->maclen ); MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen ); #endif if( mbedtls_ssl_safer_memcmp( ssl->in_msg + ssl->in_msglen, mac_expect, ssl->transform_in->maclen ) != 0 ) { #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) ); #endif correct = 0; } auth_done++; } /* * Finally check the correct flag */ if( correct == 0 ) return( MBEDTLS_ERR_SSL_INVALID_MAC ); #endif /* SSL_SOME_MODES_USE_MAC */ /* Make extra sure authentication was performed, exactly once */ if( auth_done != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( ssl->in_msglen == 0 ) { #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) { /* TLS v1.2 explicitly disallows zero-length messages which are not application data */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid zero-length message type: %d", ssl->in_msgtype ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ ssl->nb_zero++; /* * Three or more empty messages may be a DoS attack * (excessive CPU consumption). */ if( ssl->nb_zero > 3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received four consecutive empty " "messages, possible DoS attack" ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } } else ssl->nb_zero = 0; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ; /* in_ctr read from peer, not maintained internally */ } else #endif { unsigned char i; for( i = 8; i > ssl_ep_len( ssl ); i-- ) if( ++ssl->in_ctr[i - 1] != 0 ) break; /* The loop goes to its end iff the counter is wrapping */ if( i == ssl_ep_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "incoming message counter would wrap" ) ); return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) ); return( 0 ); } #undef MAC_NONE #undef MAC_PLAINTEXT #undef MAC_CIPHERTEXT #if defined(MBEDTLS_ZLIB_SUPPORT) /* * Compression/decompression functions */ static int ssl_compress_buf( mbedtls_ssl_context *ssl ) { int ret; unsigned char *msg_post = ssl->out_msg; ptrdiff_t bytes_written = ssl->out_msg - ssl->out_buf; size_t len_pre = ssl->out_msglen; unsigned char *msg_pre = ssl->compress_buf; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> compress buf" ) ); if( len_pre == 0 ) return( 0 ); memcpy( msg_pre, ssl->out_msg, len_pre ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ", ssl->out_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "before compression: output payload", ssl->out_msg, ssl->out_msglen ); ssl->transform_out->ctx_deflate.next_in = msg_pre; ssl->transform_out->ctx_deflate.avail_in = len_pre; ssl->transform_out->ctx_deflate.next_out = msg_post; ssl->transform_out->ctx_deflate.avail_out = MBEDTLS_SSL_OUT_BUFFER_LEN - bytes_written; ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH ); if( ret != Z_OK ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) ); return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); } ssl->out_msglen = MBEDTLS_SSL_OUT_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out - bytes_written; MBEDTLS_SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ", ssl->out_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "after compression: output payload", ssl->out_msg, ssl->out_msglen ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= compress buf" ) ); return( 0 ); } static int ssl_decompress_buf( mbedtls_ssl_context *ssl ) { int ret; unsigned char *msg_post = ssl->in_msg; ptrdiff_t header_bytes = ssl->in_msg - ssl->in_buf; size_t len_pre = ssl->in_msglen; unsigned char *msg_pre = ssl->compress_buf; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) ); if( len_pre == 0 ) return( 0 ); memcpy( msg_pre, ssl->in_msg, len_pre ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ", ssl->in_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "before decompression: input payload", ssl->in_msg, ssl->in_msglen ); ssl->transform_in->ctx_inflate.next_in = msg_pre; ssl->transform_in->ctx_inflate.avail_in = len_pre; ssl->transform_in->ctx_inflate.next_out = msg_post; ssl->transform_in->ctx_inflate.avail_out = MBEDTLS_SSL_IN_BUFFER_LEN - header_bytes; ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH ); if( ret != Z_OK ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) ); return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); } ssl->in_msglen = MBEDTLS_SSL_IN_BUFFER_LEN - ssl->transform_in->ctx_inflate.avail_out - header_bytes; MBEDTLS_SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ", ssl->in_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "after decompression: input payload", ssl->in_msg, ssl->in_msglen ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) ); return( 0 ); } #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) static int ssl_write_hello_request( mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_resend_hello_request( mbedtls_ssl_context *ssl ) { /* If renegotiation is not enforced, retransmit until we would reach max * timeout if we were using the usual handshake doubling scheme */ if( ssl->conf->renego_max_records < 0 ) { uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1; unsigned char doublings = 1; while( ratio != 0 ) { ++doublings; ratio >>= 1; } if( ++ssl->renego_records_seen > doublings ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) ); return( 0 ); } } return( ssl_write_hello_request( ssl ) ); } #endif #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ /* * Fill the input message buffer by appending data to it. * The amount of data already fetched is in ssl->in_left. * * If we return 0, is it guaranteed that (at least) nb_want bytes are * available (from this read and/or a previous one). Otherwise, an error code * is returned (possibly EOF or WANT_READ). * * With stream transport (TLS) on success ssl->in_left == nb_want, but * with datagram transport (DTLS) on success ssl->in_left >= nb_want, * since we always read a whole datagram at once. * * For DTLS, it is up to the caller to set ssl->next_record_offset when * they're done reading a record. */ int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ) { int ret; size_t len; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> fetch input" ) ); if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " "or mbedtls_ssl_set_bio()" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( nb_want > MBEDTLS_SSL_IN_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "requesting more data than fits" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { uint32_t timeout; /* Just to be sure */ if( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use " "mbedtls_ssl_set_timer_cb() for DTLS" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * The point is, we need to always read a full datagram at once, so we * sometimes read more then requested, and handle the additional data. * It could be the rest of the current record (while fetching the * header) and/or some other records in the same datagram. */ /* * Move to the next record in the already read datagram if applicable */ if( ssl->next_record_offset != 0 ) { if( ssl->in_left < ssl->next_record_offset ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->in_left -= ssl->next_record_offset; if( ssl->in_left != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "next record in same datagram, offset: %d", ssl->next_record_offset ) ); memmove( ssl->in_hdr, ssl->in_hdr + ssl->next_record_offset, ssl->in_left ); } ssl->next_record_offset = 0; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", ssl->in_left, nb_want ) ); /* * Done if we already have enough data. */ if( nb_want <= ssl->in_left) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) ); return( 0 ); } /* * A record can't be split accross datagrams. If we need to read but * are not at the beginning of a new record, the caller did something * wrong. */ if( ssl->in_left != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Don't even try to read if time's out already. * This avoids by-passing the timer when repeatedly receiving messages * that will end up being dropped. */ if( ssl_check_timer( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "timer has expired" ) ); ret = MBEDTLS_ERR_SSL_TIMEOUT; } else { len = MBEDTLS_SSL_IN_BUFFER_LEN - ( ssl->in_hdr - ssl->in_buf ); if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) timeout = ssl->handshake->retransmit_timeout; else timeout = ssl->conf->read_timeout; MBEDTLS_SSL_DEBUG_MSG( 3, ( "f_recv_timeout: %u ms", timeout ) ); if( ssl->f_recv_timeout != NULL ) ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr, len, timeout ); else ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr, len ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret ); if( ret == 0 ) return( MBEDTLS_ERR_SSL_CONN_EOF ); } if( ret == MBEDTLS_ERR_SSL_TIMEOUT ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "timeout" ) ); ssl_set_timer( ssl, 0 ); if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { if( ssl_double_retransmit_timeout( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake timeout" ) ); return( MBEDTLS_ERR_SSL_TIMEOUT ); } if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret ); return( ret ); } return( MBEDTLS_ERR_SSL_WANT_READ ); } #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret ); return( ret ); } return( MBEDTLS_ERR_SSL_WANT_READ ); } #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ } if( ret < 0 ) return( ret ); ssl->in_left = ret; } else #endif { MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", ssl->in_left, nb_want ) ); while( ssl->in_left < nb_want ) { len = nb_want - ssl->in_left; if( ssl_check_timer( ssl ) != 0 ) ret = MBEDTLS_ERR_SSL_TIMEOUT; else { if( ssl->f_recv_timeout != NULL ) { ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr + ssl->in_left, len, ssl->conf->read_timeout ); } else { ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr + ssl->in_left, len ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", ssl->in_left, nb_want ) ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret ); if( ret == 0 ) return( MBEDTLS_ERR_SSL_CONN_EOF ); if( ret < 0 ) return( ret ); if ( (size_t)ret > len || ( INT_MAX > SIZE_MAX && ret > SIZE_MAX ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "f_recv returned %d bytes but only %lu were requested", ret, (unsigned long)len ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->in_left += ret; } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) ); return( 0 ); } /* * Flush any data not yet written */ int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ) { int ret; unsigned char *buf; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> flush output" ) ); if( ssl->f_send == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " "or mbedtls_ssl_set_bio()" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* Avoid incrementing counter if data is flushed */ if( ssl->out_left == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) ); return( 0 ); } while( ssl->out_left > 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d", mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) ); buf = ssl->out_hdr - ssl->out_left; ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_send", ret ); if( ret <= 0 ) return( ret ); if( (size_t)ret > ssl->out_left || ( INT_MAX > SIZE_MAX && ret > SIZE_MAX ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "f_send returned %d bytes but only %lu bytes were sent", ret, (unsigned long)ssl->out_left ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->out_left -= ret; } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->out_hdr = ssl->out_buf; } else #endif { ssl->out_hdr = ssl->out_buf + 8; } ssl_update_out_pointers( ssl, ssl->transform_out ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) ); return( 0 ); } /* * Functions to handle the DTLS retransmission state machine */ #if defined(MBEDTLS_SSL_PROTO_DTLS) /* * Append current handshake message to current outgoing flight */ static int ssl_flight_append( mbedtls_ssl_context *ssl ) { mbedtls_ssl_flight_item *msg; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_flight_append" ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "message appended to flight", ssl->out_msg, ssl->out_msglen ); /* Allocate space for current message */ if( ( msg = mbedtls_calloc( 1, sizeof( mbedtls_ssl_flight_item ) ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", sizeof( mbedtls_ssl_flight_item ) ) ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } if( ( msg->p = mbedtls_calloc( 1, ssl->out_msglen ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", ssl->out_msglen ) ); mbedtls_free( msg ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } /* Copy current handshake message with headers */ memcpy( msg->p, ssl->out_msg, ssl->out_msglen ); msg->len = ssl->out_msglen; msg->type = ssl->out_msgtype; msg->next = NULL; /* Append to the current flight */ if( ssl->handshake->flight == NULL ) ssl->handshake->flight = msg; else { mbedtls_ssl_flight_item *cur = ssl->handshake->flight; while( cur->next != NULL ) cur = cur->next; cur->next = msg; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_flight_append" ) ); return( 0 ); } /* * Free the current flight of handshake messages */ static void ssl_flight_free( mbedtls_ssl_flight_item *flight ) { mbedtls_ssl_flight_item *cur = flight; mbedtls_ssl_flight_item *next; while( cur != NULL ) { next = cur->next; mbedtls_free( cur->p ); mbedtls_free( cur ); cur = next; } } #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl ); #endif /* * Swap transform_out and out_ctr with the alternative ones */ static void ssl_swap_epochs( mbedtls_ssl_context *ssl ) { mbedtls_ssl_transform *tmp_transform; unsigned char tmp_out_ctr[8]; if( ssl->transform_out == ssl->handshake->alt_transform_out ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip swap epochs" ) ); return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "swap epochs" ) ); /* Swap transforms */ tmp_transform = ssl->transform_out; ssl->transform_out = ssl->handshake->alt_transform_out; ssl->handshake->alt_transform_out = tmp_transform; /* Swap epoch + sequence_number */ memcpy( tmp_out_ctr, ssl->cur_out_ctr, 8 ); memcpy( ssl->cur_out_ctr, ssl->handshake->alt_out_ctr, 8 ); memcpy( ssl->handshake->alt_out_ctr, tmp_out_ctr, 8 ); /* Adjust to the newly activated transform */ ssl_update_out_pointers( ssl, ssl->transform_out ); #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_activate != NULL ) { if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif } /* * Retransmit the current flight of messages. */ int mbedtls_ssl_resend( mbedtls_ssl_context *ssl ) { int ret = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_resend" ) ); ret = mbedtls_ssl_flight_transmit( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_resend" ) ); return( ret ); } /* * Transmit or retransmit the current flight of messages. * * Need to remember the current message in case flush_output returns * WANT_WRITE, causing us to exit this function and come back later. * This function must be called until state is no longer SENDING. */ int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_flight_transmit" ) ); if( ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialise flight transmission" ) ); ssl->handshake->cur_msg = ssl->handshake->flight; ssl->handshake->cur_msg_p = ssl->handshake->flight->p + 12; ssl_swap_epochs( ssl ); ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING; } while( ssl->handshake->cur_msg != NULL ) { size_t max_frag_len; const mbedtls_ssl_flight_item * const cur = ssl->handshake->cur_msg; int const is_finished = ( cur->type == MBEDTLS_SSL_MSG_HANDSHAKE && cur->p[0] == MBEDTLS_SSL_HS_FINISHED ); uint8_t const force_flush = ssl->disable_datagram_packing == 1 ? SSL_FORCE_FLUSH : SSL_DONT_FORCE_FLUSH; /* Swap epochs before sending Finished: we can't do it after * sending ChangeCipherSpec, in case write returns WANT_READ. * Must be done before copying, may change out_msg pointer */ if( is_finished && ssl->handshake->cur_msg_p == ( cur->p + 12 ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "swap epochs to send finished message" ) ); ssl_swap_epochs( ssl ); } ret = ssl_get_remaining_payload_in_datagram( ssl ); if( ret < 0 ) return( ret ); max_frag_len = (size_t) ret; /* CCS is copied as is, while HS messages may need fragmentation */ if( cur->type == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { if( max_frag_len == 0 ) { if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); continue; } memcpy( ssl->out_msg, cur->p, cur->len ); ssl->out_msglen = cur->len; ssl->out_msgtype = cur->type; /* Update position inside current message */ ssl->handshake->cur_msg_p += cur->len; } else { const unsigned char * const p = ssl->handshake->cur_msg_p; const size_t hs_len = cur->len - 12; const size_t frag_off = p - ( cur->p + 12 ); const size_t rem_len = hs_len - frag_off; size_t cur_hs_frag_len, max_hs_frag_len; if( ( max_frag_len < 12 ) || ( max_frag_len == 12 && hs_len != 0 ) ) { if( is_finished ) ssl_swap_epochs( ssl ); if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); continue; } max_hs_frag_len = max_frag_len - 12; cur_hs_frag_len = rem_len > max_hs_frag_len ? max_hs_frag_len : rem_len; if( frag_off == 0 && cur_hs_frag_len != hs_len ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "fragmenting handshake message (%u > %u)", (unsigned) cur_hs_frag_len, (unsigned) max_hs_frag_len ) ); } /* Messages are stored with handshake headers as if not fragmented, * copy beginning of headers then fill fragmentation fields. * Handshake headers: type(1) len(3) seq(2) f_off(3) f_len(3) */ memcpy( ssl->out_msg, cur->p, 6 ); ssl->out_msg[6] = ( ( frag_off >> 16 ) & 0xff ); ssl->out_msg[7] = ( ( frag_off >> 8 ) & 0xff ); ssl->out_msg[8] = ( ( frag_off ) & 0xff ); ssl->out_msg[ 9] = ( ( cur_hs_frag_len >> 16 ) & 0xff ); ssl->out_msg[10] = ( ( cur_hs_frag_len >> 8 ) & 0xff ); ssl->out_msg[11] = ( ( cur_hs_frag_len ) & 0xff ); MBEDTLS_SSL_DEBUG_BUF( 3, "handshake header", ssl->out_msg, 12 ); /* Copy the handshake message content and set records fields */ memcpy( ssl->out_msg + 12, p, cur_hs_frag_len ); ssl->out_msglen = cur_hs_frag_len + 12; ssl->out_msgtype = cur->type; /* Update position inside current message */ ssl->handshake->cur_msg_p += cur_hs_frag_len; } /* If done with the current message move to the next one if any */ if( ssl->handshake->cur_msg_p >= cur->p + cur->len ) { if( cur->next != NULL ) { ssl->handshake->cur_msg = cur->next; ssl->handshake->cur_msg_p = cur->next->p + 12; } else { ssl->handshake->cur_msg = NULL; ssl->handshake->cur_msg_p = NULL; } } /* Actually send the message out */ if( ( ret = mbedtls_ssl_write_record( ssl, force_flush ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); return( ret ); } } if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); /* Update state and set timer */ if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; else { ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; ssl_set_timer( ssl, ssl->handshake->retransmit_timeout ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_flight_transmit" ) ); return( 0 ); } /* * To be called when the last message of an incoming flight is received. */ void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl ) { /* We won't need to resend that one any more */ ssl_flight_free( ssl->handshake->flight ); ssl->handshake->flight = NULL; ssl->handshake->cur_msg = NULL; /* The next incoming flight will start with this msg_seq */ ssl->handshake->in_flight_start_seq = ssl->handshake->in_msg_seq; /* We don't want to remember CCS's across flight boundaries. */ ssl->handshake->buffering.seen_ccs = 0; /* Clear future message buffering structure. */ ssl_buffering_free( ssl ); /* Cancel timer */ ssl_set_timer( ssl, 0 ); if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED ) { ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; } else ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; } /* * To be called when the last message of an outgoing flight is send. */ void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl ) { ssl_reset_retransmit_timeout( ssl ); ssl_set_timer( ssl, ssl->handshake->retransmit_timeout ); if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED ) { ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; } else ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Handshake layer functions */ /* * Write (DTLS: or queue) current handshake (including CCS) message. * * - fill in handshake headers * - update handshake checksum * - DTLS: save message for resending * - then pass to the record layer * * DTLS: except for HelloRequest, messages are only queued, and will only be * actually sent when calling flight_transmit() or resend(). * * Inputs: * - ssl->out_msglen: 4 + actual handshake message len * (4 is the size of handshake headers for TLS) * - ssl->out_msg[0]: the handshake type (ClientHello, ServerHello, etc) * - ssl->out_msg + 4: the handshake message body * * Outputs, ie state before passing to flight_append() or write_record(): * - ssl->out_msglen: the length of the record contents * (including handshake headers but excluding record headers) * - ssl->out_msg: the record contents (handshake headers + content) */ int mbedtls_ssl_write_handshake_msg( mbedtls_ssl_context *ssl ) { int ret; const size_t hs_len = ssl->out_msglen - 4; const unsigned char hs_type = ssl->out_msg[0]; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write handshake message" ) ); /* * Sanity checks */ if( ssl->out_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE && ssl->out_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { /* In SSLv3, the client might send a NoCertificate alert. */ #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C) if( ! ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && ssl->out_msgtype == MBEDTLS_SSL_MSG_ALERT && ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ) #endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } /* Whenever we send anything different from a * HelloRequest we should be in a handshake - double check. */ if( ! ( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST ) && ssl->handshake == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake != NULL && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #endif /* Double-check that we did not exceed the bounds * of the outgoing record buffer. * This should never fail as the various message * writing functions must obey the bounds of the * outgoing record buffer, but better be safe. * * Note: We deliberately do not check for the MTU or MFL here. */ if( ssl->out_msglen > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Record too large: " "size %u, maximum %u", (unsigned) ssl->out_msglen, (unsigned) MBEDTLS_SSL_OUT_CONTENT_LEN ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Fill handshake headers */ if( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) { ssl->out_msg[1] = (unsigned char)( hs_len >> 16 ); ssl->out_msg[2] = (unsigned char)( hs_len >> 8 ); ssl->out_msg[3] = (unsigned char)( hs_len ); /* * DTLS has additional fields in the Handshake layer, * between the length field and the actual payload: * uint16 message_seq; * uint24 fragment_offset; * uint24 fragment_length; */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { /* Make room for the additional DTLS fields */ if( MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen < 8 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS handshake message too large: " "size %u, maximum %u", (unsigned) ( hs_len ), (unsigned) ( MBEDTLS_SSL_OUT_CONTENT_LEN - 12 ) ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } memmove( ssl->out_msg + 12, ssl->out_msg + 4, hs_len ); ssl->out_msglen += 8; /* Write message_seq and update it, except for HelloRequest */ if( hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST ) { ssl->out_msg[4] = ( ssl->handshake->out_msg_seq >> 8 ) & 0xFF; ssl->out_msg[5] = ( ssl->handshake->out_msg_seq ) & 0xFF; ++( ssl->handshake->out_msg_seq ); } else { ssl->out_msg[4] = 0; ssl->out_msg[5] = 0; } /* Handshake hashes are computed without fragmentation, * so set frag_offset = 0 and frag_len = hs_len for now */ memset( ssl->out_msg + 6, 0x00, 3 ); memcpy( ssl->out_msg + 9, ssl->out_msg + 1, 3 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* Update running hashes of handshake messages seen */ if( hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST ) ssl->handshake->update_checksum( ssl, ssl->out_msg, ssl->out_msglen ); } /* Either send now, or just save to be sent (and resent) later */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ! ( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST ) ) { if( ( ret = ssl_flight_append( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_flight_append", ret ); return( ret ); } } else #endif { if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_record", ret ); return( ret ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write handshake message" ) ); return( 0 ); } /* * Record layer functions */ /* * Write current record. * * Uses: * - ssl->out_msgtype: type of the message (AppData, Handshake, Alert, CCS) * - ssl->out_msglen: length of the record content (excl headers) * - ssl->out_msg: record content */ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush ) { int ret, done = 0; size_t len = ssl->out_msglen; uint8_t flush = force_flush; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write record" ) ); #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->transform_out != NULL && ssl->session_out->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) { if( ( ret = ssl_compress_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compress_buf", ret ); return( ret ); } len = ssl->out_msglen; } #endif /*MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_write != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_write()" ) ); ret = mbedtls_ssl_hw_record_write( ssl ); if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_write", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } if( ret == 0 ) done = 1; } #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ if( !done ) { unsigned i; size_t protected_record_size; ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, ssl->out_hdr + 1 ); memcpy( ssl->out_ctr, ssl->cur_out_ctr, 8 ); ssl->out_len[0] = (unsigned char)( len >> 8 ); ssl->out_len[1] = (unsigned char)( len ); if( ssl->transform_out != NULL ) { if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret ); return( ret ); } len = ssl->out_msglen; ssl->out_len[0] = (unsigned char)( len >> 8 ); ssl->out_len[1] = (unsigned char)( len ); } protected_record_size = len + mbedtls_ssl_hdr_len( ssl ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /* In case of DTLS, double-check that we don't exceed * the remaining space in the datagram. */ if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ret = ssl_get_remaining_space_in_datagram( ssl ); if( ret < 0 ) return( ret ); if( protected_record_size > (size_t) ret ) { /* Should never happen */ return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, " "version = [%d:%d], msglen = %d", ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2], len ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "output record sent to network", ssl->out_hdr, protected_record_size ); ssl->out_left += protected_record_size; ssl->out_hdr += protected_record_size; ssl_update_out_pointers( ssl, ssl->transform_out ); for( i = 8; i > ssl_ep_len( ssl ); i-- ) if( ++ssl->cur_out_ctr[i - 1] != 0 ) break; /* The loop goes to its end iff the counter is wrapping */ if( i == ssl_ep_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "outgoing message counter would wrap" ) ); return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && flush == SSL_DONT_FORCE_FLUSH ) { size_t remaining; ret = ssl_get_remaining_payload_in_datagram( ssl ); if( ret < 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_remaining_payload_in_datagram", ret ); return( ret ); } remaining = (size_t) ret; if( remaining == 0 ) { flush = SSL_FORCE_FLUSH; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Still %u bytes available in current datagram", (unsigned) remaining ) ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ if( ( flush == SSL_FORCE_FLUSH ) && ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write record" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_hs_is_proper_fragment( mbedtls_ssl_context *ssl ) { if( ssl->in_msglen < ssl->in_hslen || memcmp( ssl->in_msg + 6, "\0\0\0", 3 ) != 0 || memcmp( ssl->in_msg + 9, ssl->in_msg + 1, 3 ) != 0 ) { return( 1 ); } return( 0 ); } static uint32_t ssl_get_hs_frag_len( mbedtls_ssl_context const *ssl ) { return( ( ssl->in_msg[9] << 16 ) | ( ssl->in_msg[10] << 8 ) | ssl->in_msg[11] ); } static uint32_t ssl_get_hs_frag_off( mbedtls_ssl_context const *ssl ) { return( ( ssl->in_msg[6] << 16 ) | ( ssl->in_msg[7] << 8 ) | ssl->in_msg[8] ); } static int ssl_check_hs_header( mbedtls_ssl_context const *ssl ) { uint32_t msg_len, frag_off, frag_len; msg_len = ssl_get_hs_total_len( ssl ); frag_off = ssl_get_hs_frag_off( ssl ); frag_len = ssl_get_hs_frag_len( ssl ); if( frag_off > msg_len ) return( -1 ); if( frag_len > msg_len - frag_off ) return( -1 ); if( frag_len + 12 > ssl->in_msglen ) return( -1 ); return( 0 ); } /* * Mark bits in bitmask (used for DTLS HS reassembly) */ static void ssl_bitmask_set( unsigned char *mask, size_t offset, size_t len ) { unsigned int start_bits, end_bits; start_bits = 8 - ( offset % 8 ); if( start_bits != 8 ) { size_t first_byte_idx = offset / 8; /* Special case */ if( len <= start_bits ) { for( ; len != 0; len-- ) mask[first_byte_idx] |= 1 << ( start_bits - len ); /* Avoid potential issues with offset or len becoming invalid */ return; } offset += start_bits; /* Now offset % 8 == 0 */ len -= start_bits; for( ; start_bits != 0; start_bits-- ) mask[first_byte_idx] |= 1 << ( start_bits - 1 ); } end_bits = len % 8; if( end_bits != 0 ) { size_t last_byte_idx = ( offset + len ) / 8; len -= end_bits; /* Now len % 8 == 0 */ for( ; end_bits != 0; end_bits-- ) mask[last_byte_idx] |= 1 << ( 8 - end_bits ); } memset( mask + offset / 8, 0xFF, len / 8 ); } /* * Check that bitmask is full */ static int ssl_bitmask_check( unsigned char *mask, size_t len ) { size_t i; for( i = 0; i < len / 8; i++ ) if( mask[i] != 0xFF ) return( -1 ); for( i = 0; i < len % 8; i++ ) if( ( mask[len / 8] & ( 1 << ( 7 - i ) ) ) == 0 ) return( -1 ); return( 0 ); } /* msg_len does not include the handshake header */ static size_t ssl_get_reassembly_buffer_size( size_t msg_len, unsigned add_bitmap ) { size_t alloc_len; alloc_len = 12; /* Handshake header */ alloc_len += msg_len; /* Content buffer */ if( add_bitmap ) alloc_len += msg_len / 8 + ( msg_len % 8 != 0 ); /* Bitmap */ return( alloc_len ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static uint32_t ssl_get_hs_total_len( mbedtls_ssl_context const *ssl ) { return( ( ssl->in_msg[1] << 16 ) | ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3] ); } int mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl ) { if( ssl->in_msglen < mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake message too short: %d", ssl->in_msglen ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } ssl->in_hslen = mbedtls_ssl_hs_hdr_len( ssl ) + ssl_get_hs_total_len( ssl ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "handshake message: msglen =" " %d, type = %d, hslen = %d", ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { int ret; unsigned int recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; if( ssl_check_hs_header( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid handshake header" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } if( ssl->handshake != NULL && ( ( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && recv_msg_seq != ssl->handshake->in_msg_seq ) || ( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER && ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) ) ) { if( recv_msg_seq > ssl->handshake->in_msg_seq ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received future handshake message of sequence number %u (next %u)", recv_msg_seq, ssl->handshake->in_msg_seq ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } /* Retransmit only on last message from previous flight, to avoid * too many retransmissions. * Besides, No sane server ever retransmits HelloVerifyRequest */ if( recv_msg_seq == ssl->handshake->in_flight_start_seq - 1 && ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received message from last flight, " "message_seq = %d, start_of_flight = %d", recv_msg_seq, ssl->handshake->in_flight_start_seq ) ); if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret ); return( ret ); } } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "dropping out-of-sequence message: " "message_seq = %d, expected = %d", recv_msg_seq, ssl->handshake->in_msg_seq ) ); } return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ); } /* Wait until message completion to increment in_msg_seq */ /* Message reassembly is handled alongside buffering of future * messages; the commonality is that both handshake fragments and * future messages cannot be forwarded immediately to the * handshake logic layer. */ if( ssl_hs_is_proper_fragment( ssl ) == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "found fragmented DTLS handshake message" ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* With TLS we don't handle fragmentation (for now) */ if( ssl->in_msglen < ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS handshake fragmentation not supported" ) ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } return( 0 ); } void mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && hs != NULL ) { ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen ); } /* Handshake message is complete, increment counter */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake != NULL ) { unsigned offset; mbedtls_ssl_hs_buffer *hs_buf; /* Increment handshake sequence number */ hs->in_msg_seq++; /* * Clear up handshake buffering and reassembly structure. */ /* Free first entry */ ssl_buffering_free_slot( ssl, 0 ); /* Shift all other entries */ for( offset = 0, hs_buf = &hs->buffering.hs[0]; offset + 1 < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++, hs_buf++ ) { *hs_buf = *(hs_buf + 1); } /* Create a fresh last entry */ memset( hs_buf, 0, sizeof( mbedtls_ssl_hs_buffer ) ); } #endif } /* * DTLS anti-replay: RFC 6347 4.1.2.6 * * in_window is a field of bits numbered from 0 (lsb) to 63 (msb). * Bit n is set iff record number in_window_top - n has been seen. * * Usually, in_window_top is the last record number seen and the lsb of * in_window is set. The only exception is the initial state (record number 0 * not seen yet). */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl ) { ssl->in_window_top = 0; ssl->in_window = 0; } static inline uint64_t ssl_load_six_bytes( unsigned char *buf ) { return( ( (uint64_t) buf[0] << 40 ) | ( (uint64_t) buf[1] << 32 ) | ( (uint64_t) buf[2] << 24 ) | ( (uint64_t) buf[3] << 16 ) | ( (uint64_t) buf[4] << 8 ) | ( (uint64_t) buf[5] ) ); } /* * Return 0 if sequence number is acceptable, -1 otherwise */ int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl ) { uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 ); uint64_t bit; if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED ) return( 0 ); if( rec_seqnum > ssl->in_window_top ) return( 0 ); bit = ssl->in_window_top - rec_seqnum; if( bit >= 64 ) return( -1 ); if( ( ssl->in_window & ( (uint64_t) 1 << bit ) ) != 0 ) return( -1 ); return( 0 ); } /* * Update replay window on new validated record */ void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl ) { uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 ); if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED ) return; if( rec_seqnum > ssl->in_window_top ) { /* Update window_top and the contents of the window */ uint64_t shift = rec_seqnum - ssl->in_window_top; if( shift >= 64 ) ssl->in_window = 1; else { ssl->in_window <<= shift; ssl->in_window |= 1; } ssl->in_window_top = rec_seqnum; } else { /* Mark that number as seen in the current window */ uint64_t bit = ssl->in_window_top - rec_seqnum; if( bit < 64 ) /* Always true, but be extra sure */ ssl->in_window |= (uint64_t) 1 << bit; } } #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) /* Forward declaration */ static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ); /* * Without any SSL context, check if a datagram looks like a ClientHello with * a valid cookie, and if it doesn't, generate a HelloVerifyRequest message. * Both input and output include full DTLS headers. * * - if cookie is valid, return 0 * - if ClientHello looks superficially valid but cookie is not, * fill obuf and set olen, then * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED * - otherwise return a specific error code */ static int ssl_check_dtls_clihlo_cookie( mbedtls_ssl_cookie_write_t *f_cookie_write, mbedtls_ssl_cookie_check_t *f_cookie_check, void *p_cookie, const unsigned char *cli_id, size_t cli_id_len, const unsigned char *in, size_t in_len, unsigned char *obuf, size_t buf_len, size_t *olen ) { size_t sid_len, cookie_len; unsigned char *p; if( f_cookie_write == NULL || f_cookie_check == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* * Structure of ClientHello with record and handshake headers, * and expected values. We don't need to check a lot, more checks will be * done when actually parsing the ClientHello - skipping those checks * avoids code duplication and does not make cookie forging any easier. * * 0-0 ContentType type; copied, must be handshake * 1-2 ProtocolVersion version; copied * 3-4 uint16 epoch; copied, must be 0 * 5-10 uint48 sequence_number; copied * 11-12 uint16 length; (ignored) * * 13-13 HandshakeType msg_type; (ignored) * 14-16 uint24 length; (ignored) * 17-18 uint16 message_seq; copied * 19-21 uint24 fragment_offset; copied, must be 0 * 22-24 uint24 fragment_length; (ignored) * * 25-26 ProtocolVersion client_version; (ignored) * 27-58 Random random; (ignored) * 59-xx SessionID session_id; 1 byte len + sid_len content * 60+ opaque cookie<0..2^8-1>; 1 byte len + content * ... * * Minimum length is 61 bytes. */ if( in_len < 61 || in[0] != MBEDTLS_SSL_MSG_HANDSHAKE || in[3] != 0 || in[4] != 0 || in[19] != 0 || in[20] != 0 || in[21] != 0 ) { return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } sid_len = in[59]; if( sid_len > in_len - 61 ) return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); cookie_len = in[60 + sid_len]; if( cookie_len > in_len - 60 ) return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); if( f_cookie_check( p_cookie, in + sid_len + 61, cookie_len, cli_id, cli_id_len ) == 0 ) { /* Valid cookie */ return( 0 ); } /* * If we get here, we've got an invalid cookie, let's prepare HVR. * * 0-0 ContentType type; copied * 1-2 ProtocolVersion version; copied * 3-4 uint16 epoch; copied * 5-10 uint48 sequence_number; copied * 11-12 uint16 length; olen - 13 * * 13-13 HandshakeType msg_type; hello_verify_request * 14-16 uint24 length; olen - 25 * 17-18 uint16 message_seq; copied * 19-21 uint24 fragment_offset; copied * 22-24 uint24 fragment_length; olen - 25 * * 25-26 ProtocolVersion server_version; 0xfe 0xff * 27-27 opaque cookie<0..2^8-1>; cookie_len = olen - 27, cookie * * Minimum length is 28. */ if( buf_len < 28 ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); /* Copy most fields and adapt others */ memcpy( obuf, in, 25 ); obuf[13] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; obuf[25] = 0xfe; obuf[26] = 0xff; /* Generate and write actual cookie */ p = obuf + 28; if( f_cookie_write( p_cookie, &p, obuf + buf_len, cli_id, cli_id_len ) != 0 ) { return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } *olen = p - obuf; /* Go back and fill length fields */ obuf[27] = (unsigned char)( *olen - 28 ); obuf[14] = obuf[22] = (unsigned char)( ( *olen - 25 ) >> 16 ); obuf[15] = obuf[23] = (unsigned char)( ( *olen - 25 ) >> 8 ); obuf[16] = obuf[24] = (unsigned char)( ( *olen - 25 ) ); obuf[11] = (unsigned char)( ( *olen - 13 ) >> 8 ); obuf[12] = (unsigned char)( ( *olen - 13 ) ); return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); } /* * Handle possible client reconnect with the same UDP quadruplet * (RFC 6347 Section 4.2.8). * * Called by ssl_parse_record_header() in case we receive an epoch 0 record * that looks like a ClientHello. * * - if the input looks like a ClientHello without cookies, * send back HelloVerifyRequest, then * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED * - if the input looks like a ClientHello with a valid cookie, * reset the session of the current context, and * return MBEDTLS_ERR_SSL_CLIENT_RECONNECT * - if anything goes wrong, return a specific error code * * mbedtls_ssl_read_record() will ignore the record if anything else than * MBEDTLS_ERR_SSL_CLIENT_RECONNECT or 0 is returned, although this function * cannot not return 0. */ static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl ) { int ret; size_t len; ret = ssl_check_dtls_clihlo_cookie( ssl->conf->f_cookie_write, ssl->conf->f_cookie_check, ssl->conf->p_cookie, ssl->cli_id, ssl->cli_id_len, ssl->in_buf, ssl->in_left, ssl->out_buf, MBEDTLS_SSL_OUT_CONTENT_LEN, &len ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl_check_dtls_clihlo_cookie", ret ); if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ) { /* Don't check write errors as we can't do anything here. * If the error is permanent we'll catch it later, * if it's not, then hopefully it'll work next time. */ (void) ssl->f_send( ssl->p_bio, ssl->out_buf, len ); return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); } if( ret == 0 ) { /* Got a valid cookie, partially reset context */ if( ( ret = ssl_session_reset_int( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "reset", ret ); return( ret ); } return( MBEDTLS_ERR_SSL_CLIENT_RECONNECT ); } return( ret ); } #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ /* * ContentType type; * ProtocolVersion version; * uint16 epoch; // DTLS only * uint48 sequence_number; // DTLS only * uint16 length; * * Return 0 if header looks sane (and, for DTLS, the record is expected) * MBEDTLS_ERR_SSL_INVALID_RECORD if the header looks bad, * MBEDTLS_ERR_SSL_UNEXPECTED_RECORD (DTLS only) if sane but unexpected. * * With DTLS, mbedtls_ssl_read_record() will: * 1. proceed with the record if this function returns 0 * 2. drop only the current record if this function returns UNEXPECTED_RECORD * 3. return CLIENT_RECONNECT if this function return that value * 4. drop the whole datagram if this function returns anything else. * Point 2 is needed when the peer is resending, and we have already received * the first record from a datagram but are still waiting for the others. */ static int ssl_parse_record_header( mbedtls_ssl_context *ssl ) { int major_ver, minor_ver; MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) ); ssl->in_msgtype = ssl->in_hdr[0]; ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1]; mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, ssl->in_hdr + 1 ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, " "version = [%d:%d], msglen = %d", ssl->in_msgtype, major_ver, minor_ver, ssl->in_msglen ) ); /* Check record type */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msgtype != MBEDTLS_SSL_MSG_ALERT && ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC && ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "unknown record type" ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /* Silently ignore invalid DTLS records as recommended by RFC 6347 * Section 4.1.2.7 */ if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) #endif /* MBEDTLS_SSL_PROTO_DTLS */ mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } /* Check version */ if( major_ver != ssl->major_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "major version mismatch" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } if( minor_ver > ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } /* Check length against the size of our buffer */ if( ssl->in_msglen > MBEDTLS_SSL_IN_BUFFER_LEN - (size_t)( ssl->in_msg - ssl->in_buf ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } /* * DTLS-related tests. * Check epoch before checking length constraint because * the latter varies with the epoch. E.g., if a ChangeCipherSpec * message gets duplicated before the corresponding Finished message, * the second ChangeCipherSpec should be discarded because it belongs * to an old epoch, but not because its length is shorter than * the minimum record length for packets using the new record transform. * Note that these two kinds of failures are handled differently, * as an unexpected record is silently skipped but an invalid * record leads to the entire datagram being dropped. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { unsigned int rec_epoch = ( ssl->in_ctr[0] << 8 ) | ssl->in_ctr[1]; /* Check epoch (and sequence number) with DTLS */ if( rec_epoch != ssl->in_epoch ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "record from another epoch: " "expected %d, received %d", ssl->in_epoch, rec_epoch ) ); #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) /* * Check for an epoch 0 ClientHello. We can't use in_msg here to * access the first byte of record content (handshake type), as we * have an active transform (possibly iv_len != 0), so use the * fact that the record header len is 13 instead. */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER && rec_epoch == 0 && ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_left > 13 && ssl->in_buf[13] == MBEDTLS_SSL_HS_CLIENT_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "possible client reconnect " "from the same port" ) ); return( ssl_handle_possible_reconnect( ssl ) ); } else #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ { /* Consider buffering the record. */ if( rec_epoch == (unsigned int) ssl->in_epoch + 1 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Consider record for buffering" ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } } #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) /* Replay detection only works for the current epoch */ if( rec_epoch == ssl->in_epoch && mbedtls_ssl_dtls_replay_check( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } #endif /* Drop unexpected ApplicationData records, * except at the beginning of renegotiations */ if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA && ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER #if defined(MBEDTLS_SSL_RENEGOTIATION) && ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->state == MBEDTLS_SSL_SERVER_HELLO ) #endif ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ApplicationData" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* Check length against bounds of the current transform and version */ if( ssl->transform_in == NULL ) { if( ssl->in_msglen < 1 || ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } } else { if( ssl->in_msglen < ssl->transform_in->minlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * TLS encrypted messages can have up to 256 bytes of padding */ if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 && ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_IN_CONTENT_LEN + 256 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #endif } return( 0 ); } /* * If applicable, decrypt (and decompress) record content */ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl ) { int ret, done = 0; MBEDTLS_SSL_DEBUG_BUF( 4, "input record from network", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ); #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_read != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_read()" ) ); ret = mbedtls_ssl_hw_record_read( ssl ); if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_read", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } if( ret == 0 ) done = 1; } #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ if( !done && ssl->transform_in != NULL ) { if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_BUF( 4, "input payload after decrypt", ssl->in_msg, ssl->in_msglen ); if( ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } } #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->transform_in != NULL && ssl->session_in->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) { if( ( ret = ssl_decompress_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret ); return( ret ); } } #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { mbedtls_ssl_dtls_replay_update( ssl ); } #endif return( 0 ); } static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl ); /* * Read a record. * * Silently ignore non-fatal alert (and for DTLS, invalid records as well, * RFC 6347 4.1.2.7) and continue reading until a valid record is found. * */ /* Helper functions for mbedtls_ssl_read_record(). */ static int ssl_consume_current_message( mbedtls_ssl_context *ssl ); static int ssl_get_next_record( mbedtls_ssl_context *ssl ); static int ssl_record_is_in_progress( mbedtls_ssl_context *ssl ); int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl, unsigned update_hs_digest ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read record" ) ); if( ssl->keep_current_message == 0 ) { do { ret = ssl_consume_current_message( ssl ); if( ret != 0 ) return( ret ); if( ssl_record_is_in_progress( ssl ) == 0 ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) int have_buffered = 0; /* We only check for buffered messages if the * current datagram is fully consumed. */ if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl_next_record_is_in_datagram( ssl ) == 0 ) { if( ssl_load_buffered_message( ssl ) == 0 ) have_buffered = 1; } if( have_buffered == 0 ) #endif /* MBEDTLS_SSL_PROTO_DTLS */ { ret = ssl_get_next_record( ssl ); if( ret == MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ) continue; if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_get_next_record" ), ret ); return( ret ); } } } ret = mbedtls_ssl_handle_message_type( ssl ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE ) { /* Buffer future message */ ret = ssl_buffer_message( ssl ); if( ret != 0 ) return( ret ); ret = MBEDTLS_ERR_SSL_CONTINUE_PROCESSING; } #endif /* MBEDTLS_SSL_PROTO_DTLS */ } while( MBEDTLS_ERR_SSL_NON_FATAL == ret || MBEDTLS_ERR_SSL_CONTINUE_PROCESSING == ret ); if( 0 != ret ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_handle_message_type" ), ret ); return( ret ); } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && update_hs_digest == 1 ) { mbedtls_ssl_update_handshake_status( ssl ); } } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "reuse previously read message" ) ); ssl->keep_current_message = 0; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read record" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_next_record_is_in_datagram( mbedtls_ssl_context *ssl ) { if( ssl->in_left > ssl->next_record_offset ) return( 1 ); return( 0 ); } static int ssl_load_buffered_message( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; mbedtls_ssl_hs_buffer * hs_buf; int ret = 0; if( hs == NULL ) return( -1 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_messsage" ) ); if( ssl->state == MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC || ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ) { /* Check if we have seen a ChangeCipherSpec before. * If yes, synthesize a CCS record. */ if( !hs->buffering.seen_ccs ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "CCS not seen in the current flight" ) ); ret = -1; goto exit; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Injecting buffered CCS message" ) ); ssl->in_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC; ssl->in_msglen = 1; ssl->in_msg[0] = 1; /* As long as they are equal, the exact value doesn't matter. */ ssl->in_left = 0; ssl->next_record_offset = 0; hs->buffering.seen_ccs = 0; goto exit; } #if defined(MBEDTLS_DEBUG_C) /* Debug only */ { unsigned offset; for( offset = 1; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++ ) { hs_buf = &hs->buffering.hs[offset]; if( hs_buf->is_valid == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Future message with sequence number %u %s buffered.", hs->in_msg_seq + offset, hs_buf->is_complete ? "fully" : "partially" ) ); } } } #endif /* MBEDTLS_DEBUG_C */ /* Check if we have buffered and/or fully reassembled the * next handshake message. */ hs_buf = &hs->buffering.hs[0]; if( ( hs_buf->is_valid == 1 ) && ( hs_buf->is_complete == 1 ) ) { /* Synthesize a record containing the buffered HS message. */ size_t msg_len = ( hs_buf->data[1] << 16 ) | ( hs_buf->data[2] << 8 ) | hs_buf->data[3]; /* Double-check that we haven't accidentally buffered * a message that doesn't fit into the input buffer. */ if( msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Next handshake message has been buffered - load" ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "Buffered handshake message (incl. header)", hs_buf->data, msg_len + 12 ); ssl->in_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->in_hslen = msg_len + 12; ssl->in_msglen = msg_len + 12; memcpy( ssl->in_msg, hs_buf->data, ssl->in_hslen ); ret = 0; goto exit; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Next handshake message %u not or only partially bufffered", hs->in_msg_seq ) ); } ret = -1; exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_load_buffered_message" ) ); return( ret ); } static int ssl_buffer_make_space( mbedtls_ssl_context *ssl, size_t desired ) { int offset; mbedtls_ssl_handshake_params * const hs = ssl->handshake; MBEDTLS_SSL_DEBUG_MSG( 2, ( "Attempt to free buffered messages to have %u bytes available", (unsigned) desired ) ); /* Get rid of future records epoch first, if such exist. */ ssl_free_buffered_record( ssl ); /* Check if we have enough space available now. */ if( desired <= ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Enough space available after freeing future epoch record" ) ); return( 0 ); } /* We don't have enough space to buffer the next expected handshake * message. Remove buffers used for future messages to gain space, * starting with the most distant one. */ for( offset = MBEDTLS_SSL_MAX_BUFFERED_HS - 1; offset >= 0; offset-- ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Free buffering slot %d to make space for reassembly of next handshake message", offset ) ); ssl_buffering_free_slot( ssl, (uint8_t) offset ); /* Check if we have enough space available now. */ if( desired <= ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Enough space available after freeing buffered HS messages" ) ); return( 0 ); } } return( -1 ); } static int ssl_buffer_message( mbedtls_ssl_context *ssl ) { int ret = 0; mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( hs == NULL ) return( 0 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_buffer_message" ) ); switch( ssl->in_msgtype ) { case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC: MBEDTLS_SSL_DEBUG_MSG( 2, ( "Remember CCS message" ) ); hs->buffering.seen_ccs = 1; break; case MBEDTLS_SSL_MSG_HANDSHAKE: { unsigned recv_msg_seq_offset; unsigned recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; mbedtls_ssl_hs_buffer *hs_buf; size_t msg_len = ssl->in_hslen - 12; /* We should never receive an old handshake * message - double-check nonetheless. */ if( recv_msg_seq < ssl->handshake->in_msg_seq ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } recv_msg_seq_offset = recv_msg_seq - ssl->handshake->in_msg_seq; if( recv_msg_seq_offset >= MBEDTLS_SSL_MAX_BUFFERED_HS ) { /* Silently ignore -- message too far in the future */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "Ignore future HS message with sequence number %u, " "buffering window %u - %u", recv_msg_seq, ssl->handshake->in_msg_seq, ssl->handshake->in_msg_seq + MBEDTLS_SSL_MAX_BUFFERED_HS - 1 ) ); goto exit; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering HS message with sequence number %u, offset %u ", recv_msg_seq, recv_msg_seq_offset ) ); hs_buf = &hs->buffering.hs[ recv_msg_seq_offset ]; /* Check if the buffering for this seq nr has already commenced. */ if( !hs_buf->is_valid ) { size_t reassembly_buf_sz; hs_buf->is_fragmented = ( ssl_hs_is_proper_fragment( ssl ) == 1 ); /* We copy the message back into the input buffer * after reassembly, so check that it's not too large. * This is an implementation-specific limitation * and not one from the standard, hence it is not * checked in ssl_check_hs_header(). */ if( msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN ) { /* Ignore message */ goto exit; } /* Check if we have enough space to buffer the message. */ if( hs->buffering.total_bytes_buffered > MBEDTLS_SSL_DTLS_MAX_BUFFERING ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } reassembly_buf_sz = ssl_get_reassembly_buffer_size( msg_len, hs_buf->is_fragmented ); if( reassembly_buf_sz > ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { if( recv_msg_seq_offset > 0 ) { /* If we can't buffer a future message because * of space limitations -- ignore. */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore\n", (unsigned) msg_len, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); goto exit; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- attempt to make space by freeing buffered future messages\n", (unsigned) msg_len, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); } if( ssl_buffer_make_space( ssl, reassembly_buf_sz ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reassembly of next message of size %u (%u with bitmap) would exceed the compile-time limit %u (already %u bytes buffered) -- fail\n", (unsigned) msg_len, (unsigned) reassembly_buf_sz, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); ret = MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; goto exit; } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialize reassembly, total length = %d", msg_len ) ); hs_buf->data = mbedtls_calloc( 1, reassembly_buf_sz ); if( hs_buf->data == NULL ) { ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; goto exit; } hs_buf->data_len = reassembly_buf_sz; /* Prepare final header: copy msg_type, length and message_seq, * then add standardised fragment_offset and fragment_length */ memcpy( hs_buf->data, ssl->in_msg, 6 ); memset( hs_buf->data + 6, 0, 3 ); memcpy( hs_buf->data + 9, hs_buf->data + 1, 3 ); hs_buf->is_valid = 1; hs->buffering.total_bytes_buffered += reassembly_buf_sz; } else { /* Make sure msg_type and length are consistent */ if( memcmp( hs_buf->data, ssl->in_msg, 4 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Fragment header mismatch - ignore" ) ); /* Ignore */ goto exit; } } if( !hs_buf->is_complete ) { size_t frag_len, frag_off; unsigned char * const msg = hs_buf->data + 12; /* * Check and copy current fragment */ /* Validation of header fields already done in * mbedtls_ssl_prepare_handshake_record(). */ frag_off = ssl_get_hs_frag_off( ssl ); frag_len = ssl_get_hs_frag_len( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "adding fragment, offset = %d, length = %d", frag_off, frag_len ) ); memcpy( msg + frag_off, ssl->in_msg + 12, frag_len ); if( hs_buf->is_fragmented ) { unsigned char * const bitmask = msg + msg_len; ssl_bitmask_set( bitmask, frag_off, frag_len ); hs_buf->is_complete = ( ssl_bitmask_check( bitmask, msg_len ) == 0 ); } else { hs_buf->is_complete = 1; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "message %scomplete", hs_buf->is_complete ? "" : "not yet " ) ); } break; } default: /* We don't buffer other types of messages. */ break; } exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_buffer_message" ) ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static int ssl_consume_current_message( mbedtls_ssl_context *ssl ) { /* * Consume last content-layer message and potentially * update in_msglen which keeps track of the contents' * consumption state. * * (1) Handshake messages: * Remove last handshake message, move content * and adapt in_msglen. * * (2) Alert messages: * Consume whole record content, in_msglen = 0. * * (3) Change cipher spec: * Consume whole record content, in_msglen = 0. * * (4) Application data: * Don't do anything - the record layer provides * the application data as a stream transport * and consumes through mbedtls_ssl_read only. * */ /* Case (1): Handshake messages */ if( ssl->in_hslen != 0 ) { /* Hard assertion to be sure that no application data * is in flight, as corrupting ssl->in_msglen during * ssl->in_offt != NULL is fatal. */ if( ssl->in_offt != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Get next Handshake message in the current record */ /* Notes: * (1) in_hslen is not necessarily the size of the * current handshake content: If DTLS handshake * fragmentation is used, that's the fragment * size instead. Using the total handshake message * size here is faulty and should be changed at * some point. * (2) While it doesn't seem to cause problems, one * has to be very careful not to assume that in_hslen * is always <= in_msglen in a sensible communication. * Again, it's wrong for DTLS handshake fragmentation. * The following check is therefore mandatory, and * should not be treated as a silently corrected assertion. * Additionally, ssl->in_hslen might be arbitrarily out of * bounds after handling a DTLS message with an unexpected * sequence number, see mbedtls_ssl_prepare_handshake_record. */ if( ssl->in_hslen < ssl->in_msglen ) { ssl->in_msglen -= ssl->in_hslen; memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen, ssl->in_msglen ); MBEDTLS_SSL_DEBUG_BUF( 4, "remaining content in record", ssl->in_msg, ssl->in_msglen ); } else { ssl->in_msglen = 0; } ssl->in_hslen = 0; } /* Case (4): Application data */ else if( ssl->in_offt != NULL ) { return( 0 ); } /* Everything else (CCS & Alerts) */ else { ssl->in_msglen = 0; } return( 0 ); } static int ssl_record_is_in_progress( mbedtls_ssl_context *ssl ) { if( ssl->in_msglen > 0 ) return( 1 ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) static void ssl_free_buffered_record( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( hs == NULL ) return; if( hs->buffering.future_record.data != NULL ) { hs->buffering.total_bytes_buffered -= hs->buffering.future_record.len; mbedtls_free( hs->buffering.future_record.data ); hs->buffering.future_record.data = NULL; } } static int ssl_load_buffered_record( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; unsigned char * rec; size_t rec_len; unsigned rec_epoch; if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 0 ); if( hs == NULL ) return( 0 ); rec = hs->buffering.future_record.data; rec_len = hs->buffering.future_record.len; rec_epoch = hs->buffering.future_record.epoch; if( rec == NULL ) return( 0 ); /* Only consider loading future records if the * input buffer is empty. */ if( ssl_next_record_is_in_datagram( ssl ) == 1 ) return( 0 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_record" ) ); if( rec_epoch != ssl->in_epoch ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffered record not from current epoch." ) ); goto exit; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Found buffered record from current epoch - load" ) ); /* Double-check that the record is not too large */ if( rec_len > MBEDTLS_SSL_IN_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } memcpy( ssl->in_hdr, rec, rec_len ); ssl->in_left = rec_len; ssl->next_record_offset = 0; ssl_free_buffered_record( ssl ); exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_load_buffered_record" ) ); return( 0 ); } static int ssl_buffer_future_record( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; size_t const rec_hdr_len = 13; size_t const total_buf_sz = rec_hdr_len + ssl->in_msglen; /* Don't buffer future records outside handshakes. */ if( hs == NULL ) return( 0 ); /* Only buffer handshake records (we are only interested * in Finished messages). */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) return( 0 ); /* Don't buffer more than one future epoch record. */ if( hs->buffering.future_record.data != NULL ) return( 0 ); /* Don't buffer record if there's not enough buffering space remaining. */ if( total_buf_sz > ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future epoch record of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore\n", (unsigned) total_buf_sz, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); return( 0 ); } /* Buffer record */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffer record from epoch %u", ssl->in_epoch + 1 ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "Buffered record", ssl->in_hdr, rec_hdr_len + ssl->in_msglen ); /* ssl_parse_record_header() only considers records * of the next epoch as candidates for buffering. */ hs->buffering.future_record.epoch = ssl->in_epoch + 1; hs->buffering.future_record.len = total_buf_sz; hs->buffering.future_record.data = mbedtls_calloc( 1, hs->buffering.future_record.len ); if( hs->buffering.future_record.data == NULL ) { /* If we run out of RAM trying to buffer a * record from the next epoch, just ignore. */ return( 0 ); } memcpy( hs->buffering.future_record.data, ssl->in_hdr, total_buf_sz ); hs->buffering.total_bytes_buffered += total_buf_sz; return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static int ssl_get_next_record( mbedtls_ssl_context *ssl ) { int ret; #if defined(MBEDTLS_SSL_PROTO_DTLS) /* We might have buffered a future record; if so, * and if the epoch matches now, load it. * On success, this call will set ssl->in_left to * the length of the buffered record, so that * the calls to ssl_fetch_input() below will * essentially be no-ops. */ ret = ssl_load_buffered_record( ssl ); if( ret != 0 ) return( ret ); #endif /* MBEDTLS_SSL_PROTO_DTLS */ if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } if( ( ret = ssl_parse_record_header( ssl ) ) != 0 ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ret != MBEDTLS_ERR_SSL_CLIENT_RECONNECT ) { if( ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE ) { ret = ssl_buffer_future_record( ssl ); if( ret != 0 ) return( ret ); /* Fall through to handling of unexpected records */ ret = MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; } if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ) { /* Skip unexpected record (but not whole datagram) */ ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl ); MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding unexpected record " "(header)" ) ); } else { /* Skip invalid record and the rest of the datagram */ ssl->next_record_offset = 0; ssl->in_left = 0; MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record " "(header)" ) ); } /* Get next record */ return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ); } #endif return( ret ); } /* * Read and optionally decrypt the message contents */ if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } /* Done reading this record, get ready for the next one */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl ); if( ssl->next_record_offset < ssl->in_left ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "more than one record within datagram" ) ); } } else #endif ssl->in_left = 0; if( ( ret = ssl_prepare_record_content( ssl ) ) != 0 ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { /* Silently discard invalid records */ if( ret == MBEDTLS_ERR_SSL_INVALID_RECORD || ret == MBEDTLS_ERR_SSL_INVALID_MAC ) { /* Except when waiting for Finished as a bad mac here * probably means something went wrong in the handshake * (eg wrong psk used, mitm downgrade attempt, etc.) */ if( ssl->state == MBEDTLS_SSL_CLIENT_FINISHED || ssl->state == MBEDTLS_SSL_SERVER_FINISHED ) { #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC ); } #endif return( ret ); } #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) if( ssl->conf->badmac_limit != 0 && ++ssl->badmac_seen >= ssl->conf->badmac_limit ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "too many records with bad MAC" ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } #endif /* As above, invalid records cause * dismissal of the whole datagram. */ ssl->next_record_offset = 0; ssl->in_left = 0; MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record (mac)" ) ); return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ); } return( ret ); } else #endif { /* Error out (and send alert) on invalid records */ #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC ); } #endif return( ret ); } } return( 0 ); } int mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl ) { int ret; /* * Handle particular types of records */ if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) { if( ( ret = mbedtls_ssl_prepare_handshake_record( ssl ) ) != 0 ) { return( ret ); } } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { if( ssl->in_msglen != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid CCS message, len: %d", ssl->in_msglen ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } if( ssl->in_msg[0] != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid CCS message, content: %02x", ssl->in_msg[0] ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->state != MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC && ssl->state != MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ) { if( ssl->handshake == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping ChangeCipherSpec outside handshake" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "received out-of-order ChangeCipherSpec - remember" ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } #endif } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT ) { if( ssl->in_msglen != 2 ) { /* Note: Standard allows for more than one 2 byte alert to be packed in a single message, but Mbed TLS doesn't currently support this. */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid alert message, len: %d", ssl->in_msglen ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]", ssl->in_msg[0], ssl->in_msg[1] ) ); /* * Ignore non-fatal alerts, except close_notify and no_renegotiation */ if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)", ssl->in_msg[1] ) ); return( MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE ); } if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a close notify message" ) ); return( MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY ); } #if defined(MBEDTLS_SSL_RENEGOTIATION_ENABLED) if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no renegotiation alert" ) ); /* Will be handled when trying to parse ServerHello */ return( 0 ); } #endif #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_SRV_C) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no_cert" ) ); /* Will be handled in mbedtls_ssl_parse_certificate() */ return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */ /* Silently ignore: fetch new message */ return MBEDTLS_ERR_SSL_NON_FATAL; } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake != NULL && ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) { ssl_handshake_wrapup_free_hs_transform( ssl ); } #endif return( 0 ); } int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl ) { int ret; if( ( ret = mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 ) { return( ret ); } return( 0 ); } int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, unsigned char level, unsigned char message ) { int ret; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> send alert message" ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "send alert level=%u message=%u", level, message )); ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; ssl->out_msglen = 2; ssl->out_msg[0] = level; ssl->out_msg[1] = message; if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= send alert message" ) ); return( 0 ); } /* * Handshake functions */ #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) /* No certificate support -> dummy functions */ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else /* Some certificate support -> implement write and parse */ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t i, n; const mbedtls_x509_crt *crt; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); ssl->state++; return( 0 ); } #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) { if( ssl->client_auth == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); ssl->state++; return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) /* * If using SSLv3 and got no cert, send an Alert message * (otherwise an empty Certificate message will be sent). */ if( mbedtls_ssl_own_cert( ssl ) == NULL && ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl->out_msglen = 2; ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING; ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT; MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) ); goto write_msg; } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ } #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) { if( mbedtls_ssl_own_cert( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) ); return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED ); } } #endif MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) ); /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 6 length of all certs * 7 . 9 length of cert. 1 * 10 . n-1 peer certificate * n . n+2 length of cert. 2 * n+3 . ... upper level cert, etc. */ i = 7; crt = mbedtls_ssl_own_cert( ssl ); while( crt != NULL ) { n = crt->raw.len; if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d", i + 3 + n, MBEDTLS_SSL_OUT_CONTENT_LEN ) ); return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE ); } ssl->out_msg[i ] = (unsigned char)( n >> 16 ); ssl->out_msg[i + 1] = (unsigned char)( n >> 8 ); ssl->out_msg[i + 2] = (unsigned char)( n ); i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n ); i += n; crt = crt->next; } ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 ); ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 ); ssl->out_msg[6] = (unsigned char)( ( i - 7 ) ); ssl->out_msglen = i; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE; #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C) write_msg: #endif ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) ); return( ret ); } /* * Once the certificate message is read, parse it into a cert chain and * perform basic checks, but leave actual verification to the caller */ static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl ) { int ret; size_t i, n; uint8_t alert; #if defined(MBEDTLS_SSL_SRV_C) #if defined(MBEDTLS_SSL_PROTO_SSL3) /* * Check if the client sent an empty certificate */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { if( ssl->in_msglen == 2 && ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT && ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) ); /* The client was asked for a certificate but didn't send one. The client should know what's going on, so we don't send an alert. */ ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE ); } } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) && ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE && memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) ); /* The client was asked for a certificate but didn't send one. The client should know what's going on, so we don't send an alert. */ ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE ); } } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ #endif /* MBEDTLS_SSL_SRV_C */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE || ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } i = mbedtls_ssl_hs_hdr_len( ssl ); /* * Same message structure as in mbedtls_ssl_write_certificate() */ n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2]; if( ssl->in_msg[i] != 0 || ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } /* In case we tried to reuse a session but it failed */ if( ssl->session_negotiate->peer_cert != NULL ) { mbedtls_x509_crt_free( ssl->session_negotiate->peer_cert ); mbedtls_free( ssl->session_negotiate->peer_cert ); } if( ( ssl->session_negotiate->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", sizeof( mbedtls_x509_crt ) ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert ); i += 3; while( i < ssl->in_hslen ) { if ( i + 3 > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } if( ssl->in_msg[i] != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } n = ( (unsigned int) ssl->in_msg[i + 1] << 8 ) | (unsigned int) ssl->in_msg[i + 2]; i += 3; if( n < 128 || i + n > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert, ssl->in_msg + i, n ); switch( ret ) { case 0: /*ok*/ case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND: /* Ignore certificate with an unknown algorithm: maybe a prior certificate was already trusted. */ break; case MBEDTLS_ERR_X509_ALLOC_FAILED: alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR; goto crt_parse_der_failed; case MBEDTLS_ERR_X509_UNKNOWN_VERSION: alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; goto crt_parse_der_failed; default: alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; crt_parse_der_failed: mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert ); MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret ); return( ret ); } i += n; } MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert ); /* * On client, make sure the server cert doesn't change during renego to * avoid "triple handshake" attack: https://secure-resumption.com/ */ #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { if( ssl->session->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } if( ssl->session->peer_cert->raw.len != ssl->session_negotiate->peer_cert->raw.len || memcmp( ssl->session->peer_cert->raw.p, ssl->session_negotiate->peer_cert->raw.p, ssl->session->peer_cert->raw.len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } } #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */ return( 0 ); } int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ssl_ciphersuite_t * const ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET ? ssl->handshake->sni_authmode : ssl->conf->authmode; #else const int authmode = ssl->conf->authmode; #endif void *rs_ctx = NULL; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && authmode == MBEDTLS_SSL_VERIFY_NONE ) { ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } #endif #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled && ssl->handshake->ecrs_state == ssl_ecrs_crt_verify ) { goto crt_verify; } #endif if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { /* mbedtls_ssl_read_record may have sent an alert already. We let it decide whether to alert. */ MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ( ret = ssl_parse_certificate_chain( ssl ) ) != 0 ) { #if defined(MBEDTLS_SSL_SRV_C) if( ret == MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE && authmode == MBEDTLS_SSL_VERIFY_OPTIONAL ) { ret = 0; } #endif ssl->state++; return( ret ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled) ssl->handshake->ecrs_state = ssl_ecrs_crt_verify; crt_verify: if( ssl->handshake->ecrs_enabled) rs_ctx = &ssl->handshake->ecrs_ctx; #endif if( authmode != MBEDTLS_SSL_VERIFY_NONE ) { mbedtls_x509_crt *ca_chain; mbedtls_x509_crl *ca_crl; #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_ca_chain != NULL ) { ca_chain = ssl->handshake->sni_ca_chain; ca_crl = ssl->handshake->sni_ca_crl; } else #endif { ca_chain = ssl->conf->ca_chain; ca_crl = ssl->conf->ca_crl; } /* * Main check: verify certificate */ ret = mbedtls_x509_crt_verify_restartable( ssl->session_negotiate->peer_cert, ca_chain, ca_crl, ssl->conf->cert_profile, ssl->hostname, &ssl->session_negotiate->verify_result, ssl->conf->f_vrfy, ssl->conf->p_vrfy, rs_ctx ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ); #endif /* * Secondary checks: always done, but change 'ret' only if it was 0 */ #if defined(MBEDTLS_ECP_C) { const mbedtls_pk_context *pk = &ssl->session_negotiate->peer_cert->pk; /* If certificate uses an EC key, make sure the curve is OK */ if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) && mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 ) { ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY; MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) ); if( ret == 0 ) ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; } } #endif /* MBEDTLS_ECP_C */ if( mbedtls_ssl_check_cert_usage( ssl->session_negotiate->peer_cert, ciphersuite_info, ! ssl->conf->endpoint, &ssl->session_negotiate->verify_result ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) ); if( ret == 0 ) ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; } /* mbedtls_x509_crt_verify_with_profile is supposed to report a * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED, * with details encoded in the verification flags. All other kinds * of error codes, including those from the user provided f_vrfy * functions, are treated as fatal and lead to a failure of * ssl_parse_certificate even if verification was optional. */ if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL && ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED || ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) ) { ret = 0; } if( ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) ); ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED; } if( ret != 0 ) { uint8_t alert; /* The certificate may have been rejected for several reasons. Pick one and send the corresponding alert. Which alert to send may be a subject of debate in some cases. */ if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER ) alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH ) alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED ) alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED ) alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED ) alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA; else alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN; mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert ); } #if defined(MBEDTLS_DEBUG_C) if( ssl->session_negotiate->verify_result != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %x", ssl->session_negotiate->verify_result ) ); } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) ); } #endif /* MBEDTLS_DEBUG_C */ } ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) ); ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC; ssl->out_msglen = 1; ssl->out_msg[0] = 1; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) ); return( 0 ); } int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* CCS records are only accepted if they have length 1 and content '1', * so we don't need to check this here. */ /* * Switch to our negotiated transform and session parameters for inbound * data. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) ); ssl->transform_in = ssl->transform_negotiate; ssl->session_in = ssl->session_negotiate; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) ssl_dtls_replay_reset( ssl ); #endif /* Increment epoch */ if( ++ssl->in_epoch == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) ); /* This is highly unlikely to happen for legitimate reasons, so treat it as an attack and don't send an alert. */ return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ memset( ssl->in_ctr, 0, 8 ); ssl_update_in_pointers( ssl, ssl->transform_negotiate ); #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_activate != NULL ) { if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_INBOUND ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) ); return( 0 ); } void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl, const mbedtls_ssl_ciphersuite_t *ciphersuite_info ) { ((void) ciphersuite_info); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) ssl->handshake->update_checksum = ssl_update_checksum_md5sha1; else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA512_C) if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) ssl->handshake->update_checksum = ssl_update_checksum_sha384; else #endif #if defined(MBEDTLS_SHA256_C) if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 ) ssl->handshake->update_checksum = ssl_update_checksum_sha256; else #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return; } } void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_starts_ret( &ssl->handshake->fin_md5 ); mbedtls_sha1_starts_ret( &ssl->handshake->fin_sha1 ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_starts_ret( &ssl->handshake->fin_sha256, 0 ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_starts_ret( &ssl->handshake->fin_sha512, 1 ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ } static void ssl_update_checksum_start( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len ); mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len ); mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len ); } #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len ); } #endif #if defined(MBEDTLS_SHA512_C) static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len ); } #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) static void ssl_calc_finished_ssl( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { const char *sender; mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char padbuf[48]; unsigned char md5sum[16]; unsigned char sha1sum[20]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); /* * SSLv3: * hash = * MD5( master + pad2 + * MD5( handshake + sender + master + pad1 ) ) * + SHA1( master + pad2 + * SHA1( handshake + sender + master + pad1 ) ) */ #if !defined(MBEDTLS_MD5_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) md5.state, sizeof( md5.state ) ); #endif #if !defined(MBEDTLS_SHA1_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) sha1.state, sizeof( sha1.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT" : "SRVR"; memset( padbuf, 0x36, 48 ); mbedtls_md5_update_ret( &md5, (const unsigned char *) sender, 4 ); mbedtls_md5_update_ret( &md5, session->master, 48 ); mbedtls_md5_update_ret( &md5, padbuf, 48 ); mbedtls_md5_finish_ret( &md5, md5sum ); mbedtls_sha1_update_ret( &sha1, (const unsigned char *) sender, 4 ); mbedtls_sha1_update_ret( &sha1, session->master, 48 ); mbedtls_sha1_update_ret( &sha1, padbuf, 40 ); mbedtls_sha1_finish_ret( &sha1, sha1sum ); memset( padbuf, 0x5C, 48 ); mbedtls_md5_starts_ret( &md5 ); mbedtls_md5_update_ret( &md5, session->master, 48 ); mbedtls_md5_update_ret( &md5, padbuf, 48 ); mbedtls_md5_update_ret( &md5, md5sum, 16 ); mbedtls_md5_finish_ret( &md5, buf ); mbedtls_sha1_starts_ret( &sha1 ); mbedtls_sha1_update_ret( &sha1, session->master, 48 ); mbedtls_sha1_update_ret( &sha1, padbuf , 40 ); mbedtls_sha1_update_ret( &sha1, sha1sum, 20 ); mbedtls_sha1_finish_ret( &sha1, buf + 16 ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); mbedtls_platform_zeroize( md5sum, sizeof( md5sum ) ); mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_calc_finished_tls( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { int len = 12; const char *sender; mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char padbuf[36]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); /* * TLSv1: * hash = PRF( master, finished_label, * MD5( handshake ) + SHA1( handshake ) )[0..11] */ #if !defined(MBEDTLS_MD5_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) md5.state, sizeof( md5.state ) ); #endif #if !defined(MBEDTLS_SHA1_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) sha1.state, sizeof( sha1.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "client finished" : "server finished"; mbedtls_md5_finish_ret( &md5, padbuf ); mbedtls_sha1_finish_ret( &sha1, padbuf + 16 ); ssl->handshake->tls_prf( session->master, 48, sender, padbuf, 36, buf, len ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { int len = 12; const char *sender; mbedtls_sha256_context sha256; unsigned char padbuf[32]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; mbedtls_sha256_init( &sha256 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) ); mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 ); /* * TLSv1.2: * hash = PRF( master, finished_label, * Hash( handshake ) )[0.11] */ #if !defined(MBEDTLS_SHA256_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *) sha256.state, sizeof( sha256.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "client finished" : "server finished"; mbedtls_sha256_finish_ret( &sha256, padbuf ); ssl->handshake->tls_prf( session->master, 48, sender, padbuf, 32, buf, len ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); mbedtls_sha256_free( &sha256 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { int len = 12; const char *sender; mbedtls_sha512_context sha512; unsigned char padbuf[48]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; mbedtls_sha512_init( &sha512 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) ); mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 ); /* * TLSv1.2: * hash = PRF( master, finished_label, * Hash( handshake ) )[0.11] */ #if !defined(MBEDTLS_SHA512_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *) sha512.state, sizeof( sha512.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "client finished" : "server finished"; mbedtls_sha512_finish_ret( &sha512, padbuf ); ssl->handshake->tls_prf( session->master, 48, sender, padbuf, 48, buf, len ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); mbedtls_sha512_free( &sha512 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) ); /* * Free our handshake params */ mbedtls_ssl_handshake_free( ssl ); mbedtls_free( ssl->handshake ); ssl->handshake = NULL; /* * Free the previous transform and swith in the current one */ if( ssl->transform ) { mbedtls_ssl_transform_free( ssl->transform ); mbedtls_free( ssl->transform ); } ssl->transform = ssl->transform_negotiate; ssl->transform_negotiate = NULL; MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) ); } void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ) { int resume = ssl->handshake->resume; MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE; ssl->renego_records_seen = 0; } #endif /* * Free the previous session and switch in the current one */ if( ssl->session ) { #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) /* RFC 7366 3.1: keep the EtM state */ ssl->session_negotiate->encrypt_then_mac = ssl->session->encrypt_then_mac; #endif mbedtls_ssl_session_free( ssl->session ); mbedtls_free( ssl->session ); } ssl->session = ssl->session_negotiate; ssl->session_negotiate = NULL; /* * Add cache entry */ if( ssl->conf->f_set_cache != NULL && ssl->session->id_len != 0 && resume == 0 ) { if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 ) MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->flight != NULL ) { /* Cancel handshake timer */ ssl_set_timer( ssl, 0 ); /* Keep last flight around in case we need to resend it: * we need the handshake and transform structures for that */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) ); } else #endif ssl_handshake_wrapup_free_hs_transform( ssl ); ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) ); } int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl ) { int ret, hash_len; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) ); ssl_update_out_pointers( ssl, ssl->transform_negotiate ); ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint ); /* * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites * may define some other value. Currently (early 2016), no defined * ciphersuite does this (and this is unlikely to change as activity has * moved to TLS 1.3 now) so we can keep the hardcoded 12 here. */ hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12; #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->verify_data_len = hash_len; memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len ); #endif ssl->out_msglen = 4 + hash_len; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED; /* * In case of session resuming, invert the client and server * ChangeCipherSpec messages order. */ if( ssl->handshake->resume != 0 ) { #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; #endif #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; #endif } else ssl->state++; /* * Switch to our negotiated transform and session parameters for outbound * data. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { unsigned char i; /* Remember current epoch settings for resending */ ssl->handshake->alt_transform_out = ssl->transform_out; memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8 ); /* Set sequence_number to zero */ memset( ssl->cur_out_ctr + 2, 0, 6 ); /* Increment epoch */ for( i = 2; i > 0; i-- ) if( ++ssl->cur_out_ctr[i - 1] != 0 ) break; /* The loop goes to its end iff the counter is wrapping */ if( i == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) ); return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ memset( ssl->cur_out_ctr, 0, 8 ); ssl->transform_out = ssl->transform_negotiate; ssl->session_out = ssl->session_negotiate; #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_activate != NULL ) { if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_send_flight_completed( ssl ); #endif if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) #define SSL_MAX_HASH_LEN 36 #else #define SSL_MAX_HASH_LEN 12 #endif int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ) { int ret; unsigned int hash_len; unsigned char buf[SSL_MAX_HASH_LEN]; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) ); ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* There is currently no ciphersuite using another length with TLS 1.2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) hash_len = 36; else #endif hash_len = 12; if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED || ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); } if( mbedtls_ssl_safer_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), buf, hash_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); } #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->verify_data_len = hash_len; memcpy( ssl->peer_verify_data, buf, hash_len ); #endif if( ssl->handshake->resume != 0 ) { #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; #endif #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; #endif } else ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_recv_flight_completed( ssl ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) ); return( 0 ); } static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake ) { memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) ); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_init( &handshake->fin_md5 ); mbedtls_sha1_init( &handshake->fin_sha1 ); mbedtls_md5_starts_ret( &handshake->fin_md5 ); mbedtls_sha1_starts_ret( &handshake->fin_sha1 ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_init( &handshake->fin_sha256 ); mbedtls_sha256_starts_ret( &handshake->fin_sha256, 0 ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_init( &handshake->fin_sha512 ); mbedtls_sha512_starts_ret( &handshake->fin_sha512, 1 ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ handshake->update_checksum = ssl_update_checksum_start; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs ); #endif #if defined(MBEDTLS_DHM_C) mbedtls_dhm_init( &handshake->dhm_ctx ); #endif #if defined(MBEDTLS_ECDH_C) mbedtls_ecdh_init( &handshake->ecdh_ctx ); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) mbedtls_ecjpake_init( &handshake->ecjpake_ctx ); #if defined(MBEDTLS_SSL_CLI_C) handshake->ecjpake_cache = NULL; handshake->ecjpake_cache_len = 0; #endif #endif #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx ); #endif #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET; #endif } static void ssl_transform_init( mbedtls_ssl_transform *transform ) { memset( transform, 0, sizeof(mbedtls_ssl_transform) ); mbedtls_cipher_init( &transform->cipher_ctx_enc ); mbedtls_cipher_init( &transform->cipher_ctx_dec ); mbedtls_md_init( &transform->md_ctx_enc ); mbedtls_md_init( &transform->md_ctx_dec ); } void mbedtls_ssl_session_init( mbedtls_ssl_session *session ) { memset( session, 0, sizeof(mbedtls_ssl_session) ); } static int ssl_handshake_init( mbedtls_ssl_context *ssl ) { /* Clear old handshake information if present */ if( ssl->transform_negotiate ) mbedtls_ssl_transform_free( ssl->transform_negotiate ); if( ssl->session_negotiate ) mbedtls_ssl_session_free( ssl->session_negotiate ); if( ssl->handshake ) mbedtls_ssl_handshake_free( ssl ); /* * Either the pointers are now NULL or cleared properly and can be freed. * Now allocate missing structures. */ if( ssl->transform_negotiate == NULL ) { ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) ); } if( ssl->session_negotiate == NULL ) { ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) ); } if( ssl->handshake == NULL ) { ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) ); } /* All pointers should exist and can be directly freed without issue */ if( ssl->handshake == NULL || ssl->transform_negotiate == NULL || ssl->session_negotiate == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) ); mbedtls_free( ssl->handshake ); mbedtls_free( ssl->transform_negotiate ); mbedtls_free( ssl->session_negotiate ); ssl->handshake = NULL; ssl->transform_negotiate = NULL; ssl->session_negotiate = NULL; return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } /* Initialize structures */ mbedtls_ssl_session_init( ssl->session_negotiate ); ssl_transform_init( ssl->transform_negotiate ); ssl_handshake_params_init( ssl->handshake ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->handshake->alt_transform_out = ssl->transform_out; if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; else ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; ssl_set_timer( ssl, 0 ); } #endif return( 0 ); } #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) /* Dummy cookie callbacks for defaults */ static int ssl_cookie_write_dummy( void *ctx, unsigned char **p, unsigned char *end, const unsigned char *cli_id, size_t cli_id_len ) { ((void) ctx); ((void) p); ((void) end); ((void) cli_id); ((void) cli_id_len); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } static int ssl_cookie_check_dummy( void *ctx, const unsigned char *cookie, size_t cookie_len, const unsigned char *cli_id, size_t cli_id_len ) { ((void) ctx); ((void) cookie); ((void) cookie_len); ((void) cli_id); ((void) cli_id_len); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ /* Once ssl->out_hdr as the address of the beginning of the * next outgoing record is set, deduce the other pointers. * * Note: For TLS, we save the implicit record sequence number * (entering MAC computation) in the 8 bytes before ssl->out_hdr, * and the caller has to make sure there's space for this. */ static void ssl_update_out_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->out_ctr = ssl->out_hdr + 3; ssl->out_len = ssl->out_hdr + 11; ssl->out_iv = ssl->out_hdr + 13; } else #endif { ssl->out_ctr = ssl->out_hdr - 8; ssl->out_len = ssl->out_hdr + 3; ssl->out_iv = ssl->out_hdr + 5; } /* Adjust out_msg to make space for explicit IV, if used. */ if( transform != NULL && ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { ssl->out_msg = ssl->out_iv + transform->ivlen - transform->fixed_ivlen; } else ssl->out_msg = ssl->out_iv; } /* Once ssl->in_hdr as the address of the beginning of the * next incoming record is set, deduce the other pointers. * * Note: For TLS, we save the implicit record sequence number * (entering MAC computation) in the 8 bytes before ssl->in_hdr, * and the caller has to make sure there's space for this. */ static void ssl_update_in_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->in_ctr = ssl->in_hdr + 3; ssl->in_len = ssl->in_hdr + 11; ssl->in_iv = ssl->in_hdr + 13; } else #endif { ssl->in_ctr = ssl->in_hdr - 8; ssl->in_len = ssl->in_hdr + 3; ssl->in_iv = ssl->in_hdr + 5; } /* Offset in_msg from in_iv to allow space for explicit IV, if used. */ if( transform != NULL && ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { ssl->in_msg = ssl->in_iv + transform->ivlen - transform->fixed_ivlen; } else ssl->in_msg = ssl->in_iv; } /* * Initialize an SSL context */ void mbedtls_ssl_init( mbedtls_ssl_context *ssl ) { memset( ssl, 0, sizeof( mbedtls_ssl_context ) ); } /* * Setup an SSL context */ static void ssl_reset_in_out_pointers( mbedtls_ssl_context *ssl ) { /* Set the incoming and outgoing record pointers. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->out_hdr = ssl->out_buf; ssl->in_hdr = ssl->in_buf; } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ { ssl->out_hdr = ssl->out_buf + 8; ssl->in_hdr = ssl->in_buf + 8; } /* Derive other internal pointers. */ ssl_update_out_pointers( ssl, NULL /* no transform enabled */ ); ssl_update_in_pointers ( ssl, NULL /* no transform enabled */ ); } int mbedtls_ssl_setup( mbedtls_ssl_context *ssl, const mbedtls_ssl_config *conf ) { int ret; ssl->conf = conf; /* * Prepare base structures */ /* Set to NULL in case of an error condition */ ssl->out_buf = NULL; ssl->in_buf = mbedtls_calloc( 1, MBEDTLS_SSL_IN_BUFFER_LEN ); if( ssl->in_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_IN_BUFFER_LEN) ); ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; goto error; } ssl->out_buf = mbedtls_calloc( 1, MBEDTLS_SSL_OUT_BUFFER_LEN ); if( ssl->out_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_OUT_BUFFER_LEN) ); ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; goto error; } ssl_reset_in_out_pointers( ssl ); if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) goto error; return( 0 ); error: mbedtls_free( ssl->in_buf ); mbedtls_free( ssl->out_buf ); ssl->conf = NULL; ssl->in_buf = NULL; ssl->out_buf = NULL; ssl->in_hdr = NULL; ssl->in_ctr = NULL; ssl->in_len = NULL; ssl->in_iv = NULL; ssl->in_msg = NULL; ssl->out_hdr = NULL; ssl->out_ctr = NULL; ssl->out_len = NULL; ssl->out_iv = NULL; ssl->out_msg = NULL; return( ret ); } /* * Reset an initialized and used SSL context for re-use while retaining * all application-set variables, function pointers and data. * * If partial is non-zero, keep data in the input buffer and client ID. * (Use when a DTLS client reconnects from the same port.) */ static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ) { int ret; #if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \ !defined(MBEDTLS_SSL_SRV_C) ((void) partial); #endif ssl->state = MBEDTLS_SSL_HELLO_REQUEST; /* Cancel any possibly running timer */ ssl_set_timer( ssl, 0 ); #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE; ssl->renego_records_seen = 0; ssl->verify_data_len = 0; memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN ); memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN ); #endif ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION; ssl->in_offt = NULL; ssl_reset_in_out_pointers( ssl ); ssl->in_msgtype = 0; ssl->in_msglen = 0; #if defined(MBEDTLS_SSL_PROTO_DTLS) ssl->next_record_offset = 0; ssl->in_epoch = 0; #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) ssl_dtls_replay_reset( ssl ); #endif ssl->in_hslen = 0; ssl->nb_zero = 0; ssl->keep_current_message = 0; ssl->out_msgtype = 0; ssl->out_msglen = 0; ssl->out_left = 0; #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED ) ssl->split_done = 0; #endif memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) ); ssl->transform_in = NULL; ssl->transform_out = NULL; ssl->session_in = NULL; ssl->session_out = NULL; memset( ssl->out_buf, 0, MBEDTLS_SSL_OUT_BUFFER_LEN ); #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) if( partial == 0 ) #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ { ssl->in_left = 0; memset( ssl->in_buf, 0, MBEDTLS_SSL_IN_BUFFER_LEN ); } #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_reset != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) ); if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif if( ssl->transform ) { mbedtls_ssl_transform_free( ssl->transform ); mbedtls_free( ssl->transform ); ssl->transform = NULL; } if( ssl->session ) { mbedtls_ssl_session_free( ssl->session ); mbedtls_free( ssl->session ); ssl->session = NULL; } #if defined(MBEDTLS_SSL_ALPN) ssl->alpn_chosen = NULL; #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) if( partial == 0 ) #endif { mbedtls_free( ssl->cli_id ); ssl->cli_id = NULL; ssl->cli_id_len = 0; } #endif if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) return( ret ); return( 0 ); } /* * Reset an initialized and used SSL context for re-use while retaining * all application-set variables, function pointers and data. */ int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl ) { return( ssl_session_reset_int( ssl, 0 ) ); } /* * SSL set accessors */ void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint ) { conf->endpoint = endpoint; } void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport ) { conf->transport = transport; } #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ) { conf->anti_replay = mode; } #endif #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ) { conf->badmac_limit = limit; } #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl, unsigned allow_packing ) { ssl->disable_datagram_packing = !allow_packing; } void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max ) { conf->hs_timeout_min = min; conf->hs_timeout_max = max; } #endif void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode ) { conf->authmode = authmode; } #if defined(MBEDTLS_X509_CRT_PARSE_C) void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { conf->f_vrfy = f_vrfy; conf->p_vrfy = p_vrfy; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { conf->f_rng = f_rng; conf->p_rng = p_rng; } void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, void (*f_dbg)(void *, int, const char *, int, const char *), void *p_dbg ) { conf->f_dbg = f_dbg; conf->p_dbg = p_dbg; } void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, void *p_bio, mbedtls_ssl_send_t *f_send, mbedtls_ssl_recv_t *f_recv, mbedtls_ssl_recv_timeout_t *f_recv_timeout ) { ssl->p_bio = p_bio; ssl->f_send = f_send; ssl->f_recv = f_recv; ssl->f_recv_timeout = f_recv_timeout; } #if defined(MBEDTLS_SSL_PROTO_DTLS) void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu ) { ssl->mtu = mtu; } #endif void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout ) { conf->read_timeout = timeout; } void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, void *p_timer, mbedtls_ssl_set_timer_t *f_set_timer, mbedtls_ssl_get_timer_t *f_get_timer ) { ssl->p_timer = p_timer; ssl->f_set_timer = f_set_timer; ssl->f_get_timer = f_get_timer; /* Make sure we start with no timer running */ ssl_set_timer( ssl, 0 ); } #if defined(MBEDTLS_SSL_SRV_C) void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf, void *p_cache, int (*f_get_cache)(void *, mbedtls_ssl_session *), int (*f_set_cache)(void *, const mbedtls_ssl_session *) ) { conf->p_cache = p_cache; conf->f_get_cache = f_get_cache; conf->f_set_cache = f_set_cache; } #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_CLI_C) int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session ) { int ret; if( ssl == NULL || session == NULL || ssl->session_negotiate == NULL || ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 ) return( ret ); ssl->handshake->resume = 1; return( 0 ); } #endif /* MBEDTLS_SSL_CLI_C */ void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf, const int *ciphersuites ) { conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites; } void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf, const int *ciphersuites, int major, int minor ) { if( major != MBEDTLS_SSL_MAJOR_VERSION_3 ) return; if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 ) return; conf->ciphersuite_list[minor] = ciphersuites; } #if defined(MBEDTLS_X509_CRT_PARSE_C) void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf, const mbedtls_x509_crt_profile *profile ) { conf->cert_profile = profile; } /* Append a new keycert entry to a (possibly empty) list */ static int ssl_append_key_cert( mbedtls_ssl_key_cert **head, mbedtls_x509_crt *cert, mbedtls_pk_context *key ) { mbedtls_ssl_key_cert *new_cert; new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) ); if( new_cert == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); new_cert->cert = cert; new_cert->key = key; new_cert->next = NULL; /* Update head is the list was null, else add to the end */ if( *head == NULL ) { *head = new_cert; } else { mbedtls_ssl_key_cert *cur = *head; while( cur->next != NULL ) cur = cur->next; cur->next = new_cert; } return( 0 ); } int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ) { return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) ); } void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ) { conf->ca_chain = ca_chain; conf->ca_crl = ca_crl; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ) { return( ssl_append_key_cert( &ssl->handshake->sni_key_cert, own_cert, pk_key ) ); } void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ) { ssl->handshake->sni_ca_chain = ca_chain; ssl->handshake->sni_ca_crl = ca_crl; } void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl, int authmode ) { ssl->handshake->sni_authmode = authmode; } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) /* * Set EC J-PAKE password for current handshake */ int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl, const unsigned char *pw, size_t pw_len ) { mbedtls_ecjpake_role role; if( ssl->handshake == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) role = MBEDTLS_ECJPAKE_SERVER; else role = MBEDTLS_ECJPAKE_CLIENT; return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx, role, MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, pw, pw_len ) ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf, const unsigned char *psk, size_t psk_len, const unsigned char *psk_identity, size_t psk_identity_len ) { if( psk == NULL || psk_identity == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( psk_len > MBEDTLS_PSK_MAX_LEN ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* Identity len will be encoded on two bytes */ if( ( psk_identity_len >> 16 ) != 0 || psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( conf->psk != NULL ) { mbedtls_platform_zeroize( conf->psk, conf->psk_len ); mbedtls_free( conf->psk ); conf->psk = NULL; conf->psk_len = 0; } if( conf->psk_identity != NULL ) { mbedtls_free( conf->psk_identity ); conf->psk_identity = NULL; conf->psk_identity_len = 0; } if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL || ( conf->psk_identity = mbedtls_calloc( 1, psk_identity_len ) ) == NULL ) { mbedtls_free( conf->psk ); mbedtls_free( conf->psk_identity ); conf->psk = NULL; conf->psk_identity = NULL; return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } conf->psk_len = psk_len; conf->psk_identity_len = psk_identity_len; memcpy( conf->psk, psk, conf->psk_len ); memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len ); return( 0 ); } int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl, const unsigned char *psk, size_t psk_len ) { if( psk == NULL || ssl->handshake == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( psk_len > MBEDTLS_PSK_MAX_LEN ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ssl->handshake->psk != NULL ) { mbedtls_platform_zeroize( ssl->handshake->psk, ssl->handshake->psk_len ); mbedtls_free( ssl->handshake->psk ); ssl->handshake->psk_len = 0; } if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); ssl->handshake->psk_len = psk_len; memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len ); return( 0 ); } void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf, int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_psk ) { conf->f_psk = f_psk; conf->p_psk = p_psk; } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) #if !defined(MBEDTLS_DEPRECATED_REMOVED) int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G ) { int ret; if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 || ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 ) { mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_DEPRECATED_REMOVED */ int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf, const unsigned char *dhm_P, size_t P_len, const unsigned char *dhm_G, size_t G_len ) { int ret; if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 || ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 ) { mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); return( ret ); } return( 0 ); } int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx ) { int ret; if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 || ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 ) { mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) /* * Set the minimum length for Diffie-Hellman parameters */ void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf, unsigned int bitlen ) { conf->dhm_min_bitlen = bitlen; } #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Set allowed/preferred hashes for handshake signatures */ void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf, const int *hashes ) { conf->sig_hashes = hashes; } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECP_C) /* * Set the allowed elliptic curves */ void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf, const mbedtls_ecp_group_id *curve_list ) { conf->curve_list = curve_list; } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_X509_CRT_PARSE_C) int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname ) { /* Initialize to suppress unnecessary compiler warning */ size_t hostname_len = 0; /* Check if new hostname is valid before * making any change to current one */ if( hostname != NULL ) { hostname_len = strlen( hostname ); if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* Now it's clear that we will overwrite the old hostname, * so we can free it safely */ if( ssl->hostname != NULL ) { mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) ); mbedtls_free( ssl->hostname ); } /* Passing NULL as hostname shall clear the old one */ if( hostname == NULL ) { ssl->hostname = NULL; } else { ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 ); if( ssl->hostname == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); memcpy( ssl->hostname, hostname, hostname_len ); ssl->hostname[hostname_len] = '\0'; } return( 0 ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf, int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_sni ) { conf->f_sni = f_sni; conf->p_sni = p_sni; } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL_ALPN) int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos ) { size_t cur_len, tot_len; const char **p; /* * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings * MUST NOT be truncated." * We check lengths now rather than later. */ tot_len = 0; for( p = protos; *p != NULL; p++ ) { cur_len = strlen( *p ); tot_len += cur_len; if( cur_len == 0 || cur_len > 255 || tot_len > 65535 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } conf->alpn_list = protos; return( 0 ); } const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl ) { return( ssl->alpn_chosen ); } #endif /* MBEDTLS_SSL_ALPN */ void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor ) { conf->max_major_ver = major; conf->max_minor_ver = minor; } void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor ) { conf->min_major_ver = major; conf->min_minor_ver = minor; } #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback ) { conf->fallback = fallback; } #endif #if defined(MBEDTLS_SSL_SRV_C) void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf, char cert_req_ca_list ) { conf->cert_req_ca_list = cert_req_ca_list; } #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm ) { conf->encrypt_then_mac = etm; } #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems ) { conf->extended_ms = ems; } #endif #if defined(MBEDTLS_ARC4_C) void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 ) { conf->arc4_disabled = arc4; } #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code ) { if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID || ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } conf->mfl_code = mfl_code; return( 0 ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate ) { conf->trunc_hmac = truncate; } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split ) { conf->cbc_record_splitting = split; } #endif void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy ) { conf->allow_legacy_renegotiation = allow_legacy; } #if defined(MBEDTLS_SSL_RENEGOTIATION) void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation ) { conf->disable_renegotiation = renegotiation; } void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records ) { conf->renego_max_records = max_records; } void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, const unsigned char period[8] ) { memcpy( conf->renego_period, period, 8 ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) #if defined(MBEDTLS_SSL_CLI_C) void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ) { conf->session_tickets = use_tickets; } #endif #if defined(MBEDTLS_SSL_SRV_C) void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf, mbedtls_ssl_ticket_write_t *f_ticket_write, mbedtls_ssl_ticket_parse_t *f_ticket_parse, void *p_ticket ) { conf->f_ticket_write = f_ticket_write; conf->f_ticket_parse = f_ticket_parse; conf->p_ticket = p_ticket; } #endif #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf, mbedtls_ssl_export_keys_t *f_export_keys, void *p_export_keys ) { conf->f_export_keys = f_export_keys; conf->p_export_keys = p_export_keys; } #endif #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) void mbedtls_ssl_conf_async_private_cb( mbedtls_ssl_config *conf, mbedtls_ssl_async_sign_t *f_async_sign, mbedtls_ssl_async_decrypt_t *f_async_decrypt, mbedtls_ssl_async_resume_t *f_async_resume, mbedtls_ssl_async_cancel_t *f_async_cancel, void *async_config_data ) { conf->f_async_sign_start = f_async_sign; conf->f_async_decrypt_start = f_async_decrypt; conf->f_async_resume = f_async_resume; conf->f_async_cancel = f_async_cancel; conf->p_async_config_data = async_config_data; } void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf ) { return( conf->p_async_config_data ); } void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl ) { if( ssl->handshake == NULL ) return( NULL ); else return( ssl->handshake->user_async_ctx ); } void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl, void *ctx ) { if( ssl->handshake != NULL ) ssl->handshake->user_async_ctx = ctx; } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /* * SSL get accessors */ size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl ) { return( ssl->in_offt == NULL ? 0 : ssl->in_msglen ); } int mbedtls_ssl_check_pending( const mbedtls_ssl_context *ssl ) { /* * Case A: We're currently holding back * a message for further processing. */ if( ssl->keep_current_message == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: record held back for processing" ) ); return( 1 ); } /* * Case B: Further records are pending in the current datagram. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->in_left > ssl->next_record_offset ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: more records within current datagram" ) ); return( 1 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Case C: A handshake message is being processed. */ if( ssl->in_hslen > 0 && ssl->in_hslen < ssl->in_msglen ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: more handshake messages within current record" ) ); return( 1 ); } /* * Case D: An application data message is being processed */ if( ssl->in_offt != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: application data record is being processed" ) ); return( 1 ); } /* * In all other cases, the rest of the message can be dropped. * As in ssl_get_next_record, this needs to be adapted if * we implement support for multiple alerts in single records. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: nothing pending" ) ); return( 0 ); } uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ) { if( ssl->session != NULL ) return( ssl->session->verify_result ); if( ssl->session_negotiate != NULL ) return( ssl->session_negotiate->verify_result ); return( 0xFFFFFFFF ); } const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl ) { if( ssl == NULL || ssl->session == NULL ) return( NULL ); return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite ); } const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { switch( ssl->minor_ver ) { case MBEDTLS_SSL_MINOR_VERSION_2: return( "DTLSv1.0" ); case MBEDTLS_SSL_MINOR_VERSION_3: return( "DTLSv1.2" ); default: return( "unknown (DTLS)" ); } } #endif switch( ssl->minor_ver ) { case MBEDTLS_SSL_MINOR_VERSION_0: return( "SSLv3.0" ); case MBEDTLS_SSL_MINOR_VERSION_1: return( "TLSv1.0" ); case MBEDTLS_SSL_MINOR_VERSION_2: return( "TLSv1.1" ); case MBEDTLS_SSL_MINOR_VERSION_3: return( "TLSv1.2" ); default: return( "unknown" ); } } int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl ) { size_t transform_expansion = 0; const mbedtls_ssl_transform *transform = ssl->transform_out; unsigned block_size; if( transform == NULL ) return( (int) mbedtls_ssl_hdr_len( ssl ) ); #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL ) return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); #endif switch( mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc ) ) { case MBEDTLS_MODE_GCM: case MBEDTLS_MODE_CCM: case MBEDTLS_MODE_CHACHAPOLY: case MBEDTLS_MODE_STREAM: transform_expansion = transform->minlen; break; case MBEDTLS_MODE_CBC: block_size = mbedtls_cipher_get_block_size( &transform->cipher_ctx_enc ); /* Expansion due to the addition of the MAC. */ transform_expansion += transform->maclen; /* Expansion due to the addition of CBC padding; * Theoretically up to 256 bytes, but we never use * more than the block size of the underlying cipher. */ transform_expansion += block_size; /* For TLS 1.1 or higher, an explicit IV is added * after the record header. */ #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) transform_expansion += block_size; #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ break; default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } return( (int)( mbedtls_ssl_hdr_len( ssl ) + transform_expansion ) ); } #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl ) { size_t max_len; /* * Assume mfl_code is correct since it was checked when set */ max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code ); /* Check if a smaller max length was negotiated */ if( ssl->session_out != NULL && ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len ) { max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code ); } /* During a handshake, use the value being negotiated */ if( ssl->session_negotiate != NULL && ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len ) { max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ); } return( max_len ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_PROTO_DTLS) static size_t ssl_get_current_mtu( const mbedtls_ssl_context *ssl ) { /* Return unlimited mtu for client hello messages to avoid fragmentation. */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO || ssl->state == MBEDTLS_SSL_SERVER_HELLO ) ) return ( 0 ); if( ssl->handshake == NULL || ssl->handshake->mtu == 0 ) return( ssl->mtu ); if( ssl->mtu == 0 ) return( ssl->handshake->mtu ); return( ssl->mtu < ssl->handshake->mtu ? ssl->mtu : ssl->handshake->mtu ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl ) { size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN; #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \ !defined(MBEDTLS_SSL_PROTO_DTLS) (void) ssl; #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) const size_t mfl = mbedtls_ssl_get_max_frag_len( ssl ); if( max_len > mfl ) max_len = mfl; #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl_get_current_mtu( ssl ) != 0 ) { const size_t mtu = ssl_get_current_mtu( ssl ); const int ret = mbedtls_ssl_get_record_expansion( ssl ); const size_t overhead = (size_t) ret; if( ret < 0 ) return( ret ); if( mtu <= overhead ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } if( max_len > mtu - overhead ) max_len = mtu - overhead; } #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \ !defined(MBEDTLS_SSL_PROTO_DTLS) ((void) ssl); #endif return( (int) max_len ); } #if defined(MBEDTLS_X509_CRT_PARSE_C) const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl ) { if( ssl == NULL || ssl->session == NULL ) return( NULL ); return( ssl->session->peer_cert ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_CLI_C) int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *dst ) { if( ssl == NULL || dst == NULL || ssl->session == NULL || ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } return( ssl_session_copy( dst, ssl->session ) ); } #endif /* MBEDTLS_SSL_CLI_C */ /* * Perform a single step of the SSL handshake */ int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ret = mbedtls_ssl_handshake_client_step( ssl ); #endif #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ret = mbedtls_ssl_handshake_server_step( ssl ); #endif return( ret ); } /* * Perform the SSL handshake */ int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ) { int ret = 0; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) ); while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { ret = mbedtls_ssl_handshake_step( ssl ); if( ret != 0 ) break; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) ); return( ret ); } #if defined(MBEDTLS_SSL_RENEGOTIATION) #if defined(MBEDTLS_SSL_SRV_C) /* * Write HelloRequest to request renegotiation on server */ static int ssl_write_hello_request( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) ); ssl->out_msglen = 4; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SRV_C */ /* * Actually renegotiate current connection, triggered by either: * - any side: calling mbedtls_ssl_renegotiate(), * - client: receiving a HelloRequest during mbedtls_ssl_read(), * - server: receiving any handshake message on server during mbedtls_ssl_read() after * the initial handshake is completed. * If the handshake doesn't complete due to waiting for I/O, it will continue * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively. */ static int ssl_start_renegotiation( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) ); if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) return( ret ); /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and * the ServerHello will have message_seq = 1" */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ssl->handshake->out_msg_seq = 1; else ssl->handshake->in_msg_seq = 1; } #endif ssl->state = MBEDTLS_SSL_HELLO_REQUEST; ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS; if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) ); return( 0 ); } /* * Renegotiate current connection on client, * or request renegotiation on server */ int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_SSL_SRV_C) /* On server, just send the request */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) { if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; /* Did we already try/start sending HelloRequest? */ if( ssl->out_left != 0 ) return( mbedtls_ssl_flush_output( ssl ) ); return( ssl_write_hello_request( ssl ) ); } #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_CLI_C) /* * On client, either start the renegotiation process or, * if already in progress, continue the handshake */ if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret ); return( ret ); } } else { if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_CLI_C */ return( ret ); } /* * Check record counters and renegotiate if they're above the limit. */ static int ssl_check_ctr_renegotiate( mbedtls_ssl_context *ssl ) { size_t ep_len = ssl_ep_len( ssl ); int in_ctr_cmp; int out_ctr_cmp; if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER || ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING || ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED ) { return( 0 ); } in_ctr_cmp = memcmp( ssl->in_ctr + ep_len, ssl->conf->renego_period + ep_len, 8 - ep_len ); out_ctr_cmp = memcmp( ssl->cur_out_ctr + ep_len, ssl->conf->renego_period + ep_len, 8 - ep_len ); if( in_ctr_cmp <= 0 && out_ctr_cmp <= 0 ) { return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "record counter limit reached: renegotiate" ) ); return( mbedtls_ssl_renegotiate( ssl ) ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* * Receive application data decrypted from the SSL layer */ int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ) { int ret; size_t n; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read" ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); if( ssl->handshake != NULL && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) return( ret ); } } #endif /* * Check if renegotiation is necessary and/or handshake is * in process. If yes, perform/continue, and fall through * if an unexpected packet is received while the client * is waiting for the ServerHello. * * (There is no equivalent to the last condition on * the server-side as it is not treated as within * a handshake while waiting for the ClientHello * after a renegotiation request.) */ #if defined(MBEDTLS_SSL_RENEGOTIATION) ret = ssl_check_ctr_renegotiate( ssl ); if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret ); return( ret ); } #endif if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { ret = mbedtls_ssl_handshake( ssl ); if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } } /* Loop as long as no application data record is available */ while( ssl->in_offt == NULL ) { /* Start timer if not already running */ if( ssl->f_get_timer != NULL && ssl->f_get_timer( ssl->p_timer ) == -1 ) { ssl_set_timer( ssl, ssl->conf->read_timeout ); } if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { if( ret == MBEDTLS_ERR_SSL_CONN_EOF ) return( 0 ); MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msglen == 0 && ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA ) { /* * OpenSSL sends empty messages to randomize the IV */ if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { if( ret == MBEDTLS_ERR_SSL_CONN_EOF ) return( 0 ); MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received handshake message" ) ); /* * - For client-side, expect SERVER_HELLO_REQUEST. * - For server-side, expect CLIENT_HELLO. * - Fail (TLS) or silently drop record (DTLS) in other cases. */ #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && ( ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST || ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) ); /* With DTLS, drop the packet (probably from last handshake) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { continue; } #endif return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not ClientHello)" ) ); /* With DTLS, drop the packet (probably from last handshake) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { continue; } #endif return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_RENEGOTIATION) /* Determine whether renegotiation attempt should be accepted */ if( ! ( ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED || ( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) ) ) { /* * Accept renegotiation request */ /* DTLS clients need to know renego is server-initiated */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) { ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; } #endif ret = ssl_start_renegotiation( ssl ); if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret ); return( ret ); } } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { /* * Refuse renegotiation */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "refusing renegotiation, sending alert" ) ); #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { /* SSLv3 does not have a "no_renegotiation" warning, so we send a fatal alert and abort the connection. */ mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) { if( ( ret = mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_WARNING, MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 ) { return( ret ); } } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } /* At this point, we don't know whether the renegotiation has been * completed or not. The cases to consider are the following: * 1) The renegotiation is complete. In this case, no new record * has been read yet. * 2) The renegotiation is incomplete because the client received * an application data record while awaiting the ServerHello. * 3) The renegotiation is incomplete because the client received * a non-handshake, non-application data message while awaiting * the ServerHello. * In each of these case, looping will be the proper action: * - For 1), the next iteration will read a new record and check * if it's application data. * - For 2), the loop condition isn't satisfied as application data * is present, hence continue is the same as break * - For 3), the loop condition is satisfied and read_record * will re-deliver the message that was held back by the client * when expecting the ServerHello. */ continue; } #if defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ssl->conf->renego_max_records >= 0 ) { if( ++ssl->renego_records_seen > ssl->conf->renego_max_records ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, " "but not honored by client" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } } } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* Fatal and closure alerts handled by mbedtls_ssl_read_record() */ if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "ignoring non-fatal non-closure alert" ) ); return( MBEDTLS_ERR_SSL_WANT_READ ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad application data message" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } ssl->in_offt = ssl->in_msg; /* We're going to return something now, cancel timer, * except if handshake (renegotiation) is in progress */ if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) ssl_set_timer( ssl, 0 ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /* If we requested renego but received AppData, resend HelloRequest. * Do it now, after setting in_offt, to avoid taking this branch * again if ssl_write_hello_request() returns WANT_WRITE */ #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ } n = ( len < ssl->in_msglen ) ? len : ssl->in_msglen; memcpy( buf, ssl->in_offt, n ); ssl->in_msglen -= n; if( ssl->in_msglen == 0 ) { /* all bytes consumed */ ssl->in_offt = NULL; ssl->keep_current_message = 0; } else { /* more data available */ ssl->in_offt += n; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read" ) ); return( (int) n ); } /* * Send application data to be encrypted by the SSL layer, taking care of max * fragment length and buffer size. * * According to RFC 5246 Section 6.2.1: * * Zero-length fragments of Application data MAY be sent as they are * potentially useful as a traffic analysis countermeasure. * * Therefore, it is possible that the input message length is 0 and the * corresponding return code is 0 on success. */ static int ssl_write_real( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret = mbedtls_ssl_get_max_out_record_payload( ssl ); const size_t max_len = (size_t) ret; if( ret < 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_get_max_out_record_payload", ret ); return( ret ); } if( len > max_len ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "fragment larger than the (negotiated) " "maximum fragment length: %d > %d", len, max_len ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } else #endif len = max_len; } if( ssl->out_left != 0 ) { /* * The user has previously tried to send the data and * MBEDTLS_ERR_SSL_WANT_WRITE or the message was only partially * written. In this case, we expect the high-level write function * (e.g. mbedtls_ssl_write()) to be called with the same parameters */ if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret ); return( ret ); } } else { /* * The user is trying to send a message the first time, so we need to * copy the data into the internal buffers and setup the data structure * to keep track of partial writes */ ssl->out_msglen = len; ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA; memcpy( ssl->out_msg, buf, len ); if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); return( ret ); } } return( (int) len ); } /* * Write application data, doing 1/n-1 splitting if necessary. * * With non-blocking I/O, ssl_write_real() may return WANT_WRITE, * then the caller will call us again with the same arguments, so * remember whether we already did the split or not. */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) static int ssl_write_split( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; if( ssl->conf->cbc_record_splitting == MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED || len <= 1 || ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_1 || mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc ) != MBEDTLS_MODE_CBC ) { return( ssl_write_real( ssl, buf, len ) ); } if( ssl->split_done == 0 ) { if( ( ret = ssl_write_real( ssl, buf, 1 ) ) <= 0 ) return( ret ); ssl->split_done = 1; } if( ( ret = ssl_write_real( ssl, buf + 1, len - 1 ) ) <= 0 ) return( ret ); ssl->split_done = 0; return( ret + 1 ); } #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ /* * Write application data (public-facing wrapper) */ int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write" ) ); if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ( ret = ssl_check_ctr_renegotiate( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret ); return( ret ); } #endif if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } } #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) ret = ssl_write_split( ssl, buf, len ); #else ret = ssl_write_real( ssl, buf, len ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write" ) ); return( ret ); } /* * Notify the peer that the connection is being closed */ int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl ) { int ret; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write close notify" ) ); if( ssl->out_left != 0 ) return( mbedtls_ssl_flush_output( ssl ) ); if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) { if( ( ret = mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_WARNING, MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_send_alert_message", ret ); return( ret ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write close notify" ) ); return( 0 ); } void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform ) { if( transform == NULL ) return; #if defined(MBEDTLS_ZLIB_SUPPORT) deflateEnd( &transform->ctx_deflate ); inflateEnd( &transform->ctx_inflate ); #endif mbedtls_cipher_free( &transform->cipher_ctx_enc ); mbedtls_cipher_free( &transform->cipher_ctx_dec ); mbedtls_md_free( &transform->md_ctx_enc ); mbedtls_md_free( &transform->md_ctx_dec ); mbedtls_platform_zeroize( transform, sizeof( mbedtls_ssl_transform ) ); } #if defined(MBEDTLS_X509_CRT_PARSE_C) static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert ) { mbedtls_ssl_key_cert *cur = key_cert, *next; while( cur != NULL ) { next = cur->next; mbedtls_free( cur ); cur = next; } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_PROTO_DTLS) static void ssl_buffering_free( mbedtls_ssl_context *ssl ) { unsigned offset; mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( hs == NULL ) return; ssl_free_buffered_record( ssl ); for( offset = 0; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++ ) ssl_buffering_free_slot( ssl, offset ); } static void ssl_buffering_free_slot( mbedtls_ssl_context *ssl, uint8_t slot ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; mbedtls_ssl_hs_buffer * const hs_buf = &hs->buffering.hs[slot]; if( slot >= MBEDTLS_SSL_MAX_BUFFERED_HS ) return; if( hs_buf->is_valid == 1 ) { hs->buffering.total_bytes_buffered -= hs_buf->data_len; mbedtls_platform_zeroize( hs_buf->data, hs_buf->data_len ); mbedtls_free( hs_buf->data ); memset( hs_buf, 0, sizeof( mbedtls_ssl_hs_buffer ) ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params *handshake = ssl->handshake; if( handshake == NULL ) return; #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 ) { ssl->conf->f_async_cancel( ssl ); handshake->async_in_progress = 0; } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_free( &handshake->fin_md5 ); mbedtls_sha1_free( &handshake->fin_sha1 ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_free( &handshake->fin_sha256 ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_free( &handshake->fin_sha512 ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_DHM_C) mbedtls_dhm_free( &handshake->dhm_ctx ); #endif #if defined(MBEDTLS_ECDH_C) mbedtls_ecdh_free( &handshake->ecdh_ctx ); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) mbedtls_ecjpake_free( &handshake->ecjpake_ctx ); #if defined(MBEDTLS_SSL_CLI_C) mbedtls_free( handshake->ecjpake_cache ); handshake->ecjpake_cache = NULL; handshake->ecjpake_cache_len = 0; #endif #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) /* explicit void pointer cast for buggy MS compiler */ mbedtls_free( (void *) handshake->curves ); #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( handshake->psk != NULL ) { mbedtls_platform_zeroize( handshake->psk, handshake->psk_len ); mbedtls_free( handshake->psk ); } #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) && \ defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) /* * Free only the linked list wrapper, not the keys themselves * since the belong to the SNI callback */ if( handshake->sni_key_cert != NULL ) { mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next; while( cur != NULL ) { next = cur->next; mbedtls_free( cur ); cur = next; } } #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx ); #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) mbedtls_free( handshake->verify_cookie ); ssl_flight_free( handshake->flight ); ssl_buffering_free( ssl ); #endif mbedtls_platform_zeroize( handshake, sizeof( mbedtls_ssl_handshake_params ) ); } void mbedtls_ssl_session_free( mbedtls_ssl_session *session ) { if( session == NULL ) return; #if defined(MBEDTLS_X509_CRT_PARSE_C) if( session->peer_cert != NULL ) { mbedtls_x509_crt_free( session->peer_cert ); mbedtls_free( session->peer_cert ); } #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) mbedtls_free( session->ticket ); #endif mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) ); } /* * Free an SSL context */ void mbedtls_ssl_free( mbedtls_ssl_context *ssl ) { if( ssl == NULL ) return; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) ); if( ssl->out_buf != NULL ) { mbedtls_platform_zeroize( ssl->out_buf, MBEDTLS_SSL_OUT_BUFFER_LEN ); mbedtls_free( ssl->out_buf ); } if( ssl->in_buf != NULL ) { mbedtls_platform_zeroize( ssl->in_buf, MBEDTLS_SSL_IN_BUFFER_LEN ); mbedtls_free( ssl->in_buf ); } #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->compress_buf != NULL ) { mbedtls_platform_zeroize( ssl->compress_buf, MBEDTLS_SSL_COMPRESS_BUFFER_LEN ); mbedtls_free( ssl->compress_buf ); } #endif if( ssl->transform ) { mbedtls_ssl_transform_free( ssl->transform ); mbedtls_free( ssl->transform ); } if( ssl->handshake ) { mbedtls_ssl_handshake_free( ssl ); mbedtls_ssl_transform_free( ssl->transform_negotiate ); mbedtls_ssl_session_free( ssl->session_negotiate ); mbedtls_free( ssl->handshake ); mbedtls_free( ssl->transform_negotiate ); mbedtls_free( ssl->session_negotiate ); } if( ssl->session ) { mbedtls_ssl_session_free( ssl->session ); mbedtls_free( ssl->session ); } #if defined(MBEDTLS_X509_CRT_PARSE_C) if( ssl->hostname != NULL ) { mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) ); mbedtls_free( ssl->hostname ); } #endif #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_finish != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) ); mbedtls_ssl_hw_record_finish( ssl ); } #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) mbedtls_free( ssl->cli_id ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) ); /* Actually clear after last debug message */ mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) ); } /* * Initialze mbedtls_ssl_config */ void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ) { memset( conf, 0, sizeof( mbedtls_ssl_config ) ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) static int ssl_preset_default_hashes[] = { #if defined(MBEDTLS_SHA512_C) MBEDTLS_MD_SHA512, MBEDTLS_MD_SHA384, #endif #if defined(MBEDTLS_SHA256_C) MBEDTLS_MD_SHA256, MBEDTLS_MD_SHA224, #endif #if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE) MBEDTLS_MD_SHA1, #endif MBEDTLS_MD_NONE }; #endif static int ssl_preset_suiteb_ciphersuites[] = { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 0 }; #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) static int ssl_preset_suiteb_hashes[] = { MBEDTLS_MD_SHA256, MBEDTLS_MD_SHA384, MBEDTLS_MD_NONE }; #endif #if defined(MBEDTLS_ECP_C) static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = { MBEDTLS_ECP_DP_SECP256R1, MBEDTLS_ECP_DP_SECP384R1, MBEDTLS_ECP_DP_NONE }; #endif /* * Load default in mbedtls_ssl_config */ int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf, int endpoint, int transport, int preset ) { #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) int ret; #endif /* Use the functions here so that they are covered in tests, * but otherwise access member directly for efficiency */ mbedtls_ssl_conf_endpoint( conf, endpoint ); mbedtls_ssl_conf_transport( conf, transport ); /* * Things that are common to all presets */ #if defined(MBEDTLS_SSL_CLI_C) if( endpoint == MBEDTLS_SSL_IS_CLIENT ) { conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED; #if defined(MBEDTLS_SSL_SESSION_TICKETS) conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED; #endif } #endif #if defined(MBEDTLS_ARC4_C) conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED; #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; #endif #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED; #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) conf->f_cookie_write = ssl_cookie_write_dummy; conf->f_cookie_check = ssl_cookie_check_dummy; #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED; #endif #if defined(MBEDTLS_SSL_SRV_C) conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED; #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN; conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX; #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT; memset( conf->renego_period, 0x00, 2 ); memset( conf->renego_period + 2, 0xFF, 6 ); #endif #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) if( endpoint == MBEDTLS_SSL_IS_SERVER ) { const unsigned char dhm_p[] = MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN; const unsigned char dhm_g[] = MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN; if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf, dhm_p, sizeof( dhm_p ), dhm_g, sizeof( dhm_g ) ) ) != 0 ) { return( ret ); } } #endif /* * Preset-specific defaults */ switch( preset ) { /* * NSA Suite B */ case MBEDTLS_SSL_PRESET_SUITEB: conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */ conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ssl_preset_suiteb_ciphersuites; #if defined(MBEDTLS_X509_CRT_PARSE_C) conf->cert_profile = &mbedtls_x509_crt_profile_suiteb; #endif #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) conf->sig_hashes = ssl_preset_suiteb_hashes; #endif #if defined(MBEDTLS_ECP_C) conf->curve_list = ssl_preset_suiteb_curves; #endif break; /* * Default */ default: conf->min_major_ver = ( MBEDTLS_SSL_MIN_MAJOR_VERSION > MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION ) ? MBEDTLS_SSL_MIN_MAJOR_VERSION : MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION; conf->min_minor_ver = ( MBEDTLS_SSL_MIN_MINOR_VERSION > MBEDTLS_SSL_MIN_VALID_MINOR_VERSION ) ? MBEDTLS_SSL_MIN_MINOR_VERSION : MBEDTLS_SSL_MIN_VALID_MINOR_VERSION; conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2; #endif conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = mbedtls_ssl_list_ciphersuites(); #if defined(MBEDTLS_X509_CRT_PARSE_C) conf->cert_profile = &mbedtls_x509_crt_profile_default; #endif #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) conf->sig_hashes = ssl_preset_default_hashes; #endif #if defined(MBEDTLS_ECP_C) conf->curve_list = mbedtls_ecp_grp_id_list(); #endif #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) conf->dhm_min_bitlen = 1024; #endif } return( 0 ); } /* * Free mbedtls_ssl_config */ void mbedtls_ssl_config_free( mbedtls_ssl_config *conf ) { #if defined(MBEDTLS_DHM_C) mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( conf->psk != NULL ) { mbedtls_platform_zeroize( conf->psk, conf->psk_len ); mbedtls_free( conf->psk ); conf->psk = NULL; conf->psk_len = 0; } if( conf->psk_identity != NULL ) { mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len ); mbedtls_free( conf->psk_identity ); conf->psk_identity = NULL; conf->psk_identity_len = 0; } #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) ssl_key_cert_free( conf->key_cert ); #endif mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) ); } #if defined(MBEDTLS_PK_C) && \ ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) ) /* * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX */ unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk ) { #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) ) return( MBEDTLS_SSL_SIG_RSA ); #endif #if defined(MBEDTLS_ECDSA_C) if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) ) return( MBEDTLS_SSL_SIG_ECDSA ); #endif return( MBEDTLS_SSL_SIG_ANON ); } unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type ) { switch( type ) { case MBEDTLS_PK_RSA: return( MBEDTLS_SSL_SIG_RSA ); case MBEDTLS_PK_ECDSA: case MBEDTLS_PK_ECKEY: return( MBEDTLS_SSL_SIG_ECDSA ); default: return( MBEDTLS_SSL_SIG_ANON ); } } mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig ) { switch( sig ) { #if defined(MBEDTLS_RSA_C) case MBEDTLS_SSL_SIG_RSA: return( MBEDTLS_PK_RSA ); #endif #if defined(MBEDTLS_ECDSA_C) case MBEDTLS_SSL_SIG_ECDSA: return( MBEDTLS_PK_ECDSA ); #endif default: return( MBEDTLS_PK_NONE ); } } #endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* Find an entry in a signature-hash set matching a given hash algorithm. */ mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg ) { switch( sig_alg ) { case MBEDTLS_PK_RSA: return( set->rsa ); case MBEDTLS_PK_ECDSA: return( set->ecdsa ); default: return( MBEDTLS_MD_NONE ); } } /* Add a signature-hash-pair to a signature-hash set */ void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg, mbedtls_md_type_t md_alg ) { switch( sig_alg ) { case MBEDTLS_PK_RSA: if( set->rsa == MBEDTLS_MD_NONE ) set->rsa = md_alg; break; case MBEDTLS_PK_ECDSA: if( set->ecdsa == MBEDTLS_MD_NONE ) set->ecdsa = md_alg; break; default: break; } } /* Allow exactly one hash algorithm for each signature. */ void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set, mbedtls_md_type_t md_alg ) { set->rsa = md_alg; set->ecdsa = md_alg; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2) && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /* * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX */ mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash ) { switch( hash ) { #if defined(MBEDTLS_MD5_C) case MBEDTLS_SSL_HASH_MD5: return( MBEDTLS_MD_MD5 ); #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_SSL_HASH_SHA1: return( MBEDTLS_MD_SHA1 ); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_SSL_HASH_SHA224: return( MBEDTLS_MD_SHA224 ); case MBEDTLS_SSL_HASH_SHA256: return( MBEDTLS_MD_SHA256 ); #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_SSL_HASH_SHA384: return( MBEDTLS_MD_SHA384 ); case MBEDTLS_SSL_HASH_SHA512: return( MBEDTLS_MD_SHA512 ); #endif default: return( MBEDTLS_MD_NONE ); } } /* * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX */ unsigned char mbedtls_ssl_hash_from_md_alg( int md ) { switch( md ) { #if defined(MBEDTLS_MD5_C) case MBEDTLS_MD_MD5: return( MBEDTLS_SSL_HASH_MD5 ); #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_MD_SHA1: return( MBEDTLS_SSL_HASH_SHA1 ); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA224: return( MBEDTLS_SSL_HASH_SHA224 ); case MBEDTLS_MD_SHA256: return( MBEDTLS_SSL_HASH_SHA256 ); #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_MD_SHA384: return( MBEDTLS_SSL_HASH_SHA384 ); case MBEDTLS_MD_SHA512: return( MBEDTLS_SSL_HASH_SHA512 ); #endif default: return( MBEDTLS_SSL_HASH_NONE ); } } #if defined(MBEDTLS_ECP_C) /* * Check if a curve proposed by the peer is in our list. * Return 0 if we're willing to use it, -1 otherwise. */ int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id ) { const mbedtls_ecp_group_id *gid; if( ssl->conf->curve_list == NULL ) return( -1 ); for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ ) if( *gid == grp_id ) return( 0 ); return( -1 ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Check if a hash proposed by the peer is in our list. * Return 0 if we're willing to use it, -1 otherwise. */ int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl, mbedtls_md_type_t md ) { const int *cur; if( ssl->conf->sig_hashes == NULL ) return( -1 ); for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ ) if( *cur == (int) md ) return( 0 ); return( -1 ); } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_X509_CRT_PARSE_C) int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert, const mbedtls_ssl_ciphersuite_t *ciphersuite, int cert_endpoint, uint32_t *flags ) { int ret = 0; #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) int usage = 0; #endif #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) const char *ext_oid; size_t ext_len; #endif #if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \ !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) ((void) cert); ((void) cert_endpoint); ((void) flags); #endif #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) if( cert_endpoint == MBEDTLS_SSL_IS_SERVER ) { /* Server part of the key exchange */ switch( ciphersuite->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT; break; case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; break; case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: usage = MBEDTLS_X509_KU_KEY_AGREEMENT; break; /* Don't use default: we want warnings when adding new values */ case MBEDTLS_KEY_EXCHANGE_NONE: case MBEDTLS_KEY_EXCHANGE_PSK: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECJPAKE: usage = 0; } } else { /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */ usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; } if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 ) { *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE; ret = -1; } #else ((void) ciphersuite); #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */ #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) if( cert_endpoint == MBEDTLS_SSL_IS_SERVER ) { ext_oid = MBEDTLS_OID_SERVER_AUTH; ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH ); } else { ext_oid = MBEDTLS_OID_CLIENT_AUTH; ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH ); } if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 ) { *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE; ret = -1; } #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ return( ret ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ /* * Convert version numbers to/from wire format * and, for DTLS, to/from TLS equivalent. * * For TLS this is the identity. * For DTLS, use 1's complement (v -> 255 - v, and then map as follows: * 1.0 <-> 3.2 (DTLS 1.0 is based on TLS 1.1) * 1.x <-> 3.x+1 for x != 0 (DTLS 1.2 based on TLS 1.2) */ void mbedtls_ssl_write_version( int major, int minor, int transport, unsigned char ver[2] ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( minor == MBEDTLS_SSL_MINOR_VERSION_2 ) --minor; /* DTLS 1.0 stored as TLS 1.1 internally */ ver[0] = (unsigned char)( 255 - ( major - 2 ) ); ver[1] = (unsigned char)( 255 - ( minor - 1 ) ); } else #else ((void) transport); #endif { ver[0] = (unsigned char) major; ver[1] = (unsigned char) minor; } } void mbedtls_ssl_read_version( int *major, int *minor, int transport, const unsigned char ver[2] ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { *major = 255 - ver[0] + 2; *minor = 255 - ver[1] + 1; if( *minor == MBEDTLS_SSL_MINOR_VERSION_1 ) ++*minor; /* DTLS 1.0 stored as TLS 1.1 internally */ } else #else ((void) transport); #endif { *major = ver[0]; *minor = ver[1]; } } int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md ) { #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; switch( md ) { #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) #if defined(MBEDTLS_MD5_C) case MBEDTLS_SSL_HASH_MD5: return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_SSL_HASH_SHA1: ssl->handshake->calc_verify = ssl_calc_verify_tls; break; #endif #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SHA512_C) case MBEDTLS_SSL_HASH_SHA384: ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384; break; #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_SSL_HASH_SHA256: ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256; break; #endif default: return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; } return 0; #else /* !MBEDTLS_SSL_PROTO_TLS1_2 */ (void) ssl; (void) md; return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl, unsigned char *output, unsigned char *data, size_t data_len ) { int ret = 0; mbedtls_md5_context mbedtls_md5; mbedtls_sha1_context mbedtls_sha1; mbedtls_md5_init( &mbedtls_md5 ); mbedtls_sha1_init( &mbedtls_sha1 ); /* * digitally-signed struct { * opaque md5_hash[16]; * opaque sha_hash[20]; * }; * * md5_hash * MD5(ClientHello.random + ServerHello.random * + ServerParams); * sha_hash * SHA(ClientHello.random + ServerHello.random * + ServerParams); */ if( ( ret = mbedtls_md5_starts_ret( &mbedtls_md5 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_starts_ret", ret ); goto exit; } if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, ssl->handshake->randbytes, 64 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret ); goto exit; } if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, data, data_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret ); goto exit; } if( ( ret = mbedtls_md5_finish_ret( &mbedtls_md5, output ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_finish_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_starts_ret( &mbedtls_sha1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_starts_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, ssl->handshake->randbytes, 64 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, data, data_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_finish_ret( &mbedtls_sha1, output + 16 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_finish_ret", ret ); goto exit; } exit: mbedtls_md5_free( &mbedtls_md5 ); mbedtls_sha1_free( &mbedtls_sha1 ); if( ret != 0 ) mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl, unsigned char *hash, size_t *hashlen, unsigned char *data, size_t data_len, mbedtls_md_type_t md_alg ) { int ret = 0; mbedtls_md_context_t ctx; const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); *hashlen = mbedtls_md_get_size( md_info ); mbedtls_md_init( &ctx ); /* * digitally-signed struct { * opaque client_random[32]; * opaque server_random[32]; * ServerDHParams params; * }; */ if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret ); goto exit; } if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret ); goto exit; } if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret ); goto exit; } if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret ); goto exit; } if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret ); goto exit; } exit: mbedtls_md_free( &ctx ); if( ret != 0 ) mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ #endif /* MBEDTLS_SSL_TLS_C */ fldigi-4.1.06/src/mbedtls/platform.c0000664000175000017500000002316613507401434014205 00000000000000/* * Platform abstraction layer * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #include "mbedtls/platform_util.h" /* The compile time configuration of memory allocation via the macros * MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO takes precedence over the runtime * configuration via mbedtls_platform_set_calloc_free(). So, omit everything * related to the latter if MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO are defined. */ #if defined(MBEDTLS_PLATFORM_MEMORY) && \ !( defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && \ defined(MBEDTLS_PLATFORM_FREE_MACRO) ) #if !defined(MBEDTLS_PLATFORM_STD_CALLOC) static void *platform_calloc_uninit( size_t n, size_t size ) { ((void) n); ((void) size); return( NULL ); } #define MBEDTLS_PLATFORM_STD_CALLOC platform_calloc_uninit #endif /* !MBEDTLS_PLATFORM_STD_CALLOC */ #if !defined(MBEDTLS_PLATFORM_STD_FREE) static void platform_free_uninit( void *ptr ) { ((void) ptr); } #define MBEDTLS_PLATFORM_STD_FREE platform_free_uninit #endif /* !MBEDTLS_PLATFORM_STD_FREE */ static void * (*mbedtls_calloc_func)( size_t, size_t ) = MBEDTLS_PLATFORM_STD_CALLOC; static void (*mbedtls_free_func)( void * ) = MBEDTLS_PLATFORM_STD_FREE; void * mbedtls_calloc( size_t nmemb, size_t size ) { return (*mbedtls_calloc_func)( nmemb, size ); } void mbedtls_free( void * ptr ) { (*mbedtls_free_func)( ptr ); } int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), void (*free_func)( void * ) ) { mbedtls_calloc_func = calloc_func; mbedtls_free_func = free_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_MEMORY && !( defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && defined(MBEDTLS_PLATFORM_FREE_MACRO) ) */ #if defined(_WIN32) #include int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... ) { int ret; va_list argp; /* Avoid calling the invalid parameter handler by checking ourselves */ if( s == NULL || n == 0 || fmt == NULL ) return( -1 ); va_start( argp, fmt ); #if defined(_TRUNCATE) && !defined(__MINGW32__) ret = _vsnprintf_s( s, n, _TRUNCATE, fmt, argp ); #else ret = _vsnprintf( s, n, fmt, argp ); if( ret < 0 || (size_t) ret == n ) { s[n-1] = '\0'; ret = -1; } #endif va_end( argp ); return( ret ); } #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_snprintf_uninit( char * s, size_t n, const char * format, ... ) { ((void) s); ((void) n); ((void) format); return( 0 ); } #define MBEDTLS_PLATFORM_STD_SNPRINTF platform_snprintf_uninit #endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */ int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... ) = MBEDTLS_PLATFORM_STD_SNPRINTF; int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n, const char * format, ... ) ) { mbedtls_snprintf = snprintf_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) #if !defined(MBEDTLS_PLATFORM_STD_PRINTF) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_printf_uninit( const char *format, ... ) { ((void) format); return( 0 ); } #define MBEDTLS_PLATFORM_STD_PRINTF platform_printf_uninit #endif /* !MBEDTLS_PLATFORM_STD_PRINTF */ int (*mbedtls_printf)( const char *, ... ) = MBEDTLS_PLATFORM_STD_PRINTF; int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) ) { mbedtls_printf = printf_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_fprintf_uninit( FILE *stream, const char *format, ... ) { ((void) stream); ((void) format); return( 0 ); } #define MBEDTLS_PLATFORM_STD_FPRINTF platform_fprintf_uninit #endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */ int (*mbedtls_fprintf)( FILE *, const char *, ... ) = MBEDTLS_PLATFORM_STD_FPRINTF; int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *, const char *, ... ) ) { mbedtls_fprintf = fprintf_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_EXIT_ALT) #if !defined(MBEDTLS_PLATFORM_STD_EXIT) /* * Make dummy function to prevent NULL pointer dereferences */ static void platform_exit_uninit( int status ) { ((void) status); } #define MBEDTLS_PLATFORM_STD_EXIT platform_exit_uninit #endif /* !MBEDTLS_PLATFORM_STD_EXIT */ void (*mbedtls_exit)( int status ) = MBEDTLS_PLATFORM_STD_EXIT; int mbedtls_platform_set_exit( void (*exit_func)( int status ) ) { mbedtls_exit = exit_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_EXIT_ALT */ #if defined(MBEDTLS_HAVE_TIME) #if defined(MBEDTLS_PLATFORM_TIME_ALT) #if !defined(MBEDTLS_PLATFORM_STD_TIME) /* * Make dummy function to prevent NULL pointer dereferences */ static mbedtls_time_t platform_time_uninit( mbedtls_time_t* timer ) { ((void) timer); return( 0 ); } #define MBEDTLS_PLATFORM_STD_TIME platform_time_uninit #endif /* !MBEDTLS_PLATFORM_STD_TIME */ mbedtls_time_t (*mbedtls_time)( mbedtls_time_t* timer ) = MBEDTLS_PLATFORM_STD_TIME; int mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* timer ) ) { mbedtls_time = time_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_TIME_ALT */ #endif /* MBEDTLS_HAVE_TIME */ #if defined(MBEDTLS_ENTROPY_NV_SEED) #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO) /* Default implementations for the platform independent seed functions use * standard libc file functions to read from and write to a pre-defined filename */ int mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len ) { FILE *file; size_t n; if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb" ) ) == NULL ) return( -1 ); if( ( n = fread( buf, 1, buf_len, file ) ) != buf_len ) { fclose( file ); mbedtls_platform_zeroize( buf, buf_len ); return( -1 ); } fclose( file ); return( (int)n ); } int mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len ) { FILE *file; size_t n; if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w" ) ) == NULL ) return -1; if( ( n = fwrite( buf, 1, buf_len, file ) ) != buf_len ) { fclose( file ); return -1; } fclose( file ); return( (int)n ); } #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_nv_seed_read_uninit( unsigned char *buf, size_t buf_len ) { ((void) buf); ((void) buf_len); return( -1 ); } #define MBEDTLS_PLATFORM_STD_NV_SEED_READ platform_nv_seed_read_uninit #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_READ */ #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_nv_seed_write_uninit( unsigned char *buf, size_t buf_len ) { ((void) buf); ((void) buf_len); return( -1 ); } #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE platform_nv_seed_write_uninit #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_WRITE */ int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ) = MBEDTLS_PLATFORM_STD_NV_SEED_READ; int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ) = MBEDTLS_PLATFORM_STD_NV_SEED_WRITE; int mbedtls_platform_set_nv_seed( int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ), int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) ) { mbedtls_nv_seed_read = nv_seed_read_func; mbedtls_nv_seed_write = nv_seed_write_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) /* * Placeholder platform setup that does nothing by default */ int mbedtls_platform_setup( mbedtls_platform_context *ctx ) { (void)ctx; return( 0 ); } /* * Placeholder platform teardown that does nothing by default */ void mbedtls_platform_teardown( mbedtls_platform_context *ctx ) { (void)ctx; } #endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ #endif /* MBEDTLS_PLATFORM_C */ fldigi-4.1.06/src/mbedtls/ssl_cookie.c0000664000175000017500000001646413507401434014516 00000000000000/* * DTLS cookie callbacks implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * These session callbacks use a simple chained list * to store and retrieve the session information. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_COOKIE_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ssl_cookie.h" #include "mbedtls/ssl_internal.h" #include "mbedtls/platform_util.h" #include /* * If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is * available. Try SHA-256 first, 512 wastes resources since we need to stay * with max 32 bytes of cookie for DTLS 1.0 */ #if defined(MBEDTLS_SHA256_C) #define COOKIE_MD MBEDTLS_MD_SHA224 #define COOKIE_MD_OUTLEN 32 #define COOKIE_HMAC_LEN 28 #elif defined(MBEDTLS_SHA512_C) #define COOKIE_MD MBEDTLS_MD_SHA384 #define COOKIE_MD_OUTLEN 48 #define COOKIE_HMAC_LEN 28 #elif defined(MBEDTLS_SHA1_C) #define COOKIE_MD MBEDTLS_MD_SHA1 #define COOKIE_MD_OUTLEN 20 #define COOKIE_HMAC_LEN 20 #else #error "DTLS hello verify needs SHA-1 or SHA-2" #endif /* * Cookies are formed of a 4-bytes timestamp (or serial number) and * an HMAC of timestemp and client ID. */ #define COOKIE_LEN ( 4 + COOKIE_HMAC_LEN ) void mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx ) { mbedtls_md_init( &ctx->hmac_ctx ); #if !defined(MBEDTLS_HAVE_TIME) ctx->serial = 0; #endif ctx->timeout = MBEDTLS_SSL_COOKIE_TIMEOUT; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } void mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay ) { ctx->timeout = delay; } void mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx ) { mbedtls_md_free( &ctx->hmac_ctx ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ssl_cookie_ctx ) ); } int mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char key[COOKIE_MD_OUTLEN]; if( ( ret = f_rng( p_rng, key, sizeof( key ) ) ) != 0 ) return( ret ); ret = mbedtls_md_setup( &ctx->hmac_ctx, mbedtls_md_info_from_type( COOKIE_MD ), 1 ); if( ret != 0 ) return( ret ); ret = mbedtls_md_hmac_starts( &ctx->hmac_ctx, key, sizeof( key ) ); if( ret != 0 ) return( ret ); mbedtls_platform_zeroize( key, sizeof( key ) ); return( 0 ); } /* * Generate the HMAC part of a cookie */ static int ssl_cookie_hmac( mbedtls_md_context_t *hmac_ctx, const unsigned char time[4], unsigned char **p, unsigned char *end, const unsigned char *cli_id, size_t cli_id_len ) { unsigned char hmac_out[COOKIE_MD_OUTLEN]; if( (size_t)( end - *p ) < COOKIE_HMAC_LEN ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); if( mbedtls_md_hmac_reset( hmac_ctx ) != 0 || mbedtls_md_hmac_update( hmac_ctx, time, 4 ) != 0 || mbedtls_md_hmac_update( hmac_ctx, cli_id, cli_id_len ) != 0 || mbedtls_md_hmac_finish( hmac_ctx, hmac_out ) != 0 ) { return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } memcpy( *p, hmac_out, COOKIE_HMAC_LEN ); *p += COOKIE_HMAC_LEN; return( 0 ); } /* * Generate cookie for DTLS ClientHello verification */ int mbedtls_ssl_cookie_write( void *p_ctx, unsigned char **p, unsigned char *end, const unsigned char *cli_id, size_t cli_id_len ) { int ret; mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; unsigned long t; if( ctx == NULL || cli_id == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( (size_t)( end - *p ) < COOKIE_LEN ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); #if defined(MBEDTLS_HAVE_TIME) t = (unsigned long) mbedtls_time( NULL ); #else t = ctx->serial++; #endif (*p)[0] = (unsigned char)( t >> 24 ); (*p)[1] = (unsigned char)( t >> 16 ); (*p)[2] = (unsigned char)( t >> 8 ); (*p)[3] = (unsigned char)( t ); *p += 4; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret ); #endif ret = ssl_cookie_hmac( &ctx->hmac_ctx, *p - 4, p, end, cli_id, cli_id_len ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Check a cookie */ int mbedtls_ssl_cookie_check( void *p_ctx, const unsigned char *cookie, size_t cookie_len, const unsigned char *cli_id, size_t cli_id_len ) { unsigned char ref_hmac[COOKIE_HMAC_LEN]; int ret = 0; unsigned char *p = ref_hmac; mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; unsigned long cur_time, cookie_time; if( ctx == NULL || cli_id == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( cookie_len != COOKIE_LEN ) return( -1 ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret ); #endif if( ssl_cookie_hmac( &ctx->hmac_ctx, cookie, &p, p + sizeof( ref_hmac ), cli_id, cli_id_len ) != 0 ) ret = -1; #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif if( ret != 0 ) return( ret ); if( mbedtls_ssl_safer_memcmp( cookie + 4, ref_hmac, sizeof( ref_hmac ) ) != 0 ) return( -1 ); #if defined(MBEDTLS_HAVE_TIME) cur_time = (unsigned long) mbedtls_time( NULL ); #else cur_time = ctx->serial; #endif cookie_time = ( (unsigned long) cookie[0] << 24 ) | ( (unsigned long) cookie[1] << 16 ) | ( (unsigned long) cookie[2] << 8 ) | ( (unsigned long) cookie[3] ); if( ctx->timeout != 0 && cur_time - cookie_time > ctx->timeout ) return( -1 ); return( 0 ); } #endif /* MBEDTLS_SSL_COOKIE_C */ fldigi-4.1.06/src/mbedtls/havege.c0000664000175000017500000002200113507401434013603 00000000000000/** * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The HAVEGE RNG was designed by Andre Seznec in 2002. * * http://www.irisa.fr/caps/projects/hipsor/publi.php * * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" #include "mbedtls/timing.h" #include "mbedtls/platform_util.h" #include /* ------------------------------------------------------------------------ * On average, one iteration accesses two 8-word blocks in the havege WALK * table, and generates 16 words in the RES array. * * The data read in the WALK table is updated and permuted after each use. * The result of the hardware clock counter read is used for this update. * * 25 conditional tests are present. The conditional tests are grouped in * two nested groups of 12 conditional tests and 1 test that controls the * permutation; on average, there should be 6 tests executed and 3 of them * should be mispredicted. * ------------------------------------------------------------------------ */ #define SWAP(X,Y) { int *T = X; X = Y; Y = T; } #define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; #define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; #define TST1_LEAVE U1++; } #define TST2_LEAVE U2++; } #define ONE_ITERATION \ \ PTEST = PT1 >> 20; \ \ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ \ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ \ PTX = (PT1 >> 18) & 7; \ PT1 &= 0x1FFF; \ PT2 &= 0x1FFF; \ CLK = (int) mbedtls_timing_hardclock(); \ \ i = 0; \ A = &WALK[PT1 ]; RES[i++] ^= *A; \ B = &WALK[PT2 ]; RES[i++] ^= *B; \ C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \ D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \ \ IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \ *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \ *B = IN ^ U1; \ *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \ *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \ \ A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \ B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \ C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \ D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \ \ if( PTEST & 1 ) SWAP( A, C ); \ \ IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \ *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \ *B = IN; CLK = (int) mbedtls_timing_hardclock(); \ *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \ *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \ \ A = &WALK[PT1 ^ 4]; \ B = &WALK[PT2 ^ 1]; \ \ PTEST = PT2 >> 1; \ \ PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \ PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \ PTY = (PT2 >> 10) & 7; \ \ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ \ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ \ C = &WALK[PT1 ^ 5]; \ D = &WALK[PT2 ^ 5]; \ \ RES[i++] ^= *A; \ RES[i++] ^= *B; \ RES[i++] ^= *C; \ RES[i++] ^= *D; \ \ IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK; \ *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \ *B = IN ^ U2; \ *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \ *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \ \ A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \ B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \ C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \ D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \ \ IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \ *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \ *B = IN; \ *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \ *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \ \ PT1 = ( RES[( i - 8 ) ^ PTX] ^ \ WALK[PT1 ^ PTX ^ 7] ) & (~1); \ PT1 ^= (PT2 ^ 0x10) & 0x10; \ \ for( n++, i = 0; i < 16; i++ ) \ hs->pool[n % MBEDTLS_HAVEGE_COLLECT_SIZE] ^= RES[i]; /* * Entropy gathering function */ static void havege_fill( mbedtls_havege_state *hs ) { int i, n = 0; int U1, U2, *A, *B, *C, *D; int PT1, PT2, *WALK, RES[16]; int PTX, PTY, CLK, PTEST, IN; WALK = hs->WALK; PT1 = hs->PT1; PT2 = hs->PT2; PTX = U1 = 0; PTY = U2 = 0; (void)PTX; memset( RES, 0, sizeof( RES ) ); while( n < MBEDTLS_HAVEGE_COLLECT_SIZE * 4 ) { ONE_ITERATION ONE_ITERATION ONE_ITERATION ONE_ITERATION } hs->PT1 = PT1; hs->PT2 = PT2; hs->offset[0] = 0; hs->offset[1] = MBEDTLS_HAVEGE_COLLECT_SIZE / 2; } /* * HAVEGE initialization */ void mbedtls_havege_init( mbedtls_havege_state *hs ) { memset( hs, 0, sizeof( mbedtls_havege_state ) ); havege_fill( hs ); } void mbedtls_havege_free( mbedtls_havege_state *hs ) { if( hs == NULL ) return; mbedtls_platform_zeroize( hs, sizeof( mbedtls_havege_state ) ); } /* * HAVEGE rand function */ int mbedtls_havege_random( void *p_rng, unsigned char *buf, size_t len ) { int val; size_t use_len; mbedtls_havege_state *hs = (mbedtls_havege_state *) p_rng; unsigned char *p = buf; while( len > 0 ) { use_len = len; if( use_len > sizeof(int) ) use_len = sizeof(int); if( hs->offset[1] >= MBEDTLS_HAVEGE_COLLECT_SIZE ) havege_fill( hs ); val = hs->pool[hs->offset[0]++]; val ^= hs->pool[hs->offset[1]++]; memcpy( p, &val, use_len ); len -= use_len; p += use_len; } return( 0 ); } #endif /* MBEDTLS_HAVEGE_C */ fldigi-4.1.06/src/mbedtls/pkparse.c0000664000175000017500000012770113507401434014026 00000000000000/* * Public Key layer for parsing key files and structures * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_PARSE_C) #include "mbedtls/pk.h" #include "mbedtls/asn1.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PKCS5_C) #include "mbedtls/pkcs5.h" #endif #if defined(MBEDTLS_PKCS12_C) #include "mbedtls/pkcs12.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA ) #define PK_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_FS_IO) /* * Load all data from a file into a given buffer. * * The file is expected to contain either PEM or DER encoded data. * A terminating null byte is always appended. It is included in the announced * length only if the data looks like it is PEM encoded. */ int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n ) { FILE *f; long size; PK_VALIDATE_RET( path != NULL ); PK_VALIDATE_RET( buf != NULL ); PK_VALIDATE_RET( n != NULL ); if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_PK_FILE_IO_ERROR ); fseek( f, 0, SEEK_END ); if( ( size = ftell( f ) ) == -1 ) { fclose( f ); return( MBEDTLS_ERR_PK_FILE_IO_ERROR ); } fseek( f, 0, SEEK_SET ); *n = (size_t) size; if( *n + 1 == 0 || ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL ) { fclose( f ); return( MBEDTLS_ERR_PK_ALLOC_FAILED ); } if( fread( *buf, 1, *n, f ) != *n ) { fclose( f ); mbedtls_platform_zeroize( *buf, *n ); mbedtls_free( *buf ); return( MBEDTLS_ERR_PK_FILE_IO_ERROR ); } fclose( f ); (*buf)[*n] = '\0'; if( strstr( (const char *) *buf, "-----BEGIN " ) != NULL ) ++*n; return( 0 ); } /* * Load and parse a private key */ int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx, const char *path, const char *pwd ) { int ret; size_t n; unsigned char *buf; PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( path != NULL ); if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); if( pwd == NULL ) ret = mbedtls_pk_parse_key( ctx, buf, n, NULL, 0 ); else ret = mbedtls_pk_parse_key( ctx, buf, n, (const unsigned char *) pwd, strlen( pwd ) ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } /* * Load and parse a public key */ int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path ) { int ret; size_t n; unsigned char *buf; PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( path != NULL ); if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_pk_parse_public_key( ctx, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_ECP_C) /* Minimally parse an ECParameters buffer to and mbedtls_asn1_buf * * ECParameters ::= CHOICE { * namedCurve OBJECT IDENTIFIER * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... } * -- implicitCurve NULL * } */ static int pk_get_ecparams( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *params ) { int ret; if ( end - *p < 1 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); /* Tag may be either OID or SEQUENCE */ params->tag = **p; if( params->tag != MBEDTLS_ASN1_OID #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) && params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) #endif ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } if( ( ret = mbedtls_asn1_get_tag( p, end, ¶ms->len, params->tag ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } params->p = *p; *p += params->len; if( *p != end ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) /* * Parse a SpecifiedECDomain (SEC 1 C.2) and (mostly) fill the group with it. * WARNING: the resulting group should only be used with * pk_group_id_from_specified(), since its base point may not be set correctly * if it was encoded compressed. * * SpecifiedECDomain ::= SEQUENCE { * version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...), * fieldID FieldID {{FieldTypes}}, * curve Curve, * base ECPoint, * order INTEGER, * cofactor INTEGER OPTIONAL, * hash HashAlgorithm OPTIONAL, * ... * } * * We only support prime-field as field type, and ignore hash and cofactor. */ static int pk_group_from_specified( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp ) { int ret; unsigned char *p = params->p; const unsigned char * const end = params->p + params->len; const unsigned char *end_field, *end_curve; size_t len; int ver; /* SpecifiedECDomainVersion ::= INTEGER { 1, 2, 3 } */ if( ( ret = mbedtls_asn1_get_int( &p, end, &ver ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ver < 1 || ver > 3 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); /* * FieldID { FIELD-ID:IOSet } ::= SEQUENCE { -- Finite field * fieldType FIELD-ID.&id({IOSet}), * parameters FIELD-ID.&Type({IOSet}{@fieldType}) * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); end_field = p + len; /* * FIELD-ID ::= TYPE-IDENTIFIER * FieldTypes FIELD-ID ::= { * { Prime-p IDENTIFIED BY prime-field } | * { Characteristic-two IDENTIFIED BY characteristic-two-field } * } * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } */ if( ( ret = mbedtls_asn1_get_tag( &p, end_field, &len, MBEDTLS_ASN1_OID ) ) != 0 ) return( ret ); if( len != MBEDTLS_OID_SIZE( MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD ) || memcmp( p, MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD, len ) != 0 ) { return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); } p += len; /* Prime-p ::= INTEGER -- Field of size p. */ if( ( ret = mbedtls_asn1_get_mpi( &p, end_field, &grp->P ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); if( p != end_field ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* * Curve ::= SEQUENCE { * a FieldElement, * b FieldElement, * seed BIT STRING OPTIONAL * -- Shall be present if used in SpecifiedECDomain * -- with version equal to ecdpVer2 or ecdpVer3 * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); end_curve = p + len; /* * FieldElement ::= OCTET STRING * containing an integer in the case of a prime field */ if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 || ( ret = mbedtls_mpi_read_binary( &grp->A, p, len ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } p += len; if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 || ( ret = mbedtls_mpi_read_binary( &grp->B, p, len ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } p += len; /* Ignore seed BIT STRING OPTIONAL */ if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_BIT_STRING ) ) == 0 ) p += len; if( p != end_curve ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* * ECPoint ::= OCTET STRING */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_ecp_point_read_binary( grp, &grp->G, ( const unsigned char *) p, len ) ) != 0 ) { /* * If we can't read the point because it's compressed, cheat by * reading only the X coordinate and the parity bit of Y. */ if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE || ( p[0] != 0x02 && p[0] != 0x03 ) || len != mbedtls_mpi_size( &grp->P ) + 1 || mbedtls_mpi_read_binary( &grp->G.X, p + 1, len - 1 ) != 0 || mbedtls_mpi_lset( &grp->G.Y, p[0] - 2 ) != 0 || mbedtls_mpi_lset( &grp->G.Z, 1 ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); } } p += len; /* * order INTEGER */ if( ( ret = mbedtls_asn1_get_mpi( &p, end, &grp->N ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); grp->nbits = mbedtls_mpi_bitlen( &grp->N ); /* * Allow optional elements by purposefully not enforcing p == end here. */ return( 0 ); } /* * Find the group id associated with an (almost filled) group as generated by * pk_group_from_specified(), or return an error if unknown. */ static int pk_group_id_from_group( const mbedtls_ecp_group *grp, mbedtls_ecp_group_id *grp_id ) { int ret = 0; mbedtls_ecp_group ref; const mbedtls_ecp_group_id *id; mbedtls_ecp_group_init( &ref ); for( id = mbedtls_ecp_grp_id_list(); *id != MBEDTLS_ECP_DP_NONE; id++ ) { /* Load the group associated to that id */ mbedtls_ecp_group_free( &ref ); MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ref, *id ) ); /* Compare to the group we were given, starting with easy tests */ if( grp->pbits == ref.pbits && grp->nbits == ref.nbits && mbedtls_mpi_cmp_mpi( &grp->P, &ref.P ) == 0 && mbedtls_mpi_cmp_mpi( &grp->A, &ref.A ) == 0 && mbedtls_mpi_cmp_mpi( &grp->B, &ref.B ) == 0 && mbedtls_mpi_cmp_mpi( &grp->N, &ref.N ) == 0 && mbedtls_mpi_cmp_mpi( &grp->G.X, &ref.G.X ) == 0 && mbedtls_mpi_cmp_mpi( &grp->G.Z, &ref.G.Z ) == 0 && /* For Y we may only know the parity bit, so compare only that */ mbedtls_mpi_get_bit( &grp->G.Y, 0 ) == mbedtls_mpi_get_bit( &ref.G.Y, 0 ) ) { break; } } cleanup: mbedtls_ecp_group_free( &ref ); *grp_id = *id; if( ret == 0 && *id == MBEDTLS_ECP_DP_NONE ) ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; return( ret ); } /* * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID */ static int pk_group_id_from_specified( const mbedtls_asn1_buf *params, mbedtls_ecp_group_id *grp_id ) { int ret; mbedtls_ecp_group grp; mbedtls_ecp_group_init( &grp ); if( ( ret = pk_group_from_specified( params, &grp ) ) != 0 ) goto cleanup; ret = pk_group_id_from_group( &grp, grp_id ); cleanup: mbedtls_ecp_group_free( &grp ); return( ret ); } #endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */ /* * Use EC parameters to initialise an EC group * * ECParameters ::= CHOICE { * namedCurve OBJECT IDENTIFIER * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... } * -- implicitCurve NULL */ static int pk_use_ecparams( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp ) { int ret; mbedtls_ecp_group_id grp_id; if( params->tag == MBEDTLS_ASN1_OID ) { if( mbedtls_oid_get_ec_grp( params, &grp_id ) != 0 ) return( MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE ); } else { #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) if( ( ret = pk_group_id_from_specified( params, &grp_id ) ) != 0 ) return( ret ); #else return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); #endif } /* * grp may already be initilialized; if so, make sure IDs match */ if( grp->id != MBEDTLS_ECP_DP_NONE && grp->id != grp_id ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); if( ( ret = mbedtls_ecp_group_load( grp, grp_id ) ) != 0 ) return( ret ); return( 0 ); } /* * EC public key is an EC point * * The caller is responsible for clearing the structure upon failure if * desired. Take care to pass along the possible ECP_FEATURE_UNAVAILABLE * return code of mbedtls_ecp_point_read_binary() and leave p in a usable state. */ static int pk_get_ecpubkey( unsigned char **p, const unsigned char *end, mbedtls_ecp_keypair *key ) { int ret; if( ( ret = mbedtls_ecp_point_read_binary( &key->grp, &key->Q, (const unsigned char *) *p, end - *p ) ) == 0 ) { ret = mbedtls_ecp_check_pubkey( &key->grp, &key->Q ); } /* * We know mbedtls_ecp_point_read_binary consumed all bytes or failed */ *p = (unsigned char *) end; return( ret ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_RSA_C) /* * RSAPublicKey ::= SEQUENCE { * modulus INTEGER, -- n * publicExponent INTEGER -- e * } */ static int pk_get_rsapubkey( unsigned char **p, const unsigned char *end, mbedtls_rsa_context *rsa ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( *p + len != end ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* Import N */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( ( ret = mbedtls_rsa_import_raw( rsa, *p, len, NULL, 0, NULL, 0, NULL, 0, NULL, 0 ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY ); *p += len; /* Import E */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, NULL, 0, NULL, 0, *p, len ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY ); *p += len; if( mbedtls_rsa_complete( rsa ) != 0 || mbedtls_rsa_check_pubkey( rsa ) != 0 ) { return( MBEDTLS_ERR_PK_INVALID_PUBKEY ); } if( *p != end ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #endif /* MBEDTLS_RSA_C */ /* Get a PK algorithm identifier * * AlgorithmIdentifier ::= SEQUENCE { * algorithm OBJECT IDENTIFIER, * parameters ANY DEFINED BY algorithm OPTIONAL } */ static int pk_get_pk_alg( unsigned char **p, const unsigned char *end, mbedtls_pk_type_t *pk_alg, mbedtls_asn1_buf *params ) { int ret; mbedtls_asn1_buf alg_oid; memset( params, 0, sizeof(mbedtls_asn1_buf) ); if( ( ret = mbedtls_asn1_get_alg( p, end, &alg_oid, params ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_ALG + ret ); if( mbedtls_oid_get_pk_alg( &alg_oid, pk_alg ) != 0 ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); /* * No parameters with RSA (only for EC) */ if( *pk_alg == MBEDTLS_PK_RSA && ( ( params->tag != MBEDTLS_ASN1_NULL && params->tag != 0 ) || params->len != 0 ) ) { return( MBEDTLS_ERR_PK_INVALID_ALG ); } return( 0 ); } /* * SubjectPublicKeyInfo ::= SEQUENCE { * algorithm AlgorithmIdentifier, * subjectPublicKey BIT STRING } */ int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end, mbedtls_pk_context *pk ) { int ret; size_t len; mbedtls_asn1_buf alg_params; mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; const mbedtls_pk_info_t *pk_info; PK_VALIDATE_RET( p != NULL ); PK_VALIDATE_RET( *p != NULL ); PK_VALIDATE_RET( end != NULL ); PK_VALIDATE_RET( pk != NULL ); if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = *p + len; if( ( ret = pk_get_pk_alg( p, end, &pk_alg, &alg_params ) ) != 0 ) return( ret ); if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( *p + len != end ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ) return( ret ); #if defined(MBEDTLS_RSA_C) if( pk_alg == MBEDTLS_PK_RSA ) { ret = pk_get_rsapubkey( p, end, mbedtls_pk_rsa( *pk ) ); } else #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) if( pk_alg == MBEDTLS_PK_ECKEY_DH || pk_alg == MBEDTLS_PK_ECKEY ) { ret = pk_use_ecparams( &alg_params, &mbedtls_pk_ec( *pk )->grp ); if( ret == 0 ) ret = pk_get_ecpubkey( p, end, mbedtls_pk_ec( *pk ) ); } else #endif /* MBEDTLS_ECP_C */ ret = MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; if( ret == 0 && *p != end ) ret = MBEDTLS_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; if( ret != 0 ) mbedtls_pk_free( pk ); return( ret ); } #if defined(MBEDTLS_RSA_C) /* * Parse a PKCS#1 encoded private RSA key */ static int pk_parse_key_pkcs1_der( mbedtls_rsa_context *rsa, const unsigned char *key, size_t keylen ) { int ret, version; size_t len; unsigned char *p, *end; mbedtls_mpi T; mbedtls_mpi_init( &T ); p = (unsigned char *) key; end = p + keylen; /* * This function parses the RSAPrivateKey (PKCS#1) * * RSAPrivateKey ::= SEQUENCE { * version Version, * modulus INTEGER, -- n * publicExponent INTEGER, -- e * privateExponent INTEGER, -- d * prime1 INTEGER, -- p * prime2 INTEGER, -- q * exponent1 INTEGER, -- d mod (p-1) * exponent2 INTEGER, -- d mod (q-1) * coefficient INTEGER, -- (inverse of q) mod p * otherPrimeInfos OtherPrimeInfos OPTIONAL * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } if( version != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION ); } /* Import N */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, p, len, NULL, 0, NULL, 0, NULL, 0, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Import E */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, NULL, 0, NULL, 0, p, len ) ) != 0 ) goto cleanup; p += len; /* Import D */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, NULL, 0, p, len, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Import P */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, p, len, NULL, 0, NULL, 0, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Import Q */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, p, len, NULL, 0, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Complete the RSA private key */ if( ( ret = mbedtls_rsa_complete( rsa ) ) != 0 ) goto cleanup; /* Check optional parameters */ if( ( ret = mbedtls_asn1_get_mpi( &p, end, &T ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &T ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &T ) ) != 0 ) goto cleanup; if( p != end ) { ret = MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ; } cleanup: mbedtls_mpi_free( &T ); if( ret != 0 ) { /* Wrap error code if it's coming from a lower level */ if( ( ret & 0xff80 ) == 0 ) ret = MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret; else ret = MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; mbedtls_rsa_free( rsa ); } return( ret ); } #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * Parse a SEC1 encoded private EC key */ static int pk_parse_key_sec1_der( mbedtls_ecp_keypair *eck, const unsigned char *key, size_t keylen ) { int ret; int version, pubkey_done; size_t len; mbedtls_asn1_buf params; unsigned char *p = (unsigned char *) key; unsigned char *end = p + keylen; unsigned char *end2; /* * RFC 5915, or SEC1 Appendix C.4 * * ECPrivateKey ::= SEQUENCE { * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), * privateKey OCTET STRING, * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, * publicKey [1] BIT STRING OPTIONAL * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( version != 1 ) return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_mpi_read_binary( &eck->d, p, len ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } p += len; pubkey_done = 0; if( p != end ) { /* * Is 'parameters' present? */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 ) { if( ( ret = pk_get_ecparams( &p, p + len, ¶ms) ) != 0 || ( ret = pk_use_ecparams( ¶ms, &eck->grp ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( ret ); } } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } } if( p != end ) { /* * Is 'publickey' present? If not, or if we can't read it (eg because it * is compressed), create it from the private key. */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 ) { end2 = p + len; if( ( ret = mbedtls_asn1_get_bitstring_null( &p, end2, &len ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( p + len != end2 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); if( ( ret = pk_get_ecpubkey( &p, end2, eck ) ) == 0 ) pubkey_done = 1; else { /* * The only acceptable failure mode of pk_get_ecpubkey() above * is if the point format is not recognized. */ if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); } } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } } if( ! pubkey_done && ( ret = mbedtls_ecp_mul( &eck->grp, &eck->Q, &eck->d, &eck->grp.G, NULL, NULL ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_ecp_check_privkey( &eck->grp, &eck->d ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_ECP_C */ /* * Parse an unencrypted PKCS#8 encoded private key * * Notes: * * - This function does not own the key buffer. It is the * responsibility of the caller to take care of zeroizing * and freeing it after use. * * - The function is responsible for freeing the provided * PK context on failure. * */ static int pk_parse_key_pkcs8_unencrypted_der( mbedtls_pk_context *pk, const unsigned char* key, size_t keylen ) { int ret, version; size_t len; mbedtls_asn1_buf params; unsigned char *p = (unsigned char *) key; unsigned char *end = p + keylen; mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; const mbedtls_pk_info_t *pk_info; /* * This function parses the PrivateKeyInfo object (PKCS#8 v1.2 = RFC 5208) * * PrivateKeyInfo ::= SEQUENCE { * version Version, * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, * privateKey PrivateKey, * attributes [0] IMPLICIT Attributes OPTIONAL } * * Version ::= INTEGER * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier * PrivateKey ::= OCTET STRING * * The PrivateKey OCTET STRING is a SEC1 ECPrivateKey */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( version != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION + ret ); if( ( ret = pk_get_pk_alg( &p, end, &pk_alg, ¶ms ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( len < 1 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ) return( ret ); #if defined(MBEDTLS_RSA_C) if( pk_alg == MBEDTLS_PK_RSA ) { if( ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), p, len ) ) != 0 ) { mbedtls_pk_free( pk ); return( ret ); } } else #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) if( pk_alg == MBEDTLS_PK_ECKEY || pk_alg == MBEDTLS_PK_ECKEY_DH ) { if( ( ret = pk_use_ecparams( ¶ms, &mbedtls_pk_ec( *pk )->grp ) ) != 0 || ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), p, len ) ) != 0 ) { mbedtls_pk_free( pk ); return( ret ); } } else #endif /* MBEDTLS_ECP_C */ return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); return( 0 ); } /* * Parse an encrypted PKCS#8 encoded private key * * To save space, the decryption happens in-place on the given key buffer. * Also, while this function may modify the keybuffer, it doesn't own it, * and instead it is the responsibility of the caller to zeroize and properly * free it after use. * */ #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) static int pk_parse_key_pkcs8_encrypted_der( mbedtls_pk_context *pk, unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen ) { int ret, decrypted = 0; size_t len; unsigned char *buf; unsigned char *p, *end; mbedtls_asn1_buf pbe_alg_oid, pbe_params; #if defined(MBEDTLS_PKCS12_C) mbedtls_cipher_type_t cipher_alg; mbedtls_md_type_t md_alg; #endif p = key; end = p + keylen; if( pwdlen == 0 ) return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED ); /* * This function parses the EncryptedPrivateKeyInfo object (PKCS#8) * * EncryptedPrivateKeyInfo ::= SEQUENCE { * encryptionAlgorithm EncryptionAlgorithmIdentifier, * encryptedData EncryptedData * } * * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier * * EncryptedData ::= OCTET STRING * * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo * */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_alg( &p, end, &pbe_alg_oid, &pbe_params ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); buf = p; /* * Decrypt EncryptedData with appropriate PBE */ #if defined(MBEDTLS_PKCS12_C) if( mbedtls_oid_get_pkcs12_pbe_alg( &pbe_alg_oid, &md_alg, &cipher_alg ) == 0 ) { if( ( ret = mbedtls_pkcs12_pbe( &pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg, md_alg, pwd, pwdlen, p, len, buf ) ) != 0 ) { if( ret == MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); return( ret ); } decrypted = 1; } else if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128, &pbe_alg_oid ) == 0 ) { if( ( ret = mbedtls_pkcs12_pbe_sha1_rc4_128( &pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, pwd, pwdlen, p, len, buf ) ) != 0 ) { return( ret ); } // Best guess for password mismatch when using RC4. If first tag is // not MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE // if( *buf != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); decrypted = 1; } else #endif /* MBEDTLS_PKCS12_C */ #if defined(MBEDTLS_PKCS5_C) if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBES2, &pbe_alg_oid ) == 0 ) { if( ( ret = mbedtls_pkcs5_pbes2( &pbe_params, MBEDTLS_PKCS5_DECRYPT, pwd, pwdlen, p, len, buf ) ) != 0 ) { if( ret == MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); return( ret ); } decrypted = 1; } else #endif /* MBEDTLS_PKCS5_C */ { ((void) pwd); } if( decrypted == 0 ) return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); return( pk_parse_key_pkcs8_unencrypted_der( pk, buf, len ) ); } #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ /* * Parse a private key */ int mbedtls_pk_parse_key( mbedtls_pk_context *pk, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen ) { int ret; const mbedtls_pk_info_t *pk_info; #if defined(MBEDTLS_PEM_PARSE_C) size_t len; mbedtls_pem_context pem; #endif PK_VALIDATE_RET( pk != NULL ); if( keylen == 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); PK_VALIDATE_RET( key != NULL ); #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_init( &pem ); #if defined(MBEDTLS_RSA_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----", key, pwd, pwdlen, &len ); if( ret == 0 ) { pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 || ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED ) return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED ); else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN EC PRIVATE KEY-----", "-----END EC PRIVATE KEY-----", key, pwd, pwdlen, &len ); if( ret == 0 ) { pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 || ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED ) return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED ); else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #endif /* MBEDTLS_ECP_C */ /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN ENCRYPTED PRIVATE KEY-----", "-----END ENCRYPTED PRIVATE KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk, pem.buf, pem.buflen, pwd, pwdlen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ #else ((void) pwd); ((void) pwdlen); #endif /* MBEDTLS_PEM_PARSE_C */ /* * At this point we only know it's not a PEM formatted key. Could be any * of the known DER encoded private key formats * * We try the different DER format parsers to see if one passes without * error */ #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) { unsigned char *key_copy; if( ( key_copy = mbedtls_calloc( 1, keylen ) ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); memcpy( key_copy, key, keylen ); ret = pk_parse_key_pkcs8_encrypted_der( pk, key_copy, keylen, pwd, pwdlen ); mbedtls_platform_zeroize( key_copy, keylen ); mbedtls_free( key_copy ); } if( ret == 0 ) return( 0 ); mbedtls_pk_free( pk ); mbedtls_pk_init( pk ); if( ret == MBEDTLS_ERR_PK_PASSWORD_MISMATCH ) { return( ret ); } #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, key, keylen ) ) == 0 ) return( 0 ); mbedtls_pk_free( pk ); mbedtls_pk_init( pk ); #if defined(MBEDTLS_RSA_C) pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ); if( mbedtls_pk_setup( pk, pk_info ) == 0 && pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), key, keylen ) == 0 ) { return( 0 ); } mbedtls_pk_free( pk ); mbedtls_pk_init( pk ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ); if( mbedtls_pk_setup( pk, pk_info ) == 0 && pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), key, keylen ) == 0 ) { return( 0 ); } mbedtls_pk_free( pk ); #endif /* MBEDTLS_ECP_C */ /* If MBEDTLS_RSA_C is defined but MBEDTLS_ECP_C isn't, * it is ok to leave the PK context initialized but not * freed: It is the caller's responsibility to call pk_init() * before calling this function, and to call pk_free() * when it fails. If MBEDTLS_ECP_C is defined but MBEDTLS_RSA_C * isn't, this leads to mbedtls_pk_free() being called * twice, once here and once by the caller, but this is * also ok and in line with the mbedtls_pk_free() calls * on failed PEM parsing attempts. */ return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); } /* * Parse a public key */ int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen ) { int ret; unsigned char *p; #if defined(MBEDTLS_RSA_C) const mbedtls_pk_info_t *pk_info; #endif #if defined(MBEDTLS_PEM_PARSE_C) size_t len; mbedtls_pem_context pem; #endif PK_VALIDATE_RET( ctx != NULL ); if( keylen == 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); PK_VALIDATE_RET( key != NULL || keylen == 0 ); #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_init( &pem ); #if defined(MBEDTLS_RSA_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN RSA PUBLIC KEY-----", "-----END RSA PUBLIC KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { p = pem.buf; if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( ctx, pk_info ) ) != 0 ) return( ret ); if ( ( ret = pk_get_rsapubkey( &p, p + pem.buflen, mbedtls_pk_rsa( *ctx ) ) ) != 0 ) mbedtls_pk_free( ctx ); mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) { mbedtls_pem_free( &pem ); return( ret ); } #endif /* MBEDTLS_RSA_C */ /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { /* * Was PEM encoded */ p = pem.buf; ret = mbedtls_pk_parse_subpubkey( &p, p + pem.buflen, ctx ); mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) { mbedtls_pem_free( &pem ); return( ret ); } mbedtls_pem_free( &pem ); #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_RSA_C) if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( ctx, pk_info ) ) != 0 ) return( ret ); p = (unsigned char *)key; ret = pk_get_rsapubkey( &p, p + keylen, mbedtls_pk_rsa( *ctx ) ); if( ret == 0 ) { return( ret ); } mbedtls_pk_free( ctx ); if( ret != ( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ) { return( ret ); } #endif /* MBEDTLS_RSA_C */ p = (unsigned char *) key; ret = mbedtls_pk_parse_subpubkey( &p, p + keylen, ctx ); return( ret ); } #endif /* MBEDTLS_PK_PARSE_C */ fldigi-4.1.06/src/mbedtls/oid.c0000664000175000017500000006433713507401434013141 00000000000000/** * \file oid.c * * \brief Object Identifier (OID) database * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_OID_C) #include "mbedtls/oid.h" #include "mbedtls/rsa.h" #include #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) #include "mbedtls/x509.h" #endif /* * Macro to automatically add the size of #define'd OIDs */ #define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s) /* * Macro to generate an internal function for oid_XXX_from_asn1() (used by * the other functions) */ #define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \ static const TYPE_T * oid_ ## NAME ## _from_asn1( const mbedtls_asn1_buf *oid ) \ { \ const TYPE_T *p = LIST; \ const mbedtls_oid_descriptor_t *cur = (const mbedtls_oid_descriptor_t *) p; \ if( p == NULL || oid == NULL ) return( NULL ); \ while( cur->asn1 != NULL ) { \ if( cur->asn1_len == oid->len && \ memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \ return( p ); \ } \ p++; \ cur = (const mbedtls_oid_descriptor_t *) p; \ } \ return( NULL ); \ } /* * Macro to generate a function for retrieving a single attribute from the * descriptor of an mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \ { \ const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \ if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ *ATTR1 = data->descriptor.ATTR1; \ return( 0 ); \ } /* * Macro to generate a function for retrieving a single attribute from an * mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \ { \ const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \ if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ *ATTR1 = data->ATTR1; \ return( 0 ); \ } /* * Macro to generate a function for retrieving two attributes from an * mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \ ATTR2_TYPE, ATTR2) \ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 ) \ { \ const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \ if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ *ATTR1 = data->ATTR1; \ *ATTR2 = data->ATTR2; \ return( 0 ); \ } /* * Macro to generate a function for retrieving the OID based on a single * attribute from a mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \ int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \ { \ const TYPE_T *cur = LIST; \ while( cur->descriptor.asn1 != NULL ) { \ if( cur->ATTR1 == ATTR1 ) { \ *oid = cur->descriptor.asn1; \ *olen = cur->descriptor.asn1_len; \ return( 0 ); \ } \ cur++; \ } \ return( MBEDTLS_ERR_OID_NOT_FOUND ); \ } /* * Macro to generate a function for retrieving the OID based on two * attributes from a mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \ ATTR2_TYPE, ATTR2) \ int FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid , \ size_t *olen ) \ { \ const TYPE_T *cur = LIST; \ while( cur->descriptor.asn1 != NULL ) { \ if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) { \ *oid = cur->descriptor.asn1; \ *olen = cur->descriptor.asn1_len; \ return( 0 ); \ } \ cur++; \ } \ return( MBEDTLS_ERR_OID_NOT_FOUND ); \ } #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) /* * For X520 attribute types */ typedef struct { mbedtls_oid_descriptor_t descriptor; const char *short_name; } oid_x520_attr_t; static const oid_x520_attr_t oid_x520_attr_type[] = { { { ADD_LEN( MBEDTLS_OID_AT_CN ), "id-at-commonName", "Common Name" }, "CN", }, { { ADD_LEN( MBEDTLS_OID_AT_COUNTRY ), "id-at-countryName", "Country" }, "C", }, { { ADD_LEN( MBEDTLS_OID_AT_LOCALITY ), "id-at-locality", "Locality" }, "L", }, { { ADD_LEN( MBEDTLS_OID_AT_STATE ), "id-at-state", "State" }, "ST", }, { { ADD_LEN( MBEDTLS_OID_AT_ORGANIZATION ),"id-at-organizationName", "Organization" }, "O", }, { { ADD_LEN( MBEDTLS_OID_AT_ORG_UNIT ), "id-at-organizationalUnitName", "Org Unit" }, "OU", }, { { ADD_LEN( MBEDTLS_OID_PKCS9_EMAIL ), "emailAddress", "E-mail address" }, "emailAddress", }, { { ADD_LEN( MBEDTLS_OID_AT_SERIAL_NUMBER ),"id-at-serialNumber", "Serial number" }, "serialNumber", }, { { ADD_LEN( MBEDTLS_OID_AT_POSTAL_ADDRESS ),"id-at-postalAddress", "Postal address" }, "postalAddress", }, { { ADD_LEN( MBEDTLS_OID_AT_POSTAL_CODE ), "id-at-postalCode", "Postal code" }, "postalCode", }, { { ADD_LEN( MBEDTLS_OID_AT_SUR_NAME ), "id-at-surName", "Surname" }, "SN", }, { { ADD_LEN( MBEDTLS_OID_AT_GIVEN_NAME ), "id-at-givenName", "Given name" }, "GN", }, { { ADD_LEN( MBEDTLS_OID_AT_INITIALS ), "id-at-initials", "Initials" }, "initials", }, { { ADD_LEN( MBEDTLS_OID_AT_GENERATION_QUALIFIER ), "id-at-generationQualifier", "Generation qualifier" }, "generationQualifier", }, { { ADD_LEN( MBEDTLS_OID_AT_TITLE ), "id-at-title", "Title" }, "title", }, { { ADD_LEN( MBEDTLS_OID_AT_DN_QUALIFIER ),"id-at-dnQualifier", "Distinguished Name qualifier" }, "dnQualifier", }, { { ADD_LEN( MBEDTLS_OID_AT_PSEUDONYM ), "id-at-pseudonym", "Pseudonym" }, "pseudonym", }, { { ADD_LEN( MBEDTLS_OID_DOMAIN_COMPONENT ), "id-domainComponent", "Domain component" }, "DC", }, { { ADD_LEN( MBEDTLS_OID_AT_UNIQUE_IDENTIFIER ), "id-at-uniqueIdentifier", "Unique Identifier" }, "uniqueIdentifier", }, { { NULL, 0, NULL, NULL }, NULL, } }; FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type) FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char *, short_name) /* * For X509 extensions */ typedef struct { mbedtls_oid_descriptor_t descriptor; int ext_type; } oid_x509_ext_t; static const oid_x509_ext_t oid_x509_ext[] = { { { ADD_LEN( MBEDTLS_OID_BASIC_CONSTRAINTS ), "id-ce-basicConstraints", "Basic Constraints" }, MBEDTLS_X509_EXT_BASIC_CONSTRAINTS, }, { { ADD_LEN( MBEDTLS_OID_KEY_USAGE ), "id-ce-keyUsage", "Key Usage" }, MBEDTLS_X509_EXT_KEY_USAGE, }, { { ADD_LEN( MBEDTLS_OID_EXTENDED_KEY_USAGE ), "id-ce-extKeyUsage", "Extended Key Usage" }, MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE, }, { { ADD_LEN( MBEDTLS_OID_SUBJECT_ALT_NAME ), "id-ce-subjectAltName", "Subject Alt Name" }, MBEDTLS_X509_EXT_SUBJECT_ALT_NAME, }, { { ADD_LEN( MBEDTLS_OID_NS_CERT_TYPE ), "id-netscape-certtype", "Netscape Certificate Type" }, MBEDTLS_X509_EXT_NS_CERT_TYPE, }, { { NULL, 0, NULL, NULL }, 0, }, }; FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext) FN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type) static const mbedtls_oid_descriptor_t oid_ext_key_usage[] = { { ADD_LEN( MBEDTLS_OID_SERVER_AUTH ), "id-kp-serverAuth", "TLS Web Server Authentication" }, { ADD_LEN( MBEDTLS_OID_CLIENT_AUTH ), "id-kp-clientAuth", "TLS Web Client Authentication" }, { ADD_LEN( MBEDTLS_OID_CODE_SIGNING ), "id-kp-codeSigning", "Code Signing" }, { ADD_LEN( MBEDTLS_OID_EMAIL_PROTECTION ), "id-kp-emailProtection", "E-mail Protection" }, { ADD_LEN( MBEDTLS_OID_TIME_STAMPING ), "id-kp-timeStamping", "Time Stamping" }, { ADD_LEN( MBEDTLS_OID_OCSP_SIGNING ), "id-kp-OCSPSigning", "OCSP Signing" }, { NULL, 0, NULL, NULL }, }; FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage) FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage, mbedtls_oid_descriptor_t, ext_key_usage, const char *, description) #endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */ #if defined(MBEDTLS_MD_C) /* * For SignatureAlgorithmIdentifier */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_alg; mbedtls_pk_type_t pk_alg; } oid_sig_alg_t; static const oid_sig_alg_t oid_sig_alg[] = { #if defined(MBEDTLS_RSA_C) #if defined(MBEDTLS_MD2_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_MD2 ), "md2WithRSAEncryption", "RSA with MD2" }, MBEDTLS_MD_MD2, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_MD4 ), "md4WithRSAEncryption", "RSA with MD4" }, MBEDTLS_MD_MD4, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_MD5 ), "md5WithRSAEncryption", "RSA with MD5" }, MBEDTLS_MD_MD5, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA1 ), "sha-1WithRSAEncryption", "RSA with SHA1" }, MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA224 ), "sha224WithRSAEncryption", "RSA with SHA-224" }, MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA, }, { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA256 ), "sha256WithRSAEncryption", "RSA with SHA-256" }, MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA384 ), "sha384WithRSAEncryption", "RSA with SHA-384" }, MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA, }, { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA512 ), "sha512WithRSAEncryption", "RSA with SHA-512" }, MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_RSA_SHA_OBS ), "sha-1WithRSAEncryption", "RSA with SHA1" }, MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECDSA_C) #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA1 ), "ecdsa-with-SHA1", "ECDSA with SHA1" }, MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA224 ), "ecdsa-with-SHA224", "ECDSA with SHA224" }, MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA, }, { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA256 ), "ecdsa-with-SHA256", "ECDSA with SHA256" }, MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA384 ), "ecdsa-with-SHA384", "ECDSA with SHA384" }, MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA, }, { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA512 ), "ecdsa-with-SHA512", "ECDSA with SHA512" }, MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA, }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_RSA_C) { { ADD_LEN( MBEDTLS_OID_RSASSA_PSS ), "RSASSA-PSS", "RSASSA-PSS" }, MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS, }, #endif /* MBEDTLS_RSA_C */ { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, MBEDTLS_PK_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg) FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char *, description) FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg, oid_sig_alg_t, sig_alg, mbedtls_md_type_t, md_alg, mbedtls_pk_type_t, pk_alg) FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg, oid_sig_alg_t, oid_sig_alg, mbedtls_pk_type_t, pk_alg, mbedtls_md_type_t, md_alg) #endif /* MBEDTLS_MD_C */ /* * For PublicKeyInfo (PKCS1, RFC 5480) */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_pk_type_t pk_alg; } oid_pk_alg_t; static const oid_pk_alg_t oid_pk_alg[] = { { { ADD_LEN( MBEDTLS_OID_PKCS1_RSA ), "rsaEncryption", "RSA" }, MBEDTLS_PK_RSA, }, { { ADD_LEN( MBEDTLS_OID_EC_ALG_UNRESTRICTED ), "id-ecPublicKey", "Generic EC key" }, MBEDTLS_PK_ECKEY, }, { { ADD_LEN( MBEDTLS_OID_EC_ALG_ECDH ), "id-ecDH", "EC key for ECDH" }, MBEDTLS_PK_ECKEY_DH, }, { { NULL, 0, NULL, NULL }, MBEDTLS_PK_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg) FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, mbedtls_pk_type_t, pk_alg) #if defined(MBEDTLS_ECP_C) /* * For namedCurve (RFC 5480) */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_ecp_group_id grp_id; } oid_ecp_grp_t; static const oid_ecp_grp_t oid_ecp_grp[] = { #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192R1 ), "secp192r1", "secp192r1" }, MBEDTLS_ECP_DP_SECP192R1, }, #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224R1 ), "secp224r1", "secp224r1" }, MBEDTLS_ECP_DP_SECP224R1, }, #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256R1 ), "secp256r1", "secp256r1" }, MBEDTLS_ECP_DP_SECP256R1, }, #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP384R1 ), "secp384r1", "secp384r1" }, MBEDTLS_ECP_DP_SECP384R1, }, #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP521R1 ), "secp521r1", "secp521r1" }, MBEDTLS_ECP_DP_SECP521R1, }, #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192K1 ), "secp192k1", "secp192k1" }, MBEDTLS_ECP_DP_SECP192K1, }, #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224K1 ), "secp224k1", "secp224k1" }, MBEDTLS_ECP_DP_SECP224K1, }, #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256K1 ), "secp256k1", "secp256k1" }, MBEDTLS_ECP_DP_SECP256K1, }, #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_BP256R1 ), "brainpoolP256r1","brainpool256r1" }, MBEDTLS_ECP_DP_BP256R1, }, #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_BP384R1 ), "brainpoolP384r1","brainpool384r1" }, MBEDTLS_ECP_DP_BP384R1, }, #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_BP512R1 ), "brainpoolP512r1","brainpool512r1" }, MBEDTLS_ECP_DP_BP512R1, }, #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ { { NULL, 0, NULL, NULL }, MBEDTLS_ECP_DP_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp) FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id) FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, mbedtls_ecp_group_id, grp_id) #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_CIPHER_C) /* * For PKCS#5 PBES2 encryption algorithm */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_cipher_type_t cipher_alg; } oid_cipher_alg_t; static const oid_cipher_alg_t oid_cipher_alg[] = { { { ADD_LEN( MBEDTLS_OID_DES_CBC ), "desCBC", "DES-CBC" }, MBEDTLS_CIPHER_DES_CBC, }, { { ADD_LEN( MBEDTLS_OID_DES_EDE3_CBC ), "des-ede3-cbc", "DES-EDE3-CBC" }, MBEDTLS_CIPHER_DES_EDE3_CBC, }, { { NULL, 0, NULL, NULL }, MBEDTLS_CIPHER_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, mbedtls_cipher_type_t, cipher_alg) #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_MD_C) /* * For digestAlgorithm */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_alg; } oid_md_alg_t; static const oid_md_alg_t oid_md_alg[] = { #if defined(MBEDTLS_MD2_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD2 ), "id-md2", "MD2" }, MBEDTLS_MD_MD2, }, #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD4 ), "id-md4", "MD4" }, MBEDTLS_MD_MD4, }, #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD5 ), "id-md5", "MD5" }, MBEDTLS_MD_MD5, }, #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA1 ), "id-sha1", "SHA-1" }, MBEDTLS_MD_SHA1, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA224 ), "id-sha224", "SHA-224" }, MBEDTLS_MD_SHA224, }, { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA256 ), "id-sha256", "SHA-256" }, MBEDTLS_MD_SHA256, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA384 ), "id-sha384", "SHA-384" }, MBEDTLS_MD_SHA384, }, { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA512 ), "id-sha512", "SHA-512" }, MBEDTLS_MD_SHA512, }, #endif /* MBEDTLS_SHA512_C */ { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg) FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, mbedtls_md_type_t, md_alg) /* * For HMAC digestAlgorithm */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_hmac; } oid_md_hmac_t; static const oid_md_hmac_t oid_md_hmac[] = { #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_HMAC_SHA1 ), "hmacSHA1", "HMAC-SHA-1" }, MBEDTLS_MD_SHA1, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_HMAC_SHA224 ), "hmacSHA224", "HMAC-SHA-224" }, MBEDTLS_MD_SHA224, }, { { ADD_LEN( MBEDTLS_OID_HMAC_SHA256 ), "hmacSHA256", "HMAC-SHA-256" }, MBEDTLS_MD_SHA256, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_HMAC_SHA384 ), "hmacSHA384", "HMAC-SHA-384" }, MBEDTLS_MD_SHA384, }, { { ADD_LEN( MBEDTLS_OID_HMAC_SHA512 ), "hmacSHA512", "HMAC-SHA-512" }, MBEDTLS_MD_SHA512, }, #endif /* MBEDTLS_SHA512_C */ { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_md_hmac_t, md_hmac, oid_md_hmac) FN_OID_GET_ATTR1(mbedtls_oid_get_md_hmac, oid_md_hmac_t, md_hmac, mbedtls_md_type_t, md_hmac) #endif /* MBEDTLS_MD_C */ #if defined(MBEDTLS_PKCS12_C) /* * For PKCS#12 PBEs */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_alg; mbedtls_cipher_type_t cipher_alg; } oid_pkcs12_pbe_alg_t; static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] = { { { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC ), "pbeWithSHAAnd3-KeyTripleDES-CBC", "PBE with SHA1 and 3-Key 3DES" }, MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC, }, { { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC ), "pbeWithSHAAnd2-KeyTripleDES-CBC", "PBE with SHA1 and 2-Key 3DES" }, MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC, }, { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg) FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg, oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, mbedtls_md_type_t, md_alg, mbedtls_cipher_type_t, cipher_alg) #endif /* MBEDTLS_PKCS12_C */ #define OID_SAFE_SNPRINTF \ do { \ if( ret < 0 || (size_t) ret >= n ) \ return( MBEDTLS_ERR_OID_BUF_TOO_SMALL ); \ \ n -= (size_t) ret; \ p += (size_t) ret; \ } while( 0 ) /* Return the x.y.z.... style numeric string for the given OID */ int mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid ) { int ret; size_t i, n; unsigned int value; char *p; p = buf; n = size; /* First byte contains first two dots */ if( oid->len > 0 ) { ret = mbedtls_snprintf( p, n, "%d.%d", oid->p[0] / 40, oid->p[0] % 40 ); OID_SAFE_SNPRINTF; } value = 0; for( i = 1; i < oid->len; i++ ) { /* Prevent overflow in value. */ if( ( ( value << 7 ) >> 7 ) != value ) return( MBEDTLS_ERR_OID_BUF_TOO_SMALL ); value <<= 7; value += oid->p[i] & 0x7F; if( !( oid->p[i] & 0x80 ) ) { /* Last byte */ ret = mbedtls_snprintf( p, n, ".%d", value ); OID_SAFE_SNPRINTF; value = 0; } } return( (int) ( size - n ) ); } #endif /* MBEDTLS_OID_C */ fldigi-4.1.06/src/mbedtls/cipher_wrap.c0000664000175000017500000015376313507401434014673 00000000000000/** * \file cipher_wrap.c * * \brief Generic cipher wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CIPHER_C) #include "mbedtls/cipher_internal.h" #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #endif #if defined(MBEDTLS_AES_C) #include "mbedtls/aes.h" #endif #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #endif #if defined(MBEDTLS_CAMELLIA_C) #include "mbedtls/camellia.h" #endif #if defined(MBEDTLS_ARIA_C) #include "mbedtls/aria.h" #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #endif #if defined(MBEDTLS_BLOWFISH_C) #include "mbedtls/blowfish.h" #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #endif #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #include #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #if defined(MBEDTLS_GCM_C) /* shared by all GCM ciphers */ static void *gcm_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) ); if( ctx != NULL ) mbedtls_gcm_init( (mbedtls_gcm_context *) ctx ); return( ctx ); } static void gcm_ctx_free( void *ctx ) { mbedtls_gcm_free( ctx ); mbedtls_free( ctx ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) /* shared by all CCM ciphers */ static void *ccm_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) ); if( ctx != NULL ) mbedtls_ccm_init( (mbedtls_ccm_context *) ctx ); return( ctx ); } static void ccm_ctx_free( void *ctx ) { mbedtls_ccm_free( ctx ); mbedtls_free( ctx ); } #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_AES_C) static int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) static int aes_crypt_ofb_wrap( void *ctx, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_ofb( (mbedtls_aes_context *) ctx, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) static int aes_crypt_xts_wrap( void *ctx, mbedtls_operation_t operation, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ) { mbedtls_aes_xts_context *xts_ctx = ctx; int mode; switch( operation ) { case MBEDTLS_ENCRYPT: mode = MBEDTLS_AES_ENCRYPT; break; case MBEDTLS_DECRYPT: mode = MBEDTLS_AES_DECRYPT; break; default: return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; } return mbedtls_aes_crypt_xts( xts_ctx, mode, length, data_unit, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ static int aes_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen ); } static int aes_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen ); } static void * aes_ctx_alloc( void ) { mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) ); if( aes == NULL ) return( NULL ); mbedtls_aes_init( aes ); return( aes ); } static void aes_ctx_free( void *ctx ) { mbedtls_aes_free( (mbedtls_aes_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t aes_info = { MBEDTLS_CIPHER_ID_AES, aes_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) aes_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) aes_crypt_cfb128_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) aes_crypt_ofb_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) aes_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif aes_setkey_enc_wrap, aes_setkey_dec_wrap, aes_ctx_alloc, aes_ctx_free }; static const mbedtls_cipher_info_t aes_128_ecb_info = { MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_MODE_ECB, 128, "AES-128-ECB", 0, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_ecb_info = { MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_MODE_ECB, 192, "AES-192-ECB", 0, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_ecb_info = { MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_MODE_ECB, 256, "AES-256-ECB", 0, 0, 16, &aes_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t aes_128_cbc_info = { MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MODE_CBC, 128, "AES-128-CBC", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_cbc_info = { MBEDTLS_CIPHER_AES_192_CBC, MBEDTLS_MODE_CBC, 192, "AES-192-CBC", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_cbc_info = { MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MODE_CBC, 256, "AES-256-CBC", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t aes_128_cfb128_info = { MBEDTLS_CIPHER_AES_128_CFB128, MBEDTLS_MODE_CFB, 128, "AES-128-CFB128", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_cfb128_info = { MBEDTLS_CIPHER_AES_192_CFB128, MBEDTLS_MODE_CFB, 192, "AES-192-CFB128", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_cfb128_info = { MBEDTLS_CIPHER_AES_256_CFB128, MBEDTLS_MODE_CFB, 256, "AES-256-CFB128", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) static const mbedtls_cipher_info_t aes_128_ofb_info = { MBEDTLS_CIPHER_AES_128_OFB, MBEDTLS_MODE_OFB, 128, "AES-128-OFB", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_ofb_info = { MBEDTLS_CIPHER_AES_192_OFB, MBEDTLS_MODE_OFB, 192, "AES-192-OFB", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_ofb_info = { MBEDTLS_CIPHER_AES_256_OFB, MBEDTLS_MODE_OFB, 256, "AES-256-OFB", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t aes_128_ctr_info = { MBEDTLS_CIPHER_AES_128_CTR, MBEDTLS_MODE_CTR, 128, "AES-128-CTR", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_ctr_info = { MBEDTLS_CIPHER_AES_192_CTR, MBEDTLS_MODE_CTR, 192, "AES-192-CTR", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_ctr_info = { MBEDTLS_CIPHER_AES_256_CTR, MBEDTLS_MODE_CTR, 256, "AES-256-CTR", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) static int xts_aes_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { mbedtls_aes_xts_context *xts_ctx = ctx; return( mbedtls_aes_xts_setkey_enc( xts_ctx, key, key_bitlen ) ); } static int xts_aes_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { mbedtls_aes_xts_context *xts_ctx = ctx; return( mbedtls_aes_xts_setkey_dec( xts_ctx, key, key_bitlen ) ); } static void *xts_aes_ctx_alloc( void ) { mbedtls_aes_xts_context *xts_ctx = mbedtls_calloc( 1, sizeof( *xts_ctx ) ); if( xts_ctx != NULL ) mbedtls_aes_xts_init( xts_ctx ); return( xts_ctx ); } static void xts_aes_ctx_free( void *ctx ) { mbedtls_aes_xts_context *xts_ctx = ctx; if( xts_ctx == NULL ) return; mbedtls_aes_xts_free( xts_ctx ); mbedtls_free( xts_ctx ); } static const mbedtls_cipher_base_t xts_aes_info = { MBEDTLS_CIPHER_ID_AES, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) aes_crypt_xts_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif xts_aes_setkey_enc_wrap, xts_aes_setkey_dec_wrap, xts_aes_ctx_alloc, xts_aes_ctx_free }; static const mbedtls_cipher_info_t aes_128_xts_info = { MBEDTLS_CIPHER_AES_128_XTS, MBEDTLS_MODE_XTS, 256, "AES-128-XTS", 16, 0, 16, &xts_aes_info }; static const mbedtls_cipher_info_t aes_256_xts_info = { MBEDTLS_CIPHER_AES_256_XTS, MBEDTLS_MODE_XTS, 512, "AES-256-XTS", 16, 0, 16, &xts_aes_info }; #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_GCM_C) static int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES, key, key_bitlen ); } static const mbedtls_cipher_base_t gcm_aes_info = { MBEDTLS_CIPHER_ID_AES, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif gcm_aes_setkey_wrap, gcm_aes_setkey_wrap, gcm_ctx_alloc, gcm_ctx_free, }; static const mbedtls_cipher_info_t aes_128_gcm_info = { MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MODE_GCM, 128, "AES-128-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aes_info }; static const mbedtls_cipher_info_t aes_192_gcm_info = { MBEDTLS_CIPHER_AES_192_GCM, MBEDTLS_MODE_GCM, 192, "AES-192-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aes_info }; static const mbedtls_cipher_info_t aes_256_gcm_info = { MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MODE_GCM, 256, "AES-256-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aes_info }; #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) static int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES, key, key_bitlen ); } static const mbedtls_cipher_base_t ccm_aes_info = { MBEDTLS_CIPHER_ID_AES, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif ccm_aes_setkey_wrap, ccm_aes_setkey_wrap, ccm_ctx_alloc, ccm_ctx_free, }; static const mbedtls_cipher_info_t aes_128_ccm_info = { MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MODE_CCM, 128, "AES-128-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aes_info }; static const mbedtls_cipher_info_t aes_192_ccm_info = { MBEDTLS_CIPHER_AES_192_CCM, MBEDTLS_MODE_CCM, 192, "AES-192-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aes_info }; static const mbedtls_cipher_info_t aes_256_ccm_info = { MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MODE_CCM, 256, "AES-256-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aes_info }; #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) static int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen ); } static int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen ); } static void * camellia_ctx_alloc( void ) { mbedtls_camellia_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_camellia_init( ctx ); return( ctx ); } static void camellia_ctx_free( void *ctx ) { mbedtls_camellia_free( (mbedtls_camellia_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t camellia_info = { MBEDTLS_CIPHER_ID_CAMELLIA, camellia_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) camellia_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) camellia_crypt_cfb128_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) camellia_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif camellia_setkey_enc_wrap, camellia_setkey_dec_wrap, camellia_ctx_alloc, camellia_ctx_free }; static const mbedtls_cipher_info_t camellia_128_ecb_info = { MBEDTLS_CIPHER_CAMELLIA_128_ECB, MBEDTLS_MODE_ECB, 128, "CAMELLIA-128-ECB", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_ecb_info = { MBEDTLS_CIPHER_CAMELLIA_192_ECB, MBEDTLS_MODE_ECB, 192, "CAMELLIA-192-ECB", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_ecb_info = { MBEDTLS_CIPHER_CAMELLIA_256_ECB, MBEDTLS_MODE_ECB, 256, "CAMELLIA-256-ECB", 16, 0, 16, &camellia_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t camellia_128_cbc_info = { MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MODE_CBC, 128, "CAMELLIA-128-CBC", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_cbc_info = { MBEDTLS_CIPHER_CAMELLIA_192_CBC, MBEDTLS_MODE_CBC, 192, "CAMELLIA-192-CBC", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_cbc_info = { MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MODE_CBC, 256, "CAMELLIA-256-CBC", 16, 0, 16, &camellia_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t camellia_128_cfb128_info = { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, MBEDTLS_MODE_CFB, 128, "CAMELLIA-128-CFB128", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_cfb128_info = { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, MBEDTLS_MODE_CFB, 192, "CAMELLIA-192-CFB128", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_cfb128_info = { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, MBEDTLS_MODE_CFB, 256, "CAMELLIA-256-CFB128", 16, 0, 16, &camellia_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t camellia_128_ctr_info = { MBEDTLS_CIPHER_CAMELLIA_128_CTR, MBEDTLS_MODE_CTR, 128, "CAMELLIA-128-CTR", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_ctr_info = { MBEDTLS_CIPHER_CAMELLIA_192_CTR, MBEDTLS_MODE_CTR, 192, "CAMELLIA-192-CTR", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_ctr_info = { MBEDTLS_CIPHER_CAMELLIA_256_CTR, MBEDTLS_MODE_CTR, 256, "CAMELLIA-256-CTR", 16, 0, 16, &camellia_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_GCM_C) static int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, key_bitlen ); } static const mbedtls_cipher_base_t gcm_camellia_info = { MBEDTLS_CIPHER_ID_CAMELLIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif gcm_camellia_setkey_wrap, gcm_camellia_setkey_wrap, gcm_ctx_alloc, gcm_ctx_free, }; static const mbedtls_cipher_info_t camellia_128_gcm_info = { MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MODE_GCM, 128, "CAMELLIA-128-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_camellia_info }; static const mbedtls_cipher_info_t camellia_192_gcm_info = { MBEDTLS_CIPHER_CAMELLIA_192_GCM, MBEDTLS_MODE_GCM, 192, "CAMELLIA-192-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_camellia_info }; static const mbedtls_cipher_info_t camellia_256_gcm_info = { MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MODE_GCM, 256, "CAMELLIA-256-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_camellia_info }; #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) static int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, key_bitlen ); } static const mbedtls_cipher_base_t ccm_camellia_info = { MBEDTLS_CIPHER_ID_CAMELLIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif ccm_camellia_setkey_wrap, ccm_camellia_setkey_wrap, ccm_ctx_alloc, ccm_ctx_free, }; static const mbedtls_cipher_info_t camellia_128_ccm_info = { MBEDTLS_CIPHER_CAMELLIA_128_CCM, MBEDTLS_MODE_CCM, 128, "CAMELLIA-128-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_camellia_info }; static const mbedtls_cipher_info_t camellia_192_ccm_info = { MBEDTLS_CIPHER_CAMELLIA_192_CCM, MBEDTLS_MODE_CCM, 192, "CAMELLIA-192-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_camellia_info }; static const mbedtls_cipher_info_t camellia_256_ccm_info = { MBEDTLS_CIPHER_CAMELLIA_256_CCM, MBEDTLS_MODE_CCM, 256, "CAMELLIA-256-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_camellia_info }; #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_ARIA_C) static int aria_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { (void) operation; return mbedtls_aria_crypt_ecb( (mbedtls_aria_context *) ctx, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int aria_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aria_crypt_cbc( (mbedtls_aria_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int aria_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aria_crypt_cfb128( (mbedtls_aria_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int aria_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_aria_crypt_ctr( (mbedtls_aria_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static int aria_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aria_setkey_dec( (mbedtls_aria_context *) ctx, key, key_bitlen ); } static int aria_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aria_setkey_enc( (mbedtls_aria_context *) ctx, key, key_bitlen ); } static void * aria_ctx_alloc( void ) { mbedtls_aria_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_aria_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_aria_init( ctx ); return( ctx ); } static void aria_ctx_free( void *ctx ) { mbedtls_aria_free( (mbedtls_aria_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t aria_info = { MBEDTLS_CIPHER_ID_ARIA, aria_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) aria_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) aria_crypt_cfb128_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) aria_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif aria_setkey_enc_wrap, aria_setkey_dec_wrap, aria_ctx_alloc, aria_ctx_free }; static const mbedtls_cipher_info_t aria_128_ecb_info = { MBEDTLS_CIPHER_ARIA_128_ECB, MBEDTLS_MODE_ECB, 128, "ARIA-128-ECB", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_ecb_info = { MBEDTLS_CIPHER_ARIA_192_ECB, MBEDTLS_MODE_ECB, 192, "ARIA-192-ECB", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_ecb_info = { MBEDTLS_CIPHER_ARIA_256_ECB, MBEDTLS_MODE_ECB, 256, "ARIA-256-ECB", 16, 0, 16, &aria_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t aria_128_cbc_info = { MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MODE_CBC, 128, "ARIA-128-CBC", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_cbc_info = { MBEDTLS_CIPHER_ARIA_192_CBC, MBEDTLS_MODE_CBC, 192, "ARIA-192-CBC", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_cbc_info = { MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MODE_CBC, 256, "ARIA-256-CBC", 16, 0, 16, &aria_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t aria_128_cfb128_info = { MBEDTLS_CIPHER_ARIA_128_CFB128, MBEDTLS_MODE_CFB, 128, "ARIA-128-CFB128", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_cfb128_info = { MBEDTLS_CIPHER_ARIA_192_CFB128, MBEDTLS_MODE_CFB, 192, "ARIA-192-CFB128", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_cfb128_info = { MBEDTLS_CIPHER_ARIA_256_CFB128, MBEDTLS_MODE_CFB, 256, "ARIA-256-CFB128", 16, 0, 16, &aria_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t aria_128_ctr_info = { MBEDTLS_CIPHER_ARIA_128_CTR, MBEDTLS_MODE_CTR, 128, "ARIA-128-CTR", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_ctr_info = { MBEDTLS_CIPHER_ARIA_192_CTR, MBEDTLS_MODE_CTR, 192, "ARIA-192-CTR", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_ctr_info = { MBEDTLS_CIPHER_ARIA_256_CTR, MBEDTLS_MODE_CTR, 256, "ARIA-256-CTR", 16, 0, 16, &aria_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_GCM_C) static int gcm_aria_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA, key, key_bitlen ); } static const mbedtls_cipher_base_t gcm_aria_info = { MBEDTLS_CIPHER_ID_ARIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif gcm_aria_setkey_wrap, gcm_aria_setkey_wrap, gcm_ctx_alloc, gcm_ctx_free, }; static const mbedtls_cipher_info_t aria_128_gcm_info = { MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MODE_GCM, 128, "ARIA-128-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aria_info }; static const mbedtls_cipher_info_t aria_192_gcm_info = { MBEDTLS_CIPHER_ARIA_192_GCM, MBEDTLS_MODE_GCM, 192, "ARIA-192-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aria_info }; static const mbedtls_cipher_info_t aria_256_gcm_info = { MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MODE_GCM, 256, "ARIA-256-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aria_info }; #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) static int ccm_aria_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA, key, key_bitlen ); } static const mbedtls_cipher_base_t ccm_aria_info = { MBEDTLS_CIPHER_ID_ARIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif ccm_aria_setkey_wrap, ccm_aria_setkey_wrap, ccm_ctx_alloc, ccm_ctx_free, }; static const mbedtls_cipher_info_t aria_128_ccm_info = { MBEDTLS_CIPHER_ARIA_128_CCM, MBEDTLS_MODE_CCM, 128, "ARIA-128-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aria_info }; static const mbedtls_cipher_info_t aria_192_ccm_info = { MBEDTLS_CIPHER_ARIA_192_CCM, MBEDTLS_MODE_CCM, 192, "ARIA-192-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aria_info }; static const mbedtls_cipher_info_t aria_256_ccm_info = { MBEDTLS_CIPHER_ARIA_256_CCM, MBEDTLS_MODE_CCM, 256, "ARIA-256-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aria_info }; #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_DES_C) static int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { ((void) operation); return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output ); } static int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { ((void) operation); return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CBC) static int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ static int des_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key ); } static int des_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key ); } static int des3_set2key_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key ); } static int des3_set2key_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key ); } static int des3_set3key_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key ); } static int des3_set3key_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key ); } static void * des_ctx_alloc( void ) { mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) ); if( des == NULL ) return( NULL ); mbedtls_des_init( des ); return( des ); } static void des_ctx_free( void *ctx ) { mbedtls_des_free( (mbedtls_des_context *) ctx ); mbedtls_free( ctx ); } static void * des3_ctx_alloc( void ) { mbedtls_des3_context *des3; des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) ); if( des3 == NULL ) return( NULL ); mbedtls_des3_init( des3 ); return( des3 ); } static void des3_ctx_free( void *ctx ) { mbedtls_des3_free( (mbedtls_des3_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t des_info = { MBEDTLS_CIPHER_ID_DES, des_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) des_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif des_setkey_enc_wrap, des_setkey_dec_wrap, des_ctx_alloc, des_ctx_free }; static const mbedtls_cipher_info_t des_ecb_info = { MBEDTLS_CIPHER_DES_ECB, MBEDTLS_MODE_ECB, MBEDTLS_KEY_LENGTH_DES, "DES-ECB", 8, 0, 8, &des_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t des_cbc_info = { MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MODE_CBC, MBEDTLS_KEY_LENGTH_DES, "DES-CBC", 8, 0, 8, &des_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ static const mbedtls_cipher_base_t des_ede_info = { MBEDTLS_CIPHER_ID_DES, des3_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) des3_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif des3_set2key_enc_wrap, des3_set2key_dec_wrap, des3_ctx_alloc, des3_ctx_free }; static const mbedtls_cipher_info_t des_ede_ecb_info = { MBEDTLS_CIPHER_DES_EDE_ECB, MBEDTLS_MODE_ECB, MBEDTLS_KEY_LENGTH_DES_EDE, "DES-EDE-ECB", 8, 0, 8, &des_ede_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t des_ede_cbc_info = { MBEDTLS_CIPHER_DES_EDE_CBC, MBEDTLS_MODE_CBC, MBEDTLS_KEY_LENGTH_DES_EDE, "DES-EDE-CBC", 8, 0, 8, &des_ede_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ static const mbedtls_cipher_base_t des_ede3_info = { MBEDTLS_CIPHER_ID_3DES, des3_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) des3_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif des3_set3key_enc_wrap, des3_set3key_dec_wrap, des3_ctx_alloc, des3_ctx_free }; static const mbedtls_cipher_info_t des_ede3_ecb_info = { MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_MODE_ECB, MBEDTLS_KEY_LENGTH_DES_EDE3, "DES-EDE3-ECB", 8, 0, 8, &des_ede3_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t des_ede3_cbc_info = { MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MODE_CBC, MBEDTLS_KEY_LENGTH_DES_EDE3, "DES-EDE3-CBC", 8, 0, 8, &des_ede3_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_BLOWFISH_C) static int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static int blowfish_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen ); } static void * blowfish_ctx_alloc( void ) { mbedtls_blowfish_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_blowfish_init( ctx ); return( ctx ); } static void blowfish_ctx_free( void *ctx ) { mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t blowfish_info = { MBEDTLS_CIPHER_ID_BLOWFISH, blowfish_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) blowfish_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) blowfish_crypt_cfb64_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) blowfish_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif blowfish_setkey_wrap, blowfish_setkey_wrap, blowfish_ctx_alloc, blowfish_ctx_free }; static const mbedtls_cipher_info_t blowfish_ecb_info = { MBEDTLS_CIPHER_BLOWFISH_ECB, MBEDTLS_MODE_ECB, 128, "BLOWFISH-ECB", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t blowfish_cbc_info = { MBEDTLS_CIPHER_BLOWFISH_CBC, MBEDTLS_MODE_CBC, 128, "BLOWFISH-CBC", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t blowfish_cfb64_info = { MBEDTLS_CIPHER_BLOWFISH_CFB64, MBEDTLS_MODE_CFB, 128, "BLOWFISH-CFB64", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t blowfish_ctr_info = { MBEDTLS_CIPHER_BLOWFISH_CTR, MBEDTLS_MODE_CTR, 128, "BLOWFISH-CTR", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_ARC4_C) static int arc4_crypt_stream_wrap( void *ctx, size_t length, const unsigned char *input, unsigned char *output ) { return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) ); } static int arc4_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { /* we get key_bitlen in bits, arc4 expects it in bytes */ if( key_bitlen % 8 != 0 ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 ); return( 0 ); } static void * arc4_ctx_alloc( void ) { mbedtls_arc4_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_arc4_init( ctx ); return( ctx ); } static void arc4_ctx_free( void *ctx ) { mbedtls_arc4_free( (mbedtls_arc4_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t arc4_base_info = { MBEDTLS_CIPHER_ID_ARC4, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) arc4_crypt_stream_wrap, #endif arc4_setkey_wrap, arc4_setkey_wrap, arc4_ctx_alloc, arc4_ctx_free }; static const mbedtls_cipher_info_t arc4_128_info = { MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MODE_STREAM, 128, "ARC4-128", 0, 0, 1, &arc4_base_info }; #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CHACHA20_C) static int chacha20_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { if( key_bitlen != 256U ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if ( 0 != mbedtls_chacha20_setkey( (mbedtls_chacha20_context*)ctx, key ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( 0 ); } static int chacha20_stream_wrap( void *ctx, size_t length, const unsigned char *input, unsigned char *output ) { int ret; ret = mbedtls_chacha20_update( ctx, length, input, output ); if( ret == MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( ret ); } static void * chacha20_ctx_alloc( void ) { mbedtls_chacha20_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_chacha20_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_chacha20_init( ctx ); return( ctx ); } static void chacha20_ctx_free( void *ctx ) { mbedtls_chacha20_free( (mbedtls_chacha20_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t chacha20_base_info = { MBEDTLS_CIPHER_ID_CHACHA20, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) chacha20_stream_wrap, #endif chacha20_setkey_wrap, chacha20_setkey_wrap, chacha20_ctx_alloc, chacha20_ctx_free }; static const mbedtls_cipher_info_t chacha20_info = { MBEDTLS_CIPHER_CHACHA20, MBEDTLS_MODE_STREAM, 256, "CHACHA20", 12, 0, 1, &chacha20_base_info }; #endif /* MBEDTLS_CHACHA20_C */ #if defined(MBEDTLS_CHACHAPOLY_C) static int chachapoly_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { if( key_bitlen != 256U ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if ( 0 != mbedtls_chachapoly_setkey( (mbedtls_chachapoly_context*)ctx, key ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( 0 ); } static void * chachapoly_ctx_alloc( void ) { mbedtls_chachapoly_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_chachapoly_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_chachapoly_init( ctx ); return( ctx ); } static void chachapoly_ctx_free( void *ctx ) { mbedtls_chachapoly_free( (mbedtls_chachapoly_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t chachapoly_base_info = { MBEDTLS_CIPHER_ID_CHACHA20, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif chachapoly_setkey_wrap, chachapoly_setkey_wrap, chachapoly_ctx_alloc, chachapoly_ctx_free }; static const mbedtls_cipher_info_t chachapoly_info = { MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MODE_CHACHAPOLY, 256, "CHACHA20-POLY1305", 12, 0, 1, &chachapoly_base_info }; #endif /* MBEDTLS_CHACHAPOLY_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) static int null_crypt_stream( void *ctx, size_t length, const unsigned char *input, unsigned char *output ) { ((void) ctx); memmove( output, input, length ); return( 0 ); } static int null_setkey( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) ctx); ((void) key); ((void) key_bitlen); return( 0 ); } static void * null_ctx_alloc( void ) { return( (void *) 1 ); } static void null_ctx_free( void *ctx ) { ((void) ctx); } static const mbedtls_cipher_base_t null_base_info = { MBEDTLS_CIPHER_ID_NULL, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) null_crypt_stream, #endif null_setkey, null_setkey, null_ctx_alloc, null_ctx_free }; static const mbedtls_cipher_info_t null_cipher_info = { MBEDTLS_CIPHER_NULL, MBEDTLS_MODE_STREAM, 0, "NULL", 0, 0, 1, &null_base_info }; #endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */ const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] = { #if defined(MBEDTLS_AES_C) { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info }, { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info }, { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info }, { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info }, { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info }, { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info }, { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) { MBEDTLS_CIPHER_AES_128_OFB, &aes_128_ofb_info }, { MBEDTLS_CIPHER_AES_192_OFB, &aes_192_ofb_info }, { MBEDTLS_CIPHER_AES_256_OFB, &aes_256_ofb_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info }, { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info }, { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) { MBEDTLS_CIPHER_AES_128_XTS, &aes_128_xts_info }, { MBEDTLS_CIPHER_AES_256_XTS, &aes_256_xts_info }, #endif #if defined(MBEDTLS_GCM_C) { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info }, { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info }, { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info }, #endif #if defined(MBEDTLS_CCM_C) { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info }, { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info }, { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info }, #endif #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_ARC4_C) { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info }, #endif #if defined(MBEDTLS_BLOWFISH_C) { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info }, #endif #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_CAMELLIA_C) { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info }, { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info }, { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info }, #endif #if defined(MBEDTLS_GCM_C) { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info }, { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info }, { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info }, #endif #if defined(MBEDTLS_CCM_C) { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info }, #endif #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_ARIA_C) { MBEDTLS_CIPHER_ARIA_128_ECB, &aria_128_ecb_info }, { MBEDTLS_CIPHER_ARIA_192_ECB, &aria_192_ecb_info }, { MBEDTLS_CIPHER_ARIA_256_ECB, &aria_256_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_ARIA_128_CBC, &aria_128_cbc_info }, { MBEDTLS_CIPHER_ARIA_192_CBC, &aria_192_cbc_info }, { MBEDTLS_CIPHER_ARIA_256_CBC, &aria_256_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_ARIA_128_CFB128, &aria_128_cfb128_info }, { MBEDTLS_CIPHER_ARIA_192_CFB128, &aria_192_cfb128_info }, { MBEDTLS_CIPHER_ARIA_256_CFB128, &aria_256_cfb128_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_ARIA_128_CTR, &aria_128_ctr_info }, { MBEDTLS_CIPHER_ARIA_192_CTR, &aria_192_ctr_info }, { MBEDTLS_CIPHER_ARIA_256_CTR, &aria_256_ctr_info }, #endif #if defined(MBEDTLS_GCM_C) { MBEDTLS_CIPHER_ARIA_128_GCM, &aria_128_gcm_info }, { MBEDTLS_CIPHER_ARIA_192_GCM, &aria_192_gcm_info }, { MBEDTLS_CIPHER_ARIA_256_GCM, &aria_256_gcm_info }, #endif #if defined(MBEDTLS_CCM_C) { MBEDTLS_CIPHER_ARIA_128_CCM, &aria_128_ccm_info }, { MBEDTLS_CIPHER_ARIA_192_CCM, &aria_192_ccm_info }, { MBEDTLS_CIPHER_ARIA_256_CCM, &aria_256_ccm_info }, #endif #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_DES_C) { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info }, { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info }, { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info }, { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info }, { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info }, #endif #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_CHACHA20_C) { MBEDTLS_CIPHER_CHACHA20, &chacha20_info }, #endif #if defined(MBEDTLS_CHACHAPOLY_C) { MBEDTLS_CIPHER_CHACHA20_POLY1305, &chachapoly_info }, #endif #if defined(MBEDTLS_CIPHER_NULL_CIPHER) { MBEDTLS_CIPHER_NULL, &null_cipher_info }, #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ { MBEDTLS_CIPHER_NONE, NULL } }; #define NUM_CIPHERS sizeof mbedtls_cipher_definitions / sizeof mbedtls_cipher_definitions[0] int mbedtls_cipher_supported[NUM_CIPHERS]; #endif /* MBEDTLS_CIPHER_C */ fldigi-4.1.06/src/mbedtls/dhm.c0000664000175000017500000004511013507401434013122 00000000000000/* * Diffie-Hellman-Merkle key exchange * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The following sources were referenced in the design of this implementation * of the Diffie-Hellman-Merkle algorithm: * * [1] Handbook of Applied Cryptography - 1997, Chapter 12 * Menezes, van Oorschot and Vanstone * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_DHM_C) #include "mbedtls/dhm.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_ASN1_PARSE_C) #include "mbedtls/asn1.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #if !defined(MBEDTLS_DHM_ALT) #define DHM_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_DHM_BAD_INPUT_DATA ) #define DHM_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * helper to validate the mbedtls_mpi size and import it */ static int dhm_read_bignum( mbedtls_mpi *X, unsigned char **p, const unsigned char *end ) { int ret, n; if( end - *p < 2 ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); n = ( (*p)[0] << 8 ) | (*p)[1]; (*p) += 2; if( (int)( end - *p ) < n ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( ( ret = mbedtls_mpi_read_binary( X, *p, n ) ) != 0 ) return( MBEDTLS_ERR_DHM_READ_PARAMS_FAILED + ret ); (*p) += n; return( 0 ); } /* * Verify sanity of parameter with regards to P * * Parameter should be: 2 <= public_param <= P - 2 * * This means that we need to return an error if * public_param < 2 or public_param > P-2 * * For more information on the attack, see: * http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf * http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-2643 */ static int dhm_check_range( const mbedtls_mpi *param, const mbedtls_mpi *P ) { mbedtls_mpi L, U; int ret = 0; mbedtls_mpi_init( &L ); mbedtls_mpi_init( &U ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &L, 2 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &U, P, 2 ) ); if( mbedtls_mpi_cmp_mpi( param, &L ) < 0 || mbedtls_mpi_cmp_mpi( param, &U ) > 0 ) { ret = MBEDTLS_ERR_DHM_BAD_INPUT_DATA; } cleanup: mbedtls_mpi_free( &L ); mbedtls_mpi_free( &U ); return( ret ); } void mbedtls_dhm_init( mbedtls_dhm_context *ctx ) { DHM_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_dhm_context ) ); } /* * Parse the ServerKeyExchange parameters */ int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx, unsigned char **p, const unsigned char *end ) { int ret; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( p != NULL && *p != NULL ); DHM_VALIDATE_RET( end != NULL ); if( ( ret = dhm_read_bignum( &ctx->P, p, end ) ) != 0 || ( ret = dhm_read_bignum( &ctx->G, p, end ) ) != 0 || ( ret = dhm_read_bignum( &ctx->GY, p, end ) ) != 0 ) return( ret ); if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 ) return( ret ); ctx->len = mbedtls_mpi_size( &ctx->P ); return( 0 ); } /* * Setup and write the ServerKeyExchange parameters */ int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count = 0; size_t n1, n2, n3; unsigned char *p; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( output != NULL ); DHM_VALIDATE_RET( olen != NULL ); DHM_VALIDATE_RET( f_rng != NULL ); if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); /* * Generate X as large as possible ( < P ) */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED ); } while( dhm_check_range( &ctx->X, &ctx->P ) != 0 ); /* * Calculate GX = G^X mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X, &ctx->P , &ctx->RP ) ); if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 ) return( ret ); /* * export P, G, GX */ #define DHM_MPI_EXPORT( X, n ) \ do { \ MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( ( X ), \ p + 2, \ ( n ) ) ); \ *p++ = (unsigned char)( ( n ) >> 8 ); \ *p++ = (unsigned char)( ( n ) ); \ p += ( n ); \ } while( 0 ) n1 = mbedtls_mpi_size( &ctx->P ); n2 = mbedtls_mpi_size( &ctx->G ); n3 = mbedtls_mpi_size( &ctx->GX ); p = output; DHM_MPI_EXPORT( &ctx->P , n1 ); DHM_MPI_EXPORT( &ctx->G , n2 ); DHM_MPI_EXPORT( &ctx->GX, n3 ); *olen = p - output; ctx->len = n1; cleanup: if( ret != 0 ) return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED + ret ); return( 0 ); } /* * Set prime modulus and generator */ int mbedtls_dhm_set_group( mbedtls_dhm_context *ctx, const mbedtls_mpi *P, const mbedtls_mpi *G ) { int ret; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( P != NULL ); DHM_VALIDATE_RET( G != NULL ); if( ( ret = mbedtls_mpi_copy( &ctx->P, P ) ) != 0 || ( ret = mbedtls_mpi_copy( &ctx->G, G ) ) != 0 ) { return( MBEDTLS_ERR_DHM_SET_GROUP_FAILED + ret ); } ctx->len = mbedtls_mpi_size( &ctx->P ); return( 0 ); } /* * Import the peer's public value G^Y */ int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx, const unsigned char *input, size_t ilen ) { int ret; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( input != NULL ); if( ilen < 1 || ilen > ctx->len ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( ( ret = mbedtls_mpi_read_binary( &ctx->GY, input, ilen ) ) != 0 ) return( MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED + ret ); return( 0 ); } /* * Create own private value X and export G^X */ int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count = 0; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( output != NULL ); DHM_VALIDATE_RET( f_rng != NULL ); if( olen < 1 || olen > ctx->len ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); /* * generate X and calculate GX = G^X mod P */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED ); } while( dhm_check_range( &ctx->X, &ctx->P ) != 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X, &ctx->P , &ctx->RP ) ); if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 ) return( ret ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->GX, output, olen ) ); cleanup: if( ret != 0 ) return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED + ret ); return( 0 ); } /* * Use the blinding method and optimisation suggested in section 10 of: * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA, * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer * Berlin Heidelberg, 1996. p. 104-113. */ static int dhm_update_blinding( mbedtls_dhm_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count; /* * Don't use any blinding the first time a particular X is used, * but remember it to use blinding next time. */ if( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->pX ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &ctx->pX, &ctx->X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vi, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vf, 1 ) ); return( 0 ); } /* * Ok, we need blinding. Can we re-use existing values? * If yes, just update them by squaring them. */ if( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->P ) ); return( 0 ); } /* * We need to generate blinding values from scratch */ /* Vi = random( 2, P-1 ) */ count = 0; do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vi, mbedtls_mpi_size( &ctx->P ), f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &ctx->Vi, &ctx->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->Vi, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); } while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) <= 0 ); /* Vf = Vi^-X mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vf, &ctx->Vi, &ctx->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vf, &ctx->Vf, &ctx->X, &ctx->P, &ctx->RP ) ); cleanup: return( ret ); } /* * Derive and export the shared secret (G^Y)^X mod P */ int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx, unsigned char *output, size_t output_size, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi GYb; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( output != NULL ); DHM_VALIDATE_RET( olen != NULL ); if( output_size < ctx->len ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 ) return( ret ); mbedtls_mpi_init( &GYb ); /* Blind peer's value */ if( f_rng != NULL ) { MBEDTLS_MPI_CHK( dhm_update_blinding( ctx, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &GYb, &ctx->GY, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &GYb, &GYb, &ctx->P ) ); } else MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &GYb, &ctx->GY ) ); /* Do modular exponentiation */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->K, &GYb, &ctx->X, &ctx->P, &ctx->RP ) ); /* Unblind secret value */ if( f_rng != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->K, &ctx->K, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->K, &ctx->K, &ctx->P ) ); } *olen = mbedtls_mpi_size( &ctx->K ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->K, output, *olen ) ); cleanup: mbedtls_mpi_free( &GYb ); if( ret != 0 ) return( MBEDTLS_ERR_DHM_CALC_SECRET_FAILED + ret ); return( 0 ); } /* * Free the components of a DHM key */ void mbedtls_dhm_free( mbedtls_dhm_context *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->pX ); mbedtls_mpi_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->K ); mbedtls_mpi_free( &ctx->GY ); mbedtls_mpi_free( &ctx->GX ); mbedtls_mpi_free( &ctx->X ); mbedtls_mpi_free( &ctx->G ); mbedtls_mpi_free( &ctx->P ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_dhm_context ) ); } #if defined(MBEDTLS_ASN1_PARSE_C) /* * Parse DHM parameters */ int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin, size_t dhminlen ) { int ret; size_t len; unsigned char *p, *end; #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_context pem; #endif /* MBEDTLS_PEM_PARSE_C */ DHM_VALIDATE_RET( dhm != NULL ); DHM_VALIDATE_RET( dhmin != NULL ); #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_init( &pem ); /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( dhminlen == 0 || dhmin[dhminlen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN DH PARAMETERS-----", "-----END DH PARAMETERS-----", dhmin, NULL, 0, &dhminlen ); if( ret == 0 ) { /* * Was PEM encoded */ dhminlen = pem.buflen; } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) goto exit; p = ( ret == 0 ) ? pem.buf : (unsigned char *) dhmin; #else p = (unsigned char *) dhmin; #endif /* MBEDTLS_PEM_PARSE_C */ end = p + dhminlen; /* * DHParams ::= SEQUENCE { * prime INTEGER, -- P * generator INTEGER, -- g * privateValueLength INTEGER OPTIONAL * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret; goto exit; } end = p + len; if( ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->P ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->G ) ) != 0 ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret; goto exit; } if( p != end ) { /* This might be the optional privateValueLength. * If so, we can cleanly discard it */ mbedtls_mpi rec; mbedtls_mpi_init( &rec ); ret = mbedtls_asn1_get_mpi( &p, end, &rec ); mbedtls_mpi_free( &rec ); if ( ret != 0 ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret; goto exit; } if ( p != end ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; goto exit; } } ret = 0; dhm->len = mbedtls_mpi_size( &dhm->P ); exit: #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_free( &pem ); #endif if( ret != 0 ) mbedtls_dhm_free( dhm ); return( ret ); } #if defined(MBEDTLS_FS_IO) /* * Load all data from a file into a given buffer. * * The file is expected to contain either PEM or DER encoded data. * A terminating null byte is always appended. It is included in the announced * length only if the data looks like it is PEM encoded. */ static int load_file( const char *path, unsigned char **buf, size_t *n ) { FILE *f; long size; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_DHM_FILE_IO_ERROR ); fseek( f, 0, SEEK_END ); if( ( size = ftell( f ) ) == -1 ) { fclose( f ); return( MBEDTLS_ERR_DHM_FILE_IO_ERROR ); } fseek( f, 0, SEEK_SET ); *n = (size_t) size; if( *n + 1 == 0 || ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL ) { fclose( f ); return( MBEDTLS_ERR_DHM_ALLOC_FAILED ); } if( fread( *buf, 1, *n, f ) != *n ) { fclose( f ); mbedtls_platform_zeroize( *buf, *n + 1 ); mbedtls_free( *buf ); return( MBEDTLS_ERR_DHM_FILE_IO_ERROR ); } fclose( f ); (*buf)[*n] = '\0'; if( strstr( (const char *) *buf, "-----BEGIN " ) != NULL ) ++*n; return( 0 ); } /* * Load and parse DHM parameters */ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ) { int ret; size_t n; unsigned char *buf; DHM_VALIDATE_RET( dhm != NULL ); DHM_VALIDATE_RET( path != NULL ); if( ( ret = load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_dhm_parse_dhm( dhm, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ #endif /* MBEDTLS_ASN1_PARSE_C */ #endif /* MBEDTLS_DHM_ALT */ #if defined(MBEDTLS_SELF_TEST) static const char mbedtls_test_dhm_params[] = "-----BEGIN DH PARAMETERS-----\r\n" "MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\r\n" "1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\r\n" "9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\r\n" "-----END DH PARAMETERS-----\r\n"; static const size_t mbedtls_test_dhm_params_len = sizeof( mbedtls_test_dhm_params ); /* * Checkup routine */ int mbedtls_dhm_self_test( int verbose ) { int ret; mbedtls_dhm_context dhm; mbedtls_dhm_init( &dhm ); if( verbose != 0 ) mbedtls_printf( " DHM parameter load: " ); if( ( ret = mbedtls_dhm_parse_dhm( &dhm, (const unsigned char *) mbedtls_test_dhm_params, mbedtls_test_dhm_params_len ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n\n" ); exit: mbedtls_dhm_free( &dhm ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_DHM_C */ fldigi-4.1.06/src/mbedtls/md2.c0000664000175000017500000002254613507401434013044 00000000000000/* * RFC 1115/1319 compliant MD2 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The MD2 algorithm was designed by Ron Rivest in 1989. * * http://www.ietf.org/rfc/rfc1115.txt * http://www.ietf.org/rfc/rfc1319.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD2_C) #include "mbedtls/md2.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD2_ALT) static const unsigned char PI_SUBST[256] = { 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14 }; void mbedtls_md2_init( mbedtls_md2_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_md2_context ) ); } void mbedtls_md2_free( mbedtls_md2_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md2_context ) ); } void mbedtls_md2_clone( mbedtls_md2_context *dst, const mbedtls_md2_context *src ) { *dst = *src; } /* * MD2 context setup */ int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx ) { memset( ctx->cksum, 0, 16 ); memset( ctx->state, 0, 46 ); memset( ctx->buffer, 0, 16 ); ctx->left = 0; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_starts( mbedtls_md2_context *ctx ) { mbedtls_md2_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_MD2_PROCESS_ALT) int mbedtls_internal_md2_process( mbedtls_md2_context *ctx ) { int i, j; unsigned char t = 0; for( i = 0; i < 16; i++ ) { ctx->state[i + 16] = ctx->buffer[i]; ctx->state[i + 32] = (unsigned char)( ctx->buffer[i] ^ ctx->state[i]); } for( i = 0; i < 18; i++ ) { for( j = 0; j < 48; j++ ) { ctx->state[j] = (unsigned char) ( ctx->state[j] ^ PI_SUBST[t] ); t = ctx->state[j]; } t = (unsigned char)( t + i ); } t = ctx->cksum[15]; for( i = 0; i < 16; i++ ) { ctx->cksum[i] = (unsigned char) ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] ); t = ctx->cksum[i]; } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_process( mbedtls_md2_context *ctx ) { mbedtls_internal_md2_process( ctx ); } #endif #endif /* !MBEDTLS_MD2_PROCESS_ALT */ /* * MD2 process buffer */ int mbedtls_md2_update_ret( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; while( ilen > 0 ) { if( ilen > 16 - ctx->left ) fill = 16 - ctx->left; else fill = ilen; memcpy( ctx->buffer + ctx->left, input, fill ); ctx->left += fill; input += fill; ilen -= fill; if( ctx->left == 16 ) { ctx->left = 0; if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 ) return( ret ); } } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_md2_update_ret( ctx, input, ilen ); } #endif /* * MD2 final digest */ int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx, unsigned char output[16] ) { int ret; size_t i; unsigned char x; x = (unsigned char)( 16 - ctx->left ); for( i = ctx->left; i < 16; i++ ) ctx->buffer[i] = x; if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 ) return( ret ); memcpy( ctx->buffer, ctx->cksum, 16 ); if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 ) return( ret ); memcpy( output, ctx->state, 16 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] ) { mbedtls_md2_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_MD2_ALT */ /* * output = MD2( input buffer ) */ int mbedtls_md2_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ) { int ret; mbedtls_md2_context ctx; mbedtls_md2_init( &ctx ); if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md2_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md2_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_md2_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] ) { mbedtls_md2_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * RFC 1319 test vectors */ static const unsigned char md2_test_str[7][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" } }; static const size_t md2_test_strlen[7] = { 0, 1, 3, 14, 26, 62, 80 }; static const unsigned char md2_test_sum[7][16] = { { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D, 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 }, { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72, 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 }, { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B, 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB }, { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B, 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 }, { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB, 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B }, { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39, 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD }, { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D, 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 } }; /* * Checkup routine */ int mbedtls_md2_self_test( int verbose ) { int i, ret = 0; unsigned char md2sum[16]; for( i = 0; i < 7; i++ ) { if( verbose != 0 ) mbedtls_printf( " MD2 test #%d: ", i + 1 ); ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum ); if( ret != 0 ) goto fail; if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MD2_C */ fldigi-4.1.06/src/mbedtls/camellia.c0000664000175000017500000011060313507401434014121 00000000000000/* * Camellia implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The Camellia block cipher was designed by NTT and Mitsubishi Electric * Corporation. * * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CAMELLIA_C) #include "mbedtls/camellia.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CAMELLIA_ALT) /* Parameter validation macros */ #define CAMELLIA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ) #define CAMELLIA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif static const unsigned char SIGMA_CHARS[6][8] = { { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b }, { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 }, { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe }, { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c }, { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d }, { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd } }; #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY) static const unsigned char FSb[256] = { 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65, 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189, 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26, 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77, 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153, 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215, 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34, 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80, 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210, 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148, 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226, 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46, 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89, 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250, 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164, 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158 }; #define SBOX1(n) FSb[(n)] #define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff) #define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff) #define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff] #else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ static const unsigned char FSb[256] = { 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65, 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189, 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26, 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77, 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153, 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215, 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34, 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80, 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210, 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148, 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226, 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46, 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89, 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250, 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164, 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158 }; static const unsigned char FSb2[256] = { 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130, 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123, 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52, 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154, 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51, 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175, 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68, 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160, 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165, 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41, 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197, 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92, 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178, 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245, 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73, 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61 }; static const unsigned char FSb3[256] = { 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160, 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222, 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13, 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166, 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204, 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235, 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17, 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40, 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105, 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74, 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113, 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23, 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172, 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125, 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82, 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79 }; static const unsigned char FSb4[256] = { 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146, 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108, 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4, 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105, 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221, 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99, 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141, 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128, 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189, 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77, 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215, 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80, 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148, 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46, 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250, 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158 }; #define SBOX1(n) FSb[(n)] #define SBOX2(n) FSb2[(n)] #define SBOX3(n) FSb3[(n)] #define SBOX4(n) FSb4[(n)] #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ static const unsigned char shifts[2][4][4] = { { { 1, 1, 1, 1 }, /* KL */ { 0, 0, 0, 0 }, /* KR */ { 1, 1, 1, 1 }, /* KA */ { 0, 0, 0, 0 } /* KB */ }, { { 1, 0, 1, 1 }, /* KL */ { 1, 1, 0, 1 }, /* KR */ { 1, 1, 1, 0 }, /* KA */ { 1, 1, 0, 1 } /* KB */ } }; static const signed char indexes[2][4][20] = { { { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39, 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */ { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */ }, { { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1, -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */ { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17, 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */ { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59, 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */ { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21, 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */ } }; static const signed char transposes[2][20] = { { 21, 22, 23, 20, -1, -1, -1, -1, 18, 19, 16, 17, 11, 8, 9, 10, 15, 12, 13, 14 }, { 25, 26, 27, 24, 29, 30, 31, 28, 18, 19, 16, 17, -1, -1, -1, -1, -1, -1, -1, -1 } }; /* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */ #define ROTL(DEST, SRC, SHIFT) \ { \ (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \ (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \ (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \ (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \ } #define FL(XL, XR, KL, KR) \ { \ (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \ (XL) = ((XR) | (KR)) ^ (XL); \ } #define FLInv(YL, YR, KL, KR) \ { \ (YL) = ((YR) | (KR)) ^ (YL); \ (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \ } #define SHIFT_AND_PLACE(INDEX, OFFSET) \ { \ TK[0] = KC[(OFFSET) * 4 + 0]; \ TK[1] = KC[(OFFSET) * 4 + 1]; \ TK[2] = KC[(OFFSET) * 4 + 2]; \ TK[3] = KC[(OFFSET) * 4 + 3]; \ \ for( i = 1; i <= 4; i++ ) \ if( shifts[(INDEX)][(OFFSET)][i -1] ) \ ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \ \ for( i = 0; i < 20; i++ ) \ if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \ RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \ } \ } static void camellia_feistel( const uint32_t x[2], const uint32_t k[2], uint32_t z[2]) { uint32_t I0, I1; I0 = x[0] ^ k[0]; I1 = x[1] ^ k[1]; I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) | ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) | ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) | ((uint32_t) SBOX4((I0 ) & 0xFF) ); I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) | ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) | ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) | ((uint32_t) SBOX1((I1 ) & 0xFF) ); I0 ^= (I1 << 8) | (I1 >> 24); I1 ^= (I0 << 16) | (I0 >> 16); I0 ^= (I1 >> 8) | (I1 << 24); I1 ^= (I0 >> 8) | (I0 << 24); z[0] ^= I1; z[1] ^= I0; } void mbedtls_camellia_init( mbedtls_camellia_context *ctx ) { CAMELLIA_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_camellia_context ) ); } void mbedtls_camellia_free( mbedtls_camellia_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) ); } /* * Camellia key schedule (encryption) */ int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ) { int idx; size_t i; uint32_t *RK; unsigned char t[64]; uint32_t SIGMA[6][2]; uint32_t KC[16]; uint32_t TK[20]; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( key != NULL ); RK = ctx->rk; memset( t, 0, 64 ); memset( RK, 0, sizeof(ctx->rk) ); switch( keybits ) { case 128: ctx->nr = 3; idx = 0; break; case 192: case 256: ctx->nr = 4; idx = 1; break; default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ); } for( i = 0; i < keybits / 8; ++i ) t[i] = key[i]; if( keybits == 192 ) { for( i = 0; i < 8; i++ ) t[24 + i] = ~t[16 + i]; } /* * Prepare SIGMA values */ for( i = 0; i < 6; i++ ) { GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 ); GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 ); } /* * Key storage in KC * Order: KL, KR, KA, KB */ memset( KC, 0, sizeof(KC) ); /* Store KL, KR */ for( i = 0; i < 8; i++ ) GET_UINT32_BE( KC[i], t, i * 4 ); /* Generate KA */ for( i = 0; i < 4; ++i ) KC[8 + i] = KC[i] ^ KC[4 + i]; camellia_feistel( KC + 8, SIGMA[0], KC + 10 ); camellia_feistel( KC + 10, SIGMA[1], KC + 8 ); for( i = 0; i < 4; ++i ) KC[8 + i] ^= KC[i]; camellia_feistel( KC + 8, SIGMA[2], KC + 10 ); camellia_feistel( KC + 10, SIGMA[3], KC + 8 ); if( keybits > 128 ) { /* Generate KB */ for( i = 0; i < 4; ++i ) KC[12 + i] = KC[4 + i] ^ KC[8 + i]; camellia_feistel( KC + 12, SIGMA[4], KC + 14 ); camellia_feistel( KC + 14, SIGMA[5], KC + 12 ); } /* * Generating subkeys */ /* Manipulating KL */ SHIFT_AND_PLACE( idx, 0 ); /* Manipulating KR */ if( keybits > 128 ) { SHIFT_AND_PLACE( idx, 1 ); } /* Manipulating KA */ SHIFT_AND_PLACE( idx, 2 ); /* Manipulating KB */ if( keybits > 128 ) { SHIFT_AND_PLACE( idx, 3 ); } /* Do transpositions */ for( i = 0; i < 20; i++ ) { if( transposes[idx][i] != -1 ) { RK[32 + 12 * idx + i] = RK[transposes[idx][i]]; } } return( 0 ); } /* * Camellia key schedule (decryption) */ int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ) { int idx, ret; size_t i; mbedtls_camellia_context cty; uint32_t *RK; uint32_t *SK; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( key != NULL ); mbedtls_camellia_init( &cty ); /* Also checks keybits */ if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 ) goto exit; ctx->nr = cty.nr; idx = ( ctx->nr == 4 ); RK = ctx->rk; SK = cty.rk + 24 * 2 + 8 * idx * 2; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 ) { *RK++ = *SK++; *RK++ = *SK++; } SK -= 2; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; exit: mbedtls_camellia_free( &cty ); return( ret ); } /* * Camellia-ECB block encryption/decryption */ int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { int NR; uint32_t *RK, X[4]; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT || mode == MBEDTLS_CAMELLIA_DECRYPT ); CAMELLIA_VALIDATE_RET( input != NULL ); CAMELLIA_VALIDATE_RET( output != NULL ); ( (void) mode ); NR = ctx->nr; RK = ctx->rk; GET_UINT32_BE( X[0], input, 0 ); GET_UINT32_BE( X[1], input, 4 ); GET_UINT32_BE( X[2], input, 8 ); GET_UINT32_BE( X[3], input, 12 ); X[0] ^= *RK++; X[1] ^= *RK++; X[2] ^= *RK++; X[3] ^= *RK++; while( NR ) { --NR; camellia_feistel( X, RK, X + 2 ); RK += 2; camellia_feistel( X + 2, RK, X ); RK += 2; camellia_feistel( X, RK, X + 2 ); RK += 2; camellia_feistel( X + 2, RK, X ); RK += 2; camellia_feistel( X, RK, X + 2 ); RK += 2; camellia_feistel( X + 2, RK, X ); RK += 2; if( NR ) { FL(X[0], X[1], RK[0], RK[1]); RK += 2; FLInv(X[2], X[3], RK[0], RK[1]); RK += 2; } } X[2] ^= *RK++; X[3] ^= *RK++; X[0] ^= *RK++; X[1] ^= *RK++; PUT_UINT32_BE( X[2], output, 0 ); PUT_UINT32_BE( X[3], output, 4 ); PUT_UINT32_BE( X[0], output, 8 ); PUT_UINT32_BE( X[1], output, 12 ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * Camellia-CBC buffer encryption/decryption */ int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[16]; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT || mode == MBEDTLS_CAMELLIA_DECRYPT ); CAMELLIA_VALIDATE_RET( iv != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || input != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || output != NULL ); if( length % 16 ) return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_CAMELLIA_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, 16 ); mbedtls_camellia_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 16 ); input += 16; output += 16; length -= 16; } } else { while( length > 0 ) { for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_camellia_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, 16 ); input += 16; output += 16; length -= 16; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * Camellia-CFB128 buffer encryption/decryption */ int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int c; size_t n; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT || mode == MBEDTLS_CAMELLIA_DECRYPT ); CAMELLIA_VALIDATE_RET( iv != NULL ); CAMELLIA_VALIDATE_RET( iv_off != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || input != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || output != NULL ); n = *iv_off; if( n >= 16 ) return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ); if( mode == MBEDTLS_CAMELLIA_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv ); c = *input++; *output++ = (unsigned char)( c ^ iv[n] ); iv[n] = (unsigned char) c; n = ( n + 1 ) & 0x0F; } } else { while( length-- ) { if( n == 0 ) mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) & 0x0F; } } *iv_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * Camellia-CTR buffer encryption/decryption */ int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( nonce_counter != NULL ); CAMELLIA_VALIDATE_RET( stream_block != NULL ); CAMELLIA_VALIDATE_RET( nc_off != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || input != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || output != NULL ); n = *nc_off; if( n >= 16 ) return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter, stream_block ); for( i = 16; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) & 0x0F; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* !MBEDTLS_CAMELLIA_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * Camellia test vectors from: * * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html: * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt * (For each bitlength: Key 0, Nr 39) */ #define CAMELLIA_TESTS_ECB 2 static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] = { { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, }; static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] = { { { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73, 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 }, { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE, 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 } }, { { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8, 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 }, { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9, 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 } }, { { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c, 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 }, { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C, 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 } } }; #if defined(MBEDTLS_CIPHER_MODE_CBC) #define CAMELLIA_TESTS_CBC 3 static const unsigned char camellia_test_cbc_key[3][32] = { { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C } , { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B } , { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } }; static const unsigned char camellia_test_cbc_iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F } ; static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] = { { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A }, { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 }, { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF } }; static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] = { { { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0, 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB }, { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78, 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 }, { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B, 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 } }, { { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2, 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 }, { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42, 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 }, { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8, 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 } }, { { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A, 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA }, { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40, 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 }, { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA, 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 } } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * Camellia-CTR test vectors from: * * http://www.faqs.org/rfcs/rfc5528.html */ static const unsigned char camellia_test_ctr_key[3][16] = { { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } }; static const unsigned char camellia_test_ctr_nonce_counter[3][16] = { { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } }; static const unsigned char camellia_test_ctr_pt[3][48] = { { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23 } }; static const unsigned char camellia_test_ctr_ct[3][48] = { { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A, 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F }, { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4, 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44, 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7, 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 }, { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88, 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73, 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1, 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD, 0xDF, 0x50, 0x86, 0x96 } }; static const int camellia_test_ctr_len[3] = { 16, 32, 36 }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ /* * Checkup routine */ int mbedtls_camellia_self_test( int verbose ) { int i, j, u, v; unsigned char key[32]; unsigned char buf[64]; unsigned char src[16]; unsigned char dst[16]; #if defined(MBEDTLS_CIPHER_MODE_CBC) unsigned char iv[16]; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) size_t offset, len; unsigned char nonce_counter[16]; unsigned char stream_block[16]; #endif mbedtls_camellia_context ctx; memset( key, 0, 32 ); for( j = 0; j < 6; j++ ) { u = j >> 1; v = j & 1; if( verbose != 0 ) mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64, (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc"); for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) { memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u ); if( v == MBEDTLS_CAMELLIA_DECRYPT ) { mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 ); memcpy( src, camellia_test_ecb_cipher[u][i], 16 ); memcpy( dst, camellia_test_ecb_plain[i], 16 ); } else { /* MBEDTLS_CAMELLIA_ENCRYPT */ mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 ); memcpy( src, camellia_test_ecb_plain[i], 16 ); memcpy( dst, camellia_test_ecb_cipher[u][i], 16 ); } mbedtls_camellia_crypt_ecb( &ctx, v, src, buf ); if( memcmp( buf, dst, 16 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * CBC mode */ for( j = 0; j < 6; j++ ) { u = j >> 1; v = j & 1; if( verbose != 0 ) mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64, ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" ); memcpy( src, camellia_test_cbc_iv, 16 ); memcpy( dst, camellia_test_cbc_iv, 16 ); memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u ); if( v == MBEDTLS_CAMELLIA_DECRYPT ) { mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 ); } else { mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 ); } for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) { if( v == MBEDTLS_CAMELLIA_DECRYPT ) { memcpy( iv , src, 16 ); memcpy( src, camellia_test_cbc_cipher[u][i], 16 ); memcpy( dst, camellia_test_cbc_plain[i], 16 ); } else { /* MBEDTLS_CAMELLIA_ENCRYPT */ memcpy( iv , dst, 16 ); memcpy( src, camellia_test_cbc_plain[i], 16 ); memcpy( dst, camellia_test_cbc_cipher[u][i], 16 ); } mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf ); if( memcmp( buf, dst, 16 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * CTR mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; v = i & 1; if( verbose != 0 ) mbedtls_printf( " CAMELLIA-CTR-128 (%s): ", ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" ); memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 ); memcpy( key, camellia_test_ctr_key[u], 16 ); offset = 0; mbedtls_camellia_setkey_enc( &ctx, key, 128 ); if( v == MBEDTLS_CAMELLIA_DECRYPT ) { len = camellia_test_ctr_len[u]; memcpy( buf, camellia_test_ctr_ct[u], len ); mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } else { len = camellia_test_ctr_len[u]; memcpy( buf, camellia_test_ctr_pt[u], len ); mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CAMELLIA_C */ fldigi-4.1.06/src/mbedtls/sha512.c0000664000175000017500000004464613507401434013372 00000000000000/* * FIPS-180-2 compliant SHA-384/512 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SHA-512 Secure Hash Standard was published by NIST in 2002. * * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SHA512_C) #include "mbedtls/sha512.h" #include "mbedtls/platform_util.h" #if defined(_MSC_VER) || defined(__WATCOMC__) #define UL64(x) x##ui64 #else #define UL64(x) x##ULL #endif #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define SHA512_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA ) #define SHA512_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond ) #if !defined(MBEDTLS_SHA512_ALT) /* * 64-bit integer manipulation macros (big endian) */ #ifndef GET_UINT64_BE #define GET_UINT64_BE(n,b,i) \ { \ (n) = ( (uint64_t) (b)[(i) ] << 56 ) \ | ( (uint64_t) (b)[(i) + 1] << 48 ) \ | ( (uint64_t) (b)[(i) + 2] << 40 ) \ | ( (uint64_t) (b)[(i) + 3] << 32 ) \ | ( (uint64_t) (b)[(i) + 4] << 24 ) \ | ( (uint64_t) (b)[(i) + 5] << 16 ) \ | ( (uint64_t) (b)[(i) + 6] << 8 ) \ | ( (uint64_t) (b)[(i) + 7] ); \ } #endif /* GET_UINT64_BE */ #ifndef PUT_UINT64_BE #define PUT_UINT64_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \ (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \ (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 7] = (unsigned char) ( (n) ); \ } #endif /* PUT_UINT64_BE */ void mbedtls_sha512_init( mbedtls_sha512_context *ctx ) { SHA512_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_sha512_context ) ); } void mbedtls_sha512_free( mbedtls_sha512_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha512_context ) ); } void mbedtls_sha512_clone( mbedtls_sha512_context *dst, const mbedtls_sha512_context *src ) { SHA512_VALIDATE( dst != NULL ); SHA512_VALIDATE( src != NULL ); *dst = *src; } /* * SHA-512 context setup */ int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 ) { SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 ); ctx->total[0] = 0; ctx->total[1] = 0; if( is384 == 0 ) { /* SHA-512 */ ctx->state[0] = UL64(0x6A09E667F3BCC908); ctx->state[1] = UL64(0xBB67AE8584CAA73B); ctx->state[2] = UL64(0x3C6EF372FE94F82B); ctx->state[3] = UL64(0xA54FF53A5F1D36F1); ctx->state[4] = UL64(0x510E527FADE682D1); ctx->state[5] = UL64(0x9B05688C2B3E6C1F); ctx->state[6] = UL64(0x1F83D9ABFB41BD6B); ctx->state[7] = UL64(0x5BE0CD19137E2179); } else { /* SHA-384 */ ctx->state[0] = UL64(0xCBBB9D5DC1059ED8); ctx->state[1] = UL64(0x629A292A367CD507); ctx->state[2] = UL64(0x9159015A3070DD17); ctx->state[3] = UL64(0x152FECD8F70E5939); ctx->state[4] = UL64(0x67332667FFC00B31); ctx->state[5] = UL64(0x8EB44A8768581511); ctx->state[6] = UL64(0xDB0C2E0D64F98FA7); ctx->state[7] = UL64(0x47B5481DBEFA4FA4); } ctx->is384 = is384; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 ) { mbedtls_sha512_starts_ret( ctx, is384 ); } #endif #if !defined(MBEDTLS_SHA512_PROCESS_ALT) /* * Round constants */ static const uint64_t K[80] = { UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD), UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC), UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019), UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118), UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE), UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2), UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1), UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694), UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3), UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65), UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483), UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5), UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210), UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4), UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725), UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70), UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926), UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF), UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8), UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B), UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001), UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30), UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910), UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8), UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53), UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8), UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB), UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3), UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60), UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC), UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9), UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B), UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207), UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178), UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6), UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B), UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493), UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C), UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A), UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817) }; int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ) { int i; uint64_t temp1, temp2, W[80]; uint64_t A, B, C, D, E, F, G, H; SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( (const unsigned char *)data != NULL ); #define SHR(x,n) (x >> n) #define ROTR(x,n) (SHR(x,n) | (x << (64 - n))) #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) #define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6)) #define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) #define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) #define F0(x,y,z) ((x & y) | (z & (x | y))) #define F1(x,y,z) (z ^ (x & (y ^ z))) #define P(a,b,c,d,e,f,g,h,x,K) \ { \ temp1 = h + S3(e) + F1(e,f,g) + K + x; \ temp2 = S2(a) + F0(a,b,c); \ d += temp1; h = temp1 + temp2; \ } for( i = 0; i < 16; i++ ) { GET_UINT64_BE( W[i], data, i << 3 ); } for( ; i < 80; i++ ) { W[i] = S1(W[i - 2]) + W[i - 7] + S0(W[i - 15]) + W[i - 16]; } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; E = ctx->state[4]; F = ctx->state[5]; G = ctx->state[6]; H = ctx->state[7]; i = 0; do { P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++; P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++; P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++; P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++; P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++; P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++; P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++; P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++; } while( i < 80 ); ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; ctx->state[4] += E; ctx->state[5] += F; ctx->state[6] += G; ctx->state[7] += H; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ) { mbedtls_internal_sha512_process( ctx, data ); } #endif #endif /* !MBEDTLS_SHA512_PROCESS_ALT */ /* * SHA-512 process buffer */ int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; unsigned int left; SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( ilen == 0 || input != NULL ); if( ilen == 0 ) return( 0 ); left = (unsigned int) (ctx->total[0] & 0x7F); fill = 128 - left; ctx->total[0] += (uint64_t) ilen; if( ctx->total[0] < (uint64_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 128 ) { if( ( ret = mbedtls_internal_sha512_process( ctx, input ) ) != 0 ) return( ret ); input += 128; ilen -= 128; } if( ilen > 0 ) memcpy( (void *) (ctx->buffer + left), input, ilen ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_sha512_update_ret( ctx, input, ilen ); } #endif /* * SHA-512 final digest */ int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx, unsigned char output[64] ) { int ret; unsigned used; uint64_t high, low; SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( (unsigned char *)output != NULL ); /* * Add padding: 0x80 then 0x00 until 16 bytes remain for the length */ used = ctx->total[0] & 0x7F; ctx->buffer[used++] = 0x80; if( used <= 112 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 112 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 128 - used ); if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 112 ); } /* * Add message length */ high = ( ctx->total[0] >> 61 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT64_BE( high, ctx->buffer, 112 ); PUT_UINT64_BE( low, ctx->buffer, 120 ); if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT64_BE( ctx->state[0], output, 0 ); PUT_UINT64_BE( ctx->state[1], output, 8 ); PUT_UINT64_BE( ctx->state[2], output, 16 ); PUT_UINT64_BE( ctx->state[3], output, 24 ); PUT_UINT64_BE( ctx->state[4], output, 32 ); PUT_UINT64_BE( ctx->state[5], output, 40 ); if( ctx->is384 == 0 ) { PUT_UINT64_BE( ctx->state[6], output, 48 ); PUT_UINT64_BE( ctx->state[7], output, 56 ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] ) { mbedtls_sha512_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_SHA512_ALT */ /* * output = SHA-512( input buffer ) */ int mbedtls_sha512_ret( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ) { int ret; mbedtls_sha512_context ctx; SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 ); SHA512_VALIDATE_RET( ilen == 0 || input != NULL ); SHA512_VALIDATE_RET( (unsigned char *)output != NULL ); mbedtls_sha512_init( &ctx ); if( ( ret = mbedtls_sha512_starts_ret( &ctx, is384 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha512_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha512_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_sha512_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ) { mbedtls_sha512_ret( input, ilen, output, is384 ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * FIPS-180-2 test vectors */ static const unsigned char sha512_test_buf[3][113] = { { "abc" }, { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" }, { "" } }; static const size_t sha512_test_buflen[3] = { 3, 112, 1000 }; static const unsigned char sha512_test_sum[6][64] = { /* * SHA-384 test vectors */ { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B, 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07, 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63, 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED, 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23, 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 }, { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8, 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47, 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2, 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12, 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9, 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 }, { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB, 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C, 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52, 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B, 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB, 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 }, /* * SHA-512 test vectors */ { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA, 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31, 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2, 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A, 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8, 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD, 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E, 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F }, { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA, 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F, 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1, 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18, 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4, 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A, 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54, 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 }, { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64, 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63, 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28, 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB, 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A, 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B, 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E, 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B } }; /* * Checkup routine */ int mbedtls_sha512_self_test( int verbose ) { int i, j, k, buflen, ret = 0; unsigned char *buf; unsigned char sha512sum[64]; mbedtls_sha512_context ctx; buf = mbedtls_calloc( 1024, sizeof(unsigned char) ); if( NULL == buf ) { if( verbose != 0 ) mbedtls_printf( "Buffer allocation failed\n" ); return( 1 ); } mbedtls_sha512_init( &ctx ); for( i = 0; i < 6; i++ ) { j = i % 3; k = i < 3; if( verbose != 0 ) mbedtls_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 ); if( ( ret = mbedtls_sha512_starts_ret( &ctx, k ) ) != 0 ) goto fail; if( j == 2 ) { memset( buf, 'a', buflen = 1000 ); for( j = 0; j < 1000; j++ ) { ret = mbedtls_sha512_update_ret( &ctx, buf, buflen ); if( ret != 0 ) goto fail; } } else { ret = mbedtls_sha512_update_ret( &ctx, sha512_test_buf[j], sha512_test_buflen[j] ); if( ret != 0 ) goto fail; } if( ( ret = mbedtls_sha512_finish_ret( &ctx, sha512sum ) ) != 0 ) goto fail; if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); goto exit; fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); exit: mbedtls_sha512_free( &ctx ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_SHA512_C */ fldigi-4.1.06/src/mbedtls/chachapoly.c0000664000175000017500000004254413507401434014475 00000000000000/** * \file chachapoly.c * * \brief ChaCha20-Poly1305 AEAD construction based on RFC 7539. * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CHACHAPOLY_ALT) /* Parameter validation macros */ #define CHACHAPOLY_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA ) #define CHACHAPOLY_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define CHACHAPOLY_STATE_INIT ( 0 ) #define CHACHAPOLY_STATE_AAD ( 1 ) #define CHACHAPOLY_STATE_CIPHERTEXT ( 2 ) /* Encrypting or decrypting */ #define CHACHAPOLY_STATE_FINISHED ( 3 ) /** * \brief Adds nul bytes to pad the AAD for Poly1305. * * \param ctx The ChaCha20-Poly1305 context. */ static int chachapoly_pad_aad( mbedtls_chachapoly_context *ctx ) { uint32_t partial_block_len = (uint32_t) ( ctx->aad_len % 16U ); unsigned char zeroes[15]; if( partial_block_len == 0U ) return( 0 ); memset( zeroes, 0, sizeof( zeroes ) ); return( mbedtls_poly1305_update( &ctx->poly1305_ctx, zeroes, 16U - partial_block_len ) ); } /** * \brief Adds nul bytes to pad the ciphertext for Poly1305. * * \param ctx The ChaCha20-Poly1305 context. */ static int chachapoly_pad_ciphertext( mbedtls_chachapoly_context *ctx ) { uint32_t partial_block_len = (uint32_t) ( ctx->ciphertext_len % 16U ); unsigned char zeroes[15]; if( partial_block_len == 0U ) return( 0 ); memset( zeroes, 0, sizeof( zeroes ) ); return( mbedtls_poly1305_update( &ctx->poly1305_ctx, zeroes, 16U - partial_block_len ) ); } void mbedtls_chachapoly_init( mbedtls_chachapoly_context *ctx ) { CHACHAPOLY_VALIDATE( ctx != NULL ); mbedtls_chacha20_init( &ctx->chacha20_ctx ); mbedtls_poly1305_init( &ctx->poly1305_ctx ); ctx->aad_len = 0U; ctx->ciphertext_len = 0U; ctx->state = CHACHAPOLY_STATE_INIT; ctx->mode = MBEDTLS_CHACHAPOLY_ENCRYPT; } void mbedtls_chachapoly_free( mbedtls_chachapoly_context *ctx ) { if( ctx == NULL ) return; mbedtls_chacha20_free( &ctx->chacha20_ctx ); mbedtls_poly1305_free( &ctx->poly1305_ctx ); ctx->aad_len = 0U; ctx->ciphertext_len = 0U; ctx->state = CHACHAPOLY_STATE_INIT; ctx->mode = MBEDTLS_CHACHAPOLY_ENCRYPT; } int mbedtls_chachapoly_setkey( mbedtls_chachapoly_context *ctx, const unsigned char key[32] ) { int ret; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( key != NULL ); ret = mbedtls_chacha20_setkey( &ctx->chacha20_ctx, key ); return( ret ); } int mbedtls_chachapoly_starts( mbedtls_chachapoly_context *ctx, const unsigned char nonce[12], mbedtls_chachapoly_mode_t mode ) { int ret; unsigned char poly1305_key[64]; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( nonce != NULL ); /* Set counter = 0, will be update to 1 when generating Poly1305 key */ ret = mbedtls_chacha20_starts( &ctx->chacha20_ctx, nonce, 0U ); if( ret != 0 ) goto cleanup; /* Generate the Poly1305 key by getting the ChaCha20 keystream output with * counter = 0. This is the same as encrypting a buffer of zeroes. * Only the first 256-bits (32 bytes) of the key is used for Poly1305. * The other 256 bits are discarded. */ memset( poly1305_key, 0, sizeof( poly1305_key ) ); ret = mbedtls_chacha20_update( &ctx->chacha20_ctx, sizeof( poly1305_key ), poly1305_key, poly1305_key ); if( ret != 0 ) goto cleanup; ret = mbedtls_poly1305_starts( &ctx->poly1305_ctx, poly1305_key ); if( ret == 0 ) { ctx->aad_len = 0U; ctx->ciphertext_len = 0U; ctx->state = CHACHAPOLY_STATE_AAD; ctx->mode = mode; } cleanup: mbedtls_platform_zeroize( poly1305_key, 64U ); return( ret ); } int mbedtls_chachapoly_update_aad( mbedtls_chachapoly_context *ctx, const unsigned char *aad, size_t aad_len ) { CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( aad_len == 0 || aad != NULL ); if( ctx->state != CHACHAPOLY_STATE_AAD ) return( MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); ctx->aad_len += aad_len; return( mbedtls_poly1305_update( &ctx->poly1305_ctx, aad, aad_len ) ); } int mbedtls_chachapoly_update( mbedtls_chachapoly_context *ctx, size_t len, const unsigned char *input, unsigned char *output ) { int ret; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( len == 0 || input != NULL ); CHACHAPOLY_VALIDATE_RET( len == 0 || output != NULL ); if( ( ctx->state != CHACHAPOLY_STATE_AAD ) && ( ctx->state != CHACHAPOLY_STATE_CIPHERTEXT ) ) { return( MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); } if( ctx->state == CHACHAPOLY_STATE_AAD ) { ctx->state = CHACHAPOLY_STATE_CIPHERTEXT; ret = chachapoly_pad_aad( ctx ); if( ret != 0 ) return( ret ); } ctx->ciphertext_len += len; if( ctx->mode == MBEDTLS_CHACHAPOLY_ENCRYPT ) { ret = mbedtls_chacha20_update( &ctx->chacha20_ctx, len, input, output ); if( ret != 0 ) return( ret ); ret = mbedtls_poly1305_update( &ctx->poly1305_ctx, output, len ); if( ret != 0 ) return( ret ); } else /* DECRYPT */ { ret = mbedtls_poly1305_update( &ctx->poly1305_ctx, input, len ); if( ret != 0 ) return( ret ); ret = mbedtls_chacha20_update( &ctx->chacha20_ctx, len, input, output ); if( ret != 0 ) return( ret ); } return( 0 ); } int mbedtls_chachapoly_finish( mbedtls_chachapoly_context *ctx, unsigned char mac[16] ) { int ret; unsigned char len_block[16]; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( mac != NULL ); if( ctx->state == CHACHAPOLY_STATE_INIT ) { return( MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); } if( ctx->state == CHACHAPOLY_STATE_AAD ) { ret = chachapoly_pad_aad( ctx ); if( ret != 0 ) return( ret ); } else if( ctx->state == CHACHAPOLY_STATE_CIPHERTEXT ) { ret = chachapoly_pad_ciphertext( ctx ); if( ret != 0 ) return( ret ); } ctx->state = CHACHAPOLY_STATE_FINISHED; /* The lengths of the AAD and ciphertext are processed by * Poly1305 as the final 128-bit block, encoded as little-endian integers. */ len_block[ 0] = (unsigned char)( ctx->aad_len ); len_block[ 1] = (unsigned char)( ctx->aad_len >> 8 ); len_block[ 2] = (unsigned char)( ctx->aad_len >> 16 ); len_block[ 3] = (unsigned char)( ctx->aad_len >> 24 ); len_block[ 4] = (unsigned char)( ctx->aad_len >> 32 ); len_block[ 5] = (unsigned char)( ctx->aad_len >> 40 ); len_block[ 6] = (unsigned char)( ctx->aad_len >> 48 ); len_block[ 7] = (unsigned char)( ctx->aad_len >> 56 ); len_block[ 8] = (unsigned char)( ctx->ciphertext_len ); len_block[ 9] = (unsigned char)( ctx->ciphertext_len >> 8 ); len_block[10] = (unsigned char)( ctx->ciphertext_len >> 16 ); len_block[11] = (unsigned char)( ctx->ciphertext_len >> 24 ); len_block[12] = (unsigned char)( ctx->ciphertext_len >> 32 ); len_block[13] = (unsigned char)( ctx->ciphertext_len >> 40 ); len_block[14] = (unsigned char)( ctx->ciphertext_len >> 48 ); len_block[15] = (unsigned char)( ctx->ciphertext_len >> 56 ); ret = mbedtls_poly1305_update( &ctx->poly1305_ctx, len_block, 16U ); if( ret != 0 ) return( ret ); ret = mbedtls_poly1305_finish( &ctx->poly1305_ctx, mac ); return( ret ); } static int chachapoly_crypt_and_tag( mbedtls_chachapoly_context *ctx, mbedtls_chachapoly_mode_t mode, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char *input, unsigned char *output, unsigned char tag[16] ) { int ret; ret = mbedtls_chachapoly_starts( ctx, nonce, mode ); if( ret != 0 ) goto cleanup; ret = mbedtls_chachapoly_update_aad( ctx, aad, aad_len ); if( ret != 0 ) goto cleanup; ret = mbedtls_chachapoly_update( ctx, length, input, output ); if( ret != 0 ) goto cleanup; ret = mbedtls_chachapoly_finish( ctx, tag ); cleanup: return( ret ); } int mbedtls_chachapoly_encrypt_and_tag( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char *input, unsigned char *output, unsigned char tag[16] ) { CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( nonce != NULL ); CHACHAPOLY_VALIDATE_RET( tag != NULL ); CHACHAPOLY_VALIDATE_RET( aad_len == 0 || aad != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || input != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || output != NULL ); return( chachapoly_crypt_and_tag( ctx, MBEDTLS_CHACHAPOLY_ENCRYPT, length, nonce, aad, aad_len, input, output, tag ) ); } int mbedtls_chachapoly_auth_decrypt( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char tag[16], const unsigned char *input, unsigned char *output ) { int ret; unsigned char check_tag[16]; size_t i; int diff; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( nonce != NULL ); CHACHAPOLY_VALIDATE_RET( tag != NULL ); CHACHAPOLY_VALIDATE_RET( aad_len == 0 || aad != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || input != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || output != NULL ); if( ( ret = chachapoly_crypt_and_tag( ctx, MBEDTLS_CHACHAPOLY_DECRYPT, length, nonce, aad, aad_len, input, output, check_tag ) ) != 0 ) { return( ret ); } /* Check tag in "constant-time" */ for( diff = 0, i = 0; i < sizeof( check_tag ); i++ ) diff |= tag[i] ^ check_tag[i]; if( diff != 0 ) { mbedtls_platform_zeroize( output, length ); return( MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED ); } return( 0 ); } #endif /* MBEDTLS_CHACHAPOLY_ALT */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char test_key[1][32] = { { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f } }; static const unsigned char test_nonce[1][12] = { { 0x07, 0x00, 0x00, 0x00, /* 32-bit common part */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47 /* 64-bit IV */ } }; static const unsigned char test_aad[1][12] = { { 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7 } }; static const size_t test_aad_len[1] = { 12U }; static const unsigned char test_input[1][114] = { { 0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x39, 0x39, 0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, 0x74, 0x2e } }; static const unsigned char test_output[1][114] = { { 0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb, 0x7b, 0x86, 0xaf, 0xbc, 0x53, 0xef, 0x7e, 0xc2, 0xa4, 0xad, 0xed, 0x51, 0x29, 0x6e, 0x08, 0xfe, 0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee, 0x62, 0xd6, 0x3d, 0xbe, 0xa4, 0x5e, 0x8c, 0xa9, 0x67, 0x12, 0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b, 0x1a, 0x71, 0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29, 0x05, 0xd6, 0xa5, 0xb6, 0x7e, 0xcd, 0x3b, 0x36, 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77, 0x8b, 0x8c, 0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58, 0xfa, 0xb3, 0x24, 0xe4, 0xfa, 0xd6, 0x75, 0x94, 0x55, 0x85, 0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc, 0x3f, 0xf4, 0xde, 0xf0, 0x8e, 0x4b, 0x7a, 0x9d, 0xe5, 0x76, 0xd2, 0x65, 0x86, 0xce, 0xc6, 0x4b, 0x61, 0x16 } }; static const size_t test_input_len[1] = { 114U }; static const unsigned char test_mac[1][16] = { { 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, 0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91 } }; #define ASSERT( cond, args ) \ do \ { \ if( ! ( cond ) ) \ { \ if( verbose != 0 ) \ mbedtls_printf args; \ \ return( -1 ); \ } \ } \ while( 0 ) int mbedtls_chachapoly_self_test( int verbose ) { mbedtls_chachapoly_context ctx; unsigned i; int ret; unsigned char output[200]; unsigned char mac[16]; for( i = 0U; i < 1U; i++ ) { if( verbose != 0 ) mbedtls_printf( " ChaCha20-Poly1305 test %u ", i ); mbedtls_chachapoly_init( &ctx ); ret = mbedtls_chachapoly_setkey( &ctx, test_key[i] ); ASSERT( 0 == ret, ( "setkey() error code: %i\n", ret ) ); ret = mbedtls_chachapoly_encrypt_and_tag( &ctx, test_input_len[i], test_nonce[i], test_aad[i], test_aad_len[i], test_input[i], output, mac ); ASSERT( 0 == ret, ( "crypt_and_tag() error code: %i\n", ret ) ); ASSERT( 0 == memcmp( output, test_output[i], test_input_len[i] ), ( "failure (wrong output)\n" ) ); ASSERT( 0 == memcmp( mac, test_mac[i], 16U ), ( "failure (wrong MAC)\n" ) ); mbedtls_chachapoly_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CHACHAPOLY_C */ fldigi-4.1.06/src/mbedtls/cipher.c0000664000175000017500000010433413507401434013630 00000000000000/** * \file cipher.c * * \brief Generic cipher wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CIPHER_C) #include "mbedtls/cipher.h" #include "mbedtls/cipher_internal.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #endif #if defined(MBEDTLS_CMAC_C) #include "mbedtls/cmac.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_calloc calloc #define mbedtls_free free #endif #define CIPHER_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ) #define CIPHER_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) /* Compare the contents of two buffers in constant time. * Returns 0 if the contents are bitwise identical, otherwise returns * a non-zero value. * This is currently only used by GCM and ChaCha20+Poly1305. */ static int mbedtls_constant_time_memcmp( const void *v1, const void *v2, size_t len ) { const unsigned char *p1 = (const unsigned char*) v1; const unsigned char *p2 = (const unsigned char*) v2; size_t i; unsigned char diff; for( diff = 0, i = 0; i < len; i++ ) diff |= p1[i] ^ p2[i]; return( (int)diff ); } #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ static int supported_init = 0; const int *mbedtls_cipher_list( void ) { const mbedtls_cipher_definition_t *def; int *type; if( ! supported_init ) { def = mbedtls_cipher_definitions; type = mbedtls_cipher_supported; while( def->type != 0 ) *type++ = (*def++).type; *type = 0; supported_init = 1; } return( mbedtls_cipher_supported ); } const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type ) { const mbedtls_cipher_definition_t *def; for( def = mbedtls_cipher_definitions; def->info != NULL; def++ ) if( def->type == cipher_type ) return( def->info ); return( NULL ); } const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name ) { const mbedtls_cipher_definition_t *def; if( NULL == cipher_name ) return( NULL ); for( def = mbedtls_cipher_definitions; def->info != NULL; def++ ) if( ! strcmp( def->info->name, cipher_name ) ) return( def->info ); return( NULL ); } const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id, int key_bitlen, const mbedtls_cipher_mode_t mode ) { const mbedtls_cipher_definition_t *def; for( def = mbedtls_cipher_definitions; def->info != NULL; def++ ) if( def->info->base->cipher == cipher_id && def->info->key_bitlen == (unsigned) key_bitlen && def->info->mode == mode ) return( def->info ); return( NULL ); } void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx ) { CIPHER_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) ); } void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_CMAC_C) if( ctx->cmac_ctx ) { mbedtls_platform_zeroize( ctx->cmac_ctx, sizeof( mbedtls_cmac_context_t ) ); mbedtls_free( ctx->cmac_ctx ); } #endif if( ctx->cipher_ctx ) ctx->cipher_info->base->ctx_free_func( ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof(mbedtls_cipher_context_t) ); } int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info ) { CIPHER_VALIDATE_RET( ctx != NULL ); if( cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) ); if( NULL == ( ctx->cipher_ctx = cipher_info->base->ctx_alloc_func() ) ) return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED ); ctx->cipher_info = cipher_info; #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) /* * Ignore possible errors caused by a cipher mode that doesn't use padding */ #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_PKCS7 ); #else (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_NONE ); #endif #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ return( 0 ); } int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key, int key_bitlen, const mbedtls_operation_t operation ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( key != NULL ); CIPHER_VALIDATE_RET( operation == MBEDTLS_ENCRYPT || operation == MBEDTLS_DECRYPT ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_KEY_LEN ) == 0 && (int) ctx->cipher_info->key_bitlen != key_bitlen ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } ctx->key_bitlen = key_bitlen; ctx->operation = operation; /* * For OFB, CFB and CTR mode always use the encryption key schedule */ if( MBEDTLS_ENCRYPT == operation || MBEDTLS_MODE_CFB == ctx->cipher_info->mode || MBEDTLS_MODE_OFB == ctx->cipher_info->mode || MBEDTLS_MODE_CTR == ctx->cipher_info->mode ) { return( ctx->cipher_info->base->setkey_enc_func( ctx->cipher_ctx, key, ctx->key_bitlen ) ); } if( MBEDTLS_DECRYPT == operation ) return( ctx->cipher_info->base->setkey_dec_func( ctx->cipher_ctx, key, ctx->key_bitlen ) ); return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len ) { size_t actual_iv_size; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv_len == 0 || iv != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); /* avoid buffer overflow in ctx->iv */ if( iv_len > MBEDTLS_MAX_IV_LENGTH ) return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_IV_LEN ) != 0 ) actual_iv_size = iv_len; else { actual_iv_size = ctx->cipher_info->iv_size; /* avoid reading past the end of input buffer */ if( actual_iv_size > iv_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } #if defined(MBEDTLS_CHACHA20_C) if ( ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ) { if ( 0 != mbedtls_chacha20_starts( (mbedtls_chacha20_context*)ctx->cipher_ctx, iv, 0U ) ) /* Initial counter value */ { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } } #endif if ( actual_iv_size != 0 ) { memcpy( ctx->iv, iv, actual_iv_size ); ctx->iv_size = actual_iv_size; } return( 0 ); } int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx ) { CIPHER_VALIDATE_RET( ctx != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); ctx->unprocessed_len = 0; return( 0 ); } #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx, const unsigned char *ad, size_t ad_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( ad_len == 0 || ad != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { return( mbedtls_gcm_starts( (mbedtls_gcm_context *) ctx->cipher_ctx, ctx->operation, ctx->iv, ctx->iv_size, ad, ad_len ) ); } #endif #if defined(MBEDTLS_CHACHAPOLY_C) if (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { int result; mbedtls_chachapoly_mode_t mode; mode = ( ctx->operation == MBEDTLS_ENCRYPT ) ? MBEDTLS_CHACHAPOLY_ENCRYPT : MBEDTLS_CHACHAPOLY_DECRYPT; result = mbedtls_chachapoly_starts( (mbedtls_chachapoly_context*) ctx->cipher_ctx, ctx->iv, mode ); if ( result != 0 ) return( result ); return( mbedtls_chachapoly_update_aad( (mbedtls_chachapoly_context*) ctx->cipher_ctx, ad, ad_len ) ); } #endif return( 0 ); } #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ) { int ret; size_t block_size; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *olen = 0; block_size = mbedtls_cipher_get_block_size( ctx ); if( ctx->cipher_info->mode == MBEDTLS_MODE_ECB ) { if( ilen != block_size ) return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); *olen = ilen; if( 0 != ( ret = ctx->cipher_info->base->ecb_func( ctx->cipher_ctx, ctx->operation, input, output ) ) ) { return( ret ); } return( 0 ); } #if defined(MBEDTLS_GCM_C) if( ctx->cipher_info->mode == MBEDTLS_MODE_GCM ) { *olen = ilen; return( mbedtls_gcm_update( (mbedtls_gcm_context *) ctx->cipher_ctx, ilen, input, output ) ); } #endif #if defined(MBEDTLS_CHACHAPOLY_C) if ( ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 ) { *olen = ilen; return( mbedtls_chachapoly_update( (mbedtls_chachapoly_context*) ctx->cipher_ctx, ilen, input, output ) ); } #endif if ( 0 == block_size ) { return( MBEDTLS_ERR_CIPHER_INVALID_CONTEXT ); } if( input == output && ( ctx->unprocessed_len != 0 || ilen % block_size ) ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) if( ctx->cipher_info->mode == MBEDTLS_MODE_CBC ) { size_t copy_len = 0; /* * If there is not enough data for a full block, cache it. */ if( ( ctx->operation == MBEDTLS_DECRYPT && NULL != ctx->add_padding && ilen <= block_size - ctx->unprocessed_len ) || ( ctx->operation == MBEDTLS_DECRYPT && NULL == ctx->add_padding && ilen < block_size - ctx->unprocessed_len ) || ( ctx->operation == MBEDTLS_ENCRYPT && ilen < block_size - ctx->unprocessed_len ) ) { memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input, ilen ); ctx->unprocessed_len += ilen; return( 0 ); } /* * Process cached data first */ if( 0 != ctx->unprocessed_len ) { copy_len = block_size - ctx->unprocessed_len; memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input, copy_len ); if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, ctx->operation, block_size, ctx->iv, ctx->unprocessed_data, output ) ) ) { return( ret ); } *olen += block_size; output += block_size; ctx->unprocessed_len = 0; input += copy_len; ilen -= copy_len; } /* * Cache final, incomplete block */ if( 0 != ilen ) { if( 0 == block_size ) { return( MBEDTLS_ERR_CIPHER_INVALID_CONTEXT ); } /* Encryption: only cache partial blocks * Decryption w/ padding: always keep at least one whole block * Decryption w/o padding: only cache partial blocks */ copy_len = ilen % block_size; if( copy_len == 0 && ctx->operation == MBEDTLS_DECRYPT && NULL != ctx->add_padding) { copy_len = block_size; } memcpy( ctx->unprocessed_data, &( input[ilen - copy_len] ), copy_len ); ctx->unprocessed_len += copy_len; ilen -= copy_len; } /* * Process remaining full blocks */ if( ilen ) { if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, ctx->operation, ilen, ctx->iv, input, output ) ) ) { return( ret ); } *olen += ilen; } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) if( ctx->cipher_info->mode == MBEDTLS_MODE_CFB ) { if( 0 != ( ret = ctx->cipher_info->base->cfb_func( ctx->cipher_ctx, ctx->operation, ilen, &ctx->unprocessed_len, ctx->iv, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) if( ctx->cipher_info->mode == MBEDTLS_MODE_OFB ) { if( 0 != ( ret = ctx->cipher_info->base->ofb_func( ctx->cipher_ctx, ilen, &ctx->unprocessed_len, ctx->iv, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) if( ctx->cipher_info->mode == MBEDTLS_MODE_CTR ) { if( 0 != ( ret = ctx->cipher_info->base->ctr_func( ctx->cipher_ctx, ilen, &ctx->unprocessed_len, ctx->iv, ctx->unprocessed_data, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) if( ctx->cipher_info->mode == MBEDTLS_MODE_XTS ) { if( ctx->unprocessed_len > 0 ) { /* We can only process an entire data unit at a time. */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } ret = ctx->cipher_info->base->xts_func( ctx->cipher_ctx, ctx->operation, ilen, ctx->iv, input, output ); if( ret != 0 ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_MODE_STREAM) if( ctx->cipher_info->mode == MBEDTLS_MODE_STREAM ) { if( 0 != ( ret = ctx->cipher_info->base->stream_func( ctx->cipher_ctx, ilen, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_STREAM */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) /* * PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len */ static void add_pkcs_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t padding_len = output_len - data_len; unsigned char i; for( i = 0; i < padding_len; i++ ) output[data_len + i] = (unsigned char) padding_len; } static int get_pkcs_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i, pad_idx; unsigned char padding_len, bad = 0; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); padding_len = input[input_len - 1]; *data_len = input_len - padding_len; /* Avoid logical || since it results in a branch */ bad |= padding_len > input_len; bad |= padding_len == 0; /* The number of bytes checked must be independent of padding_len, * so pick input_len, which is usually 8 or 16 (one block) */ pad_idx = input_len - padding_len; for( i = 0; i < input_len; i++ ) bad |= ( input[i] ^ padding_len ) * ( i >= pad_idx ); return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) ); } #endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) /* * One and zeros padding: fill with 80 00 ... 00 */ static void add_one_and_zeros_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t padding_len = output_len - data_len; unsigned char i = 0; output[data_len] = 0x80; for( i = 1; i < padding_len; i++ ) output[data_len + i] = 0x00; } static int get_one_and_zeros_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i; unsigned char done = 0, prev_done, bad; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); bad = 0x80; *data_len = 0; for( i = input_len; i > 0; i-- ) { prev_done = done; done |= ( input[i - 1] != 0 ); *data_len |= ( i - 1 ) * ( done != prev_done ); bad ^= input[i - 1] * ( done != prev_done ); } return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) ); } #endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) /* * Zeros and len padding: fill with 00 ... 00 ll, where ll is padding length */ static void add_zeros_and_len_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t padding_len = output_len - data_len; unsigned char i = 0; for( i = 1; i < padding_len; i++ ) output[data_len + i - 1] = 0x00; output[output_len - 1] = (unsigned char) padding_len; } static int get_zeros_and_len_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i, pad_idx; unsigned char padding_len, bad = 0; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); padding_len = input[input_len - 1]; *data_len = input_len - padding_len; /* Avoid logical || since it results in a branch */ bad |= padding_len > input_len; bad |= padding_len == 0; /* The number of bytes checked must be independent of padding_len */ pad_idx = input_len - padding_len; for( i = 0; i < input_len - 1; i++ ) bad |= input[i] * ( i >= pad_idx ); return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) ); } #endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS) /* * Zero padding: fill with 00 ... 00 */ static void add_zeros_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t i; for( i = data_len; i < output_len; i++ ) output[i] = 0x00; } static int get_zeros_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i; unsigned char done = 0, prev_done; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *data_len = 0; for( i = input_len; i > 0; i-- ) { prev_done = done; done |= ( input[i-1] != 0 ); *data_len |= i * ( done != prev_done ); } return( 0 ); } #endif /* MBEDTLS_CIPHER_PADDING_ZEROS */ /* * No padding: don't pad :) * * There is no add_padding function (check for NULL in mbedtls_cipher_finish) * but a trivial get_padding function */ static int get_no_padding( unsigned char *input, size_t input_len, size_t *data_len ) { if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *data_len = input_len; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx, unsigned char *output, size_t *olen ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *olen = 0; if( MBEDTLS_MODE_CFB == ctx->cipher_info->mode || MBEDTLS_MODE_OFB == ctx->cipher_info->mode || MBEDTLS_MODE_CTR == ctx->cipher_info->mode || MBEDTLS_MODE_GCM == ctx->cipher_info->mode || MBEDTLS_MODE_XTS == ctx->cipher_info->mode || MBEDTLS_MODE_STREAM == ctx->cipher_info->mode ) { return( 0 ); } if ( ( MBEDTLS_CIPHER_CHACHA20 == ctx->cipher_info->type ) || ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) ) { return( 0 ); } if( MBEDTLS_MODE_ECB == ctx->cipher_info->mode ) { if( ctx->unprocessed_len != 0 ) return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) if( MBEDTLS_MODE_CBC == ctx->cipher_info->mode ) { int ret = 0; if( MBEDTLS_ENCRYPT == ctx->operation ) { /* check for 'no padding' mode */ if( NULL == ctx->add_padding ) { if( 0 != ctx->unprocessed_len ) return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); return( 0 ); } ctx->add_padding( ctx->unprocessed_data, mbedtls_cipher_get_iv_size( ctx ), ctx->unprocessed_len ); } else if( mbedtls_cipher_get_block_size( ctx ) != ctx->unprocessed_len ) { /* * For decrypt operations, expect a full block, * or an empty block if no padding */ if( NULL == ctx->add_padding && 0 == ctx->unprocessed_len ) return( 0 ); return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); } /* cipher block */ if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, ctx->operation, mbedtls_cipher_get_block_size( ctx ), ctx->iv, ctx->unprocessed_data, output ) ) ) { return( ret ); } /* Set output size for decryption */ if( MBEDTLS_DECRYPT == ctx->operation ) return( ctx->get_padding( output, mbedtls_cipher_get_block_size( ctx ), olen ) ); /* Set output size for encryption */ *olen = mbedtls_cipher_get_block_size( ctx ); return( 0 ); } #else ((void) output); #endif /* MBEDTLS_CIPHER_MODE_CBC */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode ) { CIPHER_VALIDATE_RET( ctx != NULL ); if( NULL == ctx->cipher_info || MBEDTLS_MODE_CBC != ctx->cipher_info->mode ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } switch( mode ) { #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) case MBEDTLS_PADDING_PKCS7: ctx->add_padding = add_pkcs_padding; ctx->get_padding = get_pkcs_padding; break; #endif #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) case MBEDTLS_PADDING_ONE_AND_ZEROS: ctx->add_padding = add_one_and_zeros_padding; ctx->get_padding = get_one_and_zeros_padding; break; #endif #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) case MBEDTLS_PADDING_ZEROS_AND_LEN: ctx->add_padding = add_zeros_and_len_padding; ctx->get_padding = get_zeros_and_len_padding; break; #endif #if defined(MBEDTLS_CIPHER_PADDING_ZEROS) case MBEDTLS_PADDING_ZEROS: ctx->add_padding = add_zeros_padding; ctx->get_padding = get_zeros_padding; break; #endif case MBEDTLS_PADDING_NONE: ctx->add_padding = NULL; ctx->get_padding = get_no_padding; break; default: return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx, unsigned char *tag, size_t tag_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( MBEDTLS_ENCRYPT != ctx->operation ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) return( mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx, tag, tag_len ) ); #endif #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { /* Don't allow truncated MAC for Poly1305 */ if ( tag_len != 16U ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( mbedtls_chachapoly_finish( (mbedtls_chachapoly_context*) ctx->cipher_ctx, tag ) ); } #endif return( 0 ); } int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx, const unsigned char *tag, size_t tag_len ) { unsigned char check_tag[16]; int ret; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( MBEDTLS_DECRYPT != ctx->operation ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { if( tag_len > sizeof( check_tag ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( 0 != ( ret = mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx, check_tag, tag_len ) ) ) { return( ret ); } /* Check the tag in "constant-time" */ if( mbedtls_constant_time_memcmp( tag, check_tag, tag_len ) != 0 ) return( MBEDTLS_ERR_CIPHER_AUTH_FAILED ); return( 0 ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { /* Don't allow truncated MAC for Poly1305 */ if ( tag_len != sizeof( check_tag ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); ret = mbedtls_chachapoly_finish( (mbedtls_chachapoly_context*) ctx->cipher_ctx, check_tag ); if ( ret != 0 ) { return( ret ); } /* Check the tag in "constant-time" */ if( mbedtls_constant_time_memcmp( tag, check_tag, tag_len ) != 0 ) return( MBEDTLS_ERR_CIPHER_AUTH_FAILED ); return( 0 ); } #endif /* MBEDTLS_CHACHAPOLY_C */ return( 0 ); } #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ /* * Packet-oriented wrapper for non-AEAD modes */ int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ) { int ret; size_t finish_olen; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv_len == 0 || iv != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); if( ( ret = mbedtls_cipher_set_iv( ctx, iv, iv_len ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_reset( ctx ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_update( ctx, input, ilen, output, olen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_finish( ctx, output + *olen, &finish_olen ) ) != 0 ) return( ret ); *olen += finish_olen; return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_AEAD) /* * Packet-oriented encryption for AEAD modes */ int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, unsigned char *tag, size_t tag_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv != NULL ); CIPHER_VALIDATE_RET( ad_len == 0 || ad != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { *olen = ilen; return( mbedtls_gcm_crypt_and_tag( ctx->cipher_ctx, MBEDTLS_GCM_ENCRYPT, ilen, iv, iv_len, ad, ad_len, input, output, tag_len, tag ) ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode ) { *olen = ilen; return( mbedtls_ccm_encrypt_and_tag( ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, output, tag, tag_len ) ); } #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { /* ChachaPoly has fixed length nonce and MAC (tag) */ if ( ( iv_len != ctx->cipher_info->iv_size ) || ( tag_len != 16U ) ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } *olen = ilen; return( mbedtls_chachapoly_encrypt_and_tag( ctx->cipher_ctx, ilen, iv, ad, ad_len, input, output, tag ) ); } #endif /* MBEDTLS_CHACHAPOLY_C */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } /* * Packet-oriented decryption for AEAD modes */ int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, const unsigned char *tag, size_t tag_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv != NULL ); CIPHER_VALIDATE_RET( ad_len == 0 || ad != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { int ret; *olen = ilen; ret = mbedtls_gcm_auth_decrypt( ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, tag, tag_len, input, output ); if( ret == MBEDTLS_ERR_GCM_AUTH_FAILED ) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; return( ret ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode ) { int ret; *olen = ilen; ret = mbedtls_ccm_auth_decrypt( ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, output, tag, tag_len ); if( ret == MBEDTLS_ERR_CCM_AUTH_FAILED ) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; return( ret ); } #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { int ret; /* ChachaPoly has fixed length nonce and MAC (tag) */ if ( ( iv_len != ctx->cipher_info->iv_size ) || ( tag_len != 16U ) ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } *olen = ilen; ret = mbedtls_chachapoly_auth_decrypt( ctx->cipher_ctx, ilen, iv, ad, ad_len, tag, input, output ); if( ret == MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED ) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; return( ret ); } #endif /* MBEDTLS_CHACHAPOLY_C */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } #endif /* MBEDTLS_CIPHER_MODE_AEAD */ #endif /* MBEDTLS_CIPHER_C */ fldigi-4.1.06/src/mbedtls/ssl_ciphersuites.c0000664000175000017500000031267413507401434015756 00000000000000/** * \file ssl_ciphersuites.c * * \brief SSL ciphersuites for mbed TLS * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_TLS_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #endif #include "mbedtls/ssl_ciphersuites.h" #include "mbedtls/ssl.h" #include /* * Ordered from most preferred to least preferred in terms of security. * * Current rule (except rc4, weak and null which come last): * 1. By key exchange: * Forward-secure non-PSK > forward-secure PSK > ECJPAKE > other non-PSK > other PSK * 2. By key length and cipher: * ChaCha > AES-256 > Camellia-256 > ARIA-256 > AES-128 > Camellia-128 > ARIA-128 > 3DES * 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8 * 4. By hash function used when relevant * 5. By key exchange/auth again: EC > non-EC */ static const int ciphersuite_preference[] = { #if defined(MBEDTLS_SSL_CIPHERSUITES) MBEDTLS_SSL_CIPHERSUITES, #else /* Chacha-Poly ephemeral suites */ MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, /* All AES-256 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, /* All CAMELLIA-256 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, /* All ARIA-256 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, /* All AES-128 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, /* All CAMELLIA-128 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, /* All ARIA-128 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, /* All remaining >= 128-bit ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, /* The PSK ephemeral suites */ MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, /* The ECJPAKE suite */ MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, /* All AES-256 suites */ MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_RSA_WITH_AES_256_CCM, MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, /* All CAMELLIA-256 suites */ MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, /* All ARIA-256 suites */ MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384, /* All AES-128 suites */ MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_RSA_WITH_AES_128_CCM, MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, /* All CAMELLIA-128 suites */ MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, /* All ARIA-128 suites */ MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256, /* All remaining >= 128-bit suites */ MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, /* The RSA PSK suites */ MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, /* The PSK suites */ MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_PSK_WITH_AES_256_CCM, MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_PSK_WITH_AES_128_CCM, MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, /* RC4 suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, /* Weak suites */ MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, /* NULL suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, MBEDTLS_TLS_RSA_WITH_NULL_SHA256, MBEDTLS_TLS_RSA_WITH_NULL_SHA, MBEDTLS_TLS_RSA_WITH_NULL_MD5, MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, MBEDTLS_TLS_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_PSK_WITH_NULL_SHA, #endif /* MBEDTLS_SSL_CIPHERSUITES */ 0 }; static const mbedtls_ssl_ciphersuite_t ciphersuite_definitions[] = { #if defined(MBEDTLS_CHACHAPOLY_C) && \ defined(MBEDTLS_SHA256_C) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) { MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, "TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, "TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) { MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, "TLS-DHE-RSA-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) { MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) { MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-ECDHE-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) { MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-DHE-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) { MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-RSA-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_CHACHAPOLY_C && MBEDTLS_SHA256_C && MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, "TLS-ECDHE-ECDSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, "TLS-ECDHE-ECDSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, "TLS-ECDHE-RSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, "TLS-ECDHE-RSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, "TLS-DHE-RSA-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, "TLS-DHE-RSA-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, "TLS-DHE-RSA-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, "TLS-DHE-RSA-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, "TLS-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, "TLS-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, "TLS-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, "TLS-RSA-WITH-AES-256-CBC-SHA256", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, "TLS-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, "TLS-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_RSA_WITH_AES_256_CCM, "TLS-RSA-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, "TLS-RSA-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_RSA_WITH_AES_128_CCM, "TLS-RSA-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, "TLS-RSA-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_MD5_C) { MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, "TLS-RSA-WITH-RC4-128-MD5", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, "TLS-RSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, "TLS-ECDH-RSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, "TLS-ECDH-RSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, "TLS-ECDH-ECDSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, "TLS-ECDH-ECDSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, "TLS-PSK-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, "TLS-PSK-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, "TLS-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, "TLS-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, "TLS-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, "TLS-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_PSK_WITH_AES_256_CCM, "TLS-PSK-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, "TLS-PSK-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_PSK_WITH_AES_128_CCM, "TLS-PSK-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, "TLS-PSK-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, "TLS-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, "TLS-DHE-PSK-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, "TLS-DHE-PSK-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, "TLS-DHE-PSK-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, "TLS-DHE-PSK-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, "TLS-DHE-PSK-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, "TLS-DHE-PSK-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, "TLS-DHE-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, "TLS-ECDHE-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, "TLS-RSA-PSK-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, "TLS-RSA-PSK-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, "TLS-RSA-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, "TLS-ECJPAKE-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECJPAKE, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES) #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if defined(MBEDTLS_MD5_C) { MBEDTLS_TLS_RSA_WITH_NULL_MD5, "TLS-RSA-WITH-NULL-MD5", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_NULL_SHA, "TLS-RSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_WITH_NULL_SHA256, "TLS-RSA-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_NULL_SHA, "TLS-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_NULL_SHA256, "TLS-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_NULL_SHA384, "TLS-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, "TLS-DHE-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, "TLS-DHE-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, "TLS-DHE-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, "TLS-ECDHE-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, "TLS-ECDHE-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, "TLS-ECDHE-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, "TLS-RSA-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, "TLS-RSA-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, "TLS-RSA-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, "TLS-DHE-RSA-WITH-DES-CBC-SHA", MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, "TLS-RSA-WITH-DES-CBC-SHA", MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */ #if defined(MBEDTLS_ARIA_C) #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, "TLS-RSA-PSK-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-RSA-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, "TLS-RSA-PSK-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-RSA-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384, "TLS-PSK-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384,MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256, "TLS-PSK-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-DHE-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-DHE-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-DHE-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-DHE-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, "TLS-DHE-PSK-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-DHE-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, "TLS-DHE-PSK-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-DHE-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #endif /* MBEDTLS_ARIA_C */ { 0, "", MBEDTLS_CIPHER_NONE, MBEDTLS_MD_NONE, MBEDTLS_KEY_EXCHANGE_NONE, 0, 0, 0, 0, 0 } }; #if defined(MBEDTLS_SSL_CIPHERSUITES) const int *mbedtls_ssl_list_ciphersuites( void ) { return( ciphersuite_preference ); } #else #define MAX_CIPHERSUITES sizeof( ciphersuite_definitions ) / \ sizeof( ciphersuite_definitions[0] ) static int supported_ciphersuites[MAX_CIPHERSUITES]; static int supported_init = 0; const int *mbedtls_ssl_list_ciphersuites( void ) { /* * On initial call filter out all ciphersuites not supported by current * build based on presence in the ciphersuite_definitions. */ if( supported_init == 0 ) { const int *p; int *q; for( p = ciphersuite_preference, q = supported_ciphersuites; *p != 0 && q < supported_ciphersuites + MAX_CIPHERSUITES - 1; p++ ) { #if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) const mbedtls_ssl_ciphersuite_t *cs_info; if( ( cs_info = mbedtls_ssl_ciphersuite_from_id( *p ) ) != NULL && cs_info->cipher != MBEDTLS_CIPHER_ARC4_128 ) #else if( mbedtls_ssl_ciphersuite_from_id( *p ) != NULL ) #endif *(q++) = *p; } *q = 0; supported_init = 1; } return( supported_ciphersuites ); } #endif /* MBEDTLS_SSL_CIPHERSUITES */ const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( const char *ciphersuite_name ) { const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions; if( NULL == ciphersuite_name ) return( NULL ); while( cur->id != 0 ) { if( 0 == strcmp( cur->name, ciphersuite_name ) ) return( cur ); cur++; } return( NULL ); } const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite ) { const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions; while( cur->id != 0 ) { if( cur->id == ciphersuite ) return( cur ); cur++; } return( NULL ); } const char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id ) { const mbedtls_ssl_ciphersuite_t *cur; cur = mbedtls_ssl_ciphersuite_from_id( ciphersuite_id ); if( cur == NULL ) return( "unknown" ); return( cur->name ); } int mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name ) { const mbedtls_ssl_ciphersuite_t *cur; cur = mbedtls_ssl_ciphersuite_from_string( ciphersuite_name ); if( cur == NULL ) return( 0 ); return( cur->id ); } #if defined(MBEDTLS_PK_C) mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: return( MBEDTLS_PK_RSA ); case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( MBEDTLS_PK_ECDSA ); case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: return( MBEDTLS_PK_ECKEY ); default: return( MBEDTLS_PK_NONE ); } } mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: return( MBEDTLS_PK_RSA ); case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( MBEDTLS_PK_ECDSA ); default: return( MBEDTLS_PK_NONE ); } } #endif /* MBEDTLS_PK_C */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECJPAKE: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED*/ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_PSK: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #endif /* MBEDTLS_SSL_TLS_C */ fldigi-4.1.06/src/mbedtls/LICENSE0000664000175000017500000000026413507401434013214 00000000000000This package of mbed TLS is specifically licensed under the GPL 2.0, as can be found in: gpl-2.0.txt For latest library source and more information visit https://tls.mbed.org/ fldigi-4.1.06/src/mbedtls/ecp.c0000664000175000017500000027156113507401434013134 00000000000000/* * Elliptic curves over GF(p): generic functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * SEC1 http://www.secg.org/index.php?action=secg,docs_secg * GECC = Guide to Elliptic Curve Cryptography - Hankerson, Menezes, Vanstone * FIPS 186-3 http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf * RFC 4492 for the related TLS structures and constants * RFC 7748 for the Curve448 and Curve25519 curve definitions * * [Curve25519] http://cr.yp.to/ecdh/curve25519-20060209.pdf * * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis * for elliptic curve cryptosystems. In : Cryptographic Hardware and * Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302. * * * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to * render ECC resistant against Side Channel Attacks. IACR Cryptology * ePrint Archive, 2004, vol. 2004, p. 342. * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif /** * \brief Function level alternative implementation. * * The MBEDTLS_ECP_INTERNAL_ALT macro enables alternative implementations to * replace certain functions in this module. The alternative implementations are * typically hardware accelerators and need to activate the hardware before the * computation starts and deactivate it after it finishes. The * mbedtls_internal_ecp_init() and mbedtls_internal_ecp_free() functions serve * this purpose. * * To preserve the correct functionality the following conditions must hold: * * - The alternative implementation must be activated by * mbedtls_internal_ecp_init() before any of the replaceable functions is * called. * - mbedtls_internal_ecp_free() must \b only be called when the alternative * implementation is activated. * - mbedtls_internal_ecp_init() must \b not be called when the alternative * implementation is activated. * - Public functions must not return while the alternative implementation is * activated. * - Replaceable functions are guarded by \c MBEDTLS_ECP_XXX_ALT macros and * before calling them an \code if( mbedtls_internal_ecp_grp_capable( grp ) ) * \endcode ensures that the alternative implementation supports the current * group. */ #if defined(MBEDTLS_ECP_INTERNAL_ALT) #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #include "mbedtls/threading.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_ECP_ALT) /* Parameter validation macros based on platform_util.h */ #define ECP_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECP_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ecp_internal.h" #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #if defined(MBEDTLS_SELF_TEST) /* * Counts of point addition and doubling, and field multiplications. * Used to test resistance of point multiplication to simple timing attacks. */ static unsigned long add_count, dbl_count, mul_count; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Maximum number of "basic operations" to be done in a row. * * Default value 0 means that ECC operations will not yield. * Note that regardless of the value of ecp_max_ops, always at * least one step is performed before yielding. * * Setting ecp_max_ops=1 can be suitable for testing purposes * as it will interrupt computation at all possible points. */ static unsigned ecp_max_ops = 0; /* * Set ecp_max_ops */ void mbedtls_ecp_set_max_ops( unsigned max_ops ) { ecp_max_ops = max_ops; } /* * Check if restart is enabled */ int mbedtls_ecp_restart_is_enabled( void ) { return( ecp_max_ops != 0 ); } /* * Restart sub-context for ecp_mul_comb() */ struct mbedtls_ecp_restart_mul { mbedtls_ecp_point R; /* current intermediate result */ size_t i; /* current index in various loops, 0 outside */ mbedtls_ecp_point *T; /* table for precomputed points */ unsigned char T_size; /* number of points in table T */ enum { /* what were we doing last time we returned? */ ecp_rsm_init = 0, /* nothing so far, dummy initial state */ ecp_rsm_pre_dbl, /* precompute 2^n multiples */ ecp_rsm_pre_norm_dbl, /* normalize precomputed 2^n multiples */ ecp_rsm_pre_add, /* precompute remaining points by adding */ ecp_rsm_pre_norm_add, /* normalize all precomputed points */ ecp_rsm_comb_core, /* ecp_mul_comb_core() */ ecp_rsm_final_norm, /* do the final normalization */ } state; }; /* * Init restart_mul sub-context */ static void ecp_restart_rsm_init( mbedtls_ecp_restart_mul_ctx *ctx ) { mbedtls_ecp_point_init( &ctx->R ); ctx->i = 0; ctx->T = NULL; ctx->T_size = 0; ctx->state = ecp_rsm_init; } /* * Free the components of a restart_mul sub-context */ static void ecp_restart_rsm_free( mbedtls_ecp_restart_mul_ctx *ctx ) { unsigned char i; if( ctx == NULL ) return; mbedtls_ecp_point_free( &ctx->R ); if( ctx->T != NULL ) { for( i = 0; i < ctx->T_size; i++ ) mbedtls_ecp_point_free( ctx->T + i ); mbedtls_free( ctx->T ); } ecp_restart_rsm_init( ctx ); } /* * Restart context for ecp_muladd() */ struct mbedtls_ecp_restart_muladd { mbedtls_ecp_point mP; /* mP value */ mbedtls_ecp_point R; /* R intermediate result */ enum { /* what should we do next? */ ecp_rsma_mul1 = 0, /* first multiplication */ ecp_rsma_mul2, /* second multiplication */ ecp_rsma_add, /* addition */ ecp_rsma_norm, /* normalization */ } state; }; /* * Init restart_muladd sub-context */ static void ecp_restart_ma_init( mbedtls_ecp_restart_muladd_ctx *ctx ) { mbedtls_ecp_point_init( &ctx->mP ); mbedtls_ecp_point_init( &ctx->R ); ctx->state = ecp_rsma_mul1; } /* * Free the components of a restart_muladd sub-context */ static void ecp_restart_ma_free( mbedtls_ecp_restart_muladd_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_ecp_point_free( &ctx->mP ); mbedtls_ecp_point_free( &ctx->R ); ecp_restart_ma_init( ctx ); } /* * Initialize a restart context */ void mbedtls_ecp_restart_init( mbedtls_ecp_restart_ctx *ctx ) { ECP_VALIDATE( ctx != NULL ); ctx->ops_done = 0; ctx->depth = 0; ctx->rsm = NULL; ctx->ma = NULL; } /* * Free the components of a restart context */ void mbedtls_ecp_restart_free( mbedtls_ecp_restart_ctx *ctx ) { if( ctx == NULL ) return; ecp_restart_rsm_free( ctx->rsm ); mbedtls_free( ctx->rsm ); ecp_restart_ma_free( ctx->ma ); mbedtls_free( ctx->ma ); mbedtls_ecp_restart_init( ctx ); } /* * Check if we can do the next step */ int mbedtls_ecp_check_budget( const mbedtls_ecp_group *grp, mbedtls_ecp_restart_ctx *rs_ctx, unsigned ops ) { ECP_VALIDATE_RET( grp != NULL ); if( rs_ctx != NULL && ecp_max_ops != 0 ) { /* scale depending on curve size: the chosen reference is 256-bit, * and multiplication is quadratic. Round to the closest integer. */ if( grp->pbits >= 512 ) ops *= 4; else if( grp->pbits >= 384 ) ops *= 2; /* Avoid infinite loops: always allow first step. * Because of that, however, it's not generally true * that ops_done <= ecp_max_ops, so the check * ops_done > ecp_max_ops below is mandatory. */ if( ( rs_ctx->ops_done != 0 ) && ( rs_ctx->ops_done > ecp_max_ops || ops > ecp_max_ops - rs_ctx->ops_done ) ) { return( MBEDTLS_ERR_ECP_IN_PROGRESS ); } /* update running count */ rs_ctx->ops_done += ops; } return( 0 ); } /* Call this when entering a function that needs its own sub-context */ #define ECP_RS_ENTER( SUB ) do { \ /* reset ops count for this call if top-level */ \ if( rs_ctx != NULL && rs_ctx->depth++ == 0 ) \ rs_ctx->ops_done = 0; \ \ /* set up our own sub-context if needed */ \ if( mbedtls_ecp_restart_is_enabled() && \ rs_ctx != NULL && rs_ctx->SUB == NULL ) \ { \ rs_ctx->SUB = mbedtls_calloc( 1, sizeof( *rs_ctx->SUB ) ); \ if( rs_ctx->SUB == NULL ) \ return( MBEDTLS_ERR_ECP_ALLOC_FAILED ); \ \ ecp_restart_## SUB ##_init( rs_ctx->SUB ); \ } \ } while( 0 ) /* Call this when leaving a function that needs its own sub-context */ #define ECP_RS_LEAVE( SUB ) do { \ /* clear our sub-context when not in progress (done or error) */ \ if( rs_ctx != NULL && rs_ctx->SUB != NULL && \ ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) \ { \ ecp_restart_## SUB ##_free( rs_ctx->SUB ); \ mbedtls_free( rs_ctx->SUB ); \ rs_ctx->SUB = NULL; \ } \ \ if( rs_ctx != NULL ) \ rs_ctx->depth--; \ } while( 0 ) #else /* MBEDTLS_ECP_RESTARTABLE */ #define ECP_RS_ENTER( sub ) (void) rs_ctx; #define ECP_RS_LEAVE( sub ) (void) rs_ctx; #endif /* MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) #define ECP_SHORTWEIERSTRASS #endif #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) || \ defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) #define ECP_MONTGOMERY #endif /* * Curve types: internal for now, might be exposed later */ typedef enum { ECP_TYPE_NONE = 0, ECP_TYPE_SHORT_WEIERSTRASS, /* y^2 = x^3 + a x + b */ ECP_TYPE_MONTGOMERY, /* y^2 = x^3 + a x^2 + x */ } ecp_curve_type; /* * List of supported curves: * - internal ID * - TLS NamedCurve ID (RFC 4492 sec. 5.1.1, RFC 7071 sec. 2) * - size in bits * - readable name * * Curves are listed in order: largest curves first, and for a given size, * fastest curves first. This provides the default order for the SSL module. * * Reminder: update profiles in x509_crt.c when adding a new curves! */ static const mbedtls_ecp_curve_info ecp_supported_curves[] = { #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) { MBEDTLS_ECP_DP_SECP521R1, 25, 521, "secp521r1" }, #endif #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) { MBEDTLS_ECP_DP_BP512R1, 28, 512, "brainpoolP512r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) { MBEDTLS_ECP_DP_SECP384R1, 24, 384, "secp384r1" }, #endif #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) { MBEDTLS_ECP_DP_BP384R1, 27, 384, "brainpoolP384r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) { MBEDTLS_ECP_DP_SECP256R1, 23, 256, "secp256r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) { MBEDTLS_ECP_DP_SECP256K1, 22, 256, "secp256k1" }, #endif #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) { MBEDTLS_ECP_DP_BP256R1, 26, 256, "brainpoolP256r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) { MBEDTLS_ECP_DP_SECP224R1, 21, 224, "secp224r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) { MBEDTLS_ECP_DP_SECP224K1, 20, 224, "secp224k1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) { MBEDTLS_ECP_DP_SECP192R1, 19, 192, "secp192r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) { MBEDTLS_ECP_DP_SECP192K1, 18, 192, "secp192k1" }, #endif { MBEDTLS_ECP_DP_NONE, 0, 0, NULL }, }; #define ECP_NB_CURVES sizeof( ecp_supported_curves ) / \ sizeof( ecp_supported_curves[0] ) static mbedtls_ecp_group_id ecp_supported_grp_id[ECP_NB_CURVES]; /* * List of supported curves and associated info */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void ) { return( ecp_supported_curves ); } /* * List of supported curves, group ID only */ const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void ) { static int init_done = 0; if( ! init_done ) { size_t i = 0; const mbedtls_ecp_curve_info *curve_info; for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { ecp_supported_grp_id[i++] = curve_info->grp_id; } ecp_supported_grp_id[i] = MBEDTLS_ECP_DP_NONE; init_done = 1; } return( ecp_supported_grp_id ); } /* * Get the curve info for the internal identifier */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id ) { const mbedtls_ecp_curve_info *curve_info; for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { if( curve_info->grp_id == grp_id ) return( curve_info ); } return( NULL ); } /* * Get the curve info from the TLS identifier */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id ) { const mbedtls_ecp_curve_info *curve_info; for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { if( curve_info->tls_id == tls_id ) return( curve_info ); } return( NULL ); } /* * Get the curve info from the name */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name ) { const mbedtls_ecp_curve_info *curve_info; if( name == NULL ) return( NULL ); for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { if( strcmp( curve_info->name, name ) == 0 ) return( curve_info ); } return( NULL ); } /* * Get the type of a curve */ static inline ecp_curve_type ecp_get_type( const mbedtls_ecp_group *grp ) { if( grp->G.X.p == NULL ) return( ECP_TYPE_NONE ); if( grp->G.Y.p == NULL ) return( ECP_TYPE_MONTGOMERY ); else return( ECP_TYPE_SHORT_WEIERSTRASS ); } /* * Initialize (the components of) a point */ void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ) { ECP_VALIDATE( pt != NULL ); mbedtls_mpi_init( &pt->X ); mbedtls_mpi_init( &pt->Y ); mbedtls_mpi_init( &pt->Z ); } /* * Initialize (the components of) a group */ void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ) { ECP_VALIDATE( grp != NULL ); grp->id = MBEDTLS_ECP_DP_NONE; mbedtls_mpi_init( &grp->P ); mbedtls_mpi_init( &grp->A ); mbedtls_mpi_init( &grp->B ); mbedtls_ecp_point_init( &grp->G ); mbedtls_mpi_init( &grp->N ); grp->pbits = 0; grp->nbits = 0; grp->h = 0; grp->modp = NULL; grp->t_pre = NULL; grp->t_post = NULL; grp->t_data = NULL; grp->T = NULL; grp->T_size = 0; } /* * Initialize (the components of) a key pair */ void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key ) { ECP_VALIDATE( key != NULL ); mbedtls_ecp_group_init( &key->grp ); mbedtls_mpi_init( &key->d ); mbedtls_ecp_point_init( &key->Q ); } /* * Unallocate (the components of) a point */ void mbedtls_ecp_point_free( mbedtls_ecp_point *pt ) { if( pt == NULL ) return; mbedtls_mpi_free( &( pt->X ) ); mbedtls_mpi_free( &( pt->Y ) ); mbedtls_mpi_free( &( pt->Z ) ); } /* * Unallocate (the components of) a group */ void mbedtls_ecp_group_free( mbedtls_ecp_group *grp ) { size_t i; if( grp == NULL ) return; if( grp->h != 1 ) { mbedtls_mpi_free( &grp->P ); mbedtls_mpi_free( &grp->A ); mbedtls_mpi_free( &grp->B ); mbedtls_ecp_point_free( &grp->G ); mbedtls_mpi_free( &grp->N ); } if( grp->T != NULL ) { for( i = 0; i < grp->T_size; i++ ) mbedtls_ecp_point_free( &grp->T[i] ); mbedtls_free( grp->T ); } mbedtls_platform_zeroize( grp, sizeof( mbedtls_ecp_group ) ); } /* * Unallocate (the components of) a key pair */ void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key ) { if( key == NULL ) return; mbedtls_ecp_group_free( &key->grp ); mbedtls_mpi_free( &key->d ); mbedtls_ecp_point_free( &key->Q ); } /* * Copy the contents of a point */ int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ) { int ret; ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( Q != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->X, &Q->X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Y, &Q->Y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Z, &Q->Z ) ); cleanup: return( ret ); } /* * Copy the contents of a group object */ int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src ) { ECP_VALIDATE_RET( dst != NULL ); ECP_VALIDATE_RET( src != NULL ); return( mbedtls_ecp_group_load( dst, src->id ) ); } /* * Set point to zero */ int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt ) { int ret; ECP_VALIDATE_RET( pt != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->X , 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Y , 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z , 0 ) ); cleanup: return( ret ); } /* * Tell if a point is zero */ int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt ) { ECP_VALIDATE_RET( pt != NULL ); return( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 ); } /* * Compare two points lazily */ int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ) { ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( Q != NULL ); if( mbedtls_mpi_cmp_mpi( &P->X, &Q->X ) == 0 && mbedtls_mpi_cmp_mpi( &P->Y, &Q->Y ) == 0 && mbedtls_mpi_cmp_mpi( &P->Z, &Q->Z ) == 0 ) { return( 0 ); } return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } /* * Import a non-zero point from ASCII strings */ int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix, const char *x, const char *y ) { int ret; ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( x != NULL ); ECP_VALIDATE_RET( y != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->X, radix, x ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->Y, radix, y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) ); cleanup: return( ret ); } /* * Export a point into unsigned binary data (SEC1 2.3.3) */ int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P, int format, size_t *olen, unsigned char *buf, size_t buflen ) { int ret = 0; size_t plen; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( olen != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( format == MBEDTLS_ECP_PF_UNCOMPRESSED || format == MBEDTLS_ECP_PF_COMPRESSED ); /* * Common case: P == 0 */ if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 ) { if( buflen < 1 ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); buf[0] = 0x00; *olen = 1; return( 0 ); } plen = mbedtls_mpi_size( &grp->P ); if( format == MBEDTLS_ECP_PF_UNCOMPRESSED ) { *olen = 2 * plen + 1; if( buflen < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); buf[0] = 0x04; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->Y, buf + 1 + plen, plen ) ); } else if( format == MBEDTLS_ECP_PF_COMPRESSED ) { *olen = plen + 1; if( buflen < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); buf[0] = 0x02 + mbedtls_mpi_get_bit( &P->Y, 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) ); } cleanup: return( ret ); } /* * Import a point from unsigned binary data (SEC1 2.3.4) */ int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, const unsigned char *buf, size_t ilen ) { int ret; size_t plen; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); ECP_VALIDATE_RET( buf != NULL ); if( ilen < 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); if( buf[0] == 0x00 ) { if( ilen == 1 ) return( mbedtls_ecp_set_zero( pt ) ); else return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } plen = mbedtls_mpi_size( &grp->P ); if( buf[0] != 0x04 ) return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); if( ilen != 2 * plen + 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->X, buf + 1, plen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->Y, buf + 1 + plen, plen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) ); cleanup: return( ret ); } /* * Import a point from a TLS ECPoint record (RFC 4492) * struct { * opaque point <1..2^8-1>; * } ECPoint; */ int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, const unsigned char **buf, size_t buf_len ) { unsigned char data_len; const unsigned char *buf_start; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( *buf != NULL ); /* * We must have at least two bytes (1 for length, at least one for data) */ if( buf_len < 2 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); data_len = *(*buf)++; if( data_len < 1 || data_len > buf_len - 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * Save buffer start for read_binary and update buf */ buf_start = *buf; *buf += data_len; return( mbedtls_ecp_point_read_binary( grp, pt, buf_start, data_len ) ); } /* * Export a point as a TLS ECPoint record (RFC 4492) * struct { * opaque point <1..2^8-1>; * } ECPoint; */ int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, int format, size_t *olen, unsigned char *buf, size_t blen ) { int ret; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); ECP_VALIDATE_RET( olen != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( format == MBEDTLS_ECP_PF_UNCOMPRESSED || format == MBEDTLS_ECP_PF_COMPRESSED ); /* * buffer length must be at least one, for our length byte */ if( blen < 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); if( ( ret = mbedtls_ecp_point_write_binary( grp, pt, format, olen, buf + 1, blen - 1) ) != 0 ) return( ret ); /* * write length to the first byte and update total length */ buf[0] = (unsigned char) *olen; ++*olen; return( 0 ); } /* * Set a group from an ECParameters record (RFC 4492) */ int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len ) { int ret; mbedtls_ecp_group_id grp_id; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( *buf != NULL ); if( ( ret = mbedtls_ecp_tls_read_group_id( &grp_id, buf, len ) ) != 0 ) return( ret ); return( mbedtls_ecp_group_load( grp, grp_id ) ); } /* * Read a group id from an ECParameters record (RFC 4492) and convert it to * mbedtls_ecp_group_id. */ int mbedtls_ecp_tls_read_group_id( mbedtls_ecp_group_id *grp, const unsigned char **buf, size_t len ) { uint16_t tls_id; const mbedtls_ecp_curve_info *curve_info; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( *buf != NULL ); /* * We expect at least three bytes (see below) */ if( len < 3 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * First byte is curve_type; only named_curve is handled */ if( *(*buf)++ != MBEDTLS_ECP_TLS_NAMED_CURVE ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * Next two bytes are the namedcurve value */ tls_id = *(*buf)++; tls_id <<= 8; tls_id |= *(*buf)++; if( ( curve_info = mbedtls_ecp_curve_info_from_tls_id( tls_id ) ) == NULL ) return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); *grp = curve_info->grp_id; return( 0 ); } /* * Write the ECParameters record corresponding to a group (RFC 4492) */ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, unsigned char *buf, size_t blen ) { const mbedtls_ecp_curve_info *curve_info; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( olen != NULL ); if( ( curve_info = mbedtls_ecp_curve_info_from_grp_id( grp->id ) ) == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * We are going to write 3 bytes (see below) */ *olen = 3; if( blen < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); /* * First byte is curve_type, always named_curve */ *buf++ = MBEDTLS_ECP_TLS_NAMED_CURVE; /* * Next two bytes are the namedcurve value */ buf[0] = curve_info->tls_id >> 8; buf[1] = curve_info->tls_id & 0xFF; return( 0 ); } /* * Wrapper around fast quasi-modp functions, with fall-back to mbedtls_mpi_mod_mpi. * See the documentation of struct mbedtls_ecp_group. * * This function is in the critial loop for mbedtls_ecp_mul, so pay attention to perf. */ static int ecp_modp( mbedtls_mpi *N, const mbedtls_ecp_group *grp ) { int ret; if( grp->modp == NULL ) return( mbedtls_mpi_mod_mpi( N, N, &grp->P ) ); /* N->s < 0 is a much faster test, which fails only if N is 0 */ if( ( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 ) || mbedtls_mpi_bitlen( N ) > 2 * grp->pbits ) { return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } MBEDTLS_MPI_CHK( grp->modp( N ) ); /* N->s < 0 is a much faster test, which fails only if N is 0 */ while( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &grp->P ) ); while( mbedtls_mpi_cmp_mpi( N, &grp->P ) >= 0 ) /* we known P, N and the result are positive */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, N, &grp->P ) ); cleanup: return( ret ); } /* * Fast mod-p functions expect their argument to be in the 0..p^2 range. * * In order to guarantee that, we need to ensure that operands of * mbedtls_mpi_mul_mpi are in the 0..p range. So, after each operation we will * bring the result back to this range. * * The following macros are shortcuts for doing that. */ /* * Reduce a mbedtls_mpi mod p in-place, general case, to use after mbedtls_mpi_mul_mpi */ #if defined(MBEDTLS_SELF_TEST) #define INC_MUL_COUNT mul_count++; #else #define INC_MUL_COUNT #endif #define MOD_MUL( N ) do { MBEDTLS_MPI_CHK( ecp_modp( &N, grp ) ); INC_MUL_COUNT } \ while( 0 ) /* * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_sub_mpi * N->s < 0 is a very fast test, which fails only if N is 0 */ #define MOD_SUB( N ) \ while( N.s < 0 && mbedtls_mpi_cmp_int( &N, 0 ) != 0 ) \ MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &N, &N, &grp->P ) ) /* * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_add_mpi and mbedtls_mpi_mul_int. * We known P, N and the result are positive, so sub_abs is correct, and * a bit faster. */ #define MOD_ADD( N ) \ while( mbedtls_mpi_cmp_mpi( &N, &grp->P ) >= 0 ) \ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &N, &N, &grp->P ) ) #if defined(ECP_SHORTWEIERSTRASS) /* * For curves in short Weierstrass form, we do all the internal operations in * Jacobian coordinates. * * For multiplication, we'll use a comb method with coutermeasueres against * SPA, hence timing attacks. */ /* * Normalize jacobian coordinates so that Z == 0 || Z == 1 (GECC 3.2.1) * Cost: 1N := 1I + 3M + 1S */ static int ecp_normalize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt ) { int ret; mbedtls_mpi Zi, ZZi; if( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 ) return( 0 ); #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_normalize_jac( grp, pt ) ); #endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */ mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi ); /* * X = X / Z^2 mod p */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &Zi, &pt->Z, &grp->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi, &Zi, &Zi ) ); MOD_MUL( ZZi ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X, &pt->X, &ZZi ) ); MOD_MUL( pt->X ); /* * Y = Y / Z^3 mod p */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &ZZi ) ); MOD_MUL( pt->Y ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &Zi ) ); MOD_MUL( pt->Y ); /* * Z = 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) ); cleanup: mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi ); return( ret ); } /* * Normalize jacobian coordinates of an array of (pointers to) points, * using Montgomery's trick to perform only one inversion mod P. * (See for example Cohen's "A Course in Computational Algebraic Number * Theory", Algorithm 10.3.4.) * * Warning: fails (returning an error) if one of the points is zero! * This should never happen, see choice of w in ecp_mul_comb(). * * Cost: 1N(t) := 1I + (6t - 3)M + 1S */ static int ecp_normalize_jac_many( const mbedtls_ecp_group *grp, mbedtls_ecp_point *T[], size_t T_size ) { int ret; size_t i; mbedtls_mpi *c, u, Zi, ZZi; if( T_size < 2 ) return( ecp_normalize_jac( grp, *T ) ); #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_normalize_jac_many( grp, T, T_size ) ); #endif if( ( c = mbedtls_calloc( T_size, sizeof( mbedtls_mpi ) ) ) == NULL ) return( MBEDTLS_ERR_ECP_ALLOC_FAILED ); for( i = 0; i < T_size; i++ ) mbedtls_mpi_init( &c[i] ); mbedtls_mpi_init( &u ); mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi ); /* * c[i] = Z_0 * ... * Z_i */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &c[0], &T[0]->Z ) ); for( i = 1; i < T_size; i++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &c[i], &c[i-1], &T[i]->Z ) ); MOD_MUL( c[i] ); } /* * u = 1 / (Z_0 * ... * Z_n) mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &u, &c[T_size-1], &grp->P ) ); for( i = T_size - 1; ; i-- ) { /* * Zi = 1 / Z_i mod p * u = 1 / (Z_0 * ... * Z_i) mod P */ if( i == 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Zi, &u ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Zi, &u, &c[i-1] ) ); MOD_MUL( Zi ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u, &u, &T[i]->Z ) ); MOD_MUL( u ); } /* * proceed as in normalize() */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi, &Zi, &Zi ) ); MOD_MUL( ZZi ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->X, &T[i]->X, &ZZi ) ); MOD_MUL( T[i]->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &ZZi ) ); MOD_MUL( T[i]->Y ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &Zi ) ); MOD_MUL( T[i]->Y ); /* * Post-precessing: reclaim some memory by shrinking coordinates * - not storing Z (always 1) * - shrinking other coordinates, but still keeping the same number of * limbs as P, as otherwise it will too likely be regrown too fast. */ MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->X, grp->P.n ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->Y, grp->P.n ) ); mbedtls_mpi_free( &T[i]->Z ); if( i == 0 ) break; } cleanup: mbedtls_mpi_free( &u ); mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi ); for( i = 0; i < T_size; i++ ) mbedtls_mpi_free( &c[i] ); mbedtls_free( c ); return( ret ); } /* * Conditional point inversion: Q -> -Q = (Q.X, -Q.Y, Q.Z) without leak. * "inv" must be 0 (don't invert) or 1 (invert) or the result will be invalid */ static int ecp_safe_invert_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *Q, unsigned char inv ) { int ret; unsigned char nonzero; mbedtls_mpi mQY; mbedtls_mpi_init( &mQY ); /* Use the fact that -Q.Y mod P = P - Q.Y unless Q.Y == 0 */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mQY, &grp->P, &Q->Y ) ); nonzero = mbedtls_mpi_cmp_int( &Q->Y, 0 ) != 0; MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &Q->Y, &mQY, inv & nonzero ) ); cleanup: mbedtls_mpi_free( &mQY ); return( ret ); } /* * Point doubling R = 2 P, Jacobian coordinates * * Based on http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-1998-cmo-2 . * * We follow the variable naming fairly closely. The formula variations that trade a MUL for a SQR * (plus a few ADDs) aren't useful as our bignum implementation doesn't distinguish squaring. * * Standard optimizations are applied when curve parameter A is one of { 0, -3 }. * * Cost: 1D := 3M + 4S (A == 0) * 4M + 4S (A == -3) * 3M + 6S + 1a otherwise */ static int ecp_double_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P ) { int ret; mbedtls_mpi M, S, T, U; #if defined(MBEDTLS_SELF_TEST) dbl_count++; #endif #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_double_jac( grp, R, P ) ); #endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */ mbedtls_mpi_init( &M ); mbedtls_mpi_init( &S ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &U ); /* Special case for A = -3 */ if( grp->A.p == NULL ) { /* M = 3(X + Z^2)(X - Z^2) */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->Z, &P->Z ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &P->X, &S ) ); MOD_ADD( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U, &P->X, &S ) ); MOD_SUB( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &T, &U ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &S, 3 ) ); MOD_ADD( M ); } else { /* M = 3.X^2 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->X, &P->X ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &S, 3 ) ); MOD_ADD( M ); /* Optimize away for "koblitz" curves with A = 0 */ if( mbedtls_mpi_cmp_int( &grp->A, 0 ) != 0 ) { /* M += A.Z^4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->Z, &P->Z ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &S, &S ) ); MOD_MUL( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &T, &grp->A ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &M, &M, &S ) ); MOD_ADD( M ); } } /* S = 4.X.Y^2 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &P->Y, &P->Y ) ); MOD_MUL( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T, 1 ) ); MOD_ADD( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->X, &T ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &S, 1 ) ); MOD_ADD( S ); /* U = 8.Y^4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U, &T, &T ) ); MOD_MUL( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U, 1 ) ); MOD_ADD( U ); /* T = M^2 - 2.S */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &M, &M ) ); MOD_MUL( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T, &S ) ); MOD_SUB( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T, &S ) ); MOD_SUB( T ); /* S = M(S - T) - U */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S, &S, &T ) ); MOD_SUB( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &S, &M ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S, &S, &U ) ); MOD_SUB( S ); /* U = 2.Y.Z */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U, &P->Y, &P->Z ) ); MOD_MUL( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U, 1 ) ); MOD_ADD( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &T ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &S ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &U ) ); cleanup: mbedtls_mpi_free( &M ); mbedtls_mpi_free( &S ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &U ); return( ret ); } /* * Addition: R = P + Q, mixed affine-Jacobian coordinates (GECC 3.22) * * The coordinates of Q must be normalized (= affine), * but those of P don't need to. R is not normalized. * * Special cases: (1) P or Q is zero, (2) R is zero, (3) P == Q. * None of these cases can happen as intermediate step in ecp_mul_comb(): * - at each step, P, Q and R are multiples of the base point, the factor * being less than its order, so none of them is zero; * - Q is an odd multiple of the base point, P an even multiple, * due to the choice of precomputed points in the modified comb method. * So branches for these cases do not leak secret information. * * We accept Q->Z being unset (saving memory in tables) as meaning 1. * * Cost: 1A := 8M + 3S */ static int ecp_add_mixed( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ) { int ret; mbedtls_mpi T1, T2, T3, T4, X, Y, Z; #if defined(MBEDTLS_SELF_TEST) add_count++; #endif #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_add_mixed( grp, R, P, Q ) ); #endif /* MBEDTLS_ECP_ADD_MIXED_ALT */ /* * Trivial cases: P == 0 or Q == 0 (case 1) */ if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 ) return( mbedtls_ecp_copy( R, Q ) ); if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 0 ) == 0 ) return( mbedtls_ecp_copy( R, P ) ); /* * Make sure Q coordinates are normalized */ if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 1 ) != 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 ); mbedtls_mpi_init( &T3 ); mbedtls_mpi_init( &T4 ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &P->Z, &P->Z ) ); MOD_MUL( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2, &T1, &P->Z ) ); MOD_MUL( T2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T1, &Q->X ) ); MOD_MUL( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2, &T2, &Q->Y ) ); MOD_MUL( T2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T1, &T1, &P->X ) ); MOD_SUB( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T2, &T2, &P->Y ) ); MOD_SUB( T2 ); /* Special cases (2) and (3) */ if( mbedtls_mpi_cmp_int( &T1, 0 ) == 0 ) { if( mbedtls_mpi_cmp_int( &T2, 0 ) == 0 ) { ret = ecp_double_jac( grp, R, P ); goto cleanup; } else { ret = mbedtls_ecp_set_zero( R ); goto cleanup; } } MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Z, &P->Z, &T1 ) ); MOD_MUL( Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T1, &T1 ) ); MOD_MUL( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4, &T3, &T1 ) ); MOD_MUL( T4 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T3, &P->X ) ); MOD_MUL( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T3, 2 ) ); MOD_ADD( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &T2, &T2 ) ); MOD_MUL( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) ); MOD_SUB( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T4 ) ); MOD_SUB( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T3, &T3, &X ) ); MOD_SUB( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T3, &T2 ) ); MOD_MUL( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4, &T4, &P->Y ) ); MOD_MUL( T4 ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &Y, &T3, &T4 ) ); MOD_SUB( Y ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &Y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &Z ) ); cleanup: mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 ); mbedtls_mpi_free( &T3 ); mbedtls_mpi_free( &T4 ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); return( ret ); } /* * Randomize jacobian coordinates: * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l * This is sort of the reverse operation of ecp_normalize_jac(). * * This countermeasure was first suggested in [2]. */ static int ecp_randomize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi l, ll; size_t p_size; int count = 0; #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_randomize_jac( grp, pt, f_rng, p_rng ) ); #endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */ p_size = ( grp->pbits + 7 ) / 8; mbedtls_mpi_init( &l ); mbedtls_mpi_init( &ll ); /* Generate l such that 1 < l < p */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_ECP_RANDOM_FAILED ); } while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 ); /* Z = l * Z */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Z, &pt->Z, &l ) ); MOD_MUL( pt->Z ); /* X = l^2 * X */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll, &l, &l ) ); MOD_MUL( ll ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X, &pt->X, &ll ) ); MOD_MUL( pt->X ); /* Y = l^3 * Y */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll, &ll, &l ) ); MOD_MUL( ll ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &ll ) ); MOD_MUL( pt->Y ); cleanup: mbedtls_mpi_free( &l ); mbedtls_mpi_free( &ll ); return( ret ); } /* * Check and define parameters used by the comb method (see below for details) */ #if MBEDTLS_ECP_WINDOW_SIZE < 2 || MBEDTLS_ECP_WINDOW_SIZE > 7 #error "MBEDTLS_ECP_WINDOW_SIZE out of bounds" #endif /* d = ceil( n / w ) */ #define COMB_MAX_D ( MBEDTLS_ECP_MAX_BITS + 1 ) / 2 /* number of precomputed points */ #define COMB_MAX_PRE ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) /* * Compute the representation of m that will be used with our comb method. * * The basic comb method is described in GECC 3.44 for example. We use a * modified version that provides resistance to SPA by avoiding zero * digits in the representation as in [3]. We modify the method further by * requiring that all K_i be odd, which has the small cost that our * representation uses one more K_i, due to carries, but saves on the size of * the precomputed table. * * Summary of the comb method and its modifications: * * - The goal is to compute m*P for some w*d-bit integer m. * * - The basic comb method splits m into the w-bit integers * x[0] .. x[d-1] where x[i] consists of the bits in m whose * index has residue i modulo d, and computes m * P as * S[x[0]] + 2 * S[x[1]] + .. + 2^(d-1) S[x[d-1]], where * S[i_{w-1} .. i_0] := i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + i_0 P. * * - If it happens that, say, x[i+1]=0 (=> S[x[i+1]]=0), one can replace the sum by * .. + 2^{i-1} S[x[i-1]] - 2^i S[x[i]] + 2^{i+1} S[x[i]] + 2^{i+2} S[x[i+2]] .., * thereby successively converting it into a form where all summands * are nonzero, at the cost of negative summands. This is the basic idea of [3]. * * - More generally, even if x[i+1] != 0, we can first transform the sum as * .. - 2^i S[x[i]] + 2^{i+1} ( S[x[i]] + S[x[i+1]] ) + 2^{i+2} S[x[i+2]] .., * and then replace S[x[i]] + S[x[i+1]] = S[x[i] ^ x[i+1]] + 2 S[x[i] & x[i+1]]. * Performing and iterating this procedure for those x[i] that are even * (keeping track of carry), we can transform the original sum into one of the form * S[x'[0]] +- 2 S[x'[1]] +- .. +- 2^{d-1} S[x'[d-1]] + 2^d S[x'[d]] * with all x'[i] odd. It is therefore only necessary to know S at odd indices, * which is why we are only computing half of it in the first place in * ecp_precompute_comb and accessing it with index abs(i) / 2 in ecp_select_comb. * * - For the sake of compactness, only the seven low-order bits of x[i] * are used to represent its absolute value (K_i in the paper), and the msb * of x[i] encodes the sign (s_i in the paper): it is set if and only if * if s_i == -1; * * Calling conventions: * - x is an array of size d + 1 * - w is the size, ie number of teeth, of the comb, and must be between * 2 and 7 (in practice, between 2 and MBEDTLS_ECP_WINDOW_SIZE) * - m is the MPI, expected to be odd and such that bitlength(m) <= w * d * (the result will be incorrect if these assumptions are not satisfied) */ static void ecp_comb_recode_core( unsigned char x[], size_t d, unsigned char w, const mbedtls_mpi *m ) { size_t i, j; unsigned char c, cc, adjust; memset( x, 0, d+1 ); /* First get the classical comb values (except for x_d = 0) */ for( i = 0; i < d; i++ ) for( j = 0; j < w; j++ ) x[i] |= mbedtls_mpi_get_bit( m, i + d * j ) << j; /* Now make sure x_1 .. x_d are odd */ c = 0; for( i = 1; i <= d; i++ ) { /* Add carry and update it */ cc = x[i] & c; x[i] = x[i] ^ c; c = cc; /* Adjust if needed, avoiding branches */ adjust = 1 - ( x[i] & 0x01 ); c |= x[i] & ( x[i-1] * adjust ); x[i] = x[i] ^ ( x[i-1] * adjust ); x[i-1] |= adjust << 7; } } /* * Precompute points for the adapted comb method * * Assumption: T must be able to hold 2^{w - 1} elements. * * Operation: If i = i_{w-1} ... i_1 is the binary representation of i, * sets T[i] = i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + P. * * Cost: d(w-1) D + (2^{w-1} - 1) A + 1 N(w-1) + 1 N(2^{w-1} - 1) * * Note: Even comb values (those where P would be omitted from the * sum defining T[i] above) are not needed in our adaption * the comb method. See ecp_comb_recode_core(). * * This function currently works in four steps: * (1) [dbl] Computation of intermediate T[i] for 2-power values of i * (2) [norm_dbl] Normalization of coordinates of these T[i] * (3) [add] Computation of all T[i] * (4) [norm_add] Normalization of all T[i] * * Step 1 can be interrupted but not the others; together with the final * coordinate normalization they are the largest steps done at once, depending * on the window size. Here are operation counts for P-256: * * step (2) (3) (4) * w = 5 142 165 208 * w = 4 136 77 160 * w = 3 130 33 136 * w = 2 124 11 124 * * So if ECC operations are blocking for too long even with a low max_ops * value, it's useful to set MBEDTLS_ECP_WINDOW_SIZE to a lower value in order * to minimize maximum blocking time. */ static int ecp_precompute_comb( const mbedtls_ecp_group *grp, mbedtls_ecp_point T[], const mbedtls_ecp_point *P, unsigned char w, size_t d, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; unsigned char i; size_t j = 0; const unsigned char T_size = 1U << ( w - 1 ); mbedtls_ecp_point *cur, *TT[COMB_MAX_PRE - 1]; #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) { if( rs_ctx->rsm->state == ecp_rsm_pre_dbl ) goto dbl; if( rs_ctx->rsm->state == ecp_rsm_pre_norm_dbl ) goto norm_dbl; if( rs_ctx->rsm->state == ecp_rsm_pre_add ) goto add; if( rs_ctx->rsm->state == ecp_rsm_pre_norm_add ) goto norm_add; } #else (void) rs_ctx; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) { rs_ctx->rsm->state = ecp_rsm_pre_dbl; /* initial state for the loop */ rs_ctx->rsm->i = 0; } dbl: #endif /* * Set T[0] = P and * T[2^{l-1}] = 2^{dl} P for l = 1 .. w-1 (this is not the final value) */ MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &T[0], P ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->i != 0 ) j = rs_ctx->rsm->i; else #endif j = 0; for( ; j < d * ( w - 1 ); j++ ) { MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_DBL ); i = 1U << ( j / d ); cur = T + i; if( j % d == 0 ) MBEDTLS_MPI_CHK( mbedtls_ecp_copy( cur, T + ( i >> 1 ) ) ); MBEDTLS_MPI_CHK( ecp_double_jac( grp, cur, cur ) ); } #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_pre_norm_dbl; norm_dbl: #endif /* * Normalize current elements in T. As T has holes, * use an auxiliary array of pointers to elements in T. */ j = 0; for( i = 1; i < T_size; i <<= 1 ) TT[j++] = T + i; MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV + 6 * j - 2 ); MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, j ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_pre_add; add: #endif /* * Compute the remaining ones using the minimal number of additions * Be careful to update T[2^l] only after using it! */ MBEDTLS_ECP_BUDGET( ( T_size - 1 ) * MBEDTLS_ECP_OPS_ADD ); for( i = 1; i < T_size; i <<= 1 ) { j = i; while( j-- ) MBEDTLS_MPI_CHK( ecp_add_mixed( grp, &T[i + j], &T[j], &T[i] ) ); } #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_pre_norm_add; norm_add: #endif /* * Normalize final elements in T. Even though there are no holes now, we * still need the auxiliary array for homogeneity with the previous * call. Also, skip T[0] which is already normalised, being a copy of P. */ for( j = 0; j + 1 < T_size; j++ ) TT[j] = T + j + 1; MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV + 6 * j - 2 ); MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, j ) ); cleanup: #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { if( rs_ctx->rsm->state == ecp_rsm_pre_dbl ) rs_ctx->rsm->i = j; } #endif return( ret ); } /* * Select precomputed point: R = sign(i) * T[ abs(i) / 2 ] * * See ecp_comb_recode_core() for background */ static int ecp_select_comb( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point T[], unsigned char T_size, unsigned char i ) { int ret; unsigned char ii, j; /* Ignore the "sign" bit and scale down */ ii = ( i & 0x7Fu ) >> 1; /* Read the whole table to thwart cache-based timing attacks */ for( j = 0; j < T_size; j++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->X, &T[j].X, j == ii ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->Y, &T[j].Y, j == ii ) ); } /* Safely invert result if i is "negative" */ MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, R, i >> 7 ) ); cleanup: return( ret ); } /* * Core multiplication algorithm for the (modified) comb method. * This part is actually common with the basic comb method (GECC 3.44) * * Cost: d A + d D + 1 R */ static int ecp_mul_comb_core( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point T[], unsigned char T_size, const unsigned char x[], size_t d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; mbedtls_ecp_point Txi; size_t i; mbedtls_ecp_point_init( &Txi ); #if !defined(MBEDTLS_ECP_RESTARTABLE) (void) rs_ctx; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->state != ecp_rsm_comb_core ) { rs_ctx->rsm->i = 0; rs_ctx->rsm->state = ecp_rsm_comb_core; } /* new 'if' instead of nested for the sake of the 'else' branch */ if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->i != 0 ) { /* restore current index (R already pointing to rs_ctx->rsm->R) */ i = rs_ctx->rsm->i; } else #endif { /* Start with a non-zero point and randomize its coordinates */ i = d; MBEDTLS_MPI_CHK( ecp_select_comb( grp, R, T, T_size, x[i] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 1 ) ); if( f_rng != 0 ) MBEDTLS_MPI_CHK( ecp_randomize_jac( grp, R, f_rng, p_rng ) ); } while( i != 0 ) { MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_DBL + MBEDTLS_ECP_OPS_ADD ); --i; MBEDTLS_MPI_CHK( ecp_double_jac( grp, R, R ) ); MBEDTLS_MPI_CHK( ecp_select_comb( grp, &Txi, T, T_size, x[i] ) ); MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, R, &Txi ) ); } cleanup: mbedtls_ecp_point_free( &Txi ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { rs_ctx->rsm->i = i; /* no need to save R, already pointing to rs_ctx->rsm->R */ } #endif return( ret ); } /* * Recode the scalar to get constant-time comb multiplication * * As the actual scalar recoding needs an odd scalar as a starting point, * this wrapper ensures that by replacing m by N - m if necessary, and * informs the caller that the result of multiplication will be negated. * * This works because we only support large prime order for Short Weierstrass * curves, so N is always odd hence either m or N - m is. * * See ecp_comb_recode_core() for background. */ static int ecp_comb_recode_scalar( const mbedtls_ecp_group *grp, const mbedtls_mpi *m, unsigned char k[COMB_MAX_D + 1], size_t d, unsigned char w, unsigned char *parity_trick ) { int ret; mbedtls_mpi M, mm; mbedtls_mpi_init( &M ); mbedtls_mpi_init( &mm ); /* N is always odd (see above), just make extra sure */ if( mbedtls_mpi_get_bit( &grp->N, 0 ) != 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* do we need the parity trick? */ *parity_trick = ( mbedtls_mpi_get_bit( m, 0 ) == 0 ); /* execute parity fix in constant time */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &M, m ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mm, &grp->N, m ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &M, &mm, *parity_trick ) ); /* actual scalar recoding */ ecp_comb_recode_core( k, d, w, &M ); cleanup: mbedtls_mpi_free( &mm ); mbedtls_mpi_free( &M ); return( ret ); } /* * Perform comb multiplication (for short Weierstrass curves) * once the auxiliary table has been pre-computed. * * Scalar recoding may use a parity trick that makes us compute -m * P, * if that is the case we'll need to recover m * P at the end. */ static int ecp_mul_comb_after_precomp( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *T, unsigned char T_size, unsigned char w, size_t d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; unsigned char parity_trick; unsigned char k[COMB_MAX_D + 1]; mbedtls_ecp_point *RR = R; #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) { RR = &rs_ctx->rsm->R; if( rs_ctx->rsm->state == ecp_rsm_final_norm ) goto final_norm; } #endif MBEDTLS_MPI_CHK( ecp_comb_recode_scalar( grp, m, k, d, w, &parity_trick ) ); MBEDTLS_MPI_CHK( ecp_mul_comb_core( grp, RR, T, T_size, k, d, f_rng, p_rng, rs_ctx ) ); MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, RR, parity_trick ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_final_norm; final_norm: #endif MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV ); MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, RR ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, RR ) ); #endif cleanup: return( ret ); } /* * Pick window size based on curve size and whether we optimize for base point */ static unsigned char ecp_pick_window_size( const mbedtls_ecp_group *grp, unsigned char p_eq_g ) { unsigned char w; /* * Minimize the number of multiplications, that is minimize * 10 * d * w + 18 * 2^(w-1) + 11 * d + 7 * w, with d = ceil( nbits / w ) * (see costs of the various parts, with 1S = 1M) */ w = grp->nbits >= 384 ? 5 : 4; /* * If P == G, pre-compute a bit more, since this may be re-used later. * Just adding one avoids upping the cost of the first mul too much, * and the memory cost too. */ if( p_eq_g ) w++; /* * Make sure w is within bounds. * (The last test is useful only for very small curves in the test suite.) */ if( w > MBEDTLS_ECP_WINDOW_SIZE ) w = MBEDTLS_ECP_WINDOW_SIZE; if( w >= grp->nbits ) w = 2; return( w ); } /* * Multiplication using the comb method - for curves in short Weierstrass form * * This function is mainly responsible for administrative work: * - managing the restart context if enabled * - managing the table of precomputed points (passed between the below two * functions): allocation, computation, ownership tranfer, freeing. * * It delegates the actual arithmetic work to: * ecp_precompute_comb() and ecp_mul_comb_with_precomp() * * See comments on ecp_comb_recode_core() regarding the computation strategy. */ static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; unsigned char w, p_eq_g, i; size_t d; unsigned char T_size, T_ok; mbedtls_ecp_point *T; ECP_RS_ENTER( rsm ); /* Is P the base point ? */ #if MBEDTLS_ECP_FIXED_POINT_OPTIM == 1 p_eq_g = ( mbedtls_mpi_cmp_mpi( &P->Y, &grp->G.Y ) == 0 && mbedtls_mpi_cmp_mpi( &P->X, &grp->G.X ) == 0 ); #else p_eq_g = 0; #endif /* Pick window size and deduce related sizes */ w = ecp_pick_window_size( grp, p_eq_g ); T_size = 1U << ( w - 1 ); d = ( grp->nbits + w - 1 ) / w; /* Pre-computed table: do we have it already for the base point? */ if( p_eq_g && grp->T != NULL ) { /* second pointer to the same table, will be deleted on exit */ T = grp->T; T_ok = 1; } else #if defined(MBEDTLS_ECP_RESTARTABLE) /* Pre-computed table: do we have one in progress? complete? */ if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->T != NULL ) { /* transfer ownership of T from rsm to local function */ T = rs_ctx->rsm->T; rs_ctx->rsm->T = NULL; rs_ctx->rsm->T_size = 0; /* This effectively jumps to the call to mul_comb_after_precomp() */ T_ok = rs_ctx->rsm->state >= ecp_rsm_comb_core; } else #endif /* Allocate table if we didn't have any */ { T = mbedtls_calloc( T_size, sizeof( mbedtls_ecp_point ) ); if( T == NULL ) { ret = MBEDTLS_ERR_ECP_ALLOC_FAILED; goto cleanup; } for( i = 0; i < T_size; i++ ) mbedtls_ecp_point_init( &T[i] ); T_ok = 0; } /* Compute table (or finish computing it) if not done already */ if( !T_ok ) { MBEDTLS_MPI_CHK( ecp_precompute_comb( grp, T, P, w, d, rs_ctx ) ); if( p_eq_g ) { /* almost transfer ownership of T to the group, but keep a copy of * the pointer to use for calling the next function more easily */ grp->T = T; grp->T_size = T_size; } } /* Actual comb multiplication using precomputed points */ MBEDTLS_MPI_CHK( ecp_mul_comb_after_precomp( grp, R, m, T, T_size, w, d, f_rng, p_rng, rs_ctx ) ); cleanup: /* does T belong to the group? */ if( T == grp->T ) T = NULL; /* does T belong to the restart context? */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS && T != NULL ) { /* transfer ownership of T from local function to rsm */ rs_ctx->rsm->T_size = T_size; rs_ctx->rsm->T = T; T = NULL; } #endif /* did T belong to us? then let's destroy it! */ if( T != NULL ) { for( i = 0; i < T_size; i++ ) mbedtls_ecp_point_free( &T[i] ); mbedtls_free( T ); } /* don't free R while in progress in case R == P */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) #endif /* prevent caller from using invalid value */ if( ret != 0 ) mbedtls_ecp_point_free( R ); ECP_RS_LEAVE( rsm ); return( ret ); } #endif /* ECP_SHORTWEIERSTRASS */ #if defined(ECP_MONTGOMERY) /* * For Montgomery curves, we do all the internal arithmetic in projective * coordinates. Import/export of points uses only the x coordinates, which is * internaly represented as X / Z. * * For scalar multiplication, we'll use a Montgomery ladder. */ /* * Normalize Montgomery x/z coordinates: X = X/Z, Z = 1 * Cost: 1M + 1I */ static int ecp_normalize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P ) { int ret; #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_normalize_mxz( grp, P ) ); #endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &P->Z, &P->Z, &grp->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &P->Z ) ); MOD_MUL( P->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) ); cleanup: return( ret ); } /* * Randomize projective x/z coordinates: * (X, Z) -> (l X, l Z) for random l * This is sort of the reverse operation of ecp_normalize_mxz(). * * This countermeasure was first suggested in [2]. * Cost: 2M */ static int ecp_randomize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi l; size_t p_size; int count = 0; #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_randomize_mxz( grp, P, f_rng, p_rng ); #endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */ p_size = ( grp->pbits + 7 ) / 8; mbedtls_mpi_init( &l ); /* Generate l such that 1 < l < p */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_ECP_RANDOM_FAILED ); } while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &l ) ); MOD_MUL( P->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->Z, &P->Z, &l ) ); MOD_MUL( P->Z ); cleanup: mbedtls_mpi_free( &l ); return( ret ); } /* * Double-and-add: R = 2P, S = P + Q, with d = X(P - Q), * for Montgomery curves in x/z coordinates. * * http://www.hyperelliptic.org/EFD/g1p/auto-code/montgom/xz/ladder/mladd-1987-m.op3 * with * d = X1 * P = (X2, Z2) * Q = (X3, Z3) * R = (X4, Z4) * S = (X5, Z5) * and eliminating temporary variables tO, ..., t4. * * Cost: 5M + 4S */ static int ecp_double_add_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, mbedtls_ecp_point *S, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q, const mbedtls_mpi *d ) { int ret; mbedtls_mpi A, AA, B, BB, E, C, D, DA, CB; #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_double_add_mxz( grp, R, S, P, Q, d ) ); #endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */ mbedtls_mpi_init( &A ); mbedtls_mpi_init( &AA ); mbedtls_mpi_init( &B ); mbedtls_mpi_init( &BB ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &C ); mbedtls_mpi_init( &D ); mbedtls_mpi_init( &DA ); mbedtls_mpi_init( &CB ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &A, &P->X, &P->Z ) ); MOD_ADD( A ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &AA, &A, &A ) ); MOD_MUL( AA ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &B, &P->X, &P->Z ) ); MOD_SUB( B ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &BB, &B, &B ) ); MOD_MUL( BB ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &E, &AA, &BB ) ); MOD_SUB( E ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &C, &Q->X, &Q->Z ) ); MOD_ADD( C ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &D, &Q->X, &Q->Z ) ); MOD_SUB( D ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DA, &D, &A ) ); MOD_MUL( DA ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &CB, &C, &B ) ); MOD_MUL( CB ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &S->X, &DA, &CB ) ); MOD_MUL( S->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->X, &S->X, &S->X ) ); MOD_MUL( S->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S->Z, &DA, &CB ) ); MOD_SUB( S->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, &S->Z, &S->Z ) ); MOD_MUL( S->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, d, &S->Z ) ); MOD_MUL( S->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->X, &AA, &BB ) ); MOD_MUL( R->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &grp->A, &E ) ); MOD_MUL( R->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &R->Z, &BB, &R->Z ) ); MOD_ADD( R->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &E, &R->Z ) ); MOD_MUL( R->Z ); cleanup: mbedtls_mpi_free( &A ); mbedtls_mpi_free( &AA ); mbedtls_mpi_free( &B ); mbedtls_mpi_free( &BB ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &C ); mbedtls_mpi_free( &D ); mbedtls_mpi_free( &DA ); mbedtls_mpi_free( &CB ); return( ret ); } /* * Multiplication with Montgomery ladder in x/z coordinates, * for curves in Montgomery form */ static int ecp_mul_mxz( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; size_t i; unsigned char b; mbedtls_ecp_point RP; mbedtls_mpi PX; mbedtls_ecp_point_init( &RP ); mbedtls_mpi_init( &PX ); /* Save PX and read from P before writing to R, in case P == R */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &PX, &P->X ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &RP, P ) ); /* Set R to zero in modified x/z coordinates */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->X, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 0 ) ); mbedtls_mpi_free( &R->Y ); /* RP.X might be sligtly larger than P, so reduce it */ MOD_ADD( RP.X ); /* Randomize coordinates of the starting point */ if( f_rng != NULL ) MBEDTLS_MPI_CHK( ecp_randomize_mxz( grp, &RP, f_rng, p_rng ) ); /* Loop invariant: R = result so far, RP = R + P */ i = mbedtls_mpi_bitlen( m ); /* one past the (zero-based) most significant bit */ while( i-- > 0 ) { b = mbedtls_mpi_get_bit( m, i ); /* * if (b) R = 2R + P else R = 2R, * which is: * if (b) double_add( RP, R, RP, R ) * else double_add( R, RP, R, RP ) * but using safe conditional swaps to avoid leaks */ MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) ); MBEDTLS_MPI_CHK( ecp_double_add_mxz( grp, R, &RP, R, &RP, &PX ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) ); } MBEDTLS_MPI_CHK( ecp_normalize_mxz( grp, R ) ); cleanup: mbedtls_ecp_point_free( &RP ); mbedtls_mpi_free( &PX ); return( ret ); } #endif /* ECP_MONTGOMERY */ /* * Restartable multiplication R = m * P */ int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; #if defined(MBEDTLS_ECP_INTERNAL_ALT) char is_grp_capable = 0; #endif ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) /* reset ops count for this call if top-level */ if( rs_ctx != NULL && rs_ctx->depth++ == 0 ) rs_ctx->ops_done = 0; #endif #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( ( is_grp_capable = mbedtls_internal_ecp_grp_capable( grp ) ) ) MBEDTLS_MPI_CHK( mbedtls_internal_ecp_init( grp ) ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RESTARTABLE) /* skip argument check when restarting */ if( rs_ctx == NULL || rs_ctx->rsm == NULL ) #endif { /* check_privkey is free */ MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_CHK ); /* Common sanity checks */ MBEDTLS_MPI_CHK( mbedtls_ecp_check_privkey( grp, m ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, P ) ); } ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) MBEDTLS_MPI_CHK( ecp_mul_mxz( grp, R, m, P, f_rng, p_rng ) ); #endif #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) MBEDTLS_MPI_CHK( ecp_mul_comb( grp, R, m, P, f_rng, p_rng, rs_ctx ) ); #endif cleanup: #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( is_grp_capable ) mbedtls_internal_ecp_free( grp ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL ) rs_ctx->depth--; #endif return( ret ); } /* * Multiplication R = m * P */ int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); return( mbedtls_ecp_mul_restartable( grp, R, m, P, f_rng, p_rng, NULL ) ); } #if defined(ECP_SHORTWEIERSTRASS) /* * Check that an affine point is valid as a public key, * short weierstrass curves (SEC1 3.2.3.1) */ static int ecp_check_pubkey_sw( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ) { int ret; mbedtls_mpi YY, RHS; /* pt coordinates must be normalized for our checks */ if( mbedtls_mpi_cmp_int( &pt->X, 0 ) < 0 || mbedtls_mpi_cmp_int( &pt->Y, 0 ) < 0 || mbedtls_mpi_cmp_mpi( &pt->X, &grp->P ) >= 0 || mbedtls_mpi_cmp_mpi( &pt->Y, &grp->P ) >= 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); mbedtls_mpi_init( &YY ); mbedtls_mpi_init( &RHS ); /* * YY = Y^2 * RHS = X (X^2 + A) + B = X^3 + A X + B */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &YY, &pt->Y, &pt->Y ) ); MOD_MUL( YY ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &pt->X, &pt->X ) ); MOD_MUL( RHS ); /* Special case for A = -3 */ if( grp->A.p == NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &RHS, &RHS, 3 ) ); MOD_SUB( RHS ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS, &grp->A ) ); MOD_ADD( RHS ); } MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &RHS, &pt->X ) ); MOD_MUL( RHS ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS, &grp->B ) ); MOD_ADD( RHS ); if( mbedtls_mpi_cmp_mpi( &YY, &RHS ) != 0 ) ret = MBEDTLS_ERR_ECP_INVALID_KEY; cleanup: mbedtls_mpi_free( &YY ); mbedtls_mpi_free( &RHS ); return( ret ); } #endif /* ECP_SHORTWEIERSTRASS */ /* * R = m * P with shortcuts for m == 1 and m == -1 * NOT constant-time - ONLY for short Weierstrass! */ static int mbedtls_ecp_mul_shortcuts( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; if( mbedtls_mpi_cmp_int( m, 1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) ); } else if( mbedtls_mpi_cmp_int( m, -1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) ); if( mbedtls_mpi_cmp_int( &R->Y, 0 ) != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &R->Y, &grp->P, &R->Y ) ); } else { MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, R, m, P, NULL, NULL, rs_ctx ) ); } cleanup: return( ret ); } /* * Restartable linear combination * NOT constant-time */ int mbedtls_ecp_muladd_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; mbedtls_ecp_point mP; mbedtls_ecp_point *pmP = &mP; mbedtls_ecp_point *pR = R; #if defined(MBEDTLS_ECP_INTERNAL_ALT) char is_grp_capable = 0; #endif ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( n != NULL ); ECP_VALIDATE_RET( Q != NULL ); if( ecp_get_type( grp ) != ECP_TYPE_SHORT_WEIERSTRASS ) return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); mbedtls_ecp_point_init( &mP ); ECP_RS_ENTER( ma ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) { /* redirect intermediate results to restart context */ pmP = &rs_ctx->ma->mP; pR = &rs_ctx->ma->R; /* jump to next operation */ if( rs_ctx->ma->state == ecp_rsma_mul2 ) goto mul2; if( rs_ctx->ma->state == ecp_rsma_add ) goto add; if( rs_ctx->ma->state == ecp_rsma_norm ) goto norm; } #endif /* MBEDTLS_ECP_RESTARTABLE */ MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, pmP, m, P, rs_ctx ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) rs_ctx->ma->state = ecp_rsma_mul2; mul2: #endif MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, pR, n, Q, rs_ctx ) ); #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( ( is_grp_capable = mbedtls_internal_ecp_grp_capable( grp ) ) ) MBEDTLS_MPI_CHK( mbedtls_internal_ecp_init( grp ) ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) rs_ctx->ma->state = ecp_rsma_add; add: #endif MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_ADD ); MBEDTLS_MPI_CHK( ecp_add_mixed( grp, pR, pmP, pR ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) rs_ctx->ma->state = ecp_rsma_norm; norm: #endif MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV ); MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, pR ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, pR ) ); #endif cleanup: #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( is_grp_capable ) mbedtls_internal_ecp_free( grp ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ mbedtls_ecp_point_free( &mP ); ECP_RS_LEAVE( ma ); return( ret ); } /* * Linear combination * NOT constant-time */ int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( n != NULL ); ECP_VALIDATE_RET( Q != NULL ); return( mbedtls_ecp_muladd_restartable( grp, R, m, P, n, Q, NULL ) ); } #if defined(ECP_MONTGOMERY) /* * Check validity of a public key for Montgomery curves with x-only schemes */ static int ecp_check_pubkey_mx( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ) { /* [Curve25519 p. 5] Just check X is the correct number of bytes */ /* Allow any public value, if it's too big then we'll just reduce it mod p * (RFC 7748 sec. 5 para. 3). */ if( mbedtls_mpi_size( &pt->X ) > ( grp->nbits + 7 ) / 8 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); return( 0 ); } #endif /* ECP_MONTGOMERY */ /* * Check that a point is valid as a public key */ int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); /* Must use affine coordinates */ if( mbedtls_mpi_cmp_int( &pt->Z, 1 ) != 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) return( ecp_check_pubkey_mx( grp, pt ) ); #endif #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) return( ecp_check_pubkey_sw( grp, pt ) ); #endif return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } /* * Check that an mbedtls_mpi is valid as a private key */ int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) { /* see RFC 7748 sec. 5 para. 5 */ if( mbedtls_mpi_get_bit( d, 0 ) != 0 || mbedtls_mpi_get_bit( d, 1 ) != 0 || mbedtls_mpi_bitlen( d ) - 1 != grp->nbits ) /* mbedtls_mpi_bitlen is one-based! */ return( MBEDTLS_ERR_ECP_INVALID_KEY ); /* see [Curve25519] page 5 */ if( grp->nbits == 254 && mbedtls_mpi_get_bit( d, 2 ) != 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); return( 0 ); } #endif /* ECP_MONTGOMERY */ #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) { /* see SEC1 3.2 */ if( mbedtls_mpi_cmp_int( d, 1 ) < 0 || mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); else return( 0 ); } #endif /* ECP_SHORTWEIERSTRASS */ return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } /* * Generate a private key */ int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp, mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; size_t n_size; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); n_size = ( grp->nbits + 7 ) / 8; #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) { /* [M225] page 5 */ size_t b; do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( d, n_size, f_rng, p_rng ) ); } while( mbedtls_mpi_bitlen( d ) == 0); /* Make sure the most significant bit is nbits */ b = mbedtls_mpi_bitlen( d ) - 1; /* mbedtls_mpi_bitlen is one-based */ if( b > grp->nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, b - grp->nbits ) ); else MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, grp->nbits, 1 ) ); /* Make sure the last two bits are unset for Curve448, three bits for Curve25519 */ MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 0, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 1, 0 ) ); if( grp->nbits == 254 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 2, 0 ) ); } } #endif /* ECP_MONTGOMERY */ #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) { /* SEC1 3.2.1: Generate d such that 1 <= n < N */ int count = 0; /* * Match the procedure given in RFC 6979 (deterministic ECDSA): * - use the same byte ordering; * - keep the leftmost nbits bits of the generated octet string; * - try until result is in the desired range. * This also avoids any biais, which is especially important for ECDSA. */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( d, n_size, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, 8 * n_size - grp->nbits ) ); /* * Each try has at worst a probability 1/2 of failing (the msb has * a probability 1/2 of being 0, and then the result will be < N), * so after 30 tries failure probability is a most 2**(-30). * * For most curves, 1 try is enough with overwhelming probability, * since N starts with a lot of 1s in binary, but some curves * such as secp224k1 are actually very close to the worst case. */ if( ++count > 30 ) return( MBEDTLS_ERR_ECP_RANDOM_FAILED ); } while( mbedtls_mpi_cmp_int( d, 1 ) < 0 || mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 ); } #endif /* ECP_SHORTWEIERSTRASS */ cleanup: return( ret ); } /* * Generate a keypair with configurable base point */ int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp, const mbedtls_ecp_point *G, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); ECP_VALIDATE_RET( G != NULL ); ECP_VALIDATE_RET( Q != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, d, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, Q, d, G, f_rng, p_rng ) ); cleanup: return( ret ); } /* * Generate key pair, wrapper for conventional base point */ int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); ECP_VALIDATE_RET( Q != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); return( mbedtls_ecp_gen_keypair_base( grp, &grp->G, d, Q, f_rng, p_rng ) ); } /* * Generate a keypair, prettier wrapper */ int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; ECP_VALIDATE_RET( key != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); if( ( ret = mbedtls_ecp_group_load( &key->grp, grp_id ) ) != 0 ) return( ret ); return( mbedtls_ecp_gen_keypair( &key->grp, &key->d, &key->Q, f_rng, p_rng ) ); } /* * Check a public-private key pair */ int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv ) { int ret; mbedtls_ecp_point Q; mbedtls_ecp_group grp; ECP_VALIDATE_RET( pub != NULL ); ECP_VALIDATE_RET( prv != NULL ); if( pub->grp.id == MBEDTLS_ECP_DP_NONE || pub->grp.id != prv->grp.id || mbedtls_mpi_cmp_mpi( &pub->Q.X, &prv->Q.X ) || mbedtls_mpi_cmp_mpi( &pub->Q.Y, &prv->Q.Y ) || mbedtls_mpi_cmp_mpi( &pub->Q.Z, &prv->Q.Z ) ) { return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } mbedtls_ecp_point_init( &Q ); mbedtls_ecp_group_init( &grp ); /* mbedtls_ecp_mul() needs a non-const group... */ mbedtls_ecp_group_copy( &grp, &prv->grp ); /* Also checks d is valid */ MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &Q, &prv->d, &prv->grp.G, NULL, NULL ) ); if( mbedtls_mpi_cmp_mpi( &Q.X, &prv->Q.X ) || mbedtls_mpi_cmp_mpi( &Q.Y, &prv->Q.Y ) || mbedtls_mpi_cmp_mpi( &Q.Z, &prv->Q.Z ) ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } cleanup: mbedtls_ecp_point_free( &Q ); mbedtls_ecp_group_free( &grp ); return( ret ); } #if defined(MBEDTLS_SELF_TEST) /* * Checkup routine */ int mbedtls_ecp_self_test( int verbose ) { int ret; size_t i; mbedtls_ecp_group grp; mbedtls_ecp_point R, P; mbedtls_mpi m; unsigned long add_c_prev, dbl_c_prev, mul_c_prev; /* exponents especially adapted for secp192r1 */ const char *exponents[] = { "000000000000000000000000000000000000000000000001", /* one */ "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22830", /* N - 1 */ "5EA6F389A38B8BC81E767753B15AA5569E1782E30ABE7D25", /* random */ "400000000000000000000000000000000000000000000000", /* one and zeros */ "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* all ones */ "555555555555555555555555555555555555555555555555", /* 101010... */ }; mbedtls_ecp_group_init( &grp ); mbedtls_ecp_point_init( &R ); mbedtls_ecp_point_init( &P ); mbedtls_mpi_init( &m ); /* Use secp192r1 if available, or any available curve */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, MBEDTLS_ECP_DP_SECP192R1 ) ); #else MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, mbedtls_ecp_curve_list()->grp_id ) ); #endif if( verbose != 0 ) mbedtls_printf( " ECP test #1 (constant op_count, base point G): " ); /* Do a dummy multiplication first to trigger precomputation */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &m, 2 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &P, &m, &grp.G, NULL, NULL ) ); add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) ); for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ ) { add_c_prev = add_count; dbl_c_prev = dbl_count; mul_c_prev = mul_count; add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) ); if( add_count != add_c_prev || dbl_count != dbl_c_prev || mul_count != mul_c_prev ) { if( verbose != 0 ) mbedtls_printf( "failed (%u)\n", (unsigned int) i ); ret = 1; goto cleanup; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " ECP test #2 (constant op_count, other point): " ); /* We computed P = 2G last time, use it */ add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) ); for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ ) { add_c_prev = add_count; dbl_c_prev = dbl_count; mul_c_prev = mul_count; add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) ); if( add_count != add_c_prev || dbl_count != dbl_c_prev || mul_count != mul_c_prev ) { if( verbose != 0 ) mbedtls_printf( "failed (%u)\n", (unsigned int) i ); ret = 1; goto cleanup; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: if( ret < 0 && verbose != 0 ) mbedtls_printf( "Unexpected error, return code = %08X\n", ret ); mbedtls_ecp_group_free( &grp ); mbedtls_ecp_point_free( &R ); mbedtls_ecp_point_free( &P ); mbedtls_mpi_free( &m ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* !MBEDTLS_ECP_ALT */ #endif /* MBEDTLS_ECP_C */ fldigi-4.1.06/src/mbedtls/net_sockets.c0000664000175000017500000004243313507401434014700 00000000000000/* * TCP/IP or UDP/IP networking functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* Enable definition of getaddrinfo() even when compiling with -std=c99. Must * be set before config.h, which pulls in glibc's features.h indirectly. * Harmless on other platforms. */ #define _POSIX_C_SOURCE 200112L #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_NET_C) #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ !defined(__HAIKU__) #error "This module only works on Unix and Windows, see MBEDTLS_NET_C in config.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #endif #include "mbedtls/net_sockets.h" #include #if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ !defined(EFI32) #define IS_EINTR( ret ) ( ( ret ) == WSAEINTR ) #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0501) #undef _WIN32_WINNT /* Enables getaddrinfo() & Co */ #define _WIN32_WINNT 0x0501 #endif #include #include #include #if defined(_MSC_VER) #if defined(_WIN32_WCE) #pragma comment( lib, "ws2.lib" ) #else #pragma comment( lib, "ws2_32.lib" ) #endif #endif /* _MSC_VER */ #define read(fd,buf,len) recv( fd, (char*)( buf ), (int)( len ), 0 ) #define write(fd,buf,len) send( fd, (char*)( buf ), (int)( len ), 0 ) #define close(fd) closesocket(fd) static int wsa_init_done = 0; #else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ #include #include #include #include #include #include #include #include #include #include #define IS_EINTR( ret ) ( ( ret ) == EINTR ) #endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ /* Some MS functions want int and MSVC warns if we pass size_t, * but the standard functions use socklen_t, so cast only for MSVC */ #if defined(_MSC_VER) #define MSVC_INT_CAST (int) #else #define MSVC_INT_CAST #endif #include #include #include /* * Prepare for using the sockets interface */ static int net_prepare( void ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) WSADATA wsaData; if( wsa_init_done == 0 ) { if( WSAStartup( MAKEWORD(2,0), &wsaData ) != 0 ) return( MBEDTLS_ERR_NET_SOCKET_FAILED ); wsa_init_done = 1; } #else #if !defined(EFIX64) && !defined(EFI32) signal( SIGPIPE, SIG_IGN ); #endif #endif return( 0 ); } /* * Initialize a context */ void mbedtls_net_init( mbedtls_net_context *ctx ) { ctx->fd = -1; } /* * Initiate a TCP connection with host:port and the given protocol */ int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto ) { int ret; struct addrinfo hints, *addr_list, *cur; if( ( ret = net_prepare() ) != 0 ) return( ret ); /* Do name resolution with both IPv6 and IPv4 */ memset( &hints, 0, sizeof( hints ) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM; hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP; if( getaddrinfo( host, port, &hints, &addr_list ) != 0 ) return( MBEDTLS_ERR_NET_UNKNOWN_HOST ); /* Try the sockaddrs until a connection succeeds */ ret = MBEDTLS_ERR_NET_UNKNOWN_HOST; for( cur = addr_list; cur != NULL; cur = cur->ai_next ) { ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype, cur->ai_protocol ); if( ctx->fd < 0 ) { ret = MBEDTLS_ERR_NET_SOCKET_FAILED; continue; } if( connect( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) == 0 ) { ret = 0; break; } close( ctx->fd ); ret = MBEDTLS_ERR_NET_CONNECT_FAILED; } freeaddrinfo( addr_list ); return( ret ); } /* * Create a listening socket on bind_ip:port */ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto ) { int n, ret; struct addrinfo hints, *addr_list, *cur; if( ( ret = net_prepare() ) != 0 ) return( ret ); /* Bind to IPv6 and/or IPv4, but only in the desired protocol */ memset( &hints, 0, sizeof( hints ) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM; hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP; if( bind_ip == NULL ) hints.ai_flags = AI_PASSIVE; if( getaddrinfo( bind_ip, port, &hints, &addr_list ) != 0 ) return( MBEDTLS_ERR_NET_UNKNOWN_HOST ); /* Try the sockaddrs until a binding succeeds */ ret = MBEDTLS_ERR_NET_UNKNOWN_HOST; for( cur = addr_list; cur != NULL; cur = cur->ai_next ) { ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype, cur->ai_protocol ); if( ctx->fd < 0 ) { ret = MBEDTLS_ERR_NET_SOCKET_FAILED; continue; } n = 1; if( setsockopt( ctx->fd, SOL_SOCKET, SO_REUSEADDR, (const char *) &n, sizeof( n ) ) != 0 ) { close( ctx->fd ); ret = MBEDTLS_ERR_NET_SOCKET_FAILED; continue; } if( bind( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) != 0 ) { close( ctx->fd ); ret = MBEDTLS_ERR_NET_BIND_FAILED; continue; } /* Listen only makes sense for TCP */ if( proto == MBEDTLS_NET_PROTO_TCP ) { if( listen( ctx->fd, MBEDTLS_NET_LISTEN_BACKLOG ) != 0 ) { close( ctx->fd ); ret = MBEDTLS_ERR_NET_LISTEN_FAILED; continue; } } /* Bind was successful */ ret = 0; break; } freeaddrinfo( addr_list ); return( ret ); } #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) /* * Check if the requested operation would be blocking on a non-blocking socket * and thus 'failed' with a negative return value. */ static int net_would_block( const mbedtls_net_context *ctx ) { ((void) ctx); return( WSAGetLastError() == WSAEWOULDBLOCK ); } #else /* * Check if the requested operation would be blocking on a non-blocking socket * and thus 'failed' with a negative return value. * * Note: on a blocking socket this function always returns 0! */ static int net_would_block( const mbedtls_net_context *ctx ) { int err = errno; /* * Never return 'WOULD BLOCK' on a non-blocking socket */ if( ( fcntl( ctx->fd, F_GETFL ) & O_NONBLOCK ) != O_NONBLOCK ) { errno = err; return( 0 ); } switch( errno = err ) { #if defined EAGAIN case EAGAIN: #endif #if defined EWOULDBLOCK && EWOULDBLOCK != EAGAIN case EWOULDBLOCK: #endif return( 1 ); } return( 0 ); } #endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ /* * Accept a connection from a remote client */ int mbedtls_net_accept( mbedtls_net_context *bind_ctx, mbedtls_net_context *client_ctx, void *client_ip, size_t buf_size, size_t *ip_len ) { int ret; int type; struct sockaddr_storage client_addr; #if defined(__socklen_t_defined) || defined(_SOCKLEN_T) || \ defined(_SOCKLEN_T_DECLARED) || defined(__DEFINED_socklen_t) socklen_t n = (socklen_t) sizeof( client_addr ); socklen_t type_len = (socklen_t) sizeof( type ); #else int n = (int) sizeof( client_addr ); int type_len = (int) sizeof( type ); #endif /* Is this a TCP or UDP socket? */ if( getsockopt( bind_ctx->fd, SOL_SOCKET, SO_TYPE, (void *) &type, &type_len ) != 0 || ( type != SOCK_STREAM && type != SOCK_DGRAM ) ) { return( MBEDTLS_ERR_NET_ACCEPT_FAILED ); } if( type == SOCK_STREAM ) { /* TCP: actual accept() */ ret = client_ctx->fd = (int) accept( bind_ctx->fd, (struct sockaddr *) &client_addr, &n ); } else { /* UDP: wait for a message, but keep it in the queue */ char buf[1] = { 0 }; ret = (int) recvfrom( bind_ctx->fd, buf, sizeof( buf ), MSG_PEEK, (struct sockaddr *) &client_addr, &n ); #if defined(_WIN32) if( ret == SOCKET_ERROR && WSAGetLastError() == WSAEMSGSIZE ) { /* We know buf is too small, thanks, just peeking here */ ret = 0; } #endif } if( ret < 0 ) { if( net_would_block( bind_ctx ) != 0 ) return( MBEDTLS_ERR_SSL_WANT_READ ); return( MBEDTLS_ERR_NET_ACCEPT_FAILED ); } /* UDP: hijack the listening socket to communicate with the client, * then bind a new socket to accept new connections */ if( type != SOCK_STREAM ) { struct sockaddr_storage local_addr; int one = 1; if( connect( bind_ctx->fd, (struct sockaddr *) &client_addr, n ) != 0 ) return( MBEDTLS_ERR_NET_ACCEPT_FAILED ); client_ctx->fd = bind_ctx->fd; bind_ctx->fd = -1; /* In case we exit early */ n = sizeof( struct sockaddr_storage ); if( getsockname( client_ctx->fd, (struct sockaddr *) &local_addr, &n ) != 0 || ( bind_ctx->fd = (int) socket( local_addr.ss_family, SOCK_DGRAM, IPPROTO_UDP ) ) < 0 || setsockopt( bind_ctx->fd, SOL_SOCKET, SO_REUSEADDR, (const char *) &one, sizeof( one ) ) != 0 ) { return( MBEDTLS_ERR_NET_SOCKET_FAILED ); } if( bind( bind_ctx->fd, (struct sockaddr *) &local_addr, n ) != 0 ) { return( MBEDTLS_ERR_NET_BIND_FAILED ); } } if( client_ip != NULL ) { if( client_addr.ss_family == AF_INET ) { struct sockaddr_in *addr4 = (struct sockaddr_in *) &client_addr; *ip_len = sizeof( addr4->sin_addr.s_addr ); if( buf_size < *ip_len ) return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL ); memcpy( client_ip, &addr4->sin_addr.s_addr, *ip_len ); } else { struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &client_addr; *ip_len = sizeof( addr6->sin6_addr.s6_addr ); if( buf_size < *ip_len ) return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL ); memcpy( client_ip, &addr6->sin6_addr.s6_addr, *ip_len); } } return( 0 ); } /* * Set the socket blocking or non-blocking */ int mbedtls_net_set_block( mbedtls_net_context *ctx ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) u_long n = 0; return( ioctlsocket( ctx->fd, FIONBIO, &n ) ); #else return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) & ~O_NONBLOCK ) ); #endif } int mbedtls_net_set_nonblock( mbedtls_net_context *ctx ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) u_long n = 1; return( ioctlsocket( ctx->fd, FIONBIO, &n ) ); #else return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) | O_NONBLOCK ) ); #endif } /* * Check if data is available on the socket */ int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout ) { int ret; struct timeval tv; fd_set read_fds; fd_set write_fds; int fd = ctx->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); #if defined(__has_feature) #if __has_feature(memory_sanitizer) /* Ensure that memory sanitizers consider read_fds and write_fds as * initialized even on platforms such as Glibc/x86_64 where FD_ZERO * is implemented in assembly. */ memset( &read_fds, 0, sizeof( read_fds ) ); memset( &write_fds, 0, sizeof( write_fds ) ); #endif #endif FD_ZERO( &read_fds ); if( rw & MBEDTLS_NET_POLL_READ ) { rw &= ~MBEDTLS_NET_POLL_READ; FD_SET( fd, &read_fds ); } FD_ZERO( &write_fds ); if( rw & MBEDTLS_NET_POLL_WRITE ) { rw &= ~MBEDTLS_NET_POLL_WRITE; FD_SET( fd, &write_fds ); } if( rw != 0 ) return( MBEDTLS_ERR_NET_BAD_INPUT_DATA ); tv.tv_sec = timeout / 1000; tv.tv_usec = ( timeout % 1000 ) * 1000; do { ret = select( fd + 1, &read_fds, &write_fds, NULL, timeout == (uint32_t) -1 ? NULL : &tv ); } while( IS_EINTR( ret ) ); if( ret < 0 ) return( MBEDTLS_ERR_NET_POLL_FAILED ); ret = 0; if( FD_ISSET( fd, &read_fds ) ) ret |= MBEDTLS_NET_POLL_READ; if( FD_ISSET( fd, &write_fds ) ) ret |= MBEDTLS_NET_POLL_WRITE; return( ret ); } /* * Portable usleep helper */ void mbedtls_net_usleep( unsigned long usec ) { #if defined(_WIN32) Sleep( ( usec + 999 ) / 1000 ); #else struct timeval tv; tv.tv_sec = usec / 1000000; #if defined(__unix__) || defined(__unix) || \ ( defined(__APPLE__) && defined(__MACH__) ) tv.tv_usec = (suseconds_t) usec % 1000000; #else tv.tv_usec = usec % 1000000; #endif select( 0, NULL, NULL, NULL, &tv ); #endif } /* * Read at most 'len' characters */ int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len ) { int ret; int fd = ((mbedtls_net_context *) ctx)->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); ret = (int) read( fd, buf, len ); if( ret < 0 ) { if( net_would_block( ctx ) != 0 ) return( MBEDTLS_ERR_SSL_WANT_READ ); #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) if( WSAGetLastError() == WSAECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); #else if( errno == EPIPE || errno == ECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); if( errno == EINTR ) return( MBEDTLS_ERR_SSL_WANT_READ ); #endif return( MBEDTLS_ERR_NET_RECV_FAILED ); } return( ret ); } /* * Read at most 'len' characters, blocking for at most 'timeout' ms */ int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, uint32_t timeout ) { int ret; struct timeval tv; fd_set read_fds; int fd = ((mbedtls_net_context *) ctx)->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); FD_ZERO( &read_fds ); FD_SET( fd, &read_fds ); tv.tv_sec = timeout / 1000; tv.tv_usec = ( timeout % 1000 ) * 1000; ret = select( fd + 1, &read_fds, NULL, NULL, timeout == 0 ? NULL : &tv ); /* Zero fds ready means we timed out */ if( ret == 0 ) return( MBEDTLS_ERR_SSL_TIMEOUT ); if( ret < 0 ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) if( WSAGetLastError() == WSAEINTR ) return( MBEDTLS_ERR_SSL_WANT_READ ); #else if( errno == EINTR ) return( MBEDTLS_ERR_SSL_WANT_READ ); #endif return( MBEDTLS_ERR_NET_RECV_FAILED ); } /* This call will not block */ return( mbedtls_net_recv( ctx, buf, len ) ); } /* * Write at most 'len' characters */ int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len ) { int ret; int fd = ((mbedtls_net_context *) ctx)->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); ret = (int) write( fd, buf, len ); if( ret < 0 ) { if( net_would_block( ctx ) != 0 ) return( MBEDTLS_ERR_SSL_WANT_WRITE ); #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) if( WSAGetLastError() == WSAECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); #else if( errno == EPIPE || errno == ECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); if( errno == EINTR ) return( MBEDTLS_ERR_SSL_WANT_WRITE ); #endif return( MBEDTLS_ERR_NET_SEND_FAILED ); } return( ret ); } /* * Gracefully close the connection */ void mbedtls_net_free( mbedtls_net_context *ctx ) { if( ctx->fd == -1 ) return; shutdown( ctx->fd, 2 ); close( ctx->fd ); ctx->fd = -1; } #endif /* MBEDTLS_NET_C */ fldigi-4.1.06/src/mbedtls/arc4.c0000664000175000017500000001124713507401434013207 00000000000000/* * An implementation of the ARCFOUR algorithm * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ARCFOUR algorithm was publicly disclosed on 94/09. * * http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_ARC4_ALT) void mbedtls_arc4_init( mbedtls_arc4_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_arc4_context ) ); } void mbedtls_arc4_free( mbedtls_arc4_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_arc4_context ) ); } /* * ARC4 key schedule */ void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key, unsigned int keylen ) { int i, j, a; unsigned int k; unsigned char *m; ctx->x = 0; ctx->y = 0; m = ctx->m; for( i = 0; i < 256; i++ ) m[i] = (unsigned char) i; j = k = 0; for( i = 0; i < 256; i++, k++ ) { if( k >= keylen ) k = 0; a = m[i]; j = ( j + a + key[k] ) & 0xFF; m[i] = m[j]; m[j] = (unsigned char) a; } } /* * ARC4 cipher function */ int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output ) { int x, y, a, b; size_t i; unsigned char *m; x = ctx->x; y = ctx->y; m = ctx->m; for( i = 0; i < length; i++ ) { x = ( x + 1 ) & 0xFF; a = m[x]; y = ( y + a ) & 0xFF; b = m[y]; m[x] = (unsigned char) b; m[y] = (unsigned char) a; output[i] = (unsigned char) ( input[i] ^ m[(unsigned char)( a + b )] ); } ctx->x = x; ctx->y = y; return( 0 ); } #endif /* !MBEDTLS_ARC4_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * ARC4 tests vectors as posted by Eric Rescorla in sep. 1994: * * http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0 */ static const unsigned char arc4_test_key[3][8] = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char arc4_test_pt[3][8] = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char arc4_test_ct[3][8] = { { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 }, { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 }, { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A } }; /* * Checkup routine */ int mbedtls_arc4_self_test( int verbose ) { int i, ret = 0; unsigned char ibuf[8]; unsigned char obuf[8]; mbedtls_arc4_context ctx; mbedtls_arc4_init( &ctx ); for( i = 0; i < 3; i++ ) { if( verbose != 0 ) mbedtls_printf( " ARC4 test #%d: ", i + 1 ); memcpy( ibuf, arc4_test_pt[i], 8 ); mbedtls_arc4_setup( &ctx, arc4_test_key[i], 8 ); mbedtls_arc4_crypt( &ctx, 8, ibuf, obuf ); if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_arc4_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ARC4_C */ fldigi-4.1.06/src/mbedtls/pem.c0000664000175000017500000003442613507401434013143 00000000000000/* * Privacy Enhanced Mail (PEM) decoding * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #include "mbedtls/base64.h" #include "mbedtls/des.h" #include "mbedtls/aes.h" #include "mbedtls/md5.h" #include "mbedtls/cipher.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #if defined(MBEDTLS_PEM_PARSE_C) void mbedtls_pem_init( mbedtls_pem_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_pem_context ) ); } #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) /* * Read a 16-byte hex string and convert it to binary */ static int pem_get_iv( const unsigned char *s, unsigned char *iv, size_t iv_len ) { size_t i, j, k; memset( iv, 0, iv_len ); for( i = 0; i < iv_len * 2; i++, s++ ) { if( *s >= '0' && *s <= '9' ) j = *s - '0'; else if( *s >= 'A' && *s <= 'F' ) j = *s - '7'; else if( *s >= 'a' && *s <= 'f' ) j = *s - 'W'; else return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); k = ( ( i & 1 ) != 0 ) ? j : j << 4; iv[i >> 1] = (unsigned char)( iv[i >> 1] | k ); } return( 0 ); } static int pem_pbkdf1( unsigned char *key, size_t keylen, unsigned char *iv, const unsigned char *pwd, size_t pwdlen ) { mbedtls_md5_context md5_ctx; unsigned char md5sum[16]; size_t use_len; int ret; mbedtls_md5_init( &md5_ctx ); /* * key[ 0..15] = MD5(pwd || IV) */ if( ( ret = mbedtls_md5_starts_ret( &md5_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, iv, 8 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &md5_ctx, md5sum ) ) != 0 ) goto exit; if( keylen <= 16 ) { memcpy( key, md5sum, keylen ); goto exit; } memcpy( key, md5sum, 16 ); /* * key[16..23] = MD5(key[ 0..15] || pwd || IV]) */ if( ( ret = mbedtls_md5_starts_ret( &md5_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, md5sum, 16 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, iv, 8 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &md5_ctx, md5sum ) ) != 0 ) goto exit; use_len = 16; if( keylen < 32 ) use_len = keylen - 16; memcpy( key + 16, md5sum, use_len ); exit: mbedtls_md5_free( &md5_ctx ); mbedtls_platform_zeroize( md5sum, 16 ); return( ret ); } #if defined(MBEDTLS_DES_C) /* * Decrypt with DES-CBC, using PBKDF1 for key derivation */ static int pem_des_decrypt( unsigned char des_iv[8], unsigned char *buf, size_t buflen, const unsigned char *pwd, size_t pwdlen ) { mbedtls_des_context des_ctx; unsigned char des_key[8]; int ret; mbedtls_des_init( &des_ctx ); if( ( ret = pem_pbkdf1( des_key, 8, des_iv, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_des_setkey_dec( &des_ctx, des_key ) ) != 0 ) goto exit; ret = mbedtls_des_crypt_cbc( &des_ctx, MBEDTLS_DES_DECRYPT, buflen, des_iv, buf, buf ); exit: mbedtls_des_free( &des_ctx ); mbedtls_platform_zeroize( des_key, 8 ); return( ret ); } /* * Decrypt with 3DES-CBC, using PBKDF1 for key derivation */ static int pem_des3_decrypt( unsigned char des3_iv[8], unsigned char *buf, size_t buflen, const unsigned char *pwd, size_t pwdlen ) { mbedtls_des3_context des3_ctx; unsigned char des3_key[24]; int ret; mbedtls_des3_init( &des3_ctx ); if( ( ret = pem_pbkdf1( des3_key, 24, des3_iv, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_des3_set3key_dec( &des3_ctx, des3_key ) ) != 0 ) goto exit; ret = mbedtls_des3_crypt_cbc( &des3_ctx, MBEDTLS_DES_DECRYPT, buflen, des3_iv, buf, buf ); exit: mbedtls_des3_free( &des3_ctx ); mbedtls_platform_zeroize( des3_key, 24 ); return( ret ); } #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) /* * Decrypt with AES-XXX-CBC, using PBKDF1 for key derivation */ static int pem_aes_decrypt( unsigned char aes_iv[16], unsigned int keylen, unsigned char *buf, size_t buflen, const unsigned char *pwd, size_t pwdlen ) { mbedtls_aes_context aes_ctx; unsigned char aes_key[32]; int ret; mbedtls_aes_init( &aes_ctx ); if( ( ret = pem_pbkdf1( aes_key, keylen, aes_iv, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_aes_setkey_dec( &aes_ctx, aes_key, keylen * 8 ) ) != 0 ) goto exit; ret = mbedtls_aes_crypt_cbc( &aes_ctx, MBEDTLS_AES_DECRYPT, buflen, aes_iv, buf, buf ); exit: mbedtls_aes_free( &aes_ctx ); mbedtls_platform_zeroize( aes_key, keylen ); return( ret ); } #endif /* MBEDTLS_AES_C */ #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer, const unsigned char *data, const unsigned char *pwd, size_t pwdlen, size_t *use_len ) { int ret, enc; size_t len; unsigned char *buf; const unsigned char *s1, *s2, *end; #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) unsigned char pem_iv[16]; mbedtls_cipher_type_t enc_alg = MBEDTLS_CIPHER_NONE; #else ((void) pwd); ((void) pwdlen); #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ if( ctx == NULL ) return( MBEDTLS_ERR_PEM_BAD_INPUT_DATA ); s1 = (unsigned char *) strstr( (const char *) data, header ); if( s1 == NULL ) return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); s2 = (unsigned char *) strstr( (const char *) data, footer ); if( s2 == NULL || s2 <= s1 ) return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); s1 += strlen( header ); if( *s1 == ' ' ) s1++; if( *s1 == '\r' ) s1++; if( *s1 == '\n' ) s1++; else return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); end = s2; end += strlen( footer ); if( *end == ' ' ) end++; if( *end == '\r' ) end++; if( *end == '\n' ) end++; *use_len = end - data; enc = 0; if( s2 - s1 >= 22 && memcmp( s1, "Proc-Type: 4,ENCRYPTED", 22 ) == 0 ) { #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) enc++; s1 += 22; if( *s1 == '\r' ) s1++; if( *s1 == '\n' ) s1++; else return( MBEDTLS_ERR_PEM_INVALID_DATA ); #if defined(MBEDTLS_DES_C) if( s2 - s1 >= 23 && memcmp( s1, "DEK-Info: DES-EDE3-CBC,", 23 ) == 0 ) { enc_alg = MBEDTLS_CIPHER_DES_EDE3_CBC; s1 += 23; if( s2 - s1 < 16 || pem_get_iv( s1, pem_iv, 8 ) != 0 ) return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); s1 += 16; } else if( s2 - s1 >= 18 && memcmp( s1, "DEK-Info: DES-CBC,", 18 ) == 0 ) { enc_alg = MBEDTLS_CIPHER_DES_CBC; s1 += 18; if( s2 - s1 < 16 || pem_get_iv( s1, pem_iv, 8) != 0 ) return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); s1 += 16; } #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) if( s2 - s1 >= 14 && memcmp( s1, "DEK-Info: AES-", 14 ) == 0 ) { if( s2 - s1 < 22 ) return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG ); else if( memcmp( s1, "DEK-Info: AES-128-CBC,", 22 ) == 0 ) enc_alg = MBEDTLS_CIPHER_AES_128_CBC; else if( memcmp( s1, "DEK-Info: AES-192-CBC,", 22 ) == 0 ) enc_alg = MBEDTLS_CIPHER_AES_192_CBC; else if( memcmp( s1, "DEK-Info: AES-256-CBC,", 22 ) == 0 ) enc_alg = MBEDTLS_CIPHER_AES_256_CBC; else return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG ); s1 += 22; if( s2 - s1 < 32 || pem_get_iv( s1, pem_iv, 16 ) != 0 ) return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); s1 += 32; } #endif /* MBEDTLS_AES_C */ if( enc_alg == MBEDTLS_CIPHER_NONE ) return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG ); if( *s1 == '\r' ) s1++; if( *s1 == '\n' ) s1++; else return( MBEDTLS_ERR_PEM_INVALID_DATA ); #else return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE ); #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ } if( s1 >= s2 ) return( MBEDTLS_ERR_PEM_INVALID_DATA ); ret = mbedtls_base64_decode( NULL, 0, &len, s1, s2 - s1 ); if( ret == MBEDTLS_ERR_BASE64_INVALID_CHARACTER ) return( MBEDTLS_ERR_PEM_INVALID_DATA + ret ); if( ( buf = mbedtls_calloc( 1, len ) ) == NULL ) return( MBEDTLS_ERR_PEM_ALLOC_FAILED ); if( ( ret = mbedtls_base64_decode( buf, len, &len, s1, s2 - s1 ) ) != 0 ) { mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_INVALID_DATA + ret ); } if( enc != 0 ) { #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) if( pwd == NULL ) { mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_PASSWORD_REQUIRED ); } ret = 0; #if defined(MBEDTLS_DES_C) if( enc_alg == MBEDTLS_CIPHER_DES_EDE3_CBC ) ret = pem_des3_decrypt( pem_iv, buf, len, pwd, pwdlen ); else if( enc_alg == MBEDTLS_CIPHER_DES_CBC ) ret = pem_des_decrypt( pem_iv, buf, len, pwd, pwdlen ); #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) if( enc_alg == MBEDTLS_CIPHER_AES_128_CBC ) ret = pem_aes_decrypt( pem_iv, 16, buf, len, pwd, pwdlen ); else if( enc_alg == MBEDTLS_CIPHER_AES_192_CBC ) ret = pem_aes_decrypt( pem_iv, 24, buf, len, pwd, pwdlen ); else if( enc_alg == MBEDTLS_CIPHER_AES_256_CBC ) ret = pem_aes_decrypt( pem_iv, 32, buf, len, pwd, pwdlen ); #endif /* MBEDTLS_AES_C */ if( ret != 0 ) { mbedtls_free( buf ); return( ret ); } /* * The result will be ASN.1 starting with a SEQUENCE tag, with 1 to 3 * length bytes (allow 4 to be sure) in all known use cases. * * Use that as a heuristic to try to detect password mismatches. */ if( len <= 2 || buf[0] != 0x30 || buf[1] > 0x83 ) { mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_PASSWORD_MISMATCH ); } #else mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE ); #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ } ctx->buf = buf; ctx->buflen = len; return( 0 ); } void mbedtls_pem_free( mbedtls_pem_context *ctx ) { if ( ctx->buf != NULL ) { mbedtls_platform_zeroize( ctx->buf, ctx->buflen ); mbedtls_free( ctx->buf ); } mbedtls_free( ctx->info ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_pem_context ) ); } #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_PEM_WRITE_C) int mbedtls_pem_write_buffer( const char *header, const char *footer, const unsigned char *der_data, size_t der_len, unsigned char *buf, size_t buf_len, size_t *olen ) { int ret; unsigned char *encode_buf = NULL, *c, *p = buf; size_t len = 0, use_len, add_len = 0; mbedtls_base64_encode( NULL, 0, &use_len, der_data, der_len ); add_len = strlen( header ) + strlen( footer ) + ( use_len / 64 ) + 1; if( use_len + add_len > buf_len ) { *olen = use_len + add_len; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } if( use_len != 0 && ( ( encode_buf = mbedtls_calloc( 1, use_len ) ) == NULL ) ) return( MBEDTLS_ERR_PEM_ALLOC_FAILED ); if( ( ret = mbedtls_base64_encode( encode_buf, use_len, &use_len, der_data, der_len ) ) != 0 ) { mbedtls_free( encode_buf ); return( ret ); } memcpy( p, header, strlen( header ) ); p += strlen( header ); c = encode_buf; while( use_len ) { len = ( use_len > 64 ) ? 64 : use_len; memcpy( p, c, len ); use_len -= len; p += len; c += len; *p++ = '\n'; } memcpy( p, footer, strlen( footer ) ); p += strlen( footer ); *p++ = '\0'; *olen = p - buf; mbedtls_free( encode_buf ); return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */ fldigi-4.1.06/src/mbedtls/x509_create.c0000664000175000017500000003127313507401434014407 00000000000000/* * X.509 base functions for creating certificates / CSRs * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CREATE_C) #include "mbedtls/x509.h" #include "mbedtls/asn1write.h" #include "mbedtls/oid.h" #include /* Structure linking OIDs for X.509 DN AttributeTypes to their * string representations and default string encodings used by Mbed TLS. */ typedef struct { const char *name; /* String representation of AttributeType, e.g. * "CN" or "emailAddress". */ size_t name_len; /* Length of 'name', without trailing 0 byte. */ const char *oid; /* String representation of OID of AttributeType, * as per RFC 5280, Appendix A.1. */ int default_tag; /* The default character encoding used for the * given attribute type, e.g. * MBEDTLS_ASN1_UTF8_STRING for UTF-8. */ } x509_attr_descriptor_t; #define ADD_STRLEN( s ) s, sizeof( s ) - 1 /* X.509 DN attributes from RFC 5280, Appendix A.1. */ static const x509_attr_descriptor_t x509_attrs[] = { { ADD_STRLEN( "CN" ), MBEDTLS_OID_AT_CN, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "commonName" ), MBEDTLS_OID_AT_CN, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "C" ), MBEDTLS_OID_AT_COUNTRY, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "countryName" ), MBEDTLS_OID_AT_COUNTRY, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "O" ), MBEDTLS_OID_AT_ORGANIZATION, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "organizationName" ), MBEDTLS_OID_AT_ORGANIZATION, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "L" ), MBEDTLS_OID_AT_LOCALITY, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "locality" ), MBEDTLS_OID_AT_LOCALITY, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "R" ), MBEDTLS_OID_PKCS9_EMAIL, MBEDTLS_ASN1_IA5_STRING }, { ADD_STRLEN( "OU" ), MBEDTLS_OID_AT_ORG_UNIT, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "organizationalUnitName" ), MBEDTLS_OID_AT_ORG_UNIT, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "ST" ), MBEDTLS_OID_AT_STATE, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "stateOrProvinceName" ), MBEDTLS_OID_AT_STATE, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "emailAddress" ), MBEDTLS_OID_PKCS9_EMAIL, MBEDTLS_ASN1_IA5_STRING }, { ADD_STRLEN( "serialNumber" ), MBEDTLS_OID_AT_SERIAL_NUMBER, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "postalAddress" ), MBEDTLS_OID_AT_POSTAL_ADDRESS, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "postalCode" ), MBEDTLS_OID_AT_POSTAL_CODE, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "dnQualifier" ), MBEDTLS_OID_AT_DN_QUALIFIER, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "title" ), MBEDTLS_OID_AT_TITLE, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "surName" ), MBEDTLS_OID_AT_SUR_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "SN" ), MBEDTLS_OID_AT_SUR_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "givenName" ), MBEDTLS_OID_AT_GIVEN_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "GN" ), MBEDTLS_OID_AT_GIVEN_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "initials" ), MBEDTLS_OID_AT_INITIALS, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "pseudonym" ), MBEDTLS_OID_AT_PSEUDONYM, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "generationQualifier" ), MBEDTLS_OID_AT_GENERATION_QUALIFIER, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "domainComponent" ), MBEDTLS_OID_DOMAIN_COMPONENT, MBEDTLS_ASN1_IA5_STRING }, { ADD_STRLEN( "DC" ), MBEDTLS_OID_DOMAIN_COMPONENT, MBEDTLS_ASN1_IA5_STRING }, { NULL, 0, NULL, MBEDTLS_ASN1_NULL } }; static const x509_attr_descriptor_t *x509_attr_descr_from_name( const char *name, size_t name_len ) { const x509_attr_descriptor_t *cur; for( cur = x509_attrs; cur->name != NULL; cur++ ) if( cur->name_len == name_len && strncmp( cur->name, name, name_len ) == 0 ) break; if ( cur->name == NULL ) return( NULL ); return( cur ); } int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name ) { int ret = 0; const char *s = name, *c = s; const char *end = s + strlen( s ); const char *oid = NULL; const x509_attr_descriptor_t* attr_descr = NULL; int in_tag = 1; char data[MBEDTLS_X509_MAX_DN_NAME_SIZE]; char *d = data; /* Clear existing chain if present */ mbedtls_asn1_free_named_data_list( head ); while( c <= end ) { if( in_tag && *c == '=' ) { if( ( attr_descr = x509_attr_descr_from_name( s, c - s ) ) == NULL ) { ret = MBEDTLS_ERR_X509_UNKNOWN_OID; goto exit; } oid = attr_descr->oid; s = c + 1; in_tag = 0; d = data; } if( !in_tag && *c == '\\' && c != end ) { c++; /* Check for valid escaped characters */ if( c == end || *c != ',' ) { ret = MBEDTLS_ERR_X509_INVALID_NAME; goto exit; } } else if( !in_tag && ( *c == ',' || c == end ) ) { mbedtls_asn1_named_data* cur = mbedtls_asn1_store_named_data( head, oid, strlen( oid ), (unsigned char *) data, d - data ); if(cur == NULL ) { return( MBEDTLS_ERR_X509_ALLOC_FAILED ); } // set tagType cur->val.tag = attr_descr->default_tag; while( c < end && *(c + 1) == ' ' ) c++; s = c + 1; in_tag = 1; } if( !in_tag && s != c + 1 ) { *(d++) = *c; if( d - data == MBEDTLS_X509_MAX_DN_NAME_SIZE ) { ret = MBEDTLS_ERR_X509_INVALID_NAME; goto exit; } } c++; } exit: return( ret ); } /* The first byte of the value in the mbedtls_asn1_named_data structure is reserved * to store the critical boolean for us */ int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ) { mbedtls_asn1_named_data *cur; if( ( cur = mbedtls_asn1_store_named_data( head, oid, oid_len, NULL, val_len + 1 ) ) == NULL ) { return( MBEDTLS_ERR_X509_ALLOC_FAILED ); } cur->val.p[0] = critical; memcpy( cur->val.p + 1, val, val_len ); return( 0 ); } /* * RelativeDistinguishedName ::= * SET OF AttributeTypeAndValue * * AttributeTypeAndValue ::= SEQUENCE { * type AttributeType, * value AttributeValue } * * AttributeType ::= OBJECT IDENTIFIER * * AttributeValue ::= ANY DEFINED BY AttributeType */ static int x509_write_name( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data* cur_name) { int ret; size_t len = 0; const char *oid = (const char*)cur_name->oid.p; size_t oid_len = cur_name->oid.len; const unsigned char *name = cur_name->val.p; size_t name_len = cur_name->val.len; // Write correct string tag and value MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tagged_string( p, start, cur_name->val.tag, (const char *) name, name_len ) ); // Write OID // MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ); return( (int) len ); } int mbedtls_x509_write_names( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ) { int ret; size_t len = 0; mbedtls_asn1_named_data *cur = first; while( cur != NULL ) { MBEDTLS_ASN1_CHK_ADD( len, x509_write_name( p, start, cur ) ); cur = cur->next; } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, unsigned char *sig, size_t size ) { int ret; size_t len = 0; if( *p < start || (size_t)( *p - start ) < size ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len = size; (*p) -= len; memcpy( *p, sig, len ); if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = 0; len += 1; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) ); // Write OID // MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( p, start, oid, oid_len, 0 ) ); return( (int) len ); } static int x509_write_extension( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *ext ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->val.p + 1, ext->val.len - 1 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->val.len - 1 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) ); if( ext->val.p[0] != 0 ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( p, start, 1 ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->oid.p, ext->oid.len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->oid.len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } /* * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING * -- contains the DER encoding of an ASN.1 value * -- corresponding to the extension type identified * -- by extnID * } */ int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ) { int ret; size_t len = 0; mbedtls_asn1_named_data *cur_ext = first; while( cur_ext != NULL ) { MBEDTLS_ASN1_CHK_ADD( len, x509_write_extension( p, start, cur_ext ) ); cur_ext = cur_ext->next; } return( (int) len ); } #endif /* MBEDTLS_X509_CREATE_C */ fldigi-4.1.06/src/mbedtls/ssl_cli.c0000664000175000017500000036216213507401434014013 00000000000000/* * SSLv3/TLSv1 client-side functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_CLI_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" #include #include #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) #include "mbedtls/platform_util.h" #endif #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t hostname_len; *olen = 0; if( ssl->hostname == NULL ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s", ssl->hostname ) ); hostname_len = strlen( ssl->hostname ); if( end < p || (size_t)( end - p ) < hostname_len + 9 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } /* * Sect. 3, RFC 6066 (TLS Extensions Definitions) * * In order to provide any of the server names, clients MAY include an * extension of type "server_name" in the (extended) client hello. The * "extension_data" field of this extension SHALL contain * "ServerNameList" where: * * struct { * NameType name_type; * select (name_type) { * case host_name: HostName; * } name; * } ServerName; * * enum { * host_name(0), (255) * } NameType; * * opaque HostName<1..2^16-1>; * * struct { * ServerName server_name_list<1..2^16-1> * } ServerNameList; * */ *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF ); *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( hostname_len ) & 0xFF ); memcpy( p, ssl->hostname, hostname_len ); *olen = hostname_len + 9; } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL_RENEGOTIATION) static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the * initial ClientHello, in which case also adding the renegotiation * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */ if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) ); if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } /* * Secure renegotiation */ *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF ); *p++ = 0x00; *p++ = ( ssl->verify_data_len + 1 ) & 0xFF; *p++ = ssl->verify_data_len & 0xFF; memcpy( p, ssl->own_verify_data, ssl->verify_data_len ); *olen = 5 + ssl->verify_data_len; } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* * Only if we handle at least one key exchange that needs signatures. */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) static void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t sig_alg_len = 0; const int *md; #if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) unsigned char *sig_alg_list = buf + 6; #endif *olen = 0; if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) ); for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ ) { #if defined(MBEDTLS_ECDSA_C) sig_alg_len += 2; #endif #if defined(MBEDTLS_RSA_C) sig_alg_len += 2; #endif } if( end < p || (size_t)( end - p ) < sig_alg_len + 6 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } /* * Prepare signature_algorithms extension (TLS 1.2) */ sig_alg_len = 0; for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ ) { #if defined(MBEDTLS_ECDSA_C) sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md ); sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA; #endif #if defined(MBEDTLS_RSA_C) sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md ); sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA; #endif } /* * enum { * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), * sha512(6), (255) * } HashAlgorithm; * * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) } * SignatureAlgorithm; * * struct { * HashAlgorithm hash; * SignatureAlgorithm signature; * } SignatureAndHashAlgorithm; * * SignatureAndHashAlgorithm * supported_signature_algorithms<2..2^16-2>; */ *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF ); *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF ); *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF ); *olen = 6 + sig_alg_len; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; unsigned char *elliptic_curve_list = p + 6; size_t elliptic_curve_len = 0; const mbedtls_ecp_curve_info *info; #if defined(MBEDTLS_ECP_C) const mbedtls_ecp_group_id *grp_id; #else ((void) ssl); #endif *olen = 0; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) ); #if defined(MBEDTLS_ECP_C) for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ ) #else for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ ) #endif { #if defined(MBEDTLS_ECP_C) info = mbedtls_ecp_curve_info_from_grp_id( *grp_id ); #endif if( info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid curve in ssl configuration" ) ); return; } elliptic_curve_len += 2; } if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } elliptic_curve_len = 0; #if defined(MBEDTLS_ECP_C) for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ ) #else for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ ) #endif { #if defined(MBEDTLS_ECP_C) info = mbedtls_ecp_curve_info_from_grp_id( *grp_id ); #endif elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8; elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF; } if( elliptic_curve_len == 0 ) return; *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF ); *olen = 6 + elliptic_curve_len; } static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) ); if( end < p || (size_t)( end - p ) < 6 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF ); *p++ = 0x00; *p++ = 2; *p++ = 1; *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED; *olen = 6; } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { int ret; unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t kkpp_len; *olen = 0; /* Skip costly extension if we can't use EC J-PAKE anyway */ if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) ); if( end - p < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF ); /* * We may need to send ClientHello multiple times for Hello verification. * We don't want to compute fresh values every time (both for performance * and consistency reasons), so cache the extension content. */ if( ssl->handshake->ecjpake_cache == NULL || ssl->handshake->ecjpake_cache_len == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) ); ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx, p + 2, end - p - 2, &kkpp_len, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret ); return; } ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len ); if( ssl->handshake->ecjpake_cache == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) ); return; } memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len ); ssl->handshake->ecjpake_cache_len = kkpp_len; } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) ); kkpp_len = ssl->handshake->ecjpake_cache_len; if( (size_t)( end - p - 2 ) < kkpp_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len ); } *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( kkpp_len ) & 0xFF ); *olen = kkpp_len + 4; } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) ); if( end < p || (size_t)( end - p ) < 5 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF ); *p++ = 0x00; *p++ = 1; *p++ = ssl->conf->mfl_code; *olen = 5; } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) ); if( end < p || (size_t)( end - p ) < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac " "extension" ) ); if( end < p || (size_t)( end - p ) < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret " "extension" ) ); if( end < p || (size_t)( end - p ) < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t tlen = ssl->session_negotiate->ticket_len; *olen = 0; if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) ); if( end < p || (size_t)( end - p ) < 4 + tlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF ); *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( tlen ) & 0xFF ); *olen = 4; if( ssl->session_negotiate->ticket == NULL || tlen == 0 ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) ); memcpy( p, ssl->session_negotiate->ticket, tlen ); *olen += tlen; } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_ALPN) static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t alpnlen = 0; const char **cur; *olen = 0; if( ssl->conf->alpn_list == NULL ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) ); for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ ) alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1; if( end < p || (size_t)( end - p ) < 6 + alpnlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF ); /* * opaque ProtocolName<1..2^8-1>; * * struct { * ProtocolName protocol_name_list<2..2^16-1> * } ProtocolNameList; */ /* Skip writing extension and list length for now */ p += 4; for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ ) { *p = (unsigned char)( strlen( *cur ) & 0xFF ); memcpy( p + 1, *cur, *p ); p += 1 + *p; } *olen = p - buf; /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */ buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF ); buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF ); /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */ buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF ); buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF ); } #endif /* MBEDTLS_SSL_ALPN */ /* * Generate random bytes for ClientHello */ static int ssl_generate_random( mbedtls_ssl_context *ssl ) { int ret; unsigned char *p = ssl->handshake->randbytes; #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t; #endif /* * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->verify_cookie != NULL ) { return( 0 ); } #endif #if defined(MBEDTLS_HAVE_TIME) t = mbedtls_time( NULL ); *p++ = (unsigned char)( t >> 24 ); *p++ = (unsigned char)( t >> 16 ); *p++ = (unsigned char)( t >> 8 ); *p++ = (unsigned char)( t ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) ); #else if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 ) return( ret ); p += 4; #endif /* MBEDTLS_HAVE_TIME */ if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 ) return( ret ); return( 0 ); } /** * \brief Validate cipher suite against config in SSL context. * * \param suite_info cipher suite to validate * \param ssl SSL context * \param min_minor_ver Minimal minor version to accept a cipher suite * \param max_minor_ver Maximal minor version to accept a cipher suite * * \return 0 if valid, else 1 */ static int ssl_validate_ciphersuite( const mbedtls_ssl_ciphersuite_t * suite_info, const mbedtls_ssl_context * ssl, int min_minor_ver, int max_minor_ver ) { (void) ssl; if( suite_info == NULL ) return( 1 ); if( suite_info->min_minor_ver > max_minor_ver || suite_info->max_minor_ver < min_minor_ver ) return( 1 ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) ) return( 1 ); #endif #if defined(MBEDTLS_ARC4_C) if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED && suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 ) return( 1 ); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE && mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 ) return( 1 ); #endif return( 0 ); } static int ssl_write_client_hello( mbedtls_ssl_context *ssl ) { int ret; size_t i, n, olen, ext_len = 0; unsigned char *buf; unsigned char *p, *q; unsigned char offer_compress; const int *ciphersuites; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) int uses_ec = 0; #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) ); if( ssl->conf->f_rng == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") ); return( MBEDTLS_ERR_SSL_NO_RNG ); } #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { ssl->major_ver = ssl->conf->min_major_ver; ssl->minor_ver = ssl->conf->min_minor_ver; } if( ssl->conf->max_major_ver == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, " "consider using mbedtls_ssl_config_defaults()" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 5 highest version supported * 6 . 9 current UNIX time * 10 . 37 random bytes */ buf = ssl->out_msg; p = buf + 4; mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver, ssl->conf->transport, p ); p += 2; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]", buf[4], buf[5] ) ); if( ( ret = ssl_generate_random( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret ); return( ret ); } memcpy( p, ssl->handshake->randbytes, 32 ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 ); p += 32; /* * 38 . 38 session id length * 39 . 39+n session id * 39+n . 39+n DTLS only: cookie length (1 byte) * 40+n . .. DTSL only: cookie * .. . .. ciphersuitelist length (2 bytes) * .. . .. ciphersuitelist * .. . .. compression methods length (1 byte) * .. . .. compression methods * .. . .. extensions length (2 bytes) * .. . .. extensions */ n = ssl->session_negotiate->id_len; if( n < 16 || n > 32 || #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE || #endif ssl->handshake->resume == 0 ) { n = 0; } #if defined(MBEDTLS_SSL_SESSION_TICKETS) /* * RFC 5077 section 3.4: "When presenting a ticket, the client MAY * generate and include a Session ID in the TLS ClientHello." */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { if( ssl->session_negotiate->ticket != NULL && ssl->session_negotiate->ticket_len != 0 ) { ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 32 ); if( ret != 0 ) return( ret ); ssl->session_negotiate->id_len = n = 32; } } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ *p++ = (unsigned char) n; for( i = 0; i < n; i++ ) *p++ = ssl->session_negotiate->id[i]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n ); /* * DTLS cookie */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( ssl->handshake->verify_cookie == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) ); *p++ = 0; } else { MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie", ssl->handshake->verify_cookie, ssl->handshake->verify_cookie_len ); *p++ = ssl->handshake->verify_cookie_len; memcpy( p, ssl->handshake->verify_cookie, ssl->handshake->verify_cookie_len ); p += ssl->handshake->verify_cookie_len; } } #endif /* * Ciphersuite list */ ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; /* Skip writing ciphersuite length for now */ n = 0; q = p; p += 2; for( i = 0; ciphersuites[i] != 0; i++ ) { ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] ); if( ssl_validate_ciphersuite( ciphersuite_info, ssl, ssl->conf->min_minor_ver, ssl->conf->max_minor_ver ) != 0 ) continue; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x", ciphersuites[i] ) ); #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info ); #endif n++; *p++ = (unsigned char)( ciphersuites[i] >> 8 ); *p++ = (unsigned char)( ciphersuites[i] ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites (excluding SCSVs)", n ) ); /* * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) ); *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 ); *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ); n++; } /* Some versions of OpenSSL don't handle it correctly if not at end */ #if defined(MBEDTLS_SSL_FALLBACK_SCSV) if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) ); *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ); *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ); n++; } #endif *q++ = (unsigned char)( n >> 7 ); *q++ = (unsigned char)( n << 1 ); #if defined(MBEDTLS_ZLIB_SUPPORT) offer_compress = 1; #else offer_compress = 0; #endif /* * We don't support compression with DTLS right now: if many records come * in the same datagram, uncompressing one could overwrite the next one. * We don't want to add complexity for handling that case unless there is * an actual need for it. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) offer_compress = 0; #endif if( offer_compress ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d", MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) ); *p++ = 2; *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE; *p++ = MBEDTLS_SSL_COMPRESS_NULL; } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", MBEDTLS_SSL_COMPRESS_NULL ) ); *p++ = 1; *p++ = MBEDTLS_SSL_COMPRESS_NULL; } // First write extensions, then the total length // #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */ #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( uses_ec ) { ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; } #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ALPN) ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif /* olen unused if all extensions are disabled */ ((void) olen); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d", ext_len ) ); if( ext_len > 0 ) { *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ext_len ) & 0xFF ); p += ext_len; } ssl->out_msglen = p - buf; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO; ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_send_flight_completed( ssl ); #endif if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) ); return( 0 ); } static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { /* Check verify-data in constant-time. The length OTOH is no secret */ if( len != 1 + ssl->verify_data_len * 2 || buf[0] != ssl->verify_data_len * 2 || mbedtls_ssl_safer_memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 || mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len, ssl->peer_verify_data, ssl->verify_data_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { if( len != 1 || buf[0] != 0x00 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; } return( 0 ); } #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { /* * server should use the extension only if we did, * and if so the server's value should match ours (and len is always 1) */ if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE || len != 1 || buf[0] != ssl->conf->mfl_code ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching max fragment length extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } return( 0 ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching truncated HMAC extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching encrypt-then-MAC extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching extended master secret extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching session ticket extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->handshake->new_session_ticket = 1; return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_size; const unsigned char *p; if( len == 0 || (size_t)( buf[0] + 1 ) != len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } list_size = buf[0]; p = buf + 1; while( list_size > 0 ) { if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED || p[0] == MBEDTLS_ECP_PF_COMPRESSED ) { #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) ssl->handshake->ecdh_ctx.point_format = p[0]; #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl->handshake->ecjpake_ctx.point_format = p[0]; #endif MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) ); return( 0 ); } list_size--; p++; } MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; if( ssl->transform_negotiate->ciphersuite_info->key_exchange != MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) ); return( 0 ); } /* If we got here, we no longer need our cached extension */ mbedtls_free( ssl->handshake->ecjpake_cache ); ssl->handshake->ecjpake_cache = NULL; ssl->handshake->ecjpake_cache_len = 0; if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx, buf, len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN) static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_len, name_len; const char **p; /* If we didn't send it, the server shouldn't send it */ if( ssl->conf->alpn_list == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* * opaque ProtocolName<1..2^8-1>; * * struct { * ProtocolName protocol_name_list<2..2^16-1> * } ProtocolNameList; * * the "ProtocolNameList" MUST contain exactly one "ProtocolName" */ /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ if( len < 4 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } list_len = ( buf[0] << 8 ) | buf[1]; if( list_len != len - 2 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } name_len = buf[2]; if( name_len != list_len - 1 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* Check that the server chosen protocol was in our list and save it */ for( p = ssl->conf->alpn_list; *p != NULL; p++ ) { if( name_len == strlen( *p ) && memcmp( buf + 3, *p, name_len ) == 0 ) { ssl->alpn_chosen = *p; return( 0 ); } } MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } #endif /* MBEDTLS_SSL_ALPN */ /* * Parse HelloVerifyRequest. Only called after verifying the HS type. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl ) { const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); int major_ver, minor_ver; unsigned char cookie_len; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) ); /* * struct { * ProtocolVersion server_version; * opaque cookie<0..2^8-1>; * } HelloVerifyRequest; */ MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 ); mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p ); p += 2; /* * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1) * even is lower than our min version. */ if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 || minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 || major_ver > ssl->conf->max_major_ver || minor_ver > ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } cookie_len = *p++; MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len ); if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "cookie length does not match incoming message size" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } mbedtls_free( ssl->handshake->verify_cookie ); ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len ); if( ssl->handshake->verify_cookie == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } memcpy( ssl->handshake->verify_cookie, p, cookie_len ); ssl->handshake->verify_cookie_len = cookie_len; /* Start over at ClientHello */ ssl->state = MBEDTLS_SSL_CLIENT_HELLO; mbedtls_ssl_reset_checksum( ssl ); mbedtls_ssl_recv_flight_completed( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) { int ret, i; size_t n; size_t ext_len; unsigned char *buf, *ext; unsigned char comp; #if defined(MBEDTLS_ZLIB_SUPPORT) int accept_comp; #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) int renegotiation_info_seen = 0; #endif int handshake_failure = 0; const mbedtls_ssl_ciphersuite_t *suite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) ); buf = ssl->in_msg; if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { /* No alert on a read error. */ MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { ssl->renego_records_seen++; if( ssl->conf->renego_max_records >= 0 && ssl->renego_records_seen > ssl->conf->renego_max_records ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, " "but not honored by server" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) ); ssl->keep_current_message = 1; return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) ); return( ssl_parse_hello_verify_request( ssl ) ); } else { /* We made it through the verification process */ mbedtls_free( ssl->handshake->verify_cookie ); ssl->handshake->verify_cookie = NULL; ssl->handshake->verify_cookie_len = 0; } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) || buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* * 0 . 1 server_version * 2 . 33 random (maybe including 4 bytes of Unix time) * 34 . 34 session_id length = n * 35 . 34+n session_id * 35+n . 36+n cipher_suite * 37+n . 37+n compression_method * * 38+n . 39+n extensions length (optional) * 40+n . .. extensions */ buf += mbedtls_ssl_hs_hdr_len( ssl ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 ); mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver, ssl->conf->transport, buf + 0 ); if( ssl->major_ver < ssl->conf->min_major_ver || ssl->minor_ver < ssl->conf->min_minor_ver || ssl->major_ver > ssl->conf->max_major_ver || ssl->minor_ver > ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - " " min: [%d:%d], server: [%d:%d], max: [%d:%d]", ssl->conf->min_major_ver, ssl->conf->min_minor_ver, ssl->major_ver, ssl->minor_ver, ssl->conf->max_major_ver, ssl->conf->max_minor_ver ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", ( (uint32_t) buf[2] << 24 ) | ( (uint32_t) buf[3] << 16 ) | ( (uint32_t) buf[4] << 8 ) | ( (uint32_t) buf[5] ) ) ); memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 ); n = buf[34]; MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 ); if( n > 32 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n ) { ext_len = ( ( buf[38 + n] << 8 ) | ( buf[39 + n] ) ); if( ( ext_len > 0 && ext_len < 4 ) || ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } } else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n ) { ext_len = 0; } else { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* ciphersuite (used later) */ i = ( buf[35 + n] << 8 ) | buf[36 + n]; /* * Read and check compression */ comp = buf[37 + n]; #if defined(MBEDTLS_ZLIB_SUPPORT) /* See comments in ssl_write_client_hello() */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) accept_comp = 0; else #endif accept_comp = 1; if( comp != MBEDTLS_SSL_COMPRESS_NULL && ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) ) #else /* MBEDTLS_ZLIB_SUPPORT */ if( comp != MBEDTLS_SSL_COMPRESS_NULL ) #endif/* MBEDTLS_ZLIB_SUPPORT */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } /* * Initialize update checksum functions */ ssl->transform_negotiate->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i ); if( ssl->transform_negotiate->ciphersuite_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n ); /* * Check if the session can be resumed */ if( ssl->handshake->resume == 0 || n == 0 || #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE || #endif ssl->session_negotiate->ciphersuite != i || ssl->session_negotiate->compression != comp || ssl->session_negotiate->id_len != n || memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 ) { ssl->state++; ssl->handshake->resume = 0; #if defined(MBEDTLS_HAVE_TIME) ssl->session_negotiate->start = mbedtls_time( NULL ); #endif ssl->session_negotiate->ciphersuite = i; ssl->session_negotiate->compression = comp; ssl->session_negotiate->id_len = n; memcpy( ssl->session_negotiate->id, buf + 35, n ); } else { ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( ret ); } } MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed", ssl->handshake->resume ? "a" : "no" ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) ); /* * Perform cipher suite validation in same way as in ssl_write_client_hello. */ i = 0; while( 1 ) { if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] == ssl->session_negotiate->ciphersuite ) { break; } } suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite ); if( ssl_validate_ciphersuite( suite_info, ssl, ssl->minor_ver, ssl->minor_ver ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", suite_info->name ) ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA && ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { ssl->handshake->ecrs_enabled = 1; } #endif if( comp != MBEDTLS_SSL_COMPRESS_NULL #if defined(MBEDTLS_ZLIB_SUPPORT) && comp != MBEDTLS_SSL_COMPRESS_DEFLATE #endif ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ssl->session_negotiate->compression = comp; ext = buf + 40 + n; MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) ); while( ext_len ) { unsigned int ext_id = ( ( ext[0] << 8 ) | ( ext[1] ) ); unsigned int ext_size = ( ( ext[2] << 8 ) | ( ext[3] ) ); if( ext_size + 4 > ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } switch( ext_id ) { case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) renegotiation_info_seen = 1; #endif if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 ) return( ret ); break; #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) ); if( ( ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) case MBEDTLS_TLS_EXT_TRUNCATED_HMAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) ); if( ( ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) ); if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) ); if( ( ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) case MBEDTLS_TLS_EXT_SESSION_TICKET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) ); if( ( ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) ); if( ( ret = ssl_parse_supported_point_formats_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_ECJPAKE_KKPP: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) ); if( ( ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN) case MBEDTLS_TLS_EXT_ALPN: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) ); if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_ALPN */ default: MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", ext_id ) ); } ext_len -= 4 + ext_size; ext += 4 + ext_size; if( ext_len > 0 && ext_len < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } } /* * Renegotiation security checks */ if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); handshake_failure = 1; } #if defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION && renegotiation_info_seen == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && renegotiation_info_seen == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) ); handshake_failure = 1; } #endif /* MBEDTLS_SSL_RENEGOTIATION */ if( handshake_failure == 1 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) ); return( 0 ); } #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; /* * Ephemeral DH parameters: * * struct { * opaque dh_p<1..2^16-1>; * opaque dh_g<1..2^16-1>; * opaque dh_Ys<1..2^16-1>; * } ServerDHParams; */ if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret ); return( ret ); } if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d", ssl->handshake->dhm_ctx.len * 8, ssl->conf->dhm_min_bitlen ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY ); return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl ) { const mbedtls_ecp_curve_info *curve_info; mbedtls_ecp_group_id grp_id; #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) grp_id = ssl->handshake->ecdh_ctx.grp.id; #else grp_id = ssl->handshake->ecdh_ctx.grp_id; #endif curve_info = mbedtls_ecp_curve_info_from_grp_id( grp_id ); if( curve_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) ); #if defined(MBEDTLS_ECP_C) if( mbedtls_ssl_check_curve( ssl, grp_id ) != 0 ) #else if( ssl->handshake->ecdh_ctx.grp.nbits < 163 || ssl->handshake->ecdh_ctx.grp.nbits > 521 ) #endif return( -1 ); MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_QP ); return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; /* * Ephemeral ECDH parameters: * * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx, (const unsigned char **) p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } if( ssl_check_server_ecdh_params( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t len; ((void) ssl); /* * PSK parameters: * * opaque psk_identity_hint<0..2^16-1>; */ if( end - (*p) < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message " "(psk_identity_hint length)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } len = (*p)[0] << 8 | (*p)[1]; *p += 2; if( end - (*p) < (int) len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message " "(psk_identity_hint length)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } /* * Note: we currently ignore the PKS identity hint, as we only allow one * PSK to be provisionned on the client. This could be changed later if * someone needs that feature. */ *p += len; ret = 0; return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) /* * Generate a pre-master secret and encrypt it with the server's RSA key */ static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl, size_t offset, size_t *olen, size_t pms_offset ) { int ret; size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2; unsigned char *p = ssl->handshake->premaster + pms_offset; if( offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) ); return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); } /* * Generate (part of) the pre-master as * struct { * ProtocolVersion client_version; * opaque random[46]; * } PreMasterSecret; */ mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver, ssl->conf->transport, p ); if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret ); return( ret ); } ssl->handshake->pmslen = 48; if( ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * Now write it out, encrypted */ if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, MBEDTLS_PK_RSA ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk, p, ssl->handshake->pmslen, ssl->out_msg + offset + len_bytes, olen, MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( len_bytes == 2 ) { ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 ); ssl->out_msg[offset+1] = (unsigned char)( *olen ); *olen += 2; } #endif return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg ) { ((void) ssl); *md_alg = MBEDTLS_MD_NONE; *pk_alg = MBEDTLS_PK_NONE; /* Only in TLS 1.2 */ if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) { return( 0 ); } if( (*p) + 2 > end ) return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); /* * Get hash algorithm */ if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported " "HashAlgorithm %d", *(p)[0] ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } /* * Get signature algorithm */ if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported " "SignatureAlgorithm %d", (*p)[1] ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } /* * Check if the hash is acceptable */ if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm %d that was not offered", *(p)[0] ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) ); *p += 2; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ecp_keypair *peer_key; if( ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, MBEDTLS_PK_ECKEY ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk ); if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key, MBEDTLS_ECDH_THEIRS ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret ); return( ret ); } if( ssl_check_server_ecdh_params( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; unsigned char *p = NULL, *end = NULL; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) ); #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) ); ssl->state++; return( 0 ); } ((void) p); ((void) end); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ) { if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) ); ssl->state++; return( 0 ); } ((void) p); ((void) end); #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled && ssl->handshake->ecrs_state == ssl_ecrs_ske_start_processing ) { goto start_processing; } #endif if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server * doesn't use a psk_identity_hint */ if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE ) { if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { /* Current message is probably either * CertificateRequest or ServerHelloDone */ ssl->keep_current_message = 1; goto exit; } MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key exchange message must " "not be skipped" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) ssl->handshake->ecrs_state = ssl_ecrs_ske_start_processing; start_processing: #endif p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); end = ssl->in_msg + ssl->in_hslen; MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } /* FALLTROUGH */ #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) ; /* nothing more to do */ else #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ) { if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx, p, end - p ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) ) { size_t sig_len, hashlen; unsigned char hash[64]; mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE; mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); size_t params_len = p - params; void *rs_ctx = NULL; /* * Handle the digitally-signed structure */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg, &pk_alg ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) { pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); /* Default hash for ECDSA is SHA-1 */ if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE ) md_alg = MBEDTLS_MD_SHA1; } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Read signature */ if( p > end - 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } sig_len = ( p[0] << 8 ) | p[1]; p += 2; if( p != end - sig_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len ); /* * Compute the hash that has been signed */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( md_alg == MBEDTLS_MD_NONE ) { hashlen = 36; ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, params, params_len ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( md_alg != MBEDTLS_MD_NONE ) { ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen, params, params_len, md_alg ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen ); if( ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * Verify signature */ if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) rs_ctx = &ssl->handshake->ecrs_ctx.pk; #endif if( ( ret = mbedtls_pk_verify_restartable( &ssl->session_negotiate->peer_cert->pk, md_alg, hash, hashlen, p, sig_len, rs_ctx ) ) != 0 ) { #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) #endif mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR ); MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ exit: ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) ); return( 0 ); } #if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED) static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) ); if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) { int ret; unsigned char *buf; size_t n = 0; size_t cert_type_len = 0, dn_len = 0; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) ); if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) ); ssl->state++; return( 0 ); } if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } ssl->state++; ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request", ssl->client_auth ? "a" : "no" ) ); if( ssl->client_auth == 0 ) { /* Current message is probably the ServerHelloDone */ ssl->keep_current_message = 1; goto exit; } /* * struct { * ClientCertificateType certificate_types<1..2^8-1>; * SignatureAndHashAlgorithm * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only * DistinguishedName certificate_authorities<0..2^16-1>; * } CertificateRequest; * * Since we only support a single certificate on clients, let's just * ignore all the information that's supposed to help us pick a * certificate. * * We could check that our certificate matches the request, and bail out * if it doesn't, but it's simpler to just send the certificate anyway, * and give the server the opportunity to decide if it should terminate * the connection when it doesn't like our certificate. * * Same goes for the hash in TLS 1.2's signature_algorithms: at this * point we only have one hash available (see comments in * write_certificate_verify), so let's just use what we have. * * However, we still minimally parse the message to check it is at least * superficially sane. */ buf = ssl->in_msg; /* certificate_types */ if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )]; n = cert_type_len; /* * In the subsequent code there are two paths that read from buf: * * the length of the signature algorithms field (if minor version of * SSL is 3), * * distinguished name length otherwise. * Both reach at most the index: * ...hdr_len + 2 + n, * therefore the buffer length at this point must be greater than that * regardless of the actual code path. */ if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } /* supported_signature_algorithms */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 ) | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) ); #if defined(MBEDTLS_DEBUG_C) unsigned char* sig_alg; size_t i; #endif /* * The furthest access in buf is in the loop few lines below: * sig_alg[i + 1], * where: * sig_alg = buf + ...hdr_len + 3 + n, * max(i) = sig_alg_len - 1. * Therefore the furthest access is: * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1], * which reduces to: * buf[...hdr_len + 3 + n + sig_alg_len], * which is one less than we need the buf to be. */ if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n + sig_alg_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } #if defined(MBEDTLS_DEBUG_C) sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n; for( i = 0; i < sig_alg_len; i += 2 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Signature Algorithm found: %d" ",%d", sig_alg[i], sig_alg[i + 1] ) ); } #endif n += 2 + sig_alg_len; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ /* certificate_authorities */ dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 ) | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) ); n += dn_len; if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) ); return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */ static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) || ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE ); } ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_recv_flight_completed( ssl ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) ); return( 0 ); } static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl ) { int ret; size_t i, n; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) ); #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ) { /* * DHM key exchange -- send G^X mod P */ n = ssl->handshake->dhm_ctx.len; ssl->out_msg[4] = (unsigned char)( n >> 8 ); ssl->out_msg[5] = (unsigned char)( n ); i = 6; ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx, (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ), &ssl->out_msg[i], n, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX ); if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, ssl->handshake->premaster, MBEDTLS_PREMASTER_SIZE, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ) { /* * ECDH key exchange -- send client public value */ i = 4; #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) { if( ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret ) goto ecdh_calc_secret; mbedtls_ecdh_enable_restart( &ssl->handshake->ecdh_ctx ); } #endif ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n, &ssl->out_msg[i], 1000, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Q ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) { ssl->handshake->ecrs_n = n; ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret; } ecdh_calc_secret: if( ssl->handshake->ecrs_enabled ) n = ssl->handshake->ecrs_n; #endif if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &ssl->handshake->pmslen, ssl->handshake->premaster, MBEDTLS_MPI_MAX_SIZE, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Z ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) ) { /* * opaque psk_identity<0..2^16-1>; */ if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } i = 4; n = ssl->conf->psk_identity_len; if( i + 2 + n > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or " "SSL buffer too short" ) ); return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); } ssl->out_msg[i++] = (unsigned char)( n >> 8 ); ssl->out_msg[i++] = (unsigned char)( n ); memcpy( ssl->out_msg + i, ssl->conf->psk_identity, ssl->conf->psk_identity_len ); i += ssl->conf->psk_identity_len; #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ) { n = 0; } else #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 ) return( ret ); } else #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { /* * ClientDiffieHellmanPublic public (DHM send G^X mod P) */ n = ssl->handshake->dhm_ctx.len; if( i + 2 + n > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long" " or SSL buffer too short" ) ); return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); } ssl->out_msg[i++] = (unsigned char)( n >> 8 ); ssl->out_msg[i++] = (unsigned char)( n ); ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx, (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ), &ssl->out_msg[i], n, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { /* * ClientECDiffieHellmanPublic public; */ ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n, &ssl->out_msg[i], MBEDTLS_SSL_OUT_CONTENT_LEN - i, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Q ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) { i = 4; if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 ) return( ret ); } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { i = 4; ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx, ssl->out_msg + i, MBEDTLS_SSL_OUT_CONTENT_LEN - i, &n, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret ); return( ret ); } ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx, ssl->handshake->premaster, 32, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ { ((void) ciphersuite_info); MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->out_msglen = i + n; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) ); return( 0 ); } #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) ); if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; size_t n = 0, offset = 0; unsigned char hash[48]; unsigned char *hash_start = hash; mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE; unsigned int hashlen; void *rs_ctx = NULL; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled && ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign ) { goto sign; } #endif if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) ); ssl->state++; return( 0 ); } if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) ); ssl->state++; return( 0 ); } if( mbedtls_ssl_own_key( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } /* * Make a signature of the handshake digests */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign; sign: #endif ssl->handshake->calc_verify( ssl, hash ); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) { /* * digitally-signed struct { * opaque md5_hash[16]; * opaque sha_hash[20]; * }; * * md5_hash * MD5(handshake_messages); * * sha_hash * SHA(handshake_messages); */ hashlen = 36; md_alg = MBEDTLS_MD_NONE; /* * For ECDSA, default hash is SHA-1 only */ if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) ) { hash_start += 16; hashlen -= 16; md_alg = MBEDTLS_MD_SHA1; } } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { /* * digitally-signed struct { * opaque handshake_messages[handshake_messages_length]; * }; * * Taking shortcut here. We assume that the server always allows the * PRF Hash function and has sent it in the allowed signature * algorithms list received in the Certificate Request message. * * Until we encounter a server that does not, we will take this * shortcut. * * Reason: Otherwise we should have running hashes for SHA512 and SHA224 * in order to satisfy 'weird' needs from the server side. */ if( ssl->transform_negotiate->ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) { md_alg = MBEDTLS_MD_SHA384; ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384; } else { md_alg = MBEDTLS_MD_SHA256; ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256; } ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) ); /* Info from md_alg will be used instead */ hashlen = 0; offset = 2; } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) rs_ctx = &ssl->handshake->ecrs_ctx.pk; #endif if( ( ret = mbedtls_pk_sign_restartable( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen, ssl->out_msg + 6 + offset, &n, ssl->conf->f_rng, ssl->conf->p_rng, rs_ctx ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 ); ssl->out_msg[5 + offset] = (unsigned char)( n ); ssl->out_msglen = 6 + n + offset; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl ) { int ret; uint32_t lifetime; size_t ticket_len; unsigned char *ticket; const unsigned char *msg; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * struct { * uint32 ticket_lifetime_hint; * opaque ticket<0..2^16-1>; * } NewSessionTicket; * * 0 . 3 ticket_lifetime_hint * 4 . 5 ticket_len (n) * 6 . 5+n ticket content */ if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET || ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ); } msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) | ( msg[2] << 8 ) | ( msg[3] ); ticket_len = ( msg[4] << 8 ) | ( msg[5] ); if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) ); /* We're not waiting for a NewSessionTicket message any more */ ssl->handshake->new_session_ticket = 0; ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; /* * Zero-length ticket means the server changed his mind and doesn't want * to send a ticket after all, so just forget it */ if( ticket_len == 0 ) return( 0 ); mbedtls_platform_zeroize( ssl->session_negotiate->ticket, ssl->session_negotiate->ticket_len ); mbedtls_free( ssl->session_negotiate->ticket ); ssl->session_negotiate->ticket = NULL; ssl->session_negotiate->ticket_len = 0; if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } memcpy( ticket, msg + 6, ticket_len ); ssl->session_negotiate->ticket = ticket; ssl->session_negotiate->ticket_len = ticket_len; ssl->session_negotiate->ticket_lifetime = lifetime; /* * RFC 5077 section 3.4: * "If the client receives a session ticket from the server, then it * discards any Session ID that was sent in the ServerHello." */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) ); ssl->session_negotiate->id_len = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ /* * SSL handshake -- client side -- single step */ int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl ) { int ret = 0; if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) ); if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* Change state now, so that it is right in mbedtls_ssl_read_record(), used * by DTLS for dropping out-of-sequence ChangeCipherSpec records */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC && ssl->handshake->new_session_ticket != 0 ) { ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET; } #endif switch( ssl->state ) { case MBEDTLS_SSL_HELLO_REQUEST: ssl->state = MBEDTLS_SSL_CLIENT_HELLO; break; /* * ==> ClientHello */ case MBEDTLS_SSL_CLIENT_HELLO: ret = ssl_write_client_hello( ssl ); break; /* * <== ServerHello * Certificate * ( ServerKeyExchange ) * ( CertificateRequest ) * ServerHelloDone */ case MBEDTLS_SSL_SERVER_HELLO: ret = ssl_parse_server_hello( ssl ); break; case MBEDTLS_SSL_SERVER_CERTIFICATE: ret = mbedtls_ssl_parse_certificate( ssl ); break; case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: ret = ssl_parse_server_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_REQUEST: ret = ssl_parse_certificate_request( ssl ); break; case MBEDTLS_SSL_SERVER_HELLO_DONE: ret = ssl_parse_server_hello_done( ssl ); break; /* * ==> ( Certificate/Alert ) * ClientKeyExchange * ( CertificateVerify ) * ChangeCipherSpec * Finished */ case MBEDTLS_SSL_CLIENT_CERTIFICATE: ret = mbedtls_ssl_write_certificate( ssl ); break; case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: ret = ssl_write_client_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_VERIFY: ret = ssl_write_certificate_verify( ssl ); break; case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: ret = mbedtls_ssl_write_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_CLIENT_FINISHED: ret = mbedtls_ssl_write_finished( ssl ); break; /* * <== ( NewSessionTicket ) * ChangeCipherSpec * Finished */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET: ret = ssl_parse_new_session_ticket( ssl ); break; #endif case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: ret = mbedtls_ssl_parse_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_SERVER_FINISHED: ret = mbedtls_ssl_parse_finished( ssl ); break; case MBEDTLS_SSL_FLUSH_BUFFERS: MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; break; case MBEDTLS_SSL_HANDSHAKE_WRAPUP: mbedtls_ssl_handshake_wrapup( ssl ); break; default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } return( ret ); } #endif /* MBEDTLS_SSL_CLI_C */ fldigi-4.1.06/src/mbedtls/ssl_ticket.c0000664000175000017500000003222013507401434014514 00000000000000/* * TLS server tickets callbacks implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_TICKET_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ssl_ticket.h" #include "mbedtls/platform_util.h" #include /* * Initialze context */ void mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_ssl_ticket_context ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } #define MAX_KEY_BYTES 32 /* 256 bits */ /* * Generate/update a key */ static int ssl_ticket_gen_key( mbedtls_ssl_ticket_context *ctx, unsigned char index ) { int ret; unsigned char buf[MAX_KEY_BYTES]; mbedtls_ssl_ticket_key *key = ctx->keys + index; #if defined(MBEDTLS_HAVE_TIME) key->generation_time = (uint32_t) mbedtls_time( NULL ); #endif if( ( ret = ctx->f_rng( ctx->p_rng, key->name, sizeof( key->name ) ) ) != 0 ) return( ret ); if( ( ret = ctx->f_rng( ctx->p_rng, buf, sizeof( buf ) ) ) != 0 ) return( ret ); /* With GCM and CCM, same context can encrypt & decrypt */ ret = mbedtls_cipher_setkey( &key->ctx, buf, mbedtls_cipher_get_key_bitlen( &key->ctx ), MBEDTLS_ENCRYPT ); mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } /* * Rotate/generate keys if necessary */ static int ssl_ticket_update_keys( mbedtls_ssl_ticket_context *ctx ) { #if !defined(MBEDTLS_HAVE_TIME) ((void) ctx); #else if( ctx->ticket_lifetime != 0 ) { uint32_t current_time = (uint32_t) mbedtls_time( NULL ); uint32_t key_time = ctx->keys[ctx->active].generation_time; if( current_time >= key_time && current_time - key_time < ctx->ticket_lifetime ) { return( 0 ); } ctx->active = 1 - ctx->active; return( ssl_ticket_gen_key( ctx, ctx->active ) ); } else #endif /* MBEDTLS_HAVE_TIME */ return( 0 ); } /* * Setup context for actual use */ int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_cipher_type_t cipher, uint32_t lifetime ) { int ret; const mbedtls_cipher_info_t *cipher_info; ctx->f_rng = f_rng; ctx->p_rng = p_rng; ctx->ticket_lifetime = lifetime; cipher_info = mbedtls_cipher_info_from_type( cipher); if( cipher_info == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( cipher_info->mode != MBEDTLS_MODE_GCM && cipher_info->mode != MBEDTLS_MODE_CCM ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( cipher_info->key_bitlen > 8 * MAX_KEY_BYTES ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ( ret = mbedtls_cipher_setup( &ctx->keys[0].ctx, cipher_info ) ) != 0 || ( ret = mbedtls_cipher_setup( &ctx->keys[1].ctx, cipher_info ) ) != 0 ) { return( ret ); } if( ( ret = ssl_ticket_gen_key( ctx, 0 ) ) != 0 || ( ret = ssl_ticket_gen_key( ctx, 1 ) ) != 0 ) { return( ret ); } return( 0 ); } /* * Serialize a session in the following format: * 0 . n-1 session structure, n = sizeof(mbedtls_ssl_session) * n . n+2 peer_cert length = m (0 if no certificate) * n+3 . n+2+m peer cert ASN.1 */ static int ssl_save_session( const mbedtls_ssl_session *session, unsigned char *buf, size_t buf_len, size_t *olen ) { unsigned char *p = buf; size_t left = buf_len; #if defined(MBEDTLS_X509_CRT_PARSE_C) size_t cert_len; #endif /* MBEDTLS_X509_CRT_PARSE_C */ if( left < sizeof( mbedtls_ssl_session ) ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); memcpy( p, session, sizeof( mbedtls_ssl_session ) ); p += sizeof( mbedtls_ssl_session ); left -= sizeof( mbedtls_ssl_session ); #if defined(MBEDTLS_X509_CRT_PARSE_C) if( session->peer_cert == NULL ) cert_len = 0; else cert_len = session->peer_cert->raw.len; if( left < 3 + cert_len ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); *p++ = (unsigned char)( ( cert_len >> 16 ) & 0xFF ); *p++ = (unsigned char)( ( cert_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( cert_len ) & 0xFF ); if( session->peer_cert != NULL ) memcpy( p, session->peer_cert->raw.p, cert_len ); p += cert_len; #endif /* MBEDTLS_X509_CRT_PARSE_C */ *olen = p - buf; return( 0 ); } /* * Unserialise session, see ssl_save_session() */ static int ssl_load_session( mbedtls_ssl_session *session, const unsigned char *buf, size_t len ) { const unsigned char *p = buf; const unsigned char * const end = buf + len; #if defined(MBEDTLS_X509_CRT_PARSE_C) size_t cert_len; #endif /* MBEDTLS_X509_CRT_PARSE_C */ if( sizeof( mbedtls_ssl_session ) > (size_t)( end - p ) ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); memcpy( session, p, sizeof( mbedtls_ssl_session ) ); p += sizeof( mbedtls_ssl_session ); #if defined(MBEDTLS_X509_CRT_PARSE_C) if( 3 > (size_t)( end - p ) ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2]; p += 3; if( cert_len == 0 ) { session->peer_cert = NULL; } else { int ret; if( cert_len > (size_t)( end - p ) ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ); if( session->peer_cert == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); mbedtls_x509_crt_init( session->peer_cert ); if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert, p, cert_len ) ) != 0 ) { mbedtls_x509_crt_free( session->peer_cert ); mbedtls_free( session->peer_cert ); session->peer_cert = NULL; return( ret ); } p += cert_len; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ if( p != end ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); return( 0 ); } /* * Create session ticket, with the following structure: * * struct { * opaque key_name[4]; * opaque iv[12]; * opaque encrypted_state<0..2^16-1>; * opaque tag[16]; * } ticket; * * The key_name, iv, and length of encrypted_state are the additional * authenticated data. */ int mbedtls_ssl_ticket_write( void *p_ticket, const mbedtls_ssl_session *session, unsigned char *start, const unsigned char *end, size_t *tlen, uint32_t *ticket_lifetime ) { int ret; mbedtls_ssl_ticket_context *ctx = p_ticket; mbedtls_ssl_ticket_key *key; unsigned char *key_name = start; unsigned char *iv = start + 4; unsigned char *state_len_bytes = iv + 12; unsigned char *state = state_len_bytes + 2; unsigned char *tag; size_t clear_len, ciph_len; *tlen = 0; if( ctx == NULL || ctx->f_rng == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* We need at least 4 bytes for key_name, 12 for IV, 2 for len 16 for tag, * in addition to session itself, that will be checked when writing it. */ if( end - start < 4 + 12 + 2 + 16 ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 ) goto cleanup; key = &ctx->keys[ctx->active]; *ticket_lifetime = ctx->ticket_lifetime; memcpy( key_name, key->name, 4 ); if( ( ret = ctx->f_rng( ctx->p_rng, iv, 12 ) ) != 0 ) goto cleanup; /* Dump session state */ if( ( ret = ssl_save_session( session, state, end - state, &clear_len ) ) != 0 || (unsigned long) clear_len > 65535 ) { goto cleanup; } state_len_bytes[0] = ( clear_len >> 8 ) & 0xff; state_len_bytes[1] = ( clear_len ) & 0xff; /* Encrypt and authenticate */ tag = state + clear_len; if( ( ret = mbedtls_cipher_auth_encrypt( &key->ctx, iv, 12, key_name, 4 + 12 + 2, state, clear_len, state, &ciph_len, tag, 16 ) ) != 0 ) { goto cleanup; } if( ciph_len != clear_len ) { ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; goto cleanup; } *tlen = 4 + 12 + 2 + 16 + ciph_len; cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Select key based on name */ static mbedtls_ssl_ticket_key *ssl_ticket_select_key( mbedtls_ssl_ticket_context *ctx, const unsigned char name[4] ) { unsigned char i; for( i = 0; i < sizeof( ctx->keys ) / sizeof( *ctx->keys ); i++ ) if( memcmp( name, ctx->keys[i].name, 4 ) == 0 ) return( &ctx->keys[i] ); return( NULL ); } /* * Load session ticket (see mbedtls_ssl_ticket_write for structure) */ int mbedtls_ssl_ticket_parse( void *p_ticket, mbedtls_ssl_session *session, unsigned char *buf, size_t len ) { int ret; mbedtls_ssl_ticket_context *ctx = p_ticket; mbedtls_ssl_ticket_key *key; unsigned char *key_name = buf; unsigned char *iv = buf + 4; unsigned char *enc_len_p = iv + 12; unsigned char *ticket = enc_len_p + 2; unsigned char *tag; size_t enc_len, clear_len; if( ctx == NULL || ctx->f_rng == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* See mbedtls_ssl_ticket_write() */ if( len < 4 + 12 + 2 + 16 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 ) goto cleanup; enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1]; tag = ticket + enc_len; if( len != 4 + 12 + 2 + enc_len + 16 ) { ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA; goto cleanup; } /* Select key */ if( ( key = ssl_ticket_select_key( ctx, key_name ) ) == NULL ) { /* We can't know for sure but this is a likely option unless we're * under attack - this is only informative anyway */ ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED; goto cleanup; } /* Decrypt and authenticate */ if( ( ret = mbedtls_cipher_auth_decrypt( &key->ctx, iv, 12, key_name, 4 + 12 + 2, ticket, enc_len, ticket, &clear_len, tag, 16 ) ) != 0 ) { if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED ) ret = MBEDTLS_ERR_SSL_INVALID_MAC; goto cleanup; } if( clear_len != enc_len ) { ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; goto cleanup; } /* Actually load session */ if( ( ret = ssl_load_session( session, ticket, clear_len ) ) != 0 ) goto cleanup; #if defined(MBEDTLS_HAVE_TIME) { /* Check for expiration */ mbedtls_time_t current_time = mbedtls_time( NULL ); if( current_time < session->start || (uint32_t)( current_time - session->start ) > ctx->ticket_lifetime ) { ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED; goto cleanup; } } #endif cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Free context */ void mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx ) { mbedtls_cipher_free( &ctx->keys[0].ctx ); mbedtls_cipher_free( &ctx->keys[1].ctx ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ssl_ticket_context ) ); } #endif /* MBEDTLS_SSL_TICKET_C */ fldigi-4.1.06/src/mbedtls/error.c0000664000175000017500000013404713507401434013513 00000000000000/* * Error message information * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY) #include "mbedtls/error.h" #include #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_snprintf snprintf #define mbedtls_time_t time_t #endif #if defined(MBEDTLS_ERROR_C) #include #if defined(MBEDTLS_AES_C) #include "mbedtls/aes.h" #endif #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #endif #if defined(MBEDTLS_ARIA_C) #include "mbedtls/aria.h" #endif #if defined(MBEDTLS_BASE64_C) #include "mbedtls/base64.h" #endif #if defined(MBEDTLS_BIGNUM_C) #include "mbedtls/bignum.h" #endif #if defined(MBEDTLS_BLOWFISH_C) #include "mbedtls/blowfish.h" #endif #if defined(MBEDTLS_CAMELLIA_C) #include "mbedtls/camellia.h" #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #endif #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #endif #if defined(MBEDTLS_CIPHER_C) #include "mbedtls/cipher.h" #endif #if defined(MBEDTLS_CMAC_C) #include "mbedtls/cmac.h" #endif #if defined(MBEDTLS_CTR_DRBG_C) #include "mbedtls/ctr_drbg.h" #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #endif #if defined(MBEDTLS_DHM_C) #include "mbedtls/dhm.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ENTROPY_C) #include "mbedtls/entropy.h" #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #endif #if defined(MBEDTLS_HKDF_C) #include "mbedtls/hkdf.h" #endif #if defined(MBEDTLS_HMAC_DRBG_C) #include "mbedtls/hmac_drbg.h" #endif #if defined(MBEDTLS_MD_C) #include "mbedtls/md.h" #endif #if defined(MBEDTLS_MD2_C) #include "mbedtls/md2.h" #endif #if defined(MBEDTLS_MD4_C) #include "mbedtls/md4.h" #endif #if defined(MBEDTLS_MD5_C) #include "mbedtls/md5.h" #endif #if defined(MBEDTLS_NET_C) #include "mbedtls/net_sockets.h" #endif #if defined(MBEDTLS_OID_C) #include "mbedtls/oid.h" #endif #if defined(MBEDTLS_PADLOCK_C) #include "mbedtls/padlock.h" #endif #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PK_C) #include "mbedtls/pk.h" #endif #if defined(MBEDTLS_PKCS12_C) #include "mbedtls/pkcs12.h" #endif #if defined(MBEDTLS_PKCS5_C) #include "mbedtls/pkcs5.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #endif #if defined(MBEDTLS_POLY1305_C) #include "mbedtls/poly1305.h" #endif #if defined(MBEDTLS_RIPEMD160_C) #include "mbedtls/ripemd160.h" #endif #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_SHA1_C) #include "mbedtls/sha1.h" #endif #if defined(MBEDTLS_SHA256_C) #include "mbedtls/sha256.h" #endif #if defined(MBEDTLS_SHA512_C) #include "mbedtls/sha512.h" #endif #if defined(MBEDTLS_SSL_TLS_C) #include "mbedtls/ssl.h" #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #endif #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) #include "mbedtls/x509.h" #endif #if defined(MBEDTLS_XTEA_C) #include "mbedtls/xtea.h" #endif void mbedtls_strerror( int ret, char *buf, size_t buflen ) { size_t len; int use_ret; if( buflen == 0 ) return; memset( buf, 0x00, buflen ); if( ret < 0 ) ret = -ret; if( ret & 0xFF80 ) { use_ret = ret & 0xFF80; // High level error codes // // BEGIN generated code #if defined(MBEDTLS_CIPHER_C) if( use_ret == -(MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "CIPHER - The selected feature is not available" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "CIPHER - Bad input parameters" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Failed to allocate memory" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_PADDING) ) mbedtls_snprintf( buf, buflen, "CIPHER - Input data contains invalid padding and is rejected" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Decryption of block requires a full block" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Authentication failed (for AEAD modes)" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_CONTEXT) ) mbedtls_snprintf( buf, buflen, "CIPHER - The context is invalid. For example, because it was freed" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Cipher hardware accelerator failed" ); #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_DHM_C) if( use_ret == -(MBEDTLS_ERR_DHM_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "DHM - Bad input parameters" ); if( use_ret == -(MBEDTLS_ERR_DHM_READ_PARAMS_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Reading of the DHM parameters failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Making of the DHM parameters failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Reading of the public values failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Making of the public value failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_CALC_SECRET_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Calculation of the DHM secret failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "DHM - The ASN.1 data is not formatted correctly" ); if( use_ret == -(MBEDTLS_ERR_DHM_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Allocation of memory failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "DHM - Read or write of file failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - DHM hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_SET_GROUP_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Setting the modulus and generator failed" ); #endif /* MBEDTLS_DHM_C */ #if defined(MBEDTLS_ECP_C) if( use_ret == -(MBEDTLS_ERR_ECP_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "ECP - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "ECP - The buffer is too small to write to" ); if( use_ret == -(MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "ECP - The requested feature is not available, for example, the requested curve is not supported" ); if( use_ret == -(MBEDTLS_ERR_ECP_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - The signature is not valid" ); if( use_ret == -(MBEDTLS_ERR_ECP_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_ECP_RANDOM_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - Generation of random value, such as ephemeral key, failed" ); if( use_ret == -(MBEDTLS_ERR_ECP_INVALID_KEY) ) mbedtls_snprintf( buf, buflen, "ECP - Invalid private or public key" ); if( use_ret == -(MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) ) mbedtls_snprintf( buf, buflen, "ECP - The buffer contains a valid signature followed by more data" ); if( use_ret == -(MBEDTLS_ERR_ECP_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - The ECP hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_ECP_IN_PROGRESS) ) mbedtls_snprintf( buf, buflen, "ECP - Operation in progress, call again with the same parameters to continue" ); #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_MD_C) if( use_ret == -(MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "MD - The selected feature is not available" ); if( use_ret == -(MBEDTLS_ERR_MD_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "MD - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_MD_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "MD - Failed to allocate memory" ); if( use_ret == -(MBEDTLS_ERR_MD_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "MD - Opening or reading of file failed" ); if( use_ret == -(MBEDTLS_ERR_MD_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD - MD hardware accelerator failed" ); #endif /* MBEDTLS_MD_C */ #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) if( use_ret == -(MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) ) mbedtls_snprintf( buf, buflen, "PEM - No PEM header or footer found" ); if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_DATA) ) mbedtls_snprintf( buf, buflen, "PEM - PEM string is not as expected" ); if( use_ret == -(MBEDTLS_ERR_PEM_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "PEM - Failed to allocate memory" ); if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_ENC_IV) ) mbedtls_snprintf( buf, buflen, "PEM - RSA IV is not in hex-format" ); if( use_ret == -(MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG) ) mbedtls_snprintf( buf, buflen, "PEM - Unsupported key encryption algorithm" ); if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_REQUIRED) ) mbedtls_snprintf( buf, buflen, "PEM - Private key password can't be empty" ); if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PEM - Given private key password does not allow for correct decryption" ); if( use_ret == -(MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PEM - Unavailable feature, e.g. hashing/encryption combination" ); if( use_ret == -(MBEDTLS_ERR_PEM_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PEM - Bad input parameters to function" ); #endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */ #if defined(MBEDTLS_PK_C) if( use_ret == -(MBEDTLS_ERR_PK_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "PK - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_PK_TYPE_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PK - Type mismatch, eg attempt to encrypt with an ECDSA key" ); if( use_ret == -(MBEDTLS_ERR_PK_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PK - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_PK_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "PK - Read/write of file failed" ); if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_VERSION) ) mbedtls_snprintf( buf, buflen, "PK - Unsupported key version" ); if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "PK - Invalid key tag or value" ); if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_PK_ALG) ) mbedtls_snprintf( buf, buflen, "PK - Key algorithm is unsupported (only RSA and EC are supported)" ); if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_REQUIRED) ) mbedtls_snprintf( buf, buflen, "PK - Private key password can't be empty" ); if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PK - Given private key password does not allow for correct decryption" ); if( use_ret == -(MBEDTLS_ERR_PK_INVALID_PUBKEY) ) mbedtls_snprintf( buf, buflen, "PK - The pubkey tag or value is invalid (only RSA and EC are supported)" ); if( use_ret == -(MBEDTLS_ERR_PK_INVALID_ALG) ) mbedtls_snprintf( buf, buflen, "PK - The algorithm tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE) ) mbedtls_snprintf( buf, buflen, "PK - Elliptic curve is unsupported (only NIST curves are supported)" ); if( use_ret == -(MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PK - Unavailable feature, e.g. RSA disabled for RSA key" ); if( use_ret == -(MBEDTLS_ERR_PK_SIG_LEN_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PK - The buffer contains a valid signature followed by more data" ); if( use_ret == -(MBEDTLS_ERR_PK_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "PK - PK hardware accelerator failed" ); #endif /* MBEDTLS_PK_C */ #if defined(MBEDTLS_PKCS12_C) if( use_ret == -(MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PKCS12 - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PKCS12 - Feature not available, e.g. unsupported encryption scheme" ); if( use_ret == -(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "PKCS12 - PBE ASN.1 data not as expected" ); if( use_ret == -(MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PKCS12 - Given private key password does not allow for correct decryption" ); #endif /* MBEDTLS_PKCS12_C */ #if defined(MBEDTLS_PKCS5_C) if( use_ret == -(MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_PKCS5_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Unexpected ASN.1 data" ); if( use_ret == -(MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Requested encryption or digest alg not available" ); if( use_ret == -(MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Given private key password does not allow for correct decryption" ); #endif /* MBEDTLS_PKCS5_C */ #if defined(MBEDTLS_RSA_C) if( use_ret == -(MBEDTLS_ERR_RSA_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "RSA - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_RSA_INVALID_PADDING) ) mbedtls_snprintf( buf, buflen, "RSA - Input data contains invalid padding and is rejected" ); if( use_ret == -(MBEDTLS_ERR_RSA_KEY_GEN_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - Something failed during generation of a key" ); if( use_ret == -(MBEDTLS_ERR_RSA_KEY_CHECK_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - Key failed to pass the validity check of the library" ); if( use_ret == -(MBEDTLS_ERR_RSA_PUBLIC_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The public key operation failed" ); if( use_ret == -(MBEDTLS_ERR_RSA_PRIVATE_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The private key operation failed" ); if( use_ret == -(MBEDTLS_ERR_RSA_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The PKCS#1 verification failed" ); if( use_ret == -(MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE) ) mbedtls_snprintf( buf, buflen, "RSA - The output buffer for decryption is not large enough" ); if( use_ret == -(MBEDTLS_ERR_RSA_RNG_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The random generator failed to generate non-zeros" ); if( use_ret == -(MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION) ) mbedtls_snprintf( buf, buflen, "RSA - The implementation does not offer the requested operation, for example, because of security violations or lack of functionality" ); if( use_ret == -(MBEDTLS_ERR_RSA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - RSA hardware accelerator failed" ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_SSL_TLS_C) if( use_ret == -(MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "SSL - The requested feature is not available" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SSL - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_MAC) ) mbedtls_snprintf( buf, buflen, "SSL - Verification of the message MAC failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_RECORD) ) mbedtls_snprintf( buf, buflen, "SSL - An invalid SSL record was received" ); if( use_ret == -(MBEDTLS_ERR_SSL_CONN_EOF) ) mbedtls_snprintf( buf, buflen, "SSL - The connection indicated an EOF" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_CIPHER) ) mbedtls_snprintf( buf, buflen, "SSL - An unknown cipher was received" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN) ) mbedtls_snprintf( buf, buflen, "SSL - The server has no ciphersuites in common with the client" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_RNG) ) mbedtls_snprintf( buf, buflen, "SSL - No RNG was provided to the SSL module" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE) ) mbedtls_snprintf( buf, buflen, "SSL - No client certification received from the client, but required by the authentication mode" ); if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE) ) mbedtls_snprintf( buf, buflen, "SSL - Our own certificate(s) is/are too large to send in an SSL message" ); if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - The own certificate is not set, but needed by the server" ); if( use_ret == -(MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - The own private key or pre-shared key is not set, but needed" ); if( use_ret == -(MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - No CA Chain is set, but required to operate" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE) ) mbedtls_snprintf( buf, buflen, "SSL - An unexpected message was received from our peer" ); if( use_ret == -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE) ) { mbedtls_snprintf( buf, buflen, "SSL - A fatal alert message was received from our peer" ); return; } if( use_ret == -(MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Verification of our peer failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) ) mbedtls_snprintf( buf, buflen, "SSL - The peer notified us that the connection is going to be closed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientHello handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerHello handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the Certificate handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the CertificateRequest handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerKeyExchange handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerHelloDone handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the CertificateVerify handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ChangeCipherSpec handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_FINISHED) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the Finished handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Hardware acceleration function returned with error" ); if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH) ) mbedtls_snprintf( buf, buflen, "SSL - Hardware acceleration function skipped / left alone data" ); if( use_ret == -(MBEDTLS_ERR_SSL_COMPRESSION_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the compression / decompression failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION) ) mbedtls_snprintf( buf, buflen, "SSL - Handshake protocol not within min/max boundaries" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the NewSessionTicket handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) ) mbedtls_snprintf( buf, buflen, "SSL - Session ticket has expired" ); if( use_ret == -(MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH) ) mbedtls_snprintf( buf, buflen, "SSL - Public key type mismatch (eg, asked for RSA key exchange and presented EC key)" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) ) mbedtls_snprintf( buf, buflen, "SSL - Unknown identity received (eg, PSK identity)" ); if( use_ret == -(MBEDTLS_ERR_SSL_INTERNAL_ERROR) ) mbedtls_snprintf( buf, buflen, "SSL - Internal error (eg, unexpected failure in lower-level module)" ); if( use_ret == -(MBEDTLS_ERR_SSL_COUNTER_WRAPPING) ) mbedtls_snprintf( buf, buflen, "SSL - A counter would wrap (eg, too many messages exchanged)" ); if( use_ret == -(MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO) ) mbedtls_snprintf( buf, buflen, "SSL - Unexpected message at ServerHello in renegotiation" ); if( use_ret == -(MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - DTLS client must retry for hello verification" ); if( use_ret == -(MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "SSL - A buffer is too small to receive or write a message" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE) ) mbedtls_snprintf( buf, buflen, "SSL - None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages)" ); if( use_ret == -(MBEDTLS_ERR_SSL_WANT_READ) ) mbedtls_snprintf( buf, buflen, "SSL - No data of requested type currently available on underlying transport" ); if( use_ret == -(MBEDTLS_ERR_SSL_WANT_WRITE) ) mbedtls_snprintf( buf, buflen, "SSL - Connection requires a write call" ); if( use_ret == -(MBEDTLS_ERR_SSL_TIMEOUT) ) mbedtls_snprintf( buf, buflen, "SSL - The operation timed out" ); if( use_ret == -(MBEDTLS_ERR_SSL_CLIENT_RECONNECT) ) mbedtls_snprintf( buf, buflen, "SSL - The client initiated a reconnect from the same port" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_RECORD) ) mbedtls_snprintf( buf, buflen, "SSL - Record header looks valid but is not expected" ); if( use_ret == -(MBEDTLS_ERR_SSL_NON_FATAL) ) mbedtls_snprintf( buf, buflen, "SSL - The alert message received indicates a non-fatal error" ); if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH) ) mbedtls_snprintf( buf, buflen, "SSL - Couldn't set the hash for verifying CertificateVerify" ); if( use_ret == -(MBEDTLS_ERR_SSL_CONTINUE_PROCESSING) ) mbedtls_snprintf( buf, buflen, "SSL - Internal-only message signaling that further message-processing should be done" ); if( use_ret == -(MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) ) mbedtls_snprintf( buf, buflen, "SSL - The asynchronous operation is not completed yet" ); if( use_ret == -(MBEDTLS_ERR_SSL_EARLY_MESSAGE) ) mbedtls_snprintf( buf, buflen, "SSL - Internal-only message signaling that a message arrived early" ); if( use_ret == -(MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) ) mbedtls_snprintf( buf, buflen, "SSL - A cryptographic operation is in progress. Try again later" ); #endif /* MBEDTLS_SSL_TLS_C */ #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) if( use_ret == -(MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "X509 - Unavailable feature, e.g. RSA hashing/encryption combination" ); if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_OID) ) mbedtls_snprintf( buf, buflen, "X509 - Requested OID is unknown" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "X509 - The CRT/CRL/CSR format is invalid, e.g. different type expected" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_VERSION) ) mbedtls_snprintf( buf, buflen, "X509 - The CRT/CRL/CSR version element is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SERIAL) ) mbedtls_snprintf( buf, buflen, "X509 - The serial tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_ALG) ) mbedtls_snprintf( buf, buflen, "X509 - The algorithm tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_NAME) ) mbedtls_snprintf( buf, buflen, "X509 - The name tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_DATE) ) mbedtls_snprintf( buf, buflen, "X509 - The date tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SIGNATURE) ) mbedtls_snprintf( buf, buflen, "X509 - The signature tag or value invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_EXTENSIONS) ) mbedtls_snprintf( buf, buflen, "X509 - The extension tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_VERSION) ) mbedtls_snprintf( buf, buflen, "X509 - CRT/CRL/CSR has an unsupported version number" ); if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG) ) mbedtls_snprintf( buf, buflen, "X509 - Signature algorithm (oid) is unsupported" ); if( use_ret == -(MBEDTLS_ERR_X509_SIG_MISMATCH) ) mbedtls_snprintf( buf, buflen, "X509 - Signature algorithms do not match. (see \\c ::mbedtls_x509_crt sig_oid)" ); if( use_ret == -(MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "X509 - Certificate verification failed, e.g. CRL, CA or signature check failed" ); if( use_ret == -(MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT) ) mbedtls_snprintf( buf, buflen, "X509 - Format not recognized as DER or PEM" ); if( use_ret == -(MBEDTLS_ERR_X509_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "X509 - Input invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "X509 - Allocation of memory failed" ); if( use_ret == -(MBEDTLS_ERR_X509_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "X509 - Read/write of file failed" ); if( use_ret == -(MBEDTLS_ERR_X509_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "X509 - Destination buffer is too small" ); if( use_ret == -(MBEDTLS_ERR_X509_FATAL_ERROR) ) mbedtls_snprintf( buf, buflen, "X509 - A fatal error occured, eg the chain is too long or the vrfy callback failed" ); #endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */ // END generated code if( strlen( buf ) == 0 ) mbedtls_snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret ); } use_ret = ret & ~0xFF80; if( use_ret == 0 ) return; // If high level code is present, make a concatenation between both // error strings. // len = strlen( buf ); if( len > 0 ) { if( buflen - len < 5 ) return; mbedtls_snprintf( buf + len, buflen - len, " : " ); buf += len + 3; buflen -= len + 3; } // Low level error codes // // BEGIN generated code #if defined(MBEDTLS_AES_C) if( use_ret == -(MBEDTLS_ERR_AES_INVALID_KEY_LENGTH) ) mbedtls_snprintf( buf, buflen, "AES - Invalid key length" ); if( use_ret == -(MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "AES - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_AES_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "AES - Invalid input data" ); if( use_ret == -(MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "AES - Feature not available. For example, an unsupported AES key size" ); if( use_ret == -(MBEDTLS_ERR_AES_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "AES - AES hardware accelerator failed" ); #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_ARC4_C) if( use_ret == -(MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "ARC4 - ARC4 hardware accelerator failed" ); #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_ARIA_C) if( use_ret == -(MBEDTLS_ERR_ARIA_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "ARIA - Bad input data" ); if( use_ret == -(MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "ARIA - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "ARIA - Feature not available. For example, an unsupported ARIA key size" ); if( use_ret == -(MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "ARIA - ARIA hardware accelerator failed" ); #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_ASN1_PARSE_C) if( use_ret == -(MBEDTLS_ERR_ASN1_OUT_OF_DATA) ) mbedtls_snprintf( buf, buflen, "ASN1 - Out of data when parsing an ASN1 data structure" ); if( use_ret == -(MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) ) mbedtls_snprintf( buf, buflen, "ASN1 - ASN1 tag was of an unexpected value" ); if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_LENGTH) ) mbedtls_snprintf( buf, buflen, "ASN1 - Error when trying to determine the length or invalid length" ); if( use_ret == -(MBEDTLS_ERR_ASN1_LENGTH_MISMATCH) ) mbedtls_snprintf( buf, buflen, "ASN1 - Actual length differs from expected length" ); if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_DATA) ) mbedtls_snprintf( buf, buflen, "ASN1 - Data is invalid. (not used)" ); if( use_ret == -(MBEDTLS_ERR_ASN1_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "ASN1 - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "ASN1 - Buffer too small when writing ASN.1 data structure" ); #endif /* MBEDTLS_ASN1_PARSE_C */ #if defined(MBEDTLS_BASE64_C) if( use_ret == -(MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "BASE64 - Output buffer too small" ); if( use_ret == -(MBEDTLS_ERR_BASE64_INVALID_CHARACTER) ) mbedtls_snprintf( buf, buflen, "BASE64 - Invalid character in input" ); #endif /* MBEDTLS_BASE64_C */ #if defined(MBEDTLS_BIGNUM_C) if( use_ret == -(MBEDTLS_ERR_MPI_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "BIGNUM - An error occurred while reading from or writing to a file" ); if( use_ret == -(MBEDTLS_ERR_MPI_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "BIGNUM - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_MPI_INVALID_CHARACTER) ) mbedtls_snprintf( buf, buflen, "BIGNUM - There is an invalid character in the digit string" ); if( use_ret == -(MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The buffer is too small to write to" ); if( use_ret == -(MBEDTLS_ERR_MPI_NEGATIVE_VALUE) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The input arguments are negative or result in illegal output" ); if( use_ret == -(MBEDTLS_ERR_MPI_DIVISION_BY_ZERO) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The input argument for division is zero, which is not allowed" ); if( use_ret == -(MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The input arguments are not acceptable" ); if( use_ret == -(MBEDTLS_ERR_MPI_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "BIGNUM - Memory allocation failed" ); #endif /* MBEDTLS_BIGNUM_C */ #if defined(MBEDTLS_BLOWFISH_C) if( use_ret == -(MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "BLOWFISH - Bad input data" ); if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "BLOWFISH - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "BLOWFISH - Blowfish hardware accelerator failed" ); #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_CAMELLIA_C) if( use_ret == -(MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "CAMELLIA - Bad input data" ); if( use_ret == -(MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "CAMELLIA - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CAMELLIA - Camellia hardware accelerator failed" ); #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_CCM_C) if( use_ret == -(MBEDTLS_ERR_CCM_BAD_INPUT) ) mbedtls_snprintf( buf, buflen, "CCM - Bad input parameters to the function" ); if( use_ret == -(MBEDTLS_ERR_CCM_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "CCM - Authenticated decryption failed" ); if( use_ret == -(MBEDTLS_ERR_CCM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CCM - CCM hardware accelerator failed" ); #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CHACHA20_C) if( use_ret == -(MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "CHACHA20 - Invalid input parameter(s)" ); if( use_ret == -(MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "CHACHA20 - Feature not available. For example, s part of the API is not implemented" ); if( use_ret == -(MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CHACHA20 - Chacha20 hardware accelerator failed" ); #endif /* MBEDTLS_CHACHA20_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if( use_ret == -(MBEDTLS_ERR_CHACHAPOLY_BAD_STATE) ) mbedtls_snprintf( buf, buflen, "CHACHAPOLY - The requested operation is not permitted in the current state" ); if( use_ret == -(MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "CHACHAPOLY - Authenticated decryption failed: data was not authentic" ); #endif /* MBEDTLS_CHACHAPOLY_C */ #if defined(MBEDTLS_CMAC_C) if( use_ret == -(MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CMAC - CMAC hardware accelerator failed" ); #endif /* MBEDTLS_CMAC_C */ #if defined(MBEDTLS_CTR_DRBG_C) if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - The entropy source failed" ); if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - The requested random buffer length is too big" ); if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - The input (entropy + additional data) is too large" ); if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - Read or write error in file" ); #endif /* MBEDTLS_CTR_DRBG_C */ #if defined(MBEDTLS_DES_C) if( use_ret == -(MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "DES - The data input has an invalid length" ); if( use_ret == -(MBEDTLS_ERR_DES_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "DES - DES hardware accelerator failed" ); #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ENTROPY_C) if( use_ret == -(MBEDTLS_ERR_ENTROPY_SOURCE_FAILED) ) mbedtls_snprintf( buf, buflen, "ENTROPY - Critical entropy source failure" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_MAX_SOURCES) ) mbedtls_snprintf( buf, buflen, "ENTROPY - No more sources can be added" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED) ) mbedtls_snprintf( buf, buflen, "ENTROPY - No sources have been added to poll" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE) ) mbedtls_snprintf( buf, buflen, "ENTROPY - No strong sources have been added to poll" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "ENTROPY - Read/write error in file" ); #endif /* MBEDTLS_ENTROPY_C */ #if defined(MBEDTLS_GCM_C) if( use_ret == -(MBEDTLS_ERR_GCM_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "GCM - Authenticated decryption failed" ); if( use_ret == -(MBEDTLS_ERR_GCM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "GCM - GCM hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_GCM_BAD_INPUT) ) mbedtls_snprintf( buf, buflen, "GCM - Bad input parameters to function" ); #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_HKDF_C) if( use_ret == -(MBEDTLS_ERR_HKDF_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "HKDF - Bad input parameters to function" ); #endif /* MBEDTLS_HKDF_C */ #if defined(MBEDTLS_HMAC_DRBG_C) if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Too many random requested in single call" ); if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Input too large (Entropy + additional)" ); if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Read/write error in file" ); if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - The entropy source failed" ); #endif /* MBEDTLS_HMAC_DRBG_C */ #if defined(MBEDTLS_MD2_C) if( use_ret == -(MBEDTLS_ERR_MD2_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD2 - MD2 hardware accelerator failed" ); #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) if( use_ret == -(MBEDTLS_ERR_MD4_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD4 - MD4 hardware accelerator failed" ); #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) if( use_ret == -(MBEDTLS_ERR_MD5_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD5 - MD5 hardware accelerator failed" ); #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_NET_C) if( use_ret == -(MBEDTLS_ERR_NET_SOCKET_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Failed to open a socket" ); if( use_ret == -(MBEDTLS_ERR_NET_CONNECT_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - The connection to the given server / port failed" ); if( use_ret == -(MBEDTLS_ERR_NET_BIND_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Binding of the socket failed" ); if( use_ret == -(MBEDTLS_ERR_NET_LISTEN_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Could not listen on the socket" ); if( use_ret == -(MBEDTLS_ERR_NET_ACCEPT_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Could not accept the incoming connection" ); if( use_ret == -(MBEDTLS_ERR_NET_RECV_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Reading information from the socket failed" ); if( use_ret == -(MBEDTLS_ERR_NET_SEND_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Sending information through the socket failed" ); if( use_ret == -(MBEDTLS_ERR_NET_CONN_RESET) ) mbedtls_snprintf( buf, buflen, "NET - Connection was reset by peer" ); if( use_ret == -(MBEDTLS_ERR_NET_UNKNOWN_HOST) ) mbedtls_snprintf( buf, buflen, "NET - Failed to get an IP address for the given hostname" ); if( use_ret == -(MBEDTLS_ERR_NET_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "NET - Buffer is too small to hold the data" ); if( use_ret == -(MBEDTLS_ERR_NET_INVALID_CONTEXT) ) mbedtls_snprintf( buf, buflen, "NET - The context is invalid, eg because it was free()ed" ); if( use_ret == -(MBEDTLS_ERR_NET_POLL_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Polling the net context failed" ); if( use_ret == -(MBEDTLS_ERR_NET_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "NET - Input invalid" ); #endif /* MBEDTLS_NET_C */ #if defined(MBEDTLS_OID_C) if( use_ret == -(MBEDTLS_ERR_OID_NOT_FOUND) ) mbedtls_snprintf( buf, buflen, "OID - OID is not found" ); if( use_ret == -(MBEDTLS_ERR_OID_BUF_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "OID - output buffer is too small" ); #endif /* MBEDTLS_OID_C */ #if defined(MBEDTLS_PADLOCK_C) if( use_ret == -(MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED) ) mbedtls_snprintf( buf, buflen, "PADLOCK - Input data should be aligned" ); #endif /* MBEDTLS_PADLOCK_C */ #if defined(MBEDTLS_PLATFORM_C) if( use_ret == -(MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "PLATFORM - Hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED) ) mbedtls_snprintf( buf, buflen, "PLATFORM - The requested feature is not supported by the platform" ); #endif /* MBEDTLS_PLATFORM_C */ #if defined(MBEDTLS_POLY1305_C) if( use_ret == -(MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "POLY1305 - Invalid input parameter(s)" ); if( use_ret == -(MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "POLY1305 - Feature not available. For example, s part of the API is not implemented" ); if( use_ret == -(MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "POLY1305 - Poly1305 hardware accelerator failed" ); #endif /* MBEDTLS_POLY1305_C */ #if defined(MBEDTLS_RIPEMD160_C) if( use_ret == -(MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "RIPEMD160 - RIPEMD160 hardware accelerator failed" ); #endif /* MBEDTLS_RIPEMD160_C */ #if defined(MBEDTLS_SHA1_C) if( use_ret == -(MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SHA1 - SHA-1 hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_SHA1_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SHA1 - SHA-1 input data was malformed" ); #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) if( use_ret == -(MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SHA256 - SHA-256 hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_SHA256_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SHA256 - SHA-256 input data was malformed" ); #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) if( use_ret == -(MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SHA512 - SHA-512 hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_SHA512_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SHA512 - SHA-512 input data was malformed" ); #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_THREADING_C) if( use_ret == -(MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "THREADING - The selected feature is not available" ); if( use_ret == -(MBEDTLS_ERR_THREADING_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "THREADING - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_THREADING_MUTEX_ERROR) ) mbedtls_snprintf( buf, buflen, "THREADING - Locking / unlocking / free failed with error code" ); #endif /* MBEDTLS_THREADING_C */ #if defined(MBEDTLS_XTEA_C) if( use_ret == -(MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "XTEA - The data input has an invalid length" ); if( use_ret == -(MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "XTEA - XTEA hardware accelerator failed" ); #endif /* MBEDTLS_XTEA_C */ // END generated code if( strlen( buf ) != 0 ) return; mbedtls_snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret ); } #else /* MBEDTLS_ERROR_C */ #if defined(MBEDTLS_ERROR_STRERROR_DUMMY) /* * Provide an non-function in case MBEDTLS_ERROR_C is not defined */ void mbedtls_strerror( int ret, char *buf, size_t buflen ) { ((void) ret); if( buflen > 0 ) buf[0] = '\0'; } #endif /* MBEDTLS_ERROR_STRERROR_DUMMY */ #endif /* MBEDTLS_ERROR_C */ fldigi-4.1.06/src/mbedtls/ecjpake.c0000664000175000017500000011440013507401434013753 00000000000000/* * Elliptic curve J-PAKE * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References in the code are to the Thread v1.0 Specification, * available to members of the Thread Group http://threadgroup.org/ */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECJPAKE_C) #include "mbedtls/ecjpake.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_ECJPAKE_ALT) /* Parameter validation macros based on platform_util.h */ #define ECJPAKE_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECJPAKE_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * Convert a mbedtls_ecjpake_role to identifier string */ static const char * const ecjpake_id[] = { "client", "server" }; #define ID_MINE ( ecjpake_id[ ctx->role ] ) #define ID_PEER ( ecjpake_id[ 1 - ctx->role ] ) /* * Initialize context */ void mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx ) { ECJPAKE_VALIDATE( ctx != NULL ); ctx->md_info = NULL; mbedtls_ecp_group_init( &ctx->grp ); ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; mbedtls_ecp_point_init( &ctx->Xm1 ); mbedtls_ecp_point_init( &ctx->Xm2 ); mbedtls_ecp_point_init( &ctx->Xp1 ); mbedtls_ecp_point_init( &ctx->Xp2 ); mbedtls_ecp_point_init( &ctx->Xp ); mbedtls_mpi_init( &ctx->xm1 ); mbedtls_mpi_init( &ctx->xm2 ); mbedtls_mpi_init( &ctx->s ); } /* * Free context */ void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx ) { if( ctx == NULL ) return; ctx->md_info = NULL; mbedtls_ecp_group_free( &ctx->grp ); mbedtls_ecp_point_free( &ctx->Xm1 ); mbedtls_ecp_point_free( &ctx->Xm2 ); mbedtls_ecp_point_free( &ctx->Xp1 ); mbedtls_ecp_point_free( &ctx->Xp2 ); mbedtls_ecp_point_free( &ctx->Xp ); mbedtls_mpi_free( &ctx->xm1 ); mbedtls_mpi_free( &ctx->xm2 ); mbedtls_mpi_free( &ctx->s ); } /* * Setup context */ int mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx, mbedtls_ecjpake_role role, mbedtls_md_type_t hash, mbedtls_ecp_group_id curve, const unsigned char *secret, size_t len ) { int ret; ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( role == MBEDTLS_ECJPAKE_CLIENT || role == MBEDTLS_ECJPAKE_SERVER ); ECJPAKE_VALIDATE_RET( secret != NULL || len == 0 ); ctx->role = role; if( ( ctx->md_info = mbedtls_md_info_from_type( hash ) ) == NULL ) return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE ); MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ctx->grp, curve ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->s, secret, len ) ); cleanup: if( ret != 0 ) mbedtls_ecjpake_free( ctx ); return( ret ); } /* * Check if context is ready for use */ int mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx ) { ECJPAKE_VALIDATE_RET( ctx != NULL ); if( ctx->md_info == NULL || ctx->grp.id == MBEDTLS_ECP_DP_NONE || ctx->s.p == NULL ) { return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } return( 0 ); } /* * Write a point plus its length to a buffer */ static int ecjpake_write_len_point( unsigned char **p, const unsigned char *end, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *P ) { int ret; size_t len; /* Need at least 4 for length plus 1 for point */ if( end < *p || end - *p < 5 ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); ret = mbedtls_ecp_point_write_binary( grp, P, pf, &len, *p + 4, end - ( *p + 4 ) ); if( ret != 0 ) return( ret ); (*p)[0] = (unsigned char)( ( len >> 24 ) & 0xFF ); (*p)[1] = (unsigned char)( ( len >> 16 ) & 0xFF ); (*p)[2] = (unsigned char)( ( len >> 8 ) & 0xFF ); (*p)[3] = (unsigned char)( ( len ) & 0xFF ); *p += 4 + len; return( 0 ); } /* * Size of the temporary buffer for ecjpake_hash: * 3 EC points plus their length, plus ID and its length (4 + 6 bytes) */ #define ECJPAKE_HASH_BUF_LEN ( 3 * ( 4 + MBEDTLS_ECP_MAX_PT_LEN ) + 4 + 6 ) /* * Compute hash for ZKP (7.4.2.2.2.1) */ static int ecjpake_hash( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, const mbedtls_ecp_point *V, const mbedtls_ecp_point *X, const char *id, mbedtls_mpi *h ) { int ret; unsigned char buf[ECJPAKE_HASH_BUF_LEN]; unsigned char *p = buf; const unsigned char *end = buf + sizeof( buf ); const size_t id_len = strlen( id ); unsigned char hash[MBEDTLS_MD_MAX_SIZE]; /* Write things to temporary buffer */ MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, G ) ); MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, V ) ); MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, X ) ); if( end - p < 4 ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); *p++ = (unsigned char)( ( id_len >> 24 ) & 0xFF ); *p++ = (unsigned char)( ( id_len >> 16 ) & 0xFF ); *p++ = (unsigned char)( ( id_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( id_len ) & 0xFF ); if( end < p || (size_t)( end - p ) < id_len ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); memcpy( p, id, id_len ); p += id_len; /* Compute hash */ mbedtls_md( md_info, buf, p - buf, hash ); /* Turn it into an integer mod n */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( h, hash, mbedtls_md_get_size( md_info ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( h, h, &grp->N ) ); cleanup: return( ret ); } /* * Parse a ECShnorrZKP (7.4.2.2.2) and verify it (7.4.2.3.3) */ static int ecjpake_zkp_read( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, const mbedtls_ecp_point *X, const char *id, const unsigned char **p, const unsigned char *end ) { int ret; mbedtls_ecp_point V, VV; mbedtls_mpi r, h; size_t r_len; mbedtls_ecp_point_init( &V ); mbedtls_ecp_point_init( &VV ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &h ); /* * struct { * ECPoint V; * opaque r<1..2^8-1>; * } ECSchnorrZKP; */ if( end < *p ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, &V, p, end - *p ) ); if( end < *p || (size_t)( end - *p ) < 1 ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } r_len = *(*p)++; if( end < *p || (size_t)( end - *p ) < r_len ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &r, *p, r_len ) ); *p += r_len; /* * Verification */ MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( (mbedtls_ecp_group *) grp, &VV, &h, X, &r, G ) ); if( mbedtls_ecp_point_cmp( &VV, &V ) != 0 ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } cleanup: mbedtls_ecp_point_free( &V ); mbedtls_ecp_point_free( &VV ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &h ); return( ret ); } /* * Generate ZKP (7.4.2.3.2) and write it as ECSchnorrZKP (7.4.2.2.2) */ static int ecjpake_zkp_write( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, const mbedtls_mpi *x, const mbedtls_ecp_point *X, const char *id, unsigned char **p, const unsigned char *end, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecp_point V; mbedtls_mpi v; mbedtls_mpi h; /* later recycled to hold r */ size_t len; if( end < *p ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); mbedtls_ecp_point_init( &V ); mbedtls_mpi_init( &v ); mbedtls_mpi_init( &h ); /* Compute signature */ MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp, G, &v, &V, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &h, &h, x ) ); /* x*h */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &h, &v, &h ) ); /* v - x*h */ MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &h, &h, &grp->N ) ); /* r */ /* Write it out */ MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, &V, pf, &len, *p, end - *p ) ); *p += len; len = mbedtls_mpi_size( &h ); /* actually r */ if( end < *p || (size_t)( end - *p ) < 1 + len || len > 255 ) { ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; goto cleanup; } *(*p)++ = (unsigned char)( len & 0xFF ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, *p, len ) ); /* r */ *p += len; cleanup: mbedtls_ecp_point_free( &V ); mbedtls_mpi_free( &v ); mbedtls_mpi_free( &h ); return( ret ); } /* * Parse a ECJPAKEKeyKP (7.4.2.2.1) and check proof * Output: verified public key X */ static int ecjpake_kkp_read( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_ecp_point *X, const char *id, const unsigned char **p, const unsigned char *end ) { int ret; if( end < *p ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * struct { * ECPoint X; * ECSchnorrZKP zkp; * } ECJPAKEKeyKP; */ MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, X, p, end - *p ) ); if( mbedtls_ecp_is_zero( X ) ) { ret = MBEDTLS_ERR_ECP_INVALID_KEY; goto cleanup; } MBEDTLS_MPI_CHK( ecjpake_zkp_read( md_info, grp, pf, G, X, id, p, end ) ); cleanup: return( ret ); } /* * Generate an ECJPAKEKeyKP * Output: the serialized structure, plus private/public key pair */ static int ecjpake_kkp_write( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_mpi *x, mbedtls_ecp_point *X, const char *id, unsigned char **p, const unsigned char *end, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; size_t len; if( end < *p ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); /* Generate key (7.4.2.3.1) and write it out */ MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp, G, x, X, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, X, pf, &len, *p, end - *p ) ); *p += len; /* Generate and write proof */ MBEDTLS_MPI_CHK( ecjpake_zkp_write( md_info, grp, pf, G, x, X, id, p, end, f_rng, p_rng ) ); cleanup: return( ret ); } /* * Read a ECJPAKEKeyKPPairList (7.4.2.3) and check proofs * Ouputs: verified peer public keys Xa, Xb */ static int ecjpake_kkpp_read( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_ecp_point *Xa, mbedtls_ecp_point *Xb, const char *id, const unsigned char *buf, size_t len ) { int ret; const unsigned char *p = buf; const unsigned char *end = buf + len; /* * struct { * ECJPAKEKeyKP ecjpake_key_kp_pair_list[2]; * } ECJPAKEKeyKPPairList; */ MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xa, id, &p, end ) ); MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xb, id, &p, end ) ); if( p != end ) ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; cleanup: return( ret ); } /* * Generate a ECJPAKEKeyKPPairList * Outputs: the serialized structure, plus two private/public key pairs */ static int ecjpake_kkpp_write( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_mpi *xm1, mbedtls_ecp_point *Xa, mbedtls_mpi *xm2, mbedtls_ecp_point *Xb, const char *id, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char *p = buf; const unsigned char *end = buf + len; MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm1, Xa, id, &p, end, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm2, Xb, id, &p, end, f_rng, p_rng ) ); *olen = p - buf; cleanup: return( ret ); } /* * Read and process the first round message */ int mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ) { ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); return( ecjpake_kkpp_read( ctx->md_info, &ctx->grp, ctx->point_format, &ctx->grp.G, &ctx->Xp1, &ctx->Xp2, ID_PEER, buf, len ) ); } /* * Generate and write the first round message */ int mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); ECJPAKE_VALIDATE_RET( olen != NULL ); ECJPAKE_VALIDATE_RET( f_rng != NULL ); return( ecjpake_kkpp_write( ctx->md_info, &ctx->grp, ctx->point_format, &ctx->grp.G, &ctx->xm1, &ctx->Xm1, &ctx->xm2, &ctx->Xm2, ID_MINE, buf, len, olen, f_rng, p_rng ) ); } /* * Compute the sum of three points R = A + B + C */ static int ecjpake_ecp_add3( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *A, const mbedtls_ecp_point *B, const mbedtls_ecp_point *C ) { int ret; mbedtls_mpi one; mbedtls_mpi_init( &one ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, A, &one, B ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, R, &one, C ) ); cleanup: mbedtls_mpi_free( &one ); return( ret ); } /* * Read and process second round message (C: 7.4.2.5, S: 7.4.2.6) */ int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ) { int ret; const unsigned char *p = buf; const unsigned char *end = buf + len; mbedtls_ecp_group grp; mbedtls_ecp_point G; /* C: GB, S: GA */ ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); mbedtls_ecp_group_init( &grp ); mbedtls_ecp_point_init( &G ); /* * Server: GA = X3 + X4 + X1 (7.4.2.6.1) * Client: GB = X1 + X2 + X3 (7.4.2.5.1) * Unified: G = Xm1 + Xm2 + Xp1 * We need that before parsing in order to check Xp as we read it */ MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G, &ctx->Xm1, &ctx->Xm2, &ctx->Xp1 ) ); /* * struct { * ECParameters curve_params; // only client reading server msg * ECJPAKEKeyKP ecjpake_key_kp; * } Client/ServerECJPAKEParams; */ if( ctx->role == MBEDTLS_ECJPAKE_CLIENT ) { MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_group( &grp, &p, len ) ); if( grp.id != ctx->grp.id ) { ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; goto cleanup; } } MBEDTLS_MPI_CHK( ecjpake_kkp_read( ctx->md_info, &ctx->grp, ctx->point_format, &G, &ctx->Xp, ID_PEER, &p, end ) ); if( p != end ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } cleanup: mbedtls_ecp_group_free( &grp ); mbedtls_ecp_point_free( &G ); return( ret ); } /* * Compute R = +/- X * S mod N, taking care not to leak S */ static int ecjpake_mul_secret( mbedtls_mpi *R, int sign, const mbedtls_mpi *X, const mbedtls_mpi *S, const mbedtls_mpi *N, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi b; /* Blinding value, then s + N * blinding */ mbedtls_mpi_init( &b ); /* b = s + rnd-128-bit * N */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &b, 16, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &b, &b, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &b, &b, S ) ); /* R = sign * X * b mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( R, X, &b ) ); R->s *= sign; MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( R, R, N ) ); cleanup: mbedtls_mpi_free( &b ); return( ret ); } /* * Generate and write the second round message (S: 7.4.2.5, C: 7.4.2.6) */ int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecp_point G; /* C: GA, S: GB */ mbedtls_ecp_point Xm; /* C: Xc, S: Xs */ mbedtls_mpi xm; /* C: xc, S: xs */ unsigned char *p = buf; const unsigned char *end = buf + len; size_t ec_len; ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); ECJPAKE_VALIDATE_RET( olen != NULL ); ECJPAKE_VALIDATE_RET( f_rng != NULL ); mbedtls_ecp_point_init( &G ); mbedtls_ecp_point_init( &Xm ); mbedtls_mpi_init( &xm ); /* * First generate private/public key pair (S: 7.4.2.5.1, C: 7.4.2.6.1) * * Client: GA = X1 + X3 + X4 | xs = x2 * s | Xc = xc * GA * Server: GB = X3 + X1 + X2 | xs = x4 * s | Xs = xs * GB * Unified: G = Xm1 + Xp1 + Xp2 | xm = xm2 * s | Xm = xm * G */ MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G, &ctx->Xp1, &ctx->Xp2, &ctx->Xm1 ) ); MBEDTLS_MPI_CHK( ecjpake_mul_secret( &xm, 1, &ctx->xm2, &ctx->s, &ctx->grp.N, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &Xm, &xm, &G, f_rng, p_rng ) ); /* * Now write things out * * struct { * ECParameters curve_params; // only server writing its message * ECJPAKEKeyKP ecjpake_key_kp; * } Client/ServerECJPAKEParams; */ if( ctx->role == MBEDTLS_ECJPAKE_SERVER ) { if( end < p ) { ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_group( &ctx->grp, &ec_len, p, end - p ) ); p += ec_len; } if( end < p ) { ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( &ctx->grp, &Xm, ctx->point_format, &ec_len, p, end - p ) ); p += ec_len; MBEDTLS_MPI_CHK( ecjpake_zkp_write( ctx->md_info, &ctx->grp, ctx->point_format, &G, &xm, &Xm, ID_MINE, &p, end, f_rng, p_rng ) ); *olen = p - buf; cleanup: mbedtls_ecp_point_free( &G ); mbedtls_ecp_point_free( &Xm ); mbedtls_mpi_free( &xm ); return( ret ); } /* * Derive PMS (7.4.2.7 / 7.4.2.8) */ int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecp_point K; mbedtls_mpi m_xm2_s, one; unsigned char kx[MBEDTLS_ECP_MAX_BYTES]; size_t x_bytes; ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); ECJPAKE_VALIDATE_RET( olen != NULL ); ECJPAKE_VALIDATE_RET( f_rng != NULL ); *olen = mbedtls_md_get_size( ctx->md_info ); if( len < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); mbedtls_ecp_point_init( &K ); mbedtls_mpi_init( &m_xm2_s ); mbedtls_mpi_init( &one ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) ); /* * Client: K = ( Xs - X4 * x2 * s ) * x2 * Server: K = ( Xc - X2 * x4 * s ) * x4 * Unified: K = ( Xp - Xp2 * xm2 * s ) * xm2 */ MBEDTLS_MPI_CHK( ecjpake_mul_secret( &m_xm2_s, -1, &ctx->xm2, &ctx->s, &ctx->grp.N, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( &ctx->grp, &K, &one, &ctx->Xp, &m_xm2_s, &ctx->Xp2 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &K, &ctx->xm2, &K, f_rng, p_rng ) ); /* PMS = SHA-256( K.X ) */ x_bytes = ( ctx->grp.pbits + 7 ) / 8; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &K.X, kx, x_bytes ) ); MBEDTLS_MPI_CHK( mbedtls_md( ctx->md_info, kx, x_bytes, buf ) ); cleanup: mbedtls_ecp_point_free( &K ); mbedtls_mpi_free( &m_xm2_s ); mbedtls_mpi_free( &one ); return( ret ); } #undef ID_MINE #undef ID_PEER #endif /* ! MBEDTLS_ECJPAKE_ALT */ #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif #if !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ !defined(MBEDTLS_SHA256_C) int mbedtls_ecjpake_self_test( int verbose ) { (void) verbose; return( 0 ); } #else static const unsigned char ecjpake_test_password[] = { 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x6a, 0x70, 0x61, 0x6b, 0x65, 0x74, 0x65, 0x73, 0x74 }; static const unsigned char ecjpake_test_x1[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21 }; static const unsigned char ecjpake_test_x2[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81 }; static const unsigned char ecjpake_test_x3[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81 }; static const unsigned char ecjpake_test_x4[] = { 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe1 }; static const unsigned char ecjpake_test_cli_one[] = { 0x41, 0x04, 0xac, 0xcf, 0x01, 0x06, 0xef, 0x85, 0x8f, 0xa2, 0xd9, 0x19, 0x33, 0x13, 0x46, 0x80, 0x5a, 0x78, 0xb5, 0x8b, 0xba, 0xd0, 0xb8, 0x44, 0xe5, 0xc7, 0x89, 0x28, 0x79, 0x14, 0x61, 0x87, 0xdd, 0x26, 0x66, 0xad, 0xa7, 0x81, 0xbb, 0x7f, 0x11, 0x13, 0x72, 0x25, 0x1a, 0x89, 0x10, 0x62, 0x1f, 0x63, 0x4d, 0xf1, 0x28, 0xac, 0x48, 0xe3, 0x81, 0xfd, 0x6e, 0xf9, 0x06, 0x07, 0x31, 0xf6, 0x94, 0xa4, 0x41, 0x04, 0x1d, 0xd0, 0xbd, 0x5d, 0x45, 0x66, 0xc9, 0xbe, 0xd9, 0xce, 0x7d, 0xe7, 0x01, 0xb5, 0xe8, 0x2e, 0x08, 0xe8, 0x4b, 0x73, 0x04, 0x66, 0x01, 0x8a, 0xb9, 0x03, 0xc7, 0x9e, 0xb9, 0x82, 0x17, 0x22, 0x36, 0xc0, 0xc1, 0x72, 0x8a, 0xe4, 0xbf, 0x73, 0x61, 0x0d, 0x34, 0xde, 0x44, 0x24, 0x6e, 0xf3, 0xd9, 0xc0, 0x5a, 0x22, 0x36, 0xfb, 0x66, 0xa6, 0x58, 0x3d, 0x74, 0x49, 0x30, 0x8b, 0xab, 0xce, 0x20, 0x72, 0xfe, 0x16, 0x66, 0x29, 0x92, 0xe9, 0x23, 0x5c, 0x25, 0x00, 0x2f, 0x11, 0xb1, 0x50, 0x87, 0xb8, 0x27, 0x38, 0xe0, 0x3c, 0x94, 0x5b, 0xf7, 0xa2, 0x99, 0x5d, 0xda, 0x1e, 0x98, 0x34, 0x58, 0x41, 0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7, 0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40, 0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79, 0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1, 0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3, 0x2b, 0xb0, 0x13, 0xbb, 0x2b, 0x41, 0x04, 0xa4, 0x95, 0x58, 0xd3, 0x2e, 0xd1, 0xeb, 0xfc, 0x18, 0x16, 0xaf, 0x4f, 0xf0, 0x9b, 0x55, 0xfc, 0xb4, 0xca, 0x47, 0xb2, 0xa0, 0x2d, 0x1e, 0x7c, 0xaf, 0x11, 0x79, 0xea, 0x3f, 0xe1, 0x39, 0x5b, 0x22, 0xb8, 0x61, 0x96, 0x40, 0x16, 0xfa, 0xba, 0xf7, 0x2c, 0x97, 0x56, 0x95, 0xd9, 0x3d, 0x4d, 0xf0, 0xe5, 0x19, 0x7f, 0xe9, 0xf0, 0x40, 0x63, 0x4e, 0xd5, 0x97, 0x64, 0x93, 0x77, 0x87, 0xbe, 0x20, 0xbc, 0x4d, 0xee, 0xbb, 0xf9, 0xb8, 0xd6, 0x0a, 0x33, 0x5f, 0x04, 0x6c, 0xa3, 0xaa, 0x94, 0x1e, 0x45, 0x86, 0x4c, 0x7c, 0xad, 0xef, 0x9c, 0xf7, 0x5b, 0x3d, 0x8b, 0x01, 0x0e, 0x44, 0x3e, 0xf0 }; static const unsigned char ecjpake_test_srv_one[] = { 0x41, 0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7, 0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40, 0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79, 0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1, 0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3, 0x2b, 0xb0, 0x13, 0xbb, 0x2b, 0x41, 0x04, 0x09, 0xf8, 0x5b, 0x3d, 0x20, 0xeb, 0xd7, 0x88, 0x5c, 0xe4, 0x64, 0xc0, 0x8d, 0x05, 0x6d, 0x64, 0x28, 0xfe, 0x4d, 0xd9, 0x28, 0x7a, 0xa3, 0x65, 0xf1, 0x31, 0xf4, 0x36, 0x0f, 0xf3, 0x86, 0xd8, 0x46, 0x89, 0x8b, 0xc4, 0xb4, 0x15, 0x83, 0xc2, 0xa5, 0x19, 0x7f, 0x65, 0xd7, 0x87, 0x42, 0x74, 0x6c, 0x12, 0xa5, 0xec, 0x0a, 0x4f, 0xfe, 0x2f, 0x27, 0x0a, 0x75, 0x0a, 0x1d, 0x8f, 0xb5, 0x16, 0x20, 0x93, 0x4d, 0x74, 0xeb, 0x43, 0xe5, 0x4d, 0xf4, 0x24, 0xfd, 0x96, 0x30, 0x6c, 0x01, 0x17, 0xbf, 0x13, 0x1a, 0xfa, 0xbf, 0x90, 0xa9, 0xd3, 0x3d, 0x11, 0x98, 0xd9, 0x05, 0x19, 0x37, 0x35, 0x14, 0x41, 0x04, 0x19, 0x0a, 0x07, 0x70, 0x0f, 0xfa, 0x4b, 0xe6, 0xae, 0x1d, 0x79, 0xee, 0x0f, 0x06, 0xae, 0xb5, 0x44, 0xcd, 0x5a, 0xdd, 0xaa, 0xbe, 0xdf, 0x70, 0xf8, 0x62, 0x33, 0x21, 0x33, 0x2c, 0x54, 0xf3, 0x55, 0xf0, 0xfb, 0xfe, 0xc7, 0x83, 0xed, 0x35, 0x9e, 0x5d, 0x0b, 0xf7, 0x37, 0x7a, 0x0f, 0xc4, 0xea, 0x7a, 0xce, 0x47, 0x3c, 0x9c, 0x11, 0x2b, 0x41, 0xcc, 0xd4, 0x1a, 0xc5, 0x6a, 0x56, 0x12, 0x41, 0x04, 0x36, 0x0a, 0x1c, 0xea, 0x33, 0xfc, 0xe6, 0x41, 0x15, 0x64, 0x58, 0xe0, 0xa4, 0xea, 0xc2, 0x19, 0xe9, 0x68, 0x31, 0xe6, 0xae, 0xbc, 0x88, 0xb3, 0xf3, 0x75, 0x2f, 0x93, 0xa0, 0x28, 0x1d, 0x1b, 0xf1, 0xfb, 0x10, 0x60, 0x51, 0xdb, 0x96, 0x94, 0xa8, 0xd6, 0xe8, 0x62, 0xa5, 0xef, 0x13, 0x24, 0xa3, 0xd9, 0xe2, 0x78, 0x94, 0xf1, 0xee, 0x4f, 0x7c, 0x59, 0x19, 0x99, 0x65, 0xa8, 0xdd, 0x4a, 0x20, 0x91, 0x84, 0x7d, 0x2d, 0x22, 0xdf, 0x3e, 0xe5, 0x5f, 0xaa, 0x2a, 0x3f, 0xb3, 0x3f, 0xd2, 0xd1, 0xe0, 0x55, 0xa0, 0x7a, 0x7c, 0x61, 0xec, 0xfb, 0x8d, 0x80, 0xec, 0x00, 0xc2, 0xc9, 0xeb, 0x12 }; static const unsigned char ecjpake_test_srv_two[] = { 0x03, 0x00, 0x17, 0x41, 0x04, 0x0f, 0xb2, 0x2b, 0x1d, 0x5d, 0x11, 0x23, 0xe0, 0xef, 0x9f, 0xeb, 0x9d, 0x8a, 0x2e, 0x59, 0x0a, 0x1f, 0x4d, 0x7c, 0xed, 0x2c, 0x2b, 0x06, 0x58, 0x6e, 0x8f, 0x2a, 0x16, 0xd4, 0xeb, 0x2f, 0xda, 0x43, 0x28, 0xa2, 0x0b, 0x07, 0xd8, 0xfd, 0x66, 0x76, 0x54, 0xca, 0x18, 0xc5, 0x4e, 0x32, 0xa3, 0x33, 0xa0, 0x84, 0x54, 0x51, 0xe9, 0x26, 0xee, 0x88, 0x04, 0xfd, 0x7a, 0xf0, 0xaa, 0xa7, 0xa6, 0x41, 0x04, 0x55, 0x16, 0xea, 0x3e, 0x54, 0xa0, 0xd5, 0xd8, 0xb2, 0xce, 0x78, 0x6b, 0x38, 0xd3, 0x83, 0x37, 0x00, 0x29, 0xa5, 0xdb, 0xe4, 0x45, 0x9c, 0x9d, 0xd6, 0x01, 0xb4, 0x08, 0xa2, 0x4a, 0xe6, 0x46, 0x5c, 0x8a, 0xc9, 0x05, 0xb9, 0xeb, 0x03, 0xb5, 0xd3, 0x69, 0x1c, 0x13, 0x9e, 0xf8, 0x3f, 0x1c, 0xd4, 0x20, 0x0f, 0x6c, 0x9c, 0xd4, 0xec, 0x39, 0x22, 0x18, 0xa5, 0x9e, 0xd2, 0x43, 0xd3, 0xc8, 0x20, 0xff, 0x72, 0x4a, 0x9a, 0x70, 0xb8, 0x8c, 0xb8, 0x6f, 0x20, 0xb4, 0x34, 0xc6, 0x86, 0x5a, 0xa1, 0xcd, 0x79, 0x06, 0xdd, 0x7c, 0x9b, 0xce, 0x35, 0x25, 0xf5, 0x08, 0x27, 0x6f, 0x26, 0x83, 0x6c }; static const unsigned char ecjpake_test_cli_two[] = { 0x41, 0x04, 0x69, 0xd5, 0x4e, 0xe8, 0x5e, 0x90, 0xce, 0x3f, 0x12, 0x46, 0x74, 0x2d, 0xe5, 0x07, 0xe9, 0x39, 0xe8, 0x1d, 0x1d, 0xc1, 0xc5, 0xcb, 0x98, 0x8b, 0x58, 0xc3, 0x10, 0xc9, 0xfd, 0xd9, 0x52, 0x4d, 0x93, 0x72, 0x0b, 0x45, 0x54, 0x1c, 0x83, 0xee, 0x88, 0x41, 0x19, 0x1d, 0xa7, 0xce, 0xd8, 0x6e, 0x33, 0x12, 0xd4, 0x36, 0x23, 0xc1, 0xd6, 0x3e, 0x74, 0x98, 0x9a, 0xba, 0x4a, 0xff, 0xd1, 0xee, 0x41, 0x04, 0x07, 0x7e, 0x8c, 0x31, 0xe2, 0x0e, 0x6b, 0xed, 0xb7, 0x60, 0xc1, 0x35, 0x93, 0xe6, 0x9f, 0x15, 0xbe, 0x85, 0xc2, 0x7d, 0x68, 0xcd, 0x09, 0xcc, 0xb8, 0xc4, 0x18, 0x36, 0x08, 0x91, 0x7c, 0x5c, 0x3d, 0x40, 0x9f, 0xac, 0x39, 0xfe, 0xfe, 0xe8, 0x2f, 0x72, 0x92, 0xd3, 0x6f, 0x0d, 0x23, 0xe0, 0x55, 0x91, 0x3f, 0x45, 0xa5, 0x2b, 0x85, 0xdd, 0x8a, 0x20, 0x52, 0xe9, 0xe1, 0x29, 0xbb, 0x4d, 0x20, 0x0f, 0x01, 0x1f, 0x19, 0x48, 0x35, 0x35, 0xa6, 0xe8, 0x9a, 0x58, 0x0c, 0x9b, 0x00, 0x03, 0xba, 0xf2, 0x14, 0x62, 0xec, 0xe9, 0x1a, 0x82, 0xcc, 0x38, 0xdb, 0xdc, 0xae, 0x60, 0xd9, 0xc5, 0x4c }; static const unsigned char ecjpake_test_pms[] = { 0xf3, 0xd4, 0x7f, 0x59, 0x98, 0x44, 0xdb, 0x92, 0xa5, 0x69, 0xbb, 0xe7, 0x98, 0x1e, 0x39, 0xd9, 0x31, 0xfd, 0x74, 0x3b, 0xf2, 0x2e, 0x98, 0xf9, 0xb4, 0x38, 0xf7, 0x19, 0xd3, 0xc4, 0xf3, 0x51 }; /* Load my private keys and generate the correponding public keys */ static int ecjpake_test_load( mbedtls_ecjpake_context *ctx, const unsigned char *xm1, size_t len1, const unsigned char *xm2, size_t len2 ) { int ret; MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm1, xm1, len1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm2, xm2, len2 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm1, &ctx->xm1, &ctx->grp.G, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm2, &ctx->xm2, &ctx->grp.G, NULL, NULL ) ); cleanup: return( ret ); } /* For tests we don't need a secure RNG; * use the LGC from Numerical Recipes for simplicity */ static int ecjpake_lgc( void *p, unsigned char *out, size_t len ) { static uint32_t x = 42; (void) p; while( len > 0 ) { size_t use_len = len > 4 ? 4 : len; x = 1664525 * x + 1013904223; memcpy( out, &x, use_len ); out += use_len; len -= use_len; } return( 0 ); } #define TEST_ASSERT( x ) \ do { \ if( x ) \ ret = 0; \ else \ { \ ret = 1; \ goto cleanup; \ } \ } while( 0 ) /* * Checkup routine */ int mbedtls_ecjpake_self_test( int verbose ) { int ret; mbedtls_ecjpake_context cli; mbedtls_ecjpake_context srv; unsigned char buf[512], pms[32]; size_t len, pmslen; mbedtls_ecjpake_init( &cli ); mbedtls_ecjpake_init( &srv ); if( verbose != 0 ) mbedtls_printf( " ECJPAKE test #0 (setup): " ); TEST_ASSERT( mbedtls_ecjpake_setup( &cli, MBEDTLS_ECJPAKE_CLIENT, MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, ecjpake_test_password, sizeof( ecjpake_test_password ) ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_setup( &srv, MBEDTLS_ECJPAKE_SERVER, MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, ecjpake_test_password, sizeof( ecjpake_test_password ) ) == 0 ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " ECJPAKE test #1 (random handshake): " ); TEST_ASSERT( mbedtls_ecjpake_write_round_one( &cli, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_write_round_one( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_write_round_two( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli, pms, sizeof( pms ), &pmslen, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_write_round_two( &cli, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( len == pmslen ); TEST_ASSERT( memcmp( buf, pms, len ) == 0 ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " ECJPAKE test #2 (reference handshake): " ); /* Simulate generation of round one */ MBEDTLS_MPI_CHK( ecjpake_test_load( &cli, ecjpake_test_x1, sizeof( ecjpake_test_x1 ), ecjpake_test_x2, sizeof( ecjpake_test_x2 ) ) ); MBEDTLS_MPI_CHK( ecjpake_test_load( &srv, ecjpake_test_x3, sizeof( ecjpake_test_x3 ), ecjpake_test_x4, sizeof( ecjpake_test_x4 ) ) ); /* Read round one */ TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv, ecjpake_test_cli_one, sizeof( ecjpake_test_cli_one ) ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli, ecjpake_test_srv_one, sizeof( ecjpake_test_srv_one ) ) == 0 ); /* Skip generation of round two, read round two */ TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli, ecjpake_test_srv_two, sizeof( ecjpake_test_srv_two ) ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv, ecjpake_test_cli_two, sizeof( ecjpake_test_cli_two ) ) == 0 ); /* Server derives PMS */ TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( len == sizeof( ecjpake_test_pms ) ); TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 ); memset( buf, 0, len ); /* Avoid interferences with next step */ /* Client derives PMS */ TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( len == sizeof( ecjpake_test_pms ) ); TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: mbedtls_ecjpake_free( &cli ); mbedtls_ecjpake_free( &srv ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; } if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #undef TEST_ASSERT #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED && MBEDTLS_SHA256_C */ #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ECJPAKE_C */ fldigi-4.1.06/src/mbedtls/x509write_csr.c0000664000175000017500000002107413507401434015004 00000000000000/* * X.509 Certificate Signing Request writing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * - CSRs: PKCS#10 v1.7 aka RFC 2986 * - attributes: PKCS#9 v2.0 aka RFC 2985 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CSR_WRITE_C) #include "mbedtls/x509_csr.h" #include "mbedtls/oid.h" #include "mbedtls/asn1write.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx ) { memset( ctx, 0, sizeof( mbedtls_x509write_csr ) ); } void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx ) { mbedtls_asn1_free_named_data_list( &ctx->subject ); mbedtls_asn1_free_named_data_list( &ctx->extensions ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_x509write_csr ) ); } void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg ) { ctx->md_alg = md_alg; } void mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key ) { ctx->key = key; } int mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx, const char *subject_name ) { return mbedtls_x509_string_to_names( &ctx->subject, subject_name ); } int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ) { return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len, 0, val, val_len ); } int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ) { unsigned char buf[4]; unsigned char *c; int ret; c = buf + 4; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &key_usage, 7 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_KEY_USAGE, MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ), buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx, unsigned char ns_cert_type ) { unsigned char buf[4]; unsigned char *c; int ret; c = buf + 4; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE, MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ), buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; const char *sig_oid; size_t sig_oid_len = 0; unsigned char *c, *c2; unsigned char hash[64]; unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; unsigned char tmp_buf[2048]; size_t pub_len = 0, sig_and_oid_len = 0, sig_len; size_t len = 0; mbedtls_pk_type_t pk_alg; /* * Prepare data to be signed in tmp_buf */ c = tmp_buf + sizeof( tmp_buf ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) ); if( len ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( &c, tmp_buf, MBEDTLS_OID_PKCS9_CSR_EXT_REQ, MBEDTLS_OID_SIZE( MBEDTLS_OID_PKCS9_CSR_EXT_REQ ) ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->key, tmp_buf, c - tmp_buf ) ); c -= pub_len; len += pub_len; /* * Subject ::= Name */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) ); /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, tmp_buf, 0 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); /* * Prepare signature */ mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash ); if( ( ret = mbedtls_pk_sign( ctx->key, ctx->md_alg, hash, 0, sig, &sig_len, f_rng, p_rng ) ) != 0 ) { return( ret ); } if( mbedtls_pk_can_do( ctx->key, MBEDTLS_PK_RSA ) ) pk_alg = MBEDTLS_PK_RSA; else if( mbedtls_pk_can_do( ctx->key, MBEDTLS_PK_ECDSA ) ) pk_alg = MBEDTLS_PK_ECDSA; else return( MBEDTLS_ERR_X509_INVALID_ALG ); if( ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg, &sig_oid, &sig_oid_len ) ) != 0 ) { return( ret ); } /* * Write data to output buffer */ c2 = buf + size; MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf, sig_oid, sig_oid_len, sig, sig_len ) ); if( len > (size_t)( c2 - buf ) ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); c2 -= len; memcpy( c2, c, len ); len += sig_and_oid_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } #define PEM_BEGIN_CSR "-----BEGIN CERTIFICATE REQUEST-----\n" #define PEM_END_CSR "-----END CERTIFICATE REQUEST-----\n" #if defined(MBEDTLS_PEM_WRITE_C) int mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char output_buf[4096]; size_t olen = 0; if( ( ret = mbedtls_x509write_csr_der( ctx, output_buf, sizeof(output_buf), f_rng, p_rng ) ) < 0 ) { return( ret ); } if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CSR, PEM_END_CSR, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CSR_WRITE_C */ fldigi-4.1.06/src/mbedtls/md.c0000664000175000017500000003152213507401434012754 00000000000000/** * \file mbedtls_md.c * * \brief Generic message digest wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD_C) #include "mbedtls/md.h" #include "mbedtls/md_internal.h" #include "mbedtls/platform_util.h" #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include #if defined(MBEDTLS_FS_IO) #include #endif /* * Reminder: update profiles in x509_crt.c when adding a new hash! */ static const int supported_digests[] = { #if defined(MBEDTLS_SHA512_C) MBEDTLS_MD_SHA512, MBEDTLS_MD_SHA384, #endif #if defined(MBEDTLS_SHA256_C) MBEDTLS_MD_SHA256, MBEDTLS_MD_SHA224, #endif #if defined(MBEDTLS_SHA1_C) MBEDTLS_MD_SHA1, #endif #if defined(MBEDTLS_RIPEMD160_C) MBEDTLS_MD_RIPEMD160, #endif #if defined(MBEDTLS_MD5_C) MBEDTLS_MD_MD5, #endif #if defined(MBEDTLS_MD4_C) MBEDTLS_MD_MD4, #endif #if defined(MBEDTLS_MD2_C) MBEDTLS_MD_MD2, #endif MBEDTLS_MD_NONE }; const int *mbedtls_md_list( void ) { return( supported_digests ); } const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ) { if( NULL == md_name ) return( NULL ); /* Get the appropriate digest information */ #if defined(MBEDTLS_MD2_C) if( !strcmp( "MD2", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 ); #endif #if defined(MBEDTLS_MD4_C) if( !strcmp( "MD4", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 ); #endif #if defined(MBEDTLS_MD5_C) if( !strcmp( "MD5", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ); #endif #if defined(MBEDTLS_RIPEMD160_C) if( !strcmp( "RIPEMD160", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 ); #endif #if defined(MBEDTLS_SHA1_C) if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ); #endif #if defined(MBEDTLS_SHA256_C) if( !strcmp( "SHA224", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 ); if( !strcmp( "SHA256", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ); #endif #if defined(MBEDTLS_SHA512_C) if( !strcmp( "SHA384", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 ); if( !strcmp( "SHA512", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 ); #endif return( NULL ); } const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ) { switch( md_type ) { #if defined(MBEDTLS_MD2_C) case MBEDTLS_MD_MD2: return( &mbedtls_md2_info ); #endif #if defined(MBEDTLS_MD4_C) case MBEDTLS_MD_MD4: return( &mbedtls_md4_info ); #endif #if defined(MBEDTLS_MD5_C) case MBEDTLS_MD_MD5: return( &mbedtls_md5_info ); #endif #if defined(MBEDTLS_RIPEMD160_C) case MBEDTLS_MD_RIPEMD160: return( &mbedtls_ripemd160_info ); #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_MD_SHA1: return( &mbedtls_sha1_info ); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA224: return( &mbedtls_sha224_info ); case MBEDTLS_MD_SHA256: return( &mbedtls_sha256_info ); #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_MD_SHA384: return( &mbedtls_sha384_info ); case MBEDTLS_MD_SHA512: return( &mbedtls_sha512_info ); #endif default: return( NULL ); } } void mbedtls_md_init( mbedtls_md_context_t *ctx ) { memset( ctx, 0, sizeof( mbedtls_md_context_t ) ); } void mbedtls_md_free( mbedtls_md_context_t *ctx ) { if( ctx == NULL || ctx->md_info == NULL ) return; if( ctx->md_ctx != NULL ) ctx->md_info->ctx_free_func( ctx->md_ctx ); if( ctx->hmac_ctx != NULL ) { mbedtls_platform_zeroize( ctx->hmac_ctx, 2 * ctx->md_info->block_size ); mbedtls_free( ctx->hmac_ctx ); } mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) ); } int mbedtls_md_clone( mbedtls_md_context_t *dst, const mbedtls_md_context_t *src ) { if( dst == NULL || dst->md_info == NULL || src == NULL || src->md_info == NULL || dst->md_info != src->md_info ) { return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); } dst->md_info->clone_func( dst->md_ctx, src->md_ctx ); return( 0 ); } #if ! defined(MBEDTLS_DEPRECATED_REMOVED) int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) { return mbedtls_md_setup( ctx, md_info, 1 ); } #endif int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ) { if( md_info == NULL || ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL ) return( MBEDTLS_ERR_MD_ALLOC_FAILED ); if( hmac != 0 ) { ctx->hmac_ctx = mbedtls_calloc( 2, md_info->block_size ); if( ctx->hmac_ctx == NULL ) { md_info->ctx_free_func( ctx->md_ctx ); return( MBEDTLS_ERR_MD_ALLOC_FAILED ); } } ctx->md_info = md_info; return( 0 ); } int mbedtls_md_starts( mbedtls_md_context_t *ctx ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->starts_func( ctx->md_ctx ) ); } int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) ); } int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->finish_func( ctx->md_ctx, output ) ); } int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, unsigned char *output ) { if( md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( md_info->digest_func( input, ilen, output ) ); } #if defined(MBEDTLS_FS_IO) int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output ) { int ret; FILE *f; size_t n; mbedtls_md_context_t ctx; unsigned char buf[1024]; if( md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_MD_FILE_IO_ERROR ); mbedtls_md_init( &ctx ); if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 ) goto cleanup; if( ( ret = md_info->starts_func( ctx.md_ctx ) ) != 0 ) goto cleanup; while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) if( ( ret = md_info->update_func( ctx.md_ctx, buf, n ) ) != 0 ) goto cleanup; if( ferror( f ) != 0 ) ret = MBEDTLS_ERR_MD_FILE_IO_ERROR; else ret = md_info->finish_func( ctx.md_ctx, output ); cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); fclose( f ); mbedtls_md_free( &ctx ); return( ret ); } #endif /* MBEDTLS_FS_IO */ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen ) { int ret; unsigned char sum[MBEDTLS_MD_MAX_SIZE]; unsigned char *ipad, *opad; size_t i; if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); if( keylen > (size_t) ctx->md_info->block_size ) { if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) goto cleanup; if( ( ret = ctx->md_info->update_func( ctx->md_ctx, key, keylen ) ) != 0 ) goto cleanup; if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, sum ) ) != 0 ) goto cleanup; keylen = ctx->md_info->size; key = sum; } ipad = (unsigned char *) ctx->hmac_ctx; opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; memset( ipad, 0x36, ctx->md_info->block_size ); memset( opad, 0x5C, ctx->md_info->block_size ); for( i = 0; i < keylen; i++ ) { ipad[i] = (unsigned char)( ipad[i] ^ key[i] ); opad[i] = (unsigned char)( opad[i] ^ key[i] ); } if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) goto cleanup; if( ( ret = ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size ) ) != 0 ) goto cleanup; cleanup: mbedtls_platform_zeroize( sum, sizeof( sum ) ); return( ret ); } int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) { if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) ); } int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output ) { int ret; unsigned char tmp[MBEDTLS_MD_MAX_SIZE]; unsigned char *opad; if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, tmp ) ) != 0 ) return( ret ); if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) return( ret ); if( ( ret = ctx->md_info->update_func( ctx->md_ctx, opad, ctx->md_info->block_size ) ) != 0 ) return( ret ); if( ( ret = ctx->md_info->update_func( ctx->md_ctx, tmp, ctx->md_info->size ) ) != 0 ) return( ret ); return( ctx->md_info->finish_func( ctx->md_ctx, output ) ); } int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ) { int ret; unsigned char *ipad; if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); ipad = (unsigned char *) ctx->hmac_ctx; if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) return( ret ); return( ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size ) ); } int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ) { mbedtls_md_context_t ctx; int ret; if( md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); mbedtls_md_init( &ctx ); if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 ) goto cleanup; cleanup: mbedtls_md_free( &ctx ); return( ret ); } int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->process_func( ctx->md_ctx, data ) ); } unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ) { if( md_info == NULL ) return( 0 ); return md_info->size; } mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ) { if( md_info == NULL ) return( MBEDTLS_MD_NONE ); return md_info->type; } const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ) { if( md_info == NULL ) return( NULL ); return md_info->name; } #endif /* MBEDTLS_MD_C */ fldigi-4.1.06/src/mbedtls/hkdf.c0000664000175000017500000001147013507401434013270 00000000000000/* * HKDF implementation -- RFC 5869 * * Copyright (C) 2016-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HKDF_C) #include #include "mbedtls/hkdf.h" #include "mbedtls/platform_util.h" int mbedtls_hkdf( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ) { int ret; unsigned char prk[MBEDTLS_MD_MAX_SIZE]; ret = mbedtls_hkdf_extract( md, salt, salt_len, ikm, ikm_len, prk ); if( ret == 0 ) { ret = mbedtls_hkdf_expand( md, prk, mbedtls_md_get_size( md ), info, info_len, okm, okm_len ); } mbedtls_platform_zeroize( prk, sizeof( prk ) ); return( ret ); } int mbedtls_hkdf_extract( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, unsigned char *prk ) { unsigned char null_salt[MBEDTLS_MD_MAX_SIZE] = { '\0' }; if( salt == NULL ) { size_t hash_len; if( salt_len != 0 ) { return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; } hash_len = mbedtls_md_get_size( md ); if( hash_len == 0 ) { return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; } salt = null_salt; salt_len = hash_len; } return( mbedtls_md_hmac( md, salt, salt_len, ikm, ikm_len, prk ) ); } int mbedtls_hkdf_expand( const mbedtls_md_info_t *md, const unsigned char *prk, size_t prk_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ) { size_t hash_len; size_t where = 0; size_t n; size_t t_len = 0; size_t i; int ret = 0; mbedtls_md_context_t ctx; unsigned char t[MBEDTLS_MD_MAX_SIZE]; if( okm == NULL ) { return( MBEDTLS_ERR_HKDF_BAD_INPUT_DATA ); } hash_len = mbedtls_md_get_size( md ); if( prk_len < hash_len || hash_len == 0 ) { return( MBEDTLS_ERR_HKDF_BAD_INPUT_DATA ); } if( info == NULL ) { info = (const unsigned char *) ""; info_len = 0; } n = okm_len / hash_len; if( (okm_len % hash_len) != 0 ) { n++; } /* * Per RFC 5869 Section 2.3, okm_len must not exceed * 255 times the hash length */ if( n > 255 ) { return( MBEDTLS_ERR_HKDF_BAD_INPUT_DATA ); } mbedtls_md_init( &ctx ); if( (ret = mbedtls_md_setup( &ctx, md, 1) ) != 0 ) { goto exit; } /* * Compute T = T(1) | T(2) | T(3) | ... | T(N) * Where T(N) is defined in RFC 5869 Section 2.3 */ for( i = 1; i <= n; i++ ) { size_t num_to_copy; unsigned char c = i & 0xff; ret = mbedtls_md_hmac_starts( &ctx, prk, prk_len ); if( ret != 0 ) { goto exit; } ret = mbedtls_md_hmac_update( &ctx, t, t_len ); if( ret != 0 ) { goto exit; } ret = mbedtls_md_hmac_update( &ctx, info, info_len ); if( ret != 0 ) { goto exit; } /* The constant concatenated to the end of each T(n) is a single octet. * */ ret = mbedtls_md_hmac_update( &ctx, &c, 1 ); if( ret != 0 ) { goto exit; } ret = mbedtls_md_hmac_finish( &ctx, t ); if( ret != 0 ) { goto exit; } num_to_copy = i != n ? hash_len : okm_len - where; memcpy( okm + where, t, num_to_copy ); where += hash_len; t_len = hash_len; } exit: mbedtls_md_free( &ctx ); mbedtls_platform_zeroize( t, sizeof( t ) ); return( ret ); } #endif /* MBEDTLS_HKDF_C */ fldigi-4.1.06/src/mbedtls/md_wrap.c0000664000175000017500000003375513507401434014017 00000000000000/** * \file md_wrap.c * * \brief Generic message digest wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD_C) #include "mbedtls/md_internal.h" #if defined(MBEDTLS_MD2_C) #include "mbedtls/md2.h" #endif #if defined(MBEDTLS_MD4_C) #include "mbedtls/md4.h" #endif #if defined(MBEDTLS_MD5_C) #include "mbedtls/md5.h" #endif #if defined(MBEDTLS_RIPEMD160_C) #include "mbedtls/ripemd160.h" #endif #if defined(MBEDTLS_SHA1_C) #include "mbedtls/sha1.h" #endif #if defined(MBEDTLS_SHA256_C) #include "mbedtls/sha256.h" #endif #if defined(MBEDTLS_SHA512_C) #include "mbedtls/sha512.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #if defined(MBEDTLS_MD2_C) static int md2_starts_wrap( void *ctx ) { return( mbedtls_md2_starts_ret( (mbedtls_md2_context *) ctx ) ); } static int md2_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_md2_update_ret( (mbedtls_md2_context *) ctx, input, ilen ) ); } static int md2_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_md2_finish_ret( (mbedtls_md2_context *) ctx, output ) ); } static void *md2_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md2_context ) ); if( ctx != NULL ) mbedtls_md2_init( (mbedtls_md2_context *) ctx ); return( ctx ); } static void md2_ctx_free( void *ctx ) { mbedtls_md2_free( (mbedtls_md2_context *) ctx ); mbedtls_free( ctx ); } static void md2_clone_wrap( void *dst, const void *src ) { mbedtls_md2_clone( (mbedtls_md2_context *) dst, (const mbedtls_md2_context *) src ); } static int md2_process_wrap( void *ctx, const unsigned char *data ) { ((void) data); return( mbedtls_internal_md2_process( (mbedtls_md2_context *) ctx ) ); } const mbedtls_md_info_t mbedtls_md2_info = { MBEDTLS_MD_MD2, "MD2", 16, 16, md2_starts_wrap, md2_update_wrap, md2_finish_wrap, mbedtls_md2_ret, md2_ctx_alloc, md2_ctx_free, md2_clone_wrap, md2_process_wrap, }; #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) static int md4_starts_wrap( void *ctx ) { return( mbedtls_md4_starts_ret( (mbedtls_md4_context *) ctx ) ); } static int md4_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_md4_update_ret( (mbedtls_md4_context *) ctx, input, ilen ) ); } static int md4_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_md4_finish_ret( (mbedtls_md4_context *) ctx, output ) ); } static void *md4_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md4_context ) ); if( ctx != NULL ) mbedtls_md4_init( (mbedtls_md4_context *) ctx ); return( ctx ); } static void md4_ctx_free( void *ctx ) { mbedtls_md4_free( (mbedtls_md4_context *) ctx ); mbedtls_free( ctx ); } static void md4_clone_wrap( void *dst, const void *src ) { mbedtls_md4_clone( (mbedtls_md4_context *) dst, (const mbedtls_md4_context *) src ); } static int md4_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_md4_process( (mbedtls_md4_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_md4_info = { MBEDTLS_MD_MD4, "MD4", 16, 64, md4_starts_wrap, md4_update_wrap, md4_finish_wrap, mbedtls_md4_ret, md4_ctx_alloc, md4_ctx_free, md4_clone_wrap, md4_process_wrap, }; #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) static int md5_starts_wrap( void *ctx ) { return( mbedtls_md5_starts_ret( (mbedtls_md5_context *) ctx ) ); } static int md5_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_md5_update_ret( (mbedtls_md5_context *) ctx, input, ilen ) ); } static int md5_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_md5_finish_ret( (mbedtls_md5_context *) ctx, output ) ); } static void *md5_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md5_context ) ); if( ctx != NULL ) mbedtls_md5_init( (mbedtls_md5_context *) ctx ); return( ctx ); } static void md5_ctx_free( void *ctx ) { mbedtls_md5_free( (mbedtls_md5_context *) ctx ); mbedtls_free( ctx ); } static void md5_clone_wrap( void *dst, const void *src ) { mbedtls_md5_clone( (mbedtls_md5_context *) dst, (const mbedtls_md5_context *) src ); } static int md5_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_md5_process( (mbedtls_md5_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_md5_info = { MBEDTLS_MD_MD5, "MD5", 16, 64, md5_starts_wrap, md5_update_wrap, md5_finish_wrap, mbedtls_md5_ret, md5_ctx_alloc, md5_ctx_free, md5_clone_wrap, md5_process_wrap, }; #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_RIPEMD160_C) static int ripemd160_starts_wrap( void *ctx ) { return( mbedtls_ripemd160_starts_ret( (mbedtls_ripemd160_context *) ctx ) ); } static int ripemd160_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_ripemd160_update_ret( (mbedtls_ripemd160_context *) ctx, input, ilen ) ); } static int ripemd160_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_ripemd160_finish_ret( (mbedtls_ripemd160_context *) ctx, output ) ); } static void *ripemd160_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ripemd160_context ) ); if( ctx != NULL ) mbedtls_ripemd160_init( (mbedtls_ripemd160_context *) ctx ); return( ctx ); } static void ripemd160_ctx_free( void *ctx ) { mbedtls_ripemd160_free( (mbedtls_ripemd160_context *) ctx ); mbedtls_free( ctx ); } static void ripemd160_clone_wrap( void *dst, const void *src ) { mbedtls_ripemd160_clone( (mbedtls_ripemd160_context *) dst, (const mbedtls_ripemd160_context *) src ); } static int ripemd160_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_ripemd160_process( (mbedtls_ripemd160_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_ripemd160_info = { MBEDTLS_MD_RIPEMD160, "RIPEMD160", 20, 64, ripemd160_starts_wrap, ripemd160_update_wrap, ripemd160_finish_wrap, mbedtls_ripemd160_ret, ripemd160_ctx_alloc, ripemd160_ctx_free, ripemd160_clone_wrap, ripemd160_process_wrap, }; #endif /* MBEDTLS_RIPEMD160_C */ #if defined(MBEDTLS_SHA1_C) static int sha1_starts_wrap( void *ctx ) { return( mbedtls_sha1_starts_ret( (mbedtls_sha1_context *) ctx ) ); } static int sha1_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_sha1_update_ret( (mbedtls_sha1_context *) ctx, input, ilen ) ); } static int sha1_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_sha1_finish_ret( (mbedtls_sha1_context *) ctx, output ) ); } static void *sha1_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha1_context ) ); if( ctx != NULL ) mbedtls_sha1_init( (mbedtls_sha1_context *) ctx ); return( ctx ); } static void sha1_clone_wrap( void *dst, const void *src ) { mbedtls_sha1_clone( (mbedtls_sha1_context *) dst, (const mbedtls_sha1_context *) src ); } static void sha1_ctx_free( void *ctx ) { mbedtls_sha1_free( (mbedtls_sha1_context *) ctx ); mbedtls_free( ctx ); } static int sha1_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_sha1_process( (mbedtls_sha1_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_sha1_info = { MBEDTLS_MD_SHA1, "SHA1", 20, 64, sha1_starts_wrap, sha1_update_wrap, sha1_finish_wrap, mbedtls_sha1_ret, sha1_ctx_alloc, sha1_ctx_free, sha1_clone_wrap, sha1_process_wrap, }; #endif /* MBEDTLS_SHA1_C */ /* * Wrappers for generic message digests */ #if defined(MBEDTLS_SHA256_C) static int sha224_starts_wrap( void *ctx ) { return( mbedtls_sha256_starts_ret( (mbedtls_sha256_context *) ctx, 1 ) ); } static int sha224_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_sha256_update_ret( (mbedtls_sha256_context *) ctx, input, ilen ) ); } static int sha224_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_sha256_finish_ret( (mbedtls_sha256_context *) ctx, output ) ); } static int sha224_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha256_ret( input, ilen, output, 1 ) ); } static void *sha224_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha256_context ) ); if( ctx != NULL ) mbedtls_sha256_init( (mbedtls_sha256_context *) ctx ); return( ctx ); } static void sha224_ctx_free( void *ctx ) { mbedtls_sha256_free( (mbedtls_sha256_context *) ctx ); mbedtls_free( ctx ); } static void sha224_clone_wrap( void *dst, const void *src ) { mbedtls_sha256_clone( (mbedtls_sha256_context *) dst, (const mbedtls_sha256_context *) src ); } static int sha224_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_sha256_process( (mbedtls_sha256_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_sha224_info = { MBEDTLS_MD_SHA224, "SHA224", 28, 64, sha224_starts_wrap, sha224_update_wrap, sha224_finish_wrap, sha224_wrap, sha224_ctx_alloc, sha224_ctx_free, sha224_clone_wrap, sha224_process_wrap, }; static int sha256_starts_wrap( void *ctx ) { return( mbedtls_sha256_starts_ret( (mbedtls_sha256_context *) ctx, 0 ) ); } static int sha256_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha256_ret( input, ilen, output, 0 ) ); } const mbedtls_md_info_t mbedtls_sha256_info = { MBEDTLS_MD_SHA256, "SHA256", 32, 64, sha256_starts_wrap, sha224_update_wrap, sha224_finish_wrap, sha256_wrap, sha224_ctx_alloc, sha224_ctx_free, sha224_clone_wrap, sha224_process_wrap, }; #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) static int sha384_starts_wrap( void *ctx ) { return( mbedtls_sha512_starts_ret( (mbedtls_sha512_context *) ctx, 1 ) ); } static int sha384_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_sha512_update_ret( (mbedtls_sha512_context *) ctx, input, ilen ) ); } static int sha384_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_sha512_finish_ret( (mbedtls_sha512_context *) ctx, output ) ); } static int sha384_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha512_ret( input, ilen, output, 1 ) ); } static void *sha384_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha512_context ) ); if( ctx != NULL ) mbedtls_sha512_init( (mbedtls_sha512_context *) ctx ); return( ctx ); } static void sha384_ctx_free( void *ctx ) { mbedtls_sha512_free( (mbedtls_sha512_context *) ctx ); mbedtls_free( ctx ); } static void sha384_clone_wrap( void *dst, const void *src ) { mbedtls_sha512_clone( (mbedtls_sha512_context *) dst, (const mbedtls_sha512_context *) src ); } static int sha384_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_sha512_process( (mbedtls_sha512_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_sha384_info = { MBEDTLS_MD_SHA384, "SHA384", 48, 128, sha384_starts_wrap, sha384_update_wrap, sha384_finish_wrap, sha384_wrap, sha384_ctx_alloc, sha384_ctx_free, sha384_clone_wrap, sha384_process_wrap, }; static int sha512_starts_wrap( void *ctx ) { return( mbedtls_sha512_starts_ret( (mbedtls_sha512_context *) ctx, 0 ) ); } static int sha512_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha512_ret( input, ilen, output, 0 ) ); } const mbedtls_md_info_t mbedtls_sha512_info = { MBEDTLS_MD_SHA512, "SHA512", 64, 128, sha512_starts_wrap, sha384_update_wrap, sha384_finish_wrap, sha512_wrap, sha384_ctx_alloc, sha384_ctx_free, sha384_clone_wrap, sha384_process_wrap, }; #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_MD_C */ fldigi-4.1.06/src/mbedtls/version_features.c0000664000175000017500000006433013507401434015742 00000000000000/* * Version feature information * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_VERSION_C) #include "mbedtls/version.h" #include static const char *features[] = { #if defined(MBEDTLS_VERSION_FEATURES) #if defined(MBEDTLS_HAVE_ASM) "MBEDTLS_HAVE_ASM", #endif /* MBEDTLS_HAVE_ASM */ #if defined(MBEDTLS_NO_UDBL_DIVISION) "MBEDTLS_NO_UDBL_DIVISION", #endif /* MBEDTLS_NO_UDBL_DIVISION */ #if defined(MBEDTLS_NO_64BIT_MULTIPLICATION) "MBEDTLS_NO_64BIT_MULTIPLICATION", #endif /* MBEDTLS_NO_64BIT_MULTIPLICATION */ #if defined(MBEDTLS_HAVE_SSE2) "MBEDTLS_HAVE_SSE2", #endif /* MBEDTLS_HAVE_SSE2 */ #if defined(MBEDTLS_HAVE_TIME) "MBEDTLS_HAVE_TIME", #endif /* MBEDTLS_HAVE_TIME */ #if defined(MBEDTLS_HAVE_TIME_DATE) "MBEDTLS_HAVE_TIME_DATE", #endif /* MBEDTLS_HAVE_TIME_DATE */ #if defined(MBEDTLS_PLATFORM_MEMORY) "MBEDTLS_PLATFORM_MEMORY", #endif /* MBEDTLS_PLATFORM_MEMORY */ #if defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) "MBEDTLS_PLATFORM_NO_STD_FUNCTIONS", #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ #if defined(MBEDTLS_PLATFORM_EXIT_ALT) "MBEDTLS_PLATFORM_EXIT_ALT", #endif /* MBEDTLS_PLATFORM_EXIT_ALT */ #if defined(MBEDTLS_PLATFORM_TIME_ALT) "MBEDTLS_PLATFORM_TIME_ALT", #endif /* MBEDTLS_PLATFORM_TIME_ALT */ #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) "MBEDTLS_PLATFORM_FPRINTF_ALT", #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) "MBEDTLS_PLATFORM_PRINTF_ALT", #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) "MBEDTLS_PLATFORM_SNPRINTF_ALT", #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) "MBEDTLS_PLATFORM_NV_SEED_ALT", #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ #if defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) "MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT", #endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ #if defined(MBEDTLS_DEPRECATED_WARNING) "MBEDTLS_DEPRECATED_WARNING", #endif /* MBEDTLS_DEPRECATED_WARNING */ #if defined(MBEDTLS_DEPRECATED_REMOVED) "MBEDTLS_DEPRECATED_REMOVED", #endif /* MBEDTLS_DEPRECATED_REMOVED */ #if defined(MBEDTLS_CHECK_PARAMS) "MBEDTLS_CHECK_PARAMS", #endif /* MBEDTLS_CHECK_PARAMS */ #if defined(MBEDTLS_TIMING_ALT) "MBEDTLS_TIMING_ALT", #endif /* MBEDTLS_TIMING_ALT */ #if defined(MBEDTLS_AES_ALT) "MBEDTLS_AES_ALT", #endif /* MBEDTLS_AES_ALT */ #if defined(MBEDTLS_ARC4_ALT) "MBEDTLS_ARC4_ALT", #endif /* MBEDTLS_ARC4_ALT */ #if defined(MBEDTLS_ARIA_ALT) "MBEDTLS_ARIA_ALT", #endif /* MBEDTLS_ARIA_ALT */ #if defined(MBEDTLS_BLOWFISH_ALT) "MBEDTLS_BLOWFISH_ALT", #endif /* MBEDTLS_BLOWFISH_ALT */ #if defined(MBEDTLS_CAMELLIA_ALT) "MBEDTLS_CAMELLIA_ALT", #endif /* MBEDTLS_CAMELLIA_ALT */ #if defined(MBEDTLS_CCM_ALT) "MBEDTLS_CCM_ALT", #endif /* MBEDTLS_CCM_ALT */ #if defined(MBEDTLS_CHACHA20_ALT) "MBEDTLS_CHACHA20_ALT", #endif /* MBEDTLS_CHACHA20_ALT */ #if defined(MBEDTLS_CHACHAPOLY_ALT) "MBEDTLS_CHACHAPOLY_ALT", #endif /* MBEDTLS_CHACHAPOLY_ALT */ #if defined(MBEDTLS_CMAC_ALT) "MBEDTLS_CMAC_ALT", #endif /* MBEDTLS_CMAC_ALT */ #if defined(MBEDTLS_DES_ALT) "MBEDTLS_DES_ALT", #endif /* MBEDTLS_DES_ALT */ #if defined(MBEDTLS_DHM_ALT) "MBEDTLS_DHM_ALT", #endif /* MBEDTLS_DHM_ALT */ #if defined(MBEDTLS_ECJPAKE_ALT) "MBEDTLS_ECJPAKE_ALT", #endif /* MBEDTLS_ECJPAKE_ALT */ #if defined(MBEDTLS_GCM_ALT) "MBEDTLS_GCM_ALT", #endif /* MBEDTLS_GCM_ALT */ #if defined(MBEDTLS_NIST_KW_ALT) "MBEDTLS_NIST_KW_ALT", #endif /* MBEDTLS_NIST_KW_ALT */ #if defined(MBEDTLS_MD2_ALT) "MBEDTLS_MD2_ALT", #endif /* MBEDTLS_MD2_ALT */ #if defined(MBEDTLS_MD4_ALT) "MBEDTLS_MD4_ALT", #endif /* MBEDTLS_MD4_ALT */ #if defined(MBEDTLS_MD5_ALT) "MBEDTLS_MD5_ALT", #endif /* MBEDTLS_MD5_ALT */ #if defined(MBEDTLS_POLY1305_ALT) "MBEDTLS_POLY1305_ALT", #endif /* MBEDTLS_POLY1305_ALT */ #if defined(MBEDTLS_RIPEMD160_ALT) "MBEDTLS_RIPEMD160_ALT", #endif /* MBEDTLS_RIPEMD160_ALT */ #if defined(MBEDTLS_RSA_ALT) "MBEDTLS_RSA_ALT", #endif /* MBEDTLS_RSA_ALT */ #if defined(MBEDTLS_SHA1_ALT) "MBEDTLS_SHA1_ALT", #endif /* MBEDTLS_SHA1_ALT */ #if defined(MBEDTLS_SHA256_ALT) "MBEDTLS_SHA256_ALT", #endif /* MBEDTLS_SHA256_ALT */ #if defined(MBEDTLS_SHA512_ALT) "MBEDTLS_SHA512_ALT", #endif /* MBEDTLS_SHA512_ALT */ #if defined(MBEDTLS_XTEA_ALT) "MBEDTLS_XTEA_ALT", #endif /* MBEDTLS_XTEA_ALT */ #if defined(MBEDTLS_ECP_ALT) "MBEDTLS_ECP_ALT", #endif /* MBEDTLS_ECP_ALT */ #if defined(MBEDTLS_MD2_PROCESS_ALT) "MBEDTLS_MD2_PROCESS_ALT", #endif /* MBEDTLS_MD2_PROCESS_ALT */ #if defined(MBEDTLS_MD4_PROCESS_ALT) "MBEDTLS_MD4_PROCESS_ALT", #endif /* MBEDTLS_MD4_PROCESS_ALT */ #if defined(MBEDTLS_MD5_PROCESS_ALT) "MBEDTLS_MD5_PROCESS_ALT", #endif /* MBEDTLS_MD5_PROCESS_ALT */ #if defined(MBEDTLS_RIPEMD160_PROCESS_ALT) "MBEDTLS_RIPEMD160_PROCESS_ALT", #endif /* MBEDTLS_RIPEMD160_PROCESS_ALT */ #if defined(MBEDTLS_SHA1_PROCESS_ALT) "MBEDTLS_SHA1_PROCESS_ALT", #endif /* MBEDTLS_SHA1_PROCESS_ALT */ #if defined(MBEDTLS_SHA256_PROCESS_ALT) "MBEDTLS_SHA256_PROCESS_ALT", #endif /* MBEDTLS_SHA256_PROCESS_ALT */ #if defined(MBEDTLS_SHA512_PROCESS_ALT) "MBEDTLS_SHA512_PROCESS_ALT", #endif /* MBEDTLS_SHA512_PROCESS_ALT */ #if defined(MBEDTLS_DES_SETKEY_ALT) "MBEDTLS_DES_SETKEY_ALT", #endif /* MBEDTLS_DES_SETKEY_ALT */ #if defined(MBEDTLS_DES_CRYPT_ECB_ALT) "MBEDTLS_DES_CRYPT_ECB_ALT", #endif /* MBEDTLS_DES_CRYPT_ECB_ALT */ #if defined(MBEDTLS_DES3_CRYPT_ECB_ALT) "MBEDTLS_DES3_CRYPT_ECB_ALT", #endif /* MBEDTLS_DES3_CRYPT_ECB_ALT */ #if defined(MBEDTLS_AES_SETKEY_ENC_ALT) "MBEDTLS_AES_SETKEY_ENC_ALT", #endif /* MBEDTLS_AES_SETKEY_ENC_ALT */ #if defined(MBEDTLS_AES_SETKEY_DEC_ALT) "MBEDTLS_AES_SETKEY_DEC_ALT", #endif /* MBEDTLS_AES_SETKEY_DEC_ALT */ #if defined(MBEDTLS_AES_ENCRYPT_ALT) "MBEDTLS_AES_ENCRYPT_ALT", #endif /* MBEDTLS_AES_ENCRYPT_ALT */ #if defined(MBEDTLS_AES_DECRYPT_ALT) "MBEDTLS_AES_DECRYPT_ALT", #endif /* MBEDTLS_AES_DECRYPT_ALT */ #if defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) "MBEDTLS_ECDH_GEN_PUBLIC_ALT", #endif /* MBEDTLS_ECDH_GEN_PUBLIC_ALT */ #if defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) "MBEDTLS_ECDH_COMPUTE_SHARED_ALT", #endif /* MBEDTLS_ECDH_COMPUTE_SHARED_ALT */ #if defined(MBEDTLS_ECDSA_VERIFY_ALT) "MBEDTLS_ECDSA_VERIFY_ALT", #endif /* MBEDTLS_ECDSA_VERIFY_ALT */ #if defined(MBEDTLS_ECDSA_SIGN_ALT) "MBEDTLS_ECDSA_SIGN_ALT", #endif /* MBEDTLS_ECDSA_SIGN_ALT */ #if defined(MBEDTLS_ECDSA_GENKEY_ALT) "MBEDTLS_ECDSA_GENKEY_ALT", #endif /* MBEDTLS_ECDSA_GENKEY_ALT */ #if defined(MBEDTLS_ECP_INTERNAL_ALT) "MBEDTLS_ECP_INTERNAL_ALT", #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) "MBEDTLS_ECP_RANDOMIZE_JAC_ALT", #endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */ #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) "MBEDTLS_ECP_ADD_MIXED_ALT", #endif /* MBEDTLS_ECP_ADD_MIXED_ALT */ #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) "MBEDTLS_ECP_DOUBLE_JAC_ALT", #endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) "MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT", #endif /* MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) "MBEDTLS_ECP_NORMALIZE_JAC_ALT", #endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */ #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) "MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT", #endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */ #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) "MBEDTLS_ECP_RANDOMIZE_MXZ_ALT", #endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */ #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) "MBEDTLS_ECP_NORMALIZE_MXZ_ALT", #endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) "MBEDTLS_TEST_NULL_ENTROPY", #endif /* MBEDTLS_TEST_NULL_ENTROPY */ #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) "MBEDTLS_ENTROPY_HARDWARE_ALT", #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ #if defined(MBEDTLS_AES_ROM_TABLES) "MBEDTLS_AES_ROM_TABLES", #endif /* MBEDTLS_AES_ROM_TABLES */ #if defined(MBEDTLS_AES_FEWER_TABLES) "MBEDTLS_AES_FEWER_TABLES", #endif /* MBEDTLS_AES_FEWER_TABLES */ #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY) "MBEDTLS_CAMELLIA_SMALL_MEMORY", #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ #if defined(MBEDTLS_CIPHER_MODE_CBC) "MBEDTLS_CIPHER_MODE_CBC", #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) "MBEDTLS_CIPHER_MODE_CFB", #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) "MBEDTLS_CIPHER_MODE_CTR", #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_OFB) "MBEDTLS_CIPHER_MODE_OFB", #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_XTS) "MBEDTLS_CIPHER_MODE_XTS", #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) "MBEDTLS_CIPHER_NULL_CIPHER", #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) "MBEDTLS_CIPHER_PADDING_PKCS7", #endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) "MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS", #endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) "MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN", #endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS) "MBEDTLS_CIPHER_PADDING_ZEROS", #endif /* MBEDTLS_CIPHER_PADDING_ZEROS */ #if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES) "MBEDTLS_ENABLE_WEAK_CIPHERSUITES", #endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */ #if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) "MBEDTLS_REMOVE_ARC4_CIPHERSUITES", #endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) "MBEDTLS_ECP_DP_SECP192R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) "MBEDTLS_ECP_DP_SECP224R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) "MBEDTLS_ECP_DP_SECP256R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) "MBEDTLS_ECP_DP_SECP384R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) "MBEDTLS_ECP_DP_SECP521R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) "MBEDTLS_ECP_DP_SECP192K1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) "MBEDTLS_ECP_DP_SECP224K1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) "MBEDTLS_ECP_DP_SECP256K1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) "MBEDTLS_ECP_DP_BP256R1_ENABLED", #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) "MBEDTLS_ECP_DP_BP384R1_ENABLED", #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) "MBEDTLS_ECP_DP_BP512R1_ENABLED", #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) "MBEDTLS_ECP_DP_CURVE25519_ENABLED", #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) "MBEDTLS_ECP_DP_CURVE448_ENABLED", #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ #if defined(MBEDTLS_ECP_NIST_OPTIM) "MBEDTLS_ECP_NIST_OPTIM", #endif /* MBEDTLS_ECP_NIST_OPTIM */ #if defined(MBEDTLS_ECP_RESTARTABLE) "MBEDTLS_ECP_RESTARTABLE", #endif /* MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_ECDSA_DETERMINISTIC) "MBEDTLS_ECDSA_DETERMINISTIC", #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) "MBEDTLS_PK_PARSE_EC_EXTENDED", #endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */ #if defined(MBEDTLS_ERROR_STRERROR_DUMMY) "MBEDTLS_ERROR_STRERROR_DUMMY", #endif /* MBEDTLS_ERROR_STRERROR_DUMMY */ #if defined(MBEDTLS_GENPRIME) "MBEDTLS_GENPRIME", #endif /* MBEDTLS_GENPRIME */ #if defined(MBEDTLS_FS_IO) "MBEDTLS_FS_IO", #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) "MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES", #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ #if defined(MBEDTLS_NO_PLATFORM_ENTROPY) "MBEDTLS_NO_PLATFORM_ENTROPY", #endif /* MBEDTLS_NO_PLATFORM_ENTROPY */ #if defined(MBEDTLS_ENTROPY_FORCE_SHA256) "MBEDTLS_ENTROPY_FORCE_SHA256", #endif /* MBEDTLS_ENTROPY_FORCE_SHA256 */ #if defined(MBEDTLS_ENTROPY_NV_SEED) "MBEDTLS_ENTROPY_NV_SEED", #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if defined(MBEDTLS_MEMORY_DEBUG) "MBEDTLS_MEMORY_DEBUG", #endif /* MBEDTLS_MEMORY_DEBUG */ #if defined(MBEDTLS_MEMORY_BACKTRACE) "MBEDTLS_MEMORY_BACKTRACE", #endif /* MBEDTLS_MEMORY_BACKTRACE */ #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) "MBEDTLS_PK_RSA_ALT_SUPPORT", #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ #if defined(MBEDTLS_PKCS1_V15) "MBEDTLS_PKCS1_V15", #endif /* MBEDTLS_PKCS1_V15 */ #if defined(MBEDTLS_PKCS1_V21) "MBEDTLS_PKCS1_V21", #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_RSA_NO_CRT) "MBEDTLS_RSA_NO_CRT", #endif /* MBEDTLS_RSA_NO_CRT */ #if defined(MBEDTLS_SELF_TEST) "MBEDTLS_SELF_TEST", #endif /* MBEDTLS_SELF_TEST */ #if defined(MBEDTLS_SHA256_SMALLER) "MBEDTLS_SHA256_SMALLER", #endif /* MBEDTLS_SHA256_SMALLER */ #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) "MBEDTLS_SSL_ALL_ALERT_MESSAGES", #endif /* MBEDTLS_SSL_ALL_ALERT_MESSAGES */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) "MBEDTLS_SSL_ASYNC_PRIVATE", #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_SSL_DEBUG_ALL) "MBEDTLS_SSL_DEBUG_ALL", #endif /* MBEDTLS_SSL_DEBUG_ALL */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) "MBEDTLS_SSL_ENCRYPT_THEN_MAC", #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) "MBEDTLS_SSL_EXTENDED_MASTER_SECRET", #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_FALLBACK_SCSV) "MBEDTLS_SSL_FALLBACK_SCSV", #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) "MBEDTLS_SSL_HW_RECORD_ACCEL", #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) "MBEDTLS_SSL_CBC_RECORD_SPLITTING", #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ #if defined(MBEDTLS_SSL_RENEGOTIATION) "MBEDTLS_SSL_RENEGOTIATION", #endif /* MBEDTLS_SSL_RENEGOTIATION */ #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) "MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO", #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) "MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE", #endif /* MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH", #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_PROTO_SSL3) "MBEDTLS_SSL_PROTO_SSL3", #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) "MBEDTLS_SSL_PROTO_TLS1", #endif /* MBEDTLS_SSL_PROTO_TLS1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_1) "MBEDTLS_SSL_PROTO_TLS1_1", #endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) "MBEDTLS_SSL_PROTO_TLS1_2", #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_DTLS) "MBEDTLS_SSL_PROTO_DTLS", #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_ALPN) "MBEDTLS_SSL_ALPN", #endif /* MBEDTLS_SSL_ALPN */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) "MBEDTLS_SSL_DTLS_ANTI_REPLAY", #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) "MBEDTLS_SSL_DTLS_HELLO_VERIFY", #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE", #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE */ #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) "MBEDTLS_SSL_DTLS_BADMAC_LIMIT", #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) "MBEDTLS_SSL_SESSION_TICKETS", #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) "MBEDTLS_SSL_EXPORT_KEYS", #endif /* MBEDTLS_SSL_EXPORT_KEYS */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) "MBEDTLS_SSL_SERVER_NAME_INDICATION", #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) "MBEDTLS_SSL_TRUNCATED_HMAC", #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) "MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT", #endif /* MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT */ #if defined(MBEDTLS_THREADING_ALT) "MBEDTLS_THREADING_ALT", #endif /* MBEDTLS_THREADING_ALT */ #if defined(MBEDTLS_THREADING_PTHREAD) "MBEDTLS_THREADING_PTHREAD", #endif /* MBEDTLS_THREADING_PTHREAD */ #if defined(MBEDTLS_VERSION_FEATURES) "MBEDTLS_VERSION_FEATURES", #endif /* MBEDTLS_VERSION_FEATURES */ #if defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3) "MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3", #endif /* MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 */ #if defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) "MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION", #endif /* MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION */ #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) "MBEDTLS_X509_CHECK_KEY_USAGE", #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */ #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) "MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE", #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) "MBEDTLS_X509_RSASSA_PSS_SUPPORT", #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ #if defined(MBEDTLS_ZLIB_SUPPORT) "MBEDTLS_ZLIB_SUPPORT", #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_AESNI_C) "MBEDTLS_AESNI_C", #endif /* MBEDTLS_AESNI_C */ #if defined(MBEDTLS_AES_C) "MBEDTLS_AES_C", #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_ARC4_C) "MBEDTLS_ARC4_C", #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_ASN1_PARSE_C) "MBEDTLS_ASN1_PARSE_C", #endif /* MBEDTLS_ASN1_PARSE_C */ #if defined(MBEDTLS_ASN1_WRITE_C) "MBEDTLS_ASN1_WRITE_C", #endif /* MBEDTLS_ASN1_WRITE_C */ #if defined(MBEDTLS_BASE64_C) "MBEDTLS_BASE64_C", #endif /* MBEDTLS_BASE64_C */ #if defined(MBEDTLS_BIGNUM_C) "MBEDTLS_BIGNUM_C", #endif /* MBEDTLS_BIGNUM_C */ #if defined(MBEDTLS_BLOWFISH_C) "MBEDTLS_BLOWFISH_C", #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_CAMELLIA_C) "MBEDTLS_CAMELLIA_C", #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_ARIA_C) "MBEDTLS_ARIA_C", #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_CCM_C) "MBEDTLS_CCM_C", #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CERTS_C) "MBEDTLS_CERTS_C", #endif /* MBEDTLS_CERTS_C */ #if defined(MBEDTLS_CHACHA20_C) "MBEDTLS_CHACHA20_C", #endif /* MBEDTLS_CHACHA20_C */ #if defined(MBEDTLS_CHACHAPOLY_C) "MBEDTLS_CHACHAPOLY_C", #endif /* MBEDTLS_CHACHAPOLY_C */ #if defined(MBEDTLS_CIPHER_C) "MBEDTLS_CIPHER_C", #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_CMAC_C) "MBEDTLS_CMAC_C", #endif /* MBEDTLS_CMAC_C */ #if defined(MBEDTLS_CTR_DRBG_C) "MBEDTLS_CTR_DRBG_C", #endif /* MBEDTLS_CTR_DRBG_C */ #if defined(MBEDTLS_DEBUG_C) "MBEDTLS_DEBUG_C", #endif /* MBEDTLS_DEBUG_C */ #if defined(MBEDTLS_DES_C) "MBEDTLS_DES_C", #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_DHM_C) "MBEDTLS_DHM_C", #endif /* MBEDTLS_DHM_C */ #if defined(MBEDTLS_ECDH_C) "MBEDTLS_ECDH_C", #endif /* MBEDTLS_ECDH_C */ #if defined(MBEDTLS_ECDSA_C) "MBEDTLS_ECDSA_C", #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_ECJPAKE_C) "MBEDTLS_ECJPAKE_C", #endif /* MBEDTLS_ECJPAKE_C */ #if defined(MBEDTLS_ECP_C) "MBEDTLS_ECP_C", #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_ENTROPY_C) "MBEDTLS_ENTROPY_C", #endif /* MBEDTLS_ENTROPY_C */ #if defined(MBEDTLS_ERROR_C) "MBEDTLS_ERROR_C", #endif /* MBEDTLS_ERROR_C */ #if defined(MBEDTLS_GCM_C) "MBEDTLS_GCM_C", #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_HAVEGE_C) "MBEDTLS_HAVEGE_C", #endif /* MBEDTLS_HAVEGE_C */ #if defined(MBEDTLS_HKDF_C) "MBEDTLS_HKDF_C", #endif /* MBEDTLS_HKDF_C */ #if defined(MBEDTLS_HMAC_DRBG_C) "MBEDTLS_HMAC_DRBG_C", #endif /* MBEDTLS_HMAC_DRBG_C */ #if defined(MBEDTLS_NIST_KW_C) "MBEDTLS_NIST_KW_C", #endif /* MBEDTLS_NIST_KW_C */ #if defined(MBEDTLS_MD_C) "MBEDTLS_MD_C", #endif /* MBEDTLS_MD_C */ #if defined(MBEDTLS_MD2_C) "MBEDTLS_MD2_C", #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) "MBEDTLS_MD4_C", #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) "MBEDTLS_MD5_C", #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) "MBEDTLS_MEMORY_BUFFER_ALLOC_C", #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */ #if defined(MBEDTLS_NET_C) "MBEDTLS_NET_C", #endif /* MBEDTLS_NET_C */ #if defined(MBEDTLS_OID_C) "MBEDTLS_OID_C", #endif /* MBEDTLS_OID_C */ #if defined(MBEDTLS_PADLOCK_C) "MBEDTLS_PADLOCK_C", #endif /* MBEDTLS_PADLOCK_C */ #if defined(MBEDTLS_PEM_PARSE_C) "MBEDTLS_PEM_PARSE_C", #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_PEM_WRITE_C) "MBEDTLS_PEM_WRITE_C", #endif /* MBEDTLS_PEM_WRITE_C */ #if defined(MBEDTLS_PK_C) "MBEDTLS_PK_C", #endif /* MBEDTLS_PK_C */ #if defined(MBEDTLS_PK_PARSE_C) "MBEDTLS_PK_PARSE_C", #endif /* MBEDTLS_PK_PARSE_C */ #if defined(MBEDTLS_PK_WRITE_C) "MBEDTLS_PK_WRITE_C", #endif /* MBEDTLS_PK_WRITE_C */ #if defined(MBEDTLS_PKCS5_C) "MBEDTLS_PKCS5_C", #endif /* MBEDTLS_PKCS5_C */ #if defined(MBEDTLS_PKCS11_C) "MBEDTLS_PKCS11_C", #endif /* MBEDTLS_PKCS11_C */ #if defined(MBEDTLS_PKCS12_C) "MBEDTLS_PKCS12_C", #endif /* MBEDTLS_PKCS12_C */ #if defined(MBEDTLS_PLATFORM_C) "MBEDTLS_PLATFORM_C", #endif /* MBEDTLS_PLATFORM_C */ #if defined(MBEDTLS_POLY1305_C) "MBEDTLS_POLY1305_C", #endif /* MBEDTLS_POLY1305_C */ #if defined(MBEDTLS_RIPEMD160_C) "MBEDTLS_RIPEMD160_C", #endif /* MBEDTLS_RIPEMD160_C */ #if defined(MBEDTLS_RSA_C) "MBEDTLS_RSA_C", #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_SHA1_C) "MBEDTLS_SHA1_C", #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) "MBEDTLS_SHA256_C", #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) "MBEDTLS_SHA512_C", #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SSL_CACHE_C) "MBEDTLS_SSL_CACHE_C", #endif /* MBEDTLS_SSL_CACHE_C */ #if defined(MBEDTLS_SSL_COOKIE_C) "MBEDTLS_SSL_COOKIE_C", #endif /* MBEDTLS_SSL_COOKIE_C */ #if defined(MBEDTLS_SSL_TICKET_C) "MBEDTLS_SSL_TICKET_C", #endif /* MBEDTLS_SSL_TICKET_C */ #if defined(MBEDTLS_SSL_CLI_C) "MBEDTLS_SSL_CLI_C", #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) "MBEDTLS_SSL_SRV_C", #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_TLS_C) "MBEDTLS_SSL_TLS_C", #endif /* MBEDTLS_SSL_TLS_C */ #if defined(MBEDTLS_THREADING_C) "MBEDTLS_THREADING_C", #endif /* MBEDTLS_THREADING_C */ #if defined(MBEDTLS_TIMING_C) "MBEDTLS_TIMING_C", #endif /* MBEDTLS_TIMING_C */ #if defined(MBEDTLS_VERSION_C) "MBEDTLS_VERSION_C", #endif /* MBEDTLS_VERSION_C */ #if defined(MBEDTLS_X509_USE_C) "MBEDTLS_X509_USE_C", #endif /* MBEDTLS_X509_USE_C */ #if defined(MBEDTLS_X509_CRT_PARSE_C) "MBEDTLS_X509_CRT_PARSE_C", #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_X509_CRL_PARSE_C) "MBEDTLS_X509_CRL_PARSE_C", #endif /* MBEDTLS_X509_CRL_PARSE_C */ #if defined(MBEDTLS_X509_CSR_PARSE_C) "MBEDTLS_X509_CSR_PARSE_C", #endif /* MBEDTLS_X509_CSR_PARSE_C */ #if defined(MBEDTLS_X509_CREATE_C) "MBEDTLS_X509_CREATE_C", #endif /* MBEDTLS_X509_CREATE_C */ #if defined(MBEDTLS_X509_CRT_WRITE_C) "MBEDTLS_X509_CRT_WRITE_C", #endif /* MBEDTLS_X509_CRT_WRITE_C */ #if defined(MBEDTLS_X509_CSR_WRITE_C) "MBEDTLS_X509_CSR_WRITE_C", #endif /* MBEDTLS_X509_CSR_WRITE_C */ #if defined(MBEDTLS_XTEA_C) "MBEDTLS_XTEA_C", #endif /* MBEDTLS_XTEA_C */ #endif /* MBEDTLS_VERSION_FEATURES */ NULL }; int mbedtls_version_check_feature( const char *feature ) { const char **idx = features; if( *idx == NULL ) return( -2 ); if( feature == NULL ) return( -1 ); while( *idx != NULL ) { if( !strcmp( *idx, feature ) ) return( 0 ); idx++; } return( -1 ); } #endif /* MBEDTLS_VERSION_C */ fldigi-4.1.06/src/mbedtls/rsa_internal.c0000664000175000017500000003462613507401434015045 00000000000000/* * Helper functions for the RSA module * * Copyright (C) 2006-2017, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #include "mbedtls/bignum.h" #include "mbedtls/rsa_internal.h" /* * Compute RSA prime factors from public and private exponents * * Summary of algorithm: * Setting F := lcm(P-1,Q-1), the idea is as follows: * * (a) For any 1 <= X < N with gcd(X,N)=1, we have X^F = 1 modulo N, so X^(F/2) * is a square root of 1 in Z/NZ. Since Z/NZ ~= Z/PZ x Z/QZ by CRT and the * square roots of 1 in Z/PZ and Z/QZ are +1 and -1, this leaves the four * possibilities X^(F/2) = (+-1, +-1). If it happens that X^(F/2) = (-1,+1) * or (+1,-1), then gcd(X^(F/2) + 1, N) will be equal to one of the prime * factors of N. * * (b) If we don't know F/2 but (F/2) * K for some odd (!) K, then the same * construction still applies since (-)^K is the identity on the set of * roots of 1 in Z/NZ. * * The public and private key primitives (-)^E and (-)^D are mutually inverse * bijections on Z/NZ if and only if (-)^(DE) is the identity on Z/NZ, i.e. * if and only if DE - 1 is a multiple of F, say DE - 1 = F * L. * Splitting L = 2^t * K with K odd, we have * * DE - 1 = FL = (F/2) * (2^(t+1)) * K, * * so (F / 2) * K is among the numbers * * (DE - 1) >> 1, (DE - 1) >> 2, ..., (DE - 1) >> ord * * where ord is the order of 2 in (DE - 1). * We can therefore iterate through these numbers apply the construction * of (a) and (b) above to attempt to factor N. * */ int mbedtls_rsa_deduce_primes( mbedtls_mpi const *N, mbedtls_mpi const *E, mbedtls_mpi const *D, mbedtls_mpi *P, mbedtls_mpi *Q ) { int ret = 0; uint16_t attempt; /* Number of current attempt */ uint16_t iter; /* Number of squares computed in the current attempt */ uint16_t order; /* Order of 2 in DE - 1 */ mbedtls_mpi T; /* Holds largest odd divisor of DE - 1 */ mbedtls_mpi K; /* Temporary holding the current candidate */ const unsigned char primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251 }; const size_t num_primes = sizeof( primes ) / sizeof( *primes ); if( P == NULL || Q == NULL || P->p != NULL || Q->p != NULL ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( N, 0 ) <= 0 || mbedtls_mpi_cmp_int( D, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( D, N ) >= 0 || mbedtls_mpi_cmp_int( E, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( E, N ) >= 0 ) { return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); } /* * Initializations and temporary changes */ mbedtls_mpi_init( &K ); mbedtls_mpi_init( &T ); /* T := DE - 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, D, E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &T, &T, 1 ) ); if( ( order = (uint16_t) mbedtls_mpi_lsb( &T ) ) == 0 ) { ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; goto cleanup; } /* After this operation, T holds the largest odd divisor of DE - 1. */ MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &T, order ) ); /* * Actual work */ /* Skip trying 2 if N == 1 mod 8 */ attempt = 0; if( N->p[0] % 8 == 1 ) attempt = 1; for( ; attempt < num_primes; ++attempt ) { mbedtls_mpi_lset( &K, primes[attempt] ); /* Check if gcd(K,N) = 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( P, &K, N ) ); if( mbedtls_mpi_cmp_int( P, 1 ) != 0 ) continue; /* Go through K^T + 1, K^(2T) + 1, K^(4T) + 1, ... * and check whether they have nontrivial GCD with N. */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &K, &K, &T, N, Q /* temporarily use Q for storing Montgomery * multiplication helper values */ ) ); for( iter = 1; iter <= order; ++iter ) { /* If we reach 1 prematurely, there's no point * in continuing to square K */ if( mbedtls_mpi_cmp_int( &K, 1 ) == 0 ) break; MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( P, &K, N ) ); if( mbedtls_mpi_cmp_int( P, 1 ) == 1 && mbedtls_mpi_cmp_mpi( P, N ) == -1 ) { /* * Have found a nontrivial divisor P of N. * Set Q := N / P. */ MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( Q, NULL, N, P ) ); goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, &K, &K ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, N ) ); } /* * If we get here, then either we prematurely aborted the loop because * we reached 1, or K holds primes[attempt]^(DE - 1) mod N, which must * be 1 if D,E,N were consistent. * Check if that's the case and abort if not, to avoid very long, * yet eventually failing, computations if N,D,E were not sane. */ if( mbedtls_mpi_cmp_int( &K, 1 ) != 0 ) { break; } } ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; cleanup: mbedtls_mpi_free( &K ); mbedtls_mpi_free( &T ); return( ret ); } /* * Given P, Q and the public exponent E, deduce D. * This is essentially a modular inversion. */ int mbedtls_rsa_deduce_private_exponent( mbedtls_mpi const *P, mbedtls_mpi const *Q, mbedtls_mpi const *E, mbedtls_mpi *D ) { int ret = 0; mbedtls_mpi K, L; if( D == NULL || mbedtls_mpi_cmp_int( D, 0 ) != 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( P, 1 ) <= 0 || mbedtls_mpi_cmp_int( Q, 1 ) <= 0 || mbedtls_mpi_cmp_int( E, 0 ) == 0 ) { return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); } mbedtls_mpi_init( &K ); mbedtls_mpi_init( &L ); /* Temporarily put K := P-1 and L := Q-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &L, Q, 1 ) ); /* Temporarily put D := gcd(P-1, Q-1) */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( D, &K, &L ) ); /* K := LCM(P-1, Q-1) */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, &K, &L ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &K, NULL, &K, D ) ); /* Compute modular inverse of E in LCM(P-1, Q-1) */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( D, E, &K ) ); cleanup: mbedtls_mpi_free( &K ); mbedtls_mpi_free( &L ); return( ret ); } /* * Check that RSA CRT parameters are in accordance with core parameters. */ int mbedtls_rsa_validate_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *DP, const mbedtls_mpi *DQ, const mbedtls_mpi *QP ) { int ret = 0; mbedtls_mpi K, L; mbedtls_mpi_init( &K ); mbedtls_mpi_init( &L ); /* Check that DP - D == 0 mod P - 1 */ if( DP != NULL ) { if( P == NULL ) { ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &L, DP, D ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &L, &L, &K ) ); if( mbedtls_mpi_cmp_int( &L, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* Check that DQ - D == 0 mod Q - 1 */ if( DQ != NULL ) { if( Q == NULL ) { ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &L, DQ, D ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &L, &L, &K ) ); if( mbedtls_mpi_cmp_int( &L, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* Check that QP * Q - 1 == 0 mod P */ if( QP != NULL ) { if( P == NULL || Q == NULL ) { ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, QP, Q ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, P ) ); if( mbedtls_mpi_cmp_int( &K, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } cleanup: /* Wrap MPI error codes by RSA check failure error code */ if( ret != 0 && ret != MBEDTLS_ERR_RSA_KEY_CHECK_FAILED && ret != MBEDTLS_ERR_RSA_BAD_INPUT_DATA ) { ret += MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; } mbedtls_mpi_free( &K ); mbedtls_mpi_free( &L ); return( ret ); } /* * Check that core RSA parameters are sane. */ int mbedtls_rsa_validate_params( const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret = 0; mbedtls_mpi K, L; mbedtls_mpi_init( &K ); mbedtls_mpi_init( &L ); /* * Step 1: If PRNG provided, check that P and Q are prime */ #if defined(MBEDTLS_GENPRIME) /* * When generating keys, the strongest security we support aims for an error * rate of at most 2^-100 and we are aiming for the same certainty here as * well. */ if( f_rng != NULL && P != NULL && ( ret = mbedtls_mpi_is_prime_ext( P, 50, f_rng, p_rng ) ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } if( f_rng != NULL && Q != NULL && ( ret = mbedtls_mpi_is_prime_ext( Q, 50, f_rng, p_rng ) ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } #else ((void) f_rng); ((void) p_rng); #endif /* MBEDTLS_GENPRIME */ /* * Step 2: Check that 1 < N = P * Q */ if( P != NULL && Q != NULL && N != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, P, Q ) ); if( mbedtls_mpi_cmp_int( N, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( &K, N ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* * Step 3: Check and 1 < D, E < N if present. */ if( N != NULL && D != NULL && E != NULL ) { if ( mbedtls_mpi_cmp_int( D, 1 ) <= 0 || mbedtls_mpi_cmp_int( E, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( D, N ) >= 0 || mbedtls_mpi_cmp_mpi( E, N ) >= 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* * Step 4: Check that D, E are inverse modulo P-1 and Q-1 */ if( P != NULL && Q != NULL && D != NULL && E != NULL ) { if( mbedtls_mpi_cmp_int( P, 1 ) <= 0 || mbedtls_mpi_cmp_int( Q, 1 ) <= 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } /* Compute DE-1 mod P-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, D, E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &L, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, &L ) ); if( mbedtls_mpi_cmp_int( &K, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } /* Compute DE-1 mod Q-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, D, E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &L, Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, &L ) ); if( mbedtls_mpi_cmp_int( &K, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } cleanup: mbedtls_mpi_free( &K ); mbedtls_mpi_free( &L ); /* Wrap MPI error codes by RSA check failure error code */ if( ret != 0 && ret != MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ) { ret += MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; } return( ret ); } int mbedtls_rsa_deduce_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ) { int ret = 0; mbedtls_mpi K; mbedtls_mpi_init( &K ); /* DP = D mod P-1 */ if( DP != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( DP, D, &K ) ); } /* DQ = D mod Q-1 */ if( DQ != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( DQ, D, &K ) ); } /* QP = Q^{-1} mod P */ if( QP != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( QP, Q, P ) ); } cleanup: mbedtls_mpi_free( &K ); return( ret ); } #endif /* MBEDTLS_RSA_C */ fldigi-4.1.06/src/mbedtls/base64.c0000664000175000017500000001727613507401434013452 00000000000000/* * RFC 1521 base64 encoding/decoding * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_BASE64_C) #include "mbedtls/base64.h" #include #if defined(MBEDTLS_SELF_TEST) #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ static const unsigned char base64_enc_map[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; static const unsigned char base64_dec_map[128] = { 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 62, 127, 127, 127, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 127, 127, 127, 64, 127, 127, 127, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 127, 127, 127, 127, 127, 127, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 127, 127, 127, 127, 127 }; #define BASE64_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */ /* * Encode a buffer into base64 format */ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ) { size_t i, n; int C1, C2, C3; unsigned char *p; if( slen == 0 ) { *olen = 0; return( 0 ); } n = slen / 3 + ( slen % 3 != 0 ); if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 ) { *olen = BASE64_SIZE_T_MAX; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } n *= 4; if( ( dlen < n + 1 ) || ( NULL == dst ) ) { *olen = n + 1; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } n = ( slen / 3 ) * 3; for( i = 0, p = dst; i < n; i += 3 ) { C1 = *src++; C2 = *src++; C3 = *src++; *p++ = base64_enc_map[(C1 >> 2) & 0x3F]; *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F]; *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F]; *p++ = base64_enc_map[C3 & 0x3F]; } if( i < slen ) { C1 = *src++; C2 = ( ( i + 1 ) < slen ) ? *src++ : 0; *p++ = base64_enc_map[(C1 >> 2) & 0x3F]; *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F]; if( ( i + 1 ) < slen ) *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F]; else *p++ = '='; *p++ = '='; } *olen = p - dst; *p = 0; return( 0 ); } /* * Decode a base64-formatted buffer */ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ) { size_t i, n; uint32_t j, x; unsigned char *p; /* First pass: check for validity and get output length */ for( i = n = j = 0; i < slen; i++ ) { /* Skip spaces before checking for EOL */ x = 0; while( i < slen && src[i] == ' ' ) { ++i; ++x; } /* Spaces at end of buffer are OK */ if( i == slen ) break; if( ( slen - i ) >= 2 && src[i] == '\r' && src[i + 1] == '\n' ) continue; if( src[i] == '\n' ) continue; /* Space inside a line is an error */ if( x != 0 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); if( src[i] == '=' && ++j > 2 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); if( src[i] > 127 || base64_dec_map[src[i]] == 127 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); if( base64_dec_map[src[i]] < 64 && j != 0 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); n++; } if( n == 0 ) { *olen = 0; return( 0 ); } /* The following expression is to calculate the following formula without * risk of integer overflow in n: * n = ( ( n * 6 ) + 7 ) >> 3; */ n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 ); n -= j; if( dst == NULL || dlen < n ) { *olen = n; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ ) { if( *src == '\r' || *src == '\n' || *src == ' ' ) continue; j -= ( base64_dec_map[*src] == 64 ); x = ( x << 6 ) | ( base64_dec_map[*src] & 0x3F ); if( ++n == 4 ) { n = 0; if( j > 0 ) *p++ = (unsigned char)( x >> 16 ); if( j > 1 ) *p++ = (unsigned char)( x >> 8 ); if( j > 2 ) *p++ = (unsigned char)( x ); } } *olen = p - dst; return( 0 ); } #if defined(MBEDTLS_SELF_TEST) static const unsigned char base64_test_dec[64] = { 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD, 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01, 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09, 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13, 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31, 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38, 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B, 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97 }; static const unsigned char base64_test_enc[] = "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK" "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw=="; /* * Checkup routine */ int mbedtls_base64_self_test( int verbose ) { size_t len; const unsigned char *src; unsigned char buffer[128]; if( verbose != 0 ) mbedtls_printf( " Base64 encoding test: " ); src = base64_test_dec; if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 || memcmp( base64_test_enc, buffer, 88 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) mbedtls_printf( "passed\n Base64 decoding test: " ); src = base64_test_enc; if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 || memcmp( base64_test_dec, buffer, 64 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) mbedtls_printf( "passed\n\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_BASE64_C */ fldigi-4.1.06/src/mbedtls/aes.c0000664000175000017500000021575713507401434013142 00000000000000/* * FIPS-197 compliant AES implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The AES block cipher was designed by Vincent Rijmen and Joan Daemen. * * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_AES_C) #include #include "mbedtls/aes.h" #include "mbedtls/platform.h" #include "mbedtls/platform_util.h" #if defined(MBEDTLS_PADLOCK_C) #include "mbedtls/padlock.h" #endif #if defined(MBEDTLS_AESNI_C) #include "mbedtls/aesni.h" #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_AES_ALT) /* Parameter validation macros based on platform_util.h */ #define AES_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA ) #define AES_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif #if defined(MBEDTLS_PADLOCK_C) && \ ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) ) static int aes_padlock_ace = -1; #endif #if defined(MBEDTLS_AES_ROM_TABLES) /* * Forward S-box */ static const unsigned char FSb[256] = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; /* * Forward tables */ #define FT \ \ V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \ V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \ V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \ V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \ V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \ V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \ V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \ V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \ V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \ V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \ V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \ V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \ V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \ V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \ V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \ V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \ V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \ V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \ V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \ V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \ V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \ V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \ V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \ V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \ V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \ V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \ V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \ V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \ V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \ V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \ V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \ V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \ V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \ V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \ V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \ V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \ V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \ V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \ V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \ V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \ V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \ V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \ V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \ V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \ V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \ V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \ V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \ V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \ V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \ V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \ V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \ V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \ V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \ V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \ V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \ V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \ V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \ V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \ V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \ V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \ V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \ V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \ V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \ V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C) #define V(a,b,c,d) 0x##a##b##c##d static const uint32_t FT0[256] = { FT }; #undef V #if !defined(MBEDTLS_AES_FEWER_TABLES) #define V(a,b,c,d) 0x##b##c##d##a static const uint32_t FT1[256] = { FT }; #undef V #define V(a,b,c,d) 0x##c##d##a##b static const uint32_t FT2[256] = { FT }; #undef V #define V(a,b,c,d) 0x##d##a##b##c static const uint32_t FT3[256] = { FT }; #undef V #endif /* !MBEDTLS_AES_FEWER_TABLES */ #undef FT /* * Reverse S-box */ static const unsigned char RSb[256] = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; /* * Reverse tables */ #define RT \ \ V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \ V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \ V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \ V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \ V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \ V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \ V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \ V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \ V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \ V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \ V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \ V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \ V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \ V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \ V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \ V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \ V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \ V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \ V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \ V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \ V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \ V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \ V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \ V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \ V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \ V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \ V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \ V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \ V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \ V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \ V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \ V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \ V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \ V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \ V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \ V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \ V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \ V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \ V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \ V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \ V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \ V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \ V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \ V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \ V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \ V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \ V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \ V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \ V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \ V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \ V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \ V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \ V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \ V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \ V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \ V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \ V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \ V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \ V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \ V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \ V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \ V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \ V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \ V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0) #define V(a,b,c,d) 0x##a##b##c##d static const uint32_t RT0[256] = { RT }; #undef V #if !defined(MBEDTLS_AES_FEWER_TABLES) #define V(a,b,c,d) 0x##b##c##d##a static const uint32_t RT1[256] = { RT }; #undef V #define V(a,b,c,d) 0x##c##d##a##b static const uint32_t RT2[256] = { RT }; #undef V #define V(a,b,c,d) 0x##d##a##b##c static const uint32_t RT3[256] = { RT }; #undef V #endif /* !MBEDTLS_AES_FEWER_TABLES */ #undef RT /* * Round constants */ static const uint32_t RCON[10] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x0000001B, 0x00000036 }; #else /* MBEDTLS_AES_ROM_TABLES */ /* * Forward S-box & tables */ static unsigned char FSb[256]; static uint32_t FT0[256]; #if !defined(MBEDTLS_AES_FEWER_TABLES) static uint32_t FT1[256]; static uint32_t FT2[256]; static uint32_t FT3[256]; #endif /* !MBEDTLS_AES_FEWER_TABLES */ /* * Reverse S-box & tables */ static unsigned char RSb[256]; static uint32_t RT0[256]; #if !defined(MBEDTLS_AES_FEWER_TABLES) static uint32_t RT1[256]; static uint32_t RT2[256]; static uint32_t RT3[256]; #endif /* !MBEDTLS_AES_FEWER_TABLES */ /* * Round constants */ static uint32_t RCON[10]; /* * Tables generation code */ #define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 ) #define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) ) #define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 ) static int aes_init_done = 0; static void aes_gen_tables( void ) { int i, x, y, z; int pow[256]; int log[256]; /* * compute pow and log tables over GF(2^8) */ for( i = 0, x = 1; i < 256; i++ ) { pow[i] = x; log[x] = i; x = ( x ^ XTIME( x ) ) & 0xFF; } /* * calculate the round constants */ for( i = 0, x = 1; i < 10; i++ ) { RCON[i] = (uint32_t) x; x = XTIME( x ) & 0xFF; } /* * generate the forward and reverse S-boxes */ FSb[0x00] = 0x63; RSb[0x63] = 0x00; for( i = 1; i < 256; i++ ) { x = pow[255 - log[i]]; y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y ^ 0x63; FSb[i] = (unsigned char) x; RSb[x] = (unsigned char) i; } /* * generate the forward and reverse tables */ for( i = 0; i < 256; i++ ) { x = FSb[i]; y = XTIME( x ) & 0xFF; z = ( y ^ x ) & 0xFF; FT0[i] = ( (uint32_t) y ) ^ ( (uint32_t) x << 8 ) ^ ( (uint32_t) x << 16 ) ^ ( (uint32_t) z << 24 ); #if !defined(MBEDTLS_AES_FEWER_TABLES) FT1[i] = ROTL8( FT0[i] ); FT2[i] = ROTL8( FT1[i] ); FT3[i] = ROTL8( FT2[i] ); #endif /* !MBEDTLS_AES_FEWER_TABLES */ x = RSb[i]; RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^ ( (uint32_t) MUL( 0x09, x ) << 8 ) ^ ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^ ( (uint32_t) MUL( 0x0B, x ) << 24 ); #if !defined(MBEDTLS_AES_FEWER_TABLES) RT1[i] = ROTL8( RT0[i] ); RT2[i] = ROTL8( RT1[i] ); RT3[i] = ROTL8( RT2[i] ); #endif /* !MBEDTLS_AES_FEWER_TABLES */ } } #undef ROTL8 #endif /* MBEDTLS_AES_ROM_TABLES */ #if defined(MBEDTLS_AES_FEWER_TABLES) #define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) ) #define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) ) #define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) ) #define AES_RT0(idx) RT0[idx] #define AES_RT1(idx) ROTL8( RT0[idx] ) #define AES_RT2(idx) ROTL16( RT0[idx] ) #define AES_RT3(idx) ROTL24( RT0[idx] ) #define AES_FT0(idx) FT0[idx] #define AES_FT1(idx) ROTL8( FT0[idx] ) #define AES_FT2(idx) ROTL16( FT0[idx] ) #define AES_FT3(idx) ROTL24( FT0[idx] ) #else /* MBEDTLS_AES_FEWER_TABLES */ #define AES_RT0(idx) RT0[idx] #define AES_RT1(idx) RT1[idx] #define AES_RT2(idx) RT2[idx] #define AES_RT3(idx) RT3[idx] #define AES_FT0(idx) FT0[idx] #define AES_FT1(idx) FT1[idx] #define AES_FT2(idx) FT2[idx] #define AES_FT3(idx) FT3[idx] #endif /* MBEDTLS_AES_FEWER_TABLES */ void mbedtls_aes_init( mbedtls_aes_context *ctx ) { AES_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_aes_context ) ); } void mbedtls_aes_free( mbedtls_aes_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) ); } #if defined(MBEDTLS_CIPHER_MODE_XTS) void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx ) { AES_VALIDATE( ctx != NULL ); mbedtls_aes_init( &ctx->crypt ); mbedtls_aes_init( &ctx->tweak ); } void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx ) { if( ctx == NULL ) return; mbedtls_aes_free( &ctx->crypt ); mbedtls_aes_free( &ctx->tweak ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ /* * AES key schedule (encryption) */ #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT) int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ) { unsigned int i; uint32_t *RK; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); switch( keybits ) { case 128: ctx->nr = 10; break; case 192: ctx->nr = 12; break; case 256: ctx->nr = 14; break; default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ); } #if !defined(MBEDTLS_AES_ROM_TABLES) if( aes_init_done == 0 ) { aes_gen_tables(); aes_init_done = 1; } #endif #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16) if( aes_padlock_ace == -1 ) aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE ); if( aes_padlock_ace ) ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf ); else #endif ctx->rk = RK = ctx->buf; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) ) return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) ); #endif for( i = 0; i < ( keybits >> 5 ); i++ ) { GET_UINT32_LE( RK[i], key, i << 2 ); } switch( ctx->nr ) { case 10: for( i = 0; i < 10; i++, RK += 4 ) { RK[4] = RK[0] ^ RCON[i] ^ ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 ); RK[5] = RK[1] ^ RK[4]; RK[6] = RK[2] ^ RK[5]; RK[7] = RK[3] ^ RK[6]; } break; case 12: for( i = 0; i < 8; i++, RK += 6 ) { RK[6] = RK[0] ^ RCON[i] ^ ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 ); RK[7] = RK[1] ^ RK[6]; RK[8] = RK[2] ^ RK[7]; RK[9] = RK[3] ^ RK[8]; RK[10] = RK[4] ^ RK[9]; RK[11] = RK[5] ^ RK[10]; } break; case 14: for( i = 0; i < 7; i++, RK += 8 ) { RK[8] = RK[0] ^ RCON[i] ^ ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 ); RK[9] = RK[1] ^ RK[8]; RK[10] = RK[2] ^ RK[9]; RK[11] = RK[3] ^ RK[10]; RK[12] = RK[4] ^ ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 ); RK[13] = RK[5] ^ RK[12]; RK[14] = RK[6] ^ RK[13]; RK[15] = RK[7] ^ RK[14]; } break; } return( 0 ); } #endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */ /* * AES key schedule (decryption) */ #if !defined(MBEDTLS_AES_SETKEY_DEC_ALT) int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ) { int i, j, ret; mbedtls_aes_context cty; uint32_t *RK; uint32_t *SK; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); mbedtls_aes_init( &cty ); #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16) if( aes_padlock_ace == -1 ) aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE ); if( aes_padlock_ace ) ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf ); else #endif ctx->rk = RK = ctx->buf; /* Also checks keybits */ if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 ) goto exit; ctx->nr = cty.nr; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) ) { mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk, (const unsigned char *) cty.rk, ctx->nr ); goto exit; } #endif SK = cty.rk + cty.nr * 4; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 ) { for( j = 0; j < 4; j++, SK++ ) { *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^ AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^ AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^ AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] ); } } *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; exit: mbedtls_aes_free( &cty ); return( ret ); } #if defined(MBEDTLS_CIPHER_MODE_XTS) static int mbedtls_aes_xts_decode_keys( const unsigned char *key, unsigned int keybits, const unsigned char **key1, unsigned int *key1bits, const unsigned char **key2, unsigned int *key2bits ) { const unsigned int half_keybits = keybits / 2; const unsigned int half_keybytes = half_keybits / 8; switch( keybits ) { case 256: break; case 512: break; default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ); } *key1bits = half_keybits; *key2bits = half_keybits; *key1 = &key[0]; *key2 = &key[half_keybytes]; return 0; } int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits) { int ret; const unsigned char *key1, *key2; unsigned int key1bits, key2bits; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits, &key2, &key2bits ); if( ret != 0 ) return( ret ); /* Set the tweak key. Always set tweak key for the encryption mode. */ ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits ); if( ret != 0 ) return( ret ); /* Set crypt key for encryption. */ return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits ); } int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits) { int ret; const unsigned char *key1, *key2; unsigned int key1bits, key2bits; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits, &key2, &key2bits ); if( ret != 0 ) return( ret ); /* Set the tweak key. Always set tweak key for encryption. */ ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits ); if( ret != 0 ) return( ret ); /* Set crypt key for decryption. */ return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ #endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */ #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ { \ X0 = *RK++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^ \ AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y3 >> 24 ) & 0xFF ); \ \ X1 = *RK++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^ \ AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y0 >> 24 ) & 0xFF ); \ \ X2 = *RK++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^ \ AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y1 >> 24 ) & 0xFF ); \ \ X3 = *RK++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^ \ AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y2 >> 24 ) & 0xFF ); \ } #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ { \ X0 = *RK++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^ \ AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y1 >> 24 ) & 0xFF ); \ \ X1 = *RK++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^ \ AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y2 >> 24 ) & 0xFF ); \ \ X2 = *RK++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^ \ AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y3 >> 24 ) & 0xFF ); \ \ X3 = *RK++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^ \ AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y0 >> 24 ) & 0xFF ); \ } /* * AES-ECB block encryption */ #if !defined(MBEDTLS_AES_ENCRYPT_ALT) int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { int i; uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; RK = ctx->rk; GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++; GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++; for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) { AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); } AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); X0 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); X1 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); X2 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); X3 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); PUT_UINT32_LE( X0, output, 0 ); PUT_UINT32_LE( X1, output, 4 ); PUT_UINT32_LE( X2, output, 8 ); PUT_UINT32_LE( X3, output, 12 ); return( 0 ); } #endif /* !MBEDTLS_AES_ENCRYPT_ALT */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { mbedtls_internal_aes_encrypt( ctx, input, output ); } #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /* * AES-ECB block decryption */ #if !defined(MBEDTLS_AES_DECRYPT_ALT) int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { int i; uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; RK = ctx->rk; GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++; GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++; for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) { AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); } AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); X0 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); X1 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); X2 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); X3 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); PUT_UINT32_LE( X0, output, 0 ); PUT_UINT32_LE( X1, output, 4 ); PUT_UINT32_LE( X2, output, 8 ); PUT_UINT32_LE( X3, output, 12 ); return( 0 ); } #endif /* !MBEDTLS_AES_DECRYPT_ALT */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { mbedtls_internal_aes_decrypt( ctx, input, output ); } #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /* * AES-ECB block encryption/decryption */ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) ) return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) ); #endif #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86) if( aes_padlock_ace ) { if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 ) return( 0 ); // If padlock data misaligned, we just fall back to // unaccelerated mode // } #endif if( mode == MBEDTLS_AES_ENCRYPT ) return( mbedtls_internal_aes_encrypt( ctx, input, output ) ); else return( mbedtls_internal_aes_decrypt( ctx, input, output ) ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * AES-CBC buffer encryption/decryption */ int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[16]; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); if( length % 16 ) return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH ); #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86) if( aes_padlock_ace ) { if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 ) return( 0 ); // If padlock data misaligned, we just fall back to // unaccelerated mode // } #endif if( mode == MBEDTLS_AES_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, 16 ); mbedtls_aes_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 16 ); input += 16; output += 16; length -= 16; } } else { while( length > 0 ) { for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_aes_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, 16 ); input += 16; output += 16; length -= 16; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_XTS) /* Endianess with 64 bits values */ #ifndef GET_UINT64_LE #define GET_UINT64_LE(n,b,i) \ { \ (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \ | ( (uint64_t) (b)[(i) + 6] << 48 ) \ | ( (uint64_t) (b)[(i) + 5] << 40 ) \ | ( (uint64_t) (b)[(i) + 4] << 32 ) \ | ( (uint64_t) (b)[(i) + 3] << 24 ) \ | ( (uint64_t) (b)[(i) + 2] << 16 ) \ | ( (uint64_t) (b)[(i) + 1] << 8 ) \ | ( (uint64_t) (b)[(i) ] ); \ } #endif #ifndef PUT_UINT64_LE #define PUT_UINT64_LE(n,b,i) \ { \ (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \ (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \ (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \ (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \ (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) ] = (unsigned char) ( (n) ); \ } #endif typedef unsigned char mbedtls_be128[16]; /* * GF(2^128) multiplication function * * This function multiplies a field element by x in the polynomial field * representation. It uses 64-bit word operations to gain speed but compensates * for machine endianess and hence works correctly on both big and little * endian machines. */ static void mbedtls_gf128mul_x_ble( unsigned char r[16], const unsigned char x[16] ) { uint64_t a, b, ra, rb; GET_UINT64_LE( a, x, 0 ); GET_UINT64_LE( b, x, 8 ); ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) ); rb = ( a >> 63 ) | ( b << 1 ); PUT_UINT64_LE( ra, r, 0 ); PUT_UINT64_LE( rb, r, 8 ); } /* * AES-XTS buffer encryption/decryption */ int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx, int mode, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ) { int ret; size_t blocks = length / 16; size_t leftover = length % 16; unsigned char tweak[16]; unsigned char prev_tweak[16]; unsigned char tmp[16]; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( data_unit != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); /* Data units must be at least 16 bytes long. */ if( length < 16 ) return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */ if( length > ( 1 << 20 ) * 16 ) return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; /* Compute the tweak. */ ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT, data_unit, tweak ); if( ret != 0 ) return( ret ); while( blocks-- ) { size_t i; if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 ) { /* We are on the last block in a decrypt operation that has * leftover bytes, so we need to use the next tweak for this block, * and this tweak for the lefover bytes. Save the current tweak for * the leftovers and then update the current tweak for use on this, * the last full block. */ memcpy( prev_tweak, tweak, sizeof( tweak ) ); mbedtls_gf128mul_x_ble( tweak, tweak ); } for( i = 0; i < 16; i++ ) tmp[i] = input[i] ^ tweak[i]; ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp ); if( ret != 0 ) return( ret ); for( i = 0; i < 16; i++ ) output[i] = tmp[i] ^ tweak[i]; /* Update the tweak for the next block. */ mbedtls_gf128mul_x_ble( tweak, tweak ); output += 16; input += 16; } if( leftover ) { /* If we are on the leftover bytes in a decrypt operation, we need to * use the previous tweak for these bytes (as saved in prev_tweak). */ unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak; /* We are now on the final part of the data unit, which doesn't divide * evenly by 16. It's time for ciphertext stealing. */ size_t i; unsigned char *prev_output = output - 16; /* Copy ciphertext bytes from the previous block to our output for each * byte of cyphertext we won't steal. At the same time, copy the * remainder of the input for this final round (since the loop bounds * are the same). */ for( i = 0; i < leftover; i++ ) { output[i] = prev_output[i]; tmp[i] = input[i] ^ t[i]; } /* Copy ciphertext bytes from the previous block for input in this * round. */ for( ; i < 16; i++ ) tmp[i] = prev_output[i] ^ t[i]; ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp ); if( ret != 0 ) return ret; /* Write the result back to the previous block, overriding the previous * output we copied. */ for( i = 0; i < 16; i++ ) prev_output[i] = tmp[i] ^ t[i]; } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * AES-CFB128 buffer encryption/decryption */ int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int c; size_t n; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( iv_off != NULL ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); n = *iv_off; if( n > 15 ) return( MBEDTLS_ERR_AES_BAD_INPUT_DATA ); if( mode == MBEDTLS_AES_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); c = *input++; *output++ = (unsigned char)( c ^ iv[n] ); iv[n] = (unsigned char) c; n = ( n + 1 ) & 0x0F; } } else { while( length-- ) { if( n == 0 ) mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) & 0x0F; } } *iv_off = n; return( 0 ); } /* * AES-CFB8 buffer encryption/decryption */ int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { unsigned char c; unsigned char ov[17]; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); while( length-- ) { memcpy( ov, iv, 16 ); mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); if( mode == MBEDTLS_AES_DECRYPT ) ov[16] = *input; c = *output++ = (unsigned char)( iv[0] ^ *input++ ); if( mode == MBEDTLS_AES_ENCRYPT ) ov[16] = c; memcpy( iv, ov + 1, 16 ); } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /* * AES-OFB (Output Feedback Mode) buffer encryption/decryption */ int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int ret = 0; size_t n; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( iv_off != NULL ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); n = *iv_off; if( n > 15 ) return( MBEDTLS_ERR_AES_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); if( ret != 0 ) goto exit; } *output++ = *input++ ^ iv[n]; n = ( n + 1 ) & 0x0F; } *iv_off = n; exit: return( ret ); } #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * AES-CTR buffer encryption/decryption */ int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( nc_off != NULL ); AES_VALIDATE_RET( nonce_counter != NULL ); AES_VALIDATE_RET( stream_block != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); n = *nc_off; if ( n > 0x0F ) return( MBEDTLS_ERR_AES_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block ); for( i = 16; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) & 0x0F; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* !MBEDTLS_AES_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * AES test vectors from: * * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip */ static const unsigned char aes_test_ecb_dec[3][16] = { { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58, 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 }, { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2, 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 }, { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D, 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE } }; static const unsigned char aes_test_ecb_enc[3][16] = { { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73, 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F }, { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11, 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 }, { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D, 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 } }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const unsigned char aes_test_cbc_dec[3][16] = { { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73, 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 }, { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75, 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B }, { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75, 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 } }; static const unsigned char aes_test_cbc_enc[3][16] = { { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84, 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D }, { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB, 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 }, { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5, 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * AES-CFB128 test vectors from: * * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */ static const unsigned char aes_test_cfb128_key[3][32] = { { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } }; static const unsigned char aes_test_cfb128_iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; static const unsigned char aes_test_cfb128_pt[64] = { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 }; static const unsigned char aes_test_cfb128_ct[3][64] = { { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F, 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B, 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40, 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF, 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E, 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 }, { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21, 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A, 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1, 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9, 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0, 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF }, { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8, 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B, 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92, 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9, 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8, 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 } }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /* * AES-OFB test vectors from: * * https://csrc.nist.gov/publications/detail/sp/800-38a/final */ static const unsigned char aes_test_ofb_key[3][32] = { { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } }; static const unsigned char aes_test_ofb_iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; static const unsigned char aes_test_ofb_pt[64] = { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 }; static const unsigned char aes_test_ofb_ct[3][64] = { { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03, 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25, 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6, 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc, 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78, 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e }, { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c, 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01, 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f, 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2, 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e, 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a }, { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a, 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d, 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed, 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08, 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8, 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 } }; #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * AES-CTR test vectors from: * * http://www.faqs.org/rfcs/rfc3686.html */ static const unsigned char aes_test_ctr_key[3][16] = { { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } }; static const unsigned char aes_test_ctr_nonce_counter[3][16] = { { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } }; static const unsigned char aes_test_ctr_pt[3][48] = { { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23 } }; static const unsigned char aes_test_ctr_ct[3][48] = { { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79, 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 }, { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9, 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88, 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8, 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 }, { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9, 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7, 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36, 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53, 0x25, 0xB2, 0x07, 0x2F } }; static const int aes_test_ctr_len[3] = { 16, 32, 36 }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) /* * AES-XTS test vectors from: * * IEEE P1619/D16 Annex B * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf) */ static const unsigned char aes_test_xts_key[][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 }, { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 }, }; static const unsigned char aes_test_xts_pt32[][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }, { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }, }; static const unsigned char aes_test_xts_ct32[][32] = { { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec, 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92, 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85, 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e }, { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e, 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b, 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4, 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 }, { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a, 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2, 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53, 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 }, }; static const unsigned char aes_test_xts_data_unit[][16] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }; #endif /* MBEDTLS_CIPHER_MODE_XTS */ /* * Checkup routine */ int mbedtls_aes_self_test( int verbose ) { int ret = 0, i, j, u, mode; unsigned int keybits; unsigned char key[32]; unsigned char buf[64]; const unsigned char *aes_tests; #if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) unsigned char iv[16]; #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) unsigned char prv[16]; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ defined(MBEDTLS_CIPHER_MODE_OFB) size_t offset; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS) int len; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) unsigned char nonce_counter[16]; unsigned char stream_block[16]; #endif mbedtls_aes_context ctx; memset( key, 0, 32 ); mbedtls_aes_init( &ctx ); /* * ECB mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-ECB-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memset( buf, 0, 16 ); if( mode == MBEDTLS_AES_DECRYPT ) { ret = mbedtls_aes_setkey_dec( &ctx, key, keybits ); aes_tests = aes_test_ecb_dec[u]; } else { ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); aes_tests = aes_test_ecb_enc[u]; } /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } for( j = 0; j < 10000; j++ ) { ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf ); if( ret != 0 ) goto exit; } if( memcmp( buf, aes_tests, 16 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * CBC mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-CBC-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memset( iv , 0, 16 ); memset( prv, 0, 16 ); memset( buf, 0, 16 ); if( mode == MBEDTLS_AES_DECRYPT ) { ret = mbedtls_aes_setkey_dec( &ctx, key, keybits ); aes_tests = aes_test_cbc_dec[u]; } else { ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); aes_tests = aes_test_cbc_enc[u]; } /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } for( j = 0; j < 10000; j++ ) { if( mode == MBEDTLS_AES_ENCRYPT ) { unsigned char tmp[16]; memcpy( tmp, prv, 16 ); memcpy( prv, buf, 16 ); memcpy( buf, tmp, 16 ); } ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf ); if( ret != 0 ) goto exit; } if( memcmp( buf, aes_tests, 16 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * CFB128 mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memcpy( iv, aes_test_cfb128_iv, 16 ); memcpy( key, aes_test_cfb128_key[u], keybits / 8 ); offset = 0; ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } if( mode == MBEDTLS_AES_DECRYPT ) { memcpy( buf, aes_test_cfb128_ct[u], 64 ); aes_tests = aes_test_cfb128_pt; } else { memcpy( buf, aes_test_cfb128_pt, 64 ); aes_tests = aes_test_cfb128_ct[u]; } ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, 64 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /* * OFB mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-OFB-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memcpy( iv, aes_test_ofb_iv, 16 ); memcpy( key, aes_test_ofb_key[u], keybits / 8 ); offset = 0; ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } if( mode == MBEDTLS_AES_DECRYPT ) { memcpy( buf, aes_test_ofb_ct[u], 64 ); aes_tests = aes_test_ofb_pt; } else { memcpy( buf, aes_test_ofb_pt, 64 ); aes_tests = aes_test_ofb_ct[u]; } ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, 64 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * CTR mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-CTR-128 (%s): ", ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 ); memcpy( key, aes_test_ctr_key[u], 16 ); offset = 0; if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 ) goto exit; len = aes_test_ctr_len[u]; if( mode == MBEDTLS_AES_DECRYPT ) { memcpy( buf, aes_test_ctr_ct[u], len ); aes_tests = aes_test_ctr_pt[u]; } else { memcpy( buf, aes_test_ctr_pt[u], len ); aes_tests = aes_test_ctr_ct[u]; } ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, len ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) { static const int num_tests = sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key); mbedtls_aes_xts_context ctx_xts; /* * XTS mode */ mbedtls_aes_xts_init( &ctx_xts ); for( i = 0; i < num_tests << 1; i++ ) { const unsigned char *data_unit; u = i >> 1; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-XTS-128 (%s): ", ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memset( key, 0, sizeof( key ) ); memcpy( key, aes_test_xts_key[u], 32 ); data_unit = aes_test_xts_data_unit[u]; len = sizeof( *aes_test_xts_ct32 ); if( mode == MBEDTLS_AES_DECRYPT ) { ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 ); if( ret != 0) goto exit; memcpy( buf, aes_test_xts_ct32[u], len ); aes_tests = aes_test_xts_pt32[u]; } else { ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 ); if( ret != 0) goto exit; memcpy( buf, aes_test_xts_pt32[u], len ); aes_tests = aes_test_xts_ct32[u]; } ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, len ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); mbedtls_aes_xts_free( &ctx_xts ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ ret = 0; exit: if( ret != 0 && verbose != 0 ) mbedtls_printf( "failed\n" ); mbedtls_aes_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_AES_C */ fldigi-4.1.06/src/mbedtls/ccm.c0000664000175000017500000004032013507401434013112 00000000000000/* * NIST SP800-38C compliant CCM implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * Definition of CCM: * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf * RFC 3610 "Counter with CBC-MAC (CCM)" * * Related: * RFC 5116 "An Interface and Algorithms for Authenticated Encryption" */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_CCM_ALT) #define CCM_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CCM_BAD_INPUT ) #define CCM_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define CCM_ENCRYPT 0 #define CCM_DECRYPT 1 /* * Initialize context */ void mbedtls_ccm_init( mbedtls_ccm_context *ctx ) { CCM_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_ccm_context ) ); } int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ) { int ret; const mbedtls_cipher_info_t *cipher_info; CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( key != NULL ); cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB ); if( cipher_info == NULL ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); if( cipher_info->block_size != 16 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); mbedtls_cipher_free( &ctx->cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits, MBEDTLS_ENCRYPT ) ) != 0 ) { return( ret ); } return( 0 ); } /* * Free context */ void mbedtls_ccm_free( mbedtls_ccm_context *ctx ) { if( ctx == NULL ) return; mbedtls_cipher_free( &ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ccm_context ) ); } /* * Macros for common operations. * Results in smaller compiled code than static inline functions. */ /* * Update the CBC-MAC state in y using a block in b * (Always using b as the source helps the compiler optimise a bit better.) */ #define UPDATE_CBC_MAC \ for( i = 0; i < 16; i++ ) \ y[i] ^= b[i]; \ \ if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, y, 16, y, &olen ) ) != 0 ) \ return( ret ); /* * Encrypt or decrypt a partial block with CTR * Warning: using b for temporary storage! src and dst must not be b! * This avoids allocating one more 16 bytes buffer while allowing src == dst. */ #define CTR_CRYPT( dst, src, len ) \ if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctr, 16, b, &olen ) ) != 0 ) \ return( ret ); \ \ for( i = 0; i < len; i++ ) \ dst[i] = src[i] ^ b[i]; /* * Authenticated encryption or decryption */ static int ccm_auth_crypt( mbedtls_ccm_context *ctx, int mode, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ) { int ret; unsigned char i; unsigned char q; size_t len_left, olen; unsigned char b[16]; unsigned char y[16]; unsigned char ctr[16]; const unsigned char *src; unsigned char *dst; /* * Check length requirements: SP800-38C A.1 * Additional requirement: a < 2^16 - 2^8 to simplify the code. * 'length' checked later (when writing it to the first block) * * Also, loosen the requirements to enable support for CCM* (IEEE 802.15.4). */ if( tag_len == 2 || tag_len > 16 || tag_len % 2 != 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); /* Also implies q is within bounds */ if( iv_len < 7 || iv_len > 13 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); if( add_len > 0xFF00 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); q = 16 - 1 - (unsigned char) iv_len; /* * First block B_0: * 0 .. 0 flags * 1 .. iv_len nonce (aka iv) * iv_len+1 .. 15 length * * With flags as (bits): * 7 0 * 6 add present? * 5 .. 3 (t - 2) / 2 * 2 .. 0 q - 1 */ b[0] = 0; b[0] |= ( add_len > 0 ) << 6; b[0] |= ( ( tag_len - 2 ) / 2 ) << 3; b[0] |= q - 1; memcpy( b + 1, iv, iv_len ); for( i = 0, len_left = length; i < q; i++, len_left >>= 8 ) b[15-i] = (unsigned char)( len_left & 0xFF ); if( len_left > 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); /* Start CBC-MAC with first block */ memset( y, 0, 16 ); UPDATE_CBC_MAC; /* * If there is additional data, update CBC-MAC with * add_len, add, 0 (padding to a block boundary) */ if( add_len > 0 ) { size_t use_len; len_left = add_len; src = add; memset( b, 0, 16 ); b[0] = (unsigned char)( ( add_len >> 8 ) & 0xFF ); b[1] = (unsigned char)( ( add_len ) & 0xFF ); use_len = len_left < 16 - 2 ? len_left : 16 - 2; memcpy( b + 2, src, use_len ); len_left -= use_len; src += use_len; UPDATE_CBC_MAC; while( len_left > 0 ) { use_len = len_left > 16 ? 16 : len_left; memset( b, 0, 16 ); memcpy( b, src, use_len ); UPDATE_CBC_MAC; len_left -= use_len; src += use_len; } } /* * Prepare counter block for encryption: * 0 .. 0 flags * 1 .. iv_len nonce (aka iv) * iv_len+1 .. 15 counter (initially 1) * * With flags as (bits): * 7 .. 3 0 * 2 .. 0 q - 1 */ ctr[0] = q - 1; memcpy( ctr + 1, iv, iv_len ); memset( ctr + 1 + iv_len, 0, q ); ctr[15] = 1; /* * Authenticate and {en,de}crypt the message. * * The only difference between encryption and decryption is * the respective order of authentication and {en,de}cryption. */ len_left = length; src = input; dst = output; while( len_left > 0 ) { size_t use_len = len_left > 16 ? 16 : len_left; if( mode == CCM_ENCRYPT ) { memset( b, 0, 16 ); memcpy( b, src, use_len ); UPDATE_CBC_MAC; } CTR_CRYPT( dst, src, use_len ); if( mode == CCM_DECRYPT ) { memset( b, 0, 16 ); memcpy( b, dst, use_len ); UPDATE_CBC_MAC; } dst += use_len; src += use_len; len_left -= use_len; /* * Increment counter. * No need to check for overflow thanks to the length check above. */ for( i = 0; i < q; i++ ) if( ++ctr[15-i] != 0 ) break; } /* * Authentication: reset counter and crypt/mask internal tag */ for( i = 0; i < q; i++ ) ctr[15-i] = 0; CTR_CRYPT( y, y, 16 ); memcpy( tag, y, tag_len ); return( 0 ); } /* * Authenticated encryption */ int mbedtls_ccm_star_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ) { CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); return( ccm_auth_crypt( ctx, CCM_ENCRYPT, length, iv, iv_len, add, add_len, input, output, tag, tag_len ) ); } int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ) { CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( tag_len == 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); return( mbedtls_ccm_star_encrypt_and_tag( ctx, length, iv, iv_len, add, add_len, input, output, tag, tag_len ) ); } /* * Authenticated decryption */ int mbedtls_ccm_star_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ) { int ret; unsigned char check_tag[16]; unsigned char i; int diff; CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( ( ret = ccm_auth_crypt( ctx, CCM_DECRYPT, length, iv, iv_len, add, add_len, input, output, check_tag, tag_len ) ) != 0 ) { return( ret ); } /* Check tag in "constant-time" */ for( diff = 0, i = 0; i < tag_len; i++ ) diff |= tag[i] ^ check_tag[i]; if( diff != 0 ) { mbedtls_platform_zeroize( output, length ); return( MBEDTLS_ERR_CCM_AUTH_FAILED ); } return( 0 ); } int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ) { CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( tag_len == 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); return( mbedtls_ccm_star_auth_decrypt( ctx, length, iv, iv_len, add, add_len, input, output, tag, tag_len ) ); } #endif /* !MBEDTLS_CCM_ALT */ #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /* * Examples 1 to 3 from SP800-38C Appendix C */ #define NB_TESTS 3 #define CCM_SELFTEST_PT_MAX_LEN 24 #define CCM_SELFTEST_CT_MAX_LEN 32 /* * The data is the same for all tests, only the used length changes */ static const unsigned char key[] = { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f }; static const unsigned char iv[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b }; static const unsigned char ad[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 }; static const unsigned char msg[CCM_SELFTEST_PT_MAX_LEN] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, }; static const size_t iv_len [NB_TESTS] = { 7, 8, 12 }; static const size_t add_len[NB_TESTS] = { 8, 16, 20 }; static const size_t msg_len[NB_TESTS] = { 4, 16, 24 }; static const size_t tag_len[NB_TESTS] = { 4, 6, 8 }; static const unsigned char res[NB_TESTS][CCM_SELFTEST_CT_MAX_LEN] = { { 0x71, 0x62, 0x01, 0x5b, 0x4d, 0xac, 0x25, 0x5d }, { 0xd2, 0xa1, 0xf0, 0xe0, 0x51, 0xea, 0x5f, 0x62, 0x08, 0x1a, 0x77, 0x92, 0x07, 0x3d, 0x59, 0x3d, 0x1f, 0xc6, 0x4f, 0xbf, 0xac, 0xcd }, { 0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a, 0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b, 0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5, 0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51 } }; int mbedtls_ccm_self_test( int verbose ) { mbedtls_ccm_context ctx; /* * Some hardware accelerators require the input and output buffers * would be in RAM, because the flash is not accessible. * Use buffers on the stack to hold the test vectors data. */ unsigned char plaintext[CCM_SELFTEST_PT_MAX_LEN]; unsigned char ciphertext[CCM_SELFTEST_CT_MAX_LEN]; size_t i; int ret; mbedtls_ccm_init( &ctx ); if( mbedtls_ccm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, key, 8 * sizeof key ) != 0 ) { if( verbose != 0 ) mbedtls_printf( " CCM: setup failed" ); return( 1 ); } for( i = 0; i < NB_TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " CCM-AES #%u: ", (unsigned int) i + 1 ); memset( plaintext, 0, CCM_SELFTEST_PT_MAX_LEN ); memset( ciphertext, 0, CCM_SELFTEST_CT_MAX_LEN ); memcpy( plaintext, msg, msg_len[i] ); ret = mbedtls_ccm_encrypt_and_tag( &ctx, msg_len[i], iv, iv_len[i], ad, add_len[i], plaintext, ciphertext, ciphertext + msg_len[i], tag_len[i] ); if( ret != 0 || memcmp( ciphertext, res[i], msg_len[i] + tag_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } memset( plaintext, 0, CCM_SELFTEST_PT_MAX_LEN ); ret = mbedtls_ccm_auth_decrypt( &ctx, msg_len[i], iv, iv_len[i], ad, add_len[i], ciphertext, plaintext, ciphertext + msg_len[i], tag_len[i] ); if( ret != 0 || memcmp( plaintext, msg, msg_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } mbedtls_ccm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #endif /* MBEDTLS_CCM_C */ fldigi-4.1.06/src/mbedtls/sha1.c0000664000175000017500000003435013507401434013212 00000000000000/* * FIPS-180-1 compliant SHA-1 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SHA-1 standard was published by NIST in 1993. * * http://www.itl.nist.gov/fipspubs/fip180-1.htm */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SHA1_C) #include "mbedtls/sha1.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define SHA1_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA1_BAD_INPUT_DATA ) #define SHA1_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond ) #if !defined(MBEDTLS_SHA1_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif void mbedtls_sha1_init( mbedtls_sha1_context *ctx ) { SHA1_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_sha1_context ) ); } void mbedtls_sha1_free( mbedtls_sha1_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha1_context ) ); } void mbedtls_sha1_clone( mbedtls_sha1_context *dst, const mbedtls_sha1_context *src ) { SHA1_VALIDATE( dst != NULL ); SHA1_VALIDATE( src != NULL ); *dst = *src; } /* * SHA-1 context setup */ int mbedtls_sha1_starts_ret( mbedtls_sha1_context *ctx ) { SHA1_VALIDATE_RET( ctx != NULL ); ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; ctx->state[4] = 0xC3D2E1F0; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_starts( mbedtls_sha1_context *ctx ) { mbedtls_sha1_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_SHA1_PROCESS_ALT) int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ) { uint32_t temp, W[16], A, B, C, D, E; SHA1_VALIDATE_RET( ctx != NULL ); SHA1_VALIDATE_RET( (const unsigned char *)data != NULL ); GET_UINT32_BE( W[ 0], data, 0 ); GET_UINT32_BE( W[ 1], data, 4 ); GET_UINT32_BE( W[ 2], data, 8 ); GET_UINT32_BE( W[ 3], data, 12 ); GET_UINT32_BE( W[ 4], data, 16 ); GET_UINT32_BE( W[ 5], data, 20 ); GET_UINT32_BE( W[ 6], data, 24 ); GET_UINT32_BE( W[ 7], data, 28 ); GET_UINT32_BE( W[ 8], data, 32 ); GET_UINT32_BE( W[ 9], data, 36 ); GET_UINT32_BE( W[10], data, 40 ); GET_UINT32_BE( W[11], data, 44 ); GET_UINT32_BE( W[12], data, 48 ); GET_UINT32_BE( W[13], data, 52 ); GET_UINT32_BE( W[14], data, 56 ); GET_UINT32_BE( W[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define R(t) \ ( \ temp = W[( t - 3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \ W[( t - 14 ) & 0x0F] ^ W[ t & 0x0F], \ ( W[t & 0x0F] = S(temp,1) ) \ ) #define P(a,b,c,d,e,x) \ { \ e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; E = ctx->state[4]; #define F(x,y,z) (z ^ (x & (y ^ z))) #define K 0x5A827999 P( A, B, C, D, E, W[0] ); P( E, A, B, C, D, W[1] ); P( D, E, A, B, C, W[2] ); P( C, D, E, A, B, W[3] ); P( B, C, D, E, A, W[4] ); P( A, B, C, D, E, W[5] ); P( E, A, B, C, D, W[6] ); P( D, E, A, B, C, W[7] ); P( C, D, E, A, B, W[8] ); P( B, C, D, E, A, W[9] ); P( A, B, C, D, E, W[10] ); P( E, A, B, C, D, W[11] ); P( D, E, A, B, C, W[12] ); P( C, D, E, A, B, W[13] ); P( B, C, D, E, A, W[14] ); P( A, B, C, D, E, W[15] ); P( E, A, B, C, D, R(16) ); P( D, E, A, B, C, R(17) ); P( C, D, E, A, B, R(18) ); P( B, C, D, E, A, R(19) ); #undef K #undef F #define F(x,y,z) (x ^ y ^ z) #define K 0x6ED9EBA1 P( A, B, C, D, E, R(20) ); P( E, A, B, C, D, R(21) ); P( D, E, A, B, C, R(22) ); P( C, D, E, A, B, R(23) ); P( B, C, D, E, A, R(24) ); P( A, B, C, D, E, R(25) ); P( E, A, B, C, D, R(26) ); P( D, E, A, B, C, R(27) ); P( C, D, E, A, B, R(28) ); P( B, C, D, E, A, R(29) ); P( A, B, C, D, E, R(30) ); P( E, A, B, C, D, R(31) ); P( D, E, A, B, C, R(32) ); P( C, D, E, A, B, R(33) ); P( B, C, D, E, A, R(34) ); P( A, B, C, D, E, R(35) ); P( E, A, B, C, D, R(36) ); P( D, E, A, B, C, R(37) ); P( C, D, E, A, B, R(38) ); P( B, C, D, E, A, R(39) ); #undef K #undef F #define F(x,y,z) ((x & y) | (z & (x | y))) #define K 0x8F1BBCDC P( A, B, C, D, E, R(40) ); P( E, A, B, C, D, R(41) ); P( D, E, A, B, C, R(42) ); P( C, D, E, A, B, R(43) ); P( B, C, D, E, A, R(44) ); P( A, B, C, D, E, R(45) ); P( E, A, B, C, D, R(46) ); P( D, E, A, B, C, R(47) ); P( C, D, E, A, B, R(48) ); P( B, C, D, E, A, R(49) ); P( A, B, C, D, E, R(50) ); P( E, A, B, C, D, R(51) ); P( D, E, A, B, C, R(52) ); P( C, D, E, A, B, R(53) ); P( B, C, D, E, A, R(54) ); P( A, B, C, D, E, R(55) ); P( E, A, B, C, D, R(56) ); P( D, E, A, B, C, R(57) ); P( C, D, E, A, B, R(58) ); P( B, C, D, E, A, R(59) ); #undef K #undef F #define F(x,y,z) (x ^ y ^ z) #define K 0xCA62C1D6 P( A, B, C, D, E, R(60) ); P( E, A, B, C, D, R(61) ); P( D, E, A, B, C, R(62) ); P( C, D, E, A, B, R(63) ); P( B, C, D, E, A, R(64) ); P( A, B, C, D, E, R(65) ); P( E, A, B, C, D, R(66) ); P( D, E, A, B, C, R(67) ); P( C, D, E, A, B, R(68) ); P( B, C, D, E, A, R(69) ); P( A, B, C, D, E, R(70) ); P( E, A, B, C, D, R(71) ); P( D, E, A, B, C, R(72) ); P( C, D, E, A, B, R(73) ); P( B, C, D, E, A, R(74) ); P( A, B, C, D, E, R(75) ); P( E, A, B, C, D, R(76) ); P( D, E, A, B, C, R(77) ); P( C, D, E, A, B, R(78) ); P( B, C, D, E, A, R(79) ); #undef K #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; ctx->state[4] += E; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ) { mbedtls_internal_sha1_process( ctx, data ); } #endif #endif /* !MBEDTLS_SHA1_PROCESS_ALT */ /* * SHA-1 process buffer */ int mbedtls_sha1_update_ret( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; SHA1_VALIDATE_RET( ctx != NULL ); SHA1_VALIDATE_RET( ilen == 0 || input != NULL ); if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_sha1_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_sha1_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) memcpy( (void *) (ctx->buffer + left), input, ilen ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_sha1_update_ret( ctx, input, ilen ); } #endif /* * SHA-1 final digest */ int mbedtls_sha1_finish_ret( mbedtls_sha1_context *ctx, unsigned char output[20] ) { int ret; uint32_t used; uint32_t high, low; SHA1_VALIDATE_RET( ctx != NULL ); SHA1_VALIDATE_RET( (unsigned char *)output != NULL ); /* * Add padding: 0x80 then 0x00 until 8 bytes remain for the length */ used = ctx->total[0] & 0x3F; ctx->buffer[used++] = 0x80; if( used <= 56 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 56 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 64 - used ); if( ( ret = mbedtls_internal_sha1_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 56 ); } /* * Add message length */ high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_BE( high, ctx->buffer, 56 ); PUT_UINT32_BE( low, ctx->buffer, 60 ); if( ( ret = mbedtls_internal_sha1_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT32_BE( ctx->state[0], output, 0 ); PUT_UINT32_BE( ctx->state[1], output, 4 ); PUT_UINT32_BE( ctx->state[2], output, 8 ); PUT_UINT32_BE( ctx->state[3], output, 12 ); PUT_UINT32_BE( ctx->state[4], output, 16 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] ) { mbedtls_sha1_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_SHA1_ALT */ /* * output = SHA-1( input buffer ) */ int mbedtls_sha1_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ) { int ret; mbedtls_sha1_context ctx; SHA1_VALIDATE_RET( ilen == 0 || input != NULL ); SHA1_VALIDATE_RET( (unsigned char *)output != NULL ); mbedtls_sha1_init( &ctx ); if( ( ret = mbedtls_sha1_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_sha1_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ) { mbedtls_sha1_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * FIPS-180-1 test vectors */ static const unsigned char sha1_test_buf[3][57] = { { "abc" }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, { "" } }; static const size_t sha1_test_buflen[3] = { 3, 56, 1000 }; static const unsigned char sha1_test_sum[3][20] = { { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D }, { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }, { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E, 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F } }; /* * Checkup routine */ int mbedtls_sha1_self_test( int verbose ) { int i, j, buflen, ret = 0; unsigned char buf[1024]; unsigned char sha1sum[20]; mbedtls_sha1_context ctx; mbedtls_sha1_init( &ctx ); /* * SHA-1 */ for( i = 0; i < 3; i++ ) { if( verbose != 0 ) mbedtls_printf( " SHA-1 test #%d: ", i + 1 ); if( ( ret = mbedtls_sha1_starts_ret( &ctx ) ) != 0 ) goto fail; if( i == 2 ) { memset( buf, 'a', buflen = 1000 ); for( j = 0; j < 1000; j++ ) { ret = mbedtls_sha1_update_ret( &ctx, buf, buflen ); if( ret != 0 ) goto fail; } } else { ret = mbedtls_sha1_update_ret( &ctx, sha1_test_buf[i], sha1_test_buflen[i] ); if( ret != 0 ) goto fail; } if( ( ret = mbedtls_sha1_finish_ret( &ctx, sha1sum ) ) != 0 ) goto fail; if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); goto exit; fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); exit: mbedtls_sha1_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_SHA1_C */ fldigi-4.1.06/src/mbedtls/x509_crl.c0000664000175000017500000005224413507401434013725 00000000000000/* * X.509 Certidicate Revocation List (CRL) parsing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CRL_PARSE_C) #include "mbedtls/x509_crl.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_snprintf snprintf #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include #else #include #endif #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) #include #endif /* * Version ::= INTEGER { v1(0), v2(1) } */ static int x509_crl_get_version( unsigned char **p, const unsigned char *end, int *ver ) { int ret; if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { *ver = 0; return( 0 ); } return( MBEDTLS_ERR_X509_INVALID_VERSION + ret ); } return( 0 ); } /* * X.509 CRL v2 extensions * * We currently don't parse any extension's content, but we do check that the * list of extensions is well-formed and abort on critical extensions (that * are unsupported as we don't support any extension so far) */ static int x509_get_crl_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext ) { int ret; /* * crlExtensions [0] EXPLICIT Extensions OPTIONAL * -- if present, version MUST be v2 */ if( ( ret = mbedtls_x509_get_ext( p, end, ext, 0 ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } while( *p < end ) { /* * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING } */ int is_critical = 0; const unsigned char *end_ext_data; size_t len; /* Get enclosing sequence tag */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); end_ext_data = *p + len; /* Get OID (currently ignored) */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len, MBEDTLS_ASN1_OID ) ) != 0 ) { return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); } *p += len; /* Get optional critical */ if( ( ret = mbedtls_asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 && ( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ) { return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); } /* Data should be octet string type */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); /* Ignore data so far and just check its length */ *p += len; if( *p != end_ext_data ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* Abort on (unsupported) critical extensions */ if( is_critical ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 CRL v2 entry extensions (no extensions parsed yet.) */ static int x509_get_crl_entry_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext ) { int ret; size_t len = 0; /* OPTIONAL */ if( end <= *p ) return( 0 ); ext->tag = **p; ext->p = *p; /* * Get CRL-entry extension sequence header * crlEntryExtensions Extensions OPTIONAL -- if present, MUST be v2 */ if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { ext->p = NULL; return( 0 ); } return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); } end = *p + ext->len; if( end != *p + ext->len ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); while( *p < end ) { if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); *p += len; } if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 CRL Entries */ static int x509_get_entries( unsigned char **p, const unsigned char *end, mbedtls_x509_crl_entry *entry ) { int ret; size_t entry_len; mbedtls_x509_crl_entry *cur_entry = entry; if( *p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_tag( p, end, &entry_len, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } end = *p + entry_len; while( *p < end ) { size_t len2; const unsigned char *end2; if( ( ret = mbedtls_asn1_get_tag( p, end, &len2, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 ) { return( ret ); } cur_entry->raw.tag = **p; cur_entry->raw.p = *p; cur_entry->raw.len = len2; end2 = *p + len2; if( ( ret = mbedtls_x509_get_serial( p, end2, &cur_entry->serial ) ) != 0 ) return( ret ); if( ( ret = mbedtls_x509_get_time( p, end2, &cur_entry->revocation_date ) ) != 0 ) return( ret ); if( ( ret = x509_get_crl_entry_ext( p, end2, &cur_entry->entry_ext ) ) != 0 ) return( ret ); if( *p < end ) { cur_entry->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl_entry ) ); if( cur_entry->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); cur_entry = cur_entry->next; } } return( 0 ); } /* * Parse one CRLs in DER format and append it to the chained list */ int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ) { int ret; size_t len; unsigned char *p = NULL, *end = NULL; mbedtls_x509_buf sig_params1, sig_params2, sig_oid2; mbedtls_x509_crl *crl = chain; /* * Check for valid input */ if( crl == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) ); /* * Add new CRL on the end of the chain if needed. */ while( crl->version != 0 && crl->next != NULL ) crl = crl->next; if( crl->version != 0 && crl->next == NULL ) { crl->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl ) ); if( crl->next == NULL ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_ALLOC_FAILED ); } mbedtls_x509_crl_init( crl->next ); crl = crl->next; } /* * Copy raw DER-encoded CRL */ if( buflen == 0 ) return( MBEDTLS_ERR_X509_INVALID_FORMAT ); p = mbedtls_calloc( 1, buflen ); if( p == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); memcpy( p, buf, buflen ); crl->raw.p = p; crl->raw.len = buflen; end = p + buflen; /* * CertificateList ::= SEQUENCE { * tbsCertList TBSCertList, * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT ); } if( len != (size_t) ( end - p ) ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } /* * TBSCertList ::= SEQUENCE { */ crl->tbs.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } end = p + len; crl->tbs.len = end - crl->tbs.p; /* * Version ::= INTEGER OPTIONAL { v1(0), v2(1) } * -- if present, MUST be v2 * * signature AlgorithmIdentifier */ if( ( ret = x509_crl_get_version( &p, end, &crl->version ) ) != 0 || ( ret = mbedtls_x509_get_alg( &p, end, &crl->sig_oid, &sig_params1 ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( crl->version < 0 || crl->version > 1 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_UNKNOWN_VERSION ); } crl->version++; if( ( ret = mbedtls_x509_get_sig_alg( &crl->sig_oid, &sig_params1, &crl->sig_md, &crl->sig_pk, &crl->sig_opts ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG ); } /* * issuer Name */ crl->issuer_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_x509_get_name( &p, p + len, &crl->issuer ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } crl->issuer_raw.len = p - crl->issuer_raw.p; /* * thisUpdate Time * nextUpdate Time OPTIONAL */ if( ( ret = mbedtls_x509_get_time( &p, end, &crl->this_update ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( ( ret = mbedtls_x509_get_time( &p, end, &crl->next_update ) ) != 0 ) { if( ret != ( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) && ret != ( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_OUT_OF_DATA ) ) { mbedtls_x509_crl_free( crl ); return( ret ); } } /* * revokedCertificates SEQUENCE OF SEQUENCE { * userCertificate CertificateSerialNumber, * revocationDate Time, * crlEntryExtensions Extensions OPTIONAL * -- if present, MUST be v2 * } OPTIONAL */ if( ( ret = x509_get_entries( &p, end, &crl->entry ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } /* * crlExtensions EXPLICIT Extensions OPTIONAL * -- if present, MUST be v2 */ if( crl->version == 2 ) { ret = x509_get_crl_ext( &p, end, &crl->crl_ext ); if( ret != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } } if( p != end ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } end = crl->raw.p + crl->raw.len; /* * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING */ if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( crl->sig_oid.len != sig_oid2.len || memcmp( crl->sig_oid.p, sig_oid2.p, crl->sig_oid.len ) != 0 || sig_params1.len != sig_params2.len || ( sig_params1.len != 0 && memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_SIG_MISMATCH ); } if( ( ret = mbedtls_x509_get_sig( &p, end, &crl->sig ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( p != end ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } return( 0 ); } /* * Parse one or more CRLs and add them to the chained list */ int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ) { #if defined(MBEDTLS_PEM_PARSE_C) int ret; size_t use_len; mbedtls_pem_context pem; int is_pem = 0; if( chain == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); do { mbedtls_pem_init( &pem ); // Avoid calling mbedtls_pem_read_buffer() on non-null-terminated // string if( buflen == 0 || buf[buflen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN X509 CRL-----", "-----END X509 CRL-----", buf, NULL, 0, &use_len ); if( ret == 0 ) { /* * Was PEM encoded */ is_pem = 1; buflen -= use_len; buf += use_len; if( ( ret = mbedtls_x509_crl_parse_der( chain, pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pem_free( &pem ); return( ret ); } } else if( is_pem ) { mbedtls_pem_free( &pem ); return( ret ); } mbedtls_pem_free( &pem ); } /* In the PEM case, buflen is 1 at the end, for the terminated NULL byte. * And a valid CRL cannot be less than 1 byte anyway. */ while( is_pem && buflen > 1 ); if( is_pem ) return( 0 ); else #endif /* MBEDTLS_PEM_PARSE_C */ return( mbedtls_x509_crl_parse_der( chain, buf, buflen ) ); } #if defined(MBEDTLS_FS_IO) /* * Load one or more CRLs and add them to the chained list */ int mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path ) { int ret; size_t n; unsigned char *buf; if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_x509_crl_parse( chain, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ /* * Return an informational string about the certificate. */ #define BEFORE_COLON 14 #define BC "14" /* * Return an informational string about the CRL. */ int mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crl *crl ) { int ret; size_t n; char *p; const mbedtls_x509_crl_entry *entry; p = buf; n = size; ret = mbedtls_snprintf( p, n, "%sCRL version : %d", prefix, crl->version ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sissuer name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &crl->issuer ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sthis update : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crl->this_update.year, crl->this_update.mon, crl->this_update.day, crl->this_update.hour, crl->this_update.min, crl->this_update.sec ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%snext update : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crl->next_update.year, crl->next_update.mon, crl->next_update.day, crl->next_update.hour, crl->next_update.min, crl->next_update.sec ); MBEDTLS_X509_SAFE_SNPRINTF; entry = &crl->entry; ret = mbedtls_snprintf( p, n, "\n%sRevoked certificates:", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; while( entry != NULL && entry->raw.len != 0 ) { ret = mbedtls_snprintf( p, n, "\n%sserial number: ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_serial_gets( p, n, &entry->serial ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, " revocation date: " \ "%04d-%02d-%02d %02d:%02d:%02d", entry->revocation_date.year, entry->revocation_date.mon, entry->revocation_date.day, entry->revocation_date.hour, entry->revocation_date.min, entry->revocation_date.sec ); MBEDTLS_X509_SAFE_SNPRINTF; entry = entry->next; } ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_sig_alg_gets( p, n, &crl->sig_oid, crl->sig_pk, crl->sig_md, crl->sig_opts ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n" ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } /* * Initialize a CRL chain */ void mbedtls_x509_crl_init( mbedtls_x509_crl *crl ) { memset( crl, 0, sizeof(mbedtls_x509_crl) ); } /* * Unallocate all CRL data */ void mbedtls_x509_crl_free( mbedtls_x509_crl *crl ) { mbedtls_x509_crl *crl_cur = crl; mbedtls_x509_crl *crl_prv; mbedtls_x509_name *name_cur; mbedtls_x509_name *name_prv; mbedtls_x509_crl_entry *entry_cur; mbedtls_x509_crl_entry *entry_prv; if( crl == NULL ) return; do { #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) mbedtls_free( crl_cur->sig_opts ); #endif name_cur = crl_cur->issuer.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } entry_cur = crl_cur->entry.next; while( entry_cur != NULL ) { entry_prv = entry_cur; entry_cur = entry_cur->next; mbedtls_platform_zeroize( entry_prv, sizeof( mbedtls_x509_crl_entry ) ); mbedtls_free( entry_prv ); } if( crl_cur->raw.p != NULL ) { mbedtls_platform_zeroize( crl_cur->raw.p, crl_cur->raw.len ); mbedtls_free( crl_cur->raw.p ); } crl_cur = crl_cur->next; } while( crl_cur != NULL ); crl_cur = crl; do { crl_prv = crl_cur; crl_cur = crl_cur->next; mbedtls_platform_zeroize( crl_prv, sizeof( mbedtls_x509_crl ) ); if( crl_prv != crl ) mbedtls_free( crl_prv ); } while( crl_cur != NULL ); } #endif /* MBEDTLS_X509_CRL_PARSE_C */ fldigi-4.1.06/src/mbedtls/ripemd160.c0000664000175000017500000003702113507401434014063 00000000000000/* * RIPE MD-160 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The RIPEMD-160 algorithm was designed by RIPE in 1996 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html * http://ehash.iaik.tugraz.at/wiki/RIPEMD-160 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_RIPEMD160_C) #include "mbedtls/ripemd160.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_RIPEMD160_ALT) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_ripemd160_context ) ); } void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ripemd160_context ) ); } void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst, const mbedtls_ripemd160_context *src ) { *dst = *src; } /* * RIPEMD-160 context setup */ int mbedtls_ripemd160_starts_ret( mbedtls_ripemd160_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; ctx->state[4] = 0xC3D2E1F0; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx ) { mbedtls_ripemd160_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT) /* * Process one block */ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ) { uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16]; GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); A = Ap = ctx->state[0]; B = Bp = ctx->state[1]; C = Cp = ctx->state[2]; D = Dp = ctx->state[3]; E = Ep = ctx->state[4]; #define F1( x, y, z ) ( x ^ y ^ z ) #define F2( x, y, z ) ( ( x & y ) | ( ~x & z ) ) #define F3( x, y, z ) ( ( x | ~y ) ^ z ) #define F4( x, y, z ) ( ( x & z ) | ( y & ~z ) ) #define F5( x, y, z ) ( x ^ ( y | ~z ) ) #define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) ) #define P( a, b, c, d, e, r, s, f, k ) \ a += f( b, c, d ) + X[r] + k; \ a = S( a, s ) + e; \ c = S( c, 10 ); #define P2( a, b, c, d, e, r, s, rp, sp ) \ P( a, b, c, d, e, r, s, F, K ); \ P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp ); #define F F1 #define K 0x00000000 #define Fp F5 #define Kp 0x50A28BE6 P2( A, B, C, D, E, 0, 11, 5, 8 ); P2( E, A, B, C, D, 1, 14, 14, 9 ); P2( D, E, A, B, C, 2, 15, 7, 9 ); P2( C, D, E, A, B, 3, 12, 0, 11 ); P2( B, C, D, E, A, 4, 5, 9, 13 ); P2( A, B, C, D, E, 5, 8, 2, 15 ); P2( E, A, B, C, D, 6, 7, 11, 15 ); P2( D, E, A, B, C, 7, 9, 4, 5 ); P2( C, D, E, A, B, 8, 11, 13, 7 ); P2( B, C, D, E, A, 9, 13, 6, 7 ); P2( A, B, C, D, E, 10, 14, 15, 8 ); P2( E, A, B, C, D, 11, 15, 8, 11 ); P2( D, E, A, B, C, 12, 6, 1, 14 ); P2( C, D, E, A, B, 13, 7, 10, 14 ); P2( B, C, D, E, A, 14, 9, 3, 12 ); P2( A, B, C, D, E, 15, 8, 12, 6 ); #undef F #undef K #undef Fp #undef Kp #define F F2 #define K 0x5A827999 #define Fp F4 #define Kp 0x5C4DD124 P2( E, A, B, C, D, 7, 7, 6, 9 ); P2( D, E, A, B, C, 4, 6, 11, 13 ); P2( C, D, E, A, B, 13, 8, 3, 15 ); P2( B, C, D, E, A, 1, 13, 7, 7 ); P2( A, B, C, D, E, 10, 11, 0, 12 ); P2( E, A, B, C, D, 6, 9, 13, 8 ); P2( D, E, A, B, C, 15, 7, 5, 9 ); P2( C, D, E, A, B, 3, 15, 10, 11 ); P2( B, C, D, E, A, 12, 7, 14, 7 ); P2( A, B, C, D, E, 0, 12, 15, 7 ); P2( E, A, B, C, D, 9, 15, 8, 12 ); P2( D, E, A, B, C, 5, 9, 12, 7 ); P2( C, D, E, A, B, 2, 11, 4, 6 ); P2( B, C, D, E, A, 14, 7, 9, 15 ); P2( A, B, C, D, E, 11, 13, 1, 13 ); P2( E, A, B, C, D, 8, 12, 2, 11 ); #undef F #undef K #undef Fp #undef Kp #define F F3 #define K 0x6ED9EBA1 #define Fp F3 #define Kp 0x6D703EF3 P2( D, E, A, B, C, 3, 11, 15, 9 ); P2( C, D, E, A, B, 10, 13, 5, 7 ); P2( B, C, D, E, A, 14, 6, 1, 15 ); P2( A, B, C, D, E, 4, 7, 3, 11 ); P2( E, A, B, C, D, 9, 14, 7, 8 ); P2( D, E, A, B, C, 15, 9, 14, 6 ); P2( C, D, E, A, B, 8, 13, 6, 6 ); P2( B, C, D, E, A, 1, 15, 9, 14 ); P2( A, B, C, D, E, 2, 14, 11, 12 ); P2( E, A, B, C, D, 7, 8, 8, 13 ); P2( D, E, A, B, C, 0, 13, 12, 5 ); P2( C, D, E, A, B, 6, 6, 2, 14 ); P2( B, C, D, E, A, 13, 5, 10, 13 ); P2( A, B, C, D, E, 11, 12, 0, 13 ); P2( E, A, B, C, D, 5, 7, 4, 7 ); P2( D, E, A, B, C, 12, 5, 13, 5 ); #undef F #undef K #undef Fp #undef Kp #define F F4 #define K 0x8F1BBCDC #define Fp F2 #define Kp 0x7A6D76E9 P2( C, D, E, A, B, 1, 11, 8, 15 ); P2( B, C, D, E, A, 9, 12, 6, 5 ); P2( A, B, C, D, E, 11, 14, 4, 8 ); P2( E, A, B, C, D, 10, 15, 1, 11 ); P2( D, E, A, B, C, 0, 14, 3, 14 ); P2( C, D, E, A, B, 8, 15, 11, 14 ); P2( B, C, D, E, A, 12, 9, 15, 6 ); P2( A, B, C, D, E, 4, 8, 0, 14 ); P2( E, A, B, C, D, 13, 9, 5, 6 ); P2( D, E, A, B, C, 3, 14, 12, 9 ); P2( C, D, E, A, B, 7, 5, 2, 12 ); P2( B, C, D, E, A, 15, 6, 13, 9 ); P2( A, B, C, D, E, 14, 8, 9, 12 ); P2( E, A, B, C, D, 5, 6, 7, 5 ); P2( D, E, A, B, C, 6, 5, 10, 15 ); P2( C, D, E, A, B, 2, 12, 14, 8 ); #undef F #undef K #undef Fp #undef Kp #define F F5 #define K 0xA953FD4E #define Fp F1 #define Kp 0x00000000 P2( B, C, D, E, A, 4, 9, 12, 8 ); P2( A, B, C, D, E, 0, 15, 15, 5 ); P2( E, A, B, C, D, 5, 5, 10, 12 ); P2( D, E, A, B, C, 9, 11, 4, 9 ); P2( C, D, E, A, B, 7, 6, 1, 12 ); P2( B, C, D, E, A, 12, 8, 5, 5 ); P2( A, B, C, D, E, 2, 13, 8, 14 ); P2( E, A, B, C, D, 10, 12, 7, 6 ); P2( D, E, A, B, C, 14, 5, 6, 8 ); P2( C, D, E, A, B, 1, 12, 2, 13 ); P2( B, C, D, E, A, 3, 13, 13, 6 ); P2( A, B, C, D, E, 8, 14, 14, 5 ); P2( E, A, B, C, D, 11, 11, 0, 15 ); P2( D, E, A, B, C, 6, 8, 3, 13 ); P2( C, D, E, A, B, 15, 5, 9, 11 ); P2( B, C, D, E, A, 13, 6, 11, 11 ); #undef F #undef K #undef Fp #undef Kp C = ctx->state[1] + C + Dp; ctx->state[1] = ctx->state[2] + D + Ep; ctx->state[2] = ctx->state[3] + E + Ap; ctx->state[3] = ctx->state[4] + A + Bp; ctx->state[4] = ctx->state[0] + B + Cp; ctx->state[0] = C; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ) { mbedtls_internal_ripemd160_process( ctx, data ); } #endif #endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */ /* * RIPEMD-160 process buffer */ int mbedtls_ripemd160_update_ret( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_ripemd160_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_ripemd160_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) { memcpy( (void *) (ctx->buffer + left), input, ilen ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_ripemd160_update_ret( ctx, input, ilen ); } #endif static const unsigned char ripemd160_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* * RIPEMD-160 final digest */ int mbedtls_ripemd160_finish_ret( mbedtls_ripemd160_context *ctx, unsigned char output[20] ) { int ret; uint32_t last, padn; uint32_t high, low; unsigned char msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_LE( low, msglen, 0 ); PUT_UINT32_LE( high, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); ret = mbedtls_ripemd160_update_ret( ctx, ripemd160_padding, padn ); if( ret != 0 ) return( ret ); ret = mbedtls_ripemd160_update_ret( ctx, msglen, 8 ); if( ret != 0 ) return( ret ); PUT_UINT32_LE( ctx->state[0], output, 0 ); PUT_UINT32_LE( ctx->state[1], output, 4 ); PUT_UINT32_LE( ctx->state[2], output, 8 ); PUT_UINT32_LE( ctx->state[3], output, 12 ); PUT_UINT32_LE( ctx->state[4], output, 16 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] ) { mbedtls_ripemd160_finish_ret( ctx, output ); } #endif #endif /* ! MBEDTLS_RIPEMD160_ALT */ /* * output = RIPEMD-160( input buffer ) */ int mbedtls_ripemd160_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ) { int ret; mbedtls_ripemd160_context ctx; mbedtls_ripemd160_init( &ctx ); if( ( ret = mbedtls_ripemd160_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_ripemd160_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_ripemd160_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_ripemd160_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160( const unsigned char *input, size_t ilen, unsigned char output[20] ) { mbedtls_ripemd160_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * Test vectors from the RIPEMD-160 paper and * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC */ #define TESTS 8 static const unsigned char ripemd160_test_str[TESTS][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" }, }; static const size_t ripemd160_test_strlen[TESTS] = { 0, 1, 3, 14, 26, 56, 62, 80 }; static const unsigned char ripemd160_test_md[TESTS][20] = { { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28, 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 }, { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae, 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe }, { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04, 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc }, { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8, 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 }, { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb, 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc }, { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05, 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b }, { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed, 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 }, { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb, 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb }, }; /* * Checkup routine */ int mbedtls_ripemd160_self_test( int verbose ) { int i, ret = 0; unsigned char output[20]; memset( output, 0, sizeof output ); for( i = 0; i < TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " RIPEMD-160 test #%d: ", i + 1 ); ret = mbedtls_ripemd160_ret( ripemd160_test_str[i], ripemd160_test_strlen[i], output ); if( ret != 0 ) goto fail; if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_RIPEMD160_C */ fldigi-4.1.06/src/mbedtls/platform_util.c0000664000175000017500000001204713507401434015236 00000000000000/* * Common and shared functions used by multiple modules in the Mbed TLS * library. * * Copyright (C) 2018, Arm Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ /* * Ensure gmtime_r is available even with -std=c99; must be defined before * config.h, which pulls in glibc's features.h. Harmless on other platforms. */ #if !defined(_POSIX_C_SOURCE) #define _POSIX_C_SOURCE 200112L #endif #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "mbedtls/platform_util.h" #include "mbedtls/platform.h" #include "mbedtls/threading.h" #include #include #if !defined(MBEDTLS_PLATFORM_ZEROIZE_ALT) /* * This implementation should never be optimized out by the compiler * * This implementation for mbedtls_platform_zeroize() was inspired from Colin * Percival's blog article at: * * http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html * * It uses a volatile function pointer to the standard memset(). Because the * pointer is volatile the compiler expects it to change at * any time and will not optimize out the call that could potentially perform * other operations on the input buffer instead of just setting it to 0. * Nevertheless, as pointed out by davidtgoldblatt on Hacker News * (refer to http://www.daemonology.net/blog/2014-09-05-erratum.html for * details), optimizations of the following form are still possible: * * if( memset_func != memset ) * memset_func( buf, 0, len ); * * Note that it is extremely difficult to guarantee that * mbedtls_platform_zeroize() will not be optimized out by aggressive compilers * in a portable way. For this reason, Mbed TLS also provides the configuration * option MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure * mbedtls_platform_zeroize() to use a suitable implementation for their * platform and needs. */ static void * (* const volatile memset_func)( void *, int, size_t ) = memset; void mbedtls_platform_zeroize( void *buf, size_t len ) { memset_func( buf, 0, len ); } #endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */ #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) #include #if !defined(_WIN32) && (defined(unix) || \ defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ defined(__MACH__))) #include #endif /* !_WIN32 && (unix || __unix || __unix__ || * (__APPLE__ && __MACH__)) */ #if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) /* * This is a convenience shorthand macro to avoid checking the long * preprocessor conditions above. Ideally, we could expose this macro in * platform_util.h and simply use it in platform_util.c, threading.c and * threading.h. However, this macro is not part of the Mbed TLS public API, so * we keep it private by only defining it in this file */ #if ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) #define PLATFORM_UTIL_USE_GMTIME #endif /* ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) */ #endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) */ struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt, struct tm *tm_buf ) { #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) return( ( gmtime_s( tm_buf, tt ) == 0 ) ? tm_buf : NULL ); #elif !defined(PLATFORM_UTIL_USE_GMTIME) return( gmtime_r( tt, tm_buf ) ); #else struct tm *lt; #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_lock( &mbedtls_threading_gmtime_mutex ) != 0 ) return( NULL ); #endif /* MBEDTLS_THREADING_C */ lt = gmtime( tt ); if( lt != NULL ) { memcpy( tm_buf, lt, sizeof( struct tm ) ); } #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &mbedtls_threading_gmtime_mutex ) != 0 ) return( NULL ); #endif /* MBEDTLS_THREADING_C */ return( ( lt == NULL ) ? NULL : tm_buf ); #endif /* _WIN32 && !EFIX64 && !EFI32 */ } #endif /* MBEDTLS_HAVE_TIME_DATE && MBEDTLS_PLATFORM_GMTIME_R_ALT */ fldigi-4.1.06/src/mbedtls/libmbedtls.pc0000664000175000017500000000130413507401434014650 00000000000000#*************************************************************************** # # Example libmbedtls.pc file # # This example is for compiled and linked libmbedtls targeted for # /usr/local/lib # # If library is in /usr/lib then change the prefix accordingly # # The pc file is placed in the location ${prefix}/lib/pkgconfig/ # ########################################################################### prefix=/usr/local exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/mbedtls Name: libmbedtls Description: Library to access network sites using https protocol Version: 2.16.0 Libs: -L${libdir} -lmbedx509 -lmbedtls -lmbedcrypto Cflags: -I${prefix}/include -I${includedir} fldigi-4.1.06/src/mbedtls/threading.c0000664000175000017500000001412613507401434014322 00000000000000/* * Threading abstraction layer * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * Ensure gmtime_r is available even with -std=c99; must be defined before * config.h, which pulls in glibc's features.h. Harmless on other platforms. */ #if !defined(_POSIX_C_SOURCE) #define _POSIX_C_SOURCE 200112L #endif #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) #if !defined(_WIN32) && (defined(unix) || \ defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ defined(__MACH__))) #include #endif /* !_WIN32 && (unix || __unix || __unix__ || * (__APPLE__ && __MACH__)) */ #if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) /* * This is a convenience shorthand macro to avoid checking the long * preprocessor conditions above. Ideally, we could expose this macro in * platform_util.h and simply use it in platform_util.c, threading.c and * threading.h. However, this macro is not part of the Mbed TLS public API, so * we keep it private by only defining it in this file */ #if ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) #define THREADING_USE_GMTIME #endif /* ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) */ #endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) */ #endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ #if defined(MBEDTLS_THREADING_PTHREAD) static void threading_mutex_init_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL ) return; mutex->is_valid = pthread_mutex_init( &mutex->mutex, NULL ) == 0; } static void threading_mutex_free_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL || !mutex->is_valid ) return; (void) pthread_mutex_destroy( &mutex->mutex ); mutex->is_valid = 0; } static int threading_mutex_lock_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL || ! mutex->is_valid ) return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA ); if( pthread_mutex_lock( &mutex->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); return( 0 ); } static int threading_mutex_unlock_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL || ! mutex->is_valid ) return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA ); if( pthread_mutex_unlock( &mutex->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); return( 0 ); } void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_init_pthread; void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_free_pthread; int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_lock_pthread; int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_unlock_pthread; /* * With phtreads we can statically initialize mutexes */ #define MUTEX_INIT = { PTHREAD_MUTEX_INITIALIZER, 1 } #endif /* MBEDTLS_THREADING_PTHREAD */ #if defined(MBEDTLS_THREADING_ALT) static int threading_mutex_fail( mbedtls_threading_mutex_t *mutex ) { ((void) mutex ); return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA ); } static void threading_mutex_dummy( mbedtls_threading_mutex_t *mutex ) { ((void) mutex ); return; } void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy; void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy; int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail; int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail; /* * Set functions pointers and initialize global mutexes */ void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ), void (*mutex_free)( mbedtls_threading_mutex_t * ), int (*mutex_lock)( mbedtls_threading_mutex_t * ), int (*mutex_unlock)( mbedtls_threading_mutex_t * ) ) { mbedtls_mutex_init = mutex_init; mbedtls_mutex_free = mutex_free; mbedtls_mutex_lock = mutex_lock; mbedtls_mutex_unlock = mutex_unlock; #if defined(MBEDTLS_FS_IO) mbedtls_mutex_init( &mbedtls_threading_readdir_mutex ); #endif #if defined(THREADING_USE_GMTIME) mbedtls_mutex_init( &mbedtls_threading_gmtime_mutex ); #endif } /* * Free global mutexes */ void mbedtls_threading_free_alt( void ) { #if defined(MBEDTLS_FS_IO) mbedtls_mutex_free( &mbedtls_threading_readdir_mutex ); #endif #if defined(THREADING_USE_GMTIME) mbedtls_mutex_free( &mbedtls_threading_gmtime_mutex ); #endif } #endif /* MBEDTLS_THREADING_ALT */ /* * Define global mutexes */ #ifndef MUTEX_INIT #define MUTEX_INIT #endif #if defined(MBEDTLS_FS_IO) mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex MUTEX_INIT; #endif #if defined(THREADING_USE_GMTIME) mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex MUTEX_INIT; #endif #endif /* MBEDTLS_THREADING_C */ fldigi-4.1.06/src/mbedtls/xtea.c0000664000175000017500000001657513507401434013330 00000000000000/* * An 32-bit implementation of the XTEA algorithm * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_XTEA_C) #include "mbedtls/xtea.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_XTEA_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif void mbedtls_xtea_init( mbedtls_xtea_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_xtea_context ) ); } void mbedtls_xtea_free( mbedtls_xtea_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_xtea_context ) ); } /* * XTEA key schedule */ void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] ) { int i; memset( ctx, 0, sizeof(mbedtls_xtea_context) ); for( i = 0; i < 4; i++ ) { GET_UINT32_BE( ctx->k[i], key, i << 2 ); } } /* * XTEA encrypt function */ int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, int mode, const unsigned char input[8], unsigned char output[8]) { uint32_t *k, v0, v1, i; k = ctx->k; GET_UINT32_BE( v0, input, 0 ); GET_UINT32_BE( v1, input, 4 ); if( mode == MBEDTLS_XTEA_ENCRYPT ) { uint32_t sum = 0, delta = 0x9E3779B9; for( i = 0; i < 32; i++ ) { v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); sum += delta; v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); } } else /* MBEDTLS_XTEA_DECRYPT */ { uint32_t delta = 0x9E3779B9, sum = delta * 32; for( i = 0; i < 32; i++ ) { v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); sum -= delta; v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); } } PUT_UINT32_BE( v0, output, 0 ); PUT_UINT32_BE( v1, output, 4 ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * XTEA-CBC buffer encryption/decryption */ int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output) { int i; unsigned char temp[8]; if( length % 8 ) return( MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_XTEA_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, 8 ); mbedtls_xtea_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 8 ); input += 8; output += 8; length -= 8; } } else { while( length > 0 ) { for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_xtea_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; length -= 8; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* !MBEDTLS_XTEA_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * XTEA tests vectors (non-official) */ static const unsigned char xtea_test_key[6][16] = { { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char xtea_test_pt[6][8] = { { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, { 0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f }, { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, { 0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55 } }; static const unsigned char xtea_test_ct[6][8] = { { 0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5 }, { 0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8 }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, { 0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5 }, { 0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 } }; /* * Checkup routine */ int mbedtls_xtea_self_test( int verbose ) { int i, ret = 0; unsigned char buf[8]; mbedtls_xtea_context ctx; mbedtls_xtea_init( &ctx ); for( i = 0; i < 6; i++ ) { if( verbose != 0 ) mbedtls_printf( " XTEA test #%d: ", i + 1 ); memcpy( buf, xtea_test_pt[i], 8 ); mbedtls_xtea_setup( &ctx, xtea_test_key[i] ); mbedtls_xtea_crypt_ecb( &ctx, MBEDTLS_XTEA_ENCRYPT, buf, buf ); if( memcmp( buf, xtea_test_ct[i], 8 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_xtea_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_XTEA_C */ fldigi-4.1.06/src/mbedtls/hmac_drbg.c0000664000175000017500000004303113507401434014260 00000000000000/* * HMAC_DRBG implementation (NIST SP 800-90) * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The NIST SP 800-90A DRBGs are described in the following publication. * http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf * References below are based on rev. 1 (January 2012). */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HMAC_DRBG_C) #include "mbedtls/hmac_drbg.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_FS_IO) #include #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_PLATFORM_C */ /* * HMAC_DRBG context initialization */ void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_hmac_drbg_context ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } /* * HMAC_DRBG update, using optional additional data (10.1.2.2) */ int mbedtls_hmac_drbg_update_ret( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info ); unsigned char rounds = ( additional != NULL && add_len != 0 ) ? 2 : 1; unsigned char sep[1]; unsigned char K[MBEDTLS_MD_MAX_SIZE]; int ret; for( sep[0] = 0; sep[0] < rounds; sep[0]++ ) { /* Step 1 or 4 */ if( ( ret = mbedtls_md_hmac_reset( &ctx->md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, sep, 1 ) ) != 0 ) goto exit; if( rounds == 2 ) { if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, additional, add_len ) ) != 0 ) goto exit; } if( ( ret = mbedtls_md_hmac_finish( &ctx->md_ctx, K ) ) != 0 ) goto exit; /* Step 2 or 5 */ if( ( ret = mbedtls_md_hmac_starts( &ctx->md_ctx, K, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V ) ) != 0 ) goto exit; } exit: mbedtls_platform_zeroize( K, sizeof( K ) ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { (void) mbedtls_hmac_drbg_update_ret( ctx, additional, add_len ); } #endif /* MBEDTLS_DEPRECATED_REMOVED */ /* * Simplified HMAC_DRBG initialisation (for use with deterministic ECDSA) */ int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, const unsigned char *data, size_t data_len ) { int ret; if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 ) return( ret ); /* * Set initial working state. * Use the V memory location, which is currently all 0, to initialize the * MD context with an all-zero key. Then set V to its initial value. */ if( ( ret = mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, mbedtls_md_get_size( md_info ) ) ) != 0 ) return( ret ); memset( ctx->V, 0x01, mbedtls_md_get_size( md_info ) ); if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, data, data_len ) ) != 0 ) return( ret ); return( 0 ); } /* * HMAC_DRBG reseeding: 10.1.2.4 (arabic) + 9.2 (Roman) */ int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t len ) { unsigned char seed[MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT]; size_t seedlen; int ret; /* III. Check input length */ if( len > MBEDTLS_HMAC_DRBG_MAX_INPUT || ctx->entropy_len + len > MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT ) { return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG ); } memset( seed, 0, MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT ); /* IV. Gather entropy_len bytes of entropy for the seed */ if( ( ret = ctx->f_entropy( ctx->p_entropy, seed, ctx->entropy_len ) ) != 0 ) return( MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED ); seedlen = ctx->entropy_len; /* 1. Concatenate entropy and additional data if any */ if( additional != NULL && len != 0 ) { memcpy( seed + seedlen, additional, len ); seedlen += len; } /* 2. Update state */ if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, seed, seedlen ) ) != 0 ) goto exit; /* 3. Reset reseed_counter */ ctx->reseed_counter = 1; exit: /* 4. Done */ mbedtls_platform_zeroize( seed, seedlen ); return( ret ); } /* * HMAC_DRBG initialisation (10.1.2.3 + 9.1) */ int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ) { int ret; size_t entropy_len, md_size; if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 ) return( ret ); md_size = mbedtls_md_get_size( md_info ); /* * Set initial working state. * Use the V memory location, which is currently all 0, to initialize the * MD context with an all-zero key. Then set V to its initial value. */ if( ( ret = mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, md_size ) ) != 0 ) return( ret ); memset( ctx->V, 0x01, md_size ); ctx->f_entropy = f_entropy; ctx->p_entropy = p_entropy; ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL; /* * See SP800-57 5.6.1 (p. 65-66) for the security strength provided by * each hash function, then according to SP800-90A rev1 10.1 table 2, * min_entropy_len (in bits) is security_strength. * * (This also matches the sizes used in the NIST test vectors.) */ entropy_len = md_size <= 20 ? 16 : /* 160-bits hash -> 128 bits */ md_size <= 28 ? 24 : /* 224-bits hash -> 192 bits */ 32; /* better (256+) -> 256 bits */ /* * For initialisation, use more entropy to emulate a nonce * (Again, matches test vectors.) */ ctx->entropy_len = entropy_len * 3 / 2; if( ( ret = mbedtls_hmac_drbg_reseed( ctx, custom, len ) ) != 0 ) return( ret ); ctx->entropy_len = entropy_len; return( 0 ); } /* * Set prediction resistance */ void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx, int resistance ) { ctx->prediction_resistance = resistance; } /* * Set entropy length grabbed for reseeds */ void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, size_t len ) { ctx->entropy_len = len; } /* * Set reseed interval */ void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, int interval ) { ctx->reseed_interval = interval; } /* * HMAC_DRBG random function with optional additional data: * 10.1.2.5 (arabic) + 9.3 (Roman) */ int mbedtls_hmac_drbg_random_with_add( void *p_rng, unsigned char *output, size_t out_len, const unsigned char *additional, size_t add_len ) { int ret; mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng; size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info ); size_t left = out_len; unsigned char *out = output; /* II. Check request length */ if( out_len > MBEDTLS_HMAC_DRBG_MAX_REQUEST ) return( MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG ); /* III. Check input length */ if( add_len > MBEDTLS_HMAC_DRBG_MAX_INPUT ) return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG ); /* 1. (aka VII and IX) Check reseed counter and PR */ if( ctx->f_entropy != NULL && /* For no-reseeding instances */ ( ctx->prediction_resistance == MBEDTLS_HMAC_DRBG_PR_ON || ctx->reseed_counter > ctx->reseed_interval ) ) { if( ( ret = mbedtls_hmac_drbg_reseed( ctx, additional, add_len ) ) != 0 ) return( ret ); add_len = 0; /* VII.4 */ } /* 2. Use additional data if any */ if( additional != NULL && add_len != 0 ) { if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, additional, add_len ) ) != 0 ) goto exit; } /* 3, 4, 5. Generate bytes */ while( left != 0 ) { size_t use_len = left > md_len ? md_len : left; if( ( ret = mbedtls_md_hmac_reset( &ctx->md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V ) ) != 0 ) goto exit; memcpy( out, ctx->V, use_len ); out += use_len; left -= use_len; } /* 6. Update */ if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, additional, add_len ) ) != 0 ) goto exit; /* 7. Update reseed counter */ ctx->reseed_counter++; exit: /* 8. Done */ return( ret ); } /* * HMAC_DRBG random function */ int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len ) { int ret; mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = mbedtls_hmac_drbg_random_with_add( ctx, output, out_len, NULL, 0 ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Free an HMAC_DRBG context */ void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_md_free( &ctx->md_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_hmac_drbg_context ) ); } #if defined(MBEDTLS_FS_IO) int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ) { int ret; FILE *f; unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ]; if( ( f = fopen( path, "wb" ) ) == NULL ) return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR ); if( ( ret = mbedtls_hmac_drbg_random( ctx, buf, sizeof( buf ) ) ) != 0 ) goto exit; if( fwrite( buf, 1, sizeof( buf ), f ) != sizeof( buf ) ) { ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; goto exit; } ret = 0; exit: fclose( f ); mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ) { int ret = 0; FILE *f = NULL; size_t n; unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ]; unsigned char c; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR ); n = fread( buf, 1, sizeof( buf ), f ); if( fread( &c, 1, 1, f ) != 0 ) { ret = MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG; goto exit; } if( n == 0 || ferror( f ) ) { ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; goto exit; } fclose( f ); f = NULL; ret = mbedtls_hmac_drbg_update_ret( ctx, buf, n ); exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); if( f != NULL ) fclose( f ); if( ret != 0 ) return( ret ); return( mbedtls_hmac_drbg_write_seed_file( ctx, path ) ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) #if !defined(MBEDTLS_SHA1_C) /* Dummy checkup routine */ int mbedtls_hmac_drbg_self_test( int verbose ) { (void) verbose; return( 0 ); } #else #define OUTPUT_LEN 80 /* From a NIST PR=true test vector */ static const unsigned char entropy_pr[] = { 0xa0, 0xc9, 0xab, 0x58, 0xf1, 0xe2, 0xe5, 0xa4, 0xde, 0x3e, 0xbd, 0x4f, 0xf7, 0x3e, 0x9c, 0x5b, 0x64, 0xef, 0xd8, 0xca, 0x02, 0x8c, 0xf8, 0x11, 0x48, 0xa5, 0x84, 0xfe, 0x69, 0xab, 0x5a, 0xee, 0x42, 0xaa, 0x4d, 0x42, 0x17, 0x60, 0x99, 0xd4, 0x5e, 0x13, 0x97, 0xdc, 0x40, 0x4d, 0x86, 0xa3, 0x7b, 0xf5, 0x59, 0x54, 0x75, 0x69, 0x51, 0xe4 }; static const unsigned char result_pr[OUTPUT_LEN] = { 0x9a, 0x00, 0xa2, 0xd0, 0x0e, 0xd5, 0x9b, 0xfe, 0x31, 0xec, 0xb1, 0x39, 0x9b, 0x60, 0x81, 0x48, 0xd1, 0x96, 0x9d, 0x25, 0x0d, 0x3c, 0x1e, 0x94, 0x10, 0x10, 0x98, 0x12, 0x93, 0x25, 0xca, 0xb8, 0xfc, 0xcc, 0x2d, 0x54, 0x73, 0x19, 0x70, 0xc0, 0x10, 0x7a, 0xa4, 0x89, 0x25, 0x19, 0x95, 0x5e, 0x4b, 0xc6, 0x00, 0x1d, 0x7f, 0x4e, 0x6a, 0x2b, 0xf8, 0xa3, 0x01, 0xab, 0x46, 0x05, 0x5c, 0x09, 0xa6, 0x71, 0x88, 0xf1, 0xa7, 0x40, 0xee, 0xf3, 0xe1, 0x5c, 0x02, 0x9b, 0x44, 0xaf, 0x03, 0x44 }; /* From a NIST PR=false test vector */ static const unsigned char entropy_nopr[] = { 0x79, 0x34, 0x9b, 0xbf, 0x7c, 0xdd, 0xa5, 0x79, 0x95, 0x57, 0x86, 0x66, 0x21, 0xc9, 0x13, 0x83, 0x11, 0x46, 0x73, 0x3a, 0xbf, 0x8c, 0x35, 0xc8, 0xc7, 0x21, 0x5b, 0x5b, 0x96, 0xc4, 0x8e, 0x9b, 0x33, 0x8c, 0x74, 0xe3, 0xe9, 0x9d, 0xfe, 0xdf }; static const unsigned char result_nopr[OUTPUT_LEN] = { 0xc6, 0xa1, 0x6a, 0xb8, 0xd4, 0x20, 0x70, 0x6f, 0x0f, 0x34, 0xab, 0x7f, 0xec, 0x5a, 0xdc, 0xa9, 0xd8, 0xca, 0x3a, 0x13, 0x3e, 0x15, 0x9c, 0xa6, 0xac, 0x43, 0xc6, 0xf8, 0xa2, 0xbe, 0x22, 0x83, 0x4a, 0x4c, 0x0a, 0x0a, 0xff, 0xb1, 0x0d, 0x71, 0x94, 0xf1, 0xc1, 0xa5, 0xcf, 0x73, 0x22, 0xec, 0x1a, 0xe0, 0x96, 0x4e, 0xd4, 0xbf, 0x12, 0x27, 0x46, 0xe0, 0x87, 0xfd, 0xb5, 0xb3, 0xe9, 0x1b, 0x34, 0x93, 0xd5, 0xbb, 0x98, 0xfa, 0xed, 0x49, 0xe8, 0x5f, 0x13, 0x0f, 0xc8, 0xa4, 0x59, 0xb7 }; /* "Entropy" from buffer */ static size_t test_offset; static int hmac_drbg_self_test_entropy( void *data, unsigned char *buf, size_t len ) { const unsigned char *p = data; memcpy( buf, p + test_offset, len ); test_offset += len; return( 0 ); } #define CHK( c ) if( (c) != 0 ) \ { \ if( verbose != 0 ) \ mbedtls_printf( "failed\n" ); \ return( 1 ); \ } /* * Checkup routine for HMAC_DRBG with SHA-1 */ int mbedtls_hmac_drbg_self_test( int verbose ) { mbedtls_hmac_drbg_context ctx; unsigned char buf[OUTPUT_LEN]; const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ); mbedtls_hmac_drbg_init( &ctx ); /* * PR = True */ if( verbose != 0 ) mbedtls_printf( " HMAC_DRBG (PR = True) : " ); test_offset = 0; CHK( mbedtls_hmac_drbg_seed( &ctx, md_info, hmac_drbg_self_test_entropy, (void *) entropy_pr, NULL, 0 ) ); mbedtls_hmac_drbg_set_prediction_resistance( &ctx, MBEDTLS_HMAC_DRBG_PR_ON ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( memcmp( buf, result_pr, OUTPUT_LEN ) ); mbedtls_hmac_drbg_free( &ctx ); mbedtls_hmac_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); /* * PR = False */ if( verbose != 0 ) mbedtls_printf( " HMAC_DRBG (PR = False) : " ); mbedtls_hmac_drbg_init( &ctx ); test_offset = 0; CHK( mbedtls_hmac_drbg_seed( &ctx, md_info, hmac_drbg_self_test_entropy, (void *) entropy_nopr, NULL, 0 ) ); CHK( mbedtls_hmac_drbg_reseed( &ctx, NULL, 0 ) ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( memcmp( buf, result_nopr, OUTPUT_LEN ) ); mbedtls_hmac_drbg_free( &ctx ); mbedtls_hmac_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_HMAC_DRBG_C */ fldigi-4.1.06/src/mbedtls/des.c0000664000175000017500000007625113507401434013137 00000000000000/* * FIPS-46-3 compliant Triple-DES implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * DES, on which TDES is based, was originally designed by Horst Feistel * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS). * * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_DES_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif /* * Expanded DES S-boxes */ static const uint32_t SB1[64] = { 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004 }; static const uint32_t SB2[64] = { 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000 }; static const uint32_t SB3[64] = { 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200 }; static const uint32_t SB4[64] = { 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080 }; static const uint32_t SB5[64] = { 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100 }; static const uint32_t SB6[64] = { 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010 }; static const uint32_t SB7[64] = { 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002 }; static const uint32_t SB8[64] = { 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000 }; /* * PC1: left and right halves bit-swap */ static const uint32_t LHs[16] = { 0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00010000, 0x00010001, 0x00010100, 0x00010101, 0x01000000, 0x01000001, 0x01000100, 0x01000101, 0x01010000, 0x01010001, 0x01010100, 0x01010101 }; static const uint32_t RHs[16] = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101, }; /* * Initial Permutation macro */ #define DES_IP(X,Y) \ { \ T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \ T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \ X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \ } /* * Final Permutation macro */ #define DES_FP(X,Y) \ { \ X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \ T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \ Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \ T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ } /* * DES round macro */ #define DES_ROUND(X,Y) \ { \ T = *SK++ ^ X; \ Y ^= SB8[ (T ) & 0x3F ] ^ \ SB6[ (T >> 8) & 0x3F ] ^ \ SB4[ (T >> 16) & 0x3F ] ^ \ SB2[ (T >> 24) & 0x3F ]; \ \ T = *SK++ ^ ((X << 28) | (X >> 4)); \ Y ^= SB7[ (T ) & 0x3F ] ^ \ SB5[ (T >> 8) & 0x3F ] ^ \ SB3[ (T >> 16) & 0x3F ] ^ \ SB1[ (T >> 24) & 0x3F ]; \ } #define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; } void mbedtls_des_init( mbedtls_des_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_des_context ) ); } void mbedtls_des_free( mbedtls_des_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_des_context ) ); } void mbedtls_des3_init( mbedtls_des3_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_des3_context ) ); } void mbedtls_des3_free( mbedtls_des3_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_des3_context ) ); } static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8, 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44, 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81, 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112, 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140, 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168, 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196, 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224, 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253, 254 }; void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ ) key[i] = odd_parity_table[key[i] / 2]; } /* * Check the given key's parity, returns 1 on failure, 0 on SUCCESS */ int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ ) if( key[i] != odd_parity_table[key[i] / 2] ) return( 1 ); return( 0 ); } /* * Table of weak and semi-weak keys * * Source: http://en.wikipedia.org/wiki/Weak_key * * Weak: * Alternating ones + zeros (0x0101010101010101) * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE) * '0xE0E0E0E0F1F1F1F1' * '0x1F1F1F1F0E0E0E0E' * * Semi-weak: * 0x011F011F010E010E and 0x1F011F010E010E01 * 0x01E001E001F101F1 and 0xE001E001F101F101 * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01 * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1 * */ #define WEAK_KEY_COUNT 16 static const unsigned char weak_key_table[WEAK_KEY_COUNT][MBEDTLS_DES_KEY_SIZE] = { { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE }, { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E }, { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 }, { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E }, { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 }, { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 }, { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 }, { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE }, { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 }, { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 }, { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E }, { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE }, { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E }, { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE }, { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 } }; int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; for( i = 0; i < WEAK_KEY_COUNT; i++ ) if( memcmp( weak_key_table[i], key, MBEDTLS_DES_KEY_SIZE) == 0 ) return( 1 ); return( 0 ); } #if !defined(MBEDTLS_DES_SETKEY_ALT) void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; uint32_t X, Y, T; GET_UINT32_BE( X, key, 0 ); GET_UINT32_BE( Y, key, 4 ); /* * Permuted Choice 1 */ T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4); T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T ); X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2) | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] ) | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6) | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4); Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2) | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] ) | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6) | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4); X &= 0x0FFFFFFF; Y &= 0x0FFFFFFF; /* * calculate subkeys */ for( i = 0; i < 16; i++ ) { if( i < 2 || i == 8 || i == 15 ) { X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF; Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF; } else { X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF; Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF; } *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000) | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000) | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000) | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000) | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000) | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000) | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400) | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100) | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010) | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004) | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001); *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000) | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000) | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000) | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000) | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000) | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000) | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000) | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400) | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100) | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011) | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002); } } #endif /* !MBEDTLS_DES_SETKEY_ALT */ /* * DES key schedule (56-bit, encryption) */ int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { mbedtls_des_setkey( ctx->sk, key ); return( 0 ); } /* * DES key schedule (56-bit, decryption) */ int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; mbedtls_des_setkey( ctx->sk, key ); for( i = 0; i < 16; i += 2 ) { SWAP( ctx->sk[i ], ctx->sk[30 - i] ); SWAP( ctx->sk[i + 1], ctx->sk[31 - i] ); } return( 0 ); } static void des3_set2key( uint32_t esk[96], uint32_t dsk[96], const unsigned char key[MBEDTLS_DES_KEY_SIZE*2] ) { int i; mbedtls_des_setkey( esk, key ); mbedtls_des_setkey( dsk + 32, key + 8 ); for( i = 0; i < 32; i += 2 ) { dsk[i ] = esk[30 - i]; dsk[i + 1] = esk[31 - i]; esk[i + 32] = dsk[62 - i]; esk[i + 33] = dsk[63 - i]; esk[i + 64] = esk[i ]; esk[i + 65] = esk[i + 1]; dsk[i + 64] = dsk[i ]; dsk[i + 65] = dsk[i + 1]; } } /* * Triple-DES key schedule (112-bit, encryption) */ int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ) { uint32_t sk[96]; des3_set2key( ctx->sk, sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } /* * Triple-DES key schedule (112-bit, decryption) */ int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ) { uint32_t sk[96]; des3_set2key( sk, ctx->sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } static void des3_set3key( uint32_t esk[96], uint32_t dsk[96], const unsigned char key[24] ) { int i; mbedtls_des_setkey( esk, key ); mbedtls_des_setkey( dsk + 32, key + 8 ); mbedtls_des_setkey( esk + 64, key + 16 ); for( i = 0; i < 32; i += 2 ) { dsk[i ] = esk[94 - i]; dsk[i + 1] = esk[95 - i]; esk[i + 32] = dsk[62 - i]; esk[i + 33] = dsk[63 - i]; dsk[i + 64] = esk[30 - i]; dsk[i + 65] = esk[31 - i]; } } /* * Triple-DES key schedule (168-bit, encryption) */ int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ) { uint32_t sk[96]; des3_set3key( ctx->sk, sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } /* * Triple-DES key schedule (168-bit, decryption) */ int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ) { uint32_t sk[96]; des3_set3key( sk, ctx->sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } /* * DES-ECB block encryption/decryption */ #if !defined(MBEDTLS_DES_CRYPT_ECB_ALT) int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx, const unsigned char input[8], unsigned char output[8] ) { int i; uint32_t X, Y, T, *SK; SK = ctx->sk; GET_UINT32_BE( X, input, 0 ); GET_UINT32_BE( Y, input, 4 ); DES_IP( X, Y ); for( i = 0; i < 8; i++ ) { DES_ROUND( Y, X ); DES_ROUND( X, Y ); } DES_FP( Y, X ); PUT_UINT32_BE( Y, output, 0 ); PUT_UINT32_BE( X, output, 4 ); return( 0 ); } #endif /* !MBEDTLS_DES_CRYPT_ECB_ALT */ #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * DES-CBC buffer encryption/decryption */ int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[8]; if( length % 8 ) return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_DES_ENCRYPT ) { while( length > 0 ) { for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_des_crypt_ecb( ctx, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; length -= 8; } } else /* MBEDTLS_DES_DECRYPT */ { while( length > 0 ) { memcpy( temp, input, 8 ); mbedtls_des_crypt_ecb( ctx, input, output ); for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 8 ); input += 8; output += 8; length -= 8; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ /* * 3DES-ECB block encryption/decryption */ #if !defined(MBEDTLS_DES3_CRYPT_ECB_ALT) int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx, const unsigned char input[8], unsigned char output[8] ) { int i; uint32_t X, Y, T, *SK; SK = ctx->sk; GET_UINT32_BE( X, input, 0 ); GET_UINT32_BE( Y, input, 4 ); DES_IP( X, Y ); for( i = 0; i < 8; i++ ) { DES_ROUND( Y, X ); DES_ROUND( X, Y ); } for( i = 0; i < 8; i++ ) { DES_ROUND( X, Y ); DES_ROUND( Y, X ); } for( i = 0; i < 8; i++ ) { DES_ROUND( Y, X ); DES_ROUND( X, Y ); } DES_FP( Y, X ); PUT_UINT32_BE( Y, output, 0 ); PUT_UINT32_BE( X, output, 4 ); return( 0 ); } #endif /* !MBEDTLS_DES3_CRYPT_ECB_ALT */ #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * 3DES-CBC buffer encryption/decryption */ int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[8]; if( length % 8 ) return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_DES_ENCRYPT ) { while( length > 0 ) { for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_des3_crypt_ecb( ctx, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; length -= 8; } } else /* MBEDTLS_DES_DECRYPT */ { while( length > 0 ) { memcpy( temp, input, 8 ); mbedtls_des3_crypt_ecb( ctx, input, output ); for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 8 ); input += 8; output += 8; length -= 8; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* !MBEDTLS_DES_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * DES and 3DES test vectors from: * * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip */ static const unsigned char des3_test_keys[24] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 }; static const unsigned char des3_test_buf[8] = { 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 }; static const unsigned char des3_test_ecb_dec[3][8] = { { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D }, { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB }, { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A } }; static const unsigned char des3_test_ecb_enc[3][8] = { { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B }, { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 }, { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 } }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const unsigned char des3_test_iv[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, }; static const unsigned char des3_test_cbc_dec[3][8] = { { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 }, { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 }, { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C } }; static const unsigned char des3_test_cbc_enc[3][8] = { { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 }, { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D }, { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ /* * Checkup routine */ int mbedtls_des_self_test( int verbose ) { int i, j, u, v, ret = 0; mbedtls_des_context ctx; mbedtls_des3_context ctx3; unsigned char buf[8]; #if defined(MBEDTLS_CIPHER_MODE_CBC) unsigned char prv[8]; unsigned char iv[8]; #endif mbedtls_des_init( &ctx ); mbedtls_des3_init( &ctx3 ); /* * ECB mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; v = i & 1; if( verbose != 0 ) mbedtls_printf( " DES%c-ECB-%3d (%s): ", ( u == 0 ) ? ' ' : '3', 56 + u * 56, ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" ); memcpy( buf, des3_test_buf, 8 ); switch( i ) { case 0: mbedtls_des_setkey_dec( &ctx, des3_test_keys ); break; case 1: mbedtls_des_setkey_enc( &ctx, des3_test_keys ); break; case 2: mbedtls_des3_set2key_dec( &ctx3, des3_test_keys ); break; case 3: mbedtls_des3_set2key_enc( &ctx3, des3_test_keys ); break; case 4: mbedtls_des3_set3key_dec( &ctx3, des3_test_keys ); break; case 5: mbedtls_des3_set3key_enc( &ctx3, des3_test_keys ); break; default: return( 1 ); } for( j = 0; j < 10000; j++ ) { if( u == 0 ) mbedtls_des_crypt_ecb( &ctx, buf, buf ); else mbedtls_des3_crypt_ecb( &ctx3, buf, buf ); } if( ( v == MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) || ( v != MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * CBC mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; v = i & 1; if( verbose != 0 ) mbedtls_printf( " DES%c-CBC-%3d (%s): ", ( u == 0 ) ? ' ' : '3', 56 + u * 56, ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" ); memcpy( iv, des3_test_iv, 8 ); memcpy( prv, des3_test_iv, 8 ); memcpy( buf, des3_test_buf, 8 ); switch( i ) { case 0: mbedtls_des_setkey_dec( &ctx, des3_test_keys ); break; case 1: mbedtls_des_setkey_enc( &ctx, des3_test_keys ); break; case 2: mbedtls_des3_set2key_dec( &ctx3, des3_test_keys ); break; case 3: mbedtls_des3_set2key_enc( &ctx3, des3_test_keys ); break; case 4: mbedtls_des3_set3key_dec( &ctx3, des3_test_keys ); break; case 5: mbedtls_des3_set3key_enc( &ctx3, des3_test_keys ); break; default: return( 1 ); } if( v == MBEDTLS_DES_DECRYPT ) { for( j = 0; j < 10000; j++ ) { if( u == 0 ) mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); else mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); } } else { for( j = 0; j < 10000; j++ ) { unsigned char tmp[8]; if( u == 0 ) mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); else mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); memcpy( tmp, prv, 8 ); memcpy( prv, buf, 8 ); memcpy( buf, tmp, 8 ); } memcpy( buf, prv, 8 ); } if( ( v == MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) || ( v != MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_des_free( &ctx ); mbedtls_des3_free( &ctx3 ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_DES_C */ fldigi-4.1.06/src/mbedtls/gcm.c0000664000175000017500000007642413507401434013134 00000000000000/* * NIST SP800-38D compliant GCM implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf * * See also: * [MGV] http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf * * We use the algorithm described as Shoup's method with 4-bit tables in * [MGV] 4.1, pp. 12-13, to enhance speed without using too much memory. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_AESNI_C) #include "mbedtls/aesni.h" #endif #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #include "mbedtls/aes.h" #include "mbedtls/platform.h" #if !defined(MBEDTLS_PLATFORM_C) #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_GCM_ALT) /* Parameter validation macros */ #define GCM_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_GCM_BAD_INPUT ) #define GCM_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif /* * Initialize a context */ void mbedtls_gcm_init( mbedtls_gcm_context *ctx ) { GCM_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_gcm_context ) ); } /* * Precompute small multiples of H, that is set * HH[i] || HL[i] = H times i, * where i is seen as a field element as in [MGV], ie high-order bits * correspond to low powers of P. The result is stored in the same way, that * is the high-order bit of HH corresponds to P^0 and the low-order bit of HL * corresponds to P^127. */ static int gcm_gen_table( mbedtls_gcm_context *ctx ) { int ret, i, j; uint64_t hi, lo; uint64_t vl, vh; unsigned char h[16]; size_t olen = 0; memset( h, 0, 16 ); if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, h, 16, h, &olen ) ) != 0 ) return( ret ); /* pack h as two 64-bits ints, big-endian */ GET_UINT32_BE( hi, h, 0 ); GET_UINT32_BE( lo, h, 4 ); vh = (uint64_t) hi << 32 | lo; GET_UINT32_BE( hi, h, 8 ); GET_UINT32_BE( lo, h, 12 ); vl = (uint64_t) hi << 32 | lo; /* 8 = 1000 corresponds to 1 in GF(2^128) */ ctx->HL[8] = vl; ctx->HH[8] = vh; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) /* With CLMUL support, we need only h, not the rest of the table */ if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) ) return( 0 ); #endif /* 0 corresponds to 0 in GF(2^128) */ ctx->HH[0] = 0; ctx->HL[0] = 0; for( i = 4; i > 0; i >>= 1 ) { uint32_t T = ( vl & 1 ) * 0xe1000000U; vl = ( vh << 63 ) | ( vl >> 1 ); vh = ( vh >> 1 ) ^ ( (uint64_t) T << 32); ctx->HL[i] = vl; ctx->HH[i] = vh; } for( i = 2; i <= 8; i *= 2 ) { uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i; vh = *HiH; vl = *HiL; for( j = 1; j < i; j++ ) { HiH[j] = vh ^ ctx->HH[j]; HiL[j] = vl ^ ctx->HL[j]; } } return( 0 ); } int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ) { int ret; const mbedtls_cipher_info_t *cipher_info; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( key != NULL ); GCM_VALIDATE_RET( keybits == 128 || keybits == 192 || keybits == 256 ); cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB ); if( cipher_info == NULL ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); if( cipher_info->block_size != 16 ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); mbedtls_cipher_free( &ctx->cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits, MBEDTLS_ENCRYPT ) ) != 0 ) { return( ret ); } if( ( ret = gcm_gen_table( ctx ) ) != 0 ) return( ret ); return( 0 ); } /* * Shoup's method for multiplication use this table with * last4[x] = x times P^128 * where x and last4[x] are seen as elements of GF(2^128) as in [MGV] */ static const uint64_t last4[16] = { 0x0000, 0x1c20, 0x3840, 0x2460, 0x7080, 0x6ca0, 0x48c0, 0x54e0, 0xe100, 0xfd20, 0xd940, 0xc560, 0x9180, 0x8da0, 0xa9c0, 0xb5e0 }; /* * Sets output to x times H using the precomputed tables. * x and output are seen as elements of GF(2^128) as in [MGV]. */ static void gcm_mult( mbedtls_gcm_context *ctx, const unsigned char x[16], unsigned char output[16] ) { int i = 0; unsigned char lo, hi, rem; uint64_t zh, zl; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) ) { unsigned char h[16]; PUT_UINT32_BE( ctx->HH[8] >> 32, h, 0 ); PUT_UINT32_BE( ctx->HH[8], h, 4 ); PUT_UINT32_BE( ctx->HL[8] >> 32, h, 8 ); PUT_UINT32_BE( ctx->HL[8], h, 12 ); mbedtls_aesni_gcm_mult( output, x, h ); return; } #endif /* MBEDTLS_AESNI_C && MBEDTLS_HAVE_X86_64 */ lo = x[15] & 0xf; zh = ctx->HH[lo]; zl = ctx->HL[lo]; for( i = 15; i >= 0; i-- ) { lo = x[i] & 0xf; hi = x[i] >> 4; if( i != 15 ) { rem = (unsigned char) zl & 0xf; zl = ( zh << 60 ) | ( zl >> 4 ); zh = ( zh >> 4 ); zh ^= (uint64_t) last4[rem] << 48; zh ^= ctx->HH[lo]; zl ^= ctx->HL[lo]; } rem = (unsigned char) zl & 0xf; zl = ( zh << 60 ) | ( zl >> 4 ); zh = ( zh >> 4 ); zh ^= (uint64_t) last4[rem] << 48; zh ^= ctx->HH[hi]; zl ^= ctx->HL[hi]; } PUT_UINT32_BE( zh >> 32, output, 0 ); PUT_UINT32_BE( zh, output, 4 ); PUT_UINT32_BE( zl >> 32, output, 8 ); PUT_UINT32_BE( zl, output, 12 ); } int mbedtls_gcm_starts( mbedtls_gcm_context *ctx, int mode, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len ) { int ret; unsigned char work_buf[16]; size_t i; const unsigned char *p; size_t use_len, olen = 0; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( iv != NULL ); GCM_VALIDATE_RET( add_len == 0 || add != NULL ); /* IV and AD are limited to 2^64 bits, so 2^61 bytes */ /* IV is not allowed to be zero length */ if( iv_len == 0 || ( (uint64_t) iv_len ) >> 61 != 0 || ( (uint64_t) add_len ) >> 61 != 0 ) { return( MBEDTLS_ERR_GCM_BAD_INPUT ); } memset( ctx->y, 0x00, sizeof(ctx->y) ); memset( ctx->buf, 0x00, sizeof(ctx->buf) ); ctx->mode = mode; ctx->len = 0; ctx->add_len = 0; if( iv_len == 12 ) { memcpy( ctx->y, iv, iv_len ); ctx->y[15] = 1; } else { memset( work_buf, 0x00, 16 ); PUT_UINT32_BE( iv_len * 8, work_buf, 12 ); p = iv; while( iv_len > 0 ) { use_len = ( iv_len < 16 ) ? iv_len : 16; for( i = 0; i < use_len; i++ ) ctx->y[i] ^= p[i]; gcm_mult( ctx, ctx->y, ctx->y ); iv_len -= use_len; p += use_len; } for( i = 0; i < 16; i++ ) ctx->y[i] ^= work_buf[i]; gcm_mult( ctx, ctx->y, ctx->y ); } if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->base_ectr, &olen ) ) != 0 ) { return( ret ); } ctx->add_len = add_len; p = add; while( add_len > 0 ) { use_len = ( add_len < 16 ) ? add_len : 16; for( i = 0; i < use_len; i++ ) ctx->buf[i] ^= p[i]; gcm_mult( ctx, ctx->buf, ctx->buf ); add_len -= use_len; p += use_len; } return( 0 ); } int mbedtls_gcm_update( mbedtls_gcm_context *ctx, size_t length, const unsigned char *input, unsigned char *output ) { int ret; unsigned char ectr[16]; size_t i; const unsigned char *p; unsigned char *out_p = output; size_t use_len, olen = 0; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( length == 0 || input != NULL ); GCM_VALIDATE_RET( length == 0 || output != NULL ); if( output > input && (size_t) ( output - input ) < length ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); /* Total length is restricted to 2^39 - 256 bits, ie 2^36 - 2^5 bytes * Also check for possible overflow */ if( ctx->len + length < ctx->len || (uint64_t) ctx->len + length > 0xFFFFFFFE0ull ) { return( MBEDTLS_ERR_GCM_BAD_INPUT ); } ctx->len += length; p = input; while( length > 0 ) { use_len = ( length < 16 ) ? length : 16; for( i = 16; i > 12; i-- ) if( ++ctx->y[i - 1] != 0 ) break; if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ectr, &olen ) ) != 0 ) { return( ret ); } for( i = 0; i < use_len; i++ ) { if( ctx->mode == MBEDTLS_GCM_DECRYPT ) ctx->buf[i] ^= p[i]; out_p[i] = ectr[i] ^ p[i]; if( ctx->mode == MBEDTLS_GCM_ENCRYPT ) ctx->buf[i] ^= out_p[i]; } gcm_mult( ctx, ctx->buf, ctx->buf ); length -= use_len; p += use_len; out_p += use_len; } return( 0 ); } int mbedtls_gcm_finish( mbedtls_gcm_context *ctx, unsigned char *tag, size_t tag_len ) { unsigned char work_buf[16]; size_t i; uint64_t orig_len; uint64_t orig_add_len; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( tag != NULL ); orig_len = ctx->len * 8; orig_add_len = ctx->add_len * 8; if( tag_len > 16 || tag_len < 4 ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); memcpy( tag, ctx->base_ectr, tag_len ); if( orig_len || orig_add_len ) { memset( work_buf, 0x00, 16 ); PUT_UINT32_BE( ( orig_add_len >> 32 ), work_buf, 0 ); PUT_UINT32_BE( ( orig_add_len ), work_buf, 4 ); PUT_UINT32_BE( ( orig_len >> 32 ), work_buf, 8 ); PUT_UINT32_BE( ( orig_len ), work_buf, 12 ); for( i = 0; i < 16; i++ ) ctx->buf[i] ^= work_buf[i]; gcm_mult( ctx, ctx->buf, ctx->buf ); for( i = 0; i < tag_len; i++ ) tag[i] ^= ctx->buf[i]; } return( 0 ); } int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx, int mode, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, size_t tag_len, unsigned char *tag ) { int ret; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( iv != NULL ); GCM_VALIDATE_RET( add_len == 0 || add != NULL ); GCM_VALIDATE_RET( length == 0 || input != NULL ); GCM_VALIDATE_RET( length == 0 || output != NULL ); GCM_VALIDATE_RET( tag != NULL ); if( ( ret = mbedtls_gcm_starts( ctx, mode, iv, iv_len, add, add_len ) ) != 0 ) return( ret ); if( ( ret = mbedtls_gcm_update( ctx, length, input, output ) ) != 0 ) return( ret ); if( ( ret = mbedtls_gcm_finish( ctx, tag, tag_len ) ) != 0 ) return( ret ); return( 0 ); } int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *tag, size_t tag_len, const unsigned char *input, unsigned char *output ) { int ret; unsigned char check_tag[16]; size_t i; int diff; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( iv != NULL ); GCM_VALIDATE_RET( add_len == 0 || add != NULL ); GCM_VALIDATE_RET( tag != NULL ); GCM_VALIDATE_RET( length == 0 || input != NULL ); GCM_VALIDATE_RET( length == 0 || output != NULL ); if( ( ret = mbedtls_gcm_crypt_and_tag( ctx, MBEDTLS_GCM_DECRYPT, length, iv, iv_len, add, add_len, input, output, tag_len, check_tag ) ) != 0 ) { return( ret ); } /* Check tag in "constant-time" */ for( diff = 0, i = 0; i < tag_len; i++ ) diff |= tag[i] ^ check_tag[i]; if( diff != 0 ) { mbedtls_platform_zeroize( output, length ); return( MBEDTLS_ERR_GCM_AUTH_FAILED ); } return( 0 ); } void mbedtls_gcm_free( mbedtls_gcm_context *ctx ) { if( ctx == NULL ) return; mbedtls_cipher_free( &ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_gcm_context ) ); } #endif /* !MBEDTLS_GCM_ALT */ #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /* * AES-GCM test vectors from: * * http://csrc.nist.gov/groups/STM/cavp/documents/mac/gcmtestvectors.zip */ #define MAX_TESTS 6 static const int key_index[MAX_TESTS] = { 0, 0, 1, 1, 1, 1 }; static const unsigned char key[MAX_TESTS][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, }; static const size_t iv_len[MAX_TESTS] = { 12, 12, 12, 12, 8, 60 }; static const int iv_index[MAX_TESTS] = { 0, 0, 1, 1, 1, 2 }; static const unsigned char iv[MAX_TESTS][64] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88 }, { 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5, 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa, 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1, 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28, 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39, 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54, 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57, 0xa6, 0x37, 0xb3, 0x9b }, }; static const size_t add_len[MAX_TESTS] = { 0, 0, 0, 20, 20, 20 }; static const int add_index[MAX_TESTS] = { 0, 0, 0, 1, 1, 1 }; static const unsigned char additional[MAX_TESTS][64] = { { 0x00 }, { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2 }, }; static const size_t pt_len[MAX_TESTS] = { 0, 16, 64, 60, 60, 60 }; static const int pt_index[MAX_TESTS] = { 0, 0, 1, 1, 1, 1 }; static const unsigned char pt[MAX_TESTS][64] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, }; static const unsigned char ct[MAX_TESTS * 3][64] = { { 0x00 }, { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92, 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 }, { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85 }, { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, 0x3d, 0x58, 0xe0, 0x91 }, { 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a, 0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55, 0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8, 0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23, 0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2, 0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42, 0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07, 0xc2, 0x3f, 0x45, 0x98 }, { 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6, 0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94, 0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8, 0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7, 0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90, 0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f, 0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03, 0x4c, 0x34, 0xae, 0xe5 }, { 0x00 }, { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41, 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00 }, { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56 }, { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, 0xcc, 0xda, 0x27, 0x10 }, { 0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54, 0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8, 0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f, 0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57, 0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75, 0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9, 0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f, 0xa0, 0xf0, 0x62, 0xf7 }, { 0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c, 0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff, 0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef, 0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45, 0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9, 0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3, 0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7, 0xe9, 0xb7, 0x37, 0x3b }, { 0x00 }, { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18 }, { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad }, { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62 }, { 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32, 0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb, 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa, 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0, 0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0, 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78, 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99, 0xf4, 0x7c, 0x9b, 0x1f }, { 0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1, 0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20, 0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19, 0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4, 0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45, 0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde, 0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e, 0x44, 0xae, 0x7e, 0x3f }, }; static const unsigned char tag[MAX_TESTS * 3][16] = { { 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61, 0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a }, { 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd, 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf }, { 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6, 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 }, { 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb, 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 }, { 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85, 0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb }, { 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa, 0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50 }, { 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b, 0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35 }, { 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab, 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb }, { 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf, 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 }, { 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f, 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c }, { 0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24, 0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8 }, { 0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb, 0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9 }, { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b }, { 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 }, { 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd, 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c }, { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b }, { 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4, 0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2 }, { 0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0, 0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a }, }; int mbedtls_gcm_self_test( int verbose ) { mbedtls_gcm_context ctx; unsigned char buf[64]; unsigned char tag_buf[16]; int i, j, ret; mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES; for( j = 0; j < 3; j++ ) { int key_len = 128 + 64 * j; for( i = 0; i < MAX_TESTS; i++ ) { mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d (%s): ", key_len, i, "enc" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && key_len == 192 ) { mbedtls_printf( "skipped\n" ); break; } else if( ret != 0 ) { goto exit; } ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_ENCRYPT, pt_len[i], iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i], pt[pt_index[i]], buf, 16, tag_buf ); if( ret != 0 ) goto exit; if ( memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d (%s): ", key_len, i, "dec" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_DECRYPT, pt_len[i], iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i], ct[j * 6 + i], buf, 16, tag_buf ); if( ret != 0 ) goto exit; if( memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d split (%s): ", key_len, i, "enc" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_ENCRYPT, iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i] ); if( ret != 0 ) goto exit; if( pt_len[i] > 32 ) { size_t rest_len = pt_len[i] - 32; ret = mbedtls_gcm_update( &ctx, 32, pt[pt_index[i]], buf ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_update( &ctx, rest_len, pt[pt_index[i]] + 32, buf + 32 ); if( ret != 0 ) goto exit; } else { ret = mbedtls_gcm_update( &ctx, pt_len[i], pt[pt_index[i]], buf ); if( ret != 0 ) goto exit; } ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 ); if( ret != 0 ) goto exit; if( memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d split (%s): ", key_len, i, "dec" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_DECRYPT, iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i] ); if( ret != 0 ) goto exit; if( pt_len[i] > 32 ) { size_t rest_len = pt_len[i] - 32; ret = mbedtls_gcm_update( &ctx, 32, ct[j * 6 + i], buf ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_update( &ctx, rest_len, ct[j * 6 + i] + 32, buf + 32 ); if( ret != 0 ) goto exit; } else { ret = mbedtls_gcm_update( &ctx, pt_len[i], ct[j * 6 + i], buf ); if( ret != 0 ) goto exit; } ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 ); if( ret != 0 ) goto exit; if( memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } } if( verbose != 0 ) mbedtls_printf( "\n" ); ret = 0; exit: if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); mbedtls_gcm_free( &ctx ); } return( ret ); } #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #endif /* MBEDTLS_GCM_C */ fldigi-4.1.06/src/mbedtls/gpl-2.0.txt0000664000175000017500000004325413507401434014035 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. fldigi-4.1.06/src/mbedtls/memory_buffer_alloc.c0000664000175000017500000004612313507401434016372 00000000000000/* * Buffer-based memory allocator * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) #include "mbedtls/memory_buffer_alloc.h" /* No need for the header guard as MBEDTLS_MEMORY_BUFFER_ALLOC_C is dependent upon MBEDTLS_PLATFORM_C */ #include "mbedtls/platform.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_MEMORY_BACKTRACE) #include #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #endif #define MAGIC1 0xFF00AA55 #define MAGIC2 0xEE119966 #define MAX_BT 20 typedef struct _memory_header memory_header; struct _memory_header { size_t magic1; size_t size; size_t alloc; memory_header *prev; memory_header *next; memory_header *prev_free; memory_header *next_free; #if defined(MBEDTLS_MEMORY_BACKTRACE) char **trace; size_t trace_count; #endif size_t magic2; }; typedef struct { unsigned char *buf; size_t len; memory_header *first; memory_header *first_free; int verify; #if defined(MBEDTLS_MEMORY_DEBUG) size_t alloc_count; size_t free_count; size_t total_used; size_t maximum_used; size_t header_count; size_t maximum_header_count; #endif #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } buffer_alloc_ctx; static buffer_alloc_ctx heap; #if defined(MBEDTLS_MEMORY_DEBUG) static void debug_header( memory_header *hdr ) { #if defined(MBEDTLS_MEMORY_BACKTRACE) size_t i; #endif mbedtls_fprintf( stderr, "HDR: PTR(%10zu), PREV(%10zu), NEXT(%10zu), " "ALLOC(%zu), SIZE(%10zu)\n", (size_t) hdr, (size_t) hdr->prev, (size_t) hdr->next, hdr->alloc, hdr->size ); mbedtls_fprintf( stderr, " FPREV(%10zu), FNEXT(%10zu)\n", (size_t) hdr->prev_free, (size_t) hdr->next_free ); #if defined(MBEDTLS_MEMORY_BACKTRACE) mbedtls_fprintf( stderr, "TRACE: \n" ); for( i = 0; i < hdr->trace_count; i++ ) mbedtls_fprintf( stderr, "%s\n", hdr->trace[i] ); mbedtls_fprintf( stderr, "\n" ); #endif } static void debug_chain( void ) { memory_header *cur = heap.first; mbedtls_fprintf( stderr, "\nBlock list\n" ); while( cur != NULL ) { debug_header( cur ); cur = cur->next; } mbedtls_fprintf( stderr, "Free list\n" ); cur = heap.first_free; while( cur != NULL ) { debug_header( cur ); cur = cur->next_free; } } #endif /* MBEDTLS_MEMORY_DEBUG */ static int verify_header( memory_header *hdr ) { if( hdr->magic1 != MAGIC1 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: MAGIC1 mismatch\n" ); #endif return( 1 ); } if( hdr->magic2 != MAGIC2 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: MAGIC2 mismatch\n" ); #endif return( 1 ); } if( hdr->alloc > 1 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: alloc has illegal value\n" ); #endif return( 1 ); } if( hdr->prev != NULL && hdr->prev == hdr->next ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: prev == next\n" ); #endif return( 1 ); } if( hdr->prev_free != NULL && hdr->prev_free == hdr->next_free ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: prev_free == next_free\n" ); #endif return( 1 ); } return( 0 ); } static int verify_chain( void ) { memory_header *prv = heap.first, *cur; if( prv == NULL || verify_header( prv ) != 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification of first header " "failed\n" ); #endif return( 1 ); } if( heap.first->prev != NULL ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification failed: " "first->prev != NULL\n" ); #endif return( 1 ); } cur = heap.first->next; while( cur != NULL ) { if( verify_header( cur ) != 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification of header " "failed\n" ); #endif return( 1 ); } if( cur->prev != prv ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification failed: " "cur->prev != prv\n" ); #endif return( 1 ); } prv = cur; cur = cur->next; } return( 0 ); } static void *buffer_alloc_calloc( size_t n, size_t size ) { memory_header *new, *cur = heap.first_free; unsigned char *p; void *ret; size_t original_len, len; #if defined(MBEDTLS_MEMORY_BACKTRACE) void *trace_buffer[MAX_BT]; size_t trace_cnt; #endif if( heap.buf == NULL || heap.first == NULL ) return( NULL ); original_len = len = n * size; if( n == 0 || size == 0 || len / n != size ) return( NULL ); else if( len > (size_t)-MBEDTLS_MEMORY_ALIGN_MULTIPLE ) return( NULL ); if( len % MBEDTLS_MEMORY_ALIGN_MULTIPLE ) { len -= len % MBEDTLS_MEMORY_ALIGN_MULTIPLE; len += MBEDTLS_MEMORY_ALIGN_MULTIPLE; } // Find block that fits // while( cur != NULL ) { if( cur->size >= len ) break; cur = cur->next_free; } if( cur == NULL ) return( NULL ); if( cur->alloc != 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: block in free_list but allocated " "data\n" ); #endif mbedtls_exit( 1 ); } #if defined(MBEDTLS_MEMORY_DEBUG) heap.alloc_count++; #endif // Found location, split block if > memory_header + 4 room left // if( cur->size - len < sizeof(memory_header) + MBEDTLS_MEMORY_ALIGN_MULTIPLE ) { cur->alloc = 1; // Remove from free_list // if( cur->prev_free != NULL ) cur->prev_free->next_free = cur->next_free; else heap.first_free = cur->next_free; if( cur->next_free != NULL ) cur->next_free->prev_free = cur->prev_free; cur->prev_free = NULL; cur->next_free = NULL; #if defined(MBEDTLS_MEMORY_DEBUG) heap.total_used += cur->size; if( heap.total_used > heap.maximum_used ) heap.maximum_used = heap.total_used; #endif #if defined(MBEDTLS_MEMORY_BACKTRACE) trace_cnt = backtrace( trace_buffer, MAX_BT ); cur->trace = backtrace_symbols( trace_buffer, trace_cnt ); cur->trace_count = trace_cnt; #endif if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 ) mbedtls_exit( 1 ); ret = (unsigned char *) cur + sizeof( memory_header ); memset( ret, 0, original_len ); return( ret ); } p = ( (unsigned char *) cur ) + sizeof(memory_header) + len; new = (memory_header *) p; new->size = cur->size - len - sizeof(memory_header); new->alloc = 0; new->prev = cur; new->next = cur->next; #if defined(MBEDTLS_MEMORY_BACKTRACE) new->trace = NULL; new->trace_count = 0; #endif new->magic1 = MAGIC1; new->magic2 = MAGIC2; if( new->next != NULL ) new->next->prev = new; // Replace cur with new in free_list // new->prev_free = cur->prev_free; new->next_free = cur->next_free; if( new->prev_free != NULL ) new->prev_free->next_free = new; else heap.first_free = new; if( new->next_free != NULL ) new->next_free->prev_free = new; cur->alloc = 1; cur->size = len; cur->next = new; cur->prev_free = NULL; cur->next_free = NULL; #if defined(MBEDTLS_MEMORY_DEBUG) heap.header_count++; if( heap.header_count > heap.maximum_header_count ) heap.maximum_header_count = heap.header_count; heap.total_used += cur->size; if( heap.total_used > heap.maximum_used ) heap.maximum_used = heap.total_used; #endif #if defined(MBEDTLS_MEMORY_BACKTRACE) trace_cnt = backtrace( trace_buffer, MAX_BT ); cur->trace = backtrace_symbols( trace_buffer, trace_cnt ); cur->trace_count = trace_cnt; #endif if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 ) mbedtls_exit( 1 ); ret = (unsigned char *) cur + sizeof( memory_header ); memset( ret, 0, original_len ); return( ret ); } static void buffer_alloc_free( void *ptr ) { memory_header *hdr, *old = NULL; unsigned char *p = (unsigned char *) ptr; if( ptr == NULL || heap.buf == NULL || heap.first == NULL ) return; if( p < heap.buf || p >= heap.buf + heap.len ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: mbedtls_free() outside of managed " "space\n" ); #endif mbedtls_exit( 1 ); } p -= sizeof(memory_header); hdr = (memory_header *) p; if( verify_header( hdr ) != 0 ) mbedtls_exit( 1 ); if( hdr->alloc != 1 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: mbedtls_free() on unallocated " "data\n" ); #endif mbedtls_exit( 1 ); } hdr->alloc = 0; #if defined(MBEDTLS_MEMORY_DEBUG) heap.free_count++; heap.total_used -= hdr->size; #endif #if defined(MBEDTLS_MEMORY_BACKTRACE) free( hdr->trace ); hdr->trace = NULL; hdr->trace_count = 0; #endif // Regroup with block before // if( hdr->prev != NULL && hdr->prev->alloc == 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) heap.header_count--; #endif hdr->prev->size += sizeof(memory_header) + hdr->size; hdr->prev->next = hdr->next; old = hdr; hdr = hdr->prev; if( hdr->next != NULL ) hdr->next->prev = hdr; memset( old, 0, sizeof(memory_header) ); } // Regroup with block after // if( hdr->next != NULL && hdr->next->alloc == 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) heap.header_count--; #endif hdr->size += sizeof(memory_header) + hdr->next->size; old = hdr->next; hdr->next = hdr->next->next; if( hdr->prev_free != NULL || hdr->next_free != NULL ) { if( hdr->prev_free != NULL ) hdr->prev_free->next_free = hdr->next_free; else heap.first_free = hdr->next_free; if( hdr->next_free != NULL ) hdr->next_free->prev_free = hdr->prev_free; } hdr->prev_free = old->prev_free; hdr->next_free = old->next_free; if( hdr->prev_free != NULL ) hdr->prev_free->next_free = hdr; else heap.first_free = hdr; if( hdr->next_free != NULL ) hdr->next_free->prev_free = hdr; if( hdr->next != NULL ) hdr->next->prev = hdr; memset( old, 0, sizeof(memory_header) ); } // Prepend to free_list if we have not merged // (Does not have to stay in same order as prev / next list) // if( old == NULL ) { hdr->next_free = heap.first_free; if( heap.first_free != NULL ) heap.first_free->prev_free = hdr; heap.first_free = hdr; } if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_FREE ) && verify_chain() != 0 ) mbedtls_exit( 1 ); } void mbedtls_memory_buffer_set_verify( int verify ) { heap.verify = verify; } int mbedtls_memory_buffer_alloc_verify( void ) { return verify_chain(); } #if defined(MBEDTLS_MEMORY_DEBUG) void mbedtls_memory_buffer_alloc_status( void ) { mbedtls_fprintf( stderr, "Current use: %zu blocks / %zu bytes, max: %zu blocks / " "%zu bytes (total %zu bytes), alloc / free: %zu / %zu\n", heap.header_count, heap.total_used, heap.maximum_header_count, heap.maximum_used, heap.maximum_header_count * sizeof( memory_header ) + heap.maximum_used, heap.alloc_count, heap.free_count ); if( heap.first->next == NULL ) { mbedtls_fprintf( stderr, "All memory de-allocated in stack buffer\n" ); } else { mbedtls_fprintf( stderr, "Memory currently allocated:\n" ); debug_chain(); } } void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ) { *max_used = heap.maximum_used; *max_blocks = heap.maximum_header_count; } void mbedtls_memory_buffer_alloc_max_reset( void ) { heap.maximum_used = 0; heap.maximum_header_count = 0; } void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ) { *cur_used = heap.total_used; *cur_blocks = heap.header_count; } #endif /* MBEDTLS_MEMORY_DEBUG */ #if defined(MBEDTLS_THREADING_C) static void *buffer_alloc_calloc_mutexed( size_t n, size_t size ) { void *buf; if( mbedtls_mutex_lock( &heap.mutex ) != 0 ) return( NULL ); buf = buffer_alloc_calloc( n, size ); if( mbedtls_mutex_unlock( &heap.mutex ) ) return( NULL ); return( buf ); } static void buffer_alloc_free_mutexed( void *ptr ) { /* We have to good option here, but corrupting the heap seems * worse than loosing memory. */ if( mbedtls_mutex_lock( &heap.mutex ) ) return; buffer_alloc_free( ptr ); (void) mbedtls_mutex_unlock( &heap.mutex ); } #endif /* MBEDTLS_THREADING_C */ void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ) { memset( &heap, 0, sizeof( buffer_alloc_ctx ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &heap.mutex ); mbedtls_platform_set_calloc_free( buffer_alloc_calloc_mutexed, buffer_alloc_free_mutexed ); #else mbedtls_platform_set_calloc_free( buffer_alloc_calloc, buffer_alloc_free ); #endif if( len < sizeof( memory_header ) + MBEDTLS_MEMORY_ALIGN_MULTIPLE ) return; else if( (size_t)buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE ) { /* Adjust len first since buf is used in the computation */ len -= MBEDTLS_MEMORY_ALIGN_MULTIPLE - (size_t)buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; buf += MBEDTLS_MEMORY_ALIGN_MULTIPLE - (size_t)buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; } memset( buf, 0, len ); heap.buf = buf; heap.len = len; heap.first = (memory_header *)buf; heap.first->size = len - sizeof( memory_header ); heap.first->magic1 = MAGIC1; heap.first->magic2 = MAGIC2; heap.first_free = heap.first; } void mbedtls_memory_buffer_alloc_free( void ) { #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &heap.mutex ); #endif mbedtls_platform_zeroize( &heap, sizeof(buffer_alloc_ctx) ); } #if defined(MBEDTLS_SELF_TEST) static int check_pointer( void *p ) { if( p == NULL ) return( -1 ); if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 ) return( -1 ); return( 0 ); } static int check_all_free( void ) { if( #if defined(MBEDTLS_MEMORY_DEBUG) heap.total_used != 0 || #endif heap.first != heap.first_free || (void *) heap.first != (void *) heap.buf ) { return( -1 ); } return( 0 ); } #define TEST_ASSERT( condition ) \ if( ! (condition) ) \ { \ if( verbose != 0 ) \ mbedtls_printf( "failed\n" ); \ \ ret = 1; \ goto cleanup; \ } int mbedtls_memory_buffer_alloc_self_test( int verbose ) { unsigned char buf[1024]; unsigned char *p, *q, *r, *end; int ret = 0; if( verbose != 0 ) mbedtls_printf( " MBA test #1 (basic alloc-free cycle): " ); mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); p = mbedtls_calloc( 1, 1 ); q = mbedtls_calloc( 1, 128 ); r = mbedtls_calloc( 1, 16 ); TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 && check_pointer( r ) == 0 ); mbedtls_free( r ); mbedtls_free( q ); mbedtls_free( p ); TEST_ASSERT( check_all_free( ) == 0 ); /* Memorize end to compare with the next test */ end = heap.buf + heap.len; mbedtls_memory_buffer_alloc_free( ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " MBA test #2 (buf not aligned): " ); mbedtls_memory_buffer_alloc_init( buf + 1, sizeof( buf ) - 1 ); TEST_ASSERT( heap.buf + heap.len == end ); p = mbedtls_calloc( 1, 1 ); q = mbedtls_calloc( 1, 128 ); r = mbedtls_calloc( 1, 16 ); TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 && check_pointer( r ) == 0 ); mbedtls_free( r ); mbedtls_free( q ); mbedtls_free( p ); TEST_ASSERT( check_all_free( ) == 0 ); mbedtls_memory_buffer_alloc_free( ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " MBA test #3 (full): " ); mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); p = mbedtls_calloc( 1, sizeof( buf ) - sizeof( memory_header ) ); TEST_ASSERT( check_pointer( p ) == 0 ); TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); mbedtls_free( p ); p = mbedtls_calloc( 1, sizeof( buf ) - 2 * sizeof( memory_header ) - 16 ); q = mbedtls_calloc( 1, 16 ); TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 ); TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); mbedtls_free( q ); TEST_ASSERT( mbedtls_calloc( 1, 17 ) == NULL ); mbedtls_free( p ); TEST_ASSERT( check_all_free( ) == 0 ); mbedtls_memory_buffer_alloc_free( ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: mbedtls_memory_buffer_alloc_free( ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */ fldigi-4.1.06/src/mbedtls/entropy_poll.c0000664000175000017500000001404613507401434015104 00000000000000/* * Platform-specific and custom entropy polling functions * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if defined(__linux__) /* Ensure that syscall() is available even when compiling with -std=c99 */ #define _GNU_SOURCE #endif #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_ENTROPY_C) #include "mbedtls/entropy.h" #include "mbedtls/entropy_poll.h" #if defined(MBEDTLS_TIMING_C) #include "mbedtls/timing.h" #endif #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) #include "mbedtls/platform.h" #endif #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ !defined(__HAIKU__) #error "Platform entropy sources only work on Unix and Windows, see MBEDTLS_NO_PLATFORM_ENTROPY in config.h" #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #if !defined(_WIN32_WINNT) #define _WIN32_WINNT 0x0400 #endif #include #include int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { HCRYPTPROV provider; ((void) data); *olen = 0; if( CryptAcquireContext( &provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE ) { return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE ) { CryptReleaseContext( provider, 0 ); return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } CryptReleaseContext( provider, 0 ); *olen = len; return( 0 ); } #else /* _WIN32 && !EFIX64 && !EFI32 */ /* * Test for Linux getrandom() support. * Since there is no wrapper in the libc yet, use the generic syscall wrapper * available in GNU libc and compatible libc's (eg uClibc). */ #if defined(__linux__) && defined(__GLIBC__) #include #include #if defined(SYS_getrandom) #define HAVE_GETRANDOM #include static int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags ) { /* MemSan cannot understand that the syscall writes to the buffer */ #if defined(__has_feature) #if __has_feature(memory_sanitizer) memset( buf, 0, buflen ); #endif #endif return( syscall( SYS_getrandom, buf, buflen, flags ) ); } #endif /* SYS_getrandom */ #endif /* __linux__ */ #include int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { FILE *file; size_t read_len; int ret; ((void) data); #if defined(HAVE_GETRANDOM) ret = getrandom_wrapper( output, len, 0 ); if( ret >= 0 ) { *olen = ret; return( 0 ); } else if( errno != ENOSYS ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); /* Fall through if the system call isn't known. */ #else ((void) ret); #endif /* HAVE_GETRANDOM */ *olen = 0; file = fopen( "/dev/urandom", "rb" ); if( file == NULL ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); read_len = fread( output, 1, len, file ); if( read_len != len ) { fclose( file ); return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } fclose( file ); *olen = len; return( 0 ); } #endif /* _WIN32 && !EFIX64 && !EFI32 */ #endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) int mbedtls_null_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { ((void) data); ((void) output); *olen = 0; if( len < sizeof(unsigned char) ) return( 0 ); *olen = sizeof(unsigned char); return( 0 ); } #endif #if defined(MBEDTLS_TIMING_C) int mbedtls_hardclock_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { unsigned long timer = mbedtls_timing_hardclock(); ((void) data); *olen = 0; if( len < sizeof(unsigned long) ) return( 0 ); memcpy( output, &timer, sizeof(unsigned long) ); *olen = sizeof(unsigned long); return( 0 ); } #endif /* MBEDTLS_TIMING_C */ #if defined(MBEDTLS_HAVEGE_C) int mbedtls_havege_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { mbedtls_havege_state *hs = (mbedtls_havege_state *) data; *olen = 0; if( mbedtls_havege_random( hs, output, len ) != 0 ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); *olen = len; return( 0 ); } #endif /* MBEDTLS_HAVEGE_C */ #if defined(MBEDTLS_ENTROPY_NV_SEED) int mbedtls_nv_seed_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; size_t use_len = MBEDTLS_ENTROPY_BLOCK_SIZE; ((void) data); memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE ); if( mbedtls_nv_seed_read( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) < 0 ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); if( len < use_len ) use_len = len; memcpy( output, buf, use_len ); *olen = use_len; return( 0 ); } #endif /* MBEDTLS_ENTROPY_NV_SEED */ #endif /* MBEDTLS_ENTROPY_C */ fldigi-4.1.06/src/mbedtls/nist_kw.c0000664000175000017500000005767113507401434014047 00000000000000/* * Implementation of NIST SP 800-38F key wrapping, supporting KW and KWP modes * only * * Copyright (C) 2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ /* * Definition of Key Wrapping: * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf * RFC 3394 "Advanced Encryption Standard (AES) Key Wrap Algorithm" * RFC 5649 "Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm" * * Note: RFC 3394 defines different methodology for intermediate operations for * the wrapping and unwrapping operation than the definition in NIST SP 800-38F. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_NIST_KW_C) #include "mbedtls/nist_kw.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_NIST_KW_ALT) #define KW_SEMIBLOCK_LENGTH 8 #define MIN_SEMIBLOCKS_COUNT 3 /* constant-time buffer comparison */ static inline unsigned char mbedtls_nist_kw_safer_memcmp( const void *a, const void *b, size_t n ) { size_t i; volatile const unsigned char *A = (volatile const unsigned char *) a; volatile const unsigned char *B = (volatile const unsigned char *) b; volatile unsigned char diff = 0; for( i = 0; i < n; i++ ) { /* Read volatile data in order before computing diff. * This avoids IAR compiler warning: * 'the order of volatile accesses is undefined ..' */ unsigned char x = A[i], y = B[i]; diff |= x ^ y; } return( diff ); } /*! The 64-bit default integrity check value (ICV) for KW mode. */ static const unsigned char NIST_KW_ICV1[] = {0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6}; /*! The 32-bit default integrity check value (ICV) for KWP mode. */ static const unsigned char NIST_KW_ICV2[] = {0xA6, 0x59, 0x59, 0xA6}; #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ do { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } while( 0 ) #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ do { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } while( 0 ) #endif /* * Initialize context */ void mbedtls_nist_kw_init( mbedtls_nist_kw_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_nist_kw_context ) ); } int mbedtls_nist_kw_setkey( mbedtls_nist_kw_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits, const int is_wrap ) { int ret; const mbedtls_cipher_info_t *cipher_info; cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB ); if( cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( cipher_info->block_size != 16 ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); /* * SP 800-38F currently defines AES cipher as the only block cipher allowed: * "For KW and KWP, the underlying block cipher shall be approved, and the * block size shall be 128 bits. Currently, the AES block cipher, with key * lengths of 128, 192, or 256 bits, is the only block cipher that fits * this profile." * Currently we don't support other 128 bit block ciphers for key wrapping, * such as Camellia and Aria. */ if( cipher != MBEDTLS_CIPHER_ID_AES ) return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); mbedtls_cipher_free( &ctx->cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits, is_wrap ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT ) ) != 0 ) { return( ret ); } return( 0 ); } /* * Free context */ void mbedtls_nist_kw_free( mbedtls_nist_kw_context *ctx ) { mbedtls_cipher_free( &ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_nist_kw_context ) ); } /* * Helper function for Xoring the uint64_t "t" with the encrypted A. * Defined in NIST SP 800-38F section 6.1 */ static void calc_a_xor_t( unsigned char A[KW_SEMIBLOCK_LENGTH], uint64_t t ) { size_t i = 0; for( i = 0; i < sizeof( t ); i++ ) { A[i] ^= ( t >> ( ( sizeof( t ) - 1 - i ) * 8 ) ) & 0xff; } } /* * KW-AE as defined in SP 800-38F section 6.2 * KWP-AE as defined in SP 800-38F section 6.3 */ int mbedtls_nist_kw_wrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t *out_len, size_t out_size ) { int ret = 0; size_t semiblocks = 0; size_t s; size_t olen, padlen = 0; uint64_t t = 0; unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char inbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char *R2 = output + KW_SEMIBLOCK_LENGTH; unsigned char *A = output; *out_len = 0; /* * Generate the String to work on */ if( mode == MBEDTLS_KW_MODE_KW ) { if( out_size < in_len + KW_SEMIBLOCK_LENGTH ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } /* * According to SP 800-38F Table 1, the plaintext length for KW * must be between 2 to 2^54-1 semiblocks inclusive. */ if( in_len < 16 || #if SIZE_MAX > 0x1FFFFFFFFFFFFF8 in_len > 0x1FFFFFFFFFFFFF8 || #endif in_len % KW_SEMIBLOCK_LENGTH != 0 ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } memcpy( output, NIST_KW_ICV1, KW_SEMIBLOCK_LENGTH ); memmove( output + KW_SEMIBLOCK_LENGTH, input, in_len ); } else { if( in_len % 8 != 0 ) { padlen = ( 8 - ( in_len % 8 ) ); } if( out_size < in_len + KW_SEMIBLOCK_LENGTH + padlen ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } /* * According to SP 800-38F Table 1, the plaintext length for KWP * must be between 1 and 2^32-1 octets inclusive. */ if( in_len < 1 #if SIZE_MAX > 0xFFFFFFFF || in_len > 0xFFFFFFFF #endif ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } memcpy( output, NIST_KW_ICV2, KW_SEMIBLOCK_LENGTH / 2 ); PUT_UINT32_BE( ( in_len & 0xffffffff ), output, KW_SEMIBLOCK_LENGTH / 2 ); memcpy( output + KW_SEMIBLOCK_LENGTH, input, in_len ); memset( output + KW_SEMIBLOCK_LENGTH + in_len, 0, padlen ); } semiblocks = ( ( in_len + padlen ) / KW_SEMIBLOCK_LENGTH ) + 1; s = 6 * ( semiblocks - 1 ); if( mode == MBEDTLS_KW_MODE_KWP && in_len <= KW_SEMIBLOCK_LENGTH ) { memcpy( inbuff, output, 16 ); ret = mbedtls_cipher_update( &ctx->cipher_ctx, inbuff, 16, output, &olen ); if( ret != 0 ) goto cleanup; } else { /* * Do the wrapping function W, as defined in RFC 3394 section 2.2.1 */ if( semiblocks < MIN_SEMIBLOCKS_COUNT ) { ret = MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; goto cleanup; } /* Calculate intermediate values */ for( t = 1; t <= s; t++ ) { memcpy( inbuff, A, KW_SEMIBLOCK_LENGTH ); memcpy( inbuff + KW_SEMIBLOCK_LENGTH, R2, KW_SEMIBLOCK_LENGTH ); ret = mbedtls_cipher_update( &ctx->cipher_ctx, inbuff, 16, outbuff, &olen ); if( ret != 0 ) goto cleanup; memcpy( A, outbuff, KW_SEMIBLOCK_LENGTH ); calc_a_xor_t( A, t ); memcpy( R2, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH ); R2 += KW_SEMIBLOCK_LENGTH; if( R2 >= output + ( semiblocks * KW_SEMIBLOCK_LENGTH ) ) R2 = output + KW_SEMIBLOCK_LENGTH; } } *out_len = semiblocks * KW_SEMIBLOCK_LENGTH; cleanup: if( ret != 0) { memset( output, 0, semiblocks * KW_SEMIBLOCK_LENGTH ); } mbedtls_platform_zeroize( inbuff, KW_SEMIBLOCK_LENGTH * 2 ); mbedtls_platform_zeroize( outbuff, KW_SEMIBLOCK_LENGTH * 2 ); return( ret ); } /* * W-1 function as defined in RFC 3394 section 2.2.2 * This function assumes the following: * 1. Output buffer is at least of size ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH. * 2. The input buffer is of size semiblocks * KW_SEMIBLOCK_LENGTH. * 3. Minimal number of semiblocks is 3. * 4. A is a buffer to hold the first semiblock of the input buffer. */ static int unwrap( mbedtls_nist_kw_context *ctx, const unsigned char *input, size_t semiblocks, unsigned char A[KW_SEMIBLOCK_LENGTH], unsigned char *output, size_t* out_len ) { int ret = 0; const size_t s = 6 * ( semiblocks - 1 ); size_t olen; uint64_t t = 0; unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char inbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char *R = output + ( semiblocks - 2 ) * KW_SEMIBLOCK_LENGTH; *out_len = 0; if( semiblocks < MIN_SEMIBLOCKS_COUNT ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } memcpy( A, input, KW_SEMIBLOCK_LENGTH ); memmove( output, input + KW_SEMIBLOCK_LENGTH, ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH ); /* Calculate intermediate values */ for( t = s; t >= 1; t-- ) { calc_a_xor_t( A, t ); memcpy( inbuff, A, KW_SEMIBLOCK_LENGTH ); memcpy( inbuff + KW_SEMIBLOCK_LENGTH, R, KW_SEMIBLOCK_LENGTH ); ret = mbedtls_cipher_update( &ctx->cipher_ctx, inbuff, 16, outbuff, &olen ); if( ret != 0 ) goto cleanup; memcpy( A, outbuff, KW_SEMIBLOCK_LENGTH ); /* Set R as LSB64 of outbuff */ memcpy( R, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH ); if( R == output ) R = output + ( semiblocks - 2 ) * KW_SEMIBLOCK_LENGTH; else R -= KW_SEMIBLOCK_LENGTH; } *out_len = ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH; cleanup: if( ret != 0) memset( output, 0, ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH ); mbedtls_platform_zeroize( inbuff, sizeof( inbuff ) ); mbedtls_platform_zeroize( outbuff, sizeof( outbuff ) ); return( ret ); } /* * KW-AD as defined in SP 800-38F section 6.2 * KWP-AD as defined in SP 800-38F section 6.3 */ int mbedtls_nist_kw_unwrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t *out_len, size_t out_size ) { int ret = 0; size_t i, olen; unsigned char A[KW_SEMIBLOCK_LENGTH]; unsigned char diff, bad_padding = 0; *out_len = 0; if( out_size < in_len - KW_SEMIBLOCK_LENGTH ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } if( mode == MBEDTLS_KW_MODE_KW ) { /* * According to SP 800-38F Table 1, the ciphertext length for KW * must be between 3 to 2^54 semiblocks inclusive. */ if( in_len < 24 || #if SIZE_MAX > 0x200000000000000 in_len > 0x200000000000000 || #endif in_len % KW_SEMIBLOCK_LENGTH != 0 ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } ret = unwrap( ctx, input, in_len / KW_SEMIBLOCK_LENGTH, A, output, out_len ); if( ret != 0 ) goto cleanup; /* Check ICV in "constant-time" */ diff = mbedtls_nist_kw_safer_memcmp( NIST_KW_ICV1, A, KW_SEMIBLOCK_LENGTH ); if( diff != 0 ) { ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; goto cleanup; } } else if( mode == MBEDTLS_KW_MODE_KWP ) { size_t padlen = 0; uint32_t Plen; /* * According to SP 800-38F Table 1, the ciphertext length for KWP * must be between 2 to 2^29 semiblocks inclusive. */ if( in_len < KW_SEMIBLOCK_LENGTH * 2 || #if SIZE_MAX > 0x100000000 in_len > 0x100000000 || #endif in_len % KW_SEMIBLOCK_LENGTH != 0 ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } if( in_len == KW_SEMIBLOCK_LENGTH * 2 ) { unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; ret = mbedtls_cipher_update( &ctx->cipher_ctx, input, 16, outbuff, &olen ); if( ret != 0 ) goto cleanup; memcpy( A, outbuff, KW_SEMIBLOCK_LENGTH ); memcpy( output, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH ); mbedtls_platform_zeroize( outbuff, sizeof( outbuff ) ); *out_len = KW_SEMIBLOCK_LENGTH; } else { /* in_len >= KW_SEMIBLOCK_LENGTH * 3 */ ret = unwrap( ctx, input, in_len / KW_SEMIBLOCK_LENGTH, A, output, out_len ); if( ret != 0 ) goto cleanup; } /* Check ICV in "constant-time" */ diff = mbedtls_nist_kw_safer_memcmp( NIST_KW_ICV2, A, KW_SEMIBLOCK_LENGTH / 2 ); if( diff != 0 ) { ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; } GET_UINT32_BE( Plen, A, KW_SEMIBLOCK_LENGTH / 2 ); /* * Plen is the length of the plaintext, when the input is valid. * If Plen is larger than the plaintext and padding, padlen will be * larger than 8, because of the type wrap around. */ padlen = in_len - KW_SEMIBLOCK_LENGTH - Plen; if ( padlen > 7 ) { padlen &= 7; ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; } /* Check padding in "constant-time" */ for( diff = 0, i = 0; i < KW_SEMIBLOCK_LENGTH; i++ ) { if( i >= KW_SEMIBLOCK_LENGTH - padlen ) diff |= output[*out_len - KW_SEMIBLOCK_LENGTH + i]; else bad_padding |= output[*out_len - KW_SEMIBLOCK_LENGTH + i]; } if( diff != 0 ) { ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; } if( ret != 0 ) { goto cleanup; } memset( output + Plen, 0, padlen ); *out_len = Plen; } else { ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; goto cleanup; } cleanup: if( ret != 0 ) { memset( output, 0, *out_len ); *out_len = 0; } mbedtls_platform_zeroize( &bad_padding, sizeof( bad_padding) ); mbedtls_platform_zeroize( &diff, sizeof( diff ) ); mbedtls_platform_zeroize( A, sizeof( A ) ); return( ret ); } #endif /* !MBEDTLS_NIST_KW_ALT */ #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #define KW_TESTS 3 /* * Test vectors taken from NIST * https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/CAVP-TESTING-BLOCK-CIPHER-MODES#KW */ static const unsigned int key_len[KW_TESTS] = { 16, 24, 32 }; static const unsigned char kw_key[KW_TESTS][32] = { { 0x75, 0x75, 0xda, 0x3a, 0x93, 0x60, 0x7c, 0xc2, 0xbf, 0xd8, 0xce, 0xc7, 0xaa, 0xdf, 0xd9, 0xa6 }, { 0x2d, 0x85, 0x26, 0x08, 0x1d, 0x02, 0xfb, 0x5b, 0x85, 0xf6, 0x9a, 0xc2, 0x86, 0xec, 0xd5, 0x7d, 0x40, 0xdf, 0x5d, 0xf3, 0x49, 0x47, 0x44, 0xd3 }, { 0x11, 0x2a, 0xd4, 0x1b, 0x48, 0x56, 0xc7, 0x25, 0x4a, 0x98, 0x48, 0xd3, 0x0f, 0xdd, 0x78, 0x33, 0x5b, 0x03, 0x9a, 0x48, 0xa8, 0x96, 0x2c, 0x4d, 0x1c, 0xb7, 0x8e, 0xab, 0xd5, 0xda, 0xd7, 0x88 } }; static const unsigned char kw_msg[KW_TESTS][40] = { { 0x42, 0x13, 0x6d, 0x3c, 0x38, 0x4a, 0x3e, 0xea, 0xc9, 0x5a, 0x06, 0x6f, 0xd2, 0x8f, 0xed, 0x3f }, { 0x95, 0xc1, 0x1b, 0xf5, 0x35, 0x3a, 0xfe, 0xdb, 0x98, 0xfd, 0xd6, 0xc8, 0xca, 0x6f, 0xdb, 0x6d, 0xa5, 0x4b, 0x74, 0xb4, 0x99, 0x0f, 0xdc, 0x45, 0xc0, 0x9d, 0x15, 0x8f, 0x51, 0xce, 0x62, 0x9d, 0xe2, 0xaf, 0x26, 0xe3, 0x25, 0x0e, 0x6b, 0x4c }, { 0x1b, 0x20, 0xbf, 0x19, 0x90, 0xb0, 0x65, 0xd7, 0x98, 0xe1, 0xb3, 0x22, 0x64, 0xad, 0x50, 0xa8, 0x74, 0x74, 0x92, 0xba, 0x09, 0xa0, 0x4d, 0xd1 } }; static const size_t kw_msg_len[KW_TESTS] = { 16, 40, 24 }; static const size_t kw_out_len[KW_TESTS] = { 24, 48, 32 }; static const unsigned char kw_res[KW_TESTS][48] = { { 0x03, 0x1f, 0x6b, 0xd7, 0xe6, 0x1e, 0x64, 0x3d, 0xf6, 0x85, 0x94, 0x81, 0x6f, 0x64, 0xca, 0xa3, 0xf5, 0x6f, 0xab, 0xea, 0x25, 0x48, 0xf5, 0xfb }, { 0x44, 0x3c, 0x6f, 0x15, 0x09, 0x83, 0x71, 0x91, 0x3e, 0x5c, 0x81, 0x4c, 0xa1, 0xa0, 0x42, 0xec, 0x68, 0x2f, 0x7b, 0x13, 0x6d, 0x24, 0x3a, 0x4d, 0x6c, 0x42, 0x6f, 0xc6, 0x97, 0x15, 0x63, 0xe8, 0xa1, 0x4a, 0x55, 0x8e, 0x09, 0x64, 0x16, 0x19, 0xbf, 0x03, 0xfc, 0xaf, 0x90, 0xb1, 0xfc, 0x2d }, { 0xba, 0x8a, 0x25, 0x9a, 0x47, 0x1b, 0x78, 0x7d, 0xd5, 0xd5, 0x40, 0xec, 0x25, 0xd4, 0x3d, 0x87, 0x20, 0x0f, 0xda, 0xdc, 0x6d, 0x1f, 0x05, 0xd9, 0x16, 0x58, 0x4f, 0xa9, 0xf6, 0xcb, 0xf5, 0x12 } }; static const unsigned char kwp_key[KW_TESTS][32] = { { 0x78, 0x65, 0xe2, 0x0f, 0x3c, 0x21, 0x65, 0x9a, 0xb4, 0x69, 0x0b, 0x62, 0x9c, 0xdf, 0x3c, 0xc4 }, { 0xf5, 0xf8, 0x96, 0xa3, 0xbd, 0x2f, 0x4a, 0x98, 0x23, 0xef, 0x16, 0x2b, 0x00, 0xb8, 0x05, 0xd7, 0xde, 0x1e, 0xa4, 0x66, 0x26, 0x96, 0xa2, 0x58 }, { 0x95, 0xda, 0x27, 0x00, 0xca, 0x6f, 0xd9, 0xa5, 0x25, 0x54, 0xee, 0x2a, 0x8d, 0xf1, 0x38, 0x6f, 0x5b, 0x94, 0xa1, 0xa6, 0x0e, 0xd8, 0xa4, 0xae, 0xf6, 0x0a, 0x8d, 0x61, 0xab, 0x5f, 0x22, 0x5a } }; static const unsigned char kwp_msg[KW_TESTS][31] = { { 0xbd, 0x68, 0x43, 0xd4, 0x20, 0x37, 0x8d, 0xc8, 0x96 }, { 0x6c, 0xcd, 0xd5, 0x85, 0x18, 0x40, 0x97, 0xeb, 0xd5, 0xc3, 0xaf, 0x3e, 0x47, 0xd0, 0x2c, 0x19, 0x14, 0x7b, 0x4d, 0x99, 0x5f, 0x96, 0x43, 0x66, 0x91, 0x56, 0x75, 0x8c, 0x13, 0x16, 0x8f }, { 0xd1 } }; static const size_t kwp_msg_len[KW_TESTS] = { 9, 31, 1 }; static const unsigned char kwp_res[KW_TESTS][48] = { { 0x41, 0xec, 0xa9, 0x56, 0xd4, 0xaa, 0x04, 0x7e, 0xb5, 0xcf, 0x4e, 0xfe, 0x65, 0x96, 0x61, 0xe7, 0x4d, 0xb6, 0xf8, 0xc5, 0x64, 0xe2, 0x35, 0x00 }, { 0x4e, 0x9b, 0xc2, 0xbc, 0xbc, 0x6c, 0x1e, 0x13, 0xd3, 0x35, 0xbc, 0xc0, 0xf7, 0x73, 0x6a, 0x88, 0xfa, 0x87, 0x53, 0x66, 0x15, 0xbb, 0x8e, 0x63, 0x8b, 0xcc, 0x81, 0x66, 0x84, 0x68, 0x17, 0x90, 0x67, 0xcf, 0xa9, 0x8a, 0x9d, 0x0e, 0x33, 0x26 }, { 0x06, 0xba, 0x7a, 0xe6, 0xf3, 0x24, 0x8c, 0xfd, 0xcf, 0x26, 0x75, 0x07, 0xfa, 0x00, 0x1b, 0xc4 } }; static const size_t kwp_out_len[KW_TESTS] = { 24, 40, 16 }; int mbedtls_nist_kw_self_test( int verbose ) { mbedtls_nist_kw_context ctx; unsigned char out[48]; size_t olen; int i; int ret = 0; mbedtls_nist_kw_init( &ctx ); for( i = 0; i < KW_TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " KW-AES-%u ", (unsigned int) key_len[i] * 8 ); ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kw_key[i], key_len[i] * 8, 1 ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( " KW: setup failed " ); goto end; } ret = mbedtls_nist_kw_wrap( &ctx, MBEDTLS_KW_MODE_KW, kw_msg[i], kw_msg_len[i], out, &olen, sizeof( out ) ); if( ret != 0 || kw_out_len[i] != olen || memcmp( out, kw_res[i], kw_out_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed. "); ret = 1; goto end; } if( ( ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kw_key[i], key_len[i] * 8, 0 ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( " KW: setup failed "); goto end; } ret = mbedtls_nist_kw_unwrap( &ctx, MBEDTLS_KW_MODE_KW, out, olen, out, &olen, sizeof( out ) ); if( ret != 0 || olen != kw_msg_len[i] || memcmp( out, kw_msg[i], kw_msg_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto end; } if( verbose != 0 ) mbedtls_printf( " passed\n" ); } for( i = 0; i < KW_TESTS; i++ ) { olen = sizeof( out ); if( verbose != 0 ) mbedtls_printf( " KWP-AES-%u ", (unsigned int) key_len[i] * 8 ); ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kwp_key[i], key_len[i] * 8, 1 ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( " KWP: setup failed " ); goto end; } ret = mbedtls_nist_kw_wrap( &ctx, MBEDTLS_KW_MODE_KWP, kwp_msg[i], kwp_msg_len[i], out, &olen, sizeof( out ) ); if( ret != 0 || kwp_out_len[i] != olen || memcmp( out, kwp_res[i], kwp_out_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed. "); ret = 1; goto end; } if( ( ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kwp_key[i], key_len[i] * 8, 0 ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( " KWP: setup failed "); goto end; } ret = mbedtls_nist_kw_unwrap( &ctx, MBEDTLS_KW_MODE_KWP, out, olen, out, &olen, sizeof( out ) ); if( ret != 0 || olen != kwp_msg_len[i] || memcmp( out, kwp_msg[i], kwp_msg_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed. "); ret = 1; goto end; } if( verbose != 0 ) mbedtls_printf( " passed\n" ); } end: mbedtls_nist_kw_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #endif /* MBEDTLS_NIST_KW_C */ fldigi-4.1.06/src/mbedtls/x509_csr.c0000664000175000017500000002531413507401434013732 00000000000000/* * X.509 Certificate Signing Request (CSR) parsing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CSR_PARSE_C) #include "mbedtls/x509_csr.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) #include #endif /* * Version ::= INTEGER { v1(0) } */ static int x509_csr_get_version( unsigned char **p, const unsigned char *end, int *ver ) { int ret; if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { *ver = 0; return( 0 ); } return( MBEDTLS_ERR_X509_INVALID_VERSION + ret ); } return( 0 ); } /* * Parse a CSR in DER format */ int mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ) { int ret; size_t len; unsigned char *p, *end; mbedtls_x509_buf sig_params; memset( &sig_params, 0, sizeof( mbedtls_x509_buf ) ); /* * Check for valid input */ if( csr == NULL || buf == NULL || buflen == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); mbedtls_x509_csr_init( csr ); /* * first copy the raw DER data */ p = mbedtls_calloc( 1, len = buflen ); if( p == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); memcpy( p, buf, buflen ); csr->raw.p = p; csr->raw.len = len; end = p + len; /* * CertificationRequest ::= SEQUENCE { * certificationRequestInfo CertificationRequestInfo, * signatureAlgorithm AlgorithmIdentifier, * signature BIT STRING * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT ); } if( len != (size_t) ( end - p ) ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } /* * CertificationRequestInfo ::= SEQUENCE { */ csr->cri.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } end = p + len; csr->cri.len = end - csr->cri.p; /* * Version ::= INTEGER { v1(0) } */ if( ( ret = x509_csr_get_version( &p, end, &csr->version ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } if( csr->version != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_UNKNOWN_VERSION ); } csr->version++; /* * subject Name */ csr->subject_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_x509_get_name( &p, p + len, &csr->subject ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } csr->subject_raw.len = p - csr->subject_raw.p; /* * subjectPKInfo SubjectPublicKeyInfo */ if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &csr->pk ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } /* * attributes [0] Attributes * * The list of possible attributes is open-ended, though RFC 2985 * (PKCS#9) defines a few in section 5.4. We currently don't support any, * so we just ignore them. This is a safe thing to do as the worst thing * that could happen is that we issue a certificate that does not match * the requester's expectations - this cannot cause a violation of our * signature policies. */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } p += len; end = csr->raw.p + csr->raw.len; /* * signatureAlgorithm AlgorithmIdentifier, * signature BIT STRING */ if( ( ret = mbedtls_x509_get_alg( &p, end, &csr->sig_oid, &sig_params ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } if( ( ret = mbedtls_x509_get_sig_alg( &csr->sig_oid, &sig_params, &csr->sig_md, &csr->sig_pk, &csr->sig_opts ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG ); } if( ( ret = mbedtls_x509_get_sig( &p, end, &csr->sig ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } if( p != end ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } return( 0 ); } /* * Parse a CSR, allowing for PEM or raw DER encoding */ int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ) { #if defined(MBEDTLS_PEM_PARSE_C) int ret; size_t use_len; mbedtls_pem_context pem; #endif /* * Check for valid input */ if( csr == NULL || buf == NULL || buflen == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); #if defined(MBEDTLS_PEM_PARSE_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( buf[buflen - 1] == '\0' ) { mbedtls_pem_init( &pem ); ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN CERTIFICATE REQUEST-----", "-----END CERTIFICATE REQUEST-----", buf, NULL, 0, &use_len ); if( ret == 0 ) /* * Was PEM encoded, parse the result */ ret = mbedtls_x509_csr_parse_der( csr, pem.buf, pem.buflen ); mbedtls_pem_free( &pem ); if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); } #endif /* MBEDTLS_PEM_PARSE_C */ return( mbedtls_x509_csr_parse_der( csr, buf, buflen ) ); } #if defined(MBEDTLS_FS_IO) /* * Load a CSR into the structure */ int mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path ) { int ret; size_t n; unsigned char *buf; if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_x509_csr_parse( csr, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ #define BEFORE_COLON 14 #define BC "14" /* * Return an informational string about the CSR. */ int mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_csr *csr ) { int ret; size_t n; char *p; char key_size_str[BEFORE_COLON]; p = buf; n = size; ret = mbedtls_snprintf( p, n, "%sCSR version : %d", prefix, csr->version ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssubject name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &csr->subject ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_sig_alg_gets( p, n, &csr->sig_oid, csr->sig_pk, csr->sig_md, csr->sig_opts ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON, mbedtls_pk_get_name( &csr->pk ) ) ) != 0 ) { return( ret ); } ret = mbedtls_snprintf( p, n, "\n%s%-" BC "s: %d bits\n", prefix, key_size_str, (int) mbedtls_pk_get_bitlen( &csr->pk ) ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } /* * Initialize a CSR */ void mbedtls_x509_csr_init( mbedtls_x509_csr *csr ) { memset( csr, 0, sizeof(mbedtls_x509_csr) ); } /* * Unallocate all CSR data */ void mbedtls_x509_csr_free( mbedtls_x509_csr *csr ) { mbedtls_x509_name *name_cur; mbedtls_x509_name *name_prv; if( csr == NULL ) return; mbedtls_pk_free( &csr->pk ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) mbedtls_free( csr->sig_opts ); #endif name_cur = csr->subject.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } if( csr->raw.p != NULL ) { mbedtls_platform_zeroize( csr->raw.p, csr->raw.len ); mbedtls_free( csr->raw.p ); } mbedtls_platform_zeroize( csr, sizeof( mbedtls_x509_csr ) ); } #endif /* MBEDTLS_X509_CSR_PARSE_C */ fldigi-4.1.06/src/mbedtls/x509write_crt.c0000664000175000017500000004045213507401434015006 00000000000000/* * X.509 certificate writing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * - certificates: RFC 5280, updated by RFC 6818 * - CSRs: PKCS#10 v1.7 aka RFC 2986 * - attributes: PKCS#9 v2.0 aka RFC 2985 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CRT_WRITE_C) #include "mbedtls/x509_crt.h" #include "mbedtls/oid.h" #include "mbedtls/asn1write.h" #include "mbedtls/sha1.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif /* MBEDTLS_PEM_WRITE_C */ void mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx ) { memset( ctx, 0, sizeof( mbedtls_x509write_cert ) ); mbedtls_mpi_init( &ctx->serial ); ctx->version = MBEDTLS_X509_CRT_VERSION_3; } void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx ) { mbedtls_mpi_free( &ctx->serial ); mbedtls_asn1_free_named_data_list( &ctx->subject ); mbedtls_asn1_free_named_data_list( &ctx->issuer ); mbedtls_asn1_free_named_data_list( &ctx->extensions ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_x509write_cert ) ); } void mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version ) { ctx->version = version; } void mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg ) { ctx->md_alg = md_alg; } void mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ) { ctx->subject_key = key; } void mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ) { ctx->issuer_key = key; } int mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx, const char *subject_name ) { return mbedtls_x509_string_to_names( &ctx->subject, subject_name ); } int mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx, const char *issuer_name ) { return mbedtls_x509_string_to_names( &ctx->issuer, issuer_name ); } int mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial ) { int ret; if( ( ret = mbedtls_mpi_copy( &ctx->serial, serial ) ) != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before, const char *not_after ) { if( strlen( not_before ) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 || strlen( not_after ) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 ) { return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); } strncpy( ctx->not_before, not_before, MBEDTLS_X509_RFC5280_UTC_TIME_LEN ); strncpy( ctx->not_after , not_after , MBEDTLS_X509_RFC5280_UTC_TIME_LEN ); ctx->not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z'; ctx->not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z'; return( 0 ); } int mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ) { return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len, critical, val, val_len ); } int mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx, int is_ca, int max_pathlen ) { int ret; unsigned char buf[9]; unsigned char *c = buf + sizeof(buf); size_t len = 0; memset( buf, 0, sizeof(buf) ); if( is_ca && max_pathlen > 127 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); if( is_ca ) { if( max_pathlen >= 0 ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, max_pathlen ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( &c, buf, 1 ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_BASIC_CONSTRAINTS, MBEDTLS_OID_SIZE( MBEDTLS_OID_BASIC_CONSTRAINTS ), 0, buf + sizeof(buf) - len, len ); } #if defined(MBEDTLS_SHA1_C) int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx ) { int ret; unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */ unsigned char *c = buf + sizeof(buf); size_t len = 0; memset( buf, 0, sizeof(buf) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->subject_key ) ); ret = mbedtls_sha1_ret( buf + sizeof( buf ) - len, len, buf + sizeof( buf ) - 20 ); if( ret != 0 ) return( ret ); c = buf + sizeof( buf ) - 20; len = 20; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_OCTET_STRING ) ); return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER, MBEDTLS_OID_SIZE( MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER ), 0, buf + sizeof(buf) - len, len ); } int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx ) { int ret; unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */ unsigned char *c = buf + sizeof( buf ); size_t len = 0; memset( buf, 0, sizeof(buf) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->issuer_key ) ); ret = mbedtls_sha1_ret( buf + sizeof( buf ) - len, len, buf + sizeof( buf ) - 20 ); if( ret != 0 ) return( ret ); c = buf + sizeof( buf ) - 20; len = 20; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | 0 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER, MBEDTLS_OID_SIZE( MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER ), 0, buf + sizeof( buf ) - len, len ); } #endif /* MBEDTLS_SHA1_C */ int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx, unsigned int key_usage ) { unsigned char buf[4], ku; unsigned char *c; int ret; /* We currently only support 7 bits, from 0x80 to 0x02 */ if( ( key_usage & ~0xfe ) != 0 ) return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE ); c = buf + 4; ku = (unsigned char) key_usage; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ku, 7 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_KEY_USAGE, MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ), 1, buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx, unsigned char ns_cert_type ) { unsigned char buf[4]; unsigned char *c; int ret; c = buf + 4; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE, MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ), 0, buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } static int x509_write_time( unsigned char **p, unsigned char *start, const char *t, size_t size ) { int ret; size_t len = 0; /* * write MBEDTLS_ASN1_UTC_TIME if year < 2050 (2 bytes shorter) */ if( t[0] == '2' && t[1] == '0' && t[2] < '5' ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) t + 2, size - 2 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_UTC_TIME ) ); } else { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) t, size ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_GENERALIZED_TIME ) ); } return( (int) len ); } int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; const char *sig_oid; size_t sig_oid_len = 0; unsigned char *c, *c2; unsigned char hash[64]; unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; unsigned char tmp_buf[2048]; size_t sub_len = 0, pub_len = 0, sig_and_oid_len = 0, sig_len; size_t len = 0; mbedtls_pk_type_t pk_alg; /* * Prepare data to be signed in tmp_buf */ c = tmp_buf + sizeof( tmp_buf ); /* Signature algorithm needed in TBS, and later for actual signature */ /* There's no direct way of extracting a signature algorithm * (represented as an element of mbedtls_pk_type_t) from a PK instance. */ if( mbedtls_pk_can_do( ctx->issuer_key, MBEDTLS_PK_RSA ) ) pk_alg = MBEDTLS_PK_RSA; else if( mbedtls_pk_can_do( ctx->issuer_key, MBEDTLS_PK_ECDSA ) ) pk_alg = MBEDTLS_PK_ECDSA; else return( MBEDTLS_ERR_X509_INVALID_ALG ); if( ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg, &sig_oid, &sig_oid_len ) ) != 0 ) { return( ret ); } /* * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension */ /* Only for v3 */ if( ctx->version == MBEDTLS_X509_CRT_VERSION_3 ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 3 ) ); } /* * SubjectPublicKeyInfo */ MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->subject_key, tmp_buf, c - tmp_buf ) ); c -= pub_len; len += pub_len; /* * Subject ::= Name */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) ); /* * Validity ::= SEQUENCE { * notBefore Time, * notAfter Time } */ sub_len = 0; MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_after, MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) ); MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_before, MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) ); len += sub_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); /* * Issuer ::= Name */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->issuer ) ); /* * Signature ::= AlgorithmIdentifier */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, tmp_buf, sig_oid, strlen( sig_oid ), 0 ) ); /* * Serial ::= INTEGER */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, tmp_buf, &ctx->serial ) ); /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } */ /* Can be omitted for v1 */ if( ctx->version != MBEDTLS_X509_CRT_VERSION_1 ) { sub_len = 0; MBEDTLS_ASN1_CHK_ADD( sub_len, mbedtls_asn1_write_int( &c, tmp_buf, ctx->version ) ); len += sub_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); /* * Make signature */ if( ( ret = mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash ) ) != 0 ) { return( ret ); } if( ( ret = mbedtls_pk_sign( ctx->issuer_key, ctx->md_alg, hash, 0, sig, &sig_len, f_rng, p_rng ) ) != 0 ) { return( ret ); } /* * Write data to output buffer */ c2 = buf + size; MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf, sig_oid, sig_oid_len, sig, sig_len ) ); if( len > (size_t)( c2 - buf ) ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); c2 -= len; memcpy( c2, c, len ); len += sig_and_oid_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } #define PEM_BEGIN_CRT "-----BEGIN CERTIFICATE-----\n" #define PEM_END_CRT "-----END CERTIFICATE-----\n" #if defined(MBEDTLS_PEM_WRITE_C) int mbedtls_x509write_crt_pem( mbedtls_x509write_cert *crt, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char output_buf[4096]; size_t olen = 0; if( ( ret = mbedtls_x509write_crt_der( crt, output_buf, sizeof(output_buf), f_rng, p_rng ) ) < 0 ) { return( ret ); } if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CRT, PEM_END_CRT, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CRT_WRITE_C */ fldigi-4.1.06/src/mbedtls/aesni.c0000664000175000017500000004463413507401434013463 00000000000000/* * AES-NI support functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * [AES-WP] http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set * [CLMUL-WP] http://software.intel.com/en-us/articles/intel-carry-less-multiplication-instruction-and-its-usage-for-computing-the-gcm-mode/ */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_AESNI_C) #if defined(__has_feature) #if __has_feature(memory_sanitizer) #warning "MBEDTLS_AESNI_C is known to cause spurious error reports with some memory sanitizers as they do not understand the assembly code." #endif #endif #include "mbedtls/aesni.h" #include #ifndef asm #define asm __asm #endif #if defined(MBEDTLS_HAVE_X86_64) /* * AES-NI support detection routine */ int mbedtls_aesni_has_support( unsigned int what ) { static int done = 0; static unsigned int c = 0; if( ! done ) { asm( "movl $1, %%eax \n\t" "cpuid \n\t" : "=c" (c) : : "eax", "ebx", "edx" ); done = 1; } return( ( c & what ) != 0 ); } /* * Binutils needs to be at least 2.19 to support AES-NI instructions. * Unfortunately, a lot of users have a lower version now (2014-04). * Emit bytecode directly in order to support "old" version of gas. * * Opcodes from the Intel architecture reference manual, vol. 3. * We always use registers, so we don't need prefixes for memory operands. * Operand macros are in gas order (src, dst) as opposed to Intel order * (dst, src) in order to blend better into the surrounding assembly code. */ #define AESDEC ".byte 0x66,0x0F,0x38,0xDE," #define AESDECLAST ".byte 0x66,0x0F,0x38,0xDF," #define AESENC ".byte 0x66,0x0F,0x38,0xDC," #define AESENCLAST ".byte 0x66,0x0F,0x38,0xDD," #define AESIMC ".byte 0x66,0x0F,0x38,0xDB," #define AESKEYGENA ".byte 0x66,0x0F,0x3A,0xDF," #define PCLMULQDQ ".byte 0x66,0x0F,0x3A,0x44," #define xmm0_xmm0 "0xC0" #define xmm0_xmm1 "0xC8" #define xmm0_xmm2 "0xD0" #define xmm0_xmm3 "0xD8" #define xmm0_xmm4 "0xE0" #define xmm1_xmm0 "0xC1" #define xmm1_xmm2 "0xD1" /* * AES-NI AES-ECB block en(de)cryption */ int mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { asm( "movdqu (%3), %%xmm0 \n\t" // load input "movdqu (%1), %%xmm1 \n\t" // load round key 0 "pxor %%xmm1, %%xmm0 \n\t" // round 0 "add $16, %1 \n\t" // point to next round key "subl $1, %0 \n\t" // normal rounds = nr - 1 "test %2, %2 \n\t" // mode? "jz 2f \n\t" // 0 = decrypt "1: \n\t" // encryption loop "movdqu (%1), %%xmm1 \n\t" // load round key AESENC xmm1_xmm0 "\n\t" // do round "add $16, %1 \n\t" // point to next round key "subl $1, %0 \n\t" // loop "jnz 1b \n\t" "movdqu (%1), %%xmm1 \n\t" // load round key AESENCLAST xmm1_xmm0 "\n\t" // last round "jmp 3f \n\t" "2: \n\t" // decryption loop "movdqu (%1), %%xmm1 \n\t" AESDEC xmm1_xmm0 "\n\t" // do round "add $16, %1 \n\t" "subl $1, %0 \n\t" "jnz 2b \n\t" "movdqu (%1), %%xmm1 \n\t" // load round key AESDECLAST xmm1_xmm0 "\n\t" // last round "3: \n\t" "movdqu %%xmm0, (%4) \n\t" // export output : : "r" (ctx->nr), "r" (ctx->rk), "r" (mode), "r" (input), "r" (output) : "memory", "cc", "xmm0", "xmm1" ); return( 0 ); } /* * GCM multiplication: c = a times b in GF(2^128) * Based on [CLMUL-WP] algorithms 1 (with equation 27) and 5. */ void mbedtls_aesni_gcm_mult( unsigned char c[16], const unsigned char a[16], const unsigned char b[16] ) { unsigned char aa[16], bb[16], cc[16]; size_t i; /* The inputs are in big-endian order, so byte-reverse them */ for( i = 0; i < 16; i++ ) { aa[i] = a[15 - i]; bb[i] = b[15 - i]; } asm( "movdqu (%0), %%xmm0 \n\t" // a1:a0 "movdqu (%1), %%xmm1 \n\t" // b1:b0 /* * Caryless multiplication xmm2:xmm1 = xmm0 * xmm1 * using [CLMUL-WP] algorithm 1 (p. 13). */ "movdqa %%xmm1, %%xmm2 \n\t" // copy of b1:b0 "movdqa %%xmm1, %%xmm3 \n\t" // same "movdqa %%xmm1, %%xmm4 \n\t" // same PCLMULQDQ xmm0_xmm1 ",0x00 \n\t" // a0*b0 = c1:c0 PCLMULQDQ xmm0_xmm2 ",0x11 \n\t" // a1*b1 = d1:d0 PCLMULQDQ xmm0_xmm3 ",0x10 \n\t" // a0*b1 = e1:e0 PCLMULQDQ xmm0_xmm4 ",0x01 \n\t" // a1*b0 = f1:f0 "pxor %%xmm3, %%xmm4 \n\t" // e1+f1:e0+f0 "movdqa %%xmm4, %%xmm3 \n\t" // same "psrldq $8, %%xmm4 \n\t" // 0:e1+f1 "pslldq $8, %%xmm3 \n\t" // e0+f0:0 "pxor %%xmm4, %%xmm2 \n\t" // d1:d0+e1+f1 "pxor %%xmm3, %%xmm1 \n\t" // c1+e0+f1:c0 /* * Now shift the result one bit to the left, * taking advantage of [CLMUL-WP] eq 27 (p. 20) */ "movdqa %%xmm1, %%xmm3 \n\t" // r1:r0 "movdqa %%xmm2, %%xmm4 \n\t" // r3:r2 "psllq $1, %%xmm1 \n\t" // r1<<1:r0<<1 "psllq $1, %%xmm2 \n\t" // r3<<1:r2<<1 "psrlq $63, %%xmm3 \n\t" // r1>>63:r0>>63 "psrlq $63, %%xmm4 \n\t" // r3>>63:r2>>63 "movdqa %%xmm3, %%xmm5 \n\t" // r1>>63:r0>>63 "pslldq $8, %%xmm3 \n\t" // r0>>63:0 "pslldq $8, %%xmm4 \n\t" // r2>>63:0 "psrldq $8, %%xmm5 \n\t" // 0:r1>>63 "por %%xmm3, %%xmm1 \n\t" // r1<<1|r0>>63:r0<<1 "por %%xmm4, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1 "por %%xmm5, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1|r1>>63 /* * Now reduce modulo the GCM polynomial x^128 + x^7 + x^2 + x + 1 * using [CLMUL-WP] algorithm 5 (p. 20). * Currently xmm2:xmm1 holds x3:x2:x1:x0 (already shifted). */ /* Step 2 (1) */ "movdqa %%xmm1, %%xmm3 \n\t" // x1:x0 "movdqa %%xmm1, %%xmm4 \n\t" // same "movdqa %%xmm1, %%xmm5 \n\t" // same "psllq $63, %%xmm3 \n\t" // x1<<63:x0<<63 = stuff:a "psllq $62, %%xmm4 \n\t" // x1<<62:x0<<62 = stuff:b "psllq $57, %%xmm5 \n\t" // x1<<57:x0<<57 = stuff:c /* Step 2 (2) */ "pxor %%xmm4, %%xmm3 \n\t" // stuff:a+b "pxor %%xmm5, %%xmm3 \n\t" // stuff:a+b+c "pslldq $8, %%xmm3 \n\t" // a+b+c:0 "pxor %%xmm3, %%xmm1 \n\t" // x1+a+b+c:x0 = d:x0 /* Steps 3 and 4 */ "movdqa %%xmm1,%%xmm0 \n\t" // d:x0 "movdqa %%xmm1,%%xmm4 \n\t" // same "movdqa %%xmm1,%%xmm5 \n\t" // same "psrlq $1, %%xmm0 \n\t" // e1:x0>>1 = e1:e0' "psrlq $2, %%xmm4 \n\t" // f1:x0>>2 = f1:f0' "psrlq $7, %%xmm5 \n\t" // g1:x0>>7 = g1:g0' "pxor %%xmm4, %%xmm0 \n\t" // e1+f1:e0'+f0' "pxor %%xmm5, %%xmm0 \n\t" // e1+f1+g1:e0'+f0'+g0' // e0'+f0'+g0' is almost e0+f0+g0, ex\tcept for some missing // bits carried from d. Now get those\t bits back in. "movdqa %%xmm1,%%xmm3 \n\t" // d:x0 "movdqa %%xmm1,%%xmm4 \n\t" // same "movdqa %%xmm1,%%xmm5 \n\t" // same "psllq $63, %%xmm3 \n\t" // d<<63:stuff "psllq $62, %%xmm4 \n\t" // d<<62:stuff "psllq $57, %%xmm5 \n\t" // d<<57:stuff "pxor %%xmm4, %%xmm3 \n\t" // d<<63+d<<62:stuff "pxor %%xmm5, %%xmm3 \n\t" // missing bits of d:stuff "psrldq $8, %%xmm3 \n\t" // 0:missing bits of d "pxor %%xmm3, %%xmm0 \n\t" // e1+f1+g1:e0+f0+g0 "pxor %%xmm1, %%xmm0 \n\t" // h1:h0 "pxor %%xmm2, %%xmm0 \n\t" // x3+h1:x2+h0 "movdqu %%xmm0, (%2) \n\t" // done : : "r" (aa), "r" (bb), "r" (cc) : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" ); /* Now byte-reverse the outputs */ for( i = 0; i < 16; i++ ) c[i] = cc[15 - i]; return; } /* * Compute decryption round keys from encryption round keys */ void mbedtls_aesni_inverse_key( unsigned char *invkey, const unsigned char *fwdkey, int nr ) { unsigned char *ik = invkey; const unsigned char *fk = fwdkey + 16 * nr; memcpy( ik, fk, 16 ); for( fk -= 16, ik += 16; fk > fwdkey; fk -= 16, ik += 16 ) asm( "movdqu (%0), %%xmm0 \n\t" AESIMC xmm0_xmm0 "\n\t" "movdqu %%xmm0, (%1) \n\t" : : "r" (fk), "r" (ik) : "memory", "xmm0" ); memcpy( ik, fk, 16 ); } /* * Key expansion, 128-bit case */ static void aesni_setkey_enc_128( unsigned char *rk, const unsigned char *key ) { asm( "movdqu (%1), %%xmm0 \n\t" // copy the original key "movdqu %%xmm0, (%0) \n\t" // as round key 0 "jmp 2f \n\t" // skip auxiliary routine /* * Finish generating the next round key. * * On entry xmm0 is r3:r2:r1:r0 and xmm1 is X:stuff:stuff:stuff * with X = rot( sub( r3 ) ) ^ RCON. * * On exit, xmm0 is r7:r6:r5:r4 * with r4 = X + r0, r5 = r4 + r1, r6 = r5 + r2, r7 = r6 + r3 * and those are written to the round key buffer. */ "1: \n\t" "pshufd $0xff, %%xmm1, %%xmm1 \n\t" // X:X:X:X "pxor %%xmm0, %%xmm1 \n\t" // X+r3:X+r2:X+r1:r4 "pslldq $4, %%xmm0 \n\t" // r2:r1:r0:0 "pxor %%xmm0, %%xmm1 \n\t" // X+r3+r2:X+r2+r1:r5:r4 "pslldq $4, %%xmm0 \n\t" // etc "pxor %%xmm0, %%xmm1 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm1, %%xmm0 \n\t" // update xmm0 for next time! "add $16, %0 \n\t" // point to next round key "movdqu %%xmm0, (%0) \n\t" // write it "ret \n\t" /* Main "loop" */ "2: \n\t" AESKEYGENA xmm0_xmm1 ",0x01 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x02 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x04 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x08 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x10 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x20 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x40 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x80 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x1B \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x36 \n\tcall 1b \n\t" : : "r" (rk), "r" (key) : "memory", "cc", "0" ); } /* * Key expansion, 192-bit case */ static void aesni_setkey_enc_192( unsigned char *rk, const unsigned char *key ) { asm( "movdqu (%1), %%xmm0 \n\t" // copy original round key "movdqu %%xmm0, (%0) \n\t" "add $16, %0 \n\t" "movq 16(%1), %%xmm1 \n\t" "movq %%xmm1, (%0) \n\t" "add $8, %0 \n\t" "jmp 2f \n\t" // skip auxiliary routine /* * Finish generating the next 6 quarter-keys. * * On entry xmm0 is r3:r2:r1:r0, xmm1 is stuff:stuff:r5:r4 * and xmm2 is stuff:stuff:X:stuff with X = rot( sub( r3 ) ) ^ RCON. * * On exit, xmm0 is r9:r8:r7:r6 and xmm1 is stuff:stuff:r11:r10 * and those are written to the round key buffer. */ "1: \n\t" "pshufd $0x55, %%xmm2, %%xmm2 \n\t" // X:X:X:X "pxor %%xmm0, %%xmm2 \n\t" // X+r3:X+r2:X+r1:r4 "pslldq $4, %%xmm0 \n\t" // etc "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm2, %%xmm0 \n\t" // update xmm0 = r9:r8:r7:r6 "movdqu %%xmm0, (%0) \n\t" "add $16, %0 \n\t" "pshufd $0xff, %%xmm0, %%xmm2 \n\t" // r9:r9:r9:r9 "pxor %%xmm1, %%xmm2 \n\t" // stuff:stuff:r9+r5:r10 "pslldq $4, %%xmm1 \n\t" // r2:r1:r0:0 "pxor %%xmm2, %%xmm1 \n\t" // xmm1 = stuff:stuff:r11:r10 "movq %%xmm1, (%0) \n\t" "add $8, %0 \n\t" "ret \n\t" "2: \n\t" AESKEYGENA xmm1_xmm2 ",0x01 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x02 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x04 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x08 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x10 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x20 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x40 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x80 \n\tcall 1b \n\t" : : "r" (rk), "r" (key) : "memory", "cc", "0" ); } /* * Key expansion, 256-bit case */ static void aesni_setkey_enc_256( unsigned char *rk, const unsigned char *key ) { asm( "movdqu (%1), %%xmm0 \n\t" "movdqu %%xmm0, (%0) \n\t" "add $16, %0 \n\t" "movdqu 16(%1), %%xmm1 \n\t" "movdqu %%xmm1, (%0) \n\t" "jmp 2f \n\t" // skip auxiliary routine /* * Finish generating the next two round keys. * * On entry xmm0 is r3:r2:r1:r0, xmm1 is r7:r6:r5:r4 and * xmm2 is X:stuff:stuff:stuff with X = rot( sub( r7 )) ^ RCON * * On exit, xmm0 is r11:r10:r9:r8 and xmm1 is r15:r14:r13:r12 * and those have been written to the output buffer. */ "1: \n\t" "pshufd $0xff, %%xmm2, %%xmm2 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm2, %%xmm0 \n\t" "add $16, %0 \n\t" "movdqu %%xmm0, (%0) \n\t" /* Set xmm2 to stuff:Y:stuff:stuff with Y = subword( r11 ) * and proceed to generate next round key from there */ AESKEYGENA xmm0_xmm2 ",0x00 \n\t" "pshufd $0xaa, %%xmm2, %%xmm2 \n\t" "pxor %%xmm1, %%xmm2 \n\t" "pslldq $4, %%xmm1 \n\t" "pxor %%xmm1, %%xmm2 \n\t" "pslldq $4, %%xmm1 \n\t" "pxor %%xmm1, %%xmm2 \n\t" "pslldq $4, %%xmm1 \n\t" "pxor %%xmm2, %%xmm1 \n\t" "add $16, %0 \n\t" "movdqu %%xmm1, (%0) \n\t" "ret \n\t" /* * Main "loop" - Generating one more key than necessary, * see definition of mbedtls_aes_context.buf */ "2: \n\t" AESKEYGENA xmm1_xmm2 ",0x01 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x02 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x04 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x08 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x10 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x20 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x40 \n\tcall 1b \n\t" : : "r" (rk), "r" (key) : "memory", "cc", "0" ); } /* * Key expansion, wrapper */ int mbedtls_aesni_setkey_enc( unsigned char *rk, const unsigned char *key, size_t bits ) { switch( bits ) { case 128: aesni_setkey_enc_128( rk, key ); break; case 192: aesni_setkey_enc_192( rk, key ); break; case 256: aesni_setkey_enc_256( rk, key ); break; default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ); } return( 0 ); } #endif /* MBEDTLS_HAVE_X86_64 */ #endif /* MBEDTLS_AESNI_C */ fldigi-4.1.06/src/mbedtls/bignum.c0000664000175000017500000017714513507401434013651 00000000000000/* * Multi-precision integer library * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The following sources were referenced in the design of this Multi-precision * Integer library: * * [1] Handbook of Applied Cryptography - 1997 * Menezes, van Oorschot and Vanstone * * [2] Multi-Precision Math * Tom St Denis * https://github.com/libtom/libtommath/blob/develop/tommath.pdf * * [3] GNU Multi-Precision Arithmetic Library * https://gmplib.org/manual/index.html * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_BIGNUM_C) #include "mbedtls/bignum.h" #include "mbedtls/bn_mul.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #define MPI_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA ) #define MPI_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */ #define biL (ciL << 3) /* bits in limb */ #define biH (ciL << 2) /* half limb size */ #define MPI_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */ /* * Convert between bits/chars and number of limbs * Divide first in order to avoid potential overflows */ #define BITS_TO_LIMBS(i) ( (i) / biL + ( (i) % biL != 0 ) ) #define CHARS_TO_LIMBS(i) ( (i) / ciL + ( (i) % ciL != 0 ) ) /* Implementation that should never be optimized out by the compiler */ static void mbedtls_mpi_zeroize( mbedtls_mpi_uint *v, size_t n ) { mbedtls_platform_zeroize( v, ciL * n ); } /* * Initialize one MPI */ void mbedtls_mpi_init( mbedtls_mpi *X ) { MPI_VALIDATE( X != NULL ); X->s = 1; X->n = 0; X->p = NULL; } /* * Unallocate one MPI */ void mbedtls_mpi_free( mbedtls_mpi *X ) { if( X == NULL ) return; if( X->p != NULL ) { mbedtls_mpi_zeroize( X->p, X->n ); mbedtls_free( X->p ); } X->s = 1; X->n = 0; X->p = NULL; } /* * Enlarge to the specified number of limbs */ int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs ) { mbedtls_mpi_uint *p; MPI_VALIDATE_RET( X != NULL ); if( nblimbs > MBEDTLS_MPI_MAX_LIMBS ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); if( X->n < nblimbs ) { if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( nblimbs, ciL ) ) == NULL ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); if( X->p != NULL ) { memcpy( p, X->p, X->n * ciL ); mbedtls_mpi_zeroize( X->p, X->n ); mbedtls_free( X->p ); } X->n = nblimbs; X->p = p; } return( 0 ); } /* * Resize down as much as possible, * while keeping at least the specified number of limbs */ int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs ) { mbedtls_mpi_uint *p; size_t i; MPI_VALIDATE_RET( X != NULL ); if( nblimbs > MBEDTLS_MPI_MAX_LIMBS ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); /* Actually resize up in this case */ if( X->n <= nblimbs ) return( mbedtls_mpi_grow( X, nblimbs ) ); for( i = X->n - 1; i > 0; i-- ) if( X->p[i] != 0 ) break; i++; if( i < nblimbs ) i = nblimbs; if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( i, ciL ) ) == NULL ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); if( X->p != NULL ) { memcpy( p, X->p, i * ciL ); mbedtls_mpi_zeroize( X->p, X->n ); mbedtls_free( X->p ); } X->n = i; X->p = p; return( 0 ); } /* * Copy the contents of Y into X */ int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y ) { int ret = 0; size_t i; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); if( X == Y ) return( 0 ); if( Y->p == NULL ) { mbedtls_mpi_free( X ); return( 0 ); } for( i = Y->n - 1; i > 0; i-- ) if( Y->p[i] != 0 ) break; i++; X->s = Y->s; if( X->n < i ) { MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i ) ); } else { memset( X->p + i, 0, ( X->n - i ) * ciL ); } memcpy( X->p, Y->p, i * ciL ); cleanup: return( ret ); } /* * Swap the contents of X and Y */ void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ) { mbedtls_mpi T; MPI_VALIDATE( X != NULL ); MPI_VALIDATE( Y != NULL ); memcpy( &T, X, sizeof( mbedtls_mpi ) ); memcpy( X, Y, sizeof( mbedtls_mpi ) ); memcpy( Y, &T, sizeof( mbedtls_mpi ) ); } /* * Conditionally assign X = Y, without leaking information * about whether the assignment was made or not. * (Leaking information about the respective sizes of X and Y is ok however.) */ int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign ) { int ret = 0; size_t i; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); /* make sure assign is 0 or 1 in a time-constant manner */ assign = (assign | (unsigned char)-assign) >> 7; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) ); X->s = X->s * ( 1 - assign ) + Y->s * assign; for( i = 0; i < Y->n; i++ ) X->p[i] = X->p[i] * ( 1 - assign ) + Y->p[i] * assign; for( ; i < X->n; i++ ) X->p[i] *= ( 1 - assign ); cleanup: return( ret ); } /* * Conditionally swap X and Y, without leaking information * about whether the swap was made or not. * Here it is not ok to simply swap the pointers, which whould lead to * different memory access patterns when X and Y are used afterwards. */ int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char swap ) { int ret, s; size_t i; mbedtls_mpi_uint tmp; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); if( X == Y ) return( 0 ); /* make sure swap is 0 or 1 in a time-constant manner */ swap = (swap | (unsigned char)-swap) >> 7; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y, X->n ) ); s = X->s; X->s = X->s * ( 1 - swap ) + Y->s * swap; Y->s = Y->s * ( 1 - swap ) + s * swap; for( i = 0; i < X->n; i++ ) { tmp = X->p[i]; X->p[i] = X->p[i] * ( 1 - swap ) + Y->p[i] * swap; Y->p[i] = Y->p[i] * ( 1 - swap ) + tmp * swap; } cleanup: return( ret ); } /* * Set value from integer */ int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ) { int ret; MPI_VALIDATE_RET( X != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, 1 ) ); memset( X->p, 0, X->n * ciL ); X->p[0] = ( z < 0 ) ? -z : z; X->s = ( z < 0 ) ? -1 : 1; cleanup: return( ret ); } /* * Get a specific bit */ int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos ) { MPI_VALIDATE_RET( X != NULL ); if( X->n * biL <= pos ) return( 0 ); return( ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01 ); } /* Get a specific byte, without range checks. */ #define GET_BYTE( X, i ) \ ( ( ( X )->p[( i ) / ciL] >> ( ( ( i ) % ciL ) * 8 ) ) & 0xff ) /* * Set a bit to a specific value of 0 or 1 */ int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val ) { int ret = 0; size_t off = pos / biL; size_t idx = pos % biL; MPI_VALIDATE_RET( X != NULL ); if( val != 0 && val != 1 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( X->n * biL <= pos ) { if( val == 0 ) return( 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, off + 1 ) ); } X->p[off] &= ~( (mbedtls_mpi_uint) 0x01 << idx ); X->p[off] |= (mbedtls_mpi_uint) val << idx; cleanup: return( ret ); } /* * Return the number of less significant zero-bits */ size_t mbedtls_mpi_lsb( const mbedtls_mpi *X ) { size_t i, j, count = 0; MBEDTLS_INTERNAL_VALIDATE_RET( X != NULL, 0 ); for( i = 0; i < X->n; i++ ) for( j = 0; j < biL; j++, count++ ) if( ( ( X->p[i] >> j ) & 1 ) != 0 ) return( count ); return( 0 ); } /* * Count leading zero bits in a given integer */ static size_t mbedtls_clz( const mbedtls_mpi_uint x ) { size_t j; mbedtls_mpi_uint mask = (mbedtls_mpi_uint) 1 << (biL - 1); for( j = 0; j < biL; j++ ) { if( x & mask ) break; mask >>= 1; } return j; } /* * Return the number of bits */ size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X ) { size_t i, j; if( X->n == 0 ) return( 0 ); for( i = X->n - 1; i > 0; i-- ) if( X->p[i] != 0 ) break; j = biL - mbedtls_clz( X->p[i] ); return( ( i * biL ) + j ); } /* * Return the total size in bytes */ size_t mbedtls_mpi_size( const mbedtls_mpi *X ) { return( ( mbedtls_mpi_bitlen( X ) + 7 ) >> 3 ); } /* * Convert an ASCII character to digit value */ static int mpi_get_digit( mbedtls_mpi_uint *d, int radix, char c ) { *d = 255; if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30; if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37; if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57; if( *d >= (mbedtls_mpi_uint) radix ) return( MBEDTLS_ERR_MPI_INVALID_CHARACTER ); return( 0 ); } /* * Import from an ASCII string */ int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s ) { int ret; size_t i, j, slen, n; mbedtls_mpi_uint d; mbedtls_mpi T; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( s != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); mbedtls_mpi_init( &T ); slen = strlen( s ); if( radix == 16 ) { if( slen > MPI_SIZE_T_MAX >> 2 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); n = BITS_TO_LIMBS( slen << 2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, n ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( i = slen, j = 0; i > 0; i--, j++ ) { if( i == 1 && s[i - 1] == '-' ) { X->s = -1; break; } MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) ); X->p[j / ( 2 * ciL )] |= d << ( ( j % ( 2 * ciL ) ) << 2 ); } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( i = 0; i < slen; i++ ) { if( i == 0 && s[i] == '-' ) { X->s = -1; continue; } MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T, X, radix ) ); if( X->s == 1 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, &T, d ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( X, &T, d ) ); } } } cleanup: mbedtls_mpi_free( &T ); return( ret ); } /* * Helper to write the digits high-order first */ static int mpi_write_hlp( mbedtls_mpi *X, int radix, char **p ) { int ret; mbedtls_mpi_uint r; if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) ); if( mbedtls_mpi_cmp_int( X, 0 ) != 0 ) MBEDTLS_MPI_CHK( mpi_write_hlp( X, radix, p ) ); if( r < 10 ) *(*p)++ = (char)( r + 0x30 ); else *(*p)++ = (char)( r + 0x37 ); cleanup: return( ret ); } /* * Export into an ASCII string */ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, char *buf, size_t buflen, size_t *olen ) { int ret = 0; size_t n; char *p; mbedtls_mpi T; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( olen != NULL ); MPI_VALIDATE_RET( buflen == 0 || buf != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); n = mbedtls_mpi_bitlen( X ); if( radix >= 4 ) n >>= 1; if( radix >= 16 ) n >>= 1; /* * Round up the buffer length to an even value to ensure that there is * enough room for hexadecimal values that can be represented in an odd * number of digits. */ n += 3 + ( ( n + 1 ) & 1 ); if( buflen < n ) { *olen = n; return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); } p = buf; mbedtls_mpi_init( &T ); if( X->s == -1 ) *p++ = '-'; if( radix == 16 ) { int c; size_t i, j, k; for( i = X->n, k = 0; i > 0; i-- ) { for( j = ciL; j > 0; j-- ) { c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF; if( c == 0 && k == 0 && ( i + j ) != 2 ) continue; *(p++) = "0123456789ABCDEF" [c / 16]; *(p++) = "0123456789ABCDEF" [c % 16]; k = 1; } } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T, X ) ); if( T.s == -1 ) T.s = 1; MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p ) ); } *p++ = '\0'; *olen = p - buf; cleanup: mbedtls_mpi_free( &T ); return( ret ); } #if defined(MBEDTLS_FS_IO) /* * Read X from an opened file */ int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ) { mbedtls_mpi_uint d; size_t slen; char *p; /* * Buffer should have space for (short) label and decimal formatted MPI, * newline characters and '\0' */ char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( fin != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); memset( s, 0, sizeof( s ) ); if( fgets( s, sizeof( s ) - 1, fin ) == NULL ) return( MBEDTLS_ERR_MPI_FILE_IO_ERROR ); slen = strlen( s ); if( slen == sizeof( s ) - 2 ) return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); if( slen > 0 && s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; } if( slen > 0 && s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; } p = s + slen; while( p-- > s ) if( mpi_get_digit( &d, radix, *p ) != 0 ) break; return( mbedtls_mpi_read_string( X, radix, p + 1 ) ); } /* * Write X into an opened file (or stdout if fout == NULL) */ int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout ) { int ret; size_t n, slen, plen; /* * Buffer should have space for (short) label and decimal formatted MPI, * newline characters and '\0' */ char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ]; MPI_VALIDATE_RET( X != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); memset( s, 0, sizeof( s ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_string( X, radix, s, sizeof( s ) - 2, &n ) ); if( p == NULL ) p = ""; plen = strlen( p ); slen = strlen( s ); s[slen++] = '\r'; s[slen++] = '\n'; if( fout != NULL ) { if( fwrite( p, 1, plen, fout ) != plen || fwrite( s, 1, slen, fout ) != slen ) return( MBEDTLS_ERR_MPI_FILE_IO_ERROR ); } else mbedtls_printf( "%s%s", p, s ); cleanup: return( ret ); } #endif /* MBEDTLS_FS_IO */ /* * Import X from unsigned binary data, big endian */ int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ) { int ret; size_t i, j; size_t const limbs = CHARS_TO_LIMBS( buflen ); MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( buflen == 0 || buf != NULL ); /* Ensure that target MPI has exactly the necessary number of limbs */ if( X->n != limbs ) { mbedtls_mpi_free( X ); mbedtls_mpi_init( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, limbs ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( i = buflen, j = 0; i > 0; i--, j++ ) X->p[j / ciL] |= ((mbedtls_mpi_uint) buf[i - 1]) << ((j % ciL) << 3); cleanup: return( ret ); } /* * Export X into unsigned binary data, big endian */ int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen ) { size_t stored_bytes; size_t bytes_to_copy; unsigned char *p; size_t i; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( buflen == 0 || buf != NULL ); stored_bytes = X->n * ciL; if( stored_bytes < buflen ) { /* There is enough space in the output buffer. Write initial * null bytes and record the position at which to start * writing the significant bytes. In this case, the execution * trace of this function does not depend on the value of the * number. */ bytes_to_copy = stored_bytes; p = buf + buflen - stored_bytes; memset( buf, 0, buflen - stored_bytes ); } else { /* The output buffer is smaller than the allocated size of X. * However X may fit if its leading bytes are zero. */ bytes_to_copy = buflen; p = buf; for( i = bytes_to_copy; i < stored_bytes; i++ ) { if( GET_BYTE( X, i ) != 0 ) return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); } } for( i = 0; i < bytes_to_copy; i++ ) p[bytes_to_copy - i - 1] = GET_BYTE( X, i ); return( 0 ); } /* * Left-shift: X <<= count */ int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count ) { int ret; size_t i, v0, t1; mbedtls_mpi_uint r0 = 0, r1; MPI_VALIDATE_RET( X != NULL ); v0 = count / (biL ); t1 = count & (biL - 1); i = mbedtls_mpi_bitlen( X ) + count; if( X->n * biL < i ) MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, BITS_TO_LIMBS( i ) ) ); ret = 0; /* * shift by count / limb_size */ if( v0 > 0 ) { for( i = X->n; i > v0; i-- ) X->p[i - 1] = X->p[i - v0 - 1]; for( ; i > 0; i-- ) X->p[i - 1] = 0; } /* * shift by count % limb_size */ if( t1 > 0 ) { for( i = v0; i < X->n; i++ ) { r1 = X->p[i] >> (biL - t1); X->p[i] <<= t1; X->p[i] |= r0; r0 = r1; } } cleanup: return( ret ); } /* * Right-shift: X >>= count */ int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count ) { size_t i, v0, v1; mbedtls_mpi_uint r0 = 0, r1; MPI_VALIDATE_RET( X != NULL ); v0 = count / biL; v1 = count & (biL - 1); if( v0 > X->n || ( v0 == X->n && v1 > 0 ) ) return mbedtls_mpi_lset( X, 0 ); /* * shift by count / limb_size */ if( v0 > 0 ) { for( i = 0; i < X->n - v0; i++ ) X->p[i] = X->p[i + v0]; for( ; i < X->n; i++ ) X->p[i] = 0; } /* * shift by count % limb_size */ if( v1 > 0 ) { for( i = X->n; i > 0; i-- ) { r1 = X->p[i - 1] << (biL - v1); X->p[i - 1] >>= v1; X->p[i - 1] |= r0; r0 = r1; } } return( 0 ); } /* * Compare unsigned values */ int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y ) { size_t i, j; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); for( i = X->n; i > 0; i-- ) if( X->p[i - 1] != 0 ) break; for( j = Y->n; j > 0; j-- ) if( Y->p[j - 1] != 0 ) break; if( i == 0 && j == 0 ) return( 0 ); if( i > j ) return( 1 ); if( j > i ) return( -1 ); for( ; i > 0; i-- ) { if( X->p[i - 1] > Y->p[i - 1] ) return( 1 ); if( X->p[i - 1] < Y->p[i - 1] ) return( -1 ); } return( 0 ); } /* * Compare signed values */ int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y ) { size_t i, j; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); for( i = X->n; i > 0; i-- ) if( X->p[i - 1] != 0 ) break; for( j = Y->n; j > 0; j-- ) if( Y->p[j - 1] != 0 ) break; if( i == 0 && j == 0 ) return( 0 ); if( i > j ) return( X->s ); if( j > i ) return( -Y->s ); if( X->s > 0 && Y->s < 0 ) return( 1 ); if( Y->s > 0 && X->s < 0 ) return( -1 ); for( ; i > 0; i-- ) { if( X->p[i - 1] > Y->p[i - 1] ) return( X->s ); if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s ); } return( 0 ); } /* * Compare signed values */ int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ) { mbedtls_mpi Y; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); *p = ( z < 0 ) ? -z : z; Y.s = ( z < 0 ) ? -1 : 1; Y.n = 1; Y.p = p; return( mbedtls_mpi_cmp_mpi( X, &Y ) ); } /* * Unsigned addition: X = |A| + |B| (HAC 14.7) */ int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t i, j; mbedtls_mpi_uint *o, *p, c, tmp; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( X == B ) { const mbedtls_mpi *T = A; A = X; B = T; } if( X != A ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) ); /* * X should always be positive as a result of unsigned additions. */ X->s = 1; for( j = B->n; j > 0; j-- ) if( B->p[j - 1] != 0 ) break; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); o = B->p; p = X->p; c = 0; /* * tmp is used because it might happen that p == o */ for( i = 0; i < j; i++, o++, p++ ) { tmp= *o; *p += c; c = ( *p < c ); *p += tmp; c += ( *p < tmp ); } while( c != 0 ) { if( i >= X->n ) { MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + 1 ) ); p = X->p + i; } *p += c; c = ( *p < c ); i++; p++; } cleanup: return( ret ); } /* * Helper for mbedtls_mpi subtraction */ static void mpi_sub_hlp( size_t n, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d ) { size_t i; mbedtls_mpi_uint c, z; for( i = c = 0; i < n; i++, s++, d++ ) { z = ( *d < c ); *d -= c; c = ( *d < *s ) + z; *d -= *s; } while( c != 0 ) { z = ( *d < c ); *d -= c; c = z; d++; } } /* * Unsigned subtraction: X = |A| - |B| (HAC 14.9) */ int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { mbedtls_mpi TB; int ret; size_t n; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( mbedtls_mpi_cmp_abs( A, B ) < 0 ) return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE ); mbedtls_mpi_init( &TB ); if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; } if( X != A ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) ); /* * X should always be positive as a result of unsigned subtractions. */ X->s = 1; ret = 0; for( n = B->n; n > 0; n-- ) if( B->p[n - 1] != 0 ) break; mpi_sub_hlp( n, B->p, X->p ); cleanup: mbedtls_mpi_free( &TB ); return( ret ); } /* * Signed addition: X = A + B */ int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret, s; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); s = A->s; if( A->s * B->s < 0 ) { if( mbedtls_mpi_cmp_abs( A, B ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) ); X->s = s; } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) ); X->s = -s; } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) ); X->s = s; } cleanup: return( ret ); } /* * Signed subtraction: X = A - B */ int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret, s; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); s = A->s; if( A->s * B->s > 0 ) { if( mbedtls_mpi_cmp_abs( A, B ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) ); X->s = s; } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) ); X->s = -s; } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) ); X->s = s; } cleanup: return( ret ); } /* * Signed addition: X = A + b */ int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); p[0] = ( b < 0 ) ? -b : b; _B.s = ( b < 0 ) ? -1 : 1; _B.n = 1; _B.p = p; return( mbedtls_mpi_add_mpi( X, A, &_B ) ); } /* * Signed subtraction: X = A - b */ int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); p[0] = ( b < 0 ) ? -b : b; _B.s = ( b < 0 ) ? -1 : 1; _B.n = 1; _B.p = p; return( mbedtls_mpi_sub_mpi( X, A, &_B ) ); } /* * Helper for mbedtls_mpi multiplication */ static #if defined(__APPLE__) && defined(__arm__) /* * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn) * appears to need this to prevent bad ARM code generation at -O3. */ __attribute__ ((noinline)) #endif void mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b ) { mbedtls_mpi_uint c = 0, t = 0; #if defined(MULADDC_HUIT) for( ; i >= 8; i -= 8 ) { MULADDC_INIT MULADDC_HUIT MULADDC_STOP } for( ; i > 0; i-- ) { MULADDC_INIT MULADDC_CORE MULADDC_STOP } #else /* MULADDC_HUIT */ for( ; i >= 16; i -= 16 ) { MULADDC_INIT MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_STOP } for( ; i >= 8; i -= 8 ) { MULADDC_INIT MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_STOP } for( ; i > 0; i-- ) { MULADDC_INIT MULADDC_CORE MULADDC_STOP } #endif /* MULADDC_HUIT */ t++; do { *d += c; c = ( *d < c ); d++; } while( c != 0 ); } /* * Baseline multiplication: X = A * B (HAC 14.12) */ int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t i, j; mbedtls_mpi TA, TB; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB ); if( X == A ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); A = &TA; } if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; } for( i = A->n; i > 0; i-- ) if( A->p[i - 1] != 0 ) break; for( j = B->n; j > 0; j-- ) if( B->p[j - 1] != 0 ) break; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( ; j > 0; j-- ) mpi_mul_hlp( i, A->p, X->p + j - 1, B->p[j - 1] ); X->s = A->s * B->s; cleanup: mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TA ); return( ret ); } /* * Baseline multiplication: X = A * b */ int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); _B.s = 1; _B.n = 1; _B.p = p; p[0] = b; return( mbedtls_mpi_mul_mpi( X, A, &_B ) ); } /* * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and * mbedtls_mpi_uint divisor, d */ static mbedtls_mpi_uint mbedtls_int_div_int( mbedtls_mpi_uint u1, mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint *r ) { #if defined(MBEDTLS_HAVE_UDBL) mbedtls_t_udbl dividend, quotient; #else const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH; const mbedtls_mpi_uint uint_halfword_mask = ( (mbedtls_mpi_uint) 1 << biH ) - 1; mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient; mbedtls_mpi_uint u0_msw, u0_lsw; size_t s; #endif /* * Check for overflow */ if( 0 == d || u1 >= d ) { if (r != NULL) *r = ~0; return ( ~0 ); } #if defined(MBEDTLS_HAVE_UDBL) dividend = (mbedtls_t_udbl) u1 << biL; dividend |= (mbedtls_t_udbl) u0; quotient = dividend / d; if( quotient > ( (mbedtls_t_udbl) 1 << biL ) - 1 ) quotient = ( (mbedtls_t_udbl) 1 << biL ) - 1; if( r != NULL ) *r = (mbedtls_mpi_uint)( dividend - (quotient * d ) ); return (mbedtls_mpi_uint) quotient; #else /* * Algorithm D, Section 4.3.1 - The Art of Computer Programming * Vol. 2 - Seminumerical Algorithms, Knuth */ /* * Normalize the divisor, d, and dividend, u0, u1 */ s = mbedtls_clz( d ); d = d << s; u1 = u1 << s; u1 |= ( u0 >> ( biL - s ) ) & ( -(mbedtls_mpi_sint)s >> ( biL - 1 ) ); u0 = u0 << s; d1 = d >> biH; d0 = d & uint_halfword_mask; u0_msw = u0 >> biH; u0_lsw = u0 & uint_halfword_mask; /* * Find the first quotient and remainder */ q1 = u1 / d1; r0 = u1 - d1 * q1; while( q1 >= radix || ( q1 * d0 > radix * r0 + u0_msw ) ) { q1 -= 1; r0 += d1; if ( r0 >= radix ) break; } rAX = ( u1 * radix ) + ( u0_msw - q1 * d ); q0 = rAX / d1; r0 = rAX - q0 * d1; while( q0 >= radix || ( q0 * d0 > radix * r0 + u0_lsw ) ) { q0 -= 1; r0 += d1; if ( r0 >= radix ) break; } if (r != NULL) *r = ( rAX * radix + u0_lsw - q0 * d ) >> s; quotient = q1 * radix + q0; return quotient; #endif } /* * Division by mbedtls_mpi: A = Q * B + R (HAC 14.20) */ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t i, n, t, k; mbedtls_mpi X, Y, Z, T1, T2; MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( mbedtls_mpi_cmp_int( B, 0 ) == 0 ) return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 ); if( mbedtls_mpi_cmp_abs( A, B ) < 0 ) { if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_lset( Q, 0 ) ); if( R != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, A ) ); return( 0 ); } MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &X, A ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, B ) ); X.s = Y.s = 1; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z, A->n + 2 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1, 2 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T2, 3 ) ); k = mbedtls_mpi_bitlen( &Y ) % biL; if( k < biL - 1 ) { k = biL - 1 - k; MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &X, k ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, k ) ); } else k = 0; n = X.n - 1; t = Y.n - 1; MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, biL * ( n - t ) ) ); while( mbedtls_mpi_cmp_mpi( &X, &Y ) >= 0 ) { Z.p[n - t]++; MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &Y ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, biL * ( n - t ) ) ); for( i = n; i > t ; i-- ) { if( X.p[i] >= Y.p[t] ) Z.p[i - t - 1] = ~0; else { Z.p[i - t - 1] = mbedtls_int_div_int( X.p[i], X.p[i - 1], Y.p[t], NULL); } Z.p[i - t - 1]++; do { Z.p[i - t - 1]--; MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T1, 0 ) ); T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1]; T1.p[1] = Y.p[t]; MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T2, 0 ) ); T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2]; T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1]; T2.p[2] = X.p[i]; } while( mbedtls_mpi_cmp_mpi( &T1, &T2 ) > 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) ); if( mbedtls_mpi_cmp_int( &X, 0 ) < 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T1, &Y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &X, &X, &T1 ) ); Z.p[i - t - 1]--; } } if( Q != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( Q, &Z ) ); Q->s = A->s * B->s; } if( R != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &X, k ) ); X.s = A->s; MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, &X ) ); if( mbedtls_mpi_cmp_int( R, 0 ) == 0 ) R->s = 1; } cleanup: mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 ); return( ret ); } /* * Division by int: A = Q * b + R */ int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( A != NULL ); p[0] = ( b < 0 ) ? -b : b; _B.s = ( b < 0 ) ? -1 : 1; _B.n = 1; _B.p = p; return( mbedtls_mpi_div_mpi( Q, R, A, &_B ) ); } /* * Modulo: R = A mod B */ int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; MPI_VALIDATE_RET( R != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( mbedtls_mpi_cmp_int( B, 0 ) < 0 ) return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( NULL, R, A, B ) ); while( mbedtls_mpi_cmp_int( R, 0 ) < 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( R, R, B ) ); while( mbedtls_mpi_cmp_mpi( R, B ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( R, R, B ) ); cleanup: return( ret ); } /* * Modulo: r = A mod b */ int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { size_t i; mbedtls_mpi_uint x, y, z; MPI_VALIDATE_RET( r != NULL ); MPI_VALIDATE_RET( A != NULL ); if( b == 0 ) return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO ); if( b < 0 ) return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE ); /* * handle trivial cases */ if( b == 1 ) { *r = 0; return( 0 ); } if( b == 2 ) { *r = A->p[0] & 1; return( 0 ); } /* * general case */ for( i = A->n, y = 0; i > 0; i-- ) { x = A->p[i - 1]; y = ( y << biH ) | ( x >> biH ); z = y / b; y -= z * b; x <<= biH; y = ( y << biH ) | ( x >> biH ); z = y / b; y -= z * b; } /* * If A is negative, then the current y represents a negative value. * Flipping it to the positive side. */ if( A->s < 0 && y != 0 ) y = b - y; *r = y; return( 0 ); } /* * Fast Montgomery initialization (thanks to Tom St Denis) */ static void mpi_montg_init( mbedtls_mpi_uint *mm, const mbedtls_mpi *N ) { mbedtls_mpi_uint x, m0 = N->p[0]; unsigned int i; x = m0; x += ( ( m0 + 2 ) & 4 ) << 1; for( i = biL; i >= 8; i /= 2 ) x *= ( 2 - ( m0 * x ) ); *mm = ~x + 1; } /* * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36) */ static int mpi_montmul( mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T ) { size_t i, n, m; mbedtls_mpi_uint u0, u1, *d; if( T->n < N->n + 1 || T->p == NULL ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); memset( T->p, 0, T->n * ciL ); d = T->p; n = N->n; m = ( B->n < n ) ? B->n : n; for( i = 0; i < n; i++ ) { /* * T = (T + u0*B + u1*N) / 2^biL */ u0 = A->p[i]; u1 = ( d[0] + u0 * B->p[0] ) * mm; mpi_mul_hlp( m, B->p, d, u0 ); mpi_mul_hlp( n, N->p, d, u1 ); *d++ = u0; d[n + 1] = 0; } memcpy( A->p, d, ( n + 1 ) * ciL ); if( mbedtls_mpi_cmp_abs( A, N ) >= 0 ) mpi_sub_hlp( n, N->p, A->p ); else /* prevent timing attacks */ mpi_sub_hlp( n, A->p, T->p ); return( 0 ); } /* * Montgomery reduction: A = A * R^-1 mod N */ static int mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T ) { mbedtls_mpi_uint z = 1; mbedtls_mpi U; U.n = U.s = (int) z; U.p = &z; return( mpi_montmul( A, &U, N, mm, T ) ); } /* * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) */ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR ) { int ret; size_t wbits, wsize, one = 1; size_t i, j, nblimbs; size_t bufsize, nbits; mbedtls_mpi_uint ei, mm, state; mbedtls_mpi RR, T, W[ 2 << MBEDTLS_MPI_WINDOW_SIZE ], Apos; int neg; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( E != NULL ); MPI_VALIDATE_RET( N != NULL ); if( mbedtls_mpi_cmp_int( N, 0 ) <= 0 || ( N->p[0] & 1 ) == 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( E, 0 ) < 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); /* * Init temps and window size */ mpi_montg_init( &mm, N ); mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &Apos ); memset( W, 0, sizeof( W ) ); i = mbedtls_mpi_bitlen( E ); wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; if( wsize > MBEDTLS_MPI_WINDOW_SIZE ) wsize = MBEDTLS_MPI_WINDOW_SIZE; j = N->n + 1; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1], j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) ); /* * Compensate for negative A (and correct at the end) */ neg = ( A->s == -1 ); if( neg ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos, A ) ); Apos.s = 1; A = &Apos; } /* * If 1st call, pre-compute R^2 mod N */ if( _RR == NULL || _RR->p == NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR, N->n * 2 * biL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR, &RR, N ) ); if( _RR != NULL ) memcpy( _RR, &RR, sizeof( mbedtls_mpi ) ); } else memcpy( &RR, _RR, sizeof( mbedtls_mpi ) ); /* * W[1] = A * R^2 * R^-1 mod N = A * R mod N */ if( mbedtls_mpi_cmp_mpi( A, N ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W[1], A, N ) ); else MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[1], A ) ); MBEDTLS_MPI_CHK( mpi_montmul( &W[1], &RR, N, mm, &T ) ); /* * X = R^2 * R^-1 mod N = R mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) ); MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) ); if( wsize > 1 ) { /* * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1) */ j = one << ( wsize - 1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1] ) ); for( i = 0; i < wsize - 1; i++ ) MBEDTLS_MPI_CHK( mpi_montmul( &W[j], &W[j], N, mm, &T ) ); /* * W[i] = W[i - 1] * W[1] */ for( i = j + 1; i < ( one << wsize ); i++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) ); MBEDTLS_MPI_CHK( mpi_montmul( &W[i], &W[1], N, mm, &T ) ); } } nblimbs = E->n; bufsize = 0; nbits = 0; wbits = 0; state = 0; while( 1 ) { if( bufsize == 0 ) { if( nblimbs == 0 ) break; nblimbs--; bufsize = sizeof( mbedtls_mpi_uint ) << 3; } bufsize--; ei = (E->p[nblimbs] >> bufsize) & 1; /* * skip leading 0s */ if( ei == 0 && state == 0 ) continue; if( ei == 0 && state == 1 ) { /* * out of window, square X */ MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) ); continue; } /* * add ei to current window */ state = 2; nbits++; wbits |= ( ei << ( wsize - nbits ) ); if( nbits == wsize ) { /* * X = X^wsize R^-1 mod N */ for( i = 0; i < wsize; i++ ) MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) ); /* * X = X * W[wbits] R^-1 mod N */ MBEDTLS_MPI_CHK( mpi_montmul( X, &W[wbits], N, mm, &T ) ); state--; nbits = 0; wbits = 0; } } /* * process the remaining bits */ for( i = 0; i < nbits; i++ ) { MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) ); wbits <<= 1; if( ( wbits & ( one << wsize ) ) != 0 ) MBEDTLS_MPI_CHK( mpi_montmul( X, &W[1], N, mm, &T ) ); } /* * X = A^E * R * R^-1 mod N = A^E mod N */ MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) ); if( neg && E->n != 0 && ( E->p[0] & 1 ) != 0 ) { X->s = -1; MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) ); } cleanup: for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ ) mbedtls_mpi_free( &W[i] ); mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos ); if( _RR == NULL || _RR->p == NULL ) mbedtls_mpi_free( &RR ); return( ret ); } /* * Greatest common divisor: G = gcd(A, B) (HAC 14.54) */ int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t lz, lzt; mbedtls_mpi TG, TA, TB; MPI_VALIDATE_RET( G != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); mbedtls_mpi_init( &TG ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); lz = mbedtls_mpi_lsb( &TA ); lzt = mbedtls_mpi_lsb( &TB ); if( lzt < lz ) lz = lzt; MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, lz ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, lz ) ); TA.s = TB.s = 1; while( mbedtls_mpi_cmp_int( &TA, 0 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, mbedtls_mpi_lsb( &TA ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, mbedtls_mpi_lsb( &TB ) ) ); if( mbedtls_mpi_cmp_mpi( &TA, &TB ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TA, &TA, &TB ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, 1 ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TB, &TB, &TA ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, 1 ) ); } } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &TB, lz ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( G, &TB ) ); cleanup: mbedtls_mpi_free( &TG ); mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TB ); return( ret ); } /* * Fill X with size bytes of random. * * Use a temporary bytes representation to make sure the result is the same * regardless of the platform endianness (useful when f_rng is actually * deterministic, eg for tests). */ int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); if( size > MBEDTLS_MPI_MAX_SIZE ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( f_rng( p_rng, buf, size ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X, buf, size ) ); cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } /* * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64) */ int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N ) { int ret; mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( N != NULL ); if( mbedtls_mpi_cmp_int( N, 1 ) <= 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TU ); mbedtls_mpi_init( &U1 ); mbedtls_mpi_init( &U2 ); mbedtls_mpi_init( &G ); mbedtls_mpi_init( &TB ); mbedtls_mpi_init( &TV ); mbedtls_mpi_init( &V1 ); mbedtls_mpi_init( &V2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, A, N ) ); if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 ) { ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &TA, A, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TU, &TA ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TV, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U1, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U2, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V1, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V2, 1 ) ); do { while( ( TU.p[0] & 1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TU, 1 ) ); if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &U1, &U1, &TB ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &TA ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U1, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U2, 1 ) ); } while( ( TV.p[0] & 1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TV, 1 ) ); if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, &TB ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &TA ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V1, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V2, 1 ) ); } if( mbedtls_mpi_cmp_mpi( &TU, &TV ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TU, &TU, &TV ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U1, &U1, &V1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &V2 ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TV, &TV, &TU ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, &U1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &U2 ) ); } } while( mbedtls_mpi_cmp_int( &TU, 0 ) != 0 ); while( mbedtls_mpi_cmp_int( &V1, 0 ) < 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, N ) ); while( mbedtls_mpi_cmp_mpi( &V1, N ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &V1 ) ); cleanup: mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TU ); mbedtls_mpi_free( &U1 ); mbedtls_mpi_free( &U2 ); mbedtls_mpi_free( &G ); mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TV ); mbedtls_mpi_free( &V1 ); mbedtls_mpi_free( &V2 ); return( ret ); } #if defined(MBEDTLS_GENPRIME) static const int small_prime[] = { 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, -103 }; /* * Small divisors test (X must be positive) * * Return values: * 0: no small factor (possible prime, more tests needed) * 1: certain prime * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime * other negative: error */ static int mpi_check_small_factors( const mbedtls_mpi *X ) { int ret = 0; size_t i; mbedtls_mpi_uint r; if( ( X->p[0] & 1 ) == 0 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); for( i = 0; small_prime[i] > 0; i++ ) { if( mbedtls_mpi_cmp_int( X, small_prime[i] ) <= 0 ) return( 1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, small_prime[i] ) ); if( r == 0 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); } cleanup: return( ret ); } /* * Miller-Rabin pseudo-primality test (HAC 4.24) */ static int mpi_miller_rabin( const mbedtls_mpi *X, size_t rounds, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count; size_t i, j, k, s; mbedtls_mpi W, R, T, A, RR; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); mbedtls_mpi_init( &W ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &A ); mbedtls_mpi_init( &RR ); /* * W = |X| - 1 * R = W >> lsb( W ) */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &W, X, 1 ) ); s = mbedtls_mpi_lsb( &W ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R, &W ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &R, s ) ); i = mbedtls_mpi_bitlen( X ); for( i = 0; i < rounds; i++ ) { /* * pick a random A, 1 < A < |X| - 1 */ count = 0; do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) ); j = mbedtls_mpi_bitlen( &A ); k = mbedtls_mpi_bitlen( &W ); if (j > k) { A.p[A.n - 1] &= ( (mbedtls_mpi_uint) 1 << ( k - ( A.n - 1 ) * biL - 1 ) ) - 1; } if (count++ > 30) { return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; } } while ( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 || mbedtls_mpi_cmp_int( &A, 1 ) <= 0 ); /* * A = A^R mod |X| */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &A, &A, &R, X, &RR ) ); if( mbedtls_mpi_cmp_mpi( &A, &W ) == 0 || mbedtls_mpi_cmp_int( &A, 1 ) == 0 ) continue; j = 1; while( j < s && mbedtls_mpi_cmp_mpi( &A, &W ) != 0 ) { /* * A = A * A mod |X| */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &A, &A ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &A, &T, X ) ); if( mbedtls_mpi_cmp_int( &A, 1 ) == 0 ) break; j++; } /* * not prime if A != |X| - 1 or A == 1 */ if( mbedtls_mpi_cmp_mpi( &A, &W ) != 0 || mbedtls_mpi_cmp_int( &A, 1 ) == 0 ) { ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; break; } } cleanup: mbedtls_mpi_free( &W ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &A ); mbedtls_mpi_free( &RR ); return( ret ); } /* * Pseudo-primality test: small factors, then Miller-Rabin */ int mbedtls_mpi_is_prime_ext( const mbedtls_mpi *X, int rounds, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi XX; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); XX.s = 1; XX.n = X->n; XX.p = X->p; if( mbedtls_mpi_cmp_int( &XX, 0 ) == 0 || mbedtls_mpi_cmp_int( &XX, 1 ) == 0 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); if( mbedtls_mpi_cmp_int( &XX, 2 ) == 0 ) return( 0 ); if( ( ret = mpi_check_small_factors( &XX ) ) != 0 ) { if( ret == 1 ) return( 0 ); return( ret ); } return( mpi_miller_rabin( &XX, rounds, f_rng, p_rng ) ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) /* * Pseudo-primality test, error probability 2^-80 */ int mbedtls_mpi_is_prime( const mbedtls_mpi *X, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); /* * In the past our key generation aimed for an error rate of at most * 2^-80. Since this function is deprecated, aim for the same certainty * here as well. */ return( mbedtls_mpi_is_prime_ext( X, 40, f_rng, p_rng ) ); } #endif /* * Prime number generation * * To generate an RSA key in a way recommended by FIPS 186-4, both primes must * be either 1024 bits or 1536 bits long, and flags must contain * MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR. */ int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { #ifdef MBEDTLS_HAVE_INT64 // ceil(2^63.5) #define CEIL_MAXUINT_DIV_SQRT2 0xb504f333f9de6485ULL #else // ceil(2^31.5) #define CEIL_MAXUINT_DIV_SQRT2 0xb504f334U #endif int ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; size_t k, n; int rounds; mbedtls_mpi_uint r; mbedtls_mpi Y; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); if( nbits < 3 || nbits > MBEDTLS_MPI_MAX_BITS ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); mbedtls_mpi_init( &Y ); n = BITS_TO_LIMBS( nbits ); if( ( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR ) == 0 ) { /* * 2^-80 error probability, number of rounds chosen per HAC, table 4.4 */ rounds = ( ( nbits >= 1300 ) ? 2 : ( nbits >= 850 ) ? 3 : ( nbits >= 650 ) ? 4 : ( nbits >= 350 ) ? 8 : ( nbits >= 250 ) ? 12 : ( nbits >= 150 ) ? 18 : 27 ); } else { /* * 2^-100 error probability, number of rounds computed based on HAC, * fact 4.48 */ rounds = ( ( nbits >= 1450 ) ? 4 : ( nbits >= 1150 ) ? 5 : ( nbits >= 1000 ) ? 6 : ( nbits >= 850 ) ? 7 : ( nbits >= 750 ) ? 8 : ( nbits >= 500 ) ? 13 : ( nbits >= 250 ) ? 28 : ( nbits >= 150 ) ? 40 : 51 ); } while( 1 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( X, n * ciL, f_rng, p_rng ) ); /* make sure generated number is at least (nbits-1)+0.5 bits (FIPS 186-4 §B.3.3 steps 4.4, 5.5) */ if( X->p[n-1] < CEIL_MAXUINT_DIV_SQRT2 ) continue; k = n * biL; if( k > nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( X, k - nbits ) ); X->p[0] |= 1; if( ( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH ) == 0 ) { ret = mbedtls_mpi_is_prime_ext( X, rounds, f_rng, p_rng ); if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ) goto cleanup; } else { /* * An necessary condition for Y and X = 2Y + 1 to be prime * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3). * Make sure it is satisfied, while keeping X = 3 mod 4 */ X->p[0] |= 2; MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, 3 ) ); if( r == 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 8 ) ); else if( r == 1 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 4 ) ); /* Set Y = (X-1) / 2, which is X / 2 because X is odd */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, 1 ) ); while( 1 ) { /* * First, check small factors for X and Y * before doing Miller-Rabin on any of them */ if( ( ret = mpi_check_small_factors( X ) ) == 0 && ( ret = mpi_check_small_factors( &Y ) ) == 0 && ( ret = mpi_miller_rabin( X, rounds, f_rng, p_rng ) ) == 0 && ( ret = mpi_miller_rabin( &Y, rounds, f_rng, p_rng ) ) == 0 ) goto cleanup; if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ) goto cleanup; /* * Next candidates. We want to preserve Y = (X-1) / 2 and * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3) * so up Y by 6 and X by 12. */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 12 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &Y, &Y, 6 ) ); } } } cleanup: mbedtls_mpi_free( &Y ); return( ret ); } #endif /* MBEDTLS_GENPRIME */ #if defined(MBEDTLS_SELF_TEST) #define GCD_PAIR_COUNT 3 static const int gcd_pairs[GCD_PAIR_COUNT][3] = { { 693, 609, 21 }, { 1764, 868, 28 }, { 768454923, 542167814, 1 } }; /* * Checkup routine */ int mbedtls_mpi_self_test( int verbose ) { int ret, i; mbedtls_mpi A, E, N, X, Y, U, V; mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &U ); mbedtls_mpi_init( &V ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &A, 16, "EFE021C2645FD1DC586E69184AF4A31E" \ "D5F53E93B5F123FA41680867BA110131" \ "944FE7952E2517337780CB0DB80E61AA" \ "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &E, 16, "B2E7EFD37075B9F03FF989C7C5051C20" \ "34D2A323810251127E7BF8625A4F49A5" \ "F3E27F4DA8BD59C47D6DAABA4C8127BD" \ "5B5C25763222FEFCCFC38B832366C29E" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &N, 16, "0066A198186C18C10B2F5ED9B522752A" \ "9830B69916E535C8F047518A889A43A5" \ "94B6BED27A168D31D4A52F88925AA8F5" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &A, &N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "602AB7ECA597A3D6B56FF9829A5E8B85" \ "9E857EA95A03512E2BAE7391688D264A" \ "A5663B0341DB9CCFD2C4C5F421FEC814" \ "8001B72E848A38CAE1C65F78E56ABDEF" \ "E12D3C039B8A02D6BE593F0BBBDA56F1" \ "ECF677152EF804370C1A305CAF3B5BF1" \ "30879B56C61DE584A0F53A2447A51E" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #1 (mul_mpi): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &X, &Y, &A, &N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "256567336059E52CAE22925474705F39A94" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &V, 16, "6613F26162223DF488E9CD48CC132C7A" \ "0AC93C701B001B092E4E5B9F73BCD27B" \ "9EE50D0657C77F374E903CDFA4C642" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #2 (div_mpi): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 || mbedtls_mpi_cmp_mpi( &Y, &V ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &X, &A, &E, &N, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "36E139AEA55215609D2816998ED020BB" \ "BD96C37890F65171D948E9BC7CBAA4D9" \ "325D24D6A3C12710F10A09FA08AB87" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #3 (exp_mod): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &X, &A, &N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \ "C3DBA76456363A10869622EAC2DD84EC" \ "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #4 (inv_mod): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " MPI test #5 (simple gcd): " ); for( i = 0; i < GCD_PAIR_COUNT; i++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &X, gcd_pairs[i][0] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Y, gcd_pairs[i][1] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &A, &X, &Y ) ); if( mbedtls_mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed at %d\n", i ); ret = 1; goto cleanup; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: if( ret != 0 && verbose != 0 ) mbedtls_printf( "Unexpected error, return code = %08X\n", ret ); mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &U ); mbedtls_mpi_free( &V ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_BIGNUM_C */ fldigi-4.1.06/src/mbedtls/rsa.c0000664000175000017500000024560013507401434013145 00000000000000/* * The RSA public-key cryptosystem * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The following sources were referenced in the design of this implementation * of the RSA algorithm: * * [1] A method for obtaining digital signatures and public-key cryptosystems * R Rivest, A Shamir, and L Adleman * http://people.csail.mit.edu/rivest/pubs.html#RSA78 * * [2] Handbook of Applied Cryptography - 1997, Chapter 8 * Menezes, van Oorschot and Vanstone * * [3] Malware Guard Extension: Using SGX to Conceal Cache Attacks * Michael Schwarz, Samuel Weiser, Daniel Gruss, Clémentine Maurice and * Stefan Mangard * https://arxiv.org/abs/1702.08719v2 * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #include "mbedtls/rsa_internal.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PKCS1_V21) #include "mbedtls/md.h" #endif #if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__) #include #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #if !defined(MBEDTLS_RSA_ALT) /* Parameter validation macros */ #define RSA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_RSA_BAD_INPUT_DATA ) #define RSA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_PKCS1_V15) /* constant-time buffer comparison */ static inline int mbedtls_safer_memcmp( const void *a, const void *b, size_t n ) { size_t i; const unsigned char *A = (const unsigned char *) a; const unsigned char *B = (const unsigned char *) b; unsigned char diff = 0; for( i = 0; i < n; i++ ) diff |= A[i] ^ B[i]; return( diff ); } #endif /* MBEDTLS_PKCS1_V15 */ int mbedtls_rsa_import( mbedtls_rsa_context *ctx, const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E ) { int ret; RSA_VALIDATE_RET( ctx != NULL ); if( ( N != NULL && ( ret = mbedtls_mpi_copy( &ctx->N, N ) ) != 0 ) || ( P != NULL && ( ret = mbedtls_mpi_copy( &ctx->P, P ) ) != 0 ) || ( Q != NULL && ( ret = mbedtls_mpi_copy( &ctx->Q, Q ) ) != 0 ) || ( D != NULL && ( ret = mbedtls_mpi_copy( &ctx->D, D ) ) != 0 ) || ( E != NULL && ( ret = mbedtls_mpi_copy( &ctx->E, E ) ) != 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } if( N != NULL ) ctx->len = mbedtls_mpi_size( &ctx->N ); return( 0 ); } int mbedtls_rsa_import_raw( mbedtls_rsa_context *ctx, unsigned char const *N, size_t N_len, unsigned char const *P, size_t P_len, unsigned char const *Q, size_t Q_len, unsigned char const *D, size_t D_len, unsigned char const *E, size_t E_len ) { int ret = 0; RSA_VALIDATE_RET( ctx != NULL ); if( N != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->N, N, N_len ) ); ctx->len = mbedtls_mpi_size( &ctx->N ); } if( P != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->P, P, P_len ) ); if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->Q, Q, Q_len ) ); if( D != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->D, D, D_len ) ); if( E != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->E, E, E_len ) ); cleanup: if( ret != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); return( 0 ); } /* * Checks whether the context fields are set in such a way * that the RSA primitives will be able to execute without error. * It does *not* make guarantees for consistency of the parameters. */ static int rsa_check_context( mbedtls_rsa_context const *ctx, int is_priv, int blinding_needed ) { #if !defined(MBEDTLS_RSA_NO_CRT) /* blinding_needed is only used for NO_CRT to decide whether * P,Q need to be present or not. */ ((void) blinding_needed); #endif if( ctx->len != mbedtls_mpi_size( &ctx->N ) || ctx->len > MBEDTLS_MPI_MAX_SIZE ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } /* * 1. Modular exponentiation needs positive, odd moduli. */ /* Modular exponentiation wrt. N is always used for * RSA public key operations. */ if( mbedtls_mpi_cmp_int( &ctx->N, 0 ) <= 0 || mbedtls_mpi_get_bit( &ctx->N, 0 ) == 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #if !defined(MBEDTLS_RSA_NO_CRT) /* Modular exponentiation for P and Q is only * used for private key operations and if CRT * is used. */ if( is_priv && ( mbedtls_mpi_cmp_int( &ctx->P, 0 ) <= 0 || mbedtls_mpi_get_bit( &ctx->P, 0 ) == 0 || mbedtls_mpi_cmp_int( &ctx->Q, 0 ) <= 0 || mbedtls_mpi_get_bit( &ctx->Q, 0 ) == 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif /* !MBEDTLS_RSA_NO_CRT */ /* * 2. Exponents must be positive */ /* Always need E for public key operations */ if( mbedtls_mpi_cmp_int( &ctx->E, 0 ) <= 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); #if defined(MBEDTLS_RSA_NO_CRT) /* For private key operations, use D or DP & DQ * as (unblinded) exponents. */ if( is_priv && mbedtls_mpi_cmp_int( &ctx->D, 0 ) <= 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); #else if( is_priv && ( mbedtls_mpi_cmp_int( &ctx->DP, 0 ) <= 0 || mbedtls_mpi_cmp_int( &ctx->DQ, 0 ) <= 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif /* MBEDTLS_RSA_NO_CRT */ /* Blinding shouldn't make exponents negative either, * so check that P, Q >= 1 if that hasn't yet been * done as part of 1. */ #if defined(MBEDTLS_RSA_NO_CRT) if( is_priv && blinding_needed && ( mbedtls_mpi_cmp_int( &ctx->P, 0 ) <= 0 || mbedtls_mpi_cmp_int( &ctx->Q, 0 ) <= 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif /* It wouldn't lead to an error if it wasn't satisfied, * but check for QP >= 1 nonetheless. */ #if !defined(MBEDTLS_RSA_NO_CRT) if( is_priv && mbedtls_mpi_cmp_int( &ctx->QP, 0 ) <= 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif return( 0 ); } int mbedtls_rsa_complete( mbedtls_rsa_context *ctx ) { int ret = 0; int have_N, have_P, have_Q, have_D, have_E; int n_missing, pq_missing, d_missing, is_pub, is_priv; RSA_VALIDATE_RET( ctx != NULL ); have_N = ( mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 ); have_P = ( mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 ); have_Q = ( mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 ); have_D = ( mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 ); have_E = ( mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0 ); /* * Check whether provided parameters are enough * to deduce all others. The following incomplete * parameter sets for private keys are supported: * * (1) P, Q missing. * (2) D and potentially N missing. * */ n_missing = have_P && have_Q && have_D && have_E; pq_missing = have_N && !have_P && !have_Q && have_D && have_E; d_missing = have_P && have_Q && !have_D && have_E; is_pub = have_N && !have_P && !have_Q && !have_D && have_E; /* These three alternatives are mutually exclusive */ is_priv = n_missing || pq_missing || d_missing; if( !is_priv && !is_pub ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Step 1: Deduce N if P, Q are provided. */ if( !have_N && have_P && have_Q ) { if( ( ret = mbedtls_mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } ctx->len = mbedtls_mpi_size( &ctx->N ); } /* * Step 2: Deduce and verify all remaining core parameters. */ if( pq_missing ) { ret = mbedtls_rsa_deduce_primes( &ctx->N, &ctx->E, &ctx->D, &ctx->P, &ctx->Q ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } else if( d_missing ) { if( ( ret = mbedtls_rsa_deduce_private_exponent( &ctx->P, &ctx->Q, &ctx->E, &ctx->D ) ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } } /* * Step 3: Deduce all additional parameters specific * to our current RSA implementation. */ #if !defined(MBEDTLS_RSA_NO_CRT) if( is_priv ) { ret = mbedtls_rsa_deduce_crt( &ctx->P, &ctx->Q, &ctx->D, &ctx->DP, &ctx->DQ, &ctx->QP ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } #endif /* MBEDTLS_RSA_NO_CRT */ /* * Step 3: Basic sanity checks */ return( rsa_check_context( ctx, is_priv, 1 ) ); } int mbedtls_rsa_export_raw( const mbedtls_rsa_context *ctx, unsigned char *N, size_t N_len, unsigned char *P, size_t P_len, unsigned char *Q, size_t Q_len, unsigned char *D, size_t D_len, unsigned char *E, size_t E_len ) { int ret = 0; int is_priv; RSA_VALIDATE_RET( ctx != NULL ); /* Check if key is private or public */ is_priv = mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0; if( !is_priv ) { /* If we're trying to export private parameters for a public key, * something must be wrong. */ if( P != NULL || Q != NULL || D != NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } if( N != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->N, N, N_len ) ); if( P != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->P, P, P_len ) ); if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->Q, Q, Q_len ) ); if( D != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->D, D, D_len ) ); if( E != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->E, E, E_len ) ); cleanup: return( ret ); } int mbedtls_rsa_export( const mbedtls_rsa_context *ctx, mbedtls_mpi *N, mbedtls_mpi *P, mbedtls_mpi *Q, mbedtls_mpi *D, mbedtls_mpi *E ) { int ret; int is_priv; RSA_VALIDATE_RET( ctx != NULL ); /* Check if key is private or public */ is_priv = mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0; if( !is_priv ) { /* If we're trying to export private parameters for a public key, * something must be wrong. */ if( P != NULL || Q != NULL || D != NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } /* Export all requested core parameters. */ if( ( N != NULL && ( ret = mbedtls_mpi_copy( N, &ctx->N ) ) != 0 ) || ( P != NULL && ( ret = mbedtls_mpi_copy( P, &ctx->P ) ) != 0 ) || ( Q != NULL && ( ret = mbedtls_mpi_copy( Q, &ctx->Q ) ) != 0 ) || ( D != NULL && ( ret = mbedtls_mpi_copy( D, &ctx->D ) ) != 0 ) || ( E != NULL && ( ret = mbedtls_mpi_copy( E, &ctx->E ) ) != 0 ) ) { return( ret ); } return( 0 ); } /* * Export CRT parameters * This must also be implemented if CRT is not used, for being able to * write DER encoded RSA keys. The helper function mbedtls_rsa_deduce_crt * can be used in this case. */ int mbedtls_rsa_export_crt( const mbedtls_rsa_context *ctx, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ) { int ret; int is_priv; RSA_VALIDATE_RET( ctx != NULL ); /* Check if key is private or public */ is_priv = mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0; if( !is_priv ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); #if !defined(MBEDTLS_RSA_NO_CRT) /* Export all requested blinding parameters. */ if( ( DP != NULL && ( ret = mbedtls_mpi_copy( DP, &ctx->DP ) ) != 0 ) || ( DQ != NULL && ( ret = mbedtls_mpi_copy( DQ, &ctx->DQ ) ) != 0 ) || ( QP != NULL && ( ret = mbedtls_mpi_copy( QP, &ctx->QP ) ) != 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } #else if( ( ret = mbedtls_rsa_deduce_crt( &ctx->P, &ctx->Q, &ctx->D, DP, DQ, QP ) ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } #endif return( 0 ); } /* * Initialize an RSA context */ void mbedtls_rsa_init( mbedtls_rsa_context *ctx, int padding, int hash_id ) { RSA_VALIDATE( ctx != NULL ); RSA_VALIDATE( padding == MBEDTLS_RSA_PKCS_V15 || padding == MBEDTLS_RSA_PKCS_V21 ); memset( ctx, 0, sizeof( mbedtls_rsa_context ) ); mbedtls_rsa_set_padding( ctx, padding, hash_id ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } /* * Set padding for an existing RSA context */ void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id ) { RSA_VALIDATE( ctx != NULL ); RSA_VALIDATE( padding == MBEDTLS_RSA_PKCS_V15 || padding == MBEDTLS_RSA_PKCS_V21 ); ctx->padding = padding; ctx->hash_id = hash_id; } /* * Get length in bytes of RSA modulus */ size_t mbedtls_rsa_get_len( const mbedtls_rsa_context *ctx ) { return( ctx->len ); } #if defined(MBEDTLS_GENPRIME) /* * Generate an RSA keypair * * This generation method follows the RSA key pair generation procedure of * FIPS 186-4 if 2^16 < exponent < 2^256 and nbits = 2048 or nbits = 3072. */ int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, unsigned int nbits, int exponent ) { int ret; mbedtls_mpi H, G, L; int prime_quality = 0; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( f_rng != NULL ); if( nbits < 128 || exponent < 3 || nbits % 2 != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * If the modulus is 1024 bit long or shorter, then the security strength of * the RSA algorithm is less than or equal to 80 bits and therefore an error * rate of 2^-80 is sufficient. */ if( nbits > 1024 ) prime_quality = MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR; mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G ); mbedtls_mpi_init( &L ); /* * find primes P and Q with Q < P so that: * 1. |P-Q| > 2^( nbits / 2 - 100 ) * 2. GCD( E, (P-1)*(Q-1) ) == 1 * 3. E^-1 mod LCM(P-1, Q-1) > 2^( nbits / 2 ) */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->E, exponent ) ); do { MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->P, nbits >> 1, prime_quality, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->Q, nbits >> 1, prime_quality, f_rng, p_rng ) ); /* make sure the difference between p and q is not too small (FIPS 186-4 §B.3.3 step 5.4) */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &H, &ctx->P, &ctx->Q ) ); if( mbedtls_mpi_bitlen( &H ) <= ( ( nbits >= 200 ) ? ( ( nbits >> 1 ) - 99 ) : 0 ) ) continue; /* not required by any standards, but some users rely on the fact that P > Q */ if( H.s < 0 ) mbedtls_mpi_swap( &ctx->P, &ctx->Q ); /* Temporarily replace P,Q by P-1, Q-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &ctx->P, &ctx->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &ctx->Q, &ctx->Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &ctx->P, &ctx->Q ) ); /* check GCD( E, (P-1)*(Q-1) ) == 1 (FIPS 186-4 §B.3.1 criterion 2(a)) */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->E, &H ) ); if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 ) continue; /* compute smallest possible D = E^-1 mod LCM(P-1, Q-1) (FIPS 186-4 §B.3.1 criterion 3(b)) */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->P, &ctx->Q ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &L, NULL, &H, &G ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->D, &ctx->E, &L ) ); if( mbedtls_mpi_bitlen( &ctx->D ) <= ( ( nbits + 1 ) / 2 ) ) // (FIPS 186-4 §B.3.1 criterion 3(a)) continue; break; } while( 1 ); /* Restore P,Q */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &ctx->P, &ctx->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &ctx->Q, &ctx->Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) ); ctx->len = mbedtls_mpi_size( &ctx->N ); #if !defined(MBEDTLS_RSA_NO_CRT) /* * DP = D mod (P - 1) * DQ = D mod (Q - 1) * QP = Q^-1 mod P */ MBEDTLS_MPI_CHK( mbedtls_rsa_deduce_crt( &ctx->P, &ctx->Q, &ctx->D, &ctx->DP, &ctx->DQ, &ctx->QP ) ); #endif /* MBEDTLS_RSA_NO_CRT */ /* Double-check */ MBEDTLS_MPI_CHK( mbedtls_rsa_check_privkey( ctx ) ); cleanup: mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G ); mbedtls_mpi_free( &L ); if( ret != 0 ) { mbedtls_rsa_free( ctx ); return( MBEDTLS_ERR_RSA_KEY_GEN_FAILED + ret ); } return( 0 ); } #endif /* MBEDTLS_GENPRIME */ /* * Check a public RSA key */ int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ) { RSA_VALIDATE_RET( ctx != NULL ); if( rsa_check_context( ctx, 0 /* public */, 0 /* no blinding */ ) != 0 ) return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); if( mbedtls_mpi_bitlen( &ctx->N ) < 128 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } if( mbedtls_mpi_get_bit( &ctx->E, 0 ) == 0 || mbedtls_mpi_bitlen( &ctx->E ) < 2 || mbedtls_mpi_cmp_mpi( &ctx->E, &ctx->N ) >= 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } return( 0 ); } /* * Check for the consistency of all fields in an RSA private key context */ int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx ) { RSA_VALIDATE_RET( ctx != NULL ); if( mbedtls_rsa_check_pubkey( ctx ) != 0 || rsa_check_context( ctx, 1 /* private */, 1 /* blinding */ ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } if( mbedtls_rsa_validate_params( &ctx->N, &ctx->P, &ctx->Q, &ctx->D, &ctx->E, NULL, NULL ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } #if !defined(MBEDTLS_RSA_NO_CRT) else if( mbedtls_rsa_validate_crt( &ctx->P, &ctx->Q, &ctx->D, &ctx->DP, &ctx->DQ, &ctx->QP ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } #endif return( 0 ); } /* * Check if contexts holding a public and private key match */ int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv ) { RSA_VALIDATE_RET( pub != NULL ); RSA_VALIDATE_RET( prv != NULL ); if( mbedtls_rsa_check_pubkey( pub ) != 0 || mbedtls_rsa_check_privkey( prv ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } if( mbedtls_mpi_cmp_mpi( &pub->N, &prv->N ) != 0 || mbedtls_mpi_cmp_mpi( &pub->E, &prv->E ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } return( 0 ); } /* * Do an RSA public key operation */ int mbedtls_rsa_public( mbedtls_rsa_context *ctx, const unsigned char *input, unsigned char *output ) { int ret; size_t olen; mbedtls_mpi T; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( output != NULL ); if( rsa_check_context( ctx, 0 /* public */, 0 /* no blinding */ ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); mbedtls_mpi_init( &T ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) ); if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) { ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; goto cleanup; } olen = ctx->len; MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) ); cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif mbedtls_mpi_free( &T ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_PUBLIC_FAILED + ret ); return( 0 ); } /* * Generate or update blinding values, see section 10 of: * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA, * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer * Berlin Heidelberg, 1996. p. 104-113. */ static int rsa_prepare_blinding( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count = 0; if( ctx->Vf.p != NULL ) { /* We already have blinding values, just update them by squaring */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->N ) ); goto cleanup; } /* Unblinding value: Vf = random number, invertible mod N */ do { if( count++ > 10 ) return( MBEDTLS_ERR_RSA_RNG_FAILED ); MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vf, ctx->len - 1, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &ctx->Vi, &ctx->Vf, &ctx->N ) ); } while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 ); /* Blinding value: Vi = Vf^(-e) mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vf, &ctx->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vi, &ctx->Vi, &ctx->E, &ctx->N, &ctx->RN ) ); cleanup: return( ret ); } /* * Exponent blinding supposed to prevent side-channel attacks using multiple * traces of measurements to recover the RSA key. The more collisions are there, * the more bits of the key can be recovered. See [3]. * * Collecting n collisions with m bit long blinding value requires 2^(m-m/n) * observations on avarage. * * For example with 28 byte blinding to achieve 2 collisions the adversary has * to make 2^112 observations on avarage. * * (With the currently (as of 2017 April) known best algorithms breaking 2048 * bit RSA requires approximately as much time as trying out 2^112 random keys. * Thus in this sense with 28 byte blinding the security is not reduced by * side-channel attacks like the one in [3]) * * This countermeasure does not help if the key recovery is possible with a * single trace. */ #define RSA_EXPONENT_BLINDING 28 /* * Do an RSA private key operation */ int mbedtls_rsa_private( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, const unsigned char *input, unsigned char *output ) { int ret; size_t olen; /* Temporary holding the result */ mbedtls_mpi T; /* Temporaries holding P-1, Q-1 and the * exponent blinding factor, respectively. */ mbedtls_mpi P1, Q1, R; #if !defined(MBEDTLS_RSA_NO_CRT) /* Temporaries holding the results mod p resp. mod q. */ mbedtls_mpi TP, TQ; /* Temporaries holding the blinded exponents for * the mod p resp. mod q computation (if used). */ mbedtls_mpi DP_blind, DQ_blind; /* Pointers to actual exponents to be used - either the unblinded * or the blinded ones, depending on the presence of a PRNG. */ mbedtls_mpi *DP = &ctx->DP; mbedtls_mpi *DQ = &ctx->DQ; #else /* Temporary holding the blinded exponent (if used). */ mbedtls_mpi D_blind; /* Pointer to actual exponent to be used - either the unblinded * or the blinded one, depending on the presence of a PRNG. */ mbedtls_mpi *D = &ctx->D; #endif /* MBEDTLS_RSA_NO_CRT */ /* Temporaries holding the initial input and the double * checked result; should be the same in the end. */ mbedtls_mpi I, C; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( output != NULL ); if( rsa_check_context( ctx, 1 /* private key checks */, f_rng != NULL /* blinding y/n */ ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif /* MPI Initialization */ mbedtls_mpi_init( &T ); mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &R ); if( f_rng != NULL ) { #if defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_init( &D_blind ); #else mbedtls_mpi_init( &DP_blind ); mbedtls_mpi_init( &DQ_blind ); #endif } #if !defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_init( &TP ); mbedtls_mpi_init( &TQ ); #endif mbedtls_mpi_init( &I ); mbedtls_mpi_init( &C ); /* End of MPI initialization */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) ); if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) { ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &I, &T ) ); if( f_rng != NULL ) { /* * Blinding * T = T * Vi mod N */ MBEDTLS_MPI_CHK( rsa_prepare_blinding( ctx, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) ); /* * Exponent blinding */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q, 1 ) ); #if defined(MBEDTLS_RSA_NO_CRT) /* * D_blind = ( P - 1 ) * ( Q - 1 ) * R + D */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &P1, &Q1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &D_blind, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &D_blind, &D_blind, &ctx->D ) ); D = &D_blind; #else /* * DP_blind = ( P - 1 ) * R + DP */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DP_blind, &P1, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DP_blind, &DP_blind, &ctx->DP ) ); DP = &DP_blind; /* * DQ_blind = ( Q - 1 ) * R + DQ */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DQ_blind, &Q1, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DQ_blind, &DQ_blind, &ctx->DQ ) ); DQ = &DQ_blind; #endif /* MBEDTLS_RSA_NO_CRT */ } #if defined(MBEDTLS_RSA_NO_CRT) MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, D, &ctx->N, &ctx->RN ) ); #else /* * Faster decryption using the CRT * * TP = input ^ dP mod P * TQ = input ^ dQ mod Q */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &TP, &T, DP, &ctx->P, &ctx->RP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &TQ, &T, DQ, &ctx->Q, &ctx->RQ ) ); /* * T = (TP - TQ) * (Q^-1 mod P) mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &TP, &TQ ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &TP, &T, &ctx->QP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &TP, &ctx->P ) ); /* * T = TQ + T * Q */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &TP, &T, &ctx->Q ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &TQ, &TP ) ); #endif /* MBEDTLS_RSA_NO_CRT */ if( f_rng != NULL ) { /* * Unblind * T = T * Vf mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) ); } /* Verify the result to prevent glitching attacks. */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &C, &T, &ctx->E, &ctx->N, &ctx->RN ) ); if( mbedtls_mpi_cmp_mpi( &C, &I ) != 0 ) { ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; goto cleanup; } olen = ctx->len; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) ); cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &R ); if( f_rng != NULL ) { #if defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_free( &D_blind ); #else mbedtls_mpi_free( &DP_blind ); mbedtls_mpi_free( &DQ_blind ); #endif } mbedtls_mpi_free( &T ); #if !defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_free( &TP ); mbedtls_mpi_free( &TQ ); #endif mbedtls_mpi_free( &C ); mbedtls_mpi_free( &I ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_PRIVATE_FAILED + ret ); return( 0 ); } #if defined(MBEDTLS_PKCS1_V21) /** * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer. * * \param dst buffer to mask * \param dlen length of destination buffer * \param src source of the mask generation * \param slen length of the source buffer * \param md_ctx message digest context to use */ static int mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src, size_t slen, mbedtls_md_context_t *md_ctx ) { unsigned char mask[MBEDTLS_MD_MAX_SIZE]; unsigned char counter[4]; unsigned char *p; unsigned int hlen; size_t i, use_len; int ret = 0; memset( mask, 0, MBEDTLS_MD_MAX_SIZE ); memset( counter, 0, 4 ); hlen = mbedtls_md_get_size( md_ctx->md_info ); /* Generate and apply dbMask */ p = dst; while( dlen > 0 ) { use_len = hlen; if( dlen < hlen ) use_len = dlen; if( ( ret = mbedtls_md_starts( md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( md_ctx, src, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( md_ctx, counter, 4 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_finish( md_ctx, mask ) ) != 0 ) goto exit; for( i = 0; i < use_len; ++i ) *p++ ^= mask[i]; counter[3]++; dlen -= use_len; } exit: mbedtls_platform_zeroize( mask, sizeof( mask ) ); return( ret ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function */ int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t ilen, const unsigned char *input, unsigned char *output ) { size_t olen; int ret; unsigned char *p = output; unsigned int hlen; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( label_len == 0 || label != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( f_rng == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); olen = ctx->len; hlen = mbedtls_md_get_size( md_info ); /* first comparison checks for overflow */ if( ilen + 2 * hlen + 2 < ilen || olen < ilen + 2 * hlen + 2 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); memset( output, 0, olen ); *p++ = 0; /* Generate a random octet string seed */ if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 ) return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); p += hlen; /* Construct DB */ if( ( ret = mbedtls_md( md_info, label, label_len, p ) ) != 0 ) return( ret ); p += hlen; p += olen - 2 * hlen - 2 - ilen; *p++ = 1; memcpy( p, input, ilen ); mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) goto exit; /* maskedDB: Apply dbMask to DB */ if( ( ret = mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen, &md_ctx ) ) != 0 ) goto exit; /* maskedSeed: Apply seedMask to seed */ if( ( ret = mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1, &md_ctx ) ) != 0 ) goto exit; exit: mbedtls_md_free( &md_ctx ); if( ret != 0 ) return( ret ); return( ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, output, output ) : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /* * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function */ int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ) { size_t nb_pad, olen; int ret; unsigned char *p = output; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output != NULL ); RSA_VALIDATE_RET( input != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); olen = ctx->len; /* first comparison checks for overflow */ if( ilen + 11 < ilen || olen < ilen + 11 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad = olen - 3 - ilen; *p++ = 0; if( mode == MBEDTLS_RSA_PUBLIC ) { if( f_rng == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); *p++ = MBEDTLS_RSA_CRYPT; while( nb_pad-- > 0 ) { int rng_dl = 100; do { ret = f_rng( p_rng, p, 1 ); } while( *p == 0 && --rng_dl && ret == 0 ); /* Check if RNG failed to generate data */ if( rng_dl == 0 || ret != 0 ) return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); p++; } } else { *p++ = MBEDTLS_RSA_SIGN; while( nb_pad-- > 0 ) *p++ = 0xFF; } *p++ = 0; memcpy( p, input, ilen ); return( ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, output, output ) : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Add the message padding, then do an RSA operation */ int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output != NULL ); RSA_VALIDATE_RET( input != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen, input, output ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0, ilen, input, output ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function */ int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { int ret; size_t ilen, i, pad_len; unsigned char *p, bad, pad_done; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; unsigned char lhash[MBEDTLS_MD_MAX_SIZE]; unsigned int hlen; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output_max_len == 0 || output != NULL ); RSA_VALIDATE_RET( label_len == 0 || label != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( olen != NULL ); /* * Parameters sanity checks */ if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); ilen = ctx->len; if( ilen < 16 || ilen > sizeof( buf ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hlen = mbedtls_md_get_size( md_info ); // checking for integer underflow if( 2 * hlen + 2 > ilen ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * RSA operation */ ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, input, buf ) : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf ); if( ret != 0 ) goto cleanup; /* * Unmask data and generate lHash */ mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) { mbedtls_md_free( &md_ctx ); goto cleanup; } /* seed: Apply seedMask to maskedSeed */ if( ( ret = mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1, &md_ctx ) ) != 0 || /* DB: Apply dbMask to maskedDB */ ( ret = mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen, &md_ctx ) ) != 0 ) { mbedtls_md_free( &md_ctx ); goto cleanup; } mbedtls_md_free( &md_ctx ); /* Generate lHash */ if( ( ret = mbedtls_md( md_info, label, label_len, lhash ) ) != 0 ) goto cleanup; /* * Check contents, in "constant-time" */ p = buf; bad = 0; bad |= *p++; /* First byte must be 0 */ p += hlen; /* Skip seed */ /* Check lHash */ for( i = 0; i < hlen; i++ ) bad |= lhash[i] ^ *p++; /* Get zero-padding len, but always read till end of buffer * (minus one, for the 01 byte) */ pad_len = 0; pad_done = 0; for( i = 0; i < ilen - 2 * hlen - 2; i++ ) { pad_done |= p[i]; pad_len += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1; } p += pad_len; bad |= *p++ ^ 0x01; /* * The only information "leaked" is whether the padding was correct or not * (eg, no data is copied if it was not correct). This meets the * recommendations in PKCS#1 v2.2: an opponent cannot distinguish between * the different error conditions. */ if( bad != 0 ) { ret = MBEDTLS_ERR_RSA_INVALID_PADDING; goto cleanup; } if( ilen - ( p - buf ) > output_max_len ) { ret = MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE; goto cleanup; } *olen = ilen - (p - buf); memcpy( output, p, *olen ); ret = 0; cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); mbedtls_platform_zeroize( lhash, sizeof( lhash ) ); return( ret ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /** Turn zero-or-nonzero into zero-or-all-bits-one, without branches. * * \param value The value to analyze. * \return Zero if \p value is zero, otherwise all-bits-one. */ static unsigned all_or_nothing_int( unsigned value ) { /* MSVC has a warning about unary minus on unsigned, but this is * well-defined and precisely what we want to do here */ #if defined(_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4146 ) #endif return( - ( ( value | - value ) >> ( sizeof( value ) * 8 - 1 ) ) ); #if defined(_MSC_VER) #pragma warning( pop ) #endif } /** Check whether a size is out of bounds, without branches. * * This is equivalent to `size > max`, but is likely to be compiled to * to code using bitwise operation rather than a branch. * * \param size Size to check. * \param max Maximum desired value for \p size. * \return \c 0 if `size <= max`. * \return \c 1 if `size > max`. */ static unsigned size_greater_than( size_t size, size_t max ) { /* Return the sign bit (1 for negative) of (max - size). */ return( ( max - size ) >> ( sizeof( size_t ) * 8 - 1 ) ); } /** Choose between two integer values, without branches. * * This is equivalent to `cond ? if1 : if0`, but is likely to be compiled * to code using bitwise operation rather than a branch. * * \param cond Condition to test. * \param if1 Value to use if \p cond is nonzero. * \param if0 Value to use if \p cond is zero. * \return \c if1 if \p cond is nonzero, otherwise \c if0. */ static unsigned if_int( unsigned cond, unsigned if1, unsigned if0 ) { unsigned mask = all_or_nothing_int( cond ); return( ( mask & if1 ) | (~mask & if0 ) ); } /** Shift some data towards the left inside a buffer without leaking * the length of the data through side channels. * * `mem_move_to_left(start, total, offset)` is functionally equivalent to * ``` * memmove(start, start + offset, total - offset); * memset(start + offset, 0, total - offset); * ``` * but it strives to use a memory access pattern (and thus total timing) * that does not depend on \p offset. This timing independence comes at * the expense of performance. * * \param start Pointer to the start of the buffer. * \param total Total size of the buffer. * \param offset Offset from which to copy \p total - \p offset bytes. */ static void mem_move_to_left( void *start, size_t total, size_t offset ) { volatile unsigned char *buf = start; size_t i, n; if( total == 0 ) return; for( i = 0; i < total; i++ ) { unsigned no_op = size_greater_than( total - offset, i ); /* The first `total - offset` passes are a no-op. The last * `offset` passes shift the data one byte to the left and * zero out the last byte. */ for( n = 0; n < total - 1; n++ ) { unsigned char current = buf[n]; unsigned char next = buf[n+1]; buf[n] = if_int( no_op, current, next ); } buf[total-1] = if_int( no_op, buf[total-1], 0 ); } } /* * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function */ int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { int ret; size_t ilen, i, plaintext_max_size; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; /* The following variables take sensitive values: their value must * not leak into the observable behavior of the function other than * the designated outputs (output, olen, return value). Otherwise * this would open the execution of the function to * side-channel-based variants of the Bleichenbacher padding oracle * attack. Potential side channels include overall timing, memory * access patterns (especially visible to an adversary who has access * to a shared memory cache), and branches (especially visible to * an adversary who has access to a shared code cache or to a shared * branch predictor). */ size_t pad_count = 0; unsigned bad = 0; unsigned char pad_done = 0; size_t plaintext_size = 0; unsigned output_too_large; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output_max_len == 0 || output != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( olen != NULL ); ilen = ctx->len; plaintext_max_size = ( output_max_len > ilen - 11 ? ilen - 11 : output_max_len ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( ilen < 16 || ilen > sizeof( buf ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, input, buf ) : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf ); if( ret != 0 ) goto cleanup; /* Check and get padding length in constant time and constant * memory trace. The first byte must be 0. */ bad |= buf[0]; if( mode == MBEDTLS_RSA_PRIVATE ) { /* Decode EME-PKCS1-v1_5 padding: 0x00 || 0x02 || PS || 0x00 * where PS must be at least 8 nonzero bytes. */ bad |= buf[1] ^ MBEDTLS_RSA_CRYPT; /* Read the whole buffer. Set pad_done to nonzero if we find * the 0x00 byte and remember the padding length in pad_count. */ for( i = 2; i < ilen; i++ ) { pad_done |= ((buf[i] | (unsigned char)-buf[i]) >> 7) ^ 1; pad_count += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1; } } else { /* Decode EMSA-PKCS1-v1_5 padding: 0x00 || 0x01 || PS || 0x00 * where PS must be at least 8 bytes with the value 0xFF. */ bad |= buf[1] ^ MBEDTLS_RSA_SIGN; /* Read the whole buffer. Set pad_done to nonzero if we find * the 0x00 byte and remember the padding length in pad_count. * If there's a non-0xff byte in the padding, the padding is bad. */ for( i = 2; i < ilen; i++ ) { pad_done |= if_int( buf[i], 0, 1 ); pad_count += if_int( pad_done, 0, 1 ); bad |= if_int( pad_done, 0, buf[i] ^ 0xFF ); } } /* If pad_done is still zero, there's no data, only unfinished padding. */ bad |= if_int( pad_done, 0, 1 ); /* There must be at least 8 bytes of padding. */ bad |= size_greater_than( 8, pad_count ); /* If the padding is valid, set plaintext_size to the number of * remaining bytes after stripping the padding. If the padding * is invalid, avoid leaking this fact through the size of the * output: use the maximum message size that fits in the output * buffer. Do it without branches to avoid leaking the padding * validity through timing. RSA keys are small enough that all the * size_t values involved fit in unsigned int. */ plaintext_size = if_int( bad, (unsigned) plaintext_max_size, (unsigned) ( ilen - pad_count - 3 ) ); /* Set output_too_large to 0 if the plaintext fits in the output * buffer and to 1 otherwise. */ output_too_large = size_greater_than( plaintext_size, plaintext_max_size ); /* Set ret without branches to avoid timing attacks. Return: * - INVALID_PADDING if the padding is bad (bad != 0). * - OUTPUT_TOO_LARGE if the padding is good but the decrypted * plaintext does not fit in the output buffer. * - 0 if the padding is correct. */ ret = - (int) if_int( bad, - MBEDTLS_ERR_RSA_INVALID_PADDING, if_int( output_too_large, - MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE, 0 ) ); /* If the padding is bad or the plaintext is too large, zero the * data that we're about to copy to the output buffer. * We need to copy the same amount of data * from the same buffer whether the padding is good or not to * avoid leaking the padding validity through overall timing or * through memory or cache access patterns. */ bad = all_or_nothing_int( bad | output_too_large ); for( i = 11; i < ilen; i++ ) buf[i] &= ~bad; /* If the plaintext is too large, truncate it to the buffer size. * Copy anyway to avoid revealing the length through timing, because * revealing the length is as bad as revealing the padding validity * for a Bleichenbacher attack. */ plaintext_size = if_int( output_too_large, (unsigned) plaintext_max_size, (unsigned) plaintext_size ); /* Move the plaintext to the leftmost position where it can start in * the working buffer, i.e. make it start plaintext_max_size from * the end of the buffer. Do this with a memory access trace that * does not depend on the plaintext size. After this move, the * starting location of the plaintext is no longer sensitive * information. */ mem_move_to_left( buf + ilen - plaintext_max_size, plaintext_max_size, plaintext_max_size - plaintext_size ); /* Finally copy the decrypted plaintext plus trailing zeros * into the output buffer. */ memcpy( output, buf + ilen - plaintext_max_size, plaintext_max_size ); /* Report the amount of data we copied to the output buffer. In case * of errors (bad padding or output too large), the value of *olen * when this function returns is not specified. Making it equivalent * to the good case limits the risks of leaking the padding validity. */ *olen = plaintext_size; cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Do an RSA operation, then remove the message padding */ int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output_max_len == 0 || output != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( olen != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsaes_pkcs1_v15_decrypt( ctx, f_rng, p_rng, mode, olen, input, output, output_max_len ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsaes_oaep_decrypt( ctx, f_rng, p_rng, mode, NULL, 0, olen, input, output, output_max_len ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function */ int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { size_t olen; unsigned char *p = sig; unsigned char salt[MBEDTLS_MD_MAX_SIZE]; size_t slen, min_slen, hlen, offset = 0; int ret; size_t msb; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); RSA_VALIDATE_RET( sig != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( f_rng == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); olen = ctx->len; if( md_alg != MBEDTLS_MD_NONE ) { /* Gather length of hash to sign */ md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); } md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hlen = mbedtls_md_get_size( md_info ); /* Calculate the largest possible salt length. Normally this is the hash * length, which is the maximum length the salt can have. If there is not * enough room, use the maximum salt length that fits. The constraint is * that the hash length plus the salt length plus 2 bytes must be at most * the key length. This complies with FIPS 186-4 §5.5 (e) and RFC 8017 * (PKCS#1 v2.2) §9.1.1 step 3. */ min_slen = hlen - 2; if( olen < hlen + min_slen + 2 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); else if( olen >= hlen + hlen + 2 ) slen = hlen; else slen = olen - hlen - 2; memset( sig, 0, olen ); /* Generate salt of length slen */ if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 ) return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); /* Note: EMSA-PSS encoding is over the length of N - 1 bits */ msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; p += olen - hlen - slen - 2; *p++ = 0x01; memcpy( p, salt, slen ); p += slen; mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) goto exit; /* Generate H = Hash( M' ) */ if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, p, 8 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, hash, hashlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, salt, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_finish( &md_ctx, p ) ) != 0 ) goto exit; /* Compensate for boundary condition when applying mask */ if( msb % 8 == 0 ) offset = 1; /* maskedDB: Apply dbMask to DB */ if( ( ret = mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx ) ) != 0 ) goto exit; msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; sig[0] &= 0xFF >> ( olen * 8 - msb ); p += hlen; *p++ = 0xBC; mbedtls_platform_zeroize( salt, sizeof( salt ) ); exit: mbedtls_md_free( &md_ctx ); if( ret != 0 ) return( ret ); return( ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, sig, sig ) : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig ) ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /* * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function */ /* Construct a PKCS v1.5 encoding of a hashed message * * This is used both for signature generation and verification. * * Parameters: * - md_alg: Identifies the hash algorithm used to generate the given hash; * MBEDTLS_MD_NONE if raw data is signed. * - hashlen: Length of hash in case hashlen is MBEDTLS_MD_NONE. * - hash: Buffer containing the hashed message or the raw data. * - dst_len: Length of the encoded message. * - dst: Buffer to hold the encoded message. * * Assumptions: * - hash has size hashlen if md_alg == MBEDTLS_MD_NONE. * - hash has size corresponding to md_alg if md_alg != MBEDTLS_MD_NONE. * - dst points to a buffer of size at least dst_len. * */ static int rsa_rsassa_pkcs1_v15_encode( mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, size_t dst_len, unsigned char *dst ) { size_t oid_size = 0; size_t nb_pad = dst_len; unsigned char *p = dst; const char *oid = NULL; /* Are we signing hashed or raw data? */ if( md_alg != MBEDTLS_MD_NONE ) { const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); /* Double-check that 8 + hashlen + oid_size can be used as a * 1-byte ASN.1 length encoding and that there's no overflow. */ if( 8 + hashlen + oid_size >= 0x80 || 10 + hashlen < hashlen || 10 + hashlen + oid_size < 10 + hashlen ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Static bounds check: * - Need 10 bytes for five tag-length pairs. * (Insist on 1-byte length encodings to protect against variants of * Bleichenbacher's forgery attack against lax PKCS#1v1.5 verification) * - Need hashlen bytes for hash * - Need oid_size bytes for hash alg OID. */ if( nb_pad < 10 + hashlen + oid_size ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad -= 10 + hashlen + oid_size; } else { if( nb_pad < hashlen ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad -= hashlen; } /* Need space for signature header and padding delimiter (3 bytes), * and 8 bytes for the minimal padding */ if( nb_pad < 3 + 8 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad -= 3; /* Now nb_pad is the amount of memory to be filled * with padding, and at least 8 bytes long. */ /* Write signature header and padding */ *p++ = 0; *p++ = MBEDTLS_RSA_SIGN; memset( p, 0xFF, nb_pad ); p += nb_pad; *p++ = 0; /* Are we signing raw data? */ if( md_alg == MBEDTLS_MD_NONE ) { memcpy( p, hash, hashlen ); return( 0 ); } /* Signing hashed data, add corresponding ASN.1 structure * * DigestInfo ::= SEQUENCE { * digestAlgorithm DigestAlgorithmIdentifier, * digest Digest } * DigestAlgorithmIdentifier ::= AlgorithmIdentifier * Digest ::= OCTET STRING * * Schematic: * TAG-SEQ + LEN [ TAG-SEQ + LEN [ TAG-OID + LEN [ OID ] * TAG-NULL + LEN [ NULL ] ] * TAG-OCTET + LEN [ HASH ] ] */ *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char)( 0x08 + oid_size + hashlen ); *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char)( 0x04 + oid_size ); *p++ = MBEDTLS_ASN1_OID; *p++ = (unsigned char) oid_size; memcpy( p, oid, oid_size ); p += oid_size; *p++ = MBEDTLS_ASN1_NULL; *p++ = 0x00; *p++ = MBEDTLS_ASN1_OCTET_STRING; *p++ = (unsigned char) hashlen; memcpy( p, hash, hashlen ); p += hashlen; /* Just a sanity-check, should be automatic * after the initial bounds check. */ if( p != dst + dst_len ) { mbedtls_platform_zeroize( dst, dst_len ); return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } return( 0 ); } /* * Do an RSA operation to sign the message digest */ int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { int ret; unsigned char *sig_try = NULL, *verif = NULL; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); RSA_VALIDATE_RET( sig != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Prepare PKCS1-v1.5 encoding (padding and hash identifier) */ if( ( ret = rsa_rsassa_pkcs1_v15_encode( md_alg, hashlen, hash, ctx->len, sig ) ) != 0 ) return( ret ); /* * Call respective RSA primitive */ if( mode == MBEDTLS_RSA_PUBLIC ) { /* Skip verification on a public key operation */ return( mbedtls_rsa_public( ctx, sig, sig ) ); } /* Private key operation * * In order to prevent Lenstra's attack, make the signature in a * temporary buffer and check it before returning it. */ sig_try = mbedtls_calloc( 1, ctx->len ); if( sig_try == NULL ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); verif = mbedtls_calloc( 1, ctx->len ); if( verif == NULL ) { mbedtls_free( sig_try ); return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); } MBEDTLS_MPI_CHK( mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig_try ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_public( ctx, sig_try, verif ) ); if( mbedtls_safer_memcmp( verif, sig, ctx->len ) != 0 ) { ret = MBEDTLS_ERR_RSA_PRIVATE_FAILED; goto cleanup; } memcpy( sig, sig_try, ctx->len ); cleanup: mbedtls_free( sig_try ); mbedtls_free( verif ); return( ret ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Do an RSA operation to sign the message digest */ int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); RSA_VALIDATE_RET( sig != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsassa_pkcs1_v15_sign( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsassa_pss_sign( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function */ int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, mbedtls_md_type_t mgf1_hash_id, int expected_salt_len, const unsigned char *sig ) { int ret; size_t siglen; unsigned char *p; unsigned char *hash_start; unsigned char result[MBEDTLS_MD_MAX_SIZE]; unsigned char zeros[8]; unsigned int hlen; size_t observed_salt_len, msb; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); siglen = ctx->len; if( siglen < 16 || siglen > sizeof( buf ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, sig, buf ) : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf ); if( ret != 0 ) return( ret ); p = buf; if( buf[siglen - 1] != 0xBC ) return( MBEDTLS_ERR_RSA_INVALID_PADDING ); if( md_alg != MBEDTLS_MD_NONE ) { /* Gather length of hash to sign */ md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); } md_info = mbedtls_md_info_from_type( mgf1_hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hlen = mbedtls_md_get_size( md_info ); memset( zeros, 0, 8 ); /* * Note: EMSA-PSS verification is over the length of N - 1 bits */ msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; if( buf[0] >> ( 8 - siglen * 8 + msb ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* Compensate for boundary condition when applying mask */ if( msb % 8 == 0 ) { p++; siglen -= 1; } if( siglen < hlen + 2 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hash_start = p + siglen - hlen - 1; mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) goto exit; ret = mgf_mask( p, siglen - hlen - 1, hash_start, hlen, &md_ctx ); if( ret != 0 ) goto exit; buf[0] &= 0xFF >> ( siglen * 8 - msb ); while( p < hash_start - 1 && *p == 0 ) p++; if( *p++ != 0x01 ) { ret = MBEDTLS_ERR_RSA_INVALID_PADDING; goto exit; } observed_salt_len = hash_start - p; if( expected_salt_len != MBEDTLS_RSA_SALT_LEN_ANY && observed_salt_len != (size_t) expected_salt_len ) { ret = MBEDTLS_ERR_RSA_INVALID_PADDING; goto exit; } /* * Generate H = Hash( M' ) */ ret = mbedtls_md_starts( &md_ctx ); if ( ret != 0 ) goto exit; ret = mbedtls_md_update( &md_ctx, zeros, 8 ); if ( ret != 0 ) goto exit; ret = mbedtls_md_update( &md_ctx, hash, hashlen ); if ( ret != 0 ) goto exit; ret = mbedtls_md_update( &md_ctx, p, observed_salt_len ); if ( ret != 0 ) goto exit; ret = mbedtls_md_finish( &md_ctx, result ); if ( ret != 0 ) goto exit; if( memcmp( hash_start, result, hlen ) != 0 ) { ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; goto exit; } exit: mbedtls_md_free( &md_ctx ); return( ret ); } /* * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function */ int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ) { mbedtls_md_type_t mgf1_hash_id; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); mgf1_hash_id = ( ctx->hash_id != MBEDTLS_MD_NONE ) ? (mbedtls_md_type_t) ctx->hash_id : md_alg; return( mbedtls_rsa_rsassa_pss_verify_ext( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY, sig ) ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /* * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function */ int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ) { int ret = 0; size_t sig_len; unsigned char *encoded = NULL, *encoded_expected = NULL; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); sig_len = ctx->len; if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Prepare expected PKCS1 v1.5 encoding of hash. */ if( ( encoded = mbedtls_calloc( 1, sig_len ) ) == NULL || ( encoded_expected = mbedtls_calloc( 1, sig_len ) ) == NULL ) { ret = MBEDTLS_ERR_MPI_ALLOC_FAILED; goto cleanup; } if( ( ret = rsa_rsassa_pkcs1_v15_encode( md_alg, hashlen, hash, sig_len, encoded_expected ) ) != 0 ) goto cleanup; /* * Apply RSA primitive to get what should be PKCS1 encoded hash. */ ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, sig, encoded ) : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, encoded ); if( ret != 0 ) goto cleanup; /* * Compare */ if( ( ret = mbedtls_safer_memcmp( encoded, encoded_expected, sig_len ) ) != 0 ) { ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; goto cleanup; } cleanup: if( encoded != NULL ) { mbedtls_platform_zeroize( encoded, sig_len ); mbedtls_free( encoded ); } if( encoded_expected != NULL ) { mbedtls_platform_zeroize( encoded_expected, sig_len ); mbedtls_free( encoded_expected ); } return( ret ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Do an RSA operation and check the message digest */ int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsassa_pkcs1_v15_verify( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsassa_pss_verify( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } /* * Copy the components of an RSA key */ int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ) { int ret; RSA_VALIDATE_RET( dst != NULL ); RSA_VALIDATE_RET( src != NULL ); dst->ver = src->ver; dst->len = src->len; MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->N, &src->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->E, &src->E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->D, &src->D ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->P, &src->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Q, &src->Q ) ); #if !defined(MBEDTLS_RSA_NO_CRT) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DP, &src->DP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DQ, &src->DQ ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->QP, &src->QP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RP, &src->RP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RQ, &src->RQ ) ); #endif MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RN, &src->RN ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vi, &src->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vf, &src->Vf ) ); dst->padding = src->padding; dst->hash_id = src->hash_id; cleanup: if( ret != 0 ) mbedtls_rsa_free( dst ); return( ret ); } /* * Free the components of an RSA key */ void mbedtls_rsa_free( mbedtls_rsa_context *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->RN ); mbedtls_mpi_free( &ctx->D ); mbedtls_mpi_free( &ctx->Q ); mbedtls_mpi_free( &ctx->P ); mbedtls_mpi_free( &ctx->E ); mbedtls_mpi_free( &ctx->N ); #if !defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_free( &ctx->RQ ); mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->QP ); mbedtls_mpi_free( &ctx->DQ ); mbedtls_mpi_free( &ctx->DP ); #endif /* MBEDTLS_RSA_NO_CRT */ #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif } #endif /* !MBEDTLS_RSA_ALT */ #if defined(MBEDTLS_SELF_TEST) #include "mbedtls/sha1.h" /* * Example RSA-1024 keypair, for test purposes */ #define KEY_LEN 128 #define RSA_N "9292758453063D803DD603D5E777D788" \ "8ED1D5BF35786190FA2F23EBC0848AEA" \ "DDA92CA6C3D80B32C4D109BE0F36D6AE" \ "7130B9CED7ACDF54CFC7555AC14EEBAB" \ "93A89813FBF3C4F8066D2D800F7C38A8" \ "1AE31942917403FF4946B0A83D3D3E05" \ "EE57C6F5F5606FB5D4BC6CD34EE0801A" \ "5E94BB77B07507233A0BC7BAC8F90F79" #define RSA_E "10001" #define RSA_D "24BF6185468786FDD303083D25E64EFC" \ "66CA472BC44D253102F8B4A9D3BFA750" \ "91386C0077937FE33FA3252D28855837" \ "AE1B484A8A9A45F7EE8C0C634F99E8CD" \ "DF79C5CE07EE72C7F123142198164234" \ "CABB724CF78B8173B9F880FC86322407" \ "AF1FEDFDDE2BEB674CA15F3E81A1521E" \ "071513A1E85B5DFA031F21ECAE91A34D" #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \ "2C01CAD19EA484A87EA4377637E75500" \ "FCB2005C5C7DD6EC4AC023CDA285D796" \ "C3D9E75E1EFC42488BB4F1D13AC30A57" #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \ "E211C2B9E5DB1ED0BF61D0D9899620F4" \ "910E4168387E3C30AA1E00C339A79508" \ "8452DD96A9A5EA5D9DCA68DA636032AF" #define PT_LEN 24 #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \ "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD" #if defined(MBEDTLS_PKCS1_V15) static int myrand( void *rng_state, unsigned char *output, size_t len ) { #if !defined(__OpenBSD__) size_t i; if( rng_state != NULL ) rng_state = NULL; for( i = 0; i < len; ++i ) output[i] = rand(); #else if( rng_state != NULL ) rng_state = NULL; arc4random_buf( output, len ); #endif /* !OpenBSD */ return( 0 ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Checkup routine */ int mbedtls_rsa_self_test( int verbose ) { int ret = 0; #if defined(MBEDTLS_PKCS1_V15) size_t len; mbedtls_rsa_context rsa; unsigned char rsa_plaintext[PT_LEN]; unsigned char rsa_decrypted[PT_LEN]; unsigned char rsa_ciphertext[KEY_LEN]; #if defined(MBEDTLS_SHA1_C) unsigned char sha1sum[20]; #endif mbedtls_mpi K; mbedtls_mpi_init( &K ); mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_N ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, &K, NULL, NULL, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_P ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, &K, NULL, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_Q ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, &K, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_D ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, NULL, &K, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_E ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, NULL, NULL, &K ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_complete( &rsa ) ); if( verbose != 0 ) mbedtls_printf( " RSA key validation: " ); if( mbedtls_rsa_check_pubkey( &rsa ) != 0 || mbedtls_rsa_check_privkey( &rsa ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n PKCS#1 encryption : " ); memcpy( rsa_plaintext, RSA_PT, PT_LEN ); if( mbedtls_rsa_pkcs1_encrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PUBLIC, PT_LEN, rsa_plaintext, rsa_ciphertext ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n PKCS#1 decryption : " ); if( mbedtls_rsa_pkcs1_decrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, &len, rsa_ciphertext, rsa_decrypted, sizeof(rsa_decrypted) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); #if defined(MBEDTLS_SHA1_C) if( verbose != 0 ) mbedtls_printf( " PKCS#1 data sign : " ); if( mbedtls_sha1_ret( rsa_plaintext, PT_LEN, sha1sum ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( mbedtls_rsa_pkcs1_sign( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA1, 0, sha1sum, rsa_ciphertext ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n PKCS#1 sig. verify: " ); if( mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 0, sha1sum, rsa_ciphertext ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); #endif /* MBEDTLS_SHA1_C */ if( verbose != 0 ) mbedtls_printf( "\n" ); cleanup: mbedtls_mpi_free( &K ); mbedtls_rsa_free( &rsa ); #else /* MBEDTLS_PKCS1_V15 */ ((void) verbose); #endif /* MBEDTLS_PKCS1_V15 */ return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_RSA_C */ fldigi-4.1.06/src/mbedtls/chacha20.c0000664000175000017500000004734013507401434013732 00000000000000/** * \file chacha20.c * * \brief ChaCha20 cipher. * * \author Daniel King * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CHACHA20_ALT) #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Parameter validation macros */ #define CHACHA20_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA ) #define CHACHA20_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define BYTES_TO_U32_LE( data, offset ) \ ( (uint32_t) data[offset] \ | (uint32_t) ( (uint32_t) data[( offset ) + 1] << 8 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 2] << 16 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 3] << 24 ) \ ) #define ROTL32( value, amount ) \ ( (uint32_t) ( value << amount ) | ( value >> ( 32 - amount ) ) ) #define CHACHA20_CTR_INDEX ( 12U ) #define CHACHA20_BLOCK_SIZE_BYTES ( 4U * 16U ) /** * \brief ChaCha20 quarter round operation. * * The quarter round is defined as follows (from RFC 7539): * 1. a += b; d ^= a; d <<<= 16; * 2. c += d; b ^= c; b <<<= 12; * 3. a += b; d ^= a; d <<<= 8; * 4. c += d; b ^= c; b <<<= 7; * * \param state ChaCha20 state to modify. * \param a The index of 'a' in the state. * \param b The index of 'b' in the state. * \param c The index of 'c' in the state. * \param d The index of 'd' in the state. */ static inline void chacha20_quarter_round( uint32_t state[16], size_t a, size_t b, size_t c, size_t d ) { /* a += b; d ^= a; d <<<= 16; */ state[a] += state[b]; state[d] ^= state[a]; state[d] = ROTL32( state[d], 16 ); /* c += d; b ^= c; b <<<= 12 */ state[c] += state[d]; state[b] ^= state[c]; state[b] = ROTL32( state[b], 12 ); /* a += b; d ^= a; d <<<= 8; */ state[a] += state[b]; state[d] ^= state[a]; state[d] = ROTL32( state[d], 8 ); /* c += d; b ^= c; b <<<= 7; */ state[c] += state[d]; state[b] ^= state[c]; state[b] = ROTL32( state[b], 7 ); } /** * \brief Perform the ChaCha20 inner block operation. * * This function performs two rounds: the column round and the * diagonal round. * * \param state The ChaCha20 state to update. */ static void chacha20_inner_block( uint32_t state[16] ) { chacha20_quarter_round( state, 0, 4, 8, 12 ); chacha20_quarter_round( state, 1, 5, 9, 13 ); chacha20_quarter_round( state, 2, 6, 10, 14 ); chacha20_quarter_round( state, 3, 7, 11, 15 ); chacha20_quarter_round( state, 0, 5, 10, 15 ); chacha20_quarter_round( state, 1, 6, 11, 12 ); chacha20_quarter_round( state, 2, 7, 8, 13 ); chacha20_quarter_round( state, 3, 4, 9, 14 ); } /** * \brief Generates a keystream block. * * \param initial_state The initial ChaCha20 state (key, nonce, counter). * \param keystream Generated keystream bytes are written to this buffer. */ static void chacha20_block( const uint32_t initial_state[16], unsigned char keystream[64] ) { uint32_t working_state[16]; size_t i; memcpy( working_state, initial_state, CHACHA20_BLOCK_SIZE_BYTES ); for( i = 0U; i < 10U; i++ ) chacha20_inner_block( working_state ); working_state[ 0] += initial_state[ 0]; working_state[ 1] += initial_state[ 1]; working_state[ 2] += initial_state[ 2]; working_state[ 3] += initial_state[ 3]; working_state[ 4] += initial_state[ 4]; working_state[ 5] += initial_state[ 5]; working_state[ 6] += initial_state[ 6]; working_state[ 7] += initial_state[ 7]; working_state[ 8] += initial_state[ 8]; working_state[ 9] += initial_state[ 9]; working_state[10] += initial_state[10]; working_state[11] += initial_state[11]; working_state[12] += initial_state[12]; working_state[13] += initial_state[13]; working_state[14] += initial_state[14]; working_state[15] += initial_state[15]; for( i = 0U; i < 16; i++ ) { size_t offset = i * 4U; keystream[offset ] = (unsigned char)( working_state[i] ); keystream[offset + 1U] = (unsigned char)( working_state[i] >> 8 ); keystream[offset + 2U] = (unsigned char)( working_state[i] >> 16 ); keystream[offset + 3U] = (unsigned char)( working_state[i] >> 24 ); } mbedtls_platform_zeroize( working_state, sizeof( working_state ) ); } void mbedtls_chacha20_init( mbedtls_chacha20_context *ctx ) { CHACHA20_VALIDATE( ctx != NULL ); mbedtls_platform_zeroize( ctx->state, sizeof( ctx->state ) ); mbedtls_platform_zeroize( ctx->keystream8, sizeof( ctx->keystream8 ) ); /* Initially, there's no keystream bytes available */ ctx->keystream_bytes_used = CHACHA20_BLOCK_SIZE_BYTES; } void mbedtls_chacha20_free( mbedtls_chacha20_context *ctx ) { if( ctx != NULL ) { mbedtls_platform_zeroize( ctx, sizeof( mbedtls_chacha20_context ) ); } } int mbedtls_chacha20_setkey( mbedtls_chacha20_context *ctx, const unsigned char key[32] ) { CHACHA20_VALIDATE_RET( ctx != NULL ); CHACHA20_VALIDATE_RET( key != NULL ); /* ChaCha20 constants - the string "expand 32-byte k" */ ctx->state[0] = 0x61707865; ctx->state[1] = 0x3320646e; ctx->state[2] = 0x79622d32; ctx->state[3] = 0x6b206574; /* Set key */ ctx->state[4] = BYTES_TO_U32_LE( key, 0 ); ctx->state[5] = BYTES_TO_U32_LE( key, 4 ); ctx->state[6] = BYTES_TO_U32_LE( key, 8 ); ctx->state[7] = BYTES_TO_U32_LE( key, 12 ); ctx->state[8] = BYTES_TO_U32_LE( key, 16 ); ctx->state[9] = BYTES_TO_U32_LE( key, 20 ); ctx->state[10] = BYTES_TO_U32_LE( key, 24 ); ctx->state[11] = BYTES_TO_U32_LE( key, 28 ); return( 0 ); } int mbedtls_chacha20_starts( mbedtls_chacha20_context* ctx, const unsigned char nonce[12], uint32_t counter ) { CHACHA20_VALIDATE_RET( ctx != NULL ); CHACHA20_VALIDATE_RET( nonce != NULL ); /* Counter */ ctx->state[12] = counter; /* Nonce */ ctx->state[13] = BYTES_TO_U32_LE( nonce, 0 ); ctx->state[14] = BYTES_TO_U32_LE( nonce, 4 ); ctx->state[15] = BYTES_TO_U32_LE( nonce, 8 ); mbedtls_platform_zeroize( ctx->keystream8, sizeof( ctx->keystream8 ) ); /* Initially, there's no keystream bytes available */ ctx->keystream_bytes_used = CHACHA20_BLOCK_SIZE_BYTES; return( 0 ); } int mbedtls_chacha20_update( mbedtls_chacha20_context *ctx, size_t size, const unsigned char *input, unsigned char *output ) { size_t offset = 0U; size_t i; CHACHA20_VALIDATE_RET( ctx != NULL ); CHACHA20_VALIDATE_RET( size == 0 || input != NULL ); CHACHA20_VALIDATE_RET( size == 0 || output != NULL ); /* Use leftover keystream bytes, if available */ while( size > 0U && ctx->keystream_bytes_used < CHACHA20_BLOCK_SIZE_BYTES ) { output[offset] = input[offset] ^ ctx->keystream8[ctx->keystream_bytes_used]; ctx->keystream_bytes_used++; offset++; size--; } /* Process full blocks */ while( size >= CHACHA20_BLOCK_SIZE_BYTES ) { /* Generate new keystream block and increment counter */ chacha20_block( ctx->state, ctx->keystream8 ); ctx->state[CHACHA20_CTR_INDEX]++; for( i = 0U; i < 64U; i += 8U ) { output[offset + i ] = input[offset + i ] ^ ctx->keystream8[i ]; output[offset + i+1] = input[offset + i+1] ^ ctx->keystream8[i+1]; output[offset + i+2] = input[offset + i+2] ^ ctx->keystream8[i+2]; output[offset + i+3] = input[offset + i+3] ^ ctx->keystream8[i+3]; output[offset + i+4] = input[offset + i+4] ^ ctx->keystream8[i+4]; output[offset + i+5] = input[offset + i+5] ^ ctx->keystream8[i+5]; output[offset + i+6] = input[offset + i+6] ^ ctx->keystream8[i+6]; output[offset + i+7] = input[offset + i+7] ^ ctx->keystream8[i+7]; } offset += CHACHA20_BLOCK_SIZE_BYTES; size -= CHACHA20_BLOCK_SIZE_BYTES; } /* Last (partial) block */ if( size > 0U ) { /* Generate new keystream block and increment counter */ chacha20_block( ctx->state, ctx->keystream8 ); ctx->state[CHACHA20_CTR_INDEX]++; for( i = 0U; i < size; i++) { output[offset + i] = input[offset + i] ^ ctx->keystream8[i]; } ctx->keystream_bytes_used = size; } return( 0 ); } int mbedtls_chacha20_crypt( const unsigned char key[32], const unsigned char nonce[12], uint32_t counter, size_t data_len, const unsigned char* input, unsigned char* output ) { mbedtls_chacha20_context ctx; int ret; CHACHA20_VALIDATE_RET( key != NULL ); CHACHA20_VALIDATE_RET( nonce != NULL ); CHACHA20_VALIDATE_RET( data_len == 0 || input != NULL ); CHACHA20_VALIDATE_RET( data_len == 0 || output != NULL ); mbedtls_chacha20_init( &ctx ); ret = mbedtls_chacha20_setkey( &ctx, key ); if( ret != 0 ) goto cleanup; ret = mbedtls_chacha20_starts( &ctx, nonce, counter ); if( ret != 0 ) goto cleanup; ret = mbedtls_chacha20_update( &ctx, data_len, input, output ); cleanup: mbedtls_chacha20_free( &ctx ); return( ret ); } #endif /* !MBEDTLS_CHACHA20_ALT */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char test_keys[2][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }; static const unsigned char test_nonces[2][12] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } }; static const uint32_t test_counters[2] = { 0U, 1U }; static const unsigned char test_input[2][375] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x41, 0x6e, 0x79, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x52, 0x46, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x20, 0x53, 0x75, 0x63, 0x68, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f } }; static const unsigned char test_output[2][375] = { { 0x76, 0xb8, 0xe0, 0xad, 0xa0, 0xf1, 0x3d, 0x90, 0x40, 0x5d, 0x6a, 0xe5, 0x53, 0x86, 0xbd, 0x28, 0xbd, 0xd2, 0x19, 0xb8, 0xa0, 0x8d, 0xed, 0x1a, 0xa8, 0x36, 0xef, 0xcc, 0x8b, 0x77, 0x0d, 0xc7, 0xda, 0x41, 0x59, 0x7c, 0x51, 0x57, 0x48, 0x8d, 0x77, 0x24, 0xe0, 0x3f, 0xb8, 0xd8, 0x4a, 0x37, 0x6a, 0x43, 0xb8, 0xf4, 0x15, 0x18, 0xa1, 0x1c, 0xc3, 0x87, 0xb6, 0x69, 0xb2, 0xee, 0x65, 0x86 }, { 0xa3, 0xfb, 0xf0, 0x7d, 0xf3, 0xfa, 0x2f, 0xde, 0x4f, 0x37, 0x6c, 0xa2, 0x3e, 0x82, 0x73, 0x70, 0x41, 0x60, 0x5d, 0x9f, 0x4f, 0x4f, 0x57, 0xbd, 0x8c, 0xff, 0x2c, 0x1d, 0x4b, 0x79, 0x55, 0xec, 0x2a, 0x97, 0x94, 0x8b, 0xd3, 0x72, 0x29, 0x15, 0xc8, 0xf3, 0xd3, 0x37, 0xf7, 0xd3, 0x70, 0x05, 0x0e, 0x9e, 0x96, 0xd6, 0x47, 0xb7, 0xc3, 0x9f, 0x56, 0xe0, 0x31, 0xca, 0x5e, 0xb6, 0x25, 0x0d, 0x40, 0x42, 0xe0, 0x27, 0x85, 0xec, 0xec, 0xfa, 0x4b, 0x4b, 0xb5, 0xe8, 0xea, 0xd0, 0x44, 0x0e, 0x20, 0xb6, 0xe8, 0xdb, 0x09, 0xd8, 0x81, 0xa7, 0xc6, 0x13, 0x2f, 0x42, 0x0e, 0x52, 0x79, 0x50, 0x42, 0xbd, 0xfa, 0x77, 0x73, 0xd8, 0xa9, 0x05, 0x14, 0x47, 0xb3, 0x29, 0x1c, 0xe1, 0x41, 0x1c, 0x68, 0x04, 0x65, 0x55, 0x2a, 0xa6, 0xc4, 0x05, 0xb7, 0x76, 0x4d, 0x5e, 0x87, 0xbe, 0xa8, 0x5a, 0xd0, 0x0f, 0x84, 0x49, 0xed, 0x8f, 0x72, 0xd0, 0xd6, 0x62, 0xab, 0x05, 0x26, 0x91, 0xca, 0x66, 0x42, 0x4b, 0xc8, 0x6d, 0x2d, 0xf8, 0x0e, 0xa4, 0x1f, 0x43, 0xab, 0xf9, 0x37, 0xd3, 0x25, 0x9d, 0xc4, 0xb2, 0xd0, 0xdf, 0xb4, 0x8a, 0x6c, 0x91, 0x39, 0xdd, 0xd7, 0xf7, 0x69, 0x66, 0xe9, 0x28, 0xe6, 0x35, 0x55, 0x3b, 0xa7, 0x6c, 0x5c, 0x87, 0x9d, 0x7b, 0x35, 0xd4, 0x9e, 0xb2, 0xe6, 0x2b, 0x08, 0x71, 0xcd, 0xac, 0x63, 0x89, 0x39, 0xe2, 0x5e, 0x8a, 0x1e, 0x0e, 0xf9, 0xd5, 0x28, 0x0f, 0xa8, 0xca, 0x32, 0x8b, 0x35, 0x1c, 0x3c, 0x76, 0x59, 0x89, 0xcb, 0xcf, 0x3d, 0xaa, 0x8b, 0x6c, 0xcc, 0x3a, 0xaf, 0x9f, 0x39, 0x79, 0xc9, 0x2b, 0x37, 0x20, 0xfc, 0x88, 0xdc, 0x95, 0xed, 0x84, 0xa1, 0xbe, 0x05, 0x9c, 0x64, 0x99, 0xb9, 0xfd, 0xa2, 0x36, 0xe7, 0xe8, 0x18, 0xb0, 0x4b, 0x0b, 0xc3, 0x9c, 0x1e, 0x87, 0x6b, 0x19, 0x3b, 0xfe, 0x55, 0x69, 0x75, 0x3f, 0x88, 0x12, 0x8c, 0xc0, 0x8a, 0xaa, 0x9b, 0x63, 0xd1, 0xa1, 0x6f, 0x80, 0xef, 0x25, 0x54, 0xd7, 0x18, 0x9c, 0x41, 0x1f, 0x58, 0x69, 0xca, 0x52, 0xc5, 0xb8, 0x3f, 0xa3, 0x6f, 0xf2, 0x16, 0xb9, 0xc1, 0xd3, 0x00, 0x62, 0xbe, 0xbc, 0xfd, 0x2d, 0xc5, 0xbc, 0xe0, 0x91, 0x19, 0x34, 0xfd, 0xa7, 0x9a, 0x86, 0xf6, 0xe6, 0x98, 0xce, 0xd7, 0x59, 0xc3, 0xff, 0x9b, 0x64, 0x77, 0x33, 0x8f, 0x3d, 0xa4, 0xf9, 0xcd, 0x85, 0x14, 0xea, 0x99, 0x82, 0xcc, 0xaf, 0xb3, 0x41, 0xb2, 0x38, 0x4d, 0xd9, 0x02, 0xf3, 0xd1, 0xab, 0x7a, 0xc6, 0x1d, 0xd2, 0x9c, 0x6f, 0x21, 0xba, 0x5b, 0x86, 0x2f, 0x37, 0x30, 0xe3, 0x7c, 0xfd, 0xc4, 0xfd, 0x80, 0x6c, 0x22, 0xf2, 0x21 } }; static const size_t test_lengths[2] = { 64U, 375U }; #define ASSERT( cond, args ) \ do \ { \ if( ! ( cond ) ) \ { \ if( verbose != 0 ) \ mbedtls_printf args; \ \ return( -1 ); \ } \ } \ while( 0 ) int mbedtls_chacha20_self_test( int verbose ) { unsigned char output[381]; unsigned i; int ret; for( i = 0U; i < 2U; i++ ) { if( verbose != 0 ) mbedtls_printf( " ChaCha20 test %u ", i ); ret = mbedtls_chacha20_crypt( test_keys[i], test_nonces[i], test_counters[i], test_lengths[i], test_input[i], output ); ASSERT( 0 == ret, ( "error code: %i\n", ret ) ); ASSERT( 0 == memcmp( output, test_output[i], test_lengths[i] ), ( "failed (output)\n" ) ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* !MBEDTLS_CHACHA20_C */ fldigi-4.1.06/src/mbedtls/aria.c0000664000175000017500000011431313507401434013270 00000000000000/* * ARIA implementation * * Copyright (C) 2006-2017, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * This implementation is based on the following standards: * [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf * [2] https://tools.ietf.org/html/rfc5794 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ARIA_C) #include "mbedtls/aria.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_ARIA_ALT) #include "mbedtls/platform_util.h" #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Parameter validation macros */ #define ARIA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ) #define ARIA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE( n, b, i ) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE( n, b, i ) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif /* * modify byte order: ( A B C D ) -> ( B A D C ), i.e. swap pairs of bytes * * This is submatrix P1 in [1] Appendix B.1 * * Common compilers fail to translate this to minimal number of instructions, * so let's provide asm versions for common platforms with C fallback. */ #if defined(MBEDTLS_HAVE_ASM) #if defined(__arm__) /* rev16 available from v6 up */ /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ #if defined(__GNUC__) && \ ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \ __ARM_ARCH >= 6 static inline uint32_t aria_p1( uint32_t x ) { uint32_t r; __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) ); return( r ); } #define ARIA_P1 aria_p1 #elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \ ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 ) static inline uint32_t aria_p1( uint32_t x ) { uint32_t r; __asm( "rev16 r, x" ); return( r ); } #define ARIA_P1 aria_p1 #endif #endif /* arm */ #if defined(__GNUC__) && \ defined(__i386__) || defined(__amd64__) || defined( __x86_64__) /* I couldn't find an Intel equivalent of rev16, so two instructions */ #define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) ) #endif /* x86 gnuc */ #endif /* MBEDTLS_HAVE_ASM && GNUC */ #if !defined(ARIA_P1) #define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8)) #endif /* * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits * * This is submatrix P2 in [1] Appendix B.1 * * Common compilers will translate this to a single instruction. */ #define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16)) /* * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness * * This is submatrix P3 in [1] Appendix B.1 * * Some compilers fail to translate this to a single instruction, * so let's provide asm versions for common platforms with C fallback. */ #if defined(MBEDTLS_HAVE_ASM) #if defined(__arm__) /* rev available from v6 up */ /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ #if defined(__GNUC__) && \ ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \ __ARM_ARCH >= 6 static inline uint32_t aria_p3( uint32_t x ) { uint32_t r; __asm( "rev %0, %1" : "=l" (r) : "l" (x) ); return( r ); } #define ARIA_P3 aria_p3 #elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \ ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 ) static inline uint32_t aria_p3( uint32_t x ) { uint32_t r; __asm( "rev r, x" ); return( r ); } #define ARIA_P3 aria_p3 #endif #endif /* arm */ #if defined(__GNUC__) && \ defined(__i386__) || defined(__amd64__) || defined( __x86_64__) static inline uint32_t aria_p3( uint32_t x ) { __asm( "bswap %0" : "=r" (x) : "0" (x) ); return( x ); } #define ARIA_P3 aria_p3 #endif /* x86 gnuc */ #endif /* MBEDTLS_HAVE_ASM && GNUC */ #if !defined(ARIA_P3) #define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) ) #endif /* * ARIA Affine Transform * (a, b, c, d) = state in/out * * If we denote the first byte of input by 0, ..., the last byte by f, * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef. * * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple * rearrangements on adjacent pairs, output is: * * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef * * Note: another presentation of the A transform can be found as the first * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4. * The implementation below uses only P1 and P2 as they are sufficient. */ static inline void aria_a( uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d ) { uint32_t ta, tb, tc; ta = *b; // 4567 *b = *a; // 0123 *a = ARIA_P2( ta ); // 6745 tb = ARIA_P2( *d ); // efcd *d = ARIA_P1( *c ); // 98ba *c = ARIA_P1( tb ); // fedc ta ^= *d; // 4567+98ba tc = ARIA_P2( *b ); // 2301 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc tb ^= ARIA_P2( *d ); // ba98+efcd tc ^= ARIA_P1( *a ); // 2301+7654 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT tc = ARIA_P2( tc ); // 0123+5476 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT } /* * ARIA Substitution Layer SL1 / SL2 * (a, b, c, d) = state in/out * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below) * * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2 */ static inline void aria_sl( uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, const uint8_t sa[256], const uint8_t sb[256], const uint8_t sc[256], const uint8_t sd[256] ) { *a = ( (uint32_t) sa[ *a & 0xFF] ) ^ (((uint32_t) sb[(*a >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*a >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *a >> 24 ]) << 24); *b = ( (uint32_t) sa[ *b & 0xFF] ) ^ (((uint32_t) sb[(*b >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*b >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *b >> 24 ]) << 24); *c = ( (uint32_t) sa[ *c & 0xFF] ) ^ (((uint32_t) sb[(*c >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*c >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *c >> 24 ]) << 24); *d = ( (uint32_t) sa[ *d & 0xFF] ) ^ (((uint32_t) sb[(*d >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*d >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *d >> 24 ]) << 24); } /* * S-Boxes */ static const uint8_t aria_sb1[256] = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; static const uint8_t aria_sb2[256] = { 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46, 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B, 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B, 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB, 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA, 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91, 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38, 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53, 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74, 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26, 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD, 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC, 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E, 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A, 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5, 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8, 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24, 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F, 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33, 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D, 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A, 0xAF, 0xBA, 0xB5, 0x81 }; static const uint8_t aria_is1[256] = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; static const uint8_t aria_is2[256] = { 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1, 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3, 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89, 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D, 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98, 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58, 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F, 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE, 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23, 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19, 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55, 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A, 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE, 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0, 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6, 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5, 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13, 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73, 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94, 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3, 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33, 0x03, 0xA2, 0xAC, 0x60 }; /* * Helper for key schedule: r = FO( p, k ) ^ x */ static void aria_fo_xor( uint32_t r[4], const uint32_t p[4], const uint32_t k[4], const uint32_t x[4] ) { uint32_t a, b, c, d; a = p[0] ^ k[0]; b = p[1] ^ k[1]; c = p[2] ^ k[2]; d = p[3] ^ k[3]; aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 ); aria_a( &a, &b, &c, &d ); r[0] = a ^ x[0]; r[1] = b ^ x[1]; r[2] = c ^ x[2]; r[3] = d ^ x[3]; } /* * Helper for key schedule: r = FE( p, k ) ^ x */ static void aria_fe_xor( uint32_t r[4], const uint32_t p[4], const uint32_t k[4], const uint32_t x[4] ) { uint32_t a, b, c, d; a = p[0] ^ k[0]; b = p[1] ^ k[1]; c = p[2] ^ k[2]; d = p[3] ^ k[3]; aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 ); aria_a( &a, &b, &c, &d ); r[0] = a ^ x[0]; r[1] = b ^ x[1]; r[2] = c ^ x[2]; r[3] = d ^ x[3]; } /* * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup. * * We chose to store bytes into 32-bit words in little-endian format (see * GET/PUT_UINT32_LE) so we need to reverse bytes here. */ static void aria_rot128( uint32_t r[4], const uint32_t a[4], const uint32_t b[4], uint8_t n ) { uint8_t i, j; uint32_t t, u; const uint8_t n1 = n % 32; // bit offset const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset j = ( n / 32 ) % 4; // initial word offset t = ARIA_P3( b[j] ); // big endian for( i = 0; i < 4; i++ ) { j = ( j + 1 ) % 4; // get next word, big endian u = ARIA_P3( b[j] ); t <<= n1; // rotate t |= u >> n2; t = ARIA_P3( t ); // back to little endian r[i] = a[i] ^ t; // store t = u; // move to next word } } /* * Set encryption key */ int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ) { /* round constant masks */ const uint32_t rc[3][4] = { { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA }, { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF }, { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 } }; int i; uint32_t w[4][4], *w2; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( key != NULL ); if( keybits != 128 && keybits != 192 && keybits != 256 ) return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ); /* Copy key to W0 (and potential remainder to W1) */ GET_UINT32_LE( w[0][0], key, 0 ); GET_UINT32_LE( w[0][1], key, 4 ); GET_UINT32_LE( w[0][2], key, 8 ); GET_UINT32_LE( w[0][3], key, 12 ); memset( w[1], 0, 16 ); if( keybits >= 192 ) { GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key GET_UINT32_LE( w[1][1], key, 20 ); } if( keybits == 256 ) { GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key GET_UINT32_LE( w[1][3], key, 28 ); } i = ( keybits - 128 ) >> 6; // index: 0, 1, 2 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16 aria_fo_xor( w[1], w[0], rc[i], w[1] ); // W1 = FO(W0, CK1) ^ KR i = i < 2 ? i + 1 : 0; aria_fe_xor( w[2], w[1], rc[i], w[0] ); // W2 = FE(W1, CK2) ^ W0 i = i < 2 ? i + 1 : 0; aria_fo_xor( w[3], w[2], rc[i], w[1] ); // W3 = FO(W2, CK3) ^ W1 for( i = 0; i < 4; i++ ) // create round keys { w2 = w[(i + 1) & 3]; aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 ); aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 ); aria_rot128( ctx->rk[i + 8], w[i], w2, 61 ); aria_rot128( ctx->rk[i + 12], w[i], w2, 31 ); } aria_rot128( ctx->rk[16], w[0], w[1], 19 ); /* w holds enough info to reconstruct the round keys */ mbedtls_platform_zeroize( w, sizeof( w ) ); return( 0 ); } /* * Set decryption key */ int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ) { int i, j, k, ret; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( key != NULL ); ret = mbedtls_aria_setkey_enc( ctx, key, keybits ); if( ret != 0 ) return( ret ); /* flip the order of round keys */ for( i = 0, j = ctx->nr; i < j; i++, j-- ) { for( k = 0; k < 4; k++ ) { uint32_t t = ctx->rk[i][k]; ctx->rk[i][k] = ctx->rk[j][k]; ctx->rk[j][k] = t; } } /* apply affine transform to middle keys */ for( i = 1; i < ctx->nr; i++ ) { aria_a( &ctx->rk[i][0], &ctx->rk[i][1], &ctx->rk[i][2], &ctx->rk[i][3] ); } return( 0 ); } /* * Encrypt a block */ int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx, const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE], unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] ) { int i; uint32_t a, b, c, d; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( input != NULL ); ARIA_VALIDATE_RET( output != NULL ); GET_UINT32_LE( a, input, 0 ); GET_UINT32_LE( b, input, 4 ); GET_UINT32_LE( c, input, 8 ); GET_UINT32_LE( d, input, 12 ); i = 0; while( 1 ) { a ^= ctx->rk[i][0]; b ^= ctx->rk[i][1]; c ^= ctx->rk[i][2]; d ^= ctx->rk[i][3]; i++; aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 ); aria_a( &a, &b, &c, &d ); a ^= ctx->rk[i][0]; b ^= ctx->rk[i][1]; c ^= ctx->rk[i][2]; d ^= ctx->rk[i][3]; i++; aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 ); if( i >= ctx->nr ) break; aria_a( &a, &b, &c, &d ); } /* final key mixing */ a ^= ctx->rk[i][0]; b ^= ctx->rk[i][1]; c ^= ctx->rk[i][2]; d ^= ctx->rk[i][3]; PUT_UINT32_LE( a, output, 0 ); PUT_UINT32_LE( b, output, 4 ); PUT_UINT32_LE( c, output, 8 ); PUT_UINT32_LE( d, output, 12 ); return( 0 ); } /* Initialize context */ void mbedtls_aria_init( mbedtls_aria_context *ctx ) { ARIA_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_aria_context ) ); } /* Clear context */ void mbedtls_aria_free( mbedtls_aria_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * ARIA-CBC buffer encryption/decryption */ int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE]; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT || mode == MBEDTLS_ARIA_DECRYPT ); ARIA_VALIDATE_RET( length == 0 || input != NULL ); ARIA_VALIDATE_RET( length == 0 || output != NULL ); ARIA_VALIDATE_RET( iv != NULL ); if( length % MBEDTLS_ARIA_BLOCKSIZE ) return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_ARIA_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE ); mbedtls_aria_crypt_ecb( ctx, input, output ); for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE ); input += MBEDTLS_ARIA_BLOCKSIZE; output += MBEDTLS_ARIA_BLOCKSIZE; length -= MBEDTLS_ARIA_BLOCKSIZE; } } else { while( length > 0 ) { for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_aria_crypt_ecb( ctx, output, output ); memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE ); input += MBEDTLS_ARIA_BLOCKSIZE; output += MBEDTLS_ARIA_BLOCKSIZE; length -= MBEDTLS_ARIA_BLOCKSIZE; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * ARIA-CFB128 buffer encryption/decryption */ int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { unsigned char c; size_t n; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT || mode == MBEDTLS_ARIA_DECRYPT ); ARIA_VALIDATE_RET( length == 0 || input != NULL ); ARIA_VALIDATE_RET( length == 0 || output != NULL ); ARIA_VALIDATE_RET( iv != NULL ); ARIA_VALIDATE_RET( iv_off != NULL ); n = *iv_off; /* An overly large value of n can lead to an unlimited * buffer overflow. Therefore, guard against this * outside of parameter validation. */ if( n >= MBEDTLS_ARIA_BLOCKSIZE ) return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ); if( mode == MBEDTLS_ARIA_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_aria_crypt_ecb( ctx, iv, iv ); c = *input++; *output++ = c ^ iv[n]; iv[n] = c; n = ( n + 1 ) & 0x0F; } } else { while( length-- ) { if( n == 0 ) mbedtls_aria_crypt_ecb( ctx, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) & 0x0F; } } *iv_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * ARIA-CTR buffer encryption/decryption */ int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE], unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( length == 0 || input != NULL ); ARIA_VALIDATE_RET( length == 0 || output != NULL ); ARIA_VALIDATE_RET( nonce_counter != NULL ); ARIA_VALIDATE_RET( stream_block != NULL ); ARIA_VALIDATE_RET( nc_off != NULL ); n = *nc_off; /* An overly large value of n can lead to an unlimited * buffer overflow. Therefore, guard against this * outside of parameter validation. */ if( n >= MBEDTLS_ARIA_BLOCKSIZE ) return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_aria_crypt_ecb( ctx, nonce_counter, stream_block ); for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) & 0x0F; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* !MBEDTLS_ARIA_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * Basic ARIA ECB test vectors from RFC 5794 */ static const uint8_t aria_test1_ecb_key[32] = // test key { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit }; static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes }; static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext { { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 }, { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 }, { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC } }; /* * Mode tests from "Test Vectors for ARIA" Version 1.0 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf */ #if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ defined(MBEDTLS_CIPHER_MODE_CTR)) static const uint8_t aria_test2_key[32] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit }; static const uint8_t aria_test2_pt[48] = { 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb, 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc, 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd, 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa, 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb, }; #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)) static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] = { 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV }; #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext { { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34, 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64, 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38, 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c, 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 }, { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f, 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1, 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5, 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92, 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e }, { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab, 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef, 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52, 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5, 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext { { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00, 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a, 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01, 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96, 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b }, { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c, 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94, 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59, 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86, 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b }, { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35, 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70, 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa, 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c, 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 } }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext { { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1, 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1, 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f, 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71, 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 }, { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce, 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde, 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79, 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce, 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf }, { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2, 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89, 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f, 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7, 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 } }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #define ARIA_SELF_TEST_IF_FAIL \ { \ if( verbose ) \ mbedtls_printf( "failed\n" ); \ return( 1 ); \ } else { \ if( verbose ) \ mbedtls_printf( "passed\n" ); \ } /* * Checkup routine */ int mbedtls_aria_self_test( int verbose ) { int i; uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE]; mbedtls_aria_context ctx; #if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR)) size_t j; #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) || \ defined(MBEDTLS_CIPHER_MODE_CFB) || \ defined(MBEDTLS_CIPHER_MODE_CTR)) uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE]; #endif /* * Test set 1 */ for( i = 0; i < 3; i++ ) { /* test ECB encryption */ if( verbose ) mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i ); mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk ); if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* test ECB decryption */ if( verbose ) mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i ); mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk ); if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); /* * Test set 2 */ #if defined(MBEDTLS_CIPHER_MODE_CBC) for( i = 0; i < 3; i++ ) { /* Test CBC encryption */ if( verbose ) mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0x55, sizeof( buf ) ); mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv, aria_test2_pt, buf ); if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* Test CBC decryption */ if( verbose ) mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0xAA, sizeof( buf ) ); mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv, aria_test2_cbc_ct[i], buf ); if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) for( i = 0; i < 3; i++ ) { /* Test CFB encryption */ if( verbose ) mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0x55, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv, aria_test2_pt, buf ); if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* Test CFB decryption */ if( verbose ) mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0xAA, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j, iv, aria_test2_cfb_ct[i], buf ); if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) for( i = 0; i < 3; i++ ) { /* Test CTR encryption */ if( verbose ) mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0 memset( buf, 0x55, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk, aria_test2_pt, buf ); if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* Test CTR decryption */ if( verbose ) mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0 memset( buf, 0xAA, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk, aria_test2_ctr_ct[i], buf ); if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ARIA_C */ fldigi-4.1.06/src/irrxml/0000775000175000017500000000000013515625027012155 500000000000000fldigi-4.1.06/src/irrxml/irrXML.cpp0000644000175000017500000001005113472115774013756 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "irrXML.h" #include "irrString.h" #include "irrArray.h" #include "fast_atof.h" #include "CXMLReaderImpl.h" namespace irr { namespace io { //! Implementation of the file read callback for ordinary files class CFileReadCallBack : public IFileReadCallBack { public: //! construct from filename CFileReadCallBack(const char* filename) : File(0), Size(0), Close(true) { // open file File = fopen(filename, "rb"); if (File) getFileSize(); } //! construct from FILE pointer CFileReadCallBack(FILE* file) : File(file), Size(0), Close(false) { if (File) getFileSize(); } //! destructor virtual ~CFileReadCallBack() { if (Close && File) fclose(File); } //! Reads an amount of bytes from the file. virtual int read(void* buffer, int sizeToRead) { if (!File) return 0; return (int)fread(buffer, 1, sizeToRead, File); } //! Returns size of file in bytes virtual int getSize() { return Size; } private: //! retrieves the file size of the open file void getFileSize() { fseek(File, 0, SEEK_END); Size = ftell(File); fseek(File, 0, SEEK_SET); } FILE* File; int Size; bool Close; }; // end class CFileReadCallBack // FACTORY FUNCTIONS: //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } } // end namespace io } // end namespace irr fldigi-4.1.06/src/irrxml/CXMLReaderImpl.h0000644000175000017500000004331613472115774014770 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __ICXML_READER_IMPL_H_INCLUDED__ #define __ICXML_READER_IMPL_H_INCLUDED__ #include "irrXML.h" #include "irrString.h" #include "irrArray.h" #include "fast_atof.h" #ifdef _DEBUG #ifndef __WOE32__ #define IRR_DEBUGPRINT(x) printf((x)); #endif #else // _DEBUG #define IRR_DEBUGPRINT(x) #endif // _DEBUG namespace irr { namespace io { //! implementation of the IrrXMLReader template class CXMLReaderImpl : public IIrrXMLReader { public: //! Constructor CXMLReaderImpl(IFileReadCallBack* callback, bool deleteCallBack = true) : TextData(0), P(0), TextBegin(0), TextSize(0), CurrentNodeType(EXN_NONE), SourceFormat(ETF_ASCII), TargetFormat(ETF_ASCII) { if (!callback) return; storeTargetFormat(); // read whole xml file readFile(callback); // clean up if (deleteCallBack) delete callback; // create list with special characters createSpecialCharacterList(); // set pointer to text begin P = TextBegin; } //! Destructor virtual ~CXMLReaderImpl() { delete [] TextData; } //! Reads forward to the next xml node. //! \return Returns false, if there was no further node. virtual bool read() { // if not end reached, parse the node if (P && (unsigned int)(P - TextBegin) < TextSize - 1 && *P != 0) { parseCurrentNode(); return true; } _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; return false; } //! Returns the type of the current XML node. virtual EXML_NODE getNodeType() const { return CurrentNodeType; } //! Returns attribute count of the current XML node. virtual int getAttributeCount() const { return Attributes.size(); } //! Returns name of an attribute. virtual const char_type* getAttributeName(int idx) const { if (idx < 0 || idx >= (int)Attributes.size()) return 0; return Attributes[idx].Name.c_str(); } //! Returns the value of an attribute. virtual const char_type* getAttributeValue(int idx) const { if (idx < 0 || idx >= (int)Attributes.size()) return 0; return Attributes[idx].Value.c_str(); } //! Returns the value of an attribute. virtual const char_type* getAttributeValue(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return 0; return attr->Value.c_str(); } //! Returns the value of an attribute virtual const char_type* getAttributeValueSafe(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return EmptyString.c_str(); return attr->Value.c_str(); } //! Returns the value of an attribute as integer. int getAttributeValueAsInt(const char_type* name) const { return (int)getAttributeValueAsFloat(name); } //! Returns the value of an attribute as integer. int getAttributeValueAsInt(int idx) const { return (int)getAttributeValueAsFloat(idx); } //! Returns the value of an attribute as float. float getAttributeValueAsFloat(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return 0; core::stringc c = attr->Value.c_str(); return core::fast_atof(c.c_str()); } //! Returns the value of an attribute as float. float getAttributeValueAsFloat(int idx) const { const char_type* attrvalue = getAttributeValue(idx); if (!attrvalue) return 0; core::stringc c = attrvalue; return core::fast_atof(c.c_str()); } //! Returns the name of the current node. virtual const char_type* getNodeName() const { return NodeName.c_str(); } //! Returns data of the current node. virtual const char_type* getNodeData() const { return NodeName.c_str(); } //! Returns if an element is an empty element, like virtual bool isEmptyElement() const { return IsEmptyElement; } //! Returns format of the source xml file. virtual ETEXT_FORMAT getSourceFormat() const { return SourceFormat; } //! Returns format of the strings returned by the parser. virtual ETEXT_FORMAT getParserFormat() const { return TargetFormat; } private: // Reads the current xml node void parseCurrentNode() { char_type* start = P; // more forward until '<' found while(*P != L'<' && *P) ++P; if (!*P) return; if (P - start > 0) { // we found some text, store it if (setText(start, P)) return; } ++P; // based on current token, parse and report next element switch(*P) { case L'/': parseClosingXMLElement(); break; case L'?': ignoreDefinition(); break; case L'!': if (!parseCDATA()) parseComment(); break; default: parseOpeningXMLElement(); break; } } //! sets the state that text was found. Returns true if set should be set bool setText(char_type* start, char_type* end) { // check if text is more than 2 characters, and if not, check if there is // only white space, so that this text won't be reported /* if (end - start < 3) { char_type* p = start; for(; p != end; ++p) if (!isWhiteSpace(*p)) break; if (p == end) return false; } */ // set current text to the parsed text, and replace xml special characters core::string s(start, (int)(end - start)); NodeName = replaceSpecialCharacters(s); // current XML node type is text CurrentNodeType = EXN_TEXT; return true; } //! ignores an xml definition like void ignoreDefinition() { CurrentNodeType = EXN_UNKNOWN; // move until end marked with '>' reached while(*P != L'>') ++P; ++P; } //! parses a comment void parseComment() { CurrentNodeType = EXN_COMMENT; P += 1; char_type *pCommentBegin = P; int count = 1; // move until end of comment reached while(count) { if (*P == L'>') --count; else if (*P == L'<') ++count; ++P; } P -= 3; NodeName = core::string(pCommentBegin+2, (int)(P - pCommentBegin-2)); P += 3; } //! parses an opening xml element and reads attributes void parseOpeningXMLElement() { CurrentNodeType = EXN_ELEMENT; IsEmptyElement = false; Attributes.clear(); // find name const char_type* startName = P; // find end of element while(*P != L'>' && !isWhiteSpace(*P)) ++P; const char_type* endName = P; // find Attributes while(*P != L'>') { if (isWhiteSpace(*P)) ++P; else { if (*P != L'/') { // we've got an attribute // read the attribute names const char_type* attributeNameBegin = P; while(!isWhiteSpace(*P) && *P != L'=') ++P; const char_type* attributeNameEnd = P; ++P; // read the attribute value // check for quotes and single quotes, thx to murphy while( (*P != L'\"') && (*P != L'\'') && *P) ++P; if (!*P) // malformatted xml file return; const char_type attributeQuoteChar = *P; ++P; const char_type* attributeValueBegin = P; while(*P != attributeQuoteChar && *P) ++P; if (!*P) // malformatted xml file return; const char_type* attributeValueEnd = P; ++P; SAttribute attr; attr.Name = core::string(attributeNameBegin, (int)(attributeNameEnd - attributeNameBegin)); core::string s(attributeValueBegin, (int)(attributeValueEnd - attributeValueBegin)); attr.Value = replaceSpecialCharacters(s); Attributes.push_back(attr); } else { // tag is closed directly ++P; IsEmptyElement = true; break; } } } // check if this tag is closing directly if (endName > startName && *(endName-1) == L'/') { // directly closing tag IsEmptyElement = true; endName--; } NodeName = core::string(startName, (int)(endName - startName)); ++P; } //! parses an closing xml tag void parseClosingXMLElement() { CurrentNodeType = EXN_ELEMENT_END; IsEmptyElement = false; Attributes.clear(); ++P; const char_type* pBeginClose = P; while(*P != L'>') ++P; NodeName = core::string(pBeginClose, (int)(P - pBeginClose)); ++P; } //! parses a possible CDATA section, returns false if begin was not a CDATA section bool parseCDATA() { if (*(P+1) != L'[') return false; CurrentNodeType = EXN_CDATA; // skip '' && (*(P-1) == L']') && (*(P-2) == L']')) { cDataEnd = P - 2; } ++P; } if ( cDataEnd ) NodeName = core::string(cDataBegin, (int)(cDataEnd - cDataBegin)); else NodeName = ""; return true; } // structure for storing attribute-name pairs struct SAttribute { core::string Name; core::string Value; }; // finds a current attribute by name, returns 0 if not found const SAttribute* getAttributeByName(const char_type* name) const { if (!name) return 0; core::string n = name; for (int i=0; i<(int)Attributes.size(); ++i) if (Attributes[i].Name == n) return &Attributes[i]; return 0; } // replaces xml special characters in a string and creates a new one core::string replaceSpecialCharacters( core::string& origstr) { int pos = origstr.findFirst(L'&'); int oldPos = 0; if (pos == -1) return origstr; core::string newstr; while(pos != -1 && pos < origstr.size()-2) { // check if it is one of the special characters int specialChar = -1; for (int i=0; i<(int)SpecialCharacters.size(); ++i) { const char_type* p = &origstr.c_str()[pos]+1; if (equalsn(&SpecialCharacters[i][1], p, SpecialCharacters[i].size()-1)) { specialChar = i; break; } } if (specialChar != -1) { newstr.append(origstr.subString(oldPos, pos - oldPos)); newstr.append(SpecialCharacters[specialChar][0]); pos += SpecialCharacters[specialChar].size(); } else { newstr.append(origstr.subString(oldPos, pos - oldPos + 1)); pos += 1; } // find next & oldPos = pos; pos = origstr.findNext(L'&', pos); } if (oldPos < origstr.size()) newstr.append(origstr.subString(oldPos, origstr.size()-oldPos)); return newstr; } //! reads the xml file and converts it into the wanted character format. bool readFile(IFileReadCallBack* callback) { int size = callback->getSize(); size += 4; // We need two terminating 0's at the end. // For ASCII we need 1 0's, for UTF-16 2, for UTF-32 4. char* data8 = new char[size]; if (!callback->read(data8, size-4)) { delete [] data8; return false; } // add zeros at end data8[size-1] = 0; data8[size-2] = 0; data8[size-3] = 0; data8[size-4] = 0; char16* data16 = reinterpret_cast(data8); char32* data32 = reinterpret_cast(data8); // now we need to convert the data to the desired target format // based on the byte order mark. const unsigned char UTF8[] = {0xEF, 0xBB, 0xBF}; // 0xEFBBBF; const int UTF16_BE = 0xFFFE; const int UTF16_LE = 0xFEFF; const int UTF32_BE = 0xFFFE0000; const int UTF32_LE = 0x0000FEFF; // check source for all utf versions and convert to target data format if (size >= 4 && data32[0] == (char32)UTF32_BE) { // UTF-32, big endian SourceFormat = ETF_UTF32_BE; convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header } else if (size >= 4 && data32[0] == (char32)UTF32_LE) { // UTF-32, little endian SourceFormat = ETF_UTF32_LE; convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header } else if (size >= 2 && data16[0] == UTF16_BE) { // UTF-16, big endian SourceFormat = ETF_UTF16_BE; convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header } else if (size >= 2 && data16[0] == UTF16_LE) { // UTF-16, little endian SourceFormat = ETF_UTF16_LE; convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header } else if (size >= 3 && data8[0] == UTF8[0] && data8[1] == UTF8[1] && data8[2] == UTF8[2]) { // UTF-8 SourceFormat = ETF_UTF8; convertTextData(data8+3, data8, size); // data8+3 because we need to skip the header } else { // ASCII SourceFormat = ETF_ASCII; convertTextData(data8, data8, size); } return true; } //! converts the text file into the desired format. //! \param source: begin of the text (without byte order mark) //! \param pointerToStore: pointer to text data block which can be //! stored or deleted based on the nesessary conversion. //! \param sizeWithoutHeader: Text size in characters without header template void convertTextData(src_char_type* source, char* pointerToStore, int sizeWithoutHeader) { // convert little to big endian if necessary if (sizeof(src_char_type) > 1 && isLittleEndian(TargetFormat) != isLittleEndian(SourceFormat)) convertToLittleEndian(source); // check if conversion is necessary: if (sizeof(src_char_type) == sizeof(char_type)) { // no need to convert TextBegin = (char_type*)source; TextData = (char_type*)pointerToStore; TextSize = sizeWithoutHeader; } else { // convert source into target data format. // TODO: implement a real conversion. This one just // copies bytes. This is a problem when there are // unicode symbols using more than one character. TextData = new char_type[sizeWithoutHeader]; for (int i=0; i void convertToLittleEndian(src_char_type* t) { if (sizeof(src_char_type) == 4) { // 32 bit while(*t) { *t = ((*t & 0xff000000) >> 24) | ((*t & 0x00ff0000) >> 8) | ((*t & 0x0000ff00) << 8) | ((*t & 0x000000ff) << 24); ++t; } } else { // 16 bit while(*t) { *t = (*t >> 8) | (*t << 8); ++t; } } } //! returns if a format is little endian inline bool isLittleEndian(ETEXT_FORMAT f) { return f == ETF_ASCII || f == ETF_UTF8 || f == ETF_UTF16_LE || f == ETF_UTF32_LE; } //! returns true if a character is whitespace inline bool isWhiteSpace(char_type c) { return (c==' ' || c=='\t' || c=='\n' || c=='\r'); } //! generates a list with xml special characters void createSpecialCharacterList() { // list of strings containing special symbols, // the first character is the special character, // the following is the symbol string without trailing &. SpecialCharacters.push_back("&"); SpecialCharacters.push_back("gt;"); SpecialCharacters.push_back("\"quot;"); SpecialCharacters.push_back("'apos;"); } //! compares the first n characters of the strings bool equalsn(const char_type* str1, const char_type* str2, int len) { int i; for(i=0; str1[i] && str2[i] && i < len; ++i) if (str1[i] != str2[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (str1[i] == 0 && str2[i] == 0); } //! stores the target text format void storeTargetFormat() { // get target format. We could have done this using template specialization, // but VisualStudio 6 don't like it and we want to support it. switch(sizeof(char_type)) { case 1: TargetFormat = ETF_UTF8; break; case 2: TargetFormat = ETF_UTF16_LE; break; case 4: TargetFormat = ETF_UTF32_LE; break; default: TargetFormat = ETF_ASCII; // should never happen. } } // instance variables: char_type* TextData; // data block of the text file char_type* P; // current point in text to parse char_type* TextBegin; // start of text to parse unsigned int TextSize; // size of text to parse in characters, not bytes EXML_NODE CurrentNodeType; // type of the currently parsed node ETEXT_FORMAT SourceFormat; // source format of the xml file ETEXT_FORMAT TargetFormat; // output format of this parser core::string NodeName; // name of the node currently in core::string EmptyString; // empty string to be returned by getSafe() methods bool IsEmptyElement; // is the currently parsed node empty? core::array< core::string > SpecialCharacters; // see createSpecialCharacterList() core::array Attributes; // attributes of current element }; // end CXMLReaderImpl } // end namespace } // end namespace #endif fldigi-4.1.06/src/irrxml/fast_atof.h0000644000175000017500000000642213472115774014223 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __FAST_A_TO_F_H_INCLUDED__ #define __FAST_A_TO_F_H_INCLUDED__ #include #include namespace irr { namespace core { // Disable the use of powf(3) on mingw32 because it breaks cross compilation // on Debian unstable. #ifndef __MINGW32__ const float fast_atof_table[] = { 0.f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f, 0.000000000001f, 0.0000000000001f, 0.00000000000001f, 0.000000000000001f }; //! Provides a fast function for converting a string into a float, //! about 6 times faster than atof in win32. // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. inline char* fast_atof_move(char* c, float& out) { bool inv = false; char *t; float f; if (*c=='-') { c++; inv = true; } f = (float)strtol(c, &t, 10); c = t; if (*c == '.') { c++; float pl = (float)strtol(c, &t, 10); pl *= fast_atof_table[t-c]; f += pl; c = t; if (*c == 'e') { ++c; float exp = (float)strtol(c, &t, 10); f *= (float)pow(10.0f, exp); c = t; } } if (inv) f *= -1.0f; out = f; return c; } //! Provides a fast function for converting a string into a float, //! about 6 times faster than atof in win32. // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. inline const char* fast_atof_move_const(const char* c, float& out) { bool inv = false; char *t; float f; if (*c=='-') { c++; inv = true; } f = (float)strtol(c, &t, 10); c = t; if (*c == '.') { c++; float pl = (float)strtol(c, &t, 10); pl *= fast_atof_table[t-c]; f += pl; c = t; if (*c == 'e') { ++c; f32 exp = (f32)strtol(c, &t, 10); f *= (f32)powf(10.0f, exp); c = t; } } if (inv) f *= -1.0f; out = f; return c; } inline float fast_atof(const char* c) { float ret; fast_atof_move_const(c, ret); return ret; } #else // __MINGW32__ inline float fast_atof(const char* c) { return atof(c); } #endif // !__MINGW32__ } // end namespace core }// end namespace irr #endif fldigi-4.1.06/src/irrxml/irrArray.h0000644000175000017500000002414213472115774014047 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_ARRAY_H_INCLUDED__ #define __IRR_ARRAY_H_INCLUDED__ #include "irrTypes.h" #include "heapsort.h" namespace irr { namespace core { //! Self reallocating template array (like stl vector) with additional features. /** Some features are: Heap sorting, binary search methods, easier debugging. */ template class array { public: array() : data(0), allocated(0), used(0), free_when_destroyed(true), is_sorted(true) { } //! Constructs a array and allocates an initial chunk of memory. //! \param start_count: Amount of elements to allocate. array(u32 start_count) : data(0), used(0), allocated(0), free_when_destroyed(true), is_sorted(true) { reallocate(start_count); } //! Copy constructor array(const array& other) : data(0) { *this = other; } //! Destructor. Frees allocated memory, if set_free_when_destroyed //! was not set to false by the user before. ~array() { if (free_when_destroyed) delete [] data; } //! Reallocates the array, make it bigger or smaller. //! \param new_size: New size of array. void reallocate(u32 new_size) { T* old_data = data; data = new T[new_size]; allocated = new_size; s32 end = used < new_size ? used : new_size; for (s32 i=0; i allocated) { // reallocate(used * 2 +1); // this doesn't work if the element is in the same array. So // we'll copy the element first to be sure we'll get no data // corruption T e; e = element; // copy element reallocate(used * 2 +1); // increase data block data[used++] = e; // push_back is_sorted = false; return; } data[used++] = element; is_sorted = false; } //! Adds an element at the front of the array. If the array is to small to //! add this new element, the array is made bigger. Please note that this //! is slow, because the whole array needs to be copied for this. //! \param element: Element to add at the back of the array. void push_front(const T& element) { if (used + 1 > allocated) reallocate(used * 2 +1); for (int i=(int)used; i>0; --i) data[i] = data[i-1]; data[0] = element; is_sorted = false; ++used; } //! Insert item into array at specified position. Please use this //! only if you know what you are doing (possible performance loss). //! The preferred method of adding elements should be push_back(). //! \param element: Element to be inserted //! \param index: Where position to insert the new element. void insert(const T& element, u32 index=0) { _IRR_DEBUG_BREAK_IF(index>used) // access violation if (used + 1 > allocated) reallocate(used * 2 +1); for (u32 i=used++; i>index; i--) data[i] = data[i-1]; data[index] = element; is_sorted = false; } //! Clears the array and deletes all allocated memory. void clear() { delete [] data; data = 0; used = 0; allocated = 0; is_sorted = true; } //! Sets pointer to new array, using this as new workspace. //! \param newPointer: Pointer to new array of elements. //! \param size: Size of the new array. void set_pointer(T* newPointer, u32 size) { delete [] data; data = newPointer; allocated = size; used = size; is_sorted = false; } //! Sets if the array should delete the memory it used. //! \param f: If true, the array frees the allocated memory in its //! destructor, otherwise not. The default is true. void set_free_when_destroyed(bool f) { free_when_destroyed = f; } //! Sets the size of the array. //! \param usedNow: Amount of elements now used. void set_used(u32 usedNow) { if (allocated < usedNow) reallocate(usedNow); used = usedNow; } //! Assignement operator void operator=(const array& other) { if (data) delete [] data; //if (allocated < other.allocated) if (other.allocated == 0) data = 0; else data = new T[other.allocated]; used = other.used; free_when_destroyed = other.free_when_destroyed; is_sorted = other.is_sorted; allocated = other.allocated; for (u32 i=0; i=used) // access violation return data[index]; } //! Direct access operator const T& operator [](u32 index) const { _IRR_DEBUG_BREAK_IF(index>=used) // access violation return data[index]; } //! Gets last frame const T& getLast() const { _IRR_DEBUG_BREAK_IF(!used) // access violation return data[used-1]; } //! Gets last frame T& getLast() { _IRR_DEBUG_BREAK_IF(!used) // access violation return data[used-1]; } //! Returns a pointer to the array. //! \return Pointer to the array. T* pointer() { return data; } //! Returns a const pointer to the array. //! \return Pointer to the array. const T* const_pointer() const { return data; } //! Returns size of used array. //! \return Size of elements in the array. u32 size() const { return used; } //! Returns amount memory allocated. //! \return Returns amount of memory allocated. The amount of bytes //! allocated would be allocated_size() * sizeof(ElementsUsed); u32 allocated_size() const { return allocated; } //! Returns true if array is empty //! \return True if the array is empty, false if not. bool empty() const { return used == 0; } //! Sorts the array using heapsort. There is no additional memory waste and //! the algorithm performs (O) n log n in worst case. void sort() { if (is_sorted || used<2) return; heapsort(data, used); is_sorted = true; } //! Performs a binary search for an element, returns -1 if not found. //! The array will be sorted before the binary search if it is not //! already sorted. //! \param element: Element to search for. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 binary_search(const T& element) { return binary_search(element, 0, used-1); } //! Performs a binary search for an element, returns -1 if not found. //! The array will be sorted before the binary search if it is not //! already sorted. //! \param element: Element to search for. //! \param left: First left index //! \param right: Last right index. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 binary_search(const T& element, s32 left, s32 right) { if (!used) return -1; sort(); s32 m; do { m = (left+right)>>1; if (element < data[m]) right = m - 1; else left = m + 1; } while((element < data[m] || data[m] < element) && left<=right); // this last line equals to: // " while((element != array[m]) && left<=right);" // but we only want to use the '<' operator. // the same in next line, it is "(element == array[m])" if (!(element < data[m]) && !(data[m] < element)) return m; return -1; } //! Finds an element in linear time, which is very slow. Use //! binary_search for faster finding. Only works if =operator is implemented. //! \param element: Element to search for. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 linear_search(T& element) { for (u32 i=0; i=0; --i) if (data[i] == element) return (s32)i; return -1; } //! Erases an element from the array. May be slow, because all elements //! following after the erased element have to be copied. //! \param index: Index of element to be erased. void erase(u32 index) { _IRR_DEBUG_BREAK_IF(index>=used || index<0) // access violation for (u32 i=index+1; i=used || index<0 || count<1 || index+count>used) // access violation for (u32 i=index+count; i. // ---------------------------------------------------------------------------- #ifndef __IRR_TYPES_H_INCLUDED__ #define __IRR_TYPES_H_INCLUDED__ namespace irr { //! 8 bit unsigned variable. /** This is a typedef for unsigned char, it ensures portability of the engine. */ typedef unsigned char u8; //! 8 bit signed variable. /** This is a typedef for signed char, it ensures portability of the engine. */ typedef signed char s8; //! 8 bit character variable. /** This is a typedef for char, it ensures portability of the engine. */ typedef char c8; //! 16 bit unsigned variable. /** This is a typedef for unsigned short, it ensures portability of the engine. */ typedef unsigned short u16; //! 16 bit signed variable. /** This is a typedef for signed short, it ensures portability of the engine. */ typedef signed short s16; //! 32 bit unsigned variable. /** This is a typedef for unsigned int, it ensures portability of the engine. */ typedef unsigned int u32; //! 32 bit signed variable. /** This is a typedef for signed int, it ensures portability of the engine. */ typedef signed int s32; // 64 bit signed variable. // This is a typedef for __int64, it ensures portability of the engine. // This type is currently not used by the engine and not supported by compilers // other than Microsoft Compilers, so it is outcommented. //typedef __int64 s64; //! 32 bit floating point variable. /** This is a typedef for float, it ensures portability of the engine. */ typedef float f32; //! 64 bit floating point variable. /** This is a typedef for double, it ensures portability of the engine. */ typedef double f64; } // end namespace // define the wchar_t type if not already built in. #ifdef _MSC_VER #ifndef _WCHAR_T_DEFINED //! A 16 bit wide character type. /** Defines the wchar_t-type. In VS6, its not possible to tell the standard compiler to treat wchar_t as a built-in type, and sometimes we just don't want to include the huge stdlib.h or wchar.h, so we'll use this. */ typedef unsigned short wchar_t; #define _WCHAR_T_DEFINED #endif // wchar is not defined #endif // microsoft compiler //! define a break macro for debugging only in Win32 mode. #if defined(WIN32) && defined(_MSC_VER) && defined(_DEBUG) #define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) if (_CONDITION_) {_asm int 3} #else #define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) #endif //! Defines a small statement to work around a microsoft compiler bug. /** The microsft compiler 7.0 - 7.1 has a bug: When you call unmanaged code that returns a bool type value of false from managed code, the return value may appear as true. See http://support.microsoft.com/default.aspx?kbid=823071 for details. Compiler version defines: VC6.0 : 1200, VC7.0 : 1300, VC7.1 : 1310, VC8.0 : 1400*/ #if defined(WIN32) && defined(_MSC_VER) && (_MSC_VER > 1299) && (_MSC_VER < 1400) #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX __asm mov eax,100 #else #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX #endif // _IRR_MANAGED_MARSHALLING_BUGFIX #endif // __IRR_TYPES_H_INCLUDED__ fldigi-4.1.06/src/irrxml/heapsort.h0000644000175000017500000000436713472115774014110 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_HEAPSORT_H_INCLUDED__ #define __IRR_HEAPSORT_H_INCLUDED__ #include "irrTypes.h" namespace irr { namespace core { //! Sinks an element into the heap. template inline void heapsink(T*array, s32 element, s32 max) { while ((element<<1) < max) // there is a left child { s32 j = (element<<1); if (j+1 < max && array[j] < array[j+1]) j = j+1; // take right child if (array[element] < array[j]) { T t = array[j]; // swap elements array[j] = array[element]; array[element] = t; element = j; } else return; } } //! Sorts an array with size 'size' using heapsort. template inline void heapsort(T* array_, s32 size) { // for heapsink we pretent this is not c++, where // arrays start with index 0. So we decrease the array pointer, // the maximum always +2 and the element always +1 T* virtualArray = array_ - 1; s32 virtualSize = size + 2; s32 i; // build heap for (i=((size-1)/2); i>=0; --i) heapsink(virtualArray, i+1, virtualSize-1); // sort array for (i=size-1; i>=0; --i) { T t = array_[0]; array_[0] = array_[i]; array_[i] = t; heapsink(virtualArray, 1, i + 1); } } } // end namespace core } // end namespace irr #endif fldigi-4.1.06/src/irrxml/irrXML.h0000644000175000017500000005515713472115774013443 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_XML_H_INCLUDED__ #define __IRR_XML_H_INCLUDED__ #include /** irrXML 1.2 API documentation
\section intro Introduction Welcome to the irrXML API documentation. Here you'll find any information you'll need to develop applications with irrXML. If you look for a tutorial on how to start, take a look at the \ref irrxmlexample, at the homepage of irrXML at xml.irrlicht3d.org or into the SDK in the directory \example. irrXML is intended to be a high speed and easy-to-use XML Parser for C++, and this documentation is an important part of it. If you have any questions or suggestions, just send a email to the author of the engine, Nikolaus Gebhardt (niko (at) irrlicht3d.org). For more informations about this parser, see \ref history. \section features Features irrXML provides forward-only, read-only access to a stream of non validated XML data. It was fully implemented by Nikolaus Gebhardt. Its current features are: - It it fast as lighting and has very low memory usage. It was developed with the intention of being used in 3D games, as it already has been. - irrXML is very small: It only consists of 60 KB of code and can be added easily to your existing project. - Of course, it is platform independent and works with lots of compilers. - It is able to parse ASCII, UTF-8, UTF-16 and UTF-32 text files, both in little and big endian format. - Independent of the input file format, the parser can return all strings in ASCII, UTF-8, UTF-16 and UTF-32 format. - With its optional file access abstraction it has the advantage that it can read not only from files but from any type of data (memory, network, ...). For example when used with the Irrlicht Engine, it directly reads from compressed .zip files. - Just like the Irrlicht Engine for which it was originally created, it is extremely easy to use. - It has no external dependencies, it does not even need the STL. Although irrXML has some strenghts, it currently also has the following limitations: - The input xml file is not validated and assumed to be correct. \section irrxmlexample Example The following code demonstrates the basic usage of irrXML. A simple xml file like this is parsed: \code Welcome to the Mesh Viewer of the "Irrlicht Engine". \endcode The code for parsing this file would look like this: \code #include using namespace irr; // irrXML is located in the namespace irr::io using namespace io; #include // we use STL strings to store data in this example void main() { // create the reader using one of the factory functions IrrXMLReader* xml = createIrrXMLReader("config.xml"); // strings for storing the data we want to get out of the file std::string modelFile; std::string messageText; std::string caption; // parse the file until end reached while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: // in this xml file, the only text which occurs is the messageText messageText = xml->getNodeData(); break; case EXN_ELEMENT: { if (!strcmp("model", xml->getNodeName())) modelFile = xml->getAttributeValue("file"); else if (!strcmp("messageText", xml->getNodeName())) caption = xml->getAttributeValue("caption"); } break; } } // delete the xml parser after usage delete xml; } \endcode \section howto How to use Simply add the source files in the /src directory of irrXML to your project. Done. \section license License The irrXML license is based on the zlib license. Basicly, this means you can do with irrXML whatever you want: Copyright (C) 2002-2005 Nikolaus Gebhardt This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. \section history History As lots of references in this documentation and the source show, this xml parser has originally been a part of the Irrlicht Engine. But because the parser has become very useful with the latest release, people asked for a separate version of it, to be able to use it in non Irrlicht projects. With irrXML 1.0, this has now been done. */ namespace irr { namespace io { //! Enumeration of all supported source text file formats enum ETEXT_FORMAT { //! ASCII, file without byte order mark, or not a text file ETF_ASCII, //! UTF-8 format ETF_UTF8, //! UTF-16 format, big endian ETF_UTF16_BE, //! UTF-16 format, little endian ETF_UTF16_LE, //! UTF-32 format, big endian ETF_UTF32_BE, //! UTF-32 format, little endian ETF_UTF32_LE, }; //! Enumeration for all xml nodes which are parsed by IrrXMLReader enum EXML_NODE { //! No xml node. This is usually the node if you did not read anything yet. EXN_NONE, //! A xml element, like EXN_ELEMENT, //! End of an xml element, like EXN_ELEMENT_END, //! Text within a xml element: this is the text. EXN_TEXT, //! An xml comment like <!-- I am a comment --> or a DTD definition. EXN_COMMENT, //! An xml cdata section like <![CDATA[ this is some CDATA ]]> EXN_CDATA, //! Unknown element. EXN_UNKNOWN }; //! Callback class for file read abstraction. /** With this, it is possible to make the xml parser read in other things than just files. The Irrlicht engine is using this for example to read xml from compressed .zip files. To make the parser read in any other data, derive a class from this interface, implement the two methods to read your data and give a pointer to an instance of your implementation when calling createIrrXMLReader(), createIrrXMLReaderUTF16() or createIrrXMLReaderUTF32() */ class IFileReadCallBack { public: //! virtual destructor virtual ~IFileReadCallBack() {}; //! Reads an amount of bytes from the file. /** \param buffer: Pointer to buffer where to read bytes will be written to. \param sizeToRead: Amount of bytes to read from the file. \return Returns how much bytes were read. */ virtual int read(void* buffer, int sizeToRead) = 0; //! Returns size of file in bytes virtual int getSize() = 0; }; //! Empty class to be used as parent class for IrrXMLReader. /** If you need another class as base class for the xml reader, you can do this by creating the reader using for example new CXMLReaderImpl(yourcallback); The Irrlicht Engine for example needs IUnknown as base class for every object to let it automaticly reference countend, hence it replaces IXMLBase with IUnknown. See irrXML.cpp on how this can be done in detail. */ class IXMLBase { }; //! Interface providing easy read access to a XML file. /** You can create an instance of this reader using one of the factory functions createIrrXMLReader(), createIrrXMLReaderUTF16() and createIrrXMLReaderUTF32(). If using the parser from the Irrlicht Engine, please use IFileSystem::createXMLReader() instead. For a detailed intro how to use the parser, see \ref irrxmlexample and \ref features. The typical usage of this parser looks like this: \code #include using namespace irr; // irrXML is located in the namespace irr::io using namespace io; void main() { // create the reader using one of the factory functions IrrXMLReader* xml = createIrrXMLReader("config.xml"); if (xml == 0) return; // file could not be opened // parse the file until end reached while(xml->read()) { // based on xml->getNodeType(), do something. } // delete the xml parser after usage delete xml; } \endcode See \ref irrxmlexample for a more detailed example. */ template class IIrrXMLReader : public super_class { public: //! Destructor virtual ~IIrrXMLReader() {}; //! Reads forward to the next xml node. /** \return Returns false, if there was no further node. */ virtual bool read() = 0; //! Returns the type of the current XML node. virtual EXML_NODE getNodeType() const = 0; //! Returns attribute count of the current XML node. /** This is usually non null if the current node is EXN_ELEMENT, and the element has attributes. \return Returns amount of attributes of this xml node. */ virtual int getAttributeCount() const = 0; //! Returns name of an attribute. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Name of the attribute, 0 if an attribute with this index does not exist. */ virtual const char_type* getAttributeName(int idx) const = 0; //! Returns the value of an attribute. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute, 0 if an attribute with this index does not exist. */ virtual const char_type* getAttributeValue(int idx) const = 0; //! Returns the value of an attribute. /** \param name: Name of the attribute. \return Value of the attribute, 0 if an attribute with this name does not exist. */ virtual const char_type* getAttributeValue(const char_type* name) const = 0; //! Returns the value of an attribute in a safe way. /** Like getAttributeValue(), but does not return 0 if the attribute does not exist. An empty string ("") is returned then. \param name: Name of the attribute. \return Value of the attribute, and "" if an attribute with this name does not exist */ virtual const char_type* getAttributeValueSafe(const char_type* name) const = 0; //! Returns the value of an attribute as integer. /** \param name Name of the attribute. \return Value of the attribute as integer, and 0 if an attribute with this name does not exist or the value could not be interpreted as integer. */ virtual int getAttributeValueAsInt(const char_type* name) const = 0; //! Returns the value of an attribute as integer. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute as integer, and 0 if an attribute with this index does not exist or the value could not be interpreted as integer. */ virtual int getAttributeValueAsInt(int idx) const = 0; //! Returns the value of an attribute as float. /** \param name: Name of the attribute. \return Value of the attribute as float, and 0 if an attribute with this name does not exist or the value could not be interpreted as float. */ virtual float getAttributeValueAsFloat(const char_type* name) const = 0; //! Returns the value of an attribute as float. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute as float, and 0 if an attribute with this index does not exist or the value could not be interpreted as float. */ virtual float getAttributeValueAsFloat(int idx) const = 0; //! Returns the name of the current node. /** Only non null, if the node type is EXN_ELEMENT. \return Name of the current node or 0 if the node has no name. */ virtual const char_type* getNodeName() const = 0; //! Returns data of the current node. /** Only non null if the node has some data and it is of type EXN_TEXT or EXN_UNKNOWN. */ virtual const char_type* getNodeData() const = 0; //! Returns if an element is an empty element, like virtual bool isEmptyElement() const = 0; //! Returns format of the source xml file. /** It is not necessary to use this method because the parser will convert the input file format to the format wanted by the user when creating the parser. This method is useful to get/display additional informations. */ virtual ETEXT_FORMAT getSourceFormat() const = 0; //! Returns format of the strings returned by the parser. /** This will be UTF8 for example when you created a parser with IrrXMLReaderUTF8() and UTF32 when it has been created using IrrXMLReaderUTF32. It should not be necessary to call this method and only exists for informational purposes. */ virtual ETEXT_FORMAT getParserFormat() const = 0; }; //! defines the utf-16 type. /** Not using wchar_t for this because wchar_t has 16 bit on windows and 32 bit on other operating systems. */ typedef unsigned short char16; //! defines the utf-32 type. /** Not using wchar_t for this because wchar_t has 16 bit on windows and 32 bit on other operating systems. */ typedef unsigned long char32; //! A UTF-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8 by this parser. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. Create an instance of this with createIrrXMLReader(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReader; //! A UTF-16 xml parser. /** This means that all character data will be returned in UTF-16 by this parser. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. Create an instance of this with createIrrXMLReaderUTF16(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReaderUTF16; //! A UTF-32 xml parser. /** This means that all character data will be returned in UTF-32 by this parser. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. Create an instance of this with createIrrXMLReaderUTF32(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReaderUTF32; //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(const char* filename); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(FILE* file); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. if you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback); /*! \file irrxml.h \brief Header file of the irrXML, the Irrlicht XML parser. This file includes everything needed for using irrXML, the XML parser of the Irrlicht Engine. To use irrXML, you only need to include this file in your project: \code #include \endcode It is also common to use the two namespaces in which irrXML is included, directly after #including irrXML.h: \code #include using namespace irr; using namespace io; \endcode */ } // end namespace io } // end namespace irr #endif // __IRR_XML_H_INCLUDED__ fldigi-4.1.06/src/irrxml/irrString.h0000644000175000017500000003236513472115774014245 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_STRING_H_INCLUDED__ #define __IRR_STRING_H_INCLUDED__ #include "irrTypes.h" namespace irr { namespace core { //! Very simple string class with some useful features. /** string and string work both with unicode AND ascii, so you can assign unicode to string and ascii to string (and the other way round) if your ever would want to. Note that the conversation between both is not done using an encoding. Known bugs: Special characters like 'Ä', 'Ü' and 'Ö' are ignored in the methods make_upper, make_lower and equals_ignore_case. */ template class string { public: //! Default constructor string() : array(0), allocated(1), used(1) { array = new T[1]; array[0] = 0x0; } //! Constructor string(const string& other) : array(0), allocated(0), used(0) { *this = other; } //! Constructs a string from an int string(int number) : array(0), allocated(0), used(0) { // store if negative and make positive bool negative = false; if (number < 0) { number *= -1; negative = true; } // temporary buffer for 16 numbers c8 tmpbuf[16]; tmpbuf[15] = 0; s32 idx = 15; // special case '0' if (!number) { tmpbuf[14] = '0'; *this = &tmpbuf[14]; return; } // add numbers while(number && idx) { idx--; tmpbuf[idx] = (c8)('0' + (number % 10)); number = number / 10; } // add sign if (negative) { idx--; tmpbuf[idx] = '-'; } *this = &tmpbuf[idx]; } //! Constructor for copying a string from a pointer with a given lenght template string(const B* c, s32 lenght) : array(0), allocated(0), used(0) { if (!c) return; allocated = used = lenght+1; array = new T[used]; for (s32 l = 0; l string(const B* c) : array(0), allocated(0), used(0) { *this = c; } //! destructor ~string() { delete [] array; } //! Assignment operator string& operator=(const string& other) { if (this == &other) return *this; delete [] array; allocated = used = other.size()+1; array = new T[used]; const T* p = other.c_str(); for (s32 i=0; i string& operator=(const B* c) { if (!c) { if (!array) { array = new T[1]; allocated = 1; used = 1; } array[0] = 0x0; return *this; } if ((void*)c == (void*)array) return *this; s32 len = 0; const B* p = c; while(*p) { ++len; ++p; } // we'll take the old string for a while, because the new string could be // a part of the current string. T* oldArray = array; allocated = used = len+1; array = new T[used]; for (s32 l = 0; l operator+(const string& other) { string str(*this); str.append(other); return str; } //! Add operator for strings, ascii and unicode template string operator+(const B* c) { string str(*this); str.append(c); return str; } //! Direct access operator T& operator [](const s32 index) const { _IRR_DEBUG_BREAK_IF(index>=used) // bad index return array[index]; } //! Comparison operator bool operator ==(const T* str) const { int i; for(i=0; array[i] && str[i]; ++i) if (array[i] != str[i]) return false; return !array[i] && !str[i]; } //! Comparison operator bool operator ==(const string& other) const { for(s32 i=0; array[i] && other.array[i]; ++i) if (array[i] != other.array[i]) return false; return used == other.used; } //! Is smaller operator bool operator <(const string& other) const { for(s32 i=0; array[i] && other.array[i]; ++i) if (array[i] != other.array[i]) return (array[i] < other.array[i]); return used < other.used; } //! Equals not operator bool operator !=(const string& other) const { return !(*this == other); } //! Returns length of string /** \return Returns length of the string in characters. */ s32 size() const { return used-1; } //! Returns character string /** \return Returns pointer to C-style zero terminated string. */ const T* c_str() const { return array; } //! Makes the string lower case. void make_lower() { const T A = (T)'A'; const T Z = (T)'Z'; const T diff = (T)'a' - A; for (s32 i=0; i=A && array[i]<=Z) array[i] += diff; } } //! Makes the string upper case. void make_upper() { const T a = (T)'a'; const T z = (T)'z'; const T diff = (T)'A' - a; for (s32 i=0; i=a && array[i]<=z) array[i] += diff; } } //! Compares the string ignoring case. /** \param other: Other string to compare. \return Returns true if the string are equal ignoring case. */ bool equals_ignore_case(const string& other) const { for(s32 i=0; array[i] && other[i]; ++i) if (toLower(array[i]) != toLower(other[i])) return false; return used == other.used; } //! compares the first n characters of the strings bool equalsn(const string& other, int len) { int i; for(i=0; array[i] && other[i] && i < len; ++i) if (array[i] != other[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (used == other.used); } //! compares the first n characters of the strings bool equalsn(const T* str, int len) { int i; for(i=0; array[i] && str[i] && i < len; ++i) if (array[i] != str[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (array[i] == 0 && str[i] == 0); } //! Appends a character to this string /** \param character: Character to append. */ void append(T character) { if (used + 1 > allocated) reallocate((s32)used + 1); used += 1; array[used-2] = character; array[used-1] = 0; } //! Appends a string to this string /** \param other: String to append. */ void append(const string& other) { --used; s32 len = other.size(); if (used + len + 1 > allocated) reallocate((s32)used + (s32)len + 1); for (s32 l=0; l& other, s32 length) { s32 len = other.size(); if (len < length) { append(other); return; } len = length; --used; if (used + len > allocated) reallocate((s32)used + (s32)len); for (s32 l=0; l s32 findFirstCharNotInList(B* c, int count) const { for (int i=0; i s32 findLastCharNotInList(B* c, int count) const { for (int i=used-2; i>=0; --i) { int j; for (j=0; j=0; --i) if (array[i] == c) return i; return -1; } //! Returns a substring //! \param begin: Start of substring. //! \param length: Length of substring. string subString(s32 begin, s32 length) { if (length <= 0) return string(""); string o; o.reserve(length+1); for (s32 i=0; i& other) { append(other); } void operator += (int i) { append(string(i)); } //! replaces all characters of a special type with another one void replace(T toReplace, T replaceWith) { for (s32 i=0; i=used || index<0) // access violation for (int i=index+1; i=(T)'A' && t<=(T)'Z') return t + ((T)'a' - (T)'A'); else return t; } //! Reallocate the array, make it bigger or smaler void reallocate(s32 new_size) { T* old_array = array; array = new T[new_size]; allocated = new_size; s32 amount = used < new_size ? used : new_size; for (s32 i=0; i stringc; //! Typedef for wide character strings typedef string stringw; } // end namespace core } // end namespace irr #endif fldigi-4.1.06/src/filters/0000775000175000017500000000000013515625027012310 500000000000000fldigi-4.1.06/src/filters/fftfilt.cxx0000664000175000017500000002001513507402064014403 00000000000000// ---------------------------------------------------------------------------- // fftfilt.cxx -- Fast convolution Overlap-Add filter // // Filter implemented using overlap-add FFT convolution method // h(t) characterized by Windowed-Sinc impulse response // // Reference: // "The Scientist and Engineer's Guide to Digital Signal Processing" // by Dr. Steven W. Smith, http://www.dspguide.com // Chapters 16, 18 and 21 // // Copyright (C) 2006-2008 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "misc.h" #include "fftfilt.h" //------------------------------------------------------------------------------ // initialize the filter // create forward and reverse FFTs //------------------------------------------------------------------------------ // probably only need a single instance of g_fft !! // use for both forward and reverse void fftfilt::clear_filter() { for (int i = 0; i < flen; i++) { filter[i] = 0; timedata[i] = 0; freqdata[i] = 0; output[i] = 0; ht[i] = 0; } for (int i = 0; i < flen2; i++) ovlbuf[i] = 0; inptr = 0; } void fftfilt::init_filter() { flen2 = flen >> 1; fft = new g_fft(flen); filter = new cmplx[flen]; timedata = new cmplx[flen]; freqdata = new cmplx[flen]; output = new cmplx[flen]; ovlbuf = new cmplx[flen2]; ht = new cmplx[flen]; } // number of samples needed to completely flush the filter int fftfilt::flush_size() { return flen - inptr; } //------------------------------------------------------------------------------ // fft filter // f1 < f2 ==> band pass filter // f1 > f2 ==> band reject filter // f1 == 0 ==> low pass filter // f2 == 0 ==> high pass filter //------------------------------------------------------------------------------ fftfilt::fftfilt(double f1, double f2, int len) { flen = len; init_filter(); create_filter(f1, f2); } //------------------------------------------------------------------------------ // low pass filter //------------------------------------------------------------------------------ fftfilt::fftfilt(double f, int len) { flen = len; init_filter(); create_lpf(f); } fftfilt::~fftfilt() { if (fft) delete fft; if (filter) delete [] filter; if (timedata) delete [] timedata; if (freqdata) delete [] freqdata; if (output) delete [] output; if (ovlbuf) delete [] ovlbuf; if (ht) delete [] ht; } void fftfilt::create_filter(double f1, double f2) { clear_filter(); // initialize the filter to zero for (int i = 0; i < flen; i++) ht[i] = 0; // create the filter shape coefficients by fft // filter values initialized to the ht response h(t) bool b_lowpass, b_highpass;//, window; b_lowpass = (f2 != 0); b_highpass = (f1 != 0); for (int i = 0; i < flen2; i++) { ht[i] = 0; //combine lowpass / highpass // lowpass @ f2 if (b_lowpass) ht[i] += fsinc(f2, i, flen2); // highighpass @ f1 if (b_highpass) ht[i] -= fsinc(f1, i, flen2); } // highpass is delta[flen2/2] - h(t) if (b_highpass && f2 < f1) ht[flen2 / 2] += 1; for (int i = 0; i < flen2; i++) ht[i] *= _blackman(i, flen2); // this may change since green fft is in place fft memcpy(filter, ht, flen * sizeof(cmplx)); // ht is flen complex points with imaginary all zero // first half describes h(t), second half all zeros // perform the cmplx forward fft to obtain H(w) // filter is flen/2 complex values fft->ComplexFFT(filter); // fft->transform(ht, filter); // normalize the output filter for unity gain double scale = 0, mag; for (int i = 0; i < flen2; i++) { mag = abs(filter[i]); if (mag > scale) scale = mag; } if (scale != 0) { for (int i = 0; i < flen; i++) filter[i] /= scale; } // perform the reverse fft to obtain h(t) // for testing // uncomment to obtain filter characteristics /* cmplx *revht = new cmplx[flen]; memcpy(revht, filter, flen * sizeof(cmplx)); fft->InverseComplexFFT(revht); std::fstream fspec; fspec.open("fspec.csv", std::ios::out); fspec << "i,imp.re,imp.im,filt.re,filt.im,filt.abs,revimp.re,revimp.im\n"; for (int i = 0; i < flen2; i++) fspec << i << "," << ht[i].real() << "," << ht[i].imag() << "," << filter[i].real() << "," << filter[i].imag() << "," << abs(filter[i]) << "," << revht[i].real() << "," << revht[i].imag() << "," << std::endl; fspec.close(); delete [] revht; */ // start output after 2 full passes are complete pass = 1; } /* * Filter with fast convolution (overlap-add algorithm). */ int fftfilt::run(const cmplx & in, cmplx **out) { // collect flen/2 input samples timedata[inptr++] = in; if (inptr < flen2) return 0; if (pass) --pass; // filter output is not stable until 2 passes // FFT transpose to the frequency domain memcpy(freqdata, timedata, flen * sizeof(cmplx)); fft->ComplexFFT(freqdata); // multiply with the filter shape for (int i = 0; i < flen; i++) freqdata[i] *= filter[i]; // transform back to time domain fft->InverseComplexFFT(freqdata); // overlap and add // save the second half for overlapping next inverse FFT for (int i = 0; i < flen2; i++) { output[i] = ovlbuf[i] + freqdata[i]; ovlbuf[i] = freqdata[i+flen2]; } // clear inbuf pointer inptr = 0; // signal the caller there is flen/2 samples ready if (pass) return 0; *out = output; return flen2; } //------------------------------------------------------------------------------ // rtty filter //------------------------------------------------------------------------------ //bool print_filter = true; // flag to inhibit printing multiple copies void fftfilt::rtty_filter(double f) { // Raised cosine filter designed iaw Section 1.2.6 of // Telecommunications Measurements, Analysis, and Instrumentation // by Dr. Kamilo Feher / Engineers of Hewlett-Packard // // Frequency scaling factor determined hueristically by testing various values // and measuring resulting decoder CER with input s/n = - 9 dB // // K CER // 1.0 .0244 // 1.1 .0117 // 1.2 .0081 // 1.3 .0062 // 1.4 .0054 // 1.5 .0062 // 1.6 .0076 f *= 1.4; double dht; for( int i = 0; i < flen2; ++i ) { double x = (double)i/(double)(flen2); // raised cosine response (changed for -1.0...+1.0 times Nyquist-f // instead of books versions ranging from -1..+1 times samplerate) dht = x <= 0 ? 1.0 : x > 2.0 * f ? 0.0 : cos((M_PI * x) / (f * 4.0)); dht *= dht; // cos^2 // amplitude equalized nyquist-channel response dht /= sinc(2.0 * i * f); filter[i] = cmplx( dht*cos((double)i* - 0.5*M_PI), dht*sin((double)i* - 0.5*M_PI) ); filter[(flen-i)%flen] = cmplx( dht*cos((double)i*+0.5*M_PI), dht*sin((double)i*+0.5*M_PI) ); } // perform the reverse fft to obtain h(t) // for testing // uncomment to obtain filter characteristics /* cmplx *revht = new cmplx[flen]; memcpy(revht, filter, flen * sizeof(cmplx)); fft->InverseComplexFFT(revht); std::fstream fspec; fspec.open("rtty_filter.csv", std::ios::out); fspec << "i,filt.re,filt.im,filt.abs,,revimp.re,revimp.im\n"; for (int i = 0; i < flen; i++) fspec << i << "," << filter[i].real() << "," << filter[i].imag() << "," << abs(filter[i]) << ",," << revht[i].real() << "," << revht[i].imag() << std::endl; fspec.close(); delete [] revht; */ // start output after 2 full passes are complete pass = 1; } fldigi-4.1.06/src/filters/filters.cxx0000644000175000017500000003661613472115774014443 00000000000000// ---------------------------------------------------------------------------- // // filters.cxx -- Several Digital Filter classes used in fldigi // // Copyright (C) 2006-2008 Dave Freese, W1HKJ // // These filters are based on the gmfsk design and the design notes given in // "Digital Signal Processing, A Practical Guid for Engineers and Scientists" // by Steven W. Smith. // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "filters.h" #include //===================================================================== // C_FIR_filter // // a class of Finite Impulse Response (FIR) filters with // decimate in time capability // //===================================================================== C_FIR_filter::C_FIR_filter () { pointer = counter = length = 0; decimateratio = 1; ifilter = qfilter = (double *)0; ffreq = 0.0; } C_FIR_filter::~C_FIR_filter() { if (ifilter) delete [] ifilter; if (qfilter) delete [] qfilter; } void C_FIR_filter::init(int len, int dec, double *itaps, double *qtaps) { length = len; decimateratio = dec; if (ifilter) { delete [] ifilter; ifilter = (double *)0; } if (qfilter) { delete [] qfilter; qfilter = (double *)0; } for (int i = 0; i < FIRBufferLen; i++) ibuffer[i] = qbuffer[i] = 0.0; if (itaps) { ifilter = new double[len]; for (int i = 0; i < len; i++) ifilter[i] = itaps[i]; } if (qtaps) { qfilter = new double[len]; for (int i = 0; i < len; i++) qfilter[i] = qtaps[i]; } pointer = len; counter = 0; } //===================================================================== // Create a band pass FIR filter with 6 dB corner frequencies // of 'f1' and 'f2'. (0 <= f1 < f2 <= 0.5) //===================================================================== double * C_FIR_filter::bp_FIR(int len, int hilbert, double f1, double f2) { double *fir; double t, h, x; fir = new double[len]; for (int i = 0; i < len; i++) { t = i - (len - 1.0) / 2.0; h = i * (1.0 / (len - 1.0)); if (!hilbert) { x = (2 * f2 * sinc(2 * f2 * t) - 2 * f1 * sinc(2 * f1 * t)) * hamming(h); } else { x = (2 * f2 * cosc(2 * f2 * t) - 2 * f1 * cosc(2 * f1 * t)) * hamming(h); // The actual filter code assumes the impulse response // is in time reversed order. This will be anti- // symmetric so the minus sign handles that for us. x = -x; } fir[i] = x; } return fir; } //===================================================================== // Filter will be a lowpass with // length = len // decimation = dec // 0.5 frequency point = freq //===================================================================== void C_FIR_filter::init_lowpass (int len, int dec, double freq) { double *fi = bp_FIR(len, 0, 0.0, freq); ffreq = freq; init (len, dec, fi, fi); delete [] fi; } //===================================================================== // Filter will be a bandpass with // length = len // decimation = dec // 0.5 frequency points of f1 (low) and f2 (high) //===================================================================== void C_FIR_filter::init_bandpass (int len, int dec, double f1, double f2) { double *fi = bp_FIR (len, 0, f1, f2); init (len, dec, fi, fi); delete [] fi; } //===================================================================== // Filter will the Hilbert form //===================================================================== void C_FIR_filter::init_hilbert (int len, int dec) { double *fi = bp_FIR(len, 0, 0.05, 0.45); double *fq = bp_FIR(len, 1, 0.05, 0.45); init (len, dec, fi, fq); delete [] fi; delete [] fq; } //===================================================================== // Run // passes a cmplx value (in) and receives the cmplx value (out) // function returns 0 if the filter is not yet stable // returns 1 when stable and decimated cmplx output value is valid //===================================================================== int C_FIR_filter::run (const cmplx &in, cmplx &out) { ibuffer[pointer] = in.real(); qbuffer[pointer] = in.imag(); counter++; if (counter == decimateratio) out = cmplx ( mac(&ibuffer[pointer - length], ifilter, length), mac(&qbuffer[pointer - length], qfilter, length) ); pointer++; if (pointer == FIRBufferLen) { /// memmove is necessary if length >= FIRBufferLen/2 , theoretically possible. memmove (ibuffer, ibuffer + FIRBufferLen - length, length * sizeof (double) ); memmove (qbuffer, qbuffer + FIRBufferLen - length, length * sizeof (double) ); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Run the filter for the Real part of the cmplx variable //===================================================================== int C_FIR_filter::Irun (const double &in, double &out) { double *iptr = ibuffer + pointer; pointer++; counter++; *iptr = in; if (counter == decimateratio) { out = mac(iptr - length, ifilter, length); } if (pointer == FIRBufferLen) { iptr = ibuffer + FIRBufferLen - length; memcpy(ibuffer, iptr, length * sizeof(double)); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Run the filter for the Imaginary part of the cmplx variable //===================================================================== int C_FIR_filter::Qrun (const double &in, double &out) { double *qptr = ibuffer + pointer; pointer++; counter++; *qptr = in; if (counter == decimateratio) { out = mac(qptr - length, qfilter, length); } if (pointer == FIRBufferLen) { qptr = qbuffer + FIRBufferLen - length; memcpy(qbuffer, qptr, length * sizeof(double)); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Moving average filter // // Simple in concept, sublime in implementation ... the fastest filter // in the west. Also optimal for the processing of time domain signals // characterized by a transition edge. The is the perfect signal filter // for CW, RTTY and other signals of that type. For a given filter size // it provides the greatest s/n improvement while retaining the sharpest // leading edge on the filtered signal. //===================================================================== Cmovavg::Cmovavg (int filtlen) { len = filtlen; in = new double[len]; empty = true; } Cmovavg::~Cmovavg() { if (in) delete [] in; } double Cmovavg::run(double a) { if (!in) { return a; } if (empty) { empty = false; out = 0; for (int i = 0; i < len; i++) { in[i] = a; out += a; } pint = 0; return a; } out = out - in[pint] + a; in[pint] = a; if (++pint >= len) pint = 0; return out / len; } void Cmovavg::setLength(int filtlen) { if (filtlen > len) { if (in) delete [] in; in = new double[filtlen]; } len = filtlen; empty = true; } void Cmovavg::reset() { empty = true; } //===================================================================== // Sliding FFT filter // Sliding Fast Fourier Transform // // The sliding FFT ingeniously exploits the properties of a time-delayed // input and the property of linearity for its derivation. // // First of all, the N-point transform of a sequence x(n) is equal to the // summation of the transforms of N separate transforms where each transform // has just one of the original samples at it's original sample time. // //i.e. // transform of [x0, x1, x2, x3, x4, x5,...xN-1] // is equal to // transform of [x0, 0, 0, 0, 0, 0,...0] // + transform of [0, x1, 0, 0, 0, 0,...0] // + transform of [0, 0, x2, 0, 0, 0,...0] // + transform of [0, 0, 0, x3, 0, 0,...0] // . // . // . // + transform of [0, 0, 0, 0, 0, 0,...xN-1] // // Secondly, the transform of a time-delayed sequence is a phase-rotated // version of the transform of the original sequence. i.e. // // If x(n) transforms to X(k), // Then x(n-m) transforms to X(k)(Wn)^(-mk) // // where N is the FFT size, m is the delay in sample periods, and WN is the // familiar phase-rotating coefficient or twiddle factor e^(-j2p/N) // // Therefore, if the N-point transform X(k) of an individual sample is considered, // and then the sample is moved back in time by one sample period, all frequency // bins of X(k) are phase-rotated by 2pk/N radians. // // The important thing here is that the transform is not performed again because // the previous frequency results can be used by simply application of the correct // coefficients. // // This is the technique that is applied when the rectangular sampling window // slides along by one sample. The contributions of all samples that are // included in both the original and the new windows are simply phase rotated. // The end effects are that the transform of the new sample must be added, and // the transform of the oldest sample that disappeared off the end must be // subtracted. These end-effects are easy to perform if we treat the new sample // as occurring at time t = 0, because the transform of a single sample at t = 0, // say (a + bj), simply has all frequency bins equal to (a + bj). Similarly, the // oldest sample that has just disappeared off the end of the window is exactly N // samples old. I.e. it occurred at t = -N. The transform of this sample, // say (c + dj), is also straightforward since every frequency bin has now been // phase-rotated an integer number of times from when the sample was at t = 0. // (The kth frequency bin has been rotated by 2pk radians). The transform of the // sample at t = -N is therefore the same as if it was still at t = 0. I.e. it // has all frequency bins equal to (c + dj). // // All that is needed therefore is to // phase rotate each frequency bin in F(k) by WN^(k) and then // add [(a + bj) + (c + dj)] to each frequency bin. // // One cmplx multiplication and two cmplx additions per frequency bin are // therefore required, per sample period, regardless of the size of the transform. // // For example, a traditional 1024-point FFT needs 5120 cmplx multiplies // and 10240 cmplx additions to calculate all 1024 frequency bins. A 1024-point // Sliding FFT however needs 1024 cmplx multiplies and 2048 cmplx additions // for all 1024 frequency bins, and as each frequency bin is calculated separately, // it is only necessary to calculate the ones that are of interest. // // One drawback of the Sliding FFT is that in using feedback from previous // frequency bins, there is potential for instability if the coefficients are not // infinitely precise. Without infinite precision, stability can be guaranteed by // making each phase-rotation coefficient have a magnitude of slightly less than // unity. E.g. 0.9999. // // This then has to taken into account when the Nth sample is subtracted, because // the factor 0.9999 has been applied N times to the transform of this sample. // The sample cannot therefore be directly subtracted, it must first be multiplied // by the factor of 0.9999^N. This unfortunately means there is another multipli- // cation to perform per frequency bin. Another drawback is that a circular buffer // is needed in which to keep N samples, so that the oldest sample, (from t= -N), // can be subtracted each time. // // This filter is ideal for extracting a finite number of frequency bins // with a very long kernel length. The filter only needs to calculate the // values for the bins of interest and not the entire spectrum. It does // require the store of the history associated with those bins over the // kernel length. // // Use in the MFSK / DOMINO modem for extraction of the frequency spectra // //===================================================================== struct sfft::vrot_bins_pair { cmplx vrot; cmplx bins; } ; sfft::sfft(int len, int _first, int _last) { vrot_bins = new vrot_bins_pair[len]; delay = new cmplx[len]; fftlen = len; first = _first; last = _last; ptr = 0; double phi = 0.0, tau = 2.0 * M_PI/ len; k2 = 1.0; for (int i = 0; i < fftlen; i++) { vrot_bins[i].vrot = cmplx( K1 * cos (phi), K1 * sin (phi) ); phi += tau; delay[i] = vrot_bins[i].bins = 0.0; k2 *= K1; } count = 0; } sfft::~sfft() { delete [] vrot_bins; delete [] delay; } void sfft::reset() { for (int i = 0; i < fftlen; i++) delay[i] = vrot_bins[i].bins = 0.0; count = 0; } bool sfft::is_stable() { return (count >= fftlen); } // Sliding FFT, cmplx input, cmplx output // FFT is computed for each value from first to last // Values are not stable until more than "len" samples have been processed. // Copies the frequencies to a pointer with a given stride. void sfft::run(const cmplx& input, cmplx * __restrict__ result, int stride ) { cmplx & de = delay[ptr]; const cmplx z( input.real() - k2 * de.real(), input.imag() - k2 * de.imag()); de = input; ++ptr ; if( ptr >= fftlen ) ptr = 0 ; // It is more efficient to have vrot and bins very close to each other. for( vrot_bins_pair * __restrict__ itr = vrot_bins + first, * __restrict__ end = vrot_bins + last ; itr != end ; ++itr, result += stride ) { *result = itr->bins = itr->bins * itr->vrot + z * itr->vrot; } if (count < fftlen) count++; } // ============================================================================ // Goertzel filter // Optimized implementation of a DFT for a single frequency of interest // SR = sample rate // N = Block size (does not need to be a factor of 2!) // bin size = SR / N // K = frequency bin of interest = (N * freq / SR) // N should be selected to make K an integer if possible // // Q0 = current sample // Q1 = previous sample (1 delay) // Q2 = previous sample (2 delay) // w = (2 * pi * K / N) // k1 = cos(w) // k2 = sin(w) // k3 = 2.0 * k1 // Q0, Q1, Q2 are initialized to zero // Iterate N times: // Q0 = k3*Q1 - Q2 + sample // Q2 = Q1 // Q1 = Q0 // // After N interations: // real = (Q1 - Q2 * k1) // imag = Q2 * k2 // or // mag = Q1*Q1 + Q2*Q2 - Q1*Q2*k1 // ============================================================================ goertzel::goertzel(int n, double freq, double sr) { double w; w = 2 * M_PI * freq / sr; k1 = cos(w); k2 = sin(w); k3 = 2.0 * k1; Q0 = Q1 = Q2 = 0.0; count = N = n; } goertzel::~goertzel() { } void goertzel::reset() { Q0 = Q1 = Q2 = 0.0; count = N; } void goertzel::reset(int n, double freq, double sr) { double w; w = 2 * M_PI * freq / sr; k1 = cos(w); k2 = sin(w); k3 = 2.0 * k1; Q0 = Q1 = Q2 = 0.0; count = N = n; } bool goertzel::run(double sample) { Q0 = sample + k3*Q1 - Q2; Q2 = Q1; Q1 = Q0; if (count) { --count; return false; } return true; } double goertzel::real() { return ((0.5*k3*Q1 - Q2)/N); } double goertzel::imag() { return ((k2*Q1)/N); } double goertzel::mag() { return (Q2*Q2 + Q1*Q1 - k3*Q2*Q1); } fldigi-4.1.06/src/filters/viterbi.cxx0000644000175000017500000001307613472115774014432 00000000000000// ---------------------------------------------------------------------------- // viterbi.cxx -- Viterbi decoder // // Copyright (C) 2006 // Dave Freese, W1HKJ // // Adapted from code contained in gmfsk source code distribution. // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "viterbi.h" #include "misc.h" /* ---------------------------------------------------------------------- */ viterbi::viterbi(int k, int poly1, int poly2) { outsize = 1 << k; nstates = 1 << (k - 1); _k = k; _poly1 = poly1; _poly2 = poly2; output = new int[outsize]; for (int i = 0; i < PATHMEM; i++) { metrics[i] = new int[nstates]; history[i] = new int[nstates]; } init(); } viterbi::~viterbi() { if (output) delete [] output; for (int i = 0; i < PATHMEM; i++) { if (metrics[i]) delete [] metrics[i]; if (history[i]) delete [] history[i]; } } void viterbi::init(void) { if(output) { _traceback = _k * 12; // takes >= 12 constraint lengths to calculate from an arbitrary state, when punctured _chunksize = 8; for (int i = 0; i < outsize; i++) { output[i] = parity(_poly1 & i) | (parity(_poly2 & i) << 1); } for (int i = 0; i < 256; i++) { mettab[0][i] = 128 - i; mettab[1][i] = i - 128; } memset(sequence, 0, sizeof(sequence)); reset(); } } void viterbi::reset() { for (int i = 0; i < PATHMEM; i++) { memset(metrics[i], 0, nstates * sizeof(int)); memset(history[i], 0, nstates * sizeof(int)); } ptr = 0; } int viterbi::settraceback(int trace) { if (trace < 0 || trace > PATHMEM - 1) return -1; _traceback = trace; return 0; } int viterbi::setchunksize(int chunk) { if (chunk < 1 || chunk > _traceback) return -1; _chunksize = chunk; return 0; } int viterbi::traceback(int *metric) { int bestmetric, beststate; unsigned int p, c = 0; p = (ptr - 1) % PATHMEM; // Find the state with the best metric bestmetric = INT_MIN; beststate = 0; for (int i = 0; i < nstates; i++) { if (metrics[p][i] > bestmetric) { bestmetric = metrics[p][i]; beststate = i; } } // Trace back 'traceback' steps, starting from the best state sequence[p] = beststate; for (int i = 0; i < _traceback; i++) { unsigned int prev = (p - 1) % PATHMEM; sequence[prev] = history[p][sequence[p]]; p = prev; } if (metric) *metric = metrics[p][sequence[p]]; // Decode 'chunksize' bits for (int i = 0; i < _chunksize; i++) { // low bit of state is the previous input bit c = (c << 1) | (sequence[p] & 1); p = (p + 1) % PATHMEM; } if (metric) *metric = metrics[p][sequence[p]] - *metric; return c; } int viterbi::decode(unsigned char *sym, int *metric) { unsigned int currptr, prevptr; int met[4]; currptr = ptr; prevptr = (currptr - 1) % PATHMEM; // if (prevptr < 0) prevptr = PATHMEM - 1; met[0] = mettab[0][sym[1]] + mettab[0][sym[0]]; met[1] = mettab[0][sym[1]] + mettab[1][sym[0]]; met[2] = mettab[1][sym[1]] + mettab[0][sym[0]]; met[3] = mettab[1][sym[1]] + mettab[1][sym[0]]; // met[0] = 256 - sym[1] - sym[0]; // met[1] = sym[0] - sym[1]; // met[2] = sym[1] - sym[0]; // met[3] = sym[0] + sym[1] - 256; for (int n = 0; n < nstates; n++) { int p0, p1, s0, s1, m0, m1; m0 = 0; m1 = 0; s0 = n; s1 = n + nstates; p0 = s0 >> 1; p1 = s1 >> 1; m0 = metrics[prevptr][p0] + met[output[s0]]; m1 = metrics[prevptr][p1] + met[output[s1]]; if (m0 > m1) { metrics[currptr][n] = m0; history[currptr][n] = p0; } else { metrics[currptr][n] = m1; history[currptr][n] = p1; } } ptr = (ptr + 1) % PATHMEM; if ((ptr % _chunksize) == 0) return traceback(metric); if (metrics[currptr][0] > INT_MAX / 2) { for (int i = 0; i < PATHMEM; i++) for (int j = 0; j < nstates; j++) metrics[i][j] -= INT_MAX / 2; } if (metrics[currptr][0] < INT_MIN / 2) { for (int i = 0; i < PATHMEM; i++) for (int j = 0; j < nstates; j++) metrics[i][j] += INT_MIN / 2; } return -1; } /* ---------------------------------------------------------------------- */ #include encoder::encoder(int k, int poly1, int poly2) { int size = 1 << k; /* size of the output table */ output = new int[size]; _k = k; _poly1 = poly1; _poly2 = poly2; init(); } encoder::~encoder() { delete [] output; } int encoder::encode(int bit) { shreg = (shreg << 1) | !!bit; return output[shreg & shregmask]; } void encoder::init(void) { if(output) { int size = 1 << _k; /* size of the output table */ // output contains 2 bits in positions 0 and 1 describing the state machine // for each bit delay, ie: for k = 7 there are 128 possible state pairs. // the modulo-2 addition for polynomial 1 is in bit 0 // the modulo-2 addition for polynomial 2 is in bit 1 // the allowable state outputs are 0, 1, 2 and 3 for (int i = 0; i < size; i++) { output[i] = parity(_poly1 & i) | (parity(_poly2 & i) << 1); } shreg = 0; shregmask = size - 1; } } fldigi-4.1.06/src/dominoex/0000775000175000017500000000000013515625027012462 500000000000000fldigi-4.1.06/src/dominoex/dominovar.cxx0000644000175000017500000006133313472115773015134 00000000000000/* * dominovar.cxx -- DominoEX Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . */ #include #include "dominovar.h" static unsigned char varicode[][3] = { /* Primary alphabet */ { 1,15, 9}, { 1,15,10}, { 1,15,11}, { 1,15,12}, { 1,15,13}, { 1,15,14}, { 1,15,15}, { 2, 8, 8}, { 2,12, 0}, { 2, 8, 9}, { 2, 8,10}, { 2, 8,11}, { 2, 8,12}, { 2,13, 0}, { 2, 8,13}, { 2, 8,14}, { 2, 8,15}, { 2, 9, 8}, { 2, 9, 9}, { 2, 9,10}, { 2, 9,11}, { 2, 9,12}, { 2, 9,13}, { 2, 9,14}, { 2, 9,15}, { 2,10, 8}, { 2,10, 9}, { 2,10,10}, { 2,10,11}, { 2,10,12}, { 2,10,13}, { 2,10,14}, { 0, 0, 0}, { 7,11, 0}, { 0, 8,14}, { 0,10,11}, { 0, 9,10}, { 0, 9, 9}, { 0, 8,15}, { 7,10, 0}, { 0, 8,12}, { 0, 8,11}, { 0, 9,13}, { 0, 8, 8}, { 2,11, 0}, { 7,14, 0}, { 7,13, 0}, { 0, 8, 9}, { 3,15, 0}, { 4,10, 0}, { 4,15, 0}, { 5, 9, 0}, { 6, 8, 0}, { 5,12, 0}, { 5,14, 0}, { 6,12, 0}, { 6,11, 0}, { 6,14, 0}, { 0, 8,10}, { 0, 8,13}, { 0,10, 8}, { 7,15, 0}, { 0, 9,15}, { 7,12, 0}, { 0, 9, 8}, { 3, 9, 0}, { 4,14, 0}, { 3,12, 0}, { 3,14, 0}, { 3, 8, 0}, { 4,12, 0}, { 5, 8, 0}, { 5,10, 0}, { 3,10, 0}, { 7, 8, 0}, { 6,10, 0}, { 4,11, 0}, { 4, 8, 0}, { 4,13, 0}, { 3,11, 0}, { 4, 9, 0}, { 6,15, 0}, { 3,13, 0}, { 2,15, 0}, { 2,14, 0}, { 5,11, 0}, { 6,13, 0}, { 5,13, 0}, { 5,15, 0}, { 6, 9, 0}, { 7, 9, 0}, { 0,10,14}, { 0,10, 9}, { 0,10,15}, { 0,10,10}, { 0, 9,12}, { 0, 9,11}, { 4, 0, 0}, { 1,11, 0}, { 0,12, 0}, { 0,11, 0}, { 1, 0, 0}, { 0,15, 0}, { 1, 9, 0}, { 0,10, 0}, { 5, 0, 0}, { 2,10, 0}, { 1,14, 0}, { 0, 9, 0}, { 0,14, 0}, { 6, 0, 0}, { 3, 0, 0}, { 1, 8, 0}, { 2, 8, 0}, { 7, 0, 0}, { 0, 8, 0}, { 2, 0, 0}, { 0,13, 0}, { 1,13, 0}, { 1,12, 0}, { 1,15, 0}, { 1,10, 0}, { 2, 9, 0}, { 0,10,12}, { 0, 9,14}, { 0,10,13}, { 0,11, 8}, { 2,10,15}, { 2,11, 8}, { 2,11, 9}, { 2,11,10}, { 2,11,11}, { 2,11,12}, { 2,11,13}, { 2,11,14}, { 2,11,15}, { 2,12, 8}, { 2,12, 9}, { 2,12,10}, { 2,12,11}, { 2,12,12}, { 2,12,13}, { 2,12,14}, { 2,12,15}, { 2,13, 8}, { 2,13, 9}, { 2,13,10}, { 2,13,11}, { 2,13,12}, { 2,13,13}, { 2,13,14}, { 2,13,15}, { 2,14, 8}, { 2,14, 9}, { 2,14,10}, { 2,14,11}, { 2,14,12}, { 2,14,13}, { 2,14,14}, { 2,14,15}, { 0,11, 9}, { 0,11,10}, { 0,11,11}, { 0,11,12}, { 0,11,13}, { 0,11,14}, { 0,11,15}, { 0,12, 8}, { 0,12, 9}, { 0,12,10}, { 0,12,11}, { 0,12,12}, { 0,12,13}, { 0,12,14}, { 0,12,15}, { 0,13, 8}, { 0,13, 9}, { 0,13,10}, { 0,13,11}, { 0,13,12}, { 0,13,13}, { 0,13,14}, { 0,13,15}, { 0,14, 8}, { 0,14, 9}, { 0,14,10}, { 0,14,11}, { 0,14,12}, { 0,14,13}, { 0,14,14}, { 0,14,15}, { 0,15, 8}, { 0,15, 9}, { 0,15,10}, { 0,15,11}, { 0,15,12}, { 0,15,13}, { 0,15,14}, { 0,15,15}, { 1, 8, 8}, { 1, 8, 9}, { 1, 8,10}, { 1, 8,11}, { 1, 8,12}, { 1, 8,13}, { 1, 8,14}, { 1, 8,15}, { 1, 9, 8}, { 1, 9, 9}, { 1, 9,10}, { 1, 9,11}, { 1, 9,12}, { 1, 9,13}, { 1, 9,14}, { 1, 9,15}, { 1,10, 8}, { 1,10, 9}, { 1,10,10}, { 1,10,11}, { 1,10,12}, { 1,10,13}, { 1,10,14}, { 1,10,15}, { 1,11, 8}, { 1,11, 9}, { 1,11,10}, { 1,11,11}, { 1,11,12}, { 1,11,13}, { 1,11,14}, { 1,11,15}, { 1,12, 8}, { 1,12, 9}, { 1,12,10}, { 1,12,11}, { 1,12,12}, { 1,12,13}, { 1,12,14}, { 1,12,15}, { 1,13, 8}, { 1,13, 9}, { 1,13,10}, { 1,13,11}, { 1,13,12}, { 1,13,13}, { 1,13,14}, { 1,13,15}, { 1,14, 8}, { 1,14, 9}, { 1,14,10}, { 1,14,11}, { 1,14,12}, { 1,14,13}, { 1,14,14}, { 1,14,15}, { 1,15, 8}, /* Secondary alphabet */ { 6,15, 9}, { 6,15,10}, { 6,15,11}, { 6,15,12}, { 6,15,13}, { 6,15,14}, { 6,15,15}, { 7, 8, 8}, { 4,10,12}, { 7, 8, 9}, { 7, 8,10}, { 7, 8,11}, { 7, 8,12}, { 4,10,13}, { 7, 8,13}, { 7, 8,14}, { 7, 8,15}, { 7, 9, 8}, { 7, 9, 9}, { 7, 9,10}, { 7, 9,11}, { 7, 9,12}, { 7, 9,13}, { 7, 9,14}, { 7, 9,15}, { 7,10, 8}, { 7,10, 9}, { 7,10,10}, { 7,10,11}, { 7,10,12}, { 7,10,13}, { 7,10,14}, { 3, 8, 8}, { 4,15,11}, { 5, 8,14}, { 5,10,11}, { 5, 9,10}, { 5, 9, 9}, { 5, 8,15}, { 4,15,10}, { 5, 8,12}, { 5, 8,11}, { 5, 9,13}, { 5, 8, 8}, { 4,10,11}, { 4,15,14}, { 4,15,13}, { 5, 8, 9}, { 4,11,15}, { 4,12,10}, { 4,12,15}, { 4,13, 9}, { 4,14, 8}, { 4,13,12}, { 4,13,14}, { 4,14,12}, { 4,14,11}, { 4,14,14}, { 5, 8,10}, { 5, 8,13}, { 5,10, 8}, { 4,15,15}, { 5, 9,15}, { 4,15,12}, { 5, 9, 8}, { 4,11, 9}, { 4,12,14}, { 4,11,12}, { 4,11,14}, { 4,11, 8}, { 4,12,12}, { 4,13, 8}, { 4,13,10}, { 4,11,10}, { 4,15, 8}, { 4,14,10}, { 4,12,11}, { 4,12, 8}, { 4,12,13}, { 4,11,11}, { 4,12, 9}, { 4,14,15}, { 4,11,13}, { 4,10,15}, { 4,10,14}, { 4,13,11}, { 4,14,13}, { 4,13,13}, { 4,13,15}, { 4,14, 9}, { 4,15, 9}, { 5,10,14}, { 5,10, 9}, { 5,10,15}, { 5,10,10}, { 5, 9,12}, { 5, 9,11}, { 3, 8,12}, { 4, 9,11}, { 4, 8,12}, { 4, 8,11}, { 3, 8, 9}, { 4, 8,15}, { 4, 9, 9}, { 4, 8,10}, { 3, 8,13}, { 4,10,10}, { 4, 9,14}, { 4, 8, 9}, { 4, 8,14}, { 3, 8,14}, { 3, 8,11}, { 4, 9, 8}, { 4,10, 8}, { 3, 8,15}, { 4, 8, 8}, { 3, 8,10}, { 4, 8,13}, { 4, 9,13}, { 4, 9,12}, { 4, 9,15}, { 4, 9,10}, { 4,10, 9}, { 5,10,12}, { 5, 9,14}, { 5,10,12}, { 5,11, 8}, { 7,10,15}, { 7,11, 8}, { 7,11, 9}, { 7,11,10}, { 7,11,11}, { 7,11,12}, { 7,11,13}, { 7,11,14}, { 7,11,15}, { 7,12, 8}, { 7,12, 9}, { 7,12,10}, { 7,12,11}, { 7,12,12}, { 7,12,13}, { 7,12,14}, { 7,12,15}, { 7,13, 8}, { 7,13, 9}, { 7,13,10}, { 7,13,11}, { 7,13,12}, { 7,13,13}, { 7,13,14}, { 7,13,15}, { 7,14, 8}, { 7,14, 9}, { 7,14,10}, { 7,14,11}, { 7,14,12}, { 7,14,13}, { 7,14,14}, { 7,14,15}, { 5,11, 9}, { 5,11,10}, { 5,11,11}, { 5,11,12}, { 5,11,13}, { 5,11,14}, { 5,11,15}, { 5,12, 8}, { 5,12, 9}, { 5,12,10}, { 5,12,11}, { 5,12,12}, { 5,12,13}, { 5,12,14}, { 5,12,15}, { 5,13, 8}, { 5,13, 9}, { 5,13,10}, { 5,13,11}, { 5,13,12}, { 5,13,13}, { 5,13,14}, { 5,13,15}, { 5,14, 8}, { 5,14, 9}, { 5,14,10}, { 5,14,11}, { 5,14,12}, { 5,14,13}, { 5,14,14}, { 5,14,15}, { 5,15, 8}, { 5,15, 9}, { 5,15,10}, { 5,15,11}, { 5,15,12}, { 5,15,13}, { 5,15,14}, { 5,15,15}, { 6, 8, 8}, { 6, 8, 9}, { 6, 8,10}, { 6, 8,11}, { 6, 8,12}, { 6, 8,13}, { 6, 8,14}, { 6, 8,15}, { 6, 9, 8}, { 6, 9, 9}, { 6, 9,10}, { 6, 9,11}, { 6, 9,12}, { 6, 9,13}, { 6, 9,14}, { 6, 9,15}, { 6,10, 8}, { 6,10, 9}, { 6,10,10}, { 6,10,11}, { 6,10,12}, { 6,10,13}, { 6,10,14}, { 6,10,15}, { 6,11, 8}, { 6,11, 9}, { 6,11,10}, { 6,11,11}, { 6,11,12}, { 6,11,13}, { 6,11,14}, { 6,11,15}, { 6,12, 8}, { 6,12, 9}, { 6,12,10}, { 6,12,11}, { 6,12,12}, { 6,12,13}, { 6,12,14}, { 6,12,15}, { 6,13, 8}, { 6,13, 9}, { 6,13,10}, { 6,13,11}, { 6,13,12}, { 6,13,13}, { 6,13,14}, { 6,13,15}, { 6,14, 8}, { 6,14, 9}, { 6,14,10}, { 6,14,11}, { 6,14,12}, { 6,14,13}, { 6,14,14}, { 6,14,15}, { 6,15, 8}, }; /* * The same in a format more suitable for decoding. * The index is the varicode symbol, being 1-3 nibbles, with no padding * (ie a single-symbol character uses bits 3:0 only). The value is the * ASCII character. Since continuation nibbles are required to have the * MSB set, significant portions of the table are unused and should not * be reached. */ static signed int varidecode[] = { 32,101,116,111, 97,105,110,114,115,108,104,100, 99,117,109,102, -1, -1, -1, -1, -1, -1, -1, -1,112,103,121, 98,119,118,107,120, -1, -1, -1, -1, -1, -1, -1, -1,113,122,106, 44, 8, 13, 84, 83, -1, -1, -1, -1, -1, -1, -1, -1, 69, 65, 73, 79, 67, 82, 68, 48, -1, -1, -1, -1, -1, -1, -1, -1, 77, 80, 49, 76, 70, 78, 66, 50, -1, -1, -1, -1, -1, -1, -1, -1, 71, 51, 72, 85, 53, 87, 54, 88, -1, -1, -1, -1, -1, -1, -1, -1, 52, 89, 75, 56, 55, 86, 57, 81, -1, -1, -1, -1, -1, -1, -1, -1, 74, 90, 39, 33, 63, 46, 45, 61, -1, -1, -1, -1, -1, -1, -1, -1, 43, 47, 58, 41, 40, 59, 34, 38, -1, -1, -1, -1, -1, -1, -1, -1, 64, 37, 36, 96, 95, 42,124, 62, -1, -1, -1, -1, -1, -1, -1, -1, 60, 92, 94, 35,123,125, 91, 93, -1, -1, -1, -1, -1, -1, -1, -1,126,160,161,162,163,164,165,166, -1, -1, -1, -1, -1, -1, -1, -1,167,168,169,170,171,172,173,174, -1, -1, -1, -1, -1, -1, -1, -1,175,176,177,178,179,180,181,182, -1, -1, -1, -1, -1, -1, -1, -1,183,184,185,186,187,188,189,190, -1, -1, -1, -1, -1, -1, -1, -1,191,192,193,194,195,196,197,198, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,199,200,201,202,203,204,205,206, -1, -1, -1, -1, -1, -1, -1, -1,207,208,209,210,211,212,213,214, -1, -1, -1, -1, -1, -1, -1, -1,215,216,217,218,219,220,221,222, -1, -1, -1, -1, -1, -1, -1, -1,223,224,225,226,227,228,229,230, -1, -1, -1, -1, -1, -1, -1, -1,231,232,233,234,235,236,237,238, -1, -1, -1, -1, -1, -1, -1, -1,239,240,241,242,243,244,245,246, -1, -1, -1, -1, -1, -1, -1, -1,247,248,249,250,251,252,253,254, -1, -1, -1, -1, -1, -1, -1, -1,255, 0, 1, 2, 3, 4, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 9, 10, 11, 12, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, 27, 28, 29, 30, 31,127, -1, -1, -1, -1, -1, -1, -1, -1,128,129,130,131,132,133,134,135, -1, -1, -1, -1, -1, -1, -1, -1,136,137,138,139,140,141,142,143, -1, -1, -1, -1, -1, -1, -1, -1,144,145,146,147,148,149,150,151, -1, -1, -1, -1, -1, -1, -1, -1,152,153,154,155,156,157,158,159, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,288,357,372,367,353,361,366,370, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,371,364,360,356,355,373,365,358, -1, -1, -1, -1, -1, -1, -1, -1,368,359,377,354,375,374,363,376, -1, -1, -1, -1, -1, -1, -1, -1,369,378,362,300,264,269,340,339, -1, -1, -1, -1, -1, -1, -1, -1,325,321,329,335,323,338,324,304, -1, -1, -1, -1, -1, -1, -1, -1,333,336,305,332,326,334,322,306, -1, -1, -1, -1, -1, -1, -1, -1,327,307,328,341,309,343,310,344, -1, -1, -1, -1, -1, -1, -1, -1,308,345,331,312,311,342,313,337, -1, -1, -1, -1, -1, -1, -1, -1,330,346,295,289,319,302,301,317, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,299,303,314,297,296,315,290,294, -1, -1, -1, -1, -1, -1, -1, -1,320,293,292,352,351,298,380,318, -1, -1, -1, -1, -1, -1, -1, -1,316,348,350,291,381, -1,347,349, -1, -1, -1, -1, -1, -1, -1, -1,382,416,417,418,419,420,421,422, -1, -1, -1, -1, -1, -1, -1, -1,423,424,425,426,427,428,429,430, -1, -1, -1, -1, -1, -1, -1, -1,431,432,433,434,435,436,437,438, -1, -1, -1, -1, -1, -1, -1, -1,439,440,441,442,443,444,445,446, -1, -1, -1, -1, -1, -1, -1, -1,447,448,449,450,451,452,453,454, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,455,456,457,458,459,460,461,462, -1, -1, -1, -1, -1, -1, -1, -1,463,464,465,466,467,468,469,470, -1, -1, -1, -1, -1, -1, -1, -1,471,472,473,474,475,476,477,478, -1, -1, -1, -1, -1, -1, -1, -1,479,480,481,482,483,484,485,486, -1, -1, -1, -1, -1, -1, -1, -1,487,488,489,490,491,492,493,494, -1, -1, -1, -1, -1, -1, -1, -1,495,496,497,498,499,500,501,502, -1, -1, -1, -1, -1, -1, -1, -1,503,504,505,506,507,508,509,510, -1, -1, -1, -1, -1, -1, -1, -1,511,256,257,258,259,260,261,262, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,263,265,266,267,268,270,271,272, -1, -1, -1, -1, -1, -1, -1, -1,273,274,275,276,277,278,279,280, -1, -1, -1, -1, -1, -1, -1, -1,281,282,283,284,285,286,287,383, -1, -1, -1, -1, -1, -1, -1, -1,384,385,386,387,388,389,390,391, -1, -1, -1, -1, -1, -1, -1, -1,392,393,394,395,396,397,398,399, -1, -1, -1, -1, -1, -1, -1, -1,400,401,402,403,404,405,406,407, -1, -1, -1, -1, -1, -1, -1, -1,408,409,410,411,412,413,414,415, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; #include unsigned char *dominoex_varienc(unsigned char c, int secondary) { return varicode[c + ((secondary) ? 256 : 0)]; } int dominoex_varidec(unsigned int symbol) { /* The caller is responsible for ensuring symbols are properly delineated. */ return varidecode[symbol & 0xFFF]; } fldigi-4.1.06/src/dominoex/dominoex.cxx0000664000175000017500000005145613507401434014756 00000000000000// ---------------------------------------------------------------------------- // // dominoex.cxx -- DominoEX modem // // Copyright (C) 2008-20012 // David Freese // Hamish Moffatt // John Phelps // // based on code in gmfsk // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "confdialog.h" #include "status.h" #include "dominoex.h" #include "trx.h" #include "fl_digi.h" #include "filters.h" #include "misc.h" #include "sound.h" #include "mfskvaricode.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; char dommsg[80]; static map mupsksec2pri; bool usingFEC = false; void dominoex::tx_init() { txstate = TX_STATE_PREAMBLE; txprevtone = 0; Mu_bitstate = 0; counter = 0; txphase = 0; strSecXmtText = progdefaults.secText; if (strSecXmtText.length() == 0) strSecXmtText = "fldigi " PACKAGE_VERSION " "; videoText(); } void dominoex::rx_init() { synccounter = 0; symcounter = 0; Mu_symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; phase[0] = 0.0; for (int i = 0; i < MAXFFTS; i++) phase[i+1] = 0.0; put_MODEstatus(mode); put_sec_char(0); syncfilter->reset(); Mu_datashreg = 1; staticburst = false; sig = noise = 6; } void dominoex::reset_filters() { // fft filter at first IF frequency fft->create_filter( (FIRSTIF - 0.5 * progdefaults.DOMINOEX_BW * bandwidth) / samplerate, (FIRSTIF + 0.5 * progdefaults.DOMINOEX_BW * bandwidth)/ samplerate ); for (int i = 0; i < MAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = 0; } if (slowcpu) { extones = 4; paths = 3; } else { extones = NUMTONES / 2; paths = 5; } lotone = basetone - extones * doublespaced; hitone = basetone + NUMTONES * doublespaced + extones * doublespaced; numbins = hitone - lotone; for (int i = 0; i < paths; i++)//MAXFFTS; i++) binsfft[i] = new sfft (symlen, lotone, hitone); filter_reset = false; } void dominoex::restart() { filter_reset = true; } void dominoex::init() { if (mupsksec2pri.empty()) MuPsk_sec2pri_init(); modem::init(); // reset_filters(); rx_init(); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); set_scope_mode(Digiscope::DOMDATA); } void dominoex::MuPsk_sec2pri_init(void) { int chars[] = { 'A', 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, // À, Ã, Â, Ã, Ä, Ã… 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, -1, // à, á, â, ã, ä, Ã¥ 'B', 0xdf, -1, // ß 'C', 0xc7, 0xe7, 0xa9, -1, // Ç, ç, ©, 'D', 0xd0, 0xb0, -1, // Ã, ° 'E', 0xc6, 0xe6, 0xc8, 0xc9, 0xca, 0xcb, // Æ, æ, È, É, Ê, Ë 0xe8, 0xe9, 0xea, 0xeb, -1, // è, é, ê, ë 'F', 0x192, -1, // Æ’ 'I', 0xcc, 0xcd, 0xce, 0xcf, 0xec, 0xed, // ÃŒ, Ã, ÃŽ, Ã, ì, í 0xee, 0xef, 0xa1, -1, // î, ï, ¡ 'L', 0xa3, -1, // £ 'N', 0xd1, 0xf1, -1, // Ñ, ñ 'O', 0xf4, 0xf6, 0xf2, 0xd6, 0xf3, 0xd3, // ô, ö, ò, Ö, ó, Ó 0xd4, 0xd2, 0xf5, 0xd5, -1, // Ô, Ã’, õ, Õ 'R', 0xae, -1, // ® 'U', 0xd9, 0xda, 0xdb, 0xdc, 0xf9, 0xfa, // Ù, Ú, Û, Ü, ù, ú 0xfb, 0xfc, -1, // û, ü 'X', 0xd7, -1, // × 'Y', 0xff, 0xfd, 0xdd, -1, // ÿ, ý, à '0', 0xd8, -1, // Ø '1', 0xb9, -1, // ¹ '2', 0xb2, -1, // ² '3', 0xb3, -1, // ³ '?', 0xbf, -1, // ¿ '!', 0xa1, -1, // ¡ '<', 0xab, -1, // « '>', 0xbb, -1, // » '{', '(', -1, '}', ')', -1, '|', '\\' }; int c = chars[0]; for (size_t i = 1; i < sizeof(chars)/sizeof(*chars); i++) { if (chars[i] != -1) mupsksec2pri[chars[i]] = c; else c = chars[++i]; } } dominoex::~dominoex() { if (hilbert) delete hilbert; for (int i = 0; i < MAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = 0; } for (int i = 0; i < SCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; if (pipe) delete [] pipe; if (fft) delete fft; if (MuPskRxinlv) delete MuPskRxinlv; if (MuPskTxinlv) delete MuPskTxinlv; if (MuPskDec) delete MuPskDec; if (MuPskEnc) delete MuPskEnc; } dominoex::dominoex(trx_mode md) { cap |= CAP_REV; mode = md; switch (mode) { // 11.025 kHz modes case MODE_DOMINOEX5: symlen = 2048; doublespaced = 2; samplerate = 11025; break; case MODE_DOMINOEX11: symlen = 1024; doublespaced = 1; samplerate = 11025; break; case MODE_DOMINOEX22: symlen = 512; doublespaced = 1; samplerate = 11025; break; // 8kHz modes case MODE_DOMINOEXMICRO: symlen = 4000; doublespaced = 1; samplerate = 8000; break; case MODE_DOMINOEX4: symlen = 2048; doublespaced = 2; samplerate = 8000; break; case MODE_DOMINOEX8: symlen = 1024; doublespaced = 2; samplerate = 8000; break; case MODE_DOMINOEX16: symlen = 512; doublespaced = 1; samplerate = 8000; break; // experimental case MODE_DOMINOEX44: symlen = 256; doublespaced = 2; samplerate = 11025; break; case MODE_DOMINOEX88: symlen = 128; doublespaced = 1; samplerate = 11025; break; default: // EX8 symlen = 1024; doublespaced = 2; samplerate = 8000; } tonespacing = 1.0 * samplerate * doublespaced / symlen; bandwidth = NUMTONES * tonespacing; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); // fft filter at first if frequency fft = new fftfilt( (FIRSTIF - 0.5 * progdefaults.DOMINOEX_BW * bandwidth) / samplerate, (FIRSTIF + 0.5 * progdefaults.DOMINOEX_BW * bandwidth)/ samplerate, 1024 ); basetone = (int)floor(BASEFREQ * symlen / samplerate + 0.5); slowcpu = progdefaults.slowcpu; for (int i = 0; i < MAXFFTS; i++) binsfft[i] = 0; reset_filters(); for (int i = 0; i < SCOPESIZE; i++) vidfilter[i] = new Cmovavg(16); syncfilter = new Cmovavg(16); twosym = 2 * symlen; pipe = new domrxpipe[twosym]; scopedata.alloc(SCOPESIZE); videodata.alloc(MAXFFTS * numbins); pipeptr = 0; symcounter = 0; Mu_symcounter = 0; metric = 0.0; fragmentsize = symlen; s2n = 0.0; prev1symbol = prev2symbol = 0; MuPskEnc = new encoder (NASA_K, POLY1, POLY2); MuPskDec = new viterbi (NASA_K, POLY1, POLY2); MuPskDec->settraceback (45); MuPskDec->setchunksize (1); MuPskTxinlv = new interleave (4, 4, INTERLEAVE_FWD); MuPskRxinlv = new interleave (4, 4, INTERLEAVE_REV); Mu_bitstate = 0; Mu_symbolpair[0] = Mu_symbolpair[1] = 0; Mu_datashreg = 1; // init(); } //===================================================================== // rx modules cmplx dominoex::mixer(int n, cmplx in) { cmplx z; double f; // first IF mixer (n == 0) plus // MAXFFTS mixers are supported each separated by tonespacing/paths // n == 1, 2, 3, 4 ... MAXFFTS if (n == 0) f = frequency - FIRSTIF; else f = FIRSTIF - BASEFREQ - bandwidth / 2.0 + tonespacing * (1.0 * (n - 1) / paths ); z = cmplx( cos(phase[n]), sin(phase[n])); z = z * in; phase[n] -= TWOPI * f / samplerate; if (phase[n] < 0) phase[n] += TWOPI; return z; } void dominoex::recvchar(int c) { if (!progStatus.sqlonoff || metric > progStatus.sldrSquelchValue) { if (c == -1) return; if (c & 0x100) put_sec_char(c & 0xFF); else put_rx_char(c & 0xFF); } } void dominoex::decodeDomino(int c) { int sym, ch; // If the new symbol is the start of a new character (MSB is low), complete the previous character if (!(c & 0x8)) { if (symcounter <= MAX_VARICODE_LEN) { sym = 0; for (int i = 0; i < symcounter; i++) sym |= symbolbuf[i] << (4 * i); ch = dominoex_varidec(sym); if (!progdefaults.DOMINOEX_FEC) if (!staticburst && !outofrange) recvchar(ch); } symcounter = 0; } // Add to the symbol buffer. Position 0 is the newest symbol. for (int i = MAX_VARICODE_LEN-1; i > 0; i--) symbolbuf[i] = symbolbuf[i-1]; symbolbuf[0] = c; // Increment the counter, but clamp at max+1 to avoid overflow symcounter++; if (symcounter > MAX_VARICODE_LEN + 1) symcounter = MAX_VARICODE_LEN + 1; } void dominoex::decodesymbol() { int c; double fdiff; // Decode the IFK+ sequence, which results in a single nibble fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= doublespaced; fdiff /= paths; // if (fabs(fdiff) > 17) // outofrange = true; // else outofrange = false; c = (int)floor(fdiff + .5) - 2; if (c < 0) c += NUMTONES; decodeDomino(c); decodeMuPskEX(c); } int dominoex::harddecode() { double x, max = 0.0; int symbol = 0; double avg = 0.0; bool cwi[paths * numbins]; double cwmag; for (int i = 0; i < paths * numbins; i++) avg += abs(pipe[pipeptr].vector[i]); avg /= (paths * numbins); if (avg < 1e-10) avg = 1e-10; int numtests = 10; int count = 0; for (int i = 0; i < paths * numbins; i++) { cwmag = 0.0; count = 0; for (int j = 1; j <= numtests; j++) { int p = pipeptr - j; if (p < 0) p += twosym; cwmag = abs(pipe[j].vector[i])/numtests; if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++; } cwi[i] = (count == numtests); } for (int i = 0; i < (paths * numbins); i++) { if (cwi[i] == false) { x = abs(pipe[pipeptr].vector[i]); avg += x; if (x > max) { max = x; symbol = i; } } } avg /= (paths * numbins); staticburst = (max / avg < 1.2); return symbol; } void dominoex::update_syncscope() { double max = 0, min = 1e6, range, mag; // dom waterfall memset(videodata, 0, (paths * numbins) * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (int i = 0; i < (paths * numbins); i++ ) { mag = abs(pipe[pipeptr].vector[i]); if (max < mag) max = mag; if (min > mag) min = mag; } range = max - min; for (int i = 0; i < (paths * numbins); i++ ) { if (range > 2) { mag = (abs(pipe[pipeptr].vector[i]) - min) / range + 0.0001; mag = 1 + 2 * log10(mag); if (mag < 0) mag = 0; } else mag = 0; videodata[(i + paths * numbins / 2)/2] = 255*mag; } } set_video(videodata, (paths * numbins), false); videodata.next(); // set_scope(scopedata, twosym); // 64 data points is sufficient to show the signal progression through the // convolution filter. memset(scopedata, 0, SCOPESIZE * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (unsigned int i = 0, j = 0; i < SCOPESIZE; i++) { j = (pipeptr + i * twosym / SCOPESIZE + 1) % (twosym); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } } set_scope(scopedata, SCOPESIZE); scopedata.next(); } void dominoex::synchronize() { // int syn = -1; double syn = -1; double val, max = 0.0; if (staticburst == true) return; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; for (unsigned int i = 0, j = pipeptr; i < twosym; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % twosym; } syn = syncfilter->run(syn); synccounter += (int) floor(1.0 * (syn - symlen) / NUMTONES + 0.5); update_syncscope(); } void dominoex::eval_s2n() { double s = abs(pipe[pipeptr].vector[currsymbol]); double n = (NUMTONES - 1 ) * abs(pipe[(pipeptr + symlen) % twosym].vector[currsymbol]); sig = decayavg( sig, s, abs( s - sig) > 4 ? 4 : 32); noise = decayavg( noise, n, 64); if (noise) s2n = 20*log10(sig / noise) - 6; else s2n = 0; // metric = 4 * s2n; // To partially offset the increase of noise by (THORNUMTONES -1) // in the noise calculation above, // add 15*log10(THORNUMTONES -1) = 18.4, and multiply by 6 metric = 6 * (s2n + 18.4); metric = metric < 0 ? 0 : metric > 100 ? 100 : metric; display_metric(metric); snprintf(dommsg, sizeof(dommsg), "s/n %3.0f dB", s2n ); put_Status1(dommsg); } int dominoex::rx_process(const double *buf, int len) { cmplx zref, z, *zp; cmplx zarray[1]; int n; if (filter_reset) reset_filters(); if (slowcpu != progdefaults.slowcpu) { slowcpu = progdefaults.slowcpu; reset_filters(); } while (len) { // create analytic signal at first IF zref = cmplx( *buf, *buf ); buf++; hilbert->run(zref, zref); zref = mixer(0, zref); if (progdefaults.DOMINOEX_FILTER) { // filter using fft convolution n = fft->run(zref, &zp); } else { zarray[0] = zref; zp = zarray; n = 1; } if (n) { for (int i = 0; i < n; i++) { // process MAXFFTS sets of sliding FFTs spaced at 1/MAXFFTS bin intervals each of which // is a matched filter for the current symbol length for (int j = 0; j < paths; j++) { // shift in frequency to base band for the sliding DFTs z = mixer(j + 1, zp[i]); // copy current vector to the pipe interleaving the FFT vectors binsfft[j]->run(z, pipe[pipeptr].vector + j, paths ); } if (--synccounter <= 0) { synccounter = symlen; currsymbol = harddecode(); decodesymbol(); synchronize(); // update_syncscope(); eval_s2n(); prev2symbol = prev1symbol; prev1symbol = currsymbol; } pipeptr++; if (pipeptr >= twosym) pipeptr = 0; } } --len; } return 0; } //===================================================================== // dominoex tx modules int dominoex::get_secondary_char() { static unsigned int cptr = 0; char chr; if (cptr >= strSecXmtText.length()) cptr = 0; chr = strSecXmtText[cptr++]; put_sec_char( chr ); return chr; } void dominoex::sendtone(int tone, int duration) { double f, phaseincr; f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2.0; phaseincr = TWOPI * f / samplerate; for (int j = 0; j < duration; j++) { for (int i = 0; i < symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, symlen); } } void dominoex::sendsymbol(int sym) { //static int first = 0; cmplx z; int tone; tone = (txprevtone + 2 + sym) % NUMTONES; txprevtone = tone; if (reverse) tone = (NUMTONES - 1) - tone; sendtone(tone, 1); } void dominoex::sendchar(unsigned char c, int secondary) { if (progdefaults.DOMINOEX_FEC) sendMuPskEX(c, secondary); else { unsigned char *code = dominoex_varienc(c, secondary); sendsymbol(code[0]); // Continuation nibbles all have the MSB set for (int sym = 1; sym < 3; sym++) { if (code[sym] & 0x8) sendsymbol(code[sym]); else break; } } if (!secondary) put_echo_char(c); } void dominoex::sendidle() { sendchar(0, 1); // } void dominoex::sendsecondary() { int c = get_secondary_char(); sendchar(c & 0xFF, 1); } void dominoex::flushtx() { // if (progdefaults.DOMINOEX_FEC) // MuPskFlushTx(); // else { // flush the varicode decoder at the receiver end for (int i = 0; i < 4; i++) sendidle(); // } } int dominoex::tx_process() { modem::tx_process(); int i; switch (txstate) { case TX_STATE_PREAMBLE: if (progdefaults.DOMINOEX_FEC) MuPskClearbits(); sendidle(); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r', 0); if (mode != MODE_DOMINOEXMICRO) { sendchar(2, 0); // STX sendchar('\r', 0); } txstate = TX_STATE_DATA; break; case TX_STATE_DATA: i = get_tx_char(); if (i == GET_TX_CHAR_NODATA) sendsecondary(); else if (i == GET_TX_CHAR_ETX) txstate = TX_STATE_END; else sendchar(i, 0); if (stopflag) txstate = TX_STATE_END; break; case TX_STATE_END: sendchar('\r', 0); if (mode != MODE_DOMINOEXMICRO) { sendchar(4, 0); // EOT sendchar('\r', 0); } txstate = TX_STATE_FLUSH; break; case TX_STATE_FLUSH: flushtx(); cwid(); return -1; } return 0; } //============================================================================= // MultiPsk compatible FEC methods //============================================================================= //============================================================================= // Varicode support methods // MultiPsk varicode is based on a modified MFSK varicode table in which // Character substition is used for secondary text. The resulting table does // NOT contain the full ASCII character set as the primary. Many of the // control codes and characters above 0x80 are lost. //============================================================================= // Convert from Secondary to Primary character unsigned char dominoex::MuPskSec2Pri(int c) { if (c >= 'a' && c <= 'z') c -= 32; c = mupsksec2pri.find(c) != mupsksec2pri.end() ? mupsksec2pri[c] : c; if (c >= 'A' && c <= 'Z') c = c - 'A' + 127; else if (c >= '0' && c <= '9') c = c - '0' + 14; else if (c >= ' ' && c <= '"') c = c - ' ' + 1; else if (c == '_') c = 4; else if (c >= '$' && c <= '&') c = c - '$' + 5; else if (c >= '\'' && c <= '*') c = c - '\'' + 9; else if (c >= '+' && c <= '/') c = c - '+' + 24; else if (c >= ':' && c <= '<') c = c - ':' + 29; else if (c >= '=' && c <= '@') c = c - '=' + 153; else if (c >= '[' && c <= ']') c = c - '[' + 157; else c = '_'; return c; } // Convert Primary to Split Primary / Secondary character unsigned int dominoex::MuPskPriSecChar(unsigned int c) { if (c >= 127 && c < 153) c += ('A' - 127) + 0x100; else if (c >=14 && c < 24) c += ('0' - 14) + 0x100; else if (c >= 1 && c < 4) c += (' ' - 1) + 0x100; else if (c == 4) c = '_' + 0x100; else if (c >= 5 && c < 8) c += ('$' - 5) + 0x100; else if (c >= 9 && c < 13) c += ('\'' - 9) + 0x100; else if (c >= 24 && c < 29) c += ('+' - 24) + 0x100; else if (c >= 29 && c < 32) c += (':' - 29) + 0x100; else if (c >= 153 && c < 157) c += ('=' - 153) + 0x100; else if (c >= 157 && c < 160) c += ('[' - 157) + 0x100; return c; } //============================================================================= // Receive //============================================================================= void dominoex::decodeMuPskSymbol(unsigned char symbol) { int c, ch, met; Mu_symbolpair[0] = Mu_symbolpair[1]; Mu_symbolpair[1] = symbol; Mu_symcounter = Mu_symcounter ? 0 : 1; if (Mu_symcounter) return; c = MuPskDec->decode (Mu_symbolpair, &met); if (c == -1) return; if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; Mu_datashreg = (Mu_datashreg << 1) | !!c; if ((Mu_datashreg & 7) == 1) { ch = varidec(Mu_datashreg >> 1); if (progdefaults.DOMINOEX_FEC) recvchar(MuPskPriSecChar(ch)); Mu_datashreg = 1; } } void dominoex::decodeMuPskEX(int ch) { unsigned char symbols[4]; int c = ch; for (int i = 0; i < 4; i++) { if ((c & 1) == 1) symbols[3-i] = 255; else symbols[3-i] = 1;//-255; c = c / 2; } if (staticburst == true || outofrange == true) symbols[3] = symbols[2] = symbols[1] = symbols[0] = 0; MuPskRxinlv->symbols(symbols); for (int i = 0; i < 4; i++) decodeMuPskSymbol(symbols[i]); } //============================================================================= // Transmit //============================================================================= void dominoex::MuPskFlushTx() { // flush the varicode decoder at the other end // flush the convolutional encoder and interleaver sendsymbol(1); for (int i = 0; i < 107; i++) sendsymbol(0); Mu_bitstate = 0; } void dominoex::MuPskClearbits() { int data = MuPskEnc->encode(0); for (int k = 0; k < 100; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); Mu_bitstate++; if (Mu_bitstate == 4) { MuPskTxinlv->bits(&bitshreg); Mu_bitstate = 0; bitshreg = 0; } } } } // Send MultiPsk FEC varicode with minimalist interleaver void dominoex::sendMuPskEX(unsigned char c, int secondary) { const char *code; if (secondary == 1) c = MuPskSec2Pri(c); else { if (c == 10) return; if ( (c >= 1 && c <= 7) || (c >= 9 && c <= 12) || (c >= 14 && c <= 31) || (c >= 127 && c <= 159)) c = '_'; } code = varienc(c); // if (secondary == 0) // LOG_DEBUG("char=%hhu, code=\"%s\"", c, code); while (*code) { int data = MuPskEnc->encode(*code++ - '0'); // LOG_DEBUG("data=%d", data; for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); Mu_bitstate++; if (Mu_bitstate == 4) { MuPskTxinlv->bits(&bitshreg); // LOG_DEBUG("bitshreg=%d", bitshreg); sendsymbol(bitshreg); // decodeMuPskEX(bitshreg); Mu_bitstate = 0; bitshreg = 0; } } } } fldigi-4.1.06/src/xmlrpcpp/0000775000175000017500000000000013515625026012504 500000000000000fldigi-4.1.06/src/xmlrpcpp/XmlRpcServer.h0000644000175000017500000001266613472115775015211 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVER_H_ #define _XMLRPCSERVER_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" namespace XmlRpc { // An abstract class supporting XML RPC methods class XmlRpcServerMethod; // Class representing connections to specific clients class XmlRpcServerConnection; // Class representing argument and result values class XmlRpcValue; //! A class to handle XML RPC requests class XmlRpcServer : public XmlRpcSource { public: //! Create a server object. XmlRpcServer(); //! Destructor. virtual ~XmlRpcServer(); //! Specify whether introspection is enabled or not. Default is not enabled. void enableIntrospection(bool enabled=true); //! Add a command to the RPC server void addMethod(XmlRpcServerMethod* method); //! Remove a command from the RPC server void removeMethod(XmlRpcServerMethod* method); //! Remove a command from the RPC server by name void removeMethod(const std::string& methodName); //! Look up a method by name XmlRpcServerMethod* findMethod(const std::string& name) const; //! Create a socket, bind to the specified port, and //! set it in listen mode to make it available for clients. //! @param port The port to bind and listen on (zero to choose an arbitrary port) bool bindAndListen(int port, int backlog = 5); //! Get the port number this server is listening on. int getPort(void) const; //! Process client requests for the specified time (in seconds) void work(double timeSeconds); //! Temporarily stop processing client requests and exit the work() method. void exit(); //! Close all connections with clients and the socket file descriptor void shutdown(); //! Introspection support void listMethods(XmlRpcValue& result); //! Parses the request xml, runs the method, generates the response (header+xml). //! Returns a fault response if an error occurs during method execution. virtual std::string executeRequest(std::string const& request); // XmlRpcSource interface implementation //! Handle client connection requests virtual unsigned handleEvent(unsigned eventType); //! Remove a connection from the dispatcher virtual void removeConnection(XmlRpcServerConnection*); protected: // Static data static const char METHODNAME_TAG[]; static const char PARAMS_TAG[]; static const char PARAM_TAG[]; static const std::string SYSTEM_MULTICALL; static const std::string METHODNAME; static const std::string PARAMS; static const std::string FAULTCODE; static const std::string FAULTSTRING; //! Accept a client connection request virtual void acceptConnection(); //! Create a new connection object for processing requests from a specific client. //! If the client is not authorized to connect, close the socket and return 0. virtual XmlRpcServerConnection* createConnection(XmlRpcSocket::Socket socket); //! Hand off a new connection object to a dispatcher. virtual void dispatchConnection(XmlRpcServerConnection* sc); //! Parse the methodName and parameters from the request. //! @returns the methodName std::string parseRequest(std::string const& request, XmlRpcValue& params); //! Execute a named method with the specified params. bool executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); //! Execute multiple calls and return the results in an array. //! System.multicall implementation bool executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); //! Construct a response from the result XML. std::string generateResponse(std::string const& resultXml); //! Construct a fault response. std::string generateFaultResponse(std::string const& msg, int errorCode = -1); //! Return the appropriate headers for the response. std::string generateHeader(std::string const& body); //! Whether the introspection API is supported by this server bool _introspectionEnabled; //! Event dispatcher XmlRpcDispatch _disp; //! Collection of methods. This could be a set keyed on method name if we wanted... typedef std::map< std::string, XmlRpcServerMethod* > MethodMap; //! Registered RPC methods. MethodMap _methods; //! List all registered RPC methods (only available if introspection is enabled) XmlRpcServerMethod* _listMethods; //! Return help string for a specified method (only available if introspection is enabled) XmlRpcServerMethod* _methodHelp; }; } // namespace XmlRpc #endif //_XMLRPCSERVER_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcSource.h0000644000175000017500000000642213472115775015174 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSOURCE_H_ #define _XMLRPCSOURCE_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include "XmlRpcSocket.h" namespace XmlRpc { //! Proxy for Ssl data to avoid including headers here. struct SslProxy; //! An RPC source represents a file descriptor to monitor class XmlRpcSource { public: //! Constructor //! @param fd The socket file descriptor to monitor. //! @param deleteOnClose If true, the object deletes itself when close is called. XmlRpcSource(XmlRpcSocket::Socket fd = XmlRpcSocket::Invalid, bool deleteOnClose = false); //! Destructor virtual ~XmlRpcSource(); //! Return the file descriptor being monitored. XmlRpcSocket::Socket getfd() const { return _fd; } //! Specify the file descriptor to monitor. void setfd(XmlRpcSocket::Socket fd) { _fd = fd; } //! Return whether the file descriptor should be kept open if it is no longer monitored. bool getKeepOpen() const { return _keepOpen; } //! Specify whether the file descriptor should be kept open if it is no longer monitored. void setKeepOpen(bool b=true) { _keepOpen = b; } //! Return whether ssl is enabled. bool getSslEnabled() const { return _sslEnabled; } //! Specify whether to enable ssl. Use getSslEnabled() to verify that Ssl is available. void setSslEnabled(bool b=true); //! Close the owned fd. If deleteOnClose was specified at construction, the object is deleted. virtual void close(); //! Return true to continue monitoring this source virtual unsigned handleEvent(unsigned eventType) = 0; protected: // Execution processing helpers virtual bool doConnect(); //! Read text from the source. Returns false on error. bool nbRead(std::string& s, bool *eof); //! Write text to the source. Returns false on error. bool nbWrite(std::string const& s, int *bytesSoFar); private: // Socket. This is an int for linux/unix, and unsigned on win32, and unsigned __int64 on win64. // Casting to int/long/unsigned on win64 is a bad idea. XmlRpcSocket::Socket _fd; // In the server, a new source (XmlRpcServerConnection) is created // for each connected client. When each connection is closed, the // corresponding source object is deleted. bool _deleteOnClose; // In the client, keep connections open if you intend to make multiple calls. bool _keepOpen; // Enable use of SSL bool _sslEnabled; // SSL data SslProxy *_ssl; }; } // namespace XmlRpc #endif //_XMLRPCSOURCE_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcMutex.h0000644000175000017500000000334513472115775015037 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCMUTEX_H_ #define _XMLRPCMUTEX_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif namespace XmlRpc { //! A simple platform-independent mutex API implemented for posix and windows. class XmlRpcMutex { public: //! Construct a Mutex object. XmlRpcMutex() : _pMutex(0) {} //! Destroy a Mutex object. ~XmlRpcMutex(); //! Wait for the mutex to be available and then acquire the lock. void acquire(); //! Release the mutex. void release(); //! Utility class to acquire a mutex at construction and release it when destroyed. struct AutoLock { //! Acquire the mutex at construction AutoLock(XmlRpcMutex& m) : _m(m) { _m.acquire(); } //! Release at destruction ~AutoLock() { _m.release(); } //! The mutex being held XmlRpcMutex& _m; }; private: //! Native Mutex object void* _pMutex; }; // class XmlRpcMutex } // namespace XmlRpc #endif // _XMLRPCMUTEX_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcClient.cpp0000644000175000017500000003612513472115775015510 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcClient.h" #include "XmlRpcSocket.h" #include "XmlRpc.h" #include "XmlRpcBase64.h" // For HTTP authentication encoding #include #include #include #include #include using namespace XmlRpc; using namespace std; // Static data const char REQUEST_BEGIN[] = "\r\n" ""; const char REQUEST_END_METHODNAME[] = "\r\n"; const char PARAMS_TAG[] = ""; const char PARAMS_ETAG[] = ""; const char PARAM_TAG[] = ""; const char PARAM_ETAG[] = ""; const char REQUEST_END[] = "\r\n"; XmlRpcClient::XmlRpcClient(const char* host, int port, const char* uri/*=0*/) { XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d.", host, port); _host = host; _port = port; if (uri && *uri) _uri = uri; else _uri = "/RPC2"; _connectionState = NO_CONNECTION; _executing = false; _eof = false; // Default to keeping the connection open until an explicit close is done setKeepOpen(); } XmlRpcClient::XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri/*=0*/) { XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d, login %s.", host, port, login); _host = host; _port = port; _login = login ? login : ""; _password = password ? password : ""; _uri = uri ? uri : "/RPC2"; _connectionState = NO_CONNECTION; _executing = false; _eof = false; // Default to keeping the connection open until an explicit close is done setKeepOpen(); } XmlRpcClient::~XmlRpcClient() { XmlRpcUtil::log(1, "XmlRpcClient dtor client: host %s, port %d.", _host.c_str(), _port); if (_connectionState != NO_CONNECTION) close(); } // Close the owned fd void XmlRpcClient::close() { XmlRpcUtil::log(4, "XmlRpcClient::close: fd %d.", getfd()); _connectionState = NO_CONNECTION; _disp.exit(); _disp.removeSource(this); XmlRpcSource::close(); } // Clear the referenced flag even if exceptions or errors occur. struct ClearFlagOnExit { ClearFlagOnExit(bool& flag) : _flag(flag) {} ~ClearFlagOnExit() { _flag = false; } bool& _flag; }; // Execute the named procedure on the remote server. // Params should be an array of the arguments for the method. // Returns true if the request was sent and a result received (although the result // might be a fault). bool XmlRpcClient::execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result, double timeoutSeconds) { XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s (_connectionState %d).", method, _connectionState); // This is not a thread-safe operation, if you want to do multithreading, use separate // clients for each thread. If you want to protect yourself from multiple threads // accessing the same client, replace this code with a real mutex. if (_executing) return false; _executing = true; ClearFlagOnExit cf(_executing); _sendAttempts = 0; _isFault = false; if ( ! setupConnection()) return false; if ( ! generateRequest(method, params)) return false; result.clear(); // Process until either a response is received or the timeout period passes _disp.work(timeoutSeconds); if (_connectionState != IDLE || ! parseResponse(result)) return false; XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s completed.", method); _response.clear(); return true; } // XmlRpcSource interface implementation // Handle server responses. Called by the event dispatcher during execute. unsigned XmlRpcClient::handleEvent(unsigned eventType) { if (eventType == XmlRpcDispatch::Exception) { //if (XmlRpcSocket::nonFatalError()) // return (_connectionState == WRITE_REQUEST) // ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; if (_connectionState == WRITE_REQUEST && _bytesWritten == 0) XmlRpcUtil::error("Error in XmlRpcClient::handleEvent: could not connect to server (%s).", XmlRpcSocket::getErrorMsg().c_str()); else XmlRpcUtil::error("Error in XmlRpcClient::handleEvent (state %d): %s.", _connectionState, XmlRpcSocket::getErrorMsg().c_str()); return 0; } if (_connectionState == WRITE_REQUEST) if ( ! writeRequest()) return 0; if (_connectionState == READ_HEADER) if ( ! readHeader()) return 0; if (_connectionState == READ_RESPONSE) if ( ! readResponse()) return 0; // This should probably always ask for Exception events too return (_connectionState == WRITE_REQUEST) ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; } // Create the socket connection to the server if necessary bool XmlRpcClient::setupConnection() { // If an error occurred last time through, or if the server closed the connection, close our end if ((_connectionState != NO_CONNECTION && _connectionState != IDLE) || _eof) close(); _eof = false; if (_connectionState == NO_CONNECTION) if (! doConnect()) return false; // Prepare to write the request _connectionState = WRITE_REQUEST; _bytesWritten = 0; // Notify the dispatcher to listen on this source (calls handleEvent when the socket is writable) _disp.removeSource(this); // Make sure nothing is left over _disp.addSource(this, XmlRpcDispatch::WritableEvent | XmlRpcDispatch::Exception); return true; } // Connect to the xmlrpc server bool XmlRpcClient::doConnect() { XmlRpcSocket::Socket fd = XmlRpcSocket::socket(); if (fd == XmlRpcSocket::Invalid) { XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not create socket (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcClient::doConnect: fd %d.", fd); this->setfd(fd); // Don't block on connect/reads/writes if ( ! XmlRpcSocket::setNonBlocking(fd)) { this->close(); XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not set socket to non-blocking IO mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } if ( ! XmlRpcSocket::connect(fd, _host, _port)) { this->close(); XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not connect to server (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } return XmlRpcSource::doConnect(); } // Encode the request to call the specified method with the specified parameters into xml bool XmlRpcClient::generateRequest(const char* methodName, XmlRpcValue const& params) { std::string body = REQUEST_BEGIN; body += methodName; body += REQUEST_END_METHODNAME; // If params is an array, each element is a separate parameter if (params.valid()) { body += PARAMS_TAG; if (params.getType() == XmlRpcValue::TypeArray) { for (int i=0; i base64data; int iostatus = 0; xmlrpc_base64 encoder; std::back_insert_iterator > ins = std::back_inserter(base64data); std::string authBuf = _login + ":" + _password; encoder.put(authBuf.begin(), authBuf.end(), ins, iostatus, xmlrpc_base64<>::crlf()); header += "Authorization: Basic "; std::string authEnc(base64data.begin(), base64data.end()); // handle pesky linefeed characters string::size_type lf; while ( (lf = authEnc.find("\r")) != string::npos ) { authEnc.erase(lf, 1); } while ( (lf = authEnc.find("\n")) != string::npos ) { authEnc.erase(lf, 1); } header += authEnc; header += "\r\n"; } header += "Content-Type: text/xml\r\nContent-length: "; sprintf(buff,"%d\r\n\r\n", static_cast(body.size())); return header + buff; } bool XmlRpcClient::writeRequest() { if (_bytesWritten == 0) XmlRpcUtil::log(5, "XmlRpcClient::writeRequest (attempt %d):\n%s\n", _sendAttempts+1, _request.c_str()); // Try to write the request if ( ! nbWrite(_request, &_bytesWritten)) { XmlRpcUtil::error("Error in XmlRpcClient::writeRequest: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcClient::writeRequest: wrote %d of %d bytes.", _bytesWritten, _request.length()); // Wait for the result if (_bytesWritten == int(_request.length())) { _header = ""; _response = ""; _connectionState = READ_HEADER; } return true; } // Read the header from the response bool XmlRpcClient::readHeader() { // Read available data if ( ! nbRead(_header, &_eof) || (_eof && _header.length() == 0)) { // If we haven't read any data yet and this is a keep-alive connection, the server may // have timed out, so we try one more time. if (getKeepOpen() && _header.length() == 0 && _sendAttempts++ == 0) { XmlRpcUtil::log(4, "XmlRpcClient::readHeader: re-trying connection"); XmlRpcSource::close(); _connectionState = NO_CONNECTION; _eof = false; return setupConnection(); } XmlRpcUtil::error("Error in XmlRpcClient::readHeader: error while reading header (%s) on fd %d.", XmlRpcSocket::getErrorMsg().c_str(), getfd()); return false; } XmlRpcUtil::log(4, "XmlRpcClient::readHeader: client has read %d bytes", _header.length()); return parseHeader(); } bool XmlRpcClient::parseHeader() { char const *hp = _header.c_str(); // Start of header char const *ep = hp + _header.length(); // End of string char const *bp = 0; // Start of body char const *lp = 0; // Start of content-length value std::string const CONTINUE100("100 Continue"); int nc100 = int(CONTINUE100.length()); for (char const *cp = hp; (bp == 0) && (cp < ep); ++cp) { if ((ep - cp > 16) && (strncasecmp(cp, "Content-length: ", 16) == 0)) { lp = cp + 16; } else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0)) { if (cp - hp > nc100 && strncmp(cp-CONTINUE100.length(), CONTINUE100.c_str(), CONTINUE100.length()) == 0) cp += 3; else bp = cp + 4; } else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0)) { if (cp - hp > nc100 && strncmp(cp-CONTINUE100.length(), CONTINUE100.c_str(), CONTINUE100.length()) == 0) ++ cp; else bp = cp + 2; } } // If we haven't gotten the entire header yet, return (keep reading) if (bp == 0) { if (_eof) // EOF in the middle of a response is an error { XmlRpcUtil::error("Error in XmlRpcClient::readHeader: EOF while reading header"); return false; // Close the connection } return true; // Keep reading } // Decode content length if (lp == 0) { XmlRpcUtil::error("Error XmlRpcClient::readHeader: No Content-length specified"); return false; // We could try to figure it out by parsing as we read, but for now... } _contentLength = atoi(lp); if (_contentLength <= 0) { XmlRpcUtil::error("Error in XmlRpcClient::readHeader: Invalid Content-length specified (%d).", _contentLength); return false; } XmlRpcUtil::log(4, "client read content length: %d", _contentLength); // Otherwise copy non-header data to response buffer and set state to read response. _response = bp; _header = ""; // should parse out any interesting bits from the header (connection, etc)... _connectionState = READ_RESPONSE; return true; // Continue monitoring this source } bool XmlRpcClient::readResponse() { // If we dont have the entire response yet, read available data if (int(_response.length()) < _contentLength) { if ( ! nbRead(_response, &_eof)) { XmlRpcUtil::error("Error in XmlRpcClient::readResponse: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } // If we haven't gotten the entire _response yet, return (keep reading) if (int(_response.length()) < _contentLength) { if (_eof) { XmlRpcUtil::error("Error in XmlRpcClient::readResponse: EOF while reading response"); return false; } return true; } } // Otherwise, parse and return the result XmlRpcUtil::log(3, "XmlRpcClient::readResponse (read %d bytes)", _response.length()); XmlRpcUtil::log(5, "response:\n%s", _response.c_str()); _connectionState = IDLE; return false; // Stop monitoring this source (causes return from work) } // Convert the response xml into a result value bool XmlRpcClient::parseResponse(XmlRpcValue& result) { std::string r; _response.swap(r); // Parse response xml into result bool emptyParam; int offset = 0; if ( ! XmlRpcUtil::findTag("methodResponse",r,&offset,&emptyParam) || emptyParam) { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response - no methodResponse. Response:\n%s", r.c_str()); return false; } // Expect either ... or ... if (XmlRpcUtil::nextTagIs("params",r,&offset,&emptyParam) && XmlRpcUtil::nextTagIs("param",r,&offset,&emptyParam)) { if (emptyParam) { result = 0; // No result? } else if ( ! result.fromXml(r, &offset)) { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response value. Response:\n%s", r.c_str()); return false; } } else if (XmlRpcUtil::nextTagIs("fault",r,&offset,&emptyParam)) { _isFault = true; if (emptyParam || ! result.fromXml(r, &offset)) { result = 0; // No result? return false; } } else { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response - no param or fault tag. Response:\n%s", r.c_str()); return false; } return result.valid(); } fldigi-4.1.06/src/xmlrpcpp/XmlRpcException.h0000644000175000017500000000313113472115776015665 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCEXCEPTION_H_ #define _XMLRPCEXCEPTION_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #ifndef MAKEDEPEND # include #endif namespace XmlRpc { //! A class representing an error. //! If server methods throw this exception, a fault response is returned //! to the client. class XmlRpcException { public: //! Constructor //! @param message A descriptive error message //! @param code An integer error code XmlRpcException(const std::string& message, int code=-1) : _message(message), _code(code) {} //! Return the error message. const std::string& getMessage() const { return _message; } //! Return the error code. int getCode() const { return _code; } private: std::string _message; int _code; }; } #endif // _XMLRPCEXCEPTION_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcMutex.cpp0000644000175000017500000000342413472115775015370 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #if defined(XMLRPC_THREADS) #include #include "XmlRpcMutex.h" #if defined(_WINDOWS) # define WIN32_LEAN_AND_MEAN # include #else # include #endif using namespace XmlRpc; //! Destructor. XmlRpcMutex::~XmlRpcMutex() { if (_pMutex) { #if defined(_WINDOWS) ::CloseHandle((HANDLE)_pMutex); #else ::pthread_mutex_destroy((pthread_mutex_t*)_pMutex); delete _pMutex; #endif _pMutex = 0; } } //! Wait for the mutex to be available and then acquire the lock. void XmlRpcMutex::acquire() { #if defined(_WINDOWS) if ( ! _pMutex) _pMutex = ::CreateMutex(0, TRUE, 0); else ::WaitForSingleObject(_pMutex, INFINITE); #else if ( ! _pMutex) { _pMutex = new pthread_mutex_t; ::pthread_mutex_init((pthread_mutex_t*)_pMutex, 0); } ::pthread_mutex_lock((pthread_mutex_t*)_pMutex); #endif } //! Release the mutex. void XmlRpcMutex::release() { if (_pMutex) #if defined(_WINDOWS) ::ReleaseMutex(_pMutex); #else ::pthread_mutex_unlock((pthread_mutex_t*)_pMutex); #endif } #endif // XMLRPC_THREADS fldigi-4.1.06/src/xmlrpcpp/XmlRpcSource.cpp0000664000175000017500000001125713507401434015520 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcSource.h" #include "XmlRpcUtil.h" #if defined(_WINDOWS) #undef _WINSOCKAPI_ # include # include #else extern "C" { # include # include } #endif #if USE_OPENSSL_XMLRPC # include # include # include # include # include #endif namespace XmlRpc { struct SslProxy { #if USE_OPENSSL_XMLRPC SSL_CTX* _ssl_ctx; SSL_METHOD* _ssl_meth; SSL* _ssl_ssl; #endif }; XmlRpcSource::XmlRpcSource(XmlRpcSocket::Socket fd /*= -1*/, bool deleteOnClose /*= false*/) : _fd(fd) , _deleteOnClose(deleteOnClose) , _keepOpen(false) , _sslEnabled(false) , _ssl(0) { } XmlRpcSource::~XmlRpcSource() { delete _ssl; } void XmlRpcSource::setSslEnabled(bool b /*=true*/) { #if USE_OPENSSL_XMLRPC _sslEnabled = b; #endif } bool XmlRpcSource::doConnect() { #if USE_OPENSSL_XMLRPC // Perform SSL if needed if (_sslEnabled) { _ssl = new SslProxy; SSLeay_add_ssl_algorithms(); _ssl->_ssl_meth = const_cast(SSLv23_client_method()); SSL_load_error_strings(); _ssl->_ssl_ctx = SSL_CTX_new(_ssl->_ssl_meth); _ssl->_ssl_ssl = SSL_new(_ssl->_ssl_ctx); SSL_set_fd(_ssl->_ssl_ssl, _fd); return SSL_connect(_ssl->_ssl_ssl) == 1; } #endif return true; } // Read available text from the specified socket. Returns false on error. bool XmlRpcSource::nbRead(std::string& s, bool *eof) { const int READ_SIZE = 4096; // Number of bytes to attempt to read at a time char readBuf[READ_SIZE]; bool wouldBlock = false; *eof = false; while ( ! wouldBlock && ! *eof) { int n; #if USE_OPENSSL_XMLRPC // Perform SSL if needed if (_ssl && _ssl->_ssl_ssl) { n = SSL_read(_ssl->_ssl_ssl, readBuf, READ_SIZE-1); } else #endif #if defined(_WINDOWS) n = recv(_fd, readBuf, READ_SIZE-1, 0); #else n = read(_fd, readBuf, READ_SIZE-1); #endif XmlRpcUtil::log(5, "XmlRpcSocket::nbRead: read/recv returned %d.", n); if (n > 0) { readBuf[n] = 0; s.append(readBuf, n); } else if (n == 0) { *eof = true; } else if (XmlRpcSocket::nonFatalError()) { wouldBlock = true; } else { return false; // Error } } return true; } // Write text to the socket. Returns false on error. bool XmlRpcSource::nbWrite(std::string const& s, int *bytesSoFar) { int nToWrite = int(s.length()) - *bytesSoFar; const char *sp = s.c_str() + *bytesSoFar; bool wouldBlock = false; while ( nToWrite > 0 && ! wouldBlock ) { int n; #if USE_OPENSSL_XMLRPC // Perform SSL if needed if (_ssl && _ssl->_ssl_ssl) { n = SSL_write(_ssl->_ssl_ssl, sp, nToWrite); } else #endif #if defined(_WINDOWS) n = send(_fd, sp, nToWrite, 0); #else n = write(_fd, sp, nToWrite); #endif XmlRpcUtil::log(5, "XmlRpcSocket::nbWrite: send/write returned %d.", n); if (n > 0) { sp += n; *bytesSoFar += n; nToWrite -= n; } else if (XmlRpcSocket::nonFatalError()) { wouldBlock = true; } else { return false; // Error } } return true; } void XmlRpcSource::close() { #if USE_OPENSSL_XMLRPC if (_ssl && _ssl->_ssl_ssl) { SSL_shutdown(_ssl->_ssl_ssl); // Should close be called here ? ... SSL_free(_ssl->_ssl_ssl); SSL_CTX_free(_ssl->_ssl_ctx); delete _ssl; _ssl = 0; } #endif if ( (int)_fd != -1) { XmlRpcUtil::log(2,"XmlRpcSource::close: closing socket %d.", _fd); XmlRpcSocket::close(_fd); _fd = -1; } if (_deleteOnClose) { XmlRpcUtil::log(2,"XmlRpcSource::close: deleting this"); _deleteOnClose = false; delete this; } } } // namespace XmlRpc fldigi-4.1.06/src/xmlrpcpp/XmlRpcServer.cpp0000644000175000017500000003320513472115775015534 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcServer.h" #include "XmlRpcServerConnection.h" #include "XmlRpcServerMethod.h" #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #include "XmlRpcException.h" #include "XmlRpc.h" #include using namespace XmlRpc; // Static data const char XmlRpcServer::METHODNAME_TAG[] = "methodName"; const char XmlRpcServer::PARAMS_TAG[] = "params"; const char XmlRpcServer::PARAM_TAG[] = "param"; const std::string XmlRpcServer::METHODNAME = "methodName"; const std::string XmlRpcServer::PARAMS = "params"; const std::string XmlRpcServer::FAULTCODE = "faultCode"; const std::string XmlRpcServer::FAULTSTRING = "faultString"; XmlRpcServer::XmlRpcServer() { _introspectionEnabled = false; _listMethods = 0; _methodHelp = 0; } XmlRpcServer::~XmlRpcServer() { this->shutdown(); _methods.clear(); delete _listMethods; delete _methodHelp; } // Add a command to the RPC server void XmlRpcServer::addMethod(XmlRpcServerMethod* method) { _methods[method->name()] = method; } // Remove a command from the RPC server void XmlRpcServer::removeMethod(XmlRpcServerMethod* method) { MethodMap::iterator i = _methods.find(method->name()); if (i != _methods.end()) _methods.erase(i); } // Remove a command from the RPC server by name void XmlRpcServer::removeMethod(const std::string& methodName) { MethodMap::iterator i = _methods.find(methodName); if (i != _methods.end()) _methods.erase(i); } // Look up a method by name XmlRpcServerMethod* XmlRpcServer::findMethod(const std::string& name) const { MethodMap::const_iterator i = _methods.find(name); if (i == _methods.end()) return 0; return i->second; } // Create a socket, bind to the specified port, and // set it in listen mode to make it available for clients. bool XmlRpcServer::bindAndListen(int port, int backlog /*= 5*/) { XmlRpcSocket::Socket fd = XmlRpcSocket::socket(); if (XmlRpcSocket::Invalid == fd) { XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not create socket (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } this->setfd(fd); // Don't block on reads/writes if ( ! XmlRpcSocket::setNonBlocking(fd)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set socket to non-blocking input mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Allow this port to be re-bound immediately so server re-starts are not delayed if ( ! XmlRpcSocket::setReuseAddr(fd)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set SO_REUSEADDR socket option (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Bind to the specified port on the default interface if ( ! XmlRpcSocket::bind(fd, port)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not bind to specified port (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Set in listening mode if ( ! XmlRpcSocket::listen(fd, backlog)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set socket in listening mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(2, "XmlRpcServer::bindAndListen: server listening on port %d fd %d", port, fd); // Notify the dispatcher to listen on this source when we are in work() _disp.addSource(this, XmlRpcDispatch::ReadableEvent); return true; } // Get port number that this server is listening on int XmlRpcServer::getPort(void) const { return XmlRpcSocket::getPort(getfd()); } // Process client requests for the specified time (in seconds) void XmlRpcServer::work(double timeSeconds) { XmlRpcUtil::log(2, "XmlRpcServer::work: waiting for a connection"); _disp.work(timeSeconds); } // Handle input on the server socket by accepting the connection // and reading the rpc request. unsigned XmlRpcServer::handleEvent(unsigned mask) { acceptConnection(); return XmlRpcDispatch::ReadableEvent; // Continue to monitor this fd } // Accept a client connection request and create a connection to // handle method calls from the client. void XmlRpcServer::acceptConnection() { XmlRpcSocket::Socket s = XmlRpcSocket::accept(this->getfd()); XmlRpcUtil::log(2, "XmlRpcServer::acceptConnection: socket %d", s); if (XmlRpcSocket::Invalid == s) { //this->close(); XmlRpcUtil::error("XmlRpcServer::acceptConnection: Could not accept connection (%s).", XmlRpcSocket::getErrorMsg().c_str()); } else if ( ! XmlRpcSocket::setNonBlocking(s)) { XmlRpcSocket::close(s); XmlRpcUtil::error("XmlRpcServer::acceptConnection: Could not set socket to non-blocking input mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); } else // Notify the dispatcher to listen for input on this source when we are in work() { XmlRpcUtil::log(2, "XmlRpcServer::acceptConnection: creating a connection"); XmlRpcServerConnection* c = this->createConnection(s); if (c) this->dispatchConnection(c); } } // Create a new connection object for processing requests from a specific client. XmlRpcServerConnection* XmlRpcServer::createConnection(XmlRpcSocket::Socket s) { // Specify that the connection object be deleted when it is closed return new XmlRpcServerConnection(s, this, true); } // Hand off a new connection to a dispatcher void XmlRpcServer::dispatchConnection(XmlRpcServerConnection* sc) { _disp.addSource(sc, XmlRpcDispatch::ReadableEvent); } // Remove a connection. Called by the connection when it closes down. void XmlRpcServer::removeConnection(XmlRpcServerConnection* sc) { _disp.removeSource(sc); } // Stop processing client requests void XmlRpcServer::exit() { _disp.exit(); } // Close the server socket file descriptor and stop monitoring connections void XmlRpcServer::shutdown() { // This closes and destroys all connections as well as closing this socket _disp.clear(); } // Introspection support static const std::string LIST_METHODS("system.listMethods"); static const std::string METHOD_HELP("system.methodHelp"); static const std::string MULTICALL("system.multicall"); // List all methods available on a server class ListMethods : public XmlRpcServerMethod { public: ListMethods(XmlRpcServer* s) : XmlRpcServerMethod(LIST_METHODS, s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { _server->listMethods(result); } std::string help() { return std::string("List all methods available on a server as an array of strings"); } }; // Retrieve the help string for a named method class MethodHelp : public XmlRpcServerMethod { public: MethodHelp(XmlRpcServer* s) : XmlRpcServerMethod(METHOD_HELP, s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { if (params[0].getType() != XmlRpcValue::TypeString) throw XmlRpcException(METHOD_HELP + ": Invalid argument type"); XmlRpcServerMethod* m = _server->findMethod(params[0]); if ( ! m) throw XmlRpcException(METHOD_HELP + ": Unknown method name"); result = m->help(); } std::string help() { return std::string("Retrieve the help string for a named method"); } }; // Specify whether introspection is enabled or not. Default is enabled. void XmlRpcServer::enableIntrospection(bool enabled) { if (_introspectionEnabled == enabled) return; _introspectionEnabled = enabled; if (enabled) { if ( ! _listMethods) { _listMethods = new ListMethods(this); _methodHelp = new MethodHelp(this); } else { addMethod(_listMethods); addMethod(_methodHelp); } } else { removeMethod(LIST_METHODS); removeMethod(METHOD_HELP); } } void XmlRpcServer::listMethods(XmlRpcValue& result) { int i = 0; result.setSize(int(_methods.size())+1); for (MethodMap::iterator it=_methods.begin(); it != _methods.end(); ++it) result[i++] = it->first; // Multicall support is built into XmlRpcServer::executeRequest result[i] = MULTICALL; } // Parse the request, run the method, generate a response string. std::string XmlRpcServer::executeRequest(std::string const& request) { XmlRpcValue params, resultValue; std::string methodName = parseRequest(request, params); XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: server calling method '%s'", methodName.c_str()); std::string response; try { if ( ! executeMethod(methodName, params, resultValue) && ! executeMulticall(methodName, params, resultValue)) response = generateFaultResponse(methodName + ": unknown method name"); else response = generateResponse(resultValue.toXml()); } catch (const XmlRpcException& fault) { XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: fault %s.", fault.getMessage().c_str()); response = generateFaultResponse(fault.getMessage(), fault.getCode()); } return response; } // Parse the method name and the argument values from the request. std::string XmlRpcServer::parseRequest(std::string const& request, XmlRpcValue& params) { std::string methodName; int offset = 0; // Number of chars parsed from the request bool emptyTag; if (XmlRpcUtil::parseTag(METHODNAME_TAG, request, &offset, methodName) && XmlRpcUtil::findTag(PARAMS_TAG, request, &offset, &emptyTag) && ! emptyTag) { int nArgs = 0; while (XmlRpcUtil::nextTagIs(PARAM_TAG, request, &offset, &emptyTag)) { if (emptyTag) { params[nArgs++] = XmlRpcValue(""); } else { params[nArgs++] = XmlRpcValue(request, &offset); (void) XmlRpcUtil::nextTagIsEnd(PARAM_TAG, request, &offset); } } (void) XmlRpcUtil::nextTagIsEnd(PARAMS_TAG, request, &offset); } return methodName; } // Execute a named method with the specified params. bool XmlRpcServer::executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result) { XmlRpcServerMethod* method = findMethod(methodName); if ( ! method) return false; method->execute(params, result); // Ensure a valid result value if ( ! result.valid()) result = std::string(); return true; } // Execute multiple calls and return the results in an array. bool XmlRpcServer::executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result) { if (methodName != MULTICALL) return false; // There ought to be 1 parameter, an array of structs if (params.size() != 1 || params[0].getType() != XmlRpcValue::TypeArray) throw XmlRpcException(MULTICALL + ": Invalid argument (expected an array)"); int nc = params[0].size(); result.setSize(nc); for (int i=0; i\r\n" "\r\n\t"; const char RESPONSE_2[] = "\r\n\r\n"; std::string body = RESPONSE_1 + resultXml + RESPONSE_2; std::string header = generateHeader(body); std::string response = header + body; XmlRpcUtil::log(5, "XmlRpcServer::generateResponse:\n%s\n", response.c_str()); return response; } // Prepend http headers std::string XmlRpcServer::generateHeader(std::string const& body) { std::string header = "HTTP/1.1 200 OK\r\n" "Server: "; header += XMLRPC_VERSION; header += "\r\n" "Content-Type: text/xml\r\n" "Content-length: "; char buffLen[40]; sprintf(buffLen,"%d\r\n\r\n", static_cast(body.size())); return header + buffLen; } std::string XmlRpcServer::generateFaultResponse(std::string const& errorMsg, int errorCode) { const char RESPONSE_1[] = "\r\n" "\r\n\t"; const char RESPONSE_2[] = "\r\n\r\n"; XmlRpcValue faultStruct; faultStruct[FAULTCODE] = errorCode; faultStruct[FAULTSTRING] = errorMsg; std::string body = RESPONSE_1 + faultStruct.toXml() + RESPONSE_2; std::string header = generateHeader(body); return header + body; } fldigi-4.1.06/src/xmlrpcpp/XmlRpcDispatch.cpp0000644000175000017500000001532013472115775016023 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" #include "XmlRpcUtil.h" #include #include #if defined(__FreeBSD__) || defined(__OpenBSD__) # ifdef USE_FTIME # include # endif #else # include #endif // __FreeBSD__ #if defined(_WINDOWS) #undef _WINSOCKAPI_ # include # define USE_FTIME # if defined(_MSC_VER) # define timeb _timeb # define ftime _ftime # endif #else # include #endif // _WINDOWS using namespace XmlRpc; XmlRpcDispatch::XmlRpcDispatch() { _endTime = -1.0; _doClear = false; _inWork = false; } XmlRpcDispatch::~XmlRpcDispatch() { } // Monitor this source for the specified events and call its event handler // when the event occurs void XmlRpcDispatch::addSource(XmlRpcSource* source, unsigned mask) { _sources.push_back(MonitoredSource(source, mask)); } // Stop monitoring this source. Does not close the source. void XmlRpcDispatch::removeSource(XmlRpcSource* source) { for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) if (it->getSource() == source) { _sources.erase(it); break; } } // Modify the types of events to watch for on this source void XmlRpcDispatch::setSourceEvents(XmlRpcSource* source, unsigned eventMask) { for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) if (it->getSource() == source) { it->getMask() = eventMask; break; } } // Watch current set of sources and process events void XmlRpcDispatch::work(double timeoutSeconds) { // Compute end time double timeNow = getTime(); _endTime = (timeoutSeconds < 0.0) ? -1.0 : (timeNow + timeoutSeconds); _doClear = false; _inWork = true; // Only work while there is something to monitor while (_sources.size() > 0) { // Wait for and dispatch events if ( ! waitForAndProcessEvents(timeoutSeconds)) { _inWork = false; return; } // Check whether to clear all sources if (_doClear) { SourceList sourcesToClose; _sources.swap(sourcesToClose); for (SourceList::iterator it=sourcesToClose.begin(); it!=sourcesToClose.end(); ++it) { XmlRpcSource *src = it->getSource(); src->close(); } _doClear = false; } // Check whether end time has passed or exit has been called if (_endTime == 0.0) // Exit { break; } else if (_endTime > 0.0) // Check for timeout { double t = getTime(); if (t > _endTime) break; // Decrement timeout by elapsed time timeoutSeconds -= (t - timeNow); if (timeoutSeconds < 0.0) timeoutSeconds = 0.0; // Shouldn't happen but its fp math... timeNow = t; } } _inWork = false; } // Exit from work routine. Presumably this will be called from // one of the source event handlers. void XmlRpcDispatch::exit() { _endTime = 0.0; // Return from work asap } // Clear all sources from the monitored sources list void XmlRpcDispatch::clear() { if (_inWork) { _doClear = true; // Finish reporting current events before clearing } else { SourceList sourcesToClose; _sources.swap(sourcesToClose); for (SourceList::iterator it=sourcesToClose.begin(); it!=sourcesToClose.end(); ++it) it->getSource()->close(); } } // Time utility- return time in seconds double XmlRpcDispatch::getTime() { #ifdef USE_FTIME struct timeb tbuff; ftime(&tbuff); return ((double) tbuff.time + ((double)tbuff.millitm / 1000.0) + ((double) tbuff.timezone * 60)); #else struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return (tv.tv_sec + tv.tv_usec / 1000000.0); #endif /* USE_FTIME */ } // Wait for I/O on any source, timeout, or interrupt signal. bool XmlRpcDispatch::waitForAndProcessEvents(double timeoutSeconds) { // Construct the sets of descriptors we are interested in fd_set inFd, outFd, excFd; FD_ZERO(&inFd); FD_ZERO(&outFd); FD_ZERO(&excFd); XmlRpcSocket::Socket maxFd = 0; for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) { XmlRpcSocket::Socket fd = it->getSource()->getfd(); if (it->getMask() & ReadableEvent) FD_SET(fd, &inFd); if (it->getMask() & WritableEvent) FD_SET(fd, &outFd); if (it->getMask() & Exception) FD_SET(fd, &excFd); if (it->getMask() && fd > maxFd) maxFd = fd; } // Check for events int nEvents; if (_endTime < 0.0) { nEvents = select(int(maxFd+1), &inFd, &outFd, &excFd, NULL); } else { struct timeval tv; tv.tv_sec = (int)floor(timeoutSeconds); tv.tv_usec = ((int)floor(1000000.0 * (timeoutSeconds-floor(timeoutSeconds)))) % 1000000; nEvents = select(int(maxFd+1), &inFd, &outFd, &excFd, &tv); } if (nEvents < 0 && errno != EINTR) { XmlRpcUtil::error("Error in XmlRpcDispatch::work: error in select (%d).", nEvents); return false; } // Process events. Copy source list to avoid invalidating iterator by removing sources. SourceList s(_sources); for (SourceList::iterator it=s.begin(); it != s.end(); ++it) { XmlRpcSource* src = it->getSource(); XmlRpcSocket::Socket fd = src->getfd(); if (fd <= maxFd) { // handleEvent is called once per event type signalled unsigned newMask = 0; int nset = 0; if (FD_ISSET(fd, &inFd)) { newMask |= src->handleEvent(ReadableEvent); ++nset; } if (FD_ISSET(fd, &outFd)) { newMask |= src->handleEvent(WritableEvent); ++nset; } if (FD_ISSET(fd, &excFd)) { newMask |= src->handleEvent(Exception); ++nset; } // Some event occurred if (nset) { // This bit is not terribly efficient if many connections are active... if (newMask) { setSourceEvents(src, newMask); } else // Stop monitoring this one { removeSource(src); if ( ! src->getKeepOpen()) src->close(); } } } } return true; } fldigi-4.1.06/src/xmlrpcpp/XmlRpcUtil.cpp0000644000175000017500000002000413472115775015174 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcUtil.h" #include #include #include #include #include #include "XmlRpc.h" using namespace XmlRpc; //#define USE_WINDOWS_DEBUG // To make the error and log messages go to VC++ debug output #ifdef USE_WINDOWS_DEBUG #define WIN32_LEAN_AND_MEAN #include #endif // Version id const char XmlRpc::XMLRPC_VERSION[] = "XMLRPC++ 0.8"; // Default log verbosity: 0 for no messages through 5 (writes everything) int XmlRpcLogHandler::_verbosity = 0; // Default log handler static class DefaultLogHandler : public XmlRpcLogHandler { public: void log(int level, const char* msg) { #ifdef USE_WINDOWS_DEBUG if (level <= _verbosity) { OutputDebugString(msg); OutputDebugString("\n"); } #else if (level <= _verbosity) std::cout << msg << std::endl; #endif } } defaultLogHandler; // Message log singleton XmlRpcLogHandler* XmlRpcLogHandler::_logHandler = &defaultLogHandler; // Default error handler static class DefaultErrorHandler : public XmlRpcErrorHandler { public: void error(const char* msg) { #ifdef USE_WINDOWS_DEBUG // OutputDebugString(msg); OutputDebugString("\n"); #else // std::cerr << msg << std::endl; #endif } } defaultErrorHandler; // Error handler singleton XmlRpcErrorHandler* XmlRpcErrorHandler::_errorHandler = &defaultErrorHandler; // Easy API for log verbosity int XmlRpc::getVerbosity() { return XmlRpcLogHandler::getVerbosity(); } void XmlRpc::setVerbosity(int level) { XmlRpcLogHandler::setVerbosity(level); } void XmlRpcUtil::log(int level, const char* fmt, ...) { if (level <= XmlRpcLogHandler::getVerbosity()) { va_list va; char buf[1024]; va_start( va, fmt); vsnprintf(buf,sizeof(buf)-1,fmt,va); buf[sizeof(buf)-1] = 0; XmlRpcLogHandler::getLogHandler()->log(level, buf); } } void XmlRpcUtil::error(const char* fmt, ...) { va_list va; va_start(va, fmt); char buf[1024]; vsnprintf(buf,sizeof(buf)-1,fmt,va); buf[sizeof(buf)-1] = 0; XmlRpcErrorHandler::getErrorHandler()->error(buf); } // Returns true if the tag is parsed. No attributes are parsed. // Sets val to the contents between and , or an empty string if is found. // Updates offset to char after bool XmlRpcUtil::parseTag(const char* tag, std::string const& xml, int* offset, std::string &val) { size_t nxml = xml.length(); if (*offset >= int(nxml)) return false; // Find or /> bool lastSlash = false; while (istart < nxml && xml[istart] != '>') { lastSlash = (xml[istart] == '/'); ++ istart; } if (istart == nxml) return false; val.clear(); if (lastSlash) // { *offset = int(istart+1); // 1 after > } else // Find { std::string etag = ""; size_t iend = xml.find(etag, istart); if (iend == std::string::npos) return false; *offset = int(iend + etag.length()); ++ istart; val = xml.substr(istart, iend-istart); } return true; } // Returns true if the tag is found and updates offset to the char after the tag bool XmlRpcUtil::findTag(const char* tag, std::string const& xml, int* offset, bool* emptyTag) { size_t nxml = xml.length(); if (*offset >= int(nxml)) return false; std::string stag = "<"; stag += tag; size_t istart = xml.find(stag, *offset); if (istart == std::string::npos) return false; istart += stag.length(); // Advance istart past > or />, skips attribs bool lastSlash = false; while (istart < nxml && xml[istart] != '>') { lastSlash = (xml[istart] == '/'); ++ istart; } if (istart == nxml) return false; *emptyTag = lastSlash; *offset = int(istart+1); // char after > return true; } // Returns true if the or is found at the specified offset (modulo any whitespace) // and updates offset to the char after the tag. *emptyTag is set to true if is found, false otherwise bool XmlRpcUtil::nextTagIs(const char* tag, std::string const& xml, int* offset, bool *emptyTag) { if (*offset >= int(xml.length())) return false; const char* cp = xml.c_str() + *offset; int nc = 0; while (*cp && isspace(*cp)) { ++cp; ++nc; } int len = int(strlen(tag)); if (*cp == '<' && (strncmp(cp+1, tag, len) == 0)) { cp += len + 1; if (*cp == '>') // { *offset += nc + len + 2; *emptyTag = false; return true; } while (*cp && isspace(*cp)) { ++cp; ++nc; } if (*cp == '/' && *(cp + 1) == '>') // { *offset += nc + len + 3; *emptyTag = true; return true; } } return false; } // Returns true if the next tag found at the specified offset is // and updates offset to the char after the tag. bool XmlRpcUtil::nextTagIsEnd(const char* tag, std::string const& xml, int* offset) { if (*offset >= int(xml.length())) return false; const char* cp = xml.c_str() + *offset; int nc = 0; while (*cp && *cp != '<') { ++cp; ++nc; } int len = int(strlen(tag)); if (*cp == '<' && *(cp+1) == '/' && (strncmp(cp+2, tag, len) == 0) && *(cp + len + 2) == '>') { *offset += nc + len + 3; return true; } return false; } // xml encodings (xml-encoded entities are preceded with '&') static const char AMP = '&'; static const char rawEntity[] = { '<', '>', '&', '\'', '\"', 0 }; static const char* xmlEntity[] = { "lt;", "gt;", "amp;", "apos;", "quot;", 0 }; static const int xmlEntLen[] = { 3, 3, 4, 5, 5 }; // Replace xml-encoded entities with the raw text equivalents. std::string XmlRpcUtil::xmlDecode(const std::string& encoded) { std::string::size_type iAmp = encoded.find(AMP); if (iAmp == std::string::npos) return encoded; std::string decoded(encoded, 0, iAmp); std::string::size_type iSize = encoded.size(); decoded.reserve(iSize); const char* ens = encoded.c_str(); while (iAmp != iSize) { if (encoded[iAmp] == AMP && iAmp+1 < iSize) { int iEntity; for (iEntity=0; xmlEntity[iEntity] != 0; ++iEntity) //if (encoded.compare(iAmp+1, xmlEntLen[iEntity], xmlEntity[iEntity]) == 0) if (strncmp(ens+iAmp+1, xmlEntity[iEntity], xmlEntLen[iEntity]) == 0) { decoded += rawEntity[iEntity]; iAmp += xmlEntLen[iEntity]+1; break; } if (xmlEntity[iEntity] == 0) // unrecognized sequence decoded += encoded[iAmp++]; } else { decoded += encoded[iAmp++]; } } return decoded; } // Replace raw text with xml-encoded entities. std::string XmlRpcUtil::xmlEncode(const std::string& raw) { std::string::size_type iRep = raw.find_first_of(rawEntity); if (iRep == std::string::npos) return raw; std::string encoded(raw, 0, iRep); std::string::size_type iSize = raw.size(); while (iRep != iSize) { int iEntity; for (iEntity=0; rawEntity[iEntity] != 0; ++iEntity) if (raw[iRep] == rawEntity[iEntity]) { encoded += AMP; encoded += xmlEntity[iEntity]; break; } if (rawEntity[iEntity] == 0) encoded += raw[iRep]; ++iRep; } return encoded; } fldigi-4.1.06/src/xmlrpcpp/XmlRpcServerMethod.cpp0000644000175000017500000000216213472115775016673 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcServerMethod.h" #include "XmlRpcServer.h" namespace XmlRpc { XmlRpcServerMethod::XmlRpcServerMethod(std::string const& name, XmlRpcServer* server) { _name = name; _server = server; if (_server) _server->addMethod(this); } XmlRpcServerMethod::~XmlRpcServerMethod() { if (_server) _server->removeMethod(this); } } // namespace XmlRpc fldigi-4.1.06/src/xmlrpcpp/XmlRpcSocket.cpp0000644000175000017500000001226313472115775015517 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #if defined(_WINDOWS) #undef _WINSOCKAPI_ # include # include //# pragma lib(WS2_32.lib) // Updates to MXE require conditional test before assignment to // prevent duplicate defines. #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #undef ETIMEDOUT #define ETIMEDOUT WSAETIMEDOUT typedef int socklen_t; #include "compat.h" #else extern "C" { # include # include # include # include # include # include # include # include # include # include } #endif // _WINDOWS using namespace XmlRpc; // One-time initializations static bool initialized = false; static void initialize() { initialized = true; #if defined(_WINDOWS) { WORD wVersionRequested = MAKEWORD( 2, 0 ); WSADATA wsaData; WSAStartup(wVersionRequested, &wsaData); atexit((void(*)(void)) WSACleanup); } #else { // Ignore SIGPIPE (void) signal(SIGPIPE, SIG_IGN); } #endif // _WINDOWS } // These errors are not considered fatal for an IO operation; the operation will be re-tried. bool XmlRpcSocket::nonFatalError() { int err = XmlRpcSocket::getError(); return (err == EINPROGRESS || #if defined(EAGAIN) err == EAGAIN || #endif #if defined(EINTR) err == EINTR || #endif err == EWOULDBLOCK); } XmlRpcSocket::Socket XmlRpcSocket::socket() { if ( ! initialized) initialize(); return ::socket(AF_INET, SOCK_STREAM, 0); } void XmlRpcSocket::close(XmlRpcSocket::Socket fd) { XmlRpcUtil::log(4, "XmlRpcSocket::close: fd %d.", fd); #if defined(_WINDOWS) closesocket(fd); #else ::close(fd); #endif // _WINDOWS } bool XmlRpcSocket::setNonBlocking(XmlRpcSocket::Socket fd) { #if defined(_WINDOWS) unsigned long flag = 1; return (ioctlsocket(fd, FIONBIO, &flag) == 0); #else return (fcntl(fd, F_SETFL, O_NONBLOCK) == 0); #endif // _WINDOWS } bool XmlRpcSocket::setReuseAddr(XmlRpcSocket::Socket fd) { // Allow this port to be re-bound immediately so server re-starts are not delayed int sflag = 1; return (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&sflag, sizeof(sflag)) == 0); } // Bind to a specified port bool XmlRpcSocket::bind(XmlRpcSocket::Socket fd, int port) { struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons((u_short) port); return (::bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) == 0); } // Set socket in listen mode bool XmlRpcSocket::listen(XmlRpcSocket::Socket fd, int backlog) { return (::listen(fd, backlog) == 0); } XmlRpcSocket::Socket XmlRpcSocket::accept(XmlRpcSocket::Socket fd) { struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); return ::accept(fd, (struct sockaddr*)&addr, &addrlen); } // Connect a socket to a server (from a client) bool XmlRpcSocket::connect(XmlRpcSocket::Socket fd, std::string& host, int port) { struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; struct hostent *hp = gethostbyname(host.c_str()); if (hp == 0) return false; saddr.sin_family = hp->h_addrtype; memcpy(&saddr.sin_addr, hp->h_addr, hp->h_length); saddr.sin_port = htons((u_short) port); // For asynch operation, this will return EWOULDBLOCK (windows) or // EINPROGRESS (linux) and we just need to wait for the socket to be writable... int result = ::connect(fd, (struct sockaddr *)&saddr, sizeof(saddr)); return result == 0 || nonFatalError(); } // Get the port of a bound socket int XmlRpcSocket::getPort(XmlRpcSocket::Socket socket) { struct sockaddr_in saddr; socklen_t saddr_len = sizeof(saddr); int port; int result = ::getsockname(socket, (sockaddr*) &saddr, &saddr_len); if (result != 0) { port = -1; } else { port = ntohs(saddr.sin_port); } return port; } // Returns last errno int XmlRpcSocket::getError() { #if defined(_WINDOWS) return WSAGetLastError(); #else return errno; #endif } // Returns message corresponding to last errno std::string XmlRpcSocket::getErrorMsg() { return getErrorMsg(getError()); } // Returns message corresponding to errno... well, it should anyway std::string XmlRpcSocket::getErrorMsg(int error) { char err[60]; snprintf(err,sizeof(err),"error %d", error); return std::string(err); } fldigi-4.1.06/src/xmlrpcpp/XmlRpcSocket.h0000644000175000017500000000537213472115775015167 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSOCKET_H_ #define _XMLRPCSOCKET_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { //! A platform-independent socket API. class XmlRpcSocket { public: // On windows, a socket is an unsigned int large enough to hold a ptr // This should match the definition of SOCKET in winsock2.h #if defined(_WINDOWS) # if defined(_WIN64) typedef unsigned __int64 Socket; # else typedef unsigned int Socket; # endif #else typedef int Socket; #endif //! An invalid socket constant. static const Socket Invalid = (Socket) -1; //! Creates a stream (TCP) socket. Returns XmlRpcSocket::Invalid on failure. static Socket socket(); //! Closes a socket. static void close(Socket socket); //! Sets a stream (TCP) socket to perform non-blocking IO. Returns false on failure. static bool setNonBlocking(Socket socket); // The next four methods are appropriate for servers. //! Allow the port the specified socket is bound to to be re-bound immediately so //! server re-starts are not delayed. Returns false on failure. static bool setReuseAddr(Socket socket); //! Bind to a specified port static bool bind(Socket socket, int port); //! Set socket in listen mode static bool listen(Socket socket, int backlog); //! Accept a client connection request static Socket accept(Socket socket); //! Connect a socket to a server (from a client) static bool connect(Socket socket, std::string& host, int port); //! Get the port of a bound socket static int getPort(Socket socket); //! Returns true if the last error was not a fatal one (eg, EWOULDBLOCK) static bool nonFatalError(); //! Returns last errno static int getError(); //! Returns message corresponding to last error static std::string getErrorMsg(); //! Returns message corresponding to error static std::string getErrorMsg(int error); }; } // namespace XmlRpc #endif fldigi-4.1.06/src/xmlrpcpp/XmlRpcDispatch.h0000644000175000017500000000646213472115775015477 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCDISPATCH_H_ #define _XMLRPCDISPATCH_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { // An RPC source represents a file descriptor to monitor class XmlRpcSource; //! An object which monitors file descriptors for events and performs //! callbacks when interesting events happen. class XmlRpcDispatch { public: //! Constructor XmlRpcDispatch(); ~XmlRpcDispatch(); //! Values indicating the type of events a source is interested in enum EventType { ReadableEvent = 1, //!< data available to read WritableEvent = 2, //!< connected/data can be written without blocking Exception = 4 //!< uh oh }; //! Monitor this source for the event types specified by the event mask //! and call its event handler when any of the events occur. //! @param source The source to monitor //! @param eventMask Which event types to watch for. \see EventType void addSource(XmlRpcSource* source, unsigned eventMask); //! Stop monitoring this source. //! @param source The source to stop monitoring //! The source socket is not closed. void removeSource(XmlRpcSource* source); //! Modify the types of events to watch for on this source void setSourceEvents(XmlRpcSource* source, unsigned eventMask); //! Watch current set of sources and process events for the specified //! duration (in seconds, -1 implies wait forever, or until exit is called) void work(double timeSeconds); //! Exit from work routine void exit(); //! Clear all sources from the monitored sources list. Sources are closed. void clear(); protected: //! Wait for I/O on any source, timeout, or interrupt signal. bool waitForAndProcessEvents(double timeoutSeconds); //! Returns current time in seconds since something double getTime(); // A source to monitor and what to monitor it for struct MonitoredSource { MonitoredSource(XmlRpcSource* src, unsigned mask) : _src(src), _mask(mask) {} XmlRpcSource* getSource() const { return _src; } unsigned& getMask() { return _mask; } XmlRpcSource* _src; unsigned _mask; }; // A list of sources to monitor typedef std::vector< MonitoredSource > SourceList; // Sources being monitored SourceList _sources; // When work should stop (-1 implies wait forever, or until exit is called) double _endTime; bool _doClear; bool _inWork; }; } // namespace XmlRpc #endif // _XMLRPCDISPATCH_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpc.h0000644000175000017500000000577213472115775014022 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPC_H_ #define _XMLRPC_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcClient.h" #include "XmlRpcException.h" #include "XmlRpcServer.h" #include "XmlRpcServerMethod.h" #include "XmlRpcValue.h" #include "XmlRpcUtil.h" namespace XmlRpc { //! An interface allowing custom handling of error message reporting. class XmlRpcErrorHandler { public: XmlRpcErrorHandler() {} virtual ~XmlRpcErrorHandler() {} //! Returns a pointer to the currently installed error handling object. static XmlRpcErrorHandler* getErrorHandler() { return _errorHandler; } //! Specifies the error handler. static void setErrorHandler(XmlRpcErrorHandler* eh) { _errorHandler = eh; } //! Report an error. Custom error handlers should define this method. virtual void error(const char* msg) = 0; protected: static XmlRpcErrorHandler* _errorHandler; }; //! An interface allowing custom handling of informational message reporting. class XmlRpcLogHandler { public: XmlRpcLogHandler() {} virtual ~XmlRpcLogHandler() {} //! Returns a pointer to the currently installed message reporting object. static XmlRpcLogHandler* getLogHandler() { return _logHandler; } //! Specifies the message handler. static void setLogHandler(XmlRpcLogHandler* lh) { _logHandler = lh; } //! Returns the level of verbosity of informational messages. 0 is no output, 5 is very verbose. static int getVerbosity() { return _verbosity; } //! Specify the level of verbosity of informational messages. 0 is no output, 5 is very verbose. static void setVerbosity(int v) { _verbosity = v; } //! Output a message. Custom error handlers should define this method. virtual void log(int level, const char* msg) = 0; protected: static XmlRpcLogHandler* _logHandler; static int _verbosity; }; //! Returns log message verbosity. This is short for XmlRpcLogHandler::getVerbosity() int getVerbosity(); //! Sets log message verbosity. This is short for XmlRpcLogHandler::setVerbosity(level) void setVerbosity(int level); //! Version identifier extern const char XMLRPC_VERSION[]; } // namespace XmlRpc #endif // _XMLRPC_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcClient.h0000644000175000017500000001270013472115775015146 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCCLIENT_H_ #define _XMLRPCCLIENT_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" namespace XmlRpc { // Arguments and results are represented by XmlRpcValues class XmlRpcValue; //! A class to send XML RPC requests to a server and return the results. class XmlRpcClient : public XmlRpcSource { public: //! Construct a client to connect to the server at the specified host:port address //! @param host The name of the remote machine hosting the server, eg "myserver.mycompany.com" //! @param port The port on the remote machine where the server is listening //! @param uri An optional string to be sent as the URI in the HTTP GET header //! Note that the host is not a URL, do not prepend "http://" or other protocol specifiers. XmlRpcClient(const char* host, int port, const char* uri=0); //! Construct a client to connect to the server at the specified host:port address including HTTP authentication //! @param host The name of the remote machine hosting the server //! @param port The port on the remote machine where the server is listening //! @param login The username passed to the server //! @param pass The password passed to the server //! @param uri An optional string to be sent as the URI in the HTTP GET header XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri=0); //! Destructor virtual ~XmlRpcClient(); //! Execute the named procedure on the remote server. //! @param method The name of the remote procedure to execute //! @param params An array of the arguments for the method //! @param result The result value to be returned to the client //! @param timeoutSeconds Seconds to wait for a response (defaults to forever) //! @return true if the request was sent and a result received //! (although the result might be a fault). //! //! Currently this is a synchronous (blocking) implementation (execute //! does not return until it receives a response or an error). Use isFault() //! to determine whether the result is a fault response. bool execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result, double timeoutSeconds = -1); //! Returns true if the result of the last execute() was a fault response. bool isFault() const { return _isFault; } //! Return the host name of the server const char* const host() const { return _host.c_str(); } //! Return the port int port() const { return _port; } //! Return the URI const char* const uri() const { return _uri.c_str(); } // XmlRpcSource interface implementation //! Close the connection virtual void close(); //! Handle server responses. Called by the event dispatcher during execute. //! @param eventType The type of event that occurred. //! @see XmlRpcDispatch::EventType virtual unsigned handleEvent(unsigned eventType); protected: // Execution processing helpers virtual bool doConnect(); virtual bool setupConnection(); virtual bool generateRequest(const char* method, XmlRpcValue const& params); virtual std::string generateHeader(std::string const& body); virtual bool writeRequest(); virtual bool readHeader(); virtual bool parseHeader(); virtual bool readResponse(); virtual bool parseResponse(XmlRpcValue& result); // Possible IO states for the connection enum ClientConnectionState { NO_CONNECTION, CONNECTING, WRITE_REQUEST, READ_HEADER, READ_RESPONSE, IDLE }; ClientConnectionState _connectionState; // Server location std::string _host; std::string _uri; int _port; // Login information for HTTP authentication std::string _login; std::string _password; // The xml-encoded request, http header of response, and response xml std::string _request; std::string _header; std::string _response; // Number of times the client has attempted to send the request int _sendAttempts; // Number of bytes of the request that have been written to the socket so far int _bytesWritten; // True if we are currently executing a request. If you want to multithread, // each thread should have its own client. bool _executing; // True if the server closed the connection bool _eof; // True if a fault response was returned by the server bool _isFault; // Number of bytes expected in the response body (parsed from response header) int _contentLength; // Event dispatcher XmlRpcDispatch _disp; }; // class XmlRpcClient } // namespace XmlRpc #endif // _XMLRPCCLIENT_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcValue.cpp0000664000175000017500000005044113507402064015332 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcValue.h" #include "XmlRpcException.h" #include "XmlRpcUtil.h" #include "XmlRpcBase64.h" #include #include #include #include namespace XmlRpc { static const char VALUE_TAG[] = "value"; static const char NIL_TAG[] = "nil"; static const char BOOLEAN_TAG[] = "boolean"; static const char DOUBLE_TAG[] = "double"; static const char INT_TAG[] = "int"; static const char I4_TAG[] = "i4"; static const char STRING_TAG[] = "string"; static const char DATETIME_TAG[] = "dateTime.iso8601"; static const char BASE64_TAG[] = "base64"; static const char ARRAY_TAG[] = "array"; static const char DATA_TAG[] = "data"; static const char STRUCT_TAG[] = "struct"; static const char MEMBER_TAG[] = "member"; static const char NAME_TAG[] = "name"; // Format strings std::string XmlRpcValue::_doubleFormat("%f"); // Clean up void XmlRpcValue::invalidate() { switch (_type) { case TypeString: delete _value.asString; break; case TypeDateTime: delete _value.asTime; break; case TypeBase64: delete _value.asBinary; break; case TypeArray: delete _value.asArray; break; case TypeStruct: delete _value.asStruct; break; default: break; } _type = TypeInvalid; _value.asBinary = 0; } // Type checking void XmlRpcValue::assertType(Type t) const { if (_type != t) { throw XmlRpcException("type error"); } } void XmlRpcValue::assertType(Type t) { if (_type == TypeInvalid) { _type = t; switch (_type) { // Ensure there is a valid value for the type case TypeString: _value.asString = new std::string(); break; case TypeDateTime: _value.asTime = new struct tm(); break; case TypeBase64: _value.asBinary = new BinaryData(); break; case TypeArray: _value.asArray = new ValueArray(); break; case TypeStruct: _value.asStruct = new ValueStruct(); break; default: _value.asBinary = 0; break; } } else if (_type != t) { throw XmlRpcException("type error"); } } void XmlRpcValue::assertArray(int size) const { if (_type != TypeArray) throw XmlRpcException("type error: expected an array"); else if (int(_value.asArray->size()) < size) throw XmlRpcException("range error: array index too large"); } void XmlRpcValue::assertArray(int size) { if (_type == TypeInvalid) { _type = TypeArray; _value.asArray = new ValueArray(size); } else if (_type == TypeArray) { if (int(_value.asArray->size()) < size) _value.asArray->resize(size); } else throw XmlRpcException("type error: expected an array"); } void XmlRpcValue::assertStruct() { if (_type == TypeInvalid) { _type = TypeStruct; _value.asStruct = new ValueStruct(); } else if (_type != TypeStruct) throw XmlRpcException("type error: expected a struct"); } // Operators XmlRpcValue& XmlRpcValue::operator=(XmlRpcValue const& rhs) { if (this != &rhs) { invalidate(); _type = rhs._type; switch (_type) { case TypeBoolean: _value.asBool = rhs._value.asBool; break; case TypeInt: _value.asInt = rhs._value.asInt; break; case TypeDouble: _value.asDouble = rhs._value.asDouble; break; case TypeDateTime: _value.asTime = new struct tm(*rhs._value.asTime); break; case TypeString: _value.asString = new std::string(*rhs._value.asString); break; case TypeBase64: _value.asBinary = new BinaryData(*rhs._value.asBinary); break; case TypeArray: _value.asArray = new ValueArray(*rhs._value.asArray); break; case TypeStruct: _value.asStruct = new ValueStruct(*rhs._value.asStruct); break; default: _value.asBinary = 0; break; } } return *this; } // Predicate for tm equality static bool tmEq(struct tm const& t1, struct tm const& t2) { return t1.tm_sec == t2.tm_sec && t1.tm_min == t2.tm_min && t1.tm_hour == t2.tm_hour && t1.tm_mday == t2.tm_mday && t1.tm_mon == t2.tm_mon && t1.tm_year == t2.tm_year; } bool XmlRpcValue::operator==(XmlRpcValue const& other) const { if (_type != other._type) return false; switch (_type) { case TypeBoolean: return ( !_value.asBool && !other._value.asBool) || ( _value.asBool && other._value.asBool); case TypeInt: return _value.asInt == other._value.asInt; case TypeDouble: return _value.asDouble == other._value.asDouble; case TypeDateTime: return tmEq(*_value.asTime, *other._value.asTime); case TypeString: return *_value.asString == *other._value.asString; case TypeBase64: return *_value.asBinary == *other._value.asBinary; case TypeArray: return *_value.asArray == *other._value.asArray; // The map<>::operator== requires the definition of value< for kcc case TypeStruct: //return *_value.asStruct == *other._value.asStruct; { if (_value.asStruct->size() != other._value.asStruct->size()) return false; ValueStruct::const_iterator it1=_value.asStruct->begin(); ValueStruct::const_iterator it2=other._value.asStruct->begin(); while (it1 != _value.asStruct->end()) { const XmlRpcValue& v1 = it1->second; const XmlRpcValue& v2 = it2->second; if ( ! (v1 == v2)) return false; it1++; it2++; } return true; } default: break; } return true; // Both invalid values ... } bool XmlRpcValue::operator!=(XmlRpcValue const& other) const { return !(*this == other); } // Works for strings, binary data, arrays, and structs. int XmlRpcValue::size() const { switch (_type) { case TypeString: return int(_value.asString->size()); case TypeBase64: return int(_value.asBinary->size()); case TypeArray: return int(_value.asArray->size()); case TypeStruct: return int(_value.asStruct->size()); default: break; } throw XmlRpcException("type error"); } // Checks for existence of struct member bool XmlRpcValue::hasMember(const std::string& name) const { return _type == TypeStruct && _value.asStruct->find(name) != _value.asStruct->end(); } // Set the value from xml. The chars at *offset into valueXml // should be the start of a tag. Destroys any existing value. bool XmlRpcValue::fromXml(std::string const& valueXml, int* offset) { int savedOffset = *offset; invalidate(); bool emptyTag; if ( ! XmlRpcUtil::nextTagIs(VALUE_TAG, valueXml, offset, &emptyTag)) return false; // Not a value, offset not updated // No value? Pretend its an empty string... if (emptyTag) { *this = ""; return true; } // No type tag? Assume string // bool result = true; bool result = false; int valueOffset = *offset; if (XmlRpcUtil::nextTagIsEnd(VALUE_TAG, valueXml, offset)) { result = true; return stringFromXml(valueXml, &valueOffset); } else if (XmlRpcUtil::nextTagIs(NIL_TAG, valueXml, offset, &emptyTag)) { _type = TypeNil; result = true; } else if (XmlRpcUtil::nextTagIs(BOOLEAN_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = false; result = true; } else result = boolFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(BOOLEAN_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(I4_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0; result = true; } else result = intFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(I4_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(INT_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0; result = true; } else result = intFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(INT_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(DOUBLE_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0.0; result = true; } else result = doubleFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(DOUBLE_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(STRING_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = ""; result = true; } else result = stringFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(STRING_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(DATETIME_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = timeFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(DATETIME_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(BASE64_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = binaryFromXml("", 0); else result = binaryFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(BASE64_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(ARRAY_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = arrayFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(ARRAY_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(STRUCT_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = structFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(STRUCT_TAG, valueXml, offset); } // Unrecognized tag after or no if ( ! result || ! XmlRpcUtil::nextTagIsEnd(VALUE_TAG, valueXml, offset)) { *offset = savedOffset; return false; } return true; } // Encode the Value in xml std::string XmlRpcValue::toXml() const { switch (_type) { case TypeNil: return nilToXml(); case TypeBoolean: return boolToXml(); case TypeInt: return intToXml(); case TypeDouble: return doubleToXml(); case TypeString: return stringToXml(); case TypeDateTime: return timeToXml(); case TypeBase64: return binaryToXml(); case TypeArray: return arrayToXml(); case TypeStruct: return structToXml(); default: break; } return std::string(); // Invalid value } // Boolean bool XmlRpcValue::boolFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; long ivalue = strtol(valueStart, &valueEnd, 10); if (valueEnd == valueStart || (ivalue != 0 && ivalue != 1)) return false; _type = TypeBoolean; _value.asBool = (ivalue == 1); *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::nilToXml() const { return ""; } std::string XmlRpcValue::boolToXml() const { static std::string booleanTrueXml("1"); static std::string booleanFalseXml("0"); return _value.asBool ? booleanTrueXml : booleanFalseXml; } // Int bool XmlRpcValue::intFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; long ivalue = strtol(valueStart, &valueEnd, 10); if (valueEnd == valueStart) return false; _type = TypeInt; _value.asInt = int(ivalue); *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::intToXml() const { char buf[256]; snprintf(buf, sizeof(buf)-1, "%d", _value.asInt); buf[sizeof(buf)-1] = 0; return std::string(buf); } // Double bool XmlRpcValue::doubleFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; double dvalue = strtod(valueStart, &valueEnd); if (valueEnd == valueStart) return false; _type = TypeDouble; _value.asDouble = dvalue; *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::doubleToXml() const { char fmtbuf[256], buf[256]; snprintf(fmtbuf, sizeof(fmtbuf)-1, "%s", getDoubleFormat().c_str()); fmtbuf[sizeof(fmtbuf)-1] = 0; snprintf(buf, sizeof(buf)-1, fmtbuf, _value.asDouble); buf[sizeof(buf)-1] = 0; return std::string(buf); } // String bool XmlRpcValue::stringFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; _type = TypeString; _value.asString = new std::string(XmlRpcUtil::xmlDecode(valueXml.substr(*offset, valueEnd-*offset))); *offset += int(_value.asString->length()); return true; } std::string XmlRpcValue::stringToXml() const { return std::string("") + XmlRpcUtil::xmlEncode(*_value.asString) + std::string(""); } // DateTime (stored as a struct tm) bool XmlRpcValue::timeFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; std::string stime = valueXml.substr(*offset, valueEnd-*offset); struct tm t; if (sscanf(stime.c_str(),"%4d%2d%2dT%2d:%2d:%2d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec) != 6) return false; t.tm_isdst = -1; _type = TypeDateTime; _value.asTime = new struct tm(t); *offset += int(stime.length()); return true; } std::string XmlRpcValue::timeToXml() const { struct tm* t = _value.asTime; char buf[40]; snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", (1900 + t->tm_year), (1 + t->tm_mon) & 0xFF, (t->tm_mday & 0xFF), (t->tm_hour & 0xFF), (t->tm_min & 0xFF), (t->tm_sec & 0xFF) ); buf[sizeof(buf)-1] = 0; return std::string("") + buf + std::string(""); } // Base64 bool XmlRpcValue::binaryFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; _type = TypeBase64; std::string asString = valueXml.substr(*offset, valueEnd-*offset); _value.asBinary = new BinaryData(); // check whether base64 encodings can contain chars xml encodes... // convert from base64 to binary int iostatus = 0; xmlrpc_base64 decoder; std::back_insert_iterator ins = std::back_inserter(*(_value.asBinary)); decoder.get(asString.begin(), asString.end(), ins, iostatus); *offset += int(asString.length()); return true; } std::string XmlRpcValue::binaryToXml() const { // convert to base64 std::vector base64data; int iostatus = 0; xmlrpc_base64 encoder; std::back_insert_iterator > ins = std::back_inserter(base64data); encoder.put(_value.asBinary->begin(), _value.asBinary->end(), ins, iostatus, xmlrpc_base64<>::crlf()); // Wrap with xml std::string xml = ""; xml.append(base64data.begin(), base64data.end()); xml += ""; return xml; } // Array bool XmlRpcValue::arrayFromXml(std::string const& valueXml, int* offset) { bool emptyTag; if ( ! XmlRpcUtil::nextTagIs(DATA_TAG, valueXml, offset, &emptyTag)) return false; _type = TypeArray; _value.asArray = new ValueArray; if ( ! emptyTag) { XmlRpcValue v; while (v.fromXml(valueXml, offset)) _value.asArray->push_back(v); // copy... // Skip the trailing (void) XmlRpcUtil::nextTagIsEnd(DATA_TAG, valueXml, offset); } return true; } // In general, its preferable to generate the xml of each element of the // array as it is needed rather than glomming up one big string. std::string XmlRpcValue::arrayToXml() const { std::string xml = ""; int s = int(_value.asArray->size()); for (int i=0; iat(i).toXml(); xml += ""; return xml; } // Struct bool XmlRpcValue::structFromXml(std::string const& valueXml, int* offset) { _type = TypeStruct; _value.asStruct = new ValueStruct; std::string name; bool emptyTag; while (XmlRpcUtil::nextTagIs(MEMBER_TAG, valueXml, offset, &emptyTag)) { if ( ! emptyTag) { if (XmlRpcUtil::parseTag(NAME_TAG, valueXml, offset, name)) { // value XmlRpcValue val(valueXml, offset); if ( ! val.valid()) { invalidate(); return false; } const std::pair p(name, val); _value.asStruct->insert(p); (void) XmlRpcUtil::nextTagIsEnd(MEMBER_TAG, valueXml, offset); } } } return true; } // In general, its preferable to generate the xml of each element // as it is needed rather than glomming up one big string. std::string XmlRpcValue::structToXml() const { std::string xml = ""; ValueStruct::const_iterator it; for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it) { xml += ""; xml += XmlRpcUtil::xmlEncode(it->first); xml += ""; xml += it->second.toXml(); xml += ""; } xml += ""; return xml; } // Write the value without xml encoding it std::ostream& XmlRpcValue::write(std::ostream& os) const { switch (_type) { default: break; case TypeBoolean: os << _value.asBool; break; case TypeInt: os << _value.asInt; break; case TypeDouble: os << _value.asDouble; break; case TypeString: os << *_value.asString; break; case TypeDateTime: { struct tm* t = _value.asTime; char buf[20]; snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d", t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); buf[sizeof(buf)-1] = 0; os << buf; break; } case TypeBase64: { int iostatus = 0; std::ostreambuf_iterator out(os); xmlrpc_base64 encoder; encoder.put(_value.asBinary->begin(), _value.asBinary->end(), out, iostatus, xmlrpc_base64<>::crlf()); break; } case TypeArray: { int s = int(_value.asArray->size()); os << '{'; for (int i=0; i 0) os << ','; _value.asArray->at(i).write(os); } os << '}'; break; } case TypeStruct: { os << '['; ValueStruct::const_iterator it; for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it) { if (it!=_value.asStruct->begin()) os << ','; os << it->first << ':'; it->second.write(os); } os << ']'; break; } } return os; } } // namespace XmlRpc // ostream std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v) { // If you want to output in xml format: //return os << v.toXml(); return v.write(os); } fldigi-4.1.06/src/xmlrpcpp/XmlRpcUtil.h0000644000175000017500000000565313472115775014656 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCUTIL_H_ #define _XMLRPCUTIL_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #if defined(_MSC_VER) # define snprintf _snprintf # define vsnprintf _vsnprintf # define strcasecmp _stricmp # define strncasecmp _strnicmp #elif defined(__BORLANDC__) # define strcasecmp stricmp # define strncasecmp strnicmp #endif namespace XmlRpc { //! Utilities for XML parsing, encoding, and decoding and message handlers. class XmlRpcUtil { public: //! Parses the specified tag. No attributes are parsed, no validation is done. //! Sets val to the contents between and , or an empty string if is found. //! Returns true if the tag is parsed. Updates offset to char after static bool parseTag(const char* tag, std::string const& xml, int* offset, std::string &val); //! Returns true if the tag is found and updates offset to the char after the tag. //! If the tag is of the form , emptyTag is set to true. static bool findTag(const char* tag, std::string const& xml, int* offset, bool* emptyTag); //! Returns true if the tag is found at the specified offset (modulo any whitespace) //! and updates offset to the char after the tag. If an empty tag is found (eg, //! ), true is returned, offset is updated to be after the close of the tag, and //! emptyTag is set to true. static bool nextTagIs(const char* tag, std::string const& xml, int* offset, bool* emptyTag); //! Passes over the next tag found at the specified offset is , //! offset is updated to be after the close of the tag. //! Will skip over all characters until < is seen. static bool nextTagIsEnd(const char* tag, std::string const& xml, int* offset); //! Convert raw text to encoded xml. static std::string xmlEncode(const std::string& raw); //! Convert encoded xml to raw text static std::string xmlDecode(const std::string& encoded); //! Dump messages somewhere static void log(int level, const char* fmt, ...); //! Dump error messages somewhere static void error(const char* fmt, ...); }; } // namespace XmlRpc #endif // _XMLRPCUTIL_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcServerConnection.h0000644000175000017500000000541113472115775017217 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVERCONNECTION_H_ #define _XMLRPCSERVERCONNECTION_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcValue.h" #include "XmlRpcSource.h" namespace XmlRpc { // The server waits for client connections and provides support for executing methods class XmlRpcServer; class XmlRpcServerMethod; //! A class to handle XML RPC requests from a particular client class XmlRpcServerConnection : public XmlRpcSource { public: //! Constructor XmlRpcServerConnection(XmlRpcSocket::Socket fd, XmlRpcServer* server, bool deleteOnClose = false); //! Destructor virtual ~XmlRpcServerConnection(); // XmlRpcSource interface implementation //! Handle IO on the client connection socket. //! @param eventType Type of IO event that occurred. @see XmlRpcDispatch::EventType. virtual unsigned handleEvent(unsigned eventType); protected: //! Reads the http header bool readHeader(); //! Reads the request (based on the content-length header value) bool readRequest(); //! Executes the request and writes the resulting response bool writeResponse(); //! Helper method to execute the client request virtual void executeRequest(); //! The XmlRpc server that accepted this connection XmlRpcServer* _server; //! Possible IO states for the connection enum ServerConnectionState { READ_HEADER, READ_REQUEST, WRITE_RESPONSE }; //! Current IO state for the connection ServerConnectionState _connectionState; //! Request headers std::string _header; //! Number of bytes expected in the request body (parsed from header) int _contentLength; //! Request body std::string _request; //! Response std::string _response; //! Number of bytes of the response written so far int _bytesWritten; //! Whether to keep the current client connection open for further requests bool _keepAlive; }; } // namespace XmlRpc #endif // _XMLRPCSERVERCONNECTION_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcServerConnection.cpp0000644000175000017500000001575313472115775017564 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcServerConnection.h" #include "XmlRpcDispatch.h" #include "XmlRpcServer.h" #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #include #include #include #include using namespace XmlRpc; // The server delegates handling client requests to a serverConnection object. XmlRpcServerConnection::XmlRpcServerConnection(XmlRpcSocket::Socket fd, XmlRpcServer* server, bool deleteOnClose /*= false*/) : XmlRpcSource(fd, deleteOnClose) { XmlRpcUtil::log(2,"XmlRpcServerConnection: new socket %d.", fd); _server = server; _connectionState = READ_HEADER; _keepAlive = true; } XmlRpcServerConnection::~XmlRpcServerConnection() { XmlRpcUtil::log(4,"XmlRpcServerConnection dtor."); _server->removeConnection(this); } // Handle input on the server socket by accepting the connection // and reading the rpc request. Return true to continue to monitor // the socket for events, false to remove it from the dispatcher. unsigned XmlRpcServerConnection::handleEvent(unsigned /*eventType*/) { if (_connectionState == READ_HEADER) if ( ! readHeader()) return 0; if (_connectionState == READ_REQUEST) if ( ! readRequest()) return 0; if (_connectionState == WRITE_RESPONSE) if ( ! writeResponse()) return 0; return (_connectionState == WRITE_RESPONSE) ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; } bool XmlRpcServerConnection::readHeader() { // Read available data bool eof; if ( ! nbRead(_header, &eof)) { // Its only an error if we already have read some data if (_header.length() > 0) XmlRpcUtil::error("XmlRpcServerConnection::readHeader: error while reading header (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(4, "XmlRpcServerConnection::readHeader: read %d bytes.", _header.length()); char *hp = (char*)_header.c_str(); // Start of header char *ep = hp + _header.length(); // End of string char *bp = 0; // Start of body char *lp = 0; // Start of content-length value char *kp = 0; // Start of connection value for (char *cp = hp; (bp == 0) && (cp < ep); ++cp) { if ((ep - cp > 16) && (strncasecmp(cp, "Content-length: ", 16) == 0)) lp = cp + 16; else if ((ep - cp > 12) && (strncasecmp(cp, "Connection: ", 12) == 0)) kp = cp + 12; else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0)) bp = cp + 4; else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0)) bp = cp + 2; } // If we haven't gotten the entire header yet, return (keep reading) if (bp == 0) { // EOF in the middle of a request is an error, otherwise its ok if (eof) { XmlRpcUtil::log(4, "XmlRpcServerConnection::readHeader: EOF"); if (_header.length() > 0) XmlRpcUtil::error("XmlRpcServerConnection::readHeader: EOF while reading header"); return false; // Either way we close the connection } return true; // Keep reading } // Decode content length if (lp == 0) { XmlRpcUtil::error("XmlRpcServerConnection::readHeader: No Content-length specified"); return false; // We could try to figure it out by parsing as we read, but for now... } _contentLength = atoi(lp); if (_contentLength <= 0) { XmlRpcUtil::error("XmlRpcServerConnection::readHeader: Invalid Content-length specified (%d).", _contentLength); return false; } XmlRpcUtil::log(3, "XmlRpcServerConnection::readHeader: specified content length is %d.", _contentLength); // Otherwise copy non-header data to request buffer and set state to read request. _request = bp; // Parse out any interesting bits from the header (HTTP version, connection) _keepAlive = true; if (_header.find("HTTP/1.0") != std::string::npos) { if (kp == 0 || strncasecmp(kp, "keep-alive", 10) != 0) _keepAlive = false; // Default for HTTP 1.0 is to close the connection } else { if (kp != 0 && strncasecmp(kp, "close", 5) == 0) _keepAlive = false; } XmlRpcUtil::log(3, "KeepAlive: %d", _keepAlive); _header = ""; _connectionState = READ_REQUEST; return true; // Continue monitoring this source } bool XmlRpcServerConnection::readRequest() { // If we dont have the entire request yet, read available data if (int(_request.length()) < _contentLength) { bool eof; if ( ! nbRead(_request, &eof)) { XmlRpcUtil::error("XmlRpcServerConnection::readRequest: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } // If we haven't gotten the entire request yet, return (keep reading) if (int(_request.length()) < _contentLength) { if (eof) { XmlRpcUtil::error("XmlRpcServerConnection::readRequest: EOF while reading request"); return false; // Either way we close the connection } return true; } } // Otherwise, parse and dispatch the request XmlRpcUtil::log(3, "XmlRpcServerConnection::readRequest read %d bytes.", _request.length()); //XmlRpcUtil::log(5, "XmlRpcServerConnection::readRequest:\n%s\n", _request.c_str()); _connectionState = WRITE_RESPONSE; return true; // Continue monitoring this source } bool XmlRpcServerConnection::writeResponse() { if (_response.length() == 0) { executeRequest(); _bytesWritten = 0; if (_response.length() == 0) { XmlRpcUtil::error("XmlRpcServerConnection::writeResponse: empty response."); return false; } } // Try to write the response if ( ! nbWrite(_response, &_bytesWritten)) { XmlRpcUtil::error("XmlRpcServerConnection::writeResponse: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcServerConnection::writeResponse: wrote %d of %d bytes.", _bytesWritten, _response.length()); // Prepare to read the next request if (_bytesWritten == int(_response.length())) { _header = ""; _request = ""; _response = ""; _connectionState = READ_HEADER; } return _keepAlive; // Continue monitoring this source if true } //! Helper method to execute the client request void XmlRpcServerConnection::executeRequest() { _response = _server->executeRequest(_request); } fldigi-4.1.06/src/xmlrpcpp/XmlRpcServerMethod.h0000644000175000017500000000353513472115776016346 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVERMETHOD_H_ #define _XMLRPCSERVERMETHOD_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { // Representation of a parameter or result value class XmlRpcValue; // The XmlRpcServer processes client requests to call RPCs class XmlRpcServer; //! Abstract class representing a single RPC method class XmlRpcServerMethod { public: //! Constructor XmlRpcServerMethod(std::string const& name, XmlRpcServer* server = 0); //! Destructor virtual ~XmlRpcServerMethod(); //! Returns the name of the method std::string& name() { return _name; } //! Execute the method. Subclasses must provide a definition for this method. virtual void execute(XmlRpcValue& params, XmlRpcValue& result) = 0; //! Returns a help string for the method. //! Subclasses should define this method if introspection is being used. virtual std::string help() { return std::string(); } protected: std::string _name; XmlRpcServer* _server; }; } // namespace XmlRpc #endif // _XMLRPCSERVERMETHOD_H_ fldigi-4.1.06/src/xmlrpcpp/XmlRpcBase64.h0000644000175000017500000002102313472115775014752 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #if !defined(__BASE64_H_INCLUDED__) #define __BASE64_H_INCLUDED__ 1 #include // Corrects forward declarations issue c++11 #include // Corrects forward declarations issue c++11 #include static int _xmlrpc_base64Chars[]= {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9', '+','/' }; #define _0000_0011 0x03 #define _1111_1100 0xFC #define _1111_0000 0xF0 #define _0011_0000 0x30 #define _0011_1100 0x3C #define _0000_1111 0x0F #define _1100_0000 0xC0 #define _0011_1111 0x3F #define _EQUAL_CHAR (-1) #define _UNKNOWN_CHAR (-2) #define _IOS_FAILBIT std::ios_base::failbit #define _IOS_EOFBIT std::ios_base::eofbit #define _IOS_BADBIT std::ios_base::badbit #define _IOS_GOODBIT std::ios_base::goodbit // TEMPLATE CLASS xmlrpc_base64_put template > class xmlrpc_base64 { public: typedef unsigned char byte_t; typedef _E char_type; typedef _Tr traits_type; // xmlrpc_base64 requires max line length <= 72 characters // you can fill end of line // it may be crlf, crlfsp, noline or other class like it struct crlf { template _OI operator()(_OI _To) const{ *_To = _Tr::to_char_type('\r'); ++_To; *_To = _Tr::to_char_type('\n'); ++_To; return (_To); } }; struct crlfsp { template _OI operator()(_OI _To) const{ *_To = _Tr::to_char_type('\r'); ++_To; *_To = _Tr::to_char_type('\n'); ++_To; *_To = _Tr::to_char_type(' '); ++_To; return (_To); } }; struct noline { template _OI operator()(_OI _To) const{ return (_To); } }; struct three2four { void zero() { _data[0] = 0; _data[1] = 0; _data[2] = 0; } byte_t get_0() const { return _data[0]; } byte_t get_1() const { return _data[1]; } byte_t get_2() const { return _data[2]; } void set_0(byte_t _ch) { _data[0] = _ch; } void set_1(byte_t _ch) { _data[1] = _ch; } void set_2(byte_t _ch) { _data[2] = _ch; } // 0000 0000 1111 1111 2222 2222 // xxxx xxxx xxxx xxxx xxxx xxxx // 0000 0011 1111 2222 2233 3333 int b64_0() const {return (_data[0] & _1111_1100) >> 2;} int b64_1() const {return ((_data[0] & _0000_0011) << 4) + ((_data[1] & _1111_0000)>>4);} int b64_2() const {return ((_data[1] & _0000_1111) << 2) + ((_data[2] & _1100_0000)>>6);} int b64_3() const {return (_data[2] & _0011_1111);} void b64_0(int _ch) {_data[0] = ((_ch & _0011_1111) << 2) | (_0000_0011 & _data[0]);} void b64_1(int _ch) { _data[0] = ((_ch & _0011_0000) >> 4) | (_1111_1100 & _data[0]); _data[1] = ((_ch & _0000_1111) << 4) | (_0000_1111 & _data[1]); } void b64_2(int _ch) { _data[1] = ((_ch & _0011_1100) >> 2) | (_1111_0000 & _data[1]); _data[2] = ((_ch & _0000_0011) << 6) | (_0011_1111 & _data[2]); } void b64_3(int _ch){ _data[2] = (_ch & _0011_1111) | (_1100_0000 & _data[2]);} private: byte_t _data[3]; }; template _II put(_II _First, _II _Last, _OI _To, _State& _St, _Endline _Endl) const { three2four _3to4; int line_octets = 0; while(_First != _Last) { _3to4.zero(); // áåð¸ì ïî 3 ñèìâîëà _3to4.set_0(*_First); _First++; if(_First == _Last) { *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type('='); ++_To; *_To = _Tr::to_char_type('='); ++_To; goto __end; } _3to4.set_1(*_First); _First++; if(_First == _Last) { *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_2()]); ++_To; *_To = _Tr::to_char_type('='); ++_To; goto __end; } _3to4.set_2(*_First); _First++; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_2()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_3()]); ++_To; if(line_octets == 17) // xmlrpc_base64 ïîçâîëÿåò äëèíó ñòðîêè íå áîëåå 72 ñèìâîëîâ { //_To = _Endl(_To); *_To = '\n'; ++_To; line_octets = 0; } else ++line_octets; } __end: ; return (_First); } template _II get(_II _First, _II _Last, _OI _To, _State& _St) const { three2four _3to4; int _Char; while(_First != _Last) { // Take octet _3to4.zero(); // -- 0 -- // Search next valid char... while((_Char = _getCharType(*_First)) < 0 && _Char == _UNKNOWN_CHAR) { if(++_First == _Last) { _St |= _IOS_FAILBIT|_IOS_EOFBIT; return _First; // unexpected EOF } } if(_Char == _EQUAL_CHAR){ // Error! First character in octet can't be '=' _St |= _IOS_FAILBIT; return _First; } else _3to4.b64_0(_Char); // -- 1 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { _St |= _IOS_FAILBIT|_IOS_EOFBIT; // unexpected EOF return _First; } if(_Char == _EQUAL_CHAR){ // Error! Second character in octet can't be '=' _St |= _IOS_FAILBIT; return _First; } else _3to4.b64_1(_Char); // -- 2 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { // Error! Unexpected EOF. Must be '=' or xmlrpc_base64 character _St |= _IOS_FAILBIT|_IOS_EOFBIT; return _First; } if(_Char == _EQUAL_CHAR){ // OK! _3to4.b64_2(0); _3to4.b64_3(0); // chek for EOF if(++_First == _Last) { // Error! Unexpected EOF. Must be '='. Ignore it. //_St |= _IOS_BADBIT|_IOS_EOFBIT; _St |= _IOS_EOFBIT; } else if(_getCharType(*_First) != _EQUAL_CHAR) { // Error! Must be '='. Ignore it. //_St |= _IOS_BADBIT; } else ++_First; // Skip '=' // write 1 byte to output *_To = (byte_t) _3to4.get_0(); return _First; } else _3to4.b64_2(_Char); // -- 3 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { // Unexpected EOF. It's error. But ignore it. //_St |= _IOS_FAILBIT|_IOS_EOFBIT; _St |= _IOS_EOFBIT; return _First; } if(_Char == _EQUAL_CHAR) { // OK! _3to4.b64_3(0); // write to output 2 bytes *_To = (byte_t) _3to4.get_0(); *_To = (byte_t) _3to4.get_1(); ++_First; // set position to next character return _First; } else _3to4.b64_3(_Char); // write to output 3 bytes *_To = (byte_t) _3to4.get_0(); *_To = (byte_t) _3to4.get_1(); *_To = (byte_t) _3to4.get_2(); ++_First; } // while(_First != _Last) return (_First); } protected: int _getCharType(int _Ch) const { if(_xmlrpc_base64Chars[62] == _Ch) return 62; if(_xmlrpc_base64Chars[63] == _Ch) return 63; if((_xmlrpc_base64Chars[0] <= _Ch) && (_xmlrpc_base64Chars[25] >= _Ch)) return _Ch - _xmlrpc_base64Chars[0]; if((_xmlrpc_base64Chars[26] <= _Ch) && (_xmlrpc_base64Chars[51] >= _Ch)) return _Ch - _xmlrpc_base64Chars[26] + 26; if((_xmlrpc_base64Chars[52] <= _Ch) && (_xmlrpc_base64Chars[61] >= _Ch)) return _Ch - _xmlrpc_base64Chars[52] + 52; if(_Ch == _Tr::to_int_type('=')) return _EQUAL_CHAR; return _UNKNOWN_CHAR; } }; #endif fldigi-4.1.06/src/xmlrpcpp/XmlRpcValue.h0000644000175000017500000002721213472115775015010 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCVALUE_H_ #define _XMLRPCVALUE_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include #include #include namespace XmlRpc { enum xmlrpc_nil_t { nil }; //! A class to represent RPC arguments and results. //! Each XmlRpcValue object contains a typed value, //! where the type is determined by the initial value //! assigned to the object. // should probably refcount them... class XmlRpcValue { public: //! XmlRpcValue types enum Type { TypeInvalid, TypeNil, TypeBoolean, TypeInt, TypeUnsigned, TypeLongLong, TypeDouble, TypeString, TypeDateTime, TypeBase64, TypeArray, TypeStruct }; // Non-primitive types typedef std::vector BinaryData; typedef std::vector ValueArray; typedef std::map ValueStruct; // Constructors //! Construct an empty XmlRpcValue XmlRpcValue() : _type(TypeInvalid) { _value.asBinary = 0; } //! Construct an XmlRpcValue with a nil value XmlRpcValue(xmlrpc_nil_t value) : _type(TypeNil) { } //! Construct an XmlRpcValue with a bool value XmlRpcValue(bool value) : _type(TypeBoolean) { _value.asBool = value; } //! Construct an XmlRpcValue with an int value XmlRpcValue(int value) : _type(TypeInt) { _value.asInt = value; } XmlRpcValue(unsigned int value) : _type(TypeUnsigned) { _value.asUnsigned = value; } XmlRpcValue(long long value) : _type(TypeLongLong) { _value.asLongLong = value; } //! Construct an XmlRpcValue with a double value XmlRpcValue(double value) : _type(TypeDouble) { _value.asDouble = value; } //! Construct an XmlRpcValue with a string value XmlRpcValue(std::string const& value) : _type(TypeString) { _value.asString = new std::string(value); } //! Construct an XmlRpcValue with a string value. //! @param value A null-terminated (C) string. XmlRpcValue(const char* value) : _type(TypeString) { _value.asString = new std::string(value); } XmlRpcValue(BinaryData const& value) : _type(TypeBase64) { _value.asBinary = new BinaryData(value); } XmlRpcValue(ValueStruct const& value) : _type(TypeStruct) { _value.asStruct = new ValueStruct(value); } XmlRpcValue(ValueArray const& value) : _type(TypeArray) { _value.asArray = new ValueArray(value); } //! Construct an XmlRpcValue with a date/time value. //! @param value A pointer to a struct tm (see localtime) XmlRpcValue(struct tm* value) : _type(TypeDateTime) { _value.asTime = new struct tm(*value); } //! Construct an XmlRpcValue with a binary data value //! @param value A pointer to data //! @param nBytes The length of the data pointed to, in bytes XmlRpcValue(void* value, int nBytes) : _type(TypeBase64) { _value.asBinary = new BinaryData((char*)value, ((char*)value)+nBytes); } //! Construct from xml, beginning at *offset chars into the string, updates offset XmlRpcValue(std::string const& xml, int* offset) : _type(TypeInvalid) { if ( ! fromXml(xml,offset)) _type = TypeInvalid; } //! Copy constructor XmlRpcValue(XmlRpcValue const& rhs) : _type(TypeInvalid) { *this = rhs; } //! Destructor (make virtual if you want to subclass) /*virtual*/ ~XmlRpcValue() { invalidate(); } //! Erase the current value void clear() { invalidate(); } // Operators //! Assignment from one XmlRpcValue to this one. //! @param rhs The value in rhs is copied to this value. XmlRpcValue& operator=(XmlRpcValue const& rhs); //! Assign nil to this XmlRpcValue. XmlRpcValue& operator=(xmlrpc_nil_t const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a bool to this XmlRpcValue. XmlRpcValue& operator=(bool const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign an int to this XmlRpcValue. XmlRpcValue& operator=(int const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a double to this XmlRpcValue. XmlRpcValue& operator=(double const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a string to this XmlRpcValue. XmlRpcValue& operator=(const char* rhs) { return operator=(XmlRpcValue(std::string(rhs))); } //! Tests two XmlRpcValues for equality bool operator==(XmlRpcValue const& other) const; //! Tests two XmlRpcValues for inequality bool operator!=(XmlRpcValue const& other) const; //! Treat an XmlRpcValue as a bool. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeBoolean. operator bool&() { assertType(TypeBoolean); return _value.asBool; } operator bool() const { assertType(TypeBoolean); return _value.asBool; } //! Treat an XmlRpcValue as an int. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeInt. operator int&() { assertType(TypeInt); return _value.asInt; } operator int() const { assertType(TypeInt); return _value.asInt; } operator unsigned int&() { assertType(TypeUnsigned); return _value.asUnsigned; } operator unsigned int() const { assertType(TypeUnsigned); return _value.asUnsigned; } operator long long&() { assertType(TypeLongLong); return _value.asLongLong; } operator long long() const { assertType(TypeLongLong); return _value.asLongLong; } //! Treat an XmlRpcValue as a double. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeDouble. operator double&() { assertType(TypeDouble); return _value.asDouble; } operator double() const { assertType(TypeDouble); return _value.asDouble; } //! Treat an XmlRpcValue as a string. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeString. operator std::string&() { assertType(TypeString); return *_value.asString; } operator std::string const&() const { assertType(TypeString); return *_value.asString; } //! Access the BinaryData value. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeBase64. operator BinaryData&() { assertType(TypeBase64); return *_value.asBinary; } operator BinaryData const&() const { assertType(TypeBase64); return *_value.asBinary; } //! Access the DateTime value. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeDateTime. operator struct tm&() { assertType(TypeDateTime); return *_value.asTime; } operator struct tm const&() const { assertType(TypeDateTime); return *_value.asTime; } //! Const array value accessor. //! Access the ith value of the array. //! Throws XmlRpcException if the value is not an array or if the index i is //! not a valid index for the array. XmlRpcValue const& operator[](int i) const { assertArray(i+1); return _value.asArray->at(i); } //! Array value accessor. //! Access the ith value of the array, growing the array if necessary. //! Throws XmlRpcException if the value is not an array. XmlRpcValue& operator[](int i) { assertArray(i+1); return _value.asArray->at(i); } //! Struct entry accessor. //! Returns the value associated with the given entry, creating one if necessary. XmlRpcValue& operator[](std::string const& k) { assertStruct(); return (*_value.asStruct)[k]; } //! Struct entry accessor. //! Returns the value associated with the given entry, creating one if necessary. XmlRpcValue& operator[](const char* k) { assertStruct(); std::string s(k); return (*_value.asStruct)[s]; } //! Access the struct value map. //! Can be used to iterate over the entries in the map to find all defined entries. operator ValueStruct const&() { assertStruct(); return *_value.asStruct; } operator ValueArray const&() const { assertType(TypeArray); return *_value.asArray; } // Accessors //! Return true if the value has been set to something. bool valid() const { return _type != TypeInvalid; } //! Return the type of the value stored. \see Type. Type const &getType() const { return _type; } //! Return the size for string, base64, array, and struct values. int size() const; //! Specify the size for array values. Array values will grow beyond this size if needed. void setSize(int size) { assertArray(size); } //! Check for the existence of a struct member by name. bool hasMember(const std::string& name) const; //! Decode xml. Destroys any existing value. bool fromXml(std::string const& valueXml, int* offset); //! Encode the Value in xml std::string toXml() const; //! Write the value (no xml encoding) std::ostream& write(std::ostream& os) const; // Formatting //! Return the format used to write double values. static std::string const& getDoubleFormat() { return _doubleFormat; } //! Specify the format used to write double values. static void setDoubleFormat(const char* f) { _doubleFormat = f; } protected: // Clean up void invalidate(); // Type checking. Non-const versions coerce to the desired type if currently un-typed. void assertType(Type t) const; void assertType(Type t); void assertArray(int size) const; void assertArray(int size); void assertStruct(); // XML decoding bool boolFromXml(std::string const& valueXml, int* offset); bool intFromXml(std::string const& valueXml, int* offset); bool doubleFromXml(std::string const& valueXml, int* offset); bool stringFromXml(std::string const& valueXml, int* offset); bool timeFromXml(std::string const& valueXml, int* offset); bool binaryFromXml(std::string const& valueXml, int* offset); bool arrayFromXml(std::string const& valueXml, int* offset); bool structFromXml(std::string const& valueXml, int* offset); // XML encoding std::string nilToXml() const; std::string boolToXml() const; std::string intToXml() const; std::string doubleToXml() const; std::string stringToXml() const; std::string timeToXml() const; std::string binaryToXml() const; std::string arrayToXml() const; std::string structToXml() const; // Format strings static std::string _doubleFormat; // Type tag and values Type _type; // At some point I will split off Arrays and Structs into // separate ref-counted objects for more efficient copying. union { bool asBool; int asInt; unsigned int asUnsigned; long long asLongLong; double asDouble; struct tm* asTime; std::string* asString; BinaryData* asBinary; ValueArray* asArray; ValueStruct* asStruct; } _value; }; } // namespace XmlRpc std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v); #endif // _XMLRPCVALUE_H_ fldigi-4.1.06/src/psm/0000775000175000017500000000000013515625027011437 500000000000000fldigi-4.1.06/src/psm/psm.h0000644000175000017500000000315013472115772012327 00000000000000// ---------------------------------------------------------------------------- // psm/psm.h // // Support for Signal Montoring, CSMA, Transmit Inhibit (Busy Detection) // Effect all transmission types, Keybord, ARQ and KISS interface. // // Copyright (c) 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef __psm_h__ #define __psm_h__ enum { CSMA_PERSISTANCE = 0x01, CSMA_SLOT_TIME = 0x02, CSMA_TX_DELAY = 0x04, CSMA_ALL = (CSMA_PERSISTANCE|CSMA_SLOT_TIME|CSMA_TX_DELAY) }; enum { PSM_STOP = 1, PSM_ABORT }; extern bool psm_thread_running; extern void psm_reset_histogram(void); extern void psm_transmit(void); extern void psm_transmit_ended(int flag); extern void start_psm_thread(void); extern void stop_psm_thread(void); extern void signal_psm(void); extern void update_kpsql_fractional_gain(int value); extern void update_csma_io_config(int update_this); #endif /* __psm_h__ */ fldigi-4.1.06/src/psm/psm.cxx0000644000175000017500000004327213472115772012713 00000000000000// ---------------------------------------------------------------------------- // psm/psm.cxx // // Support for Signal Montoring, CSMA, Transmit Inhibit (Busy Detection) // When enabled effects all transmission types, Keybord, ARQ, and KISS. // // Copyright (c) 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #include #include #include #include #include "main.h" #include "fl_digi.h" #include "trx.h" #include "globals.h" #include "threads.h" #include "socket.h" #include "debug.h" #include "qrunner.h" #include "data_io.h" #include "configuration.h" #include "status.h" #include "confdialog.h" #include "psm/psm.h" #include "gettext.h" #include "timeops.h" #include "kiss_io.h" #include "xmlrpc.h" #include "arq_io.h" #define HISTO_COUNT 256 static int HISTO_THRESH_HOLD = 48; // In seconds #define HISTO_RESET_TIME 180 #define HISTO_RESET_TX_TIME_INHIBIT 3 #define DISABLE_TX_INHIBIT_DURATION 5 #define EST_STATE_CHANGE_MS 25 static int histogram[HISTO_COUNT]; //static bool init_hist_flag = true; static double threshold = 5.0; static int kpsql_pl = 0; static double kpsql_threshold = 0.0; time_t inhibit_tx_seconds = 0; // Used to scale the sensitivity of PSM // Values range from 1/(largest int value) to 1/1 #define FGD_DEFAULT 2 static double fractional_gain = (1.0 / (1.0 * FGD_DEFAULT)); static pthread_t psm_pthread; static pthread_cond_t psm_cond; static pthread_mutex_t psm_mutex; bool psm_thread_running = false; static bool psm_terminate_flag = false; static bool psm_thread_exit_flag = false; static bool request_transmit_flag = false; // A list of timers static double timer_tramit_buffer_timeout = 0; static double timer_slot_time = 0; static double timer_inhibit_tx_seconds = 0; static double timer_histrogram_reset_timer = 0; static double timer_temp_disable_tx_inhibit = 0; static double timer_sql_timer = 0; static pthread_mutex_t external_access_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t millisleep_mutex = PTHREAD_MUTEX_INITIALIZER; static void update_sql_display(void); static double detect_signal(int freq, int bw, double *low, double *high); static void flush_tx_buffer(void); static void process_psm(void); static void * psm_loop(void *args); static inline double current_double_time(void); static void psm_millisleep(int delay_time); bool csma_idling = 0; /********************************************************************************** * Use a local version of MilliSleep() **********************************************************************************/ static void psm_millisleep(int delay_time) { guard_lock _lock(&millisleep_mutex); size_t seconds = 0; size_t nano_seconds = 0; struct timespec timeout = {0}; double to_time = current_double_time(); to_time += (delay_time * 0.001); seconds = (size_t) to_time; nano_seconds = (size_t) ((to_time - seconds) * 1000000000.0); timeout.tv_sec = seconds; timeout.tv_nsec = nano_seconds; pthread_cond_timedwait(&psm_cond, &millisleep_mutex, &timeout); } /********************************************************************************** * Reset Histogram **********************************************************************************/ void psm_reset_histogram(void) { guard_lock _lock(&external_access_mutex); memset(histogram, 0, sizeof(histogram)); histogram[3] = 1; timer_inhibit_tx_seconds = current_double_time() + HISTO_RESET_TX_TIME_INHIBIT; } /********************************************************************************** * **********************************************************************************/ void update_kpsql_fractional_gain(int value) { guard_lock _lock(&external_access_mutex); if(value > 1) { progdefaults.kpsql_attenuation = value; fractional_gain = 1.0 / ((double) value); } else { progdefaults.kpsql_attenuation = FGD_DEFAULT; fractional_gain = 1.0 / ( 1.0 * FGD_DEFAULT); } } /********************************************************************************** * **********************************************************************************/ static void update_sql_display(void) { static int prev_power_level = 0; static double convert_scale = (1.0 / ((double)HISTO_COUNT)); if(progdefaults.show_psm_btn && progStatus.kpsql_enabled) { double high_limit = 0; double low_limit = 0; if(kpsql_pl != prev_power_level) { prev_power_level = kpsql_pl; high_limit = sldrSquelch->maximum(); low_limit = sldrSquelch->minimum(); if(kpsql_pl > HISTO_COUNT) { REQ(callback_set_metric, low_limit); } else { double diff = high_limit - low_limit; double scaled_value = kpsql_pl * convert_scale; double convert_value = scaled_value * diff; double results = high_limit - convert_value; REQ(callback_set_metric, results); } } } } /********************************************************************************** * To deal with the AGC from radios we create a ratio between * the high and low signal levels. **********************************************************************************/ static double detect_signal(int freq, int bw, double *low, double *high) { int freq_step = 10; int freq_pos = 0; int start_freq = freq - (bw >> 1); int end_freq = freq + (bw >> 1); int freq_half_step = freq_step >> 1; int i = 0; double low_value = FLT_MAX; double high_value = FLT_MIN; double ratio = 0.0; double pd = 0; double ratio_avg = 0.0; static double pratio0 = 0.0; static double pratio1 = 0.0; static double pratio2 = 0.0; static double pratio3 = 0.0; if(trx_state != STATE_RX) return ratio_avg; for(i = 0; start_freq <= end_freq; start_freq += freq_step, i++) { freq_pos = start_freq + freq_half_step; pd = wf->powerDensity((double) freq_pos, (double) freq_step); if(pd < low_value) low_value = pd; if(pd > high_value) high_value = pd; } if(low) *low = low_value; if(high) *high = high_value; ratio = high_value/low_value; ratio *= fractional_gain; kpsql_pl = ratio_avg = (ratio + pratio0 + pratio1 + pratio2 + pratio3) * 0.20; if((ratio_avg > 0.0) && (ratio_avg <= (double) HISTO_COUNT)) { i = (int) ratio_avg; i &= 0xFF; histogram[i]++; if(histogram[i] > HISTO_THRESH_HOLD) { for(i = 0; i < HISTO_COUNT; i++) { histogram[i] >>= 1; } return 0.0; } } pratio3 = pratio2; pratio2 = pratio1; pratio1 = pratio0; pratio0 = ratio; return ratio; } /********************************************************************************** * Clear all transmit buffers (ARQ/KISS/XMLRPC) **********************************************************************************/ static void flush_tx_buffer(void) { if(kiss_text_available) { flush_kiss_tx_buffer(); kiss_text_available = false; } if(arq_text_available) { flush_arq_tx_buffer(); arq_text_available = false; } if(xmltest_char_available) { reset_xmlchars(); xmltest_char_available = false; } } /********************************************************************************** * Set state for PSM transmit. **********************************************************************************/ void psm_transmit(void) { guard_lock extern_lock(&external_access_mutex); request_transmit_flag = true; } /********************************************************************************** * Clear state for PSM transmit. **********************************************************************************/ void psm_transmit_ended(int flag) { guard_lock extern_lock(&external_access_mutex); if(flag == PSM_ABORT) { flush_tx_buffer(); abort_tx(); } request_transmit_flag = false; REQ(set_xmtrcv_selection_color_transmitting); } /********************************************************************************** * Convert timespec difference to absolute double. **********************************************************************************/ #if 0 static double timespec_difference(timespec * ts_a, timespec * ts_b) { if(!ts_a) return 0.0; if(!ts_b) return 0.0; double a = ts_a->tv_sec + (ts_a->tv_nsec * 0.000000001); double b = ts_b->tv_sec + (ts_b->tv_nsec * 0.000000001); if(a > b) return (a - b); return (b - a); } #endif // 0 /********************************************************************************** * Convert timespec to double. **********************************************************************************/ static inline double current_double_time(void) { struct timespec current_timespec_time = {0}; clock_gettime(CLOCK_REALTIME, ¤t_timespec_time); double a = current_timespec_time.tv_sec + (current_timespec_time.tv_nsec * 0.000000001); return a; } /********************************************************************************** * PSM processing. Sync's with Waterfall Display Update **********************************************************************************/ static void process_psm(void) { if (!progdefaults.show_psm_btn) return; if (!progStatus.kpsql_enabled) return; guard_lock psm_lock(&psm_mutex); bool detected_signal = false; bool transmit_authorized = true; double busyChannelSeconds = 0; double current_time = 0; double level = 0.0; double random_number = 0; int bw = active_modem->get_bandwidth(); int bw_margin = progStatus.psm_minimum_bandwidth_margin; int freq = active_modem->get_txfreq(); static bool histrogram_reset_timer = true; static bool signal_recorded_flag = false; static double signal_hit_time = 0; static int delay_time = 0; current_time = current_double_time(); level = detect_signal(freq, bw + bw_margin, 0, 0); if(!progStatus.enableBusyChannel) { timer_inhibit_tx_seconds = temp_disable_tx_inhibit = 0; } // Enabled on valid packet reception. Currently only available // to checksum verified protocols (HDLC). if(temp_disable_tx_inhibit) { timer_temp_disable_tx_inhibit = current_time + DISABLE_TX_INHIBIT_DURATION; temp_disable_tx_inhibit = 0; } random_number = (rand() & 0xFF) * 0.00390625; // Reduce value to 0 - 1.0 if(current_time < timer_temp_disable_tx_inhibit) { busyChannelSeconds = 0.25 + (random_number * 0.75); // 0.25 - 1.0 Seconds } else { busyChannelSeconds = (double) progStatus.busyChannelSeconds + random_number; } if(timer_tramit_buffer_timeout == 0.0) { timer_tramit_buffer_timeout = current_time + (progStatus.psm_flush_buffer_timeout * 60); // Minutes to Seconds } // If busy for an extended time flush transmit buffer(s). if(progStatus.psm_flush_buffer_timeout) { // If set to zero no buffer flushing allowed. if(current_time > timer_tramit_buffer_timeout) { timer_tramit_buffer_timeout = current_time + (progStatus.psm_flush_buffer_timeout * 60); flush_tx_buffer(); return; } } if(histrogram_reset_timer) { timer_histrogram_reset_timer = current_time + HISTO_RESET_TIME; histrogram_reset_timer = false; } if(current_time > timer_histrogram_reset_timer) { psm_reset_histogram(); timer_histrogram_reset_timer = current_time + HISTO_RESET_TIME; timer_inhibit_tx_seconds = current_time + 2.0; // Time to rebuild the histogram table. return; } // Histogram keeps the threshold 'x' number of units above the noise level. if(progStatus.psm_use_histogram) { int idx = 0; int first_value = 0; int offset = progStatus.psm_histogram_offset_threshold; int index = 0; if(offset > HISTO_COUNT) offset = HISTO_COUNT; for(index = 0; index < HISTO_COUNT; index++) { if(histogram[index]) { if(idx == 0) { first_value = index; } if(idx >= offset) { threshold = (double) index; break; } idx++; } } if(index > HISTO_COUNT) { threshold = (double) (first_value + offset); } } else { threshold = (int) (progStatus.sldrPwrSquelchValue * 2.56); // Histogram scaled. } kpsql_threshold = threshold; if(level < threshold) { detected_signal = false; signal_recorded_flag = false; } else { detected_signal = true; if(!signal_recorded_flag) { signal_hit_time = current_double_time(); signal_recorded_flag = true; } } if(progStatus.enableBusyChannel && detected_signal) { double signal_hit_time_test = (progStatus.psm_hit_time_window * 0.001); // Milliseconds to seconds. double signal_hit_time_diff = (current_time - signal_hit_time); if(signal_hit_time_diff >= signal_hit_time_test) { timer_inhibit_tx_seconds = current_time + busyChannelSeconds; } } if(current_time < timer_inhibit_tx_seconds) { inhibit_tx_seconds = true; } else { inhibit_tx_seconds = false; } // Limit the number of times update_sql_display() is called per second. if(current_time > timer_sql_timer) { update_sql_display(); timer_sql_timer = current_time + 0.06; // Eyeball tested value. } if(inhibit_tx_seconds || !request_transmit_flag || detected_signal || (current_time < timer_slot_time)) return; delay_time = 0; if(progStatus.csma_enabled) { int rn_persistance = rand() & 0xFF; if(rn_persistance > progStatus.csma_persistance) { double _slot_time = ((progdefaults.csma_slot_time * 10) * 0.001); timer_slot_time = current_time + _slot_time; transmit_authorized = false; } if(progStatus.csma_transmit_delay > 0) { csma_idling = true; delay_time = progStatus.csma_transmit_delay * 10; } } if(transmit_authorized && (trx_state == STATE_RX)) { REQ(set_xmtrcv_selection_color_transmitting); trx_transmit_psm(); active_modem->set_stopflag(false); // Transmit idle time plus START_RX to STATE_TX state change // delay. if(delay_time > 0) { psm_millisleep(delay_time + EST_STATE_CHANGE_MS); delay_time = 0; csma_idling = false; } else { psm_millisleep(EST_STATE_CHANGE_MS); } timer_tramit_buffer_timeout = current_time + (progStatus.psm_flush_buffer_timeout * 60); timer_slot_time = current_time + ((progdefaults.csma_slot_time * 10) * 0.001); timer_slot_time += (((rand() & 0xFF) * 0.00390625) * 0.20); } } /********************************************************************************** * PSM processing loop. Sync's with Waterfall Display Update **********************************************************************************/ static void * psm_loop(void *args) { SET_THREAD_ID(PSM_TID); psm_thread_running = true; psm_terminate_flag = false; psm_thread_exit_flag = false; while(1) { pthread_mutex_lock(&psm_mutex); pthread_cond_wait(&psm_cond, &psm_mutex); pthread_mutex_unlock(&psm_mutex); if (psm_terminate_flag) break; if(trx_state == STATE_RX) { process_psm(); } } psm_thread_exit_flag = true; return (void *)0; } /********************************************************************************** * Start PSM Thread **********************************************************************************/ void start_psm_thread(void) { guard_lock extern_lock(&external_access_mutex); csma_idling = false; if(psm_thread_running) return; memset((void *) &psm_pthread, 0, sizeof(psm_pthread)); memset((void *) &psm_cond, 0, sizeof(psm_cond)); memset((void *) &psm_mutex, 0, sizeof(psm_mutex)); if(pthread_cond_init(&psm_cond, NULL)) { LOG_ERROR("PSM thread create fail (pthread_cond_init)"); return; } if(pthread_mutex_init(&psm_mutex, NULL)) { LOG_ERROR("PSM thread create fail (pthread_mutex_init)"); pthread_cond_destroy(&psm_cond); return; } memset((void *) &psm_pthread, 0, sizeof(psm_pthread)); if(!psm_thread_running) { if (pthread_create(&psm_pthread, NULL, psm_loop, NULL) < 0) { pthread_cond_destroy(&psm_cond); pthread_mutex_destroy(&psm_mutex); LOG_ERROR("PSM thread create fail (pthread_create)"); } } MilliSleep(10); // Give the CPU time to set 'psm_thread_running' } /********************************************************************************** * Stop PSM Thread **********************************************************************************/ void stop_psm_thread(void) { guard_lock extern_lock(&external_access_mutex); if(!psm_thread_running) return; psm_terminate_flag = true; pthread_cond_signal(&psm_cond); MilliSleep(10); if(psm_thread_exit_flag) { pthread_join(psm_pthread, NULL); LOG_INFO("%s", "psm thread - join"); } else { CANCEL_THREAD(psm_pthread); LOG_INFO("%s", "psm thread - cancel"); } pthread_cond_destroy(&psm_cond); pthread_mutex_destroy(&psm_mutex); memset((void *) &psm_pthread, 0, sizeof(psm_pthread)); memset((void *) &psm_cond, 0, sizeof(psm_cond)); memset((void *) &psm_mutex, 0, sizeof(psm_mutex)); psm_thread_running = false; psm_terminate_flag = false; psm_thread_exit_flag = false; csma_idling = false; } /********************************************************************************** * Signal PSM to process Waterfall power level information. **********************************************************************************/ void signal_psm(void) { if(psm_thread_running) { pthread_cond_signal(&psm_cond); } } fldigi-4.1.06/src/blank/0000775000175000017500000000000013515625027011727 500000000000000fldigi-4.1.06/src/blank/blank.cxx0000644000175000017500000001113313472115774013464 00000000000000// ---------------------------------------------------------------------------- // blank.cxx -- BLANK modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gMFSK source code // distribution. // gMFSK Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "BLANK.h" #include "ascii.h" char BLANKmsg[80]; void BLANK::tx_init() { } void BLANK::rx_init() { put_MODEstatus(mode); } void BLANK::init() { modem::init(); rx_init(); digiscope->mode(Digiscope::SCOPE); } BLANK::~BLANK() { delete bandpass; delete hilbert; delete lowpass; delete sliding; delete [] scope_data; delete [] out_buf; delete [] in_buf; } BLANK::BLANK(trx_mode BLANK_mode) : modem() { double cf, flo, fhi; mode = BLANK_mode; symlen = SYMLEN; bandwidth = BLANK_BW; samplerate = BLANKSampleRate; flo = LP_F1 / corrRxSampleRate(); lowpass = new C_FIR_filter(); lowpass->init_lowpass (LP_FIRLEN, LP_DEC, flo ); flo = BP_F1 / corrRxSampleRate(); fhi = BP_F2 / corrRxSampleRate(); bandpass = new C_FIR_filter(); bandpass->init_bandpass (BP_FIRLEN, BP_DEC, flo, fhi ); hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); sliding = new sfft (SL_LEN, SL_F1, SL_F2); // all integer values scope_data = new double [SCOPE_DATA_LEN]; out_buf = new double [SYMLEN]; in_buf = new double [BUFLEN]; // init(); } //===================================================================== // receive processing //===================================================================== void BLANK::recvchar(int c) { if (c == -1) return; put_rx_char(c); } void BLANK::decodesymbol(unsigned char symbol) { } complex BLANK::mixer(complex in, double f) { complex z; // f may have to be modified z = in * complex( cos(phaseacc), sin(phaseacc) ); phaseacc -= TWOPI * f / corrRxSampleRate(); if (phaseacc < 0) phaseacc += TWOPI; return z; } void BLANK::update_syncscope() { int j; memset(scopedata, 0, 2 * SCOPE_DATA_LEN); if (!squelchon || metric >= squelch) for (int i = 0; i < 2 * symlen; i++) { // j = (i + pipeptr) % (2 * symlen); // scopedata[i] = (pipe[j].vector[prev1symbol]).mag(); } set_scope(scope_data, SCOPE_DATA_LEN); } void BLANK::afc() { complex z; double x; if (metric < squelch) return; // adjust "frequency" iaw with afc processing } int BLANK::rx_process(const double *buf, int len) { complex z; int i; while (len-- > 0) { // create analytic signal... z.re = z.im = *buf++; hbfilt->run ( z, z ); // shift in frequency to the base freq of 1000 hz z = mixer(z, frequency); // bandpass filter around the shifted center frequency // with required bandwidth bandpass->run ( z, z ); // binsfft->run(z) copies frequencies of interest complex dummy ; sliding->run (z, &dummy, 0 ); // etc decodesymbol(); update_syncscope(); afc(); } return 0; } //===================================================================== // transmit processing //===================================================================== void BLANK::sendchar(unsigned char c) { // need to generate the outbuf ModulateXmtr(outbuf, symlen); put_echo_char(c); } void sendidle() { } int BLANK::tx_process() { int xmtbyte; switch (txstate) { case TX_STATE_PREAMBLE: for (int i = 0; i < 32; i++) sendbit(0); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r'); sendchar(2); // STX sendchar('\r'); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: xmtbyte = get_tx_char(); if (xmtbyte == GET_TX_CHAR_NODATA) sendidle(); else if ( xmtbyte == GET_TX_CHAR_ETX || stopflag) txstate = TX_STATE_FLUSH; else sendchar(xmtbyte); break; case TX_STATE_FLUSH: sendchar('\r'); sendchar(4); // EOT sendchar('\r'); flushtx(); stopflag = false; // tell trx process that xmt is done return -1; default: break; } return 0; } fldigi-4.1.06/src/blank/blank.h0000644000175000017500000000357013472115774013117 00000000000000// ---------------------------------------------------------------------------- // BLANK.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _BLANK_H #define _BLANK_H #include "trx.h" #include "modem.h" #include "fft.h" #include "filters.h" #include "complex.h" #define BLANKSampleRate 8000 #define SYMLEN 512 #define BLANK_BW 100 #define BUFFLEN 4096 #define SCOPE_DATA_LEN 1024 // lp filter //#define DEC_1 8 //#define FIRLEN_1 256 //#define BW_1 10 // NASA coefficients for viterbi encode/decode algorithms //#define K 7 //#define POLY1 0x6d //#define POLY2 0x4f class BLANK : public modem { protected: double phaseacc; double phaseincr; C_FIR_filter *bandpass; C_FIR_filter *lowpass; C_FIR_filter *hilbert; Cmovavg *moving_avg; sfft *slidingfft; int symlen; // receive double *scope_data; double *inbuf; // transmit int txstate; double *outbuf; unsigned int buffptr; public: BLANK(); ~BLANK(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); }; #endif fldigi-4.1.06/src/ifkp/0000775000175000017500000000000013515625027011571 500000000000000fldigi-4.1.06/src/ifkp/ifkp_bitmaps.cxx0000644000175000017500000000566613472115774014725 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of flrig. // // flrig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include static unsigned char s2n_data[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x60, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xa0, 0x12, 0x00, 0x00, 0x46, 0x12, 0x00, 0x00, 0x4c, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0xf0, 0x12, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; Fl_Bitmap image_s2n(s2n_data, 160, 16); fldigi-4.1.06/src/ifkp/ifkp-pic.cxx0000644000175000017500000006105613472115774013752 00000000000000// ---------------------------------------------------------------------------- // ifkppic.cxx -- ifkp image support functions // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gifkp source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "gettext.h" #include "fileselect.h" #include "timeops.h" Fl_Double_Window *ifkppicRxWin = (Fl_Double_Window *)0; picture *ifkppicRx = (picture *)0; Fl_Button *btnifkpRxReset = (Fl_Button *)0; Fl_Button *btnifkpRxSave = (Fl_Button *)0; Fl_Button *btnifkpRxClose = (Fl_Button *)0; Fl_Counter *ifkpcnt_phase = (Fl_Counter *)0; Fl_Counter *ifkpcnt_slant = (Fl_Counter *)0; Fl_Double_Window *ifkppicTxWin = (Fl_Double_Window *)0; picture *ifkppicTx = (picture *)0; Fl_Button *btnifkppicTransmit = (Fl_Button *)0; Fl_Button *btnifkppicTxSendAbort = (Fl_Button *)0; Fl_Button *btnifkppicTxLoad = (Fl_Button *)0; Fl_Button *btnifkppicTxClose = (Fl_Button *)0; Fl_Choice *selifkppicSize = (Fl_Choice *)0; Fl_Check_Button *btnifkppicTxGrey = (Fl_Check_Button *)0; void ifkp_showRxViewer(char c); void ifkp_createRxViewer(); Fl_Shared_Image *ifkpTxImg = (Fl_Shared_Image *)0; unsigned char *ifkpxmtimg = (unsigned char *)0; unsigned char *ifkpxmtpicbuff = (unsigned char *)0; #define RAWSIZE 640*(480 + 8)*3*ifkp::IMAGEspp #define RAWSTART 640*4*3*ifkp::IMAGEspp unsigned char *ifkp_rawvideo = 0;//[RAWSIZE + 1]; int ifkp_numpixels; int ifkp_pixelptr; int ifkp_rawcol; int ifkp_rawrow; int ifkp_rawrgb; char ifkp_image_type = 'S'; char ifkp_txclr_tooltip[24]; char ifkp_txgry_tooltip[24]; static int translate = 0; static bool enabled = false; static string ifkp_fname; std::string ifkp::imageheader; std::string ifkp::avatarheader; void ifkp_correct_video() { int W = ifkppicRx->w(); int H = ifkppicRx->h(); int slant = ifkpcnt_slant->value(); int vidsize = W * H; int index, rowptr, colptr; float ratio = (((float)vidsize - (float)slant)/(float)vidsize); unsigned char vid[W * H * 3]; for (int row = 0; row < H; row++) { rowptr = W * 3 * row * ifkp::IMAGEspp; for (int col = 0; col < W; col++) { colptr = ifkp::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = ratio*(rowptr + colptr + ifkp::IMAGEspp*W*rgb); index += RAWSTART - ifkp::IMAGEspp*ifkp_pixelptr; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = ifkp_rawvideo[index]; } } } ifkppicRx->video(vid, W*H*3); } void ifkp_updateRxPic(unsigned char data, int pos) { if (!ifkppicRxWin->shown()) ifkppicRx->show(); ifkppicRx->pixel(data, pos); int W = ifkppicRx->w(); if (ifkp_image_type == 'F' || ifkp_image_type == 'p' || ifkp_image_type == 'm' || ifkp_image_type == 'l' || ifkp_image_type == 's' || ifkp_image_type == 'v') { int n = RAWSTART + ifkp::IMAGEspp*(ifkp_rawcol + W * (ifkp_rawrgb + 3 * ifkp_rawrow)); if (n < RAWSIZE) for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[n + i] = data; ifkp_rawrgb++; if (ifkp_rawrgb == 3) { ifkp_rawrgb = 0; ifkp_rawcol++; if (ifkp_rawcol == W) { ifkp_rawcol = 0; ifkp_rawrow++; } } } else for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[RAWSTART + ifkp::IMAGEspp*ifkp_numpixels + i] = data; ifkp_numpixels++; if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; } void cb_btnifkpRxReset(Fl_Widget *, void *) { progStatus.ifkp_rx_abort = true; } void cb_btnifkpRxSave(Fl_Widget *, void *) { ifkppicRx->save_png(string(ifkp_fname).append(".png").c_str()); } void cb_btnifkpRxClose(Fl_Widget *, void *) { ifkppicRxWin->hide(); progStatus.ifkp_rx_abort = true; } void ifkp_save_raw_video() { time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); char sztime[20]; strftime(sztime, sizeof(sztime), "%Y%m%d%H%M%Sz", &ztime); ifkp_fname.assign(PicsDir).append("IFKP").append(sztime); FILE *raw = fl_fopen(string(ifkp_fname).append(".raw").c_str(), "wb"); fwrite(&ifkp_image_type, 1, 1, raw); fwrite(ifkp_rawvideo, 1, RAWSIZE, raw); fclose(raw); } void ifkp_load_raw_video() { // abort & close any Rx video processing int image_type = 0; string image_types = "TtSsLlFVvPpMm"; if (!ifkppicRxWin) ifkp_createRxViewer(); else ifkppicRxWin->hide(); const char *p = FSEL::select( _("Load raw image file"), "Image\t*.raw\n", PicsDir.c_str()); if (!p || !*p) return; ifkp_fname.assign(p); size_t p_raw = ifkp_fname.find(".raw"); if (p_raw != std::string::npos) ifkp_fname.erase(p_raw); FILE *raw = fl_fopen(p, "rb"); int numread = fread(&image_type, 1, 1, raw); if (numread != 1) { fclose(raw); return; } if (image_types.find(ifkp_image_type) != string::npos) { ifkp_showRxViewer(image_type); numread = fread(ifkp_rawvideo, 1, RAWSIZE, raw); if (numread == RAWSIZE) { ifkpcnt_phase->activate(); ifkpcnt_slant->activate(); btnifkpRxSave->activate(); ifkp_correct_video(); ifkppicRxWin->redraw(); } } fclose(raw); } void cb_ifkp_cnt_phase(Fl_Widget *, void *data) { ifkp_pixelptr = ifkpcnt_phase->value(); if (ifkp_pixelptr >= RAWSTART/ifkp::IMAGEspp) { ifkp_pixelptr = RAWSTART/ifkp::IMAGEspp - 1; ifkpcnt_phase->value(ifkp_pixelptr); } if (ifkp_pixelptr < -RAWSTART/ifkp::IMAGEspp) { ifkp_pixelptr = -RAWSTART/ifkp::IMAGEspp; ifkpcnt_phase->value(ifkp_pixelptr); } ifkp_correct_video(); } void cb_ifkp_cnt_slant(Fl_Widget *, void *) { ifkp_correct_video(); } void ifkp_disableshift() { if (!ifkppicRxWin) return; ifkpcnt_phase->deactivate(); ifkpcnt_slant->deactivate(); btnifkpRxSave->deactivate(); ifkppicRxWin->redraw(); } void ifkp_enableshift() { if (!ifkppicRxWin) return; ifkpcnt_phase->activate(); ifkpcnt_slant->activate(); btnifkpRxSave->activate(); ifkp_save_raw_video(); ifkppicRxWin->redraw(); } void ifkp_createRxViewer() { ifkppicRxWin = new Fl_Double_Window(324, 274, _("IFKP Rx Image")); ifkppicRxWin->xclass(PACKAGE_NAME); ifkppicRxWin->begin(); ifkppicRx = new picture(2, 2, 320, 240); ifkppicRx->noslant(); Fl_Group *buttons = new Fl_Group(0, ifkppicRxWin->h() - 26, ifkppicRxWin->w(), 26, ""); buttons->box(FL_FLAT_BOX); btnifkpRxReset = new Fl_Button(2, ifkppicRxWin->h() - 26, 40, 24, "Reset"); btnifkpRxReset->callback(cb_btnifkpRxReset, 0); ifkpcnt_phase = new Fl_Counter(46, ifkppicRxWin->h() - 24, 80, 20, ""); ifkpcnt_phase->step(1); ifkpcnt_phase->lstep(10); ifkpcnt_phase->minimum(-RAWSTART + 1); ifkpcnt_phase->maximum(RAWSTART - 1); ifkpcnt_phase->value(0); ifkpcnt_phase->callback(cb_ifkp_cnt_phase, 0); ifkpcnt_phase->tooltip(_("Phase correction")); ifkpcnt_slant = new Fl_Counter(140, ifkppicRxWin->h() - 24, 80, 20, ""); ifkpcnt_slant->step(1); ifkpcnt_slant->lstep(10); ifkpcnt_slant->minimum(-200); ifkpcnt_slant->maximum(200); ifkpcnt_slant->value(0); ifkpcnt_slant->callback(cb_ifkp_cnt_slant, 0); ifkpcnt_slant->tooltip(_("Slant correction")); btnifkpRxSave = new Fl_Button(226, ifkppicRxWin->h() - 26, 45, 24, _("Save")); btnifkpRxSave->callback(cb_btnifkpRxSave, 0); btnifkpRxClose = new Fl_Button(273, ifkppicRxWin->h() - 26, 45, 24, _("Close")); btnifkpRxClose->callback(cb_btnifkpRxClose, 0); buttons->end(); ifkppicRxWin->end(); ifkppicRxWin->resizable(ifkppicRx); ifkp_numpixels = 0; } void ifkp_showRxViewer(char itype) { int W = 320; int H = 240; switch (itype) { case 'L' : case 'l' : W = 320; H = 240; break; case 'S' : case 's' : W = 160; H = 120; break; case 'V' : case 'F' : W = 640; H = 480; break; case 'P' : case 'p' : W = 240; H = 300; break; case 'M' : case 'm' : W = 120; H = 150; break; case 'T' : W = 59; H = 74; break; } if (!ifkppicRxWin) ifkp_createRxViewer(); int winW, winH; int ifkppicX, ifkppicY; winW = W < 320 ? 324 : W + 4; winH = H < 240 ? 274 : H + 34; ifkppicX = (winW - W) / 2; ifkppicY = (winH - 30 - H) / 2; ifkppicRxWin->size(winW, winH); ifkppicRx->resize(ifkppicX, ifkppicY, W, H); ifkppicRxWin->init_sizes(); ifkppicRx->clear(); ifkppicRxWin->show(); ifkp_disableshift(); if (ifkp_rawvideo == 0) ifkp_rawvideo = new unsigned char [RAWSIZE + 1]; memset(ifkp_rawvideo, 0, RAWSIZE); ifkp_numpixels = 0; ifkp_pixelptr = 0; ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; ifkp_image_type = itype; } void ifkp_clear_rximage() { ifkppicRx->clear(); ifkp_disableshift(); translate = 0; enabled = false; ifkp_numpixels = 0; ifkp_pixelptr = 0; ifkpcnt_phase->value(0); ifkpcnt_slant->value(0); ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; } //------------------------------------------------------------------------------ // image transmit functions //------------------------------------------------------------------------------ int ifkp_load_image(const char *n) { int D = 0; unsigned char *img_data; int W = 640; int H = 480; switch (selifkppicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } if (ifkpTxImg) { ifkpTxImg->release(); ifkpTxImg = 0; } ifkpTxImg = Fl_Shared_Image::get(n, W, H); if (!ifkpTxImg) return 0; if (ifkpTxImg->count() > 1) { ifkpTxImg->release(); ifkpTxImg = 0; return 0; } ifkppicTx->hide(); ifkppicTx->clear(); img_data = (unsigned char *)ifkpTxImg->data()[0]; D = ifkpTxImg->d(); if (ifkpxmtimg) delete [] ifkpxmtimg; ifkpxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(ifkpxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; ifkpxmtimg[j] = img_data[k]; ifkpxmtimg[j+1] = img_data[k+1]; ifkpxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; ifkpxmtimg[j] = ifkpxmtimg[j+1] = ifkpxmtimg[j+2] = img_data[i]; } } else return 0; // ifkp_showTxViewer(W, H); char* label = strdup(n); ifkppicTxWin->copy_label(basename(label)); free(label); // load the ifkppicture widget with the rgb image ifkppicTx->show(); ifkppicTxWin->redraw(); ifkppicTx->video(ifkpxmtimg, W * H * 3); btnifkppicTransmit->activate(); return 1; } void ifkp_updateTxPic(unsigned char data, int pos) { if (!ifkppicTxWin->shown()) ifkppicTx->show(); ifkppicTx->pixel(data, pos); } void cb_ifkppicTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); if (!fn) return; if (!*fn) return; ifkp_load_image(fn); } void ifkp_clear_tximage() { ifkppicTx->clear(); } void cb_ifkppicTxClose( Fl_Widget *w, void *) { ifkppicTxWin->hide(); } int ifkppic_TxGetPixel(int pos, int color) { return ifkpxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} } void cb_ifkppicTransmit( Fl_Widget *w, void *) { bool grey = btnifkppicTxGrey->value(); char ch = ' '; string picmode = " pic%"; switch (selifkppicSize->value()) { case 0 : ifkp_showTxViewer(ch = (grey ? 't' : 'T')); break; // 59 x 74 case 1 : ifkp_showTxViewer(ch = (grey ? 'm' : 'M')); break; // 120 x 150 case 2 : ifkp_showTxViewer(ch = (grey ? 'p' : 'P')); break; // 240 x 300 case 3 : ifkp_showTxViewer(ch = (grey ? 's' : 'S')); break; // 160 x 120 case 4 : ifkp_showTxViewer(ch = (grey ? 'l' : 'L')); break; // 320 x 240 case 5 : ifkp_showTxViewer(ch = (grey ? 'F' : 'V')); break; // 640 x 480 } picmode += ch; active_modem->ifkp_send_image(picmode, grey); } void cb_ifkppicTxSendAbort( Fl_Widget *w, void *) { } void cb_selifkppicSize( Fl_Widget *w, void *) { switch (selifkppicSize->value()) { case 0 : ifkp_showTxViewer('T'); break; case 1 : ifkp_showTxViewer('M'); break; case 2 : ifkp_showTxViewer('P'); break; case 3 : ifkp_showTxViewer('S'); break; case 4 : ifkp_showTxViewer('L'); break; case 5 : ifkp_showTxViewer('V'); break; } } void ifkp_createTxViewer() { ifkppicTxWin = new Fl_Double_Window(324, 270, _("IFKP Send image")); ifkppicTxWin->xclass(PACKAGE_NAME); ifkppicTxWin->begin(); ifkppicTx = new picture (2, 2, 320, 240); ifkppicTx->noslant(); ifkppicTx->hide(); selifkppicSize = new Fl_Choice(5, 244, 90, 24); selifkppicSize->add("59 x 74"); selifkppicSize->add("120x150"); selifkppicSize->add("240x300"); selifkppicSize->add("160x120"); selifkppicSize->add("320x240"); selifkppicSize->add("640x480"); selifkppicSize->value(1); selifkppicSize->callback(cb_selifkppicSize, 0); btnifkppicTxGrey = new Fl_Check_Button(99, 247, 18, 18); btnifkppicTxGrey->tooltip(_("Send grey scale image")); btnifkppicTxGrey->value(0); btnifkppicTxLoad = new Fl_Button(120, 244, 60, 24, _("Load")); btnifkppicTxLoad->callback(cb_ifkppicTxLoad, 0); btnifkppicTransmit = new Fl_Button(ifkppicTxWin->w() - 130, 244, 60, 24, "Xmt"); btnifkppicTransmit->callback(cb_ifkppicTransmit, 0); btnifkppicTxSendAbort = new Fl_Button(ifkppicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); btnifkppicTxSendAbort->callback(cb_ifkppicTxSendAbort, 0); btnifkppicTxClose = new Fl_Button(ifkppicTxWin->w() - 65, 244, 60, 24, _("Close")); btnifkppicTxClose->callback(cb_ifkppicTxClose, 0); btnifkppicTxSendAbort->hide(); btnifkppicTransmit->deactivate(); ifkppicTxWin->end(); } void ifkp_load_scaled_image(std::string fname, bool gray) { if (!ifkppicTxWin) ifkp_createTxViewer(); int D = 0; unsigned char *img_data; int W = 160; int H = 120; int winW = 644; int winH = 512; int ifkppicX = 0; int ifkppicY = 0; string picmode = "pic% \n"; if (ifkpTxImg) { ifkpTxImg->release(); ifkpTxImg = 0; } ifkpTxImg = Fl_Shared_Image::get(fname.c_str()); if (!ifkpTxImg) return; int iW = ifkpTxImg->w(); int iH = ifkpTxImg->h(); int aspect = 0; if (iW > iH ) { if (iW >= 640) { W = 640; H = 480; winW = 644; winH = 484; aspect = 5; picmode[4] = 'V'; if (gray) picmode[4] = 'F'; } else if (iW >= 320) { W = 320; H = 240; winW = 324; winH = 244; aspect = 4; picmode[4] = 'L'; if (gray) picmode[4] = 'l'; } else { W = 160; H = 120; winW = 164; winH = 124; aspect = 3; picmode[4] = 'S'; if (gray) picmode[4] = 's'; } } else { if (iH >= 300) { W = 240; H = 300; winW = 244; winH = 304; aspect = 2; picmode[4] = 'P'; if (gray) picmode[4] = 'p'; } else if (iH >= 150) { W = 120; H = 150; winW = 124; winH = 154; aspect = 1; picmode[4] = 'M'; if (gray) picmode[4] = 'm'; } else { W = 59; H = 74; winW = 67; winH = 82; aspect = 0; picmode[4] = 'T'; if (gray) picmode[4] = 't'; } } { Fl_Image *temp; selifkppicSize->value(aspect); temp = ifkpTxImg->copy(W, H); ifkpTxImg->release(); ifkpTxImg = (Fl_Shared_Image *)temp; } if (ifkpTxImg->count() > 1) { ifkpTxImg->release(); ifkpTxImg = 0; return; } ifkppicTx->hide(); ifkppicTx->clear(); img_data = (unsigned char *)ifkpTxImg->data()[0]; D = ifkpTxImg->d(); if (ifkpxmtimg) delete [] ifkpxmtimg; ifkpxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(ifkpxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; ifkpxmtimg[j] = img_data[k]; ifkpxmtimg[j+1] = img_data[k+1]; ifkpxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; ifkpxmtimg[j] = ifkpxmtimg[j+1] = ifkpxmtimg[j+2] = img_data[i]; } } else return; char* label = strdup(fname.c_str()); ifkppicTxWin->copy_label(basename(label)); free(label); // load the ifkppicture widget with the rgb image ifkppicTxWin->size(winW, winH); ifkppicX = (winW - W) / 2; ifkppicY = (winH - H) / 2; ifkppicTx->resize(ifkppicX, ifkppicY, W, H); selifkppicSize->hide(); btnifkppicTransmit->hide(); btnifkppicTxLoad->hide(); btnifkppicTxClose->hide(); btnifkppicTxSendAbort->hide(); ifkppicTx->video(ifkpxmtimg, W * H * 3); ifkppicTx->show(); ifkppicTxWin->show(); active_modem->ifkp_send_image(picmode, gray); return; } void ifkp_showTxViewer(char c) { if (!ifkppicTxWin) ifkp_createTxViewer(); int winW = 644, winH = 512, W = 480, H = 320; int ifkppicX, ifkppicY; ifkppicTx->clear(); switch (c) { case 'T' : case 't' : W = 59; H = 74; winW = 324; winH = 184; selifkppicSize->value(0); break; case 'S' : case 's' : W = 160; H = 120; winW = 324; winH = 154; selifkppicSize->value(3); break; case 'L' : case 'l' : W = 320; H = 240; winW = 324; winH = 274; selifkppicSize->value(4); break; case 'F' : case 'V' : W = 640; H = 480; winW = 644; winH = 514; selifkppicSize->value(5); break; case 'P' : case 'p' : W = 240; H = 300; winW = 324; winH = 334; selifkppicSize->value(2); break; case 'M' : case 'm' : W = 120; H = 150; winW = 324; winH = 184; selifkppicSize->value(1); break; } ifkppicTxWin->size(winW, winH); ifkppicX = (winW - W) / 2; ifkppicY = (winH - 26 - H) / 2; ifkppicTx->resize(ifkppicX, ifkppicY, W, H); selifkppicSize->resize(5, winH - 26, 90, 24); btnifkppicTxGrey->resize(selifkppicSize->x() + selifkppicSize->w() + 4, winH - 23, 18, 18); btnifkppicTxLoad->resize(btnifkppicTxGrey->x() + btnifkppicTxGrey->w() + 4, winH - 26, 60, 24); btnifkppicTransmit->resize(winW - 130, winH - 26, 60, 24); btnifkppicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); btnifkppicTxClose->resize(winW -65, winH - 26, 60, 24); selifkppicSize->show(); btnifkppicTransmit->show(); btnifkppicTxLoad->show(); btnifkppicTxClose->show(); btnifkppicTxSendAbort->hide(); ifkppicTxWin->show(); } void ifkp_deleteTxViewer() { if (ifkppicTxWin) ifkppicTxWin->hide(); if (ifkppicTx) { delete ifkppicTx; ifkppicTx = 0; } delete [] ifkpxmtimg; ifkpxmtimg = 0; delete [] ifkpxmtpicbuff; ifkpxmtpicbuff = 0; if (ifkppicTxWin) delete ifkppicTxWin; ifkppicTxWin = 0; } void ifkp_deleteRxViewer() { if (ifkppicRxWin) ifkppicRxWin->hide(); if (ifkppicRx) { delete ifkppicRx; ifkppicRx = 0; } if (ifkppicRxWin) { delete ifkppicRxWin; ifkppicRxWin = 0; } } int ifkp_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } // ----------------------------------------------------------------------------- // avatar send/recv // ----------------------------------------------------------------------------- static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; static unsigned char *avatar_img = (unsigned char *)0; static Fl_Shared_Image *my_avatar_img = (Fl_Shared_Image *)0; static int avatar_phase_correction = 0; static unsigned char avatar[59 * 74 * 3]; void ifkp_clear_avatar() { ifkp_avatar->clear(); avatar_phase_correction = 0; ifkp_numpixels = 0; ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; ifkp_avatar->video(tux_img, sizeof(tux_img)); } // W always 59, H always 74 int ifkp_load_avatar(std::string image_fname, int W, int H) { W = 59; H = 74; if (image_fname.empty()) { ifkp_clear_avatar(); return 1; } int D = 0; unsigned char *img_data; if (shared_avatar_img) { shared_avatar_img->release(); shared_avatar_img = 0; } for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); FILE *temp = fl_fopen(fname.c_str(), "rb"); if (temp) { fseek(temp, 0L, SEEK_SET); fclose(temp); } else { ifkp_avatar->video(tux_img, 59 * 74 * 3); return 1; } shared_avatar_img = Fl_Shared_Image::get(fname.c_str(), W, H); // force image to be retrieved from hard drive vice shared image memory shared_avatar_img->reload(); if (!shared_avatar_img) { ifkp_avatar->video(tux_img, 59 * 74 * 3); return 1; } if (shared_avatar_img->count() > 1) { shared_avatar_img->release(); shared_avatar_img = 0; ifkp_avatar->video(tux_img, 59 * 74 * 3); return 0; } img_data = (unsigned char *)shared_avatar_img->data()[0]; D = shared_avatar_img->d(); if (avatar_img) delete [] avatar_img; avatar_img = new unsigned char [W * H * 3]; if (D == 3) memcpy(avatar_img, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; avatar_img[j] = img_data[k]; avatar_img[j+1] = img_data[k+1]; avatar_img[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; avatar_img[j] = avatar_img[j+1] = avatar_img[j+2] = img_data[i]; } } else { ifkp_avatar->video(tux_img, W * H * 3); return 0; } ifkp_avatar->video(avatar_img, W * H * 3); shared_avatar_img->release(); shared_avatar_img = 0; return 1; } void correct_avatar() { int W = 59; int H = 74; int index, rowptr, colptr; unsigned char vid[W * H * 3]; if (avatar_phase_correction >= RAWSTART/ifkp::IMAGEspp) { avatar_phase_correction = RAWSTART/ifkp::IMAGEspp - 1; } if (avatar_phase_correction < -RAWSTART/ifkp::IMAGEspp) { avatar_phase_correction = -RAWSTART/ifkp::IMAGEspp; } for (int row = 0; row < H; row++) { rowptr = W * 3 * row * ifkp::IMAGEspp; for (int col = 0; col < W; col++) { colptr = ifkp::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = rowptr + colptr + W*rgb*ifkp::IMAGEspp; index += RAWSTART - ifkp::IMAGEspp * avatar_phase_correction; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = ifkp_rawvideo[index]; } } } ifkp_avatar->video(vid, W*H*3); } void ifkp_update_avatar(unsigned char data, int pos) { if (ifkp_rawvideo == 0) { ifkp_rawvideo = new unsigned char [RAWSIZE + 1]; memset(ifkp_rawvideo, 0, RAWSIZE); } ifkp_avatar->pixel(data, pos); for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[RAWSTART + ifkp::IMAGEspp*ifkp_numpixels + i] = data; ifkp_numpixels++; if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; } int ifkp_get_avatar_pixel(int pos, int color) { // color = {RED, GREEN, BLUE} return (int)avatar[3*pos + color]; } // ADD CALLBACK HANDLING OF PHASE CORRECTIONS void cb_ifkp_send_avatar( Fl_Widget *w, void *) { if (Fl::event_button() == FL_RIGHT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction += 5; correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction++; correct_avatar(); return; } std::string mycall = progdefaults.myCall; for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; fname.append(mycall).append(".png"); my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); if (!my_avatar_img) return; unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59*74*3); else if (D == 4) { int i, j, k; for (i = 0; i < 59*74; i++) { j = i*3; k = i*4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59*74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else return; active_modem->ifkp_send_avatar(); return; } if (Fl::event_button() == FL_LEFT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction -= 5; correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction--; correct_avatar(); return; } std::string mycall = inpCall->value(); if (mycall.empty()) return; for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; fname.append(mycall).append(".png"); ifkp_avatar->save_png(fname.c_str()); } } fldigi-4.1.06/src/ifkp/ifkp.cxx0000664000175000017500000005406213507402064013170 00000000000000// ---------------------------------------------------------------------------- // ifkp.cxx -- ifkp modem // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "progress.h" #include "ifkp.h" #include "complex.h" #include "fl_digi.h" #include "ascii.h" #include "misc.h" #include "fileselect.h" #include "threads.h" #include "debug.h" #include "configuration.h" #include "qrunner.h" #include "fl_digi.h" #include "status.h" #include "main.h" #include "icons.h" #include "confdialog.h" #include "test_signal.h" using namespace std; #include "ifkp_varicode.cxx" #define IFKP_SR 16000 #include "ifkp-pic.cxx" static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); static string teststr = ""; static string allowed = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/"; static char sz[21]; static bool enable_audit_log = false; static bool enable_heard_log = false; int ifkp::IMAGEspp = IMAGESPP; static string valid_callsign(char ch) { if (allowed.find(ch) == std::string::npos) ch = ' '; teststr += tolower(ch); if (teststr.length() > 20) teststr.erase(0,1); // wait for ' de ' size_t p1; if ((p1 = teststr.find(" de ")) != std::string::npos) { // test for callsign p1 += 4; if (p1 >= teststr.length()) return ""; while (p1 < teststr.length() && teststr[p1] == ' ') p1++; if (p1 == teststr.length()) return ""; size_t p2 = teststr.rfind(' '); if ((p2 > p1) && (p2 - p1 < 21)) { // found a word, test for callsign memset(sz, 0, 21); strcpy(sz, teststr.substr(p1, p2-p1).c_str()); teststr.erase(0, p2); if (call.match(sz)) { return sz; } return ""; } } return ""; } // nibbles table used for fast conversion from tone difference to symbol void ifkp::init_nibbles() { int nibble = 0; for (int i = 0; i < 199; i++) { nibble = floor(0.5 + (i - 99.0)/IFKP_SPACING); // allow for wrap-around (33 tones for 32 tone differences) if (nibble < 0) nibble += 33; if (nibble > 32) nibble -= 33; // adjust for +1 symbol at the transmitter nibble--; nibbles[i] = nibble; } } ifkp::ifkp(trx_mode md) : modem() { samplerate = IFKP_SR; symlen = IFKP_SYMLEN; cap |= CAP_IMG; if (progdefaults.StartAtSweetSpot) { frequency = progdefaults.PSKsweetspot; } else frequency = wf->Carrier(); REQ(put_freq, frequency); mode = md; fft = new g_fft(IFKP_FFTSIZE); snfilt = new Cmovavg(64); movavg_size = 4; for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i] = new Cmovavg(movavg_size); txphase = 0; basetone = 197; float lo = frequency - 0.75 * bandwidth; float hi = frequency + 0.75 * bandwidth; rxfilter = new C_FIR_filter(); rxfilter->init_bandpass(129, 1, lo/samplerate, hi/samplerate); picfilter = new C_FIR_filter(); picfilter->init_lowpass(129, 1, 2.0 * bandwidth / samplerate); phase = 0; phidiff = 2.0 * M_PI * frequency / samplerate; IMAGEspp = IMAGESPP; pixfilter = new Cmovavg(IMAGEspp / 2); ampfilter = new Cmovavg(IMAGEspp); syncfilter = new Cmovavg(IMAGEspp / 2); bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; memset(rx_stream, 0, sizeof(rx_stream)); rx_text.clear(); for (int i = 0; i < IFKP_BLOCK_SIZE; i++) a_blackman[i] = blackman(1.0 * i / IFKP_BLOCK_SIZE); state = TEXT; init_nibbles(); TX_IMAGE = TX_AVATAR = false; restart(); toggle_logs(); activate_ifkp_image_item(true); } ifkp::~ifkp() { delete fft; delete snfilt; delete rxfilter; delete picfilter; for (int i = 0; i < IFKP_NUMBINS; i++) delete binfilt[i]; ifkp_deleteTxViewer(); ifkp_deleteRxViewer(); heard_log.close(); audit_log.close(); activate_ifkp_image_item(false); } void ifkp::tx_init() { tone = prevtone = 0; txphase = 0; send_bot = true; mycall = progdefaults.myCall; if (progdefaults.ifkp_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); videoText(); } void ifkp::rx_init() { bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; memset(rx_stream, 0, sizeof(rx_stream)); prevz = cmplx(0,0); image_counter = 0; state = TEXT; rx_text.clear(); for (int i = 0; i < IFKP_NUMBINS; i++) { tones[i] = 0.0; binfilt[i]->reset(); } pixel = 0; pic_str = " "; } void ifkp::rx_reset() { prevz = cmplx(0,0); image_counter = 0; pixel = 0; pic_str = " "; snfilt->reset(); state = TEXT; } void ifkp::init() { peak_hits = 4; mycall = progdefaults.myCall; if (progdefaults.ifkp_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); movavg_size = 3; for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i]->setLength(movavg_size); rx_init(); } void ifkp::set_freq(double f) { if (progdefaults.ifkp_freqlock) frequency = 1500; else frequency = f; if (frequency < 100 + 0.5 * bandwidth) frequency = 100 + 0.5 * bandwidth; if (frequency > 3900 - 0.5 * bandwidth) frequency = 3900 - 0.5 * bandwidth; tx_frequency = frequency; REQ(put_freq, frequency); set_bandwidth(33 * IFKP_SPACING * samplerate / symlen); basetone = ceil((frequency - bandwidth / 2.0) * symlen / samplerate); float lo = frequency - 0.75 * bandwidth; float hi = frequency + 0.75 * bandwidth; rxfilter->init_bandpass(129, 1, lo/samplerate, hi/samplerate); picfilter->init_lowpass(129, 1, 2.0 * bandwidth / samplerate); phase = 0; phidiff = 2.0 * M_PI * frequency / samplerate; std::ostringstream it; it << "\nSamplerate..... " << samplerate; it << "\nBandwidth...... " << bandwidth; it << "\nlower cutoff... " << lo; it << "\nupper cutoff... " << hi; it << "\ncenter ........ " << frequency; it << "\nSymbol length.. " << symlen << "\nBlock size..... " << IFKP_SHIFT_SIZE; it << "\nMinimum Hits... " << peak_hits << "\nBasetone....... " << basetone << "\n"; LOG_VERBOSE("%s", it.str().c_str()); } void ifkp::show_mode() { if (progdefaults.ifkp_baud == 0) put_MODEstatus("IFKP 0.5"); else if (progdefaults.ifkp_baud == 1) put_MODEstatus("IFKP 1.0"); else put_MODEstatus("IFKP 2.0"); return; } void ifkp::toggle_logs() { if (enable_audit_log != progdefaults.ifkp_enable_audit_log){ enable_audit_log = progdefaults.ifkp_enable_audit_log; if (audit_log.is_open()) audit_log.close(); } if (enable_heard_log != progdefaults.ifkp_enable_heard_log) { enable_heard_log = progdefaults.ifkp_enable_heard_log; if (heard_log.is_open()) heard_log.close(); } if (enable_heard_log) { heard_log_fname = progdefaults.ifkp_heard_log; std::string sheard = TempDir; sheard.append(heard_log_fname); heard_log.open(sheard.c_str(), ios::app); heard_log << "==================================================\n"; heard_log << "Heard log: " << zdate() << ", " << ztime() << "\n"; heard_log << "==================================================\n"; heard_log.flush(); } if (enable_audit_log) { audit_log_fname = progdefaults.ifkp_audit_log; std::string saudit = TempDir; saudit.append(audit_log_fname); audit_log.close(); audit_log.open(saudit.c_str(), ios::app); audit_log << "==================================================\n"; audit_log << "Audit log: " << zdate() << ", " << ztime() << "\n"; audit_log << "==================================================\n"; audit_log.flush(); } } void ifkp::restart() { set_freq(wf->Carrier()); peak_hits = 4; mycall = progdefaults.myCall; if (progdefaults.ifkp_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); movavg_size = progdefaults.ifkp_baud == 2 ? 3 : 4; for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i]->setLength(movavg_size); show_mode(); } // valid printable character bool ifkp::valid_char(int ch) { if ( ! (ch == 10 || ch == 163 || ch == 176 || ch == 177 || ch == 215 || ch == 247 || (ch > 31 && ch < 128))) return false; return true; } //===================================================================== // receive processing //===================================================================== void ifkp::parse_pic(int ch) { b_ava = false; image_mode = 0; pic_str.erase(0,1); pic_str += ch; if (pic_str.find("pic%") == 0) { switch (pic_str[4]) { case 'A': picW = 59; picH = 74; b_ava = true; break; case 'T': picW = 59; picH = 74; break; case 't': picW = 59; picH = 74; image_mode = 1; break; case 'S': picW = 160; picH = 120; break; case 's': picW = 160; picH = 120; image_mode = 1; break; case 'L': picW = 320; picH = 240; break; case 'l': picW = 320; picH = 240; image_mode = 1; break; case 'V': picW = 640; picH = 480; break; case 'v': picW = 640; picH = 480; image_mode = 1; break; case 'F': picW = 640; picH = 480; image_mode = 1; break; case 'P': picW = 240; picH = 300; break; case 'p': picW = 240; picH = 300; image_mode = 1; break; case 'M': picW = 120; picH = 150; break; case 'm': picW = 120; picH = 150; image_mode = 1; break; default: syncfilter->reset(); pixfilter->reset(); ampfilter->reset(); return; } } else return; if (!b_ava) REQ( ifkp_showRxViewer, pic_str[4]); else REQ( ifkp_clear_avatar ); image_counter = -symlen / 2; col = row = rgb = 0; syncfilter->reset(); pixfilter->reset(); // ampfilter->reset(); state = IMAGE_START; } void ifkp::process_symbol(int sym) { int nibble = 0; int curr_ch = -1 ; symbol = sym; nibble = symbol - prev_symbol; if (nibble < -99 || nibble > 99) { prev_symbol = symbol; return; } nibble = nibbles[nibble + 99]; if (nibble >= 0) { // process nibble curr_nibble = nibble; // single-nibble characters if ((prev_nibble < 29) & (curr_nibble < 29)) { curr_ch = ifkp_varidecode[prev_nibble]; // double-nibble characters } else if ( (prev_nibble < 29) && (curr_nibble > 28) && (curr_nibble < 32)) { curr_ch = ifkp_varidecode[prev_nibble * 32 + curr_nibble]; } if (curr_ch > 0) { if (ch_sqlch_open || metric >= progStatus.sldrSquelchValue) { // if (metric >= progStatus.sldrSquelchValue) { put_rx_char(curr_ch, FTextBase::RECV); if (enable_audit_log) { audit_log << ifkp_ascii[curr_ch]; if (curr_ch == '\n') audit_log << '\n'; } parse_pic(curr_ch); if (state != IMAGE_START) { station_calling = valid_callsign(curr_ch); if (!station_calling.empty()) { snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); REQ(add_to_heard_list, station_calling.c_str(), szestimate); if (enable_heard_log) { std::string sheard = zdate(); sheard.append(":").append(ztime()); sheard.append(",").append(station_calling); sheard.append(",").append(szestimate).append("\n"); heard_log << sheard; heard_log.flush(); } } } } } prev_nibble = curr_nibble; } prev_symbol = symbol; } void ifkp::process_tones() { max = 0; peak = 0; max = 0; peak = IFKP_NUMBINS / 2; int firstbin = frequency * IFKP_SYMLEN / samplerate - IFKP_NUMBINS / 2; double sigval = 0; double mins[3]; double min = 3.0e8; double temp; mins[0] = mins[1] = mins[2] = 1.0e8; for (int i = 0; i < IFKP_NUMBINS; ++i) { val = norm(fft_data[i + firstbin]); // looking for maximum signal tones[i] = binfilt[i]->run(val); if (tones[i] > max) { max = tones[i]; peak = i; } // looking for minimum signal in a 3 bin sequence mins[2] = tones[i]; temp = mins[0] + mins[1] + mins[2]; mins[0] = mins[1]; mins[1] = mins[2]; if (temp < min) min = temp; } sigval = tones[peak-1] + tones[peak] + tones[peak+1]; if (min == 0) min = 1e-10; s2n = 10 * log10( snfilt->run(sigval/min)) - 36.0; //scale to -25 to +45 db range // -25 -> 0 linear // 0 - > 45 compressed by 2 if (s2n <= 0) metric = 2 * (25 + s2n); if (s2n > 0) metric = 50 * ( 1 + s2n / 45); metric = clamp(metric, 0, 100); display_metric(metric); if (peak == prev_peak) { peak_counter++; } else { peak_counter = 0; } if ((peak_counter >= peak_hits) && (peak != last_peak) && (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false)) { process_symbol(peak); peak_counter = 0; last_peak = peak; } prev_peak = peak; } void ifkp::recvpic(double smpl) { phidiff = 2.0 * M_PI * frequency / samplerate; phase -= phidiff; if (phase < 0) phase += 2.0 * M_PI; cmplx z = smpl * cmplx( cos(phase), sin(phase ) ); picfilter->run( z, currz); pixel = (samplerate / TWOPI) * pixfilter->run(arg(conj(prevz) * currz)); sync = (samplerate / TWOPI) * syncfilter->run(arg(conj(prevz) * currz)); prevz = currz; image_counter++; if (image_counter < 0) return; if (state == IMAGE_START) { if (sync < -0.59 * bandwidth) { state = IMAGE_SYNC; } return; } if (state == IMAGE_SYNC) { if (sync > -0.51 * bandwidth) { state = IMAGE; } return; } if ((image_counter % IMAGEspp) == 0) { byte = pixel * 256.0 / bandwidth + 128; byte = (int)CLAMP( byte, 0.0, 255.0); if (image_mode == 1) { // bw transmission pixelnbr = 3 * (col + row * picW); if (b_ava) { REQ(ifkp_update_avatar, byte, pixelnbr); REQ(ifkp_update_avatar, byte, pixelnbr + 1); REQ(ifkp_update_avatar, byte, pixelnbr + 2); } else { REQ(ifkp_updateRxPic, byte, pixelnbr); REQ(ifkp_updateRxPic, byte, pixelnbr + 1); REQ(ifkp_updateRxPic, byte, pixelnbr + 2); } if (++ col == picW) { col = 0; row++; if (row >= picH) { rx_reset(); REQ(ifkp_enableshift); } } } else { // color transmission pixelnbr = rgb + 3 * (col + row * picW); if (b_ava) REQ(ifkp_update_avatar, byte, pixelnbr); else REQ(ifkp_updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; ++row; } } if (row >= picH) { rx_reset(); REQ(ifkp_enableshift); } } } } int ifkp::rx_process(const double *buf, int len) { double val; cmplx zin, z; if (enable_audit_log != progdefaults.ifkp_enable_audit_log || enable_heard_log != progdefaults.ifkp_enable_heard_log) toggle_logs(); if (bkptr < 0) bkptr = 0; if (bkptr >= IFKP_SHIFT_SIZE) bkptr = 0; if (progStatus.ifkp_rx_abort) { state = TEXT; progStatus.ifkp_rx_abort = false; REQ(ifkp_clear_rximage); } while (len) { if (state == TEXT) { rxfilter->Irun(*buf, val); rx_stream[IFKP_BLOCK_SIZE + bkptr] = val; bkptr++; if (bkptr == IFKP_SHIFT_SIZE) { bkptr = 0; memmove(rx_stream, // to &rx_stream[IFKP_SHIFT_SIZE], // from IFKP_BLOCK_SIZE*sizeof(*rx_stream)); // # bytes memset(fft_data, 0, sizeof(fft_data)); for (int i = 0; i < IFKP_BLOCK_SIZE; i++) { double d = rx_stream[i] * a_blackman[i]; fft_data[i] = cmplx(d,d); } fft->ComplexFFT(fft_data); process_tones(); } } else recvpic(*buf); len--; buf++; } return 0; } //===================================================================== // transmit processing //===================================================================== void ifkp::transmit(double *buf, int len) { // if (xmtfilt && progdefaults.ifkp_xmtfilter) // for (int i = 0; i < len; i++) xmtfilt->Irun(buf[i], buf[i]); ModulateXmtr(buf, len); } void ifkp::send_tone(int tone) { double phaseincr; double frequency; frequency = (basetone + tone * IFKP_SPACING) * samplerate / symlen; if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) frequency += ctrl_freq_offset->value(); phaseincr = 2.0 * M_PI * frequency / samplerate; prevtone = tone; int send_symlen = symlen * ( progdefaults.ifkp_baud == 2 ? 0.5 : progdefaults.ifkp_baud == 0 ? 2.0 : 1.0); for (int i = 0; i < send_symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, send_symlen); } void ifkp::send_symbol(int sym) { tone = (prevtone + sym + IFKP_OFFSET) % 33; send_tone(tone); } void ifkp::send_idle() { send_symbol(0); } void ifkp::send_char(int ch) { if (ch <= 0) return send_idle(); int sym1 = ifkp_varicode[ch][0]; int sym2 = ifkp_varicode[ch][1]; send_symbol(sym1); if (sym2 > 28) send_symbol(sym2); put_echo_char(ch); } void ifkp::send_avatar() { int W = 59, H = 74; // grey scale transfer (FAX) float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; freq = frequency - 0.6 * bandwidth; #define PHASE_CORR (3 * symlen / 2) phaseincr = radians * freq; for (int n = 0; n < PHASE_CORR; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, PHASE_CORR); for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = ifkp_get_avatar_pixel(tx_pixelnbr, color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, IMAGEspp); } Fl::awake(); } } } static bool send_color = true; void ifkp::send_image() { int W = 640, H = 480; // grey scale transfer (FAX) float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; if (!ifkppicTxWin || !ifkppicTxWin->visible()) { return; } switch (selifkppicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } REQ(ifkp_clear_tximage); stop_deadman(); for (size_t n = 0; n < imageheader.length(); n++) send_char(imageheader[n]); send_char(0); // needed to flush the header at the Rx decoder freq = frequency - 0.6 * bandwidth; // black-black phaseincr = radians * freq; for (int j = 0; j < 7; j++) { for (int i = 0; i < symlen/2; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, symlen/2); } if (send_color == false) { // grey scale image for (int row = 0; row < H; row++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) goto end_image; tx_pixelnbr = col + row * W; tx_pixel = 0.3 * ifkppic_TxGetPixel(tx_pixelnbr, 0) + // red 0.6 * ifkppic_TxGetPixel(tx_pixelnbr, 1) + // green 0.1 * ifkppic_TxGetPixel(tx_pixelnbr, 2); // blue REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, IMAGEspp); Fl::awake(); } } } else { for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) goto end_image; tx_pixelnbr = col + row * W; tx_pixel = ifkppic_TxGetPixel(tx_pixelnbr, color); REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, IMAGEspp); } Fl::awake(); if (stopflag) goto end_image; } } } end_image: start_deadman(); } std::string img_str; void ifkp::ifkp_send_image(std::string image_str, bool gray) { send_color = !gray; imageheader = image_str; TX_IMAGE = true; start_tx(); } void ifkp::ifkp_send_avatar() { img_str = "\npic%A"; TX_AVATAR = true; start_tx(); } void ifkp::m_ifkp_send_avatar() { std::string mycall = progdefaults.myCall; for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; fname.append(mycall).append(".png"); my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); if (!my_avatar_img) return; unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59*74*3); else if (D == 4) { int i, j, k; for (i = 0; i < 59*74; i++) { j = i*3; k = i*4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59*74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else return; ifkp_send_avatar(); } int ifkp::tx_process() { modem::tx_process(); if (send_bot) { send_bot = false; send_char(0); send_char(0); } int c = get_tx_char(); // if (c == GET_TX_CHAR_ETX || enable_image) { if (TX_IMAGE || TX_AVATAR) { if (img_str.length()) { for (size_t n = 0; n < img_str.length(); n++) send_char(img_str[n]); } img_str.clear(); if (TX_IMAGE) { send_image(); ifkppicTxWin->hide(); } if (TX_AVATAR) send_avatar(); send_char(0); TX_IMAGE = false; TX_AVATAR = false; ifkppicTxWin->hide(); return 0; } if ( stopflag || c == GET_TX_CHAR_ETX) { // aborts transmission send_char(0); // TX_IMAGE = false; // TX_AVATAR = false; stopflag = false; return -1; } send_char(c); return 0; } fldigi-4.1.06/src/ifkp/ifkp_varicode.cxx0000644000175000017500000002221013472115774015042 00000000000000int ifkp_varicode[][2] = { { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {27,31}, { 0, 0}, {28,30}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {28, 0}, {11,30}, {12,30}, {13,30}, {14,30}, {15,30}, {16,30}, {17,30},//' '!-' {18,30}, {19,30}, {20,30}, {21,30}, {27,29}, {22,30}, {27, 0}, {23,30}, {10,30}, { 1,30}, { 2,30}, { 3,30}, { 4,30}, { 5,30}, { 6,30}, { 7,30},// 0 - 7 { 8,30}, { 9,30}, {24,30}, {25,30}, {26,30}, { 0,31}, {27,30}, {28,29},// 8, 9 { 0,29}, { 1,29}, { 2,29}, { 3,29}, { 4,29}, { 5,29}, { 6,29}, { 7,29}, { 8,29}, { 9,29}, {10,29}, {11,29}, {12,29}, {13,29}, {14,29}, {15,29}, {16,29}, {17,29}, {18,29}, {19,29}, {20,29}, {21,29}, {22,29}, {23,29}, // ... : {24,29}, {25,29}, {26,29}, { 1,31}, { 2,31}, { 3,31}, { 4,31}, { 5,31}, { 9,31}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 0}, { 5, 0}, { 6, 0}, { 7, 0},// @ - g { 8, 0}, { 9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0},// h - o {16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0},// p - w {24, 0}, {25, 0}, {26, 0}, { 6,31}, { 7,31}, { 8,31}, { 0,30}, {28,31},// x - 127 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//135 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//143 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//151 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//159 { 0, 0}, { 0, 0}, { 0, 0}, {14,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//167 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//175 {12,31}, {10,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//183 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//191 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//199 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//207 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {13,31},//215 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//223 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//231 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//239 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {11,31},//247 {12,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} //255 }; /* * The same in a format more suitable for decoding. * The index is the varicode symbol, being 1-2 nibbles. The value is the * ASCII character. * NB. Do NOT use CR as a line feed, as you will get an extra space and the * new line will be indented. Use LF = ascii 10 instead. */ // decode [ prev * 32 + curr] ; 0 < prev < 29; curr == 29, 30, 31 int ifkp_varidecode[] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 00, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, 46, 32, 64,126, 61, // 0 - 31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 49, 91, // 32 - 63 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 50, 92, // 2 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 51, 93, // 3 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 52, 94, // 4 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 53, 95, // 5 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 54,123, // 6 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, 55,124, // 7 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, 56,125, // 8 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, 57, 96, // 9 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 48,177, // 10 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, 33,247, // 11 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, 34,176, // 12 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, 35,215, // 13 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, 36,163, // 14 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 79, 37, -1, // 15 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, 38, -1, // 16 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 39, -1, // 17 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, 40, -1, // 18 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, 41, -1, // 19 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 42, -1, // 20 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, 43, -1, // 21 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, 45, -1, // 22 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 47, -1, // 23 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, 58, -1, // 24 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, 59, -1, // 25 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 60, -1, // 26 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 62, 8, // 27 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, 10,127, // 28 }; const char *ifkp_ascii[256] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "£", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "°", "±", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "×", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "÷", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; fldigi-4.1.06/src/ifkp/tux.cxx0000644000175000017500000023314213472115774013065 00000000000000// tux avatar unsigned char tux_img[59*74*3] = { 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 36, 36, 36, 74, 74, 76, 44, 44, 44, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 36, 36, 36, 124, 124, 124, 86, 86, 84, 28, 28, 27, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 44, 44, 44, 92, 92, 92, 60, 60, 60, 36, 36, 36, 10, 6, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 12, 12, 12, 10, 6, 4, 44, 44, 44, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 52, 52, 52, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 20, 20, 19, 131, 131, 132, 2, 2, 4, 52, 52, 52, 2, 2, 4, 2, 2, 4, 12, 12, 12, 2, 2, 4, 86, 86, 84, 141, 141, 140, 156, 156, 156, 68, 68, 68, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 148, 148, 148, 204, 204, 204, 156, 156, 156, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 100, 100, 100, 172, 172, 172, 196, 196, 196, 204, 204, 204, 181, 180, 179, 28, 28, 27, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 10, 6, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 2, 2, 4, 2, 2, 4, 2, 2, 4, 221, 221, 220, 254, 254, 252, 228, 228, 228, 212, 212, 212, 244, 244, 244, 164, 164, 164, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 60, 60, 60, 124, 124, 124, 60, 60, 60, 148, 148, 148, 254, 254, 252, 12, 12, 12, 12, 12, 12, 2, 2, 4, 244, 244, 244, 244, 244, 244, 2, 2, 4, 148, 148, 148, 212, 212, 212, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 86, 86, 84, 2, 2, 4, 2, 2, 4, 44, 44, 44, 254, 254, 252, 12, 12, 12, 12, 12, 12, 12, 12, 12, 236, 236, 236, 36, 36, 36, 2, 2, 4, 12, 12, 12, 12, 12, 12, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 52, 52, 52, 12, 12, 12, 2, 2, 4, 2, 2, 4, 164, 164, 164, 182, 140, 8, 172, 140, 4, 142, 106, 7, 156, 156, 156, 60, 60, 60, 2, 2, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 254, 254, 252, 2, 2, 4, 173, 120, 10, 173, 120, 10, 235, 188, 11, 225, 180, 10, 142, 106, 7, 225, 180, 10, 225, 180, 10, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 228, 228, 228, 173, 120, 10, 218, 163, 9, 236, 180, 11, 235, 188, 11, 235, 196, 12, 235, 205, 40, 244, 213, 67, 241, 212, 42, 243, 196, 11, 215, 172, 9, 196, 196, 196, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 165, 114, 10, 201, 142, 7, 229, 172, 9, 236, 180, 11, 235, 196, 12, 237, 204, 14, 242, 218, 44, 246, 218, 74, 246, 218, 20, 246, 213, 13, 246, 218, 20, 243, 205, 12, 235, 179, 22, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 73, 48, 6, 192, 133, 7, 216, 156, 8, 236, 180, 11, 235, 188, 11, 235, 196, 12, 235, 205, 40, 246, 218, 74, 246, 218, 20, 246, 218, 20, 246, 213, 13, 246, 213, 13, 150, 114, 11, 229, 172, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 106, 75, 6, 201, 142, 7, 223, 165, 9, 242, 182, 12, 235, 188, 11, 237, 204, 14, 244, 213, 67, 246, 218, 20, 246, 213, 13, 246, 213, 13, 208, 164, 13, 206, 142, 8, 218, 163, 9, 216, 156, 8, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 116, 73, 4, 215, 172, 9, 245, 189, 12, 235, 196, 12, 235, 205, 40, 241, 211, 17, 246, 213, 13, 237, 204, 14, 106, 75, 6, 207, 148, 7, 216, 156, 8, 216, 156, 8, 199, 138, 8, 2, 2, 4, 2, 2, 4, 124, 124, 124, 28, 28, 27, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 164, 164, 164, 136, 95, 7, 142, 106, 7, 189, 157, 4, 189, 157, 4, 154, 119, 11, 164, 109, 5, 192, 133, 7, 206, 142, 8, 207, 148, 7, 192, 133, 7, 190, 189, 188, 190, 189, 188, 2, 2, 4, 2, 2, 4, 36, 36, 36, 131, 131, 132, 52, 52, 52, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 190, 189, 188, 190, 189, 188, 155, 102, 5, 193, 139, 10, 223, 165, 9, 215, 150, 13, 206, 142, 8, 192, 133, 7, 192, 133, 7, 184, 173, 150, 190, 189, 188, 196, 196, 196, 196, 196, 196, 28, 28, 27, 2, 2, 4, 2, 2, 4, 124, 124, 124, 74, 74, 76, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 190, 189, 188, 190, 189, 188, 190, 189, 188, 144, 96, 7, 164, 109, 5, 164, 109, 5, 155, 102, 5, 171, 114, 5, 190, 189, 188, 181, 180, 179, 196, 196, 196, 244, 244, 244, 244, 244, 244, 212, 212, 212, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 236, 236, 236, 204, 204, 204, 190, 189, 188, 190, 189, 188, 181, 180, 179, 184, 173, 150, 190, 189, 188, 190, 189, 188, 190, 189, 188, 204, 204, 204, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 28, 28, 27, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 12, 12, 12, 2, 2, 4, 108, 108, 107, 254, 254, 252, 236, 236, 236, 190, 189, 188, 190, 189, 188, 190, 189, 188, 190, 189, 188, 190, 189, 188, 190, 189, 188, 212, 212, 212, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 12, 12, 12, 20, 20, 19, 254, 254, 252, 254, 254, 252, 254, 254, 252, 204, 204, 204, 190, 189, 188, 190, 189, 188, 190, 189, 188, 212, 212, 212, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 228, 228, 228, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 164, 164, 164, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 236, 236, 236, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 221, 221, 220, 228, 228, 228, 52, 52, 52, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 156, 156, 156, 196, 196, 196, 228, 228, 228, 244, 244, 244, 244, 244, 244, 244, 244, 244, 228, 228, 228, 228, 228, 228, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 212, 212, 212, 204, 204, 204, 196, 196, 196, 196, 196, 196, 190, 189, 188, 196, 196, 196, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 172, 172, 172, 228, 228, 228, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 221, 221, 220, 204, 204, 204, 196, 196, 196, 190, 189, 188, 204, 204, 204, 100, 100, 100, 2, 2, 4, 60, 60, 60, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 12, 12, 12, 2, 2, 4, 164, 164, 164, 228, 228, 228, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 212, 212, 212, 190, 189, 188, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 52, 52, 52, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 196, 196, 196, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 68, 68, 68, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 12, 12, 12, 2, 2, 4, 181, 180, 179, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 212, 212, 212, 2, 2, 4, 12, 12, 12, 44, 44, 44, 12, 12, 12, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 44, 44, 44, 20, 20, 19, 80, 80, 80, 28, 28, 27, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 10, 6, 4, 2, 2, 4, 204, 204, 204, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 244, 244, 244, 20, 20, 19, 28, 28, 27, 12, 12, 12, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 12, 12, 12, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 100, 100, 100, 2, 2, 4, 28, 28, 27, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 10, 6, 4, 2, 2, 4, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 10, 6, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 44, 44, 44, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 20, 20, 19, 2, 2, 4, 20, 20, 19, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 28, 28, 27, 2, 2, 4, 28, 28, 27, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 60, 60, 60, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 60, 60, 60, 2, 2, 4, 60, 60, 60, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 228, 228, 228, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 68, 68, 68, 2, 2, 4, 2, 2, 4, 68, 68, 68, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 36, 36, 36, 100, 100, 100, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 60, 60, 60, 2, 2, 4, 2, 2, 4, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 92, 92, 92, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 2, 2, 4, 12, 12, 12, 60, 60, 60, 10, 6, 4, 36, 36, 36, 44, 44, 44, 12, 12, 12, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 207, 148, 7, 245, 189, 12, 223, 165, 9, 2, 2, 4, 80, 80, 80, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 124, 124, 124, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 193, 139, 10, 242, 182, 12, 245, 189, 12, 245, 189, 12, 229, 172, 9, 2, 2, 4, 68, 68, 68, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 223, 172, 66, 236, 180, 11, 235, 179, 22, 126, 98, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 60, 60, 60, 28, 28, 27, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 215, 150, 13, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 165, 114, 10, 2, 2, 4, 108, 108, 107, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 229, 172, 9, 243, 196, 11, 246, 213, 13, 148, 108, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 20, 20, 19, 164, 119, 10, 226, 188, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 145, 102, 10, 2, 2, 4, 20, 20, 19, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 223, 165, 9, 245, 189, 12, 226, 188, 12, 92, 67, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 235, 196, 12, 243, 205, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 182, 126, 10, 216, 156, 8, 218, 163, 9, 209, 155, 9, 207, 148, 7, 229, 172, 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 237, 204, 14, 2, 2, 4, 2, 2, 4, 10, 6, 4, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 221, 221, 220, 223, 165, 9, 242, 182, 12, 229, 172, 9, 173, 120, 10, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 223, 165, 9, 235, 188, 11, 245, 189, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 215, 150, 13, 235, 179, 22, 236, 180, 11, 229, 172, 9, 236, 180, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 196, 11, 170, 126, 10, 2, 2, 4, 2, 2, 4, 2, 2, 4, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 204, 204, 204, 196, 196, 196, 216, 156, 8, 236, 180, 11, 223, 165, 9, 185, 131, 9, 73, 48, 6, 2, 2, 4, 2, 2, 4, 2, 2, 4, 41, 28, 4, 185, 131, 9, 229, 172, 9, 235, 188, 11, 245, 189, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 181, 126, 47, 218, 163, 9, 236, 180, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 226, 188, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 181, 180, 179, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 196, 196, 196, 196, 196, 196, 215, 150, 13, 229, 172, 9, 229, 172, 9, 207, 148, 7, 185, 131, 9, 179, 121, 7, 173, 120, 10, 179, 121, 7, 192, 133, 7, 216, 156, 8, 242, 182, 12, 245, 189, 12, 245, 189, 12, 215, 172, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 218, 163, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 196, 11, 194, 147, 11, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 204, 204, 204, 196, 196, 196, 201, 142, 7, 229, 172, 9, 236, 180, 11, 218, 163, 9, 207, 148, 7, 207, 148, 7, 207, 148, 7, 207, 148, 7, 223, 165, 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 216, 156, 8, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 205, 12, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 196, 196, 196, 185, 131, 9, 223, 165, 9, 242, 182, 12, 236, 180, 11, 223, 165, 9, 223, 165, 9, 223, 165, 9, 229, 172, 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 207, 148, 24, 236, 180, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 216, 156, 8, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 190, 189, 188, 185, 131, 9, 223, 165, 9, 242, 182, 12, 245, 189, 12, 236, 180, 11, 236, 180, 11, 236, 180, 11, 242, 182, 12, 245, 189, 12, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 235, 188, 11, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 206, 142, 8, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 205, 12, 164, 119, 10, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 190, 189, 188, 2, 2, 4, 185, 131, 9, 223, 165, 9, 235, 188, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 229, 172, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 206, 142, 8, 229, 172, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 188, 11, 235, 196, 12, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 2, 2, 4, 10, 6, 4, 185, 131, 9, 223, 165, 9, 242, 182, 12, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 206, 142, 8, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 196, 12, 207, 148, 24, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 12, 12, 12, 2, 2, 4, 2, 2, 4, 31, 22, 4, 182, 126, 10, 223, 165, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 229, 172, 9, 223, 165, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 179, 121, 7, 207, 148, 7, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 225, 180, 10, 218, 163, 9, 106, 75, 6, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 212, 212, 212, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 49, 35, 5, 182, 126, 10, 229, 172, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 179, 22, 215, 150, 13, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 236, 180, 11, 223, 165, 9, 164, 109, 5, 12, 12, 12, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 64, 44, 7, 182, 126, 10, 223, 165, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 223, 165, 9, 206, 142, 8, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 242, 182, 12, 242, 182, 12, 242, 182, 12, 245, 189, 12, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 218, 163, 9, 179, 121, 7, 41, 28, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 52, 52, 52, 20, 20, 19, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 85, 59, 6, 185, 131, 9, 223, 165, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 223, 165, 9, 199, 138, 8, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 192, 133, 7, 192, 133, 7, 215, 150, 13, 216, 156, 8, 223, 165, 9, 229, 172, 9, 229, 172, 9, 235, 179, 22, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 236, 180, 11, 209, 155, 9, 164, 109, 5, 91, 58, 5, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 91, 58, 5, 182, 126, 10, 216, 156, 8, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 235, 179, 22, 223, 165, 9, 216, 156, 8, 192, 133, 7, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 144, 96, 7, 164, 109, 5, 179, 121, 7, 182, 126, 10, 192, 133, 7, 201, 142, 7, 206, 142, 8, 216, 156, 8, 223, 165, 9, 229, 172, 9, 235, 179, 22, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 179, 22, 223, 165, 9, 182, 126, 10, 151, 97, 5, 91, 58, 5, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 83, 54, 6, 171, 114, 5, 199, 138, 8, 223, 165, 9, 242, 182, 12, 242, 182, 12, 242, 182, 12, 242, 182, 12, 229, 172, 9, 216, 156, 8, 199, 138, 8, 171, 114, 5, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 135, 88, 5, 151, 97, 5, 157, 106, 7, 164, 109, 5, 179, 121, 7, 179, 121, 7, 192, 133, 7, 207, 148, 7, 216, 156, 8, 223, 165, 9, 236, 180, 11, 236, 180, 11, 223, 165, 9, 201, 142, 7, 164, 109, 5, 131, 82, 4, 73, 48, 6, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 73, 48, 6, 155, 102, 5, 182, 126, 10, 215, 150, 13, 229, 172, 9, 236, 180, 11, 229, 172, 9, 216, 156, 8, 207, 148, 7, 179, 121, 7, 144, 96, 7, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 108, 69, 5, 125, 83, 5, 144, 96, 7, 155, 102, 5, 179, 121, 7, 182, 126, 10, 193, 139, 10, 199, 138, 8, 182, 126, 10, 155, 102, 5, 131, 82, 4, 96, 62, 5, 20, 13, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 64, 44, 7, 143, 90, 4, 171, 114, 5, 182, 126, 10, 192, 133, 7, 201, 142, 7, 199, 138, 8, 179, 121, 7, 171, 114, 5, 116, 73, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 101, 67, 7, 125, 83, 5, 131, 82, 4, 131, 82, 4, 131, 82, 4, 116, 73, 4, 91, 58, 5, 57, 38, 32, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 83, 54, 6, 131, 82, 4, 157, 106, 7, 164, 109, 5, 164, 109, 5, 164, 109, 5, 135, 88, 5, 83, 54, 6, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 73, 48, 6, 96, 62, 5, 91, 58, 5, 73, 48, 6, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 64, 44, 7, 96, 62, 5, 108, 69, 5, 101, 67, 7, 96, 62, 5, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156 }; fldigi-4.1.06/src/common.rc0000644000175000017500000000210713472116000012360 00000000000000/* * This file is included by fldigirc.rc and flarqrc.rc, which must both define * RC_FILE_VERSION_QUAD and RC_FILE_DESCRIPTION and include config.h. */ #include VS_VERSION_INFO VERSIONINFO FILEVERSION RC_FILE_VERSION_QUAD PRODUCTVERSION RC_FILE_VERSION_QUAD FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", RC_FILE_DESCRIPTION "\0" VALUE "ProductVersion", PACKAGE_VERSION "\0" VALUE "FileVersion", PACKAGE_VERSION "." RC_BUILD_TIME "\0" VALUE "InternalName", PACKAGE_TARNAME "\0" VALUE "OriginalFilename", PACKAGE_TARNAME ".exe\0" VALUE "CompanyName", "\0" VALUE "LegalCopyright", PACKAGE_AUTHORS "\0" VALUE "Licence", "GPLv3+\0" VALUE "Info", "http://www.w1hkj.com/\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END fldigi-4.1.06/src/include/0000775000175000017500000000000013515625027012263 500000000000000fldigi-4.1.06/src/include/rtty.h0000644000175000017500000001225213472115776013365 00000000000000// ---------------------------------------------------------------------------- // rtty.h -- RTTY modem // // Copyright (C) 2012 // Dave Freese, W1HKJ // Stefan Fendt, DL1SMF // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RTTY_H #define _RTTY_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #include "view_rtty.h" #define RTTY_SampleRate 8000 //#define RTTY_SampleRate 11025 //#define RTTY_SampleRate 12000 #define MAXPIPE 1024 #define MAXBITS (2 * RTTY_SampleRate / 23 + 1) #define LETTERS 0x100 #define FIGURES 0x200 #define dispwidth 100 // simple oscillator-class class Oscillator { public: Oscillator( double samplerate ); ~Oscillator() {} double Update( double frequency ); private: double m_phase; double m_samplerate; }; class SymbolShaper { public: SymbolShaper(double baud = 45.45, double sr = 8000.0); ~SymbolShaper(); void reset(); void Preset(double baud, double sr); void print_sinc_table(); double Update( bool state ); private: int m_table_size; double* m_sinc_table; bool m_State; double m_Accumulator; long m_Counter0; long m_Counter1; long m_Counter2; long m_Counter3; long m_Counter4; long m_Counter5; double m_Factor0; double m_Factor1; double m_Factor2; double m_Factor3; double m_Factor4; double m_Factor5; double m_SincTable[1024]; double baudrate; double samplerate; }; //enum TTY_MODE { LETTERS, FIGURES }; class rtty : public modem { public: enum RTTY_RX_STATE { RTTY_RX_STATE_IDLE = 0, RTTY_RX_STATE_START, RTTY_RX_STATE_DATA, RTTY_RX_STATE_PARITY, RTTY_RX_STATE_STOP, RTTY_RX_STATE_STOP2 }; enum RTTY_PARITY { RTTY_PARITY_NONE = 0, RTTY_PARITY_EVEN, RTTY_PARITY_ODD, RTTY_PARITY_ZERO, RTTY_PARITY_ONE }; static const double SHIFT[]; static const double BAUD[]; static const int BITS[]; static const int FILTLEN[]; static const int numshifts; static const int numbauds; private: Oscillator *m_Osc1; Oscillator *m_Osc2; SymbolShaper *m_SymShaper1; SymbolShaper *m_SymShaper2; double shift; int symbollen; int nbits; int stoplen; int msb; bool useFSK; double phaseacc; double rtty_squelch; double rtty_shift; double rtty_BW; double rtty_baud; int rtty_bits; RTTY_PARITY rtty_parity; int rtty_stop; bool rtty_msbfirst; double mark_noise; double space_noise; Cmovavg *bits; bool nubit; bool bit; bool bit_buf[MAXBITS]; double mark_phase; double space_phase; fftfilt *mark_filt; fftfilt *space_filt; int filter_length; double *pipe; double *dsppipe; int pipeptr; cmplx mark_history[MAXPIPE]; cmplx space_history[MAXPIPE]; RTTY_RX_STATE rxstate; int counter; int bitcntr; int rxdata; double cfreq; // center frequency between MARK/SPACE tones double shift_offset; // 1/2 rtty_shift double prevsymbol; cmplx prevsmpl; double xy_phase; double rotate; cmplx QI[MAXPIPE]; int inp_ptr; cmplx xy; bool clear_zdata; double sigpwr; double noisepwr; double avgsig; double mark_mag; double space_mag; double mark_env; double space_env; double noise_floor; double FSKbuf[OUTBUFSIZE]; // signal array for qrq drive double FSKphaseacc; double FSKnco(); unsigned char lastchar; int rxmode; int txmode; bool preamble; void Clear_syncscope(); void Update_syncscope(); double IF_freq; inline cmplx mixer(double &phase, double f, cmplx in); unsigned char Bit_reverse(unsigned char in, int n); int decode_char(); int rttyparity(unsigned int); bool rx(bool bit); view_rtty *rttyviewer; // transmit double nco(double freq); void send_symbol(int symbol, int len); void send_stop(); void send_char(int c); void send_idle(); int rttyxprocess(); int baudot_enc(unsigned char data); char baudot_dec(unsigned char data); void Metric(); bool is_mark_space(int &); bool is_mark(); public: rtty(trx_mode mode); ~rtty(); void init(); void rx_init(); void tx_init(); void restart(); void reset_filters(); int rx_process(const double *buf, int len); int tx_process(); void flush_stream(); void clear_viewer() { rttyviewer->clear(); } void clear_ch(int n) { rttyviewer->clearch(n); } int viewer_get_freq(int n) { return rttyviewer->get_freq(n); } void searchDown(); void searchUp(); }; #endif fldigi-4.1.06/src/include/crc8.h0000644000175000017500000000117513472115776013224 00000000000000#ifndef __CRC8_H #define __CRC8_H #include #include #include #include class CRC8 { private: unsigned char val; unsigned char table[256]; char ss[3]; public: CRC8() { val = 0x00; unsigned char crc; for ( int i = 0; i < 256; i++) { crc = i; for (int j = 0; j < 8; j++) crc = (crc << 1) ^ ((crc & 0x80) ? 0x07 : 0); table[i] = crc & 0xFF; } } ~CRC8() {}; std::string sval(std::string s) { val = 0x00; for ( size_t i = 0; i < s.length(); i++ ) { val = table[(val) ^ s[i]]; val &= 0xFF; } snprintf(ss, sizeof(ss), "%02x", val); return ss; } }; #endif fldigi-4.1.06/src/include/lookupcall.h0000664000175000017500000000310413507401434014512 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef LOOKUPCALL_H #define LOOKUPCALL_H #include extern std::string lookup_latd; extern std::string lookup_lond; extern std::string lookup_addr1; extern std::string lookup_addr2; extern std::string lookup_qth; extern std::string lookup_state; extern std::string lookup_province; extern std::string lookup_zip; extern std::string lookup_country; extern void clear_Lookup(); extern void CALLSIGNquery(); enum qrz_xmlquery_t { QRZXML_EXIT = -1, QRZXMLNONE, QRZNET, QRZCD, HAMCALLNET, CALLOOK, HAMQTH }; enum qrz_webquery_t { QRZWEB_EXIT = -1, QRZWEBNONE, QRZHTML, HAMCALLHTML, HAMQTHHTML, CALLOOKHTML }; extern void sendEQSL(const char *url); extern void makeEQSL(const char *msg); #endif fldigi-4.1.06/src/include/maclogger.h0000644000175000017500000000055413472115776014325 00000000000000#ifndef MACLOGGERIO_H #define MACLOGGERIO_H #include #include "threads.h" #include "socket.h" #include "modem.h" #define MACLOGGER_BUFFER_SIZE 2048 extern void get_maclogger_udp(); extern void *maclogger_loop(void *args); extern void maclogger_init(void); extern bool maclogger_start(void); extern void maclogger_close(void); #endif // MACLOGGERIO_H fldigi-4.1.06/src/include/notify.h0000644000175000017500000000227013472115776013672 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NOTIFY_H_ #define NOTIFY_H_ #include "globals.h" void notify_start(void); void notify_stop(void); void notify_show(void); void notify_dxcc_show(bool readonly = true); void notify_change_callsign(void); void notify_rsid(trx_mode mode, int afreq); void notify_create_rsid_event(bool val); #endif // NOTIFY_H_ fldigi-4.1.06/src/include/qrunner.h0000644000175000017500000001373013472115776014057 00000000000000// ---------------------------------------------------------------------------- // qrunner.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef QRUNNER_H_ #define QRUNNER_H_ #ifndef NDEBUG # include # include "debug.h" #endif #include #include #include #include #include #if HAVE_STD_BIND # include namespace qrbind { using std::bind; }; #elif HAVE_STD_TR1_BIND # include namespace qrbind { using std::tr1::bind; }; #else # error need std::bind or std::tr1::bind #endif #include "threads.h" #include "qrunner/fqueue.h" extern void write_message(int line_no, const char *func, const char *msg); extern void qrunner_debug(int tid, const char * name); extern const char *sztid[]; #ifndef __MINGW32__ # define QRUNNER_READ(fd__, buf__, len__) read(fd__, buf__, len__) # define QRUNNER_WRITE(fd__, buf__, len__) write(fd__, buf__, len__) #else # define QRUNNER_READ(fd__, buf__, len__) recv(fd__, (char*)buf__, len__, 0) # define QRUNNER_WRITE(fd__, buf__, len__) send(fd__, (const char*)buf__, len__, 0) #endif class qexception : public std::exception { public: qexception(const char *msg_) : msg(msg_) { } qexception(int e) : msg(strerror(e)) { } ~qexception() throw() { } const char *what(void) const throw() { perror(msg.c_str()); return msg.c_str(); } private: std::string msg; }; struct fsignal { typedef void result_type; pthread_mutex_t* m; pthread_cond_t* c; fsignal(pthread_mutex_t* m_, pthread_cond_t* c_) : m(m_), c(c_) { } void operator()(void) const { pthread_mutex_lock(m); pthread_cond_signal(c); pthread_mutex_unlock(m); } }; struct nop { typedef void result_type; void operator()(void) const { } }; class qrunner { private: #define QRUNNER_DEBUG false public: qrunner(); ~qrunner(); void attach(void); void attach(int, std::string); void detach(void); template bool request(const F& f) { // added mutex here and removed it from qrunner_debug static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; guard_lock reqlock(&m); if (fifo->push(f)) { int resp = QRUNNER_WRITE(pfd[1], "", 1); if (QRUNNER_DEBUG) qrunner_debug(GET_THREAD_ID(), typeid(F).name()); #ifdef NDEBUG if (unlikely(resp != 1)) { throw qexception(errno); } #else assert(resp); #endif return true; } return false; } template bool request_sync(const F& f) { if (!attached) return request(f); for (;;) { if (request(f)) break; sched_yield(); } static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t c = PTHREAD_COND_INITIALIZER; fsignal s(&m, &c); pthread_mutex_lock(&m); for (;;) { if (request(s)) break; sched_yield(); } pthread_cond_wait(&c, &m); pthread_mutex_unlock(&m); return true; } static void execute(int fd, void *arg); void flush(void); void drop(void) { fifo->drop(); } size_t size(void) { return fifo->size(); } std::string id_str(void) { return _id_string; } protected: fqueue *fifo; int pfd[2]; bool attached; int _id_no; std::string _id_string; bool inprog; public: bool drop_flag; }; extern qrunner *cbq[NUM_QRUNNER_THREADS]; #if BENCHMARK_MODE #define REQ(...) ((void)0) #define REQ_DROP(...) ((void)0) #define REQ_SYNC(...) ((void)0) #define REQ_FLUSH(...) ((void)0) #define QRUNNER_DROP(...) ((void)0) #else #define REQ REQ_ASYNC #define REQ_DROP REQ_ASYNC_DROP #define REQ_ASYNC(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request(qrbind::bind(__VA_ARGS__)); \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_SYNC(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request_sync(qrbind::bind(__VA_ARGS__)); \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_ASYNC_DROP(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) { \ if (unlikely(cbq[GET_THREAD_ID()]->drop_flag)) \ break; \ cbq[GET_THREAD_ID()]->request(qrbind::bind(__VA_ARGS__)); \ } \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_SYNC_DROP(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) { \ if (unlikely(cbq[GET_THREAD_ID()]->drop_flag)) \ break; \ cbq[GET_THREAD_ID()]->request_sync(qrbind::bind(__VA_ARGS__)); \ } \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_FLUSH(t_) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request_sync(nop()); \ else if (t_ < NUM_QRUNNER_THREADS) \ cbq[t_]->flush(); \ else \ for (int i = 0; i < NUM_QRUNNER_THREADS; i++) \ cbq[i]->flush(); \ } while (0) #define QRUNNER_DROP(v_) \ do { \ if ((GET_THREAD_ID() != FLMAIN_TID)) \ cbq[GET_THREAD_ID()]->drop_flag = v_; \ } while (0) #endif // BENCHMARK_MODE #endif // QRUNNER_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/configuration.h0000664000175000017500000065751613511716047015246 00000000000000// ---------------------------------------------------------------------------- // configuration.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONFIGURATION_H #define _CONFIGURATION_H #include #include #include "rtty.h" #include "waterfall.h" #include "lookupcall.h" #include "psk_browser.h" #if defined(__linux__) # define DEFAULT_PTTDEV "/dev/ttyS0" # define DEFAULT_CWFSKPORT "/dev/ttyS1" # define DEFAULT_HAMRIGDEVICE "/dev/ttyS0" #elif defined(__FreeBSD__) # define DEFAULT_PTTDEV "/dev/ttyd0" # define DEFAULT_CWFSKPORT "/dev/ttyd1" # define DEFAULT_HAMRIGDEVICE "/dev/ttyd0" #elif defined(__NetBSD__) # define DEFAULT_PTTDEV "/dev/tty00" # define DEFAULT_CWFSKPORT "/dev/tty01" # define DEFAULT_HAMRIGDEVICE "/dev/tty00" #elif defined(__OpenBSD__) # define DEFAULT_PTTDEV "/dev/tty00" # define DEFAULT_CWFSKPORT "/dev/tty01" # define DEFAULT_HAMRIGDEVICE "/dev/tty00" #elif defined(__WOE32__) # define DEFAULT_PTTDEV "COM1" # define DEFAULT_CWFSKPORT "COM2" # define DEFAULT_HAMRIGDEVICE "COM1" #else // not sure # define DEFAULT_PTTDEV "/dev/ptt" # define DEFAULT_CWFSKPORT "/dev/fsk" # define DEFAULT_HAMRIGDEVICE "/dev/rig" #endif // Format: ELEM_(TYPE, VARIABLE-NAME, TAG-STRING, DOC-STRING, DEFAULT-VALUE) // Variables that are not saved to the xml file have empty TAG-STRINGs and DOC-STRINGs // // No preprocessor directives or C++ comments inside this macro! // Indent with spaces only. // The 'comments' field should not contain either '<' or '>' characters! #ifdef ELEM_ # error ELEM_ should not be defined at this point #endif #define CONFIG_LIST \ ELEM_(bool, confirmExit, "CONFIRMEXIT", \ "Ensure user wants to leave flgidi", \ true) \ ELEM_(bool, show_tx_timer, "SHOW_TX_TIMER", \ "Show tx timer on menu bar", \ true) \ ELEM_(int, tx_timeout, "TX_TIMEOUT", \ "TX deadman timeout in minutes", \ 5) \ ELEM_(bool, SaveConfig, "SAVECONFIG", \ "Save current configuration on exit", \ true) \ ELEM_(bool, noise, "NOISETEST", \ "Noise test on/off", \ false) \ ELEM_(double, s2n, "SIGNAL2NOISE", \ "Signal to Noise ratio for test", \ +20.0) \ ELEM_(bool, rsidWideSearch, "RSIDWIDESEARCH", \ "RSID detector searches the entire passband", \ false) \ ELEM_(int, rsid_squelch, "RSIDSQUELCH", \ "RSID detection opens squelch for nn seconds", \ 5) \ ELEM_(bool, rsid, "RECEIVERSID", \ "Enable Reed Soloman ID decoding", \ false) \ ELEM_(bool, TransmitRSid, "TRANSMITRSID", \ "Send RSID at beginning and end of transmission", \ false) \ ELEM_(bool, rsid_mark, "RSIDMARK", \ "Append marker (for the previous modem and frequency) to the RX text\n" \ "widget before changing to the new modem and/or frequency", \ true) \ ELEM_(bool, rsid_notify_only, "RSIDNOTIFYONLY", \ "Trigger RSID notifications but do not change modem and frequency", \ false) \ ELEM_(bool, rsid_auto_disable, "RSIDAUTODISABLE", \ "Disable RSID detection when RsID signal is detected", \ false) \ ELEM_(bool, rsid_post, "RSIDPOST", \ "Transmit an RSID signal when modem data is concluded", \ false) \ ELEM_(mode_set_t, rsid_rx_modes, "RSIDRXMODESEXCLUDE", \ "Mode names for which RSID reception is disabled", \ mode_set_t()) \ ELEM_(mode_set_t, rsid_tx_modes, "RSIDTXMODESEXCLUDE", \ "Mode names for which RSID transmission is disabled", \ mode_set_t()) \ ELEM_(int, RsID_label_type, "RSID_ERRORS", \ "values (low, medium, high) 0, 1, 2", \ 1) \ ELEM_(bool, disable_rsid_warning_dialog_box, "DISABLE_RSID_WARNING_DIALOG_BOX", \ "disable displaying the rsid warning dialog box", \ false) \ ELEM_(bool, slowcpu, "SLOWCPU", \ "Disable expensive processing in some decoders", \ true) \ ELEM_(bool, disable_rsid_freq_change, "DISABLERSIDFREQCHANGE", \ "disable changing frequency on rsid modem change/reset", \ false) \ ELEM_(bool, retain_freq_lock, "RETAINFREQLOCK", \ "retain frequency lock on rsid modem change/reset", \ true) \ ELEM_(bool, changed, "", "", false) \ \ ELEM_(double, wfRefLevel, "WFREFLEVEL", \ "Waterfall reference level (dB)", \ 0.0) \ ELEM_(double, wfAmpSpan, "WFAMPSPAN", \ "Waterfall amplitude span (dB)", \ 60.0) \ ELEM_(bool, WF_UIrev, "WF_UIREV", \ "WF_UI - enable reverse button", \ false) \ ELEM_(bool, WF_UIx1, "WF_UIX1", \ "WF_UI - enable scale multiplication button", \ false) \ ELEM_(int, drop_speed, "DROP_SPEED", \ "DROP_SPEED - slow rate waterfall drop speed", \ 8) \ ELEM_(bool, WF_UIwfcarrier, "WF_UIWFCARRIER", \ "WF_UI - enable wf carrier button", \ false) \ ELEM_(bool, WF_UIwfshift, "WF_UIWFSHIFT", \ "WF_UI - enable wf shift buttons", \ false) \ ELEM_(bool, WF_UIwfreflevel, "WF_UIWFREFLEVEL", \ "WF_UI - enable rf level and range controls", \ false) \ ELEM_(bool, WF_UIwfdrop, "WF_UIWFDROP", \ "WF_UI - enable wf drop rate control", \ false) \ ELEM_(bool, WF_UIwfampspan, "WF_UIWFAMPSPAN", \ "WF_UI - enable wf amp span control", \ false) \ ELEM_(bool, WF_UIwfstore, "WF_UIWFSTORE", \ "WF_UI - enable wf memory store button", \ false) \ ELEM_(bool, WF_UIwfmode, "WF_UIWFMODE", \ "WF_UI - enable wf mode control", \ false) \ ELEM_(bool, WF_UIqsy, "WF_UIQSY", \ "WF_UI - enable wf qsy button", \ false) \ ELEM_(bool, WF_UIxmtlock, "WF_UIXMTLOCK", \ "WF_UI - enable wf transmit lock button", \ false) \ ELEM_(int, LowFreqCutoff, "LOWFREQCUTOFF", \ "Lowest frequency shown on waterfall (Hz)", \ 0) \ ELEM_(int, HighFreqCutoff, "HIGHFREQCUTOFF", \ "Highest frequency shown on waterfall (Hz)", \ 3000) \ ELEM_(double, CWsweetspot, "CWSWEETSPOT", \ "Default CW tracking point (Hz)", \ 1500) \ ELEM_(double, RTTYsweetspot, "RTTYSWEETSPOT", \ "Default RTTY tracking point (Hz)", \ 1500) \ ELEM_(double, PSKsweetspot, "PSKSWEETSPOT", \ "Default tracking point for all other modems (Hz)", \ 1500) \ ELEM_(bool, StartAtSweetSpot, "STARTATSWEETSPOT", \ "Always start new modems at sweet spot frequencies", \ true) \ ELEM_(bool, CWOffset, "CWOFFSET", \ "Select if waterfall should compensate for BFO offset in CW", \ false) \ ELEM_(bool, CWIsLSB, "CWISLSB", \ "Select if BFO is injected as LSB instead of USB", \ false) \ ELEM_(bool, WaterfallHistoryDefault, "WATERFALLHISTORYDEFAULT", \ "Replay audio history when changing frequency by clicking on\n" \ "the waterfall", \ false) \ ELEM_(bool, WaterfallQSY, "WATERFALLQSY", \ "Change rig frequency by dragging the mouse cursor on the waterfall\n" \ "frequency scale area", \ false) \ ELEM_(bool, WaterfallClickInsert, "WATERFALLCLICKINSERT", \ "Insert text to the RX text widget when changing frequency by left\n" \ "clicking on the waterfall", \ false) \ ELEM_(std::string, WaterfallClickText, "WATERFALLCLICKTEXT", \ "Waterfall left click text for WATERFALLCLICKINSERT", \ "\n\n") \ ELEM_(int, WaterfallWheelAction, "WATERFALLWHEELACTION", \ "Describes how waterfall mouse wheel events are handled\n" \ " 0: do nothing; 1: change AFC width or decoder bandwidth;\n" \ " 2: signal search; 3: change squelch level; 4: change modem carrier;\n" \ " 5: change modem; 6: scroll visible area. The default is 4.", \ waterfall::WF_CARRIER) \ ELEM_(bool, rx_lowercase, "RX_LOWERCASE", \ "Print Rx in lowercase for CW, RTTY, CONTESTIA and THROB", \ false) \ ELEM_(bool, tx_lowercase, "TX_LOWERCASE", \ "Transmit all text in lowercase", \ false) \ /* PSK, filter can be 0, 1, 2 */ \ ELEM_(int, PSK_filter, "PSKFILTER", \ "0 - PskCore filter\n" \ "1 - Raised cosine / sinc filter\n" \ "2 - G3PLX (gmfsk) filter", \ 0) \ ELEM_(bool, pskbrowser_on, "PSKBROWSER_ON", \ "Enable psk multi-channel detector - disable for very slow cpus", \ true) \ /* PSK / PSKmail interface */ \ ELEM_(int, SearchRange, "PSKSEARCHRANGE", \ "PSK signal acquisition search range (Hz)", \ 50) \ ELEM_(bool, pskpilot, "PSKPILOT", \ "Vestigial pilot tone on = 1, off = 0", \ false) \ ELEM_(double, pilot_power, "PILOT_POWER", \ "Pilot tone relative power level", \ -30.0) \ ELEM_(double, ACQsn, "ACQSN", \ "PSK signal acquisition S/N (dB)", \ 9.0) \ ELEM_(bool, Pskmails2nreport, "PSKMAILS2NREPORT", \ "Send s2n report to pskmail client/server", \ false) \ ELEM_(bool, StatusDim, "STATUSDIM", \ "Behaviour of status (S/N and IMD) fields:\n" \ " 0: Clear after timeout\n" \ " 1: Dim after timeout\n", \ true) \ ELEM_(double, StatusTimeout, "STATUSTIMEOUT", \ "Dim or Clear timeout (seconds)", \ 15.0) \ ELEM_(bool, PSKmailSweetSpot, "PSKMAILSWEETSPOT", \ "Reset to carrier when no signal is present", \ false) \ ELEM_(int, ServerOffset, "PSKSERVEROFFSET", \ "Listen for signals within this range (Hz)", \ 50) \ ELEM_(int, ServerCarrier, "PSKSERVERCARRIER", \ "Default PSKMail listen / transmit frequency", \ 1500) \ ELEM_(int, ServerAFCrange, "PSKSERVERAFCRANGE", \ "Limit AFC movement to this range (Hz)", \ 25) \ ELEM_(double, ServerACQsn, "PSKSERVERACGSN", \ "Acquisition S/N (dB)", \ 9.0) \ /* RTTY */ \ ELEM_(int, kahn_demod, "KAHNDEMOD", \ "1 - use Kahn power demodulator\n" \ "0 - use ATC (Kok Chen) demodulator", \ 1) \ ELEM_(bool, true_scope, "TRUESCOPE", \ "Enabled - XY scope displays Mark/Space channel signals\n" \ "Disabled - XY scope displays pseudo M/S signals", \ true) \ ELEM_(int, rtty_shift, "RTTYSHIFT", \ "Carrier shift (Hz). Values are as follows:\n" \ " 0: 23; 1: 85; 2: 160; 3: 170; 4: 182; 5: 200; 6: 240; 7: 350;\n" \ " 8: 425; 9: 850; -1: custom", \ 3) /* 170 */ \ ELEM_(int, rtty_custom_shift, "RTTYCUSTOMSHIFT", \ "Custom shift (Hz)", \ 450) \ ELEM_(double, RTTY_BW, "RTTYBW", \ "Receive filter bandwidth (Hz)", \ 68.0) \ ELEM_(int, rtty_cwi, "RTTYCWI", \ "Selective decoding of mark/space tones\n" \ "0 - both\n" \ "1 - mark only\n" \ "2 - space only", \ 0) \ ELEM_(double, rtty_filter, "RTTYFILTER", \ "Rtty Rx Filter shape factor, K * (t/T)\n" \ "You may alter this value using a text editor\n" \ "change will be effective when restarting fldigi\n" \ "K = 1.25; best for W1HKJ (default)\n" \ "K = 1.5 - best for DO2SMF", \ 1.25) \ ELEM_(int, rtty_baud, "RTTYBAUD", \ "Carrier baud rate. Values are as follows:\n" \ " 1: 45; 1: 45.45; 2: 50; 3: 56; 4: 75; 5: 100; 6: 110; 7: 150; \n" \ " 8: 200; 9: 300", \ 0) /* 45 */ \ ELEM_(int, rtty_bits, "RTTYBITS", \ "Bits per character. Values are as follows:\n" \ " 0: 5 (baudot); 1: 7 (ascii); 2: 8 (ascii)", \ 0) /* 5 */ \ ELEM_(int, rtty_parity, "RTTYPARITY", \ "Parity. Values are as folows:\n" \ " 0: none; 1: even; 2: odd: 3: zero; 4: one", \ rtty::RTTY_PARITY_NONE) \ ELEM_(int, rtty_stop, "RTTYSTOP", \ "Stop bits. Values are as folows:\n" \ " 0: 1; 1: 1.5; 2: 2", \ 1) /* 1.5 */ \ ELEM_(bool, rtty_reverse, "RTTYREVERSE", \ "This setting is currently unused", \ false) \ ELEM_(bool, rtty_msbfirst, "RTTYMSBFIRST", \ "This setting is currently unused", \ false) \ ELEM_(bool, rtty_crcrlf, "RTTYCRCLF", \ "Use \"CR CR LF\" for \"CR LF\"", \ false) \ ELEM_(bool, rtty_autocrlf, "RTTYAUTOCRLF", \ "Automatically add CRLF after `page width' characters", \ true) \ ELEM_(int, rtty_autocount, "RTTYAUTOCOUNT", \ "Page width for RTTYAUTOCRLF", \ 72) \ ELEM_(int, rtty_afcspeed, "RTTYAFCSPEED", \ "AFC tracking speed. Values are as follows:\n" \ " 0: slow; 1: normal; 2: fast", \ 1) /* normal */ \ ELEM_(bool, useFSKkeyline, "", "", false) \ ELEM_(bool, useFSKkeylineDTR, "", "", false) \ ELEM_(bool, FSKisLSB, "", "", true) \ ELEM_(bool, useUART, "", "", false) \ ELEM_(bool, PreferXhairScope, "PREFERXHAIRSCOPE", \ "Default to crosshair digiscope", \ false) \ ELEM_(bool, PseudoFSK, "PSEUDOFSK", \ "Generate Pseudo-FSK signal on right audio channel", \ false) \ ELEM_(bool, kml_enabled, "KMLSERVER_ENABLED", \ "Enable kml server threads", \ true) \ ELEM_(bool, SynopAdifDecoding, "SYNOPADIFDECODING", \ "Decoding of Synop weather information on RTTY to ADIF log", \ false) \ ELEM_(bool, SynopKmlDecoding, "SYNOPKMLDECODING", \ "Decoding of Synop weather information on RTTY to KML file", \ false) \ ELEM_(bool, SynopInterleaved, "SYNOPINTERLEAVED", \ "Decoding of Synop interleaved with coded text, or replaces it", \ false) \ ELEM_(bool, UOSrx, "UOSRX", \ "Revert to unshifted chars on a space (RX)", \ true) \ ELEM_(bool, UOStx, "UOSTX", \ "Revert to unshifted chars on a space (TX)", \ true) \ ELEM_(bool, useMARKfreq, "USEMARKFREQ", \ "Use MARK frequency for logging", \ true) \ /* CW */ \ ELEM_(bool, useCWkeylineRTS, "", "", false) \ ELEM_(bool, useCWkeylineDTR, "", "", false) \ ELEM_(int, CWweight, "CWWEIGHT", \ "Dot to dot-space ratio", \ 50) \ ELEM_(int, CWspeed, "CWSPEED", \ "Transmit speed (WPM)", \ 18) \ ELEM_(int, CWfarnsworth, "CWFARNSWORTH", \ "Speed for Farnsworth timing (WPM)", \ 18) \ ELEM_(bool, CWusefarnsworth, "CWUSEFARNSWORTH", \ "Use Farnsworth timing", \ false) \ ELEM_(int, defCWspeed, "CWDEFSPEED", \ "Default speed (WPM)", \ 24) \ ELEM_(int, CWbandwidth, "CWBANDWIDTH", \ "Filter bandwidth (Hz)", \ 150) \ ELEM_(double, CWlower, "CWLOWER", \ "Detector hysterisis, lower threshold", \ 0.4) \ ELEM_(double, CWupper, "CWUPPER", \ "Detector hysterisis, upper threshold", \ 0.6) \ ELEM_(int, CWmfiltlen, "CWMFILTLEN", \ "Matched Filter length", \ 100) \ ELEM_(bool, CWtrack, "CWTRACK", \ "Automatic receive speed tracking", \ true) \ ELEM_(bool, CWmfilt, "CWMFILT", \ "Matched Filter in use", \ false) \ ELEM_(bool, CWuseSOMdecoding, "CWUSESOMDECODING", \ "Self Organizing Map decoding", \ false) \ ELEM_(int, CWrange, "CWRANGE", \ "Tracking range for CWTRACK (WPM)", \ 10) \ ELEM_(int, CWlowerlimit, "CWLOWERLIMIT", \ "Lower RX limit (WPM)", \ 5) \ ELEM_(int, CWupperlimit, "CWUPPERLIMIT", \ "Upper TX limit (WPM)", \ 50) \ ELEM_(int, cwrx_attack, "CWRX_ATTACK", \ "rx squelch attack timing\n" \ "SLOW = 0 (100)\nMEDIUM = 1 (50)\nFAST = 2 (25)", \ 1) \ ELEM_(int, cwrx_decay, "CWRX_DECAY", \ "rx squelch decay timing\n" \ "SLOW = 0 (1000)\nMEDIUM = 1 (500)\nFAST = 2 (250)", \ 1) \ ELEM_(double, CWdash2dot, "CWDASH2DOT", \ "Dash to dot ratio", \ 3.0) \ ELEM_(bool, QSK, "QSK", \ "Generate QSK signal on right audio channel", \ false) \ ELEM_(double, CWpre, "CWPRE", \ "Pre-keydown timing (milliseconds)", \ 4.0) \ ELEM_(double, CWpost, "CWPOST", \ "Post-keydown timing (milliseconds)", \ 4.0) \ ELEM_(bool, CWid, "CWID", \ "Send callsign in CW at the end of every transmission", \ false) \ ELEM_(int, CWIDwpm, "IDWPM", \ "CW ID speed (WPM)", \ 18) \ ELEM_(mode_set_t, cwid_modes, "CWIDMODESEXCLUDE", \ "Mode names for which CWID transmission is disabled", \ mode_set_t()) \ ELEM_(bool, QSKadjust, "QSKADJUST", \ "Send a continuous stream of test characters as the QSK signal", \ false) \ ELEM_(int, TestChar, "TESTCHAR", \ "Test character for QSKADJUST (ASCII value)", \ 0) \ ELEM_(int, QSKshape, "QSKSHAPE", \ "QSK edge shape. Values are as follows:\n" \ " 0: Hanning; 1: Blackman;" \ "Raised cosine = Hanning.", \ 0) /* Hanning */ \ ELEM_(double, CWrisetime, "CWRISETIME", \ "Leading and trailing edge rise times (milliseconds)", \ 4.0) \ ELEM_(bool, CW_bpf_on, "CW_BPF_ON", \ "Enable filtering of transmit audio", \ false) \ ELEM_(double, CW_bpf, "CW_BPF", \ "Transmit filter hi cutoff frequency\n" \ "f0 +/- CW_bpf/2", \ 100.0) \ ELEM_(bool, CWnarrow, "CWNARROW", \ "Weight decreases with increasing edge timing", \ false) \ ELEM_(bool, CW_use_paren, "CWUSEPAREN", \ "Use open paren character; typically used in MARS ops", \ false) \ ELEM_(std::string, CW_prosigns, "CWPROSIGNS", \ "CW prosigns BT AA AS AR SK KN INT HM VE", \ "=~<>%+&{}") \ ELEM_(bool, A_umlaut, "A_umlaut", \ "Use Ä extended CW character", \ true) \ ELEM_(bool, A_aelig, "A_aelig", \ "Use Æ extended CW character", \ false) \ ELEM_(bool, A_ring, "A_ring", \ "Use Ä extended CW character", \ true) \ ELEM_(bool, C_cedilla, "C_cedilla", \ "Use Ç extended CW character", \ true) \ ELEM_(bool, E_grave, "E_grave", \ "Use È extended CW character", \ true) \ ELEM_(bool, E_acute, "E_acute", \ "Use É extended CW character", \ true) \ ELEM_(bool, O_acute, "O_acute", \ "Use Ó extended CW character", \ false) \ ELEM_(bool, O_umlaut, "O_umlaut", \ "Use Ö extended CW character", \ true) \ ELEM_(bool, O_slash, "O_slash", \ "Use Ø extended CW character", \ false) \ ELEM_(bool, N_tilde, "N_tilde", \ "Use Ñ extended CW character", \ true) \ ELEM_(bool, U_umlaut, "U_umlaut", \ "Use Ü extended CW character", \ true) \ ELEM_(bool, U_circ, "U_circ", \ "Use Û extended CW character", \ false) \ ELEM_(bool, WK_K3NGsketch, "WK_K3NGsketch", \ "Mortty loaded with K3NG WinKeyer emulator sketch", \ false) \ /* FELD HELL */ \ ELEM_(double, HELL_BW, "HELL_BW0", "Feld Hell working bandwidth", 245.0) \ ELEM_(double, HELL_BW_FH, "HELL_BW1", "FH bandwidth", 245.0) \ ELEM_(double, HELL_BW_SH, "HELL_BW2", "Slow Hell bandwidth", 30.0) \ ELEM_(double, HELL_BW_X5, "HELL_BW3", "X5 Hell bandwidth", 1225.) \ ELEM_(double, HELL_BW_X9, "HELL_BW4", "X9 Hell bandwidth", 2205.0) \ ELEM_(double, HELL_BW_FSK, "HELL_BW5", "FSK Hell bandwidth", 180.0) \ ELEM_(double, HELL_BW_FSK105, "HELL_BW6", "FSK105 Hell bandwidth", 100.0) \ ELEM_(double, HELL_BW_HELL80, "HELL_BW7", "HELL80 bandwidth", 450.0) \ ELEM_(int, HellRcvWidth, "HELLRCVWIDTH", \ "Horizontal size multiplier for each hell character, 1, 2, or 3", \ 2) \ ELEM_(int, HellRcvHeight, "HELLRCVHEIGHT", \ "Vertical char size in pixels", \ 20) \ ELEM_(bool, HellBlackboard, "HELLBLACKBOARD", \ "Display RX in reverse video", \ false) \ ELEM_(bool, HellMarquee, "HELLMARQUEE", \ "Display RX as scrolling marquee", \ false) \ ELEM_(int, HellXmtWidth, "HELLXMTWIDTH", \ "Transmit width (number of multiple scans per character line)", \ 1) \ ELEM_(bool, HellXmtIdle, "HELLXMTIDLE", \ "Transmit periods (.) when idle", \ false) \ ELEM_(int, HellPulseFast, "HELLPULSEFAST", \ "Raised cosine pulse shape factor. Values are as follows:\n" \ " 0: slow (4 ms)\n" \ " 1: med (2 ms)\n" \ " 2: fast (1 ms)\n" \ " 3: Hard (off)", \ 1) /* slow */ \ ELEM_(int, hellagc, "HELLAGC", \ "1 - slow, 2 - medium, 3 - fast", \ 2) \ /* OLIVIA */ \ ELEM_(int, oliviatones, "OLIVIATONES", \ "Number of tones. Values are as follows:\n" \ " 0: 2; 1: 4; 2: 8; 3: 16; 4: 32; 5: 64; 6: 128; 7: 256", \ 2) /* 8 */ \ ELEM_(int, oliviabw, "OLIVIABW", \ "Bandwidth (Hz). Values are as follows:\n" \ " 0: 125; 1: 250; 2: 500; 3: 1000; 4: 2000.", \ 2) /* 500 */ \ ELEM_(int, oliviasmargin, "OLIVIASMARGIN", \ "Tune margin (tone frequency spacing)", \ 8) \ ELEM_(int, oliviasinteg, "OLIVIASINTEG", \ "Integration period (FEC blocks)", \ 4) \ ELEM_(bool, olivia_reset_fec, "OLIVIARESETFEC", \ "Force Integration (FEC) depth to be reset when new BW/Tones selected", \ false) \ ELEM_(bool, olivia8bit, "OLIVIA8BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, olivia_start_tones, "OLIVIASTARTTONES", \ "Send start/stop tones", \ true) \ /* CONTESTIA */ \ ELEM_(int, contestiatones, "CONTESTIATONES", \ "Number of tones. Values are as follows:\n" \ " 0: 2; 1: 4; 2: 8; 3: 16; 4: 32; 5: 64; 6: 128; 7: 256", \ 2) /* 8 */ \ ELEM_(int, contestiabw, "CONTESTIABW", \ "Bandwidth (Hz). Values are as follows:\n" \ " 0: 125; 1: 250; 2: 500; 3: 1000; 4: 2000.", \ 2) /* 500 */ \ ELEM_(int, contestiasmargin, "CONTESTIASMARGIN", \ "Tune margin (tone frequency spacing)", \ 8) \ ELEM_(int, contestiasinteg, "CONTESTIASINTEG", \ "Integration period (FEC blocks)", \ 4) \ ELEM_(bool, contestia8bit, "CONTESTIA8BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, contestia_reset_fec, "CONTESTIARESETFEC", \ "Force Integration (FEC) depth to be reset when new BW/Tones selected", \ false) \ ELEM_(bool, contestia_start_tones, "CONTESTIASTARTTONES", \ "Send start/stop tones", \ true) \ /* THOR */ \ ELEM_(double, THOR_BW, "THORBW", \ "Filter bandwidth factor (bandwidth relative to signal width)", \ 2.0) \ ELEM_(bool, THOR_FILTER, "THORFILTER", \ "Enable filtering before decoding", \ true) \ ELEM_(std::string, THORsecText, "THORSECTEXT", \ "Secondary text (sent during keyboard idle times)", \ "") \ ELEM_(int, THOR_PATHS, "THORPATHS", \ "This setting is currently unused", \ 5) \ ELEM_(double, ThorCWI, "THORCWI", \ "CWI threshold (CWI detection and suppression)", \ 0.0) \ ELEM_(bool, THOR_PREAMBLE, "THORPREAMBLE", \ "Detect THOR preamble (and flush Rx pipeline)", \ true) \ ELEM_(bool, THOR_SOFTSYMBOLS, "THORSOFTSYMBOLS", \ "Enable Soft-symbol decoding", \ true) \ ELEM_(bool, THOR_SOFTBITS, "THORSOFTBITS", \ "Enable Soft-bit decoding", \ true) \ ELEM_(bool, PKT_RXTimestamp, "PKTRXTIMESTAMP", \ "No timestamps on RX packets by default", \ false) \ ELEM_(bool, PKT_expandMicE, "PKTEXPANDMICE", \ "decode received Mic-E data", \ false) \ ELEM_(bool, PKT_expandPHG, "PKTEXPANDPHG", \ "decode received PHG data", \ false) \ ELEM_(bool, PKT_expandCmp, "PKTEXPANDCMP", \ "decode received Compressed Position data", \ false) \ ELEM_(bool, PKT_unitsSI, "PKTUNITSSI", \ "display decoded data in SI units", \ false) \ ELEM_(bool, PKT_unitsEnglish, "PKTUNITSENGLISH", \ "display decoded data in English units", \ false) \ /* DOMINOEX */ \ ELEM_(double, DOMINOEX_BW, "DOMINOEXBW", \ "Filter bandwidth factor (bandwidth relative to signal width)", \ 2.0) \ ELEM_(std::string, secText, "SECONDARYTEXT", \ "Secondary text (sent during keyboard idle times)", \ "") \ ELEM_(bool, DOMINOEX_FILTER, "DOMINOEXFILTER", \ "Enable filtering before decoding", \ true) \ ELEM_(bool, DOMINOEX_FEC, "DOMINOEXFEC", \ "Enable MultiPSK-compatible FEC", \ false) \ ELEM_(int, DOMINOEX_PATHS, "DOMINOEXPATHS", \ "This setting is currently unused", \ 5) \ ELEM_(double, DomCWI, "DOMCWI", \ "CWI threshold (CWI detection and suppression)", \ 0.0) \ /* MT63 */ \ ELEM_(bool, mt63_8bit, "MT638BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, mt63_rx_integration, "MT63INTEGRATION", \ "Long receive integration", \ false) \ ELEM_(bool, mt63_twotones, "MT63TWOTONES", \ "Also transmit upper start tone (only if MT63USETONES is enabled)", \ true) \ ELEM_(bool, mt63_usetones, "MT63USETONES", \ "Transmit lower start tone", \ true) \ ELEM_(int, mt63_tone_duration, "MT63TONEDURATION", \ "Tone duration (seconds)", \ 4) \ ELEM_(bool, mt63_at500, "MT63AT500", \ "Always transmit lowest tone at 500 Hz", \ false) \ ELEM_(bool, mt63_centered, "MT63CENTERED", \ "Always transmit centered at 1500 Hz (SHARES requirement)", \ false) \ /* FSQ */ \ ELEM_(int, fsq_frequency, "FSQFREQUENCY", \ "0 - 1150 Hz, 1 - 1500 Hz, 2 - Variable", \ 1) \ ELEM_(int, fsq_movavg, "FSQMOVAVG", \ "size of moving average filter for bin filtering\n" \ "value 2 to 8", \ 4) \ ELEM_(double, fsq_img_filter, "FSQIMGFILTER", \ "0 - 300 Hz, 1 - 400 Hz, 2 - 500 Hz (default)", \ 2) \ ELEM_(double, fsqbaud, "FSQBAUD", \ "6, 4.5, 3 or 2 baud", \ 4.5) \ ELEM_(int, fsqhits, "FSQHITS", \ "3 / 6", \ 3) \ ELEM_(bool, fsq_directed, "FSQDIRECTED", \ "FSQCALL directed mode", \ false) \ ELEM_(bool, fsq_show_monitor, "FSQSHOWMONITOR", \ "Show fsq monitor text panel", \ false) \ ELEM_(bool, fsq_fastavg, "FSQFASTAVG", \ "Symbol averaging: true = fast, false = slow", \ true) \ ELEM_(std::string, fsqQTCtext, "FSQQTCTEXT", \ "QTC text string", \ "cq cq cq de nocall") \ ELEM_(int, fsq_heard_aging, "FSQHEARDAGING", \ "0 - NEVER (default)\n" \ "1 - 1 minute, 2 - 5 minutes, 3 - 10 minutes\n" \ "4 - 20 minutes, 5 - 30 minutes", \ 0) \ ELEM_(int, fsq_sounder, "FSQSOUNDER", \ "0 - OFF (default)\n" \ "1 - 1 minute, 2 - 10 minutes, 3 - 30 minutes", \ 0) \ ELEM_(bool, fsq_lowercase, "FSQLOWERCASE", \ "0 - NO, 1 - YES\n" \ "convert operator MYCALL to lower case for directed call triggers", \ 0) \ ELEM_(int, fsq_time_out, "FSQTIMEOUT", \ "Time out auto replies after XX seconds", \ 6) \ ELEM_(int, fsq_notify_time_out, "FSQNOTIFYTIMEOUT", \ "FSQ notifier dialog time out XX seconds\n" \ "00 == no time out", \ 10) \ ELEM_(bool, fsq_enable_heard_log, "FSQ_ENABLE_HEARD_LOG", \ "FSQ enable heard log file", \ 1) \ ELEM_(std::string, fsq_heard_log, "FSQ_HEARD_LOG", \ "FSQ heard log pathname", \ "fsq_heard_log.txt") \ ELEM_(bool, fsq_enable_audit_log, "FSQ_ENABLE_AUDIT_LOG", \ "FSQ enable audit log file", \ 1) \ ELEM_(std::string, fsq_audit_log, "FSQ_AUDIT_LOG", \ "FSQ audit log pathname", \ "fsq_audit_log.txt") \ ELEM_(Fl_Color, fsq_xmt_color, "FSQXMTCOLOR", \ "Color for FSQ xmt text", \ FL_RED) \ ELEM_(Fl_Color, fsq_directed_color, "FSQDIRECTEDCOLOR", \ "Color for FSQ directed text", \ FL_BLUE) \ ELEM_(Fl_Color, fsq_undirected_color, "FSQUNDIRECTEDCOLOR", \ "Color for FSQ undirected text", \ FL_DARK_GREEN) \ ELEM_(bool, add_fsq_msg_dt, "ADDFSQMSGDT", \ "Add date-time stamp to each # type received message", \ 1) \ ELEM_(bool, always_append, "ALWAYS_APPEND", \ "Enable to always append # directive messages to named file", \ 1) \ /* IFKP */ \ ELEM_(int, ifkp_baud, "IFKPBAUD", \ "1, 2, 3", \ 1) \ ELEM_(bool, ifkp_enable_heard_log, "IFKP_ENABLE_HEARD_LOG", \ "IFKP enable heard log file", \ 1) \ ELEM_(std::string, ifkp_heard_log, "IFKP_HEARD_LOG", \ "IFKP heard log pathname", \ "ifkp_heard_log.txt") \ ELEM_(bool, ifkp_enable_audit_log, "IFKP_ENABLE_AUDIT_LOG", \ "IFKP enable audit log file", \ 1) \ ELEM_(std::string, ifkp_audit_log, "IFKP_AUDIT_LOG", \ "IFKP audit log pathname", \ "ifkp_audit_log.txt") \ ELEM_(bool, ifkp_lowercase, "IFKPLOWERCASE", \ "0 - NO, 1 - YES\n" \ "convert operator MYCALL to lower case for all IFKP macros", \ 1) \ ELEM_(bool, ifkp_lowercase_call, "IFKPCALLLOWERCASE", \ "0 - NO, 1 - YES\n" \ "convert other CALLSIGN to lower case for all IFKP macros", \ 1) \ ELEM_(bool, ifkp_freqlock, "IFKPFREQLOCK", \ "0 - NO, 1 - YES\n" \ "Always t/r at 1500 Hz", \ 1) \ /* Waterfall & UI */ \ ELEM_(uchar, red, "", "", 0) \ ELEM_(uchar, green, "", "", 255) \ ELEM_(uchar, blue, "", "", 255) \ ELEM_(bool, MultiColorWF, "", "", false) \ ELEM_(int, wfPreFilter, "WFPREFILTER", \ "Waterfal FFT prefilter window function. Values are as follows:\n" \ " 0: Rectangular; 1: Blackman; 2: Hamming; 3: Hanning; 4: Triangular", \ 1) /* Blackman */ \ ELEM_(bool, WFaveraging, "WFAVERAGING", \ "Use FFT averaging to decrease waterfall noise", \ false) \ ELEM_(int, wf_latency, "WF_LATENCY", \ "Waterfal latency, 1...16", \ 8) \ ELEM_(bool, UseCursorLines, "USECURSORLINES", \ "Draw cursor with vertical lines", \ true) \ ELEM_(bool, UseCursorCenterLine, "USECURSORCENTERLINE", \ "Draw cursor center line", \ true) \ ELEM_(bool, UseBWTracks, "USEBWTRACKS", \ "Draw bandwidth marker with vertical lines", \ true) \ ELEM_(bool, UseWideTracks, "USEWIDETRACKS", \ "Draw bandwidth marker with 3x vertical lines", \ false) \ ELEM_(bool, UseWideCursor, "USEWIDECURSOR", \ "Draw cursor with 3x vertical lines", \ false) \ ELEM_(bool, UseWideCenter, "USEWIDECENTER", \ "Draw center line marker with 3x vertical lines", \ false) \ ELEM_(RGBI, cursorLineRGBI, "CLCOLORS", \ "Color of cursor lines (RGBI)", \ {255, 255, 0, 255}) \ ELEM_(RGBI, cursorCenterRGBI, "CCCOLORS", \ "Color of cursor center line (RGBI)", \ {255, 255, 255, 255}) \ ELEM_(RGBI, bwTrackRGBI, "BWTCOLORS", \ "Color of bandwidth marker (RGBI)", \ {255, 0, 0, 255}) \ ELEM_(RGBI, notchRGBI, "NOTCHCOLORS", \ "Color of notch marker (RGBI)", \ {255, 255, 255, 255}) \ ELEM_(RGBI, rttymarkRGBI, "RTTYMARKRGBI", \ "Color of RTTY MARK freq marker (RGBI)", \ {255, 120, 0, 255}) \ ELEM_(int, feldfontnbr, "FELDFONTNBR", \ "Index of raster font used for transmission", \ 4) \ ELEM_(bool, viewXmtSignal, "VIEWXMTSIGNAL", \ "Show transmit signal on waterfall", \ true) \ ELEM_(bool, sendid, "SENDID", \ "Send video ID containing modem name", \ false) \ ELEM_(bool, macroid, "MACROID", \ "This setting is currently unused", \ false) \ ELEM_(bool, sendtextid, "SENDTEXTID", \ "Send video ID containing arbitrary text", \ false) \ ELEM_(std::string, strTextid, "STRTEXTID", \ "Video ID text for SENDTEXTID (keep short!)", \ "CQ") \ ELEM_(double, pretone, "PRETONE", \ "Single tone at center of modem BW, carrier detect for amplifiers", \ 0.0) \ ELEM_(bool, macroCWid, "", "", false) \ ELEM_(std::string, DTMFstr, "", "", "") \ ELEM_(bool, DTMFdecode, "DTMFDECODE", \ "Decode received DTMF tones", \ false) \ ELEM_(int, videowidth, "VIDEOWIDTH", \ "Video ID text width (characters per row)", \ 1) \ ELEM_(bool, vidlimit, "VIDLIMIT", \ "Limit video width to 500 Hz", \ true) \ ELEM_(bool, vidmodelimit, "VIDMODELIMIT", \ "Limit video width to mode bandwidth", \ true) \ ELEM_(bool, ID_SMALL, "IDSMALL", \ "Use small video ID font", \ true) \ ELEM_(mode_set_t, videoid_modes, "VIDEOIDMODESEXCLUDE", \ "Mode names for which Video ID transmission is disabled", \ mode_set_t()) \ ELEM_(bool, macrotextid, "", "", false) \ ELEM_(bool, docked_rig_control, "DOCKEDRIGCONTROL", \ "Docked rig control", \ true) \ ELEM_(int, wfheight, "WFHEIGHT", \ "Waterfall height (pixels)", \ 125) \ ELEM_(bool, tooltips, "TOOLTIPS", \ "Show tooltips", \ true) \ ELEM_(bool, NagMe, "NAGME", \ "Prompt to save log", \ true) \ ELEM_(bool, ClearOnSave, "CLEARONSAVE", \ "Clear log fields on save", \ false) \ ELEM_(bool, sort_date_time_off, "SORTDATEOFF", \ "Sort log by date/time off", \ true) \ ELEM_(bool, force_date_time, "FORCEDATETIME", \ "Force date/time ON == OFF", \ false) \ ELEM_(bool, menuicons, "MENUICONS", \ "Show menu icons", \ true) \ ELEM_(mode_set_t, visible_modes, "VISIBLEMODES", \ "Modes that are not shown in the opmodes menu", \ mode_set_t()) \ ELEM_(bool, rxtext_clicks_qso_data, "RXTEXTCLICKS", \ "Double-click on RX text enters QSO data", \ true) \ ELEM_(bool, rxtext_tooltips, "RXTEXTTOOLTIPS", \ "Show callsign tooltips in received text", \ true) \ ELEM_(bool, autofill_qso_fields, "AUTOFILLQSO", \ "Auto-fill Country and Azimuth QSO fields", \ false) \ ELEM_(bool, calluppercase, "CALLUPPERCASE", \ "Convert callsign field to upper case", \ true) \ ELEM_(bool, RSTdefault, "RSTDEFAULT", \ "Default outgoing RST to 599/59", \ true) \ ELEM_(bool, RSTin_default, "RSTINDEFAULT", \ "Default incoming RST to 599/59", \ true) \ ELEM_(bool, autoextract, "AUTOEXTRACT", \ "Enable detection and extraction of \"wrapped\" text", \ true) \ ELEM_(bool, open_flmsg, "OPEN_FLMSG", \ "Open flmsg with the autoextract file", \ true) \ ELEM_(bool, flmsg_transfer_direct, "FLMSG_TRANSFER_DIRECT", \ "Transfer incoming flmsg autosend file to open flmsg application", \ true) \ ELEM_(bool, open_flmsg_print, "OPEN_FLMSG_PRINT", \ "Open flmsg with the autoextract file\nprint to browser\nclose flmsg", \ true) \ ELEM_(bool, open_nbems_folder, "OPEN_NBEMS_FOLDER", \ "Open NBEMS folder upon receipt of an autoextract file", \ false) \ ELEM_(std::string, flmsg_pathname, "FLMSG_PATHNAME", \ "Full pathname to the flmsg executable", \ "") \ ELEM_(std::string, BWSR_REGEX_MATCH, "BWSR_REGEX_MATCH", \ "audio alert audio clip name / file", \ "dinner_bell") \ ELEM_(int, REGEX_ALERT_MENU, "REGEX_ALERT_MENU", \ "menu selector", \ 8) \ ELEM_(bool, ENABLE_BWSR_REGEX_MATCH, "ENABLE_BWSR_REGEX_MATCH", \ "enable audio alert when regex match is detected in browser", \ false) \ ELEM_(std::string, BWSR_MYCALL_MATCH, "BWSR_MYCALL_MATCH", \ "audio alert audio clip name / file", \ "dinner_bell") \ ELEM_(int, MYCALL_ALERT_MENU, "MYCALL_ALERT_MENU", \ "menu selector", \ 8) \ ELEM_(bool, ENABLE_BWSR_MYCALL_MATCH, "ENABLE_BWSR_MYCALL_MATCH", \ "enable audio alert when MYCALL is detected in browser", \ false) \ ELEM_(double, extract_timeout, "EXTRACT_TIMEOUT", \ "Abort message extraction after nn.n seconds of inactivity", \ 2.0) \ ELEM_(std::string, RX_EXTRACT_MSG_RCVD, "RX_EXTRACT_MSG_RCVD", \ "audio alert audio clip name / file", \ "phone") \ ELEM_(int, RX_EXTRACT_ALERT_MENU, "RX_EXTRACT_ALERT_MENU", \ "menu selector", \ 7) \ ELEM_(bool, ENABLE_RX_EXTRACT_MSG_RCVD, "ENABLE_RX_EXTRACT_MSG_RCVD", \ "enable audio alert when flmsg received", \ false) \ ELEM_(std::string, RX_EXTRACT_TIMED_OUT, "RX_EXTRACT_TIMED_OUT", \ "audio alert audio clip name / file", \ "beeboo") \ ELEM_(int, TIMED_OUT_ALERT_MENU, "TIMED_OUT_ALERT_MENU", \ "menu selector", \ 6) \ ELEM_(bool, ENABLE_RX_EXTRACT_TIMED_OUT, "ENABLE_RX_EXTRACT_TIMED_OUT", \ "enable audio alert when flmsg reception times out", \ false) \ ELEM_(std::string, RSID_MATCH, "RSID_MATCH", \ "audio alert audio clip name / file", \ "phone") \ ELEM_(int, RSID_ALERT_MENU, "RSID_ALERT_MENU", \ "menu selector", \ 7) \ ELEM_(bool, ENABLE_RSID_MATCH, "ENABLE_RSID_MATCH", \ "enable audio alert when RsID is detected", \ false) \ ELEM_(std::string, cty_dat_pathname, "CTYDAT_PATHNAME", \ "Full pathname to the cty.dat data file", \ "") \ ELEM_(bool, speak, "SPEAK", \ "Capture text to file 'talk/textout.txt'", \ false) \ ELEM_(bool, auto_talk, "AUTO_TALK", \ "Connect to Digitalk socket server during program initialization", \ false) \ /* QRZ */ \ ELEM_(int, QRZXML, "QRZXMLTYPE", \ "Callsign xml query type. Values are as follows:\n" \ " 0: none; 1: QRZ (paid sub.); 2: QRZ cdrom; 3: HamCall (paid sub.);\n" \ " 4: callook free US calls xml service; 5: hamQTH free xml service.\n" \ " The default is none.", \ QRZXMLNONE) \ ELEM_(std::string, hamcallurl, "HAMCALLURL", \ "web address of hamcall", \ "http://www.hamcall.net/") \ ELEM_(std::string, hamqthurl, "HAMQTHURL", \ "web address of hamqth", \ "https://www.hamqth.com/") \ ELEM_(std::string, qrzurl, "QRZURL", \ "web address of QRZ.com", \ "http://www.qrz.com/") \ ELEM_(std::string, callookurl, "CALLOOKURL", \ "web address of callook", \ "https://callook.info/") \ ELEM_(int, QRZWEB, "QRZWEBTYPE", \ "Callsign browser query type. Values are as follows:\n" \ " 0: none; 1: QRZ web browser; 2: HamCall web browser\n" \ " 3: hamQTH web browser.\n The default is none.", \ QRZWEBNONE) \ ELEM_(std::string, QRZpathname, "QRZPATHNAME", \ "QRZ cdrom path", \ "") \ ELEM_(std::string, QRZusername, "QRZUSER", \ "QRZ or HamCall subscriber username", \ "") \ ELEM_(std::string, QRZuserpassword, "QRZPASSWORD", \ "QRZ or HamCall subscriber password", \ "") \ ELEM_(bool, notes_address, "NOTES_ADDRESS", \ "Populate logbook notes (comment) field with mailing address", \ false) \ ELEM_(bool, clear_notes, "CLEAR_NOTES", \ "Clear notes control when making a new QRZ query", \ true) \ ELEM_(bool, QRZchanged, "", "", false) \ /* eQSL */ \ ELEM_(std::string, eqsl_www_url, "EQSL_url", \ "eQSL web site", \ "http://www.eqsl.cc/qslcard/importADIF.cfm?ADIFdata=") \ ELEM_(std::string, eqsl_id, "EQSL_ID", \ "eQSL login id", \ "") \ ELEM_(std::string, eqsl_pwd, "EQSL_PASSWORD", \ "eQSL login password", \ "") \ ELEM_(std::string, eqsl_nick, "EQSL_NICKNAME", \ "eQSL nickname", \ "") \ ELEM_(std::string, eqsl_default_message, "EQSL_DEF_MSG", \ "eQSl default message", \ "") \ ELEM_(bool, eqsl_when_logged, "EQSL_WHEN_LOGGED", \ "Send eQSL when other log action invoked", \ false) \ ELEM_(bool, eqsl_datetime_off, "EQSL_DATETIME_OFF", \ "Send logbook date/time off vice date on (default)", \ false) \ ELEM_(bool, eqsl_show_delivery, "EQSL_SHOW_DELIVERY", \ "Show timed delivery message for successful eQSL upload", \ true) \ /* tqsl automatic log submission */ \ ELEM_(bool, submit_lotw, "SUBMIT_LOTW", \ "Send adif record to LoTW", \ false) \ ELEM_(bool, lotw_quiet_mode, "LOTW_QUIET_MODE", \ "Add -q to tqsl command line parameters", \ true) \ ELEM_(std::string, lotw_pathname, "LOTW_PATHNAME", \ "Path-name of tqsl executable", \ "") \ ELEM_(std::string, lotw_pwd, "LOTW_PASSWORD", \ "Password to access tqsl executable", \ "") \ ELEM_(bool, submit_lotw_password, "SUBMIT_LOTW_PASSWORD", \ "Send -p with each upload ", \ true) \ ELEM_(bool, lotw_show_delivery, "LOTW_SHOW_DELIVERY", \ "Show timed delivery message for successful LoTW upload", \ true) \ ELEM_(std::string, lotw_location, "LOTW_LOCATION", \ "Tqsl station location for uploading records", \ "") \ /* MacLogger interface */ \ ELEM_(bool, connect_to_maclogger, "CONNECT_TO_MACLOGGER", \ "Connect to MacLogger UDP server on 255.255.255.255 / 9932", \ false) \ ELEM_(bool, capture_maclogger_radio, "CAPTURE_MACLOGGER_RADIO", \ "Capture and use UDP Radio Report data", \ true) \ ELEM_(bool, capture_maclogger_spot_tune, "CAPTURE_MACLOGGER_SPOT_TUNE", \ "Capture and use UDP Spot Tune data", \ false) \ ELEM_(bool, capture_maclogger_spot_report, "CAPTURE_MACLOGGER_SPOT_REPORT", \ "Capture and use UDP Spot Report data", \ false) \ ELEM_(bool, capture_maclogger_log, "CAPTURE_MACLOGGER_LOG", \ "Capture and use UDP Log Report data", \ false) \ ELEM_(bool, capture_maclogger_lookup, "CAPTURE_MACLOGGER_LOOKUP", \ "Capture and use UDP Lookup Report data", \ false) \ ELEM_(bool, enable_maclogger_log, "ENABLE_MACLOGGER_LOG", \ "Enable UDP string capture to file", \ false) \ ELEM_(std::string, maclogger_log_filename, "MACLOGGER_LOG_FILENAME", \ "Filename for maclogger UDP datastream file", \ "maclogger_udp_strings.txt") \ /* N3FJP tcpip interface */ \ ELEM_(std::string, N3FJP_address, "N3FJP_ADDRESS", \ "IP Address of N3FJP socket", \ "127.0.0.1") \ ELEM_(std::string, N3FJP_port, "N3FJP_PORT", \ "IP port number of N3FJP socket", \ "1100") \ ELEM_(bool, enable_N3FJP_log, "ENABLE_N3FJP_LOG", \ "Enable data stream logging.", \ true) \ ELEM_(bool, connect_to_n3fjp, "CONNECT_TO_N3FJP", \ "Connect to the N3FJP log server", \ false) \ ELEM_(bool, N3FJP_sweet_spot, "N3FJP_SWEET_SPOT", \ "Use N3FJP spot report as signal center freq.\n" \ "Center the target at mode sweet spot", \ false) \ ELEM_(bool, N3FJP_modem_carrier, "N3FJP_MODEM_CARRIER", \ "Use actual modem carrier frequency for logging", \ true) \ ELEM_(bool, enable_N3FJP_RIGTX, "N3FJP_RIGTX", \ "Use RIGTX/RX vice CWCOMPORTKEYDOWN/CWCOMPORTKEYUP", \ false) \ /* Rig control */ \ ELEM_(bool, flrig_keys_modem, "FLRIG_KEYS_MODEM", \ "PTT change at flrig changes Rx/Tx state\n" \ "set to false if multple instance of fldigi used with single flrig", \ false) \ ELEM_(bool, fldigi_client_to_flrig, "CLIENT_TO_FLRIG", \ "True if flrig xmlrpc server is used for xcvr control", \ false) \ ELEM_(bool, btnusb, "BTNUSB", \ "This setting is currently unused", \ true) \ ELEM_(bool, RTSptt, "RTSPTT", \ "RTS is PTT signal line", \ false) \ ELEM_(bool, DTRptt, "DTRPTT", \ "DTR is PTT signal line", \ false) \ ELEM_(bool, RTSplus, "RTSPLUS", \ "Initial voltage on RTS is +V", \ false) \ ELEM_(bool, DTRplus, "DTRPLUS", \ "Initial voltage on DTR is +V", \ false) \ ELEM_(bool, SCU_17, "SCU_17", \ "Serial port is SCU-17 (requires 0 stop bits", \ false) \ ELEM_(bool, PTTrightchannel, "PTTRIGHTCHANNEL", \ "Generate PTT signal on right audio channel", \ false) \ ELEM_(int, chkUSEHAMLIBis, "CHKUSEHAMLIBIS", \ "Use Hamlib rig control", \ 0) \ ELEM_(int, chkUSERIGCATis, "CHKUSERIGCATIS", \ "Use RigCAT rig control", \ 0) \ ELEM_(int, chkUSEXMLRPCis, "CHKUSEXMLRPCIS", \ "Use XML-RPC rig control", \ 0) \ ELEM_(std::string, PTTdev, "PTTDEV", \ "PTT device", \ DEFAULT_PTTDEV) \ ELEM_(std::string, CWFSKport, "", "", DEFAULT_CWFSKPORT) \ ELEM_(std::string, HamRigDevice, "HAMRIGDEVICE", \ "Hamlib rig device", \ DEFAULT_HAMRIGDEVICE) \ ELEM_(std::string, HamRigName, "HAMRIGNAME", \ "Hamlib rig name", \ "") \ ELEM_(int, HamRigModel, "HAMRIGMODEL", \ "Hamlib rig model", \ 0) \ ELEM_(std::string, HamConfig, "HAMCONFIG", \ "Hamlib configuration (param=val, ...)", \ "") \ ELEM_(int, HamRigBaudrate, "HAMRIGBAUDRATE", \ "Hamlib rig baud rate. Values are as follows:\n" \ " 0: 300; 1: 600; 2: 1200; 3: 2400; 4: 4800; 5: 9600; 6: 19200;\n" \ " 7: 38400; 8: 57600; 9: 115200; 10: 230400; 11: 460800.", \ 1) /* 600 baud */ \ ELEM_(int, HamRigStopbits, "HAMRIGSTOPBITS", \ "Hamlib stopbits <1/2>.", \ 2) /* 600 baud */ \ ELEM_(int, HamRigPollrate, "HAMRIGPOLLRATE", \ "250 - 2000 in 50 msec increments", \ 250) \ ELEM_(int, hamlib_ptt_on_data, "HAMLIBPTTONDATA", \ "Hamlib PTT for xmt audio on data port", \ 1) \ ELEM_(bool, hamlib_cw_islsb, "HAMLIB_CW_ISLSB", \ "Hamlib xcvr uses LSB for CW", \ false) \ ELEM_(bool, hamlib_rtty_isusb, "HAMLIB_RTTY_ISUSB", \ "Hamlib xcvr uses USB for RTTY", \ false) \ ELEM_(int, hamlib_mode_delay, "HAMRIG_MODE_DELAY", \ "wait NN msec after sending mode change\n" \ "before next transceiver CAT query\n" \ "0 - 2000 in 100 msec increments", \ 200) \ ELEM_(std::string, XmlRigFilename, "XMLRIGFILENAME", \ "RigCAT XML file name", \ "") \ ELEM_(std::string, XmlRigDevice, "XMLRIGDEVICE", \ "RigCAT device", \ DEFAULT_HAMRIGDEVICE) \ ELEM_(int, XmlRigBaudrate, "XMLRIGBAUDRATE", \ "RigCAT rig baud rate. See HAMRIGBAUDRATE.", \ 1) /* 600 baud */ \ ELEM_(int, RigCatStopbits, "RIGCATSTOPBITS", \ "RigCAT stopbits. <1/2>", \ 2) /* 600 baud */ \ ELEM_(bool, TTYptt, "TTYPTT", \ "Use separate device for PTT", \ false) \ ELEM_(bool, HamlibCMDptt, "HAMLIBCMDPTT", \ "PTT via Hamlib command", \ false) \ ELEM_(bool, RigCatCMDptt, "RIGCATCMDPTT", \ "PTT via RigCAT command", \ false) \ ELEM_(bool, UseUHrouterPTT, "USEUHROUTERPTT", \ "Use uHRouter PTT (OS X only)", \ false) \ ELEM_(bool, UsePPortPTT, "USEPPORTPTT", \ "Use parallel port PTT", \ false) \ /* GPIO parameters */ \ ELEM_(long, enable_gpio, "ENABLE_GPIO", \ "GPIO enable\n" \ "bits 0 - 16; bit 0 : gpio pin N", \ 0) \ ELEM_(long, gpio_on, "GPIO_STATE", \ "GPIO State\n" \ "bits 0 - 16; bit 0 : PTT ON state on pin N", \ 0) \ ELEM_(int, gpio_pulse_width, "GPIO_PULSE_WIDTH", \ "GPIO pulse width setting for PiHpSDR PTT", \ 0) \ /* RigCAT parameters */ \ ELEM_(bool, RigCatRTSplus, "RIGCATRTSPLUS", \ "Initial state of RTS", \ false) \ ELEM_(bool, RigCatDTRplus, "RIGCATDTRPLUS", \ "Initial state of DTR", \ false) \ ELEM_(bool, RigCatRTSptt, "RIGCATRTSPTT", \ "Toggle RTS for PTT", \ false) \ ELEM_(bool, RigCatDTRptt, "RIGCATDTRPTT", \ "Toggle DTR for PTT", \ false) \ ELEM_(bool, RigCatRTSCTSflow, "RIGCATRTSCTSFLOW", \ "RTS/CTS flow control", \ false) \ ELEM_(int, RigCatRetries, "RIGCATRETRIES", \ "Number of retries before giving up", \ 2) \ ELEM_(int, RigCatTimeout, "RIGCATTIMEOUT", \ "Retry interval (milliseconds)", \ 10) \ ELEM_(int, RigCatWait, "RIGCATWAIT", \ "Write delay (milliseconds)", \ 50) \ ELEM_(int, RigCatInitDelay, "RIGCATINITDELAY", \ "Wait delay (milliseconds) on first command to serial device", \ 200) \ ELEM_(bool, RigCatECHO, "RIGCATECHO", \ "Commands are echoed", \ false) \ ELEM_(bool, RigCatVSP, "RIGCATVSP", \ "VSP support enabled", \ false) \ ELEM_(bool, RigCatRestoreTIO, "RIGCATRESTORETIO", \ "Restore original state of comm port when closing", \ false) \ /* Hamlib parameters */ \ ELEM_(bool, HamlibRTSplus, "HAMLIBRTSPLUS", \ "RTS +12", \ false) \ ELEM_(bool, HamlibDTRplus, "HAMLIBDTRPLUS", \ "DTR +12", \ false) \ ELEM_(bool, HamlibRTSCTSflow, "HAMLIBRTSCTSFLOW", \ "RTS/CTS flow control", \ false) \ ELEM_(bool, HamlibXONXOFFflow, "HAMLIBXONXOFFFLOW", \ "XON/XOFF flow control", \ false) \ ELEM_(int, HamlibRetries, "HAMLIBRETRIES", \ "Number of times to resend command before giving up", \ 2) \ ELEM_(int, HamlibTimeout, "HAMLIBTIMEOUT", \ "Retry interval (milliseconds)", \ 10) \ ELEM_(int, HamlibWait, "HAMLIBWAIT", \ "Wait interval before reading response (milliseconds)", \ 5) \ ELEM_(int, HamlibWriteDelay, "HAMLIBWRITEDELAY", \ "Write delay (milliseconds)", \ 0) \ ELEM_(int, HamlibSideband, "HAMLIBSIDEBAND", \ "Force the rig sideband (for the purpose of calculating frequencies).\n" \ "Values are as follows: 0: as reported by rig; 1: LSB; 2: USB.", \ 0) /* SIDEBAND_RIG */ \ /* nanoIO interface parameters */ \ ELEM_(std::string, nanoIO_serial_port_name, "NANOSERIALPORTNAME", \ "nanoIO serial device", \ "NONE") \ ELEM_(int, nanoIO_baud, "NANOIOBAUD", \ "0 - 45.45, 1 - 50, 2 - 75, 3 - 100 baud", \ 0) \ ELEM_(int, nanoIO_polarity, "NANOIOPOLARITY", \ "MARK polarity 0 - high, 1 - low", \ 1) \ ELEM_(int, nanoIO_CW_incr, "NANOIOCWINCR", \ "^ ' increment/decrement value\n" \ "range '1' to '5'", \ '2') \ ELEM_(int, CW_keyspeed, "NANOCWKEYSPEED", \ "Paddle keyer WPM (0...100)", \ 18) \ ELEM_(int, nanoIO_CW_keyer, "NANOIOCWKEYER", \ "0 - IambicA, 1 - IambicB, 2 - Straight", \ 0) \ ELEM_(bool, disable_CW_PTT, "disable_CW_PTT", \ "Disable CAT PTT signal during CW ops with expernal h/w", \ 0) \ ELEM_(int, nanoIO_speed_pot, "nanoIO_speed_pot", \ "Enable speed pot in nanoIO circuit / script", \ 1) \ /* TTY h/w interface */ \ ELEM_(int, xcvr_FSK_sideband, "XCVRFSKSIDEBAND", \ "0 = LSB | 1 = USB", \ 0) \ ELEM_(int, xcvr_FSK_MARK, "XCVRFSKMARK", \ "typical values: 1275, 1615 or 2125 for 170 Hz shift, IC7200", \ 2125) \ ELEM_(int, TTY_LTRS, "TTYLTRS", \ "0 to 10, number of LTRS bytes send at beginning of xmt", \ 2) \ /* Navigator interface */ \ ELEM_(std::string, Nav_FSK_port, "NAVFSKPORT", \ "Nav FSK serial device", \ "NONE") \ ELEM_(std::string, Nav_config_port, "NAVCONFIGPORT", \ "Nav config serial device", \ "NONE") \ ELEM_(int, Nav_FSK_baud, "NAVFSKBAUD", \ "0 - 45.45, 1 - 75, 2 - 100 baud", \ 0) \ ELEM_(int, Nav_FSK_sidetone, "NAVFSKSIDETONE", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_FSK_ptt, "NAVFSKPTT", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_FSK_polarity, "NAVFSKPOLARITY", \ "0 = Normal | 1 = Reversed", \ 0) \ ELEM_(int, Nav_FSK_stopbits, "NAVFSKSTOPBITS", \ "0 = 1 | 1 = 1.5 | 2 = 2", \ 1) \ ELEM_(int, Nav_channel_2_att, "NAVCH2ATT", \ "0 = 15 db, 1 = None", \ 1) \ ELEM_(int, Nav_channel_1_att, "NAVCH1ATT", \ "0 = 15 db, 1 = None", \ 1) \ ELEM_(int, Nav_rf_att, "NAVRFATT", \ "0 = 20 db, 1 = None", \ 1) \ ELEM_(int, Nav_led, "NAVLED", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_cat_led, "NAVCATLED", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_wk_ptt, "NAVWKPTT", \ "0 = Off | 1 = On", \ 0) \ /* Operator */ \ ELEM_(std::string, myCall, "MYCALL", \ "Station callsign", \ "") \ ELEM_(std::string, myQth, "MYQTH", \ "Operator QTH", \ "") \ ELEM_(std::string, myName, "MYNAME", \ "Operator name", \ "") \ ELEM_(std::string, myLocator, "MYLOC", \ "Operator Maidenhead locator", \ "") \ ELEM_(std::string, myAntenna, "MYANTENNA", \ "Antenna description (keep short!)", \ "") \ /* Sound card */ \ ELEM_(std::string, operCall, "OPERCALL", \ "Operator call sign, if distinct from the station call MYCALL", \ "") \ ELEM_(int, btnAudioIOis, "AUDIOIO", \ "Audio subsystem. Values are as follows:\n" \ " 0: OSS; 1: PortAudio; 2: PulseAudio; 3: File I/O", \ SND_IDX_NULL) \ ELEM_(std::string, OSSdevice, "OSSDEVICE", \ "OSS device name", \ "") \ ELEM_(std::string, PAdevice, "PADEVICE", \ "For compatibility with older versions", \ "") \ ELEM_(std::string, PortInDevice, "PORTINDEVICE", \ "PortAudio input device name", \ "") \ ELEM_(int, PortInIndex, "PORTININDEX", \ "PortAudio input device index", \ -1) \ ELEM_(std::string, PortOutDevice, "PORTOUTDEVICE", \ "PortAudio input device name", \ "") \ ELEM_(int, PortOutIndex, "PORTOUTINDEX", \ "PortAudio input device index", \ -1) \ ELEM_(int, PortFramesPerBuffer, "", "", 0) \ ELEM_(std::string, PulseServer, "PULSESERVER", \ "PulseAudio server string", \ "") \ ELEM_(bool, is_full_duplex, "IS_FULL_DUPLEX", \ "Audio codec supports full duplex operation", \ true) \ ELEM_(bool, sig_on_right_channel, "SIGONRIGHTCHANNEL", \ "Duplicate modem signal on left & right", \ true) \ ELEM_(bool, ReverseAudio, "REVERSEAUDIO", \ "Reverse left-right rx audio channels", \ false) \ ELEM_(bool, ReverseRxAudio, "REVERSERXAUDIO", \ "Reverse left-right rx audio channels", \ false) \ ELEM_(int, sample_rate, "SAMPLERATE", \ "For compatibility with older versions", \ SAMPLE_RATE_UNSET) \ ELEM_(int, in_sample_rate, "INSAMPLERATE", \ "Input sample rate", \ SAMPLE_RATE_UNSET) \ ELEM_(int, out_sample_rate, "OUTSAMPLERATE", \ "Output sample rate", \ SAMPLE_RATE_UNSET) \ ELEM_(int, sample_converter, "SAMPLECONVERTER", \ "Sample rate conversion type. Values are as follows:\n" \ " 0: Best SINC; 1: Medium SINC; 2: Fastest SINC; 3: ZOH; 4: Linear.\n" \ "The default is 2.", \ SRC_SINC_FASTEST) \ ELEM_(int, RX_corr, "RXCORR", \ "Input (RX) sample rate correction (PPM)", \ 0) \ ELEM_(int, TX_corr, "TXCORR", \ "Output (TX) sample rate correction (PPM)", \ 0) \ ELEM_(int, TxOffset, "TXOFFSET", \ "Difference between RX and TX freq (rig offset)", \ 0) \ ELEM_(int, wavSampleRate, "WAV_SAMPLERATE", \ "Wave file record sample rate\n" \ "0 - 8000, 1 - 11025, 2 - 16000, 3 - 22050\n" \ "4 - 24000, 5 - 44100, 6 - 48000", \ 0) \ ELEM_(bool, record_both_channels, "RECORD_BOTH_CHANNELS", \ "Enabled - record wav file in stereo\n" \ "Disabled - record wav file in monaural (left channel only)", \ false) \ ELEM_(bool, loop_playback, "LOOPPLAYBACK", \ "true = continuous loop of sound file playback\n" \ "false = single pass through playback file.", \ false) \ ELEM_(int, PTT_on_delay, "PTTONDELAY", \ "Start of transmit delay before sending audio", \ 0) \ ELEM_(int, PTT_off_delay, "PTTOFFDELAY", \ "End of transmit delay before disabling PTT", \ 0) \ ELEM_(double, rx_gain, "RX_GAIN", \ "gain factor to compensate for low level output on USB A/D in dB\n" \ "minimum -10.0, maximum + 10.0", \ 0.0) \ /* Contest controls and Logbook */ \ ELEM_(std::string, logbookfilename, "LOGBOOKFILENAME", \ "Logbook file name", \ "") \ ELEM_(bool, DisplayLogbookRead, "LOGBOOKREADDISPLAY", \ "Display read # recs and logbook name on program start", \ 0) \ ELEM_(bool, fixed599, "FIXED599", \ "Force RST in/out to 599", \ true) \ ELEM_(bool, UseLeadingZeros, "USELEADINGZEROS", \ "Insert leading zeros into transmitted serial number (contest)", \ true) \ ELEM_(bool, cutnbrs, "CUTNBRS", \ "Send CW cut numbers", \ false) \ ELEM_(bool, clear_fields, "CLEARFIELDS", \ "clear logging fields upon transfer of CALL from Rx panel", \ true) \ ELEM_(RGB, bwsrSliderColor, "BWSRSLIDERCOLOR", \ "Background color of signal browser detect level", \ {185, 211, 238}) \ ELEM_(RGB, bwsrSldrSelColor,"BWSRSLDRSELCOLOR", \ "Button highlight color, signal browser detect level", \ {54, 100, 139}) \ ELEM_(int, bwsrHiLight1, "BWSRHILIGHT1", \ "View Browser highlight color 1, default Dark Red", \ FL_RED) \ ELEM_(int, bwsrHiLight2, "BWSRHILIGHT2", \ "View Browser highlight color 2, default Dark Green", \ FL_GREEN) \ ELEM_(int, bwsrBackgnd1, "BWSRBACKGND1", \ "View Browser background odd lines", \ 55) \ ELEM_(int, bwsrBackgnd2, "BWSRBACKGND2", \ "View Browser background odd lines", \ 53) \ ELEM_(int, bwsrSelect, "BWSRSELECT", \ "View Browser line select color", \ FL_BLUE) \ ELEM_(RGB, dup_color, "dupcolor", \ "Callsign background color when duplicate detected", \ {255, 110, 180}) \ ELEM_(RGB, possible_dup_color, "duppossiblecolor", \ "Callsign background color when possible duplicate detected", \ {255, 255, 150}) \ ELEM_(bool, EnableDupCheck, "ENABLEDUPCHECK", \ "Check for duplicates (contest)", \ true) \ ELEM_(bool, dupmode, "DUPMODE", \ "Predicate for ENABLEDUPCHECK (mode must match)", \ true) \ ELEM_(bool, dupband, "DUPBAND", \ "Predicate for ENABLEDUPCHECK (band must match)", \ true) \ ELEM_(bool, dupstate, "DUPSTATE", \ "Predicate for ENABLEDUPCHECK (state must match)", \ false) \ ELEM_(bool, dupxchg1, "DUPXCHG1", \ "Predicate for ENABLEDUPCHECK (exchange must match)", \ false) \ ELEM_(bool, duptimespan, "DUPTIMESPAN", \ "Predicate for ENABLEDUPCHECK (QSO inside timespan)", \ false) \ ELEM_(int, timespan, "TIMESPAN", \ "Time for DUPTIMESPAN (minutes)", \ 120) \ ELEM_(int, ContestStart, "CONTESTSTART", \ "Contest starting number", \ 1) \ ELEM_(int, ContestDigits, "CONTESTDIGITS", \ "Number of digits in serial number", \ 4) \ ELEM_(std::string, nonwordchars, "NONWORDCHARS", \ "Additional characters used to delimit WORDS", \ "*,-.;") \ ELEM_(std::string, myXchg, "MYXCGH", \ "Free form exchange", \ "") \ ELEM_(std::string, mytxpower, "TXPOWER", \ "TX power used for logbook entries", \ "") \ ELEM_(std::string, my_FD_call, "FD_CALL", \ "Field Day call sign", \ "") \ ELEM_(std::string, fd_op_call, "FD_OP_CALL", \ "Field Day (w1hkj) server position operator call", \ "") \ ELEM_(std::string, my_FD_class, "FDCLASS", \ "Field Day class", \ "") \ ELEM_(std::string, my_FD_section, "FDSECTION", \ "Field Day section", \ "") \ ELEM_(std::string, my_FD_mult, "FDMULT", \ "Field Day multiplier", \ "5") \ ELEM_(std::string, my_SCR_class, "MY_SCR_CLASS", \ "School Round Up Class", \ "") \ ELEM_(std::string, my_JOTA_troop, "MY_JOTA_TROOP", \ "Jamboree On The Air Troop", \ "") \ ELEM_(std::string, my_JOTA_scout, "MY_JOTA_SCOUT", \ "JOTA scout operator", \ "") \ ELEM_(int, logging, "LOGGING", \ "Logging for:\n" \ " 0 - generic QSO\n" \ " 1 - generic contest\n" \ " 2 - BART\n" \ " 3 - Field Day\n" \ " 4 - Winter Field Day\n" \ " 5 - Kids Day\n" \ " 6 - Rookie Roundup\n" \ " 7 - ARRY RTTY\n" \ " 8 - School Round UP\n" \ " 9 - Jamboree On The Air\n" \ " 10 - CQ WPX\n" \ " 11 - CQWW RTTY\n" \ " 12 - Italian ARI International DX\n" \ " 13 - North American QSO Party\n" \ " 14 - North American Sprint\n" \ " 15 - Sweepstakes\n" \ " 16 - State QSO Parties\n" \ " 17 - Ten Ten\n" \ " 18 - Africa All Mode\n" \ " 19 - VHF\n" \ " 20 - Worked All Europe", \ 0) \ ELEM_(int, SQSOcontest, "SQSOcontest", \ "SQSO contest", \ 0) \ ELEM_(std::string, CONTESTnotes, "CONTESTnotes", \ "Notes for specfied contest", \ "CALL if (RSTr), if (LOCATOR), NAME, QTH") \ ELEM_(int, SQSOinstate, "SQSOinstate", \ "SQSO in-state", \ 0) \ ELEM_(int, SQSOstate, "SQSOstate", \ "SQSO state", \ 0) \ ELEM_(int, SQSOcounty, "SQSOcounty", \ "SQSO county", \ 0) \ ELEM_(int, SQSOlogstate, "SQSOlogstate", \ "SQSO log state", \ 0) \ ELEM_(int, SQSOlogcounty, "SQSOlogcounty", \ "SQSO log county", \ 0) \ ELEM_(int, SQSOlogserno, "SQSOlogserno", \ "SQSO log serno", \ 0) \ ELEM_(int, SQSOlogxchg, "SQSOlogxchg", \ "SQSO log exchange", \ 0) \ ELEM_(int, SQSOlogname, "SQSOlogname", \ "SQSO log name", \ 0) \ ELEM_(int, SQSOlogstcty, "SQSOlogstcty", \ "SQSO parse STCTY", \ 0) \ ELEM_(int, SQSOlogctyst, "SQSOlogctyst", \ "SQSO parse CTYST", \ 0) \ ELEM_(int, SQSOlogrst, "SQSOlogrst", \ "SQSO log rst", \ 0) \ ELEM_(int, SQSOlogcat, "SQSlogcat", \ "State of Maryland ... peculiar folks living there", \ 0) \ ELEM_(bool, connect_to_fdserver, "CONNECT_TO_FDSERVER", \ "Connect to field day server", \ false) \ ELEM_(std::string, fd_tcpip_addr, "FD_TCPIP_ADDR", \ "Field Day (w1hkj) server tcpip address", \ "127.0.0.1") \ ELEM_(std::string, fd_tcpip_port, "FD_TCPIP_PORT", \ "Field Day (w1hkj) server tcpip port", \ "20001") \ /* Macro controls */ \ /* DX Cluster */ \ ELEM_(std::string, dxcc_host_url, "DXCC_HOST_URL", \ "DXCC cluster tcpip address", \ "") \ ELEM_(std::string, dxcluster_hosts, "DXCLUSTER_HOSTS", \ "Array of dxcluster host-port-user lines\n" \ "Fields separated by : character\n" \ "Lines separated by | character", \ "w3nr.ddns.net:7300::|dx.n8noe.us:7373::|w0mw.dynip.com:23::|") \ ELEM_(RGB, DX_Color, "DX_COLOR", \ "RX text font color (RGB)", \ { 0, 0, 130 }) \ ELEM_(Fl_Color, DXC_even_color, "DXC_EVEN_COLOR", \ "Even line background color in dxcluster dialog", \ 7) \ ELEM_(Fl_Color, DXC_odd_color, "DXC_ODD_COLOR", \ "Odd line background color in dxcluster dialog", \ 246) \ ELEM_(Fl_Color, DXC_textcolor, "DXC_TEXTCOLOR", \ "Text color in dxcluster dialog", \ FL_YELLOW) \ ELEM_(std::string, DXC_textname, "DXC_TEXTNAME", \ "DX cluster browser font name", \ "") \ ELEM_(Fl_Font, DXC_textfont, "DXC_TEXTFONT", \ "DX cluster browsers font number", \ FL_COURIER) \ ELEM_(int, DXC_textsize, "DXC_TEXTSIZE", \ "DX cluster browsers font size", \ 14) \ ELEM_(Fl_Color, DXfontcolor, "DXFONTCOLOR", \ "Text color in dxcluster stream", \ FL_YELLOW) \ ELEM_(Fl_Color, DXalt_color, "DXALT_COLOR", \ "Alternate text color in dxcluster stream", \ FL_DARK_RED) \ ELEM_(std::string, DXfontname, "DXFONTNAME", \ "DX cluster stream font name", \ "") \ ELEM_(Fl_Font, DXfontnbr, "DXFONTNBR", \ "DX cluster stream font number", \ FL_COURIER) \ ELEM_(int, DXfontsize, "DXFONTSIZE", \ "DX cluster stream font size", \ 14) \ ELEM_(std::string, dxcc_host_port, "DXCC_HOST_PORT", \ "DXCC cluster tcpip port number", \ "") \ ELEM_(std::string, dxcc_login, "DXCC_LOGIN", \ "DXCC cluster login call sign", \ "") \ ELEM_(std::string, dxcc_password, "DXCC_PASSWORD", \ "DXCC cluster login password", \ "") \ ELEM_(std::string, dxcm_label_1, "DXC_ML1", \ "DXC Macro Label 1", \ "Show DX") \ ELEM_(std::string, dxcm_text_1, "DXC_MACRO1", \ "DXC Macro 1", \ "SH/DX") \ ELEM_(std::string, dxcm_label_2, "DXC_ML2", \ "DXC Macro Label 2", \ "dxcm 2") \ ELEM_(std::string, dxcm_text_2, "DXC_MACRO2", \ "DXC Macro 2", \ "") \ ELEM_(std::string, dxcm_label_3, "DXC_ML3", \ "DXC Macro Label 3", \ "dxcm 3") \ ELEM_(std::string, dxcm_text_3, "DXC_MACRO3", \ "DXC Macro 3", \ "") \ ELEM_(std::string, dxcm_label_4, "DXC_ML4", \ "DXC Macro Label 4", \ "dxcm 4") \ ELEM_(std::string, dxcm_text_4, "DXC_MACRO4", \ "DXC Macro 4", \ "") \ ELEM_(std::string, dxcm_label_5, "DXC_ML5", \ "DXC Macro Label 5", \ "dxcm 5") \ ELEM_(std::string, dxcm_text_5, "DXC_MACRO5", \ "DXC Macro 5", \ "") \ ELEM_(std::string, dxcm_label_6, "DXC_ML6", \ "DXC Macro Label 6", \ "dxcm 6") \ ELEM_(std::string, dxcm_text_6, "DXC_MACRO6", \ "DXC Macro 6", \ "") \ ELEM_(std::string, dxcm_label_7, "DXC_ML7", \ "DXC Macro Label 7", \ "dxcm 7") \ ELEM_(std::string, dxcm_text_7, "DXC_MACRO7", \ "DXC Macro 7", \ "") \ ELEM_(std::string, dxcm_label_8, "DXC_ML8", \ "DXC Macro Label 8", \ "dxcm 8") \ ELEM_(std::string, dxcm_text_8, "DXC_MACRO8", \ "DXC Macro 8", \ "") \ ELEM_(bool, dxc_topline, "DXC_TOPLINE", \ "DXC report order; true = new record on top line", \ true) \ ELEM_(bool, spot_when_logged, "SPOT_WHEN_LOGGED", \ "Create spot Cmd: string when logging contact", \ false) \ ELEM_(bool, dxc_auto_connect, "DXC_AUTO_CONNECT", \ "Connect to HOST when starting fldigi", \ false) \ ELEM_(bool, dxc_hertz, "DXC_HERTZ", \ "Add 0..99 Hertz audio frequency factor [nn] to DX report/notes", \ false) \ ELEM_(bool, UseLastMacro, "USELASTMACRO", \ "Load last used macro file on startup", \ true) \ ELEM_(double, mbw, "MBW", \ "Delay between execution of RIGMODE and FILWID\n" \ "when in the same macro definition\n" \ "range 0.1 to 2.0, default = 0.5", \ 0.5) \ ELEM_(bool, DisplayMacroFilename, "DISPLAYMACROFILENAME", \ "Display macro filename on startup", \ true) \ ELEM_(bool, SaveMacros, "SAVEMACROS", \ "Save current macros on exit", \ true) \ ELEM_(bool, macro_wheel, "MACROWHEEL", \ "Enable mouse wheel rotation to control visible macro set", \ false) \ ELEM_(int, mbar_scheme, "MBARSCHEME", \ "# and position of macro bars\n" \ "0..12, 1 = default", \ 1) \ ELEM_(bool, four_bar_position, "FOURBARPOSITION", \ "Position 4 bar macro sat below Tx panel\n" \ "Default is above Rx panel", \ false) \ ELEM_(bool, macro_post, "MACROPOST", \ "expand ^! macro tags in Rx panel when executed", \ false) \ ELEM_(double, txlevel, "TXATTEN", \ "TX attenuator (db) -30 .. 0", \ -3.0) \ ELEM_(double, TxMonitorLevel, "TXMONITORLEVEL", \ "Level for monitored (on waterfall) transmit signal", \ 0.2) \ /* Waterfall palette */ \ ELEM_(std::string, PaletteName, "PALETTENAME", \ "Waterfall color palette file name", \ "default.pal") \ ELEM_(RGB, cfgpal0, "PALETTE0", \ "Custom palette 0", \ { 0,0,0 }) \ ELEM_(RGB, cfgpal1, "PALETTE1", \ "Custom palette 1", \ { 0,0,136 }) \ ELEM_(RGB, cfgpal2, "PALETTE2", \ "Custom palette 2", \ { 0,19,198 }) \ ELEM_(RGB, cfgpal3, "PALETTE3", \ "Custom palette 3", \ { 0,32,239 }) \ ELEM_(RGB, cfgpal4, "PALETTE4", \ "Custom palette 4", \ { 172,167,105 }) \ ELEM_(RGB, cfgpal5, "PALETTE5", \ "Custom palette 5", \ { 194,198,49 }) \ ELEM_(RGB, cfgpal6, "PALETTE6", \ "Custom palette 6", \ { 225,228,107 }) \ ELEM_(RGB, cfgpal7, "PALETTE7", \ "Custom palette 7", \ { 255,255,0 }) \ ELEM_(RGB, cfgpal8, "PALETTE8", \ "Custom palette 8", \ { 251,51,0 }) \ /* Palettes for macro button groups */ \ ELEM_(bool, useGroupColors, "USEGROUPCOLORS", \ "Use macro group colors", \ true) \ ELEM_(RGB, btnGroup1, "FKEYGROUP1", \ "Macro group 1 color", \ { 80, 144, 144 }) \ ELEM_(RGB, btnGroup2, "FKEYGROUP2", \ "Macro group 2 color", \ { 144, 80, 80 }) \ ELEM_(RGB, btnGroup3, "FKEYGROUP3", \ "Macro group 3 color", \ { 80, 80, 144 }) \ ELEM_(RGB, btnFkeyTextColor, "FKEYTEXTCOLOR", \ "Macro button foreground ", \ { 255, 255, 255 }) \ /* RX / TX / Waterfall text widgets */ \ ELEM_(std::string, charset_name, "CHARSET_NAME", \ "Default character set", \ "UTF-8") \ ELEM_(bool, RxFontWarn, "RXFONTWARN", \ "Enable RX font warnings", \ true) \ ELEM_(std::string, RxFontName, "RXFONTNAME", \ "RX text font name", \ "") \ ELEM_(Fl_Font, RxFontnbr, "RXFONTNBR", \ "RX text font index", \ FL_HELVETICA) \ ELEM_(int, RxFontsize, "RXFONTSIZE", \ "RX text font size", \ 16) \ ELEM_(Fl_Color, RxFontcolor, "RXFNTCOLOR", \ "RX text font color", \ FL_BLACK) \ ELEM_(std::string, MacroBtnFontName, "MACROBTNFONTNAME", \ "Macro Btn Font Name", \ "") \ ELEM_(Fl_Font, MacroBtnFontnbr, "MACROBTNFONTNBR", \ "Macro Btn font index", \ FL_HELVETICA) \ ELEM_(int, MacroBtnFontsize, "MACROBTNFONTSIZE", \ "Macro btn font size", \ 12) \ ELEM_(Fl_Color, MacroBtnFontcolor, "MACROBTNFONTCOLOR", \ "Macro btn font color", \ FL_WHITE) \ ELEM_(Fl_Color, RxTxSelectcolor, "RXTXSELCOLOR", \ "RX/TX text select color", \ FL_MAGENTA) \ ELEM_(bool, TxFontWarn, "TXFONTWARN", \ "Enable TX font warnings", \ true) \ ELEM_(std::string, TxFontName, "TXFONTNAME", \ "TX text font name", \ "") \ ELEM_(Fl_Font, TxFontnbr, "TXFONTNBR", \ "TX text font index", \ FL_HELVETICA) \ ELEM_(int, TxFontsize, "TXFONTSIZE", \ "TX text font size", \ 16) \ ELEM_(Fl_Color, TxFontcolor, "TXFNTCOLOR", \ "TX text font color", \ FL_BLACK) \ ELEM_(RGB, RxColor, "RXFONTCOLOR", \ "RX text font color (RGB)", \ { 255, 242, 190 }) \ ELEM_(RGB, TxColor, "TXFONTCOLOR", \ "TX text font color (RGB)", \ { 200, 235, 255 }) \ ELEM_(Fl_Color, XMITcolor, "XMITCOLOR", \ "Color for Transmit text style", \ FL_RED) \ ELEM_(Fl_Color, CTRLcolor, "CTRLCOLOR", \ "Color for Control text style", \ FL_DARK_GREEN) \ ELEM_(Fl_Color, SKIPcolor, "SKIPCOLOR", \ "Color for Skipped text style", \ FL_BLUE) \ ELEM_(Fl_Color, ALTRcolor, "ALTRCOLOR", \ "Color for Alternate text style", \ FL_DARK_MAGENTA) \ ELEM_(Fl_Color, LowSignal, "LOWSIGNAL", \ "Color for low signal level", \ FL_BLACK) \ ELEM_(Fl_Color, NormSignal, "NORMSIGNAL", \ "Color for normal signal level", \ FL_GREEN) \ ELEM_(Fl_Color, HighSignal, "HIGHSIGNAL", \ "Color for high signal level", \ FL_YELLOW) \ ELEM_(Fl_Color, OverSignal, "OVERSIGNAL", \ "Color for over driven signal", \ FL_RED) \ ELEM_(std::string, WaterfallFontName, "WATERFALLFONTNAME", \ "Waterfall font name", \ "") \ ELEM_(Fl_Font, WaterfallFontnbr, "WATERFALLFONTNBR", \ "Waterfall font number", \ FL_HELVETICA) \ ELEM_(int, WaterfallFontsize, "WATERFALLFONTSIZE", \ "Waterfall font size", \ 12) \ ELEM_(Fl_Color, LOGGINGtextcolor, "LOGGINGTEXTCOLOR", \ "Text color in logging controls", \ FL_BLACK) \ ELEM_(Fl_Color, LOGGINGcolor, "LOGGINGCOLOR", \ "Background color in logging controls", \ FL_BACKGROUND2_COLOR) \ ELEM_(std::string, LOGGINGfontname, "LOGGINGTEXTNAME", \ "LOGGING text font name", \ "") \ ELEM_(Fl_Font, LOGGINGtextfont, "LOGGINGTEXTFONT", \ "Logging Controls font number", \ FL_HELVETICA) \ ELEM_(int, LOGGINGtextsize, "LOGGINGTEXTSIZE", \ "Logging Controls font size", \ 12) \ ELEM_(Fl_Color, LOGBOOKtextcolor, "LOGBOOKTEXTCOLOR", \ "Text color in logbook dialog", \ FL_BLACK) \ ELEM_(Fl_Color, LOGBOOKcolor, "LOGBOOKCOLOR", \ "Background color in logbook dialog", \ FL_BACKGROUND2_COLOR) \ ELEM_(std::string, LOGBOOKtextname, "LOGBOOKTEXTNAME", \ "Logbook text font name", \ "") \ ELEM_(Fl_Font, LOGBOOKtextfont, "LOGBOOKTEXTFONT", \ "Logbook dialog controls font number", \ FL_HELVETICA) \ ELEM_(int, LOGBOOKtextsize, "LOGBOOKTEXTSIZE", \ "Logbook dialog controls font size", \ 12) \ ELEM_(std::string, FreqControlFontName, "FREQCONTROLFONTNAME", \ "Frequency Control font name", \ "") \ ELEM_(Fl_Font, FreqControlFontnbr, "FREQCONTROLFONTNBR", \ "Frequency Control font number", \ FL_HELVETICA) \ ELEM_(std::string, ui_scheme, "UISCHEME", \ "FLTK UI scheme (none or base, gtk+, plastic)", \ "gtk+") \ ELEM_(int, ui_language, "UILANGUAGE", \ "UI language", \ 0) \ ELEM_(bool, wf_audioscale, "WFAUDIOSCALE", \ "Always show audio frequencies on waterfall", \ true) \ /* Freq Display colors */ \ ELEM_(RGB, FDbackground, "FDBACKGROUND", \ "Frequency display background color", \ { 255, 253, 222 }) \ ELEM_(RGB, FDforeground, "FDFOREGROUND", \ "Frequency display foreground color", \ { 0, 0, 0 }) \ /* S-meter and Power-meter */ \ ELEM_(RGB, Smeter_bg_color, "SMETERBG", \ "S-meter background color", \ { 255, 253, 222 }) \ ELEM_(RGB, Smeter_scale_color, "SMETERSCALECOLOR", \ "S-meter scale color", \ { 0, 0, 0 }) \ ELEM_(RGB, Smeter_meter_color, "SMETERMETERCOLOR", \ "S-meter meter color", \ { 0, 200, 0 }) \ ELEM_(RGB, PWRmeter_bg_color, "PWRMETERBGD", \ "Power meter background color", \ { 255, 253, 222 }) \ ELEM_(RGB, PWRmeter_scale_color, "PWRMETERSCALECOLOR", \ "Power meter scale color", \ { 0, 0, 0 }) \ ELEM_(RGB, PWRmeter_meter_color, "PWRMETERMETERCOLOR", \ "Power meter meter color", \ { 200, 0, 0 }) \ ELEM_(int, PWRselect, "PWRSELECT", \ "Power meter type:\n" \ " 0: 25 W, 1: 50 W, 2: 100 W, 3: 200 W, 4: AUTO", \ 4) \ /* Tab selection color */ \ ELEM_(Fl_Color, TabsColor, "TABSCOLOR", \ "UI tabs color", \ FL_BACKGROUND2_COLOR) \ /* Signal Viewer */ \ ELEM_(bool, VIEWERascend, "VIEWERASCEND", \ "Low frequency on bottom of viewer", \ true) \ ELEM_(bool, VIEWERmarquee, "VIEWERMARQUEE", \ "Signal Viewer text continuous scrolling", \ true) \ ELEM_(bool, VIEWERsort, "VIEWERSORT", \ "Signal Viewer sort after channel changes- unused", \ false) \ ELEM_(bool, VIEWERhistory, "VIEWERHISTORY", \ "Signal Viewer playback history on select", \ false) \ ELEM_(bool, VIEWERfixed, "VIEWERfixed", \ "Signal Viewer data displayed on fixed 100 Hz intervals", \ true) \ ELEM_(int, VIEWERlabeltype, "VIEWERSHOWFREQ", \ "Signal Viewer label type. Values are as follows:\n" \ " 0: None; 1: Audio freq; 2: Radio freq; 2: Channel #.", \ VIEWER_LABEL_RF) \ ELEM_(int, VIEWERchannels, "VIEWERCHANNELS", \ "Number of Signal Viewer Channels", \ 30) \ ELEM_(int, VIEWERwidth, "VIEWERWIDTH", \ "Width of viewer (% of full panel width)", \ 25) \ ELEM_(int, VIEWERtimeout, "VIEWERTIMEOUT", \ "Signal Viewer inactivity timeout (to clear text)", \ 15) \ ELEM_(std::string, ViewerFontName, "VIEWERFONTNAME", \ "Signal Viewer font name", \ "") \ ELEM_(Fl_Font, ViewerFontnbr, "VIEWERFONTNBR", \ "Signal Viewer font index", \ FL_HELVETICA) \ ELEM_(int, ViewerFontsize, "VIEWERFONTSIZE", \ "Signal Viewer font size", \ FL_NORMAL_SIZE) \ \ ELEM_(Fl_Color, Sql1Color, "SQL1COLOR", \ "UI SQL button select color 1", \ FL_YELLOW) \ ELEM_(Fl_Color, Sql2Color, "SQL2COLOR", \ "UI SQL button select color 2", \ FL_GREEN) \ ELEM_(Fl_Color, AfcColor, "AFCCOLOR", \ "UI AFC button select color", \ FL_GREEN) \ ELEM_(Fl_Color, LkColor, "LKCOLOR", \ "UI Lk xmt frequ select color", \ FL_GREEN) \ ELEM_(Fl_Color, RevColor, "REVCOLOR", \ "UI Rev select color", \ FL_GREEN) \ ELEM_(Fl_Color, XmtColor, "XMTCOLOR", \ "UI T/R select color", \ FL_RED) \ ELEM_(Fl_Color, SpotColor, "SPOTCOLOR", \ "UI Spot select color", \ FL_GREEN) \ ELEM_(Fl_Color, RxIDColor, "RXIDCOLOR", \ "UI RxID select color", \ FL_GREEN) \ ELEM_(Fl_Color, RxIDwideColor, "RXIDWIDECOLOR", \ "UI RxID WIDE search select color", \ FL_DARK_RED) \ ELEM_(Fl_Color, TxIDColor, "TXIDCOLOR", \ "UI TxID select color", \ FL_GREEN) \ ELEM_(Fl_Color, TuneColor, "TUNECOLOR", \ "UI Tune select color", \ FL_RED) \ ELEM_(Fl_Color, default_btn_color, "DEFAULTBTNCOLOR", \ "Default color of lighted buttons", \ FL_YELLOW) \ /* XMLRPC LOGBOOK server */ \ ELEM_(bool, xml_logbook, "XML_LOGBOOK", \ "Try to open remote xml logbook", \ false) \ ELEM_(std::string, xmllog_address, "XMLLOG_ADDRESS", \ "Logbook server address", \ "127.0.0.1") \ ELEM_(std::string, xmllog_port, "XMLLOG_PORT", \ "Logbook server port", \ "8421") \ \ ELEM_(bool, check_for_updates, "CHECK_FOR_UPDATES", \ "Check for updates when starting program", \ false) \ /* XML-RPC/ARQ/KISS servers */ \ ELEM_(std::string, xmlrpc_address, "XMLRPC_ADDRESS", \ "IP Address of XMLRPC Socket", \ DEFAULT_XMLPRC_IP_ADDRESS) \ ELEM_(std::string, xmlrpc_port, "XMLRPC_PORT", \ "IP port number of XMLRPC socket", \ DEFAULT_XMLRPC_IP_PORT) \ ELEM_(std::string, xmlrpc_allow, "", "", "") \ ELEM_(std::string, xmlrpc_deny, "", "", "") \ ELEM_(int, rx_msgid, "", "", 9876) \ ELEM_(int, tx_msgid, "", "", 6789) \ ELEM_(std::string, arq_address, "ARQ_ADDRESS", \ "IP Address of ARQ socket", \ DEFAULT_ARQ_IP_ADDRESS) \ ELEM_(std::string, arq_port, "ARQ_PORT", \ "IP port number of ARQ socket", \ DEFAULT_ARQ_IP_PORT) \ ELEM_(std::string, kiss_address, "KISS_ADDRESS", \ "IP Address of KISS socket", \ DEFAULT_KISS_IP_ADDRESS) \ ELEM_(std::string, kiss_io_port, "KISS_IO_PORT", \ "IP port number of KISS socket", \ DEFAULT_KISS_IP_IO_PORT) \ ELEM_(std::string, kiss_out_port, "KISS_OUT_PORT", \ "Out udp port used when ip address is the same", \ DEFAULT_KISS_IP_OUT_PORT) \ ELEM_(int, kiss_dual_port_enabled, "KISS_DUAL_PORT_ENABLED", \ "Required when same IP address is used.", \ 0) \ ELEM_(int, data_io_enabled, "DATA_IO_ENABLED", \ "Disabled (0) ARQ socket enabled (1) KISS socket enabled (2)", \ 1) \ ELEM_(bool, ax25_decode_enabled, "AX25_DECODE_ENABLED", \ "Dissasemble AX25 packet into human readable form", \ false) \ ELEM_(bool, enableBusyChannel, "ENABLE_BUSY_CHANNEL", \ "Detect busy channel and wait for a period of time before txing", \ false) \ ELEM_(int, busyChannelSeconds, "BUSY_CHANNEL_SECONDS", \ "Number of seconds to wait before transmit resume", \ 3) \ ELEM_(bool, show_psm_btn, "SHOW_PSM_BTN", \ "Display / Enable PSM button on main dialog", \ false) \ ELEM_(int, kpsql_attenuation, "KPSQL_ATTENUATION", \ "KPSQL Attenuation in 1/n of 1:1 Gain", \ 2) \ ELEM_(bool, csma_enabled, "CSMA_ENABLED", \ "Use CSMA on heavy traffic channels (AX25)", \ true) \ ELEM_(bool, kiss_tcp_io, "KISS_TCP_IO", \ "Connect kiss io via TCP/IP vise UDP/IP", \ false) \ ELEM_(bool, kiss_tcp_listen, "KISS_TCP_LISTEN", \ "Listen for TCP connection (Server mode)", \ false) \ ELEM_(bool, kpsql_enabled, "KPSQL_ENABLED", \ "Enable/Disable PSM", \ false) \ ELEM_(bool, tcp_udp_auto_connect, "TCP_UDP_AUTO_CONNECT", \ "Make Connect Attemp on Fldigi Start", \ false) \ ELEM_(int, csma_persistance, "CSMA_PERSISTANCE", \ "CSMA Persistance", \ 63) \ ELEM_(int, csma_slot_time, "CSMA_SLOT_TIME", \ "CSMA Slot Time", \ 10) \ ELEM_(int, csma_transmit_delay, "CSMA_TRANSMIT_DELAY", \ "CSMA Transit Delay", \ 50) \ ELEM_(int, psm_flush_buffer_timeout, "PSM_FLUSH_BUFFER_TIMEOUT", \ "Flush buffer timout", \ 15) \ ELEM_(int, psm_minimum_bandwidth, "PSM_MINIMUM_BANDWIDTH", \ "PSM minimum measured bandwidth", \ 100) \ ELEM_(int, psm_minimum_bandwidth_margin, "PSM_MINIMUM_BANDWIDTH_MARGIN", \ "PSM minimum measured bandwidth margin", \ 10) \ ELEM_(bool, psm_use_histogram, "PSM_USE_HISTOGRAM", \ "Histogram threshold", \ false) \ ELEM_(int, psm_histogram_offset_threshold, "PSM_HISTOGRAM_OFFSET_THRESHOLD", \ "Histogram theshold referece level", \ 3) \ ELEM_(int, psm_hit_time_window, "PSM_HIT_TIME_WINDOW", \ "Valid signal test rate (milliseconds)", \ 15) \ ELEM_(int, tx_buffer_timeout, "TX_BUFFER_TIMEOUT", \ "Transmit buffer timeout (minutes)", \ 15) \ ELEM_(bool, kiss_io_modem_change_inhibit, "KISS_IO_MODEM_CHANGE_INHIBIT", \ "Enable/Disable Modem Change to a non 8 bit when KISS IO is in use", \ false) \ ELEM_(std::string, flrig_ip_address, "FLRIG_IP_ADDRESS", \ "IP Address of flrig server", \ DEFAULT_FLRIG_IP_ADDRESS) \ ELEM_(std::string, flrig_ip_port, "FLRIG_IP_PORT", \ "IP port number of flrig server", \ DEFAULT_FLRIG_IP_PORT) \ ELEM_(bool, show_all_codes, "SHOW_ALL_CODES", \ "Display all rx char's using ascii3 table", \ false) \ /* PSK reporter */ \ ELEM_(bool, pskrep_autostart, "PSKREP_AUTOSTART", \ "Enable to start pskrep interface when starting fldigi", \ false) \ ELEM_(bool, usepskrep, "USEPSKREP", \ "(Set by fldigi)", \ false) \ ELEM_(bool, pskrep_auto, "PSKREPAUTO", \ "Report callsigns spotted in received text", \ false) \ ELEM_(bool, pskrep_log, "PSKREPLOG", \ "Report callsigns in logged QSOs", \ false) \ ELEM_(bool, pskrep_qrg, "PSKREPQRG", \ "Include rig frequency in reception report", \ false) \ ELEM_(bool, report_when_visible, "REPORTWHENVISIBLE", \ "Enable Reporter ONLY when a signal browser is visible", \ false) \ ELEM_(std::string, pskrep_host, "PSKREPHOST", \ "Reception report server address", \ "report.pskreporter.info") \ ELEM_(std::string, pskrep_port, "PSKREPPORT", \ "Reception report server port", \ "4739") \ /* WEFAX configuration items */ \ ELEM_(double, wefax_slant, "WEFAXSLANT", \ "Slant correction for wefax Rx", \ 0.0) \ ELEM_(std::string, wefax_save_dir, "WEFAXSAVEDIR", \ "Target directory for storing automatically received images storage", \ "") \ ELEM_(std::string, wefax_load_dir, "WEFAXLOADDIR", \ "Source directory for sending images", \ "") \ ELEM_(int, wefax_filter, "WEFAXFILTER", \ "Input filter for image reception", \ 0) \ ELEM_(bool, WEFAX_EmbeddedGui, "WEFAXEMBEDDEDGUI", \ "Embedded GUI", \ true) \ ELEM_(bool, WEFAX_HideTx, "WEFAXHIDETX", \ "Hide transmission window", \ true) \ ELEM_(int, WEFAX_Shift, "WEFAXSHIFT", \ "Shift (Standard 800Hz)", \ 800 ) \ ELEM_(int, WEFAX_MaxRows, "WEFAXMAXROWS", \ "Received fax maximum number of rows", \ 2900 ) \ ELEM_(int, WEFAX_NoiseMargin, "WEFAXNOISEMARGIN", \ "Pixel margin for noise removal", \ 1 ) \ ELEM_(int, WEFAX_NoiseThreshold, "WEFAXNOISETHRESHOLD", \ "Threshold level for noise detection and removal", \ 5 ) \ ELEM_(int, WEFAX_SaveMonochrome, "WEFAXSAVEMONOCHROME", \ "Save fax image as monochrome", \ true ) \ ELEM_(bool, WEFAX_AdifLog, "WEFAXADIFLOG", \ "Logs wefax file names in Adif log file", \ false) \ /* NAVTEX configuration items */ \ ELEM_(bool, NVTX_AdifLog, "NAVTEXADIFLOG", \ "Logs Navtex messages in Adig log file", \ false) \ ELEM_(bool, NVTX_KmlLog, "NAVTEXKMLLOG", \ "Logs Navtex messages to KML document", \ false) \ ELEM_(int, NVTX_MinSizLoggedMsg, "NAVTEXMINSIZLOGGEDMSG", \ "Minimum length of logged messages", \ 0 ) \ /* WX fetch from NOAA */ \ ELEM_(std::string, wx_url, "WX_URL", \ "Internet URL used to fetch METAR data using wget symbology", \ "http://tgftp.nws.noaa.gov/data/observations/metar/decoded/" ) \ ELEM_(std::string, wx_eoh, "WX_EOH", \ "Text at end of METAR report header\n" \ "default = Connection: close", \ "Connection: close") \ ELEM_(std::string, wx_sta, "WX_STA", \ "4 letter specifier for wx station", \ "KMDQ") \ ELEM_(bool, wx_condx, "WX_CONDX", \ "Weather conditions", \ true) \ ELEM_(bool, wx_fahrenheit, "WX_FAHRENHEIT", \ "Report in Fahrenheit", \ true) \ ELEM_(bool, wx_celsius, "WX_CELSIUS", \ "Report in Celsius", \ true) \ ELEM_(bool, wx_mph, "WX_MPH", \ "Report speed in miles per hour", \ true) \ ELEM_(bool, wx_kph, "WX_KPH", \ "Report speed in kilometers per hour", \ true) \ ELEM_(bool, wx_inches, "WX_INCHES", \ "Report pressure in inches of mercury", \ true) \ ELEM_(bool, wx_mbars, "WX_MBARS", \ "Report pressure in millibars", \ true) \ ELEM_(bool, wx_full, "WX_FULL", \ "Use complete METAR report", \ true) \ ELEM_(bool, wx_station_name, "WX_STATION_NAME", \ "Report station noun name", \ true) \ /* KML Keyhole Markup Language */ \ ELEM_(bool, kml_purge_on_startup, "KML_PURGE_ON_STARTUP", \ "Purge KML data at startup", \ false) \ ELEM_(std::string, kml_save_dir, "KML_SAVE_DIR", \ "Destination directory for generated KML documents", \ "") \ ELEM_(std::string, kml_command, "KML_COMMAND", \ "Command executed when creating KML files", \ "") \ ELEM_(int, kml_merge_distance, "KML_MERGE_DISTANCE", \ "Minimum distance for splitting alias nodes", \ 10000) \ ELEM_(int, kml_retention_time, "KML_RETENTION_TIME", \ "Number of hours for keeping data in each node", \ 0) \ ELEM_(int, kml_refresh_interval, "KML_REFRESH_INTERVAL", \ "Refresh interval written in KML files (In seconds)", \ 120) \ ELEM_(int, kml_balloon_style, "KML_BALLOON_STYLE", \ "KML balloons data displayed as text, HTML tables, HTML single matrix", \ 2) \ ELEM_(double, cnt_dft_range, "cnt_dft_range", \ "Display range in dB for dft scan modem", \ 60.0) \ ELEM_(int, cnt_dft_scans, "cnt_dft_scans", \ "Number of scans over which the average signal level is measured.", \ 100) \ ELEM_(bool, dft_relative, "dft_relative", \ "Plot vertical scale as dB relative to maximum value", \ false) \ ELEM_(std::string, auto_flrig_pathname, "AUTO_FLRIG_PATHNAME", \ "Full pathname to the flrig executable", \ "") \ ELEM_(std::string, auto_flamp_pathname, "AUTO_FLAMP_PATHNAME", \ "Full pathname to the flamp executable", \ "") \ ELEM_(std::string, auto_flnet_pathname, "AUTO_FLNET_PATHNAME", \ "Full pathname to the flnet executable", \ "") \ ELEM_(std::string, auto_fllog_pathname, "AUTO_FLLOG_PATHNAME", \ "Full pathname to the fllog executable", \ "") \ ELEM_(std::string, auto_prog1_pathname, "AUTO_PROG1_PATHNAME", \ "Full pathname to the prog1 executable", \ "") \ ELEM_(std::string, auto_prog2_pathname, "AUTO_PROG2_PATHNAME", \ "Full pathname to the prog2 executable", \ "") \ ELEM_(std::string, auto_prog3_pathname, "AUTO_PROG3_PATHNAME", \ "Full pathname to the prog3 executable", \ "") \ ELEM_(bool, flrig_auto_enable, "FLRIG_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, flnet_auto_enable, "FLNET_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, fllog_auto_enable, "FLLOG_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, flamp_auto_enable, "FLAMP_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog1_auto_enable, "PROG1_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog2_auto_enable, "PROG2_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog3_auto_enable, "PROG3_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(int, sel_lsd, "SEL_LSD", \ "Frequency control by keyboard arrow keys\n" \ "Least significant digit are left/right keys\n" \ "0 : 1 Hz, 1 : 10 Hz, 2 : 100 Hz, 3 : 1000 Hz", \ 0) \ ELEM_(int, macro_height, "MACRO_HEIGHT", \ "Height of macro bar\n" \ "22 .. 66, default = 22, step size 2", \ 22) \ ELEM_(bool, rxtx_swap, "RXTX_SWAP", \ "Enabled, Tx above Rx panel\n" \ "Disable, Rx above Tx panel (default", \ false) \ ELEM_(bool, view_smeter, "VIEW_SMETER", \ "Enabled, View smeter & power meter\n" \ "Disable, (default)", \ false) \ ELEM_(std::string, MacroEditFontName, "MACROEDITORFONTNAME", \ "Macro editor font name", \ "") \ ELEM_(Fl_Font, MacroEditFontnbr, "MACROEDITFONTNBR", \ "RX text font index", \ FL_HELVETICA) \ ELEM_(bool, us_units, "US_UNITS", \ "Use US units of distance for QRB", \ false) \ ELEM_(int, MacroEditFontsize, "MACROEDITFONTSIZE", \ "RX text font size", \ 16) \ ELEM_(bool, psk8DCDShortFlag, "PSK8DCDSHORTFLAG", \ "Flag: Change DCD pre-ample length", \ false) \ ELEM_(bool, display_48macros, "DISPLAY_48MACROS", \ "Allow dockable macros", \ false) \ ELEM_(double, fftviewer_maxdb, "fftviewer_maxdb", \ "Upper axis in dB for spectrum viewer", \ 0.0) \ ELEM_(double, fftviewer_range, "fftviewer_range", \ "Display range in dB for spectrum viewer", \ 60.0) \ ELEM_(int, fftviewer_scans, "fftviewer_scans", \ "Number of scans over which the average signal level is measured.", \ 100) \ ELEM_(double, fftviewer_fcenter, "fftviewer_fcenter", \ "Scan center frequency in Hertz", \ 2000.0) \ ELEM_(double, fftviewer_frng, "fftviewer_frng", \ "Frequency scan range in Hertz", \ 4000.0) \ ELEM_(int, wf_spectrum_range, "wf_spectrum_range", \ "Initial spectrum range", \ 500) \ ELEM_(bool, wf_spectrum_center, "wf_spectrum_center", \ "left click on waterfall transfers to spectrum center", \ true) \ ELEM_(bool, wf_spectrum_modem_scale, "wf_spectrum_modem_scale", \ "scale spectrum display frequency linked to modem bandwidth", \ true) \ ELEM_(int, wf_spectrum_scale_factor, "spectrum_scale_factor", \ "scale factor for spectrum display linked to modem bandwidth", \ 5) \ ELEM_(bool, wf_spectrum_dbvals, "wf_spectrum_dbvals", \ "use waterfall db range and offset values for spectrum scope", \ true) // declare the struct #define ELEM_DECLARE_CONFIGURATION(type_, var_, tag_, ...) type_ var_; #undef ELEM_ #define ELEM_ ELEM_DECLARE_CONFIGURATION struct configuration { CONFIG_LIST void writeDefaultsXML(); void storeDefaults(); bool readDefaultsXML(); void loadDefaults(); void saveDefaults(); int setDefaults(); void resetDefaults(void); static void reset(void); void initInterface(); void testCommPorts(); const char* strBaudRate(); int BaudRate(size_t); int nBaudRate(const char *); void initFonts(void); }; extern configuration progdefaults; extern Fl_Font font_number(const char* name); enum { SAMPLE_RATE_UNSET = -1, SAMPLE_RATE_AUTO, SAMPLE_RATE_NATIVE, SAMPLE_RATE_OTHER }; #endif fldigi-4.1.06/src/include/debug.h0000644000175000017500000000702613472115776013454 00000000000000// ---------------------------------------------------------------------------- // debug.h // // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _DEBUG_H_ #define _DEBUG_H_ #define DEBUG_PSKMAIL 1 #include #include #include "util.h" extern void rotate_log(std::string); class debug { public: enum level_e { QUIET_LEVEL, ERROR_LEVEL, WARN_LEVEL, INFO_LEVEL, VERBOSE_LEVEL, DEBUG_LEVEL, LOG_NLEVELS }; enum source_e { LOG_ARQCONTROL = 1 << 0, LOG_AUDIO = 1 << 1, LOG_MODEM = 1 << 2, LOG_RIGCONTROL = 1 << 3, LOG_XMLRPC_RIG = 1 << 4, LOG_RPC = 1 << 5, LOG_SPOTTER = 1 << 6, LOG_KISSCONTROL = 1 << 7, LOG_MACLOGGER = 1 << 8, LOG_FD = 1 << 9, LOG_N3FJP = 1 << 10, LOG_OTHER = 1 << 11 }; static void start(const char* filename); static void stop(void); static void hex_dump(const char * func, const char * data, int len); static void log(level_e level, const char* func, const char* srcf, int line, const char* format, ...) format__(printf, 5, 6); static void elog(const char* func, const char* srcf, int line, const char* text); static void show(void); static level_e level; static uint32_t mask; private: static void sync_text(void*); debug(const char* filename); debug(const debug&); debug& operator=(const debug&); ~debug(); static debug* inst; }; #define LOG(level__, source__, ...) \ do { \ if (level__ <= debug::level && source__ & debug::mask) \ debug::log(level__, __func__, __FILE__, __LINE__, __VA_ARGS__); \ } while (0) #define LOG_DEBUG(...) LOG(debug::DEBUG_LEVEL, log_source_, __VA_ARGS__) #define LOG_VERBOSE(...) LOG(debug::VERBOSE_LEVEL, log_source_, __VA_ARGS__) #define LOG_INFO(...) LOG(debug::INFO_LEVEL, log_source_, __VA_ARGS__) #define LOG_WARN(...) LOG(debug::WARN_LEVEL, log_source_, __VA_ARGS__) #define LOG_ERROR(...) LOG(debug::ERROR_LEVEL, log_source_, __VA_ARGS__) #define LOG_HD(source__, a, b) \ do { \ if (source__ & debug::mask) \ debug::hex_dump(__func__, a, b); \ } while (0) #define LOG_HEX(a,b) LOG_HD(log_source_, a, b) #define LOG_PERROR(msg__) \ do { \ if (debug::ERROR_LEVEL <= debug::level && log_source_ & debug::mask) \ debug::elog(__func__, __FILE__, __LINE__, msg__); \ } while (0) unused__ static uint32_t log_source_ = debug::LOG_OTHER; #if defined(__GNUC__) && (__GNUC__ >= 3) # define LOG_FILE_SOURCE(source__) \ __attribute__((constructor)) \ static void log_set_source_(void) { log_source_ = source__; } #else # define LOG_FILE_SOURCE(source__) #endif #define LOG_SET_SOURCE(source__) log_source_ = source__ extern bool debug_pskmail; extern bool debug_audio; #endif // _DEBUG_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/font_browser.h0000644000175000017500000000571013472115776015075 00000000000000// ---------------------------------------------------------------------------- // Font_Browser.h v 0.0.1 2005-10-17 // // for the Fast Light Tool Kit (FLTK) 1.1.x . // // David Freese, w1hkj@w1hkj.com // based on similar widget by Mariwan Jalal // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FONTBROWSER_H #define FONTBROWSER_H #include #include #include #include #include #include #include "flslider2.h" // Preview box for showing font class Preview_Box : public Fl_Widget { private: int fontName; int fontSize; Fl_Color fontColor; void draw(); public: Preview_Box(int x, int y, int w, int h, const char* l); void SetFont( int fontname, int fontsize, Fl_Color c); }; // Font browser widget class Font_Browser : public Fl_Window { public: enum filter_t { FIXED_WIDTH, VARIABLE_WIDTH, ALL_TYPES }; private: int numfonts; Fl_Font fontnbr; int fontsize; Fl_Color fontcolor; filter_t filter; void *data_; Fl_Browser *lst_Font; Fl_Browser *lst_Size; Fl_Value_Input2 *txt_Size; Fl_Return_Button *btn_OK; Fl_Button *btn_Cancel; Fl_Button *btn_Color; Preview_Box *box_Example; void FontSort(); Fl_Callback* callback_; public: Font_Browser(int x = 100, int y = 100, int w = 430, int h = 225, const char *lbl = "Font Browser"); void callback(Fl_Callback* cb, void *d = 0) { callback_ = cb; data_ = d; } static void fb_callback(Fl_Widget* w, void* arg); void FontNameSelect(); void ColorSelect(); int numFonts() { return numfonts; } void fontNumber(Fl_Font n); Fl_Font fontNumber() { return fontnbr; } void fontSize(int s); int fontSize() { return fontsize; } void fontColor(Fl_Color c); Fl_Color fontColor() { return fontcolor; }; const char *fontName() { return lst_Font->text(lst_Font->value()); } void fontName(const char* n); static bool fixed_width(Fl_Font f); void fontFilter(filter_t filter); }; extern Font_Browser* font_browser; #endif fldigi-4.1.06/src/include/logger.h0000644000175000017500000000253413472115776013644 00000000000000// ---------------------------------------------------------------------------- // logger.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2006 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _LOGGER_H #define _LOGGER_H // IPC interface to Xlog and fl_logbook #define LOG_MVERSION "1" #define LOG_MKEY 1238 #define LOG_MTYPE 88 #define LOG_MSG_LEN 1024 #include "qso_db.h" typedef struct { long mtype; char mtext[LOG_MSG_LEN]; } msgtype; extern void submit_log(); extern void submit_record(cQsoRec &); extern char logdate[]; extern char logtime[]; extern char adifdate[]; extern const char *logmode; extern string str_lotw; #endif fldigi-4.1.06/src/include/dx_cluster.h0000644000175000017500000000610113472115776014533 00000000000000// ---------------------------------------------------------------------------- // dx_cluster.h -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DX_CLUSTER_H #define DX_CLUSTER_H #include extern void DXcluster_init(void); extern void DXcluster_close(void); extern void DXcluster_connect(bool); extern void DXcluster_submit(); extern void DXcluster_select(); extern void dxc_wwv_query(); extern void dxc_wwv_clear(); extern void dxc_help_query(); extern void dxc_help_clear(); extern void DXcluster_logoff(); extern void DXcluster_add_record(); extern void DXcluster_mode_check(); extern void DXcluster_band_check(); extern bool DXcluster_dupcheck(); extern bool DXcluster_connected; extern void send_DXcluster_spot(); extern void dxcluster_hosts_save(); extern void dxcluster_hosts_load(); extern void dxcluster_hosts_clear_setup(Fl_Button*, void*); extern void dxcluster_hosts_load_setup(Fl_Button*, void*); extern void dxcluster_hosts_save_setup(Fl_Button*, void*); extern void dxcluster_hosts_send_setup(Fl_Button*, void*); extern void dxcluster_ccc_help(Fl_Button*, void*); extern void dxcluster_arc_help(Fl_Button*, void*); extern void dxcluster_dxc_help(Fl_Button*, void*); extern void dxcluser_servers(Fl_Button*, void*); extern void dxcluster_hosts_load(); extern void dxc_lines(); extern void dxc_lines_redraw(); extern void dxc_click_m1(Fl_Button*, void*); extern void dxc_click_m2(Fl_Button*, void*); extern void dxc_click_m3(Fl_Button*, void*); extern void dxc_click_m4(Fl_Button*, void*); extern void dxc_click_m5(Fl_Button*, void*); extern void dxc_click_m6(Fl_Button*, void*); extern void dxc_click_m7(Fl_Button*, void*); extern void dxc_click_m8(Fl_Button*, void*); struct dxinfo { std::string spotter; std::string freq; std::string dxcall; std::string remark; std::string time; std::string info; std::string state; std::string country; std::string toall; bool dx; dxinfo() { clear(); } void clear() { spotter.clear(); freq.clear(); dxcall.clear(); remark.clear(); time.clear(); info.clear(); country.clear(); toall.clear(); dx = false; } ~dxinfo() {} }; #endif fldigi-4.1.06/src/include/kiss_io.h0000644000175000017500000000716713472115776014034 00000000000000// ---------------------------------------------------------------------------- // kiss_io.h // // Support for KISS interface // // Copyright (c) 2014, 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef KISSIO_H #define KISSIO_H #include #include #include "threads.h" #include "socket.h" #include "modem.h" #include "psm/psm.h" #define HDLC_CNT_OFFSET 32 #define HDLC_CNT 0xDE #define HDLC_TCNT 0xE0 #define KISS_FEND 0xC0 #define KISS_FESC 0xDB #define KISS_TFEND 0xDC #define KISS_TFESC 0xDD #define KISS_DATA 0x00 #define KISS_TXDELAY 0x01 #define KISS_PERSIST 0x02 #define KISS_SLOTTIME 0x03 #define KISS_TXTAIL 0x04 #define KISS_DUPLEX 0x05 #define KISS_HARDWARE 0x06 #define KISS_RAW 0x07 // Non standard frame type for ARQ use #define KISS_RETURN 0x0F #define KISS_RAW_DISABLED 0x00 #define KISS_RAW_ONLY 0x01 #define KISS_RAW_ON 0x02 #define KISS_CMD(a) (a & 0x0F) #define KISS_PORT(a) ((a & 0xF0) >> 4) #define SET_KISS_TYPE_PORT(t,p) ((t & 0x0F) | ((p << 4) & 0xF0)) #define SMACK_CRC(a) (a & 0x08) #define SMACK_CRC_MASK(a) (a & 0xF7) #define SMACK_CRC_ASSIGN(a) ((a | 0x08) & 0xFF) #define CRC_LOW(a) (a & 0xFF) #define CRC_HIGH(a) ((a >> 8) & 0xFF) #define CRC_LOW_HIGH(l,h) (((h << 8) & 0xFF00) | (l & 0xFF)) #define CRC16_NONE 0 #define CRC16_CCITT 1 #define CRC16_FCS 2 #define CRC8_XOR 3 #define KISS_INVALID 512 #define KISS_HALF_DUPLEX 0 #define KISS_FULL_DUPLEX 1 #define BUFFER_PADDING 32 #define KISS_BUFFER_FACTOR 2 #define HDLC_BUFFER_FACTOR 3 #define KISS_CONNECT_RETRY_COUNT 10 #define KISS_RETRY_WAIT_TIME 1000 #define MAX_TEMP_BUFFER_SIZE 32000 #define TX_BUFFER_TIMEOUT (60 * 10) // Ten minute timeout #define DISABLE_TX_INHIBIT_DURATION 5 #define KPSQL_MIN_BANDWIDTH 400 #define TEST_INTERVAL_SECONDS 15 typedef struct { char *data; size_t size; } KISS_QUEUE_FRAME; typedef struct { char *cmd; void (*cmd_func) (char *arg); } EXEC_HARDWARE_CMD_MATCH; #define AX25_FRAME_MARKER 0xFF extern time_t temp_disable_tx_inhibit; extern time_t temp_disable_tx_duration; extern void AbortKiss(); extern bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify); extern bool valid_kiss_modem(std::string _modem); extern void check_kiss_modem(void); extern void bcast_trxs_kiss_frame(int state); extern void bcast_tx_buffer_empty_kiss_frame(void); extern bool tcp_init(bool connect_flag); extern bool udp_init(void); extern void kiss_init(bool connect_flag); extern void kiss_close(bool override_flag); extern void connect_to_kiss_io(bool user_requested); extern bool kiss_thread_running(void); extern int kiss_get_char(void); extern void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag); extern void flush_kiss_tx_buffer(void); #endif // KISSIO_H fldigi-4.1.06/src/include/pskvaricode.h0000644000175000017500000000216213472115776014674 00000000000000// ---------------------------------------------------------------------------- // varicode.h -- PSK31 Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VARICODE_H #define _VARICODE_H extern const char *psk_varicode_encode(unsigned char c); extern int psk_varicode_decode(unsigned int symbol); #endif fldigi-4.1.06/src/include/combo.h0000644000175000017500000001023613472115776013462 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _FL_COMBOBOX_H #define _FL_COMBOBOX_H #include #include #include #include #include #include #include #include #define FL_COMBO_UNIQUE 1 #define FL_COMBO_UNIQUE_NOCASE 2 #define FL_COMBO_LIST_INCR 100 class Fl_ComboBox; enum {COMBOBOX, LISTBOX}; struct datambr { char *s; void *d; }; class Fl_PopBrowser : public Fl_Window { friend void popbrwsr_cb(Fl_Widget *, long); Fl_Select_Browser *popbrwsr; int hRow; int wRow; std::string keystrokes; public: Fl_PopBrowser (int x, int y, int w, int h, const char *label); ~Fl_PopBrowser (); void popshow (int, int); void pophide (); void popbrwsr_cb_i (Fl_Widget *, long); void add (char *s, void *d = 0); void clear (); void sort (); int handle (int); void clear_kbd() { keystrokes.clear(); } Fl_ComboBox *parentCB; Fl_Widget *parentWindow; }; class Fl_ComboBox : public Fl_Group { friend int DataCompare (const void *, const void *); friend class Fl_PopBrowser; friend void val_callback(Fl_Widget *, void *); Fl_Button *btn; Fl_Box *valbox; Fl_Input *val; Fl_PopBrowser *Brwsr; datambr **datalist; int listsize; int maxsize; int listtype; int numrows_; int type_; int width; int height; void *retdata; int idx; Fl_Color _color; void insert(const char *, void *); public: Fl_ComboBox (int x, int y, int w, int h, const char *lbl = 0, int wtype = COMBOBOX); ~Fl_ComboBox(); const char *value (); void value (std::string); void put_value( const char *); void fl_popbrwsr(Fl_Widget *); void type (int = 0); void add (const char *s, void *d = 0); void clear (); void clear_entry() { if (type_ == LISTBOX) { valbox->label(""); valbox->redraw_label(); } else { val->value(""); val->redraw(); } } void sort (); int index (); void index (int i); int find_index(const char *str); void *data (); void textfont (int); void textsize (uchar); void textcolor (Fl_Color c); void color (Fl_Color c); void readonly(bool yes = true); int numrows() { return numrows_; } void numrows(int n) { numrows_ = n; } int lsize() { return listsize; } void set_focus() { Fl::focus(btn); }; void position(int n); void labelfont(Fl_Font fnt) { Fl_Group::labelfont(fnt); } Fl_Font labelfont() { return Fl_Group::labelfont(); } void labelsize(Fl_Fontsize n) { Fl_Group::labelsize(n); } Fl_Fontsize labelsize() { return Fl_Group::labelsize(); } int handle(int); // Custom resize behavior -- input stretches, button doesn't inline int val_x() { return x(); } inline int val_y() { return y(); } inline int val_w() { return w() - h(); } inline int val_h() { return h(); } inline int btn_x() { return x() + w() - h(); } inline int btn_y() { return y(); } inline int btn_w() { return h(); } inline int btn_h() { return h(); } void resize(int X, int Y, int W, int H) { Fl_Group::resize(X,Y,W,H); if (type_ == LISTBOX) valbox->resize(val_x(), val_y(), val_w(), val_h()); else val->resize(val_x(), val_y(), val_w(), val_h()); btn->resize(btn_x(), btn_y(), btn_w(), btn_h()); } }; class Fl_ListBox : public Fl_ComboBox { public: Fl_ListBox (int x, int y, int w, int h, const char *lbl = 0) : Fl_ComboBox(x,y,w,h,lbl,LISTBOX) {}; ~Fl_ListBox() {}; }; #endif fldigi-4.1.06/src/include/data_io.h0000644000175000017500000000720213472115776013762 00000000000000// ---------------------------------------------------------------------------- // // data_io.h // // support for ARQ server/client system such as pskmail and fl_arq // support for KISS server/client system such as BPQ and JNOS // // Copyright (C) 2014 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef fldigi_data_io_h #define fldigi_data_io_h #include "gettext.h" #define IO_START_STR _("Start") #define IO_STOP_STR _("Stop") #define DEFAULT_ARQ_IP_ADDRESS "127.0.0.1" #define DEFAULT_ARQ_IP_PORT "7322" #define DEFAULT_KISS_IP_ADDRESS "127.0.0.1" #define DEFAULT_KISS_IP_IO_PORT "7342" #define DEFAULT_KISS_IP_OUT_PORT "7343" #define DEFAULT_XMLPRC_IP_ADDRESS "127.0.0.1" #define DEFAULT_XMLRPC_IP_PORT "7362" #define DEFAULT_FLRIG_IP_ADDRESS "127.0.0.1" #define DEFAULT_FLRIG_IP_PORT "12345" #define DEFAULT_FLLOG_IP_ADDRESS "127.0.0.1" #define DEFAULT_FLLOG_IP_PORT "8421" enum {DISABLED_IO, ARQ_IO, KISS_IO, XMLRPC_IO, FLRIG_IO, FLLOG_IO}; #define RSID_KISS_NOTIFY 0x01 #define RSID_KISS_ACTIVE 0x02 #define RSID_KISS_USER 0x03 #define DATA_IO_NA 0x00 #define DATA_IO_TCP 0x01 #define DATA_IO_UDP 0x02 // This variable indepent of progdefaults.data_io_enabled // and progStatus.data_io_enabled // Only on start do we assign this variable with progStatus.data_io_enabled. // This is one way assignment as we dont want to save all of the available states // this variable will have. extern int data_io_enabled; // Located in kiss_io.cxx extern int data_io_type; // Located in kiss_io.cxx extern void disable_config_p2p_io_widgets(void); extern void enable_config_p2p_io_widgets(void); extern void set_ip_to_default(int which_io); // KISS implementation extern void kiss_init(bool connect_flag); extern void kiss_close(bool override_flag); extern void kiss_reset(void); extern void WriteKISS(const char data); extern void WriteKISS(const char *data); extern void WriteKISS(const char *data, size_t size); extern void WriteKISS(std::string data); extern bool kiss_thread_running(void); extern bool kiss_auto_connect(void); extern void check_kiss_modem(void); extern int kiss_get_char(void); extern bool kiss_text_available; // Located in kiss_io.cxx extern bool kiss_bcast_rsid_reception; extern bool kiss_bcast_trx_toggle; extern bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify); extern void bcast_trxc_kiss_frame(void); extern void kiss_io_set_button_state(void *); extern void connect_to_kiss_io(bool); // ARQ implementation extern void arq_init(void); extern void arq_close(void); extern bool arq_state(void); extern void WriteARQ(unsigned char); extern void checkTLF(void); extern int arq_get_char(void); extern bool arq_text_available; extern bool gmfskmail; extern std::string ArqFilename; extern bool mailclient; extern bool mailserver; extern bool tlfio; extern time_t inhibit_tx_seconds; // Misc calls extern void enable_disable_kpsql(void); #endif fldigi-4.1.06/src/include/stack.h0000644000175000017500000000306213472115776013467 00000000000000// Copyright 2007 Edd Dawson. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef STACK_HPP_0022_01092007 #define STACK_HPP_0022_01092007 #include #include #include #include namespace dbg { class stack_error : public std::exception { public: stack_error(const std::string &what); ~stack_error() throw(); const char *what() const throw(); private: std::string what_; }; class stack_frame { public: stack_frame(const void *instruction, const std::string &function); const void *instruction() const; const std::string &function() const; private: const void *instruction_; const std::string function_; }; std::ostream &operator<< (std::ostream &out, const stack_frame &frame); class stack { public: typedef std::list::size_type depth_type; typedef std::list::const_iterator const_iterator; stack(depth_type limit = 0); const_iterator begin() const; const_iterator end() const; depth_type depth() const; private: std::list frames_; }; } // close namespace dbg #endif // STACK_HPP_0022_01092007 fldigi-4.1.06/src/include/trx.h0000644000175000017500000000366413472115776013207 00000000000000// ---------------------------------------------------------------------------- // trx.h // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef TRX_H #define TRX_H #include "threads.h" #include "modem.h" #include "sound.h" #include "globals.h" #include "rsid.h" // ---------------------------------------------------------------------------- extern void trx_start_modem(modem* m, int f = 0); extern void trx_start(void); extern void trx_close(void); extern void trx_transmit_psm(void); extern void trx_transmit(void); extern void trx_tune(void); extern void trx_receive(void); extern void trx_reset(void); extern void trx_wait_state(void); extern state_t trx_state; extern modem *active_modem; extern cRsId *ReedSolomon; extern SoundBase *RXscard; extern SoundBase *TXscard; extern bool bHistory; extern bool bHighSpeed; extern bool rx_only; #define TRX_WAIT(s_, code_) \ do { \ ENSURE_NOT_THREAD(TRX_TID); \ code_; \ while (trx_state != s_) \ trx_wait_state(); \ } while (0) void trx_xmit_wfall_queue(int samplerate, const double* buf, size_t len); #endif fldigi-4.1.06/src/include/raster.h0000644000175000017500000000347413472115776013671 00000000000000// ---------------------------------------------------------------------------- // raster.h, Raster scan Widget for display of fuzzy modes // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RASTER_H #define _RASTER_H #include #include "feld.h" class Raster : public Fl_Widget { public: private: unsigned char *vidbuf; int width; int height; int col; int Nrows; int rowheight; int rhs; int space; int vidpos; // column start position int numcols; // number of columns to redraw int yp; bool marquee; bool _reverse; public: Raster(int X, int Y, int W, int H, int rh = 2, bool rv = false); ~Raster(); void draw(); int handle(int); void resize(int x, int y, int w, int h); unsigned char *buffer() { return vidbuf;} int size() { return width * height;} int change_rowheight( int rh ); void data(int data[], int len); void clear(); void show() { Fl_Widget::show();} void hide() { Fl_Widget::hide();} void set_marquee(bool val) { marquee = val; } bool get_marquee() { return marquee; } void reverse(bool val) { _reverse = val; } }; #endif fldigi-4.1.06/src/include/flmisc.h0000664000175000017500000000611413507402064013626 00000000000000// ---------------------------------------------------------------------------- // flmisc.h // // Copyright (C) 2009-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef fl_misc_h_ #define fl_misc_h_ #include #include #include #include #include #include #include #include #include "flinput2.h" unsigned quick_choice_menu(const char* title, unsigned sel, const Fl_Menu_Item* menu); unsigned quick_choice(const char* title, unsigned sel, ...); Fl_Color adjust_color(Fl_Color fg, Fl_Color bg); void adjust_color_inv(unsigned char& bg1r, unsigned char& bg1g, unsigned char& bg1b, Fl_Color bg2, Fl_Color def); #if !defined(__APPLE__) && !defined(__WOE32__) # include void make_pixmap(Pixmap *xpm, const char **data, int argc, char** argv); #endif struct dialog_positions { int used; int X; int Y; }; class notify_dialog : public Fl_Window { friend void show_notifier(notify_dialog *nd); Fl_Box icon; Fl_Input2 message; Fl_Dial dial; Fl_Return_Button button; Fl_Button *user_button; Fl_Box resize_box; double _timeout; int dialog_number; static dialog_positions positions[11]; public: notify_dialog(int X = 0, int Y = 0); ~notify_dialog(); int handle(int event); Fl_Button* make_button(int W, int H = 23); void notify(const char* msg, double timeout); private: static void button_cb(Fl_Widget* w, void*); static void dial_timer(void* arg); int newx; }; void show_notifier(notify_dialog *nd); #ifdef BUILD_FLDIGI #include #include // Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) #undef nitems #include #define FLTK_nitems nitems #undef nitems // ^^^ Avoid 'nitems' macro collision #include "globals.h" class Mode_Browser : public Fl_Double_Window { public: Mode_Browser(void); ~Mode_Browser(void); void show_(mode_set_t* b); void callback(Fl_Callback* cb, void* args = 0); private: Fl_Button *close_button, *all_button, *none_button; Fl_Check_Browser* modes; mode_set_t* store; Fl_Callback* changed_cb; void* changed_args; static void modes_cb(Fl_Widget* w, void* arg); static void button_cb(Fl_Widget* w, void* arg); }; #endif // BUILD_FLDIGI #endif // fl_misc_h_ fldigi-4.1.06/src/include/pwrmeter.h0000644000175000017500000000454513472115776014236 00000000000000// // pwrmeter.h // // PWRmeter bar widget routines. // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PWRMETER #define PWRMETER // // Include necessary headers. // #include #include // // PWRmeter class... // class PWRmeter : public Fl_Widget { public: enum {P25, P50, P100, P200, AUTO}; private: double value_, maximum_; int sval; // Size of sval bar... int bx, by, bw, bh; // Box areas... int tx, tw; // Temporary X + width int ty, th; // Temporary Y + height int sx; // meter left offset int meter_width; int meter_height; int select_; Fl_Color bgnd_; Fl_Color fgnd_; Fl_Color scale_color; static const char *W25_face; static const char *W50_face; static const char *W100_face; static const char *W200_face; void (*cbFunc)(Fl_Widget *, void *); protected: virtual void draw(); public: PWRmeter(int x, int y, int w, int h, const char *l = 0); void value(double v) { value_ = v; redraw(); } double value() const { return (value_); } void resize(int x, int y, int w, int h); int handle(int); void set_background(Fl_Color c1) { bgnd_ = c1; redraw(); } void set_metercolor(Fl_Color c2) { fgnd_ = c2; redraw(); } void set_scalecolor(Fl_Color c3) { scale_color = c3; redraw(); } void select(int sel); void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } private: void select_auto(); void select_25W(); void select_50W(); void select_100W(); void select_200W(); }; #endif // !pwrmeter fldigi-4.1.06/src/include/icons.h0000644000175000017500000000415613472115776013502 00000000000000// ---------------------------------------------------------------------------- // icons.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef ICONS_H_ #define ICONS_H_ #define USE_IMAGE_LABELS 1 #include #include #include #include "pixmaps.h" namespace icons { const char* make_icon_label(const char* text, const char** pixmap = 0); void set_icon_label(Fl_Menu_Item* item); void set_icon_label(Fl_Widget* w); void toggle_icon_labels(void); const char* get_icon_label_text(Fl_Menu_Item* item); const char* get_icon_label_text(Fl_Widget* w); void free_icon_label(Fl_Menu_Item* item); void free_icon_label(Fl_Widget* w); void set_active(Fl_Menu_Item* item, bool v); void set_active(Fl_Widget* w, bool v); // fltk message dialogs with nicer icons void set_message_icon(const char** pixmap); } #define fl_input2(...) ({ icons::set_message_icon(dialog_question_48_icon); fl_input(__VA_ARGS__); }) #define fl_choice2(...) ({ icons::set_message_icon(dialog_question_48_icon); fl_choice(__VA_ARGS__); }) #define fl_message2(...) ({ icons::set_message_icon(dialog_information_48_icon); fl_message(__VA_ARGS__); }) #define fl_warn_choice2(...) ({ icons::set_message_icon(dialog_warning_48_icon); fl_choice(__VA_ARGS__); }) #define fl_alert2(...) ({ icons::set_message_icon(dialog_warning_48_icon); fl_alert(__VA_ARGS__); }) #endif // ICONS_H_ fldigi-4.1.06/src/include/fd_logger.h0000644000175000017500000000262513472115776014316 00000000000000// ---------------------------------------------------------------------------- // fd_logger.h -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "qso_db.h" extern void FD_init(void); extern void FD_close(void); extern void FD_disconnect(); extern void FD_logoff(); extern void FD_add_record(); extern void FD_mode_check(); extern void FD_band_check(); extern int FD_dupcheck(); extern bool FD_connected; extern bool FD_logged_on; fldigi-4.1.06/src/include/locator.h0000644000175000017500000000316613472115776014032 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef LOCATOR_H_ #define LOCATOR_H_ #include namespace QRB { enum {QRB_OK, QRB_EINVAL}; int qrb(double lon1, double lat1, double lon2, double lat2, double *distance, double *azimuth); double distance_long_path(double distance); double azimuth_long_path(double azimuth); int longlat2locator(double longitude, double latitude, char *locator_res, int pair_count); int locator2longlat(double *longitude, double *latitude, const char *locator); double dms2dec(int degrees, int minutes, double seconds, int sw); int dec2dms(double dec, int *degrees, int *minutes, double *seconds, int *sw); int dec2dmmm(double dec, int *degrees, double *minutes, int *sw); double dmmm2dec(int degrees, double minutes, int sw); } #endif /* LOCATOR_H_ */ fldigi-4.1.06/src/include/contest.h0000644000175000017500000000513513472115776014044 00000000000000// ---------------------------------------------------------------------------- // contest.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONTEST_H #define _CONTEST_H #include enum CONTEST_FIELD { cCALL, cMODE, cNAME, cQTH, cSTATE, cVE_PROV, cDIST, cGRIDSQUARE, cCNTY, cCOUNTRY, cCQZ, cDXCC, cIOTA, cITUZ, cCONT, cSRX, cXCHG1, cSS_SERNO, cSS_PREC, cSS_CHK, cSS_SEC, cROOKIE, cCHECK, cKD_XCHG, cARR_XCHG, c1010, cRST, cNUMERIC, cCLASS, cFD_CLASS, cWFD_CLASS, cASCR_CLASS, cARRL_SECT, cFD_SECTION, cITALIAN }; struct CONTESTS { string name; string notes; }; // Contest, ST, TEST, rRST , rST, rCY, rSERNO, rXCHG, rNAME, rCAT, rSTCTY, Notes struct QSOP { const char *contest; const char *state; const char *instate; const char *rst; const char *st; const char *cnty; const char *serno; const char *xchg; const char *name; const char *cat; const char *stcty; const char *notes; }; class Ccontests { private: public: static struct QSOP qso_parties[]; Ccontests() {}; ~Ccontests() {}; const std::string names(); char rst(std::string party); char st(std::string party); char cnty(std::string party); char serno(std::string party); char sect(std::string party); char xchg(std::string party); char name(std::string party); char cat(std::string party); char stcty(std::string party); const char *notes(std::string party); }; extern Ccontests QSOparties; extern int check_field(std::string s1, CONTEST_FIELD, std::string s2=""); extern void adjust_for_contest(void *); extern CONTESTS contests[]; extern std::string contest_names(); extern std::string country_match; extern bool state_test(std::string s); extern bool province_test(std::string s); extern bool country_test(std::string s); extern bool county_test(std::string st, std::string cty); extern bool section_test(std::string s); #endif fldigi-4.1.06/src/include/timeops.h0000644000175000017500000000441113472115776014041 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef TIMEOPS_H_ #define TIMEOPS_H_ #include #include #include #ifdef __MINGW32__ # include #endif #if !HAVE_CLOCK_GETTIME # ifndef __clockid_t_defined typedef int clockid_t; #define __clockid_t_defined 1 # endif /* __clockid_t_defined */ # ifndef CLOCK_REALTIME # define CLOCK_REALTIME 0 # endif # ifndef CLOCK_MONOTONIC # define CLOCK_MONOTONIC 1 # endif int clock_gettime(clockid_t clock_id, struct timespec* tp); #endif /* !HAVE_CLOCK_GETTIME */ struct timespec operator+(const struct timespec &t0, const double &t); struct timespec operator-(const struct timespec &t0, const struct timespec &t1); struct timespec& operator-=(struct timespec &t0, const struct timespec &t1); bool operator>(const struct timespec &t0, const struct timespec &t1); bool operator==(const struct timespec &t0, const struct timespec &t1); struct timeval operator+(const struct timeval &t0, const double &t); struct timeval operator-(const struct timeval &t0, const struct timeval &t1); struct timeval& operator-=(struct timeval &t0, const struct timeval &t1); bool operator>(const struct timeval &t0, const struct timeval &t1); bool operator==(const struct timeval &t0, const struct timeval &t1); #ifndef GMTIME_R extern struct tm *gmtime_r(const time_t *timer, struct tm *tmbuf); extern struct tm *localtime_r(const time_t *_Time,struct tm *_Tm); #endif #endif // TIMEOPS_H_ fldigi-4.1.06/src/include/fsq.h0000644000175000017500000001155213472115776013156 00000000000000// ---------------------------------------------------------------------------- // fsq.h -- FSQCALL compatible modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FSQ_H #define _FSQ_H #include #include #include #include "trx.h" #include "modem.h" #include "complex.h" #include "filters.h" #include "crc8.h" #include "picture.h" #include class fsq : public modem { #define SR 12000 #define FFTSIZE 4096 #define FSQ_SYMLEN 4096 #define NUMBINS 144 // 200 //((FFTSIZE / 4) - 2) #define BLOCK_SIZE FFTSIZE #define SHIFT_SIZE (FSQ_SYMLEN / 16) #define MOVAVGLIMIT 15 enum STATE {TEXT, IMAGE}; friend void timed_xmt(void *); friend void sounder(void *); friend void aging(void *); friend void fsq_add_tx_timeout(void *); friend void fsq_stop_aging(); friend void try_transmit(void *); friend void fsq_transmit(void *); public: protected: // Rx double rx_stream[BLOCK_SIZE + SHIFT_SIZE]; cmplx fft_data[2*FFTSIZE]; double a_blackman[BLOCK_SIZE]; double tones[NUMBINS]; Cmovavg *binfilt[NUMBINS]; int movavg_size; int bkptr; g_fft *fft; Cmovavg *snfilt; Cmovavg *sigfilt; Cmovavg *noisefilt; Cmovavg *baudfilt; double val; double max; double noise; int peak; int prev_peak; int last_peak; int peak_counter; int peak_hits; int symbol; int prev_symbol; int curr_nibble; int prev_nibble; int nibbles[199]; void lf_check(int); void process_symbol(int); double s2n; char szestimate[40]; std::string rx_text; std::string toprint; int valid_callsign(std::string s); void parse_rx_text(); void parse_space(bool); void parse_qmark(std::string relay = ""); void parse_star(); void parse_repeat(); void parse_delayed_repeat(); void parse_pound(std::string relay = ""); void parse_dollar(std::string relay = ""); void parse_at(std::string relay = ""); void parse_amp(std::string relay = ""); void parse_carat(std::string relay = ""); void parse_pcnt(); void parse_vline(std::string relay = ""); void parse_greater(std::string relay = ""); void parse_less(std::string relay = ""); void parse_plus(std::string relay = ""); void parse_minus(); void parse_relay(); void parse_relayed(); bool b_bot; bool b_eol; bool b_eot; // Tx // C_FIR_filter *xmtfilt; int tone; int prevtone; double txphase; void send_string(std::string); bool send_bot; void flush_buffer (); void send_char (int); void send_idle (); void send_symbol(int sym); void send_tone(int tone); void reply(std::string); void delayed_reply(std::string, int delay); void send_ack(std::string relay = ""); // Sounder double sounder_interval; void start_sounder(int); // 0, 1, 2, 3 void stop_sounder(); // Aging void start_aging(); void stop_aging(); // RxTx int fsq_frequency; // 0 / 1 int spacing; int basetone; int tx_basetone; double speed; double metric; bool ch_sqlch_open; CRC8 crc; std::string station_calling; std::string mycall; std::string heard_log_fname; std::string audit_log_fname; std::ofstream heard_log; std::ofstream audit_log; void show_mode(); void adjust_for_speed(); void process_tones(); void init_nibbles(); void set_freq(double); bool valid_char(int); STATE state; public: fsq (trx_mode md); ~fsq (); void init (); void rx_init (); void restart (); void tx_init (); int rx_process (const double *buf, int len); int tx_process (); std::string fsq_mycall() { return mycall; } bool fsq_squelch_open(); static int symlen; // support for fsq image transfers private: double amplitude; double pixel; unsigned char tx_pixel; int tx_pixelnbr; int image_mode; public: int byte; double picf; double picpeak; C_FIR_filter *picfilter; double phidiff; double phase; cmplx prevz; cmplx currz; double image_freq[10]; int image_counter; int picW; int picH; int row; int col; int rgb; int pixelnbr; int RXspp; int TXspp; void recvpic(double smpl); void send_image(); void fsq_send_image(std::string s); void toggle_logs(); }; #endif fldigi-4.1.06/src/include/dx_dialog.h0000644000175000017500000000714413511722452014306 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef dx_dialog_h #define dx_dialog_h #include #include #include extern Fl_Group *btn_select_host; #include "flinput2.h" extern Fl_Input2 *inp_dxcc_host_url; #include extern Fl_Button *btn_show_host_tab; extern Fl_Input2 *inp_dccc_host_port; extern Fl_Input2 *inp_dccc_login; extern Fl_Input2 *inp_dxcc_password; extern Fl_Button *btnDXCLUSTERpasswordShow; #include #include "status.h" extern Fl_Check_Button *btn_dxcc_connect; #include extern Fl_Box *lbl_dxc_connected; extern Fl_Check_Button *btn_dxc_auto_connect; #include extern Fl_Tabs *cluster_tabs; extern Fl_Group *tabDXclusterTelNetStream; #include "FTextView.h" extern FTextView *brws_tcpip_stream; extern void dxc_click_m1(Fl_Button*, void*); extern Fl_Button *dxc_macro_1; extern void dxc_click_m2(Fl_Button*, void*); extern Fl_Button *dxc_macro_2; extern void dxc_click_m3(Fl_Button*, void*); extern Fl_Button *dxc_macro_3; extern void dxc_click_m4(Fl_Button*, void*); extern Fl_Button *dxc_macro_4; extern void dxc_click_m5(Fl_Button*, void*); extern Fl_Button *dxc_macro_5; extern void dxc_click_m6(Fl_Button*, void*); extern Fl_Button *dxc_macro_6; extern void dxc_click_m7(Fl_Button*, void*); extern Fl_Button *dxc_macro_7; extern void dxc_click_m8(Fl_Button*, void*); extern Fl_Button *dxc_macro_8; extern Fl_Input2 *inp_dxcluster_cmd; extern Fl_Button *btn_cluster_spot; extern Fl_Button *btn_cluster_submit; extern Fl_Group *tabDXclusterReports; #include extern Fl_Browser *reports_header; extern Fl_Browser *brws_dx_cluster; extern Fl_Button *btn_dxc_cluster_clear; extern Fl_Check_Button *brws_order; extern Fl_Button *btn_cluster_spot2; extern Fl_Group *tabDXclusterConfig; extern Fl_Browser *brws_dxcluster_hosts; extern void dxcluster_hosts_select(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_select; extern void dxcluster_hosts_add(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_add; extern void dxcluster_hosts_delete(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_delete; extern void dxcluster_servers(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_servers; extern FTextEdit *ed_telnet_cmds; extern void dxcluster_hosts_load_setup(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_load_setup; extern void dxcluster_hosts_save_setup(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_save_setup; extern void dxcluster_hosts_send_setup(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_send_setup; extern Fl_Check_Button *btn_spot_when_logged; extern Fl_Check_Button *btn_dxc_hertz; #include extern Fl_Input *mlabel_1; extern Fl_Input2 *mtext_1; extern Fl_Input *mlabel_2; extern Fl_Input2 *mtext_2; extern Fl_Input *mlabel_3; extern Fl_Input2 *mtext_3; extern Fl_Input *mlabel_4; extern Fl_Input2 *mtext_4; extern Fl_Input *mlabel_5; extern Fl_Input2 *mtext_5; extern Fl_Input *mlabel_6; extern Fl_Input2 *mtext_6; extern Fl_Input *mlabel_7; extern Fl_Input2 *mtext_7; extern Fl_Input *mlabel_8; extern Fl_Input2 *mtext_8; extern void dxcluster_ar_help(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_ar_help; extern void dxcluster_cc_help(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_cc_help; extern void dxcluster_dx_help(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_dx_help; extern Fl_Group *tabDXclusterHelp; extern FTextView *brws_dxc_help; extern Fl_Button *btn_dxc_help_query; extern Fl_Input2 *inp_help_string; extern Fl_Button *btn_dxc_help_clear; Fl_Double_Window* dxc_window(); #endif fldigi-4.1.06/src/include/fl_digi.h0000664000175000017500000005601013512070600013737 00000000000000// ---------------------------------------------------------------------------- // // fl_digi.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_DIGI_H #define FL_DIGI_H #include #include #include #include #include "combo.h" //#include "Fl_Tile_Check.h" #include "Panel.h" #include "FTextRXTX.h" #include "raster.h" #include "waterfall.h" #include "digiscope.h" #include "globals.h" #include "progress.h" #include "FreqControl.h" #include "flinput2.h" #include "flslider2.h" #include "psk_browser.h" #include "re.h" #include "smeter.h" #include "pwrmeter.h" #include "picture.h" #include "qso_db.h" extern fre_t seek_re; extern Fl_Double_Window *fl_digi_main; //extern dropwin *fl_digi_main; extern Fl_Double_Window *scopeview; //extern Fl_Double_Window *opBrowserView; extern Fl_Double_Window *dlgRecordLoader; extern bool first_use; extern bool bEXITING; extern bool bMOREINFO; extern FTextRX *ReceiveText; extern FTextTX *TransmitText; extern Raster *FHdisp; extern pskBrowser *mainViewer; extern Fl_Input2 *txtInpSeek; extern Fl_Box *hideViewer; extern Fl_Group *mvgroup; extern Fl_Group *text_group; extern Fl_Group *wefax_group; extern Panel *text_panel; extern Fl_Box *minbox; extern int oix; extern Fl_Box *Status2; extern Fl_Box *Status1; extern Fl_Counter2 *cntCW_WPM; extern Fl_Counter2 *cntTxLevel; extern Fl_Button *MODEstatus; extern Fl_Slider2 *sldrSquelch; extern Progress *pgrsSquelch; extern Smeter *smeter; extern PWRmeter *pwrmeter; extern Fl_Value_Slider2 *pwr_level; extern Fl_Group *pwrlevel_grp; extern Fl_Button *btnMacro[]; extern Fl_Button *btnAltMacros1; extern Fl_Button *btnAltMacros2; extern Fl_Button *btnDockMacro[]; extern Fl_Group *macroFrame1; extern Fl_Group *macroFrame2; extern Fl_Input2 *inpFreq; extern Fl_Input2 *inpTimeOff; extern Fl_Input2 *inpTimeOff1; extern Fl_Input2 *inpTimeOff2; extern Fl_Input2 *inpTimeOff3; extern Fl_Input2 *inpTimeOn; extern Fl_Input2 *inpTimeOn1; extern Fl_Input2 *inpTimeOn2; extern Fl_Input2 *inpTimeOn3; extern Fl_Input2 *inpTimeOn4; extern Fl_Input2 *inpTimeOn5; extern Fl_Input2 *inpCall; extern Fl_Input2 *inpName; extern Fl_Input2 *inpRstIn; extern Fl_Input2 *inpRstIn1; extern Fl_Input2 *inpRstIn2; extern Fl_Input2 *inpRstIn3; extern Fl_Input2 *inpRstIn4; extern Fl_Input2 *inpRstOut; extern Fl_Input2 *inpRstOut1; extern Fl_Input2 *inpRstOut2; extern Fl_Input2 *inpRstOut3; extern Fl_Input2 *inpRstOut4; extern Fl_Input2 *inpQTH; extern Fl_Input2 *inpQth; extern Fl_Input2 *inpState; extern Fl_Input2 *inpState1; extern Fl_ComboBox *cboCountry; extern Fl_Input2 *inpCounty; extern Fl_ComboBox *cboCountryQSO; extern Fl_ComboBox *cboCountyQSO; extern Fl_Input2 *inpSerNo; extern Fl_Input2 *inpSerNo1; extern Fl_Input2 *inpSerNo2; extern Fl_Input2 *inpSerNo3; extern Fl_Input2 *inpSerNo4; extern Fl_Input2 *outSerNo; extern Fl_Input2 *outSerNo1; extern Fl_Input2 *outSerNo2; extern Fl_Input2 *outSerNo3; extern Fl_Input2 *outSerNo4; extern Fl_Input2 *inpXchgIn; extern Fl_Input2 *inpXchgIn1; extern Fl_Input2 *inpXchgIn2; extern Fl_Input2 *inpVEprov; extern Fl_Input2 *inpLoc; extern Fl_Input2 *inpLoc1; extern Fl_Input2 *inpNotes; extern Fl_Input2 *inpAZ; // WA5ZNU extern Fl_Button *qsoSave; extern Fl_Box *txtRigName; extern cFreqControl *qsoFreqDisp1; extern cFreqControl *qsoFreqDisp2; extern cFreqControl *qsoFreqDisp3; extern Fl_Input2 *inpFreq2; extern Fl_Input2 *inpCall1; extern Fl_Input2 *inpCall2; extern Fl_Input2 *inpCall3; extern Fl_Input2 *inpCall4; extern Fl_Input2 *inpName1; extern Fl_Input2 *inpName2; extern Fl_Group *QsoInfoFrame1B; extern Fl_Group *qsoFrameView; extern Fl_Group *QsoInfoFrame; extern cFreqControl *qsoFreqDisp; extern Fl_Group *qso_combos; extern Fl_ListBox *qso_opMODE; extern Fl_Group *qso_opGROUP; extern Fl_ListBox *qso_opBW; extern Fl_Button *qso_btnBW1; extern Fl_ListBox *qso_opBW1; extern Fl_Button *qso_btnBW2; extern Fl_ListBox *qso_opBW2; extern Fl_Button *qso_opPICK; extern Fl_Browser *qso_opBrowser; extern Fl_Group *fsq_group; extern FTextRX *fsq_rx_text; extern FTextTX *fsq_tx_text; extern Fl_Browser *fsq_heard; extern Fl_Double_Window *fsqMonitor; extern FTextRX *fsq_monitor; extern FTextRX *fsq_que; extern Fl_Double_Window *create_fsqMonitor(); extern void open_fsqMonitor(); extern void close_fsqMonitor(); extern Fl_Double_Window *fsqDebug; extern Fl_Double_Window *create_fsqDebug(); extern void open_fsqDebug(); extern void close_fsqDebug(); extern void write_fsqDebug(int ch, int style = FTextBase::RECV); extern void write_fsqDebug(std::string s, int style = FTextBase::RECV); extern void fsq_que_clear(); extern void write_fsq_que(std::string s); extern Fl_Box *tx_timer; extern void start_tx_timer(); extern void stop_tx_timer(); extern void fsq_disableshift(); extern void fsq_enableshift(); extern void fsq_updateRxPic(unsigned char data, int pos); extern void fsq_createRxViewer(); extern void fsq_showRxViewer(int W, int H, char c); extern int fsq_load_image(const char *n, int W = 320, int H = 240); extern void fsq_updateTxPic(unsigned char data, int pos); extern void cb_fsqpicTxLoad(Fl_Widget *, void *); extern void cb_fsqpicTxClose( Fl_Widget *w, void *); extern int fsqpic_TxGetPixel(int pos, int color); extern void cb_fsqpicTxSendColor( Fl_Widget *w, void *); extern void cb_fsqpicTxSendGrey( Fl_Widget *w, void *); extern void cb_fsqpicTxSendAbort( Fl_Widget *w, void *); extern void cb_fsqpicTxSPP( Fl_Widget *w, void *); extern void fsq_createTxViewer(); extern void fsq_TxViewerResize(int W, int H); extern void fsq_showTxViewer(char c); extern void fsq_deleteTxViewer(); extern void fsq_deleteRxViewer(); extern int fsq_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix); extern void fsq_transmit(void *); extern Fl_Light_Button *btn_FSQCALL; extern Fl_Light_Button *btn_SELCAL; extern Fl_Light_Button *btn_MONITOR; extern Fl_Button *btn_FSQQTH; extern Fl_Button *btn_FSQQTC; extern Progress *ind_fsq_speed; extern Progress *ind_fsq_s2n; extern Fl_Double_Window *fsqpicRxWin; extern Fl_Double_Window *fsqpicTxWin; extern std::string fsq_selected_call; extern bool in_heard(std::string); extern void cb_fsq_heard(Fl_Browser*, void*); extern std::string heard_list(); extern void clear_heard_list(); extern void age_heard_list(); extern void add_to_heard_list(std::string, std::string); extern void fsq_transmit_string(std::string s); extern void fsq_xmt_mt(void *s); extern void fsq_xmt(std::string s); extern void fsq_repeat_last_heard(); extern void fsq_repeat_last_command(); extern void display_fsq_rx_text(std::string text, int style = FTextBase::SKIP); extern void display_fsq_mon_text(std::string text, int style = FTextBase::SKIP); extern void combo_color_font(Fl_ComboBox *cbo); extern Fl_Group *ifkp_group; extern Fl_Group *ifkp_upper; extern Fl_Group *ifkp_upper_left; extern FTextRX *ifkp_rx_text; extern Fl_Group *ifkp_upper_right; extern Fl_Browser *ifkp_heard; extern Progress *ifkp_s2n_progress; extern Fl_Group *ifkp_lower; extern FTextTX *ifkp_tx_text; extern picture *ifkp_avatar; extern int ifkp_load_avatar(std::string image_fname = "", int W=59, int H=74); extern void ifkp_clear_avatar(); extern void ifkp_update_avatar(unsigned char data, int pos); extern int ifkp_get_avatar_pixel(int pos, int color); extern void cb_ifkp_send_avatar( Fl_Widget *w, void *); extern void ifkp_load_raw_video(); extern void activate_ifkp_image_item(bool); extern void cb_ifkp_heard(Fl_Browser*, void*); extern void enableSELCAL(); extern unsigned char tux_img[59*74*3]; extern void cbFSQQTC(Fl_Widget *w, void *d); extern void cbFSQQTH(Fl_Widget *w, void *d); extern void cbFSQCQ(Fl_Widget *w, void *d); extern void cbMONITOR(Fl_Widget *w, void *d); extern void cbSELCAL(Fl_Widget *w, void *d); extern void cbFSQCALL(Fl_Widget *w, void *d); extern void ifkp_showTxViewer(char C = 'S'); extern void ifkp_load_scaled_image(std::string, bool gray = false); extern Fl_Double_Window *ifkppicRxWin; extern Fl_Double_Window *ifkppicTxWin; #include extern Fl_Bitmap image_s2n; //------------------------------------------------------------------------------ // fsq images //------------------------------------------------------------------------------ extern Fl_Double_Window *picRxWin; extern picture *picRx; extern Fl_Button *btnpicRxSave; extern Fl_Button *btnpicRxAbort; extern Fl_Button *btnpicRxClose; extern Fl_Double_Window *picTxWin; extern picture *picTx; extern Fl_Button *btnpicTxSPP; extern Fl_Button *btnpicTxSendColor; extern Fl_Button *btnpicTxSendGrey; extern Fl_Button *btnpicTxSendAbort; extern Fl_Button *btnpicTxLoad; extern Fl_Button *btnpicTxClose; //------------------------------------------------------------------------------ extern Fl_Value_Slider2 *mvsquelch; extern Fl_Light_Button *btnAFC; extern Fl_Light_Button *btnSQL; extern Fl_Light_Button *btnPSQL; extern Fl_Box *rsid_status; extern Fl_Light_Button *btnRSID; extern Fl_Light_Button *btnTxRSID; extern Fl_Light_Button *btnTune; extern Fl_Light_Button *btnAutoSpot; extern bool bWF_only; extern int altMacros; extern waterfall *wf; extern Digiscope *digiscope; extern std::string argv_window_title; extern std::string main_window_title; extern std::string xcvr_title; extern int Qwait_time; extern int Qidle_time; extern bool idling; extern bool csma_idling; extern void toggleRSID(); extern int rightof(Fl_Widget* w); extern int leftof(Fl_Widget* w); extern int above(Fl_Widget* w); extern int below(Fl_Widget* w); extern void set_menus(); extern void create_fl_digi_main(int argc, char** argv); extern void update_main_title(); extern void activate_rig_menu_item(bool b); extern void activate_test_menu_item(bool b); extern void activate_mfsk_image_item(bool b); extern void activate_wefax_image_item(bool b); extern void activate_thor_image_item(bool b); extern void WF_UI(); extern void set_macroLabels(); extern void UI_select(); extern void cb_mnuVisitURL(Fl_Widget*, void* arg); extern void put_freq(double frequency); extern void put_Bandwidth(int bandwidth); extern void callback_set_metric(double metric); extern void put_cwRcvWPM(double wpm); extern void set_scope_mode(Digiscope::scope_mode md); extern void set_scope(double *data, int len, bool autoscale = true); extern void set_phase(double phase, double quality, bool highlight); extern void set_rtty(double, double, double); extern void set_video(double *, int, bool = true); extern void set_zdata(cmplx *, int); extern void set_scope_xaxis_1(double y1); extern void set_scope_xaxis_2(double y2); extern void set_scope_yaxis_1(double x1); extern void set_scope_yaxis_2(double x2); extern void set_scope_clear_axis(); extern void set_CWwpm(); extern void put_rx_char(unsigned int data, int style = FTextBase::RECV); extern void put_rx_processed_char(unsigned int data, int style = FTextBase::RECV); extern void put_sec_char( char chr ); enum status_timeout { STATUS_CLEAR, STATUS_DIM, STATUS_NUM }; extern const char *zshowtime(); extern void put_status(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void clear_StatusMessages(); extern void put_MODEstatus(const char* fmt, ...) format__(printf, 1, 2); extern void put_MODEstatus(trx_mode mode); extern void put_Status1(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void put_Status2(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void show_frequency(long long); extern void show_mode(const std::string sMode); extern void show_bw(const std::string sWidth); extern void show_bw1(const std::string sVal); extern void show_bw2(const std::string sVal); extern void show_spot(bool v); extern void showMacroSet(); extern void setwfrange(); extern void showDTMF(const std::string s); extern void * set_xmtrcv_button_false(void); extern void * set_xmtrcv_button_true(void); extern void * set_xmtrcv_selection_color_pending(void); extern void * set_xmtrcv_selection_color_transmitting(void); extern void xmtrcv_selection_color(Fl_Color clr); extern void xmtrcv_selection_color(); extern void rev_selection_color(); extern void xmtlock_selection_color(); extern void sql_selection_color(); extern void afc_selection_color(); extern void rxid_selection_color(); extern void txid_selection_color(); extern void tune_selection_color(); extern void spot_selection_color(); extern void set_default_btn_color(); extern void put_WARNstatus(double); extern void qsoSave_cb(Fl_Widget *b, void *); extern bool que_ok; extern bool tx_queue_done; extern void post_queue_execute(void*); extern void queue_execute_after_rx(void*); extern time_t program_start_time; extern bool xmlrpc_address_override_flag; extern bool xmlrpc_port_override_flag; extern bool arq_address_override_flag; extern bool arq_port_override_flag; extern bool kiss_address_override_flag; extern std::string override_xmlrpc_address; extern std::string override_xmlrpc_port; extern std::string override_arq_address; extern std::string override_arq_port; extern std::string override_kiss_address; extern std::string override_kiss_io_port; extern std::string override_kiss_out_port; extern int override_kiss_dual_port_enabled; extern int override_data_io_enabled; extern int rxtx_charset; extern void put_rx_data(int *data, int len); // Values returned by get_tx_char() to signal various conditions to the // modems. These values need to be negative so they don't interfere with // normal TX data (which is always byte-sized and positive). #define GET_TX_CHAR_NODATA -1 // no data available #define GET_TX_CHAR_ETX -3 // end of transmission requested // Last single macro bar option index #define MACRO_SINGLE_BAR_MAX 2 extern int get_tx_char(); extern int get_secondary_char(); extern void put_echo_char(unsigned int data, int style = FTextBase::XMIT); extern char *get_rxtx_data(); extern char *get_rx_data(); extern char *get_tx_data(); extern void resetRTTY(); extern void resetOLIVIA(); extern void resetCONTESTIA(); extern void resetTHOR(); extern void resetDOMEX(); extern void updatePACKET(); extern void resetSoundCard(); extern void restoreFocus(int n = 0); extern void setReverse(int); extern void clearQSO(); extern void clear_log_fields(); extern void set_log_colors(); extern void closeRigDialog(); extern void CloseQsoView(); extern void setAfcOnOff(bool b); extern void setSqlOnOff(bool b); extern bool QueryAfcOnOff(); extern bool QuerySqlOnOff(); extern void init_modem(trx_mode mode, int freq = 0); extern void init_modem_sync(trx_mode mode, int freq = 0); extern void init_modem_squelch(trx_mode mode, int freq = 0); extern void start_tx(); extern void abort_tx(); extern void set_rx_tx(); extern void set_rx_only(); extern void connect_to_fdserver(bool); extern void LOGGING_colors_font(); extern void LOGBOOK_colors_font(); extern void colorize_macro(int i); extern void colorize_macros(); extern void set_rtty_tab_widgets(); extern void set_olivia_tab_widgets(); extern void set_olivia_default_integ(); extern void set_dominoex_tab_widgets(); extern void set_contestia_tab_widgets(); extern void set_contestia_default_integ(); extern void startMacroTimer(); extern void stopMacroTimer(); extern void macro_timer(void *); extern void macro_timed_execute(void *); extern void startTimedExecute(std::string &); extern void cb_ResetSerNbr(); extern void updateOutSerNo(); extern void connect_to_log_server(void *p = NULL); extern void set_server_label(bool); extern void activate_menu_item(const char *caption, bool val); extern int xml_check_dup(); extern bool xml_get_record(const char *); extern cQsoRec* search_fllog(const char *callsign); extern void xml_update_eqsl(); extern void xml_update_lotw(); extern const char* zdate(void); extern const char* ztime(void); //extern void ztimer(void* first_call); extern const unsigned long zmsec(void); extern void setTabColors(); extern void toggle_visible_modes(Fl_Widget*, void*); extern void qsy(long long rfc, int fmid = -1); extern void note_qrg(bool no_dup = true, const char* prefix = " ", const char* suffix = " ", trx_mode mode = NUM_MODES, long long rfc = 0LL, int afreq = 0); extern void set_olivia_bw(int bw); extern void set_olivia_tones(int tones); extern void set_contestia_bw(int bw); extern void set_contestia_tones(int tones); extern void set_rtty_shift(int shift); extern void set_rtty_baud(float baud); extern void set_rtty_bits(int bits); extern void set_rtty_bw(float bw); extern void enable_rtty_quickchange(); extern void disable_rtty_quickchange(); extern void sync_cw_parameters(); extern void open_recv_folder(const char *fname); extern void reset_mnuPlayback(); // character set extern void set_charset_listbox(Fl_Widget *, void *charset); extern void cb_listbox_charset(Fl_Widget *, void *); extern void populate_charset_listbox(void); extern void set_default_charset(void); // set notch parameter on flrig extern int notch_frequency; extern void notch_on(int); extern void notch_off(); // Set IO port extern void enable_kiss(void); extern void enable_arq(void); // PSM Configuration. extern void psm_set_defaults(void); extern void update_csma_io_config(int which); // thread terminators extern void ADIF_RW_close(void); extern void EQSL_close(void); // notifier dialogs extern Fl_Double_Window *notify_window; extern Fl_Double_Window *dxcc_window; extern void cb_mnuCheckUpdate(Fl_Widget *, void *); bool ask_dir_creation( const std::string & dir ); extern void set_CSV(int how); extern void set_freq_control_lsd(); extern void set_smeter_colors(); extern void log_callback(Fl_Widget *); extern void set599(); // thor images extern void thor_showTxViewer(char C = 'S'); extern Fl_Double_Window *thorpicRxWin; extern Fl_Double_Window *thorpicTxWin; extern int thor_load_avatar(std::string image_fname = "", int W=59, int H=74); extern void thor_clear_avatar(); extern void thor_update_avatar(unsigned char data, int pos); extern int thor_get_avatar_pixel(int pos, int color); extern void cb_thor_send_avatar( Fl_Widget *w, void *); extern picture *thor_avatar; extern void thor_load_scaled_image(std::string fname, bool gray = false); extern void thor_load_raw_video(); // field day extern Fl_Input2 *inpClass; extern Fl_Input2 *inpSection; extern Fl_Input2 *inp_FD_class1; extern Fl_Input2 *inp_FD_section1; extern Fl_Input2 *inp_FD_class2; extern Fl_Input2 *inp_FD_section2; // CQWW DX extern Fl_Input2 *inp_CQDX_RSTin2; extern Fl_Input2 *inp_CQDX_RSTout2; extern Fl_ComboBox *cboCountryCQDX2; extern Fl_Input2 *inp_CQDXzone1; extern Fl_Input2 *inp_CQDXzone2; // CQWW RTTY extern Fl_Input2 *inp_CQzone; extern Fl_Input2 *inp_CQzone1; extern Fl_Input2 *inp_CQzone2; extern Fl_Input2 *inp_CQstate; extern Fl_Input2 *inp_CQstate1; extern Fl_Input2 *inp_CQstate2; extern Fl_ComboBox *cboCountryCQ2; extern Fl_Input2 *inp_CQ_RSTin2; extern Fl_Input2 *inp_CQ_RSTout2; // CW Sweepstakes extern Fl_Input2 *inp_SS_SerialNoR; extern Fl_Input2 *inp_SS_Precedence; extern Fl_Input2 *inp_SS_Check; extern Fl_Input2 *inp_SS_Section; // LOG_ARR extern Fl_Input2 *inp_ARR_check; extern Fl_Input2 *inp_ARR_check1; extern Fl_Input2 *inp_ARR_check2; extern Fl_Input2 *inp_ARR_XchgIn1; extern Fl_Input2 *inp_ARR_XchgIn2; extern Fl_Input2 *inp_ARR_Name2; // LOG_KD extern Fl_Input2 *inp_KD_age; extern Fl_Input2 *inp_KD_XchgIn1; extern Fl_Input2 *inp_KD_XchgIn2; extern Fl_Input2 *inp_KD_state1; extern Fl_Input2 *inp_KD_state2; extern Fl_Input2 *inp_KD_VEprov1; extern Fl_Input2 *inp_KD_VEprov2; // LOG_1010 extern Fl_Input2 *inp_1010_nr; extern Fl_Input2 *inp_1010_name2; extern Fl_Input2 *inp_1010_XchgIn1; extern Fl_Input2 *inp_1010_XchgIn2; // LOG_ASCR extern Fl_Input2 *inp_ASCR_class1; extern Fl_Input2 *inp_ASCR_XchgIn1; extern Fl_Input2 *inp_ASCR_name2; extern Fl_Input2 *inp_ASCR_class2; extern Fl_Input2 *inp_ASCR_XchgIn2; extern Fl_Input2 *inp_ASCR_RSTin2; extern Fl_Input2 *inp_ASCR_RSTout2; // LOG_NAQP extern Fl_Input2 *inpSPCnum; extern Fl_Input2 *inpSPCnum_NAQP1; extern Fl_Input2 *inpSPCnum_NAQP2; extern Fl_Input2 *inpNAQPname2; // LOG_RTTY extern Fl_Input2 *inpRTU_stpr1; extern Fl_Input2 *inpRTU_stpr2; extern Fl_ComboBox *cboCountryRTU2; extern Fl_Input2 *inpRTU_RSTin2; extern Fl_Input2 *inpRTU_RSTout2; extern Fl_Input2 *inpRTU_serno1; extern Fl_Input2 *inpRTU_serno2; // LOG_JOTA extern Fl_Input2 *inpRstIn4; extern Fl_Input2 *inpRstOut4; extern Fl_Input2 *inp_JOTA_scout; extern Fl_Input2 *inp_JOTA_scout1; extern Fl_Input2 *inp_JOTA_scout2; extern Fl_Input2 *inp_JOTA_troop; extern Fl_Input2 *inp_JOTA_troop1; extern Fl_Input2 *inp_JOTA_troop2; extern Fl_Input2 *inp_JOTA_spc; extern Fl_Input2 *inp_JOTA_spc1; extern Fl_Input2 *inp_JOTA_spc2; // LOG_AICW extern Fl_Input2 *inpSPCnum_AICW1; extern Fl_Input2 *inpSPCnum_AICW2; extern Fl_Input2 *inpRstIn_AICW2; extern Fl_Input2 *inpRstOut_AICW2; extern Fl_ComboBox *cboCountryAICW2; //LOG_AIDX extern Fl_ComboBox *cboCountryAIDX; extern Fl_ComboBox *cboCountryAIDX2; // LOG_IARI - Italian International DX extern Fl_Input2 *inp_IARI_PR1; extern Fl_Input2 *inp_IARI_RSTin2; extern Fl_Input2 *inp_IARI_RSTout2; extern Fl_Input2 *out_IARI_SerNo1; extern Fl_Input2 *inp_IARI_SerNo1; extern Fl_Input2 *out_IARI_SerNo2; extern Fl_Input2 *inp_IARI_SerNo2; extern Fl_Input2 *inp_IARI_PR2; extern Fl_ComboBox *cboCountryIARI2; // LOG_WPX extern Fl_Input2 *inpSerNo_WPX1; extern Fl_Input2 *inpSerNo_WPX2; extern Fl_Input2 *outSerNo_WPX1; extern Fl_Input2 *outSerNo_WPX2; extern Fl_Input2 *inpRstIn_WPX2; extern Fl_Input2 *inpRstOut_WPX2; // LOG_SQSO extern Fl_Input2 *inpSQSO_state1; extern Fl_Input2 *inpSQSO_state2; extern Fl_Input2 *inpSQSO_county1; extern Fl_Input2 *inpSQSO_county2; extern Fl_Input2 *inpSQSO_serno1; extern Fl_Input2 *inpSQSO_serno2; extern Fl_Input2 *inpSQSO_name2; extern Fl_Input2 *outSQSO_serno1; extern Fl_Input2 *outSQSO_serno2; extern Fl_Input2 *inpRstIn_SQSO2; extern Fl_Input2 *inpRstOut_SQSO2; extern Fl_Input2 *inpSQSO_category; extern Fl_Input2 *inpSQSO_category1; extern Fl_Input2 *inpSQSO_category2; extern Fl_Double_Window *dxcluster_viewer; // TOD clock extern void TOD_init(); extern void TOD_close(); extern void start_deadman(); extern void stop_deadman(); extern void disable_deadman(); //====================================================================== //FeldHell resizable Rx character height //====================================================================== extern void FHdisp_char_height(); #endif fldigi-4.1.06/src/include/dsp.h0000664000175000017500000011453513507755043013156 00000000000000/* * dsp.h -- various DSP algorithms * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2019 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #include #include #include // ---------------------------------------------------------------------------- // double/other-complex type template struct Cdspcmpx { type re,im; }; typedef Cdspcmpx dspCmpx; // Some complex operators template inline void operator +=(Cdspcmpx &Dst, Cdspcmpx &Src) { Dst.re += Src.re; Dst.im += Src.im; } template inline void operator -=(Cdspcmpx &Dst, Cdspcmpx &Src) { Dst.re -= Src.re; Dst.im -= Src.im; } template inline void operator *=(Cdspcmpx &Dst, num Src) { Dst.re *= Src; Dst.im *= Src; } template inline void operator /=(Cdspcmpx &Dst, num Src) { Dst.re /= Src; Dst.im /= Src; } // scalar product of two vectors template inline double dspScalProd(Cdspcmpx &A, Cdspcmpx &B) { return A.re * B.re + A.im * B.im; } template inline double dspScalProd(typeA Ia, typeA Qa, Cdspcmpx &B) { return Ia * B.re + Qa * B.im; } // complex multiply template inline void CdspcmpxMultAxB(Cdspcmpx &Dst, Cdspcmpx &A, Cdspcmpx &B) { Dst.re = A.re * B.re - A.im * B.im; Dst.im = A.re * B.im + A.im * B.re; } template inline void CdspcmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cdspcmpx &A, Cdspcmpx &B) { DstI = A.re * B.re - A.im * B.im; DstQ = A.re * B.im + A.im * B.re; } // complex multiply, second argument with a "star" (B.im is negated) template inline void CdspcmpxMultAxBs(Cdspcmpx &Dst, Cdspcmpx &A, Cdspcmpx &B) { Dst.re = A.re * B.re + A.im * B.im; Dst.im = A.im * B.re - A.re * B.im; } // ---------------------------------------------------------------------------- // signed 16-bit format (standard 16-bit audio) typedef short dspS16; // ---------------------------------------------------------------------------- template inline int dspRedspAllocArray(type **Array, int Size) { delete [] *Array; *Array = new type[Size]; return (*Array == 0); } template inline int dspAllocArray(type **Array, int Size) { *Array = new type[Size]; return (*Array == 0); } template inline void dspClearArray(type *Array, int Size) { memset(Array, 0, Size*sizeof(type)); } template inline void dspCopyArray(type *Dst, type *Src, int Size) { memcpy(Dst, Src, Size*sizeof(type)); } template inline void dspMoveArray(type *Dst, type *Src, int Size) { memmove(Dst, Src, Size*sizeof(type)); } template int dspAllocArray2D(type ***Array, int Size1, int Size2) { int i; (*Array) = new type *[Size1 * (sizeof(type *))]; if ((*Array) == NULL) return 1; for (i = 0; i < Size1; i++) (*Array)[i] = NULL; for (i = 0; i < Size1; i++) { (*Array)[i] = new type [Size2 * sizeof(type)]; if ((*Array)[i] == NULL) goto Error; } return 0; Error: for (i = 0; i < Size1; i++) delete [] (*Array)[i]; delete [] *Array; return 1; } template void dspFreeArray2D(type **Array, int Size1) { if (Array == 0) return; int i; for (i = 0; i < Size1; i++) delete [] (Array)[i]; delete [] Array; } template void dspClearArray2D(type **Array, int Size1, int Size2) { int i; for (i = 0; i < Size1; i++) memset(Array[i], 0, Size2 * sizeof(type)); } // ---------------------------------------------------------------------------- // processing buffers: template class dspSeq { public: dspSeq(); ~dspSeq(); int EnsureSpace(int ReqSpace); // make sure that there is enough space void Free(void); // free space to save RAM when buffer is not in use int Space; // that much is allocated in *Data int Len; // that much is filled up type *Data; // contains Len elements }; template dspSeq::dspSeq() { Data = NULL; Len = Space = 0; } template dspSeq::~dspSeq() { free(Data); } template int dspSeq::EnsureSpace(int ReqSpace) { if (ReqSpace <= Space) return 0; Data = new type[ReqSpace * sizeof(type)]; if (Data == NULL) { Space = Len = 0; return -1; } Space = ReqSpace; return 0; } template void dspSeq::Free(void) { delete [] Data; Data = NULL; Space = Len = 0; } typedef dspSeq float_buff; typedef dspSeq double_buff; typedef dspSeq dspCmpx_buff; typedef dspSeq dspCmpx_buff; // typedef dspSeq int16_buff; <- this doesn't work - why ?! typedef dspSeq dspS16_buff; typedef dspSeq char_buff; // ---------------------------------------------------------------------------- // First-In First-Out pipes template class dspFIFO { public: dspFIFO(); ~dspFIFO(); int Preset(int Max); void Free(void); void Clear(void); int Inp(type Elem); int Out(type &Elem); int InpReady(void); int OutReady(void); private: type *Buff; int Size; int Rd,Wr; }; template dspFIFO::dspFIFO() { Buff = NULL; } template dspFIFO::~dspFIFO() { free(Buff); } template void dspFIFO::Free(void) { delete [] Buff; Buff = NULL; } template int dspFIFO::Preset(int Max) { Size = Max + 1; if (dspRedspAllocArray(&Buff, Size)) return -1; Rd = 0; Wr = 0; return 0; } template void dspFIFO::Clear(void) { Rd = Wr; } template int dspFIFO::Inp(type Elem) { int w = Wr; Buff[w] = Elem; w += 1; if (w >= Size) w=0; if (w == Rd) return -1; Wr = w; return 0; } template int dspFIFO::Out(type &Elem) { if (Rd == Wr) return -1; Elem = Buff[Rd]; Rd += 1; if (Rd >= Size) Rd = 0; return 0; } template int dspFIFO::OutReady(void) { return (Wr >= Rd) ? Wr - Rd : Wr -Rd + Size; } template int dspFIFO::InpReady(void) { return (Rd > Wr) ? Rd - Wr - 1 : Rd - Wr + Size - 1; } typedef dspFIFO char_dspFIFO; // ---------------------------------------------------------------------------- // dspPower of single and complex values and dspSequences of these inline double dspPower(double X) { return X * X; } inline double dspPower(double I, double Q) { return I * I + Q * Q; } inline double dspPower(dspCmpx X) { return X.re * X.re + X.im * X.im; } double dspPower(double *X, int Len); double dspPower(double *I, double *Q, int Len); double dspPower(dspCmpx *X, int Len); inline double dspPower(double_buff *buff) { return dspPower(buff->Data, buff->Len); } inline double dspPower(dspCmpx_buff *buff) { return dspPower(buff->Data, buff->Len); } // dspAmplitude calculations inline double dspAmpl(double I, double Q) { return sqrt(I * I + Q * Q); } inline double dspAmpl(dspCmpx X) { return sqrt(X.re * X.re + X.im * X.im); } // dspPhase calculation (output = <-PI..PI) ) inline double dspPhase(double I, double Q) { return atan2(Q,I); } inline double dspPhase(dspCmpx X) { return atan2(X.im, X.re); } // dspPhase normalization inline double dspPhaseNorm(double dspPhase) { if (dspPhase >= M_PI) return dspPhase - 2 * M_PI; if (dspPhase < (-M_PI)) return dspPhase + 2 * M_PI; return dspPhase; } // ---------------------------------------------------------------------------- // min./max. of integers inline int dspIntmin(int i1, int i2) { return i1 < i2 ? i1 : i2; } inline int dspIntmax(int i1, int i2) { return i1 > i2 ? i1 : i2; } inline int dspIntmin(int i1, int i2, int i3) { return i1 < i2 ? (i1 < i3 ? i1 : i3) : (i2 < i3 ? i2 : i3); } inline int dspIntmax(int i1, int i2, int i3) { return i1 > i2 ? (i1 > i3 ? i1 : i3) : (i2 > i3 ? i2 : i3); } // ---------------------------------------------------------------------------- // Extreme search, dspAverage, fitting double dspAverage(double *Data, int Len); int dspCountInRange(double *Data, int Len, double Low, double Upp); inline int dspCountInRange(double_buff *Input, double Low, double Upp) { return dspCountInRange(Input->Data, Input->Len, Low, Upp); } inline double dspRMS(double *Data, int Len) { return sqrt(dspPower(Data, Len) / Len); } inline double dspRMS(dspCmpx *Data, int Len) { return sqrt(dspPower(Data, Len) / Len); } inline double dspRMS(double_buff *Input) { return dspRMS(Input->Data, Input->Len); } inline double dspRMS(dspCmpx_buff *Input) { return dspRMS(Input->Data, Input->Len); } template type dspFindMin(type *Data, int Len) { type Min; int i; Min = Data[0]; for (i = 1; i < Len; i++) if(Data[i] < Min) Min = Data[i]; return Min; } template type dspFindMin(type *Data, int Len, int &MinPos) { type Min; int i, pos; Min = Data[0]; pos=0; for (i = 1; i < Len; i++) if (Data[i] < Min) { Min = Data[i]; pos = i; } MinPos = pos; return Min; } template type dspFindMax(type *Data, int Len) { type Max; int i; Max = Data[0]; for (i = 1; i < Len; i++) if (Data[i] > Max) Max = Data[i]; return Max; } template type dspFindMax(type *Data, int Len, int &MaxPos) { type Max; int i, pos; Max = Data[0]; pos = 0; for (i = 1; i < Len; i++) if (Data[i] > Max) { Max = Data[i]; pos = i; } MaxPos = pos; return Max; } double dspFindMaxdspPower(dspCmpx *Data, int Len); double dspFindMaxdspPower(dspCmpx *Data, int Len, int &MaxPos); double dspFitPoly1(double *Data, int Len, double &A, double &B); double dspFitPoly2(double *Data, int Len, double &A, double &B, double &C); void dspFitPoly2(double Data[3], double &A, double &B, double &C); // ---------------------------------------------------------------------------- // "selective" dspAverage fit template int dspSelFitAver( type *Data, int Len, double SelThres, int Loops, double &Aver, double &dspRMS, int &Sel) { int i, loop, Incl;//, prev; double Sum, ErrSum, Lev, dLev, Diff, Thres; for (ErrSum = Sum = 0.0, i = 0; i < Len; i++) { Sum += Data[i]; ErrSum += dspPower(Data[i]); } Lev = Sum/Len; ErrSum /= Len; ErrSum -= Lev*Lev; // printf("Len=%d, Lev=%+7.4f, ErrSum=%7.4f, dspRMS=%7.4f\n", // Len,Lev,ErrSum,sqrt(ErrSum)); // prev = Len; Incl = 0; for (loop = 0; loop < Loops; loop++) { Thres = SelThres * SelThres * ErrSum; for (ErrSum = Sum = 0.0, Incl = 0, i = 0; i < Len; i++) { Diff = dspPower(Data[i]-Lev); if (Diff <= Thres) { Sum += Data[i]; ErrSum += Diff; Incl += 1; } // else printf(" %d",i); } Sum /= Incl; dLev = Sum - Lev; ErrSum /= Incl; ErrSum -= dLev * dLev; Lev += dLev; ErrSum = fabs(ErrSum); // printf("\nLoop #%d, Lev=%+7.4f, dLev=%+7.4f, ErrSum=%7.4f, dspRMS=%7.4f, Incl=%d\n", // loop,Lev,dLev,ErrSum,sqrt(ErrSum),Incl); // if(Incl==prev) { loop++; break; } // prev=Incl; } Aver = Lev; dspRMS = sqrt(ErrSum); Sel=Incl; return loop; } template int dspSelFitAver( Cdspcmpx *Data, int Len, double SelThres, int Loops, Cdspcmpx &Aver, double &dspRMS, int &Sel) { int i, loop, Incl;//, prev; dspCmpx Sum, Lev, dLev; double ErrSum, Diff, Thres; for (ErrSum = 0.0, Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Data[i].re; Sum.im += Data[i].im; ErrSum += dspPower(Data[i]); } Lev.re = Sum.re / Len; Lev.im = Sum.im / Len; ErrSum /= Len; ErrSum -= dspPower(Lev); // printf("Len=%d, Lev=[%+7.4f,%+7.4f], ErrSum=%7.4f, dspRMS=%7.4f\n", // Len,Lev.re,Lev.im,ErrSum,sqrt(ErrSum)); Incl = 0; // prev = Len; for (loop = 0; loop < Loops; loop++) { Thres = 0.5 * SelThres * SelThres * ErrSum; for (ErrSum = 0.0, Sum.re = Sum.im = 0.0, Incl = 0, i = 0; i < Len; i++) { Diff = dspPower(Data[i].re - Lev.re, Data[i].im - Lev.im); if (Diff <= Thres) { Sum.re += Data[i].re; Sum.im += Data[i].im; ErrSum += Diff; Incl += 1; } // else printf(" %d",i); } Sum.re /= Incl; Sum.im /= Incl; dLev.re = Sum.re - Lev.re; dLev.im = Sum.im - Lev.im; ErrSum /= Incl; ErrSum -= dspPower(dLev); ErrSum = fabs(ErrSum); Lev.re += dLev.re; Lev.im += dLev.im; // printf("\nLoop #%d, Lev=[%+6.3f,%+6.3f], dLev=[%+6.3f,%+6.3f], ErrSum=%7.4f, dspRMS=%7.4f, Incl=%d\n", // loop, Lev.re,Lev.im, dLev.re,dLev.im, ErrSum,sqrt(ErrSum), Incl); // if(Incl==prev) { loop++; break; } // prev=Incl; } Aver = Lev; dspRMS = sqrt(ErrSum); Sel = Incl; return loop; } // ---------------------------------------------------------------------------- // white noise generator template void dspWhiteNoise(type &X) { double Rand, dspPower, dspPhase; Rand = ((double)rand() + 1.0) / ((double)RAND_MAX + 1.0); dspPower = sqrt(-2*log(Rand)); Rand = (double)rand() / (double)RAND_MAX; dspPhase = 2 * M_PI * Rand; X = dspPower * cos(dspPhase); } template void CdspcmpxdspWhiteNoise(Cdspcmpx &X) { double Rand, dspPower, dspPhase; Rand = ((double)rand() + 1.0) / ((double)RAND_MAX + 1.0); dspPower = sqrt(-log(Rand)); Rand = (double)rand() / (double)RAND_MAX; dspPhase = 2 * M_PI* Rand; X.re = dspPower * cos(dspPhase); X.im = dspPower * sin(dspPhase); } // ---------------------------------------------------------------------------- // various window shapes (for the FFT and FIR filters) // these functions are supposed to be called with the argument "dspPhase" // between -PI and +PI. Most (or even all) will return zero for input // euqal -PI or +PI. double dspWindowHanning(double dspPhase); double WindowBlackman2(double dspPhase); // from Freq 5.1 FFT analyzer double dspWindowBlackman3(double dspPhase); // from the Motorola BBS // ---------------------------------------------------------------------------- // FIR shape calculation for a flat response from FreqLow to FreqUpp void dspWinFirI( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift = 0.0); void WinFirQ( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift = 0.0); // ---------------------------------------------------------------------------- // convert 16-bit signed or 8-bit unsigned into doubles void dspConvS16todouble(dspS16 *dspS16, double *dbl, int Len, double Gain = 1.0 / 32768.0); int dspConvS16todouble(dspS16 *dspS16, double_buff *dbl, int Len, double Gain = 1.0 / 32768.0); void dspConvdoubleTodspS16(double *dbl, dspS16 *dspS16, int Len, double Gain = 32768.0); inline int dspConvdoubleTodspS16(double_buff *dbl, dspS16_buff *dspS16, double Gain = 32768.0) { int err = dspS16->EnsureSpace(dbl->Len); if (err) return -1; dspConvdoubleTodspS16(dbl->Data, dspS16->Data, dbl->Len, Gain); dspS16->Len = dbl->Len; return 0; } void dspConvU8todouble(unsigned char *U8, double *dbl, int Len, double Gain = 1.0 / 128.0); int dspConvU8todouble(unsigned char *U8, double_buff *dbl, int Len, double Gain = 1.0 / 128.0); // ---------------------------------------------------------------------------- // other converts void dspConvCmpxTodspPower(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspPower(dspCmpx_buff *Input, double_buff *Output); void dspConvCmpxTodspAmpl(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspAmpl(dspCmpx_buff *Input, double_buff *Output); void dspConvCmpxTodspPhase(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspPhase(dspCmpx_buff *Input, double_buff *Output); // ---------------------------------------------------------------------------- // Pulse noise limiter class dspPulseLimiter { public: dspPulseLimiter(); ~dspPulseLimiter(); void Free(void); int Preset(int TapLen, double Limit=4.0); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); double_buff Output; double dspRMS; private: int Len; double Thres; double *Tap; int Ptr; double PwrSum; }; // ---------------------------------------------------------------------------- // Signal level monitor class dspLevelMonitor { public: dspLevelMonitor(); ~dspLevelMonitor(); int Preset(double Integ, double Range = 0.75); int Process(double *Inp, int Len); int Process(double_buff *Input); double dspRMS; double OutOfRange; private: double PwrMid,PwrOut; double OutOfRangeMid; double MaxSqr; double W1, W2, W5; }; // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer class dspMixerAutoLevel { public: dspMixerAutoLevel(); // ~dspMixerAutoLevel(); int Process(double *Inp, int InpLen); int Process(double_buff *Inp) { return Process(Inp->Data, Inp->Len); } public: int IntegLen; // mean dspPower integration time [samples] double MinMS; // minimum acceptable dspAverage dspPower double MaxMS; // maximum acceptable dspAverage dspPower int PeakHold; // level holding time after a peak [samples] int MinHold; // minimal time between changing the mixer level [samples] int AdjStep; // mixer level adjusting step int MinLevel; // mimimum allowed mixer level int MaxLevel; // maximum allowed mixer level double AvedspRMS; // dspAverage dspPower of the input signal int Hold; // time counter for holding levels int Level; // actual mixer level }; // ---------------------------------------------------------------------------- // Two-element IIR low pass filter struct dspLowPass2elem { double Mid, Out; }; struct dspLowPass2weight { double W1, W2, W5; }; // first calculate the coefficiants W1,W2 and W5 for given integration time template inline void dspLowPass2Coeff(typeLen IntegLen, typeW &W1, typeW &W2, typeW &W5) { W1 = 1.0 / IntegLen; W2 = 2.0 / IntegLen; W5 = 5.0 / IntegLen; } template inline void dspLowPass2Coeff(typeLen IntegLen, dspLowPass2weight &Weight) { Weight.W1 = 1.0 / IntegLen; Weight.W2 = 2.0 / IntegLen; Weight.W5 = 5.0 / IntegLen; } // then you can process samples template inline void dspLowPass2( typeInp Inp, typeOut &Mid, typeOut &Out, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum = Mid + Out; Diff = Mid-Out; Mid += W2 * Inp - W1 * Sum; Out += W5 * Diff; } template inline void dspLowPass2( typeInp Inp, dspLowPass2elem &Elem, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum = Elem.Mid + Elem.Out; Diff = Elem.Mid - Elem.Out; Elem.Mid += W2 * Inp - W1 * Sum; Elem.Out += W5 * Diff; } template inline void dspLowPass2( typeInp Inp, dspLowPass2elem &Elem, dspLowPass2weight &Weight) { double Sum, Diff; Sum = Elem.Mid + Elem.Out; Diff = Elem.Mid - Elem.Out; Elem.Mid += Weight.W2 * Inp - Weight.W1 * Sum; Elem.Out += Weight.W5 * Diff; } void dspLowPass2( dspCmpx *Inp, dspCmpx *Mid, dspCmpx *Out, double W1, double W2, double W5); // ---------------------------------------------------------------------------- // periodic low pass class dspPeriodLowPass2 { public: dspPeriodLowPass2(); ~dspPeriodLowPass2(); void Free(void); int Preset(int Period, double IntegLen); int Process(double Inp, double &Out); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); double_buff Output; private: int Len; double *TapMid,*TapOut; int TapPtr; double W1,W2,W5; }; // ---------------------------------------------------------------------------- // a simple dspDelay template class dspDelay { public: dspDelay(); ~dspDelay(); void Free(void); int Preset(int len); void Process(type *Inp, int InpLen, type *Out); int Process(dspSeq *Input); dspSeq Output; private: int Len; type *Tap; int TapPtr; }; template dspDelay::dspDelay() { Tap = NULL; } template dspDelay::~dspDelay() { delete [] Tap; } template void dspDelay::Free(void) { delete [] Tap; Tap = NULL; } template int dspDelay::Preset(int dspDelayLen) { Len = dspDelayLen; if (dspRedspAllocArray(&Tap,Len)) return -1; dspClearArray(Tap,Len); TapPtr = 0; return 0; } template void dspDelay::Process(type *Inp, int InpLen, type *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen - i, Len - TapPtr), i += batch; batch; batch--) { (*Out++) = Tap[TapPtr]; Tap[TapPtr++] = (*Inp++); } if (TapPtr >= Len) TapPtr = 0; } } template int dspDelay::Process(dspSeq *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // dspDelayLine, like dspDelay but more flexible // The idea is that we hold addressable history of at least MaxdspDelay // samples. // After each input batch is processed, the InpPtr points to the first sample // of this batch and we can address samples backwards upto MaxdspDelay. // For more optimal performace we allocate more RAM than just for MaxdspDelay. // Infact the allocated size (MaxSize) should be at least // MaxdspDelay plus the largest expected input length. template class dspDelayLine { public: dspDelayLine(); ~dspDelayLine(); void Free(void); int Preset(int MaxdspDelay, int MaxSize = 0); int Process(type *Inp, int Len); int Process(dspSeq *Input); type *Line; // line storage int dspDelay; // how many (at least) backward samples are stored int LineSize; // allocated size int DataLen; // length of the valid data type *InpPtr; // first sample for the most recent processed batch int InpLen; // number of samples for the most recent input }; template dspDelayLine::dspDelayLine() { Line = NULL; } template dspDelayLine::~dspDelayLine() { delete [] Line; } template void dspDelayLine::Free(void) { delete [] Line; Line = NULL; } template int dspDelayLine::Preset(int MaxdspDelay, int MaxSize) { LineSize = MaxSize; if (LineSize < (2 * MaxdspDelay)) LineSize = 2 * MaxdspDelay; DataLen = MaxdspDelay; dspDelay = MaxdspDelay; if (dspRedspAllocArray(&Line, LineSize)) return -1; dspClearArray(Line, LineSize); InpPtr = Line + DataLen; InpLen = 0; return 0; } template int dspDelayLine::Process(type *Inp, int Len) { if ((DataLen + Len) > LineSize) { dspMoveArray(Line, Line + DataLen - dspDelay, dspDelay); DataLen = dspDelay; } if ((DataLen + Len) > LineSize) return -1; dspCopyArray(Line + DataLen, Inp, Len); InpPtr = Line + DataLen; InpLen = Len; DataLen += Len; return 0; } template int dspDelayLine::Process(dspSeq *Input) { return Process(Input->Data, Input->Len); } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but CPU complexity very low // and independent on the integration time class dspBoxFilter { public: dspBoxFilter(); ~dspBoxFilter(); void Free(void); int Preset(int BoxLen); int Process(double Inp, double &Out); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); void Recalibrate(); double_buff Output; private: int Len; double *Tap; int TapPtr; double Sum; }; class dspCmpxBoxFilter { public: dspCmpxBoxFilter(); ~dspCmpxBoxFilter(); void Free(void); int Preset(int BoxLen); int Process(dspCmpx *Inp, int InpLen, dspCmpx *Out); void Recalibrate(); int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; dspCmpx *Tap; int TapPtr; dspCmpx Sum; }; // ---------------------------------------------------------------------------- // FIR filter with a given shape class dspFirFilter { public: dspFirFilter(); ~dspFirFilter(); void Free(void); int Preset(int FilterLen, double *FilterShape = (double*)NULL); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); // Response(double Freq, double *Resp); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); // UseExternShape(double *shape); double_buff Output; private: int Len; // Tap/Shape length double *Shape; // Response shape int ExternShape; // that we are using an externally provided shape double *Tap; int TapPtr; }; // ---------------------------------------------------------------------------- // a pair of FIR filters. quadrature split, decimate // the decimation rate must be integer class dspQuadrSplit { public: dspQuadrSplit(); ~dspQuadrSplit(); void Free(void); int Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); // int Process(double *Inp, int InpLen, // double *OutI, double *OutQ, int MaxOutLen, int *OutLen); // int Process(double *Inp, int InpLen, // dspCmpx *Out, int MaxOutLen, int *OutLen); int Process(double_buff *Input); dspCmpx_buff Output; private: int Len; double_buff Tap; double *ShapeI, *ShapeQ; int ExternShape; int Rate; }; // ---------------------------------------------------------------------------- // reverse of dspQuadrSplit: interpolates and combines the I/Q // back into 'real' signal. class dspQuadrComb { public: dspQuadrComb(); ~dspQuadrComb(); void Free(void); int Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); int Process(dspCmpx_buff *Input); double_buff Output; private: int Len; double *Tap; int TapPtr; double *ShapeI, *ShapeQ; int ExternShape; int Rate; }; // ---------------------------------------------------------------------------- // complex mix with an oscilator (carrier) // here we could avoid computing sine/cos at every sample class dspCmpxMixer { public: dspCmpxMixer(); // ~dspCmpxMixer(); void Free(void); int Preset(double CarrierOmega); int ProcessFast( double *InpI, double *InpQ, int InpLen, double *OutI, double *OutQ); int Process(dspCmpx *Inp, int InpLen, dspCmpx *Out); int ProcessFast(dspCmpx *Inp, int InpLen, dspCmpx *Out); int Process(dspCmpx_buff *Input); int ProcessFast(dspCmpx_buff *Input); dspCmpx_buff Output; public: double dspPhase, Omega; }; // ---------------------------------------------------------------------------- // FM demodulator (dspPhase rotation speed-meter) class dspFMdemod { public: dspFMdemod(); // ~dspFMdemod(); int Preset(double CenterOmega); int Process(double *InpI, double *InpQ, int InpLen, double *Out); int Process(dspCmpx *Inp, int InpLen, double *Out); int Process(dspCmpx_buff *Input); double_buff Output; private: double PrevdspPhase; public: double RefOmega; }; // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. class dspRateConvLin { public: dspRateConvLin(); // ~dspRateConvLin(); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double_buff *InpBuff); double_buff Output; private: double OutStep, OutdspPhase; double PrevSample; }; // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 class dspRateConvQuadr { public: dspRateConvQuadr(); // ~dspRateConvQuadr(); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double *Inp, int InpLen, double *Out, int MaxOutLen, int *OutLen); int Process(double_buff *InpBuff); double_buff Output; private: double OutStep, OutdspPhase; double Tap[4]; int TapPtr; }; // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters class dspRateConvBL { public: dspRateConvBL(); ~dspRateConvBL(); void Free(void); int Preset(int FilterLen, double *FilterShape[], int FilterShapeNum); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double_buff *Input); int ProcessLinI(double_buff *Input); double_buff Output; private: double OutStep, OutdspPhase; int Len; double *Tap; int TapSize; double **Shape; int ShapeNum; int ExternShape; }; // ---------------------------------------------------------------------------- // Sliding window (for FFT input) class dspCmpxSlideWindow { public: dspCmpxSlideWindow(); ~dspCmpxSlideWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, double *WindowShape=(double*)NULL); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; // Window length dspCmpx *Buff; // storage int Dist; // distance between slides int Ptr; // data pointer in Buff double *Window; // window shape int ExternWindow; }; // ---------------------------------------------------------------------------- // Overlapping window (for IFFT output) class dspCmpxOverlapWindow { public: dspCmpxOverlapWindow(); ~dspCmpxOverlapWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, double *WindowShape=(double*)NULL); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); void Process(dspCmpx *Inp, dspCmpx *Out); int ProcessSilence(int Slides=1); int Process(dspCmpx_buff *Input); int Process(dspCmpx *Input); // int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; // Window length dspCmpx *Buff; // storage int Dist; // distance between slides double *Window; // window shape int ExternWindow; }; // ---------------------------------------------------------------------------- // FFT dspPhase corrector class dspFFT_TimeShift { public: dspFFT_TimeShift(); ~dspFFT_TimeShift(); void Free(void); int Preset(int FFTlen, int Backwards=0); int Process(dspCmpx *Data, int Time); private: int Len; // FFT length int LenMask; // length-1 for pointer wrapping dspCmpx *FreqTable; // sin/cos table int dspPhase; }; // ---------------------------------------------------------------------------- // bit synchronizer, the bit rate is the input rate divided by four class dspDiffBitSync4 { public: dspDiffBitSync4(int IntegBits);\ ~dspDiffBitSync4(); void Free(void); int Process(double *Inp, int InpLen, double *BitOut, double *IbitOut, int MaxOutLen, int *OutLen); double GetSyncDriftRate(); // get aver. sync. drift double GetSyncConfid(); private: // eg. 0.01 means 1 bit drift per 100 bits double *InpTap; int InpTapLen, InpTapPtr; // buffer tap, length and pointer int IntegLen; // integrate tdspIntming over that many bits double W1,W2,W5; // weights for the two-stage IIR lopass filter double DiffInteg0[4], DiffInteg[4]; // signal diff. integrators int DiffTapPtr; // integrator and bit-sdspAmpling pointer int BitPtr; double SyncdspPhase; // sync. pointer/dspPhase double SyncDrift0,SyncDrift; // low pass filter for the sync. drift rate double SyncConfid; }; // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter class dspBitSlicer { public: dspBitSlicer(int IntegBits); ~dspBitSlicer(); int Process(double *Bits, double *IBits, int InpLen, double *OutBits); double GetSigToNoise(); double GetdspAmplAsym(); double GetTimeAsym(); private: int IntegLen,TapLen; double W1,W2,W5; double Sum0[2], Sum[2]; double SumSq0[2], SumSq[2]; double TimeAsym0, TimeAsym; double dspAmplAsym0, dspAmplAsym; double Noise[2]; double OptimThres; double *Tap; int TapPtr; double PrevBit, PrevIBit; }; // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. class dspHDLCdecoder { public: dspHDLCdecoder(int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)); ~dspHDLCdecoder(); int Process(double *Inp, int InpLen); public: int AllFrameCount; int BadFrameCount; private: int MinLen,MaxLen; int RxDiff,RxInvert; int ChanId; int (*FrameHandler)(int ChanId, char *Frame, int Len); char *Buff; int Len,PrevLev; unsigned int ShiftReg; int BitCount,Count1s; }; // ---------------------------------------------------------------------------- // AX.25 CRC short unsigned int dspAX25CRC(char *Data, int Len); // ---------------------------------------------------------------------------- // check if the given number (an integer) is a dspPower of 2 template int dspPowerOf2(type I) { int c; if (I <= 0) return 0; for (c = 0; I != 0; I >>= 1) c += I & 1; return c == 1; } // ---------------------------------------------------------------------------- // radix-2 FFT class dsp_r2FFT { public: // size must a dspPower of 2: 2,4,8,16,32,64,128,256,... dsp_r2FFT(); ~dsp_r2FFT(); void Free(void); // preset tables for given processing size int Preset(int size); // scramble/unscramble input void Scramble(dspCmpx x[]); // apply input window // separate the result of a two real channels FFT void SeparTwoReals(dspCmpx Buff[], dspCmpx Out0[], dspCmpx Out1[]); // join spectra of two real channels void JoinTwoReals(dspCmpx Inp0[], dspCmpx Inp1[], dspCmpx Buff[]); // core process: the classic tripple loop of butterflies void CoreProc(dspCmpx x[]); // complex FFT process in place, includes unscrambling inline void ProcInPlace(dspCmpx x[]) { Scramble(x); CoreProc(x); } // define the FFT window and input/output scales (NULL => rectangular window) public: int Size; // FFT size int *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling dspCmpx *Twiddle; // Twiddle factors (sine/cos values) private: // double *Window; // window shape (NULL => rectangular window // double WinInpScale, WinOutScale; // window scales on input/output private: // classic radix-2 butterflies inline void FFTbf(dspCmpx &x0, dspCmpx &x1, dspCmpx &W); // special 2-elem. FFT for the first pass inline void FFT2(dspCmpx &x0, dspCmpx &x1); // special 2-elem. FFT for the second pass inline void FFT4(dspCmpx &x0, dspCmpx &x1, dspCmpx &x2, dspCmpx &x3); }; // --------------------------------------------------------------------------- // Sliding window FFT for spectral analysis (e.g. SETI) // input: real-valued time-domain signal, // output: complex-valued Fourier Transform // // We use a little trick here to process two real-valued FFT // in one go using the complex FFT engine. // This cuts the CPU but makes the input->output dspDelay longer. class dspSlideWinFFT { public: dspSlideWinFFT(); ~dspSlideWinFFT(); void Free(); int Preset(int size, int step, double *window); int Preset(int size, int step, double (*NewWindow)(double dspPhase), double Scale=1.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(double_buff *Input); dsp_r2FFT FFT; // FFT engine dspCmpx_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; int Left; // distance between slides, samples left before the next slide int Slide; // even/odd slide private: double *SlideBuff; int SlidePtr; // sliding window buffer, pointer double *Window; int ExternWindow; // window shape dspCmpx *FFTbuff; // FFT buffer }; // --------------------------------------------------------------------------- // Overlapping window Inverse FFT to convert spectra into time-domain signal class dspOvlapWinIFFT { public: dspOvlapWinIFFT(); ~dspOvlapWinIFFT(); void Free(void); int Preset(int size, int step, double *window); int Preset(int size, int step, double (*NewWindow)(double dspPhase), double Scale=1.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(dspCmpx *Input); dsp_r2FFT FFT; // FFT engine double_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; // distance between slides int Slide; private: dspCmpx *Spectr[2]; dspCmpx *FFTbuff; // FFT buffer double *Window; int ExternWindow; // window shape double *OvlapBuff; int OvlapPtr; }; // --------------------------------------------------------------------------- // Sliding window FFT for spectral processing (e.g. de-noising) // input: real-valued signal // in the middle you are given a chance to process // the complex-valued Fourier Transform (SpectraProc() routine). // output: real-valued signal // If you don't touch the spectra in SpectralProc() // the output will be an exact copy (only dspDelayed) of the input. class dspSlideWinFFTproc { public: dspSlideWinFFTproc(); ~dspSlideWinFFTproc(); void Free(void); int Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double *window); int Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double (*NewWindow)(double dspPhase), double Scale=0.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=0.0); int Process(double_buff *Input); dsp_r2FFT FFT; double_buff Output; int Size; int SizeMask; int Dist; int Left; int Slide; private: double *SlideBuff; int SlidePtr; double *Window; int ExternWindow; dspCmpx *FFTbuff; dspCmpx *Spectr[2]; void (*SpectraProc)(dspCmpx *Spectra, int Len); double *OvlapBuff; int OvlapPtr; }; // --------------------------------------------------------------------------- // Walsh (Hadamard ?) transform. void dspWalshTrans(double *Data, int Len); void dspWalshInvTrans(double *Data, int Len); // --------------------------------------------------------------------------- fldigi-4.1.06/src/include/pskrep.h0000644000175000017500000000262413472115776013671 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PSKREP_H_ #define PSKREP_H_ bool pskrep_start(void); void pskrep_stop(); const char* pskrep_error(void); unsigned pskrep_count(void); // The regular expression that matches the spotter's buffer when it calls us. // It must define at least two capturing groups, the second of which is the // spotted callsign. #define CALLSIGN_RE "[[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+" #define PSKREP_RE "(de|cq|qrz)[^[:alnum:]/\n]+" "(" CALLSIGN_RE ")" " +(.* +)?\\2[^[:alnum:]]+$" #define PSKREP_RE_INDEX 2 #endif // PSKREP_H_ fldigi-4.1.06/src/include/lgbook.h0000664000175000017500000001507613511722452013636 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef lgbook_h #define lgbook_h #include #include "flinput2.h" // Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) #undef nitems #include #define FLTK_nitems nitems #undef nitems // ^^^ Avoid 'nitems' macro collision extern Fl_Check_Browser *chkExportBrowser; #include extern Fl_Double_Window *wExport; #include #include extern Fl_Check_Browser *chkExportBrowser; #include extern Fl_Button *btnClearAll; extern Fl_Button *btnCheckAll; #include "calendar.h" extern Fl_DateInput *inp_export_start_date; extern Fl_DateInput *inp_export_stop_date; #include extern Fl_Check_Button *btn_export_by_date; extern Fl_Check_Button *btnSelectCall; extern Fl_Check_Button *btnSelectName; extern Fl_Check_Button *btnSelectFreq; extern Fl_Check_Button *btnSelectBand; extern Fl_Check_Button *btnSelectMode; extern Fl_Check_Button *btnSelectQSOdateOn; extern Fl_Check_Button *btnSelectQSOdateOff; extern Fl_Check_Button *btnSelectTimeON; extern Fl_Check_Button *btnSelectTimeOFF; extern Fl_Check_Button *btnSelectTX_pwr; extern Fl_Check_Button *btnSelectRSTsent; extern Fl_Check_Button *btnSelectRSTrcvd; extern Fl_Check_Button *btnSelectQth; extern Fl_Check_Button *btnSelectLOC; extern Fl_Check_Button *btnSelectState; extern Fl_Check_Button *btnSelectAge; extern Fl_Check_Button *btnSelectStaCall; extern Fl_Check_Button *btnSelectStaCity; extern Fl_Check_Button *btnSelectStaGrid; extern Fl_Check_Button *btnSelectOperator; extern Fl_Check_Button *btnSelectProvince; extern Fl_Check_Button *btnSelectCountry; extern Fl_Check_Button *btnSelectNotes; extern Fl_Check_Button *btnSelectQSLrcvd; extern Fl_Check_Button *btnSelectQSLsent; extern Fl_Check_Button *btnSelecteQSLrcvd; extern Fl_Check_Button *btnSelecteQSLsent; extern Fl_Check_Button *btnSelectLOTWrcvd; extern Fl_Check_Button *btnSelectLOTWsent; extern Fl_Check_Button *btnSelectQSL_VIA; extern Fl_Check_Button *btnSelectSerialIN; extern Fl_Check_Button *btnSelectSerialOUT; extern Fl_Check_Button *btnSelectCheck; extern Fl_Check_Button *btnSelectXchgIn; extern Fl_Check_Button *btnSelectMyXchg; extern Fl_Check_Button *btnSelectCNTY; extern Fl_Check_Button *btnSelectCONT; extern Fl_Check_Button *btnSelectCQZ; extern Fl_Check_Button *btnSelectDXCC; extern Fl_Check_Button *btnSelectIOTA; extern Fl_Check_Button *btnSelectITUZ; extern Fl_Check_Button *btnSelectClass; extern Fl_Check_Button *btnSelectSection; extern Fl_Check_Button *btnSelect_cwss_serno; extern Fl_Check_Button *btnSelect_cwss_prec; extern Fl_Check_Button *btnSelect_cwss_check; extern Fl_Check_Button *btnSelect_cwss_section; extern Fl_Check_Button *btnSelect_1010; extern Fl_Button *btnClearAllFields; extern Fl_Button *btnCheckAllFields; extern Fl_Button *btnSetFieldDefaults; extern Fl_Button *btnSetLoTWfields; #include extern Fl_Return_Button *btnOK; extern Fl_Button *btnCancel; extern Fl_Double_Window *dlgLogbook; extern Fl_DateInput *inpDate_log; extern Fl_Input2 *inpTimeOn_log; extern Fl_Input2 *inpCall_log; extern Fl_Input2 *inpName_log; extern Fl_Input2 *inpRstR_log; extern Fl_Input2 *txtNbrRecs_log; extern Fl_DateInput *inpDateOff_log; extern Fl_Input2 *inpTimeOff_log; extern Fl_Input2 *inpFreq_log; extern Fl_Input2 *inpMode_log; extern Fl_Input2 *inpTX_pwr_log; extern Fl_Input2 *inpLoc_log; extern Fl_Input2 *inpRstS_log; extern Fl_Input2 *inpQth_log; extern Fl_Input2 *inpState_log; extern Fl_Input2 *inpVE_Prov_log; extern Fl_Input2 *inpCountry_log; extern Fl_Group *grpTabsSearch; #include extern Fl_Tabs *Tabs; extern Fl_Group *tab_log_qsl; extern Fl_DateInput *inpQSLrcvddate_log; extern Fl_DateInput *inpEQSLrcvddate_log; extern Fl_DateInput *inpLOTWrcvddate_log; extern Fl_DateInput *inpQSLsentdate_log; extern Fl_DateInput *inpEQSLsentdate_log; extern Fl_DateInput *inpLOTWsentdate_log; extern Fl_Input2 *inpQSL_VIA_log; extern Fl_Group *tab_log_other; extern Fl_Input2 *inpCNTY_log; extern Fl_Input2 *inpIOTA_log; extern Fl_Input2 *inpCQZ_log; extern Fl_Input2 *inpCONT_log; extern Fl_Input2 *inpITUZ_log; extern Fl_Input2 *inpDXCC_log; extern Fl_Group *tab_log_notes; extern Fl_Input2 *inpNotes_log; extern Fl_Group *tab_log_my_station; extern Fl_Input2 *inp_log_sta_call; extern Fl_Input2 *inp_log_op_call; extern Fl_Input2 *inp_log_sta_qth; extern Fl_Input2 *inp_log_sta_loc; extern Fl_Group *tab_log_contest; extern Fl_Input2 *inpSerNoOut_log; extern Fl_Input2 *inpMyXchg_log; extern Fl_Input2 *inpSerNoIn_log; extern Fl_Input2 *inpXchgIn_log; extern Fl_Input2 *inpClass_log; extern Fl_Input2 *inpSection_log; extern Fl_Input2 *inp_age_log; extern Fl_Input2 *inp_1010_log; extern Fl_Input2 *inpBand_log; extern Fl_Input2 *inp_check_log; extern Fl_Group *tab_log_cwss; extern Fl_Input2 *inp_log_cwss_serno; extern Fl_Input2 *inp_log_cwss_sec; extern Fl_Input2 *inp_log_cwss_prec; extern Fl_Input2 *inp_log_cwss_chk; extern Fl_Group *tab_log_jota; extern Fl_Input2 *inp_log_troop_s; extern Fl_Input2 *inp_log_troop_r; extern Fl_Input2 *inp_log_scout_s; extern Fl_Input2 *inp_log_scout_r; extern Fl_Group *grpCallSearch; extern Fl_Input2 *inpSearchString; extern void cb_search(Fl_Button*, void*); extern Fl_Button *bSearchPrev; extern Fl_Button *bSearchNext; extern void cb_btnRetrieve(Fl_Button*, void*); extern Fl_Button *bRetrieve; extern Fl_Group *grpFileButtons; extern void cb_btnNewSave(Fl_Button*, void*); extern Fl_Button *bNewSave; extern void cb_btnUpdateCancel(Fl_Button*, void*); extern Fl_Button *bUpdateCancel; extern void cb_btnDelete(Fl_Button*, void*); extern Fl_Button *bDelete; #include extern Fl_Output *txtLogFile; #include "table.h" extern Table *wBrowser; extern Fl_Double_Window *wCabrillo; extern Fl_Check_Browser *chkCabBrowser; extern Fl_Button *btnCabClearAll; extern Fl_Button *btnCabCheckAll; extern Fl_Return_Button *btnCabOK; extern Fl_Button *btnCabCancel; #include "combo.h" extern void setContestType(); extern Fl_ComboBox *cboContest; extern Fl_Check_Button *btnCabCall; extern Fl_Check_Button *btnCabFreq; extern Fl_Check_Button *btnCabMode; extern Fl_Check_Button *btnCabQSOdate; extern Fl_Check_Button *btnCabTimeOFF; extern Fl_Check_Button *btnCabRSTsent; extern Fl_Check_Button *btnCabRSTrcvd; extern Fl_Check_Button *btnCabSerialIN; extern Fl_Check_Button *btnCabSerialOUT; extern Fl_Check_Button *btnCabXchgIn; extern Fl_Check_Button *btnCabMyXchg; extern Fl_Button *btnCabClearAllFields; extern Fl_Button *btnCabCheckAllFields; void create_logbook_dialogs(); #endif fldigi-4.1.06/src/include/newinstall.h0000644000175000017500000000205613472115776014544 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NEW_INSTALL_H #define NEW_INSTALL_H extern void create_new_macros(); extern void create_new_palettes(); extern void show_wizard(int argc = 0, char** argv = NULL); #endif fldigi-4.1.06/src/include/logbook.h0000644000175000017500000000225113472115776014015 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_LOGBOOK_H #define FL_LOGBOOK_H #include #include "lgbook.h" #include "logsupport.h" #include "threads.h" extern std::string log_checksum; extern pthread_t logbook_thread; extern pthread_mutex_t logbook_mutex; extern void start_logbook(); extern void close_logbook(); #endif fldigi-4.1.06/src/include/gfft.h0000644000175000017500000023320013472115776013307 00000000000000//============================================================================== // g_fft.h: // // FFT library // Copyright (C) 2013 // Dave Freese, W1HKJ // // based on public domain code by John Green // original version is available at // http://hyperarchive.lcs.mit.edu/ // /HyperArchive/Archive/dev/src/ffts-for-risc-2-c.hqx // // ported to C++ for fldigi by Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . //============================================================================== //============================================================================== // Original Green C implementation written as a C++ template // Code has been tested for types // g_fft // g_fft // g_fft // g_fft // where the xxx types perform better than the xxx_t types // typical performance for 8192 point fft on an Intel(R) Pentium(R) Dual // CPU E2180 @ 2.00GHz // type complex_fwd real_fwd // double 0.407 ms 0.203 ms // double_t 1.269 ms 0.593 ms // float 0.385 ms 0.193 ms // float_t 1.160 ms 0.627 ms //============================================================================== #ifndef CGREEN_FFT_H #define CGREEN_FFT_H #include template class g_fft { #define FFT_RECIPLN2 1.442695040888963407359924681001892137426 // 1.0/log(2) // some useful conversions between a number and its power of 2 #define LOG2(a) (FFT_RECIPLN2*log(a)) // floating point logarithm base 2 #define POW2(m) ((unsigned int) 1 << (m)) // integer power of 2 for m<32 // fft's with M bigger than this bust primary cache #define MCACHE (11 - (sizeof(FFT_TYPE) / 8)) // some math constants to 40 decimal places #define FFT_PI 3.141592653589793238462643383279502884197 // pi #define FFT_ROOT2 1.414213562373095048801688724209698078569 // sqrt(2) #define FFT_COSPID8 0.9238795325112867561281831893967882868224 // cos(pi/8) #define FFT_SINPID8 0.3826834323650897717284599840303988667613 // sin(pi/8) private: int FFT_size; int FFT_N; FFT_TYPE *FFT_table_1[32]; short int *FFT_table_2[32]; FFT_TYPE *Utbl; short *BRLow; void fftInit(); int ConvertFFTSize(int); // base fft methods void riffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void ifrstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl); void rifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft1pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void frstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl); void rfft8pt(FFT_TYPE *ioptr); void rfft4pt(FFT_TYPE *ioptr); void rfft2pt(FFT_TYPE *ioptr); void rfft1pt(FFT_TYPE *ioptr); void iffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void ifftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void ibfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void ibfR4(FFT_TYPE *ioptr, int M, int NDiffU); void ibfR2(FFT_TYPE *ioptr, int M, int NDiffU); void ifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale); void ifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale); void ifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale); void scbitrevR2(FFT_TYPE *ioptr, int M, short *BRLow, FFT_TYPE scale); void ffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void fftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void bfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void bfR4(FFT_TYPE *ioptr, int M, int NDiffU); void bfR2(FFT_TYPE *ioptr, int M, int NDiffU); void fft8pt(FFT_TYPE *ioptr); void fft4pt(FFT_TYPE *ioptr); void fft2pt(FFT_TYPE *ioptr); void bitrevR2(FFT_TYPE *ioptr, int M, short *BRLow); void fftBRInit(int M, short *BRLow); void fftCosInit(int M, FFT_TYPE *Utbl); public: g_fft(int M = 8192) { if (M < 16) M = 16; if (M > 268435456) M = 268435456; FFT_size = M; fftInit(); } ~g_fft() { for (int i = 0; i < 32; i++) { if (FFT_table_1[i] != 0) delete [] FFT_table_1[i]; if (FFT_table_2[i] != 0) delete [] FFT_table_2[i]; } } void ComplexFFT(std::complex *buf); void InverseComplexFFT(std::complex *buf); void RealFFT(std::complex *buf); void InverseRealFFT(std::complex *buf); FFT_TYPE GetInverseComplexFFTScale(); FFT_TYPE GetInverseRealFFTScale(); }; //------------------------------------------------------------------------------ // Compute Utbl, the cosine table for ffts // of size (pow(2,M)/4 +1) // INPUTS // M = log2 of fft size // OUTPUTS // *Utbl = cosine table //------------------------------------------------------------------------------ template void g_fft::fftCosInit(int M, FFT_TYPE *Utbl) { unsigned int fftN = POW2(M); unsigned int i1; Utbl[0] = FFT_TYPE(1.0); for (i1 = 1; i1 < fftN/4; i1++) Utbl[i1] = (FFT_TYPE)cos((2.0 * FFT_PI * (double)i1) / (double)fftN); Utbl[fftN/4] = FFT_TYPE(0.0); } //------------------------------------------------------------------------------ // Compute BRLow, the bit reversed table for ffts // of size pow(2,M/2 -1) // INPUTS // M = log2 of fft size // OUTPUTS // *BRLow = bit reversed counter table //------------------------------------------------------------------------------ template void g_fft::fftBRInit(int M, short *BRLow) { int Mroot_1 = M / 2 - 1; int Nroot_1 = POW2(Mroot_1); int i1; int bitsum; int bitmask; int bit; for (i1 = 0; i1 < Nroot_1; i1++) { bitsum = 0; bitmask = 1; for (bit = 1; bit <= Mroot_1; bitmask <<= 1, bit++) if (i1 & bitmask) bitsum = bitsum + (Nroot_1 >> bit); BRLow[i1] = bitsum; } } //------------------------------------------------------------------------------ // parts of ffts1 // bit reverse and first radix 2 stage of forward or inverse fft //------------------------------------------------------------------------------ template void g_fft::bitrevR2(FFT_TYPE *ioptr, int M, short *BRLow) { FFT_TYPE f0r; FFT_TYPE f0i; FFT_TYPE f1r; FFT_TYPE f1i; FFT_TYPE f2r; FFT_TYPE f2i; FFT_TYPE f3r; FFT_TYPE f3i; FFT_TYPE f4r; FFT_TYPE f4i; FFT_TYPE f5r; FFT_TYPE f5i; FFT_TYPE f6r; FFT_TYPE f6i; FFT_TYPE f7r; FFT_TYPE f7i; FFT_TYPE t0r; FFT_TYPE t0i; FFT_TYPE t1r; FFT_TYPE t1i; FFT_TYPE *p0r; FFT_TYPE *p1r; FFT_TYPE *IOP; FFT_TYPE *iolimit; int Colstart; int iCol; unsigned int posA; unsigned int posAi; unsigned int posB; unsigned int posBi; const unsigned int Nrems2 = POW2((M + 3) / 2); const unsigned int Nroot_1_ColInc = POW2(M) - Nrems2; const unsigned int Nroot_1 = POW2(M / 2 - 1) - 1; const unsigned int ColstartShift = (M + 1) / 2 + 1; posA = POW2(M); // 1/2 of POW2(M) complex posAi = posA + 1; posB = posA + 2; posBi = posB + 1; iolimit = ioptr + Nrems2; for (; ioptr < iolimit; ioptr += POW2(M / 2 + 1)) { for (Colstart = Nroot_1; Colstart >= 0; Colstart--) { iCol = Nroot_1; p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4; IOP = ioptr + (Colstart << ColstartShift); p1r = IOP + BRLow[iCol] * 4; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); for (; iCol > Colstart;) { f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); f4r = *(p1r); f4i = *(p1r + 1); f5r = *(p1r + posA); f5i = *(p1r + posAi); f6r = *(p1r + 2); f6i = *(p1r + (2 + 1)); f7r = *(p1r + posB); f7i = *(p1r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f0r = f4r + f5r; f0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; f2r = f6r + f7r; f2i = f6i + f7i; f7r = f6r - f7r; f7i = f6i - f7i; *(p1r) = t0r; *(p1r + 1) = t0i; *(p1r + 2) = f1r; *(p1r + (2 + 1)) = f1i; *(p1r + posA) = t1r; *(p1r + posAi) = t1i; *(p1r + posB) = f3r; *(p1r + posBi) = f3i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p0r + 2) = f5r; *(p0r + (2 + 1)) = f5i; *(p0r + posA) = f2r; *(p0r + posAi) = f2i; *(p0r + posB) = f7r; *(p0r + posBi) = f7i; p0r -= Nrems2; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); iCol -= 1; p1r = IOP + BRLow[iCol] * 4; } f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + 2) = f1r; *(p0r + (2 + 1)) = f1i; *(p0r + posA) = t1r; *(p0r + posAi) = t1i; *(p0r + posB) = f3r; *(p0r + posBi) = f3i; } } } //------------------------------------------------------------------------------ // RADIX 2 fft //------------------------------------------------------------------------------ template void g_fft::fft2pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; // store result ioptr[0] = t0r; ioptr[1] = t0i; ioptr[2] = f1r; ioptr[3] = f1i; } //------------------------------------------------------------------------------ // RADIX 4 fft //------------------------------------------------------------------------------ template void g_fft::fft4pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - -i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; ioptr[4] = f2r; ioptr[5] = f2i; ioptr[6] = f3r; ioptr[7] = f3i; } //------------------------------------------------------------------------------ // RADIX 8 fft //------------------------------------------------------------------------------ template void g_fft::fft8pt(FFT_TYPE *ioptr) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - -i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - -i - t1 // f7 - 1 - t1 - -i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r - t1i; f7i = f5i + t1r; f5r = f5r + t1i; f5i = f5i - t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r - f6i; t1i = f2i + f6r; f2r = f2r + f6i; f2i = f2i - f6r; f4r = f1r - f5r * w0r - f5i * w0r; f4i = f1i + f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r - f7i * w0r; f6i = f3i + f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; ioptr[4] = f2r; ioptr[5] = f2i; ioptr[6] = f3r; ioptr[7] = f3i; ioptr[8] = t0r; ioptr[9] = t0i; ioptr[10] = f4r; ioptr[11] = f4i; ioptr[12] = t1r; ioptr[13] = t1i; ioptr[14] = f6r; ioptr[15] = f6i; } //------------------------------------------------------------------------------ // 2nd radix 2 stage //------------------------------------------------------------------------------ template void g_fft::bfR2(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 Us at a time pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 for (SameUCnt = NSameU; SameUCnt > 0; SameUCnt--) { f0r = *p0r; f1r = *p1r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2r = *p2r; f3r = *p3r; f2i = *(p2r + 1); f3i = *(p3r + 1); f4r = f0r + f1r; f4i = f0i + f1i; f5r = f0r - f1r; f5i = f0i - f1i; f6r = f2r + f3r; f6i = f2i + f3i; f7r = f2r - f3r; f7i = f2i - f3i; *p0r = f4r; *(p0r + 1) = f4i; *p1r = f5r; *(p1r + 1) = f5i; *p2r = f6r; *(p2r + 1) = f6i; *p3r = f7r; *(p3r + 1) = f7i; f0r = *(p0r + pos); f1i = *(p1r + posi); f0i = *(p0r + posi); f1r = *(p1r + pos); f2r = *(p2r + pos); f3i = *(p3r + posi); f2i = *(p2r + posi); f3r = *(p3r + pos); f4r = f0r + f1i; f4i = f0i - f1r; f5r = f0r - f1i; f5i = f0i + f1r; f6r = f2r + f3i; f6i = f2i - f3r; f7r = f2r - f3i; f7i = f2i + f3r; *(p0r + pos) = f4r; *(p0r + posi) = f4i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p0r += pnext; p1r += pnext; p2r += pnext; p3r += pnext; } } //------------------------------------------------------------------------------ // 1 radix 4 stage //------------------------------------------------------------------------------ template void g_fft::bfR4(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int pnexti; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE w1r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pnexti = pnext + 1; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 pts per butterfly pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f0 - - f4 // f1 - 1 - f5 - - f5 // f2 - - f6 - 1 - f6 // f3 - 1 - f3 - -i - f7 // Butterflys // f0 - - f4 - - f4 // f1 - -i - t1 - - f5 // f2 - - f2 - w1 - f6 // f3 - -i - f7 - iw1- f7 f0r = *p0r; f1r = *p1r; f2r = *p2r; f3r = *p3r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2i = *(p2r + 1); f3i = *(p3r + 1); f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f7r = f5r - f3i; f7i = f5i + f3r; f5r = f5r + f3i; f5i = f5i - f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r - f3i; f7i = f2i + f3r; f2r = f2r + f3i; f2i = f2i - f3r; f4r = f0r + f1i; f4i = f0i - f1r; t1r = f0r - f1i; t1i = f0i + f1r; f5r = t1r - f7r * w1r + f7i * w1r; f5i = t1i - f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r - f2i * w1r; f6i = f4i + f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; f3r = *(p3r + pnext); f0r = *(p0r + pnext); f3i = *(p3r + pnexti); f0i = *(p0r + pnexti); f2r = *(p2r + pnext); f2i = *(p2r + pnexti); f1r = *(p1r + pnext); f1i = *(p1r + pnexti); *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; p3r += pnext; p0r += pnext; p1r += pnext; p2r += pnext; } f7r = f5r - f3i; f7i = f5i + f3r; f5r = f5r + f3i; f5i = f5i - f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r - f3i; f7i = f2i + f3r; f2r = f2r + f3i; f2i = f2i - f3r; f4r = f0r + f1i; f4i = f0i - f1r; t1r = f0r - f1i; t1i = f0i + f1r; f5r = t1r - f7r * w1r + f7i * w1r; f5i = t1i - f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r - f2i * w1r; f6i = f4i + f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; } //------------------------------------------------------------------------------ // RADIX 8 Stages //------------------------------------------------------------------------------ template void g_fft::bfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; int Uinc; int Uinc2; int Uinc4; unsigned int DiffUCnt; unsigned int SameUCnt; unsigned int U2toU3; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE *u0r, *u0i, *u1r, *u1i, *u2r, *u2i; FFT_TYPE w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 8; pos = pinc * 4; posi = pos + 1; NSameU = POW2(M) / 8 / NDiffU; // 8 pts per butterfly Uinc = (int) NSameU * Ustride; Uinc2 = Uinc * 2; Uinc4 = Uinc * 4; U2toU3 = (POW2(M) / 8) * Ustride; for (; StageCnt > 0; StageCnt--) { u0r = &Utbl[0]; u0i = &Utbl[POW2(M - 2) * Ustride]; u1r = u0r; u1i = u0i; u2r = u0r; u2i = u0i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; w2r = *u2r; w2i = *u2i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - w0- f1 - - f1 - - f1 // f2 - - f2 - w1- f2 - - f4 // f3 - w0- t1 - iw1- f3 - - f5 // // f4 - - t0 - - f4 - w2- t0 // f5 - w0- f5 - - f5 - w3- t1 // f6 - - f6 - w1- f6 - iw2- f6 // f7 - w0- t1 - iw1- f7 - iw3- f7 for (DiffUCnt = NDiffU; DiffUCnt > 0; DiffUCnt--) { f0r = *p0r; f0i = *(p0r + 1); f1r = *p1r; f1i = *(p1r + 1); for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r + f1i * w0i; t0i = f0i - f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r - f3i * w0i; t1i = f2i + f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r + f2i * w1i; f0i = t0i - f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i - t1i * w1r; f3i = f1i + t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; t0r = f4r + f5r * w0r + f5i * w0i; t0i = f4i - f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r - f7i * w0i; t1i = f6i + f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r + f6i * w1i; f4i = t0i - f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i - t1i * w1r; f7i = f5i + t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; t0r = f0r - f4r * w2r - f4i * w2i; t0i = f0i + f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; t1r = f1r - f5r * w3r - f5i * w3i; t1i = f1i + f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; *(p0r + pos) = t0r; *(p1r + pos) = t1r; *(p0r + posi) = t0i; *(p1r + posi) = t1i; *p0r = f0r; *p1r = f1r; *(p0r + 1) = f0i; *(p1r + 1) = f1i; p0r += pnext; f0r = *p0r; f0i = *(p0r + 1); p1r += pnext; f1r = *p1r; f1i = *(p1r + 1); f4r = f2r - f6r * w2i + f6i * w2r; f4i = f2i - f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; f5r = f3r - f7r * w3i + f7i * w3r; f5i = f3i - f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *p2r = f4r; *p3r = f5r; *(p2r + 1) = f4i; *(p3r + 1) = f5i; *(p2r + pos) = f6r; *(p3r + pos) = f7r; *(p2r + posi) = f6i; *(p3r + posi) = f7i; p2r += pnext; p3r += pnext; } f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r + f1i * w0i; t0i = f0i - f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r - f3i * w0i; t1i = f2i + f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r + f2i * w1i; f0i = t0i - f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i - t1i * w1r; f3i = f1i + t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; if ((int) DiffUCnt == NDiffU / 2) Uinc4 = -Uinc4; u0r += Uinc4; u0i -= Uinc4; u1r += Uinc2; u1i -= Uinc2; u2r += Uinc; u2i -= Uinc; pstrt += 2; t0r = f4r + f5r * w0r + f5i * w0i; t0i = f4i - f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r - f7i * w0i; t1i = f6i + f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r + f6i * w1i; f4i = t0i - f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i - t1i * w1r; f7i = f5i + t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; if ((int) DiffUCnt <= NDiffU / 2) w0r = -w0r; t0r = f0r - f4r * w2r - f4i * w2i; t0i = f0i + f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; f4r = f2r - f6r * w2i + f6i * w2r; f4i = f2i - f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; *(p0r + pos) = t0r; *p2r = f4r; *(p0r + posi) = t0i; *(p2r + 1) = f4i; w2r = *u2r; w2i = *u2i; *p0r = f0r; *(p2r + pos) = f6r; *(p0r + 1) = f0i; *(p2r + posi) = f6i; p0r = pstrt; p2r = pstrt + pinc + pinc; t1r = f1r - f5r * w3r - f5i * w3i; t1i = f1i + f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; f5r = f3r - f7r * w3i + f7i * w3r; f5i = f3i - f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *(p1r + pos) = t1r; *p3r = f5r; *(p1r + posi) = t1i; *(p3r + 1) = f5i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); *p1r = f1r; *(p3r + pos) = f7r; *(p1r + 1) = f1i; *(p3r + posi) = f7i; p1r = pstrt + pinc; p3r = p2r + pinc; } NSameU /= 8; Uinc /= 8; Uinc2 /= 8; Uinc4 = Uinc * 4; NDiffU *= 8; pinc *= 8; pnext *= 8; pos *= 8; posi = pos + 1; } } template void g_fft::fftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { // recursive bfstages calls to maximize on chip cache efficiency int i1; if (M <= (int) MCACHE) // fits on chip ? bfstages(ioptr, M, Utbl, Ustride, NDiffU, StageCnt); // RADIX 8 Stages else { for (i1 = 0; i1 < 8; i1++) { fftrecurs(&ioptr[i1 * POW2(M - 3) * 2], M - 3, Utbl, 8 * Ustride, NDiffU, StageCnt - 1); // RADIX 8 Stages } bfstages(ioptr, M, Utbl, Ustride, POW2(M - 3), 1); // RADIX 8 Stage } } //------------------------------------------------------------------------------ // Compute in-place complex fft on the rows of the input array // INPUTS // *ioptr = input data array // M = log2 of fft size (ex M=10 for 1024 point fft) // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array //------------------------------------------------------------------------------ template void g_fft::ffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { int StageCnt; int NDiffU; switch (M) { case 0: break; case 1: fft2pt(ioptr); // a 2 pt fft break; case 2: fft4pt(ioptr); // a 4 pt fft break; case 3: fft8pt(ioptr); // an 8 pt fft break; default: bitrevR2(ioptr, M, BRLow); // bit reverse and first radix 2 stage StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { bfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { bfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) bfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages else fftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages } } //------------------------------------------------------------------------------ // parts of iffts1 // scaled bit reverse and first radix 2 stage forward or inverse fft //------------------------------------------------------------------------------ template void g_fft::scbitrevR2(FFT_TYPE *ioptr, int M, short *BRLow, FFT_TYPE scale) { FFT_TYPE f0r; FFT_TYPE f0i; FFT_TYPE f1r; FFT_TYPE f1i; FFT_TYPE f2r; FFT_TYPE f2i; FFT_TYPE f3r; FFT_TYPE f3i; FFT_TYPE f4r; FFT_TYPE f4i; FFT_TYPE f5r; FFT_TYPE f5i; FFT_TYPE f6r; FFT_TYPE f6i; FFT_TYPE f7r; FFT_TYPE f7i; FFT_TYPE t0r; FFT_TYPE t0i; FFT_TYPE t1r; FFT_TYPE t1i; FFT_TYPE *p0r; FFT_TYPE *p1r; FFT_TYPE *IOP; FFT_TYPE *iolimit; int Colstart; int iCol; unsigned int posA; unsigned int posAi; unsigned int posB; unsigned int posBi; const unsigned int Nrems2 = POW2((M + 3) / 2); const unsigned int Nroot_1_ColInc = POW2(M) - Nrems2; const unsigned int Nroot_1 = POW2(M / 2 - 1) - 1; const unsigned int ColstartShift = (M + 1) / 2 + 1; posA = POW2(M); // 1/2 of POW2(M) complexes posAi = posA + 1; posB = posA + 2; posBi = posB + 1; iolimit = ioptr + Nrems2; for (; ioptr < iolimit; ioptr += POW2(M / 2 + 1)) { for (Colstart = Nroot_1; Colstart >= 0; Colstart--) { iCol = Nroot_1; p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4; IOP = ioptr + (Colstart << ColstartShift); p1r = IOP + BRLow[iCol] * 4; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); for (; iCol > Colstart;) { f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); f4r = *(p1r); f4i = *(p1r + 1); f5r = *(p1r + posA); f5i = *(p1r + posAi); f6r = *(p1r + 2); f6i = *(p1r + (2 + 1)); f7r = *(p1r + posB); f7i = *(p1r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f0r = f4r + f5r; f0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; f2r = f6r + f7r; f2i = f6i + f7i; f7r = f6r - f7r; f7i = f6i - f7i; *(p1r) = scale * t0r; *(p1r + 1) = scale * t0i; *(p1r + 2) = scale * f1r; *(p1r + (2 + 1)) = scale * f1i; *(p1r + posA) = scale * t1r; *(p1r + posAi) = scale * t1i; *(p1r + posB) = scale * f3r; *(p1r + posBi) = scale * f3i; *(p0r) = scale * f0r; *(p0r + 1) = scale * f0i; *(p0r + 2) = scale * f5r; *(p0r + (2 + 1)) = scale * f5i; *(p0r + posA) = scale * f2r; *(p0r + posAi) = scale * f2i; *(p0r + posB) = scale * f7r; *(p0r + posBi) = scale * f7i; p0r -= Nrems2; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); iCol -= 1; p1r = IOP + BRLow[iCol] * 4; } f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; *(p0r) = scale * t0r; *(p0r + 1) = scale * t0i; *(p0r + 2) = scale * f1r; *(p0r + (2 + 1)) = scale * f1i; *(p0r + posA) = scale * t1r; *(p0r + posAi) = scale * t1i; *(p0r + posB) = scale * f3r; *(p0r + posBi) = scale * f3i; } } } //------------------------------------------------------------------------------ // RADIX 2 ifft //------------------------------------------------------------------------------ template void g_fft::ifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; } //------------------------------------------------------------------------------ // RADIX 4 ifft //------------------------------------------------------------------------------ template void g_fft::ifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 8 ifft //------------------------------------------------------------------------------ template void g_fft::ifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - i - t1 // f7 - 1 - t1 - i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r + t1i; f7i = f5i - t1r; f5r = f5r - t1i; f5i = f5i + t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r + f6i; t1i = f2i - f6r; f2r = f2r - f6i; f2i = f2i + f6r; f4r = f1r - f5r * w0r + f5i * w0r; f4i = f1i - f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r + f7i * w0r; f6i = f3i - f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[8] = scale * t0r; ioptr[9] = scale * t0i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // 2nd radix 2 stage //------------------------------------------------------------------------------ template void g_fft::ibfR2(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 Us at a time pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 for (SameUCnt = NSameU; SameUCnt > 0; SameUCnt--) { f0r = *p0r; f1r = *p1r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2r = *p2r; f3r = *p3r; f2i = *(p2r + 1); f3i = *(p3r + 1); f4r = f0r + f1r; f4i = f0i + f1i; f5r = f0r - f1r; f5i = f0i - f1i; f6r = f2r + f3r; f6i = f2i + f3i; f7r = f2r - f3r; f7i = f2i - f3i; *p0r = f4r; *(p0r + 1) = f4i; *p1r = f5r; *(p1r + 1) = f5i; *p2r = f6r; *(p2r + 1) = f6i; *p3r = f7r; *(p3r + 1) = f7i; f0r = *(p0r + pos); f1i = *(p1r + posi); f0i = *(p0r + posi); f1r = *(p1r + pos); f2r = *(p2r + pos); f3i = *(p3r + posi); f2i = *(p2r + posi); f3r = *(p3r + pos); f4r = f0r - f1i; f4i = f0i + f1r; f5r = f0r + f1i; f5i = f0i - f1r; f6r = f2r - f3i; f6i = f2i + f3r; f7r = f2r + f3i; f7i = f2i - f3r; *(p0r + pos) = f4r; *(p0r + posi) = f4i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p0r += pnext; p1r += pnext; p2r += pnext; p3r += pnext; } } //------------------------------------------------------------------------------ // 1 radix 4 stage //------------------------------------------------------------------------------ template void g_fft::ibfR4(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int pnexti; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE w1r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pnexti = pnext + 1; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 pts per butterfly pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f0 - - f4 // f1 - 1 - f5 - - f5 // f2 - - f6 - 1 - f6 // f3 - 1 - f3 - -i - f7 // Butterflys // f0 - - f4 - - f4 // f1 - -i - t1 - - f5 // f2 - - f2 - w1 - f6 // f3 - -i - f7 - iw1- f7 f0r = *p0r; f1r = *p1r; f2r = *p2r; f3r = *p3r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2i = *(p2r + 1); f3i = *(p3r + 1); f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f7r = f5r + f3i; f7i = f5i - f3r; f5r = f5r - f3i; f5i = f5i + f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r + f3i; f7i = f2i - f3r; f2r = f2r - f3i; f2i = f2i + f3r; f4r = f0r - f1i; f4i = f0i + f1r; t1r = f0r + f1i; t1i = f0i - f1r; f5r = t1r - f7r * w1r - f7i * w1r; f5i = t1i + f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r + f2i * w1r; f6i = f4i - f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; f3r = *(p3r + pnext); f0r = *(p0r + pnext); f3i = *(p3r + pnexti); f0i = *(p0r + pnexti); f2r = *(p2r + pnext); f2i = *(p2r + pnexti); f1r = *(p1r + pnext); f1i = *(p1r + pnexti); *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; p3r += pnext; p0r += pnext; p1r += pnext; p2r += pnext; } f7r = f5r + f3i; f7i = f5i - f3r; f5r = f5r - f3i; f5i = f5i + f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r + f3i; f7i = f2i - f3r; f2r = f2r - f3i; f2i = f2i + f3r; f4r = f0r - f1i; f4i = f0i + f1r; t1r = f0r + f1i; t1i = f0i - f1r; f5r = t1r - f7r * w1r - f7i * w1r; f5i = t1i + f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r + f2i * w1r; f6i = f4i - f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; } //------------------------------------------------------------------------------ // RADIX 8 Stages //------------------------------------------------------------------------------ template void g_fft::ibfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; int Uinc; int Uinc2; int Uinc4; unsigned int DiffUCnt; unsigned int SameUCnt; unsigned int U2toU3; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE *u0r, *u0i, *u1r, *u1i, *u2r, *u2i; FFT_TYPE w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 8; pos = pinc * 4; posi = pos + 1; NSameU = POW2(M) / 8 / NDiffU; // 8 pts per butterfly Uinc = (int) NSameU * Ustride; Uinc2 = Uinc * 2; Uinc4 = Uinc * 4; U2toU3 = (POW2(M) / 8) * Ustride; for (; StageCnt > 0; StageCnt--) { u0r = &Utbl[0]; u0i = &Utbl[POW2(M - 2) * Ustride]; u1r = u0r; u1i = u0i; u2r = u0r; u2i = u0i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; w2r = *u2r; w2i = *u2i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - w0- f1 - - f1 - - f1 // f2 - - f2 - w1- f2 - - f4 // f3 - w0- t1 - iw1- f3 - - f5 // f4 - - t0 - - f4 - w2- t0 // f5 - w0- f5 - - f5 - w3- t1 // f6 - - f6 - w1- f6 - iw2- f6 // f7 - w0- t1 - iw1- f7 - iw3- f7 for (DiffUCnt = NDiffU; DiffUCnt > 0; DiffUCnt--) { f0r = *p0r; f0i = *(p0r + 1); f1r = *p1r; f1i = *(p1r + 1); for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r - f1i * w0i; t0i = f0i + f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r + f3i * w0i; t1i = f2i - f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r - f2i * w1i; f0i = t0i + f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i + t1i * w1r; f3i = f1i - t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; t0r = f4r + f5r * w0r - f5i * w0i; t0i = f4i + f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r + f7i * w0i; t1i = f6i - f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r - f6i * w1i; f4i = t0i + f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i + t1i * w1r; f7i = f5i - t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; t0r = f0r - f4r * w2r + f4i * w2i; t0i = f0i - f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; t1r = f1r - f5r * w3r + f5i * w3i; t1i = f1i - f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; *(p0r + pos) = t0r; *(p0r + posi) = t0i; *p0r = f0r; *(p0r + 1) = f0i; p0r += pnext; f0r = *p0r; f0i = *(p0r + 1); *(p1r + pos) = t1r; *(p1r + posi) = t1i; *p1r = f1r; *(p1r + 1) = f1i; p1r += pnext; f1r = *p1r; f1i = *(p1r + 1); f4r = f2r - f6r * w2i - f6i * w2r; f4i = f2i + f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; f5r = f3r - f7r * w3i - f7i * w3r; f5i = f3i + f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *p2r = f4r; *(p2r + 1) = f4i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; p2r += pnext; *p3r = f5r; *(p3r + 1) = f5i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p3r += pnext; } f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r - f1i * w0i; t0i = f0i + f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r + f3i * w0i; t1i = f2i - f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r - f2i * w1i; f0i = t0i + f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i + t1i * w1r; f3i = f1i - t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; if ((int) DiffUCnt == NDiffU / 2) Uinc4 = -Uinc4; u0r += Uinc4; u0i -= Uinc4; u1r += Uinc2; u1i -= Uinc2; u2r += Uinc; u2i -= Uinc; pstrt += 2; t0r = f4r + f5r * w0r - f5i * w0i; t0i = f4i + f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r + f7i * w0i; t1i = f6i - f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r - f6i * w1i; f4i = t0i + f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i + t1i * w1r; f7i = f5i - t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; if ((int) DiffUCnt <= NDiffU / 2) w0r = -w0r; t0r = f0r - f4r * w2r + f4i * w2i; t0i = f0i - f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; f4r = f2r - f6r * w2i - f6i * w2r; f4i = f2i + f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; *(p0r + pos) = t0r; *p2r = f4r; *(p0r + posi) = t0i; *(p2r + 1) = f4i; w2r = *u2r; w2i = *u2i; *p0r = f0r; *(p2r + pos) = f6r; *(p0r + 1) = f0i; *(p2r + posi) = f6i; p0r = pstrt; p2r = pstrt + pinc + pinc; t1r = f1r - f5r * w3r + f5i * w3i; t1i = f1i - f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; f5r = f3r - f7r * w3i - f7i * w3r; f5i = f3i + f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *(p1r + pos) = t1r; *p3r = f5r; *(p1r + posi) = t1i; *(p3r + 1) = f5i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); *p1r = f1r; *(p3r + pos) = f7r; *(p1r + 1) = f1i; *(p3r + posi) = f7i; p1r = pstrt + pinc; p3r = p2r + pinc; } NSameU /= 8; Uinc /= 8; Uinc2 /= 8; Uinc4 = Uinc * 4; NDiffU *= 8; pinc *= 8; pnext *= 8; pos *= 8; posi = pos + 1; } } //------------------------------------------------------------------------------ // recursive bfstages calls to maximize on chip cache efficiency //------------------------------------------------------------------------------ template void g_fft::ifftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { int i1; if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, Ustride, NDiffU, StageCnt); // RADIX 8 Stages else { for (i1 = 0; i1 < 8; i1++) { ifftrecurs(&ioptr[i1 * POW2(M - 3) * 2], M - 3, Utbl, 8 * Ustride, NDiffU, StageCnt - 1); // RADIX 8 Stages } ibfstages(ioptr, M, Utbl, Ustride, POW2(M - 3), 1); // RADIX 8 Stage } } //------------------------------------------------------------------------------ // Compute in-place inverse complex fft on the rows of the input array // INPUTS // *ioptr = input data array // M = log2 of fft size // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array //------------------------------------------------------------------------------ template void g_fft::iffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { int StageCnt; int NDiffU; const FFT_TYPE scale = 1.0 / POW2(M); switch (M) { case 0: break; case 1: ifft2pt(ioptr, scale); // a 2 pt fft break; case 2: ifft4pt(ioptr, scale); // a 4 pt fft break; case 3: ifft8pt(ioptr, scale); // an 8 pt fft break; default: // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { ibfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { ibfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages else ifftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages } } //------------------------------------------------------------------------------ // parts of rffts1 // RADIX 2 rfft //------------------------------------------------------------------------------ template void g_fft::rfft1pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; // finish rfft t0r = f0r + f0i; t0i = f0r - f0i; // store result ioptr[0] = t0r; ioptr[1] = t0i; } //------------------------------------------------------------------------------ // RADIX 4 rfft //------------------------------------------------------------------------------ template void g_fft::rfft2pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f1i - f0i; // finish rfft f0r = t0r + t0i; f0i = t0r - t0i; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; } //------------------------------------------------------------------------------ // RADIX 8 rfft //------------------------------------------------------------------------------ template void g_fft::rfft4pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) const FFT_TYPE Two = 2.0; const FFT_TYPE scale = 0.5; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - -i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = f2i - t0i; // neg for rfft f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; // finish rfft t0r = f0r + f0i; // compute Re(x[0]) t0i = f0r - f0i; // compute Re(x[N/2]) t1r = f1r + f3r; t1i = f1i - f3i; f0r = f1i + f3i; f0i = f3r - f1r; f1r = t1r + w0r * f0r + w0r * f0i; f1i = t1i - w0r * f0r + w0r * f0i; f3r = Two * t1r - f1r; f3i = f1i - Two * t1i; // store result ioptr[4] = f2r; ioptr[5] = f2i; ioptr[0] = t0r; ioptr[1] = t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 16 rfft //------------------------------------------------------------------------------ template void g_fft::rfft8pt(FFT_TYPE *ioptr) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE w1r = FFT_COSPID8; // cos(pi/8) FFT_TYPE w1i = FFT_SINPID8; // sin(pi/8) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; const FFT_TYPE scale = 0.5; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - -i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - -i - t1 // f7 - 1 - t1 - -i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r - t1i; f7i = f5i + t1r; f5r = f5r + t1i; f5i = f5i - t1r; t0r = f0r - f4r; t0i = f4i - f0i; // neg for rfft f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r - f6i; t1i = f2i + f6r; f2r = f2r + f6i; f2i = f2i - f6r; f4r = f1r - f5r * w0r - f5i * w0r; f4i = f1i + f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r - f7i * w0r; f6i = f3i + f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // finish rfft f5r = f0r + f0i; // compute Re(x[0]) f5i = f0r - f0i; // compute Re(x[N/2]) f0r = f2r + t1r; f0i = f2i - t1i; f7r = f2i + t1i; f7i = t1r - f2r; f2r = f0r + w0r * f7r + w0r * f7i; f2i = f0i - w0r * f7r + w0r * f7i; t1r = Two * f0r - f2r; t1i = f2i - Two * f0i; f0r = f1r + f6r; f0i = f1i - f6i; f7r = f1i + f6i; f7i = f6r - f1r; f1r = f0r + w1r * f7r + w1i * f7i; f1i = f0i - w1i * f7r + w1r * f7i; f6r = Two * f0r - f1r; f6i = f1i - Two * f0i; f0r = f3r + f4r; f0i = f3i - f4i; f7r = f3i + f4i; f7i = f4r - f3r; f3r = f0r + w1i * f7r + w1r * f7i; f3i = f0i - w1r * f7r + w1i * f7i; f4r = Two * f0r - f3r; f4i = f3i - Two * f0i; // store result ioptr[8] = t0r; ioptr[9] = t0i; ioptr[0] = f5r; ioptr[1] = f5i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // Finish RFFT //------------------------------------------------------------------------------ template void g_fft::frstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl) { unsigned int pos; unsigned int posi; unsigned int diffUcnt; FFT_TYPE *p0r, *p1r; FFT_TYPE *u0r, *u0i; FFT_TYPE w0r, w0i; FFT_TYPE f0r, f0i, f1r, f1i, f4r, f4i, f5r, f5i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; pos = POW2(M - 1); posi = pos + 1; p0r = ioptr; p1r = ioptr + pos / 2; u0r = Utbl + POW2(M - 3); w0r = *u0r, f0r = *(p0r); f0i = *(p0r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); f1r = *(p1r); f1i = *(p1r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); t0r = Two * f0r + Two * f0i; // compute Re(x[0]) t0i = Two * f0r - Two * f0i; // compute Re(x[N/2]) t1r = f4r + f4r; t1i = -f4i - f4i; f0r = f1r + f5r; f0i = f1i - f5i; f4r = f1i + f5i; f4i = f5r - f1r; f1r = f0r + w0r * f4r + w0r * f4i; f1i = f0i - w0r * f4r + w0r * f4i; f5r = Two * f0r - f1r; f5i = f1i - Two * f0i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + pos) = t1r; *(p0r + posi) = t1i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; u0r = Utbl + 1; u0i = Utbl + (POW2(M - 2) - 1); w0r = *u0r, w0i = *u0i; p0r = (ioptr + 2); p1r = (ioptr + (POW2(M - 2) - 1) * 2); // Butterflys // f0 - t0 - - f0 // f5 - t1 - w0 - f5 // f1 - t0 - - f1 // f4 - t1 -iw0 - f4 for (diffUcnt = POW2(M - 3) - 1; diffUcnt > 0; diffUcnt--) { f0r = *(p0r); f0i = *(p0r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); f1r = *(p1r); f1i = *(p1r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); t0r = f0r + f5r; t0i = f0i - f5i; t1r = f0i + f5i; t1i = f5r - f0r; f0r = t0r + w0r * t1r + w0i * t1i; f0i = t0i - w0i * t1r + w0r * t1i; f5r = Two * t0r - f0r; f5i = f0i - Two * t0i; t0r = f1r + f4r; t0i = f1i - f4i; t1r = f1i + f4i; t1i = f4r - f1r; f1r = t0r + w0i * t1r + w0r * t1i; f1i = t0i - w0r * t1r + w0i * t1i; f4r = Two * t0r - f1r; f4i = f1i - Two * t0i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; w0r = *++u0r; w0i = *--u0i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p0r + pos) = f4r; *(p0r + posi) = f4i; p0r += 2; p1r -= 2; } } //------------------------------------------------------------------------------ // Compute in-place real fft on the rows of the input array // The result is the complex spectra of the positive frequencies // except the location for the first complex number contains the real // values for DC and Nyquest // INPUTS // *ioptr = real input data array // M = log2 of fft size // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array in the following order // Re(x[0]), Re(x[N/2]), Re(x[1]), Im(x[1]), Re(x[2]), Im(x[2]), // ... Re(x[N/2-1]), Im(x[N/2-1]). //------------------------------------------------------------------------------ template void g_fft::rffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { FFT_TYPE scale; int StageCnt; int NDiffU; M = M - 1; switch (M) { case -1: break; case 0: rfft1pt(ioptr); // a 2 pt fft break; case 1: rfft2pt(ioptr); // a 4 pt fft break; case 2: rfft4pt(ioptr); // an 8 pt fft break; case 3: rfft8pt(ioptr); // a 16 pt fft break; default: scale = 0.5; // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { bfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { bfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) bfstages(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages else fftrecurs(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages frstage(ioptr, M + 1, Utbl); } } //------------------------------------------------------------------------------ // parts of riffts1 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // RADIX 2 rifft //------------------------------------------------------------------------------ template void g_fft::rifft1pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; // finish rfft t0r = f0r + f0i; t0i = f0r - f0i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; } //------------------------------------------------------------------------------ // RADIX 4 rifft //------------------------------------------------------------------------------ template void g_fft::rifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f1r = Two * ioptr[2]; f1i = Two * ioptr[3]; // start rifft f0r = t0r + t0i; f0i = t0r - t0i; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; } //------------------------------------------------------------------------------ // RADIX 8 rifft //------------------------------------------------------------------------------ template void g_fft::rifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f2r = ioptr[2]; f2i = ioptr[3]; f1r = Two * ioptr[4]; f1i = Two * ioptr[5]; f3r = ioptr[6]; f3i = ioptr[7]; // start rfft f0r = t0r + t0i; // compute Re(x[0]) f0i = t0r - t0i; // compute Re(x[N/2]) t1r = f2r + f3r; t1i = f2i - f3i; t0r = f2r - f3r; t0i = f2i + f3i; f2r = t1r - w0r * t0r - w0r * t0i; f2i = t1i + w0r * t0r - w0r * t0i; f3r = Two * t1r - f2r; f3i = f2i - Two * t1i; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - i - f3 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 16 rifft //------------------------------------------------------------------------------ template void g_fft::rifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE w0r = (FFT_TYPE) (1.0 / FFT_ROOT2); // cos(pi/4) FFT_TYPE w1r = FFT_COSPID8; // cos(pi/8) FFT_TYPE w1i = FFT_SINPID8; // sin(pi/8) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f4r = ioptr[2]; f4i = ioptr[3]; f2r = ioptr[4]; f2i = ioptr[5]; f6r = ioptr[6]; f6i = ioptr[7]; f1r = Two * ioptr[8]; f1i = Two * ioptr[9]; f5r = ioptr[10]; f5i = ioptr[11]; f3r = ioptr[12]; f3i = ioptr[13]; f7r = ioptr[14]; f7i = ioptr[15]; // start rfft f0r = t0r + t0i; // compute Re(x[0]) f0i = t0r - t0i; // compute Re(x[N/2]) t0r = f2r + f3r; t0i = f2i - f3i; t1r = f2r - f3r; t1i = f2i + f3i; f2r = t0r - w0r * t1r - w0r * t1i; f2i = t0i + w0r * t1r - w0r * t1i; f3r = Two * t0r - f2r; f3i = f2i - Two * t0i; t0r = f4r + f7r; t0i = f4i - f7i; t1r = f4r - f7r; t1i = f4i + f7i; f4r = t0r - w1i * t1r - w1r * t1i; f4i = t0i + w1r * t1r - w1i * t1i; f7r = Two * t0r - f4r; f7i = f4i - Two * t0i; t0r = f6r + f5r; t0i = f6i - f5i; t1r = f6r - f5r; t1i = f6i + f5i; f6r = t0r - w1r * t1r - w1i * t1i; f6i = t0i + w1i * t1r - w1r * t1i; f5r = Two * t0r - f6r; f5i = f6i - Two * t0i; // Butterflys // f0 - - t0 - - f0 - - f0 // f1* - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - i - t1 // f7 - 1 - t1 - i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r + t1i; f7i = f5i - t1r; f5r = f5r - t1i; f5i = f5i + t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r + f6i; t1i = f2i - f6r; f2r = f2r - f6i; f2i = f2i + f6r; f4r = f1r - f5r * w0r + f5i * w0r; f4i = f1i - f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r + f7i * w0r; f6i = f3i - f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[8] = scale * t0r; ioptr[9] = scale * t0i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // Start RIFFT //------------------------------------------------------------------------------ template void g_fft::ifrstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl) { unsigned int pos; unsigned int posi; unsigned int diffUcnt; FFT_TYPE *p0r, *p1r; FFT_TYPE *u0r, *u0i; FFT_TYPE w0r, w0i; FFT_TYPE f0r, f0i, f1r, f1i, f4r, f4i, f5r, f5i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); pos = POW2(M - 1); posi = pos + 1; p0r = ioptr; p1r = ioptr + pos / 2; u0r = Utbl + POW2(M - 3); w0r = *u0r, f0r = *(p0r); f0i = *(p0r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); f1r = *(p1r); f1i = *(p1r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); t0r = f0r + f0i; t0i = f0r - f0i; t1r = f4r + f4r; t1i = -f4i - f4i; f0r = f1r + f5r; f0i = f1i - f5i; f4r = f1r - f5r; f4i = f1i + f5i; f1r = f0r - w0r * f4r - w0r * f4i; f1i = f0i + w0r * f4r - w0r * f4i; f5r = Two * f0r - f1r; f5i = f1i - Two * f0i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + pos) = t1r; *(p0r + posi) = t1i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; u0r = Utbl + 1; u0i = Utbl + (POW2(M - 2) - 1); w0r = *u0r, w0i = *u0i; p0r = (ioptr + 2); p1r = (ioptr + (POW2(M - 2) - 1) * 2); // Butterflys // f0 - t0 - f0 // f1 - t1 -w0- f1 // f2 - t0 - f2 // f3 - t1 -iw0- f3 for (diffUcnt = POW2(M - 3) - 1; diffUcnt > 0; diffUcnt--) { f0r = *(p0r); f0i = *(p0r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); f1r = *(p1r); f1i = *(p1r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); t0r = f0r + f5r; t0i = f0i - f5i; t1r = f0r - f5r; t1i = f0i + f5i; f0r = t0r - w0i * t1r - w0r * t1i; f0i = t0i + w0r * t1r - w0i * t1i; f5r = Two * t0r - f0r; f5i = f0i - Two * t0i; t0r = f1r + f4r; t0i = f1i - f4i; t1r = f1r - f4r; t1i = f1i + f4i; f1r = t0r - w0r * t1r - w0i * t1i; f1i = t0i + w0i * t1r - w0r * t1i; f4r = Two * t0r - f1r; f4i = f1i - Two * t0i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; w0r = *++u0r; w0i = *--u0i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p0r + pos) = f4r; *(p0r + posi) = f4i; p0r += 2; p1r -= 2; } } //------------------------------------------------------------------------------ // Compute in-place real ifft on the rows of the input array // data order as from rffts1 // INPUTS // *ioptr = input data array in the following order // M = log2 of fft size // Re(x[0]), Re(x[N/2]), Re(x[1]), Im(x[1]), // Re(x[2]), Im(x[2]), ... Re(x[N/2-1]), Im(x[N/2-1]). // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = real output data array //------------------------------------------------------------------------------ template void g_fft::riffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { FFT_TYPE scale; int StageCnt; int NDiffU; scale = (FFT_TYPE)(1.0 / (double)((int)POW2(M))); M = M - 1; switch (M) { case -1: break; case 0: rifft1pt(ioptr, scale); // a 2 pt fft break; case 1: rifft2pt(ioptr, scale); // a 4 pt fft break; case 2: rifft4pt(ioptr, scale); // an 8 pt fft break; case 3: rifft8pt(ioptr, scale); // a 16 pt fft break; default: ifrstage(ioptr, M + 1, Utbl); // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { ibfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { ibfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages else ifftrecurs(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages } } //============================================================================== // End of original C functions // // Wrapper methods for simple class access //============================================================================== //------------------------------------------------------------------------------ // malloc and init cosine and bit reversed tables for a given size // fft, ifft, rfft, rifft // INPUTS // M = log2 of fft size (ex M=10 for 1024 point fft) // OUTPUTS // private cosine and bit reversed tables //------------------------------------------------------------------------------ template void g_fft::fftInit() { for (int i = 0; i < 32; i++) { FFT_table_1[i] = (FFT_TYPE*)0; FFT_table_2[i] = (short int*)0; } FFT_N = ConvertFFTSize(FFT_size); // create and initialize cos table FFT_table_1[FFT_N] = new FFT_TYPE[(POW2(FFT_N) / 4 + 1)]; fftCosInit(FFT_N, FFT_table_1[FFT_N]); // create and initialize bit reverse tables FFT_table_2[FFT_N/2] = new short[POW2(FFT_N/2 - 1)]; fftBRInit(FFT_N, FFT_table_2[FFT_N/2]); FFT_table_2[(FFT_N - 1) / 2] = new short[POW2((FFT_N - 1) / 2 - 1)]; fftBRInit(FFT_N - 1, FFT_table_2[(FFT_N - 1) / 2]); Utbl = ((FFT_TYPE**) FFT_table_1)[FFT_N]; BRLow = ((short**) FFT_table_2)[FFT_N / 2]; } //------------------------------------------------------------------------------ // convert from N to LOG2(N) //------------------------------------------------------------------------------ template int g_fft::ConvertFFTSize(int N) { if (N <= 0) N = -N; switch (N) { case 0x00000001: return 0; // 1 case 0x00000002: return 1; // 2 case 0x00000004: return 2; // 4 case 0x00000008: return 3; // 8 case 0x00000010: return 4; // 16 case 0x00000020: return 5; // 32 case 0x00000040: return 6; // 64 case 0x00000080: return 7; // 128 case 0x00000100: return 8; // 256 case 0x00000200: return 9; // 512 case 0x00000400: return 10; // 1024 case 0x00000800: return 11; // 2048 case 0x00001000: return 12; // 4096 case 0x00002000: return 13; // 8192 case 0x00004000: return 14; // 16384 case 0x00008000: return 15; // 32768 case 0x00010000: return 16; // 65536 case 0x00020000: return 17; // 131072 case 0x00040000: return 18; // 262144 case 0x00080000: return 19; // 525288 case 0x00100000: return 20; // 1048576 case 0x00200000: return 21; // 2097152 case 0x00400000: return 22; // 4194304 case 0x00800000: return 23; // 8388608 case 0x01000000: return 24; // 16777216 case 0x02000000: return 25; // 33554432 case 0x04000000: return 26; // 67108864 case 0x08000000: return 27; // 134217728 case 0x10000000: return 28; // 268435456 } return 0; } //------------------------------------------------------------------------------ // Compute in-place complex FFT // FFTsize: FFT length in samples // buf: array of FFTsize*2 FFT_TYPE values, // in interleaved real/imaginary format //------------------------------------------------------------------------------ template void g_fft::ComplexFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); ffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place inverse complex FFT // FFTsize: FFT length in samples // buf: array of FFTsize*2 FFT_TYPE values, // in interleaved real/imaginary format // Output should be scaled by the return value of // GetInverseComplexFFTScale(fft_struct, FFTsize). //------------------------------------------------------------------------------ template void g_fft::InverseComplexFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); iffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place real FFT // FFTsize: FFT length in samples // buf: array of FFTsize FFT_TYPE values; output is in interleaved // real/imaginary format, except for buf[1] which is the real // part for the Nyquist frequency //------------------------------------------------------------------------------ template void g_fft::RealFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); rffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place inverse real FFT // FFTsize: FFT length in samples // buf: array of FFTsize FFT_TYPE values; input is expected to be in // interleaved real/imaginary format, except for buf[1] which // is the real part for the Nyquist frequency // Output should be scaled by the return value of // GetInverseRealFFTScale(fft_struct, FFTsize). //------------------------------------------------------------------------------ template void g_fft::InverseRealFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); riffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Returns the amplitude scale that should be applied to the result of // an inverse complex FFT with a length of 'FFTsize' samples. //------------------------------------------------------------------------------ template FFT_TYPE g_fft::GetInverseComplexFFTScale() { return FFT_TYPE(1.0); } //------------------------------------------------------------------------------ // Returns the amplitude scale that should be applied to the result of // an inverse real FFT with a length of 'FFTsize' samples. //------------------------------------------------------------------------------ template FFT_TYPE g_fft::GetInverseRealFFTScale() { return FFT_TYPE(1.0); } #endif fldigi-4.1.06/src/include/record_loader.h0000644000175000017500000000455413472115776015175 00000000000000// ---------------------------------------------------------------------------- // record_loader.h // // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef RECORD_LOADER_H #define RECORD_LOADER_H #include #include class RecordLoaderInterface { RecordLoaderInterface & operator=( const RecordLoaderInterface & ); public: RecordLoaderInterface(); virtual void Clear() = 0 ; /// Reads just one record. virtual bool ReadRecord( std::istream & ) = 0 ; /// Loads a file and stores it for later lookup. Returns the number of records, or -1. int LoadAndRegister(); std::string ContentSize() const ; virtual ~RecordLoaderInterface(); /// Base name. In case the URL is not nice enough to build a clean data filename. virtual std::string base_filename() const ; /// The place where we store the data locally. std::pair< std::string, bool > storage_filename(bool create_dir = false) const ; virtual const char * Url() const { return NULL; } virtual const char * Description() const = 0 ; std::string Timestamp() const; static void SetDataDir( const std::string & data_dir ); }; // RecordLoaderInterface /// Loads records from a file or an Url. template< class Catalog > class RecordLoaderSingleton { static Catalog s_cata_inst ; public: static Catalog & InstCatalog() { return s_cata_inst ; } }; template Catalog RecordLoaderSingleton< Catalog >::s_cata_inst = Catalog(); /// Loads tabular records from a file. template< class Catalog > struct RecordLoader : public RecordLoaderInterface, public RecordLoaderSingleton { }; // RecordLoader void createRecordLoader(); #endif // RECORD_LOADER_H fldigi-4.1.06/src/include/gettext.h0000644000175000017500000002275413472115776014057 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with fldigi. If not, see . */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 #include "config.h" /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String /* The separator between msgctxt and msgid in a .mo file. */ #define GETTEXT_CONTEXT_GLUE "\004" /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be short and rarely need to change. The letter 'p' stands for 'particular' or 'special'. */ #ifdef DEFAULT_TEXT_DOMAIN # define pgettext(Msgctxt, Msgid) \ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #else # define pgettext(Msgctxt, Msgid) \ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #endif #define dpgettext(Domainname, Msgctxt, Msgid) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) #ifdef DEFAULT_TEXT_DOMAIN # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #else # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #endif #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * pgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, int category) { const char *translation = dcgettext (domain, msg_ctxt_id, category); if (translation == msg_ctxt_id) return msgid; else return translation; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * npgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { const char *translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); if (translation == msg_ctxt_id || translation == msgid_plural) return (n == 1 ? msgid : msgid_plural); else return translation; } /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID can be arbitrary expressions. But for string literals these macros are less efficient than those above. */ #include #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ /* || __STDC_VERSION__ >= 199901L */ ) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include #endif #define pgettext_expr(Msgctxt, Msgid) \ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcgettext (domain, msg_ctxt_id, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (translation != msg_ctxt_id) return translation; } return msgid; } #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcnpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (!(translation == msg_ctxt_id || translation == msgid_plural)) return translation; } return (n == 1 ? msgid : msgid_plural); } #if ENABLE_NLS #define _(String) gettext (String) #define N_(String) gettext_noop (String) #else #define _(String) (String) #define N_(String) String #endif #if ENABLE_NLS int setup_nls(void); unused__ static const int nls_init_ = setup_nls(); #endif #endif /* _LIBGETTEXT_H */ fldigi-4.1.06/src/include/cw.h0000644000175000017500000001525213472115776012777 00000000000000// ---------------------------------------------------------------------------- // cw.h -- morse code modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CW_H #define _CW_H #include #include #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #include "view_cw.h" #define CW_SAMPLERATE 8000 #define CWMaxSymLen 4096 // AG1LE: - was 4096 #define CWKNUM 640 // 1/2 dot length at 5 wpm #define MAX_MORSE_ELEMENTS 6 // maximum of 6 elements in a Morse character 256 // CW function return status codes. #define CW_SUCCESS 0 #define CW_ERROR -1 #define ASC_NUL '\0' // End of string #define ASC_SPACE ' ' // ASCII space char // Tone and timing magic numbers. #define KWPM (12 * CW_SAMPLERATE/10) // #samples in dot = KWPM / WPM #define TONE_SILENT 0 // 0Hz = silent 'tone' #define USECS_PER_SEC 1000000 // Microseconds in a second #define INITIAL_SEND_SPEED 18 // Initial send speed in WPM #define INITIAL_RECEIVE_SPEED 18 // Initial receive speed in WPM // Initial adaptive speed threshold #define INITIAL_THRESHOLD ((KWPM / INITIAL_RECEIVE_SPEED) * 2) // Initial noise filter threshold #define INITIAL_NOISE_THRESHOLD ((KWPM / CW_MAX_SPEED) / 2) #define TRACKING_FILTER_SIZE 16 #define MAX_PIPE_SIZE (22 * CW_SAMPLERATE * 12 / 800) enum CW_RX_STATE { RS_IDLE = 0, RS_IN_TONE, RS_AFTER_TONE }; enum CW_EVENT { CW_RESET_EVENT, CW_KEYDOWN_EVENT, CW_KEYUP_EVENT, CW_QUERY_EVENT }; class cw : public modem { #define CLRCOUNT 16 #define DEC_RATIO 16 // Maximum number of signs (dit or dah) in a Morse char. #define WGT_SIZE 7 struct SOM_TABLE { std::string rpr; // The printable representation of the character float wgt[WGT_SIZE]; // Dot-dash weight vector }; protected: int symbollen; // length of a dot in sound samples (tx) int fsymlen; // length of extra interelement space (farnsworth) double phaseacc; // used by NCO for rx/tx tones double FFTphase; double FFTvalue; unsigned int smpl_ctr; // sample counter for timing cw rx double agc_peak; // threshold for tone detection bool use_matched_filter; double upper_threshold; double lower_threshold; fftfilt *cw_FFT_filter; // sinc / matched filter Cmovavg *bitfilter; Cmovavg *trackingfilter; int bitfilterlen; CW_RX_STATE cw_receive_state; // Indicates receive state CW_RX_STATE old_cw_receive_state; CW_EVENT cw_event; // functions used by cw process routine double pipe[MAX_PIPE_SIZE+1]; // storage for sync scope data double clearpipe[MAX_PIPE_SIZE+1]; mbuffer scopedata; int pipeptr; int pipesize; bool scope_clear; // user configurable data - local copy passed in from gui int cw_speed; int cw_bandwidth; int cw_squelch; int cw_send_speed; // Initially 18 WPM int cw_receive_speed; // Initially 18 WPM bool usedefaultWPM; // use default WPM int cw_upper_limit; int cw_lower_limit; long int cw_noise_spike_threshold; // Initially ignore any tone < 10mS int cw_in_sync; // Synchronization flag // Sending parameters: long int cw_send_dot_length; // Length of a send Dot, in Usec long int cw_send_dash_length; // Length of a send Dash, in Usec int lastsym; // last symbol sent double risetime; // leading/trailing edge rise time (msec) int knum; // number of samples on edges int QSKshape; // leading/trailing edge shape factor double qskbuf[OUTBUFSIZE]; // signal array for qsk drive double qskphase; // bool firstelement; double maxval; // double *keyshape; // array defining leading edge // Receiving parameters: long int cw_receive_dot_length; // Length of a receive Dot, in Usec long int cw_receive_dash_length; // Length of a receive Dash, in Usec // Receive buffering std::string rx_rep_buf; int cw_rr_current; // Receive buffer current location unsigned int cw_rr_start_timestamp; // Tone start timestamp unsigned int cw_rr_end_timestamp; // Tone end timestamp long int two_dots; // 2-dot threshold for adaptive speed int in_replay; //AG1LE: if we have replay even, set to 1 otherwise = 0 ; // Receive adaptive speed tracking. double dot_tracking; double dash_tracking; inline double nco(double freq); inline double qsknco(); void update_syncscope(); void clear_syncscope(); void update_Status(); void sync_parameters(); void reset_rx_filter(); int handle_event(int cw_event, std::string &sc); inline int usec_diff(unsigned int earlier, unsigned int later); void send_symbol(int symbol, int len); void send_ch(int c); bool tables_init(); unsigned int tokenize_representation(char *representation); void update_tracking(int dot, int dash); static const SOM_TABLE som_table[]; float cw_buffer[512]; int cw_ptr; int clrcount; double lowerwpm; double upperwpm; int synchscope; double noise_floor; double sig_avg; double siglevel; bool use_paren; std::string prosigns; cmplx mixer(cmplx in); // transmit wave shaping int nusymbollen; int nufsymlen; int wpm; int fwpm; void makeshape(); void sync_transmit_parameters(); fftfilt *cw_xmt_filter; double nbfreq; double nbpf; double lwr; double upr; double *xmt_signal; double *qsk_signal; int qsk_ptr; void nb_filter(double *output, double *qsk, int len); view_cw viewcw; public: cw(); ~cw(); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); void rx_FFTprocess(const double *buf, int len); void rx_FIRprocess(const double *buf, int len); void decode_stream(double); int tx_process(); void incWPM(); void decWPM(); void toggleWPM(); int normalize(float *v, int n, int twodots); std::string find_winner (float *inbuf, int twodots); }; extern bool CW_table_changed; #endif fldigi-4.1.06/src/include/wefax.h0000644000175000017500000000714513472115776013502 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _WEFAX_H #define _WEFAX_H #include "globals.h" #include "modem.h" #include "filters.h" #include "mbuffer.h" #include "logbook.h" /// Forward definition. class fax_implementation ; class wefax : public modem { fax_implementation * m_impl ; bool m_abortxmt; /// For updating the logbook when loading/saving an image file. cQsoRec m_qso_rec ; /// Non-copiable object. wefax (); wefax ( const wefax & ); wefax & operator=( const wefax & ); public: wefax (trx_mode md); virtual ~wefax (); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void shutdown(); int tx_time( int nb_bytes ) const ; bool is_tx_finished( int ix_sample, int nb_sample, const char * msg ) const; void skip_apt(void); void skip_phasing(bool auto_center); void end_reception(void); void set_tx_parameters( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h ); void set_tx_abort_flag(void) { m_abortxmt = true ; } /// Whether reading without end, or apt/phasing/stop. void set_rx_manual_mode( bool manual_flag ); /// There are several possible input filter designated /// by a name, for displaying, and an index. static const char ** rx_filters(void); /// Set by the GUI. void set_rx_filter( int idx_filter ); void set_lpm( int the_lpm ); /// Restores the window label by taking into account wefax state mode. void update_rx_label(void) const ; /// Returns a filename matching current image properties. std::string suggested_filename(void) const ; cQsoRec & qso_rec(void) { return m_qso_rec ; } /// Called before loading/sending an image. void qso_rec_init(void); /// Called when transmitting/receiving is finished. void qso_rec_save(void); void set_freq(double); /// Helper string indicating the internal state of the wefax engine. std::string state_string(void) const; /// Maximum wait time when getting information about received and sent files. static const int max_delay = 3600 * 24 * 365 ; /// Called by the engine when a file is received. void put_received_file(const std::string & filnam); /// Used by XML-RPC to get the list of received files. std::string get_received_file(int max_seconds=max_delay); /// Called by XML-RPC to send a file which resides on the machine where fldigi runs. std::string send_file( const std::string & filnam, double max_seconds=max_delay); /// Called before sending a file. Transmitting is an exclusive process. bool transmit_lock_acquire( const std::string & filnam, double max_seconds=max_delay); /// Called after sending a file so another sending can take place. void transmit_lock_release( const std::string & err_msg ); }; #endif fldigi-4.1.06/src/include/utf8file_io.h0000644000175000017500000000213013472115776014572 00000000000000// ---------------------------------------------------------------------------- // utf8file_io.h // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef UTF8_FILE_IO #define UTF8_FILE_IO #include int UTF8_readfile ( const char *file, std::string &textread ); int UTF8_writefile( const char *file, std::string &textwrite ); #endif fldigi-4.1.06/src/include/feld.h0000644000175000017500000000500413472115776013272 00000000000000// ---------------------------------------------------------------------------- // feld.h -- FELDHELL modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FELD_H #define _FELD_H #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #define FeldSampleRate 8000 #define FeldMaxSymLen 1024 #define MAXLEN 512 #define FELD_COLUMN_LEN 14 class feld : public modem { enum FELD_STATE {PREAMBLE, POSTAMBLE, DATA}; protected: int RxColumnLen; int TxColumnLen; //rx double rxphacc; double rxdelta; double rxcounter; double agc; double peakval; double peakhold; double minhold; double rxpixrate; double txpixrate; double downsampleinc; double upsampleinc; double phi2freq; C_FIR_filter *hilbert; fftfilt *bpfilt; Cmovavg *bbfilt; Cmovavg *minmaxfilt; Cmovavg *average; //tx FELD_STATE tx_state; double txphacc; double txcounter; double hell_bandwidth; double filter_bandwidth; int depth; double feldcolumnrate; int hardkeying; int preamble; int postamble; int prevsymb; cmplx prev; double OnShape[MAXLEN]; double OffShape[MAXLEN]; mbuffer col_data; int col_pointer; int fntnbr; cmplx mixer(cmplx); double nco(double); void rx(cmplx); void FSKHELL_rx(cmplx); void send_symbol(int currsymbol, int nextsymbol); void send_null_column(); void tx_char(char); void initKeyWaveform(); public: feld(trx_mode); ~feld(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); int get_font_data(unsigned char c, int col); }; #endif fldigi-4.1.06/src/include/mbuffer.h0000644000175000017500000002326213472115777014015 00000000000000// ---------------------------------------------------------------------------- // mbuffer.h // // Copyright (C) 2007 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // A simple vector wrapper for fldigi's double-buffering needs. // Most vector operations are provided for mbuffers by redirecting them to the // current vector. // The template arguments are // 1) T - the type // 2) S - the apparent mbuffer size, i.e., the size of each vector. Defaults to 0. // A mbuffer instantiated with S == 0 is not very useful until resized // with alloc(). // 3) N - the number of vectors that we can cycle between. Defaults to 1. // Things to note: // 1) There is a T* conversion operator // 2) Operations that modify the length of the container are not provided // 3) Comparison operators are not implemented (but see (1)!) // 4) mbuffer is meant to be used when we don't know the size at // compile time, in which case we resize with alloc. The compiler will treat // mbuffers resized to different lengths in this way as objects of the same type. #ifndef MBUFFER_H #define MBUFFER_H #include #include #ifndef NDEBUG #include #include #endif #ifndef NDEBUG template class mbuffer; template std::ostream& operator<<(std::ostream& o, const mbuffer& b); #endif // NDEBUG template class mbuffer { protected: std::vector data[N]; mutable std::size_t cur; public: explicit mbuffer(void) { alloc(S); } explicit mbuffer(std::size_t n) { alloc(n); } mbuffer(const std::vector& v) { data[0] = v; // resize 1 to N only alloc(data[0].size(), 1); } mbuffer(const T* a, std::size_t n) { data[0].assign(a, a + n); // resize 1 to N only alloc(n, 1); } void alloc(std::size_t n, std::size_t start = 0) { for (size_t i = start; i < N; ++i) data[i].resize(n); cur = 0; } typedef typename std::vector::iterator iterator; typedef typename std::vector::const_iterator const_iterator; iterator begin(void) { return data[cur].begin(); } const_iterator begin(void) const { return data[cur].begin(); } iterator end(void) { return data[cur].end(); } const_iterator end(void) const { return data[cur].end(); } typedef typename std::vector::reverse_iterator reverse_iterator; typedef typename std::vector::const_reverse_iterator const_reverse_iterator; reverse_iterator rbegin(void) { return reverse_iterator(end()); } const_reverse_iterator rbegin(void) const { return const_reverse_iterator(end()); } reverse_iterator rend(void) { return reverse_iterator(begin()); } const_reverse_iterator rend(void) const { return const_reverse_iterator(begin()); } typedef typename std::vector::value_type value_type; typedef typename std::vector::reference reference; typedef typename std::vector::const_reference const_reference; typedef typename std::vector::size_type size_type; typedef typename std::vector::difference_type difference_type; // These should be the same for all vectors in data[] size_type size(void) { return data[0].size(); } size_type max_size(void) { return data[0].max_size(); } size_type capacity(void) { return data[0].capacity(); } bool empty(void) { return data[0].empty(); } // Instead of these, we provide a conversion operator for T* // reference operator[](size_type i) { return data[cur][i]; } // const_reference operator[](size_type i) const { return data[cur][i]; } reference at(size_type i) { return data[cur].at(i); } const_reference at(size_type i) const { return data[cur].at(i); } reference front(void) { return data[cur].front(); } const_reference front(void) const { return data[cur].front(); } reference back(void) { return data[cur].back(); } const_reference back(void) const { return data[cur].back(); } // Operations that modify the size of data[cur] might invalidate // pointers to internal buffers. The rest of the data vectors would need // to be resized, e.g. with check_size below. For this reason these // operations are not provided, but are included here for completeness // void check_size(void) // { // for (size_t i = 0; i < N; ++i) // if (data[i].size() != data[cur].size()) // data[i].resize(data[cur].size()); // } // mbuffer& operator=(const mbuffer& o) // { // for (int i = 0; i < N; ++i) // std::copy(o.data[i].begin(), o.data[i].end(), data[i].begin()); // return *this; // } // std::vector& operator=(const std::vector& o) // { // std::copy(o.begin(), o.end(), data[cur].begin()); // check_size(); // return data[cur]; // } // The methods below would modify the length of the vector. // We would need to check_size() before returning from them. // There is no vector::assign; the one provided here fills the vector // with copies of the same value without causing a resize. void assign(const_reference v) { std::fill_n(begin(), size(), v); } // template // void assign(input_iterator first, input_iterator last) // { // data[cur].assign(first, last); // } // void push_back(const_reference v) { data[cur].push_back(v); } // void pop_back(void) { data[cur].pop_back(); } // iterator insert(iterator pos, const_reference v) // { // return data[cur].insert(pos, v); // } // iterator insert(iterator pos, size_type n, const_reference v) // { // return data[cur].insert(pos, n, v); // } // template // void insert(iterator pos, input_iterator first, input_iterator last) // { // data[cur].insert(pos, first, last); // } // iterator erase(iterator pos) { return data[cur].erase(pos); } // iterator erase(iterator first, iterator last) { return data[cur].erase(first, last); } // void clear(void) { data[cur].clear(); } void swap(mbuffer& o) { for (int i = 0; i < N; ++i) std::swap(data[i].begin(), data[i].end(), o.data[i].begin()); } // void swap(std::vector& o) // { // std::swap(data[cur].begin(), data[cur].end(), o.begin()); // check_size(); // o.check_size(); // } // and now for something completely different void next(void) const { if (++cur == N) cur = 0; } void prev(void) const { if (cur > 0) --cur; } void reset(void) const { cur = 0; } T* c_array(void) { return &data[cur][0]; } operator T*(void) { return c_array(); } const T* c_array(void) const { return &data[cur][0]; } operator const T*(void) const { return c_array(); } std::vector& vec(void) { return data[cur]; } const std::vector& vec(void) const { return data[cur]; } // We also do not provide vector conversions // operator std::vector&(void) { return vec(); } // operator const std::vector&(void) const { return vec(); } std::size_t idx(void) { return cur; } std::size_t nvec(void) { return N; } std::vector* vecp(std::size_t i) { return &data[i]; } #ifndef NDEBUG friend std::ostream& operator<<<>(std::ostream& o, const mbuffer& b); #endif // NDEBUG }; #ifndef NDEBUG template std::ostream& operator<<(std::ostream& o, const mbuffer& b) { for (std::size_t i = 0; i < N; ++i) { o << '<' << i << ">\n"; copy(b.data[i].begin(), b.data[i].end(), std::ostream_iterator(o, "\n")); } return o; } #endif // NDEBUG template inline void swap(mbuffer& a, mbuffer& b) { a.swap(b); } #endif // MBUFFER_H // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/thorvaricode.h0000644000175000017500000000205113472115776015050 00000000000000// ---------------------------------------------------------------------------- // thorvaricode.h -- DEX Varicode // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _DEXVARICODE_H #define _DEXVARICODE_H extern const char *thorvarienc(int c, int secondary); extern int thorvaridec(unsigned int symbol); #endif fldigi-4.1.06/src/include/filters.h0000644000175000017500000001065713472115776014042 00000000000000// ---------------------------------------------------------------------------- // // filters.h -- Several Digital Filter classes used in fldigi // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters are based on the // gmfsk design and the design notes given in // "Digital Signal Processing", A Practical Guid for Engineers and Scientists // by Steven W. Smith. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FILTER_H #define _FILTER_H #include "complex.h" #ifndef M_PI #define M_PI (3.1415926535897932385) #endif //===================================================================== // FIR filters //===================================================================== class C_FIR_filter { #define FIRBufferLen 4096 private: int length; int decimateratio; double *ifilter; double *qfilter; double ffreq; double ibuffer[FIRBufferLen]; double qbuffer[FIRBufferLen]; int pointer; int counter; cmplx fu; inline double sinc(double x) { if (fabs(x) < 1e-10) return 1.0; else return sin(M_PI * x) / (M_PI * x); } inline double cosc(double x) { if (fabs(x) < 1e-10) return 0.0; else return (1.0 - cos(M_PI * x)) / (M_PI * x); } inline double hamming(double x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } inline double mac(const double *a, const double *b, unsigned int size) { double sum = 0.0; double sum2 = 0.0; double sum3 = 0.0; double sum4 = 0.0; // Reduces read-after-write dependencies : Each subsum does not wait for the others. // The CPU can therefore schedule each line independently. for (; size > 3; size -= 4, a += 4, b+=4) { sum += a[0] * b[0]; sum2 += a[1] * b[1]; sum3 += a[2] * b[2]; sum4 += a[3] * b[3]; } for (; size; --size) sum += (*a++) * (*b++); return sum + sum2 + sum3 + sum4 ; } protected: public: C_FIR_filter (); ~C_FIR_filter (); void init (int len, int dec, double *ifil, double *qfil); void init_lowpass (int len, int dec, double freq ); void init_bandpass (int len, int dec, double freq1, double freq2); void init_hilbert (int len, int dec); double *bp_FIR(int len, int hilbert, double f1, double f2); void dump(); int run (const cmplx &in, cmplx &out); int Irun (const double &in, double &out); int Qrun (const double &in, double &out); }; //===================================================================== // Moving average filter //===================================================================== class Cmovavg { #define MAXMOVAVG 2048 private: double *in; double out; int len, pint; bool empty; public: Cmovavg(int filtlen = 64); ~Cmovavg(); double run(double a); void setLength(int filtlen); void reset(); double value() { return out / (len > 0 ? len : 1); } }; //===================================================================== // Sliding FFT //===================================================================== class sfft { #define K1 0.99999999999L private: int fftlen; int first; int last; int ptr; struct vrot_bins_pair ; vrot_bins_pair * __restrict__ vrot_bins ; cmplx * __restrict__ delay; double k2; int count; public: sfft(int len, int first, int last); ~sfft(); bool is_stable(); void reset(); void run(const cmplx& input, cmplx * __restrict__ result, int stride ); }; //============================================================================= // Goertzel DFT //============================================================================= class goertzel { private: int N; int count; double Q0; double Q1; double Q2; double k1; double k2; double k3; public: goertzel(int n, double freq, double sr); ~goertzel(); void reset(); void reset(int n, double freq, double sr); bool run(double v); double real(); double imag(); double mag(); }; #endif /* _FILTER_H */ fldigi-4.1.06/src/include/view_cw.h0000644000175000017500000000632013472115777014026 00000000000000// ---------------------------------------------------------------------------- // view_cw.h -- cw modem // // Copyright (C) 2008 // Dave Freese, W1HKJ // Modified for CW decoder // Copyright (C) 2014 // Mauri Niininen, AG1LE // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VIEWCW_H #define _VIEWCW_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "morse.h" #define VCW_MAXCH 30 #define VCW_DEC_RATIO 16 #define VCW_SAMPLERATE 8000 // VKWPM conversion factor // # samples per dot = VKWPM / wpm // 30 samples @ 20 wpm // 15 samples @ 40 wpm #define VKWPM 600 // ((12 * VCW_SAMPLERATE/10) / VCW_DEC_RATIO) class view_cw; struct CW_CHANNEL { static cMorse *morse; fftfilt *VCW_filter; // linear phase finite impulse response bpf Cmovavg bitfilter; Cmovavg trackingfilter; int ch; double phase; double phase_increment; double ch_freq; double agc_peak; double sig_avg; double value; double phi1; double phi2; int smpl_ctr; int dec_ctr; cmplx zout; int timeout; std::string decode_str; std::string rx_rep_buf; int cw_receive_state; int two_dots; double norm_sig; double CWupper; double CWlower; double noise_floor; int cw_rr_start_timestamp; int cw_rr_end_timestamp; int curr_element; int last_element; int space_sent; int clrcount; int _ch; double metric; double lowerwpm; double upperwpm; CW_CHANNEL(); ~CW_CHANNEL(); int cw_lower_limit; int cw_upper_limit; void init(int ch, double freq); void update_tracking(int dot, int dash); inline int sample_count(unsigned int earlier, unsigned int later); void sync_parameters(); void reset(); int decode_state(int cw_event); void detect_tone(); void rx_process(const double *value, int len); double avg_signal() { return sig_avg; } double get_metric() { return metric; } void set_noise_floor(double nf) { noise_floor = nf; } double get_chfreq() { return ch_freq; } }; #define PEAKS_SIZE 4000 struct PEAKS { double mx[PEAKS_SIZE]; double mn[PEAKS_SIZE]; int mxpos[PEAKS_SIZE]; int mnpos[PEAKS_SIZE]; int mxcount; int mncount; }; class view_cw { private: trx_mode viewmode; double bandwidth; int nchannels; unsigned int smpl_ctr; public: CW_CHANNEL channel[VCW_MAXCH]; view_cw(); ~view_cw(); void init(); void restart(); void rx_init(){}; void tx_init(SoundBase *sc){}; int rx_process(const double *buf, int len); int get_freq(int n); void clear(); void clearch(int n); }; #endif fldigi-4.1.06/src/include/navtex.h0000644000175000017500000000275613472115776013700 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _NAVTEX_H #define _NAVTEX_H /// Forward definition. class navtex_implementation ; #include #include "modem.h" class navtex : public modem { navtex_implementation * m_impl ; /// Non-copiable object. navtex(); navtex(const navtex *); navtex & operator=(const navtex *); public: navtex (trx_mode md); virtual ~navtex(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); void set_freq( double ); std::string get_message(int max_seconds); std::string send_message(const std::string & msg); }; #endif fldigi-4.1.06/src/include/dominovar.h0000644000175000017500000000201213472115776014352 00000000000000/* * varicode.h -- DominoEX Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #ifndef _DOMVARICODE_H #define _DOMVARICODE_H #define MAX_VARICODE_LEN 3 extern unsigned char *dominoex_varienc(unsigned char c, int secondary); extern int dominoex_varidec(unsigned int symbol); #endif fldigi-4.1.06/src/include/ptt.h0000644000175000017500000000507513472115777013200 00000000000000// ---------------------------------------------------------------------------- // // ptt.h -- PTT control // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef PTT_H_ #define PTT_H_ #include #if HAVE_LINUX_PPDEV_H || HAVE_DEV_PPBUS_PPI_H # define HAVE_PARPORT 1 #else # define HAVE_PARPORT 0 #endif #ifdef __APPLE__ # define HAVE_UHROUTER 1 # define UHROUTER_FIFO_PREFIX "/tmp/microHamRouter" #else # define HAVE_UHROUTER 0 #endif #if HAVE_TERMIOS_H # define HAVE_TTYPORT 1 #else # define HAVE_TTYPORT 0 #endif struct termios; #ifdef __MINGW32__ # include "serial.h" #endif class PTT { public: // The ptt_t enums must be defined even if the corresponding // code is not compiled. New tags go to the end of the list. enum ptt_t { PTT_INVALID = -1, PTT_NONE, PTT_HAMLIB, PTT_RIGCAT, PTT_TTY, PTT_PARPORT, PTT_UHROUTER, PTT_GPIO }; PTT(ptt_t dev = PTT_NONE); ~PTT(); void set(bool on); void reset(ptt_t dev); private: ptt_t pttdev; // tty and parport int pttfd; struct termios* oldtio; #if HAVE_UHROUTER // uhrouter int uhkfd[2]; // keyer int uhfd[2]; // ptt #endif #ifdef __MINGW32__ Cserial serPort; #endif void close_all(void); void open_tty(void); void set_tty(bool ptt); void close_tty(void); void open_gpio(void); void set_gpio(bool ptt); void close_gpio(void); #if HAVE_PARPORT void open_parport(void); void set_parport(bool ptt); void close_parport(void); #endif #if HAVE_UHROUTER void open_uhrouter(void); void set_uhrouter(bool ptt); void close_uhrouter(void); #endif }; #endif // PTT_H_ fldigi-4.1.06/src/include/Panel.h0000644000175000017500000000233013472115776013416 00000000000000// ---------------------------------------------------------------------------- // Panel_Check.h // // Copyright (C) 2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef Panel_h_ #define Panel_h_ #include class Panel : public Fl_Group { public: int handle(int); Panel(int X,int Y,int W,int H,const char*l=0) : Fl_Group(X,Y,W,H,l) { clip_children(true); } void resize(int, int, int, int); void position(int, int, int, int); int orgx(); int orgy(); }; #endif fldigi-4.1.06/src/include/arq_io.h0000644000175000017500000000314013472115776013631 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef ARQIO_H #define ARQIO_H class Socket; extern void WriteARQsocket(unsigned char* data, size_t len); extern bool Socket_arqRx(); extern void AbortARQ(); extern void pskmail_notify_rsid(trx_mode mode); extern void pskmail_notify_s2n(double s2n_count, double s2n_avg, double s2n_stddev); extern void flush_arq_tx_buffer(void); class ARQ_SOCKET_Server { public: static bool start(const char* node, const char* service); static void stop(void); private: ARQ_SOCKET_Server(); ~ARQ_SOCKET_Server(); ARQ_SOCKET_Server(const ARQ_SOCKET_Server&); ARQ_SOCKET_Server operator=(const ARQ_SOCKET_Server&); static void* thread_func(void*); private: static ARQ_SOCKET_Server* inst; bool run; Socket* server_socket; }; #endif // ARQIO_H fldigi-4.1.06/src/include/mt63.h0000644000175000017500000000320713472115776013154 00000000000000// ---------------------------------------------------------------------------- // mt63.h // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef MT63_MODEM_H #define MT63_MODEM_H #include "dsp.h" #include "mt63base.h" #include "modem.h" class mt63 : public modem { #define TONE_AMP 0.8 private: int Interleave; int flush; int escape; bool long_integral; MT63tx *Tx; MT63rx *Rx; dspLevelMonitor *InpLevel; double_buff *InpBuff; double_buff *emptyBuff; bool flushbuffer; double maxval; public: mt63(trx_mode mode); ~mt63(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); void rx_flush(); void set_freq(double); }; #endif fldigi-4.1.06/src/include/field_def.h0000664000175000017500000000500313507401670014250 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FIELD_DEFS #define FIELD_DEFS // removed unused fields to reduce size of each record and speed up // record processing // field position should correspond with fields[] in adif_io.cxx enum ADIF_FIELD_POS { FREQ = 0, CALL, ADIF_MODE, SUBMODE, NAME, QSO_DATE, QSO_DATE_OFF, TIME_OFF, TIME_ON, QTH, RST_RCVD, RST_SENT, STATE, VE_PROV, NOTES, QSLRDATE, QSLSDATE, EQSLRDATE, EQSLSDATE, LOTWRDATE, LOTWSDATE, GRIDSQUARE, BAND, CNTY, COUNTRY, CQZ, DXCC, QSL_VIA, IOTA, ITUZ, CONT, SRX, STX, XCHG1, MYXCHG, CLASS, ARRL_SECT, TX_PWR, OP_CALL, STA_CALL, MY_GRID, MY_CITY, SS_SERNO, SS_PREC, SS_CHK, SS_SEC, AGE, TEN_TEN, CHECK, FD_CLASS, // for backward compatible logbook reads FD_SECTION, // for backward compatible logbook reads TROOPS, // JOTA scout troop sent TROOPR, // JOTA scout troop received SCOUTS, // JOTA scout name sent SCOUTR, // JOTA scout name received // do not add fields below this line; EXPORT must be last field in struc EXPORT, // flag used internally in fldigi's logbook NUMFIELDS }; // ADIF multiline string is a sequence of Characters and line-breaks, // where a line break is an ASCII CR (code 13) followed immediately by an ASCII LF (code 10) // Not sure fldigi is completely conformant with this. // #define ADIF_EOL "\r\n" #define ADIF_EOL "\n" // Forward declaration for QsoHelper. class cQsoRec ; // Helps for creating a new ADIF record. class QsoHelper { cQsoRec * qso_rec ; QsoHelper(); QsoHelper(const QsoHelper &); QsoHelper & operator=(const QsoHelper &); public: QsoHelper(int mode); ~QsoHelper(); // Inserts a key-value pair. void Push( ADIF_FIELD_POS pos, const std::string & value ); }; #endif fldigi-4.1.06/src/include/spectrum.h0000644000175000017500000000352513472115776014230 00000000000000// ---------------------------------------------------------------------------- // digiscope.h, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef SPECTRUM_H #define SPECTRUM_H #include #include "digiscope.h" class spectrum : public Digiscope { public: private: bool _paused; double _freq; double _db; double _db_diff; double _f_diff; double _gofreq; void handle_shift_leftclick(int x); void handle_leftclick( int x, int y); void handle_rightclick( int x, int y); public: spectrum(int, int, int, int); ~spectrum(); bool paused() { return _paused; } void paused(bool on) { _paused = on; } double freq() { return _freq; } double db() { return _db; } double db_diff() { return _db_diff; } double f_diff() { return _f_diff; } double gofreq() { return _gofreq; } void gofreq(double f) { _gofreq = f; } int handle(int); }; #endif fldigi-4.1.06/src/include/olivia.h0000644000175000017500000000405313472115776013646 00000000000000// ---------------------------------------------------------------------------- // olivia.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _OLIVIA_H #define _OLIVIA_H #include "modem.h" #include "jalocha/pj_mfsk.h" #include "sound.h" #define TONE_DURATION (SCBLOCKSIZE * 16) #define SR4 ((TONE_DURATION) / 4) class olivia : public modem { private: MFSK_Transmitter < double >*Tx; MFSK_Receiver < double >*Rx; double *txfbuffer; int txbufferlen; double phaseacc; cmplx prevsymbol; int preamble; unsigned int shreg; double np; double sp; double sigpwr; double noisepwr; int escape; int smargin; int sinteg; int tones; int bw; double tone_bw; int preamblesent; int postamblesent; double preamblephase; double txbasefreq; double tone_midfreq; double lastfreq; double ampshape[SR4]; double tonebuff[TONE_DURATION]; double nco(double freq); void send_tones(); public: olivia(trx_mode omode = MODE_OLIVIA); ~olivia(); void init(); void rx_init(); void rx_flush(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); int unescape(int c); }; #endif fldigi-4.1.06/src/include/fontdef.h0000644000175000017500000000321413472115776014006 00000000000000// ------------------------------------------------------------------------------ // // fontdef.h -- FELDHELL modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FONTDEF_H #define _FONTDEF_H struct fntchr { char c; int byte[14]; }; extern fntchr feld7x7_14[]; extern fntchr feld7x7n_14[]; extern fntchr feldDx_14[]; extern fntchr feldfat_14[]; extern fntchr feldhell_12[]; extern fntchr feldlittle_12[]; extern fntchr feldlo8_14[]; extern fntchr feldlow_14[]; extern fntchr feldmodern_14[]; extern fntchr feldmodern8_14[]; extern fntchr feldnarr_14[]; extern fntchr feldreal_14[]; extern fntchr feldstyl_14[]; extern fntchr feldvert_14[]; extern fntchr feldwide_14[]; extern char szFeldFonts[]; #endif fldigi-4.1.06/src/include/record_loader_gui.h0000644000175000017500000000305413472115776016033 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RECORD_LOADER_GUI_H #define RECORD_LOADER_GUI_H #include #include class RecordLoaderInterface ; class DerivedRecordLst : public Fl_Table { DerivedRecordLst(); DerivedRecordLst( const DerivedRecordLst & ); DerivedRecordLst & operator=( const DerivedRecordLst & ); public: DerivedRecordLst(int, int, int, int, const char * title = 0); virtual ~DerivedRecordLst(); static void cbGuiUpdate(); static void cbGuiReset(); void AddRow(int R); void DrawRow(int R); protected: void draw_cell(TableContext context, // table cell drawing int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0); }; #endif // RECORD_LOADER_GUI_H fldigi-4.1.06/src/include/benchmark.h0000644000175000017500000000237413472115776014321 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef BENCHMARK_H_ #define BENCHMARK_H_ #include #include #include "globals.h" struct benchmark_params { trx_mode modem; int freq; bool afc, sql; double sqlevel; double src_ratio; int src_type; std::string input, output, buffer; size_t samples; }; extern struct benchmark_params benchmark; int setup_benchmark(void); void do_benchmark(void); #endif fldigi-4.1.06/src/include/Fl_Text_Buffer_mod.H0000644000175000017500000006670113472115777016031 00000000000000// // "$Id: Fl_Text_Buffer_mod.H 8148 2010-12-31 22:38:03Z matt $" // // Header file for Fl_Text_Buffer_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Buffer_mod, Fl_Text_Selection_mod widget . */ #ifndef Fl_Text_Buffer_mod_H #define Fl_Text_Buffer_mod_H #undef ASSERT_UTF8 #ifdef ASSERT_UTF8 # include # define IS_UTF8_ALIGNED(a) if (a && *a) assert(fl_utf8len(*(a))>0); # define IS_UTF8_ALIGNED2(a, b) if (b>=0 && blength()) assert(fl_utf8len(a->byte_at(b))>0); #else # define IS_UTF8_ALIGNED(a) # define IS_UTF8_ALIGNED2(a, b) #endif /* "character size" is the size of a UTF-8 character in bytes "character width" is the width of a Unicode character in pixels "column" was orginally defined as a character offset from the left margin. It was identical to the byte offset. In UTF-8, we have neither a byte offset nor truly fixed width fonts (*). Column could be a pixel value multiplied with an average character width (which is a bearable approximation). * in Unicode, there are no fixed width fonts! Even if the ASCII characters may happen to be all the same width in pixels, chinese charcaters surely are not. There are plenty of exceptions, like ligatures, that make special handling of "fixed" character widths a nightmare. I decided to remove all references to fixed fonts and see "columns" as a multiple of the average width of a character in the main font. - Matthias */ /* Maximum length in characters of a tab or control character expansion of a single buffer character */ #define FL_TEXT_MAX_EXP_CHAR_LEN 20 #include /** \class Fl_Text_Selection_mod \brief This is an internal class for Fl_Text_Buffer_mod to manage text selections. This class works correctly with utf-8 strings assuming that the parameters for all calls are on character boundaries. */ class FL_EXPORT Fl_Text_Selection_mod { friend class Fl_Text_Buffer_mod; public: /** \brief Set the selection range. \param start byte offset to first selected character \param end byte offset pointing after last selected character */ void set(int start, int end); /** \brief Updates a selection afer text was modified. Updates an individual selection for changes in the corresponding text \param pos byte offset into text buffer at which the change occured \param nDeleted number of bytes deleted from the buffer \param nInserted number of bytes inserted into the buffer */ void update(int pos, int nDeleted, int nInserted); /** \brief Return the byte offset to the first selected character. \return byte offset */ int start() const { return mStart; } /** \brief Return the byte ofsset to the character after the last selected character. \return byte offset */ int end() const { return mEnd; } /** \brief Returns true if any text is selected. \return a non-zero number if any text has been selected, or 0 if no text is selected. */ bool selected() const { return mSelected; } /** \brief Modify the 'selected' flag. \param b new flag */ void selected(bool b) { mSelected = b; } /** Return true if position \p pos with indentation \p dispIndex is in the Fl_Text_Selection_mod. */ int includes(int pos) const; /** \brief Return the positions of this selection. \param start retrun byte offset to first selected character \param end retrun byte offset pointing after last selected character \return true if selected */ int position(int* start, int* end) const; protected: int mStart; ///< byte offset to the first selected character int mEnd; ///< byte offset to the character after the last selected character bool mSelected; ///< this flag is set if any text is selected }; typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); typedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg); /** \brief This class manages unicode displayed in one or more Fl_Text_Display_mod widgets. All text in Fl_Text_Buffer_modmust be encoded in UTF-8. All indices used in the function calls must be aligned to the start of a UTF-8 sequence. All indices and pointers returned will be aligned. All functions that return a single character will return that in an unsiged int in UCS-4 encoding. The Fl_Text_Buffer_mod class is used by the Fl_Text_Display_mod and Fl_Text_Editor_mod to manage complex text data and is based upon the excellent NEdit text editor engine - see http://www.nedit.org/. */ class FL_EXPORT Fl_Text_Buffer_mod { public: /** Create an empty text buffer of a pre-determined size. \param requestedSize use this to avoid unnecessary re-allocation if you know exactly how much the buffer will need to hold \param preferredGapSize Initial size for the buffer gap (empty space in the buffer where text might be inserted if the user is typing sequential chars) */ Fl_Text_Buffer_mod(int requestedSize = 0, int preferredGapSize = 1024); /** Frees a text buffer */ ~Fl_Text_Buffer_mod(); /** \brief Returns the number of bytes in the buffer. \return size of text in bytes */ int length() const { return mLength; } /** \brief Get a copy of the entire contents of the text buffer. Memory is allocated to contain the returned string, which the caller must free. \return newly allocated text buffer - must be free'd, text is utf8 */ char* text() const; /** Replaces the entire contents of the text buffer. \param text Text must be valid utf8. */ void text(const char* text); /** \brief Get a copy of a part of the text buffer. Return a copy of the text between \p start and \p end character positions from text buffer \p buf. Positions start at 0, and the range does not include the character pointed to by \p end. When you are done with the text, free it using the free() function. \param start byte offset to first character \param end byte offset after last character in range \return newly allocated text buffer - must be free'd, text is utf8 */ char* text_range(int start, int end) const; /** Returns the UCS-4 character at the specified position pos in the buffer. Positions start at 0 \param pos byte offset into buffer, pos must be at a character boundary \return Unicode UCS-4 encoded character */ unsigned int char_at(int pos) const; /** Returns the UTF-8 character at the specified position pos in the buffer. Positions start at 0 param pos byte offset into buffer, pos must be at a character boundary return Unicode UTF-8 encoded character return length of Unicode encoded character in len */ unsigned int get_char_at(int pos, int &len) const; /** Returns the raw byte at the specified position pos in the buffer. Positions start at 0 \param pos byte offset into buffer \return unencoded raw byte */ char byte_at(int pos) const; /** Convert a byte offset in buffer into a memory address. \param pos byte offset into buffer \return byte offset converted to a memory address */ const char *address(int pos) const { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } /** Convert a byte offset in buffer into a memory address. \param pos byte offset into buffer \return byte offset converted to a memory address */ char *address(int pos) { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } /** Inserts null-terminated string \p text at position \p pos. \param pos insertion position as byte offset (must be utf-8 character aligned) \param text utf-8 encoded and nul terminated text */ void insert(int pos, const char* text); /** Appends the text string to the end of the buffer. \param t utf-8 encoded and nul terminated text */ void append(const char* t) { insert(length(), t); } /** Deletes a range of characters in the buffer. \param start byte offset to first character to be removed \param end byte offset to charcatre after last character to be removed */ void remove(int start, int end); /** Deletes the characters between \p start and \p end, and inserts the null-terminated string \p text in their place in the buffer. \param start byte offset to first character to be removed and new insert position \param end byte offset to charcatre after last character to be removed \param text utf-8 encoded and nul terminated text */ void replace(int start, int end, const char *text); /** Copies text from one buffer to this one. \param fromBuf source text buffer may be the same as this \param fromStart byte offset into buffer \param fromEnd byte offset into buffer \param toPos destination byte offset into buffer */ void copy(Fl_Text_Buffer_mod* fromBuf, int fromStart, int fromEnd, int toPos); /** Undo text modification according to the undo variables or insert text from the undo buffer */ int undo(int *cp=0); /** Lets the undo system know if we can undo changes */ void canUndo(char flag=1); /** Inserts a file at the specified position. Returns 0 on success, non-zero on error (strerror() contains reason). 1 indicates open for read failed (no data loaded). 2 indicates error occurred while reading data (data was partially loaded). File can be UTF-8 or CP1252-encoded. If the input file is not UTF-8-encoded, the Fl_Text_Buffer_mod widget will contain UTF-8-transcoded data. By default, the message Fl_Text_Buffer_mod::file_encoding_warning_message will warn the user about this. \see input_file_was_transcoded and transcoding_warning_action. */ int insertfile(const char *file, int pos, int buflen = 128*1024); /** Appends the named file to the end of the buffer. See also insertfile(). */ int appendfile(const char *file, int buflen = 128*1024) { return insertfile(file, length(), buflen); } /** Loads a text file into the buffer. See also insertfile(). */ int loadfile(const char *file, int buflen = 128*1024) { select(0, length()); remove_selection(); return appendfile(file, buflen); } /** Writes the specified portions of the file to a file. Returns 0 on success, non-zero on error (strerror() contains reason). 1 indicates open for write failed (no data saved). 2 indicates error occurred while writing data (data was partially saved). */ int outputfile(const char *file, int start, int end, int buflen = 128*1024); /** Saves a text file from the current buffer */ int savefile(const char *file, int buflen = 128*1024) { return outputfile(file, 0, length(), buflen); } /** Gets the tab width. */ int tab_distance() const { return mTabDist; } /** Set the hardware tab distance (width) used by all displays for this buffer, and used in computing offsets for rectangular selection operations. */ void tab_distance(int tabDist); /** Selects a range of characters in the buffer. */ void select(int start, int end); /** Returns a non 0 value if text has been selected, 0 otherwise */ int selected() const { return mPrimary.selected(); } /** Cancels any previous selection on the primary text selection object */ void unselect(); /** Gets the selection position */ int selection_position(int* start, int* end); /** Returns the currently selected text. When you are done with the text, free it using the free() function. */ char* selection_text(); /** Removes the text in the primary selection. */ void remove_selection(); /** Replaces the text in the primary selection. */ void replace_selection(const char* text); /** Selects a range of characters in the secondary selection. */ void secondary_select(int start, int end); /** Returns a non 0 value if text has been selected in the secondary text selection, 0 otherwise */ int secondary_selected() { return mSecondary.selected(); } /** Clears any selection in the secondary text selection object. */ void secondary_unselect(); /** Returns the current selection in the secondary text selection object. */ int secondary_selection_position(int* start, int* end); /** Returns the text in the secondary selection. When you are done with the text, free it using the free() function. */ char* secondary_selection_text(); /** Removes the text from the buffer corresponding to the secondary text selection object. */ void remove_secondary_selection(); /** Replaces the text from the buffer corresponding to the secondary text selection object with the new string \p text. */ void replace_secondary_selection(const char* text); /** Highlights the specified text within the buffer. */ void highlight(int start, int end); /** Returns the highlighted text. When you are done with the text, free it using the free() function. */ int highlight() { return mHighlight.selected(); } /** Unhighlights text in the buffer. */ void unhighlight(); /** Highlights the specified text between \p start and \p end within the buffer. */ int highlight_position(int* start, int* end); /** Returns the highlighted text. When you are done with the text, free it using the free() function. */ char* highlight_text(); /** Adds a callback function that is called whenever the text buffer is modified. The callback function is declared as follows: \code typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); \endcode */ void add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); /** Removes a modify callback. */ void remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); /** Calls all modify callbacks that have been registered using the add_modify_callback() method. */ void call_modify_callbacks() { call_modify_callbacks(0, 0, 0, 0, 0); } /** Adds a callback routine to be called before text is deleted from the buffer. */ void add_predelete_callback(Fl_Text_Predelete_Cb bufPredelCB, void* cbArg); /** Removes a callback routine \p bufPreDeleteCB associated with argument \p cbArg to be called before text is deleted from the buffer. */ void remove_predelete_callback(Fl_Text_Predelete_Cb predelCB, void* cbArg); /** Calls the stored pre-delete callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_predelete_callbacks() { call_predelete_callbacks(0, 0); } /** Returns the text from the entire line containing the specified character position. When you are done with the text, free it using the free() function. \param pos byte index into buffer \return copy of utf8 text, must be free'd */ char* line_text(int pos) const; /** Returns the position of the start of the line containing position \p pos. \param pos byte index into buffer \return byte offset to line start */ int line_start(int pos) const; /** Finds and returns the position of the end of the line containing position \p pos (which is either a pointer to the newline character ending the line, or a pointer to one character beyond the end of the buffer) \param pos byte index into buffer \return byte offset to line end */ int line_end(int pos) const; /** Returns the position corresponding to the start of the word \param pos byte index into buffer \return byte offset to word start */ int word_start(int pos) const; /** Returns the position corresponding to the end of the word. \param pos byte index into buffer \return byte offset to word end */ int word_end(int pos) const; /** Count the number of displayed characters between buffer position \p lineStartPos and \p targetPos. (displayed characters are the characters shown on the screen to represent characters in the buffer, where tabs and control characters are expanded) */ int count_displayed_characters(int lineStartPos, int targetPos) const; /** Count forward from buffer position \p startPos in displayed characters (displayed characters are the characters shown on the screen to represent characters in the buffer, where tabs and control characters are expanded) \param lineStartPos byte offset into buffer \param nChars number of bytes that are sent to the display \return byte offset in input after all output bytes are sent */ int skip_displayed_characters(int lineStartPos, int nChars); /** Counts the number of newlines between \p startPos and \p endPos in buffer. The character at position \p endPos is not counted. */ int count_lines(int startPos, int endPos) const; /** Finds the first character of the line \p nLines forward from \p startPos in the buffer and returns its position */ int skip_lines(int startPos, int nLines); /** Finds and returns the position of the first character of the line \p nLines backwards from \p startPos (not counting the character pointed to by \p startpos if that is a newline) in the buffer. \p nLines == 0 means find the beginning of the line */ int rewind_lines(int startPos, int nLines); /** Finds the next occurrence of the specified character. Search forwards in buffer for character \p searchChar, starting with the character \p startPos, and returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchForward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchar_forward(int startPos, unsigned searchChar, int* foundPos) const; /** Search backwards in buffer \p buf for character \p searchChar, starting with the character BEFORE \p startPos, returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchBackward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchar_backward(int startPos, unsigned int searchChar, int* foundPos) const; /** Finds the next nth occurrence of the specified character. Search forwards in buffer for character \p searchChar, starting with the character \p startPos, and returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchForward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchars_forward(int startPos, const char* searchString, int* foundPos, int n = 1) const; int search_forward(int startPos, const char* searchString, int* foundPos, int matchCase = 0) const; /** Search backwards in buffer for string searchCharssearchString, starting with the character BEFORE \p startPos, returning the result in \p foundPos returns 1 if found, 0 if not. \param startPos byte offset to start position \param searchString utf8 string that we want to find \param foundPos byte offset where the string was found \param matchCase if set, match character case \return 1 if found, 0 if not */ int search_backward(int startPos, const char* searchString, int* foundPos, int matchCase = 0) const; int findchars_backward(int startPos, const char* searchChars, int* foundPos); /** Returns the primary selection. */ const Fl_Text_Selection_mod* primary_selection() const { return &mPrimary; } /** Returns the primary selection. */ Fl_Text_Selection_mod* primary_selection() { return &mPrimary; } /** Returns the secondary selection. */ const Fl_Text_Selection_mod* secondary_selection() const { return &mSecondary; } /** Returns the current highlight selection. */ const Fl_Text_Selection_mod* highlight_selection() const { return &mHighlight; } /** Returns the index of the previous character. \param ix index to the current char */ int prev_char(int ix) const; int prev_char_clipped(int ix) const; /** Returns the index of the next character. \param ix index to the current char */ int next_char(int ix) const; int next_char_clipped(int ix) const; /** Align an index into the buffer to the current or previous utf8 boundary. */ int utf8_align(int) const; /** \brief true iff the loaded file has been transcoded to UTF-8 */ int input_file_was_transcoded; /** This message may be displayed using the fl_alert() function when a file which was not UTF-8 encoded is input. */ static const char* file_encoding_warning_message; /** \brief Pointer to a function called after reading a non UTF-8 encoded file. This function is called after reading a file if the file content was transcoded to UTF-8. Its default implementation calls fl_alert() with the text of \ref file_encoding_warning_message. No warning message is displayed if this pointer is set to NULL. Use \ref input_file_was_transcoded to be informed if file input required transcoding to UTF-8. */ void (*transcoding_warning_action)(Fl_Text_Buffer_mod*); protected: /** Calls the stored modify callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_modify_callbacks(int pos, int nDeleted, int nInserted, int nRestyled, const char* deletedText) const; /** Calls the stored pre-delete callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_predelete_callbacks(int pos, int nDeleted) const; /** Internal (non-redisplaying) version of BufInsert. Returns the length of text inserted (this is just strlen(\p text), however this calculation can be expensive and the length will be required by any caller who will continue on to call redisplay). \p pos must be contiguous with the existing text in the buffer (i.e. not past the end). \return the number of bytes inserted */ int insert_(int pos, const char* text); /** Internal (non-redisplaying) version of BufRemove. Removes the contents of the buffer between start and end (and moves the gap to the site of the delete). */ void remove_(int start, int end); /** Calls the stored redisplay procedure(s) for this buffer to update the screen for a change in a selection. */ void redisplay_selection(Fl_Text_Selection_mod* oldSelection, Fl_Text_Selection_mod* newSelection) const; /** Move the gap to start at a new position. */ void move_gap(int pos); /** Reallocates the text storage in the buffer to have a gap starting at \p newGapStart and a gap size of \p newGapLen, preserving the buffer's current contents. */ void reallocate_with_gap(int newGapStart, int newGapLen); char* selection_text_(Fl_Text_Selection_mod* sel) const; /** Removes the text from the buffer corresponding to \p sel. */ void remove_selection_(Fl_Text_Selection_mod* sel); /** Replaces the \p text in selection \p sel. */ void replace_selection_(Fl_Text_Selection_mod* sel, const char* text); /** Updates all of the selections in the buffer for changes in the buffer's text */ void update_selections(int pos, int nDeleted, int nInserted); Fl_Text_Selection_mod mPrimary; /**< highlighted areas */ Fl_Text_Selection_mod mSecondary; /**< highlighted areas */ Fl_Text_Selection_mod mHighlight; /**< highlighted areas */ int mLength; /**< length of the text in the buffer (the length of the buffer itself must be calculated: gapEnd - gapStart + length) */ char* mBuf; /**< allocated memory where the text is stored */ int mGapStart; /**< points to the first character of the gap */ int mGapEnd; /**< points to the first char after the gap */ // The hardware tab distance used by all displays for this buffer, // and used in computing offsets for rectangular selection operations. int mTabDist; /**< equiv. number of characters in a tab */ int mNModifyProcs; /**< number of modify-redisplay procs attached */ Fl_Text_Modify_Cb *mModifyProcs;/**< procedures to call when buffer is modified to redisplay contents */ void** mCbArgs; /**< caller arguments for modifyProcs above */ int mNPredeleteProcs; /**< number of pre-delete procs attached */ Fl_Text_Predelete_Cb *mPredeleteProcs; /**< procedure to call before text is deleted from the buffer; at most one is supported. */ void **mPredeleteCbArgs; /**< caller argument for pre-delete proc above */ int mCursorPosHint; /**< hint for reasonable cursor position after a buffer modification operation */ char mCanUndo; /**< if this buffer is used for attributes, it must not do any undo calls */ int mPreferredGapSize; /**< the default allocation for the text gap is 1024 bytes and should only be increased if frequent and large changes in buffer size are expected */ }; #endif // // End of "$Id: Fl_Text_Buffer_mod.H 8148 2010-12-31 22:38:03Z matt $". // fldigi-4.1.06/src/include/flslider2.h0000644000175000017500000001066013472115777014253 00000000000000// ---------------------------------------------------------------------------- // flslider2.h // // Copyright (C) 2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_SLIDER2_ #define FL_SLIDER2_ #include #include #include #include class Fl_Slider2 : public Fl_Slider { public: Fl_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Value_Slider2 : public Fl_Value_Slider { public: Fl_Value_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Value_Input2 : public Fl_Value_Input { public: Fl_Value_Input2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Input(x, y, w, h, l) { } int handle(int event); }; class Fl_Spinner2 : public Fl_Spinner { public: Fl_Spinner2(int x, int y, int w, int h, const char* l = 0) : Fl_Spinner(x, y, w, h, l) { } int handle(int event); }; //====================================================================== // Fl_Counter with // improved event handling, // color rendering //====================================================================== // values for type(): #define FL_NORMAL_COUNTER 0 /**< type() for counter with fast buttons */ #define FL_SIMPLE_COUNTER 1 /**< type() for counter without fast buttons */ /** Controls a single floating point value with button (or keyboard) arrows. Double arrows buttons achieve larger steps than simple arrows. \see Fl_Spinner for value input with vertical step arrows.

\image html counter.png

\image latex counter.png "My_Counter" width=4cm \todo Refactor the doxygen comments for My_Counter type() documentation. The type of an My_Counter object can be set using type(uchar t) to: \li \c FL_NORMAL_COUNTER: Displays a counter with 4 arrow buttons. \li \c FL_SIMPLE_COUNTER: Displays a counter with only 2 arrow buttons. */ class FL_EXPORT My_Counter : public Fl_Valuator { Fl_Font textfont_; Fl_Fontsize textsize_; Fl_Color textcolor_; Fl_Color bkcolor_; double lstep_; uchar mouseobj; static void repeat_callback(void *); int calc_mouseobj(); void increment_cb(); protected: void draw(); public: int handle(int); My_Counter(int X, int Y, int W, int H, const char* L = 0); ~My_Counter(); /** Sets the increment for the large step buttons. The default value is 1.0. \param[in] a large step increment. */ void lstep(double a) {lstep_ = a;} /** Sets the increments for the normal and large step buttons. \param[in] a, b normal and large step increments. */ void step(double a,double b) {Fl_Valuator::step(a); lstep_ = b;} /** Sets the increment for the normal step buttons. \param[in] a normal step increment. */ void step(double a) {Fl_Valuator::step(a);} /** Returns the increment for normal step buttons. */ double step() const {return Fl_Valuator::step();} /** Gets the text font */ Fl_Font textfont() const {return textfont_;} /** Sets the text font to \p s */ void textfont(Fl_Font s) {textfont_ = s;} /** Gets the font size */ Fl_Fontsize textsize() const {return textsize_;} /** Sets the font size to \p s */ void textsize(Fl_Fontsize s) {textsize_ = s;} /** Gets the font color */ Fl_Color textcolor() const {return textcolor_;} /** Sets the font color to \p s */ void textcolor(Fl_Color s) {textcolor_ = s;} void textbkcolor(Fl_Color c) {bkcolor_ = c;} }; class Fl_Counter2 : public My_Counter { public: Fl_Counter2(int x, int y, int w, int h, const char* l = 0) : My_Counter(x, y, w, h, l) { } int handle(int event); }; #endif // FL_SLIDER2_ fldigi-4.1.06/src/include/weather.h0000664000175000017500000000205513507401434014010 00000000000000// ---------------------------------------------------------------------------- // weather.cxx -- a part of fldigi // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef WEATHER_H #define WEATHER_H #include extern void getwx(std::string &wx, std::string metar = ""); extern void get_METAR_station(); #endif fldigi-4.1.06/src/include/nullmodem.h0000644000175000017500000000234613472115776014362 00000000000000// ---------------------------------------------------------------------------- // NULLMODEM.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _NULLMODEM_H #define _NULLMODEM_H #include "trx.h" #include "modem.h" #define NULLMODEMSampleRate 8000 class NULLMODEM : public modem { protected: public: NULLMODEM(); ~NULLMODEM(); void init(); void rx_init(); void restart(); void tx_init(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-4.1.06/src/include/adif_def.h0000644000175000017500000000221413472115776014101 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef ADIF_DEF #define ADIF_DEF #include #include #include #include "field_def.h" using namespace std; struct FIELD { int type; int fsize; const char *name; Fl_Check_Button **btn; }; extern FIELD fields[]; #endif fldigi-4.1.06/src/include/charsetlist.h0000644000175000017500000000212113472115776014702 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef CHARSETLIST_H #define CHARSETLIST_H struct charset_info { const char *name; int tiniconv_id; }; extern const struct charset_info charset_list[]; extern const unsigned int number_of_charsets; #endif fldigi-4.1.06/src/include/socket.h0000664000175000017500000001272413507401434013645 00000000000000// ---------------------------------------------------------------------------- // socket.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SOCKET_H_ #define SOCKET_H_ #include #include #ifndef __MINGW32__ # include # include # if defined(__OpenBSD__) && defined(nitems) # undef nitems # endif # include #else #undef _WINSOCKAPI_ # include # include # ifndef ENOTCONN # define ENOTCONN WSAENOTCONN # endif #endif #include #include #include #define S_BUFSIZ 16384 class SocketException : public std::exception { public: SocketException(int err_ = 0) : err(err_), msg(err_to_str(err_)) { } SocketException(const char* msg_) : err(1), msg(msg_) { } SocketException(int err_, const std::string& prefix) : err(err_), msg(std::string(prefix).append(": ").append(err_to_str(err_))) { } virtual ~SocketException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { #if HAVE_GETADDRINFO if (e < 0) return gai_strerror(e); else #endif return strerror(e); } int err; std::string msg; }; #if HAVE_GETADDRINFO typedef struct addrinfo addr_info_t; #else struct addr_info_t { int ai_family; int ai_socktype; int ai_protocol; int ai_addrlen; struct sockaddr * ai_addr; }; #endif class Address { public: Address(const char* host = "", int port = 0, const char* proto_name = "tcp"); Address(const char* host, const char* port_name, const char* proto_name = "tcp"); Address(const Address& addr); ~Address(); Address& operator=(const Address& rhs); size_t size(void) const; const addr_info_t* get(size_t n = 0) const; const addr_info_t* udp_get_recv_addr(void); static std::string get_str(const addr_info_t* addr); unsigned int get_udp_io_port() {return port_io;}; unsigned int get_udp_o_port() {return port_out;}; std::string get_service() {return service;}; std::string get_node() {return node;}; private: void lookup(const char* proto_name); std::string node; std::string service; unsigned int port_io; unsigned int port_out; #if HAVE_GETADDRINFO struct addrinfo* info; #else struct hostent host_entry; struct servent service_entry; mutable addr_info_t addr; mutable struct sockaddr_in saddr; #endif bool copied; }; class Socket { public: Socket(const Address& addr); Socket(int fd = -1); Socket(const Socket& s); ~Socket(); Socket& operator=(const Socket& rhs); void open(const Address& addr); void close(void); bool wait(int dir); // Server void bind(void); void bindUDP(void); void listen(int backlog = SOMAXCONN); Socket accept(void); Socket accept1(void); Socket * accept2(void); // Client int connect(const Address& addr); int connect(void); bool connect1(void); // Data Transimission size_t send(const void* buf, size_t len); size_t send(const std::string& buf); size_t recv(void* buf, size_t len); size_t recv(std::string& buf); // Unconnected Data Transmission size_t sendTo(const void* buf, size_t len); size_t sendTo(const std::string& buf); size_t recvFrom(void* buf, size_t len); size_t recvFrom(std::string& buf); // Options int get_bufsize(int dir); void set_bufsize(int dir, int len); void set_nonblocking(bool v = true); void set_nodelay(bool v = true); void set_timeout(const struct timeval& t); void set_timeout(double t); void set_autoclose(bool v) const; void set_close_on_exec(bool v, int fd = -1); void broadcast(bool flag); // Other unsigned int get_port(struct sockaddr *sa); void set_port(struct sockaddr *sa, unsigned int port); unsigned long get_address4(struct sockaddr *sa); void dual_port(int * dual_port); void set_dual_port_number(unsigned int dual_port_number); void set_dual_port_number(std::string port); unsigned int get_dual_port_number(void) { return dual_port_number; }; unsigned int get_local_port() { return (unsigned int) atoi(address.get_service().c_str()); }; unsigned long get_to_address(void); int use_dual_port(void) { if(use_kiss_dual_port) return *use_kiss_dual_port; else return 0; }; bool is_connected(void); int fd(void); void shut_down(void); private: int sockfd; Address address; size_t anum; const addr_info_t* ainfo; char* buffer; struct timeval timeout; bool nonblocking; mutable bool autoclose; struct sockaddr_storage saddr; struct sockaddr_storage saddr_dp; unsigned int saddr_size; int *use_kiss_dual_port; unsigned int dual_port_number; bool connected_flag; }; #endif // SOCKET_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/morse.h0000644000175000017500000000267413472115776013517 00000000000000/* * morse.h -- morse code tables * * Copyright (C) 2017 * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #ifndef _MORSE_H #define _MORSE_H #include #define MorseTableSize 256 #define CW_DOT_REPRESENTATION '.' #define CW_DASH_REPRESENTATION '-' struct CWstruct { bool enabled; // true if character is active std::string chr; // utf-8 string representation of character std::string prt; // utf-8 printable representation std::string rpr; // Dot-dash code representation }; class cMorse { private: static CWstruct cw_table[]; std::string utf8; std::string toprint; public: cMorse() { init(); } ~cMorse() { } void init(); void enable(std::string, bool); std::string rx_lookup(std::string); std::string tx_lookup(int); std::string tx_print() { return toprint; } int tx_length(int); }; #endif fldigi-4.1.06/src/include/FreqControl.h0000644000175000017500000001034613472115777014624 00000000000000// ---------------------------------------------------------------------------- // // Frequency Control Widget for the Fast Light Tool Kit // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of flrig. // // flrig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // // Usage: // Create a multi-digit receiver / transceiver frequency control widget // // label used to pass # digits & decimal position to control // the widget can be used in Fluid & initialized with the // number of digits as the label string // default is 7; min number is 1, max number is 9 as in // // cFreqControl myFreqConrol(x0, y0, w0, h0, "N"); where N is # digits // cFreqControl *pMyFreqControl = new cFreqControl(x0,y0,w0,h0,"N"); #ifndef _FREQCONTROL_H_ #define _FREQCONTROL_H_ #include #include #include #include #include #ifdef MAX_DIGITS #undef MAX_DIGITS #endif #define MAX_DIGITS 10 #ifdef MIN_DIGITS #undef MIN_DIGITS #endif #define MIN_DIGITS 4 class Fl_Box; class Fl_Float_Input; class cFreqControl : public Fl_Group { friend void cbSelectDigit (Fl_Widget *btn, void * nbr); public: cFreqControl(int x, int y, int w, int h, const char *lbl = "9"); ~cFreqControl(); void updatevalue(); void value(long lv); long value(){return val;}; long int maximum(void); void font(Fl_Font fnt); void SetONCOLOR (uchar r, uchar g, uchar b); void SetOFFCOLOR (uchar r, uchar g, uchar b); void GetONCOLOR (uchar &r, uchar &g, uchar &b) { Fl::get_color(ONCOLOR, r, g, b); }; void GetOFFCOLOR (uchar &r, uchar &g, uchar &b) { Fl::get_color(OFFCOLOR, r, g, b); }; void SetONOFFCOLOR( Fl_Color, Fl_Color); // void setCallBack (int (*cbf)() ){ cbFunc = cbf;}; void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } // void setCallBack (int (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;}; // void do_callback(Fl_Widget *w, void *d) { if (cbFunc) cbFunc(w, d); } int handle(int event); void set_lsd(int val) { int temp = precision; if (val < 0) return; if (val > 3) return; if (val == 0) temp = 1; if (val == 1) temp = 10; if (val == 2) temp = 100; if (val == 3) temp = 1000; if (temp < precision) temp = precision; lsd = temp; } void visual_beep(); void set_hrd(bool b) {hrd_buttons = b;} void reverse_colors(); void restore_colors(); bool is_reversed_colors() { return enable_arrow_keys; } void show_focus() {reverse_colors();} void clear_focus() {restore_colors();} void resize (int X, int Y, int W, int H); void set_precision(int val) { switch (val) { case 100: dpoint = 1; precision = 100; break; case 10: dpoint = 2; precision = 10; break; default: dpoint = 3; precision = 1; break; } } void set_ndigits(int val); private: Fl_Repeat_Button *Digit[MAX_DIGITS]; Fl_Float_Input *finp; static const char *Label[]; long int mult[MAX_DIGITS]; Fl_Box *decbx; Fl_Box *hfill1; Fl_Box *hfill2; Fl_Font font_number; Fl_Color OFFCOLOR; Fl_Color ONCOLOR; Fl_Color SELCOLOR; Fl_Color ILLUMCOLOR; Fl_Color REVONCOLOR; Fl_Color REVOFFCOLOR; int nD; //int active; long int maxVal; long int minVal; int pw; // decimal width int wfill; int bdr; int fcWidth; int fcTop; int fcHeight; int W; void DecFreq(int n); void IncFreq(int n); void (*cbFunc)(Fl_Widget *, void *); static void freq_input_cb(Fl_Widget* input, void* arg); void cancel_kb_entry(void); protected: long int val, oldval; int precision; int dpoint; int lsd; bool hrd_buttons; bool enable_arrow_keys; }; #endif fldigi-4.1.06/src/include/jalocha/0000775000175000017500000000000013515625027013664 500000000000000fldigi-4.1.06/src/include/jalocha/pj_fifo.h0000664000175000017500000000354613507755043015404 00000000000000// (c) 2019, David Freese, W1HKJ #ifndef __FIFO_H__ #define __FIFO_H__ #include "pj_struc.h" // a simple FIFO buffer template class FIFO { public: size_t Len; private: size_t ReadPtr; size_t WritePtr; Type *Data; public: FIFO() { Init(); } ~FIFO() { delete [] Data; } void Init(void) { Data = 0; Len = 0; } void Free(void) { delete [] Data; Data = 0; Len = 0; } void Reset(void) { ReadPtr = WritePtr = 0; } void Clear(void) { ReadPtr = WritePtr; } int Preset(void) { if (ReallocArray(&Data, Len) < 0) return -1; Reset(); return 0; } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step = 1) { Ptr += Step; if (Ptr >= Len) Ptr-=Len; } // FIFO is full ? int Full(void) { size_t Ptr = WritePtr; IncrPtr(Ptr); return (Ptr == ReadPtr); } // FIFO is empty ? int Empty(void) { return (ReadPtr == WritePtr); } // how many elements we can write = space left in the FIFO size_t WriteReady(void) { int Ready = ReadPtr - WritePtr; if (Ready <= 0) Ready += Len; return Ready - 1; } // how many elements we can read = space taken in the FIFO size_t ReadReady(void) { int Ready = WritePtr - ReadPtr; if (Ready < 0) Ready += Len; return Ready; } // write a new element int Write(Type &NewData) { size_t Ptr = WritePtr; IncrPtr(Ptr); if (Ptr == ReadPtr) return 0; Data[WritePtr] = NewData; WritePtr = Ptr; return 1; } // read the oldest element int Read(Type &OldData) { if (ReadPtr == WritePtr) return 0; OldData = Data[ReadPtr]; IncrPtr(ReadPtr); return 1; } // lookup data in the FIFO but without taking them out int Lookup(Type &OldData, size_t Offset = 0) { size_t Ready = ReadReady(); if (Offset >= Ready) return 0; size_t Ptr = ReadPtr; IncrPtr(Ptr,Offset); OldData = Data[Ptr]; return 1; } }; #endif // of __FIFO_H__ fldigi-4.1.06/src/include/jalocha/pj_fft.h0000664000175000017500000002326213507755043015235 00000000000000// Fast Fourier Transform // (c) 1999-2004, Pawel Jalocha #ifndef __FFT_H__ #define __FFT_H__ #include #include "pj_cmpx.h" #include "pj_struc.h" // ---------------------------------------------------------------------------- /* How to use the r2FFT class: 1. define the object: r2FFT FFT; 2. preset it for given FFT length: ret=FFT.Preset(1024); if return code is negative => your RAM is out, you can't use the FFT object. - after FFT.Preset() you have the unscrambling table in FFT.BitRevIdx[] and the full (co)sine table in FFT.Twiddle[] 3. for forward complex FFT of "Data": FFT.Process(Data); (this includes unscrambling) 4. for inverse complex FFT of "Data": - first: negate the imaginary part of "Data" - second: execute FFT.Process(Data); - third: negate (again) the imaginary part of "Data" New feature: you can call FFT.Process(Data,Len); 5. You may call FFT.Free() to free allocated RAM, but you will need to call FFT.Preset() before using the FFT object again. 6. Scaling: each pass of the FFT.Process(Data) multiplies the energy of the sequence contained in "Data" by the length of the FFT. To get the same scale (amplitude) after executing one forward and another inverse FFT you need to multiply the sequence by 1/length. 7. To make an FFT of two _real_ time sequences in one go: - place the first time sequence in the real part of complex "Data" - place the second time sequence in the imaginary part of "Data" - execute: FFT.Process(Data); - execute: FFT.SeparTwoReals(Data,Spectr1,Spectr2); where Spectr1/2 are complex arrays half the size of the FFT length. Spectr1/2 contains now the complex FFT result for the first and second real input sequence - Scaling: the sequence energy is multiplied by FFT length 8. To execute an Inverse FFT as to get two real sequences out of two spectral data: - have the two freq. sequeces in Spectr1/2 - execute: FFT.JoinTwoReals(Spectr1,Spect2,Data); - execute: FFT.Process(Data); - Data[].Re contains the first time sequence - Data[].Im contains the second time sequence - Spectr1/2 and Data arrays are like for SeparTwoReals() - Scaling: the sequence energy is multiplied by _twice_ the FFT length */ template class r2FFT { public: // size must a power of 2: 2,4,8,16,32,64,128,256,... r2FFT(int MaxSize) { BitRevIdx = 0; Twiddle = 0; Preset(MaxSize); } r2FFT() { BitRevIdx = 0; Twiddle = 0; } ~r2FFT() { delete [] BitRevIdx; //free(BitRevIdx); delete [] Twiddle; //free(Twiddle); } void Free(void) { delete [] BitRevIdx; //free(BitRevIdx); delete [] Twiddle; //free(Twiddle); BitRevIdx = 0; Twiddle = 0; } // preset tables for given (maximum) processing size int Preset(int MaxSize) { size_t idx, ridx, mask, rmask; double phase; size_t Size4; if (MaxSize < 4) goto Error; Size = MaxSize; while ((MaxSize & 1) == 0) MaxSize >>= 1; if (MaxSize != 1) goto Error; if (ReallocArray(&BitRevIdx, Size) < 0) goto Error; if (ReallocArray(&Twiddle,Size) < 0) goto Error; Size4 = Size/4; for (idx = 0; idx < Size4; idx++) { phase = (2 * M_PI * idx)/Size; Twiddle[idx].SetPhase(phase); } for ( ; idx < Size; idx++) { Twiddle[idx].Re = (-Twiddle[idx - Size4].Im); Twiddle[idx].Im = Twiddle[idx - Size4].Re; } for (ridx = 0, idx=0; idx < Size; idx++) { for (ridx = 0, mask = Size/2, rmask = 1; mask; mask >>= 1, rmask <<= 1) { if (idx & mask) ridx |= rmask; } BitRevIdx[idx] = ridx; /* printf("%04x %04x\n",idx,ridx); */ } return 0; Error: Free(); return -1; } // scramble/unscramble (I)FFT input template void Scramble(DataType x[]) { size_t idx, ridx; DataType tmp; for (idx = 0; idx < Size; idx++) { if ((ridx = BitRevIdx[idx]) > idx) { tmp = x[idx]; x[idx] = x[ridx]; x[ridx] = tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } template void Scramble(DataType x[], size_t ShrinkShift) { size_t idx,ridx; DataType tmp; size_t Len = Size >> ShrinkShift; for (idx = 0; idx < Len; idx++) { ridx = BitRevIdx[idx]; ridx >>= ShrinkShift; if (ridx > idx) { tmp = x[idx]; x[idx] = x[ridx]; x[ridx] = tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } // separate the result of a two real channels FFT template void SeparTwoReals(BuffType Buff[], DataType Out0[], DataType Out1[]) { int idx, HalfSize = Size/2; // for(idx=0; idx void JoinTwoReals(DataType Inp0[], DataType Inp1[], BuffType Buff[]) { int idx, HalfSize = Size/2; // for(idx=0; idx void CoreProc(BuffType x[]) { size_t Groups, GroupSize2, Group, Bf, TwidIdx; size_t Size2 = Size/2; for (Bf = 0; Bf < Size; Bf += 2) FFT2(x[Bf], x[Bf + 1]); // first pass // for(Bf=0; Bf>=1, GroupSize2<<=1) for (Groups = Size2/2, GroupSize2 = 2; Groups; Groups >>= 1, GroupSize2 <<= 1) { for (Group = 0, Bf = 0; Group < Groups; Group++, Bf += GroupSize2) { for (TwidIdx = 0; TwidIdx < Size2; TwidIdx += Groups, Bf++) { FFTbf(x[Bf], x[Bf + GroupSize2], Twiddle[TwidIdx]); } } } } // radix-2 FFT with a "shrink" factor template void CoreProc(BuffType x[], size_t ShrinkShift) { size_t Groups, GroupSize2, Group, Bf, TwidIdx, TwidIncr; size_t Len = Size >> ShrinkShift; size_t Size2 = Size/2; size_t Len2 = Len/2; for (Bf = 0; Bf < Len; Bf += 2) FFT2(x[Bf], x[Bf + 1]); // first pass // for(Bf=0; Bf>= 1, TwidIncr >>= 1, GroupSize2 <<= 1) { for (Group = 0, Bf = 0; Group < Groups; Group++, Bf += GroupSize2) { for (TwidIdx = 0; TwidIdx < Size2; TwidIdx += TwidIncr, Bf++) { FFTbf(x[Bf], x[Bf + GroupSize2], Twiddle[TwidIdx]); } } } } // complex FFT process in place, includes unscrambling template int Process(BuffType x[]) { Scramble(x); CoreProc(x); return 0; } // find the "shrink" factor for processing batches smaller than declared by Preset() int FindShrinkShift(size_t Len) { size_t Shift; for(Shift=0; Len int Process(BuffType x[], size_t Len) { if(Len<4) return -1; if(Len==Size) { Scramble(x); CoreProc(x); return 0; } int ShrinkShift=FindShrinkShift(Len); if(ShrinkShift<0) return -1; Scramble(x,ShrinkShift); CoreProc(x,ShrinkShift); return 0; } public: size_t Size; // FFT size (needs to be power of 2) size_t *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling Type *Twiddle; // Twiddle factors (sine/cos values) private: // classic radix-2 butterflies template inline void FFTbf(BuffType &x0, BuffType &x1, Type &W) { Type x1W; x1W.Re = x1.Re*W.Re + x1.Im*W.Im; // x1W.Re=x1.Re*W.Re-x1.Im*W.Im; x1W.Im = (-x1.Re*W.Im) + x1.Im*W.Re; // x1W.Im=x1.Re*W.Im+x1.Im*W.Re; x1.Re = x0.Re - x1W.Re; x1.Im = x0.Im - x1W.Im; x0.Re = x0.Re + x1W.Re; x0.Im = x0.Im + x1W.Im; } // special 2-point FFT for the first pass template inline void FFT2(BuffType &x0, BuffType &x1) { Type x1W; x1W.Re = x1.Re; x1W.Im = x1.Im; x1.Re = x0.Re - x1.Re; x1.Im = x0.Im - x1.Im; x0.Re += x1W.Re; x0.Im += x1W.Im; } // special 4-point FFT for the second pass template inline void FFT4(BuffType &x0, BuffType &x1, BuffType &x2, BuffType &x3) { Type x1W; x1W.Re = x2.Re; x1W.Im = x2.Im; x2.Re = x0.Re - x1W.Re; x2.Im = x0.Im - x1W.Im; x0.Re = x0.Re + x1W.Re; x0.Im = x0.Im + x1W.Im; x1W.Re = x3.Im; x1W.Im = (-x3.Re); x3.Re = x1.Re - x1W.Re; x3.Im = x1.Im - x1W.Im; x1.Re = x1.Re + x1W.Re; x1.Im = x1.Im + x1W.Im; } }; #endif // __FFT_H__ fldigi-4.1.06/src/include/jalocha/pj_gray.h0000664000175000017500000000125513507755043015416 00000000000000// Gray code convertion // (c) 2004, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __GRAY_H__ #define __GRAY_H__ #include template Type GrayCode(Type Binary) { return Binary ^ (Binary >> 1); } inline uint8_t BinaryCode(uint8_t Gray) { Gray ^= (Gray >> 4); Gray ^= (Gray >> 2); Gray ^= (Gray >> 1); return Gray; } inline uint16_t BinaryCode(uint16_t Gray) { Gray ^= (Gray >> 8); Gray ^= (Gray >> 4); Gray ^= (Gray >> 2); Gray ^= (Gray >> 1); return Gray; } inline uint32_t BinaryCode(uint32_t Gray) { Gray ^= (Gray >> 16); Gray ^= (Gray >> 8); Gray ^= (Gray >> 4); Gray ^= (Gray >> 2); Gray ^= (Gray >> 1); return Gray; } #endif fldigi-4.1.06/src/include/jalocha/pj_mfsk.h0000664000175000017500000016337213507755043015425 00000000000000// MFSK trasnmitter and receiver code, Pawel Jalocha, December 2004 #ifndef __PJ_MFSK_H__ #define __PJ_MFSK_H__ // ===================================================================== #include #include #include #include "pj_struc.h" #include "pj_fht.h" #include "pj_cmpx.h" #include "pj_fft.h" #include "pj_gray.h" #include "pj_lowpass3.h" #include "pj_fifo.h" // ===================================================================== static inline size_t Exp2(uint32_t X) { return (uint32_t)1 << X; } static inline size_t Log2(uint32_t X) { uint32_t Y; for ( Y = 0; X > 1; X >>= 1) Y += 1; return Y; } // ===================================================================== // the symbol shape described in frequency domain static const double MFSK_SymbolFreqShape[] = { 1.0, 1.0 } ; // use raised cosine shape - experimental // from gMFSK // { +1.0000000000, // +1.1913785723, // -0.0793018558, // -0.2171442026, // -0.0014526076 //}; // from DM780 //{ // +1.0000000000, // +2.1373197349, // +1.1207588117, // -0.0165609232 //}; static const size_t MFSK_SymbolFreqShapeLen = sizeof(MFSK_SymbolFreqShape) / sizeof(double); // ===================================================================== template class MFSK_Modulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; static const size_t CarrierSepar = 2; // parameters that are calculated by Preset() size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols int SymbolPhase; // the phase of the tone being transmitted int Reverse; // send carriers in reverse order? private: Type *CosineTable; // Cosine table for fast cos/sin calculation Type *SymbolShape; // the shape of the symbol Type *OutTap; // output tap (buffer) size_t TapPtr; size_t WrapMask; public: MFSK_Modulator() { Init(); Default(); } ~MFSK_Modulator() { Free(); } void Init(void) { CosineTable = 0; SymbolShape = 0; OutTap = 0; } void Free(void) { delete [] CosineTable; CosineTable = 0; delete [] SymbolShape; SymbolShape = 0; delete [] OutTap; OutTap = 0; } void Default(void) { SymbolLen = 512; FirstCarrier = 32; BitsPerSymbol = 5; Reverse = 0; UseGrayCode = 1; } int Preset(void) { size_t Idx; Carriers = Exp2(BitsPerSymbol); SymbolSepar = SymbolLen / 2; if (ReallocArray(&CosineTable, SymbolLen) < 0) goto Error; for (Idx = 0; Idx < SymbolLen; Idx++) CosineTable[Idx] = cos((2*M_PI*Idx) / SymbolLen); if (ReallocArray(&SymbolShape, SymbolLen) < 0) goto Error; { size_t Time; double Ampl = MFSK_SymbolFreqShape[0]; for (Time = 0; Time < SymbolLen; Time++) SymbolShape[Time] = Ampl; } size_t Freq; for (Freq = 1; Freq < MFSK_SymbolFreqShapeLen; Freq++) { size_t Time; double Ampl = MFSK_SymbolFreqShape[Freq]; if (Freq & 1) Ampl = (-Ampl); size_t Phase = 0; for (Time = 0; Time < SymbolLen; Time++) { SymbolShape[Time] += Ampl*CosineTable[Phase]; Phase += Freq; if (Phase >= SymbolLen) Phase-=SymbolLen; } } { size_t Time; double Scale = 1.0/4; for (Time = 0; Time < SymbolLen; Time++) SymbolShape[Time] *= Scale; } if (ReallocArray(&OutTap, SymbolLen) < 0) goto Error; for (Idx = 0; Idx < SymbolLen; Idx++) OutTap[Idx] = 0; TapPtr = 0; WrapMask = SymbolLen-1; SymbolPhase = 0; return 0; Error: Free(); return -1; } void Send(uint8_t Symbol) { if (UseGrayCode) Symbol=GrayCode(Symbol); int SymbolFreq; if (Reverse == 1) { int RevFirstCar=FirstCarrier-2; SymbolFreq=RevFirstCar-CarrierSepar*Symbol; } else { SymbolFreq=FirstCarrier+CarrierSepar*Symbol; } int TimeShift=SymbolSepar/2-SymbolLen/2; SymbolPhase+=SymbolFreq*TimeShift; SymbolPhase&=WrapMask; AddSymbol(SymbolFreq,SymbolPhase); TimeShift=SymbolSepar/2+SymbolLen/2; SymbolPhase+=SymbolFreq*TimeShift; SymbolPhase&=WrapMask; int PhaseDiffer=SymbolLen/4; if (rand()&1) PhaseDiffer=(-PhaseDiffer); SymbolPhase+=PhaseDiffer; SymbolPhase&=WrapMask; } // get output as 16-bit signed data int Output(int16_t *Buffer) { const Type Scale = 32768.0; const int32_t Limit = 0x7FFF; size_t Idx; for (Idx = 0; Idx < SymbolSepar; Idx++) { Type Ampl = OutTap[TapPtr]; Ampl *= Scale; int32_t Out = (int32_t)floor(Ampl + 0.5); if (Out > Limit) Out = Limit; else if (Out < (-Limit)) Out = (-Limit); Buffer[Idx] = (int16_t)Out; OutTap[TapPtr] = 0; TapPtr += 1; TapPtr &= WrapMask; } return SymbolSepar; } template int Output(OutType *Buffer) { size_t Idx; for (Idx = 0; Idx < SymbolSepar; Idx++) { Buffer[Idx] = OutTap[TapPtr]; OutTap[TapPtr] = 0; TapPtr += 1; TapPtr &= WrapMask; } return SymbolSepar; } private: void AddSymbol(int Freq, int Phase) { size_t Time; for (Time = 0; Time < SymbolLen; Time++) { // experimental use with {1.0, 1.0}; Type Shape=1.0-CosineTable[Time]; OutTap[TapPtr] += CosineTable[Phase] * Shape; // OutTap[TapPtr] += CosineTable[Phase] * SymbolShape[Time]; Phase += Freq; Phase &= WrapMask; TapPtr += 1; TapPtr &= WrapMask; } } } ; // ===================================================================== template class BoxFilter { public: size_t Len; TapType *Tap; size_t Ptr; OutType Output; BoxFilter() { Tap = 0; } ~BoxFilter() { delete [] Tap; } void Free(void) { delete [] Tap; Tap = 0; } int Preset(void) { if (ReallocArray(&Tap, Len) < 0) return -1; Clear(); return 0; } void Clear(void) { size_t Idx; for (Idx = 0; Idx < Len; Idx++) Tap[Idx] = 0; Ptr = 0; Output = 0; } template void Process(InpType Input) { Output -= Tap[Ptr]; Output += Input; Tap[Ptr] = Input; Ptr += 1; if (Ptr >= Len) Ptr -= Len; } }; // ===================================================================== template class MFSK_InputProcessor { public: size_t WindowLen; size_t WrapMask; Type *InpTap; size_t InpTapPtr; Type *OutTap; size_t OutTapPtr; Type *WindowShape; size_t SliceSepar; r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; Cmpx *Spectra[2]; Type *Output; Type *Energy; BoxFilter Filter; public: MFSK_InputProcessor() { Init(); Default(); } ~MFSK_InputProcessor() { Free(); } void Init(void) { InpTap = 0; OutTap = 0; WindowShape = 0; FFT_Buff = 0; Spectra[0] = 0; Spectra[1] = 0; Output = 0; Energy = 0; } void Free(void) { delete [] InpTap; InpTap = 0; delete [] OutTap; OutTap = 0; delete [] WindowShape; WindowShape = 0; delete [] FFT_Buff; FFT_Buff = 0; delete [] Spectra[0]; Spectra[0] = 0; delete [] Spectra[1]; Spectra[1] = 0; delete [] Output; Output = 0; delete [] Energy; Energy = 0; FFT.Free(); Filter.Free(); } void Default(void) { WindowLen = 8192; } int Preset(void) { size_t Idx; WrapMask = WindowLen - 1; Type ShapeScale = 2.0 / WindowLen; if (ReallocArray(&InpTap, WindowLen) < 0) goto Error; ClearArray(InpTap, WindowLen); InpTapPtr = 0; if (ReallocArray(&OutTap, WindowLen) < 0) goto Error; ClearArray(OutTap, WindowLen); OutTapPtr = 0; if (FFT.Preset(WindowLen) < 0) goto Error; if (ReallocArray(&FFT_Buff, WindowLen) < 0) goto Error; SliceSepar = WindowLen / 2; if (ReallocArray(&WindowShape, WindowLen)< 0) goto Error; for (Idx = 0; Idx < WindowLen; Idx++) WindowShape[Idx] = ShapeScale * sqrt(1.0 - FFT.Twiddle[Idx].Re); SpectraLen = WindowLen / 2; if (ReallocArray(&Spectra[0], SpectraLen) < 0) goto Error; if (ReallocArray(&Spectra[1], SpectraLen) < 0) goto Error; if (ReallocArray(&Output, WindowLen) < 0) goto Error; ClearArray(Output, WindowLen); if (ReallocArray(&Energy, SpectraLen) < 0) goto Error; Filter.Len = WindowLen / 16; if (Filter.Preset() < 0) goto Error; return 0; Error: Free(); return -1; } void Reset(void) { ClearArray(InpTap, WindowLen); InpTapPtr = 0; ClearArray(OutTap, WindowLen); OutTapPtr = 0; } void LimitSpectraPeaks( Cmpx *Spectra, size_t Len = 64, Type Threshold = 4.0) { Filter.Len = Len; Filter.Preset(); size_t MaxFreq = 3 * (SpectraLen / 4); size_t Freq, Idx; for (Freq = 0; Freq < Len; Freq++) Filter.Process(Energy[Freq]); for (Idx = Len / 2; Freq < MaxFreq; Freq++,Idx++) { Filter.Process(Energy[Freq]); Type Signal = Energy[Idx]; Type Limit = (Filter.Output/Len) * Threshold; if (Signal > Limit) { Spectra[Idx] *= sqrt(Limit / Signal); Energy[Idx] = Limit; } } } void LimitOutputPeaks(Type Threshold = 2.5) { size_t Idx; Type RMS = 0; for (Idx = 0; Idx < WindowLen; Idx++) { Type Signal = Output[Idx]; RMS += Signal * Signal; } RMS = sqrt(RMS / WindowLen); Type Limit = RMS * Threshold; for (Idx = 0; Idx < WindowLen; Idx++) { Type Signal = Output[Idx]; if (Signal > Limit) Output[Idx] = Limit; else if (Signal < (-Limit)) Output[Idx] = (-Limit); } } void AverageEnergy(size_t Len = 32) { Filter.Len = Len; Filter.Preset(); size_t MaxFreq = 3 * (SpectraLen / 4); Type Scale = 1.0 / Len; size_t Len2 = Len / 2; size_t Idx, Freq; for (Freq = 0; Freq < Len; Freq++) Filter.Process(Energy[Freq]); for (Idx = 0; Idx < Len2; Idx++) Energy[Idx] = Filter.Output * Scale; for ( ; Freq < MaxFreq; Freq++,Idx++) { Filter.Process(Energy[Freq]); Energy[Idx] = Filter.Output * Scale; } for ( ; Idx < SpectraLen; Idx++) Energy[Idx] = Filter.Output*Scale; } // here we process the spectral data void ProcessSpectra(Cmpx *Spectra) { size_t Freq; for (Freq = 0; Freq < SpectraLen; Freq++) Energy[Freq] = Spectra[Freq].Energy(); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); AverageEnergy(WindowLen / 96); AverageEnergy(WindowLen / 64); for (Freq = 0; Freq < SpectraLen; Freq++) { Type Corr = Energy[Freq]; if (Corr <= 0) continue; Corr = 1.0 / sqrt(Corr); Spectra[Freq] *= Corr; } } template void ProcessInpTap(InpType *Input) { size_t InpIdx; for (InpIdx = 0; InpIdx < SliceSepar; InpIdx++) { InpTap[InpTapPtr] = Input[InpIdx]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpTap() { size_t InpIdx; for (InpIdx = 0; InpIdx < SliceSepar; InpIdx++) { InpTap[InpTapPtr] = 0; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpWindow_Re(void) { size_t Time; for (Time = 0; Time < WindowLen; Time++) { FFT_Buff[Time].Re = InpTap[InpTapPtr] * WindowShape[Time]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpWindow_Im(void) { size_t Time; for (Time = 0; Time < WindowLen; Time++) { FFT_Buff[Time].Im = InpTap[InpTapPtr] * WindowShape[Time]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessOutWindow_Re(void) { size_t Time; for (Time=0; Time int Process(InpType *Input) { if (Input) ProcessInpTap(Input); else ProcessInpTap(); ProcessInpWindow_Re(); if (Input) ProcessInpTap(Input+SliceSepar); else ProcessInpTap(); ProcessInpWindow_Im(); FFT.Process(FFT_Buff); FFT.SeparTwoReals(FFT_Buff, Spectra[0], Spectra[1]); ProcessSpectra(Spectra[0]); ProcessSpectra(Spectra[1]); FFT.JoinTwoReals(Spectra[0], Spectra[1], FFT_Buff); FFT.Process(FFT_Buff); ProcessOutWindow_Re(); ProcessOutTap(Output); ProcessOutWindow_Im(); ProcessOutTap(Output+SliceSepar); LimitOutputPeaks(2.5); LimitOutputPeaks(2.5); return WindowLen; } // get output as 16-bit signed data int GetOutput(int16_t *Buffer) { const Type Scale = 32768.0; const int32_t Limit = 0x7FFF; size_t Idx; for (Idx = 0; Idx < WindowLen; Idx++) { Type Ampl = Output[Idx]; Ampl *= Scale; int32_t Out = (int32_t)floor(Ampl + 0.5); if (Out > Limit) Out = Limit; else if (Out < (-Limit)) Out = (-Limit); Buffer[Idx] = (int16_t)Out; } return WindowLen; } } ; // ===================================================================== // A circular buffer to store history of data. // Data may come as single numbers or in batches // of fixed size (-> Width) template class CircularBuffer { public: size_t Width; // input/output data width (row width) size_t Len; // buffer length (column height) size_t Size; // total size of the storage in the buffer size_t Ptr; // current pointer (counts rows) Type *Data; // allocated storage CircularBuffer() { Init(); } ~CircularBuffer() { delete [] Data; } void Init(void) { Data = 0; Size = 0; Width = 1; } void Free(void) { delete [] Data; Data = 0; Size = 0; } // reset: set pointer to the beginning of the buffer void Reset(void) { Ptr = 0; } // preset for given length and width int Preset(void) { Size = Width * Len; if (ReallocArray(&Data, Size) < 0) return -1; Reset(); return 0; } // set all elements to given value void Set(Type &Value) { size_t Idx; for (Idx = 0; Idx < Size; Idx++) Data[Idx]=Value; } // set all elements to zero void Clear(void) { Type Zero; Zero = 0; Set(Zero); } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step=1) { Ptr += Step; if (Ptr >= Len) Ptr -= Len; } // decrement the pointer (with wrapping around) void DecrPtr(size_t &Ptr, size_t Step=1) { if (Ptr >= Step) Ptr -= Step; else Ptr += (Len - Step); } // synchronize current pointer with another circular buffer template void operator |= (CircularBuffer Buffer) { Ptr = Buffer.Ptr; } // advance (increment) current pointer void operator += (size_t Step) { IncrPtr(Ptr, Step); } // decrement current pointer void operator -= (size_t Step) { DecrPtr(Ptr, Step); } // index operator to get the absolute data pointer Type *operator [] (size_t Idx) { return Data + (Idx * Width); } // get storage pointer corresponding to an absolute pipe pointer Type *AbsPtr(size_t Ptr) { return Data + (Ptr * Width); } // get storage pointer corresponding to current pipe pointer Type *CurrPtr(void) { return Data + (Ptr * Width); } // get storage pointer corresponding to current pointer +/- offset Type *OffsetPtr(int Offset) { Offset += Ptr; Offset *= Width; if (Offset < 0) Offset += Size; else if (Offset >= (int)Size) Offset -= Size; return Data + Offset; } }; // ===================================================================== template class MFSK_Demodulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; size_t DecodeMargin; int EqualizerDepth; // leave this at 0 (disable the equalizer) int Reverse; static const size_t CarrierSepar=2; static const size_t SpectraPerSymbol = 2; // FFT slices per symbol public: size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols private: size_t DecodeWidth; size_t SymbolSepar2; size_t WrapMask; Type *InpTap; // input buffer size_t InpTapPtr; Type *SymbolShape; // the shape of the symbol and the FFT window r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; // number of spectra points per FFT Cmpx *Spectra[SpectraPerSymbol]; // two buffers for FFT spectra Type *Energy[SpectraPerSymbol]; CircularBuffer EnergyBuffer; LowPass3_Filter *AverageEnergy; Type FilterWeight; public: MFSK_Demodulator() { Init(); Default(); } ~MFSK_Demodulator() { Free(); } void Init(void) { InpTap=0; SymbolShape=0; FFT_Buff=0; Spectra[0]=0; Spectra[1]=0; Energy[0]=0; Energy[1]=0; AverageEnergy=0; } void Free(void) { delete [] InpTap; InpTap=0; delete [] SymbolShape; SymbolShape=0; delete [] FFT_Buff; FFT_Buff=0; delete [] Spectra[0]; Spectra[0]=0; delete [] Spectra[1]; Spectra[1]=0; delete [] Energy[0]; Energy[0]=0; delete [] Energy[1]; Energy[1]=0; delete [] AverageEnergy; AverageEnergy=0; FFT.Free(); EnergyBuffer.Free(); } void Default(void) { SymbolLen=512; FirstCarrier=32; BitsPerSymbol=5; UseGrayCode=1; DecodeMargin=32; Reverse=0; EqualizerDepth=0; } int Preset(void) { Carriers=Exp2(BitsPerSymbol); WrapMask=SymbolLen-1; Type ShapeScale=1.0/SymbolLen; if (ReallocArray(&InpTap,SymbolLen)<0) goto Error; ClearArray(InpTap,SymbolLen); InpTapPtr=0; if (FFT.Preset(SymbolLen)<0) goto Error; if (ReallocArray(&FFT_Buff,SymbolLen)<0) goto Error; SymbolSepar=SymbolLen/2; SymbolSepar2=SymbolSepar/2; if (ReallocArray(&SymbolShape,SymbolLen)<0) goto Error; { size_t Time; double Ampl=MFSK_SymbolFreqShape[0]; for (Time=0; Time=SymbolLen) Phase-=SymbolLen; } } { size_t Time; for (Time=0; TimeFirstCarrier) DecodeMargin=FirstCarrier; DecodeWidth=(Carriers*CarrierSepar-1)+2*DecodeMargin; if (ReallocArray(&Energy[0],DecodeWidth)<0) goto Error; if (ReallocArray(&Energy[1],DecodeWidth)<0) goto Error; if (EqualizerDepth) { EnergyBuffer.Len=EqualizerDepth; EnergyBuffer.Width=DecodeWidth; if (EnergyBuffer.Preset()<0) goto Error; EnergyBuffer.Clear(); if (ReallocArray(&AverageEnergy,DecodeWidth)<0) goto Error; size_t Idx; for (Idx=0; Idx void Process(InpType *Input) { size_t InpIdx,Time; for (InpIdx=0; InpIdx0) { Energy[0][Idx]/=RefEnergy; Energy[1][Idx]/=RefEnergy; } else { Energy[0][Idx]=0; Energy[1][Idx]=0; } } */ EnergyBuffer+=2; } else { size_t Idx; if (Reverse==1) { size_t Freq=FirstCarrier; for (Idx=0; IdxPeak) { Peak=Energy; PeakIdx=Idx; } Freq+=CarrierSepar; } if (UseGrayCode) PeakIdx=BinaryCode(PeakIdx); return PeakIdx; } template void SoftDecode(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx; for (Bit=0; Bit0) { for (Bit=0; Bit void SoftDecode_Test(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx,Freq; Type *EnergyPtr=Energy[Slice]+(DecodeMargin+FreqOffset); // printf("SoftDecode:"); Type TotalEnergy=0; Type PeakEnergy=0; for (Freq=0,Idx=0; IdxPeakEnergy) PeakEnergy=Energy; } Type AverageNoise=(TotalEnergy-PeakEnergy)/(Carriers-1)/2; /* printf(" PeakEnergy/TotalEnergy=%4.3f",PeakEnergy/TotalEnergy); printf(" AverageNoise/TotalEnergy=%4.3f\n",AverageNoise/TotalEnergy); printf("Energy[%d]/Tot =",Carriers); for (Freq=0,Idx=0; Idx void PrintBinary(Type Number, size_t Bits) { Type Mask=1; Mask<<=(Bits-1); for ( ; Bits; Bits--) { printf("%c",Number&Mask ? '1':'0'); Mask>>=1; } } // ===================================================================== class MFSK_Encoder { public: size_t BitsPerSymbol; size_t BitsPerCharacter; public: size_t Symbols; size_t SymbolsPerBlock; bool bContestia; // bool bRTTYM; private: static const uint64_t ScramblingCodeOlivia = 0xE257E6D0291574ECLL; static const uint64_t ScramblingCodeContestia = 0xEDB88320LL; // static const uint64_t ScramblingCodeRTTYM = 0xEDB88320LL; uint64_t ScramblingCode; int8_t *FHT_Buffer; public: uint8_t *OutputBlock; public: MFSK_Encoder() { Default(); Init(); } ~MFSK_Encoder() { Free(); } void Default(void) { bContestia = false; BitsPerSymbol=5; BitsPerCharacter=7; ScramblingCode = ScramblingCodeOlivia; } void Init(void) { FHT_Buffer=0; OutputBlock=0; } void Free(void) { delete [] FHT_Buffer; FHT_Buffer=0; delete [] OutputBlock; OutputBlock=0; } int Preset(void) { if (bContestia) { ScramblingCode = ScramblingCodeContestia; BitsPerCharacter = 6; // } else if (bRTTYM) { // ScramblingCode = ScramblingCodeRTTYM; // BitsPerCharacter = 5; } else { // standard Olivia ScramblingCode = ScramblingCodeOlivia; BitsPerCharacter = 7; } Symbols = 1 << BitsPerSymbol; SymbolsPerBlock = Exp2(BitsPerCharacter-1); if (ReallocArray(&FHT_Buffer,SymbolsPerBlock)<0) goto Error; if (ReallocArray(&OutputBlock,SymbolsPerBlock)<0) goto Error; return 0; Error: Free(); return -1; } void EncodeCharacter(uint8_t Char) { size_t TimeBit; uint8_t Mask = (SymbolsPerBlock << 1) - 1; if (bContestia) { if (Char >= 'a' && Char <= 'z') Char += 'A' - 'a'; if (Char == ' ') Char = 59; else if (Char == '\r') Char = 60; else if (Char == '\n') Char = 0; else if (Char >= 33 && Char <= 90) Char -= 32; else if (Char == 8) Char = 61; else if (Char == 0) Char = 0; else Char = '?' - 32; // } else if (bRTTYM) { } else { Char &= Mask; } for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) FHT_Buffer[TimeBit] = 0; if (Char= BitsPerSymbol) Bit -= BitsPerSymbol; uint8_t Mask = 1; Mask <<= Bit; OutputBlock[TimeBit] |= Mask; } Rotate += 1; if (Rotate >= BitsPerSymbol) Rotate -= BitsPerSymbol; } } } void PrintOutputBlock(void) { size_t TimeBit; for (TimeBit=0; TimeBit class MFSK_SoftDecoder { public: size_t BitsPerSymbol; // number of bits per symbol size_t BitsPerCharacter; // number of bits per character size_t Symbols; // number of symbols size_t SymbolsPerBlock; // number of symbols per FEC block float Signal, NoiseEnergy; uint8_t *OutputBlock; bool bContestia; // bool bRTTYM; private: static const uint64_t ScramblingCodeOlivia = 0xE257E6D0291574ECLL; static const uint64_t ScramblingCodeContestia = 0xEDB88320LL; // static const uint64_t ScramblingCodeRTTYM = 0xEDB88320LL; uint64_t ScramblingCode; size_t InputBufferLen; InpType *InputBuffer; size_t InputPtr; CalcType *FHT_Buffer; public: MFSK_SoftDecoder() { bContestia = false; Init(); Default(); } ~MFSK_SoftDecoder() { Free(); } void Default(void) { bContestia = false; BitsPerSymbol = 5; BitsPerCharacter = 7; ScramblingCode = ScramblingCodeOlivia; } void Init(void) { InputBuffer = 0; FHT_Buffer = 0; OutputBlock = 0; } void Free(void) { delete [] InputBuffer; InputBuffer = 0; delete [] FHT_Buffer; FHT_Buffer = 0; delete [] OutputBlock; OutputBlock = 0; } void Reset(void) { size_t Idx; for (Idx = 0; Idx < InputBufferLen; Idx++) InputBuffer[Idx] = 0; InputPtr = 0; } int Preset(void) { // if (bRTTYM) { // BitsPerCharacter = 5; // ScramblingCode = ScramblingCodeRTTYM; // } else if (bContestia) { BitsPerCharacter = 6; ScramblingCode = ScramblingCodeContestia; } else { BitsPerCharacter = 7; ScramblingCode = ScramblingCodeOlivia; } Symbols = 1 << BitsPerSymbol; SymbolsPerBlock = Exp2(BitsPerCharacter - 1); InputBufferLen = SymbolsPerBlock * BitsPerSymbol; if (ReallocArray(&InputBuffer, InputBufferLen) < 0) goto Error; if (ReallocArray(&FHT_Buffer, SymbolsPerBlock) < 0) goto Error; if (ReallocArray(&OutputBlock, BitsPerSymbol) < 0) goto Error; Reset(); return 0; Error: Free(); return -1; } int Preset(MFSK_SoftDecoder &RefDecoder) { BitsPerSymbol = RefDecoder.BitsPerSymbol; // BitsPerCharacter = RefDecoder.BitsPerCharacter; return Preset(); } void Input(InpType *Symbol) { size_t FreqBit; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) { InputBuffer[InputPtr] = Symbol[FreqBit]; InputPtr += 1; } if (InputPtr >= InputBufferLen) InputPtr -= InputBufferLen; } void DecodeCharacter(size_t FreqBit) { size_t TimeBit; size_t Ptr = InputPtr; size_t Rotate = FreqBit; size_t CodeWrap = (SymbolsPerBlock - 1); // Olivia (13 bit shift) or Contestia/RTTYM (5 bit shift) // size_t nShift = (bContestia || bRTTYM) ? 5 : 13; size_t nShift = (bContestia) ? 5 : 13; size_t CodeBit = FreqBit * nShift; CodeBit &= CodeWrap; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { InpType Bit = InputBuffer[Ptr + Rotate]; uint64_t CodeMask = 1; CodeMask <<= CodeBit; if (ScramblingCode & CodeMask) Bit = (-Bit); FHT_Buffer[TimeBit] = Bit; CodeBit += 1; CodeBit &= CodeWrap; Rotate += 1; if (Rotate >= BitsPerSymbol) Rotate -= BitsPerSymbol; Ptr += BitsPerSymbol; if (Ptr >= InputBufferLen) Ptr -= InputBufferLen; } FHT(FHT_Buffer, SymbolsPerBlock); CalcType Peak = 0; size_t PeakPos = 0; CalcType SqrSum = 0; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { CalcType Signal = FHT_Buffer[TimeBit]; SqrSum += Signal * Signal; if (fabs(Signal) > fabs(Peak)) { Peak = Signal; PeakPos = TimeBit; } } uint8_t Char = PeakPos; if (Peak < 0) Char += SymbolsPerBlock; SqrSum -= Peak * Peak; if (bContestia && Char > 0) { if (Char == 59) Char = ' '; else if (Char == 60) Char = '\r'; else if (Char == 61) Char = 8; // backspace else Char += 32; } OutputBlock[FreqBit] = Char; NoiseEnergy += (float)SqrSum / (SymbolsPerBlock - 1); Signal += fabs(Peak); } void Process(void) { size_t FreqBit; Signal = 0; NoiseEnergy = 0; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) DecodeCharacter(FreqBit); Signal /= BitsPerSymbol; NoiseEnergy /= BitsPerSymbol; } size_t Output(uint8_t *Buffer) { size_t FreqBit; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) Buffer[FreqBit] = OutputBlock[FreqBit]; return BitsPerSymbol; } size_t Output(uint64_t &PackedBuffer) { size_t FreqBit; PackedBuffer = 0; for (FreqBit = BitsPerSymbol; FreqBit > 0; ) { PackedBuffer <<= 8; FreqBit--; PackedBuffer |= OutputBlock[FreqBit]; } return BitsPerSymbol; } void PrintOutputBlock(FILE *File = stdout) { size_t FreqBit; fprintf(File, "'"); for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) { uint8_t Char = OutputBlock[FreqBit]; fprintf(File, "%c", (Char >= ' ') && (Char < 127) ? Char:' '); } fprintf(File, "'"); if (NoiseEnergy > 0) fprintf(File, ", S/N = %5.1f", Signal / sqrt(NoiseEnergy)); fprintf(File, "\n"); } size_t Output(uint64_t *PackedBuffer) { return Output(*PackedBuffer); } }; // ===================================================================== // rate converter template class RateConverter { public: // parameters to be set by the user size_t TapLen; // filter tap length (in term of input samples) size_t OverSampling; // internal oversampling factor Type UpperFreq; // upper frequency of the (lowpass) filter (in terms of input sampling rate) Type OutputRate; // the output rate (in terms of the input rate) private: size_t FilterLen; // the total length of the filter (in term of oversampled rate) Type *FilterShape; // the shape of the filter Type *InputTap; // filter tap size_t InputTapPtr; size_t InputWrap; Type OutputTime; Type OutputPeriod; Type OutputBefore; Type OutputAfter; size_t OutputPtr; public: RateConverter() { Init(); Default(); } ~RateConverter() { Free(); } void Init(void) { FilterShape = 0; InputTap = 0; } void Free(void) { delete [] FilterShape; FilterShape = 0; delete [] InputTap; InputTap = 0; } void Default(void) { TapLen = 16; OverSampling = 16; UpperFreq = 3.0 / 8; OutputRate = 1.0; } int Preset(void) { size_t Idx; TapLen = Exp2(Log2(TapLen)); FilterLen = TapLen * OverSampling; if ((ReallocArray(&FilterShape, FilterLen)) < 0) goto Error; if ((ReallocArray(&InputTap, TapLen)) < 0) goto Error; for (Idx = 0; Idx < FilterLen; Idx++) { Type Phase = (M_PI * (2 * (int)Idx - (int)FilterLen)) / FilterLen; // Hanning // Type Window = 0.50 + 0.50 * cos(Phase); // Blackman // Type Window = 0.42 + 0.50 * cos(Phase) + 0.08 * cos(2 * Phase); // Blackman-Harris Type Window = 0.35875 + 0.48829 * cos(Phase) + 0.14128 * cos(2 * Phase) + 0.01168 * cos(3 * Phase); Type Filter = 1.0; if (Phase != 0) { Phase *= (UpperFreq * TapLen); Filter = sin(Phase) / Phase; } // printf("%3d: %+9.6f %+9.6f %+9.6f\n", Idx, Window, Filter, Window*Filter); FilterShape[Idx] = Window * Filter; } Reset(); return 0; Error: Free(); return -1; } void Reset(void) { size_t Idx; InputWrap = TapLen - 1; for (Idx = 0; Idx < TapLen; Idx++) InputTap[Idx] = 0; InputTapPtr = 0; OutputTime = 0; OutputPeriod = OverSampling / OutputRate; OutputBefore = 0; OutputAfter = 0; OutputPtr = 0; } private: Type Convolute(size_t Shift=0) { Type Sum = 0; Shift = (OverSampling - 1) - Shift; size_t Idx = InputTapPtr; for ( ; Shift < FilterLen; Shift += OverSampling) { Sum += InputTap[Idx] * FilterShape[Shift]; Idx += 1; Idx &= InputWrap; } return Sum; } void NewInput(Type Input) { // printf("I:\n"); InputTap[InputTapPtr]=Input; InputTapPtr+=1; InputTapPtr&=InputWrap; } public: template int Process(InpType *Input, size_t InputLen, OutType *Output) { size_t OutputLen = 0; // printf("E: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); for ( ; ; ) { // printf("L: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); if (OutputPtr) { size_t Idx = (size_t)floor(OutputTime) + 1; if (Idx >= OverSampling) { if (InputLen == 0) break; NewInput(*Input); Input++; InputLen -= 1; Idx -= OverSampling; OutputTime -= (Type)OverSampling; } OutputAfter = Convolute(Idx); Type Weight = Idx - OutputTime; (*Output) = Weight * OutputBefore + (1.0 - Weight) * OutputAfter; Output++; OutputLen += 1; // printf("O: %d %3.1f %d %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen, Idx); OutputPtr = 0; } else { size_t Idx = (size_t)floor(OutputTime + OutputPeriod); if (Idx >= OverSampling) { if (InputLen == 0) break; NewInput(*Input); Input++; InputLen -= 1; Idx -= OverSampling; OutputTime -= (Type)OverSampling; } OutputBefore = Convolute(Idx); OutputTime += OutputPeriod; OutputPtr = 1; } } // printf("R: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); return OutputLen; } template int Process(InpType Input, size_t InputLen, Seq &Output) { size_t OutPtr = Output.Len; size_t MaxOutLen = (size_t)ceil(InputLen * OutputRate + 2); if (Output.EnsureSpace(OutPtr + MaxOutLen) < 0) return -1; int OutLen = Process(Input, InputLen, Output.Elem+OutPtr); Output.Len += OutLen; return OutLen; } template int Process(InpType Input, OutType *Output) { return Process(&Input, 1, Output); } }; // ===================================================================== template class MFSK_Transmitter { public: // primary parameters: set by the user bool bContestia; size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 Type SampleRate; // audio sampling rate (internal processing) Type OutputSampleRate; // true sampling rate of the soundcard float FirstCarrierMultiplier; int Reverse; // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block size_t MaxOutputLen; // maximum length of the audio batch returned by Output() private: static const int State_Running = 0x0001; static const int State_StopReq = 0x0010; int State; FIFO Input; // buffer(queue) for the characters to be encoded uint8_t InputBlock[8]; // FEC code block buffer FIFO Monitor; // buffer for monitoring the characters being sent MFSK_Encoder Encoder; // FEC encoder size_t SymbolPtr; MFSK_Modulator Modulator; // MFSK modulator Type *ModulatorOutput; RateConverter Converter; // output rate converter Type *ConverterOutput; public: MFSK_Transmitter() { bContestia = false; Init(); } ~MFSK_Transmitter() { Free(); } void Init(void) { ModulatorOutput = 0; ConverterOutput = 0; } void Free(void) { Input.Free(); Monitor.Free(); Encoder.Free(); Modulator.Free(); delete [] ModulatorOutput; ModulatorOutput = 0; Converter.Free(); delete [] ConverterOutput; ConverterOutput = 0; } // set default primary parameters void Default(void) { Tones = 32; Bandwidth = 1000; Reverse = 0; SampleRate = 8000; OutputSampleRate = 8000; } // preset internal arrays according to primary paramaters int Preset(void) { // impose limits on the primary parameters if (Tones < 2 ) Tones = 2; else if (Tones > 256) Tones = 256; if (Bandwidth < 125) Bandwidth = 125; else if (Bandwidth > 2000) Bandwidth = 2000; // calculate the secondary parameters BitsPerSymbol = Log2(Tones); Tones = Exp2(BitsPerSymbol); // preset the input character buffer Input.Len = 1024; if (Input.Preset() <0 ) goto Error; Monitor.Len = 256; if (Monitor.Preset() < 0) goto Error; // preset the encoder Encoder.bContestia = bContestia; Encoder.BitsPerSymbol = BitsPerSymbol; if (Encoder.Preset() < 0) goto Error; SymbolsPerBlock = Encoder.SymbolsPerBlock; // preset the modulator Modulator.Default(); Modulator.BitsPerSymbol = BitsPerSymbol; Modulator.SymbolLen = (size_t)1 << (BitsPerSymbol + 7 - Log2(Bandwidth / 125)); Bandwidth = Exp2(Log2(Bandwidth / 125)) * 125; Modulator.FirstCarrier = (size_t) ((Modulator.SymbolLen / 16) * FirstCarrierMultiplier) + 1; Modulator.Reverse = Reverse; if (Modulator.Preset() < 0) goto Error; if (ReallocArray(&ModulatorOutput, Modulator.SymbolSepar) < 0) goto Error; // preset the rate converter Converter.OutputRate = OutputSampleRate / SampleRate; if (Converter.Preset() < 0) goto Error; MaxOutputLen = (size_t)ceil(Modulator.SymbolSepar * OutputSampleRate / SampleRate + 2); if (ReallocArray(&ConverterOutput, MaxOutputLen) < 0) goto Error; // reset the state logic SymbolPtr = 0; State = 0; return 0; Error: Free(); return -1; } void Reset(void) { Input.Reset(); Monitor.Reset(); SymbolPtr = 0; State = 0; Converter.Reset(); } Type BaudRate(void) { return SampleRate / Modulator.SymbolSepar; } Type BlockPeriod(void) { return (SymbolsPerBlock * Modulator.SymbolSepar) / SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol * SampleRate / (SymbolsPerBlock * Modulator.SymbolSepar); } // start the transmission void Start(void) { State |= State_Running; } // request to stop (and complete) the transmission // but the transmitter will only stop after transmitting all the data void Stop(void) { State |= State_StopReq; } // check if the transmission is still running (not complete) int Running(void) { return State & State_Running; } // put the character into the transmitter input queue int PutChar(uint8_t Char) { return Input.Write(Char); } // get one character from the monitor buffer int GetChar(uint8_t &Char) { return Monitor.Read(Char); } size_t GetReadReady(void) { return Input.ReadReady(); } int DoPostambleYet(void) { if (State == 0) return 1; else return 0; } double GetSymbolPhase(void) { return Modulator.SymbolPhase; } // get out the transmitter output (audio) int Output(double *Buffer) { if (SymbolPtr == 0) { if ((State&State_StopReq) && Input.Empty()) { State=0; } else if (State&State_Running) { size_t Idx; for (Idx = 0; Idx < BitsPerSymbol; Idx++) { uint8_t Char; if (Input.Read(Char) <= 0) break; InputBlock[Idx] = Char; Monitor.Write(Char); } for ( ; Idx < BitsPerSymbol; Idx++) InputBlock[Idx] = 0; Encoder.EncodeBlock(InputBlock); } } if (State&State_Running) { Modulator.Send(Encoder.OutputBlock[SymbolPtr]); SymbolPtr += 1; if (SymbolPtr >= SymbolsPerBlock) SymbolPtr = 0; } int ModLen = Modulator.Output(ModulatorOutput); int ConvLen = Converter.Process(ModulatorOutput, ModLen, ConverterOutput); if (ConvLen < 0) return ConvLen; double maxval = 0, tempnum; for (int Idx = 0; Idx < ConvLen; Idx++) if ((tempnum = fabs(ConverterOutput[Idx])) > maxval) maxval = tempnum; for (int Idx = 0; Idx < ConvLen; Idx++) Buffer[Idx] = (double) ConverterOutput[Idx] / maxval; return ConvLen; } }; // ===================================================================== /* How to use the MFSK_Receiver class: 1. create an object like: #include "mfsk.h" MFSK_Receiver Receiver; 2. Set the parameters, for example: Receiver.Tones = 32; // number of tones (symbols) Receiver.Bandwidth = 1000; // bandwidth [Hz] Receiver.SyncMargin = 8; // synchronizer tune margin [tone freq. spacing] Receiver.SyncIntegLen = 4; // synchronizer integration period [FEC blocks] Receiver.SyncThreshold = 3.2; // S/N threshold for printing Receiver.SampleRate = 8000.0; // internal processor sampling rate [Hz] Receiver.InputSampleRate = 8000.0; // soundcard sampling rate [Hz] You don't need to set all the parameters, as upon creation of the Receiver object they are already given certain default values. If you changed parameters at one time and want later to go back to the default values you can call: Receiver.Default(); 3. Preset the Receiver internal arrays for the parameters you just set: if (Receiver.Preset()<0) printf("Not enough RAM or another problem\n"); Each time you change the parameters you need to call Preset() in order to resize the internal arrays. Preset() will as well destroy all data being in the process of decoding, if you need this data then call first Receiver.Flush() 4. Read back the parameters you set in point 1., they could have been adjusted by Preset() to their closest allowed values. 5. Feed the audio into the Receiver: Receiver.Process(AudioBuffer, BufferLength); AudioBuffer can be an array of int16_t (16-bit signed integers) that you fill with the data from the soundcard. I suggest you feed the receiver with batches of 512 or 1024 samples, but in can be any number of samples at a time. 6. Call GetChar(Char) to get decoded characters. Note, that characters come in batches, and so, you need to call GetChar() possibly several times. GetChar() returns 0 when the decoder FIFO is empty or 1 when not empty. In the latter case the argument contains the character read form the FIFO. The loop could be like: for ( ; ; ) { uint8_t Char; if (Receiver.GetChar(Char)==0) break; printf("%c",Char); } Keep in mind that you may see (random) control code characters here, and thus you must be able to deal with them. I suggest to process only carriage return (code=13) and Backspace (code=8). NUL (code=0) is the idle character: it is being sent when there is no text to be sent. 7. At any time you can read the signal-to-noise ratio of the incoming signal by calling Receiver.SignalToNoiseRatio() or frequency offset by calling Receiver.FrequencyOffset() 8. When the user decides to turn off the receiver and switch over to transmitt you may still call Receiver.Flush()in order to flush the data still being buffered in the decoder pipeplines. */ template class MFSK_Receiver { public: // primary parameters: set by the user bool bContestia; size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 size_t SyncMargin; // synchronizer search margin, frequency-wide size_t SyncIntegLen; // synchronizer integration period Type SyncThreshold; // synchronizer S/N threshold Type SampleRate; // audio sampling rate (internal processing) Type InputSampleRate; // true sampling rate of the soundcard float FirstCarrierMultiplier; int Reverse; // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block private: RateConverter Converter; Seq InputBuffer; MFSK_InputProcessor InputProcessor; // equalizes the input spectrum // and removes coherent interferences MFSK_Demodulator Demodulator; // FFT demodulator const static size_t SlicesPerSymbol = MFSK_Demodulator::SpectraPerSymbol; // number of possible frequency offsets size_t FreqOffsets; // number of possible time-phases within the FEC block size_t BlockPhases; // reference decoder MFSK_SoftDecoder RefDecoder; // array of decoders MFSK_SoftDecoder *Decoder; // current running time-phase size_t BlockPhase; // FEC noise integrators CircularBuffer< LowPass3_Filter > SyncNoiseEnergy; // FEC signal integrators CircularBuffer< LowPass3_Filter > SyncSignal; // weight for the integrators Type SyncFilterWeight; // best signal Type SyncBestSignal; // time-phase of the best signal size_t SyncBestBlockPhase; // frequency offset of the best signal size_t SyncBestFreqOffset; // S/N corresponding to the SyncBestSignal Type SyncSNR; // pipeline for decoded FEC blocks CircularBuffer *DecodePipe; // buffer for decoded characters FIFO Output; public: MFSK_Receiver() { bContestia = false; Init(); Default(); } ~MFSK_Receiver() { Free(); } void Init(void) { Decoder = 0; DecodePipe = 0; } void Free(void) { if (Decoder) { size_t Idx; for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Free(); delete [] Decoder; Decoder=0; } if (DecodePipe) { size_t Idx; for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Free(); delete [] DecodePipe; DecodePipe = 0; } Converter.Free(); InputBuffer.Free(); InputProcessor.Free(); Demodulator.Free(); RefDecoder.Free(); SyncSignal.Free(); SyncNoiseEnergy.Free(); Output.Free(); } // set defaults values for all parameters void Default(void) { Tones = 32; Reverse = 0; Bandwidth = 1000; SyncMargin = 8; SyncIntegLen = 4; SyncThreshold = 3.0; SampleRate = 8000; InputSampleRate = 8000.0; } // resize internal arrays according the parameters int Preset(void) { size_t Idx; if (Tones < 2) Tones = 2; else if (Tones > 256) Tones = 256; if (Bandwidth < 125) Bandwidth = 125; else if (Bandwidth > 2000) Bandwidth = 2000; if (SyncMargin < 2) SyncMargin = 2; if (SyncIntegLen < 2) SyncIntegLen = 2; if (SyncThreshold < 3.0) SyncThreshold = 3.0; BitsPerSymbol = Log2(Tones); Tones = Exp2(BitsPerSymbol); Converter.OutputRate = SampleRate/InputSampleRate; if (Converter.Preset() < 0) goto Error; Demodulator.BitsPerSymbol = BitsPerSymbol; Demodulator.SymbolLen = Exp2(BitsPerSymbol + 7 - Log2(Bandwidth/125)); Bandwidth = Exp2(Log2(Bandwidth/125)) * 125; Demodulator.FirstCarrier = (size_t) ((Demodulator.SymbolLen/16) * FirstCarrierMultiplier) + 1; Demodulator.Reverse = Reverse; Demodulator.DecodeMargin = SyncMargin; if (Demodulator.Preset() < 0) goto Error; SyncMargin = Demodulator.DecodeMargin; InputProcessor.WindowLen = 16 * Demodulator.SymbolLen; if (InputProcessor.Preset() < 0) goto Error; RefDecoder.Default(); RefDecoder.BitsPerSymbol=BitsPerSymbol; RefDecoder.bContestia = bContestia; if (RefDecoder.Preset()<0) goto Error; SymbolsPerBlock=RefDecoder.SymbolsPerBlock; if (Decoder) { for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Free(); } if (DecodePipe) { for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Free(); } FreqOffsets = 2 * SyncMargin + 1; BlockPhases = SlicesPerSymbol * SymbolsPerBlock; if (ReallocArray(&Decoder, SlicesPerSymbol * FreqOffsets) < 0) goto Error; for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) { Decoder[Idx].bContestia = bContestia; Decoder[Idx].Init(); } for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) if (Decoder[Idx].Preset(RefDecoder) < 0) goto Error; if (ReallocArray(&DecodePipe,BlockPhases) < 0) goto Error; for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Init(); for (Idx = 0; Idx < BlockPhases; Idx++) { DecodePipe[Idx].Width = FreqOffsets; DecodePipe[Idx].Len = SyncIntegLen; if (DecodePipe[Idx].Preset() < 0) goto Error; DecodePipe[Idx].Clear(); } SyncSignal.Width = FreqOffsets; SyncSignal.Len = BlockPhases; if (SyncSignal.Preset() < 0) goto Error; SyncSignal.Clear(); SyncNoiseEnergy.Width = FreqOffsets; SyncNoiseEnergy.Len = BlockPhases; if (SyncNoiseEnergy.Preset() < 0) goto Error; SyncNoiseEnergy.Clear(); SyncFilterWeight = 1.0 / SyncIntegLen; BlockPhase=0; SyncBestSignal = 0; SyncBestBlockPhase = 0; SyncBestFreqOffset = 0; SyncSNR = 0; if (InputBuffer.EnsureSpace(InputProcessor.WindowLen + 2048) < 0) goto Error; Output.Len = 1024; if (Output.Preset() < 0) goto Error; return 0; Error: Free(); return -1; } void Reset(void) { size_t Idx; Converter.Reset(); InputBuffer.Clear(); InputProcessor.Reset(); for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Reset(); for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Clear(); SyncSignal.Clear(); SyncNoiseEnergy.Clear(); BlockPhase = 0; SyncBestSignal = 0; SyncBestBlockPhase = 0; SyncBestFreqOffset = 0; SyncSNR = 0; Output.Reset(); } char *PrintParameters(void) { static char szParams[1000]; Type FreqBin = SampleRate/Demodulator.SymbolLen; snprintf(szParams, sizeof(szParams), "\ %d tones, %4.2f Hz/tone, %4.1f Hz bandwidth\n\ %d bits/symbol(tone), %4.2f baud\n\ FEC block: %d char. => %d x %d bits, %3.1f sec\n\ Audio band: %3.1f - %3.1f Hz, %3.1f Hz total\n\ Tuning tolerance = +/- %3.1f Hz\n\ Sync. S/N threshold = %3.1f\n", (int)Demodulator.Carriers, FreqBin*Demodulator.CarrierSepar, FreqBin*Demodulator.CarrierSepar*Demodulator.Carriers, (int)Demodulator.BitsPerSymbol, SampleRate/Demodulator.SymbolSepar, (int)RefDecoder.BitsPerSymbol, (int)RefDecoder.BitsPerSymbol, (int)RefDecoder.SymbolsPerBlock, (SymbolsPerBlock*Demodulator.SymbolSepar)/SampleRate, FreqBin * Demodulator.FirstCarrier, FreqBin * (Demodulator.FirstCarrier + Demodulator.CarrierSepar * Demodulator.Carriers), FreqBin * Demodulator.CarrierSepar * Demodulator.Carriers, FreqBin * SyncMargin, SyncThreshold ); return szParams; } Type BaudRate(void) { return SampleRate / Demodulator.SymbolSepar; } Type TuneMargin(void) { return SyncMargin * (SampleRate / Demodulator.SymbolLen); } Type BlockPeriod(void) { return (SymbolsPerBlock * Demodulator.SymbolSepar) / SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol * SampleRate / (SymbolsPerBlock*Demodulator.SymbolSepar); } Type SignalToNoiseRatio(void) { return SyncSNR; } Type FrequencyOffset(void) { return ( (int)SyncBestFreqOffset - (int)FreqOffsets / 2) * (SampleRate / Demodulator.SymbolLen); } Type TimeOffset(void) { return ( (Type)SyncBestBlockPhase / SlicesPerSymbol) * (Demodulator.SymbolSepar / SampleRate); } // process an audio batch: first the input processor, then the demodulator template int Process(InpType *Input, size_t InputLen) { if (Converter.Process(Input, InputLen, InputBuffer) < 0) return -1; ProcessInputBuffer(); return 0; } void Flush(void) { ProcessInputBuffer(); size_t Idx; for (Idx = InputBuffer.Len; Idx < InputProcessor.WindowLen; Idx++) InputBuffer[Idx] = 0; InputBuffer.Len = InputProcessor.WindowLen; ProcessInputBuffer(); for (Idx = 0; Idx < InputProcessor.WindowLen; Idx++) InputBuffer[Idx] = 0; size_t FlushLen = Demodulator.SymbolSepar * SymbolsPerBlock * SyncIntegLen * 2; for (Idx=0; Idx= InputProcessor.WindowLen) { InputProcessor.Process(InputBuffer.Elem); InputBuffer.Delete(0, InputProcessor.WindowLen); size_t Idx; for (Idx = 0; Idx < InputProcessor.WindowLen; Idx += Demodulator.SymbolSepar ) ProcessSymbol(InputProcessor.Output+Idx); } } // process (through the demodulator) an audio batch corresponding to one symbol // demodulator always uses audio batches corresponding to one symbol period template void ProcessSymbol(InpType *Input) { Demodulator.Process(Input); MFSK_SoftDecoder *DecoderPtr = Decoder; size_t Offset,Slice; for (Slice = 0; Slice < SlicesPerSymbol; Slice++) { LowPass3_Filter *NoiseEnergyPtr = SyncNoiseEnergy.AbsPtr(BlockPhase); LowPass3_Filter *SignalPtr = SyncSignal.AbsPtr(BlockPhase); uint64_t *DecodeBlockPtr = DecodePipe[BlockPhase].CurrPtr(); size_t BestSliceOffset = 0; Type BestSliceSignal = 0; Type NoiseEnergy = 0; Type Signal; Type Symbol[8]; for (Offset = 0; Offset < FreqOffsets; Offset++) { Demodulator.SoftDecode(Symbol, Slice, (int)Offset - (FreqOffsets / 2)); DecoderPtr->Input(Symbol); DecoderPtr->Process(); DecoderPtr->Output(DecodeBlockPtr); NoiseEnergy = DecoderPtr->NoiseEnergy; NoiseEnergyPtr->Process(NoiseEnergy, SyncFilterWeight); Signal = DecoderPtr->Signal; SignalPtr->Process(Signal, SyncFilterWeight); Signal = SignalPtr->Output; if (Signal > BestSliceSignal) { BestSliceSignal = Signal; BestSliceOffset = Offset; } DecoderPtr++; DecodeBlockPtr++; NoiseEnergyPtr++; SignalPtr++; } DecodePipe[BlockPhase] += 1; if (BlockPhase == SyncBestBlockPhase) { SyncBestSignal = BestSliceSignal; SyncBestFreqOffset = BestSliceOffset; } else { if (BestSliceSignal > SyncBestSignal) { SyncBestSignal = BestSliceSignal; SyncBestBlockPhase = BlockPhase; SyncBestFreqOffset = BestSliceOffset; } } int Dist = (int)BlockPhase - (int)SyncBestBlockPhase; if (Dist < 0) Dist += BlockPhases; if (Dist == (int)(BlockPhases / 2)) { Type BestNoise = sqrt( NoiseEnergyPtr->Output); if (BestNoise == 0) SyncSNR = 0; else SyncSNR = SyncBestSignal / BestNoise; // printf( // "%d, %6.3f/%6.3f = %5.2f\n", // SyncBestFreqOffset, // SyncBestSignal, // BestNoise, // SyncSNR ); if (SyncSNR >= SyncThreshold) { uint64_t *BestBlockPtr = DecodePipe[SyncBestBlockPhase].CurrPtr(); uint64_t Block = BestBlockPtr[SyncBestFreqOffset]; for ( size_t Byte = 0; Byte < BitsPerSymbol; Byte++) { uint8_t Char = Block&0xFF; Output.Write(Char); Block >>= 8; } } if (SyncSNR > 100) SyncSNR = 0.0; } BlockPhase++; } if (BlockPhase >= BlockPhases) BlockPhase -= BlockPhases; } }; #endif fldigi-4.1.06/src/include/jalocha/pj_cmpx.h0000664000175000017500000001304113507755043015417 00000000000000 // Complex numbers // (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __CMPX_H__ #define __CMPX_H__ #include #include // ---------------------------------------------------------------------------- // float/double/other-complex type template class Cmpx { public: Type Re,Im; public: template Cmpx const &operator=(const Cmpx &New) { Re = New.Re; Im = New.Im; return (*this); } template Cmpx const &operator=(const Type2 &New) { Re = New; Im = 0; return (*this); } template void Set(Type2 NewRe, Type2 NewIm = 0) { Re = NewRe; Im = NewIm; } template void Set(Cmpx New) { Re = New.Re; Im = New.Im; } void SetPhase(double Phase, double Mag = 1.0) { Re = Mag * cos(Phase); Im = Mag * sin(Phase); } void Conugate(void) { Im = (-Im); } void Negate(void) { Re = (-Re); Im = (-Im); } void QuarterTurnLeft(void) { Type OldIm = Im; Im = Re; Re = (-OldIm); } void QuarterTurnRight(void) { Type OldIm = Im; Im = (-Re); Re = OldIm; } double Energy(void) { return Re * Re + Im * Im; } double Mag2(void) { return Re * Re + Im * Im; } double Mag(void) { return sqrt(Re * Re + Im * Im); } double Phase(void) { return atan2(Im, Re); } int Zero(void) { return (Re == 0) && (Im == 0); } int NotZero(void) { return (Re != 0) || (Im != 0); } // template // void operator *= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } // template // void operator /= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } template double VectDotProd(Cmpx X) { return Re * X.Re + Im * X.Im; } void Print(char *Form = (char *)"%+6.3f") { printf("["); printf(Form, Re); printf(","); printf(Form, Im); printf("]"); } } ; typedef Cmpx fcmpx; typedef Cmpx dcmpx; // Some complex operators: // at least with the BC++ they carry some overhead because // a function is always called instead of making the code inline. template // equal (both Re and Im) ? inline int operator ==(Cmpx &Left, Cmpx &Right) { return (Left.Re == Right.Re) && (Left.Im == Right.Im); } template // equal (both Re and Im) ? inline int operator !=(Cmpx &Left, Cmpx &Right) { return (Left.Re != Right.Re) || (Left.Im != Right.Im); } template // equal ? inline int operator ==(Cmpx &Left, type &Right) { return (Left.Re == Right) && (Left.Im == 0); } template // not equal ? inline int operator !=(Cmpx &Left, RightType &Right) { return (Left.Re != Right) || (Left.Im != 0); } template // bigger (magnitude) ? inline int operator >(Cmpx &Left, Cmpx &Right) { return Left.Mag2() > Right.Mag2(); } template // smaller (magnitude) ? inline int operator <(Cmpx &Left, Cmpx &Right) { return Left.Mag2() < Right.Mag2(); } template // addition to the argument on the left inline void operator +=(Cmpx &Dst, Cmpx &Src) { Dst.Re += Src.Re; Dst.Im += Src.Im; } template // subtraction from the argument on the left inline void operator -=(Cmpx &Dst, Cmpx &Src) { Dst.Re -= Src.Re; Dst.Im -= Src.Im; } template // multiplication by a scalar inline void operator *=(Cmpx &Dst, num Src) { Dst.Re *= Src; Dst.Im *= Src; } template // multiplication by another complex number inline void operator *=(Cmpx &Dst, Cmpx Src) { type Re = Dst.Re * Src.Re - Dst.Im * Src.Im; type Im = Dst.Re * Src.Im + Dst.Im * Src.Re; Dst.Re = Re; Dst.Im = Im; } template // division by a scalar inline void operator /=(Cmpx &Dst, num Src) { Dst.Re /= Src; Dst.Im /= Src; } template // scalar multiplication inline double operator *(Cmpx &Left, Cmpx &Right) { return Left.Re * Right.Re + Left.Im * Right.Im; } // some arithmetic functions: // scalar product of two vectors template inline double ScalProd(Cmpx &A, Cmpx &B) { return A.Re * B.Re + A.Im * B.Im; } template inline double ScalProd(typeA Ia, typeA Qa, Cmpx &B) { return Ia * B.Re + Qa*B.Im; } // complex multiply template inline void CmpxMultAxB(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re = A.Re * B.Re - A.Im * B.Im; Dst.Im = A.Re * B.Im + A.Im * B.Re; } template inline void CmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cmpx &A, Cmpx &B) { DstI = A.Re * B.Re - A.Im * B.Im; DstQ = A.Re * B.Im + A.Im * B.Re; } // complex multiply, second argument with a "star" (B.im is negated) // (effectively subtracts the phase of the second argument) template inline void CmpxMultAxBs(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re = A.Re * B.Re + A.Im * B.Im; Dst.Im = A.Im * B.Re - A.Re * B.Im; } template void CmpxSqrt(Cmpx &X) { Type Mag = X.Mag(); int NegIm = (X.Im < 0); X.Im = sqrt((Mag - X.Re) / 2); X.Re = sqrt((Mag + X.Re) / 2); if (NegIm) X.Re = (-X.Re); } template void CmpxSquare(Cmpx &X) { Type Re = X.Re * X.Re - X.Im * X.Im; X.Im = 2 * X.Re * X.Im; X.Re = Re; } // ---------------------------------------------------------------------------- #endif /* __CMPX_H__ */ fldigi-4.1.06/src/include/jalocha/pj_lowpass3.h0000664000175000017500000000226513507755043016231 00000000000000// (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __LOWPASS3_H__ #define __LOWPASS3_H__ // ========================================================================== // IIR low pass filter for integration (averaging) purposes // Overshoot is about 1% for Feedback=0.5, and about 1e-6 for Feedback=0.1 // Weight is 1 / PeakingTime template class LowPass3_Filter { public: Type Out1, Out2, Output; template void Process(InpType Inp, WeightType Weight, WeightType Feedback = 0.1) { Weight *= 2.0; Type DiffI1 = Inp; DiffI1 -= Out1; Type Diff12 = Out1; Diff12 -= Out2; Type Diff23 = Out2; Diff23 -= Output; DiffI1 *= Weight; Out1 += DiffI1; Diff12 *= Weight; Out2 += Diff12; Diff23 *= Weight; Output += Diff23; Diff23 *= Feedback; Out2 += Diff23; } template void operator = (LevelType Level) { Out1 = Level; Out2 = Level; Output=Level; } template void Set(LevelType Level = 0) { Out1 = Level; Out2 = Level; Output=Level; } }; // ========================================================================== #endif // of __LOWPASS3_H__ fldigi-4.1.06/src/include/jalocha/pj_fht.h0000664000175000017500000000232213507755043015231 00000000000000// Fast Hadamard Transform, Pawel Jalocha, December 2004 // (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __FHT_H__ #define __FHT_H__ // Forward Fast Hadamard Transform template // Type can be float, Cmpx<>, int8_t, etc. void FHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for (Step = 1; Step < Len; Step *= 2) { for (Ptr = 0; Ptr < Len; Ptr += 2 * Step) { for (Ptr2 = Ptr; (Ptr2 - Ptr) < Step; Ptr2 += 1) { Bit1 = Data[Ptr2]; Bit2 = Data[Ptr2 + Step]; NewBit1 = Bit2; NewBit1 += Bit1; NewBit2 = Bit2; NewBit2 -= Bit1; Data[Ptr2] = NewBit1; Data[Ptr2 + Step] = NewBit2; } } } } // Inverse Fast Hadamard Transform template void IFHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for (Step = Len/2; Step; Step /= 2) { for (Ptr = 0; Ptr < Len; Ptr += 2 * Step) { for (Ptr2 = Ptr; (Ptr2 - Ptr) < Step; Ptr2 += 1) { Bit1 = Data[Ptr2]; Bit2 = Data[Ptr2 + Step]; NewBit1 = Bit1; NewBit1 -= Bit2; NewBit2 = Bit1; NewBit2 += Bit2; Data[Ptr2] = NewBit1; Data[Ptr2 + Step] = NewBit2; } } } } #endif // of __FHT_H__ fldigi-4.1.06/src/include/jalocha/pj_struc.h0000664000175000017500000002504313507755043015615 00000000000000// data structures, includes dynamically allocated vectors and arrays // (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __STRUC_H__ #define __STRUC_H__ #include #include #include // ======================================================================== // array re(sizing), copy, move, preset, etc. template inline int ReallocArray(type **Array, size_t Size) { delete [] *Array; *Array = new type[Size]; return (*Array == 0); } template inline int AllocArray(type **Array, size_t Size) { (*Array)= new type[Size]; return (*Array)== 0 ; } template inline void ClearArray(type *Array, size_t Size) { memset(Array,0,Size*sizeof(type)); } template void PresetArray(type *Array, size_t Size, const type &Val) { size_t i; for (i = 0; i < Size; i++) Array[i] = Val; } template inline void CopyArray(type *Dst, type *Src, size_t Size) { memcpy(Dst, Src, Size * sizeof(type)); } template inline void MoveArray(type *Dst, type *Src, size_t Size) { memmove(Dst ,Src, Size * sizeof(type)); } template void PrintArray(type *Array, size_t Size, char *ValueFormat, char *IndexFormat=(char *)"%3d", size_t Columns=10) { size_t Idx,Col; for (Col = 0, Idx = 0; Idx < Size; Idx++) { if (Col == 0) { printf(IndexFormat,Idx); printf(":"); } printf(" "); printf(ValueFormat, Array[Idx]); Col++; if (Col >= Columns) { printf("\n"); Col=0; } } if (Col > 0) printf("\n"); } // ======================================================================== // a sequence of any (fixed size) items template class Seq { public: Seq(); ~Seq(); // default constructor/destructor Seq(Seq &SrcSeq); // copy constructor void Init(); // user callable "constructor" int EnsureSpace(size_t ReqSpace); // make sure that there is enough space int EnsureSpace(void) { return EnsureSpace(Len); } int SetLen(size_t NewLen) { Len=NewLen; return EnsureSpace(Len); } int ReallocLen(size_t NewLen); int EnsureSpaceSafe(size_t ReqSpace); void Free(void); // free all allocated space, remove all data void Clear(void) { Len=0; } // clear the sequence (set length to zero) size_t Index(type *Item) { return (size_t)(Item-Elem); } type &operator[] (int idx) { return (Elem[idx]); } // [index] operator Seq const &operator=(Seq const &SrcSeq); // assignment operator type *First(void) { return Elem; } type *Last(void) { return Elem+(Len-1); } type *Append(size_t Num=1); // add one or more elements at the seq. end, returns the pointer to the new element(s) type *Insert(size_t Pos=0, size_t Num=1); // insert Num elements at Pos void Delete(size_t Pos=0, size_t Num=1); // delete Num elements at Pos void Shift(int Pos, const type &Fill); // shift left or right with filling int Truncate(size_t Margin=0); // remove unused but allocated space int Copy(type *Data, size_t DataLen); int Copy(Seq &Src, size_t StartPos=0) // copy the contains of another sequence { return Copy(Src.Elem + StartPos, Src.Len - StartPos); } int Copy(Seq &Seq, size_t StartPos, size_t MaxLen); void Move(Seq &Seq); // move the contains of another sequence, clear the other sequence int Join(const type &Data); int Join(type *Data, size_t DataLen); // join (append) given data int Join(Seq &Seq) { return Join(Seq.Elem,Seq.Len); } // join a copy of the other sequence int NullTerm(void); // null-terminate (for character strings) void Reverse(void); // reverse the sequence order void FillWith(const type &Data, size_t StartPos=0); // fill with given value void Print(char *Format, size_t Columns=10); int SaveToFile(FILE *File); int LoadFromFile(FILE *File); public: size_t Space; // that many elements are allocated in *Elem size_t Len; // that many elements are used up type *Elem; // the storage space, contains Len elements } ; template Seq::Seq() { Elem=0; Len=Space=0; } template void Seq::Init() { Elem=0; Len=Space=0; } template Seq::~Seq() { delete [] (Elem); } template Seq::Seq(Seq &SrcSeq) { if (EnsureSpace(SrcSeq.Len) == 0) { Len = SrcSeq.Len; memcpy(Elem, SrcSeq.Elem, Len * sizeof(type)); } } template void Seq::Free(void) { delete [] Elem; Elem = 0; Space = Len = 0; } template int Seq::EnsureSpace(size_t ReqSpace) { if (ReqSpace <= Space) return 0; delete [] Elem; Elem = new type[ReqSpace * sizeof(type)]; if (Elem == 0) { Space = Len = 0; return -1; } Space = ReqSpace; return 0; } template Seq const &Seq::operator=(Seq const &SrcSeq) { if ((this != &SrcSeq) && (EnsureSpace(SrcSeq.Len) == 0)) { Len = SrcSeq.Len; memcpy(Elem, SrcSeq.Elem, Len* sizeof(type)); } return (*this); } template int Seq::ReallocLen(size_t NewLen) { delete [] Elem; Elem = new type[NewLen * sizeof(type)]; if (Elem == 0) { Space = Len = 0; return -1; } Space = Len = NewLen; return 0; } template int Seq::Truncate(size_t Margin) { if (Space == (Len + Margin)) return 0; delete [] Elem; Elem = new type[(Len + Margin) * sizeof(type)]; if (Elem == 0) { Space = Len = 0; return -1; } Space = Len+Margin; return 0; } template void Seq::Move(Seq &Seq) { delete [] Elem; Len = Seq.Len; Space = Seq.Space; Elem = Seq.Elem; Seq.Elem = 0; Seq.Len = Seq.Space = 0; } template int Seq::Copy(type *Data, size_t DataLen) { if (EnsureSpace(DataLen)) return -1; memcpy(Elem, Data, DataLen * sizeof(type)); Len = DataLen; return 0; } template int Seq::Copy(Seq &Src, size_t StartPos, size_t MaxLen) { int DataLen; DataLen = Src.Len - StartPos; if (DataLen > MaxLen) DataLen = MaxLen; if (EnsureSpace(DataLen)) return -1; memcpy(Elem, Src.Elem + StartPos, DataLen * sizeof(type)); Len = DataLen; return 0; } template int Seq::Join(const type &Data) { if (EnsureSpace(Len + 1)) return -1; Elem[Len++] = Data; return 0; } template int Seq::Join(type *Data, size_t DataLen) { if (EnsureSpace(Len + DataLen)) return -1; memcpy(Elem + Len, Data, DataLen * sizeof(type)); Len += DataLen; return 0; } template type *Seq::Insert(size_t Pos, size_t Num) { if (EnsureSpace(Len + Num)) return 0; if ((Len - Pos) > 0) memmove(Elem + Pos + Num, Elem + Pos, (Len - Pos) * sizeof(type)); Len += Num; return Elem + Pos; } template void Seq::Delete(size_t Pos, size_t Num) { if ((Len - Pos - Num) > 0) memmove(Elem + Pos, Elem + Pos + Num, (Len - Pos - Num) * sizeof(type)); Len -= Num; } template type *Seq::Append(size_t Num) { if (EnsureSpace(Len + Num)) return 0; Len += Num; return Elem + (Len - Num); } template void Seq::Reverse(void) { size_t i, j; type T; for (i = 0,j = Len - 1; i < j; i++, j--) { T = Elem[i]; Elem[i] = Elem[j]; Elem[j] = T; } } template void Seq::FillWith(const type &Data, size_t StartPos) { size_t i; for (i = StartPos; i < Len; i++) Elem[i] = Data; } template void Seq::Shift(int Pos, const type &Fill) { size_t i; if (Pos > 0) { // shift toward higher positions - data inserted at the start of the sequence if (Pos < Len) memmove(Elem+Pos,Elem,(Len-Pos)*sizeof(type)); else Pos = Len; for (i = 0; i < Pos; i++) Elem[i] = Fill; } else if (Pos < 0) { // shift toward lower positions - data inserted at the end Pos = (-Pos); if (Pos < Len) memmove(Elem,Elem+Pos,(Len-Pos)*sizeof(type)); else Pos = Len; for (i = Len - Pos; i < Len; i++) Elem[i]=Fill; } } template void Seq::Print(char *Format, size_t Columns) { size_t i,Col; for (Col = 0, i = 0; i < Len; i++) { if (Col == 0) { printf("%3d:",i); } printf(" "); printf(Format,Elem[i]); Col++; if (Col >= Columns) { printf("\n"); Col=0; } } if (Col > 0) printf("\n"); } // ======================================================================== // A buffer structure for processing a continues series of samples. // It is a linear array: // - data between "Read" and "Write" is ready to be readout // - data between "Write" and "Size" is still beeing written or processed // - data before "Read" has been read-out and is thus obsolete // As more data comes the samples must be shifted and the obsolete data removed: // this is done by: RemovePastData() template class SampleBuffer { public: SampleBuffer() { Sample = 0; AllocSize = Size = Read = Write = 0; } ~SampleBuffer() { delete [] Sample; } void Free(void) { delete [] Sample; Sample = 0; AllocSize = Size = Read = Write = 0; } int EnsureSize(size_t MaxSize) { // printf(" SampleBuffer::EnsureSize(%d)\n",MaxSize); if (MaxSize <= AllocSize) return 0; delete [] Sample; Sample = new Type[MaxSize * sizeof(Type)]; if (Sample == 0) { AllocSize = Size = 0; return -1; } AllocSize = MaxSize; return 0; } int EnsureWriteLen(size_t MaxWriteLen) // ensure enough space for writing new data { return EnsureSize(Write+MaxWriteLen); } void SetEmpty(void) // remove all data, make buffer empty { Read = Write = Size = 0; } void RemovePastData(void) // remove data before the read pointer { memcpy(Sample, Sample + Read, (Size - Read) * sizeof(Type)); Write -= Read; Size -= Read; Read = 0; } Type &operator[] (size_t Idx) // access data given by index { return Sample[Idx]; } size_t ReadLen(void) // length of data to be read { return Write - Read; } Type *ReadPtr(void) // get pointer to read data { return Sample + Read; } size_t WriteLen(void) // length of data that can be written { return Size - Write; } Type *WritePtr(void) // get pointer to write data { return Sample + Write; } void Print(char *Title=0) { printf("%s Sample=%08X, Read=%d, Write=%d, Size=%d, AllocSize=%d\n", Title ? Title:"SampleBuffer:", (int)Sample, Read, Write, Size, AllocSize); } public: Type *Sample; // allocated storage pointer size_t Read; // index to data that is ready to be read size_t Write; // index to data that is still to be written size_t Size; // current size of data (includes data before the read pointer) size_t AllocSize; // allocated size for data } ; // ======================================================================== #endif // __STRUC_H__ fldigi-4.1.06/src/include/xmlrpc.h0000644000175000017500000000351413472115776013671 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef XMLRPC_H #define XMLRPC_H #include #include #include #include #include #include "threads.h" struct XmlRpcImpl; class XML_RPC_Server { public: static void start(const char* node, const char* service); static void stop(void); static std::ostream& list_methods(std::ostream& out); private: XML_RPC_Server(); ~XML_RPC_Server(); XML_RPC_Server(const XML_RPC_Server&); XML_RPC_Server operator=(const XML_RPC_Server&); static void add_methods(void); static void* thread_func(void*); private: static XML_RPC_Server* inst; bool run; XmlRpcImpl* server_impl; }; extern void xmlrpc_set_qsy(long long rfc); extern int xmltest_char(); extern bool xmltest_char_available; extern void reset_xmlchars(); extern int number_of_samples(std::string s); extern bool flmsg_online; extern std::string flmsg_data; extern pthread_mutex_t* server_mutex; #endif // XMLRPC_H fldigi-4.1.06/src/include/wefax_map.h0000644000175000017500000000621513472115776014334 00000000000000// ---------------------------------------------------------------------------- // wefax_map.h // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef wefax_map_H #define wefax_map_H #include #include #include class wefax_map : public Fl_Widget { private: unsigned char *vidbuf; int bufsize; int width; int height; int numcol; int slantdir; void slant_corr(int x, int y); void slant_undo(); int zoom ; int background ; bool binary ; unsigned char binary_threshold ; inline unsigned char pix2bin( unsigned char x ) const { return x < binary_threshold ? 0 : 255 ; } static void draw_cb(void *data, int x, int y, int w, uchar *buf); void resize_zoom(int, int, int, int); public: wefax_map(int, int, int, int, int bg_col = 0); ~wefax_map(); void video(unsigned char const *, int); void pixel(unsigned char data, int pos) { if (pos < 0 || pos >= bufsize) { return ; } FL_LOCK_D(); vidbuf[pos] = data; if (pos % (width * depth) == 0) redraw(); FL_UNLOCK_D(); } unsigned char pixel(int); int handle(int); void draw(); void clear(); void image(Fl_Image *img) {Fl_Widget::image(img);} void resize(int, int, int, int); void resize_height(int new_height, bool clear_img); void shift_horizontal_center(int hShift); void stretch(double the_ratio); int save_png(const char * filename, bool monochrome = false, const char * extra_comments = NULL); void set_zoom(int the_zoom); void set_binary(bool bin_mode) { binary = bin_mode ;} int pix_width(void) const { return width ; } int pix_height(void) const { return height ; } const unsigned char * buffer(void) const { return vidbuf; } /// Sometimes the row number goes back of one due to rounding error. /// If this happens, noise removal does not work. static const int noise_height_margin = 5 ; void remove_noise( int row, int half_len, int noise_margin ); static const int depth = 3; private: bool restore( int row, int margin ); public: void dilatation( int row ); void erosion( int row ); void set_binary_threshold(unsigned char thres) { binary_threshold = thres ; } unsigned char get_binary_threshold() const { return binary_threshold ; } }; class wefax_picbox : public Fl_Box { public: wefax_picbox(int x, int y, int w, int h, const char* l = 0) : Fl_Box(x, y, w, h, l) { } int handle(int event); }; #endif fldigi-4.1.06/src/include/Fl_Text_Editor_mod.H0000644000175000017500000001305713472115777016042 00000000000000// // "$Id: Fl_Text_Editor_mod.H 7903 2010-11-28 21:06:39Z matt $" // // Header file for Fl_Text_Editor_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Editor_mod widget . */ #ifndef Fl_Text_Editor_mod_H #define Fl_Text_Editor_mod_H #include "Fl_Text_Display_mod.H" // key will match in any state #define Fl_Text_Editor_mod_ANY_STATE (-1L) /** This is the FLTK text editor widget. It allows the user to edit multiple lines of text and supports highlighting and scrolling. The buffer that is displayed in the widget is managed by the Fl_Text_Buffer_mod class. */ class FL_EXPORT Fl_Text_Editor_mod : public Fl_Text_Display_mod { public: /** Key function binding callback type */ typedef int (*Key_Func)(int key, Fl_Text_Editor_mod* editor); /** Simple linked list associating a key/state to a function */ struct Key_Binding { int key; ///< the key pressed int state; ///< the state of key modifiers Key_Func function; ///< associated function Key_Binding* next; ///< next key binding in the list }; Fl_Text_Editor_mod(int X, int Y, int W, int H, const char* l = 0); ~Fl_Text_Editor_mod() { remove_all_key_bindings(); } virtual int handle(int e); /** Sets the current insert mode; if non-zero, new text is inserted before the current cursor position. Otherwise, new text replaces text at the current cursor position. */ void insert_mode(int b) { insert_mode_ = b; } /** Gets the current insert mode; if non-zero, new text is inserted before the current cursor position. Otherwise, new text replaces text at the current cursor position. */ int insert_mode() { return insert_mode_; } void add_key_binding(int key, int state, Key_Func f, Key_Binding** list); /** Adds a key of state "state" with the function "function" */ void add_key_binding(int key, int state, Key_Func f) { add_key_binding(key, state, f, &key_bindings); } void remove_key_binding(int key, int state, Key_Binding** list); /** Removes the key binding associated with the key "key" of state "state". */ void remove_key_binding(int key, int state) { remove_key_binding(key, state, &key_bindings); } void remove_all_key_bindings(Key_Binding** list); /** Removes all of the key bindings associated with the text editor or list. */ void remove_all_key_bindings() { remove_all_key_bindings(&key_bindings); } void add_default_key_bindings(Key_Binding** list); Key_Func bound_key_function(int key, int state, Key_Binding* list); /** Returns the function associated with a key binding. */ Key_Func bound_key_function(int key, int state) { return bound_key_function(key, state, key_bindings); } /** Sets the default key function for unassigned keys. */ void default_key_function(Key_Func f) { default_key_function_ = f; } // functions for the built in default bindings static int kf_default(int c, Fl_Text_Editor_mod* e); static int kf_ignore(int c, Fl_Text_Editor_mod* e); static int kf_backspace(int c, Fl_Text_Editor_mod* e); static int kf_enter(int c, Fl_Text_Editor_mod* e); static int kf_move(int c, Fl_Text_Editor_mod* e); static int kf_shift_move(int c, Fl_Text_Editor_mod* e); static int kf_ctrl_move(int c, Fl_Text_Editor_mod* e); static int kf_c_s_move(int c, Fl_Text_Editor_mod* e); static int kf_meta_move(int c, Fl_Text_Editor_mod* e); static int kf_m_s_move(int c, Fl_Text_Editor_mod* e); static int kf_home(int, Fl_Text_Editor_mod* e); static int kf_end(int c, Fl_Text_Editor_mod* e); static int kf_left(int c, Fl_Text_Editor_mod* e); static int kf_up(int c, Fl_Text_Editor_mod* e); static int kf_right(int c, Fl_Text_Editor_mod* e); static int kf_down(int c, Fl_Text_Editor_mod* e); static int kf_page_up(int c, Fl_Text_Editor_mod* e); static int kf_page_down(int c, Fl_Text_Editor_mod* e); static int kf_insert(int c, Fl_Text_Editor_mod* e); static int kf_delete(int c, Fl_Text_Editor_mod* e); static int kf_copy(int c, Fl_Text_Editor_mod* e); static int kf_cut(int c, Fl_Text_Editor_mod* e); static int kf_paste(int c, Fl_Text_Editor_mod* e); static int kf_select_all(int c, Fl_Text_Editor_mod* e); static int kf_undo(int c, Fl_Text_Editor_mod* e); protected: int handle_key(); void maybe_do_callback(); #ifndef FL_DOXYGEN int insert_mode_; Key_Binding* key_bindings; static Key_Binding* global_key_bindings; Key_Func default_key_function_; #endif }; #endif // // End of "$Id: Fl_Text_Editor_mod.H 7903 2010-11-28 21:06:39Z matt $". // fldigi-4.1.06/src/include/calendar.h0000644000175000017500000000651413472115776014140 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _FL_CALENDAR_H #define _FL_CALENDAR_H #include #include #include #include #include "flinput2.h" #include "date.h" class Fl_Calendar_Base : public Fl_Group , public Date { private: protected: int cal_x; int cal_y; int cal_w; int cal_h; Fl_Button * days[6*7]; public: Fl_Widget *target; int calfmt; /** * The constructor for an empty Fl_Calendar_Base. */ Fl_Calendar_Base (int x, int y, int w = (7*20), int h = (6*20), const char *l = 0); Fl_Button * day_button (int i); void update (); void csize (int cx, int cy, int cw, int ch); void setTarget (Fl_Widget *tgt); }; class Fl_Calendar : public Fl_Calendar_Base { public: /** * The constructor for an empty Fl_Calendar. */ Fl_Calendar (int x, int y, int w = (7*20), int h = (8*20), const char *l = 0); void today (); void previous_month (); void next_month (); void previous_year (); void next_year (); void setDate (int, int, int); void update (); void csize (int cx, int cy, int cw, int ch); int handle (int); protected: // Fl_Button * weekdays[7]; // Fl_Button * caption; Fl_Box * weekdays[7]; Fl_Box * caption; Fl_Button * nxt_month; Fl_Button * prv_month; Fl_Button * nxt_year; Fl_Button * prv_year; }; class Fl_PopCal : public Fl_Window { friend void popcal_cb(Fl_Widget *, long); protected: int popcalfmt_; // Fl_Window popcal_form; Fl_Calendar *popcal; Fl_Input2 *target; public: Fl_PopCal (int x, int y, int w, int h, Fl_Input2 *inp = 0); ~Fl_PopCal (); void popposition (int, int); void popshow (); void pophide (); void popcal_cb_i (Fl_Widget *, long); void popcalfmt (int); int popcalfmt (); int handle (int); void setDate (int, int, int); }; class Fl_DateInput : public Fl_Group { protected: Fl_Button *Btn; Fl_Input2 *Input; Fl_PopCal *Cal; Fl_Window *popcal_form; Fl_Calendar *popcal; int popcalfmt_; void makepopcal(); public: Fl_DateInput (int x, int y, int w, int h, const char * = 0); void format (int); const char *value (); void value (const char *); void color (Fl_Color); void textfont (int); void textsize (int); void textcolor (Fl_Color); void labelfont (int); void labelsize (int); void labelcolor (int); void align (Fl_Align); void fl_popcal(); void take_focus(); }; #endif fldigi-4.1.06/src/include/qrzlib.h0000644000175000017500000002022513472115776013665 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef QRZHEADER // To include the email code remove the comment specifier from the following line #define HAVE_EMAIL // QRZ CDROM data structures /* ** Index Header Block Definition (Version 2) ** (applies to all QRZ CDROMS from Version 2 onward) ** ** This block is located at the start of each index */ typedef struct { char dataname[16]; /* Name of the data file */ char bytesperkey[8]; /* Data Bytes per Index Item */ char numkeys[8]; /* Number of items in this index */ char keylen[8]; /* Length of each key item in bytes */ char version[8]; /* Database Version ID */ } index_header; /* Index Usage The name index is set to a maximum of 16 characters with longer names being truncated. Names are stored in last-first format with a space between the names. The city/state index uses 12 characters per entry, the callsign index 6 characters and the zip code index 5 characters. The data which follows the header is simply a long list of single field records. The records are tightly packed on 'bytesperkey' boundaries without separators. There is no guarantee of a null terminator on any index record entry. When the program qrz.exe is run it first searches for a drive containing the base directory \CALLBK . Next, it loads all four index files (callbkc.idx, callbkn.idx, callbks.idx and callbkz.idx) into tables in memory. These tables were kept small so as not to place an undue RAM requirement on the user's system. Next, when a user specifies a field and key to search, the program searches the relevant index table and returns the closest match lower (or equal to) the supplied key. The table position of this key is then taken and multiplied by the 'bytesperkey' value to arrive at a database file offset. This offset is then used to perform the first and only seek into the database. Once on position within the file, a sequential search is performed to return the match. The search terminates at the next index key value if the field is not found. The database files all have the same format. The records each consist of comma separated fields which end with a single newline '\n' (ASCII 0xa) character. Blank fields are simply stored as a comma. Every record has the same number of commas in it. Actual comma's in the data field are stored as a semi-colon ';' which should be replaced by a comma in the user's output formatting routine. Example: AA7BQ ,LLOYD,,FRED L,,53340,90009,00009,8215 E WOOD DR,SCOTTSDALE,AZ, 85260,E,KJ6RK,A The callsign database is sorted by SUFFIX, AREA, PREFIX. For example, the following order would be observed: QE24AA ... ZZ99ZZ ... A 0A ... AA0AAA ... ZZ9ZZZ This ordering also pertains to the index file since it is just a snaphot of every nth record in the database. */ /* ** Standard Record Field Offsets */ #define QRZLIB_CALL 0 #define QRZLIB_LNAME 1 #define QRZLIB_JR 2 #define QRZLIB_FNAME 3 #define QRZLIB_MI 4 #define QRZLIB_DOB 5 #define QRZLIB_EFDATE 6 #define QRZLIB_EXPDATE 7 #define QRZLIB_MAIL_STR 8 #define QRZLIB_MAIL_CITY 9 #define QRZLIB_MAIL_ST 10 #define QRZLIB_MAIL_ZIP 11 #define QRZLIB_CLASS 12 #define QRZLIB_P_CALL 13 #define QRZLIB_P_CLASS 14 /* The fields JR and MI were obsoleted by the FCC in July 1994. The callsign fields are arranged in a strict "ccdccc" columnar format where 'c' represents a letter and 'd' a digit. Callsigns which do not conform to the "ccdccc" format are space filled in the relevant positions. This field is rearranged to the proper layout by the user program's output formatting routines. All dates are stored in 5 character Julian format, e.g. 93003 equals January 3, 1993. Dates before 1900 or after year 2000 must be determined by their context usage. In other words, if the resultant age does not make sense, then it's wrong. For example, all licenses expire in the future so 02 is 2002. Birthdays are more difficult but most can be determined to be greater than 10 years old. This is not a perfect method, but it does yield satisfactory results. Some folks may notice that the database no longer contains station location information. This information is no longer supplied nor available from the FCC since it is no longer a part of their record keeping (See the May 1993 QST for more info). Cross Reference Information Callsigns in the database are now cross-referenced to both the current and the previous call sign for each entry in which they are available. A cross reference record takes the form of 'old,new' with no other information in the record. A record can be identified as a cross reference either one of two ways: First, if the record length is less than 15 characters, then it is a cross reference record. Secondly, if the record contains only one comma "," , then it is a cross reference record. It is not necessary to test for both cases, either will do. When a cross reference record is encountered, you must fetch the second field and restart the search to return the primary reference. */ #include #include #include extern char *Composite( char * ); class QRZ { private: char criteria; index_header idxhdr; char *data; char *index; char *top; FILE *idxfile; long idxsize; FILE *datafile; long dataoffset; long databytesread; char *dfptr; char *endofline; char *idxptr; int found; char recbuffer[512]; unsigned int datarecsize; long numkeys; int keylen; void OpenQRZFiles( const char * ); int FindCallsign( char * ); int FindName( char * ); int FindState( char * ); int FindZip( char * ); int ReadDataBlock( long ); int nextrec(); bool hasImage; char *Qcall; char *Qlname; char *Qfname; char *Qdob; char *Qefdate; char *Qexpdate; char *Qmail_str; char *Qmail_city; char *Qmail_st; char *Qmail_zip; char *Qopclass; char *Qp_call; char *Qimagefname; char *Qp_class; int QRZvalid; public: QRZ( const char * ); QRZ( const char *, char ); ~QRZ(); int CallComp( char *, char * ); int CompState( const char *, const char *, const char * ); int getQRZvalid(); void NewDBpath( const char * ); int FindRecord( char * ); int NextRecord(); int ReadRec(); int GetCount( char * ); char *GetCall(); const char *GetLname(); const char *GetFname(); const char *GetDOB(); const char *GetEFdate(); const char *GetEXPdate(); const char *GetStreet(); const char *GetCity(); const char *GetState(); const char *GetZIP(); const char *GetOPclass(); const char *GetPriorCall(); const char *GetPriorClass(); const char *GetImageFileName(); char *CSV_Record(); char *Fmt_Record(); bool ImageExists(); const char *ImageFileName() {return Qimagefname;}; }; extern void SetQRZdirectory(char *dir); extern int filename_expand(char *to,int tolen, const char *from); #define QRZHEADER #endif fldigi-4.1.06/src/include/Nav.h0000644000175000017500000000430413472115776013106 00000000000000// ---------------------------------------------------------------------------- // Nav.cxx -- Interface to Arduino Nano Nav keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _USNAVFSK_H #define _USNAVFSK_H #include #include #include #include #include #include #include #include #include #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "status.h" #include "serial.h" #include "qrunner.h" #include "threads.h" #include "FTextRXTX.h" extern bool use_Nav; extern bool open_NavFSK(); extern void close_NavFSK(); extern bool open_NavConfig(); extern void close_NavConfig(); extern bool Nav_read_byte(Cserial &serial, unsigned char &byte); extern std::string Nav_read_string(Cserial &serial, int msec_wait, std::string find); extern void Nav_send_char(int c); extern void Nav_sendString (Cserial &serial, const std::string &s); extern void Nav_PTT(int val); extern void Nav_write_eeprom(); extern void Nav_restore_eeprom(); extern std::string Nav_serial_read(Cserial &serial); extern void Nav_set_channel_1_att(int); extern void Nav_set_channel_2_att(int); extern void Nav_set_rf_att(int); extern void Nav_set_led(int); extern void Nav_set_cat_led(int); extern void Nav_set_wk_ptt(int); extern void Nav_set_baud(int); extern void Nav_set_stopbits(int); extern void Nav_set_polarity(int); extern void Nav_set_sidetone(int); extern void Nav_set_ptt(int); #endif fldigi-4.1.06/src/include/ascii.h0000644000175000017500000000241213472115776013450 00000000000000// ---------------------------------------------------------------------------- // ascii.h -- ASCII table // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef ASCII_H #define ASCII_H extern const char *ascii[]; extern const char *ascii2[]; extern const char *ascii3[]; #define SOH 0x01 // SOH ascii character #define EOT 0x04 // EOT ascii character #endif fldigi-4.1.06/src/include/threads.h0000644000175000017500000001050113472115776014010 00000000000000// ---------------------------------------------------------------------------- // threads.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef THREADS_H_ #define THREADS_H_ #include #include #include #include #ifndef WIN32 #if !HAVE_SEM_TIMEDWAIT # include int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout); #endif #else #include #endif int sem_timedwait_rel(sem_t* sem, double rel_timeout); int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout); // qrunner threads enum { INVALID_TID = -1, TRX_TID, TOD_TID, QRZ_TID, RIGCTL_TID, NORIGCTL_TID, EQSL_TID, ADIF_RW_TID, ADIF_MERGE_TID, XMLRPC_TID, ARQ_TID, ARQSOCKET_TID, MACLOGGER_TID, KISS_TID, KISSSOCKET_TID, PSM_TID, AUDIO_ALERT_TID, FD_TID, N3FJP_TID, DXCC_TID, WKEY_TID, FLMAIN_TID, NUM_THREADS, NUM_QRUNNER_THREADS = NUM_THREADS - 1 }; #ifdef __linux__ void linux_log_tid(void); # define LOG_THREAD_ID() linux_log_tid() #else # define LOG_THREAD_ID() /* nothing */ #endif #if USE_TLS # define THREAD_ID_TYPE __thread intptr_t # define CREATE_THREAD_ID() thread_id_ = INVALID_TID # define SET_THREAD_ID(x) do { thread_id_ = (x); LOG_THREAD_ID(); } while (0) # define GET_THREAD_ID() thread_id_ #else # define THREAD_ID_TYPE pthread_key_t # define CREATE_THREAD_ID() pthread_key_create(&thread_id_, NULL) # define SET_THREAD_ID(x) do { pthread_setspecific(thread_id_, (const void *)(x + 1)); LOG_THREAD_ID(); } while (0) # define GET_THREAD_ID() ((intptr_t)pthread_getspecific(thread_id_) - 1) #endif // USE_TLS extern THREAD_ID_TYPE thread_id_; #ifndef NDEBUG # include "debug.h" bool thread_in_list(int id, const int* list); # define ENSURE_THREAD(...) \ do { \ int id_ = GET_THREAD_ID(); \ int t_[] = { __VA_ARGS__, INVALID_TID }; \ if (!thread_in_list(id_, t_)) \ LOG_ERROR("bad thread context: %d", id_); \ } while (0) # define ENSURE_NOT_THREAD(...) \ do { \ int id_ = GET_THREAD_ID(); \ int t_[] = { __VA_ARGS__, INVALID_TID }; \ if (thread_in_list(id_, t_)) \ LOG_ERROR("bad thread context: %d", id_); \ } while (0) #else # define ENSURE_THREAD(...) ((void)0) # define ENSURE_NOT_THREAD(...) ((void)0) #endif // ! NDEBUG // On POSIX systems we cancel threads by sending them SIGUSR2, // which will also interrupt blocking calls. On woe32 we use // pthread_cancel and there is no good/sane way to interrupt. #ifndef __WOE32__ #include # define SET_THREAD_CANCEL() \ do { \ sigset_t usr2; \ sigemptyset(&usr2); \ sigaddset(&usr2, SIGUSR2); \ pthread_sigmask(SIG_UNBLOCK, &usr2, NULL); \ } while (0) # define TEST_THREAD_CANCEL() /* nothing */ # define CANCEL_THREAD(t__) pthread_kill(t__, SIGUSR2) #else // threads have PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED when created # define SET_THREAD_CANCEL() /* nothing */ # define TEST_THREAD_CANCEL() pthread_testcancel() # define CANCEL_THREAD(t__) pthread_cancel(t__); #endif #include "fl_lock.h" /// This ensures that a mutex is always unlocked when leaving a function or block. class guard_lock { public: guard_lock(pthread_mutex_t* m); ~guard_lock(void); private: pthread_mutex_t* mutex; }; /// This wraps together a mutex and a condition variable which are used /// together very often for queues etc... class syncobj { pthread_mutex_t m_mutex ; pthread_cond_t m_cond ; public: syncobj(); ~syncobj(); pthread_mutex_t * mtxp(void) { return & m_mutex; } void signal(); bool wait( double seconds ); }; #endif // !THREADS_H_ fldigi-4.1.06/src/include/nco.h0000644000175000017500000000621113472115776013140 00000000000000// --------------------------------------------------------------------- // nco.h -- a generic NCO class // // // This file is a proposed part of fldigi. // // Copyright (C) 2010 // Dave Freese, W1HKJ // Chris Sylvain, KB3CS // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #ifndef NCO_H #define NCO_H #include "complex.h" class NCO { #define NCO_SINETABLE_LEN (1<<8) // == 256 private: double SampleRate; double Frequency; double Phase; double Phase_incr; bool sinetable_ready; double sinetable[NCO_SINETABLE_LEN+1]; public: NCO() { sinetable_ready = false; } ~NCO() { }; void init(double freq, double phase, double sr) { SampleRate = sr; Frequency = freq; Phase = phase / TWOPI; // normalize radians to [0,1] Phase_incr = freq / sr; if (sinetable_ready == false) { double step = 1.0 / NCO_SINETABLE_LEN; for (int i = 0; i < NCO_SINETABLE_LEN; i++) sinetable[i] = sin(step * i * TWOPI); sinetable[NCO_SINETABLE_LEN] = sinetable[0]; /* == 0.0 */ sinetable_ready = true; } } inline void setfreq(double freq) { Frequency = freq; Phase_incr = freq / SampleRate; } inline double getfreq() { return Frequency; } inline void setphase(double phase) { Phase = phase / TWOPI; } inline double getphase() { return Phase * TWOPI; } inline void setphaseacc(double phase) { Phase = phase; } inline double getphaseacc() { return Phase; } #ifndef NDEBUG double interpolate(double phase) { #else inline double interpolate(double phase) { #endif int iphase; double frac1, frac2; iphase = (int) floor(phase * NCO_SINETABLE_LEN); frac1 = (phase * NCO_SINETABLE_LEN) - iphase; frac2 = 1.0 - frac1; iphase %= NCO_SINETABLE_LEN; return (sinetable[iphase] * frac2) + (sinetable[iphase+1] * frac1); } double sample() { double sample = interpolate(Phase); Phase += Phase_incr; if (Phase > 1) { Phase -= 1; // Phase might be .le. abs(machine-epsilon) if (Phase < 0.0) Phase = 0.0; } return sample; } cmplx cmplx_sample() { cmplx sample; // M_PI_2 / TWOPI = M_PI / 2 / 2 / M_PI = 1 / 4 double t = Phase + 0.25; if (t > 1.0) { t -= 1; // Phase might be .le. abs(machine-epsilon) if (t < 0.0) t = 0.0; } sample = cmplx(interpolate(t), interpolate(Phase)); Phase += Phase_incr; if (Phase > 1.0) { Phase -= 1; if (Phase < 0.0) Phase = 0.0; } return sample; } }; #endif fldigi-4.1.06/src/include/viewpsk.h0000644000175000017500000000610513472115776014053 00000000000000// ---------------------------------------------------------------------------- // viewpsk.h -- psk modem // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VIEWPSK_H #define _VIEWPSK_H #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "pskeval.h" #include "viterbi.h" #include "mfskvaricode.h" #include "interleave.h" //===================================================================== #define VPSKSAMPLERATE (8000) #define VAFCDECAY 8 #define MAXCHANNELS 30 #define VSEARCHWIDTH 70 #define VSIGSEARCH 5 #define VWAITCOUNT 4 #define NULLFREQ 1e6 //===================================================================== struct CHANNEL { double phaseacc; cmplx prevsymbol; cmplx quality; unsigned int shreg; unsigned int shreg2; double metric; double frequency; double freqerr; double phase; double syncbuf[16]; double averageamp; C_FIR_filter *fir1; C_FIR_filter *fir2; viterbi *dec; viterbi *dec2; unsigned int bitshreg; int rxbitstate; unsigned char symbolpair[2]; int fecmet; int fecmet2; interleave *Rxinlv; interleave *Rxinlv2; int bits; double bitclk; unsigned int dcdshreg; unsigned int dcdshreg2; int dcd; int waitcount; int timeout; bool reset; int acquire; }; class viewpsk { private: trx_mode viewmode; int symbollen; int symbits; double bandwidth; int dcdbits; int fa; int fb; int ftest; double test_peak_amp; time_t now; bool reset_all; bool tracked; bool browser_changed; CHANNEL channel[MAXCHANNELS]; int nchannels; int lowfreq; bool _pskr; bool _qpsk; pskeval* evalpsk; void rx_symbol(int ch, cmplx symbol); void rx_bit(int ch, int bit); void findsignal(int); void afc(int); void rx_bit2(int ch, int bit); void rx_pskr(int ch, unsigned char symbol); void rx_qpsk(int ch, int bits); bool is_valid_char(int &c); inline void timeout_check(); inline void insert(); public: viewpsk(pskeval* eval, trx_mode mode); ~viewpsk(); void init(); void restart(trx_mode mode); void rx_init() {}; void tx_init() {}; void restart() {}; int rx_process(const double *buf, int len); int get_freq(int n); void set_freq(int n, double f) { channel[n].frequency = f; } void findsignals(); void clearch(int n); void clear(); }; extern viewpsk *pskviewer; #endif fldigi-4.1.06/src/include/audio_alert.h0000644000175000017500000000274213472115776014656 00000000000000// Class Caudio_alert // // play various canned sounds or wav file using port audio interface #ifndef AUDIO_ALERT_H #define AUDIO_ALERT_H #include "play.pa.h" #define STEAM_TRAIN_SIZE 50225 extern int int_steam_train[]; #define BARK_SIZE 1501 extern int int_audio_bark[]; #define CHECKOUT_SIZE 11424 extern int int_audio_checkout[]; #define DOESNOT_SIZE 9927 extern int int_audio_doesnot[]; #define DIESEL_SIZE 7621 extern int int_audio_diesel[]; #define DINNER_BELL 15287 extern int int_dinner_bell[]; class Caudio_alert { private: #define BEEBOO 48000 #define PHONERING 16000 int phonering[PHONERING]; int int_audio_beeboo[BEEBOO]; c_portaudio *sc_audio; void create_beeboo(); void create_phonering(); public: void bark(); void checkout(); void doesnot(); void diesel(); void steam_train(); void beeboo(); void phone(); void dinner_bell(); void file(std::string sndfile); void alert(std::string s) { if (s.empty()) return; if (s == "bark") bark(); else if (s == "checkout") checkout(); else if (s == "doesnot" ) doesnot(); else if (s == "diesel" ) diesel(); else if (s == "steam_train") steam_train(); else if (s == "beeboo") beeboo(); else if (s == "phone") phone(); else if (s == "dinner_bell") dinner_bell(); else file(s); } Caudio_alert() { try { sc_audio = new c_portaudio; create_phonering(); create_beeboo(); } catch (...) { throw; } } ~Caudio_alert() { delete sc_audio; } }; extern Caudio_alert *audio_alert; #endif fldigi-4.1.06/src/include/test_signal.h0000644000175000017500000000234213472115776014676 00000000000000// ---------------------------------------------------------------------------- // test_signal.h // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef TEST_SIGNAL_H #define TEST_SIGNAL_H #include #include #include #include #include #include #include #include #ifdef __MINGW32__ # include #endif #include "testsigs.h" extern Fl_Double_Window* test_signal_window; extern void show_testdialog(void); #endif fldigi-4.1.06/src/include/date.h0000644000175000017500000000611513472115776013301 00000000000000/* -*-C++-*- "$Id: Fl_Date.H,v 1.4 2000/03/30 04:43:56 davefreese Exp $" Copyright 1999-2000 by the Dave Freese & the Flek development team. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. */ // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef DATE_H #define DATE_H #include typedef enum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } weekday_t; typedef enum { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER } month_t; class Date { friend std::ostream &operator<<(std::ostream &, Date &); protected: int year; int month; int day; int fmt; static const int mdays[]; static const int jdays[][13]; static const char *month_name[]; void helpIncrement(); public: Date(); Date( int m, int d, int y ); void setDate( int, int, int ); // set the date void setDate( Date & ); void setFormat (int); void today(); // set date to the present day void Year( int ); int Year(); void Month( int ); int Month(); void Day( int ); int Day(); void previous_month (); void next_month (); void previous_year (); void next_year (); bool endOfMonth( int ); bool leapYear (int); bool leapYear () { return leapYear (year); } bool isleapyear (int year) { return leapYear (year); } bool isleapyear () { return isleapyear (year); } int daysinmonth (int, int); int daysinmonth () { return daysinmonth (month, isleapyear (year)); } bool isvalid (int, int, int); bool datevalid (int year, int mon, int day) { return isvalid (mon, day, year); } bool datevalid () { return isvalid (month, day, year); } int dayofyear (int, int, int); int dayofyear () { return dayofyear (year, month, day); } int dayofepoch (int, int, int); int dayofepoch () { return dayofepoch (year, month, day); } int dayofweek (int, int, int); int dayofweek () { return dayofweek (year, month, day); } char *szDate (int); char *szDate (); double dJulian (); bool operator==( const Date & ); bool operator!=( const Date & ); bool operator<( const Date & ); bool operator>( const Date & ); void operator=( const Date & ); const Date &operator+=( int); // add days, modify object Date &operator++(); // pre-increment operator Date operator++( int ); // post-increment operator }; #endif fldigi-4.1.06/src/include/fft-monitor.h0000644000175000017500000000350513472115776014630 00000000000000// ---------------------------------------------------------------------------- // fftmon.h -- frequency fftmon modem // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _fftmon_H #define _fftmon_H #include #include #include #include #include "filters.h" #include "fftfilt.h" #include "modem.h" #include "mbuffer.h" #include "gfft.h" extern void writeFile(); class fftmon : public modem { friend void toggle_scans(void *); public: #define fftmonFFT_LEN 8192 // approximately 1 sec of bpf'd audio stream #define LENdiv2 4096 private: double *fftbuff; double *dftbuff; double *buffer; Cmovavg *fftfilt[LENdiv2]; double bshape[fftmonFFT_LEN]; int fftmon_sr; g_fft *scanfft; bool scans_stable; int numscans; inline double blackman(double x) { return (0.42 - 0.50 * cos(2 * M_PI * x) + 0.08 * cos(4 * M_PI * x)); } void update_fftscope(); public: fftmon(); ~fftmon(); void init(); void rx_init() {} void tx_init() {} void restart(); int rx_process(const double *buf, int len); int tx_process() { return -1; } }; #endif fldigi-4.1.06/src/include/coordinate.h0000644000175000017500000000530113472115776014507 00000000000000// ---------------------------------------------------------------------------- // coordinate.h -- Handling of longitude and latitude. // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _COORDINATE_H #define _COORDINATE_H #include // Models a longitude or latitude. class CoordinateT { // Precision is: 360 * 3600 = 1296000, 21 bits. A float might be enough. double m_angle ; // In decimal degrees, between -180.0 and 180.0. bool m_is_lon ; // Longitude or latitude. // TODO: Consider adding a big offset to m_angle, instead of an extra flag. void Check(void) const ; void Init( char direction, double degrees ); public: CoordinateT(bool ll=true) : m_angle(0.0), m_is_lon(ll) {}; CoordinateT( double degrees, bool is_lon ); CoordinateT( char direction, double degrees ); CoordinateT( char direction, int degree, int minute, int second ); double angle(void) const { return m_angle ; } bool is_lon(void) const { return m_is_lon; } // Specific for reading from the file of navtex or wmo stations. // Navtex: "57 06 N" // Wmo : "69-36N", "013-27E", "009-25E" friend std::istream & operator>>( std::istream & istrm, CoordinateT & ref ); friend std::ostream & operator<<( std::ostream & ostrm, const CoordinateT & ref ); class Pair ; }; // CoordinateT // Longitude , latitude. class CoordinateT::Pair { CoordinateT m_lon, m_lat ; public: Pair() {} Pair( const CoordinateT & coo1, const CoordinateT & coo2 ); Pair( double lon, double lat ); Pair( const std::string & locator ); CoordinateT longitude() const { return m_lon ; } CoordinateT latitude() const { return m_lat ; } CoordinateT & longitude() { return m_lon ; } CoordinateT & latitude() { return m_lat ; } double distance( const Pair & a ) const; std::string locator() const ; friend std::istream & operator>>( std::istream & istrm, Pair & ref ); friend std::ostream & operator<<( std::ostream & ostrm, const Pair & ref ); }; // CoordinateT::Pair #endif // _COORDINATE_H fldigi-4.1.06/src/include/status.h0000644000175000017500000001341313472115776013706 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _status_H #define _status_H #include #include "globals.h" struct status { trx_mode lastmode; std::string mode_name; int mainX; int mainY; int mainW; int mainH; bool WF_UI; bool NO_RIGLOG; bool Rig_Log_UI; bool Rig_Contest_UI; bool DOCKEDSCOPE; bool tbar_is_docked; int RxTextHeight; int tiled_group_x; bool show_channels; int rigX; int rigY; int rigW; int rigH; int carrier; int noCATfreq; std::string noCATmode; std::string noCATwidth; int mag; int offset; int speed; double reflevel; double ampspan; unsigned int VIEWERnchars; unsigned int VIEWERxpos; unsigned int VIEWERypos; unsigned int VIEWERwidth; unsigned int VIEWERheight; double VIEWER_psksquelch; double VIEWER_rttysquelch; double VIEWER_cwsquelch; bool VIEWERvisible; unsigned int fsqMONITORxpos; unsigned int fsqMONITORypos; unsigned int fsqMONITORwidth; unsigned int fsqMONITORheight; int tile_x; int tile_w; int tile_y; int tile_h; double tile_y_ratio; double fsq_ratio; double ifkp_ratio; bool LOGenabled; double sldrSquelchValue; double sldrPwrSquelchValue; bool afconoff; bool sqlonoff; int scopeX; int scopeY; bool scopeVisible; int scopeW; int scopeH; int svX; // spectrum viewer X, Y, W, H int svY; int svW; int svH; bool x_graticule; bool y_graticule; bool xy_graticule; int repeatMacro; float repeatIdleTime; int timer; int timerMacro; std::string LastMacroFile; int n_rsids; bool spot_recv; bool spot_log; bool contest; bool quick_entry; bool rx_scroll_hints; bool rx_word_wrap; bool tx_word_wrap; bool cluster_connected; int logbook_x; int logbook_y; int logbook_w; int logbook_h; bool logbook_reverse; int logbook_col_0; int logbook_col_1; int logbook_col_2; int logbook_col_3; int logbook_col_4; int logbook_col_5; int dxdialog_x; int dxdialog_y; int dxdialog_w; int dxdialog_h; // Contestia, Olivia, RTTY state values int contestiatones; int contestiabw; int contestiamargin; int contestiainteg; bool contestia8bit; int oliviatones; int oliviabw; int oliviamargin; int oliviainteg; bool olivia8bit; int rtty_shift; int rtty_custom_shift; int rtty_baud; int rtty_bits; int rtty_parity; int rtty_stop; bool rtty_reverse; bool rtty_crcrlf; bool rtty_autocrlf; int rtty_autocount; int rtty_afcspeed; bool rtty_filter_changed; bool useFSKkeyline; bool useFSKkeylineDTR; bool FSKisLSB; bool useUART; bool PreferXhairScope; bool PseudoFSK; bool shaped_rtty; bool UOSrx; bool UOStx; // end Contestia, Olivia, RTTY state values std::string xmlrpc_address; std::string xmlrpc_port; std::string arq_address; std::string arq_port; std::string kiss_address; std::string kiss_io_port; std::string kiss_out_port; int kiss_dual_port_enabled; int data_io_enabled; bool ax25_decode_enabled; bool enableBusyChannel; int busyChannelSeconds; int kpsql_attenuation; bool csma_enabled; bool kiss_tcp_io; bool kiss_tcp_listen; bool kpsql_enabled; int csma_persistance; int csma_slot_time; int csma_transmit_delay; int psm_flush_buffer_timeout; int psm_minimum_bandwidth; int psm_minimum_bandwidth_margin; bool psm_use_histogram; int psm_histogram_offset_threshold; int psm_hit_time_window; int tx_buffer_timeout; bool kiss_io_modem_change_inhibit; bool ip_lock; double squelch_value; bool psk8DCDShortFlag; std::string browser_search; bool meters; bool fsq_rx_abort; bool ifkp_rx_abort; //---------------------------------------------------------------------- // winkeyer status values //---------------------------------------------------------------------- std::string WK_serial_port_name; int WK_comm_baudrate; int WK_stopbits; int WK_comm_retries; int WK_comm_wait; int WK_comm_timeout; bool WK_comm_echo; // wkeyer values unsigned char WK_mode_register; unsigned char WK_speed_wpm; unsigned char WK_sidetone; unsigned char WK_weight; unsigned char WK_lead_in_time; unsigned char WK_tail_time; unsigned char WK_min_wpm; unsigned char WK_rng_wpm; unsigned char WK_first_extension; unsigned char WK_key_compensation; unsigned char WK_farnsworth_wpm; unsigned char WK_paddle_setpoint; unsigned char WK_dit_dah_ratio; unsigned char WK_pin_configuration; unsigned char WK_dont_care; bool WK_cut_zeronine; unsigned char WK_cmd_wpm; bool WK_use_pot; bool WK_online; int WK_version; int WKFSK_mode; // 0 = cw, 1 = fsk/cw int WKFSK_baud; int WKFSK_stopbits; int WKFSK_ptt; int WKFSK_polarity; int WKFSK_sidetone; int WKFSK_auto_crlf; int WKFSK_diddle; int WKFSK_diddle_char; int WKFSK_usos; int WKFSK_monitor; bool Nav_online; bool Nav_config_online; bool nanoCW_online; bool nanoFSK_online; //---------------------------------------------------------------------- bool bLastStateRead; void initLastState(); void saveLastState(); void loadLastState(); }; extern status progStatus; #endif fldigi-4.1.06/src/include/ringbuffer.h0000644000175000017500000001415613472115776014521 00000000000000// ---------------------------------------------------------------------------- // ringbuffer.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // C++ version of PortAudio's ringbuffer code. The copying read/write methods // use memcpy, so it generally safe to use them only for POD types. Thread safe // for one reader and one writer. // // Licensed according to original copyright notice: // // Author: Phil Burk, http://www.softsynth.com // modified for SMP safety on OS X by Bjorn Roche. // also allowed for const where possible. // Note that this is safe only for a single-thread reader // and a single-thread writer. // // This program is distributed with the PortAudio Portable Audio Library. // For more information see: http://www.portaudio.com // Copyright (c) 1999-2000 Ross Bencina and Phil Burk // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files // (the "Software"), to deal in the Software without restriction, // including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, // and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR // ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef RINGBUFFER_H #define RINGBUFFER_H #include #include #include "util.h" template class ringbuffer { protected: size_t size, big_mask, small_mask; T* buf; volatile size_t ridx, widx; public: typedef T value_type; typedef struct { value_type* buf; size_t len; } vector_type; public: ringbuffer(size_t s) : ridx(0), widx(0) { assert(powerof2(s)); size = s; big_mask = size * 2 - 1; small_mask = size - 1; buf = new T[2 * size]; } ~ringbuffer() { delete [] buf; } size_t read_space(void) { read_memory_barrier(); return (widx - ridx) & big_mask; } size_t write_space(void) { return size - read_space(); } void read_advance(size_t n) { write_memory_barrier(); ridx = (ridx + n) & big_mask; } void write_advance(size_t n) { write_memory_barrier(); widx = (widx + n) & big_mask; } size_t get_rv(vector_type v[2], size_t n = 0) { size_t rspace = read_space(); size_t index = ridx & small_mask; if (n == 0 || n > rspace) n = rspace; if (index + n > size) { // two part vector v[0].buf = buf + index; v[0].len = size - index; v[1].buf = buf; v[1].len = n - v[0].len; } else { v[0].buf = buf + index; v[0].len = n; v[1].len = 0; } return n; } size_t read(T* dst, size_t n) { vector_type v[2] = { {0,0}, {0,0} }; n = get_rv(v, n); memcpy(dst, v[0].buf, v[0].len * sizeof(T)); if (v[1].len) memcpy(dst + v[0].len, v[1].buf, v[1].len * sizeof(T)); read_advance(n); return n; } size_t peek(T* dst, size_t n) { vector_type v[2] = { {0,0}, {0,0} }; n = get_rv(v, n); memcpy(dst, v[0].buf, v[0].len * sizeof(T)); if (v[1].len) memcpy(dst + v[0].len, v[1].buf, v[1].len * sizeof(T)); return n; } size_t get_wv(vector_type v[2], size_t n = 0) { size_t wspace = write_space(); size_t index = widx & small_mask; if (n == 0 || n > wspace) n = wspace; if (index + n > size) { // two part vector v[0].buf = buf + index; v[0].len = size - index; v[1].buf = buf; v[1].len = n - v[0].len; } else { v[0].buf = buf + index; v[0].len = n; v[1].len = 0; } return n; } size_t write(const T* src, size_t n) { vector_type v[2] = { {0,0}, {0,0} }; n = get_wv(v, n); memcpy(v[0].buf, src, v[0].len * sizeof(T)); if (v[1].len) memcpy(v[1].buf, src + v[0].len, v[1].len * sizeof(T)); write_advance(n); return n; } void fill(const value_type& v) { reset(); for (size_t i = 0; i < size; i++) buf[i] = v; write_advance(size); } void zero(void) { reset(); memset(buf, 0, size * sizeof(T)); write_advance(size); } void reset(void) { ridx = widx = 0; } size_t length(void) { return size; } size_t bytes(void) { return size * sizeof(T); } }; #endif // RINGBUFFER_H // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/speak.h0000644000175000017500000000205513472115776013466 00000000000000// ---------------------------------------------------------------------------- // speak.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2009 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SPEAK_H #define _SPEAK_H extern const char *txtTalkInfo; void open_talker(); void close_talker(); void toggle_talker(); void speak(int c); #endif fldigi-4.1.06/src/include/network.h0000664000175000017500000001052713507402064014045 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014...2019 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NETWORK_H_ #define NETWORK_H_ #include #include #include #include #include #include #include #include #include "mbedtls/config.h" #include "mbedtls/net.h" #include "mbedtls/net_sockets.h" #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/error.h" #include "mbedtls/certs.h" extern bool get_http(const std::string& url, std::string& reply, double timeout = 0.0); extern char ca_crt_rsa[]; extern size_t ca_crt_rsa_size; //---------------------------------------------------------------------- //#define DEBUG_LEVEL 1 #define MBEDTLS_EXIT_SUCCESS 0 #define MBEDTLS_EXIT_FAILURE 1 #define MBEDTLS_DEBUG_C #define MBEDTLS_CHECK_PARAMS #define H_FIELD_SIZE 512 #define H_READ_SIZE 2048 typedef struct { char method[8]; int status; char content_type[H_FIELD_SIZE]; long content_length; bool chunked; bool close; char location[H_FIELD_SIZE]; char referrer[H_FIELD_SIZE]; char cookie[H_FIELD_SIZE]; char boundary[H_FIELD_SIZE]; } HTTP_HEADER; typedef struct { bool verify; mbedtls_net_context ssl_fd; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; } HTTP_SSL; typedef struct { bool https; char host[256]; char port[8]; char path[H_FIELD_SIZE]; } HTTP_URL; typedef struct { HTTP_URL url; HTTP_HEADER request; HTTP_HEADER response; HTTP_SSL tls; long length; char r_buf[H_READ_SIZE]; long r_len; bool header_end; char *body; long body_size; long body_len; } HTTP_INFO; //---------------------------------------------------------------------- class Url { std::string _url; std::string _host; std::string _port; std::string _request; std::string _data; std::string _pers; std::string server_port; bool _https; int _err; char err_string[1024]; char buf[4096]; mbedtls_net_context server_fd; uint32_t flags; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; bool _debug; static int _rotate_log; double _timeout; std::ofstream debug_file; int http_get(std::string &response); int https_get(std::string &response); public: Url() { init(); }; Url(std::string url) { init(); _url = url; parse(url); } ~Url() { if (debug_file) { debug_file.close(); } }; void init() { _https = false; server_port.clear(); _url.clear(); _host.clear(); _port.clear(); _request.clear(); _data.clear(); _pers = "fldigi"; _timeout = 5.0; debug(); } void parse(std::string url); std::string host() { return _host; } std::string port() { return _port; } std::string request() { return _request; } std::string data() { return _data; } std::string url() { return _url; } std::string strerr() { return err_string; }; int error() { return _err; } bool https() { return _https; } std::string str_https() { if (_https) return "true"; return "false"; } int get(std::string response); int get(std::string url, std::string &response); void timeout(double t) { _timeout = t; } double timeout() { return _timeout; } void debug(); }; #endif // NETWORK_H_ fldigi-4.1.06/src/include/https.h0000664000175000017500000000445213507401434013516 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2019 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef HTTPS_CLIENT_HTTPS_H #define HTTPS_CLIENT_HTTPS_H /* #include "mbedtls/net.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/error.h" #include "mbedtls/certs.h" #define H_FIELD_SIZE 512 #define H_READ_SIZE 2048 //#undef TRUE //#undef FALSE //#define TRUE 1 //#define FALSE 0 //extern char ca_crt_rsa[]; //extern size_t ca_crt_rsa_size; typedef struct { char method[8]; int status; char content_type[H_FIELD_SIZE]; long content_length; bool chunked; bool close; char location[H_FIELD_SIZE]; char referrer[H_FIELD_SIZE]; char cookie[H_FIELD_SIZE]; char boundary[H_FIELD_SIZE]; } HTTP_HEADER; typedef struct { bool verify; mbedtls_net_context ssl_fd; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; } HTTP_SSL; typedef struct { bool https; char host[256]; char port[8]; char path[H_FIELD_SIZE]; } HTTP_URL; typedef struct { HTTP_URL url; HTTP_HEADER request; HTTP_HEADER response; HTTP_SSL tls; long length; char r_buf[H_READ_SIZE]; long r_len; bool header_end; char *body; long body_size; long body_len; } HTTP_INFO; */ #endif //HTTPS_CLIENT_HTTPS_H fldigi-4.1.06/src/include/testmodem.h0000644000175000017500000000217213472115777014365 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "trx.h" class psktest : public trx { public: psktest(char *dev) : trx(dev) {}; ~psktest(){}; protected: virtual void txinit (){}; virtual void rxinit (){}; virtual int txprocess (){}; virtual int rxprocess (unsigned char *, int len){}; }; fldigi-4.1.06/src/include/picture.h0000644000175000017500000000660613472115776014044 00000000000000// ---------------------------------------------------------------------------- // picture.h // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef picture_H #define picture_H #include #include #include class picture : public Fl_Widget { private: unsigned char *vidbuf; int bufsize; int width; int height; int numcol; int slantdir; void slant_corr(int x, int y); void slant_undo(); int zoom ; int background ; bool binary ; unsigned char binary_threshold ; inline unsigned char pix2bin( unsigned char x ) const { return x < binary_threshold ? 0 : 255 ; } static void draw_cb(void *data, int x, int y, int w, uchar *buf); void resize_zoom(int, int, int, int); void (*cbFunc)(Fl_Widget *, void *); public: picture(int, int, int, int, int bg_col = 0); ~picture(); void video(unsigned char const *, int); void pixel(unsigned char data, int pos) { if (pos < 0 || pos >= bufsize) { return ; } FL_LOCK_D(); vidbuf[pos] = data; if (pos % (width * depth) == 0) redraw(); FL_UNLOCK_D(); } unsigned char pixel(int); int handle(int); void draw(); void clear(); void image(Fl_Image *img) {Fl_Widget::image(img);} void resize(int, int, int, int); void resize_height(int new_height, bool clear_img); void shift_horizontal_center(int hShift); void stretch(double the_ratio); int save_png(const char * filename, bool monochrome = false, const char * extra_comments = NULL); void set_zoom(int the_zoom); void set_binary(bool bin_mode) { binary = bin_mode ;} int pix_width(void) const { return width ; } int pix_height(void) const { return height ; } const unsigned char * buffer(void) const { return vidbuf; } /// Sometimes the row number goes back of one due to rounding error. /// If this happens, noise removal does not work. static const int noise_height_margin = 5 ; void remove_noise( int row, int half_len, int noise_margin ); static const int depth = 3; void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } private: bool restore( int row, int margin ); bool slantcorr; public: void dilatation( int row ); void erosion( int row ); void set_binary_threshold(unsigned char thres) { binary_threshold = thres ; } unsigned char get_binary_threshold() const { return binary_threshold ; } void slant(int dir); void rotate(); void shift_center(int dir); void noslant() {slantcorr = false;} }; class picbox : public Fl_Box { public: picbox(int x, int y, int w, int h, const char* l = 0) : Fl_Box(x, y, w, h, l) { } int handle(int event); }; #endif fldigi-4.1.06/src/include/record_browse.h0000644000175000017500000000106213511722452015204 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef record_browse_h #define record_browse_h #include #include "record_loader_gui.h" #include #include #include extern Fl_Group *tabDataFiles; #include extern Fl_Input_Choice *inpDataSources; #include extern Fl_Light_Button *btnDataSourceUpdate; #include extern Fl_Button *btnDataSourceReset; Fl_Double_Window* make_record_loader_window(); #endif fldigi-4.1.06/src/include/confdialog.h0000664000175000017500000011004013511722452014451 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef confdialog_h #define confdialog_h #include #include "font_browser.h" #include "globals.h" #include "modem.h" #include "configuration.h" #include "combo.h" #include "flinput2.h" #include "flslider2.h" #include "flmisc.h" extern Fl_Double_Window *dlgConfig; extern Mode_Browser* mode_browser; void cbWaterfallFontBrowser(Fl_Widget*, void*); void cbViewerFontBrowser(Fl_Widget*, void*); void cbFreqControlFontBrowser(Fl_Widget*, void*); void set_qrzxml_buttons(Fl_Button* b); void set_qrzweb_buttons(Fl_Button* b); #include #include extern Fl_Tabs *tabsConfigure; #include extern Fl_Group *tabOperator; extern Fl_Input2 *inpMyCallsign; extern Fl_Input2 *inpOperCallsign; extern Fl_Input2 *inpMyName; extern Fl_Input2 *inpMyAntenna; extern Fl_Input2 *inpMyQth; extern Fl_Input2 *inpMyLocator; #include "counties.h" extern Fl_ListBox *listbox_states; extern Fl_Input2 *inp_QP_state_short; extern Fl_ListBox *listbox_counties; extern Fl_Input2 *inp_QP_short_county; extern Fl_Group *tabUI; extern Fl_Tabs *tabsUI; extern Fl_Group *tabBrowser; extern Fl_Spinner2 *cntChannels; extern Fl_Spinner2 *cntTimeout; extern Fl_ListBox *listboxViewerLabel; #include extern Fl_Button *btnViewerFont; #include extern Fl_Check_Button *btnFixedIntervals; extern Fl_Check_Button *btnMarquee; extern Fl_Check_Button *btnAscend; extern Fl_Check_Button *btnBrowserHistory; extern Fl_Button *bwsrSliderColor; extern Fl_Button *bwsrSldrSelColor; #include "Viewer.h" extern Fl_Button *bwsrHiLite_1_color; extern Fl_Button *bwsrHiLite_2_color; extern Fl_Button *bwsrHiLite_even_lines; extern Fl_Button *bwsrHiLite_odd_lines; extern Fl_Button *bwsrHiLite_select; extern Fl_Group *tabUserInterface; extern Fl_Check_Button *btnShowTooltips; extern Fl_Check_Button *chkMenuIcons; extern Fl_ListBox *listboxScheme; extern Fl_Button *bVisibleModes; extern Fl_ListBox *listbox_language; extern Fl_Check_Button *btn_rx_lowercase; extern Fl_Check_Button *btn_tx_lowercase; extern Fl_Check_Button *btn_save_config_on_exit; extern Fl_Check_Button *btn2_save_macros_on_exit; extern Fl_Check_Button *btn2NagMe; extern Fl_Check_Button *btn2_confirm_exit; extern Fl_Check_Button *btn_check_for_updates; extern Fl_Check_Button *btn_tx_show_timer; #include extern Fl_Spinner *val_tx_timeout; extern Fl_Group *tabLogServer; extern Fl_Tabs *tabsLog; extern Fl_Group *grp_Log_QSO; extern Fl_Check_Button *btnNagMe; extern Fl_Check_Button *btnClearOnSave; extern Fl_Check_Button *btnCallUpperCase; extern Fl_Check_Button *btnAutoFillQSO; extern Fl_Check_Button *btnDateTimeSort; extern Fl_Check_Button *btndate_time_force; extern Fl_Check_Button *btnRSTindefault; extern Fl_Check_Button *btnRSTdefault; #include "dxcc.h" extern Fl_Input2 *txt_cty_dat_pathname; extern Fl_Button *btn_select_cty_dat; extern Fl_Button *btn_default_cty_dat; extern Fl_Button *btn_reload_cty_dat; extern Fl_Input2 *inpMyPower; extern Fl_Check_Button *btnDisplayLogbookRead; extern Fl_Group *grpRX_Text; extern Fl_Check_Button *btnRXClicks; extern Fl_Check_Button *btnRXTooltips; extern Fl_Input2 *inpNonword; extern Fl_Check_Button *btnUSunits; extern Fl_Check_Button *btn_clear_fields; extern Fl_Group *grpMacLogger; #include "maclogger.h" extern Fl_Check_Button *btnConnectToMaclogger; extern Fl_Check_Button *btn_capture_maclogger_radio; extern Fl_Check_Button *btn_capture_maclogger_log; extern Fl_Check_Button *btn_capture_maclogger_lookup; extern Fl_Check_Button *btn_capture_maclogger_spot_tune; extern Fl_Check_Button *btn_capture_maclogger_spot_report; extern Fl_Check_Button *btn_enable_maclogger_log; #include extern Fl_Text_Display *txt_UDP_data; #include extern Fl_Output *txt_maclogger_log_filename; extern Fl_Group *grpN3FJP_logs; extern Fl_Text_Display *txt_N3FJP_data; extern Fl_Input2 *txt_N3FJP_ip_address; extern Fl_Input2 *txt_N3FJP_ip_port_no; extern Fl_Button *btn_default_N3FJP_ip; extern Fl_Check_Button *btn_enable_N3FJP_log; extern Fl_Check_Button *btn_connect_to_n3fjp; #include extern Fl_Box *box_n3fjp_connected; extern Fl_Check_Button *btn_N3FJP_sweet_spot; extern Fl_Check_Button *btn_N3FJP_modem_carrier; extern Fl_Check_Button *btn_enable_N3FJP_RIGTX; extern Fl_Group *tabLogContests; extern Fl_Tabs *tabs_contests; extern Fl_Group *grpGeneral_contest; #include "contest.h" extern Fl_ListBox *listbox_contest; extern Fl_ListBox *listbox_QP_contests; extern Fl_Input2 *inp_contest_notes; #include extern Fl_Light_Button *btnDupCheckOn; extern Fl_Check_Button *btnDupBand; extern Fl_Check_Button *btnDupMode; extern Fl_Check_Button *btnDupTimeSpan; #include extern Fl_Button *btnDupColor; extern Fl_Button *btnPossibleDupColor; extern Fl_Check_Button *btnDupXchg1; extern Fl_Check_Button *btnDupState; extern Fl_Value_Input2 *nbrTimeSpan; extern Fl_Input2 *inpSend1; extern Fl_Check_Button *btn599; extern Fl_Check_Button *btnCutNbrs; extern Fl_Value_Input2 *nbrContestStart; extern Fl_Value_Input2 *nbrContestDigits; extern Fl_Check_Button *btnUseLeadingZeros; extern Fl_Button *btnResetSerNbr; extern Fl_Group *grpFD_contest; extern Fl_Input2 *inp_my_FD_call; extern Fl_Input2 *inp_my_FD_section; extern Fl_Input2 *inp_my_FD_class; extern Fl_Group *grpJOTA_contest; extern Fl_Input2 *inp_my_SCR_class; extern Fl_Input2 *inp_my_JOTA_troop; extern Fl_Input2 *inp_my_JOTA_scout; extern Fl_Group *tabMBars; extern Fl_Check_Button *btnMacroMouseWheel; #include extern Fl_Counter *cnt_macro_height; #include extern Fl_Round_Button *btn_scheme_0; extern Fl_Round_Button *btn_scheme_1; extern Fl_Round_Button *btn_scheme_2; extern Fl_Round_Button *btn_scheme_3; extern Fl_Round_Button *btn_scheme_4; extern Fl_Round_Button *btn_scheme_5; extern Fl_Round_Button *btn_scheme_6; extern Fl_Round_Button *btn_scheme_7; extern Fl_Round_Button *btn_scheme_8; extern Fl_Round_Button *btn_scheme_9; extern Fl_Round_Button *btn_scheme_10; extern Fl_Round_Button *btn_scheme_11; extern Fl_Round_Button *btn_scheme_12; extern Fl_Check_Button *btnUseLastMacro; extern Fl_Check_Button *btnDisplayMacroFilename; extern Fl_Check_Button *btn_save_macros_on_exit; extern Fl_Check_Button *btn_macro_post; extern Fl_Check_Button *btn_4bar_position; extern Fl_Group *tabWF_UI; extern Fl_Check_Button *btnWF_UIrev; extern Fl_Check_Button *btnWF_UIx1; extern Fl_Check_Button *btnWF_UIwfcarrier; extern Fl_Check_Button *btnWF_UIwfshift; extern Fl_Check_Button *btnWF_UIwfreflevel; extern Fl_Check_Button *btnWF_UIwfdrop; extern Fl_Check_Button *btnWF_UIwfampspan; extern Fl_Check_Button *btnWF_UIwfstore; extern Fl_Check_Button *btnWF_UIwfmode; extern Fl_Check_Button *btnWF_UIqsy; extern Fl_Check_Button *btnWF_UIxmtlock; extern Fl_Button *btn_wf_enable_all; extern Fl_Button *btn_wf_disable_all; extern Fl_Group *tabColorsFonts; extern Fl_Tabs *tabsColors; #include "fl_digi.h" extern Fl_ListBox *listbox_charset_status; #include extern Fl_Input *RxText; extern Fl_Button *btnRxColor; extern Fl_Button *btnTxColor; extern Fl_Input *TxText; extern Fl_Button *btnRxFont; extern Fl_Button *btnTxFont; extern Fl_Input *MacroText; extern Fl_Button *btnMacroEditFont; extern Fl_Button *btnXMIT; extern Fl_Button *btnCTRL; extern Fl_Button *btnSKIP; extern Fl_Button *btnALTR; extern Fl_Button *btnSEL; extern Fl_Button *btnNoTextColor; extern Fl_Button *btnTextDefaults; extern Fl_Check_Button *btn_show_all_codes; extern Fl_Box *FDdisplay; extern Fl_Button *btn_freq_control_font; extern Fl_Button *btnBackgroundColor; extern Fl_Button *btnForegroundColor; extern Fl_Button *btnFD_SystemColor; extern Fl_Button *btnSmeter_bg_color; extern Fl_Button *btnSmeter_scale_color; extern Fl_Button *btnSmeter_meter_color; extern Fl_Button *btnPWR_bg_color; extern Fl_Button *btnPWR_scale_color; extern Fl_Button *btnPWR_meter_Color; extern Fl_ListBox *listboxPWRselect; extern Fl_Output *LOGGINGdisplay; extern Fl_Button *btnLOGGING_color; extern Fl_Button *btn_LOGGING_font; extern Fl_Button *btnLOGGINGdefault_colors_font; extern Fl_Output *LOGBOOKdisplay; extern Fl_Button *btnLOGBOOK_color; extern Fl_Button *btn_LOGBOOK_font; extern Fl_Button *btnLOGBOOKdefault_colors_font; extern Fl_Output *DXC_display; extern Fl_Button *btn_DXC_font; extern Fl_Button *btnDXCdefault_colors_font; extern Fl_Button *btn_DXC_even_lines; extern Fl_Button *btn_DXC_odd_lines; extern Fl_Input *StreamText; extern Fl_Button *btnDXcolor; extern Fl_Button *btnDXfont; extern Fl_Button *btnDXalt_color; extern Fl_Button *btnDXdefault_colors_font; extern Fl_Check_Button *btnUseGroupColors; extern Fl_Button *btnGroup1; extern Fl_Button *btnGroup2; extern Fl_Button *btnGroup3; extern Fl_Button *btnFkeyDEfaults; extern Fl_Button *btnMacroBtnFont; extern Fl_Button *btnTabColor; extern Fl_Button *btnTabDefaultColor; extern Fl_Button *btnSpotColor; extern Fl_Button *btnRevColor; extern Fl_Button *btnTuneColor; extern Fl_Button *btnRxIDColor; extern Fl_Button *btnLkColor; extern Fl_Button *btnSql1Color; extern Fl_Button *btnXmtColor; extern Fl_Button *btnRxIDwideColor; extern Fl_Button *btnAfcColor; extern Fl_Button *btnSql2Color; extern Fl_Button *btnTxIDColor; extern Fl_Box *spotcolor; extern Fl_Box *revcolor; extern Fl_Box *tunecolor; extern Fl_Box *rxidcolor; extern Fl_Box *lockcolor; extern Fl_Box *sql1color; extern Fl_Box *rxidcolorwide; extern Fl_Box *xmtcolor; extern Fl_Box *afccolor; extern Fl_Box *sql2color; extern Fl_Box *txidcolor; extern Fl_Button *btn_default_btn_color; extern Fl_Box *default_btn_color; extern Fl_Button *btnLowSignal; extern Fl_Box *lowcolor; extern Fl_Button *btnHighSignal; extern Fl_Box *highcolor; extern Fl_Button *btnNormalSignal; extern Fl_Box *normalcolor; extern Fl_Button *btnOverSignal; extern Fl_Box *overcolor; extern Fl_Group *tab_touch; #include extern Fl_Choice *sel_lsd; extern Fl_Check_Button *btn_rxtx_swap; extern Fl_Group *tabWaterfall; extern Fl_Tabs *tabsWaterfall; #include "colorbox.h" extern colorbox *WF_Palette; extern Fl_Button *btnColor[9]; extern Fl_Button *btnLoadPalette; extern Fl_Button *btnSavePalette; extern Fl_Check_Button *btnUseCursorLines; extern Fl_Button *btnCursorBWcolor; extern Fl_Check_Button *btnUseWideCursor; extern Fl_Check_Button *btnUseCursorCenterLine; extern Fl_Button *btnCursorCenterLineColor; extern Fl_Check_Button *btnUseWideCenter; extern Fl_Check_Button *btnUseBWTracks; extern Fl_Button *btnBwTracksColor; extern Fl_Check_Button *btnUseWideTracks; extern Fl_Button *btnNotchColor; extern Fl_Check_Button *chkShowAudioScale; extern Fl_Button *btnWaterfallFont; extern Fl_Check_Button *btnViewXmtSignal; extern Fl_Value_Slider2 *valTxMonitorLevel; extern Fl_Counter2 *cntLowFreqCutoff; extern Fl_Check_Button *btnWFaveraging; extern Fl_ListBox *listboxFFTPrefilter; extern Fl_Counter2 *cntrWfwidth; extern Fl_Counter2 *wf_latency; extern Fl_Counter *cntr_drop_speed; extern Fl_Counter2 *cntrWfheight; extern Fl_Check_Button *btnWaterfallHistoryDefault; extern Fl_Check_Button *btnWaterfallQSY; extern Fl_Check_Button *btnWaterfallClickInsert; extern Fl_Input2 *inpWaterfallClickText; extern Fl_ListBox *listboxWaterfallWheelAction; extern Fl_Check_Button *btnWFspectrum_center; extern Fl_Check_Button *btnWFspectrum_dbvals; extern Fl_Counter *cntr_spectrum_freq_scale; extern Fl_Check_Button *btn_spectrum_modem_scale; extern Fl_Group *tabModems; extern Fl_Tabs *tabsModems; extern Fl_Group *tabCW; extern Fl_Tabs *tabsCW; extern Fl_Group *tabsCW_general; extern Fl_Check_Button *btnCWuseSOMdecoding; extern Fl_Check_Button *btnCWrcvTrack; extern Fl_Value_Slider2 *sldrCWbandwidth; extern Fl_Check_Button *btnCWmfilt; #include extern Fl_Value_Output *valCWrcvWPM; #include extern Fl_Progress *prgsCWrcvWPM; extern Fl_Counter2 *cntLower; extern Fl_Counter2 *cntUpper; extern Fl_Counter2 *cntCWrange; extern Fl_Choice *mnu_cwrx_attack; extern Fl_Choice *mnu_cwrx_decay; extern Fl_Value_Slider2 *sldrCWxmtWPM; extern Fl_Counter2 *cntCWdefWPM; extern Fl_Counter *cntCWlowerlimit; extern Fl_Counter *cntCWupperlimit; extern Fl_Value_Slider2 *sldrCWfarnsworth; extern Fl_Check_Button *btnCWusefarnsworth; extern Fl_Group *tabsCW_timing; extern Fl_Counter2 *cntCWweight; extern Fl_Counter2 *cntCWdash2dot; extern Fl_Counter2 *cntCWrisetime; extern Fl_ListBox *i_listboxQSKshape; extern Fl_Check_Button *btnCWnarrow; extern Fl_Check_Button *btnCW_bpf_on; extern Fl_Counter2 *cntCW_hpf; extern Fl_Check_Button *btnQSK; extern Fl_Counter2 *cntPreTiming; extern Fl_Counter2 *cntPostTiming; extern Fl_Check_Button *btnQSKadjust; extern char szTestChar[]; extern Fl_ListBox *i_listbox_test_char; extern Fl_Group *tabsCW_prosigns; extern Fl_Check_Button *btnCW_use_paren; extern Fl_ListBox *listbox_prosign[9]; extern Fl_Group *tabsCW_winkeyer; #include "combo.h" #include "winkeyer.h" extern Fl_ComboBox *select_WK_CommPort; extern Fl_Light_Button *btn_WKCW_connect; extern Fl_Check_Button *btn_WK_swap; extern Fl_Check_Button *btn_WK_auto_space; extern Fl_Check_Button *btn_WK_ct_space; extern Fl_Check_Button *btn_WK_paddledog; extern Fl_Check_Button *btn_WK_cut_zeronine; extern Fl_Check_Button *btn_WK_paddle_echo; extern Fl_Check_Button *btn_WK_serial_echo; extern Fl_Check_Button *btn_WK_sidetone_on; extern Fl_Check_Button *btn_WK_tone_on; extern Fl_Check_Button *btn_WK_ptt_on; extern Fl_Counter *cntr_WK_min_wpm; extern Fl_Counter *cntr_WK_rng_wpm; extern Fl_Counter *cntr_WK_farnsworth; extern Fl_Counter *cntr_WK_cmd_wpm; extern Fl_Counter *cntr_WK_ratio; extern Fl_Counter *cntr_WK_comp; extern Fl_Counter *cntr_WK_first_ext; extern Fl_Counter *cntr_WK_sample; extern Fl_Counter *cntr_WK_weight; extern Fl_Counter *cntr_WK_leadin; extern Fl_Counter *cntr_WK_tail; extern Fl_ComboBox *choice_WK_keyer_mode; extern Fl_ComboBox *choice_WK_hang; extern Fl_ComboBox *choice_WK_sidetone; extern Fl_ComboBox *choice_WK_output_pins; extern Fl_Box *box_WK_wait; extern Fl_Box *box_WK_break_in; extern Fl_Box *box_WK_busy; extern Fl_Box *box_WK_xoff; extern Fl_Box *box_WK_keydown; extern Fl_Check_Button *btn_WK_use_pot; extern Fl_Output *txt_WK_wpm; extern Fl_Check_Button *btnK3NG; extern Fl_Group *tabsCW_ext_chars; #include "cw.h" extern Fl_Check_Button *btn_A_aelig; extern Fl_Check_Button *btn_A_umlaut; extern Fl_Check_Button *btn_A_ring; extern Fl_Check_Button *btn_O_acute; extern Fl_Check_Button *btn_O_slash; extern Fl_Check_Button *btn_O_umlaut; extern Fl_Check_Button *btn_C_cedilla; extern Fl_Check_Button *btn_E_grave; extern Fl_Check_Button *btn_E_acute; extern Fl_Check_Button *btn_N_tilde; extern Fl_Check_Button *btn_U_umlaut; extern Fl_Check_Button *btn_U_circ; extern Fl_Group *tab_nanoCW; #include "nanoIO.h" extern Fl_ComboBox *select_nanoCW_CommPort; extern Fl_Light_Button *btn_nanoCW_connect; extern Fl_Button *btn_cwfsk_save; extern Fl_Button *btn_cwfsk_query; extern Fl_Counter *cntr_nanoCW_paddle_WPM; #include "FTextRXTX.h" extern FTextView *txt_nano_CW_io; extern Fl_Counter *cntr_nanoCW_WPM; extern Fl_Counter2 *cnt_nanoCWdash2dot; extern Fl_ListBox *listbox_nano_keyer; extern Fl_ListBox *listbox_incr; extern Fl_Check_Button *btn_disable_CW_PTT; extern Fl_Check_Button *btn_nanoIO_pot; extern Fl_Counter *cntr_nanoIO_min_wpm; extern Fl_Counter *cntr_nanoIO_rng_wpm; extern Fl_Group *tabDomEX; extern Fl_Input2 *txtSecondary; extern Fl_Check_Button *valDominoEX_FILTER; extern Fl_Counter2 *valDominoEX_BW; extern Fl_Check_Button *chkDominoEX_FEC; extern Fl_Value_Slider2 *valDomCWI; extern Fl_Counter2 *valDominoEX_PATHS; extern Fl_Group *tabFeld; #include "fontdef.h" extern Fl_ListBox *listboxHellFont; extern Fl_ListBox *listboxHellPulse; extern Fl_Check_Button *btnFeldHellIdle; #include extern Fl_Value_Slider *valHellXmtWidth; extern Fl_Check_Button *btnBlackboard; extern Fl_Check_Button *btnHellMarquee; extern Fl_Value_Slider *valHellRcvWidth; extern Fl_Value_Slider *valHellRcvHeight; extern Fl_Value_Slider2 *sldrHellBW; extern Fl_Value_Slider *val_hellagc; extern Fl_Group *tabFSQ; extern Fl_Value_Slider *valhits; extern Fl_Choice *sel_fsq_lpf; extern Fl_Value_Slider *sldrMovAvg; extern Fl_Choice *sel_fsq_heard_aging; extern Fl_Round_Button *btn_fsqbaud[5]; extern Fl_Choice *sel_fsq_frequency; extern Fl_Choice *sel_fsq_sounder; extern Fl_Check_Button *btn_fsq_lowercase; extern Fl_Counter *cntr_FSQ_time_out; extern Fl_Check_Button *btn_fsq_msg_dt_stamp; extern Fl_Check_Button *btn_fsq_msg_append; extern Fl_Counter *cntr_FSQ_notify_time_out; extern Fl_Output *txtAuditLog; extern Fl_Light_Button *btn_enable_auditlog; extern Fl_Button *btn_select_auditlog; extern Fl_Output *txtHeardLog; extern Fl_Light_Button *btn_enable_fsq_heard_log; extern Fl_Button *btn_select_fsq_heard_log; extern Fl_Button *btn_fsq_xmt_color; extern Fl_Button *btn_fsq_directed_color; extern Fl_Button *btn_fsq_undirected_color; extern Fl_Button *btn_fsq_color_defaults; extern Fl_Group *tabIFKP; extern Fl_Round_Button *btn_ifkpbaud[3]; extern Fl_Check_Button *btn_ifkp_lowercase; extern Fl_Check_Button *btn_ifkp_lowercase_call; #include "trx.h" extern Fl_Check_Button *btn_ifkp_freqlock; extern Fl_Output *txt_ifkp_audit_log; extern Fl_Light_Button *btn_enable_ifkp_audit_log; extern Fl_Button *btn_ifkp_select_auditlog; extern Fl_Output *txt_ifkp_heard_log; extern Fl_Light_Button *btn_enable_ifkp_heard_log; extern Fl_Button *btn_select_ifkp_heard_log; extern Fl_Group *tabMT63; extern Fl_Check_Button *btnMT63_8bit; extern Fl_Check_Button *btnMT63_rx_integration; extern Fl_Check_Button *btnMT63_usetones; extern Fl_Check_Button *btnMT63_upper_lower; extern Fl_Spinner2 *MT63_tone_duration; extern Fl_Check_Button *btnMT63_at500; extern Fl_Check_Button *btnMT63_centered; extern Fl_Check_Button *btnMT63_manual; extern Fl_Group *tabOlivia; extern Fl_ListBox *i_listbox_olivia_bandwidth; extern Fl_ListBox *i_listbox_olivia_tones; extern Fl_Counter2 *cntOlivia_smargin; extern Fl_Counter2 *cntOlivia_sinteg; extern Fl_Check_Button *btn_olivia_reset_fec; extern Fl_Check_Button *btnOlivia_8bit; extern Fl_Check_Button *btnOlivia_start_stop_tones; extern Fl_Group *tabContestia; extern Fl_ListBox *i_listbox_contestia_bandwidth; extern Fl_ListBox *i_listbox_contestia_tones; extern Fl_Counter2 *cntContestia_smargin; extern Fl_Counter2 *cntContestia_sinteg; extern Fl_Check_Button *btnContestia_8bit; extern Fl_Check_Button *btnContestia_start_stop_tones; extern Fl_Group *tabPSK; extern Fl_Tabs *tabsPSK; extern Fl_Group *grpPSK; extern Fl_Counter2 *cntSearchRange; extern Fl_Counter2 *cntACQsn; extern Fl_ListBox *listbox_psk_status_timeout; extern Fl_Check_Button *btnEnablePSKbrowsing; extern Fl_Check_Button *btnPSKpilot; extern Fl_Counter2 *cnt_pilot_power; extern Fl_Check_Button *btnPSK8Preamble; extern Fl_Group *tabRTTY; extern Fl_Tabs *tabsRTTY; extern Fl_Group *tab_Rx_TTY; extern Fl_ListBox *i_listbox_rtty_afc_speed; extern Fl_Check_Button *chkUOSrx; #include extern Fl_Value_Input *rtty_rx_shape; extern Fl_Check_Button *btnRxTones[3]; extern Fl_Check_Button *btnPreferXhairScope; extern Fl_Check_Button *chk_true_scope; extern Fl_Check_Button *chk_useMARKfreq; extern Fl_Button *btnRTTY_mark_color; extern Fl_Group *tab_SndCrd_FSK; extern Fl_ListBox *selShift; extern Fl_Counter2 *selCustomShift; extern Fl_ListBox *selBaud; extern Fl_ListBox *selBits; extern Fl_ListBox *selParity; extern Fl_ListBox *selStopBits; extern Fl_Check_Button *btnAUTOCRLF; extern Fl_Counter2 *cntrAUTOCRLF; extern Fl_Check_Button *btnCRCRLF; extern Fl_Check_Button *chkUOStx; extern Fl_Check_Button *chk_shaped_rtty; extern Fl_Check_Button *chkPseudoFSK; extern Fl_Counter *cntr_xcvr_FSK_MARK; extern Fl_ListBox *sel_xcvr_FSK_shift; extern Fl_Counter *cnt_TTY_LTRS; extern Fl_Group *tab_nanoIO; extern Fl_ComboBox *select_nanoIO_CommPort; extern Fl_Light_Button *btn_nanoIO_connect; extern Fl_ListBox *sel_nanoIO_baud; extern Fl_Check_Button *chk_nanoIO_polarity; extern FTextView *txt_nano_io; #include "Nav.h" extern Fl_Group *tab_Nav; extern Fl_ComboBox *select_USN_FSK_port; extern Fl_Light_Button *btn_Nav_connect; extern Fl_ComboBox *select_Nav_config_port; extern Fl_ListBox *sel_Nav_ch1; extern Fl_ListBox *sel_Nav_ch2; extern Fl_ListBox *sel_Nav_rf_att; extern Fl_ListBox *sel_Nav_wk_ptt; extern Fl_ListBox *sel_Nav_LED; extern Fl_ListBox *sel_Nav_CAT_LED; extern Fl_ListBox *sel_Nav_FSK_baud; extern Fl_ListBox *sel_Nav_FSK_stopbits; extern Fl_ListBox *sel_Nav_FSK_polarity; extern Fl_ListBox *sel_Nav_FSK_sidetone; extern Fl_ListBox *sel_Nav_FSK_ptt; extern Fl_Light_Button *btn_Nav_config; extern Fl_Group *tab_Synop; extern Fl_Check_Button *btnSynopAdifDecoding; extern Fl_Check_Button *btnSynopKmlDecoding; extern Fl_Check_Button *btnSynopInterleaved; extern Fl_Group *tab_WKFSK; extern Fl_ComboBox *select_WKFSK_CommPort; extern Fl_Light_Button *btn_WKFSK_connect; extern Fl_ListBox *sel_WKFSK_baud; extern Fl_ListBox *sel_WKFSK_stopbits; extern Fl_ListBox *sel_WKFSK_ptt; extern Fl_ListBox *sel_WKFSK_polarity; extern Fl_ListBox *sel_WKFSK_sidetone; extern Fl_ListBox *sel_WKFSK_auto_crlf; extern Fl_ListBox *sel_WKFSK_diddle; extern Fl_ListBox *sel_WKFSK_diddle_char; extern Fl_ListBox *sel_WKFSK_usos; extern Fl_ListBox *sel_WKFSK_monitor; extern Fl_Group *tabTHOR; extern Fl_Input2 *txtTHORSecondary; extern Fl_Check_Button *valTHOR_FILTER; extern Fl_Counter2 *valTHOR_BW; extern Fl_Value_Slider2 *valThorCWI; extern Fl_Check_Button *valTHOR_PREAMBLE; extern Fl_Check_Button *valTHOR_SOFTSYMBOLS; extern Fl_Check_Button *valTHOR_SOFTBITS; extern Fl_Counter2 *valTHOR_PATHS; extern Fl_Group *tabOther; extern Fl_Tabs *tabsOther; extern Fl_Group *tabNavtex; extern Fl_Check_Button *btnNvtxAdifLog; extern Fl_Check_Button *btnNvtxKmlLog; extern Fl_Group *tabWefax; extern Fl_Check_Button *btnWefaxAdifLog; extern Fl_Check_Button *btnWefaxEmbeddedGui; extern Fl_Value_Input2 *btnWefaxShift; extern Fl_Value_Input2 *btnWefaxMaxRows; extern Fl_Input *btnWefaxSaveDir; extern Fl_Button *btnSelectFaxDestDir; extern Fl_Check_Button *btnWefaxHideTx; extern Fl_Check_Button *btnWefaxSaveMonochrome; extern Fl_Group *tabRig; extern Fl_Tabs *tabsRig; extern Fl_Group *tabFLRIG; extern Fl_Check_Button *chk_flrig_keys_modem; extern Fl_Button *btnDefault_flrig_ip_mirror; extern Fl_Input2 *txt_flrig_ip_address_mirror; extern Fl_Input2 *txt_flrig_ip_port_mirror; #include "rigsupport.h" extern Fl_Button *btn_reconnect_flrig_server_mirror; extern Fl_Check_Button *btn_fldigi_client_to_fldigi; extern Fl_Check_Button *chkUSERIGCAT; extern Fl_Group *grpRigCAT; extern Fl_Output *txtXmlRigFilename; extern Fl_Button *btnSelectRigXmlFile; extern Fl_ComboBox *inpXmlRigDevice; extern Fl_Value_Input2 *cntRigCatRetries; extern Fl_Value_Input2 *cntRigCatTimeout; extern Fl_Value_Input2 *cntRigCatWait; extern Fl_ListBox *listbox_xml_rig_baudrate; extern Fl_Counter2 *valRigCatStopbits; extern Fl_Button *btnInitRIGCAT; extern Fl_Check_Button *btnRigCatEcho; extern Fl_Round_Button *btnRigCatCMDptt; extern Fl_Round_Button *btnRigCatRTSptt; extern Fl_Round_Button *btnRigCatDTRptt; extern Fl_Check_Button *btnRigCatRTSplus; extern Fl_Check_Button *btnRigCatDTRplus; extern Fl_Check_Button *chkRigCatRTSCTSflow; extern Fl_Check_Button *chk_restore_tio; extern Fl_Check_Button *chkRigCatVSP; extern Fl_Value_Input2 *cntRigCatInitDelay; extern Fl_Group *tabHamlib; extern Fl_Check_Button *chkUSEHAMLIB; extern Fl_Group *grpHamlib; extern Fl_ListBox *cboHamlibRig; extern Fl_ComboBox *inpRIGdev; extern Fl_Value_Input2 *cntHamlibRetries; extern Fl_Value_Input2 *cntHamlibTimeout; extern Fl_Value_Input2 *cntHamlibWriteDelay; extern Fl_Value_Input2 *cntHamlibWait; extern Fl_ListBox *listbox_baudrate; extern Fl_Counter2 *valHamRigStopbits; extern Fl_Counter2 *valHamRigPollrate; extern Fl_Check_Button *btnHamlibCMDptt; extern Fl_Check_Button *btnHamlibPTT_ON_DATA; extern Fl_Check_Button *btnHamlibDTRplus; extern Fl_Check_Button *chkHamlibRTSplus; extern Fl_Check_Button *chkHamlibRTSCTSflow; extern Fl_Check_Button *chkHamlibXONXOFFflow; extern Fl_Check_Button *chk_hamlib_cw_is_lsb; extern Fl_Check_Button *chk_hamlib_rtty_is_usb; extern Fl_Counter2 *val_hamlib_mode_delay; extern Fl_ListBox *listbox_sideband; extern Fl_Input2 *inpHamlibConfig; extern Fl_Button *btnInitHAMLIB; extern Fl_Check_Button *btnPTTrightchannel; extern Fl_Group *grpHWPTT; extern Fl_Round_Button *btnTTYptt; extern Fl_ComboBox *inpTTYdev; extern Fl_Round_Button *btnSCU_17; extern Fl_Round_Button *btnUsePPortPTT; extern Fl_Round_Button *btnUseUHrouterPTT; extern Fl_Round_Button *btnRTSptt; extern Fl_Round_Button *btnRTSplusV; extern Fl_Round_Button *btnDTRptt; extern Fl_Round_Button *btnDTRplusV; extern Fl_Button *btnInitHWPTT; extern Fl_Group *grpPTTdelays; extern Fl_Counter *cntPTT_on_delay; extern Fl_Counter *cntPTT_off_delay; extern Fl_Check_Button *btn_enable_gpio[17]; extern Fl_Check_Button *btn_gpio_on[17]; extern Fl_Counter *cnt_gpio_pulse_width; extern Fl_Group *tabSoundCard; extern Fl_Tabs *tabsSoundCard; extern Fl_Group *tabAudio; extern Fl_Group *AudioOSS; #include extern Fl_Input_Choice *menuOSSDev; extern Fl_Group *AudioPort; extern Fl_Choice *menuPortInDev; extern Fl_Choice *menuPortOutDev; extern Fl_Group *AudioPulse; extern Fl_Input2 *inpPulseServer; extern Fl_Group *AudioNull; extern Fl_Round_Button *btnAudioIO[4]; extern Fl_Group *AudioDuplex; extern Fl_Round_Button *btn_is_full_duplex; extern Fl_Group *tabAudioOpt; extern Fl_Group *grpAudioSampleRate; extern Fl_ListBox *menuInSampleRate; extern Fl_ListBox *menuOutSampleRate; #include extern Fl_ListBox *menuSampleConverter; extern Fl_Spinner2 *cntRxRateCorr; extern Fl_Spinner2 *cntTxRateCorr; extern Fl_Spinner2 *cntTxOffset; extern Fl_Group *tabAudioRightChannel; extern Fl_Check_Button *chkAudioStereoOut; extern Fl_Check_Button *chkReverseAudio; extern Fl_Check_Button *btnPTTrightchannel2; extern Fl_Check_Button *btnQSK2; extern Fl_Check_Button *chkPseudoFSK2; extern Fl_Check_Button *chkReverseRxAudio; extern Fl_Group *tabWavFile; extern Fl_ListBox *listbox_wav_samplerate; extern Fl_Check_Button *btn_record_both; extern Fl_Group *tabAlerts; #include extern Fl_File_Input *inp_wav_fname_regex; #include extern Fl_Button *btn_select_regex_wav; extern Fl_Choice *mnu_regex_alert_menu; extern Fl_Check_Button *btn_enable_regex_match_wa; #include "audio_alert.h" extern Fl_Button *btn_test_regex_wav; extern Fl_File_Input *inp_wav_fname_mycall; extern Fl_Button *btn_select_mycall_wav; extern Fl_Choice *mnu_mycall_alert_menu; extern Fl_Check_Button *btn_enable_mycall_match_wav; extern Fl_Button *btn_test_mycall_wav; extern Fl_File_Input *inp_wav_flmsg_rcvd; extern Fl_Button *btn_select_rx_extract_msg; extern Fl_Choice *mnu_rx_extract_alert_menu; extern Fl_Check_Button *btn_enable_flmsg_wav; extern Fl_Button *btn_test_flmsg_extract_wav; extern Fl_File_Input *inp_wav_flmsg_timed_out; extern Fl_Button *btn_select_rx_extract_timed_out; extern Fl_Choice *mnu_rx_timed_out_alert_menu; extern Fl_Button *btn_test_rx_extract_timed_out; extern Fl_Check_Button *btn_enable_flmsg_time_out_wav; extern Fl_File_Input *inp_wav_fname_rsid; extern Fl_Button *btn_select_rsid_wav; extern Fl_Choice *mnu_rsid_alert_menu; extern Fl_Check_Button *btn_enable_rsid_match_wav; extern Fl_Button *btn_test_rsid_wav; extern Fl_Group *tabID; extern Fl_Tabs *tabsID; extern Fl_Group *tabRsID; extern Fl_Check_Button *chkRSidNotifyOnly; extern Fl_Button *bRSIDRxModes; extern Fl_Check_Button *chkRSidWideSearch; extern Fl_Check_Button *chkRSidMark; extern Fl_Check_Button *chkRSidAutoDisable; extern Fl_ListBox *listbox_rsid_errors; extern Fl_Value_Slider2 *sldrRSIDsquelch; extern Fl_Check_Button *chkRSidShowAlert; extern Fl_Check_Button *chkRetainFreqLock; extern Fl_Check_Button *chkDisableFreqChange; extern Fl_Counter *val_pretone; extern Fl_Button *bRSIDTxModes; extern Fl_Check_Button *btn_post_rsid; extern Fl_Group *tabVideoID; extern Fl_Check_Button *btnsendid; extern Fl_Check_Button *btnsendvideotext; extern Fl_Input2 *valVideotext; extern Fl_Check_Button *chkID_SMALL; extern Fl_Value_Slider2 *sldrVideowidth; extern Fl_Check_Button *btn_vidlimit; extern Fl_Check_Button *btn_vidmodelimit; extern Fl_Button *bVideoIDModes; extern Fl_Group *tabCwID; extern Fl_Group *sld; extern Fl_Check_Button *btnCWID; extern Fl_Value_Slider2 *sldrCWIDwpm; extern Fl_Button *bCWIDModes; extern Fl_Group *tabMisc; extern Fl_Tabs *tabsMisc; extern Fl_Group *tabCPUspeed; extern Fl_Check_Button *chkSlowCpu; extern Fl_Group *tabNBEMS; extern Fl_Check_Button *chkAutoExtract; extern Fl_Check_Button *chk_open_wrap_folder; extern Fl_Check_Button *chk_open_flmsg; extern Fl_Check_Button *chk_open_flmsg_print; extern Fl_Input2 *txt_flmsg_pathname; extern Fl_Button *btn_select_flmsg; extern Fl_Value_Slider *sldr_extract_timeout; extern Fl_Check_Button *chk_transfer__to_open_flmsg; extern Fl_Group *tabPskmail; extern Fl_Counter2 *cntServerCarrier; extern Fl_Counter2 *cntServerOffset; extern Fl_Counter2 *cntServerACQsn; extern Fl_Counter2 *cntServerAFCrange; extern Fl_Check_Button *btnPSKmailSweetSpot; extern Fl_Check_Button *btn_arq_s2n_report; extern Fl_Group *tabSpot; extern Fl_Check_Button *btnPSKRepAuto; extern Fl_Check_Button *btnPSKRepLog; extern Fl_Check_Button *btnPSKRepQRG; extern Fl_Check_Button *btn_report_when_visible; extern Fl_Check_Button *btn_pskrep_autostart; extern Fl_Box *box_connected_to_pskrep; extern Fl_Input2 *inpPSKRepHost; extern Fl_Input2 *inpPSKRepPort; extern Fl_Button *btnPSKRepInit; extern Fl_Box *boxPSKRepMsg; extern Fl_Group *tabSweetSpot; extern Fl_Value_Input2 *valCWsweetspot; extern Fl_Value_Input2 *valRTTYsweetspot; extern Fl_Value_Input2 *valPSKsweetspot; extern Fl_Check_Button *btnStartAtSweetSpot; extern Fl_Check_Button *btnCWIsLSB; extern Fl_Group *tabText_IO; extern Fl_Group *grpTalker; extern void open_talker(); extern void close_talker(); extern Fl_Light_Button *btnConnectTalker; extern Fl_Check_Button *btn_auto_talk; extern Fl_Check_Button *chkRxStream; extern Fl_Group *tabDTMF; extern Fl_Check_Button *chkDTMFdecode; extern Fl_Group *tabWX; extern Fl_Input *inpWXsta; extern Fl_Check_Button *btn_wx_full; extern Fl_Check_Button *btn_wx_station_name; extern Fl_Check_Button *btn_wx_condx; extern Fl_Check_Button *btn_wx_fahrenheit; extern Fl_Check_Button *btn_wx_celsius; extern Fl_Check_Button *btn_wx_mph; extern Fl_Check_Button *btn_wx_kph; extern Fl_Check_Button *btn_wx_inches; extern Fl_Check_Button *btn_wx_mbars; #include "weather.h" extern Fl_Button *btn_metar_search; extern Fl_Input *txt_wx_url; extern Fl_Button *btn_default_wx_url; extern Fl_Group *tabKML; extern Fl_Input *btnKmlSaveDir; extern Fl_Input *inputKmlRootFile; extern Fl_Counter *cntKmlMergeDistance; extern Fl_Counter *cntKmlRetentionTime; extern Fl_Spinner2 *cntKmlRefreshInterval; extern Fl_ListBox *listbox_kml_balloon_style; extern Fl_Input *btnKmlCommand; extern Fl_Button *btlTestKmlCommand; extern Fl_Button *btnSelectKmlDestDir; extern Fl_Button *btlPurge; extern Fl_Check_Button *btnKmlPurgeOnStartup; extern Fl_Check_Button *btn_kml_enabled; extern Fl_Group *tabQRZ; extern Fl_Tabs *tabsQRZ; extern Fl_Round_Button *btnQRZWEBnotavailable; extern Fl_Round_Button *btnQRZonline; extern Fl_Round_Button *btnHAMCALLonline; extern Fl_Round_Button *btnHamQTHonline; extern Fl_Round_Button *btnCallookOnline; extern Fl_Input2 *inp_qrzurl; extern Fl_Input2 *inp_hamcallurl; extern Fl_Input2 *inp_hamqthurl; extern Fl_Input2 *inp_callook_url; extern Fl_Round_Button *btnQRZXMLnotavailable; extern Fl_Round_Button *btnQRZcdrom; extern Fl_Round_Button *btnQRZsub; extern Fl_Round_Button *btnHamcall; extern Fl_Round_Button *btnHamQTH; extern Fl_Round_Button *btnCALLOOK; extern Fl_Input2 *txtQRZpathname; extern Fl_Input2 *inpQRZusername; extern Fl_Input2 *inpQRZuserpassword; extern Fl_Button *btnQRZpasswordShow; extern Fl_Check_Button *btn_notes_address; extern Fl_Check_Button *btn_clear_notes; extern Fl_Group *tabEQSL; extern Fl_Input2 *inpEQSL_www_url; extern Fl_Input2 *inpEQSL_id; extern Fl_Input2 *inpEQSL_pwd; extern Fl_Button *btnEQSL_pwd_show; extern Fl_Input2 *inpEQSL_nick; extern void cb_btn_verify_eqsl(Fl_Button*, void*); extern Fl_Button *btn_verify_eqsl; extern Fl_Check_Button *btn_send_when_logged; extern Fl_Check_Button *btn_send_datetime_off; extern Fl_Check_Button *btn_show_eqsl_delivery; extern Fl_Input2 *txt_eqsl_default_message; extern Fl_Box *eqsl_txt1; extern Fl_Box *eqsl_txt2; extern Fl_Box *eqsl_txt3; extern Fl_Group *tabLOTW; extern Fl_Input2 *txt_lotw_pathname; extern Fl_Input2 *inpLOTW_pwd; extern Fl_Check_Button *btn_submit_lotw_password; extern Fl_Input2 *inpLOTW_location; extern Fl_Button *btn_select_lotw; extern Fl_Check_Button *btn_lotw_quiet_mode; extern Fl_Check_Button *btn_submit_lotw; extern Fl_Button *btn_export_lotw; extern Fl_Button *btn_review_lotw; extern Fl_Button *btn_send_lotw; extern Fl_Button *btnLOTW_pwd_show; extern void cb_btn_verify_lotw(Fl_Button*, void*); extern Fl_Button *btn_verify_lotw; extern void cb_btn_view_unmatched(Fl_Button*, void*); extern Fl_Button *btn_view_unmatched; extern Fl_Check_Button *btn_show_lotw_delivery; extern Fl_Group *tabAutoStart; extern Fl_Input2 *txt_auto_flrig_pathname; extern Fl_Button *btn_select_flrig; extern Fl_Input2 *txt_auto_flamp_pathname; extern Fl_Button *btn_select_auto_flamp; extern Fl_Input2 *txt_auto_flnet_pathname; extern Fl_Button *btn_select_auto_flnet; extern Fl_Input2 *txt_auto_fllog_pathname; extern Fl_Button *btn_select_fllog; extern Fl_Input2 *txt_auto_prog1_pathname; extern Fl_Button *btn_select_prog1; extern Fl_Input2 *txt_auto_prog2_pathname; extern Fl_Button *btn_select_prog2; extern Fl_Input2 *txt_auto_prog3_pathname; extern Fl_Button *btn_select_prog3; extern Fl_Check_Button *btn_flrig_auto_enable; extern Fl_Check_Button *btn_flamp_auto_enable; extern Fl_Check_Button *btn_flnet_auto_enable; extern Fl_Check_Button *btn_fllog_auto_enable; extern Fl_Check_Button *btn_prog1_auto_enable; extern Fl_Check_Button *btn_prog2_auto_enable; extern Fl_Check_Button *btn_prog3_auto_enable; extern Fl_Button *btn_test_flrig; extern Fl_Button *btn_test_flamp; extern Fl_Button *btn_test_flnet; extern Fl_Button *btn_test_fllog; extern Fl_Button *btn_test_prog1; extern Fl_Button *btn_test_prog2; extern Fl_Button *btn_test_prog3; extern Fl_Group *tabIO; extern Fl_Check_Button *btnDisable_p2p_io_widgets; extern Fl_Check_Button *btnEnable_arq; extern Fl_Check_Button *btnEnable_kiss; extern Fl_Button *btnDefault_kiss_ip; extern Fl_Input2 *txtKiss_ip_address; extern Fl_Input2 *txtKiss_ip_io_port_no; extern Fl_Input2 *txtKiss_ip_out_port_no; extern Fl_Check_Button *btnEnable_dual_port; extern Fl_Button *btn_restart_kiss; extern Fl_Button *btn_connect_kiss_io; extern Fl_Check_Button *btnKissTCPIO; extern Fl_Check_Button *btnKissUDPIO; extern Fl_Check_Button *btnKissTCPListen; extern Fl_Check_Button *btnEnable_7bit_modem_inhibit; extern Fl_Check_Button *btnEnable_auto_connect; extern Fl_Check_Button *btnEnable_ax25_decode; extern Fl_Input2 *txtArq_ip_address; extern Fl_Input2 *txtArq_ip_port_no; extern Fl_Button *btnDefault_arq_ip; extern Fl_Button *btn_restart_arq; extern Fl_Button *btnDefault_xmlrpc_ip; extern Fl_Input2 *txtXmlrpc_ip_address; extern Fl_Input2 *txtXmlrpc_ip_port_no; extern Fl_Button *btn_restart_xml; extern Fl_Button *btnDefault_flrig_ip; extern Fl_Input2 *txt_flrig_ip_address; extern Fl_Input2 *txt_flrig_ip_port; extern Fl_Button *btn_reconnect_flrig_server; extern Fl_Input *txt_fllog_ip_address; extern Fl_Input *txt_fllog_ip_port; extern Fl_Button *btn_reconnect_log_server; extern Fl_Button *btnDefault_fllog_ip; extern Fl_Group *tabKPSM; extern Fl_Counter *cntBusyChannelSeconds; extern Fl_Check_Button *btnEnableBusyChannel; extern Fl_Counter *cntPSMTXBufferFlushTimer; extern Fl_Counter *cntPSMBandwidthMargins; extern Fl_Counter *cntPSMValidSamplePeriod; extern Fl_Check_Button *btnEnable_csma; extern Fl_Counter *cntPersistance; extern Fl_Counter *cntSlotTime; extern Fl_Counter *cntTransmitDelay; extern Fl_Output *OutputSlotTimeMS; extern Fl_Output *OutputTransmitDelayMS; extern Fl_Output *OutputPersistancePercent; extern Fl_Check_Button *btnEnable_histogram; extern Fl_Counter *cntPSMThreshold; extern Fl_Counter *cntKPSQLAttenuation; extern Fl_Button *btnBuyChannelDefaults; extern Fl_Check_Button *btn_show_psm_button; extern Fl_Button *btnSaveConfig; #include extern Fl_Return_Button *btnCloseConfig; extern Fl_Button *btnResetConfig; Fl_Double_Window* ConfigureDialog(); void openConfig(); void closeDialog(); void createConfig(); class Fl_File_Chooser ; void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata); void KmlDestDirSet(Fl_File_Chooser *w, void *userdata); void make_window(); void make_window(); #endif fldigi-4.1.06/src/include/n3fjp_logger.h0000644000175000017500000000114013472115776014734 00000000000000#ifndef N3FJP_LOGGER_H #define N3FJP_LOGGER_H #include #include "qso_db.h" extern std::string n3fjp_serno; extern void get_n3fjp_udp(); extern void *n3fjp_loop(void *args); extern void n3fjp_init(void); extern void n3fjp_start(); extern void n3fjp_restart(); extern void n3fjp_close(void); extern int n3fjp_dupcheck(); extern void n3fjp_add_record(cQsoRec &rec); extern void n3fjp_get_record(string rec); extern void n3fjp_set_freq(long f); extern void n3fjp_set_ptt(int on); extern void n3fjp_clear_record(); extern bool n3fjp_connected; extern bool n3fjp_calltab; #endif // N3FJP_LOGGER_H fldigi-4.1.06/src/include/pskeval.h0000644000175000017500000000264313472115776014033 00000000000000// ---------------------------------------------------------------------------- // pskeval.cxx -- psk signal evaluator // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _PSKEVAL_H #define _PSKEVAL_H #include "complex.h" #include "filters.h" #include "waterfall.h" #define FLOWER 200 #define FUPPER 4000 class pskeval { private: double sigpwr[FFT_LEN]; double sigmin; double bw; public: pskeval(); ~pskeval(); void clear(); void setbw(double w) { bw = w;} void sigdensity(); double sigpeak(int &f, int f1, int f2); double peak(int &f, int f1, int f2, double level); double power(int f1, int f2); }; #endif fldigi-4.1.06/src/include/fd_view.h0000644000175000017500000000171613511722452013776 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef fd_view_h #define fd_view_h #include #include #include extern Fl_Output *view_FD_call; extern Fl_Output *view_FD_class; extern Fl_Output *view_FD_section; extern Fl_Output *view_FD_mult; extern Fl_Output *view_FD_score; #include extern Fl_Output *view_FD_CW[12]; extern Fl_Output *view_FD_CW_OP[12]; extern Fl_Output *view_FD_DIG[12]; extern Fl_Output *view_FD_DIG_OP[12]; extern Fl_Output *view_FD_PHONE[12]; extern Fl_Output *view_FD_PHONE_OP[12]; #include #include "flinput2.h" extern Fl_Input2 *inp_fd_tcpip_addr; extern Fl_Input2 *inp_fd_tcpip_port; extern Fl_Input2 *inp_fd_op_call; #include #include "confdialog.h" #include "fl_digi.h" #include "logsupport.h" extern Fl_Check_Button *btn_fd_connect; extern Fl_Box *box_fdserver_connected; Fl_Double_Window* make_fd_view(); #endif fldigi-4.1.06/src/include/contestia.h0000664000175000017500000000364113507402064014344 00000000000000// ---------------------------------------------------------------------------- // contestia.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONTESTIA_H #define _CONTESTIA_H #include "modem.h" #include "jalocha/pj_mfsk.h" #include "sound.h" #define TONE_DURATION (SCBLOCKSIZE * 16) #define SR4 ((TONE_DURATION) / 4) class contestia : public modem { private: MFSK_Transmitter < double >*Tx; MFSK_Receiver < double >*Rx; double *txfbuffer; int txbufferlen; double phaseacc; cmplx prevsymbol; int preamble; unsigned int shreg; double np; double sp; double sigpwr; double noisepwr; int escape; int smargin; int sinteg; int tones; int bw; double tone_bw; int preamblesent; int postamblesent; double preamblephase; double txbasefreq; double tone_midfreq; double lastfreq; double ampshape[SR4]; double tonebuff[TONE_DURATION]; double nco(double freq); void send_tones(); public: contestia(trx_mode omode = MODE_CONTESTIA); ~contestia(); void init(); void rx_init(); void rx_flush(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); int unescape(int c); }; #endif fldigi-4.1.06/src/include/winkeyer.h0000644000175000017500000000427313472115776014224 00000000000000// ---------------------------------------------------------------------------- // winkeyer.h -- Interface to k1el WinKeyer hardware // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _WINKEYER_H #define _WINKEYER_H extern void WK_change_btn_swap(); extern void WK_change_btn_auto_space(); extern void WK_change_btn_ct_space(); extern void WK_change_btn_paddledog(); extern void WK_change_btn_cut_zeronine(); extern void WK_change_btn_paddle_echo(); extern void WK_change_btn_serial_echo(); extern void WK_change_btn_sidetone_on(); extern void WK_change_btn_tone_on(); extern void WK_change_btn_ptt_on(); extern void WK_change_cntr_min_wpm(); extern void WK_change_cntr_rng_wpm(); extern void WK_change_cntr_farnsworth(); extern void WK_change_cntr_cmd_wpm(); extern void WK_change_cntr_ratio(); extern void WK_change_cntr_comp(); extern void WK_change_cntr_first_ext(); extern void WK_change_cntr_sample(); extern void WK_change_cntr_weight(); extern void WK_change_cntr_leadin(); extern void WK_change_cntr_tail(); extern void WK_change_choice_keyer_mode(); extern void WK_change_choice_hang(); extern void WK_change_choice_sidetone(); extern void WK_change_choice_output_pins(); extern void WK_use_pot_changed(); extern void WKCW_connect(bool start); extern int WK_send_char(int c); extern void WK_set_wpm(); extern void WK_tune(bool on); extern void WK_exit(); extern void WKFSK_init(); extern void WKFSK_connect(bool start); extern void WKFSK_send_char(int ch); #endif fldigi-4.1.06/src/include/adif_io.h0000644000175000017500000000441713472115776013761 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef ADIFIO #define ADIFIO #include #include #include #include "qso_db.h" #define ADIF_VERS "2.2.7" class cAdifIO { private: bool write_all; cQsoRec *adifqso; FILE *adiFile; char *fillfield(int, int, char *); static int instances; public: cAdifIO (); ~cAdifIO (); int readAdifRec () {return 0;}; int writeAdifRec (cQsoRec *rec, const char *fname); void readFile (const char *, cQsoDb *); void do_readfile(const char *, cQsoDb *); void do_writelog(); std::string adif_record(cQsoRec *rec); int writeFile (const char *, cQsoDb *); int writeLog (const char *, cQsoDb *, bool b = true); bool log_changed(const char *fname); }; // crc 16 cycle redundancy check sum class Ccrc16 { private: unsigned int crcval; char ss[5]; public: Ccrc16() { crcval = 0xFFFF; } ~Ccrc16() {}; void reset() { crcval = 0xFFFF;} unsigned int val() {return crcval;} std::string sval() { snprintf(ss, sizeof(ss), "%04X", crcval); return ss; } void update(char c) { crcval ^= c & 255; for (int i = 0; i < 8; ++i) { if (crcval & 1) crcval = (crcval >> 1) ^ 0xA001; else crcval = (crcval >> 1); } } unsigned int crc16(char c) { update(c); return crcval; } unsigned int crc16(std::string s) { reset(); for (size_t i = 0; i < s.length(); i++) update(s[i]); return crcval; } std::string scrc16(std::string s) { crc16(s); return sval(); } }; #endif fldigi-4.1.06/src/include/mfsk.h0000664000175000017500000001416413507401434013315 00000000000000// ---------------------------------------------------------------------------- // mfsk.h -- mfsk modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MFSK_H #define _MFSK_H #include #include #include #include #include "globals.h" #include "modem.h" #include "filters.h" #include "interleave.h" #include "viterbi.h" #include "complex.h" #include "mfskvaricode.h" #include "mbuffer.h" #include "picture.h" #define MFSKSampleRate 8000 // 1 ms per pixel #define SAMPLES_PER_PIXEL 8 #define MAX_SYMBOLS 32 #define PICHEADER 64 // NASA coefficients for viterbi encode/decode algorithms #define NASA_K 7 #define POLY1 0x6d #define POLY2 0x4f class mfsk; extern int print_time_left(float secs, char *str, size_t len, const char *prefix = "", const char *suffix = ""); extern void updateTxPic(unsigned char data); extern void updateRxPic(unsigned char data, int pos); extern void TxViewerResize(int W, int H); extern void showTxViewer(int W, int H); extern void createTxViewer(); extern void createRxViewer(); extern void showRxViewer(int W, int H); extern void deleteRxViewer(); extern void deleteTxViewer(); extern void cb_picRxClose( Fl_Widget *w, void *); extern void cb_picRxAbort( Fl_Widget *w, void *); extern void pic_TxSendColor(); extern void pic_TxSendGrey(); extern void cb_picTxSendColor( Fl_Widget *w, void *); extern void cb_picTxSendGrey( Fl_Widget *w, void *); extern void cb_picTxSendAbort( Fl_Widget *w, void *); extern void load_file(const char *n); extern Fl_Double_Window *picRxWin; extern picture *picRx; extern Fl_Button *btnpicRxSave; extern Fl_Button *btnpicRxAbort; extern Fl_Button *btnpicRxClose; extern Fl_Double_Window *picTxWin; extern picture *picTx; extern Fl_Button *btnpicTxSPP; extern Fl_Button *btnpicTxSendColor; extern Fl_Button *btnpicTxSendGrey; extern Fl_Button *btnpicTxSendAbort; extern Fl_Button *btnpicTxLoad; extern Fl_Button *btnpicTxClose; extern Fl_Shared_Image *TxImg; extern unsigned char *xmtimg; extern unsigned char *xmtpicbuff; struct rxpipe { cmplx vector[MAX_SYMBOLS]; //numtones <= 32 }; struct history { cmplx val; int symnbr; }; class mfsk : public modem { #define SCOPESIZE 64 friend void updateTxPic(unsigned char data); friend void cb_picRxClose( Fl_Widget *w, void *); friend void cb_picRxAbort( Fl_Widget *w, void *); friend void pic_TxSendColor(); friend void pic_TxSendGrey(); friend void cb_picTxSendColor( Fl_Widget *w, void *); friend void cb_picTxSendGrey( Fl_Widget *w, void *); friend void cb_picTxSendAbort( Fl_Widget *w, void *); friend void cb_picTxSPP( Fl_Widget *w, void *); friend int load_image(const char *n); public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH, TX_STATE_FINISH, TX_STATE_TUNE, TX_STATE_PICTURE_START, TX_STATE_PICTURE }; enum { RX_STATE_DATA, RX_STATE_PICTURE_START, // RX_STATE_PICTURE_START_1, // RX_STATE_PICTURE_START_2, RX_STATE_PICTURE }; protected: // general double phaseacc; int symlen; int symbits; int numtones; int basetone; double tonespacing; double basefreq; int counter; int depth; // receive int rxstate; C_FIR_filter *hbfilt; sfft *binsfft; C_FIR_filter *bpfilt; C_FIR_filter *xmtfilt; Cmovavg *vidfilter[SCOPESIZE]; Cmovavg *syncfilter; viterbi *dec1; viterbi *dec2; interleave *rxinlv; rxpipe *pipe; unsigned int pipeptr; unsigned int datashreg; //VK2ETA high speed modes int preamble; cmplx currvector; cmplx prev1vector; cmplx prev2vector; int currsymbol; int prev1symbol; int prev2symbol; double maxval; double prevmaxval; double met1; double met2; mbuffer scopedata; double s2n; double sig; double noise; double afcmetric; bool staticburst; double currfreq; int synccounter; int AFC_COUNT; unsigned char symbolpair[2]; int symcounter; int RXspp; // samples per pixel int TXspp; int symbolbit; // transmit int txstate; encoder *enc; interleave *txinlv; unsigned int bitshreg; int bitstate; // Picutre data and methods int picturesize; char picheader[PICHEADER]; cmplx prevz; double picf; unsigned char prepost[128]; int row; int col; int rgb; int pixelnbr; int picW; int picH; bool color; unsigned char picprologue[176]; int xmtbytes; bool startpic; bool abortxmt; void recvpic(cmplx z); void recvchar(int c); void recvbit(int bit); // internal processes void decodesymbol(unsigned char symbol); void softdecode(cmplx *bins); cmplx mixer(cmplx in, double f); int harddecode(cmplx *in); void update_syncscope(); void synchronize(); void afc(); void reset_afc(); void eval_s2n(); void transmit(double *, int); void sendsymbol(int sym); void sendbit(int bit); void sendchar(unsigned char c); void sendidle(); void flush_xmt_filter(int); void send_prologue(); void send_epilogue(); void flushtx(int nbits); void clearbits(); void sendpic(unsigned char *data, int len); bool check_picture_header(char c); void s2nreport(void); public: mfsk (trx_mode md); ~mfsk (); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void send_color_image(std::string s); void send_Grey_image(std::string s); void shutdown(); }; #endif fldigi-4.1.06/src/include/notifydialog.h0000644000175000017500000000410713511722452015040 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef notifydialog_h #define notifydialog_h #include #include "table.h" #include "flinput2.h" #include "flslider2.h" #include #include extern Fl_Group *grpNotifyEvent; #include extern Fl_Choice *mnuNotifyEvent; #include extern Fl_Light_Button *btnNotifyEnabled; extern Fl_Input2 *inpNotifyRE; extern Fl_Group *grpNotifyFilter; #include extern Fl_Round_Button *chkNotifyFilterCall; extern Fl_Input2 *inpNotifyFilterCall; extern Fl_Round_Button *chkNotifyFilterDXCC; #include extern Fl_Button *btnNotifyFilterDXCC; #include extern Fl_Check_Button *chkNotifyFilterNWB; extern Fl_Check_Button *chkNotifyFilterLOTW; extern Fl_Check_Button *chkNotifyFilterEQSL; extern Fl_Group *grpNotifyDup; extern Fl_Check_Button *chkNotifyDupIgnore; extern Fl_Choice *mnuNotifyDupWhich; extern Fl_Spinner2 *cntNotifyDupTime; extern Fl_Check_Button *chkNotifyDupBand; extern Fl_Check_Button *chkNotifyDupMode; extern Fl_Group *grpNotifyAction; extern Fl_Spinner2 *cntNotifyActionLimit; extern Fl_Input2 *inpNotifyActionDialog; extern Fl_Button *btnNotifyActionDialogDefault; extern Fl_Spinner2 *cntNotifyActionDialogTimeout; extern Fl_Input2 *inpNotifyActionRXMarker; extern Fl_Button *btnNotifyActionMarkerDefault; extern Fl_Input2 *inpNotifyActionMacro; extern Fl_Button *btnNotifyActionMacro; extern Fl_Input2 *inpNotifyActionProgram; extern Fl_Button *btnNotifyActionProgram; extern Fl_Button *btnNotifyAdd; extern Fl_Button *btnNotifyRemove; extern Fl_Button *btnNotifyUpdate; extern Fl_Button *btnNotifyTest; extern Fl_Button *btnNotifyClose; extern Table *tblNotifyList; Fl_Double_Window* make_notify_window(); extern Table *tblNotifyFilterDXCC; extern Fl_Input2 *inpNotifyDXCCSearchCountry; extern Fl_Input2 *inpNotifyDXCCSearchCallsign; extern Fl_Button *btnNotifyDXCCSelect; extern Fl_Button *btnNotifyDXCCDeselect; extern Fl_Button *btnNotifyDXCCClose; Fl_Double_Window* make_dxcc_window(); #endif fldigi-4.1.06/src/include/htmlstrings.h0000644000175000017500000000175713472115776014751 00000000000000// ---------------------------------------------------------------------------- // // htmlstrings.h // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef HTMLSTRINGS_H #define HTMLSTRINGS_H extern const char* szBeginner; extern const char* szAbout; #endif fldigi-4.1.06/src/include/pixmaps.h0000644000175000017500000000665313472115777014055 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PIXMAPS_H_ #define PIXMAPS_H_ extern const char *address_book_icon[]; extern const char *edit_undo_icon[]; extern const char *edit_select_all_icon[]; extern const char *edit_clear_icon[]; extern const char *edit_copy_icon[]; extern const char *edit_cut_icon[]; extern const char *edit_paste_icon[]; extern const char *file_open_icon[]; extern const char *format_indent_more_icon[]; extern const char *left_arrow_icon[]; extern const char *log_out_icon[]; extern const char *minus_icon[]; extern const char *net_icon[]; extern const char *plus_icon[]; extern const char *process_stop_icon[]; extern const char *right_arrow_icon[]; extern const char *save_as_icon[]; extern const char *save_icon[]; extern const char *time_icon[]; extern const char *trash_icon[]; extern const char *image_icon[]; extern const char *weather_clear_icon[]; extern const char *start_here_icon[]; extern const char *help_browser_icon[]; extern const char *system_search_icon[]; extern const char *system_software_update_icon[]; extern const char *utilities_terminal_icon[]; extern const char *emblem_symbolic_link_icon[]; extern const char *emblems_system_icon[]; extern const char *dialog_information_icon[]; extern const char *executable_icon[]; extern const char *other_icon[]; extern const char *folder_open_icon[]; extern const char *preferences_system_icon[]; extern const char *preferences_desktop_font_icon[]; extern const char *system_users_icon[]; extern const char *utilities_system_monitor_icon[]; extern const char *multimedia_player_icon[]; extern const char *chat_icon[]; extern const char *dialog_information_48_icon[]; extern const char *dialog_warning_48_icon[]; extern const char *refresh_icon[]; extern const char *text_editor_icon[]; extern const char *text_icon[]; extern const char *shutdown_icon[]; extern const char *applications_system_icon[]; extern const char *audio_card_icon[]; extern const char *help_about_icon[]; extern const char *insert_link_icon[]; extern const char *close_icon[]; extern const char *apply_icon[]; extern const char *enter_key_icon[]; extern const char *dialog_question_48_icon[]; extern const char *clear_sq_icon[]; extern const char *clear_row_icon[]; extern const char *rx1_icon[]; extern const char *tx1_icon[]; extern const char *rx2_icon[]; extern const char *tx2_icon[]; extern const char *rx_icon[]; extern const char *tx_icon[]; extern const char *fldigi_icon[]; extern const char *flarq_icon[]; extern const char *waterfall_icon[]; extern const char *dice_icon[]; extern const char *pskr_icon[]; extern const char *tango_view_refresh[]; #endif // PIXMAPS_H_ fldigi-4.1.06/src/include/digiscope.h0000644000175000017500000000650613472115776014336 00000000000000// ---------------------------------------------------------------------------- // digiscope.h, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DIGISCOPE_H #define DIGISCOPE_H #include #include "complex.h" class Digiscope : public Fl_Widget { public: #define DEFAULT_WIDTH 100 #define DEFAULT_HEIGHT 100 #define MAX_LEN 4096 //1024 #define MAX_ZLEN 1024 #define NUM_GRIDS 100 enum scope_mode { SCOPE, PHASE, PHASE1, PHASE2, PHASE3, RTTY, XHAIRS, WWV, DOMDATA, DOMWF, BLANK }; private: scope_mode _mode; double _buf[MAX_LEN]; cmplx _zdata[MAX_ZLEN]; //int _zlen; int _zptr; unsigned char *vidbuf; unsigned char *vidline; int _len; int linecnt; double _phase; double _quality; double _flo, _fhi, _amp; double _x[NUM_GRIDS], _y[NUM_GRIDS]; bool _highlight; scope_mode phase_mode; protected: double _y_user1, _y_user2; double _x_user1, _x_user2; bool _x_graticule; bool _y_graticule; public: Digiscope(int, int, int, int); ~Digiscope(); int handle(int); void resize(int x, int y, int w, int h); void draw(); void draw_scope(); void draw_phase(); void draw_rtty(); void draw_xy(); void draw_video(); void data(double *data, int len, bool scale = true); void phase(double ph, double ql, bool hl); void video(double *data, int len, bool dir ); void zdata(cmplx *z, int len); void rtty(double flo, double fhi, double amp); void mode(scope_mode md); scope_mode mode() { return _mode;};\ void xaxis(int n, double y1) { if (n < NUM_GRIDS) _y[n] = y1; } void yaxis(int n, double x1) { if (n < NUM_GRIDS) _x[n] = x1; } void xaxis_1(double y1) { _y[1] = y1; } void xaxis_2(double y2) { _y[2] = y2; } void yaxis_1(double x1) { _x[1] = x1; } void yaxis_2(double x2) { _x[2] = x2; } void clear_axis() { for (int i = 0; i < NUM_GRIDS; i++) _x[i] = _y[i] = 0; } double x_user1() { return _x_user1; } void x_user1(double val) { _x_user1 = val; } double x_user2() { return _x_user2; } void x_user2(double val) { _x_user2 = val; } double y_user1() { return _y_user1; } void y_user1(double val) { _y_user1 = val; } double y_user2() { return _y_user2; } void y_user2(double val) { _y_user2 = val; } bool x_graticule() { return _x_graticule; } void x_graticule(bool b) { _x_graticule = b; } bool y_graticule() { return _y_graticule; } void y_graticule(bool b) { _y_graticule = b; } }; #endif fldigi-4.1.06/src/include/throb.h0000644000175000017500000000561713472115776013510 00000000000000// ---------------------------------------------------------------------------- // throb.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _THROB_H #define _THROB_H #include "modem.h" #include "globals.h" #include "fftfilt.h" #include "filters.h" #include "complex.h" #include "mbuffer.h" #define THROB_SAMPLE_RATE 8000 #define SYMLEN 512 #define BUFFLEN 4096 #define SCOPE_DATA_LEN 1024 #define DOWN_SAMPLE 32 #define SYMLEN_1 8192 #define SYMLEN_2 4096 #define SYMLEN_4 2048 #define MAX_RX_SYMLEN (SYMLEN_1 / DOWN_SAMPLE) #define FilterFFTLen 8192 class throb : public modem { static double ThrobToneFreqsNar[]; static double ThrobToneFreqsWid[]; static double ThrobXToneFreqsNar[]; static double ThrobXToneFreqsWid[]; static unsigned char ThrobCharSet[]; static unsigned char ThrobXCharSet[]; static int ThrobTonePairs[][2]; static int ThrobXTonePairs[][2]; protected: int num_tones; int num_chars; int idlesym; int spacesym; char lastchar; double phaseacc; double phaseincr; fftfilt *fftfilter; C_FIR_filter *syncfilt; C_FIR_filter *hilbert; Cmovavg *snfilter; int symlen; double freqs[55]; // receive double *scope_data; cmplx *rxtone[55]; cmplx symbol[MAX_RX_SYMLEN]; double syncbuf[MAX_RX_SYMLEN]; mbuffer dispbuf; double rxcntr; double signal; double noise; double s2n; int rxsymlen; int symptr; int deccntr; int shift; int waitsync; cmplx mixer(cmplx in); void sync(cmplx in); void rx(cmplx in); void decodechar(int tone1, int tone2); int findtones(cmplx *word, int &tone1, int &tone2); cmplx *mk_rxtone(double freq, double *pulse, int len); void show_char(int); void flip_syms(); void reset_syms(); // transmit int txstate; int preamble; double *txpulse; double *outbuf; unsigned int buffptr; double *mk_semi_pulse(int len); double *mk_full_pulse(int len); void send(int); public: throb(trx_mode); ~throb(); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); }; #endif fldigi-4.1.06/src/include/kmlserver.h0000644000175000017500000000672313472115777014404 00000000000000// ---------------------------------------------------------------------------- // kmlserver.h -- KML Server // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _KMLSERVER_H #define _KMLSERVER_H #include #include #include #include #include /// Keyhole Markup Language: This publishes a complete message, localisation+time+weather etc... class KmlServer { protected: /// Counts the number of complete messages written. int m_nb_broadcasts ; int exit_kml_server; int request_broadcast; public: /// List of key-value pairs displayed for example in Google Earth balloons. struct CustomDataT : public std::vector< std::pair< std::string, std::string > > { /// Also used when reloading a KML file. void Push( const char * k, const std::string & v ); /// TODO: Most of keys are duplicated. Should store them in a hash to reduce memory footprint. void Push( const char * k, const char * v ) { Push( k, std::string(v) ); } /// This helper makes insertions simpler. template< class Type > void Push( const char * k, const Type & v ) { std::stringstream strm ; strm << v ; Push( k, strm.str() ); } }; KmlServer() : m_nb_broadcasts(0), exit_kml_server(0), request_broadcast(0) {} virtual ~KmlServer() {} /// BEWARE: Will work until 2038. static const time_t UniqueEvent = INT_MAX ; /// This can for example go to a NMEA client. virtual void Broadcast( const std::string & category, time_t evtTim, const CoordinateT::Pair & refCoo, double altitude, const std::string & kml_name, const std::string & styleNam, const std::string & descrTxt, const CustomDataT & custDat ) = 0; /// Singleton. static KmlServer * GetInstance(void); /// Number of calls to Broadcast(). Debugging purpose only. int NbBroadcasts(void) const { return m_nb_broadcasts; } /// Debugging only, just to check what happens inside. void ResetCounter() { m_nb_broadcasts = 0;} virtual void Reset() = 0; /// TODO: Maybe have one display style per category, instead of the same for all. virtual void InitParams( const std::string & kml_command, const std::string & kml_dir, double kml_merge = 10000, int kml_retention = 0, // Keep all data. int kml_refresh = 120, int kml_balloon_style = 0) = 0; virtual void ReloadKmlFiles() = 0; /// Creates the process for the command to be run when KML data is saved. static void SpawnProcess(); /// Stops the sub-thread, flush KML data to the files. static void Exit(); static std::string Tm2Time( time_t tim ); /// No value means, now. static std::string Tm2Time(void); }; #endif // _KMLSERVER_H fldigi-4.1.06/src/include/rigio.h0000644000175000017500000000454113472115777013477 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RIGIO_H #define RIGIO_H #include #include "threads.h" #include "serial.h" extern Cserial rigio; extern pthread_mutex_t rigCAT_mutex; extern bool hexout(const std::string&); extern bool sendCommand(std::string cmd, std::string catstr, int retnbr, int waitval); extern void add_to_cmdque( std::string cmd, std::string s, int retnbr, int waitval); extern long long rigCAT_getfreq(int retries, bool &failed, int waitval = 0); extern void rigCAT_setfreq(long long); extern std::string rigCAT_getmode(); extern void rigCAT_setmode(const std::string&); extern std::string rigCAT_getwidth(); extern void rigCAT_setwidth(const std::string&); extern void rigCAT_get_notch(); extern void rigCAT_set_notch(int val); extern void rigCAT_get_smeter(); extern void rigCAT_get_pwrmeter(); extern void rigCAT_set_pwrlevel(int); extern void rigCAT_get_pwrlevel(); extern void rigCAT_close(); extern bool rigCAT_init(); extern bool rigCAT_active(); extern void rigCAT_sendINIT(const std::string& icmd, int multiplier = 1); extern void rigCAT_set_ptt(int); extern void rigCAT_set_qsy(long long f); extern void rigCAT_defaults(); //extern void rigCAT_restore_defaults(); // no xcvr extern long long noCAT_getfreq(); extern void noCAT_setfreq(long long f); extern std::string noCAT_getmode(); extern void noCAT_setmode(const std::string &md); extern std::string noCAT_getwidth(); extern void noCAT_setwidth(const std::string &w); extern void noCAT_setPTT(bool val); extern void noCAT_init(); #endif fldigi-4.1.06/src/include/mbedtls/0000775000175000017500000000000013515625026013714 500000000000000fldigi-4.1.06/src/include/mbedtls/blowfish.h0000664000175000017500000003066613507401434015631 00000000000000/** * \file blowfish.h * * \brief Blowfish block cipher */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_BLOWFISH_H #define MBEDTLS_BLOWFISH_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #include "platform_util.h" #define MBEDTLS_BLOWFISH_ENCRYPT 1 #define MBEDTLS_BLOWFISH_DECRYPT 0 #define MBEDTLS_BLOWFISH_MAX_KEY_BITS 448 #define MBEDTLS_BLOWFISH_MIN_KEY_BITS 32 #define MBEDTLS_BLOWFISH_ROUNDS 16 /**< Rounds to use. When increasing this value, make sure to extend the initialisation vectors */ #define MBEDTLS_BLOWFISH_BLOCKSIZE 8 /* Blowfish uses 64 bit blocks */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #define MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( -0x0016 ) #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #define MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA -0x0016 /**< Bad input data. */ #define MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH -0x0018 /**< Invalid data input length. */ /* MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED -0x0017 /**< Blowfish hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_BLOWFISH_ALT) // Regular implementation // /** * \brief Blowfish context structure */ typedef struct mbedtls_blowfish_context { uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2]; /*!< Blowfish round keys */ uint32_t S[4][256]; /*!< key dependent S-boxes */ } mbedtls_blowfish_context; #else /* MBEDTLS_BLOWFISH_ALT */ #include "blowfish_alt.h" #endif /* MBEDTLS_BLOWFISH_ALT */ /** * \brief Initialize a Blowfish context. * * \param ctx The Blowfish context to be initialized. * This must not be \c NULL. */ void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx ); /** * \brief Clear a Blowfish context. * * \param ctx The Blowfish context to be cleared. * This may be \c NULL, in which case this function * returns immediately. If it is not \c NULL, it must * point to an initialized Blowfish context. */ void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx ); /** * \brief Perform a Blowfish key schedule operation. * * \param ctx The Blowfish context to perform the key schedule on. * \param key The encryption key. This must be a readable buffer of * length \p keybits Bits. * \param keybits The length of \p key in Bits. This must be between * \c 32 and \c 448 and a multiple of \c 8. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief Perform a Blowfish-ECB block encryption/decryption operation. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. Possible values are * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or * #MBEDTLS_BLOWFISH_DECRYPT for decryption. * \param input The input block. This must be a readable buffer * of size \c 8 Bytes. * \param output The output block. This must be a writable buffer * of size \c 8 Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx, int mode, const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief Perform a Blowfish-CBC buffer encryption/decryption operation. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. Possible values are * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or * #MBEDTLS_BLOWFISH_DECRYPT for decryption. * \param length The length of the input data in Bytes. This must be * multiple of \c 8. * \param iv The initialization vector. This must be a read/write buffer * of length \c 8 Bytes. It is updated by this function. * \param input The input data. This must be a readable buffer of length * \p length Bytes. * \param output The output data. This must be a writable buffer of length * \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief Perform a Blowfish CFB buffer encryption/decryption operation. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. Possible values are * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or * #MBEDTLS_BLOWFISH_DECRYPT for decryption. * \param length The length of the input data in Bytes. * \param iv_off The offset in the initialiation vector. * The value pointed to must be smaller than \c 8 Bytes. * It is updated by this function to support the aforementioned * streaming usage. * \param iv The initialization vector. This must be a read/write buffer * of size \c 8 Bytes. It is updated after use. * \param input The input data. This must be a readable buffer of length * \p length Bytes. * \param output The output data. This must be a writable buffer of length * \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /*MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief Perform a Blowfish-CTR buffer encryption/decryption operation. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**64 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first 4 bytes for the * per-message nonce, and the last 4 bytes for internal use. In that * case, before calling this function on a new message you need to * set the first 4 bytes of \p nonce_counter to your chosen nonce * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p * stream_block to be ignored). That way, you can encrypt at most * 2**32 messages of up to 2**32 blocks each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be unique. * The recommended way to ensure uniqueness is to use a message * counter. * * Note that for both stategies, sizes are measured in blocks and * that a Blowfish block is 8 bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param length The length of the input data in Bytes. * \param nc_off The offset in the current stream_block (for resuming * within current cipher stream). The offset pointer * should be \c 0 at the start of a stream and must be * smaller than \c 8. It is updated by this function. * \param nonce_counter The 64-bit nonce and counter. This must point to a * read/write buffer of length \c 8 Bytes. * \param stream_block The saved stream-block for resuming. This must point to * a read/write buffer of length \c 8 Bytes. * \param input The input data. This must be a readable buffer of * length \p length Bytes. * \param output The output data. This must be a writable buffer of * length \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ #ifdef __cplusplus } #endif #endif /* blowfish.h */ fldigi-4.1.06/src/include/mbedtls/ccm.h0000664000175000017500000003346013507401434014551 00000000000000/** * \file ccm.h * * \brief This file provides an API for the CCM authenticated encryption * mode for block ciphers. * * CCM combines Counter mode encryption with CBC-MAC authentication * for 128-bit block ciphers. * * Input to CCM includes the following elements: *
  • Payload - data that is both authenticated and encrypted.
  • *
  • Associated data (Adata) - data that is authenticated but not * encrypted, For example, a header.
  • *
  • Nonce - A unique value that is assigned to the payload and the * associated data.
* * Definition of CCM: * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf * RFC 3610 "Counter with CBC-MAC (CCM)" * * Related: * RFC 5116 "An Interface and Algorithms for Authenticated Encryption" * * Definition of CCM*: * IEEE 802.15.4 - IEEE Standard for Local and metropolitan area networks * Integer representation is fixed most-significant-octet-first order and * the representation of octets is most-significant-bit-first order. This is * consistent with RFC 3610. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CCM_H #define MBEDTLS_CCM_H #include "cipher.h" #define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D /**< Bad input parameters to the function. */ #define MBEDTLS_ERR_CCM_AUTH_FAILED -0x000F /**< Authenticated decryption failed. */ /* MBEDTLS_ERR_CCM_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CCM_HW_ACCEL_FAILED -0x0011 /**< CCM hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_CCM_ALT) // Regular implementation // /** * \brief The CCM context-type definition. The CCM context is passed * to the APIs called. */ typedef struct mbedtls_ccm_context { mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ } mbedtls_ccm_context; #else /* MBEDTLS_CCM_ALT */ #include "ccm_alt.h" #endif /* MBEDTLS_CCM_ALT */ /** * \brief This function initializes the specified CCM context, * to make references valid, and prepare the context * for mbedtls_ccm_setkey() or mbedtls_ccm_free(). * * \param ctx The CCM context to initialize. This must not be \c NULL. */ void mbedtls_ccm_init( mbedtls_ccm_context *ctx ); /** * \brief This function initializes the CCM context set in the * \p ctx parameter and sets the encryption key. * * \param ctx The CCM context to initialize. This must be an initialized * context. * \param cipher The 128-bit block cipher to use. * \param key The encryption key. This must not be \c NULL. * \param keybits The key size in bits. This must be acceptable by the cipher. * * \return \c 0 on success. * \return A CCM or cipher-specific error code on failure. */ int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ); /** * \brief This function releases and clears the specified CCM context * and underlying cipher sub-context. * * \param ctx The CCM context to clear. If this is \c NULL, the function * has no effect. Otherwise, this must be initialized. */ void mbedtls_ccm_free( mbedtls_ccm_context *ctx ); /** * \brief This function encrypts a buffer using CCM. * * \note The tag is written to a separate buffer. To concatenate * the \p tag with the \p output, as done in RFC-3610: * Counter with CBC-MAC (CCM), use * \p tag = \p output + \p length, and make sure that the * output buffer is at least \p length + \p tag_len wide. * * \param ctx The CCM context to use for encryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. If \p add_len is greater than * zero, \p add must be a readable buffer of at least that * length. * \param add_len The length of additional data in Bytes. * This must be less than `2^16 - 2^8`. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field to generate in Bytes: * 4, 6, 8, 10, 12, 14 or 16. * * \return \c 0 on success. * \return A CCM or cipher-specific error code on failure. */ int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ); /** * \brief This function encrypts a buffer using CCM*. * * \note The tag is written to a separate buffer. To concatenate * the \p tag with the \p output, as done in RFC-3610: * Counter with CBC-MAC (CCM), use * \p tag = \p output + \p length, and make sure that the * output buffer is at least \p length + \p tag_len wide. * * \note When using this function in a variable tag length context, * the tag length has to be encoded into the \p iv passed to * this function. * * \param ctx The CCM context to use for encryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. This must be a readable buffer of * at least \p add_len Bytes. * \param add_len The length of additional data in Bytes. * This must be less than 2^16 - 2^8. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field to generate in Bytes: * 0, 4, 6, 8, 10, 12, 14 or 16. * * \warning Passing \c 0 as \p tag_len means that the message is no * longer authenticated. * * \return \c 0 on success. * \return A CCM or cipher-specific error code on failure. */ int mbedtls_ccm_star_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ); /** * \brief This function performs a CCM authenticated decryption of a * buffer. * * \param ctx The CCM context to use for decryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. This must be a readable buffer * of at least that \p add_len Bytes.. * \param add_len The length of additional data in Bytes. * This must be less than 2^16 - 2^8. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field to generate in Bytes: * 4, 6, 8, 10, 12, 14 or 16. * * \return \c 0 on success. This indicates that the message is authentic. * \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match. * \return A cipher-specific error code on calculation failure. */ int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ); /** * \brief This function performs a CCM* authenticated decryption of a * buffer. * * \note When using this function in a variable tag length context, * the tag length has to be decoded from \p iv and passed to * this function as \p tag_len. (\p tag needs to be adjusted * accordingly.) * * \param ctx The CCM context to use for decryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. This must be a readable buffer of * at least that \p add_len Bytes. * \param add_len The length of additional data in Bytes. * This must be less than 2^16 - 2^8. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field in Bytes. * 0, 4, 6, 8, 10, 12, 14 or 16. * * \warning Passing \c 0 as \p tag_len means that the message is nos * longer authenticated. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match. * \return A cipher-specific error code on calculation failure. */ int mbedtls_ccm_star_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ); #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /** * \brief The CCM checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_ccm_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CCM_H */ fldigi-4.1.06/src/include/mbedtls/pk_internal.h0000664000175000017500000001122513507401434016310 00000000000000/** * \file pk_internal.h * * \brief Public Key abstraction layer: wrapper functions */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PK_WRAP_H #define MBEDTLS_PK_WRAP_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "pk.h" struct mbedtls_pk_info_t { /** Public key type */ mbedtls_pk_type_t type; /** Type name */ const char *name; /** Get key size in bits */ size_t (*get_bitlen)( const void * ); /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */ int (*can_do)( mbedtls_pk_type_t type ); /** Verify signature */ int (*verify_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); /** Make signature */ int (*sign_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** Verify signature (restartable) */ int (*verify_rs_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ); /** Make signature (restartable) */ int (*sign_rs_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /** Decrypt message */ int (*decrypt_func)( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** Encrypt message */ int (*encrypt_func)( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** Check public-private key pair */ int (*check_pair_func)( const void *pub, const void *prv ); /** Allocate a new context */ void * (*ctx_alloc_func)( void ); /** Free the given context */ void (*ctx_free_func)( void *ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** Allocate the restart context */ void * (*rs_alloc_func)( void ); /** Free the restart context */ void (*rs_free_func)( void *rs_ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /** Interface with the debug module */ void (*debug_func)( const void *ctx, mbedtls_pk_debug_item *items ); }; #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /* Container for RSA-alt */ typedef struct { void *key; mbedtls_pk_rsa_alt_decrypt_func decrypt_func; mbedtls_pk_rsa_alt_sign_func sign_func; mbedtls_pk_rsa_alt_key_len_func key_len_func; } mbedtls_rsa_alt_context; #endif #if defined(MBEDTLS_RSA_C) extern const mbedtls_pk_info_t mbedtls_rsa_info; #endif #if defined(MBEDTLS_ECP_C) extern const mbedtls_pk_info_t mbedtls_eckey_info; extern const mbedtls_pk_info_t mbedtls_eckeydh_info; #endif #if defined(MBEDTLS_ECDSA_C) extern const mbedtls_pk_info_t mbedtls_ecdsa_info; #endif #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) extern const mbedtls_pk_info_t mbedtls_rsa_alt_info; #endif #endif /* MBEDTLS_PK_WRAP_H */ fldigi-4.1.06/src/include/mbedtls/debug.h0000664000175000017500000002411713507401434015074 00000000000000/** * \file debug.h * * \brief Functions for controlling and providing debug output from the library. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_DEBUG_H #define MBEDTLS_DEBUG_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "ssl.h" #if defined(MBEDTLS_ECP_C) #include "ecp.h" #endif #if defined(MBEDTLS_DEBUG_C) #define MBEDTLS_DEBUG_STRIP_PARENS( ... ) __VA_ARGS__ #define MBEDTLS_SSL_DEBUG_MSG( level, args ) \ mbedtls_debug_print_msg( ssl, level, __FILE__, __LINE__, \ MBEDTLS_DEBUG_STRIP_PARENS args ) #define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) \ mbedtls_debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret ) #define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) \ mbedtls_debug_print_buf( ssl, level, __FILE__, __LINE__, text, buf, len ) #if defined(MBEDTLS_BIGNUM_C) #define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) \ mbedtls_debug_print_mpi( ssl, level, __FILE__, __LINE__, text, X ) #endif #if defined(MBEDTLS_ECP_C) #define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) \ mbedtls_debug_print_ecp( ssl, level, __FILE__, __LINE__, text, X ) #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) #define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) \ mbedtls_debug_print_crt( ssl, level, __FILE__, __LINE__, text, crt ) #endif #if defined(MBEDTLS_ECDH_C) #define MBEDTLS_SSL_DEBUG_ECDH( level, ecdh, attr ) \ mbedtls_debug_printf_ecdh( ssl, level, __FILE__, __LINE__, ecdh, attr ) #endif #else /* MBEDTLS_DEBUG_C */ #define MBEDTLS_SSL_DEBUG_MSG( level, args ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_ECDH( level, ecdh, attr ) do { } while( 0 ) #endif /* MBEDTLS_DEBUG_C */ #ifdef __cplusplus extern "C" { #endif /** * \brief Set the threshold error level to handle globally all debug output. * Debug messages that have a level over the threshold value are * discarded. * (Default value: 0 = No debug ) * * \param threshold theshold level of messages to filter on. Messages at a * higher level will be discarded. * - Debug levels * - 0 No debug * - 1 Error * - 2 State change * - 3 Informational * - 4 Verbose */ void mbedtls_debug_set_threshold( int threshold ); /** * \brief Print a message to the debug output. This function is always used * through the MBEDTLS_SSL_DEBUG_MSG() macro, which supplies the ssl * context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the message has occurred in * \param line line number the message has occurred at * \param format format specifier, in printf format * \param ... variables used by the format specifier * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *format, ... ); /** * \brief Print the return value of a function to the debug output. This * function is always used through the MBEDTLS_SSL_DEBUG_RET() macro, * which supplies the ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text the name of the function that returned the error * \param ret the return code value * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, int ret ); /** * \brief Output a buffer of size len bytes to the debug output. This function * is always used through the MBEDTLS_SSL_DEBUG_BUF() macro, * which supplies the ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the buffer being dumped. Normally the * variable or buffer name * \param buf the buffer to be outputted * \param len length of the buffer * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const unsigned char *buf, size_t len ); #if defined(MBEDTLS_BIGNUM_C) /** * \brief Print a MPI variable to the debug output. This function is always * used through the MBEDTLS_SSL_DEBUG_MPI() macro, which supplies the * ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the MPI being output. Normally the * variable name * \param X the MPI variable * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_mpi *X ); #endif #if defined(MBEDTLS_ECP_C) /** * \brief Print an ECP point to the debug output. This function is always * used through the MBEDTLS_SSL_DEBUG_ECP() macro, which supplies the * ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the ECP point being output. Normally the * variable name * \param X the ECP point * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_ecp_point *X ); #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Print a X.509 certificate structure to the debug output. This * function is always used through the MBEDTLS_SSL_DEBUG_CRT() macro, * which supplies the ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the certificate being output * \param crt X.509 certificate structure * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_x509_crt *crt ); #endif #if defined(MBEDTLS_ECDH_C) typedef enum { MBEDTLS_DEBUG_ECDH_Q, MBEDTLS_DEBUG_ECDH_QP, MBEDTLS_DEBUG_ECDH_Z, } mbedtls_debug_ecdh_attr; /** * \brief Print a field of the ECDH structure in the SSL context to the debug * output. This function is always used through the * MBEDTLS_SSL_DEBUG_ECDH() macro, which supplies the ssl context, file * and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param ecdh the ECDH context * \param attr the identifier of the attribute being output * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_printf_ecdh( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const mbedtls_ecdh_context *ecdh, mbedtls_debug_ecdh_attr attr ); #endif #ifdef __cplusplus } #endif #endif /* debug.h */ fldigi-4.1.06/src/include/mbedtls/ecp_internal.h0000664000175000017500000002471513507401434016455 00000000000000/** * \file ecp_internal.h * * \brief Function declarations for alternative implementation of elliptic curve * point arithmetic. */ /* * Copyright (C) 2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * [1] BERNSTEIN, Daniel J. Curve25519: new Diffie-Hellman speed records. * * * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis * for elliptic curve cryptosystems. In : Cryptographic Hardware and * Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302. * * * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to * render ECC resistant against Side Channel Attacks. IACR Cryptology * ePrint Archive, 2004, vol. 2004, p. 342. * * * [4] Certicom Research. SEC 2: Recommended Elliptic Curve Domain Parameters. * * * [5] HANKERSON, Darrel, MENEZES, Alfred J., VANSTONE, Scott. Guide to Elliptic * Curve Cryptography. * * [6] Digital Signature Standard (DSS), FIPS 186-4. * * * [7] Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer * Security (TLS), RFC 4492. * * * [8] * * [9] COHEN, Henri. A Course in Computational Algebraic Number Theory. * Springer Science & Business Media, 1 Aug 2000 */ #ifndef MBEDTLS_ECP_INTERNAL_H #define MBEDTLS_ECP_INTERNAL_H #if defined(MBEDTLS_ECP_INTERNAL_ALT) /** * \brief Indicate if the Elliptic Curve Point module extension can * handle the group. * * \param grp The pointer to the elliptic curve group that will be the * basis of the cryptographic computations. * * \return Non-zero if successful. */ unsigned char mbedtls_internal_ecp_grp_capable( const mbedtls_ecp_group *grp ); /** * \brief Initialise the Elliptic Curve Point module extension. * * If mbedtls_internal_ecp_grp_capable returns true for a * group, this function has to be able to initialise the * module for it. * * This module can be a driver to a crypto hardware * accelerator, for which this could be an initialise function. * * \param grp The pointer to the group the module needs to be * initialised for. * * \return 0 if successful. */ int mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp ); /** * \brief Frees and deallocates the Elliptic Curve Point module * extension. * * \param grp The pointer to the group the module was initialised for. */ void mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp ); #if defined(ECP_SHORTWEIERSTRASS) #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) /** * \brief Randomize jacobian coordinates: * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l. * * \param grp Pointer to the group representing the curve. * * \param pt The point on the curve to be randomised, given with Jacobian * coordinates. * * \param f_rng A function pointer to the random number generator. * * \param p_rng A pointer to the random number generator state. * * \return 0 if successful. */ int mbedtls_internal_ecp_randomize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) /** * \brief Addition: R = P + Q, mixed affine-Jacobian coordinates. * * The coordinates of Q must be normalized (= affine), * but those of P don't need to. R is not normalized. * * This function is used only as a subrutine of * ecp_mul_comb(). * * Special cases: (1) P or Q is zero, (2) R is zero, * (3) P == Q. * None of these cases can happen as intermediate step in * ecp_mul_comb(): * - at each step, P, Q and R are multiples of the base * point, the factor being less than its order, so none of * them is zero; * - Q is an odd multiple of the base point, P an even * multiple, due to the choice of precomputed points in the * modified comb method. * So branches for these cases do not leak secret information. * * We accept Q->Z being unset (saving memory in tables) as * meaning 1. * * Cost in field operations if done by [5] 3.22: * 1A := 8M + 3S * * \param grp Pointer to the group representing the curve. * * \param R Pointer to a point structure to hold the result. * * \param P Pointer to the first summand, given with Jacobian * coordinates * * \param Q Pointer to the second summand, given with affine * coordinates. * * \return 0 if successful. */ int mbedtls_internal_ecp_add_mixed( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); #endif /** * \brief Point doubling R = 2 P, Jacobian coordinates. * * Cost: 1D := 3M + 4S (A == 0) * 4M + 4S (A == -3) * 3M + 6S + 1a otherwise * when the implementation is based on the "dbl-1998-cmo-2" * doubling formulas in [8] and standard optimizations are * applied when curve parameter A is one of { 0, -3 }. * * \param grp Pointer to the group representing the curve. * * \param R Pointer to a point structure to hold the result. * * \param P Pointer to the point that has to be doubled, given with * Jacobian coordinates. * * \return 0 if successful. */ #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) int mbedtls_internal_ecp_double_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P ); #endif /** * \brief Normalize jacobian coordinates of an array of (pointers to) * points. * * Using Montgomery's trick to perform only one inversion mod P * the cost is: * 1N(t) := 1I + (6t - 3)M + 1S * (See for example Algorithm 10.3.4. in [9]) * * This function is used only as a subrutine of * ecp_mul_comb(). * * Warning: fails (returning an error) if one of the points is * zero! * This should never happen, see choice of w in ecp_mul_comb(). * * \param grp Pointer to the group representing the curve. * * \param T Array of pointers to the points to normalise. * * \param t_len Number of elements in the array. * * \return 0 if successful, * an error if one of the points is zero. */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) int mbedtls_internal_ecp_normalize_jac_many( const mbedtls_ecp_group *grp, mbedtls_ecp_point *T[], size_t t_len ); #endif /** * \brief Normalize jacobian coordinates so that Z == 0 || Z == 1. * * Cost in field operations if done by [5] 3.2.1: * 1N := 1I + 3M + 1S * * \param grp Pointer to the group representing the curve. * * \param pt pointer to the point to be normalised. This is an * input/output parameter. * * \return 0 if successful. */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) int mbedtls_internal_ecp_normalize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt ); #endif #endif /* ECP_SHORTWEIERSTRASS */ #if defined(ECP_MONTGOMERY) #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) int mbedtls_internal_ecp_double_add_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, mbedtls_ecp_point *S, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q, const mbedtls_mpi *d ); #endif /** * \brief Randomize projective x/z coordinates: * (X, Z) -> (l X, l Z) for random l * * \param grp pointer to the group representing the curve * * \param P the point on the curve to be randomised given with * projective coordinates. This is an input/output parameter. * * \param f_rng a function pointer to the random number generator * * \param p_rng a pointer to the random number generator state * * \return 0 if successful */ #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) int mbedtls_internal_ecp_randomize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif /** * \brief Normalize Montgomery x/z coordinates: X = X/Z, Z = 1. * * \param grp pointer to the group representing the curve * * \param P pointer to the point to be normalised. This is an * input/output parameter. * * \return 0 if successful */ #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) int mbedtls_internal_ecp_normalize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P ); #endif #endif /* ECP_MONTGOMERY */ #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #endif /* ecp_internal.h */ fldigi-4.1.06/src/include/mbedtls/asn1.h0000664000175000017500000003015513507401434014647 00000000000000/** * \file asn1.h * * \brief Generic ASN.1 parsing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ASN1_H #define MBEDTLS_ASN1_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_BIGNUM_C) #include "bignum.h" #endif /** * \addtogroup asn1_module * \{ */ /** * \name ASN1 Error codes * These error codes are OR'ed to X509 error codes for * higher error granularity. * ASN1 is a standard to specify data structures. * \{ */ #define MBEDTLS_ERR_ASN1_OUT_OF_DATA -0x0060 /**< Out of data when parsing an ASN1 data structure. */ #define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -0x0062 /**< ASN1 tag was of an unexpected value. */ #define MBEDTLS_ERR_ASN1_INVALID_LENGTH -0x0064 /**< Error when trying to determine the length or invalid length. */ #define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -0x0066 /**< Actual length differs from expected length. */ #define MBEDTLS_ERR_ASN1_INVALID_DATA -0x0068 /**< Data is invalid. (not used) */ #define MBEDTLS_ERR_ASN1_ALLOC_FAILED -0x006A /**< Memory allocation failed */ #define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -0x006C /**< Buffer too small when writing ASN.1 data structure. */ /* \} name */ /** * \name DER constants * These constants comply with the DER encoded ASN.1 type tags. * DER encoding uses hexadecimal representation. * An example DER sequence is:\n * - 0x02 -- tag indicating INTEGER * - 0x01 -- length in octets * - 0x05 -- value * Such sequences are typically read into \c ::mbedtls_x509_buf. * \{ */ #define MBEDTLS_ASN1_BOOLEAN 0x01 #define MBEDTLS_ASN1_INTEGER 0x02 #define MBEDTLS_ASN1_BIT_STRING 0x03 #define MBEDTLS_ASN1_OCTET_STRING 0x04 #define MBEDTLS_ASN1_NULL 0x05 #define MBEDTLS_ASN1_OID 0x06 #define MBEDTLS_ASN1_UTF8_STRING 0x0C #define MBEDTLS_ASN1_SEQUENCE 0x10 #define MBEDTLS_ASN1_SET 0x11 #define MBEDTLS_ASN1_PRINTABLE_STRING 0x13 #define MBEDTLS_ASN1_T61_STRING 0x14 #define MBEDTLS_ASN1_IA5_STRING 0x16 #define MBEDTLS_ASN1_UTC_TIME 0x17 #define MBEDTLS_ASN1_GENERALIZED_TIME 0x18 #define MBEDTLS_ASN1_UNIVERSAL_STRING 0x1C #define MBEDTLS_ASN1_BMP_STRING 0x1E #define MBEDTLS_ASN1_PRIMITIVE 0x00 #define MBEDTLS_ASN1_CONSTRUCTED 0x20 #define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 /* * Bit masks for each of the components of an ASN.1 tag as specified in * ITU X.690 (08/2015), section 8.1 "General rules for encoding", * paragraph 8.1.2.2: * * Bit 8 7 6 5 1 * +-------+-----+------------+ * | Class | P/C | Tag number | * +-------+-----+------------+ */ #define MBEDTLS_ASN1_TAG_CLASS_MASK 0xC0 #define MBEDTLS_ASN1_TAG_PC_MASK 0x20 #define MBEDTLS_ASN1_TAG_VALUE_MASK 0x1F /* \} name */ /* \} addtogroup asn1_module */ /** Returns the size of the binary string, without the trailing \\0 */ #define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1) /** * Compares an mbedtls_asn1_buf structure to a reference OID. * * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a * 'unsigned char *oid' here! */ #define MBEDTLS_OID_CMP(oid_str, oid_buf) \ ( ( MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len ) || \ memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) != 0 ) #ifdef __cplusplus extern "C" { #endif /** * \name Functions to parse ASN.1 data structures * \{ */ /** * Type-length-value structure that allows for ASN1 using DER. */ typedef struct mbedtls_asn1_buf { int tag; /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */ size_t len; /**< ASN1 length, in octets. */ unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ } mbedtls_asn1_buf; /** * Container for ASN1 bit strings. */ typedef struct mbedtls_asn1_bitstring { size_t len; /**< ASN1 length, in octets. */ unsigned char unused_bits; /**< Number of unused bits at the end of the string */ unsigned char *p; /**< Raw ASN1 data for the bit string */ } mbedtls_asn1_bitstring; /** * Container for a sequence of ASN.1 items */ typedef struct mbedtls_asn1_sequence { mbedtls_asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ struct mbedtls_asn1_sequence *next; /**< The next entry in the sequence. */ } mbedtls_asn1_sequence; /** * Container for a sequence or list of 'named' ASN.1 data items */ typedef struct mbedtls_asn1_named_data { mbedtls_asn1_buf oid; /**< The object identifier. */ mbedtls_asn1_buf val; /**< The named value. */ struct mbedtls_asn1_named_data *next; /**< The next entry in the sequence. */ unsigned char next_merged; /**< Merge next item into the current one? */ } mbedtls_asn1_named_data; /** * \brief Get the length of an ASN.1 element. * Updates the pointer to immediately behind the length. * * \param p The position in the ASN.1 data * \param end End of data * \param len The variable that will receive the value * * \return 0 if successful, MBEDTLS_ERR_ASN1_OUT_OF_DATA on reaching * end of data, MBEDTLS_ERR_ASN1_INVALID_LENGTH if length is * unparseable. */ int mbedtls_asn1_get_len( unsigned char **p, const unsigned char *end, size_t *len ); /** * \brief Get the tag and length of the tag. Check for the requested tag. * Updates the pointer to immediately behind the tag and length. * * \param p The position in the ASN.1 data * \param end End of data * \param len The variable that will receive the length * \param tag The expected tag * * \return 0 if successful, MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if tag did * not match requested tag, or another specific ASN.1 error code. */ int mbedtls_asn1_get_tag( unsigned char **p, const unsigned char *end, size_t *len, int tag ); /** * \brief Retrieve a boolean ASN.1 tag and its value. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param val The variable that will receive the value * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_bool( unsigned char **p, const unsigned char *end, int *val ); /** * \brief Retrieve an integer ASN.1 tag and its value. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param val The variable that will receive the value * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_int( unsigned char **p, const unsigned char *end, int *val ); /** * \brief Retrieve a bitstring ASN.1 tag and its value. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param bs The variable that will receive the value * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, mbedtls_asn1_bitstring *bs); /** * \brief Retrieve a bitstring ASN.1 tag without unused bits and its * value. * Updates the pointer to the beginning of the bit/octet string. * * \param p The position in the ASN.1 data * \param end End of data * \param len Length of the actual bit/octect string in bytes * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, size_t *len ); /** * \brief Parses and splits an ASN.1 "SEQUENCE OF " * Updated the pointer to immediately behind the full sequence tag. * * \param p The position in the ASN.1 data * \param end End of data * \param cur First variable in the chain to fill * \param tag Type of sequence * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_sequence_of( unsigned char **p, const unsigned char *end, mbedtls_asn1_sequence *cur, int tag); #if defined(MBEDTLS_BIGNUM_C) /** * \brief Retrieve a MPI value from an integer ASN.1 tag. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param X The MPI that will receive the value * * \return 0 if successful or a specific ASN.1 or MPI error code. */ int mbedtls_asn1_get_mpi( unsigned char **p, const unsigned char *end, mbedtls_mpi *X ); #endif /* MBEDTLS_BIGNUM_C */ /** * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence. * Updates the pointer to immediately behind the full * AlgorithmIdentifier. * * \param p The position in the ASN.1 data * \param end End of data * \param alg The buffer to receive the OID * \param params The buffer to receive the params (if any) * * \return 0 if successful or a specific ASN.1 or MPI error code. */ int mbedtls_asn1_get_alg( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ); /** * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no * params. * Updates the pointer to immediately behind the full * AlgorithmIdentifier. * * \param p The position in the ASN.1 data * \param end End of data * \param alg The buffer to receive the OID * * \return 0 if successful or a specific ASN.1 or MPI error code. */ int mbedtls_asn1_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg ); /** * \brief Find a specific named_data entry in a sequence or list based on * the OID. * * \param list The list to seek through * \param oid The OID to look for * \param len Size of the OID * * \return NULL if not found, or a pointer to the existing entry. */ mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, const char *oid, size_t len ); /** * \brief Free a mbedtls_asn1_named_data entry * * \param entry The named data entry to free */ void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *entry ); /** * \brief Free all entries in a mbedtls_asn1_named_data list * Head will be set to NULL * * \param head Pointer to the head of the list of named data entries to free */ void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ); #ifdef __cplusplus } #endif #endif /* asn1.h */ fldigi-4.1.06/src/include/mbedtls/gcm.h0000664000175000017500000003314013507401434014550 00000000000000/** * \file gcm.h * * \brief This file contains GCM definitions and functions. * * The Galois/Counter Mode (GCM) for 128-bit block ciphers is defined * in D. McGrew, J. Viega, The Galois/Counter Mode of Operation * (GCM), Natl. Inst. Stand. Technol. * * For more information on GCM, see NIST SP 800-38D: Recommendation for * Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_GCM_H #define MBEDTLS_GCM_H #include "cipher.h" #include #define MBEDTLS_GCM_ENCRYPT 1 #define MBEDTLS_GCM_DECRYPT 0 #define MBEDTLS_ERR_GCM_AUTH_FAILED -0x0012 /**< Authenticated decryption failed. */ /* MBEDTLS_ERR_GCM_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_GCM_HW_ACCEL_FAILED -0x0013 /**< GCM hardware accelerator failed. */ #define MBEDTLS_ERR_GCM_BAD_INPUT -0x0014 /**< Bad input parameters to function. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_GCM_ALT) /** * \brief The GCM context structure. */ typedef struct mbedtls_gcm_context { mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ uint64_t HL[16]; /*!< Precalculated HTable low. */ uint64_t HH[16]; /*!< Precalculated HTable high. */ uint64_t len; /*!< The total length of the encrypted data. */ uint64_t add_len; /*!< The total length of the additional data. */ unsigned char base_ectr[16]; /*!< The first ECTR for tag. */ unsigned char y[16]; /*!< The Y working value. */ unsigned char buf[16]; /*!< The buf working value. */ int mode; /*!< The operation to perform: #MBEDTLS_GCM_ENCRYPT or #MBEDTLS_GCM_DECRYPT. */ } mbedtls_gcm_context; #else /* !MBEDTLS_GCM_ALT */ #include "gcm_alt.h" #endif /* !MBEDTLS_GCM_ALT */ /** * \brief This function initializes the specified GCM context, * to make references valid, and prepares the context * for mbedtls_gcm_setkey() or mbedtls_gcm_free(). * * The function does not bind the GCM context to a particular * cipher, nor set the key. For this purpose, use * mbedtls_gcm_setkey(). * * \param ctx The GCM context to initialize. This must not be \c NULL. */ void mbedtls_gcm_init( mbedtls_gcm_context *ctx ); /** * \brief This function associates a GCM context with a * cipher algorithm and a key. * * \param ctx The GCM context. This must be initialized. * \param cipher The 128-bit block cipher to use. * \param key The encryption key. This must be a readable buffer of at * least \p keybits bits. * \param keybits The key size in bits. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return A cipher-specific error code on failure. */ int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ); /** * \brief This function performs GCM encryption or decryption of a buffer. * * \note For encryption, the output buffer can be the same as the * input buffer. For decryption, the output buffer cannot be * the same as input buffer. If the buffers overlap, the output * buffer must trail at least 8 Bytes behind the input buffer. * * \warning When this function performs a decryption, it outputs the * authentication tag and does not verify that the data is * authentic. You should use this function to perform encryption * only. For decryption, use mbedtls_gcm_auth_decrypt() instead. * * \param ctx The GCM context to use for encryption or decryption. This * must be initialized. * \param mode The operation to perform: * - #MBEDTLS_GCM_ENCRYPT to perform authenticated encryption. * The ciphertext is written to \p output and the * authentication tag is written to \p tag. * - #MBEDTLS_GCM_DECRYPT to perform decryption. * The plaintext is written to \p output and the * authentication tag is written to \p tag. * Note that this mode is not recommended, because it does * not verify the authenticity of the data. For this reason, * you should use mbedtls_gcm_auth_decrypt() instead of * calling this function in decryption mode. * \param length The length of the input data, which is equal to the length * of the output data. * \param iv The initialization vector. This must be a readable buffer of * at least \p iv_len Bytes. * \param iv_len The length of the IV. * \param add The buffer holding the additional data. This must be of at * least that size in Bytes. * \param add_len The length of the additional data. * \param input The buffer holding the input data. If \p length is greater * than zero, this must be a readable buffer of at least that * size in Bytes. * \param output The buffer for holding the output data. If \p length is greater * than zero, this must be a writable buffer of at least that * size in Bytes. * \param tag_len The length of the tag to generate. * \param tag The buffer for holding the tag. This must be a readable * buffer of at least \p tag_len Bytes. * * \return \c 0 if the encryption or decryption was performed * successfully. Note that in #MBEDTLS_GCM_DECRYPT mode, * this does not indicate that the data is authentic. * \return #MBEDTLS_ERR_GCM_BAD_INPUT if the lengths or pointers are * not valid or a cipher-specific error code if the encryption * or decryption failed. */ int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx, int mode, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, size_t tag_len, unsigned char *tag ); /** * \brief This function performs a GCM authenticated decryption of a * buffer. * * \note For decryption, the output buffer cannot be the same as * input buffer. If the buffers overlap, the output buffer * must trail at least 8 Bytes behind the input buffer. * * \param ctx The GCM context. This must be initialized. * \param length The length of the ciphertext to decrypt, which is also * the length of the decrypted plaintext. * \param iv The initialization vector. This must be a readable buffer * of at least \p iv_len Bytes. * \param iv_len The length of the IV. * \param add The buffer holding the additional data. This must be of at * least that size in Bytes. * \param add_len The length of the additional data. * \param tag The buffer holding the tag to verify. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to verify. * \param input The buffer holding the ciphertext. If \p length is greater * than zero, this must be a readable buffer of at least that * size. * \param output The buffer for holding the decrypted plaintext. If \p length * is greater than zero, this must be a writable buffer of at * least that size. * * \return \c 0 if successful and authenticated. * \return #MBEDTLS_ERR_GCM_AUTH_FAILED if the tag does not match. * \return #MBEDTLS_ERR_GCM_BAD_INPUT if the lengths or pointers are * not valid or a cipher-specific error code if the decryption * failed. */ int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *tag, size_t tag_len, const unsigned char *input, unsigned char *output ); /** * \brief This function starts a GCM encryption or decryption * operation. * * \param ctx The GCM context. This must be initialized. * \param mode The operation to perform: #MBEDTLS_GCM_ENCRYPT or * #MBEDTLS_GCM_DECRYPT. * \param iv The initialization vector. This must be a readable buffer of * at least \p iv_len Bytes. * \param iv_len The length of the IV. * \param add The buffer holding the additional data, or \c NULL * if \p add_len is \c 0. * \param add_len The length of the additional data. If \c 0, * \p add may be \c NULL. * * \return \c 0 on success. */ int mbedtls_gcm_starts( mbedtls_gcm_context *ctx, int mode, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len ); /** * \brief This function feeds an input buffer into an ongoing GCM * encryption or decryption operation. * * ` The function expects input to be a multiple of 16 * Bytes. Only the last call before calling * mbedtls_gcm_finish() can be less than 16 Bytes. * * \note For decryption, the output buffer cannot be the same as * input buffer. If the buffers overlap, the output buffer * must trail at least 8 Bytes behind the input buffer. * * \param ctx The GCM context. This must be initialized. * \param length The length of the input data. This must be a multiple of * 16 except in the last call before mbedtls_gcm_finish(). * \param input The buffer holding the input data. If \p length is greater * than zero, this must be a readable buffer of at least that * size in Bytes. * \param output The buffer for holding the output data. If \p length is * greater than zero, this must be a writable buffer of at * least that size in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_GCM_BAD_INPUT on failure. */ int mbedtls_gcm_update( mbedtls_gcm_context *ctx, size_t length, const unsigned char *input, unsigned char *output ); /** * \brief This function finishes the GCM operation and generates * the authentication tag. * * It wraps up the GCM stream, and generates the * tag. The tag can have a maximum length of 16 Bytes. * * \param ctx The GCM context. This must be initialized. * \param tag The buffer for holding the tag. This must be a readable * buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to generate. This must be at least * four. * * \return \c 0 on success. * \return #MBEDTLS_ERR_GCM_BAD_INPUT on failure. */ int mbedtls_gcm_finish( mbedtls_gcm_context *ctx, unsigned char *tag, size_t tag_len ); /** * \brief This function clears a GCM context and the underlying * cipher sub-context. * * \param ctx The GCM context to clear. If this is \c NULL, the call has * no effect. Otherwise, this must be initialized. */ void mbedtls_gcm_free( mbedtls_gcm_context *ctx ); /** * \brief The GCM checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_gcm_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* gcm.h */ fldigi-4.1.06/src/include/mbedtls/camellia.h0000664000175000017500000003355713507401434015565 00000000000000/** * \file camellia.h * * \brief Camellia block cipher */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CAMELLIA_H #define MBEDTLS_CAMELLIA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #include "platform_util.h" #define MBEDTLS_CAMELLIA_ENCRYPT 1 #define MBEDTLS_CAMELLIA_DECRYPT 0 #if !defined(MBEDTLS_DEPRECATED_REMOVED) #define MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( -0x0024 ) #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #define MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA -0x0024 /**< Bad input data. */ #define MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH -0x0026 /**< Invalid data input length. */ /* MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED -0x0027 /**< Camellia hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_CAMELLIA_ALT) // Regular implementation // /** * \brief CAMELLIA context structure */ typedef struct mbedtls_camellia_context { int nr; /*!< number of rounds */ uint32_t rk[68]; /*!< CAMELLIA round keys */ } mbedtls_camellia_context; #else /* MBEDTLS_CAMELLIA_ALT */ #include "camellia_alt.h" #endif /* MBEDTLS_CAMELLIA_ALT */ /** * \brief Initialize a CAMELLIA context. * * \param ctx The CAMELLIA context to be initialized. * This must not be \c NULL. */ void mbedtls_camellia_init( mbedtls_camellia_context *ctx ); /** * \brief Clear a CAMELLIA context. * * \param ctx The CAMELLIA context to be cleared. This may be \c NULL, * in which case this function returns immediately. If it is not * \c NULL, it must be initialized. */ void mbedtls_camellia_free( mbedtls_camellia_context *ctx ); /** * \brief Perform a CAMELLIA key schedule operation for encryption. * * \param ctx The CAMELLIA context to use. This must be initialized. * \param key The encryption key to use. This must be a readable buffer * of size \p keybits Bits. * \param keybits The length of \p key in Bits. This must be either \c 128, * \c 192 or \c 256. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief Perform a CAMELLIA key schedule operation for decryption. * * \param ctx The CAMELLIA context to use. This must be initialized. * \param key The decryption key. This must be a readable buffer * of size \p keybits Bits. * \param keybits The length of \p key in Bits. This must be either \c 128, * \c 192 or \c 256. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief Perform a CAMELLIA-ECB block encryption/decryption operation. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * \param input The input block. This must be a readable buffer * of size \c 16 Bytes. * \param output The output block. This must be a writable buffer * of size \c 16 Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief Perform a CAMELLIA-CBC buffer encryption/decryption operation. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * \param length The length in Bytes of the input data \p input. * This must be a multiple of \c 16 Bytes. * \param iv The initialization vector. This must be a read/write buffer * of length \c 16 Bytes. It is updated to allow streaming * use as explained above. * \param input The buffer holding the input data. This must point to a * readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must point to a * writable buffer of length \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief Perform a CAMELLIA-CFB128 buffer encryption/decryption * operation. * * \note Due to the nature of CFB mode, you should use the same * key for both encryption and decryption. In particular, calls * to this function should be preceded by a key-schedule via * mbedtls_camellia_setkey_enc() regardless of whether \p mode * is #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * \param length The length of the input data \p input. Any value is allowed. * \param iv_off The current offset in the IV. This must be smaller * than \c 16 Bytes. It is updated after this call to allow * the aforementioned streaming usage. * \param iv The initialization vector. This must be a read/write buffer * of length \c 16 Bytes. It is updated after this call to * allow the aforementioned streaming usage. * \param input The buffer holding the input data. This must be a readable * buffer of size \p length Bytes. * \param output The buffer to hold the output data. This must be a writable * buffer of length \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief Perform a CAMELLIA-CTR buffer encryption/decryption operation. * * *note Due to the nature of CTR mode, you should use the same * key for both encryption and decryption. In particular, calls * to this function should be preceded by a key-schedule via * mbedtls_camellia_setkey_enc() regardless of whether \p mode * is #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**128 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first \c 12 Bytes for the * per-message nonce, and the last \c 4 Bytes for internal use. * In that case, before calling this function on a new message you * need to set the first \c 12 Bytes of \p nonce_counter to your * chosen nonce value, the last four to \c 0, and \p nc_off to \c 0 * (which will cause \p stream_block to be ignored). That way, you * can encrypt at most \c 2**96 messages of up to \c 2**32 blocks * each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be * unique. The recommended way to ensure uniqueness is to use a * message counter. An alternative is to generate random nonces, * but this limits the number of messages that can be securely * encrypted: for example, with 96-bit random nonces, you should * not encrypt more than 2**32 messages with the same key. * * Note that for both stategies, sizes are measured in blocks and * that a CAMELLIA block is \c 16 Bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param length The length of the input data \p input in Bytes. * Any value is allowed. * \param nc_off The offset in the current \p stream_block (for resuming * within current cipher stream). The offset pointer to * should be \c 0 at the start of a stream. It is updated * at the end of this call. * \param nonce_counter The 128-bit nonce and counter. This must be a read/write * buffer of length \c 16 Bytes. * \param stream_block The saved stream-block for resuming. This must be a * read/write buffer of length \c 16 Bytes. * \param input The input data stream. This must be a readable buffer of * size \p length Bytes. * \param output The output data stream. This must be a writable buffer * of size \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_camellia_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* camellia.h */ fldigi-4.1.06/src/include/mbedtls/md2.h0000664000175000017500000002226613507401434014473 00000000000000/** * \file md2.h * * \brief MD2 message digest algorithm (hash function) * * \warning MD2 is considered a weak message digest and its use constitutes a * security risk. We recommend considering stronger message digests * instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_MD2_H #define MBEDTLS_MD2_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include /* MBEDTLS_ERR_MD2_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD2_HW_ACCEL_FAILED -0x002B /**< MD2 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_MD2_ALT) // Regular implementation // /** * \brief MD2 context structure * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_md2_context { unsigned char cksum[16]; /*!< checksum of the data block */ unsigned char state[48]; /*!< intermediate digest state */ unsigned char buffer[16]; /*!< data block being processed */ size_t left; /*!< amount of data in buffer */ } mbedtls_md2_context; #else /* MBEDTLS_MD2_ALT */ #include "md2_alt.h" #endif /* MBEDTLS_MD2_ALT */ /** * \brief Initialize MD2 context * * \param ctx MD2 context to be initialized * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md2_init( mbedtls_md2_context *ctx ); /** * \brief Clear MD2 context * * \param ctx MD2 context to be cleared * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md2_free( mbedtls_md2_context *ctx ); /** * \brief Clone (the state of) an MD2 context * * \param dst The destination context * \param src The context to be cloned * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md2_clone( mbedtls_md2_context *dst, const mbedtls_md2_context *src ); /** * \brief MD2 context setup * * \param ctx context to be initialized * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx ); /** * \brief MD2 process buffer * * \param ctx MD2 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_update_ret( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD2 final digest * * \param ctx MD2 context * \param output MD2 checksum result * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx, unsigned char output[16] ); /** * \brief MD2 process data block (internal use only) * * \param ctx MD2 context * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_internal_md2_process( mbedtls_md2_context *ctx ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief MD2 context setup * * \deprecated Superseded by mbedtls_md2_starts_ret() in 2.7.0 * * \param ctx context to be initialized * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_starts( mbedtls_md2_context *ctx ); /** * \brief MD2 process buffer * * \deprecated Superseded by mbedtls_md2_update_ret() in 2.7.0 * * \param ctx MD2 context * \param input buffer holding the data * \param ilen length of the input data * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD2 final digest * * \deprecated Superseded by mbedtls_md2_finish_ret() in 2.7.0 * * \param ctx MD2 context * \param output MD2 checksum result * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] ); /** * \brief MD2 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_md2_process() in 2.7.0 * * \param ctx MD2 context * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_process( mbedtls_md2_context *ctx ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = MD2( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output MD2 checksum result * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = MD2( input buffer ) * * \deprecated Superseded by mbedtls_md2_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output MD2 checksum result * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_md2.h */ fldigi-4.1.06/src/include/mbedtls/pem.h0000664000175000017500000001175413507401434014572 00000000000000/** * \file pem.h * * \brief Privacy Enhanced Mail (PEM) decoding */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PEM_H #define MBEDTLS_PEM_H #include /** * \name PEM Error codes * These error codes are returned in case of errors reading the * PEM data. * \{ */ #define MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT -0x1080 /**< No PEM header or footer found. */ #define MBEDTLS_ERR_PEM_INVALID_DATA -0x1100 /**< PEM string is not as expected. */ #define MBEDTLS_ERR_PEM_ALLOC_FAILED -0x1180 /**< Failed to allocate memory. */ #define MBEDTLS_ERR_PEM_INVALID_ENC_IV -0x1200 /**< RSA IV is not in hex-format. */ #define MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG -0x1280 /**< Unsupported key encryption algorithm. */ #define MBEDTLS_ERR_PEM_PASSWORD_REQUIRED -0x1300 /**< Private key password can't be empty. */ #define MBEDTLS_ERR_PEM_PASSWORD_MISMATCH -0x1380 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE -0x1400 /**< Unavailable feature, e.g. hashing/encryption combination. */ #define MBEDTLS_ERR_PEM_BAD_INPUT_DATA -0x1480 /**< Bad input parameters to function. */ /* \} name */ #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_PEM_PARSE_C) /** * \brief PEM context structure */ typedef struct mbedtls_pem_context { unsigned char *buf; /*!< buffer for decoded data */ size_t buflen; /*!< length of the buffer */ unsigned char *info; /*!< buffer for extra header information */ } mbedtls_pem_context; /** * \brief PEM context setup * * \param ctx context to be initialized */ void mbedtls_pem_init( mbedtls_pem_context *ctx ); /** * \brief Read a buffer for PEM information and store the resulting * data into the specified context buffers. * * \param ctx context to use * \param header header string to seek and expect * \param footer footer string to seek and expect * \param data source data to look in (must be nul-terminated) * \param pwd password for decryption (can be NULL) * \param pwdlen length of password * \param use_len destination for total length used (set after header is * correctly read, so unless you get * MBEDTLS_ERR_PEM_BAD_INPUT_DATA or * MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is * the length to skip) * * \note Attempts to check password correctness by verifying if * the decrypted text starts with an ASN.1 sequence of * appropriate length * * \return 0 on success, or a specific PEM error code */ int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer, const unsigned char *data, const unsigned char *pwd, size_t pwdlen, size_t *use_len ); /** * \brief PEM context memory freeing * * \param ctx context to be freed */ void mbedtls_pem_free( mbedtls_pem_context *ctx ); #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a buffer of PEM information from a DER encoded * buffer. * * \param header header string to write * \param footer footer string to write * \param der_data DER data to write * \param der_len length of the DER data * \param buf buffer to write to * \param buf_len length of output buffer * \param olen total length written / required (if buf_len is not enough) * * \return 0 on success, or a specific PEM or BASE64 error code. On * MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL olen is the required * size. */ int mbedtls_pem_write_buffer( const char *header, const char *footer, const unsigned char *der_data, size_t der_len, unsigned char *buf, size_t buf_len, size_t *olen ); #endif /* MBEDTLS_PEM_WRITE_C */ #ifdef __cplusplus } #endif #endif /* pem.h */ fldigi-4.1.06/src/include/mbedtls/pkcs5.h0000664000175000017500000000670513507401434015036 00000000000000/** * \file pkcs5.h * * \brief PKCS#5 functions * * \author Mathias Olsson */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PKCS5_H #define MBEDTLS_PKCS5_H #include "asn1.h" #include "md.h" #include #include #define MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA -0x2f80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_PKCS5_INVALID_FORMAT -0x2f00 /**< Unexpected ASN.1 data. */ #define MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE -0x2e80 /**< Requested encryption or digest alg not available. */ #define MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH -0x2e00 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_PKCS5_DECRYPT 0 #define MBEDTLS_PKCS5_ENCRYPT 1 #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_ASN1_PARSE_C) /** * \brief PKCS#5 PBES2 function * * \param pbe_params the ASN.1 algorithm parameters * \param mode either MBEDTLS_PKCS5_DECRYPT or MBEDTLS_PKCS5_ENCRYPT * \param pwd password to use when generating key * \param pwdlen length of password * \param data data to process * \param datalen length of data * \param output output buffer * * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. */ int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t datalen, unsigned char *output ); #endif /* MBEDTLS_ASN1_PARSE_C */ /** * \brief PKCS#5 PBKDF2 using HMAC * * \param ctx Generic HMAC context * \param password Password to use when generating key * \param plen Length of password * \param salt Salt to use when generating key * \param slen Length of salt * \param iteration_count Iteration count * \param key_length Length of generated key in bytes * \param output Generated key. Must be at least as big as key_length * * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. */ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password, size_t plen, const unsigned char *salt, size_t slen, unsigned int iteration_count, uint32_t key_length, unsigned char *output ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_pkcs5_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* pkcs5.h */ fldigi-4.1.06/src/include/mbedtls/x509_csr.h0000664000175000017500000002370613507401434015365 00000000000000/** * \file x509_csr.h * * \brief X.509 certificate signing request parsing and writing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_CSR_H #define MBEDTLS_X509_CSR_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "x509.h" #ifdef __cplusplus extern "C" { #endif /** * \addtogroup x509_module * \{ */ /** * \name Structures and functions for X.509 Certificate Signing Requests (CSR) * \{ */ /** * Certificate Signing Request (CSR) structure. */ typedef struct mbedtls_x509_csr { mbedtls_x509_buf raw; /**< The raw CSR data (DER). */ mbedtls_x509_buf cri; /**< The raw CertificateRequestInfo body (DER). */ int version; /**< CSR version (1=v1). */ mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). */ mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ mbedtls_pk_context pk; /**< Container for the public key context. */ mbedtls_x509_buf sig_oid; mbedtls_x509_buf sig; mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ } mbedtls_x509_csr; /** * Container for writing a CSR */ typedef struct mbedtls_x509write_csr { mbedtls_pk_context *key; mbedtls_asn1_named_data *subject; mbedtls_md_type_t md_alg; mbedtls_asn1_named_data *extensions; } mbedtls_x509write_csr; #if defined(MBEDTLS_X509_CSR_PARSE_C) /** * \brief Load a Certificate Signing Request (CSR) in DER format * * \note CSR attributes (if any) are currently silently ignored. * * \param csr CSR context to fill * \param buf buffer holding the CRL data * \param buflen size of the buffer * * \return 0 if successful, or a specific X509 error code */ int mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ); /** * \brief Load a Certificate Signing Request (CSR), DER or PEM format * * \note See notes for \c mbedtls_x509_csr_parse_der() * * \param csr CSR context to fill * \param buf buffer holding the CRL data * \param buflen size of the buffer * (including the terminating null byte for PEM data) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ); #if defined(MBEDTLS_FS_IO) /** * \brief Load a Certificate Signing Request (CSR) * * \note See notes for \c mbedtls_x509_csr_parse() * * \param csr CSR context to fill * \param path filename to read the CSR from * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief Returns an informational string about the * CSR. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param csr The X509 CSR to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_csr *csr ); /** * \brief Initialize a CSR * * \param csr CSR to initialize */ void mbedtls_x509_csr_init( mbedtls_x509_csr *csr ); /** * \brief Unallocate all CSR data * * \param csr CSR to free */ void mbedtls_x509_csr_free( mbedtls_x509_csr *csr ); #endif /* MBEDTLS_X509_CSR_PARSE_C */ /* \} name */ /* \} addtogroup x509_module */ #if defined(MBEDTLS_X509_CSR_WRITE_C) /** * \brief Initialize a CSR context * * \param ctx CSR context to initialize */ void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx ); /** * \brief Set the subject name for a CSR * Subject names should contain a comma-separated list * of OID types and values: * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" * * \param ctx CSR context to use * \param subject_name subject name to set * * \return 0 if subject name was parsed successfully, or * a specific error code */ int mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx, const char *subject_name ); /** * \brief Set the key for a CSR (public key will be included, * private key used to sign the CSR when writing it) * * \param ctx CSR context to use * \param key Asymetric key to include */ void mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key ); /** * \brief Set the MD algorithm to use for the signature * (e.g. MBEDTLS_MD_SHA1) * * \param ctx CSR context to use * \param md_alg MD algorithm to use */ void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg ); /** * \brief Set the Key Usage Extension flags * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) * * \param ctx CSR context to use * \param key_usage key usage flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ); /** * \brief Set the Netscape Cert Type flags * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) * * \param ctx CSR context to use * \param ns_cert_type Netscape Cert Type flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx, unsigned char ns_cert_type ); /** * \brief Generic function to add to or replace an extension in the * CSR * * \param ctx CSR context to use * \param oid OID of the extension * \param oid_len length of the OID * \param val value of the extension OCTET STRING * \param val_len length of the value data * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ); /** * \brief Free the contents of a CSR context * * \param ctx CSR context to free */ void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx ); /** * \brief Write a CSR (Certificate Signing Request) to a * DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx CSR to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return length of data written if successful, or a specific * error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a CSR (Certificate Signing Request) to a * PEM string * * \param ctx CSR to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return 0 if successful, or a specific error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CSR_WRITE_C */ #ifdef __cplusplus } #endif #endif /* mbedtls_x509_csr.h */ fldigi-4.1.06/src/include/mbedtls/x509.h0000664000175000017500000003626313507401434014520 00000000000000/** * \file x509.h * * \brief X.509 generic defines and structures */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_H #define MBEDTLS_X509_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "asn1.h" #include "pk.h" #if defined(MBEDTLS_RSA_C) #include "rsa.h" #endif /** * \addtogroup x509_module * \{ */ #if !defined(MBEDTLS_X509_MAX_INTERMEDIATE_CA) /** * Maximum number of intermediate CAs in a verification chain. * That is, maximum length of the chain, excluding the end-entity certificate * and the trusted root certificate. * * Set this to a low value to prevent an adversary from making you waste * resources verifying an overlong certificate chain. */ #define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 #endif /** * \name X509 Error codes * \{ */ #define MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -0x2080 /**< Unavailable feature, e.g. RSA hashing/encryption combination. */ #define MBEDTLS_ERR_X509_UNKNOWN_OID -0x2100 /**< Requested OID is unknown. */ #define MBEDTLS_ERR_X509_INVALID_FORMAT -0x2180 /**< The CRT/CRL/CSR format is invalid, e.g. different type expected. */ #define MBEDTLS_ERR_X509_INVALID_VERSION -0x2200 /**< The CRT/CRL/CSR version element is invalid. */ #define MBEDTLS_ERR_X509_INVALID_SERIAL -0x2280 /**< The serial tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_ALG -0x2300 /**< The algorithm tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_NAME -0x2380 /**< The name tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_DATE -0x2400 /**< The date tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_SIGNATURE -0x2480 /**< The signature tag or value invalid. */ #define MBEDTLS_ERR_X509_INVALID_EXTENSIONS -0x2500 /**< The extension tag or value is invalid. */ #define MBEDTLS_ERR_X509_UNKNOWN_VERSION -0x2580 /**< CRT/CRL/CSR has an unsupported version number. */ #define MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -0x2600 /**< Signature algorithm (oid) is unsupported. */ #define MBEDTLS_ERR_X509_SIG_MISMATCH -0x2680 /**< Signature algorithms do not match. (see \c ::mbedtls_x509_crt sig_oid) */ #define MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -0x2700 /**< Certificate verification failed, e.g. CRL, CA or signature check failed. */ #define MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -0x2780 /**< Format not recognized as DER or PEM. */ #define MBEDTLS_ERR_X509_BAD_INPUT_DATA -0x2800 /**< Input invalid. */ #define MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880 /**< Allocation of memory failed. */ #define MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900 /**< Read/write of file failed. */ #define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980 /**< Destination buffer is too small. */ #define MBEDTLS_ERR_X509_FATAL_ERROR -0x3000 /**< A fatal error occured, eg the chain is too long or the vrfy callback failed. */ /* \} name */ /** * \name X509 Verify codes * \{ */ /* Reminder: update x509_crt_verify_strings[] in library/x509_crt.c */ #define MBEDTLS_X509_BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ #define MBEDTLS_X509_BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ #define MBEDTLS_X509_BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ #define MBEDTLS_X509_BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ #define MBEDTLS_X509_BADCRL_NOT_TRUSTED 0x10 /**< The CRL is not correctly signed by the trusted CA. */ #define MBEDTLS_X509_BADCRL_EXPIRED 0x20 /**< The CRL is expired. */ #define MBEDTLS_X509_BADCERT_MISSING 0x40 /**< Certificate was missing. */ #define MBEDTLS_X509_BADCERT_SKIP_VERIFY 0x80 /**< Certificate verification was skipped. */ #define MBEDTLS_X509_BADCERT_OTHER 0x0100 /**< Other reason (can be used by verify callback) */ #define MBEDTLS_X509_BADCERT_FUTURE 0x0200 /**< The certificate validity starts in the future. */ #define MBEDTLS_X509_BADCRL_FUTURE 0x0400 /**< The CRL is from the future */ #define MBEDTLS_X509_BADCERT_KEY_USAGE 0x0800 /**< Usage does not match the keyUsage extension. */ #define MBEDTLS_X509_BADCERT_EXT_KEY_USAGE 0x1000 /**< Usage does not match the extendedKeyUsage extension. */ #define MBEDTLS_X509_BADCERT_NS_CERT_TYPE 0x2000 /**< Usage does not match the nsCertType extension. */ #define MBEDTLS_X509_BADCERT_BAD_MD 0x4000 /**< The certificate is signed with an unacceptable hash. */ #define MBEDTLS_X509_BADCERT_BAD_PK 0x8000 /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ #define MBEDTLS_X509_BADCERT_BAD_KEY 0x010000 /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */ #define MBEDTLS_X509_BADCRL_BAD_MD 0x020000 /**< The CRL is signed with an unacceptable hash. */ #define MBEDTLS_X509_BADCRL_BAD_PK 0x040000 /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ #define MBEDTLS_X509_BADCRL_BAD_KEY 0x080000 /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */ /* \} name */ /* \} addtogroup x509_module */ /* * X.509 v3 Key Usage Extension flags * Reminder: update x509_info_key_usage() when adding new flags. */ #define MBEDTLS_X509_KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */ #define MBEDTLS_X509_KU_NON_REPUDIATION (0x40) /* bit 1 */ #define MBEDTLS_X509_KU_KEY_ENCIPHERMENT (0x20) /* bit 2 */ #define MBEDTLS_X509_KU_DATA_ENCIPHERMENT (0x10) /* bit 3 */ #define MBEDTLS_X509_KU_KEY_AGREEMENT (0x08) /* bit 4 */ #define MBEDTLS_X509_KU_KEY_CERT_SIGN (0x04) /* bit 5 */ #define MBEDTLS_X509_KU_CRL_SIGN (0x02) /* bit 6 */ #define MBEDTLS_X509_KU_ENCIPHER_ONLY (0x01) /* bit 7 */ #define MBEDTLS_X509_KU_DECIPHER_ONLY (0x8000) /* bit 8 */ /* * Netscape certificate types * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html) */ #define MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT (0x80) /* bit 0 */ #define MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER (0x40) /* bit 1 */ #define MBEDTLS_X509_NS_CERT_TYPE_EMAIL (0x20) /* bit 2 */ #define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING (0x10) /* bit 3 */ #define MBEDTLS_X509_NS_CERT_TYPE_RESERVED (0x08) /* bit 4 */ #define MBEDTLS_X509_NS_CERT_TYPE_SSL_CA (0x04) /* bit 5 */ #define MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA (0x02) /* bit 6 */ #define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01) /* bit 7 */ /* * X.509 extension types * * Comments refer to the status for using certificates. Status can be * different for writing certificates or reading CRLs or CSRs. */ #define MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER (1 << 0) #define MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER (1 << 1) #define MBEDTLS_X509_EXT_KEY_USAGE (1 << 2) #define MBEDTLS_X509_EXT_CERTIFICATE_POLICIES (1 << 3) #define MBEDTLS_X509_EXT_POLICY_MAPPINGS (1 << 4) #define MBEDTLS_X509_EXT_SUBJECT_ALT_NAME (1 << 5) /* Supported (DNS) */ #define MBEDTLS_X509_EXT_ISSUER_ALT_NAME (1 << 6) #define MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS (1 << 7) #define MBEDTLS_X509_EXT_BASIC_CONSTRAINTS (1 << 8) /* Supported */ #define MBEDTLS_X509_EXT_NAME_CONSTRAINTS (1 << 9) #define MBEDTLS_X509_EXT_POLICY_CONSTRAINTS (1 << 10) #define MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE (1 << 11) #define MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS (1 << 12) #define MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY (1 << 13) #define MBEDTLS_X509_EXT_FRESHEST_CRL (1 << 14) #define MBEDTLS_X509_EXT_NS_CERT_TYPE (1 << 16) /* * Storage format identifiers * Recognized formats: PEM and DER */ #define MBEDTLS_X509_FORMAT_DER 1 #define MBEDTLS_X509_FORMAT_PEM 2 #define MBEDTLS_X509_MAX_DN_NAME_SIZE 256 /**< Maximum value size of a DN entry */ #ifdef __cplusplus extern "C" { #endif /** * \addtogroup x509_module * \{ */ /** * \name Structures for parsing X.509 certificates, CRLs and CSRs * \{ */ /** * Type-length-value structure that allows for ASN1 using DER. */ typedef mbedtls_asn1_buf mbedtls_x509_buf; /** * Container for ASN1 bit strings. */ typedef mbedtls_asn1_bitstring mbedtls_x509_bitstring; /** * Container for ASN1 named information objects. * It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.). */ typedef mbedtls_asn1_named_data mbedtls_x509_name; /** * Container for a sequence of ASN.1 items */ typedef mbedtls_asn1_sequence mbedtls_x509_sequence; /** Container for date and time (precision in seconds). */ typedef struct mbedtls_x509_time { int year, mon, day; /**< Date. */ int hour, min, sec; /**< Time. */ } mbedtls_x509_time; /** \} name Structures for parsing X.509 certificates, CRLs and CSRs */ /** \} addtogroup x509_module */ /** * \brief Store the certificate DN in printable form into buf; * no more than size characters will be written. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param dn The X509 name to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn ); /** * \brief Store the certificate serial in printable form into buf; * no more than size characters will be written. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param serial The X509 serial to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial ); /** * \brief Check a given mbedtls_x509_time against the system time * and tell if it's in the past. * * \note Intended usage is "if( is_past( valid_to ) ) ERROR". * Hence the return value of 1 if on internal errors. * * \param to mbedtls_x509_time to check * * \return 1 if the given time is in the past or an error occured, * 0 otherwise. */ int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ); /** * \brief Check a given mbedtls_x509_time against the system time * and tell if it's in the future. * * \note Intended usage is "if( is_future( valid_from ) ) ERROR". * Hence the return value of 1 if on internal errors. * * \param from mbedtls_x509_time to check * * \return 1 if the given time is in the future or an error occured, * 0 otherwise. */ int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_x509_self_test( int verbose ); /* * Internal module functions. You probably do not want to use these unless you * know you do. */ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ); int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg ); int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg, mbedtls_x509_buf *params ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params, mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, int *salt_len ); #endif int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig ); int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, void **sig_opts ); int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end, mbedtls_x509_time *t ); int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *serial ); int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext, int tag ); int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid, mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, const void *sig_opts ); int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name ); int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name ); int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ); int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ); int mbedtls_x509_write_names( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ); int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, unsigned char *sig, size_t size ); #define MBEDTLS_X509_SAFE_SNPRINTF \ do { \ if( ret < 0 || (size_t) ret >= n ) \ return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ); \ \ n -= (size_t) ret; \ p += (size_t) ret; \ } while( 0 ) #ifdef __cplusplus } #endif #endif /* x509.h */ fldigi-4.1.06/src/include/mbedtls/ssl_cookie.h0000664000175000017500000000641413507401434016140 00000000000000/** * \file ssl_cookie.h * * \brief DTLS cookie callbacks implementation */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_COOKIE_H #define MBEDTLS_SSL_COOKIE_H #include "ssl.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #ifndef MBEDTLS_SSL_COOKIE_TIMEOUT #define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ #endif /* \} name SECTION: Module settings */ #ifdef __cplusplus extern "C" { #endif /** * \brief Context for the default cookie functions. */ typedef struct mbedtls_ssl_cookie_ctx { mbedtls_md_context_t hmac_ctx; /*!< context for the HMAC portion */ #if !defined(MBEDTLS_HAVE_TIME) unsigned long serial; /*!< serial number for expiration */ #endif unsigned long timeout; /*!< timeout delay, in seconds if HAVE_TIME, or in number of tickets issued */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_ssl_cookie_ctx; /** * \brief Initialize cookie context */ void mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx ); /** * \brief Setup cookie context (generate keys) */ int mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Set expiration delay for cookies * (Default MBEDTLS_SSL_COOKIE_TIMEOUT) * * \param ctx Cookie contex * \param delay Delay, in seconds if HAVE_TIME, or in number of cookies * issued in the meantime. * 0 to disable expiration (NOT recommended) */ void mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay ); /** * \brief Free cookie context */ void mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx ); /** * \brief Generate cookie, see \c mbedtls_ssl_cookie_write_t */ mbedtls_ssl_cookie_write_t mbedtls_ssl_cookie_write; /** * \brief Verify cookie, see \c mbedtls_ssl_cookie_write_t */ mbedtls_ssl_cookie_check_t mbedtls_ssl_cookie_check; #ifdef __cplusplus } #endif #endif /* ssl_cookie.h */ fldigi-4.1.06/src/include/mbedtls/poly1305.h0000664000175000017500000001607013507401434015301 00000000000000/** * \file poly1305.h * * \brief This file contains Poly1305 definitions and functions. * * Poly1305 is a one-time message authenticator that can be used to * authenticate messages. Poly1305-AES was created by Daniel * Bernstein https://cr.yp.to/mac/poly1305-20050329.pdf The generic * Poly1305 algorithm (not tied to AES) was also standardized in RFC * 7539. * * \author Daniel King */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_POLY1305_H #define MBEDTLS_POLY1305_H #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA -0x0057 /**< Invalid input parameter(s). */ /* MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE is deprecated and should not be * used. */ #define MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE -0x0059 /**< Feature not available. For example, s part of the API is not implemented. */ /* MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED -0x005B /**< Poly1305 hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_POLY1305_ALT) typedef struct mbedtls_poly1305_context { uint32_t r[4]; /** The value for 'r' (low 128 bits of the key). */ uint32_t s[4]; /** The value for 's' (high 128 bits of the key). */ uint32_t acc[5]; /** The accumulator number. */ uint8_t queue[16]; /** The current partial block of data. */ size_t queue_len; /** The number of bytes stored in 'queue'. */ } mbedtls_poly1305_context; #else /* MBEDTLS_POLY1305_ALT */ #include "poly1305_alt.h" #endif /* MBEDTLS_POLY1305_ALT */ /** * \brief This function initializes the specified Poly1305 context. * * It must be the first API called before using * the context. * * It is usually followed by a call to * \c mbedtls_poly1305_starts(), then one or more calls to * \c mbedtls_poly1305_update(), then one call to * \c mbedtls_poly1305_finish(), then finally * \c mbedtls_poly1305_free(). * * \param ctx The Poly1305 context to initialize. This must * not be \c NULL. */ void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx ); /** * \brief This function releases and clears the specified * Poly1305 context. * * \param ctx The Poly1305 context to clear. This may be \c NULL, in which * case this function is a no-op. If it is not \c NULL, it must * point to an initialized Poly1305 context. */ void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx ); /** * \brief This function sets the one-time authentication key. * * \warning The key must be unique and unpredictable for each * invocation of Poly1305. * * \param ctx The Poly1305 context to which the key should be bound. * This must be initialized. * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx, const unsigned char key[32] ); /** * \brief This functions feeds an input buffer into an ongoing * Poly1305 computation. * * It is called between \c mbedtls_cipher_poly1305_starts() and * \c mbedtls_cipher_poly1305_finish(). * It can be called repeatedly to process a stream of data. * * \param ctx The Poly1305 context to use for the Poly1305 operation. * This must be initialized and bound to a key. * \param ilen The length of the input data in Bytes. * Any value is accepted. * \param input The buffer holding the input data. * This pointer can be \c NULL if `ilen == 0`. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function generates the Poly1305 Message * Authentication Code (MAC). * * \param ctx The Poly1305 context to use for the Poly1305 operation. * This must be initialized and bound to a key. * \param mac The buffer to where the MAC is written. This must * be a writable buffer of length \c 16 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx, unsigned char mac[16] ); /** * \brief This function calculates the Poly1305 MAC of the input * buffer with the provided key. * * \warning The key must be unique and unpredictable for each * invocation of Poly1305. * * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key. * \param ilen The length of the input data in Bytes. * Any value is accepted. * \param input The buffer holding the input data. * This pointer can be \c NULL if `ilen == 0`. * \param mac The buffer to where the MAC is written. This must be * a writable buffer of length \c 16 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_mac( const unsigned char key[32], const unsigned char *input, size_t ilen, unsigned char mac[16] ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The Poly1305 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_poly1305_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_POLY1305_H */ fldigi-4.1.06/src/include/mbedtls/havege.h0000664000175000017500000000366013507401434015245 00000000000000/** * \file havege.h * * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_HAVEGE_H #define MBEDTLS_HAVEGE_H #include #define MBEDTLS_HAVEGE_COLLECT_SIZE 1024 #ifdef __cplusplus extern "C" { #endif /** * \brief HAVEGE state structure */ typedef struct mbedtls_havege_state { int PT1, PT2, offset[2]; int pool[MBEDTLS_HAVEGE_COLLECT_SIZE]; int WALK[8192]; } mbedtls_havege_state; /** * \brief HAVEGE initialization * * \param hs HAVEGE state to be initialized */ void mbedtls_havege_init( mbedtls_havege_state *hs ); /** * \brief Clear HAVEGE state * * \param hs HAVEGE state to be cleared */ void mbedtls_havege_free( mbedtls_havege_state *hs ); /** * \brief HAVEGE rand function * * \param p_rng A HAVEGE state * \param output Buffer to fill * \param len Length of buffer * * \return 0 */ int mbedtls_havege_random( void *p_rng, unsigned char *output, size_t len ); #ifdef __cplusplus } #endif #endif /* havege.h */ fldigi-4.1.06/src/include/mbedtls/pkcs12.h0000664000175000017500000001220613507401434015105 00000000000000/** * \file pkcs12.h * * \brief PKCS#12 Personal Information Exchange Syntax */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PKCS12_H #define MBEDTLS_PKCS12_H #include "md.h" #include "cipher.h" #include "asn1.h" #include #define MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA -0x1F80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE -0x1F00 /**< Feature not available, e.g. unsupported encryption scheme. */ #define MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT -0x1E80 /**< PBE ASN.1 data not as expected. */ #define MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH -0x1E00 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_PKCS12_DERIVE_KEY 1 /**< encryption/decryption key */ #define MBEDTLS_PKCS12_DERIVE_IV 2 /**< initialization vector */ #define MBEDTLS_PKCS12_DERIVE_MAC_KEY 3 /**< integrity / MAC key */ #define MBEDTLS_PKCS12_PBE_DECRYPT 0 #define MBEDTLS_PKCS12_PBE_ENCRYPT 1 #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_ASN1_PARSE_C) /** * \brief PKCS12 Password Based function (encryption / decryption) * for pbeWithSHAAnd128BitRC4 * * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT * \param pwd the password used (may be NULL if no password is used) * \param pwdlen length of the password (may be 0) * \param input the input data * \param len data length * \param output the output buffer * * \return 0 if successful, or a MBEDTLS_ERR_XXX code */ int mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *input, size_t len, unsigned char *output ); /** * \brief PKCS12 Password Based function (encryption / decryption) * for cipher-based and mbedtls_md-based PBE's * * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT * \param cipher_type the cipher used * \param md_type the mbedtls_md used * \param pwd the password used (may be NULL if no password is used) * \param pwdlen length of the password (may be 0) * \param input the input data * \param len data length * \param output the output buffer * * \return 0 if successful, or a MBEDTLS_ERR_XXX code */ int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode, mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, const unsigned char *pwd, size_t pwdlen, const unsigned char *input, size_t len, unsigned char *output ); #endif /* MBEDTLS_ASN1_PARSE_C */ /** * \brief The PKCS#12 derivation function uses a password and a salt * to produce pseudo-random bits for a particular "purpose". * * Depending on the given id, this function can produce an * encryption/decryption key, an nitialization vector or an * integrity key. * * \param data buffer to store the derived data in * \param datalen length to fill * \param pwd password to use (may be NULL if no password is used) * \param pwdlen length of the password (may be 0) * \param salt salt buffer to use * \param saltlen length of the salt * \param mbedtls_md mbedtls_md type to use during the derivation * \param id id that describes the purpose (can be MBEDTLS_PKCS12_DERIVE_KEY, * MBEDTLS_PKCS12_DERIVE_IV or MBEDTLS_PKCS12_DERIVE_MAC_KEY) * \param iterations number of iterations * * \return 0 if successful, or a MD, BIGNUM type error. */ int mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen, const unsigned char *pwd, size_t pwdlen, const unsigned char *salt, size_t saltlen, mbedtls_md_type_t mbedtls_md, int id, int iterations ); #ifdef __cplusplus } #endif #endif /* pkcs12.h */ fldigi-4.1.06/src/include/mbedtls/version.h0000664000175000017500000000674413507401434015501 00000000000000/** * \file version.h * * \brief Run-time version information */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * This set of compile-time defines and run-time variables can be used to * determine the version number of the mbed TLS library used. */ #ifndef MBEDTLS_VERSION_H #define MBEDTLS_VERSION_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif /** * The version number x.y.z is split into three parts. * Major, Minor, Patchlevel */ #define MBEDTLS_VERSION_MAJOR 2 #define MBEDTLS_VERSION_MINOR 16 #define MBEDTLS_VERSION_PATCH 0 /** * The single version number has the following structure: * MMNNPP00 * Major version | Minor version | Patch version */ #define MBEDTLS_VERSION_NUMBER 0x02100000 #define MBEDTLS_VERSION_STRING "2.16.0" #define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.0" #if defined(MBEDTLS_VERSION_C) #ifdef __cplusplus extern "C" { #endif /** * Get the version number. * * \return The constructed version number in the format * MMNNPP00 (Major, Minor, Patch). */ unsigned int mbedtls_version_get_number( void ); /** * Get the version string ("x.y.z"). * * \param string The string that will receive the value. * (Should be at least 9 bytes in size) */ void mbedtls_version_get_string( char *string ); /** * Get the full version string ("mbed TLS x.y.z"). * * \param string The string that will receive the value. The mbed TLS version * string will use 18 bytes AT MOST including a terminating * null byte. * (So the buffer should be at least 18 bytes to receive this * version string). */ void mbedtls_version_get_string_full( char *string ); /** * \brief Check if support for a feature was compiled into this * mbed TLS binary. This allows you to see at runtime if the * library was for instance compiled with or without * Multi-threading support. * * \note only checks against defines in the sections "System * support", "mbed TLS modules" and "mbed TLS feature * support" in config.h * * \param feature The string for the define to check (e.g. "MBEDTLS_AES_C") * * \return 0 if the feature is present, * -1 if the feature is not present and * -2 if support for feature checking as a whole was not * compiled in. */ int mbedtls_version_check_feature( const char *feature ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_VERSION_C */ #endif /* version.h */ fldigi-4.1.06/src/include/mbedtls/ssl.h0000664000175000017500000045071013507401434014611 00000000000000/** * \file ssl.h * * \brief SSL/TLS functions. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_H #define MBEDTLS_SSL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" #include "ecp.h" #include "ssl_ciphersuites.h" #if defined(MBEDTLS_X509_CRT_PARSE_C) #include "x509_crt.h" #include "x509_crl.h" #endif #if defined(MBEDTLS_DHM_C) #include "dhm.h" #endif #if defined(MBEDTLS_ECDH_C) #include "ecdh.h" #endif #if defined(MBEDTLS_ZLIB_SUPPORT) #if defined(MBEDTLS_DEPRECATED_WARNING) #warning "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and will be removed in the next major revision of the library" #endif #if defined(MBEDTLS_DEPRECATED_REMOVED) #error "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and cannot be used if MBEDTLS_DEPRECATED_REMOVED is set" #endif #include "zlib.h" #endif #if defined(MBEDTLS_HAVE_TIME) #include "platform_time.h" #endif /* * SSL Error codes */ #define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 /**< The requested feature is not available. */ #define MBEDTLS_ERR_SSL_BAD_INPUT_DATA -0x7100 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_SSL_INVALID_MAC -0x7180 /**< Verification of the message MAC failed. */ #define MBEDTLS_ERR_SSL_INVALID_RECORD -0x7200 /**< An invalid SSL record was received. */ #define MBEDTLS_ERR_SSL_CONN_EOF -0x7280 /**< The connection indicated an EOF. */ #define MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -0x7300 /**< An unknown cipher was received. */ #define MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -0x7380 /**< The server has no ciphersuites in common with the client. */ #define MBEDTLS_ERR_SSL_NO_RNG -0x7400 /**< No RNG was provided to the SSL module. */ #define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 /**< No client certification received from the client, but required by the authentication mode. */ #define MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -0x7500 /**< Our own certificate(s) is/are too large to send in an SSL message. */ #define MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -0x7580 /**< The own certificate is not set, but needed by the server. */ #define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 /**< The own private key or pre-shared key is not set, but needed. */ #define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 /**< No CA Chain is set, but required to operate. */ #define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 /**< An unexpected message was received from our peer. */ #define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 /**< A fatal alert message was received from our peer. */ #define MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -0x7800 /**< Verification of our peer failed. */ #define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 /**< The peer notified us that the connection is going to be closed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -0x7900 /**< Processing of the ClientHello handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -0x7980 /**< Processing of the ServerHello handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -0x7A00 /**< Processing of the Certificate handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -0x7A80 /**< Processing of the CertificateRequest handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -0x7B00 /**< Processing of the ServerKeyExchange handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0x7B80 /**< Processing of the ServerHelloDone handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0x7C00 /**< Processing of the ClientKeyExchange handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -0x7C80 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -0x7D00 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret. */ #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0x7D80 /**< Processing of the CertificateVerify handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0x7E00 /**< Processing of the ChangeCipherSpec handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_FINISHED -0x7E80 /**< Processing of the Finished handshake message failed. */ #define MBEDTLS_ERR_SSL_ALLOC_FAILED -0x7F00 /**< Memory allocation failed */ #define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -0x7F80 /**< Hardware acceleration function returned with error */ #define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 /**< Hardware acceleration function skipped / left alone data */ #define MBEDTLS_ERR_SSL_COMPRESSION_FAILED -0x6F00 /**< Processing of the compression / decompression failed */ #define MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 /**< Handshake protocol not within min/max boundaries */ #define MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -0x6E00 /**< Processing of the NewSessionTicket handshake message failed. */ #define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 /**< Session ticket has expired. */ #define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -0x6D00 /**< Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */ #define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -0x6C80 /**< Unknown identity received (eg, PSK identity) */ #define MBEDTLS_ERR_SSL_INTERNAL_ERROR -0x6C00 /**< Internal error (eg, unexpected failure in lower-level module) */ #define MBEDTLS_ERR_SSL_COUNTER_WRAPPING -0x6B80 /**< A counter would wrap (eg, too many messages exchanged). */ #define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -0x6B00 /**< Unexpected message at ServerHello in renegotiation. */ #define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -0x6A80 /**< DTLS client must retry for hello verification */ #define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -0x6A00 /**< A buffer is too small to receive or write a message */ #define MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -0x6980 /**< None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages). */ #define MBEDTLS_ERR_SSL_WANT_READ -0x6900 /**< No data of requested type currently available on underlying transport. */ #define MBEDTLS_ERR_SSL_WANT_WRITE -0x6880 /**< Connection requires a write call. */ #define MBEDTLS_ERR_SSL_TIMEOUT -0x6800 /**< The operation timed out. */ #define MBEDTLS_ERR_SSL_CLIENT_RECONNECT -0x6780 /**< The client initiated a reconnect from the same port. */ #define MBEDTLS_ERR_SSL_UNEXPECTED_RECORD -0x6700 /**< Record header looks valid but is not expected. */ #define MBEDTLS_ERR_SSL_NON_FATAL -0x6680 /**< The alert message received indicates a non-fatal error. */ #define MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH -0x6600 /**< Couldn't set the hash for verifying CertificateVerify */ #define MBEDTLS_ERR_SSL_CONTINUE_PROCESSING -0x6580 /**< Internal-only message signaling that further message-processing should be done */ #define MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS -0x6500 /**< The asynchronous operation is not completed yet. */ #define MBEDTLS_ERR_SSL_EARLY_MESSAGE -0x6480 /**< Internal-only message signaling that a message arrived early. */ #define MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS -0x7000 /**< A cryptographic operation is in progress. Try again later. */ /* * Various constants */ #define MBEDTLS_SSL_MAJOR_VERSION_3 3 #define MBEDTLS_SSL_MINOR_VERSION_0 0 /*!< SSL v3.0 */ #define MBEDTLS_SSL_MINOR_VERSION_1 1 /*!< TLS v1.0 */ #define MBEDTLS_SSL_MINOR_VERSION_2 2 /*!< TLS v1.1 */ #define MBEDTLS_SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ #define MBEDTLS_SSL_TRANSPORT_STREAM 0 /*!< TLS */ #define MBEDTLS_SSL_TRANSPORT_DATAGRAM 1 /*!< DTLS */ #define MBEDTLS_SSL_MAX_HOST_NAME_LEN 255 /*!< Maximum host name defined in RFC 1035 */ /* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c * NONE must be zero so that memset()ing structure to zero works */ #define MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /*!< don't use this extension */ #define MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /*!< MaxFragmentLength 2^9 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /*!< MaxFragmentLength 2^10 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /*!< MaxFragmentLength 2^11 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /*!< MaxFragmentLength 2^12 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID 5 /*!< first invalid value */ #define MBEDTLS_SSL_IS_CLIENT 0 #define MBEDTLS_SSL_IS_SERVER 1 #define MBEDTLS_SSL_IS_NOT_FALLBACK 0 #define MBEDTLS_SSL_IS_FALLBACK 1 #define MBEDTLS_SSL_EXTENDED_MS_DISABLED 0 #define MBEDTLS_SSL_EXTENDED_MS_ENABLED 1 #define MBEDTLS_SSL_ETM_DISABLED 0 #define MBEDTLS_SSL_ETM_ENABLED 1 #define MBEDTLS_SSL_COMPRESS_NULL 0 #define MBEDTLS_SSL_COMPRESS_DEFLATE 1 #define MBEDTLS_SSL_VERIFY_NONE 0 #define MBEDTLS_SSL_VERIFY_OPTIONAL 1 #define MBEDTLS_SSL_VERIFY_REQUIRED 2 #define MBEDTLS_SSL_VERIFY_UNSET 3 /* Used only for sni_authmode */ #define MBEDTLS_SSL_LEGACY_RENEGOTIATION 0 #define MBEDTLS_SSL_SECURE_RENEGOTIATION 1 #define MBEDTLS_SSL_RENEGOTIATION_DISABLED 0 #define MBEDTLS_SSL_RENEGOTIATION_ENABLED 1 #define MBEDTLS_SSL_ANTI_REPLAY_DISABLED 0 #define MBEDTLS_SSL_ANTI_REPLAY_ENABLED 1 #define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -1 #define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT 16 #define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION 0 #define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION 1 #define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE 2 #define MBEDTLS_SSL_TRUNC_HMAC_DISABLED 0 #define MBEDTLS_SSL_TRUNC_HMAC_ENABLED 1 #define MBEDTLS_SSL_TRUNCATED_HMAC_LEN 10 /* 80 bits, rfc 6066 section 7 */ #define MBEDTLS_SSL_SESSION_TICKETS_DISABLED 0 #define MBEDTLS_SSL_SESSION_TICKETS_ENABLED 1 #define MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED 0 #define MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED 1 #define MBEDTLS_SSL_ARC4_ENABLED 0 #define MBEDTLS_SSL_ARC4_DISABLED 1 #define MBEDTLS_SSL_PRESET_DEFAULT 0 #define MBEDTLS_SSL_PRESET_SUITEB 2 #define MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED 1 #define MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED 0 /* * Default range for DTLS retransmission timer value, in milliseconds. * RFC 6347 4.2.4.1 says from 1 second to 60 seconds. */ #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN 1000 #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX 60000 /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME) #define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ #endif /* * Maximum fragment length in bytes, * determines the size of each of the two internal I/O buffers. * * Note: the RFC defines the default size of SSL / TLS messages. If you * change the value here, other clients / servers may not be able to * communicate with you anymore. Only change this value if you control * both sides of the connection and have it reduced at both sides, or * if you're using the Max Fragment Length extension and you know all your * peers are using it too! */ #if !defined(MBEDTLS_SSL_MAX_CONTENT_LEN) #define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ #endif #if !defined(MBEDTLS_SSL_IN_CONTENT_LEN) #define MBEDTLS_SSL_IN_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN #endif #if !defined(MBEDTLS_SSL_OUT_CONTENT_LEN) #define MBEDTLS_SSL_OUT_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN #endif /* * Maximum number of heap-allocated bytes for the purpose of * DTLS handshake message reassembly and future message buffering. */ #if !defined(MBEDTLS_SSL_DTLS_MAX_BUFFERING) #define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 #endif /* \} name SECTION: Module settings */ /* * Length of the verify data for secure renegotiation */ #if defined(MBEDTLS_SSL_PROTO_SSL3) #define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 36 #else #define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12 #endif /* * Signaling ciphersuite values (SCSV) */ #define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ #define MBEDTLS_SSL_FALLBACK_SCSV_VALUE 0x5600 /**< RFC 7507 section 2 */ /* * Supported Signature and Hash algorithms (For TLS 1.2) * RFC 5246 section 7.4.1.4.1 */ #define MBEDTLS_SSL_HASH_NONE 0 #define MBEDTLS_SSL_HASH_MD5 1 #define MBEDTLS_SSL_HASH_SHA1 2 #define MBEDTLS_SSL_HASH_SHA224 3 #define MBEDTLS_SSL_HASH_SHA256 4 #define MBEDTLS_SSL_HASH_SHA384 5 #define MBEDTLS_SSL_HASH_SHA512 6 #define MBEDTLS_SSL_SIG_ANON 0 #define MBEDTLS_SSL_SIG_RSA 1 #define MBEDTLS_SSL_SIG_ECDSA 3 /* * Client Certificate Types * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5 */ #define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN 1 #define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN 64 /* * Message, alert and handshake types */ #define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC 20 #define MBEDTLS_SSL_MSG_ALERT 21 #define MBEDTLS_SSL_MSG_HANDSHAKE 22 #define MBEDTLS_SSL_MSG_APPLICATION_DATA 23 #define MBEDTLS_SSL_ALERT_LEVEL_WARNING 1 #define MBEDTLS_SSL_ALERT_LEVEL_FATAL 2 #define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ #define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ #define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ #define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ #define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ #define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ #define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ #define MBEDTLS_SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ #define MBEDTLS_SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ #define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ #define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ #define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ #define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ #define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ #define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ #define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ #define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ #define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ #define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ #define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ #define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86 /* 0x56 */ #define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ #define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ #define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115 /* 0x73 */ #define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */ #define MBEDTLS_SSL_HS_HELLO_REQUEST 0 #define MBEDTLS_SSL_HS_CLIENT_HELLO 1 #define MBEDTLS_SSL_HS_SERVER_HELLO 2 #define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST 3 #define MBEDTLS_SSL_HS_NEW_SESSION_TICKET 4 #define MBEDTLS_SSL_HS_CERTIFICATE 11 #define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE 12 #define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST 13 #define MBEDTLS_SSL_HS_SERVER_HELLO_DONE 14 #define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY 15 #define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE 16 #define MBEDTLS_SSL_HS_FINISHED 20 /* * TLS extensions */ #define MBEDTLS_TLS_EXT_SERVERNAME 0 #define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME 0 #define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH 1 #define MBEDTLS_TLS_EXT_TRUNCATED_HMAC 4 #define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES 10 #define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS 11 #define MBEDTLS_TLS_EXT_SIG_ALG 13 #define MBEDTLS_TLS_EXT_ALPN 16 #define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC 22 /* 0x16 */ #define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET 0x0017 /* 23 */ #define MBEDTLS_TLS_EXT_SESSION_TICKET 35 #define MBEDTLS_TLS_EXT_ECJPAKE_KKPP 256 /* experimental */ #define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01 /* * Size defines */ #if !defined(MBEDTLS_PSK_MAX_LEN) #define MBEDTLS_PSK_MAX_LEN 32 /* 256 bits */ #endif /* Dummy type used only for its size */ union mbedtls_ssl_premaster_secret { #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) unsigned char _pms_rsa[48]; /* RFC 5246 8.1.1 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE]; /* RFC 5246 8.1.2 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 3 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 4 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES + MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) unsigned char _pms_ecjpake[32]; /* Thread spec: SHA-256 output */ #endif }; #define MBEDTLS_PREMASTER_SIZE sizeof( union mbedtls_ssl_premaster_secret ) #ifdef __cplusplus extern "C" { #endif /* * SSL state machine */ typedef enum { MBEDTLS_SSL_HELLO_REQUEST, MBEDTLS_SSL_CLIENT_HELLO, MBEDTLS_SSL_SERVER_HELLO, MBEDTLS_SSL_SERVER_CERTIFICATE, MBEDTLS_SSL_SERVER_KEY_EXCHANGE, MBEDTLS_SSL_CERTIFICATE_REQUEST, MBEDTLS_SSL_SERVER_HELLO_DONE, MBEDTLS_SSL_CLIENT_CERTIFICATE, MBEDTLS_SSL_CLIENT_KEY_EXCHANGE, MBEDTLS_SSL_CERTIFICATE_VERIFY, MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC, MBEDTLS_SSL_CLIENT_FINISHED, MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC, MBEDTLS_SSL_SERVER_FINISHED, MBEDTLS_SSL_FLUSH_BUFFERS, MBEDTLS_SSL_HANDSHAKE_WRAPUP, MBEDTLS_SSL_HANDSHAKE_OVER, MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET, MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT, } mbedtls_ssl_states; /** * \brief Callback type: send data on the network. * * \note That callback may be either blocking or non-blocking. * * \param ctx Context for the send callback (typically a file descriptor) * \param buf Buffer holding the data to send * \param len Length of the data to send * * \return The callback must return the number of bytes sent if any, * or a non-zero error code. * If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_WRITE * must be returned when the operation would block. * * \note The callback is allowed to send fewer bytes than requested. * It must always return the number of bytes actually sent. */ typedef int mbedtls_ssl_send_t( void *ctx, const unsigned char *buf, size_t len ); /** * \brief Callback type: receive data from the network. * * \note That callback may be either blocking or non-blocking. * * \param ctx Context for the receive callback (typically a file * descriptor) * \param buf Buffer to write the received data to * \param len Length of the receive buffer * * \return The callback must return the number of bytes received, * or a non-zero error code. * If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_READ * must be returned when the operation would block. * * \note The callback may receive fewer bytes than the length of the * buffer. It must always return the number of bytes actually * received and written to the buffer. */ typedef int mbedtls_ssl_recv_t( void *ctx, unsigned char *buf, size_t len ); /** * \brief Callback type: receive data from the network, with timeout * * \note That callback must block until data is received, or the * timeout delay expires, or the operation is interrupted by a * signal. * * \param ctx Context for the receive callback (typically a file descriptor) * \param buf Buffer to write the received data to * \param len Length of the receive buffer * \param timeout Maximum nomber of millisecondes to wait for data * 0 means no timeout (potentially waiting forever) * * \return The callback must return the number of bytes received, * or a non-zero error code: * \c MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, * \c MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. * * \note The callback may receive fewer bytes than the length of the * buffer. It must always return the number of bytes actually * received and written to the buffer. */ typedef int mbedtls_ssl_recv_timeout_t( void *ctx, unsigned char *buf, size_t len, uint32_t timeout ); /** * \brief Callback type: set a pair of timers/delays to watch * * \param ctx Context pointer * \param int_ms Intermediate delay in milliseconds * \param fin_ms Final delay in milliseconds * 0 cancels the current timer. * * \note This callback must at least store the necessary information * for the associated \c mbedtls_ssl_get_timer_t callback to * return correct information. * * \note If using a event-driven style of programming, an event must * be generated when the final delay is passed. The event must * cause a call to \c mbedtls_ssl_handshake() with the proper * SSL context to be scheduled. Care must be taken to ensure * that at most one such call happens at a time. * * \note Only one timer at a time must be running. Calling this * function while a timer is running must cancel it. Cancelled * timers must not generate any event. */ typedef void mbedtls_ssl_set_timer_t( void * ctx, uint32_t int_ms, uint32_t fin_ms ); /** * \brief Callback type: get status of timers/delays * * \param ctx Context pointer * * \return This callback must return: * -1 if cancelled (fin_ms == 0), * 0 if none of the delays have passed, * 1 if only the intermediate delay has passed, * 2 if the final delay has passed. */ typedef int mbedtls_ssl_get_timer_t( void * ctx ); /* Defined below */ typedef struct mbedtls_ssl_session mbedtls_ssl_session; typedef struct mbedtls_ssl_context mbedtls_ssl_context; typedef struct mbedtls_ssl_config mbedtls_ssl_config; /* Defined in ssl_internal.h */ typedef struct mbedtls_ssl_transform mbedtls_ssl_transform; typedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params; typedef struct mbedtls_ssl_sig_hash_set_t mbedtls_ssl_sig_hash_set_t; #if defined(MBEDTLS_X509_CRT_PARSE_C) typedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert; #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) typedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item; #endif #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Callback type: start external signature operation. * * This callback is called during an SSL handshake to start * a signature decryption operation using an * external processor. The parameter \p cert contains * the public key; it is up to the callback function to * determine how to access the associated private key. * * This function typically sends or enqueues a request, and * does not wait for the operation to complete. This allows * the handshake step to be non-blocking. * * The parameters \p ssl and \p cert are guaranteed to remain * valid throughout the handshake. On the other hand, this * function must save the contents of \p hash if the value * is needed for later processing, because the \p hash buffer * is no longer valid after this function returns. * * This function may call mbedtls_ssl_set_async_operation_data() * to store an operation context for later retrieval * by the resume or cancel callback. * * \note For RSA signatures, this function must produce output * that is consistent with PKCS#1 v1.5 in the same way as * mbedtls_rsa_pkcs1_sign(). Before the private key operation, * apply the padding steps described in RFC 8017, section 9.2 * "EMSA-PKCS1-v1_5" as follows. * - If \p md_alg is #MBEDTLS_MD_NONE, apply the PKCS#1 v1.5 * encoding, treating \p hash as the DigestInfo to be * padded. In other words, apply EMSA-PKCS1-v1_5 starting * from step 3, with `T = hash` and `tLen = hash_len`. * - If `md_alg != MBEDTLS_MD_NONE`, apply the PKCS#1 v1.5 * encoding, treating \p hash as the hash to be encoded and * padded. In other words, apply EMSA-PKCS1-v1_5 starting * from step 2, with `digestAlgorithm` obtained by calling * mbedtls_oid_get_oid_by_md() on \p md_alg. * * \note For ECDSA signatures, the output format is the DER encoding * `Ecdsa-Sig-Value` defined in * [RFC 4492 section 5.4](https://tools.ietf.org/html/rfc4492#section-5.4). * * \param ssl The SSL connection instance. It should not be * modified other than via * mbedtls_ssl_set_async_operation_data(). * \param cert Certificate containing the public key. * In simple cases, this is one of the pointers passed to * mbedtls_ssl_conf_own_cert() when configuring the SSL * connection. However, if other callbacks are used, this * property may not hold. For example, if an SNI callback * is registered with mbedtls_ssl_conf_sni(), then * this callback determines what certificate is used. * \param md_alg Hash algorithm. * \param hash Buffer containing the hash. This buffer is * no longer valid when the function returns. * \param hash_len Size of the \c hash buffer in bytes. * * \return 0 if the operation was started successfully and the SSL * stack should call the resume callback immediately. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation * was started successfully and the SSL stack should return * immediately without calling the resume callback yet. * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external * processor does not support this key. The SSL stack will * use the private key object instead. * \return Any other error indicates a fatal failure and is * propagated up the call chain. The callback should * use \c MBEDTLS_ERR_PK_xxx error codes, and must not * use \c MBEDTLS_ERR_SSL_xxx error codes except as * directed in the documentation of this callback. */ typedef int mbedtls_ssl_async_sign_t( mbedtls_ssl_context *ssl, mbedtls_x509_crt *cert, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len ); /** * \brief Callback type: start external decryption operation. * * This callback is called during an SSL handshake to start * an RSA decryption operation using an * external processor. The parameter \p cert contains * the public key; it is up to the callback function to * determine how to access the associated private key. * * This function typically sends or enqueues a request, and * does not wait for the operation to complete. This allows * the handshake step to be non-blocking. * * The parameters \p ssl and \p cert are guaranteed to remain * valid throughout the handshake. On the other hand, this * function must save the contents of \p input if the value * is needed for later processing, because the \p input buffer * is no longer valid after this function returns. * * This function may call mbedtls_ssl_set_async_operation_data() * to store an operation context for later retrieval * by the resume or cancel callback. * * \warning RSA decryption as used in TLS is subject to a potential * timing side channel attack first discovered by Bleichenbacher * in 1998. This attack can be remotely exploitable * in practice. To avoid this attack, you must ensure that * if the callback performs an RSA decryption, the time it * takes to execute and return the result does not depend * on whether the RSA decryption succeeded or reported * invalid padding. * * \param ssl The SSL connection instance. It should not be * modified other than via * mbedtls_ssl_set_async_operation_data(). * \param cert Certificate containing the public key. * In simple cases, this is one of the pointers passed to * mbedtls_ssl_conf_own_cert() when configuring the SSL * connection. However, if other callbacks are used, this * property may not hold. For example, if an SNI callback * is registered with mbedtls_ssl_conf_sni(), then * this callback determines what certificate is used. * \param input Buffer containing the input ciphertext. This buffer * is no longer valid when the function returns. * \param input_len Size of the \p input buffer in bytes. * * \return 0 if the operation was started successfully and the SSL * stack should call the resume callback immediately. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation * was started successfully and the SSL stack should return * immediately without calling the resume callback yet. * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external * processor does not support this key. The SSL stack will * use the private key object instead. * \return Any other error indicates a fatal failure and is * propagated up the call chain. The callback should * use \c MBEDTLS_ERR_PK_xxx error codes, and must not * use \c MBEDTLS_ERR_SSL_xxx error codes except as * directed in the documentation of this callback. */ typedef int mbedtls_ssl_async_decrypt_t( mbedtls_ssl_context *ssl, mbedtls_x509_crt *cert, const unsigned char *input, size_t input_len ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ /** * \brief Callback type: resume external operation. * * This callback is called during an SSL handshake to resume * an external operation started by the * ::mbedtls_ssl_async_sign_t or * ::mbedtls_ssl_async_decrypt_t callback. * * This function typically checks the status of a pending * request or causes the request queue to make progress, and * does not wait for the operation to complete. This allows * the handshake step to be non-blocking. * * This function may call mbedtls_ssl_get_async_operation_data() * to retrieve an operation context set by the start callback. * It may call mbedtls_ssl_set_async_operation_data() to modify * this context. * * Note that when this function returns a status other than * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, it must free any * resources associated with the operation. * * \param ssl The SSL connection instance. It should not be * modified other than via * mbedtls_ssl_set_async_operation_data(). * \param output Buffer containing the output (signature or decrypted * data) on success. * \param output_len On success, number of bytes written to \p output. * \param output_size Size of the \p output buffer in bytes. * * \return 0 if output of the operation is available in the * \p output buffer. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation * is still in progress. Subsequent requests for progress * on the SSL connection will call the resume callback * again. * \return Any other error means that the operation is aborted. * The SSL handshake is aborted. The callback should * use \c MBEDTLS_ERR_PK_xxx error codes, and must not * use \c MBEDTLS_ERR_SSL_xxx error codes except as * directed in the documentation of this callback. */ typedef int mbedtls_ssl_async_resume_t( mbedtls_ssl_context *ssl, unsigned char *output, size_t *output_len, size_t output_size ); /** * \brief Callback type: cancel external operation. * * This callback is called if an SSL connection is closed * while an asynchronous operation is in progress. Note that * this callback is not called if the * ::mbedtls_ssl_async_resume_t callback has run and has * returned a value other than * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, since in that case * the asynchronous operation has already completed. * * This function may call mbedtls_ssl_get_async_operation_data() * to retrieve an operation context set by the start callback. * * \param ssl The SSL connection instance. It should not be * modified. */ typedef void mbedtls_ssl_async_cancel_t( mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /* * This structure is used for storing current session data. */ struct mbedtls_ssl_session { #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t start; /*!< starting time */ #endif int ciphersuite; /*!< chosen ciphersuite */ int compression; /*!< chosen compression */ size_t id_len; /*!< session id length */ unsigned char id[32]; /*!< session identifier */ unsigned char master[48]; /*!< the master secret */ #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_x509_crt *peer_cert; /*!< peer X.509 cert chain */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ uint32_t verify_result; /*!< verification result */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) unsigned char *ticket; /*!< RFC 5077 session ticket */ size_t ticket_len; /*!< session ticket length */ uint32_t ticket_lifetime; /*!< ticket lifetime hint */ #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) unsigned char mfl_code; /*!< MaxFragmentLength negotiated by peer */ #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) int trunc_hmac; /*!< flag for truncated hmac activation */ #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) int encrypt_then_mac; /*!< flag for EtM activation */ #endif }; /** * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. */ struct mbedtls_ssl_config { /* Group items by size (largest first) to minimize padding overhead */ /* * Pointers */ const int *ciphersuite_list[4]; /*!< allowed ciphersuites per version */ /** Callback for printing debug output */ void (*f_dbg)(void *, int, const char *, int, const char *); void *p_dbg; /*!< context for the debug function */ /** Callback for getting (pseudo-)random numbers */ int (*f_rng)(void *, unsigned char *, size_t); void *p_rng; /*!< context for the RNG function */ /** Callback to retrieve a session from the cache */ int (*f_get_cache)(void *, mbedtls_ssl_session *); /** Callback to store a session into the cache */ int (*f_set_cache)(void *, const mbedtls_ssl_session *); void *p_cache; /*!< context for cache callbacks */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) /** Callback for setting cert according to SNI extension */ int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); void *p_sni; /*!< context for SNI callback */ #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) /** Callback to customize X.509 certificate chain verification */ int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); void *p_vrfy; /*!< context for X.509 verify calllback */ #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) /** Callback to retrieve PSK key from identity */ int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); void *p_psk; /*!< context for PSK callback */ #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) /** Callback to create & write a cookie for ClientHello veirifcation */ int (*f_cookie_write)( void *, unsigned char **, unsigned char *, const unsigned char *, size_t ); /** Callback to verify validity of a ClientHello cookie */ int (*f_cookie_check)( void *, const unsigned char *, size_t, const unsigned char *, size_t ); void *p_cookie; /*!< context for the cookie callbacks */ #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) /** Callback to create & write a session ticket */ int (*f_ticket_write)( void *, const mbedtls_ssl_session *, unsigned char *, const unsigned char *, size_t *, uint32_t * ); /** Callback to parse a session ticket into a session structure */ int (*f_ticket_parse)( void *, mbedtls_ssl_session *, unsigned char *, size_t); void *p_ticket; /*!< context for the ticket callbacks */ #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) /** Callback to export key block and master secret */ int (*f_export_keys)( void *, const unsigned char *, const unsigned char *, size_t, size_t, size_t ); void *p_export_keys; /*!< context for key export callback */ #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */ mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */ mbedtls_x509_crt *ca_chain; /*!< trusted CAs */ mbedtls_x509_crl *ca_crl; /*!< trusted CAs CRLs */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_ssl_async_sign_t *f_async_sign_start; /*!< start asynchronous signature operation */ mbedtls_ssl_async_decrypt_t *f_async_decrypt_start; /*!< start asynchronous decryption operation */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ mbedtls_ssl_async_resume_t *f_async_resume; /*!< resume asynchronous operation */ mbedtls_ssl_async_cancel_t *f_async_cancel; /*!< cancel asynchronous operation */ void *p_async_config_data; /*!< Configuration data set by mbedtls_ssl_conf_async_private_cb(). */ #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) const int *sig_hashes; /*!< allowed signature hashes */ #endif #if defined(MBEDTLS_ECP_C) const mbedtls_ecp_group_id *curve_list; /*!< allowed curves */ #endif #if defined(MBEDTLS_DHM_C) mbedtls_mpi dhm_P; /*!< prime modulus for DHM */ mbedtls_mpi dhm_G; /*!< generator for DHM */ #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) unsigned char *psk; /*!< pre-shared key. This field should only be set via mbedtls_ssl_conf_psk() */ size_t psk_len; /*!< length of the pre-shared key. This field should only be set via mbedtls_ssl_conf_psk() */ unsigned char *psk_identity; /*!< identity for PSK negotiation. This field should only be set via mbedtls_ssl_conf_psk() */ size_t psk_identity_len;/*!< length of identity. This field should only be set via mbedtls_ssl_conf_psk() */ #endif #if defined(MBEDTLS_SSL_ALPN) const char **alpn_list; /*!< ordered list of protocols */ #endif /* * Numerical settings (int then char) */ uint32_t read_timeout; /*!< timeout for mbedtls_ssl_read (ms) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint32_t hs_timeout_min; /*!< initial value of the handshake retransmission timeout (ms) */ uint32_t hs_timeout_max; /*!< maximum value of the handshake retransmission timeout (ms) */ #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) int renego_max_records; /*!< grace period for renegotiation */ unsigned char renego_period[8]; /*!< value of the record counters that triggers renegotiation */ #endif #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) unsigned int badmac_limit; /*!< limit of records with a bad MAC */ #endif #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) unsigned int dhm_min_bitlen; /*!< min. bit length of the DHM prime */ #endif unsigned char max_major_ver; /*!< max. major version used */ unsigned char max_minor_ver; /*!< max. minor version used */ unsigned char min_major_ver; /*!< min. major version used */ unsigned char min_minor_ver; /*!< min. minor version used */ /* * Flags (bitfields) */ unsigned int endpoint : 1; /*!< 0: client, 1: server */ unsigned int transport : 1; /*!< stream (TLS) or datagram (DTLS) */ unsigned int authmode : 2; /*!< MBEDTLS_SSL_VERIFY_XXX */ /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */ unsigned int allow_legacy_renegotiation : 2 ; /*!< MBEDTLS_LEGACY_XXX */ #if defined(MBEDTLS_ARC4_C) unsigned int arc4_disabled : 1; /*!< blacklist RC4 ciphersuites? */ #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) unsigned int mfl_code : 3; /*!< desired fragment length */ #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) unsigned int encrypt_then_mac : 1 ; /*!< negotiate encrypt-then-mac? */ #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) unsigned int extended_ms : 1; /*!< negotiate extended master secret? */ #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) unsigned int anti_replay : 1; /*!< detect and prevent replay? */ #endif #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) unsigned int cbc_record_splitting : 1; /*!< do cbc record splitting */ #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) unsigned int disable_renegotiation : 1; /*!< disable renegotiation? */ #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) unsigned int trunc_hmac : 1; /*!< negotiate truncated hmac? */ #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) unsigned int session_tickets : 1; /*!< use session tickets? */ #endif #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) unsigned int fallback : 1; /*!< is this a fallback? */ #endif #if defined(MBEDTLS_SSL_SRV_C) unsigned int cert_req_ca_list : 1; /*!< enable sending CA list in Certificate Request messages? */ #endif }; struct mbedtls_ssl_context { const mbedtls_ssl_config *conf; /*!< configuration information */ /* * Miscellaneous */ int state; /*!< SSL handshake: current state */ #if defined(MBEDTLS_SSL_RENEGOTIATION) int renego_status; /*!< Initial, in progress, pending? */ int renego_records_seen; /*!< Records since renego request, or with DTLS, number of retransmissions of request if renego_max_records is < 0 */ #endif /* MBEDTLS_SSL_RENEGOTIATION */ int major_ver; /*!< equal to MBEDTLS_SSL_MAJOR_VERSION_3 */ int minor_ver; /*!< either 0 (SSL3) or 1 (TLS1.0) */ #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) unsigned badmac_seen; /*!< records with a bad MAC received */ #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ mbedtls_ssl_send_t *f_send; /*!< Callback for network send */ mbedtls_ssl_recv_t *f_recv; /*!< Callback for network receive */ mbedtls_ssl_recv_timeout_t *f_recv_timeout; /*!< Callback for network receive with timeout */ void *p_bio; /*!< context for I/O operations */ /* * Session layer */ mbedtls_ssl_session *session_in; /*!< current session data (in) */ mbedtls_ssl_session *session_out; /*!< current session data (out) */ mbedtls_ssl_session *session; /*!< negotiated session data */ mbedtls_ssl_session *session_negotiate; /*!< session data in negotiation */ mbedtls_ssl_handshake_params *handshake; /*!< params required only during the handshake process */ /* * Record layer transformations */ mbedtls_ssl_transform *transform_in; /*!< current transform params (in) */ mbedtls_ssl_transform *transform_out; /*!< current transform params (in) */ mbedtls_ssl_transform *transform; /*!< negotiated transform params */ mbedtls_ssl_transform *transform_negotiate; /*!< transform params in negotiation */ /* * Timers */ void *p_timer; /*!< context for the timer callbacks */ mbedtls_ssl_set_timer_t *f_set_timer; /*!< set timer callback */ mbedtls_ssl_get_timer_t *f_get_timer; /*!< get timer callback */ /* * Record layer (incoming data) */ unsigned char *in_buf; /*!< input buffer */ unsigned char *in_ctr; /*!< 64-bit incoming message counter TLS: maintained by us DTLS: read from peer */ unsigned char *in_hdr; /*!< start of record header */ unsigned char *in_len; /*!< two-bytes message length field */ unsigned char *in_iv; /*!< ivlen-byte IV */ unsigned char *in_msg; /*!< message contents (in_iv+ivlen) */ unsigned char *in_offt; /*!< read offset in application data */ int in_msgtype; /*!< record header: message type */ size_t in_msglen; /*!< record header: message length */ size_t in_left; /*!< amount of data read so far */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint16_t in_epoch; /*!< DTLS epoch for incoming records */ size_t next_record_offset; /*!< offset of the next record in datagram (equal to in_left if none) */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) uint64_t in_window_top; /*!< last validated record seq_num */ uint64_t in_window; /*!< bitmask for replay detection */ #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ size_t in_hslen; /*!< current handshake message length, including the handshake header */ int nb_zero; /*!< # of 0-length encrypted messages */ int keep_current_message; /*!< drop or reuse current message on next call to record layer? */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint8_t disable_datagram_packing; /*!< Disable packing multiple records * within a single datagram. */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Record layer (outgoing data) */ unsigned char *out_buf; /*!< output buffer */ unsigned char *out_ctr; /*!< 64-bit outgoing message counter */ unsigned char *out_hdr; /*!< start of record header */ unsigned char *out_len; /*!< two-bytes message length field */ unsigned char *out_iv; /*!< ivlen-byte IV */ unsigned char *out_msg; /*!< message contents (out_iv+ivlen) */ int out_msgtype; /*!< record header: message type */ size_t out_msglen; /*!< record header: message length */ size_t out_left; /*!< amount of data not yet written */ unsigned char cur_out_ctr[8]; /*!< Outgoing record sequence number. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint16_t mtu; /*!< path mtu, used to fragment outgoing messages */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_ZLIB_SUPPORT) unsigned char *compress_buf; /*!< zlib data buffer */ #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) signed char split_done; /*!< current record already splitted? */ #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ /* * PKI layer */ int client_auth; /*!< flag for client auth. */ /* * User settings */ #if defined(MBEDTLS_X509_CRT_PARSE_C) char *hostname; /*!< expected peer CN for verification (and SNI if available) */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_ALPN) const char *alpn_chosen; /*!< negotiated protocol */ #endif /* MBEDTLS_SSL_ALPN */ /* * Information for DTLS hello verify */ #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) unsigned char *cli_id; /*!< transport-level ID of the client */ size_t cli_id_len; /*!< length of cli_id */ #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ /* * Secure renegotiation */ /* needed to know when to send extension on server */ int secure_renegotiation; /*!< does peer support legacy or secure renegotiation */ #if defined(MBEDTLS_SSL_RENEGOTIATION) size_t verify_data_len; /*!< length of verify data stored */ char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ #endif /* MBEDTLS_SSL_RENEGOTIATION */ }; #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) #define MBEDTLS_SSL_CHANNEL_OUTBOUND 0 #define MBEDTLS_SSL_CHANNEL_INBOUND 1 extern int (*mbedtls_ssl_hw_record_init)(mbedtls_ssl_context *ssl, const unsigned char *key_enc, const unsigned char *key_dec, size_t keylen, const unsigned char *iv_enc, const unsigned char *iv_dec, size_t ivlen, const unsigned char *mac_enc, const unsigned char *mac_dec, size_t maclen); extern int (*mbedtls_ssl_hw_record_activate)(mbedtls_ssl_context *ssl, int direction); extern int (*mbedtls_ssl_hw_record_reset)(mbedtls_ssl_context *ssl); extern int (*mbedtls_ssl_hw_record_write)(mbedtls_ssl_context *ssl); extern int (*mbedtls_ssl_hw_record_read)(mbedtls_ssl_context *ssl); extern int (*mbedtls_ssl_hw_record_finish)(mbedtls_ssl_context *ssl); #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ /** * \brief Return the name of the ciphersuite associated with the * given ID * * \param ciphersuite_id SSL ciphersuite ID * * \return a string containing the ciphersuite name */ const char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id ); /** * \brief Return the ID of the ciphersuite associated with the * given name * * \param ciphersuite_name SSL ciphersuite name * * \return the ID with the ciphersuite or 0 if not found */ int mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name ); /** * \brief Initialize an SSL context * Just makes the context ready for mbedtls_ssl_setup() or * mbedtls_ssl_free() * * \param ssl SSL context */ void mbedtls_ssl_init( mbedtls_ssl_context *ssl ); /** * \brief Set up an SSL context for use * * \note No copy of the configuration context is made, it can be * shared by many mbedtls_ssl_context structures. * * \warning The conf structure will be accessed during the session. * It must not be modified or freed as long as the session * is active. * * \warning This function must be called exactly once per context. * Calling mbedtls_ssl_setup again is not supported, even * if no session is active. * * \param ssl SSL context * \param conf SSL configuration to use * * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if * memory allocation failed */ int mbedtls_ssl_setup( mbedtls_ssl_context *ssl, const mbedtls_ssl_config *conf ); /** * \brief Reset an already initialized SSL context for re-use * while retaining application-set variables, function * pointers and data. * * \param ssl SSL context * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED, MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or * MBEDTLS_ERR_SSL_COMPRESSION_FAILED */ int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl ); /** * \brief Set the current endpoint type * * \param conf SSL configuration * \param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER */ void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint ); /** * \brief Set the transport type (TLS or DTLS). * Default: TLS * * \note For DTLS, you must either provide a recv callback that * doesn't block, or one that handles timeouts, see * \c mbedtls_ssl_set_bio(). You also need to provide timer * callbacks with \c mbedtls_ssl_set_timer_cb(). * * \param conf SSL configuration * \param transport transport type: * MBEDTLS_SSL_TRANSPORT_STREAM for TLS, * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS. */ void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport ); /** * \brief Set the certificate verification mode * Default: NONE on server, REQUIRED on client * * \param conf SSL configuration * \param authmode can be: * * MBEDTLS_SSL_VERIFY_NONE: peer certificate is not checked * (default on server) * (insecure on client) * * MBEDTLS_SSL_VERIFY_OPTIONAL: peer certificate is checked, however the * handshake continues even if verification failed; * mbedtls_ssl_get_verify_result() can be called after the * handshake is complete. * * MBEDTLS_SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, * handshake is aborted if verification failed. * (default on client) * * \note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode. * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at * the right time(s), which may not be obvious, while REQUIRED always perform * the verification as soon as possible. For example, REQUIRED was protecting * against the "triple handshake" attack even before it was found. */ void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Set the verification callback (Optional). * * If set, the verify callback is called for each * certificate in the chain. For implementation * information, please see \c mbedtls_x509_crt_verify() * * \param conf SSL configuration * \param f_vrfy verification function * \param p_vrfy verification parameter */ void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ /** * \brief Set the random number generator callback * * \param conf SSL configuration * \param f_rng RNG function * \param p_rng RNG parameter */ void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Set the debug callback * * The callback has the following argument: * void * opaque context for the callback * int debug level * const char * file name * int line number * const char * message * * \param conf SSL configuration * \param f_dbg debug function * \param p_dbg debug parameter */ void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, void (*f_dbg)(void *, int, const char *, int, const char *), void *p_dbg ); /** * \brief Set the underlying BIO callbacks for write, read and * read-with-timeout. * * \param ssl SSL context * \param p_bio parameter (context) shared by BIO callbacks * \param f_send write callback * \param f_recv read callback * \param f_recv_timeout blocking read callback with timeout. * * \note One of f_recv or f_recv_timeout can be NULL, in which case * the other is used. If both are non-NULL, f_recv_timeout is * used and f_recv is ignored (as if it were NULL). * * \note The two most common use cases are: * - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL * - blocking I/O, f_recv == NULL, f_recv_timout != NULL * * \note For DTLS, you need to provide either a non-NULL * f_recv_timeout callback, or a f_recv that doesn't block. * * \note See the documentations of \c mbedtls_ssl_sent_t, * \c mbedtls_ssl_recv_t and \c mbedtls_ssl_recv_timeout_t for * the conventions those callbacks must follow. * * \note On some platforms, net_sockets.c provides * \c mbedtls_net_send(), \c mbedtls_net_recv() and * \c mbedtls_net_recv_timeout() that are suitable to be used * here. */ void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, void *p_bio, mbedtls_ssl_send_t *f_send, mbedtls_ssl_recv_t *f_recv, mbedtls_ssl_recv_timeout_t *f_recv_timeout ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /** * \brief Set the Maximum Tranport Unit (MTU). * Special value: 0 means unset (no limit). * This represents the maximum size of a datagram payload * handled by the transport layer (usually UDP) as determined * by the network link and stack. In practice, this controls * the maximum size datagram the DTLS layer will pass to the * \c f_send() callback set using \c mbedtls_ssl_set_bio(). * * \note The limit on datagram size is converted to a limit on * record payload by subtracting the current overhead of * encapsulation and encryption/authentication if any. * * \note This can be called at any point during the connection, for * example when a Path Maximum Transfer Unit (PMTU) * estimate becomes available from other sources, * such as lower (or higher) protocol layers. * * \note This setting only controls the size of the packets we send, * and does not restrict the size of the datagrams we're * willing to receive. Client-side, you can request the * server to use smaller records with \c * mbedtls_ssl_conf_max_frag_len(). * * \note If both a MTU and a maximum fragment length have been * configured (or negotiated with the peer), the resulting * lower limit on record payload (see first note) is used. * * \note This can only be used to decrease the maximum size * of datagrams (hence records, see first note) sent. It * cannot be used to increase the maximum size of records over * the limit set by #MBEDTLS_SSL_OUT_CONTENT_LEN. * * \note Values lower than the current record layer expansion will * result in an error when trying to send data. * * \note Using record compression together with a non-zero MTU value * will result in an error when trying to send data. * * \param ssl SSL context * \param mtu Value of the path MTU in bytes */ void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu ); #endif /* MBEDTLS_SSL_PROTO_DTLS */ /** * \brief Set the timeout period for mbedtls_ssl_read() * (Default: no timeout.) * * \param conf SSL configuration context * \param timeout Timeout value in milliseconds. * Use 0 for no timeout (default). * * \note With blocking I/O, this will only work if a non-NULL * \c f_recv_timeout was set with \c mbedtls_ssl_set_bio(). * With non-blocking I/O, this will only work if timer * callbacks were set with \c mbedtls_ssl_set_timer_cb(). * * \note With non-blocking I/O, you may also skip this function * altogether and handle timeouts at the application layer. */ void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout ); /** * \brief Set the timer callbacks (Mandatory for DTLS.) * * \param ssl SSL context * \param p_timer parameter (context) shared by timer callbacks * \param f_set_timer set timer callback * \param f_get_timer get timer callback. Must return: * * \note See the documentation of \c mbedtls_ssl_set_timer_t and * \c mbedtls_ssl_get_timer_t for the conventions this pair of * callbacks must follow. * * \note On some platforms, timing.c provides * \c mbedtls_timing_set_delay() and * \c mbedtls_timing_get_delay() that are suitable for using * here, except if using an event-driven style. * * \note See also the "DTLS tutorial" article in our knowledge base. * https://tls.mbed.org/kb/how-to/dtls-tutorial */ void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, void *p_timer, mbedtls_ssl_set_timer_t *f_set_timer, mbedtls_ssl_get_timer_t *f_get_timer ); /** * \brief Callback type: generate and write session ticket * * \note This describes what a callback implementation should do. * This callback should generate an encrypted and * authenticated ticket for the session and write it to the * output buffer. Here, ticket means the opaque ticket part * of the NewSessionTicket structure of RFC 5077. * * \param p_ticket Context for the callback * \param session SSL session to be written in the ticket * \param start Start of the output buffer * \param end End of the output buffer * \param tlen On exit, holds the length written * \param lifetime On exit, holds the lifetime of the ticket in seconds * * \return 0 if successful, or * a specific MBEDTLS_ERR_XXX code. */ typedef int mbedtls_ssl_ticket_write_t( void *p_ticket, const mbedtls_ssl_session *session, unsigned char *start, const unsigned char *end, size_t *tlen, uint32_t *lifetime ); #if defined(MBEDTLS_SSL_EXPORT_KEYS) /** * \brief Callback type: Export key block and master secret * * \note This is required for certain uses of TLS, e.g. EAP-TLS * (RFC 5216) and Thread. The key pointers are ephemeral and * therefore must not be stored. The master secret and keys * should not be used directly except as an input to a key * derivation function. * * \param p_expkey Context for the callback * \param ms Pointer to master secret (fixed length: 48 bytes) * \param kb Pointer to key block, see RFC 5246 section 6.3 * (variable length: 2 * maclen + 2 * keylen + 2 * ivlen). * \param maclen MAC length * \param keylen Key length * \param ivlen IV length * * \return 0 if successful, or * a specific MBEDTLS_ERR_XXX code. */ typedef int mbedtls_ssl_export_keys_t( void *p_expkey, const unsigned char *ms, const unsigned char *kb, size_t maclen, size_t keylen, size_t ivlen ); #endif /* MBEDTLS_SSL_EXPORT_KEYS */ /** * \brief Callback type: parse and load session ticket * * \note This describes what a callback implementation should do. * This callback should parse a session ticket as generated * by the corresponding mbedtls_ssl_ticket_write_t function, * and, if the ticket is authentic and valid, load the * session. * * \note The implementation is allowed to modify the first len * bytes of the input buffer, eg to use it as a temporary * area for the decrypted ticket contents. * * \param p_ticket Context for the callback * \param session SSL session to be loaded * \param buf Start of the buffer containing the ticket * \param len Length of the ticket. * * \return 0 if successful, or * MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or * MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or * any other non-zero code for other failures. */ typedef int mbedtls_ssl_ticket_parse_t( void *p_ticket, mbedtls_ssl_session *session, unsigned char *buf, size_t len ); #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) /** * \brief Configure SSL session ticket callbacks (server only). * (Default: none.) * * \note On server, session tickets are enabled by providing * non-NULL callbacks. * * \note On client, use \c mbedtls_ssl_conf_session_tickets(). * * \param conf SSL configuration context * \param f_ticket_write Callback for writing a ticket * \param f_ticket_parse Callback for parsing a ticket * \param p_ticket Context shared by the two callbacks */ void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf, mbedtls_ssl_ticket_write_t *f_ticket_write, mbedtls_ssl_ticket_parse_t *f_ticket_parse, void *p_ticket ); #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) /** * \brief Configure key export callback. * (Default: none.) * * \note See \c mbedtls_ssl_export_keys_t. * * \param conf SSL configuration context * \param f_export_keys Callback for exporting keys * \param p_export_keys Context for the callback */ void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf, mbedtls_ssl_export_keys_t *f_export_keys, void *p_export_keys ); #endif /* MBEDTLS_SSL_EXPORT_KEYS */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) /** * \brief Configure asynchronous private key operation callbacks. * * \param conf SSL configuration context * \param f_async_sign Callback to start a signature operation. See * the description of ::mbedtls_ssl_async_sign_t * for more information. This may be \c NULL if the * external processor does not support any signature * operation; in this case the private key object * associated with the certificate will be used. * \param f_async_decrypt Callback to start a decryption operation. See * the description of ::mbedtls_ssl_async_decrypt_t * for more information. This may be \c NULL if the * external processor does not support any decryption * operation; in this case the private key object * associated with the certificate will be used. * \param f_async_resume Callback to resume an asynchronous operation. See * the description of ::mbedtls_ssl_async_resume_t * for more information. This may not be \c NULL unless * \p f_async_sign and \p f_async_decrypt are both * \c NULL. * \param f_async_cancel Callback to cancel an asynchronous operation. See * the description of ::mbedtls_ssl_async_cancel_t * for more information. This may be \c NULL if * no cleanup is needed. * \param config_data A pointer to configuration data which can be * retrieved with * mbedtls_ssl_conf_get_async_config_data(). The * library stores this value without dereferencing it. */ void mbedtls_ssl_conf_async_private_cb( mbedtls_ssl_config *conf, mbedtls_ssl_async_sign_t *f_async_sign, mbedtls_ssl_async_decrypt_t *f_async_decrypt, mbedtls_ssl_async_resume_t *f_async_resume, mbedtls_ssl_async_cancel_t *f_async_cancel, void *config_data ); /** * \brief Retrieve the configuration data set by * mbedtls_ssl_conf_async_private_cb(). * * \param conf SSL configuration context * \return The configuration data set by * mbedtls_ssl_conf_async_private_cb(). */ void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf ); /** * \brief Retrieve the asynchronous operation user context. * * \note This function may only be called while a handshake * is in progress. * * \param ssl The SSL context to access. * * \return The asynchronous operation user context that was last * set during the current handshake. If * mbedtls_ssl_set_async_operation_data() has not yet been * called during the current handshake, this function returns * \c NULL. */ void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl ); /** * \brief Retrieve the asynchronous operation user context. * * \note This function may only be called while a handshake * is in progress. * * \param ssl The SSL context to access. * \param ctx The new value of the asynchronous operation user context. * Call mbedtls_ssl_get_async_operation_data() later during the * same handshake to retrieve this value. */ void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl, void *ctx ); #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /** * \brief Callback type: generate a cookie * * \param ctx Context for the callback * \param p Buffer to write to, * must be updated to point right after the cookie * \param end Pointer to one past the end of the output buffer * \param info Client ID info that was passed to * \c mbedtls_ssl_set_client_transport_id() * \param ilen Length of info in bytes * * \return The callback must return 0 on success, * or a negative error code. */ typedef int mbedtls_ssl_cookie_write_t( void *ctx, unsigned char **p, unsigned char *end, const unsigned char *info, size_t ilen ); /** * \brief Callback type: verify a cookie * * \param ctx Context for the callback * \param cookie Cookie to verify * \param clen Length of cookie * \param info Client ID info that was passed to * \c mbedtls_ssl_set_client_transport_id() * \param ilen Length of info in bytes * * \return The callback must return 0 if cookie is valid, * or a negative error code. */ typedef int mbedtls_ssl_cookie_check_t( void *ctx, const unsigned char *cookie, size_t clen, const unsigned char *info, size_t ilen ); #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) /** * \brief Register callbacks for DTLS cookies * (Server only. DTLS only.) * * Default: dummy callbacks that fail, in order to force you to * register working callbacks (and initialize their context). * * To disable HelloVerifyRequest, register NULL callbacks. * * \warning Disabling hello verification allows your server to be used * for amplification in DoS attacks against other hosts. * Only disable if you known this can't happen in your * particular environment. * * \note See comments on \c mbedtls_ssl_handshake() about handling * the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected * on the first handshake attempt when this is enabled. * * \note This is also necessary to handle client reconnection from * the same port as described in RFC 6347 section 4.2.8 (only * the variant with cookies is supported currently). See * comments on \c mbedtls_ssl_read() for details. * * \param conf SSL configuration * \param f_cookie_write Cookie write callback * \param f_cookie_check Cookie check callback * \param p_cookie Context for both callbacks */ void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf, mbedtls_ssl_cookie_write_t *f_cookie_write, mbedtls_ssl_cookie_check_t *f_cookie_check, void *p_cookie ); /** * \brief Set client's transport-level identification info. * (Server only. DTLS only.) * * This is usually the IP address (and port), but could be * anything identify the client depending on the underlying * network stack. Used for HelloVerifyRequest with DTLS. * This is *not* used to route the actual packets. * * \param ssl SSL context * \param info Transport-level info identifying the client (eg IP + port) * \param ilen Length of info in bytes * * \note An internal copy is made, so the info buffer can be reused. * * \return 0 on success, * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client, * MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory. */ int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, const unsigned char *info, size_t ilen ); #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) /** * \brief Enable or disable anti-replay protection for DTLS. * (DTLS only, no effect on TLS.) * Default: enabled. * * \param conf SSL configuration * \param mode MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED. * * \warning Disabling this is a security risk unless the application * protocol handles duplicated packets in a safe way. You * should not disable this without careful consideration. * However, if your application already detects duplicated * packets and needs information about them to adjust its * transmission strategy, then you'll want to disable this. */ void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ); #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) /** * \brief Set a limit on the number of records with a bad MAC * before terminating the connection. * (DTLS only, no effect on TLS.) * Default: 0 (disabled). * * \param conf SSL configuration * \param limit Limit, or 0 to disable. * * \note If the limit is N, then the connection is terminated when * the Nth non-authentic record is seen. * * \note Records with an invalid header are not counted, only the * ones going through the authentication-decryption phase. * * \note This is a security trade-off related to the fact that it's * often relatively easy for an active attacker ot inject UDP * datagrams. On one hand, setting a low limit here makes it * easier for such an attacker to forcibly terminated a * connection. On the other hand, a high limit or no limit * might make us waste resources checking authentication on * many bogus packets. */ void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ); #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ #if defined(MBEDTLS_SSL_PROTO_DTLS) /** * \brief Allow or disallow packing of multiple handshake records * within a single datagram. * * \param ssl The SSL context to configure. * \param allow_packing This determines whether datagram packing may * be used or not. A value of \c 0 means that every * record will be sent in a separate datagram; a * value of \c 1 means that, if space permits, * multiple handshake messages (including CCS) belonging to * a single flight may be packed within a single datagram. * * \note This is enabled by default and should only be disabled * for test purposes, or if datagram packing causes * interoperability issues with peers that don't support it. * * \note Allowing datagram packing reduces the network load since * there's less overhead if multiple messages share the same * datagram. Also, it increases the handshake efficiency * since messages belonging to a single datagram will not * be reordered in transit, and so future message buffering * or flight retransmission (if no buffering is used) as * means to deal with reordering are needed less frequently. * * \note Application records are not affected by this option and * are currently always sent in separate datagrams. * */ void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl, unsigned allow_packing ); /** * \brief Set retransmit timeout values for the DTLS handshake. * (DTLS only, no effect on TLS.) * * \param conf SSL configuration * \param min Initial timeout value in milliseconds. * Default: 1000 (1 second). * \param max Maximum timeout value in milliseconds. * Default: 60000 (60 seconds). * * \note Default values are from RFC 6347 section 4.2.4.1. * * \note The 'min' value should typically be slightly above the * expected round-trip time to your peer, plus whatever time * it takes for the peer to process the message. For example, * if your RTT is about 600ms and you peer needs up to 1s to * do the cryptographic operations in the handshake, then you * should set 'min' slightly above 1600. Lower values of 'min' * might cause spurious resends which waste network resources, * while larger value of 'min' will increase overall latency * on unreliable network links. * * \note The more unreliable your network connection is, the larger * your max / min ratio needs to be in order to achieve * reliable handshakes. * * \note Messages are retransmitted up to log2(ceil(max/min)) times. * For example, if min = 1s and max = 5s, the retransmit plan * goes: send ... 1s -> resend ... 2s -> resend ... 4s -> * resend ... 5s -> give up and return a timeout error. */ void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max ); #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_SRV_C) /** * \brief Set the session cache callbacks (server-side only) * If not set, no session resuming is done (except if session * tickets are enabled too). * * The session cache has the responsibility to check for stale * entries based on timeout. See RFC 5246 for recommendations. * * Warning: session.peer_cert is cleared by the SSL/TLS layer on * connection shutdown, so do not cache the pointer! Either set * it to NULL or make a full copy of the certificate. * * The get callback is called once during the initial handshake * to enable session resuming. The get function has the * following parameters: (void *parameter, mbedtls_ssl_session *session) * If a valid entry is found, it should fill the master of * the session object with the cached values and return 0, * return 1 otherwise. Optionally peer_cert can be set as well * if it is properly present in cache entry. * * The set callback is called once during the initial handshake * to enable session resuming after the entire handshake has * been finished. The set function has the following parameters: * (void *parameter, const mbedtls_ssl_session *session). The function * should create a cache entry for future retrieval based on * the data in the session structure and should keep in mind * that the mbedtls_ssl_session object presented (and all its referenced * data) is cleared by the SSL/TLS layer when the connection is * terminated. It is recommended to add metadata to determine if * an entry is still valid in the future. Return 0 if * successfully cached, return 1 otherwise. * * \param conf SSL configuration * \param p_cache parmater (context) for both callbacks * \param f_get_cache session get callback * \param f_set_cache session set callback */ void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf, void *p_cache, int (*f_get_cache)(void *, mbedtls_ssl_session *), int (*f_set_cache)(void *, const mbedtls_ssl_session *) ); #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_CLI_C) /** * \brief Request resumption of session (client-side only) * Session data is copied from presented session structure. * * \param ssl SSL context * \param session session context * * \return 0 if successful, * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or * arguments are otherwise invalid * * \sa mbedtls_ssl_get_session() */ int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session ); #endif /* MBEDTLS_SSL_CLI_C */ /** * \brief Set the list of allowed ciphersuites and the preference * order. First in the list has the highest preference. * (Overrides all version-specific lists) * * The ciphersuites array is not copied, and must remain * valid for the lifetime of the ssl_config. * * Note: The server uses its own preferences * over the preference of the client unless * MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE is defined! * * \param conf SSL configuration * \param ciphersuites 0-terminated list of allowed ciphersuites */ void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf, const int *ciphersuites ); /** * \brief Set the list of allowed ciphersuites and the * preference order for a specific version of the protocol. * (Only useful on the server side) * * The ciphersuites array is not copied, and must remain * valid for the lifetime of the ssl_config. * * \param conf SSL configuration * \param ciphersuites 0-terminated list of allowed ciphersuites * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 * supported) * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, * MBEDTLS_SSL_MINOR_VERSION_3 supported) * * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 * and MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 */ void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf, const int *ciphersuites, int major, int minor ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Set the X.509 security profile used for verification * * \note The restrictions are enforced for all certificates in the * chain. However, signatures in the handshake are not covered * by this setting but by \b mbedtls_ssl_conf_sig_hashes(). * * \param conf SSL configuration * \param profile Profile to use */ void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf, const mbedtls_x509_crt_profile *profile ); /** * \brief Set the data required to verify peer certificate * * \note See \c mbedtls_x509_crt_verify() for notes regarding the * parameters ca_chain (maps to trust_ca for that function) * and ca_crl. * * \param conf SSL configuration * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) * \param ca_crl trusted CA CRLs */ void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ); /** * \brief Set own certificate chain and private key * * \note own_cert should contain in order from the bottom up your * certificate chain. The top certificate (self-signed) * can be omitted. * * \note On server, this function can be called multiple times to * provision more than one cert/key pair (eg one ECDSA, one * RSA with SHA-256, one RSA with SHA-1). An adequate * certificate will be selected according to the client's * advertised capabilities. In case mutliple certificates are * adequate, preference is given to the one set by the first * call to this function, then second, etc. * * \note On client, only the first call has any effect. That is, * only one client certificate can be provisioned. The * server's preferences in its CertficateRequest message will * be ignored and our only cert will be sent regardless of * whether it matches those preferences - the server can then * decide what it wants to do with it. * * \note The provided \p pk_key needs to match the public key in the * first certificate in \p own_cert, or all handshakes using * that certificate will fail. It is your responsibility * to ensure that; this function will not perform any check. * You may use mbedtls_pk_check_pair() in order to perform * this check yourself, but be aware that this function can * be computationally expensive on some key types. * * \param conf SSL configuration * \param own_cert own public certificate chain * \param pk_key own private key * * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) /** * \brief Set the Pre Shared Key (PSK) and the expected identity name * * \note This is mainly useful for clients. Servers will usually * want to use \c mbedtls_ssl_conf_psk_cb() instead. * * \note Currently clients can only register one pre-shared key. * In other words, the servers' identity hint is ignored. * Support for setting multiple PSKs on clients and selecting * one based on the identity hint is not a planned feature but * feedback is welcomed. * * \param conf SSL configuration * \param psk pointer to the pre-shared key * \param psk_len pre-shared key length * \param psk_identity pointer to the pre-shared key identity * \param psk_identity_len identity key length * * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf, const unsigned char *psk, size_t psk_len, const unsigned char *psk_identity, size_t psk_identity_len ); /** * \brief Set the Pre Shared Key (PSK) for the current handshake * * \note This should only be called inside the PSK callback, * ie the function passed to \c mbedtls_ssl_conf_psk_cb(). * * \param ssl SSL context * \param psk pointer to the pre-shared key * \param psk_len pre-shared key length * * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl, const unsigned char *psk, size_t psk_len ); /** * \brief Set the PSK callback (server-side only). * * If set, the PSK callback is called for each * handshake where a PSK ciphersuite was negotiated. * The caller provides the identity received and wants to * receive the actual PSK data and length. * * The callback has the following parameters: (void *parameter, * mbedtls_ssl_context *ssl, const unsigned char *psk_identity, * size_t identity_len) * If a valid PSK identity is found, the callback should use * \c mbedtls_ssl_set_hs_psk() on the ssl context to set the * correct PSK and return 0. * Any other return value will result in a denied PSK identity. * * \note If you set a PSK callback using this function, then you * don't need to set a PSK key and identity using * \c mbedtls_ssl_conf_psk(). * * \param conf SSL configuration * \param f_psk PSK identity function * \param p_psk PSK identity parameter */ void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf, int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_psk ); #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Set the Diffie-Hellman public P and G values, * read as hexadecimal strings (server-side only) * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]) * * \param conf SSL configuration * \param dhm_P Diffie-Hellman-Merkle modulus * \param dhm_G Diffie-Hellman-Merkle generator * * \deprecated Superseded by \c mbedtls_ssl_conf_dh_param_bin. * * \return 0 if successful */ MBEDTLS_DEPRECATED int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G ); #endif /* MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Set the Diffie-Hellman public P and G values * from big-endian binary presentations. * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]_BIN) * * \param conf SSL configuration * \param dhm_P Diffie-Hellman-Merkle modulus in big-endian binary form * \param P_len Length of DHM modulus * \param dhm_G Diffie-Hellman-Merkle generator in big-endian binary form * \param G_len Length of DHM generator * * \return 0 if successful */ int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf, const unsigned char *dhm_P, size_t P_len, const unsigned char *dhm_G, size_t G_len ); /** * \brief Set the Diffie-Hellman public P and G values, * read from existing context (server-side only) * * \param conf SSL configuration * \param dhm_ctx Diffie-Hellman-Merkle context * * \return 0 if successful */ int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx ); #endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) /** * \brief Set the minimum length for Diffie-Hellman parameters. * (Client-side only.) * (Default: 1024 bits.) * * \param conf SSL configuration * \param bitlen Minimum bit length of the DHM prime */ void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf, unsigned int bitlen ); #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_ECP_C) /** * \brief Set the allowed curves in order of preference. * (Default: all defined curves.) * * On server: this only affects selection of the ECDHE curve; * the curves used for ECDH and ECDSA are determined by the * list of available certificates instead. * * On client: this affects the list of curves offered for any * use. The server can override our preference order. * * Both sides: limits the set of curves accepted for use in * ECDHE and in the peer's end-entity certificate. * * \note This has no influence on which curves are allowed inside the * certificate chains, see \c mbedtls_ssl_conf_cert_profile() * for that. For the end-entity certificate however, the key * will be accepted only if it is allowed both by this list * and by the cert profile. * * \note This list should be ordered by decreasing preference * (preferred curve first). * * \param conf SSL configuration * \param curves Ordered list of allowed curves, * terminated by MBEDTLS_ECP_DP_NONE. */ void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf, const mbedtls_ecp_group_id *curves ); #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /** * \brief Set the allowed hashes for signatures during the handshake. * (Default: all available hashes except MD5.) * * \note This only affects which hashes are offered and can be used * for signatures during the handshake. Hashes for message * authentication and the TLS PRF are controlled by the * ciphersuite, see \c mbedtls_ssl_conf_ciphersuites(). Hashes * used for certificate signature are controlled by the * verification profile, see \c mbedtls_ssl_conf_cert_profile(). * * \note This list should be ordered by decreasing preference * (preferred hash first). * * \param conf SSL configuration * \param hashes Ordered list of allowed signature hashes, * terminated by \c MBEDTLS_MD_NONE. */ void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf, const int *hashes ); #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Set or reset the hostname to check against the received * server certificate. It sets the ServerName TLS extension, * too, if that extension is enabled. (client-side only) * * \param ssl SSL context * \param hostname the server hostname, may be NULL to clear hostname * \note Maximum hostname length MBEDTLS_SSL_MAX_HOST_NAME_LEN. * * \return 0 if successful, MBEDTLS_ERR_SSL_ALLOC_FAILED on * allocation failure, MBEDTLS_ERR_SSL_BAD_INPUT_DATA on * too long input hostname. * * Hostname set to the one provided on success (cleared * when NULL). On allocation failure hostname is cleared. * On too long input failure, old hostname is unchanged. */ int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) /** * \brief Set own certificate and key for the current handshake * * \note Same as \c mbedtls_ssl_conf_own_cert() but for use within * the SNI callback. * * \param ssl SSL context * \param own_cert own public certificate chain * \param pk_key own private key * * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ); /** * \brief Set the data required to verify peer certificate for the * current handshake * * \note Same as \c mbedtls_ssl_conf_ca_chain() but for use within * the SNI callback. * * \param ssl SSL context * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) * \param ca_crl trusted CA CRLs */ void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ); /** * \brief Set authmode for the current handshake. * * \note Same as \c mbedtls_ssl_conf_authmode() but for use within * the SNI callback. * * \param ssl SSL context * \param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or * MBEDTLS_SSL_VERIFY_REQUIRED */ void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl, int authmode ); /** * \brief Set server side ServerName TLS extension callback * (optional, server-side only). * * If set, the ServerName callback is called whenever the * server receives a ServerName TLS extension from the client * during a handshake. The ServerName callback has the * following parameters: (void *parameter, mbedtls_ssl_context *ssl, * const unsigned char *hostname, size_t len). If a suitable * certificate is found, the callback must set the * certificate(s) and key(s) to use with \c * mbedtls_ssl_set_hs_own_cert() (can be called repeatedly), * and may optionally adjust the CA and associated CRL with \c * mbedtls_ssl_set_hs_ca_chain() as well as the client * authentication mode with \c mbedtls_ssl_set_hs_authmode(), * then must return 0. If no matching name is found, the * callback must either set a default cert, or * return non-zero to abort the handshake at this point. * * \param conf SSL configuration * \param f_sni verification function * \param p_sni verification parameter */ void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf, int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_sni ); #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) /** * \brief Set the EC J-PAKE password for current handshake. * * \note An internal copy is made, and destroyed as soon as the * handshake is completed, or when the SSL context is reset or * freed. * * \note The SSL context needs to be already set up. The right place * to call this function is between \c mbedtls_ssl_setup() or * \c mbedtls_ssl_reset() and \c mbedtls_ssl_handshake(). * * \param ssl SSL context * \param pw EC J-PAKE password (pre-shared secret) * \param pw_len length of pw in bytes * * \return 0 on success, or a negative error code. */ int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl, const unsigned char *pw, size_t pw_len ); #endif /*MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN) /** * \brief Set the supported Application Layer Protocols. * * \param conf SSL configuration * \param protos Pointer to a NULL-terminated list of supported protocols, * in decreasing preference order. The pointer to the list is * recorded by the library for later reference as required, so * the lifetime of the table must be atleast as long as the * lifetime of the SSL configuration structure. * * \return 0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA. */ int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos ); /** * \brief Get the name of the negotiated Application Layer Protocol. * This function should be called after the handshake is * completed. * * \param ssl SSL context * * \return Protcol name, or NULL if no protocol was negotiated. */ const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_ALPN */ /** * \brief Set the maximum supported version sent from the client side * and/or accepted at the server side * (Default: MBEDTLS_SSL_MAX_MAJOR_VERSION, MBEDTLS_SSL_MAX_MINOR_VERSION) * * \note This ignores ciphersuites from higher versions. * * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 * * \param conf SSL configuration * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, * MBEDTLS_SSL_MINOR_VERSION_3 supported) */ void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor ); /** * \brief Set the minimum accepted SSL/TLS protocol version * (Default: TLS 1.0) * * \note Input outside of the SSL_MAX_XXXXX_VERSION and * SSL_MIN_XXXXX_VERSION range is ignored. * * \note MBEDTLS_SSL_MINOR_VERSION_0 (SSL v3) should be avoided. * * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 * * \param conf SSL configuration * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, * MBEDTLS_SSL_MINOR_VERSION_3 supported) */ void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor ); #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) /** * \brief Set the fallback flag (client-side only). * (Default: MBEDTLS_SSL_IS_NOT_FALLBACK). * * \note Set to MBEDTLS_SSL_IS_FALLBACK when preparing a fallback * connection, that is a connection with max_version set to a * lower value than the value you're willing to use. Such * fallback connections are not recommended but are sometimes * necessary to interoperate with buggy (version-intolerant) * servers. * * \warning You should NOT set this to MBEDTLS_SSL_IS_FALLBACK for * non-fallback connections! This would appear to work for a * while, then cause failures when the server is upgraded to * support a newer TLS version. * * \param conf SSL configuration * \param fallback MBEDTLS_SSL_IS_NOT_FALLBACK or MBEDTLS_SSL_IS_FALLBACK */ void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback ); #endif /* MBEDTLS_SSL_FALLBACK_SCSV && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) /** * \brief Enable or disable Encrypt-then-MAC * (Default: MBEDTLS_SSL_ETM_ENABLED) * * \note This should always be enabled, it is a security * improvement, and should not cause any interoperability * issue (used only if the peer supports it too). * * \param conf SSL configuration * \param etm MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED */ void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm ); #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) /** * \brief Enable or disable Extended Master Secret negotiation. * (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED) * * \note This should always be enabled, it is a security fix to the * protocol, and should not cause any interoperability issue * (used only if the peer supports it too). * * \param conf SSL configuration * \param ems MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED */ void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems ); #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_ARC4_C) /** * \brief Disable or enable support for RC4 * (Default: MBEDTLS_SSL_ARC4_DISABLED) * * \warning Use of RC4 in DTLS/TLS has been prohibited by RFC 7465 * for security reasons. Use at your own risk. * * \note This function is deprecated and will likely be removed in * a future version of the library. * RC4 is disabled by default at compile time and needs to be * actively enabled for use with legacy systems. * * \param conf SSL configuration * \param arc4 MBEDTLS_SSL_ARC4_ENABLED or MBEDTLS_SSL_ARC4_DISABLED */ void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 ); #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_SSL_SRV_C) /** * \brief Whether to send a list of acceptable CAs in * CertificateRequest messages. * (Default: do send) * * \param conf SSL configuration * \param cert_req_ca_list MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED or * MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED */ void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf, char cert_req_ca_list ); #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) /** * \brief Set the maximum fragment length to emit and/or negotiate * (Default: the smaller of MBEDTLS_SSL_IN_CONTENT_LEN and * MBEDTLS_SSL_OUT_CONTENT_LEN, usually 2^14 bytes) * (Server: set maximum fragment length to emit, * usually negotiated by the client during handshake * (Client: set maximum fragment length to emit *and* * negotiate with the server during handshake) * * \note With TLS, this currently only affects ApplicationData (sent * with \c mbedtls_ssl_read()), not handshake messages. * With DTLS, this affects both ApplicationData and handshake. * * \note This sets the maximum length for a record's payload, * excluding record overhead that will be added to it, see * \c mbedtls_ssl_get_record_expansion(). * * \note For DTLS, it is also possible to set a limit for the total * size of daragrams passed to the transport layer, including * record overhead, see \c mbedtls_ssl_set_mtu(). * * \param conf SSL configuration * \param mfl_code Code for maximum fragment length (allowed values: * MBEDTLS_SSL_MAX_FRAG_LEN_512, MBEDTLS_SSL_MAX_FRAG_LEN_1024, * MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096) * * \return 0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA */ int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code ); #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) /** * \brief Activate negotiation of truncated HMAC * (Default: MBEDTLS_SSL_TRUNC_HMAC_DISABLED) * * \param conf SSL configuration * \param truncate Enable or disable (MBEDTLS_SSL_TRUNC_HMAC_ENABLED or * MBEDTLS_SSL_TRUNC_HMAC_DISABLED) */ void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate ); #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) /** * \brief Enable / Disable 1/n-1 record splitting * (Default: MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED) * * \note Only affects SSLv3 and TLS 1.0, not higher versions. * Does not affect non-CBC ciphersuites in any version. * * \param conf SSL configuration * \param split MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED or * MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED */ void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split ); #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) /** * \brief Enable / Disable session tickets (client only). * (Default: MBEDTLS_SSL_SESSION_TICKETS_ENABLED.) * * \note On server, use \c mbedtls_ssl_conf_session_tickets_cb(). * * \param conf SSL configuration * \param use_tickets Enable or disable (MBEDTLS_SSL_SESSION_TICKETS_ENABLED or * MBEDTLS_SSL_SESSION_TICKETS_DISABLED) */ void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ); #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_RENEGOTIATION) /** * \brief Enable / Disable renegotiation support for connection when * initiated by peer * (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED) * * \warning It is recommended to always disable renegotation unless you * know you need it and you know what you're doing. In the * past, there have been several issues associated with * renegotiation or a poor understanding of its properties. * * \note Server-side, enabling renegotiation also makes the server * susceptible to a resource DoS by a malicious client. * * \param conf SSL configuration * \param renegotiation Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or * MBEDTLS_SSL_RENEGOTIATION_DISABLED) */ void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation ); #endif /* MBEDTLS_SSL_RENEGOTIATION */ /** * \brief Prevent or allow legacy renegotiation. * (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) * * MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to * be established even if the peer does not support * secure renegotiation, but does not allow renegotiation * to take place if not secure. * (Interoperable and secure option) * * MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations * with non-upgraded peers. Allowing legacy renegotiation * makes the connection vulnerable to specific man in the * middle attacks. (See RFC 5746) * (Most interoperable and least secure option) * * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections * if peer does not support secure renegotiation. Results * in interoperability issues with non-upgraded peers * that do not support renegotiation altogether. * (Most secure option, interoperability issues) * * \param conf SSL configuration * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, * SSL_ALLOW_LEGACY_RENEGOTIATION or * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) */ void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy ); #if defined(MBEDTLS_SSL_RENEGOTIATION) /** * \brief Enforce renegotiation requests. * (Default: enforced, max_records = 16) * * When we request a renegotiation, the peer can comply or * ignore the request. This function allows us to decide * whether to enforce our renegotiation requests by closing * the connection if the peer doesn't comply. * * However, records could already be in transit from the peer * when the request is emitted. In order to increase * reliability, we can accept a number of records before the * expected handshake records. * * The optimal value is highly dependent on the specific usage * scenario. * * \note With DTLS and server-initiated renegotiation, the * HelloRequest is retransmited every time mbedtls_ssl_read() times * out or receives Application Data, until: * - max_records records have beens seen, if it is >= 0, or * - the number of retransmits that would happen during an * actual handshake has been reached. * Please remember the request might be lost a few times * if you consider setting max_records to a really low value. * * \warning On client, the grace period can only happen during * mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate() * which always behave as if max_record was 0. The reason is, * if we receive application data from the server, we need a * place to write it, which only happens during mbedtls_ssl_read(). * * \param conf SSL configuration * \param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to * enforce renegotiation, or a non-negative value to enforce * it but allow for a grace period of max_records records. */ void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records ); /** * \brief Set record counter threshold for periodic renegotiation. * (Default: 2^48 - 1) * * Renegotiation is automatically triggered when a record * counter (outgoing or ingoing) crosses the defined * threshold. The default value is meant to prevent the * connection from being closed when the counter is about to * reached its maximal value (it is not allowed to wrap). * * Lower values can be used to enforce policies such as "keys * must be refreshed every N packets with cipher X". * * The renegotiation period can be disabled by setting * conf->disable_renegotiation to * MBEDTLS_SSL_RENEGOTIATION_DISABLED. * * \note When the configured transport is * MBEDTLS_SSL_TRANSPORT_DATAGRAM the maximum renegotiation * period is 2^48 - 1, and for MBEDTLS_SSL_TRANSPORT_STREAM, * the maximum renegotiation period is 2^64 - 1. * * \param conf SSL configuration * \param period The threshold value: a big-endian 64-bit number. */ void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, const unsigned char period[8] ); #endif /* MBEDTLS_SSL_RENEGOTIATION */ /** * \brief Check if there is data already read from the * underlying transport but not yet processed. * * \param ssl SSL context * * \return 0 if nothing's pending, 1 otherwise. * * \note This is different in purpose and behaviour from * \c mbedtls_ssl_get_bytes_avail in that it considers * any kind of unprocessed data, not only unread * application data. If \c mbedtls_ssl_get_bytes * returns a non-zero value, this function will * also signal pending data, but the converse does * not hold. For example, in DTLS there might be * further records waiting to be processed from * the current underlying transport's datagram. * * \note If this function returns 1 (data pending), this * does not imply that a subsequent call to * \c mbedtls_ssl_read will provide any data; * e.g., the unprocessed data might turn out * to be an alert or a handshake message. * * \note This function is useful in the following situation: * If the SSL/TLS module successfully returns from an * operation - e.g. a handshake or an application record * read - and you're awaiting incoming data next, you * must not immediately idle on the underlying transport * to have data ready, but you need to check the value * of this function first. The reason is that the desired * data might already be read but not yet processed. * If, in contrast, a previous call to the SSL/TLS module * returned MBEDTLS_ERR_SSL_WANT_READ, it is not necessary * to call this function, as the latter error code entails * that all internal data has been processed. * */ int mbedtls_ssl_check_pending( const mbedtls_ssl_context *ssl ); /** * \brief Return the number of application data bytes * remaining to be read from the current record. * * \param ssl SSL context * * \return How many bytes are available in the application * data record read buffer. * * \note When working over a datagram transport, this is * useful to detect the current datagram's boundary * in case \c mbedtls_ssl_read has written the maximal * amount of data fitting into the input buffer. * */ size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl ); /** * \brief Return the result of the certificate verification * * \param ssl The SSL context to use. * * \return \c 0 if the certificate verification was successful. * \return \c -1u if the result is not available. This may happen * e.g. if the handshake aborts early, or a verification * callback returned a fatal error. * \return A bitwise combination of \c MBEDTLS_X509_BADCERT_XXX * and \c MBEDTLS_X509_BADCRL_XXX failure flags; see x509.h. */ uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ); /** * \brief Return the name of the current ciphersuite * * \param ssl SSL context * * \return a string containing the ciphersuite name */ const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl ); /** * \brief Return the current SSL version (SSLv3/TLSv1/etc) * * \param ssl SSL context * * \return a string containing the SSL version */ const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl ); /** * \brief Return the (maximum) number of bytes added by the record * layer: header + encryption/MAC overhead (inc. padding) * * \note This function is not available (always returns an error) * when record compression is enabled. * * \param ssl SSL context * * \return Current maximum record expansion in bytes, or * MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if compression is * enabled, which makes expansion much less predictable */ int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) /** * \brief Return the maximum fragment length (payload, in bytes). * This is the value negotiated with peer if any, * or the locally configured value. * * \sa mbedtls_ssl_conf_max_frag_len() * \sa mbedtls_ssl_get_max_record_payload() * * \param ssl SSL context * * \return Current maximum fragment length. */ size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ /** * \brief Return the current maximum outgoing record payload in bytes. * This takes into account the config.h setting \c * MBEDTLS_SSL_OUT_CONTENT_LEN, the configured and negotiated * max fragment length extension if used, and for DTLS the * path MTU as configured and current record expansion. * * \note With DTLS, \c mbedtls_ssl_write() will return an error if * called with a larger length value. * With TLS, \c mbedtls_ssl_write() will fragment the input if * necessary and return the number of bytes written; it is up * to the caller to call \c mbedtls_ssl_write() again in * order to send the remaining bytes if any. * * \note This function is not available (always returns an error) * when record compression is enabled. * * \sa mbedtls_ssl_set_mtu() * \sa mbedtls_ssl_get_max_frag_len() * \sa mbedtls_ssl_get_record_expansion() * * \param ssl SSL context * * \return Current maximum payload for an outgoing record, * or a negative error code. */ int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Return the peer certificate from the current connection * * Note: Can be NULL in case no certificate was sent during * the handshake. Different calls for the same connection can * return the same or different pointers for the same * certificate and even a different certificate altogether. * The peer cert CAN change in a single connection if * renegotiation is performed. * * \param ssl SSL context * * \return the current peer certificate */ const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_CLI_C) /** * \brief Save session in order to resume it later (client-side only) * Session data is copied to presented session structure. * * * \param ssl SSL context * \param session session context * * \return 0 if successful, * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or * arguments are otherwise invalid. * * \note Only the server certificate is copied, and not the full chain, * so you should not attempt to validate the certificate again * by calling \c mbedtls_x509_crt_verify() on it. * Instead, you should use the results from the verification * in the original handshake by calling \c mbedtls_ssl_get_verify_result() * after loading the session again into a new SSL context * using \c mbedtls_ssl_set_session(). * * \note Once the session object is not needed anymore, you should * free it by calling \c mbedtls_ssl_session_free(). * * \sa mbedtls_ssl_set_session() */ int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session ); #endif /* MBEDTLS_SSL_CLI_C */ /** * \brief Perform the SSL handshake * * \param ssl SSL context * * \return \c 0 if successful. * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE * if the handshake is incomplete and waiting for data to * be available for reading from or writing to the underlying * transport - in this case you must call this function again * when the underlying transport is ready for the operation. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous * operation is in progress (see * mbedtls_ssl_conf_async_private_cb()) - in this case you * must call this function again when the operation is ready. * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic * operation is in progress (see mbedtls_ecp_set_max_ops()) - * in this case you must call this function again to complete * the handshake when you're done attending other tasks. * \return #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED if DTLS is in use * and the client did not demonstrate reachability yet - in * this case you must stop using the context (see below). * \return Another SSL error code - in this case you must stop using * the context (see below). * * \warning If this function returns something other than * \c 0, * #MBEDTLS_ERR_SSL_WANT_READ, * #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, * you must stop using the SSL context for reading or writing, * and either free it or call \c mbedtls_ssl_session_reset() * on it before re-using it for a new connection; the current * connection must be closed. * * \note If DTLS is in use, then you may choose to handle * #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging * purposes, as it is an expected return value rather than an * actual error, but you still need to reset/free the context. * * \note Remarks regarding event-driven DTLS: * If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram * from the underlying transport layer is currently being processed, * and it is safe to idle until the timer or the underlying transport * signal a new event. This is not true for a successful handshake, * in which case the datagram of the underlying transport that is * currently being processed might or might not contain further * DTLS records. */ int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ); /** * \brief Perform a single step of the SSL handshake * * \note The state of the context (ssl->state) will be at * the next state after this function returns \c 0. Do not * call this function if state is MBEDTLS_SSL_HANDSHAKE_OVER. * * \param ssl SSL context * * \return See mbedtls_ssl_handshake(). * * \warning If this function returns something other than \c 0, * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using * the SSL context for reading or writing, and either free it * or call \c mbedtls_ssl_session_reset() on it before * re-using it for a new connection; the current connection * must be closed. */ int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_SSL_RENEGOTIATION) /** * \brief Initiate an SSL renegotiation on the running connection. * Client: perform the renegotiation right now. * Server: request renegotiation, which will be performed * during the next call to mbedtls_ssl_read() if honored by * client. * * \param ssl SSL context * * \return 0 if successful, or any mbedtls_ssl_handshake() return * value except #MBEDTLS_ERR_SSL_CLIENT_RECONNECT that can't * happen during a renegotiation. * * \warning If this function returns something other than \c 0, * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using * the SSL context for reading or writing, and either free it * or call \c mbedtls_ssl_session_reset() on it before * re-using it for a new connection; the current connection * must be closed. * */ int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_RENEGOTIATION */ /** * \brief Read at most 'len' application data bytes * * \param ssl SSL context * \param buf buffer that will hold the data * \param len maximum number of bytes to read * * \return The (positive) number of bytes read if successful. * \return \c 0 if the read end of the underlying transport was closed * - in this case you must stop using the context (see below). * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE * if the handshake is incomplete and waiting for data to * be available for reading from or writing to the underlying * transport - in this case you must call this function again * when the underlying transport is ready for the operation. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous * operation is in progress (see * mbedtls_ssl_conf_async_private_cb()) - in this case you * must call this function again when the operation is ready. * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic * operation is in progress (see mbedtls_ecp_set_max_ops()) - * in this case you must call this function again to complete * the handshake when you're done attending other tasks. * \return #MBEDTLS_ERR_SSL_CLIENT_RECONNECT if we're at the server * side of a DTLS connection and the client is initiating a * new connection using the same source port. See below. * \return Another SSL error code - in this case you must stop using * the context (see below). * * \warning If this function returns something other than * a positive value, * #MBEDTLS_ERR_SSL_WANT_READ, * #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CLIENT_RECONNECT, * you must stop using the SSL context for reading or writing, * and either free it or call \c mbedtls_ssl_session_reset() * on it before re-using it for a new connection; the current * connection must be closed. * * \note When this function returns #MBEDTLS_ERR_SSL_CLIENT_RECONNECT * (which can only happen server-side), it means that a client * is initiating a new connection using the same source port. * You can either treat that as a connection close and wait * for the client to resend a ClientHello, or directly * continue with \c mbedtls_ssl_handshake() with the same * context (as it has been reset internally). Either way, you * must make sure this is seen by the application as a new * connection: application state, if any, should be reset, and * most importantly the identity of the client must be checked * again. WARNING: not validating the identity of the client * again, or not transmitting the new identity to the * application layer, would allow authentication bypass! * * \note Remarks regarding event-driven DTLS: * - If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram * from the underlying transport layer is currently being processed, * and it is safe to idle until the timer or the underlying transport * signal a new event. * - This function may return MBEDTLS_ERR_SSL_WANT_READ even if data was * initially available on the underlying transport, as this data may have * been only e.g. duplicated messages or a renegotiation request. * Therefore, you must be prepared to receive MBEDTLS_ERR_SSL_WANT_READ even * when reacting to an incoming-data event from the underlying transport. * - On success, the datagram of the underlying transport that is currently * being processed may contain further DTLS records. You should call * \c mbedtls_ssl_check_pending to check for remaining records. * */ int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ); /** * \brief Try to write exactly 'len' application data bytes * * \warning This function will do partial writes in some cases. If the * return value is non-negative but less than length, the * function must be called again with updated arguments: * buf + ret, len - ret (if ret is the return value) until * it returns a value equal to the last 'len' argument. * * \param ssl SSL context * \param buf buffer holding the data * \param len how many bytes must be written * * \return The (non-negative) number of bytes actually written if * successful (may be less than \p len). * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE * if the handshake is incomplete and waiting for data to * be available for reading from or writing to the underlying * transport - in this case you must call this function again * when the underlying transport is ready for the operation. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous * operation is in progress (see * mbedtls_ssl_conf_async_private_cb()) - in this case you * must call this function again when the operation is ready. * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic * operation is in progress (see mbedtls_ecp_set_max_ops()) - * in this case you must call this function again to complete * the handshake when you're done attending other tasks. * \return Another SSL error code - in this case you must stop using * the context (see below). * * \warning If this function returns something other than * a non-negative value, * #MBEDTLS_ERR_SSL_WANT_READ, * #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, * you must stop using the SSL context for reading or writing, * and either free it or call \c mbedtls_ssl_session_reset() * on it before re-using it for a new connection; the current * connection must be closed. * * \note When this function returns #MBEDTLS_ERR_SSL_WANT_WRITE/READ, * it must be called later with the *same* arguments, * until it returns a value greater that or equal to 0. When * the function returns #MBEDTLS_ERR_SSL_WANT_WRITE there may be * some partial data in the output buffer, however this is not * yet sent. * * \note If the requested length is greater than the maximum * fragment length (either the built-in limit or the one set * or negotiated with the peer), then: * - with TLS, less bytes than requested are written. * - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned. * \c mbedtls_ssl_get_max_frag_len() may be used to query the * active maximum fragment length. * * \note Attempting to write 0 bytes will result in an empty TLS * application record being sent. */ int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ); /** * \brief Send an alert message * * \param ssl SSL context * \param level The alert level of the message * (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL) * \param message The alert message (SSL_ALERT_MSG_*) * * \return 0 if successful, or a specific SSL error code. * * \note If this function returns something other than 0 or * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using * the SSL context for reading or writing, and either free it or * call \c mbedtls_ssl_session_reset() on it before re-using it * for a new connection; the current connection must be closed. */ int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, unsigned char level, unsigned char message ); /** * \brief Notify the peer that the connection is being closed * * \param ssl SSL context * * \return 0 if successful, or a specific SSL error code. * * \note If this function returns something other than 0 or * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using * the SSL context for reading or writing, and either free it or * call \c mbedtls_ssl_session_reset() on it before re-using it * for a new connection; the current connection must be closed. */ int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl ); /** * \brief Free referenced items in an SSL context and clear memory * * \param ssl SSL context */ void mbedtls_ssl_free( mbedtls_ssl_context *ssl ); /** * \brief Initialize an SSL configuration context * Just makes the context ready for * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). * * \note You need to call mbedtls_ssl_config_defaults() unless you * manually set all of the relevent fields yourself. * * \param conf SSL configuration context */ void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ); /** * \brief Load reasonnable default SSL configuration values. * (You need to call mbedtls_ssl_config_init() first.) * * \param conf SSL configuration context * \param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER * \param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS * \param preset a MBEDTLS_SSL_PRESET_XXX value * * \note See \c mbedtls_ssl_conf_transport() for notes on DTLS. * * \return 0 if successful, or * MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error. */ int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf, int endpoint, int transport, int preset ); /** * \brief Free an SSL configuration context * * \param conf SSL configuration context */ void mbedtls_ssl_config_free( mbedtls_ssl_config *conf ); /** * \brief Initialize SSL session structure * * \param session SSL session */ void mbedtls_ssl_session_init( mbedtls_ssl_session *session ); /** * \brief Free referenced items in an SSL session including the * peer certificate and clear memory * * \note A session object can be freed even if the SSL context * that was used to retrieve the session is still in use. * * \param session SSL session */ void mbedtls_ssl_session_free( mbedtls_ssl_session *session ); #ifdef __cplusplus } #endif #endif /* ssl.h */ fldigi-4.1.06/src/include/mbedtls/aes.h0000664000175000017500000007154313507401434014563 00000000000000/** * \file aes.h * * \brief This file contains AES definitions and functions. * * The Advanced Encryption Standard (AES) specifies a FIPS-approved * cryptographic algorithm that can be used to protect electronic * data. * * The AES algorithm is a symmetric block cipher that can * encrypt and decrypt information. For more information, see * FIPS Publication 197: Advanced Encryption Standard and * ISO/IEC 18033-2:2006: Information technology -- Security * techniques -- Encryption algorithms -- Part 2: Asymmetric * ciphers. * * The AES-XTS block mode is standardized by NIST SP 800-38E * * and described in detail by IEEE P1619 * . */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_AES_H #define MBEDTLS_AES_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* padlock.c and aesni.c rely on these values! */ #define MBEDTLS_AES_ENCRYPT 1 /**< AES encryption. */ #define MBEDTLS_AES_DECRYPT 0 /**< AES decryption. */ /* Error codes in range 0x0020-0x0022 */ #define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -0x0020 /**< Invalid key length. */ #define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -0x0022 /**< Invalid data input length. */ /* Error codes in range 0x0021-0x0025 */ #define MBEDTLS_ERR_AES_BAD_INPUT_DATA -0x0021 /**< Invalid input data. */ /* MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE is deprecated and should not be used. */ #define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE -0x0023 /**< Feature not available. For example, an unsupported AES key size. */ /* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_AES_HW_ACCEL_FAILED -0x0025 /**< AES hardware accelerator failed. */ #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_AES_ALT) // Regular implementation // /** * \brief The AES context-type definition. */ typedef struct mbedtls_aes_context { int nr; /*!< The number of rounds. */ uint32_t *rk; /*!< AES round keys. */ uint32_t buf[68]; /*!< Unaligned data buffer. This buffer can hold 32 extra Bytes, which can be used for one of the following purposes:
  • Alignment if VIA padlock is used.
  • Simplifying key expansion in the 256-bit case by generating an extra round key.
*/ } mbedtls_aes_context; #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief The AES XTS context-type definition. */ typedef struct mbedtls_aes_xts_context { mbedtls_aes_context crypt; /*!< The AES context to use for AES block encryption or decryption. */ mbedtls_aes_context tweak; /*!< The AES context used for tweak computation. */ } mbedtls_aes_xts_context; #endif /* MBEDTLS_CIPHER_MODE_XTS */ #else /* MBEDTLS_AES_ALT */ #include "aes_alt.h" #endif /* MBEDTLS_AES_ALT */ /** * \brief This function initializes the specified AES context. * * It must be the first API called before using * the context. * * \param ctx The AES context to initialize. This must not be \c NULL. */ void mbedtls_aes_init( mbedtls_aes_context *ctx ); /** * \brief This function releases and clears the specified AES context. * * \param ctx The AES context to clear. * If this is \c NULL, this function does nothing. * Otherwise, the context must have been at least initialized. */ void mbedtls_aes_free( mbedtls_aes_context *ctx ); #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief This function initializes the specified AES XTS context. * * It must be the first API called before using * the context. * * \param ctx The AES XTS context to initialize. This must not be \c NULL. */ void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx ); /** * \brief This function releases and clears the specified AES XTS context. * * \param ctx The AES XTS context to clear. * If this is \c NULL, this function does nothing. * Otherwise, the context must have been at least initialized. */ void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx ); #endif /* MBEDTLS_CIPHER_MODE_XTS */ /** * \brief This function sets the encryption key. * * \param ctx The AES context to which the key should be bound. * It must be initialized. * \param key The encryption key. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of data passed in bits. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function sets the decryption key. * * \param ctx The AES context to which the key should be bound. * It must be initialized. * \param key The decryption key. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of data passed. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ); #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief This function prepares an XTS context for encryption and * sets the encryption key. * * \param ctx The AES XTS context to which the key should be bound. * It must be initialized. * \param key The encryption key. This is comprised of the XTS key1 * concatenated with the XTS key2. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of \p key passed in bits. Valid options are: *
  • 256 bits (each of key1 and key2 is a 128-bit key)
  • *
  • 512 bits (each of key1 and key2 is a 256-bit key)
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function prepares an XTS context for decryption and * sets the decryption key. * * \param ctx The AES XTS context to which the key should be bound. * It must be initialized. * \param key The decryption key. This is comprised of the XTS key1 * concatenated with the XTS key2. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of \p key passed in bits. Valid options are: *
  • 256 bits (each of key1 and key2 is a 128-bit key)
  • *
  • 512 bits (each of key1 and key2 is a 256-bit key)
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits ); #endif /* MBEDTLS_CIPHER_MODE_XTS */ /** * \brief This function performs an AES single-block encryption or * decryption operation. * * It performs the operation defined in the \p mode parameter * (encrypt or decrypt), on the input data buffer defined in * the \p input parameter. * * mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or * mbedtls_aes_setkey_dec() must be called before the first * call to this API with the same context. * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param input The buffer holding the input data. * It must be readable and at least \c 16 Bytes long. * \param output The buffer where the output data will be written. * It must be writeable and at least \c 16 Bytes long. * \return \c 0 on success. */ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief This function performs an AES-CBC encryption or decryption operation * on full blocks. * * It performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer defined in * the \p input parameter. * * It can be called as many times as needed, until all the input * data is processed. mbedtls_aes_init(), and either * mbedtls_aes_setkey_enc() or mbedtls_aes_setkey_dec() must be called * before the first call to this API with the same context. * * \note This function operates on full blocks, that is, the input size * must be a multiple of the AES block size of \c 16 Bytes. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the IV, you should * either save it manually or use the cipher module instead. * * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param length The length of the input data in Bytes. This must be a * multiple of the block size (\c 16 Bytes). * \param iv Initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH * on failure. */ int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief This function performs an AES-XTS encryption or decryption * operation for an entire XTS data unit. * * AES-XTS encrypts or decrypts blocks based on their location as * defined by a data unit number. The data unit number must be * provided by \p data_unit. * * NIST SP 800-38E limits the maximum size of a data unit to 2^20 * AES blocks. If the data unit is larger than this, this function * returns #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH. * * \param ctx The AES XTS context to use for AES XTS operations. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param length The length of a data unit in Bytes. This can be any * length between 16 bytes and 2^24 bytes inclusive * (between 1 and 2^20 block cipher blocks). * \param data_unit The address of the data unit encoded as an array of 16 * bytes in little-endian format. For disk encryption, this * is typically the index of the block device sector that * contains the data. * \param input The buffer holding the input data (which is an entire * data unit). This function reads \p length Bytes from \p * input. * \param output The buffer holding the output data (which is an entire * data unit). This function writes \p length Bytes to \p * output. * * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH if \p length is * smaller than an AES block in size (16 Bytes) or if \p * length is larger than 2^20 blocks (16 MiB). */ int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx, int mode, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief This function performs an AES-CFB128 encryption or decryption * operation. * * It performs the operation defined in the \p mode * parameter (encrypt or decrypt), on the input data buffer * defined in the \p input parameter. * * For CFB, you must set up the context with mbedtls_aes_setkey_enc(), * regardless of whether you are performing an encryption or decryption * operation, that is, regardless of the \p mode parameter. This is * because CFB mode uses the same key schedule for encryption and * decryption. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the * IV, you must either save it manually or use the cipher * module instead. * * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param length The length of the input data in Bytes. * \param iv_off The offset in IV (updated after use). * It must point to a valid \c size_t. * \param iv The initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ); /** * \brief This function performs an AES-CFB8 encryption or decryption * operation. * * It performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer defined * in the \p input parameter. * * Due to the nature of CFB, you must use the same key schedule for * both encryption and decryption operations. Therefore, you must * use the context initialized with mbedtls_aes_setkey_enc() for * both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT * \param length The length of the input data. * \param iv The initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /*MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /** * \brief This function performs an AES-OFB (Output Feedback Mode) * encryption or decryption operation. * * For OFB, you must set up the context with * mbedtls_aes_setkey_enc(), regardless of whether you are * performing an encryption or decryption operation. This is * because OFB mode uses the same key schedule for encryption and * decryption. * * The OFB operation is identical for encryption or decryption, * therefore no operation mode needs to be specified. * * \note Upon exit, the content of iv, the Initialisation Vector, is * updated so that you can call the same function again on the next * block(s) of data and get the same result as if it was encrypted * in one call. This allows a "streaming" usage, by initialising * iv_off to 0 before the first call, and preserving its value * between calls. * * For non-streaming use, the iv should be initialised on each call * to a unique value, and iv_off set to 0 on each call. * * If you need to retain the contents of the initialisation vector, * you must either save it manually or use the cipher module * instead. * * \warning For the OFB mode, the initialisation vector must be unique * every encryption operation. Reuse of an initialisation vector * will compromise security. * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param length The length of the input data. * \param iv_off The offset in IV (updated after use). * It must point to a valid \c size_t. * \param iv The initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief This function performs an AES-CTR encryption or decryption * operation. * * This function performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer * defined in the \p input parameter. * * Due to the nature of CTR, you must use the same key schedule * for both encryption and decryption operations. Therefore, you * must use the context initialized with mbedtls_aes_setkey_enc() * for both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**128 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first 12 bytes for the * per-message nonce, and the last 4 bytes for internal use. In that * case, before calling this function on a new message you need to * set the first 12 bytes of \p nonce_counter to your chosen nonce * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p * stream_block to be ignored). That way, you can encrypt at most * 2**96 messages of up to 2**32 blocks each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be unique. * The recommended way to ensure uniqueness is to use a message * counter. An alternative is to generate random nonces, but this * limits the number of messages that can be securely encrypted: * for example, with 96-bit random nonces, you should not encrypt * more than 2**32 messages with the same key. * * Note that for both stategies, sizes are measured in blocks and * that an AES block is 16 bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param length The length of the input data. * \param nc_off The offset in the current \p stream_block, for * resuming within the current cipher stream. The * offset pointer should be 0 at the start of a stream. * It must point to a valid \c size_t. * \param nonce_counter The 128-bit nonce and counter. * It must be a readable-writeable buffer of \c 16 Bytes. * \param stream_block The saved stream block for resuming. This is * overwritten by the function. * It must be a readable-writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ /** * \brief Internal AES block encryption function. This is only * exposed to allow overriding it using * \c MBEDTLS_AES_ENCRYPT_ALT. * * \param ctx The AES context to use for encryption. * \param input The plaintext block. * \param output The output (ciphertext) block. * * \return \c 0 on success. */ int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); /** * \brief Internal AES block decryption function. This is only * exposed to allow overriding it using see * \c MBEDTLS_AES_DECRYPT_ALT. * * \param ctx The AES context to use for decryption. * \param input The ciphertext block. * \param output The output (plaintext) block. * * \return \c 0 on success. */ int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Deprecated internal AES block encryption function * without return value. * * \deprecated Superseded by mbedtls_internal_aes_encrypt() * * \param ctx The AES context to use for encryption. * \param input Plaintext block. * \param output Output (ciphertext) block. */ MBEDTLS_DEPRECATED void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); /** * \brief Deprecated internal AES block decryption function * without return value. * * \deprecated Superseded by mbedtls_internal_aes_decrypt() * * \param ctx The AES context to use for decryption. * \param input Ciphertext block. * \param output Output (plaintext) block. */ MBEDTLS_DEPRECATED void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_aes_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* aes.h */ fldigi-4.1.06/src/include/mbedtls/chachapoly.h0000664000175000017500000003774713507401434016136 00000000000000/** * \file chachapoly.h * * \brief This file contains the AEAD-ChaCha20-Poly1305 definitions and * functions. * * ChaCha20-Poly1305 is an algorithm for Authenticated Encryption * with Associated Data (AEAD) that can be used to encrypt and * authenticate data. It is based on ChaCha20 and Poly1305 by Daniel * Bernstein and was standardized in RFC 7539. * * \author Daniel King */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CHACHAPOLY_H #define MBEDTLS_CHACHAPOLY_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif /* for shared error codes */ #include "poly1305.h" #define MBEDTLS_ERR_CHACHAPOLY_BAD_STATE -0x0054 /**< The requested operation is not permitted in the current state. */ #define MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED -0x0056 /**< Authenticated decryption failed: data was not authentic. */ #ifdef __cplusplus extern "C" { #endif typedef enum { MBEDTLS_CHACHAPOLY_ENCRYPT, /**< The mode value for performing encryption. */ MBEDTLS_CHACHAPOLY_DECRYPT /**< The mode value for performing decryption. */ } mbedtls_chachapoly_mode_t; #if !defined(MBEDTLS_CHACHAPOLY_ALT) #include "chacha20.h" typedef struct mbedtls_chachapoly_context { mbedtls_chacha20_context chacha20_ctx; /**< The ChaCha20 context. */ mbedtls_poly1305_context poly1305_ctx; /**< The Poly1305 context. */ uint64_t aad_len; /**< The length (bytes) of the Additional Authenticated Data. */ uint64_t ciphertext_len; /**< The length (bytes) of the ciphertext. */ int state; /**< The current state of the context. */ mbedtls_chachapoly_mode_t mode; /**< Cipher mode (encrypt or decrypt). */ } mbedtls_chachapoly_context; #else /* !MBEDTLS_CHACHAPOLY_ALT */ #include "chachapoly_alt.h" #endif /* !MBEDTLS_CHACHAPOLY_ALT */ /** * \brief This function initializes the specified ChaCha20-Poly1305 context. * * It must be the first API called before using * the context. It must be followed by a call to * \c mbedtls_chachapoly_setkey() before any operation can be * done, and to \c mbedtls_chachapoly_free() once all * operations with that context have been finished. * * In order to encrypt or decrypt full messages at once, for * each message you should make a single call to * \c mbedtls_chachapoly_crypt_and_tag() or * \c mbedtls_chachapoly_auth_decrypt(). * * In order to encrypt messages piecewise, for each * message you should make a call to * \c mbedtls_chachapoly_starts(), then 0 or more calls to * \c mbedtls_chachapoly_update_aad(), then 0 or more calls to * \c mbedtls_chachapoly_update(), then one call to * \c mbedtls_chachapoly_finish(). * * \warning Decryption with the piecewise API is discouraged! Always * use \c mbedtls_chachapoly_auth_decrypt() when possible! * * If however this is not possible because the data is too * large to fit in memory, you need to: * * - call \c mbedtls_chachapoly_starts() and (if needed) * \c mbedtls_chachapoly_update_aad() as above, * - call \c mbedtls_chachapoly_update() multiple times and * ensure its output (the plaintext) is NOT used in any other * way than placing it in temporary storage at this point, * - call \c mbedtls_chachapoly_finish() to compute the * authentication tag and compared it in constant time to the * tag received with the ciphertext. * * If the tags are not equal, you must immediately discard * all previous outputs of \c mbedtls_chachapoly_update(), * otherwise you can now safely use the plaintext. * * \param ctx The ChachaPoly context to initialize. Must not be \c NULL. */ void mbedtls_chachapoly_init( mbedtls_chachapoly_context *ctx ); /** * \brief This function releases and clears the specified * ChaCha20-Poly1305 context. * * \param ctx The ChachaPoly context to clear. This may be \c NULL, in which * case this function is a no-op. */ void mbedtls_chachapoly_free( mbedtls_chachapoly_context *ctx ); /** * \brief This function sets the ChaCha20-Poly1305 * symmetric encryption key. * * \param ctx The ChaCha20-Poly1305 context to which the key should be * bound. This must be initialized. * \param key The \c 256 Bit (\c 32 Bytes) key. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chachapoly_setkey( mbedtls_chachapoly_context *ctx, const unsigned char key[32] ); /** * \brief This function starts a ChaCha20-Poly1305 encryption or * decryption operation. * * \warning You must never use the same nonce twice with the same key. * This would void any confidentiality and authenticity * guarantees for the messages encrypted with the same nonce * and key. * * \note If the context is being used for AAD only (no data to * encrypt or decrypt) then \p mode can be set to any value. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \param ctx The ChaCha20-Poly1305 context. This must be initialized * and bound to a key. * \param nonce The nonce/IV to use for the message. * This must be a redable buffer of length \c 12 Bytes. * \param mode The operation to perform: #MBEDTLS_CHACHAPOLY_ENCRYPT or * #MBEDTLS_CHACHAPOLY_DECRYPT (discouraged, see warning). * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chachapoly_starts( mbedtls_chachapoly_context *ctx, const unsigned char nonce[12], mbedtls_chachapoly_mode_t mode ); /** * \brief This function feeds additional data to be authenticated * into an ongoing ChaCha20-Poly1305 operation. * * The Additional Authenticated Data (AAD), also called * Associated Data (AD) is only authenticated but not * encrypted nor included in the encrypted output. It is * usually transmitted separately from the ciphertext or * computed locally by each party. * * \note This function is called before data is encrypted/decrypted. * I.e. call this function to process the AAD before calling * \c mbedtls_chachapoly_update(). * * You may call this function multiple times to process * an arbitrary amount of AAD. It is permitted to call * this function 0 times, if no AAD is used. * * This function cannot be called any more if data has * been processed by \c mbedtls_chachapoly_update(), * or if the context has been finished. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \param ctx The ChaCha20-Poly1305 context. This must be initialized * and bound to a key. * \param aad_len The length in Bytes of the AAD. The length has no * restrictions. * \param aad Buffer containing the AAD. * This pointer can be \c NULL if `aad_len == 0`. * * \return \c 0 on success. * \return #MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA * if \p ctx or \p aad are NULL. * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE * if the operations has not been started or has been * finished, or if the AAD has been finished. */ int mbedtls_chachapoly_update_aad( mbedtls_chachapoly_context *ctx, const unsigned char *aad, size_t aad_len ); /** * \brief Thus function feeds data to be encrypted or decrypted * into an on-going ChaCha20-Poly1305 * operation. * * The direction (encryption or decryption) depends on the * mode that was given when calling * \c mbedtls_chachapoly_starts(). * * You may call this function multiple times to process * an arbitrary amount of data. It is permitted to call * this function 0 times, if no data is to be encrypted * or decrypted. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized. * \param len The length (in bytes) of the data to encrypt or decrypt. * \param input The buffer containing the data to encrypt or decrypt. * This pointer can be \c NULL if `len == 0`. * \param output The buffer to where the encrypted or decrypted data is * written. This must be able to hold \p len bytes. * This pointer can be \c NULL if `len == 0`. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE * if the operation has not been started or has been * finished. * \return Another negative error code on other kinds of failure. */ int mbedtls_chachapoly_update( mbedtls_chachapoly_context *ctx, size_t len, const unsigned char *input, unsigned char *output ); /** * \brief This function finished the ChaCha20-Poly1305 operation and * generates the MAC (authentication tag). * * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized. * \param mac The buffer to where the 128-bit (16 bytes) MAC is written. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE * if the operation has not been started or has been * finished. * \return Another negative error code on other kinds of failure. */ int mbedtls_chachapoly_finish( mbedtls_chachapoly_context *ctx, unsigned char mac[16] ); /** * \brief This function performs a complete ChaCha20-Poly1305 * authenticated encryption with the previously-set key. * * \note Before using this function, you must set the key with * \c mbedtls_chachapoly_setkey(). * * \warning You must never use the same nonce twice with the same key. * This would void any confidentiality and authenticity * guarantees for the messages encrypted with the same nonce * and key. * * \param ctx The ChaCha20-Poly1305 context to use (holds the key). * This must be initialized. * \param length The length (in bytes) of the data to encrypt or decrypt. * \param nonce The 96-bit (12 bytes) nonce/IV to use. * \param aad The buffer containing the additional authenticated * data (AAD). This pointer can be \c NULL if `aad_len == 0`. * \param aad_len The length (in bytes) of the AAD data to process. * \param input The buffer containing the data to encrypt or decrypt. * This pointer can be \c NULL if `ilen == 0`. * \param output The buffer to where the encrypted or decrypted data * is written. This pointer can be \c NULL if `ilen == 0`. * \param tag The buffer to where the computed 128-bit (16 bytes) MAC * is written. This must not be \c NULL. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chachapoly_encrypt_and_tag( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char *input, unsigned char *output, unsigned char tag[16] ); /** * \brief This function performs a complete ChaCha20-Poly1305 * authenticated decryption with the previously-set key. * * \note Before using this function, you must set the key with * \c mbedtls_chachapoly_setkey(). * * \param ctx The ChaCha20-Poly1305 context to use (holds the key). * \param length The length (in Bytes) of the data to decrypt. * \param nonce The \c 96 Bit (\c 12 bytes) nonce/IV to use. * \param aad The buffer containing the additional authenticated data (AAD). * This pointer can be \c NULL if `aad_len == 0`. * \param aad_len The length (in bytes) of the AAD data to process. * \param tag The buffer holding the authentication tag. * This must be a readable buffer of length \c 16 Bytes. * \param input The buffer containing the data to decrypt. * This pointer can be \c NULL if `ilen == 0`. * \param output The buffer to where the decrypted data is written. * This pointer can be \c NULL if `ilen == 0`. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED * if the data was not authentic. * \return Another negative error code on other kinds of failure. */ int mbedtls_chachapoly_auth_decrypt( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char tag[16], const unsigned char *input, unsigned char *output ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The ChaCha20-Poly1305 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_chachapoly_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CHACHAPOLY_H */ fldigi-4.1.06/src/include/mbedtls/dhm.h0000664000175000017500000015313113507401434014555 00000000000000/** * \file dhm.h * * \brief This file contains Diffie-Hellman-Merkle (DHM) key exchange * definitions and functions. * * Diffie-Hellman-Merkle (DHM) key exchange is defined in * RFC-2631: Diffie-Hellman Key Agreement Method and * Public-Key Cryptography Standards (PKCS) #3: Diffie * Hellman Key Agreement Standard. * * RFC-3526: More Modular Exponential (MODP) Diffie-Hellman groups for * Internet Key Exchange (IKE) defines a number of standardized * Diffie-Hellman groups for IKE. * * RFC-5114: Additional Diffie-Hellman Groups for Use with IETF * Standards defines a number of standardized Diffie-Hellman * groups that can be used. * * \warning The security of the DHM key exchange relies on the proper choice * of prime modulus - optimally, it should be a safe prime. The usage * of non-safe primes both decreases the difficulty of the underlying * discrete logarithm problem and can lead to small subgroup attacks * leaking private exponent bits when invalid public keys are used * and not detected. This is especially relevant if the same DHM * parameters are reused for multiple key exchanges as in static DHM, * while the criticality of small-subgroup attacks is lower for * ephemeral DHM. * * \warning For performance reasons, the code does neither perform primality * nor safe primality tests, nor the expensive checks for invalid * subgroups. Moreover, even if these were performed, non-standardized * primes cannot be trusted because of the possibility of backdoors * that can't be effectively checked for. * * \warning Diffie-Hellman-Merkle is therefore a security risk when not using * standardized primes generated using a trustworthy ("nothing up * my sleeve") method, such as the RFC 3526 / 7919 primes. In the TLS * protocol, DH parameters need to be negotiated, so using the default * primes systematically is not always an option. If possible, use * Elliptic Curve Diffie-Hellman (ECDH), which has better performance, * and for which the TLS protocol mandates the use of standard * parameters. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_DHM_H #define MBEDTLS_DHM_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" /* * DHM Error codes */ #define MBEDTLS_ERR_DHM_BAD_INPUT_DATA -0x3080 /**< Bad input parameters. */ #define MBEDTLS_ERR_DHM_READ_PARAMS_FAILED -0x3100 /**< Reading of the DHM parameters failed. */ #define MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED -0x3180 /**< Making of the DHM parameters failed. */ #define MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED -0x3200 /**< Reading of the public values failed. */ #define MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED -0x3280 /**< Making of the public value failed. */ #define MBEDTLS_ERR_DHM_CALC_SECRET_FAILED -0x3300 /**< Calculation of the DHM secret failed. */ #define MBEDTLS_ERR_DHM_INVALID_FORMAT -0x3380 /**< The ASN.1 data is not formatted correctly. */ #define MBEDTLS_ERR_DHM_ALLOC_FAILED -0x3400 /**< Allocation of memory failed. */ #define MBEDTLS_ERR_DHM_FILE_IO_ERROR -0x3480 /**< Read or write of file failed. */ /* MBEDTLS_ERR_DHM_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_DHM_HW_ACCEL_FAILED -0x3500 /**< DHM hardware accelerator failed. */ #define MBEDTLS_ERR_DHM_SET_GROUP_FAILED -0x3580 /**< Setting the modulus and generator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_DHM_ALT) /** * \brief The DHM context structure. */ typedef struct mbedtls_dhm_context { size_t len; /*!< The size of \p P in Bytes. */ mbedtls_mpi P; /*!< The prime modulus. */ mbedtls_mpi G; /*!< The generator. */ mbedtls_mpi X; /*!< Our secret value. */ mbedtls_mpi GX; /*!< Our public key = \c G^X mod \c P. */ mbedtls_mpi GY; /*!< The public key of the peer = \c G^Y mod \c P. */ mbedtls_mpi K; /*!< The shared secret = \c G^(XY) mod \c P. */ mbedtls_mpi RP; /*!< The cached value = \c R^2 mod \c P. */ mbedtls_mpi Vi; /*!< The blinding value. */ mbedtls_mpi Vf; /*!< The unblinding value. */ mbedtls_mpi pX; /*!< The previous \c X. */ } mbedtls_dhm_context; #else /* MBEDTLS_DHM_ALT */ #include "dhm_alt.h" #endif /* MBEDTLS_DHM_ALT */ /** * \brief This function initializes the DHM context. * * \param ctx The DHM context to initialize. */ void mbedtls_dhm_init( mbedtls_dhm_context *ctx ); /** * \brief This function parses the DHM parameters in a * TLS ServerKeyExchange handshake message * (DHM modulus, generator, and public key). * * \note In a TLS handshake, this is the how the client * sets up its DHM context from the server's public * DHM key material. * * \param ctx The DHM context to use. This must be initialized. * \param p On input, *p must be the start of the input buffer. * On output, *p is updated to point to the end of the data * that has been read. On success, this is the first byte * past the end of the ServerKeyExchange parameters. * On error, this is the point at which an error has been * detected, which is usually not useful except to debug * failures. * \param end The end of the input buffer. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx, unsigned char **p, const unsigned char *end ); /** * \brief This function generates a DHM key pair and exports its * public part together with the DHM parameters in the format * used in a TLS ServerKeyExchange handshake message. * * \note This function assumes that the DHM parameters \c ctx->P * and \c ctx->G have already been properly set. For that, use * mbedtls_dhm_set_group() below in conjunction with * mbedtls_mpi_read_binary() and mbedtls_mpi_read_string(). * * \note In a TLS handshake, this is the how the server generates * and exports its DHM key material. * * \param ctx The DHM context to use. This must be initialized * and have the DHM parameters set. It may or may not * already have imported the peer's public key. * \param x_size The private key size in Bytes. * \param olen The address at which to store the number of Bytes * written on success. This must not be \c NULL. * \param output The destination buffer. This must be a writable buffer of * sufficient size to hold the reduced binary presentation of * the modulus, the generator and the public key, each wrapped * with a 2-byte length field. It is the responsibility of the * caller to ensure that enough space is available. Refer to * mbedtls_mpi_size() to computing the byte-size of an MPI. * \param f_rng The RNG function. Must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context parameter. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function sets the prime modulus and generator. * * \note This function can be used to set \c ctx->P, \c ctx->G * in preparation for mbedtls_dhm_make_params(). * * \param ctx The DHM context to configure. This must be initialized. * \param P The MPI holding the DHM prime modulus. This must be * an initialized MPI. * \param G The MPI holding the DHM generator. This must be an * initialized MPI. * * \return \c 0 if successful. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_set_group( mbedtls_dhm_context *ctx, const mbedtls_mpi *P, const mbedtls_mpi *G ); /** * \brief This function imports the raw public value of the peer. * * \note In a TLS handshake, this is the how the server imports * the Client's public DHM key. * * \param ctx The DHM context to use. This must be initialized and have * its DHM parameters set, e.g. via mbedtls_dhm_set_group(). * It may or may not already have generated its own private key. * \param input The input buffer containing the \c G^Y value of the peer. * This must be a readable buffer of size \p ilen Bytes. * \param ilen The size of the input buffer \p input in Bytes. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function creates a DHM key pair and exports * the raw public key in big-endian format. * * \note The destination buffer is always fully written * so as to contain a big-endian representation of G^X mod P. * If it is larger than \c ctx->len, it is padded accordingly * with zero-bytes at the beginning. * * \param ctx The DHM context to use. This must be initialized and * have the DHM parameters set. It may or may not already * have imported the peer's public key. * \param x_size The private key size in Bytes. * \param output The destination buffer. This must be a writable buffer of * size \p olen Bytes. * \param olen The length of the destination buffer. This must be at least * equal to `ctx->len` (the size of \c P). * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function derives and exports the shared secret * \c (G^Y)^X mod \c P. * * \note If \p f_rng is not \c NULL, it is used to blind the input as * a countermeasure against timing attacks. Blinding is used * only if our private key \c X is re-used, and not used * otherwise. We recommend always passing a non-NULL * \p f_rng argument. * * \param ctx The DHM context to use. This must be initialized * and have its own private key generated and the peer's * public key imported. * \param output The buffer to write the generated shared key to. This * must be a writable buffer of size \p output_size Bytes. * \param output_size The size of the destination buffer. This must be at * least the size of \c ctx->len (the size of \c P). * \param olen On exit, holds the actual number of Bytes written. * \param f_rng The RNG function, for blinding purposes. This may * b \c NULL if blinding isn't needed. * \param p_rng The RNG context. This may be \c NULL if \p f_rng * doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx, unsigned char *output, size_t output_size, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function frees and clears the components * of a DHM context. * * \param ctx The DHM context to free and clear. This may be \c NULL, * in which case this function is a no-op. If it is not \c NULL, * it must point to an initialized DHM context. */ void mbedtls_dhm_free( mbedtls_dhm_context *ctx ); #if defined(MBEDTLS_ASN1_PARSE_C) /** \ingroup x509_module */ /** * \brief This function parses DHM parameters in PEM or DER format. * * \param dhm The DHM context to import the DHM parameters into. * This must be initialized. * \param dhmin The input buffer. This must be a readable buffer of * length \p dhminlen Bytes. * \param dhminlen The size of the input buffer \p dhmin, including the * terminating \c NULL Byte for PEM data. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX or \c MBEDTLS_ERR_PEM_XXX error * code on failure. */ int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin, size_t dhminlen ); #if defined(MBEDTLS_FS_IO) /** \ingroup x509_module */ /** * \brief This function loads and parses DHM parameters from a file. * * \param dhm The DHM context to load the parameters to. * This must be initialized. * \param path The filename to read the DHM parameters from. * This must not be \c NULL. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX or \c MBEDTLS_ERR_PEM_XXX * error code on failure. */ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ); #endif /* MBEDTLS_FS_IO */ #endif /* MBEDTLS_ASN1_PARSE_C */ /** * \brief The DMH checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_dhm_self_test( int verbose ); #ifdef __cplusplus } #endif /** * RFC 3526, RFC 5114 and RFC 7919 standardize a number of * Diffie-Hellman groups, some of which are included here * for use within the SSL/TLS module and the user's convenience * when configuring the Diffie-Hellman parameters by hand * through \c mbedtls_ssl_conf_dh_param. * * The following lists the source of the above groups in the standards: * - RFC 5114 section 2.2: 2048-bit MODP Group with 224-bit Prime Order Subgroup * - RFC 3526 section 3: 2048-bit MODP Group * - RFC 3526 section 4: 3072-bit MODP Group * - RFC 3526 section 5: 4096-bit MODP Group * - RFC 7919 section A.1: ffdhe2048 * - RFC 7919 section A.2: ffdhe3072 * - RFC 7919 section A.3: ffdhe4096 * - RFC 7919 section A.4: ffdhe6144 * - RFC 7919 section A.5: ffdhe8192 * * The constants with suffix "_p" denote the chosen prime moduli, while * the constants with suffix "_g" denote the chosen generator * of the associated prime field. * * The constants further suffixed with "_bin" are provided in binary format, * while all other constants represent null-terminated strings holding the * hexadecimal presentation of the respective numbers. * * The primes from RFC 3526 and RFC 7919 have been generating by the following * trust-worthy procedure: * - Fix N in { 2048, 3072, 4096, 6144, 8192 } and consider the N-bit number * the first and last 64 bits are all 1, and the remaining N - 128 bits of * which are 0x7ff...ff. * - Add the smallest multiple of the first N - 129 bits of the binary expansion * of pi (for RFC 5236) or e (for RFC 7919) to this intermediate bit-string * such that the resulting integer is a safe-prime. * - The result is the respective RFC 3526 / 7919 prime, and the corresponding * generator is always chosen to be 2 (which is a square for these prime, * hence the corresponding subgroup has order (p-1)/2 and avoids leaking a * bit in the private exponent). * */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) /** * \warning The origin of the primes in RFC 5114 is not documented and * their use therefore constitutes a security risk! * * \deprecated The hex-encoded primes from RFC 5114 are deprecated and are * likely to be removed in a future version of the library without * replacement. */ /** * The hexadecimal presentation of the prime underlying the * 2048-bit MODP Group with 224-bit Prime Order Subgroup, as defined * in RFC-5114: Additional Diffie-Hellman Groups for Use with * IETF Standards. */ #define MBEDTLS_DHM_RFC5114_MODP_2048_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1" \ "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15" \ "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212" \ "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207" \ "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708" \ "B3BF8A317091883681286130BC8985DB1602E714415D9330" \ "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D" \ "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8" \ "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763" \ "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71" \ "CF9DE5384E71B81C0AC4DFFE0C10E64F" ) /** * The hexadecimal presentation of the chosen generator of the 2048-bit MODP * Group with 224-bit Prime Order Subgroup, as defined in RFC-5114: * Additional Diffie-Hellman Groups for Use with IETF Standards. */ #define MBEDTLS_DHM_RFC5114_MODP_2048_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF" \ "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA" \ "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7" \ "C17669101999024AF4D027275AC1348BB8A762D0521BC98A" \ "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE" \ "F180EB34118E98D119529A45D6F834566E3025E316A330EF" \ "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB" \ "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381" \ "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269" \ "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179" \ "81BC087F2A7065B384B890D3191F2BFA" ) /** * The hexadecimal presentation of the prime underlying the 2048-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). * * \deprecated The hex-encoded primes from RFC 3625 are deprecated and * superseded by the corresponding macros providing them as * binary constants. Their hex-encoded constants are likely * to be removed in a future version of the library. * */ #define MBEDTLS_DHM_RFC3526_MODP_2048_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ "15728E5A8AACAA68FFFFFFFFFFFFFFFF" ) /** * The hexadecimal presentation of the chosen generator of the 2048-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_2048_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( "02" ) /** * The hexadecimal presentation of the prime underlying the 3072-bit MODP * Group, as defined in RFC-3072: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_3072_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF" ) /** * The hexadecimal presentation of the chosen generator of the 3072-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_3072_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( "02" ) /** * The hexadecimal presentation of the prime underlying the 4096-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_4096_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" \ "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" \ "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" \ "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" \ "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" \ "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" \ "FFFFFFFFFFFFFFFF" ) /** * The hexadecimal presentation of the chosen generator of the 4096-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_4096_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( "02" ) #endif /* MBEDTLS_DEPRECATED_REMOVED */ /* * Trustworthy DHM parameters in binary form */ #define MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC3526_MODP_3072_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, \ 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, \ 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, \ 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, \ 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, \ 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, \ 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, \ 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, \ 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, \ 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, \ 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, \ 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, \ 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, \ 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, \ 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, \ 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, \ 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC3526_MODP_3072_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC3526_MODP_4096_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, \ 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, \ 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, \ 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, \ 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, \ 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, \ 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, \ 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, \ 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, \ 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, \ 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, \ 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, \ 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, \ 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, \ 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, \ 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, \ 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, \ 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, \ 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, \ 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, \ 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, \ 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, \ 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, \ 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, \ 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, \ 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, \ 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, \ 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, \ 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, \ 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, \ 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, \ 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, \ 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC3526_MODP_4096_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE2048_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, } #define MBEDTLS_DHM_RFC7919_FFDHE2048_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE3072_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0xC6, 0x2E, 0x37, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE3072_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE4096_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x65, 0x5F, 0x6A, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE4096_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE6144_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02, \ 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A, \ 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A, \ 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6, \ 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8, \ 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C, \ 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A, \ 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71, \ 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F, \ 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77, \ 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10, \ 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8, \ 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3, \ 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E, \ 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3, \ 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4, \ 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1, \ 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92, \ 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6, \ 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82, \ 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE, \ 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C, \ 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E, \ 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46, \ 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A, \ 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17, \ 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03, \ 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04, \ 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6, \ 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69, \ 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1, \ 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4, \ 0xA4, 0x0E, 0x32, 0x9C, 0xD0, 0xE4, 0x0E, 0x65, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE6144_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE8192_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02, \ 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A, \ 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A, \ 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6, \ 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8, \ 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C, \ 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A, \ 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71, \ 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F, \ 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77, \ 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10, \ 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8, \ 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3, \ 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E, \ 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3, \ 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4, \ 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1, \ 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92, \ 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6, \ 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82, \ 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE, \ 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C, \ 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E, \ 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46, \ 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A, \ 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17, \ 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03, \ 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04, \ 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6, \ 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69, \ 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1, \ 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4, \ 0xA4, 0x0E, 0x32, 0x9C, 0xCF, 0xF4, 0x6A, 0xAA, \ 0x36, 0xAD, 0x00, 0x4C, 0xF6, 0x00, 0xC8, 0x38, \ 0x1E, 0x42, 0x5A, 0x31, 0xD9, 0x51, 0xAE, 0x64, \ 0xFD, 0xB2, 0x3F, 0xCE, 0xC9, 0x50, 0x9D, 0x43, \ 0x68, 0x7F, 0xEB, 0x69, 0xED, 0xD1, 0xCC, 0x5E, \ 0x0B, 0x8C, 0xC3, 0xBD, 0xF6, 0x4B, 0x10, 0xEF, \ 0x86, 0xB6, 0x31, 0x42, 0xA3, 0xAB, 0x88, 0x29, \ 0x55, 0x5B, 0x2F, 0x74, 0x7C, 0x93, 0x26, 0x65, \ 0xCB, 0x2C, 0x0F, 0x1C, 0xC0, 0x1B, 0xD7, 0x02, \ 0x29, 0x38, 0x88, 0x39, 0xD2, 0xAF, 0x05, 0xE4, \ 0x54, 0x50, 0x4A, 0xC7, 0x8B, 0x75, 0x82, 0x82, \ 0x28, 0x46, 0xC0, 0xBA, 0x35, 0xC3, 0x5F, 0x5C, \ 0x59, 0x16, 0x0C, 0xC0, 0x46, 0xFD, 0x82, 0x51, \ 0x54, 0x1F, 0xC6, 0x8C, 0x9C, 0x86, 0xB0, 0x22, \ 0xBB, 0x70, 0x99, 0x87, 0x6A, 0x46, 0x0E, 0x74, \ 0x51, 0xA8, 0xA9, 0x31, 0x09, 0x70, 0x3F, 0xEE, \ 0x1C, 0x21, 0x7E, 0x6C, 0x38, 0x26, 0xE5, 0x2C, \ 0x51, 0xAA, 0x69, 0x1E, 0x0E, 0x42, 0x3C, 0xFC, \ 0x99, 0xE9, 0xE3, 0x16, 0x50, 0xC1, 0x21, 0x7B, \ 0x62, 0x48, 0x16, 0xCD, 0xAD, 0x9A, 0x95, 0xF9, \ 0xD5, 0xB8, 0x01, 0x94, 0x88, 0xD9, 0xC0, 0xA0, \ 0xA1, 0xFE, 0x30, 0x75, 0xA5, 0x77, 0xE2, 0x31, \ 0x83, 0xF8, 0x1D, 0x4A, 0x3F, 0x2F, 0xA4, 0x57, \ 0x1E, 0xFC, 0x8C, 0xE0, 0xBA, 0x8A, 0x4F, 0xE8, \ 0xB6, 0x85, 0x5D, 0xFE, 0x72, 0xB0, 0xA6, 0x6E, \ 0xDE, 0xD2, 0xFB, 0xAB, 0xFB, 0xE5, 0x8A, 0x30, \ 0xFA, 0xFA, 0xBE, 0x1C, 0x5D, 0x71, 0xA8, 0x7E, \ 0x2F, 0x74, 0x1E, 0xF8, 0xC1, 0xFE, 0x86, 0xFE, \ 0xA6, 0xBB, 0xFD, 0xE5, 0x30, 0x67, 0x7F, 0x0D, \ 0x97, 0xD1, 0x1D, 0x49, 0xF7, 0xA8, 0x44, 0x3D, \ 0x08, 0x22, 0xE5, 0x06, 0xA9, 0xF4, 0x61, 0x4E, \ 0x01, 0x1E, 0x2A, 0x94, 0x83, 0x8F, 0xF8, 0x8C, \ 0xD6, 0x8C, 0x8B, 0xB7, 0xC5, 0xC6, 0x42, 0x4C, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE8192_G_BIN { 0x02 } #endif /* dhm.h */ fldigi-4.1.06/src/include/mbedtls/sha512.h0000664000175000017500000002610313507401434015006 00000000000000/** * \file sha512.h * \brief This file contains SHA-384 and SHA-512 definitions and functions. * * The Secure Hash Algorithms 384 and 512 (SHA-384 and SHA-512) cryptographic * hash functions are defined in FIPS 180-4: Secure Hash Standard (SHS). */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SHA512_H #define MBEDTLS_SHA512_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED -0x0039 /**< SHA-512 hardware accelerator failed */ #define MBEDTLS_ERR_SHA512_BAD_INPUT_DATA -0x0075 /**< SHA-512 input data was malformed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_SHA512_ALT) // Regular implementation // /** * \brief The SHA-512 context structure. * * The structure is used both for SHA-384 and for SHA-512 * checksum calculations. The choice between these two is * made in the call to mbedtls_sha512_starts_ret(). */ typedef struct mbedtls_sha512_context { uint64_t total[2]; /*!< The number of Bytes processed. */ uint64_t state[8]; /*!< The intermediate digest state. */ unsigned char buffer[128]; /*!< The data block being processed. */ int is384; /*!< Determines which function to use: 0: Use SHA-512, or 1: Use SHA-384. */ } mbedtls_sha512_context; #else /* MBEDTLS_SHA512_ALT */ #include "sha512_alt.h" #endif /* MBEDTLS_SHA512_ALT */ /** * \brief This function initializes a SHA-512 context. * * \param ctx The SHA-512 context to initialize. This must * not be \c NULL. */ void mbedtls_sha512_init( mbedtls_sha512_context *ctx ); /** * \brief This function clears a SHA-512 context. * * \param ctx The SHA-512 context to clear. This may be \c NULL, * in which case this function does nothing. If it * is not \c NULL, it must point to an initialized * SHA-512 context. */ void mbedtls_sha512_free( mbedtls_sha512_context *ctx ); /** * \brief This function clones the state of a SHA-512 context. * * \param dst The destination context. This must be initialized. * \param src The context to clone. This must be initialized. */ void mbedtls_sha512_clone( mbedtls_sha512_context *dst, const mbedtls_sha512_context *src ); /** * \brief This function starts a SHA-384 or SHA-512 checksum * calculation. * * \param ctx The SHA-512 context to use. This must be initialized. * \param is384 Determines which function to use. This must be * either \c for SHA-512, or \c 1 for SHA-384. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-512 checksum calculation. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the input data. This must * be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-512 operation, and writes * the result to the output buffer. This function is for * internal use only. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param output The SHA-384 or SHA-512 checksum result. * This must be a writable buffer of length \c 64 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx, unsigned char output[64] ); /** * \brief This function processes a single data block within * the ongoing SHA-512 computation. * * \param ctx The SHA-512 context. This must be initialized. * \param data The buffer holding one block of data. This * must be a readable buffer of length \c 128 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function starts a SHA-384 or SHA-512 checksum * calculation. * * \deprecated Superseded by mbedtls_sha512_starts_ret() in 2.7.0 * * \param ctx The SHA-512 context to use. This must be initialized. * \param is384 Determines which function to use. This must be either * \c 0 for SHA-512 or \c 1 for SHA-384. */ MBEDTLS_DEPRECATED void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-512 checksum calculation. * * \deprecated Superseded by mbedtls_sha512_update_ret() in 2.7.0. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-512 operation, and writes * the result to the output buffer. * * \deprecated Superseded by mbedtls_sha512_finish_ret() in 2.7.0. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param output The SHA-384 or SHA-512 checksum result. This must * be a writable buffer of size \c 64 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] ); /** * \brief This function processes a single data block within * the ongoing SHA-512 computation. This function is for * internal use only. * * \deprecated Superseded by mbedtls_internal_sha512_process() in 2.7.0. * * \param ctx The SHA-512 context. This must be initialized. * \param data The buffer holding one block of data. This must be * a readable buffer of length \c 128 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function calculates the SHA-512 or SHA-384 * checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-512 result is calculated as * output = SHA-512(input buffer). * * \param input The buffer holding the input data. This must be * a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-384 or SHA-512 checksum result. * This must be a writable buffer of length \c 64 Bytes. * \param is384 Determines which function to use. This must be either * \c 0 for SHA-512, or \c 1 for SHA-384. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_ret( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function calculates the SHA-512 or SHA-384 * checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-512 result is calculated as * output = SHA-512(input buffer). * * \deprecated Superseded by mbedtls_sha512_ret() in 2.7.0 * * \param input The buffer holding the data. This must be a * readable buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-384 or SHA-512 checksum result. This must * be a writable buffer of length \c 64 Bytes. * \param is384 Determines which function to use. This must be either * \c 0 for SHA-512, or \c 1 for SHA-384. */ MBEDTLS_DEPRECATED void mbedtls_sha512( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief The SHA-384 or SHA-512 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_sha512_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_sha512.h */ fldigi-4.1.06/src/include/mbedtls/cipher_internal.h0000664000175000017500000000763213507401434017157 00000000000000/** * \file cipher_internal.h * * \brief Cipher wrappers. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CIPHER_WRAP_H #define MBEDTLS_CIPHER_WRAP_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "cipher.h" #ifdef __cplusplus extern "C" { #endif /** * Base cipher information. The non-mode specific functions and values. */ struct mbedtls_cipher_base_t { /** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */ mbedtls_cipher_id_t cipher; /** Encrypt using ECB */ int (*ecb_func)( void *ctx, mbedtls_operation_t mode, const unsigned char *input, unsigned char *output ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** Encrypt using CBC */ int (*cbc_func)( void *ctx, mbedtls_operation_t mode, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) /** Encrypt using CFB (Full length) */ int (*cfb_func)( void *ctx, mbedtls_operation_t mode, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) /** Encrypt using OFB (Full length) */ int (*ofb_func)( void *ctx, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) /** Encrypt using CTR */ int (*ctr_func)( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) /** Encrypt or decrypt using XTS. */ int (*xts_func)( void *ctx, mbedtls_operation_t mode, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) /** Encrypt using STREAM */ int (*stream_func)( void *ctx, size_t length, const unsigned char *input, unsigned char *output ); #endif /** Set key for encryption purposes */ int (*setkey_enc_func)( void *ctx, const unsigned char *key, unsigned int key_bitlen ); /** Set key for decryption purposes */ int (*setkey_dec_func)( void *ctx, const unsigned char *key, unsigned int key_bitlen); /** Allocate a new context */ void * (*ctx_alloc_func)( void ); /** Free the given context */ void (*ctx_free_func)( void *ctx ); }; typedef struct { mbedtls_cipher_type_t type; const mbedtls_cipher_info_t *info; } mbedtls_cipher_definition_t; extern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[]; extern int mbedtls_cipher_supported[]; #ifdef __cplusplus } #endif #endif /* MBEDTLS_CIPHER_WRAP_H */ fldigi-4.1.06/src/include/mbedtls/net.h0000664000175000017500000000242113507401434014566 00000000000000/** * \file net.h * * \brief Deprecated header file that includes net_sockets.h * * \deprecated Superseded by mbedtls/net_sockets.h */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #include "net_sockets.h" #if defined(MBEDTLS_DEPRECATED_WARNING) #warning "Deprecated header file: Superseded by mbedtls/net_sockets.h" #endif /* MBEDTLS_DEPRECATED_WARNING */ #endif /* !MBEDTLS_DEPRECATED_REMOVED */ fldigi-4.1.06/src/include/mbedtls/ssl_cache.h0000664000175000017500000001040713507401434015727 00000000000000/** * \file ssl_cache.h * * \brief SSL session cache implementation */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_CACHE_H #define MBEDTLS_SSL_CACHE_H #include "ssl.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT) #define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /*!< 1 day */ #endif #if !defined(MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES) #define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /*!< Maximum entries in cache */ #endif /* \} name SECTION: Module settings */ #ifdef __cplusplus extern "C" { #endif typedef struct mbedtls_ssl_cache_context mbedtls_ssl_cache_context; typedef struct mbedtls_ssl_cache_entry mbedtls_ssl_cache_entry; /** * \brief This structure is used for storing cache entries */ struct mbedtls_ssl_cache_entry { #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t timestamp; /*!< entry timestamp */ #endif mbedtls_ssl_session session; /*!< entry session */ #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_x509_buf peer_cert; /*!< entry peer_cert */ #endif mbedtls_ssl_cache_entry *next; /*!< chain pointer */ }; /** * \brief Cache context */ struct mbedtls_ssl_cache_context { mbedtls_ssl_cache_entry *chain; /*!< start of the chain */ int timeout; /*!< cache entry timeout */ int max_entries; /*!< maximum entries */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; /*!< mutex */ #endif }; /** * \brief Initialize an SSL cache context * * \param cache SSL cache context */ void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache ); /** * \brief Cache get callback implementation * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param data SSL cache context * \param session session to retrieve entry for */ int mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session ); /** * \brief Cache set callback implementation * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param data SSL cache context * \param session session to store entry for */ int mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session ); #if defined(MBEDTLS_HAVE_TIME) /** * \brief Set the cache timeout * (Default: MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT (1 day)) * * A timeout of 0 indicates no timeout. * * \param cache SSL cache context * \param timeout cache entry timeout in seconds */ void mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout ); #endif /* MBEDTLS_HAVE_TIME */ /** * \brief Set the maximum number of cache entries * (Default: MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES (50)) * * \param cache SSL cache context * \param max cache entry maximum */ void mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max ); /** * \brief Free referenced items in a cache context and clear memory * * \param cache SSL cache context */ void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache ); #ifdef __cplusplus } #endif #endif /* ssl_cache.h */ fldigi-4.1.06/src/include/mbedtls/rsa_internal.h0000664000175000017500000002171613507401434016471 00000000000000/** * \file rsa_internal.h * * \brief Context-independent RSA helper functions * * This module declares some RSA-related helper functions useful when * implementing the RSA interface. These functions are provided in a separate * compilation unit in order to make it easy for designers of alternative RSA * implementations to use them in their own code, as it is conceived that the * functionality they provide will be necessary for most complete * implementations. * * End-users of Mbed TLS who are not providing their own alternative RSA * implementations should not use these functions directly, and should instead * use only the functions declared in rsa.h. * * The interface provided by this module will be maintained through LTS (Long * Term Support) branches of Mbed TLS, but may otherwise be subject to change, * and must be considered an internal interface of the library. * * There are two classes of helper functions: * * (1) Parameter-generating helpers. These are: * - mbedtls_rsa_deduce_primes * - mbedtls_rsa_deduce_private_exponent * - mbedtls_rsa_deduce_crt * Each of these functions takes a set of core RSA parameters and * generates some other, or CRT related parameters. * * (2) Parameter-checking helpers. These are: * - mbedtls_rsa_validate_params * - mbedtls_rsa_validate_crt * They take a set of core or CRT related RSA parameters and check their * validity. * */ /* * Copyright (C) 2006-2017, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_RSA_INTERNAL_H #define MBEDTLS_RSA_INTERNAL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" #ifdef __cplusplus extern "C" { #endif /** * \brief Compute RSA prime moduli P, Q from public modulus N=PQ * and a pair of private and public key. * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param N RSA modulus N = PQ, with P, Q to be found * \param E RSA public exponent * \param D RSA private exponent * \param P Pointer to MPI holding first prime factor of N on success * \param Q Pointer to MPI holding second prime factor of N on success * * \return * - 0 if successful. In this case, P and Q constitute a * factorization of N. * - A non-zero error code otherwise. * * \note It is neither checked that P, Q are prime nor that * D, E are modular inverses wrt. P-1 and Q-1. For that, * use the helper function \c mbedtls_rsa_validate_params. * */ int mbedtls_rsa_deduce_primes( mbedtls_mpi const *N, mbedtls_mpi const *E, mbedtls_mpi const *D, mbedtls_mpi *P, mbedtls_mpi *Q ); /** * \brief Compute RSA private exponent from * prime moduli and public key. * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param P First prime factor of RSA modulus * \param Q Second prime factor of RSA modulus * \param E RSA public exponent * \param D Pointer to MPI holding the private exponent on success. * * \return * - 0 if successful. In this case, D is set to a simultaneous * modular inverse of E modulo both P-1 and Q-1. * - A non-zero error code otherwise. * * \note This function does not check whether P and Q are primes. * */ int mbedtls_rsa_deduce_private_exponent( mbedtls_mpi const *P, mbedtls_mpi const *Q, mbedtls_mpi const *E, mbedtls_mpi *D ); /** * \brief Generate RSA-CRT parameters * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param P First prime factor of N * \param Q Second prime factor of N * \param D RSA private exponent * \param DP Output variable for D modulo P-1 * \param DQ Output variable for D modulo Q-1 * \param QP Output variable for the modular inverse of Q modulo P. * * \return 0 on success, non-zero error code otherwise. * * \note This function does not check whether P, Q are * prime and whether D is a valid private exponent. * */ int mbedtls_rsa_deduce_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ); /** * \brief Check validity of core RSA parameters * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param N RSA modulus N = PQ * \param P First prime factor of N * \param Q Second prime factor of N * \param D RSA private exponent * \param E RSA public exponent * \param f_rng PRNG to be used for primality check, or NULL * \param p_rng PRNG context for f_rng, or NULL * * \return * - 0 if the following conditions are satisfied * if all relevant parameters are provided: * - P prime if f_rng != NULL (%) * - Q prime if f_rng != NULL (%) * - 1 < N = P * Q * - 1 < D, E < N * - D and E are modular inverses modulo P-1 and Q-1 * (%) This is only done if MBEDTLS_GENPRIME is defined. * - A non-zero error code otherwise. * * \note The function can be used with a restricted set of arguments * to perform specific checks only. E.g., calling it with * (-,P,-,-,-) and a PRNG amounts to a primality check for P. */ int mbedtls_rsa_validate_params( const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Check validity of RSA CRT parameters * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param P First prime factor of RSA modulus * \param Q Second prime factor of RSA modulus * \param D RSA private exponent * \param DP MPI to check for D modulo P-1 * \param DQ MPI to check for D modulo P-1 * \param QP MPI to check for the modular inverse of Q modulo P. * * \return * - 0 if the following conditions are satisfied: * - D = DP mod P-1 if P, D, DP != NULL * - Q = DQ mod P-1 if P, D, DQ != NULL * - QP = Q^-1 mod P if P, Q, QP != NULL * - \c MBEDTLS_ERR_RSA_KEY_CHECK_FAILED if check failed, * potentially including \c MBEDTLS_ERR_MPI_XXX if some * MPI calculations failed. * - \c MBEDTLS_ERR_RSA_BAD_INPUT_DATA if insufficient * data was provided to check DP, DQ or QP. * * \note The function can be used with a restricted set of arguments * to perform specific checks only. E.g., calling it with the * parameters (P, -, D, DP, -, -) will check DP = D mod P-1. */ int mbedtls_rsa_validate_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *DP, const mbedtls_mpi *DQ, const mbedtls_mpi *QP ); #ifdef __cplusplus } #endif #endif /* rsa_internal.h */ fldigi-4.1.06/src/include/mbedtls/asn1write.h0000664000175000017500000003222413507401434015721 00000000000000/** * \file asn1write.h * * \brief ASN.1 buffer writing functionality */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ASN1_WRITE_H #define MBEDTLS_ASN1_WRITE_H #include "asn1.h" #define MBEDTLS_ASN1_CHK_ADD(g, f) \ do { \ if( ( ret = f ) < 0 ) \ return( ret ); \ else \ g += ret; \ } while( 0 ) #ifdef __cplusplus extern "C" { #endif /** * \brief Write a length field in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param len The length value to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len ); /** * \brief Write an ASN.1 tag in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param tag The tag to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag ); /** * \brief Write raw buffer data. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param buf The data buffer to write. * \param size The length of the data buffer. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ); #if defined(MBEDTLS_BIGNUM_C) /** * \brief Write a arbitrary-precision number (#MBEDTLS_ASN1_INTEGER) * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param X The MPI to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X ); #endif /* MBEDTLS_BIGNUM_C */ /** * \brief Write a NULL tag (#MBEDTLS_ASN1_NULL) with zero data * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start ); /** * \brief Write an OID tag (#MBEDTLS_ASN1_OID) and data * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param oid The OID to write. * \param oid_len The length of the OID. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len ); /** * \brief Write an AlgorithmIdentifier sequence in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param oid The OID of the algorithm to write. * \param oid_len The length of the algorithm's OID. * \param par_len The length of the parameters, which must be already written. * If 0, NULL parameters are added * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, size_t par_len ); /** * \brief Write a boolean tag (#MBEDTLS_ASN1_BOOLEAN) and value * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param boolean The boolean value to write, either \c 0 or \c 1. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean ); /** * \brief Write an int tag (#MBEDTLS_ASN1_INTEGER) and value * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param val The integer value to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val ); /** * \brief Write a string in ASN.1 format using a specific * string encoding tag. * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param tag The string encoding tag to write, e.g. * #MBEDTLS_ASN1_UTF8_STRING. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_tagged_string( unsigned char **p, unsigned char *start, int tag, const char *text, size_t text_len ); /** * \brief Write a string in ASN.1 format using the PrintableString * string encoding tag (#MBEDTLS_ASN1_PRINTABLE_STRING). * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ); /** * \brief Write a UTF8 string in ASN.1 format using the UTF8String * string encoding tag (#MBEDTLS_ASN1_PRINTABLE_STRING). * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_utf8_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ); /** * \brief Write a string in ASN.1 format using the IA5String * string encoding tag (#MBEDTLS_ASN1_IA5_STRING). * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ); /** * \brief Write a bitstring tag (#MBEDTLS_ASN1_BIT_STRING) and * value in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param buf The bitstring to write. * \param bits The total number of bits in the bitstring. * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t bits ); /** * \brief Write an octet string tag (#MBEDTLS_ASN1_OCTET_STRING) * and value in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param buf The buffer holding the data to write. * \param size The length of the data buffer \p buf. * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ); /** * \brief Create or find a specific named_data entry for writing in a * sequence or list based on the OID. If not already in there, * a new entry is added to the head of the list. * Warning: Destructive behaviour for the val data! * * \param list The pointer to the location of the head of the list to seek * through (will be updated in case of a new entry). * \param oid The OID to look for. * \param oid_len The size of the OID. * \param val The data to store (can be \c NULL if you want to fill * it by hand). * \param val_len The minimum length of the data buffer needed. * * \return A pointer to the new / existing entry on success. * \return \c NULL if if there was a memory allocation error. */ mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **list, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_ASN1_WRITE_H */ fldigi-4.1.06/src/include/mbedtls/platform_time.h0000664000175000017500000000435713507401434016654 00000000000000/** * \file platform_time.h * * \brief mbed TLS Platform time abstraction */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PLATFORM_TIME_H #define MBEDTLS_PLATFORM_TIME_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #ifdef __cplusplus extern "C" { #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ /* * The time_t datatype */ #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) typedef MBEDTLS_PLATFORM_TIME_TYPE_MACRO mbedtls_time_t; #else /* For time_t */ #include typedef time_t mbedtls_time_t; #endif /* MBEDTLS_PLATFORM_TIME_TYPE_MACRO */ /* * The function pointers for time */ #if defined(MBEDTLS_PLATFORM_TIME_ALT) extern mbedtls_time_t (*mbedtls_time)( mbedtls_time_t* time ); /** * \brief Set your own time function pointer * * \param time_func the time function implementation * * \return 0 */ int mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* time ) ); #else #if defined(MBEDTLS_PLATFORM_TIME_MACRO) #define mbedtls_time MBEDTLS_PLATFORM_TIME_MACRO #else #define mbedtls_time time #endif /* MBEDTLS_PLATFORM_TIME_MACRO */ #endif /* MBEDTLS_PLATFORM_TIME_ALT */ #ifdef __cplusplus } #endif #endif /* platform_time.h */ fldigi-4.1.06/src/include/mbedtls/entropy.h0000664000175000017500000002321213507401434015501 00000000000000/** * \file entropy.h * * \brief Entropy accumulator implementation */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ENTROPY_H #define MBEDTLS_ENTROPY_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) #include "sha512.h" #define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR #else #if defined(MBEDTLS_SHA256_C) #define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR #include "sha256.h" #endif #endif #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif #if defined(MBEDTLS_HAVEGE_C) #include "havege.h" #endif #define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -0x003C /**< Critical entropy source failure. */ #define MBEDTLS_ERR_ENTROPY_MAX_SOURCES -0x003E /**< No more sources can be added. */ #define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040 /**< No sources have been added to poll. */ #define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE -0x003D /**< No strong sources have been added to poll. */ #define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -0x003F /**< Read/write error in file. */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_ENTROPY_MAX_SOURCES) #define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ #endif #if !defined(MBEDTLS_ENTROPY_MAX_GATHER) #define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ #endif /* \} name SECTION: Module settings */ #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) #define MBEDTLS_ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */ #else #define MBEDTLS_ENTROPY_BLOCK_SIZE 32 /**< Block size of entropy accumulator (SHA-256) */ #endif #define MBEDTLS_ENTROPY_MAX_SEED_SIZE 1024 /**< Maximum size of seed we read from seed file */ #define MBEDTLS_ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_MAX_SOURCES #define MBEDTLS_ENTROPY_SOURCE_STRONG 1 /**< Entropy source is strong */ #define MBEDTLS_ENTROPY_SOURCE_WEAK 0 /**< Entropy source is weak */ #ifdef __cplusplus extern "C" { #endif /** * \brief Entropy poll callback pointer * * \param data Callback-specific data pointer * \param output Data to fill * \param len Maximum size to provide * \param olen The actual amount of bytes put into the buffer (Can be 0) * * \return 0 if no critical failures occurred, * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise */ typedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len, size_t *olen); /** * \brief Entropy source state */ typedef struct mbedtls_entropy_source_state { mbedtls_entropy_f_source_ptr f_source; /**< The entropy source callback */ void * p_source; /**< The callback data pointer */ size_t size; /**< Amount received in bytes */ size_t threshold; /**< Minimum bytes required before release */ int strong; /**< Is the source strong? */ } mbedtls_entropy_source_state; /** * \brief Entropy context structure */ typedef struct mbedtls_entropy_context { int accumulator_started; #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) mbedtls_sha512_context accumulator; #else mbedtls_sha256_context accumulator; #endif int source_count; mbedtls_entropy_source_state source[MBEDTLS_ENTROPY_MAX_SOURCES]; #if defined(MBEDTLS_HAVEGE_C) mbedtls_havege_state havege_data; #endif #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; /*!< mutex */ #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) int initial_entropy_run; #endif } mbedtls_entropy_context; /** * \brief Initialize the context * * \param ctx Entropy context to initialize */ void mbedtls_entropy_init( mbedtls_entropy_context *ctx ); /** * \brief Free the data in the context * * \param ctx Entropy context to free */ void mbedtls_entropy_free( mbedtls_entropy_context *ctx ); /** * \brief Adds an entropy source to poll * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param ctx Entropy context * \param f_source Entropy function * \param p_source Function data * \param threshold Minimum required from source before entropy is released * ( with mbedtls_entropy_func() ) (in bytes) * \param strong MBEDTLS_ENTROPY_SOURCE_STRONG or * MBEDTLS_ENTROPY_SOURCE_WEAK. * At least one strong source needs to be added. * Weaker sources (such as the cycle counter) can be used as * a complement. * * \return 0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES */ int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, mbedtls_entropy_f_source_ptr f_source, void *p_source, size_t threshold, int strong ); /** * \brief Trigger an extra gather poll for the accumulator * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param ctx Entropy context * * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_gather( mbedtls_entropy_context *ctx ); /** * \brief Retrieve entropy from the accumulator * (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE) * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param data Entropy context * \param output Buffer to fill * \param len Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE * * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_func( void *data, unsigned char *output, size_t len ); /** * \brief Add data to the accumulator manually * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param ctx Entropy context * \param data Data to add * \param len Length of data * * \return 0 if successful */ int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx, const unsigned char *data, size_t len ); #if defined(MBEDTLS_ENTROPY_NV_SEED) /** * \brief Trigger an update of the seed file in NV by using the * current entropy pool. * * \param ctx Entropy context * * \return 0 if successful */ int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx ); #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if defined(MBEDTLS_FS_IO) /** * \brief Write a seed file * * \param ctx Entropy context * \param path Name of the file * * \return 0 if successful, * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path ); /** * \brief Read and update a seed file. Seed is added to this * instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are * read from the seed file. The rest is ignored. * * \param ctx Entropy context * \param path Name of the file * * \return 0 if successful, * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * This module self-test also calls the entropy self-test, * mbedtls_entropy_source_self_test(); * * \return 0 if successful, or 1 if a test failed */ int mbedtls_entropy_self_test( int verbose ); #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) /** * \brief Checkup routine * * Verifies the integrity of the hardware entropy source * provided by the function 'mbedtls_hardware_poll()'. * * Note this is the only hardware entropy source that is known * at link time, and other entropy sources configured * dynamically at runtime by the function * mbedtls_entropy_add_source() will not be tested. * * \return 0 if successful, or 1 if a test failed */ int mbedtls_entropy_source_self_test( int verbose ); #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* entropy.h */ fldigi-4.1.06/src/include/mbedtls/padlock.h0000664000175000017500000000754613507401434015432 00000000000000/** * \file padlock.h * * \brief VIA PadLock ACE for HW encryption/decryption supported by some * processors * * \warning These functions are only for internal use by other library * functions; you must not call them directly. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PADLOCK_H #define MBEDTLS_PADLOCK_H #include "aes.h" #define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ #if defined(__has_feature) #if __has_feature(address_sanitizer) #define MBEDTLS_HAVE_ASAN #endif #endif /* Some versions of ASan result in errors about not enough registers */ #if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) && \ !defined(MBEDTLS_HAVE_ASAN) #ifndef MBEDTLS_HAVE_X86 #define MBEDTLS_HAVE_X86 #endif #include #define MBEDTLS_PADLOCK_RNG 0x000C #define MBEDTLS_PADLOCK_ACE 0x00C0 #define MBEDTLS_PADLOCK_PHE 0x0C00 #define MBEDTLS_PADLOCK_PMM 0x3000 #define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) x & ~15)) #ifdef __cplusplus extern "C" { #endif /** * \brief Internal PadLock detection routine * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param feature The feature to detect * * \return 1 if CPU has support for the feature, 0 otherwise */ int mbedtls_padlock_has_support( int feature ); /** * \brief Internal PadLock AES-ECB block en(de)cryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param ctx AES context * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT * \param input 16-byte input block * \param output 16-byte output block * * \return 0 if success, 1 if operation failed */ int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); /** * \brief Internal PadLock AES-CBC buffer en(de)cryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param ctx AES context * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT * \param length length of the input data * \param iv initialization vector (updated after use) * \param input buffer holding the input data * \param output buffer holding the output data * * \return 0 if success, 1 if operation failed */ int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #ifdef __cplusplus } #endif #endif /* HAVE_X86 */ #endif /* padlock.h */ fldigi-4.1.06/src/include/mbedtls/hkdf.h0000664000175000017500000001324513507401434014722 00000000000000/** * \file hkdf.h * * \brief This file contains the HKDF interface. * * The HMAC-based Extract-and-Expand Key Derivation Function (HKDF) is * specified by RFC 5869. */ /* * Copyright (C) 2016-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_HKDF_H #define MBEDTLS_HKDF_H #include "md.h" /** * \name HKDF Error codes * \{ */ #define MBEDTLS_ERR_HKDF_BAD_INPUT_DATA -0x5F80 /**< Bad input parameters to function. */ /* \} name */ #ifdef __cplusplus extern "C" { #endif /** * \brief This is the HMAC-based Extract-and-Expand Key Derivation Function * (HKDF). * * \param md A hash function; md.size denotes the length of the hash * function output in bytes. * \param salt An optional salt value (a non-secret random value); * if the salt is not provided, a string of all zeros of * md.size length is used as the salt. * \param salt_len The length in bytes of the optional \p salt. * \param ikm The input keying material. * \param ikm_len The length in bytes of \p ikm. * \param info An optional context and application specific information * string. This can be a zero-length string. * \param info_len The length of \p info in bytes. * \param okm The output keying material of \p okm_len bytes. * \param okm_len The length of the output keying material in bytes. This * must be less than or equal to 255 * md.size bytes. * * \return 0 on success. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying * MD layer. */ int mbedtls_hkdf( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ); /** * \brief Take the input keying material \p ikm and extract from it a * fixed-length pseudorandom key \p prk. * * \warning This function should only be used if the security of it has been * studied and established in that particular context (eg. TLS 1.3 * key schedule). For standard HKDF security guarantees use * \c mbedtls_hkdf instead. * * \param md A hash function; md.size denotes the length of the * hash function output in bytes. * \param salt An optional salt value (a non-secret random value); * if the salt is not provided, a string of all zeros * of md.size length is used as the salt. * \param salt_len The length in bytes of the optional \p salt. * \param ikm The input keying material. * \param ikm_len The length in bytes of \p ikm. * \param[out] prk A pseudorandom key of at least md.size bytes. * * \return 0 on success. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying * MD layer. */ int mbedtls_hkdf_extract( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, unsigned char *prk ); /** * \brief Expand the supplied \p prk into several additional pseudorandom * keys, which is the output of the HKDF. * * \warning This function should only be used if the security of it has been * studied and established in that particular context (eg. TLS 1.3 * key schedule). For standard HKDF security guarantees use * \c mbedtls_hkdf instead. * * \param md A hash function; md.size denotes the length of the hash * function output in bytes. * \param prk A pseudorandom key of at least md.size bytes. \p prk is * usually the output from the HKDF extract step. * \param prk_len The length in bytes of \p prk. * \param info An optional context and application specific information * string. This can be a zero-length string. * \param info_len The length of \p info in bytes. * \param okm The output keying material of \p okm_len bytes. * \param okm_len The length of the output keying material in bytes. This * must be less than or equal to 255 * md.size bytes. * * \return 0 on success. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying * MD layer. */ int mbedtls_hkdf_expand( const mbedtls_md_info_t *md, const unsigned char *prk, size_t prk_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ); #ifdef __cplusplus } #endif #endif /* hkdf.h */ fldigi-4.1.06/src/include/mbedtls/x509_crl.h0000664000175000017500000001254513507401434015355 00000000000000/** * \file x509_crl.h * * \brief X.509 certificate revocation list parsing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_CRL_H #define MBEDTLS_X509_CRL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "x509.h" #ifdef __cplusplus extern "C" { #endif /** * \addtogroup x509_module * \{ */ /** * \name Structures and functions for parsing CRLs * \{ */ /** * Certificate revocation list entry. * Contains the CA-specific serial numbers and revocation dates. */ typedef struct mbedtls_x509_crl_entry { mbedtls_x509_buf raw; mbedtls_x509_buf serial; mbedtls_x509_time revocation_date; mbedtls_x509_buf entry_ext; struct mbedtls_x509_crl_entry *next; } mbedtls_x509_crl_entry; /** * Certificate revocation list structure. * Every CRL may have multiple entries. */ typedef struct mbedtls_x509_crl { mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ int version; /**< CRL version (1=v1, 2=v2) */ mbedtls_x509_buf sig_oid; /**< CRL signature type identifier */ mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). */ mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ mbedtls_x509_time this_update; mbedtls_x509_time next_update; mbedtls_x509_crl_entry entry; /**< The CRL entries containing the certificate revocation times for this CA. */ mbedtls_x509_buf crl_ext; mbedtls_x509_buf sig_oid2; mbedtls_x509_buf sig; mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ struct mbedtls_x509_crl *next; } mbedtls_x509_crl; /** * \brief Parse a DER-encoded CRL and append it to the chained list * * \param chain points to the start of the chain * \param buf buffer holding the CRL data in DER format * \param buflen size of the buffer * (including the terminating null byte for PEM data) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ); /** * \brief Parse one or more CRLs and append them to the chained list * * \note Mutliple CRLs are accepted only if using PEM format * * \param chain points to the start of the chain * \param buf buffer holding the CRL data in PEM or DER format * \param buflen size of the buffer * (including the terminating null byte for PEM data) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ); #if defined(MBEDTLS_FS_IO) /** * \brief Load one or more CRLs and append them to the chained list * * \note Mutliple CRLs are accepted only if using PEM format * * \param chain points to the start of the chain * \param path filename to read the CRLs from (in PEM or DER encoding) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief Returns an informational string about the CRL. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param crl The X509 CRL to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crl *crl ); /** * \brief Initialize a CRL (chain) * * \param crl CRL chain to initialize */ void mbedtls_x509_crl_init( mbedtls_x509_crl *crl ); /** * \brief Unallocate all CRL data * * \param crl CRL chain to free */ void mbedtls_x509_crl_free( mbedtls_x509_crl *crl ); /* \} name */ /* \} addtogroup x509_module */ #ifdef __cplusplus } #endif #endif /* mbedtls_x509_crl.h */ fldigi-4.1.06/src/include/mbedtls/platform_util.h0000664000175000017500000001670113507401434016667 00000000000000/** * \file platform_util.h * * \brief Common and shared functions used by multiple modules in the Mbed TLS * library. */ /* * Copyright (C) 2018, Arm Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PLATFORM_UTIL_H #define MBEDTLS_PLATFORM_UTIL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_HAVE_TIME_DATE) #include "mbedtls/platform_time.h" #include #endif /* MBEDTLS_HAVE_TIME_DATE */ #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_CHECK_PARAMS) #if defined(MBEDTLS_PARAM_FAILED) /** An alternative definition of MBEDTLS_PARAM_FAILED has been set in config.h. * * This flag can be used to check whether it is safe to assume that * MBEDTLS_PARAM_FAILED() will expand to a call to mbedtls_param_failed(). */ #define MBEDTLS_PARAM_FAILED_ALT #else /* MBEDTLS_PARAM_FAILED */ #define MBEDTLS_PARAM_FAILED( cond ) \ mbedtls_param_failed( #cond, __FILE__, __LINE__ ) /** * \brief User supplied callback function for parameter validation failure. * See #MBEDTLS_CHECK_PARAMS for context. * * This function will be called unless an alternative treatement * is defined through the #MBEDTLS_PARAM_FAILED macro. * * This function can return, and the operation will be aborted, or * alternatively, through use of setjmp()/longjmp() can resume * execution in the application code. * * \param failure_condition The assertion that didn't hold. * \param file The file where the assertion failed. * \param line The line in the file where the assertion failed. */ void mbedtls_param_failed( const char *failure_condition, const char *file, int line ); #endif /* MBEDTLS_PARAM_FAILED */ /* Internal macro meant to be called only from within the library. */ #define MBEDTLS_INTERNAL_VALIDATE_RET( cond, ret ) \ do { \ if( !(cond) ) \ { \ MBEDTLS_PARAM_FAILED( cond ); \ return( ret ); \ } \ } while( 0 ) /* Internal macro meant to be called only from within the library. */ #define MBEDTLS_INTERNAL_VALIDATE( cond ) \ do { \ if( !(cond) ) \ { \ MBEDTLS_PARAM_FAILED( cond ); \ return; \ } \ } while( 0 ) #else /* MBEDTLS_CHECK_PARAMS */ /* Internal macros meant to be called only from within the library. */ #define MBEDTLS_INTERNAL_VALIDATE_RET( cond, ret ) do { } while( 0 ) #define MBEDTLS_INTERNAL_VALIDATE( cond ) do { } while( 0 ) #endif /* MBEDTLS_CHECK_PARAMS */ /* Internal helper macros for deprecating API constants. */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) /* Deliberately don't (yet) export MBEDTLS_DEPRECATED here * to avoid conflict with other headers which define and use * it, too. We might want to move all these definitions here at * some point for uniformity. */ #define MBEDTLS_DEPRECATED __attribute__((deprecated)) MBEDTLS_DEPRECATED typedef char const * mbedtls_deprecated_string_constant_t; #define MBEDTLS_DEPRECATED_STRING_CONSTANT( VAL ) \ ( (mbedtls_deprecated_string_constant_t) ( VAL ) ) MBEDTLS_DEPRECATED typedef int mbedtls_deprecated_numeric_constant_t; #define MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( VAL ) \ ( (mbedtls_deprecated_numeric_constant_t) ( VAL ) ) #undef MBEDTLS_DEPRECATED #else /* MBEDTLS_DEPRECATED_WARNING */ #define MBEDTLS_DEPRECATED_STRING_CONSTANT( VAL ) VAL #define MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( VAL ) VAL #endif /* MBEDTLS_DEPRECATED_WARNING */ #endif /* MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Securely zeroize a buffer * * The function is meant to wipe the data contained in a buffer so * that it can no longer be recovered even if the program memory * is later compromised. Call this function on sensitive data * stored on the stack before returning from a function, and on * sensitive data stored on the heap before freeing the heap * object. * * It is extremely difficult to guarantee that calls to * mbedtls_platform_zeroize() are not removed by aggressive * compiler optimizations in a portable way. For this reason, Mbed * TLS provides the configuration option * MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure * mbedtls_platform_zeroize() to use a suitable implementation for * their platform and needs * * \param buf Buffer to be zeroized * \param len Length of the buffer in bytes * */ void mbedtls_platform_zeroize( void *buf, size_t len ); #if defined(MBEDTLS_HAVE_TIME_DATE) /** * \brief Platform-specific implementation of gmtime_r() * * The function is a thread-safe abstraction that behaves * similarly to the gmtime_r() function from Unix/POSIX. * * Mbed TLS will try to identify the underlying platform and * make use of an appropriate underlying implementation (e.g. * gmtime_r() for POSIX and gmtime_s() for Windows). If this is * not possible, then gmtime() will be used. In this case, calls * from the library to gmtime() will be guarded by the mutex * mbedtls_threading_gmtime_mutex if MBEDTLS_THREADING_C is * enabled. It is recommended that calls from outside the library * are also guarded by this mutex. * * If MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, then Mbed TLS will * unconditionally use the alternative implementation for * mbedtls_platform_gmtime_r() supplied by the user at compile time. * * \param tt Pointer to an object containing time (in seconds) since the * epoch to be converted * \param tm_buf Pointer to an object where the results will be stored * * \return Pointer to an object of type struct tm on success, otherwise * NULL */ struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt, struct tm *tm_buf ); #endif /* MBEDTLS_HAVE_TIME_DATE */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_PLATFORM_UTIL_H */ fldigi-4.1.06/src/include/mbedtls/ecjpake.h0000664000175000017500000002620513507401434015410 00000000000000/** * \file ecjpake.h * * \brief Elliptic curve J-PAKE */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECJPAKE_H #define MBEDTLS_ECJPAKE_H /* * J-PAKE is a password-authenticated key exchange that allows deriving a * strong shared secret from a (potentially low entropy) pre-shared * passphrase, with forward secrecy and mutual authentication. * https://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling * * This file implements the Elliptic Curve variant of J-PAKE, * as defined in Chapter 7.4 of the Thread v1.0 Specification, * available to members of the Thread Group http://threadgroup.org/ * * As the J-PAKE algorithm is inherently symmetric, so is our API. * Each party needs to send its first round message, in any order, to the * other party, then each sends its second round message, in any order. * The payloads are serialized in a way suitable for use in TLS, but could * also be use outside TLS. */ #include "ecp.h" #include "md.h" #ifdef __cplusplus extern "C" { #endif /** * Roles in the EC J-PAKE exchange */ typedef enum { MBEDTLS_ECJPAKE_CLIENT = 0, /**< Client */ MBEDTLS_ECJPAKE_SERVER, /**< Server */ } mbedtls_ecjpake_role; #if !defined(MBEDTLS_ECJPAKE_ALT) /** * EC J-PAKE context structure. * * J-PAKE is a symmetric protocol, except for the identifiers used in * Zero-Knowledge Proofs, and the serialization of the second message * (KeyExchange) as defined by the Thread spec. * * In order to benefit from this symmetry, we choose a different naming * convetion from the Thread v1.0 spec. Correspondance is indicated in the * description as a pair C: client name, S: server name */ typedef struct mbedtls_ecjpake_context { const mbedtls_md_info_t *md_info; /**< Hash to use */ mbedtls_ecp_group grp; /**< Elliptic curve */ mbedtls_ecjpake_role role; /**< Are we client or server? */ int point_format; /**< Format for point export */ mbedtls_ecp_point Xm1; /**< My public key 1 C: X1, S: X3 */ mbedtls_ecp_point Xm2; /**< My public key 2 C: X2, S: X4 */ mbedtls_ecp_point Xp1; /**< Peer public key 1 C: X3, S: X1 */ mbedtls_ecp_point Xp2; /**< Peer public key 2 C: X4, S: X2 */ mbedtls_ecp_point Xp; /**< Peer public key C: Xs, S: Xc */ mbedtls_mpi xm1; /**< My private key 1 C: x1, S: x3 */ mbedtls_mpi xm2; /**< My private key 2 C: x2, S: x4 */ mbedtls_mpi s; /**< Pre-shared secret (passphrase) */ } mbedtls_ecjpake_context; #else /* MBEDTLS_ECJPAKE_ALT */ #include "ecjpake_alt.h" #endif /* MBEDTLS_ECJPAKE_ALT */ /** * \brief Initialize an ECJPAKE context. * * \param ctx The ECJPAKE context to initialize. * This must not be \c NULL. */ void mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx ); /** * \brief Set up an ECJPAKE context for use. * * \note Currently the only values for hash/curve allowed by the * standard are #MBEDTLS_MD_SHA256/#MBEDTLS_ECP_DP_SECP256R1. * * \param ctx The ECJPAKE context to set up. This must be initialized. * \param role The role of the caller. This must be either * #MBEDTLS_ECJPAKE_CLIENT or #MBEDTLS_ECJPAKE_SERVER. * \param hash The identifier of the hash function to use, * for example #MBEDTLS_MD_SHA256. * \param curve The identifier of the elliptic curve to use, * for example #MBEDTLS_ECP_DP_SECP256R1. * \param secret The pre-shared secret (passphrase). This must be * a readable buffer of length \p len Bytes. It need * only be valid for the duration of this call. * \param len The length of the pre-shared secret \p secret. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx, mbedtls_ecjpake_role role, mbedtls_md_type_t hash, mbedtls_ecp_group_id curve, const unsigned char *secret, size_t len ); /** * \brief Check if an ECJPAKE context is ready for use. * * \param ctx The ECJPAKE context to check. This must be * initialized. * * \return \c 0 if the context is ready for use. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise. */ int mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx ); /** * \brief Generate and write the first round message * (TLS: contents of the Client/ServerHello extension, * excluding extension type and length bytes). * * \param ctx The ECJPAKE context to use. This must be * initialized and set up. * \param buf The buffer to write the contents to. This must be a * writable buffer of length \p len Bytes. * \param len The length of \p buf in Bytes. * \param olen The address at which to store the total number * of Bytes written to \p buf. This must not be \c NULL. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This * may be \c NULL if \p f_rng doesn't use a context. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Read and process the first round message * (TLS: contents of the Client/ServerHello extension, * excluding extension type and length bytes). * * \param ctx The ECJPAKE context to use. This must be initialized * and set up. * \param buf The buffer holding the first round message. This must * be a readable buffer of length \p len Bytes. * \param len The length in Bytes of \p buf. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ); /** * \brief Generate and write the second round message * (TLS: contents of the Client/ServerKeyExchange). * * \param ctx The ECJPAKE context to use. This must be initialized, * set up, and already have performed round one. * \param buf The buffer to write the round two contents to. * This must be a writable buffer of length \p len Bytes. * \param len The size of \p buf in Bytes. * \param olen The address at which to store the total number of Bytes * written to \p buf. This must not be \c NULL. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This * may be \c NULL if \p f_rng doesn't use a context. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Read and process the second round message * (TLS: contents of the Client/ServerKeyExchange). * * \param ctx The ECJPAKE context to use. This must be initialized * and set up and already have performed round one. * \param buf The buffer holding the second round message. This must * be a readable buffer of length \p len Bytes. * \param len The length in Bytes of \p buf. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ); /** * \brief Derive the shared secret * (TLS: Pre-Master Secret). * * \param ctx The ECJPAKE context to use. This must be initialized, * set up and have performed both round one and two. * \param buf The buffer to write the derived secret to. This must * be a writable buffer of length \p len Bytes. * \param len The length of \p buf in Bytes. * \param olen The address at which to store the total number of Bytes * written to \p buf. This must not be \c NULL. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This * may be \c NULL if \p f_rng doesn't use a context. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This clears an ECJPAKE context and frees any * embedded data structure. * * \param ctx The ECJPAKE context to free. This may be \c NULL, * in which case this function does nothing. If it is not * \c NULL, it must point to an initialized ECJPAKE context. */ void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx ); #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if a test failed */ int mbedtls_ecjpake_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* ecjpake.h */ fldigi-4.1.06/src/include/mbedtls/platform.h0000664000175000017500000003126713507401434015636 00000000000000/** * \file platform.h * * \brief This file contains the definitions and functions of the * Mbed TLS platform abstraction layer. * * The platform abstraction layer removes the need for the library * to directly link to standard C library functions or operating * system services, making the library easier to port and embed. * Application developers and users of the library can provide their own * implementations of these functions, or implementations specific to * their platform, which can be statically linked to the library or * dynamically configured at runtime. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PLATFORM_H #define MBEDTLS_PLATFORM_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HAVE_TIME) #include "platform_time.h" #endif #define MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED -0x0070 /**< Hardware accelerator failed */ #define MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED -0x0072 /**< The requested feature is not supported by the platform */ #ifdef __cplusplus extern "C" { #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) #include #include #include #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) #if defined(_WIN32) #define MBEDTLS_PLATFORM_STD_SNPRINTF mbedtls_platform_win32_snprintf /**< The default \c snprintf function to use. */ #else #define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< The default \c snprintf function to use. */ #endif #endif #if !defined(MBEDTLS_PLATFORM_STD_PRINTF) #define MBEDTLS_PLATFORM_STD_PRINTF printf /**< The default \c printf function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) #define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< The default \c fprintf function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_CALLOC) #define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< The default \c calloc function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_FREE) #define MBEDTLS_PLATFORM_STD_FREE free /**< The default \c free function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_EXIT) #define MBEDTLS_PLATFORM_STD_EXIT exit /**< The default \c exit function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_TIME) #define MBEDTLS_PLATFORM_STD_TIME time /**< The default \c time function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) #define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS EXIT_SUCCESS /**< The default exit value to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) #define MBEDTLS_PLATFORM_STD_EXIT_FAILURE EXIT_FAILURE /**< The default exit value to use. */ #endif #if defined(MBEDTLS_FS_IO) #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) #define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read #endif #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write #endif #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_FILE) #define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" #endif #endif /* MBEDTLS_FS_IO */ #else /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ #if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) #include MBEDTLS_PLATFORM_STD_MEM_HDR #endif #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ /* \} name SECTION: Module settings */ /* * The function pointers for calloc and free. */ #if defined(MBEDTLS_PLATFORM_MEMORY) #if defined(MBEDTLS_PLATFORM_FREE_MACRO) && \ defined(MBEDTLS_PLATFORM_CALLOC_MACRO) #define mbedtls_free MBEDTLS_PLATFORM_FREE_MACRO #define mbedtls_calloc MBEDTLS_PLATFORM_CALLOC_MACRO #else /* For size_t */ #include extern void *mbedtls_calloc( size_t n, size_t size ); extern void mbedtls_free( void *ptr ); /** * \brief This function dynamically sets the memory-management * functions used by the library, during runtime. * * \param calloc_func The \c calloc function implementation. * \param free_func The \c free function implementation. * * \return \c 0. */ int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), void (*free_func)( void * ) ); #endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */ #else /* !MBEDTLS_PLATFORM_MEMORY */ #define mbedtls_free free #define mbedtls_calloc calloc #endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */ /* * The function pointers for fprintf */ #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) /* We need FILE * */ #include extern int (*mbedtls_fprintf)( FILE *stream, const char *format, ... ); /** * \brief This function dynamically configures the fprintf * function that is called when the * mbedtls_fprintf() function is invoked by the library. * * \param fprintf_func The \c fprintf function implementation. * * \return \c 0. */ int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char *, ... ) ); #else #if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) #define mbedtls_fprintf MBEDTLS_PLATFORM_FPRINTF_MACRO #else #define mbedtls_fprintf fprintf #endif /* MBEDTLS_PLATFORM_FPRINTF_MACRO */ #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ /* * The function pointers for printf */ #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) extern int (*mbedtls_printf)( const char *format, ... ); /** * \brief This function dynamically configures the snprintf * function that is called when the mbedtls_snprintf() * function is invoked by the library. * * \param printf_func The \c printf function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) ); #else /* !MBEDTLS_PLATFORM_PRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) #define mbedtls_printf MBEDTLS_PLATFORM_PRINTF_MACRO #else #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_PRINTF_MACRO */ #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ /* * The function pointers for snprintf * * The snprintf implementation should conform to C99: * - it *must* always correctly zero-terminate the buffer * (except when n == 0, then it must leave the buffer untouched) * - however it is acceptable to return -1 instead of the required length when * the destination buffer is too short. */ #if defined(_WIN32) /* For Windows (inc. MSYS2), we provide our own fixed implementation */ int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... ); #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) extern int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... ); /** * \brief This function allows configuring a custom * \c snprintf function pointer. * * \param snprintf_func The \c snprintf function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n, const char * format, ... ) ); #else /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) #define mbedtls_snprintf MBEDTLS_PLATFORM_SNPRINTF_MACRO #else #define mbedtls_snprintf MBEDTLS_PLATFORM_STD_SNPRINTF #endif /* MBEDTLS_PLATFORM_SNPRINTF_MACRO */ #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ /* * The function pointers for exit */ #if defined(MBEDTLS_PLATFORM_EXIT_ALT) extern void (*mbedtls_exit)( int status ); /** * \brief This function dynamically configures the exit * function that is called when the mbedtls_exit() * function is invoked by the library. * * \param exit_func The \c exit function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_exit( void (*exit_func)( int status ) ); #else #if defined(MBEDTLS_PLATFORM_EXIT_MACRO) #define mbedtls_exit MBEDTLS_PLATFORM_EXIT_MACRO #else #define mbedtls_exit exit #endif /* MBEDTLS_PLATFORM_EXIT_MACRO */ #endif /* MBEDTLS_PLATFORM_EXIT_ALT */ /* * The default exit values */ #if defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) #define MBEDTLS_EXIT_SUCCESS MBEDTLS_PLATFORM_STD_EXIT_SUCCESS #else #define MBEDTLS_EXIT_SUCCESS 0 #endif #if defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) #define MBEDTLS_EXIT_FAILURE MBEDTLS_PLATFORM_STD_EXIT_FAILURE #else #define MBEDTLS_EXIT_FAILURE 1 #endif /* * The function pointers for reading from and writing a seed file to * Non-Volatile storage (NV) in a platform-independent way * * Only enabled when the NV seed entropy source is enabled */ #if defined(MBEDTLS_ENTROPY_NV_SEED) #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO) /* Internal standard platform definitions */ int mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len ); int mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len ); #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) extern int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ); extern int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ); /** * \brief This function allows configuring custom seed file writing and * reading functions. * * \param nv_seed_read_func The seed reading function implementation. * \param nv_seed_write_func The seed writing function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_nv_seed( int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ), int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) ); #else #if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) && \ defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) #define mbedtls_nv_seed_read MBEDTLS_PLATFORM_NV_SEED_READ_MACRO #define mbedtls_nv_seed_write MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO #else #define mbedtls_nv_seed_read mbedtls_platform_std_nv_seed_read #define mbedtls_nv_seed_write mbedtls_platform_std_nv_seed_write #endif #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) /** * \brief The platform context structure. * * \note This structure may be used to assist platform-specific * setup or teardown operations. */ typedef struct mbedtls_platform_context { char dummy; /**< A placeholder member, as empty structs are not portable. */ } mbedtls_platform_context; #else #include "platform_alt.h" #endif /* !MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ /** * \brief This function performs any platform-specific initialization * operations. * * \note This function should be called before any other library functions. * * Its implementation is platform-specific, and unless * platform-specific code is provided, it does nothing. * * \note The usage and necessity of this function is dependent on the platform. * * \param ctx The platform context. * * \return \c 0 on success. */ int mbedtls_platform_setup( mbedtls_platform_context *ctx ); /** * \brief This function performs any platform teardown operations. * * \note This function should be called after every other Mbed TLS module * has been correctly freed using the appropriate free function. * * Its implementation is platform-specific, and unless * platform-specific code is provided, it does nothing. * * \note The usage and necessity of this function is dependent on the platform. * * \param ctx The platform context. * */ void mbedtls_platform_teardown( mbedtls_platform_context *ctx ); #ifdef __cplusplus } #endif #endif /* platform.h */ fldigi-4.1.06/src/include/mbedtls/rsa.h0000664000175000017500000017571313507401434014604 00000000000000/** * \file rsa.h * * \brief This file provides an API for the RSA public-key cryptosystem. * * The RSA public-key cryptosystem is defined in Public-Key * Cryptography Standards (PKCS) #1 v1.5: RSA Encryption * and Public-Key Cryptography Standards (PKCS) #1 v2.1: * RSA Cryptography Specifications. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_RSA_H #define MBEDTLS_RSA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" #include "md.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /* * RSA Error codes */ #define MBEDTLS_ERR_RSA_BAD_INPUT_DATA -0x4080 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_RSA_INVALID_PADDING -0x4100 /**< Input data contains invalid padding and is rejected. */ #define MBEDTLS_ERR_RSA_KEY_GEN_FAILED -0x4180 /**< Something failed during generation of a key. */ #define MBEDTLS_ERR_RSA_KEY_CHECK_FAILED -0x4200 /**< Key failed to pass the validity check of the library. */ #define MBEDTLS_ERR_RSA_PUBLIC_FAILED -0x4280 /**< The public key operation failed. */ #define MBEDTLS_ERR_RSA_PRIVATE_FAILED -0x4300 /**< The private key operation failed. */ #define MBEDTLS_ERR_RSA_VERIFY_FAILED -0x4380 /**< The PKCS#1 verification failed. */ #define MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE -0x4400 /**< The output buffer for decryption is not large enough. */ #define MBEDTLS_ERR_RSA_RNG_FAILED -0x4480 /**< The random generator failed to generate non-zeros. */ /* MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION is deprecated and should not be used. */ #define MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION -0x4500 /**< The implementation does not offer the requested operation, for example, because of security violations or lack of functionality. */ /* MBEDTLS_ERR_RSA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_RSA_HW_ACCEL_FAILED -0x4580 /**< RSA hardware accelerator failed. */ /* * RSA constants */ #define MBEDTLS_RSA_PUBLIC 0 /**< Request private key operation. */ #define MBEDTLS_RSA_PRIVATE 1 /**< Request public key operation. */ #define MBEDTLS_RSA_PKCS_V15 0 /**< Use PKCS#1 v1.5 encoding. */ #define MBEDTLS_RSA_PKCS_V21 1 /**< Use PKCS#1 v2.1 encoding. */ #define MBEDTLS_RSA_SIGN 1 /**< Identifier for RSA signature operations. */ #define MBEDTLS_RSA_CRYPT 2 /**< Identifier for RSA encryption and decryption operations. */ #define MBEDTLS_RSA_SALT_LEN_ANY -1 /* * The above constants may be used even if the RSA module is compile out, * eg for alternative (PKCS#11) RSA implemenations in the PK layers. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_RSA_ALT) // Regular implementation // /** * \brief The RSA context structure. * * \note Direct manipulation of the members of this structure * is deprecated. All manipulation should instead be done through * the public interface functions. */ typedef struct mbedtls_rsa_context { int ver; /*!< Always 0.*/ size_t len; /*!< The size of \p N in Bytes. */ mbedtls_mpi N; /*!< The public modulus. */ mbedtls_mpi E; /*!< The public exponent. */ mbedtls_mpi D; /*!< The private exponent. */ mbedtls_mpi P; /*!< The first prime factor. */ mbedtls_mpi Q; /*!< The second prime factor. */ mbedtls_mpi DP; /*!< D % (P - 1). */ mbedtls_mpi DQ; /*!< D % (Q - 1). */ mbedtls_mpi QP; /*!< 1 / (Q % P). */ mbedtls_mpi RN; /*!< cached R^2 mod N. */ mbedtls_mpi RP; /*!< cached R^2 mod P. */ mbedtls_mpi RQ; /*!< cached R^2 mod Q. */ mbedtls_mpi Vi; /*!< The cached blinding value. */ mbedtls_mpi Vf; /*!< The cached un-blinding value. */ int padding; /*!< Selects padding mode: #MBEDTLS_RSA_PKCS_V15 for 1.5 padding and #MBEDTLS_RSA_PKCS_V21 for OAEP or PSS. */ int hash_id; /*!< Hash identifier of mbedtls_md_type_t type, as specified in md.h for use in the MGF mask generating function used in the EME-OAEP and EMSA-PSS encodings. */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; /*!< Thread-safety mutex. */ #endif } mbedtls_rsa_context; #else /* MBEDTLS_RSA_ALT */ #include "rsa_alt.h" #endif /* MBEDTLS_RSA_ALT */ /** * \brief This function initializes an RSA context. * * \note Set padding to #MBEDTLS_RSA_PKCS_V21 for the RSAES-OAEP * encryption scheme and the RSASSA-PSS signature scheme. * * \note The \p hash_id parameter is ignored when using * #MBEDTLS_RSA_PKCS_V15 padding. * * \note The choice of padding mode is strictly enforced for private key * operations, since there might be security concerns in * mixing padding modes. For public key operations it is * a default value, which can be overriden by calling specific * \c rsa_rsaes_xxx or \c rsa_rsassa_xxx functions. * * \note The hash selected in \p hash_id is always used for OEAP * encryption. For PSS signatures, it is always used for * making signatures, but can be overriden for verifying them. * If set to #MBEDTLS_MD_NONE, it is always overriden. * * \param ctx The RSA context to initialize. This must not be \c NULL. * \param padding The padding mode to use. This must be either * #MBEDTLS_RSA_PKCS_V15 or #MBEDTLS_RSA_PKCS_V21. * \param hash_id The hash identifier of ::mbedtls_md_type_t type, if * \p padding is #MBEDTLS_RSA_PKCS_V21. It is unused * otherwise. */ void mbedtls_rsa_init( mbedtls_rsa_context *ctx, int padding, int hash_id ); /** * \brief This function imports a set of core parameters into an * RSA context. * * \note This function can be called multiple times for successive * imports, if the parameters are not simultaneously present. * * Any sequence of calls to this function should be followed * by a call to mbedtls_rsa_complete(), which checks and * completes the provided information to a ready-for-use * public or private RSA key. * * \note See mbedtls_rsa_complete() for more information on which * parameters are necessary to set up a private or public * RSA key. * * \note The imported parameters are copied and need not be preserved * for the lifetime of the RSA context being set up. * * \param ctx The initialized RSA context to store the parameters in. * \param N The RSA modulus. This may be \c NULL. * \param P The first prime factor of \p N. This may be \c NULL. * \param Q The second prime factor of \p N. This may be \c NULL. * \param D The private exponent. This may be \c NULL. * \param E The public exponent. This may be \c NULL. * * \return \c 0 on success. * \return A non-zero error code on failure. */ int mbedtls_rsa_import( mbedtls_rsa_context *ctx, const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E ); /** * \brief This function imports core RSA parameters, in raw big-endian * binary format, into an RSA context. * * \note This function can be called multiple times for successive * imports, if the parameters are not simultaneously present. * * Any sequence of calls to this function should be followed * by a call to mbedtls_rsa_complete(), which checks and * completes the provided information to a ready-for-use * public or private RSA key. * * \note See mbedtls_rsa_complete() for more information on which * parameters are necessary to set up a private or public * RSA key. * * \note The imported parameters are copied and need not be preserved * for the lifetime of the RSA context being set up. * * \param ctx The initialized RSA context to store the parameters in. * \param N The RSA modulus. This may be \c NULL. * \param N_len The Byte length of \p N; it is ignored if \p N == NULL. * \param P The first prime factor of \p N. This may be \c NULL. * \param P_len The Byte length of \p P; it ns ignored if \p P == NULL. * \param Q The second prime factor of \p N. This may be \c NULL. * \param Q_len The Byte length of \p Q; it is ignored if \p Q == NULL. * \param D The private exponent. This may be \c NULL. * \param D_len The Byte length of \p D; it is ignored if \p D == NULL. * \param E The public exponent. This may be \c NULL. * \param E_len The Byte length of \p E; it is ignored if \p E == NULL. * * \return \c 0 on success. * \return A non-zero error code on failure. */ int mbedtls_rsa_import_raw( mbedtls_rsa_context *ctx, unsigned char const *N, size_t N_len, unsigned char const *P, size_t P_len, unsigned char const *Q, size_t Q_len, unsigned char const *D, size_t D_len, unsigned char const *E, size_t E_len ); /** * \brief This function completes an RSA context from * a set of imported core parameters. * * To setup an RSA public key, precisely \p N and \p E * must have been imported. * * To setup an RSA private key, sufficient information must * be present for the other parameters to be derivable. * * The default implementation supports the following: *
  • Derive \p P, \p Q from \p N, \p D, \p E.
  • *
  • Derive \p N, \p D from \p P, \p Q, \p E.
* Alternative implementations need not support these. * * If this function runs successfully, it guarantees that * the RSA context can be used for RSA operations without * the risk of failure or crash. * * \warning This function need not perform consistency checks * for the imported parameters. In particular, parameters that * are not needed by the implementation might be silently * discarded and left unchecked. To check the consistency * of the key material, see mbedtls_rsa_check_privkey(). * * \param ctx The initialized RSA context holding imported parameters. * * \return \c 0 on success. * \return #MBEDTLS_ERR_RSA_BAD_INPUT_DATA if the attempted derivations * failed. * */ int mbedtls_rsa_complete( mbedtls_rsa_context *ctx ); /** * \brief This function exports the core parameters of an RSA key. * * If this function runs successfully, the non-NULL buffers * pointed to by \p N, \p P, \p Q, \p D, and \p E are fully * written, with additional unused space filled leading by * zero Bytes. * * Possible reasons for returning * #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED:
    *
  • An alternative RSA implementation is in use, which * stores the key externally, and either cannot or should * not export it into RAM.
  • *
  • A SW or HW implementation might not support a certain * deduction. For example, \p P, \p Q from \p N, \p D, * and \p E if the former are not part of the * implementation.
* * If the function fails due to an unsupported operation, * the RSA context stays intact and remains usable. * * \param ctx The initialized RSA context. * \param N The MPI to hold the RSA modulus. * This may be \c NULL if this field need not be exported. * \param P The MPI to hold the first prime factor of \p N. * This may be \c NULL if this field need not be exported. * \param Q The MPI to hold the second prime factor of \p N. * This may be \c NULL if this field need not be exported. * \param D The MPI to hold the private exponent. * This may be \c NULL if this field need not be exported. * \param E The MPI to hold the public exponent. * This may be \c NULL if this field need not be exported. * * \return \c 0 on success. * \return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED if exporting the * requested parameters cannot be done due to missing * functionality or because of security policies. * \return A non-zero return code on any other failure. * */ int mbedtls_rsa_export( const mbedtls_rsa_context *ctx, mbedtls_mpi *N, mbedtls_mpi *P, mbedtls_mpi *Q, mbedtls_mpi *D, mbedtls_mpi *E ); /** * \brief This function exports core parameters of an RSA key * in raw big-endian binary format. * * If this function runs successfully, the non-NULL buffers * pointed to by \p N, \p P, \p Q, \p D, and \p E are fully * written, with additional unused space filled leading by * zero Bytes. * * Possible reasons for returning * #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED:
    *
  • An alternative RSA implementation is in use, which * stores the key externally, and either cannot or should * not export it into RAM.
  • *
  • A SW or HW implementation might not support a certain * deduction. For example, \p P, \p Q from \p N, \p D, * and \p E if the former are not part of the * implementation.
* If the function fails due to an unsupported operation, * the RSA context stays intact and remains usable. * * \note The length parameters are ignored if the corresponding * buffer pointers are NULL. * * \param ctx The initialized RSA context. * \param N The Byte array to store the RSA modulus, * or \c NULL if this field need not be exported. * \param N_len The size of the buffer for the modulus. * \param P The Byte array to hold the first prime factor of \p N, * or \c NULL if this field need not be exported. * \param P_len The size of the buffer for the first prime factor. * \param Q The Byte array to hold the second prime factor of \p N, * or \c NULL if this field need not be exported. * \param Q_len The size of the buffer for the second prime factor. * \param D The Byte array to hold the private exponent, * or \c NULL if this field need not be exported. * \param D_len The size of the buffer for the private exponent. * \param E The Byte array to hold the public exponent, * or \c NULL if this field need not be exported. * \param E_len The size of the buffer for the public exponent. * * \return \c 0 on success. * \return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED if exporting the * requested parameters cannot be done due to missing * functionality or because of security policies. * \return A non-zero return code on any other failure. */ int mbedtls_rsa_export_raw( const mbedtls_rsa_context *ctx, unsigned char *N, size_t N_len, unsigned char *P, size_t P_len, unsigned char *Q, size_t Q_len, unsigned char *D, size_t D_len, unsigned char *E, size_t E_len ); /** * \brief This function exports CRT parameters of a private RSA key. * * \note Alternative RSA implementations not using CRT-parameters * internally can implement this function based on * mbedtls_rsa_deduce_opt(). * * \param ctx The initialized RSA context. * \param DP The MPI to hold \c D modulo `P-1`, * or \c NULL if it need not be exported. * \param DQ The MPI to hold \c D modulo `Q-1`, * or \c NULL if it need not be exported. * \param QP The MPI to hold modular inverse of \c Q modulo \c P, * or \c NULL if it need not be exported. * * \return \c 0 on success. * \return A non-zero error code on failure. * */ int mbedtls_rsa_export_crt( const mbedtls_rsa_context *ctx, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ); /** * \brief This function sets padding for an already initialized RSA * context. See mbedtls_rsa_init() for details. * * \param ctx The initialized RSA context to be configured. * \param padding The padding mode to use. This must be either * #MBEDTLS_RSA_PKCS_V15 or #MBEDTLS_RSA_PKCS_V21. * \param hash_id The #MBEDTLS_RSA_PKCS_V21 hash identifier. */ void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id ); /** * \brief This function retrieves the length of RSA modulus in Bytes. * * \param ctx The initialized RSA context. * * \return The length of the RSA modulus in Bytes. * */ size_t mbedtls_rsa_get_len( const mbedtls_rsa_context *ctx ); /** * \brief This function generates an RSA keypair. * * \note mbedtls_rsa_init() must be called before this function, * to set up the RSA context. * * \param ctx The initialized RSA context used to hold the key. * \param f_rng The RNG function to be used for key generation. * This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't need a context. * \param nbits The size of the public key in bits. * \param exponent The public exponent to use. For example, \c 65537. * This must be odd and greater than \c 1. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, unsigned int nbits, int exponent ); /** * \brief This function checks if a context contains at least an RSA * public key. * * If the function runs successfully, it is guaranteed that * enough information is present to perform an RSA public key * operation using mbedtls_rsa_public(). * * \param ctx The initialized RSA context to check. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. * */ int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ); /** * \brief This function checks if a context contains an RSA private key * and perform basic consistency checks. * * \note The consistency checks performed by this function not only * ensure that mbedtls_rsa_private() can be called successfully * on the given context, but that the various parameters are * mutually consistent with high probability, in the sense that * mbedtls_rsa_public() and mbedtls_rsa_private() are inverses. * * \warning This function should catch accidental misconfigurations * like swapping of parameters, but it cannot establish full * trust in neither the quality nor the consistency of the key * material that was used to setup the given RSA context: *
  • Consistency: Imported parameters that are irrelevant * for the implementation might be silently dropped. If dropped, * the current function does not have access to them, * and therefore cannot check them. See mbedtls_rsa_complete(). * If you want to check the consistency of the entire * content of an PKCS1-encoded RSA private key, for example, you * should use mbedtls_rsa_validate_params() before setting * up the RSA context. * Additionally, if the implementation performs empirical checks, * these checks substantiate but do not guarantee consistency.
  • *
  • Quality: This function is not expected to perform * extended quality assessments like checking that the prime * factors are safe. Additionally, it is the responsibility of the * user to ensure the trustworthiness of the source of his RSA * parameters, which goes beyond what is effectively checkable * by the library.
* * \param ctx The initialized RSA context to check. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx ); /** * \brief This function checks a public-private RSA key pair. * * It checks each of the contexts, and makes sure they match. * * \param pub The initialized RSA context holding the public key. * \param prv The initialized RSA context holding the private key. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv ); /** * \brief This function performs an RSA public key operation. * * \param ctx The initialized RSA context to use. * \param input The input buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \note This function does not handle message padding. * * \note Make sure to set \p input[0] = 0 or ensure that * input is smaller than \p N. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_public( mbedtls_rsa_context *ctx, const unsigned char *input, unsigned char *output ); /** * \brief This function performs an RSA private key operation. * * \note Blinding is used if and only if a PRNG is provided. * * \note If blinding is used, both the base of exponentation * and the exponent are blinded, providing protection * against some side-channel attacks. * * \warning It is deprecated and a security risk to not provide * a PRNG here and thereby prevent the use of blinding. * Future versions of the library may enforce the presence * of a PRNG. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function, used for blinding. It is discouraged * and deprecated to pass \c NULL here, in which case * blinding will be omitted. * \param p_rng The RNG context to pass to \p f_rng. This may be \c NULL * if \p f_rng is \c NULL or if \p f_rng doesn't need a context. * \param input The input buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. * */ int mbedtls_rsa_private( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, const unsigned char *input, unsigned char *output ); /** * \brief This function adds the message padding, then performs an RSA * operation. * * It is the generic wrapper for performing a PKCS#1 encryption * operation using the \p mode from the context. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG to use. It is mandatory for PKCS#1 v2.1 padding * encoding, and for PKCS#1 v1.5 padding encoding when used * with \p mode set to #MBEDTLS_RSA_PUBLIC. For PKCS#1 v1.5 * padding encoding and \p mode set to #MBEDTLS_RSA_PRIVATE, * it is used for blinding and should be provided in this * case; see mbedtls_rsa_private() for more. * \param p_rng The RNG context to be passed to \p f_rng. May be * \c NULL if \p f_rng is \c NULL or if \p f_rng doesn't * need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param ilen The length of the plaintext in Bytes. * \param input The input data to encrypt. This must be a readable * buffer of size \p ilen Bytes. This must not be \c NULL. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ); /** * \brief This function performs a PKCS#1 v1.5 encryption operation * (RSAES-PKCS1-v1_5-ENCRYPT). * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function to use. It is needed for padding generation * if \p mode is #MBEDTLS_RSA_PUBLIC. If \p mode is * #MBEDTLS_RSA_PRIVATE (discouraged), it is used for * blinding and should be provided; see mbedtls_rsa_private(). * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng is \c NULL or if \p f_rng * doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param ilen The length of the plaintext in Bytes. * \param input The input data to encrypt. This must be a readable * buffer of size \p ilen Bytes. This must not be \c NULL. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ); /** * \brief This function performs a PKCS#1 v2.1 OAEP encryption * operation (RSAES-OAEP-ENCRYPT). * * \note The output buffer must be as large as the size * of ctx->N. For example, 128 Bytes if RSA-1024 is used. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initnialized RSA context to use. * \param f_rng The RNG function to use. This is needed for padding * generation and must be provided. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param label The buffer holding the custom label to use. * This must be a readable buffer of length \p label_len * Bytes. It may be \c NULL if \p label_len is \c 0. * \param label_len The length of the label in Bytes. * \param ilen The length of the plaintext buffer \p input in Bytes. * \param input The input data to encrypt. This must be a readable * buffer of size \p ilen Bytes. This must not be \c NULL. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t ilen, const unsigned char *input, unsigned char *output ); /** * \brief This function performs an RSA operation, then removes the * message padding. * * It is the generic wrapper for performing a PKCS#1 decryption * operation using the \p mode from the context. * * \note The output buffer length \c output_max_len should be * as large as the size \p ctx->len of \p ctx->N (for example, * 128 Bytes if RSA-1024 is used) to be able to hold an * arbitrary decrypted message. If it is not large enough to * hold the decryption of the particular ciphertext provided, * the function returns \c MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param olen The address at which to store the length of * the plaintext. This must not be \c NULL. * \param input The ciphertext buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The buffer used to hold the plaintext. This must * be a writable buffer of length \p output_max_len Bytes. * \param output_max_len The length in Bytes of the output buffer \p output. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief This function performs a PKCS#1 v1.5 decryption * operation (RSAES-PKCS1-v1_5-DECRYPT). * * \note The output buffer length \c output_max_len should be * as large as the size \p ctx->len of \p ctx->N, for example, * 128 Bytes if RSA-1024 is used, to be able to hold an * arbitrary decrypted message. If it is not large enough to * hold the decryption of the particular ciphertext provided, * the function returns #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param olen The address at which to store the length of * the plaintext. This must not be \c NULL. * \param input The ciphertext buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The buffer used to hold the plaintext. This must * be a writable buffer of length \p output_max_len Bytes. * \param output_max_len The length in Bytes of the output buffer \p output. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. * */ int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief This function performs a PKCS#1 v2.1 OAEP decryption * operation (RSAES-OAEP-DECRYPT). * * \note The output buffer length \c output_max_len should be * as large as the size \p ctx->len of \p ctx->N, for * example, 128 Bytes if RSA-1024 is used, to be able to * hold an arbitrary decrypted message. If it is not * large enough to hold the decryption of the particular * ciphertext provided, the function returns * #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param label The buffer holding the custom label to use. * This must be a readable buffer of length \p label_len * Bytes. It may be \c NULL if \p label_len is \c 0. * \param label_len The length of the label in Bytes. * \param olen The address at which to store the length of * the plaintext. This must not be \c NULL. * \param input The ciphertext buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The buffer used to hold the plaintext. This must * be a writable buffer of length \p output_max_len Bytes. * \param output_max_len The length in Bytes of the output buffer \p output. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief This function performs a private RSA operation to sign * a message digest using PKCS#1. * * It is the generic wrapper for performing a PKCS#1 * signature using the \p mode from the context. * * \note The \p sig buffer must be as large as the size * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. * * \note For PKCS#1 v2.1 encoding, see comments on * mbedtls_rsa_rsassa_pss_sign() for details on * \p md_alg and \p hash_id. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function to use. If the padding mode is PKCS#1 v2.1, * this must be provided. If the padding mode is PKCS#1 v1.5 and * \p mode is #MBEDTLS_RSA_PRIVATE, it is used for blinding * and should be provided; see mbedtls_rsa_private() for more * more. It is ignored otherwise. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng is \c NULL or doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer to hold the signature. This must be a writable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the signing operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * \brief This function performs a PKCS#1 v1.5 signature * operation (RSASSA-PKCS1-v1_5-SIGN). * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng is \c NULL or doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer to hold the signature. This must be a writable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the signing operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * \brief This function performs a PKCS#1 v2.1 PSS signature * operation (RSASSA-PSS-SIGN). * * \note The \p hash_id in the RSA context is the one used for the * encoding. \p md_alg in the function call is the type of hash * that is encoded. According to RFC-3447: Public-Key * Cryptography Standards (PKCS) #1 v2.1: RSA Cryptography * Specifications it is advised to keep both hashes the * same. * * \note This function always uses the maximum possible salt size, * up to the length of the payload hash. This choice of salt * size complies with FIPS 186-4 §5.5 (e) and RFC 8017 (PKCS#1 * v2.2) §9.1.1 step 3. Furthermore this function enforces a * minimum salt size which is the hash size minus 2 bytes. If * this minimum size is too large given the key size (the salt * size, plus the hash size, plus 2 bytes must be no more than * the key size in bytes), this function returns * #MBEDTLS_ERR_RSA_BAD_INPUT_DATA. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. It must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer to hold the signature. This must be a writable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the signing operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * \brief This function performs a public RSA operation and checks * the message digest. * * This is the generic wrapper for performing a PKCS#1 * verification using the mode from the context. * * \note For PKCS#1 v2.1 encoding, see comments on * mbedtls_rsa_rsassa_pss_verify() about \p md_alg and * \p hash_id. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ); /** * \brief This function performs a PKCS#1 v1.5 verification * operation (RSASSA-PKCS1-v1_5-VERIFY). * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ); /** * \brief This function performs a PKCS#1 v2.1 PSS verification * operation (RSASSA-PSS-VERIFY). * * The hash function for the MGF mask generating function * is that specified in the RSA context. * * \note The \p hash_id in the RSA context is the one used for the * verification. \p md_alg in the function call is the type of * hash that is verified. According to RFC-3447: Public-Key * Cryptography Standards (PKCS) #1 v2.1: RSA Cryptography * Specifications it is advised to keep both hashes the * same. If \p hash_id in the RSA context is unset, * the \p md_alg from the function call is used. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ); /** * \brief This function performs a PKCS#1 v2.1 PSS verification * operation (RSASSA-PSS-VERIFY). * * The hash function for the MGF mask generating function * is that specified in \p mgf1_hash_id. * * \note The \p sig buffer must be as large as the size * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. * * \note The \p hash_id in the RSA context is ignored. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE. * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param mgf1_hash_id The message digest used for mask generation. * \param expected_salt_len The length of the salt used in padding. Use * #MBEDTLS_RSA_SALT_LEN_ANY to accept any salt length. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, mbedtls_md_type_t mgf1_hash_id, int expected_salt_len, const unsigned char *sig ); /** * \brief This function copies the components of an RSA context. * * \param dst The destination context. This must be initialized. * \param src The source context. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory allocation failure. */ int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ); /** * \brief This function frees the components of an RSA key. * * \param ctx The RSA context to free. May be \c NULL, in which case * this function is a no-op. If it is not \c NULL, it must * point to an initialized RSA context. */ void mbedtls_rsa_free( mbedtls_rsa_context *ctx ); /** * \brief The RSA checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_rsa_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* rsa.h */ fldigi-4.1.06/src/include/mbedtls/ctr_drbg.h0000664000175000017500000003367013507401434015600 00000000000000/** * \file ctr_drbg.h * * \brief This file contains CTR_DRBG definitions and functions. * * CTR_DRBG is a standardized way of building a PRNG from a block-cipher * in counter mode operation, as defined in NIST SP 800-90A: * Recommendation for Random Number Generation Using Deterministic Random * Bit Generators. * * The Mbed TLS implementation of CTR_DRBG uses AES-256 (default) or AES-128 * as the underlying block cipher. * * \warning Using 128-bit keys for CTR_DRBG limits the security of generated * keys and operations that use random values generated to 128-bit security. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CTR_DRBG_H #define MBEDTLS_CTR_DRBG_H #include "aes.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif #define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -0x0034 /**< The entropy source failed. */ #define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG -0x0036 /**< The requested random buffer length is too big. */ #define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG -0x0038 /**< The input (entropy + additional data) is too large. */ #define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR -0x003A /**< Read or write error in file. */ #define MBEDTLS_CTR_DRBG_BLOCKSIZE 16 /**< The block size used by the cipher. */ #if defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) #define MBEDTLS_CTR_DRBG_KEYSIZE 16 /**< The key size used by the cipher (compile-time choice: 128 bits). */ #else #define MBEDTLS_CTR_DRBG_KEYSIZE 32 /**< The key size used by the cipher (compile-time choice: 256 bits). */ #endif #define MBEDTLS_CTR_DRBG_KEYBITS ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 ) /**< The key size for the DRBG operation, in bits. */ #define MBEDTLS_CTR_DRBG_SEEDLEN ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE ) /**< The seed length, calculated as (counter + AES key). */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them using the compiler command * line. * \{ */ #if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) #define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< The amount of entropy used per seed by default: *
  • 48 with SHA-512.
  • *
  • 32 with SHA-256.
*/ #else #define MBEDTLS_CTR_DRBG_ENTROPY_LEN 32 /**< Amount of entropy used per seed by default: *
  • 48 with SHA-512.
  • *
  • 32 with SHA-256.
*/ #endif #endif #if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL) #define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< The interval before reseed is performed by default. */ #endif #if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT) #define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< The maximum number of additional input Bytes. */ #endif #if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST) #define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< The maximum number of requested Bytes per call. */ #endif #if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) #define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< The maximum size of seed or reseed buffer. */ #endif /* \} name SECTION: Module settings */ #define MBEDTLS_CTR_DRBG_PR_OFF 0 /**< Prediction resistance is disabled. */ #define MBEDTLS_CTR_DRBG_PR_ON 1 /**< Prediction resistance is enabled. */ #ifdef __cplusplus extern "C" { #endif /** * \brief The CTR_DRBG context structure. */ typedef struct mbedtls_ctr_drbg_context { unsigned char counter[16]; /*!< The counter (V). */ int reseed_counter; /*!< The reseed counter. */ int prediction_resistance; /*!< This determines whether prediction resistance is enabled, that is whether to systematically reseed before each random generation. */ size_t entropy_len; /*!< The amount of entropy grabbed on each seed or reseed operation. */ int reseed_interval; /*!< The reseed interval. */ mbedtls_aes_context aes_ctx; /*!< The AES context. */ /* * Callbacks (Entropy) */ int (*f_entropy)(void *, unsigned char *, size_t); /*!< The entropy callback function. */ void *p_entropy; /*!< The context for the entropy function. */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_ctr_drbg_context; /** * \brief This function initializes the CTR_DRBG context, * and prepares it for mbedtls_ctr_drbg_seed() * or mbedtls_ctr_drbg_free(). * * \param ctx The CTR_DRBG context to initialize. */ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ); /** * \brief This function seeds and sets up the CTR_DRBG * entropy source for future reseeds. * * \note Personalization data can be provided in addition to the more generic * entropy source, to make this instantiation as unique as possible. * * \param ctx The CTR_DRBG context to seed. * \param f_entropy The entropy callback, taking as arguments the * \p p_entropy context, the buffer to fill, and the length of the buffer. * \param p_entropy The entropy context. * \param custom Personalization data, that is device-specific identifiers. Can be NULL. * \param len The length of the personalization data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. */ int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ); /** * \brief This function clears CTR_CRBG context data. * * \param ctx The CTR_DRBG context to clear. */ void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ); /** * \brief This function turns prediction resistance on or off. * The default value is off. * * \note If enabled, entropy is gathered at the beginning of * every call to mbedtls_ctr_drbg_random_with_add(). * Only use this if your entropy source has sufficient * throughput. * * \param ctx The CTR_DRBG context. * \param resistance #MBEDTLS_CTR_DRBG_PR_ON or #MBEDTLS_CTR_DRBG_PR_OFF. */ void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance ); /** * \brief This function sets the amount of entropy grabbed on each * seed or reseed. The default value is * #MBEDTLS_CTR_DRBG_ENTROPY_LEN. * * \param ctx The CTR_DRBG context. * \param len The amount of entropy to grab. */ void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, size_t len ); /** * \brief This function sets the reseed interval. * The default value is #MBEDTLS_CTR_DRBG_RESEED_INTERVAL. * * \param ctx The CTR_DRBG context. * \param interval The reseed interval. */ void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, int interval ); /** * \brief This function reseeds the CTR_DRBG context, that is * extracts data from the entropy source. * * \param ctx The CTR_DRBG context. * \param additional Additional data to add to the state. Can be NULL. * \param len The length of the additional data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. */ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t len ); /** * \brief This function updates the state of the CTR_DRBG context. * * \param ctx The CTR_DRBG context. * \param additional The data to update the state with. * \param add_len Length of \p additional in bytes. This must be at * most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if * \p add_len is more than * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. * \return An error from the underlying AES cipher on failure. */ int mbedtls_ctr_drbg_update_ret( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ); /** * \brief This function updates a CTR_DRBG instance with additional * data and uses it to generate random data. * * \note The function automatically reseeds if the reseed counter is exceeded. * * \param p_rng The CTR_DRBG context. This must be a pointer to a * #mbedtls_ctr_drbg_context structure. * \param output The buffer to fill. * \param output_len The length of the buffer. * \param additional Additional data to update. Can be NULL. * \param add_len The length of the additional data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or * #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure. */ int mbedtls_ctr_drbg_random_with_add( void *p_rng, unsigned char *output, size_t output_len, const unsigned char *additional, size_t add_len ); /** * \brief This function uses CTR_DRBG to generate random data. * * \note The function automatically reseeds if the reseed counter is exceeded. * * \param p_rng The CTR_DRBG context. This must be a pointer to a * #mbedtls_ctr_drbg_context structure. * \param output The buffer to fill. * \param output_len The length of the buffer. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or * #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure. */ int mbedtls_ctr_drbg_random( void *p_rng, unsigned char *output, size_t output_len ); #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function updates the state of the CTR_DRBG context. * * \deprecated Superseded by mbedtls_ctr_drbg_update_ret() * in 2.16.0. * * \note If \p add_len is greater than * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, only the first * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT Bytes are used. * The remaining Bytes are silently discarded. * * \param ctx The CTR_DRBG context. * \param additional The data to update the state with. * \param add_len Length of \p additional data. */ MBEDTLS_DEPRECATED void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #if defined(MBEDTLS_FS_IO) /** * \brief This function writes a seed file. * * \param ctx The CTR_DRBG context. * \param path The name of the file. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on * failure. */ int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); /** * \brief This function reads and updates a seed file. The seed * is added to this instance. * * \param ctx The CTR_DRBG context. * \param path The name of the file. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or * #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG on failure. */ int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief The CTR_DRBG checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_ctr_drbg_self_test( int verbose ); /* Internal functions (do not call directly) */ int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *, int (*)(void *, unsigned char *, size_t), void *, const unsigned char *, size_t, size_t ); #ifdef __cplusplus } #endif #endif /* ctr_drbg.h */ fldigi-4.1.06/src/include/mbedtls/oid.h0000664000175000017500000007701113507401434014562 00000000000000/** * \file oid.h * * \brief Object Identifier (OID) database */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_OID_H #define MBEDTLS_OID_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "asn1.h" #include "pk.h" #include #if defined(MBEDTLS_CIPHER_C) #include "cipher.h" #endif #if defined(MBEDTLS_MD_C) #include "md.h" #endif #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) #include "x509.h" #endif #define MBEDTLS_ERR_OID_NOT_FOUND -0x002E /**< OID is not found. */ #define MBEDTLS_ERR_OID_BUF_TOO_SMALL -0x000B /**< output buffer is too small */ /* * Top level OID tuples */ #define MBEDTLS_OID_ISO_MEMBER_BODIES "\x2a" /* {iso(1) member-body(2)} */ #define MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x2b" /* {iso(1) identified-organization(3)} */ #define MBEDTLS_OID_ISO_CCITT_DS "\x55" /* {joint-iso-ccitt(2) ds(5)} */ #define MBEDTLS_OID_ISO_ITU_COUNTRY "\x60" /* {joint-iso-itu-t(2) country(16)} */ /* * ISO Member bodies OID parts */ #define MBEDTLS_OID_COUNTRY_US "\x86\x48" /* {us(840)} */ #define MBEDTLS_OID_ORG_RSA_DATA_SECURITY "\x86\xf7\x0d" /* {rsadsi(113549)} */ #define MBEDTLS_OID_RSA_COMPANY MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ MBEDTLS_OID_ORG_RSA_DATA_SECURITY /* {iso(1) member-body(2) us(840) rsadsi(113549)} */ #define MBEDTLS_OID_ORG_ANSI_X9_62 "\xce\x3d" /* ansi-X9-62(10045) */ #define MBEDTLS_OID_ANSI_X9_62 MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ MBEDTLS_OID_ORG_ANSI_X9_62 /* * ISO Identified organization OID parts */ #define MBEDTLS_OID_ORG_DOD "\x06" /* {dod(6)} */ #define MBEDTLS_OID_ORG_OIW "\x0e" #define MBEDTLS_OID_OIW_SECSIG MBEDTLS_OID_ORG_OIW "\x03" #define MBEDTLS_OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG "\x02" #define MBEDTLS_OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_ALG "\x1a" #define MBEDTLS_OID_ORG_CERTICOM "\x81\x04" /* certicom(132) */ #define MBEDTLS_OID_CERTICOM MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_CERTICOM #define MBEDTLS_OID_ORG_TELETRUST "\x24" /* teletrust(36) */ #define MBEDTLS_OID_TELETRUST MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_TELETRUST /* * ISO ITU OID parts */ #define MBEDTLS_OID_ORGANIZATION "\x01" /* {organization(1)} */ #define MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_COUNTRY MBEDTLS_OID_COUNTRY_US MBEDTLS_OID_ORGANIZATION /* {joint-iso-itu-t(2) country(16) us(840) organization(1)} */ #define MBEDTLS_OID_ORG_GOV "\x65" /* {gov(101)} */ #define MBEDTLS_OID_GOV MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_GOV /* {joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)} */ #define MBEDTLS_OID_ORG_NETSCAPE "\x86\xF8\x42" /* {netscape(113730)} */ #define MBEDTLS_OID_NETSCAPE MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_NETSCAPE /* Netscape OID {joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730)} */ /* ISO arc for standard certificate and CRL extensions */ #define MBEDTLS_OID_ID_CE MBEDTLS_OID_ISO_CCITT_DS "\x1D" /**< id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} */ #define MBEDTLS_OID_NIST_ALG MBEDTLS_OID_GOV "\x03\x04" /** { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistAlgorithm(4) */ /** * Private Internet Extensions * { iso(1) identified-organization(3) dod(6) internet(1) * security(5) mechanisms(5) pkix(7) } */ #define MBEDTLS_OID_PKIX MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_DOD "\x01\x05\x05\x07" /* * Arc for standard naming attributes */ #define MBEDTLS_OID_AT MBEDTLS_OID_ISO_CCITT_DS "\x04" /**< id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} */ #define MBEDTLS_OID_AT_CN MBEDTLS_OID_AT "\x03" /**< id-at-commonName AttributeType:= {id-at 3} */ #define MBEDTLS_OID_AT_SUR_NAME MBEDTLS_OID_AT "\x04" /**< id-at-surName AttributeType:= {id-at 4} */ #define MBEDTLS_OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT "\x05" /**< id-at-serialNumber AttributeType:= {id-at 5} */ #define MBEDTLS_OID_AT_COUNTRY MBEDTLS_OID_AT "\x06" /**< id-at-countryName AttributeType:= {id-at 6} */ #define MBEDTLS_OID_AT_LOCALITY MBEDTLS_OID_AT "\x07" /**< id-at-locality AttributeType:= {id-at 7} */ #define MBEDTLS_OID_AT_STATE MBEDTLS_OID_AT "\x08" /**< id-at-state AttributeType:= {id-at 8} */ #define MBEDTLS_OID_AT_ORGANIZATION MBEDTLS_OID_AT "\x0A" /**< id-at-organizationName AttributeType:= {id-at 10} */ #define MBEDTLS_OID_AT_ORG_UNIT MBEDTLS_OID_AT "\x0B" /**< id-at-organizationalUnitName AttributeType:= {id-at 11} */ #define MBEDTLS_OID_AT_TITLE MBEDTLS_OID_AT "\x0C" /**< id-at-title AttributeType:= {id-at 12} */ #define MBEDTLS_OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT "\x10" /**< id-at-postalAddress AttributeType:= {id-at 16} */ #define MBEDTLS_OID_AT_POSTAL_CODE MBEDTLS_OID_AT "\x11" /**< id-at-postalCode AttributeType:= {id-at 17} */ #define MBEDTLS_OID_AT_GIVEN_NAME MBEDTLS_OID_AT "\x2A" /**< id-at-givenName AttributeType:= {id-at 42} */ #define MBEDTLS_OID_AT_INITIALS MBEDTLS_OID_AT "\x2B" /**< id-at-initials AttributeType:= {id-at 43} */ #define MBEDTLS_OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT "\x2C" /**< id-at-generationQualifier AttributeType:= {id-at 44} */ #define MBEDTLS_OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT "\x2D" /**< id-at-uniqueIdentifier AttributType:= {id-at 45} */ #define MBEDTLS_OID_AT_DN_QUALIFIER MBEDTLS_OID_AT "\x2E" /**< id-at-dnQualifier AttributeType:= {id-at 46} */ #define MBEDTLS_OID_AT_PSEUDONYM MBEDTLS_OID_AT "\x41" /**< id-at-pseudonym AttributeType:= {id-at 65} */ #define MBEDTLS_OID_DOMAIN_COMPONENT "\x09\x92\x26\x89\x93\xF2\x2C\x64\x01\x19" /** id-domainComponent AttributeType:= {itu-t(0) data(9) pss(2342) ucl(19200300) pilot(100) pilotAttributeType(1) domainComponent(25)} */ /* * OIDs for standard certificate extensions */ #define MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x23" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } */ #define MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x0E" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } */ #define MBEDTLS_OID_KEY_USAGE MBEDTLS_OID_ID_CE "\x0F" /**< id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } */ #define MBEDTLS_OID_CERTIFICATE_POLICIES MBEDTLS_OID_ID_CE "\x20" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } */ #define MBEDTLS_OID_POLICY_MAPPINGS MBEDTLS_OID_ID_CE "\x21" /**< id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } */ #define MBEDTLS_OID_SUBJECT_ALT_NAME MBEDTLS_OID_ID_CE "\x11" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } */ #define MBEDTLS_OID_ISSUER_ALT_NAME MBEDTLS_OID_ID_CE "\x12" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } */ #define MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_ID_CE "\x09" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } */ #define MBEDTLS_OID_BASIC_CONSTRAINTS MBEDTLS_OID_ID_CE "\x13" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } */ #define MBEDTLS_OID_NAME_CONSTRAINTS MBEDTLS_OID_ID_CE "\x1E" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } */ #define MBEDTLS_OID_POLICY_CONSTRAINTS MBEDTLS_OID_ID_CE "\x24" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } */ #define MBEDTLS_OID_EXTENDED_KEY_USAGE MBEDTLS_OID_ID_CE "\x25" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */ #define MBEDTLS_OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_ID_CE "\x1F" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } */ #define MBEDTLS_OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_ID_CE "\x36" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } */ #define MBEDTLS_OID_FRESHEST_CRL MBEDTLS_OID_ID_CE "\x2E" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } */ /* * Netscape certificate extensions */ #define MBEDTLS_OID_NS_CERT MBEDTLS_OID_NETSCAPE "\x01" #define MBEDTLS_OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT "\x01" #define MBEDTLS_OID_NS_BASE_URL MBEDTLS_OID_NS_CERT "\x02" #define MBEDTLS_OID_NS_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x03" #define MBEDTLS_OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x04" #define MBEDTLS_OID_NS_RENEWAL_URL MBEDTLS_OID_NS_CERT "\x07" #define MBEDTLS_OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CERT "\x08" #define MBEDTLS_OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_CERT "\x0C" #define MBEDTLS_OID_NS_COMMENT MBEDTLS_OID_NS_CERT "\x0D" #define MBEDTLS_OID_NS_DATA_TYPE MBEDTLS_OID_NETSCAPE "\x02" #define MBEDTLS_OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_DATA_TYPE "\x05" /* * OIDs for CRL extensions */ #define MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_ID_CE "\x10" #define MBEDTLS_OID_CRL_NUMBER MBEDTLS_OID_ID_CE "\x14" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */ /* * X.509 v3 Extended key usage OIDs */ #define MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE "\x00" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */ #define MBEDTLS_OID_KP MBEDTLS_OID_PKIX "\x03" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */ #define MBEDTLS_OID_SERVER_AUTH MBEDTLS_OID_KP "\x01" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */ #define MBEDTLS_OID_CLIENT_AUTH MBEDTLS_OID_KP "\x02" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */ #define MBEDTLS_OID_CODE_SIGNING MBEDTLS_OID_KP "\x03" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */ #define MBEDTLS_OID_EMAIL_PROTECTION MBEDTLS_OID_KP "\x04" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */ #define MBEDTLS_OID_TIME_STAMPING MBEDTLS_OID_KP "\x08" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */ #define MBEDTLS_OID_OCSP_SIGNING MBEDTLS_OID_KP "\x09" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */ /* * PKCS definition OIDs */ #define MBEDTLS_OID_PKCS MBEDTLS_OID_RSA_COMPANY "\x01" /**< pkcs OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) 1 } */ #define MBEDTLS_OID_PKCS1 MBEDTLS_OID_PKCS "\x01" /**< pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } */ #define MBEDTLS_OID_PKCS5 MBEDTLS_OID_PKCS "\x05" /**< pkcs-5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } */ #define MBEDTLS_OID_PKCS9 MBEDTLS_OID_PKCS "\x09" /**< pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } */ #define MBEDTLS_OID_PKCS12 MBEDTLS_OID_PKCS "\x0c" /**< pkcs-12 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } */ /* * PKCS#1 OIDs */ #define MBEDTLS_OID_PKCS1_RSA MBEDTLS_OID_PKCS1 "\x01" /**< rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } */ #define MBEDTLS_OID_PKCS1_MD2 MBEDTLS_OID_PKCS1 "\x02" /**< md2WithRSAEncryption ::= { pkcs-1 2 } */ #define MBEDTLS_OID_PKCS1_MD4 MBEDTLS_OID_PKCS1 "\x03" /**< md4WithRSAEncryption ::= { pkcs-1 3 } */ #define MBEDTLS_OID_PKCS1_MD5 MBEDTLS_OID_PKCS1 "\x04" /**< md5WithRSAEncryption ::= { pkcs-1 4 } */ #define MBEDTLS_OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1 "\x05" /**< sha1WithRSAEncryption ::= { pkcs-1 5 } */ #define MBEDTLS_OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1 "\x0e" /**< sha224WithRSAEncryption ::= { pkcs-1 14 } */ #define MBEDTLS_OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1 "\x0b" /**< sha256WithRSAEncryption ::= { pkcs-1 11 } */ #define MBEDTLS_OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1 "\x0c" /**< sha384WithRSAEncryption ::= { pkcs-1 12 } */ #define MBEDTLS_OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1 "\x0d" /**< sha512WithRSAEncryption ::= { pkcs-1 13 } */ #define MBEDTLS_OID_RSA_SHA_OBS "\x2B\x0E\x03\x02\x1D" #define MBEDTLS_OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9 "\x01" /**< emailAddress AttributeType ::= { pkcs-9 1 } */ /* RFC 4055 */ #define MBEDTLS_OID_RSASSA_PSS MBEDTLS_OID_PKCS1 "\x0a" /**< id-RSASSA-PSS ::= { pkcs-1 10 } */ #define MBEDTLS_OID_MGF1 MBEDTLS_OID_PKCS1 "\x08" /**< id-mgf1 ::= { pkcs-1 8 } */ /* * Digest algorithms */ #define MBEDTLS_OID_DIGEST_ALG_MD2 MBEDTLS_OID_RSA_COMPANY "\x02\x02" /**< id-mbedtls_md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } */ #define MBEDTLS_OID_DIGEST_ALG_MD4 MBEDTLS_OID_RSA_COMPANY "\x02\x04" /**< id-mbedtls_md4 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 4 } */ #define MBEDTLS_OID_DIGEST_ALG_MD5 MBEDTLS_OID_RSA_COMPANY "\x02\x05" /**< id-mbedtls_md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA1 MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_SHA1 /**< id-mbedtls_sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA224 MBEDTLS_OID_NIST_ALG "\x02\x04" /**< id-sha224 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 4 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA256 MBEDTLS_OID_NIST_ALG "\x02\x01" /**< id-mbedtls_sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA384 MBEDTLS_OID_NIST_ALG "\x02\x02" /**< id-sha384 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA512 MBEDTLS_OID_NIST_ALG "\x02\x03" /**< id-mbedtls_sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3 } */ #define MBEDTLS_OID_HMAC_SHA1 MBEDTLS_OID_RSA_COMPANY "\x02\x07" /**< id-hmacWithSHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 7 } */ #define MBEDTLS_OID_HMAC_SHA224 MBEDTLS_OID_RSA_COMPANY "\x02\x08" /**< id-hmacWithSHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 8 } */ #define MBEDTLS_OID_HMAC_SHA256 MBEDTLS_OID_RSA_COMPANY "\x02\x09" /**< id-hmacWithSHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 9 } */ #define MBEDTLS_OID_HMAC_SHA384 MBEDTLS_OID_RSA_COMPANY "\x02\x0A" /**< id-hmacWithSHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 10 } */ #define MBEDTLS_OID_HMAC_SHA512 MBEDTLS_OID_RSA_COMPANY "\x02\x0B" /**< id-hmacWithSHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 11 } */ /* * Encryption algorithms */ #define MBEDTLS_OID_DES_CBC MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_ALG "\x07" /**< desCBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7 } */ #define MBEDTLS_OID_DES_EDE3_CBC MBEDTLS_OID_RSA_COMPANY "\x03\x07" /**< des-ede3-cbc OBJECT IDENTIFIER ::= { iso(1) member-body(2) -- us(840) rsadsi(113549) encryptionAlgorithm(3) 7 } */ #define MBEDTLS_OID_AES MBEDTLS_OID_NIST_ALG "\x01" /** aes OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistAlgorithm(4) 1 } */ /* * Key Wrapping algorithms */ /* * RFC 5649 */ #define MBEDTLS_OID_AES128_KW MBEDTLS_OID_AES "\x05" /** id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } */ #define MBEDTLS_OID_AES128_KWP MBEDTLS_OID_AES "\x08" /** id-aes128-wrap-pad OBJECT IDENTIFIER ::= { aes 8 } */ #define MBEDTLS_OID_AES192_KW MBEDTLS_OID_AES "\x19" /** id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } */ #define MBEDTLS_OID_AES192_KWP MBEDTLS_OID_AES "\x1c" /** id-aes192-wrap-pad OBJECT IDENTIFIER ::= { aes 28 } */ #define MBEDTLS_OID_AES256_KW MBEDTLS_OID_AES "\x2d" /** id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } */ #define MBEDTLS_OID_AES256_KWP MBEDTLS_OID_AES "\x30" /** id-aes256-wrap-pad OBJECT IDENTIFIER ::= { aes 48 } */ /* * PKCS#5 OIDs */ #define MBEDTLS_OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5 "\x0c" /**< id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} */ #define MBEDTLS_OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5 "\x0d" /**< id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} */ #define MBEDTLS_OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5 "\x0e" /**< id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14} */ /* * PKCS#5 PBES1 algorithms */ #define MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5 "\x01" /**< pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1} */ #define MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5 "\x04" /**< pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4} */ #define MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5 "\x03" /**< pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3} */ #define MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5 "\x06" /**< pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6} */ #define MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5 "\x0a" /**< pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10} */ #define MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5 "\x0b" /**< pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11} */ /* * PKCS#8 OIDs */ #define MBEDTLS_OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9 "\x0e" /**< extensionRequest OBJECT IDENTIFIER ::= {pkcs-9 14} */ /* * PKCS#12 PBE OIDs */ #define MBEDTLS_OID_PKCS12_PBE MBEDTLS_OID_PKCS12 "\x01" /**< pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE "\x01" /**< pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE "\x02" /**< pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x03" /**< pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x04" /**< pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */ /* * EC key algorithms from RFC 5480 */ /* id-ecPublicKey OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } */ #define MBEDTLS_OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_ANSI_X9_62 "\x02\01" /* id-ecDH OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) * schemes(1) ecdh(12) } */ #define MBEDTLS_OID_EC_ALG_ECDH MBEDTLS_OID_CERTICOM "\x01\x0c" /* * ECParameters namedCurve identifiers, from RFC 5480, RFC 5639, and SEC2 */ /* secp192r1 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 } */ #define MBEDTLS_OID_EC_GRP_SECP192R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x01" /* secp224r1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 33 } */ #define MBEDTLS_OID_EC_GRP_SECP224R1 MBEDTLS_OID_CERTICOM "\x00\x21" /* secp256r1 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 } */ #define MBEDTLS_OID_EC_GRP_SECP256R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x07" /* secp384r1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 34 } */ #define MBEDTLS_OID_EC_GRP_SECP384R1 MBEDTLS_OID_CERTICOM "\x00\x22" /* secp521r1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 35 } */ #define MBEDTLS_OID_EC_GRP_SECP521R1 MBEDTLS_OID_CERTICOM "\x00\x23" /* secp192k1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 31 } */ #define MBEDTLS_OID_EC_GRP_SECP192K1 MBEDTLS_OID_CERTICOM "\x00\x1f" /* secp224k1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 32 } */ #define MBEDTLS_OID_EC_GRP_SECP224K1 MBEDTLS_OID_CERTICOM "\x00\x20" /* secp256k1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 10 } */ #define MBEDTLS_OID_EC_GRP_SECP256K1 MBEDTLS_OID_CERTICOM "\x00\x0a" /* RFC 5639 4.1 * ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1) * identified-organization(3) teletrust(36) algorithm(3) signature- * algorithm(3) ecSign(2) 8} * ellipticCurve OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1} * versionOne OBJECT IDENTIFIER ::= {ellipticCurve 1} */ #define MBEDTLS_OID_EC_BRAINPOOL_V1 MBEDTLS_OID_TELETRUST "\x03\x03\x02\x08\x01\x01" /* brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7} */ #define MBEDTLS_OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x07" /* brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11} */ #define MBEDTLS_OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0B" /* brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13} */ #define MBEDTLS_OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0D" /* * SEC1 C.1 * * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } * id-fieldType OBJECT IDENTIFIER ::= { ansi-X9-62 fieldType(1)} */ #define MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62 "\x01" #define MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE "\x01" /* * ECDSA signature identifiers, from RFC 5480 */ #define MBEDTLS_OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62 "\x04" /* signatures(4) */ #define MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG "\x03" /* ecdsa-with-SHA2(3) */ /* ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } */ #define MBEDTLS_OID_ECDSA_SHA1 MBEDTLS_OID_ANSI_X9_62_SIG "\x01" /* ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 1 } */ #define MBEDTLS_OID_ECDSA_SHA224 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x01" /* ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 2 } */ #define MBEDTLS_OID_ECDSA_SHA256 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x02" /* ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 3 } */ #define MBEDTLS_OID_ECDSA_SHA384 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x03" /* ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 4 } */ #define MBEDTLS_OID_ECDSA_SHA512 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x04" #ifdef __cplusplus extern "C" { #endif /** * \brief Base OID descriptor structure */ typedef struct mbedtls_oid_descriptor_t { const char *asn1; /*!< OID ASN.1 representation */ size_t asn1_len; /*!< length of asn1 */ const char *name; /*!< official name (e.g. from RFC) */ const char *description; /*!< human friendly description */ } mbedtls_oid_descriptor_t; /** * \brief Translate an ASN.1 OID into its numeric representation * (e.g. "\x2A\x86\x48\x86\xF7\x0D" into "1.2.840.113549") * * \param buf buffer to put representation in * \param size size of the buffer * \param oid OID to translate * * \return Length of the string written (excluding final NULL) or * MBEDTLS_ERR_OID_BUF_TOO_SMALL in case of error */ int mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid ); #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) /** * \brief Translate an X.509 extension OID into local values * * \param oid OID to use * \param ext_type place to store the extension type * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_x509_ext_type( const mbedtls_asn1_buf *oid, int *ext_type ); #endif /** * \brief Translate an X.509 attribute type OID into the short name * (e.g. the OID for an X520 Common Name into "CN") * * \param oid OID to use * \param short_name place to store the string pointer * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_attr_short_name( const mbedtls_asn1_buf *oid, const char **short_name ); /** * \brief Translate PublicKeyAlgorithm OID into pk_type * * \param oid OID to use * \param pk_alg place to store public key algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_pk_alg( const mbedtls_asn1_buf *oid, mbedtls_pk_type_t *pk_alg ); /** * \brief Translate pk_type into PublicKeyAlgorithm OID * * \param pk_alg Public key type to look for * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_type_t pk_alg, const char **oid, size_t *olen ); #if defined(MBEDTLS_ECP_C) /** * \brief Translate NamedCurve OID into an EC group identifier * * \param oid OID to use * \param grp_id place to store group id * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_ec_grp( const mbedtls_asn1_buf *oid, mbedtls_ecp_group_id *grp_id ); /** * \brief Translate EC group identifier into NamedCurve OID * * \param grp_id EC group identifier * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_ec_grp( mbedtls_ecp_group_id grp_id, const char **oid, size_t *olen ); #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_MD_C) /** * \brief Translate SignatureAlgorithm OID into md_type and pk_type * * \param oid OID to use * \param md_alg place to store message digest algorithm * \param pk_alg place to store public key algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_sig_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg ); /** * \brief Translate SignatureAlgorithm OID into description * * \param oid OID to use * \param desc place to store string pointer * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_sig_alg_desc( const mbedtls_asn1_buf *oid, const char **desc ); /** * \brief Translate md_type and pk_type into SignatureAlgorithm OID * * \param md_alg message digest algorithm * \param pk_alg public key algorithm * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_sig_alg( mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, const char **oid, size_t *olen ); /** * \brief Translate hash algorithm OID into md_type * * \param oid OID to use * \param md_alg place to store message digest algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_md_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg ); /** * \brief Translate hmac algorithm OID into md_type * * \param oid OID to use * \param md_hmac place to store message hmac algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_md_hmac( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_hmac ); #endif /* MBEDTLS_MD_C */ /** * \brief Translate Extended Key Usage OID into description * * \param oid OID to use * \param desc place to store string pointer * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_extended_key_usage( const mbedtls_asn1_buf *oid, const char **desc ); /** * \brief Translate md_type into hash algorithm OID * * \param md_alg message digest algorithm * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_md( mbedtls_md_type_t md_alg, const char **oid, size_t *olen ); #if defined(MBEDTLS_CIPHER_C) /** * \brief Translate encryption algorithm OID into cipher_type * * \param oid OID to use * \param cipher_alg place to store cipher algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_cipher_alg( const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg ); #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_PKCS12_C) /** * \brief Translate PKCS#12 PBE algorithm OID into md_type and * cipher_type * * \param oid OID to use * \param md_alg place to store message digest algorithm * \param cipher_alg place to store cipher algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_pkcs12_pbe_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, mbedtls_cipher_type_t *cipher_alg ); #endif /* MBEDTLS_PKCS12_C */ #ifdef __cplusplus } #endif #endif /* oid.h */ fldigi-4.1.06/src/include/mbedtls/cipher.h0000664000175000017500000011477013507401434015265 00000000000000/** * \file cipher.h * * \brief This file contains an abstraction interface for use with the cipher * primitives provided by the library. It provides a common interface to all of * the available cipher operations. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CIPHER_H #define MBEDTLS_CIPHER_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include "mbedtls/platform_util.h" #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) #define MBEDTLS_CIPHER_MODE_AEAD #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) #define MBEDTLS_CIPHER_MODE_WITH_PADDING #endif #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ defined(MBEDTLS_CHACHA20_C) #define MBEDTLS_CIPHER_MODE_STREAM #endif #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080 /**< The selected feature is not available. */ #define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -0x6100 /**< Bad input parameters. */ #define MBEDTLS_ERR_CIPHER_ALLOC_FAILED -0x6180 /**< Failed to allocate memory. */ #define MBEDTLS_ERR_CIPHER_INVALID_PADDING -0x6200 /**< Input data contains invalid padding and is rejected. */ #define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280 /**< Decryption of block requires a full block. */ #define MBEDTLS_ERR_CIPHER_AUTH_FAILED -0x6300 /**< Authentication failed (for AEAD modes). */ #define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT -0x6380 /**< The context is invalid. For example, because it was freed. */ /* MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED -0x6400 /**< Cipher hardware accelerator failed. */ #define MBEDTLS_CIPHER_VARIABLE_IV_LEN 0x01 /**< Cipher accepts IVs of variable length. */ #define MBEDTLS_CIPHER_VARIABLE_KEY_LEN 0x02 /**< Cipher accepts keys of variable length. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Supported cipher types. * * \warning RC4 and DES are considered weak ciphers and their use * constitutes a security risk. Arm recommends considering stronger * ciphers instead. */ typedef enum { MBEDTLS_CIPHER_ID_NONE = 0, /**< Placeholder to mark the end of cipher ID lists. */ MBEDTLS_CIPHER_ID_NULL, /**< The identity cipher, treated as a stream cipher. */ MBEDTLS_CIPHER_ID_AES, /**< The AES cipher. */ MBEDTLS_CIPHER_ID_DES, /**< The DES cipher. */ MBEDTLS_CIPHER_ID_3DES, /**< The Triple DES cipher. */ MBEDTLS_CIPHER_ID_CAMELLIA, /**< The Camellia cipher. */ MBEDTLS_CIPHER_ID_BLOWFISH, /**< The Blowfish cipher. */ MBEDTLS_CIPHER_ID_ARC4, /**< The RC4 cipher. */ MBEDTLS_CIPHER_ID_ARIA, /**< The Aria cipher. */ MBEDTLS_CIPHER_ID_CHACHA20, /**< The ChaCha20 cipher. */ } mbedtls_cipher_id_t; /** * \brief Supported {cipher type, cipher mode} pairs. * * \warning RC4 and DES are considered weak ciphers and their use * constitutes a security risk. Arm recommends considering stronger * ciphers instead. */ typedef enum { MBEDTLS_CIPHER_NONE = 0, /**< Placeholder to mark the end of cipher-pair lists. */ MBEDTLS_CIPHER_NULL, /**< The identity stream cipher. */ MBEDTLS_CIPHER_AES_128_ECB, /**< AES cipher with 128-bit ECB mode. */ MBEDTLS_CIPHER_AES_192_ECB, /**< AES cipher with 192-bit ECB mode. */ MBEDTLS_CIPHER_AES_256_ECB, /**< AES cipher with 256-bit ECB mode. */ MBEDTLS_CIPHER_AES_128_CBC, /**< AES cipher with 128-bit CBC mode. */ MBEDTLS_CIPHER_AES_192_CBC, /**< AES cipher with 192-bit CBC mode. */ MBEDTLS_CIPHER_AES_256_CBC, /**< AES cipher with 256-bit CBC mode. */ MBEDTLS_CIPHER_AES_128_CFB128, /**< AES cipher with 128-bit CFB128 mode. */ MBEDTLS_CIPHER_AES_192_CFB128, /**< AES cipher with 192-bit CFB128 mode. */ MBEDTLS_CIPHER_AES_256_CFB128, /**< AES cipher with 256-bit CFB128 mode. */ MBEDTLS_CIPHER_AES_128_CTR, /**< AES cipher with 128-bit CTR mode. */ MBEDTLS_CIPHER_AES_192_CTR, /**< AES cipher with 192-bit CTR mode. */ MBEDTLS_CIPHER_AES_256_CTR, /**< AES cipher with 256-bit CTR mode. */ MBEDTLS_CIPHER_AES_128_GCM, /**< AES cipher with 128-bit GCM mode. */ MBEDTLS_CIPHER_AES_192_GCM, /**< AES cipher with 192-bit GCM mode. */ MBEDTLS_CIPHER_AES_256_GCM, /**< AES cipher with 256-bit GCM mode. */ MBEDTLS_CIPHER_CAMELLIA_128_ECB, /**< Camellia cipher with 128-bit ECB mode. */ MBEDTLS_CIPHER_CAMELLIA_192_ECB, /**< Camellia cipher with 192-bit ECB mode. */ MBEDTLS_CIPHER_CAMELLIA_256_ECB, /**< Camellia cipher with 256-bit ECB mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CBC, /**< Camellia cipher with 128-bit CBC mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CBC, /**< Camellia cipher with 192-bit CBC mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CBC, /**< Camellia cipher with 256-bit CBC mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CFB128, /**< Camellia cipher with 128-bit CFB128 mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CFB128, /**< Camellia cipher with 192-bit CFB128 mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CFB128, /**< Camellia cipher with 256-bit CFB128 mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CTR, /**< Camellia cipher with 128-bit CTR mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CTR, /**< Camellia cipher with 192-bit CTR mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CTR, /**< Camellia cipher with 256-bit CTR mode. */ MBEDTLS_CIPHER_CAMELLIA_128_GCM, /**< Camellia cipher with 128-bit GCM mode. */ MBEDTLS_CIPHER_CAMELLIA_192_GCM, /**< Camellia cipher with 192-bit GCM mode. */ MBEDTLS_CIPHER_CAMELLIA_256_GCM, /**< Camellia cipher with 256-bit GCM mode. */ MBEDTLS_CIPHER_DES_ECB, /**< DES cipher with ECB mode. */ MBEDTLS_CIPHER_DES_CBC, /**< DES cipher with CBC mode. */ MBEDTLS_CIPHER_DES_EDE_ECB, /**< DES cipher with EDE ECB mode. */ MBEDTLS_CIPHER_DES_EDE_CBC, /**< DES cipher with EDE CBC mode. */ MBEDTLS_CIPHER_DES_EDE3_ECB, /**< DES cipher with EDE3 ECB mode. */ MBEDTLS_CIPHER_DES_EDE3_CBC, /**< DES cipher with EDE3 CBC mode. */ MBEDTLS_CIPHER_BLOWFISH_ECB, /**< Blowfish cipher with ECB mode. */ MBEDTLS_CIPHER_BLOWFISH_CBC, /**< Blowfish cipher with CBC mode. */ MBEDTLS_CIPHER_BLOWFISH_CFB64, /**< Blowfish cipher with CFB64 mode. */ MBEDTLS_CIPHER_BLOWFISH_CTR, /**< Blowfish cipher with CTR mode. */ MBEDTLS_CIPHER_ARC4_128, /**< RC4 cipher with 128-bit mode. */ MBEDTLS_CIPHER_AES_128_CCM, /**< AES cipher with 128-bit CCM mode. */ MBEDTLS_CIPHER_AES_192_CCM, /**< AES cipher with 192-bit CCM mode. */ MBEDTLS_CIPHER_AES_256_CCM, /**< AES cipher with 256-bit CCM mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CCM, /**< Camellia cipher with 128-bit CCM mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CCM, /**< Camellia cipher with 192-bit CCM mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CCM, /**< Camellia cipher with 256-bit CCM mode. */ MBEDTLS_CIPHER_ARIA_128_ECB, /**< Aria cipher with 128-bit key and ECB mode. */ MBEDTLS_CIPHER_ARIA_192_ECB, /**< Aria cipher with 192-bit key and ECB mode. */ MBEDTLS_CIPHER_ARIA_256_ECB, /**< Aria cipher with 256-bit key and ECB mode. */ MBEDTLS_CIPHER_ARIA_128_CBC, /**< Aria cipher with 128-bit key and CBC mode. */ MBEDTLS_CIPHER_ARIA_192_CBC, /**< Aria cipher with 192-bit key and CBC mode. */ MBEDTLS_CIPHER_ARIA_256_CBC, /**< Aria cipher with 256-bit key and CBC mode. */ MBEDTLS_CIPHER_ARIA_128_CFB128, /**< Aria cipher with 128-bit key and CFB-128 mode. */ MBEDTLS_CIPHER_ARIA_192_CFB128, /**< Aria cipher with 192-bit key and CFB-128 mode. */ MBEDTLS_CIPHER_ARIA_256_CFB128, /**< Aria cipher with 256-bit key and CFB-128 mode. */ MBEDTLS_CIPHER_ARIA_128_CTR, /**< Aria cipher with 128-bit key and CTR mode. */ MBEDTLS_CIPHER_ARIA_192_CTR, /**< Aria cipher with 192-bit key and CTR mode. */ MBEDTLS_CIPHER_ARIA_256_CTR, /**< Aria cipher with 256-bit key and CTR mode. */ MBEDTLS_CIPHER_ARIA_128_GCM, /**< Aria cipher with 128-bit key and GCM mode. */ MBEDTLS_CIPHER_ARIA_192_GCM, /**< Aria cipher with 192-bit key and GCM mode. */ MBEDTLS_CIPHER_ARIA_256_GCM, /**< Aria cipher with 256-bit key and GCM mode. */ MBEDTLS_CIPHER_ARIA_128_CCM, /**< Aria cipher with 128-bit key and CCM mode. */ MBEDTLS_CIPHER_ARIA_192_CCM, /**< Aria cipher with 192-bit key and CCM mode. */ MBEDTLS_CIPHER_ARIA_256_CCM, /**< Aria cipher with 256-bit key and CCM mode. */ MBEDTLS_CIPHER_AES_128_OFB, /**< AES 128-bit cipher in OFB mode. */ MBEDTLS_CIPHER_AES_192_OFB, /**< AES 192-bit cipher in OFB mode. */ MBEDTLS_CIPHER_AES_256_OFB, /**< AES 256-bit cipher in OFB mode. */ MBEDTLS_CIPHER_AES_128_XTS, /**< AES 128-bit cipher in XTS block mode. */ MBEDTLS_CIPHER_AES_256_XTS, /**< AES 256-bit cipher in XTS block mode. */ MBEDTLS_CIPHER_CHACHA20, /**< ChaCha20 stream cipher. */ MBEDTLS_CIPHER_CHACHA20_POLY1305, /**< ChaCha20-Poly1305 AEAD cipher. */ } mbedtls_cipher_type_t; /** Supported cipher modes. */ typedef enum { MBEDTLS_MODE_NONE = 0, /**< None. */ MBEDTLS_MODE_ECB, /**< The ECB cipher mode. */ MBEDTLS_MODE_CBC, /**< The CBC cipher mode. */ MBEDTLS_MODE_CFB, /**< The CFB cipher mode. */ MBEDTLS_MODE_OFB, /**< The OFB cipher mode. */ MBEDTLS_MODE_CTR, /**< The CTR cipher mode. */ MBEDTLS_MODE_GCM, /**< The GCM cipher mode. */ MBEDTLS_MODE_STREAM, /**< The stream cipher mode. */ MBEDTLS_MODE_CCM, /**< The CCM cipher mode. */ MBEDTLS_MODE_XTS, /**< The XTS cipher mode. */ MBEDTLS_MODE_CHACHAPOLY, /**< The ChaCha-Poly cipher mode. */ } mbedtls_cipher_mode_t; /** Supported cipher padding types. */ typedef enum { MBEDTLS_PADDING_PKCS7 = 0, /**< PKCS7 padding (default). */ MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding. */ MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding. */ MBEDTLS_PADDING_ZEROS, /**< Zero padding (not reversible). */ MBEDTLS_PADDING_NONE, /**< Never pad (full blocks only). */ } mbedtls_cipher_padding_t; /** Type of operation. */ typedef enum { MBEDTLS_OPERATION_NONE = -1, MBEDTLS_DECRYPT = 0, MBEDTLS_ENCRYPT, } mbedtls_operation_t; enum { /** Undefined key length. */ MBEDTLS_KEY_LENGTH_NONE = 0, /** Key length, in bits (including parity), for DES keys. */ MBEDTLS_KEY_LENGTH_DES = 64, /** Key length in bits, including parity, for DES in two-key EDE. */ MBEDTLS_KEY_LENGTH_DES_EDE = 128, /** Key length in bits, including parity, for DES in three-key EDE. */ MBEDTLS_KEY_LENGTH_DES_EDE3 = 192, }; /** Maximum length of any IV, in Bytes. */ #define MBEDTLS_MAX_IV_LENGTH 16 /** Maximum block size of any cipher, in Bytes. */ #define MBEDTLS_MAX_BLOCK_LENGTH 16 /** * Base cipher information (opaque struct). */ typedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t; /** * CMAC context (opaque struct). */ typedef struct mbedtls_cmac_context_t mbedtls_cmac_context_t; /** * Cipher information. Allows calling cipher functions * in a generic way. */ typedef struct mbedtls_cipher_info_t { /** Full cipher identifier. For example, * MBEDTLS_CIPHER_AES_256_CBC. */ mbedtls_cipher_type_t type; /** The cipher mode. For example, MBEDTLS_MODE_CBC. */ mbedtls_cipher_mode_t mode; /** The cipher key length, in bits. This is the * default length for variable sized ciphers. * Includes parity bits for ciphers like DES. */ unsigned int key_bitlen; /** Name of the cipher. */ const char * name; /** IV or nonce size, in Bytes. * For ciphers that accept variable IV sizes, * this is the recommended size. */ unsigned int iv_size; /** Bitflag comprised of MBEDTLS_CIPHER_VARIABLE_IV_LEN and * MBEDTLS_CIPHER_VARIABLE_KEY_LEN indicating whether the * cipher supports variable IV or variable key sizes, respectively. */ int flags; /** The block size, in Bytes. */ unsigned int block_size; /** Struct for base cipher information and functions. */ const mbedtls_cipher_base_t *base; } mbedtls_cipher_info_t; /** * Generic cipher context. */ typedef struct mbedtls_cipher_context_t { /** Information about the associated cipher. */ const mbedtls_cipher_info_t *cipher_info; /** Key length to use. */ int key_bitlen; /** Operation that the key of the context has been * initialized for. */ mbedtls_operation_t operation; #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) /** Padding functions to use, if relevant for * the specific cipher mode. */ void (*add_padding)( unsigned char *output, size_t olen, size_t data_len ); int (*get_padding)( unsigned char *input, size_t ilen, size_t *data_len ); #endif /** Buffer for input that has not been processed yet. */ unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH]; /** Number of Bytes that have not been processed yet. */ size_t unprocessed_len; /** Current IV or NONCE_COUNTER for CTR-mode, data unit (or sector) number * for XTS-mode. */ unsigned char iv[MBEDTLS_MAX_IV_LENGTH]; /** IV size in Bytes, for ciphers with variable-length IVs. */ size_t iv_size; /** The cipher-specific context. */ void *cipher_ctx; #if defined(MBEDTLS_CMAC_C) /** CMAC-specific context. */ mbedtls_cmac_context_t *cmac_ctx; #endif } mbedtls_cipher_context_t; /** * \brief This function retrieves the list of ciphers supported by the generic * cipher module. * * \return A statically-allocated array of ciphers. The last entry * is zero. */ const int *mbedtls_cipher_list( void ); /** * \brief This function retrieves the cipher-information * structure associated with the given cipher name. * * \param cipher_name Name of the cipher to search for. This must not be * \c NULL. * * \return The cipher information structure associated with the * given \p cipher_name. * \return \c NULL if the associated cipher information is not found. */ const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name ); /** * \brief This function retrieves the cipher-information * structure associated with the given cipher type. * * \param cipher_type Type of the cipher to search for. * * \return The cipher information structure associated with the * given \p cipher_type. * \return \c NULL if the associated cipher information is not found. */ const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type ); /** * \brief This function retrieves the cipher-information * structure associated with the given cipher ID, * key size and mode. * * \param cipher_id The ID of the cipher to search for. For example, * #MBEDTLS_CIPHER_ID_AES. * \param key_bitlen The length of the key in bits. * \param mode The cipher mode. For example, #MBEDTLS_MODE_CBC. * * \return The cipher information structure associated with the * given \p cipher_id. * \return \c NULL if the associated cipher information is not found. */ const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id, int key_bitlen, const mbedtls_cipher_mode_t mode ); /** * \brief This function initializes a \p cipher_context as NONE. * * \param ctx The context to be initialized. This must not be \c NULL. */ void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx ); /** * \brief This function frees and clears the cipher-specific * context of \p ctx. Freeing \p ctx itself remains the * responsibility of the caller. * * \param ctx The context to be freed. If this is \c NULL, the * function has no effect, otherwise this must point to an * initialized context. */ void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx ); /** * \brief This function initializes and fills the cipher-context * structure with the appropriate values. It also clears * the structure. * * \param ctx The context to initialize. This must be initialized. * \param cipher_info The cipher to use. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the * cipher-specific context fails. * * \internal Currently, the function also clears the structure. * In future versions, the caller will be required to call * mbedtls_cipher_init() on the structure first. */ int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info ); /** * \brief This function returns the block size of the given cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The block size of the underlying cipher. * \return \c 0 if \p ctx has not been initialized. */ static inline unsigned int mbedtls_cipher_get_block_size( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, 0 ); if( ctx->cipher_info == NULL ) return 0; return ctx->cipher_info->block_size; } /** * \brief This function returns the mode of operation for * the cipher. For example, MBEDTLS_MODE_CBC. * * \param ctx The context of the cipher. This must be initialized. * * \return The mode of operation. * \return #MBEDTLS_MODE_NONE if \p ctx has not been initialized. */ static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_MODE_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_MODE_NONE; return ctx->cipher_info->mode; } /** * \brief This function returns the size of the IV or nonce * of the cipher, in Bytes. * * \param ctx The context of the cipher. This must be initialized. * * \return The recommended IV size if no IV has been set. * \return \c 0 for ciphers not using an IV or a nonce. * \return The actual size if an IV has been set. */ static inline int mbedtls_cipher_get_iv_size( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, 0 ); if( ctx->cipher_info == NULL ) return 0; if( ctx->iv_size != 0 ) return (int) ctx->iv_size; return (int) ctx->cipher_info->iv_size; } /** * \brief This function returns the type of the given cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The type of the cipher. * \return #MBEDTLS_CIPHER_NONE if \p ctx has not been initialized. */ static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_CIPHER_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_CIPHER_NONE; return ctx->cipher_info->type; } /** * \brief This function returns the name of the given cipher * as a string. * * \param ctx The context of the cipher. This must be initialized. * * \return The name of the cipher. * \return NULL if \p ctx has not been not initialized. */ static inline const char *mbedtls_cipher_get_name( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, 0 ); if( ctx->cipher_info == NULL ) return 0; return ctx->cipher_info->name; } /** * \brief This function returns the key length of the cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The key length of the cipher in bits. * \return #MBEDTLS_KEY_LENGTH_NONE if ctx \p has not been * initialized. */ static inline int mbedtls_cipher_get_key_bitlen( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_KEY_LENGTH_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_KEY_LENGTH_NONE; return (int) ctx->cipher_info->key_bitlen; } /** * \brief This function returns the operation of the given cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The type of operation: #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. * \return #MBEDTLS_OPERATION_NONE if \p ctx has not been initialized. */ static inline mbedtls_operation_t mbedtls_cipher_get_operation( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_OPERATION_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_OPERATION_NONE; return ctx->operation; } /** * \brief This function sets the key to use with the given context. * * \param ctx The generic cipher context. This must be initialized and * bound to a cipher information structure. * \param key The key to use. This must be a readable buffer of at * least \p key_bitlen Bits. * \param key_bitlen The key length to use, in Bits. * \param operation The operation that the key will be used for: * #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key, int key_bitlen, const mbedtls_operation_t operation ); #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) /** * \brief This function sets the padding mode, for cipher modes * that use padding. * * The default passing mode is PKCS7 padding. * * \param ctx The generic cipher context. This must be initialized and * bound to a cipher information structure. * \param mode The padding mode. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE * if the selected padding mode is not supported. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode * does not support padding. */ int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode ); #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ /** * \brief This function sets the initialization vector (IV) * or nonce. * * \note Some ciphers do not use IVs nor nonce. For these * ciphers, this function has no effect. * * \param ctx The generic cipher context. This must be initialized and * bound to a cipher information structure. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. This * must be a readable buffer of at least \p iv_len Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size IV. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. */ int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len ); /** * \brief This function resets the cipher state. * * \param ctx The generic cipher context. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. */ int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx ); #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) /** * \brief This function adds additional data for AEAD ciphers. * Currently supported with GCM and ChaCha20+Poly1305. * This must be called exactly once, after * mbedtls_cipher_reset(). * * \param ctx The generic cipher context. This must be initialized. * \param ad The additional data to use. This must be a readable * buffer of at least \p ad_len Bytes. * \param ad_len the Length of \p ad Bytes. * * \return \c 0 on success. * \return A specific error code on failure. */ int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx, const unsigned char *ad, size_t ad_len ); #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ /** * \brief The generic cipher update function. It encrypts or * decrypts using the given cipher context. Writes as * many block-sized blocks of data as possible to output. * Any data that cannot be written immediately is either * added to the next block, or flushed when * mbedtls_cipher_finish() is called. * Exception: For MBEDTLS_MODE_ECB, expects a single block * in size. For example, 16 Bytes for AES. * * \note If the underlying cipher is used in GCM mode, all calls * to this function, except for the last one before * mbedtls_cipher_finish(), must have \p ilen as a * multiple of the block size of the cipher. * * \param ctx The generic cipher context. This must be initialized and * bound to a key. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data. * \param output The buffer for the output data. This must be able to * hold at least `ilen + block_size`. This must not be the * same buffer as \p input. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an * unsupported mode for a cipher. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ); /** * \brief The generic cipher finalization function. If data still * needs to be flushed from an incomplete block, the data * contained in it is padded to the size of * the last block, and written to the \p output buffer. * * \param ctx The generic cipher context. This must be initialized and * bound to a key. * \param output The buffer to write data to. This needs to be a writable * buffer of at least \p block_size Bytes. * \param olen The length of the data written to the \p output buffer. * This may not be \c NULL. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption * expecting a full block but not receiving one. * \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding * while decrypting. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx, unsigned char *output, size_t *olen ); #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) /** * \brief This function writes a tag for AEAD ciphers. * Currently supported with GCM and ChaCha20+Poly1305. * This must be called after mbedtls_cipher_finish(). * * \param ctx The generic cipher context. This must be initialized, * bound to a key, and have just completed a cipher * operation through mbedtls_cipher_finish() the tag for * which should be written. * \param tag The buffer to write the tag to. This must be a writable * buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to write. * * \return \c 0 on success. * \return A specific error code on failure. */ int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx, unsigned char *tag, size_t tag_len ); /** * \brief This function checks the tag for AEAD ciphers. * Currently supported with GCM and ChaCha20+Poly1305. * This must be called after mbedtls_cipher_finish(). * * \param ctx The generic cipher context. This must be initialized. * \param tag The buffer holding the tag. This must be a readable * buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to check. * * \return \c 0 on success. * \return A specific error code on failure. */ int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx, const unsigned char *tag, size_t tag_len ); #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ /** * \brief The generic all-in-one encryption/decryption function, * for all ciphers except AEAD constructs. * * \param ctx The generic cipher context. This must be initialized. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. * This must be a readable buffer of at least \p iv_len * Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size * IV. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The buffer for the output data. This must be able to * hold at least `ilen + block_size`. This must not be the * same buffer as \p input. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * * \note Some ciphers do not use IVs nor nonce. For these * ciphers, use \p iv = NULL and \p iv_len = 0. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption * expecting a full block but not receiving one. * \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding * while decrypting. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ); #if defined(MBEDTLS_CIPHER_MODE_AEAD) /** * \brief The generic autenticated encryption (AEAD) function. * * \param ctx The generic cipher context. This must be initialized and * bound to a key. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. * This must be a readable buffer of at least \p iv_len * Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size IV. * \param ad The additional data to authenticate. This must be a * readable buffer of at least \p ad_len Bytes. * \param ad_len The length of \p ad. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data. * \param output The buffer for the output data. This must be able to * hold at least \p ilen Bytes. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * \param tag The buffer for the authentication tag. This must be a * writable buffer of at least \p tag_len Bytes. * \param tag_len The desired length of the authentication tag. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, unsigned char *tag, size_t tag_len ); /** * \brief The generic autenticated decryption (AEAD) function. * * \note If the data is not authentic, then the output buffer * is zeroed out to prevent the unauthentic plaintext being * used, making this interface safer. * * \param ctx The generic cipher context. This must be initialized and * and bound to a key. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. * This must be a readable buffer of at least \p iv_len * Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size IV. * \param ad The additional data to be authenticated. This must be a * readable buffer of at least \p ad_len Bytes. * \param ad_len The length of \p ad. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data. * \param output The buffer for the output data. * This must be able to hold at least \p ilen Bytes. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * \param tag The buffer holding the authentication tag. This must be * a readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication tag. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, const unsigned char *tag, size_t tag_len ); #endif /* MBEDTLS_CIPHER_MODE_AEAD */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CIPHER_H */ fldigi-4.1.06/src/include/mbedtls/threading.h0000664000175000017500000001102113507401434015741 00000000000000/** * \file threading.h * * \brief Threading abstraction layer */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_THREADING_H #define MBEDTLS_THREADING_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #ifdef __cplusplus extern "C" { #endif /* MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE is deprecated and should not be * used. */ #define MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -0x001A /**< The selected feature is not available. */ #define MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -0x001C /**< Bad input parameters to function. */ #define MBEDTLS_ERR_THREADING_MUTEX_ERROR -0x001E /**< Locking / unlocking / free failed with error code. */ #if defined(MBEDTLS_THREADING_PTHREAD) #include typedef struct mbedtls_threading_mutex_t { pthread_mutex_t mutex; char is_valid; } mbedtls_threading_mutex_t; #endif #if defined(MBEDTLS_THREADING_ALT) /* You should define the mbedtls_threading_mutex_t type in your header */ #include "threading_alt.h" /** * \brief Set your alternate threading implementation function * pointers and initialize global mutexes. If used, this * function must be called once in the main thread before any * other mbed TLS function is called, and * mbedtls_threading_free_alt() must be called once in the main * thread after all other mbed TLS functions. * * \note mutex_init() and mutex_free() don't return a status code. * If mutex_init() fails, it should leave its argument (the * mutex) in a state such that mutex_lock() will fail when * called with this argument. * * \param mutex_init the init function implementation * \param mutex_free the free function implementation * \param mutex_lock the lock function implementation * \param mutex_unlock the unlock function implementation */ void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ), void (*mutex_free)( mbedtls_threading_mutex_t * ), int (*mutex_lock)( mbedtls_threading_mutex_t * ), int (*mutex_unlock)( mbedtls_threading_mutex_t * ) ); /** * \brief Free global mutexes. */ void mbedtls_threading_free_alt( void ); #endif /* MBEDTLS_THREADING_ALT */ #if defined(MBEDTLS_THREADING_C) /* * The function pointers for mutex_init, mutex_free, mutex_ and mutex_unlock * * All these functions are expected to work or the result will be undefined. */ extern void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t *mutex ); extern void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t *mutex ); extern int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t *mutex ); extern int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t *mutex ); /* * Global mutexes */ #if defined(MBEDTLS_FS_IO) extern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex; #endif #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) /* This mutex may or may not be used in the default definition of * mbedtls_platform_gmtime_r(), but in order to determine that, * we need to check POSIX features, hence modify _POSIX_C_SOURCE. * With the current approach, this declaration is orphaned, lacking * an accompanying definition, in case mbedtls_platform_gmtime_r() * doesn't need it, but that's not a problem. */ extern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex; #endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ #endif /* MBEDTLS_THREADING_C */ #ifdef __cplusplus } #endif #endif /* threading.h */ fldigi-4.1.06/src/include/mbedtls/ecp.h0000664000175000017500000014310213507401434014551 00000000000000/** * \file ecp.h * * \brief This file provides an API for Elliptic Curves over GF(P) (ECP). * * The use of ECP in cryptography and TLS is defined in * Standards for Efficient Cryptography Group (SECG): SEC1 * Elliptic Curve Cryptography and * RFC-4492: Elliptic Curve Cryptography (ECC) Cipher Suites * for Transport Layer Security (TLS). * * RFC-2409: The Internet Key Exchange (IKE) defines ECP * group types. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECP_H #define MBEDTLS_ECP_H #include "bignum.h" /* * ECP error codes */ #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */ #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< The requested feature is not available, for example, the requested curve is not supported. */ #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */ #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */ #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as ephemeral key, failed. */ #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */ #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< The buffer contains a valid signature followed by more data. */ /* MBEDTLS_ERR_ECP_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80 /**< The ECP hardware accelerator failed. */ #define MBEDTLS_ERR_ECP_IN_PROGRESS -0x4B00 /**< Operation in progress, call again with the same parameters to continue. */ #ifdef __cplusplus extern "C" { #endif /** * Domain-parameter identifiers: curve, subgroup, and generator. * * \note Only curves over prime fields are supported. * * \warning This library does not support validation of arbitrary domain * parameters. Therefore, only standardized domain parameters from trusted * sources should be used. See mbedtls_ecp_group_load(). */ typedef enum { MBEDTLS_ECP_DP_NONE = 0, /*!< Curve not defined. */ MBEDTLS_ECP_DP_SECP192R1, /*!< Domain parameters for the 192-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP224R1, /*!< Domain parameters for the 224-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP256R1, /*!< Domain parameters for the 256-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP384R1, /*!< Domain parameters for the 384-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP521R1, /*!< Domain parameters for the 521-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_BP256R1, /*!< Domain parameters for 256-bit Brainpool curve. */ MBEDTLS_ECP_DP_BP384R1, /*!< Domain parameters for 384-bit Brainpool curve. */ MBEDTLS_ECP_DP_BP512R1, /*!< Domain parameters for 512-bit Brainpool curve. */ MBEDTLS_ECP_DP_CURVE25519, /*!< Domain parameters for Curve25519. */ MBEDTLS_ECP_DP_SECP192K1, /*!< Domain parameters for 192-bit "Koblitz" curve. */ MBEDTLS_ECP_DP_SECP224K1, /*!< Domain parameters for 224-bit "Koblitz" curve. */ MBEDTLS_ECP_DP_SECP256K1, /*!< Domain parameters for 256-bit "Koblitz" curve. */ MBEDTLS_ECP_DP_CURVE448, /*!< Domain parameters for Curve448. */ } mbedtls_ecp_group_id; /** * The number of supported curves, plus one for #MBEDTLS_ECP_DP_NONE. * * \note Montgomery curves are currently excluded. */ #define MBEDTLS_ECP_DP_MAX 12 /** * Curve information, for use by other modules. */ typedef struct mbedtls_ecp_curve_info { mbedtls_ecp_group_id grp_id; /*!< An internal identifier. */ uint16_t tls_id; /*!< The TLS NamedCurve identifier. */ uint16_t bit_size; /*!< The curve size in bits. */ const char *name; /*!< A human-friendly name. */ } mbedtls_ecp_curve_info; /** * \brief The ECP point structure, in Jacobian coordinates. * * \note All functions expect and return points satisfying * the following condition: Z == 0 or * Z == 1. Other values of \p Z are * used only by internal functions. * The point is zero, or "at infinity", if Z == 0. * Otherwise, \p X and \p Y are its standard (affine) * coordinates. */ typedef struct mbedtls_ecp_point { mbedtls_mpi X; /*!< The X coordinate of the ECP point. */ mbedtls_mpi Y; /*!< The Y coordinate of the ECP point. */ mbedtls_mpi Z; /*!< The Z coordinate of the ECP point. */ } mbedtls_ecp_point; #if !defined(MBEDTLS_ECP_ALT) /* * default mbed TLS elliptic curve arithmetic implementation * * (in case MBEDTLS_ECP_ALT is defined then the developer has to provide an * alternative implementation for the whole module and it will replace this * one.) */ /** * \brief The ECP group structure. * * We consider two types of curve equations: *
  • Short Weierstrass: y^2 = x^3 + A x + B mod P * (SEC1 + RFC-4492)
  • *
  • Montgomery: y^2 = x^3 + A x^2 + x mod P (Curve25519, * Curve448)
* In both cases, the generator (\p G) for a prime-order subgroup is fixed. * * For Short Weierstrass, this subgroup is the whole curve, and its * cardinality is denoted by \p N. Our code requires that \p N is an * odd prime as mbedtls_ecp_mul() requires an odd number, and * mbedtls_ecdsa_sign() requires that it is prime for blinding purposes. * * For Montgomery curves, we do not store \p A, but (A + 2) / 4, * which is the quantity used in the formulas. Additionally, \p nbits is * not the size of \p N but the required size for private keys. * * If \p modp is NULL, reduction modulo \p P is done using a generic algorithm. * Otherwise, \p modp must point to a function that takes an \p mbedtls_mpi in the * range of 0..2^(2*pbits)-1, and transforms it in-place to an integer * which is congruent mod \p P to the given MPI, and is close enough to \p pbits * in size, so that it may be efficiently brought in the 0..P-1 range by a few * additions or subtractions. Therefore, it is only an approximative modular * reduction. It must return 0 on success and non-zero on failure. * * \note Alternative implementations must keep the group IDs distinct. If * two group structures have the same ID, then they must be * identical. * */ typedef struct mbedtls_ecp_group { mbedtls_ecp_group_id id; /*!< An internal group identifier. */ mbedtls_mpi P; /*!< The prime modulus of the base field. */ mbedtls_mpi A; /*!< For Short Weierstrass: \p A in the equation. For Montgomery curves: (A + 2) / 4. */ mbedtls_mpi B; /*!< For Short Weierstrass: \p B in the equation. For Montgomery curves: unused. */ mbedtls_ecp_point G; /*!< The generator of the subgroup used. */ mbedtls_mpi N; /*!< The order of \p G. */ size_t pbits; /*!< The number of bits in \p P.*/ size_t nbits; /*!< For Short Weierstrass: The number of bits in \p P. For Montgomery curves: the number of bits in the private keys. */ unsigned int h; /*!< \internal 1 if the constants are static. */ int (*modp)(mbedtls_mpi *); /*!< The function for fast pseudo-reduction mod \p P (see above).*/ int (*t_pre)(mbedtls_ecp_point *, void *); /*!< Unused. */ int (*t_post)(mbedtls_ecp_point *, void *); /*!< Unused. */ void *t_data; /*!< Unused. */ mbedtls_ecp_point *T; /*!< Pre-computed points for ecp_mul_comb(). */ size_t T_size; /*!< The number of pre-computed points. */ } mbedtls_ecp_group; #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Internal restart context for multiplication * * \note Opaque struct */ typedef struct mbedtls_ecp_restart_mul mbedtls_ecp_restart_mul_ctx; /** * \brief Internal restart context for ecp_muladd() * * \note Opaque struct */ typedef struct mbedtls_ecp_restart_muladd mbedtls_ecp_restart_muladd_ctx; /** * \brief General context for resuming ECC operations */ typedef struct { unsigned ops_done; /*!< current ops count */ unsigned depth; /*!< call depth (0 = top-level) */ mbedtls_ecp_restart_mul_ctx *rsm; /*!< ecp_mul_comb() sub-context */ mbedtls_ecp_restart_muladd_ctx *ma; /*!< ecp_muladd() sub-context */ } mbedtls_ecp_restart_ctx; /* * Operation counts for restartable functions */ #define MBEDTLS_ECP_OPS_CHK 3 /*!< basic ops count for ecp_check_pubkey() */ #define MBEDTLS_ECP_OPS_DBL 8 /*!< basic ops count for ecp_double_jac() */ #define MBEDTLS_ECP_OPS_ADD 11 /*!< basic ops count for see ecp_add_mixed() */ #define MBEDTLS_ECP_OPS_INV 120 /*!< empirical equivalent for mpi_mod_inv() */ /** * \brief Internal; for restartable functions in other modules. * Check and update basic ops budget. * * \param grp Group structure * \param rs_ctx Restart context * \param ops Number of basic ops to do * * \return \c 0 if doing \p ops basic ops is still allowed, * \return #MBEDTLS_ERR_ECP_IN_PROGRESS otherwise. */ int mbedtls_ecp_check_budget( const mbedtls_ecp_group *grp, mbedtls_ecp_restart_ctx *rs_ctx, unsigned ops ); /* Utility macro for checking and updating ops budget */ #define MBEDTLS_ECP_BUDGET( ops ) \ MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, rs_ctx, \ (unsigned) (ops) ) ); #else /* MBEDTLS_ECP_RESTARTABLE */ #define MBEDTLS_ECP_BUDGET( ops ) /* no-op; for compatibility */ /* We want to declare restartable versions of existing functions anyway */ typedef void mbedtls_ecp_restart_ctx; #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h, or define them using the compiler command line. * \{ */ #if !defined(MBEDTLS_ECP_MAX_BITS) /** * The maximum size of the groups, that is, of \c N and \c P. */ #define MBEDTLS_ECP_MAX_BITS 521 /**< The maximum size of groups, in bits. */ #endif #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 ) #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 ) #if !defined(MBEDTLS_ECP_WINDOW_SIZE) /* * Maximum "window" size used for point multiplication. * Default: 6. * Minimum value: 2. Maximum value: 7. * * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) * points used for point multiplication. This value is directly tied to EC * peak memory usage, so decreasing it by one should roughly cut memory usage * by two (if large curves are in use). * * Reduction in size may reduce speed, but larger curves are impacted first. * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): * w-size: 6 5 4 3 2 * 521 145 141 135 120 97 * 384 214 209 198 177 146 * 256 320 320 303 262 226 * 224 475 475 453 398 342 * 192 640 640 633 587 476 */ #define MBEDTLS_ECP_WINDOW_SIZE 6 /**< The maximum window size used. */ #endif /* MBEDTLS_ECP_WINDOW_SIZE */ #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) /* * Trade memory for speed on fixed-point multiplication. * * This speeds up repeated multiplication of the generator (that is, the * multiplication in ECDSA signatures, and half of the multiplications in * ECDSA verification and ECDHE) by a factor roughly 3 to 4. * * The cost is increasing EC peak memory usage by a factor roughly 2. * * Change this value to 0 to reduce peak memory usage. */ #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */ #endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ /* \} name SECTION: Module settings */ #else /* MBEDTLS_ECP_ALT */ #include "ecp_alt.h" #endif /* MBEDTLS_ECP_ALT */ /** * \brief The ECP key-pair structure. * * A generic key-pair that may be used for ECDSA and fixed ECDH, for example. * * \note Members are deliberately in the same order as in the * ::mbedtls_ecdsa_context structure. */ typedef struct mbedtls_ecp_keypair { mbedtls_ecp_group grp; /*!< Elliptic curve and base point */ mbedtls_mpi d; /*!< our secret value */ mbedtls_ecp_point Q; /*!< our public value */ } mbedtls_ecp_keypair; /* * Point formats, from RFC 4492's enum ECPointFormat */ #define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format. */ #define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format. */ /* * Some other constants from RFC 4492 */ #define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< The named_curve of ECCurveType. */ #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Set the maximum number of basic operations done in a row. * * If more operations are needed to complete a computation, * #MBEDTLS_ERR_ECP_IN_PROGRESS will be returned by the * function performing the computation. It is then the * caller's responsibility to either call again with the same * parameters until it returns 0 or an error code; or to free * the restart context if the operation is to be aborted. * * It is strictly required that all input parameters and the * restart context be the same on successive calls for the * same operation, but output parameters need not be the * same; they must not be used until the function finally * returns 0. * * This only applies to functions whose documentation * mentions they may return #MBEDTLS_ERR_ECP_IN_PROGRESS (or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS for functions in the * SSL module). For functions that accept a "restart context" * argument, passing NULL disables restart and makes the * function equivalent to the function with the same name * with \c _restartable removed. For functions in the ECDH * module, restart is disabled unless the function accepts * an "ECDH context" argument and * mbedtls_ecdh_enable_restart() was previously called on * that context. For function in the SSL module, restart is * only enabled for specific sides and key exchanges * (currently only for clients and ECDHE-ECDSA). * * \param max_ops Maximum number of basic operations done in a row. * Default: 0 (unlimited). * Lower (non-zero) values mean ECC functions will block for * a lesser maximum amount of time. * * \note A "basic operation" is defined as a rough equivalent of a * multiplication in GF(p) for the NIST P-256 curve. * As an indication, with default settings, a scalar * multiplication (full run of \c mbedtls_ecp_mul()) is: * - about 3300 basic operations for P-256 * - about 9400 basic operations for P-384 * * \note Very low values are not always respected: sometimes * functions need to block for a minimum number of * operations, and will do so even if max_ops is set to a * lower value. That minimum depends on the curve size, and * can be made lower by decreasing the value of * \c MBEDTLS_ECP_WINDOW_SIZE. As an indication, here is the * lowest effective value for various curves and values of * that parameter (w for short): * w=6 w=5 w=4 w=3 w=2 * P-256 208 208 160 136 124 * P-384 682 416 320 272 248 * P-521 1364 832 640 544 496 * * \note This setting is currently ignored by Curve25519. */ void mbedtls_ecp_set_max_ops( unsigned max_ops ); /** * \brief Check if restart is enabled (max_ops != 0) * * \return \c 0 if \c max_ops == 0 (restart disabled) * \return \c 1 otherwise (restart enabled) */ int mbedtls_ecp_restart_is_enabled( void ); #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \brief This function retrieves the information defined in * mbedtls_ecp_curve_info() for all supported curves in order * of preference. * * \return A statically allocated array. The last entry is 0. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void ); /** * \brief This function retrieves the list of internal group * identifiers of all supported curves in the order of * preference. * * \return A statically allocated array, * terminated with MBEDTLS_ECP_DP_NONE. */ const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void ); /** * \brief This function retrieves curve information from an internal * group identifier. * * \param grp_id An \c MBEDTLS_ECP_DP_XXX value. * * \return The associated curve information on success. * \return NULL on failure. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id ); /** * \brief This function retrieves curve information from a TLS * NamedCurve value. * * \param tls_id An \c MBEDTLS_ECP_DP_XXX value. * * \return The associated curve information on success. * \return NULL on failure. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id ); /** * \brief This function retrieves curve information from a * human-readable name. * * \param name The human-readable name. * * \return The associated curve information on success. * \return NULL on failure. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name ); /** * \brief This function initializes a point as zero. * * \param pt The point to initialize. */ void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ); /** * \brief This function initializes an ECP group context * without loading any domain parameters. * * \note After this function is called, domain parameters * for various ECP groups can be loaded through the * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group() * functions. */ void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ); /** * \brief This function initializes a key pair as an invalid one. * * \param key The key pair to initialize. */ void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key ); /** * \brief This function frees the components of a point. * * \param pt The point to free. */ void mbedtls_ecp_point_free( mbedtls_ecp_point *pt ); /** * \brief This function frees the components of an ECP group. * * \param grp The group to free. This may be \c NULL, in which * case this function returns immediately. If it is not * \c NULL, it must point to an initialized ECP group. */ void mbedtls_ecp_group_free( mbedtls_ecp_group *grp ); /** * \brief This function frees the components of a key pair. * * \param key The key pair to free. This may be \c NULL, in which * case this function returns immediately. If it is not * \c NULL, it must point to an initialized ECP key pair. */ void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key ); #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context. * * \param ctx The restart context to initialize. This must * not be \c NULL. */ void mbedtls_ecp_restart_init( mbedtls_ecp_restart_ctx *ctx ); /** * \brief Free the components of a restart context. * * \param ctx The restart context to free. This may be \c NULL, in which * case this function returns immediately. If it is not * \c NULL, it must point to an initialized restart context. */ void mbedtls_ecp_restart_free( mbedtls_ecp_restart_ctx *ctx ); #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \brief This function copies the contents of point \p Q into * point \p P. * * \param P The destination point. This must be initialized. * \param Q The source point. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code for other kinds of failure. */ int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); /** * \brief This function copies the contents of group \p src into * group \p dst. * * \param dst The destination group. This must be initialized. * \param src The source group. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src ); /** * \brief This function sets a point to the point at infinity. * * \param pt The point to set. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt ); /** * \brief This function checks if a point is the point at infinity. * * \param pt The point to test. This must be initialized. * * \return \c 1 if the point is zero. * \return \c 0 if the point is non-zero. * \return A negative error code on failure. */ int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt ); /** * \brief This function compares two points. * * \note This assumes that the points are normalized. Otherwise, * they may compare as "not equal" even if they are. * * \param P The first point to compare. This must be initialized. * \param Q The second point to compare. This must be initialized. * * \return \c 0 if the points are equal. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the points are not equal. */ int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); /** * \brief This function imports a non-zero point from two ASCII * strings. * * \param P The destination point. This must be initialized. * \param radix The numeric base of the input. * \param x The first affine coordinate, as a null-terminated string. * \param y The second affine coordinate, as a null-terminated string. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_MPI_XXX error code on failure. */ int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix, const char *x, const char *y ); /** * \brief This function exports a point into unsigned binary data. * * \param grp The group to which the point should belong. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param P The point to export. This must be initialized. * \param format The point format. This must be either * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED. * \param olen The address at which to store the length of * the output in Bytes. This must not be \c NULL. * \param buf The output buffer. This must be a writable buffer * of length \p buflen Bytes. * \param buflen The length of the output buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output buffer * is too small to hold the point. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P, int format, size_t *olen, unsigned char *buf, size_t buflen ); /** * \brief This function imports a point from unsigned binary data. * * \note This function does not check that the point actually * belongs to the given group, see mbedtls_ecp_check_pubkey() * for that. * * \param grp The group to which the point should belong. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param P The destination context to import the point to. * This must be initialized. * \param buf The input buffer. This must be a readable buffer * of length \p ilen Bytes. * \param ilen The length of the input buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format * is not implemented. */ int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, const unsigned char *buf, size_t ilen ); /** * \brief This function imports a point from a TLS ECPoint record. * * \note On function return, \p *buf is updated to point immediately * after the ECPoint record. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param pt The destination point. * \param buf The address of the pointer to the start of the input buffer. * \param len The length of the buffer. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization * failure. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. */ int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, const unsigned char **buf, size_t len ); /** * \brief This function exports a point as a TLS ECPoint record * defined in RFC 4492, Section 5.4. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param pt The point to be exported. This must be initialized. * \param format The point format to use. This must be either * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED. * \param olen The address at which to store the length in Bytes * of the data written. * \param buf The target buffer. This must be a writable buffer of * length \p blen Bytes. * \param blen The length of the target buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid. * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the target buffer * is too small to hold the exported point. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, int format, size_t *olen, unsigned char *buf, size_t blen ); /** * \brief This function sets up an ECP group context * from a standardized set of domain parameters. * * \note The index should be a value of the NamedCurve enum, * as defined in RFC-4492: Elliptic Curve Cryptography * (ECC) Cipher Suites for Transport Layer Security (TLS), * usually in the form of an \c MBEDTLS_ECP_DP_XXX macro. * * \param grp The group context to setup. This must be initialized. * \param id The identifier of the domain parameter set to load. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if \p id doesn't * correspond to a known group. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id ); /** * \brief This function sets up an ECP group context from a TLS * ECParameters record as defined in RFC 4492, Section 5.4. * * \note The read pointer \p buf is updated to point right after * the ECParameters record on exit. * * \param grp The group context to setup. This must be initialized. * \param buf The address of the pointer to the start of the input buffer. * \param len The length of the input buffer \c *buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not * recognized. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len ); /** * \brief This function extracts an elliptic curve group ID from a * TLS ECParameters record as defined in RFC 4492, Section 5.4. * * \note The read pointer \p buf is updated to point right after * the ECParameters record on exit. * * \param grp The address at which to store the group id. * This must not be \c NULL. * \param buf The address of the pointer to the start of the input buffer. * \param len The length of the input buffer \c *buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not * recognized. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_read_group_id( mbedtls_ecp_group_id *grp, const unsigned char **buf, size_t len ); /** * \brief This function exports an elliptic curve as a TLS * ECParameters record as defined in RFC 4492, Section 5.4. * * \param grp The ECP group to be exported. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param olen The address at which to store the number of Bytes written. * This must not be \c NULL. * \param buf The buffer to write to. This must be a writable buffer * of length \p blen Bytes. * \param blen The length of the output buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output * buffer is too small to hold the exported group. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, unsigned char *buf, size_t blen ); /** * \brief This function performs a scalar multiplication of a point * by an integer: \p R = \p m * \p P. * * It is not thread-safe to use same group in multiple threads. * * \note To prevent timing attacks, this function * executes the exact same sequence of base-field * operations for any valid \p m. It avoids any if-branch or * array index depending on the value of \p m. * * \note If \p f_rng is not NULL, it is used to randomize * intermediate results to prevent potential timing attacks * targeting these results. We recommend always providing * a non-NULL \p f_rng. The overhead is negligible. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply. This must be initialized. * \param P The point to multiply. This must be initialized. * \param f_rng The RNG function. This may be \c NULL if randomization * of intermediate results isn't desired (discouraged). * \param p_rng The RNG context to be passed to \p p_rng. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private * key, or \p P is not a valid public key. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function performs multiplication of a point by * an integer: \p R = \p m * \p P in a restartable way. * * \see mbedtls_ecp_mul() * * \note This function does the same as \c mbedtls_ecp_mul(), but * it can return early and restart according to the limit set * with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply. This must be initialized. * \param P The point to multiply. This must be initialized. * \param f_rng The RNG function. This may be \c NULL if randomization * of intermediate results isn't desired (discouraged). * \param p_rng The RNG context to be passed to \p p_rng. * \param rs_ctx The restart context (NULL disables restart). * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private * key, or \p P is not a valid public key. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ); /** * \brief This function performs multiplication and addition of two * points by integers: \p R = \p m * \p P + \p n * \p Q * * It is not thread-safe to use same group in multiple threads. * * \note In contrast to mbedtls_ecp_mul(), this function does not * guarantee a constant execution flow and timing. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply \p P. * This must be initialized. * \param P The point to multiply by \p m. This must be initialized. * \param n The integer by which to multiply \p Q. * This must be initialized. * \param Q The point to be multiplied by \p n. * This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not * valid private keys, or \p P or \p Q are not valid public * keys. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q ); /** * \brief This function performs multiplication and addition of two * points by integers: \p R = \p m * \p P + \p n * \p Q in a * restartable way. * * \see \c mbedtls_ecp_muladd() * * \note This function works the same as \c mbedtls_ecp_muladd(), * but it can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply \p P. * This must be initialized. * \param P The point to multiply by \p m. This must be initialized. * \param n The integer by which to multiply \p Q. * This must be initialized. * \param Q The point to be multiplied by \p n. * This must be initialized. * \param rs_ctx The restart context (NULL disables restart). * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not * valid private keys, or \p P or \p Q are not valid public * keys. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_muladd_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q, mbedtls_ecp_restart_ctx *rs_ctx ); /** * \brief This function checks that a point is a valid public key * on this curve. * * It only checks that the point is non-zero, has * valid coordinates and lies on the curve. It does not verify * that it is indeed a multiple of \p G. This additional * check is computationally more expensive, is not required * by standards, and should not be necessary if the group * used has a small cofactor. In particular, it is useless for * the NIST groups which all have a cofactor of 1. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure, to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group the point should belong to. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param pt The point to check. This must be initialized. * * \return \c 0 if the point is a valid public key. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not * a valid public key for the given curve. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ); /** * \brief This function checks that an \p mbedtls_mpi is a * valid private key for this curve. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group the private key should belong to. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param d The integer to check. This must be initialized. * * \return \c 0 if the point is a valid private key. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not a valid * private key for the given curve. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ); /** * \brief This function generates a private key. * * \param grp The ECP group to generate a private key for. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param d The destination MPI (secret part). This must be initialized. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp, mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function generates a keypair with a configurable base * point. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group to generate a key pair for. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param G The base point to use. This must be initialized * and belong to \p grp. It replaces the default base * point \c grp->G used by mbedtls_ecp_gen_keypair(). * \param d The destination MPI (secret part). * This must be initialized. * \param Q The destination point (public part). * This must be initialized. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp, const mbedtls_ecp_point *G, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function generates an ECP keypair. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group to generate a key pair for. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param d The destination MPI (secret part). * This must be initialized. * \param Q The destination point (public part). * This must be initialized. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function generates an ECP key. * * \param grp_id The ECP group identifier. * \param key The destination key. This must be initialized. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function checks that the keypair objects * \p pub and \p prv have the same group and the * same public point, and that the private key in * \p prv is consistent with the public key. * * \param pub The keypair structure holding the public key. This * must be initialized. If it contains a private key, that * part is ignored. * \param prv The keypair structure holding the full keypair. * This must be initialized. * * \return \c 0 on success, meaning that the keys are valid and match. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the keys are invalid or do not match. * \return An \c MBEDTLS_ERR_ECP_XXX or an \c MBEDTLS_ERR_MPI_XXX * error code on calculation failure. */ int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The ECP checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_ecp_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* ecp.h */ fldigi-4.1.06/src/include/mbedtls/ecdh.h0000664000175000017500000004425613507401434014717 00000000000000/** * \file ecdh.h * * \brief This file contains ECDH definitions and functions. * * The Elliptic Curve Diffie-Hellman (ECDH) protocol is an anonymous * key agreement protocol allowing two parties to establish a shared * secret over an insecure channel. Each party must have an * elliptic-curve public–private key pair. * * For more information, see NIST SP 800-56A Rev. 2: Recommendation for * Pair-Wise Key Establishment Schemes Using Discrete Logarithm * Cryptography. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECDH_H #define MBEDTLS_ECDH_H #include "ecp.h" /* * Use a backward compatible ECDH context. * * This flag is always enabled for now and future versions might add a * configuration option that conditionally undefines this flag. * The configuration option in question may have a different name. * * Features undefining this flag, must have a warning in their description in * config.h stating that the feature breaks backward compatibility. */ #define MBEDTLS_ECDH_LEGACY_CONTEXT #ifdef __cplusplus extern "C" { #endif /** * Defines the source of the imported EC key. */ typedef enum { MBEDTLS_ECDH_OURS, /**< Our key. */ MBEDTLS_ECDH_THEIRS, /**< The key of the peer. */ } mbedtls_ecdh_side; #if !defined(MBEDTLS_ECDH_LEGACY_CONTEXT) /** * Defines the ECDH implementation used. * * Later versions of the library may add new variants, therefore users should * not make any assumptions about them. */ typedef enum { MBEDTLS_ECDH_VARIANT_NONE = 0, /*!< Implementation not defined. */ MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0,/*!< The default Mbed TLS implementation */ } mbedtls_ecdh_variant; /** * The context used by the default ECDH implementation. * * Later versions might change the structure of this context, therefore users * should not make any assumptions about the structure of * mbedtls_ecdh_context_mbed. */ typedef struct mbedtls_ecdh_context_mbed { mbedtls_ecp_group grp; /*!< The elliptic curve used. */ mbedtls_mpi d; /*!< The private key. */ mbedtls_ecp_point Q; /*!< The public key. */ mbedtls_ecp_point Qp; /*!< The value of the public key of the peer. */ mbedtls_mpi z; /*!< The shared secret. */ #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */ #endif } mbedtls_ecdh_context_mbed; #endif /** * * \warning Performing multiple operations concurrently on the same * ECDSA context is not supported; objects of this type * should not be shared between multiple threads. * \brief The ECDH context structure. */ typedef struct mbedtls_ecdh_context { #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) mbedtls_ecp_group grp; /*!< The elliptic curve used. */ mbedtls_mpi d; /*!< The private key. */ mbedtls_ecp_point Q; /*!< The public key. */ mbedtls_ecp_point Qp; /*!< The value of the public key of the peer. */ mbedtls_mpi z; /*!< The shared secret. */ int point_format; /*!< The format of point export in TLS messages. */ mbedtls_ecp_point Vi; /*!< The blinding value. */ mbedtls_ecp_point Vf; /*!< The unblinding value. */ mbedtls_mpi _d; /*!< The previous \p d. */ #if defined(MBEDTLS_ECP_RESTARTABLE) int restart_enabled; /*!< The flag for restartable mode. */ mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */ #endif /* MBEDTLS_ECP_RESTARTABLE */ #else uint8_t point_format; /*!< The format of point export in TLS messages as defined in RFC 4492. */ mbedtls_ecp_group_id grp_id;/*!< The elliptic curve used. */ mbedtls_ecdh_variant var; /*!< The ECDH implementation/structure used. */ union { mbedtls_ecdh_context_mbed mbed_ecdh; } ctx; /*!< Implementation-specific context. The context in use is specified by the \c var field. */ #if defined(MBEDTLS_ECP_RESTARTABLE) uint8_t restart_enabled; /*!< The flag for restartable mode. Functions of an alternative implementation not supporting restartable mode must return MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED error if this flag is set. */ #endif /* MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */ } mbedtls_ecdh_context; /** * \brief This function generates an ECDH keypair on an elliptic * curve. * * This function performs the first of two core computations * implemented during the ECDH key exchange. The second core * computation is performed by mbedtls_ecdh_compute_shared(). * * \see ecp.h * * \param grp The ECP group to use. This must be initialized and have * domain parameters loaded, for example through * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group(). * \param d The destination MPI (private key). * This must be initialized. * \param Q The destination point (public key). * This must be initialized. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL in case \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return Another \c MBEDTLS_ERR_ECP_XXX or * \c MBEDTLS_MPI_XXX error code on failure. */ int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function computes the shared secret. * * This function performs the second of two core computations * implemented during the ECDH key exchange. The first core * computation is performed by mbedtls_ecdh_gen_public(). * * \see ecp.h * * \note If \p f_rng is not NULL, it is used to implement * countermeasures against side-channel attacks. * For more information, see mbedtls_ecp_mul(). * * \param grp The ECP group to use. This must be initialized and have * domain parameters loaded, for example through * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group(). * \param z The destination MPI (shared secret). * This must be initialized. * \param Q The public key from another party. * This must be initialized. * \param d Our secret exponent (private key). * This must be initialized. * \param f_rng The RNG function. This may be \c NULL if randomization * of intermediate results during the ECP computations is * not needed (discouraged). See the documentation of * mbedtls_ecp_mul() for more. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a * context argument. * * \return \c 0 on success. * \return Another \c MBEDTLS_ERR_ECP_XXX or * \c MBEDTLS_MPI_XXX error code on failure. */ int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z, const mbedtls_ecp_point *Q, const mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function initializes an ECDH context. * * \param ctx The ECDH context to initialize. This must not be \c NULL. */ void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx ); /** * \brief This function sets up the ECDH context with the information * given. * * This function should be called after mbedtls_ecdh_init() but * before mbedtls_ecdh_make_params(). There is no need to call * this function before mbedtls_ecdh_read_params(). * * This is the first function used by a TLS server for ECDHE * ciphersuites. * * \param ctx The ECDH context to set up. This must be initialized. * \param grp_id The group id of the group to set up the context for. * * \return \c 0 on success. */ int mbedtls_ecdh_setup( mbedtls_ecdh_context *ctx, mbedtls_ecp_group_id grp_id ); /** * \brief This function frees a context. * * \param ctx The context to free. This may be \c NULL, in which * case this function does nothing. If it is not \c NULL, * it must point to an initialized ECDH context. */ void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx ); /** * \brief This function generates an EC key pair and exports its * in the format used in a TLS ServerKeyExchange handshake * message. * * This is the second function used by a TLS server for ECDHE * ciphersuites. (It is called after mbedtls_ecdh_setup().) * * \see ecp.h * * \param ctx The ECDH context to use. This must be initialized * and bound to a group, for example via mbedtls_ecdh_setup(). * \param olen The address at which to store the number of Bytes written. * \param buf The destination buffer. This must be a writable buffer of * length \p blen Bytes. * \param blen The length of the destination buffer \p buf in Bytes. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL in case \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function parses the ECDHE parameters in a * TLS ServerKeyExchange handshake message. * * \note In a TLS handshake, this is the how the client * sets up its ECDHE context from the server's public * ECDHE key material. * * \see ecp.h * * \param ctx The ECDHE context to use. This must be initialized. * \param buf On input, \c *buf must be the start of the input buffer. * On output, \c *buf is updated to point to the end of the * data that has been read. On success, this is the first byte * past the end of the ServerKeyExchange parameters. * On error, this is the point at which an error has been * detected, which is usually not useful except to debug * failures. * \param end The end of the input buffer. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX error code on failure. * */ int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx, const unsigned char **buf, const unsigned char *end ); /** * \brief This function sets up an ECDH context from an EC key. * * It is used by clients and servers in place of the * ServerKeyEchange for static ECDH, and imports ECDH * parameters from the EC key information of a certificate. * * \see ecp.h * * \param ctx The ECDH context to set up. This must be initialized. * \param key The EC key to use. This must be initialized. * \param side Defines the source of the key. Possible values are: * - #MBEDTLS_ECDH_OURS: The key is ours. * - #MBEDTLS_ECDH_THEIRS: The key is that of the peer. * * \return \c 0 on success. * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. * */ int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key, mbedtls_ecdh_side side ); /** * \brief This function generates a public key and exports it * as a TLS ClientKeyExchange payload. * * This is the second function used by a TLS client for ECDH(E) * ciphersuites. * * \see ecp.h * * \param ctx The ECDH context to use. This must be initialized * and bound to a group, the latter usually by * mbedtls_ecdh_read_params(). * \param olen The address at which to store the number of Bytes written. * This must not be \c NULL. * \param buf The destination buffer. This must be a writable buffer * of length \p blen Bytes. * \param blen The size of the destination buffer \p buf in Bytes. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL in case \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function parses and processes the ECDHE payload of a * TLS ClientKeyExchange message. * * This is the third function used by a TLS server for ECDH(E) * ciphersuites. (It is called after mbedtls_ecdh_setup() and * mbedtls_ecdh_make_params().) * * \see ecp.h * * \param ctx The ECDH context to use. This must be initialized * and bound to a group, for example via mbedtls_ecdh_setup(). * \param buf The pointer to the ClientKeyExchange payload. This must * be a readable buffer of length \p blen Bytes. * \param blen The length of the input buffer \p buf in Bytes. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx, const unsigned char *buf, size_t blen ); /** * \brief This function derives and exports the shared secret. * * This is the last function used by both TLS client * and servers. * * \note If \p f_rng is not NULL, it is used to implement * countermeasures against side-channel attacks. * For more information, see mbedtls_ecp_mul(). * * \see ecp.h * \param ctx The ECDH context to use. This must be initialized * and have its own private key generated and the peer's * public key imported. * \param olen The address at which to store the total number of * Bytes written on success. This must not be \c NULL. * \param buf The buffer to write the generated shared key to. This * must be a writable buffer of size \p blen Bytes. * \param blen The length of the destination buffer \p buf in Bytes. * \param f_rng The RNG function, for blinding purposes. This may * b \c NULL if blinding isn't needed. * \param p_rng The RNG context. This may be \c NULL if \p f_rng * doesn't need a context argument. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief This function enables restartable EC computations for this * context. (Default: disabled.) * * \see \c mbedtls_ecp_set_max_ops() * * \note It is not possible to safely disable restartable * computations once enabled, except by free-ing the context, * which cancels possible in-progress operations. * * \param ctx The ECDH context to use. This must be initialized. */ void mbedtls_ecdh_enable_restart( mbedtls_ecdh_context *ctx ); #endif /* MBEDTLS_ECP_RESTARTABLE */ #ifdef __cplusplus } #endif #endif /* ecdh.h */ fldigi-4.1.06/src/include/mbedtls/check_config.h0000664000175000017500000006574013507401434016417 00000000000000/** * \file check_config.h * * \brief Consistency checks for configuration options */ /* * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * It is recommended to include this file from your config.h * in order to catch dependency issues early. */ #ifndef MBEDTLS_CHECK_CONFIG_H #define MBEDTLS_CHECK_CONFIG_H /* * We assume CHAR_BIT is 8 in many places. In practice, this is true on our * target platforms, so not an issue, but let's just be extra sure. */ #include #if CHAR_BIT != 8 #error "mbed TLS requires a platform with 8-bit chars" #endif #if defined(_WIN32) #if !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_C is required on Windows" #endif /* Fix the config here. Not convenient to put an #ifdef _WIN32 in config.h as * it would confuse config.pl. */ #if !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && \ !defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) #define MBEDTLS_PLATFORM_SNPRINTF_ALT #endif #endif /* _WIN32 */ #if defined(TARGET_LIKE_MBED) && \ ( defined(MBEDTLS_NET_C) || defined(MBEDTLS_TIMING_C) ) #error "The NET and TIMING modules are not available for mbed OS - please use the network and timing functions provided by mbed OS" #endif #if defined(MBEDTLS_DEPRECATED_WARNING) && \ !defined(__GNUC__) && !defined(__clang__) #error "MBEDTLS_DEPRECATED_WARNING only works with GCC and Clang" #endif #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_HAVE_TIME) #error "MBEDTLS_HAVE_TIME_DATE without MBEDTLS_HAVE_TIME does not make sense" #endif #if defined(MBEDTLS_AESNI_C) && !defined(MBEDTLS_HAVE_ASM) #error "MBEDTLS_AESNI_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C) #error "MBEDTLS_CTR_DRBG_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_DHM_C) && !defined(MBEDTLS_BIGNUM_C) #error "MBEDTLS_DHM_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) && !defined(MBEDTLS_SSL_TRUNCATED_HMAC) #error "MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT defined, but not all prerequisites" #endif #if defined(MBEDTLS_CMAC_C) && \ !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_DES_C) #error "MBEDTLS_CMAC_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_NIST_KW_C) && \ ( !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_CIPHER_C) ) #error "MBEDTLS_NIST_KW_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECDH_C) && !defined(MBEDTLS_ECP_C) #error "MBEDTLS_ECDH_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECDSA_C) && \ ( !defined(MBEDTLS_ECP_C) || \ !defined(MBEDTLS_ASN1_PARSE_C) || \ !defined(MBEDTLS_ASN1_WRITE_C) ) #error "MBEDTLS_ECDSA_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECJPAKE_C) && \ ( !defined(MBEDTLS_ECP_C) || !defined(MBEDTLS_MD_C) ) #error "MBEDTLS_ECJPAKE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_RESTARTABLE) && \ ( defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) || \ defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) || \ defined(MBEDTLS_ECDSA_SIGN_ALT) || \ defined(MBEDTLS_ECDSA_VERIFY_ALT) || \ defined(MBEDTLS_ECDSA_GENKEY_ALT) || \ defined(MBEDTLS_ECP_INTERNAL_ALT) || \ defined(MBEDTLS_ECP_ALT) ) #error "MBEDTLS_ECP_RESTARTABLE defined, but it cannot coexist with an alternative ECP implementation" #endif #if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C) #error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \ !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) ) ) #error "MBEDTLS_ECP_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_ASN1_PARSE_C) #error "MBEDTLS_PK_PARSE_C defined, but not all prerequesites" #endif #if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \ !defined(MBEDTLS_SHA256_C)) #error "MBEDTLS_ENTROPY_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_SHA512_C) && \ defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 64) #error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" #endif #if defined(MBEDTLS_ENTROPY_C) && \ ( !defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_ENTROPY_FORCE_SHA256) ) \ && defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 32) #error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" #endif #if defined(MBEDTLS_ENTROPY_C) && \ defined(MBEDTLS_ENTROPY_FORCE_SHA256) && !defined(MBEDTLS_SHA256_C) #error "MBEDTLS_ENTROPY_FORCE_SHA256 defined, but not all prerequisites" #endif #if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ ( !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) ) #error "MBEDTLS_TEST_NULL_ENTROPY defined, but not all prerequisites" #endif #if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ ( defined(MBEDTLS_ENTROPY_NV_SEED) || defined(MBEDTLS_ENTROPY_HARDWARE_ALT) || \ defined(MBEDTLS_HAVEGE_C) ) #error "MBEDTLS_TEST_NULL_ENTROPY defined, but entropy sources too" #endif #if defined(MBEDTLS_GCM_C) && ( \ !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) ) #error "MBEDTLS_GCM_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_RANDOMIZE_JAC_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_ADD_MIXED_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_DOUBLE_JAC_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_NORMALIZE_JAC_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_RANDOMIZE_MXZ_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_NORMALIZE_MXZ_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_HAVEGE_C) && !defined(MBEDTLS_TIMING_C) #error "MBEDTLS_HAVEGE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_HKDF_C) && !defined(MBEDTLS_MD_C) #error "MBEDTLS_HKDF_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_HMAC_DRBG_C) && !defined(MBEDTLS_MD_C) #error "MBEDTLS_HMAC_DRBG_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) #error "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) #error "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(MBEDTLS_DHM_C) #error "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) && \ !defined(MBEDTLS_ECDH_C) #error "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ ( !defined(MBEDTLS_DHM_C) || !defined(MBEDTLS_RSA_C) || \ !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) || \ !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \ !defined(MBEDTLS_X509_CRT_PARSE_C) ) #error "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \ ( !defined(MBEDTLS_ECJPAKE_C) || !defined(MBEDTLS_SHA256_C) || \ !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) ) #error "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) #error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PADLOCK_C) && !defined(MBEDTLS_HAVE_ASM) #error "MBEDTLS_PADLOCK_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PEM_PARSE_C) && !defined(MBEDTLS_BASE64_C) #error "MBEDTLS_PEM_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PEM_WRITE_C) && !defined(MBEDTLS_BASE64_C) #error "MBEDTLS_PEM_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_C) && \ ( !defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_ECP_C) ) #error "MBEDTLS_PK_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_PK_C) #error "MBEDTLS_PK_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_WRITE_C) && !defined(MBEDTLS_PK_C) #error "MBEDTLS_PK_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PKCS11_C) && !defined(MBEDTLS_PK_C) #error "MBEDTLS_PKCS11_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_EXIT_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_EXIT_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_EXIT_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_EXIT_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_EXIT_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_EXIT) ||\ defined(MBEDTLS_PLATFORM_EXIT_ALT) ) #error "MBEDTLS_PLATFORM_EXIT_MACRO and MBEDTLS_PLATFORM_STD_EXIT/MBEDTLS_PLATFORM_EXIT_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_TIME_ALT) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_TIME_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_TIME_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ defined(MBEDTLS_PLATFORM_TIME_ALT) ) #error "MBEDTLS_PLATFORM_TIME_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ defined(MBEDTLS_PLATFORM_TIME_ALT) ) #error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_FPRINTF_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_FPRINTF_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_FPRINTF) ||\ defined(MBEDTLS_PLATFORM_FPRINTF_ALT) ) #error "MBEDTLS_PLATFORM_FPRINTF_MACRO and MBEDTLS_PLATFORM_STD_FPRINTF/MBEDTLS_PLATFORM_FPRINTF_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) #error "MBEDTLS_PLATFORM_FREE_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ defined(MBEDTLS_PLATFORM_STD_FREE) #error "MBEDTLS_PLATFORM_FREE_MACRO and MBEDTLS_PLATFORM_STD_FREE cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_FREE_MACRO) && !defined(MBEDTLS_PLATFORM_CALLOC_MACRO) #error "MBEDTLS_PLATFORM_CALLOC_MACRO must be defined if MBEDTLS_PLATFORM_FREE_MACRO is" #endif #if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) #error "MBEDTLS_PLATFORM_CALLOC_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ defined(MBEDTLS_PLATFORM_STD_CALLOC) #error "MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_STD_CALLOC cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && !defined(MBEDTLS_PLATFORM_FREE_MACRO) #error "MBEDTLS_PLATFORM_FREE_MACRO must be defined if MBEDTLS_PLATFORM_CALLOC_MACRO is" #endif #if defined(MBEDTLS_PLATFORM_MEMORY) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_MEMORY defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_PRINTF_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_PRINTF_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_PRINTF) ||\ defined(MBEDTLS_PLATFORM_PRINTF_ALT) ) #error "MBEDTLS_PLATFORM_PRINTF_MACRO and MBEDTLS_PLATFORM_STD_PRINTF/MBEDTLS_PLATFORM_PRINTF_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_SNPRINTF_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_SNPRINTF_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_SNPRINTF) ||\ defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) ) #error "MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\ !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) #error "MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) #error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) #error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_FREE) && !defined(MBEDTLS_PLATFORM_MEMORY) #error "MBEDTLS_PLATFORM_STD_FREE defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_EXIT) &&\ !defined(MBEDTLS_PLATFORM_EXIT_ALT) #error "MBEDTLS_PLATFORM_STD_EXIT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_TIME) &&\ ( !defined(MBEDTLS_PLATFORM_TIME_ALT) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_STD_TIME defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_FPRINTF) &&\ !defined(MBEDTLS_PLATFORM_FPRINTF_ALT) #error "MBEDTLS_PLATFORM_STD_FPRINTF defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_PRINTF) &&\ !defined(MBEDTLS_PLATFORM_PRINTF_ALT) #error "MBEDTLS_PLATFORM_STD_PRINTF defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_SNPRINTF) &&\ !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) #error "MBEDTLS_PLATFORM_STD_SNPRINTF defined, but not all prerequisites" #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) &&\ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_ENTROPY_C) ) #error "MBEDTLS_ENTROPY_NV_SEED defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) &&\ !defined(MBEDTLS_ENTROPY_NV_SEED) #error "MBEDTLS_PLATFORM_NV_SEED_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) &&\ !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) #error "MBEDTLS_PLATFORM_STD_NV_SEED_READ defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) &&\ !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) #error "MBEDTLS_PLATFORM_STD_NV_SEED_WRITE defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) ||\ defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) #error "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_READ cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) ||\ defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) #error "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_WRITE cannot be defined simultaneously" #endif #if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ !defined(MBEDTLS_OID_C) ) #error "MBEDTLS_RSA_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_PKCS1_V21) && \ !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_RSA_C defined, but none of the PKCS1 versions enabled" #endif #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \ ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_PKCS1_V21) ) #error "MBEDTLS_X509_RSASSA_PSS_SUPPORT defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_SSL3) && ( !defined(MBEDTLS_MD5_C) || \ !defined(MBEDTLS_SHA1_C) ) #error "MBEDTLS_SSL_PROTO_SSL3 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) && ( !defined(MBEDTLS_MD5_C) || \ !defined(MBEDTLS_SHA1_C) ) #error "MBEDTLS_SSL_PROTO_TLS1 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_1) && ( !defined(MBEDTLS_MD5_C) || \ !defined(MBEDTLS_SHA1_C) ) #error "MBEDTLS_SSL_PROTO_TLS1_1 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && ( !defined(MBEDTLS_SHA1_C) && \ !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) ) #error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2) #error "MBEDTLS_SSL_PROTO_DTLS defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_CLI_C) && !defined(MBEDTLS_SSL_TLS_C) #error "MBEDTLS_SSL_CLI_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_TLS_C) && ( !defined(MBEDTLS_CIPHER_C) || \ !defined(MBEDTLS_MD_C) ) #error "MBEDTLS_SSL_TLS_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_SRV_C) && !defined(MBEDTLS_SSL_TLS_C) #error "MBEDTLS_SSL_SRV_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_TLS_C) && (!defined(MBEDTLS_SSL_PROTO_SSL3) && \ !defined(MBEDTLS_SSL_PROTO_TLS1) && !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2)) #error "MBEDTLS_SSL_TLS_C defined, but no protocols are active" #endif #if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ defined(MBEDTLS_SSL_PROTO_TLS1_1) && !defined(MBEDTLS_SSL_PROTO_TLS1)) #error "Illegal protocol selection" #endif #if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_TLS1) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && !defined(MBEDTLS_SSL_PROTO_TLS1_1)) #error "Illegal protocol selection" #endif #if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && (!defined(MBEDTLS_SSL_PROTO_TLS1) || \ !defined(MBEDTLS_SSL_PROTO_TLS1_1))) #error "Illegal protocol selection" #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && !defined(MBEDTLS_SSL_PROTO_DTLS) #error "MBEDTLS_SSL_DTLS_HELLO_VERIFY defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \ !defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) #error "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) && \ ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) #error "MBEDTLS_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) #error "MBEDTLS_SSL_DTLS_BADMAC_LIMIT defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ !defined(MBEDTLS_SSL_PROTO_TLS1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2) #error "MBEDTLS_SSL_ENCRYPT_THEN_MAC defined, but not all prerequsites" #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \ !defined(MBEDTLS_SSL_PROTO_TLS1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2) #error "MBEDTLS_SSL_EXTENDED_MASTER_SECRET defined, but not all prerequsites" #endif #if defined(MBEDTLS_SSL_TICKET_C) && !defined(MBEDTLS_CIPHER_C) #error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \ !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1) #error "MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \ !defined(MBEDTLS_X509_CRT_PARSE_C) #error "MBEDTLS_SSL_SERVER_NAME_INDICATION defined, but not all prerequisites" #endif #if defined(MBEDTLS_THREADING_PTHREAD) #if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) #error "MBEDTLS_THREADING_PTHREAD defined, but not all prerequisites" #endif #define MBEDTLS_THREADING_IMPL #endif #if defined(MBEDTLS_THREADING_ALT) #if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) #error "MBEDTLS_THREADING_ALT defined, but not all prerequisites" #endif #define MBEDTLS_THREADING_IMPL #endif #if defined(MBEDTLS_THREADING_C) && !defined(MBEDTLS_THREADING_IMPL) #error "MBEDTLS_THREADING_C defined, single threading implementation required" #endif #undef MBEDTLS_THREADING_IMPL #if defined(MBEDTLS_VERSION_FEATURES) && !defined(MBEDTLS_VERSION_C) #error "MBEDTLS_VERSION_FEATURES defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_USE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_PARSE_C) || \ !defined(MBEDTLS_PK_PARSE_C) ) #error "MBEDTLS_X509_USE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CREATE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_WRITE_C) || \ !defined(MBEDTLS_PK_WRITE_C) ) #error "MBEDTLS_X509_CREATE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) #error "MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CRL_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) #error "MBEDTLS_X509_CRL_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CSR_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) #error "MBEDTLS_X509_CSR_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CRT_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) #error "MBEDTLS_X509_CRT_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CSR_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) #error "MBEDTLS_X509_CSR_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_HAVE_INT32) && defined(MBEDTLS_HAVE_INT64) #error "MBEDTLS_HAVE_INT32 and MBEDTLS_HAVE_INT64 cannot be defined simultaneously" #endif /* MBEDTLS_HAVE_INT32 && MBEDTLS_HAVE_INT64 */ #if ( defined(MBEDTLS_HAVE_INT32) || defined(MBEDTLS_HAVE_INT64) ) && \ defined(MBEDTLS_HAVE_ASM) #error "MBEDTLS_HAVE_INT32/MBEDTLS_HAVE_INT64 and MBEDTLS_HAVE_ASM cannot be defined simultaneously" #endif /* (MBEDTLS_HAVE_INT32 || MBEDTLS_HAVE_INT64) && MBEDTLS_HAVE_ASM */ /* * Avoid warning from -pedantic. This is a convenient place for this * workaround since this is included by every single file before the * #if defined(MBEDTLS_xxx_C) that results in emtpy translation units. */ typedef int mbedtls_iso_c_forbids_empty_translation_units; #endif /* MBEDTLS_CHECK_CONFIG_H */ fldigi-4.1.06/src/include/mbedtls/hmac_drbg.h0000664000175000017500000003001313507401434015704 00000000000000/** * \file hmac_drbg.h * * \brief HMAC_DRBG (NIST SP 800-90A) */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_HMAC_DRBG_H #define MBEDTLS_HMAC_DRBG_H #include "md.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /* * Error codes */ #define MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -0x0003 /**< Too many random requested in single call. */ #define MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -0x0005 /**< Input too large (Entropy + additional). */ #define MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -0x0007 /**< Read/write error in file. */ #define MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -0x0009 /**< The entropy source failed. */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) #define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ #endif #if !defined(MBEDTLS_HMAC_DRBG_MAX_INPUT) #define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ #endif #if !defined(MBEDTLS_HMAC_DRBG_MAX_REQUEST) #define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ #endif #if !defined(MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT) #define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ #endif /* \} name SECTION: Module settings */ #define MBEDTLS_HMAC_DRBG_PR_OFF 0 /**< No prediction resistance */ #define MBEDTLS_HMAC_DRBG_PR_ON 1 /**< Prediction resistance enabled */ #ifdef __cplusplus extern "C" { #endif /** * HMAC_DRBG context. */ typedef struct mbedtls_hmac_drbg_context { /* Working state: the key K is not stored explicitely, * but is implied by the HMAC context */ mbedtls_md_context_t md_ctx; /*!< HMAC context (inc. K) */ unsigned char V[MBEDTLS_MD_MAX_SIZE]; /*!< V in the spec */ int reseed_counter; /*!< reseed counter */ /* Administrative state */ size_t entropy_len; /*!< entropy bytes grabbed on each (re)seed */ int prediction_resistance; /*!< enable prediction resistance (Automatic reseed before every random generation) */ int reseed_interval; /*!< reseed interval */ /* Callbacks */ int (*f_entropy)(void *, unsigned char *, size_t); /*!< entropy function */ void *p_entropy; /*!< context for the entropy function */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_hmac_drbg_context; /** * \brief HMAC_DRBG context initialization * Makes the context ready for mbedtls_hmac_drbg_seed(), * mbedtls_hmac_drbg_seed_buf() or * mbedtls_hmac_drbg_free(). * * \param ctx HMAC_DRBG context to be initialized */ void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ); /** * \brief HMAC_DRBG initial seeding * Seed and setup entropy source for future reseeds. * * \param ctx HMAC_DRBG context to be seeded * \param md_info MD algorithm to use for HMAC_DRBG * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer * length) * \param p_entropy Entropy context * \param custom Personalization data (Device specific identifiers) * (Can be NULL) * \param len Length of personalization data * * \note The "security strength" as defined by NIST is set to: * 128 bits if md_alg is SHA-1, * 192 bits if md_alg is SHA-224, * 256 bits if md_alg is SHA-256 or higher. * Note that SHA-256 is just as efficient as SHA-224. * * \return 0 if successful, or * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or * MBEDTLS_ERR_MD_ALLOC_FAILED, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED. */ int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ); /** * \brief Initilisation of simpified HMAC_DRBG (never reseeds). * (For use with deterministic ECDSA.) * * \param ctx HMAC_DRBG context to be initialised * \param md_info MD algorithm to use for HMAC_DRBG * \param data Concatenation of entropy string and additional data * \param data_len Length of data in bytes * * \return 0 if successful, or * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or * MBEDTLS_ERR_MD_ALLOC_FAILED. */ int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, const unsigned char *data, size_t data_len ); /** * \brief Enable / disable prediction resistance (Default: Off) * * Note: If enabled, entropy is used for ctx->entropy_len before each call! * Only use this if you have ample supply of good entropy! * * \param ctx HMAC_DRBG context * \param resistance MBEDTLS_HMAC_DRBG_PR_ON or MBEDTLS_HMAC_DRBG_PR_OFF */ void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx, int resistance ); /** * \brief Set the amount of entropy grabbed on each reseed * (Default: given by the security strength, which * depends on the hash used, see \c mbedtls_hmac_drbg_init() ) * * \param ctx HMAC_DRBG context * \param len Amount of entropy to grab, in bytes */ void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, size_t len ); /** * \brief Set the reseed interval * (Default: MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) * * \param ctx HMAC_DRBG context * \param interval Reseed interval */ void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, int interval ); /** * \brief HMAC_DRBG update state * * \param ctx HMAC_DRBG context * \param additional Additional data to update state with, or NULL * \param add_len Length of additional data, or 0 * * \return \c 0 on success, or an error from the underlying * hash calculation. * * \note Additional data is optional, pass NULL and 0 as second * third argument if no additional data is being used. */ int mbedtls_hmac_drbg_update_ret( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ); /** * \brief HMAC_DRBG reseeding (extracts data from entropy source) * * \param ctx HMAC_DRBG context * \param additional Additional data to add to state (Can be NULL) * \param len Length of additional data * * \return 0 if successful, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED */ int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t len ); /** * \brief HMAC_DRBG generate random with additional update input * * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. * * \param p_rng HMAC_DRBG context * \param output Buffer to fill * \param output_len Length of the buffer * \param additional Additional data to update with (can be NULL) * \param add_len Length of additional data (can be 0) * * \return 0 if successful, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG, or * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG. */ int mbedtls_hmac_drbg_random_with_add( void *p_rng, unsigned char *output, size_t output_len, const unsigned char *additional, size_t add_len ); /** * \brief HMAC_DRBG generate random * * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. * * \param p_rng HMAC_DRBG context * \param output Buffer to fill * \param out_len Length of the buffer * * \return 0 if successful, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG */ int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len ); /** * \brief Free an HMAC_DRBG context * * \param ctx HMAC_DRBG context to free. */ void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx ); #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief HMAC_DRBG update state * * \deprecated Superseded by mbedtls_hmac_drbg_update_ret() * in 2.16.0. * * \param ctx HMAC_DRBG context * \param additional Additional data to update state with, or NULL * \param add_len Length of additional data, or 0 * * \note Additional data is optional, pass NULL and 0 as second * third argument if no additional data is being used. */ MBEDTLS_DEPRECATED void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #if defined(MBEDTLS_FS_IO) /** * \brief Write a seed file * * \param ctx HMAC_DRBG context * \param path Name of the file * * \return 0 if successful, 1 on file error, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED */ int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); /** * \brief Read and update a seed file. Seed is added to this * instance * * \param ctx HMAC_DRBG context * \param path Name of the file * * \return 0 if successful, 1 on file error, * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED or * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG */ int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_hmac_drbg_self_test( int verbose ); #endif #ifdef __cplusplus } #endif #endif /* hmac_drbg.h */ fldigi-4.1.06/src/include/mbedtls/ssl_ciphersuites.h0000664000175000017500000006277113507401434017406 00000000000000/** * \file ssl_ciphersuites.h * * \brief SSL Ciphersuites for mbed TLS */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_CIPHERSUITES_H #define MBEDTLS_SSL_CIPHERSUITES_H #include "pk.h" #include "cipher.h" #include "md.h" #ifdef __cplusplus extern "C" { #endif /* * Supported ciphersuites (Official IANA names) */ #define MBEDTLS_TLS_RSA_WITH_NULL_MD5 0x01 /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_NULL_SHA 0x02 /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 0x04 #define MBEDTLS_TLS_RSA_WITH_RC4_128_SHA 0x05 #define MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA 0x09 /**< Weak! Not in TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x0A #define MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA 0x15 /**< Weak! Not in TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x16 #define MBEDTLS_TLS_PSK_WITH_NULL_SHA 0x2C /**< Weak! */ #define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA 0x2D /**< Weak! */ #define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA 0x2E /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA 0x2F #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x33 #define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA 0x35 #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x39 #define MBEDTLS_TLS_RSA_WITH_NULL_SHA256 0x3B /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 0x3C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 0x3D /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 0x41 #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x45 #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x67 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x6B /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 0x84 #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x88 #define MBEDTLS_TLS_PSK_WITH_RC4_128_SHA 0x8A #define MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA 0x8B #define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA 0x8C #define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA 0x8D #define MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA 0x8E #define MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x8F #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA 0x90 #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA 0x91 #define MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA 0x92 #define MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x93 #define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA 0x94 #define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA 0x95 #define MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 0x9C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 0x9D /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x9E /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x9F /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 0xA8 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 0xA9 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 0xAA /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 0xAB /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 0xAC /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 0xAD /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 0xAE #define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 0xAF #define MBEDTLS_TLS_PSK_WITH_NULL_SHA256 0xB0 /**< Weak! */ #define MBEDTLS_TLS_PSK_WITH_NULL_SHA384 0xB1 /**< Weak! */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 0xB2 #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 0xB3 #define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 0xB4 /**< Weak! */ #define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 0xB5 /**< Weak! */ #define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 0xB6 #define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 0xB7 #define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 0xB8 /**< Weak! */ #define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 0xB9 /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBA /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC0 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA 0xC001 /**< Weak! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 0xC002 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC003 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0xC004 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0xC005 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA 0xC006 /**< Weak! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 0xC007 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC008 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xC009 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xC00A /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA 0xC00B /**< Weak! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA 0xC00C /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 0xC00D /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 0xC00E /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 0xC00F /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA 0xC010 /**< Weak! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA 0xC011 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 0xC012 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xC013 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xC014 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC024 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 0xC025 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 0xC026 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC028 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 0xC029 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 0xC02A /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0xC02E /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 0xC032 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA 0xC033 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0xC034 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xC035 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xC036 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0xC037 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0xC038 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA 0xC039 /**< Weak! No SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 0xC03A /**< Weak! No SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 0xC03B /**< Weak! No SSL3! */ #define MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256 0xC03C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384 0xC03D /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 0xC044 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 0xC045 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 0xC048 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 0xC049 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 0xC04A /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 0xC04B /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 0xC04C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 0xC04D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 0xC04E /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 0xC04F /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256 0xC050 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384 0xC051 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 0xC052 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 0xC053 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 0xC05C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 0xC05D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 0xC05E /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 0xC05F /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 0xC060 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 0xC061 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 0xC062 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 0xC063 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256 0xC064 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384 0xC065 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 0xC066 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 0xC067 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 0xC068 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 0xC069 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 0xC06A /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384 0xC06B /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 0xC06C /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 0xC06D /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 0xC06E /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 0xC06F /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 0xC070 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 0xC071 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC072 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC073 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC074 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC075 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC076 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC077 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC078 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC079 /**< Not in SSL3! */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07A /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07B /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07C /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC086 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC087 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC088 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC089 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08A /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08B /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08D /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC08E /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC08F /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC090 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC091 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC092 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC093 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC094 #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC095 #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC096 #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC097 #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC098 #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC099 #define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC09A /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC09B /**< Not in SSL3! */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CCM 0xC09C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_CCM 0xC09D /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM 0xC09E /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM 0xC09F /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 0xC0A0 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 0xC0A1 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 0xC0A2 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 0xC0A3 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_CCM 0xC0A4 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_256_CCM 0xC0A5 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM 0xC0A6 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM 0xC0A7 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 0xC0A8 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 0xC0A9 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 0xC0AA /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 0xC0AB /**< TLS 1.2 */ /* The last two are named with PSK_DHE in the RFC, which looks like a typo */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM 0xC0AC /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM 0xC0AD /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF /**< TLS 1.2 */ #define MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 0xC0FF /**< experimental */ /* RFC 7905 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA8 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA9 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCAA /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAB /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAC /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAD /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAE /**< TLS 1.2 */ /* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange. * Reminder: update MBEDTLS_KEY_EXCHANGE__xxx below */ typedef enum { MBEDTLS_KEY_EXCHANGE_NONE = 0, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_KEY_EXCHANGE_ECJPAKE, } mbedtls_key_exchange_type_t; /* Key exchanges using a certificate */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED #endif /* Key exchanges allowing client certificate requests */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED #endif /* Key exchanges involving server signature in ServerKeyExchange */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED #endif /* Key exchanges using ECDH */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED #endif /* Key exchanges that don't involve ephemeral keys */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED #endif /* Key exchanges that involve ephemeral keys */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED #endif /* Key exchanges using a PSK */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED #endif /* Key exchanges using DHE */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED #endif /* Key exchanges using ECDHE */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED #endif typedef struct mbedtls_ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t; #define MBEDTLS_CIPHERSUITE_WEAK 0x01 /**< Weak ciphersuite flag */ #define MBEDTLS_CIPHERSUITE_SHORT_TAG 0x02 /**< Short authentication tag, eg for CCM_8 */ #define MBEDTLS_CIPHERSUITE_NODTLS 0x04 /**< Can't be used with DTLS */ /** * \brief This structure is used for storing ciphersuite information */ struct mbedtls_ssl_ciphersuite_t { int id; const char * name; mbedtls_cipher_type_t cipher; mbedtls_md_type_t mac; mbedtls_key_exchange_type_t key_exchange; int min_major_ver; int min_minor_ver; int max_major_ver; int max_minor_ver; unsigned char flags; }; const int *mbedtls_ssl_list_ciphersuites( void ); const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( const char *ciphersuite_name ); const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite_id ); #if defined(MBEDTLS_PK_C) mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info ); mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg( const mbedtls_ssl_ciphersuite_t *info ); #endif int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info ); int mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED) static inline int mbedtls_ssl_ciphersuite_has_pfs( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECJPAKE: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED) static inline int mbedtls_ssl_ciphersuite_no_pfs( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_PSK: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_ecdh( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */ static inline int mbedtls_ssl_ciphersuite_cert_req_allowed( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( 1 ); default: return( 0 ); } } #if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_dhe( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_ecdhe( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_server_signature( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ #ifdef __cplusplus } #endif #endif /* ssl_ciphersuites.h */ fldigi-4.1.06/src/include/mbedtls/nist_kw.h0000664000175000017500000001703313507401434015463 00000000000000/** * \file nist_kw.h * * \brief This file provides an API for key wrapping (KW) and key wrapping with * padding (KWP) as defined in NIST SP 800-38F. * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf * * Key wrapping specifies a deterministic authenticated-encryption mode * of operation, according to NIST SP 800-38F: Recommendation for * Block Cipher Modes of Operation: Methods for Key Wrapping. Its * purpose is to protect cryptographic keys. * * Its equivalent is RFC 3394 for KW, and RFC 5649 for KWP. * https://tools.ietf.org/html/rfc3394 * https://tools.ietf.org/html/rfc5649 * */ /* * Copyright (C) 2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_NIST_KW_H #define MBEDTLS_NIST_KW_H #include "cipher.h" #ifdef __cplusplus extern "C" { #endif typedef enum { MBEDTLS_KW_MODE_KW = 0, MBEDTLS_KW_MODE_KWP = 1 } mbedtls_nist_kw_mode_t; #if !defined(MBEDTLS_NIST_KW_ALT) // Regular implementation // /** * \brief The key wrapping context-type definition. The key wrapping context is passed * to the APIs called. * * \note The definition of this type may change in future library versions. * Don't make any assumptions on this context! */ typedef struct { mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ } mbedtls_nist_kw_context; #else /* MBEDTLS_NIST_key wrapping_ALT */ #include "nist_kw_alt.h" #endif /* MBEDTLS_NIST_KW_ALT */ /** * \brief This function initializes the specified key wrapping context * to make references valid and prepare the context * for mbedtls_nist_kw_setkey() or mbedtls_nist_kw_free(). * * \param ctx The key wrapping context to initialize. * */ void mbedtls_nist_kw_init( mbedtls_nist_kw_context *ctx ); /** * \brief This function initializes the key wrapping context set in the * \p ctx parameter and sets the encryption key. * * \param ctx The key wrapping context. * \param cipher The 128-bit block cipher to use. Only AES is supported. * \param key The Key Encryption Key (KEK). * \param keybits The KEK size in bits. This must be acceptable by the cipher. * \param is_wrap Specify whether the operation within the context is wrapping or unwrapping * * \return \c 0 on success. * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for any invalid input. * \return \c MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE for 128-bit block ciphers * which are not supported. * \return cipher-specific error code on failure of the underlying cipher. */ int mbedtls_nist_kw_setkey( mbedtls_nist_kw_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits, const int is_wrap ); /** * \brief This function releases and clears the specified key wrapping context * and underlying cipher sub-context. * * \param ctx The key wrapping context to clear. */ void mbedtls_nist_kw_free( mbedtls_nist_kw_context *ctx ); /** * \brief This function encrypts a buffer using key wrapping. * * \param ctx The key wrapping context to use for encryption. * \param mode The key wrapping mode to use (MBEDTLS_KW_MODE_KW or MBEDTLS_KW_MODE_KWP) * \param input The buffer holding the input data. * \param in_len The length of the input data in Bytes. * The input uses units of 8 Bytes called semiblocks. *
  • For KW mode: a multiple of 8 bytes between 16 and 2^57-8 inclusive.
  • *
  • For KWP mode: any length between 1 and 2^32-1 inclusive.
* \param[out] output The buffer holding the output data. *
  • For KW mode: Must be at least 8 bytes larger than \p in_len.
  • *
  • For KWP mode: Must be at least 8 bytes larger rounded up to a multiple of * 8 bytes for KWP (15 bytes at most).
* \param[out] out_len The number of bytes written to the output buffer. \c 0 on failure. * \param[in] out_size The capacity of the output buffer. * * \return \c 0 on success. * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for invalid input length. * \return cipher-specific error code on failure of the underlying cipher. */ int mbedtls_nist_kw_wrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t* out_len, size_t out_size ); /** * \brief This function decrypts a buffer using key wrapping. * * \param ctx The key wrapping context to use for decryption. * \param mode The key wrapping mode to use (MBEDTLS_KW_MODE_KW or MBEDTLS_KW_MODE_KWP) * \param input The buffer holding the input data. * \param in_len The length of the input data in Bytes. * The input uses units of 8 Bytes called semiblocks. * The input must be a multiple of semiblocks. *
  • For KW mode: a multiple of 8 bytes between 24 and 2^57 inclusive.
  • *
  • For KWP mode: a multiple of 8 bytes between 16 and 2^32 inclusive.
* \param[out] output The buffer holding the output data. * The output buffer's minimal length is 8 bytes shorter than \p in_len. * \param[out] out_len The number of bytes written to the output buffer. \c 0 on failure. * For KWP mode, the length could be up to 15 bytes shorter than \p in_len, * depending on how much padding was added to the data. * \param[in] out_size The capacity of the output buffer. * * \return \c 0 on success. * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for invalid input length. * \return \c MBEDTLS_ERR_CIPHER_AUTH_FAILED for verification failure of the ciphertext. * \return cipher-specific error code on failure of the underlying cipher. */ int mbedtls_nist_kw_unwrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t* out_len, size_t out_size); #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /** * \brief The key wrapping checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_nist_kw_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_NIST_KW_H */ fldigi-4.1.06/src/include/mbedtls/ecdsa.h0000664000175000017500000006051113507401434015063 00000000000000/** * \file ecdsa.h * * \brief This file contains ECDSA definitions and functions. * * The Elliptic Curve Digital Signature Algorithm (ECDSA) is defined in * Standards for Efficient Cryptography Group (SECG): * SEC1 Elliptic Curve Cryptography. * The use of ECDSA for TLS is defined in RFC-4492: Elliptic Curve * Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS). * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECDSA_H #define MBEDTLS_ECDSA_H #include "ecp.h" #include "md.h" /* * RFC-4492 page 20: * * Ecdsa-Sig-Value ::= SEQUENCE { * r INTEGER, * s INTEGER * } * * Size is at most * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s, * twice that + 1 (tag) + 2 (len) for the sequence * (assuming ECP_MAX_BYTES is less than 126 for r and s, * and less than 124 (total len <= 255) for the sequence) */ #if MBEDTLS_ECP_MAX_BYTES > 124 #error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN" #endif /** The maximal size of an ECDSA signature in Bytes. */ #define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) ) #ifdef __cplusplus extern "C" { #endif /** * \brief The ECDSA context structure. * * \warning Performing multiple operations concurrently on the same * ECDSA context is not supported; objects of this type * should not be shared between multiple threads. */ typedef mbedtls_ecp_keypair mbedtls_ecdsa_context; #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Internal restart context for ecdsa_verify() * * \note Opaque struct, defined in ecdsa.c */ typedef struct mbedtls_ecdsa_restart_ver mbedtls_ecdsa_restart_ver_ctx; /** * \brief Internal restart context for ecdsa_sign() * * \note Opaque struct, defined in ecdsa.c */ typedef struct mbedtls_ecdsa_restart_sig mbedtls_ecdsa_restart_sig_ctx; #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /** * \brief Internal restart context for ecdsa_sign_det() * * \note Opaque struct, defined in ecdsa.c */ typedef struct mbedtls_ecdsa_restart_det mbedtls_ecdsa_restart_det_ctx; #endif /** * \brief General context for resuming ECDSA operations */ typedef struct { mbedtls_ecp_restart_ctx ecp; /*!< base context for ECP restart and shared administrative info */ mbedtls_ecdsa_restart_ver_ctx *ver; /*!< ecdsa_verify() sub-context */ mbedtls_ecdsa_restart_sig_ctx *sig; /*!< ecdsa_sign() sub-context */ #if defined(MBEDTLS_ECDSA_DETERMINISTIC) mbedtls_ecdsa_restart_det_ctx *det; /*!< ecdsa_sign_det() sub-context */ #endif } mbedtls_ecdsa_restart_ctx; #else /* MBEDTLS_ECP_RESTARTABLE */ /* Now we can declare functions that take a pointer to that */ typedef void mbedtls_ecdsa_restart_ctx; #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \brief This function computes the ECDSA signature of a * previously-hashed message. * * \note The deterministic version implemented in * mbedtls_ecdsa_sign_det() is usually preferred. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated * as defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \param grp The context for the elliptic curve to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param r The MPI context in which to store the first part * the signature. This must be initialized. * \param s The MPI context in which to store the second part * the signature. This must be initialized. * \param d The private signing key. This must be initialized. * \param buf The content to be signed. This is usually the hash of * the original data to be signed. This must be a readable * buffer of length \p blen Bytes. It may be \c NULL if * \p blen is zero. * \param blen The length of \p buf in Bytes. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context parameter. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX * or \c MBEDTLS_MPI_XXX error code on failure. */ int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /** * \brief This function computes the ECDSA signature of a * previously-hashed message, deterministic version. * * For more information, see RFC-6979: Deterministic * Usage of the Digital Signature Algorithm (DSA) and Elliptic * Curve Digital Signature Algorithm (ECDSA). * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \param grp The context for the elliptic curve to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param r The MPI context in which to store the first part * the signature. This must be initialized. * \param s The MPI context in which to store the second part * the signature. This must be initialized. * \param d The private signing key. This must be initialized * and setup, for example through mbedtls_ecp_gen_privkey(). * \param buf The hashed content to be signed. This must be a readable * buffer of length \p blen Bytes. It may be \c NULL if * \p blen is zero. * \param blen The length of \p buf in Bytes. * \param md_alg The hash algorithm used to hash the original data. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX * error code on failure. */ int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, mbedtls_md_type_t md_alg ); #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ /** * \brief This function verifies the ECDSA signature of a * previously-hashed message. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.4, step 3. * * \see ecp.h * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param buf The hashed content that was signed. This must be a readable * buffer of length \p blen Bytes. It may be \c NULL if * \p blen is zero. * \param blen The length of \p buf in Bytes. * \param Q The public key to use for verification. This must be * initialized and setup. * \param r The first integer of the signature. * This must be initialized. * \param s The second integer of the signature. * This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the signature * is invalid. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX * error code on failure for any other reason. */ int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, const unsigned char *buf, size_t blen, const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s); /** * \brief This function computes the ECDSA signature and writes it * to a buffer, serialized as defined in RFC-4492: * Elliptic Curve Cryptography (ECC) Cipher Suites for * Transport Layer Security (TLS). * * \warning It is not thread-safe to use the same context in * multiple threads. * * \note The deterministic version is used if * #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more * information, see RFC-6979: Deterministic Usage * of the Digital Signature Algorithm (DSA) and Elliptic * Curve Digital Signature Algorithm (ECDSA). * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \param ctx The ECDSA context to use. This must be initialized * and have a group and private key bound to it, for example * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). * \param md_alg The message digest that was used to hash the message. * \param hash The message hash to be signed. This must be a readable * buffer of length \p blen Bytes. * \param hlen The length of the hash \p hash in Bytes. * \param sig The buffer to which to write the signature. This must be a * writable buffer of length at least twice as large as the * size of the curve used, plus 9. For example, 73 Bytes if * a 256-bit curve is used. A buffer length of * #MBEDTLS_ECDSA_MAX_LEN is always safe. * \param slen The address at which to store the actual length of * the signature written. Must not be \c NULL. * \param f_rng The RNG function. This must not be \c NULL if * #MBEDTLS_ECDSA_DETERMINISTIC is unset. Otherwise, * it is unused and may be set to \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't use a context. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or * \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function computes the ECDSA signature and writes it * to a buffer, in a restartable way. * * \see \c mbedtls_ecdsa_write_signature() * * \note This function is like \c mbedtls_ecdsa_write_signature() * but it can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param ctx The ECDSA context to use. This must be initialized * and have a group and private key bound to it, for example * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). * \param md_alg The message digest that was used to hash the message. * \param hash The message hash to be signed. This must be a readable * buffer of length \p blen Bytes. * \param hlen The length of the hash \p hash in Bytes. * \param sig The buffer to which to write the signature. This must be a * writable buffer of length at least twice as large as the * size of the curve used, plus 9. For example, 73 Bytes if * a 256-bit curve is used. A buffer length of * #MBEDTLS_ECDSA_MAX_LEN is always safe. * \param slen The address at which to store the actual length of * the signature written. Must not be \c NULL. * \param f_rng The RNG function. This must not be \c NULL if * #MBEDTLS_ECDSA_DETERMINISTIC is unset. Otherwise, * it is unused and may be set to \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't use a context. * \param rs_ctx The restart context to use. This may be \c NULL to disable * restarting. If it is not \c NULL, it must point to an * initialized restart context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or * \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_ecdsa_write_signature_restartable( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecdsa_restart_ctx *rs_ctx ); #if defined(MBEDTLS_ECDSA_DETERMINISTIC) #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function computes an ECDSA signature and writes * it to a buffer, serialized as defined in RFC-4492: * Elliptic Curve Cryptography (ECC) Cipher Suites for * Transport Layer Security (TLS). * * The deterministic version is defined in RFC-6979: * Deterministic Usage of the Digital Signature Algorithm (DSA) * and Elliptic Curve Digital Signature Algorithm (ECDSA). * * \warning It is not thread-safe to use the same context in * multiple threads. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \deprecated Superseded by mbedtls_ecdsa_write_signature() in * Mbed TLS version 2.0 and later. * * \param ctx The ECDSA context to use. This must be initialized * and have a group and private key bound to it, for example * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). * \param hash The message hash to be signed. This must be a readable * buffer of length \p blen Bytes. * \param hlen The length of the hash \p hash in Bytes. * \param sig The buffer to which to write the signature. This must be a * writable buffer of length at least twice as large as the * size of the curve used, plus 9. For example, 73 Bytes if * a 256-bit curve is used. A buffer length of * #MBEDTLS_ECDSA_MAX_LEN is always safe. * \param slen The address at which to store the actual length of * the signature written. Must not be \c NULL. * \param md_alg The message digest that was used to hash the message. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or * \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED; #undef MBEDTLS_DEPRECATED #endif /* MBEDTLS_DEPRECATED_REMOVED */ #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ /** * \brief This function reads and verifies an ECDSA signature. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.4, step 3. * * \see ecp.h * * \param ctx The ECDSA context to use. This must be initialized * and have a group and public key bound to it. * \param hash The message hash that was signed. This must be a readable * buffer of length \p size Bytes. * \param hlen The size of the hash \p hash. * \param sig The signature to read and verify. This must be a readable * buffer of length \p slen Bytes. * \param slen The size of \p sig in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid * signature in \p sig, but its length is less than \p siglen. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX * error code on failure for any other reason. */ int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen ); /** * \brief This function reads and verifies an ECDSA signature, * in a restartable way. * * \see \c mbedtls_ecdsa_read_signature() * * \note This function is like \c mbedtls_ecdsa_read_signature() * but it can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param ctx The ECDSA context to use. This must be initialized * and have a group and public key bound to it. * \param hash The message hash that was signed. This must be a readable * buffer of length \p size Bytes. * \param hlen The size of the hash \p hash. * \param sig The signature to read and verify. This must be a readable * buffer of length \p slen Bytes. * \param slen The size of \p sig in Bytes. * \param rs_ctx The restart context to use. This may be \c NULL to disable * restarting. If it is not \c NULL, it must point to an * initialized restart context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid * signature in \p sig, but its length is less than \p siglen. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX * error code on failure for any other reason. */ int mbedtls_ecdsa_read_signature_restartable( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen, mbedtls_ecdsa_restart_ctx *rs_ctx ); /** * \brief This function generates an ECDSA keypair on the given curve. * * \see ecp.h * * \param ctx The ECDSA context to store the keypair in. * This must be initialized. * \param gid The elliptic curve to use. One of the various * \c MBEDTLS_ECP_DP_XXX macros depending on configuration. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. */ int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function sets up an ECDSA context from an EC key pair. * * \see ecp.h * * \param ctx The ECDSA context to setup. This must be initialized. * \param key The EC key to use. This must be initialized and hold * a private-public key pair or a public key. In the former * case, the ECDSA context may be used for signature creation * and verification after this call. In the latter case, it * may be used for signature verification. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. */ int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key ); /** * \brief This function initializes an ECDSA context. * * \param ctx The ECDSA context to initialize. * This must not be \c NULL. */ void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx ); /** * \brief This function frees an ECDSA context. * * \param ctx The ECDSA context to free. This may be \c NULL, * in which case this function does nothing. If it * is not \c NULL, it must be initialized. */ void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx ); #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context. * * \param ctx The restart context to initialize. * This must not be \c NULL. */ void mbedtls_ecdsa_restart_init( mbedtls_ecdsa_restart_ctx *ctx ); /** * \brief Free the components of a restart context. * * \param ctx The restart context to free. This may be \c NULL, * in which case this function does nothing. If it * is not \c NULL, it must be initialized. */ void mbedtls_ecdsa_restart_free( mbedtls_ecdsa_restart_ctx *ctx ); #endif /* MBEDTLS_ECP_RESTARTABLE */ #ifdef __cplusplus } #endif #endif /* ecdsa.h */ fldigi-4.1.06/src/include/mbedtls/net_sockets.h0000664000175000017500000002547213507401434016334 00000000000000/** * \file net_sockets.h * * \brief Network sockets abstraction layer to integrate Mbed TLS into a * BSD-style sockets API. * * The network sockets module provides an example integration of the * Mbed TLS library into a BSD sockets implementation. The module is * intended to be an example of how Mbed TLS can be integrated into a * networking stack, as well as to be Mbed TLS's network integration * for its supported platforms. * * The module is intended only to be used with the Mbed TLS library and * is not intended to be used by third party application software * directly. * * The supported platforms are as follows: * * Microsoft Windows and Windows CE * * POSIX/Unix platforms including Linux, OS X * */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_NET_SOCKETS_H #define MBEDTLS_NET_SOCKETS_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "ssl.h" #include #include #define MBEDTLS_ERR_NET_SOCKET_FAILED -0x0042 /**< Failed to open a socket. */ #define MBEDTLS_ERR_NET_CONNECT_FAILED -0x0044 /**< The connection to the given server / port failed. */ #define MBEDTLS_ERR_NET_BIND_FAILED -0x0046 /**< Binding of the socket failed. */ #define MBEDTLS_ERR_NET_LISTEN_FAILED -0x0048 /**< Could not listen on the socket. */ #define MBEDTLS_ERR_NET_ACCEPT_FAILED -0x004A /**< Could not accept the incoming connection. */ #define MBEDTLS_ERR_NET_RECV_FAILED -0x004C /**< Reading information from the socket failed. */ #define MBEDTLS_ERR_NET_SEND_FAILED -0x004E /**< Sending information through the socket failed. */ #define MBEDTLS_ERR_NET_CONN_RESET -0x0050 /**< Connection was reset by peer. */ #define MBEDTLS_ERR_NET_UNKNOWN_HOST -0x0052 /**< Failed to get an IP address for the given hostname. */ #define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL -0x0043 /**< Buffer is too small to hold the data. */ #define MBEDTLS_ERR_NET_INVALID_CONTEXT -0x0045 /**< The context is invalid, eg because it was free()ed. */ #define MBEDTLS_ERR_NET_POLL_FAILED -0x0047 /**< Polling the net context failed. */ #define MBEDTLS_ERR_NET_BAD_INPUT_DATA -0x0049 /**< Input invalid. */ #define MBEDTLS_NET_LISTEN_BACKLOG 10 /**< The backlog that listen() should use. */ #define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */ #define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */ #define MBEDTLS_NET_POLL_READ 1 /**< Used in \c mbedtls_net_poll to check for pending data */ #define MBEDTLS_NET_POLL_WRITE 2 /**< Used in \c mbedtls_net_poll to check if write possible */ #ifdef __cplusplus extern "C" { #endif /** * Wrapper type for sockets. * * Currently backed by just a file descriptor, but might be more in the future * (eg two file descriptors for combined IPv4 + IPv6 support, or additional * structures for hand-made UDP demultiplexing). */ typedef struct mbedtls_net_context { int fd; /**< The underlying file descriptor */ } mbedtls_net_context; /** * \brief Initialize a context * Just makes the context ready to be used or freed safely. * * \param ctx Context to initialize */ void mbedtls_net_init( mbedtls_net_context *ctx ); /** * \brief Initiate a connection with host:port in the given protocol * * \param ctx Socket to use * \param host Host to connect to * \param port Port to connect to * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP * * \return 0 if successful, or one of: * MBEDTLS_ERR_NET_SOCKET_FAILED, * MBEDTLS_ERR_NET_UNKNOWN_HOST, * MBEDTLS_ERR_NET_CONNECT_FAILED * * \note Sets the socket in connected mode even with UDP. */ int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto ); /** * \brief Create a receiving socket on bind_ip:port in the chosen * protocol. If bind_ip == NULL, all interfaces are bound. * * \param ctx Socket to use * \param bind_ip IP to bind to, can be NULL * \param port Port number to use * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP * * \return 0 if successful, or one of: * MBEDTLS_ERR_NET_SOCKET_FAILED, * MBEDTLS_ERR_NET_BIND_FAILED, * MBEDTLS_ERR_NET_LISTEN_FAILED * * \note Regardless of the protocol, opens the sockets and binds it. * In addition, make the socket listening if protocol is TCP. */ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto ); /** * \brief Accept a connection from a remote client * * \param bind_ctx Relevant socket * \param client_ctx Will contain the connected client socket * \param client_ip Will contain the client IP address, can be NULL * \param buf_size Size of the client_ip buffer * \param ip_len Will receive the size of the client IP written, * can be NULL if client_ip is null * * \return 0 if successful, or * MBEDTLS_ERR_NET_ACCEPT_FAILED, or * MBEDTLS_ERR_NET_BUFFER_TOO_SMALL if buf_size is too small, * MBEDTLS_ERR_SSL_WANT_READ if bind_fd was set to * non-blocking and accept() would block. */ int mbedtls_net_accept( mbedtls_net_context *bind_ctx, mbedtls_net_context *client_ctx, void *client_ip, size_t buf_size, size_t *ip_len ); /** * \brief Check and wait for the context to be ready for read/write * * \param ctx Socket to check * \param rw Bitflag composed of MBEDTLS_NET_POLL_READ and * MBEDTLS_NET_POLL_WRITE specifying the events * to wait for: * - If MBEDTLS_NET_POLL_READ is set, the function * will return as soon as the net context is available * for reading. * - If MBEDTLS_NET_POLL_WRITE is set, the function * will return as soon as the net context is available * for writing. * \param timeout Maximal amount of time to wait before returning, * in milliseconds. If \c timeout is zero, the * function returns immediately. If \c timeout is * -1u, the function blocks potentially indefinitely. * * \return Bitmask composed of MBEDTLS_NET_POLL_READ/WRITE * on success or timeout, or a negative return code otherwise. */ int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout ); /** * \brief Set the socket blocking * * \param ctx Socket to set * * \return 0 if successful, or a non-zero error code */ int mbedtls_net_set_block( mbedtls_net_context *ctx ); /** * \brief Set the socket non-blocking * * \param ctx Socket to set * * \return 0 if successful, or a non-zero error code */ int mbedtls_net_set_nonblock( mbedtls_net_context *ctx ); /** * \brief Portable usleep helper * * \param usec Amount of microseconds to sleep * * \note Real amount of time slept will not be less than * select()'s timeout granularity (typically, 10ms). */ void mbedtls_net_usleep( unsigned long usec ); /** * \brief Read at most 'len' characters. If no error occurs, * the actual amount read is returned. * * \param ctx Socket * \param buf The buffer to write to * \param len Maximum length of the buffer * * \return the number of bytes received, * or a non-zero error code; with a non-blocking socket, * MBEDTLS_ERR_SSL_WANT_READ indicates read() would block. */ int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len ); /** * \brief Write at most 'len' characters. If no error occurs, * the actual amount read is returned. * * \param ctx Socket * \param buf The buffer to read from * \param len The length of the buffer * * \return the number of bytes sent, * or a non-zero error code; with a non-blocking socket, * MBEDTLS_ERR_SSL_WANT_WRITE indicates write() would block. */ int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len ); /** * \brief Read at most 'len' characters, blocking for at most * 'timeout' seconds. If no error occurs, the actual amount * read is returned. * * \param ctx Socket * \param buf The buffer to write to * \param len Maximum length of the buffer * \param timeout Maximum number of milliseconds to wait for data * 0 means no timeout (wait forever) * * \return the number of bytes received, * or a non-zero error code: * MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, * MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. * * \note This function will block (until data becomes available or * timeout is reached) even if the socket is set to * non-blocking. Handling timeouts with non-blocking reads * requires a different strategy. */ int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, uint32_t timeout ); /** * \brief Gracefully shutdown the connection and free associated data * * \param ctx The context to free */ void mbedtls_net_free( mbedtls_net_context *ctx ); #ifdef __cplusplus } #endif #endif /* net_sockets.h */ fldigi-4.1.06/src/include/mbedtls/base64.h0000664000175000017500000000634713507401434015077 00000000000000/** * \file base64.h * * \brief RFC 1521 base64 encoding/decoding */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_BASE64_H #define MBEDTLS_BASE64_H #include #define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ #define MBEDTLS_ERR_BASE64_INVALID_CHARACTER -0x002C /**< Invalid character in input. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Encode a buffer into base64 format * * \param dst destination buffer * \param dlen size of the destination buffer * \param olen number of bytes written * \param src source buffer * \param slen amount of data to be encoded * * \return 0 if successful, or MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL. * *olen is always updated to reflect the amount * of data that has (or would have) been written. * If that length cannot be represented, then no data is * written to the buffer and *olen is set to the maximum * length representable as a size_t. * * \note Call this function with dlen = 0 to obtain the * required buffer size in *olen */ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ); /** * \brief Decode a base64-formatted buffer * * \param dst destination buffer (can be NULL for checking size) * \param dlen size of the destination buffer * \param olen number of bytes written * \param src source buffer * \param slen amount of data to be decoded * * \return 0 if successful, MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL, or * MBEDTLS_ERR_BASE64_INVALID_CHARACTER if the input data is * not correct. *olen is always updated to reflect the amount * of data that has (or would have) been written. * * \note Call this function with *dst = NULL or dlen = 0 to obtain * the required buffer size in *olen */ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_base64_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* base64.h */ fldigi-4.1.06/src/include/mbedtls/cmac.h0000664000175000017500000001757613507401434014724 00000000000000/** * \file cmac.h * * \brief This file contains CMAC definitions and functions. * * The Cipher-based Message Authentication Code (CMAC) Mode for * Authentication is defined in RFC-4493: The AES-CMAC Algorithm. */ /* * Copyright (C) 2015-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CMAC_H #define MBEDTLS_CMAC_H #include "cipher.h" #ifdef __cplusplus extern "C" { #endif /* MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED -0x007A /**< CMAC hardware accelerator failed. */ #define MBEDTLS_AES_BLOCK_SIZE 16 #define MBEDTLS_DES3_BLOCK_SIZE 8 #if defined(MBEDTLS_AES_C) #define MBEDTLS_CIPHER_BLKSIZE_MAX 16 /**< The longest block used by CMAC is that of AES. */ #else #define MBEDTLS_CIPHER_BLKSIZE_MAX 8 /**< The longest block used by CMAC is that of 3DES. */ #endif #if !defined(MBEDTLS_CMAC_ALT) /** * The CMAC context structure. */ struct mbedtls_cmac_context_t { /** The internal state of the CMAC algorithm. */ unsigned char state[MBEDTLS_CIPHER_BLKSIZE_MAX]; /** Unprocessed data - either data that was not block aligned and is still * pending processing, or the final block. */ unsigned char unprocessed_block[MBEDTLS_CIPHER_BLKSIZE_MAX]; /** The length of data pending processing. */ size_t unprocessed_len; }; #else /* !MBEDTLS_CMAC_ALT */ #include "cmac_alt.h" #endif /* !MBEDTLS_CMAC_ALT */ /** * \brief This function sets the CMAC key, and prepares to authenticate * the input data. * Must be called with an initialized cipher context. * * \param ctx The cipher context used for the CMAC operation, initialized * as one of the following types: MBEDTLS_CIPHER_AES_128_ECB, * MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_CIPHER_AES_256_ECB, * or MBEDTLS_CIPHER_DES_EDE3_ECB. * \param key The CMAC key. * \param keybits The length of the CMAC key in bits. * Must be supported by the cipher. * * \return \c 0 on success. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx, const unsigned char *key, size_t keybits ); /** * \brief This function feeds an input buffer into an ongoing CMAC * computation. * * It is called between mbedtls_cipher_cmac_starts() or * mbedtls_cipher_cmac_reset(), and mbedtls_cipher_cmac_finish(). * Can be called repeatedly. * * \param ctx The cipher context used for the CMAC operation. * \param input The buffer holding the input data. * \param ilen The length of the input data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the CMAC operation, and writes * the result to the output buffer. * * It is called after mbedtls_cipher_cmac_update(). * It can be followed by mbedtls_cipher_cmac_reset() and * mbedtls_cipher_cmac_update(), or mbedtls_cipher_free(). * * \param ctx The cipher context used for the CMAC operation. * \param output The output buffer for the CMAC checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx, unsigned char *output ); /** * \brief This function prepares the authentication of another * message with the same key as the previous CMAC * operation. * * It is called after mbedtls_cipher_cmac_finish() * and before mbedtls_cipher_cmac_update(). * * \param ctx The cipher context used for the CMAC operation. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx ); /** * \brief This function calculates the full generic CMAC * on the input buffer with the provided key. * * The function allocates the context, performs the * calculation, and frees the context. * * The CMAC result is calculated as * output = generic CMAC(cmac key, input buffer). * * * \param cipher_info The cipher information. * \param key The CMAC key. * \param keylen The length of the CMAC key in bits. * \param input The buffer holding the input data. * \param ilen The length of the input data. * \param output The buffer for the generic CMAC result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ); #if defined(MBEDTLS_AES_C) /** * \brief This function implements the AES-CMAC-PRF-128 pseudorandom * function, as defined in * RFC-4615: The Advanced Encryption Standard-Cipher-based * Message Authentication Code-Pseudo-Random Function-128 * (AES-CMAC-PRF-128) Algorithm for the Internet Key * Exchange Protocol (IKE). * * \param key The key to use. * \param key_len The key length in Bytes. * \param input The buffer holding the input data. * \param in_len The length of the input data in Bytes. * \param output The buffer holding the generated 16 Bytes of * pseudorandom output. * * \return \c 0 on success. */ int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_len, const unsigned char *input, size_t in_len, unsigned char output[16] ); #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_SELF_TEST) && ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) ) /** * \brief The CMAC checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_cmac_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CMAC_H */ fldigi-4.1.06/src/include/mbedtls/bignum.h0000664000175000017500000011727413507401434015276 00000000000000/** * \file bignum.h * * \brief Multi-precision integer library */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_BIGNUM_H #define MBEDTLS_BIGNUM_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #if defined(MBEDTLS_FS_IO) #include #endif #define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002 /**< An error occurred while reading from or writing to a file. */ #define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006 /**< There is an invalid character in the digit string. */ #define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008 /**< The buffer is too small to write to. */ #define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A /**< The input arguments are negative or result in illegal output. */ #define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C /**< The input argument for division is zero, which is not allowed. */ #define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ #define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 /**< Memory allocation failed. */ #define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 ) /* * Maximum size MPIs are allowed to grow to in number of limbs. */ #define MBEDTLS_MPI_MAX_LIMBS 10000 #if !defined(MBEDTLS_MPI_WINDOW_SIZE) /* * Maximum window size used for modular exponentiation. Default: 6 * Minimum value: 1. Maximum value: 6. * * Result is an array of ( 2 << MBEDTLS_MPI_WINDOW_SIZE ) MPIs used * for the sliding window calculation. (So 64 by default) * * Reduction in size, reduces speed. */ #define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ #endif /* !MBEDTLS_MPI_WINDOW_SIZE */ #if !defined(MBEDTLS_MPI_MAX_SIZE) /* * Maximum size of MPIs allowed in bits and bytes for user-MPIs. * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits ) * * Note: Calculations can temporarily result in larger MPIs. So the number * of limbs required (MBEDTLS_MPI_MAX_LIMBS) is higher. */ #define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ #endif /* !MBEDTLS_MPI_MAX_SIZE */ #define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE ) /**< Maximum number of bits for usable MPIs. */ /* * When reading from files with mbedtls_mpi_read_file() and writing to files with * mbedtls_mpi_write_file() the buffer should have space * for a (short) label, the MPI (in the provided radix), the newline * characters and the '\0'. * * By default we assume at least a 10 char label, a minimum radix of 10 * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars). * Autosized at compile time for at least a 10 char label, a minimum radix * of 10 (decimal) for a number of MBEDTLS_MPI_MAX_BITS size. * * This used to be statically sized to 1250 for a maximum of 4096 bit * numbers (1234 decimal chars). * * Calculate using the formula: * MBEDTLS_MPI_RW_BUFFER_SIZE = ceil(MBEDTLS_MPI_MAX_BITS / ln(10) * ln(2)) + * LabelSize + 6 */ #define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS ) #define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332 #define MBEDTLS_MPI_RW_BUFFER_SIZE ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 ) /* * Define the base integer type, architecture-wise. * * 32 or 64-bit integer types can be forced regardless of the underlying * architecture by defining MBEDTLS_HAVE_INT32 or MBEDTLS_HAVE_INT64 * respectively and undefining MBEDTLS_HAVE_ASM. * * Double-width integers (e.g. 128-bit in 64-bit architectures) can be * disabled by defining MBEDTLS_NO_UDBL_DIVISION. */ #if !defined(MBEDTLS_HAVE_INT32) #if defined(_MSC_VER) && defined(_M_AMD64) /* Always choose 64-bit when using MSC */ #if !defined(MBEDTLS_HAVE_INT64) #define MBEDTLS_HAVE_INT64 #endif /* !MBEDTLS_HAVE_INT64 */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #elif defined(__GNUC__) && ( \ defined(__amd64__) || defined(__x86_64__) || \ defined(__ppc64__) || defined(__powerpc64__) || \ defined(__ia64__) || defined(__alpha__) || \ ( defined(__sparc__) && defined(__arch64__) ) || \ defined(__s390x__) || defined(__mips64) ) #if !defined(MBEDTLS_HAVE_INT64) #define MBEDTLS_HAVE_INT64 #endif /* MBEDTLS_HAVE_INT64 */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #if !defined(MBEDTLS_NO_UDBL_DIVISION) /* mbedtls_t_udbl defined as 128-bit unsigned int */ typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI))); #define MBEDTLS_HAVE_UDBL #endif /* !MBEDTLS_NO_UDBL_DIVISION */ #elif defined(__ARMCC_VERSION) && defined(__aarch64__) /* * __ARMCC_VERSION is defined for both armcc and armclang and * __aarch64__ is only defined by armclang when compiling 64-bit code */ #if !defined(MBEDTLS_HAVE_INT64) #define MBEDTLS_HAVE_INT64 #endif /* !MBEDTLS_HAVE_INT64 */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #if !defined(MBEDTLS_NO_UDBL_DIVISION) /* mbedtls_t_udbl defined as 128-bit unsigned int */ typedef __uint128_t mbedtls_t_udbl; #define MBEDTLS_HAVE_UDBL #endif /* !MBEDTLS_NO_UDBL_DIVISION */ #elif defined(MBEDTLS_HAVE_INT64) /* Force 64-bit integers with unknown compiler */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #endif #endif /* !MBEDTLS_HAVE_INT32 */ #if !defined(MBEDTLS_HAVE_INT64) /* Default to 32-bit compilation */ #if !defined(MBEDTLS_HAVE_INT32) #define MBEDTLS_HAVE_INT32 #endif /* !MBEDTLS_HAVE_INT32 */ typedef int32_t mbedtls_mpi_sint; typedef uint32_t mbedtls_mpi_uint; #if !defined(MBEDTLS_NO_UDBL_DIVISION) typedef uint64_t mbedtls_t_udbl; #define MBEDTLS_HAVE_UDBL #endif /* !MBEDTLS_NO_UDBL_DIVISION */ #endif /* !MBEDTLS_HAVE_INT64 */ #ifdef __cplusplus extern "C" { #endif /** * \brief MPI structure */ typedef struct mbedtls_mpi { int s; /*!< integer sign */ size_t n; /*!< total # of limbs */ mbedtls_mpi_uint *p; /*!< pointer to limbs */ } mbedtls_mpi; /** * \brief Initialize an MPI context. * * This makes the MPI ready to be set or freed, * but does not define a value for the MPI. * * \param X The MPI context to initialize. This must not be \c NULL. */ void mbedtls_mpi_init( mbedtls_mpi *X ); /** * \brief This function frees the components of an MPI context. * * \param X The MPI context to be cleared. This may be \c NULL, * in which case this function is a no-op. If it is * not \c NULL, it must point to an initialized MPI. */ void mbedtls_mpi_free( mbedtls_mpi *X ); /** * \brief Enlarge an MPI to the specified number of limbs. * * \note This function does nothing if the MPI is * already large enough. * * \param X The MPI to grow. It must be initialized. * \param nblimbs The target number of limbs. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs ); /** * \brief This function resizes an MPI downwards, keeping at least the * specified number of limbs. * * If \c X is smaller than \c nblimbs, it is resized up * instead. * * \param X The MPI to shrink. This must point to an initialized MPI. * \param nblimbs The minimum number of limbs to keep. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed * (this can only happen when resizing up). * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs ); /** * \brief Make a copy of an MPI. * * \param X The destination MPI. This must point to an initialized MPI. * \param Y The source MPI. This must point to an initialized MPI. * * \note The limb-buffer in the destination MPI is enlarged * if necessary to hold the value in the source MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y ); /** * \brief Swap the contents of two MPIs. * * \param X The first MPI. It must be initialized. * \param Y The second MPI. It must be initialized. */ void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ); /** * \brief Perform a safe conditional copy of MPI which doesn't * reveal whether the condition was true or not. * * \param X The MPI to conditionally assign to. This must point * to an initialized MPI. * \param Y The MPI to be assigned from. This must point to an * initialized MPI. * \param assign The condition deciding whether to perform the * assignment or not. Possible values: * * \c 1: Perform the assignment `X = Y`. * * \c 0: Keep the original value of \p X. * * \note This function is equivalent to * `if( assign ) mbedtls_mpi_copy( X, Y );` * except that it avoids leaking any information about whether * the assignment was done or not (the above code may leak * information through branch prediction and/or memory access * patterns analysis). * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign ); /** * \brief Perform a safe conditional swap which doesn't * reveal whether the condition was true or not. * * \param X The first MPI. This must be initialized. * \param Y The second MPI. This must be initialized. * \param assign The condition deciding whether to perform * the swap or not. Possible values: * * \c 1: Swap the values of \p X and \p Y. * * \c 0: Keep the original values of \p X and \p Y. * * \note This function is equivalent to * if( assign ) mbedtls_mpi_swap( X, Y ); * except that it avoids leaking any information about whether * the assignment was done or not (the above code may leak * information through branch prediction and/or memory access * patterns analysis). * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. * */ int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign ); /** * \brief Store integer value in MPI. * * \param X The MPI to set. This must be initialized. * \param z The value to use. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ); /** * \brief Get a specific bit from an MPI. * * \param X The MPI to query. This must be initialized. * \param pos Zero-based index of the bit to query. * * \return \c 0 or \c 1 on success, depending on whether bit \c pos * of \c X is unset or set. * \return A negative error code on failure. */ int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos ); /** * \brief Modify a specific bit in an MPI. * * \note This function will grow the target MPI if necessary to set a * bit to \c 1 in a not yet existing limb. It will not grow if * the bit should be set to \c 0. * * \param X The MPI to modify. This must be initialized. * \param pos Zero-based index of the bit to modify. * \param val The desired value of bit \c pos: \c 0 or \c 1. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val ); /** * \brief Return the number of bits of value \c 0 before the * least significant bit of value \c 1. * * \note This is the same as the zero-based index of * the least significant bit of value \c 1. * * \param X The MPI to query. * * \return The number of bits of value \c 0 before the least significant * bit of value \c 1 in \p X. */ size_t mbedtls_mpi_lsb( const mbedtls_mpi *X ); /** * \brief Return the number of bits up to and including the most * significant bit of value \c 1. * * * \note This is same as the one-based index of the most * significant bit of value \c 1. * * \param X The MPI to query. This must point to an initialized MPI. * * \return The number of bits up to and including the most * significant bit of value \c 1. */ size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X ); /** * \brief Return the total size of an MPI value in bytes. * * \param X The MPI to use. This must point to an initialized MPI. * * \note The value returned by this function may be less than * the number of bytes used to store \p X internally. * This happens if and only if there are trailing bytes * of value zero. * * \return The least number of bytes capable of storing * the absolute value of \p X. */ size_t mbedtls_mpi_size( const mbedtls_mpi *X ); /** * \brief Import an MPI from an ASCII string. * * \param X The destination MPI. This must point to an initialized MPI. * \param radix The numeric base of the input string. * \param s Null-terminated string buffer. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s ); /** * \brief Export an MPI to an ASCII string. * * \param X The source MPI. This must point to an initialized MPI. * \param radix The numeric base of the output string. * \param buf The buffer to write the string to. This must be writable * buffer of length \p buflen Bytes. * \param buflen The available size in Bytes of \p buf. * \param olen The address at which to store the length of the string * written, including the final \c NULL byte. This must * not be \c NULL. * * \note You can call this function with `buflen == 0` to obtain the * minimum required buffer size in `*olen`. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the target buffer \p buf * is too small to hold the value of \p X in the desired base. * In this case, `*olen` is nonetheless updated to contain the * size of \p buf required for a successful call. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, char *buf, size_t buflen, size_t *olen ); #if defined(MBEDTLS_FS_IO) /** * \brief Read an MPI from a line in an opened file. * * \param X The destination MPI. This must point to an initialized MPI. * \param radix The numeric base of the string representation used * in the source line. * \param fin The input file handle to use. This must not be \c NULL. * * \note On success, this function advances the file stream * to the end of the current line or to EOF. * * The function returns \c 0 on an empty line. * * Leading whitespaces are ignored, as is a * '0x' prefix for radix \c 16. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the file read buffer * is too small. * \return Another negative error code on failure. */ int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ); /** * \brief Export an MPI into an opened file. * * \param p A string prefix to emit prior to the MPI data. * For example, this might be a label, or "0x" when * printing in base \c 16. This may be \c NULL if no prefix * is needed. * \param X The source MPI. This must point to an initialized MPI. * \param radix The numeric base to be used in the emitted string. * \param fout The output file handle. This may be \c NULL, in which case * the output is written to \c stdout. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout ); #endif /* MBEDTLS_FS_IO */ /** * \brief Import an MPI from unsigned big endian binary data. * * \param X The destination MPI. This must point to an initialized MPI. * \param buf The input buffer. This must be a readable buffer of length * \p buflen Bytes. * \param buflen The length of the input buffer \p p in Bytes. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ); /** * \brief Export an MPI into unsigned big endian binary data * of fixed size. * * \param X The source MPI. This must point to an initialized MPI. * \param buf The output buffer. This must be a writable buffer of length * \p buflen Bytes. * \param buflen The size of the output buffer \p buf in Bytes. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if \p buf isn't * large enough to hold the value of \p X. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen ); /** * \brief Perform a left-shift on an MPI: X <<= count * * \param X The MPI to shift. This must point to an initialized MPI. * \param count The number of bits to shift by. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count ); /** * \brief Perform a right-shift on an MPI: X >>= count * * \param X The MPI to shift. This must point to an initialized MPI. * \param count The number of bits to shift by. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count ); /** * \brief Compare the absolute values of two MPIs. * * \param X The left-hand MPI. This must point to an initialized MPI. * \param Y The right-hand MPI. This must point to an initialized MPI. * * \return \c 1 if `|X|` is greater than `|Y|`. * \return \c -1 if `|X|` is lesser than `|Y|`. * \return \c 0 if `|X|` is equal to `|Y|`. */ int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y ); /** * \brief Compare two MPIs. * * \param X The left-hand MPI. This must point to an initialized MPI. * \param Y The right-hand MPI. This must point to an initialized MPI. * * \return \c 1 if \p X is greater than \p Y. * \return \c -1 if \p X is lesser than \p Y. * \return \c 0 if \p X is equal to \p Y. */ int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y ); /** * \brief Compare an MPI with an integer. * * \param X The left-hand MPI. This must point to an initialized MPI. * \param z The integer value to compare \p X to. * * \return \c 1 if \p X is greater than \p z. * \return \c -1 if \p X is lesser than \p z. * \return \c 0 if \p X is equal to \p z. */ int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ); /** * \brief Perform an unsigned addition of MPIs: X = |A| + |B| * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first summand. This must point to an initialized MPI. * \param B The second summand. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform an unsigned subtraction of MPIs: X = |A| - |B| * * \param X The destination MPI. This must point to an initialized MPI. * \param A The minuend. This must point to an initialized MPI. * \param B The subtrahend. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p B is greater than \p A. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a signed addition of MPIs: X = A + B * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first summand. This must point to an initialized MPI. * \param B The second summand. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a signed subtraction of MPIs: X = A - B * * \param X The destination MPI. This must point to an initialized MPI. * \param A The minuend. This must point to an initialized MPI. * \param B The subtrahend. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a signed addition of an MPI and an integer: X = A + b * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first summand. This must point to an initialized MPI. * \param b The second summand. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a signed subtraction of an MPI and an integer: * X = A - b * * \param X The destination MPI. This must point to an initialized MPI. * \param A The minuend. This must point to an initialized MPI. * \param b The subtrahend. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a multiplication of two MPIs: X = A * B * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first factor. This must point to an initialized MPI. * \param B The second factor. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a multiplication of an MPI with an unsigned integer: * X = A * b * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first factor. This must point to an initialized MPI. * \param b The second factor. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b ); /** * \brief Perform a division with remainder of two MPIs: * A = Q * B + R * * \param Q The destination MPI for the quotient. * This may be \c NULL if the value of the * quotient is not needed. * \param R The destination MPI for the remainder value. * This may be \c NULL if the value of the * remainder is not needed. * \param A The dividend. This must point to an initialized MPi. * \param B The divisor. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p B equals zero. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a division with remainder of an MPI by an integer: * A = Q * b + R * * \param Q The destination MPI for the quotient. * This may be \c NULL if the value of the * quotient is not needed. * \param R The destination MPI for the remainder value. * This may be \c NULL if the value of the * remainder is not needed. * \param A The dividend. This must point to an initialized MPi. * \param b The divisor. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p b equals zero. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a modular reduction. R = A mod B * * \param R The destination MPI for the residue value. * This must point to an initialized MPI. * \param A The MPI to compute the residue of. * This must point to an initialized MPI. * \param B The base of the modular reduction. * This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p B equals zero. * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p B is negative. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a modular reduction with respect to an integer. * r = A mod b * * \param r The address at which to store the residue. * This must not be \c NULL. * \param A The MPI to compute the residue of. * This must point to an initialized MPi. * \param b The integer base of the modular reduction. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p b equals zero. * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p b is negative. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a sliding-window exponentiation: X = A^E mod N * * \param X The destination MPI. This must point to an initialized MPI. * \param A The base of the exponentiation. * This must point to an initialized MPI. * \param E The exponent MPI. This must point to an initialized MPI. * \param N The base for the modular reduction. This must point to an * initialized MPI. * \param _RR A helper MPI depending solely on \p N which can be used to * speed-up multiple modular exponentiations for the same value * of \p N. This may be \c NULL. If it is not \c NULL, it must * point to an initialized MPI. If it hasn't been used after * the call to mbedtls_mpi_init(), this function will compute * the helper value and store it in \p _RR for reuse on * subsequent calls to this function. Otherwise, the function * will assume that \p _RR holds the helper value set by a * previous call to mbedtls_mpi_exp_mod(), and reuse it. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \c N is negative or * even, or if \c E is negative. * \return Another negative error code on different kinds of failures. * */ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR ); /** * \brief Fill an MPI with a number of random bytes. * * \param X The destination MPI. This must point to an initialized MPI. * \param size The number of random bytes to generate. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on failure. * * \note The bytes obtained from the RNG are interpreted * as a big-endian representation of an MPI; this can * be relevant in applications like deterministic ECDSA. */ int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Compute the greatest common divisor: G = gcd(A, B) * * \param G The destination MPI. This must point to an initialized MPI. * \param A The first operand. This must point to an initialized MPI. * \param B The second operand. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Compute the modular inverse: X = A^-1 mod N * * \param X The destination MPI. This must point to an initialized MPI. * \param A The MPI to calculate the modular inverse of. This must point * to an initialized MPI. * \param N The base of the modular inversion. This must point to an * initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \p N is less than * or equal to one. * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p has no modular inverse * with respect to \p N. */ int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Perform a Miller-Rabin primality test with error * probability of 2-80. * * \deprecated Superseded by mbedtls_mpi_is_prime_ext() which allows * specifying the number of Miller-Rabin rounds. * * \param X The MPI to check for primality. * This must point to an initialized MPI. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't use a * context parameter. * * \return \c 0 if successful, i.e. \p X is probably prime. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p X is not prime. * \return Another negative error code on other kinds of failure. */ MBEDTLS_DEPRECATED int mbedtls_mpi_is_prime( const mbedtls_mpi *X, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Miller-Rabin primality test. * * \warning If \p X is potentially generated by an adversary, for example * when validating cryptographic parameters that you didn't * generate yourself and that are supposed to be prime, then * \p rounds should be at least the half of the security * strength of the cryptographic algorithm. On the other hand, * if \p X is chosen uniformly or non-adversially (as is the * case when mbedtls_mpi_gen_prime calls this function), then * \p rounds can be much lower. * * \param X The MPI to check for primality. * This must point to an initialized MPI. * \param rounds The number of bases to perform the Miller-Rabin primality * test for. The probability of returning 0 on a composite is * at most 2-2*\p rounds. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't use * a context parameter. * * \return \c 0 if successful, i.e. \p X is probably prime. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p X is not prime. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_is_prime_ext( const mbedtls_mpi *X, int rounds, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Flags for mbedtls_mpi_gen_prime() * * Each of these flags is a constraint on the result X returned by * mbedtls_mpi_gen_prime(). */ typedef enum { MBEDTLS_MPI_GEN_PRIME_FLAG_DH = 0x0001, /**< (X-1)/2 is prime too */ MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR = 0x0002, /**< lower error rate from 2-80 to 2-128 */ } mbedtls_mpi_gen_prime_flag_t; /** * \brief Generate a prime number. * * \param X The destination MPI to store the generated prime in. * This must point to an initialized MPi. * \param nbits The required size of the destination MPI in bits. * This must be between \c 3 and #MBEDTLS_MPI_MAX_BITS. * \param flags A mask of flags of type #mbedtls_mpi_gen_prime_flag_t. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't use * a context parameter. * * \return \c 0 if successful, in which case \p X holds a * probably prime number. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if `nbits` is not between * \c 3 and #MBEDTLS_MPI_MAX_BITS. */ int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_mpi_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* bignum.h */ fldigi-4.1.06/src/include/mbedtls/config.h0000664000175000017500000032423313507401434015255 00000000000000/** * \file config.h * * \brief Configuration options (set of defines) * * This set of compile-time options may be used to enable * or disable features selectively, and reduce the global * memory footprint. */ /* * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CONFIG_H #define MBEDTLS_CONFIG_H #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) #define _CRT_SECURE_NO_DEPRECATE 1 #endif /** * \name SECTION: System support * * This section sets system specific settings. * \{ */ /** * \def MBEDTLS_HAVE_ASM * * The compiler has support for asm(). * * Requires support for asm() in compiler. * * Used in: * library/aria.c * library/timing.c * include/mbedtls/bn_mul.h * * Required by: * MBEDTLS_AESNI_C * MBEDTLS_PADLOCK_C * * Comment to disable the use of assembly code. */ #define MBEDTLS_HAVE_ASM /** * \def MBEDTLS_NO_UDBL_DIVISION * * The platform lacks support for double-width integer division (64-bit * division on a 32-bit platform, 128-bit division on a 64-bit platform). * * Used in: * include/mbedtls/bignum.h * library/bignum.c * * The bignum code uses double-width division to speed up some operations. * Double-width division is often implemented in software that needs to * be linked with the program. The presence of a double-width integer * type is usually detected automatically through preprocessor macros, * but the automatic detection cannot know whether the code needs to * and can be linked with an implementation of division for that type. * By default division is assumed to be usable if the type is present. * Uncomment this option to prevent the use of double-width division. * * Note that division for the native integer type is always required. * Furthermore, a 64-bit type is always required even on a 32-bit * platform, but it need not support multiplication or division. In some * cases it is also desirable to disable some double-width operations. For * example, if double-width division is implemented in software, disabling * it can reduce code size in some embedded targets. */ //#define MBEDTLS_NO_UDBL_DIVISION /** * \def MBEDTLS_NO_64BIT_MULTIPLICATION * * The platform lacks support for 32x32 -> 64-bit multiplication. * * Used in: * library/poly1305.c * * Some parts of the library may use multiplication of two unsigned 32-bit * operands with a 64-bit result in order to speed up computations. On some * platforms, this is not available in hardware and has to be implemented in * software, usually in a library provided by the toolchain. * * Sometimes it is not desirable to have to link to that library. This option * removes the dependency of that library on platforms that lack a hardware * 64-bit multiplier by embedding a software implementation in Mbed TLS. * * Note that depending on the compiler, this may decrease performance compared * to using the library function provided by the toolchain. */ //#define MBEDTLS_NO_64BIT_MULTIPLICATION /** * \def MBEDTLS_HAVE_SSE2 * * CPU supports SSE2 instruction set. * * Uncomment if the CPU supports SSE2 (IA-32 specific). */ //#define MBEDTLS_HAVE_SSE2 /** * \def MBEDTLS_HAVE_TIME * * System has time.h and time(). * The time does not need to be correct, only time differences are used, * by contrast with MBEDTLS_HAVE_TIME_DATE * * Defining MBEDTLS_HAVE_TIME allows you to specify MBEDTLS_PLATFORM_TIME_ALT, * MBEDTLS_PLATFORM_TIME_MACRO, MBEDTLS_PLATFORM_TIME_TYPE_MACRO and * MBEDTLS_PLATFORM_STD_TIME. * * Comment if your system does not support time functions */ #define MBEDTLS_HAVE_TIME /** * \def MBEDTLS_HAVE_TIME_DATE * * System has time.h, time(), and an implementation for * mbedtls_platform_gmtime_r() (see below). * The time needs to be correct (not necesarily very accurate, but at least * the date should be correct). This is used to verify the validity period of * X.509 certificates. * * Comment if your system does not have a correct clock. * * \note mbedtls_platform_gmtime_r() is an abstraction in platform_util.h that * behaves similarly to the gmtime_r() function from the C standard. Refer to * the documentation for mbedtls_platform_gmtime_r() for more information. * * \note It is possible to configure an implementation for * mbedtls_platform_gmtime_r() at compile-time by using the macro * MBEDTLS_PLATFORM_GMTIME_R_ALT. */ #define MBEDTLS_HAVE_TIME_DATE /** * \def MBEDTLS_PLATFORM_MEMORY * * Enable the memory allocation layer. * * By default mbed TLS uses the system-provided calloc() and free(). * This allows different allocators (self-implemented or provided) to be * provided to the platform abstraction layer. * * Enabling MBEDTLS_PLATFORM_MEMORY without the * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and * free() function pointer at runtime. * * Enabling MBEDTLS_PLATFORM_MEMORY and specifying * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the * alternate function at compile time. * * Requires: MBEDTLS_PLATFORM_C * * Enable this layer to allow use of alternative memory allocators. */ //#define MBEDTLS_PLATFORM_MEMORY /** * \def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS * * Do not assign standard functions in the platform layer (e.g. calloc() to * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF) * * This makes sure there are no linking errors on platforms that do not support * these functions. You will HAVE to provide alternatives, either at runtime * via the platform_set_xxx() functions or at compile time by setting * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a * MBEDTLS_PLATFORM_XXX_MACRO. * * Requires: MBEDTLS_PLATFORM_C * * Uncomment to prevent default assignment of standard functions in the * platform layer. */ //#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS /** * \def MBEDTLS_PLATFORM_EXIT_ALT * * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let mbed TLS support the * function in the platform abstraction layer. * * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will * provide a function "mbedtls_platform_set_printf()" that allows you to set an * alternative printf function pointer. * * All these define require MBEDTLS_PLATFORM_C to be defined! * * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows; * it will be enabled automatically by check_config.h * * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as * MBEDTLS_PLATFORM_XXX_MACRO! * * Requires: MBEDTLS_PLATFORM_TIME_ALT requires MBEDTLS_HAVE_TIME * * Uncomment a macro to enable alternate implementation of specific base * platform function */ //#define MBEDTLS_PLATFORM_EXIT_ALT //#define MBEDTLS_PLATFORM_TIME_ALT //#define MBEDTLS_PLATFORM_FPRINTF_ALT //#define MBEDTLS_PLATFORM_PRINTF_ALT //#define MBEDTLS_PLATFORM_SNPRINTF_ALT //#define MBEDTLS_PLATFORM_NV_SEED_ALT //#define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT /** * \def MBEDTLS_DEPRECATED_WARNING * * Mark deprecated functions so that they generate a warning if used. * Functions deprecated in one version will usually be removed in the next * version. You can enable this to help you prepare the transition to a new * major version by making sure your code is not using these functions. * * This only works with GCC and Clang. With other compilers, you may want to * use MBEDTLS_DEPRECATED_REMOVED * * Uncomment to get warnings on using deprecated functions. */ //#define MBEDTLS_DEPRECATED_WARNING /** * \def MBEDTLS_DEPRECATED_REMOVED * * Remove deprecated functions so that they generate an error if used. * Functions deprecated in one version will usually be removed in the next * version. You can enable this to help you prepare the transition to a new * major version by making sure your code is not using these functions. * * Uncomment to get errors on using deprecated functions. */ //#define MBEDTLS_DEPRECATED_REMOVED /** * \def MBEDTLS_CHECK_PARAMS * * This configuration option controls whether the library validates more of * the parameters passed to it. * * When this flag is not defined, the library only attempts to validate an * input parameter if: (1) they may come from the outside world (such as the * network, the filesystem, etc.) or (2) not validating them could result in * internal memory errors such as overflowing a buffer controlled by the * library. On the other hand, it doesn't attempt to validate parameters whose * values are fully controlled by the application (such as pointers). * * When this flag is defined, the library additionally attempts to validate * parameters that are fully controlled by the application, and should always * be valid if the application code is fully correct and trusted. * * For example, when a function accepts as input a pointer to a buffer that may * contain untrusted data, and its documentation mentions that this pointer * must not be NULL: * - the pointer is checked to be non-NULL only if this option is enabled * - the content of the buffer is always validated * * When this flag is defined, if a library function receives a parameter that * is invalid, it will: * - invoke the macro MBEDTLS_PARAM_FAILED() which by default expands to a * call to the function mbedtls_param_failed() * - immediately return (with a specific error code unless the function * returns void and can't communicate an error). * * When defining this flag, you also need to: * - either provide a definition of the function mbedtls_param_failed() in * your application (see platform_util.h for its prototype) as the library * calls that function, but does not provide a default definition for it, * - or provide a different definition of the macro MBEDTLS_PARAM_FAILED() * below if the above mechanism is not flexible enough to suit your needs. * See the documentation of this macro later in this file. * * Uncomment to enable validation of application-controlled parameters. */ //#define MBEDTLS_CHECK_PARAMS /* \} name SECTION: System support */ /** * \name SECTION: mbed TLS feature support * * This section sets support for features that are or are not needed * within the modules that are enabled. * \{ */ /** * \def MBEDTLS_TIMING_ALT * * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(), * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay() * * Only works if you have MBEDTLS_TIMING_C enabled. * * You will need to provide a header "timing_alt.h" and an implementation at * compile time. */ //#define MBEDTLS_TIMING_ALT /** * \def MBEDTLS_AES_ALT * * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let mbed TLS use your * alternate core implementation of a symmetric crypto, an arithmetic or hash * module (e.g. platform specific assembly optimized implementations). Keep * in mind that the function prototypes should remain the same. * * This replaces the whole module. If you only want to replace one of the * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags. * * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer * provide the "struct mbedtls_aes_context" definition and omit the base * function declarations and implementations. "aes_alt.h" will be included from * "aes.h" to include the new function definitions. * * Uncomment a macro to enable alternate implementation of the corresponding * module. * * \warning MD2, MD4, MD5, ARC4, DES and SHA-1 are considered weak and their * use constitutes a security risk. If possible, we recommend * avoiding dependencies on them, and considering stronger message * digests and ciphers instead. * */ //#define MBEDTLS_AES_ALT //#define MBEDTLS_ARC4_ALT //#define MBEDTLS_ARIA_ALT //#define MBEDTLS_BLOWFISH_ALT //#define MBEDTLS_CAMELLIA_ALT //#define MBEDTLS_CCM_ALT //#define MBEDTLS_CHACHA20_ALT //#define MBEDTLS_CHACHAPOLY_ALT //#define MBEDTLS_CMAC_ALT //#define MBEDTLS_DES_ALT //#define MBEDTLS_DHM_ALT //#define MBEDTLS_ECJPAKE_ALT //#define MBEDTLS_GCM_ALT //#define MBEDTLS_NIST_KW_ALT //#define MBEDTLS_MD2_ALT //#define MBEDTLS_MD4_ALT //#define MBEDTLS_MD5_ALT //#define MBEDTLS_POLY1305_ALT //#define MBEDTLS_RIPEMD160_ALT //#define MBEDTLS_RSA_ALT //#define MBEDTLS_SHA1_ALT //#define MBEDTLS_SHA256_ALT //#define MBEDTLS_SHA512_ALT //#define MBEDTLS_XTEA_ALT /* * When replacing the elliptic curve module, pleace consider, that it is * implemented with two .c files: * - ecp.c * - ecp_curves.c * You can replace them very much like all the other MBEDTLS__MODULE_NAME__ALT * macros as described above. The only difference is that you have to make sure * that you provide functionality for both .c files. */ //#define MBEDTLS_ECP_ALT /** * \def MBEDTLS_MD2_PROCESS_ALT * * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use you * alternate core implementation of symmetric crypto or hash function. Keep in * mind that function prototypes should remain the same. * * This replaces only one function. The header file from mbed TLS is still * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags. * * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will * no longer provide the mbedtls_sha1_process() function, but it will still provide * the other function (using your mbedtls_sha1_process() function) and the definition * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible * with this definition. * * \note Because of a signature change, the core AES encryption and decryption routines are * currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt, * respectively. When setting up alternative implementations, these functions should * be overriden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt * must stay untouched. * * \note If you use the AES_xxx_ALT macros, then is is recommended to also set * MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES * tables. * * Uncomment a macro to enable alternate implementation of the corresponding * function. * * \warning MD2, MD4, MD5, DES and SHA-1 are considered weak and their use * constitutes a security risk. If possible, we recommend avoiding * dependencies on them, and considering stronger message digests * and ciphers instead. * */ //#define MBEDTLS_MD2_PROCESS_ALT //#define MBEDTLS_MD4_PROCESS_ALT //#define MBEDTLS_MD5_PROCESS_ALT //#define MBEDTLS_RIPEMD160_PROCESS_ALT //#define MBEDTLS_SHA1_PROCESS_ALT //#define MBEDTLS_SHA256_PROCESS_ALT //#define MBEDTLS_SHA512_PROCESS_ALT //#define MBEDTLS_DES_SETKEY_ALT //#define MBEDTLS_DES_CRYPT_ECB_ALT //#define MBEDTLS_DES3_CRYPT_ECB_ALT //#define MBEDTLS_AES_SETKEY_ENC_ALT //#define MBEDTLS_AES_SETKEY_DEC_ALT //#define MBEDTLS_AES_ENCRYPT_ALT //#define MBEDTLS_AES_DECRYPT_ALT //#define MBEDTLS_ECDH_GEN_PUBLIC_ALT //#define MBEDTLS_ECDH_COMPUTE_SHARED_ALT //#define MBEDTLS_ECDSA_VERIFY_ALT //#define MBEDTLS_ECDSA_SIGN_ALT //#define MBEDTLS_ECDSA_GENKEY_ALT /** * \def MBEDTLS_ECP_INTERNAL_ALT * * Expose a part of the internal interface of the Elliptic Curve Point module. * * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use your * alternative core implementation of elliptic curve arithmetic. Keep in mind * that function prototypes should remain the same. * * This partially replaces one function. The header file from mbed TLS is still * used, in contrast to the MBEDTLS_ECP_ALT flag. The original implementation * is still present and it is used for group structures not supported by the * alternative. * * Any of these options become available by defining MBEDTLS_ECP_INTERNAL_ALT * and implementing the following functions: * unsigned char mbedtls_internal_ecp_grp_capable( * const mbedtls_ecp_group *grp ) * int mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp ) * void mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp ) * The mbedtls_internal_ecp_grp_capable function should return 1 if the * replacement functions implement arithmetic for the given group and 0 * otherwise. * The functions mbedtls_internal_ecp_init and mbedtls_internal_ecp_free are * called before and after each point operation and provide an opportunity to * implement optimized set up and tear down instructions. * * Example: In case you uncomment MBEDTLS_ECP_INTERNAL_ALT and * MBEDTLS_ECP_DOUBLE_JAC_ALT, mbed TLS will still provide the ecp_double_jac * function, but will use your mbedtls_internal_ecp_double_jac if the group is * supported (your mbedtls_internal_ecp_grp_capable function returns 1 when * receives it as an argument). If the group is not supported then the original * implementation is used. The other functions and the definition of * mbedtls_ecp_group and mbedtls_ecp_point will not change, so your * implementation of mbedtls_internal_ecp_double_jac and * mbedtls_internal_ecp_grp_capable must be compatible with this definition. * * Uncomment a macro to enable alternate implementation of the corresponding * function. */ /* Required for all the functions in this section */ //#define MBEDTLS_ECP_INTERNAL_ALT /* Support for Weierstrass curves with Jacobi representation */ //#define MBEDTLS_ECP_RANDOMIZE_JAC_ALT //#define MBEDTLS_ECP_ADD_MIXED_ALT //#define MBEDTLS_ECP_DOUBLE_JAC_ALT //#define MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT //#define MBEDTLS_ECP_NORMALIZE_JAC_ALT /* Support for curves with Montgomery arithmetic */ //#define MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT //#define MBEDTLS_ECP_RANDOMIZE_MXZ_ALT //#define MBEDTLS_ECP_NORMALIZE_MXZ_ALT /** * \def MBEDTLS_TEST_NULL_ENTROPY * * Enables testing and use of mbed TLS without any configured entropy sources. * This permits use of the library on platforms before an entropy source has * been integrated (see for example the MBEDTLS_ENTROPY_HARDWARE_ALT or the * MBEDTLS_ENTROPY_NV_SEED switches). * * WARNING! This switch MUST be disabled in production builds, and is suitable * only for development. * Enabling the switch negates any security provided by the library. * * Requires MBEDTLS_ENTROPY_C, MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES * */ //#define MBEDTLS_TEST_NULL_ENTROPY /** * \def MBEDTLS_ENTROPY_HARDWARE_ALT * * Uncomment this macro to let mbed TLS use your own implementation of a * hardware entropy collector. * * Your function must be called \c mbedtls_hardware_poll(), have the same * prototype as declared in entropy_poll.h, and accept NULL as first argument. * * Uncomment to use your own hardware entropy collector. */ //#define MBEDTLS_ENTROPY_HARDWARE_ALT /** * \def MBEDTLS_AES_ROM_TABLES * * Use precomputed AES tables stored in ROM. * * Uncomment this macro to use precomputed AES tables stored in ROM. * Comment this macro to generate AES tables in RAM at runtime. * * Tradeoff: Using precomputed ROM tables reduces RAM usage by ~8kb * (or ~2kb if \c MBEDTLS_AES_FEWER_TABLES is used) and reduces the * initialization time before the first AES operation can be performed. * It comes at the cost of additional ~8kb ROM use (resp. ~2kb if \c * MBEDTLS_AES_FEWER_TABLES below is used), and potentially degraded * performance if ROM access is slower than RAM access. * * This option is independent of \c MBEDTLS_AES_FEWER_TABLES. * */ //#define MBEDTLS_AES_ROM_TABLES /** * \def MBEDTLS_AES_FEWER_TABLES * * Use less ROM/RAM for AES tables. * * Uncommenting this macro omits 75% of the AES tables from * ROM / RAM (depending on the value of \c MBEDTLS_AES_ROM_TABLES) * by computing their values on the fly during operations * (the tables are entry-wise rotations of one another). * * Tradeoff: Uncommenting this reduces the RAM / ROM footprint * by ~6kb but at the cost of more arithmetic operations during * runtime. Specifically, one has to compare 4 accesses within * different tables to 4 accesses with additional arithmetic * operations within the same table. The performance gain/loss * depends on the system and memory details. * * This option is independent of \c MBEDTLS_AES_ROM_TABLES. * */ //#define MBEDTLS_AES_FEWER_TABLES /** * \def MBEDTLS_CAMELLIA_SMALL_MEMORY * * Use less ROM for the Camellia implementation (saves about 768 bytes). * * Uncomment this macro to use less memory for Camellia. */ //#define MBEDTLS_CAMELLIA_SMALL_MEMORY /** * \def MBEDTLS_CIPHER_MODE_CBC * * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_CBC /** * \def MBEDTLS_CIPHER_MODE_CFB * * Enable Cipher Feedback mode (CFB) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_CFB /** * \def MBEDTLS_CIPHER_MODE_CTR * * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_CTR /** * \def MBEDTLS_CIPHER_MODE_OFB * * Enable Output Feedback mode (OFB) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_OFB /** * \def MBEDTLS_CIPHER_MODE_XTS * * Enable Xor-encrypt-xor with ciphertext stealing mode (XTS) for AES. */ #define MBEDTLS_CIPHER_MODE_XTS /** * \def MBEDTLS_CIPHER_NULL_CIPHER * * Enable NULL cipher. * Warning: Only do so when you know what you are doing. This allows for * encryption or channels without any security! * * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable * the following ciphersuites: * MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA * MBEDTLS_TLS_RSA_WITH_NULL_SHA256 * MBEDTLS_TLS_RSA_WITH_NULL_SHA * MBEDTLS_TLS_RSA_WITH_NULL_MD5 * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA * MBEDTLS_TLS_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_PSK_WITH_NULL_SHA * * Uncomment this macro to enable the NULL cipher and ciphersuites */ //#define MBEDTLS_CIPHER_NULL_CIPHER /** * \def MBEDTLS_CIPHER_PADDING_PKCS7 * * MBEDTLS_CIPHER_PADDING_XXX: Uncomment or comment macros to add support for * specific padding modes in the cipher layer with cipher modes that support * padding (e.g. CBC) * * If you disable all padding modes, only full blocks can be used with CBC. * * Enable padding modes in the cipher layer. */ #define MBEDTLS_CIPHER_PADDING_PKCS7 #define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS #define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN #define MBEDTLS_CIPHER_PADDING_ZEROS /** * \def MBEDTLS_ENABLE_WEAK_CIPHERSUITES * * Enable weak ciphersuites in SSL / TLS. * Warning: Only do so when you know what you are doing. This allows for * channels with virtually no security at all! * * This enables the following ciphersuites: * MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA * * Uncomment this macro to enable weak ciphersuites * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. */ //#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES /** * \def MBEDTLS_REMOVE_ARC4_CIPHERSUITES * * Remove RC4 ciphersuites by default in SSL / TLS. * This flag removes the ciphersuites based on RC4 from the default list as * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them * explicitly. * * Uncomment this macro to remove RC4 ciphersuites by default. */ #define MBEDTLS_REMOVE_ARC4_CIPHERSUITES /** * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED * * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve * module. By default all supported curves are enabled. * * Comment macros to disable the curve and functions for it */ #define MBEDTLS_ECP_DP_SECP192R1_ENABLED #define MBEDTLS_ECP_DP_SECP224R1_ENABLED #define MBEDTLS_ECP_DP_SECP256R1_ENABLED #define MBEDTLS_ECP_DP_SECP384R1_ENABLED #define MBEDTLS_ECP_DP_SECP521R1_ENABLED #define MBEDTLS_ECP_DP_SECP192K1_ENABLED #define MBEDTLS_ECP_DP_SECP224K1_ENABLED #define MBEDTLS_ECP_DP_SECP256K1_ENABLED #define MBEDTLS_ECP_DP_BP256R1_ENABLED #define MBEDTLS_ECP_DP_BP384R1_ENABLED #define MBEDTLS_ECP_DP_BP512R1_ENABLED #define MBEDTLS_ECP_DP_CURVE25519_ENABLED #define MBEDTLS_ECP_DP_CURVE448_ENABLED /** * \def MBEDTLS_ECP_NIST_OPTIM * * Enable specific 'modulo p' routines for each NIST prime. * Depending on the prime and architecture, makes operations 4 to 8 times * faster on the corresponding curve. * * Comment this macro to disable NIST curves optimisation. */ #define MBEDTLS_ECP_NIST_OPTIM /** * \def MBEDTLS_ECP_RESTARTABLE * * Enable "non-blocking" ECC operations that can return early and be resumed. * * This allows various functions to pause by returning * #MBEDTLS_ERR_ECP_IN_PROGRESS (or, for functions in the SSL module, * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) and then be called later again in * order to further progress and eventually complete their operation. This is * controlled through mbedtls_ecp_set_max_ops() which limits the maximum * number of ECC operations a function may perform before pausing; see * mbedtls_ecp_set_max_ops() for more information. * * This is useful in non-threaded environments if you want to avoid blocking * for too long on ECC (and, hence, X.509 or SSL/TLS) operations. * * Uncomment this macro to enable restartable ECC computations. * * \note This option only works with the default software implementation of * elliptic curve functionality. It is incompatible with * MBEDTLS_ECP_ALT, MBEDTLS_ECDH_XXX_ALT and MBEDTLS_ECDSA_XXX_ALT. */ //#define MBEDTLS_ECP_RESTARTABLE /** * \def MBEDTLS_ECDSA_DETERMINISTIC * * Enable deterministic ECDSA (RFC 6979). * Standard ECDSA is "fragile" in the sense that lack of entropy when signing * may result in a compromise of the long-term signing key. This is avoided by * the deterministic variant. * * Requires: MBEDTLS_HMAC_DRBG_C * * Comment this macro to disable deterministic ECDSA. */ #define MBEDTLS_ECDSA_DETERMINISTIC /** * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED * * Enable the PSK based ciphersuite modes in SSL / TLS. * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED * * Enable the DHE-PSK based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_DHM_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA * * \warning Using DHE constitutes a security risk as it * is not possible to validate custom DH parameters. * If possible, it is recommended users should consider * preferring other methods of key exchange. * See dhm.h for more details. * */ #define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED * * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED * * Enable the RSA-PSK based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED * * Enable the RSA-only based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 */ #define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED * * Enable the DHE-RSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA * * \warning Using DHE constitutes a security risk as it * is not possible to validate custom DH parameters. * If possible, it is recommended users should consider * preferring other methods of key exchange. * See dhm.h for more details. * */ #define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED * * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED * * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C, * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED * * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 */ #define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED * * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 */ #define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED * * Enable the ECJPAKE based ciphersuite modes in SSL / TLS. * * \warning This is currently experimental. EC J-PAKE support is based on the * Thread v1.0.0 specification; incompatible changes to the specification * might still happen. For this reason, this is disabled by default. * * Requires: MBEDTLS_ECJPAKE_C * MBEDTLS_SHA256_C * MBEDTLS_ECP_DP_SECP256R1_ENABLED * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 */ //#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED /** * \def MBEDTLS_PK_PARSE_EC_EXTENDED * * Enhance support for reading EC keys using variants of SEC1 not allowed by * RFC 5915 and RFC 5480. * * Currently this means parsing the SpecifiedECDomain choice of EC * parameters (only known groups are supported, not arbitrary domains, to * avoid validation issues). * * Disable if you only need to support RFC 5915 + 5480 key formats. */ #define MBEDTLS_PK_PARSE_EC_EXTENDED /** * \def MBEDTLS_ERROR_STRERROR_DUMMY * * Enable a dummy error function to make use of mbedtls_strerror() in * third party libraries easier when MBEDTLS_ERROR_C is disabled * (no effect when MBEDTLS_ERROR_C is enabled). * * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're * not using mbedtls_strerror() or error_strerror() in your application. * * Disable if you run into name conflicts and want to really remove the * mbedtls_strerror() */ #define MBEDTLS_ERROR_STRERROR_DUMMY /** * \def MBEDTLS_GENPRIME * * Enable the prime-number generation code. * * Requires: MBEDTLS_BIGNUM_C */ #define MBEDTLS_GENPRIME /** * \def MBEDTLS_FS_IO * * Enable functions that use the filesystem. */ #define MBEDTLS_FS_IO /** * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES * * Do not add default entropy sources. These are the platform specific, * mbedtls_timing_hardclock and HAVEGE based poll functions. * * This is useful to have more control over the added entropy sources in an * application. * * Uncomment this macro to prevent loading of default entropy functions. */ //#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES /** * \def MBEDTLS_NO_PLATFORM_ENTROPY * * Do not use built-in platform entropy functions. * This is useful if your platform does not support * standards like the /dev/urandom or Windows CryptoAPI. * * Uncomment this macro to disable the built-in platform entropy functions. */ //#define MBEDTLS_NO_PLATFORM_ENTROPY /** * \def MBEDTLS_ENTROPY_FORCE_SHA256 * * Force the entropy accumulator to use a SHA-256 accumulator instead of the * default SHA-512 based one (if both are available). * * Requires: MBEDTLS_SHA256_C * * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option * if you have performance concerns. * * This option is only useful if both MBEDTLS_SHA256_C and * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used. */ //#define MBEDTLS_ENTROPY_FORCE_SHA256 /** * \def MBEDTLS_ENTROPY_NV_SEED * * Enable the non-volatile (NV) seed file-based entropy source. * (Also enables the NV seed read/write functions in the platform layer) * * This is crucial (if not required) on systems that do not have a * cryptographic entropy source (in hardware or kernel) available. * * Requires: MBEDTLS_ENTROPY_C, MBEDTLS_PLATFORM_C * * \note The read/write functions that are used by the entropy source are * determined in the platform layer, and can be modified at runtime and/or * compile-time depending on the flags (MBEDTLS_PLATFORM_NV_SEED_*) used. * * \note If you use the default implementation functions that read a seedfile * with regular fopen(), please make sure you make a seedfile with the * proper name (defined in MBEDTLS_PLATFORM_STD_NV_SEED_FILE) and at * least MBEDTLS_ENTROPY_BLOCK_SIZE bytes in size that can be read from * and written to or you will get an entropy source error! The default * implementation will only use the first MBEDTLS_ENTROPY_BLOCK_SIZE * bytes from the file. * * \note The entropy collector will write to the seed file before entropy is * given to an external source, to update it. */ //#define MBEDTLS_ENTROPY_NV_SEED /** * \def MBEDTLS_MEMORY_DEBUG * * Enable debugging of buffer allocator memory issues. Automatically prints * (to stderr) all (fatal) messages on memory allocation issues. Enables * function for 'debug output' of allocated memory. * * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C * * Uncomment this macro to let the buffer allocator print out error messages. */ //#define MBEDTLS_MEMORY_DEBUG /** * \def MBEDTLS_MEMORY_BACKTRACE * * Include backtrace information with each allocated block. * * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C * GLIBC-compatible backtrace() an backtrace_symbols() support * * Uncomment this macro to include backtrace information */ //#define MBEDTLS_MEMORY_BACKTRACE /** * \def MBEDTLS_PK_RSA_ALT_SUPPORT * * Support external private RSA keys (eg from a HSM) in the PK layer. * * Comment this macro to disable support for external private RSA keys. */ #define MBEDTLS_PK_RSA_ALT_SUPPORT /** * \def MBEDTLS_PKCS1_V15 * * Enable support for PKCS#1 v1.5 encoding. * * Requires: MBEDTLS_RSA_C * * This enables support for PKCS#1 v1.5 operations. */ #define MBEDTLS_PKCS1_V15 /** * \def MBEDTLS_PKCS1_V21 * * Enable support for PKCS#1 v2.1 encoding. * * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C * * This enables support for RSAES-OAEP and RSASSA-PSS operations. */ #define MBEDTLS_PKCS1_V21 /** * \def MBEDTLS_RSA_NO_CRT * * Do not use the Chinese Remainder Theorem * for the RSA private operation. * * Uncomment this macro to disable the use of CRT in RSA. * */ //#define MBEDTLS_RSA_NO_CRT /** * \def MBEDTLS_SELF_TEST * * Enable the checkup functions (*_self_test). */ #define MBEDTLS_SELF_TEST /** * \def MBEDTLS_SHA256_SMALLER * * Enable an implementation of SHA-256 that has lower ROM footprint but also * lower performance. * * The default implementation is meant to be a reasonnable compromise between * performance and size. This version optimizes more aggressively for size at * the expense of performance. Eg on Cortex-M4 it reduces the size of * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about * 30%. * * Uncomment to enable the smaller implementation of SHA256. */ //#define MBEDTLS_SHA256_SMALLER /** * \def MBEDTLS_SSL_ALL_ALERT_MESSAGES * * Enable sending of alert messages in case of encountered errors as per RFC. * If you choose not to send the alert messages, mbed TLS can still communicate * with other servers, only debugging of failures is harder. * * The advantage of not sending alert messages, is that no information is given * about reasons for failures thus preventing adversaries of gaining intel. * * Enable sending of all alert messages */ #define MBEDTLS_SSL_ALL_ALERT_MESSAGES /** * \def MBEDTLS_SSL_ASYNC_PRIVATE * * Enable asynchronous external private key operations in SSL. This allows * you to configure an SSL connection to call an external cryptographic * module to perform private key operations instead of performing the * operation inside the library. * */ //#define MBEDTLS_SSL_ASYNC_PRIVATE /** * \def MBEDTLS_SSL_DEBUG_ALL * * Enable the debug messages in SSL module for all issues. * Debug messages have been disabled in some places to prevent timing * attacks due to (unbalanced) debugging function calls. * * If you need all error reporting you should enable this during debugging, * but remove this for production servers that should log as well. * * Uncomment this macro to report all debug messages on errors introducing * a timing side-channel. * */ //#define MBEDTLS_SSL_DEBUG_ALL /** \def MBEDTLS_SSL_ENCRYPT_THEN_MAC * * Enable support for Encrypt-then-MAC, RFC 7366. * * This allows peers that both support it to use a more robust protection for * ciphersuites using CBC, providing deep resistance against timing attacks * on the padding or underlying cipher. * * This only affects CBC ciphersuites, and is useless if none is defined. * * Requires: MBEDTLS_SSL_PROTO_TLS1 or * MBEDTLS_SSL_PROTO_TLS1_1 or * MBEDTLS_SSL_PROTO_TLS1_2 * * Comment this macro to disable support for Encrypt-then-MAC */ #define MBEDTLS_SSL_ENCRYPT_THEN_MAC /** \def MBEDTLS_SSL_EXTENDED_MASTER_SECRET * * Enable support for Extended Master Secret, aka Session Hash * (draft-ietf-tls-session-hash-02). * * This was introduced as "the proper fix" to the Triple Handshake familiy of * attacks, but it is recommended to always use it (even if you disable * renegotiation), since it actually fixes a more fundamental issue in the * original SSL/TLS design, and has implications beyond Triple Handshake. * * Requires: MBEDTLS_SSL_PROTO_TLS1 or * MBEDTLS_SSL_PROTO_TLS1_1 or * MBEDTLS_SSL_PROTO_TLS1_2 * * Comment this macro to disable support for Extended Master Secret. */ #define MBEDTLS_SSL_EXTENDED_MASTER_SECRET /** * \def MBEDTLS_SSL_FALLBACK_SCSV * * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00). * * For servers, it is recommended to always enable this, unless you support * only one version of TLS, or know for sure that none of your clients * implements a fallback strategy. * * For clients, you only need this if you're using a fallback strategy, which * is not recommended in the first place, unless you absolutely need it to * interoperate with buggy (version-intolerant) servers. * * Comment this macro to disable support for FALLBACK_SCSV */ #define MBEDTLS_SSL_FALLBACK_SCSV /** * \def MBEDTLS_SSL_HW_RECORD_ACCEL * * Enable hooking functions in SSL module for hardware acceleration of * individual records. * * Uncomment this macro to enable hooking functions. */ //#define MBEDTLS_SSL_HW_RECORD_ACCEL /** * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING * * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0. * * This is a countermeasure to the BEAST attack, which also minimizes the risk * of interoperability issues compared to sending 0-length records. * * Comment this macro to disable 1/n-1 record splitting. */ #define MBEDTLS_SSL_CBC_RECORD_SPLITTING /** * \def MBEDTLS_SSL_RENEGOTIATION * * Enable support for TLS renegotiation. * * The two main uses of renegotiation are (1) refresh keys on long-lived * connections and (2) client authentication after the initial handshake. * If you don't need renegotiation, it's probably better to disable it, since * it has been associated with security issues in the past and is easy to * misuse/misunderstand. * * Comment this to disable support for renegotiation. * * \note Even if this option is disabled, both client and server are aware * of the Renegotiation Indication Extension (RFC 5746) used to * prevent the SSL renegotiation attack (see RFC 5746 Sect. 1). * (See \c mbedtls_ssl_conf_legacy_renegotiation for the * configuration of this extension). * */ #define MBEDTLS_SSL_RENEGOTIATION /** * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO * * Enable support for receiving and parsing SSLv2 Client Hello messages for the * SSL Server module (MBEDTLS_SSL_SRV_C). * * Uncomment this macro to enable support for SSLv2 Client Hello messages. */ //#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO /** * \def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE * * Pick the ciphersuite according to the client's preferences rather than ours * in the SSL Server module (MBEDTLS_SSL_SRV_C). * * Uncomment this macro to respect client's ciphersuite order */ //#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE /** * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH * * Enable support for RFC 6066 max_fragment_length extension in SSL. * * Comment this macro to disable support for the max_fragment_length extension */ #define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH /** * \def MBEDTLS_SSL_PROTO_SSL3 * * Enable support for SSL 3.0. * * Requires: MBEDTLS_MD5_C * MBEDTLS_SHA1_C * * Comment this macro to disable support for SSL 3.0 */ //#define MBEDTLS_SSL_PROTO_SSL3 /** * \def MBEDTLS_SSL_PROTO_TLS1 * * Enable support for TLS 1.0. * * Requires: MBEDTLS_MD5_C * MBEDTLS_SHA1_C * * Comment this macro to disable support for TLS 1.0 */ #define MBEDTLS_SSL_PROTO_TLS1 /** * \def MBEDTLS_SSL_PROTO_TLS1_1 * * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled). * * Requires: MBEDTLS_MD5_C * MBEDTLS_SHA1_C * * Comment this macro to disable support for TLS 1.1 / DTLS 1.0 */ #define MBEDTLS_SSL_PROTO_TLS1_1 /** * \def MBEDTLS_SSL_PROTO_TLS1_2 * * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled). * * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C * (Depends on ciphersuites) * * Comment this macro to disable support for TLS 1.2 / DTLS 1.2 */ #define MBEDTLS_SSL_PROTO_TLS1_2 /** * \def MBEDTLS_SSL_PROTO_DTLS * * Enable support for DTLS (all available versions). * * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0, * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2. * * Requires: MBEDTLS_SSL_PROTO_TLS1_1 * or MBEDTLS_SSL_PROTO_TLS1_2 * * Comment this macro to disable support for DTLS */ #define MBEDTLS_SSL_PROTO_DTLS /** * \def MBEDTLS_SSL_ALPN * * Enable support for RFC 7301 Application Layer Protocol Negotiation. * * Comment this macro to disable support for ALPN. */ #define MBEDTLS_SSL_ALPN /** * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY * * Enable support for the anti-replay mechanism in DTLS. * * Requires: MBEDTLS_SSL_TLS_C * MBEDTLS_SSL_PROTO_DTLS * * \warning Disabling this is often a security risk! * See mbedtls_ssl_conf_dtls_anti_replay() for details. * * Comment this to disable anti-replay in DTLS. */ #define MBEDTLS_SSL_DTLS_ANTI_REPLAY /** * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY * * Enable support for HelloVerifyRequest on DTLS servers. * * This feature is highly recommended to prevent DTLS servers being used as * amplifiers in DoS attacks against other hosts. It should always be enabled * unless you know for sure amplification cannot be a problem in the * environment in which your server operates. * * \warning Disabling this can ba a security risk! (see above) * * Requires: MBEDTLS_SSL_PROTO_DTLS * * Comment this to disable support for HelloVerifyRequest. */ #define MBEDTLS_SSL_DTLS_HELLO_VERIFY /** * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE * * Enable server-side support for clients that reconnect from the same port. * * Some clients unexpectedly close the connection and try to reconnect using the * same source port. This needs special support from the server to handle the * new connection securely, as described in section 4.2.8 of RFC 6347. This * flag enables that support. * * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY * * Comment this to disable support for clients reusing the source port. */ #define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE /** * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT * * Enable support for a limit of records with bad MAC. * * See mbedtls_ssl_conf_dtls_badmac_limit(). * * Requires: MBEDTLS_SSL_PROTO_DTLS */ #define MBEDTLS_SSL_DTLS_BADMAC_LIMIT /** * \def MBEDTLS_SSL_SESSION_TICKETS * * Enable support for RFC 5077 session tickets in SSL. * Client-side, provides full support for session tickets (maintainance of a * session store remains the responsibility of the application, though). * Server-side, you also need to provide callbacks for writing and parsing * tickets, including authenticated encryption and key management. Example * callbacks are provided by MBEDTLS_SSL_TICKET_C. * * Comment this macro to disable support for SSL session tickets */ #define MBEDTLS_SSL_SESSION_TICKETS /** * \def MBEDTLS_SSL_EXPORT_KEYS * * Enable support for exporting key block and master secret. * This is required for certain users of TLS, e.g. EAP-TLS. * * Comment this macro to disable support for key export */ #define MBEDTLS_SSL_EXPORT_KEYS /** * \def MBEDTLS_SSL_SERVER_NAME_INDICATION * * Enable support for RFC 6066 server name indication (SNI) in SSL. * * Requires: MBEDTLS_X509_CRT_PARSE_C * * Comment this macro to disable support for server name indication in SSL */ #define MBEDTLS_SSL_SERVER_NAME_INDICATION /** * \def MBEDTLS_SSL_TRUNCATED_HMAC * * Enable support for RFC 6066 truncated HMAC in SSL. * * Comment this macro to disable support for truncated HMAC in SSL */ #define MBEDTLS_SSL_TRUNCATED_HMAC /** * \def MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT * * Fallback to old (pre-2.7), non-conforming implementation of the truncated * HMAC extension which also truncates the HMAC key. Note that this option is * only meant for a transitory upgrade period and is likely to be removed in * a future version of the library. * * \warning The old implementation is non-compliant and has a security weakness * (2^80 brute force attack on the HMAC key used for a single, * uninterrupted connection). This should only be enabled temporarily * when (1) the use of truncated HMAC is essential in order to save * bandwidth, and (2) the peer is an Mbed TLS stack that doesn't use * the fixed implementation yet (pre-2.7). * * \deprecated This option is deprecated and will likely be removed in a * future version of Mbed TLS. * * Uncomment to fallback to old, non-compliant truncated HMAC implementation. * * Requires: MBEDTLS_SSL_TRUNCATED_HMAC */ //#define MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT /** * \def MBEDTLS_THREADING_ALT * * Provide your own alternate threading implementation. * * Requires: MBEDTLS_THREADING_C * * Uncomment this to allow your own alternate threading implementation. */ //#define MBEDTLS_THREADING_ALT /** * \def MBEDTLS_THREADING_PTHREAD * * Enable the pthread wrapper layer for the threading layer. * * Requires: MBEDTLS_THREADING_C * * Uncomment this to enable pthread mutexes. */ //#define MBEDTLS_THREADING_PTHREAD /** * \def MBEDTLS_VERSION_FEATURES * * Allow run-time checking of compile-time enabled features. Thus allowing users * to check at run-time if the library is for instance compiled with threading * support via mbedtls_version_check_feature(). * * Requires: MBEDTLS_VERSION_C * * Comment this to disable run-time checking and save ROM space */ #define MBEDTLS_VERSION_FEATURES /** * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 * * If set, the X509 parser will not break-off when parsing an X509 certificate * and encountering an extension in a v1 or v2 certificate. * * Uncomment to prevent an error. */ //#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 /** * \def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION * * If set, the X509 parser will not break-off when parsing an X509 certificate * and encountering an unknown critical extension. * * \warning Depending on your PKI use, enabling this can be a security risk! * * Uncomment to prevent an error. */ //#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION /** * \def MBEDTLS_X509_CHECK_KEY_USAGE * * Enable verification of the keyUsage extension (CA and leaf certificates). * * Disabling this avoids problems with mis-issued and/or misused * (intermediate) CA and leaf certificates. * * \warning Depending on your PKI use, disabling this can be a security risk! * * Comment to skip keyUsage checking for both CA and leaf certificates. */ #define MBEDTLS_X509_CHECK_KEY_USAGE /** * \def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE * * Enable verification of the extendedKeyUsage extension (leaf certificates). * * Disabling this avoids problems with mis-issued and/or misused certificates. * * \warning Depending on your PKI use, disabling this can be a security risk! * * Comment to skip extendedKeyUsage checking for certificates. */ #define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE /** * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT * * Enable parsing and verification of X.509 certificates, CRLs and CSRS * signed with RSASSA-PSS (aka PKCS#1 v2.1). * * Comment this macro to disallow using RSASSA-PSS in certificates. */ #define MBEDTLS_X509_RSASSA_PSS_SUPPORT /** * \def MBEDTLS_ZLIB_SUPPORT * * If set, the SSL/TLS module uses ZLIB to support compression and * decompression of packet data. * * \warning TLS-level compression MAY REDUCE SECURITY! See for example the * CRIME attack. Before enabling this option, you should examine with care if * CRIME or similar exploits may be a applicable to your use case. * * \note Currently compression can't be used with DTLS. * * \deprecated This feature is deprecated and will be removed * in the next major revision of the library. * * Used in: library/ssl_tls.c * library/ssl_cli.c * library/ssl_srv.c * * This feature requires zlib library and headers to be present. * * Uncomment to enable use of ZLIB */ //#define MBEDTLS_ZLIB_SUPPORT /* \} name SECTION: mbed TLS feature support */ /** * \name SECTION: mbed TLS modules * * This section enables or disables entire modules in mbed TLS * \{ */ /** * \def MBEDTLS_AESNI_C * * Enable AES-NI support on x86-64. * * Module: library/aesni.c * Caller: library/aes.c * * Requires: MBEDTLS_HAVE_ASM * * This modules adds support for the AES-NI instructions on x86-64 */ #define MBEDTLS_AESNI_C /** * \def MBEDTLS_AES_C * * Enable the AES block cipher. * * Module: library/aes.c * Caller: library/cipher.c * library/pem.c * library/ctr_drbg.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA * * PEM_PARSE uses AES for decrypting encrypted keys. */ #define MBEDTLS_AES_C /** * \def MBEDTLS_ARC4_C * * Enable the ARCFOUR stream cipher. * * Module: library/arc4.c * Caller: library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. If possible, we recommend avoidng dependencies on * it, and considering stronger ciphers instead. * */ #define MBEDTLS_ARC4_C /** * \def MBEDTLS_ASN1_PARSE_C * * Enable the generic ASN1 parser. * * Module: library/asn1.c * Caller: library/x509.c * library/dhm.c * library/pkcs12.c * library/pkcs5.c * library/pkparse.c */ #define MBEDTLS_ASN1_PARSE_C /** * \def MBEDTLS_ASN1_WRITE_C * * Enable the generic ASN1 writer. * * Module: library/asn1write.c * Caller: library/ecdsa.c * library/pkwrite.c * library/x509_create.c * library/x509write_crt.c * library/x509write_csr.c */ #define MBEDTLS_ASN1_WRITE_C /** * \def MBEDTLS_BASE64_C * * Enable the Base64 module. * * Module: library/base64.c * Caller: library/pem.c * * This module is required for PEM support (required by X.509). */ #define MBEDTLS_BASE64_C /** * \def MBEDTLS_BIGNUM_C * * Enable the multi-precision integer library. * * Module: library/bignum.c * Caller: library/dhm.c * library/ecp.c * library/ecdsa.c * library/rsa.c * library/rsa_internal.c * library/ssl_tls.c * * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support. */ #define MBEDTLS_BIGNUM_C /** * \def MBEDTLS_BLOWFISH_C * * Enable the Blowfish block cipher. * * Module: library/blowfish.c */ #define MBEDTLS_BLOWFISH_C /** * \def MBEDTLS_CAMELLIA_C * * Enable the Camellia block cipher. * * Module: library/camellia.c * Caller: library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 */ #define MBEDTLS_CAMELLIA_C /** * \def MBEDTLS_ARIA_C * * Enable the ARIA block cipher. * * Module: library/aria.c * Caller: library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * * MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 */ //#define MBEDTLS_ARIA_C /** * \def MBEDTLS_CCM_C * * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher. * * Module: library/ccm.c * * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C * * This module enables the AES-CCM ciphersuites, if other requisites are * enabled as well. */ #define MBEDTLS_CCM_C /** * \def MBEDTLS_CERTS_C * * Enable the test certificates. * * Module: library/certs.c * Caller: * * This module is used for testing (ssl_client/server). */ #define MBEDTLS_CERTS_C /** * \def MBEDTLS_CHACHA20_C * * Enable the ChaCha20 stream cipher. * * Module: library/chacha20.c */ #define MBEDTLS_CHACHA20_C /** * \def MBEDTLS_CHACHAPOLY_C * * Enable the ChaCha20-Poly1305 AEAD algorithm. * * Module: library/chachapoly.c * * This module requires: MBEDTLS_CHACHA20_C, MBEDTLS_POLY1305_C */ #define MBEDTLS_CHACHAPOLY_C /** * \def MBEDTLS_CIPHER_C * * Enable the generic cipher layer. * * Module: library/cipher.c * Caller: library/ssl_tls.c * * Uncomment to enable generic cipher wrappers. */ #define MBEDTLS_CIPHER_C /** * \def MBEDTLS_CMAC_C * * Enable the CMAC (Cipher-based Message Authentication Code) mode for block * ciphers. * * Module: library/cmac.c * * Requires: MBEDTLS_AES_C or MBEDTLS_DES_C * */ //#define MBEDTLS_CMAC_C /** * \def MBEDTLS_CTR_DRBG_C * * Enable the CTR_DRBG AES-based random generator. * The CTR_DRBG generator uses AES-256 by default. * To use AES-128 instead, enable MBEDTLS_CTR_DRBG_USE_128_BIT_KEY below. * * Module: library/ctr_drbg.c * Caller: * * Requires: MBEDTLS_AES_C * * This module provides the CTR_DRBG AES random number generator. */ #define MBEDTLS_CTR_DRBG_C /** * \def MBEDTLS_DEBUG_C * * Enable the debug functions. * * Module: library/debug.c * Caller: library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * * This module provides debugging functions. */ #define MBEDTLS_DEBUG_C /** * \def MBEDTLS_DES_C * * Enable the DES block cipher. * * Module: library/des.c * Caller: library/pem.c * library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA * * PEM_PARSE uses DES/3DES for decrypting encrypted keys. * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. */ #define MBEDTLS_DES_C /** * \def MBEDTLS_DHM_C * * Enable the Diffie-Hellman-Merkle module. * * Module: library/dhm.c * Caller: library/ssl_cli.c * library/ssl_srv.c * * This module is used by the following key exchanges: * DHE-RSA, DHE-PSK * * \warning Using DHE constitutes a security risk as it * is not possible to validate custom DH parameters. * If possible, it is recommended users should consider * preferring other methods of key exchange. * See dhm.h for more details. * */ #define MBEDTLS_DHM_C /** * \def MBEDTLS_ECDH_C * * Enable the elliptic curve Diffie-Hellman library. * * Module: library/ecdh.c * Caller: library/ssl_cli.c * library/ssl_srv.c * * This module is used by the following key exchanges: * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK * * Requires: MBEDTLS_ECP_C */ #define MBEDTLS_ECDH_C /** * \def MBEDTLS_ECDSA_C * * Enable the elliptic curve DSA library. * * Module: library/ecdsa.c * Caller: * * This module is used by the following key exchanges: * ECDHE-ECDSA * * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C */ #define MBEDTLS_ECDSA_C /** * \def MBEDTLS_ECJPAKE_C * * Enable the elliptic curve J-PAKE library. * * \warning This is currently experimental. EC J-PAKE support is based on the * Thread v1.0.0 specification; incompatible changes to the specification * might still happen. For this reason, this is disabled by default. * * Module: library/ecjpake.c * Caller: * * This module is used by the following key exchanges: * ECJPAKE * * Requires: MBEDTLS_ECP_C, MBEDTLS_MD_C */ //#define MBEDTLS_ECJPAKE_C /** * \def MBEDTLS_ECP_C * * Enable the elliptic curve over GF(p) library. * * Module: library/ecp.c * Caller: library/ecdh.c * library/ecdsa.c * library/ecjpake.c * * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED */ #define MBEDTLS_ECP_C /** * \def MBEDTLS_ENTROPY_C * * Enable the platform-specific entropy code. * * Module: library/entropy.c * Caller: * * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C * * This module provides a generic entropy pool */ #define MBEDTLS_ENTROPY_C /** * \def MBEDTLS_ERROR_C * * Enable error code to error string conversion. * * Module: library/error.c * Caller: * * This module enables mbedtls_strerror(). */ #define MBEDTLS_ERROR_C /** * \def MBEDTLS_GCM_C * * Enable the Galois/Counter Mode (GCM) for AES. * * Module: library/gcm.c * * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C * * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other * requisites are enabled as well. */ #define MBEDTLS_GCM_C /** * \def MBEDTLS_HAVEGE_C * * Enable the HAVEGE random generator. * * Warning: the HAVEGE random generator is not suitable for virtualized * environments * * Warning: the HAVEGE random generator is dependent on timing and specific * processor traits. It is therefore not advised to use HAVEGE as * your applications primary random generator or primary entropy pool * input. As a secondary input to your entropy pool, it IS able add * the (limited) extra entropy it provides. * * Module: library/havege.c * Caller: * * Requires: MBEDTLS_TIMING_C * * Uncomment to enable the HAVEGE random generator. */ //#define MBEDTLS_HAVEGE_C /** * \def MBEDTLS_HKDF_C * * Enable the HKDF algorithm (RFC 5869). * * Module: library/hkdf.c * Caller: * * Requires: MBEDTLS_MD_C * * This module adds support for the Hashed Message Authentication Code * (HMAC)-based key derivation function (HKDF). */ #define MBEDTLS_HKDF_C /** * \def MBEDTLS_HMAC_DRBG_C * * Enable the HMAC_DRBG random generator. * * Module: library/hmac_drbg.c * Caller: * * Requires: MBEDTLS_MD_C * * Uncomment to enable the HMAC_DRBG random number geerator. */ #define MBEDTLS_HMAC_DRBG_C /** * \def MBEDTLS_NIST_KW_C * * Enable the Key Wrapping mode for 128-bit block ciphers, * as defined in NIST SP 800-38F. Only KW and KWP modes * are supported. At the moment, only AES is approved by NIST. * * Module: library/nist_kw.c * * Requires: MBEDTLS_AES_C and MBEDTLS_CIPHER_C */ //#define MBEDTLS_NIST_KW_C /** * \def MBEDTLS_MD_C * * Enable the generic message digest layer. * * Module: library/md.c * Caller: * * Uncomment to enable generic message digest wrappers. */ #define MBEDTLS_MD_C /** * \def MBEDTLS_MD2_C * * Enable the MD2 hash algorithm. * * Module: library/md2.c * Caller: * * Uncomment to enable support for (rare) MD2-signed X.509 certs. * * \warning MD2 is considered a weak message digest and its use constitutes a * security risk. If possible, we recommend avoiding dependencies on * it, and considering stronger message digests instead. * */ //#define MBEDTLS_MD2_C /** * \def MBEDTLS_MD4_C * * Enable the MD4 hash algorithm. * * Module: library/md4.c * Caller: * * Uncomment to enable support for (rare) MD4-signed X.509 certs. * * \warning MD4 is considered a weak message digest and its use constitutes a * security risk. If possible, we recommend avoiding dependencies on * it, and considering stronger message digests instead. * */ //#define MBEDTLS_MD4_C /** * \def MBEDTLS_MD5_C * * Enable the MD5 hash algorithm. * * Module: library/md5.c * Caller: library/md.c * library/pem.c * library/ssl_tls.c * * This module is required for SSL/TLS up to version 1.1, and for TLS 1.2 * depending on the handshake parameters. Further, it is used for checking * MD5-signed certificates, and for PBKDF1 when decrypting PEM-encoded * encrypted keys. * * \warning MD5 is considered a weak message digest and its use constitutes a * security risk. If possible, we recommend avoiding dependencies on * it, and considering stronger message digests instead. * */ #define MBEDTLS_MD5_C /** * \def MBEDTLS_MEMORY_BUFFER_ALLOC_C * * Enable the buffer allocator implementation that makes use of a (stack) * based buffer to 'allocate' dynamic memory. (replaces calloc() and free() * calls) * * Module: library/memory_buffer_alloc.c * * Requires: MBEDTLS_PLATFORM_C * MBEDTLS_PLATFORM_MEMORY (to use it within mbed TLS) * * Enable this module to enable the buffer memory allocator. */ //#define MBEDTLS_MEMORY_BUFFER_ALLOC_C /** * \def MBEDTLS_NET_C * * Enable the TCP and UDP over IPv6/IPv4 networking routines. * * \note This module only works on POSIX/Unix (including Linux, BSD and OS X) * and Windows. For other platforms, you'll want to disable it, and write your * own networking callbacks to be passed to \c mbedtls_ssl_set_bio(). * * \note See also our Knowledge Base article about porting to a new * environment: * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS * * Module: library/net_sockets.c * * This module provides networking routines. */ #define MBEDTLS_NET_C /** * \def MBEDTLS_OID_C * * Enable the OID database. * * Module: library/oid.c * Caller: library/asn1write.c * library/pkcs5.c * library/pkparse.c * library/pkwrite.c * library/rsa.c * library/x509.c * library/x509_create.c * library/x509_crl.c * library/x509_crt.c * library/x509_csr.c * library/x509write_crt.c * library/x509write_csr.c * * This modules translates between OIDs and internal values. */ #define MBEDTLS_OID_C /** * \def MBEDTLS_PADLOCK_C * * Enable VIA Padlock support on x86. * * Module: library/padlock.c * Caller: library/aes.c * * Requires: MBEDTLS_HAVE_ASM * * This modules adds support for the VIA PadLock on x86. */ #define MBEDTLS_PADLOCK_C /** * \def MBEDTLS_PEM_PARSE_C * * Enable PEM decoding / parsing. * * Module: library/pem.c * Caller: library/dhm.c * library/pkparse.c * library/x509_crl.c * library/x509_crt.c * library/x509_csr.c * * Requires: MBEDTLS_BASE64_C * * This modules adds support for decoding / parsing PEM files. */ #define MBEDTLS_PEM_PARSE_C /** * \def MBEDTLS_PEM_WRITE_C * * Enable PEM encoding / writing. * * Module: library/pem.c * Caller: library/pkwrite.c * library/x509write_crt.c * library/x509write_csr.c * * Requires: MBEDTLS_BASE64_C * * This modules adds support for encoding / writing PEM files. */ #define MBEDTLS_PEM_WRITE_C /** * \def MBEDTLS_PK_C * * Enable the generic public (asymetric) key layer. * * Module: library/pk.c * Caller: library/ssl_tls.c * library/ssl_cli.c * library/ssl_srv.c * * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C * * Uncomment to enable generic public key wrappers. */ #define MBEDTLS_PK_C /** * \def MBEDTLS_PK_PARSE_C * * Enable the generic public (asymetric) key parser. * * Module: library/pkparse.c * Caller: library/x509_crt.c * library/x509_csr.c * * Requires: MBEDTLS_PK_C * * Uncomment to enable generic public key parse functions. */ #define MBEDTLS_PK_PARSE_C /** * \def MBEDTLS_PK_WRITE_C * * Enable the generic public (asymetric) key writer. * * Module: library/pkwrite.c * Caller: library/x509write.c * * Requires: MBEDTLS_PK_C * * Uncomment to enable generic public key write functions. */ #define MBEDTLS_PK_WRITE_C /** * \def MBEDTLS_PKCS5_C * * Enable PKCS#5 functions. * * Module: library/pkcs5.c * * Requires: MBEDTLS_MD_C * * This module adds support for the PKCS#5 functions. */ #define MBEDTLS_PKCS5_C /** * \def MBEDTLS_PKCS11_C * * Enable wrapper for PKCS#11 smartcard support. * * Module: library/pkcs11.c * Caller: library/pk.c * * Requires: MBEDTLS_PK_C * * This module enables SSL/TLS PKCS #11 smartcard support. * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) */ //#define MBEDTLS_PKCS11_C /** * \def MBEDTLS_PKCS12_C * * Enable PKCS#12 PBE functions. * Adds algorithms for parsing PKCS#8 encrypted private keys * * Module: library/pkcs12.c * Caller: library/pkparse.c * * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C * Can use: MBEDTLS_ARC4_C * * This module enables PKCS#12 functions. */ #define MBEDTLS_PKCS12_C /** * \def MBEDTLS_PLATFORM_C * * Enable the platform abstraction layer that allows you to re-assign * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit(). * * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned * above to be specified at runtime or compile time respectively. * * \note This abstraction layer must be enabled on Windows (including MSYS2) * as other module rely on it for a fixed snprintf implementation. * * Module: library/platform.c * Caller: Most other .c files * * This module enables abstraction of common (libc) functions. */ #define MBEDTLS_PLATFORM_C /** * \def MBEDTLS_POLY1305_C * * Enable the Poly1305 MAC algorithm. * * Module: library/poly1305.c * Caller: library/chachapoly.c */ #define MBEDTLS_POLY1305_C /** * \def MBEDTLS_RIPEMD160_C * * Enable the RIPEMD-160 hash algorithm. * * Module: library/ripemd160.c * Caller: library/md.c * */ #define MBEDTLS_RIPEMD160_C /** * \def MBEDTLS_RSA_C * * Enable the RSA public-key cryptosystem. * * Module: library/rsa.c * library/rsa_internal.c * Caller: library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * library/x509.c * * This module is used by the following key exchanges: * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK * * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C */ #define MBEDTLS_RSA_C /** * \def MBEDTLS_SHA1_C * * Enable the SHA1 cryptographic hash algorithm. * * Module: library/sha1.c * Caller: library/md.c * library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * library/x509write_crt.c * * This module is required for SSL/TLS up to version 1.1, for TLS 1.2 * depending on the handshake parameters, and for SHA1-signed certificates. * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. If possible, we recommend avoiding dependencies * on it, and considering stronger message digests instead. * */ #define MBEDTLS_SHA1_C /** * \def MBEDTLS_SHA256_C * * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. * * Module: library/sha256.c * Caller: library/entropy.c * library/md.c * library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * * This module adds support for SHA-224 and SHA-256. * This module is required for the SSL/TLS 1.2 PRF function. */ #define MBEDTLS_SHA256_C /** * \def MBEDTLS_SHA512_C * * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. * * Module: library/sha512.c * Caller: library/entropy.c * library/md.c * library/ssl_cli.c * library/ssl_srv.c * * This module adds support for SHA-384 and SHA-512. */ #define MBEDTLS_SHA512_C /** * \def MBEDTLS_SSL_CACHE_C * * Enable simple SSL cache implementation. * * Module: library/ssl_cache.c * Caller: * * Requires: MBEDTLS_SSL_CACHE_C */ #define MBEDTLS_SSL_CACHE_C /** * \def MBEDTLS_SSL_COOKIE_C * * Enable basic implementation of DTLS cookies for hello verification. * * Module: library/ssl_cookie.c * Caller: */ #define MBEDTLS_SSL_COOKIE_C /** * \def MBEDTLS_SSL_TICKET_C * * Enable an implementation of TLS server-side callbacks for session tickets. * * Module: library/ssl_ticket.c * Caller: * * Requires: MBEDTLS_CIPHER_C */ #define MBEDTLS_SSL_TICKET_C /** * \def MBEDTLS_SSL_CLI_C * * Enable the SSL/TLS client code. * * Module: library/ssl_cli.c * Caller: * * Requires: MBEDTLS_SSL_TLS_C * * This module is required for SSL/TLS client support. */ #define MBEDTLS_SSL_CLI_C /** * \def MBEDTLS_SSL_SRV_C * * Enable the SSL/TLS server code. * * Module: library/ssl_srv.c * Caller: * * Requires: MBEDTLS_SSL_TLS_C * * This module is required for SSL/TLS server support. */ #define MBEDTLS_SSL_SRV_C /** * \def MBEDTLS_SSL_TLS_C * * Enable the generic SSL/TLS code. * * Module: library/ssl_tls.c * Caller: library/ssl_cli.c * library/ssl_srv.c * * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C * and at least one of the MBEDTLS_SSL_PROTO_XXX defines * * This module is required for SSL/TLS. */ #define MBEDTLS_SSL_TLS_C /** * \def MBEDTLS_THREADING_C * * Enable the threading abstraction layer. * By default mbed TLS assumes it is used in a non-threaded environment or that * contexts are not shared between threads. If you do intend to use contexts * between threads, you will need to enable this layer to prevent race * conditions. See also our Knowledge Base article about threading: * https://tls.mbed.org/kb/development/thread-safety-and-multi-threading * * Module: library/threading.c * * This allows different threading implementations (self-implemented or * provided). * * You will have to enable either MBEDTLS_THREADING_ALT or * MBEDTLS_THREADING_PTHREAD. * * Enable this layer to allow use of mutexes within mbed TLS */ //#define MBEDTLS_THREADING_C /** * \def MBEDTLS_TIMING_C * * Enable the semi-portable timing interface. * * \note The provided implementation only works on POSIX/Unix (including Linux, * BSD and OS X) and Windows. On other platforms, you can either disable that * module and provide your own implementations of the callbacks needed by * \c mbedtls_ssl_set_timer_cb() for DTLS, or leave it enabled and provide * your own implementation of the whole module by setting * \c MBEDTLS_TIMING_ALT in the current file. * * \note See also our Knowledge Base article about porting to a new * environment: * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS * * Module: library/timing.c * Caller: library/havege.c * * This module is used by the HAVEGE random number generator. */ #define MBEDTLS_TIMING_C /** * \def MBEDTLS_VERSION_C * * Enable run-time version information. * * Module: library/version.c * * This module provides run-time version information. */ #define MBEDTLS_VERSION_C /** * \def MBEDTLS_X509_USE_C * * Enable X.509 core for using certificates. * * Module: library/x509.c * Caller: library/x509_crl.c * library/x509_crt.c * library/x509_csr.c * * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, * MBEDTLS_PK_PARSE_C * * This module is required for the X.509 parsing modules. */ #define MBEDTLS_X509_USE_C /** * \def MBEDTLS_X509_CRT_PARSE_C * * Enable X.509 certificate parsing. * * Module: library/x509_crt.c * Caller: library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * * Requires: MBEDTLS_X509_USE_C * * This module is required for X.509 certificate parsing. */ #define MBEDTLS_X509_CRT_PARSE_C /** * \def MBEDTLS_X509_CRL_PARSE_C * * Enable X.509 CRL parsing. * * Module: library/x509_crl.c * Caller: library/x509_crt.c * * Requires: MBEDTLS_X509_USE_C * * This module is required for X.509 CRL parsing. */ #define MBEDTLS_X509_CRL_PARSE_C /** * \def MBEDTLS_X509_CSR_PARSE_C * * Enable X.509 Certificate Signing Request (CSR) parsing. * * Module: library/x509_csr.c * Caller: library/x509_crt_write.c * * Requires: MBEDTLS_X509_USE_C * * This module is used for reading X.509 certificate request. */ #define MBEDTLS_X509_CSR_PARSE_C /** * \def MBEDTLS_X509_CREATE_C * * Enable X.509 core for creating certificates. * * Module: library/x509_create.c * * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C * * This module is the basis for creating X.509 certificates and CSRs. */ #define MBEDTLS_X509_CREATE_C /** * \def MBEDTLS_X509_CRT_WRITE_C * * Enable creating X.509 certificates. * * Module: library/x509_crt_write.c * * Requires: MBEDTLS_X509_CREATE_C * * This module is required for X.509 certificate creation. */ #define MBEDTLS_X509_CRT_WRITE_C /** * \def MBEDTLS_X509_CSR_WRITE_C * * Enable creating X.509 Certificate Signing Requests (CSR). * * Module: library/x509_csr_write.c * * Requires: MBEDTLS_X509_CREATE_C * * This module is required for X.509 certificate request writing. */ #define MBEDTLS_X509_CSR_WRITE_C /** * \def MBEDTLS_XTEA_C * * Enable the XTEA block cipher. * * Module: library/xtea.c * Caller: */ #define MBEDTLS_XTEA_C /* \} name SECTION: mbed TLS modules */ /** * \name SECTION: Module configuration options * * This section allows for the setting of module specific sizes and * configuration options. The default values are already present in the * relevant header files and should suffice for the regular use cases. * * Our advice is to enable options and change their values here * only if you have a good reason and know the consequences. * * Please check the respective header file for documentation on these * parameters (to prevent duplicate documentation). * \{ */ /* MPI / BIGNUM options */ //#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ //#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ /* CTR_DRBG options */ //#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ //#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ //#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ //#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ //#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ //#define MBEDTLS_CTR_DRBG_USE_128_BIT_KEY /**< Use 128-bit key for CTR_DRBG - may reduce security (see ctr_drbg.h) */ /* HMAC_DRBG options */ //#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ //#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ //#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ //#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ /* ECP options */ //#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ //#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ //#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ /* Entropy options */ //#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ //#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ //#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Default minimum number of bytes required for the hardware entropy source mbedtls_hardware_poll() before entropy is released */ /* Memory buffer allocator options */ //#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ /* Platform options */ //#define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ //#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_TIME time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ /* Note: your snprintf must correclty zero-terminate the buffer! */ //#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS 0 /**< Default exit value to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE 1 /**< Default exit value to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" /**< Seed file to read/write with default implementation */ /* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */ /* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */ //#define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ /* Note: your snprintf must correclty zero-terminate the buffer! */ //#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ /** * \brief This macro is invoked by the library when an invalid parameter * is detected that is only checked with MBEDTLS_CHECK_PARAMS * (see the documentation of that option for context). * * When you leave this undefined here, a default definition is * provided that invokes the function mbedtls_param_failed(), * which is declared in platform_util.h for the benefit of the * library, but that you need to define in your application. * * When you define this here, this replaces the default * definition in platform_util.h (which no longer declares the * function mbedtls_param_failed()) and it is your responsibility * to make sure this macro expands to something suitable (in * particular, that all the necessary declarations are visible * from within the library - you can ensure that by providing * them in this file next to the macro definition). * * Note that you may define this macro to expand to nothing, in * which case you don't have to worry about declarations or * definitions. However, you will then be notified about invalid * parameters only in non-void functions, and void function will * just silently return early on invalid parameters, which * partially negates the benefits of enabling * #MBEDTLS_CHECK_PARAMS in the first place, so is discouraged. * * \param cond The expression that should evaluate to true, but doesn't. */ //#define MBEDTLS_PARAM_FAILED( cond ) assert( cond ) /* SSL Cache options */ //#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ //#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ /* SSL options */ /** \def MBEDTLS_SSL_MAX_CONTENT_LEN * * Maximum length (in bytes) of incoming and outgoing plaintext fragments. * * This determines the size of both the incoming and outgoing TLS I/O buffers * in such a way that both are capable of holding the specified amount of * plaintext data, regardless of the protection mechanism used. * * To configure incoming and outgoing I/O buffers separately, use * #MBEDTLS_SSL_IN_CONTENT_LEN and #MBEDTLS_SSL_OUT_CONTENT_LEN, * which overwrite the value set by this option. * * \note When using a value less than the default of 16KB on the client, it is * recommended to use the Maximum Fragment Length (MFL) extension to * inform the server about this limitation. On the server, there * is no supported, standardized way of informing the client about * restriction on the maximum size of incoming messages, and unless * the limitation has been communicated by other means, it is recommended * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN * while keeping the default value of 16KB for the incoming buffer. * * Uncomment to set the maximum plaintext size of both * incoming and outgoing I/O buffers. */ //#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /** \def MBEDTLS_SSL_IN_CONTENT_LEN * * Maximum length (in bytes) of incoming plaintext fragments. * * This determines the size of the incoming TLS I/O buffer in such a way * that it is capable of holding the specified amount of plaintext data, * regardless of the protection mechanism used. * * If this option is undefined, it inherits its value from * #MBEDTLS_SSL_MAX_CONTENT_LEN. * * \note When using a value less than the default of 16KB on the client, it is * recommended to use the Maximum Fragment Length (MFL) extension to * inform the server about this limitation. On the server, there * is no supported, standardized way of informing the client about * restriction on the maximum size of incoming messages, and unless * the limitation has been communicated by other means, it is recommended * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN * while keeping the default value of 16KB for the incoming buffer. * * Uncomment to set the maximum plaintext size of the incoming I/O buffer * independently of the outgoing I/O buffer. */ //#define MBEDTLS_SSL_IN_CONTENT_LEN 16384 /** \def MBEDTLS_SSL_OUT_CONTENT_LEN * * Maximum length (in bytes) of outgoing plaintext fragments. * * This determines the size of the outgoing TLS I/O buffer in such a way * that it is capable of holding the specified amount of plaintext data, * regardless of the protection mechanism used. * * If this option undefined, it inherits its value from * #MBEDTLS_SSL_MAX_CONTENT_LEN. * * It is possible to save RAM by setting a smaller outward buffer, while keeping * the default inward 16384 byte buffer to conform to the TLS specification. * * The minimum required outward buffer size is determined by the handshake * protocol's usage. Handshaking will fail if the outward buffer is too small. * The specific size requirement depends on the configured ciphers and any * certificate data which is sent during the handshake. * * Uncomment to set the maximum plaintext size of the outgoing I/O buffer * independently of the incoming I/O buffer. */ //#define MBEDTLS_SSL_OUT_CONTENT_LEN 16384 /** \def MBEDTLS_SSL_DTLS_MAX_BUFFERING * * Maximum number of heap-allocated bytes for the purpose of * DTLS handshake message reassembly and future message buffering. * * This should be at least 9/8 * MBEDTLSSL_IN_CONTENT_LEN * to account for a reassembled handshake message of maximum size, * together with its reassembly bitmap. * * A value of 2 * MBEDTLS_SSL_IN_CONTENT_LEN (32768 by default) * should be sufficient for all practical situations as it allows * to reassembly a large handshake message (such as a certificate) * while buffering multiple smaller handshake messages. * */ //#define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 //#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ //#define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ //#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ /** * Complete list of ciphersuites to use, in order of preference. * * \warning No dependency checking is done on that field! This option can only * be used to restrict the set of available ciphersuites. It is your * responsibility to make sure the needed modules are active. * * Use this to save a few hundred bytes of ROM (default ordering of all * available ciphersuites) and a few to a few hundred bytes of RAM. * * The value below is only an example, not the default. */ //#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 /* X509 options */ //#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ //#define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 /**< Maximum length of a path/filename string in bytes including the null terminator character ('\0'). */ /** * Allow SHA-1 in the default TLS configuration for certificate signing. * Without this build-time option, SHA-1 support must be activated explicitly * through mbedtls_ssl_conf_cert_profile. Turning on this option is not * recommended because of it is possible to generate SHA-1 collisions, however * this may be safe for legacy infrastructure where additional controls apply. * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. If possible, we recommend avoiding dependencies * on it, and considering stronger message digests instead. * */ // #define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES /** * Allow SHA-1 in the default TLS configuration for TLS 1.2 handshake * signature and ciphersuite selection. Without this build-time option, SHA-1 * support must be activated explicitly through mbedtls_ssl_conf_sig_hashes. * The use of SHA-1 in TLS <= 1.1 and in HMAC-SHA-1 is always allowed by * default. At the time of writing, there is no practical attack on the use * of SHA-1 in handshake signatures, hence this option is turned on by default * to preserve compatibility with existing peers, but the general * warning applies nonetheless: * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. If possible, we recommend avoiding dependencies * on it, and considering stronger message digests instead. * */ #define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE /** * Uncomment the macro to let mbed TLS use your alternate implementation of * mbedtls_platform_zeroize(). This replaces the default implementation in * platform_util.c. * * mbedtls_platform_zeroize() is a widely used function across the library to * zero a block of memory. The implementation is expected to be secure in the * sense that it has been written to prevent the compiler from removing calls * to mbedtls_platform_zeroize() as part of redundant code elimination * optimizations. However, it is difficult to guarantee that calls to * mbedtls_platform_zeroize() will not be optimized by the compiler as older * versions of the C language standards do not provide a secure implementation * of memset(). Therefore, MBEDTLS_PLATFORM_ZEROIZE_ALT enables users to * configure their own implementation of mbedtls_platform_zeroize(), for * example by using directives specific to their compiler, features from newer * C standards (e.g using memset_s() in C11) or calling a secure memset() from * their system (e.g explicit_bzero() in BSD). */ //#define MBEDTLS_PLATFORM_ZEROIZE_ALT /** * Uncomment the macro to let Mbed TLS use your alternate implementation of * mbedtls_platform_gmtime_r(). This replaces the default implementation in * platform_util.c. * * gmtime() is not a thread-safe function as defined in the C standard. The * library will try to use safer implementations of this function, such as * gmtime_r() when available. However, if Mbed TLS cannot identify the target * system, the implementation of mbedtls_platform_gmtime_r() will default to * using the standard gmtime(). In this case, calls from the library to * gmtime() will be guarded by the global mutex mbedtls_threading_gmtime_mutex * if MBEDTLS_THREADING_C is enabled. We recommend that calls from outside the * library are also guarded with this mutex to avoid race conditions. However, * if the macro MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, Mbed TLS will * unconditionally use the implementation for mbedtls_platform_gmtime_r() * supplied at compile time. */ //#define MBEDTLS_PLATFORM_GMTIME_R_ALT /* \} name SECTION: Customisation configuration options */ /* Target and application specific configurations * * Allow user to override any previous default. * */ #if defined(MBEDTLS_USER_CONFIG_FILE) #include MBEDTLS_USER_CONFIG_FILE #endif #include "check_config.h" #endif /* MBEDTLS_CONFIG_H */ fldigi-4.1.06/src/include/mbedtls/ripemd160.h0000664000175000017500000001563313507401434015520 00000000000000/** * \file ripemd160.h * * \brief RIPE MD-160 message digest */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_RIPEMD160_H #define MBEDTLS_RIPEMD160_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED -0x0031 /**< RIPEMD160 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_RIPEMD160_ALT) // Regular implementation // /** * \brief RIPEMD-160 context structure */ typedef struct mbedtls_ripemd160_context { uint32_t total[2]; /*!< number of bytes processed */ uint32_t state[5]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ } mbedtls_ripemd160_context; #else /* MBEDTLS_RIPEMD160_ALT */ #include "ripemd160.h" #endif /* MBEDTLS_RIPEMD160_ALT */ /** * \brief Initialize RIPEMD-160 context * * \param ctx RIPEMD-160 context to be initialized */ void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx ); /** * \brief Clear RIPEMD-160 context * * \param ctx RIPEMD-160 context to be cleared */ void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx ); /** * \brief Clone (the state of) an RIPEMD-160 context * * \param dst The destination context * \param src The context to be cloned */ void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst, const mbedtls_ripemd160_context *src ); /** * \brief RIPEMD-160 context setup * * \param ctx context to be initialized * * \return 0 if successful */ int mbedtls_ripemd160_starts_ret( mbedtls_ripemd160_context *ctx ); /** * \brief RIPEMD-160 process buffer * * \param ctx RIPEMD-160 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful */ int mbedtls_ripemd160_update_ret( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief RIPEMD-160 final digest * * \param ctx RIPEMD-160 context * \param output RIPEMD-160 checksum result * * \return 0 if successful */ int mbedtls_ripemd160_finish_ret( mbedtls_ripemd160_context *ctx, unsigned char output[20] ); /** * \brief RIPEMD-160 process data block (internal use only) * * \param ctx RIPEMD-160 context * \param data buffer holding one block of data * * \return 0 if successful */ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief RIPEMD-160 context setup * * \deprecated Superseded by mbedtls_ripemd160_starts_ret() in 2.7.0 * * \param ctx context to be initialized */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx ); /** * \brief RIPEMD-160 process buffer * * \deprecated Superseded by mbedtls_ripemd160_update_ret() in 2.7.0 * * \param ctx RIPEMD-160 context * \param input buffer holding the data * \param ilen length of the input data */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief RIPEMD-160 final digest * * \deprecated Superseded by mbedtls_ripemd160_finish_ret() in 2.7.0 * * \param ctx RIPEMD-160 context * \param output RIPEMD-160 checksum result */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] ); /** * \brief RIPEMD-160 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_ripemd160_process() in 2.7.0 * * \param ctx RIPEMD-160 context * \param data buffer holding one block of data */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = RIPEMD-160( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output RIPEMD-160 checksum result * * \return 0 if successful */ int mbedtls_ripemd160_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = RIPEMD-160( input buffer ) * * \deprecated Superseded by mbedtls_ripemd160_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output RIPEMD-160 checksum result */ MBEDTLS_DEPRECATED void mbedtls_ripemd160( const unsigned char *input, size_t ilen, unsigned char output[20] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_ripemd160_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_ripemd160.h */ fldigi-4.1.06/src/include/mbedtls/compat-1.3.h0000664000175000017500000037545613507401434015607 00000000000000/** * \file compat-1.3.h * * \brief Compatibility definitions for using mbed TLS with client code written * for the PolarSSL naming conventions. * * \deprecated Use the new names directly instead */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #warning "Including compat-1.3.h is deprecated" #endif #ifndef MBEDTLS_COMPAT13_H #define MBEDTLS_COMPAT13_H /* * config.h options */ #if defined MBEDTLS_AESNI_C #define POLARSSL_AESNI_C MBEDTLS_AESNI_C #endif #if defined MBEDTLS_AES_ALT #define POLARSSL_AES_ALT MBEDTLS_AES_ALT #endif #if defined MBEDTLS_AES_C #define POLARSSL_AES_C MBEDTLS_AES_C #endif #if defined MBEDTLS_AES_ROM_TABLES #define POLARSSL_AES_ROM_TABLES MBEDTLS_AES_ROM_TABLES #endif #if defined MBEDTLS_ARC4_ALT #define POLARSSL_ARC4_ALT MBEDTLS_ARC4_ALT #endif #if defined MBEDTLS_ARC4_C #define POLARSSL_ARC4_C MBEDTLS_ARC4_C #endif #if defined MBEDTLS_ASN1_PARSE_C #define POLARSSL_ASN1_PARSE_C MBEDTLS_ASN1_PARSE_C #endif #if defined MBEDTLS_ASN1_WRITE_C #define POLARSSL_ASN1_WRITE_C MBEDTLS_ASN1_WRITE_C #endif #if defined MBEDTLS_BASE64_C #define POLARSSL_BASE64_C MBEDTLS_BASE64_C #endif #if defined MBEDTLS_BIGNUM_C #define POLARSSL_BIGNUM_C MBEDTLS_BIGNUM_C #endif #if defined MBEDTLS_BLOWFISH_ALT #define POLARSSL_BLOWFISH_ALT MBEDTLS_BLOWFISH_ALT #endif #if defined MBEDTLS_BLOWFISH_C #define POLARSSL_BLOWFISH_C MBEDTLS_BLOWFISH_C #endif #if defined MBEDTLS_CAMELLIA_ALT #define POLARSSL_CAMELLIA_ALT MBEDTLS_CAMELLIA_ALT #endif #if defined MBEDTLS_CAMELLIA_C #define POLARSSL_CAMELLIA_C MBEDTLS_CAMELLIA_C #endif #if defined MBEDTLS_CAMELLIA_SMALL_MEMORY #define POLARSSL_CAMELLIA_SMALL_MEMORY MBEDTLS_CAMELLIA_SMALL_MEMORY #endif #if defined MBEDTLS_CCM_C #define POLARSSL_CCM_C MBEDTLS_CCM_C #endif #if defined MBEDTLS_CERTS_C #define POLARSSL_CERTS_C MBEDTLS_CERTS_C #endif #if defined MBEDTLS_CIPHER_C #define POLARSSL_CIPHER_C MBEDTLS_CIPHER_C #endif #if defined MBEDTLS_CIPHER_MODE_CBC #define POLARSSL_CIPHER_MODE_CBC MBEDTLS_CIPHER_MODE_CBC #endif #if defined MBEDTLS_CIPHER_MODE_CFB #define POLARSSL_CIPHER_MODE_CFB MBEDTLS_CIPHER_MODE_CFB #endif #if defined MBEDTLS_CIPHER_MODE_CTR #define POLARSSL_CIPHER_MODE_CTR MBEDTLS_CIPHER_MODE_CTR #endif #if defined MBEDTLS_CIPHER_NULL_CIPHER #define POLARSSL_CIPHER_NULL_CIPHER MBEDTLS_CIPHER_NULL_CIPHER #endif #if defined MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS #define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS #endif #if defined MBEDTLS_CIPHER_PADDING_PKCS7 #define POLARSSL_CIPHER_PADDING_PKCS7 MBEDTLS_CIPHER_PADDING_PKCS7 #endif #if defined MBEDTLS_CIPHER_PADDING_ZEROS #define POLARSSL_CIPHER_PADDING_ZEROS MBEDTLS_CIPHER_PADDING_ZEROS #endif #if defined MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN #define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN #endif #if defined MBEDTLS_CTR_DRBG_C #define POLARSSL_CTR_DRBG_C MBEDTLS_CTR_DRBG_C #endif #if defined MBEDTLS_DEBUG_C #define POLARSSL_DEBUG_C MBEDTLS_DEBUG_C #endif #if defined MBEDTLS_DEPRECATED_REMOVED #define POLARSSL_DEPRECATED_REMOVED MBEDTLS_DEPRECATED_REMOVED #endif #if defined MBEDTLS_DEPRECATED_WARNING #define POLARSSL_DEPRECATED_WARNING MBEDTLS_DEPRECATED_WARNING #endif #if defined MBEDTLS_DES_ALT #define POLARSSL_DES_ALT MBEDTLS_DES_ALT #endif #if defined MBEDTLS_DES_C #define POLARSSL_DES_C MBEDTLS_DES_C #endif #if defined MBEDTLS_DHM_C #define POLARSSL_DHM_C MBEDTLS_DHM_C #endif #if defined MBEDTLS_ECDH_C #define POLARSSL_ECDH_C MBEDTLS_ECDH_C #endif #if defined MBEDTLS_ECDSA_C #define POLARSSL_ECDSA_C MBEDTLS_ECDSA_C #endif #if defined MBEDTLS_ECDSA_DETERMINISTIC #define POLARSSL_ECDSA_DETERMINISTIC MBEDTLS_ECDSA_DETERMINISTIC #endif #if defined MBEDTLS_ECP_C #define POLARSSL_ECP_C MBEDTLS_ECP_C #endif #if defined MBEDTLS_ECP_DP_BP256R1_ENABLED #define POLARSSL_ECP_DP_BP256R1_ENABLED MBEDTLS_ECP_DP_BP256R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_BP384R1_ENABLED #define POLARSSL_ECP_DP_BP384R1_ENABLED MBEDTLS_ECP_DP_BP384R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_BP512R1_ENABLED #define POLARSSL_ECP_DP_BP512R1_ENABLED MBEDTLS_ECP_DP_BP512R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_CURVE25519_ENABLED #define POLARSSL_ECP_DP_M255_ENABLED MBEDTLS_ECP_DP_CURVE25519_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP192K1_ENABLED #define POLARSSL_ECP_DP_SECP192K1_ENABLED MBEDTLS_ECP_DP_SECP192K1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP192R1_ENABLED #define POLARSSL_ECP_DP_SECP192R1_ENABLED MBEDTLS_ECP_DP_SECP192R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP224K1_ENABLED #define POLARSSL_ECP_DP_SECP224K1_ENABLED MBEDTLS_ECP_DP_SECP224K1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP224R1_ENABLED #define POLARSSL_ECP_DP_SECP224R1_ENABLED MBEDTLS_ECP_DP_SECP224R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP256K1_ENABLED #define POLARSSL_ECP_DP_SECP256K1_ENABLED MBEDTLS_ECP_DP_SECP256K1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP256R1_ENABLED #define POLARSSL_ECP_DP_SECP256R1_ENABLED MBEDTLS_ECP_DP_SECP256R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP384R1_ENABLED #define POLARSSL_ECP_DP_SECP384R1_ENABLED MBEDTLS_ECP_DP_SECP384R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP521R1_ENABLED #define POLARSSL_ECP_DP_SECP521R1_ENABLED MBEDTLS_ECP_DP_SECP521R1_ENABLED #endif #if defined MBEDTLS_ECP_FIXED_POINT_OPTIM #define POLARSSL_ECP_FIXED_POINT_OPTIM MBEDTLS_ECP_FIXED_POINT_OPTIM #endif #if defined MBEDTLS_ECP_MAX_BITS #define POLARSSL_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS #endif #if defined MBEDTLS_ECP_NIST_OPTIM #define POLARSSL_ECP_NIST_OPTIM MBEDTLS_ECP_NIST_OPTIM #endif #if defined MBEDTLS_ECP_WINDOW_SIZE #define POLARSSL_ECP_WINDOW_SIZE MBEDTLS_ECP_WINDOW_SIZE #endif #if defined MBEDTLS_ENABLE_WEAK_CIPHERSUITES #define POLARSSL_ENABLE_WEAK_CIPHERSUITES MBEDTLS_ENABLE_WEAK_CIPHERSUITES #endif #if defined MBEDTLS_ENTROPY_C #define POLARSSL_ENTROPY_C MBEDTLS_ENTROPY_C #endif #if defined MBEDTLS_ENTROPY_FORCE_SHA256 #define POLARSSL_ENTROPY_FORCE_SHA256 MBEDTLS_ENTROPY_FORCE_SHA256 #endif #if defined MBEDTLS_ERROR_C #define POLARSSL_ERROR_C MBEDTLS_ERROR_C #endif #if defined MBEDTLS_ERROR_STRERROR_DUMMY #define POLARSSL_ERROR_STRERROR_DUMMY MBEDTLS_ERROR_STRERROR_DUMMY #endif #if defined MBEDTLS_FS_IO #define POLARSSL_FS_IO MBEDTLS_FS_IO #endif #if defined MBEDTLS_GCM_C #define POLARSSL_GCM_C MBEDTLS_GCM_C #endif #if defined MBEDTLS_GENPRIME #define POLARSSL_GENPRIME MBEDTLS_GENPRIME #endif #if defined MBEDTLS_HAVEGE_C #define POLARSSL_HAVEGE_C MBEDTLS_HAVEGE_C #endif #if defined MBEDTLS_HAVE_ASM #define POLARSSL_HAVE_ASM MBEDTLS_HAVE_ASM #endif #if defined MBEDTLS_HAVE_SSE2 #define POLARSSL_HAVE_SSE2 MBEDTLS_HAVE_SSE2 #endif #if defined MBEDTLS_HAVE_TIME #define POLARSSL_HAVE_TIME MBEDTLS_HAVE_TIME #endif #if defined MBEDTLS_HMAC_DRBG_C #define POLARSSL_HMAC_DRBG_C MBEDTLS_HMAC_DRBG_C #endif #if defined MBEDTLS_HMAC_DRBG_MAX_INPUT #define POLARSSL_HMAC_DRBG_MAX_INPUT MBEDTLS_HMAC_DRBG_MAX_INPUT #endif #if defined MBEDTLS_HMAC_DRBG_MAX_REQUEST #define POLARSSL_HMAC_DRBG_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST #endif #if defined MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT #define POLARSSL_HMAC_DRBG_MAX_SEED_INPUT MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT #endif #if defined MBEDTLS_HMAC_DRBG_RESEED_INTERVAL #define POLARSSL_HMAC_DRBG_RESEED_INTERVAL MBEDTLS_HMAC_DRBG_RESEED_INTERVAL #endif #if defined MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_PSK_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED #endif #if defined MBEDTLS_MD2_ALT #define POLARSSL_MD2_ALT MBEDTLS_MD2_ALT #endif #if defined MBEDTLS_MD2_C #define POLARSSL_MD2_C MBEDTLS_MD2_C #endif #if defined MBEDTLS_MD2_PROCESS_ALT #define POLARSSL_MD2_PROCESS_ALT MBEDTLS_MD2_PROCESS_ALT #endif #if defined MBEDTLS_MD4_ALT #define POLARSSL_MD4_ALT MBEDTLS_MD4_ALT #endif #if defined MBEDTLS_MD4_C #define POLARSSL_MD4_C MBEDTLS_MD4_C #endif #if defined MBEDTLS_MD4_PROCESS_ALT #define POLARSSL_MD4_PROCESS_ALT MBEDTLS_MD4_PROCESS_ALT #endif #if defined MBEDTLS_MD5_ALT #define POLARSSL_MD5_ALT MBEDTLS_MD5_ALT #endif #if defined MBEDTLS_MD5_C #define POLARSSL_MD5_C MBEDTLS_MD5_C #endif #if defined MBEDTLS_MD5_PROCESS_ALT #define POLARSSL_MD5_PROCESS_ALT MBEDTLS_MD5_PROCESS_ALT #endif #if defined MBEDTLS_MD_C #define POLARSSL_MD_C MBEDTLS_MD_C #endif #if defined MBEDTLS_MEMORY_ALIGN_MULTIPLE #define POLARSSL_MEMORY_ALIGN_MULTIPLE MBEDTLS_MEMORY_ALIGN_MULTIPLE #endif #if defined MBEDTLS_MEMORY_BACKTRACE #define POLARSSL_MEMORY_BACKTRACE MBEDTLS_MEMORY_BACKTRACE #endif #if defined MBEDTLS_MEMORY_BUFFER_ALLOC_C #define POLARSSL_MEMORY_BUFFER_ALLOC_C MBEDTLS_MEMORY_BUFFER_ALLOC_C #endif #if defined MBEDTLS_MEMORY_DEBUG #define POLARSSL_MEMORY_DEBUG MBEDTLS_MEMORY_DEBUG #endif #if defined MBEDTLS_MPI_MAX_SIZE #define POLARSSL_MPI_MAX_SIZE MBEDTLS_MPI_MAX_SIZE #endif #if defined MBEDTLS_MPI_WINDOW_SIZE #define POLARSSL_MPI_WINDOW_SIZE MBEDTLS_MPI_WINDOW_SIZE #endif #if defined MBEDTLS_NET_C #define POLARSSL_NET_C MBEDTLS_NET_C #endif #if defined MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES #define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES #endif #if defined MBEDTLS_NO_PLATFORM_ENTROPY #define POLARSSL_NO_PLATFORM_ENTROPY MBEDTLS_NO_PLATFORM_ENTROPY #endif #if defined MBEDTLS_OID_C #define POLARSSL_OID_C MBEDTLS_OID_C #endif #if defined MBEDTLS_PADLOCK_C #define POLARSSL_PADLOCK_C MBEDTLS_PADLOCK_C #endif #if defined MBEDTLS_PEM_PARSE_C #define POLARSSL_PEM_PARSE_C MBEDTLS_PEM_PARSE_C #endif #if defined MBEDTLS_PEM_WRITE_C #define POLARSSL_PEM_WRITE_C MBEDTLS_PEM_WRITE_C #endif #if defined MBEDTLS_PKCS11_C #define POLARSSL_PKCS11_C MBEDTLS_PKCS11_C #endif #if defined MBEDTLS_PKCS12_C #define POLARSSL_PKCS12_C MBEDTLS_PKCS12_C #endif #if defined MBEDTLS_PKCS1_V15 #define POLARSSL_PKCS1_V15 MBEDTLS_PKCS1_V15 #endif #if defined MBEDTLS_PKCS1_V21 #define POLARSSL_PKCS1_V21 MBEDTLS_PKCS1_V21 #endif #if defined MBEDTLS_PKCS5_C #define POLARSSL_PKCS5_C MBEDTLS_PKCS5_C #endif #if defined MBEDTLS_PK_C #define POLARSSL_PK_C MBEDTLS_PK_C #endif #if defined MBEDTLS_PK_PARSE_C #define POLARSSL_PK_PARSE_C MBEDTLS_PK_PARSE_C #endif #if defined MBEDTLS_PK_PARSE_EC_EXTENDED #define POLARSSL_PK_PARSE_EC_EXTENDED MBEDTLS_PK_PARSE_EC_EXTENDED #endif #if defined MBEDTLS_PK_RSA_ALT_SUPPORT #define POLARSSL_PK_RSA_ALT_SUPPORT MBEDTLS_PK_RSA_ALT_SUPPORT #endif #if defined MBEDTLS_PK_WRITE_C #define POLARSSL_PK_WRITE_C MBEDTLS_PK_WRITE_C #endif #if defined MBEDTLS_PLATFORM_C #define POLARSSL_PLATFORM_C MBEDTLS_PLATFORM_C #endif #if defined MBEDTLS_PLATFORM_EXIT_ALT #define POLARSSL_PLATFORM_EXIT_ALT MBEDTLS_PLATFORM_EXIT_ALT #endif #if defined MBEDTLS_PLATFORM_EXIT_MACRO #define POLARSSL_PLATFORM_EXIT_MACRO MBEDTLS_PLATFORM_EXIT_MACRO #endif #if defined MBEDTLS_PLATFORM_FPRINTF_ALT #define POLARSSL_PLATFORM_FPRINTF_ALT MBEDTLS_PLATFORM_FPRINTF_ALT #endif #if defined MBEDTLS_PLATFORM_FPRINTF_MACRO #define POLARSSL_PLATFORM_FPRINTF_MACRO MBEDTLS_PLATFORM_FPRINTF_MACRO #endif #if defined MBEDTLS_PLATFORM_FREE_MACRO #define POLARSSL_PLATFORM_FREE_MACRO MBEDTLS_PLATFORM_FREE_MACRO #endif #if defined MBEDTLS_PLATFORM_MEMORY #define POLARSSL_PLATFORM_MEMORY MBEDTLS_PLATFORM_MEMORY #endif #if defined MBEDTLS_PLATFORM_NO_STD_FUNCTIONS #define POLARSSL_PLATFORM_NO_STD_FUNCTIONS MBEDTLS_PLATFORM_NO_STD_FUNCTIONS #endif #if defined MBEDTLS_PLATFORM_PRINTF_ALT #define POLARSSL_PLATFORM_PRINTF_ALT MBEDTLS_PLATFORM_PRINTF_ALT #endif #if defined MBEDTLS_PLATFORM_PRINTF_MACRO #define POLARSSL_PLATFORM_PRINTF_MACRO MBEDTLS_PLATFORM_PRINTF_MACRO #endif #if defined MBEDTLS_PLATFORM_SNPRINTF_ALT #define POLARSSL_PLATFORM_SNPRINTF_ALT MBEDTLS_PLATFORM_SNPRINTF_ALT #endif #if defined MBEDTLS_PLATFORM_SNPRINTF_MACRO #define POLARSSL_PLATFORM_SNPRINTF_MACRO MBEDTLS_PLATFORM_SNPRINTF_MACRO #endif #if defined MBEDTLS_PLATFORM_STD_EXIT #define POLARSSL_PLATFORM_STD_EXIT MBEDTLS_PLATFORM_STD_EXIT #endif #if defined MBEDTLS_PLATFORM_STD_FPRINTF #define POLARSSL_PLATFORM_STD_FPRINTF MBEDTLS_PLATFORM_STD_FPRINTF #endif #if defined MBEDTLS_PLATFORM_STD_FREE #define POLARSSL_PLATFORM_STD_FREE MBEDTLS_PLATFORM_STD_FREE #endif #if defined MBEDTLS_PLATFORM_STD_MEM_HDR #define POLARSSL_PLATFORM_STD_MEM_HDR MBEDTLS_PLATFORM_STD_MEM_HDR #endif #if defined MBEDTLS_PLATFORM_STD_PRINTF #define POLARSSL_PLATFORM_STD_PRINTF MBEDTLS_PLATFORM_STD_PRINTF #endif #if defined MBEDTLS_PLATFORM_STD_SNPRINTF #define POLARSSL_PLATFORM_STD_SNPRINTF MBEDTLS_PLATFORM_STD_SNPRINTF #endif #if defined MBEDTLS_PSK_MAX_LEN #define POLARSSL_PSK_MAX_LEN MBEDTLS_PSK_MAX_LEN #endif #if defined MBEDTLS_REMOVE_ARC4_CIPHERSUITES #define POLARSSL_REMOVE_ARC4_CIPHERSUITES MBEDTLS_REMOVE_ARC4_CIPHERSUITES #endif #if defined MBEDTLS_RIPEMD160_ALT #define POLARSSL_RIPEMD160_ALT MBEDTLS_RIPEMD160_ALT #endif #if defined MBEDTLS_RIPEMD160_C #define POLARSSL_RIPEMD160_C MBEDTLS_RIPEMD160_C #endif #if defined MBEDTLS_RIPEMD160_PROCESS_ALT #define POLARSSL_RIPEMD160_PROCESS_ALT MBEDTLS_RIPEMD160_PROCESS_ALT #endif #if defined MBEDTLS_RSA_C #define POLARSSL_RSA_C MBEDTLS_RSA_C #endif #if defined MBEDTLS_RSA_NO_CRT #define POLARSSL_RSA_NO_CRT MBEDTLS_RSA_NO_CRT #endif #if defined MBEDTLS_SELF_TEST #define POLARSSL_SELF_TEST MBEDTLS_SELF_TEST #endif #if defined MBEDTLS_SHA1_ALT #define POLARSSL_SHA1_ALT MBEDTLS_SHA1_ALT #endif #if defined MBEDTLS_SHA1_C #define POLARSSL_SHA1_C MBEDTLS_SHA1_C #endif #if defined MBEDTLS_SHA1_PROCESS_ALT #define POLARSSL_SHA1_PROCESS_ALT MBEDTLS_SHA1_PROCESS_ALT #endif #if defined MBEDTLS_SHA256_ALT #define POLARSSL_SHA256_ALT MBEDTLS_SHA256_ALT #endif #if defined MBEDTLS_SHA256_C #define POLARSSL_SHA256_C MBEDTLS_SHA256_C #endif #if defined MBEDTLS_SHA256_PROCESS_ALT #define POLARSSL_SHA256_PROCESS_ALT MBEDTLS_SHA256_PROCESS_ALT #endif #if defined MBEDTLS_SHA512_ALT #define POLARSSL_SHA512_ALT MBEDTLS_SHA512_ALT #endif #if defined MBEDTLS_SHA512_C #define POLARSSL_SHA512_C MBEDTLS_SHA512_C #endif #if defined MBEDTLS_SHA512_PROCESS_ALT #define POLARSSL_SHA512_PROCESS_ALT MBEDTLS_SHA512_PROCESS_ALT #endif #if defined MBEDTLS_SSL_ALL_ALERT_MESSAGES #define POLARSSL_SSL_ALL_ALERT_MESSAGES MBEDTLS_SSL_ALL_ALERT_MESSAGES #endif #if defined MBEDTLS_SSL_ALPN #define POLARSSL_SSL_ALPN MBEDTLS_SSL_ALPN #endif #if defined MBEDTLS_SSL_CACHE_C #define POLARSSL_SSL_CACHE_C MBEDTLS_SSL_CACHE_C #endif #if defined MBEDTLS_SSL_CBC_RECORD_SPLITTING #define POLARSSL_SSL_CBC_RECORD_SPLITTING MBEDTLS_SSL_CBC_RECORD_SPLITTING #endif #if defined MBEDTLS_SSL_CLI_C #define POLARSSL_SSL_CLI_C MBEDTLS_SSL_CLI_C #endif #if defined MBEDTLS_SSL_COOKIE_C #define POLARSSL_SSL_COOKIE_C MBEDTLS_SSL_COOKIE_C #endif #if defined MBEDTLS_SSL_COOKIE_TIMEOUT #define POLARSSL_SSL_COOKIE_TIMEOUT MBEDTLS_SSL_COOKIE_TIMEOUT #endif #if defined MBEDTLS_SSL_DEBUG_ALL #define POLARSSL_SSL_DEBUG_ALL MBEDTLS_SSL_DEBUG_ALL #endif #if defined MBEDTLS_SSL_DTLS_ANTI_REPLAY #define POLARSSL_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_ANTI_REPLAY #endif #if defined MBEDTLS_SSL_DTLS_BADMAC_LIMIT #define POLARSSL_SSL_DTLS_BADMAC_LIMIT MBEDTLS_SSL_DTLS_BADMAC_LIMIT #endif #if defined MBEDTLS_SSL_DTLS_HELLO_VERIFY #define POLARSSL_SSL_DTLS_HELLO_VERIFY MBEDTLS_SSL_DTLS_HELLO_VERIFY #endif #if defined MBEDTLS_SSL_ENCRYPT_THEN_MAC #define POLARSSL_SSL_ENCRYPT_THEN_MAC MBEDTLS_SSL_ENCRYPT_THEN_MAC #endif #if defined MBEDTLS_SSL_EXTENDED_MASTER_SECRET #define POLARSSL_SSL_EXTENDED_MASTER_SECRET MBEDTLS_SSL_EXTENDED_MASTER_SECRET #endif #if defined MBEDTLS_SSL_FALLBACK_SCSV #define POLARSSL_SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV #endif #if defined MBEDTLS_SSL_HW_RECORD_ACCEL #define POLARSSL_SSL_HW_RECORD_ACCEL MBEDTLS_SSL_HW_RECORD_ACCEL #endif #if defined MBEDTLS_SSL_MAX_FRAGMENT_LENGTH #define POLARSSL_SSL_MAX_FRAGMENT_LENGTH MBEDTLS_SSL_MAX_FRAGMENT_LENGTH #endif #if defined MBEDTLS_SSL_PROTO_DTLS #define POLARSSL_SSL_PROTO_DTLS MBEDTLS_SSL_PROTO_DTLS #endif #if defined MBEDTLS_SSL_PROTO_SSL3 #define POLARSSL_SSL_PROTO_SSL3 MBEDTLS_SSL_PROTO_SSL3 #endif #if defined MBEDTLS_SSL_PROTO_TLS1 #define POLARSSL_SSL_PROTO_TLS1 MBEDTLS_SSL_PROTO_TLS1 #endif #if defined MBEDTLS_SSL_PROTO_TLS1_1 #define POLARSSL_SSL_PROTO_TLS1_1 MBEDTLS_SSL_PROTO_TLS1_1 #endif #if defined MBEDTLS_SSL_PROTO_TLS1_2 #define POLARSSL_SSL_PROTO_TLS1_2 MBEDTLS_SSL_PROTO_TLS1_2 #endif #if defined MBEDTLS_SSL_RENEGOTIATION #define POLARSSL_SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION #endif #if defined MBEDTLS_SSL_SERVER_NAME_INDICATION #define POLARSSL_SSL_SERVER_NAME_INDICATION MBEDTLS_SSL_SERVER_NAME_INDICATION #endif #if defined MBEDTLS_SSL_SESSION_TICKETS #define POLARSSL_SSL_SESSION_TICKETS MBEDTLS_SSL_SESSION_TICKETS #endif #if defined MBEDTLS_SSL_SRV_C #define POLARSSL_SSL_SRV_C MBEDTLS_SSL_SRV_C #endif #if defined MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE #define POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE #endif #if defined MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO #define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO #endif #if defined MBEDTLS_SSL_TLS_C #define POLARSSL_SSL_TLS_C MBEDTLS_SSL_TLS_C #endif #if defined MBEDTLS_SSL_TRUNCATED_HMAC #define POLARSSL_SSL_TRUNCATED_HMAC MBEDTLS_SSL_TRUNCATED_HMAC #endif #if defined MBEDTLS_THREADING_ALT #define POLARSSL_THREADING_ALT MBEDTLS_THREADING_ALT #endif #if defined MBEDTLS_THREADING_C #define POLARSSL_THREADING_C MBEDTLS_THREADING_C #endif #if defined MBEDTLS_THREADING_PTHREAD #define POLARSSL_THREADING_PTHREAD MBEDTLS_THREADING_PTHREAD #endif #if defined MBEDTLS_TIMING_ALT #define POLARSSL_TIMING_ALT MBEDTLS_TIMING_ALT #endif #if defined MBEDTLS_TIMING_C #define POLARSSL_TIMING_C MBEDTLS_TIMING_C #endif #if defined MBEDTLS_VERSION_C #define POLARSSL_VERSION_C MBEDTLS_VERSION_C #endif #if defined MBEDTLS_VERSION_FEATURES #define POLARSSL_VERSION_FEATURES MBEDTLS_VERSION_FEATURES #endif #if defined MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 #define POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 #endif #if defined MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION #define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION #endif #if defined MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE #define POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE #endif #if defined MBEDTLS_X509_CHECK_KEY_USAGE #define POLARSSL_X509_CHECK_KEY_USAGE MBEDTLS_X509_CHECK_KEY_USAGE #endif #if defined MBEDTLS_X509_CREATE_C #define POLARSSL_X509_CREATE_C MBEDTLS_X509_CREATE_C #endif #if defined MBEDTLS_X509_CRL_PARSE_C #define POLARSSL_X509_CRL_PARSE_C MBEDTLS_X509_CRL_PARSE_C #endif #if defined MBEDTLS_X509_CRT_PARSE_C #define POLARSSL_X509_CRT_PARSE_C MBEDTLS_X509_CRT_PARSE_C #endif #if defined MBEDTLS_X509_CRT_WRITE_C #define POLARSSL_X509_CRT_WRITE_C MBEDTLS_X509_CRT_WRITE_C #endif #if defined MBEDTLS_X509_CSR_PARSE_C #define POLARSSL_X509_CSR_PARSE_C MBEDTLS_X509_CSR_PARSE_C #endif #if defined MBEDTLS_X509_CSR_WRITE_C #define POLARSSL_X509_CSR_WRITE_C MBEDTLS_X509_CSR_WRITE_C #endif #if defined MBEDTLS_X509_MAX_INTERMEDIATE_CA #define POLARSSL_X509_MAX_INTERMEDIATE_CA MBEDTLS_X509_MAX_INTERMEDIATE_CA #endif #if defined MBEDTLS_X509_RSASSA_PSS_SUPPORT #define POLARSSL_X509_RSASSA_PSS_SUPPORT MBEDTLS_X509_RSASSA_PSS_SUPPORT #endif #if defined MBEDTLS_X509_USE_C #define POLARSSL_X509_USE_C MBEDTLS_X509_USE_C #endif #if defined MBEDTLS_XTEA_ALT #define POLARSSL_XTEA_ALT MBEDTLS_XTEA_ALT #endif #if defined MBEDTLS_XTEA_C #define POLARSSL_XTEA_C MBEDTLS_XTEA_C #endif #if defined MBEDTLS_ZLIB_SUPPORT #define POLARSSL_ZLIB_SUPPORT MBEDTLS_ZLIB_SUPPORT #endif /* * Misc names (macros, types, functions, enum constants...) */ #define AES_DECRYPT MBEDTLS_AES_DECRYPT #define AES_ENCRYPT MBEDTLS_AES_ENCRYPT #define ASN1_BIT_STRING MBEDTLS_ASN1_BIT_STRING #define ASN1_BMP_STRING MBEDTLS_ASN1_BMP_STRING #define ASN1_BOOLEAN MBEDTLS_ASN1_BOOLEAN #define ASN1_CHK_ADD MBEDTLS_ASN1_CHK_ADD #define ASN1_CONSTRUCTED MBEDTLS_ASN1_CONSTRUCTED #define ASN1_CONTEXT_SPECIFIC MBEDTLS_ASN1_CONTEXT_SPECIFIC #define ASN1_GENERALIZED_TIME MBEDTLS_ASN1_GENERALIZED_TIME #define ASN1_IA5_STRING MBEDTLS_ASN1_IA5_STRING #define ASN1_INTEGER MBEDTLS_ASN1_INTEGER #define ASN1_NULL MBEDTLS_ASN1_NULL #define ASN1_OCTET_STRING MBEDTLS_ASN1_OCTET_STRING #define ASN1_OID MBEDTLS_ASN1_OID #define ASN1_PRIMITIVE MBEDTLS_ASN1_PRIMITIVE #define ASN1_PRINTABLE_STRING MBEDTLS_ASN1_PRINTABLE_STRING #define ASN1_SEQUENCE MBEDTLS_ASN1_SEQUENCE #define ASN1_SET MBEDTLS_ASN1_SET #define ASN1_T61_STRING MBEDTLS_ASN1_T61_STRING #define ASN1_UNIVERSAL_STRING MBEDTLS_ASN1_UNIVERSAL_STRING #define ASN1_UTC_TIME MBEDTLS_ASN1_UTC_TIME #define ASN1_UTF8_STRING MBEDTLS_ASN1_UTF8_STRING #define BADCERT_CN_MISMATCH MBEDTLS_X509_BADCERT_CN_MISMATCH #define BADCERT_EXPIRED MBEDTLS_X509_BADCERT_EXPIRED #define BADCERT_FUTURE MBEDTLS_X509_BADCERT_FUTURE #define BADCERT_MISSING MBEDTLS_X509_BADCERT_MISSING #define BADCERT_NOT_TRUSTED MBEDTLS_X509_BADCERT_NOT_TRUSTED #define BADCERT_OTHER MBEDTLS_X509_BADCERT_OTHER #define BADCERT_REVOKED MBEDTLS_X509_BADCERT_REVOKED #define BADCERT_SKIP_VERIFY MBEDTLS_X509_BADCERT_SKIP_VERIFY #define BADCRL_EXPIRED MBEDTLS_X509_BADCRL_EXPIRED #define BADCRL_FUTURE MBEDTLS_X509_BADCRL_FUTURE #define BADCRL_NOT_TRUSTED MBEDTLS_X509_BADCRL_NOT_TRUSTED #define BLOWFISH_BLOCKSIZE MBEDTLS_BLOWFISH_BLOCKSIZE #define BLOWFISH_DECRYPT MBEDTLS_BLOWFISH_DECRYPT #define BLOWFISH_ENCRYPT MBEDTLS_BLOWFISH_ENCRYPT #define BLOWFISH_MAX_KEY MBEDTLS_BLOWFISH_MAX_KEY_BITS #define BLOWFISH_MIN_KEY MBEDTLS_BLOWFISH_MIN_KEY_BITS #define BLOWFISH_ROUNDS MBEDTLS_BLOWFISH_ROUNDS #define CAMELLIA_DECRYPT MBEDTLS_CAMELLIA_DECRYPT #define CAMELLIA_ENCRYPT MBEDTLS_CAMELLIA_ENCRYPT #define COLLECT_SIZE MBEDTLS_HAVEGE_COLLECT_SIZE #define CTR_DRBG_BLOCKSIZE MBEDTLS_CTR_DRBG_BLOCKSIZE #define CTR_DRBG_ENTROPY_LEN MBEDTLS_CTR_DRBG_ENTROPY_LEN #define CTR_DRBG_KEYBITS MBEDTLS_CTR_DRBG_KEYBITS #define CTR_DRBG_KEYSIZE MBEDTLS_CTR_DRBG_KEYSIZE #define CTR_DRBG_MAX_INPUT MBEDTLS_CTR_DRBG_MAX_INPUT #define CTR_DRBG_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST #define CTR_DRBG_MAX_SEED_INPUT MBEDTLS_CTR_DRBG_MAX_SEED_INPUT #define CTR_DRBG_PR_OFF MBEDTLS_CTR_DRBG_PR_OFF #define CTR_DRBG_PR_ON MBEDTLS_CTR_DRBG_PR_ON #define CTR_DRBG_RESEED_INTERVAL MBEDTLS_CTR_DRBG_RESEED_INTERVAL #define CTR_DRBG_SEEDLEN MBEDTLS_CTR_DRBG_SEEDLEN #define DEPRECATED MBEDTLS_DEPRECATED #define DES_DECRYPT MBEDTLS_DES_DECRYPT #define DES_ENCRYPT MBEDTLS_DES_ENCRYPT #define DES_KEY_SIZE MBEDTLS_DES_KEY_SIZE #define ENTROPY_BLOCK_SIZE MBEDTLS_ENTROPY_BLOCK_SIZE #define ENTROPY_MAX_GATHER MBEDTLS_ENTROPY_MAX_GATHER #define ENTROPY_MAX_SEED_SIZE MBEDTLS_ENTROPY_MAX_SEED_SIZE #define ENTROPY_MAX_SOURCES MBEDTLS_ENTROPY_MAX_SOURCES #define ENTROPY_MIN_HARDCLOCK MBEDTLS_ENTROPY_MIN_HARDCLOCK #define ENTROPY_MIN_HAVEGE MBEDTLS_ENTROPY_MIN_HAVEGE #define ENTROPY_MIN_PLATFORM MBEDTLS_ENTROPY_MIN_PLATFORM #define ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_SOURCE_MANUAL #define EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER #define EXT_BASIC_CONSTRAINTS MBEDTLS_X509_EXT_BASIC_CONSTRAINTS #define EXT_CERTIFICATE_POLICIES MBEDTLS_X509_EXT_CERTIFICATE_POLICIES #define EXT_CRL_DISTRIBUTION_POINTS MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS #define EXT_EXTENDED_KEY_USAGE MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE #define EXT_FRESHEST_CRL MBEDTLS_X509_EXT_FRESHEST_CRL #define EXT_INIHIBIT_ANYPOLICY MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY #define EXT_ISSUER_ALT_NAME MBEDTLS_X509_EXT_ISSUER_ALT_NAME #define EXT_KEY_USAGE MBEDTLS_X509_EXT_KEY_USAGE #define EXT_NAME_CONSTRAINTS MBEDTLS_X509_EXT_NAME_CONSTRAINTS #define EXT_NS_CERT_TYPE MBEDTLS_X509_EXT_NS_CERT_TYPE #define EXT_POLICY_CONSTRAINTS MBEDTLS_X509_EXT_POLICY_CONSTRAINTS #define EXT_POLICY_MAPPINGS MBEDTLS_X509_EXT_POLICY_MAPPINGS #define EXT_SUBJECT_ALT_NAME MBEDTLS_X509_EXT_SUBJECT_ALT_NAME #define EXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS #define EXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER #define GCM_DECRYPT MBEDTLS_GCM_DECRYPT #define GCM_ENCRYPT MBEDTLS_GCM_ENCRYPT #define KU_CRL_SIGN MBEDTLS_X509_KU_CRL_SIGN #define KU_DATA_ENCIPHERMENT MBEDTLS_X509_KU_DATA_ENCIPHERMENT #define KU_DIGITAL_SIGNATURE MBEDTLS_X509_KU_DIGITAL_SIGNATURE #define KU_KEY_AGREEMENT MBEDTLS_X509_KU_KEY_AGREEMENT #define KU_KEY_CERT_SIGN MBEDTLS_X509_KU_KEY_CERT_SIGN #define KU_KEY_ENCIPHERMENT MBEDTLS_X509_KU_KEY_ENCIPHERMENT #define KU_NON_REPUDIATION MBEDTLS_X509_KU_NON_REPUDIATION #define LN_2_DIV_LN_10_SCALE100 MBEDTLS_LN_2_DIV_LN_10_SCALE100 #define MEMORY_VERIFY_ALLOC MBEDTLS_MEMORY_VERIFY_ALLOC #define MEMORY_VERIFY_ALWAYS MBEDTLS_MEMORY_VERIFY_ALWAYS #define MEMORY_VERIFY_FREE MBEDTLS_MEMORY_VERIFY_FREE #define MEMORY_VERIFY_NONE MBEDTLS_MEMORY_VERIFY_NONE #define MPI_CHK MBEDTLS_MPI_CHK #define NET_PROTO_TCP MBEDTLS_NET_PROTO_TCP #define NET_PROTO_UDP MBEDTLS_NET_PROTO_UDP #define NS_CERT_TYPE_EMAIL MBEDTLS_X509_NS_CERT_TYPE_EMAIL #define NS_CERT_TYPE_EMAIL_CA MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA #define NS_CERT_TYPE_OBJECT_SIGNING MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING #define NS_CERT_TYPE_OBJECT_SIGNING_CA MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA #define NS_CERT_TYPE_RESERVED MBEDTLS_X509_NS_CERT_TYPE_RESERVED #define NS_CERT_TYPE_SSL_CA MBEDTLS_X509_NS_CERT_TYPE_SSL_CA #define NS_CERT_TYPE_SSL_CLIENT MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT #define NS_CERT_TYPE_SSL_SERVER MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER #define OID_ANSI_X9_62 MBEDTLS_OID_ANSI_X9_62 #define OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE #define OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD #define OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62_SIG #define OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 #define OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE #define OID_AT MBEDTLS_OID_AT #define OID_AT_CN MBEDTLS_OID_AT_CN #define OID_AT_COUNTRY MBEDTLS_OID_AT_COUNTRY #define OID_AT_DN_QUALIFIER MBEDTLS_OID_AT_DN_QUALIFIER #define OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT_GENERATION_QUALIFIER #define OID_AT_GIVEN_NAME MBEDTLS_OID_AT_GIVEN_NAME #define OID_AT_INITIALS MBEDTLS_OID_AT_INITIALS #define OID_AT_LOCALITY MBEDTLS_OID_AT_LOCALITY #define OID_AT_ORGANIZATION MBEDTLS_OID_AT_ORGANIZATION #define OID_AT_ORG_UNIT MBEDTLS_OID_AT_ORG_UNIT #define OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT_POSTAL_ADDRESS #define OID_AT_POSTAL_CODE MBEDTLS_OID_AT_POSTAL_CODE #define OID_AT_PSEUDONYM MBEDTLS_OID_AT_PSEUDONYM #define OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT_SERIAL_NUMBER #define OID_AT_STATE MBEDTLS_OID_AT_STATE #define OID_AT_SUR_NAME MBEDTLS_OID_AT_SUR_NAME #define OID_AT_TITLE MBEDTLS_OID_AT_TITLE #define OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT_UNIQUE_IDENTIFIER #define OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER #define OID_BASIC_CONSTRAINTS MBEDTLS_OID_BASIC_CONSTRAINTS #define OID_CERTICOM MBEDTLS_OID_CERTICOM #define OID_CERTIFICATE_POLICIES MBEDTLS_OID_CERTIFICATE_POLICIES #define OID_CLIENT_AUTH MBEDTLS_OID_CLIENT_AUTH #define OID_CMP MBEDTLS_OID_CMP #define OID_CODE_SIGNING MBEDTLS_OID_CODE_SIGNING #define OID_COUNTRY_US MBEDTLS_OID_COUNTRY_US #define OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_CRL_DISTRIBUTION_POINTS #define OID_CRL_NUMBER MBEDTLS_OID_CRL_NUMBER #define OID_DES_CBC MBEDTLS_OID_DES_CBC #define OID_DES_EDE3_CBC MBEDTLS_OID_DES_EDE3_CBC #define OID_DIGEST_ALG_MD2 MBEDTLS_OID_DIGEST_ALG_MD2 #define OID_DIGEST_ALG_MD4 MBEDTLS_OID_DIGEST_ALG_MD4 #define OID_DIGEST_ALG_MD5 MBEDTLS_OID_DIGEST_ALG_MD5 #define OID_DIGEST_ALG_SHA1 MBEDTLS_OID_DIGEST_ALG_SHA1 #define OID_DIGEST_ALG_SHA224 MBEDTLS_OID_DIGEST_ALG_SHA224 #define OID_DIGEST_ALG_SHA256 MBEDTLS_OID_DIGEST_ALG_SHA256 #define OID_DIGEST_ALG_SHA384 MBEDTLS_OID_DIGEST_ALG_SHA384 #define OID_DIGEST_ALG_SHA512 MBEDTLS_OID_DIGEST_ALG_SHA512 #define OID_DOMAIN_COMPONENT MBEDTLS_OID_DOMAIN_COMPONENT #define OID_ECDSA_SHA1 MBEDTLS_OID_ECDSA_SHA1 #define OID_ECDSA_SHA224 MBEDTLS_OID_ECDSA_SHA224 #define OID_ECDSA_SHA256 MBEDTLS_OID_ECDSA_SHA256 #define OID_ECDSA_SHA384 MBEDTLS_OID_ECDSA_SHA384 #define OID_ECDSA_SHA512 MBEDTLS_OID_ECDSA_SHA512 #define OID_EC_ALG_ECDH MBEDTLS_OID_EC_ALG_ECDH #define OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_EC_ALG_UNRESTRICTED #define OID_EC_BRAINPOOL_V1 MBEDTLS_OID_EC_BRAINPOOL_V1 #define OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_GRP_BP256R1 #define OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_GRP_BP384R1 #define OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_GRP_BP512R1 #define OID_EC_GRP_SECP192K1 MBEDTLS_OID_EC_GRP_SECP192K1 #define OID_EC_GRP_SECP192R1 MBEDTLS_OID_EC_GRP_SECP192R1 #define OID_EC_GRP_SECP224K1 MBEDTLS_OID_EC_GRP_SECP224K1 #define OID_EC_GRP_SECP224R1 MBEDTLS_OID_EC_GRP_SECP224R1 #define OID_EC_GRP_SECP256K1 MBEDTLS_OID_EC_GRP_SECP256K1 #define OID_EC_GRP_SECP256R1 MBEDTLS_OID_EC_GRP_SECP256R1 #define OID_EC_GRP_SECP384R1 MBEDTLS_OID_EC_GRP_SECP384R1 #define OID_EC_GRP_SECP521R1 MBEDTLS_OID_EC_GRP_SECP521R1 #define OID_EMAIL_PROTECTION MBEDTLS_OID_EMAIL_PROTECTION #define OID_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE #define OID_FRESHEST_CRL MBEDTLS_OID_FRESHEST_CRL #define OID_GOV MBEDTLS_OID_GOV #define OID_HMAC_SHA1 MBEDTLS_OID_HMAC_SHA1 #define OID_ID_CE MBEDTLS_OID_ID_CE #define OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_INIHIBIT_ANYPOLICY #define OID_ISO_CCITT_DS MBEDTLS_OID_ISO_CCITT_DS #define OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ISO_IDENTIFIED_ORG #define OID_ISO_ITU_COUNTRY MBEDTLS_OID_ISO_ITU_COUNTRY #define OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_US_ORG #define OID_ISO_MEMBER_BODIES MBEDTLS_OID_ISO_MEMBER_BODIES #define OID_ISSUER_ALT_NAME MBEDTLS_OID_ISSUER_ALT_NAME #define OID_KEY_USAGE MBEDTLS_OID_KEY_USAGE #define OID_KP MBEDTLS_OID_KP #define OID_MGF1 MBEDTLS_OID_MGF1 #define OID_NAME_CONSTRAINTS MBEDTLS_OID_NAME_CONSTRAINTS #define OID_NETSCAPE MBEDTLS_OID_NETSCAPE #define OID_NS_BASE_URL MBEDTLS_OID_NS_BASE_URL #define OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CA_POLICY_URL #define OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CA_REVOCATION_URL #define OID_NS_CERT MBEDTLS_OID_NS_CERT #define OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_CERT_SEQUENCE #define OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT_TYPE #define OID_NS_COMMENT MBEDTLS_OID_NS_COMMENT #define OID_NS_DATA_TYPE MBEDTLS_OID_NS_DATA_TYPE #define OID_NS_RENEWAL_URL MBEDTLS_OID_NS_RENEWAL_URL #define OID_NS_REVOCATION_URL MBEDTLS_OID_NS_REVOCATION_URL #define OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_SSL_SERVER_NAME #define OID_OCSP_SIGNING MBEDTLS_OID_OCSP_SIGNING #define OID_OIW_SECSIG MBEDTLS_OID_OIW_SECSIG #define OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG_ALG #define OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_SHA1 #define OID_ORGANIZATION MBEDTLS_OID_ORGANIZATION #define OID_ORG_ANSI_X9_62 MBEDTLS_OID_ORG_ANSI_X9_62 #define OID_ORG_CERTICOM MBEDTLS_OID_ORG_CERTICOM #define OID_ORG_DOD MBEDTLS_OID_ORG_DOD #define OID_ORG_GOV MBEDTLS_OID_ORG_GOV #define OID_ORG_NETSCAPE MBEDTLS_OID_ORG_NETSCAPE #define OID_ORG_OIW MBEDTLS_OID_ORG_OIW #define OID_ORG_RSA_DATA_SECURITY MBEDTLS_OID_ORG_RSA_DATA_SECURITY #define OID_ORG_TELETRUST MBEDTLS_OID_ORG_TELETRUST #define OID_PKCS MBEDTLS_OID_PKCS #define OID_PKCS1 MBEDTLS_OID_PKCS1 #define OID_PKCS12 MBEDTLS_OID_PKCS12 #define OID_PKCS12_PBE MBEDTLS_OID_PKCS12_PBE #define OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC #define OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC #define OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC #define OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC #define OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 #define OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 #define OID_PKCS1_MD2 MBEDTLS_OID_PKCS1_MD2 #define OID_PKCS1_MD4 MBEDTLS_OID_PKCS1_MD4 #define OID_PKCS1_MD5 MBEDTLS_OID_PKCS1_MD5 #define OID_PKCS1_RSA MBEDTLS_OID_PKCS1_RSA #define OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1_SHA1 #define OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1_SHA224 #define OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1_SHA256 #define OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1_SHA384 #define OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1_SHA512 #define OID_PKCS5 MBEDTLS_OID_PKCS5 #define OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5_PBES2 #define OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC #define OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC #define OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC #define OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC #define OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC #define OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC #define OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5_PBKDF2 #define OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5_PBMAC1 #define OID_PKCS9 MBEDTLS_OID_PKCS9 #define OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9_CSR_EXT_REQ #define OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9_EMAIL #define OID_PKIX MBEDTLS_OID_PKIX #define OID_POLICY_CONSTRAINTS MBEDTLS_OID_POLICY_CONSTRAINTS #define OID_POLICY_MAPPINGS MBEDTLS_OID_POLICY_MAPPINGS #define OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD #define OID_RSASSA_PSS MBEDTLS_OID_RSASSA_PSS #define OID_RSA_COMPANY MBEDTLS_OID_RSA_COMPANY #define OID_RSA_SHA_OBS MBEDTLS_OID_RSA_SHA_OBS #define OID_SERVER_AUTH MBEDTLS_OID_SERVER_AUTH #define OID_SIZE MBEDTLS_OID_SIZE #define OID_SUBJECT_ALT_NAME MBEDTLS_OID_SUBJECT_ALT_NAME #define OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS #define OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER #define OID_TELETRUST MBEDTLS_OID_TELETRUST #define OID_TIME_STAMPING MBEDTLS_OID_TIME_STAMPING #define PADLOCK_ACE MBEDTLS_PADLOCK_ACE #define PADLOCK_ALIGN16 MBEDTLS_PADLOCK_ALIGN16 #define PADLOCK_PHE MBEDTLS_PADLOCK_PHE #define PADLOCK_PMM MBEDTLS_PADLOCK_PMM #define PADLOCK_RNG MBEDTLS_PADLOCK_RNG #define PKCS12_DERIVE_IV MBEDTLS_PKCS12_DERIVE_IV #define PKCS12_DERIVE_KEY MBEDTLS_PKCS12_DERIVE_KEY #define PKCS12_DERIVE_MAC_KEY MBEDTLS_PKCS12_DERIVE_MAC_KEY #define PKCS12_PBE_DECRYPT MBEDTLS_PKCS12_PBE_DECRYPT #define PKCS12_PBE_ENCRYPT MBEDTLS_PKCS12_PBE_ENCRYPT #define PKCS5_DECRYPT MBEDTLS_PKCS5_DECRYPT #define PKCS5_ENCRYPT MBEDTLS_PKCS5_ENCRYPT #define POLARSSL_AESNI_AES MBEDTLS_AESNI_AES #define POLARSSL_AESNI_CLMUL MBEDTLS_AESNI_CLMUL #define POLARSSL_AESNI_H MBEDTLS_AESNI_H #define POLARSSL_AES_H MBEDTLS_AES_H #define POLARSSL_ARC4_H MBEDTLS_ARC4_H #define POLARSSL_ASN1_H MBEDTLS_ASN1_H #define POLARSSL_ASN1_WRITE_H MBEDTLS_ASN1_WRITE_H #define POLARSSL_BASE64_H MBEDTLS_BASE64_H #define POLARSSL_BIGNUM_H MBEDTLS_BIGNUM_H #define POLARSSL_BLOWFISH_H MBEDTLS_BLOWFISH_H #define POLARSSL_BN_MUL_H MBEDTLS_BN_MUL_H #define POLARSSL_CAMELLIA_H MBEDTLS_CAMELLIA_H #define POLARSSL_CCM_H MBEDTLS_CCM_H #define POLARSSL_CERTS_H MBEDTLS_CERTS_H #define POLARSSL_CHECK_CONFIG_H MBEDTLS_CHECK_CONFIG_H #define POLARSSL_CIPHERSUITE_NODTLS MBEDTLS_CIPHERSUITE_NODTLS #define POLARSSL_CIPHERSUITE_SHORT_TAG MBEDTLS_CIPHERSUITE_SHORT_TAG #define POLARSSL_CIPHERSUITE_WEAK MBEDTLS_CIPHERSUITE_WEAK #define POLARSSL_CIPHER_AES_128_CBC MBEDTLS_CIPHER_AES_128_CBC #define POLARSSL_CIPHER_AES_128_CCM MBEDTLS_CIPHER_AES_128_CCM #define POLARSSL_CIPHER_AES_128_CFB128 MBEDTLS_CIPHER_AES_128_CFB128 #define POLARSSL_CIPHER_AES_128_CTR MBEDTLS_CIPHER_AES_128_CTR #define POLARSSL_CIPHER_AES_128_ECB MBEDTLS_CIPHER_AES_128_ECB #define POLARSSL_CIPHER_AES_128_GCM MBEDTLS_CIPHER_AES_128_GCM #define POLARSSL_CIPHER_AES_192_CBC MBEDTLS_CIPHER_AES_192_CBC #define POLARSSL_CIPHER_AES_192_CCM MBEDTLS_CIPHER_AES_192_CCM #define POLARSSL_CIPHER_AES_192_CFB128 MBEDTLS_CIPHER_AES_192_CFB128 #define POLARSSL_CIPHER_AES_192_CTR MBEDTLS_CIPHER_AES_192_CTR #define POLARSSL_CIPHER_AES_192_ECB MBEDTLS_CIPHER_AES_192_ECB #define POLARSSL_CIPHER_AES_192_GCM MBEDTLS_CIPHER_AES_192_GCM #define POLARSSL_CIPHER_AES_256_CBC MBEDTLS_CIPHER_AES_256_CBC #define POLARSSL_CIPHER_AES_256_CCM MBEDTLS_CIPHER_AES_256_CCM #define POLARSSL_CIPHER_AES_256_CFB128 MBEDTLS_CIPHER_AES_256_CFB128 #define POLARSSL_CIPHER_AES_256_CTR MBEDTLS_CIPHER_AES_256_CTR #define POLARSSL_CIPHER_AES_256_ECB MBEDTLS_CIPHER_AES_256_ECB #define POLARSSL_CIPHER_AES_256_GCM MBEDTLS_CIPHER_AES_256_GCM #define POLARSSL_CIPHER_ARC4_128 MBEDTLS_CIPHER_ARC4_128 #define POLARSSL_CIPHER_BLOWFISH_CBC MBEDTLS_CIPHER_BLOWFISH_CBC #define POLARSSL_CIPHER_BLOWFISH_CFB64 MBEDTLS_CIPHER_BLOWFISH_CFB64 #define POLARSSL_CIPHER_BLOWFISH_CTR MBEDTLS_CIPHER_BLOWFISH_CTR #define POLARSSL_CIPHER_BLOWFISH_ECB MBEDTLS_CIPHER_BLOWFISH_ECB #define POLARSSL_CIPHER_CAMELLIA_128_CBC MBEDTLS_CIPHER_CAMELLIA_128_CBC #define POLARSSL_CIPHER_CAMELLIA_128_CCM MBEDTLS_CIPHER_CAMELLIA_128_CCM #define POLARSSL_CIPHER_CAMELLIA_128_CFB128 MBEDTLS_CIPHER_CAMELLIA_128_CFB128 #define POLARSSL_CIPHER_CAMELLIA_128_CTR MBEDTLS_CIPHER_CAMELLIA_128_CTR #define POLARSSL_CIPHER_CAMELLIA_128_ECB MBEDTLS_CIPHER_CAMELLIA_128_ECB #define POLARSSL_CIPHER_CAMELLIA_128_GCM MBEDTLS_CIPHER_CAMELLIA_128_GCM #define POLARSSL_CIPHER_CAMELLIA_192_CBC MBEDTLS_CIPHER_CAMELLIA_192_CBC #define POLARSSL_CIPHER_CAMELLIA_192_CCM MBEDTLS_CIPHER_CAMELLIA_192_CCM #define POLARSSL_CIPHER_CAMELLIA_192_CFB128 MBEDTLS_CIPHER_CAMELLIA_192_CFB128 #define POLARSSL_CIPHER_CAMELLIA_192_CTR MBEDTLS_CIPHER_CAMELLIA_192_CTR #define POLARSSL_CIPHER_CAMELLIA_192_ECB MBEDTLS_CIPHER_CAMELLIA_192_ECB #define POLARSSL_CIPHER_CAMELLIA_192_GCM MBEDTLS_CIPHER_CAMELLIA_192_GCM #define POLARSSL_CIPHER_CAMELLIA_256_CBC MBEDTLS_CIPHER_CAMELLIA_256_CBC #define POLARSSL_CIPHER_CAMELLIA_256_CCM MBEDTLS_CIPHER_CAMELLIA_256_CCM #define POLARSSL_CIPHER_CAMELLIA_256_CFB128 MBEDTLS_CIPHER_CAMELLIA_256_CFB128 #define POLARSSL_CIPHER_CAMELLIA_256_CTR MBEDTLS_CIPHER_CAMELLIA_256_CTR #define POLARSSL_CIPHER_CAMELLIA_256_ECB MBEDTLS_CIPHER_CAMELLIA_256_ECB #define POLARSSL_CIPHER_CAMELLIA_256_GCM MBEDTLS_CIPHER_CAMELLIA_256_GCM #define POLARSSL_CIPHER_DES_CBC MBEDTLS_CIPHER_DES_CBC #define POLARSSL_CIPHER_DES_ECB MBEDTLS_CIPHER_DES_ECB #define POLARSSL_CIPHER_DES_EDE3_CBC MBEDTLS_CIPHER_DES_EDE3_CBC #define POLARSSL_CIPHER_DES_EDE3_ECB MBEDTLS_CIPHER_DES_EDE3_ECB #define POLARSSL_CIPHER_DES_EDE_CBC MBEDTLS_CIPHER_DES_EDE_CBC #define POLARSSL_CIPHER_DES_EDE_ECB MBEDTLS_CIPHER_DES_EDE_ECB #define POLARSSL_CIPHER_H MBEDTLS_CIPHER_H #define POLARSSL_CIPHER_ID_3DES MBEDTLS_CIPHER_ID_3DES #define POLARSSL_CIPHER_ID_AES MBEDTLS_CIPHER_ID_AES #define POLARSSL_CIPHER_ID_ARC4 MBEDTLS_CIPHER_ID_ARC4 #define POLARSSL_CIPHER_ID_BLOWFISH MBEDTLS_CIPHER_ID_BLOWFISH #define POLARSSL_CIPHER_ID_CAMELLIA MBEDTLS_CIPHER_ID_CAMELLIA #define POLARSSL_CIPHER_ID_DES MBEDTLS_CIPHER_ID_DES #define POLARSSL_CIPHER_ID_NONE MBEDTLS_CIPHER_ID_NONE #define POLARSSL_CIPHER_ID_NULL MBEDTLS_CIPHER_ID_NULL #define POLARSSL_CIPHER_MODE_AEAD MBEDTLS_CIPHER_MODE_AEAD #define POLARSSL_CIPHER_MODE_STREAM MBEDTLS_CIPHER_MODE_STREAM #define POLARSSL_CIPHER_MODE_WITH_PADDING MBEDTLS_CIPHER_MODE_WITH_PADDING #define POLARSSL_CIPHER_NONE MBEDTLS_CIPHER_NONE #define POLARSSL_CIPHER_NULL MBEDTLS_CIPHER_NULL #define POLARSSL_CIPHER_VARIABLE_IV_LEN MBEDTLS_CIPHER_VARIABLE_IV_LEN #define POLARSSL_CIPHER_VARIABLE_KEY_LEN MBEDTLS_CIPHER_VARIABLE_KEY_LEN #define POLARSSL_CIPHER_WRAP_H MBEDTLS_CIPHER_WRAP_H #define POLARSSL_CONFIG_H MBEDTLS_CONFIG_H #define POLARSSL_CTR_DRBG_H MBEDTLS_CTR_DRBG_H #define POLARSSL_DEBUG_H MBEDTLS_DEBUG_H #define POLARSSL_DECRYPT MBEDTLS_DECRYPT #define POLARSSL_DES_H MBEDTLS_DES_H #define POLARSSL_DHM_H MBEDTLS_DHM_H #define POLARSSL_DHM_RFC3526_MODP_2048_G MBEDTLS_DHM_RFC3526_MODP_2048_G #define POLARSSL_DHM_RFC3526_MODP_2048_P MBEDTLS_DHM_RFC3526_MODP_2048_P #define POLARSSL_DHM_RFC3526_MODP_3072_G MBEDTLS_DHM_RFC3526_MODP_3072_G #define POLARSSL_DHM_RFC3526_MODP_3072_P MBEDTLS_DHM_RFC3526_MODP_3072_P #define POLARSSL_DHM_RFC5114_MODP_2048_G MBEDTLS_DHM_RFC5114_MODP_2048_G #define POLARSSL_DHM_RFC5114_MODP_2048_P MBEDTLS_DHM_RFC5114_MODP_2048_P #define POLARSSL_ECDH_H MBEDTLS_ECDH_H #define POLARSSL_ECDH_OURS MBEDTLS_ECDH_OURS #define POLARSSL_ECDH_THEIRS MBEDTLS_ECDH_THEIRS #define POLARSSL_ECDSA_H MBEDTLS_ECDSA_H #define POLARSSL_ECP_DP_BP256R1 MBEDTLS_ECP_DP_BP256R1 #define POLARSSL_ECP_DP_BP384R1 MBEDTLS_ECP_DP_BP384R1 #define POLARSSL_ECP_DP_BP512R1 MBEDTLS_ECP_DP_BP512R1 #define POLARSSL_ECP_DP_M255 MBEDTLS_ECP_DP_CURVE25519 #define POLARSSL_ECP_DP_MAX MBEDTLS_ECP_DP_MAX #define POLARSSL_ECP_DP_NONE MBEDTLS_ECP_DP_NONE #define POLARSSL_ECP_DP_SECP192K1 MBEDTLS_ECP_DP_SECP192K1 #define POLARSSL_ECP_DP_SECP192R1 MBEDTLS_ECP_DP_SECP192R1 #define POLARSSL_ECP_DP_SECP224K1 MBEDTLS_ECP_DP_SECP224K1 #define POLARSSL_ECP_DP_SECP224R1 MBEDTLS_ECP_DP_SECP224R1 #define POLARSSL_ECP_DP_SECP256K1 MBEDTLS_ECP_DP_SECP256K1 #define POLARSSL_ECP_DP_SECP256R1 MBEDTLS_ECP_DP_SECP256R1 #define POLARSSL_ECP_DP_SECP384R1 MBEDTLS_ECP_DP_SECP384R1 #define POLARSSL_ECP_DP_SECP521R1 MBEDTLS_ECP_DP_SECP521R1 #define POLARSSL_ECP_H MBEDTLS_ECP_H #define POLARSSL_ECP_MAX_BYTES MBEDTLS_ECP_MAX_BYTES #define POLARSSL_ECP_MAX_PT_LEN MBEDTLS_ECP_MAX_PT_LEN #define POLARSSL_ECP_PF_COMPRESSED MBEDTLS_ECP_PF_COMPRESSED #define POLARSSL_ECP_PF_UNCOMPRESSED MBEDTLS_ECP_PF_UNCOMPRESSED #define POLARSSL_ECP_TLS_NAMED_CURVE MBEDTLS_ECP_TLS_NAMED_CURVE #define POLARSSL_ENCRYPT MBEDTLS_ENCRYPT #define POLARSSL_ENTROPY_H MBEDTLS_ENTROPY_H #define POLARSSL_ENTROPY_POLL_H MBEDTLS_ENTROPY_POLL_H #define POLARSSL_ENTROPY_SHA256_ACCUMULATOR MBEDTLS_ENTROPY_SHA256_ACCUMULATOR #define POLARSSL_ENTROPY_SHA512_ACCUMULATOR MBEDTLS_ENTROPY_SHA512_ACCUMULATOR #define POLARSSL_ERROR_H MBEDTLS_ERROR_H #define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH #define POLARSSL_ERR_AES_INVALID_KEY_LENGTH MBEDTLS_ERR_AES_INVALID_KEY_LENGTH #define POLARSSL_ERR_ASN1_BUF_TOO_SMALL MBEDTLS_ERR_ASN1_BUF_TOO_SMALL #define POLARSSL_ERR_ASN1_INVALID_DATA MBEDTLS_ERR_ASN1_INVALID_DATA #define POLARSSL_ERR_ASN1_INVALID_LENGTH MBEDTLS_ERR_ASN1_INVALID_LENGTH #define POLARSSL_ERR_ASN1_LENGTH_MISMATCH MBEDTLS_ERR_ASN1_LENGTH_MISMATCH #define POLARSSL_ERR_ASN1_MALLOC_FAILED MBEDTLS_ERR_ASN1_ALLOC_FAILED #define POLARSSL_ERR_ASN1_OUT_OF_DATA MBEDTLS_ERR_ASN1_OUT_OF_DATA #define POLARSSL_ERR_ASN1_UNEXPECTED_TAG MBEDTLS_ERR_ASN1_UNEXPECTED_TAG #define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL #define POLARSSL_ERR_BASE64_INVALID_CHARACTER MBEDTLS_ERR_BASE64_INVALID_CHARACTER #define POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH #define POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH #define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH #define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH #define POLARSSL_ERR_CCM_AUTH_FAILED MBEDTLS_ERR_CCM_AUTH_FAILED #define POLARSSL_ERR_CCM_BAD_INPUT MBEDTLS_ERR_CCM_BAD_INPUT #define POLARSSL_ERR_CIPHER_ALLOC_FAILED MBEDTLS_ERR_CIPHER_ALLOC_FAILED #define POLARSSL_ERR_CIPHER_AUTH_FAILED MBEDTLS_ERR_CIPHER_AUTH_FAILED #define POLARSSL_ERR_CIPHER_BAD_INPUT_DATA MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA #define POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE #define POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED #define POLARSSL_ERR_CIPHER_INVALID_PADDING MBEDTLS_ERR_CIPHER_INVALID_PADDING #define POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED #define POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR #define POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG #define POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG #define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH #define POLARSSL_ERR_DHM_BAD_INPUT_DATA MBEDTLS_ERR_DHM_BAD_INPUT_DATA #define POLARSSL_ERR_DHM_CALC_SECRET_FAILED MBEDTLS_ERR_DHM_CALC_SECRET_FAILED #define POLARSSL_ERR_DHM_FILE_IO_ERROR MBEDTLS_ERR_DHM_FILE_IO_ERROR #define POLARSSL_ERR_DHM_INVALID_FORMAT MBEDTLS_ERR_DHM_INVALID_FORMAT #define POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED #define POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED #define POLARSSL_ERR_DHM_MALLOC_FAILED MBEDTLS_ERR_DHM_ALLOC_FAILED #define POLARSSL_ERR_DHM_READ_PARAMS_FAILED MBEDTLS_ERR_DHM_READ_PARAMS_FAILED #define POLARSSL_ERR_DHM_READ_PUBLIC_FAILED MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED #define POLARSSL_ERR_ECP_BAD_INPUT_DATA MBEDTLS_ERR_ECP_BAD_INPUT_DATA #define POLARSSL_ERR_ECP_BUFFER_TOO_SMALL MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL #define POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE #define POLARSSL_ERR_ECP_INVALID_KEY MBEDTLS_ERR_ECP_INVALID_KEY #define POLARSSL_ERR_ECP_MALLOC_FAILED MBEDTLS_ERR_ECP_ALLOC_FAILED #define POLARSSL_ERR_ECP_RANDOM_FAILED MBEDTLS_ERR_ECP_RANDOM_FAILED #define POLARSSL_ERR_ECP_SIG_LEN_MISMATCH MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH #define POLARSSL_ERR_ECP_VERIFY_FAILED MBEDTLS_ERR_ECP_VERIFY_FAILED #define POLARSSL_ERR_ENTROPY_FILE_IO_ERROR MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR #define POLARSSL_ERR_ENTROPY_MAX_SOURCES MBEDTLS_ERR_ENTROPY_MAX_SOURCES #define POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED #define POLARSSL_ERR_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_ENTROPY_SOURCE_FAILED #define POLARSSL_ERR_GCM_AUTH_FAILED MBEDTLS_ERR_GCM_AUTH_FAILED #define POLARSSL_ERR_GCM_BAD_INPUT MBEDTLS_ERR_GCM_BAD_INPUT #define POLARSSL_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED #define POLARSSL_ERR_HMAC_DRBG_FILE_IO_ERROR MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR #define POLARSSL_ERR_HMAC_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG #define POLARSSL_ERR_HMAC_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG #define POLARSSL_ERR_MD_ALLOC_FAILED MBEDTLS_ERR_MD_ALLOC_FAILED #define POLARSSL_ERR_MD_BAD_INPUT_DATA MBEDTLS_ERR_MD_BAD_INPUT_DATA #define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE #define POLARSSL_ERR_MD_FILE_IO_ERROR MBEDTLS_ERR_MD_FILE_IO_ERROR #define POLARSSL_ERR_MPI_BAD_INPUT_DATA MBEDTLS_ERR_MPI_BAD_INPUT_DATA #define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL #define POLARSSL_ERR_MPI_DIVISION_BY_ZERO MBEDTLS_ERR_MPI_DIVISION_BY_ZERO #define POLARSSL_ERR_MPI_FILE_IO_ERROR MBEDTLS_ERR_MPI_FILE_IO_ERROR #define POLARSSL_ERR_MPI_INVALID_CHARACTER MBEDTLS_ERR_MPI_INVALID_CHARACTER #define POLARSSL_ERR_MPI_MALLOC_FAILED MBEDTLS_ERR_MPI_ALLOC_FAILED #define POLARSSL_ERR_MPI_NEGATIVE_VALUE MBEDTLS_ERR_MPI_NEGATIVE_VALUE #define POLARSSL_ERR_MPI_NOT_ACCEPTABLE MBEDTLS_ERR_MPI_NOT_ACCEPTABLE #define POLARSSL_ERR_NET_ACCEPT_FAILED MBEDTLS_ERR_NET_ACCEPT_FAILED #define POLARSSL_ERR_NET_BIND_FAILED MBEDTLS_ERR_NET_BIND_FAILED #define POLARSSL_ERR_NET_CONNECT_FAILED MBEDTLS_ERR_NET_CONNECT_FAILED #define POLARSSL_ERR_NET_CONN_RESET MBEDTLS_ERR_NET_CONN_RESET #define POLARSSL_ERR_NET_LISTEN_FAILED MBEDTLS_ERR_NET_LISTEN_FAILED #define POLARSSL_ERR_NET_RECV_FAILED MBEDTLS_ERR_NET_RECV_FAILED #define POLARSSL_ERR_NET_SEND_FAILED MBEDTLS_ERR_NET_SEND_FAILED #define POLARSSL_ERR_NET_SOCKET_FAILED MBEDTLS_ERR_NET_SOCKET_FAILED #define POLARSSL_ERR_NET_TIMEOUT MBEDTLS_ERR_SSL_TIMEOUT #define POLARSSL_ERR_NET_UNKNOWN_HOST MBEDTLS_ERR_NET_UNKNOWN_HOST #define POLARSSL_ERR_NET_WANT_READ MBEDTLS_ERR_SSL_WANT_READ #define POLARSSL_ERR_NET_WANT_WRITE MBEDTLS_ERR_SSL_WANT_WRITE #define POLARSSL_ERR_OID_BUF_TOO_SMALL MBEDTLS_ERR_OID_BUF_TOO_SMALL #define POLARSSL_ERR_OID_NOT_FOUND MBEDTLS_ERR_OID_NOT_FOUND #define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED #define POLARSSL_ERR_PEM_BAD_INPUT_DATA MBEDTLS_ERR_PEM_BAD_INPUT_DATA #define POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PEM_INVALID_DATA MBEDTLS_ERR_PEM_INVALID_DATA #define POLARSSL_ERR_PEM_INVALID_ENC_IV MBEDTLS_ERR_PEM_INVALID_ENC_IV #define POLARSSL_ERR_PEM_MALLOC_FAILED MBEDTLS_ERR_PEM_ALLOC_FAILED #define POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT #define POLARSSL_ERR_PEM_PASSWORD_MISMATCH MBEDTLS_ERR_PEM_PASSWORD_MISMATCH #define POLARSSL_ERR_PEM_PASSWORD_REQUIRED MBEDTLS_ERR_PEM_PASSWORD_REQUIRED #define POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG #define POLARSSL_ERR_PKCS12_BAD_INPUT_DATA MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA #define POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH #define POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT #define POLARSSL_ERR_PKCS5_BAD_INPUT_DATA MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA #define POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PKCS5_INVALID_FORMAT MBEDTLS_ERR_PKCS5_INVALID_FORMAT #define POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH #define POLARSSL_ERR_PK_BAD_INPUT_DATA MBEDTLS_ERR_PK_BAD_INPUT_DATA #define POLARSSL_ERR_PK_FEATURE_UNAVAILABLE MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PK_FILE_IO_ERROR MBEDTLS_ERR_PK_FILE_IO_ERROR #define POLARSSL_ERR_PK_INVALID_ALG MBEDTLS_ERR_PK_INVALID_ALG #define POLARSSL_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_PK_INVALID_PUBKEY #define POLARSSL_ERR_PK_KEY_INVALID_FORMAT MBEDTLS_ERR_PK_KEY_INVALID_FORMAT #define POLARSSL_ERR_PK_KEY_INVALID_VERSION MBEDTLS_ERR_PK_KEY_INVALID_VERSION #define POLARSSL_ERR_PK_MALLOC_FAILED MBEDTLS_ERR_PK_ALLOC_FAILED #define POLARSSL_ERR_PK_PASSWORD_MISMATCH MBEDTLS_ERR_PK_PASSWORD_MISMATCH #define POLARSSL_ERR_PK_PASSWORD_REQUIRED MBEDTLS_ERR_PK_PASSWORD_REQUIRED #define POLARSSL_ERR_PK_SIG_LEN_MISMATCH MBEDTLS_ERR_PK_SIG_LEN_MISMATCH #define POLARSSL_ERR_PK_TYPE_MISMATCH MBEDTLS_ERR_PK_TYPE_MISMATCH #define POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE #define POLARSSL_ERR_PK_UNKNOWN_PK_ALG MBEDTLS_ERR_PK_UNKNOWN_PK_ALG #define POLARSSL_ERR_RSA_BAD_INPUT_DATA MBEDTLS_ERR_RSA_BAD_INPUT_DATA #define POLARSSL_ERR_RSA_INVALID_PADDING MBEDTLS_ERR_RSA_INVALID_PADDING #define POLARSSL_ERR_RSA_KEY_CHECK_FAILED MBEDTLS_ERR_RSA_KEY_CHECK_FAILED #define POLARSSL_ERR_RSA_KEY_GEN_FAILED MBEDTLS_ERR_RSA_KEY_GEN_FAILED #define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE #define POLARSSL_ERR_RSA_PRIVATE_FAILED MBEDTLS_ERR_RSA_PRIVATE_FAILED #define POLARSSL_ERR_RSA_PUBLIC_FAILED MBEDTLS_ERR_RSA_PUBLIC_FAILED #define POLARSSL_ERR_RSA_RNG_FAILED MBEDTLS_ERR_RSA_RNG_FAILED #define POLARSSL_ERR_RSA_VERIFY_FAILED MBEDTLS_ERR_RSA_VERIFY_FAILED #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY #define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP #define POLARSSL_ERR_SSL_BAD_HS_FINISHED MBEDTLS_ERR_SSL_BAD_HS_FINISHED #define POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET #define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION #define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO #define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE #define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE #define POLARSSL_ERR_SSL_BAD_INPUT_DATA MBEDTLS_ERR_SSL_BAD_INPUT_DATA #define POLARSSL_ERR_SSL_BUFFER_TOO_SMALL MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL #define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED #define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED #define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE #define POLARSSL_ERR_SSL_COMPRESSION_FAILED MBEDTLS_ERR_SSL_COMPRESSION_FAILED #define POLARSSL_ERR_SSL_CONN_EOF MBEDTLS_ERR_SSL_CONN_EOF #define POLARSSL_ERR_SSL_COUNTER_WRAPPING MBEDTLS_ERR_SSL_COUNTER_WRAPPING #define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE #define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE #define POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED #define POLARSSL_ERR_SSL_HW_ACCEL_FAILED MBEDTLS_ERR_SSL_HW_ACCEL_FAILED #define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH #define POLARSSL_ERR_SSL_INTERNAL_ERROR MBEDTLS_ERR_SSL_INTERNAL_ERROR #define POLARSSL_ERR_SSL_INVALID_MAC MBEDTLS_ERR_SSL_INVALID_MAC #define POLARSSL_ERR_SSL_INVALID_RECORD MBEDTLS_ERR_SSL_INVALID_RECORD #define POLARSSL_ERR_SSL_MALLOC_FAILED MBEDTLS_ERR_SSL_ALLOC_FAILED #define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN #define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE #define POLARSSL_ERR_SSL_NO_RNG MBEDTLS_ERR_SSL_NO_RNG #define POLARSSL_ERR_SSL_NO_USABLE_CIPHERSUITE MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE #define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY #define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED #define POLARSSL_ERR_SSL_PK_TYPE_MISMATCH MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH #define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED #define POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED #define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE #define POLARSSL_ERR_SSL_UNKNOWN_CIPHER MBEDTLS_ERR_SSL_UNKNOWN_CIPHER #define POLARSSL_ERR_SSL_UNKNOWN_IDENTITY MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY #define POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO #define POLARSSL_ERR_THREADING_BAD_INPUT_DATA MBEDTLS_ERR_THREADING_BAD_INPUT_DATA #define POLARSSL_ERR_THREADING_FEATURE_UNAVAILABLE MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE #define POLARSSL_ERR_THREADING_MUTEX_ERROR MBEDTLS_ERR_THREADING_MUTEX_ERROR #define POLARSSL_ERR_X509_BAD_INPUT_DATA MBEDTLS_ERR_X509_BAD_INPUT_DATA #define POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT #define POLARSSL_ERR_X509_CERT_VERIFY_FAILED MBEDTLS_ERR_X509_CERT_VERIFY_FAILED #define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE #define POLARSSL_ERR_X509_FILE_IO_ERROR MBEDTLS_ERR_X509_FILE_IO_ERROR #define POLARSSL_ERR_X509_INVALID_ALG MBEDTLS_ERR_X509_INVALID_ALG #define POLARSSL_ERR_X509_INVALID_DATE MBEDTLS_ERR_X509_INVALID_DATE #define POLARSSL_ERR_X509_INVALID_EXTENSIONS MBEDTLS_ERR_X509_INVALID_EXTENSIONS #define POLARSSL_ERR_X509_INVALID_FORMAT MBEDTLS_ERR_X509_INVALID_FORMAT #define POLARSSL_ERR_X509_INVALID_NAME MBEDTLS_ERR_X509_INVALID_NAME #define POLARSSL_ERR_X509_INVALID_SERIAL MBEDTLS_ERR_X509_INVALID_SERIAL #define POLARSSL_ERR_X509_INVALID_SIGNATURE MBEDTLS_ERR_X509_INVALID_SIGNATURE #define POLARSSL_ERR_X509_INVALID_VERSION MBEDTLS_ERR_X509_INVALID_VERSION #define POLARSSL_ERR_X509_MALLOC_FAILED MBEDTLS_ERR_X509_ALLOC_FAILED #define POLARSSL_ERR_X509_SIG_MISMATCH MBEDTLS_ERR_X509_SIG_MISMATCH #define POLARSSL_ERR_X509_UNKNOWN_OID MBEDTLS_ERR_X509_UNKNOWN_OID #define POLARSSL_ERR_X509_UNKNOWN_SIG_ALG MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG #define POLARSSL_ERR_X509_UNKNOWN_VERSION MBEDTLS_ERR_X509_UNKNOWN_VERSION #define POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH #define POLARSSL_GCM_H MBEDTLS_GCM_H #define POLARSSL_HAVEGE_H MBEDTLS_HAVEGE_H #define POLARSSL_HAVE_INT32 MBEDTLS_HAVE_INT32 #define POLARSSL_HAVE_INT64 MBEDTLS_HAVE_INT64 #define POLARSSL_HAVE_UDBL MBEDTLS_HAVE_UDBL #define POLARSSL_HAVE_X86 MBEDTLS_HAVE_X86 #define POLARSSL_HAVE_X86_64 MBEDTLS_HAVE_X86_64 #define POLARSSL_HMAC_DRBG_H MBEDTLS_HMAC_DRBG_H #define POLARSSL_HMAC_DRBG_PR_OFF MBEDTLS_HMAC_DRBG_PR_OFF #define POLARSSL_HMAC_DRBG_PR_ON MBEDTLS_HMAC_DRBG_PR_ON #define POLARSSL_KEY_EXCHANGE_DHE_PSK MBEDTLS_KEY_EXCHANGE_DHE_PSK #define POLARSSL_KEY_EXCHANGE_DHE_RSA MBEDTLS_KEY_EXCHANGE_DHE_RSA #define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA #define POLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK #define POLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA #define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA #define POLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA #define POLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE #define POLARSSL_KEY_EXCHANGE_PSK MBEDTLS_KEY_EXCHANGE_PSK #define POLARSSL_KEY_EXCHANGE_RSA MBEDTLS_KEY_EXCHANGE_RSA #define POLARSSL_KEY_EXCHANGE_RSA_PSK MBEDTLS_KEY_EXCHANGE_RSA_PSK #define POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED #define POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED #define POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED #define POLARSSL_KEY_LENGTH_DES MBEDTLS_KEY_LENGTH_DES #define POLARSSL_KEY_LENGTH_DES_EDE MBEDTLS_KEY_LENGTH_DES_EDE #define POLARSSL_KEY_LENGTH_DES_EDE3 MBEDTLS_KEY_LENGTH_DES_EDE3 #define POLARSSL_KEY_LENGTH_NONE MBEDTLS_KEY_LENGTH_NONE #define POLARSSL_MAX_BLOCK_LENGTH MBEDTLS_MAX_BLOCK_LENGTH #define POLARSSL_MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH #define POLARSSL_MD2_H MBEDTLS_MD2_H #define POLARSSL_MD4_H MBEDTLS_MD4_H #define POLARSSL_MD5_H MBEDTLS_MD5_H #define POLARSSL_MD_H MBEDTLS_MD_H #define POLARSSL_MD_MAX_SIZE MBEDTLS_MD_MAX_SIZE #define POLARSSL_MD_MD2 MBEDTLS_MD_MD2 #define POLARSSL_MD_MD4 MBEDTLS_MD_MD4 #define POLARSSL_MD_MD5 MBEDTLS_MD_MD5 #define POLARSSL_MD_NONE MBEDTLS_MD_NONE #define POLARSSL_MD_RIPEMD160 MBEDTLS_MD_RIPEMD160 #define POLARSSL_MD_SHA1 MBEDTLS_MD_SHA1 #define POLARSSL_MD_SHA224 MBEDTLS_MD_SHA224 #define POLARSSL_MD_SHA256 MBEDTLS_MD_SHA256 #define POLARSSL_MD_SHA384 MBEDTLS_MD_SHA384 #define POLARSSL_MD_SHA512 MBEDTLS_MD_SHA512 #define POLARSSL_MD_WRAP_H MBEDTLS_MD_WRAP_H #define POLARSSL_MEMORY_BUFFER_ALLOC_H MBEDTLS_MEMORY_BUFFER_ALLOC_H #define POLARSSL_MODE_CBC MBEDTLS_MODE_CBC #define POLARSSL_MODE_CCM MBEDTLS_MODE_CCM #define POLARSSL_MODE_CFB MBEDTLS_MODE_CFB #define POLARSSL_MODE_CTR MBEDTLS_MODE_CTR #define POLARSSL_MODE_ECB MBEDTLS_MODE_ECB #define POLARSSL_MODE_GCM MBEDTLS_MODE_GCM #define POLARSSL_MODE_NONE MBEDTLS_MODE_NONE #define POLARSSL_MODE_OFB MBEDTLS_MODE_OFB #define POLARSSL_MODE_STREAM MBEDTLS_MODE_STREAM #define POLARSSL_MPI_MAX_BITS MBEDTLS_MPI_MAX_BITS #define POLARSSL_MPI_MAX_BITS_SCALE100 MBEDTLS_MPI_MAX_BITS_SCALE100 #define POLARSSL_MPI_MAX_LIMBS MBEDTLS_MPI_MAX_LIMBS #define POLARSSL_MPI_RW_BUFFER_SIZE MBEDTLS_MPI_RW_BUFFER_SIZE #define POLARSSL_NET_H MBEDTLS_NET_SOCKETS_H #define POLARSSL_NET_LISTEN_BACKLOG MBEDTLS_NET_LISTEN_BACKLOG #define POLARSSL_OID_H MBEDTLS_OID_H #define POLARSSL_OPERATION_NONE MBEDTLS_OPERATION_NONE #define POLARSSL_PADDING_NONE MBEDTLS_PADDING_NONE #define POLARSSL_PADDING_ONE_AND_ZEROS MBEDTLS_PADDING_ONE_AND_ZEROS #define POLARSSL_PADDING_PKCS7 MBEDTLS_PADDING_PKCS7 #define POLARSSL_PADDING_ZEROS MBEDTLS_PADDING_ZEROS #define POLARSSL_PADDING_ZEROS_AND_LEN MBEDTLS_PADDING_ZEROS_AND_LEN #define POLARSSL_PADLOCK_H MBEDTLS_PADLOCK_H #define POLARSSL_PEM_H MBEDTLS_PEM_H #define POLARSSL_PKCS11_H MBEDTLS_PKCS11_H #define POLARSSL_PKCS12_H MBEDTLS_PKCS12_H #define POLARSSL_PKCS5_H MBEDTLS_PKCS5_H #define POLARSSL_PK_DEBUG_ECP MBEDTLS_PK_DEBUG_ECP #define POLARSSL_PK_DEBUG_MAX_ITEMS MBEDTLS_PK_DEBUG_MAX_ITEMS #define POLARSSL_PK_DEBUG_MPI MBEDTLS_PK_DEBUG_MPI #define POLARSSL_PK_DEBUG_NONE MBEDTLS_PK_DEBUG_NONE #define POLARSSL_PK_ECDSA MBEDTLS_PK_ECDSA #define POLARSSL_PK_ECKEY MBEDTLS_PK_ECKEY #define POLARSSL_PK_ECKEY_DH MBEDTLS_PK_ECKEY_DH #define POLARSSL_PK_H MBEDTLS_PK_H #define POLARSSL_PK_NONE MBEDTLS_PK_NONE #define POLARSSL_PK_RSA MBEDTLS_PK_RSA #define POLARSSL_PK_RSASSA_PSS MBEDTLS_PK_RSASSA_PSS #define POLARSSL_PK_RSA_ALT MBEDTLS_PK_RSA_ALT #define POLARSSL_PK_WRAP_H MBEDTLS_PK_WRAP_H #define POLARSSL_PLATFORM_H MBEDTLS_PLATFORM_H #define POLARSSL_PREMASTER_SIZE MBEDTLS_PREMASTER_SIZE #define POLARSSL_RIPEMD160_H MBEDTLS_RIPEMD160_H #define POLARSSL_RSA_H MBEDTLS_RSA_H #define POLARSSL_SHA1_H MBEDTLS_SHA1_H #define POLARSSL_SHA256_H MBEDTLS_SHA256_H #define POLARSSL_SHA512_H MBEDTLS_SHA512_H #define POLARSSL_SSL_CACHE_H MBEDTLS_SSL_CACHE_H #define POLARSSL_SSL_CIPHERSUITES_H MBEDTLS_SSL_CIPHERSUITES_H #define POLARSSL_SSL_COOKIE_H MBEDTLS_SSL_COOKIE_H #define POLARSSL_SSL_H MBEDTLS_SSL_H #define POLARSSL_THREADING_H MBEDTLS_THREADING_H #define POLARSSL_THREADING_IMPL MBEDTLS_THREADING_IMPL #define POLARSSL_TIMING_H MBEDTLS_TIMING_H #define POLARSSL_VERSION_H MBEDTLS_VERSION_H #define POLARSSL_VERSION_MAJOR MBEDTLS_VERSION_MAJOR #define POLARSSL_VERSION_MINOR MBEDTLS_VERSION_MINOR #define POLARSSL_VERSION_NUMBER MBEDTLS_VERSION_NUMBER #define POLARSSL_VERSION_PATCH MBEDTLS_VERSION_PATCH #define POLARSSL_VERSION_STRING MBEDTLS_VERSION_STRING #define POLARSSL_VERSION_STRING_FULL MBEDTLS_VERSION_STRING_FULL #define POLARSSL_X509_CRL_H MBEDTLS_X509_CRL_H #define POLARSSL_X509_CRT_H MBEDTLS_X509_CRT_H #define POLARSSL_X509_CSR_H MBEDTLS_X509_CSR_H #define POLARSSL_X509_H MBEDTLS_X509_H #define POLARSSL_XTEA_H MBEDTLS_XTEA_H #define RSA_CRYPT MBEDTLS_RSA_CRYPT #define RSA_PKCS_V15 MBEDTLS_RSA_PKCS_V15 #define RSA_PKCS_V21 MBEDTLS_RSA_PKCS_V21 #define RSA_PRIVATE MBEDTLS_RSA_PRIVATE #define RSA_PUBLIC MBEDTLS_RSA_PUBLIC #define RSA_SALT_LEN_ANY MBEDTLS_RSA_SALT_LEN_ANY #define RSA_SIGN MBEDTLS_RSA_SIGN #define SSL_ALERT_LEVEL_FATAL MBEDTLS_SSL_ALERT_LEVEL_FATAL #define SSL_ALERT_LEVEL_WARNING MBEDTLS_SSL_ALERT_LEVEL_WARNING #define SSL_ALERT_MSG_ACCESS_DENIED MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED #define SSL_ALERT_MSG_BAD_CERT MBEDTLS_SSL_ALERT_MSG_BAD_CERT #define SSL_ALERT_MSG_BAD_RECORD_MAC MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC #define SSL_ALERT_MSG_CERT_EXPIRED MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED #define SSL_ALERT_MSG_CERT_REVOKED MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED #define SSL_ALERT_MSG_CERT_UNKNOWN MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN #define SSL_ALERT_MSG_CLOSE_NOTIFY MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY #define SSL_ALERT_MSG_DECODE_ERROR MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR #define SSL_ALERT_MSG_DECOMPRESSION_FAILURE MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE #define SSL_ALERT_MSG_DECRYPTION_FAILED MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED #define SSL_ALERT_MSG_DECRYPT_ERROR MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR #define SSL_ALERT_MSG_EXPORT_RESTRICTION MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION #define SSL_ALERT_MSG_HANDSHAKE_FAILURE MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE #define SSL_ALERT_MSG_ILLEGAL_PARAMETER MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER #define SSL_ALERT_MSG_INAPROPRIATE_FALLBACK MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK #define SSL_ALERT_MSG_INSUFFICIENT_SECURITY MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY #define SSL_ALERT_MSG_INTERNAL_ERROR MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR #define SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL #define SSL_ALERT_MSG_NO_CERT MBEDTLS_SSL_ALERT_MSG_NO_CERT #define SSL_ALERT_MSG_NO_RENEGOTIATION MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION #define SSL_ALERT_MSG_PROTOCOL_VERSION MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION #define SSL_ALERT_MSG_RECORD_OVERFLOW MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW #define SSL_ALERT_MSG_UNEXPECTED_MESSAGE MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE #define SSL_ALERT_MSG_UNKNOWN_CA MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA #define SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY #define SSL_ALERT_MSG_UNRECOGNIZED_NAME MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME #define SSL_ALERT_MSG_UNSUPPORTED_CERT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT #define SSL_ALERT_MSG_UNSUPPORTED_EXT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT #define SSL_ALERT_MSG_USER_CANCELED MBEDTLS_SSL_ALERT_MSG_USER_CANCELED #define SSL_ANTI_REPLAY_DISABLED MBEDTLS_SSL_ANTI_REPLAY_DISABLED #define SSL_ANTI_REPLAY_ENABLED MBEDTLS_SSL_ANTI_REPLAY_ENABLED #define SSL_ARC4_DISABLED MBEDTLS_SSL_ARC4_DISABLED #define SSL_ARC4_ENABLED MBEDTLS_SSL_ARC4_ENABLED #define SSL_BUFFER_LEN ( ( ( MBEDTLS_SSL_IN_BUFFER_LEN ) < ( MBEDTLS_SSL_OUT_BUFFER_LEN ) ) \ ? ( MBEDTLS_SSL_IN_BUFFER_LEN ) : ( MBEDTLS_SSL_OUT_BUFFER_LEN ) ) #define SSL_CACHE_DEFAULT_MAX_ENTRIES MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES #define SSL_CACHE_DEFAULT_TIMEOUT MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT #define SSL_CBC_RECORD_SPLITTING_DISABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED #define SSL_CBC_RECORD_SPLITTING_ENABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED #define SSL_CERTIFICATE_REQUEST MBEDTLS_SSL_CERTIFICATE_REQUEST #define SSL_CERTIFICATE_VERIFY MBEDTLS_SSL_CERTIFICATE_VERIFY #define SSL_CERT_TYPE_ECDSA_SIGN MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN #define SSL_CERT_TYPE_RSA_SIGN MBEDTLS_SSL_CERT_TYPE_RSA_SIGN #define SSL_CHANNEL_INBOUND MBEDTLS_SSL_CHANNEL_INBOUND #define SSL_CHANNEL_OUTBOUND MBEDTLS_SSL_CHANNEL_OUTBOUND #define SSL_CIPHERSUITES MBEDTLS_SSL_CIPHERSUITES #define SSL_CLIENT_CERTIFICATE MBEDTLS_SSL_CLIENT_CERTIFICATE #define SSL_CLIENT_CHANGE_CIPHER_SPEC MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC #define SSL_CLIENT_FINISHED MBEDTLS_SSL_CLIENT_FINISHED #define SSL_CLIENT_HELLO MBEDTLS_SSL_CLIENT_HELLO #define SSL_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_CLIENT_KEY_EXCHANGE #define SSL_COMPRESSION_ADD MBEDTLS_SSL_COMPRESSION_ADD #define SSL_COMPRESS_DEFLATE MBEDTLS_SSL_COMPRESS_DEFLATE #define SSL_COMPRESS_NULL MBEDTLS_SSL_COMPRESS_NULL #define SSL_DEBUG_BUF MBEDTLS_SSL_DEBUG_BUF #define SSL_DEBUG_CRT MBEDTLS_SSL_DEBUG_CRT #define SSL_DEBUG_ECP MBEDTLS_SSL_DEBUG_ECP #define SSL_DEBUG_MPI MBEDTLS_SSL_DEBUG_MPI #define SSL_DEBUG_MSG MBEDTLS_SSL_DEBUG_MSG #define SSL_DEBUG_RET MBEDTLS_SSL_DEBUG_RET #define SSL_DEFAULT_TICKET_LIFETIME MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME #define SSL_DTLS_TIMEOUT_DFL_MAX MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX #define SSL_DTLS_TIMEOUT_DFL_MIN MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN #define SSL_EMPTY_RENEGOTIATION_INFO MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO #define SSL_ETM_DISABLED MBEDTLS_SSL_ETM_DISABLED #define SSL_ETM_ENABLED MBEDTLS_SSL_ETM_ENABLED #define SSL_EXTENDED_MS_DISABLED MBEDTLS_SSL_EXTENDED_MS_DISABLED #define SSL_EXTENDED_MS_ENABLED MBEDTLS_SSL_EXTENDED_MS_ENABLED #define SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV #define SSL_FLUSH_BUFFERS MBEDTLS_SSL_FLUSH_BUFFERS #define SSL_HANDSHAKE_OVER MBEDTLS_SSL_HANDSHAKE_OVER #define SSL_HANDSHAKE_WRAPUP MBEDTLS_SSL_HANDSHAKE_WRAPUP #define SSL_HASH_MD5 MBEDTLS_SSL_HASH_MD5 #define SSL_HASH_NONE MBEDTLS_SSL_HASH_NONE #define SSL_HASH_SHA1 MBEDTLS_SSL_HASH_SHA1 #define SSL_HASH_SHA224 MBEDTLS_SSL_HASH_SHA224 #define SSL_HASH_SHA256 MBEDTLS_SSL_HASH_SHA256 #define SSL_HASH_SHA384 MBEDTLS_SSL_HASH_SHA384 #define SSL_HASH_SHA512 MBEDTLS_SSL_HASH_SHA512 #define SSL_HELLO_REQUEST MBEDTLS_SSL_HELLO_REQUEST #define SSL_HS_CERTIFICATE MBEDTLS_SSL_HS_CERTIFICATE #define SSL_HS_CERTIFICATE_REQUEST MBEDTLS_SSL_HS_CERTIFICATE_REQUEST #define SSL_HS_CERTIFICATE_VERIFY MBEDTLS_SSL_HS_CERTIFICATE_VERIFY #define SSL_HS_CLIENT_HELLO MBEDTLS_SSL_HS_CLIENT_HELLO #define SSL_HS_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE #define SSL_HS_FINISHED MBEDTLS_SSL_HS_FINISHED #define SSL_HS_HELLO_REQUEST MBEDTLS_SSL_HS_HELLO_REQUEST #define SSL_HS_HELLO_VERIFY_REQUEST MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST #define SSL_HS_NEW_SESSION_TICKET MBEDTLS_SSL_HS_NEW_SESSION_TICKET #define SSL_HS_SERVER_HELLO MBEDTLS_SSL_HS_SERVER_HELLO #define SSL_HS_SERVER_HELLO_DONE MBEDTLS_SSL_HS_SERVER_HELLO_DONE #define SSL_HS_SERVER_KEY_EXCHANGE MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE #define SSL_INITIAL_HANDSHAKE MBEDTLS_SSL_INITIAL_HANDSHAKE #define SSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT #define SSL_IS_FALLBACK MBEDTLS_SSL_IS_FALLBACK #define SSL_IS_NOT_FALLBACK MBEDTLS_SSL_IS_NOT_FALLBACK #define SSL_IS_SERVER MBEDTLS_SSL_IS_SERVER #define SSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION #define SSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE #define SSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION #define SSL_LEGACY_RENEGOTIATION MBEDTLS_SSL_LEGACY_RENEGOTIATION #define SSL_MAC_ADD MBEDTLS_SSL_MAC_ADD #define SSL_MAJOR_VERSION_3 MBEDTLS_SSL_MAJOR_VERSION_3 #define SSL_MAX_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN #define SSL_MAX_FRAG_LEN_1024 MBEDTLS_SSL_MAX_FRAG_LEN_1024 #define SSL_MAX_FRAG_LEN_2048 MBEDTLS_SSL_MAX_FRAG_LEN_2048 #define SSL_MAX_FRAG_LEN_4096 MBEDTLS_SSL_MAX_FRAG_LEN_4096 #define SSL_MAX_FRAG_LEN_512 MBEDTLS_SSL_MAX_FRAG_LEN_512 #define SSL_MAX_FRAG_LEN_INVALID MBEDTLS_SSL_MAX_FRAG_LEN_INVALID #define SSL_MAX_FRAG_LEN_NONE MBEDTLS_SSL_MAX_FRAG_LEN_NONE #define SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAX_MAJOR_VERSION #define SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MAX_MINOR_VERSION #define SSL_MINOR_VERSION_0 MBEDTLS_SSL_MINOR_VERSION_0 #define SSL_MINOR_VERSION_1 MBEDTLS_SSL_MINOR_VERSION_1 #define SSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2 #define SSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3 #define SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MIN_MAJOR_VERSION #define SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MIN_MINOR_VERSION #define SSL_MSG_ALERT MBEDTLS_SSL_MSG_ALERT #define SSL_MSG_APPLICATION_DATA MBEDTLS_SSL_MSG_APPLICATION_DATA #define SSL_MSG_CHANGE_CIPHER_SPEC MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC #define SSL_MSG_HANDSHAKE MBEDTLS_SSL_MSG_HANDSHAKE #define SSL_PADDING_ADD MBEDTLS_SSL_PADDING_ADD #define SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION #define SSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED #define SSL_RENEGOTIATION_DONE MBEDTLS_SSL_RENEGOTIATION_DONE #define SSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED #define SSL_RENEGOTIATION_NOT_ENFORCED MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED #define SSL_RENEGOTIATION_PENDING MBEDTLS_SSL_RENEGOTIATION_PENDING #define SSL_RENEGO_MAX_RECORDS_DEFAULT MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT #define SSL_RETRANS_FINISHED MBEDTLS_SSL_RETRANS_FINISHED #define SSL_RETRANS_PREPARING MBEDTLS_SSL_RETRANS_PREPARING #define SSL_RETRANS_SENDING MBEDTLS_SSL_RETRANS_SENDING #define SSL_RETRANS_WAITING MBEDTLS_SSL_RETRANS_WAITING #define SSL_SECURE_RENEGOTIATION MBEDTLS_SSL_SECURE_RENEGOTIATION #define SSL_SERVER_CERTIFICATE MBEDTLS_SSL_SERVER_CERTIFICATE #define SSL_SERVER_CHANGE_CIPHER_SPEC MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC #define SSL_SERVER_FINISHED MBEDTLS_SSL_SERVER_FINISHED #define SSL_SERVER_HELLO MBEDTLS_SSL_SERVER_HELLO #define SSL_SERVER_HELLO_DONE MBEDTLS_SSL_SERVER_HELLO_DONE #define SSL_SERVER_HELLO_VERIFY_REQUEST_SENT MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT #define SSL_SERVER_KEY_EXCHANGE MBEDTLS_SSL_SERVER_KEY_EXCHANGE #define SSL_SERVER_NEW_SESSION_TICKET MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET #define SSL_SESSION_TICKETS_DISABLED MBEDTLS_SSL_SESSION_TICKETS_DISABLED #define SSL_SESSION_TICKETS_ENABLED MBEDTLS_SSL_SESSION_TICKETS_ENABLED #define SSL_SIG_ANON MBEDTLS_SSL_SIG_ANON #define SSL_SIG_ECDSA MBEDTLS_SSL_SIG_ECDSA #define SSL_SIG_RSA MBEDTLS_SSL_SIG_RSA #define SSL_TRANSPORT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM #define SSL_TRANSPORT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM #define SSL_TRUNCATED_HMAC_LEN MBEDTLS_SSL_TRUNCATED_HMAC_LEN #define SSL_TRUNC_HMAC_DISABLED MBEDTLS_SSL_TRUNC_HMAC_DISABLED #define SSL_TRUNC_HMAC_ENABLED MBEDTLS_SSL_TRUNC_HMAC_ENABLED #define SSL_VERIFY_DATA_MAX_LEN MBEDTLS_SSL_VERIFY_DATA_MAX_LEN #define SSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE #define SSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL #define SSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED #define TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_DHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA #define TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 #define TLS_DHE_PSK_WITH_AES_128_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM #define TLS_DHE_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 #define TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 #define TLS_DHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA #define TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 #define TLS_DHE_PSK_WITH_AES_256_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM #define TLS_DHE_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 #define TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 #define TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_DHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA #define TLS_DHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 #define TLS_DHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 #define TLS_DHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA #define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 #define TLS_DHE_RSA_WITH_AES_128_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM #define TLS_DHE_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 #define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 #define TLS_DHE_RSA_WITH_AES_256_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM #define TLS_DHE_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 #define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 #define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA #define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA #define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 #define TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_DHE_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDHE_ECDSA_WITH_AES_128_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM #define TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 #define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDHE_ECDSA_WITH_AES_256_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM #define TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 #define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDHE_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA #define TLS_ECDHE_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA #define TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA #define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 #define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA #define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 #define TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA #define TLS_ECDHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 #define TLS_ECDHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 #define TLS_ECDHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA #define TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA #define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA #define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA #define TLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA #define TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA #define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA #define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDH_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA #define TLS_ECDH_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA #define TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA #define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA #define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDH_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA #define TLS_ECDH_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA #define TLS_EXT_ALPN MBEDTLS_TLS_EXT_ALPN #define TLS_EXT_ENCRYPT_THEN_MAC MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC #define TLS_EXT_EXTENDED_MASTER_SECRET MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET #define TLS_EXT_MAX_FRAGMENT_LENGTH MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH #define TLS_EXT_RENEGOTIATION_INFO MBEDTLS_TLS_EXT_RENEGOTIATION_INFO #define TLS_EXT_SERVERNAME MBEDTLS_TLS_EXT_SERVERNAME #define TLS_EXT_SERVERNAME_HOSTNAME MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME #define TLS_EXT_SESSION_TICKET MBEDTLS_TLS_EXT_SESSION_TICKET #define TLS_EXT_SIG_ALG MBEDTLS_TLS_EXT_SIG_ALG #define TLS_EXT_SUPPORTED_ELLIPTIC_CURVES MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES #define TLS_EXT_SUPPORTED_POINT_FORMATS MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS #define TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT #define TLS_EXT_TRUNCATED_HMAC MBEDTLS_TLS_EXT_TRUNCATED_HMAC #define TLS_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA #define TLS_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 #define TLS_PSK_WITH_AES_128_CCM MBEDTLS_TLS_PSK_WITH_AES_128_CCM #define TLS_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 #define TLS_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 #define TLS_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA #define TLS_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 #define TLS_PSK_WITH_AES_256_CCM MBEDTLS_TLS_PSK_WITH_AES_256_CCM #define TLS_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 #define TLS_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 #define TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_PSK_WITH_NULL_SHA MBEDTLS_TLS_PSK_WITH_NULL_SHA #define TLS_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_PSK_WITH_NULL_SHA256 #define TLS_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_PSK_WITH_NULL_SHA384 #define TLS_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_PSK_WITH_RC4_128_SHA #define TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_RSA_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA #define TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 #define TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 #define TLS_RSA_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA #define TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 #define TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 #define TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_RSA_PSK_WITH_NULL_SHA MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA #define TLS_RSA_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 #define TLS_RSA_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 #define TLS_RSA_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA #define TLS_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA #define TLS_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 #define TLS_RSA_WITH_AES_128_CCM MBEDTLS_TLS_RSA_WITH_AES_128_CCM #define TLS_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 #define TLS_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 #define TLS_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA #define TLS_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 #define TLS_RSA_WITH_AES_256_CCM MBEDTLS_TLS_RSA_WITH_AES_256_CCM #define TLS_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 #define TLS_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 #define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA #define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA #define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 #define TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA #define TLS_RSA_WITH_NULL_MD5 MBEDTLS_TLS_RSA_WITH_NULL_MD5 #define TLS_RSA_WITH_NULL_SHA MBEDTLS_TLS_RSA_WITH_NULL_SHA #define TLS_RSA_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_WITH_NULL_SHA256 #define TLS_RSA_WITH_RC4_128_MD5 MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 #define TLS_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_WITH_RC4_128_SHA #define X509_CRT_VERSION_1 MBEDTLS_X509_CRT_VERSION_1 #define X509_CRT_VERSION_2 MBEDTLS_X509_CRT_VERSION_2 #define X509_CRT_VERSION_3 MBEDTLS_X509_CRT_VERSION_3 #define X509_FORMAT_DER MBEDTLS_X509_FORMAT_DER #define X509_FORMAT_PEM MBEDTLS_X509_FORMAT_PEM #define X509_MAX_DN_NAME_SIZE MBEDTLS_X509_MAX_DN_NAME_SIZE #define X509_RFC5280_MAX_SERIAL_LEN MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN #define X509_RFC5280_UTC_TIME_LEN MBEDTLS_X509_RFC5280_UTC_TIME_LEN #define XTEA_DECRYPT MBEDTLS_XTEA_DECRYPT #define XTEA_ENCRYPT MBEDTLS_XTEA_ENCRYPT #define _asn1_bitstring mbedtls_asn1_bitstring #define _asn1_buf mbedtls_asn1_buf #define _asn1_named_data mbedtls_asn1_named_data #define _asn1_sequence mbedtls_asn1_sequence #define _ssl_cache_context mbedtls_ssl_cache_context #define _ssl_cache_entry mbedtls_ssl_cache_entry #define _ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t #define _ssl_context mbedtls_ssl_context #define _ssl_flight_item mbedtls_ssl_flight_item #define _ssl_handshake_params mbedtls_ssl_handshake_params #define _ssl_key_cert mbedtls_ssl_key_cert #define _ssl_premaster_secret mbedtls_ssl_premaster_secret #define _ssl_session mbedtls_ssl_session #define _ssl_transform mbedtls_ssl_transform #define _x509_crl mbedtls_x509_crl #define _x509_crl_entry mbedtls_x509_crl_entry #define _x509_crt mbedtls_x509_crt #define _x509_csr mbedtls_x509_csr #define _x509_time mbedtls_x509_time #define _x509write_cert mbedtls_x509write_cert #define _x509write_csr mbedtls_x509write_csr #define aes_context mbedtls_aes_context #define aes_crypt_cbc mbedtls_aes_crypt_cbc #define aes_crypt_cfb128 mbedtls_aes_crypt_cfb128 #define aes_crypt_cfb8 mbedtls_aes_crypt_cfb8 #define aes_crypt_ctr mbedtls_aes_crypt_ctr #define aes_crypt_ecb mbedtls_aes_crypt_ecb #define aes_free mbedtls_aes_free #define aes_init mbedtls_aes_init #define aes_self_test mbedtls_aes_self_test #define aes_setkey_dec mbedtls_aes_setkey_dec #define aes_setkey_enc mbedtls_aes_setkey_enc #define aesni_crypt_ecb mbedtls_aesni_crypt_ecb #define aesni_gcm_mult mbedtls_aesni_gcm_mult #define aesni_inverse_key mbedtls_aesni_inverse_key #define aesni_setkey_enc mbedtls_aesni_setkey_enc #define aesni_supports mbedtls_aesni_has_support #define alarmed mbedtls_timing_alarmed #define arc4_context mbedtls_arc4_context #define arc4_crypt mbedtls_arc4_crypt #define arc4_free mbedtls_arc4_free #define arc4_init mbedtls_arc4_init #define arc4_self_test mbedtls_arc4_self_test #define arc4_setup mbedtls_arc4_setup #define asn1_bitstring mbedtls_asn1_bitstring #define asn1_buf mbedtls_asn1_buf #define asn1_find_named_data mbedtls_asn1_find_named_data #define asn1_free_named_data mbedtls_asn1_free_named_data #define asn1_free_named_data_list mbedtls_asn1_free_named_data_list #define asn1_get_alg mbedtls_asn1_get_alg #define asn1_get_alg_null mbedtls_asn1_get_alg_null #define asn1_get_bitstring mbedtls_asn1_get_bitstring #define asn1_get_bitstring_null mbedtls_asn1_get_bitstring_null #define asn1_get_bool mbedtls_asn1_get_bool #define asn1_get_int mbedtls_asn1_get_int #define asn1_get_len mbedtls_asn1_get_len #define asn1_get_mpi mbedtls_asn1_get_mpi #define asn1_get_sequence_of mbedtls_asn1_get_sequence_of #define asn1_get_tag mbedtls_asn1_get_tag #define asn1_named_data mbedtls_asn1_named_data #define asn1_sequence mbedtls_asn1_sequence #define asn1_store_named_data mbedtls_asn1_store_named_data #define asn1_write_algorithm_identifier mbedtls_asn1_write_algorithm_identifier #define asn1_write_bitstring mbedtls_asn1_write_bitstring #define asn1_write_bool mbedtls_asn1_write_bool #define asn1_write_ia5_string mbedtls_asn1_write_ia5_string #define asn1_write_int mbedtls_asn1_write_int #define asn1_write_len mbedtls_asn1_write_len #define asn1_write_mpi mbedtls_asn1_write_mpi #define asn1_write_null mbedtls_asn1_write_null #define asn1_write_octet_string mbedtls_asn1_write_octet_string #define asn1_write_oid mbedtls_asn1_write_oid #define asn1_write_printable_string mbedtls_asn1_write_printable_string #define asn1_write_raw_buffer mbedtls_asn1_write_raw_buffer #define asn1_write_tag mbedtls_asn1_write_tag #define base64_decode mbedtls_base64_decode #define base64_encode mbedtls_base64_encode #define base64_self_test mbedtls_base64_self_test #define blowfish_context mbedtls_blowfish_context #define blowfish_crypt_cbc mbedtls_blowfish_crypt_cbc #define blowfish_crypt_cfb64 mbedtls_blowfish_crypt_cfb64 #define blowfish_crypt_ctr mbedtls_blowfish_crypt_ctr #define blowfish_crypt_ecb mbedtls_blowfish_crypt_ecb #define blowfish_free mbedtls_blowfish_free #define blowfish_init mbedtls_blowfish_init #define blowfish_setkey mbedtls_blowfish_setkey #define camellia_context mbedtls_camellia_context #define camellia_crypt_cbc mbedtls_camellia_crypt_cbc #define camellia_crypt_cfb128 mbedtls_camellia_crypt_cfb128 #define camellia_crypt_ctr mbedtls_camellia_crypt_ctr #define camellia_crypt_ecb mbedtls_camellia_crypt_ecb #define camellia_free mbedtls_camellia_free #define camellia_init mbedtls_camellia_init #define camellia_self_test mbedtls_camellia_self_test #define camellia_setkey_dec mbedtls_camellia_setkey_dec #define camellia_setkey_enc mbedtls_camellia_setkey_enc #define ccm_auth_decrypt mbedtls_ccm_auth_decrypt #define ccm_context mbedtls_ccm_context #define ccm_encrypt_and_tag mbedtls_ccm_encrypt_and_tag #define ccm_free mbedtls_ccm_free #define ccm_init mbedtls_ccm_init #define ccm_self_test mbedtls_ccm_self_test #define cipher_auth_decrypt mbedtls_cipher_auth_decrypt #define cipher_auth_encrypt mbedtls_cipher_auth_encrypt #define cipher_base_t mbedtls_cipher_base_t #define cipher_check_tag mbedtls_cipher_check_tag #define cipher_context_t mbedtls_cipher_context_t #define cipher_crypt mbedtls_cipher_crypt #define cipher_definition_t mbedtls_cipher_definition_t #define cipher_definitions mbedtls_cipher_definitions #define cipher_finish mbedtls_cipher_finish #define cipher_free mbedtls_cipher_free #define cipher_get_block_size mbedtls_cipher_get_block_size #define cipher_get_cipher_mode mbedtls_cipher_get_cipher_mode #define cipher_get_iv_size mbedtls_cipher_get_iv_size #define cipher_get_key_size mbedtls_cipher_get_key_bitlen #define cipher_get_name mbedtls_cipher_get_name #define cipher_get_operation mbedtls_cipher_get_operation #define cipher_get_type mbedtls_cipher_get_type #define cipher_id_t mbedtls_cipher_id_t #define cipher_info_from_string mbedtls_cipher_info_from_string #define cipher_info_from_type mbedtls_cipher_info_from_type #define cipher_info_from_values mbedtls_cipher_info_from_values #define cipher_info_t mbedtls_cipher_info_t #define cipher_init mbedtls_cipher_init #define cipher_init_ctx mbedtls_cipher_setup #define cipher_list mbedtls_cipher_list #define cipher_mode_t mbedtls_cipher_mode_t #define cipher_padding_t mbedtls_cipher_padding_t #define cipher_reset mbedtls_cipher_reset #define cipher_set_iv mbedtls_cipher_set_iv #define cipher_set_padding_mode mbedtls_cipher_set_padding_mode #define cipher_setkey mbedtls_cipher_setkey #define cipher_type_t mbedtls_cipher_type_t #define cipher_update mbedtls_cipher_update #define cipher_update_ad mbedtls_cipher_update_ad #define cipher_write_tag mbedtls_cipher_write_tag #define ctr_drbg_context mbedtls_ctr_drbg_context #define ctr_drbg_free mbedtls_ctr_drbg_free #define ctr_drbg_init mbedtls_ctr_drbg_init #define ctr_drbg_random mbedtls_ctr_drbg_random #define ctr_drbg_random_with_add mbedtls_ctr_drbg_random_with_add #define ctr_drbg_reseed mbedtls_ctr_drbg_reseed #define ctr_drbg_self_test mbedtls_ctr_drbg_self_test #define ctr_drbg_set_entropy_len mbedtls_ctr_drbg_set_entropy_len #define ctr_drbg_set_prediction_resistance mbedtls_ctr_drbg_set_prediction_resistance #define ctr_drbg_set_reseed_interval mbedtls_ctr_drbg_set_reseed_interval #define ctr_drbg_update mbedtls_ctr_drbg_update #define ctr_drbg_update_seed_file mbedtls_ctr_drbg_update_seed_file #define ctr_drbg_write_seed_file mbedtls_ctr_drbg_write_seed_file #define debug_print_buf mbedtls_debug_print_buf #define debug_print_crt mbedtls_debug_print_crt #define debug_print_ecp mbedtls_debug_print_ecp #define debug_print_mpi mbedtls_debug_print_mpi #define debug_print_msg mbedtls_debug_print_msg #define debug_print_ret mbedtls_debug_print_ret #define debug_set_threshold mbedtls_debug_set_threshold #define des3_context mbedtls_des3_context #define des3_crypt_cbc mbedtls_des3_crypt_cbc #define des3_crypt_ecb mbedtls_des3_crypt_ecb #define des3_free mbedtls_des3_free #define des3_init mbedtls_des3_init #define des3_set2key_dec mbedtls_des3_set2key_dec #define des3_set2key_enc mbedtls_des3_set2key_enc #define des3_set3key_dec mbedtls_des3_set3key_dec #define des3_set3key_enc mbedtls_des3_set3key_enc #define des_context mbedtls_des_context #define des_crypt_cbc mbedtls_des_crypt_cbc #define des_crypt_ecb mbedtls_des_crypt_ecb #define des_free mbedtls_des_free #define des_init mbedtls_des_init #define des_key_check_key_parity mbedtls_des_key_check_key_parity #define des_key_check_weak mbedtls_des_key_check_weak #define des_key_set_parity mbedtls_des_key_set_parity #define des_self_test mbedtls_des_self_test #define des_setkey_dec mbedtls_des_setkey_dec #define des_setkey_enc mbedtls_des_setkey_enc #define dhm_calc_secret mbedtls_dhm_calc_secret #define dhm_context mbedtls_dhm_context #define dhm_free mbedtls_dhm_free #define dhm_init mbedtls_dhm_init #define dhm_make_params mbedtls_dhm_make_params #define dhm_make_public mbedtls_dhm_make_public #define dhm_parse_dhm mbedtls_dhm_parse_dhm #define dhm_parse_dhmfile mbedtls_dhm_parse_dhmfile #define dhm_read_params mbedtls_dhm_read_params #define dhm_read_public mbedtls_dhm_read_public #define dhm_self_test mbedtls_dhm_self_test #define ecdh_calc_secret mbedtls_ecdh_calc_secret #define ecdh_compute_shared mbedtls_ecdh_compute_shared #define ecdh_context mbedtls_ecdh_context #define ecdh_free mbedtls_ecdh_free #define ecdh_gen_public mbedtls_ecdh_gen_public #define ecdh_get_params mbedtls_ecdh_get_params #define ecdh_init mbedtls_ecdh_init #define ecdh_make_params mbedtls_ecdh_make_params #define ecdh_make_public mbedtls_ecdh_make_public #define ecdh_read_params mbedtls_ecdh_read_params #define ecdh_read_public mbedtls_ecdh_read_public #define ecdh_side mbedtls_ecdh_side #define ecdsa_context mbedtls_ecdsa_context #define ecdsa_free mbedtls_ecdsa_free #define ecdsa_from_keypair mbedtls_ecdsa_from_keypair #define ecdsa_genkey mbedtls_ecdsa_genkey #define ecdsa_info mbedtls_ecdsa_info #define ecdsa_init mbedtls_ecdsa_init #define ecdsa_read_signature mbedtls_ecdsa_read_signature #define ecdsa_sign mbedtls_ecdsa_sign #define ecdsa_sign_det mbedtls_ecdsa_sign_det #define ecdsa_verify mbedtls_ecdsa_verify #define ecdsa_write_signature mbedtls_ecdsa_write_signature #define ecdsa_write_signature_det mbedtls_ecdsa_write_signature_det #define eckey_info mbedtls_eckey_info #define eckeydh_info mbedtls_eckeydh_info #define ecp_check_privkey mbedtls_ecp_check_privkey #define ecp_check_pub_priv mbedtls_ecp_check_pub_priv #define ecp_check_pubkey mbedtls_ecp_check_pubkey #define ecp_copy mbedtls_ecp_copy #define ecp_curve_info mbedtls_ecp_curve_info #define ecp_curve_info_from_grp_id mbedtls_ecp_curve_info_from_grp_id #define ecp_curve_info_from_name mbedtls_ecp_curve_info_from_name #define ecp_curve_info_from_tls_id mbedtls_ecp_curve_info_from_tls_id #define ecp_curve_list mbedtls_ecp_curve_list #define ecp_gen_key mbedtls_ecp_gen_key #define ecp_gen_keypair mbedtls_ecp_gen_keypair #define ecp_group mbedtls_ecp_group #define ecp_group_copy mbedtls_ecp_group_copy #define ecp_group_free mbedtls_ecp_group_free #define ecp_group_id mbedtls_ecp_group_id #define ecp_group_init mbedtls_ecp_group_init #define ecp_grp_id_list mbedtls_ecp_grp_id_list #define ecp_is_zero mbedtls_ecp_is_zero #define ecp_keypair mbedtls_ecp_keypair #define ecp_keypair_free mbedtls_ecp_keypair_free #define ecp_keypair_init mbedtls_ecp_keypair_init #define ecp_mul mbedtls_ecp_mul #define ecp_point mbedtls_ecp_point #define ecp_point_free mbedtls_ecp_point_free #define ecp_point_init mbedtls_ecp_point_init #define ecp_point_read_binary mbedtls_ecp_point_read_binary #define ecp_point_read_string mbedtls_ecp_point_read_string #define ecp_point_write_binary mbedtls_ecp_point_write_binary #define ecp_self_test mbedtls_ecp_self_test #define ecp_set_zero mbedtls_ecp_set_zero #define ecp_tls_read_group mbedtls_ecp_tls_read_group #define ecp_tls_read_point mbedtls_ecp_tls_read_point #define ecp_tls_write_group mbedtls_ecp_tls_write_group #define ecp_tls_write_point mbedtls_ecp_tls_write_point #define ecp_use_known_dp mbedtls_ecp_group_load #define entropy_add_source mbedtls_entropy_add_source #define entropy_context mbedtls_entropy_context #define entropy_free mbedtls_entropy_free #define entropy_func mbedtls_entropy_func #define entropy_gather mbedtls_entropy_gather #define entropy_init mbedtls_entropy_init #define entropy_self_test mbedtls_entropy_self_test #define entropy_update_manual mbedtls_entropy_update_manual #define entropy_update_seed_file mbedtls_entropy_update_seed_file #define entropy_write_seed_file mbedtls_entropy_write_seed_file #define error_strerror mbedtls_strerror #define f_source_ptr mbedtls_entropy_f_source_ptr #define gcm_auth_decrypt mbedtls_gcm_auth_decrypt #define gcm_context mbedtls_gcm_context #define gcm_crypt_and_tag mbedtls_gcm_crypt_and_tag #define gcm_finish mbedtls_gcm_finish #define gcm_free mbedtls_gcm_free #define gcm_init mbedtls_gcm_init #define gcm_self_test mbedtls_gcm_self_test #define gcm_starts mbedtls_gcm_starts #define gcm_update mbedtls_gcm_update #define get_timer mbedtls_timing_get_timer #define hardclock mbedtls_timing_hardclock #define hardclock_poll mbedtls_hardclock_poll #define havege_free mbedtls_havege_free #define havege_init mbedtls_havege_init #define havege_poll mbedtls_havege_poll #define havege_random mbedtls_havege_random #define havege_state mbedtls_havege_state #define hmac_drbg_context mbedtls_hmac_drbg_context #define hmac_drbg_free mbedtls_hmac_drbg_free #define hmac_drbg_init mbedtls_hmac_drbg_init #define hmac_drbg_random mbedtls_hmac_drbg_random #define hmac_drbg_random_with_add mbedtls_hmac_drbg_random_with_add #define hmac_drbg_reseed mbedtls_hmac_drbg_reseed #define hmac_drbg_self_test mbedtls_hmac_drbg_self_test #define hmac_drbg_set_entropy_len mbedtls_hmac_drbg_set_entropy_len #define hmac_drbg_set_prediction_resistance mbedtls_hmac_drbg_set_prediction_resistance #define hmac_drbg_set_reseed_interval mbedtls_hmac_drbg_set_reseed_interval #define hmac_drbg_update mbedtls_hmac_drbg_update #define hmac_drbg_update_seed_file mbedtls_hmac_drbg_update_seed_file #define hmac_drbg_write_seed_file mbedtls_hmac_drbg_write_seed_file #define hr_time mbedtls_timing_hr_time #define key_exchange_type_t mbedtls_key_exchange_type_t #define md mbedtls_md #define md2 mbedtls_md2 #define md2_context mbedtls_md2_context #define md2_finish mbedtls_md2_finish #define md2_free mbedtls_md2_free #define md2_info mbedtls_md2_info #define md2_init mbedtls_md2_init #define md2_process mbedtls_md2_process #define md2_self_test mbedtls_md2_self_test #define md2_starts mbedtls_md2_starts #define md2_update mbedtls_md2_update #define md4 mbedtls_md4 #define md4_context mbedtls_md4_context #define md4_finish mbedtls_md4_finish #define md4_free mbedtls_md4_free #define md4_info mbedtls_md4_info #define md4_init mbedtls_md4_init #define md4_process mbedtls_md4_process #define md4_self_test mbedtls_md4_self_test #define md4_starts mbedtls_md4_starts #define md4_update mbedtls_md4_update #define md5 mbedtls_md5 #define md5_context mbedtls_md5_context #define md5_finish mbedtls_md5_finish #define md5_free mbedtls_md5_free #define md5_info mbedtls_md5_info #define md5_init mbedtls_md5_init #define md5_process mbedtls_md5_process #define md5_self_test mbedtls_md5_self_test #define md5_starts mbedtls_md5_starts #define md5_update mbedtls_md5_update #define md_context_t mbedtls_md_context_t #define md_file mbedtls_md_file #define md_finish mbedtls_md_finish #define md_free mbedtls_md_free #define md_get_name mbedtls_md_get_name #define md_get_size mbedtls_md_get_size #define md_get_type mbedtls_md_get_type #define md_hmac mbedtls_md_hmac #define md_hmac_finish mbedtls_md_hmac_finish #define md_hmac_reset mbedtls_md_hmac_reset #define md_hmac_starts mbedtls_md_hmac_starts #define md_hmac_update mbedtls_md_hmac_update #define md_info_from_string mbedtls_md_info_from_string #define md_info_from_type mbedtls_md_info_from_type #define md_info_t mbedtls_md_info_t #define md_init mbedtls_md_init #define md_init_ctx mbedtls_md_init_ctx #define md_list mbedtls_md_list #define md_process mbedtls_md_process #define md_starts mbedtls_md_starts #define md_type_t mbedtls_md_type_t #define md_update mbedtls_md_update #define memory_buffer_alloc_cur_get mbedtls_memory_buffer_alloc_cur_get #define memory_buffer_alloc_free mbedtls_memory_buffer_alloc_free #define memory_buffer_alloc_init mbedtls_memory_buffer_alloc_init #define memory_buffer_alloc_max_get mbedtls_memory_buffer_alloc_max_get #define memory_buffer_alloc_max_reset mbedtls_memory_buffer_alloc_max_reset #define memory_buffer_alloc_self_test mbedtls_memory_buffer_alloc_self_test #define memory_buffer_alloc_status mbedtls_memory_buffer_alloc_status #define memory_buffer_alloc_verify mbedtls_memory_buffer_alloc_verify #define memory_buffer_set_verify mbedtls_memory_buffer_set_verify #define mpi mbedtls_mpi #define mpi_add_abs mbedtls_mpi_add_abs #define mpi_add_int mbedtls_mpi_add_int #define mpi_add_mpi mbedtls_mpi_add_mpi #define mpi_cmp_abs mbedtls_mpi_cmp_abs #define mpi_cmp_int mbedtls_mpi_cmp_int #define mpi_cmp_mpi mbedtls_mpi_cmp_mpi #define mpi_copy mbedtls_mpi_copy #define mpi_div_int mbedtls_mpi_div_int #define mpi_div_mpi mbedtls_mpi_div_mpi #define mpi_exp_mod mbedtls_mpi_exp_mod #define mpi_fill_random mbedtls_mpi_fill_random #define mpi_free mbedtls_mpi_free #define mpi_gcd mbedtls_mpi_gcd #define mpi_gen_prime mbedtls_mpi_gen_prime #define mpi_get_bit mbedtls_mpi_get_bit #define mpi_grow mbedtls_mpi_grow #define mpi_init mbedtls_mpi_init #define mpi_inv_mod mbedtls_mpi_inv_mod #define mpi_is_prime mbedtls_mpi_is_prime #define mpi_lsb mbedtls_mpi_lsb #define mpi_lset mbedtls_mpi_lset #define mpi_mod_int mbedtls_mpi_mod_int #define mpi_mod_mpi mbedtls_mpi_mod_mpi #define mpi_msb mbedtls_mpi_bitlen #define mpi_mul_int mbedtls_mpi_mul_int #define mpi_mul_mpi mbedtls_mpi_mul_mpi #define mpi_read_binary mbedtls_mpi_read_binary #define mpi_read_file mbedtls_mpi_read_file #define mpi_read_string mbedtls_mpi_read_string #define mpi_safe_cond_assign mbedtls_mpi_safe_cond_assign #define mpi_safe_cond_swap mbedtls_mpi_safe_cond_swap #define mpi_self_test mbedtls_mpi_self_test #define mpi_set_bit mbedtls_mpi_set_bit #define mpi_shift_l mbedtls_mpi_shift_l #define mpi_shift_r mbedtls_mpi_shift_r #define mpi_shrink mbedtls_mpi_shrink #define mpi_size mbedtls_mpi_size #define mpi_sub_abs mbedtls_mpi_sub_abs #define mpi_sub_int mbedtls_mpi_sub_int #define mpi_sub_mpi mbedtls_mpi_sub_mpi #define mpi_swap mbedtls_mpi_swap #define mpi_write_binary mbedtls_mpi_write_binary #define mpi_write_file mbedtls_mpi_write_file #define mpi_write_string mbedtls_mpi_write_string #define net_accept mbedtls_net_accept #define net_bind mbedtls_net_bind #define net_close mbedtls_net_free #define net_connect mbedtls_net_connect #define net_recv mbedtls_net_recv #define net_recv_timeout mbedtls_net_recv_timeout #define net_send mbedtls_net_send #define net_set_block mbedtls_net_set_block #define net_set_nonblock mbedtls_net_set_nonblock #define net_usleep mbedtls_net_usleep #define oid_descriptor_t mbedtls_oid_descriptor_t #define oid_get_attr_short_name mbedtls_oid_get_attr_short_name #define oid_get_cipher_alg mbedtls_oid_get_cipher_alg #define oid_get_ec_grp mbedtls_oid_get_ec_grp #define oid_get_extended_key_usage mbedtls_oid_get_extended_key_usage #define oid_get_md_alg mbedtls_oid_get_md_alg #define oid_get_numeric_string mbedtls_oid_get_numeric_string #define oid_get_oid_by_ec_grp mbedtls_oid_get_oid_by_ec_grp #define oid_get_oid_by_md mbedtls_oid_get_oid_by_md #define oid_get_oid_by_pk_alg mbedtls_oid_get_oid_by_pk_alg #define oid_get_oid_by_sig_alg mbedtls_oid_get_oid_by_sig_alg #define oid_get_pk_alg mbedtls_oid_get_pk_alg #define oid_get_pkcs12_pbe_alg mbedtls_oid_get_pkcs12_pbe_alg #define oid_get_sig_alg mbedtls_oid_get_sig_alg #define oid_get_sig_alg_desc mbedtls_oid_get_sig_alg_desc #define oid_get_x509_ext_type mbedtls_oid_get_x509_ext_type #define operation_t mbedtls_operation_t #define padlock_supports mbedtls_padlock_has_support #define padlock_xcryptcbc mbedtls_padlock_xcryptcbc #define padlock_xcryptecb mbedtls_padlock_xcryptecb #define pem_context mbedtls_pem_context #define pem_free mbedtls_pem_free #define pem_init mbedtls_pem_init #define pem_read_buffer mbedtls_pem_read_buffer #define pem_write_buffer mbedtls_pem_write_buffer #define pk_can_do mbedtls_pk_can_do #define pk_check_pair mbedtls_pk_check_pair #define pk_context mbedtls_pk_context #define pk_debug mbedtls_pk_debug #define pk_debug_item mbedtls_pk_debug_item #define pk_debug_type mbedtls_pk_debug_type #define pk_decrypt mbedtls_pk_decrypt #define pk_ec mbedtls_pk_ec #define pk_encrypt mbedtls_pk_encrypt #define pk_free mbedtls_pk_free #define pk_get_len mbedtls_pk_get_len #define pk_get_name mbedtls_pk_get_name #define pk_get_size mbedtls_pk_get_bitlen #define pk_get_type mbedtls_pk_get_type #define pk_info_from_type mbedtls_pk_info_from_type #define pk_info_t mbedtls_pk_info_t #define pk_init mbedtls_pk_init #define pk_init_ctx mbedtls_pk_setup #define pk_init_ctx_rsa_alt mbedtls_pk_setup_rsa_alt #define pk_load_file mbedtls_pk_load_file #define pk_parse_key mbedtls_pk_parse_key #define pk_parse_keyfile mbedtls_pk_parse_keyfile #define pk_parse_public_key mbedtls_pk_parse_public_key #define pk_parse_public_keyfile mbedtls_pk_parse_public_keyfile #define pk_parse_subpubkey mbedtls_pk_parse_subpubkey #define pk_rsa mbedtls_pk_rsa #define pk_rsa_alt_decrypt_func mbedtls_pk_rsa_alt_decrypt_func #define pk_rsa_alt_key_len_func mbedtls_pk_rsa_alt_key_len_func #define pk_rsa_alt_sign_func mbedtls_pk_rsa_alt_sign_func #define pk_rsassa_pss_options mbedtls_pk_rsassa_pss_options #define pk_sign mbedtls_pk_sign #define pk_type_t mbedtls_pk_type_t #define pk_verify mbedtls_pk_verify #define pk_verify_ext mbedtls_pk_verify_ext #define pk_write_key_der mbedtls_pk_write_key_der #define pk_write_key_pem mbedtls_pk_write_key_pem #define pk_write_pubkey mbedtls_pk_write_pubkey #define pk_write_pubkey_der mbedtls_pk_write_pubkey_der #define pk_write_pubkey_pem mbedtls_pk_write_pubkey_pem #define pkcs11_context mbedtls_pkcs11_context #define pkcs11_decrypt mbedtls_pkcs11_decrypt #define pkcs11_priv_key_free mbedtls_pkcs11_priv_key_free #define pkcs11_priv_key_init mbedtls_pkcs11_priv_key_bind #define pkcs11_sign mbedtls_pkcs11_sign #define pkcs11_x509_cert_init mbedtls_pkcs11_x509_cert_bind #define pkcs12_derivation mbedtls_pkcs12_derivation #define pkcs12_pbe mbedtls_pkcs12_pbe #define pkcs12_pbe_sha1_rc4_128 mbedtls_pkcs12_pbe_sha1_rc4_128 #define pkcs5_pbes2 mbedtls_pkcs5_pbes2 #define pkcs5_pbkdf2_hmac mbedtls_pkcs5_pbkdf2_hmac #define pkcs5_self_test mbedtls_pkcs5_self_test #define platform_entropy_poll mbedtls_platform_entropy_poll #define platform_set_exit mbedtls_platform_set_exit #define platform_set_fprintf mbedtls_platform_set_fprintf #define platform_set_printf mbedtls_platform_set_printf #define platform_set_snprintf mbedtls_platform_set_snprintf #define polarssl_exit mbedtls_exit #define polarssl_fprintf mbedtls_fprintf #define polarssl_free mbedtls_free #define polarssl_mutex_free mbedtls_mutex_free #define polarssl_mutex_init mbedtls_mutex_init #define polarssl_mutex_lock mbedtls_mutex_lock #define polarssl_mutex_unlock mbedtls_mutex_unlock #define polarssl_printf mbedtls_printf #define polarssl_snprintf mbedtls_snprintf #define polarssl_strerror mbedtls_strerror #define ripemd160 mbedtls_ripemd160 #define ripemd160_context mbedtls_ripemd160_context #define ripemd160_finish mbedtls_ripemd160_finish #define ripemd160_free mbedtls_ripemd160_free #define ripemd160_info mbedtls_ripemd160_info #define ripemd160_init mbedtls_ripemd160_init #define ripemd160_process mbedtls_ripemd160_process #define ripemd160_self_test mbedtls_ripemd160_self_test #define ripemd160_starts mbedtls_ripemd160_starts #define ripemd160_update mbedtls_ripemd160_update #define rsa_alt_context mbedtls_rsa_alt_context #define rsa_alt_info mbedtls_rsa_alt_info #define rsa_check_privkey mbedtls_rsa_check_privkey #define rsa_check_pub_priv mbedtls_rsa_check_pub_priv #define rsa_check_pubkey mbedtls_rsa_check_pubkey #define rsa_context mbedtls_rsa_context #define rsa_copy mbedtls_rsa_copy #define rsa_free mbedtls_rsa_free #define rsa_gen_key mbedtls_rsa_gen_key #define rsa_info mbedtls_rsa_info #define rsa_init mbedtls_rsa_init #define rsa_pkcs1_decrypt mbedtls_rsa_pkcs1_decrypt #define rsa_pkcs1_encrypt mbedtls_rsa_pkcs1_encrypt #define rsa_pkcs1_sign mbedtls_rsa_pkcs1_sign #define rsa_pkcs1_verify mbedtls_rsa_pkcs1_verify #define rsa_private mbedtls_rsa_private #define rsa_public mbedtls_rsa_public #define rsa_rsaes_oaep_decrypt mbedtls_rsa_rsaes_oaep_decrypt #define rsa_rsaes_oaep_encrypt mbedtls_rsa_rsaes_oaep_encrypt #define rsa_rsaes_pkcs1_v15_decrypt mbedtls_rsa_rsaes_pkcs1_v15_decrypt #define rsa_rsaes_pkcs1_v15_encrypt mbedtls_rsa_rsaes_pkcs1_v15_encrypt #define rsa_rsassa_pkcs1_v15_sign mbedtls_rsa_rsassa_pkcs1_v15_sign #define rsa_rsassa_pkcs1_v15_verify mbedtls_rsa_rsassa_pkcs1_v15_verify #define rsa_rsassa_pss_sign mbedtls_rsa_rsassa_pss_sign #define rsa_rsassa_pss_verify mbedtls_rsa_rsassa_pss_verify #define rsa_rsassa_pss_verify_ext mbedtls_rsa_rsassa_pss_verify_ext #define rsa_self_test mbedtls_rsa_self_test #define rsa_set_padding mbedtls_rsa_set_padding #define safer_memcmp mbedtls_ssl_safer_memcmp #define set_alarm mbedtls_set_alarm #define sha1 mbedtls_sha1 #define sha1_context mbedtls_sha1_context #define sha1_finish mbedtls_sha1_finish #define sha1_free mbedtls_sha1_free #define sha1_info mbedtls_sha1_info #define sha1_init mbedtls_sha1_init #define sha1_process mbedtls_sha1_process #define sha1_self_test mbedtls_sha1_self_test #define sha1_starts mbedtls_sha1_starts #define sha1_update mbedtls_sha1_update #define sha224_info mbedtls_sha224_info #define sha256 mbedtls_sha256 #define sha256_context mbedtls_sha256_context #define sha256_finish mbedtls_sha256_finish #define sha256_free mbedtls_sha256_free #define sha256_info mbedtls_sha256_info #define sha256_init mbedtls_sha256_init #define sha256_process mbedtls_sha256_process #define sha256_self_test mbedtls_sha256_self_test #define sha256_starts mbedtls_sha256_starts #define sha256_update mbedtls_sha256_update #define sha384_info mbedtls_sha384_info #define sha512 mbedtls_sha512 #define sha512_context mbedtls_sha512_context #define sha512_finish mbedtls_sha512_finish #define sha512_free mbedtls_sha512_free #define sha512_info mbedtls_sha512_info #define sha512_init mbedtls_sha512_init #define sha512_process mbedtls_sha512_process #define sha512_self_test mbedtls_sha512_self_test #define sha512_starts mbedtls_sha512_starts #define sha512_update mbedtls_sha512_update #define source_state mbedtls_entropy_source_state #define ssl_cache_context mbedtls_ssl_cache_context #define ssl_cache_entry mbedtls_ssl_cache_entry #define ssl_cache_free mbedtls_ssl_cache_free #define ssl_cache_get mbedtls_ssl_cache_get #define ssl_cache_init mbedtls_ssl_cache_init #define ssl_cache_set mbedtls_ssl_cache_set #define ssl_cache_set_max_entries mbedtls_ssl_cache_set_max_entries #define ssl_cache_set_timeout mbedtls_ssl_cache_set_timeout #define ssl_check_cert_usage mbedtls_ssl_check_cert_usage #define ssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id #define ssl_ciphersuite_from_string mbedtls_ssl_ciphersuite_from_string #define ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t #define ssl_ciphersuite_uses_ec mbedtls_ssl_ciphersuite_uses_ec #define ssl_ciphersuite_uses_psk mbedtls_ssl_ciphersuite_uses_psk #define ssl_close_notify mbedtls_ssl_close_notify #define ssl_context mbedtls_ssl_context #define ssl_cookie_check mbedtls_ssl_cookie_check #define ssl_cookie_check_t mbedtls_ssl_cookie_check_t #define ssl_cookie_ctx mbedtls_ssl_cookie_ctx #define ssl_cookie_free mbedtls_ssl_cookie_free #define ssl_cookie_init mbedtls_ssl_cookie_init #define ssl_cookie_set_timeout mbedtls_ssl_cookie_set_timeout #define ssl_cookie_setup mbedtls_ssl_cookie_setup #define ssl_cookie_write mbedtls_ssl_cookie_write #define ssl_cookie_write_t mbedtls_ssl_cookie_write_t #define ssl_derive_keys mbedtls_ssl_derive_keys #define ssl_dtls_replay_check mbedtls_ssl_dtls_replay_check #define ssl_dtls_replay_update mbedtls_ssl_dtls_replay_update #define ssl_fetch_input mbedtls_ssl_fetch_input #define ssl_flight_item mbedtls_ssl_flight_item #define ssl_flush_output mbedtls_ssl_flush_output #define ssl_free mbedtls_ssl_free #define ssl_get_alpn_protocol mbedtls_ssl_get_alpn_protocol #define ssl_get_bytes_avail mbedtls_ssl_get_bytes_avail #define ssl_get_ciphersuite mbedtls_ssl_get_ciphersuite #define ssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id #define ssl_get_ciphersuite_name mbedtls_ssl_get_ciphersuite_name #define ssl_get_ciphersuite_sig_pk_alg mbedtls_ssl_get_ciphersuite_sig_pk_alg #define ssl_get_peer_cert mbedtls_ssl_get_peer_cert #define ssl_get_record_expansion mbedtls_ssl_get_record_expansion #define ssl_get_session mbedtls_ssl_get_session #define ssl_get_verify_result mbedtls_ssl_get_verify_result #define ssl_get_version mbedtls_ssl_get_version #define ssl_handshake mbedtls_ssl_handshake #define ssl_handshake_client_step mbedtls_ssl_handshake_client_step #define ssl_handshake_free mbedtls_ssl_handshake_free #define ssl_handshake_params mbedtls_ssl_handshake_params #define ssl_handshake_server_step mbedtls_ssl_handshake_server_step #define ssl_handshake_step mbedtls_ssl_handshake_step #define ssl_handshake_wrapup mbedtls_ssl_handshake_wrapup #define ssl_hdr_len mbedtls_ssl_hdr_len #define ssl_hs_hdr_len mbedtls_ssl_hs_hdr_len #define ssl_hw_record_activate mbedtls_ssl_hw_record_activate #define ssl_hw_record_finish mbedtls_ssl_hw_record_finish #define ssl_hw_record_init mbedtls_ssl_hw_record_init #define ssl_hw_record_read mbedtls_ssl_hw_record_read #define ssl_hw_record_reset mbedtls_ssl_hw_record_reset #define ssl_hw_record_write mbedtls_ssl_hw_record_write #define ssl_init mbedtls_ssl_init #define ssl_key_cert mbedtls_ssl_key_cert #define ssl_legacy_renegotiation mbedtls_ssl_conf_legacy_renegotiation #define ssl_list_ciphersuites mbedtls_ssl_list_ciphersuites #define ssl_md_alg_from_hash mbedtls_ssl_md_alg_from_hash #define ssl_optimize_checksum mbedtls_ssl_optimize_checksum #define ssl_own_cert mbedtls_ssl_own_cert #define ssl_own_key mbedtls_ssl_own_key #define ssl_parse_certificate mbedtls_ssl_parse_certificate #define ssl_parse_change_cipher_spec mbedtls_ssl_parse_change_cipher_spec #define ssl_parse_finished mbedtls_ssl_parse_finished #define ssl_pk_alg_from_sig mbedtls_ssl_pk_alg_from_sig #define ssl_pkcs11_decrypt mbedtls_ssl_pkcs11_decrypt #define ssl_pkcs11_key_len mbedtls_ssl_pkcs11_key_len #define ssl_pkcs11_sign mbedtls_ssl_pkcs11_sign #define ssl_psk_derive_premaster mbedtls_ssl_psk_derive_premaster #define ssl_read mbedtls_ssl_read #define ssl_read_record mbedtls_ssl_read_record #define ssl_read_version mbedtls_ssl_read_version #define ssl_recv_flight_completed mbedtls_ssl_recv_flight_completed #define ssl_renegotiate mbedtls_ssl_renegotiate #define ssl_resend mbedtls_ssl_resend #define ssl_reset_checksum mbedtls_ssl_reset_checksum #define ssl_send_alert_message mbedtls_ssl_send_alert_message #define ssl_send_fatal_handshake_failure mbedtls_ssl_send_fatal_handshake_failure #define ssl_send_flight_completed mbedtls_ssl_send_flight_completed #define ssl_session mbedtls_ssl_session #define ssl_session_free mbedtls_ssl_session_free #define ssl_session_init mbedtls_ssl_session_init #define ssl_session_reset mbedtls_ssl_session_reset #define ssl_set_alpn_protocols mbedtls_ssl_conf_alpn_protocols #define ssl_set_arc4_support mbedtls_ssl_conf_arc4_support #define ssl_set_authmode mbedtls_ssl_conf_authmode #define ssl_set_bio mbedtls_ssl_set_bio #define ssl_set_ca_chain mbedtls_ssl_conf_ca_chain #define ssl_set_cbc_record_splitting mbedtls_ssl_conf_cbc_record_splitting #define ssl_set_ciphersuites mbedtls_ssl_conf_ciphersuites #define ssl_set_ciphersuites_for_version mbedtls_ssl_conf_ciphersuites_for_version #define ssl_set_client_transport_id mbedtls_ssl_set_client_transport_id #define ssl_set_curves mbedtls_ssl_conf_curves #define ssl_set_dbg mbedtls_ssl_conf_dbg #define ssl_set_dh_param mbedtls_ssl_conf_dh_param #define ssl_set_dh_param_ctx mbedtls_ssl_conf_dh_param_ctx #define ssl_set_dtls_anti_replay mbedtls_ssl_conf_dtls_anti_replay #define ssl_set_dtls_badmac_limit mbedtls_ssl_conf_dtls_badmac_limit #define ssl_set_dtls_cookies mbedtls_ssl_conf_dtls_cookies #define ssl_set_encrypt_then_mac mbedtls_ssl_conf_encrypt_then_mac #define ssl_set_endpoint mbedtls_ssl_conf_endpoint #define ssl_set_extended_master_secret mbedtls_ssl_conf_extended_master_secret #define ssl_set_fallback mbedtls_ssl_conf_fallback #define ssl_set_handshake_timeout mbedtls_ssl_conf_handshake_timeout #define ssl_set_hostname mbedtls_ssl_set_hostname #define ssl_set_max_frag_len mbedtls_ssl_conf_max_frag_len #define ssl_set_max_version mbedtls_ssl_conf_max_version #define ssl_set_min_version mbedtls_ssl_conf_min_version #define ssl_set_own_cert mbedtls_ssl_conf_own_cert #define ssl_set_psk mbedtls_ssl_conf_psk #define ssl_set_psk_cb mbedtls_ssl_conf_psk_cb #define ssl_set_renegotiation mbedtls_ssl_conf_renegotiation #define ssl_set_renegotiation_enforced mbedtls_ssl_conf_renegotiation_enforced #define ssl_set_renegotiation_period mbedtls_ssl_conf_renegotiation_period #define ssl_set_rng mbedtls_ssl_conf_rng #define ssl_set_session mbedtls_ssl_set_session #define ssl_set_session_cache mbedtls_ssl_conf_session_cache #define ssl_set_session_tickets mbedtls_ssl_conf_session_tickets #define ssl_set_sni mbedtls_ssl_conf_sni #define ssl_set_transport mbedtls_ssl_conf_transport #define ssl_set_truncated_hmac mbedtls_ssl_conf_truncated_hmac #define ssl_set_verify mbedtls_ssl_conf_verify #define ssl_sig_from_pk mbedtls_ssl_sig_from_pk #define ssl_states mbedtls_ssl_states #define ssl_transform mbedtls_ssl_transform #define ssl_transform_free mbedtls_ssl_transform_free #define ssl_write mbedtls_ssl_write #define ssl_write_certificate mbedtls_ssl_write_certificate #define ssl_write_change_cipher_spec mbedtls_ssl_write_change_cipher_spec #define ssl_write_finished mbedtls_ssl_write_finished #define ssl_write_record mbedtls_ssl_write_record #define ssl_write_version mbedtls_ssl_write_version #define supported_ciphers mbedtls_cipher_supported #define t_sint mbedtls_mpi_sint #define t_udbl mbedtls_t_udbl #define t_uint mbedtls_mpi_uint #define test_ca_crt mbedtls_test_ca_crt #define test_ca_crt_ec mbedtls_test_ca_crt_ec #define test_ca_crt_rsa mbedtls_test_ca_crt_rsa #define test_ca_key mbedtls_test_ca_key #define test_ca_key_ec mbedtls_test_ca_key_ec #define test_ca_key_rsa mbedtls_test_ca_key_rsa #define test_ca_list mbedtls_test_cas_pem #define test_ca_pwd mbedtls_test_ca_pwd #define test_ca_pwd_ec mbedtls_test_ca_pwd_ec #define test_ca_pwd_rsa mbedtls_test_ca_pwd_rsa #define test_cli_crt mbedtls_test_cli_crt #define test_cli_crt_ec mbedtls_test_cli_crt_ec #define test_cli_crt_rsa mbedtls_test_cli_crt_rsa #define test_cli_key mbedtls_test_cli_key #define test_cli_key_ec mbedtls_test_cli_key_ec #define test_cli_key_rsa mbedtls_test_cli_key_rsa #define test_srv_crt mbedtls_test_srv_crt #define test_srv_crt_ec mbedtls_test_srv_crt_ec #define test_srv_crt_rsa mbedtls_test_srv_crt_rsa #define test_srv_key mbedtls_test_srv_key #define test_srv_key_ec mbedtls_test_srv_key_ec #define test_srv_key_rsa mbedtls_test_srv_key_rsa #define threading_mutex_t mbedtls_threading_mutex_t #define threading_set_alt mbedtls_threading_set_alt #define timing_self_test mbedtls_timing_self_test #define version_check_feature mbedtls_version_check_feature #define version_get_number mbedtls_version_get_number #define version_get_string mbedtls_version_get_string #define version_get_string_full mbedtls_version_get_string_full #define x509_bitstring mbedtls_x509_bitstring #define x509_buf mbedtls_x509_buf #define x509_crl mbedtls_x509_crl #define x509_crl_entry mbedtls_x509_crl_entry #define x509_crl_free mbedtls_x509_crl_free #define x509_crl_info mbedtls_x509_crl_info #define x509_crl_init mbedtls_x509_crl_init #define x509_crl_parse mbedtls_x509_crl_parse #define x509_crl_parse_der mbedtls_x509_crl_parse_der #define x509_crl_parse_file mbedtls_x509_crl_parse_file #define x509_crt mbedtls_x509_crt #define x509_crt_check_extended_key_usage mbedtls_x509_crt_check_extended_key_usage #define x509_crt_check_key_usage mbedtls_x509_crt_check_key_usage #define x509_crt_free mbedtls_x509_crt_free #define x509_crt_info mbedtls_x509_crt_info #define x509_crt_init mbedtls_x509_crt_init #define x509_crt_parse mbedtls_x509_crt_parse #define x509_crt_parse_der mbedtls_x509_crt_parse_der #define x509_crt_parse_file mbedtls_x509_crt_parse_file #define x509_crt_parse_path mbedtls_x509_crt_parse_path #define x509_crt_revoked mbedtls_x509_crt_is_revoked #define x509_crt_verify mbedtls_x509_crt_verify #define x509_csr mbedtls_x509_csr #define x509_csr_free mbedtls_x509_csr_free #define x509_csr_info mbedtls_x509_csr_info #define x509_csr_init mbedtls_x509_csr_init #define x509_csr_parse mbedtls_x509_csr_parse #define x509_csr_parse_der mbedtls_x509_csr_parse_der #define x509_csr_parse_file mbedtls_x509_csr_parse_file #define x509_dn_gets mbedtls_x509_dn_gets #define x509_get_alg mbedtls_x509_get_alg #define x509_get_alg_null mbedtls_x509_get_alg_null #define x509_get_ext mbedtls_x509_get_ext #define x509_get_name mbedtls_x509_get_name #define x509_get_rsassa_pss_params mbedtls_x509_get_rsassa_pss_params #define x509_get_serial mbedtls_x509_get_serial #define x509_get_sig mbedtls_x509_get_sig #define x509_get_sig_alg mbedtls_x509_get_sig_alg #define x509_get_time mbedtls_x509_get_time #define x509_key_size_helper mbedtls_x509_key_size_helper #define x509_name mbedtls_x509_name #define x509_self_test mbedtls_x509_self_test #define x509_sequence mbedtls_x509_sequence #define x509_serial_gets mbedtls_x509_serial_gets #define x509_set_extension mbedtls_x509_set_extension #define x509_sig_alg_gets mbedtls_x509_sig_alg_gets #define x509_string_to_names mbedtls_x509_string_to_names #define x509_time mbedtls_x509_time #define x509_time_expired mbedtls_x509_time_is_past #define x509_time_future mbedtls_x509_time_is_future #define x509_write_extensions mbedtls_x509_write_extensions #define x509_write_names mbedtls_x509_write_names #define x509_write_sig mbedtls_x509_write_sig #define x509write_cert mbedtls_x509write_cert #define x509write_crt_der mbedtls_x509write_crt_der #define x509write_crt_free mbedtls_x509write_crt_free #define x509write_crt_init mbedtls_x509write_crt_init #define x509write_crt_pem mbedtls_x509write_crt_pem #define x509write_crt_set_authority_key_identifier mbedtls_x509write_crt_set_authority_key_identifier #define x509write_crt_set_basic_constraints mbedtls_x509write_crt_set_basic_constraints #define x509write_crt_set_extension mbedtls_x509write_crt_set_extension #define x509write_crt_set_issuer_key mbedtls_x509write_crt_set_issuer_key #define x509write_crt_set_issuer_name mbedtls_x509write_crt_set_issuer_name #define x509write_crt_set_key_usage mbedtls_x509write_crt_set_key_usage #define x509write_crt_set_md_alg mbedtls_x509write_crt_set_md_alg #define x509write_crt_set_ns_cert_type mbedtls_x509write_crt_set_ns_cert_type #define x509write_crt_set_serial mbedtls_x509write_crt_set_serial #define x509write_crt_set_subject_key mbedtls_x509write_crt_set_subject_key #define x509write_crt_set_subject_key_identifier mbedtls_x509write_crt_set_subject_key_identifier #define x509write_crt_set_subject_name mbedtls_x509write_crt_set_subject_name #define x509write_crt_set_validity mbedtls_x509write_crt_set_validity #define x509write_crt_set_version mbedtls_x509write_crt_set_version #define x509write_csr mbedtls_x509write_csr #define x509write_csr_der mbedtls_x509write_csr_der #define x509write_csr_free mbedtls_x509write_csr_free #define x509write_csr_init mbedtls_x509write_csr_init #define x509write_csr_pem mbedtls_x509write_csr_pem #define x509write_csr_set_extension mbedtls_x509write_csr_set_extension #define x509write_csr_set_key mbedtls_x509write_csr_set_key #define x509write_csr_set_key_usage mbedtls_x509write_csr_set_key_usage #define x509write_csr_set_md_alg mbedtls_x509write_csr_set_md_alg #define x509write_csr_set_ns_cert_type mbedtls_x509write_csr_set_ns_cert_type #define x509write_csr_set_subject_name mbedtls_x509write_csr_set_subject_name #define xtea_context mbedtls_xtea_context #define xtea_crypt_cbc mbedtls_xtea_crypt_cbc #define xtea_crypt_ecb mbedtls_xtea_crypt_ecb #define xtea_free mbedtls_xtea_free #define xtea_init mbedtls_xtea_init #define xtea_self_test mbedtls_xtea_self_test #define xtea_setup mbedtls_xtea_setup #endif /* compat-1.3.h */ #endif /* MBEDTLS_DEPRECATED_REMOVED */ fldigi-4.1.06/src/include/mbedtls/sha1.h0000664000175000017500000003126713507401434014646 00000000000000/** * \file sha1.h * * \brief This file contains SHA-1 definitions and functions. * * The Secure Hash Algorithm 1 (SHA-1) cryptographic hash function is defined in * FIPS 180-4: Secure Hash Standard (SHS). * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. We recommend considering stronger message * digests instead. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SHA1_H #define MBEDTLS_SHA1_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED -0x0035 /**< SHA-1 hardware accelerator failed */ #define MBEDTLS_ERR_SHA1_BAD_INPUT_DATA -0x0073 /**< SHA-1 input data was malformed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_SHA1_ALT) // Regular implementation // /** * \brief The SHA-1 context structure. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_sha1_context { uint32_t total[2]; /*!< The number of Bytes processed. */ uint32_t state[5]; /*!< The intermediate digest state. */ unsigned char buffer[64]; /*!< The data block being processed. */ } mbedtls_sha1_context; #else /* MBEDTLS_SHA1_ALT */ #include "sha1_alt.h" #endif /* MBEDTLS_SHA1_ALT */ /** * \brief This function initializes a SHA-1 context. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to initialize. * This must not be \c NULL. * */ void mbedtls_sha1_init( mbedtls_sha1_context *ctx ); /** * \brief This function clears a SHA-1 context. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to clear. This may be \c NULL, * in which case this function does nothing. If it is * not \c NULL, it must point to an initialized * SHA-1 context. * */ void mbedtls_sha1_free( mbedtls_sha1_context *ctx ); /** * \brief This function clones the state of a SHA-1 context. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param dst The SHA-1 context to clone to. This must be initialized. * \param src The SHA-1 context to clone from. This must be initialized. * */ void mbedtls_sha1_clone( mbedtls_sha1_context *dst, const mbedtls_sha1_context *src ); /** * \brief This function starts a SHA-1 checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to initialize. This must be initialized. * * \return \c 0 on success. * \return A negative error code on failure. * */ int mbedtls_sha1_starts_ret( mbedtls_sha1_context *ctx ); /** * \brief This function feeds an input buffer into an ongoing SHA-1 * checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha1_update_ret( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-1 operation, and writes * the result to the output buffer. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to use. This must be initialized and * have a hash operation started. * \param output The SHA-1 checksum result. This must be a writable * buffer of length \c 20 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha1_finish_ret( mbedtls_sha1_context *ctx, unsigned char output[20] ); /** * \brief SHA-1 process data block (internal use only). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to use. This must be initialized. * \param data The data block being processed. This must be a * readable buffer of length \c 64 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. * */ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function starts a SHA-1 checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_starts_ret() in 2.7.0. * * \param ctx The SHA-1 context to initialize. This must be initialized. * */ MBEDTLS_DEPRECATED void mbedtls_sha1_starts( mbedtls_sha1_context *ctx ); /** * \brief This function feeds an input buffer into an ongoing SHA-1 * checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_update_ret() in 2.7.0. * * \param ctx The SHA-1 context. This must be initialized and * have a hash operation started. * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * */ MBEDTLS_DEPRECATED void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-1 operation, and writes * the result to the output buffer. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_finish_ret() in 2.7.0. * * \param ctx The SHA-1 context. This must be initialized and * have a hash operation started. * \param output The SHA-1 checksum result. * This must be a writable buffer of length \c 20 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] ); /** * \brief SHA-1 process data block (internal use only). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_internal_sha1_process() in 2.7.0. * * \param ctx The SHA-1 context. This must be initialized. * \param data The data block being processed. * This must be a readable buffer of length \c 64 bytes. * */ MBEDTLS_DEPRECATED void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function calculates the SHA-1 checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-1 result is calculated as * output = SHA-1(input buffer). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * \param output The SHA-1 checksum result. * This must be a writable buffer of length \c 20 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. * */ int mbedtls_sha1_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function calculates the SHA-1 checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-1 result is calculated as * output = SHA-1(input buffer). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_ret() in 2.7.0 * * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * \param output The SHA-1 checksum result. This must be a writable * buffer of size \c 20 Bytes. * */ MBEDTLS_DEPRECATED void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief The SHA-1 checkup routine. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \return \c 0 on success. * \return \c 1 on failure. * */ int mbedtls_sha1_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_sha1.h */ fldigi-4.1.06/src/include/mbedtls/arc4.h0000664000175000017500000001020613507401434014631 00000000000000/** * \file arc4.h * * \brief The ARCFOUR stream cipher * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_ARC4_H #define MBEDTLS_ARC4_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include /* MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED -0x0019 /**< ARC4 hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_ARC4_ALT) // Regular implementation // /** * \brief ARC4 context structure * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. * */ typedef struct mbedtls_arc4_context { int x; /*!< permutation index */ int y; /*!< permutation index */ unsigned char m[256]; /*!< permutation table */ } mbedtls_arc4_context; #else /* MBEDTLS_ARC4_ALT */ #include "arc4_alt.h" #endif /* MBEDTLS_ARC4_ALT */ /** * \brief Initialize ARC4 context * * \param ctx ARC4 context to be initialized * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ void mbedtls_arc4_init( mbedtls_arc4_context *ctx ); /** * \brief Clear ARC4 context * * \param ctx ARC4 context to be cleared * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ void mbedtls_arc4_free( mbedtls_arc4_context *ctx ); /** * \brief ARC4 key schedule * * \param ctx ARC4 context to be setup * \param key the secret key * \param keylen length of the key, in bytes * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key, unsigned int keylen ); /** * \brief ARC4 cipher function * * \param ctx ARC4 context * \param length length of the input data * \param input buffer holding the input data * \param output buffer for the output data * * \return 0 if successful * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ int mbedtls_arc4_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* arc4.h */ fldigi-4.1.06/src/include/mbedtls/aesni.h0000664000175000017500000001102713507401434015101 00000000000000/** * \file aesni.h * * \brief AES-NI for hardware AES acceleration on some Intel processors * * \warning These functions are only for internal use by other library * functions; you must not call them directly. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_AESNI_H #define MBEDTLS_AESNI_H #include "aes.h" #define MBEDTLS_AESNI_AES 0x02000000u #define MBEDTLS_AESNI_CLMUL 0x00000002u #if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && \ ( defined(__amd64__) || defined(__x86_64__) ) && \ ! defined(MBEDTLS_HAVE_X86_64) #define MBEDTLS_HAVE_X86_64 #endif #if defined(MBEDTLS_HAVE_X86_64) #ifdef __cplusplus extern "C" { #endif /** * \brief Internal function to detect the AES-NI feature in CPUs. * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param what The feature to detect * (MBEDTLS_AESNI_AES or MBEDTLS_AESNI_CLMUL) * * \return 1 if CPU has support for the feature, 0 otherwise */ int mbedtls_aesni_has_support( unsigned int what ); /** * \brief Internal AES-NI AES-ECB block encryption and decryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param ctx AES context * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT * \param input 16-byte input block * \param output 16-byte output block * * \return 0 on success (cannot fail) */ int mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); /** * \brief Internal GCM multiplication: c = a * b in GF(2^128) * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param c Result * \param a First operand * \param b Second operand * * \note Both operands and result are bit strings interpreted as * elements of GF(2^128) as per the GCM spec. */ void mbedtls_aesni_gcm_mult( unsigned char c[16], const unsigned char a[16], const unsigned char b[16] ); /** * \brief Internal round key inversion. This function computes * decryption round keys from the encryption round keys. * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param invkey Round keys for the equivalent inverse cipher * \param fwdkey Original round keys (for encryption) * \param nr Number of rounds (that is, number of round keys minus one) */ void mbedtls_aesni_inverse_key( unsigned char *invkey, const unsigned char *fwdkey, int nr ); /** * \brief Internal key expansion for encryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param rk Destination buffer where the round keys are written * \param key Encryption key * \param bits Key size in bits (must be 128, 192 or 256) * * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH */ int mbedtls_aesni_setkey_enc( unsigned char *rk, const unsigned char *key, size_t bits ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_HAVE_X86_64 */ #endif /* MBEDTLS_AESNI_H */ fldigi-4.1.06/src/include/mbedtls/timing.h0000664000175000017500000001137713507401434015301 00000000000000/** * \file timing.h * * \brief Portable interface to timeouts and to the CPU cycle counter */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_TIMING_H #define MBEDTLS_TIMING_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_TIMING_ALT) // Regular implementation // /** * \brief timer structure */ struct mbedtls_timing_hr_time { unsigned char opaque[32]; }; /** * \brief Context for mbedtls_timing_set/get_delay() */ typedef struct mbedtls_timing_delay_context { struct mbedtls_timing_hr_time timer; uint32_t int_ms; uint32_t fin_ms; } mbedtls_timing_delay_context; #else /* MBEDTLS_TIMING_ALT */ #include "timing_alt.h" #endif /* MBEDTLS_TIMING_ALT */ extern volatile int mbedtls_timing_alarmed; /** * \brief Return the CPU cycle counter value * * \warning This is only a best effort! Do not rely on this! * In particular, it is known to be unreliable on virtual * machines. * * \note This value starts at an unspecified origin and * may wrap around. */ unsigned long mbedtls_timing_hardclock( void ); /** * \brief Return the elapsed time in milliseconds * * \param val points to a timer structure * \param reset If 0, query the elapsed time. Otherwise (re)start the timer. * * \return Elapsed time since the previous reset in ms. When * restarting, this is always 0. * * \note To initialize a timer, call this function with reset=1. * * Determining the elapsed time and resetting the timer is not * atomic on all platforms, so after the sequence * `{ get_timer(1); ...; time1 = get_timer(1); ...; time2 = * get_timer(0) }` the value time1+time2 is only approximately * the delay since the first reset. */ unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ); /** * \brief Setup an alarm clock * * \param seconds delay before the "mbedtls_timing_alarmed" flag is set * (must be >=0) * * \warning Only one alarm at a time is supported. In a threaded * context, this means one for the whole process, not one per * thread. */ void mbedtls_set_alarm( int seconds ); /** * \brief Set a pair of delays to watch * (See \c mbedtls_timing_get_delay().) * * \param data Pointer to timing data. * Must point to a valid \c mbedtls_timing_delay_context struct. * \param int_ms First (intermediate) delay in milliseconds. * The effect if int_ms > fin_ms is unspecified. * \param fin_ms Second (final) delay in milliseconds. * Pass 0 to cancel the current delay. * * \note To set a single delay, either use \c mbedtls_timing_set_timer * directly or use this function with int_ms == fin_ms. */ void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ); /** * \brief Get the status of delays * (Memory helper: number of delays passed.) * * \param data Pointer to timing data * Must point to a valid \c mbedtls_timing_delay_context struct. * * \return -1 if cancelled (fin_ms = 0), * 0 if none of the delays are passed, * 1 if only the intermediate delay is passed, * 2 if the final delay is passed. */ int mbedtls_timing_get_delay( void *data ); #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if a test failed */ int mbedtls_timing_self_test( int verbose ); #endif #ifdef __cplusplus } #endif #endif /* timing.h */ fldigi-4.1.06/src/include/mbedtls/aria.h0000664000175000017500000004013713507401434014722 00000000000000/** * \file aria.h * * \brief ARIA block cipher * * The ARIA algorithm is a symmetric block cipher that can encrypt and * decrypt information. It is defined by the Korean Agency for * Technology and Standards (KATS) in KS X 1213:2004 (in * Korean, but see http://210.104.33.10/ARIA/index-e.html in English) * and also described by the IETF in RFC 5794. */ /* Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ARIA_H #define MBEDTLS_ARIA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #include "platform_util.h" #define MBEDTLS_ARIA_ENCRYPT 1 /**< ARIA encryption. */ #define MBEDTLS_ARIA_DECRYPT 0 /**< ARIA decryption. */ #define MBEDTLS_ARIA_BLOCKSIZE 16 /**< ARIA block size in bytes. */ #define MBEDTLS_ARIA_MAX_ROUNDS 16 /**< Maxiumum number of rounds in ARIA. */ #define MBEDTLS_ARIA_MAX_KEYSIZE 32 /**< Maximum size of an ARIA key in bytes. */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #define MBEDTLS_ERR_ARIA_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( -0x005C ) #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #define MBEDTLS_ERR_ARIA_BAD_INPUT_DATA -0x005C /**< Bad input data. */ #define MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH -0x005E /**< Invalid data input length. */ /* MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE is deprecated and should not be used. */ #define MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE -0x005A /**< Feature not available. For example, an unsupported ARIA key size. */ /* MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED -0x0058 /**< ARIA hardware accelerator failed. */ #if !defined(MBEDTLS_ARIA_ALT) // Regular implementation // #ifdef __cplusplus extern "C" { #endif /** * \brief The ARIA context-type definition. */ typedef struct mbedtls_aria_context { unsigned char nr; /*!< The number of rounds (12, 14 or 16) */ /*! The ARIA round keys. */ uint32_t rk[MBEDTLS_ARIA_MAX_ROUNDS + 1][MBEDTLS_ARIA_BLOCKSIZE / 4]; } mbedtls_aria_context; #else /* MBEDTLS_ARIA_ALT */ #include "aria_alt.h" #endif /* MBEDTLS_ARIA_ALT */ /** * \brief This function initializes the specified ARIA context. * * It must be the first API called before using * the context. * * \param ctx The ARIA context to initialize. This must not be \c NULL. */ void mbedtls_aria_init( mbedtls_aria_context *ctx ); /** * \brief This function releases and clears the specified ARIA context. * * \param ctx The ARIA context to clear. This may be \c NULL, in which * case this function returns immediately. If it is not \c NULL, * it must point to an initialized ARIA context. */ void mbedtls_aria_free( mbedtls_aria_context *ctx ); /** * \brief This function sets the encryption key. * * \param ctx The ARIA context to which the key should be bound. * This must be initialized. * \param key The encryption key. This must be a readable buffer * of size \p keybits Bits. * \param keybits The size of \p key in Bits. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function sets the decryption key. * * \param ctx The ARIA context to which the key should be bound. * This must be initialized. * \param key The decryption key. This must be a readable buffer * of size \p keybits Bits. * \param keybits The size of data passed. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function performs an ARIA single-block encryption or * decryption operation. * * It performs encryption or decryption (depending on whether * the key was set for encryption on decryption) on the input * data buffer defined in the \p input parameter. * * mbedtls_aria_init(), and either mbedtls_aria_setkey_enc() or * mbedtls_aria_setkey_dec() must be called before the first * call to this API with the same context. * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param input The 16-Byte buffer holding the input data. * \param output The 16-Byte buffer holding the output data. * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx, const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE], unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief This function performs an ARIA-CBC encryption or decryption operation * on full blocks. * * It performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer defined in * the \p input parameter. * * It can be called as many times as needed, until all the input * data is processed. mbedtls_aria_init(), and either * mbedtls_aria_setkey_enc() or mbedtls_aria_setkey_dec() must be called * before the first call to this API with the same context. * * \note This function operates on aligned blocks, that is, the input size * must be a multiple of the ARIA block size of 16 Bytes. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the IV, you should * either save it manually or use the cipher module instead. * * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_ARIA_ENCRYPT for encryption, or * #MBEDTLS_ARIA_DECRYPT for decryption. * \param length The length of the input data in Bytes. This must be a * multiple of the block size (16 Bytes). * \param iv Initialization vector (updated after use). * This must be a readable buffer of size 16 Bytes. * \param input The buffer holding the input data. This must * be a readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must * be a writable buffer of length \p length Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief This function performs an ARIA-CFB128 encryption or decryption * operation. * * It performs the operation defined in the \p mode * parameter (encrypt or decrypt), on the input data buffer * defined in the \p input parameter. * * For CFB, you must set up the context with mbedtls_aria_setkey_enc(), * regardless of whether you are performing an encryption or decryption * operation, that is, regardless of the \p mode parameter. This is * because CFB mode uses the same key schedule for encryption and * decryption. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the * IV, you must either save it manually or use the cipher * module instead. * * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_ARIA_ENCRYPT for encryption, or * #MBEDTLS_ARIA_DECRYPT for decryption. * \param length The length of the input data \p input in Bytes. * \param iv_off The offset in IV (updated after use). * This must not be larger than 15. * \param iv The initialization vector (updated after use). * This must be a readable buffer of size 16 Bytes. * \param input The buffer holding the input data. This must * be a readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must * be a writable buffer of length \p length Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief This function performs an ARIA-CTR encryption or decryption * operation. * * This function performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer * defined in the \p input parameter. * * Due to the nature of CTR, you must use the same key schedule * for both encryption and decryption operations. Therefore, you * must use the context initialized with mbedtls_aria_setkey_enc() * for both #MBEDTLS_ARIA_ENCRYPT and #MBEDTLS_ARIA_DECRYPT. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**128 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first 12 bytes for the * per-message nonce, and the last 4 bytes for internal use. In that * case, before calling this function on a new message you need to * set the first 12 bytes of \p nonce_counter to your chosen nonce * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p * stream_block to be ignored). That way, you can encrypt at most * 2**96 messages of up to 2**32 blocks each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be unique. * The recommended way to ensure uniqueness is to use a message * counter. An alternative is to generate random nonces, but this * limits the number of messages that can be securely encrypted: * for example, with 96-bit random nonces, you should not encrypt * more than 2**32 messages with the same key. * * Note that for both stategies, sizes are measured in blocks and * that an ARIA block is 16 bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param length The length of the input data \p input in Bytes. * \param nc_off The offset in Bytes in the current \p stream_block, * for resuming within the current cipher stream. The * offset pointer should be \c 0 at the start of a * stream. This must not be larger than \c 15 Bytes. * \param nonce_counter The 128-bit nonce and counter. This must point to * a read/write buffer of length \c 16 bytes. * \param stream_block The saved stream block for resuming. This must * point to a read/write buffer of length \c 16 bytes. * This is overwritten by the function. * \param input The buffer holding the input data. This must * be a readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must * be a writable buffer of length \p length Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE], unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine. * * \return \c 0 on success, or \c 1 on failure. */ int mbedtls_aria_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* aria.h */ fldigi-4.1.06/src/include/mbedtls/error.h0000664000175000017500000001002713507401434015132 00000000000000/** * \file error.h * * \brief Error to string translation */ /* * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ERROR_H #define MBEDTLS_ERROR_H #include /** * Error code layout. * * Currently we try to keep all error codes within the negative space of 16 * bits signed integers to support all platforms (-0x0001 - -0x7FFF). In * addition we'd like to give two layers of information on the error if * possible. * * For that purpose the error codes are segmented in the following manner: * * 16 bit error code bit-segmentation * * 1 bit - Unused (sign bit) * 3 bits - High level module ID * 5 bits - Module-dependent error code * 7 bits - Low level module errors * * For historical reasons, low-level error codes are divided in even and odd, * even codes were assigned first, and -1 is reserved for other errors. * * Low-level module errors (0x0002-0x007E, 0x0003-0x007F) * * Module Nr Codes assigned * MPI 7 0x0002-0x0010 * GCM 3 0x0012-0x0014 0x0013-0x0013 * BLOWFISH 3 0x0016-0x0018 0x0017-0x0017 * THREADING 3 0x001A-0x001E * AES 5 0x0020-0x0022 0x0021-0x0025 * CAMELLIA 3 0x0024-0x0026 0x0027-0x0027 * XTEA 2 0x0028-0x0028 0x0029-0x0029 * BASE64 2 0x002A-0x002C * OID 1 0x002E-0x002E 0x000B-0x000B * PADLOCK 1 0x0030-0x0030 * DES 2 0x0032-0x0032 0x0033-0x0033 * CTR_DBRG 4 0x0034-0x003A * ENTROPY 3 0x003C-0x0040 0x003D-0x003F * NET 13 0x0042-0x0052 0x0043-0x0049 * ARIA 4 0x0058-0x005E * ASN1 7 0x0060-0x006C * CMAC 1 0x007A-0x007A * PBKDF2 1 0x007C-0x007C * HMAC_DRBG 4 0x0003-0x0009 * CCM 3 0x000D-0x0011 * ARC4 1 0x0019-0x0019 * MD2 1 0x002B-0x002B * MD4 1 0x002D-0x002D * MD5 1 0x002F-0x002F * RIPEMD160 1 0x0031-0x0031 * SHA1 1 0x0035-0x0035 0x0073-0x0073 * SHA256 1 0x0037-0x0037 0x0074-0x0074 * SHA512 1 0x0039-0x0039 0x0075-0x0075 * CHACHA20 3 0x0051-0x0055 * POLY1305 3 0x0057-0x005B * CHACHAPOLY 2 0x0054-0x0056 * PLATFORM 1 0x0070-0x0072 * * High-level module nr (3 bits - 0x0...-0x7...) * Name ID Nr of Errors * PEM 1 9 * PKCS#12 1 4 (Started from top) * X509 2 20 * PKCS5 2 4 (Started from top) * DHM 3 11 * PK 3 15 (Started from top) * RSA 4 11 * ECP 4 10 (Started from top) * MD 5 5 * HKDF 5 1 (Started from top) * CIPHER 6 8 * SSL 6 23 (Started from top) * SSL 7 32 * * Module dependent error code (5 bits 0x.00.-0x.F8.) */ #ifdef __cplusplus extern "C" { #endif /** * \brief Translate a mbed TLS error code into a string representation, * Result is truncated if necessary and always includes a terminating * null byte. * * \param errnum error code * \param buffer buffer to place representation in * \param buflen length of the buffer */ void mbedtls_strerror( int errnum, char *buffer, size_t buflen ); #ifdef __cplusplus } #endif #endif /* error.h */ fldigi-4.1.06/src/include/mbedtls/sha256.h0000664000175000017500000002565713507401434015030 00000000000000/** * \file sha256.h * * \brief This file contains SHA-224 and SHA-256 definitions and functions. * * The Secure Hash Algorithms 224 and 256 (SHA-224 and SHA-256) cryptographic * hash functions are defined in FIPS 180-4: Secure Hash Standard (SHS). */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SHA256_H #define MBEDTLS_SHA256_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED -0x0037 /**< SHA-256 hardware accelerator failed */ #define MBEDTLS_ERR_SHA256_BAD_INPUT_DATA -0x0074 /**< SHA-256 input data was malformed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_SHA256_ALT) // Regular implementation // /** * \brief The SHA-256 context structure. * * The structure is used both for SHA-256 and for SHA-224 * checksum calculations. The choice between these two is * made in the call to mbedtls_sha256_starts_ret(). */ typedef struct mbedtls_sha256_context { uint32_t total[2]; /*!< The number of Bytes processed. */ uint32_t state[8]; /*!< The intermediate digest state. */ unsigned char buffer[64]; /*!< The data block being processed. */ int is224; /*!< Determines which function to use: 0: Use SHA-256, or 1: Use SHA-224. */ } mbedtls_sha256_context; #else /* MBEDTLS_SHA256_ALT */ #include "sha256_alt.h" #endif /* MBEDTLS_SHA256_ALT */ /** * \brief This function initializes a SHA-256 context. * * \param ctx The SHA-256 context to initialize. This must not be \c NULL. */ void mbedtls_sha256_init( mbedtls_sha256_context *ctx ); /** * \brief This function clears a SHA-256 context. * * \param ctx The SHA-256 context to clear. This may be \c NULL, in which * case this function returns immediately. If it is not \c NULL, * it must point to an initialized SHA-256 context. */ void mbedtls_sha256_free( mbedtls_sha256_context *ctx ); /** * \brief This function clones the state of a SHA-256 context. * * \param dst The destination context. This must be initialized. * \param src The context to clone. This must be initialized. */ void mbedtls_sha256_clone( mbedtls_sha256_context *dst, const mbedtls_sha256_context *src ); /** * \brief This function starts a SHA-224 or SHA-256 checksum * calculation. * * \param ctx The context to use. This must be initialized. * \param is224 This determines which function to use. This must be * either \c 0 for SHA-256, or \c 1 for SHA-224. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-256 checksum calculation. * * \param ctx The SHA-256 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-256 operation, and writes * the result to the output buffer. * * \param ctx The SHA-256 context. This must be initialized * and have a hash operation started. * \param output The SHA-224 or SHA-256 checksum result. * This must be a writable buffer of length \c 32 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx, unsigned char output[32] ); /** * \brief This function processes a single data block within * the ongoing SHA-256 computation. This function is for * internal use only. * * \param ctx The SHA-256 context. This must be initialized. * \param data The buffer holding one block of data. This must * be a readable buffer of length \c 64 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function starts a SHA-224 or SHA-256 checksum * calculation. * * \deprecated Superseded by mbedtls_sha256_starts_ret() in 2.7.0. * * \param ctx The context to use. This must be initialized. * \param is224 Determines which function to use. This must be * either \c 0 for SHA-256, or \c 1 for SHA-224. */ MBEDTLS_DEPRECATED void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-256 checksum calculation. * * \deprecated Superseded by mbedtls_sha256_update_ret() in 2.7.0. * * \param ctx The SHA-256 context to use. This must be * initialized and have a hash operation started. * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-256 operation, and writes * the result to the output buffer. * * \deprecated Superseded by mbedtls_sha256_finish_ret() in 2.7.0. * * \param ctx The SHA-256 context. This must be initialized and * have a hash operation started. * \param output The SHA-224 or SHA-256 checksum result. This must be * a writable buffer of length \c 32 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] ); /** * \brief This function processes a single data block within * the ongoing SHA-256 computation. This function is for * internal use only. * * \deprecated Superseded by mbedtls_internal_sha256_process() in 2.7.0. * * \param ctx The SHA-256 context. This must be initialized. * \param data The buffer holding one block of data. This must be * a readable buffer of size \c 64 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function calculates the SHA-224 or SHA-256 * checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-256 result is calculated as * output = SHA-256(input buffer). * * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-224 or SHA-256 checksum result. This must * be a writable buffer of length \c 32 Bytes. * \param is224 Determines which function to use. This must be * either \c 0 for SHA-256, or \c 1 for SHA-224. */ int mbedtls_sha256_ret( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function calculates the SHA-224 or SHA-256 checksum * of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-256 result is calculated as * output = SHA-256(input buffer). * * \deprecated Superseded by mbedtls_sha256_ret() in 2.7.0. * * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-224 or SHA-256 checksum result. This must be * a writable buffer of length \c 32 Bytes. * \param is224 Determines which function to use. This must be either * \c 0 for SHA-256, or \c 1 for SHA-224. */ MBEDTLS_DEPRECATED void mbedtls_sha256( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief The SHA-224 and SHA-256 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_sha256_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_sha256.h */ fldigi-4.1.06/src/include/mbedtls/bn_mul.h0000664000175000017500000010654313507401434015266 00000000000000/** * \file bn_mul.h * * \brief Multi-precision integer library */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * Multiply source vector [s] with b, add result * to destination vector [d] and set carry c. * * Currently supports: * * . IA-32 (386+) . AMD64 / EM64T * . IA-32 (SSE2) . Motorola 68000 * . PowerPC, 32-bit . MicroBlaze * . PowerPC, 64-bit . TriCore * . SPARC v8 . ARM v3+ * . Alpha . MIPS32 * . C, longlong . C, generic */ #ifndef MBEDTLS_BN_MUL_H #define MBEDTLS_BN_MUL_H #include "bignum.h" #if defined(MBEDTLS_HAVE_ASM) #ifndef asm #define asm __asm #endif /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ #if defined(__GNUC__) && \ ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) /* * Disable use of the i386 assembly code below if option -O0, to disable all * compiler optimisations, is passed, detected with __OPTIMIZE__ * This is done as the number of registers used in the assembly code doesn't * work with the -O0 option. */ #if defined(__i386__) && defined(__OPTIMIZE__) #define MULADDC_INIT \ asm( \ "movl %%ebx, %0 \n\t" \ "movl %5, %%esi \n\t" \ "movl %6, %%edi \n\t" \ "movl %7, %%ecx \n\t" \ "movl %8, %%ebx \n\t" #define MULADDC_CORE \ "lodsl \n\t" \ "mull %%ebx \n\t" \ "addl %%ecx, %%eax \n\t" \ "adcl $0, %%edx \n\t" \ "addl (%%edi), %%eax \n\t" \ "adcl $0, %%edx \n\t" \ "movl %%edx, %%ecx \n\t" \ "stosl \n\t" #if defined(MBEDTLS_HAVE_SSE2) #define MULADDC_HUIT \ "movd %%ecx, %%mm1 \n\t" \ "movd %%ebx, %%mm0 \n\t" \ "movd (%%edi), %%mm3 \n\t" \ "paddq %%mm3, %%mm1 \n\t" \ "movd (%%esi), %%mm2 \n\t" \ "pmuludq %%mm0, %%mm2 \n\t" \ "movd 4(%%esi), %%mm4 \n\t" \ "pmuludq %%mm0, %%mm4 \n\t" \ "movd 8(%%esi), %%mm6 \n\t" \ "pmuludq %%mm0, %%mm6 \n\t" \ "movd 12(%%esi), %%mm7 \n\t" \ "pmuludq %%mm0, %%mm7 \n\t" \ "paddq %%mm2, %%mm1 \n\t" \ "movd 4(%%edi), %%mm3 \n\t" \ "paddq %%mm4, %%mm3 \n\t" \ "movd 8(%%edi), %%mm5 \n\t" \ "paddq %%mm6, %%mm5 \n\t" \ "movd 12(%%edi), %%mm4 \n\t" \ "paddq %%mm4, %%mm7 \n\t" \ "movd %%mm1, (%%edi) \n\t" \ "movd 16(%%esi), %%mm2 \n\t" \ "pmuludq %%mm0, %%mm2 \n\t" \ "psrlq $32, %%mm1 \n\t" \ "movd 20(%%esi), %%mm4 \n\t" \ "pmuludq %%mm0, %%mm4 \n\t" \ "paddq %%mm3, %%mm1 \n\t" \ "movd 24(%%esi), %%mm6 \n\t" \ "pmuludq %%mm0, %%mm6 \n\t" \ "movd %%mm1, 4(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "movd 28(%%esi), %%mm3 \n\t" \ "pmuludq %%mm0, %%mm3 \n\t" \ "paddq %%mm5, %%mm1 \n\t" \ "movd 16(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm2 \n\t" \ "movd %%mm1, 8(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm7, %%mm1 \n\t" \ "movd 20(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm4 \n\t" \ "movd %%mm1, 12(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm2, %%mm1 \n\t" \ "movd 24(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm6 \n\t" \ "movd %%mm1, 16(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm4, %%mm1 \n\t" \ "movd 28(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm3 \n\t" \ "movd %%mm1, 20(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm6, %%mm1 \n\t" \ "movd %%mm1, 24(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm3, %%mm1 \n\t" \ "movd %%mm1, 28(%%edi) \n\t" \ "addl $32, %%edi \n\t" \ "addl $32, %%esi \n\t" \ "psrlq $32, %%mm1 \n\t" \ "movd %%mm1, %%ecx \n\t" #define MULADDC_STOP \ "emms \n\t" \ "movl %4, %%ebx \n\t" \ "movl %%ecx, %1 \n\t" \ "movl %%edi, %2 \n\t" \ "movl %%esi, %3 \n\t" \ : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ : "eax", "ebx", "ecx", "edx", "esi", "edi" \ ); #else #define MULADDC_STOP \ "movl %4, %%ebx \n\t" \ "movl %%ecx, %1 \n\t" \ "movl %%edi, %2 \n\t" \ "movl %%esi, %3 \n\t" \ : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ : "eax", "ebx", "ecx", "edx", "esi", "edi" \ ); #endif /* SSE2 */ #endif /* i386 */ #if defined(__amd64__) || defined (__x86_64__) #define MULADDC_INIT \ asm( \ "xorq %%r8, %%r8\n" #define MULADDC_CORE \ "movq (%%rsi), %%rax\n" \ "mulq %%rbx\n" \ "addq $8, %%rsi\n" \ "addq %%rcx, %%rax\n" \ "movq %%r8, %%rcx\n" \ "adcq $0, %%rdx\n" \ "nop \n" \ "addq %%rax, (%%rdi)\n" \ "adcq %%rdx, %%rcx\n" \ "addq $8, %%rdi\n" #define MULADDC_STOP \ : "+c" (c), "+D" (d), "+S" (s) \ : "b" (b) \ : "rax", "rdx", "r8" \ ); #endif /* AMD64 */ #if defined(__mc68020__) || defined(__mcpu32__) #define MULADDC_INIT \ asm( \ "movl %3, %%a2 \n\t" \ "movl %4, %%a3 \n\t" \ "movl %5, %%d3 \n\t" \ "movl %6, %%d2 \n\t" \ "moveq #0, %%d0 \n\t" #define MULADDC_CORE \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "moveq #0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "addxl %%d4, %%d3 \n\t" #define MULADDC_STOP \ "movl %%d3, %0 \n\t" \ "movl %%a3, %1 \n\t" \ "movl %%a2, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "d0", "d1", "d2", "d3", "d4", "a2", "a3" \ ); #define MULADDC_HUIT \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "addxl %%d0, %%d3 \n\t" #endif /* MC68000 */ #if defined(__powerpc64__) || defined(__ppc64__) #if defined(__MACH__) && defined(__APPLE__) #define MULADDC_INIT \ asm( \ "ld r3, %3 \n\t" \ "ld r4, %4 \n\t" \ "ld r5, %5 \n\t" \ "ld r6, %6 \n\t" \ "addi r3, r3, -8 \n\t" \ "addi r4, r4, -8 \n\t" \ "addic r5, r5, 0 \n\t" #define MULADDC_CORE \ "ldu r7, 8(r3) \n\t" \ "mulld r8, r7, r6 \n\t" \ "mulhdu r9, r7, r6 \n\t" \ "adde r8, r8, r5 \n\t" \ "ld r7, 8(r4) \n\t" \ "addze r5, r9 \n\t" \ "addc r8, r8, r7 \n\t" \ "stdu r8, 8(r4) \n\t" #define MULADDC_STOP \ "addze r5, r5 \n\t" \ "addi r4, r4, 8 \n\t" \ "addi r3, r3, 8 \n\t" \ "std r5, %0 \n\t" \ "std r4, %1 \n\t" \ "std r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #else /* __MACH__ && __APPLE__ */ #define MULADDC_INIT \ asm( \ "ld %%r3, %3 \n\t" \ "ld %%r4, %4 \n\t" \ "ld %%r5, %5 \n\t" \ "ld %%r6, %6 \n\t" \ "addi %%r3, %%r3, -8 \n\t" \ "addi %%r4, %%r4, -8 \n\t" \ "addic %%r5, %%r5, 0 \n\t" #define MULADDC_CORE \ "ldu %%r7, 8(%%r3) \n\t" \ "mulld %%r8, %%r7, %%r6 \n\t" \ "mulhdu %%r9, %%r7, %%r6 \n\t" \ "adde %%r8, %%r8, %%r5 \n\t" \ "ld %%r7, 8(%%r4) \n\t" \ "addze %%r5, %%r9 \n\t" \ "addc %%r8, %%r8, %%r7 \n\t" \ "stdu %%r8, 8(%%r4) \n\t" #define MULADDC_STOP \ "addze %%r5, %%r5 \n\t" \ "addi %%r4, %%r4, 8 \n\t" \ "addi %%r3, %%r3, 8 \n\t" \ "std %%r5, %0 \n\t" \ "std %%r4, %1 \n\t" \ "std %%r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #endif /* __MACH__ && __APPLE__ */ #elif defined(__powerpc__) || defined(__ppc__) /* end PPC64/begin PPC32 */ #if defined(__MACH__) && defined(__APPLE__) #define MULADDC_INIT \ asm( \ "lwz r3, %3 \n\t" \ "lwz r4, %4 \n\t" \ "lwz r5, %5 \n\t" \ "lwz r6, %6 \n\t" \ "addi r3, r3, -4 \n\t" \ "addi r4, r4, -4 \n\t" \ "addic r5, r5, 0 \n\t" #define MULADDC_CORE \ "lwzu r7, 4(r3) \n\t" \ "mullw r8, r7, r6 \n\t" \ "mulhwu r9, r7, r6 \n\t" \ "adde r8, r8, r5 \n\t" \ "lwz r7, 4(r4) \n\t" \ "addze r5, r9 \n\t" \ "addc r8, r8, r7 \n\t" \ "stwu r8, 4(r4) \n\t" #define MULADDC_STOP \ "addze r5, r5 \n\t" \ "addi r4, r4, 4 \n\t" \ "addi r3, r3, 4 \n\t" \ "stw r5, %0 \n\t" \ "stw r4, %1 \n\t" \ "stw r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #else /* __MACH__ && __APPLE__ */ #define MULADDC_INIT \ asm( \ "lwz %%r3, %3 \n\t" \ "lwz %%r4, %4 \n\t" \ "lwz %%r5, %5 \n\t" \ "lwz %%r6, %6 \n\t" \ "addi %%r3, %%r3, -4 \n\t" \ "addi %%r4, %%r4, -4 \n\t" \ "addic %%r5, %%r5, 0 \n\t" #define MULADDC_CORE \ "lwzu %%r7, 4(%%r3) \n\t" \ "mullw %%r8, %%r7, %%r6 \n\t" \ "mulhwu %%r9, %%r7, %%r6 \n\t" \ "adde %%r8, %%r8, %%r5 \n\t" \ "lwz %%r7, 4(%%r4) \n\t" \ "addze %%r5, %%r9 \n\t" \ "addc %%r8, %%r8, %%r7 \n\t" \ "stwu %%r8, 4(%%r4) \n\t" #define MULADDC_STOP \ "addze %%r5, %%r5 \n\t" \ "addi %%r4, %%r4, 4 \n\t" \ "addi %%r3, %%r3, 4 \n\t" \ "stw %%r5, %0 \n\t" \ "stw %%r4, %1 \n\t" \ "stw %%r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #endif /* __MACH__ && __APPLE__ */ #endif /* PPC32 */ /* * The Sparc(64) assembly is reported to be broken. * Disable it for now, until we're able to fix it. */ #if 0 && defined(__sparc__) #if defined(__sparc64__) #define MULADDC_INIT \ asm( \ "ldx %3, %%o0 \n\t" \ "ldx %4, %%o1 \n\t" \ "ld %5, %%o2 \n\t" \ "ld %6, %%o3 \n\t" #define MULADDC_CORE \ "ld [%%o0], %%o4 \n\t" \ "inc 4, %%o0 \n\t" \ "ld [%%o1], %%o5 \n\t" \ "umul %%o3, %%o4, %%o4 \n\t" \ "addcc %%o4, %%o2, %%o4 \n\t" \ "rd %%y, %%g1 \n\t" \ "addx %%g1, 0, %%g1 \n\t" \ "addcc %%o4, %%o5, %%o4 \n\t" \ "st %%o4, [%%o1] \n\t" \ "addx %%g1, 0, %%o2 \n\t" \ "inc 4, %%o1 \n\t" #define MULADDC_STOP \ "st %%o2, %0 \n\t" \ "stx %%o1, %1 \n\t" \ "stx %%o0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "g1", "o0", "o1", "o2", "o3", "o4", \ "o5" \ ); #else /* __sparc64__ */ #define MULADDC_INIT \ asm( \ "ld %3, %%o0 \n\t" \ "ld %4, %%o1 \n\t" \ "ld %5, %%o2 \n\t" \ "ld %6, %%o3 \n\t" #define MULADDC_CORE \ "ld [%%o0], %%o4 \n\t" \ "inc 4, %%o0 \n\t" \ "ld [%%o1], %%o5 \n\t" \ "umul %%o3, %%o4, %%o4 \n\t" \ "addcc %%o4, %%o2, %%o4 \n\t" \ "rd %%y, %%g1 \n\t" \ "addx %%g1, 0, %%g1 \n\t" \ "addcc %%o4, %%o5, %%o4 \n\t" \ "st %%o4, [%%o1] \n\t" \ "addx %%g1, 0, %%o2 \n\t" \ "inc 4, %%o1 \n\t" #define MULADDC_STOP \ "st %%o2, %0 \n\t" \ "st %%o1, %1 \n\t" \ "st %%o0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "g1", "o0", "o1", "o2", "o3", "o4", \ "o5" \ ); #endif /* __sparc64__ */ #endif /* __sparc__ */ #if defined(__microblaze__) || defined(microblaze) #define MULADDC_INIT \ asm( \ "lwi r3, %3 \n\t" \ "lwi r4, %4 \n\t" \ "lwi r5, %5 \n\t" \ "lwi r6, %6 \n\t" \ "andi r7, r6, 0xffff \n\t" \ "bsrli r6, r6, 16 \n\t" #define MULADDC_CORE \ "lhui r8, r3, 0 \n\t" \ "addi r3, r3, 2 \n\t" \ "lhui r9, r3, 0 \n\t" \ "addi r3, r3, 2 \n\t" \ "mul r10, r9, r6 \n\t" \ "mul r11, r8, r7 \n\t" \ "mul r12, r9, r7 \n\t" \ "mul r13, r8, r6 \n\t" \ "bsrli r8, r10, 16 \n\t" \ "bsrli r9, r11, 16 \n\t" \ "add r13, r13, r8 \n\t" \ "add r13, r13, r9 \n\t" \ "bslli r10, r10, 16 \n\t" \ "bslli r11, r11, 16 \n\t" \ "add r12, r12, r10 \n\t" \ "addc r13, r13, r0 \n\t" \ "add r12, r12, r11 \n\t" \ "addc r13, r13, r0 \n\t" \ "lwi r10, r4, 0 \n\t" \ "add r12, r12, r10 \n\t" \ "addc r13, r13, r0 \n\t" \ "add r12, r12, r5 \n\t" \ "addc r5, r13, r0 \n\t" \ "swi r12, r4, 0 \n\t" \ "addi r4, r4, 4 \n\t" #define MULADDC_STOP \ "swi r5, %0 \n\t" \ "swi r4, %1 \n\t" \ "swi r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", \ "r9", "r10", "r11", "r12", "r13" \ ); #endif /* MicroBlaze */ #if defined(__tricore__) #define MULADDC_INIT \ asm( \ "ld.a %%a2, %3 \n\t" \ "ld.a %%a3, %4 \n\t" \ "ld.w %%d4, %5 \n\t" \ "ld.w %%d1, %6 \n\t" \ "xor %%d5, %%d5 \n\t" #define MULADDC_CORE \ "ld.w %%d0, [%%a2+] \n\t" \ "madd.u %%e2, %%e4, %%d0, %%d1 \n\t" \ "ld.w %%d0, [%%a3] \n\t" \ "addx %%d2, %%d2, %%d0 \n\t" \ "addc %%d3, %%d3, 0 \n\t" \ "mov %%d4, %%d3 \n\t" \ "st.w [%%a3+], %%d2 \n\t" #define MULADDC_STOP \ "st.w %0, %%d4 \n\t" \ "st.a %1, %%a3 \n\t" \ "st.a %2, %%a2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "d0", "d1", "e2", "d4", "a2", "a3" \ ); #endif /* TriCore */ /* * Note, gcc -O0 by default uses r7 for the frame pointer, so it complains about * our use of r7 below, unless -fomit-frame-pointer is passed. * * On the other hand, -fomit-frame-pointer is implied by any -Ox options with * x !=0, which we can detect using __OPTIMIZE__ (which is also defined by * clang and armcc5 under the same conditions). * * So, only use the optimized assembly below for optimized build, which avoids * the build error and is pretty reasonable anyway. */ #if defined(__GNUC__) && !defined(__OPTIMIZE__) #define MULADDC_CANNOT_USE_R7 #endif #if defined(__arm__) && !defined(MULADDC_CANNOT_USE_R7) #if defined(__thumb__) && !defined(__thumb2__) #define MULADDC_INIT \ asm( \ "ldr r0, %3 \n\t" \ "ldr r1, %4 \n\t" \ "ldr r2, %5 \n\t" \ "ldr r3, %6 \n\t" \ "lsr r7, r3, #16 \n\t" \ "mov r9, r7 \n\t" \ "lsl r7, r3, #16 \n\t" \ "lsr r7, r7, #16 \n\t" \ "mov r8, r7 \n\t" #define MULADDC_CORE \ "ldmia r0!, {r6} \n\t" \ "lsr r7, r6, #16 \n\t" \ "lsl r6, r6, #16 \n\t" \ "lsr r6, r6, #16 \n\t" \ "mov r4, r8 \n\t" \ "mul r4, r6 \n\t" \ "mov r3, r9 \n\t" \ "mul r6, r3 \n\t" \ "mov r5, r9 \n\t" \ "mul r5, r7 \n\t" \ "mov r3, r8 \n\t" \ "mul r7, r3 \n\t" \ "lsr r3, r6, #16 \n\t" \ "add r5, r5, r3 \n\t" \ "lsr r3, r7, #16 \n\t" \ "add r5, r5, r3 \n\t" \ "add r4, r4, r2 \n\t" \ "mov r2, #0 \n\t" \ "adc r5, r2 \n\t" \ "lsl r3, r6, #16 \n\t" \ "add r4, r4, r3 \n\t" \ "adc r5, r2 \n\t" \ "lsl r3, r7, #16 \n\t" \ "add r4, r4, r3 \n\t" \ "adc r5, r2 \n\t" \ "ldr r3, [r1] \n\t" \ "add r4, r4, r3 \n\t" \ "adc r2, r5 \n\t" \ "stmia r1!, {r4} \n\t" #define MULADDC_STOP \ "str r2, %0 \n\t" \ "str r1, %1 \n\t" \ "str r0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r0", "r1", "r2", "r3", "r4", "r5", \ "r6", "r7", "r8", "r9", "cc" \ ); #elif defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1) #define MULADDC_INIT \ asm( #define MULADDC_CORE \ "ldr r0, [%0], #4 \n\t" \ "ldr r1, [%1] \n\t" \ "umaal r1, %2, %3, r0 \n\t" \ "str r1, [%1], #4 \n\t" #define MULADDC_STOP \ : "=r" (s), "=r" (d), "=r" (c) \ : "r" (b), "0" (s), "1" (d), "2" (c) \ : "r0", "r1", "memory" \ ); #else #define MULADDC_INIT \ asm( \ "ldr r0, %3 \n\t" \ "ldr r1, %4 \n\t" \ "ldr r2, %5 \n\t" \ "ldr r3, %6 \n\t" #define MULADDC_CORE \ "ldr r4, [r0], #4 \n\t" \ "mov r5, #0 \n\t" \ "ldr r6, [r1] \n\t" \ "umlal r2, r5, r3, r4 \n\t" \ "adds r7, r6, r2 \n\t" \ "adc r2, r5, #0 \n\t" \ "str r7, [r1], #4 \n\t" #define MULADDC_STOP \ "str r2, %0 \n\t" \ "str r1, %1 \n\t" \ "str r0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r0", "r1", "r2", "r3", "r4", "r5", \ "r6", "r7", "cc" \ ); #endif /* Thumb */ #endif /* ARMv3 */ #if defined(__alpha__) #define MULADDC_INIT \ asm( \ "ldq $1, %3 \n\t" \ "ldq $2, %4 \n\t" \ "ldq $3, %5 \n\t" \ "ldq $4, %6 \n\t" #define MULADDC_CORE \ "ldq $6, 0($1) \n\t" \ "addq $1, 8, $1 \n\t" \ "mulq $6, $4, $7 \n\t" \ "umulh $6, $4, $6 \n\t" \ "addq $7, $3, $7 \n\t" \ "cmpult $7, $3, $3 \n\t" \ "ldq $5, 0($2) \n\t" \ "addq $7, $5, $7 \n\t" \ "cmpult $7, $5, $5 \n\t" \ "stq $7, 0($2) \n\t" \ "addq $2, 8, $2 \n\t" \ "addq $6, $3, $3 \n\t" \ "addq $5, $3, $3 \n\t" #define MULADDC_STOP \ "stq $3, %0 \n\t" \ "stq $2, %1 \n\t" \ "stq $1, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "$1", "$2", "$3", "$4", "$5", "$6", "$7" \ ); #endif /* Alpha */ #if defined(__mips__) && !defined(__mips64) #define MULADDC_INIT \ asm( \ "lw $10, %3 \n\t" \ "lw $11, %4 \n\t" \ "lw $12, %5 \n\t" \ "lw $13, %6 \n\t" #define MULADDC_CORE \ "lw $14, 0($10) \n\t" \ "multu $13, $14 \n\t" \ "addi $10, $10, 4 \n\t" \ "mflo $14 \n\t" \ "mfhi $9 \n\t" \ "addu $14, $12, $14 \n\t" \ "lw $15, 0($11) \n\t" \ "sltu $12, $14, $12 \n\t" \ "addu $15, $14, $15 \n\t" \ "sltu $14, $15, $14 \n\t" \ "addu $12, $12, $9 \n\t" \ "sw $15, 0($11) \n\t" \ "addu $12, $12, $14 \n\t" \ "addi $11, $11, 4 \n\t" #define MULADDC_STOP \ "sw $12, %0 \n\t" \ "sw $11, %1 \n\t" \ "sw $10, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "$9", "$10", "$11", "$12", "$13", "$14", "$15" \ ); #endif /* MIPS */ #endif /* GNUC */ #if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) #define MULADDC_INIT \ __asm mov esi, s \ __asm mov edi, d \ __asm mov ecx, c \ __asm mov ebx, b #define MULADDC_CORE \ __asm lodsd \ __asm mul ebx \ __asm add eax, ecx \ __asm adc edx, 0 \ __asm add eax, [edi] \ __asm adc edx, 0 \ __asm mov ecx, edx \ __asm stosd #if defined(MBEDTLS_HAVE_SSE2) #define EMIT __asm _emit #define MULADDC_HUIT \ EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ EMIT 0x0F EMIT 0x6E EMIT 0x1F \ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ EMIT 0x0F EMIT 0x6E EMIT 0x16 \ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ EMIT 0x0F EMIT 0x7E EMIT 0x0F \ EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0x7E EMIT 0xC9 #define MULADDC_STOP \ EMIT 0x0F EMIT 0x77 \ __asm mov c, ecx \ __asm mov d, edi \ __asm mov s, esi \ #else #define MULADDC_STOP \ __asm mov c, ecx \ __asm mov d, edi \ __asm mov s, esi \ #endif /* SSE2 */ #endif /* MSVC */ #endif /* MBEDTLS_HAVE_ASM */ #if !defined(MULADDC_CORE) #if defined(MBEDTLS_HAVE_UDBL) #define MULADDC_INIT \ { \ mbedtls_t_udbl r; \ mbedtls_mpi_uint r0, r1; #define MULADDC_CORE \ r = *(s++) * (mbedtls_t_udbl) b; \ r0 = (mbedtls_mpi_uint) r; \ r1 = (mbedtls_mpi_uint)( r >> biL ); \ r0 += c; r1 += (r0 < c); \ r0 += *d; r1 += (r0 < *d); \ c = r1; *(d++) = r0; #define MULADDC_STOP \ } #else #define MULADDC_INIT \ { \ mbedtls_mpi_uint s0, s1, b0, b1; \ mbedtls_mpi_uint r0, r1, rx, ry; \ b0 = ( b << biH ) >> biH; \ b1 = ( b >> biH ); #define MULADDC_CORE \ s0 = ( *s << biH ) >> biH; \ s1 = ( *s >> biH ); s++; \ rx = s0 * b1; r0 = s0 * b0; \ ry = s1 * b0; r1 = s1 * b1; \ r1 += ( rx >> biH ); \ r1 += ( ry >> biH ); \ rx <<= biH; ry <<= biH; \ r0 += rx; r1 += (r0 < rx); \ r0 += ry; r1 += (r0 < ry); \ r0 += c; r1 += (r0 < c); \ r0 += *d; r1 += (r0 < *d); \ c = r1; *(d++) = r0; #define MULADDC_STOP \ } #endif /* C (generic) */ #endif /* C (longlong) */ #endif /* bn_mul.h */ fldigi-4.1.06/src/include/mbedtls/memory_buffer_alloc.h0000664000175000017500000001227113507401434020017 00000000000000/** * \file memory_buffer_alloc.h * * \brief Buffer-based memory allocator */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MEMORY_BUFFER_ALLOC_H #define MBEDTLS_MEMORY_BUFFER_ALLOC_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_MEMORY_ALIGN_MULTIPLE) #define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ #endif /* \} name SECTION: Module settings */ #define MBEDTLS_MEMORY_VERIFY_NONE 0 #define MBEDTLS_MEMORY_VERIFY_ALLOC (1 << 0) #define MBEDTLS_MEMORY_VERIFY_FREE (1 << 1) #define MBEDTLS_MEMORY_VERIFY_ALWAYS (MBEDTLS_MEMORY_VERIFY_ALLOC | MBEDTLS_MEMORY_VERIFY_FREE) #ifdef __cplusplus extern "C" { #endif /** * \brief Initialize use of stack-based memory allocator. * The stack-based allocator does memory management inside the * presented buffer and does not call calloc() and free(). * It sets the global mbedtls_calloc() and mbedtls_free() pointers * to its own functions. * (Provided mbedtls_calloc() and mbedtls_free() are thread-safe if * MBEDTLS_THREADING_C is defined) * * \note This code is not optimized and provides a straight-forward * implementation of a stack-based memory allocator. * * \param buf buffer to use as heap * \param len size of the buffer */ void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ); /** * \brief Free the mutex for thread-safety and clear remaining memory */ void mbedtls_memory_buffer_alloc_free( void ); /** * \brief Determine when the allocator should automatically verify the state * of the entire chain of headers / meta-data. * (Default: MBEDTLS_MEMORY_VERIFY_NONE) * * \param verify One of MBEDTLS_MEMORY_VERIFY_NONE, MBEDTLS_MEMORY_VERIFY_ALLOC, * MBEDTLS_MEMORY_VERIFY_FREE or MBEDTLS_MEMORY_VERIFY_ALWAYS */ void mbedtls_memory_buffer_set_verify( int verify ); #if defined(MBEDTLS_MEMORY_DEBUG) /** * \brief Print out the status of the allocated memory (primarily for use * after a program should have de-allocated all memory) * Prints out a list of 'still allocated' blocks and their stack * trace if MBEDTLS_MEMORY_BACKTRACE is defined. */ void mbedtls_memory_buffer_alloc_status( void ); /** * \brief Get the peak heap usage so far * * \param max_used Peak number of bytes in use or committed. This * includes bytes in allocated blocks too small to split * into smaller blocks but larger than the requested size. * \param max_blocks Peak number of blocks in use, including free and used */ void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ); /** * \brief Reset peak statistics */ void mbedtls_memory_buffer_alloc_max_reset( void ); /** * \brief Get the current heap usage * * \param cur_used Current number of bytes in use or committed. This * includes bytes in allocated blocks too small to split * into smaller blocks but larger than the requested size. * \param cur_blocks Current number of blocks in use, including free and used */ void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ); #endif /* MBEDTLS_MEMORY_DEBUG */ /** * \brief Verifies that all headers in the memory buffer are correct * and contain sane values. Helps debug buffer-overflow errors. * * Prints out first failure if MBEDTLS_MEMORY_DEBUG is defined. * Prints out full header information if MBEDTLS_MEMORY_DEBUG * is defined. (Includes stack trace information for each block if * MBEDTLS_MEMORY_BACKTRACE is defined as well). * * \return 0 if verified, 1 otherwise */ int mbedtls_memory_buffer_alloc_verify( void ); #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if a test failed */ int mbedtls_memory_buffer_alloc_self_test( int verbose ); #endif #ifdef __cplusplus } #endif #endif /* memory_buffer_alloc.h */ fldigi-4.1.06/src/include/mbedtls/xtea.h0000664000175000017500000000731413507401434014747 00000000000000/** * \file xtea.h * * \brief XTEA block cipher (32-bit) */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_XTEA_H #define MBEDTLS_XTEA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_XTEA_ENCRYPT 1 #define MBEDTLS_XTEA_DECRYPT 0 #define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH -0x0028 /**< The data input has an invalid length. */ /* MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED -0x0029 /**< XTEA hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_XTEA_ALT) // Regular implementation // /** * \brief XTEA context structure */ typedef struct mbedtls_xtea_context { uint32_t k[4]; /*!< key */ } mbedtls_xtea_context; #else /* MBEDTLS_XTEA_ALT */ #include "xtea_alt.h" #endif /* MBEDTLS_XTEA_ALT */ /** * \brief Initialize XTEA context * * \param ctx XTEA context to be initialized */ void mbedtls_xtea_init( mbedtls_xtea_context *ctx ); /** * \brief Clear XTEA context * * \param ctx XTEA context to be cleared */ void mbedtls_xtea_free( mbedtls_xtea_context *ctx ); /** * \brief XTEA key schedule * * \param ctx XTEA context to be initialized * \param key the secret key */ void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] ); /** * \brief XTEA cipher function * * \param ctx XTEA context * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT * \param input 8-byte input block * \param output 8-byte output block * * \return 0 if successful */ int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, int mode, const unsigned char input[8], unsigned char output[8] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief XTEA CBC cipher function * * \param ctx XTEA context * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT * \param length the length of input, multiple of 8 * \param iv initialization vector for CBC mode * \param input input block * \param output output block * * \return 0 if successful, * MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0 */ int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output); #endif /* MBEDTLS_CIPHER_MODE_CBC */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_xtea_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* xtea.h */ fldigi-4.1.06/src/include/mbedtls/md.h0000664000175000017500000004343513507401434014412 00000000000000 /** * \file md.h * * \brief This file contains the generic message-digest wrapper. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MD_H #define MBEDTLS_MD_H #include #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ #define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ #define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ /* MBEDTLS_ERR_MD_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD_HW_ACCEL_FAILED -0x5280 /**< MD hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Supported message digests. * * \warning MD2, MD4, MD5 and SHA-1 are considered weak message digests and * their use constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef enum { MBEDTLS_MD_NONE=0, /**< None. */ MBEDTLS_MD_MD2, /**< The MD2 message digest. */ MBEDTLS_MD_MD4, /**< The MD4 message digest. */ MBEDTLS_MD_MD5, /**< The MD5 message digest. */ MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ } mbedtls_md_type_t; #if defined(MBEDTLS_SHA512_C) #define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ #else #define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ #endif /** * Opaque struct defined in md_internal.h. */ typedef struct mbedtls_md_info_t mbedtls_md_info_t; /** * The generic message-digest context. */ typedef struct mbedtls_md_context_t { /** Information about the associated message digest. */ const mbedtls_md_info_t *md_info; /** The digest-specific context. */ void *md_ctx; /** The HMAC part of the context. */ void *hmac_ctx; } mbedtls_md_context_t; /** * \brief This function returns the list of digests supported by the * generic digest module. * * \return A statically allocated array of digests. Each element * in the returned list is an integer belonging to the * message-digest enumeration #mbedtls_md_type_t. * The last entry is 0. */ const int *mbedtls_md_list( void ); /** * \brief This function returns the message-digest information * associated with the given digest name. * * \param md_name The name of the digest to search for. * * \return The message-digest information associated with \p md_name. * \return NULL if the associated message-digest information is not found. */ const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); /** * \brief This function returns the message-digest information * associated with the given digest type. * * \param md_type The type of digest to search for. * * \return The message-digest information associated with \p md_type. * \return NULL if the associated message-digest information is not found. */ const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); /** * \brief This function initializes a message-digest context without * binding it to a particular message-digest algorithm. * * This function should always be called first. It prepares the * context for mbedtls_md_setup() for binding it to a * message-digest algorithm. */ void mbedtls_md_init( mbedtls_md_context_t *ctx ); /** * \brief This function clears the internal structure of \p ctx and * frees any embedded internal structure, but does not free * \p ctx itself. * * If you have called mbedtls_md_setup() on \p ctx, you must * call mbedtls_md_free() when you are no longer using the * context. * Calling this function if you have previously * called mbedtls_md_init() and nothing else is optional. * You must not call this function if you have not called * mbedtls_md_init(). */ void mbedtls_md_free( mbedtls_md_context_t *ctx ); #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function selects the message digest algorithm to use, * and allocates internal structures. * * It should be called after mbedtls_md_init() or mbedtls_md_free(). * Makes it necessary to call mbedtls_md_free() later. * * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 * * \param ctx The context to set up. * \param md_info The information structure of the message-digest algorithm * to use. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. */ int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; #undef MBEDTLS_DEPRECATED #endif /* MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function selects the message digest algorithm to use, * and allocates internal structures. * * It should be called after mbedtls_md_init() or * mbedtls_md_free(). Makes it necessary to call * mbedtls_md_free() later. * * \param ctx The context to set up. * \param md_info The information structure of the message-digest algorithm * to use. * \param hmac Defines if HMAC is used. 0: HMAC is not used (saves some memory), * or non-zero: HMAC is used with this context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. */ int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); /** * \brief This function clones the state of an message-digest * context. * * \note You must call mbedtls_md_setup() on \c dst before calling * this function. * * \note The two contexts must have the same type, * for example, both are SHA-256. * * \warning This function clones the message-digest state, not the * HMAC state. * * \param dst The destination context. * \param src The context to be cloned. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification failure. */ int mbedtls_md_clone( mbedtls_md_context_t *dst, const mbedtls_md_context_t *src ); /** * \brief This function extracts the message-digest size from the * message-digest information structure. * * \param md_info The information structure of the message-digest algorithm * to use. * * \return The size of the message-digest output in Bytes. */ unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); /** * \brief This function extracts the message-digest type from the * message-digest information structure. * * \param md_info The information structure of the message-digest algorithm * to use. * * \return The type of the message digest. */ mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); /** * \brief This function extracts the message-digest name from the * message-digest information structure. * * \param md_info The information structure of the message-digest algorithm * to use. * * \return The name of the message digest. */ const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); /** * \brief This function starts a message-digest computation. * * You must call this function after setting up the context * with mbedtls_md_setup(), and before passing data with * mbedtls_md_update(). * * \param ctx The generic message-digest context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_starts( mbedtls_md_context_t *ctx ); /** * \brief This function feeds an input buffer into an ongoing * message-digest computation. * * You must call mbedtls_md_starts() before calling this * function. You may call this function multiple times. * Afterwards, call mbedtls_md_finish(). * * \param ctx The generic message-digest context. * \param input The buffer holding the input data. * \param ilen The length of the input data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the digest operation, * and writes the result to the output buffer. * * Call this function after a call to mbedtls_md_starts(), * followed by any number of calls to mbedtls_md_update(). * Afterwards, you may either clear the context with * mbedtls_md_free(), or call mbedtls_md_starts() to reuse * the context for another digest operation with the same * algorithm. * * \param ctx The generic message-digest context. * \param output The buffer for the generic message-digest checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); /** * \brief This function calculates the message-digest of a buffer, * with respect to a configurable message-digest algorithm * in a single call. * * The result is calculated as * Output = message_digest(input buffer). * * \param md_info The information structure of the message-digest algorithm * to use. * \param input The buffer holding the data. * \param ilen The length of the input data. * \param output The generic message-digest checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, unsigned char *output ); #if defined(MBEDTLS_FS_IO) /** * \brief This function calculates the message-digest checksum * result of the contents of the provided file. * * The result is calculated as * Output = message_digest(file contents). * * \param md_info The information structure of the message-digest algorithm * to use. * \param path The input file name. * \param output The generic message-digest checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_FILE_IO_ERROR on an I/O error accessing * the file pointed by \p path. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL. */ int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output ); #endif /* MBEDTLS_FS_IO */ /** * \brief This function sets the HMAC key and prepares to * authenticate a new message. * * Call this function after mbedtls_md_setup(), to use * the MD context for an HMAC calculation, then call * mbedtls_md_hmac_update() to provide the input data, and * mbedtls_md_hmac_finish() to get the HMAC value. * * \param ctx The message digest context containing an embedded HMAC * context. * \param key The HMAC secret key. * \param keylen The length of the HMAC key in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen ); /** * \brief This function feeds an input buffer into an ongoing HMAC * computation. * * Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() * before calling this function. * You may call this function multiple times to pass the * input piecewise. * Afterwards, call mbedtls_md_hmac_finish(). * * \param ctx The message digest context containing an embedded HMAC * context. * \param input The buffer holding the input data. * \param ilen The length of the input data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the HMAC operation, and writes * the result to the output buffer. * * Call this function after mbedtls_md_hmac_starts() and * mbedtls_md_hmac_update() to get the HMAC value. Afterwards * you may either call mbedtls_md_free() to clear the context, * or call mbedtls_md_hmac_reset() to reuse the context with * the same HMAC key. * * \param ctx The message digest context containing an embedded HMAC * context. * \param output The generic HMAC checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); /** * \brief This function prepares to authenticate a new message with * the same key as the previous HMAC operation. * * You may call this function after mbedtls_md_hmac_finish(). * Afterwards call mbedtls_md_hmac_update() to pass the new * input. * * \param ctx The message digest context containing an embedded HMAC * context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); /** * \brief This function calculates the full generic HMAC * on the input buffer with the provided key. * * The function allocates the context, performs the * calculation, and frees the context. * * The HMAC result is calculated as * output = generic HMAC(hmac key, input buffer). * * \param md_info The information structure of the message-digest algorithm * to use. * \param key The HMAC secret key. * \param keylen The length of the HMAC secret key in Bytes. * \param input The buffer holding the input data. * \param ilen The length of the input data. * \param output The generic HMAC result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ); /* Internal use */ int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_MD_H */ fldigi-4.1.06/src/include/mbedtls/md_internal.h0000664000175000017500000000626013507401434016301 00000000000000/** * \file md_internal.h * * \brief Message digest wrappers. * * \warning This in an internal header. Do not include directly. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MD_WRAP_H #define MBEDTLS_MD_WRAP_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "md.h" #ifdef __cplusplus extern "C" { #endif /** * Message digest information. * Allows message digest functions to be called in a generic way. */ struct mbedtls_md_info_t { /** Digest identifier */ mbedtls_md_type_t type; /** Name of the message digest */ const char * name; /** Output length of the digest function in bytes */ int size; /** Block length of the digest function in bytes */ int block_size; /** Digest initialisation function */ int (*starts_func)( void *ctx ); /** Digest update function */ int (*update_func)( void *ctx, const unsigned char *input, size_t ilen ); /** Digest finalisation function */ int (*finish_func)( void *ctx, unsigned char *output ); /** Generic digest function */ int (*digest_func)( const unsigned char *input, size_t ilen, unsigned char *output ); /** Allocate a new context */ void * (*ctx_alloc_func)( void ); /** Free the given context */ void (*ctx_free_func)( void *ctx ); /** Clone state from a context */ void (*clone_func)( void *dst, const void *src ); /** Internal use only */ int (*process_func)( void *ctx, const unsigned char *input ); }; #if defined(MBEDTLS_MD2_C) extern const mbedtls_md_info_t mbedtls_md2_info; #endif #if defined(MBEDTLS_MD4_C) extern const mbedtls_md_info_t mbedtls_md4_info; #endif #if defined(MBEDTLS_MD5_C) extern const mbedtls_md_info_t mbedtls_md5_info; #endif #if defined(MBEDTLS_RIPEMD160_C) extern const mbedtls_md_info_t mbedtls_ripemd160_info; #endif #if defined(MBEDTLS_SHA1_C) extern const mbedtls_md_info_t mbedtls_sha1_info; #endif #if defined(MBEDTLS_SHA256_C) extern const mbedtls_md_info_t mbedtls_sha224_info; extern const mbedtls_md_info_t mbedtls_sha256_info; #endif #if defined(MBEDTLS_SHA512_C) extern const mbedtls_md_info_t mbedtls_sha384_info; extern const mbedtls_md_info_t mbedtls_sha512_info; #endif #ifdef __cplusplus } #endif #endif /* MBEDTLS_MD_WRAP_H */ fldigi-4.1.06/src/include/mbedtls/pk.h0000664000175000017500000007051213507401434014420 00000000000000/** * \file pk.h * * \brief Public Key abstraction layer */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PK_H #define MBEDTLS_PK_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "md.h" #if defined(MBEDTLS_RSA_C) #include "rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "ecdsa.h" #endif #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80 /**< Memory allocation failed. */ #define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00 /**< Type mismatch, eg attempt to encrypt with an ECDSA key */ #define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00 /**< Read/write of file failed. */ #define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80 /**< Unsupported key version */ #define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00 /**< Invalid key tag or value. */ #define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80 /**< Key algorithm is unsupported (only RSA and EC are supported). */ #define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00 /**< Private key password can't be empty. */ #define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00 /**< The pubkey tag or value is invalid (only RSA and EC are supported). */ #define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80 /**< The algorithm tag or value is invalid. */ #define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00 /**< Elliptic curve is unsupported (only NIST curves are supported). */ #define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980 /**< Unavailable feature, e.g. RSA disabled for RSA key. */ #define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900 /**< The buffer contains a valid signature followed by more data. */ /* MBEDTLS_ERR_PK_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_PK_HW_ACCEL_FAILED -0x3880 /**< PK hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Public key types */ typedef enum { MBEDTLS_PK_NONE=0, MBEDTLS_PK_RSA, MBEDTLS_PK_ECKEY, MBEDTLS_PK_ECKEY_DH, MBEDTLS_PK_ECDSA, MBEDTLS_PK_RSA_ALT, MBEDTLS_PK_RSASSA_PSS, } mbedtls_pk_type_t; /** * \brief Options for RSASSA-PSS signature verification. * See \c mbedtls_rsa_rsassa_pss_verify_ext() */ typedef struct mbedtls_pk_rsassa_pss_options { mbedtls_md_type_t mgf1_hash_id; int expected_salt_len; } mbedtls_pk_rsassa_pss_options; /** * \brief Types for interfacing with the debug module */ typedef enum { MBEDTLS_PK_DEBUG_NONE = 0, MBEDTLS_PK_DEBUG_MPI, MBEDTLS_PK_DEBUG_ECP, } mbedtls_pk_debug_type; /** * \brief Item to send to the debug module */ typedef struct mbedtls_pk_debug_item { mbedtls_pk_debug_type type; const char *name; void *value; } mbedtls_pk_debug_item; /** Maximum number of item send for debugging, plus 1 */ #define MBEDTLS_PK_DEBUG_MAX_ITEMS 3 /** * \brief Public key information and operations */ typedef struct mbedtls_pk_info_t mbedtls_pk_info_t; /** * \brief Public key container */ typedef struct mbedtls_pk_context { const mbedtls_pk_info_t * pk_info; /**< Public key information */ void * pk_ctx; /**< Underlying public key context */ } mbedtls_pk_context; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Context for resuming operations */ typedef struct { const mbedtls_pk_info_t * pk_info; /**< Public key information */ void * rs_ctx; /**< Underlying restart context */ } mbedtls_pk_restart_ctx; #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* Now we can declare functions that take a pointer to that */ typedef void mbedtls_pk_restart_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_RSA_C) /** * Quick access to an RSA context inside a PK context. * * \warning You must make sure the PK context actually holds an RSA context * before using this function! */ static inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk ) { return( (mbedtls_rsa_context *) (pk).pk_ctx ); } #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /** * Quick access to an EC context inside a PK context. * * \warning You must make sure the PK context actually holds an EC context * before using this function! */ static inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk ) { return( (mbedtls_ecp_keypair *) (pk).pk_ctx ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /** * \brief Types for RSA-alt abstraction */ typedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); typedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx ); #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ /** * \brief Return information associated with the given PK type * * \param pk_type PK type to search for. * * \return The PK info associated with the type or NULL if not found. */ const mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ); /** * \brief Initialize a #mbedtls_pk_context (as NONE). * * \param ctx The context to initialize. * This must not be \c NULL. */ void mbedtls_pk_init( mbedtls_pk_context *ctx ); /** * \brief Free the components of a #mbedtls_pk_context. * * \param ctx The context to clear. It must have been initialized. * If this is \c NULL, this function does nothing. */ void mbedtls_pk_free( mbedtls_pk_context *ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context * * \param ctx The context to initialize. * This must not be \c NULL. */ void mbedtls_pk_restart_init( mbedtls_pk_restart_ctx *ctx ); /** * \brief Free the components of a restart context * * \param ctx The context to clear. It must have been initialized. * If this is \c NULL, this function does nothing. */ void mbedtls_pk_restart_free( mbedtls_pk_restart_ctx *ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /** * \brief Initialize a PK context with the information given * and allocates the type-specific PK subcontext. * * \param ctx Context to initialize. It must not have been set * up yet (type #MBEDTLS_PK_NONE). * \param info Information to use * * \return 0 on success, * MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input, * MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure. * * \note For contexts holding an RSA-alt key, use * \c mbedtls_pk_setup_rsa_alt() instead. */ int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ); #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /** * \brief Initialize an RSA-alt context * * \param ctx Context to initialize. It must not have been set * up yet (type #MBEDTLS_PK_NONE). * \param key RSA key pointer * \param decrypt_func Decryption function * \param sign_func Signing function * \param key_len_func Function returning key length in bytes * * \return 0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the * context wasn't already initialized as RSA_ALT. * * \note This function replaces \c mbedtls_pk_setup() for RSA-alt. */ int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, mbedtls_pk_rsa_alt_decrypt_func decrypt_func, mbedtls_pk_rsa_alt_sign_func sign_func, mbedtls_pk_rsa_alt_key_len_func key_len_func ); #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ /** * \brief Get the size in bits of the underlying key * * \param ctx The context to query. It must have been initialized. * * \return Key size in bits, or 0 on error */ size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ); /** * \brief Get the length in bytes of the underlying key * * \param ctx The context to query. It must have been initialized. * * \return Key length in bytes, or 0 on error */ static inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx ) { return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 ); } /** * \brief Tell if a context can do the operation given by type * * \param ctx The context to query. It must have been initialized. * \param type The desired type. * * \return 1 if the context can do operations on the given type. * \return 0 if the context cannot do the operations on the given * type. This is always the case for a context that has * been initialized but not set up, or that has been * cleared with mbedtls_pk_free(). */ int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ); /** * \brief Verify signature (including padding if relevant). * * \param ctx The PK context to use. It must have been set up. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Signature to verify * \param sig_len Signature length * * \return 0 on success (signature is valid), * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid * signature in sig but its length is less than \p siglen, * or a specific error code. * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * Use \c mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... ) * to verify RSASSA_PSS signatures. * * \note If hash_len is 0, then the length associated with md_alg * is used instead, or an error returned if it is invalid. * * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 */ int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); /** * \brief Restartable version of \c mbedtls_pk_verify() * * \note Performs the same job as \c mbedtls_pk_verify(), but can * return early and restart according to the limit set with * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC * operations. For RSA, same as \c mbedtls_pk_verify(). * * \param ctx The PK context to use. It must have been set up. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Signature to verify * \param sig_len Signature length * \param rs_ctx Restart context (NULL to disable restart) * * \return See \c mbedtls_pk_verify(), or * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). */ int mbedtls_pk_verify_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, mbedtls_pk_restart_ctx *rs_ctx ); /** * \brief Verify signature, with options. * (Includes verification of the padding depending on type.) * * \param type Signature type (inc. possible padding type) to verify * \param options Pointer to type-specific options, or NULL * \param ctx The PK context to use. It must have been set up. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Signature to verify * \param sig_len Signature length * * \return 0 on success (signature is valid), * #MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can't be * used for this type of signatures, * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid * signature in sig but its length is less than \p siglen, * or a specific error code. * * \note If hash_len is 0, then the length associated with md_alg * is used instead, or an error returned if it is invalid. * * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 * * \note If type is MBEDTLS_PK_RSASSA_PSS, then options must point * to a mbedtls_pk_rsassa_pss_options structure, * otherwise it must be NULL. */ int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); /** * \brief Make signature, including padding if relevant. * * \param ctx The PK context to use. It must have been set up * with a private key. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Place to write the signature * \param sig_len Number of bytes written * \param f_rng RNG function * \param p_rng RNG parameter * * \return 0 on success, or a specific error code. * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * There is no interface in the PK module to make RSASSA-PSS * signatures yet. * * \note If hash_len is 0, then the length associated with md_alg * is used instead, or an error returned if it is invalid. * * \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. * For ECDSA, md_alg may never be MBEDTLS_MD_NONE. */ int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Restartable version of \c mbedtls_pk_sign() * * \note Performs the same job as \c mbedtls_pk_sign(), but can * return early and restart according to the limit set with * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC * operations. For RSA, same as \c mbedtls_pk_sign(). * * \param ctx The PK context to use. It must have been set up * with a private key. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Place to write the signature * \param sig_len Number of bytes written * \param f_rng RNG function * \param p_rng RNG parameter * \param rs_ctx Restart context (NULL to disable restart) * * \return See \c mbedtls_pk_sign(), or * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). */ int mbedtls_pk_sign_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_pk_restart_ctx *rs_ctx ); /** * \brief Decrypt message (including padding if relevant). * * \param ctx The PK context to use. It must have been set up * with a private key. * \param input Input to decrypt * \param ilen Input size * \param output Decrypted output * \param olen Decrypted message length * \param osize Size of the output buffer * \param f_rng RNG function * \param p_rng RNG parameter * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * * \return 0 on success, or a specific error code. */ int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Encrypt message (including padding if relevant). * * \param ctx The PK context to use. It must have been set up. * \param input Message to encrypt * \param ilen Message size * \param output Encrypted output * \param olen Encrypted output length * \param osize Size of the output buffer * \param f_rng RNG function * \param p_rng RNG parameter * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * * \return 0 on success, or a specific error code. */ int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Check if a public-private pair of keys matches. * * \param pub Context holding a public key. * \param prv Context holding a private (and public) key. * * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA */ int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ); /** * \brief Export debug information * * \param ctx The PK context to use. It must have been initialized. * \param items Place to write debug items * * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA */ int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ); /** * \brief Access the type name * * \param ctx The PK context to use. It must have been initialized. * * \return Type name on success, or "invalid PK" */ const char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx ); /** * \brief Get the key type * * \param ctx The PK context to use. It must have been initialized. * * \return Type on success. * \return #MBEDTLS_PK_NONE for a context that has not been set up. */ mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ); #if defined(MBEDTLS_PK_PARSE_C) /** \ingroup pk_module */ /** * \brief Parse a private key in PEM or DER format * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param key Input buffer to parse. * The buffer must contain the input exactly, with no * extra trailing material. For PEM, the buffer must * contain a null-terminated string. * \param keylen Size of \b key in bytes. * For PEM data, this includes the terminating null byte, * so \p keylen must be equal to `strlen(key) + 1`. * \param pwd Optional password for decryption. * Pass \c NULL if expecting a non-encrypted key. * Pass a string of \p pwdlen bytes if expecting an encrypted * key; a non-encrypted key will also be accepted. * The empty password is not supported. * \param pwdlen Size of the password in bytes. * Ignored if \p pwd is \c NULL. * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a * specific key type, check the result with mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_key( mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen ); /** \ingroup pk_module */ /** * \brief Parse a public key in PEM or DER format * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param key Input buffer to parse. * The buffer must contain the input exactly, with no * extra trailing material. For PEM, the buffer must * contain a null-terminated string. * \param keylen Size of \b key in bytes. * For PEM data, this includes the terminating null byte, * so \p keylen must be equal to `strlen(key) + 1`. * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a * specific key type, check the result with mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen ); #if defined(MBEDTLS_FS_IO) /** \ingroup pk_module */ /** * \brief Load and parse a private key * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param path filename to read the private key from * \param password Optional password to decrypt the file. * Pass \c NULL if expecting a non-encrypted key. * Pass a null-terminated string if expecting an encrypted * key; a non-encrypted key will also be accepted. * The empty password is not supported. * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a * specific key type, check the result with mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx, const char *path, const char *password ); /** \ingroup pk_module */ /** * \brief Load and parse a public key * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param path filename to read the public key from * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If * you need a specific key type, check the result with * mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ #endif /* MBEDTLS_PK_PARSE_C */ #if defined(MBEDTLS_PK_WRITE_C) /** * \brief Write a private key to a PKCS#1 or SEC1 DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx PK context which must contain a valid private key. * \param buf buffer to write to * \param size size of the buffer * * \return length of data written if successful, or a specific * error code */ int mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); /** * \brief Write a public key to a SubjectPublicKeyInfo DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx PK context which must contain a valid public or private key. * \param buf buffer to write to * \param size size of the buffer * * \return length of data written if successful, or a specific * error code */ int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a public key to a PEM string * * \param ctx PK context which must contain a valid public or private key. * \param buf Buffer to write to. The output includes a * terminating null byte. * \param size Size of the buffer in bytes. * * \return 0 if successful, or a specific error code */ int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); /** * \brief Write a private key to a PKCS#1 or SEC1 PEM string * * \param ctx PK context which must contain a valid private key. * \param buf Buffer to write to. The output includes a * terminating null byte. * \param size Size of the buffer in bytes. * * \return 0 if successful, or a specific error code */ int mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PK_WRITE_C */ /* * WARNING: Low-level functions. You probably do not want to use these unless * you are certain you do ;) */ #if defined(MBEDTLS_PK_PARSE_C) /** * \brief Parse a SubjectPublicKeyInfo DER structure * * \param p the position in the ASN.1 data * \param end end of the buffer * \param pk The PK context to fill. It must have been initialized * but not set up. * * \return 0 if successful, or a specific PK error code */ int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end, mbedtls_pk_context *pk ); #endif /* MBEDTLS_PK_PARSE_C */ #if defined(MBEDTLS_PK_WRITE_C) /** * \brief Write a subjectPublicKey to ASN.1 data * Note: function works backwards in data buffer * * \param p reference to current position pointer * \param start start of the buffer (for bounds-checking) * \param key PK context which must contain a valid public or private key. * * \return the length written or a negative error code */ int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start, const mbedtls_pk_context *key ); #endif /* MBEDTLS_PK_WRITE_C */ /* * Internal module functions. You probably do not want to use these unless you * know you do. */ #if defined(MBEDTLS_FS_IO) int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n ); #endif #ifdef __cplusplus } #endif #endif /* MBEDTLS_PK_H */ fldigi-4.1.06/src/include/mbedtls/chacha20.h0000664000175000017500000002142513507401434015356 00000000000000/** * \file chacha20.h * * \brief This file contains ChaCha20 definitions and functions. * * ChaCha20 is a stream cipher that can encrypt and decrypt * information. ChaCha was created by Daniel Bernstein as a variant of * its Salsa cipher https://cr.yp.to/chacha/chacha-20080128.pdf * ChaCha20 is the variant with 20 rounds, that was also standardized * in RFC 7539. * * \author Daniel King */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CHACHA20_H #define MBEDTLS_CHACHA20_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA -0x0051 /**< Invalid input parameter(s). */ /* MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE is deprecated and should not be * used. */ #define MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE -0x0053 /**< Feature not available. For example, s part of the API is not implemented. */ /* MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED -0x0055 /**< Chacha20 hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_CHACHA20_ALT) typedef struct mbedtls_chacha20_context { uint32_t state[16]; /*! The state (before round operations). */ uint8_t keystream8[64]; /*! Leftover keystream bytes. */ size_t keystream_bytes_used; /*! Number of keystream bytes already used. */ } mbedtls_chacha20_context; #else /* MBEDTLS_CHACHA20_ALT */ #include "chacha20_alt.h" #endif /* MBEDTLS_CHACHA20_ALT */ /** * \brief This function initializes the specified ChaCha20 context. * * It must be the first API called before using * the context. * * It is usually followed by calls to * \c mbedtls_chacha20_setkey() and * \c mbedtls_chacha20_starts(), then one or more calls to * to \c mbedtls_chacha20_update(), and finally to * \c mbedtls_chacha20_free(). * * \param ctx The ChaCha20 context to initialize. * This must not be \c NULL. */ void mbedtls_chacha20_init( mbedtls_chacha20_context *ctx ); /** * \brief This function releases and clears the specified * ChaCha20 context. * * \param ctx The ChaCha20 context to clear. This may be \c NULL, * in which case this function is a no-op. If it is not * \c NULL, it must point to an initialized context. * */ void mbedtls_chacha20_free( mbedtls_chacha20_context *ctx ); /** * \brief This function sets the encryption/decryption key. * * \note After using this function, you must also call * \c mbedtls_chacha20_starts() to set a nonce before you * start encrypting/decrypting data with * \c mbedtls_chacha_update(). * * \param ctx The ChaCha20 context to which the key should be bound. * It must be initialized. * \param key The encryption/decryption key. This must be \c 32 Bytes * in length. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA if ctx or key is NULL. */ int mbedtls_chacha20_setkey( mbedtls_chacha20_context *ctx, const unsigned char key[32] ); /** * \brief This function sets the nonce and initial counter value. * * \note A ChaCha20 context can be re-used with the same key by * calling this function to change the nonce. * * \warning You must never use the same nonce twice with the same key. * This would void any confidentiality guarantees for the * messages encrypted with the same nonce and key. * * \param ctx The ChaCha20 context to which the nonce should be bound. * It must be initialized and bound to a key. * \param nonce The nonce. This must be \c 12 Bytes in size. * \param counter The initial counter value. This is usually \c 0. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA if ctx or nonce is * NULL. */ int mbedtls_chacha20_starts( mbedtls_chacha20_context* ctx, const unsigned char nonce[12], uint32_t counter ); /** * \brief This function encrypts or decrypts data. * * Since ChaCha20 is a stream cipher, the same operation is * used for encrypting and decrypting data. * * \note The \p input and \p output pointers must either be equal or * point to non-overlapping buffers. * * \note \c mbedtls_chacha20_setkey() and * \c mbedtls_chacha20_starts() must be called at least once * to setup the context before this function can be called. * * \note This function can be called multiple times in a row in * order to encrypt of decrypt data piecewise with the same * key and nonce. * * \param ctx The ChaCha20 context to use for encryption or decryption. * It must be initialized and bound to a key and nonce. * \param size The length of the input data in Bytes. * \param input The buffer holding the input data. * This pointer can be \c NULL if `size == 0`. * \param output The buffer holding the output data. * This must be able to hold \p size Bytes. * This pointer can be \c NULL if `size == 0`. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chacha20_update( mbedtls_chacha20_context *ctx, size_t size, const unsigned char *input, unsigned char *output ); /** * \brief This function encrypts or decrypts data with ChaCha20 and * the given key and nonce. * * Since ChaCha20 is a stream cipher, the same operation is * used for encrypting and decrypting data. * * \warning You must never use the same (key, nonce) pair more than * once. This would void any confidentiality guarantees for * the messages encrypted with the same nonce and key. * * \note The \p input and \p output pointers must either be equal or * point to non-overlapping buffers. * * \param key The encryption/decryption key. * This must be \c 32 Bytes in length. * \param nonce The nonce. This must be \c 12 Bytes in size. * \param counter The initial counter value. This is usually \c 0. * \param size The length of the input data in Bytes. * \param input The buffer holding the input data. * This pointer can be \c NULL if `size == 0`. * \param output The buffer holding the output data. * This must be able to hold \p size Bytes. * This pointer can be \c NULL if `size == 0`. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chacha20_crypt( const unsigned char key[32], const unsigned char nonce[12], uint32_t counter, size_t size, const unsigned char* input, unsigned char* output ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The ChaCha20 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_chacha20_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CHACHA20_H */ fldigi-4.1.06/src/include/mbedtls/md5.h0000664000175000017500000002264313507401434014475 00000000000000/** * \file md5.h * * \brief MD5 message digest algorithm (hash function) * * \warning MD5 is considered a weak message digest and its use constitutes a * security risk. We recommend considering stronger message * digests instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MD5_H #define MBEDTLS_MD5_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_MD5_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD5_HW_ACCEL_FAILED -0x002F /**< MD5 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_MD5_ALT) // Regular implementation // /** * \brief MD5 context structure * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_md5_context { uint32_t total[2]; /*!< number of bytes processed */ uint32_t state[4]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ } mbedtls_md5_context; #else /* MBEDTLS_MD5_ALT */ #include "md5_alt.h" #endif /* MBEDTLS_MD5_ALT */ /** * \brief Initialize MD5 context * * \param ctx MD5 context to be initialized * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md5_init( mbedtls_md5_context *ctx ); /** * \brief Clear MD5 context * * \param ctx MD5 context to be cleared * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md5_free( mbedtls_md5_context *ctx ); /** * \brief Clone (the state of) an MD5 context * * \param dst The destination context * \param src The context to be cloned * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md5_clone( mbedtls_md5_context *dst, const mbedtls_md5_context *src ); /** * \brief MD5 context setup * * \param ctx context to be initialized * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_starts_ret( mbedtls_md5_context *ctx ); /** * \brief MD5 process buffer * * \param ctx MD5 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_update_ret( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD5 final digest * * \param ctx MD5 context * \param output MD5 checksum result * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_finish_ret( mbedtls_md5_context *ctx, unsigned char output[16] ); /** * \brief MD5 process data block (internal use only) * * \param ctx MD5 context * \param data buffer holding one block of data * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief MD5 context setup * * \deprecated Superseded by mbedtls_md5_starts_ret() in 2.7.0 * * \param ctx context to be initialized * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_starts( mbedtls_md5_context *ctx ); /** * \brief MD5 process buffer * * \deprecated Superseded by mbedtls_md5_update_ret() in 2.7.0 * * \param ctx MD5 context * \param input buffer holding the data * \param ilen length of the input data * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD5 final digest * * \deprecated Superseded by mbedtls_md5_finish_ret() in 2.7.0 * * \param ctx MD5 context * \param output MD5 checksum result * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] ); /** * \brief MD5 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_md5_process() in 2.7.0 * * \param ctx MD5 context * \param data buffer holding one block of data * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = MD5( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output MD5 checksum result * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = MD5( input buffer ) * * \deprecated Superseded by mbedtls_md5_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output MD5 checksum result * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_md5.h */ fldigi-4.1.06/src/include/mbedtls/ssl_ticket.h0000664000175000017500000001061613507401434016151 00000000000000/** * \file ssl_ticket.h * * \brief TLS server ticket callbacks implementation */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_TICKET_H #define MBEDTLS_SSL_TICKET_H /* * This implementation of the session ticket callbacks includes key * management, rotating the keys periodically in order to preserve forward * secrecy, when MBEDTLS_HAVE_TIME is defined. */ #include "ssl.h" #include "cipher.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif #ifdef __cplusplus extern "C" { #endif /** * \brief Information for session ticket protection */ typedef struct mbedtls_ssl_ticket_key { unsigned char name[4]; /*!< random key identifier */ uint32_t generation_time; /*!< key generation timestamp (seconds) */ mbedtls_cipher_context_t ctx; /*!< context for auth enc/decryption */ } mbedtls_ssl_ticket_key; /** * \brief Context for session ticket handling functions */ typedef struct mbedtls_ssl_ticket_context { mbedtls_ssl_ticket_key keys[2]; /*!< ticket protection keys */ unsigned char active; /*!< index of the currently active key */ uint32_t ticket_lifetime; /*!< lifetime of tickets in seconds */ /** Callback for getting (pseudo-)random numbers */ int (*f_rng)(void *, unsigned char *, size_t); void *p_rng; /*!< context for the RNG function */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_ssl_ticket_context; /** * \brief Initialize a ticket context. * (Just make it ready for mbedtls_ssl_ticket_setup() * or mbedtls_ssl_ticket_free().) * * \param ctx Context to be initialized */ void mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx ); /** * \brief Prepare context to be actually used * * \param ctx Context to be set up * \param f_rng RNG callback function * \param p_rng RNG callback context * \param cipher AEAD cipher to use for ticket protection. * Recommended value: MBEDTLS_CIPHER_AES_256_GCM. * \param lifetime Tickets lifetime in seconds * Recommended value: 86400 (one day). * * \note It is highly recommended to select a cipher that is at * least as strong as the the strongest ciphersuite * supported. Usually that means a 256-bit key. * * \note The lifetime of the keys is twice the lifetime of tickets. * It is recommended to pick a reasonnable lifetime so as not * to negate the benefits of forward secrecy. * * \return 0 if successful, * or a specific MBEDTLS_ERR_XXX error code */ int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_cipher_type_t cipher, uint32_t lifetime ); /** * \brief Implementation of the ticket write callback * * \note See \c mbedlts_ssl_ticket_write_t for description */ mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write; /** * \brief Implementation of the ticket parse callback * * \note See \c mbedlts_ssl_ticket_parse_t for description */ mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse; /** * \brief Free a context's content and zeroize it. * * \param ctx Context to be cleaned up */ void mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx ); #ifdef __cplusplus } #endif #endif /* ssl_ticket.h */ fldigi-4.1.06/src/include/mbedtls/ssl_internal.h0000664000175000017500000007437113507401434016512 00000000000000/** * \file ssl_internal.h * * \brief Internal functions shared by the SSL modules */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_INTERNAL_H #define MBEDTLS_SSL_INTERNAL_H #include "ssl.h" #include "cipher.h" #if defined(MBEDTLS_MD5_C) #include "md5.h" #endif #if defined(MBEDTLS_SHA1_C) #include "sha1.h" #endif #if defined(MBEDTLS_SHA256_C) #include "sha256.h" #endif #if defined(MBEDTLS_SHA512_C) #include "sha512.h" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) #include "ecjpake.h" #endif #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Determine minimum supported version */ #define MBEDTLS_SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 #if defined(MBEDTLS_SSL_PROTO_SSL3) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 #else #if defined(MBEDTLS_SSL_PROTO_TLS1) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 #else #if defined(MBEDTLS_SSL_PROTO_TLS1_1) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 #else #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ #endif /* MBEDTLS_SSL_PROTO_TLS1 */ #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #define MBEDTLS_SSL_MIN_VALID_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 #define MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 /* Determine maximum supported version */ #define MBEDTLS_SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 #else #if defined(MBEDTLS_SSL_PROTO_TLS1_1) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 #else #if defined(MBEDTLS_SSL_PROTO_TLS1) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 #else #if defined(MBEDTLS_SSL_PROTO_SSL3) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #endif /* MBEDTLS_SSL_PROTO_TLS1 */ #endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ /* Shorthand for restartable ECC */ #if defined(MBEDTLS_ECP_RESTARTABLE) && \ defined(MBEDTLS_SSL_CLI_C) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #define MBEDTLS_SSL__ECP_RESTARTABLE #endif #define MBEDTLS_SSL_INITIAL_HANDSHAKE 0 #define MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS 1 /* In progress */ #define MBEDTLS_SSL_RENEGOTIATION_DONE 2 /* Done or aborted */ #define MBEDTLS_SSL_RENEGOTIATION_PENDING 3 /* Requested (server only) */ /* * DTLS retransmission states, see RFC 6347 4.2.4 * * The SENDING state is merged in PREPARING for initial sends, * but is distinct for resends. * * Note: initial state is wrong for server, but is not used anyway. */ #define MBEDTLS_SSL_RETRANS_PREPARING 0 #define MBEDTLS_SSL_RETRANS_SENDING 1 #define MBEDTLS_SSL_RETRANS_WAITING 2 #define MBEDTLS_SSL_RETRANS_FINISHED 3 /* * Allow extra bytes for record, authentication and encryption overhead: * counter (8) + header (5) + IV(16) + MAC (16-48) + padding (0-256) * and allow for a maximum of 1024 of compression expansion if * enabled. */ #if defined(MBEDTLS_ZLIB_SUPPORT) #define MBEDTLS_SSL_COMPRESSION_ADD 1024 #else #define MBEDTLS_SSL_COMPRESSION_ADD 0 #endif #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_MODE_CBC) /* Ciphersuites using HMAC */ #if defined(MBEDTLS_SHA512_C) #define MBEDTLS_SSL_MAC_ADD 48 /* SHA-384 used for HMAC */ #elif defined(MBEDTLS_SHA256_C) #define MBEDTLS_SSL_MAC_ADD 32 /* SHA-256 used for HMAC */ #else #define MBEDTLS_SSL_MAC_ADD 20 /* SHA-1 used for HMAC */ #endif #else /* AEAD ciphersuites: GCM and CCM use a 128 bits tag */ #define MBEDTLS_SSL_MAC_ADD 16 #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) #define MBEDTLS_SSL_PADDING_ADD 256 #else #define MBEDTLS_SSL_PADDING_ADD 0 #endif #define MBEDTLS_SSL_PAYLOAD_OVERHEAD ( MBEDTLS_SSL_COMPRESSION_ADD + \ MBEDTLS_MAX_IV_LENGTH + \ MBEDTLS_SSL_MAC_ADD + \ MBEDTLS_SSL_PADDING_ADD \ ) #define MBEDTLS_SSL_IN_PAYLOAD_LEN ( MBEDTLS_SSL_PAYLOAD_OVERHEAD + \ ( MBEDTLS_SSL_IN_CONTENT_LEN ) ) #define MBEDTLS_SSL_OUT_PAYLOAD_LEN ( MBEDTLS_SSL_PAYLOAD_OVERHEAD + \ ( MBEDTLS_SSL_OUT_CONTENT_LEN ) ) /* The maximum number of buffered handshake messages. */ #define MBEDTLS_SSL_MAX_BUFFERED_HS 4 /* Maximum length we can advertise as our max content length for RFC 6066 max_fragment_length extension negotiation purposes (the lesser of both sizes, if they are unequal.) */ #define MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ( \ (MBEDTLS_SSL_IN_CONTENT_LEN > MBEDTLS_SSL_OUT_CONTENT_LEN) \ ? ( MBEDTLS_SSL_OUT_CONTENT_LEN ) \ : ( MBEDTLS_SSL_IN_CONTENT_LEN ) \ ) /* * Check that we obey the standard's message size bounds */ #if MBEDTLS_SSL_MAX_CONTENT_LEN > 16384 #error "Bad configuration - record content too large." #endif #if MBEDTLS_SSL_IN_CONTENT_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN #error "Bad configuration - incoming record content should not be larger than MBEDTLS_SSL_MAX_CONTENT_LEN." #endif #if MBEDTLS_SSL_OUT_CONTENT_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN #error "Bad configuration - outgoing record content should not be larger than MBEDTLS_SSL_MAX_CONTENT_LEN." #endif #if MBEDTLS_SSL_IN_PAYLOAD_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN + 2048 #error "Bad configuration - incoming protected record payload too large." #endif #if MBEDTLS_SSL_OUT_PAYLOAD_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN + 2048 #error "Bad configuration - outgoing protected record payload too large." #endif /* Calculate buffer sizes */ /* Note: Even though the TLS record header is only 5 bytes long, we're internally using 8 bytes to store the implicit sequence number. */ #define MBEDTLS_SSL_HEADER_LEN 13 #define MBEDTLS_SSL_IN_BUFFER_LEN \ ( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_IN_PAYLOAD_LEN ) ) #define MBEDTLS_SSL_OUT_BUFFER_LEN \ ( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_OUT_PAYLOAD_LEN ) ) #ifdef MBEDTLS_ZLIB_SUPPORT /* Compression buffer holds both IN and OUT buffers, so should be size of the larger */ #define MBEDTLS_SSL_COMPRESS_BUFFER_LEN ( \ ( MBEDTLS_SSL_IN_BUFFER_LEN > MBEDTLS_SSL_OUT_BUFFER_LEN ) \ ? MBEDTLS_SSL_IN_BUFFER_LEN \ : MBEDTLS_SSL_OUT_BUFFER_LEN \ ) #endif /* * TLS extension flags (for extensions with outgoing ServerHello content * that need it (e.g. for RENEGOTIATION_INFO the server already knows because * of state of the renegotiation flag, so no indicator is required) */ #define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0) #define MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK (1 << 1) #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Abstraction for a grid of allowed signature-hash-algorithm pairs. */ struct mbedtls_ssl_sig_hash_set_t { /* At the moment, we only need to remember a single suitable * hash algorithm per signature algorithm. As long as that's * the case - and we don't need a general lookup function - * we can implement the sig-hash-set as a map from signatures * to hash algorithms. */ mbedtls_md_type_t rsa; mbedtls_md_type_t ecdsa; }; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /* * This structure contains the parameters only needed during handshake. */ struct mbedtls_ssl_handshake_params { /* * Handshake specific crypto variables */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) mbedtls_ssl_sig_hash_set_t hash_algs; /*!< Set of suitable sig-hash pairs */ #endif #if defined(MBEDTLS_DHM_C) mbedtls_dhm_context dhm_ctx; /*!< DHM key exchange */ #endif #if defined(MBEDTLS_ECDH_C) mbedtls_ecdh_context ecdh_ctx; /*!< ECDH key exchange */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) mbedtls_ecjpake_context ecjpake_ctx; /*!< EC J-PAKE key exchange */ #if defined(MBEDTLS_SSL_CLI_C) unsigned char *ecjpake_cache; /*!< Cache for ClientHello ext */ size_t ecjpake_cache_len; /*!< Length of cached data */ #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */ #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) unsigned char *psk; /*!< PSK from the callback */ size_t psk_len; /*!< Length of PSK from callback */ #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_ssl_key_cert *key_cert; /*!< chosen key/cert pair (server) */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) int sni_authmode; /*!< authmode from SNI callback */ mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI */ mbedtls_x509_crt *sni_ca_chain; /*!< trusted CAs from SNI callback */ mbedtls_x509_crl *sni_ca_crl; /*!< trusted CAs CRLs from SNI */ #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) int ecrs_enabled; /*!< Handshake supports EC restart? */ mbedtls_x509_crt_restart_ctx ecrs_ctx; /*!< restart context */ enum { /* this complements ssl->state with info on intra-state operations */ ssl_ecrs_none = 0, /*!< nothing going on (yet) */ ssl_ecrs_crt_verify, /*!< Certificate: crt_verify() */ ssl_ecrs_ske_start_processing, /*!< ServerKeyExchange: pk_verify() */ ssl_ecrs_cke_ecdh_calc_secret, /*!< ClientKeyExchange: ECDH step 2 */ ssl_ecrs_crt_vrfy_sign, /*!< CertificateVerify: pk_sign() */ } ecrs_state; /*!< current (or last) operation */ size_t ecrs_n; /*!< place for saving a length */ #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) unsigned int out_msg_seq; /*!< Outgoing handshake sequence number */ unsigned int in_msg_seq; /*!< Incoming handshake sequence number */ unsigned char *verify_cookie; /*!< Cli: HelloVerifyRequest cookie Srv: unused */ unsigned char verify_cookie_len; /*!< Cli: cookie length Srv: flag for sending a cookie */ uint32_t retransmit_timeout; /*!< Current value of timeout */ unsigned char retransmit_state; /*!< Retransmission state */ mbedtls_ssl_flight_item *flight; /*!< Current outgoing flight */ mbedtls_ssl_flight_item *cur_msg; /*!< Current message in flight */ unsigned char *cur_msg_p; /*!< Position in current message */ unsigned int in_flight_start_seq; /*!< Minimum message sequence in the flight being received */ mbedtls_ssl_transform *alt_transform_out; /*!< Alternative transform for resending messages */ unsigned char alt_out_ctr[8]; /*!< Alternative record epoch/counter for resending messages */ struct { size_t total_bytes_buffered; /*!< Cumulative size of heap allocated * buffers used for message buffering. */ uint8_t seen_ccs; /*!< Indicates if a CCS message has * been seen in the current flight. */ struct mbedtls_ssl_hs_buffer { unsigned is_valid : 1; unsigned is_fragmented : 1; unsigned is_complete : 1; unsigned char *data; size_t data_len; } hs[MBEDTLS_SSL_MAX_BUFFERED_HS]; struct { unsigned char *data; size_t len; unsigned epoch; } future_record; } buffering; uint16_t mtu; /*!< Handshake mtu, used to fragment outgoing messages */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Checksum contexts */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_context fin_md5; mbedtls_sha1_context fin_sha1; #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_context fin_sha256; #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_context fin_sha512; #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t); void (*calc_verify)(mbedtls_ssl_context *, unsigned char *); void (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int); int (*tls_prf)(const unsigned char *, size_t, const char *, const unsigned char *, size_t, unsigned char *, size_t); size_t pmslen; /*!< premaster length */ unsigned char randbytes[64]; /*!< random bytes */ unsigned char premaster[MBEDTLS_PREMASTER_SIZE]; /*!< premaster secret */ int resume; /*!< session resume indicator*/ int max_major_ver; /*!< max. major version client*/ int max_minor_ver; /*!< max. minor version client*/ int cli_exts; /*!< client extension presence*/ #if defined(MBEDTLS_SSL_SESSION_TICKETS) int new_session_ticket; /*!< use NewSessionTicket? */ #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) int extended_ms; /*!< use Extended Master Secret? */ #endif #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) unsigned int async_in_progress : 1; /*!< an asynchronous operation is in progress */ #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) /** Asynchronous operation context. This field is meant for use by the * asynchronous operation callbacks (mbedtls_ssl_config::f_async_sign_start, * mbedtls_ssl_config::f_async_decrypt_start, * mbedtls_ssl_config::f_async_resume, mbedtls_ssl_config::f_async_cancel). * The library does not use it internally. */ void *user_async_ctx; #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ }; typedef struct mbedtls_ssl_hs_buffer mbedtls_ssl_hs_buffer; /* * This structure contains a full set of runtime transform parameters * either in negotiation or active. */ struct mbedtls_ssl_transform { /* * Session specific crypto layer */ const mbedtls_ssl_ciphersuite_t *ciphersuite_info; /*!< Chosen cipersuite_info */ unsigned int keylen; /*!< symmetric key length (bytes) */ size_t minlen; /*!< min. ciphertext length */ size_t ivlen; /*!< IV length */ size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */ size_t maclen; /*!< MAC length */ unsigned char iv_enc[16]; /*!< IV (encryption) */ unsigned char iv_dec[16]; /*!< IV (decryption) */ #if defined(MBEDTLS_SSL_PROTO_SSL3) /* Needed only for SSL v3.0 secret */ unsigned char mac_enc[20]; /*!< SSL v3.0 secret (enc) */ unsigned char mac_dec[20]; /*!< SSL v3.0 secret (dec) */ #endif /* MBEDTLS_SSL_PROTO_SSL3 */ mbedtls_md_context_t md_ctx_enc; /*!< MAC (encryption) */ mbedtls_md_context_t md_ctx_dec; /*!< MAC (decryption) */ mbedtls_cipher_context_t cipher_ctx_enc; /*!< encryption context */ mbedtls_cipher_context_t cipher_ctx_dec; /*!< decryption context */ /* * Session specific compression layer */ #if defined(MBEDTLS_ZLIB_SUPPORT) z_stream ctx_deflate; /*!< compression context */ z_stream ctx_inflate; /*!< decompression context */ #endif }; #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * List of certificate + private key pairs */ struct mbedtls_ssl_key_cert { mbedtls_x509_crt *cert; /*!< cert */ mbedtls_pk_context *key; /*!< private key */ mbedtls_ssl_key_cert *next; /*!< next key/cert pair */ }; #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_PROTO_DTLS) /* * List of handshake messages kept around for resending */ struct mbedtls_ssl_flight_item { unsigned char *p; /*!< message, including handshake headers */ size_t len; /*!< length of p */ unsigned char type; /*!< type of the message: handshake or CCS */ mbedtls_ssl_flight_item *next; /*!< next handshake message(s) */ }; #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* Find an entry in a signature-hash set matching a given hash algorithm. */ mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg ); /* Add a signature-hash-pair to a signature-hash set */ void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg, mbedtls_md_type_t md_alg ); /* Allow exactly one hash algorithm for each signature. */ void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set, mbedtls_md_type_t md_alg ); /* Setup an empty signature-hash set */ static inline void mbedtls_ssl_sig_hash_set_init( mbedtls_ssl_sig_hash_set_t *set ) { mbedtls_ssl_sig_hash_set_const_hash( set, MBEDTLS_MD_NONE ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2) && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /** * \brief Free referenced items in an SSL transform context and clear * memory * * \param transform SSL transform context */ void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform ); /** * \brief Free referenced items in an SSL handshake context and clear * memory * * \param ssl SSL context */ void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl ); int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl ); int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ); void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ); int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl ); void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl ); int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ); int mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl ); int mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl ); void mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl ); /** * \brief Update record layer * * This function roughly separates the implementation * of the logic of (D)TLS from the implementation * of the secure transport. * * \param ssl The SSL context to use. * \param update_hs_digest This indicates if the handshake digest * should be automatically updated in case * a handshake message is found. * * \return 0 or non-zero error code. * * \note A clarification on what is called 'record layer' here * is in order, as many sensible definitions are possible: * * The record layer takes as input an untrusted underlying * transport (stream or datagram) and transforms it into * a serially multiplexed, secure transport, which * conceptually provides the following: * * (1) Three datagram based, content-agnostic transports * for handshake, alert and CCS messages. * (2) One stream- or datagram-based transport * for application data. * (3) Functionality for changing the underlying transform * securing the contents. * * The interface to this functionality is given as follows: * * a Updating * [Currently implemented by mbedtls_ssl_read_record] * * Check if and on which of the four 'ports' data is pending: * Nothing, a controlling datagram of type (1), or application * data (2). In any case data is present, internal buffers * provide access to the data for the user to process it. * Consumption of type (1) datagrams is done automatically * on the next update, invalidating that the internal buffers * for previous datagrams, while consumption of application * data (2) is user-controlled. * * b Reading of application data * [Currently manual adaption of ssl->in_offt pointer] * * As mentioned in the last paragraph, consumption of data * is different from the automatic consumption of control * datagrams (1) because application data is treated as a stream. * * c Tracking availability of application data * [Currently manually through decreasing ssl->in_msglen] * * For efficiency and to retain datagram semantics for * application data in case of DTLS, the record layer * provides functionality for checking how much application * data is still available in the internal buffer. * * d Changing the transformation securing the communication. * * Given an opaque implementation of the record layer in the * above sense, it should be possible to implement the logic * of (D)TLS on top of it without the need to know anything * about the record layer's internals. This is done e.g. * in all the handshake handling functions, and in the * application data reading function mbedtls_ssl_read. * * \note The above tries to give a conceptual picture of the * record layer, but the current implementation deviates * from it in some places. For example, our implementation of * the update functionality through mbedtls_ssl_read_record * discards datagrams depending on the current state, which * wouldn't fall under the record layer's responsibility * following the above definition. * */ int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl, unsigned update_hs_digest ); int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ); int mbedtls_ssl_write_handshake_msg( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush ); int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ); int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ); int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl ); int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl ); void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl, const mbedtls_ssl_ciphersuite_t *ciphersuite_info ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex ); #endif #if defined(MBEDTLS_PK_C) unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk ); unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type ); mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig ); #endif mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash ); unsigned char mbedtls_ssl_hash_from_md_alg( int md ); int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md ); #if defined(MBEDTLS_ECP_C) int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id ); #endif #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl, mbedtls_md_type_t md ); #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) static inline mbedtls_pk_context *mbedtls_ssl_own_key( mbedtls_ssl_context *ssl ) { mbedtls_ssl_key_cert *key_cert; if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) key_cert = ssl->handshake->key_cert; else key_cert = ssl->conf->key_cert; return( key_cert == NULL ? NULL : key_cert->key ); } static inline mbedtls_x509_crt *mbedtls_ssl_own_cert( mbedtls_ssl_context *ssl ) { mbedtls_ssl_key_cert *key_cert; if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) key_cert = ssl->handshake->key_cert; else key_cert = ssl->conf->key_cert; return( key_cert == NULL ? NULL : key_cert->cert ); } /* * Check usage of a certificate wrt extensions: * keyUsage, extendedKeyUsage (later), and nSCertType (later). * * Warning: cert_endpoint is the endpoint of the cert (ie, of our peer when we * check a cert we received from them)! * * Return 0 if everything is OK, -1 if not. */ int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert, const mbedtls_ssl_ciphersuite_t *ciphersuite, int cert_endpoint, uint32_t *flags ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ void mbedtls_ssl_write_version( int major, int minor, int transport, unsigned char ver[2] ); void mbedtls_ssl_read_version( int *major, int *minor, int transport, const unsigned char ver[2] ); static inline size_t mbedtls_ssl_hdr_len( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 13 ); #else ((void) ssl); #endif return( 5 ); } static inline size_t mbedtls_ssl_hs_hdr_len( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 12 ); #else ((void) ssl); #endif return( 4 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl ); void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl ); int mbedtls_ssl_resend( mbedtls_ssl_context *ssl ); int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl ); #endif /* Visible for testing purposes only */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl ); void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl ); #endif /* constant-time buffer comparison */ static inline int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n ) { size_t i; volatile const unsigned char *A = (volatile const unsigned char *) a; volatile const unsigned char *B = (volatile const unsigned char *) b; volatile unsigned char diff = 0; for( i = 0; i < n; i++ ) { /* Read volatile data in order before computing diff. * This avoids IAR compiler warning: * 'the order of volatile accesses is undefined ..' */ unsigned char x = A[i], y = B[i]; diff |= x ^ y; } return( diff ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl, unsigned char *output, unsigned char *data, size_t data_len ); #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl, unsigned char *hash, size_t *hashlen, unsigned char *data, size_t data_len, mbedtls_md_type_t md_alg ); #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ #ifdef __cplusplus } #endif #endif /* ssl_internal.h */ fldigi-4.1.06/src/include/mbedtls/pkcs11.h0000664000175000017500000001325513507401434015111 00000000000000/** * \file pkcs11.h * * \brief Wrapper for PKCS#11 library libpkcs11-helper * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PKCS11_H #define MBEDTLS_PKCS11_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PKCS11_C) #include "x509_crt.h" #include #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #ifdef __cplusplus extern "C" { #endif /** * Context for PKCS #11 private keys. */ typedef struct mbedtls_pkcs11_context { pkcs11h_certificate_t pkcs11h_cert; int len; } mbedtls_pkcs11_context; /** * Initialize a mbedtls_pkcs11_context. * (Just making memory references valid.) */ void mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx ); /** * Fill in a mbed TLS certificate, based on the given PKCS11 helper certificate. * * \param cert X.509 certificate to fill * \param pkcs11h_cert PKCS #11 helper certificate * * \return 0 on success. */ int mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11h_cert ); /** * Set up a mbedtls_pkcs11_context storing the given certificate. Note that the * mbedtls_pkcs11_context will take over control of the certificate, freeing it when * done. * * \param priv_key Private key structure to fill. * \param pkcs11_cert PKCS #11 helper certificate * * \return 0 on success */ int mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key, pkcs11h_certificate_t pkcs11_cert ); /** * Free the contents of the given private key context. Note that the structure * itself is not freed. * * \param priv_key Private key structure to cleanup */ void mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key ); /** * \brief Do an RSA private key decrypt, then remove the message * padding * * \param ctx PKCS #11 context * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature * \param input buffer holding the encrypted data * \param output buffer that will hold the plaintext * \param olen will contain the plaintext length * \param output_max_len maximum length of the output buffer * * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code * * \note The output buffer must be as large as the size * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise * an error is thrown. */ int mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief Do a private RSA to sign a message digest * * \param ctx PKCS #11 context * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) * \param hashlen message digest length (for MBEDTLS_MD_NONE only) * \param hash buffer holding the message digest * \param sig buffer that will hold the ciphertext * * \return 0 if the signing operation was successful, * or an MBEDTLS_ERR_RSA_XXX error code * * \note The "sig" buffer must be as large as the size * of ctx->N (eg. 128 bytes if RSA-1024 is used). */ int mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * SSL/TLS wrappers for PKCS#11 functions */ static inline int mbedtls_ssl_pkcs11_decrypt( void *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { return mbedtls_pkcs11_decrypt( (mbedtls_pkcs11_context *) ctx, mode, olen, input, output, output_max_len ); } static inline int mbedtls_ssl_pkcs11_sign( void *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { ((void) f_rng); ((void) p_rng); return mbedtls_pkcs11_sign( (mbedtls_pkcs11_context *) ctx, mode, md_alg, hashlen, hash, sig ); } static inline size_t mbedtls_ssl_pkcs11_key_len( void *ctx ) { return ( (mbedtls_pkcs11_context *) ctx )->len; } #ifdef __cplusplus } #endif #endif /* MBEDTLS_PKCS11_C */ #endif /* MBEDTLS_PKCS11_H */ fldigi-4.1.06/src/include/mbedtls/x509_crt.h0000664000175000017500000007571713507401434015377 00000000000000/** * \file x509_crt.h * * \brief X.509 certificate parsing and writing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_CRT_H #define MBEDTLS_X509_CRT_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "x509.h" #include "x509_crl.h" /** * \addtogroup x509_module * \{ */ #ifdef __cplusplus extern "C" { #endif /** * \name Structures and functions for parsing and writing X.509 certificates * \{ */ /** * Container for an X.509 certificate. The certificate may be chained. */ typedef struct mbedtls_x509_crt { mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ int version; /**< The X.509 version. (1=v1, 2=v2, 3=v3) */ mbedtls_x509_buf serial; /**< Unique id for certificate issued by a specific CA. */ mbedtls_x509_buf sig_oid; /**< Signature algorithm, e.g. sha1RSA */ mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). Used for quick comparison. */ mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). Used for quick comparison. */ mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ mbedtls_x509_time valid_from; /**< Start time of certificate validity. */ mbedtls_x509_time valid_to; /**< End time of certificate validity. */ mbedtls_pk_context pk; /**< Container for the public key context. */ mbedtls_x509_buf issuer_id; /**< Optional X.509 v2/v3 issuer unique identifier. */ mbedtls_x509_buf subject_id; /**< Optional X.509 v2/v3 subject unique identifier. */ mbedtls_x509_buf v3_ext; /**< Optional X.509 v3 extensions. */ mbedtls_x509_sequence subject_alt_names; /**< Optional list of Subject Alternative Names (Only dNSName supported). */ int ext_types; /**< Bit string containing detected and parsed extensions */ int ca_istrue; /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */ int max_pathlen; /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */ unsigned int key_usage; /**< Optional key usage extension value: See the values in x509.h */ mbedtls_x509_sequence ext_key_usage; /**< Optional list of extended key usage OIDs. */ unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values in x509.h */ mbedtls_x509_buf sig; /**< Signature: hash of the tbs part signed with the private key. */ mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ struct mbedtls_x509_crt *next; /**< Next certificate in the CA-chain. */ } mbedtls_x509_crt; /** * Build flag from an algorithm/curve identifier (pk, md, ecp) * Since 0 is always XXX_NONE, ignore it. */ #define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( id - 1 ) ) /** * Security profile for certificate verification. * * All lists are bitfields, built by ORing flags from MBEDTLS_X509_ID_FLAG(). */ typedef struct mbedtls_x509_crt_profile { uint32_t allowed_mds; /**< MDs for signatures */ uint32_t allowed_pks; /**< PK algs for signatures */ uint32_t allowed_curves; /**< Elliptic curves for ECDSA */ uint32_t rsa_min_bitlen; /**< Minimum size for RSA keys */ } mbedtls_x509_crt_profile; #define MBEDTLS_X509_CRT_VERSION_1 0 #define MBEDTLS_X509_CRT_VERSION_2 1 #define MBEDTLS_X509_CRT_VERSION_3 2 #define MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 32 #define MBEDTLS_X509_RFC5280_UTC_TIME_LEN 15 #if !defined( MBEDTLS_X509_MAX_FILE_PATH_LEN ) #define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 #endif /** * Container for writing a certificate (CRT) */ typedef struct mbedtls_x509write_cert { int version; mbedtls_mpi serial; mbedtls_pk_context *subject_key; mbedtls_pk_context *issuer_key; mbedtls_asn1_named_data *subject; mbedtls_asn1_named_data *issuer; mbedtls_md_type_t md_alg; char not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; char not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; mbedtls_asn1_named_data *extensions; } mbedtls_x509write_cert; /** * Item in a verification chain: cert and flags for it */ typedef struct { mbedtls_x509_crt *crt; uint32_t flags; } mbedtls_x509_crt_verify_chain_item; /** * Max size of verification chain: end-entity + intermediates + trusted root */ #define MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE ( MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2 ) /** * Verification chain as built by \c mbedtls_crt_verify_chain() */ typedef struct { mbedtls_x509_crt_verify_chain_item items[MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE]; unsigned len; } mbedtls_x509_crt_verify_chain; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Context for resuming X.509 verify operations */ typedef struct { /* for check_signature() */ mbedtls_pk_restart_ctx pk; /* for find_parent_in() */ mbedtls_x509_crt *parent; /* non-null iff parent_in in progress */ mbedtls_x509_crt *fallback_parent; int fallback_signature_is_good; /* for find_parent() */ int parent_is_trusted; /* -1 if find_parent is not in progress */ /* for verify_chain() */ enum { x509_crt_rs_none, x509_crt_rs_find_parent, } in_progress; /* none if no operation is in progress */ int self_cnt; mbedtls_x509_crt_verify_chain ver_chain; } mbedtls_x509_crt_restart_ctx; #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* Now we can declare functions that take a pointer to that */ typedef void mbedtls_x509_crt_restart_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * Default security profile. Should provide a good balance between security * and compatibility with current deployments. */ extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default; /** * Expected next default profile. Recommended for new deployments. * Currently targets a 128-bit security level, except for RSA-2048. */ extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next; /** * NSA Suite B profile. */ extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb; /** * \brief Parse a single DER formatted certificate and add it * to the chained list. * * \param chain points to the start of the chain * \param buf buffer holding the certificate DER data * \param buflen size of the buffer * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ); /** * \brief Parse one DER-encoded or one or more concatenated PEM-encoded * certificates and add them to the chained list. * * For CRTs in PEM encoding, the function parses permissively: * if at least one certificate can be parsed, the function * returns the number of certificates for which parsing failed * (hence \c 0 if all certificates were parsed successfully). * If no certificate could be parsed, the function returns * the first (negative) error encountered during parsing. * * PEM encoded certificates may be interleaved by other data * such as human readable descriptions of their content, as * long as the certificates are enclosed in the PEM specific * '-----{BEGIN/END} CERTIFICATE-----' delimiters. * * \param chain The chain to which to add the parsed certificates. * \param buf The buffer holding the certificate data in PEM or DER format. * For certificates in PEM encoding, this may be a concatenation * of multiple certificates; for DER encoding, the buffer must * comprise exactly one certificate. * \param buflen The size of \p buf, including the terminating \c NULL byte * in case of PEM encoded data. * * \return \c 0 if all certificates were parsed successfully. * \return The (positive) number of certificates that couldn't * be parsed if parsing was partly successful (see above). * \return A negative X509 or PEM error code otherwise. * */ int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ); #if defined(MBEDTLS_FS_IO) /** * \brief Load one or more certificates and add them * to the chained list. Parses permissively. If some * certificates can be parsed, the result is the number * of failed certificates it encountered. If none complete * correctly, the first error is returned. * * \param chain points to the start of the chain * \param path filename to read the certificates from * * \return 0 if all certificates parsed successfully, a positive number * if partly successful or a specific X509 or PEM error code */ int mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path ); /** * \brief Load one or more certificate files from a path and add them * to the chained list. Parses permissively. If some * certificates can be parsed, the result is the number * of failed certificates it encountered. If none complete * correctly, the first error is returned. * * \param chain points to the start of the chain * \param path directory / folder to read the certificate files from * * \return 0 if all certificates parsed successfully, a positive number * if partly successful or a specific X509 or PEM error code */ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief Returns an informational string about the * certificate. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param crt The X509 certificate to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crt *crt ); /** * \brief Returns an informational string about the * verification status of a certificate. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param flags Verification flags created by mbedtls_x509_crt_verify() * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix, uint32_t flags ); /** * \brief Verify the certificate signature * * The verify callback is a user-supplied callback that * can clear / modify / add flags for a certificate. If set, * the verification callback is called for each * certificate in the chain (from the trust-ca down to the * presented crt). The parameters for the callback are: * (void *parameter, mbedtls_x509_crt *crt, int certificate_depth, * int *flags). With the flags representing current flags for * that specific certificate and the certificate depth from * the bottom (Peer cert depth = 0). * * All flags left after returning from the callback * are also returned to the application. The function should * return 0 for anything (including invalid certificates) * other than fatal error, as a non-zero return code * immediately aborts the verification process. For fatal * errors, a specific error code should be used (different * from MBEDTLS_ERR_X509_CERT_VERIFY_FAILED which should not * be returned at this point), or MBEDTLS_ERR_X509_FATAL_ERROR * can be used if no better code is available. * * \note In case verification failed, the results can be displayed * using \c mbedtls_x509_crt_verify_info() * * \note Same as \c mbedtls_x509_crt_verify_with_profile() with the * default security profile. * * \note It is your responsibility to provide up-to-date CRLs for * all trusted CAs. If no CRL is provided for the CA that was * used to sign the certificate, CRL verification is skipped * silently, that is *without* setting any flag. * * \note The \c trust_ca list can contain two types of certificates: * (1) those of trusted root CAs, so that certificates * chaining up to those CAs will be trusted, and (2) * self-signed end-entity certificates to be trusted (for * specific peers you know) - in that case, the self-signed * certificate doesn't need to have the CA bit set. * * \param crt a certificate (chain) to be verified * \param trust_ca the list of trusted CAs (see note above) * \param ca_crl the list of CRLs for trusted CAs (see note above) * \param cn expected Common Name (can be set to * NULL if the CN must not be verified) * \param flags result of the verification * \param f_vrfy verification function * \param p_vrfy verification parameter * * \return 0 (and flags set to 0) if the chain was verified and valid, * MBEDTLS_ERR_X509_CERT_VERIFY_FAILED if the chain was verified * but found to be invalid, in which case *flags will have one * or more MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX * flags set, or another error (and flags set to 0xffffffff) * in case of a fatal error encountered during the * verification process. */ int mbedtls_x509_crt_verify( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ); /** * \brief Verify the certificate signature according to profile * * \note Same as \c mbedtls_x509_crt_verify(), but with explicit * security profile. * * \note The restrictions on keys (RSA minimum size, allowed curves * for ECDSA) apply to all certificates: trusted root, * intermediate CAs if any, and end entity certificate. * * \param crt a certificate (chain) to be verified * \param trust_ca the list of trusted CAs * \param ca_crl the list of CRLs for trusted CAs * \param profile security profile for verification * \param cn expected Common Name (can be set to * NULL if the CN must not be verified) * \param flags result of the verification * \param f_vrfy verification function * \param p_vrfy verification parameter * * \return 0 if successful or MBEDTLS_ERR_X509_CERT_VERIFY_FAILED * in which case *flags will have one or more * MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX flags * set, * or another error in case of a fatal error encountered * during the verification process. */ int mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ); /** * \brief Restartable version of \c mbedtls_crt_verify_with_profile() * * \note Performs the same job as \c mbedtls_crt_verify_with_profile() * but can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param crt a certificate (chain) to be verified * \param trust_ca the list of trusted CAs * \param ca_crl the list of CRLs for trusted CAs * \param profile security profile for verification * \param cn expected Common Name (can be set to * NULL if the CN must not be verified) * \param flags result of the verification * \param f_vrfy verification function * \param p_vrfy verification parameter * \param rs_ctx restart context (NULL to disable restart) * * \return See \c mbedtls_crt_verify_with_profile(), or * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). */ int mbedtls_x509_crt_verify_restartable( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy, mbedtls_x509_crt_restart_ctx *rs_ctx ); #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) /** * \brief Check usage of certificate against keyUsage extension. * * \param crt Leaf certificate used. * \param usage Intended usage(s) (eg MBEDTLS_X509_KU_KEY_ENCIPHERMENT * before using the certificate to perform an RSA key * exchange). * * \note Except for decipherOnly and encipherOnly, a bit set in the * usage argument means this bit MUST be set in the * certificate. For decipherOnly and encipherOnly, it means * that bit MAY be set. * * \return 0 is these uses of the certificate are allowed, * MBEDTLS_ERR_X509_BAD_INPUT_DATA if the keyUsage extension * is present but does not match the usage argument. * * \note You should only call this function on leaf certificates, on * (intermediate) CAs the keyUsage extension is automatically * checked by \c mbedtls_x509_crt_verify(). */ int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt, unsigned int usage ); #endif /* MBEDTLS_X509_CHECK_KEY_USAGE) */ #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) /** * \brief Check usage of certificate against extendedKeyUsage. * * \param crt Leaf certificate used. * \param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or * MBEDTLS_OID_CLIENT_AUTH). * \param usage_len Length of usage_oid (eg given by MBEDTLS_OID_SIZE()). * * \return 0 if this use of the certificate is allowed, * MBEDTLS_ERR_X509_BAD_INPUT_DATA if not. * * \note Usually only makes sense on leaf certificates. */ int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt, const char *usage_oid, size_t usage_len ); #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ #if defined(MBEDTLS_X509_CRL_PARSE_C) /** * \brief Verify the certificate revocation status * * \param crt a certificate to be verified * \param crl the CRL to verify against * * \return 1 if the certificate is revoked, 0 otherwise * */ int mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl ); #endif /* MBEDTLS_X509_CRL_PARSE_C */ /** * \brief Initialize a certificate (chain) * * \param crt Certificate chain to initialize */ void mbedtls_x509_crt_init( mbedtls_x509_crt *crt ); /** * \brief Unallocate all certificate data * * \param crt Certificate chain to free */ void mbedtls_x509_crt_free( mbedtls_x509_crt *crt ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context */ void mbedtls_x509_crt_restart_init( mbedtls_x509_crt_restart_ctx *ctx ); /** * \brief Free the components of a restart context */ void mbedtls_x509_crt_restart_free( mbedtls_x509_crt_restart_ctx *ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ /* \} name */ /* \} addtogroup x509_module */ #if defined(MBEDTLS_X509_CRT_WRITE_C) /** * \brief Initialize a CRT writing context * * \param ctx CRT context to initialize */ void mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx ); /** * \brief Set the verion for a Certificate * Default: MBEDTLS_X509_CRT_VERSION_3 * * \param ctx CRT context to use * \param version version to set (MBEDTLS_X509_CRT_VERSION_1, MBEDTLS_X509_CRT_VERSION_2 or * MBEDTLS_X509_CRT_VERSION_3) */ void mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version ); /** * \brief Set the serial number for a Certificate. * * \param ctx CRT context to use * \param serial serial number to set * * \return 0 if successful */ int mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial ); /** * \brief Set the validity period for a Certificate * Timestamps should be in string format for UTC timezone * i.e. "YYYYMMDDhhmmss" * e.g. "20131231235959" for December 31st 2013 * at 23:59:59 * * \param ctx CRT context to use * \param not_before not_before timestamp * \param not_after not_after timestamp * * \return 0 if timestamp was parsed successfully, or * a specific error code */ int mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before, const char *not_after ); /** * \brief Set the issuer name for a Certificate * Issuer names should contain a comma-separated list * of OID types and values: * e.g. "C=UK,O=ARM,CN=mbed TLS CA" * * \param ctx CRT context to use * \param issuer_name issuer name to set * * \return 0 if issuer name was parsed successfully, or * a specific error code */ int mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx, const char *issuer_name ); /** * \brief Set the subject name for a Certificate * Subject names should contain a comma-separated list * of OID types and values: * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" * * \param ctx CRT context to use * \param subject_name subject name to set * * \return 0 if subject name was parsed successfully, or * a specific error code */ int mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx, const char *subject_name ); /** * \brief Set the subject public key for the certificate * * \param ctx CRT context to use * \param key public key to include */ void mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); /** * \brief Set the issuer key used for signing the certificate * * \param ctx CRT context to use * \param key private key to sign with */ void mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); /** * \brief Set the MD algorithm to use for the signature * (e.g. MBEDTLS_MD_SHA1) * * \param ctx CRT context to use * \param md_alg MD algorithm to use */ void mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg ); /** * \brief Generic function to add to or replace an extension in the * CRT * * \param ctx CRT context to use * \param oid OID of the extension * \param oid_len length of the OID * \param critical if the extension is critical (per the RFC's definition) * \param val value of the extension OCTET STRING * \param val_len length of the value data * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ); /** * \brief Set the basicConstraints extension for a CRT * * \param ctx CRT context to use * \param is_ca is this a CA certificate * \param max_pathlen maximum length of certificate chains below this * certificate (only for CA certificates, -1 is * inlimited) * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx, int is_ca, int max_pathlen ); #if defined(MBEDTLS_SHA1_C) /** * \brief Set the subjectKeyIdentifier extension for a CRT * Requires that mbedtls_x509write_crt_set_subject_key() has been * called before * * \param ctx CRT context to use * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx ); /** * \brief Set the authorityKeyIdentifier extension for a CRT * Requires that mbedtls_x509write_crt_set_issuer_key() has been * called before * * \param ctx CRT context to use * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx ); #endif /* MBEDTLS_SHA1_C */ /** * \brief Set the Key Usage Extension flags * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) * * \param ctx CRT context to use * \param key_usage key usage flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx, unsigned int key_usage ); /** * \brief Set the Netscape Cert Type flags * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) * * \param ctx CRT context to use * \param ns_cert_type Netscape Cert Type flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx, unsigned char ns_cert_type ); /** * \brief Free the contents of a CRT write context * * \param ctx CRT context to free */ void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx ); /** * \brief Write a built up certificate to a X509 DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx certificate to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return length of data written if successful, or a specific * error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a built up certificate to a X509 PEM string * * \param ctx certificate to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return 0 if successful, or a specific error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_crt_pem( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CRT_WRITE_C */ #ifdef __cplusplus } #endif #endif /* mbedtls_x509_crt.h */ fldigi-4.1.06/src/include/mbedtls/certs.h0000664000175000017500000000705413507401434015127 00000000000000/** * \file certs.h * * \brief Sample certificates and DHM parameters for testing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CERTS_H #define MBEDTLS_CERTS_H #include #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_PEM_PARSE_C) /* Concatenation of all CA certificates in PEM format if available */ extern const char mbedtls_test_cas_pem[]; extern const size_t mbedtls_test_cas_pem_len; #endif /* List of all CA certificates, terminated by NULL */ extern const char * mbedtls_test_cas[]; extern const size_t mbedtls_test_cas_len[]; /* * Convenience for users who just want a certificate: * RSA by default, or ECDSA if RSA is not available */ extern const char * mbedtls_test_ca_crt; extern const size_t mbedtls_test_ca_crt_len; extern const char * mbedtls_test_ca_key; extern const size_t mbedtls_test_ca_key_len; extern const char * mbedtls_test_ca_pwd; extern const size_t mbedtls_test_ca_pwd_len; extern const char * mbedtls_test_srv_crt; extern const size_t mbedtls_test_srv_crt_len; extern const char * mbedtls_test_srv_key; extern const size_t mbedtls_test_srv_key_len; extern const char * mbedtls_test_cli_crt; extern const size_t mbedtls_test_cli_crt_len; extern const char * mbedtls_test_cli_key; extern const size_t mbedtls_test_cli_key_len; #if defined(MBEDTLS_ECDSA_C) extern const char mbedtls_test_ca_crt_ec[]; extern const size_t mbedtls_test_ca_crt_ec_len; extern const char mbedtls_test_ca_key_ec[]; extern const size_t mbedtls_test_ca_key_ec_len; extern const char mbedtls_test_ca_pwd_ec[]; extern const size_t mbedtls_test_ca_pwd_ec_len; extern const char mbedtls_test_srv_crt_ec[]; extern const size_t mbedtls_test_srv_crt_ec_len; extern const char mbedtls_test_srv_key_ec[]; extern const size_t mbedtls_test_srv_key_ec_len; extern const char mbedtls_test_cli_crt_ec[]; extern const size_t mbedtls_test_cli_crt_ec_len; extern const char mbedtls_test_cli_key_ec[]; extern const size_t mbedtls_test_cli_key_ec_len; #endif #if defined(MBEDTLS_RSA_C) extern const char mbedtls_test_ca_crt_rsa[]; extern const size_t mbedtls_test_ca_crt_rsa_len; extern const char mbedtls_test_ca_key_rsa[]; extern const size_t mbedtls_test_ca_key_rsa_len; extern const char mbedtls_test_ca_pwd_rsa[]; extern const size_t mbedtls_test_ca_pwd_rsa_len; extern const char mbedtls_test_srv_crt_rsa[]; extern const size_t mbedtls_test_srv_crt_rsa_len; extern const char mbedtls_test_srv_key_rsa[]; extern const size_t mbedtls_test_srv_key_rsa_len; extern const char mbedtls_test_cli_crt_rsa[]; extern const size_t mbedtls_test_cli_crt_rsa_len; extern const char mbedtls_test_cli_key_rsa[]; extern const size_t mbedtls_test_cli_key_rsa_len; #endif #ifdef __cplusplus } #endif #endif /* certs.h */ fldigi-4.1.06/src/include/mbedtls/des.h0000664000175000017500000002630613507401434014563 00000000000000/** * \file des.h * * \brief DES block cipher * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_DES_H #define MBEDTLS_DES_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_DES_ENCRYPT 1 #define MBEDTLS_DES_DECRYPT 0 #define MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH -0x0032 /**< The data input has an invalid length. */ /* MBEDTLS_ERR_DES_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_DES_HW_ACCEL_FAILED -0x0033 /**< DES hardware accelerator failed. */ #define MBEDTLS_DES_KEY_SIZE 8 #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_DES_ALT) // Regular implementation // /** * \brief DES context structure * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ typedef struct mbedtls_des_context { uint32_t sk[32]; /*!< DES subkeys */ } mbedtls_des_context; /** * \brief Triple-DES context structure */ typedef struct mbedtls_des3_context { uint32_t sk[96]; /*!< 3DES subkeys */ } mbedtls_des3_context; #else /* MBEDTLS_DES_ALT */ #include "des_alt.h" #endif /* MBEDTLS_DES_ALT */ /** * \brief Initialize DES context * * \param ctx DES context to be initialized * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_init( mbedtls_des_context *ctx ); /** * \brief Clear DES context * * \param ctx DES context to be cleared * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_free( mbedtls_des_context *ctx ); /** * \brief Initialize Triple-DES context * * \param ctx DES3 context to be initialized */ void mbedtls_des3_init( mbedtls_des3_context *ctx ); /** * \brief Clear Triple-DES context * * \param ctx DES3 context to be cleared */ void mbedtls_des3_free( mbedtls_des3_context *ctx ); /** * \brief Set key parity on the given key to odd. * * DES keys are 56 bits long, but each byte is padded with * a parity bit to allow verification. * * \param key 8-byte secret key * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Check that key parity on the given key is odd. * * DES keys are 56 bits long, but each byte is padded with * a parity bit to allow verification. * * \param key 8-byte secret key * * \return 0 is parity was ok, 1 if parity was not correct. * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Check that key is not a weak or semi-weak DES key * * \param key 8-byte secret key * * \return 0 if no weak key was found, 1 if a weak key was identified. * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief DES key schedule (56-bit, encryption) * * \param ctx DES context to be initialized * \param key 8-byte secret key * * \return 0 * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief DES key schedule (56-bit, decryption) * * \param ctx DES context to be initialized * \param key 8-byte secret key * * \return 0 * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Triple-DES key schedule (112-bit, encryption) * * \param ctx 3DES context to be initialized * \param key 16-byte secret key * * \return 0 */ int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); /** * \brief Triple-DES key schedule (112-bit, decryption) * * \param ctx 3DES context to be initialized * \param key 16-byte secret key * * \return 0 */ int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); /** * \brief Triple-DES key schedule (168-bit, encryption) * * \param ctx 3DES context to be initialized * \param key 24-byte secret key * * \return 0 */ int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); /** * \brief Triple-DES key schedule (168-bit, decryption) * * \param ctx 3DES context to be initialized * \param key 24-byte secret key * * \return 0 */ int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); /** * \brief DES-ECB block encryption/decryption * * \param ctx DES context * \param input 64-bit input block * \param output 64-bit output block * * \return 0 if successful * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx, const unsigned char input[8], unsigned char output[8] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief DES-CBC buffer encryption/decryption * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx DES context * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT * \param length length of the input data * \param iv initialization vector (updated after use) * \param input buffer holding the input data * \param output buffer holding the output data * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ /** * \brief 3DES-ECB block encryption/decryption * * \param ctx 3DES context * \param input 64-bit input block * \param output 64-bit output block * * \return 0 if successful */ int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx, const unsigned char input[8], unsigned char output[8] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief 3DES-CBC buffer encryption/decryption * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx 3DES context * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT * \param length length of the input data * \param iv initialization vector (updated after use) * \param input buffer holding the input data * \param output buffer holding the output data * * \return 0 if successful, or MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH */ int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ /** * \brief Internal function for key expansion. * (Only exposed to allow overriding it, * see MBEDTLS_DES_SETKEY_ALT) * * \param SK Round keys * \param key Base key * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_des_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* des.h */ fldigi-4.1.06/src/include/mbedtls/md4.h0000664000175000017500000002263513507401434014475 00000000000000/** * \file md4.h * * \brief MD4 message digest algorithm (hash function) * * \warning MD4 is considered a weak message digest and its use constitutes a * security risk. We recommend considering stronger message digests * instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_MD4_H #define MBEDTLS_MD4_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_MD4_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD4_HW_ACCEL_FAILED -0x002D /**< MD4 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_MD4_ALT) // Regular implementation // /** * \brief MD4 context structure * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_md4_context { uint32_t total[2]; /*!< number of bytes processed */ uint32_t state[4]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ } mbedtls_md4_context; #else /* MBEDTLS_MD4_ALT */ #include "md4_alt.h" #endif /* MBEDTLS_MD4_ALT */ /** * \brief Initialize MD4 context * * \param ctx MD4 context to be initialized * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md4_init( mbedtls_md4_context *ctx ); /** * \brief Clear MD4 context * * \param ctx MD4 context to be cleared * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md4_free( mbedtls_md4_context *ctx ); /** * \brief Clone (the state of) an MD4 context * * \param dst The destination context * \param src The context to be cloned * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md4_clone( mbedtls_md4_context *dst, const mbedtls_md4_context *src ); /** * \brief MD4 context setup * * \param ctx context to be initialized * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. */ int mbedtls_md4_starts_ret( mbedtls_md4_context *ctx ); /** * \brief MD4 process buffer * * \param ctx MD4 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_update_ret( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD4 final digest * * \param ctx MD4 context * \param output MD4 checksum result * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_finish_ret( mbedtls_md4_context *ctx, unsigned char output[16] ); /** * \brief MD4 process data block (internal use only) * * \param ctx MD4 context * \param data buffer holding one block of data * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief MD4 context setup * * \deprecated Superseded by mbedtls_md4_starts_ret() in 2.7.0 * * \param ctx context to be initialized * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_starts( mbedtls_md4_context *ctx ); /** * \brief MD4 process buffer * * \deprecated Superseded by mbedtls_md4_update_ret() in 2.7.0 * * \param ctx MD4 context * \param input buffer holding the data * \param ilen length of the input data * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD4 final digest * * \deprecated Superseded by mbedtls_md4_finish_ret() in 2.7.0 * * \param ctx MD4 context * \param output MD4 checksum result * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] ); /** * \brief MD4 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_md4_process() in 2.7.0 * * \param ctx MD4 context * \param data buffer holding one block of data * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = MD4( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output MD4 checksum result * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = MD4( input buffer ) * * \deprecated Superseded by mbedtls_md4_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output MD4 checksum result * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_md4.h */ fldigi-4.1.06/src/include/mbedtls/entropy_poll.h0000664000175000017500000000662113507401434016534 00000000000000/** * \file entropy_poll.h * * \brief Platform-specific and custom entropy polling functions */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ENTROPY_POLL_H #define MBEDTLS_ENTROPY_POLL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #ifdef __cplusplus extern "C" { #endif /* * Default thresholds for built-in sources, in bytes */ #define MBEDTLS_ENTROPY_MIN_PLATFORM 32 /**< Minimum for platform source */ #define MBEDTLS_ENTROPY_MIN_HAVEGE 32 /**< Minimum for HAVEGE */ #define MBEDTLS_ENTROPY_MIN_HARDCLOCK 4 /**< Minimum for mbedtls_timing_hardclock() */ #if !defined(MBEDTLS_ENTROPY_MIN_HARDWARE) #define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Minimum for the hardware source */ #endif /** * \brief Entropy poll callback that provides 0 entropy. */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) int mbedtls_null_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) /** * \brief Platform-specific entropy poll callback */ int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_HAVEGE_C) /** * \brief HAVEGE based entropy poll callback * * Requires an HAVEGE state as its data pointer. */ int mbedtls_havege_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_TIMING_C) /** * \brief mbedtls_timing_hardclock-based entropy poll callback */ int mbedtls_hardclock_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) /** * \brief Entropy poll callback for a hardware source * * \warning This is not provided by mbed TLS! * See \c MBEDTLS_ENTROPY_HARDWARE_ALT in config.h. * * \note This must accept NULL as its first argument. */ int mbedtls_hardware_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) /** * \brief Entropy poll callback for a non-volatile seed file * * \note This must accept NULL as its first argument. */ int mbedtls_nv_seed_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #ifdef __cplusplus } #endif #endif /* entropy_poll.h */ fldigi-4.1.06/src/include/ssb.h0000644000175000017500000000222313472115776013147 00000000000000// ---------------------------------------------------------------------------- // ssb.h -- ssb modem // // Copyright (C) 2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SSB_H #define _SSB_H #include "modem.h" #define ssb_SampleRate 8000 class ssb : public modem { public: ssb(); ~ssb(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-4.1.06/src/include/spot.h0000644000175000017500000000405713472115776013354 00000000000000// ---------------------------------------------------------------------------- // spot.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SPOT_H_ #define SPOT_H_ #if HAVE_REGEX_H # include #else # include "compat/regex.h" #endif #include #include "globals.h" typedef void (*spot_recv_cb_t)(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data); typedef void (*spot_log_cb_t)(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* data); void spot_recv(char c, int decoder = -1, int afreq = 0, int md = 0); void spot_log(const char* callsign, const char* locator = "", long long freq = 0LL, trx_mode mode = NUM_MODES, time_t rtime = -1L); void spot_manual(const char* callsign, const char* locator = "", long long freq = 0LL, trx_mode mode = NUM_MODES, time_t rtime = -1L); void spot_register_log(spot_log_cb_t lcb, void* ldata); void spot_register_manual(spot_log_cb_t mcb, void* mdata); void spot_register_recv(spot_recv_cb_t rcb, void* rdata, const char* re, int reflags); void spot_unregister_log(spot_log_cb_t lcb, const void* ldata); void spot_unregister_manual(spot_log_cb_t mcb, const void* mdata); void spot_unregister_recv(spot_recv_cb_t rcb, const void* rdata); #endif // SPOT_H_ fldigi-4.1.06/src/include/rigsupport.h0000644000175000017500000000577113472115776014611 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RIG_SUPPORT_H #define RIG_SUPPORT_H #include #include #include "serial.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "xmlrpcpp/XmlRpc.h" #include "xmlrpcpp/XmlRpcValue.h" #define DEFAULT_RIGXML_FILENAME "rig-not-assigned.xml" extern std::string windowTitle; extern Cserial rigio; extern void initOptionMenus(); extern void clearList(); extern void updateSelect(); extern size_t addtoList(long val); extern void build_frequencies2_list(); extern void qso_movFreq(Fl_Widget* w, void*); extern int cb_qso_opMODE(); extern int cb_qso_opBW(); extern int cb_qso_btnBW1(); extern int cb_qso_opBW1(); extern int cb_qso_btnBW2(); extern int cb_qso_opBW2(); extern void qso_setMode(); extern void setTitle(); extern int fwidths[]; extern void sendFreq(long int f); extern void qso_addFreq(); extern void qso_delFreq(); extern void qso_selectFreq(); extern void qso_selectFreq(long int rfcarrier, int carrier); extern void qso_setFreq(); extern void qso_setFreq(long int f); extern void qso_clearList(); extern void saveFreqList(); extern void qso_updateEntry(int i, std::string usage); extern bool readRigXML(); extern bool init_Xml_RigDialog(); extern bool init_NoRig_RigDialog(); extern bool ModeIsLSB(std::string); #if USE_HAMLIB extern bool init_Hamlib_RigDialog(); extern void selMode(rmode_t m); extern std::string modeString(rmode_t m); extern bool hamlib_USB(); extern bool hamlib_active(); #endif // xmlrpc_rig specific extern bool connected_to_flrig; extern void xmlrpc_rig_set_qsy(long long rfc); extern bool xmlrpc_USB(); extern void xmlrpc_send_command(std::string cmd); extern void FLRIG_set_flrig_ab(int n); extern void FLRIG_start_flrig_thread(); extern void stop_flrig_thread(); extern void reconnect_to_flrig(); extern void set_flrig_ptt(int on); extern void set_flrig_freq(long int fr); extern void set_flrig_mode(const char *md); extern void set_flrig_bw(int bw1, int bw2 = 0); extern void set_flrig_notch(); // GPIO export/unexport pin # extern void export_gpio(int); extern void unexport_gpio(int); //------------------------------------------------------------------------------ #endif fldigi-4.1.06/src/include/table.h0000644000175000017500000001345413472115777013460 00000000000000/* Copyright (c) 2004 Markus Niemistö Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __TABLE_HH #define __TABLE_HH #include #include #include #include #include #include #define TABLE_WHEN_DCLICK 16 enum SCROLLS {always, never, var}; struct ColumnInfo { bool hidden; const char *title; int width; Fl_Align align; Fl_Align hdr_align; int (*comparator)(const char*, const char*); void (*callback)(); }; int compareInt(const char *val1, const char *val2); class Table : public Fl_Group { private: // Scrollbars Fl_Scrollbar *hScroll, *vScroll; SCROLLS Vscroll; SCROLLS Hscroll; // Popup menu const Fl_Menu_Item *popupMenu; bool menuAlloc; // Column data std::vector header; // Cell data std::vector data; bool (*highlighter)(int, char **, Fl_Color *); // Table dimensions int tableHeight, tableWidth; int oX, oY, oW, oH; // Outer dimensions (widget - box) int iX, iY, iW, iH; /* * Table area dimensions * (outer dimension - header - scrollbars) */ // For optimization int topRow, bottomRow, leftCol, rightCol; int topRowY, leftColX; int nCols, nRows; // Number of rows and columns int cPos; // Column where new entry is added. int resizing, dragX; int pushed; int sortColumn; // Object sizes int scrollbarSize; int headerHeight; int rowHeight; int selected; char **curRow; Fl_Font tbl_font; int tbl_fontsize; // Various flags bool ascent; bool canResize, canSort; bool noMoreColumns; bool toBeSorted; bool dimensionsChanged; bool headerEnabled; bool withGrid; void dSort(int start, int end, int (*compare)(const char *, const char*)); void aSort(int start, int end, int (*compare)(const char *, const char*)); protected: virtual int handle(int event); virtual void drawHeader(int x, int y); virtual void drawRow(int row, char *rowData[], int x, int y); virtual void draw(); void calcDimensions(); void scrolled(); void resized(); static void scrollCallback(Fl_Widget *widget, void *data); public: Table(int x, int y, int w, int h, char *label = NULL); ~Table(); bool headerOn() const; void headerOn(bool enabled); bool allowResize() const; void allowResize(bool allow); bool allowSort() const; void allowSort(bool allow); bool gridEnabled() const; void gridEnabled(bool enable); int headerSize() const; void headerSize(int height); int rowSize() const; void rowSize(int height); int scrollbSize() const; void scrollbSize(int size); virtual void resize(int x, int y, int w, int h); void font(Fl_Font fnt) { tbl_font = fnt; } Fl_Font font() { return tbl_font; } void fontsize(int fntsize) { tbl_fontsize = fntsize; headerHeight = tbl_fontsize + 4; rowHeight = tbl_fontsize + 4; } int fontsize() { return tbl_fontsize; } Fl_Align headerAlign(int column) const; void headerAlign(int column, Fl_Align align); Fl_Align columnAlign(int column) const; void columnAlign(int column, Fl_Align align); int columnWidth(int column) const; void columnWidth(int column, int width); const char *columnTitle(int column); void columnTitle(int column, const char *title); bool columnHidden(int column); void columnHidden(int column, bool hidden); void sort(); void sort(int column, bool ascent); void getSort(int &sortColumn, bool &ascent); void setHighlighter(bool (*highlighter)(int, char **, Fl_Color *)); void addColumn(const char *label, int width = 150, Fl_Align align = (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP), int (*comparator)(const char*, const char*) = NULL); void colcomparator (int column, int (*comparator)(const char*, const char*) = NULL); void colcallback (int column, void (*callback)() = NULL); void addHiddenColumn(const char *label); void addCell(char *data); void addRow(int cols, ...); void addFromTSV(const char *data); void removeRow(int row); void clear(bool removeColumns = false); void where(int x, int y, int &row, int &column, int &resize); void scrollTo(int pos); int scrollPos() const; int columns(); int rows(); void value(int selection); int value(); char *valueAt(int row, int column); int intValueAt(int row, int column); void valueAt(int row, int column, char *data); void valueAt(int row, int column, int data); const char **getRow(int row); const Fl_Menu_Item *menu(); void menu(const Fl_Menu_Item *m); void menuCopy(const Fl_Menu_Item *m); void menuClear(); void allowVscroll(SCROLLS when) {Vscroll = when;} void allowHscroll(SCROLLS when) {Hscroll = when;} void FirstRow (); void PrevRow (); void NextRow (); void LastRow (); void PrevPage (); void NextPage (); void GotoRow (int); int vScrollWidth() { return (vScroll->visible() ? vScroll->w() : 0);} bool search(int& row, int& col, bool rev, const char* re); }; #endif fldigi-4.1.06/src/include/hamlib.h0000644000175000017500000000311513472115776013615 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _HAMLIB_H #define _HAMLIB_H #include extern void hamlib_get_rigs(void); extern size_t hamlib_get_index(rig_model_t model); extern rig_model_t hamlib_get_rig_model(size_t i); extern rig_model_t hamlib_get_rig_model_compat(const char* name); extern void hamlib_get_rig_str(int (*func)(const char*)); extern void hamlib_close(); extern bool hamlib_init(bool bPtt); extern void hamlib_set_ptt(int); extern void hamlib_set_qsy(long long f); extern int hamlib_setfreq(long int); extern int hamlib_setmode(rmode_t); extern rmode_t hamlib_getmode(); extern int hamlib_setwidth(pbwidth_t); extern pbwidth_t hamlib_getwidth(); extern void hamlib_get_defaults(); extern void hamlib_init_defaults(); #endif fldigi-4.1.06/src/include/rx_extract.h0000644000175000017500000000227613472115776014553 00000000000000// ---------------------------------------------------------------------------- // ex_extract.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2006 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RX_EXTRACT_H #define _RX_EXTRACT_H #include extern const char *txtWrapInfo; extern void rx_extract_add(int c); extern void select_flmsg_pathname(); extern std::string select_binary_pathname(std::string deffilename); extern bool extract_wrap; extern bool extract_flamp; #endif fldigi-4.1.06/src/include/macros.h0000664000175000017500000000512213507402064013633 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _MACROS_H #define _MACROS_H #include #define NUMMACKEYS 12 #define NUMKEYROWS 2 #define MAXKEYROWS 4 #define MAXMACROS (MAXKEYROWS * NUMMACKEYS) extern void CPS_report(int); extern bool PERFORM_CPS_TEST; extern int num_cps_chars; extern struct timeval tv_cps_start; struct CONTESTCNTR { int count; char szCount[20]; char szDisp[40]; std::string fmt; CONTESTCNTR() { count = 0; fmt = "%04d"; } void Format(int ndigits, bool lz) { char c; fmt = '%'; if (lz) fmt = fmt + '0'; c = '0' + ndigits; fmt = fmt + c; fmt = fmt + 'd'; } }; struct MACROTEXT { bool changed; std::string name[MAXMACROS]; std::string text[MAXMACROS]; int loadMacros(const std::string& filename); void loadDefault(); void openMacroFile(); void writeMacroFile(); void saveMacroFile(); void saveMacros(const std::string& fname); std::string expandMacro(std::string &s, bool recurse); void execute(int n); void repeat(int n); void timed_execute(); MACROTEXT(); private: std::string expanded; void loadnewMACROS(std::string& s, size_t &i, size_t endbracket); void savecurrentMACROS(std::string& s, size_t &i, size_t endbracket); }; extern MACROTEXT macros; extern CONTESTCNTR contest_count; extern std::string info1msg; extern std::string info2msg; extern std::string qso_time; extern std::string qso_exchange; extern std::string exec_date; extern std::string exec_time; extern std::string exec_string; extern std::string text2repeat; extern std::string macrochar; extern bool macro_idle_on; extern size_t repeatchar; void set_macro_env(void); void queue_reset(); void Tx_queue_execute(); void Rx_queue_execute(); bool queue_must_rx(); void idleTimer(void *); extern void TxQueINSERTIMAGE(std::string s); #endif fldigi-4.1.06/src/include/dtmf.h0000644000175000017500000000412613472115777013317 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "filters.h" class cDTMF { private: //#define N 240 // 30 msec interval at 8000 sps #define RANGE 0.5 /* any thing higher than RANGE*peak is "on" */ #define THRESH 1000 /* 6 dB s/n for detection */ #define FLUSH_TIME 10 /* 10 frames ~ 330 millisecond */ #define NUMTONES 8 private: double power[NUMTONES]; //double thresh; double maxpower; double minpower; double data[350]; goertzel *filt[NUMTONES]; int framesize; static double coef[]; static int k[]; static const char *dtran[]; static int row[]; static int col[]; static const char rc[]; double outbuf[16384]; double shape[128]; int RT; int duration; int silence_time; int last; std::string dtmfchars; public: cDTMF() { for (int i = 0; i < 4; i++) filt[i] = new goertzel(240, row[i], 8000); for (int i = 0; i < 4; i++) filt[i+4] = new goertzel(240, col[i], 8000); for (int i = 0; i < 240; i++) data[i] = 0; dtmfchars.clear(); framesize = 240; // 8000 sr default silence_time = 0; last = ' '; } ~cDTMF() {}; // receive void calc_power(); int decode(); void receive(const float* buf, size_t len); // transmit void makeshape(); void silence(int); void two_tones(int); void send(); }; fldigi-4.1.06/src/include/rsid.h0000644000175000017500000000770513472115776013333 00000000000000// ---------------------------------------------------------------------------- // // rsid.h // // Copyright (C) 2008, 2009 // Dave Freese, W1HKJ // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Tone separation: 10.766Hz // Integer tone separator (x 16): 172 // Error on 16 tones: 0.25Hz // Tone duration: 0.093 sec // Tone duration, #samples at 8ksps: 743 // Error on 15 tones: negligible // 1024 samples -> 512 tones // 2048 samples, second half zeros // each 512 samples new FFT // ---------------------------------------------------------------------------- #ifndef RSID_H #define RSID_H #include #include #include "ringbuffer.h" #include "globals.h" #include "modem.h" #include "gfft.h" #define RSID_SAMPLE_RATE 11025.0 #define RSID_FFT_SAMPLES 512 #define RSID_FFT_SIZE 1024 #define RSID_ARRAY_SIZE (RSID_FFT_SIZE * 2) #define RSID_BUFFER_SIZE (RSID_ARRAY_SIZE * 2) #define RSID_NSYMBOLS 15 #define RSID_NTIMES (RSID_NSYMBOLS * 2) #define RSID_PRECISION 2.7 // detected frequency precision in Hz // each rsid symbol has a duration equal to 1024 samples at 11025 Hz smpl rate #define RSID_SYMLEN (1024.0 / RSID_SAMPLE_RATE) // 0.09288 // duration of each rsid symbol enum { RSID_BANDWIDTH_500 = 0, RSID_BANDWIDTH_1K, RSID_BANDWIDTH_WIDE, }; typedef double rs_fft_type; typedef std::complex rs_cpx_type; struct RSIDs { unsigned short rs; trx_mode mode; const char* name; }; class cRsId { protected: enum { INITIAL, EXTENDED, WAIT }; private: // Table of precalculated Reed Solomon symbols unsigned char *pCodes1; unsigned char *pCodes2; bool found1; bool found2; static const RSIDs rsid_ids_1[]; static const int rsid_ids_size1; static const int Squares[]; static const int indices[]; static const RSIDs rsid_ids_2[]; static const int rsid_ids_size2; double rsid_secondary_time_out; int hamming_resolution; // Span of FFT bins, in which the RSID will be searched for int nBinLow; int nBinHigh; float aInputSamples[RSID_ARRAY_SIZE * 2]; rs_fft_type fftwindow[RSID_ARRAY_SIZE]; rs_cpx_type aFFTcmplx[RSID_ARRAY_SIZE]; rs_fft_type aFFTAmpl[RSID_FFT_SIZE]; g_fft *rsfft; bool bPrevTimeSliceValid; int iPrevDistance; int iPrevBin; int iPrevSymbol; int fft_buckets[RSID_NTIMES][RSID_FFT_SIZE]; bool bPrevTimeSliceValid2; int iPrevDistance2; int iPrevBin2; int iPrevSymbol2; // resample SRC_STATE* src_state; SRC_DATA src_data; int inptr; static long src_callback(void* cb_data, float** data); // transmit double *outbuf; size_t symlen; unsigned short rmode; unsigned short rmode2; private: void Encode(int code, unsigned char *rsid); void search(void); void setup_mode(int m); void CalculateBuckets(const rs_fft_type *pSpectrum, int iBegin, int iEnd); inline int HammingDistance(int iBucket, unsigned char *p2); bool search_amp( int &bin_out, int &symbol_out, unsigned char *pcode_table ); void apply ( int iBin, int iSymbol, int extended ); public: cRsId(); ~cRsId(); void reset(); void receive(const float* buf, size_t len); void send(bool postidle); bool assigned(trx_mode mode); friend void reset_rsid(void *who); }; #endif fldigi-4.1.06/src/include/mt63base.h0000644000175000017500000003153013472115777014010 00000000000000/* * mt63base.h -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (c) 2007, 2008 Dave Freese, W1HKJ * * base class for use by fldigi * modified from original * excluded CW_ID which is a part of the base modem class for fldigi * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #ifndef MT63BASE_H #define MT63BASE_H // ========================================================================== // Character encoder and block interleaver for the MT63 modem /* How to use this class: 1. Create or declare an object like: MT63encoder Encoder; 2. Preset the object for the given number of carriers and interleave: err=Encoder.Preset(,,); MT63 uses 64 carriers and interleave of 32 or 64 - the corresponding interleave patterns can be found in mt63.dat. If Encode.Preset() returns non-zero you are in big troubles ! 3. For each character to be encode you make the call: Encoder.Process(); and you should then take the bits from the Encode.Output - these are the bits to be sent out on the carriers. (for MT63 logical 0 means carrier flip, logical 1 is no flip). 4. At any time you can call Encoder.Preset() again to change the parameters (this will clean away the interleaver pipe). */ // MT63 modem specific routines, made to be compatible with the MT63ASC.ASM // (c) 1999 Pawel Jalocha, SP9VRC, jalocha@hpdel1.ifj.edu.pl // Date: 05-NOV-1999 class MT63encoder { public: MT63encoder(); ~MT63encoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int RandFill=0); int Process(char code); char *Output; private: int DataCarriers; char CodeMask; int IntlvLen; int IntlvSize; int *IntlvPatt; char *IntlvPipe; int IntlvPtr; double *WalshBuff; } ; // ========================================================================== // MT63 deinterleaver and decoder /* How to use this class: 1. Create or declare an object: MT63decoder Decoder; 2. Preset given parameters with Decoder.Preset(); Decoder.Preset(); Number of carriers and interleave are same as for MT63encoder. "Margin" is the number of extra carriers demodulated on the side because with the MT63 you cannot say with full confidence which is really the first carrier: the FEC decoder have to tell you this. "Integ" is the integration period to find the best FEC match. "Integ" is measured in MT63 symbols (at 1000 kHz we do 10 symbols/s). 3. For each symbol period feed the demodulated data into the object: Decoder.Process(); and then get the demodulated character code from Decoder.Output You can get as well the measured signal-to-noise ratio from Decoder.SNR and the index of the first carrier (according to the FEC match) from Decoder.CarrOfs 4. You can change the parameters at any time with Decoder.Preset() (this will clean the data pipes). */ class MT63decoder { public: MT63decoder(); ~MT63decoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ); int Process(double *Data); char Output; double SignalToNoise; int CarrOfs; private: int DataCarriers; double *IntlvPipe; int IntlvLen; int IntlvSize; int IntlvPtr; int *IntlvPatt; double *WalshBuff; int ScanLen; int ScanSize; double *DecodeSnrMid,*DecodeSnrOut; double W1, W2, W5; char *DecodePipe; int DecodeLen; int DecodeSize; int DecodePtr; } ; // ========================================================================== // MT63 transmitter /* How to use this class: 1. Create or declare an object: MT63tx Tx; 2. Preset parameters: Tx.Preset(,); Allowed values are: bandwidth=500,1000,2000; interleave=0,1; Non-zero value returned means there was a problem... 3. For each character to be sent: Tx.SendChar(); After each call to SendChar() you must read the samples from the Tx.Comb.Output.Data, the number of samples to read is in Tx.Comb.Output.Len. They are in double floating point, so you should convert them to 16-bit integers and output them to your soundcard. 4. If you have nothing to transmit, you must not stop, because you have to keep the sound going. MT63 transmits NL characters (code=0) in this case. 5. When you are done with all the characters and you want to stop, you should still put some NL characters in to flush the interleave thus please call the Tx.SendChar() Tx.DataInterleave times (still add few more characters to flush the windowed IFFT buffers). After that the MT63 transmits a jamming dspSequence for some time to speed up carrier drop at the receiver: you do this by calling Tx.SendJam(); 6. You can transmit few symbols of silence by: Tx.SendSilence() to make a gracefull switch-off. Remember: each time you call SendChar(), SendJam() or SendSilence() you must send the contains of Tx.Comb.Output out to your soundcard. Each Tx.SendXxx() produces the amount of sound corresponding to one symbol time that is 0.1 second for the 1000 Hz mode. The soundcard output rate must be 8000 Hz, rather precisely, that is the error should be below 1 Hz. If it is not you should use the rate converter: look into mt63tx for an example. 7. Inbetween transmissions you may change the settings by calling the Tx.Preset() again. */ class MT63tx { public: MT63tx(); ~MT63tx(); void Free(void); int Preset(double freq, int BandWidth=1000, int LongInterleave=0); int SendTune(bool twotones); int SendChar(char ch); int SendJam(void); int SendSilence(void); private: int DataCarriers; // the number of data carriers int FirstDataCarr; // the FFT index of the first data carrier int WindowLen; // FFT window and symbol shape length double *TxWindow; // The shape of the FFT window (=symbol shape) int AliasFilterLen; // anti-alias filter length //double *AliasShapeI, // *AliasShapeQ; // and shapes (for fixed lower freq of 500 Hz) int DecimateRatio; // decimation/interpolation after/before filter int *InterleavePattern; // how the bits of one block are placed on data carriers double TxAmpl; // Amplitude applied to generate a carrier (before IFFT) long CarrMarkCode; int CarrMarkAmpl; MT63encoder Encoder; // data encode and interleaver int *TxVect; // modulator vector (dspPhases) int *dspPhaseCorr; // dspPhase corrections for each carrier dspCmpx_buff WindowBuff; // FFT/window buffer dsp_r2FFT FFT; // FFT engine dspCmpxMixer txmixer; dspCmpxOverlapWindow Window; // overlapping window int ProcessTxVect(); public: int DataInterleave; dspQuadrComb Comb; // the output of this module is in Comb.Output } ; // ========================================================================== // MT63 receiver /* How to use this class: 1. Declare the object: MT63rx Rx; 2. Preset paramateres Rx.Preset(,,); For weak signals I recommend integration of 32 or more, otherwise 16 is enough. By the way, 16 means 1.6 second for 1000 Hz mode because then we transmit 10 symbols per second. 3. After EACH new batch of samples you should look into Rx.Output for the decoded characters. You can egzamin the receiver status at any time by calling: Rx.SYNC_LockStatus() => logical value 0 or 1 Rx.SYNC_Confidence() => lock confidence: a double between 0.0 and 1.0 Rx.FEC_SNR() => signal-to-noise seen by FEC Rx.TotalFreqOffset() => measured frequency offset in [Hz] assuming 8000 Hz sAmpling */ class MT63rx { public: MT63rx(); ~MT63rx(); void Free(void); int Preset( double freq, int BandWidth = 1000, int LongInterleave = 0, int Integ = 16, void (*Display)(double *Spectra, int Len) = NULL); int Process(double_buff *Input); char_buff Output; // decoded characters int SYNC_LockStatus(void); // 1 => locked, 0 => not locked double SYNC_Confidence(void); // lock confidence <0..1> double SYNC_FreqOffset(void); double SYNC_FreqDevdspRMS(void); double SYNC_TimeOffset(void); double TotalFreqOffset(); // Total frequency offset in [Hz] double FEC_SNR(void); // signal-to-noise ratio at the FEC int FEC_CarrOffset(void); private: dspQuadrSplit InpSplit; // input filter, I/Q splitter, decimator dspCmpxMixer TestOfs; // frequency offset for tests dspDelayLine ProcLine; // processing pipe int ProcdspDelay; // processing dspDelay for optimal symbol probing int SyncProcPtr; // sAmpling pointer for the synchronizer int DataProcPtr; // sAmpling pointer for the data demodulator dsp_r2FFT FFT; // FFT engine int WindowLen; // FFT window length = symbol shape length int WindowLenMask; // WindowLen-1 for pointer wrapping double *RxWindow; // FFT window shape = symbol shape void (*SpectraDisplay)(double *Spectra, int Len); double *SpectradspPower; int AliasFilterLen; // anti-alias filter length //double *AliasShapeI, // *AliasShapeQ; // and shapes int DecimateRatio; // decimation/interpolation after/before filter // how the bits of one block are placed on data carriers int *InterleavePattern; int DataInterleave; // data interleave depth int DataCarriers; // number of carriers int FirstDataCarr; // the FFT index of the first data carrier // int DataCarrSepar; // freq. separation between carriers [FFT bins] long CarrMarkCode; // code to mark carriers (not in use here) // int SymbolSepar; // time separation between symbols [samples] int ScanMargin; // How many carriers up and down to search int IntegLen; // Over how many symbols we integrate to synchronize int SymbolDiv; // =4 we probe the input 4 times per symbol time int SyncStep; // SymbolSepar/SymbolDiv int ScanFirst; // first carrier to scan int ScanLen; // number of carriers to scan dspCmpx *FFTbuff; dspCmpx *FFTbuff2; // here starts the time/frequency synchronizer void SyncProcess(dspCmpx *Slice); dspCmpx *SyncPipe[4]; // FFT result buffer for sync. int SyncPtr; // wrapping pointer for SyncPipe and integrators int SymbPtr; // points about where the symbol is dspCmpx *SyncPhCorr; // dspPhase corrections for the sync. processor dspCmpx *CorrelMid[4], *CorrelOut[4]; // correlation integrator double *dspPowerMid, *dspPowerOut; // carrier dspPower integrator dspCmpx *CorrelNorm[4]; // normalized correlation double W1, W2, W5; // correlation integrator weights double W1p, W2p, W5p; // dspPower integrator weights dspCmpx *CorrelAver[4]; // sliding sum to fit the carrier pattern int FitLen; void DoCorrelSum(dspCmpx *Correl1, dspCmpx *Correl2, dspCmpx *Aver); dspCmpx *SymbFit; // vectors to match symbol shift and confidence int SymbFitPos; // "smoothed" peak position double *FreqPipe; // smoothing pipe for frequency offset dspCmpx *SymbPipe; // smoothing pipe for symbol shift int TrackPipeLen; // tracking pipe length int TrackPipePtr; // pipe pointer double AverFreq; // dspAveraged frequency dspCmpx AverSymb; // dspAveraged symbol dspPhase double SyncLockThres; // lock confidence threshold double SyncHoldThres; // minimal confidence to hold the lock int SyncLocked; // locked or not locked double SyncSymbConf; // current smoothed confidence double SyncFreqOfs; // current smoothed frequency offset double SyncFreqDev; // frequency deviation (dspRMS) double SyncSymbShift; // current smoothed symbol time shift // here starts the data decoder void DataProcess( dspCmpx *EvenSlice, dspCmpx *OddSlice, double FreqOfs, int TimeDist); int DataScanMargin; // +/- data carriers to scan for best FEC match int DataScanLen; // total number of data carriers being processed int DataScanFirst; dspCmpx *RefDataSlice; // reference data slice for differential dspPhase decode dspCmpx *DataVect; // differentially decoded data vactor int DataPipeLen; // pipe length int DataPipePtr; // wrapping pointer dspCmpx **DataPipe; // decoded vectors pipe double *DataPwrMid, *DataPwrOut; // carrier dspPower integrator dspCmpx *DataSqrMid, *DataSqrOut; // carrier complex square integrator double dW1, dW2, dW5; // integrator constants double *DatadspPhase; // differential decoded dspPhases double *DatadspPhase2; // rather for debugging, not use otherwise MT63decoder Decoder; } ; #endif // MT63_BASE_H fldigi-4.1.06/src/include/colorbox.h0000644000175000017500000000240313472115776014207 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef COLORBOX_H #define COLORBOX_H #include extern void loadPalette(); extern void savePalette(); extern void selectColor(int); extern void setColorButtons(); class colorbox : public Fl_Button { void draw(); public: colorbox(int x, int y, int w, int h, const char *label = 0) : Fl_Button(x,y,w,h,label) { Fl_Button::box(FL_DOWN_BOX); }; void end(){}; }; #endif fldigi-4.1.06/src/include/rigclass.h0000644000175000017500000000527513472115777014202 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _RIGCLASS_H #define _RIGCLASS_H #include #include #include class RigException : public std::exception { public: RigException(int e = 0) : err(e), msg(rigerror(e)) { } RigException(const char* m) : err(0), msg(m) { } RigException(const char* prefix, int e) : err(e), msg(std::string(prefix).append(": ").append(rigerror(e))) { } virtual ~RigException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: int err; std::string msg; }; class Rig { protected: RIG *rig; // Global ref. to the rig freq_t fnull; public: Rig(); Rig(rig_model_t rig_model); virtual ~Rig(); void init(rig_model_t rig_model); bool isOnLine() { return rig; } // This method open the communication port to the rig void open(void); // This method close the communication port to the rig void close(bool abort = false); void setFreq(freq_t freq, vfo_t vfo = RIG_VFO_CURR); freq_t getFreq(vfo_t vfo = RIG_VFO_CURR); bool canSetFreq(); bool canGetFreq(); void setMode(rmode_t, pbwidth_t width = RIG_PASSBAND_NORMAL, vfo_t vfo = RIG_VFO_CURR); rmode_t getMode(pbwidth_t&, vfo_t vfo = RIG_VFO_CURR); bool canSetMode(); bool canGetMode(); void setPTT (ptt_t ptt, vfo_t vfo = RIG_VFO_CURR); ptt_t getPTT (vfo_t vfo = RIG_VFO_CURR); bool canSetPTT(); bool canGetPTT(); void setVFO(vfo_t); vfo_t getVFO(); void setConf(token_t token, const char *val); void setConf(const char *name, const char *val); void getConf(token_t token, char *val); void getConf(const char *name, char *val); const char *getName(); const struct rig_caps* getCaps(void); token_t tokenLookup(const char *name); pbwidth_t passbandNormal (rmode_t mode); pbwidth_t passbandNarrow (rmode_t mode); pbwidth_t passbandWide (rmode_t mode); }; #endif fldigi-4.1.06/src/include/serial.h0000644000175000017500000001152313472115777013643 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SERIAL_H #define SERIAL_H #include void com_to_tty(std::string& port); void tty_to_com(std::string& port); #ifndef __MINGW32__ #include class Cserial { public: Cserial(); ~Cserial(); //Methods bool OpenPort(); bool IsOpen() { return fd < 0 ? 0 : 1; }; void ClosePort(); void Device (std::string dev) { device = dev;}; std::string Device() { return device;}; void Baud(int b) { baud = b;}; int Baud() { return baud;}; void Timeout(int tm) { timeout = tm;} int Timeout() { return timeout; } void Retries(int r) { retries = r;} int Retries() { return retries;} void RTS(bool r){rts = r;} bool RTS(){return rts;} void RTSptt(bool b){rtsptt = b;} bool RTSptt(){return rtsptt;} void DTR(bool d){dtr = d;} bool DTR(){return dtr;} void DTRptt(bool b){dtrptt = b;} bool DTRptt(){return dtrptt;} void RTSCTS(bool b){rtscts = b;} bool RTSCTS(){return rtscts;} void SetPTT(bool b); void RestoreTIO(bool b) { restore_tio = b; } bool RestoreTIO() { return restore_tio; } void Stopbits(int n) { stopbits = n; } int Stopbits() { return stopbits;} int ReadBuffer (unsigned char *b, int nbr); int WriteBuffer(unsigned char *str, int nbr); void FlushBuffer(); private: //Members std::string device; int fd; int baud; int speed; struct termios oldtio, newtio; int timeout; int retries; int status, origstatus; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int stopbits; //char bfr[2048]; //Methods bool IOselect(); }; #else //__MINGW32__ #include class Cserial { public: Cserial() { rts = dtr = false; rtsptt = dtrptt = false; rtscts = false; baud = CBR_9600; stopbits = 2; }; Cserial( std::string portname) { device = portname; Cserial(); // OpenPort(); }; virtual ~Cserial() {}; //Methods BOOL OpenPort(); void ClosePort(); BOOL ConfigurePort(DWORD BaudRate,BYTE ByteSize,DWORD fParity,BYTE Parity,BYTE StopBits); bool IsBusy() { return busyflag; }; void IsBusy(bool val) { busyflag = val; }; bool IsOpen() { return hComm == INVALID_HANDLE_VALUE ? 0 : 1; }; BOOL ReadByte(unsigned char &resp); int ReadData (unsigned char *b, int nbr); int ReadBuffer (unsigned char *b, int nbr) { return ReadData (b,nbr); } BOOL WriteByte(unsigned char bybyte); int WriteBuffer(unsigned char *str, int nbr); BOOL SetCommunicationTimeouts( DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant); BOOL SetCommTimeout(); void Timeout(int tm) { timeout = tm; return; }; int Timeout() { return timeout; }; void FlushBuffer(); void Device (std::string dev) { device = dev;}; std::string Device() { return device;}; void Baud(int b) { baud = b;}; int Baud() { return baud;}; void Retries(int r) { retries = r;} int Retries() { return retries;} void RTS(bool r){rts = r;} bool RTS(){return rts;} void RTSptt(bool b){rtsptt = b;} bool RTSptt(){return rtsptt;} void DTR(bool d){dtr = d;} bool DTR(){return dtr;} void DTRptt(bool b){dtrptt = b;} bool DTRptt(){return dtrptt;} void RTSCTS(bool b){rtscts = b;} bool RTSCTS(){return rtscts;} void SetPTT(bool b); void RestoreTIO(bool b) { restore_tio = b; } bool RestoreTIO() { return restore_tio; } void Stopbits(int n) { stopbits = n; } int Stopbits() { return stopbits;} //Members private: std::string device; //For use by CreateFile HANDLE hComm; //DCB Defined in WinBase.h DCB dcb; COMMTIMEOUTS CommTimeoutsSaved; COMMTIMEOUTS CommTimeouts; //Is the Port Ready? BOOL bPortReady; //Number of Bytes Written to port DWORD nBytesWritten; //Number of Bytes Read from port DWORD nBytesRead; //Number of bytes Transmitted in the cur session DWORD nBytesTxD; int timeout; bool busyflag; int baud; int retries; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int stopbits; }; #endif // __MINGW32__ #endif // SERIAL_H fldigi-4.1.06/src/include/FTextView.h0000644000175000017500000001250313472115776014247 00000000000000// ---------------------------------------------------------------------------- // FTextView.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FTextView_H_ #define FTextView_H_ #include #include #include #include #include #include #include "Fl_Text_Editor_mod.H" /// /// The text widgets base class. /// This class implements a basic text editing widget based on Fl_Text_Editor_mod. /// class FTextBase : public Fl_Text_Editor_mod { public: // CLICK_START: same as first clickable style // NATTR: number of styles (last style + 1) enum TEXT_ATTR { RECV, XMIT, CTRL, SKIP, ALTR, FSQ_TX, FSQ_DIR, FSQ_UND, CLICK_START, QSY = CLICK_START, /* FOO, BAR, ..., */ NATTR }; FTextBase(int x, int y, int w, int h, const char *l = 0); virtual ~FTextBase() { delete tbuf; delete sbuf; } #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR >= 3 virtual void add(unsigned int c, int attr = RECV); #else virtual void add(unsigned char c, int attr = RECV); #endif virtual void add(const char *text, int attr = RECV); void addstr(std::string text, int attr = RECV) { add(text.c_str(), attr); } void addchr(unsigned char c, int attr = RECV) { add(c, attr); } virtual int handle(int event); virtual void handle_context_menu(void) { } virtual void clear(void);//{ tbuf->text(""); sbuf->text(""); } void set_word_wrap(bool b, bool b2 = false); bool get_word_wrap(void) { return wrap; } virtual void setFont(Fl_Font f, int attr = NATTR); void setFontSize(int s, int attr = NATTR); void setFontColor(Fl_Color c, int attr = NATTR); // Override Fl_Text_Display, which stores the font number in an unsigned // character and therefore cannot represent all fonts Fl_Font textfont(void) { return styles[0].font; } void textfont(Fl_Font f) { setFont(f); } void textfont(uchar s) { textfont((Fl_Font)s); } void cursorON(void) { show_cursor(); } virtual void resize(int X, int Y, int W, int H); static bool wheight_mult_tsize(void *arg, int xd, int yd); protected: void set_style(int attr, Fl_Font f, int s, Fl_Color c, int set = SET_FONT | SET_SIZE | SET_COLOR); int readFile(const char* fn = 0); void saveFile(void); char* get_word(int x, int y, const char* nwchars = "", int n = 1, bool ontext = true); void init_context_menu(void); void show_context_menu(void); virtual void menu_cb(size_t item) { } int reset_wrap_col(void); void reset_styles(int set); private: FTextBase(); FTextBase(const FTextBase &t); protected: enum { FTEXT_DEF = 'A' }; enum set_style_op_e { SET_FONT = 1 << 0, SET_SIZE = 1 << 1, SET_COLOR = 1 << 2 }; Fl_Text_Buffer_mod *tbuf; ///< text buffer Fl_Text_Buffer_mod *sbuf; ///< style buffer Fl_Text_Display_mod::Style_Table_Entry styles[NATTR]; Fl_Menu_Item *context_menu; int popx, popy; bool wrap; int wrap_col; int max_lines; bool scroll_hint; bool restore_wrap; // bool wrap_restore; private: int oldw, oldh, olds; Fl_Font oldf; }; /// /// A TextBase subclass to display received & transmitted text /// class FTextView : public FTextBase { public: FTextView(int x, int y, int w, int h, const char *l = 0); ~FTextView() { } virtual int handle(int event); protected: enum { VIEW_MENU_COPY, VIEW_MENU_CLEAR, VIEW_MENU_SELECT_ALL, VIEW_MENU_SAVE, VIEW_MENU_WRAP }; virtual void handle_context_menu(void); virtual void menu_cb(size_t item); static void changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg); void change_keybindings(void); private: FTextView(); FTextView(const FTextView &t); protected: static Fl_Menu_Item menu[]; bool quick_entry; }; /// /// A FTextBase subclass to display and edit text to be transmitted /// class FTextEdit : public FTextBase { public: FTextEdit(int x, int y, int w, int h, const char *l = 0); virtual int handle(int event); protected: enum { EDIT_MENU_CUT, EDIT_MENU_COPY, EDIT_MENU_PASTE, EDIT_MENU_CLEAR, EDIT_MENU_READ, EDIT_MENU_WRAP }; virtual int handle_key(int key); int handle_key_ascii(int key); virtual int handle_dnd_drag(int pos); int handle_dnd_drop(void); virtual void handle_context_menu(void); virtual void menu_cb(size_t item); static void changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg); private: FTextEdit(); FTextEdit(const FTextEdit &t); protected: static Fl_Menu_Item menu[]; char ascii_cnt; unsigned ascii_chr; bool dnd_paste; }; #endif // FTextView_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/sound.h0000644000175000017500000002264513472115776013522 00000000000000// ---------------------------------------------------------------------------- // // sound.h // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SOUND_H #define _SOUND_H #include #include #include #if USE_SNDFILE # include #endif #include #define SCBLOCKSIZE 512 class SndException : public std::exception { public: SndException(int err_ = 0) : err(err_), msg(std::string("Sound error: ") + err_to_str(err_)) { } SndException(const char* msg_) : err(1), msg(msg_) { } SndException(int err_, const std::string& msg_) : err(err_), msg(msg_) { } virtual ~SndException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { return strerror(e); } int err; std::string msg; }; class SoundBase { protected: int sample_frequency; int txppm; int rxppm; // for interface to the samplerate resampling library SRC_STATE *tx_src_state; SRC_STATE *rx_src_state; double *wrt_buffer; #if USE_SNDFILE SNDFILE* ofCapture; SNDFILE* ifPlayback; SNDFILE* ofGenerate; // 2 channel writes SRC_STATE *writ_src_state_left; SRC_STATE *writ_src_state_right; SRC_DATA *writ_src_data_left; SRC_DATA *writ_src_data_right; float *src_write_buffer_left; float *src_write_buffer_right; // 1 channel reads SRC_STATE *play_src_state; SRC_DATA *play_src_data; float *src_rd_out_buffer; float *src_rd_inp_buffer; float *out_pointer; SF_INFO play_info; float modem_wr_sr; float modem_play_sr; bool new_playback; sf_count_t read_file(SNDFILE* file, float* buf, size_t count); void write_file(SNDFILE* file, float* buf_left, float *buf_right, size_t count); void write_file(SNDFILE* file, double* buf_left, double *buf_right, size_t count); bool format_supported(int format); void tag_file(SNDFILE *sndfile, const char *title); #endif bool capture; bool playback; bool generate; public: SoundBase(); virtual ~SoundBase(); virtual int Open(int mode, int freq = 8000) = 0; virtual void Close(unsigned dir = UINT_MAX) = 0; virtual void Abort(unsigned dir = UINT_MAX) = 0; virtual size_t Write(double *, size_t) = 0; virtual size_t Write_stereo(double *, double *, size_t) = 0; virtual size_t Read(float *, size_t) = 0; virtual void flush(unsigned dir = UINT_MAX) = 0; virtual bool must_close(int dir = 0) = 0; #if USE_SNDFILE void get_file_params(std::string def_fname, std::string &fname, int &format); int Capture(bool val); int Playback(bool val); int Generate(bool val); #endif }; #if USE_OSS class SoundOSS : public SoundBase { private: std::string device; int device_fd; int version; int capability_mask; int format_mask; int channels; int play_format; int mode; bool formatok; unsigned char *cbuff; SRC_DATA *rx_src_data; SRC_DATA *tx_src_data; float *snd_buffer; float *src_buffer; void getVersion(); void getCapabilities(); void getFormats(); void setfragsize(); void Channels(int); void Frequency(int); void Format(int); int BufferSize(int); bool wait_till_finished(); bool reset_device(); public: SoundOSS(const char *dev = "/dev/dsp"); ~SoundOSS(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX) { Close(dir); } size_t Write(double *, size_t); size_t Write_stereo(double *, double *, size_t); size_t Read(float *, size_t); bool must_close(int dir = 0) { return true; } void flush(unsigned dir = UINT_MAX) { wait_till_finished(); } private: int Fd() { return device_fd; } int Frequency() { return sample_frequency;}; int Version() {return version;}; int Capabilities() {return capability_mask;}; int Formats() { return format_mask;}; int Channels() { return channels;}; int Format() { return play_format;}; bool FormatOK() { return formatok;}; }; #endif // USE_OSS #if USE_PORTAUDIO # include # include # include # include # include "ringbuffer.h" class SoundPort : public SoundBase { public: typedef std::vector::const_iterator device_iterator; static void initialize(void); static void terminate(void); static const std::vector& devices(void); static void devices_info(std::string& in, std::string& out); static const std::vector& get_supported_rates(const std::string& name, unsigned dir); public: SoundPort(const char *in_dev, const char *out_dev); ~SoundPort(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX); size_t Write(double *buf, size_t count); size_t Write_stereo(double *bufleft, double *bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0); void flush(unsigned dir = UINT_MAX); private: void src_data_reset(unsigned dir); static long src_read_cb(void* arg, float** data); size_t resample_write(float* buf, size_t count); device_iterator name_to_device(std::string& name, unsigned dir); void init_stream(unsigned dir); void start_stream(unsigned dir); void pause_stream(unsigned dir); bool stream_active(unsigned dir); bool full_duplex_device(const PaDeviceInfo* dev); double find_srate(unsigned dir); static void probe_supported_rates(const device_iterator& idev); void pa_perror(int err, const char* str = 0); static void init_hostapi_ext(void); static PaStreamCallback stream_process; static PaStreamFinishedCallback stream_stopped; private: static bool pa_init; static std::vector devs; double req_sample_rate; float* fbuf; float* src_buffer; SRC_DATA *tx_src_data; enum { spa_continue = paContinue, spa_complete = paComplete, spa_abort = paAbort, spa_drain, spa_pause }; struct stream_data { std::string device; device_iterator idev; PaStream* stream; PaStreamParameters params; unsigned frames_per_buffer; double dev_sample_rate; double src_ratio; sem_t* rwsem; pthread_mutex_t* cmutex; pthread_cond_t* ccond; int state; ringbuffer* rb; size_t blocksize; size_t advance; } sd[2]; }; class SndPortException : public SndException { public: SndPortException(int err_ = 0) : SndException(err_, std::string("PortAudio error: ") + err_to_str(err_)) { } SndPortException(const char* msg_) : SndException(msg_) { } protected: const char* err_to_str(int e) { return Pa_GetErrorText(e); } }; #endif // USE_PORTAUDIO #if USE_PULSEAUDIO # include # include extern "C" { const char* pa_get_library_version(void); }; class SoundPulse : public SoundBase { public: SoundPulse(const char* dev); virtual ~SoundPulse(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX); size_t Write(double* buf, size_t count); size_t Write_stereo(double* bufleft, double* bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0) { return false; } void flush(unsigned dir = UINT_MAX); private: void src_data_reset(int mode); static long src_read_cb(void* arg, float** data); size_t resample_write(float* buf, size_t count); private: struct stream_data { pa_simple* stream; pa_sample_spec stream_params; pa_buffer_attr buffer_attrs; pa_stream_direction_t dir; double src_ratio; size_t blocksize; } sd[2]; SRC_DATA* tx_src_data; float* fbuf; float* rbuf; float* snd_buffer; float* src_buffer; }; class SndPulseException : public SndException { public: SndPulseException(int err_ = 0) : SndException(err_, std::string("PulseAudio error: ") + err_to_str(err_)) { } SndPulseException(const char* msg_) : SndException(msg_) { } protected: const char* err_to_str(int e) { return pa_strerror(e); } }; #endif // USE_PULSEAUDIO class SoundNull : public SoundBase { public: int Open(int mode, int freq = 8000) { sample_frequency = freq; return 0; } void Close(unsigned) { } void Abort(unsigned) { } size_t Write(double* buf, size_t count); size_t Write_stereo(double* bufleft, double* bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0) { return false; } void flush(unsigned) { } }; #endif // SOUND_H fldigi-4.1.06/src/include/psk_browser.h0000644000175000017500000000617513472115776014732 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PSK_BROWSER_H #define PSK_BROWSER_H #include #include #include #include #include #include #include "viewpsk.h" #include "globals.h" #include "charsetdistiller.h" #include "re.h" #define BWSR_BORDER 2 class pskBrowser : public Fl_Hold_Browser{ private: static std::string hilite_color_1; static std::string hilite_color_2; static std::string white; static std::string bkgnd[]; std::string fline; std::string nuline; std::string bwsrline[MAXCHANNELS]; int bwsrfreq[MAXCHANNELS]; struct {bool regex_alert; bool mycall_alert;} alerted[MAXCHANNELS]; CharsetDistiller *cdistiller; int labelwidth[VIEWER_LABEL_NTYPES]; Fl_Font fnt; Fl_Color HiLite_1; Fl_Color HiLite_2; Fl_Color BkSelect; Fl_Color Backgnd1; Fl_Color Backgnd2; int siz; int cols[2]; char szLine[32]; size_t nchars; size_t linechars[32]; public: static int cwidth; static int cheight; static int sbarwidth; long long rfc; bool usb; fre_t *seek_re; public: pskBrowser(int x, int y, int w, int h, const char *l = ""); ~pskBrowser(); void makecolors(); void evalcwidth(); void setfont(Fl_Font font, int sz) { fnt = font; siz = sz; evalcwidth();} void HighLight_1(Fl_Color clr) { HiLite_1 = clr; } Fl_Color HighLight_1() { return HiLite_1; } void HighLight_2(Fl_Color clr) { HiLite_2 = clr; } Fl_Color HighLight_2() { return HiLite_2; } void SelectColor(Fl_Color clr) { BkSelect = clr; } Fl_Color SelectColor() { return BkSelect; } void Background1(Fl_Color clr) { Backgnd1 = clr; } Fl_Color Background1() { return Backgnd1; } void Background2(Fl_Color clr) { Backgnd2 = clr; } Fl_Color Background2() { return Backgnd2; } void columns(int a) { cols[0] = a; cols[1] = 0; column_widths(cols); } void resize(int x, int y, int w, int h); void addchr(int ch, int freq, unsigned char c, int md, bool alert = false); std::string freqformat (int i); void set_freq(int i, int freq); void clearline(int i) { bwsrline[i] = ""; } std::string line(int i) { return (i < 1 ? "" : i > MAXCHANNELS ? "" : bwsrline[i - 1]); } int freq(int i); void clear(); void clearch(int n, int freq); void swap(int, int); int numchars() { return nchars; } void set_input_encoding(int encoding_id); }; #endif fldigi-4.1.06/src/include/strutil.h0000664000175000017500000002151613507402064014062 00000000000000// ---------------------------------------------------------------------------- // strutil.h // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef STRUTIL_H_ #define STRUTIL_H_ #include #include #include #include #include namespace join_ { template struct empty { bool operator()(const T& v) const { return false; }; }; template <> struct empty { bool operator()(const char* v) const { return !v || *v == '\0'; }; }; template <> struct empty { bool operator()(char* v) const { return !v || *v == '\0'; }; }; template <> struct empty { bool operator()(const wchar_t* v) const { return !v || *v == L'\0'; }; }; template <> struct empty { bool operator()(wchar_t* v) const { return !v || *v == L'\0'; }; }; template struct empty > { bool operator()(const std::basic_string& v) const { return v.empty(); }; }; template > class ostream_iterator : public std::iterator { public: typedef std::basic_ostream ostream_type; ostream_iterator(ostream_type& s, const CharT* sep = 0, bool ie = false) : stream(&s), join_string(sep), print_sep(false), ignore_empty(ie) { } ostream_iterator& operator=(const T& value) { if (!ignore_empty || !is_empty(value)) { if (print_sep) *stream << join_string; *stream << value; print_sep = true; } return *this; } ostream_iterator& operator*(void) { return *this; } ostream_iterator& operator++(void) { return *this; } ostream_iterator& operator++(int) { return *this; } private: ostream_type* stream; const CharT* join_string; bool print_sep, ignore_empty; empty is_empty; }; }; template std::basic_ostream& join(std::basic_ostream& stream, const T* begin, const T* end, const char* sep, bool ignore_empty = false) { std::copy(begin, end, join_::ostream_iterator(stream, sep, ignore_empty)); return stream; } template std::basic_ostream& join(std::basic_ostream& stream, const T* ptr, size_t len, const char* sep, bool ignore_empty = false) { join(stream, ptr, ptr + len, sep, ignore_empty); return stream; } template std::string join(const T* begin, const T* end, const char* sep, bool ignore_empty = false) { std::ostringstream stream; join(stream, begin, end, sep, ignore_empty); return stream.str(); } template std::string join(const T* ptr, size_t len, const char* sep, bool ignore_empty = false) { return join(ptr, ptr + len, sep, ignore_empty); } template std::basic_string join(const std::basic_string* begin, const std::basic_string* end, const char* sep, bool ignore_empty = false) { std::basic_ostringstream > stream; join >(stream, begin, end, sep, ignore_empty); return stream.str(); } template std::basic_string join(const std::basic_string* begin, size_t len, const char* sep, bool ignore_empty = false) { return join(begin, begin + len, sep, ignore_empty); } #include #include std::vector split(const char* re_str, const char* str, unsigned max_split = UINT_MAX); // Fills a string with snpritnf format string. std::string strformat( const char * fmt, ... ); // Eliminates spaces and tabs at the beginning and the end. void strtrim( std::string & str ); // First letter of each word in ucasestr, the rest in lowercase. void strcapitalize( std::string & str ); // Returns the replacement of all occurences of a given string by another. std::string strreplace( const std::string & inp, const std::string & from, const std::string & to ); /// Edit distance: Returns an integer which is the distance between the two strings. size_t levenshtein(const std::string & source, const std::string & target); // Conversion to ucasestr. std::string ucasestr( std::string str ); std::string ucasestr( const char *str); // find independent of case size_t ufind(std::string s1, std::string s2, size_t idx = 0); // ---------------------------------------------------------------------------- /// This is a read-only replacement for std::stringstream. struct imemstream : public std::streambuf, public std::istream { /// Faster than stringstream because no copy. imemstream(char* s, std::size_t n) : std::istream( this ) { setg(s, s, s + n); } /// Faster than stringstream because no copy. imemstream(const std::string & r) : std::istream( this ) { char * s = const_cast< char * >( r.c_str() ); setg(s, s, s + r.size()); } }; // ---------------------------------------------------------------------------- /// Tells if type is a char[]. Used for SFINAE. template< class T > struct DtTyp { /// In the general case, data types are not char arrays. struct Any {}; }; /// Matches if the type is a char[]. template< size_t N > struct DtTyp< char[N] > { struct Array {}; static const size_t Size = N ; }; /// Reads all chars until after the delimiter. bool read_until_delim( char delim, std::istream & istrm ); /// Reads a char followed by the delimiter. bool read_until_delim( char delim, std::istream & istrm, char & ref, const char dflt ); /// Reads a double up to the given delimiter. inline bool read_until_delim( char delim, std::istream & istrm, double & ref ) { istrm >> ref ; if( ! istrm ) return false ; char tmp = istrm.get(); if( istrm.eof() ) { /// Resets to good to mean that it worked fine. istrm.clear(); return true ; } return tmp == delim ; } /// Reads a string up to the given delimiter. inline bool read_until_delim( char delim, std::istream & istrm, std::string & ref ) { std::getline( istrm, ref, delim ); if ( (istrm.rdstate() & std::istream::goodbit) == 0 ) return true ; else return false ; } /// For reading from a string with tokens separated by a char. Used to load CSV files. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, typename DtTyp< Tp >::Any = typename DtTyp< Tp >::Any() ) { std::string parsed_str ; std::getline( istrm, parsed_str, delim ); if( ! ((istrm.rdstate() & std::istream::goodbit) == 0)) { return false ; } imemstream sstrm( parsed_str ); sstrm >> ref ; return true ; } /// Same, with a default value if there is nothing to read. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, const Tp dflt, typename DtTyp< Tp >::Any = typename DtTyp< Tp >::Any() ) { std::string parsed_str ; std::getline( istrm, parsed_str, delim ) ; if( ! ((istrm.rdstate() & std::istream::goodbit) == 0) ) { return false ; } if( parsed_str.empty() ) { ref = dflt ; return true; } imemstream sstrm( parsed_str ); sstrm >> ref ; return true ; } /// For reading from a string with tokens separated by a char to a fixed-size array. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, typename DtTyp< Tp >::Array = typename DtTyp< Tp >::Array() ) { istrm.getline( ref, DtTyp< Tp >::Size, delim ); // Should we return an error if buffer is too small? return( (istrm.rdstate() & std::istream::goodbit) == 0 ); } /// Same, with a default value if there is nothing to read. Fixed-size array. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, const Tp dflt, typename DtTyp< Tp >::Array = typename DtTyp< Tp >::Array() ) { istrm.getline( ref, DtTyp< Tp >::Size, delim ); // If nothing to read, copy the default value. if( ref[0] == '\0' ) { strncpy( ref, dflt, DtTyp< Tp >::Size - 1 ); } // Should we return an error if buffer is too small? return ((istrm.rdstate() & std::istream::goodbit) == 0 ); } // ---------------------------------------------------------------------------- #endif // STRUTIL_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/dxcc.h0000644000175000017500000000376013472115776013310 00000000000000// ---------------------------------------------------------------------------- // dxcc.h // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DXCC_H_ #define DXCC_H_ #include #include #include struct dxcc { const char* country; int cq_zone; int itu_zone; char continent[3]; float latitude; float longitude; float gmt_offset; dxcc(const char* cn = "", int cq = 0, int itu = 0, const char* ct = "", float lat = 0.0f, float lon = 0.0f, float tz = 0.0f); void print() { std::cout << country << ", " << cq_zone << ", " << itu_zone << ", " << continent << ", " << latitude << ", " << longitude << ", " << gmt_offset << "\n"; } }; enum qsl_t { QSL_LOTW, QSL_EQSL, QSL_END }; extern const char* qsl_names[]; bool dxcc_open(const char* filename); bool dxcc_is_open(void); void dxcc_close(void); const dxcc* dxcc_lookup(const char* callsign); const std::vector* dxcc_entity_list(void); extern std::string cbolist; bool qsl_open(const char* filename, qsl_t qsl_type); unsigned char qsl_is_open(void); void qsl_close(void); unsigned char qsl_lookup(const char* callsign); extern void reload_cty_dat(); extern void default_cty_dat_pathname(); extern void select_cty_dat_pathname(); #endif // DXCC_H_ fldigi-4.1.06/src/include/fl_lock.h0000644000175000017500000000534513472115776014001 00000000000000// ---------------------------------------------------------------------------- // fl_lock.h // // Copyright (C) 2007 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_LOCK_H_ #define FL_LOCK_H_ // disabled calls #define FL_LOCK_D(x) ((void)0) #define FL_UNLOCK_D(x) ((void)0) #define FL_AWAKE_D(x) ((void)0) // enabled calls #define FL_LOCK_E(x) FL_LOCK(x) #define FL_UNLOCK_E(x) FL_UNLOCK(x) #define FL_AWAKE_E(x) FL_AWAKE(x) #if !defined(NDEBUG) && !defined(NO_LOCKS) # include #endif #ifdef NDEBUG # define FL_LOCK(x) Fl::lock(x) # define FL_UNLOCK(x) Fl::unlock(x) # define FL_AWAKE(x) Fl::awake(x) #else // debugging # include # ifndef NO_LOCKS # include "debug.h" # define FL_LOCK(x) \ do { \ switch (GET_THREAD_ID()) { \ case TRX_TID: \ LOG_ERROR("trx lock"); \ break; \ case FLMAIN_TID: \ LOG_WARN("flrun lock"); \ break; \ default: \ LOG_VERBOSE("lock"); \ } \ pstack_maybe(); \ Fl::lock(x); \ } while (0); # define FL_UNLOCK(x) Fl::unlock(x) # define FL_AWAKE(x) Fl::awake(x) # else // no locks # define FL_LOCK(x) ((void)0) # define FL_UNLOCK(x) ((void)0) # define FL_AWAKE(x) ((void)0) # endif // NO_LOCKS #endif // NDEBUG #endif // FL_LOCK_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/qso_db.h0000644000175000017500000000765213472115776013642 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef QSO_DB #define QSO_DB #include #include #include #include "adif_def.h" using namespace std; enum COMPTYPE {COMPTIME, COMPDATE, COMPCALL, COMPFREQ, COMPMODE}; class cQsoDb; class cQsoRec; class cQsoRec { friend int compareCalls (const cQsoRec &, const cQsoRec &); friend int compareDates (const cQsoRec &, const cQsoRec &); friend int compareTimes (const cQsoRec &, const cQsoRec &); friend int compareModes (const cQsoRec &, const cQsoRec &); friend int compareFreqs (const cQsoRec &, const cQsoRec &); friend std::ostream &operator<<( std::ostream &, const cQsoRec &); friend std::istream &operator>>( std::istream &, cQsoRec & ); private: string *qsofield[NUMFIELDS]; //bool normal; // sort ordering public: cQsoRec (); ~cQsoRec (); void putField (int, const char *); void putField (int, const char *, int); void addtoField (int, const char *); const char *getField (int) const; void trimFields(); void clearRec (); int validRec(); void checkBand(); void checkDateTimes(); void setDateTime(bool dtOn); void setFrequency(long long freq); // operator overloads const cQsoRec &operator=(const cQsoRec &); bool operator==(const cQsoRec &) const; bool operator<(const cQsoRec &) const; bool operator!=(const cQsoRec &right) const { return !( *this == right); } bool operator<=(const cQsoRec &right) const { if (*this < right || *this == right) return true; return false; } bool operator>(const cQsoRec &right) const { return !(*this <= right); } }; class cQsoDb { private: cQsoRec * qsorec; int maxrecs; int nbrrecs; int dirty; static const int jdays[][13]; bool isleapyear( int y ) const; int dayofyear (int year, int mon, int mday); unsigned long epoch_dt (const char *szdate, const char *sztime); public: cQsoDb (); cQsoDb (cQsoDb *); ~cQsoDb (); static bool reverse; void deleteRecs(); void clearDatabase(); void isdirty(int n) {dirty = n;} int isdirty() const {return dirty;} void qsoNewRec (cQsoRec *); cQsoRec *newrec(); void qsoDelRec (int); void qsoUpdRec (int, cQsoRec *); int qsoFindRec (cQsoRec *); cQsoRec *getRec (int n) {return &qsorec[n];}; int nbrRecs () const {return nbrrecs;}; bool qsoIsValidFile(const char *); int qsoReadFile (const char *); int qsoWriteFile (const char *); void SortByDate(bool); void SortByCall (); void SortByMode (); void SortByFreq (); void sort_reverse(bool rev) { reverse = rev;} const cQsoRec *recarray() { return qsorec; } int duplicate( const char *callsign, const char *date = NULL, const char *time = NULL, unsigned int interval = 0, bool chkdatetime = false, const char *freq = NULL, bool chkfreq = false, const char *state = NULL, bool chkstate = false, const char *mode = NULL, bool chkmode = false, const char *xchg1 = NULL, bool chkxchg1 = false); int matched( cQsoRec *rec ); }; extern int comparebydate(const void *p1, const void *p2); extern int comparebymode(const void *p1, const void *p2); extern int comparebycall(const void *p1, const void *p2); extern int comparebyfreq(const void *p1, const void *p2); #endif fldigi-4.1.06/src/include/macroedit.h0000644000175000017500000000330413472115776014330 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MACROEDIT_H #define MACROEDIT_H #include #include #include #include #include #include #include #include "flinput2.h" extern void loadBrowser(Fl_Widget *widget); extern Fl_Button *btnMacroEditOK; extern Fl_Button *btnMacroEditCancel; extern Fl_Hold_Browser *macroDefs; extern Fl_Button *btnInsertMacro; extern Fl_Input2 *macrotext; extern Fl_Input2 *labeltext; extern Fl_Double_Window *MacroEditDialog; extern Fl_Double_Window* make_macroeditor(); enum { MACRO_EDIT_BUTTON, MACRO_EDIT_INPUT }; extern void editMacro(int b, int t = MACRO_EDIT_BUTTON, Fl_Input* in = 0); extern void update_macro_button(int iMacro, const char *text, const char *name); extern void update_macroedit_font(); #endif fldigi-4.1.06/src/include/outputencoder.h0000644000175000017500000000273113472115776015264 00000000000000// ---------------------------------------------------------------------------- // outputencoder.h -- output charset conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef OUTPUTENCODER_H #define OUTPUTENCODER_H #include #include class OutputEncoder { public: OutputEncoder(const int charset_out = TINICONV_CHARSET_UTF_8, unsigned int buffer_size = 32); ~OutputEncoder(void); void set_output_encoding(const int charset_out); void push(std::string s); const unsigned int pop(void); const unsigned int peek(void); private: unsigned int buffer_size; unsigned char *buffer; unsigned char *encoding_ptr; unsigned char *pop_ptr; //unsigned int data_length; tiniconv_ctx_s ctx; }; #endif fldigi-4.1.06/src/include/rigCAT.h0000644000175000017500000000232713472115776013476 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RIGCAT_H_ #define RIGCAT_H_ #ifndef RIGCATTEST # error FIXME: file should not have been included #endif #include #include #include #include #include extern Fl_Double_Window *window; extern char *homedir; extern string xmlfname; extern void MilliSleep(long msecs); #endif fldigi-4.1.06/src/include/FTextRXTX.h0000644000175000017500000001077413472115776014152 00000000000000// ---------------------------------------------------------------------------- // FTextView.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FTextRXTX_H_ #define FTextRXTX_H_ #include #include "FTextView.h" /// /// A TextBase subclass to display received & transmitted text /// class FTextRX : public FTextView { public: FTextRX(int x, int y, int w, int h, const char *l = 0); ~FTextRX(); virtual int handle(int event); #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR >= 3 virtual void add(unsigned int c, int attr = RECV); virtual void add(const char *s, int attr = RECV) { while (*s) add(*s++, attr); } #else virtual void add(unsigned char c, int attr = RECV); virtual void add(const char *s, int attr = RECV) { while (*s) add(*s++, attr); } #endif void set_all_entry(bool b); bool get_quick_entry(void) { return menu[RX_MENU_ALL_ENTRY].value(); } void set_scroll_hints(bool b); bool get_scroll_hints(void) { return menu[RX_MENU_SCROLL_HINTS].value(); } void mark(FTextBase::TEXT_ATTR attr = CLICK_START); void clear(void); void setFont(Fl_Font f, int attr = NATTR); protected: enum { RX_MENU_QRZ_THIS, RX_MENU_CALL, RX_MENU_NAME, RX_MENU_QTH, RX_MENU_STATE, RX_MENU_COUNTY, RX_MENU_PROVINCE, RX_MENU_COUNTRY, RX_MENU_LOC, RX_MENU_RST_IN, RX_MENU_RST_OUT, RX_MENU_XCHG, RX_MENU_SERIAL, RX_MENU_CLASS, RX_MENU_SECTION, RX_MENU_SS_SER, RX_MENU_SS_PRE, RX_MENU_SS_CHK, RX_MENU_SS_SEC, RX_MENU_CQZONE, RX_MENU_CQSTATE, RX_MENU_1010_NR, RX_MENU_AGE, RX_MENU_CHECK, RX_MENU_NAQP, RX_MENU_SCOUT, RX_MENU_TROOP, RX_MENU_POWER, RX_MENU_QSOP_STATE, RX_MENU_QSOP_COUNTY, RX_MENU_QSOP_SERNO, RX_MENU_QSOP_NAME, RX_MENU_QSOP_XCHG, RX_MENU_QSOP_CAT, RX_MENU_DIV, RX_MENU_COPY, RX_MENU_CLEAR, RX_MENU_SELECT_ALL, RX_MENU_SAVE, RX_MENU_WRAP, RX_MENU_ALL_ENTRY, RX_MENU_SCROLL_HINTS, RX_MENU_NUM_ITEMS }; int num_words; int handle_clickable(int x, int y); int handle_qso_data(int start, int end); void handle_qsy(int start, int end); void handle_context_menu(void); void menu_cb(size_t item); const char* dxcc_lookup_call(int x, int y); static void dxcc_tooltip(void* obj); private: FTextRX(); FTextRX(const FTextRX &t); protected: static Fl_Menu_Item menu[]; struct { bool enabled; float delay; } tooltips; }; /// /// A FTextBase subclass to display and edit text to be transmitted /// class FTextTX : public FTextEdit { public: FTextTX(int x, int y, int w, int h, const char *l = 0); virtual int handle(int event); void clear(void); void clear_sent(void); int nextChar(void); bool eot(void); void add_text(std::string s); void pause() { PauseBreak = true; } void setFont(Fl_Font f, int attr = NATTR); protected: enum { TX_MENU_TX, TX_MENU_RX, TX_MENU_ABORT, TX_MENU_MFSK16_IMG, TX_MENU_CUT, TX_MENU_COPY, TX_MENU_PASTE, TX_MENU_CLEAR, TX_MENU_READ, TX_MENU_WRAP }; int handle_key_shortcuts(int key); int handle_key(int key); int handle_key_macro(int key); int handle_dnd_drag(int pos); void handle_context_menu(void); void menu_cb(size_t item); void change_keybindings(void); static int kf_default(int c, Fl_Text_Editor_mod* e); static int kf_enter(int c, Fl_Text_Editor_mod* e); static int kf_delete(int c, Fl_Text_Editor_mod* e); static int kf_cut(int c, Fl_Text_Editor_mod* e); static int kf_paste(int c, Fl_Text_Editor_mod* e); private: FTextTX(); FTextTX(const FTextTX &t); protected: static Fl_Menu_Item menu[]; bool PauseBreak; int txpos; int utf8_txpos; static int *ptxpos; int bkspaces; }; #endif // FTextRXTX_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/include/wwv.h0000644000175000017500000000432213472115776013205 00000000000000// ---------------------------------------------------------------------------- // wwv.h -- wwv receive only modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _wwv_H #define _wwv_H //#include "complex.h" #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #define wwvSampleRate 8000 #define MaxSymLen 512 // lp filter #1 //#define DEC_1 40 #define DEC_1 8 #define FIRLEN_1 512 #define BW_1 20 // lp filter #2 #define DEC_2 5 #define FIRLEN_2 256 #define BW_2 100 // wwv function return status codes. #define wwv_SUCCESS 0 #define wwv_ERROR -1 class wwv : public modem { protected: double phaseacc; double phaseincr; int smpl_ctr; // sample counter for timing wwv rx double agc; // threshold for tick detection C_FIR_filter *hilbert; C_FIR_filter *lpfilter; Cmovavg *vidfilter; mbuffer buffer; // storage for 1000 samples/sec video unsigned int buffptr; int sync; int sync0; int ticks; int x1; int y1; int x2; int y2; bool calc; bool zoom; double keyshape[32]; // 4 msec rise and fall time for pulse double audio[400]; double quiet[400]; double play[400]; double nco(double freq); void makeshape(); void makeaudio(); public: wwv(); ~wwv(); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); void set1(int x, int y); void set2(int x, int y); }; #endif fldigi-4.1.06/src/include/log.h0000644000175000017500000000236613472115776013151 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _LOG_H #define _LOG_H #include #include class cLogfile { public: enum log_t { LOG_RX, LOG_TX, LOG_START, LOG_STOP }; private: FILE* logfile; bool retflag; log_t logtype; public: cLogfile(const std::string& fname); ~cLogfile(); void log_to_file(log_t type, const std::string& s); void log_to_file_start(); void log_to_file_stop(); }; #endif fldigi-4.1.06/src/include/pkg.h0000644000175000017500000000261113472115776013142 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PKG_H_ #define PKG_H_ #include #if BUILD_FLDIGI # define PACKAGE_AUTHORS FLDIGI_AUTHORS #else # define PACKAGE_AUTHORS FLARQ_AUTHORS # undef PACKAGE # define PACKAGE "flarq" # undef PACKAGE_NAME # define PACKAGE_NAME "flarq" # undef PACKAGE_TARNAME # define PACKAGE_TARNAME "flarq" # undef PACKAGE_VERSION # define PACKAGE_VERSION FLARQ_VERSION # undef PACKAGE_STRING # define PACKAGE_STRING PACKAGE_TARNAME " " PACKAGE_VERSION # undef VERSION # define VERSION PACKAGE_VERSION #endif #endif fldigi-4.1.06/src/include/logsupport.h0000664000175000017500000001000613507401434014562 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef LOG_SUPPORT_H #define LOG_SUPPORT_H #include #include #include #include "qso_db.h" #include "adif_io.h" #include "lgbook.h" #ifdef __WOE32__ # define ADIF_SUFFIX "adi" #else # define ADIF_SUFFIX "adif" #endif enum savetype {ADIF, CSV, TEXT, LOTW, LO}; enum logtype { LOG_QSO, // No Contest LOG_GENERIC, // Generic contest LOG_AIDX, // Africa International DX LOG_FD, // ARRL Field Day LOG_AICW, // ARRL International DX (Cw) LOG_JOTA, // ARRL Jamboree On The Air LOG_KD, // ARRL Kids Day LOG_ARR, // ARRL Rookie Roundup LOG_RTTY, // ARRL RTTY LOG_ASCR, // ARRL School Club Roundup LOG_CWSS, // ARRL November Sweepstakes LOG_WFD, // ARRL Winter Field Day LOG_BART, // BARTG RTTY contest LOG_CQ_WPX, // CQ WPX LOG_CQWW_DX, // CQ WW Dx LOG_CQWW_RTTY, // CQ WW RTTY LOG_IARI, // Italian ARI International DX LOG_NAQP, // North American QSO Party LOG_NAS, // North American Sprint LOG_1010, // Ten Ten LOG_VHF, // VHF // LOG_WAE, // Worked All Europe LOG_SQSO // State QSO parties }; extern cQsoDb qsodb; extern cAdifIO adifFile; extern std::string logbook_filename; extern std::string sDate_on; extern std::string sDate_off; extern std::string sTime_on; extern std::string sTime_off; extern void loadBrowser(bool keep_pos = false); extern void Export_log(); extern void cb_SortByCall(); extern void cb_SortByDate(); extern void cb_SortByMode(); extern void cb_SortByFreq(); extern void cb_browser(Fl_Widget *, void *); extern void cb_mnuNewLogbook(Fl_Menu_* m, void* d); extern void cb_mnuOpenLogbook(Fl_Menu_* m, void* d); extern void cb_mnuSaveLogbook(Fl_Menu_*m, void* d); extern void cb_mnuMergeADIF_log(Fl_Menu_* m, void* d); extern void cb_mnuExportADIF_log(Fl_Menu_* m, void* d); extern void cb_mnuExportCSV_log(Fl_Menu_* m, void* d); extern void cb_mnuExportTEXT_log(Fl_Menu_* m, void* d); extern string lotw_rec(cQsoRec &rec); extern void cb_btnExportLoTW(); extern Fl_Double_Window *lotw_review_dialog; extern void cb_review_lotw(); extern void cb_send_lotw(); extern void send_to_lotw(void *); extern void cb_btn_verify_lotw(Fl_Button *, void *); extern void cb_btn_verify_eqsl(Fl_Button *, void *); extern void cb_btn_view_unmatched(Fl_Button *, void *); extern void cb_Export_Cabrillo(Fl_Menu_* m, void* d); extern void cb_export_date_select(); extern void saveLogbook(bool force = false); extern void cb_mnuShowLogbook(Fl_Menu_ *m, void* d); extern void activateButtons(); extern void saveRecord (); extern void clearRecord (); extern void updateRecord (); extern void deleteRecord (); extern void AddRecord (); extern void DisplayRecord (int idxRec); extern void SearchLastQSO (const char *); extern cQsoRec* SearchLog(const char *callsign); extern void DupCheck(); extern void show_dup(void *); extern void cb_search(Fl_Widget* w, void*); extern int log_search_handler(int); extern void reload_browser(); extern void restore_sort(); extern void cb_doExport(); extern void WriteCabrillo(); extern void dxcc_entity_cache_enable(bool v); extern bool qsodb_dxcc_entity_find(const char* country); extern void adif_read_OK(); #endif fldigi-4.1.06/src/include/globals.h0000664000175000017500000001611213507402064013773 00000000000000// ---------------------------------------------------------------------------- // globals.h -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _GLOBALS_H #define _GLOBALS_H #include #include enum state_t { STATE_PAUSE = 0, STATE_RX, STATE_TX, STATE_RESTART, STATE_TUNE, STATE_ABORT, STATE_FLUSH, STATE_NOOP, STATE_EXIT, STATE_ENDED, STATE_IDLE, STATE_NEW_MODEM }; enum { MODE_PREV = -2, MODE_NEXT, MODE_NULL, MODE_CW, MODE_CONTESTIA, MODE_CONTESTIA_4_125, MODE_CONTESTIA_4_250, MODE_CONTESTIA_4_500, MODE_CONTESTIA_4_1000, MODE_CONTESTIA_4_2000, MODE_CONTESTIA_8_125, MODE_CONTESTIA_8_250, MODE_CONTESTIA_8_500, MODE_CONTESTIA_8_1000, MODE_CONTESTIA_8_2000, MODE_CONTESTIA_16_500, MODE_CONTESTIA_16_1000, MODE_CONTESTIA_16_2000, MODE_CONTESTIA_32_1000, MODE_CONTESTIA_32_2000, MODE_CONTESTIA_64_500, MODE_CONTESTIA_64_1000, MODE_CONTESTIA_64_2000, MODE_CONTESTIA_FIRST = MODE_CONTESTIA_4_125, MODE_CONTESTIA_LAST = MODE_CONTESTIA_64_2000, MODE_DOMINOEXMICRO, MODE_DOMINOEX4, MODE_DOMINOEX5, MODE_DOMINOEX8, MODE_DOMINOEX11, MODE_DOMINOEX16, MODE_DOMINOEX22, MODE_DOMINOEX44, MODE_DOMINOEX88, MODE_DOMINOEX_FIRST = MODE_DOMINOEX4, MODE_DOMINOEX_LAST = MODE_DOMINOEX88, MODE_FELDHELL, MODE_SLOWHELL, MODE_HELLX5, MODE_HELLX9, MODE_FSKHELL, MODE_FSKH105, MODE_HELL80, MODE_HELL_FIRST = MODE_FELDHELL, MODE_HELL_LAST = MODE_HELL80, MODE_MFSK8, MODE_MFSK16, MODE_MFSK32, MODE_MFSK4, MODE_MFSK11, MODE_MFSK22, MODE_MFSK31, MODE_MFSK64, MODE_MFSK128, MODE_MFSK64L, MODE_MFSK128L, MODE_MFSK_FIRST = MODE_MFSK8, MODE_MFSK_LAST = MODE_MFSK128L, MODE_WEFAX_576, MODE_WEFAX_288, MODE_WEFAX_FIRST = MODE_WEFAX_576, MODE_WEFAX_LAST = MODE_WEFAX_288, MODE_NAVTEX, MODE_SITORB, MODE_NAVTEX_FIRST = MODE_NAVTEX, MODE_NAVTEX_LAST = MODE_SITORB, MODE_MT63_500S, MODE_MT63_500L, MODE_MT63_1000S, MODE_MT63_1000L, MODE_MT63_2000S, MODE_MT63_2000L, MODE_MT63_FIRST = MODE_MT63_500S, MODE_MT63_LAST = MODE_MT63_2000L, MODE_PSK31, MODE_PSK63, MODE_PSK63F, MODE_PSK125, MODE_PSK250, MODE_PSK500, MODE_PSK1000, MODE_12X_PSK125, MODE_6X_PSK250, MODE_2X_PSK500, MODE_4X_PSK500, MODE_2X_PSK800, MODE_2X_PSK1000, MODE_PSK_FIRST = MODE_PSK31, MODE_PSK_LAST = MODE_2X_PSK1000, MODE_QPSK31, MODE_QPSK63, MODE_QPSK125, MODE_QPSK250, MODE_QPSK500, MODE_QPSK_FIRST = MODE_QPSK31, MODE_QPSK_LAST = MODE_QPSK500, MODE_8PSK125, MODE_8PSK125FL, MODE_8PSK125F, MODE_8PSK250, MODE_8PSK250FL, MODE_8PSK250F, MODE_8PSK500, MODE_8PSK500F, MODE_8PSK1000, MODE_8PSK1000F, MODE_8PSK1200F, MODE_8PSK_FIRST = MODE_8PSK125, MODE_8PSK_LAST = MODE_8PSK1200F, MODE_OLIVIA, MODE_OLIVIA_4_125, MODE_OLIVIA_4_250, MODE_OLIVIA_4_500, MODE_OLIVIA_4_1000, MODE_OLIVIA_4_2000, MODE_OLIVIA_8_125, MODE_OLIVIA_8_250, MODE_OLIVIA_8_500, MODE_OLIVIA_8_1000, MODE_OLIVIA_8_2000, MODE_OLIVIA_16_500, MODE_OLIVIA_16_1000, MODE_OLIVIA_16_2000, MODE_OLIVIA_32_1000, MODE_OLIVIA_32_2000, MODE_OLIVIA_64_500, MODE_OLIVIA_64_1000, MODE_OLIVIA_64_2000, MODE_OLIVIA_FIRST = MODE_OLIVIA, MODE_OLIVIA_LAST = MODE_OLIVIA_64_2000, MODE_RTTY, MODE_THORMICRO, MODE_THOR4, MODE_THOR5, MODE_THOR8, MODE_THOR11, MODE_THOR16, MODE_THOR22, MODE_THOR25x4, MODE_THOR50x1, MODE_THOR50x2, MODE_THOR100, MODE_THOR_FIRST = MODE_THOR4, MODE_THOR_LAST = MODE_THOR100, MODE_THROB1, MODE_THROB2, MODE_THROB4, MODE_THROBX1, MODE_THROBX2, MODE_THROBX4, MODE_THROB_FIRST = MODE_THROB1, MODE_THROB_LAST = MODE_THROBX4, // MODE_PACKET, // high speed && multiple carrier modes MODE_PSK125R, MODE_PSK250R, MODE_PSK500R, MODE_PSK1000R, MODE_4X_PSK63R, MODE_5X_PSK63R, MODE_10X_PSK63R, MODE_20X_PSK63R, MODE_32X_PSK63R, MODE_4X_PSK125R, MODE_5X_PSK125R, MODE_10X_PSK125R, MODE_12X_PSK125R, MODE_16X_PSK125R, MODE_2X_PSK250R, MODE_3X_PSK250R, MODE_5X_PSK250R, MODE_6X_PSK250R, MODE_7X_PSK250R, MODE_2X_PSK500R, MODE_3X_PSK500R, MODE_4X_PSK500R, MODE_2X_PSK800R, MODE_2X_PSK1000R, MODE_PSKR_FIRST = MODE_PSK125R, MODE_PSKR_LAST = MODE_2X_PSK1000R, MODE_FSQ, MODE_IFKP, MODE_SSB, MODE_WWV, MODE_ANALYSIS, NUM_MODES, NUM_RXTX_MODES = NUM_MODES - 2 }; typedef intptr_t trx_mode; struct mode_info_t { trx_mode mode; class modem **modem; const char *sname; const char *name; const char *pskmail_name; const char *adif_name; const char *export_mode; const char *export_submode; const char *vid_name; const unsigned int iface_io; // Some modes are not usable for a given interface. }; extern const struct mode_info_t mode_info[NUM_MODES]; class qrg_mode_t { public: long long rfcarrier; std::string rmode; int carrier; trx_mode mode; std::string usage; qrg_mode_t() : rfcarrier(0), rmode("NONE"), carrier(0), mode(NUM_MODES), usage("") { } qrg_mode_t(long long rfc_, std::string rm_, int c_, trx_mode m_, std::string use_ = "") : rfcarrier(rfc_), rmode(rm_), carrier(c_), mode(m_), usage(use_) { } bool operator<(const qrg_mode_t& rhs) const { return rfcarrier < rhs.rfcarrier; } bool operator==(const qrg_mode_t& rhs) const { return rfcarrier == rhs.rfcarrier && rmode == rhs.rmode && carrier == rhs.carrier && mode == rhs.mode; } std::string str(void); }; std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m); std::istream& operator>>(std::istream& s, qrg_mode_t& m); #include class mode_set_t : public std::bitset {}; enum band_t { BAND_160M, BAND_80M, BAND_75M, BAND_60M, BAND_40M, BAND_30M, BAND_20M, BAND_17M, BAND_15M, BAND_12M, BAND_10M, BAND_6M, BAND_4M, BAND_2M, BAND_125CM, BAND_70CM, BAND_33CM, BAND_23CM, BAND_13CM, BAND_9CM, BAND_6CM, BAND_3CM, BAND_125MM, BAND_6MM, BAND_4MM, BAND_2P5MM, BAND_2MM, BAND_1MM, BAND_OTHER, NUM_BANDS }; band_t band(long long freq_hz); band_t band(const char* freq_mhz); const char* band_name(band_t b); const char* band_name(const char* freq_mhz); const char* band_freq(band_t b); const char* band_freq(const char* band_name); // psk_browser enums enum { VIEWER_LABEL_OFF, VIEWER_LABEL_AF, VIEWER_LABEL_RF, VIEWER_LABEL_CH, VIEWER_LABEL_NTYPES }; extern std::string adif2export(std::string adif); extern std::string adif2submode(std::string adif); #endif fldigi-4.1.06/src/include/misc.h0000644000175000017500000000610113472115776013312 00000000000000// ---------------------------------------------------------------------------- // misc.h -- Miscellaneous helper functions // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MISC_H #define _MISC_H #include extern unsigned long hweight32(unsigned long w); extern unsigned short int hweight16(unsigned short int w); extern unsigned char hweight8(unsigned char w); extern int parity(unsigned long w); extern unsigned long rbits32(unsigned long w); extern unsigned short int rbits16(unsigned short int w); extern unsigned char rbits8(unsigned char w); extern unsigned int log2u(unsigned int x); extern unsigned char graydecode(unsigned char data); extern unsigned char grayencode(unsigned char data); extern void MilliSleep(long msecs); inline double sinc(double x) { return (fabs(x) < 1e-10) ? 1.0 : (sin(M_PI * x) / (M_PI * x)); } inline double cosc(double x) { return (fabs(x) < 1e-10) ? 0.0 : ((1.0 - cos(M_PI * x)) / (M_PI * x)); } inline double clamp(double x, double min, double max) { return (x < min) ? min : ((x > max) ? max : x); } /// This is always called with an int weight inline double decayavg(double average, double input, int weight) { if (weight <= 1) return input; return ( ( input - average ) / (double)weight ) + average ; } // following are defined inline to provide best performance inline double blackman(double x) { return (0.42 - 0.50 * cos(2 * M_PI * x) + 0.08 * cos(4 * M_PI * x)); } inline double hamming(double x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } inline double hanning(double x) { return 0.5 - 0.5 * cos(2 * M_PI * x); } inline double rcos( double t, double T, double alpha=1.0 ) { if( t == 0 ) return 1.0; double taT = T / (2.0 * alpha); if( fabs(t) == taT ) return ((alpha/2.0) * sin(M_PI/(2.0*alpha))); return (sin(M_PI*t/T)/(M_PI*t/T))*cos(alpha*M_PI*t/T)/(1.0-(t/taT)*(t/taT)); } // Rectangular - no pre filtering of data array void RectWindow(double *array, int n); // Hamming - used by gmfsk void HammingWindow(double *array, int n); // Hanning - used by winpsk void HanningWindow(double *array, int n); // Best lob suppression - least in band ripple void BlackmanWindow(double *array, int n); // Simple about effective as Hamming or Hanning void TriangularWindow(double *array, int n); #endif fldigi-4.1.06/src/include/charsetdistiller.h0000644000175000017500000000360313472115776015730 00000000000000// ---------------------------------------------------------------------------- // charsetdistiller.h -- input charset cleaning and conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef CHARSETDISTILLER_H #define CHARSETDISTILLER_H #include #include "tiniconv.h" class CharsetDistiller { public: CharsetDistiller(const int charset_in = TINICONV_CHARSET_UTF_8); int set_input_encoding(const int charset_in); void rx(const unsigned char c); void rx(const unsigned char *c); void flush(); void reset(void); void clear(void); int data_length(void); int num_chars(void); const std::string &data(void); private: void process_buffer(void); void shift_first_out(); unsigned char buf[6]; // input buffer unsigned char *bufptr; // points to the next unused byte in the buffer tiniconv_ctx_s ctx; // libtiniconv conversion state for input encoding -> UTF-8 tiniconv_ctx_s ctx1252; // libtiniconv conversion state for CP1252 -> UTF-8 std::string outdata; // valid data int nutf8; // number of UTF-8 characters in the output buffer }; #endif fldigi-4.1.06/src/include/compat.h0000644000175000017500000000417213472115776013650 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef COMPAT_H #define COMPAT_H /* adapted from compat.h in git-1.6.1.2 */ #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && !defined(_M_UNIX) # define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */ # define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */ #endif #define _ALL_SOURCE 1 #define _GNU_SOURCE 1 #define _BSD_SOURCE 1 #include #include #include #include #include #include #include #include #include #include #include #include #include // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #ifdef __MINGW32__ # if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 # undef dirent # include # else # include # endif #define WSA_MAJOR 2 #define WSA_MINOR 0 #else # include #endif #include #include #include #include #include "compat/mingw.h" #endif // MINGW32_H fldigi-4.1.06/src/include/spectrum_viewer.h0000644000175000017500000000264113472115777015610 00000000000000// ---------------------------------------------------------------------------- // spectrum_viewer.cxx -- spectrum dialog // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef SPECTRUM_VIEWER_H #define SPECTRUM_VIEWER_H #include #include #include #include "spectrum.h" #include "digiscope.h" //extern Digiscope *fftscope; extern spectrum *fftscope; extern Fl_Box *pause_label; extern Fl_Output *values; extern Fl_Output *db_diffs; extern Fl_Output *f_diffs; extern Fl_Double_Window *spectrum_viewer; extern void open_spectrum_viewer(); extern void close_spectrum_viewer(); extern void recenter_spectrum_viewer(); #endif fldigi-4.1.06/src/include/waterfall.h0000644000175000017500000001764313472115776014355 00000000000000// ---------------------------------------------------------------------------- // Waterfall Spectrum Analyzer Widget // Copyright (C) 2006-2010 Dave Freese, W1HKJ // Copyright (C) 2008 Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _WF_H #define _WF_H #include #include #include #include #include #include #include #include "gfft.h" #include "fldigi-config.h" #include "digiscope.h" #include "flslider2.h" enum { WF_FFT_RECTANGULAR, WF_FFT_BLACKMAN, WF_FFT_HAMMING, WF_FFT_HANNING, WF_FFT_TRIANGULAR }; #define FFT_LEN 8192 #define SC_SMPLRATE 8000 #define WFBLOCKSIZE 512 struct RGB { uchar R; uchar G; uchar B; }; struct RGBI { uchar R; uchar G; uchar B; uchar I; }; // you can change the basic fft processing type by a simple change in the // following typedef. change to float if you need to skimp on cpu cycles. typedef double wf_fft_type; typedef std::complex wf_cpx_type; extern RGBI mag2RGBI[256]; extern RGB palette[9]; enum WFmode { WATERFALL, SPECTRUM, SCOPE, NUM_WF_MODES }; #define MAG_1 1 #define MAG_2 2 #define MAG_4 3 enum WFspeed { PAUSE = 0, FAST = 1, NORMAL = 2, SLOW = 4 }; extern void do_qsy(bool); class WFdisp : public Fl_Widget { public: WFdisp (int x, int y, int w, int h, char *lbl = 0); ~WFdisp (); int wfmag(); int setMag(int m); void setOffset(int v); void Mode(WFmode M) { mode = M; } WFmode Mode() { return mode; } int cursorFreq(int xpos) { return (offset + step * xpos); } void Ampspan(double AmpSpn) { ampspan = (int)AmpSpn; } double Ampspan() { return ampspan; } void Bandwidth (int bw) { bandwidth = bw; makeMarker(); } int Bandwidth () { return bandwidth; } void Overload(int ovr) { if (overload == ovr) return; overload = ovr; } double AudioPeak() { return peakaudio; } WFspeed Speed() { return wfspeed;} void Speed(WFspeed rate) { wfspeed = rate;} int Mag() { return mag;} void Mag(int m) { setMag(m);} int Offset() { return offset;} void Offset(int v) { setOffset(v);} void initmaps(); void draw(); int handle(int event); void update_sigmap(); void update_waterfall(); void checkoffset(); void slew(int); void movetocenter(); void carrier(int cf); int carrier(); inline void makeNotch_(int notch_frequency); inline void makeMarker_(int width, const RGB* color, int freq, const RGB* clrMin, RGB* clrM, const RGB* clrMax); void makeMarker(); void process_analog(wf_fft_type *sig, int len); void processFFT(); void sig_data( double *sig, int sr); void handle_sig_data(); void rfcarrier(long long f) { rfc = f; } void USB(bool b) { usb = b; } bool USB() {return usb;}; long long rfcarrier() { return rfc;}; void updateMarker() { drawMarker();}; int peakFreq(int f0, int delta); double powerDensity(double f0, double bw); double powerDensityMaximum(int bw_nb, const int (*bw)[2]) const ; void setPrefilter(int v); void setcolors(); double dFreq() {return dfreq;} void redrawCursor(); void defaultColors(); private: int disp_width; int image_width; int scale_width; int RGBwidth; int RGBsize; int image_height; int image_area; int sig_image_area; int mag; int magset; WFmode mode; bool overload; bool usb; long long rfc; int offset; int sigoffset; int step; int carrierfreq; int bandwidth; int wfspdcnt; float dispcnt; float dispdec; int ampspan; double peakaudio; double dfreq; bool centercarrier; bool cursormoved; WFspeed wfspeed; int srate; RGBI *fft_img; RGB *markerimage; RGB RGBmarker; RGB RGBcursor; RGBI RGBInotch; double *fftwindow; uchar *scaleimage; uchar *fft_sig_img; uchar *sig_img; uchar *scline; wf_cpx_type *wfbuf; short int *fft_db; int ptrFFTbuff; double *circbuff; int ptrCB; wf_fft_type *pwr; g_fft *wfft; int prefilter; int checkMag(); void checkWidth(); void initMarkers(); void makeScale(); void drawScale(); void drawMarker(); int log2disp(int v); void drawcolorWF(); void drawgrayWF(); void drawspectrum(); void drawsignal(); protected: public: bool wantcursor; int cursorpos; int newcarrier; int oldcarrier; bool tmp_carrier; double Pwr(int i) { if ( i > 0 && i < IMAGE_WIDTH) return pwr[i]; return 0.0; } }; class waterfall: public Fl_Group { friend void x1_cb(Fl_Widget *w, void* v); friend void slew_left(Fl_Widget *w, void * v); friend void slew_right(Fl_Widget *w, void * v); friend void center_cb(Fl_Widget *w, void *v); friend void carrier_cb(Fl_Widget *w, void *v); friend void mode_cb(Fl_Widget *w, void *v); friend void set_wf_mode(void); friend void ampspan_cb(Fl_Widget *w, void *v); friend void qsy_cb(Fl_Widget *w, void *v); friend void rate_cb(Fl_Widget *w, void *v); friend void btnMem_cb(Fl_Widget *w, void *v); public: waterfall(int x, int y, int w, int h, char *lbl= 0); ~waterfall(){}; void show_scope(bool on); void opmode(); void sig_data(double *sig, int sr) { wfdisp->sig_data(sig, sr); } void handle_sig_data() {wfdisp->handle_sig_data();} void Overload(bool ovr) { wfdisp->Overload(ovr); } int carrier() { return wfdisp->carrier(); } void carrier(int f); void rfcarrier(long long cf); long long rfcarrier(); bool tmp_carrier(void) { return wfdisp->tmp_carrier; } void set_XmtRcvBtn(bool val); void USB(bool b); bool USB(); void Reverse( bool v) { reverse = v;} bool Reverse() { return reverse;} void xmtrcv_selection_color(Fl_Color clr) {xmtrcv->selection_color(clr);} void reverse_selection_color(Fl_Color clr) {btnRev->selection_color(clr);} void xmtlock_selection_color(Fl_Color clr) {xmtlock->selection_color(clr);} void Bandwidth(int bw) { wfdisp->Bandwidth(bw); } int peakFreq(int f0, int delta) { return (wfdisp->peakFreq(f0, delta)); } double powerDensity(double f0, double bw) { return (wfdisp->powerDensity(f0,bw)); } double powerDensityMaximum(int bw_nb, const int (*bw)[2]) const { return (wfdisp->powerDensityMaximum(bw_nb,bw)); } int Speed(); void Speed(int rate); int Mag(); void Mag(int m); int Offset(); void Offset(int v); int Carrier(); void Carrier(int f); void movetocenter() { wfdisp->movetocenter();} void redraw_marker() { wfdisp->makeMarker(); } void setPrefilter(int v) {wfdisp->setPrefilter(v);} void setcolors() { wfdisp->setcolors(); } void setRefLevel(); void setAmpSpan(); double dFreq() { return wfdisp->dFreq();} void setQSY(bool on) { if (on) qsy->activate(); else qsy->deactivate(); } double Pwr(int i) { return wfdisp->Pwr(i); } int handle(int event); void insert_text(bool check = false); enum { WF_NOP, WF_AFC_BW, WF_SIGNAL_SEARCH, WF_SQUELCH, WF_CARRIER, WF_MODEM, WF_SCROLL }; static const char* wf_wheel_action[7]; void handle_mouse_wheel(int what, int d); Fl_Button *btnRev; Fl_Counter2 *wfcarrier; Fl_Counter2 *wfRefLevel; Fl_Counter2 *wfAmpSpan; Fl_Light_Button *xmtrcv; Fl_Light_Button *xmtlock; Fl_Button *qsy; void UI_select(bool); Digiscope *wfscope; private: int wf_dim; WFdisp *wfdisp; Fl_Group *rs1; Fl_Button *mode; Fl_Button *x1; Fl_Button *left; Fl_Button *center; Fl_Button *right; Fl_Button *wfrate; Fl_Button *btnMem; Fl_Menu_Button *mbtnMem; int buttonrow; bool reverse; }; #endif fldigi-4.1.06/src/include/soundconf.h0000644000175000017500000000311713472115776014361 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 David Freese, W1HKJ // Copyright (C) 2015 Robert Stiles, KK5VD // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SOUNDCONF_H #define SOUNDCONF_H enum { SND_IDX_UNKNOWN = -1, SND_IDX_OSS, SND_IDX_PORT, SND_IDX_PULSE, SND_IDX_NULL, SND_IDX_END }; enum { FLDIGI_SRC_BEST, FLDIGI_SRC_MEDIUM, FLDIGI_SRC_FASTEST, #if !(defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)) FLDIGI_SRC_LINEAR, #endif FLDIGI_NUM_SRC }; enum { PA_DEV_NOT_FOUND = 0, PA_DEV_FOUND, PA_EXACT_DEV_FOUND }; extern int sample_rate_converters[FLDIGI_NUM_SRC]; void sound_init(void); void sound_close(void); void sound_update(unsigned idx); #include class Fl_Choice; int pa_set_dev(Fl_Choice *choice, std::string dev_name, int dev_index); extern std::string str_pa_devices; #endif // SOUNDCONF_H fldigi-4.1.06/src/include/progress.h0000644000175000017500000000336413472115776014233 00000000000000// // progress.h // // Progress bar widget routines. // // Based on Fl_Progress widget, Copyright 2000-2005 by Michael Sweet. // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _Progress_H_ # define _Progress_H_ // // Include necessary headers. // #include // // Progress class... // class Progress : public Fl_Widget { public: enum PTYPE {HORIZONTAL, VERTICAL}; private: double value_, minimum_, maximum_; PTYPE direction; protected: virtual void draw(); public: Progress(int x, int y, int w, int h, const char *l = 0); void type(PTYPE direc) { direction = direc;} void maximum(double v) { maximum_ = v; redraw(); } double maximum() const { return (maximum_); } void minimum(double v) { minimum_ = v; redraw(); } double minimum() const { return (minimum_); } void value(double v) { value_ = v; redraw(); } double value() const { return (value_); } }; #endif // !_Progress_H_ fldigi-4.1.06/src/include/estrings.h0000644000175000017500000000035513472115776014222 00000000000000#ifndef _WINERROR_STRINGS_H #define _WINERROR_STRINGS_H #ifdef __WIN32__ #include #include struct ESTRINGS { long ecode; std::string estring; }; extern std::string &win_error_string(long err); #endif #endif fldigi-4.1.06/src/include/psk.h0000644000175000017500000001206113472115776013156 00000000000000// ---------------------------------------------------------------------------- // psk.h -- psk modem // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _PSK_H #define _PSK_H #include "complex.h" #include "modem.h" #include "globals.h" #include "viterbi.h" #include "filters.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "viewpsk.h" #include "pskeval.h" #include "interleave.h" //MFSK varicode instead of psk for PSKR modes #include "mfskvaricode.h" //===================================================================== #define PipeLen (64) #define SNTHRESHOLD 6.0 #define AFCDECAYSLOW 8 #define NUM_FILTERS 4 #define MAX_CARRIERS 32 //===================================================================== class psk : public modem { private: // tx & rx int symbollen; int symbits; bool _qpsk; bool _pskr; bool _16psk; bool _8psk; bool _xpsk; bool _disablefec; bool _puncturing; int flushlength; double separation; double phaseacc[MAX_CARRIERS]; cmplx prevsymbol[MAX_CARRIERS]; unsigned int shreg; //FEC: 2nd stream unsigned int shreg2; int numinterleavers; //interleaver size (speed dependant) //double numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR int numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR double inter_carrier; // Frequency gap betweeb carriers // rx variables & functions C_FIR_filter *fir1[MAX_CARRIERS]; C_FIR_filter *fir2[MAX_CARRIERS]; double *fir1c; double *fir2c; Cmovavg *e0_filt; Cmovavg *e1_filt; Cmovavg *e2_filt; Cmovavg *e3_filt; bool displaysn; goertzel *re_Gbin[NUM_FILTERS]; goertzel *im_Gbin[NUM_FILTERS]; encoder *enc; viterbi *dec; //PSKR modes - 2nd Viterbi decoder and 2 receive de-interleaver for comparison viterbi *dec2; interleave *Rxinlv; interleave *Rxinlv2; interleave *Txinlv; unsigned int bitshreg; int rxbitstate; //PSKR modes - Soft decoding unsigned char symbolpair[2]; double fecmet; double fecmet2; bool vestigial; int sfft_size; sfft *vestigial_sfft; cmplx sfft_bins[11]; double phase; double freqerr; int bits; double bitclk; double syncbuf[16]; double scope_pipe[2*PipeLen];//[PipeLen]; unsigned int pipeptr; unsigned int dcdshreg; //PSKR modes - 2nd stream unsigned int dcdshreg2; int dcd; int dcdbits; cmplx quality; int acquire; int idepth; viewpsk* pskviewer; pskeval* evalpsk; void rx_symbol(cmplx symbol, int car); void rx_bit(int bit); void rx_bit2(int bit); void rx_qpsk(int bits); void rx_pskr(unsigned char symbol); double scopedata[16]; // IMD & s/n variables double k0, k1, k2; double I11, I12, I21, I22, I31, I32; double snratio, s2n, imdratio, imd; double afcmetric; //PSKR modes bool firstbit; bool startpreamble; //PSKR & 8PSK modes bool PSKviterbi; double vphase; double maxamp; //MULTI-CARRIER double sc_bw; // single carrier bandwidth // cmplx thirdorder; // tx variables & functions int accumulated_bits; //JD for multiple carriers int txsymbols[MAX_CARRIERS]; double *tx_shape; double *imd_shape; int preamble; void transmit(double *buf, int len); void tx_carriers(); void tx_symbol(int sym); void tx_bit(int bit); void tx_xpsk(int bit); void tx_char(unsigned char c); void tx_flush(); void update_syncscope(); void signalquality(); void findsignal(); void phaseafc(); void afc(); void coreafc(); void vestigial_afc(); void initSN_IMD(); void resetSN_IMD(); void calcSN_IMD(cmplx z); //PSKR modes - for Tx interleaver priming void clearbits(); protected: void s2nreport(void); public: psk(trx_mode mode); ~psk(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); void searchDown(); void searchUp(); bool viewer_mode(); void clear_viewer() { if (pskviewer) pskviewer->clear(); // if ((mode >= MODE_PSK31 && mode <= MODE_PSK125) || // (mode >= MODE_QPSK31 && mode <= MODE_QPSK125)) pskviewer->clear(); } void clear_ch(int n) { pskviewer->clearch(n); } int viewer_get_freq(int n) { if (pskviewer) pskviewer->get_freq(n); return 0; } }; #endif fldigi-4.1.06/src/include/flinput2.h0000644000175000017500000000241213472115777014124 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_INPUT2_ #define FL_INPUT2_ #include class Fl_Input2 : public Fl_Input { private: int ascii_cnt; // restart the numeric keypad entries. int ascii_chr; // character value of ASCII > 0x80 int handle_key_ascii(int key); char *utf8text; int utf8cnt; public: Fl_Input2(int x, int y, int w, int h, const char* l = 0); int handle(int event); }; #endif // FL_INPUT2_ fldigi-4.1.06/src/include/complex.h0000644000175000017500000000237713472115776014041 00000000000000// ---------------------------------------------------------------------------- // complex.h -- Complex arithmetic // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _COMPLEX_H #define _COMPLEX_H #include #include typedef std::complex cmplx; inline cmplx cmac (const cmplx *a, const cmplx *b, int ptr, int len) { cmplx z; ptr %= len; for (int i = 0; i < len; i++) { z += a[i] * b[ptr]; ptr = (ptr + 1) % len; } return z; } #endif fldigi-4.1.06/src/include/util.h0000644000175000017500000001577213472115776013352 00000000000000/* ----------------------------------------------------------------------------- * util.h -- included by config.h * * Copyright (C) 2007-2009 * Stelios Bounanos, M0GLD * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * ----------------------------------------------------------------------------- */ #ifndef UTIL_H #define UTIL_H // include the system defines #include "config.h" #ifdef __cplusplus extern "C" { #endif #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS 1 #endif #include #ifndef powerof2 # define powerof2(n) ((((n) - 1) & (n)) == 0) #endif #ifndef MAX # define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN # define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifndef CLAMP # define CLAMP(x, low, high) (((x)>(high))?(high):(((x)<(low))?(low):(x))) #endif #define WCLAMP(x, low, high) (((x)>(high))?(low):(((x)<(low))?(high):(x))) #ifdef __GNUC__ # if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) # define full_memory_barrier() __sync_synchronize() # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__x86_64__) # define full_memory_barrier() asm volatile ("lock; addl $0,0(%%esp)":::"memory") # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() /* These would be faster on SSE2-capable processors: # define full_memory_barrier() asm volatile ("mfence":::"memory") # define read_memory_barrier() asm volatile ("lfence":::"memory") # define write_memory_barrier() asm volatile ("sfence":::"memory") */ # elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) # define full_memory_barrier() asm volatile("sync":::"memory") # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # else # warning Memory barriers not defined on this system # define full_memory_barrier() ((void)0) # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # endif #else # warning Memory barriers not defined on this system # define full_memory_barrier() ((void)0) # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() #endif /* http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html */ #if defined(__GNUC__) && (__GNUC__ >= 3) # define likely(x) __builtin_expect (!!(x), 1) # define unlikely(x) __builtin_expect (!!(x), 0) # define used__ __attribute__ ((__used__)) # define unused__ __attribute__ ((__unused__)) # define must_check__ __attribute__ ((__warn_unused_result__)) # define deprecated__ __attribute__ ((__deprecated__)) # define noreturn__ __attribute__ ((__noreturn__)) # define pure__ __attribute__ ((__pure__)) # define const__ __attribute__ ((__const__)) # define malloc__ __attribute__ ((__malloc__)) # define packed__ __attribute__ ((__packed__)) # define inline__ inline __attribute__ ((__always_inline__)) # define noinline__ __attribute__ ((__noinline__)) # define nonnull__(x) __attribute__ ((__nonnull__(x))) # define format__(type_, index_, first_) __attribute__ ((format(type_, index_, first_))) #else # define likely(x) (x) # define unlikely(x) (x) # define used__ # define unused__ # define must_check__ # define deprecated__ # define noreturn__ # define pure__ # define const__ # define malloc__ # define packed__ # define inline__ # define noinline__ # define nonnull__(x) # define format__(type_, index_, first_) #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) # define hot__ __attribute__ ((__hot__)) # define cold__ __attribute__ ((__cold__)) #else # define hot__ # define cold__ #endif #include const__ uint32_t ceil2(uint32_t n); const__ uint32_t floor2(uint32_t n); #if !HAVE_STRNLEN size_t strnlen(const char* str, size_t len); #endif #if !HAVE_STRCASESTR char* strcasestr(const char* haystack, const char* needle); #endif #if !HAVE_STRLCPY size_t strlcpy(char* dest, const char* src, size_t size); #endif #if !HAVE_SETENV int setenv(const char *name, const char *value, int replace); #endif #if !HAVE_UNSETENV int unsetenv(const char *name); #endif int set_cloexec(int fd, unsigned char v); int set_nonblock(int fd, unsigned char v); int set_nodelay(int fd, unsigned char v); int get_bufsize(int fd, int dir, int* len); int set_bufsize(int fd, int dir, int len); unsigned long ver2int(const char* version); void save_signals(void); void restore_signals(void); void MilliSleep(long msecs); #ifdef __cplusplus } // extern "C" #endif #ifdef __cplusplus uint32_t simple_hash_data(const unsigned char* buf, size_t len, uint32_t code = 0); uint32_t simple_hash_str(const unsigned char* str, uint32_t code = 0); #endif #ifdef __cplusplus const char* str2hex(const unsigned char* str, size_t len); const char* str2hex(const char* str, size_t len = 0); #else const char* str2hex(const unsigned* str, size_t len); #endif const char* uint2bin(unsigned u, size_t len); #if 0 && !defined(NDEBUG) && defined(deprecated__) && defined(__GNUC__) && !defined(__MINGW32__) #include #include deprecated__ typeof(sprintf) sprintf; /* there are far too many of these in the qrz code deprecated__ typeof(strcpy) strcpy; deprecated__ typeof(strcat) strcat; */ #endif #ifdef __WOE32__ # define NOMINMAX 1 #endif # define PATH_SEP "/" /// Unnamed sempahores are not supported on OS X (and named semaphores are broken on cygwin). #ifdef __APPLE__ # define USE_NAMED_SEMAPHORES 1 #else # define USE_NAMED_SEMAPHORES 0 #endif /// Returns 0 if a process is running, 0 if not there and -1 if the test cannot be made. int test_process(int pid); /// Starts a process and returns its pid, and -1 if error. Returns 0 if this cannot be made. int fork_process( const char * cmd ); /// Returns NULL if no error. const char * create_directory( const char * dir ); int directory_is_created( const char * dir ); #endif /* UTIL_H */ /* Local Variables: mode: c++ c-file-style: "linux" End: */ fldigi-4.1.06/src/include/play.pa.h0000644000175000017500000000342413472115776013730 00000000000000// Pulse Audio header #ifndef PLAY_PA_H #define PLAY_PA_H #include #include #include #include #include #include #include #include #include #include #include #include "threads.h" #include "trx.h" class cPA_snd_exception : public std::exception { public: cPA_snd_exception(int err_ = 0) : err(err_), msg(std::string("Sound error: ") + err_to_str(err_)) { } cPA_snd_exception(const char* msg_) : err(1), msg(msg_) { } cPA_snd_exception(int err_, const std::string& msg_) : err(err_), msg(msg_) { } virtual ~cPA_snd_exception() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { return strerror(e); } int err; std::string msg; }; class cPA_exception : public cPA_snd_exception { public: cPA_exception(int err_ = 0) : cPA_snd_exception(err_, std::string("PortAudio error: ") + err_to_str(err_)) { } cPA_exception(const char* msg_) : cPA_snd_exception(msg_) { } protected: const char* err_to_str(int e) { return Pa_GetErrorText(e); } }; class c_portaudio { #define NUMSAMPLES 2048 #define SCRATE 8000 friend void process_alert(); private: int paError; float sndbuff[ 2 * NUMSAMPLES ]; int ptr; int sr; PaStream *stream; PaStreamParameters paStreamParameters; // sndfile interface SF_INFO playinfo; SNDFILE *playback; public: c_portaudio(); ~c_portaudio(); void open(int samplerate); void close(); void play_buffer(float *buffer, int len, int _sr); void play_sound(int *sndbuffer, int len, int _sr); void play_sound(float *sndbuffer, int len, int _sr); void silence(float secs, int _sr); void play_file(std::string fname); }; #endif fldigi-4.1.06/src/include/viterbi.h0000644000175000017500000000335013472115777014027 00000000000000// ---------------------------------------------------------------------------- // viterbi.h -- Viterbi decoder // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef VITERBI_H #define VITERBI_H #define PATHMEM 256 class viterbi { private: int _traceback; int _chunksize; int nstates; int *output; int outsize; int *metrics[PATHMEM]; int *history[PATHMEM]; int sequence[PATHMEM]; int mettab[2][256]; unsigned int ptr; int traceback(int *metric); int _k; int _poly1; int _poly2; public: viterbi(int k, int poly1, int poly2); ~viterbi(); void reset(); void init(); int settraceback(int trace); int setchunksize(int chunk); int decode(unsigned char *sym, int *metric); }; class encoder { private: int *output; unsigned int shreg; unsigned int shregmask; int _k; int _poly1; int _poly2; public: encoder(int k, int poly1, int poly2); ~encoder(); int encode(int bit); void init(void); }; #endif fldigi-4.1.06/src/include/dominoex.h0000664000175000017500000000734713507401434014204 00000000000000// ---------------------------------------------------------------------------- // dominoex.h -- DominoEX modem // // Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2006 // Hamish Moffatt (hamish@debian.org) // Copyright (C) 2006 // David Freese (w1hkj@w1hkj.com) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _DOMINOEX_H #define _DOMINOEX_H #include #include "complex.h" #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "dominovar.h" #include "mbuffer.h" // NASA coefficients for viterbi encode/decode algorithms #define NASA_K 7 #define POLY1 0x6d #define POLY2 0x4f //#include "mfskvaricode.h" #include "interleave.h" #include "viterbi.h" #define NUMTONES 18 #define MAXFFTS 8 #define BASEFREQ 1000.0 #define FIRSTIF 1500.0 #define SCOPESIZE 64 struct domrxpipe { cmplx vector[MAXFFTS * NUMTONES * 6]; }; class dominoex : public modem { public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH }; protected: // common variables double phase[MAXFFTS + 1]; double txphase; int symlen; int doublespaced; double tonespacing; int counter; unsigned int twosym; int paths; int numbins; bool slowcpu; int basetone; int lotone; int hitone; int extones; // rx variables C_FIR_filter *hilbert; sfft *binsfft[MAXFFTS]; fftfilt *fft; Cmovavg *vidfilter[SCOPESIZE]; Cmovavg *syncfilter; domrxpipe *pipe; unsigned int pipeptr; mbuffer scopedata; mbuffer videodata; cmplx currvector; int currsymbol; int prev1symbol; int prev2symbol; double met1; double met2; double sig; double noise; double s2n; int synccounter; unsigned char symbolbuf[MAX_VARICODE_LEN]; int symcounter; int symbolbit; bool filter_reset; bool staticburst; bool outofrange; // tx variables int txstate; int txprevtone; unsigned int bitshreg; std::string strSecXmtText; // FEC variables viterbi *MuPskDec; interleave *MuPskRxinlv; encoder *MuPskEnc; interleave *MuPskTxinlv; int Mu_bitstate; unsigned char Mu_symbolpair[2]; unsigned int Mu_datashreg; int Mu_symcounter; private: cmplx mixer(int n, cmplx in); void recvchar(int c); void decodesymbol(); void decodeDomino(int c); int harddecode(); void update_syncscope(); void synchronize(); void afc(); void reset_afc(); void eval_s2n(); void sendtone(int tone, int duration); void sendsymbol(int sym); void sendchar(unsigned char c, int secondary); void sendidle(); void sendsecondary(); void flushtx(); int get_secondary_char(); void reset_filters(); // MultiPsk FEC scheme // Rx unsigned int MuPskPriSecChar(unsigned int c); void decodeMuPskSymbol(unsigned char symbol); void decodeMuPskEX(int c); // Tx unsigned char MuPskSec2Pri(int c); void sendMuPskEX(unsigned char c, int secondary); void MuPskClearbits(); void MuPskFlushTx(); void MuPsk_sec2pri_init(void); public: dominoex (trx_mode md); ~dominoex (); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-4.1.06/src/include/counties.h0000644000175000017500000000411513472115776014213 00000000000000// ---------------------------------------------------------------------------- // states.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // Extracted from FIPS 2010 census data #ifndef _COUNTIES_H #define _COUNTIES_H #include #include using namespace std; struct STATE_COUNTY_QUAD { std::string state; // state long name std::string ST; // state abbreviated std::string county; // county long name std::string CTY; // county abbreviated }; class Cstates { private: size_t next; public: Cstates() {} ~Cstates(){} // static struct STATE_COUNTY_QUAD vec_SQSO[]; bool valid_county( string st, string cty ); const string names(); const string counties(string st); const string county(string st, string cnty); const string cnty_short(string st, string cnty); const string state(string ST); const string state_short(string ST); }; extern Cstates states; extern const std::string counties(); //extern const std::string six_qp_counties(); //extern const std::string seven_qp_counties(); extern void load_counties(); extern void save_counties(); extern std::vector vec_SQSO; extern std::vector vec_6QP; extern std::vector vec_7QP; extern const char *szSQSO; extern const char *sz7QP; extern const char *szNEQP; #endif fldigi-4.1.06/src/include/pskcoeff.h0000644000175000017500000000224113472115776014160 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _COEFF_H #define _COEFF_H #define FIRLEN 64 extern double gmfir1c[]; extern double gmfir2c[]; extern double pskcore_filter[]; extern double syncfilt[16]; extern void raisedcosfilt(double *, int len); extern void wsincfilt(double *, double fc, int len, bool blackman = true); #endif fldigi-4.1.06/src/include/fftfilt.h0000644000175000017500000000377113472115776014027 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _FFTFILT_H #define _FFTFILT_H #include "complex.h" #include "gfft.h" //---------------------------------------------------------------------- class fftfilt { enum {NONE, BLACKMAN, HAMMING, HANNING}; protected: int flen; int flen2; g_fft *fft; g_fft *ift; cmplx *ht; cmplx *filter; cmplx *timedata; cmplx *freqdata; cmplx *ovlbuf; cmplx *output; int inptr; int pass; int window; inline double fsinc(double fc, int i, int len) { return (i == len/2) ? 2.0 * fc: sin(2 * M_PI * fc * (i - len/2)) / (M_PI * (i - len/2)); } inline double _blackman(int i, int len) { return (0.42 - 0.50 * cos(2.0 * M_PI * i / len) + 0.08 * cos(4.0 * M_PI * i / len)); } void init_filter(); void clear_filter(); public: fftfilt(double f1, double f2, int len); fftfilt(double f, int len); ~fftfilt(); // f1 < f2 ==> bandpass // f1 > f2 ==> band reject void create_filter(double f1, double f2); void create_lpf(double f) { create_filter(0, f); } void create_hpf(double f) { create_filter(f, 0); } void rtty_filter(double); int run(const cmplx& in, cmplx **out); int flush_size(); }; #endif fldigi-4.1.06/src/include/ifkp.h0000644000175000017500000000763713472115776013327 00000000000000// ---------------------------------------------------------------------------- // ifkp.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _IFKP_H #define _IFKP_H #include #include "trx.h" #include "modem.h" #include "complex.h" #include "filters.h" #include "picture.h" #include class ifkp : public modem { #define IFKP_FFTSIZE 4096 #define IFKP_SYMLEN 4096 #define IFKP_BLOCK_SIZE IFKP_FFTSIZE #define IFKP_SHIFT_SIZE (IFKP_SYMLEN / 16) //#define IFKP_SR 8000 //16000 #define IFKP_SPACING 3 #define IFKP_OFFSET 1 #define IFKP_NUMBINS 151 // 3 bin spacing #define IMAGESPP 8 //16 , 12, 8 enum IFKP_STATE {TEXT, IMAGE_START, IMAGE_SYNC, IMAGE}; public: int symlen; protected: // Rx double rx_stream[IFKP_BLOCK_SIZE + IFKP_SHIFT_SIZE]; cmplx fft_data[2*IFKP_FFTSIZE]; double a_blackman[IFKP_BLOCK_SIZE]; C_FIR_filter *rxfilter; double tones[IFKP_NUMBINS]; Cmovavg *binfilt[IFKP_NUMBINS]; int movavg_size; int bkptr; g_fft *fft; Cmovavg *snfilt; double val; double max; double noise; double noisepower; int peak; int prev_peak; int last_peak; int peak_counter; int peak_hits; int symbol; int prev_symbol; int curr_nibble; int prev_nibble; int nibbles[199]; void process_symbol(int); void parse_pic(int); double s2n; char szestimate[40]; std::string station_calling; std::string rx_text; std::string toprint; std::string pic_str; IFKP_STATE state; // Tx // C_FIR_filter *xmtfilt; double baud; int tone; int prevtone; double txphase; bool send_bot; void transmit(double *buf, int len); void send_char (int); void send_idle (); void send_symbol(int sym); void send_tone(int tone); std::string xmt_string; double xmtdelay(); // RxTx int basetone; double metric; bool ch_sqlch_open; std::string mycall; void show_mode(); void process_tones(); bool valid_char(int); std::string heard_log_fname; std::string audit_log_fname; std::ofstream heard_log; std::ofstream audit_log; static std::string imageheader; static std::string avatarheader; public: //---- // virtual in base class ifkp (trx_mode md); ~ifkp (); void init (); void rx_init (); void rx_reset (); void restart (); void tx_init (); int rx_process (const double *buf, int len); int tx_process (); void set_freq(double); void init_nibbles(); //---- // support for ifkp image transfers private: double pixel; double sync; bool TX_IMAGE; bool TX_AVATAR; unsigned char tx_pixel; int tx_pixelnbr; int image_mode; bool b_ava; public: int byte; double picf; double picpeak; C_FIR_filter *picfilter; Cmovavg *pixfilter; Cmovavg *ampfilter; Cmovavg *syncfilter; double phidiff; double phase; cmplx prevz; cmplx currz; double image_freq[10]; int image_counter; int picW; int picH; int row; int col; int rgb; int pixelnbr; static int IMAGEspp; int TXspp; void recvpic(double smpl); void send_image(); void send_avatar(); void ifkp_send_avatar(); void m_ifkp_send_avatar(); void ifkp_send_image(std::string s = "", bool grey = false); void toggle_logs(); }; #endif fldigi-4.1.06/src/include/nls.h0000644000175000017500000000241613472115776013160 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NLS_H_ #define NLS_H_ #include "config.h" #include #include #include #if ENABLE_NLS && defined(__WOE32__) struct lang_def_t { const char* lang; const char* lang_region; const char* native_name; }; extern struct lang_def_t ui_langs[]; int get_ui_lang(const char* homedir = NULL); void set_ui_lang(int lang, const char* homedir = NULL); #endif #endif // NLS_H_ fldigi-4.1.06/src/include/metar.h0000664000175000017500000000605013507402064013460 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2019 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef METAR_H #define METAR_H #include "network.h" class Metar { Url url; std::string _wx_text_full; std::string _wx_text_parsed; std::string _metar_station; std::string _metar_text; std::string _station_name; std::string _field; std::string _conditions; std::string _temp; std::string _winds; std::string _baro; bool _inches; bool _mbars; bool _fahrenheit; bool _celsius; bool _mph; bool _kph; bool _condx; bool _name; bool _debug; public: Metar() { init(); } Metar(std::string _station) { init(); _metar_station = _station; } ~Metar() {} void init() { _metar_station.clear(); _metar_text.clear(); _wx_text_full.clear(); _wx_text_parsed.clear(); _station_name.clear(); _field.clear(); _conditions.clear(); _temp.clear(); _winds.clear(); _baro.clear(); _inches = _mbars = _fahrenheit = _celsius = _mph = _kph = _condx = _name = true; _debug = false; } void parse(); int get(); int get(std::string station) { _metar_station = station; return get(); } void station(std::string s) { _metar_station = s; } std::string station() { return _metar_station; } std::string station_name() { return _station_name; } std::string full() { return _wx_text_full; } std::string parsed() { return _wx_text_parsed; } void params( bool inches, bool mbars, bool fahrenheit, bool celsius, bool mph, bool kph, bool condx, bool name) { _inches = inches; _mbars = mbars; _fahrenheit= fahrenheit; _celsius = celsius; _mph = mph; _kph = kph; _condx = condx; _name = name; } void inches(bool b) { _inches = b; } bool inches() { return _inches; } void mbars(bool b) { _mbars = b; } bool mbars() { return _mbars; } void fahrenheit(bool b) { _fahrenheit = b; } bool fahrenheit() { return _fahrenheit; } void celsius(bool b) { _celsius = b; } bool celsius() { return _celsius; } void mph(bool b) { _mph = b; } bool mph() { return _mph; } void kph(bool b) { _kph = b; } bool kph() { return _kph; } void condx(bool b) { _condx = b; } bool condx() { return _condx; } void name(bool b) { _name = b; } bool name() { return _name; } void debug(bool on) { };//_debug = on; url.debug(on); } }; #endif //METAR_H fldigi-4.1.06/src/include/fldigi-config.h0000644000175000017500000000573513472115776015074 00000000000000// ---------------------------------------------------------------------------- // fldigi-config.h -- user configuration items for fldigi // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef FLDIGI_CONFIG_H #define FLDIGI_CONFIG_H //============================================================================= // You can change the x1 width of the waterfall / spectrum display by modifying this // constant. // Suggest that you make the value a multiple of 100. // DO NOT EXCEED 4000 // The larger the number the greater the cpu load will be for creating the // waterfall display // // Setting the DEFAULT_IMAGE_WIDTH to 3200 will size the x1 waterfall to be // 800 pixels wide. The x1 waterfall size is always DEFAULT_IMAGE_WIDTH / 4 // and the minimum width of main display would then be // // DEFAULT_IMAGE_WIDTH / 4 + 2 * BEZEL + 2 * DEFAULT_SW // // where BEZEL is set to 2 (border around the waterfall), and // DEFAULT_SW is the width of the signal level and squelch controls #define DEFAULT_IMAGE_WIDTH 3000 //============================================================================= // widget sizes internal to the waterfall widget #define BEZEL 2 #define WFTEXT 10 #define WFSCALE 10 #define WFMARKER 6 #define BTN_HEIGHT 20 #define DEFAULT_SW 16 //#define DEFAULT_HWFALL 144 #define DEFAULT_HWFALL 124 //#define DEFAULT_HNOM 500 #define WMIN 800 #define HMIN 460 //#define Wwfall (DEFAULT_HNOM + 2 * BEZEL) //#define DEFAULT_WNOM (Wwfall + 2* DEFAULT_SW) //#define EMC_HWFALL 144 //#define EMC_HNOM 500 //#define EMC_WNOM (500 + 2 * DEFAULT_SW + 2 * BEZEL) extern int IMAGE_WIDTH; extern int Hwfall; extern int HNOM; extern int WNOM; extern int Wwfall; extern int Haqsoframe; extern int Hmenu; extern int Hstatus; extern int Hmacros; //#define Htext (DEFAULT_HNOM - 4 - Hwfall - Hmenu - Hstatus - Hmacros - Hqsoframe) //#define Hrcvtxt (Htext) / 2 //#define Hxmttxt (Htext - (Hrcvtxt)) #define Wmode 110 #define Ws2n 110 #define Wimd 110 #define Wwarn 16 #define bwTxLevel 120 #define bwAfcOnOff 60 #define bwSqlOnOff 60 #define bwPwrSqlOnOff 60 #define Wstatus (WNOM - Wmode - Ws2n - Wimd - bwAfcOnOff - bwSqlOnOff - bwPwrSqlOnOff - Wwarn) #define SCOPEWIN_MIN_WIDTH 48 #define SCOPEWIN_MIN_HEIGHT 48 #endif // FLDIGI_CONFIG_H fldigi-4.1.06/src/include/synop.h0000644000175000017500000000570113472115777013535 00000000000000// ---------------------------------------------------------------------------- // synop.h -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SYNOP_H #define _SYNOP_H // This tells how Synop data are serialized. class synop_callback { public: virtual ~synop_callback() {} ; // These methods could as well be pure virtual. virtual bool interleaved(void) const { return true; } virtual void print( const char * str, size_t nb, bool ) const = 0; virtual bool log_adif(void) const = 0; virtual bool log_kml(void) const = 0 ; }; // Implementation hidden in synop.cxx class synop { // When set, the output does not contain Synop sentences but only // the name of the regular expression which matched. It helps // for debugging because the output is independent of the locale. static bool m_test_mode ; public: static const synop_callback * ptr_callback ; template< class Callback > static void setup() { static const Callback cstCall = Callback(); ptr_callback = &cstCall ; }; static synop * instance(); static void regex_usage(void); virtual ~synop() {}; // It is used as a global object, the constructor does not do anything. virtual void init() = 0; virtual void cleanup() = 0; /// We should have a tempo as well. virtual void add(char c) = 0; // When Synop decoding is disabled. virtual void flush(bool finish_decoding) = 0; virtual bool enabled(void) const = 0; static bool GetTestMode(void) { return m_test_mode ; }; static void SetTestMode(bool test_mode) { m_test_mode = test_mode ; }; }; // gathers the various data files used for Synop decoding. struct SynopDB { // Loads the files from s given directory. static bool Init( const std::string & data_dir ); // For testing purpose. static const std::string & IndicatorToName( int wmo_indicator ); static const std::string IndicatorToCoordinates( int wmo_indicator ); // To Test the reading of our weather stations data files. static const std::string & BuoyToName( const char * buoy_id ); static const std::string & ShipToName( const char * ship_id ); static const std::string & JCommToName( const char * ship_id ); }; // ---------------------------------------------------------------------------- #endif // _SYNOP_H fldigi-4.1.06/src/include/Fl_Text_Display_mod.H0000644000175000017500000004170413472115776016220 00000000000000// // "$Id: Fl_Text_Display_mod.H 8306 2011-01-24 17:04:22Z matt $" // // Header file for Fl_Text_Display_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Display_mod widget . */ #ifndef Fl_Text_Display_mod_H #define Fl_Text_Display_mod_H #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" /** \brief Rich text display widget. This is the FLTK text display widget. It allows the user to view multiple lines of text and supports highlighting and scrolling. The buffer that is displayed in the widget is managed by the Fl_Text_Buffer_mod class. A single Text Buffer can be displayed by multiple Text Displays. */ class FL_EXPORT Fl_Text_Display_mod: public Fl_Group { public: /** text display cursor shapes enumeration */ enum { NORMAL_CURSOR, /**< I-beam */ CARET_CURSOR, /**< caret under the text */ DIM_CURSOR, /**< dim I-beam */ BLOCK_CURSOR, /**< unfille box under the current character */ HEAVY_CURSOR /**< thick I-beam */ }; /** the character position is the left edge of a character, whereas the cursor is thought to be between the centers of two consecutive characters. */ enum { CURSOR_POS, CHARACTER_POS }; /** drag types - they match Fl::event_clicks() so that single clicking to start a collection selects by character, double clicking selects by word and triple clicking selects by line. */ enum { DRAG_NONE = -2, DRAG_START_DND = -1, DRAG_CHAR = 0, DRAG_WORD = 1, DRAG_LINE = 2 }; /** wrap types - used in wrap_mode() */ enum { WRAP_NONE, /**< don't wrap text at all */ WRAP_AT_COLUMN, /**< wrap text at the given text column */ WRAP_AT_PIXEL, /**< wrap text at a pixel position */ WRAP_AT_BOUNDS /**< wrap text so that it fits into the widget width */ }; friend void fl_text_drag_me(int pos, Fl_Text_Display_mod* d); typedef void (*Unfinished_Style_Cb)(int, void *); /** This structure associates the color, font, andsize of a string to draw with an attribute mask matching attr */ struct Style_Table_Entry { Fl_Color color; Fl_Font font; Fl_Fontsize size; unsigned attr; }; Fl_Text_Display_mod(int X, int Y, int W, int H, const char *l = 0); ~Fl_Text_Display_mod(); virtual int handle(int e); void buffer(Fl_Text_Buffer_mod* buf); /** Sets the current text buffer associated with the text widget. Multiple text widgets can be associated with the same text buffer. \param buf new text buffer */ void buffer(Fl_Text_Buffer_mod& buf) { buffer(&buf); } /** Gets the current text buffer associated with the text widget. Multiple text widgets can be associated with the same text buffer. \return current text buffer */ Fl_Text_Buffer_mod* buffer() const { return mBuffer; } void redisplay_range(int start, int end); void scroll(int topLineNum, int horizOffset); void insert(const char* text); void overstrike(const char* text); void insert_position(int newPos); /** Gets the position of the text insertion cursor for text display. \return insert position index into text buffer */ int insert_position() const { return mCursorPos; } int position_to_xy(int pos, int* x, int* y) const; int in_selection(int x, int y) const; void show_insert_position(); int move_right(); int move_left(); int move_up(); int move_down(); int count_lines(int start, int end, bool start_pos_is_line_start) const; int line_start(int pos) const; int line_end(int startPos, bool startPosIsLineStart) const; int skip_lines(int startPos, int nLines, bool startPosIsLineStart); int rewind_lines(int startPos, int nLines); void next_word(void); void previous_word(void); void show_cursor(int b = 1); /** Hides the text cursor. */ void hide_cursor() { show_cursor(0); } void cursor_style(int style); /** Gets the text cursor color. \return cursor color */ Fl_Color cursor_color() const {return mCursor_color;} /** Sets the text cursor color. \param n new cursor color */ void cursor_color(Fl_Color n) {mCursor_color = n;} /** Gets the width/height of the scrollbars. /return width of scrollbars */ int scrollbar_width() const { return scrollbar_width_; } /** Sets the width/height of the scrollbars. \param W width of scrollbars */ void scrollbar_width(int W) { scrollbar_width_ = W; } /** Gets the scrollbar alignment type. \return scrollbar alignment */ Fl_Align scrollbar_align() const { return scrollbar_align_; } /** Sets the scrollbar alignment type. \param a new scrollbar alignment */ void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; } /** Moves the insert position to the beginning of the current word. \param pos start calculation at this index \return beginning of the words */ int word_start(int pos) const { return buffer()->word_start(pos); } /** Moves the insert position to the end of the current word. \param pos start calculation at this index \return index of first character after the end of the word */ int word_end(int pos) const { return buffer()->word_end(pos); } void highlight_data(Fl_Text_Buffer_mod *styleBuffer, const Style_Table_Entry *styleTable, int nStyles, char unfinishedStyle, Unfinished_Style_Cb unfinishedHighlightCB, void *cbArg); int position_style(int lineStartPos, int lineLen, int lineIndex) const; /** \todo FIXME : get set methods pointing on shortcut_ have no effects as shortcut_ is unused in this class and derived! \return the current shortcut key */ int shortcut() const {return shortcut_;} /** \todo FIXME : get set methods pointing on shortcut_ have no effects as shortcut_ is unused in this class and derived! \param s the new shortcut key */ void shortcut(int s) {shortcut_ = s;} /** Gets the default font used when drawing text in the widget. \return current text font face unless overridden by a style */ Fl_Font textfont() const {return textfont_;} /** Sets the default font used when drawing text in the widget. \param s default text font face */ void textfont(Fl_Font s) {textfont_ = s; mColumnScale = 0;} /** Gets the default size of text in the widget. \return current text height unless overridden by a style */ Fl_Fontsize textsize() const {return textsize_;} /** Sets the default size of text in the widget. \param s new text size */ void textsize(Fl_Fontsize s) {textsize_ = s; mColumnScale = 0;} /** Gets the default color of text in the widget. \return text color unless overridden by a style */ Fl_Color textcolor() const {return textcolor_;} /** Sets the default color of text in the widget. \param n new text color */ void textcolor(Fl_Color n) {textcolor_ = n;} int wrapped_column(int row, int column) const; int wrapped_row(int row) const; void wrap_mode(int wrap, int wrap_margin); virtual void resize(int X, int Y, int W, int H); /** Convert an x pixel position into a column number. \param x number of pixels from the left margin \return an approximate column number based on the main font */ double x_to_col(double x) const; /** Convert a column number into an x pixel position. \param col an approximate column number based on the main font \return number of pixels from the left margin to the left of an average sized character */ double col_to_x(double col) const; protected: // Most (all?) of this stuff should only be called from resize() or // draw(). // Anything with "vline" indicates thats it deals with currently // visible lines. virtual void draw(); void draw_text(int X, int Y, int W, int H); void draw_range(int start, int end); void draw_cursor(int, int); void draw_string(int style, int x, int y, int toX, const char *string, int nChars) const; void draw_vline(int visLineNum, int leftClip, int rightClip, int leftCharIndex, int rightCharIndex); int find_x(const char *s, int len, int style, int x) const; enum { DRAW_LINE, FIND_INDEX, FIND_INDEX_FROM_ZERO, GET_WIDTH }; int handle_vline(int mode, int lineStart, int lineLen, int leftChar, int rightChar, int topClip, int bottomClip, int leftClip, int rightClip) const; void draw_line_numbers(bool clearAll); void clear_rect(int style, int x, int y, int width, int height) const; void display_insert(); void offset_line_starts(int newTopLineNum); void calc_line_starts(int startLine, int endLine); void update_line_starts(int pos, int charsInserted, int charsDeleted, int linesInserted, int linesDeleted, int *scrolled); void calc_last_char(); int position_to_line( int pos, int* lineNum ) const; double string_width(const char* string, int length, int style) const; static void scroll_timer_cb(void*); static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg); static void buffer_modified_cb(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display_mod* d); static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display_mod* d); void update_v_scrollbar(); void update_h_scrollbar(); int measure_vline(int visLineNum) const; int longest_vline() const; int empty_vlines() const; int vline_length(int visLineNum) const; int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const; void xy_to_rowcol(int x, int y, int* row, int* column, int PosType = CHARACTER_POS) const; void maintain_absolute_top_line_number(int state); int get_absolute_top_line_number() const; void absolute_top_line_number(int oldFirstChar); int maintaining_absolute_top_line_number() const; void reset_absolute_top_line_number(); int position_to_linecol(int pos, int* lineNum, int* column) const; int scroll_(int topLineNum, int horizOffset); void extend_range_for_styles(int* start, int* end); void find_wrap_range(const char *deletedText, int pos, int nInserted, int nDeleted, int *modRangeStart, int *modRangeEnd, int *linesInserted, int *linesDeleted); void measure_deleted_lines(int pos, int nDeleted); void wrapped_line_counter(Fl_Text_Buffer_mod *buf, int startPos, int maxPos, int maxLines, bool startPosIsLineStart, int styleBufOffset, int *retPos, int *retLines, int *retLineStart, int *retLineEnd, bool countLastLineMissingNewLine = true) const; void find_line_end(int pos, bool start_pos_is_text_start, int *lineEnd, int *nextLineStart) const; double measure_proportional_character(const char *s, int colNum, int pos) const; int wrap_uses_character(int lineEndPos) const; static const int DEFAULT_TOP_MARGIN; static const int DEFAULT_BOTTOM_MARGIN; static const int DEFAULT_LEFT_MARGIN; static const int DEFAULT_RIGHT_MARGIN; int TOP_MARGIN, BOTTOM_MARGIN, LEFT_MARGIN, RIGHT_MARGIN; int damage_range1_start, damage_range1_end; int damage_range2_start, damage_range2_end; int mCursorPos; int mCursorOn; int mCursorOldY; /* Y pos. of cursor for blanking */ int mCursorToHint; /* Tells the buffer modified callback where to move the cursor, to reduce the number of redraw calls */ int mCursorStyle; /* One of enum cursorStyles above */ int mCursorPreferredXPos; /* Pixel position for vert. cursor movement */ int mNVisibleLines; /* # of visible (displayed) lines */ int mNBufferLines; /* # of newlines in the buffer */ Fl_Text_Buffer_mod* mBuffer; /* Contains text to be displayed */ Fl_Text_Buffer_mod* mStyleBuffer; /* Optional parallel buffer containing color and font information */ int mFirstChar, mLastChar; /* Buffer positions of first and last displayed character (lastChar points either to a newline or one character beyond the end of the buffer) */ int mContinuousWrap; /* Wrap long lines when displaying */ int mFastDisplay; /* force continuous wrap and insertion of eol characters used in FTextRX */ std::string s_text; /* current contents of line text buffer */ std::string s_style; /* current contents of line stype buffer */ int mWrapMarginPix; /* Margin in # of pixels for wrapping in continuousWrap mode */ int* mLineStarts; int mTopLineNum; /* Line number of top displayed line of file (first line of file is 1) */ int mAbsTopLineNum; /* In continuous wrap mode, the line number of the top line if the text were not wrapped (note that this is only maintained as needed). */ int mNeedAbsTopLineNum; /* Externally settable flag to continue maintaining absTopLineNum even if it isn't needed for line # display */ int mHorizOffset; /* Horizontal scroll pos. in pixels */ int mTopLineNumHint; /* Line number of top displayed line of file (first line of file is 1) */ int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */ int mNStyles; /* Number of entries in styleTable */ const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for coloring/syntax-highlighting */ char mUnfinishedStyle; /* Style buffer entry which triggers on-the-fly reparsing of region */ Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */ /* regions */ void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */ int mMaxsize; int mSuppressResync; /* Suppress resynchronization of line starts during buffer updates */ int mNLinesDeleted; /* Number of lines deleted during buffer modification (only used when resynchronization is suppressed) */ int mModifyingTabDistance; /* Whether tab distance is being modified */ mutable double mColumnScale; /* Width in pixels of an average character. This value is calculated as needed (lazy eval); it needs to be mutable so that it can be calculated within a method marked as "const" */ Fl_Color mCursor_color; Fl_Scrollbar* mHScrollBar; Fl_Scrollbar* mVScrollBar; int scrollbar_width_; Fl_Align scrollbar_align_; int dragPos, dragType, dragging; int display_insert_position_hint; struct { int x, y, w, h; } text_area; int shortcut_; Fl_Font textfont_; Fl_Fontsize textsize_; Fl_Color textcolor_; // The following are not presently used from the original NEdit code, // but are being put here so that future versions of Fl_Text_Display_mod // can implement line numbers without breaking binary compatibility. /* Line number margin and width */ int mLineNumLeft, mLineNumWidth; }; #endif // // End of "$Id: Fl_Text_Display_mod.H 8306 2011-01-24 17:04:22Z matt $". // fldigi-4.1.06/src/include/nanoIO.h0000644000175000017500000000457013511746236013545 00000000000000// ---------------------------------------------------------------------------- // nanoIO.h -- Interface to Arduino Nano keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _TINYIO_H #define _TINYIO_H #include #include #include #include #include #include #include #include #include #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "status.h" #include "serial.h" #include "qrunner.h" #include "threads.h" #include "FTextRXTX.h" extern bool use_nanoIO; extern bool nanoIO_isCW; extern bool open_nanoIO(); extern void close_nanoIO(); extern bool open_nanoCW(); extern void close_nanoIO(); extern bool nano_read_byte(unsigned char &byte); extern std::string nano_readString(); extern void nano_send_char(int c); extern void nano_sendString (const std::string &s); extern void nano_set_baud(int bd); extern void nano_mark_polarity(int v); extern void nano_PTT(int val); extern void nano_cancel_transmit(); extern std::string nano_serial_read(); extern int nano_serial_write(char c); extern void set_nanoIO(); extern void set_nanoCW(); extern void set_nanoWPM(int wpm); extern void set_nano_keyerWPM(int wpm); extern void set_nanoIO_keyer(int indx); extern void set_nano_dash2dot(float wt); extern void nano_CW_query(); extern void nano_help(); extern void nano_CW_save(); extern void nanoCW_tune(int val); extern void set_nanoIO_incr(); extern void nanoIO_set_cw_ptt(); extern void nanoIO_use_pot(); extern void set_nanoIO_min_max(); extern void nanoIO_read_pot(); extern void set_paddle_WPM(int); extern void nano_serial_flush(); #endif fldigi-4.1.06/src/include/rigxml.h0000644000175000017500000000731613472115776013672 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef XML_H #define XML_H #include #include #include using namespace std; struct MODE { std::string SYMBOL; std::string BYTES; MODE(std::string nm, std::string b) { SYMBOL = nm; BYTES = b;} MODE(std::string nm, char c) { SYMBOL = nm; BYTES += c;} }; struct BW { std::string SYMBOL; std::string BYTES; BW(std::string nm, std::string b) { SYMBOL = nm; BYTES = b;} BW(std::string nm, char c) { SYMBOL = nm; BYTES += c;} }; struct DATA { std::string dtype; int size; int max; int min; float resolution; bool reverse; int andmask; int shiftbits; void clear() { size = 0; dtype.clear(); max = 199999999; min = 0; resolution = 1.0; reverse = false; andmask = 0xFF; shiftbits = 0; } }; struct XMLIOS { std::string SYMBOL; int size; std::string str1; std::string str2; DATA data; int fill1; int fill2; std::string info; std::string ok; std::string bad; void clear() { SYMBOL.clear(); str1.clear(); str2.clear(); info.clear(); ok.clear(); bad.clear(); size = fill1 = fill2 = 0; data.clear(); } }; struct TAGS { const char *tag; void (*fp)(size_t &);}; struct PAIR { int val; int mtr; PAIR(int v, int s) { val = v; mtr = s; } void clear() {val = 0; mtr = 0; } }; struct XMLRIG { XMLRIG() { clear(); } std::string port; string rigTitle; int baud; int stopbits; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int write_delay; int init_delay; int wait_for_device; int post_write_delay; int timeout; int retries; bool echo; bool cmdptt; bool vsp; bool logstr; int pollinterval; bool use_smeter; vector< PAIR > smeter; bool use_pwrmeter; vector< PAIR > pmeter; bool use_notch; vector< PAIR > notch; bool use_pwrlevel; vector< PAIR >pwrlevel; bool debug; bool noserial; bool ascii; bool xmlok; void clear() { port.clear(); baud = 1200; stopbits = 2; dtr = false; dtrptt = false; rts = false; rtsptt = false; rtscts = false; restore_tio = true; echo = false; cmdptt = false; vsp = false; logstr = false; write_delay = 0; init_delay = 0; wait_for_device = 0; post_write_delay = 50; timeout = 200; retries = 5; rigTitle = ""; pollinterval = 100; debug = false; noserial = false; ascii = false; xmlok = false; use_smeter = false; use_pwrmeter = false; use_pwrlevel = false; smeter.clear(); pmeter.clear(); pwrlevel.clear(); notch.clear(); } }; extern std::list commands; extern std::list reply; extern std::list lmodes; extern std::list lmodeCMD; extern std::list lmodeREPLY; extern std::list lbws; extern std::list lbwCMD; extern std::list lbwREPLY; extern std::list LSBmodes; extern XMLRIG xmlrig; extern bool readRigXML(); extern void selectRigXmlFilename(); extern void loadRigXmlFile(void); #endif fldigi-4.1.06/src/include/wefax-pic.h0000644000175000017500000000512613472115777014251 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _WEFAX_PIC_H #define _WEFAX_PIC_H #include class Fl_Menu_ ; class wefax ; class wefax_pic { static void create_rx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); static void create_tx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); public: static void set_tx_pic(unsigned char data, int col, int row, bool is_color ); static int normalize_lpm( double the_lpm_value ); static void update_rx_lpm(int lpm); static int update_rx_pic_col(unsigned char data, int pos); static void update_rx_pic_bw(unsigned char data, int pos); static void tx_viewer_resize(int the_width, int the_height); static void restart_tx_viewer(void); static void abort_rx_viewer(void); static void abort_tx_viewer(void); static void resize_rx_viewer(int width_img); static void set_rx_label(const std::string & win_label); static void delete_rx_viewer(void); static void delete_tx_viewer(void); static void skip_rx_apt(void); static void skip_rx_phasing(bool auto_center); static void cb_mnu_pic_viewer_rx(Fl_Menu_ *, void *); static void cb_mnu_pic_viewer_tx(Fl_Menu_ *, void *); static void setwefax_map_link(wefax *me); static void save_image(const std::string & fil_name, const std::string & extra_comments); static void power( double start, double phase, double image, double black, double stop ); static void send_image( const std::string & fil_name ); static void set_manual( bool manual_mode ); static void update_auto_center( bool is_auto_center ); static void create_both( bool called_from_fl_digi ); static void show_both(); static void hide_both(); }; extern Fl_Double_Window *wefax_pic_tx_win; extern Fl_Double_Window *wefax_pic_rx_win; #endif // _WEFAX_PIC_H fldigi-4.1.06/src/include/thor.h0000644000175000017500000001210313472115776013332 00000000000000// ---------------------------------------------------------------------------- // thor.h -- thor modem // // Copyright (C) 2008-2012 // David Freese // John Douyere // John Phelps // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _thor_H #define _thor_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "dominovar.h" #include "mbuffer.h" #include "picture.h" #include // NASA coefficients for viterbi encode/decode algorithms #define THOR_K 7 #define THOR_POLY1 0x6d #define THOR_POLY2 0x4f //VK2ETA high speed modes // IEEE coefficients for viterbi encode/decode algorithms #define THOR_K15 15 #define K15_POLY1 044735 #define K15_POLY2 063057 //#include "mfskvaricode.h" #include "interleave.h" #include "viterbi.h" #define THORNUMTONES 18 #define THORMAXFFTS 8 #define THORBASEFREQ 1500.0 #define THORFIRSTIF 2000.0 #define THORSCOPESIZE 64 #define THORSLOWPATHS 3 #define THORFASTPATHS 5 #define THOR_IMAGESPP 10 // the following constant changes if a mode with more tones than 25x4 is // created #define MAXPATHS (8 * THORFASTPATHS * THORNUMTONES ) struct THORrxpipe { cmplx vector[THORMAXFFTS * THORNUMTONES * 6]; }; class thor : public modem { public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_IMAGE, TX_STATE_AVATAR, TX_STATE_FLUSH, TX_STATE_RECEIVE }; enum THOR_STATE { TEXT, IMAGE_START, IMAGE_SYNC, IMAGE }; protected: // common variables double phase[THORMAXFFTS + 1]; double txphase; int symlen; int doublespaced; double tonespacing; int counter; unsigned int twosym; int paths; int numbins; bool slowcpu; int basetone; int lotone; int hitone; int extones; // rx variables C_FIR_filter *hilbert; sfft *binsfft[THORMAXFFTS]; fftfilt *fft; Cmovavg *vidfilter[THORSCOPESIZE]; Cmovavg *syncfilter; THORrxpipe *pipe; unsigned int pipeptr; unsigned int datashreg; mbuffer scopedata; mbuffer videodata; cmplx currvector; int currsymbol; int prev1symbol; int prev2symbol; double currmag; double prev1mag; double prev2mag; double met1; double met2; double sig; double noise; double s2n; int synccounter; unsigned char symbolbuf[MAX_VARICODE_LEN]; int symcounter; int symbolbit; bool filter_reset; bool staticburst; int fec_confidence; // tx variables int txstate; int txprevtone; unsigned int bitshreg; std::string strSecXmtText; unsigned int cptr; viterbi *Dec; interleave *Rxinlv; encoder *Enc; interleave *Txinlv; int bitstate; unsigned char symbolpair[2]; int flushlength; private: cmplx mixer(int n, const cmplx& in); // Rx void recvchar(int c); void decodesymbol(); void softdecodesymbol(); int harddecode(); int softdecode(); void update_syncscope(); void synchronize(); void reset_afc(); void eval_s2n(); int get_secondary_char(); void reset_filters(); void decodePairs(unsigned char symbol); bool preambledetect(int c); void softflushrx(); void parse_pic(int); // Tx void sendtone(int tone, int duration); void sendsymbol(int sym); void sendchar(unsigned char c, int secondary); void sendidle(); void sendsecondary(); void flushtx(); void Clearbits(); protected: void s2nreport(void); public: thor (trx_mode md); ~thor (); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); // support for thor image transfers private: double amplitude; double pixel; double sync; double img_phase; unsigned char tx_pixel; int tx_pixelnbr; int image_mode; public: int byte; double picf; double picpeak; C_FIR_filter *picfilter; Cmovavg *pixfilter; Cmovavg *pixsyncfilter; double phidiff; double pic_phase; cmplx prevz; cmplx currz; double image_freq[10]; int image_counter; int picW; int picH; int row; int col; int rgb; int pixelnbr; static int IMAGEspp; int TXspp; static std::string imageheader; static std::string avatarheader; std::string pic_str; THOR_STATE state; bool b_ava; void recvpic(double smpl); void send_image(); void send_avatar(); void thor_send_avatar(); void m_thor_send_avatar(); void thor_send_image(std::string s = "", bool gray = false); }; #endif fldigi-4.1.06/src/include/main.h0000644000175000017500000000663613472115777013321 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MAIN_H_ #define MAIN_H_ #include // FreeBSD needs this #include #include #include "ptt.h" #include "log.h" #include "data_io.h" #if USE_HAMLIB # include "rigclass.h" #endif extern std::string appname; extern std::string BaseDir; extern std::string HomeDir; extern std::string RigsDir; extern std::string ScriptsDir; extern std::string PalettesDir; extern std::string LogsDir; extern std::string PicsDir; extern std::string AvatarDir; extern std::string HelpDir; extern std::string MacrosDir; extern std::string WrapDir; extern std::string TalkDir; extern std::string TempDir; extern std::string DebugDir; extern std::string LoTWDir; extern std::string KmlDir; extern std::string PskMailDir; extern std::string DATA_dir; extern std::string NBEMS_dir; extern std::string ARQ_dir; extern std::string ARQ_files_dir; extern std::string ARQ_recv_dir; extern std::string ARQ_send; extern std::string WRAP_dir; extern std::string WRAP_recv_dir; extern std::string WRAP_send_dir; extern std::string WRAP_auto_dir; extern std::string ICS_dir; extern std::string ICS_msg_dir; extern std::string ICS_tmp_dir; extern std::string FLMSG_dir; extern std::string FLMSG_WRAP_dir; extern std::string FLMSG_WRAP_recv_dir; extern std::string FLMSG_WRAP_send_dir; extern std::string FLMSG_WRAP_auto_dir; extern std::string FLMSG_ICS_dir; extern std::string FLMSG_ICS_msg_dir; extern std::string FLMSG_ICS_tmp_dir; extern std::string FLAMP_dir; extern std::string FLAMP_rx_dir; extern std::string FLAMP_tx_dir; extern std::string xmlfname; extern std::string scDevice[2]; extern PTT *push2talk; #if USE_HAMLIB extern Rig *xcvr; #endif extern cLogfile *Maillogfile; extern cLogfile *logfile; extern bool gmfskmail; extern bool arqmode; extern std::string ArqFilename; extern bool mailclient; extern bool mailserver; extern bool tlfio; extern bool arq_text_available; extern int arq_get_char(); // ARQ mail implementation extern void arq_init(); extern void arq_close(); extern void arq_restart(); extern void WriteARQ(unsigned char); extern void checkTLF(); void check_nbems_dirs(void); void check_data_dir(void); extern bool nbems_dirs_checked; // This inits or reinits everything related to KML: Reloads params etc... void kml_init(bool load_files = false); // close down remaining threads just before exiting UI extern void exit_process(); int directory_is_created( const char * strdir ); // autostart an external program extern void start_process(std::string executable); #endif fldigi-4.1.06/src/include/testsigs.h0000644000175000017500000000100513511722452014207 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0304 #ifndef testsigs_h #define testsigs_h #include #include #include "flslider2.h" extern Fl_Counter2 *noiseDB; #include extern Fl_Check_Button *btnNoiseOn; #include extern Fl_Counter *ctrl_freq_offset; extern Fl_Check_Button *btnOffsetOn; extern Fl_Counter2 *xmtimd; extern Fl_Check_Button *btn_imd_on; #include Fl_Double_Window* make_testdialog(); #endif fldigi-4.1.06/src/include/fileselect.h0000644000175000017500000000245313472115776014504 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FILESELECT_H #define FILESELECT_H #include namespace FSEL { void create(void); void destroy(void); const char* select(const char* title, const char* filter, const char* def = 0, int *fsel = NULL); const char* saveas(const char* title, const char* filter, const char* def = 0, int *fsel = NULL); const char* dir_select(const char* title, const char* filter, const char* def = 0); } #endif // FILESELECT_H fldigi-4.1.06/src/include/mfskvaricode.h0000644000175000017500000000213113472115776015033 00000000000000// ---------------------------------------------------------------------------- // mfskvaricode.h -- MFSK Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MFSKVARICODE_H #define _MFSKVARICODE_H extern const char *varienc(int c); extern int varidec(unsigned int symbol); #endif fldigi-4.1.06/src/include/interleave.h0000644000175000017500000000316113472115776014520 00000000000000// ---------------------------------------------------------------------------- // interleave.h -- MFSK (de)interleaver // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _INTERLEAVE_H #define _INTERLEAVE_H #define INTERLEAVE_FWD 0 #define INTERLEAVE_REV 1 #define PUNCTURE 128 class interleave { protected: int size; int depth; int len; int direction; unsigned char *table; unsigned char *tab(int i, int j, int k) { return &table[(size * size * i) + (size * j) + k]; } public: interleave(int _size, int depth, int dir); ~interleave(); void symbols (unsigned char *psyms); void bits (unsigned int *pbits); void flush(); void init(); }; // ---------------------------------------------------------------------------- #endif fldigi-4.1.06/src/include/modem.h0000664000175000017500000002732113507402064013455 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _MODEM_H #define _MODEM_H #include #include "threads.h" #include "sound.h" #include "digiscope.h" #include "globals.h" #include "morse.h" #include "ascii.h" #define OUTBUFSIZE 16384 // Constants for signal searching & s/n threshold #define SIGSEARCH 5 #define TWOPI (2.0 * M_PI) class modem { public: static double frequency; static double tx_frequency; static bool freqlock; static unsigned long tx_sample_count; static unsigned int tx_sample_rate; static bool XMLRPC_CPS_TEST; protected: cMorse morse; trx_mode mode; SoundBase *scard; bool stopflag; int fragmentsize; int samplerate; bool reverse; int sigsearch; double bandwidth; double freqerr; double rx_corr; double tx_corr; double PTTphaseacc; double PTTchannel[OUTBUFSIZE]; // for CW modem use only bool cwTrack; bool cwLock; double cwRcvWPM; double cwXmtWPM; double squelch; double metric; double syncpos; int backspaces; unsigned char *txstr; unsigned char *txptr; double outbuf[OUTBUFSIZE]; bool historyON; Digiscope::scope_mode scopemode; int scptr; // extended s/n reporting double s2n_ncount, s2n_sum, s2n_sum2, s2n_metric; bool s2n_valid; unsigned cap; public: modem(); virtual ~modem(){}; // these processes must be declared in the derived class virtual void init(); virtual void tx_init () = 0; virtual void rx_init () = 0; virtual void restart () = 0; virtual void rx_flush() {}; virtual int tx_process ()// = 0; { if (!macro_video_text.empty()) { wfid_text(macro_video_text); macro_video_text.clear(); } return 0; } virtual int rx_process (const double *, int len) = 0; virtual void shutdown(){}; virtual void set1(int, int){}; virtual void set2(int, int){}; virtual void makeTxViewer(int W, int H){}; virtual void searchDown() {}; virtual void searchUp() {}; void HistoryON(bool val) {historyON = val;} bool HistoryON() const { return historyON;} /// Inlined const getters are faster and smaller. trx_mode get_mode() const { return mode; }; const char *get_mode_name() const { return mode_info[get_mode()].sname;} unsigned int iface_io() const { return mode_info[get_mode()].iface_io;} virtual void set_freq(double); /// Inlining small formulas is still faster and shorter. int get_freq() const { return (int)( frequency + 0.5 ); } void init_freqlock(); void set_freqlock(bool); void set_sigsearch(int n) { sigsearch = n; freqerr = 0.0;}; bool freqlocked() const { return freqlock;} /// Getters are semantically const. double get_txfreq() const; double get_txfreq_woffset() const; void set_metric(double); void display_metric(double); double get_metric() const { return metric;} void set_reverse(bool on); bool get_reverse() const { return reverse;} double get_bandwidth() const { return bandwidth;} void set_bandwidth(double); int get_samplerate() const { return samplerate;} void set_samplerate(int); void init_queues(); void ModulateXmtr(double *, int); void ModulateStereo(double *, double *, int, bool sample_flag = true); void ModulateVideo(double *, int); void ModulateVideoStereo(double *, double *, int, bool sample_flag = true); void videoText(); void pretone(); virtual void send_color_image(std::string) {} virtual void send_Grey_image(std::string) {} virtual void ifkp_send_image(std::string s = "", bool grey = false){} virtual void ifkp_send_avatar(){} virtual void m_ifkp_send_avatar(){} virtual void thor_send_image(std::string s = "", bool grey = false){} virtual void thor_send_avatar(){} virtual void m_thor_send_avatar(){} void set_stopflag(bool b) { stopflag = b;}; bool get_stopflag() const { return stopflag; }; unsigned get_cap(void) const { return cap; } enum { CAP_AFC = 1 << 0, CAP_AFC_SR = 1 << 1, CAP_REV = 1 << 2, CAP_IMG = 1 << 3, CAP_BW = 1 << 4, CAP_RX = 1 << 5, CAP_TX = 1 << 6 }; // for CW modem use only bool get_cwTrack(); void set_cwTrack(bool); bool get_cwLock(); void set_cwLock(bool); double get_cwXmtWPM(); void set_cwXmtWPM(double); double get_cwRcvWPM(); virtual void incWPM() {}; virtual void decWPM() {}; virtual void toggleWPM() {}; virtual void sync_parameters() {}; virtual void reset_rx_filter() {}; virtual void update_Status() {}; // for waterfall id transmission private: static double wfid_w[]; static double wfid_outbuf[]; int vidwidth; void wfid_make_tones(int numchars); void wfid_send(int numchars); void wfid_sendchars(std::string s); double PTTnco(); public: std::string macro_video_text; void wfid_text(const std::string& s); // for CW ID transmission private: double cwid_keyshape[128]; double cwid_phaseacc; int RT; int cwid_symbollen; int cwid_lastsym; public: void cwid_makeshape(); double cwid_nco(double freq); void cwid_send_symbol(int bits); void cwid_send_ch(int ch); void cwid_sendtext (const std::string& s); void cwid(); // for fft scan modem public: virtual void refresh_scope() {} // for multi-channel modems public: virtual void clear_viewer() {} virtual void clear_ch(int n) {} virtual int viewer_get_freq(int n) {return 0; } // for noise tests private: void add_noise(double *, int); double sigmaN (double es_ovr_n0); double gauss(double sigma); protected: virtual void s2nreport(void); // JD & DF for multiple carriers public: int numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR int symbols; //JD for multiple carriers int acc_symbols; int char_symbols; int xmt_symbols; int ovhd_symbols; int acc_samples; int char_samples; int xmt_samples; int ovhd_samples; // analysis mode int write_to_csv; virtual void start_csv() {} virtual void stop_csv() {} // fsq mode bool fsq_tx_image; std::string xmt_string; virtual double fsq_xmtdelay() {return 0;}; virtual void send_ack(std::string relay) {}; virtual void fsq_send_image(std::string s){} virtual std::string fsq_mycall() {return "";} virtual bool fsq_squelch_open() {return false;} virtual void fsq_transmit(void *) {} }; extern modem *null_modem; extern modem *cw_modem; extern modem *mfsk8_modem; extern modem *mfsk16_modem; extern modem *mfsk32_modem; // experimental modes extern modem *mfsk4_modem; extern modem *mfsk11_modem; extern modem *mfsk22_modem; extern modem *mfsk31_modem; extern modem *mfsk64_modem; extern modem *mfsk128_modem; extern modem *mfsk64l_modem; extern modem *mfsk128l_modem; extern modem *wefax576_modem; extern modem *wefax288_modem; extern modem *navtex_modem; extern modem *sitorb_modem; extern modem *mt63_500S_modem; extern modem *mt63_1000S_modem; extern modem *mt63_2000S_modem; extern modem *mt63_500L_modem; extern modem *mt63_1000L_modem; extern modem *mt63_2000L_modem; extern modem *feld_modem; extern modem *feld_slowmodem; extern modem *feld_x5modem; extern modem *feld_x9modem; extern modem *feld_FMmodem; extern modem *feld_FM105modem; extern modem *feld_80modem; extern modem *feld_CMTmodem; extern modem *psk31_modem; extern modem *psk63_modem; extern modem *psk63f_modem; extern modem *psk125_modem; extern modem *psk250_modem; extern modem *psk500_modem; extern modem *psk1000_modem; extern modem *qpsk31_modem; extern modem *qpsk63_modem; extern modem *qpsk125_modem; extern modem *qpsk250_modem; extern modem *qpsk500_modem; extern modem *_8psk125_modem; extern modem *_8psk250_modem; extern modem *_8psk500_modem; extern modem *_8psk1000_modem; extern modem *_8psk1200_modem; extern modem *_8psk1333_modem; extern modem *_8psk125fl_modem; extern modem *_8psk125f_modem; extern modem *_8psk250fl_modem; extern modem *_8psk250f_modem; extern modem *_8psk500f_modem; extern modem *_8psk1000f_modem; extern modem *_8psk1200f_modem; extern modem *_8psk1333f_modem; extern modem *psk125r_modem; extern modem *psk250r_modem; extern modem *psk500r_modem; extern modem *psk1000r_modem; extern modem *psk800_c2_modem; extern modem *psk800r_c2_modem; extern modem *psk1000_c2_modem; extern modem *psk1000r_c2_modem; extern modem *psk63r_c4_modem; extern modem *psk63r_c5_modem; extern modem *psk63r_c10_modem; extern modem *psk63r_c20_modem; extern modem *psk63r_c32_modem; extern modem *psk125r_c4_modem; extern modem *psk125r_c5_modem; extern modem *psk125r_c10_modem; extern modem *psk125_c12_modem; extern modem *psk125r_c12_modem; extern modem *psk125r_c16_modem; extern modem *psk250r_c2_modem; extern modem *psk250r_c3_modem; extern modem *psk250r_c5_modem; extern modem *psk250_c6_modem; extern modem *psk250r_c6_modem; extern modem *psk250r_c7_modem; extern modem *psk500_c2_modem; extern modem *psk500_c4_modem; extern modem *psk500r_c2_modem; extern modem *psk500r_c3_modem; extern modem *psk500r_c4_modem; extern modem *rtty_modem; //extern modem *pkt_modem; extern modem *olivia_modem; extern modem *olivia_4_125_modem; extern modem *olivia_4_250_modem; extern modem *olivia_4_500_modem; extern modem *olivia_4_1000_modem; extern modem *olivia_4_2000_modem; extern modem *olivia_8_125_modem; extern modem *olivia_8_250_modem; extern modem *olivia_8_500_modem; extern modem *olivia_8_1000_modem; extern modem *olivia_8_2000_modem; extern modem *olivia_16_500_modem; extern modem *olivia_16_1000_modem; extern modem *olivia_16_2000_modem; extern modem *olivia_32_1000_modem; extern modem *olivia_32_2000_modem; extern modem *olivia_64_500_modem; extern modem *olivia_64_1000_modem; extern modem *olivia_64_2000_modem; extern modem *contestia_modem; extern modem *contestia_4_125_modem; extern modem *contestia_4_250_modem; extern modem *contestia_4_500_modem; extern modem *contestia_4_1000_modem; extern modem *contestia_4_2000_modem; extern modem *contestia_8_125_modem; extern modem *contestia_8_250_modem; extern modem *contestia_8_500_modem; extern modem *contestia_8_1000_modem; extern modem *contestia_8_2000_modem; extern modem *contestia_16_500_modem; extern modem *contestia_16_1000_modem; extern modem *contestia_16_2000_modem; extern modem *contestia_32_1000_modem; extern modem *contestia_32_2000_modem; extern modem *contestia_64_500_modem; extern modem *contestia_64_1000_modem; extern modem *contestia_64_2000_modem; extern modem *thormicro_modem; extern modem *thor4_modem; extern modem *thor5_modem; extern modem *thor8_modem; extern modem *thor11_modem; extern modem *thor16_modem; extern modem *thor22_modem; extern modem *thor25x4_modem; extern modem *thor50x1_modem; extern modem *thor50x2_modem; extern modem *thor100_modem; extern modem *dominoexmicro_modem; extern modem *dominoex4_modem; extern modem *dominoex5_modem; extern modem *dominoex8_modem; extern modem *dominoex11_modem; extern modem *dominoex16_modem; extern modem *dominoex22_modem; extern modem *dominoex44_modem; extern modem *dominoex88_modem; extern modem *throb1_modem; extern modem *throb2_modem; extern modem *throb4_modem; extern modem *throbx1_modem; extern modem *throbx2_modem; extern modem *throbx4_modem; extern modem *wwv_modem; extern modem *anal_modem; extern modem *ssb_modem; extern modem *fsq_modem; extern modem *ifkp_modem; #endif fldigi-4.1.06/src/include/Viewer.h0000644000175000017500000000313613472115776013625 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef Viewer_h #define Viewer_h #include #include #include #include #include #include #include "viewpsk.h" #include "psk_browser.h" #include "flslider2.h" #include "flinput2.h" extern Fl_Double_Window *dlgViewer; extern Fl_Value_Slider2 *sldrViewerSquelch; extern Fl_Double_Window* createViewer(); extern Fl_Input2 *viewer_inp_seek; extern pskBrowser *brwsViewer; extern void openViewer(); extern void viewaddchr(int ch, int freq, char c, int md); extern void viewerswap(int, int); extern void initViewer(); extern void viewclearchannel(int ch); extern void viewer_paste_freq(int freq); extern void viewer_redraw(); #endif fldigi-4.1.06/src/include/smeter.h0000644000175000017500000000455413472115777013671 00000000000000// // smeter.h // // Smeter bar widget routines. // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SMETER #define SMETER // // Include necessary headers. // #include #include // // Smeter class... // class Smeter : public Fl_Widget { private: double value_, minimum_, maximum_; int sval; // Size of sval bar... int bx, by, bw, bh; // Box areas... int tx, tw; // Temporary X + width int ty, th; // Temporary Y + height int sx; // meter left offset int meter_width; int meter_height; Fl_Color bgnd_; Fl_Color fgnd_; Fl_Color scale_color; static const char *meter_face; void (*cbFunc)(Fl_Widget *, void *); protected: virtual void draw(); public: Smeter(int x, int y, int w, int h, const char *l = 0); void maximum(double v) { maximum_ = v; redraw(); } double maximum() const { return (maximum_); } void minimum(double v) { minimum_ = v; redraw(); } double minimum() const { return (minimum_); } void value(double v) { value_ = v; if (value_ < minimum_) value_ = minimum_; if (value_ > maximum_) value_ = maximum_; redraw(); } double value() const { return (value_); } void resize(int x, int y, int w, int h); int handle(int); void set_background(Fl_Color c1) { bgnd_ = c1; redraw(); } void set_metercolor(Fl_Color c2) { fgnd_ = c2; redraw(); } void set_scalecolor(Fl_Color c3) { scale_color = c3; redraw(); } void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } }; #endif // !smeter fldigi-4.1.06/src/include/ax25_decode.h0000644000175000017500000000435113472115776014446 00000000000000// --------------------------------------------------------------------- // ax25_decode.cxx -- AX25 Packet disassembler. // // This file is a proposed part of fldigi. Adapted very liberally from // rtty.cxx, with many thanks to John Hansen, W2FS, who wrote // 'dcc.doc' and 'dcc2.doc', GNU Octave, GNU Radio Companion, and finally // Bartek Kania (bk.gnarf.org) whose 'aprs.c' expository coding style helped // shape this implementation. // // Copyright (C) 2010, 2014 // Dave Freese, W1HKJ // Chris Sylvain, KB3CS // Robert Stiles, KK5VD // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #ifndef __ax25_decode__ #define __ax25_decode__ #include // 70 bytes addr + 256 payload + 2 FCS + 1 Control + 1 Protocol ID #define MAXOCTETS 340 // 136 bits minimum (including start and end flags) - AX.25 v2.2 section 3.9 // == 15 octets. we count only one of the two flags, though. #define MINOCTETS 14 enum PKT_MicE_field { Null = 0x00, Space = 0x20, Zero = 0x30, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, P0 = 0x40, P100, North = 0x50, East, South, West, Invalid = 0xFF }; struct PKT_PHG_table { const char *s; unsigned char l; }; //static void do_put_rx_char(unsigned char *cp); static void expand_MicE(unsigned char *cpI, unsigned char *cpE); static void expand_PHG(unsigned char *cpI); static void expand_Cmp(unsigned char *cpI); inline void put_rx_const(const char s[]); void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag); #endif /* defined(__ax25_decode__) */ fldigi-4.1.06/src/include/xmlreader.h0000644000175000017500000000300113472115776014336 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "irrXML.h" using namespace irr; using namespace io; class IIrrXMLStringReader: public IFileReadCallBack { const char *s; int len; int p; public: IIrrXMLStringReader(const char *szStr) { s = szStr; len = strlen(s); p=0; } IIrrXMLStringReader(const std::string &str) { s=str.c_str(); len = strlen(s); p=0; } int read(void * buffer, int sizeToRead) { char *sss = (char *)buffer; if (p >= len) return 0; int j = 0; for (int i = p; i < len && j < sizeToRead; ) { sss[j++] = s[i++]; } return 1; } int getSize() { return len-p; } }; fldigi-4.1.06/src/include/view_rtty.h0000644000175000017500000000761613472115776014427 00000000000000// ---------------------------------------------------------------------------- // rtty.h -- RTTY modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef VIEW_RTTY_H #define VIEW_RTTY_H //#include "rtty.h" #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #define VIEW_RTTY_SampleRate 8000 #define VIEW_MAXPIPE 1024 #define VIEW_RTTY_MAXBITS (2 * VIEW_RTTY_SampleRate / 23 + 1) #define MAX_CHANNELS 30 class view_rtty : public modem { public: enum CHANNEL_STATE {IDLE, SRCHG, RCVNG, WAITING}; enum RTTY_RX_STATE { RTTY_RX_STATE_IDLE = 0, RTTY_RX_STATE_START, RTTY_RX_STATE_DATA, RTTY_RX_STATE_PARITY, RTTY_RX_STATE_STOP, RTTY_RX_STATE_STOP2 }; enum RTTY_PARITY { RTTY_PARITY_NONE = 0, RTTY_PARITY_EVEN, RTTY_PARITY_ODD, RTTY_PARITY_ZERO, RTTY_PARITY_ONE }; static const double SHIFT[]; static const double BAUD[]; static const int BITS[]; static const int FILTLEN[]; static const int numshifts; static const int numbauds; int filter_length; private: struct RTTY_CHANNEL { int state; double phaseacc; fftfilt *mark_filt; fftfilt *space_filt; Cmovavg *bits; bool nubit; bool bit; bool bit_buf[VIEW_RTTY_MAXBITS]; double mark_phase; double space_phase; double metric; int rxmode; RTTY_RX_STATE rxstate; double frequency; double freqerr; double phase; double posfreq; double negfreq; double freqerrhi; double freqerrlo; double poserr; double negerr; int poscnt; int negcnt; int timeout; double mark_mag; double space_mag; double mark_env; double space_env; double noise_floor; double mark_noise; double space_noise; double sigpwr; double noisepwr; double avgsig; double prevsymbol; cmplx prevsmpl; int counter; int bitcntr; int rxdata; int inp_ptr; cmplx mark_history[VIEW_MAXPIPE]; cmplx space_history[VIEW_MAXPIPE]; int sigsearch; }; double shift; int symbollen; int nbits; int stoplen; int msb; bool useFSK; RTTY_CHANNEL channel[MAX_CHANNELS]; double rtty_squelch; double rtty_shift; double rtty_BW; double rtty_baud; int rtty_bits; RTTY_PARITY rtty_parity; int rtty_stop; bool rtty_msbfirst; int bflen; double bp_filt_lo; double bp_filt_hi; int txmode; int preamble; void clear_syncscope(); void update_syncscope(); cmplx mixer(double &phase, double f, cmplx in); unsigned char bitreverse(unsigned char in, int n); int decode_char(int ch); int rttyparity(unsigned int); bool rx(int ch, bool bit); int rttyxprocess(); char baudot_dec(int ch, unsigned char data); void Metric(int ch); public: view_rtty(trx_mode mode); ~view_rtty(); void init(); void rx_init(); void tx_init() {} void restart(); void reset_filters(int ch); int rx_process(const double *buf, int len); int tx_process(); void find_signals(); void clearch(int ch); void clear(); int get_freq(int n) { return (int)channel[n].frequency;} bool is_mark_space(int ch, int &); bool is_mark(int ch); }; //extern view_rtty *rttyviewer; #endif fldigi-4.1.06/src/include/analysis.h0000664000175000017500000000355013507401434014175 00000000000000// ---------------------------------------------------------------------------- // anal.h -- frequency analysis modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _anal_H #define _anal_H #include #include #include #include "complex.h" #include "filters.h" #include "fftfilt.h" #include "modem.h" #define ANAL_SAMPLERATE 8000 #define FILT_LEN 4 //seconds #define PIPE_LEN 120 #define DSP_CNT 1 //seconds #define ANAL_BW 4 class anal : public modem { private: double phaseacc; fftfilt *bpfilt; Cmovavg *ffilt; Cmovavg *afilt; double pipe[PIPE_LEN]; double prevsymbol; cmplx prevsmpl; double fout; double amp; long int wf_freq; double dspcnt; long int passno; struct timespec start_time; double elapsed; void clear_syncscope(); inline cmplx mixer(cmplx in); int rx(bool bit); double nco(double freq); void writeFile(); std::string analysisFilename; public: anal(); ~anal(); void init(); void rx_init(); void tx_init(); void restart(); void start_csv(); void stop_csv(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-4.1.06/src/include/textio.h0000644000175000017500000000241413472115776013676 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MULTIPSK_H #define MULTIPSK_H #include "qso_db.h" class cTextFile { private: char header[120]; void makeHeader(); char *adif_to_date( char *s); char *adif_to_time( char *s); public: cTextFile () {}; ~cTextFile () {}; void writeCSVHeader(FILE *); int writeCSVFile (const char *, cQsoDb *); void writeTXTHeader(FILE *); int writeTXTFile (const char *, cQsoDb *); }; #endif fldigi-4.1.06/src/include/stacktrace.h0000644000175000017500000000204513472115776014506 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef STACKTRACE_H #define STACKTRACE_H void pstack_maybe(void); void diediedie(void); void handle_unexpected(void); void handle_signal(int s); #endif // STACKTRACE_H fldigi-4.1.06/src/include/re.h0000644000175000017500000000422313472115777012771 00000000000000// ---------------------------------------------------------------------------- // re.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RE_H_ #define RE_H_ #if HAVE_REGEX_H # include #else # include "compat/regex.h" #endif #include #include class re_t { public: re_t(const char* pattern_ = "", int cflags_ = 0); re_t(const re_t& re); ~re_t(); re_t& operator=(const re_t& rhs); void recompile(const char* pattern_); operator bool(void) const { return !error; } bool operator==(const re_t& o) const { return o.cflags == cflags && o.pattern == pattern; } bool match(const char* str, int eflags_ = 0); const std::string& submatch(size_t n) const; void suboff(size_t n, int* start, int* end) const; const std::vector& suboff(void) const { return suboffsets; } size_t nsub(void) const { return suboffsets.size(); } const std::string& re(void) const { return pattern; } int cf(void) const { return cflags; } size_t hash(void) const; protected: void compile(void); std::string pattern; int cflags, eflags; regex_t preg; std::vector suboffsets; std::vector substrings; bool error; bool need_substr; }; class fre_t : public re_t { public: fre_t(const char* pattern_, int cflags_ = 0); bool match(const char* str, int eflags_ = 0); }; #endif // RE_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/qrunner/0000775000175000017500000000000013515625027012332 500000000000000fldigi-4.1.06/src/qrunner/fqueue.h0000644000175000017500000000631213472115773013721 00000000000000// ---------------------------------------------------------------------------- // fqueue.h // // Copyright (C) 2007-2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FQUEUE_H_ #define FQUEUE_H_ #include #include #include "ringbuffer.h" #include "util.h" // #include // #include // #include #define FQUEUE_SIZE 2048 #define FIFO_SIZE (FQUEUE_SIZE * 4) class func_base { public: virtual void destroy(bool run) = 0; virtual ~func_base() { } }; template class func_wrap : public func_base { public: explicit func_wrap(const F &f_) : f(f_) { } virtual void destroy(bool run) { if (run) f(); this->~func_wrap(); } private: F f; }; class fqueue { typedef ringbuffer fqueue_ringbuffer_t; public: fqueue(size_t count = FQUEUE_SIZE, size_t blocksize_ = 128) : blocksize(blocksize_) { rb = new fqueue_ringbuffer_t(blocksize * count); } ~fqueue() { drop(); delete rb; } bool empty(void) { return rb->read_space() == 0; } bool full(void) { return rb->write_space() == 0; } size_t size(void) { return rb->read_space() / blocksize; } template bool push(const T& t) { // If we have any space left at all, it will be at least // a blocksize. It will not wrap around the end of the rb. if (unlikely(rb->get_wv(wvec, blocksize) < blocksize)) return false; assert(blocksize >= sizeof(func_wrap)); // we assume a no-throw ctor! new (wvec[0].buf) func_wrap(t); rb->write_advance(blocksize); return true; } bool pop(bool exec = false) { if (rb->get_rv(rvec, blocksize) < blocksize) return false; reinterpret_cast(rvec[0].buf)->destroy(exec); rb->read_advance(blocksize); return true; } bool execute(void) { return pop(true); } size_t drop(void) { size_t n = 0; while (pop(false)) ++n; return n; } protected: fqueue_ringbuffer_t* rb; fqueue_ringbuffer_t::vector_type rvec[2], wvec[2]; size_t blocksize; }; #endif // FQUEUE_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.1.06/src/qrunner/qrunner.cxx0000644000175000017500000000634613472115773014503 00000000000000// ---------------------------------------------------------------------------- // qrunner.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if defined(__CYGWIN__) # include # include #elif defined(__MINGW32__) # include "compat.h" #endif #include #include #include "fqueue.h" #include "qrunner.h" #ifndef __MINGW32__ # define QRUNNER_EAGAIN() (errno == EAGAIN) #else # define QRUNNER_EAGAIN() ((errno = WSAGetLastError()) == WSAEWOULDBLOCK) #endif // qrunner threads const char *sztid[] = { "INVALID_TID", "TRX_TID", "TOD_TID", "QRZ_TID", "RIGCTL_TID", "NORIGCTL_TID", "EQSL_TID", "ADIF_RW_TID", "ADIF_MERGE_TID", "XMLRPC_TID", "ARQ_TID", "ARQSOCKET_TID", "MACLOGGER_TID", "KISS_TID", "KISSSOCKET_TID", "PSM_TID", "AUDIO_ALERT_TID", "FD_TID", "N3FJP_TID", "DXCC_TID", "WKEY_TID", "FLMAIN_TID" }; void qrunner_debug(int tid, const char *name) { if (tid > ((int)sizeof(sztid)-1)) tid = 0; else tid++; if (tid < 2) return; FILE *fd = (FILE *)0; fd = fl_fopen("qrunner.txt", "a"); if(fd) { fprintf(fd, "%s, %s\n", sztid[tid], name); fclose(fd); } } qrunner::qrunner() : attached(false), inprog(false), drop_flag(false) { fifo = new fqueue(FIFO_SIZE); #ifndef __WOE32__ if (pipe(pfd) == -1) #else if (socketpair(PF_INET, SOCK_STREAM, 0, pfd) == -1) #endif throw qexception(errno); set_cloexec(pfd[0], 1); set_cloexec(pfd[1], 1); if (set_nonblock(pfd[0], 1) == -1) throw qexception(errno); #ifdef __WOE32__ set_nodelay(pfd[1], 1); #endif } qrunner::~qrunner() { detach(); close(pfd[0]); close(pfd[1]); delete fifo; } void qrunner::attach(int id_no, std::string id_string) { Fl::add_fd(pfd[0], FL_READ, qrunner::execute, this); attached = true; _id_no = id_no; _id_string.assign(id_string); } void qrunner::attach(void) { Fl::add_fd(pfd[0], FL_READ, qrunner::execute, this); attached = true; } void qrunner::detach(void) { attached = false; Fl::remove_fd(pfd[0], FL_READ); } static unsigned char rbuf[FIFO_SIZE]; void qrunner::execute(int fd, void *arg) { qrunner *qr = reinterpret_cast(arg); if (qr->inprog) return; qr->inprog = true; long n = QRUNNER_READ(fd, rbuf, FIFO_SIZE); switch (n) { case -1: if (!QRUNNER_EAGAIN()) { throw qexception(errno); } // else fall through case 0: break; default: while (n--) { qr->fifo->execute(); } } qr->inprog = false; } void qrunner::flush(void) { execute(pfd[0], this); } fldigi-4.1.06/src/globals/0000775000175000017500000000000013515625027012263 500000000000000fldigi-4.1.06/src/globals/globals.cxx0000664000175000017500000005673313507402064014363 00000000000000// ---------------------------------------------------------------------------- // globals.cxx -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "gettext.h" #include "globals.h" #include "modem.h" #include "data_io.h" #include "strutil.h" using namespace std; // ************ Elements are in enum trx_mode order. ************ // N.B. it is not valid to use an _("NLS") string in this table!! // ... doing so will break the Fl_menu_item table 'menu_'. -Kamal // Last value (true/false) determines if it's used with the KISS interface. // It must have 8 bit support. Current selection based on the modems used in FLAMP. //struc entries: // mode, **modem, *sname, *name, *pskmail_name, *adif_name, *export_mode, *export_submode, *vid_name, iface_io const struct mode_info_t mode_info[NUM_MODES] = { {MODE_NULL,&null_modem,"NULL","NULL","","NULL","","","", DISABLED_IO }, {MODE_CW,&cw_modem,"CW","CW","CW","CW","CW","","CW", DISABLED_IO }, {MODE_CONTESTIA,&contestia_modem,"CONTESTIA","Contestia","","CONTESTI","CONTESTI","","CT",DISABLED_IO}, {MODE_CONTESTIA_4_125,&contestia_4_125_modem,"Cont-4/125","Cont4-125","","CONTESTI4/125","CONTESTI","","CT4/125",DISABLED_IO}, {MODE_CONTESTIA_4_250,&contestia_4_250_modem,"Cont-4/250","Cont4-250","","CONTESTI4/250","CONTESTI","","CT4/250",DISABLED_IO}, {MODE_CONTESTIA_4_500,&contestia_4_500_modem,"Cont-4/500","Cont4-500","","CONTESTI4/500","CONTESTI","","CT4/500",DISABLED_IO}, {MODE_CONTESTIA_4_1000,&contestia_4_1000_modem,"Cont-4/1K","Cont4-1K","","CONTESTI4/1000","CONTESTI","","CT4/1K",DISABLED_IO}, {MODE_CONTESTIA_4_2000,&contestia_4_2000_modem,"Cont-4/2K","Cont4-2K","","CONTESTI4/2000","CONTESTI","","CT4/2K",DISABLED_IO}, {MODE_CONTESTIA_8_125,&contestia_8_125_modem,"Cont-8/125","Cont8-125","","CONTESTI8/125","CONTESTI","","CT8/125",DISABLED_IO}, {MODE_CONTESTIA_8_250,&contestia_8_250_modem,"Cont-8/250","Cont8-250","","CONTESTI8/250","CONTESTI","","CT8/250",DISABLED_IO}, {MODE_CONTESTIA_8_500,&contestia_8_500_modem,"Cont-8/500","Cont8-500","","CONTESTI8/500","CONTESTI","","CT8/500",DISABLED_IO}, {MODE_CONTESTIA_8_1000,&contestia_8_1000_modem,"Cont-8/1K","Cont8-1K","","CONTESTI8/1000","CONTESTI","","CT8/1K",DISABLED_IO}, {MODE_CONTESTIA_8_2000,&contestia_8_2000_modem,"Cont-8/2K","Cont8-2K","","CONTESTI8/2000","CONTESTI","","CT8/2K",DISABLED_IO}, {MODE_CONTESTIA_16_500,&contestia_16_500_modem,"Cont-16/500","Cont16-500","","CONTESTI16/500","CONTESTI","","CT16/500",DISABLED_IO}, {MODE_CONTESTIA_16_1000,&contestia_16_1000_modem,"Cont-16/1K","Cont16-1K","","CONTESTI16/1000","CONTESTI","","CT16/1K",DISABLED_IO}, {MODE_CONTESTIA_16_2000,&contestia_16_2000_modem,"Cont-16/2K","Cont16-2K","","CONTESTI16/2000","CONTESTI","","CT16/2K",DISABLED_IO}, {MODE_CONTESTIA_32_1000,&contestia_32_1000_modem,"Cont-32/1K","Cont32-1K","","CONTESTI32/1000","CONTESTI","","CT32/1K",DISABLED_IO}, {MODE_CONTESTIA_32_2000,&contestia_32_2000_modem,"Cont-32/2K","Cont32-2K","","CONTESTI32/2000","CONTESTI","","CT32/2K",DISABLED_IO}, {MODE_CONTESTIA_64_500,&contestia_64_500_modem,"Cont-64/500","Cont64-500","","CONTESTI64/500","CONTESTI","","CT64/500",DISABLED_IO}, {MODE_CONTESTIA_64_1000,&contestia_64_1000_modem,"Cont-64/1K","Cont64-1K","","CONTESTI64/1000","CONTESTI","","CT64/1K",DISABLED_IO}, {MODE_CONTESTIA_64_2000,&contestia_64_2000_modem,"Cont-64/2K","Cont64-2K","","CONTESTI64/2000","CONTESTI","","CT64/2K",DISABLED_IO}, {MODE_DOMINOEXMICRO,&dominoexmicro_modem,"DOMEX Micro","DominoEX Micro","DOMINOEXMICRO","DOMINO","DOMINO","","DM M", DISABLED_IO }, {MODE_DOMINOEX4,&dominoex4_modem,"DOMEX4","DominoEX 4","DOMINOEX4","DOMINO","DOMINO","","DM 4", DISABLED_IO }, {MODE_DOMINOEX5,&dominoex5_modem,"DOMEX5","DominoEX 5","DOMINOEX5","DOMINO","DOMINO","","DM 5", DISABLED_IO }, {MODE_DOMINOEX8,&dominoex8_modem,"DOMEX8","DominoEX 8","DOMINOEX8","DOMINO","DOMINO","","DM 8", DISABLED_IO }, {MODE_DOMINOEX11,&dominoex11_modem,"DOMX11","DominoEX 11","DOMINOEX11","DOMINO","DOMINO","","DM11", DISABLED_IO }, {MODE_DOMINOEX16,&dominoex16_modem,"DOMX16","DominoEX 16","DOMINOEX16","DOMINO","DOMINO","","DM16", ARQ_IO | KISS_IO }, {MODE_DOMINOEX22,&dominoex22_modem,"DOMX22","DominoEX 22","DOMINOEX22","DOMINO","DOMINO","","DM22", ARQ_IO | KISS_IO }, {MODE_DOMINOEX44,&dominoex44_modem,"DOMX44","DominoEX 44","DOMINOEX44","DOMINO","DOMINO","","DM44", ARQ_IO | KISS_IO }, {MODE_DOMINOEX88,&dominoex88_modem,"DOMX88","DominoEX 88","DOMINOEX88","DOMINO","DOMINO","","DM88", ARQ_IO | KISS_IO }, {MODE_FELDHELL,&feld_modem,"FELDHELL","Feld Hell","","HELL","HELL","","HELL", DISABLED_IO }, {MODE_SLOWHELL,&feld_slowmodem,"SLOWHELL","Slow Hell","","HELL","HELL","","SHLL", DISABLED_IO }, {MODE_HELLX5,&feld_x5modem,"HELLX5","Feld Hell X5","","HELL","HELL","","HLX5", DISABLED_IO }, {MODE_HELLX9,&feld_x9modem,"HELLX9","Feld Hell X9","","HELL","HELL","","HLX9", DISABLED_IO }, {MODE_FSKHELL,&feld_FMmodem,"FSKHELL","FSK Hell","","FSKHELL","HELL","FSKHELL","FSKHL", DISABLED_IO }, {MODE_FSKH105,&feld_FM105modem,"FSKH105","FSK Hell-105","","FMHELL","HELL","FMHELL","H105", DISABLED_IO }, {MODE_HELL80,&feld_80modem,"HELL80","Hell 80","","HELL80","HELL","HELL80","HL80", DISABLED_IO }, {MODE_MFSK8,&mfsk8_modem,"MFSK8","MFSK-8","MFSK8","MFSK8","MFSK","MFSK8","MK 8", DISABLED_IO }, {MODE_MFSK16,&mfsk16_modem,"MFSK16","MFSK-16","MFSK16","MFSK16","MFSK","MFSK16","MK16", ARQ_IO | KISS_IO }, {MODE_MFSK32,&mfsk32_modem,"MFSK32","MFSK-32","MFSK32","MFSK32","MFSK","MFSK32","MK32", ARQ_IO | KISS_IO }, {MODE_MFSK4,&mfsk4_modem,"MFSK4","MFSK-4","MFSK4","MFSK4","MFSK","MFSK4","MK 4", DISABLED_IO }, {MODE_MFSK11,&mfsk11_modem,"MFSK11","MFSK-11","MFSK11","MFSK11","MFSK","MFSK11","MK11", DISABLED_IO }, {MODE_MFSK22,&mfsk22_modem,"MFSK22","MFSK-22","MFSK22","MFSK22","MFSK","MFSK22","MK22", DISABLED_IO }, {MODE_MFSK31,&mfsk31_modem,"MFSK31","MFSK-31","MFSK31","MFSK31","MFSK","MFSK31","MK31", ARQ_IO | KISS_IO }, {MODE_MFSK64,&mfsk64_modem,"MFSK64","MFSK-64","MFSK64","MFSK64","MFSK","MFSK64","MK64", ARQ_IO | KISS_IO }, {MODE_MFSK128,&mfsk128_modem,"MFSK128","MFSK-128","MFSK128","MFSK128","MFSK","MFSK128","MK128", ARQ_IO | KISS_IO }, {MODE_MFSK64L,&mfsk64l_modem,"MFSK64L","MFSK-64L","MFSK64L","MFSK64L","MFSK","MFSK64","MK64L", ARQ_IO | KISS_IO }, {MODE_MFSK128L,&mfsk128l_modem,"MFSK128L","MFSK-128L","MFSK128L","MFSK128L","MFSK","MFSK128","MK128L", ARQ_IO | KISS_IO }, {MODE_WEFAX_576,&wefax576_modem,"WEFAX576","WEFAX-IOC576","WEFAXIOC576","FAX","FAX","","FX576", DISABLED_IO }, {MODE_WEFAX_288,&wefax288_modem,"WEFAX288","WEFAX-IOC288","WEFAXIOC288","FAX","FAX","","FX288", DISABLED_IO }, {MODE_NAVTEX,&navtex_modem,"NAVTEX","NAVTEX","NAVTEX","TOR","NAVTEX","","NAVTEX", DISABLED_IO }, {MODE_SITORB,&sitorb_modem,"SITORB","SITORB","SITORB","TOR","SITORB","","SITORB", DISABLED_IO }, {MODE_MT63_500S,&mt63_500S_modem,"MT63-500S","MT63-500S","MT63-500S","MT63-500S","MT63","","MT63-500S", ARQ_IO | KISS_IO }, {MODE_MT63_500L,&mt63_500L_modem,"MT63-500L","MT63-500L","MT63-500L","MT63-500L","MT63","","MT63-500L", ARQ_IO | KISS_IO }, {MODE_MT63_1000S,&mt63_1000S_modem,"MT63-1KS","MT63-1000S","MT63-1XXS","MT63-1KS","MT63","","MT63 1KS", ARQ_IO | KISS_IO }, {MODE_MT63_1000L,&mt63_1000L_modem,"MT63-1KL","MT63-1000L","MT63-1XXL","MT63-1KL","MT63","","MT63 1KL", ARQ_IO | KISS_IO }, {MODE_MT63_2000S,&mt63_2000S_modem,"MT63-2KS","MT63-2000S","MT63-2XXS","MT63-2KS","MT63","","MT63 2KS", ARQ_IO | KISS_IO }, {MODE_MT63_2000L,&mt63_2000L_modem,"MT63-2KL","MT63-2000L","MT63-2XXL","MT63-2KL","MT63","","MT63 2KL", ARQ_IO | KISS_IO }, {MODE_PSK31,&psk31_modem,"BPSK31","BPSK-31","PSK31","PSK31","PSK","PSK31","P31", ARQ_IO | KISS_IO }, {MODE_PSK63,&psk63_modem,"BPSK63","BPSK-63","PSK63","PSK63","PSK","PSK63","P63", ARQ_IO | KISS_IO }, {MODE_PSK63F,&psk63f_modem,"BPSK63F","BPSK-63F","PSK63F","PSK63F","PSK","PSK63F","P63F", ARQ_IO | KISS_IO }, {MODE_PSK125,&psk125_modem,"BPSK125","BPSK-125","PSK125","PSK125","PSK","PSK125","P125", ARQ_IO | KISS_IO }, {MODE_PSK250,&psk250_modem,"BPSK250","BPSK-250","PSK250","PSK250","PSK","PSK250","P250", ARQ_IO | KISS_IO }, {MODE_PSK500,&psk500_modem,"BPSK500","BPSK-500","PSK500","PSK500","PSK","PSK500","P500", ARQ_IO | KISS_IO }, {MODE_PSK1000,&psk1000_modem,"BPSK1000","BPSK-1000","PSK1000","PSK1000","PSK","PSK1000","P1000", ARQ_IO | KISS_IO }, {MODE_12X_PSK125,&psk125_c12_modem,"PSK125C12","12xPSK125","PSK125C12","PSK125C12","PSK","","P125C12", ARQ_IO | KISS_IO }, {MODE_6X_PSK250,&psk250_c6_modem,"PSK250C6","6xPSK250","PSK250C6","PSK250C6","PSK","","P2506", ARQ_IO | KISS_IO }, {MODE_2X_PSK500,&psk500_c2_modem,"PSK500C2","2xPSK500","PSK500C2","PSK500C2","PSK","","2xP500", ARQ_IO | KISS_IO }, {MODE_4X_PSK500,&psk500_c4_modem,"PSK500C4","4xPSK500","PSK500C4","PSK500C4","PSK","","4xP500", ARQ_IO | KISS_IO }, {MODE_2X_PSK800,&psk800_c2_modem,"PSK800C2","2xPSK800","PSK800C2","PSK800C2","PSK","","P800RC2", ARQ_IO | KISS_IO }, {MODE_2X_PSK1000,&psk1000_c2_modem,"PSK1000C2","2xPSK1000","PSK1000C2","PSK1000C2","PSK","","P1KC2", ARQ_IO | KISS_IO }, {MODE_QPSK31,&qpsk31_modem,"QPSK31","QPSK-31","QPSK31","QPSK31","PSK","QPSK31","Q31", ARQ_IO | KISS_IO }, {MODE_QPSK63,&qpsk63_modem,"QPSK63","QPSK-63","QPSK63","QPSK63","PSK","QPSK63","Q63", ARQ_IO | KISS_IO }, {MODE_QPSK125,&qpsk125_modem,"QPSK125","QPSK-125","QPSK125","QPSK125","PSK","QPSK125","Q125", ARQ_IO | KISS_IO }, {MODE_QPSK250,&qpsk250_modem,"QPSK250","QPSK-250","QPSK250","QPSK250","PSK","QPSK250","Q250", ARQ_IO | KISS_IO }, {MODE_QPSK500,&qpsk500_modem,"QPSK500","QPSK-500","QPSK500","QPSK500","PSK","QPSK500","Q500", ARQ_IO | KISS_IO }, {MODE_8PSK125,&_8psk125_modem,"8PSK125","8PSK-125","8PSK125","8PSK125","PSK","","8PSK125", ARQ_IO | KISS_IO }, {MODE_8PSK125FL,&_8psk125fl_modem,"8PSK125FL","8PSK-125FL","8PSK125FL","8PSK125FL","PSK","","8PSK125FL", ARQ_IO | KISS_IO }, {MODE_8PSK125F,&_8psk125f_modem,"8PSK125F","8PSK-125F","8PSK125F","8PSK125F","PSK","","8PSK125F", ARQ_IO | KISS_IO }, {MODE_8PSK250,&_8psk250_modem,"8PSK250","8PSK-250","8PSK250","8PSK250","PSK","","8PSK250", ARQ_IO | KISS_IO }, {MODE_8PSK250FL,&_8psk250fl_modem,"8PSK250FL","8PSK-250FL","8PSK250FL","8PSK250F","PSK","","8PSK250FL", ARQ_IO | KISS_IO }, {MODE_8PSK250F,&_8psk250f_modem,"8PSK250F","8PSK-250F","8PSK250F","8PSK250F","PSK","","8PSK250F", ARQ_IO | KISS_IO }, {MODE_8PSK500,&_8psk500_modem,"8PSK500","8PSK-500","8PSK500","8PSK500","PSK","","8PSK500", ARQ_IO | KISS_IO }, {MODE_8PSK500F,&_8psk500f_modem,"8PSK500F","8PSK-500F","8PSK500F","8PSK500F","PSK","","8PSK500F", ARQ_IO | KISS_IO }, {MODE_8PSK1000,&_8psk1000_modem,"8PSK1000","8PSK-1000","8PSK1000","8PSK1000","PSK","","8PSK1000", ARQ_IO | KISS_IO }, {MODE_8PSK1000F,&_8psk1000f_modem,"8PSK1000F","8PSK-1000F","8PSK1000F","8PSK1000F","PSK","","8PSK1000F", ARQ_IO | KISS_IO }, {MODE_8PSK1200F,&_8psk1200f_modem,"8PSK1200F","8PSK-1200F","8PSK1200F","8PSK1200F","PSK","","8PSK1200F", ARQ_IO | KISS_IO }, {MODE_OLIVIA,&olivia_modem,"OLIVIA","OLIVIA","OLIVIA","OLIVIA","OLIVIA","","OL", DISABLED_IO }, {MODE_OLIVIA_4_125,&olivia_4_125_modem,"OLIVIA-4/125","OL 4-125","OLIV 4-125","OLIVIA 4/125","OLIVIA","OLIVIA 4/125","OL4/125", ARQ_IO }, {MODE_OLIVIA_4_250,&olivia_4_250_modem,"OLIVIA-4/250","OL 4-250","OLIV 4-250","OLIVIA 4/250","OLIVIA","OLIVIA 4/250","OL4/250", ARQ_IO }, {MODE_OLIVIA_4_500,&olivia_4_500_modem,"OLIVIA-4/500","OL 4-500","OLIV 4-500","OLIVIA 4/500","OLIVIA","OLIVIA 4/500","OL4/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_4_1000,&olivia_4_1000_modem,"OLIVIA-4/1K","OL 4-1K","OLIV 4-1K","OLIVIA 4/1K","OLIVIA","OLIVIA 4/1K","OL4/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_4_2000,&olivia_4_2000_modem,"OLIVIA-4/2K","OL 4-2K","OLIV 4-2K","OLIVIA 4/2K","OLIVIA","OLIVIA 4/2K","OL4/2K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_8_125,&olivia_8_125_modem,"OLIVIA-8/125","OL 8-125","OLIV 8-125","OLIVIA 8/125","OLIVIA","OLIVIA 8/125","OL8/125", ARQ_IO }, {MODE_OLIVIA_8_250,&olivia_8_250_modem,"OLIVIA-8/250","OL 8-250","OLIV 8-250","OLIVIA 8/250","OLIVIA","OLIVIA 8/250","OL8/250", ARQ_IO }, {MODE_OLIVIA_8_500,&olivia_8_500_modem,"OLIVIA-8/500","OL 8-500","OLIV 8-500","OLIVIA 8/500","OLIVIA","OLIVIA 8/500","OL8/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_8_1000,&olivia_8_1000_modem,"OLIVIA-8/1K","OL 8-1K","OLIV 8-1K","OLIVIA 8/1K","OLIVIA","OLIVIA 8/1K","OL8/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_8_2000,&olivia_8_2000_modem,"OLIVIA-8/2K","OL 8-2K","OLIV 8-2K","OLIVIA 8/2K","OLIVIA","OLIVIA 8/2K","OL8/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_16_500,&olivia_16_500_modem,"OLIVIA-16/500","OL 16-500","OLIV 16-500","OLIVIA 16/500","OLIVIA","OLIVIA 16/500","OL16/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_16_1000,&olivia_16_1000_modem,"OLIVIA-16/1K","OL 16-1K","OLIV 16-1K","OLIVIA 16/1K","OLIVIA","OLIVIA 16/1K","OL16/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_16_1000,&olivia_16_2000_modem,"OLIVIA-16/2K","OL 16-2K","OLIV 16-2K","OLIVIA 16/2K","OLIVIA","OLIVIA 16/2K","OL16/2K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_32_1000,&olivia_32_1000_modem,"OLIVIA-32/1K","OL 32-1K","OLIV 32-1K","OLIVIA 32/1K","OLIVIA","OLIVIA 32/1K","OL32/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_32_2000,&olivia_32_2000_modem,"OLIVIA-32/2K","OL 32-2K","OLIV 32-2K","OLIVIA 32/2K","OLIVIA","OLIVIA 32/2K","OL32/2K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_64_500,&olivia_64_500_modem,"OLIVIA-64/500","OL 64-500","OLIV 64-500","OLIVIA 64/500","OLIVIA","","OL64/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_64_1000,&olivia_64_1000_modem,"OLIVIA-64/1K","OL 64-1K","OLIV 64-1K","OLIVIA 64/1K","OLIVIA","","OL64/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_64_2000,&olivia_64_2000_modem,"OLIVIA-64/2K","OL 64-2K","OLIV 64-2K","OLIVIA 64/2K","OLIVIA","","OL64/2K", ARQ_IO | KISS_IO }, {MODE_RTTY,&rtty_modem,"RTTY","RTTY","RTTY","RTTY","RTTY","","RY", DISABLED_IO }, {MODE_THORMICRO,&thormicro_modem,"THOR Micro","THOR Micro","THORM","THOR-M","THOR","","THM", DISABLED_IO }, {MODE_THOR4,&thor4_modem,"THOR4","THOR 4","THOR4","THOR4","THOR","","TH4", DISABLED_IO }, {MODE_THOR5,&thor5_modem,"THOR5","THOR 5","THOR5","THOR5","THOR","","TH5", DISABLED_IO }, {MODE_THOR8,&thor8_modem,"THOR8","THOR 8","THOR8","THOR8","THOR","","TH8", DISABLED_IO }, {MODE_THOR11,&thor11_modem,"THOR11","THOR 11","THOR11","THOR11","THOR","","TH11", DISABLED_IO }, {MODE_THOR16,&thor16_modem,"THOR16","THOR 16","THOR16","THOR16","THOR","","TH16", ARQ_IO | KISS_IO }, {MODE_THOR22,&thor22_modem,"THOR22","THOR 22","THOR22","THOR22","THOR","","TH22", ARQ_IO | KISS_IO }, {MODE_THOR25x4,&thor25x4_modem,"THOR25x4","THOR 25 x4","THOR25x4","THOR-25X4","THOR","","TH25", ARQ_IO | KISS_IO }, {MODE_THOR50x1,&thor50x1_modem,"THOR50x1","THOR 50 x1","THOR50x1","THOR-50X1","THOR","","TH51", ARQ_IO | KISS_IO }, {MODE_THOR50x2,&thor50x2_modem,"THOR50x2","THOR 50 x2","THOR50x2","THOR-50X2","THOR","","TH52", ARQ_IO | KISS_IO }, {MODE_THOR100,&thor100_modem,"THOR100","THOR 100","THOR100","THOR-100","THOR","","TH100", ARQ_IO | KISS_IO }, {MODE_THROB1,&throb1_modem,"THROB1","Throb 1","","THRB","THRB","","TB1", DISABLED_IO }, {MODE_THROB2,&throb2_modem,"THROB2","Throb 2","","THRB","THRB","","TB2", DISABLED_IO }, {MODE_THROB4,&throb4_modem,"THROB4","Throb 4","","THRB","THRB","","TB4", DISABLED_IO }, {MODE_THROBX1,&throbx1_modem,"THRBX1","ThrobX 1","","THRBX","THRB","THRBX","TX1", DISABLED_IO }, {MODE_THROBX2,&throbx2_modem,"THRBX2","ThrobX 2","","THRBX","THRB","THRBX","TX2", DISABLED_IO }, {MODE_THROBX4,&throbx4_modem,"THRBX4","ThrobX 4","","THRBX","THRB","THRBX","TX4", DISABLED_IO }, //{MODE_PACKET,&pkt_modem,"PACKET","Packet","","PKT","PKT","PKT",ARQ_IO | KISS_IO }, {MODE_PSK125R,&psk125r_modem,"PSK125R","PSK-125R","PSK125R","PSK125R","PSK","","P125R", ARQ_IO | KISS_IO }, {MODE_PSK250R,&psk250r_modem,"PSK250R","PSK-250R","PSK250R","PSK250R","PSK","","P250R", ARQ_IO | KISS_IO }, {MODE_PSK500R,&psk500r_modem,"PSK500R","PSK-500R","PSK500R","PSK500R","PSK","","P500R", ARQ_IO | KISS_IO }, {MODE_PSK1000R,&psk1000r_modem,"PSK1000R","PSK-1000R","PSK1000R","PSK1000R","PSK","","PSK1000R", ARQ_IO | KISS_IO }, {MODE_4X_PSK63R,&psk63r_c4_modem,"PSK63RC4","4xPSK63R","PSK63RC4","PSK63RC4","PSK","","P63R4", ARQ_IO | KISS_IO }, {MODE_5X_PSK63R,&psk63r_c5_modem,"PSK63RC5","5xPSK63R","PSK63RC5","PSK63RC5","PSK","","P63R5", ARQ_IO | KISS_IO }, {MODE_10X_PSK63R,&psk63r_c10_modem,"PSK63RC10","10xPSK63R","PSK63RC10","PSK63RC10","PSK","","P63R10", ARQ_IO | KISS_IO }, {MODE_20X_PSK63R,&psk63r_c20_modem,"PSK63RC20","20xPSK63R","PSK63RC20","PSK63RC20","PSK","","P63R20", ARQ_IO | KISS_IO }, {MODE_32X_PSK63R,&psk63r_c32_modem,"PSK63RC32","32xPSK63R","PSK63RC32","PSK63RC32","PSK","","P63R32", ARQ_IO | KISS_IO }, {MODE_4X_PSK125R,&psk125r_c4_modem,"PSK125RC4","4xPSK125R","PSK125RC4","PSK125RC4","PSK","","P125R4", ARQ_IO | KISS_IO }, {MODE_5X_PSK125R,&psk125r_c5_modem,"PSK125RC5","5xPSK125R","PSK125RC5","PSK125RC5","PSK","","P125R5", ARQ_IO | KISS_IO }, {MODE_10X_PSK125R,&psk125r_c10_modem,"PSK125RC10","10xPSK125R","PSK125RC10","PSK125RC10","PSK","","P125R10", ARQ_IO | KISS_IO }, {MODE_12X_PSK125R,&psk125r_c12_modem,"PSK125RC12","12xPSK125R","PSK125RC12","PSK125RC12","PSK","","P125R12", ARQ_IO | KISS_IO }, {MODE_16X_PSK125R,&psk125r_c16_modem,"PSK125RC16","16xPSK125R","PSK125RC16","PSK125RC16","PSK","","P125R16", ARQ_IO | KISS_IO }, {MODE_2X_PSK250R,&psk250r_c2_modem,"PSK250RC2","2xPSK250R","PSK250RC2","PSK250RC2","PSK","","P250R2", ARQ_IO | KISS_IO }, {MODE_3X_PSK250R,&psk250r_c3_modem,"PSK250RC3","3xPSK250R","PSK250RC3","PSK250RC3","PSK","","P250R3", ARQ_IO | KISS_IO }, {MODE_5X_PSK250R,&psk250r_c5_modem,"PSK250RC5","5xPSK250R","PSK250RC5","PSK250RC5","PSK","","P250R5", ARQ_IO | KISS_IO }, {MODE_6X_PSK250R,&psk250r_c6_modem,"PSK250RC6","6xPSK250R","PSK250RC6","PSK250RC6","PSK","","P250R6", ARQ_IO | KISS_IO }, {MODE_7X_PSK250R,&psk250r_c7_modem,"PSK250RC7","7xPSK250R","PSK250RC7","PSK250RC7","PSK","","P250R7", ARQ_IO | KISS_IO }, {MODE_2X_PSK500R,&psk500r_c2_modem,"PSK500RC2","2xPSK500R","PSK500RC2","PSK500RC2","PSK","","P500R2", ARQ_IO | KISS_IO }, {MODE_3X_PSK500R,&psk500r_c3_modem,"PSK500RC3","3xPSK500R","PSK500RC3","PSK500RC3","PSK","","P500R3", ARQ_IO | KISS_IO }, {MODE_4X_PSK500R,&psk500r_c4_modem,"PSK500RC4","4xPSK500R","PSK500RC4", "PSK500RC4","PSK","","P500R4", ARQ_IO | KISS_IO }, {MODE_2X_PSK800R,&psk800r_c2_modem,"PSK800RC2","2xPSK800R","PSK800RC2","PSK800RC2","PSK","","P800RC2", ARQ_IO | KISS_IO }, {MODE_2X_PSK1000R,&psk1000r_c2_modem,"PSK1000RC2","2xPSK1000R","PSK1000RC2","PSK1000RC2","PSK","","P1KRC2", ARQ_IO | KISS_IO }, {MODE_FSQ,&fsq_modem,"FSQ","FSQ","FSQ","FSQ","FSQ","","FSQ", DISABLED_IO }, {MODE_IFKP,&ifkp_modem,"IFKP","IFKP","IFKP","IFKP","IFKP","","IFKP", DISABLED_IO }, {MODE_SSB,&ssb_modem,"SSB","SSB","","SSB","SSB","","", DISABLED_IO }, {MODE_WWV,&wwv_modem,"WWV","WWV","","","","","", DISABLED_IO }, {MODE_ANALYSIS,&anal_modem,"ANALYSIS","Freq Analysis","","","","","", DISABLED_IO } }; std::string adif2export(std::string adif) { std::string test = ucasestr(adif); for (int n = 0; n < NUM_MODES; n++) { if (test == ucasestr(mode_info[n].sname) || test == ucasestr(mode_info[n].adif_name) || test == ucasestr(mode_info[n].export_mode) || test == ucasestr(mode_info[n].export_submode)) return ucasestr(mode_info[n].export_mode); } return test; } std::string adif2submode(std::string adif) { std::string test = ucasestr(adif); for (int n = 0; n < NUM_MODES; n++) { if (test == ucasestr(mode_info[n].sname) || test == ucasestr(mode_info[n].adif_name) || test == ucasestr(mode_info[n].export_mode) || test == ucasestr(mode_info[n].export_submode)) return ucasestr(mode_info[n].export_submode); } return ""; } std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m) { return s << m.rfcarrier << ' ' << m.rmode << ' ' << m.carrier << ' ' << mode_info[m.mode].sname << ' ' << m.usage; } std::istream& operator>>(std::istream& s, qrg_mode_t& m) { string sMode; char temp[255]; int mnbr; s >> m.rfcarrier >> m.rmode >> m.carrier >> sMode; s.getline(temp, 255); m.usage = temp; while (m.usage[0] == ' ') m.usage.erase(0,1); // handle case for reading older type of specification string if (sscanf(sMode.c_str(), "%d",&mnbr)) { m.mode = mnbr; return s; } m.mode = MODE_PSK31; for (mnbr = MODE_CW; mnbr < NUM_MODES; mnbr++) if (sMode == mode_info[mnbr].sname) { m.mode = mnbr; break; } return s; } std::string qrg_mode_t::str(void) { ostringstream s; s << setiosflags(ios::fixed) << setprecision(3) << rfcarrier/1000.0 << '|' << rmode << '|' << (mode < NUM_MODES ? mode_info[mode].sname : "NONE") << '|' // << carrier; << carrier << '|' << usage; return s.str(); } band_t band(long long freq_hz) { switch (freq_hz / 1000000LL) { case 0: case 1: return BAND_160M; case 3: return BAND_80M; case 4: return BAND_75M; case 5: return BAND_60M; case 7: return BAND_40M; case 10: return BAND_30M; case 14: return BAND_20M; case 18: return BAND_17M; case 21: return BAND_15M; case 24: return BAND_12M; case 28 ... 29: return BAND_10M; case 50 ... 54: return BAND_6M; case 70 ... 71: return BAND_4M; case 144 ... 148: return BAND_2M; case 222 ... 225: return BAND_125CM; case 420 ... 450: return BAND_70CM; case 902 ... 928: return BAND_33CM; case 1240 ... 1325: return BAND_23CM; case 2300 ... 2450: return BAND_13CM; case 3300 ... 3500: return BAND_9CM; case 5650 ... 5925: return BAND_6CM; case 10000 ... 10500: return BAND_3CM; case 24000 ... 24250: return BAND_125MM; case 47000 ... 47200: return BAND_6MM; case 75500 ... 81000: return BAND_4MM; case 119980 ... 120020: return BAND_2P5MM; case 142000 ... 149000: return BAND_2MM; case 241000 ... 250000: return BAND_1MM; } return BAND_OTHER; } band_t band(const char* freq_mhz) { errno = 0; double d = strtod(freq_mhz, NULL); if (d != 0.0 && errno == 0) return band((long long)(d * 1e6)); else return BAND_OTHER; } struct band_freq_t { const char* band; const char* freq; }; static struct band_freq_t band_names[NUM_BANDS] = { { "160m", "1.8" }, { "80m", "3.5" }, { "75m", "4.0" }, { "60m", "5.3" }, { "40m", "7.0" }, { "30m", "10.0" }, { "20m", "14.0" }, { "17m", "18.0" }, { "15m", "21.0" }, { "12m", "24.0" }, { "10m", "28.0" }, { "6m", "50.0" }, { "4m", "70.0" }, { "2m", "144.0" }, { "1.25m", "222.0" }, { "70cm", "420.0" }, { "33cm", "902.0" }, { "23cm", "1240.0" }, { "13cm", "2300.0" }, { "9cm", "3300.0" }, { "6cm", "5650.0" }, { "3cm", "10000.0" }, { "1.25cm", "24000.0" }, { "6mm", "47000.0" }, { "4mm", "75500.0" }, { "2.5mm", "119980.0" }, { "2mm", "142000.0" }, { "1mm", "241000.0" }, { "other", "" } }; const char* band_name(band_t b) { return band_names[CLAMP(b, 0, NUM_BANDS-1)].band; } const char* band_name(const char* freq_mhz) { return band_name(band(freq_mhz)); } const char* band_freq(band_t b) { return band_names[CLAMP(b, 0, NUM_BANDS-1)].freq; } const char* band_freq(const char* band_name) { for (size_t i = 0; i < BAND_OTHER; i++) if (!strcmp(band_names[i].band, band_name)) return band_names[i].freq; return ""; } fldigi-4.1.06/src/widgets/0000775000175000017500000000000013515625027012306 500000000000000fldigi-4.1.06/src/widgets/flslider2.cxx0000644000175000017500000001633613472116000014633 00000000000000// ---------------------------------------------------------------------------- // flslider2.cxx // // Copyright (C) 2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include "flslider2.h" inline static int handle_scroll(Fl_Valuator* w, int event) { if (!(event == FL_MOUSEWHEEL && Fl::event_inside(w))) return 0; double d; if ((d = Fl::event_dy()) || (d = Fl::event_dx())) { if (Fl::event_state() & FL_SHIFT) d *= 10.0; if (!dynamic_cast(w) && !dynamic_cast(w) && !(w->type() & FL_HOR_SLIDER)) d = -d; w->value(w->clamp(w->increment(w->value(), static_cast(-d)))); w->do_callback(); } return 1; } int Fl_Slider2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Slider::handle(event); } int Fl_Value_Slider2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Value_Slider::handle(event); } int Fl_Value_Input2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Value_Input::handle(event); } inline static int handle_scroll(Fl_Spinner* w, int event) { if (!(event == FL_MOUSEWHEEL && Fl::event_inside(w))) return 0; double d; if ((d = Fl::event_dy()) || (d = Fl::event_dx())) { if (Fl::event_state() & FL_SHIFT) d *= 10.0; d = w->value() - d * w->step(); w->value(WCLAMP(d, w->minimum(), w->maximum())); w->do_callback(); } return 1; } int Fl_Spinner2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Spinner::handle(event); } // // Counter widget for FLDIGI modified from FLTK // // Counter widget for the Fast Light Tool Kit (FLTK). // #include void My_Counter::draw() { int i; Fl_Boxtype boxtype[5]; Fl_Color selcolor; boxtype[0] = box(); if (boxtype[0] == FL_UP_BOX) boxtype[0] = FL_DOWN_BOX; if (boxtype[0] == FL_THIN_UP_BOX) boxtype[0] = FL_THIN_DOWN_BOX; for (i=1; i<5; i++) if (mouseobj == i) boxtype[i] = fl_down(box()); else boxtype[i] = box(); int xx[5], ww[5]; if (type() == FL_NORMAL_COUNTER) { int W = w()*15/100; xx[1] = x(); ww[1] = W; xx[2] = x()+1*W; ww[2] = W; xx[0] = x()+2*W; ww[0] = w()-4*W; xx[3] = x()+w()-2*W; ww[3] = W; xx[4] = x()+w()-1*W; ww[4] = W; } else { int W = w()*20/100; xx[1] = 0; ww[1] = 0; xx[2] = x(); ww[2] = W; xx[0] = x()+W; ww[0] = w()-2*W; xx[3] = x()+w()-1*W; ww[3] = W; xx[4] = 0; ww[4] = 0; } draw_box(boxtype[0], xx[0], y(), ww[0], h(), bkcolor_); fl_font(textfont(), textsize()); fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); char str[128]; format(str); fl_draw(str, xx[0], y(), ww[0], h(), FL_ALIGN_CENTER); if (Fl::focus() == this) draw_focus(boxtype[0], xx[0], y(), ww[0], h()); if (!(damage()&FL_DAMAGE_ALL)) return; // only need to redraw text if (active_r()) selcolor = labelcolor(); else selcolor = fl_inactive(labelcolor()); if (type() == FL_NORMAL_COUNTER) { draw_box(boxtype[1], xx[1], y(), ww[1], h(), color()); fl_draw_symbol("@-4<<", xx[1], y(), ww[1], h(), selcolor); } draw_box(boxtype[2], xx[2], y(), ww[2], h(), color()); fl_draw_symbol("@-4<", xx[2], y(), ww[2], h(), selcolor); draw_box(boxtype[3], xx[3], y(), ww[3], h(), color()); fl_draw_symbol("@-4>", xx[3], y(), ww[3], h(), selcolor); if (type() == FL_NORMAL_COUNTER) { draw_box(boxtype[4], xx[4], y(), ww[4], h(), color()); fl_draw_symbol("@-4>>", xx[4], y(), ww[4], h(), selcolor); } } void My_Counter::increment_cb() { if (!mouseobj) return; double v = value(); switch (mouseobj) { case 1: v -= lstep_; break; case 2: v = increment(v, -1); break; case 3: v = increment(v, 1); break; case 4: v += lstep_; break; } handle_drag(clamp(round(v))); } #define INITIALREPEAT .5 #define REPEAT .1 void My_Counter::repeat_callback(void* v) { My_Counter* b = (My_Counter*)v; if (b->mouseobj) { Fl::add_timeout(REPEAT, repeat_callback, b); b->increment_cb(); } } int My_Counter::calc_mouseobj() { if (type() == FL_NORMAL_COUNTER) { int W = w()*15/100; if (Fl::event_inside(x(), y(), W, h())) return 1; if (Fl::event_inside(x()+W, y(), W, h())) return 2; if (Fl::event_inside(x()+w()-2*W, y(), W, h())) return 3; if (Fl::event_inside(x()+w()-W, y(), W, h())) return 4; } else { int W = w()*20/100; if (Fl::event_inside(x(), y(), W, h())) return 2; if (Fl::event_inside(x()+w()-W, y(), W, h())) return 3; } return -1; } int My_Counter::handle(int event) { int i; switch (event) { case FL_RELEASE: if (mouseobj) { Fl::remove_timeout(repeat_callback, this); mouseobj = 0; redraw(); } handle_release(); return 1; case FL_PUSH: if (Fl::visible_focus()) Fl::focus(this); { Fl_Widget_Tracker wp(this); handle_push(); if (wp.deleted()) return 1; } case FL_DRAG: i = calc_mouseobj(); if (i != mouseobj) { Fl::remove_timeout(repeat_callback, this); mouseobj = (uchar)i; if (i) Fl::add_timeout(INITIALREPEAT, repeat_callback, this); Fl_Widget_Tracker wp(this); increment_cb(); if (wp.deleted()) return 1; redraw(); } return 1; case FL_KEYBOARD : switch (Fl::event_key()) { case FL_Left: handle_drag(clamp(increment(value(),-1))); return 1; case FL_Right: handle_drag(clamp(increment(value(),1))); return 1; default: return 0; } // break not required because of switch... case FL_FOCUS : /* FALLTHROUGH */ case FL_UNFOCUS : if (Fl::visible_focus()) { redraw(); return 1; } else return 0; case FL_ENTER : /* FALLTHROUGH */ case FL_LEAVE : return 1; default: return 0; } } /** Destroys the valuator. */ My_Counter::~My_Counter() { Fl::remove_timeout(repeat_callback, this); } /** Creates a new My_Counter widget using the given position, size, and label string. The default type is FL_NORMAL_COUNTER. \param[in] X, Y, W, H position and size of the widget \param[in] L widget label, default is no label */ My_Counter::My_Counter(int X, int Y, int W, int H, const char* L) : Fl_Valuator(X, Y, W, H, L) { box(FL_UP_BOX); selection_color(FL_INACTIVE_COLOR); // was FL_BLUE align(FL_ALIGN_BOTTOM); bounds(-1000000.0, 1000000.0); Fl_Valuator::step(1, 10); lstep_ = 1.0; mouseobj = 0; textfont_ = FL_HELVETICA; textsize_ = FL_NORMAL_SIZE; textcolor_ = FL_FOREGROUND_COLOR; bkcolor_ = FL_BACKGROUND2_COLOR; } int Fl_Counter2::handle(int event) { return handle_scroll(this, event) ? 1 : My_Counter::handle(event); } fldigi-4.1.06/src/widgets/Fl_Text_Buffer_mod.cxx0000644000175000017500000013223113472116000016433 00000000000000// // "$Id: Fl_Text_Buffer_mod.cxx 8040 2010-12-15 17:38:39Z manolo $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" #include /* This file is based on a port of NEdit to FLTK many years ago. NEdit at that point was already stretched beyond the task it was designed for which explains why the source code is sometimes pretty convoluted. It still is a very useful widget for FLTK, and we are thankful that the nedit team allowed us to integrate their code. With the introduction of Unicode and UTF-8, Fl_Text_... has to go into a whole new generation of code. Originally designed for monospaced fonts only, many features make less sense in the multibyte and multiwidth world of UTF-8. Columns are a good example. There is simply no such thing. The new Fl_Text_... widget converts columns to pixels by multiplying them with the average character width for a given font. Rectangular selections were rarely used (if at all) and make little sense when using variable width fonts. They have been removed. Using multiple spaces to emulate tab stops has been replaced by pixel counting routines. They are slower, but give the expected result for proportional fonts. And constantly recalculating character widths is just much too expensive. Lines of text are now subdivided into blocks of text which are measured at once instead of individual characters. */ #ifndef min static int max(int i1, int i2) { return i1 >= i2 ? i1 : i2; } static int min(int i1, int i2) { return i1 <= i2 ? i1 : i2; } #endif static char *undobuffer; static int undobufferlength; static Fl_Text_Buffer_mod *undowidget; static int undoat; // points after insertion static int undocut; // number of characters deleted there static int undoinsert; // number of characters inserted static int undoyankcut; // length of valid contents of buffer, even if undocut=0 /* Resize the undo buffer to match at least the requested size. */ static void undobuffersize(int n) { if (n > undobufferlength) { if (undobuffer) { do { undobufferlength *= 2; } while (undobufferlength < n); undobuffer = (char *) realloc(undobuffer, undobufferlength); } else { undobufferlength = n + 9; undobuffer = (char *) malloc(undobufferlength); } } } static void def_transcoding_warning_action(Fl_Text_Buffer_mod *text) { fl_alert("%s", text->file_encoding_warning_message); } /* Initialize all variables. */ Fl_Text_Buffer_mod::Fl_Text_Buffer_mod(int requestedSize, int preferredGapSize) { mLength = 0; mPreferredGapSize = preferredGapSize; mBuf = (char *) malloc(requestedSize + mPreferredGapSize); mGapStart = 0; mGapEnd = mPreferredGapSize; mTabDist = 8; mPrimary.mSelected = 0; mPrimary.mStart = mPrimary.mEnd = 0; mSecondary.mSelected = 0; mSecondary.mStart = mSecondary.mEnd = 0; mHighlight.mSelected = 0; mHighlight.mStart = mHighlight.mEnd = 0; mModifyProcs = NULL; mCbArgs = NULL; mNModifyProcs = 0; mNPredeleteProcs = 0; mPredeleteProcs = NULL; mPredeleteCbArgs = NULL; mCursorPosHint = 0; mCanUndo = 1; input_file_was_transcoded = 0; transcoding_warning_action = def_transcoding_warning_action; } /* Free all resources. */ Fl_Text_Buffer_mod::~Fl_Text_Buffer_mod() { free(mBuf); if (mNModifyProcs != 0) { delete[]mModifyProcs; delete[]mCbArgs; } if (mNPredeleteProcs != 0) { delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; } } /* This function copies verbose whatever is in front and after the gap into a single buffer. */ char *Fl_Text_Buffer_mod::text() const { char *t = (char *) malloc(mLength + 1); memcpy(t, mBuf, mGapStart); memcpy(t+mGapStart, mBuf+mGapEnd, mLength - mGapStart); t[mLength] = '\0'; return t; } /* Set the text buffer to a new string. */ void Fl_Text_Buffer_mod::text(const char *t) { IS_UTF8_ALIGNED(t) call_predelete_callbacks(0, length()); /* Save information for redisplay, and get rid of the old buffer */ const char *deletedText = text(); int deletedLength = mLength; free((void *) mBuf); /* Start a new buffer with a gap of mPreferredGapSize at the end */ int insertedLength = strlen(t); mBuf = (char *) malloc(insertedLength + mPreferredGapSize); mLength = insertedLength; mGapStart = insertedLength; mGapEnd = mGapStart + mPreferredGapSize; memcpy(mBuf, t, insertedLength); /* Zero all of the existing selections */ update_selections(0, deletedLength, 0); /* Call the saved display routine(s) to update the screen */ call_modify_callbacks(0, deletedLength, insertedLength, 0, deletedText); free((void *) deletedText); } /* Creates a range of text to a new buffer and copies verbose from around the gap. */ char *Fl_Text_Buffer_mod::text_range(int start, int end) const { IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) char *s = NULL; /* Make sure start and end are ok, and allocate memory for returned string. If start is bad, return "", if end is bad, adjust it. */ if (start < 0 || start > mLength) { s = (char *) malloc(1); s[0] = '\0'; return s; } if (end < start) { int temp = start; start = end; end = temp; } if (end > mLength) end = mLength; int copiedLength = end - start; s = (char *) malloc(copiedLength + 1); /* Copy the text from the buffer to the returned string */ if (end <= mGapStart) { memcpy(s, mBuf + start, copiedLength); } else if (start >= mGapStart) { memcpy(s, mBuf + start + (mGapEnd - mGapStart), copiedLength); } else { int part1Length = mGapStart - start; memcpy(s, mBuf + start, part1Length); memcpy(s + part1Length, mBuf + mGapEnd, copiedLength - part1Length); } s[copiedLength] = '\0'; return s; } /* Return a UCS-4 character at the given index. Pos must be at a character boundary. */ unsigned int Fl_Text_Buffer_mod::char_at(int pos) const { if (pos < 0 || pos >= mLength) return '\0'; IS_UTF8_ALIGNED2(this, (pos)) const char *src = address(pos); return fl_utf8decode(src, 0, 0); } /* Return a UTF-8 character at the given index. Pos must be at a character boundary. */ unsigned int Fl_Text_Buffer_mod::get_char_at(int pos, int &len) const { if (pos < 0 || pos >= mLength) return '\0'; IS_UTF8_ALIGNED2(this, (pos)) const char *src = address(pos); unsigned int code = 0; if (*src & 0x80) { fl_utf8decode(src, 0, &len); for (int i = 0; i < len && i < 4; i++) { code <<= 8; code |= (unsigned char)*(src + i) & 0xFF; } } else { code = *src; len = 1; } return code; } /* Return the raw byte at the given index. This function ignores all unicode encoding. */ char Fl_Text_Buffer_mod::byte_at(int pos) const { if (pos < 0 || pos >= mLength) return '\0'; const char *src = address(pos); return *src; } /* Insert some text at the given index. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::insert(int pos, const char *text) { IS_UTF8_ALIGNED2(this, (pos)) IS_UTF8_ALIGNED(text) /* check if there is actually any text */ if (!text || !*text) return; /* if pos is not contiguous to existing text, make it */ if (pos > mLength) pos = mLength; if (pos < 0) pos = 0; /* Even if nothing is deleted, we must call these callbacks */ call_predelete_callbacks(pos, 0); /* insert and redisplay */ int nInserted = insert_(pos, text); mCursorPosHint = pos + nInserted; IS_UTF8_ALIGNED2(this, (mCursorPosHint)) call_modify_callbacks(pos, 0, nInserted, 0, NULL); } /* Replace a range of text with new text. Start and end must be at a character boundary. */ void Fl_Text_Buffer_mod::replace(int start, int end, const char *text) { // Range check... if (!text) return; if (start < 0) start = 0; if (end > mLength) end = mLength; if (end < start) end = start; IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) IS_UTF8_ALIGNED(text) call_predelete_callbacks(start, end - start); const char *deletedText = text_range(start, end); remove_(start, end); int nInserted = insert_(start, text); mCursorPosHint = start + nInserted; call_modify_callbacks(start, end - start, nInserted, 0, deletedText); free((void *) deletedText); } /* Remove a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::remove(int start, int end) { /* Make sure the arguments make sense */ if (start > end) { int temp = start; start = end; end = temp; } if (start > mLength) start = mLength; if (start < 0) start = 0; if (end > mLength) end = mLength; if (end < 0) end = 0; IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) if (start == end) return; call_predelete_callbacks(start, end - start); /* Remove and redisplay */ const char *deletedText = text_range(start, end); remove_(start, end); mCursorPosHint = start; call_modify_callbacks(start, end - start, 0, 0, deletedText); free((void *) deletedText); } /* Copy a range of text from another text buffer. fromStart, fromEnd, and toPos must be at a character boundary. */ void Fl_Text_Buffer_mod::copy(Fl_Text_Buffer_mod * fromBuf, int fromStart, int fromEnd, int toPos) { IS_UTF8_ALIGNED2(fromBuf, fromStart) IS_UTF8_ALIGNED2(fromBuf, fromEnd) IS_UTF8_ALIGNED2(this, (toPos)) int copiedLength = fromEnd - fromStart; /* Prepare the buffer to receive the new text. If the new text fits in the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a gap of mPreferredGapSize */ if (copiedLength > mGapEnd - mGapStart) reallocate_with_gap(toPos, copiedLength + mPreferredGapSize); else if (toPos != mGapStart) move_gap(toPos); /* Insert the new text (toPos now corresponds to the start of the gap) */ if (fromEnd <= fromBuf->mGapStart) { memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart], copiedLength); } else if (fromStart >= fromBuf->mGapStart) { memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart + (fromBuf->mGapEnd - fromBuf->mGapStart)], copiedLength); } else { int part1Length = fromBuf->mGapStart - fromStart; memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart], part1Length); memcpy(&mBuf[toPos + part1Length], &fromBuf->mBuf[fromBuf->mGapEnd], copiedLength - part1Length); } mGapStart += copiedLength; mLength += copiedLength; update_selections(toPos, 0, copiedLength); } /* Take the previous changes and undo them. Return the previous cursor position in cursorPos. Returns 1 if the undo was applied. CursorPos will be at a character boundary. */ int Fl_Text_Buffer_mod::undo(int *cursorPos) { if (undowidget != this || (!undocut && !undoinsert && !mCanUndo)) return 0; int ilen = undocut; int xlen = undoinsert; int b = undoat - xlen; if (xlen && undoyankcut && !ilen) { ilen = undoyankcut; } if (xlen && ilen) { undobuffersize(ilen + 1); undobuffer[ilen] = 0; char *tmp = strdup(undobuffer); replace(b, undoat, tmp); if (cursorPos) *cursorPos = mCursorPosHint; free(tmp); } else if (xlen) { remove(b, undoat); if (cursorPos) *cursorPos = mCursorPosHint; } else if (ilen) { undobuffersize(ilen + 1); undobuffer[ilen] = 0; insert(undoat, undobuffer); if (cursorPos) *cursorPos = mCursorPosHint; undoyankcut = 0; } return 1; } /* Set a flag if undo function will work. */ void Fl_Text_Buffer_mod::canUndo(char flag) { mCanUndo = flag; // disabling undo also clears the last undo operation! if (!mCanUndo && undowidget==this) undowidget = 0; } /* Change the tab width. This will cause a couple of callbacks and a complete redisplay. Matt: I am not entirely sure why we need to trigger callbacks because tabs are only a graphical hint, not changing any text at all, but I leave this in here for back compatibility. */ void Fl_Text_Buffer_mod::tab_distance(int tabDist) { /* First call the pre-delete callbacks with the previous tab setting still active. */ call_predelete_callbacks(0, mLength); /* Change the tab setting */ mTabDist = tabDist; /* Force any display routines to redisplay everything (unfortunately, this means copying the whole buffer contents to provide "deletedText" */ const char *deletedText = text(); call_modify_callbacks(0, mLength, mLength, 0, deletedText); free((void *) deletedText); } /* Select a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::select(int start, int end) { IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) Fl_Text_Selection_mod oldSelection = mPrimary; mPrimary.set(start, end); redisplay_selection(&oldSelection, &mPrimary); } /* Clear the primary selection. */ void Fl_Text_Buffer_mod::unselect() { Fl_Text_Selection_mod oldSelection = mPrimary; mPrimary.mSelected = 0; redisplay_selection(&oldSelection, &mPrimary); } /* Return the primary selection range. */ int Fl_Text_Buffer_mod::selection_position(int *start, int *end) { return mPrimary.position(start, end); } /* Return a copy of the selected text. */ char *Fl_Text_Buffer_mod::selection_text() { return selection_text_(&mPrimary); } /* Remove the selected text. */ void Fl_Text_Buffer_mod::remove_selection() { remove_selection_(&mPrimary); } /* Replace the selected text. */ void Fl_Text_Buffer_mod::replace_selection(const char *text) { replace_selection_(&mPrimary, text); } /* Select text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::secondary_select(int start, int end) { Fl_Text_Selection_mod oldSelection = mSecondary; mSecondary.set(start, end); redisplay_selection(&oldSelection, &mSecondary); } /* Deselect text. */ void Fl_Text_Buffer_mod::secondary_unselect() { Fl_Text_Selection_mod oldSelection = mSecondary; mSecondary.mSelected = 0; redisplay_selection(&oldSelection, &mSecondary); } /* Return the selected range. */ int Fl_Text_Buffer_mod::secondary_selection_position(int *start, int *end) { return mSecondary.position(start, end); } /* Return a copy of the text in this selection. */ char *Fl_Text_Buffer_mod::secondary_selection_text() { return selection_text_(&mSecondary); } /* Remove the selected text. */ void Fl_Text_Buffer_mod::remove_secondary_selection() { remove_selection_(&mSecondary); } /* Replace selected text. */ void Fl_Text_Buffer_mod::replace_secondary_selection(const char *text) { replace_selection_(&mSecondary, text); } /* Highlight a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::highlight(int start, int end) { Fl_Text_Selection_mod oldSelection = mHighlight; mHighlight.set(start, end); redisplay_selection(&oldSelection, &mHighlight); } /* Remove text highlighting. */ void Fl_Text_Buffer_mod::unhighlight() { Fl_Text_Selection_mod oldSelection = mHighlight; mHighlight.mSelected = 0; redisplay_selection(&oldSelection, &mHighlight); } /* Return position of highlight. */ int Fl_Text_Buffer_mod::highlight_position(int *start, int *end) { return mHighlight.position(start, end); } /* Return a copy of highlighted text. */ char *Fl_Text_Buffer_mod::highlight_text() { return selection_text_(&mHighlight); } /* Add a callback that is called whenever text is modified. */ void Fl_Text_Buffer_mod::add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void *cbArg) { Fl_Text_Modify_Cb *newModifyProcs = new Fl_Text_Modify_Cb[mNModifyProcs + 1]; void **newCBArgs = new void *[mNModifyProcs + 1]; for (int i = 0; i < mNModifyProcs; i++) { newModifyProcs[i + 1] = mModifyProcs[i]; newCBArgs[i + 1] = mCbArgs[i]; } if (mNModifyProcs != 0) { delete[]mModifyProcs; delete[]mCbArgs; } newModifyProcs[0] = bufModifiedCB; newCBArgs[0] = cbArg; mNModifyProcs++; mModifyProcs = newModifyProcs; mCbArgs = newCBArgs; } /* Remove a callback. */ void Fl_Text_Buffer_mod::remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void *cbArg) { int i, toRemove = -1; /* find the matching callback to remove */ for (i = 0; i < mNModifyProcs; i++) { if (mModifyProcs[i] == bufModifiedCB && mCbArgs[i] == cbArg) { toRemove = i; break; } } if (toRemove == -1) { Fl::error ("Fl_Text_Buffer_mod::remove_modify_callback(): Can't find modify CB to remove"); return; } /* Allocate new lists for remaining callback procs and args (if any are left) */ mNModifyProcs--; if (mNModifyProcs == 0) { mNModifyProcs = 0; delete[]mModifyProcs; mModifyProcs = NULL; delete[]mCbArgs; mCbArgs = NULL; return; } Fl_Text_Modify_Cb *newModifyProcs = new Fl_Text_Modify_Cb[mNModifyProcs]; void **newCBArgs = new void *[mNModifyProcs]; /* copy out the remaining members and free the old lists */ for (i = 0; i < toRemove; i++) { newModifyProcs[i] = mModifyProcs[i]; newCBArgs[i] = mCbArgs[i]; } for (; i < mNModifyProcs; i++) { newModifyProcs[i] = mModifyProcs[i + 1]; newCBArgs[i] = mCbArgs[i + 1]; } delete[]mModifyProcs; delete[]mCbArgs; mModifyProcs = newModifyProcs; mCbArgs = newCBArgs; } /* Add a callback that is called before deleting text. */ void Fl_Text_Buffer_mod::add_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) { Fl_Text_Predelete_Cb *newPreDeleteProcs = new Fl_Text_Predelete_Cb[mNPredeleteProcs + 1]; void **newCBArgs = new void *[mNPredeleteProcs + 1]; for (int i = 0; i < mNPredeleteProcs; i++) { newPreDeleteProcs[i + 1] = mPredeleteProcs[i]; newCBArgs[i + 1] = mPredeleteCbArgs[i]; } if (mNPredeleteProcs != 0) { delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; } newPreDeleteProcs[0] = bufPreDeleteCB; newCBArgs[0] = cbArg; mNPredeleteProcs++; mPredeleteProcs = newPreDeleteProcs; mPredeleteCbArgs = newCBArgs; } /* Remove a callback. */ void Fl_Text_Buffer_mod::remove_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) { int i, toRemove = -1; /* find the matching callback to remove */ for (i = 0; i < mNPredeleteProcs; i++) { if (mPredeleteProcs[i] == bufPreDeleteCB && mPredeleteCbArgs[i] == cbArg) { toRemove = i; break; } } if (toRemove == -1) { Fl::error ("Fl_Text_Buffer_mod::remove_predelete_callback(): Can't find pre-delete CB to remove"); return; } /* Allocate new lists for remaining callback procs and args (if any are left) */ mNPredeleteProcs--; if (mNPredeleteProcs == 0) { mNPredeleteProcs = 0; delete[]mPredeleteProcs; mPredeleteProcs = NULL; delete[]mPredeleteCbArgs; mPredeleteCbArgs = NULL; return; } Fl_Text_Predelete_Cb *newPreDeleteProcs = new Fl_Text_Predelete_Cb[mNPredeleteProcs]; void **newCBArgs = new void *[mNPredeleteProcs]; /* copy out the remaining members and free the old lists */ for (i = 0; i < toRemove; i++) { newPreDeleteProcs[i] = mPredeleteProcs[i]; newCBArgs[i] = mPredeleteCbArgs[i]; } for (; i < mNPredeleteProcs; i++) { newPreDeleteProcs[i] = mPredeleteProcs[i + 1]; newCBArgs[i] = mPredeleteCbArgs[i + 1]; } delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; mPredeleteProcs = newPreDeleteProcs; mPredeleteCbArgs = newCBArgs; } /* Return a copy of the line that contains a given index. Pos must be at a character boundary. */ char *Fl_Text_Buffer_mod::line_text(int pos) const { return text_range(line_start(pos), line_end(pos)); } /* Find the beginning of the line. */ int Fl_Text_Buffer_mod::line_start(int pos) const { if (!findchar_backward(pos, '\n', &pos)) return 0; return pos + 1; } /* Find the end of the line. */ int Fl_Text_Buffer_mod::line_end(int pos) const { if (!findchar_forward(pos, '\n', &pos)) pos = mLength; return pos; } /* Find the beginning of a word. NOT UNICODE SAFE. */ int Fl_Text_Buffer_mod::word_start(int pos) const { // FIXME: character is ucs-4 while (pos>0 && (isalnum(char_at(pos)) || char_at(pos) == '_')) { pos = prev_char(pos); } // FIXME: character is ucs-4 if (!(isalnum(char_at(pos)) || char_at(pos) == '_')) pos = next_char(pos); return pos; } /* ** Search backwards in buffer for characters in "searchChars", starting ** with the character BEFORE "startPos", returning the result in "foundPos" ** returns 1 if found, 0 if not. */ int Fl_Text_Buffer_mod::findchars_backward( int startPos, const char *searchChars, int *foundPos ) { int pos = startPos; const char *c; char ch = 0; if ( startPos == 0 ) { *foundPos = 0; return 0; } while ( pos > 0 ) { ch = byte_at(pos); for ( c = searchChars; *c != '\0'; c++ ) { if ( ch == *c ) { *foundPos = pos; return 1; } } pos = prev_char(pos); } *foundPos = 0; return 0; } /* Find the end of a word. NOT UNICODE SAFE. */ int Fl_Text_Buffer_mod::word_end(int pos) const { // FIXME: character is ucs-4 while (pos < length() && (isalnum(char_at(pos)) || char_at(pos) == '_')) { pos = next_char(pos); } return pos; } /* ** Search forwards in buffer for nth occurance ofcharacters in "searchChars", starting ** with the character "startPos", and returning the result in "foundPos" ** returns 1 if found, 0 if not. */ int Fl_Text_Buffer_mod::findchars_forward( int startPos, const char *searchChars, int *foundPos, int n ) const { int pos = startPos; const char *c; char ch = 0; while ( pos < length() && n) { ch = byte_at(pos); for ( c = searchChars; *c != '\0'; c++ ) { if (n != 1 && (*c == '.' || *c == '-')) continue; if ( ch == *c ) { n--; if (n == 0) { *foundPos = pos; return 1; } } } pos = next_char(pos); } *foundPos = length(); return 0; } /* Count the number of characters between two positions. */ int Fl_Text_Buffer_mod::count_displayed_characters(int lineStartPos, int targetPos) const { IS_UTF8_ALIGNED2(this, (lineStartPos)) IS_UTF8_ALIGNED2(this, (targetPos)) int charCount = 0; int pos = lineStartPos; while (pos < targetPos) { pos = next_char(pos); charCount++; } return charCount; } /* Skip ahead a number of characters from a given index. This function breaks early if it encounters a newline character. */ int Fl_Text_Buffer_mod::skip_displayed_characters(int lineStartPos, int nChars) { IS_UTF8_ALIGNED2(this, (lineStartPos)) int pos = lineStartPos; for (int charCount = 0; charCount < nChars && pos < mLength; charCount++) { unsigned int c = char_at(pos); if (c == '\n') return pos; pos = next_char(pos); } return pos; } /* Count the number of newline characters between start and end. startPos and endPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::count_lines(int startPos, int endPos) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED2(this, (endPos)) int gapLen = mGapEnd - mGapStart; int lineCount = 0; int pos = startPos; while (pos < mGapStart) { if (pos == endPos) return lineCount; if (mBuf[pos++] == '\n') lineCount++; } while (pos < mLength) { if (pos == endPos) return lineCount; if (mBuf[pos++ + gapLen] == '\n') lineCount++; } return lineCount; } /* Skip to the first character, n lines ahead. StartPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::skip_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(this, (startPos)) if (nLines == 0) return startPos; int gapLen = mGapEnd - mGapStart; int pos = startPos; int lineCount = 0; while (pos < mGapStart) { if (mBuf[pos++] == '\n') { lineCount++; if (lineCount == nLines) { IS_UTF8_ALIGNED2(this, (pos)) return pos; } } } while (pos < mLength) { if (mBuf[pos++ + gapLen] == '\n') { lineCount++; if (lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos)) return pos; } } } IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Skip to the first character, n lines back. StartPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::rewind_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(this, (startPos)) int pos = startPos - 1; if (pos <= 0) return 0; int gapLen = mGapEnd - mGapStart; int lineCount = -1; while (pos >= mGapStart) { if (mBuf[pos + gapLen] == '\n') { if (++lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos+1)) return pos + 1; } } pos--; } while (pos >= 0) { if (mBuf[pos] == '\n') { if (++lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos+1)) return pos + 1; } } pos--; } return 0; } /* Find a matching string in the buffer. */ int Fl_Text_Buffer_mod::search_forward(int startPos, const char *searchString, int *foundPos, int matchCase) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED(searchString) if (!searchString) return 0; int bp; const char *sp; if (matchCase) { while (startPos < length()) { bp = startPos; sp = searchString; for (;;) { char c = *sp; // we reached the end of the "needle", so we found the string! if (!c) { *foundPos = startPos; return 1; } int l = fl_utf8len1(c); if (memcmp(sp, address(bp), l)) break; sp += l; bp += l; } startPos = next_char(startPos); } } else { while (startPos < length()) { bp = startPos; sp = searchString; for (;;) { // we reached the end of the "needle", so we found the string! if (!*sp) { *foundPos = startPos; return 1; } int l; unsigned int b = char_at(bp); unsigned int s = fl_utf8decode(sp, 0, &l); if (fl_tolower(b)!=fl_tolower(s)) break; sp += l; bp = next_char(bp); } startPos = next_char(startPos); } } return 0; } int Fl_Text_Buffer_mod::search_backward(int startPos, const char *searchString, int *foundPos, int matchCase) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED(searchString) if (!searchString) return 0; int bp; const char *sp; if (matchCase) { while (startPos >= 0) { bp = startPos; sp = searchString; for (;;) { char c = *sp; // we reached the end of the "needle", so we found the string! if (!c) { *foundPos = startPos; return 1; } int l = fl_utf8len1(c); if (memcmp(sp, address(bp), l)) break; sp += l; bp += l; } startPos = prev_char(startPos); } } else { while (startPos >= 0) { bp = startPos; sp = searchString; for (;;) { // we reached the end of the "needle", so we found the string! if (!*sp) { *foundPos = startPos; return 1; } int l; unsigned int b = char_at(bp); unsigned int s = fl_utf8decode(sp, 0, &l); if (fl_tolower(b)!=fl_tolower(s)) break; sp += l; bp = next_char(bp); } startPos = prev_char(startPos); } } return 0; } /* Insert a string into the buffer. Pos must be at a character boundary. Text must be a correct UTF-8 string. */ int Fl_Text_Buffer_mod::insert_(int pos, const char *text) { if (!text || !*text) return 0; int insertedLength = strlen(text); /* Prepare the buffer to receive the new text. If the new text fits in the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a gap of mPreferredGapSize */ if (insertedLength > mGapEnd - mGapStart) reallocate_with_gap(pos, insertedLength + mPreferredGapSize); else if (pos != mGapStart) move_gap(pos); /* Insert the new text (pos now corresponds to the start of the gap) */ memcpy(&mBuf[pos], text, insertedLength); mGapStart += insertedLength; mLength += insertedLength; update_selections(pos, 0, insertedLength); if (mCanUndo) { if (undowidget == this && undoat == pos && undoinsert) { undoinsert += insertedLength; } else { undoinsert = insertedLength; undoyankcut = (undoat == pos) ? undocut : 0; } undoat = pos + insertedLength; undocut = 0; undowidget = this; } return insertedLength; } /* Remove a string from the buffer. Unicode safe. Start and end must be at a character boundary. */ void Fl_Text_Buffer_mod::remove_(int start, int end) { /* if the gap is not contiguous to the area to remove, move it there */ if (mCanUndo) { if (undowidget == this && undoat == end && undocut) { undobuffersize(undocut + end - start + 1); memmove(undobuffer + end - start, undobuffer, undocut); undocut += end - start; } else { undocut = end - start; undobuffersize(undocut); } undoat = start; undoinsert = 0; undoyankcut = 0; undowidget = this; } if (start > mGapStart) { if (mCanUndo) memcpy(undobuffer, mBuf + (mGapEnd - mGapStart) + start, end - start); move_gap(start); } else if (end < mGapStart) { if (mCanUndo) memcpy(undobuffer, mBuf + start, end - start); move_gap(end); } else { int prelen = mGapStart - start; if (mCanUndo) { memcpy(undobuffer, mBuf + start, prelen); memcpy(undobuffer + prelen, mBuf + mGapEnd, end - start - prelen); } } /* expand the gap to encompass the deleted characters */ mGapEnd += end - mGapStart; mGapStart -= mGapStart - start; /* update the length */ mLength -= end - start; /* fix up any selections which might be affected by the change */ update_selections(start, end - start, 0); } /* simple setter. Unicode safe. Start and end must be at a character boundary. */ void Fl_Text_Selection_mod::set(int startpos, int endpos) { mSelected = startpos != endpos; mStart = min(startpos, endpos); mEnd = max(startpos, endpos); } /* simple getter. Unicode safe. Start and end will be at a character boundary. */ int Fl_Text_Selection_mod::position(int *startpos, int *endpos) const { if (!mSelected) return 0; *startpos = mStart; *endpos = mEnd; return 1; } /* Return if a position is inside the selected area. Unicode safe. Pos must be at a character boundary. */ int Fl_Text_Selection_mod::includes(int pos) const { return (selected() && pos >= start() && pos < end() ); } /* Return a duplicate of the selected text, or an empty string. Unicode safe. */ char *Fl_Text_Buffer_mod::selection_text_(Fl_Text_Selection_mod * sel) const { int start, end; /* If there's no selection, return an allocated empty string */ if (!sel->position(&start, &end)) { char *s = (char *) malloc(1); *s = '\0'; return s; } /* Return the selected range */ return text_range(start, end); } /* Remove the selected text. Unicode safe. */ void Fl_Text_Buffer_mod::remove_selection_(Fl_Text_Selection_mod * sel) { int start, end; if (!sel->position(&start, &end)) return; remove(start, end); //undoyankcut = undocut; } /* Replace selection with text. Unicode safe. */ void Fl_Text_Buffer_mod::replace_selection_(Fl_Text_Selection_mod * sel, const char *text) { Fl_Text_Selection_mod oldSelection = *sel; /* If there's no selection, return */ int start, end; if (!sel->position(&start, &end)) return; /* Do the appropriate type of replace */ replace(start, end, text); /* Unselect (happens automatically in BufReplace, but BufReplaceRect can't detect when the contents of a selection goes away) */ sel->mSelected = 0; redisplay_selection(&oldSelection, sel); } /* Call all callbacks. Unicode safe. */ void Fl_Text_Buffer_mod::call_modify_callbacks(int pos, int nDeleted, int nInserted, int nRestyled, const char *deletedText) const { IS_UTF8_ALIGNED2(this, pos) for (int i = 0; i < mNModifyProcs; i++) (*mModifyProcs[i]) (pos, nInserted, nDeleted, nRestyled, deletedText, mCbArgs[i]); } /* Call all callbacks. Unicode safe. */ void Fl_Text_Buffer_mod::call_predelete_callbacks(int pos, int nDeleted) const { for (int i = 0; i < mNPredeleteProcs; i++) (*mPredeleteProcs[i]) (pos, nDeleted, mPredeleteCbArgs[i]); } /* Redisplay a new selected area. Unicode safe. */ void Fl_Text_Buffer_mod::redisplay_selection(Fl_Text_Selection_mod * oldSelection, Fl_Text_Selection_mod * newSelection) const { int oldStart, oldEnd, newStart, newEnd, ch1Start, ch1End, ch2Start, ch2End; /* If either selection is rectangular, add an additional character to the end of the selection to request the redraw routines to wipe out the parts of the selection beyond the end of the line */ oldStart = oldSelection->mStart; newStart = newSelection->mStart; oldEnd = oldSelection->mEnd; newEnd = newSelection->mEnd; /* If the old or new selection is unselected, just redisplay the single area that is (was) selected and return */ if (!oldSelection->mSelected && !newSelection->mSelected) return; if (!oldSelection->mSelected) { call_modify_callbacks(newStart, 0, 0, newEnd - newStart, NULL); return; } if (!newSelection->mSelected) { call_modify_callbacks(oldStart, 0, 0, oldEnd - oldStart, NULL); return; } /* If the selections are non-contiguous, do two separate updates and return */ if (oldEnd < newStart || newEnd < oldStart) { call_modify_callbacks(oldStart, 0, 0, oldEnd - oldStart, NULL); call_modify_callbacks(newStart, 0, 0, newEnd - newStart, NULL); return; } /* Otherwise, separate into 3 separate regions: ch1, and ch2 (the two changed areas), and the unchanged area of their intersection, and update only the changed area(s) */ ch1Start = min(oldStart, newStart); ch2End = max(oldEnd, newEnd); ch1End = max(oldStart, newStart); ch2Start = min(oldEnd, newEnd); if (ch1Start != ch1End) call_modify_callbacks(ch1Start, 0, 0, ch1End - ch1Start, NULL); if (ch2Start != ch2End) call_modify_callbacks(ch2Start, 0, 0, ch2End - ch2Start, NULL); } /* Move the gap around without changing buffer content. Unicode safe. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::move_gap(int pos) { int gapLen = mGapEnd - mGapStart; if (pos > mGapStart) memmove(&mBuf[mGapStart], &mBuf[mGapEnd], pos - mGapStart); else memmove(&mBuf[pos + gapLen], &mBuf[pos], mGapStart - pos); mGapEnd += pos - mGapStart; mGapStart += pos - mGapStart; } /* Create a larger gap. Unicode safe. Start must be at a character boundary. */ void Fl_Text_Buffer_mod::reallocate_with_gap(int newGapStart, int newGapLen) { char *newBuf = (char *) malloc(mLength + newGapLen); int newGapEnd = newGapStart + newGapLen; if (newGapStart <= mGapStart) { memcpy(newBuf, mBuf, newGapStart); memcpy(&newBuf[newGapEnd], &mBuf[newGapStart], mGapStart - newGapStart); memcpy(&newBuf[newGapEnd + mGapStart - newGapStart], &mBuf[mGapEnd], mLength - mGapStart); } else { /* newGapStart > mGapStart */ memcpy(newBuf, mBuf, mGapStart); memcpy(&newBuf[mGapStart], &mBuf[mGapEnd], newGapStart - mGapStart); memcpy(&newBuf[newGapEnd], &mBuf[mGapEnd + newGapStart - mGapStart], mLength - newGapStart); } free((void *) mBuf); mBuf = newBuf; mGapStart = newGapStart; mGapEnd = newGapEnd; } /* Update selection range if characters were inserted. Unicode safe. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::update_selections(int pos, int nDeleted, int nInserted) { mPrimary.update(pos, nDeleted, nInserted); mSecondary.update(pos, nDeleted, nInserted); mHighlight.update(pos, nDeleted, nInserted); } // unicode safe, assuming the arguments are on character boundaries void Fl_Text_Selection_mod::update(int pos, int nDeleted, int nInserted) { if (!mSelected || pos > mEnd) return; if (pos + nDeleted <= mStart) { mStart += nInserted - nDeleted; mEnd += nInserted - nDeleted; } else if (pos <= mStart && pos + nDeleted >= mEnd) { mStart = pos; mEnd = pos; mSelected = 0; } else if (pos <= mStart && pos + nDeleted < mEnd) { mStart = pos; mEnd = nInserted + mEnd - nDeleted; } else if (pos < mEnd) { mEnd += nInserted - nDeleted; if (mEnd <= mStart) mSelected = 0; } } /* Find a UCS-4 character. StartPos must be at a character boundary, searchChar is UCS-4 encoded. */ int Fl_Text_Buffer_mod::findchar_forward(int startPos, unsigned searchChar, int *foundPos) const { if (startPos >= mLength) { *foundPos = mLength; return 0; } if (startPos<0) startPos = 0; for ( ; startPos mLength) startPos = mLength; for (startPos = prev_char(startPos); startPos>=0; startPos = prev_char(startPos)) { if (searchChar == char_at(startPos)) { *foundPos = startPos; return 1; } } *foundPos = 0; return 0; } //#define EXAMPLE_ENCODING // shows how to process any encoding for which a decoding function exists #ifdef EXAMPLE_ENCODING // returns the UCS equivalent of *p in CP1252 and advances p by 1 unsigned cp1252toucs(char* &p) { // Codes 0x80..0x9f from the Microsoft CP1252 character set, translated // to Unicode static unsigned cp1252[32] = { 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178 }; unsigned char uc = *(unsigned char*)p; p++; return (uc < 0x80 || uc >= 0xa0 ? uc : cp1252[uc - 0x80]); } // returns the UCS equivalent of *p in UTF-16 and advances p by 2 (or more for surrogates) unsigned utf16toucs(char* &p) { union { #if WORDS_BIGENDIAN struct { unsigned char a, b;} chars; #else struct { unsigned char b, a;} chars; #endif U16 short_val; } u; u.chars.a = *(unsigned char*)p++; u.chars.b = *(unsigned char*)p++; return u.short_val; } // filter that produces, from an input stream fed by reading from fp, // a UTF-8-encoded output stream written in buffer. // Input can be any (e.g., 8-bit, UTF-16) encoding. // Output is true UTF-8. // p_trf points to a function that transforms encoded byte(s) into one UCS // and that increases the pointer by the adequate quantity static int general_input_filter(char *buffer, int buflen, char *line, int sline, char* &endline, unsigned (*p_trf)(char* &), FILE *fp) { char *p, *q, multibyte[5]; int lq, r, offset; p = endline = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } if (q + 4 /*max width of utf-8 char*/ > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } lq = fl_utf8encode( p_trf(p), multibyte ); memcpy(q, multibyte, lq); q += lq; } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } #endif // EXAMPLE_ENCODING /* filter that produces, from an input stream fed by reading from fp, a UTF-8-encoded output stream written in buffer. Input can be UTF-8. If it is not, it is decoded with CP1252. Output is UTF-8. *input_was_changed is set to true if the input was not strict UTF-8 so output differs from input. */ static int utf8_input_filter(char *buffer, int buflen, char *line, int sline, char* &endline, FILE *fp, int *input_was_changed) { char *p, *q, multibyte[5]; int l, lp, lq, r; unsigned u; p = endline = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } l = fl_utf8len1(*p); if (p + l > endline) { memmove(line, p, endline - p); endline -= (p - line); r = fread(endline, 1, sline - (endline - line), fp); endline += r; p = line; if (endline - line < l) break; } while ( l > 0) { u = fl_utf8decode(p, p+l, &lp); lq = fl_utf8encode(u, multibyte); if (lp != l || lq != l) *input_was_changed = true; if (q + lq > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } memcpy(q, multibyte, lq); q += lq; p += lp; l -= lp; } } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } const char *Fl_Text_Buffer_mod::file_encoding_warning_message = "Displayed text contains the UTF-8 transcoding\n" "of the input file which was not UTF-8 encoded.\n" "Some changes may have occurred."; /* Insert text from a file. Input file can be of various encodings according to what input fiter is used. utf8_input_filter accepts UTF-8 or CP1252 as input encoding. Output is always UTF-8. */ int Fl_Text_Buffer_mod::insertfile(const char *file, int pos, int buflen) { FILE *fp; if (!(fp = fl_fopen(file, "r"))) return 1; char *buffer = new char[buflen + 1]; char *endline, line[100]; int l; input_file_was_transcoded = false; endline = line; while (true) { #ifdef EXAMPLE_ENCODING // example of 16-bit encoding: UTF-16 l = general_input_filter(buffer, buflen, line, sizeof(line), endline, utf16toucs, // use cp1252toucs to read CP1252-encoded files fp); input_file_was_transcoded = true; #else l = utf8_input_filter(buffer, buflen, line, sizeof(line), endline, fp, &input_file_was_transcoded); #endif if (l == 0) break; buffer[l] = 0; insert(pos, buffer); pos += l; } int e = ferror(fp) ? 2 : 0; fclose(fp); delete[]buffer; if ( (!e) && input_file_was_transcoded && transcoding_warning_action) { transcoding_warning_action(this); } return e; } /* Write text to file. Unicode safe. */ int Fl_Text_Buffer_mod::outputfile(const char *file, int start, int end, int buflen) { FILE *fp; if (!(fp = fl_fopen(file, "w"))) return 1; for (int n; (n = min(end - start, buflen)); start += n) { const char *p = text_range(start, start + n); int r = fwrite(p, 1, n, fp); free((void *) p); if (r != n) break; } int e = ferror(fp) ? 2 : 0; fclose(fp); return e; } /* Return the previous character position. Unicode safe. */ int Fl_Text_Buffer_mod::prev_char_clipped(int pos) const { if (pos<=0) return 0; IS_UTF8_ALIGNED2(this, (pos)) char c; do { pos--; if (pos==0) return 0; c = byte_at(pos); } while ( (c&0xc0) == 0x80); IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Return the previous character position. Returns -1 if the beginning of the buffer is reached. */ int Fl_Text_Buffer_mod::prev_char(int pos) const { if (pos==0) return -1; return prev_char_clipped(pos); } /* Return the next character position. Returns length() if the end of the buffer is reached. */ int Fl_Text_Buffer_mod::next_char(int pos) const { IS_UTF8_ALIGNED2(this, (pos)) int n = fl_utf8len1(byte_at(pos)); pos += n; if (pos>=mLength) return mLength; IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Return the next character position. If the end of the buffer is reached, it returns the current position. */ int Fl_Text_Buffer_mod::next_char_clipped(int pos) const { return next_char(pos); } /* Align an index to the current UTF-8 boundary. */ int Fl_Text_Buffer_mod::utf8_align(int pos) const { char c = byte_at(pos); while ( (c&0xc0) == 0x80) { pos--; c = byte_at(pos); } return pos; } // // End of "$Id: Fl_Text_Buffer_mod.cxx 8040 2010-12-15 17:38:39Z manolo $". // fldigi-4.1.06/src/widgets/flinput2.cxx0000644000175000017500000002462513472116000014510 00000000000000// ---------------------------------------------------------------------------- // flinput2.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "icons.h" #include "flinput2.h" #include "gettext.h" #include "debug.h" enum { OP_UNDO, OP_CUT, OP_COPY, OP_PASTE, OP_DELETE, OP_CLEAR, OP_SELECT_ALL }; static Fl_Menu_Item cmenu[] = { { icons::make_icon_label(_("Undo"), edit_undo_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Cut"), edit_cut_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Paste"), edit_paste_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Delete"), trash_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Select All"), edit_select_all_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { " - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ã… - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ã¥ - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "ÃŒ - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ÃŽ - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ã’ - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "à - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} }; static bool cmenu_init = false; Fl_Input2::Fl_Input2(int x, int y, int w, int h, const char* l) : Fl_Input(x, y, w, h, l) { if (!cmenu_init) { for (size_t i = 0; i < sizeof(cmenu)/sizeof(*cmenu) - 1; i++) if (cmenu[i].labeltype() == _FL_MULTI_LABEL) icons::set_icon_label(&cmenu[i]); cmenu_init = true; } ascii_cnt = 0; // restart the numeric keypad entries. ascii_chr = 0; utf8text = NULL; } //---------------------------------------------------------------------- /// Composes ascii characters and adds them to the Fl_Input2 buffer. /// Control characters are inserted with the CTRL style. Values larger than 127 /// (0x7f) are ignored. We cannot really add NULs for the time being. /// /// @param key A digit character /// /// @return 1 /// int Fl_Input2::handle_key_ascii(int key) { if (key >= FL_KP) key -= FL_KP; key -= '0'; ascii_cnt++; ascii_chr *= 10; ascii_chr += key; if (ascii_cnt == 3) { if (ascii_chr < 0x100) { utf8text = new char[fl_utf8bytes(ascii_chr) + 1]; utf8cnt = fl_utf8encode(ascii_chr, utf8text); return 1; } ascii_cnt = ascii_chr = 0; } return 0; } //---------------------------------------------------------------------- int Fl_Input2::handle(int event) { switch (event) { case FL_KEYBOARD: { int b = Fl::event_key(); if (b == FL_Enter || b == FL_KP_Enter) { do_callback(); return Fl_Input::handle(event); } if (b == FL_Tab) { do_callback(); return Fl_Input::handle(event); } if ((Fl::event_state() & FL_CTRL) && (isdigit(b) || isdigit(b - FL_KP))) { if (handle_key_ascii(b)) { if (utf8text) { insert(utf8text, utf8cnt); delete utf8text; } ascii_cnt = 0; ascii_chr = 0; } return 1; } ascii_cnt = 0; ascii_chr = 0; int p = position(); // stop the move-to-next-field madness, we have Tab for that! if (unlikely((b == FL_Left && p == 0) || (b == FL_Right && p == size()) || (b == FL_Up && line_start(p) == 0) || (b == FL_Down && line_end(p) == size()))) return 1; else if (unlikely(Fl::event_state() & (FL_ALT | FL_META))) { switch (b) { case 'c': { // capitalise if (readonly() || p == size()) return 1; while (p < size() && isspace(*(value() + p))) p++; if (p == size()) return 1; char c = toupper(*(value() + p)); replace(p, p + 1, &c, 1); position(word_end(p)); } return 1; case 'u': case 'l': { // upper/lower case if (readonly() || p == size()) return 1; while (p < size() && isspace(*(value() + p))) p++; int n = word_end(p) - p; if (n == 0) return 1; char* s = new char[n]; memcpy(s, value() + p, n); if (b == 'u') for (int i = 0; i < n; i++) s[i] = toupper(s[i]); else for (int i = 0; i < n; i++) s[i] = tolower(s[i]); replace(p, p + n, s, n); position(p + n); delete [] s; return 1; } default: break; } } return Fl_Input::handle(event); } case FL_MOUSEWHEEL: { if (!((type() & (FL_MULTILINE_INPUT | FL_MULTILINE_OUTPUT)) && Fl::event_inside(this))) return Fl_Input::handle(event); int d; if (!((d = Fl::event_dy()) || (d = Fl::event_dx()))) return Fl_Input::handle(event); if (Fl::focus() != this) take_focus(); up_down_position(d + (d > 0 ? line_end(position()) : line_start(position()))); return 1; } case FL_PUSH: if (Fl::event_button() == FL_RIGHT_MOUSE) break; // fall through default: return Fl_Input::handle(event); } bool sel = position() != mark(), ro = readonly(); icons::set_active(&cmenu[OP_UNDO], !ro); icons::set_active(&cmenu[OP_CUT], !ro && sel); icons::set_active(&cmenu[OP_COPY], sel); icons::set_active(&cmenu[OP_PASTE], !ro); icons::set_active(&cmenu[OP_DELETE], !ro && sel); icons::set_active(&cmenu[OP_CLEAR], !ro && size()); icons::set_active(&cmenu[OP_SELECT_ALL], size()); take_focus(); window()->cursor(FL_CURSOR_DEFAULT); int t = Fl_Tooltip::enabled(); Fl_Tooltip::disable(); const Fl_Menu_Item* m = cmenu->popup(Fl::event_x(), Fl::event_y()); Fl_Tooltip::enable(t); if (!m) return 1; switch (m - cmenu) { case OP_UNDO: undo(); break; case OP_CUT: cut(); copy_cuts(); break; case OP_COPY: copy(1); break; case OP_PASTE: Fl::paste(*this, 1); break; case OP_DELETE: cut(); break; case OP_CLEAR: cut(0, size()); break; case OP_SELECT_ALL: position(0, size()); break; default: insert(m->text, 1); } return 1; } fldigi-4.1.06/src/widgets/flmisc.cxx0000664000175000017500000002172613507402064014232 00000000000000// ---------------------------------------------------------------------------- // flmisc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flmisc.h" #include "pixmaps.h" using namespace std; unsigned quick_choice_menu(const char* title, unsigned sel, const Fl_Menu_Item* menu) { unsigned n = menu->size(); sel = CLAMP(sel - 1, 0, n - 1); int t = Fl_Tooltip::enabled(); Fl_Tooltip::disable(); const Fl_Menu_Item* p = menu->popup(Fl::event_x(), Fl::event_y(), title, menu + sel); Fl_Tooltip::enable(t); return p ? p - menu + 1 : 0; } unsigned quick_choice(const char* title, unsigned sel, ...) { const char* item; const Fl_Menu_Item* menu = NULL; Fl_Menu_Item* p = NULL; va_list ap; va_start(ap, sel); for (size_t n = 0; (item = va_arg(ap, const char*)); n++) { if ((p = (Fl_Menu_Item*)realloc(p, (n+2) * sizeof(Fl_Menu_Item))) == NULL) { free((Fl_Menu_Item*)menu); va_end(ap); return 0; } memset(p + n, 0, 2 * sizeof(Fl_Menu_Item)); p[n].label(item); p[n+1].label(NULL); menu = p; } va_end(ap); sel = quick_choice_menu(title, sel, menu); free(p); return sel; } // Adjust and return fg color to ensure good contrast with bg Fl_Color adjust_color(Fl_Color fg, Fl_Color bg) { Fl_Color adj; unsigned max = 24; while ((adj = fl_contrast(fg, bg)) != fg && max--) fg = (adj == FL_WHITE) ? fl_color_average(fg, FL_WHITE, .9) : fl_color_average(fg, FL_BLACK, .9); return fg; } // invert colour (bg1r, bg1g, bg1b); return def if new colour does not make // good contrast with bg2 void adjust_color_inv(unsigned char& bg1r, unsigned char& bg1g, unsigned char& bg1b, Fl_Color bg2, Fl_Color def) { bg1r = 255 - bg1r; bg1g = 255 - bg1g; bg1b = 255 - bg1b; Fl_Color adj = fl_rgb_color(bg1r, bg1g, bg1b); if (fl_contrast(adj, bg2) != adj) Fl::get_color((def >= 1 ? def : adj), bg1r, bg1g, bg1b); } #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X # include # include # include void make_pixmap(Pixmap *xpm, const char **data, int argc, char** argv) { // We need a displayed window to provide a GC for X_CreatePixmap Fl_Window w(0, 0, PACKAGE_NAME); w.xclass(PACKAGE_NAME); w.border(0); w.show(argc, argv); Fl_Pixmap icon(data); int maxd = MAX(icon.w(), icon.h()); w.make_current(); *xpm = fl_create_offscreen(maxd, maxd); w.hide(); fl_begin_offscreen(*xpm); // Fl_Color(FL_BACKGROUND_COLOR); // fl_rectf(0, 0, maxd, maxd); icon.draw(maxd - icon.w(), maxd - icon.h()); fl_end_offscreen(); } #endif dialog_positions notify_dialog::positions[11] = { {0, 50, 50}, //0 {0, 150, 200}, //1 {0, 200, 350}, //2 {0, 150, 50}, //3 {0, 150, 200}, //4 {0, 200, 350}, //5 {0, 250, 50}, //6 {0, 350, 200}, //7 {0, 450, 350}, //8 {0, 350, 50}, //9 {0, 400, 300} //10 centered on screen, all dialogs past 10 }; notify_dialog::notify_dialog(int X, int Y) : Fl_Window(X, Y, 410, 103, ""), icon(10, 10, 50, 50), message(70, 25, 330, 35), dial(277, 70, 23, 23), button(309, 70, 90, 23, "Close"), resize_box(399, 26, 1, 1) { set_non_modal(); for (dialog_number = 0; dialog_number < 10; dialog_number++) if (positions[dialog_number].used == 0) break; positions[dialog_number].used = 1; position (positions[dialog_number].X, positions[dialog_number].Y); icon.image(new Fl_Pixmap(dialog_information_48_icon)); message.type (FL_MULTILINE_OUTPUT); message.box (FL_FLAT_BOX); message.color (FL_BACKGROUND_COLOR); button.callback (button_cb); newx = button.x(); dial.box(FL_FLAT_BOX); dial.type(FL_FILL_DIAL); dial.selection_color(adjust_color(fl_lighter(FL_BACKGROUND_COLOR), FL_BACKGROUND_COLOR)); dial.angle1(180); dial.angle2(-180); dial.minimum(0.0); user_button = (Fl_Button *)0; xclass(PACKAGE_TARNAME); resizable(resize_box); end(); hide(); } notify_dialog::~notify_dialog() { Fl::remove_timeout(dial_timer, &dial); this->hide(); delete icon.image(); delete user_button; positions[dialog_number].used = 0; } int notify_dialog::handle(int event) { if (event == FL_PUSH) { dial.hide(); return Fl_Window::handle(event); } return Fl_Window::handle(event); } void notify_dialog::button_cb(Fl_Widget* w, void*) { w->window()->hide(); } void notify_dialog::dial_timer(void* arg) { Fl_Dial* dial = reinterpret_cast(arg); double v = dial->value(); if (!dial->visible()) return; if (v == dial->minimum()) return dial->window()->hide(); dial->value(dial->clamp(v - 0.05)); return Fl::repeat_timeout(0.05, dial_timer, arg); } Fl_Button* notify_dialog::make_button(int W, int H) { Fl_Group* cur = Fl_Group::current(); Fl_Group::current(this); if (user_button) return user_button; int pad = 10; int X = newx - pad - W; if (X - pad - dial.w() > 0) { user_button = new Fl_Button(newx = X, button.y(), W, H); dial.position(user_button->x() - dial.w() - pad, dial.y()); } Fl_Group::current(cur); return user_button; } void notify_dialog::notify(const char* msg, double timeout) { message.value(msg); _timeout = timeout; const char* p; if ((p = strchr(msg, '\n'))) { // use first line as label string l(msg, p - msg); copy_label(l.c_str()); } else label("Notification"); fl_font(message.textfont(), message.textsize()); int H = 0; for (const char* p = msg; (p = strchr(p, '\n')); p++) H++; int nuh = 103 + max(H-1, 0) * fl_height(); resize(x(), y(), w(), nuh); } void show_notifier(notify_dialog *me) { if (me->_timeout > 0.0) { me->dial.maximum(me->_timeout); me->dial.value(me->_timeout); me->dial.show(); Fl::add_timeout(0.0, notify_dialog::dial_timer, &me->dial); } else me->dial.hide(); me->button.take_focus(); me->show(); } // ============================================================================= #ifdef BUILD_FLDIGI #include "icons.h" #include "gettext.h" Mode_Browser::Mode_Browser(void) : Fl_Double_Window(170, 460), changed_cb(NULL), changed_args(NULL) { int bw = 80, bh = 20, pad = 2; modes = new Fl_Check_Browser(pad, pad, w() - pad, h() - 2 * (bh + 2 * pad)); for (int i = 0; i < NUM_MODES; i++) modes->add(mode_info[i].name); modes->callback(modes_cb, this); modes->when(FL_WHEN_CHANGED); all_button = new Fl_Button(modes->x(), modes->y() + modes->h() + pad, bw, bh, _("Select All")); all_button->callback(button_cb, this); none_button = new Fl_Button(all_button->x(), all_button->y() + all_button->h() + pad, all_button->w(), all_button->h(), _("Clear All")); none_button->callback(button_cb, this); close_button = new Fl_Button(w() - none_button->w() - pad, none_button->y(), none_button->w(), none_button->h(), icons::make_icon_label(_("Close"), close_icon)); icons::set_icon_label(close_button); close_button->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); close_button->callback(button_cb, this); end(); resizable(modes); xclass(PACKAGE_TARNAME); } Mode_Browser::~Mode_Browser(void) { icons::free_icon_label(close_button); delete close_button; delete all_button; delete none_button; delete modes; } void Mode_Browser::show_(mode_set_t* b) { store = b; modes->check_none(); for (size_t i = 0; i < b->size(); i++) modes->checked(i + 1, store->test(i)); modes->position(0); Fl_Double_Window::show(); } void Mode_Browser::callback(Fl_Callback* cb, void* args) { changed_cb = cb; changed_args = args; } void Mode_Browser::modes_cb(Fl_Widget* w, void* arg) { Mode_Browser* m = static_cast(arg); int sel = m->modes->value(); m->store->set(sel - 1, m->modes->checked(sel)); if (m->changed_cb) m->changed_cb(m, m->changed_args); } void Mode_Browser::button_cb(Fl_Widget* w, void* arg) { Mode_Browser* m = static_cast(arg); if (w == m->close_button) m->hide(); else { if (w == m->all_button) { m->store->set(); m->modes->check_all(); } else { m->store->reset(); m->modes->check_none(); } if (m->changed_cb) m->changed_cb(m, m->changed_args); } } #endif // BUILD_FLDIGI fldigi-4.1.06/src/widgets/FTextRXTX.cxx0000664000175000017500000020424613507402064014535 00000000000000// ---------------------------------------------------------------------------- // FTextRXTX.cxx // // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // Copyright (C) 2008-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "FTextView.h" #include "main.h" #include "trx.h" #include "macros.h" #include "main.h" #include "fl_digi.h" #include "cw.h" #include "fileselect.h" #include "font_browser.h" #include "ascii.h" #include "configuration.h" #include "qrunner.h" #include "mfsk.h" #include "icons.h" #include "globals.h" #include "re.h" #include "strutil.h" #include "dxcc.h" #include "locator.h" #include "logsupport.h" #include "status.h" #include "gettext.h" #include "arq_io.h" #include "fl_digi.h" #include "strutil.h" #include "debug.h" #include "contest.h" #include "counties.h" using namespace std; // Fl_Scrollbar wrapper to draw marks on the slider background. // Currently only implemented for a vertical scrollbar. class MVScrollbar : public Fl_Scrollbar { struct mark_t { double pos; Fl_Color color; mark_t(double pos_, Fl_Color color_) : pos(pos_), color(color_) { } }; public: MVScrollbar(int X, int Y, int W, int H, const char* l = 0) : Fl_Scrollbar(X, Y, W, H, l), draw_marks(false) { } void draw(void); void mark(Fl_Color c) { marks.push_back(mark_t(maximum() - 1.0, c)); redraw(); } bool has_marks(void) { return !marks.empty(); } void show_marks(bool b) { draw_marks = b; redraw(); } void clear(void) { marks.clear(); redraw(); } private: vector marks; bool draw_marks; }; /* RX_MENU_QRZ_THIS, RX_MENU_CALL, RX_MENU_NAME, RX_MENU_QTH, RX_MENU_STATE, RX_MENU_COUNTY, RX_MENU_PROVINCE, RX_MENU_COUNTRY, RX_MENU_LOC, RX_MENU_RST_IN, RX_MENU_RST_OUT, RX_MENU_XCHG, RX_MENU_SERIAL, RX_MENU_CLASS, RX_MENU_SECTION, RX_MENU_SS_SER, RX_MENU_SS_PRE, RX_MENU_SS_CHK, RX_MENU_SS_SEC, RX_MENU_CQZONE, RX_MENU_CQSTATE, RX_MENU_1010_NR, RX_MENU_AGE, RX_MENU_CHECK, RX_MENU_NAQP, RX_MENU_SCOUT, RX_MENU_TROOP, RX_MENU_POWER, RX_MENU_QSOP_STATE, RX_MENU_QSOP_COUNTY, RX_MENU_QSOP_SERNO, RX_MENU_QSOP_NAME, RX_MENU_QSOP_XCHG, RX_MENU_QSOP_CAT, RX_MENU_DIV, RX_MENU_COPY, RX_MENU_CLEAR, RX_MENU_SELECT_ALL, RX_MENU_SAVE, RX_MENU_WRAP, RX_MENU_ALL_ENTRY, RX_MENU_SCROLL_HINTS, RX_MENU_NUM_ITEMS */ Fl_Menu_Item FTextRX::menu[] = { { icons::make_icon_label(_("Look up call"), net_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Call"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Name"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QTH"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("State"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("County"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Province"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Country"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Locator"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("RST(r)"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("RST(s)"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Exchange In"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Rx Serial #"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Class"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Section"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS ser #"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS prec"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS check"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS section"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("CQ zone"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("CQ STATE"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("1010 Nr"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Kid's Age"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Round Up Chk"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("NAQP xchg"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("JOTA scout"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("JOTA troop"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("POWER(r)"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp state"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp county"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp serno"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp name"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp xchg"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp category"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Insert marker"), insert_link_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { 0 }, // VIEW_MENU_COPY { 0 }, // VIEW_MENU_CLEAR { 0 }, // VIEW_MENU_SELECT_ALL { 0 }, // VIEW_MENU_SAVE { 0 }, // VIEW_MENU_WRAP { _("All entries"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { _("Scroll hints"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { 0 } }; /// FTextRX constructor. /// We remove \c Fl_Text_Display_mod::buffer_modified_cb from the list of callbacks /// because we want to scroll depending on the visibility of the last line; @see /// changed_cb. /// @param x /// @param y /// @param w /// @param h /// @param l FTextRX::FTextRX(int x, int y, int w, int h, const char *l) : FTextView(x, y, w, h, l) { memcpy(menu + RX_MENU_COPY, FTextView::menu, (FTextView::menu->size() - 1) * sizeof(*FTextView::menu)); context_menu = menu; init_context_menu(); menu[RX_MENU_ALL_ENTRY].clear(); menu[RX_MENU_SCROLL_HINTS].clear(); menu[RX_MENU_WRAP].hide(); // Replace the scrollbar widget MVScrollbar* mvsb = new MVScrollbar(mVScrollBar->x(), mVScrollBar->y(), mVScrollBar->w(), mVScrollBar->h(), NULL); mvsb->show_marks(false); mvsb->callback(mVScrollBar->callback(), mVScrollBar->user_data()); remove(mVScrollBar); delete mVScrollBar; Fl_Group::add(mVScrollBar = mvsb); mFastDisplay = 1; num_words = 1; } FTextRX::~FTextRX() { } /// Handles fltk events for this widget. /// We only care about mouse presses (to display the popup menu and prevent /// pasting) and keyboard events (to make sure no text can be inserted). /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextRX::handle(int event) { static Fl_Cursor cursor; switch (event) { case FL_DRAG: if (Fl::event_button() != FL_LEFT_MOUSE) return 1; break; case FL_PUSH: if (!Fl::event_inside(this)) break; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (progdefaults.rxtext_clicks_qso_data) { if (handle_clickable(Fl::event_x() - x(), Fl::event_y() - y())) return 1; if (handle_qso_data(Fl::event_x() - x(), Fl::event_y() - y())) return 1; } goto out; case FL_MIDDLE_MOUSE: if (cursor != FL_CURSOR_HAND) { if (handle_qso_data(Fl::event_x() - x(), Fl::event_y() - y())) { return 1; } } goto out; case FL_RIGHT_MOUSE: handle_context_menu(); return 1; default: goto out; } break; case FL_RELEASE: break; case FL_MOVE: { int p = xy_to_position(Fl::event_x(), Fl::event_y(), Fl_Text_Display_mod::CURSOR_POS); if ((unsigned char)sbuf->byte_at(p) >= CLICK_START + FTEXT_DEF) { if (cursor != FL_CURSOR_HAND) window()->cursor(cursor = FL_CURSOR_HAND); return 1; } else cursor = FL_CURSOR_INSERT; break; } // catch some text-modifying events that are not handled by kf_* functions case FL_KEYBOARD: break; case FL_PASTE: return 0; case FL_ENTER: if (!progdefaults.rxtext_tooltips || Fl_Tooltip::delay() == 0.0f) break; tooltips.enabled = Fl_Tooltip::enabled(); tooltips.delay = Fl_Tooltip::delay(); Fl_Tooltip::enable(1); Fl_Tooltip::delay(0.0f); Fl::add_timeout(tooltips.delay / 2.0, dxcc_tooltip, this); break; case FL_LEAVE: window()->cursor(FL_CURSOR_DEFAULT); if (!progdefaults.rxtext_tooltips || Fl_Tooltip::delay() != 0.0f) break; Fl_Tooltip::enable(tooltips.enabled); Fl_Tooltip::delay(tooltips.delay); Fl::remove_timeout(dxcc_tooltip, this); break; } out: return FTextView::handle(event); } /// Adds a char to the buffer /// /// @param c The character /// @param attr The attribute (@see enum text_attr_e); RECV if omitted. /// void FTextRX::add(unsigned int c, int attr) { if (c == '\r') return; char s[] = { '\0', '\0', char( FTEXT_DEF + attr ), '\0' }; const char *cp = &s[0]; // The user may have moved the cursor by selecting text or // scrolling. Place it at the end of the buffer. if (mCursorPos != tbuf->length()) insert_position(tbuf->length()); switch (c) { case '\b': // we don't call kf_backspace because it kills selected text if (s_text.length()) { int character_start = tbuf->utf8_align(tbuf->length() - 1); int character_length = fl_utf8len1(tbuf->byte_at(character_start)); tbuf->remove(character_start, tbuf->length()); sbuf->remove(character_start, sbuf->length()); s_text.resize(s_text.length() - character_length); s_style.resize(s_style.length() - character_length); } break; case '\n': // maintain the scrollback limit, if we have one if (max_lines > 0 && tbuf->count_lines(0, tbuf->length()) >= max_lines) { int le = tbuf->line_end(0) + 1; // plus 1 for the newline tbuf->remove(0, le); sbuf->remove(0, le); } s_text.clear(); s_style.clear(); insert("\n"); sbuf->append(s + 2); break; default: if ((c < ' ' || c == 127) && attr != CTRL) // look it up cp = ascii[(unsigned char)c]; else // insert verbatim s[0] = c; for (int i = 0; cp[i]; ++i) { s_text += cp[i]; s_style += s[2]; } fl_font( textfont(), textsize() ); int lwidth = (int)fl_width( s_text.c_str(), s_text.length()); bool wrapped = false; if ( lwidth >= (text_area.w - mVScrollBar->w() - LEFT_MARGIN - RIGHT_MARGIN)) { if (c != ' ') { size_t p = s_text.rfind(' '); if (p != string::npos) { s_text.erase(0, p+1); s_style.erase(0, p+1); if (s_text.length() < 10) { // wrap and delete trailing space tbuf->remove(tbuf->length() - s_text.length(), tbuf->length()); sbuf->remove(sbuf->length() - s_style.length(), sbuf->length()); insert("\n"); // always insert new line sbuf->append(s + 2); insert(s_text.c_str()); sbuf->append(s_style.c_str()); wrapped = true; } } } if (!wrapped) { // add a new line if not wrapped insert("\n"); sbuf->append(s + 2); s_text.clear(); s_style.clear(); if (c != ' ') { // add character if not a space (no leading spaces) for (int i = 0; cp[i]; ++i) { sbuf->append(s + 2); s_style.append(s + 2); } s_text.append(cp); insert(cp); } } } else { for (int i = 0; cp[i]; ++i) sbuf->append(s + 2); insert(cp); } break; } // test for bottom of text visibility if (// !mFastDisplay && (mVScrollBar->value() >= mNBufferLines - mNVisibleLines + mVScrollBar->linesize() - 1)) show_insert_position(); } void FTextRX::set_all_entry(bool b) { if (b) menu[RX_MENU_ALL_ENTRY].set(); else menu[RX_MENU_ALL_ENTRY].clear(); } void FTextRX::set_scroll_hints(bool b) { if (b) menu[RX_MENU_SCROLL_HINTS].set(); else menu[RX_MENU_SCROLL_HINTS].clear(); static_cast(mVScrollBar)->show_marks(b); } void FTextRX::mark(FTextBase::TEXT_ATTR attr) { if (attr == NATTR) attr = CLICK_START; static_cast(mVScrollBar)->mark(styles[attr].color); } void FTextRX::clear(void) { FTextBase::clear(); s_text.clear(); s_style.clear(); static_cast(mVScrollBar)->clear(); } void FTextRX::setFont(Fl_Font f, int attr) { FTextBase::setFont(f, attr); } int FTextRX::handle_clickable(int x, int y) { int pos; unsigned int style; pos = xy_to_position(x + this->x(), y + this->y(), CURSOR_POS); // return unless clickable style if ((style = (unsigned char)sbuf->byte_at(pos)) < CLICK_START + FTEXT_DEF) return 0; int start, end; for (start = pos-1; start >= 0; start--) if ((unsigned char)sbuf->byte_at(start) != style) break; start++; int len = sbuf->length(); for (end = pos+1; end < len; end++) if ((unsigned char)sbuf->byte_at(end) != style) break; switch (style - FTEXT_DEF) { case QSY: handle_qsy(start, end); return 1; break; // ... default: break; } return 0; } void FTextRX::handle_qsy(int start, int end) { char* text = tbuf->text_range(start, end); extern map qrg_marks; map::const_iterator i; if ((i = qrg_marks.find(text)) != qrg_marks.end()) { const qrg_mode_t& m = i->second; if (active_modem->get_mode() != m.mode) init_modem_sync(m.mode); qsy(m.rfcarrier, m.carrier); } free(text); } static fre_t rst("^[1-5][123456789nN]{2}$", REG_EXTENDED | REG_NOSUB); static fre_t loc("[a-r]{2}[[:digit:]]{2}([a-x]{2})?", REG_EXTENDED | REG_ICASE); static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); void set_cbo_county(string str) { inpCounty->value(str.c_str()); inpSQSO_county1->value(str.c_str()); inpSQSO_county2->value(str.c_str()); Cstates st; if (inpState->value()[0]) cboCountyQSO->value( string(st.state_short(inpState->value())).append(" "). append(st.county(inpState->value(), inpCounty->value())).c_str()); else cboCountyQSO->clear_entry(); cboCountyQSO->redraw(); } void set_QSO_call(const char *s) { if (progdefaults.clear_fields) clearQSO(); std::string call = ucasestr(s); inpCall1->value(call.c_str()); inpCall2->value(call.c_str()); inpCall3->value(call.c_str()); inpCall4->value(call.c_str()); if (progStatus.timer && (Fl::event() != FL_HIDE)) stopMacroTimer(); sDate_on = sDate_off = zdate(); sTime_on = sTime_off = ztime(); inpTimeOn->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn1->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn2->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn3->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn4->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn5->value(inpTimeOff->value(), inpTimeOff->size()); updateOutSerNo(); } void set_cbo_Country(std::string c) { cboCountryQSO->value(c.c_str()); cboCountryAICW2->value(c.c_str()); cboCountryAIDX2->value(c.c_str()); cboCountryCQDX2->value(c.c_str()); cboCountryCQ2->value(c.c_str()); cboCountryIARI2->value(c.c_str()); cboCountryRTU2->value(c.c_str()); // cboCountryWAE2->value(c.c_str()); if (progdefaults.logging == LOG_JOTA) inp_JOTA_spc->value(c.c_str()); if (progdefaults.logging == LOG_ARR) inpXchgIn->value(c.c_str()); } void set_zone(std::string z) { inp_CQDXzone1->value(z.c_str()); inp_CQDXzone2->value(z.c_str()); inp_CQzone1->value(z.c_str()); inp_CQzone2->value(z.c_str()); } void set_name(std::string nm) { inpName->value(nm.c_str()); inpName1->value(nm.c_str()); inpName2->value(nm.c_str()); inp_1010_name2->value(nm.c_str()); inp_ARR_Name2->value(nm.c_str()); inpNAQPname2->value(nm.c_str()); inp_ASCR_name2->value(nm.c_str()); } void set_rst_in(std::string rst) { for (size_t n = 0; n < rst.length(); n++) if (rst[n] == 'N') rst[n] = '9'; inpRstIn->value(rst.c_str()); inpRTU_RSTin2->value(rst.c_str()); inpRstIn1->value(rst.c_str()); inpRstIn2->value(rst.c_str()); inpRstIn3->value(rst.c_str()); inpRstIn4->value(rst.c_str()); inpRstIn_AICW2->value(rst.c_str()); inpRstIn_SQSO2->value(rst.c_str()); inpRstIn_WPX2->value(rst.c_str()); inp_IARI_RSTin2->value(rst.c_str()); // inpRstIn_WAE2->value(rst.c_str()); } void set_rst_out(std::string rst) { for (size_t n = 0; n < rst.length(); n++) if (rst[n] == 'N') rst[n] = '9'; inpRstOut->value(rst.c_str()); inpRstOut1->value(rst.c_str()); inpRstOut2->value(rst.c_str()); inpRstOut3->value(rst.c_str()); inpRstOut4->value(rst.c_str()); inpRstOut_AICW2->value(rst.c_str()); inpRstOut_SQSO2->value(rst.c_str()); inpRstOut_WPX2->value(rst.c_str()); inp_IARI_RSTout2->value(rst.c_str()); // inpRstOut_WAE2->value(rst.c_str()); } void set_rst(std::string rst) { if (inpRstIn->value()[0] == 0) set_rst_in(rst); else set_rst_out(rst); } void set_state(std::string s) { s = ucasestr(s); inpState->value(s.c_str()); inpState1->value(s.c_str()); inp_CQstate1->value(s.c_str()); inp_CQstate2->value(s.c_str()); inp_KD_state1->value(s.c_str()); inp_KD_state2->value(s.c_str()); inpSQSO_state1->value(s.c_str()); inpSQSO_state2->value(s.c_str()); } void set_province(std::string pr) { pr = ucasestr(pr); inpVEprov->value(pr.c_str()); inp_KD_VEprov1->value(pr.c_str()); inp_KD_VEprov2->value(pr.c_str()); } void set_serno_in(std::string s) { inpSerNo->value(s.c_str()); inpSerNo1->value(s.c_str()); inpSerNo2->value(s.c_str()); inpSerNo3->value(s.c_str()); inpSerNo4->value(s.c_str()); inpSerNo_WPX1->value(s.c_str()); inpSerNo_WPX2->value(s.c_str()); inpRTU_serno1->value(s.c_str()); inpRTU_serno2->value(s.c_str()); inpSQSO_serno1->value(s.c_str()); inpSQSO_serno2->value(s.c_str()); inp_IARI_SerNo1->value(s.c_str()); inp_IARI_SerNo2->value(s.c_str()); // inpSerNo_WAE1->value(s.c_str()); // inpSerNo_WAE2->value(s.c_str()); } void parseSQSO(std::string str) { if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP" && str.length() == 5 && !inpState->value()[0]) { set_state(str.substr(0,2).c_str()); set_cbo_county(str); return; } if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE" && str.length() == 5 && !inpState->value()[0]) { set_state(str.substr(str.length() - 2, 2).c_str()); set_cbo_county(str); return; } if (progdefaults.SQSOinstate) { if (state_test(str)) { set_state(str); return; } } std::string st = inpState->value(); std::string inState = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (st == "6NE" || st == "7QP") { st.clear(); } else if (st.empty()) st = inState; bool chkC = check_field(str, cCNTY, st); bool chkP = check_field(str, cDIST, st); bool chkCin = check_field(str, cCNTY, inState); bool chkPin = check_field(str, cDIST, inState); if ( QSOparties.qso_parties[progdefaults.SQSOcontest].st && !st.empty() && progdefaults.SQSOlogcounty && (chkC || chkP) ) { if (progdefaults.SQSOinstate && !inpState->value()[0]) set_state(st); set_cbo_county(states.cnty_short(st, str)); return; } if ((chkCin || chkPin) && inpCounty->value()[0] == 0) { set_state(st.c_str()); set_cbo_county(states.cnty_short(st, str)); return; } if (progdefaults.SQSOlogstate && check_field(str, cSTATE) && !inpState->value()[0]) { set_state(str); return; } if (progdefaults.SQSOlogstate && check_field(str, cVE_PROV) && !inpState->value()[0]) { set_state(str); return; } if (section_test(str) && !inpState->value()[0]) { set_state(str); return; } if (check_field(str, cCOUNTRY)) { cboCountry->value(country_match.c_str()); return; } if (progdefaults.SQSOlogserno && check_field(str, cNUMERIC) && !inpSerNo->value()[0]) { set_serno_in(str); return; } { bool bCAT = (QSOparties.qso_parties[progdefaults.SQSOcontest].cat[0]); string category = ucasestr(str); if (bCAT && (category == "CLB" || category == "MOB" || category == "QRP" || category == "STD")) { inpSQSO_category->value(category.c_str()); return; } } if (!inpName->value()[0] && !isdigit(str[0]) && !chkC && !chkP && !chkCin && !chkPin) { set_name(str); return; } if (check_field(str, cRST) ) { set_rst(str); } } // capture 1, 2, or 3 sequential words from RX text // 1 - left click on word // 2 - shift-left click on first word // 3 - ctrl-left click on first word // 4 - shift-ctrl-left click on first word int FTextRX::handle_qso_data(int start, int end) { if (start < 0 || end < 0) return 0; num_words = 1; if (Fl::event_state() & FL_SHIFT) { num_words = 2; } if (Fl::event_state() & FL_CTRL) { num_words = 3; if (Fl::event_state() & FL_SHIFT) { num_words = 4; } } char *sz = get_word(start, end, progdefaults.nonwordchars.c_str(), num_words); if (!sz) return 0; std::string sz_str = sz; free(sz); if (sz_str.empty()) return 0; while (sz_str[sz_str.length() -1] <= ' ') sz_str.erase(sz_str.length() - 1); // remove leading substrings such as 'loc:' 'qth:' 'op:' etc size_t sp = std::string::npos; if ((sp = sz_str.find(":")) != std::string::npos) sz_str.erase(0, sp+1); if (sz_str.empty()) return 0; char* s = (char *)sz_str.c_str(); char* p = (char *)sz_str.c_str(); if (progdefaults.logging != LOG_QSO) { if (loc.match(s)) { // force maidenhead match to exchange // or it will overwrite the call inpXchgIn->position(inpXchgIn->size()); if (inpXchgIn->size()) inpXchgIn->insert(" ", 1); if (progdefaults.logging == LOG_VHF) inpLoc->value(s); else { inpXchgIn->insert(s); log_callback(inpXchgIn); } } else if (call.match(s)) { // point p to substring const regmatch_t& offsets = call.suboff()[1]; p = s + offsets.rm_so; *(s + offsets.rm_eo) = '\0'; set_QSO_call(p); Fl::copy(p, strlen(p), 1); // copy to clipboard if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { set_state(""); } const dxcc *e = dxcc_lookup(p); std::ostringstream zone; zone << e->cq_zone; if (e) { set_cbo_Country(e->country); set_zone(zone.str()); } DupCheck(); } else { std::string str = ucasestr(s); switch (progdefaults.logging) { case LOG_FD: if (check_field(str, cFD_SECTION) && !inpSection->value()[0]) { inpSection->value(str.c_str()); break; } if (check_field(str, cFD_CLASS) && !inpClass->value()[0]) { inpClass->value(str.c_str()); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_WFD: if (check_field(str, cFD_SECTION) && !inpSection->value()[0]) { inpSection->value(str.c_str()); break; } if (check_field(str, cWFD_CLASS) && !inpClass->value()[0]) { inpClass->value(str.c_str()); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_CQWW_DX: if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cNUMERIC) && !inp_CQzone->value()[0]) { set_zone(s); break; } if (check_field(s, cRST)) { if (!inpRstIn->value()[0]) set_rst_in(s); else if (!inpRstOut->value()[0]) set_rst_out(s); } break; case LOG_CQWW_RTTY : if ( (check_field(str, cSTATE) || check_field(str, cVE_PROV)) && !inp_CQstate->value()[0] ) { inp_CQstate->value(s); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cNUMERIC) && !inp_CQzone->value()[0]) { set_zone(s); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_KD: if (inpName->value()[0] == 0) { set_name(s); break; } if (!check_field(s, cRST) && check_field(s, cNUMERIC) && inp_KD_age->value()[0] == 0) { inp_KD_age->value(s); break; } if (check_field(s, cSTATE) && !inpState->value()[0]) { set_state(s); break; } if (check_field(s, cVE_PROV) && !inpVEprov->value()[0]) { set_province(s); break; } if (check_field(s, cRST)) { set_rst(s); break; } if (!inpXchgIn->value()[0]) { inpXchgIn->position(inpXchgIn->size()); if (inpXchgIn->size()) inpXchgIn->insert(" ", 1); inpXchgIn->insert(s); } break; case LOG_ASCR: if (check_field(s, cASCR_CLASS) && !inpClass->value()[0]) { inpClass->value(s); break; } if (check_field(ucasestr(s), cSTATE) && !inpXchgIn->value()[0]) { inpXchgIn->value(ucasestr(s).c_str()); break; } if (check_field(ucasestr(s), cVE_PROV) && !inpXchgIn->value()[0]) { inpXchgIn->value(ucasestr(s).c_str()); break; } if (!inpName->value()[0]) { set_name(s); break; } if (check_field(s, cRST)) { set_rst(s); break; } inpXchgIn->value(s); break; case LOG_ARR: // rookie roundup if (check_field(s, cRST)) { set_rst(s); break; } if (check_field(s, cROOKIE) && !inp_ARR_check->value()[0]) { if (strlen(s) > 2) inp_ARR_check->value(s + 2); else inp_ARR_check->value(s); break; } if (!inpName->value()[0]) { set_name(s); break; } if (check_field(ucasestr(s), cCHECK) && !inpXchgIn->value()[0]) { inpXchgIn->value(ucasestr(s).c_str()); break; } if (!inpXchgIn->value()[0]) { inpXchgIn->value(s); break; } break; case LOG_AICW: if (check_field(s, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(s, cNUMERIC) && !inpSPCnum->value()[0]) { inpSPCnum->value(s); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_1010: if (check_field(s, c1010) && !inp_1010_nr->value()[0]) { inp_1010_nr->value(s); break; } if (check_field(s, cRST)) { set_rst(s); break; } if (check_field(ucasestr(s), cSTATE) && !inpXchgIn->value()[0]) { inpXchgIn->value(s); break; } if (check_field(ucasestr(s), cVE_PROV) && !inpXchgIn->value()[0]) { inpXchgIn->value(ucasestr(s).c_str()); break; } if (!inpName->value()[0]) { set_name(s); break; } inpXchgIn->value(s); break; case LOG_NAQP: if (!inpName->value()[0]) { set_name(s); break; } else if (!inpSPCnum->value()[0]) { inpSPCnum_NAQP1->value(s); inpSPCnum_NAQP2->value(s); inpXchgIn1->value(s); inpXchgIn2->value(s); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_CWSS: if (check_field(str, cSS_SEC) && !inp_SS_Section->value()[0]) { inp_SS_Section->value(str.c_str()); break; } if (check_field(str, cSS_SERNO) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(str, cSS_PREC) && !inp_SS_Precedence->value()[0]) { inp_SS_Precedence->value(s); break; } if (check_field(str, cSS_CHK) && !inp_SS_Check->value()[0]) { inp_SS_Check->value(str.c_str()); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_CQ_WPX: if (check_field(str, cNUMERIC) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(s, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_RTTY: // ARRL RTTY Round Up if (check_field(str, cSTATE) || check_field(str, cVE_PROV)) { set_state(str); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(s, cRST)) { set_rst(s); break; } if (check_field(s, cNUMERIC) && !inpSerNo->value()[0]) { set_serno_in(str); break; } break; case LOG_IARI: if (check_field(ucasestr(str), cITALIAN)) { inp_IARI_PR1->value(ucasestr(str).c_str()); inp_IARI_PR2->value(ucasestr(str).c_str()); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(s, cRST)) { set_rst(s); break; } if (check_field(str, cNUMERIC)) { set_serno_in(str); break; } break; case LOG_NAS: if (check_field(str, cNUMERIC) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(str, cSTATE) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (check_field(str, cVE_PROV) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (check_field(str, cCOUNTRY) && !inpXchgIn->value()[0]) { set_cbo_Country(str); inpXchgIn->value(str.c_str()); break; } if (inpName->value()[0] == 0 && !inpName->value()[0]) { set_name(str); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_AIDX: if (check_field(str, cNUMERIC) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(str, cCOUNTRY) && !inpXchgIn->value()[0]) { set_cbo_Country(str); inpXchgIn->value(str.c_str()); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_JOTA: if (check_field(s, cRST)) { set_rst(s); break; } if (check_field(str, cNUMERIC) && !inp_JOTA_troop->value()[0]) { inp_JOTA_troop->value(str.c_str()); break; } if (check_field(str, cSTATE)) { set_state(str); break; } if (check_field(str, cVE_PROV)) { set_province(str); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(str); inpXchgIn->value(str.c_str()); break; } inp_JOTA_scout->value(str.c_str()); break; // case LOG_WAE: // if (!inpSerNo->value()[0] && check_field(str, cNUMERIC)) { // set_serno_in(str); // break; // } // if (check_field(str, cCOUNTRY)) { // cboCountryCQ1->value(country_match.c_str()); // cboCountryCQ2->value(country_match.c_str()); // cboCountry->value(country_match.c_str()); // } // if (check_field(s, cRST)) { // set_rst(s); // break; // } // break; case LOG_VHF: if (check_field(s, cRST)) set_rst(s); break; case LOG_SQSO: parseSQSO(str); break; default: if (check_field(s, cRST)) { set_rst(s); break; } inpXchgIn->position(inpXchgIn->size()); if (inpXchgIn->size()) inpXchgIn->insert(" ", 1); inpXchgIn->insert(s); log_callback(inpXchgIn); } } DupCheck(); restoreFocus(91); return 1; } else { if (loc.match(s) && inpCall->value()[0]) { inpLoc->value(p); log_callback(inpLoc); restoreFocus(); DupCheck(); return 1; } else if (call.match(s)) { // point p to substring const regmatch_t& offsets = call.suboff()[1]; p = s + offsets.rm_so; *(s + offsets.rm_eo) = '\0'; Fl::copy(p, strlen(p), 1); // copy to clipboard set_QSO_call(p); log_callback(inpCall); restoreFocus(); return 1; } else if (rst.match(s)) { set_rst(s); restoreFocus(); return 1; } else if (!inpName->value()[0]) { set_name(p); restoreFocus(); return 1; } else if (!inpQTH->value()[0]) { inpQTH->value(p); log_callback(inpQTH); restoreFocus(); return 1; } else if (!inpState->value()[0]) { set_state(p); log_callback(inpState); restoreFocus(); DupCheck(); return 1; } } return 0; } void FTextRX::handle_context_menu(void) { bool contest_ui = (progdefaults.logging != LOG_QSO); num_words = 1; if (Fl::event_state() & FL_SHIFT) { num_words = 2; } if (Fl::event_state() & FL_CTRL) { num_words = 3; if (Fl::event_state() & FL_SHIFT) { num_words = 4; } } unsigned shown[RX_MENU_NUM_ITEMS]; for (int i = 0; i < RX_MENU_NUM_ITEMS; shown[i++] = 0); // all hidden #define show_item(x_) (shown[x_] = 1) #define hide_item(x_) (shown[x_] = 0) #define test_item(x_) (shown[x_] == 1) show_item(RX_MENU_CALL); if (contest_ui) { switch (progdefaults.logging) { case LOG_FD: case LOG_WFD: show_item(RX_MENU_CLASS); show_item(RX_MENU_SECTION); break; case LOG_CQ_WPX: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_CQZONE); show_item(RX_MENU_COUNTRY); show_item(RX_MENU_SERIAL); break; case LOG_CQWW_DX: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_CQZONE); show_item(RX_MENU_COUNTRY); break; case LOG_CQWW_RTTY: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_CQZONE); show_item(RX_MENU_CQSTATE); show_item(RX_MENU_COUNTRY); break; case LOG_ASCR: show_item(RX_MENU_NAME); show_item(RX_MENU_CLASS); show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_XCHG); break; case LOG_VHF: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_LOC); break; case LOG_CWSS: show_item(RX_MENU_SS_SER); show_item(RX_MENU_SS_PRE); show_item(RX_MENU_SS_CHK); show_item(RX_MENU_SS_SEC); break; case LOG_1010: show_item(RX_MENU_NAME); show_item(RX_MENU_1010_NR); show_item(RX_MENU_XCHG); break; case LOG_ARR: show_item(RX_MENU_NAME); show_item(RX_MENU_CHECK); show_item(RX_MENU_XCHG); break; case LOG_AICW: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_POWER); show_item(RX_MENU_COUNTRY); break; case LOG_KD: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_NAME); show_item(RX_MENU_AGE); show_item(RX_MENU_STATE); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_XCHG); break; case LOG_NAS: show_item(RX_MENU_NAME); show_item(RX_MENU_SERIAL); show_item(RX_MENU_STATE); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_COUNTRY); break; case LOG_AIDX: show_item(RX_MENU_SERIAL); show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_COUNTRY); break; case LOG_NAQP: show_item(RX_MENU_NAME); show_item(RX_MENU_NAQP); break; case LOG_RTTY: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_STATE); show_item(RX_MENU_COUNTRY); show_item(RX_MENU_SERIAL); break; case LOG_IARI: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_COUNTRY); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_SERIAL); break; case LOG_JOTA: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_SCOUT); show_item(RX_MENU_TROOP); show_item(RX_MENU_STATE); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_COUNTRY); break; case LOG_SQSO: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_QSOP_STATE); show_item(RX_MENU_QSOP_COUNTY); show_item(RX_MENU_QSOP_SERNO); show_item(RX_MENU_QSOP_NAME); show_item(RX_MENU_QSOP_CAT); break; // case LOG_WAE: // show_item(RX_MENU_RST_IN); // show_item(RX_MENU_RST_OUT); // show_item(RX_MENU_SERIAL); // show_item(RX_MENU_COUNTRY); // break; case LOG_GENERIC: case LOG_BART: default: show_item(RX_MENU_NAME); show_item(RX_MENU_SERIAL); show_item(RX_MENU_XCHG); break; } } else { show_item(RX_MENU_NAME); show_item(RX_MENU_QTH); show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); // "Look up call" shown only in non-contest mode if (progdefaults.QRZWEB != QRZWEBNONE || progdefaults.QRZXML != QRZXMLNONE) show_item(RX_MENU_QRZ_THIS); menu[RX_MENU_CALL].flags |= FL_MENU_DIVIDER; } if (menu[RX_MENU_ALL_ENTRY].value()) { for (size_t i = RX_MENU_NAME; i <= RX_MENU_RST_OUT; i++) show_item(i); menu[RX_MENU_CALL].flags &= ~FL_MENU_DIVIDER; } if (static_cast(mVScrollBar)->has_marks()) menu[RX_MENU_SCROLL_HINTS].show(); else menu[RX_MENU_SCROLL_HINTS].hide(); for (size_t i = RX_MENU_QRZ_THIS; i < RX_MENU_DIV; i++) { if (test_item(i)) menu[i].show(); else menu[i].hide(); } #undef show_item #undef hide_item #undef test_item // availability of editing items depend on buffer state icons::set_active(&menu[RX_MENU_COPY], tbuf->selected()); icons::set_active(&menu[RX_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[RX_MENU_SELECT_ALL], tbuf->length()); icons::set_active(&menu[RX_MENU_SAVE], tbuf->length()); if (wrap) menu[RX_MENU_WRAP].set(); else menu[RX_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextRX::menu_cb(size_t item) { Fl_Input2* input = 0; std::string s; char* str = get_word(popx, popy, "", 1, false); if (str) { s = str; free(str); } // remove leading substrings such as 'loc:' 'qth:' 'op:' etc size_t sp = std::string::npos; if ((sp = s.find(":")) != std::string::npos) s.erase(0, sp+1); if (!s.empty()) while (s[s.length() -1] <= ' ') s.erase(s.length() - 1); if (s.empty()) { switch (item) { case RX_MENU_CLEAR: clear(); break; case RX_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case RX_MENU_SAVE: saveFile(); break; case RX_MENU_ALL_ENTRY: menu[item].flags ^= FL_MENU_VALUE; if (menu[item].value()) handle_context_menu(); break; case RX_MENU_WRAP: set_word_wrap(!wrap, true); break; case RX_MENU_DIV: note_qrg(false, "\n", "\n"); break; case RX_MENU_SCROLL_HINTS: menu[item].flags ^= FL_MENU_VALUE; static_cast(mVScrollBar)->show_marks(menu[item].value()); break; default: ; } return; } switch (item) { case RX_MENU_QRZ_THIS: menu_cb(RX_MENU_CALL); extern void CALLSIGNquery(); CALLSIGNquery(); break; case RX_MENU_CALL: input = inpCall; break; case RX_MENU_NAME: input = inpName; break; case RX_MENU_QTH: input = inpQTH; break; case RX_MENU_STATE: if (progdefaults.logging == LOG_NAS) input = inpXchgIn; else if (progdefaults.logging == LOG_JOTA) input = inp_JOTA_spc; else input = inpState; break; case RX_MENU_LOC: input = inpLoc; break; case RX_MENU_RST_IN: input = inpRstIn; break; case RX_MENU_RST_OUT: input = inpRstOut; break; case RX_MENU_SERIAL: if (progdefaults.logging == LOG_IARI) input = inpXchgIn; else input = inpSerNo; break; case RX_MENU_XCHG: input = inpXchgIn; break; case RX_MENU_POWER: input = inpSPCnum; break; case RX_MENU_CLASS: input = inpClass; break; case RX_MENU_SECTION: input = inpSection; break; case RX_MENU_SS_SER: input = inp_SS_SerialNoR; break; case RX_MENU_SS_PRE: input = inp_SS_Precedence; break; case RX_MENU_SS_CHK: input = inp_SS_Check; break; case RX_MENU_SS_SEC: input = inp_SS_Section; break; case RX_MENU_CQZONE: input = inp_CQzone; break; case RX_MENU_CQSTATE: input = inp_CQstate; break; case RX_MENU_1010_NR: input = inp_1010_nr; break; case RX_MENU_AGE: input = inp_KD_age; break; case RX_MENU_CHECK: input = inp_ARR_check; break; case RX_MENU_NAQP: input = inpSPCnum; break; case RX_MENU_SCOUT: input = inp_JOTA_scout; break; case RX_MENU_TROOP: input = inp_JOTA_troop; break; case RX_MENU_QSOP_STATE: input = inpState; break; case RX_MENU_QSOP_COUNTY: input = inpCounty; break; case RX_MENU_QSOP_SERNO: input = inpSerNo; break; case RX_MENU_QSOP_NAME: input = inpName; break; case RX_MENU_QSOP_XCHG: input = inpXchgIn; break; case RX_MENU_QSOP_CAT: input = inpXchgIn; break; case RX_MENU_DIV: note_qrg(false, "\n", "\n"); break; case RX_MENU_COPY: kf_copy(Fl::event_key(), this); break; case RX_MENU_CLEAR: clear(); break; case RX_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case RX_MENU_SAVE: saveFile(); break; case RX_MENU_ALL_ENTRY: menu[item].flags ^= FL_MENU_VALUE; if (menu[item].value()) handle_context_menu(); break; case RX_MENU_WRAP: set_word_wrap(!wrap, true); break; case RX_MENU_SCROLL_HINTS: menu[item].flags ^= FL_MENU_VALUE; static_cast(mVScrollBar)->show_marks(menu[item].value()); break; case RX_MENU_COUNTRY: if (progdefaults.logging == LOG_NAS) inpXchgIn->value(s.c_str()); else if (progdefaults.logging == LOG_JOTA) inp_JOTA_spc->value(s.c_str()); else cboCountry->value(s.c_str()); return; case RX_MENU_PROVINCE: if (progdefaults.logging == LOG_NAS) inpXchgIn->value(s.c_str()); else if (progdefaults.logging == LOG_JOTA) inp_JOTA_spc->value(s.c_str()); else if (progdefaults.logging == LOG_IARI) inpXchgIn->value(s.c_str()); else set_province(s); return; case RX_MENU_COUNTY: set_cbo_county(s.c_str()); return; default: return; } restoreFocus(92); if (!input) return; if (item == RX_MENU_XCHG) { // append input->position(input->size()); if (input->size()) input->insert(" ", 1); input->insert(s.c_str()); } else if (item == RX_MENU_SECTION) { if (check_field(ucasestr(s).c_str(), cFD_SECTION)) input->value(ucasestr(s).c_str()); } else if (item == RX_MENU_CLASS) { if (check_field(ucasestr(s).c_str(), cFD_CLASS)) input->value(ucasestr(s).c_str()); } else if (item == RX_MENU_RST_IN) { if (check_field(s, cRST)) { set_rst_in(s); } } else if (item == RX_MENU_RST_OUT) { if (check_field(s, cRST)) set_rst_out(s); } else { if (input == inpCounty) set_cbo_county(s.c_str()); else { input->value(s.c_str()); log_callback(input); } } } const char* FTextRX::dxcc_lookup_call(int x, int y) { char* s = get_word(x - this->x(), y - this->y(), progdefaults.nonwordchars.c_str()); char* mem = s; if (!(s && *s && call.match(s))) { free(s); return 0; } double lon1, lat1, lon2 = 360.0, lat2 = 360.0, distance, azimuth; static string tip; ostringstream stip; const dxcc* e = 0; cQsoRec* qso = 0; unsigned char qsl; // prevent locator-only lookup if Ctrl is held if (!(Fl::event_state() & FL_CTRL) && loc.match(s)) { const vector& v = loc.suboff(); s += v[0].rm_so; *(s + v[0].rm_eo) = '\0'; if (QRB::locator2longlat(&lon2, &lat2, s) != QRB::QRB_OK) goto ret; e = 0; qsl = 0; qso = 0; } else { e = dxcc_lookup(s); qsl = qsl_lookup(s); qso = SearchLog(s); } if (qso && QRB::locator2longlat(&lon2, &lat2, qso->getField(GRIDSQUARE)) != QRB::QRB_OK) lon2 = lat2 = 360.0; if (e) { // use dxcc data if we didn't have a good locator string in the log file if (lon2 == 360.0) lon2 = -e->longitude; if (lat2 == 360.0) lat2 = e->latitude; stip << e->country << " (" << e->continent << " GMT" << fixed << showpos << setprecision(1) << -e->gmt_offset << noshowpos << ") CQ-" << e->cq_zone << " ITU-" << e->itu_zone << '\n'; } if (QRB::locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == QRB::QRB_OK) { if (progdefaults.us_units) { stip << "QTE " << fixed << setprecision(0) << azimuth << '\260' << " (" << QRB::azimuth_long_path(azimuth) << '\260' << ") QRB " << distance * 0.62168188 << "mi"<< " (" << QRB::distance_long_path(distance) * 0.62168188 << "mi)\n"; } else { stip << "QTE " << fixed << setprecision(0) << azimuth << '\260' << " (" << QRB::azimuth_long_path(azimuth) << '\260' << ") QRB " << distance << "km(" << QRB::distance_long_path(distance) << "km)\n"; } } if (qso) { const char* info[] = { qso->getField(NAME), qso->getField(QTH), qso->getField(QSO_DATE), qso->getField(BAND), qso->getField(ADIF_MODE) }; // name & qth if (*info[0]) join(stip << "* ", info, 2, _(" in "), true) << '\n'; // other info join(stip << "* " << _("Last QSO") << ": ", info+2, 3, ", ", true) << '\n'; } if (qsl) { stip << "* QSL: "; for (unsigned char i = 0; i < QSL_END; i++) if (qsl & (1 << i)) stip << qsl_names[i] << ' '; stip << '\n'; } ret: free(mem); tip = stip.str(); return tip.empty() ? 0 : tip.c_str(); } void FTextRX::dxcc_tooltip(void* obj) { struct point { int x, y; bool operator==(const point& p) { return x == p.x && y == p.y; } bool operator!=(const point& p) { return !(*this == p); } }; static point p[3] = { {0, 0}, {0, 0}, {0, 0} }; memmove(p, p+1, 2 * sizeof(point)); p[2].x = Fl::event_x(); p[2].y = Fl::event_y(); static const char* tip = 0; FTextRX* v = reinterpret_cast(obj); // look up word under cursor if we have been called twice with the cursor // at the same position, and if the cursor was previously somewhere else if (p[2] == p[1] && p[2] != p[0] && ((tip = v->dxcc_lookup_call(p[2].x, p[2].y)))) Fl_Tooltip::enter_area(v, p[2].x, p[2].y, 100, 100, tip); else if (p[2] != p[1]) Fl_Tooltip::exit(v); Fl::repeat_timeout(tip ? Fl_Tooltip::hoverdelay() : v->tooltips.delay / 2.0, dxcc_tooltip, obj); } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextTX::menu[] = { { icons::make_icon_label(_("Transmit"), tx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Receive"), rx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Abort"), process_stop_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Send image..."), image_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { 0 }, // EDIT_MENU_CUT { 0 }, // EDIT_MENU_COPY { 0 }, // EDIT_MENU_PASTE { 0 }, // EDIT_MENU_CLEAR { 0 }, // EDIT_MENU_READ { 0 }, // EDIT_MENU_WRAP { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { " - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ã… - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ã¥ - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "ÃŒ - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ÃŽ - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ã’ - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "à - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { 0 } }; // needed by our static kf functions, which may restrict editing depending on // the transmit cursor position int *FTextTX::ptxpos; FTextTX::FTextTX(int x, int y, int w, int h, const char *l) : FTextEdit(x, y, w, h, l), PauseBreak(false), txpos(0), bkspaces(0) { ptxpos = &txpos; change_keybindings(); memcpy(menu + TX_MENU_CUT, FTextEdit::menu, (FTextEdit::menu->size() - 1) * sizeof(*FTextEdit::menu)); context_menu = menu; init_context_menu(); utf8_txpos = txpos = 0; } /// Handles fltk events for this widget. /// We pass keyboard events to handle_key() and handle mouse3 presses to show /// the popup menu. We also disallow mouse2 events in the transmitted text area. /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextTX::handle(int event) { if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) return FTextEdit::handle(event); switch (event) { case FL_KEYBOARD: if (active_modem->get_mode() == MODE_FSQ) { if (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter) { fsq_transmit(0); return 1; } } return handle_key(Fl::event_key()) ? 1 : FTextEdit::handle(event); case FL_PUSH: if (Fl::event_button() == FL_MIDDLE_MOUSE && xy_to_position(Fl::event_x(), Fl::event_y(), CHARACTER_POS) < txpos) return 1; // ignore mouse2 text pastes inside the transmitted text } return FTextEdit::handle(event); } /// Clears the buffer. /// Also resets the transmit position, stored backspaces and tx pause flag. /// void FTextTX::clear(void) { FTextEdit::clear(); txpos = 0; utf8_txpos = 0; bkspaces = 0; PauseBreak = false; } /// Clears the sent text. /// Also resets the transmit position, stored backspaces and tx pause flag. /// void FTextTX::clear_sent(void) { tbuf->remove(0, utf8_txpos); sbuf->remove(0, utf8_txpos); txpos = 0; utf8_txpos = 0; bkspaces = 0; PauseBreak = false; set_word_wrap(restore_wrap); } /// Returns boolean end of text /// /// true if empty buffer /// false if characters remain /// bool FTextTX::eot(void) { return (insert_position() == txpos); } /// Returns the next character to be transmitted. /// /// @return The next character, or ETX if the transmission has been paused, or /// NUL if no text should be transmitted. /// int FTextTX::nextChar(void) { int c; if (bkspaces) { --bkspaces; c = '\b'; } else if (PauseBreak) { PauseBreak = false; c = GET_TX_CHAR_ETX;//0x03; } else if (insert_position() <= utf8_txpos) { // empty buffer or cursor inside transmitted text c = -1; } else { if ((c = tbuf->char_at(utf8_txpos)) > 0) { int n = fl_utf8bytes(c); REQ(FTextTX::changed_cb, utf8_txpos, 0, 0, -1, static_cast(0), this); REQ(FTextTX::changed_cb, utf8_txpos+1, 0, 0, -1, static_cast(0), this); ++txpos; utf8_txpos += n; } else c = -1; } return c; } // called by xmlrpc thread // called by macro execution void FTextTX::add_text(string s) { for (size_t n = 0; n < s.length(); n++) { if (s[n] == '\b') { int ipos = insert_position(); if (tbuf->length()) { if (ipos > 0 && txpos == ipos) { bkspaces++; txpos--; int nn; tbuf->get_char_at(utf8_txpos, nn); utf8_txpos -= nn; } tbuf->remove(tbuf->length() - 1, tbuf->length()); sbuf->remove(sbuf->length() - 1, sbuf->length()); redraw(); } } else { //LOG_DEBUG("%04x ", s[n] & 0x00FF); add(s[n] & 0xFF, RECV); } } } void FTextTX::setFont(Fl_Font f, int attr) { FTextBase::setFont(f, attr); } /// Handles keyboard shorcuts /// /// @param key // pressed key /// /// @return // 1 if shortcut is handled, otherwise 0. /// int FTextTX::handle_key_shortcuts(int key) { std::string etag = ""; switch (key) { case 'c': // add for SC-c case 'm': // add for SC-m case 'n': // add for SC-n case 'r': // add for SC-r case 'l': // add for SC-l case 'h': // add for SC-h case 'a': // add for SC-a if ((Fl::event_state() & FL_CTRL) && (Fl::event_state() & FL_SHIFT)) // if ((Fl::event_state() & (FL_CTRL | FL_SHIFT))) // investigate why this doesn't work... { switch (key) { case 'c': etag = inpCall->value(); break; case 'm': etag = progdefaults.myCall; break; case 'n': etag = inpName->value(); break; case 'r': { std::string s; etag = (s = inpRstIn->value()).length() ? s : std::string("599"); } break; case 'l': etag = progdefaults.myLocator; break; case 'h': etag = progdefaults.myQth; break; case 'a': etag = progdefaults.myAntenna; default: break; } // Add text + space if length is > 0 if (etag.length()) add_text(etag + std::string(" ")); return 1; } break; default: break; } return 0; } /// Handles keyboard events to override Fl_Text_Editor_mod's handling of some /// keystrokes. /// /// @param key /// /// @return /// int FTextTX::handle_key(int key) { if (handle_key_shortcuts(key)) return 1; switch (key) { case FL_Escape: // set stop flag and clear { static time_t t[2] = { 0, 0 }; static unsigned char i = 0; if (t[i] == time(&t[!i])) { // two presses in a second: abort transmission if (trx_state == STATE_TX) menu_cb(TX_MENU_ABORT); t[i = !i] = 0; return 1; } i = !i; } if (trx_state == STATE_TX && active_modem->get_stopflag() == false) { kf_select_all(0, this); kf_copy(0, this); clear(); if (arq_text_available) AbortARQ(); active_modem->set_stopflag(true); } if (trx_state == STATE_TUNE) abort_tx(); stopMacroTimer(); return 1; case 't': // transmit for C-t if (trx_state == STATE_RX && Fl::event_state() & FL_CTRL) { menu_cb(TX_MENU_TX); return 1; } break; case 'r':// receive for C-r if (Fl::event_state() & FL_CTRL) { menu_cb(TX_MENU_RX); return 1; } else if (!(Fl::event_state() & (FL_META | FL_ALT))) break; // fall through to (un)pause for M-r or A-r case FL_Pause: if (trx_state != STATE_TX) { start_tx(); } else PauseBreak = true; return 1; case (FL_KP + '+'): if (active_modem == cw_modem) active_modem->incWPM(); return 1; case (FL_KP + '-'): if (active_modem == cw_modem) active_modem->decWPM(); return 1; case (FL_KP + '*'): if (active_modem == cw_modem) active_modem->toggleWPM(); return 1; case FL_Tab: if (active_modem == fsq_modem) return 1; // In non-CW modes: Tab and Ctrl-tab both pause until user moves the // cursor to let some more text through. Another (ctrl-)tab goes back to // the end of the buffer and resumes sending. // In CW mode: Tab pauses, skips rest of buffer, applies the // SKIP style, then resumes sending when new text is entered. // Ctrl-tab does the same thing as for all other modes. if (utf8_txpos != insert_position()) insert_position(utf8_txpos); else insert_position(tbuf->length()); if (!(Fl::event_state() & FL_CTRL) && active_modem == cw_modem) { int n = tbuf->length() - utf8_txpos; char s[n + 1]; memset(s, FTEXT_DEF + SKIP, n); s[n] = 0; sbuf->replace(utf8_txpos, sbuf->length(), s); insert_position(tbuf->length()); redisplay_range(utf8_txpos, insert_position()); utf8_txpos = insert_position(); } return 1; // Move cursor, or search up/down with the Meta/Alt modifiers case FL_Left: if (Fl::event_state() & (FL_META | FL_ALT)) { if (active_modem == fsq_modem) return 1; active_modem->searchDown(); return 1; } return 0; case FL_Right: if (Fl::event_state() & (FL_META | FL_ALT)) { if (active_modem == fsq_modem) return 1; active_modem->searchUp(); return 1; } return 0; // queue a BS and decr. the txpos, unless the cursor is in the tx text case FL_BackSpace: { int ipos = insert_position(); if (utf8_txpos > 0 && utf8_txpos == ipos) { bkspaces++; utf8_txpos = tbuf->prev_char(ipos); txpos--; } return 0; } // alt - 1 / 2 changes macro sets case '1': case '2': case '3': case '4': if (Fl::event_state() & FL_ALT) { if (active_modem == fsq_modem) return 1; static char lbl[2] = "1"; altMacros = key - '1'; if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (!altMacros) altMacros = 1; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[NUMMACKEYS + i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[NUMMACKEYS + i]->redraw_label(); } lbl[0] = key; btnAltMacros2->label(lbl); btnAltMacros2->redraw_label(); } else { for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[i]->redraw_label(); } lbl[0] = key; btnAltMacros1->label(lbl); btnAltMacros1->redraw_label(); } return 1; } break; default: break; } if (insert_position() < txpos) return 1; // insert a macro if (key >= FL_F && key <= FL_F_Last) { return handle_key_macro(key); } // read ctl-ddd, where d is a digit, as ascii characters (in base 10) // and insert verbatim; e.g. ctl-001 inserts a if (Fl::event_state() & FL_CTRL && (key >= FL_KP) && (key <= FL_KP + '9')) return handle_key_ascii(key); // restart the numeric keypad entries. ascii_cnt = 0; ascii_chr = 0; return 0; } /// Inserts the macro for function key \c key. /// /// @param key An integer in the range [FL_F, FL_F_Last] /// /// @return 1 /// int FTextTX::handle_key_macro(int key) { key -= FL_F + 1; if (active_modem == fsq_modem) { if (key == 0) fsq_repeat_last_heard(); if (key == 1) fsq_repeat_last_command(); return 1; } if (key > 11) return 0; if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (Fl::event_state(FL_SHIFT)) key += altMacros * NUMMACKEYS; } else { key += altMacros * NUMMACKEYS; } if (!(macros.text[key]).empty()) macros.execute(key); return 1; } int FTextTX::handle_dnd_drag(int pos) { if (pos >= txpos) { return FTextEdit::handle_dnd_drag(pos); } else // refuse drop inside transmitted text return 0; } /// Handles mouse-3 clicks by displaying the context menu /// /// @param val /// void FTextTX::handle_context_menu(void) { // adjust Abort/Transmit/Receive menu items switch (trx_state) { case STATE_TX: menu[TX_MENU_TX].hide(); menu[TX_MENU_RX].show(); menu[TX_MENU_ABORT].show(); break; case STATE_TUNE: menu[TX_MENU_TX].hide(); menu[TX_MENU_RX].show(); menu[TX_MENU_ABORT].hide(); break; default: menu[TX_MENU_TX].show(); menu[TX_MENU_RX].hide(); menu[TX_MENU_ABORT].hide(); break; } bool modify_text_ok = insert_position() >= txpos; bool selected = tbuf->selected(); icons::set_active(&menu[TX_MENU_MFSK16_IMG], active_modem->get_cap() & modem::CAP_IMG); icons::set_active(&menu[TX_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[TX_MENU_CUT], selected && modify_text_ok); icons::set_active(&menu[TX_MENU_COPY], selected); icons::set_active(&menu[TX_MENU_PASTE], modify_text_ok); icons::set_active(&menu[TX_MENU_READ], modify_text_ok); if (wrap) menu[TX_MENU_WRAP].set(); else menu[TX_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextTX::menu_cb(size_t item) { switch (item) { case TX_MENU_TX: active_modem->set_stopflag(false); start_tx(); break; case TX_MENU_ABORT: char panic[200]; snprintf(panic, sizeof(panic), "*** Don't panic *** %s", progdefaults.myName.c_str()); put_status(panic, 5.0); abort_tx(); break; case TX_MENU_RX: if (trx_state == STATE_TX) { insert_position(tbuf->length()); add("^r", CTRL); } else abort_tx(); break; case TX_MENU_MFSK16_IMG: { trx_mode md = active_modem->get_mode(); if (md == MODE_IFKP) ifkp_showTxViewer(); else if (md >= MODE_THOR_FIRST && md <= MODE_THOR_LAST) thor_showTxViewer(); else showTxViewer(0, 0); break; } case TX_MENU_CLEAR: clear(); break; case TX_MENU_CUT: kf_cut(0, this); break; case TX_MENU_COPY: kf_copy(0, this); break; case TX_MENU_PASTE: kf_paste(0, this); break; case TX_MENU_READ: { restore_wrap = wrap; set_word_wrap(false); readFile(); break; } case TX_MENU_WRAP: set_word_wrap(!wrap, true); break; default: if (FTextTX::menu[item].flags == 0) { // not an FL_SUB_MENU add(FTextTX::menu[item].text[0]); add(FTextTX::menu[item].text[1]); } } } /// Overrides some useful Fl_Text_Edit keybindings that we want to keep working, /// provided that they don't try to change chunks of transmitted text. /// void FTextTX::change_keybindings(void) { struct { Fl_Text_Editor_mod::Key_Func function, override; } fbind[] = { { Fl_Text_Editor_mod::kf_default, FTextTX::kf_default }, { Fl_Text_Editor_mod::kf_enter, FTextTX::kf_enter }, { Fl_Text_Editor_mod::kf_delete, FTextTX::kf_delete }, { Fl_Text_Editor_mod::kf_cut, FTextTX::kf_cut }, { Fl_Text_Editor_mod::kf_paste, FTextTX::kf_paste } }; int n = sizeof(fbind) / sizeof(fbind[0]); // walk the keybindings linked list and replace items containing // functions for which we have an override in fbind for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { for (int i = 0; i < n; i++) if (fbind[i].function == k->function) k->function = fbind[i].override; } } // The kf_* functions below call the corresponding Fl_Text_Editor_mod routines, but // may make adjustments so that no transmitted text is modified. int FTextTX::kf_default(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_default(c, e); } int FTextTX::kf_enter(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_enter(c, e); } int FTextTX::kf_delete(int c, Fl_Text_Editor_mod* e) { // single character if (!e->buffer()->selected()) { if (e->insert_position() >= *ptxpos && e->insert_position() != e->buffer()->length()) return Fl_Text_Editor_mod::kf_delete(c, e); else return 1; } // region: delete as much as we can int start, end; e->buffer()->selection_position(&start, &end); if (*ptxpos >= end) return 1; if (*ptxpos > start) e->buffer()->select(*ptxpos, end); return Fl_Text_Editor_mod::kf_delete(c, e); } int FTextTX::kf_cut(int c, Fl_Text_Editor_mod* e) { if (e->buffer()->selected()) { int start, end; e->buffer()->selection_position(&start, &end); if (*ptxpos >= end) return 1; if (*ptxpos > start) e->buffer()->select(*ptxpos, end); } return Fl_Text_Editor_mod::kf_cut(c, e); } int FTextTX::kf_paste(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_paste(c, e); } // ---------------------------------------------------------------------------- void MVScrollbar::draw(void) { Fl_Scrollbar::draw(); if (marks.empty() || !draw_marks) return; assert((type() & FL_HOR_SLIDER) == 0); // Calculate the slider knob position and height. For a vertical scrollbar, // the scroll buttons' height is the scrollbar width and the minimum knob // height is half that. int H = h() - Fl::box_dh(box()) - 2 * w(); // internal height (minus buttons) int slider_h = (int)(slider_size() * H + 0.5); int min_h = (w() - Fl::box_dw(box())) / 2 + 1; if (slider_h < min_h) slider_h = min_h; double val = (Fl_Slider::value() - minimum()) / (maximum() - minimum()); int slider_y = (int)(val * (H - slider_h) + 0.5) + w(); // relative to y() // This would draw a green rectangle around the slider knob: // fl_color(FL_GREEN); // fl_rect(x(), y() + slider_y, w() - Fl::box_dw(box()), slider_h); int x1 = x() + Fl::box_dx(box()), x2 = x1 + w() - Fl::box_dw(box()) - 1, ypos; // Convert stored scrollbar values to vertical positions and draw // lines inside the widget if they don't overlap with the knob area. for (vector::const_iterator i = marks.begin(); i != marks.end(); ++i) { ypos = static_cast(w() + H * i->pos / maximum()); // Don't draw over slider knob if ((ypos > slider_y && ypos < slider_y + slider_h) || (ypos < slider_y + slider_h && ypos > slider_y)) continue; ypos += y(); fl_color(i->color); fl_line(x1, ypos, x2, ypos); } } fldigi-4.1.06/src/widgets/smeter.cxx0000644000175000017500000000637713472116000014250 00000000000000// // smeter.cxx // // Smeter bar widget routines. // // A part of the fldigi. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "smeter.h" // // smeter is a smeter bar widget based off Fl_Widget that shows a // standard smeter bar in horizontal format void Smeter::draw() { if (maximum_ > minimum_) sval = round(meter_width * (value_ - minimum_) / (maximum_ - minimum_)); else sval = 0; // Draw the box and label... draw_box(); draw_box(box(), tx, ty, tw, th, bgnd_); if (sval > 0) draw_box(FL_FLAT_BOX, tx + sx, ty + 2, sval, th - 4, fgnd_); labelcolor(scale_color); draw_label(); } const char * Smeter::meter_face = "| : : S3 : : S6 : : S9 :: 20 :: 40 :: |"; Smeter::Smeter(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, "") { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); bgnd_ = FL_BACKGROUND2_COLOR; fgnd_ = FL_GREEN; scale_color = FL_BLACK; minimum_ = 0.0; maximum_ = 100.0; value_ = 0; // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); meter_height = fl_height(); label(meter_face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); meter_width -= fl_width("|"); sx = (tw - meter_width) / 2; } void Smeter::resize(int X, int Y, int W, int H) { Fl_Widget::resize(X,Y,W,H); bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); meter_height = fl_height(); label(meter_face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); meter_width -= fl_width("|"); sx = (tw - meter_width) / 2; } int Smeter::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { do_callback(); return 1; } } return 0; } // // End of Smeter.cxx // fldigi-4.1.06/src/widgets/pwrmeter.cxx0000644000175000017500000001242713472116000014607 00000000000000// // pwrmeter.cxx // // PWRmeter bar widget routines. // // A part of the fldigi. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "pwrmeter.h" // // pwrmeter is a pwrmeter bar widget based off Fl_Widget that shows a // standard pwrmeter bar in horizontal format void PWRmeter::draw() { if (select_ == 4) select_auto(); sval = round(meter_width * (value_) / (maximum_)); if (sval > meter_width) sval = meter_width; if (sval < 0) sval = 0; // Draw the box and label... draw_box(); draw_box(box(), tx, ty, tw, th, bgnd_); if (sval > 0) draw_box(FL_FLAT_BOX, tx + sx, ty + 2, sval, th - 4, fgnd_); labelcolor(scale_color); draw_label(); } void PWRmeter::select_25W() { maximum_ = 25; label(W25_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W25_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_50W() { maximum_ = 50; label(W50_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W50_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_100W() { maximum_ = 100; label(W100_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W100_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_200W() { maximum_ = 200; label(W200_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W200_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_auto() { if (value_ <= 25.0) { select_25W(); } else if (value_ <= 50.0) { select_50W(); } else if (value_ <= 100) { select_100W(); } else { select_200W(); } redraw(); } void PWRmeter::select( int sel ) { switch (sel) { case P25: select_25W(); select_ = 0; break; case P50: select_50W(); select_ = 1; break; case P100: select_100W(); select_ = 2; break; case P200: select_200W(); select_ = 3; break; case AUTO: default: select_auto(); select_ = 4; } redraw(); } const char * PWRmeter::W25_face = "| : : : : | : : : : | : : : : | : : : : | : : : 25|"; const char * PWRmeter::W50_face = "| : | : | : | : | : 50|"; const char * PWRmeter::W100_face = "| | | | | | | | | | 100|"; const char * PWRmeter::W200_face = "| : | : | : | : 200|"; PWRmeter::PWRmeter(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, "") { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); bgnd_ = FL_BACKGROUND2_COLOR; fgnd_ = FL_GREEN; scale_color = FL_BLACK; maximum_ = 100.0; value_ = 0.0; select_ = 2; // 100 W scale // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(W100_face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(W100_face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(W100_face); meter_height = fl_height(); label(W100_face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::resize(int X, int Y, int W, int H) { Fl_Widget::resize(X,Y,W,H); bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; const char *face; switch (select_) { case P25: face = W25_face; break; case P50: face = W50_face; break; case P100: face = W100_face; break; case P200: face = W200_face; break; case AUTO: default: face = W25_face; } static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(face); meter_height = fl_height(); label(face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } int PWRmeter::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { do_callback(); return 1; } } return 0; } // // End of PWRmeter.cxx // fldigi-4.1.06/src/widgets/picture.cxx0000644000175000017500000006003713472116000014415 00000000000000// ---------------------------------------------------------------------------- // picture.cxx rgb picture viewer // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include "fl_digi.h" #include "trx.h" #include "fl_lock.h" #include "picture.h" #include "debug.h" #include "timeops.h" using namespace std; picture::picture (int X, int Y, int W, int H, int bg_col) : Fl_Widget (X, Y, W, H) { width = W; height = H; bufsize = W * H * depth; numcol = 0; slantdir = 0; vidbuf = new unsigned char[bufsize]; background = bg_col ; memset( vidbuf, background, bufsize ); zoom = 0 ; binary = false ; binary_threshold = 128 ; slantcorr = true; cbFunc = NULL; } picture::~picture() { if (vidbuf) delete [] vidbuf; } void picture::video(unsigned char const *data, int len ) { if (len > bufsize) return; memcpy( vidbuf, data, len ); redraw(); } unsigned char picture::pixel(int pos) { if (pos < 0 || pos >= bufsize) return 0; return vidbuf[pos]; } void picture::clear() { memset(vidbuf, background, bufsize); redraw(); } void picture::resize_zoom(int x, int y, int w, int h) { if( zoom < 0 ) { int stride = -zoom + 1 ; Fl_Widget::resize(x,y,w/stride,h/stride); } else if( zoom > 0 ) { int stride = zoom + 1 ; Fl_Widget::resize(x,y,w*stride,h*stride); } else { Fl_Widget::resize(x,y,w,h); } redraw(); } void picture::resize(int x, int y, int w, int h) { if (w != width || h != height) { width = w; height = h; delete [] vidbuf; bufsize = depth * w * h; vidbuf = new unsigned char[bufsize]; memset( vidbuf, background, bufsize ); } resize_zoom(x,y,w,h); } /// No data destruction. Used when the received image grows more than expected. /// Beware that this is not protected by a mutex. void picture::resize_height(int new_height, bool clear_img) { int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; if( clear_img ) { /// Sets to zero the complete image. memset( new_vidbuf, background, new_bufsize ); } else { if( new_height <= height ) { memcpy( new_vidbuf, vidbuf, new_bufsize ); } else { memcpy( new_vidbuf, vidbuf, bufsize ); memset( new_vidbuf + bufsize, background, new_bufsize - bufsize ); } } delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } void picture::stretch(double the_ratio) { /// We do not change the width but the height int new_height = height * the_ratio + 0.5 ; int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; /// No interpolation, it takes the nearest pixel. for( int ix_out = 0 ; ix_out < new_bufsize ; ix_out += depth ) { int ix_in = 0.5 + ( double )ix_out * the_ratio ; switch( ix_in % depth ) { case 1 : --ix_in ; break ; case 2 : ++ix_in ; break ; default: ; } if( ix_in >= bufsize ) { /// Grey value as a filler to indicate the end. For debugging. memset( new_vidbuf + ix_out, 128, new_bufsize - ix_out ); break ; } for( int i = 0; i < depth ; ++i ) { new_vidbuf[ ix_out + i ] = vidbuf[ ix_in + i ]; } }; delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } /// Change the horizontal center of the image by shifting the pixels. // Beware that it is not protected by a mutex void picture::shift_horizontal_center(int horizontal_shift) { /// This is a number of pixels. int shift = horizontal_shift * depth; if( shift < -bufsize ) { shift = -bufsize ; } if( horizontal_shift > 0 ) { /// Here we lose a couple of pixels at the end of the buffer /// if there is not a line enough. It should not be a lot. int tmp, n; memmove( vidbuf + shift, vidbuf, bufsize - shift ); memcpy(vidbuf, vidbuf + width*depth, shift); for (int row = 0; row < height; row ++) { for (int col = 0; col < shift; col++) { n = (row * width + col) * depth; tmp = vidbuf[n]; vidbuf[n] = vidbuf[n+2]; vidbuf[n+2] = tmp; } } // memset( vidbuf, background, horizontal_shift ); } else { // shift *= -1; /// Here, it is not necessary to reduce the buffer's size. // memmove( vidbuf, vidbuf + shift, bufsize - shift ); // memcpy( vidbuf + bufsize - shift - 1, // vidbuf + bufsize - width * depth - 1, shift); // memset( vidbuf + bufsize + horizontal_shift, background, -horizontal_shift ); } redraw(); } /// Shift the center by 1 rgb value // not protected by a mutex void picture::shift_center(int dir) { if( dir > 0 ) { memmove( vidbuf + 1, vidbuf, bufsize - 1 ); vidbuf[0] = 0; } else { memmove( vidbuf, vidbuf + 1, bufsize - 1 ); vidbuf[bufsize-1] = 0; } redraw(); } /// rotate rgb pixel ordering in the image to the right of /// and including grp pixels from the left // not protected by a mutex void picture::rotate() { unsigned char tmp; int n; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { n = (row * width + col) * depth; tmp = vidbuf[n]; vidbuf[n] = vidbuf[n+1]; vidbuf[n+1] = vidbuf[n+2]; vidbuf[n+2] = tmp; } } redraw(); } void picture::set_zoom( int the_zoom ) { zoom = the_zoom ; /// The size of the displayed bitmap is changed. resize_zoom( x(), y(), width, height ); } // in data user data passed to function // in x_screen,y_screen,wid_screen position and width of scan line in image // out buf buffer for generated image data. // Must copy wid_screen pixels from scanline y_screen, starting at pixel x_screen to this buffer. void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, uchar * __restrict__ buf) { const picture * __restrict__ ptr_pic = ( const picture * ) data ; const int img_width = ptr_pic->width ; const unsigned char * __restrict__ in_ptr = ptr_pic->vidbuf ; /// One pixel out of (zoom+1) if( ptr_pic->zoom < 0 ) { const int stride = -ptr_pic->zoom + 1 ; const int in_offset = ( img_width * y_screen + x_screen ) * stride ; int dpth_in_offset = depth * in_offset ; if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth * stride ; } } else { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = in_ptr[ dpth_in_offset ]; buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ]; buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ]; dpth_in_offset += depth * stride ; } } return ; } /// Reads each input pixel (-zoom+1) times. if( ptr_pic->zoom > 0 ) { const int stride = ptr_pic->zoom + 1 ; const int in_offset = img_width * ( y_screen / stride ) + x_screen / stride ; #ifndef NDEBUG if( y_screen / stride >= ptr_pic->h() ) { LOG_ERROR( "Overflow2 y_screen=%d h=%d y_screen*stride=%d height=%d stride=%d\n", y_screen, ptr_pic->h(), (y_screen/stride), ptr_pic->height, stride ); return ; } #endif if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); unsigned char in_dpth_in_offset_1 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); unsigned char in_dpth_in_offset_2 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } else { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = in_ptr[ dpth_in_offset ]; unsigned char in_dpth_in_offset_1 = in_ptr[ dpth_in_offset + 1 ]; unsigned char in_dpth_in_offset_2 = in_ptr[ dpth_in_offset + 2 ]; // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } return ; } // zoom == 0, stride=1 const int in_offset = img_width * y_screen + x_screen ; if(ptr_pic->binary) { int dpth_in_offset = depth * in_offset ; for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth ; } } else { abort(); // This should never be called, see optimization in picture::draw(). } } // picture::draw_cb void picture::draw() { if( ( zoom == 0 ) && ( binary == false ) ) { /// No scaling, this is faster. fl_draw_image( vidbuf, x(), y(), w(), h() ); } else { fl_draw_image( draw_cb, this, x(), y(), w(), h() ); } } void picture::slant_undo() { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0 || slantdir == 0) return; if (slantdir == -1) { // undo from left for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } } else if (slantdir == 1) { // undo from right for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } } slantdir = 0; redraw(); } void picture::slant_corr(int x, int y) { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0) return; if (x > width / 2) { // unwrap from right numcol = (width - x) * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } slantdir = 1; } else { // unwrap from left numcol = x * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } slantdir = -1; } redraw(); } void picture::slant(int dir) { } int picture::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { if (!slantcorr) { do_callback(); return 1; } int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int evb = Fl::event_button(); if (evb == 1) slant_corr(xpos, ypos); else if (evb == 3) slant_undo(); LOG_DEBUG("#2 %d, %d", xpos, ypos); return 1; } return 1; } return 0; } static FILE* open_file(const char* name, const char* suffix) { FILE* fp; size_t flen = strlen(name); if (name[flen - 1] == '/') { // if the name ends in a slash we will generate // a timestamped name in the following format: const char t[] = "pic_YYYY-MM-DD_HHMMSSz"; size_t newlen = flen + sizeof(t); if (suffix) newlen += 5; char* newfn = new char[newlen]; memcpy(newfn, name, flen); time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); size_t sz; if ((sz = strftime(newfn + flen, newlen - flen, "pic_%Y-%m-%d_%H%M%Sz", &ztime)) > 0) { strncpy(newfn + flen + sz, suffix, newlen - flen - sz); newfn[newlen - 1] = '\0'; mkdir(name, 0777); fp = fl_fopen(newfn, "wb"); } else fp = NULL; delete [] newfn; } else { fp = fl_fopen(name, "rb"); if (fp) { fclose(fp); const int n = 5; // rename existing image files to keep up to 5 old versions ostringstream oldfn, newfn; ostringstream::streampos p; oldfn << name << '.'; newfn << name << '.'; p = oldfn.tellp(); for (int i = n - 1; i > 0; i--) { oldfn.seekp(p); newfn.seekp(p); oldfn << i; newfn << i + 1; remove(newfn.str().c_str()); rename(oldfn.str().c_str(), newfn.str().c_str()); } remove(oldfn.str().c_str()); rename(name, oldfn.str().c_str()); } fp = fl_fopen(name, "wb"); } return fp; } static inline unsigned char avg_pix( const unsigned char * vidbuf ) { return ( vidbuf[ 0 ] + vidbuf[ 1 ] + vidbuf[ 2 ] ) / picture::depth ; } int picture::save_png(const char* filename, bool monochrome, const char *extra_comments) { FILE* fp; if ((fp = open_file(filename, ".png")) == NULL) return -1; // set up the png structures png_structp png; png_infop info; if ((png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) { fclose(fp); return -1; } /* png_set_compression_level() shall set the compression level to "level". * The valid values for "level" range from [0,9], corresponding directly * to compression levels for zlib. The value 0 implies no compression * and 9 implies maximal compression. Note: Tests have shown that zlib * compression levels 3-6 usually perform as well as level 9 for PNG images, * and do considerably fewer calculations. */ png_set_compression_level(png, Z_BEST_COMPRESSION); if ((info = png_create_info_struct(png)) == NULL) { png_destroy_write_struct(&png, NULL); fclose(fp); return -1; } if (setjmp(png_jmpbuf(png))) { png_destroy_write_struct(&png, &info); fclose(fp); return -1; } // use an stdio stream png_init_io(png, fp); // set png header int color_type = monochrome ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_RGB ; /// Color images must take eight bits per pixel. const int bit_depth = ( monochrome && binary ) ? 1 : 8 ; png_set_IHDR(png, info, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); // write text comments struct tm tm; time_t t = time(NULL); gmtime_r(&t, &tm); char z[20 + 1]; strftime(z, sizeof(z), "%Y-%m-%dT%H:%M:%SZ", &tm); z[sizeof(z) - 1] = '\0'; ostringstream comment; comment << "Program: " PACKAGE_STRING << '\n' << "Received: " << z << '\n' << "Modem: " << mode_info[active_modem->get_mode()].name << '\n' << "Frequency: " << inpFreq->value() << '\n'; if( extra_comments ) { comment << extra_comments ; } if (inpCall->size()) comment << "Log call: " << inpCall->value() << '\n'; // set text png_text text; text.key = strdup("Comment"); text.text = strdup(comment.str().c_str()); text.compression = PNG_TEXT_COMPRESSION_NONE; png_set_text(png, info, &text, 1); // write header png_write_info(png, info); // Extra check for debugging. if( height * width * depth != bufsize ) { LOG_ERROR("Buffer inconsistency h=%d w=%d b=%d", height, width, bufsize ); } // write image if(monochrome) { unsigned char tmp_row[width]; png_bytep row; for (int i = 0; i < height; i++) { int row_offset = i * width * depth ; if( binary ) { unsigned char accumPix = 0 ; int j_offset = 0 ; for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; unsigned char tmpChr = avg_pix( vidbuf + col_offset ); tmpChr = pix2bin(tmpChr) ? 1 : 0 ; j_offset = j & 0x07 ; tmpChr = tmpChr << ( 7 - j_offset ); accumPix |= tmpChr ; if( j_offset == 7 ) { tmp_row[ j >> 3 ] = accumPix ; accumPix = 0 ; } } if( j_offset != 7 ) { tmp_row[ width >> 3 ] = accumPix ; } } else { for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; tmp_row[j] = avg_pix( vidbuf + col_offset ); } } row = tmp_row; png_write_rows(png, &row, 1); } } else { png_bytep row; for (int i = 0; i < height; i++) { row = &vidbuf[i * width * depth]; png_write_rows(png, &row, 1); } } png_write_end(png, info); // clean up free(text.key); free(text.text); png_destroy_write_struct(&png, &info); fflush(fp); fsync(fileno(fp)); fclose(fp); return 0; } bool picture::restore( int row, int margin ) { if( ( row <= noise_height_margin ) || ( row >= height ) ) return true; unsigned char * line_ante = vidbuf + (row - noise_height_margin) * width * depth; // Copy the new calculated value (at previous call) to all channels. // TODO: Do that when switching off noise removal, otherwise a couple of colored pixels are left. for( int col = margin ; col < width - margin; ++col ) { int offset = col * depth ; line_ante[ offset ] = line_ante[ offset + 2 ] = line_ante[ offset + 1 ]; } return false ; } void picture::erosion( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 255 ; new_pix = std::min( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void picture::dilatation( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 0 ; new_pix = std::max( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void picture::remove_noise( int row, int half_len, int noise_margin ) { if( restore( row, half_len ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; const int nb_neighbours = ( 2 * ( 2 * half_len + 1 ) ); int medians[nb_neighbours]; /// Takes into account the first component only. for( int col = half_len ; col < width - half_len; ++col ) { int curr_pix = line_curr[ col * depth ]; assert( ( curr_pix >= 0 ) && ( curr_pix <= 255 ) ); int pix_min = 255, pix_max = 0; for( int subcol = col - half_len, tmp, nghb_i = 0 ; subcol <= col + half_len ; ++subcol ) { int offset = subcol * depth ; tmp = line_prev[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; tmp = line_next[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; } // Maybe the pixel is between min and max. int thres_min = pix_min - noise_margin; if(thres_min < 0) thres_min = 0; assert(thres_min <= pix_min); int thres_max = pix_max + noise_margin; if(thres_max > 255 ) thres_max = 255; if(thres_max < pix_max) abort(); if( ( curr_pix >= thres_min ) && ( curr_pix <= thres_max ) ) continue ; assert( ( pix_max >= 0 ) && ( pix_max <= 255 ) ); std::sort( medians, medians + nb_neighbours ); int new_pix = medians[ nb_neighbours / 2 ]; assert( new_pix >= 0 ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } int picbox::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_DND_ENTER: case FL_DND_LEAVE: case FL_DND_DRAG: case FL_DND_RELEASE: return 1; case FL_PASTE: break; default: return Fl_Box::handle(event); } // handle FL_PASTE string text = Fl::event_text(); // from dnd event "file:///home/dave/Photos/dave.jpeg" string::size_type p; if ((p = text.find("file://")) != string::npos) text.erase(0, p + strlen("file://")); if ((p = text.find('\r')) != string::npos) text.erase(p); if ((p = text.find('\n')) != string::npos) text.erase(p); struct stat st; if (stat(text.c_str(), &st) == -1 || !S_ISREG(st.st_mode)) return 0; extern void load_image(const char*); load_image(text.c_str()); return 1; } fldigi-4.1.06/src/widgets/FTextView.cxx0000664000175000017500000006120113507401434014632 00000000000000// ---------------------------------------------------------------------------- // FTextView.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // Copyright (C) 2008-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flmisc.h" #include "fileselect.h" #include "font_browser.h" #include "ascii.h" #include "icons.h" #include "gettext.h" #include "macros.h" #include "FTextView.h" #include "debug.h" using namespace std; /// FTextBase constructor. /// Word wrapping is enabled by default at column 80, but see \c reset_wrap_col. /// @param x /// @param y /// @param w /// @param h /// @param l FTextBase::FTextBase(int x, int y, int w, int h, const char *l) : Fl_Text_Editor_mod(x, y, w, h, l), wrap(true), wrap_col(80), max_lines(0), scroll_hint(false) { oldw = oldh = olds = -1; oldf = (Fl_Font)-1; textfont(FL_HELVETICA); textsize(FL_NORMAL_SIZE); textcolor(FL_FOREGROUND_COLOR); tbuf = new Fl_Text_Buffer_mod; sbuf = new Fl_Text_Buffer_mod; buffer(tbuf); highlight_data(sbuf, styles, NATTR, FTEXT_DEF, 0, 0); cursor_style(Fl_Text_Editor_mod::NORMAL_CURSOR); // reset_styles MUST before the call to wrap_mode or mStyleTable will have // garbage values! reset_styles(SET_FONT | SET_SIZE | SET_COLOR); wrap_mode(wrap, wrap_col); restore_wrap = wrap; } void FTextBase::clear() { tbuf->text(""); sbuf->text(""); set_word_wrap(restore_wrap); } int FTextBase::handle(int event) { if (event == FL_MOUSEWHEEL && !Fl::event_inside(this)) return 1; // Fl_Text_Editor::handle() calls window()->cursor(FL_CURSOR_DONE) when // it receives an FL_KEYBOARD event, which crashes some buggy X drivers // (e.g. Intel on the Asus Eee PC). Call handle_key directly to work // around this problem. if (event == FL_KEYBOARD) return Fl_Text_Editor_mod::handle_key(); else return Fl_Text_Editor_mod::handle(event); } /// @see FTextRX::add /// /// @param s /// @param attr /// void FTextBase::add(const char *s, int attr) { // handle the text attribute first int n = strlen(s); char a[n + 1]; memset(a, FTEXT_DEF + attr, n); a[n] = '\0'; sbuf->replace(insert_position(), insert_position() + n, a); insert(s); } /// @see FTextBase::add /// /// @param s /// @param attr /// #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR >= 3 void FTextBase::add(unsigned int c, int attr) #else void FTextBase::add(unsigned char c, int attr) #endif { char s[] = { (char)(FTEXT_DEF + attr), '\0' }; sbuf->replace(insert_position(), insert_position() + 1, s); s[0] = c & 0xFF; insert(s); } void FTextBase::set_word_wrap(bool b, bool b2) { wrap_mode((wrap = b), wrap_col); if (b2) restore_wrap = wrap; show_insert_position(); } void FTextBase::setFont(Fl_Font f, int attr) { set_style(attr, f, textsize(), textcolor(), SET_FONT); } void FTextBase::setFontSize(int s, int attr) { set_style(attr, textfont(), s, textcolor(), SET_SIZE); } void FTextBase::setFontColor(Fl_Color c, int attr) { set_style(attr, textfont(), textsize(), c, SET_COLOR); } /// Resizes the text widget. /// The real work is done by \c Fl_Text_Editor_mod::resize or, if \c HSCROLLBAR_KLUDGE /// is defined, a version of that code modified so that no horizontal /// scrollbars are displayed when word wrapping. /// /// @param X /// @param Y /// @param W /// @param H /// void FTextBase::resize(int X, int Y, int W, int H) { bool need_wrap_reset = false; bool need_margin_reset = false; if (unlikely(text_area.w != oldw)) { oldw = text_area.w; need_wrap_reset = true; } if (unlikely(text_area.h != oldh)) { oldh = text_area.h; need_margin_reset = true; } if (unlikely(textfont() != oldf || textsize() != olds)) { oldf = textfont(); olds = textsize(); need_wrap_reset = need_margin_reset = true; } if (need_wrap_reset) reset_wrap_col(); TOP_MARGIN = DEFAULT_TOP_MARGIN; int r = H - Fl::box_dh(box()) - TOP_MARGIN - BOTTOM_MARGIN; if (mHScrollBar->visible()) r -= scrollbar_width(); int msize = mMaxsize ? mMaxsize : textsize(); if (!msize) msize = 1; //printf("H %d, textsize %d, lines %d, extra %d\n", r, msize, r / msize, r % msize); if (r %= msize) TOP_MARGIN += r; if (scroll_hint) { mTopLineNumHint = mNBufferLines; mHorizOffsetHint = 0; // display_insert_position_hint = 1; scroll_hint = false; } bool hscroll_visible = mHScrollBar->visible(); Fl_Text_Editor_mod::resize(X, Y, W, H); if (hscroll_visible != mHScrollBar->visible()) oldh = 0; // reset margins next time } /// Checks the new widget height. /// This is registered with Fl_Tile_check and then called with horizontal /// and vertical size increments every time the Fl_Tile boundary is moved. /// /// @param arg The callback argument; should be a pointer to a FTextBase object /// @param xd The horizontal increment (ignored) /// @param yd The vertical increment /// /// @return True if the widget is visible, and the new text area height would be /// a multiple of the font height. /// bool FTextBase::wheight_mult_tsize(void *arg, int, int yd) { FTextBase *v = reinterpret_cast(arg); if (!v->visible()) return true; return v->mMaxsize > 0 && (v->text_area.h + yd) % v->mMaxsize == 0; } /// Changes text style attributes /// /// @param attr The attribute name to change, or \c NATTR to change all styles. /// @param f The new font /// @param s The new font size /// @param c The new font color /// @param set One or more (OR'd together) SET operations; @see set_style_op_e /// void FTextBase::set_style(int attr, Fl_Font f, int s, Fl_Color c, int set) { int start, end; if (attr == NATTR) { // update all styles start = 0; end = NATTR; if (set & SET_FONT) Fl_Text_Display_mod::textfont(f); if (set & SET_SIZE) textsize(s); if (set & SET_COLOR) textcolor(c); } else { start = attr; end = start + 1; } for (int i = start; i < end; i++) { styles[i].attr = 0; if (set & SET_FONT) styles[i].font = f; if (set & SET_SIZE) styles[i].size = s; if (set & SET_COLOR) styles[i].color = c; if (i == SKIP) // clickable styles always same as SKIP for now for (int j = CLICK_START; j < NATTR; j++) memcpy(&styles[j], &styles[i], sizeof(styles[j])); } if (set & SET_COLOR) mCursor_color = styles[0].color; resize(x(), y(), w(), h()); // to redraw and recalculate the wrap column } /// Reads a file and inserts its contents. /// change all occurrences of ^ to ^^ to prevent get_tx_char from /// treating the carat as a control sequence, ie: ^r ^R ^t ^T ^L ^C /// get_tx_char passes ^^ as a single ^ /// /// @return 0 on success, -1 on error int FTextBase::readFile(const char* fn) { set_word_wrap(restore_wrap); if ( !(fn || (fn = FSEL::select(_("Insert text"), "Text\t*.txt"))) ) return -1; int ret = 0, pos = insert_position(); #ifdef __WOE32__ FILE* tfile = fl_fopen(fn, "rt"); #else FILE* tfile = fl_fopen(fn, "r"); #endif if (!tfile) return -1; char buf[BUFSIZ+1]; std::string newbuf; size_t p; memset(buf, 0, BUFSIZ+1); p = 0; while (fgets(buf, sizeof(buf), tfile)) { newbuf.append(buf); memset(buf, 0, BUFSIZ+1); } if (ferror(tfile)) return (-1); fclose(tfile); while ((p = newbuf.find("^",p)) != string::npos) { newbuf.insert(p, "^"); p += 2; } p = 0; while ((p = newbuf.find("@^^", p)) != string::npos) { newbuf.erase(p,2); } if (pos == tbuf->length()) { // optimise for append tbuf->append(newbuf.c_str()); pos = tbuf->length(); } else { tbuf->insert(pos, newbuf.c_str()); pos += newbuf.length(); } insert_position(pos); show_insert_position(); return ret; } /// Writes all buffer text out to a file. /// /// void FTextBase::saveFile(void) { const char *fn = FSEL::saveas(_("Save text as"), "Text\t*.txt"); if (fn) { #ifdef __WOE32__ ofstream tfile(fn); if (!tfile) return; char *p1, *p2, *text = tbuf->text(); for (p1 = p2 = text; *p1; p1 = p2) { while (*p2 != '\0' && *p2 != '\r') p2++; if (*p2 == '\n') { *p2 = '\0'; tfile << p1 << "\r\n"; p2++; } else tfile << p1; } free(text); #else tbuf->outputfile(fn, 0, tbuf->length()); #endif } } /// Returns a character string containing the selected (n) word(s), if any, /// or the word at (\a x, \a y) relative to the widget's \c x() and \c y(). /// If \a ontext is true, this function will return text only if the /// mouse cursor position is inside the text range. /// /// @param x /// @param y /// /// @return The selection, or the word text at (x,y). Must be freed by the caller. /// char* FTextBase::get_word(int x, int y, const char* nwchars, int n, bool ontext) { int p = xy_to_position(x + this->x(), y + this->y(), Fl_Text_Display_mod::CURSOR_POS); int start, end; if (tbuf->selected()) { if (ontext && (p < start || p >= end) && tbuf->selection_position(&start, &end)) return 0; else return tbuf->selection_text(); } string nonword = nwchars; nonword.append(" \t\n"); if (!tbuf->findchars_backward(p, nonword.c_str(), &start)) start = 0; else start++; if (!tbuf->findchars_forward(p, nonword.c_str(), &end, n)) return 0; // end = tbuf->length(); if (start >= end) return 0; if (ontext && (p < start || p >= end)) return 0; else return tbuf->text_range(start, end); } /// Initialised the menu pointed to by \c context_menu. The menu items' user_data /// field is used to store the initialisation flag. void FTextBase::init_context_menu(void) { for (int i = 0; i < context_menu->size() - 1; i++) { if (context_menu[i].user_data() == 0 && context_menu[i].labeltype() == _FL_MULTI_LABEL) { icons::set_icon_label(&context_menu[i]); context_menu[i].user_data(this); } } } /// Displays the menu pointed to by \c context_menu and calls the menu function; /// @see call_cb. /// void FTextBase::show_context_menu(void) { const Fl_Menu_Item *m; int xpos = Fl::event_x(); int ypos = Fl::event_y(); popx = xpos - x(); popy = ypos - y(); window()->cursor(FL_CURSOR_DEFAULT); m = context_menu->popup(xpos, ypos, 0, 0, 0); if (m) menu_cb(m - context_menu); } /// Recalculates the wrap margin when the font is changed or the widget resized. /// Line wrapping works with proportional fonts but may be very slow. /// int FTextBase::reset_wrap_col(void) { if (!wrap || text_area.w == 0) return wrap_col; int old_wrap_col = wrap_col; if (Font_Browser::fixed_width(textfont())) { fl_font(textfont(), textsize()); wrap_col = (int)floorf(text_area.w / fl_width('X')); } else // use slower (but accurate) wrapping for variable width fonts wrap_col = 0; // wrap_mode triggers a resize; don't call it if wrap_col hasn't changed if (old_wrap_col != wrap_col) wrap_mode(wrap, wrap_col); return old_wrap_col; } void FTextBase::reset_styles(int set) { set_style(NATTR, FL_HELVETICA, FL_NORMAL_SIZE, FL_FOREGROUND_COLOR, set); set_style(XMIT, FL_HELVETICA, FL_NORMAL_SIZE, FL_RED, set); set_style(CTRL, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_GREEN, set); set_style(SKIP, FL_HELVETICA, FL_NORMAL_SIZE, FL_BLUE, set); set_style(ALTR, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_MAGENTA, set); set_style(FSQ_TX, FL_HELVETICA, FL_NORMAL_SIZE, FL_RED, set); set_style(FSQ_DIR, FL_HELVETICA, FL_NORMAL_SIZE, FL_BLUE, set); set_style(FSQ_UND, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_GREEN, set); } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextView::menu[] = { { icons::make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Select All"), edit_select_all_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Save as..."), save_as_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { 0 } }; /// FTextView constructor. /// We remove \c Fl_Text_Display_mod::buffer_modified_cb from the list of callbacks /// because we want to scroll depending on the visibility of the last line; @see /// changed_cb. /// @param x /// @param y /// @param w /// @param h /// @param l FTextView::FTextView(int x, int y, int w, int h, const char *l) : FTextBase(x, y, w, h, l), quick_entry(false) { tbuf->remove_modify_callback(buffer_modified_cb, this); tbuf->add_modify_callback(changed_cb, this); tbuf->canUndo(0); // disable some keybindings that are not allowed in FTextView buffers change_keybindings(); context_menu = menu; init_context_menu(); } /// Handles fltk events for this widget. /// We only care about mouse presses (to display the popup menu and prevent /// pasting) and keyboard events (to make sure no text can be inserted). /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextView::handle(int event) { switch (event) { case FL_PUSH: if (!Fl::event_inside(this)) break; if (Fl::event_button() == FL_RIGHT_MOUSE) { handle_context_menu(); return 1; } if (Fl::event_button() == FL_MIDDLE_MOUSE) return 1; // ignore mouse2 text pastes inside the received text break; case FL_DRAG: if (Fl::event_button() != FL_LEFT_MOUSE) return 1; break; // catch some text-modifying events that are not handled by kf_* functions case FL_KEYBOARD: int k; if (Fl::compose(k)) return 1; k = Fl::event_key(); if (k == FL_BackSpace) return 1; else if (k == FL_Tab) return Fl_Widget::handle(event); } return FTextBase::handle(event); } void FTextView::handle_context_menu(void) { icons::set_active(&menu[VIEW_MENU_COPY], tbuf->selected()); icons::set_active(&menu[VIEW_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[VIEW_MENU_SELECT_ALL], tbuf->length()); icons::set_active(&menu[VIEW_MENU_SAVE], tbuf->length()); if (wrap) menu[VIEW_MENU_WRAP].set(); else menu[VIEW_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextView::menu_cb(size_t item) { switch (item) { case VIEW_MENU_COPY: kf_copy(Fl::event_key(), this); break; case VIEW_MENU_CLEAR: clear(); break; case VIEW_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case VIEW_MENU_SAVE: saveFile(); break; case VIEW_MENU_WRAP: set_word_wrap(!wrap, true); break; } } /// Scrolls down if the buffer has been modified and the last line is /// visible. See Fl_Text_Buffer::add_modify_callback() for parameter details. /// /// @param pos /// @param nins /// @param ndel /// @param nsty /// @param dtext /// @param arg /// inline void FTextView::changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg) { FTextView *v = reinterpret_cast(arg); if (v->mTopLineNum + v->mNVisibleLines - 1 == v->mNBufferLines) v->scroll_hint = true; v->buffer_modified_cb(pos, nins, ndel, nsty, dtext, v); } /// Removes Fl_Text_Edit keybindings that would modify text and put it out of /// sync with the style buffer. At some point we may decide that we want /// FTextView to be editable (e.g., to insert comments about a QSO), in which /// case we'll keep the keybindings and add some code to changed_cb to update /// the style buffer. /// void FTextView::change_keybindings(void) { Fl_Text_Editor_mod::Key_Func fdelete[] = { Fl_Text_Editor_mod::kf_default, Fl_Text_Editor_mod::kf_enter, Fl_Text_Editor_mod::kf_delete, Fl_Text_Editor_mod::kf_cut, Fl_Text_Editor_mod::kf_paste }; int n = sizeof(fdelete) / sizeof(fdelete[0]); // walk the keybindings linked list and delete items containing elements // of fdelete loop: for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { for (int i = 0; i < n; i++) { if (k->function == fdelete[i]) { remove_key_binding(k->key, k->state); goto loop; } } } } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextEdit::menu[] = { { icons::make_icon_label(_("Cut"), edit_cut_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Paste"), edit_paste_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Insert file..."), file_open_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL } , { 0 } }; FTextEdit::FTextEdit(int x, int y, int w, int h, const char *l) : FTextBase(x, y, w, h, l) { tbuf->remove_modify_callback(buffer_modified_cb, this); tbuf->add_modify_callback(changed_cb, this); ascii_cnt = 0; ascii_chr = 0; context_menu = menu; init_context_menu(); dnd_paste = false; } /// Handles fltk events for this widget. /// We pass keyboard events to handle_key() and handle mouse3 presses to show /// the popup menu. We also disallow mouse2 events in the transmitted text area. /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextEdit::handle(int event) { if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) return FTextBase::handle(event); switch (event) { case FL_KEYBOARD: return handle_key(Fl::event_key()) ? 1 : FTextBase::handle(event); case FL_DND_RELEASE: dnd_paste = true; // fall through case FL_DND_ENTER: case FL_DND_LEAVE: return 1; case FL_DND_DRAG: return handle_dnd_drag(xy_to_position(Fl::event_x(), Fl::event_y(), CHARACTER_POS)); case FL_PASTE: { int r = dnd_paste ? handle_dnd_drop() : FTextBase::handle(event); dnd_paste = false; return r; } case FL_PUSH: { int eb = Fl::event_button(); if (eb == FL_RIGHT_MOUSE) { handle_context_menu(); return 1; } } default: break; } return FTextBase::handle(event); } /// Handles keyboard events to override Fl_Text_Editor_mod's handling of some /// keystrokes. /// /// @param key /// /// @return /// int FTextEdit::handle_key(int key) { // read ctl-ddd, where d is a digit, as ascii characters (in base 10) // and insert verbatim; e.g. ctl-001 inserts a if (Fl::event_state() & FL_CTRL && (isdigit(key) || isdigit(key - FL_KP))) return handle_key_ascii(key); ascii_cnt = 0; // restart the numeric keypad entries. ascii_chr = 0; return 0; } /// Composes ascii characters and adds them to the FTextEdit buffer. /// Control characters are inserted with the CTRL style. Values larger than 127 /// (0x7f) are ignored. We cannot really add NULs for the time being. /// /// @param key A digit character /// /// @return 1 /// int FTextEdit::handle_key_ascii(int key) { if (key >= FL_KP) key -= FL_KP; key -= '0'; ascii_cnt++; for (int i = 0; i < 3 - ascii_cnt; i++) key *= 10; ascii_chr += key; if (ascii_cnt == 3) { if (ascii_chr < 0x100) { char buff[fl_utf8bytes(ascii_chr) + 1]; int utf8cnt = fl_utf8encode(ascii_chr, buff); for ( int i = 0; i < utf8cnt; i++) add(buff[i], (iscntrl(ascii_chr) ? CTRL : RECV)); } ascii_cnt = ascii_chr = 0; } return 1; } /// Handles FL_DND_DRAG events by scrolling and moving the cursor /// /// @return 1 int FTextEdit::handle_dnd_drag(int pos) { // Scroll if the pointer is being dragged inside the scrollbars, // otherwise obtain keyboard focus and set the insert position. if (mVScrollBar->visible() && Fl::event_inside(mVScrollBar)) mVScrollBar->handle(FL_DRAG); else if (mHScrollBar->visible() && Fl::event_inside(mHScrollBar)) mHScrollBar->handle(FL_DRAG); else { if (Fl::focus() != this) take_focus(); insert_position(pos); } return 1; } /// Handles FL_PASTE events by inserting text /// /// @return 1 or FTextBase::handle(FL_PASTE) int FTextEdit::handle_dnd_drop(void) { // paste verbatim if the shift key was held down during dnd if (Fl::event_shift()) return FTextBase::handle(FL_PASTE); string text; string::size_type p, len; text = Fl::event_text(); std::cout << "dnd text: '" << text << "'" << std::endl; const char sep[] = "\n"; #if defined(__APPLE__) || defined(__WOE32__) text += sep; #endif len = text.length(); while ((p = text.find(sep)) != string::npos) { text[p] = '\0'; #if !defined(__APPLE__) && !defined(__WOE32__) if (text.find("file://") == 0) { text.erase(0, 7); p -= 7; len -= 7; } #endif #ifndef BUILD_FLARQ if ((text.find(".jpg") != string::npos) || (text.find(".JPG") != string::npos) || (text.find(".jpeg") != string::npos) || (text.find(".JPEG") != string::npos) || (text.find(".png") != string::npos) || (text.find(".PNG") != string::npos) || (text.find(".bmp") != string::npos) || (text.find(".BMP") != string::npos) ) { LOG_INFO("DnD image %s", text.c_str()); if ((p = text.find("file://")) != string::npos) text.erase(0, p + strlen("file://")); if ((p = text.find('\r')) != string::npos) text.erase(p); if ((p = text.find('\n')) != string::npos) text.erase(p); if (text[text.length()-1] == 0) text.erase(text.length() -1); TxQueINSERTIMAGE(text); return 1; } #endif // paste everything verbatim if we cannot read the first file LOG_INFO("DnD file %s", text.c_str()); if (readFile(text.c_str()) == -1 && len == text.length()) return FTextBase::handle(FL_PASTE); text.erase(0, p + sizeof(sep) - 1); } return 1; } /// Handles mouse-3 clicks by displaying the context menu /// /// @param val /// void FTextEdit::handle_context_menu(void) { bool selected = tbuf->selected(); icons::set_active(&menu[EDIT_MENU_CUT], selected); icons::set_active(&menu[EDIT_MENU_COPY], selected); icons::set_active(&menu[EDIT_MENU_CLEAR], tbuf->length()); if (wrap) menu[EDIT_MENU_WRAP].set(); else menu[EDIT_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextEdit::menu_cb(size_t item) { switch (item) { case EDIT_MENU_CLEAR: clear(); break; case EDIT_MENU_CUT: kf_cut(0, this); break; case EDIT_MENU_COPY: kf_copy(0, this); break; case EDIT_MENU_PASTE: kf_paste(0, this); break; case EDIT_MENU_READ: readFile(); break; case EDIT_MENU_WRAP: set_word_wrap(!wrap, true); break; } } /// This function is called by Fl_Text_Buffer when the buffer is modified, and /// also by nextChar when a character has been passed up the transmit path. In /// the first case either nins or ndel will be nonzero, and we change a /// corresponding amount of text in the style buffer. /// /// In the latter case, nins, ndel, pos and nsty are all zero and we update the /// style buffer to mark the last character in the buffer with the XMIT /// attribute. /// /// @param pos /// @param nins /// @param ndel /// @param nsty /// @param dtext /// @param arg /// void FTextEdit::changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg) { FTextEdit *e = reinterpret_cast(arg); if (nins == 0 && ndel == 0) { if (nsty == -1) { // called by nextChar to update transmitted text style char s[] = { FTEXT_DEF + XMIT, '\0' }; e->sbuf->replace(pos - 1, pos, s); e->redisplay_range(pos - 1, pos); } else if (nsty > 0) // restyled, e.g. selected, text return e->buffer_modified_cb(pos, nins, ndel, nsty, dtext, e); // No changes, e.g., a paste with an empty clipboard. return; } else if (nins > 0 && e->sbuf->length() < e->tbuf->length()) { // New text not inserted by our add() methods, i.e., via a file // read, mouse-2 paste or, most likely, direct keyboard entry. int n = e->tbuf->length() - e->sbuf->length(); if (n == 1) { char s[] = { FTEXT_DEF, '\0' }; e->sbuf->append(s); } else { char *s = new char [n + 1]; memset(s, FTEXT_DEF, n); s[n] = '\0'; e->sbuf->append(s); delete [] s; } } else if (ndel > 0) e->sbuf->remove(pos, pos + ndel); e->sbuf->select(pos, pos + nins - ndel); e->buffer_modified_cb(pos, nins, ndel, nsty, dtext, e); // We may need to scroll if the text was inserted by the // add() methods, e.g. by a macro if (e->mTopLineNum + e->mNVisibleLines - 1 <= e->mNBufferLines) e->show_insert_position(); } fldigi-4.1.06/src/widgets/Fl_Text_Editor_mod.cxx0000644000175000017500000005570613472116000016463 00000000000000// // "$Id: Fl_Text_Editor_mod.cxx 8034 2010-12-15 12:21:55Z AlbrechtS $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include "Fl_Text_Editor_mod.H" /* Keyboard Control Matrix key\modifier plain Ctrl Alt Meta left 1/1 13/9 0/13 0/9 right 2/2 14/10 0/14 0/10 up 3/19 21/7 0/15 0/17 down 4/20 22/8 0/16 0/18 home 9/5 17/0 0/0 0/0 end 10/6 18/0 0/0 0/0 page up 11/7 23/0 0/11 0/0 page down 12/8 24/0 0/12 0/0 (FLTK action / OS X action) (adding the shift key extends the selection, all other combinations are no-op) 0: no-op 1: move cursor to the left, at line beginning wrap to end of prev line, at doc start no-op 2: move cursor to the right, at line end move to beginning of the next line, at doc end no-op 3: move cursor up, at doc top no-op 4: move cursor down, at doc bottom no-op 5: scroll display to top of text (cursor unchanged) 6: scroll display to end of text (cursor unchanged) 7: scroll text down one page (cursor unchanged) 8: scroll text up one page (cursor unchanged) 9: move cursor to beginning of line 10: move cursor to end of line 11: move cursor up one page and scroll down 12: move cursor down one page and scroll up 13: move to the beginning of the word or the previous word 14: move to the end of the word or the next word 15: if start of line: start of prev line, else start of this line 16: if end of line: end of next line, else end of this line 17: move cursor to the beginning of the document 18: move cursor to the end of the document 19: move cursor up, at doc top: home, at doc start: no-op) 20: move cursor down, at doc bot: end, at doc end: no-op) 21: scroll text down one line (cursor unchanged) 22: scroll text up one line (cursor unchanged) 23: move cursor to the beginning of the top of the screen 24: move cursor to the beginning of the bottom of the window */ /** The constructor creates a new text editor widget.*/ Fl_Text_Editor_mod::Fl_Text_Editor_mod(int X, int Y, int W, int H, const char* l) : Fl_Text_Display_mod(X, Y, W, H, l) { mCursorOn = 1; insert_mode_ = 1; key_bindings = 0; // handle the default key bindings add_default_key_bindings(&key_bindings); // handle everything else default_key_function(kf_default); } #ifndef FL_DOXYGEN Fl_Text_Editor_mod::Key_Binding* Fl_Text_Editor_mod::global_key_bindings = 0; #endif // These are the default key bindings every widget should start with static struct { int key; int state; Fl_Text_Editor_mod::Key_Func func; } default_key_bindings[] = { { FL_Escape, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_ignore }, { FL_Enter, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_enter }, { FL_KP_Enter, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_enter }, { FL_BackSpace, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_backspace }, { FL_Insert, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_insert }, { FL_Delete, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_delete }, { FL_Home, 0, Fl_Text_Editor_mod::kf_move }, { FL_End, 0, Fl_Text_Editor_mod::kf_move }, { FL_Left, 0, Fl_Text_Editor_mod::kf_move }, { FL_Up, 0, Fl_Text_Editor_mod::kf_move }, { FL_Right, 0, Fl_Text_Editor_mod::kf_move }, { FL_Down, 0, Fl_Text_Editor_mod::kf_move }, { FL_Page_Up, 0, Fl_Text_Editor_mod::kf_move }, { FL_Page_Down, 0, Fl_Text_Editor_mod::kf_move }, { FL_Home, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_End, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Left, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Up, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Right, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Down, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Page_Up, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Page_Down, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Home, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_End, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Left, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Up, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Right, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Down, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Page_Up, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Page_Down, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Home, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_End, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Left, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Right, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Page_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Page_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, //{ FL_Clear, 0, Fl_Text_Editor_mod::delete_to_eol }, { 'z', FL_CTRL, Fl_Text_Editor_mod::kf_undo }, { '/', FL_CTRL, Fl_Text_Editor_mod::kf_undo }, { 'x', FL_CTRL, Fl_Text_Editor_mod::kf_cut }, { FL_Delete, FL_SHIFT, Fl_Text_Editor_mod::kf_cut }, { 'c', FL_CTRL, Fl_Text_Editor_mod::kf_copy }, { FL_Insert, FL_CTRL, Fl_Text_Editor_mod::kf_copy }, { 'v', FL_CTRL, Fl_Text_Editor_mod::kf_paste }, { FL_Insert, FL_SHIFT, Fl_Text_Editor_mod::kf_paste }, { 'a', FL_CTRL, Fl_Text_Editor_mod::kf_select_all }, #ifdef __APPLE__ // Define CMD+key accelerators... { 'z', FL_COMMAND, Fl_Text_Editor_mod::kf_undo }, { 'x', FL_COMMAND, Fl_Text_Editor_mod::kf_cut }, { 'c', FL_COMMAND, Fl_Text_Editor_mod::kf_copy }, { 'v', FL_COMMAND, Fl_Text_Editor_mod::kf_paste }, { 'a', FL_COMMAND, Fl_Text_Editor_mod::kf_select_all }, { FL_Left, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Right, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Up, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Down, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Left, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Right, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Up, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Down, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, #endif // __APPLE__ { 0, 0, 0 } }; /** Adds all of the default editor key bindings to the specified key binding list.*/ void Fl_Text_Editor_mod::add_default_key_bindings(Key_Binding** list) { for (int i = 0; default_key_bindings[i].key; i++) { add_key_binding(default_key_bindings[i].key, default_key_bindings[i].state, default_key_bindings[i].func, list); } } /** Returns the function associated with a key binding.*/ Fl_Text_Editor_mod::Key_Func Fl_Text_Editor_mod::bound_key_function(int key, int state, Key_Binding* list) { Key_Binding* cur; for (cur = list; cur; cur = cur->next) if (cur->key == key) if (cur->state == Fl_Text_Editor_mod_ANY_STATE || cur->state == state) break; if (!cur) return 0; return cur->function; } /** Removes all of the key bindings associated with the text editor or list.*/ void Fl_Text_Editor_mod::remove_all_key_bindings(Key_Binding** list) { Key_Binding *cur, *next; for (cur = *list; cur; cur = next) { next = cur->next; delete cur; } *list = 0; } /** Removes the key binding associated with the key "key" of state "state" */ void Fl_Text_Editor_mod::remove_key_binding(int key, int state, Key_Binding** list) { Key_Binding *cur, *last = 0; for (cur = *list; cur; last = cur, cur = cur->next) if (cur->key == key && cur->state == state) break; if (!cur) return; if (last) last->next = cur->next; else *list = cur->next; delete cur; } /** Adds a key of state "state" with the function "function" */ void Fl_Text_Editor_mod::add_key_binding(int key, int state, Key_Func function, Key_Binding** list) { Key_Binding* kb = new Key_Binding; kb->key = key; kb->state = state; kb->function = function; kb->next = *list; *list = kb; } //////////////////////////////////////////////////////////////// static void kill_selection(Fl_Text_Editor_mod* e) { if (e->buffer()->selected()) { e->insert_position(e->buffer()->primary_selection()->start()); e->buffer()->remove_selection(); } } /** Inserts the text associated with the key */ int Fl_Text_Editor_mod::kf_default(int c, Fl_Text_Editor_mod* e) { // FIXME: this function is a mess! Fix this! if (!c || (!isprint(c) && c != '\t')) return 0; char s[2] = "\0"; s[0] = (char)c; kill_selection(e); if (e->insert_mode()) e->insert(s); else e->overstrike(s); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Ignores the keypress */ int Fl_Text_Editor_mod::kf_ignore(int, Fl_Text_Editor_mod*) { return 0; // don't handle } /** Does a backspace in the current buffer.*/ int Fl_Text_Editor_mod::kf_backspace(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected() && e->move_left()) { int p1 = e->insert_position(); int p2 = e->buffer()->next_char(p1); e->buffer()->select(p1, p2); } kill_selection(e); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Inserts a newline at the current cursor position */ int Fl_Text_Editor_mod::kf_enter(int, Fl_Text_Editor_mod* e) { kill_selection(e); e->insert("\n"); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } extern void fl_text_drag_me(int pos, Fl_Text_Display_mod* d); /** Moves the text cursor in the direction indicated by key c.*/ int Fl_Text_Editor_mod::kf_move(int c, Fl_Text_Editor_mod* e) { int i; int selected = e->buffer()->selected(); if (!selected) e->dragPos = e->insert_position(); e->buffer()->unselect(); Fl::copy("", 0, 0); switch (c) { case FL_Home: e->insert_position(e->buffer()->line_start(e->insert_position())); break; case FL_End: e->insert_position(e->buffer()->line_end(e->insert_position())); break; case FL_Left: e->move_left(); break; case FL_Right: e->move_right(); break; case FL_Up: e->move_up(); break; case FL_Down: e->move_down(); break; case FL_Page_Up: for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_up(); break; case FL_Page_Down: for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_down(); break; } e->show_insert_position(); return 1; } /** Extends the current selection in the direction of key c.*/ int Fl_Text_Editor_mod::kf_shift_move(int c, Fl_Text_Editor_mod* e) { kf_move(c, e); fl_text_drag_me(e->insert_position(), e); char *copy = e->buffer()->selection_text(); if (copy) { Fl::copy(copy, strlen(copy), 0); free(copy); } return 1; } /** Moves the current text cursor in the direction indicated by control key */ int Fl_Text_Editor_mod::kf_ctrl_move(int c, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) e->dragPos = e->insert_position(); if (c != FL_Up && c != FL_Down) { e->buffer()->unselect(); Fl::copy("", 0, 0); e->show_insert_position(); } switch (c) { case FL_Home: e->insert_position(0); e->scroll(0, 0); break; case FL_End: e->insert_position(e->buffer()->length()); e->scroll(e->count_lines(0, e->buffer()->length(), 1), 0); break; case FL_Left: e->previous_word(); break; case FL_Right: e->next_word(); break; case FL_Up: e->scroll(e->mTopLineNum-1, e->mHorizOffset); break; case FL_Down: e->scroll(e->mTopLineNum+1, e->mHorizOffset); break; case FL_Page_Up: e->insert_position(e->mLineStarts[0]); break; case FL_Page_Down: e->insert_position(e->mLineStarts[e->mNVisibleLines-2]); break; } return 1; } /** Moves the current text cursor in the direction indicated by meta key */ int Fl_Text_Editor_mod::kf_meta_move(int c, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) e->dragPos = e->insert_position(); if (c != FL_Up && c != FL_Down) { e->buffer()->unselect(); Fl::copy("", 0, 0); e->show_insert_position(); } switch (c) { case FL_Up: // top of buffer e->insert_position(0); e->scroll(0, 0); break; case FL_Down: // end of buffer e->insert_position(e->buffer()->length()); e->scroll(e->count_lines(0, e->buffer()->length(), 1), 0); break; case FL_Left: // beginning of line kf_move(FL_Home, e); break; case FL_Right: // end of line kf_move(FL_End, e); break; } return 1; } /** Extends the current selection in the direction indicated by meta key c. */ int Fl_Text_Editor_mod::kf_m_s_move(int c, Fl_Text_Editor_mod* e) { kf_meta_move(c, e); fl_text_drag_me(e->insert_position(), e); return 1; } /** Extends the current selection in the direction indicated by control key c. */ int Fl_Text_Editor_mod::kf_c_s_move(int c, Fl_Text_Editor_mod* e) { kf_ctrl_move(c, e); fl_text_drag_me(e->insert_position(), e); return 1; } /** Moves the text cursor to the beginning of the current line.*/ int Fl_Text_Editor_mod::kf_home(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Home, e); } /** Moves the text cursor to the end of the current line.*/ int Fl_Text_Editor_mod::kf_end(int, Fl_Text_Editor_mod* e) { return kf_move(FL_End, e); } /** Moves the text cursor one character to the left.*/ int Fl_Text_Editor_mod::kf_left(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Left, e); } /** Moves the text cursor one line up.*/ int Fl_Text_Editor_mod::kf_up(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Up, e); } /** Moves the text cursor one character to the right.*/ int Fl_Text_Editor_mod::kf_right(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Right, e); } /** Moves the text cursor one line down.*/ int Fl_Text_Editor_mod::kf_down(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Down, e); } /** Moves the text cursor up one page.*/ int Fl_Text_Editor_mod::kf_page_up(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Page_Up, e); } /** Moves the text cursor down one page.*/ int Fl_Text_Editor_mod::kf_page_down(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Page_Down, e); } /** Toggles the insert mode in the text editor.*/ int Fl_Text_Editor_mod::kf_insert(int, Fl_Text_Editor_mod* e) { e->insert_mode(e->insert_mode() ? 0 : 1); return 1; } /** Does a delete of selected text or the current character in the current buffer.*/ int Fl_Text_Editor_mod::kf_delete(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) { int p1 = e->insert_position(); int p2 = e->buffer()->next_char(p1); e->buffer()->select(p1, p2); } kill_selection(e); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Does a copy of selected text or the current character in the current buffer.*/ int Fl_Text_Editor_mod::kf_copy(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) return 1; const char *copy = e->buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 1); free((void*)copy); e->show_insert_position(); return 1; } /** Does a cut of selected text in the current buffer.*/ int Fl_Text_Editor_mod::kf_cut(int c, Fl_Text_Editor_mod* e) { kf_copy(c, e); kill_selection(e); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Does a paste of selected text in the current buffer.*/ int Fl_Text_Editor_mod::kf_paste(int, Fl_Text_Editor_mod* e) { kill_selection(e); Fl::paste(*e, 1); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Selects all text in the current buffer.*/ int Fl_Text_Editor_mod::kf_select_all(int, Fl_Text_Editor_mod* e) { e->buffer()->select(0, e->buffer()->length()); const char *copy = e->buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } /** Undo last edit in the current buffer. Also deselect previous selection. */ int Fl_Text_Editor_mod::kf_undo(int , Fl_Text_Editor_mod* e) { e->buffer()->unselect(); Fl::copy("", 0, 0); int crsr; int ret = e->buffer()->undo(&crsr); e->insert_position(crsr); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return ret; } /** Handles a key press in the editor */ int Fl_Text_Editor_mod::handle_key() { // Call FLTK's rules to try to turn this into a printing character. // This uses the right-hand ctrl key as a "compose prefix" and returns // the changes that should be made to the text, as a number of // bytes to delete and a string to insert: int del = 0; if (Fl::compose(del)) { if (del) { int dp = insert_position(), di = del; while (di--) dp = buffer()->prev_char_clipped(dp); buffer()->select(dp, insert_position()); } kill_selection(this); if (Fl::event_length()) { if (insert_mode()) insert(Fl::event_text()); else overstrike(Fl::event_text()); } show_insert_position(); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; } int key = Fl::event_key(), state = Fl::event_state(), c = Fl::event_text()[0]; state &= FL_SHIFT|FL_CTRL|FL_ALT|FL_META; // only care about these states Key_Func f; f = bound_key_function(key, state, global_key_bindings); if (!f) f = bound_key_function(key, state, key_bindings); if (f) return f(key, this); if (default_key_function_ && !state) return default_key_function_(c, this); return 0; } /** does or does not a callback according to changed() and when() settings */ void Fl_Text_Editor_mod::maybe_do_callback() { // printf("Fl_Text_Editor_mod::maybe_do_callback()\n"); // printf("changed()=%d, when()=%x\n", changed(), when()); if (changed() || (when()&FL_WHEN_NOT_CHANGED)) do_callback(); } int Fl_Text_Editor_mod::handle(int event) { static int dndCursorPos; if (!buffer()) return 0; switch (event) { case FL_FOCUS: show_cursor(mCursorOn); // redraws the cursor if (buffer()->selected()) redraw(); // Redraw selections... Fl::focus(this); return 1; case FL_UNFOCUS: show_cursor(mCursorOn); // redraws the cursor if (buffer()->selected()) redraw(); // Redraw selections... case FL_HIDE: if (when() & FL_WHEN_RELEASE) maybe_do_callback(); return 1; case FL_KEYBOARD: if (active_r() && window() && this == Fl::belowmouse()) window()->cursor(FL_CURSOR_NONE); return handle_key(); case FL_PASTE: if (!Fl::event_text()) { fl_beep(); return 1; } buffer()->remove_selection(); if (insert_mode()) insert(Fl::event_text()); else overstrike(Fl::event_text()); show_insert_position(); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; case FL_ENTER: // MRS: WIN32 only? Need to test! // case FL_MOVE: show_cursor(mCursorOn); return 1; case FL_PUSH: if (Fl::event_button() == 2) { // don't let the text_display see this event if (Fl_Group::handle(event)) return 1; dragType = DRAG_NONE; if(buffer()->selected()) { buffer()->unselect(); } int pos = xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS); insert_position(pos); Fl::paste(*this, 0); Fl::focus(this); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; } break; case FL_SHORTCUT: if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; if (Fl::visible_focus() && handle(FL_FOCUS)) { Fl::focus(this); return 1; } break; // Handle drag'n'drop attempt by the user. This is a simplified // implementation which allows dnd operations onto the scroll bars. case FL_DND_ENTER: // save the current cursor position if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this); show_cursor(mCursorOn); dndCursorPos = insert_position(); /* fall through */ case FL_DND_DRAG: // show a temporary insertion cursor insert_position(xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS)); return 1; case FL_DND_LEAVE: // restore original cursor insert_position(dndCursorPos); return 1; case FL_DND_RELEASE: // keep insertion cursor and wait for the FL_PASTE event buffer()->unselect(); // FL_PASTE must not destroy current selection! return 1; } return Fl_Text_Display_mod::handle(event); } // // End of "$Id: Fl_Text_Editor_mod.cxx 8034 2010-12-15 12:21:55Z AlbrechtS $". // fldigi-4.1.06/src/widgets/progress.cxx0000644000175000017500000000623513472116000014606 00000000000000// // progress.cxx // // Progress bar widget routines. // // Based on Fl_Progress widget, Copyright 2000-2005 by Michael Sweet. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "progress.h" // // progress is a progress bar widget based off Fl_Widget that shows a // standard progress bar in either horizontal or vertical format // // if direction == VERTICAL the indicator goes from lower to upper // if direction == HORIZONTAL the indicator goes from left to right void Progress::draw() { int progress; // Size of progress bar... int bx, by, bw, bh; // Box areas... int tx, tw; // Temporary X + width int th; // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = x() + bx; tw = w() - bw; th = h() - bh; // Draw the progress bar... if (maximum_ > minimum_) progress = (int)((direction == HORIZONTAL ? tw : th) * (value_ - minimum_) / (maximum_ - minimum_) + 0.5f); else progress = 0; // Draw the box and label... if (progress > 0) { Fl_Color c = labelcolor(); labelcolor(fl_contrast(labelcolor(), color2())); if (direction == HORIZONTAL) { fl_clip(x(), y(), progress, h()); draw_box(box(), x(), y(), w(), h(), active_r() ? color2() : fl_inactive(color2())); draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); labelcolor(c); fl_clip(x() + progress, y(), tw - progress, h()); draw_box(box(), x(), y(), w(), h(), active_r() ? color() : fl_inactive(color())); draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); } else { fl_clip(x(), y(), w(), h() - progress); draw_box(box(), x(), y(), w(), h(), active_r() ? color() : fl_inactive(color())); // draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); labelcolor(c); fl_clip(x(), y() + h() - progress, w(), progress ); draw_box(box(), x(), y(), w(), h(), active_r() ? color2() : fl_inactive(color2())); // draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); } } else { draw_box(box(), x(), y(), w(), h(), color()); if (direction == HORIZONTAL) draw_label(tx, y() + by, tw, h() - bh); } } Progress::Progress(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, l) { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); color(FL_BACKGROUND2_COLOR, FL_YELLOW); minimum(0.0f); maximum(100.0f); value(0.0f); direction = HORIZONTAL; } // // End of "$Id: Progress.cxx 4288 2005-04-16 00:13:17Z mike $". // fldigi-4.1.06/src/widgets/psk_browser.cxx0000644000175000017500000002150513472116000015277 00000000000000// ---------------------------------------------------------------------------- // // PSK browser widget // // Copyright (C) 2008-2010 // David Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "psk_browser.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "gettext.h" #include "flmisc.h" #include "flinput2.h" #include "flslider2.h" #include "spot.h" #include "icons.h" #include "Viewer.h" #include "audio_alert.h" #include using namespace std; string pskBrowser::hilite_color_1; string pskBrowser::hilite_color_2; string pskBrowser::white; string pskBrowser::bkgnd[2]; int pskBrowser::cwidth = 5; int pskBrowser::cheight = 12; int pskBrowser::sbarwidth = 16; pskBrowser::pskBrowser(int x, int y, int w, int h, const char *l) :Fl_Hold_Browser(x,y,w,h,l) { fnt = FL_HELVETICA; siz = 12; rfc = 0LL; usb = true; seek_re = NULL; cols[0] = 80; cols[1] = 0; evalcwidth(); HiLite_1 = FL_RED; HiLite_2 = FL_GREEN; BkSelect = FL_BLUE; Backgnd1 = (Fl_Color)55; Backgnd2 = (Fl_Color)53; makecolors(); cdistiller = reinterpret_cast(operator new(MAXCHANNELS*sizeof(CharsetDistiller))); string bline; for (int i = 0; i < MAXCHANNELS; i++) { alerted[i].regex_alert = alerted[i].mycall_alert = false; bwsrline[i] = " "; bwsrfreq[i] = NULLFREQ; bline = freqformat(i); if ( i < progdefaults.VIEWERchannels) add(bline.c_str()); linechars[i] = 0; new(&cdistiller[i]) CharsetDistiller; } nchars = (w - cols[0] - (sbarwidth + 2*BWSR_BORDER)) / cwidth; nchars = nchars < 1 ? 1 : nchars; } pskBrowser::~pskBrowser() { for (int i = MAXCHANNELS-1; i >= 0; i--) cdistiller[i].~CharsetDistiller(); operator delete(cdistiller); } void pskBrowser::evalcwidth() { fl_font(fnt, siz); textfont(fnt); textsize(siz); cwidth = (int)fl_width("8"); if (cwidth <= 0) cwidth = 5; cheight = fl_height(); labelwidth[VIEWER_LABEL_OFF] = 1; labelwidth[VIEWER_LABEL_AF] = 5*cwidth; labelwidth[VIEWER_LABEL_RF] = 10*cwidth; labelwidth[VIEWER_LABEL_CH] = 3*cwidth; columns(labelwidth[progdefaults.VIEWERlabeltype]); } string pskBrowser::freqformat(int i) // 0 < i < channels { szLine[0] = 0; int freq = bwsrfreq[i]; switch (progdefaults.VIEWERlabeltype) { case VIEWER_LABEL_AF: if (freq != NULLFREQ) snprintf(szLine, sizeof(szLine), "%4d", freq); else snprintf(szLine, sizeof(szLine), " "); break; case VIEWER_LABEL_RF: if (freq != NULLFREQ) snprintf(szLine, sizeof(szLine), "%8.2f", (rfc + (usb ? freq : -freq)) / 1000.0f); else snprintf(szLine, sizeof(szLine), " "); break; case VIEWER_LABEL_CH: snprintf(szLine, sizeof(szLine), "%2d", i + 1); break; default: snprintf(szLine, sizeof(szLine), " "); break; } fline = white; fline.append("@r").append(szLine).append("\t").append(bkgnd[i%2]); return fline; } void pskBrowser::swap(int i, int j) { string tempstr = bwsrline[j]; bwsrline[j] = bwsrline[i]; bwsrline[i] = tempstr; int f = bwsrfreq[j]; bwsrfreq[j] = bwsrfreq[i]; bwsrfreq[i] = f; tempstr = freqformat(i); tempstr.append(bwsrline[i]); text(i+1, tempstr.c_str()); tempstr = freqformat(j); tempstr.append(bwsrline[j]); text(j+1, tempstr.c_str()); redraw(); } static size_t case_find(string &haystack, string &needle) { string Uhaystack = haystack; string Uneedle = needle; for (size_t i = 0; i < Uhaystack.length(); i++ ) Uhaystack[i] = toupper(Uhaystack[i]); for (size_t i = 0; i < Uneedle.length(); i++ ) Uneedle[i] = toupper(Uneedle[i]); return Uhaystack.find(Uneedle); } void pskBrowser::resize(int x, int y, int w, int h) { if (w) { Fl_Hold_Browser::resize(x,y,w,h); evalcwidth(); nchars = (w - cols[0] - (sbarwidth + 2*BWSR_BORDER)) / cwidth; nchars = nchars < 1 ? 1 : nchars; string bline; Fl_Hold_Browser::clear(); for (int i = 0, j = 0; i < progdefaults.VIEWERchannels; i++) { if (progdefaults.VIEWERascend) j = progdefaults.VIEWERchannels - 1 - i; else j = i; bwsrline[j].clear(); linechars[j] = 0; bline = freqformat(j); if (seek_re && seek_re->match(bwsrline[j].c_str(), REG_NOTBOL | REG_NOTEOL)) bline.append(hilite_color_1); else if ( !progdefaults.myCall.empty() && case_find (bwsrline[j], progdefaults.myCall ) != string::npos) bline.append(hilite_color_2); Fl_Hold_Browser::add(bline.c_str()); } } } void pskBrowser::makecolors() { char tempstr[20]; snprintf(tempstr, sizeof(tempstr), "@C%u", HiLite_1); hilite_color_1 = tempstr; snprintf(tempstr, sizeof(tempstr), "@C%u", HiLite_2); hilite_color_2 = tempstr; snprintf(tempstr, sizeof(tempstr), "@C%u", FL_FOREGROUND_COLOR); // foreground white = tempstr; selection_color(BkSelect); snprintf(tempstr, sizeof(tempstr), "@B%u", Backgnd1); // background for odd rows bkgnd[0] = tempstr; snprintf(tempstr, sizeof(tempstr), "@B%u", Backgnd2); // background for even rows bkgnd[1] = tempstr; } void pskBrowser::addchr(int ch, int freq, unsigned char c, int md, bool signal_alert) { if (ch < 0 || ch >= MAXCHANNELS) return; if (c == '\n') c = ' '; if (c < ' ') return; nchars = (w() - cols[0] - (sbarwidth + 2*BWSR_BORDER)) / cwidth; nchars = nchars < 1 ? 1 : nchars; bwsrfreq[ch] = freq; if (bwsrline[ch].length() == 1 && bwsrline[ch][0] == ' ') { bwsrline[ch].clear(); linechars[ch] = 0; } cdistiller[ch].rx(c); if (cdistiller[ch].data_length() > 0) { bwsrline[ch] += cdistiller[ch].data(); linechars[ch] += cdistiller[ch].num_chars(); cdistiller[ch].clear(); } if (linechars[ch] > nchars) { if (progdefaults.VIEWERmarquee) { while (linechars[ch] > nchars) { bwsrline[ch].erase(0, fl_utf8len1(bwsrline[ch][0])); linechars[ch]--; } } else { bwsrline[ch].clear(); linechars[ch] = 0; } } nuline = freqformat(ch); if (!bwsrline[ch].empty()) { if (seek_re && seek_re->match(bwsrline[ch].c_str(), REG_NOTBOL | REG_NOTEOL)) { if ((trx_state == STATE_RX) && (alerted[ch].regex_alert == false) && signal_alert && progdefaults.ENABLE_BWSR_REGEX_MATCH) { if (audio_alert) audio_alert->alert(progdefaults.BWSR_REGEX_MATCH); alerted[ch].regex_alert = true; } nuline.append(hilite_color_1); } else { alerted[ch].regex_alert = false; } } else { alerted[ch].regex_alert = false; } if (!progdefaults.myCall.empty() && case_find (bwsrline[ch], progdefaults.myCall ) != string::npos) { nuline.append(hilite_color_2); if ((trx_state == STATE_RX) && (alerted[ch].mycall_alert == false) && signal_alert && progdefaults.ENABLE_BWSR_MYCALL_MATCH) { if (audio_alert) audio_alert->alert(progdefaults.BWSR_MYCALL_MATCH); alerted[ch].mycall_alert = true; } } else alerted[ch].mycall_alert = false; nuline.append("@.").append(bwsrline[ch]); if (progdefaults.VIEWERascend) text(progdefaults.VIEWERchannels - ch, nuline.c_str()); else text(ch + 1, nuline.c_str()); redraw(); } void pskBrowser::set_freq(int i, int freq) // 0 < i < channels { string new_line = ""; bwsrfreq[i] = freq; new_line.append(freqformat(i)).append(bwsrline[i]); if (progdefaults.VIEWERascend) replace(progdefaults.VIEWERchannels - i, new_line.c_str()); else replace(i + 1, new_line.c_str()); } void pskBrowser::clear() { long freq; Fl_Hold_Browser::clear(); for (int i = 0, j = 0; i < progdefaults.VIEWERchannels; i++) { if (progdefaults.VIEWERascend) j = progdefaults.VIEWERchannels - 1 - i; else j = i; freq = NULLFREQ; bwsrline[j] = " "; bwsrfreq[j] = freq; fline = freqformat(j); add((fline.append(bwsrline[j])).c_str()); } deselect(); redraw(); } void pskBrowser::clearch(int n, int freq) // 0 < n < channels { bwsrline[n] = " "; set_freq(n, freq); redraw(); } int pskBrowser::freq(int i) { // 1 < i < progdefaults.VIEWERchannels if (progdefaults.VIEWERascend) return ( i < 1 ? 0 : i > progdefaults.VIEWERchannels ? 0 : bwsrfreq[progdefaults.VIEWERchannels - i]); else return (i < 1 ? 0 : i > MAXCHANNELS ? 0 : bwsrfreq[i - 1]); } void pskBrowser::set_input_encoding(int encoding_id) { for (int i = 0; i < MAXCHANNELS; i++) cdistiller[i].set_input_encoding(encoding_id); } fldigi-4.1.06/src/widgets/Panel.cxx0000644000175000017500000001455013472116000014000 00000000000000// ---------------------------------------------------------------------------- // Panel.cxx // // Copyright (C) 2007-2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) aRY later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ARY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- //#include #include #include #include #include #include #include "Panel.h" #include // Drag the edges that were initially at oldx,oldy to newx,newy: // pass -1 as oldx or oldy to disable drag in that direction: //#define DEVEL_DEBUG 1 int Panel::orgx() { int oldx = w(); int *p = sizes() + 8; for (int i=children(); i--; p += 4) if (p[1] < oldx) oldx = p[1]; return oldx; } int Panel::orgy() { int oldy = h(); int *p = sizes() + 8; for (int i=children(); i--; p += 4) if (p[3] < oldy) oldy = p[3]; return oldy; } void Panel::position(int oix, int oiy, int newx, int newy) { #ifdef DEVEL_DEBUG printf("oix %3d, oiy %3d, nux %3d, nuy %3d\n", oix, oiy, newx, newy); #endif Fl_Widget* const* a = array(); int *p = sizes(); #ifdef DEVEL_DEBUG printf("p0 %3d, p1 %3d, p2 %3d, p3 %3d\n", p[0], p[1], p[2], p[3]); printf("p4 %3d, p5 %3d, p6 %3d, p7 %3d\n", p[0], p[1], p[2], p[3]); #endif p += 8; // skip group & resizable's saved size for (int i=children(); i--; p += 4) { Fl_Widget* o = *a++; if (o == resizable()) continue; int X = o->x(); int Y = o->y(); int W = o->w(); int H = o->h(); int R = X + W; int B = Y + H; if (o == resizable()) continue; if (oix > -1) { int t = p[0]; if ((t == oix) || (t>oix && Xnewx)) X = newx; t = p[1]; if ((t == oix) || (t>oix && Rnewx)) R = newx; } if (oiy > -1) { int t = p[2]; if ((t == oiy) || (t>oiy && Ynewy)) Y = newy; t = p[3]; if ((t == oiy) || (t>oiy && Bnewy)) B = newy; } o->damage_resize(X, Y, R-X, B-Y); } } // move the lower-right corner (sort of): void Panel::resize(int X,int Y,int W,int H) { // remember how much to move the child widgets: int *p = sizes(); int OX = x(); int OY = y(); int OW = w(); int OH = h(); int OR = OX + OW; int OB = OY + OH; float dw = 1.0 * W / OW; float dh = 1.0 * H / OH; // resize this (skip the Fl_Group resize): Fl_Widget::resize(X,Y,W,H); // find x, y, w, h of resizable: int RX = X + (p[4] - p[0]); int RY = Y + (p[6] - p[2]); int RR = X + W - (p[1] - p[5]); int RB = Y + H - (p[3] - p[7]); int NW = RR - RX; int NH = RB - RY; int R; int B; int xx; int yy; // move everything to be on correct side of new resizable: Fl_Widget * const *a = array(); Fl_Widget * o = 0; p += 8; for (int i=children(); i--;) { o = *a++; if (o == resizable()) { o->resize(RX, RY, NW, NH); } else { xx = X; if (o->x() != OX) xx = (o->x() - OX) * dw + X + 0.5; if (xx > RR) xx = RR; if (o->x() + o->w() == OR) { R = X + W; if (xx != X && xx < RX) xx = RX; } else { R = xx + o->w() * dw + 0.5; if (R < xx) R = xx; if (xx <= RX && R < RX) R = RX; if (xx <= RX && R > RR ) R = RR; } yy = Y; if (o->y() != OY) yy = (o->y() - OY) * dh + Y + 0.5; if (yy > RB) yy = RB; if (o->y() + o->h() == OB) { B = Y + H; if (yy != Y && yy < RY) yy = RY; } else { B = yy + o->h() * dh + 0.5; if (B < yy) B = yy; if (yy <= RY && B < RY) B = RY; if (yy <= RY && B > RB) B = RB; } o->resize(xx,yy,R-xx,B-yy); } p += 4; // next child sizes array // do *not* call o->redraw() here! If you do, and the tile is inside a // scroll, it'll set the damage areas wrong for all children! } } static void set_cursor(Panel *t, Fl_Cursor c) { static Fl_Cursor cursor; if (cursor == c || !t->window()) return; cursor = c; t->window()->cursor(c); } static Fl_Cursor cursors[4] = { FL_CURSOR_DEFAULT, FL_CURSOR_WE, FL_CURSOR_NS, FL_CURSOR_MOVE}; int Panel::handle(int event) { static int sdrag; static int sdx, sdy; static int sx, sy; #define DRAGH 1 #define DRAGV 2 #define GRABAREA 4 int mx = Fl::event_x(); int my = Fl::event_y(); switch (event) { case FL_MOVE: case FL_ENTER: case FL_PUSH: { int mindx = 100; int mindy = 100; int oldx = 0; int oldy = 0; Fl_Widget*const* a = array(); int *q = sizes(); int *p = q + 8; for (int i=children(); i--; p += 4) { Fl_Widget* o = *a++; if (o == resizable()) continue; if (p[1]y()<=my+GRABAREA && o->y()+o->h()>=my-GRABAREA) { int t = mx - (o->x()+o->w()); if (abs(t) < mindx) { sdx = t; mindx = abs(t); oldx = p[1]; } } if (p[3]x()<=mx+GRABAREA && o->x()+o->w()>=mx-GRABAREA) { int t = my - (o->y()+o->h()); if (abs(t) < mindy) { sdy = t; mindy = abs(t); oldy = p[3]; } } } sdrag = 0; sx = sy = -1; if (mindx <= GRABAREA) {sdrag = DRAGH; sx = oldx;} if (mindy <= GRABAREA) {sdrag |= DRAGV; sy = oldy;} set_cursor(this, cursors[sdrag]); if (sdrag) return 1; return Fl_Group::handle(event); } case FL_LEAVE: set_cursor(this, FL_CURSOR_DEFAULT); break; case FL_DRAG: // This is necessary if CONSOLIDATE_MOTION in Fl_x.cxx is turned off: if (damage()) return 1; // don't fall behind case FL_RELEASE: { if (!sdrag) return 0; // should not happen Fl_Widget* r = resizable(); if (!r) r = this; int newx; if (sdrag&DRAGH) { newx = Fl::event_x()-sdx; if (newx < r->x()) newx = r->x(); else if (newx >= r->x()+r->w()) newx = r->x()+r->w(); } else newx = sx; int newy; if (sdrag&DRAGV) { newy = Fl::event_y()-sdy; if (newy < r->y()) newy = r->y(); else if (newy >= r->y()+r->h()) newy = r->y()+r->h(); } else newy = sy; position(sx,sy,newx,newy); if (event == FL_DRAG) set_changed(); do_callback(); return 1;} } return Fl_Group::handle(event); } fldigi-4.1.06/src/widgets/Fl_Text_Display_mod.cxx0000644000175000017500000037415213472116000016641 00000000000000// // "$Id: Fl_Text_Display_mod.cxx 8808 2011-06-16 13:31:25Z manolo $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" #include "Fl_Text_Display_mod.H" #undef min #undef max // Text area margins. Left & right margins should be at least 3 so that // there is some room for the overhanging parts of the cursor! const int Fl_Text_Display_mod::DEFAULT_TOP_MARGIN = 1; const int Fl_Text_Display_mod::DEFAULT_BOTTOM_MARGIN = 1; const int Fl_Text_Display_mod::DEFAULT_LEFT_MARGIN = 3; const int Fl_Text_Display_mod::DEFAULT_RIGHT_MARGIN = 3; //#define TOP_MARGIN 1 //#define BOTTOM_MARGIN 1 //#define LEFT_MARGIN 3 //#define RIGHT_MARGIN 3 #define NO_HINT -1 /* Masks for text drawing methods. These are or'd together to form an integer which describes what drawing calls to use to draw a string */ #define FILL_MASK 0x0100 #define SECONDARY_MASK 0x0200 #define PRIMARY_MASK 0x0400 #define HIGHLIGHT_MASK 0x0800 #define BG_ONLY_MASK 0x1000 #define TEXT_ONLY_MASK 0x2000 #define STYLE_LOOKUP_MASK 0xff /* Maximum displayable line length (how many characters will fit across the widest window). This amount of memory is temporarily allocated from the stack in the draw_vline() method for drawing strings */ #define MAX_DISP_LINE_LEN 1000 static int max( int i1, int i2 ); static int min( int i1, int i2 ); static int countlines( const char *string ); /* The variables below are used in a timer event to allow smooth scrolling of the text area when the pointer has left the area. */ static int scroll_direction = 0; static int scroll_amount = 0; static int scroll_y = 0; static int scroll_x = 0; // CET - FIXME #define TMPFONTWIDTH 6 /** \brief Creates a new text display widget. \param X, Y, W, H position and size of widget \param l label text, defaults to none */ Fl_Text_Display_mod::Fl_Text_Display_mod(int X, int Y, int W, int H, const char* l) : Fl_Group(X, Y, W, H, l) { int i; TOP_MARGIN = DEFAULT_TOP_MARGIN; BOTTOM_MARGIN = DEFAULT_BOTTOM_MARGIN; LEFT_MARGIN = DEFAULT_LEFT_MARGIN; RIGHT_MARGIN = DEFAULT_RIGHT_MARGIN; mMaxsize = 0; damage_range1_start = damage_range1_end = -1; damage_range2_start = damage_range2_end = -1; dragPos = dragging = 0; dragType = DRAG_CHAR; display_insert_position_hint = 0; shortcut_ = 0; color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); box(FL_DOWN_BOX); textsize(FL_NORMAL_SIZE); textcolor(FL_FOREGROUND_COLOR); textfont(FL_HELVETICA); set_flag(SHORTCUT_LABEL); text_area.x = 0; text_area.y = 0; text_area.w = 0; text_area.h = 0; mVScrollBar = new Fl_Scrollbar(0,0,1,1); mVScrollBar->callback((Fl_Callback*)v_scrollbar_cb, this); mHScrollBar = new Fl_Scrollbar(0,0,1,1); mHScrollBar->callback((Fl_Callback*)h_scrollbar_cb, this); mHScrollBar->type(FL_HORIZONTAL); end(); scrollbar_width(Fl::scrollbar_size()); scrollbar_align(FL_ALIGN_BOTTOM_RIGHT); mCursorOn = 0; mCursorPos = 0; mCursorOldY = -100; mCursorToHint = NO_HINT; mCursorStyle = NORMAL_CURSOR; mCursorPreferredXPos = -1; mBuffer = 0; mFirstChar = 0; mLastChar = 0; mNBufferLines = 0; mTopLineNum = mTopLineNumHint = 1; mAbsTopLineNum = 1; mNeedAbsTopLineNum = 0; mHorizOffset = mHorizOffsetHint = 0; mCursor_color = FL_FOREGROUND_COLOR; mStyleBuffer = 0; mStyleTable = 0; mNStyles = 0; mNVisibleLines = 1; mLineStarts = new int[mNVisibleLines]; mLineStarts[0] = 0; for (i=1; iremove_modify_callback(buffer_modified_cb, this); // mBuffer->remove_predelete_callback(buffer_predelete_cb, this); // } if (mLineStarts) delete[] mLineStarts; } /** Attach a text buffer to display, replacing the current buffer (if any) \param buf attach this text buffer */ void Fl_Text_Display_mod::buffer( Fl_Text_Buffer_mod *buf ) { /* If the text display is already displaying a buffer, clear it off of the display and remove our callback from it */ if ( buf == mBuffer) return; if ( mBuffer != 0 ) { // we must provide a copy of the buffer that we are deleting! char *deletedText = mBuffer->text(); buffer_modified_cb( 0, 0, mBuffer->length(), 0, deletedText, this ); free(deletedText); mNBufferLines = 0; mBuffer->remove_modify_callback( buffer_modified_cb, this ); mBuffer->remove_predelete_callback( buffer_predelete_cb, this ); } /* Add the buffer to the display, and attach a callback to the buffer for receiving modification information when the buffer contents change */ mBuffer = buf; if (mBuffer) { mBuffer->add_modify_callback( buffer_modified_cb, this ); mBuffer->add_predelete_callback( buffer_predelete_cb, this ); /* Update the display */ buffer_modified_cb( 0, buf->length(), 0, 0, 0, this ); } /* Resize the widget to update the screen... */ resize(x(), y(), w(), h()); } /** \brief Attach (or remove) highlight information in text display and redisplay. Highlighting information consists of a style buffer which parallels the normal text buffer, but codes font and color information for the display; a style table which translates style buffer codes (indexed by buffer character - 'A') into fonts and colors; and a callback mechanism for as-needed highlighting, triggered by a style buffer entry of "unfinishedStyle". Style buffer can trigger additional redisplay during a normal buffer modification if the buffer contains a primary Fl_Text_Selection (see extendRangeForStyleMods for more information on this protocol). Style buffers, tables and their associated memory are managed by the caller. Styles are ranged from 65 ('A') to 126. \param styleBuffer this buffer works in parallel to the text buffer. For every character in the text buffer, the stye buffer has a byte at the same offset that contains an index into an array of possible styles. \param styleTable a list of styles indexed by the style buffer \param nStyles number of styles in the style table \param unfinishedStyle if this style is found, the callback below is called \param unfinishedHighlightCB if a character with an unfinished style is found, this callback will be called \param cbArg and optional argument for the callback above, usually a pointer to the Text Display. */ void Fl_Text_Display_mod::highlight_data(Fl_Text_Buffer_mod *styleBuffer, const Style_Table_Entry *styleTable, int nStyles, char unfinishedStyle, Unfinished_Style_Cb unfinishedHighlightCB, void *cbArg ) { mStyleBuffer = styleBuffer; mStyleTable = styleTable; mNStyles = nStyles; mUnfinishedStyle = unfinishedStyle; mUnfinishedHighlightCB = unfinishedHighlightCB; mHighlightCBArg = cbArg; mColumnScale = 0; mStyleBuffer->canUndo(0); damage(FL_DAMAGE_EXPOSE); } /** \brief Find the longest line of all visible lines. \return the width of the longest visible line in pixels */ int Fl_Text_Display_mod::longest_vline() const { int longest = 0; for (int i = 0; i < mNVisibleLines; i++) longest = max(longest, measure_vline(i)); return longest; } /** \brief Change the size of the displayed text area. Calling this function will trigger a recalculation of all lines visible and of all scrollbar sizes. \param X, Y, W, H new position and size of this widget */ void Fl_Text_Display_mod::resize(int X, int Y, int W, int H) { #ifdef DEBUG printf("Fl_Text_Display_mod::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H); #endif // DEBUG const int oldWidth = w(); #ifdef DEBUG printf(" oldWidth=%d, mContinuousWrap=%d, mWrapMargin=%d\n", oldWidth, mContinuousWrap, mWrapMarginPix); #endif // DEBUG Fl_Widget::resize(X,Y,W,H); if (!buffer()) return; X += Fl::box_dx(box()); Y += Fl::box_dy(box()); W -= Fl::box_dw(box()); H -= Fl::box_dh(box()); text_area.x = X+LEFT_MARGIN; text_area.y = Y+TOP_MARGIN; text_area.w = W-LEFT_MARGIN-RIGHT_MARGIN; text_area.h = H-TOP_MARGIN-BOTTOM_MARGIN; int i; /* Find the new maximum font height for this text display */ for (i = 0, mMaxsize = fl_height(textfont(), textsize()); i < mNStyles; i++) mMaxsize = max(mMaxsize, fl_height(mStyleTable[i].font, mStyleTable[i].size)); // did we have scrollbars initially? unsigned int hscrollbarvisible = mHScrollBar->visible(); unsigned int vscrollbarvisible = mVScrollBar->visible(); // try without scrollbars first mVScrollBar->clear_visible(); mHScrollBar->clear_visible(); for (int again = 1; again;) { again = 0; /* In continuous wrap mode, a change in width affects the total number of lines in the buffer, and can leave the top line number incorrect, and the top character no longer pointing at a valid line start */ if (!mFastDisplay && mContinuousWrap && !mWrapMarginPix && W!=oldWidth) { int oldFirstChar = mFirstChar; mNBufferLines = count_lines(0, buffer()->length(), true); mFirstChar = line_start(mFirstChar); mTopLineNum = count_lines(0, mFirstChar, true)+1; absolute_top_line_number(oldFirstChar); #ifdef DEBUG printf(" mNBufferLines=%d\n", mNBufferLines); #endif // DEBUG } /* reallocate and update the line starts array, which may have changed size and / or contents. */ int nvlines = (text_area.h + mMaxsize - 1) / mMaxsize; if (nvlines < 1) nvlines = 1; if (mNVisibleLines != nvlines) { mNVisibleLines = nvlines; if (mLineStarts) delete[] mLineStarts; mLineStarts = new int [mNVisibleLines]; } calc_line_starts(0, mNVisibleLines); calc_last_char(); // figure the scrollbars if (scrollbar_width()) { /* Decide if the vertical scrollbar needs to be visible */ // always display vertical scroll bar // if (scrollbar_align() & (FL_ALIGN_LEFT|FL_ALIGN_RIGHT) && // mNBufferLines >= mNVisibleLines - 1) { mVScrollBar->set_visible(); if (scrollbar_align() & FL_ALIGN_LEFT) { text_area.x = X+scrollbar_width()+LEFT_MARGIN; text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; mVScrollBar->resize(X, text_area.y-TOP_MARGIN, scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN); } else { text_area.x = X+LEFT_MARGIN; text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; mVScrollBar->resize(X+W-scrollbar_width(), text_area.y-TOP_MARGIN, scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN); } } /* Decide if the horizontal scrollbar needs to be visible. If there is a vertical scrollbar, a horizontal is always created too. This is because the alternatives are unattractive: * Dynamically creating a horizontal scrollbar based on the currently visible lines is what the original nedit does, but it always wastes space for the scrollbar even when it's not used. Since the FLTK widget dynamically allocates the space for the scrollbar and rearranges the widget to make room for it, this would create a very visually displeasing "bounce" effect when the vertical scrollbar is dragged. Trust me, I tried it and it looks really bad. * The other alternative would be to keep track of what the longest line in the entire buffer is and base the scrollbar on that. I didn't do this because I didn't see any easy way to do that using the nedit code and this could involve a lengthy calculation for large buffers. If an efficient and non-costly way of doing this can be found, this might be a way to go. */ /* WAS: Suggestion: Try turning the horizontal scrollbar on when you first see a line that is too wide in the window, but then don't turn it off (ie mix both of your solutions). */ if (!mFastDisplay && !mContinuousWrap && scrollbar_align() & (FL_ALIGN_TOP|FL_ALIGN_BOTTOM) && (mVScrollBar->visible() || longest_vline() > text_area.w)) { if (!mHScrollBar->visible()) { mHScrollBar->set_visible(); again = 1; // loop again to see if we now need vert. & recalc sizes } if (scrollbar_align() & FL_ALIGN_TOP) { text_area.y = Y + scrollbar_width()+TOP_MARGIN; text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); } else { text_area.y = Y+TOP_MARGIN; text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y+H-scrollbar_width(), text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); } } } } // user request to change viewport if (mTopLineNumHint != mTopLineNum || mHorizOffsetHint != mHorizOffset) scroll_(mTopLineNumHint, mHorizOffsetHint); // everything will fit in the viewport if (mNBufferLines < mNVisibleLines || mBuffer == NULL || mBuffer->length() == 0) { scroll_(1, mHorizOffset); /* if empty lines become visible, there may be an opportunity to display more text by scrolling down */ } else { while ( mNVisibleLines>=2 && (mLineStarts[mNVisibleLines-2]==-1) && scroll_(mTopLineNum-1, mHorizOffset)) { } } // user request to display insert position if (display_insert_position_hint) display_insert(); // in case horizontal offset is now greater than longest line int maxhoffset = max(0, longest_vline()-text_area.w); if (mHorizOffset > maxhoffset) scroll_(mTopLineNumHint, maxhoffset); mTopLineNumHint = mTopLineNum; mHorizOffsetHint = mHorizOffset; display_insert_position_hint = 0; if ((!mFastDisplay && mContinuousWrap) || hscrollbarvisible != mHScrollBar->visible() || vscrollbarvisible != mVScrollBar->visible()) redraw(); update_v_scrollbar(); update_h_scrollbar(); } /** \brief Refresh a rectangle of the text display. \param left, top are in coordinates of the text drawing window. \param width, height size in pixels */ void Fl_Text_Display_mod::draw_text( int left, int top, int width, int height ) { int fontHeight, firstLine, lastLine, line; /* find the line number range of the display */ fontHeight = mMaxsize ? mMaxsize : textsize_; firstLine = ( top - text_area.y - fontHeight + 1 ) / fontHeight; lastLine = ( top + height - text_area.y ) / fontHeight + 1; fl_push_clip( left, top, width, height ); /* draw the lines */ for ( line = firstLine; line <= lastLine; line++ ) draw_vline( line, left, left + width, 0, INT_MAX ); /* draw the line numbers if exposed area includes them */ if (mLineNumWidth != 0 && left <= mLineNumLeft + mLineNumWidth) draw_line_numbers(false); fl_pop_clip(); } /** \brief Marks text from start to end as needing a redraw. This function will trigger a damage event and later a redraw of parts of the widget. \param startpos index of first character needing redraw \param endpos index after last character needing redraw */ void Fl_Text_Display_mod::redisplay_range(int startpos, int endpos) { IS_UTF8_ALIGNED2(buffer(), startpos) IS_UTF8_ALIGNED2(buffer(), endpos) if (damage_range1_start == -1 && damage_range1_end == -1) { damage_range1_start = startpos; damage_range1_end = endpos; } else if ((startpos >= damage_range1_start && startpos <= damage_range1_end) || (endpos >= damage_range1_start && endpos <= damage_range1_end)) { damage_range1_start = min(damage_range1_start, startpos); damage_range1_end = max(damage_range1_end, endpos); } else if (damage_range2_start == -1 && damage_range2_end == -1) { damage_range2_start = startpos; damage_range2_end = endpos; } else { damage_range2_start = min(damage_range2_start, startpos); damage_range2_end = max(damage_range2_end, endpos); } damage(FL_DAMAGE_SCROLL); } /** \brief Draw a range of text. Refresh all of the text between buffer positions \p startpos and \p endpos not including the character at the position \p endpos. If \p endpos points beyond the end of the buffer, refresh the whole display after \p startpos, including blank lines which are not technically part of any range of characters. \param startpos index of first character to draw \param endpos index after last character to draw */ void Fl_Text_Display_mod::draw_range(int startpos, int endpos) { startpos = buffer()->utf8_align(startpos); endpos = buffer()->utf8_align(endpos); int i, startLine, lastLine, startIndex, endIndex; /* If the range is outside of the displayed text, just return */ if ( endpos < mFirstChar || ( startpos > mLastChar && !empty_vlines() ) ) return; /* Clean up the starting and ending values */ if ( startpos < 0 ) startpos = 0; if ( startpos > mBuffer->length() ) startpos = mBuffer->length(); if ( endpos < 0 ) endpos = 0; if ( endpos > mBuffer->length() ) endpos = mBuffer->length(); /* Get the starting and ending lines */ if ( startpos < mFirstChar ) startpos = mFirstChar; if ( !position_to_line( startpos, &startLine ) ) startLine = mNVisibleLines - 1; if ( endpos >= mLastChar ) { lastLine = mNVisibleLines - 1; } else { if ( !position_to_line( endpos, &lastLine ) ) { /* shouldn't happen */ lastLine = mNVisibleLines - 1; } } /* Get the starting and ending positions within the lines */ startIndex = mLineStarts[ startLine ] == -1 ? 0 : startpos - mLineStarts[ startLine ]; if ( endpos >= mLastChar ) endIndex = INT_MAX; else if ( mLineStarts[ lastLine ] == -1 ) endIndex = 0; else endIndex = endpos - mLineStarts[ lastLine ]; /* If the starting and ending lines are the same, redisplay the single line between "start" and "end" */ if ( startLine == lastLine ) { draw_vline( startLine, 0, INT_MAX, startIndex, endIndex ); return; } /* Redisplay the first line from "start" */ draw_vline( startLine, 0, INT_MAX, startIndex, INT_MAX ); /* Redisplay the lines in between at their full width */ for ( i = startLine + 1; i < lastLine; i++ ) draw_vline( i, 0, INT_MAX, 0, INT_MAX ); /* Redisplay the last line to "end" */ draw_vline( lastLine, 0, INT_MAX, 0, endIndex ); } /** \brief Sets the position of the text insertion cursor for text display. Move the insertion cursor in front of the character at \p newPos. This function may trigger a redraw. \param newPos new caret position */ void Fl_Text_Display_mod::insert_position( int newPos ) { IS_UTF8_ALIGNED2(buffer(), newPos) /* make sure new position is ok, do nothing if it hasn't changed */ if ( newPos == mCursorPos ) return; if ( newPos < 0 ) newPos = 0; if ( newPos > mBuffer->length() ) newPos = mBuffer->length(); /* cursor movement cancels vertical cursor motion column */ mCursorPreferredXPos = -1; /* erase the cursor at its previous position */ redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); mCursorPos = newPos; /* draw cursor at its new position */ redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); } /** \brief Shows the text cursor. This function may trigger a redraw. \param b show(1) or hide(0) the text cursor (caret). */ void Fl_Text_Display_mod::show_cursor(int b) { mCursorOn = b; redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); } /** \brief Sets the text cursor style. Sets the text cursor style to one of the following: \li Fl_Text_Display_mod::NORMAL_CURSOR - Shows an I beam. \li Fl_Text_Display_mod::CARET_CURSOR - Shows a caret under the text. \li Fl_Text_Display_mod::DIM_CURSOR - Shows a dimmed I beam. \li Fl_Text_Display_mod::BLOCK_CURSOR - Shows an unfilled box around the current character. \li Fl_Text_Display_mod::HEAVY_CURSOR - Shows a thick I beam. This call also switches the cursor on and may trigger a redraw. \param style new cursor style */ void Fl_Text_Display_mod::cursor_style(int style) { mCursorStyle = style; if (mCursorOn) show_cursor(); } /** \brief Set the new text wrap mode. If \p wrap mode is not zero, this call enables automatic word wrapping at column \p wrapMargin. Word-wrapping does not change the text buffer itself, only the way the text is displayed. Different Text Displays can have different wrap modes, even if they share the same Text Buffer. \param wrap new wrap mode is WRAP_NONE (don't wrap text at all), WRAP_AT_COLUMN (wrap text at the given text column), WRAP_AT_PIXEL (wrap text at a pixel position), or WRAP_AT_BOUNDS (wrap text so that it fits into the widget width) \param wrapMargin in WRAP_AT_COLUMN mode, text will wrap at the n'th character. For variable width fonts, an average character width is calculated. The column width is calculated using the current textfont or the first style when this function is called. If the font size changes, this function must be called again. In WRAP_AT_PIXEL mode, this is the pixel position. \todo we need new wrap modes to wrap at the window edge and based on pixel width or average character width. */ void Fl_Text_Display_mod::wrap_mode(int wrap, int wrapMargin) { switch (wrap) { case WRAP_NONE: mWrapMarginPix = 0; mContinuousWrap = 0; break; case WRAP_AT_COLUMN: default: mWrapMarginPix = int(col_to_x(wrapMargin)); mContinuousWrap = 1; break; case WRAP_AT_PIXEL: mWrapMarginPix = wrapMargin; mContinuousWrap = 1; break; case WRAP_AT_BOUNDS: mWrapMarginPix = 0; mContinuousWrap = 1; break; } if (buffer()) { /* wrapping can change the total number of lines, re-count */ mNBufferLines = count_lines(0, buffer()->length(), true); /* changing wrap margins or changing from wrapped mode to non-wrapped can leave the character at the top no longer at a line start, and/or change the line number */ mFirstChar = line_start(mFirstChar); mTopLineNum = count_lines(0, mFirstChar, true) + 1; reset_absolute_top_line_number(); /* update the line starts array */ calc_line_starts(0, mNVisibleLines); calc_last_char(); } else { // No buffer, so just clear the state info for later... mNBufferLines = 0; mFirstChar = 0; mTopLineNum = 1; mAbsTopLineNum = 0; } resize(x(), y(), w(), h()); } /** \brief Inserts "text" at the current cursor location. This has the same effect as inserting the text into the buffer using BufInsert and then moving the insert position after the newly inserted text, except that it's optimized to do less redrawing. \param text new text in UTF-8 encoding. */ void Fl_Text_Display_mod::insert(const char* text) { IS_UTF8_ALIGNED2(buffer(), mCursorPos) IS_UTF8_ALIGNED(text) int pos = mCursorPos; mCursorToHint = pos + strlen( text ); mBuffer->insert( pos, text ); mCursorToHint = NO_HINT; } /** \brief Replaces text at the current insert position. \param text new text in UTF-8 encoding \todo Unicode? Find out exactly what we do here and simplify. */ void Fl_Text_Display_mod::overstrike(const char* text) { IS_UTF8_ALIGNED2(buffer(), mCursorPos) IS_UTF8_ALIGNED(text) int startPos = mCursorPos; Fl_Text_Buffer_mod *buf = mBuffer; int lineStart = buf->line_start( startPos ); int textLen = strlen( text ); int i, p, endPos, indent, startIndent, endIndent; const char *c; unsigned int ch; char *paddedText = NULL; /* determine how many displayed character positions are covered */ startIndent = mBuffer->count_displayed_characters( lineStart, startPos ); indent = startIndent; for ( c = text; *c != '\0'; c += fl_utf8len1(*c) ) indent++; endIndent = indent; /* find which characters to remove, and if necessary generate additional padding to make up for removed control characters at the end */ indent = startIndent; for ( p = startPos; ; p=buffer()->next_char(p) ) { if ( p == buf->length() ) break; ch = buf->char_at( p ); if ( ch == '\n' ) break; indent++; if ( indent == endIndent ) { p++; break; } else if ( indent > endIndent ) { if ( ch != '\t' ) { p++; paddedText = new char [ textLen + FL_TEXT_MAX_EXP_CHAR_LEN + 1 ]; strcpy( paddedText, text ); for ( i = 0; i < indent - endIndent; i++ ) paddedText[ textLen + i ] = ' '; paddedText[ textLen + i ] = '\0'; } break; } } endPos = p; mCursorToHint = startPos + textLen; buf->replace( startPos, endPos, paddedText == NULL ? text : paddedText ); mCursorToHint = NO_HINT; if ( paddedText != NULL ) delete [] paddedText; } /** \brief Convert a character index into a pixel position. Translate a buffer text position to the XY location where the top left of the cursor would be positioned to point to that character. Returns 0 if the position is not displayed because it is \e \b vertically out of view. If the position is horizontally out of view, returns the X coordinate where the position would be if it were visible. \param pos character index \param[out] X, Y pixel position of character on screen \return 0 if character vertically out of view, X position otherwise */ int Fl_Text_Display_mod::position_to_xy( int pos, int* X, int* Y ) const { IS_UTF8_ALIGNED2(buffer(), pos) int lineStartPos, fontHeight;//, lineLen; int visLineNum; /* If position is not displayed, return false */ if (pos < mFirstChar || (pos > mLastChar && !empty_vlines())) { return 0; } /* Calculate Y coordinate */ if (!position_to_line(pos, &visLineNum)) { return 0; } if (visLineNum < 0 || visLineNum > mNBufferLines) { return 0; } fontHeight = mMaxsize; *Y = text_area.y + visLineNum * fontHeight; /* Get the text, length, and buffer position of the line. If the position is beyond the end of the buffer and should be at the first position on the first empty line, don't try to get or scan the text */ lineStartPos = mLineStarts[visLineNum]; if ( lineStartPos == -1 ) { *X = text_area.x - mHorizOffset; return 1; } // lineLen = vline_length( visLineNum ); *X = text_area.x + handle_vline(GET_WIDTH, lineStartPos, pos-lineStartPos, 0, 0, 0, 0, 0, 0) - mHorizOffset; return 1; } /** \brief Find the line and column number of position \p pos. This only works for displayed lines. If the line is not displayed, the function returns 0 (without the mLineStarts array it could turn in to very long calculation involving scanning large amounts of text in the buffer). If continuous wrap mode is on, returns the absolute line number (as opposed to the wrapped line number which is used for scrolling). \param pos character index \param[out] lineNum absolute (unwrapped) line number \param[out] column character offset to the beginning of the line \return 0 if \p pos is off screen, line number otherwise \todo a column number makes little sense in the UTF-8/variable font width environment. We will have to further define what exactly we want to return. Please check the functions that call this particular function. */ int Fl_Text_Display_mod::position_to_linecol( int pos, int* lineNum, int* column ) const { IS_UTF8_ALIGNED2(buffer(), pos) int retVal; /* In continuous wrap mode, the absolute (non-wrapped) line count is maintained separately, as needed. Only return it if we're actually keeping track of it and pos is in the displayed text */ if (!mFastDisplay && mContinuousWrap) { if (!maintaining_absolute_top_line_number() || pos < mFirstChar || pos > mLastChar) return 0; *lineNum = mAbsTopLineNum + buffer()->count_lines(mFirstChar, pos); *column = buffer()->count_displayed_characters(buffer()->line_start(pos), pos); return 1; } retVal = position_to_line( pos, lineNum ); if ( retVal ) { *column = mBuffer->count_displayed_characters( mLineStarts[ *lineNum ], pos ); *lineNum += mTopLineNum; } return retVal; } /** \brief Check if a pixel position is within the primary selection. \param X, Y pixel position to test \return 1 if position (X, Y) is inside of the primary Fl_Text_Selection */ int Fl_Text_Display_mod::in_selection( int X, int Y ) const { int pos = xy_to_position( X, Y, CHARACTER_POS ); IS_UTF8_ALIGNED2(buffer(), pos) Fl_Text_Buffer_mod *buf = mBuffer; return buf->primary_selection()->includes(pos); } /** \brief Nobody knows what this function does. Correct a column number based on an unconstrained position (as returned by TextDXYToUnconstrainedPosition) to be relative to the last actual newline in the buffer before the row and column position given, rather than the last line start created by line wrapping. This is an adapter for rectangular selections and code written before continuous wrap mode, which thinks that the unconstrained column is the number of characters from the last newline. Obviously this is time consuming, because it invloves character re-counting. \param row \param column \return something unknown \todo What does this do and how is it useful? Column numbers mean little in this context. Which functions depend on this one? \todo Unicode? */ int Fl_Text_Display_mod::wrapped_column(int row, int column) const { int lineStart, dispLineStart; if (mFastDisplay || !mContinuousWrap || row < 0 || row > mNVisibleLines) return column; dispLineStart = mLineStarts[row]; if (dispLineStart == -1) return column; lineStart = buffer()->line_start(dispLineStart); return column + buffer()->count_displayed_characters(lineStart, dispLineStart); } /** \brief Nobody knows what this function does. Correct a row number from an unconstrained position (as returned by TextDXYToUnconstrainedPosition) to a straight number of newlines from the top line of the display. Because rectangular selections are based on newlines, rather than display wrapping, and anywhere a rectangular selection needs a row, it needs it in terms of un-wrapped lines. \param row \return something unknown \todo What does this do and how is it useful? Column numbers mean little in this context. Which functions depend on this one? */ int Fl_Text_Display_mod::wrapped_row(int row) const { if (mFastDisplay || !mContinuousWrap || row < 0 || row > mNVisibleLines) return row; return buffer()->count_lines(mFirstChar, mLineStarts[row]); } /** \brief Scroll the display to bring insertion cursor into view. Note: it would be nice to be able to do this without counting lines twice (scroll_() counts them too) and/or to count from the most efficient starting point, but the efficiency of this routine is not as important to the overall performance of the text display. \todo Unicode? */ void Fl_Text_Display_mod::display_insert() { int hOffset, topLine, X, Y; hOffset = mHorizOffset; topLine = mTopLineNum; if (insert_position() < mFirstChar) { topLine -= count_lines(insert_position(), mFirstChar, false); } else if (mNVisibleLines>=2 && mLineStarts[mNVisibleLines-2] != -1) { int lastChar = line_end(mLineStarts[mNVisibleLines-2],true); if (insert_position() >= lastChar) topLine += count_lines(lastChar - (wrap_uses_character(mLastChar) ? 0 : 1), insert_position(), false); } /* Find the new setting for horizontal offset (this is a bit ungraceful). If the line is visible, just use PositionToXY to get the position to scroll to, otherwise, do the vertical scrolling first, then the horizontal */ if (!position_to_xy( mCursorPos, &X, &Y )) { scroll_(topLine, hOffset); if (!position_to_xy( mCursorPos, &X, &Y )) { #ifdef DEBUG printf ("*** display_insert/position_to_xy # GIVE UP !\n"); fflush(stdout); #endif // DEBUG return; /* Give up, it's not worth it (but why does it fail?) */ } } if (X > text_area.x + text_area.w) hOffset += X-(text_area.x + text_area.w); else if (X < text_area.x) hOffset += X-text_area.x; /* Do the scroll */ if (topLine != mTopLineNum || hOffset != mHorizOffset) scroll_(topLine, hOffset); } /** \brief Scrolls the text buffer to show the current insert position. This function triggers a complete recalculation, ending in a call to Fl_Text_Display_mod::display_insert() */ void Fl_Text_Display_mod::show_insert_position() { display_insert_position_hint = 1; resize(x(), y(), w(), h()); } /* Cursor movement functions */ /** \brief Moves the current insert position right one character. \return 1 if the cursor moved, 0 if the end of the text was reached */ int Fl_Text_Display_mod::move_right() { if ( mCursorPos >= mBuffer->length() ) return 0; int p = insert_position(); int q = buffer()->next_char(p); insert_position(q); return 1; } /** \brief Moves the current insert position left one character. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_left() { if ( mCursorPos <= 0 ) return 0; int p = insert_position(); int q = buffer()->prev_char_clipped(p); insert_position(q); return 1; } /** \brief Moves the current insert position up one line. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_up() { int lineStartPos, xPos, prevLineStartPos, newPos, visLineNum; /* Find the position of the start of the line. Use the line starts array if possible */ if ( position_to_line( mCursorPos, &visLineNum ) ) lineStartPos = mLineStarts[ visLineNum ]; else { lineStartPos = line_start( mCursorPos ); visLineNum = -1; } if ( lineStartPos == 0 ) return 0; /* Decide what column to move to, if there's a preferred column use that */ if (mCursorPreferredXPos >= 0) xPos = mCursorPreferredXPos; else xPos = handle_vline(GET_WIDTH, lineStartPos, mCursorPos-lineStartPos, 0, 0, 0, 0, 0, INT_MAX); /* count forward from the start of the previous line to reach the column */ if ( visLineNum != -1 && visLineNum != 0 ) prevLineStartPos = mLineStarts[ visLineNum - 1 ]; else prevLineStartPos = rewind_lines( lineStartPos, 1 ); int lineEnd = line_end(prevLineStartPos, true); newPos = handle_vline(FIND_INDEX_FROM_ZERO, prevLineStartPos, lineEnd-prevLineStartPos, 0, 0, 0, 0, 0, xPos); /* move the cursor */ insert_position( newPos ); /* if a preferred column wasn't aleady established, establish it */ mCursorPreferredXPos = xPos; return 1; } /** \brief Moves the current insert position down one line. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_down() { int lineStartPos, xPos, newPos, visLineNum; if ( mCursorPos == mBuffer->length() ) return 0; if ( position_to_line( mCursorPos, &visLineNum ) ) lineStartPos = mLineStarts[ visLineNum ]; else { lineStartPos = line_start( mCursorPos ); visLineNum = -1; } if (mCursorPreferredXPos >= 0) { xPos = mCursorPreferredXPos; } else { xPos = handle_vline(GET_WIDTH, lineStartPos, mCursorPos-lineStartPos, 0, 0, 0, 0, 0, INT_MAX); } int nextLineStartPos = skip_lines( lineStartPos, 1, true ); int lineEnd = line_end(nextLineStartPos, true); newPos = handle_vline(FIND_INDEX_FROM_ZERO, nextLineStartPos, lineEnd-nextLineStartPos, 0, 0, 0, 0, 0, xPos); insert_position( newPos ); mCursorPreferredXPos = xPos; return 1; } /** \brief Count the number of lines between two positions. Same as BufCountLines, but takes into account wrapping if wrapping is turned on. If the caller knows that \p startPos is at a line start, it can pass \p startPosIsLineStart as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. \param startPos index to first character \param endPos index after last character \param startPosIsLineStart avoid scanning back to the line start \return number of lines */ int Fl_Text_Display_mod::count_lines(int startPos, int endPos, bool startPosIsLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) IS_UTF8_ALIGNED2(buffer(), endPos) int retLines, retPos, retLineStart, retLineEnd; #ifdef DEBUG printf("Fl_Text_Display_mod::count_lines(startPos=%d, endPos=%d, startPosIsLineStart=%d\n", startPos, endPos, startPosIsLineStart); #endif // DEBUG /* If we're not wrapping use simple (and more efficient) BufCountLines */ if (mFastDisplay || !mContinuousWrap) return buffer()->count_lines(startPos, endPos); wrapped_line_counter(buffer(), startPos, endPos, INT_MAX, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); #ifdef DEBUG printf(" # after WLC: retPos=%d, retLines=%d, retLineStart=%d, retLineEnd=%d\n", retPos, retLines, retLineStart, retLineEnd); #endif // DEBUG return retLines; } /** \brief Skip a number of lines forward. Same as BufCountForwardNLines, but takes into account line breaks when wrapping is turned on. If the caller knows that startPos is at a line start, it can pass "startPosIsLineStart" as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. \param startPos index to starting character \param nLines number of lines to skip ahead \param startPosIsLineStart avoid scanning back to the line start \return new position as index */ int Fl_Text_Display_mod::skip_lines(int startPos, int nLines, bool startPosIsLineStart) { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retPos, retLineStart, retLineEnd; /* if we're not wrapping use more efficient BufCountForwardNLines */ if (mFastDisplay || !mContinuousWrap) return buffer()->skip_lines(startPos, nLines); /* wrappedLineCounter can't handle the 0 lines case */ if (nLines == 0) return startPos; /* use the common line counting routine to count forward */ wrapped_line_counter(buffer(), startPos, buffer()->length(), nLines, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retPos) return retPos; } /** \brief Returns the end of a line. Same as BufEndOfLine, but takes into account line breaks when wrapping is turned on. If the caller knows that \p startPos is at a line start, it can pass "startPosIsLineStart" as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. Note that the definition of the end of a line is less clear when continuous wrap is on. With continuous wrap off, it's just a pointer to the newline that ends the line. When it's on, it's the character beyond the last \b displayable character on the line, where a whitespace character which has been "converted" to a newline for wrapping is not considered displayable. Also note that a line can be wrapped at a non-whitespace character if the line had no whitespace. In this case, this routine returns a pointer to the start of the next line. This is also consistent with the model used by visLineLength. \param startPos index to starting character \param startPosIsLineStart avoid scanning back to the line start \return new position as index */ int Fl_Text_Display_mod::line_end(int startPos, bool startPosIsLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping use more efficient BufEndOfLine */ if (mFastDisplay || !mContinuousWrap) return buffer()->line_end(startPos); if (startPos == buffer()->length()) return startPos; wrapped_line_counter(buffer(), startPos, buffer()->length(), 1, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retLineEnd) return retLineEnd; } /** \brief Return the beginning of a line. Same as BufStartOfLine, but returns the character after last wrap point rather than the last newline. \param pos index to starting character \return new position as index */ int Fl_Text_Display_mod::line_start(int pos) const { IS_UTF8_ALIGNED2(buffer(), pos) int retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping, use the more efficient BufStartOfLine */ if (mFastDisplay || !mContinuousWrap) return buffer()->line_start(pos); wrapped_line_counter(buffer(), buffer()->line_start(pos), pos, INT_MAX, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retLineStart) return retLineStart; } /** \brief Skip a number of lines back. Same as BufCountBackwardNLines, but takes into account line breaks when wrapping is turned on. \param startPos index to starting character \param nLines number of lines to skip back \return new position as index */ int Fl_Text_Display_mod::rewind_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(buffer(), startPos) Fl_Text_Buffer_mod *buf = buffer(); int pos, lineStart, retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping, use the more efficient BufCountBackwardNLines */ if (mFastDisplay || !mContinuousWrap) return buf->rewind_lines(startPos, nLines); pos = startPos; for (;;) { lineStart = buf->line_start(pos); wrapped_line_counter(buf, lineStart, pos, INT_MAX, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd, false); if (retLines > nLines) return skip_lines(lineStart, retLines-nLines, true); nLines -= retLines; pos = lineStart - 1; if (pos < 0) return 0; nLines -= 1; } } static inline int fl_isseparator(unsigned int c) { // FIXME: this does not take UCS-4 encoding into account return c != '$' && c != '_' && (isspace(c) || ispunct(c)); } /** \brief Moves the current insert position right one word. */ void Fl_Text_Display_mod::next_word() { int pos = insert_position(); while (pos < buffer()->length() && !fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } while (pos < buffer()->length() && fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } insert_position( pos ); } /** \brief Moves the current insert position left one word. */ void Fl_Text_Display_mod::previous_word() { int pos = insert_position(); if (pos==0) return; pos = buffer()->prev_char(pos); while (pos && fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->prev_char(pos); } while (pos && !fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->prev_char(pos); } if (fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } insert_position( pos ); } /** \brief This is called before any characters are deleted. Callback attached to the text buffer to receive delete information before the modifications are actually made. \param pos starting index of deletion \param nDeleted number of bytes we will delete (must be UTF-8 aligned!) \param cbArg "this" pointer for static callback function */ void Fl_Text_Display_mod::buffer_predelete_cb(int pos, int nDeleted, void *cbArg) { Fl_Text_Display_mod *textD = (Fl_Text_Display_mod *)cbArg; if (textD->mContinuousWrap && !textD->mFastDisplay) { /* Note: we must perform this measurement, even if there is not a single character deleted; the number of "deleted" lines is the number of visual lines spanned by the real line in which the modification takes place. Also, a modification of the tab distance requires the same kind of calculations in advance, even if the font width is "fixed", because when the width of the tab characters changes, the layout of the text may be completely different. */ IS_UTF8_ALIGNED2(textD->buffer(), pos) textD->measure_deleted_lines(pos, nDeleted); } else { textD->mSuppressResync = 0; /* Probably not needed, but just in case */ } } /** \brief This is called whenever the buffer is modified. Callback attached to the text buffer to receive modification information \param pos starting index of modification \param nInserted number of bytes we inserted (must be UTF-8 aligned!) \param nDeleted number of bytes deleted (must be UTF-8 aligned!) \param nRestyled ?? \param deletedText this is what was removed, must not be NULL if nDeleted is set \param cbArg "this" pointer for static callback function */ void Fl_Text_Display_mod::buffer_modified_cb( int pos, int nInserted, int nDeleted, int nRestyled, const char *deletedText, void *cbArg ) { int linesInserted, linesDeleted, startDispPos, endDispPos; Fl_Text_Display_mod *textD = ( Fl_Text_Display_mod * ) cbArg; Fl_Text_Buffer_mod *buf = textD->mBuffer; int oldFirstChar = textD->mFirstChar; int scrolled, origCursorPos = textD->mCursorPos; int wrapModStart = 0, wrapModEnd = 0; IS_UTF8_ALIGNED2(buf, pos) IS_UTF8_ALIGNED2(buf, oldFirstChar) /* buffer modification cancels vertical cursor motion column */ if ( nInserted != 0 || nDeleted != 0 ) textD->mCursorPreferredXPos = -1; /* Count the number of lines inserted and deleted, and in the case of continuous wrap mode, how much has changed */ if (textD->mContinuousWrap && !textD->mFastDisplay) { textD->find_wrap_range(deletedText, pos, nInserted, nDeleted, &wrapModStart, &wrapModEnd, &linesInserted, &linesDeleted); } else { linesInserted = nInserted == 0 ? 0 : buf->count_lines( pos, pos + nInserted ); linesDeleted = nDeleted == 0 ? 0 : countlines( deletedText ); } /* Update the line starts and mTopLineNum */ if ( nInserted != 0 || nDeleted != 0 ) { if (textD->mContinuousWrap && !textD->mFastDisplay) { textD->update_line_starts( wrapModStart, wrapModEnd-wrapModStart, nDeleted + pos-wrapModStart + (wrapModEnd-(pos+nInserted)), linesInserted, linesDeleted, &scrolled ); } else { textD->update_line_starts( pos, nInserted, nDeleted, linesInserted, linesDeleted, &scrolled ); } } else scrolled = 0; /* If we're counting non-wrapped lines as well, maintain the absolute (non-wrapped) line number of the text displayed */ if (textD->maintaining_absolute_top_line_number() && (nInserted != 0 || nDeleted != 0)) { if (deletedText && (pos + nDeleted < oldFirstChar)) textD->mAbsTopLineNum += buf->count_lines(pos, pos + nInserted) - countlines(deletedText); else if (pos < oldFirstChar) textD->reset_absolute_top_line_number(); } /* Update the line count for the whole buffer */ textD->mNBufferLines += linesInserted - linesDeleted; /* Update the cursor position */ if ( textD->mCursorToHint != NO_HINT ) { textD->mCursorPos = textD->mCursorToHint; textD->mCursorToHint = NO_HINT; } else if ( textD->mCursorPos > pos ) { if ( textD->mCursorPos < pos + nDeleted ) textD->mCursorPos = pos; else textD->mCursorPos += nInserted - nDeleted; } // refigure scrollbars & stuff textD->resize(textD->x(), textD->y(), textD->w(), textD->h()); // don't need to do anything else if not visible? if (!textD->visible_r()) return; /* If the changes caused scrolling, re-paint everything and we're done. */ if ( scrolled ) { textD->damage(FL_DAMAGE_EXPOSE); if ( textD->mStyleBuffer ) /* See comments in extendRangeForStyleMods */ textD->mStyleBuffer->primary_selection()->selected(0); return; } /* If the changes didn't cause scrolling, decide the range of characters that need to be re-painted. Also if the cursor position moved, be sure that the redisplay range covers the old cursor position so the old cursor gets erased, and erase the bits of the cursor which extend beyond the left and right edges of the text. */ startDispPos = (textD->mContinuousWrap && !textD->mFastDisplay) ? wrapModStart : pos; IS_UTF8_ALIGNED2(buf, startDispPos) if ( origCursorPos == startDispPos && textD->mCursorPos != startDispPos ) startDispPos = min( startDispPos, buf->prev_char_clipped(origCursorPos) ); IS_UTF8_ALIGNED2(buf, startDispPos) if ( linesInserted == linesDeleted ) { if ( nInserted == 0 && nDeleted == 0 ) endDispPos = pos + nRestyled; else { endDispPos = textD->mContinuousWrap ? wrapModEnd : buf->line_end( pos + nInserted ) + 1; if (textD->mContinuousWrap && !textD->mFastDisplay) endDispPos = wrapModEnd; else endDispPos = buf->next_char(buf->line_end( pos + nInserted )); // CET - FIXME if ( origCursorPos >= startDispPos && // ( origCursorPos <= endDispPos || endDispPos == buf->length() ) ) } if (linesInserted > 1) textD->draw_line_numbers(false); } else { endDispPos = buf->next_char(textD->mLastChar); // CET - FIXME if ( origCursorPos >= pos ) /* If more than one line is inserted/deleted, a line break may have been inserted or removed in between, and the line numbers may have changed. If only one line is altered, line numbers cannot be affected (the insertion or removal of a line break always results in at least two lines being redrawn). */ textD->draw_line_numbers(false); } IS_UTF8_ALIGNED2(buf, startDispPos) IS_UTF8_ALIGNED2(buf, endDispPos) /* If there is a style buffer, check if the modification caused additional changes that need to be redisplayed. (Redisplaying separately would cause double-redraw on almost every modification involving styled text). Extend the redraw range to incorporate style changes */ if ( textD->mStyleBuffer ) textD->extend_range_for_styles( &startDispPos, &endDispPos ); IS_UTF8_ALIGNED2(buf, startDispPos) IS_UTF8_ALIGNED2(buf, endDispPos) /* Redisplay computed range */ textD->redisplay_range( startDispPos, endDispPos ); } /** \brief Line numbering stuff, currently unused. In continuous wrap mode, internal line numbers are calculated after wrapping. A separate non-wrapped line count is maintained when line numbering is turned on. There is some performance cost to maintaining this line count, so normally absolute line numbers are not tracked if line numbering is off. This routine allows callers to specify that they still want this line count maintained (for use via TextDPosToLineAndCol). More specifically, this allows the line number reported in the statistics line to be calibrated in absolute lines, rather than post-wrapped lines. */ void Fl_Text_Display_mod::maintain_absolute_top_line_number(int state) { mNeedAbsTopLineNum = state; reset_absolute_top_line_number(); } /** \brief Line numbering stuff, currently unused. Returns the absolute (non-wrapped) line number of the first line displayed. Returns 0 if the absolute top line number is not being maintained. */ int Fl_Text_Display_mod::get_absolute_top_line_number() const { if (mFastDisplay || !mContinuousWrap) return mTopLineNum; if (maintaining_absolute_top_line_number()) return mAbsTopLineNum; return 0; } /** \brief Line numbering stuff, currently unused. Re-calculate absolute top line number for a change in scroll position. */ void Fl_Text_Display_mod::absolute_top_line_number(int oldFirstChar) { if (maintaining_absolute_top_line_number()) { if (mFirstChar < oldFirstChar) mAbsTopLineNum -= buffer()->count_lines(mFirstChar, oldFirstChar); else mAbsTopLineNum += buffer()->count_lines(oldFirstChar, mFirstChar); } } /** \brief Line numbering stuff, currently unused. Return true if a separate absolute top line number is being maintained (for displaying line numbers or showing in the statistics line). */ int Fl_Text_Display_mod::maintaining_absolute_top_line_number() const { return (!mFastDisplay && mContinuousWrap && (mLineNumWidth != 0 || mNeedAbsTopLineNum)); } /** \brief Line numbering stuff, probably unused. Count lines from the beginning of the buffer to reestablish the absolute (non-wrapped) top line number. If mode is not continuous wrap, or the number is not being maintained, does nothing. */ void Fl_Text_Display_mod::reset_absolute_top_line_number() { mAbsTopLineNum = 1; absolute_top_line_number(0); } /** \brief Convert a position index into a line number offset. Find the line number of position \p pos relative to the first line of displayed text. Returns 0 if the line is not displayed. \param pos ?? \param[out] lineNum ?? \return ?? \todo What does this do? */ int Fl_Text_Display_mod::position_to_line( int pos, int *lineNum ) const { IS_UTF8_ALIGNED2(buffer(), pos) int i; *lineNum = 0; if ( pos < mFirstChar ) return 0; if ( pos > mLastChar ) { if ( empty_vlines() ) { if ( mLastChar < mBuffer->length() ) { if ( !position_to_line( mLastChar, lineNum ) ) { Fl::error("Please change the text panel font / font-size.\nUse a fixed width font such as Consolas on Windows."); return 0; } return ++( *lineNum ) <= mNVisibleLines - 1; } else { position_to_line( buffer()->prev_char_clipped(mLastChar), lineNum ); return 1; } } return 0; } for ( i = mNVisibleLines - 1; i >= 0; i-- ) { if ( mLineStarts[ i ] != -1 && pos >= mLineStarts[ i ] ) { *lineNum = i; return 1; } } return 0; /* probably never be reached */ } /** Universal pixel machine. We use a single function that handles all line layout, measuring, and drawing \li draw a text range \li return the width of a text range in pixels \li return the index of a character that is at a pixel position \param[in] mode DRAW_LINE, GET_WIDTH, FIND_INDEX \param[in] lineStartPos index of first character \param[in] lineLen size of string in bytes \param[in] leftChar, rightChar \param[in] Y drawing position \param[in] bottomClip, leftClip, rightClip stop work when we reach the clipped area. rightClip is the X position that we search in FIND_INDEX. \retval DRAW_LINE index of last drawn character \retval GET_WIDTH width in pixels of text segment if we would draw it \retval FIND_INDEX index of character at given x position in window coordinates \retval FIND_INDEX_FROM_ZERO index of character at given x position without scrolling and widget offsets \todo we need to handle hidden hyphens and tabs here! \todo we handle all styles and selections \todo we must provide code to get pixel positions of the middle of a character as well */ int Fl_Text_Display_mod::handle_vline( int mode, int lineStartPos, int lineLen, int leftChar, int rightChar, int Y, int bottomClip, int leftClip, int rightClip) const { IS_UTF8_ALIGNED2(buffer(), lineStartPos) // FIXME: we need to allow two modes for FIND_INDEX: one on the edge of the // FIXME: character for selection, and one on the character center for cursors. int i, X, startX, startIndex, style, charStyle; char *lineStr; if ( lineStartPos == -1 ) { lineStr = NULL; } else { lineStr = mBuffer->text_range( lineStartPos, lineStartPos + lineLen ); } if (mode==GET_WIDTH) { X = 0; } else if (mode==FIND_INDEX_FROM_ZERO) { X = 0; mode = FIND_INDEX; } else { X = text_area.x - mHorizOffset; } startX = X; startIndex = 0; if (!lineStr) { // just clear the background if (mode==DRAW_LINE) { style = position_style(lineStartPos, lineLen, -1); draw_string( style|BG_ONLY_MASK, text_area.x, Y, text_area.x+text_area.w, lineStr, lineLen ); } if (mode==FIND_INDEX) { IS_UTF8_ALIGNED2(buffer(), lineStartPos) return lineStartPos; } return 0; } char currChar = 0, prevChar = 0; // draw the line style = position_style(lineStartPos, lineLen, 0); for (i=0; itab_distance()); int xAbs = (mode==GET_WIDTH) ? startX : startX+mHorizOffset-text_area.x; w = (((xAbs/tab)+1)*tab) - xAbs; if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 ); if (mode==FIND_INDEX && startX+w>rightClip) { // find x pos inside block free(lineStr); return lineStartPos + startIndex; } } else { // draw a text segment w = int( string_width( lineStr+startIndex, i-startIndex, style ) ); if (mode==DRAW_LINE) draw_string( style, startX, Y, startX+w, lineStr+startIndex, i-startIndex ); if (mode==FIND_INDEX && startX+w>rightClip) { // find x pos inside block int di = find_x(lineStr+startIndex, i-startIndex, style, rightClip-startX); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di)) return lineStartPos + startIndex + di; } } style = charStyle; startX += w; startIndex = i; } i += len; prevChar = currChar; } int w = 0; if (currChar=='\t') { // draw a single Tab space int tab = (int)col_to_x(mBuffer->tab_distance()); int xAbs = (mode==GET_WIDTH) ? startX : startX+mHorizOffset-text_area.x; w = (((xAbs/tab)+1)*tab) - xAbs; if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 ); if (mode==FIND_INDEX) { // find x pos inside block free(lineStr); return lineStartPos + startIndex + ( rightClip-startX>w ? 1 : 0 ); } } else { w = int( string_width( lineStr+startIndex, i-startIndex, style ) ); if (mode==DRAW_LINE) draw_string( style, startX, Y, startX+w, lineStr+startIndex, i-startIndex ); if (mode==FIND_INDEX) { // find x pos inside block int di = find_x(lineStr+startIndex, i-startIndex, style, rightClip-startX); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di)) return lineStartPos + startIndex + di; } } if (mode==GET_WIDTH) { free(lineStr); return startX+w; } // clear the rest of the line startX += w; style = position_style(lineStartPos, lineLen, i); if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, text_area.x+text_area.w, lineStr, lineLen ); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+lineLen)) return lineStartPos + lineLen; } /** \brief Find the index of the character that lies at the given x position. \param s UTF-8 text string \param len length of string \param style index into style lookup table \param x position in pixels \return index into buffer */ int Fl_Text_Display_mod::find_x(const char *s, int len, int style, int x) const { IS_UTF8_ALIGNED(s) // TODO: use binary search which may be quicker. int i = 0; while (ix) return i; i += cl; } return len; } /** \brief Draw a single line of text. Draw the text on a single line represented by \p visLineNum (the number of lines down from the top of the display), limited by \p leftClip and \p rightClip window coordinates and \p leftCharIndex and \p rightCharIndex character positions (not including the character at position \p rightCharIndex). \param visLineNum index of line in the visible line number lookup \param leftClip, rightClip pixel position of clipped area \param leftCharIndex, rightCharIndex index into line of segment that we want to draw */ void Fl_Text_Display_mod::draw_vline(int visLineNum, int leftClip, int rightClip, int leftCharIndex, int rightCharIndex) { int Y, lineStartPos, lineLen, fontHeight; // printf("draw_vline(visLineNum=%d, leftClip=%d, rightClip=%d, leftCharIndex=%d, rightCharIndex=%d)\n", // visLineNum, leftClip, rightClip, leftCharIndex, rightCharIndex); // printf("nNVisibleLines=%d\n", mNVisibleLines); /* If line is not displayed, skip it */ if ( visLineNum < 0 || visLineNum >= mNVisibleLines ) return; /* Calculate Y coordinate of the string to draw */ fontHeight = mMaxsize; Y = text_area.y + visLineNum * fontHeight; /* Get the text, length, and buffer position of the line to display */ lineStartPos = mLineStarts[ visLineNum ]; if ( lineStartPos == -1 ) { lineLen = 0; } else { lineLen = vline_length( visLineNum ); } /* Shrink the clipping range to the active display area */ leftClip = max( text_area.x, leftClip ); rightClip = min( rightClip, text_area.x + text_area.w ); handle_vline(DRAW_LINE, lineStartPos, lineLen, leftCharIndex, rightCharIndex, Y, Y+fontHeight, leftClip, rightClip); return; } /** \brief Draw a text segment in a single style. Draw a string or blank area according to parameter \p style, using the appropriate colors and drawing method for that style, with top left corner at \p X, \p Y. If style says to draw text, use \p string as source of characters, and draw \p nChars, if style is FILL, erase rectangle where text would have drawn from \p X to \p toX and from \p Y to the maximum y extent of the current font(s). \param style index into style lookup table \param X, Y drawing origin \param toX rightmost position if this is a fill operation \param string text if this is a drawing operation \param nChars number of characters to draw */ void Fl_Text_Display_mod::draw_string(int style, int X, int Y, int toX, const char *string, int nChars) const { IS_UTF8_ALIGNED(string) const Style_Table_Entry * styleRec; /* Draw blank area rather than text, if that was the request */ if ( style & FILL_MASK ) { if (style & TEXT_ONLY_MASK) return; clear_rect( style, X, Y, toX - X, mMaxsize ); return; } /* Set font, color, and gc depending on style. For normal text, GCs for normal drawing, or drawing within a Fl_Text_Selection or highlight are pre-allocated and pre-configured. For syntax highlighting, GCs are configured here, on the fly. */ Fl_Font font = textfont(); int fsize = textsize(); Fl_Color foreground = textcolor(); Fl_Color background = color(); if ( style & STYLE_LOOKUP_MASK ) { int si = (style & STYLE_LOOKUP_MASK) - 'A'; if (si < 0) si = 0; else if (si >= mNStyles) si = mNStyles - 1; styleRec = mStyleTable + si; font = styleRec->font; fsize = styleRec->size; foreground = styleRec->color; background = color(); if (style & PRIMARY_MASK) { if (Fl::focus() == (Fl_Widget*)this) { background = foreground; foreground = color(); } } else if (style & HIGHLIGHT_MASK) { if (Fl::focus() == (Fl_Widget*)this) { background = fl_color_average(color(), selection_color(), 0.5f); } } } else if (style & PRIMARY_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = selection_color(); else background = fl_color_average(color(), selection_color(), 0.4f); } else if (style & HIGHLIGHT_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = fl_color_average(color(), selection_color(), 0.5f); else background = fl_color_average(color(), selection_color(), 0.6f); } else { foreground = textcolor(); background = color(); } if (!(style & TEXT_ONLY_MASK)) { fl_color( background ); fl_rectf( X, Y, toX - X, mMaxsize ); } if (!(style & BG_ONLY_MASK)) { fl_color( foreground ); fl_font( font, fsize ); #if !(defined(__APPLE__) || defined(WIN32)) && USE_XFT // makes sure antialiased ÄÖÜ do not leak on line above fl_push_clip(X, Y, toX - X, mMaxsize); #endif fl_draw( string, nChars, X, Y + mMaxsize - fl_descent()); #if !(defined(__APPLE__) || defined(WIN32)) && USE_XFT fl_pop_clip(); #endif } // CET - FIXME /* If any space around the character remains unfilled (due to use of different sized fonts for highlighting), fill in above or below to erase previously drawn characters */ /* if (fs->ascent < mAscent) clear_rect( style, X, Y, toX - X, mAscent - fs->ascent); if (fs->descent < mDescent) clear_rect( style, X, Y + mAscent + fs->descent, toX - x, mDescent - fs->descent); */ /* Underline if style is secondary Fl_Text_Selection */ /* if (style & SECONDARY_MASK) XDrawLine(XtDisplay(mW), XtWindow(mW), gc, x, y + mAscent, toX - 1, Y + fs->ascent); */ } /** \brief Clear a rectangle with the appropriate background color for \p style. \param style index into style table \param X, Y, width, height size and position of background area */ void Fl_Text_Display_mod::clear_rect(int style, int X, int Y, int width, int height) const { /* A width of zero means "clear to end of window" to XClearArea */ if ( width == 0 ) return; if (style & PRIMARY_MASK) { if (Fl::focus()==(Fl_Widget*)this) { fl_color(selection_color()); } else { fl_color(fl_color_average(color(), selection_color(), 0.4f)); } } else if (style & HIGHLIGHT_MASK) { if (Fl::focus()==(Fl_Widget*)this) { fl_color(fl_color_average(color(), selection_color(), 0.5f)); } else { fl_color(fl_color_average(color(), selection_color(), 0.6f)); } } else { fl_color( color() ); } fl_rectf( X, Y, width, height ); } /** \brief Draw a cursor with top center at \p X, \p Y. \param X, Y cursor position in pixels */ void Fl_Text_Display_mod::draw_cursor( int X, int Y ) { typedef struct { int x1, y1, x2, y2; } Segment; Segment segs[ 5 ]; int left, right, cursorWidth, midY; // int fontWidth = mFontStruct->min_bounds.width, nSegs = 0; int fontWidth = TMPFONTWIDTH; // CET - FIXME int nSegs = 0; int fontHeight = mMaxsize; int bot = Y + fontHeight - 1; if ( X < text_area.x - 1 || X > text_area.x + text_area.w ) return; /* For cursors other than the block, make them around 2/3 of a character width, rounded to an even number of pixels so that X will draw an odd number centered on the stem at x. */ cursorWidth = 4; //(fontWidth/3) * 2; left = X - cursorWidth / 2; right = left + cursorWidth; /* Create segments and draw cursor */ if ( mCursorStyle == CARET_CURSOR ) { midY = bot - fontHeight / 5; segs[ 0 ].x1 = left; segs[ 0 ].y1 = bot; segs[ 0 ].x2 = X; segs[ 0 ].y2 = midY; segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = midY - 1; segs[ 3 ].x1 = X; segs[ 3 ].y1 = midY - 1; segs[ 3 ].x2 = right; segs[ 3 ].y2 = bot; nSegs = 4; } else if ( mCursorStyle == NORMAL_CURSOR ) { segs[ 0 ].x1 = left; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = right; segs[ 2 ].y2 = bot; nSegs = 3; } else if ( mCursorStyle == HEAVY_CURSOR ) { segs[ 0 ].x1 = X - 1; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X - 1; segs[ 0 ].y2 = bot; segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = X + 1; segs[ 2 ].y1 = Y; segs[ 2 ].x2 = X + 1; segs[ 2 ].y2 = bot; segs[ 3 ].x1 = left; segs[ 3 ].y1 = Y; segs[ 3 ].x2 = right; segs[ 3 ].y2 = Y; segs[ 4 ].x1 = left; segs[ 4 ].y1 = bot; segs[ 4 ].x2 = right; segs[ 4 ].y2 = bot; nSegs = 5; } else if ( mCursorStyle == DIM_CURSOR ) { midY = Y + fontHeight / 2; segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = X; segs[ 1 ].y2 = midY; segs[ 2 ].x1 = X; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; nSegs = 3; } else if ( mCursorStyle == BLOCK_CURSOR ) { right = X + fontWidth; segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = right; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = right; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; segs[ 3 ].x1 = X; segs[ 3 ].y1 = bot; segs[ 3 ].x2 = X; segs[ 3 ].y2 = Y; nSegs = 4; } fl_color( mCursor_color ); for ( int k = 0; k < nSegs; k++ ) { fl_line( segs[ k ].x1, segs[ k ].y1, segs[ k ].x2, segs[ k ].y2 ); } } /** \brief Find the correct style for a character. Determine the drawing method to use to draw a specific character from "buf". \p lineStartPos gives the character index where the line begins, \p lineIndex, the number of characters past the beginning of the line, and \p lineIndex the number of displayed characters past the beginning of the line. Passing \p lineStartPos of -1 returns the drawing style for "no text". Why not just: position_style(pos)? Because style applies to blank areas of the window beyond the text boundaries, and because this routine must also decide whether a position is inside of a rectangular Fl_Text_Selection, and do so efficiently, without re-counting character positions from the start of the line. Note that style is a somewhat incorrect name, drawing method would be more appropriate. \param lineStartPos beginning of this line \param lineLen number of bytes in line \param lineIndex position of character within line \return style for the given character */ int Fl_Text_Display_mod::position_style( int lineStartPos, int lineLen, int lineIndex) const { IS_UTF8_ALIGNED2(buffer(), lineStartPos) Fl_Text_Buffer_mod * buf = mBuffer; Fl_Text_Buffer_mod *styleBuf = mStyleBuffer; int pos, style = 0; if ( lineStartPos == -1 || buf == NULL ) return FILL_MASK; pos = lineStartPos + min( lineIndex, lineLen ); if ( lineIndex >= lineLen ) style = FILL_MASK; else if ( styleBuf != NULL ) { style = ( unsigned char ) styleBuf->byte_at( pos ); if (style == mUnfinishedStyle && mUnfinishedHighlightCB) { /* encountered "unfinished" style, trigger parsing */ (mUnfinishedHighlightCB)( pos, mHighlightCBArg); style = (unsigned char) styleBuf->byte_at( pos); } } if (buf->primary_selection()->includes(pos)) style |= PRIMARY_MASK; if (buf->highlight_selection()->includes(pos)) style |= HIGHLIGHT_MASK; if (buf->secondary_selection()->includes(pos)) style |= SECONDARY_MASK; return style; } /** \brief Find the width of a string in the font of a particular style. \param string the text \param length number of bytes in string \param style index into style table \return width of text segment in pixels */ double Fl_Text_Display_mod::string_width( const char *string, int length, int style ) const { IS_UTF8_ALIGNED(string) Fl_Font font; Fl_Fontsize fsize; if ( mNStyles && (style & STYLE_LOOKUP_MASK) ) { int si = (style & STYLE_LOOKUP_MASK) - 'A'; if (si < 0) si = 0; else if (si >= mNStyles) si = mNStyles - 1; font = mStyleTable[si].font; fsize = mStyleTable[si].size; } else { font = textfont(); fsize = textsize(); } fl_font( font, fsize ); return fl_width( string, length ); } /** \brief Translate a pixel position into a character index. Translate window coordinates to the nearest (insert cursor or character cell) text position. The parameter \p posType specifies how to interpret the position: CURSOR_POS means translate the coordinates to the nearest cursor position, and CHARACTER_POS means return the position of the character closest to (\p X, \p Y). \param X, Y pixel position \param posType CURSOR_POS or CHARACTER_POS \return index into text buffer */ int Fl_Text_Display_mod::xy_to_position( int X, int Y, int posType ) const { int lineStart, lineLen, fontHeight; int visLineNum; /* Find the visible line number corresponding to the Y coordinate */ fontHeight = mMaxsize; visLineNum = ( Y - text_area.y ) / fontHeight; if ( visLineNum < 0 ) return mFirstChar; if ( visLineNum >= mNVisibleLines ) visLineNum = mNVisibleLines - 1; /* Find the position at the start of the line */ lineStart = mLineStarts[ visLineNum ]; /* If the line start was empty, return the last position in the buffer */ if ( lineStart == -1 ) return mBuffer->length(); /* Get the line text and its length */ lineLen = vline_length( visLineNum ); return handle_vline(FIND_INDEX, lineStart, lineLen, 0, 0, 0, 0, text_area.x, X); } /** \brief Translate pixel coordinates into row and column. Translate window coordinates to the nearest row and column number for positioning the cursor. This, of course, makes no sense when the font is proportional, since there are no absolute columns. The parameter posType specifies how to interpret the position: CURSOR_POS means translate the coordinates to the nearest position between characters, and CHARACTER_POS means translate the position to the nearest character cell. \param X, Y pixel coordinates \param[out] row, column neares row and column \param posType CURSOR_POS or CHARACTER_POS */ void Fl_Text_Display_mod::xy_to_rowcol( int X, int Y, int *row, int *column, int posType ) const { int fontHeight = mMaxsize; int fontWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; /* Find the visible line number corresponding to the Y coordinate */ *row = ( Y - text_area.y ) / fontHeight; if ( *row < 0 ) *row = 0; if ( *row >= mNVisibleLines ) *row = mNVisibleLines - 1; *column = ( ( X - text_area.x ) + mHorizOffset + ( posType == CURSOR_POS ? fontWidth / 2 : 0 ) ) / fontWidth; if ( *column < 0 ) * column = 0; } /** \brief Offset line start counters for a new vertical scroll position. Offset the line starts array, mTopLineNum, mFirstChar and lastChar, for a new vertical scroll position given by newTopLineNum. If any currently displayed lines will still be visible, salvage the line starts values, otherwise, count lines from the nearest known line start (start or end of buffer, or the closest value in the mLineStarts array) \param newTopLineNum index into buffer */ void Fl_Text_Display_mod::offset_line_starts( int newTopLineNum ) { int oldTopLineNum = mTopLineNum; int oldFirstChar = mFirstChar; int lineDelta = newTopLineNum - oldTopLineNum; int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int i, lastLineNum; Fl_Text_Buffer_mod *buf = mBuffer; /* If there was no offset, nothing needs to be changed */ if ( lineDelta == 0 ) return; /* Find the new value for mFirstChar by counting lines from the nearest known line start (start or end of buffer, or the closest value in the lineStarts array) */ lastLineNum = oldTopLineNum + nVisLines - 1; if ( newTopLineNum < oldTopLineNum && newTopLineNum < -lineDelta ) { mFirstChar = skip_lines( 0, newTopLineNum - 1, true ); } else if ( newTopLineNum < oldTopLineNum ) { mFirstChar = rewind_lines( mFirstChar, -lineDelta ); } else if ( newTopLineNum < lastLineNum ) { mFirstChar = lineStarts[ newTopLineNum - oldTopLineNum ]; } else if ( newTopLineNum - lastLineNum < mNBufferLines - newTopLineNum ) { mFirstChar = skip_lines( lineStarts[ nVisLines - 1 ], newTopLineNum - lastLineNum, true ); } else { mFirstChar = rewind_lines( buf->length(), mNBufferLines - newTopLineNum + 1 ); } /* Fill in the line starts array */ if ( lineDelta < 0 && -lineDelta < nVisLines ) { for ( i = nVisLines - 1; i >= -lineDelta; i-- ) lineStarts[ i ] = lineStarts[ i + lineDelta ]; calc_line_starts( 0, -lineDelta ); } else if ( lineDelta > 0 && lineDelta < nVisLines ) { for ( i = 0; i < nVisLines - lineDelta; i++ ) lineStarts[ i ] = lineStarts[ i + lineDelta ]; calc_line_starts( nVisLines - lineDelta, nVisLines - 1 ); } else calc_line_starts( 0, nVisLines ); /* Set lastChar and mTopLineNum */ calc_last_char(); mTopLineNum = newTopLineNum; /* If we're numbering lines or being asked to maintain an absolute line number, re-calculate the absolute line number */ absolute_top_line_number(oldFirstChar); } /** \brief Update line start arrays and variables. Update the line starts array, mTopLineNum, mFirstChar and lastChar for this text display after a modification to the text buffer, given by the position \p pos where the change began, and the numbers of characters and lines inserted and deleted. \param pos index into buffer of recent changes \param charsInserted number of bytes(!) inserted \param charsDeleted number of bytes(!) deleted \param linesInserted number of lines \param linesDeleted number of lines \param[out] scrolled set to 1 if the text display needs to be scrolled */ void Fl_Text_Display_mod::update_line_starts(int pos, int charsInserted, int charsDeleted, int linesInserted, int linesDeleted, int *scrolled ) { IS_UTF8_ALIGNED2(buffer(), pos) int *lineStarts = mLineStarts; int i, lineOfPos, lineOfEnd, nVisLines = mNVisibleLines; int charDelta = charsInserted - charsDeleted; int lineDelta = linesInserted - linesDeleted; /* If all of the changes were before the displayed text, the display doesn't change, just update the top line num and offset the line start entries and first and last characters */ if ( pos + charsDeleted < mFirstChar ) { mTopLineNum += lineDelta; for ( i = 0; i < nVisLines && lineStarts[i] != -1; i++ ) lineStarts[ i ] += charDelta; mFirstChar += charDelta; mLastChar += charDelta; *scrolled = 0; return; } /* The change began before the beginning of the displayed text, but part or all of the displayed text was deleted */ if ( pos < mFirstChar ) { /* If some text remains in the window, anchor on that */ if ( position_to_line( pos + charsDeleted, &lineOfEnd ) && ++lineOfEnd < nVisLines && lineStarts[ lineOfEnd ] != -1 ) { mTopLineNum = max( 1, mTopLineNum + lineDelta ); mFirstChar = rewind_lines(lineStarts[ lineOfEnd ] + charDelta, lineOfEnd ); /* Otherwise anchor on original line number and recount everything */ } else { if ( mTopLineNum > mNBufferLines + lineDelta ) { mTopLineNum = 1; mFirstChar = 0; } else mFirstChar = skip_lines( 0, mTopLineNum - 1, true ); } calc_line_starts( 0, nVisLines - 1 ); /* calculate lastChar by finding the end of the last displayed line */ calc_last_char(); *scrolled = 1; return; } /* If the change was in the middle of the displayed text (it usually is), salvage as much of the line starts array as possible by moving and offsetting the entries after the changed area, and re-counting the added lines or the lines beyond the salvaged part of the line starts array */ if ( pos <= mLastChar ) { /* find line on which the change began */ position_to_line( pos, &lineOfPos ); /* salvage line starts after the changed area */ if ( lineDelta == 0 ) { for ( i = lineOfPos + 1; i < nVisLines && lineStarts[ i ] != -1; i++ ) lineStarts[ i ] += charDelta; } else if ( lineDelta > 0 ) { for ( i = nVisLines - 1; i >= lineOfPos + lineDelta + 1; i-- ) lineStarts[ i ] = lineStarts[ i - lineDelta ] + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); } else /* (lineDelta < 0) */ { for ( i = max( 0, lineOfPos + 1 ); i < nVisLines + lineDelta; i++ ) lineStarts[ i ] = lineStarts[ i - lineDelta ] + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); } /* fill in the missing line starts */ if ( linesInserted >= 0 ) calc_line_starts( lineOfPos + 1, lineOfPos + linesInserted ); if ( lineDelta < 0 ) calc_line_starts( nVisLines + lineDelta, nVisLines ); /* calculate lastChar by finding the end of the last displayed line */ calc_last_char(); *scrolled = 0; return; } /* Change was past the end of the displayed text, but displayable by virtue of being an insert at the end of the buffer into visible blank lines */ if ( empty_vlines() ) { position_to_line( pos, &lineOfPos ); calc_line_starts( lineOfPos, lineOfPos + linesInserted ); calc_last_char(); *scrolled = 0; return; } /* Change was beyond the end of the buffer and not visible, do nothing */ *scrolled = 0; } /** \brief Update the line start arrays. Scan through the text in the "textD"'s buffer and recalculate the line starts array values beginning at index "startLine" and continuing through (including) "endLine". It assumes that the line starts entry preceding "startLine" (or mFirstChar if startLine is 0) is good, and re-counts newlines to fill in the requested entries. Out of range values for "startLine" and "endLine" are acceptable. \param startLine, endLine range of lines to scan as line numbers */ void Fl_Text_Display_mod::calc_line_starts( int startLine, int endLine ) { int startPos, bufLen = mBuffer->length(); int line, lineEnd, nextLineStart, nVis = mNVisibleLines; int *lineStarts = mLineStarts; /* Clean up (possibly) messy input parameters */ if ( endLine < 0 ) endLine = 0; if ( endLine >= nVis ) endLine = nVis - 1; if ( startLine < 0 ) startLine = 0; if ( startLine >= nVis ) startLine = nVis - 1; if ( startLine > endLine ) return; /* Find the last known good line number -> position mapping */ if ( startLine == 0 ) { lineStarts[ 0 ] = mFirstChar; startLine = 1; } startPos = lineStarts[ startLine - 1 ]; /* If the starting position is already past the end of the text, fill in -1's (means no text on line) and return */ if ( startPos == -1 ) { for ( line = startLine; line <= endLine; line++ ) lineStarts[ line ] = -1; return; } /* Loop searching for ends of lines and storing the positions of the start of the next line in lineStarts */ for ( line = startLine; line <= endLine; line++ ) { find_line_end(startPos, true, &lineEnd, &nextLineStart); startPos = nextLineStart; if ( startPos >= bufLen ) { /* If the buffer ends with a newline or line break, put buf->length() in the next line start position (instead of a -1 which is the normal marker for an empty line) to indicate that the cursor may safely be displayed there */ if ( line == 0 || ( lineStarts[ line - 1 ] != bufLen && lineEnd != nextLineStart ) ) { lineStarts[ line ] = bufLen; line++; } break; } lineStarts[ line ] = startPos; } /* Set any entries beyond the end of the text to -1 */ for ( ; line <= endLine; line++ ) lineStarts[ line ] = -1; } /** \brief Update last display character index. Given a Fl_Text_Display_mod with a complete, up-to-date lineStarts array, update the lastChar entry to point to the last buffer position displayed. */ void Fl_Text_Display_mod::calc_last_char() { int i; for (i = mNVisibleLines - 1; i >= 0 && mLineStarts[i] == -1; i--) ; mLastChar = i < 0 ? 0 : line_end(mLineStarts[i], true); } /** \brief Scrolls the current buffer to start at the specified line and column. \param topLineNum top line number \param horizOffset column number \todo Column numbers make little sense here. */ void Fl_Text_Display_mod::scroll(int topLineNum, int horizOffset) { mTopLineNumHint = topLineNum; mHorizOffsetHint = horizOffset; resize(x(), y(), w(), h()); } /** \brief Scrolls the current buffer to start at the specified line and column. \param topLineNum top line number \param horizOffset in pixels \return 0 if nothing changed, 1 if we scrolled */ int Fl_Text_Display_mod::scroll_(int topLineNum, int horizOffset) { /* Limit the requested scroll position to allowable values */ if (topLineNum > mNBufferLines + 3 - mNVisibleLines) topLineNum = mNBufferLines + 3 - mNVisibleLines; if (topLineNum < 1) topLineNum = 1; if (horizOffset > longest_vline() - text_area.w) horizOffset = longest_vline() - text_area.w; if (horizOffset < 0) horizOffset = 0; /* Do nothing if scroll position hasn't actually changed or there's no window to draw in yet */ if (mHorizOffset == horizOffset && mTopLineNum == topLineNum) return 0; /* If the vertical scroll position has changed, update the line starts array and related counters in the text display */ offset_line_starts(topLineNum); /* Just setting mHorizOffset is enough information for redisplay */ mHorizOffset = horizOffset; // redraw all text damage(FL_DAMAGE_EXPOSE); return 1; } /** \brief Update vertical scrollbar. Update the minimum, maximum, slider size, page increment, and value for vertical scrollbar. */ void Fl_Text_Display_mod::update_v_scrollbar() { /* The vertical scrollbar value and slider size directly represent the top line number, and the number of visible lines respectively. The scroll bar maximum value is chosen to generally represent the size of the whole buffer, with minor adjustments to keep the scrollbar widget happy */ #ifdef DEBUG printf("Fl_Text_Display_mod::update_v_scrollbar():\n" " mTopLineNum=%d, mNVisibleLines=%d, mNBufferLines=%d\n", mTopLineNum, mNVisibleLines, mNBufferLines); #endif // DEBUG mVScrollBar->value(mTopLineNum, mNVisibleLines, 1, mNBufferLines + 2); mVScrollBar->linesize(3); } /** \brief Update vertical scrollbar. Update the minimum, maximum, slider size, page increment, and value for the horizontal scrollbar. */ void Fl_Text_Display_mod::update_h_scrollbar() { int sliderMax = max(longest_vline(), text_area.w + mHorizOffset); mHScrollBar->value( mHorizOffset, text_area.w, 0, sliderMax ); } /** \brief Callbacks for drag or valueChanged on scrollbars. */ void Fl_Text_Display_mod::v_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display_mod* textD) { if (b->value() == textD->mTopLineNum) return; textD->scroll(b->value(), textD->mHorizOffset); } /** \brief Callbacks for drag or valueChanged on scrollbars. */ void Fl_Text_Display_mod::h_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display_mod* textD) { if (b->value() == textD->mHorizOffset) return; textD->scroll(textD->mTopLineNum, b->value()); } /** \brief Refresh the line number area. If clearAll is False, writes only over the character cell areas. Setting clearAll to True will clear out any stray marks outside of the character cell area, which might have been left from before a resize or font change. This function is not used. */ void Fl_Text_Display_mod::draw_line_numbers(bool /*clearAll*/) { #if 0 int y, line, visLine, nCols, lineStart; char lineNumString[12]; int lineHeight = mMaxsize ? mMaxsize : textsize_; int charWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; /* Don't draw if mLineNumWidth == 0 (line numbers are hidden), or widget is not yet realized */ if (mLineNumWidth == 0 || visible_r()) return; /* GC is allocated on demand, since not everyone will use line numbering */ if (textD->lineNumGC == NULL) { XGCValues values; values.foreground = textD->lineNumFGPixel; values.background = textD->bgPixel; values.font = textD->fontStruct->fid; textD->lineNumGC = XtGetGC(textD->w, GCFont| GCForeground | GCBackground, &values); } /* Erase the previous contents of the line number area, if requested */ if (clearAll) XClearArea(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumLeft, textD->top, textD->lineNumWidth, textD->height, False); /* Draw the line numbers, aligned to the text */ nCols = min(11, textD->lineNumWidth / charWidth); y = textD->top; line = getAbsTopLineNum(textD); for (visLine=0; visLine < textD->nVisibleLines; visLine++) { lineStart = textD->lineStarts[visLine]; if (lineStart != -1 && (lineStart==0 || BufGetCharacter(textD->buffer, lineStart-1)=='\n')) { snprintf(lineNumString, sizeof(lineNumString), "%*d", nCols, line); XDrawImageString(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumGC, textD->lineNumLeft, y + textD->ascent, lineNumString, strlen(lineNumString)); line++; } else { XClearArea(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumLeft, y, textD->lineNumWidth, textD->ascent + textD->descent, False); if (visLine == 0) line++; } y += lineHeight; } #endif } static int max( int i1, int i2 ) { return i1 >= i2 ? i1 : i2; } static int min( int i1, int i2 ) { return i1 <= i2 ? i1 : i2; } /** Count the number of newlines in a null-terminated text string; */ static int countlines( const char *string ) { IS_UTF8_ALIGNED(string) const char * c; int lineCount = 0; if (!string) return 0; for ( c = string; *c != '\0'; c++ ) if ( *c == '\n' ) lineCount++; return lineCount; } /** \brief Returns the width in pixels of the displayed line pointed to by "visLineNum". \param visLineNum index into visible lines array \return width of line in pixels */ int Fl_Text_Display_mod::measure_vline( int visLineNum ) const { int lineLen = vline_length( visLineNum ); int lineStartPos = mLineStarts[ visLineNum ]; if (lineStartPos < 0 || lineLen == 0) return 0; return handle_vline(GET_WIDTH, lineStartPos, lineLen, 0, 0, 0, 0, 0, 0); } /** \brief Return true if there are lines visible with no corresponding buffer text. \return 1 if there are empty lines */ int Fl_Text_Display_mod::empty_vlines() const { return (mNVisibleLines > 0) && (mLineStarts[ mNVisibleLines - 1 ] == -1); } /** \brief Count number of bytes in a visible line. Return the length of a line (number of bytes) by examining entries in the line starts array rather than by scanning for newlines. \param visLineNum index of line in visible line array \return number of bytes in this line */ int Fl_Text_Display_mod::vline_length( int visLineNum ) const { int nextLineStart, lineStartPos; if (visLineNum < 0 || visLineNum >= mNVisibleLines) return (0); lineStartPos = mLineStarts[ visLineNum ]; if ( lineStartPos == -1 ) return 0; if ( visLineNum + 1 >= mNVisibleLines ) return mLastChar - lineStartPos; nextLineStart = mLineStarts[ visLineNum + 1 ]; if ( nextLineStart == -1 ) return mLastChar - lineStartPos; int nextLineStartMinus1 = buffer()->prev_char(nextLineStart); if (wrap_uses_character(nextLineStartMinus1)) return nextLineStartMinus1 - lineStartPos; return nextLineStart - lineStartPos; } /** \brief Wrapping calculations. When continuous wrap is on, and the user inserts or deletes characters, wrapping can happen before and beyond the changed position. This routine finds the extent of the changes, and counts the deleted and inserted lines over that range. It also attempts to minimize the size of the range to what has to be counted and re-displayed, so the results can be useful both for delimiting where the line starts need to be recalculated, and for deciding what part of the text to redisplay. \param deletedText \param pos \param nInserted \param nDeleted \param modRangeStart \param modRangeEnd \param linesInserted \param linesDeleted */ void Fl_Text_Display_mod::find_wrap_range(const char *deletedText, int pos, int nInserted, int nDeleted, int *modRangeStart, int *modRangeEnd, int *linesInserted, int *linesDeleted) { IS_UTF8_ALIGNED(deletedText) IS_UTF8_ALIGNED2(buffer(), pos) int length, retPos, retLines, retLineStart, retLineEnd; Fl_Text_Buffer_mod *deletedTextBuf, *buf = buffer(); int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int countFrom, countTo, lineStart, adjLineStart, i; int visLineNum = 0, nLines = 0; /* ** Determine where to begin searching: either the previous newline, or ** if possible, limit to the start of the (original) previous displayed ** line, using information from the existing line starts array */ if (pos >= mFirstChar && pos <= mLastChar) { for (i=nVisLines-1; i>0; i--) { if (lineStarts[i] != -1 && pos >= lineStarts[i]) { break; } } if (i > 0) { countFrom = lineStarts[i-1]; visLineNum = i-1; } else { countFrom = buf->line_start(pos); } } else { countFrom = buf->line_start(pos); } IS_UTF8_ALIGNED2(buf, countFrom) /* ** Move forward through the (new) text one line at a time, counting ** displayed lines, and looking for either a real newline, or for the ** line starts to re-sync with the original line starts array */ lineStart = countFrom; *modRangeStart = countFrom; for (;;) { /* advance to the next line. If the line ended in a real newline or the end of the buffer, that's far enough */ wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); if (retPos >= buf->length()) { countTo = buf->length(); *modRangeEnd = countTo; if (retPos != retLineEnd) nLines++; break; } else { lineStart = retPos; } nLines++; if (lineStart > pos + nInserted && buf->char_at(buf->prev_char(lineStart)) == '\n') { countTo = lineStart; *modRangeEnd = lineStart; break; } /* Don't try to resync in continuous wrap mode with non-fixed font sizes; it would result in a chicken-and-egg dependency between the calculations for the inserted and the deleted lines. If we're in that mode, the number of deleted lines is calculated in advance, without resynchronization, so we shouldn't resynchronize for the inserted lines either. */ if (mSuppressResync) continue; /* check for synchronization with the original line starts array before pos, if so, the modified range can begin later */ if (lineStart <= pos) { while (visLineNumprev_char(lineStarts[visLineNum+1])); else *modRangeStart = countFrom; } else *modRangeStart = min(*modRangeStart, buf->prev_char(lineStart)); } /* check for synchronization with the original line starts array after pos, if so, the modified range can end early */ else if (lineStart > pos + nInserted) { adjLineStart = lineStart - nInserted + nDeleted; while (visLineNumcopy(buffer(), countFrom, pos, 0); if (nDeleted != 0) deletedTextBuf->insert(pos-countFrom, deletedText); deletedTextBuf->copy(buffer(), pos+nInserted, countTo, pos-countFrom+nDeleted); /* Note that we need to take into account an offset for the style buffer: the deletedTextBuf can be out of sync with the style buffer. */ wrapped_line_counter(deletedTextBuf, 0, length, INT_MAX, true, countFrom, &retPos, &retLines, &retLineStart, &retLineEnd, false); delete deletedTextBuf; *linesDeleted = retLines; mSuppressResync = 0; } /** \brief Wrapping calculations. This is a stripped-down version of the findWrapRange() function above, intended to be used to calculate the number of "deleted" lines during a buffer modification. It is called _before_ the modification takes place. This function should only be called in continuous wrap mode with a non-fixed font width. In that case, it is impossible to calculate the number of deleted lines, because the necessary style information is no longer available _after_ the modification. In other cases, we can still perform the calculation afterwards (possibly even more efficiently). \param pos \param nDeleted */ void Fl_Text_Display_mod::measure_deleted_lines(int pos, int nDeleted) { IS_UTF8_ALIGNED2(buffer(), pos) int retPos, retLines, retLineStart, retLineEnd; Fl_Text_Buffer_mod *buf = buffer(); int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int countFrom, lineStart; // int visLineNum = 0; int nLines = 0, i; /* ** Determine where to begin searching: either the previous newline, or ** if possible, limit to the start of the (original) previous displayed ** line, using information from the existing line starts array */ if (pos >= mFirstChar && pos <= mLastChar) { for (i=nVisLines-1; i>0; i--) if (lineStarts[i] != -1 && pos >= lineStarts[i]) break; if (i > 0) { countFrom = lineStarts[i-1]; // visLineNum = i-1; } else countFrom = buf->line_start(pos); } else countFrom = buf->line_start(pos); /* ** Move forward through the (new) text one line at a time, counting ** displayed lines, and looking for either a real newline, or for the ** line starts to re-sync with the original line starts array */ lineStart = countFrom; for (;;) { /* advance to the next line. If the line ended in a real newline or the end of the buffer, that's far enough */ wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); if (retPos >= buf->length()) { if (retPos != retLineEnd) nLines++; break; } else lineStart = retPos; nLines++; if (lineStart > pos + nDeleted && buf->char_at(lineStart-1) == '\n') { break; } /* Unlike in the findWrapRange() function above, we don't try to resync with the line starts, because we don't know the length of the inserted text yet, nor the updated style information. Because of that, we also shouldn't resync with the line starts after the modification either, because we must perform the calculations for the deleted and inserted lines in the same way. This can result in some unnecessary recalculation and redrawing overhead, and therefore we should only use this two-phase mode of calculation when it's really needed (continuous wrap + variable font width). */ } mNLinesDeleted = nLines; mSuppressResync = 1; } /** \brief Wrapping calculations. Count forward from startPos to either maxPos or maxLines (whichever is reached first), and return all relevant positions and line count. The provided textBuffer may differ from the actual text buffer of the widget. In that case it must be a (partial) copy of the actual text buffer and the styleBufOffset argument must indicate the starting position of the copy, to take into account the correct style information. \param buf \param startPos \param maxPos \param maxLines \param startPosIsLineStart \param styleBufOffset \param[out] retPos Position where counting ended. When counting lines, the position returned is the start of the line "maxLines" lines beyond "startPos". \param[out] retLines Number of line breaks counted \param[out] retLineStart Start of the line where counting ended \param[out] retLineEnd End position of the last line traversed \param[out] countLastLineMissingNewLine */ void Fl_Text_Display_mod::wrapped_line_counter(Fl_Text_Buffer_mod *buf, int startPos, int maxPos, int maxLines, bool startPosIsLineStart, int styleBufOffset, int *retPos, int *retLines, int *retLineStart, int *retLineEnd, bool countLastLineMissingNewLine) const { IS_UTF8_ALIGNED2(buf, startPos) IS_UTF8_ALIGNED2(buf, maxPos) int lineStart, newLineStart = 0, b, p, colNum, wrapMarginPix; int i, foundBreak; double width; int nLines = 0; unsigned int c; /* Set the wrap margin to the wrap column or the view width */ if (mWrapMarginPix != 0) { wrapMarginPix = mWrapMarginPix; } else { wrapMarginPix = text_area.w; } /* Find the start of the line if the start pos is not marked as a line start. */ if (startPosIsLineStart) lineStart = startPos; else lineStart = line_start(startPos); /* ** Loop until position exceeds maxPos or line count exceeds maxLines. ** (actually, continues beyond maxPos to end of line containing maxPos, ** in case later characters cause a word wrap back before maxPos) */ colNum = 0; width = 0; for (p=lineStart; plength(); p=buf->next_char(p)) { c = buf->char_at(p); // UCS-4 /* If the character was a newline, count the line and start over, otherwise, add it to the width and column counts */ if (c == '\n') { if (p >= maxPos) { *retPos = maxPos; *retLines = nLines; *retLineStart = lineStart; *retLineEnd = maxPos; return; } nLines++; int p1 = buf->next_char(p); if (nLines >= maxLines) { *retPos = p1; *retLines = nLines; *retLineStart = p1; *retLineEnd = p; return; } lineStart = p1; colNum = 0; width = 0; } else { const char *s = buf->address(p); colNum++; // FIXME: it is not a good idea to simply add character widths because on // some platforms, the width is a floating point value and depends on the // previous character as well. width += measure_proportional_character(s, (int)width, p+styleBufOffset); } /* If character exceeded wrap margin, find the break point and wrap there */ if (width > wrapMarginPix) { foundBreak = false; for (b=p; b>=lineStart; b=buf->prev_char(b)) { c = buf->char_at(b); if (c == '\t' || c == ' ') { newLineStart = buf->next_char(b); colNum = 0; width = 0; int iMax = buf->next_char(p); for (i=buf->next_char(b); inext_char(i)) { width += measure_proportional_character(buf->address(i), (int)width, i+styleBufOffset); colNum++; } foundBreak = true; break; } } if (!foundBreak) { /* no whitespace, just break at margin */ newLineStart = max(p, buf->next_char(lineStart)); const char *s = buf->address(b); colNum++; width = measure_proportional_character(s, 0, p+styleBufOffset); } if (p >= maxPos) { *retPos = maxPos; *retLines = maxPos < newLineStart ? nLines : nLines + 1; *retLineStart = maxPos < newLineStart ? lineStart : newLineStart; *retLineEnd = maxPos; return; } nLines++; if (nLines >= maxLines) { *retPos = foundBreak ? buf->next_char(b) : max(p, buf->next_char(lineStart)); *retLines = nLines; *retLineStart = lineStart; *retLineEnd = foundBreak ? b : p; return; } lineStart = newLineStart; } } /* reached end of buffer before reaching pos or line target */ *retPos = buf->length(); *retLines = nLines; if (countLastLineMissingNewLine && colNum > 0) *retLines = buf->next_char(*retLines); *retLineStart = lineStart; *retLineEnd = buf->length(); } /** \brief Wrapping calculations. Measure the width in pixels of the first character of string "s" at a particular column "colNum" and buffer position "pos". This is for measuring characters in proportional or mixed-width highlighting fonts. A note about proportional and mixed-width fonts: the mixed width and proportional font code in nedit does not get much use in general editing, because nedit doesn't allow per-language-mode fonts, and editing programs in a proportional font is usually a bad idea, so very few users would choose a proportional font as a default. There are still probably mixed- width syntax highlighting cases where things don't redraw properly for insertion/deletion, though static display and wrapping and resizing should now be solid because they are now used for online help display. \param s text string \param xPix x pixel position needed for calculating tab widths \param pos offset within string \return width of character in pixels */ double Fl_Text_Display_mod::measure_proportional_character(const char *s, int xPix, int pos) const { IS_UTF8_ALIGNED(s) if (*s=='\t') { int tab = (int)col_to_x(mBuffer->tab_distance()); return (((xPix/tab)+1)*tab) - xPix; } int charLen = fl_utf8len1(*s), style = 0; if (mStyleBuffer) { style = mStyleBuffer->byte_at(pos); } return string_width(s, charLen, style); } /** \brief Finds both the end of the current line and the start of the next line. Why? In continuous wrap mode, if you need to know both, figuring out one from the other can be expensive or error prone. The problem comes when there's a trailing space or tab just before the end of the buffer. To translate an end of line value to or from the next lines start value, you need to know whether the trailing space or tab is being used as a line break or just a normal character, and to find that out would otherwise require counting all the way back to the beginning of the line. \param startPos \param startPosIsLineStart \param[out] lineEnd \param[out] nextLineStart */ void Fl_Text_Display_mod::find_line_end(int startPos, bool startPosIsLineStart, int *lineEnd, int *nextLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retLineStart; /* if we're not wrapping use more efficient BufEndOfLine */ if (mFastDisplay || !mContinuousWrap) { int le = buffer()->line_end(startPos); int ls = buffer()->next_char(le); *lineEnd = le; *nextLineStart = min(buffer()->length(), ls); return; } /* use the wrapped line counter routine to count forward one line */ wrapped_line_counter(buffer(), startPos, buffer()->length(), 1, startPosIsLineStart, 0, nextLineStart, &retLines, &retLineStart, lineEnd); } /** \brief Check if the line break is caused by a \\n or by line wrapping. Line breaks in continuous wrap mode usually happen at newlines or whitespace. This line-terminating character is not included in line width measurements and has a special status as a non-visible character. However, lines with no whitespace are wrapped without the benefit of a line terminating character, and this distinction causes endless trouble with all of the text display code which was originally written without continuous wrap mode and always expects to wrap at a newline character. Given the position of the end of the line, as returned by TextDEndOfLine or BufEndOfLine, this returns true if there is a line terminating character, and false if there's not. On the last character in the buffer, this function can't tell for certain whether a trailing space was used as a wrap point, and just guesses that it wasn't. So if an exact accounting is necessary, don't use this function. \param lineEndPos index of character where the line wraps \return 1 if a \\n character causes the line wrap */ int Fl_Text_Display_mod::wrap_uses_character(int lineEndPos) const { IS_UTF8_ALIGNED2(buffer(), lineEndPos) unsigned int c; if (mFastDisplay || !mContinuousWrap || lineEndPos == buffer()->length()) return 1; c = buffer()->char_at(lineEndPos); return c == '\n' || ((c == '\t' || c == ' ') && lineEndPos + 1 < buffer()->length()); } /** \brief I don't know what this does! Extend the range of a redraw request (from *start to *end) with additional redraw requests resulting from changes to the attached style buffer (which contains auxiliary information for coloring or styling text). \param startpos ?? \param endpos ?? \todo Unicode? */ void Fl_Text_Display_mod::extend_range_for_styles( int *startpos, int *endpos ) { IS_UTF8_ALIGNED2(buffer(), (*startpos)) IS_UTF8_ALIGNED2(buffer(), (*endpos)) Fl_Text_Selection_mod * sel = mStyleBuffer->primary_selection(); int extended = 0; /* The peculiar protocol used here is that modifications to the style buffer are marked by selecting them with the buffer's primary Fl_Text_Selection. The style buffer is usually modified in response to a modify callback on the text buffer BEFORE Fl_Text_Display_mod.c's modify callback, so that it can keep the style buffer in step with the text buffer. The style-update callback can't just call for a redraw, because Fl_Text_Display_mod hasn't processed the original text changes yet. Anyhow, to minimize redrawing and to avoid the complexity of scheduling redraws later, this simple protocol tells the text display's buffer modify callback to extend its redraw range to show the text color/and font changes as well. */ if ( sel->selected() ) { if ( sel->start() < *startpos ) { *startpos = sel->start(); // somewhere while deleting, alignment is lost. We do this just to be sure. *startpos = buffer()->utf8_align(*startpos); IS_UTF8_ALIGNED2(buffer(), (*startpos)) extended = 1; } if ( sel->end() > *endpos ) { *endpos = sel->end(); *endpos = buffer()->utf8_align(*endpos); IS_UTF8_ALIGNED2(buffer(), (*endpos)) extended = 1; } } /* If the Fl_Text_Selection was extended due to a style change, and some of the fonts don't match in spacing, extend redraw area to end of line to redraw characters exposed by possible font size changes */ if ( extended ) *endpos = mBuffer->line_end( *endpos ) + 1; IS_UTF8_ALIGNED2(buffer(), (*endpos)) } /** \brief Draw the widget. This function tries to limit drawing to smaller areas if possible. */ void Fl_Text_Display_mod::draw(void) { // don't even try if there is no associated text buffer! if (!buffer()) { draw_box(); return; } fl_push_clip(x(),y(),w(),h()); // prevent drawing outside widget area // draw the non-text, non-scrollbar areas. if (damage() & FL_DAMAGE_ALL) { // printf("drawing all (box = %d)\n", box()); #ifndef __APPLE__ if (Fl_Surface_Device::surface()->class_name() == Fl_Printer::class_id) { // if to printer, draw the background fl_rectf(text_area.x, text_area.y, text_area.w, text_area.h, color() ); } #endif // draw the box() int W = w(), H = h(); draw_box(box(), x(), y(), W, H, color()); if (mHScrollBar->visible()) W -= scrollbar_width(); if (mVScrollBar->visible()) H -= scrollbar_width(); // left margin fl_rectf(text_area.x-LEFT_MARGIN, text_area.y-TOP_MARGIN, LEFT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, color()); // right margin fl_rectf(text_area.x+text_area.w, text_area.y-TOP_MARGIN, RIGHT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, color()); // top margin fl_rectf(text_area.x, text_area.y-TOP_MARGIN, text_area.w, TOP_MARGIN, color()); // bottom margin fl_rectf(text_area.x, text_area.y+text_area.h, text_area.w, BOTTOM_MARGIN, color()); // draw that little box in the corner of the scrollbars if (mVScrollBar->visible() && mHScrollBar->visible()) fl_rectf(mVScrollBar->x(), mHScrollBar->y(), mVScrollBar->w(), mHScrollBar->h(), FL_GRAY); // blank the previous cursor protrusions } else if (damage() & (FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE)) { // printf("blanking previous cursor extrusions at Y: %d\n", mCursorOldY); // CET - FIXME - save old cursor position instead and just draw side needed? fl_push_clip(text_area.x-LEFT_MARGIN, text_area.y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, text_area.h); fl_rectf(text_area.x-LEFT_MARGIN, mCursorOldY, LEFT_MARGIN, mMaxsize, color()); fl_rectf(text_area.x+text_area.w, mCursorOldY, RIGHT_MARGIN, mMaxsize, color()); fl_pop_clip(); } // draw the scrollbars if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_CHILD)) { mVScrollBar->damage(FL_DAMAGE_ALL); mHScrollBar->damage(FL_DAMAGE_ALL); } update_child(*mVScrollBar); update_child(*mHScrollBar); // draw all of the text if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_EXPOSE)) { //printf("drawing all text\n"); int X, Y, W, H; if (fl_clip_box(text_area.x, text_area.y, text_area.w, text_area.h, X, Y, W, H)) { // Draw text using the intersected clipping box... // (this sets the clipping internally) draw_text(X, Y, W, H); } else { // Draw the whole area... draw_text(text_area.x, text_area.y, text_area.w, text_area.h); } } else if (damage() & FL_DAMAGE_SCROLL) { // draw some lines of text fl_push_clip(text_area.x, text_area.y, text_area.w, text_area.h); //printf("drawing text from %d to %d\n", damage_range1_start, damage_range1_end); draw_range(damage_range1_start, damage_range1_end); if (damage_range2_end != -1) { //printf("drawing text from %d to %d\n", damage_range2_start, damage_range2_end); draw_range(damage_range2_start, damage_range2_end); } damage_range1_start = damage_range1_end = -1; damage_range2_start = damage_range2_end = -1; fl_pop_clip(); } // draw the text cursor if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE) && !buffer()->primary_selection()->selected() && mCursorOn && Fl::focus() == (Fl_Widget*)this ) { fl_push_clip(text_area.x-LEFT_MARGIN, text_area.y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, text_area.h); int X, Y = 0; if (position_to_xy(mCursorPos, &X, &Y)) draw_cursor(X, Y); // else puts("position_to_xy() failed - unable to draw cursor!"); //printf("drew cursor at pos: %d (%d,%d)\n", mCursorPos, X, Y); mCursorOldY = Y; fl_pop_clip(); } fl_pop_clip(); } // this processes drag events due to mouse for Fl_Text_Display_mod and // also drags due to cursor movement with shift held down for // Fl_Text_Editor_mod void fl_text_drag_me(int pos, Fl_Text_Display_mod* d) { if (d->dragType == Fl_Text_Display_mod::DRAG_CHAR) { if (pos >= d->dragPos) { d->buffer()->select(d->dragPos, pos); } else { d->buffer()->select(pos, d->dragPos); } d->insert_position(pos); } else if (d->dragType == Fl_Text_Display_mod::DRAG_WORD) { if (pos >= d->dragPos) { d->insert_position(d->word_end(pos)); d->buffer()->select(d->word_start(d->dragPos), d->word_end(pos)); } else { d->insert_position(d->word_start(pos)); d->buffer()->select(d->word_start(pos), d->word_end(d->dragPos)); } } else if (d->dragType == Fl_Text_Display_mod::DRAG_LINE) { if (pos >= d->dragPos) { d->insert_position(d->buffer()->line_end(pos)+1); d->buffer()->select(d->buffer()->line_start(d->dragPos), d->buffer()->line_end(pos)+1); } else { d->insert_position(d->buffer()->line_start(pos)); d->buffer()->select(d->buffer()->line_start(pos), d->buffer()->line_end(d->dragPos)+1); } } } /** \brief Timer callback for scroll events. This timer event scrolls the text view proportionally to how far the mouse pointer has left the text area. This allows for smooth scrolling without "wiggeling" the mouse. */ void Fl_Text_Display_mod::scroll_timer_cb(void *user_data) { Fl_Text_Display_mod *w = (Fl_Text_Display_mod*)user_data; int pos; switch (scroll_direction) { case 1: // mouse is to the right, scroll left w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); pos = w->xy_to_position(w->text_area.x + w->text_area.w, scroll_y, CURSOR_POS); break; case 2: // mouse is to the left, scroll right w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); pos = w->xy_to_position(w->text_area.x, scroll_y, CURSOR_POS); break; case 3: // mouse is above, scroll down w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); pos = w->xy_to_position(scroll_x, w->text_area.y, CURSOR_POS); break; case 4: // mouse is below, scroll up w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); pos = w->xy_to_position(scroll_x, w->text_area.y + w->text_area.h, CURSOR_POS); break; default: return; } fl_text_drag_me(pos, w); Fl::repeat_timeout(.1, scroll_timer_cb, user_data); } /** \brief Event handling. */ int Fl_Text_Display_mod::handle(int event) { if (!buffer()) return 0; // This isn't very elegant! if (!Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h) && !dragging && event != FL_LEAVE && event != FL_ENTER && event != FL_MOVE && event != FL_FOCUS && event != FL_UNFOCUS && event != FL_KEYBOARD && event != FL_KEYUP) { return Fl_Group::handle(event); } switch (event) { case FL_ENTER: case FL_MOVE: if (active_r()) { if (Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h)) window()->cursor(FL_CURSOR_INSERT); else window()->cursor(FL_CURSOR_DEFAULT); return 1; } else { return 0; } case FL_LEAVE: case FL_HIDE: if (active_r() && window()) { window()->cursor(FL_CURSOR_DEFAULT); return 1; } else { return 0; } case FL_PUSH: { if (active_r() && window()) { if (Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h)) window()->cursor(FL_CURSOR_INSERT); else window()->cursor(FL_CURSOR_DEFAULT); } if (Fl::focus() != this) { Fl::focus(this); handle(FL_FOCUS); } if (Fl_Group::handle(event)) return 1; if (Fl::event_state()&FL_SHIFT) return handle(FL_DRAG); dragging = 1; int pos = xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS); dragPos = pos; if (buffer()->primary_selection()->includes(pos)) { dragType = DRAG_START_DND; return 1; } dragType = Fl::event_clicks(); if (dragType == DRAG_CHAR) { buffer()->unselect(); // Fl::copy("", 0, 0); /* removed for STR 2668 */ } else if (dragType == DRAG_WORD) { buffer()->select(word_start(pos), word_end(pos)); dragPos = word_start(pos); } if (buffer()->primary_selection()->selected()) insert_position(buffer()->primary_selection()->end()); else insert_position(pos); show_insert_position(); return 1; } case FL_DRAG: { if (dragType==DRAG_NONE) return 1; if (dragType==DRAG_START_DND) { if (!Fl::event_is_click() && Fl::dnd_text_ops()) { const char* copy = buffer()->selection_text(); Fl::dnd(); free((void*)copy); } return 1; } int X = Fl::event_x(), Y = Fl::event_y(), pos = insert_position(); // if we leave the text_area, we start a timer event // that will take care of scrolling and selecting if (Y < text_area.y) { scroll_x = X; scroll_amount = (Y - text_area.y) / 5 - 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 3; } else if (Y >= text_area.y+text_area.h) { scroll_x = X; scroll_amount = (Y - text_area.y - text_area.h) / 5 + 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 4; } else if (X < text_area.x) { scroll_y = Y; scroll_amount = (X - text_area.x) / 2 - 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 2; } else if (X >= text_area.x+text_area.w) { scroll_y = Y; scroll_amount = (X - text_area.x - text_area.w) / 2 + 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 1; } else { if (scroll_direction) { Fl::remove_timeout(scroll_timer_cb, this); scroll_direction = 0; } pos = xy_to_position(X, Y, CURSOR_POS); pos = buffer()->next_char(pos); } fl_text_drag_me(pos, this); return 1; } case FL_RELEASE: { if (Fl::event_is_click() && (! Fl::event_clicks()) && buffer()->primary_selection()->includes(dragPos) && !(Fl::event_state()&FL_SHIFT) ) { buffer()->unselect(); // clicking in the selection: unselect and move cursor insert_position(dragPos); return 1; } else if (Fl::event_clicks() == DRAG_LINE && Fl::event_button() == FL_LEFT_MOUSE) { buffer()->select(buffer()->line_start(dragPos), buffer()->next_char(buffer()->line_end(dragPos))); dragPos = line_start(dragPos); dragType = DRAG_CHAR; } else { dragging = 0; if (scroll_direction) { Fl::remove_timeout(scroll_timer_cb, this); scroll_direction = 0; } // convert from WORD or LINE selection to CHAR /*if (insert_position() >= dragPos) dragPos = buffer()->primary_selection()->start(); else dragPos = buffer()->primary_selection()->end();*/ dragType = DRAG_CHAR; } const char* copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } case FL_MOUSEWHEEL: if (Fl::event_dy()) return mVScrollBar->handle(event); else return mHScrollBar->handle(event); case FL_UNFOCUS: if (active_r() && window()) window()->cursor(FL_CURSOR_DEFAULT); case FL_FOCUS: if (buffer()->selected()) { int start, end; if (buffer()->selection_position(&start, &end)) redisplay_range(start, end); } if (buffer()->secondary_selected()) { int start, end; if (buffer()->secondary_selection_position(&start, &end)) redisplay_range(start, end); } if (buffer()->highlight()) { int start, end; if (buffer()->highlight_position(&start, &end)) redisplay_range(start, end); } return 1; case FL_KEYBOARD: // Copy? if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='c') { if (!buffer()->selected()) return 1; const char *copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 1); free((void*)copy); return 1; } // Select all ? if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='a') { buffer()->select(0,buffer()->length()); const char *copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } if (mVScrollBar->handle(event)) return 1; if (mHScrollBar->handle(event)) return 1; break; case FL_SHORTCUT: if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; if (Fl::visible_focus() && handle(FL_FOCUS)) { Fl::focus(this); return 1; } break; } return 0; } /* Convert an x pixel position into a column number. */ double Fl_Text_Display_mod::x_to_col(double y) const { if (!mColumnScale) { mColumnScale = string_width("Mitg", 4, 'A') / 4.0; } return (y/mColumnScale)+0.5; } /** Convert a column number into an x pixel position. */ double Fl_Text_Display_mod::col_to_x(double col) const { if (!mColumnScale) { // recalculate column scale value x_to_col(0); } return col*mColumnScale; } // // End of "$Id: Fl_Text_Display_mod.cxx 8808 2011-06-16 13:31:25Z manolo $". // fldigi-4.1.06/src/thor/0000775000175000017500000000000013515625027011614 500000000000000fldigi-4.1.06/src/thor/thor-pic.cxx0000644000175000017500000006142413472115777014022 00000000000000// ---------------------------------------------------------------------------- // thorpic.cxx -- thor image support functions // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gthor source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "gettext.h" #include "fileselect.h" #include "qrunner.h" #include "timeops.h" void thor_createTxViewer(); void thor_showRxViewer(char); Fl_Double_Window *thorpicRxWin = (Fl_Double_Window *)0; picture *thorpicRx = (picture *)0; Fl_Button *btnthorRxReset = (Fl_Button *)0; Fl_Button *btnthorRxSave = (Fl_Button *)0; Fl_Button *btnthorRxClose = (Fl_Button *)0; Fl_Counter *thorcnt_phase = (Fl_Counter *)0; Fl_Counter *thorcnt_slant = (Fl_Counter *)0; Fl_Double_Window *thorpicTxWin = (Fl_Double_Window *)0; picture *thorpicTx = (picture *)0; Fl_Button *btnthorpicTransmit = (Fl_Button *)0; Fl_Button *btnthorpicTxSendAbort = (Fl_Button *)0; Fl_Button *btnthorpicTxLoad = (Fl_Button *)0; Fl_Button *btnthorpicTxClose = (Fl_Button *)0; Fl_Choice *selthorpicSize = (Fl_Choice *)0; Fl_Check_Button *btnthorTxGrey = (Fl_Check_Button *)0; void thor_showRxViewer(char c); void thor_createRxViewer(); Fl_Shared_Image *thorTxImg = (Fl_Shared_Image *)0; unsigned char *thorxmtimg = (unsigned char *)0; unsigned char *thorxmtpicbuff = (unsigned char *)0; #define RAWSIZE 640*(480 + 8)*3*thor::IMAGEspp #define RAWSTART 640*4*3*thor::IMAGEspp unsigned char *thor_rawvideo = 0;//[RAWSIZE + 1]; int thor_numpixels; int thor_pixelptr; int thor_rawcol; int thor_rawrow; int thor_rawrgb; char thor_image_type = 'S'; char thor_txclr_tooltip[24]; char thor_txgry_tooltip[24]; static int translate = 0; static bool enabled = false; std::string thor::imageheader; std::string thor::avatarheader; int thor::IMAGEspp = THOR_IMAGESPP; static string thor_fname; void thor_correct_video() { int W = thorpicRx->w(); int H = thorpicRx->h(); int slant = thorcnt_slant->value(); int vidsize = W * H; int index, rowptr, colptr; float ratio = (((float)vidsize - (float)slant)/(float)vidsize); unsigned char vid[W * H * 3]; for (int row = 0; row < H; row++) { rowptr = W * 3 * row * thor::IMAGEspp; for (int col = 0; col < W; col++) { colptr = thor::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = ratio*(rowptr + colptr + thor::IMAGEspp*W*rgb); index += RAWSTART - thor::IMAGEspp*thor_pixelptr; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = thor_rawvideo[index]; } } } thorpicRx->video(vid, W*H*3); } void thor_updateRxPic(unsigned char data, int pos) { if (!thorpicRxWin->shown()) thorpicRx->show(); thorpicRx->pixel(data, pos); int W = thorpicRx->w(); if (thor_image_type == 'F' || thor_image_type == 'p' || thor_image_type == 'm' || thor_image_type == 'l' || thor_image_type == 's' || thor_image_type == 'v') { int n = RAWSTART + thor::IMAGEspp*(thor_rawcol + W * (thor_rawrgb + 3 * thor_rawrow)); if (n < RAWSIZE) for (int i = 0; i < thor::IMAGEspp; i++) thor_rawvideo[n + i] = data; thor_rawrgb++; if (thor_rawrgb == 3) { thor_rawrgb = 0; thor_rawcol++; if (thor_rawcol == W) { thor_rawcol = 0; thor_rawrow++; } } } else for (int i = 0; i < thor::IMAGEspp; i++) thor_rawvideo[RAWSTART + thor::IMAGEspp*thor_numpixels + i] = data; thor_numpixels++; if (thor_numpixels >= (RAWSIZE - RAWSTART - thor::IMAGEspp)) thor_numpixels = RAWSIZE - RAWSTART - thor::IMAGEspp; } void cb_btnthorRxReset(Fl_Widget *, void *) { // progStatus.thor_rx_abort = true; } void thor_save_raw_video() { time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); char sztime[20]; strftime(sztime, sizeof(sztime), "%Y%m%d%H%M%Sz", &ztime); thor_fname.assign(PicsDir).append("THOR").append(sztime); FILE *raw = fl_fopen(string(thor_fname).append(".raw").c_str(), "wb"); fwrite(&thor_image_type, 1, 1, raw); fwrite(thor_rawvideo, 1, RAWSIZE, raw); fclose(raw); } void thor_load_raw_video() { // abort & close any Rx video processing int image_type = 0; string image_types = "TtSsLlFVvPpMm"; if (!thorpicRxWin) thor_createRxViewer(); else thorpicRxWin->hide(); const char *p = FSEL::select( _("Load raw image file"), "Image\t*.raw\n", PicsDir.c_str()); if (!p || !*p) return; thor_fname.assign(p); size_t p_raw = thor_fname.find(".raw"); if (p_raw != std::string::npos) thor_fname.erase(p_raw); FILE *raw = fl_fopen(p, "rb"); int numread = fread(&image_type, 1, 1, raw); if (numread != 1) { fclose(raw); return; } if (image_types.find(thor_image_type) != string::npos) { thor_showRxViewer(image_type); numread = fread(thor_rawvideo, 1, RAWSIZE, raw); if (numread == RAWSIZE) { thorcnt_phase->activate(); thorcnt_slant->activate(); btnthorRxSave->activate(); thor_correct_video(); thorpicRxWin->redraw(); } } fclose(raw); } void cb_btnthorRxSave(Fl_Widget *, void *) { thorpicRx->save_png(string(thor_fname).append(".png").c_str()); } void cb_btnthorRxClose(Fl_Widget *, void *) { thorpicRxWin->hide(); } void cb_thor_cnt_phase(Fl_Widget *, void *data) { thor_pixelptr = thorcnt_phase->value(); if (thor_pixelptr >= RAWSTART/thor::IMAGEspp) { thor_pixelptr = RAWSTART/thor::IMAGEspp - 1; thorcnt_phase->value(thor_pixelptr); } if (thor_pixelptr < -RAWSTART/thor::IMAGEspp) { thor_pixelptr = -RAWSTART/thor::IMAGEspp; thorcnt_phase->value(thor_pixelptr); } thor_correct_video(); } void cb_thor_cnt_slant(Fl_Widget *, void *) { thor_correct_video(); } void thor_disableshift() { if (!thorpicRxWin) return; thorcnt_phase->deactivate(); thorcnt_slant->deactivate(); btnthorRxSave->deactivate(); thorpicRxWin->redraw(); } void thor_enableshift() { if (!thorpicRxWin) return; thorcnt_phase->activate(); thorcnt_slant->activate(); btnthorRxSave->activate(); thor_save_raw_video(); thorpicRxWin->redraw(); } void thor_createRxViewer() { thorpicRxWin = new Fl_Double_Window(324, 274, _("thor Rx Image")); thorpicRxWin->xclass(PACKAGE_NAME); thorpicRxWin->begin(); thorpicRx = new picture(2, 2, 320, 240); thorpicRx->noslant(); Fl_Group *buttons = new Fl_Group(0, thorpicRxWin->h() - 26, thorpicRxWin->w(), 26, ""); buttons->box(FL_FLAT_BOX); btnthorRxReset = new Fl_Button(2, thorpicRxWin->h() - 26, 40, 24, "Reset"); btnthorRxReset->callback(cb_btnthorRxReset, 0); thorcnt_phase = new Fl_Counter(46, thorpicRxWin->h() - 24, 80, 20, ""); thorcnt_phase->step(1); thorcnt_phase->lstep(10); thorcnt_phase->minimum(-RAWSTART + 1); thorcnt_phase->maximum(RAWSTART - 1); thorcnt_phase->value(0); thorcnt_phase->callback(cb_thor_cnt_phase, 0); thorcnt_phase->tooltip(_("Phase correction")); thorcnt_slant = new Fl_Counter(140, thorpicRxWin->h() - 24, 80, 20, ""); thorcnt_slant->step(1); thorcnt_slant->lstep(10); thorcnt_slant->minimum(-200); thorcnt_slant->maximum(200); thorcnt_slant->value(0); thorcnt_slant->callback(cb_thor_cnt_slant, 0); thorcnt_slant->tooltip(_("Slant correction")); btnthorRxSave = new Fl_Button(226, thorpicRxWin->h() - 26, 45, 24, _("Save")); btnthorRxSave->callback(cb_btnthorRxSave, 0); btnthorRxClose = new Fl_Button(273, thorpicRxWin->h() - 26, 45, 24, _("Close")); btnthorRxClose->callback(cb_btnthorRxClose, 0); buttons->end(); thorpicRxWin->end(); thorpicRxWin->resizable(thorpicRx); thor_numpixels = 0; } void thor_showRxViewer(char itype) { int W = 320; int H = 240; switch (itype) { case 'L' : case 'l' : W = 320; H = 240; break; case 'S' : case 's' : W = 160; H = 120; break; case 'V' : case 'F' : W = 640; H = 480; break; case 'P' : case 'p' : W = 240; H = 300; break; case 'M' : case 'm' : W = 120; H = 150; break; case 'T' : W = 59; H = 74; break; } if (!thorpicRxWin) thor_createRxViewer(); int winW, winH; int thorpicX, thorpicY; winW = W < 320 ? 324 : W + 4; winH = H < 240 ? 274 : H + 34; thorpicX = (winW - W) / 2; thorpicY = (winH - 30 - H) / 2; thorpicRxWin->size(winW, winH); thorpicRx->resize(thorpicX, thorpicY, W, H); thorpicRxWin->init_sizes(); thorpicRx->clear(); thorpicRxWin->show(); thor_disableshift(); if (thor_rawvideo == 0) thor_rawvideo = new unsigned char [RAWSIZE + 1]; memset(thor_rawvideo, 0, RAWSIZE); thor_numpixels = 0; thor_pixelptr = 0; thor_rawrow = thor_rawrgb = thor_rawcol = 0; thor_image_type = itype; } void thor_clear_rximage() { thorpicRx->clear(); thor_disableshift(); translate = 0; enabled = false; thor_numpixels = 0; thor_pixelptr = 0; thorcnt_phase->value(0); thorcnt_slant->value(0); thor_rawrow = thor_rawrgb = thor_rawcol = 0; } //------------------------------------------------------------------------------ // image transmit functions //------------------------------------------------------------------------------ void thor_load_scaled_image(std::string fname, bool gray) { if (!thorpicTxWin) thor_createTxViewer(); int D = 0; unsigned char *img_data; int W = 160; int H = 120; int winW = 644; int winH = 512; int thorpicX = 0; int thorpicY = 0; string picmode = "pic% \n"; if (thorTxImg) { thorTxImg->release(); thorTxImg = 0; } thorTxImg = Fl_Shared_Image::get(fname.c_str()); if (!thorTxImg) return; int iW = thorTxImg->w(); int iH = thorTxImg->h(); int aspect = 0; if (iW > iH ) { if (iW >= 640) { W = 640; H = 480; winW = 644; winH = 484; aspect = 5; picmode[4] = 'V'; if (gray) { picmode[4] = 'F'; } } else if (iW >= 320) { W = 320; H = 240; winW = 324; winH = 244; aspect = 4; picmode[4] = 'L'; if (gray) { picmode[4] = 'l'; } } else { W = 160; H = 120; winW = 164; winH = 124; aspect = 3; picmode[4] = 'S'; if (gray) { picmode[4] = 's'; } } } else { if (iH >= 300) { W = 240; H = 300; winW = 244; winH = 304; aspect = 2; picmode[4] = 'P'; if (gray) { picmode[4] = 'p'; } } else if (iH >= 150) { W = 120; H = 150; winW = 124; winH = 154; aspect = 1; picmode[4] = 'M'; if (gray) { picmode[4] = 'm'; } } else { W = 59; H = 74; winW = 67; winH = 82; aspect = 0; picmode[4] = 'T'; if (gray) { aspect = 0; picmode[4] = 't'; } } } { Fl_Image *temp; selthorpicSize->value(aspect); temp = thorTxImg->copy(W, H); thorTxImg->release(); thorTxImg = (Fl_Shared_Image *)temp; } if (thorTxImg->count() > 1) { thorTxImg->release(); thorTxImg = 0; return; } thorpicTx->hide(); thorpicTx->clear(); img_data = (unsigned char *)thorTxImg->data()[0]; D = thorTxImg->d(); if (thorxmtimg) delete [] thorxmtimg; thorxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(thorxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; thorxmtimg[j] = img_data[k]; thorxmtimg[j+1] = img_data[k+1]; thorxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; thorxmtimg[j] = thorxmtimg[j+1] = thorxmtimg[j+2] = img_data[i]; } } else return; char* label = strdup(fname.c_str()); thorpicTxWin->copy_label(basename(label)); free(label); // load the thorpicture widget with the rgb image thorpicTxWin->size(winW, winH); thorpicX = (winW - W) / 2; thorpicY = (winH - H) / 2; thorpicTx->resize(thorpicX, thorpicY, W, H); selthorpicSize->hide(); btnthorpicTransmit->hide(); btnthorpicTxLoad->hide(); btnthorpicTxClose->hide(); btnthorpicTxSendAbort->hide(); thorpicTx->video(thorxmtimg, W * H * 3); thorpicTx->show(); thorpicTxWin->show(); active_modem->thor_send_image(picmode, gray); return; } int thor_load_image(const char *n) { int D = 0; unsigned char *img_data; int W = 640; int H = 480; switch (selthorpicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } if (thorTxImg) { thorTxImg->release(); thorTxImg = 0; } thorTxImg = Fl_Shared_Image::get(n, W, H); if (!thorTxImg) return 0; if (thorTxImg->count() > 1) { thorTxImg->release(); thorTxImg = 0; return 0; } thorpicTx->hide(); thorpicTx->clear(); img_data = (unsigned char *)thorTxImg->data()[0]; D = thorTxImg->d(); if (thorxmtimg) delete [] thorxmtimg; thorxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(thorxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; thorxmtimg[j] = img_data[k]; thorxmtimg[j+1] = img_data[k+1]; thorxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; thorxmtimg[j] = thorxmtimg[j+1] = thorxmtimg[j+2] = img_data[i]; } } else return 0; char* label = strdup(n); thorpicTxWin->copy_label(basename(label)); free(label); // load the thorpicture widget with the rgb image thorpicTx->show(); thorpicTxWin->redraw(); thorpicTx->video(thorxmtimg, W * H * 3); btnthorpicTransmit->activate(); return 1; } void thor_updateTxPic(unsigned char data, int pos) { if (!thorpicTxWin->shown()) thorpicTx->show(); thorpicTx->pixel(data, pos); } void cb_thorpicTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); if (!fn) return; if (!*fn) return; thor_load_image(fn); } void thor_clear_tximage() { thorpicTx->clear(); } void cb_thorpicTxClose( Fl_Widget *w, void *) { thorpicTxWin->hide(); } int thorpic_TxGetPixel(int pos, int color) { return thorxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} } void cb_thorpicTransmit( Fl_Widget *w, void *) { std::string header = "pic% "; bool grey = btnthorTxGrey->value(); char ch = ' '; switch (selthorpicSize->value()) { case 0 : thor_showTxViewer(ch = (grey ? 't' : 'T')); break; // 59 x 74 case 1 : thor_showTxViewer(ch = (grey ? 'm' : 'M')); break; // 120 x 150 case 2 : thor_showTxViewer(ch = (grey ? 'p' : 'P')); break; // 240 x 300 case 3 : thor_showTxViewer(ch = (grey ? 's' : 'S')); break; // 160 x 120 case 4 : thor_showTxViewer(ch = (grey ? 'l' : 'L')); break; // 320 x 240 case 5 : thor_showTxViewer(ch = (grey ? 'F' : 'V')); break; // 640 x 480 } header[4] = ch; active_modem->thor_send_image(header, grey); } void cb_thorpicTxSendAbort( Fl_Widget *w, void *) { } void cb_selthorpicSize( Fl_Widget *w, void *) { switch (selthorpicSize->value()) { case 0 : thor_showTxViewer('T'); break; // 59 x 74 case 1 : thor_showTxViewer('M'); break; // 120 x 150 case 2 : thor_showTxViewer('P'); break; // 240 x 300 case 3 : thor_showTxViewer('S'); break; // 160 x 120 case 4 : thor_showTxViewer('L'); break; // 320 x 240 case 5 : thor_showTxViewer('V'); break; // 640 x 480 } } void thor_createTxViewer() { thorpicTxWin = new Fl_Double_Window(324, 270, _("thor Send image")); thorpicTxWin->xclass(PACKAGE_NAME); thorpicTxWin->begin(); thorpicTx = new picture (2, 2, 320, 240); thorpicTx->noslant(); thorpicTx->hide(); selthorpicSize = new Fl_Choice(5, 244, 90, 24); selthorpicSize->add("59 x 74"); selthorpicSize->add("120x150"); selthorpicSize->add("240x300"); selthorpicSize->add("160x120"); selthorpicSize->add("320x240"); selthorpicSize->add("640x480"); selthorpicSize->value(1); selthorpicSize->callback(cb_selthorpicSize, 0); btnthorTxGrey = new Fl_Check_Button(99, 247, 18, 18); btnthorTxGrey->value(0); btnthorTxGrey->tooltip(_("Check for grey image")); btnthorpicTxLoad = new Fl_Button(133, 244, 60, 24, _("Load")); btnthorpicTxLoad->callback(cb_thorpicTxLoad, 0); btnthorpicTransmit = new Fl_Button(thorpicTxWin->w() - 130, 244, 60, 24, "Xmt"); btnthorpicTransmit->callback(cb_thorpicTransmit, 0); btnthorpicTxSendAbort = new Fl_Button(thorpicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); btnthorpicTxSendAbort->callback(cb_thorpicTxSendAbort, 0); btnthorpicTxClose = new Fl_Button(thorpicTxWin->w() - 65, 244, 60, 24, _("Close")); btnthorpicTxClose->callback(cb_thorpicTxClose, 0); btnthorpicTxSendAbort->hide(); btnthorpicTransmit->deactivate(); thorpicTxWin->end(); } void thor_showTxViewer(char c) { if (!thorpicTxWin) thor_createTxViewer(); int winW = 644, winH = 512, W = 480, H = 320; int thorpicX, thorpicY; thorpicTx->clear(); switch (c) { case 'T' : case 't' : W = 59; H = 74; winW = 324; winH = 184; selthorpicSize->value(0); break; case 'S' : case 's' : W = 160; H = 120; winW = 324; winH = 154; selthorpicSize->value(3); break; case 'L' : case 'l' : W = 320; H = 240; winW = 324; winH = 274; selthorpicSize->value(4); break; case 'F' : case 'V' : W = 640; H = 480; winW = 644; winH = 514; selthorpicSize->value(5); break; case 'P' : case 'p' : W = 240; H = 300; winW = 324; winH = 334; selthorpicSize->value(2); break; case 'M' : case 'm' : W = 120; H = 150; winW = 324; winH = 184; selthorpicSize->value(1); break; } thorpicTxWin->size(winW, winH); thorpicX = (winW - W) / 2; thorpicY = (winH - 26 - H) / 2; thorpicTx->resize(thorpicX, thorpicY, W, H); selthorpicSize->resize(5, winH - 26, 90, 24); btnthorTxGrey->resize(selthorpicSize->x() + selthorpicSize->w() + 4, winH - 23, 18, 18); btnthorpicTxLoad->resize(btnthorTxGrey->x() + btnthorTxGrey->w() + 4, winH - 26, 60, 24); btnthorpicTransmit->resize(winW - 130, winH - 26, 60, 24); btnthorpicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); btnthorpicTxClose->resize(winW -65, winH - 26, 60, 24); selthorpicSize->show(); btnthorpicTransmit->show(); btnthorpicTxLoad->show(); btnthorpicTxClose->show(); btnthorpicTxSendAbort->hide(); thorpicTxWin->show(); } void thor_deleteTxViewer() { if (thorpicTxWin) thorpicTxWin->hide(); if (thorpicTx) { delete thorpicTx; thorpicTx = 0; } delete [] thorxmtimg; thorxmtimg = 0; delete [] thorxmtpicbuff; thorxmtpicbuff = 0; if (thorpicTxWin) delete thorpicTxWin; thorpicTxWin = 0; } void thor_deleteRxViewer() { if (thorpicRxWin) thorpicRxWin->hide(); if (thorpicRx) { delete thorpicRx; thorpicRx = 0; } if (thorpicRxWin) { delete thorpicRxWin; thorpicRxWin = 0; } } int thor_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } // ----------------------------------------------------------------------------- // avatar send/recv // ----------------------------------------------------------------------------- static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; static unsigned char *avatar_img = (unsigned char *)0; static Fl_Shared_Image *my_avatar_img = (Fl_Shared_Image *)0; static int avatar_phase_correction = 0; static unsigned char avatar[59 * 74 * 3]; void thor_clear_avatar() { thor_avatar->clear(); avatar_phase_correction = 0; thor_numpixels = 0; thor_rawrow = thor_rawrgb = thor_rawcol = 0; thor_avatar->video(tux_img, 59 * 74 * 3); } // W always 59, H always 74 int thor_load_avatar(std::string image_fname, int W, int H) { W = 59; H = 74; if (image_fname.empty()) { thor_clear_avatar(); return 1; } int D = 0; unsigned char *img_data; if (shared_avatar_img) { shared_avatar_img->release(); shared_avatar_img = 0; } for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); FILE *temp = fl_fopen(fname.c_str(), "rb"); if (temp) { fseek(temp, 0L, SEEK_SET); fclose(temp); } else { thor_avatar->video(tux_img, W * H * 3); return 1; } shared_avatar_img = Fl_Shared_Image::get(fname.c_str(), W, H); // force image to be retrieved from hard drive vice shared image memory shared_avatar_img->reload(); if (!shared_avatar_img) { thor_avatar->video(tux_img, W * H * 3); return 1; } if (shared_avatar_img->count() > 1) { shared_avatar_img->release(); shared_avatar_img = 0; thor_avatar->video(tux_img, W * H * 3); return 0; } img_data = (unsigned char *)shared_avatar_img->data()[0]; D = shared_avatar_img->d(); if (avatar_img) delete [] avatar_img; avatar_img = new unsigned char [W * H * 3]; if (D == 3) memcpy(avatar_img, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; avatar_img[j] = img_data[k]; avatar_img[j+1] = img_data[k+1]; avatar_img[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; avatar_img[j] = avatar_img[j+1] = avatar_img[j+2] = img_data[i]; } } else { thor_avatar->video(tux_img, W * H * 3); return 0; } thor_avatar->video(avatar_img, W * H * 3); shared_avatar_img->release(); shared_avatar_img = 0; return 1; } void thor_correct_avatar() { int W = 59; int H = 74; int index, rowptr, colptr; unsigned char vid[W * H * 3]; if (avatar_phase_correction >= RAWSTART/thor::IMAGEspp) { avatar_phase_correction = RAWSTART/thor::IMAGEspp - 1; } if (avatar_phase_correction < -RAWSTART/thor::IMAGEspp) { avatar_phase_correction = -RAWSTART/thor::IMAGEspp; } for (int row = 0; row < H; row++) { rowptr = W * 3 * row * thor::IMAGEspp; for (int col = 0; col < W; col++) { colptr = thor::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = rowptr + colptr + W*rgb*thor::IMAGEspp; index += RAWSTART - thor::IMAGEspp * avatar_phase_correction; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = thor_rawvideo[index]; } } } thor_avatar->video(vid, W*H*3); } void thor_update_avatar(unsigned char data, int pos) { if (thor_rawvideo == 0) { thor_rawvideo = new unsigned char [RAWSIZE + 1]; memset(thor_rawvideo, 0, RAWSIZE); } thor_avatar->pixel(data, pos); for (int i = 0; i < thor::IMAGEspp; i++) thor_rawvideo[RAWSTART + thor::IMAGEspp*thor_numpixels + i] = data; thor_numpixels++; if (thor_numpixels >= (RAWSIZE - RAWSTART - thor::IMAGEspp)) thor_numpixels = RAWSIZE - RAWSTART - thor::IMAGEspp; } int thor_get_avatar_pixel(int pos, int color) { // color = {RED, GREEN, BLUE} return (int)avatar[3*pos + color]; } // ADD CALLBACK HANDLING OF PHASE CORRECTIONS void cb_thor_send_avatar( Fl_Widget *w, void *) { if (Fl::event_button() == FL_RIGHT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (thor_numpixels == 0) return; avatar_phase_correction += 5; thor_correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (thor_numpixels == 0) return; avatar_phase_correction++; thor_correct_avatar(); return; } std::string mycall = progdefaults.myCall; for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; fname.append(mycall).append(".png"); my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); if (!my_avatar_img) return; unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59*74*3); else if (D == 4) { int i, j, k; for (i = 0; i < 59*74; i++) { j = i*3; k = i*4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59*74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else return; thor::avatarheader = "\npic%A"; active_modem->thor_send_avatar(); return; } if (Fl::event_button() == FL_LEFT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (thor_numpixels == 0) return; avatar_phase_correction -= 5; thor_correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (thor_numpixels == 0) return; avatar_phase_correction--; thor_correct_avatar(); return; } std::string mycall = inpCall->value(); if (mycall.empty()) return; for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; fname.append(mycall).append(".png"); thor_avatar->save_png(fname.c_str()); } } fldigi-4.1.06/src/thor/thor.cxx0000644000175000017500000010526213472115777013250 00000000000000// ---------------------------------------------------------------------------- // thor.cxx -- thor modem // // Copyright (C) 2008-2012 // David Freese // John Douyere // John Phelps // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "confdialog.h" #include "status.h" #include "thor.h" #include "trx.h" #include "fl_digi.h" #include "filters.h" #include "misc.h" #include "sound.h" #include "thorvaricode.h" #include "ascii.h" #include "main.h" #include "debug.h" // Enable to enable profiling output for the soft-decision decoder #define SOFTPROFILE false //#define SOFTPROFILE true using namespace std; char thormsg[80]; char confidence[80]; #include "thor-pic.cxx" void thor::tx_init() { txstate = TX_STATE_PREAMBLE; txprevtone = 0; bitstate = 0; counter = 0; txphase = 0; videoText(); strSecXmtText = progdefaults.THORsecText; if (strSecXmtText.length() == 0) strSecXmtText = "fldigi " PACKAGE_VERSION " "; cptr = 0; } void thor::rx_init() { synccounter = 0; symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; phase[0] = 0.0; currmag = prev1mag = prev2mag = 0.0; // avgsig = 1e-20; for (int i = 0; i < THORMAXFFTS; i++) phase[i+1] = 0.0; put_MODEstatus(mode); put_sec_char(0); syncfilter->reset(); datashreg = 1; sig = noise = 6; fec_confidence = 0; s2n_valid = false; txstate = TX_STATE_RECEIVE; state = TEXT; pic_str = " "; img_phase = 0.0; } void thor::reset_filters() { //LOG_INFO("%s", "Reset filters"); // fft filter at first IF frequency if (fft) fft->create_filter( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate, (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate ); for (int i = 0; i < THORMAXFFTS; i++) if (binsfft[i]) { delete binsfft[i]; binsfft[i] = 0; } if (slowcpu) { extones = 4; paths = THORSLOWPATHS; } else { extones = THORNUMTONES / 2; paths = THORFASTPATHS; } lotone = basetone - extones * doublespaced; hitone = basetone + THORNUMTONES * doublespaced + extones * doublespaced; numbins = hitone - lotone; //LOG_INFO("MAX ARRAY SIZE %d, paths %d, numbins %d, array_size %d", MAXPATHS, paths, numbins, numbins * paths); for (int i = 0; i < paths; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = new sfft (symlen, lotone, hitone); } //LOG_INFO("binsfft(%d) initialized", paths); for (int i = 0; i < THORSCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; vidfilter[i] = new Cmovavg(16); } //LOG_INFO("vidfilter(%d) initialized", THORSCOPESIZE); if (syncfilter) delete syncfilter; syncfilter = new Cmovavg(8); //LOG_INFO("%s", "syncfilter initialized"); filter_reset = false; } void thor::restart() { filter_reset = true; } void thor::init() { //LOG_INFO("%s", "thor::init"); modem::init(); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); // reset_filters(); rx_init(); imageheader.clear(); avatarheader.clear(); set_scope_mode(Digiscope::DOMDATA); } thor::~thor() { if (hilbert) delete hilbert; for (int i = 0; i < THORMAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; } for (int i = 0; i < THORSCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; if (pipe) delete [] pipe; if (fft) delete fft; if (Rxinlv) delete Rxinlv; if (Txinlv) delete Txinlv; if (Dec) delete Dec; if (Enc) delete Enc; delete picfilter; delete pixfilter; delete pixsyncfilter; activate_thor_image_item(false); } thor::thor(trx_mode md) : hilbert(0), fft(0), filter_reset(false) { cap |= CAP_REV; mode = md; int isize = 4; int idepth = 10; flushlength = 4; switch (mode) { // 11.025 kHz modes case MODE_THOR5: symlen = 2048; doublespaced = 2; samplerate = 11025; break; case MODE_THOR11: cap |= CAP_IMG; symlen = 1024; doublespaced = 1; samplerate = 11025; break; case MODE_THOR22: cap |= CAP_IMG; symlen = 512; doublespaced = 1; samplerate = 11025; break; // 8kHz modes case MODE_THORMICRO: symlen = 4000; doublespaced = 1; samplerate = 8000; idepth = 4; break; case MODE_THOR4: symlen = 2048; doublespaced = 2; samplerate = 8000; break; case MODE_THOR8: symlen = 1024; doublespaced = 2; samplerate = 8000; break; case MODE_THOR25x4: symlen = 320; doublespaced = 4; samplerate = 8000; idepth = 50; // 2 sec interleave flushlength = 40; break; case MODE_THOR50x1: symlen = 160; doublespaced = 1; samplerate = 8000; idepth = 50; // 1 sec interleave flushlength = 40; break; case MODE_THOR50x2: symlen = 160; doublespaced = 2; samplerate = 8000; idepth = 50; // 1 sec interleave flushlength = 40; break; case MODE_THOR100: symlen = 80; doublespaced = 1; samplerate = 8000; idepth = 50; // 0.5 sec interleave flushlength = 40; break; case MODE_THOR16: default: cap |= CAP_IMG; symlen = 512; doublespaced = 1; samplerate = 8000; } tonespacing = 1.0 * samplerate * doublespaced / symlen; bandwidth = THORNUMTONES * tonespacing; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); // fft filter at first if frequency fft = new fftfilt( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate, (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate, 1024 ); basetone = (int)floor(THORBASEFREQ * symlen / samplerate + 0.5); slowcpu = progdefaults.slowcpu; for (int i = 0; i < THORMAXFFTS; i++) binsfft[i] = 0; for (int i = 0; i < THORSCOPESIZE; i++) vidfilter[i] = 0; syncfilter = 0; reset_filters(); twosym = 2 * symlen; pipe = new THORrxpipe[twosym]; scopedata.alloc(THORSCOPESIZE); videodata.alloc(THORMAXFFTS * numbins ); pipeptr = 0; symcounter = 0; metric = 0.0; fragmentsize = symlen; s2n = 0.0; prev1symbol = prev2symbol = 0; prev1symbol = prev2symbol = 0; if ( mode == MODE_THOR100 || mode == MODE_THOR50x1 || mode == MODE_THOR50x2 || mode == MODE_THOR25x4 ) { Enc = new encoder (THOR_K15, K15_POLY1, K15_POLY2); Dec = new viterbi (THOR_K15, K15_POLY1, K15_POLY2); Dec->settraceback (15 * 12); // Long constraint length codes require longer traceback } else { Enc = new encoder (THOR_K, THOR_POLY1, THOR_POLY2); Dec = new viterbi (THOR_K, THOR_POLY1, THOR_POLY2); Dec->settraceback (45); } Txinlv = new interleave (isize, idepth, INTERLEAVE_FWD); Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); Dec->setchunksize (1); bitstate = 0; symbolpair[0] = symbolpair[1] = 0; datashreg = 1; picfilter = new C_FIR_filter(); picfilter->init_lowpass(257, 1, 1.0 * bandwidth / samplerate); IMAGEspp = THOR_IMAGESPP; pixfilter = new Cmovavg(IMAGEspp); pixsyncfilter = new Cmovavg(IMAGEspp * 2);//3*IMAGEspp); init(); activate_thor_image_item(true); } //===================================================================== // rx modules cmplx thor::mixer(int n, const cmplx& in) { double f; // first IF mixer (n == 0) plus // THORMAXFFTS mixers are supported each separated by 1/THORMAXFFTS bin size // n == 1, 2, 3, 4 ... THORMAXFFTS if (n == 0) f = frequency - THORFIRSTIF; else f = THORFIRSTIF - THORBASEFREQ - bandwidth*0.5 + (samplerate / symlen) * ( (double)n / paths); cmplx z( cos(phase[n]), sin(phase[n]) ); z *= in; phase[n] -= TWOPI * f / samplerate; if (phase[n] < 0) phase[n] += TWOPI; return z; } void thor::s2nreport(void) { modem::s2nreport(); s2n_valid = false; } void thor::parse_pic(int ch) { pic_str.erase(0,1); pic_str += ch; b_ava = false; image_mode = 0; if (pic_str.find("pic%") == 0) { switch (pic_str[4]) { case 'A': picW = 59; picH = 74; b_ava = true; break; case 'T': picW = 59; picH = 74; break; case 't': picW = 59; picH = 74; image_mode = 1; break; case 'S': picW = 160; picH = 120; break; case 's': picW = 160; picH = 120; image_mode = 1; break; case 'L': picW = 320; picH = 240; break; case 'l': picW = 320; picH = 240; image_mode = 1; break; case 'V': picW = 640; picH = 480; break; case 'v': picW = 640; picH = 480; image_mode = 1; break; case 'F': picW = 640; picH = 480; image_mode = 1; break; case 'P': picW = 240; picH = 300; break; case 'p': picW = 240; picH = 300; image_mode = 1; break; case 'M': picW = 120; picH = 150; break; case 'm': picW = 120; picH = 150; image_mode = 1; break; default: return; } } else return; if (b_ava) REQ( thor_clear_avatar ); else REQ( thor_showRxViewer, pic_str[4]); image_counter = -symlen / 2; col = row = rgb = 0; pixsyncfilter->reset(); pixfilter->reset(); state = IMAGE_START; } void thor::recvchar(int c) { if (c == -1) return; if (c & 0x100) put_sec_char(c & 0xFF); else { parse_pic(c); put_rx_char(c & 0xFF); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { if (((c & 0xFF) == SOH) && !s2n_valid) { // starts collecting s2n from first SOH in stream (since start of RX) s2n_valid = true; s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } if (s2n_valid) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if ((c & 0xFF) == EOT) s2nreport(); } } } } //============================================================================= // Receive //============================================================================= void thor::decodePairs(unsigned char symbol) { int c, ch, met; symbolpair[0] = symbolpair[1]; symbolpair[1] = symbol; symcounter = symcounter ? 0 : 1; if (symcounter) return; c = Dec->decode (symbolpair, &met); if (c == -1) return; if(met < 255 / 2) fec_confidence -= 2 + fec_confidence / 2; else fec_confidence += 2; if (fec_confidence < 0) fec_confidence = 0; if (fec_confidence > 100) fec_confidence = 100; if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; datashreg = (datashreg << 1) | !!c; if ((datashreg & 7) == 1) { ch = thorvaridec(datashreg >> 1); recvchar(ch); //LOG_INFO("thorvaridec %X = %d", datashreg >> 1, ch); datashreg = 1; } } void thor::decodesymbol() { int c; double fdiff;//, softmag; unsigned char symbols[4]; bool outofrange = false; // Decode the IFK+ sequence, which results in a single nibble fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= paths; fdiff /= doublespaced; if (fabs(fdiff) > 17) outofrange = true; c = (int)floor(fdiff + .5); { if (progdefaults.THOR_PREAMBLE) { if ( preambledetect(c) ) { softflushrx(); // Flush the soft rx pipeline with punctures (interleaver & viterbi decoder) return; } } } c -= 2; if (c < 0) c += THORNUMTONES; if (staticburst == true || outofrange == true) // puncture the code symbols[3] = symbols[2] = symbols[1] = symbols[0] = 128; else { symbols[3] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[2] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[1] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[0] = (c & 1) == 1 ? 255 : 0; c /= 2; } Rxinlv->symbols(symbols); for (int i = 0; i < 4; i++) decodePairs(symbols[i]); } void thor::softdecodesymbol() { unsigned char one, zero; int c, nextmag=127, rawdoppler=0; static int lastc=0, lastmag=0, nowmag=0, prev1rawdoppler=0; static double lastdoppler=0, nowdoppler=0; unsigned char lastsymbols[4]; bool outofrange=false; double fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= paths; fdiff /= doublespaced; c = (int)floor(fdiff + .5); { if (c < -16 || 0 == c || 1 == c || c > 17) outofrange = true; // Out of the range of the function thor::sendsymbol() if (progdefaults.THOR_PREAMBLE) { if ( preambledetect(c) ) { softflushrx(); // Flush the soft rx pipeline with punctures (interleaver & viterbi decoder) lastmag = 0; return; } } #if SOFTPROFILE LOG_INFO("Symbol: %3d; DELTAf: +%3d",currsymbol, c); #endif } c -= 2; if (c < 0) c += THORNUMTONES; // Calculate soft-doppler / frequency-error of the symbol // For a perfect & undistorted symbol, rawdoppler will == 0 (be a perfect multiple of paths*doublespaced) rawdoppler = (currsymbol - prev1symbol) % (paths * doublespaced) ; #if SOFTPROFILE LOG_INFO("Raw Doppler: %3d", rawdoppler); #endif if ( 0 == rawdoppler) nowdoppler = 1.0f; // Perfect symbol: assign probability = 100% else { // Detect modem "de-sync + immediate re-sync" events and reverse the incurred soft-penalty // Probability of these events increases as baudrate increases if ( -1 * prev1rawdoppler == rawdoppler) { rawdoppler = 0; lastdoppler = 1.0f; } // calculate the nowdoppler soft-value as a probability >= 50% // centering the "50% confidence point" directly between two symbols. if ( abs(rawdoppler) <= paths * doublespaced / 2 ) nowdoppler = 1.0 - ((1.0 / (paths * doublespaced)) * abs(rawdoppler)) ; else nowdoppler = 0.0 + ((1.0 / (paths * doublespaced)) * abs(rawdoppler)) ; } prev1rawdoppler = rawdoppler; // save raw-value for comparison on next run #if SOFTPROFILE LOG_INFO("Doppler Confidence: %3.1f", nowdoppler); #endif // Since the THOR modem is differential, when an outofrange error occurs // there are 2 possibilities: // . either previous (reference) symbol or current with a 50% // probability of each being the culprit. // Either way, the current symbol is lost, puncture it. There is also a // 50% probability the next symbol will have an error if (outofrange){ lastmag /= 2; nowmag = 0; nextmag /= 2; } // O is puncture/null-symbol from softdecode if (0 == currsymbol) { nowmag = 0; nextmag = 0; } // puncture while squelched if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) nowmag = 0; // One in 16 chance the correct reference tone chosen in staticburst if (staticburst){ nowmag /= 16; nextmag /= 16; } // Apply the soft-doppler probability to the previous symbol's soft-magnitude lastmag *= lastdoppler; if (lastmag <= 0) { // puncture one = 128; zero = 128; } else if (lastmag > 127) { // limit one = 255; zero = 0; } else { // Calculate soft bits one = static_cast( lastmag+128 ); // never > 255 zero = static_cast( 127-lastmag ); // never < 0 } #if SOFTPROFILE if (outofrange) LOG_INFO("%s","outofrange"); if (staticburst) LOG_INFO("%s","staticburst"); LOG_INFO("next mag %.3d | now mag %.3d | last mag %.3d \n",nextmag, nowmag, lastmag); #endif lastsymbols[3] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[2] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[1] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[0] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; Rxinlv->symbols(lastsymbols); for (int i = 0; i < 4; i++) decodePairs(lastsymbols[i]); // Since modem is differential, wait until next symbol (to detect errors) // then decode. lastc = c; lastmag = nowmag; nowmag = nextmag; lastdoppler = nowdoppler; } int thor::harddecode() { double x, max = 0.0; int symbol = 0; double avg = 0.0; static bool cwi[MAXPATHS]; //[paths * numbins]; double cwmag; for (int i = 0; i < MAXPATHS; i++) cwi[i] = false; for (int i = 0; i < paths * numbins; i++) avg += abs(pipe[pipeptr].vector[i]); avg /= (paths * numbins); if (avg < 1e-10) avg = 1e-10; int numtests = 10; int count = 0; for (int i = 0; i < paths * numbins; i++) { cwmag = 0.0; count = 0; for (int j = 1; j <= numtests; j++) { int p = pipeptr - j; if (p < 0) p += twosym; cwmag = abs(pipe[j].vector[i])/numtests; if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++; } cwi[i] = (count == numtests); } for (int i = 0; i < paths * numbins ; i++) { if (cwi[i] == false) { x = abs(pipe[pipeptr].vector[i]); if (x > max) { max = x; symbol = i; } } else LOG_DEBUG("cwi detected in bin %d", i); } staticburst = (max / avg < 1.2); return symbol; } int thor::softdecode() { static bool lastCWI[MAXPATHS] = {false}; static bool nextCWI[MAXPATHS] = {false}; static const int SoftBailout=6; // Max number of attempts to get a valid symbol double x, max = 0.0, avg = 0.0; int symbol = 0; int avgcount = 0; int soft_symbol_trycount=0; int lowest_tone = 0; int highest_tone = paths * numbins; // Clear nextCWI bool array for this run for (int i = 0; i < MAXPATHS; i++) nextCWI[i] = false; // for (int i = lowest_tone; i < highest_tone; i++) nextCWI[i] = false; // Allow for case where symbol == prev2symbol (before calculating signal average...) if (prev2symbol && (prev2symbol < MAXPATHS - 1)) // array bounds checking lastCWI[prev2symbol-1] = lastCWI[prev2symbol] = lastCWI[prev2symbol+1] = false; // Constrict the tone set further so CWI detect & set does not go out of intended range lowest_tone += 1; highest_tone -= 1; // Calculate signal average, ignoring CWI signals for (int i = lowest_tone; i < highest_tone; i++) { if ( !lastCWI[i] ) { avg += abs(pipe[pipeptr].vector[i]); avgcount++; } } avg /= avgcount; if (avg < 1e-10) avg = 1e-10; // Run symbol-decoder until a non-CWI && non-Repeated symbol is selected do { soft_symbol_trycount++; max = 0.0; for (int i = lowest_tone; i < highest_tone; i++) { x = abs(pipe[pipeptr].vector[i]); if ( x > max && !nextCWI[i-1] && !nextCWI[i] && !nextCWI[i+1] ) { max = x; symbol = i; } } if (symbol && (symbol < MAXPATHS - 1)) { // array bounds checking // detect repeated symbols (an invalid pattern for IFK+ modems) if ( abs(prev1symbol - symbol) < paths ) { nextCWI[symbol-1] = nextCWI[symbol] = nextCWI[symbol+1] = true; } // Update the next CWI mask if the tone from last-run persists else if ( lastCWI[symbol-1] || lastCWI[symbol] || lastCWI[symbol+1] ) { nextCWI[symbol-1] = nextCWI[symbol] = nextCWI[symbol+1] = true; } } } while ( nextCWI[symbol] && soft_symbol_trycount < SoftBailout ); // Run while the detected symbol has been identified as CWI (alt: bailout after 6 trys) // Copy the newly-detected CWI mask to the static lastCWI array for use on next function call for (int i = lowest_tone-1; i < highest_tone+1; i++) lastCWI[i] = nextCWI[i]; staticburst = (max / avg < 1.2); // Return a NULL / Puncture symbol if a bailout occured if (soft_symbol_trycount >= SoftBailout) return 0; else return symbol; } bool thor::preambledetect(int c) { static int preamblecheck=0, twocount=0; static bool neg16seen=false; if (twocount > 14 ) twocount = 0; if (-16 == c && twocount > 2 ) neg16seen = true; // 2 does not reset the neg16seen bool else if (2 != c) neg16seen = false; else if (2 == c) twocount ++; // -16 does not reset the twos counter if (-16 != c && 2 != c) if (twocount > 1) twocount -= 2; #if SOFTPROFILE LOG_INFO("[2count:pcheck] [%d:%d]",twocount, preamblecheck); #endif if ( twocount > 4 && neg16seen ){ if ( ++preamblecheck > 4 ) return true; } else preamblecheck = 0; return false; } // Flush the interleaver and convolutional decoder with punctures void thor::softflushrx() { #if SOFTPROFILE LOG_INFO("%s", "softflushrx()"); #endif unsigned char puncture[2], flushsymbols[4]; puncture[0]=128; puncture[1]=128; for (int i = 0; i < 4; i++) flushsymbols[i] = 128; // flush interleaver with punctured symbols for(int i = 0; i < 90; i++) Rxinlv->symbols(flushsymbols); // flush viterbi with puncture soft-bits for (int j = 0; j < 128; j++) Dec->decode (puncture, NULL); } void thor::update_syncscope() { double max = 0, min = 1e6, range, mag; memset(videodata, 0, paths * numbins * sizeof(double)); //LOG_INFO("%s", "cleared videodata"); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (int i = 0; i < paths * numbins; i++ ) { mag = abs(pipe[pipeptr].vector[i]); if (max < mag) max = mag; if (min > mag) min = mag; } range = max - min; for (int i = 0; i < paths * numbins; i++ ) { if (range > 2) { mag = (abs(pipe[pipeptr].vector[i]) - min) / range + 0.0001; mag = 1 + 2 * log10(mag); if (mag < 0) mag = 0; } else mag = 0; videodata[(i + paths * numbins / 2)/2] = 255*mag; } } set_video(videodata, paths * numbins, false); videodata.next(); memset(scopedata, 0, THORSCOPESIZE * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (unsigned int i = 0, j = 0; i < THORSCOPESIZE; i++) { j = (pipeptr + i * twosym / THORSCOPESIZE + 1) % (twosym); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } } set_scope(scopedata, THORSCOPESIZE); scopedata.next(); } void thor::synchronize() { double syn = -1; double val, max = 0.0; if (staticburst == true) return; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; for (unsigned int i = 0, j = pipeptr; i < twosym; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % twosym; } syn = syncfilter->run(syn); synccounter += (int) floor(1.0 * (syn - symlen) / THORNUMTONES + 0.5); update_syncscope(); } void thor::eval_s2n() { double s = abs(pipe[pipeptr].vector[currsymbol]); double n = (THORNUMTONES - 1) * abs( pipe[(pipeptr + symlen) % twosym].vector[currsymbol]); sig = decayavg( sig, s, s - sig > 0 ? 4 : 20); noise = decayavg( noise, n, 64); if (noise) s2n = 20*log10(sig / noise); else s2n = 0; // To partially offset the increase of noise by (THORNUMTONES -1) // in the noise calculation above, // add 15*log10(THORNUMTONES -1) = 18.4, and multiply by 6 metric = 6 * (s2n + 18.4); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { // s2n reporting: re-calibrate s2n_metric = metric * 2.5 - 70; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } metric = metric < 0 ? 0 : metric > 100 ? 100 : metric; display_metric(metric); snprintf(thormsg, sizeof(thormsg), "s/n %3.0f dB", s2n ); put_Status1(thormsg); // Scale FEC indicatior to reduce erratic / jumpy / unreadable display in GUI int scalefec; if (fec_confidence++ > 90) scalefec = 100; else if (fec_confidence++ > 60) scalefec = 75; else if (fec_confidence++ > 40) scalefec = 50; else if (fec_confidence++ >= 20) scalefec = 25; else if ( fec_confidence > 9) scalefec = 10; else scalefec = 0; // Else just round to 0. snprintf(confidence, sizeof(confidence), "FEC: %3.1d%%", scalefec); put_Status2(confidence); } void thor::recvpic(double smpl) { phidiff = 2.0 * M_PI * frequency / samplerate; img_phase -= phidiff; if (img_phase < 0) img_phase += 2.0 * M_PI; cmplx z = smpl * cmplx( cos(img_phase), sin(img_phase ) ); picfilter->run( z, currz); double dphase = arg(conj(prevz) * currz); pixel = (samplerate / TWOPI) * pixfilter->run(dphase); sync = (samplerate / TWOPI) * pixsyncfilter->run(dphase); prevz = currz; image_counter++; if (image_counter < 0) return; if (state == IMAGE_START) { if (sync < -0.59 * bandwidth) { state = IMAGE_SYNC; } return; } if (state == IMAGE_SYNC) { if (sync > -0.5 * bandwidth) {//-0.51 * bandwidth) { state = IMAGE; } return; } if ((image_counter % IMAGEspp) == 0) { byte = pixel * 256.0 / bandwidth + 128; byte = (int)CLAMP( byte, 0.0, 255.0); if (image_mode == 1) { // bw transmission pixelnbr = 3 * (col + row * picW); if (b_ava) { REQ(thor_update_avatar, byte, pixelnbr); REQ(thor_update_avatar, byte, pixelnbr + 1); REQ(thor_update_avatar, byte, pixelnbr + 2); } else { REQ(thor_updateRxPic, byte, pixelnbr); REQ(thor_updateRxPic, byte, pixelnbr + 1); REQ(thor_updateRxPic, byte, pixelnbr + 2); } if (++ col == picW) { col = 0; row++; if (row >= picH) { state = TEXT; REQ(thor_enableshift); } } } else { // color transmission pixelnbr = rgb + 3 * (col + row * picW); if (b_ava) REQ(thor_update_avatar, byte, pixelnbr); else REQ(thor_updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; ++row; } } if (row > picH) { state = TEXT; REQ(thor_enableshift); } } } } int thor::rx_process(const double *buf, int len) { cmplx zref, *zp; cmplx zarray[1]; int n; if (slowcpu != progdefaults.slowcpu) { slowcpu = progdefaults.slowcpu; filter_reset = true; } if (filter_reset) reset_filters(); while (len) { if (state != TEXT) { recvpic(*buf); } else { // create analytic signal at first IF zref = cmplx( *buf, *buf ); hilbert->run(zref, zref); zref = mixer(0, zref); if (progdefaults.THOR_FILTER && fft) { // filter using fft convolution n = fft->run(zref, &zp); } else { zarray[0] = zref; zp = zarray; n = 1; } if (n) { for (int i = 0; i < n; i++) { cmplx * pipe_pipeptr_vector = pipe[pipeptr].vector ; const cmplx zp_i = zp[i]; // process THORMAXFFTS sets of sliding FFTs spaced at 1/THORMAXFFTS bin intervals each of which // is a matched filter for the current symbol length for (int k = 0; k < paths; k++) { // shift in frequency to base band for the sliding DFTs const cmplx z = mixer(k + 1, zp_i ); // copy current vector to the pipe interleaving the FFT vectors binsfft[k]->run(z, pipe_pipeptr_vector + k, paths ); } if (--synccounter <= 0) { synccounter = symlen; if (progdefaults.THOR_SOFTSYMBOLS) currsymbol = softdecode(); else currsymbol = harddecode(); currmag = abs(pipe_pipeptr_vector[currsymbol]); eval_s2n(); if (progdefaults.THOR_SOFTBITS) softdecodesymbol(); else decodesymbol(); synchronize(); prev2symbol = prev1symbol; prev1symbol = currsymbol; prev2mag = prev1mag; prev1mag = currmag; } pipeptr++; if (pipeptr >= twosym) pipeptr = 0; } } } buf++; --len; } return 0; } //============================================================================= // Transmit methods //============================================================================= int thor::get_secondary_char() { char chr; if (cptr >= strSecXmtText.length()) cptr = 0; chr = strSecXmtText[cptr++]; put_sec_char( chr ); return chr; } void thor::sendtone(int tone, int duration) { double f, phaseincr; f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2; phaseincr = TWOPI * f / samplerate; for (int j = 0; j < duration; j++) { for (int i = 0; i < symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, symlen); } } void thor::sendsymbol(int sym) { cmplx z; int tone; tone = (txprevtone + 2 + sym) % THORNUMTONES; txprevtone = tone; if (reverse) tone = (THORNUMTONES - 1) - tone; sendtone(tone, 1); } // Send THOR FEC varicode void thor::sendchar(unsigned char c, int secondary) { const char *code; code = thorvarienc(c, secondary); while (*code) { int data = Enc->encode(*code++ - '0'); for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == 4) { Txinlv->bits(&bitshreg); sendsymbol(bitshreg); bitstate = 0; bitshreg = 0; } } } if (!secondary) put_echo_char(c); } void thor::sendidle() { sendchar(0, 0); // } void thor::sendsecondary() { int c = get_secondary_char(); sendchar(c & 0xFF, 1); } void thor::Clearbits() { int data = Enc->encode(0); for (int k = 0; k < 1400; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == 4) { Txinlv->bits(&bitshreg); bitstate = 0; bitshreg = 0; } } } } void thor::flushtx() { // flush the varicode decoder at the other end // flush the convolutional encoder and interleaver for (int i = 0; i < flushlength; i++) sendidle(); bitstate = 0; } static bool hide_after_sending = false; int thor::tx_process() { modem::tx_process(); int i = 0; switch (txstate) { case TX_STATE_PREAMBLE: Clearbits(); for (int j = 0; j < 16; j++) sendsymbol(0); sendidle(); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r', 0); if (mode != MODE_THORMICRO) { sendchar(2, 0); // STX sendchar('\r', 0); } txstate = TX_STATE_DATA; break; case TX_STATE_DATA: if (imageheader.length()) { txstate = TX_STATE_IMAGE; break; } if (avatarheader.length()) { txstate = TX_STATE_AVATAR; break; } i = get_tx_char(); if (i == GET_TX_CHAR_NODATA) sendsecondary(); else if (i == GET_TX_CHAR_ETX) txstate = TX_STATE_END; else sendchar(i, 0); if (stopflag) { txstate = TX_STATE_END; stopflag = false; } break; case TX_STATE_END: sendchar('\r', 0); if (mode != MODE_THORMICRO) { sendchar(4, 0); // EOT sendchar('\r', 0); } txstate = TX_STATE_FLUSH; break; case TX_STATE_FLUSH: flushtx(); cwid(); txstate = TX_STATE_RECEIVE; return -1; case TX_STATE_IMAGE: for (size_t n = 0; n < imageheader.length(); n++) sendchar(imageheader[n], 0); flushtx(); send_image(); if (hide_after_sending) thorpicTxWin->hide(); hide_after_sending = false; txstate = TX_STATE_DATA; break; case TX_STATE_AVATAR: for (size_t n = 0; n < avatarheader.length(); n++) sendchar(avatarheader[n], 0); flushtx(); send_avatar(); txstate = TX_STATE_DATA; break; } return 0; } // image support #define PHASE_CORR 20 static bool send_gray = false; void thor::send_image() { int W = 640, H = 480; // grey scale transfer (FAX) float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; imageheader.clear(); if (!thorpicTxWin || !thorpicTxWin->visible()) { return; } switch (selthorpicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } REQ(thor_clear_tximage); stop_deadman(); double black[symlen]; memset(black, 0, sizeof(*black) * symlen); for (int i = 0; i < PHASE_CORR; i++) ModulateXmtr(black, symlen); freq = frequency - 0.6 * bandwidth; phaseincr = radians * freq; for (int i = 0; i < PHASE_CORR; i++) { for (int n = 0; n < symlen; n++) { black[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(black, symlen); } if (send_gray) { // grey scale image for (int row = 0; row < H; row++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = 0.3 * thorpic_TxGetPixel(tx_pixelnbr, 0) + // red 0.6 * thorpic_TxGetPixel(tx_pixelnbr, 1) + // green 0.1 * thorpic_TxGetPixel(tx_pixelnbr, 2); // blue REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, IMAGEspp); Fl::awake(); } } } else { for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = thorpic_TxGetPixel(tx_pixelnbr, color); REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, IMAGEspp); } Fl::awake(); } } } start_deadman(); } void thor::thor_send_image(std::string image_str, bool gray) { if (!image_str.empty()) { send_gray = gray; hide_after_sending = true; imageheader = image_str; } if (txstate == TX_STATE_RECEIVE) start_tx(); } void thor::send_avatar() { int W = 59, H = 74; float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; avatarheader.clear(); double black[symlen]; memset(black, 0, sizeof(*black) * symlen); freq = frequency - 0.6 * bandwidth; phaseincr = radians * freq; for (int i = 0; i < PHASE_CORR; i++) ModulateXmtr(black, symlen); for (int i = 0; i < PHASE_CORR; i++) { for (int n = 0; n < symlen; n++) { black[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(black, symlen); } for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = thor_get_avatar_pixel(tx_pixelnbr, color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, IMAGEspp); } Fl::awake(); } } } void thor::thor_send_avatar() { if (txstate == TX_STATE_RECEIVE) { start_tx(); } } void thor::m_thor_send_avatar() { std::string mycall = progdefaults.myCall; for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; fname.append(mycall).append(".png"); my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); if (!my_avatar_img) return; unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59*74*3); else if (D == 4) { int i, j, k; for (i = 0; i < 59*74; i++) { j = i*3; k = i*4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59*74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else { return; } avatarheader = "\npic%A"; thor_send_avatar(); } fldigi-4.1.06/src/thor/thorvaricode.cxx0000644000175000017500000001337313472115777014766 00000000000000// ---------------------------------------------------------------------------- // // thorvaricode.cxx -- THOR Varicode // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "mfskvaricode.h" #include "thorvaricode.h" // THOR varicode is an extended set of the IZ8BLY MFSK varicode that uses the // unallocated remaining 12 bit codes for a secondary character set. // Primary character set (same as MFSK) // extended 12 bit codes for secondary characters // 90 used, leaving 10 for possible special use // encoding table static const char *thor_varicode[] = { "101110000000", /* 032 - */ "101110100000", /* 033 - ! */ "101110101000", /* 034 - '"' */ "101110101100", /* 035 - # */ "101110110000", /* 036 - $ */ "101110110100", /* 037 - % */ "101110111000", /* 038 - & */ "101110111100", /* 039 - ' */ "101111000000", /* 040 - ( */ "101111010000", /* 041 - ) */ "101111010100", /* 042 - * */ "101111011000", /* 043 - + */ "101111011100", /* 044 - , */ "101111100000", /* 045 - - */ "101111101000", /* 046 - . */ "101111101100", /* 047 - / */ "101111110000", /* 048 - 0 */ "101111110100", /* 049 - 1 */ "101111111000", /* 050 - 2 */ "101111111100", /* 051 - 3 */ "110000000000", /* 052 - 4 */ "110100000000", /* 053 - 5 */ "110101000000", /* 054 - 6 */ "110101010100", /* 055 - 7 */ "110101011000", /* 056 - 8 */ "110101011100", /* 057 - 9 */ "110101100000", /* 058 - : */ "110101101000", /* 059 - ; */ "110101101100", /* 060 - < */ "110101110000", /* 061 - = */ "110101110100", /* 062 - > */ "110101111000", /* 063 - ? */ "110101111100", /* 064 - @ */ "110110000000", /* 065 - A */ "110110100000", /* 066 - B */ "110110101000", /* 067 - C */ "110110101100", /* 068 - D */ "110110110000", /* 069 - E */ "110110110100", /* 070 - F */ "110110111000", /* 071 - G */ "110110111100", /* 072 - H */ "110111000000", /* 073 - I */ "110111010000", /* 074 - J */ "110111010100", /* 075 - K */ "110111011000", /* 076 - L */ "110111011100", /* 077 - M */ "110111100000", /* 078 - N */ "110111101000", /* 079 - O */ "110111101100", /* 080 - P */ "110111110000", /* 081 - Q */ "110111110100", /* 082 - R */ "110111111000", /* 083 - S */ "110111111100", /* 084 - T */ "111000000000", /* 085 - U */ "111010000000", /* 086 - V */ "111010100000", /* 087 - W */ "111010101100", /* 088 - X */ "111010110000", /* 089 - Y */ "111010110100", /* 090 - Z */ "111010111000", /* 091 - [ */ "111010111100", /* 092 - \ */ "111011000000", /* 093 - ] */ "111011010000", /* 094 - ^ */ "111011010100", /* 095 - _ */ "111011011000", /* 096 - ` */ "111011011100", /* 097 - a */ "111011100000", /* 098 - b */ "111011101000", /* 099 - c */ "111011101100", /* 100 - d */ "111011110000", /* 101 - e */ "111011110100", /* 102 - f */ "111011111000", /* 103 - g */ "111011111100", /* 104 - h */ "111100000000", /* 105 - i */ "111101000000", /* 106 - j */ "111101010000", /* 107 - k */ "111101010100", /* 108 - l */ "111101011000", /* 109 - m */ "111101011100", /* 110 - n */ "111101100000", /* 111 - o */ "111101101000", /* 112 - p */ "111101101100", /* 113 - q */ "111101110000", /* 114 - r */ "111101110100", /* 115 - s */ "111101111000", /* 116 - t */ "111101111100", /* 117 - u */ "111110000000", /* 118 - v */ "111110100000", /* 119 - w */ "111110101000", /* 120 - x */ "111110101100", /* 121 - y */ "111110110000" /* 122 - z */ }; // unused 12 bit varicodes /* static char *unused[] = { "111110110100", "111110111000", "111110111100", "111111000000", "111111010100", "111111011000", "111111011100", "111111100000", "111111101000", "111111101100", "111111110000", "111111110100", "111111111100" }; */ // decoding table static const unsigned int thor_varidecode[] = { 0xB80, 0xBA0, 0xBA8, 0xBAC, 0xBB0, 0xBB4, 0xBB8, 0xBBC, 0xBC0, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE8, 0xBEC, 0xBF0, 0xBF4, 0xBF8, 0xBFC, 0xC00, 0xD00, 0xD40, 0xD54, 0xD58, 0xD5C, 0xD60, 0xD68, 0xD6C, 0xD70, 0xD74, 0xD78, 0xD7C, 0xD80, 0xDA0, 0xDA8, 0xDAC, 0xDB0, 0xDB4, 0xDB8, 0xDBC, 0xDC0, 0xDD0, 0xDD4, 0xDD8, 0xDDC, 0xDE0, 0xDE8, 0xDEC, 0xDF0, 0xDF4, 0xDF8, 0xDFC, 0xE00, 0xE80, 0xEA0, 0xEAC, 0xEB0, 0xEB4, 0xEB8, 0xEBC, 0xEC0, 0xED0, 0xED4, 0xED8, 0xEDC, 0xEE0, 0xEE8, 0xEEC, 0xEF0, 0xEF4, 0xEF8, 0xEFC, 0xF00, 0xF40, 0xF50, 0xF54, 0xF58, 0xF5C, 0xF60, 0xF68, 0xF6C, 0xF70, 0xF74, 0xF78, 0xF7C, 0xF80, 0xFA0, 0xFA8, 0xFAC, 0xFB0 }; static int limit = sizeof(thor_varidecode)/sizeof(unsigned int); const char *thorvarienc(int c, int sec) { if (sec == 0) return varienc(c); // mfsk varicode else if (c >= ' ' && c <= 'z') return thor_varicode[c - ' ']; return varienc(0); // return code for NULL if not in tables } int thorvaridec(unsigned int symbol) { int i; if (symbol < 0xB80) return varidec(symbol); // find in the MFSK decode table for (i = 0; i < limit; i++) if (symbol == thor_varidecode[i]) return (' ' + i + 0x100); // found in the extended decode table return -1; // not found } fldigi-4.1.06/src/logger/0000775000175000017500000000000013515625027012117 500000000000000fldigi-4.1.06/src/logger/speak.cxx0000644000175000017500000000724513472115777013704 00000000000000// ---------------------------------------------------------------------------- // speak.cxx rx text data stream to file // rx text data stream to client socket on MS // // Copyright 2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "gettext.h" #include "speak.h" #include "main.h" #include "status.h" #include "fl_digi.h" #include "configuration.h" #include "debug.h" #include "socket.h" #include "icons.h" using namespace std; const char *txtTalkInfo = _("\ Save all received text, one character at a time to the following file:\n\n\ fldigi.files\\talk\\textout.txt (Windows)\n\ ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)"); string speakfname = ""; ofstream speakout; string speakbuffer = ""; #ifndef __WIN32__ void open_talker() {} void close_talker() {} void toggle_talker() {} #endif #ifdef __WIN32__ #include "confdialog.h" string talkbuffer = ""; Socket *talker_tcpip = 0; string talker_address = "127.0.0.1"; string talker_port = "1111"; bool can_talk = true; void open_talker() { try { talker_tcpip = new Socket(Address(talker_address.c_str(), talker_port.c_str())); talker_tcpip->set_timeout(0.01); talker_tcpip->connect(); btnConnectTalker->value(1); btnConnectTalker->redraw(); can_talk = true; } catch (const SocketException& e) { LOG_INFO("Talker Server not available"); btnConnectTalker->value(0); btnConnectTalker->redraw(); can_talk = false; } } void close_talker() { talker_tcpip->close(); btnConnectTalker->value(0); btnConnectTalker->redraw(); can_talk = false; } void toggle_talker() { if (can_talk) close_talker(); else open_talker(); } void speak(int c) { if (progdefaults.speak) { if (speakfname.empty()) { speakfname = TalkDir; speakfname.append("textout.txt"); } speakbuffer += (char)c; // Windows is not able to handle continuously open/close of the append file // the file might or might not be written to. if (!speakout) speakout.open(speakfname.c_str(), ios::app); if (speakout) { for (size_t i = 0; i < speakbuffer.length(); i++) speakout.put(speakbuffer[i]); speakbuffer.clear(); } } if (can_talk && !talker_tcpip) open_talker(); if (!talker_tcpip) return; if (c < ' ' || c > 'z') c = ','; talkbuffer += c; try { talker_tcpip->send(talkbuffer); } catch (const SocketException& e) { LOG_INFO("Talker server not available"); delete talker_tcpip; talker_tcpip = 0; btnConnectTalker->labelcolor(FL_RED); btnConnectTalker->redraw_label(); can_talk = false; } talkbuffer.clear(); } #else void speak(int c) { if (!progdefaults.speak) return; if (speakfname.empty()) { speakfname = TalkDir; speakfname.append("textout.txt"); } speakbuffer += c; speakout.open(speakfname.c_str(), ios::app); if (!speakout) return; for (size_t i = 0; i < speakbuffer.length(); i++) speakout.put(speakbuffer[i]); speakbuffer.clear(); speakout.flush(); speakout.close(); } #endif fldigi-4.1.06/src/logger/logger.cxx0000664000175000017500000004543113507402064014044 00000000000000// ---------------------------------------------------------------------------- // logger.cxx Remote Log Interface for fldigi // // Copyright 2006-2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #include #include #include #include #include "icons.h" #include "logger.h" #include "lgbook.h" #include "main.h" #include "modem.h" #include "waterfall.h" #include "fl_digi.h" #include "trx.h" #include "debug.h" #include "macros.h" #include "status.h" #include "spot.h" #include "adif_io.h" #include "date.h" #include "configuration.h" #include "flmisc.h" #include "strutil.h" #include "qrunner.h" #include "logsupport.h" #include "lookupcall.h" #include "fd_logger.h" #include "n3fjp_logger.h" #include "dx_cluster.h" #include "network.h" #include using namespace std; //--------------------------------------------------------------------- const char *logmode; static string log_msg; static string errmsg; static string notes; //====================================================================== // LoTW static string lotw_fname; static string lotw_logfname; static string lotw_send_fname; static string lotw_log_fname; static int logcheck_count = 0; string str_lotw; //====================================================================== // eQSL void submit_eQSL(cQsoRec &rec, string msg); //====================================================================== static string adif; void writeADIF () { // open the adif file FILE *adiFile; string fname; fname = TempDir; fname.append("log.adif"); adiFile = fl_fopen (fname.c_str(), "a"); if (adiFile) { // write the current record to the file fprintf(adiFile,"%s\n", adif.c_str()); fclose (adiFile); } } void putadif(int num, const char *s, string &str = adif) { char tempstr[100]; int slen = strlen(s); int n = snprintf(tempstr, sizeof(tempstr), "<%s:%d>", fields[num].name, slen); if (n == -1) { LOG_PERROR("snprintf"); return; } str.append(tempstr).append(s); } vector lotw_recs_sent; void clear_lotw_recs_sent() { lotw_recs_sent.clear(); } void restore_lotwsdates() { extern int editNbr; if (lotw_recs_sent.empty()) return; int recnbr; cQsoRec *rec; for (size_t n = 0; n < lotw_recs_sent.size(); n++) { recnbr = lotw_recs_sent[n]; rec = qsodb.getRec(recnbr); rec->putField(LOTWSDATE, ""); if (recnbr == editNbr) { inpLOTWsentdate_log->value(""); inpLOTWsentdate_log->redraw(); } } clear_lotw_recs_sent(); } static notify_dialog *lotw_alert_window = 0; void check_lotw_log(void *) { string logtxt; FILE * logfile = fl_fopen(lotw_log_fname.c_str(), "r"); if (!logfile) { logcheck_count += 5; if (logcheck_count <= 60) { Fl::repeat_timeout(5.0, check_lotw_log); return; } LOG_ERROR("%s", "NO tqsl log file in 60 seconds!"); restore_lotwsdates(); return; } char c = fgetc(logfile); while (!feof(logfile)) { logtxt += c; c = fgetc(logfile); } fclose(logfile); //LOG_INFO("TQSL log file:\n%s\n", logtxt.c_str()); size_t p = logtxt.find("UploadFile returns 0"); if (p != string::npos) { if (progdefaults.lotw_quiet_mode && progdefaults.lotw_show_delivery) { if (!lotw_alert_window) lotw_alert_window = new notify_dialog; lotw_alert_window->notify(_("LoTW upload OK"), 5.0); REQ(show_notifier, lotw_alert_window); } if (progdefaults.xml_logbook) xml_update_lotw(); clear_lotw_recs_sent(); } else { string errlog = LoTWDir; errlog.append("lotw_error_log.txt"); ofstream errfile(errlog.c_str()); if (errfile) { errfile << logtxt; errfile.close(); logtxt.assign("LoTW upload error\nCheck file: "); logtxt.append(errlog); } if (progdefaults.lotw_quiet_mode) { std::string alert = _("LoTW upload error\nView LoTW error log:"); alert.append(errlog); if (!lotw_alert_window) lotw_alert_window = new notify_dialog; lotw_alert_window->notify(alert.c_str(), 15.0); REQ(show_notifier, lotw_alert_window); } restore_lotwsdates(); } remove(lotw_log_fname.c_str()); } void send_to_lotw(void *) { if (progdefaults.lotw_pathname.empty()) return; if (str_lotw.empty()) return; lotw_send_fname = LoTWDir; lotw_send_fname.append("fldigi_lotw_").append(zdate()); lotw_send_fname.append("_").append(ztime()); lotw_send_fname.append(".adi"); ofstream outfile(lotw_send_fname.c_str()); outfile << str_lotw; outfile.close(); str_lotw.clear(); lotw_log_fname = LoTWDir; lotw_log_fname.append("lotw_log.txt"); string pstring; pstring.assign("\"").append(progdefaults.lotw_pathname).append("\""); pstring.append(" -d -u -a compliant"); if (progdefaults.submit_lotw_password) pstring.append(" -p \"").append(progdefaults.lotw_pwd).append("\""); if (!progdefaults.lotw_location.empty()) pstring.append(" -l \"").append(progdefaults.lotw_location).append("\""); pstring.append(" -t \"").append(lotw_log_fname).append("\""); pstring.append(" \"").append(lotw_send_fname).append("\""); if (progdefaults.lotw_quiet_mode) pstring.append(" -q"); start_process(pstring); logcheck_count = 5; Fl::add_timeout(5.0, check_lotw_log); } string lotw_rec(cQsoRec &rec) { string temp; string strrec; putadif(CALL, rec.getField(CALL), strrec); putadif(ADIF_MODE, adif2export(rec.getField(ADIF_MODE)).c_str(), strrec); string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) putadif(SUBMODE, sm.c_str(), strrec); temp = rec.getField(FREQ); temp.resize(7); putadif(FREQ, temp.c_str(), strrec); putadif(QSO_DATE, rec.getField(QSO_DATE), strrec); putadif(BAND, rec.getField(BAND), strrec); temp = rec.getField(TIME_ON); if (temp.length() > 4) temp.erase(4); putadif(TIME_ON, temp.c_str(), strrec); strrec.append("\n"); return strrec; } void submit_lotw(cQsoRec &rec) { string adifrec = lotw_rec(rec); if (adifrec.empty()) return; if (progdefaults.submit_lotw) { if (str_lotw.empty()) str_lotw = "Fldigi LoTW upload file\n2.2.7\n\n"; str_lotw.append(adifrec); Fl::awake(send_to_lotw); } } void submit_ADIF(cQsoRec &rec) { adif.erase(); putadif(QSO_DATE, rec.getField(QSO_DATE)); putadif(TIME_ON, rec.getField(TIME_ON)); putadif(QSO_DATE_OFF, rec.getField(QSO_DATE_OFF)); putadif(TIME_OFF, rec.getField(TIME_OFF)); putadif(CALL, rec.getField(CALL)); putadif(FREQ, rec.getField(FREQ)); putadif(ADIF_MODE, adif2export(rec.getField(ADIF_MODE)).c_str()); string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) putadif(SUBMODE, sm.c_str()); putadif(RST_SENT, rec.getField(RST_SENT)); putadif(RST_RCVD, rec.getField(RST_RCVD)); putadif(TX_PWR, rec.getField(TX_PWR)); putadif(NAME, rec.getField(NAME)); putadif(QTH, rec.getField(QTH)); putadif(STATE, rec.getField(STATE)); putadif(VE_PROV, rec.getField(VE_PROV)); putadif(COUNTRY, rec.getField(COUNTRY)); putadif(GRIDSQUARE, rec.getField(GRIDSQUARE)); putadif(STX, rec.getField(STX)); putadif(SRX, rec.getField(SRX)); putadif(XCHG1, rec.getField(XCHG1)); putadif(MYXCHG, rec.getField(MYXCHG)); notes = rec.getField(NOTES); for (size_t i = 0; i < notes.length(); i++) if (notes[i] == '\n') notes[i] = ';'; putadif(NOTES, notes.c_str()); // these fields will always be blank unless they are added to the main // QSO log area. putadif(IOTA, rec.getField(IOTA)); putadif(DXCC, rec.getField(DXCC)); putadif(QSL_VIA, rec.getField(QSL_VIA)); putadif(QSLRDATE, rec.getField(QSLRDATE)); putadif(QSLSDATE, rec.getField(QSLSDATE)); putadif(EQSLRDATE, rec.getField(EQSLRDATE)); putadif(EQSLSDATE, rec.getField(EQSLSDATE)); putadif(LOTWRDATE, rec.getField(LOTWRDATE)); putadif(LOTWSDATE, rec.getField(LOTWSDATE)); writeADIF(); } //--------------------------------------------------------------------- // the following IPC message is compatible with xlog remote data spec. //--------------------------------------------------------------------- #if !defined(__WOE32__) && !defined(__APPLE__) #define addtomsg(x, y) log_msg = log_msg + (x) + (y) + LOG_MSEPARATOR static void send_IPC_log(cQsoRec &rec) { msgtype msgbuf; const char LOG_MSEPARATOR[2] = {1,0}; int msqid, len; int mm, dd, yyyy; char szdate[9]; char sztime[5]; strncpy(szdate, rec.getField(QSO_DATE_OFF), 8); szdate[8] = 0; sscanf(&szdate[6], "%d", &dd); szdate[6] = 0; sscanf(&szdate[4], "%d", &mm); szdate[4] = 0; sscanf(szdate, "%d", &yyyy); Date logdate(mm, dd, yyyy); log_msg.clear(); log_msg = string("program:") + PACKAGE_NAME + string(" v ") + PACKAGE_VERSION + LOG_MSEPARATOR; addtomsg("version:", LOG_MVERSION); addtomsg("date:", logdate.szDate(5)); memset(sztime, 0, sizeof(sztime) / sizeof(char)); strncpy(sztime, rec.getField(TIME_ON), (sizeof(sztime) / sizeof(char)) - 1); addtomsg("TIME:", sztime); memset(sztime, 0, 5); strncpy(sztime, rec.getField(TIME_OFF), 4); addtomsg("endtime:", sztime); addtomsg("call:", rec.getField(CALL)); addtomsg("mhz:", rec.getField(FREQ)); addtomsg("mode:", adif2export(rec.getField(ADIF_MODE))); string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) addtomsg("submode:", sm.c_str()); addtomsg("tx:", rec.getField(RST_SENT)); addtomsg("rx:", rec.getField(RST_RCVD)); addtomsg("name:", rec.getField(NAME)); addtomsg("qth:", rec.getField(QTH)); addtomsg("state:", rec.getField(STATE)); addtomsg("province:", rec.getField(VE_PROV)); addtomsg("country:", rec.getField(COUNTRY)); addtomsg("locator:", rec.getField(GRIDSQUARE)); addtomsg("serialout:", rec.getField(STX)); addtomsg("serialin:", rec.getField(SRX)); addtomsg("free1:", rec.getField(XCHG1)); notes = rec.getField(NOTES); for (size_t i = 0; i < notes.length(); i++) if (notes[i] == '\n') notes[i] = ';'; addtomsg("notes:", notes.c_str()); addtomsg("power:", rec.getField(TX_PWR)); strncpy(msgbuf.mtext, log_msg.c_str(), sizeof(msgbuf.mtext)); msgbuf.mtext[sizeof(msgbuf.mtext) - 1] = '\0'; if ((msqid = msgget(LOG_MKEY, 0666 | IPC_CREAT)) == -1) { LOG_PERROR("msgget"); return; } msgbuf.mtype = LOG_MTYPE; len = strlen(msgbuf.mtext) + 1; if (msgsnd(msqid, &msgbuf, len, IPC_NOWAIT) < 0) LOG_PERROR("msgsnd"); } #endif void submit_record(cQsoRec &rec) { #if !defined(__WOE32__) && !defined(__APPLE__) send_IPC_log(rec); #endif submit_ADIF(rec); if (progdefaults.submit_lotw) submit_lotw(rec); if (progdefaults.eqsl_when_logged) submit_eQSL(rec, ""); n3fjp_add_record(rec); } //--------------------------------------------------------------------- extern void xml_add_record(); void submit_log(void) { if (progdefaults.spot_when_logged) { if (!dxcluster_viewer->visible()) dxcluster_viewer->show(); send_DXcluster_spot(); } if (progStatus.spot_log) spot_log(inpCall->value(), inpLoc->value()); logmode = mode_info[active_modem->get_mode()].adif_name; if (progdefaults.xml_logbook && qsodb.isdirty()) { xml_add_record(); qsodb.isdirty(0); } else AddRecord(); if (FD_logged_on) FD_add_record(); // if (progdefaults.eqsl_when_logged) // makeEQSL(""); } //====================================================================== // thread to support sending log entry to eQSL //====================================================================== pthread_t* EQSLthread = 0; pthread_mutex_t EQSLmutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t EQSLcond = PTHREAD_COND_INITIALIZER; static void *EQSL_loop(void *args); static void EQSL_init(void); void EQSL_close(void); void EQSL_send(); static std::string EQSL_url = ""; static std::string SEND_url = ""; static std::string EQSL_xmlpage = ""; static bool EQSLEXIT = false; static notify_dialog *eqsl_alert_window = 0; void update_eQSL_fields(void *) { std::string call; std::string date; std::string mode = "MODE"; size_t p = EQSL_url.find("", p); if (p == std::string::npos) return; p++; size_t p2 = EQSL_url.find("<", p); if (p2 == std::string::npos) return; call = EQSL_url.substr(p, p2 - p); p = EQSL_url.find("", p); if (p == std::string::npos) return; p++; p2 = EQSL_url.find("<", p); if (p2 == std::string::npos) return; date = EQSL_url.substr(p, p2 - p); p = EQSL_url.find("", p); if (p != std::string::npos) { p2 = EQSL_url.find("<", ++p); if (p2 != std::string::npos) mode = EQSL_url.substr(p, p2 - p); } } p = EQSL_url.find("", p); if (p != std::string::npos) { p2 = EQSL_url.find("<", ++p); if (p2 != std::string::npos) { std::string submode = EQSL_url.substr(p, p2 - p); if (!submode.empty()) mode = submode; } } } inpEQSLsentdate_log->value(date.c_str()); if (progdefaults.xml_logbook) xml_update_eqsl(); else updateRecord(); std::string qsl_logged = "eQSL logged: "; qsl_logged.append(call).append(" on ").append(mode); if (progdefaults.eqsl_show_delivery) { if (!eqsl_alert_window) eqsl_alert_window = new notify_dialog; eqsl_alert_window->notify(qsl_logged.c_str(), 5.0); REQ(show_notifier, eqsl_alert_window); } LOG_INFO("%s", qsl_logged.c_str()); } static void cannot_connect_to_eqsl(void *) { std::string msg = "Cannot connect to www.eQSL.cc"; if (!eqsl_alert_window) eqsl_alert_window = new notify_dialog; eqsl_alert_window->notify(msg.c_str(), 5.0); REQ(show_notifier, eqsl_alert_window); } static void eqsl_error(void *) { size_t p = EQSL_xmlpage.find("Error:"); size_t p2 = EQSL_xmlpage.find('\n', p); std::string errstr = "eQSL error:"; errstr.append("testing 1.2.3"); errstr.append(EQSL_xmlpage.substr(p, p2 - p - 1)); errstr.append("\n").append(EQSL_url.substr(0,40)); if (!eqsl_alert_window) eqsl_alert_window = new notify_dialog; eqsl_alert_window->notify(errstr.c_str(), 5.0); REQ(show_notifier, eqsl_alert_window); LOG_ERROR("%s", errstr.c_str()); } static void *EQSL_loop(void *args) { SET_THREAD_ID(EQSL_TID); SET_THREAD_CANCEL(); for (;;) { TEST_THREAD_CANCEL(); pthread_mutex_lock(&EQSLmutex); pthread_cond_wait(&EQSLcond, &EQSLmutex); pthread_mutex_unlock(&EQSLmutex); if (EQSLEXIT) return NULL; size_t p; if (get_http(SEND_url, EQSL_xmlpage, 5.0) <= 0) { REQ(cannot_connect_to_eqsl, (void *)0); } else if ((p = EQSL_xmlpage.find("Error:")) != std::string::npos) { REQ(eqsl_error, (void *)0); } else { REQ(update_eQSL_fields, (void *)0); } } return NULL; } void EQSL_close(void) { ENSURE_THREAD(FLMAIN_TID); if (!EQSLthread) return; CANCEL_THREAD(*EQSLthread); pthread_mutex_lock(&EQSLmutex); EQSLEXIT = true; pthread_cond_signal(&EQSLcond); pthread_mutex_unlock(&EQSLmutex); pthread_join(*EQSLthread, NULL); delete EQSLthread; EQSLthread = 0; } static void EQSL_init(void) { ENSURE_THREAD(FLMAIN_TID); if (EQSLthread) return; EQSLthread = new pthread_t; EQSLEXIT = false; if (pthread_create(EQSLthread, NULL, EQSL_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } void submit_eQSL(cQsoRec &rec, string msg) { string eQSL_data; string tempstr; char sztemp[100]; eQSL_data = "upload 4.0 "; snprintf(sztemp, sizeof(sztemp),"%s%s", static_cast(progdefaults.eqsl_id.length()), ucasestr(progdefaults.eqsl_id).c_str(), static_cast(progdefaults.eqsl_pwd.length()), progdefaults.eqsl_pwd.c_str()); eQSL_data.append(sztemp); eQSL_data.append("FLDIGI"); if (!progdefaults.eqsl_nick.empty()) { snprintf(sztemp, sizeof(sztemp), "%s", static_cast(progdefaults.eqsl_nick.length()), progdefaults.eqsl_nick.c_str()); eQSL_data.append(sztemp); } putadif(CALL, rec.getField(CALL), eQSL_data); putadif(ADIF_MODE, adif2export(rec.getField(ADIF_MODE)).c_str(), eQSL_data); string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) putadif(SUBMODE, sm.c_str(), eQSL_data); tempstr = rec.getField(FREQ); tempstr.resize(7); putadif(FREQ, tempstr.c_str(), eQSL_data); putadif(BAND, rec.getField(BAND), eQSL_data); putadif(QSO_DATE, sDate_on.c_str(), eQSL_data); tempstr = rec.getField(TIME_ON); if (tempstr.length() > 4) tempstr.erase(4); putadif(TIME_ON, tempstr.c_str(), eQSL_data); putadif(RST_SENT, rec.getField(RST_SENT), eQSL_data); size_t p = 0; if (msg.empty()) msg = progdefaults.eqsl_default_message; if (!msg.empty()) { // replace message tags {CALL}, {NAME}, {MODE} while ((p = msg.find("{CALL}")) != std::string::npos) msg.replace(p, 6, inpCall->value()); while ((p = msg.find("{NAME}")) != std::string::npos) msg.replace(p, 6, inpName->value()); while ((p = msg.find("{MODE}")) != std::string::npos) { tempstr.assign(mode_info[active_modem->get_mode()].export_mode); sm = mode_info[active_modem->get_mode()].export_submode; if (!sm.empty()) tempstr.append("/").append(sm); msg.replace(p, 6, tempstr); } snprintf(sztemp, sizeof(sztemp), "%s", static_cast(msg.length()), msg.c_str()); eQSL_data.append(sztemp); } eQSL_data.append("\n"); std::string eQSL_header = progdefaults.eqsl_www_url; EQSL_url.assign(eQSL_header).append(eQSL_data); tempstr.clear(); for (size_t n = 0; n < eQSL_data.length(); n++) { if (eQSL_data[n] == ' ' || eQSL_data[n] == '\n') tempstr.append("%20"); else if (eQSL_data[n] == '<') tempstr.append("%3C"); else if (eQSL_data[n] == '>') tempstr.append("%3E"); else if (eQSL_data[n] == '_') tempstr.append("%5F"); else if (eQSL_data[n] == ':') tempstr.append("%3A"); else if (eQSL_data[n] > ' ' && eQSL_data[n] <= '}') tempstr += eQSL_data[n]; } eQSL_data = eQSL_header; eQSL_data.append(tempstr); sendEQSL(eQSL_data.c_str()); } void sendEQSL(const char *url) { ENSURE_THREAD(FLMAIN_TID); if (!EQSLthread) EQSL_init(); pthread_mutex_lock(&EQSLmutex); SEND_url = url; pthread_cond_signal(&EQSLcond); pthread_mutex_unlock(&EQSLmutex); } // this function may be called from several places including macro // expansion and execution void makeEQSL(const char *message) { cQsoRec *rec; if (qsodb.nbrRecs() <= 0) return; rec = qsodb.getRec(qsodb.nbrRecs() - 1); // last record submit_eQSL(*rec, message); } fldigi-4.1.06/src/logger/rx_extract.cxx0000644000175000017500000003252713472115777014765 00000000000000// ---------------------------------------------------------------------------- // rx_extract.cxx extract delineated data stream to file // // Copyright 2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "fileselect.h" #include "gettext.h" #include "rx_extract.h" #include "main.h" #include "status.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "debug.h" #include "icons.h" #include "qrunner.h" #include "timeops.h" #include "xmlrpc.h" #include "audio_alert.h" using namespace std; static const char *wrap_beg = "[WRAP:beg]"; static const char *wrap_end = "[WRAP:end]"; static const char *flmsg = ""; static const char flamp_beg[] = ">FLAMP"; static const char flamp_end[] = ":EOT}"; #ifdef __WIN32__ const char *txtWrapInfo = _("\ Detect the occurance of [WRAP:beg] and [WRAP:end]\n\ Save tags and all enclosed text to date-time stamped file, ie:\n\ NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap"); #else const char *txtWrapInfo = _("\ Detect the occurance of [WRAP:beg] and [WRAP:end]\n\ Save tags and all enclosed text to date-time stamped file, ie:\n\ ~/.nbems/WRAP/recv/extract-20090127-092515.wrap"); #endif #define bufsize 64 string rx_extract_buff; string rx_buff; string rx_extract_msg; bool extract_wrap = false; bool extract_flamp = false; bool extract_arq = false; bool bInit = false; char dttm[64]; void rx_extract_reset() { rx_buff.clear(); rx_extract_buff.assign(' ', bufsize); extract_wrap = false; extract_flamp = false; extract_arq = false; put_status(""); } void rx_extract_timer(void *) { rx_extract_msg = "Extract timed out"; put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR); rx_extract_reset(); if (trx_state != STATE_RX) return; if (audio_alert && progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT) audio_alert->alert(progdefaults.RX_EXTRACT_TIMED_OUT); } void rx_add_timer() { Fl::add_timeout(progdefaults.extract_timeout, rx_extract_timer, NULL); } void rx_remove_timer() { Fl::remove_timeout(rx_extract_timer); } void invoke_flmsg() { string cmd = progdefaults.flmsg_pathname; REQ(rx_remove_timer); struct tm tim; time_t t; time(&t); gmtime_r(&t, &tim); strftime(dttm, sizeof(dttm), "%Y%m%d-%H%M%S", &tim); string outfilename = FLMSG_WRAP_recv_dir; outfilename.append("extract-"); outfilename.append(dttm); outfilename.append(".wrap"); ofstream extractstream(outfilename.c_str(), ios::binary); if (extractstream) { extractstream << rx_buff; extractstream.close(); } rx_extract_msg = "File saved in "; rx_extract_msg.append(FLMSG_WRAP_recv_dir); put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR); if (trx_state != STATE_RX) return; if (audio_alert && progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD) audio_alert->alert(progdefaults.RX_EXTRACT_MSG_RCVD); if (flmsg_online && progdefaults.flmsg_transfer_direct) { guard_lock autolock(server_mutex); flmsg_data.append(rx_buff); return; } if (progdefaults.open_nbems_folder) open_recv_folder(FLMSG_WRAP_recv_dir.c_str()); if ((progdefaults.open_flmsg || progdefaults.open_flmsg_print) && (rx_buff.find(flmsg) != string::npos) && !progdefaults.flmsg_pathname.empty()) { #ifdef __MINGW32__ cmd.append(" -title ").append(dttm); cmd.append(" --flmsg-dir ").append("\"").append(FLMSG_dir).append("\""); if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) cmd.append(" --b"); else if (progdefaults.open_flmsg_print) cmd.append(" --p"); cmd.append(" \"").append(outfilename).append("\""); char *cmdstr = strdup(cmd.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess( NULL, cmdstr, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free (cmdstr); #else string params = ""; static string ap[10];// = cmd;//""; string param = ""; size_t p = cmd.find(" -"); if (p != string::npos) { param.assign(cmd.substr(p)); cmd = cmd.substr(0,p); } for (int i = 0; i < 10; i++) ap[i].clear(); int n = 0; ap[n++] = "-title"; ap[n++] = dttm; ap[n++] = "--flmsg-dir"; ap[n++] = FLMSG_dir; if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) ap[n++] = " --b";//params = " --b"; else if (progdefaults.open_flmsg_print) ap[n++] = " --p";//params = " --p"; ap[n++] = outfilename; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif switch (n) { case 1: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)0); break; case 2: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)0); break; case 3: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)0); break; case 4: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)0); break; case 5: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)0); break; case 6: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)0); break; case 7: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)0); break; case 8: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)0); break; case 9: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)ap[8].c_str(), (char*)0); break; case 10: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)ap[8].c_str(), (char*)ap[9].c_str(), (char*)0); break; default : ; } exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not start flmsg")); } #endif } } void start_flmsg() { string cmd = progdefaults.flmsg_pathname; #ifdef __MINGW32__ char *cmdstr = strdup(cmd.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess( NULL, cmdstr, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free (cmdstr); #else switch (fork()) { case 0: execlp((char*)cmd.c_str(), (char*)cmd.c_str(), (char*)0, (char*)0); exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not start flmsg")); default: ; } #endif } void rx_extract_add(int c) { if (!c) return; check_nbems_dirs(); if (!bInit) { rx_extract_reset(); bInit = true; } char ch = (char)c; rx_extract_buff = rx_extract_buff.substr(1); rx_extract_buff += ch; // rx_extract_buff must contain in order: // ~1c - arq_soh + connect request // ; - arq_dle character // ~4 - arq_eoh // before auto starting flmsg size_t p1 = rx_extract_buff.find("~1c"); size_t p2 = rx_extract_buff.find(";"); size_t p3 = rx_extract_buff.find("~4"); if ( (p1 != string::npos) && (p2 != string::npos) && (p3 != string::npos) && (p1 < p2) && (p2 < p3)) { if (!flmsg_online) start_flmsg(); rx_extract_buff.assign(' ', bufsize); return; } if (!extract_arq && (rx_extract_buff.find("ARQ:FILE::FLMSG_XFR") != string::npos) ) { extract_arq = true; REQ(rx_remove_timer); REQ(rx_add_timer); rx_extract_buff.assign(' ', bufsize); rx_extract_msg = "Extracting ARQ msg"; put_status(rx_extract_msg.c_str()); return; } else if (extract_arq) { REQ(rx_remove_timer); REQ(rx_add_timer); if (rx_extract_buff.find("ARQ::ETX")) rx_extract_reset(); return; } else if (!extract_flamp && (rx_extract_buff.find(flamp_beg) != string::npos) ) { extract_flamp = true; rx_extract_buff.assign(' ', bufsize); rx_extract_msg = "Extracting FLAMP"; put_status(rx_extract_msg.c_str()); return; } else if (extract_flamp) { REQ(rx_remove_timer); REQ(rx_add_timer); if (rx_extract_buff.find(flamp_end) != string::npos) rx_extract_reset(); return; } else if (!extract_wrap && (rx_extract_buff.find(wrap_beg) != string::npos) ) { rx_buff.assign(wrap_beg); rx_extract_msg = "Extracting WRAP/FLMSG"; put_status(rx_extract_msg.c_str()); extract_wrap = true; REQ(rx_remove_timer); REQ(rx_add_timer); return; } else if (extract_wrap) { rx_buff += ch; REQ(rx_remove_timer); REQ(rx_add_timer); if (rx_extract_buff.find(wrap_end) != string::npos) { invoke_flmsg(); rx_extract_reset(); } } } void select_flmsg_pathname() { txt_flmsg_pathname->value(progdefaults.flmsg_pathname.c_str()); txt_flmsg_pathname->redraw(); #ifdef __APPLE__ open_recv_folder("/Applications/"); return; #else string deffilename = progdefaults.flmsg_pathname; # ifdef __MINGW32__ if (deffilename.empty()) deffilename = "C:\\Program Files\\"; const char *p = FSEL::select(_("Locate flmsg executable"), _("flmsg.exe\t*.exe"), deffilename.c_str()); # else if (deffilename.empty()) deffilename = "/usr/local/bin/"; const char *p = FSEL::select(_("Locate flmsg executable"), _("flmsg\t*"), deffilename.c_str()); # endif if (!p) return; if (!*p) return; progdefaults.flmsg_pathname = p; progdefaults.changed = true; txt_flmsg_pathname->value(p); #endif } // this only works on Linux and Unix // not Windoze or // OS X to find binaries in the /Applications/ directory structure bool find_pathto_exectable(string &binpath, string executable) { size_t endindex = 0; binpath.clear(); // Get the PATH environment variable as pointer to string // The strings in the environment list are of the form name=value. // As typically implemented, getenv() returns a pointer to a string within // the environment list. The caller must take care not to modify this string, // since that would change the environment of the process. // // The implementation of getenv() is not required to be reentrant. The string // pointed to by the return value of getenv() may be statically allocated, and // can be modified by a subsequent call to getenv(), putenv(3), setenv(3), or // unsetenv(3). char *environment = getenv("PATH"); if (environment == NULL) return false; string env = environment; string testpath = ""; char endchar = ':'; // Parse single PATH string into directories while (!env.empty()) { endindex = env.find(endchar); testpath = env.substr(0, endindex); testpath.append("/"); // insert linux, unix, osx OS-correct delimiter testpath.append(executable); // append executable name // Most portable way to check if a file exists: Try to open it. FILE *checkexists = NULL; checkexists = fl_fopen( testpath.c_str(), "r" ); // try to open file readonly if (checkexists) { // if the file successfully opened, it exists. fclose(checkexists); binpath = testpath; return true; } if (endindex == string::npos) env.clear(); else env.erase(0, endindex + 1); } return false; } string select_binary_pathname(string deffilename) { #ifdef __APPLE__ open_recv_folder("/Applications/"); return ""; #else # ifdef __MINGW32__ deffilename = "C:\\Program Files\\"; const char *p = FSEL::select(_("Locate executable"), _("*.exe"), deffilename.c_str()); # else deffilename = "/usr/local/bin/"; const char *p = FSEL::select(_("Locate binary"), _("*"), deffilename.c_str()); # endif string executable = ""; if (p && *p) executable = p; // do not allow recursion !! if (executable.find("fldigi") != string::npos) return ""; return executable; #endif } fldigi-4.1.06/src/fft-monitor/0000775000175000017500000000000013515625027013104 500000000000000fldigi-4.1.06/src/fft-monitor/spectrum.cxx0000644000175000017500000000701213472116001015375 00000000000000// ---------------------------------------------------------------------------- // spectrum Spectrum display Widget based on Digiscope widget // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "spectrum.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "qrunner.h" #include "configuration.h" spectrum::spectrum (int x, int y, int w, int h) : Digiscope (x, y, w, h) { _paused = false; _freq = 0; _db = 0; _db_diff = 0; _f_diff = 0; _gofreq = 0; mode(spectrum::SCOPE); } spectrum::~spectrum() { } void spectrum::handle_shift_leftclick(int x1) { _gofreq = progdefaults.fftviewer_fcenter - progdefaults.fftviewer_frng / 2 + (1.0 * x1 / w()) * progdefaults.fftviewer_frng; } void spectrum::handle_leftclick( int x1, int y1) { if (Fl::event_state() & FL_SHIFT) { handle_shift_leftclick(x1); return; } if (Fl::event_key('1') || Fl::event_key(FL_KP + '1')) { _y_user1 = 1.0 * y1 / h(); _x_user1 = 1.0 * x1 / w(); } else if (Fl::event_key('2') || Fl::event_key(FL_KP + '2')) { _y_user2 = 1.0 * y1 / h(); _x_user2 = 1.0 * x1 / w(); } else if (Fl::event_key('c') || Fl::event_key('3') || Fl::event_key(FL_KP + '3')) { _y_user1 = _y_user2 = -1; _x_user1 = _x_user2 = -1; } else { _freq = progdefaults.fftviewer_fcenter - progdefaults.fftviewer_frng / 2 + (1.0 * x1 / w()) * progdefaults.fftviewer_frng; _db = progdefaults.fftviewer_maxdb - (1.0 * y1 / h()) * progdefaults.fftviewer_range; return; } if ((_y_user1 != -1) && (_y_user2 != -1)) _db_diff = (_y_user1 - _y_user2) * progdefaults.fftviewer_range; else _db_diff = 0; if ((_x_user1 != -1) && (_x_user2 != -1)) _f_diff = (_x_user2 - _x_user1) * progdefaults.fftviewer_frng; else _db_diff = 0; } void spectrum::handle_rightclick( int x, int y) { _paused = !_paused; } int spectrum::handle(int event) { if (event == FL_ENTER) { fl_cursor(FL_CURSOR_CROSS); redraw(); return 1; } if (event == FL_LEAVE) { fl_cursor(FL_CURSOR_ARROW); redraw(); return 1; } if (!Fl::event_inside(this)) return 0; switch (event) { case FL_PUSH : break; case FL_RELEASE : if (!Fl::event_inside(this)) break; switch (Fl::event_button()) { case FL_LEFT_MOUSE: handle_leftclick(Fl::event_x() - x(), Fl::event_y() - y()); break; case FL_RIGHT_MOUSE : handle_rightclick(Fl::event_x() - x(), Fl::event_y() - y()); break; default : break; } default : break; } return 1; } fldigi-4.1.06/src/fft-monitor/fft-monitor.cxx0000644000175000017500000001651213472116001016004 00000000000000// ---------------------------------------------------------------------------- // fftmon.cxx -- fftmon modem // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "fl_digi.h" #include "modem.h" #include "misc.h" #include "filters.h" #include "fftfilt.h" #include "waterfall.h" #include "main.h" #include "fft-monitor.h" #include "timeops.h" #include "debug.h" #include "digiscope.h" #include "trx.h" #include "spectrum_viewer.h" #include "threads.h" #include "configuration.h" using namespace std; //extern Digiscope *fftscope; //extern spectrum *fftscope; #include "confdialog.h" extern Fl_Counter *fftviewer_scans; extern Fl_Counter *fftviewer_fcenter; extern Fl_Counter *fftviewer_frng; extern Fl_Button *pause_button; extern Fl_Box *annunciator; pthread_mutex_t fftmon_mutex = PTHREAD_MUTEX_INITIALIZER; bool b_write_fftfile = false; static std::string fftmonFilename; void toggle_scans(void *me) { fftmon *mon = (fftmon *)(me); if (mon->scans_stable) fftviewer_scans->color(FL_GREEN); else fftviewer_scans->color(FL_BACKGROUND_COLOR); fftviewer_scans->redraw(); } void fftmon::init() { } fftmon::~fftmon() { delete [] fftbuff; delete [] dftbuff; delete [] buffer; delete scanfft; } void fftmon::restart() { fftmon_sr = active_modem->get_samplerate(); memset(dftbuff, 0, fftmonFFT_LEN * sizeof(*dftbuff)); memset(fftbuff, 0, fftmonFFT_LEN * sizeof(*fftbuff)); for (int i = 0; i < LENdiv2; i++) fftfilt[i]->setLength(progdefaults.fftviewer_scans); scans_stable = false; numscans = 0; Fl::awake(toggle_scans, this); } fftmon::fftmon() { fftbuff = new double[fftmonFFT_LEN]; dftbuff = new double[fftmonFFT_LEN]; buffer = new double[fftmonFFT_LEN / 2]; for (int i = 0; i < LENdiv2; i++) { fftfilt[i] = new Cmovavg(1000); fftfilt[i]->setLength(progdefaults.fftviewer_scans); } for (int i = 0; i < fftmonFFT_LEN; i++) bshape[i] = blackman(1.0 * i / fftmonFFT_LEN); scanfft = new g_fft(fftmonFFT_LEN); fftmonFilename = TempDir; fftmonFilename.append("rx_spectrum.csv"); cap &= ~CAP_TX; // rx only modem restart(); } //======================================================================= // //======================================================================= // static double scopebuff[LENdiv2]; static double filebuff[LENdiv2]; double goto_freq() { int fc = fftscope->gofreq(); int fr = progdefaults.fftviewer_frng; int rem = 0; if (fc < 100) fc = 100; if (fr < 200) fr = 200; if (fc + fr/2 > 4000) fr = (4000 - fc)/2; if (fc < fr/2) fr = fc * 2; rem = fr % 20; fr /= 20; if (rem >= 10) fr = fr + 1; fr *= 20; if (fr > 4000) fr = 4000; progdefaults.fftviewer_frng = fr; progdefaults.fftviewer_fcenter = fc; fftviewer_fcenter->value(fc); fftviewer_fcenter->redraw(); fftviewer_frng->value(fr); fftviewer_frng->redraw(); fftscope->gofreq(0); return fc; } void write_to_fftscope(void *) { // clear scope views fftscope->clear_axis(); double f0 = progdefaults.fftviewer_fcenter - progdefaults.fftviewer_frng / 2; double f1 = progdefaults.fftviewer_fcenter + progdefaults.fftviewer_frng / 2; double sr = active_modem->get_samplerate(); if (fftscope->gofreq()) f0 = goto_freq(); int n0 = LENdiv2 * (8000.0 / sr) * (f0 / 4000.0); int n1 = LENdiv2 * (8000.0 / sr) * (f1 / 4000.0); // vertical graticule, every 10 dB int N = progdefaults.fftviewer_range / 10; for (int i = 1; i < N; i++) fftscope->xaxis(i, 1.0 * i / N); // horizontal graticule int incr = 500; if (progdefaults.fftviewer_frng <= 2000) incr = 200; if (progdefaults.fftviewer_frng <= 1000) incr = 100; if (progdefaults.fftviewer_frng <= 500 ) incr = 50; if (progdefaults.fftviewer_frng <= 250) incr = 25; annunciator->label( (incr == 500) ? "10 db/div, 500 Hz/div" : (incr == 200) ? "10 db/div, 200 Hz/div" : (incr == 100) ? "10 db/div, 100 Hz/div" : (incr == 50) ? "10 db/div, 50 Hz/div" : "10 db/div, 25 Hz/div"); annunciator->redraw_label(); int xp = f0; int xpd = xp % incr; double xpos = 1.0 * (incr - xpd) / progdefaults.fftviewer_frng; double fincr = 1.0 * incr / progdefaults.fftviewer_frng; int n = 1; while (xpos < 1.0) { fftscope->yaxis(n, xpos); xpos += fincr; n++; } if (fftscope->paused()) pause_button->label("Paused"); else pause_button->label("Running"); pause_button->redraw_label(); static char msg[100]; snprintf(msg, sizeof(msg), " %.0f Hz, %.1f dB", fftscope->freq(), fftscope->db()); values->value(msg); if (fftscope->db_diff()) { snprintf(msg, sizeof(msg), "%.0f dB", fftscope->db_diff()); db_diffs->value(msg); snprintf(msg, sizeof(msg), "%.0f Hz", fabs(fftscope->f_diff())); f_diffs->value(msg); } else { db_diffs->value(""); f_diffs->value(""); } fftscope->data(&scopebuff[n0], n1 - n0, false); fftscope->redraw(); } // add mutex lock void write_to_fftfile(void *) { guard_lock gl_filebuff(&fftmon_mutex); b_write_fftfile = false; double sr = active_modem->get_samplerate(); FILE *out = fl_fopen(fftmonFilename.c_str(), "w"); if (unlikely(!out)) { LOG_PERROR("fl_fopen"); return; } fprintf(out, "Frequency,Magnitude\n"); for (int i = 0; i < LENdiv2; i++) fprintf(out, "%0.1f, %f\n", i * sr / fftmonFFT_LEN, filebuff[i]); fclose(out); } void fftmon::update_fftscope() { if (!fftscope) return; if (b_write_fftfile) Fl::awake(write_to_fftfile); if ( !fftscope->paused() ) { guard_lock gl_filebuff(&fftmon_mutex); double val = 0; for (int i = 0; i < LENdiv2; i++) { val = fftbuff[i] / LENdiv2; if (val < 1e-6) val = 1e-6; if (val > 1) val = 1.0; filebuff[i] = val; buffer[i] = 20 * log10f(val); } } for (int i = 0; i < LENdiv2; i++) scopebuff[i] = 1.0 + (buffer[i] - progdefaults.fftviewer_maxdb)/progdefaults.fftviewer_range; Fl::awake(write_to_fftscope); } static std::complex fftmon_temp[fftmonFFT_LEN]; int fftmon::rx_process(const double *buf, int len) { if (len > fftmonFFT_LEN) return 0; // if audio playback if (fftmon_sr != active_modem->get_samplerate()) restart(); for (int i = 0; i < fftmonFFT_LEN - len; i++) dftbuff[i] = dftbuff[i + len]; for (int i = 0; i < len; i++) { dftbuff[fftmonFFT_LEN - len + i] = buf[i]; } double val; for (int i = 0; i < fftmonFFT_LEN; i++) { val = dftbuff[i] * bshape[i]; fftmon_temp[i] = std::complex(val, 0);//val); } scanfft->ComplexFFT(fftmon_temp); for (int i = 0; i < fftmonFFT_LEN/2; i++) fftbuff[i] = fftfilt[i]->run(abs(fftmon_temp[i])); update_fftscope(); if (!scans_stable) { if (numscans++ >= progdefaults.fftviewer_scans) { scans_stable = true; Fl::awake(toggle_scans, this); } } return 0; } fldigi-4.1.06/src/fft-monitor/spectrum_viewer.cxx0000644000175000017500000003254313472116001016765 00000000000000// ---------------------------------------------------------------------------- // spectrum_viewer.cxx -- spectrum dialog // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "configuration.h" #include "status.h" #include "spectrum.h" #include "spectrum_viewer.h" #include "fft-monitor.h" #include "gettext.h" #include "modem.h" #include "trx.h" Fl_Double_Window *spectrum_viewer = (Fl_Double_Window *)0; spectrum *fftscope = (spectrum *)0; Fl_Group *fftmon_mnuFrame = (Fl_Group *)0; Fl_Group *group1 = (Fl_Group *)0; Fl_Group *group2 = (Fl_Group *)0; Fl_Counter *fftviewer_scans = (Fl_Counter *)0; Fl_Counter *fftviewer_range = (Fl_Counter *)0; Fl_Counter *fftviewer_maxdb = (Fl_Counter *)0; Fl_Counter *fftviewer_fcenter = (Fl_Counter *)0; Fl_Counter *fftviewer_frng = (Fl_Counter *)0; Fl_Button *fftviewer_reset = (Fl_Button *)0; Fl_Button *fftviewer_goto = (Fl_Button *)0; Fl_Group *g1 = (Fl_Group *)0; Fl_Group *g3 = (Fl_Group *)0; Fl_Group *g2 = (Fl_Group *)0; Fl_Menu_Bar *fftmon_mnu_bar = (Fl_Menu_Bar *)0; Fl_Output *values = (Fl_Output *)0; Fl_Output *db_diffs = (Fl_Output *)0; Fl_Output *f_diffs = (Fl_Output *)0; Fl_Button *pause_button = (Fl_Button *)0; Fl_Box *annunciator = (Fl_Box *)0; fftmon *fft_modem = (fftmon *)0; void cb_fftviewer_scans(Fl_Counter *w, void *d) { progdefaults.fftviewer_scans = w->value(); fft_modem->restart(); } void cb_fftviewer_range(Fl_Counter *w, void *d) { progdefaults.fftviewer_range = w->value(); } void cb_fftviewer_maxdb(Fl_Counter *w, void *d) { progdefaults.fftviewer_maxdb = w->value(); } void check_frng(int fr) { int fc = progdefaults.fftviewer_fcenter; if (fc - fr/2 < 0) fr = 2*fc; if (fc + fr/2 > 4000) fr = 2*(4000 - fc); progdefaults.fftviewer_frng = fr; fftviewer_frng->value(fr); fftviewer_frng->redraw(); } void cb_fftviewer_fcenter(Fl_Counter *w, void *d) { progdefaults.fftviewer_fcenter = w->value(); int fr = progdefaults.fftviewer_frng; check_frng(fr); } void cb_fftviewer_frng(Fl_Counter *w, void *d) { progdefaults.fftviewer_frng = w->value(); int fr = progdefaults.fftviewer_frng; check_frng(fr); } void cb_fftviewer_reset(Fl_Button *b, void *d) { progdefaults.fftviewer_fcenter = 2000; progdefaults.fftviewer_frng = 4000; fftviewer_fcenter->value(2000); fftviewer_frng->value(4000); fftviewer_fcenter->redraw(); fftviewer_frng->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } } void cb_pause_button(Fl_Button *b, void *d) { fftscope->paused( !fftscope->paused() ); } void cb_fftviewer_goto(Fl_Button *b, void *d) { progdefaults.fftviewer_fcenter = active_modem->get_freq(); int fr = progdefaults.fftviewer_frng; if (progdefaults.wf_spectrum_modem_scale) fr = progdefaults.wf_spectrum_scale_factor * active_modem->get_bandwidth(); check_frng(fr); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } } void cb_spectrum_viewer(Fl_Double_Window *w, void *) { progStatus.svX = spectrum_viewer->x(); progStatus.svY = spectrum_viewer->y(); progStatus.svW = spectrum_viewer->w(); progStatus.svH = spectrum_viewer->h(); spectrum_viewer->hide(); return; } void cb_mnu_fftmon_close(Fl_Menu_*, void*) { cb_spectrum_viewer(0,0); } extern bool b_write_fftfile; void cb_mnu_fftmon_csv(Fl_Menu_*, void*) { if (!b_write_fftfile) b_write_fftfile = true; } void cb_mnu_x_graticule(Fl_Menu_*, void*) { progStatus.x_graticule = true; progStatus.y_graticule = false; progStatus.xy_graticule = false; fftscope->x_graticule(true); fftscope->y_graticule(false); } void cb_mnu_y_graticule(Fl_Menu_*, void*) { progStatus.y_graticule = true; progStatus.x_graticule = false; progStatus.xy_graticule = false; fftscope->x_graticule(false); fftscope->y_graticule(true); } void cb_mnu_xy_graticules(Fl_Menu_*, void*) { progStatus.xy_graticule = true; progStatus.x_graticule = false; progStatus.y_graticule = false; fftscope->x_graticule(true); fftscope->y_graticule(true); } Fl_Menu_Item fftmon_menu[] = { {_("&Dialog"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, {_("&Graticule"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { _("X graticule"), 0, (Fl_Callback*)cb_mnu_x_graticule, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { _("Y graticule"), 0, (Fl_Callback*)cb_mnu_y_graticule, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { _("X/Y graticules"), 0, (Fl_Callback*)cb_mnu_xy_graticules, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { 0 }, {_("&Save to CSV"), 0, (Fl_Callback*)cb_mnu_fftmon_csv, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, {_("&Close"), 0, (Fl_Callback*)cb_mnu_fftmon_close, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, { 0 }, { 0 } }; #define VALWIDTH 120 #define DIFFSWIDTH 80 #define PAUSEWIDTH 60 #define ANNUNWIDTH 140 #define WIDTHS (VALWIDTH + 2*DIFFSWIDTH + PAUSEWIDTH + ANNUNWIDTH) #define STATUS_COLOR 0xfdf5e600 void create_spectrum_viewer() { if (spectrum_viewer) return; spectrum_viewer = new Fl_Double_Window(0, 0, 550, 400, "Spectrum Scope"); spectrum_viewer->xclass(PACKAGE_NAME); fftmon_mnuFrame = new Fl_Group(0,0, spectrum_viewer->w(), 20); fftmon_mnu_bar = new Fl_Menu_Bar(0, 0, fftmon_mnuFrame->w() - WIDTHS, 20); fftmon_mnu_bar->menu(fftmon_menu); pause_button = new Fl_Button( fftmon_mnu_bar->x() + fftmon_mnu_bar->w(), 0, PAUSEWIDTH, 20, "Running"); pause_button->callback((Fl_Callback*)cb_pause_button); annunciator = new Fl_Box( pause_button->x() + pause_button->w(), 0, ANNUNWIDTH, 20, ""); annunciator->box(FL_DOWN_BOX); annunciator->color(STATUS_COLOR); values = new Fl_Output( annunciator->x() + annunciator->w(), 0, VALWIDTH, 20, ""); values->value(""); values->color(STATUS_COLOR); db_diffs = new Fl_Output( values->x() + values->w(), 0, DIFFSWIDTH, 20, ""); db_diffs->value(""); db_diffs->color(STATUS_COLOR); f_diffs = new Fl_Output( db_diffs->x() + db_diffs->w(), 0, DIFFSWIDTH, 20, ""); f_diffs->value(""); f_diffs->color(STATUS_COLOR); fftmon_mnuFrame->resizable(fftmon_mnu_bar); fftmon_mnuFrame->end(); group1 = new Fl_Group(0, 20, 550, 330); fftscope = new spectrum (group1->x(), group1->y(), group1->w(), group1->h()); group1->resizable(fftscope); group1->end(); group1->show(); group2 = new Fl_Group(0, 350, 550, 50); g1 = new Fl_Group(0, 350, 548, 50, ""); fftviewer_scans = new Fl_Counter(5, 360, 100, 22, "# scans"); fftviewer_scans->minimum(1); fftviewer_scans->maximum(500); fftviewer_scans->step(1); fftviewer_scans->lstep(10.0); fftviewer_scans->value(50); fftviewer_scans->callback((Fl_Callback*)cb_fftviewer_scans); fftviewer_scans->value(progdefaults.fftviewer_scans); fftviewer_scans->tooltip(_("each display point an average of past N fft values")); fftviewer_range = new Fl_Counter( 5 + fftviewer_scans->x() + fftviewer_scans->w(), 360, 80, 22, "dB Range"); fftviewer_range->type(1); fftviewer_range->minimum(20); fftviewer_range->maximum(120); fftviewer_range->step(10); fftviewer_range->value(60); fftviewer_range->callback((Fl_Callback*)cb_fftviewer_range); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->tooltip(_("range of dB scale")); fftviewer_maxdb = new Fl_Counter( 5 + fftviewer_range->x() + fftviewer_range->w(), 360, 80, 22, "upper dB"); fftviewer_maxdb->type(1); fftviewer_maxdb->minimum(-60); fftviewer_maxdb->maximum(0); fftviewer_maxdb->step(10); fftviewer_maxdb->value(0); fftviewer_maxdb->callback((Fl_Callback*)cb_fftviewer_maxdb); fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->tooltip(_("offset Db scale")); int xp = 5 + fftviewer_maxdb->x() + fftviewer_maxdb->w(); g2 = new Fl_Group( xp, 352, g1->w() - 2 - xp, 46, ""); g2->box(FL_ENGRAVED_FRAME); fftviewer_fcenter = new Fl_Counter( 5 + g2->x(), 358, 100, 22, "F-center"); fftviewer_fcenter->minimum(0); fftviewer_fcenter->maximum(3950); fftviewer_fcenter->step(1); fftviewer_fcenter->lstep(10); fftviewer_fcenter->value(0); fftviewer_fcenter->callback((Fl_Callback*)cb_fftviewer_fcenter); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->tooltip(_("center frequency")); fftviewer_frng = new Fl_Counter( 5 + fftviewer_fcenter->x() + fftviewer_fcenter->w(), 358, 110, 22, "F-range"); fftviewer_frng->minimum(100); fftviewer_frng->maximum(4000); fftviewer_frng->step(20); fftviewer_frng->lstep(100); fftviewer_frng->value(4000); fftviewer_frng->callback((Fl_Callback*)cb_fftviewer_frng); fftviewer_frng->value(progdefaults.fftviewer_frng); fftviewer_frng->tooltip(_("frequency range")); fftviewer_reset = new Fl_Button( 5 + fftviewer_frng->x() + fftviewer_frng->w(), 354, 38, 20, "Reset"); fftviewer_reset->callback((Fl_Callback*)cb_fftviewer_reset); fftviewer_reset->tooltip(_("Center = 2000, Range = 4000")); fftviewer_goto = new Fl_Button( 5 + fftviewer_frng->x() + fftviewer_frng->w(), 376, 38, 20, "Goto"); fftviewer_goto->callback((Fl_Callback*)cb_fftviewer_goto); fftviewer_goto->tooltip(_("Center - wf track\nRange = 10 * mode-bw")); g2->end(); g1->end(); g3 = new Fl_Group(spectrum_viewer->w() - 2, 350, 2, 50, ""); g3->end(); group2->end(); group2->resizable(g3); spectrum_viewer->resizable(group1); spectrum_viewer->size_range(550, 400); spectrum_viewer->end(); spectrum_viewer->callback((Fl_Callback *)cb_spectrum_viewer); if (progStatus.x_graticule) { fftmon_menu[2].setonly(); fftscope->x_graticule(true); fftscope->y_graticule(false); } else if (progStatus.y_graticule) { fftmon_menu[3].setonly(); fftscope->x_graticule(false); fftscope->y_graticule(true); } else { fftmon_menu[4].setonly(); fftscope->x_graticule(true); fftscope->y_graticule(true); } } //====================================================================== void open_spectrum_viewer() { if (!spectrum_viewer) create_spectrum_viewer(); if (!fft_modem) { progdefaults.fftviewer_fcenter = active_modem->get_freq(); fft_modem = new fftmon(); active_modem->set_freq(progdefaults.fftviewer_fcenter); } else progdefaults.fftviewer_fcenter = active_modem->get_freq(); int fr = progdefaults.fftviewer_frng; if (progdefaults.wf_spectrum_modem_scale) fr = progdefaults.wf_spectrum_scale_factor * active_modem->get_bandwidth(); check_frng(fr); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } spectrum_viewer->show(); spectrum_viewer->redraw(); spectrum_viewer->resize(progStatus.svX, progStatus.svY, progStatus.svW, progStatus.svH); } void close_spectrum_viewer() { if (spectrum_viewer) { spectrum_viewer->hide(); delete spectrum_viewer; spectrum_viewer = 0; } if (fft_modem) { delete fft_modem; fft_modem = 0; } } void recenter_spectrum_viewer() { if (!spectrum_viewer) return; if (!spectrum_viewer->visible()) return; if (!progdefaults.wf_spectrum_center) return; if (!fft_modem) return; progdefaults.fftviewer_fcenter = active_modem->get_freq(); int fr = progdefaults.fftviewer_frng; if (progdefaults.wf_spectrum_modem_scale) fr = progdefaults.wf_spectrum_scale_factor * active_modem->get_bandwidth(); check_frng(fr); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } spectrum_viewer->redraw(); } fldigi-4.1.06/src/cw_rtty/0000775000175000017500000000000013515625026012332 500000000000000fldigi-4.1.06/src/cw_rtty/nanoIO.cxx0000644000175000017500000003217413512100425014152 00000000000000// ---------------------------------------------------------------------------- // nanoIO.cxx -- Interface to Arduino Nano keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "fl_digi.h" #include "nanoIO.h" #include "serial.h" #include "morse.h" #include "strutil.h" #define LOG_TINYFSK LOG_INFO using namespace std; Cserial nano_serial; bool use_nanoIO = false; bool nanoIO_isCW = false; static cMorse *nano_morse = 0; // use during debugging void sent(std::string s) { // std::cout << "sent:\"" << s << "\"" << std::endl; } void rcvd(std::string s) { // std::cout << "rcvd:\"" << s << "\"" << std::endl; } void nano_display_io(string s, int style) { if (s.empty()) return; REQ(&FTextBase::addstr, txt_nano_io, s, style); REQ(&FTextBase::addstr, txt_nano_CW_io, s, style); } int nano_serial_write(char c) { if (!use_nanoIO) return 1; unsigned char buffer[2]; buffer[0] = c; buffer[1] = '\0'; return nano_serial.WriteBuffer(buffer, 1); } char nano_read_byte(int msec) { std::string resp; resp.clear(); resp = nano_serial_read(); int numtries = msec/100; while (resp.empty() && numtries) { MilliSleep(100); resp = nano_serial_read(); numtries--; } if (resp.empty()) return 0; return resp[0]; } string nano_read_string(int msec_wait, string find) { std::string resp; int timer = msec_wait; if (!find.empty()) { while (timer && (resp.find(find) == std::string::npos)) { resp.append(nano_serial_read()); --timer; } } else { while (timer) { resp.append(nano_serial_read()); --timer; } } return resp; } bool nanoIO_busy = false; void nano_send_char(int c) { if (nanoIO_isCW) { if (c == GET_TX_CHAR_NODATA) { MilliSleep(50); return; } if (c == 0x0d) return; if (c == 0x0a || c == ' ') { MilliSleep(4*1200/progdefaults.CWspeed); } else { if (nano_morse == 0) return; if (c == '^' || c == '|') { nano_serial_write(c); return; } int len = nano_morse->tx_length(c); if (len) { nanoIO_busy = true; nano_serial_write(c); MilliSleep(1200 * len / progdefaults.CWspeed); nanoIO_busy = false; } else return; } return; } int charlen = 165; // msec for start + 5 data + 1.5 stop bits @ 45.45 if (c == GET_TX_CHAR_NODATA) { MilliSleep(charlen); // start + 5 data + 1.5 stop bits return; } nano_serial_write(c); if (progdefaults.nanoIO_baud == 50.0) charlen = 150; if (progdefaults.nanoIO_baud == 75.0) charlen = 100; if (progdefaults.nanoIO_baud == 100.0) charlen = 75; MilliSleep(charlen); // start + 5 data + 1.5 stop bits } void nano_sendString (const std::string &s) { sent(s); for (size_t n = 0; n < s.length(); n++) nano_serial_write(s[n]); return; } void nano_PTT(int val) { if (!use_nanoIO) return; nano_serial_write(val ? '[' : ']'); } void nano_cancel_transmit() { nano_serial_write('\\'); } void nano_mark_polarity(int v) { std::string resp; nano_serial_write('~'); nano_serial_write( v == 0 ? '1' : // MARK high '0'); // MARK low resp = nano_serial_read(); nano_display_io(resp, FTextBase::ALTR); } void nano_MARK_is(int val) { progdefaults.nanoIO_polarity = val; chk_nanoIO_polarity->value(val); } void nano_set_baud(int bd) { std::string resp; nano_serial_write('~'); nano_serial_write( bd == 3 ? '9' : // 100.0 baud bd == 2 ? '7' : // 75.0 baud bd == 1 ? '5' : // 50.0 baud '4'); // 45.45 baud resp = nano_serial_read(); nano_display_io(resp, FTextBase::ALTR); } void nano_baud_is(int val) { int index = 2; if (val == 45) index = 0; if (val == 50) index = 1; if (val == 100) index = 2; progdefaults.nanoIO_baud = index; sel_nanoIO_baud->index(index); } static int pot_min, pot_rng; static bool nanoIO_has_pot = false; void init_pot_min_max() { nanoIO_has_pot = true; btn_nanoIO_pot->activate(); nanoIO_use_pot(); cntr_nanoIO_min_wpm->activate(); cntr_nanoIO_rng_wpm->activate(); cntr_nanoIO_min_wpm->value(pot_min); cntr_nanoIO_rng_wpm->value(pot_rng); cntr_nanoIO_min_wpm->redraw(); cntr_nanoIO_rng_wpm->redraw(); } void disable_min_max() { btn_nanoIO_pot->deactivate(); cntr_nanoIO_min_wpm->deactivate(); cntr_nanoIO_rng_wpm->deactivate(); } // this function must be called from within the main UI thread // use REQ(nano_parse_config, s); void nano_parse_config(std::string s) { nano_display_io(s, FTextBase::ALTR); size_t p1 = 0; if (s.find("nanoIO") == std::string::npos) return; if (s.find("HIGH") != std::string::npos) nano_MARK_is(1); if (s.find("LOW") != std::string::npos) nano_MARK_is(0); if (s.find("45.45") != std::string::npos) nano_baud_is(45); if (s.find("50.0") != std::string::npos) nano_baud_is(50); if (s.find("75.0") != std::string::npos) nano_baud_is(75); if (s.find("100.0") != std::string::npos) nano_baud_is(100); if ((p1 = s.find("WPM")) != std::string::npos) { p1 += 4; int wpm = progdefaults.CWspeed; if (sscanf(s.substr(p1).c_str(), "%d", &wpm)) { progdefaults.CWspeed = wpm; cntCW_WPM->value(wpm); cntr_nanoCW_WPM->value(wpm); sldrCWxmtWPM->value(wpm); } } if ((p1 = s.find("/", p1)) != std::string::npos) { p1++; int wpm = progdefaults.CW_keyspeed; if (sscanf(s.substr(p1).c_str(), "%d", &wpm)) { progdefaults.CW_keyspeed = wpm; cntr_nanoCW_paddle_WPM->value(wpm); } } else { // ver 1.1.x if ((p1 = s.find("WPM", p1 + 4)) != std::string::npos) { p1++; int wpm = progdefaults.CW_keyspeed; if (sscanf(s.substr(p1).c_str(), "%d", &wpm)) { progdefaults.CW_keyspeed = wpm; cntr_nanoCW_paddle_WPM->value(wpm); } } } if ((p1 = s.find("dash/dot ")) != std::string::npos) { p1 += 9; float val = progdefaults.CWdash2dot; if (sscanf(s.substr(p1).c_str(), "%f", &val)) { progdefaults.CWdash2dot = val; cntCWdash2dot->value(val); cnt_nanoCWdash2dot->value(val); } } if ((p1 = s.find("PTT")) != std::string::npos) { if (s.find("NO", p1 + 4) != std::string::npos) progdefaults.disable_CW_PTT = true; else progdefaults.disable_CW_PTT = false; } else progdefaults.disable_CW_PTT = false; nanoIO_set_cw_ptt(); if ((p1 = s.find("Speed Pot")) != std::string::npos) { size_t p2 = s.find("ON", p1); int OK = 0; p2 = s.find("minimum", p1); if (p2 != std::string::npos) OK = sscanf(&s[p2 + 8], "%d", &pot_min); p2 = s.find("range", p1); if (p2 != std::string::npos) OK = sscanf(&s[p2 + 6], "%d", &pot_rng); if (OK) init_pot_min_max(); } else disable_min_max(); return; } int open_port(std::string PORT) { if (PORT.empty()) return false; nano_serial.Device(PORT); nano_serial.Baud(9600); nano_serial.Timeout(10); nano_serial.Retries(5); nano_serial.Stopbits(1); if (!nano_serial.OpenPort()) { nano_display_io("\nCould not open serial port!", FTextBase::ALTR); LOG_ERROR("Could not open %s", progdefaults.nanoIO_serial_port_name.c_str()); return false; } use_nanoIO = true; nano_display_io("Connected to nanoIO\n", FTextBase::RECV); return true; } std::string nano_serial_read() { static char buffer[4096]; memset(buffer, '\0',4096); int rb = nano_serial.ReadBuffer((unsigned char *)buffer, 4095); if (rb) return buffer; return ""; } void nano_serial_flush() { static char buffer[1025]; REQ(rcvd,"nano_serial_flush():"); while (nano_serial.ReadBuffer((unsigned char *)buffer, 1024) ) ; } void no_cmd(void *) { nano_display_io("Could not read current configuration\n", FTextBase::ALTR); } void close_nanoIO() { nano_serial.ClosePort(); use_nanoIO = false; nano_display_io("Disconnected from nanoIO\n", FTextBase::RECV); if (nano_morse) { delete nano_morse; nano_morse = 0; } progStatus.nanoCW_online = false; progStatus.nanoFSK_online = false; nanoIO_isCW = false; enable_rtty_quickchange(); } bool open_nano() { if (use_nanoIO) return true; if (!open_port(progdefaults.nanoIO_serial_port_name)) return false; return true; } bool open_nanoIO() { std::string rsp; progStatus.nanoCW_online = false; progStatus.nanoFSK_online = false; if (open_nano()) { set_nanoIO(); nano_sendString("~?"); rsp = nano_read_string(100, "PTT"); size_t p = rsp.find("~?"); if (p == std::string::npos) return false; rsp.erase(0, p + 3); if (rsp.find("eyer") != std::string::npos) REQ(nano_parse_config, rsp); progStatus.nanoFSK_online = true; nanoIO_isCW = false; disable_rtty_quickchange(); return true; } return false; } bool open_nanoCW() { if (nano_morse == 0) nano_morse = new cMorse; progStatus.nanoCW_online = false; progStatus.nanoFSK_online = false; std::string rsp; if (open_nano()) { set_nanoCW(); nano_sendString("~?"); rsp = nano_read_string(100, "PTT"); size_t p = rsp.find("~?"); if (p == std::string::npos) return false; rsp.erase(0, p + 3); if (rsp.find("eyer") != std::string::npos) REQ(nano_parse_config, rsp); progStatus.nanoCW_online = true; return true; } return false; } void set_nanoIO() { if (progStatus.nanoFSK_online) return; std::string cmd = "~F"; std::string rsp; int count = 10; while (rsp.empty() && count--) { nano_sendString(cmd); rsp = nano_read_string(10, cmd); } } void set_nanoCW() { std::string cmd = "~C"; std::string rsp; int count = 10; while (rsp.empty() && count--) { nano_sendString(cmd); rsp = nano_read_string(10, cmd); } if (rsp.find(cmd) != std::string::npos) { nanoIO_isCW = true; set_nanoWPM(progdefaults.CWspeed); set_nano_dash2dot(progdefaults.CWdash2dot); } } void set_nanoWPM(int wpm) { static char szwpm[10]; if (wpm > 60 || wpm < 5) return; snprintf(szwpm, sizeof(szwpm), "~S%ds", wpm); nano_sendString(szwpm); std::string rsp = nano_read_string(100, szwpm); REQ(rcvd,rsp); } void set_nano_keyerWPM(int wpm) { static char szwpm[10]; if (wpm > 60 || wpm < 5) return; snprintf(szwpm, sizeof(szwpm), "~U%du", wpm); nano_sendString(szwpm); std::string rsp = nano_read_string(100, szwpm); REQ(rcvd,rsp); } void set_nano_dash2dot(float wt) { static char szd2d[10]; if (wt < 2.5 || wt > 3.5) return; snprintf(szd2d, sizeof(szd2d), "~D%3dd", (int)(wt * 100) ); nano_sendString(szd2d); std::string rsp = nano_read_string(100, szd2d); REQ(rcvd,rsp); } void nano_CW_query() { nano_serial_flush(); nano_sendString("~?"); string resp = nano_read_string(100, "PTT"); REQ(rcvd,resp); nano_display_io(resp, FTextBase::ALTR); REQ(nano_parse_config, resp); } void nano_help() { nano_serial_flush(); nano_sendString("~~"); string resp = nano_read_string(500, "cmds"); REQ(rcvd,resp); nano_display_io(resp, FTextBase::ALTR); } void nano_CW_save() { nano_sendString("~W"); std::string rsp = nano_read_string(100, "~W"); REQ(rcvd,rsp); } void nanoCW_tune(int val) { if (val) nano_sendString("~T"); else nano_sendString("]"); } void set_nanoIO_incr() { std::string s_incr = "~I"; s_incr += progdefaults.nanoIO_CW_incr; nano_sendString(s_incr); std::string rsp = nano_read_string(100, s_incr); REQ(rcvd,rsp); } void set_nanoIO_keyer(int indx) { std::string s; if (indx == 0) s = "~A"; if (indx == 1) s = "~B"; if (indx == 2) s = "~K"; nano_sendString(s); std::string rsp = nano_read_string(100, s); REQ(rcvd,rsp); } void nanoIO_set_cw_ptt() { std::string s = "~X"; s += progdefaults.disable_CW_PTT ? '0' : '1'; nano_sendString(s); std::string rsp = nano_read_string(100, s); REQ(rcvd, rsp); } void nanoIO_read_pot() { if (!use_nanoIO) return; if (!nanoIO_has_pot) return; if (!progdefaults.nanoIO_speed_pot) return; if (nanoIO_busy) return; // reread the current pot setting static char szval[10]; std::string rsp; snprintf(szval, sizeof(szval), "~P?"); nano_sendString(szval); rsp = nano_read_string(100, szval); REQ(rcvd, rsp); int val = 0; size_t p = rsp.find("wpm"); if (p != std::string::npos) { rsp.erase(0,p); if (sscanf(rsp.c_str(), "wpm %d", &val) == 1) { REQ(set_paddle_WPM, val); } } } void nanoIO_use_pot() { std::string s = "~P"; if (progdefaults.nanoIO_speed_pot) s += '1'; else s += '0'; nano_sendString(s); std::string rsp = nano_read_string(100, s); REQ(rcvd, rsp); nanoIO_read_pot(); } void set_paddle_WPM (int wpm) { cntr_nanoCW_paddle_WPM->value(wpm); cntr_nanoCW_paddle_WPM->redraw(); } void set_nanoIO_min_max() { static char szval[10]; std::string rsp; // set min value for potentiometer snprintf(szval, sizeof(szval), "~M%dm", (int)cntr_nanoIO_min_wpm->value()); nano_sendString(szval); rsp = nano_read_string(100, szval); REQ(rcvd, rsp); // set range value of potentiometer snprintf(szval, sizeof(szval), "~N%dn", (int)cntr_nanoIO_rng_wpm->value()); nano_sendString(szval); rsp = nano_read_string(100, szval); REQ(rcvd, rsp); nanoIO_read_pot(); } fldigi-4.1.06/src/cw_rtty/rtty.cxx0000644000175000017500000010544713472115772014015 00000000000000// ---------------------------------------------------------------------------- // rtty.cxx -- RTTY modem // // Copyright (C) 2012 // Dave Freese, W1HKJ // Stefan Fendt, DL1SMF // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include using namespace std; //#include "rtty.h" #include "view_rtty.h" #include "fl_digi.h" #include "digiscope.h" #include "misc.h" #include "waterfall.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "digiscope.h" #include "trx.h" #include "debug.h" #include "synop.h" #include "main.h" #include "modem.h" #include "rtty.h" #define FILTER_DEBUG 0 #define SHAPER_BAUD 150 //===================================================================== // Baudot support //===================================================================== static char letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', ' ', 'M', 'X', 'V', ' ' }; /* * U.S. version of the figures case. */ static char figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', ' ', '.', '/', ';', ' ' }; int dspcnt = 0; static char msg1[20]; const double rtty::SHIFT[] = {23, 85, 160, 170, 182, 200, 240, 350, 425, 850}; // FILTLEN must be same size as BAUD const double rtty::BAUD[] = {45, 45.45, 50, 56, 75, 100, 110, 150, 200, 300}; const int rtty::FILTLEN[] = { 512, 512, 512, 512, 512, 512, 512, 256, 128, 64}; const int rtty::BITS[] = {5, 7, 8}; const int rtty::numshifts = (int)(sizeof(SHIFT) / sizeof(*SHIFT)); const int rtty::numbauds = (int)(sizeof(BAUD) / sizeof(*BAUD)); void rtty::tx_init() { phaseacc = 0; preamble = true; videoText(); symbols = 0; acc_symbols = 0; ovhd_symbols = 0; } // Customizes output of Synop decoded data. struct rtty_callback : public synop_callback { // Callback for writing decoded synop messages. void print(const char * str, size_t nb, bool bold ) const { // Could choose: FTextBase::CTRL,XMIT,RECV int style = bold ? FTextBase::XMIT : FTextBase::RECV; for( size_t i = 0; i < nb; ++i ) { unsigned char c = str[i]; put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c, style ); } } // Should we log new Synop messages to the current Adif log file ? bool log_adif(void) const { return progdefaults.SynopAdifDecoding ;} // Should we log new Synop messages to KML file ? bool log_kml(void) const { return progdefaults.SynopKmlDecoding ;} bool interleaved(void) const { return progdefaults.SynopInterleaved ;} }; void rtty::rx_init() { rxstate = RTTY_RX_STATE_IDLE; rxmode = LETTERS; phaseacc = 0; FSKphaseacc = 0; for (int i = 0; i < MAXBITS; i++ ) bit_buf[i] = 0.0; mark_phase = 0; space_phase = 0; xy_phase = 0.0; mark_mag = 0; space_mag = 0; mark_env = 0; space_env = 0; inp_ptr = 0; lastchar = 0; // Synop file is reloaded each time we enter this modem. Ideally do that when the file is changed. static bool wmo_loaded = false ; if( wmo_loaded == false ) { wmo_loaded = true ; SynopDB::Init(PKGDATADIR); } /// Used by weather reports decoding. synop::setup(); synop::instance()->init(); } void rtty::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); // Probably not necessary because similar to modem::set_reverse reverse = wfrev ^ !wfsb; stopflag = false; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.RTTYsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); rx_init(); put_MODEstatus(mode); if ((rtty_baud - (int)rtty_baud) == 0) snprintf(msg1, sizeof(msg1), "%-3.0f/%-4.0f", rtty_baud, rtty_shift); else snprintf(msg1, sizeof(msg1), "%-4.2f/%-4.0f", rtty_baud, rtty_shift); put_Status1(msg1); if (progdefaults.PreferXhairScope) set_scope_mode(Digiscope::XHAIRS); else set_scope_mode(Digiscope::RTTY); for (int i = 0; i < MAXPIPE; i++) mark_history[i] = space_history[i] = cmplx(0,0); lastchar = 0; } rtty::~rtty() { if (rttyviewer) delete rttyviewer; if (mark_filt) delete mark_filt; if (space_filt) delete space_filt; if (pipe) delete [] pipe; if (dsppipe) delete [] dsppipe; if (bits) delete bits; delete m_Osc1; delete m_Osc2; delete m_SymShaper1; delete m_SymShaper2; } void rtty::reset_filters() { delete mark_filt; mark_filt = new fftfilt(rtty_baud/samplerate, filter_length); mark_filt->rtty_filter(rtty_baud/samplerate); delete space_filt; space_filt = new fftfilt(rtty_baud/samplerate, filter_length); space_filt->rtty_filter(rtty_baud/samplerate); } void rtty::restart() { double stl; rtty_shift = shift = (progdefaults.rtty_shift < numshifts ? SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); if (progdefaults.rtty_baud > numbauds - 1) progdefaults.rtty_baud = numbauds - 1; rtty_baud = BAUD[progdefaults.rtty_baud]; filter_length = FILTLEN[progdefaults.rtty_baud]; nbits = rtty_bits = BITS[progdefaults.rtty_bits]; if (rtty_bits == 5) rtty_parity = RTTY_PARITY_NONE; else switch (progdefaults.rtty_parity) { case 0 : rtty_parity = RTTY_PARITY_NONE; break; case 1 : rtty_parity = RTTY_PARITY_EVEN; break; case 2 : rtty_parity = RTTY_PARITY_ODD; break; case 3 : rtty_parity = RTTY_PARITY_ZERO; break; case 4 : rtty_parity = RTTY_PARITY_ONE; break; default : rtty_parity = RTTY_PARITY_NONE; break; } // (exists below already) rtty_stop = progdefaults.rtty_stop; txmode = LETTERS; rxmode = LETTERS; symbollen = (int) (samplerate / rtty_baud + 0.5); set_bandwidth(shift); rtty_BW = progdefaults.RTTY_BW = rtty_baud * 2; wf->redraw_marker(); reset_filters(); if (bits) bits->setLength(symbollen / 8);//2); else bits = new Cmovavg(symbollen / 8);//2); mark_noise = space_noise = 0; bit = nubit = true; // stop length = 1, 1.5 or 2 bits rtty_stop = progdefaults.rtty_stop; if (rtty_stop == 0) stl = 1.0; else if (rtty_stop == 1) stl = 1.5; else stl = 2.0; stoplen = (int) (stl * samplerate / rtty_baud + 0.5); freqerr = 0.0; pipeptr = 0; for (int i = 0; i < MAXBITS; i++ ) bit_buf[i] = 0.0; metric = 0.0; if ((rtty_baud - (int)rtty_baud) == 0) snprintf(msg1, sizeof(msg1), "%-3.0f/%-4.0f", rtty_baud, rtty_shift); else snprintf(msg1, sizeof(msg1), "%-4.2f/%-4.0f", rtty_baud, rtty_shift); put_Status1(msg1); put_MODEstatus(mode); for (int i = 0; i < MAXPIPE; i++) QI[i] = cmplx(0.0, 0.0); sigpwr = 0.0; noisepwr = 0.0; sigsearch = 0; dspcnt = 2*(nbits + 2); clear_zdata = true; // restart symbol-rtty_shaper m_SymShaper1->Preset(rtty_baud, samplerate); m_SymShaper2->Preset(rtty_baud, samplerate); mark_phase = 0; space_phase = 0; xy_phase = 0.0; mark_mag = 0; space_mag = 0; mark_env = 0; space_env = 0; inp_ptr = 0; for (int i = 0; i < MAXPIPE; i++) mark_history[i] = space_history[i] = cmplx(0,0); // if (::rttyviewer) ::rttyviewer->restart(); if (rttyviewer) rttyviewer->restart(); progStatus.rtty_filter_changed = false; } rtty::rtty(trx_mode tty_mode) { cap |= CAP_AFC | CAP_REV; mode = tty_mode; samplerate = RTTY_SampleRate; mark_filt = (fftfilt *)0; space_filt = (fftfilt *)0; bits = (Cmovavg *)0; pipe = new double[MAXPIPE]; dsppipe = new double [MAXPIPE]; // if (::rttyviewer == 0) ::rttyviewer = new view_rtty(mode); rttyviewer = new view_rtty(mode); m_Osc1 = new Oscillator( samplerate ); m_Osc2 = new Oscillator( samplerate ); m_SymShaper1 = new SymbolShaper( 45, samplerate ); m_SymShaper2 = new SymbolShaper( 45, samplerate ); restart(); } void rtty::Update_syncscope() { int j; for (int i = 0; i < symbollen; i++) { j = pipeptr - i; if (j < 0) j += symbollen; dsppipe[i] = pipe[j]; } set_scope(dsppipe, symbollen, false); } void rtty::Clear_syncscope() { set_scope(0, 0, false); } cmplx rtty::mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in; phase -= TWOPI * f / samplerate; if (phase < -TWOPI) phase += TWOPI; return z; } unsigned char rtty::Bit_reverse(unsigned char in, int n) { unsigned char out = 0; for (int i = 0; i < n; i++) out = (out << 1) | ((in >> i) & 1); return out; } static int rparity(int c) { int w = c; int p = 0; while (w) { p += (w & 1); w >>= 1; } return p & 1; } int rtty::rttyparity(unsigned int c) { c &= (1 << nbits) - 1; switch (rtty_parity) { default: case RTTY_PARITY_NONE: return 0; case RTTY_PARITY_ODD: return rparity(c); case RTTY_PARITY_EVEN: return !rparity(c); case RTTY_PARITY_ZERO: return 0; case RTTY_PARITY_ONE: return 1; } } int rtty::decode_char() { unsigned int parbit, par, data; parbit = (rxdata >> nbits) & 1; par = rttyparity(rxdata); if (rtty_parity != RTTY_PARITY_NONE && parbit != par) return 0; data = rxdata & ((1 << nbits) - 1); if (nbits == 5) return baudot_dec(data); return data; } bool rtty::is_mark_space( int &correction) { correction = 0; // test for rough bit position if (bit_buf[0] && !bit_buf[symbollen-1]) { // test for mark/space straddle point for (int i = 0; i < symbollen; i++) correction += bit_buf[i]; if (abs(symbollen/2 - correction) < 6) // too small & bad signals are not decoded return true; } return false; } bool rtty::is_mark() { return bit_buf[symbollen / 2]; } bool rtty::rx(bool bit) // original modified for probability test { bool flag = false; unsigned char c = 0; int correction; for (int i = 1; i < symbollen; i++) bit_buf[i-1] = bit_buf[i]; bit_buf[symbollen - 1] = bit; switch (rxstate) { case RTTY_RX_STATE_IDLE: if ( is_mark_space(correction)) { rxstate = RTTY_RX_STATE_START; counter = correction; } break; case RTTY_RX_STATE_START: if (--counter == 0) { if (!is_mark()) { rxstate = RTTY_RX_STATE_DATA; counter = symbollen; bitcntr = 0; rxdata = 0; } else { rxstate = RTTY_RX_STATE_IDLE; } } break; case RTTY_RX_STATE_DATA: if (--counter == 0) { rxdata |= is_mark() << bitcntr++; counter = symbollen; } if (bitcntr == nbits + (rtty_parity != RTTY_PARITY_NONE ? 1 : 0)) rxstate = RTTY_RX_STATE_STOP; break; case RTTY_RX_STATE_STOP: if (--counter == 0) { if (is_mark()) { if ((metric >= progStatus.sldrSquelchValue && progStatus.sqlonoff) || !progStatus.sqlonoff) { c = decode_char(); if( progdefaults.SynopAdifDecoding || progdefaults.SynopKmlDecoding ) { if (c != 0 && c != '\r') { synop::instance()->add(c); } else { if( synop::instance()->enabled() ) synop::instance()->flush(false); put_rx_char(c); } } else if ( c != 0 ) { // supress and sequences // these were observed during the RTTY contest 2/9/2013 if (c == '\r' && lastchar == '\r'); else if (c == '\n' && lastchar == '\n'); else put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); lastchar = c; } flag = true; } } rxstate = RTTY_RX_STATE_IDLE; } break; default : break; } return flag; } char snrmsg[80]; void rtty::Metric() { double delta = rtty_baud/8.0; double np = wf->powerDensity(frequency, delta) * 3000 / delta; double sp = wf->powerDensity(frequency - shift/2, delta) + wf->powerDensity(frequency + shift/2, delta) + 1e-10; double snr = 0; sigpwr = decayavg( sigpwr, sp, sp > sigpwr ? 2 : 8); noisepwr = decayavg( noisepwr, np, 16 ); snr = 10*log10(sigpwr / noisepwr); snprintf(snrmsg, sizeof(snrmsg), "s/n %-3.0f dB", snr); put_Status2(snrmsg); metric = CLAMP((3000 / delta) * (sigpwr/noisepwr), 0.0, 100.0); display_metric(metric); } void rtty::searchDown() { double srchfreq = frequency - shift -100; double minfreq = shift * 2 + 100; double spwrlo, spwrhi, npwr; while (srchfreq > minfreq) { spwrlo = wf->powerDensity(srchfreq - shift/2, 2*rtty_baud); spwrhi = wf->powerDensity(srchfreq + shift/2, 2*rtty_baud); npwr = wf->powerDensity(srchfreq + shift, 2*rtty_baud) + 1e-10; if ((spwrlo / npwr > 10.0) && (spwrhi / npwr > 10.0)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq -= 5.0; } } void rtty::searchUp() { double srchfreq = frequency + shift +100; double maxfreq = IMAGE_WIDTH - shift * 2 - 100; double spwrhi, spwrlo, npwr; while (srchfreq < maxfreq) { spwrlo = wf->powerDensity(srchfreq - shift/2, 2*rtty_baud); spwrhi = wf->powerDensity(srchfreq + shift/2, 2*rtty_baud); npwr = wf->powerDensity(srchfreq - shift, 2*rtty_baud) + 1e-10; if ((spwrlo / npwr > 10.0) && (spwrhi / npwr > 10.0)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq += 5.0; } } #if FILTER_DEBUG == 1 int snum = 0; int mnum = 0; #define ook(sp) \ { \ value = sin(2.0*M_PI*( \ (((sp / symbollen) % 2 == 0) ? (frequency + shift/2.0) : (frequency - shift/2.0))\ /samplerate)*sp); \ } std::fstream ook_signal("ook_signal.csv", std::ios::out ); #endif int rtty::rx_process(const double *buf, int len) { const double *buffer = buf; int length = len; static int showxy = symbollen; cmplx z, zmark, zspace, *zp_mark, *zp_space; int n_out = 0; static int bitcount = 5 * nbits * symbollen; if ( !progdefaults.report_when_visible || dlgViewer->visible() || progStatus.show_channels ) if (!bHistory && rttyviewer) rttyviewer->rx_process(buf, len); if (progStatus.rtty_filter_changed) { progStatus.rtty_filter_changed = false; reset_filters(); } { reverse = wf->Reverse() ^ !wf->USB(); } Metric(); #if FILTER_DEBUG == 1 double value; #endif while (length-- > 0) { // Create analytic signal from sound card input samples #if FILTER_DEBUG == 1 if (snum < 2 * filter_length) { frequency = 1000.0; ook(snum); z = cmplx(value, value); ook_signal << snum << "," << z.real() << ","; // snum++; } else { z = cmplx(*buffer, *buffer); } #else z = cmplx(*buffer, *buffer); #endif buffer++; // Mix it with the audio carrier frequency to create two baseband signals // mark and space are separated and processed independently // lowpass Windowed Sinc - Overlap-Add convolution filters. // The two fftfilt's are the same size and processed in sync // therefore the mark and space filters will concurrently have the // same size outputs available for further processing zmark = mixer(mark_phase, frequency + shift/2.0, z); mark_filt->run(zmark, &zp_mark); zspace = mixer(space_phase, frequency - shift/2.0, z); n_out = space_filt->run(zspace, &zp_space); #if FILTER_DEBUG == 1 if (snum < 2 * filter_length) { ook_signal << abs(zmark) <<"\n"; snum++; } #endif for (int i = 0; i < n_out; i++) { mark_mag = abs(zp_mark[i]); mark_env = decayavg (mark_env, mark_mag, (mark_mag > mark_env) ? symbollen / 4 : symbollen * 16); mark_noise = decayavg (mark_noise, mark_mag, (mark_mag < mark_noise) ? symbollen / 4 : symbollen * 48); space_mag = abs(zp_space[i]); space_env = decayavg (space_env, space_mag, (space_mag > space_env) ? symbollen / 4 : symbollen * 16); space_noise = decayavg (space_noise, space_mag, (space_mag < space_noise) ? symbollen / 4 : symbollen * 48); #if FILTER_DEBUG == 1 if (mnum < 2 * filter_length) ook_signal << ",,," << mnum++ + filter_length / 2 << "," << mark_mag << "," << space_mag << "\n"; #endif noise_floor = min(space_noise, mark_noise); // clipped if clipped decoder selected double mclipped = 0, sclipped = 0; mclipped = mark_mag > mark_env ? mark_env : mark_mag; sclipped = space_mag > space_env ? space_env : space_mag; if (mclipped < noise_floor) mclipped = noise_floor; if (sclipped < noise_floor) sclipped = noise_floor; switch (progdefaults.rtty_cwi) { case 1 : // mark only decode space_env = sclipped = noise_floor; break; case 2: // space only decode mark_env = mclipped = noise_floor; default : ; } // double v0, v1, v2, v3, v4, v5; double v3; // no ATC // v0 = mark_mag - space_mag; // Linear ATC // v1 = mark_mag - space_mag - 0.5 * (mark_env - space_env); // Clipped ATC // v2 = (mclipped - noise_floor) - (sclipped - noise_floor) - 0.5 * ( // (mark_env - noise_floor) - (space_env - noise_floor)); // Optimal ATC v3 = (mclipped - noise_floor) * (mark_env - noise_floor) - (sclipped - noise_floor) * (space_env - noise_floor) - 0.25 * ( (mark_env - noise_floor) * (mark_env - noise_floor) - (space_env - noise_floor) * (space_env - noise_floor)); // Kahn Squarer with Linear ATC // v4 = (mark_mag - noise_floor) * (mark_mag - noise_floor) - // (space_mag - noise_floor) * (space_mag - noise_floor) - 0.25 * ( // (mark_env - noise_floor) * (mark_env - noise_floor) - // (space_env - noise_floor) * (space_env - noise_floor)); // Kahn Squarer with Clipped ATC // v5 = (mclipped - noise_floor) * (mclipped - noise_floor) - // (sclipped - noise_floor) * (sclipped - noise_floor) - 0.25 * ( // (mark_env - noise_floor) * (mark_env - noise_floor) - // (space_env - noise_floor) * (space_env - noise_floor)); // switch (progdefaults.rtty_demodulator) { // switch (2) { // Optimal ATC // case 0: // linear ATC // bit = v1 > 0; // break; // case 1: // clipped ATC // bit = v2 > 0; // break; // case 2: // optimal ATC bit = v3 > 0; // break; // case 3: // Kahn linear ATC // bit = v4 > 0; // break; // case 4: // Kahn clipped // bit = v5 > 0; // break; // case 5: // No ATC // default : // bit = v0 > 0; // } // XY scope signal generation if (progdefaults.true_scope) { //---------------------------------------------------------------------- // "true" scope implementation------------------------------------------ //---------------------------------------------------------------------- // get the baseband-signal and... xy = cmplx( zp_mark[i].real() * cos(xy_phase) + zp_mark[i].imag() * sin(xy_phase), zp_space[i].real() * cos(xy_phase) + zp_space[i].imag() * sin(xy_phase) ); // if mark-tone has a higher magnitude than the space-tone, // further reduce the scope's space-amplitude and vice versa // this makes the scope looking a little bit nicer, too... // aka: less noisy... if( abs(zp_mark[i]) > abs(zp_space[i]) ) { // note ox x complex lib does not support xy.real(double) or xy.imag(double) xy = cmplx( xy.real(), xy.imag() * abs(zp_space[i])/abs(zp_mark[i]) ); // xy.imag() *= abs(zp_space[i])/abs(zp_mark[i]); } else { xy = cmplx( xy.real() / ( abs(zp_space[i])/abs(zp_mark[i]) ), xy.imag() ); // xy.real() /= abs(zp_space[i])/abs(zp_mark[i]); } // now normalize the scope double const norm = 1.3*(abs(zp_mark [i]) + abs(zp_space[i])); xy /= norm; } else { //---------------------------------------------------------------------- // "ortho" scope implementation----------------------------------------- //---------------------------------------------------------------------- // get magnitude of the baseband-signal if (bit) xy = cmplx( mark_mag * cos(xy_phase), space_noise * sin(xy_phase) / 2.0); else xy = cmplx( mark_noise * cos(xy_phase) / 2.0, space_mag * sin(xy_phase)); // now normalize the scope double const norm = (mark_env + space_env); xy /= norm; } // Rotate the scope x-y iaw frequency error. Old scopes were not capable // of this, but it should be very handy, so... who cares of realism anyways? double const rotate = 8 * TWOPI * freqerr / rtty_shift; xy = xy * cmplx(cos(rotate), sin(rotate)); QI[inp_ptr] = xy; // shift it to 128Hz(!) and not to it's original position. // this makes it more pretty and does not remove it's other // qualities. Reason is that this is a fraction of the used // block-size. xy_phase += (TWOPI * (128.0 / samplerate)); // end XY signal generation mark_history[inp_ptr] = zp_mark[i]; space_history[inp_ptr] = zp_space[i]; inp_ptr = (inp_ptr + 1) % MAXPIPE; if (dspcnt && (--dspcnt % (nbits + 2) == 0)) { pipe[pipeptr] = bit - 0.5; //testbit - 0.5; pipeptr = (pipeptr + 1) % symbollen; } // detect TTY signal transitions // rx(...) returns true if valid TTY bit stream detected // either character or idle signal if ( rx( reverse ? !bit : bit ) ) { dspcnt = symbollen * (nbits + 2); if (!bHighSpeed) Update_syncscope(); clear_zdata = true; bitcount = 5 * nbits * symbollen; if (sigsearch) sigsearch--; int mp0 = inp_ptr - 2; int mp1 = mp0 + 1; if (mp0 < 0) mp0 += MAXPIPE; if (mp1 < 0) mp1 += MAXPIPE; double ferr = (TWOPI * samplerate / rtty_baud) * (!reverse ? arg(conj(mark_history[mp1]) * mark_history[mp0]) : arg(conj(space_history[mp1]) * space_history[mp0])); if (fabs(ferr) > rtty_baud / 2) ferr = 0; freqerr = decayavg ( freqerr, ferr / 8, progdefaults.rtty_afcspeed == 0 ? 8 : progdefaults.rtty_afcspeed == 1 ? 4 : 1 ); if (progStatus.afconoff && (metric > progStatus.sldrSquelchValue || !progStatus.sqlonoff)) set_freq(frequency - freqerr); } else if (bitcount) --bitcount; } if (!bHighSpeed) { if (!bitcount) { if (clear_zdata) { clear_zdata = false; Clear_syncscope(); for (int i = 0; i < MAXPIPE; i++) QI[i] = cmplx(0.0, 0.0); } } if (!--showxy) { set_zdata(QI, MAXPIPE); showxy = symbollen; } } } return 0; } //===================================================================== // RTTY transmit //===================================================================== //double freq1; double maxamp = 0; double rtty::nco(double freq) { phaseacc += TWOPI * freq / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; return cos(phaseacc); } double rtty::FSKnco() { FSKphaseacc += TWOPI * 1000 / samplerate; if (FSKphaseacc > TWOPI) FSKphaseacc -= TWOPI; return sin(FSKphaseacc); } void rtty::send_symbol(int symbol, int len) { acc_symbols += len; //#if !SHAPER_BAUD if (!progStatus.shaped_rtty) { //if (rtty_baud > SHAPER_BAUD) { double freq; if (reverse) symbol = !symbol; if (symbol) freq = get_txfreq_woffset() + shift / 2.0; else freq = get_txfreq_woffset() - shift / 2.0; for (int i = 0; i < len; i++) { outbuf[i] = nco(freq); if (symbol) FSKbuf[i] = FSKnco(); else FSKbuf[i] = 0.0 * FSKnco(); } } else { //#else double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0; double signal = 0; if (reverse) symbol = !symbol; if (maxamp == 0) { int sym = 0; for (int j = 0; j < 100; j++) { if (sym) sym = 0; else sym = 1; for( int i = 0; i < 3*len; ++i ) { mark = m_SymShaper1->Update( sym) * m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!sym) * m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); } } } for( int i = 0; i < len; ++i ) { mark = m_SymShaper1->Update( symbol) * m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!symbol) * m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) { maxamp = fabs(signal); } outbuf[i] = maxamp ? (0.99 * signal / maxamp) : 0.0; if (symbol) FSKbuf[i] = FSKnco(); else FSKbuf[i] = 0.0 * FSKnco(); } } //#endif if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, symbollen); else ModulateXmtr(outbuf, symbollen); } void rtty::send_stop() { //#if !SHAPER_BAUD if (!progStatus.shaped_rtty) { //if (rtty_baud >= SHAPER_BAUD) { double freq; bool invert = reverse; if (invert) freq = get_txfreq_woffset() - shift / 2.0; else freq = get_txfreq_woffset() + shift / 2.0; for (int i = 0; i < stoplen; i++) { outbuf[i] = nco(freq); if (invert) FSKbuf[i] = 0.0 * FSKnco(); else FSKbuf[i] = FSKnco(); } } else { //#else double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0, signal = 0; bool symbol = true; if (reverse) symbol = !symbol; for( int i = 0; i < stoplen; ++i ) { mark = m_SymShaper1->Update( symbol)*m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!symbol)*m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); outbuf[i] = maxamp ? (0.99 * signal / maxamp) : 0.0; if (reverse) FSKbuf[i] = 0.0 * FSKnco(); else FSKbuf[i] = FSKnco(); } } //#endif if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, stoplen); else ModulateXmtr(outbuf, stoplen); } void rtty::flush_stream() { double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0, signal = 0; for( int i = 0; i < symbollen * 6; ++i ) { mark = m_SymShaper1->Update(0)*m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(0)*m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); outbuf[i] = maxamp ? (0.99 * signal / maxamp) : 0.0; FSKbuf[i] = 0.0; } if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, symbollen * 6); else ModulateXmtr(outbuf, symbollen * 6); } void rtty::send_char(int c) { int i; if (nbits == 5) { if (c == LETTERS) c = 0x1F; if (c == FIGURES) c = 0x1B; } // start bit send_symbol(0, symbollen); // data bits for (i = 0; i < nbits; i++) { send_symbol((c >> i) & 1, symbollen); } // parity bit if (rtty_parity != RTTY_PARITY_NONE) send_symbol(rttyparity(c), symbollen); // stop bit(s) send_stop(); if (nbits == 5) { if (c == 0x1F || c == 0x1B) return; if (txmode == LETTERS) c = letters[c]; else c = figures[c]; if (c) put_echo_char(progdefaults.rx_lowercase ? tolower(c) : c); } else put_echo_char(c); } void rtty::send_idle() { if (nbits == 5) { send_char(LETTERS); txmode = LETTERS; } else send_char(0); } static int line_char_count = 0; // 1 start, 5 data, 1.5/2.0 stopbits #define wait_one_byte(baud, stopbits) \ MilliSleep( (int)((6 + (stopbits))*1000.0 / (baud))); int rtty::tx_process() { modem::tx_process(); int c = get_tx_char(); if (progStatus.nanoFSK_online) { if (preamble) { start_deadman(); for (int i = 0; i < progdefaults.TTY_LTRS; i++) nano_send_char(-1); preamble = false; nano_send_char(-1); nano_send_char(-1); } if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; stop_deadman(); return -1; } // send idle character if c == -1 // nanoIO does not return an idle character in it's buffer so fldigi // must insert a suitable time delay to account for the idle if (c == GET_TX_CHAR_NODATA) { wait_one_byte( progdefaults.nanoIO_baud, 1.5); return 0; } nano_send_char(c); put_echo_char(c); return 0; } if (use_Nav) { if (preamble) { start_deadman(); for (int i = 0; i < progdefaults.TTY_LTRS; i++) Nav_send_char(-1); preamble = false; } if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; stop_deadman(); return -1; } if (c == GET_TX_CHAR_NODATA) { Nav_send_char(-1); return 0; } Nav_send_char(c); put_echo_char(c); return 0; } if (progStatus.WK_online && progStatus.WKFSK_mode) { if (preamble) { start_deadman(); WKFSK_send_char('['); preamble = false; } if (c == GET_TX_CHAR_ETX || stopflag) { if (stopflag) WKFSK_send_char('\\'); WKFSK_send_char(']'); stop_deadman(); stopflag = false; return -1; } // send idle character if c == -1 // must insert a suitable time delay to account for the idle if (c == GET_TX_CHAR_NODATA) { wait_one_byte( (progStatus.WKFSK_baud == 0 ? 45.45 : progStatus.WKFSK_baud == 1 ? 50.0 : progStatus.WKFSK_baud == 2 ? 75.0 : 100.0), (progStatus.WKFSK_stopbits == 0 ? 2.0 : 1.5)); return 0; } else { WKFSK_send_char(c); put_echo_char(c); wait_one_byte( (progStatus.WKFSK_baud == 0 ? 45.45 : progStatus.WKFSK_baud == 1 ? 50.0 : progStatus.WKFSK_baud == 2 ? 75.0 : 100.0), (progStatus.WKFSK_stopbits == 0 ? 2.0 : 1.5)); } return 0; } if (preamble) { m_SymShaper1->reset(); m_SymShaper2->reset(); send_stop(); for (int i = 0; i < progdefaults.TTY_LTRS; i++) send_idle(); preamble = false; } // TX buffer empty if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; line_char_count = 0; if (nbits != 5) { if (progdefaults.rtty_crcrlf) send_char('\r'); send_char('\r'); send_char('\n'); } else { if (progdefaults.rtty_crcrlf) send_char(0x08); send_char(0x08); send_char(0x02); } flush_stream(); cwid(); return -1; } // send idle character if c == -1 if (c == GET_TX_CHAR_NODATA) { send_idle(); return 0; } // if NOT Baudot if (nbits != 5) { acc_symbols = 0; send_char(c); xmt_samples = char_samples = acc_symbols; return 0; } if (isalpha(c) || isdigit(c) || isblank(c) || ispunct(c)) { ++line_char_count; } if (progdefaults.rtty_autocrlf && (c != '\n' && c != '\r') && (line_char_count == progdefaults.rtty_autocount || (line_char_count > progdefaults.rtty_autocount - 5 && c == ' '))) { line_char_count = 0; if (progdefaults.rtty_crcrlf) send_char(0x08); // CR-CR-LF triplet send_char(0x08); send_char(0x02); if (c == ' ') return 0; } if (c == '\r') { line_char_count = 0; send_char(0x08); return 0; } if (c == '\n') { line_char_count = 0; if (progdefaults.rtty_crcrlf) send_char(0x08); // CR-CR-LF triplet send_char(0x02); return 0; } /* unshift-on-space */ if (c == ' ') { if (progdefaults.UOStx) { send_char(LETTERS); send_char(0x04); // coded value for a space txmode = LETTERS; } else send_char(0x04); return 0; } if ((c = baudot_enc(c)) < 0) return 0; // switch case if necessary if ((c & 0x300) != txmode) { if (txmode == FIGURES) { send_char(LETTERS); txmode = LETTERS; } else { send_char(FIGURES); txmode = FIGURES; } } /// acc_symbols = 0; send_char(c & 0x1F); xmt_samples = char_samples = acc_symbols; return 0; } int rtty::baudot_enc(unsigned char data) { int i, c, mode; mode = 0; c = -1; if (islower(data)) data = toupper(data); for (i = 0; i < 32; i++) { if (data == letters[i]) { mode |= LETTERS; c = i; } if (data == figures[i]) { mode |= FIGURES; c = i; } if (c != -1) return (mode | c); } return -1; } char rtty::baudot_dec(unsigned char data) { int out = 0; switch (data) { case 0x1F: /* letters */ rxmode = LETTERS; break; case 0x1B: /* figures */ rxmode = FIGURES; break; case 0x04: /* unshift-on-space */ if (progdefaults.UOSrx) rxmode = LETTERS; return ' '; break; default: if (rxmode == LETTERS) out = letters[data]; else out = figures[data]; break; } return out; } //====================================================================== // methods for class Oscillator and class SymbolShaper //====================================================================== Oscillator::Oscillator( double samplerate ) { m_phase = 0; m_samplerate = samplerate; // std::cerr << "samplerate for Oscillator:"< TWOPI ) m_phase -= TWOPI; return ( sin( m_phase ) ); } SymbolShaper::SymbolShaper(double baud, double sr) { m_sinc_table = 0; Preset( baud, sr ); } SymbolShaper::~SymbolShaper() { delete [] m_sinc_table; } void SymbolShaper::reset() { m_State = false; m_Accumulator = 0.0; m_Counter0 = 1024; m_Counter1 = 1024; m_Counter2 = 1024; m_Counter3 = 1024; m_Counter4 = 1024; m_Counter5 = 1024; m_Factor0 = 0.0; m_Factor1 = 0.0; m_Factor2 = 0.0; m_Factor3 = 0.0; m_Factor4 = 0.0; m_Factor5 = 0.0; } void SymbolShaper::Preset(double baud, double sr) { double baud_rate = baud; double sample_rate = sr; LOG_INFO("Shaper::reset( %f, %f )", baud_rate, sample_rate); // calculate new table-size for six integrators ---------------------- m_table_size = sample_rate / baud_rate * 5.49; LOG_INFO("Shaper::m_table_size = %d", m_table_size); // kill old sinc-table and get memory for the new one ----------------- if (m_sinc_table) delete [] m_sinc_table; m_sinc_table = new double[m_table_size]; // set up the new sinc-table based on the new parameters -------------- long double sum = 0.0; for( int x=0; x= m_table_size ) { m_Counter0 = 0; m_Factor0 = (state)? +1.0 : -1.0; } else if( m_Counter1 >= m_table_size ) { m_Counter1 = 0; m_Factor1 = (state)? +1.0 : -1.0; } else if( m_Counter2 >= m_table_size ) { m_Counter2 = 0; m_Factor2 = (state)? +1.0 : -1.0; } else if( m_Counter3 >= m_table_size ) { m_Counter3 = 0; m_Factor3 = (state)? +1.0 : -1.0; } else if( m_Counter4 >= m_table_size ) { m_Counter4 = 0; m_Factor4 = (state)? +1.0 : -1.0; } else if( m_Counter5 >= m_table_size ) { m_Counter5 = 0; m_Factor5 = (state)? +1.0 : -1.0; } } if( m_Counter0 < m_table_size ) m_Accumulator += m_Factor0 * m_sinc_table[m_Counter0++]; if( m_Counter1 < m_table_size ) m_Accumulator += m_Factor1 * m_sinc_table[m_Counter1++]; if( m_Counter2 < m_table_size ) m_Accumulator += m_Factor2 * m_sinc_table[m_Counter2++]; if( m_Counter3 < m_table_size ) m_Accumulator += m_Factor3 * m_sinc_table[m_Counter3++]; if( m_Counter4 < m_table_size ) m_Accumulator += m_Factor4 * m_sinc_table[m_Counter4++]; if( m_Counter5 < m_table_size ) m_Accumulator += m_Factor5 * m_sinc_table[m_Counter5++]; return ( m_Accumulator / sqrt(2) ); } void SymbolShaper::print_sinc_table() { for (int i = 0; i < 1024; i++) printf("%f\n", m_SincTable[i]); } fldigi-4.1.06/src/cw_rtty/view_cw.cxx0000644000175000017500000002265713472115772014457 00000000000000// ---------------------------------------------------------------------------- // view_cw.cxx // // (c) 2014 Mauri Niininen, AG1LE // (c) 2017 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // viewpsk is a multi channel psk decoder which allows the parallel processing // of the complete audio spectrum from 400 to 1150 Hz in equal 25 Hz // channels. Each channel is separately decoded and the decoded characters // passed to the user interface routines for presentation. The number of // channels can be up to and including 30. #include #include #include #include #include "cw.h" #include "view_cw.h" #include "pskeval.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "misc.h" #include "configuration.h" #include "Viewer.h" #include "qrunner.h" #include "status.h" #include "waterfall.h" extern waterfall *wf; #define CH_SPACING 50 #define VCW_FFT_SIZE 2048 // must be a factor of 2 enum {READY, NOT_READY}; cMorse *CW_CHANNEL::morse = 0; CW_CHANNEL::CW_CHANNEL() { bitfilter.setLength(10); trackingfilter.setLength(16); if (!morse) morse = new cMorse; VCW_filter = new fftfilt ((CH_SPACING * 0.4) / VCW_SAMPLERATE, VCW_FFT_SIZE); smpl_ctr = dec_ctr = 0; phi1 = phi2 = 0; } CW_CHANNEL::~CW_CHANNEL() { if (morse) { delete morse; morse = 0; } delete VCW_filter; } void CW_CHANNEL::init(int _ch, double _freq) { ch_freq = _freq; ch = _ch; phase = 0.0; phase_increment = TWOPI * ch_freq / VCW_SAMPLERATE; agc_peak = 0.0; sig_avg = 0.5; timeout = 0; smpl_ctr = 0; dec_ctr = 0; space_sent = true; last_element = 0; curr_element = 0; two_dots = 2 * VKWPM / progdefaults.CWspeed; sync_parameters(); } void CW_CHANNEL::reset() { space_sent = true; last_element = 0; curr_element = 0; decode_str.clear(); } void CW_CHANNEL::update_tracking(int dur_1, int dur_2) { static int min_dot = (VKWPM / 60) / 2; static int max_dash = 6 * VKWPM / 10; if ((dur_1 > dur_2) && (dur_1 > 4 * dur_2)) return; if ((dur_2 > dur_1) && (dur_2 > 4 * dur_1)) return; if (dur_1 < min_dot || dur_2 < min_dot) return; if (dur_2 > max_dash || dur_2 > max_dash) return; two_dots = trackingfilter.run((dur_1 + dur_2) / 2); } inline int CW_CHANNEL::sample_count(unsigned int earlier, unsigned int later) { return (earlier >= later) ? 0 : (later - earlier); } void CW_CHANNEL::sync_parameters() { trackingfilter.reset(); } enum {KEYDOWN, KEYUP, POST_TONE, QUERY }; int CW_CHANNEL::decode_state(int cw_state) { switch (cw_state) { case KEYDOWN: { if (cw_receive_state == KEYDOWN) return NOT_READY; // first tone in idle state reset audio sample counter if (cw_receive_state == KEYUP) { smpl_ctr = 0; rx_rep_buf.clear(); } // save the timestamp cw_rr_start_timestamp = smpl_ctr; // Set state to indicate we are inside a tone. cw_receive_state = KEYDOWN; return NOT_READY; break; } case KEYUP: { // The receive state is expected to be inside a tone. if (cw_receive_state != KEYDOWN) return NOT_READY; // Save the current timestamp curr_element = sample_count( cw_rr_start_timestamp, smpl_ctr ); cw_rr_end_timestamp = smpl_ctr; // If the tone length is shorter than any noise cancelling // threshold that has been set, then ignore this tone. if (curr_element < two_dots / 10) { cw_receive_state = KEYUP; return NOT_READY; } // Set up to track speed on dot-dash or dash-dot pairs for this test to // work, we need a dot dash pair or a dash dot pair to validate timing // from and force the speed tracking in the right direction. if (last_element > 0) update_tracking( last_element, curr_element ); last_element = curr_element; // a dot is anything shorter than 2 dot times if (curr_element <= two_dots) { rx_rep_buf += '.'; } else { rx_rep_buf += '-'; } // We just added a representation to the receive buffer. // If it's full, then reset everything as it is probably noise if (rx_rep_buf.length() > MAX_MORSE_ELEMENTS) { cw_receive_state = KEYUP; rx_rep_buf.clear(); smpl_ctr = 0; // reset audio sample counter return NOT_READY; } // All is well. Move to the more normal after-tone state. cw_receive_state = POST_TONE; return NOT_READY; break; } case QUERY: { // this should be called quite often (faster than inter-character gap) It looks after timing // key up intervals and determining when a character, a word space, or an error char '*' should be returned. // READY is returned when there is a printable character. Nothing to do if we are in a tone if (cw_receive_state == KEYDOWN) return NOT_READY; // in this call we expect a pointer to a char to be valid if (cw_state == KEYDOWN || cw_state == KEYUP) { // else we had no place to put character... cw_receive_state = KEYUP; rx_rep_buf.clear(); // reset decoding pointer return NOT_READY; } // compute length of silence so far // sync_parameters(); curr_element = sample_count( cw_rr_end_timestamp, smpl_ctr ); // SHORT time since keyup... nothing to do yet if (curr_element < two_dots) return NOT_READY; // MEDIUM time since keyup... check for character space // one shot through this code via receive state logic if ((curr_element > two_dots) && (curr_element < 2 * two_dots) ) { // && cw_receive_state == POST_TONE) { std::string code = morse->rx_lookup(rx_rep_buf); if (code.empty()) { decode_str.clear(); cw_receive_state = KEYUP; rx_rep_buf.clear(); space_sent = false; return NOT_READY ; } decode_str = code; cw_receive_state = KEYUP; rx_rep_buf.clear(); space_sent = false; return READY; } // LONG time since keyup... check for a word space if ((curr_element > 2 * two_dots) && !space_sent) { decode_str = " "; space_sent = true; return READY; } break; } } return NOT_READY; } void CW_CHANNEL::detect_tone() { norm_sig = 0; CWupper = 0; CWlower = 0; sig_avg = decayavg(sig_avg, value, 1000); if (value > sig_avg) { if (value > agc_peak) agc_peak = decayavg(agc_peak, value, 100); else agc_peak = decayavg(agc_peak, value, 1000); } if (!agc_peak) return; value /= agc_peak; norm_sig = sig_avg / agc_peak; // metric = 0.8 * metric; // metric += 0.2 * clamp(20*log10(sig_avg / noise_floor) , 0, 40); metric = clamp(20*log10(sig_avg / noise_floor) , 0, 40); CWupper = norm_sig + 0.1; CWlower = norm_sig - 0.1; if (metric > progStatus.VIEWER_cwsquelch ) { if ((value >= CWupper) && (cw_receive_state != KEYDOWN)) decode_state(KEYDOWN); if ((value < CWlower) && (cw_receive_state == KEYDOWN)) decode_state(KEYUP); if ((decode_state(QUERY) == READY) ) { for (size_t n = 0; n < decode_str.length(); n++) REQ(&viewaddchr, ch, (int)ch_freq, decode_str[n], (int)MODE_CW); timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WFBLOCKSIZE; decode_str.clear(); rx_rep_buf.clear(); } } } void CW_CHANNEL::rx_process(const double *buf, int len) { cmplx z, *zp; int n = 0; while (len-- > 0) { z = cmplx ( *buf * cos(phase), *buf * sin(phase) ); buf++; phase += phase_increment; if (phase > TWOPI) phase -= TWOPI; n = VCW_filter->run(z, &zp); if (n) { for (int i = 0; i < n; i++) { if (++dec_ctr < VCW_DEC_RATIO) continue; dec_ctr = 0; smpl_ctr++; value = bitfilter.run(abs(zp[i])); detect_tone(); } } } } //====================================================================== // view_cw //====================================================================== view_cw::view_cw() { for (int i = 0; i < VCW_MAXCH; i++) channel[i].reset(); viewmode = MODE_CW; } view_cw::~view_cw() { } void view_cw::init() { nchannels = progdefaults.VIEWERchannels; for (int i = 0; i < VCW_MAXCH; i++) { channel[i].init(i, 400.0 + CH_SPACING * i); } for (int i = 0; i < nchannels; i++) REQ(&viewclearchannel, i); } void view_cw::restart() { for (int i = 0; i < VCW_MAXCH; i++) { channel[i].space_sent = true; channel[i].last_element = 0; channel[i].curr_element = 0; channel[i].two_dots = 2 * VKWPM / progdefaults.CWspeed; } init(); } void view_cw::clearch(int n) { REQ( &viewclearchannel, n); REQ( &viewaddchr, n, (int)NULLFREQ, 0, viewmode); } void view_cw::clear() { for (int i = 0; i < VCW_MAXCH; i++) clearch(i); } int view_cw::rx_process(const double *buf, int len) { double nf = 1e8; if (nchannels != progdefaults.VIEWERchannels) init(); for (int n = 0; n < nchannels; n++) { channel[n].rx_process(buf, len); if (nf > channel[n].avg_signal() && channel[n].avg_signal() > 1e-3) nf = channel[n].avg_signal(); if (channel[n].timeout) if (! --channel[n].timeout) clearch(n); } if (nf <= 1e-3) nf = 1e-3; for (int n = 0; n < nchannels; n++) channel[n].set_noise_floor(nf); return 0; } int view_cw::get_freq(int n) { return (int)channel[n].ch_freq; } fldigi-4.1.06/src/cw_rtty/Nav.cxx0000644000175000017500000003447513472115772013541 00000000000000// ---------------------------------------------------------------------------- // Nav.cxx -- Interface to Arduino Nano Nav keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "main.h" #include "fl_digi.h" #include "gettext.h" #include "rtty.h" #include "serial.h" #include "Nav.h" bool use_Nav = false; static int tty_mode = LETTERS; static Cserial Nav_serial; static Cserial Nav_config; //#define NAVDEBUG 1 static void print_string(std::string s) { #ifdef NAVDEBUG std::string fname = HomeDir; fname.append("nav_debug.txt"); std::ofstream dbgfile(fname.c_str(), std::ios::app); dbgfile << s; dbgfile.close(); #else LOG_INFO("%s", s.c_str()); #endif ReceiveText->add(s.c_str()); } static std::string Nav_config_string = "\ 11101111012"; static std::string config_params = "\ ||||||||||+-10 FSK stop bits - 1:1, 2:1.5, 3: 2 bits\n\ |||||||||+---9 FSK BAUD rate - 1: 45.45, 2: 75, 3: 100 baud\n\ ||||||||+----8 FSK PTT - 0: PTT disabled, 1: PTT enabled\n\ |||||||+-----7 FSK side tone - 0: no tone, 1: tone\n\ ||||||+------6 FSK polarity - 0: reverse, 1: normal polarity\n\ |||||+-------5 CAT LED behavior - 0: steady, 1: on-access poll\n\ ||||+--------4 LED brightness - 0: DIM, 1: normal brightness\n\ |||+---------3 WinKey PTT - 0: no PTT, 1: WinKey PTT\n\ ||+----------2 RF attenuator - 0: 20db atten', 1: no atten'\n\ |+-----------1 CH.2 attenuator - 0: 15db atten', 1: no atten'\n\ +------------0 CH.1 attenuator - 0: 15db atten', 1: no atten'\n"; void Nav_update_config_controls() { switch (Nav_config_string[0]) { // channel 1 attenuator default: case '1': sel_Nav_ch1->index(1); break; case '0': sel_Nav_ch1->index(0); break; } switch (Nav_config_string[1]) { // channel 2 attenuator default: case '1': sel_Nav_ch2->index(1); break; case '0': sel_Nav_ch2->index(0); break; } switch (Nav_config_string[2]) { // rf attenuator default: case '1': sel_Nav_rf_att->index(1); break; case '0': sel_Nav_rf_att->index(0); break; } switch (Nav_config_string[3]) { // Winkey PTT default: case '1': sel_Nav_wk_ptt->index(0); break; case '0': sel_Nav_wk_ptt->index(1); break; } switch (Nav_config_string[4]) { // LED default: case '1': sel_Nav_LED->index(1); break; case '0': sel_Nav_LED->index(0); break; } switch (Nav_config_string[5]) { // CAT LED default: case '1': sel_Nav_CAT_LED->index(1); break; case '0': sel_Nav_CAT_LED->index(0); break; } switch (Nav_config_string[6]) { // polarity default: case '0': sel_Nav_FSK_polarity->index(1); break; case '1': sel_Nav_FSK_polarity->index(0); break; } switch (Nav_config_string[7]) { // sidetone default: case '1': sel_Nav_FSK_sidetone->index(0); break; case '0': sel_Nav_FSK_sidetone->index(1); break; } switch (Nav_config_string[8]) { // PTT default: case '1': sel_Nav_FSK_ptt->index(0); break; case '0': sel_Nav_FSK_ptt->index(1); break; } switch (Nav_config_string[9]) { // baud default: case '1' : sel_Nav_FSK_baud->index(0); break; case '2' : sel_Nav_FSK_baud->index(1); break; case '3' : sel_Nav_FSK_baud->index(2); break; } switch (Nav_config_string[10]) { // stop bits default: case '1': sel_Nav_FSK_stopbits->index(0); break; case '2': sel_Nav_FSK_stopbits->index(1); break; case '3': sel_Nav_FSK_stopbits->index(2); break; } print_string(std::string(Nav_config_string).append("\n").append(config_params)); } void Nav_set_configuration() { std::string cmd = "KL"; cmd.append(Nav_config_string).append("\r\n"); Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kl") != std::string::npos) { print_string(_("Config change accepted\n")); Nav_write_eeprom(); } else print_string(_("Config change NOT accepted\n")); } void Nav_get_configuration() { std::string cmd = "KM\r\n"; Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); size_t p = resp.find("km"); if (p >= 11) { p -= 11; Nav_config_string = resp.substr(0, 11); Nav_update_config_controls(); } else { std::string err; err.assign(_("Nav_get_configuration: ")).append(resp).append("\n"); print_string(err); } } void Nav_write_eeprom() { std::string cmd = "KS\r\n"; Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("ks") == std::string::npos) { print_string(_("\nNavigator write to EEPROM failed!\n")); } else print_string(_("\nEEPROM write reported success\n")); } void Nav_restore_eeprom() { std::string cmd = "KR\r\n"; Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kr") == std::string::npos) { print_string(_("\nEEPROM data failed!\n")); } else { print_string(_("\nEEPROM data restored\n")); Nav_get_configuration(); } } void Nav_set_channel_1_att(int v) { Nav_config_string[0] = (v ? '1' : '0'); Nav_set_configuration(); } void Nav_set_channel_2_att(int v) { Nav_config_string[1] = (v ? '1' : '0'); Nav_set_configuration(); } void Nav_set_rf_att(int v) { Nav_config_string[2] = (v ? '1' : '0'); Nav_set_configuration(); } extern void Nav_set_wk_ptt(int v) { Nav_config_string[3] = (v ? '1' : '0'); Nav_set_configuration(); } // "1" normal, "0" dim void Nav_set_led(int v) { Nav_config_string[4] = (v ? '1' : '0'); Nav_set_configuration(); } /* void led_dim(void *) { Nav_set_led(0); } void led_normal(void *) { Nav_set_led(1); } void blink_led() { char led = Nav_config_string[4]; if (led == '1') { led_dim(NULL); Fl::add_timeout(1.0, led_normal); } else { led_normal(NULL); Fl::add_timeout(1.0, led_dim); } } */ void Nav_set_cat_led(int v) { Nav_config_string[5] = (v ? '1' : '0'); Nav_set_configuration(); } void Nav_set_polarity(int v) { Nav_config_string[6] = (v ? '0' : '1'); Nav_set_configuration(); } void Nav_set_sidetone(int v) { Nav_config_string[7] = (v ? '0' : '1'); Nav_set_configuration(); } void Nav_set_ptt(int v) { Nav_config_string[8] = (v ? '0' : '1'); Nav_set_configuration(); } void Nav_set_baud(int v) { switch (v) { case 0: Nav_config_string[9] = '1'; break; // 45.45 baud case 1: Nav_config_string[9] = '2'; break; // 75.0 baud case 2: Nav_config_string[9] = '3'; break; // 100.0 baud } Nav_set_configuration(); } void Nav_set_stopbits(int v) { switch (v) { case 0: Nav_config_string[10] = '1'; break; case 1: Nav_config_string[10] = '2'; break; case 2: Nav_config_string[10] = '3'; break; } Nav_set_configuration(); } void Nav_PTT(int val) { } char Nav_read_byte(Cserial &serial, int msec) { std::string resp; resp.clear(); resp = Nav_serial_read(serial); int numtries = msec/100; while (resp.empty() && numtries) { MilliSleep(100); resp = Nav_serial_read(serial); numtries--; } if (resp.empty()) return 0; return resp[0]; } std::string Nav_read_string(Cserial &serial, int msec_wait, std::string find) { std::string resp; resp = Nav_serial_read(serial); int timer = msec_wait; if (timer < 100) msec_wait = timer = 100; if (!find.empty()) { while ((timer > 0) && (resp.find(find) == std::string::npos)) { MilliSleep(100); Fl::awake(); Fl::flush(); resp.append(Nav_serial_read(serial)); timer -= 100; } } else { while (timer) { MilliSleep(100); Fl::awake(); Fl::flush(); resp.append(Nav_serial_read(serial)); timer -= 100; } } if (resp.find("KR") != std::string::npos) { print_string(_("\nNavigator returned error code!\n")); } return resp; } void xmt_delay(int n) { double baudrate = 45.45; if (progdefaults.Nav_FSK_baud == 1) baudrate = 75.0; if (progdefaults.Nav_FSK_baud == 2) baudrate = 100.0; MilliSleep(n * 7500.0 / baudrate); // start + 5 data + 1.5 stop bits } static void send_char(int c) { if (c == LETTERS) { tty_mode = LETTERS; c = 0x1F; } else if (c == FIGURES) { tty_mode = FIGURES; c = 0x1B; } else c &= 0x1F; unsigned char cmd[2] = " "; cmd[0] = c; Nav_serial.WriteBuffer(cmd, 1); xmt_delay(1); } static std::string letters = "E\nA SIU\rDRJNFCKTZLWHYPQOBG MXV "; static std::string figures = "3\n- \a87\r$4\',!:(5\")2#6019?& ./; "; int baudot_enc(char data) { size_t c = std::string::npos; data = toupper(data); c = letters.find(data); if (c != std::string::npos) return (c + 1) | LETTERS; c = figures.find(data); if (c != std::string::npos) return (c + 1) | FIGURES; return -1; } void Nav_send_char(int c) { if (c == GET_TX_CHAR_NODATA) { send_char(LETTERS); return; } if (c == ' ' && tty_mode == FIGURES) send_char(LETTERS); c = baudot_enc(c & 0xFF); if ((tty_mode == LETTERS) && ((c & FIGURES) == FIGURES)) send_char(FIGURES); if ((tty_mode == FIGURES) && ((c & LETTERS) == LETTERS)) send_char(LETTERS); send_char(c); } std::string Nav_serial_read(Cserial &serial) { static char buffer[1025]; memset(buffer, '\0',1025); int rb = serial.ReadBuffer((unsigned char *)buffer, 1024); if (rb) return buffer; return ""; } // One time use of separate thread to read initial values void close_NavFSK() { Nav_serial.ClosePort(); use_Nav = false; print_string(_("Disconnected from Navigator FSK port\n")); progStatus.Nav_online = false; enable_rtty_quickchange(); } /* ===================================================================== Received from Clint, designer of Navigator The B channel of the 2nd FT2232C device is configured as an 8 bit FIFO, only the lower 5 bits are used. Actual FSK parameters are sent to the Navigator Configuration Port, consisting of output Polarity (Normal or Reverse), Sidetone (On or Off), FSK PTT (must be set to ON) Baud Rate (45.45, 75, 100) Stop Bits (1, 1.5, 2) From these settings (Baud rate, Stop bits, Data length (5) and Start bit (1) ) the character rate can be computed to determine when to send the next character to the FIFO (below). Data Channel - Baudot encoded FSK 5 bit characters are sent to the FSK FIFO device. The FIFO is 374 characters deep. The first two characters sent to the FIFO should be sent with no delay between the two characters. Subsequent characters should be sent at a rate determined by the parameters in the previous paragraph. The rate should be about 0.5% faster than the calculated rate to ensure that the buffer is not under run. When the last character is sent to the FIFO, the PTT signal should be dropped. The FSK Controller will maintain the PTT signal to the radio until the last bit of the last character has been transmitted. Output PTT will be dropped at that time. When the PTT drops to the radio, it will return to RX state. Baudot LTRS and FIGS bytes and USOS LTRS bytes are not handled by the Navigator The Navigator does not provide any state feedback to the controlling PC, i.e. state of the FIFO or the PTT signal lines, timing must be approximated in the controlling PC. Note: The FTDI part must provide a Busy Status to indicate when the FIFO is full. In the Windows implementation, there were two configuration items that were used: Open Port: SetCommState() function- the DCB was able to be configured as a 45 baud, 1.5 stop bit, no parity, 5 bit bytesize device. WriteFile() function: Windows buffer size set to 1 - this allowed the flow control to be done without having to time the data rate to avoid buffer under run. ======================================================================*/ bool open_NavFSK() { progStatus.Nav_online = false; Nav_serial.Device(progdefaults.Nav_FSK_port); Nav_serial.Baud(1200); Nav_serial.Timeout(200); Nav_serial.Retries(10); Nav_serial.Stopbits(1); if (!Nav_serial.OpenPort()) { std::string err = std::string(_("Could not open ")).append(progdefaults.Nav_FSK_port).append("\n"); print_string(err); return false; } use_Nav = true; progStatus.Nav_online = true; disable_rtty_quickchange(); print_string(_("Connected to Navigator FSK port\n")); return true; } void close_NavConfig() { Nav_config.ClosePort(); print_string(_("Disconnected from Navigator config port\n")); progStatus.Nav_config_online = false; } bool open_NavConfig() { #ifdef NAVDEBUG std::string info = "Navigator debug file: "; info.append(zdate()).append(" ").append(ztime()).append("\n"); print_string("========================================================\n"); print_string(info); #endif Nav_config.Device(progdefaults.Nav_config_port); Nav_config.Baud(1200); Nav_config.Timeout(200); Nav_config.Retries(10); Nav_config.Stopbits(1); if (!Nav_config.OpenPort()) { std::string err; err.assign(_("Could not open ")).append(progdefaults.Nav_config_port); print_string(err); return false; } std::string cmd = "KT\r\n"; std::string resp = ""; Nav_config.WriteBuffer((unsigned char *)(cmd.c_str()), cmd.length()); resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kt") == std::string::npos) { Nav_config.WriteBuffer((unsigned char *)(cmd.c_str()), cmd.length()); resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kt") == std::string::npos) { print_string(_("Navigator failed to respond to NOOP.\n")); close_NavConfig(); return false; } } cmd = "KQ\r\n"; Nav_config.WriteBuffer((unsigned char *)(cmd.c_str()), cmd.length()); resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("\n") == std::string::npos) { print_string(_("Navigator did not send Version string.\n")); close_NavConfig(); return false; } print_string(std::string("Navigator ").append(resp)); Nav_get_configuration(); // blink_led(); print_string(_("Connected to Navigator configuration port\n")); progStatus.Nav_config_online = true; return true; } fldigi-4.1.06/src/cw_rtty/view_rtty.cxx0000644000175000017500000004077513472115772015051 00000000000000// ---------------------------------------------------------------------------- // rtty.cxx -- RTTY modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include using namespace std; //#include "rtty.h" #include "view_rtty.h" #include "fl_digi.h" #include "digiscope.h" #include "misc.h" #include "waterfall.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "digiscope.h" #include "Viewer.h" #include "qrunner.h" //===================================================================== // Baudot support //===================================================================== static char letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', ' ', 'M', 'X', 'V', ' ' }; // U.S. version of the figures case. static char figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', ' ', '.', '/', ';', ' ' }; const double view_rtty::SHIFT[] = {23, 85, 160, 170, 182, 200, 240, 350, 425, 850}; // FILTLEN must be same size as BAUD const double view_rtty::BAUD[] = {45, 45.45, 50, 56, 75, 100, 110, 150, 200, 300}; const int view_rtty::FILTLEN[] = { 512, 512, 512, 512, 512, 512, 512, 256, 128, 64}; const int view_rtty::BITS[] = {5, 7, 8}; const int view_rtty::numshifts = (int)(sizeof(SHIFT) / sizeof(*SHIFT)); const int view_rtty::numbauds = (int)(sizeof(BAUD) / sizeof(*BAUD)); void view_rtty::rx_init() { for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].timeout = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; channel[ch].mark_phase = 0; channel[ch].space_phase = 0; channel[ch].mark_mag = 0; channel[ch].space_mag = 0; channel[ch].mark_env = 0; channel[ch].space_env = 0; channel[ch].inp_ptr = 0; for (int i = 0; i < VIEW_MAXPIPE; i++) channel[ch].mark_history[i] = channel[ch].space_history[i] = cmplx(0,0); } } void view_rtty::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; rx_init(); } view_rtty::~view_rtty() { for (int ch = 0; ch < MAX_CHANNELS; ch ++) { if (channel[ch].mark_filt) delete channel[ch].mark_filt; if (channel[ch].space_filt) delete channel[ch].space_filt; if (channel[ch].bits) delete channel[ch].bits; } } void view_rtty::reset_filters(int ch) { delete channel[ch].mark_filt; channel[ch].mark_filt = new fftfilt(rtty_baud/samplerate, filter_length); channel[ch].mark_filt->rtty_filter(rtty_baud/samplerate); delete channel[ch].space_filt; channel[ch].space_filt = new fftfilt(rtty_baud/samplerate, filter_length); channel[ch].space_filt->rtty_filter(rtty_baud/samplerate); } void view_rtty::restart() { double stl; rtty_shift = shift = (progdefaults.rtty_shift < rtty::numshifts ? SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); rtty_baud = BAUD[progdefaults.rtty_baud]; filter_length = FILTLEN[progdefaults.rtty_baud]; nbits = rtty_bits = BITS[progdefaults.rtty_bits]; if (rtty_bits == 5) rtty_parity = RTTY_PARITY_NONE; else switch (progdefaults.rtty_parity) { case 0 : rtty_parity = RTTY_PARITY_NONE; break; case 1 : rtty_parity = RTTY_PARITY_EVEN; break; case 2 : rtty_parity = RTTY_PARITY_ODD; break; case 3 : rtty_parity = RTTY_PARITY_ZERO; break; case 4 : rtty_parity = RTTY_PARITY_ONE; break; default : rtty_parity = RTTY_PARITY_NONE; break; } rtty_stop = progdefaults.rtty_stop; symbollen = (int) (samplerate / rtty_baud + 0.5); bflen = symbollen/3; set_bandwidth(shift); rtty_BW = progdefaults.RTTY_BW; bp_filt_lo = (shift/2.0 - rtty_BW/2.0) / samplerate; if (bp_filt_lo < 0) bp_filt_lo = 0; bp_filt_hi = (shift/2.0 + rtty_BW/2.0) / samplerate; for (int ch = 0; ch < MAX_CHANNELS; ch ++) { reset_filters(ch); channel[ch].state = IDLE; channel[ch].timeout = 0; channel[ch].freqerr = 0.0; channel[ch].metric = 0.0; channel[ch].sigpwr = 0.0; channel[ch].noisepwr = 0.0; channel[ch].sigsearch = 0; channel[ch].frequency = NULLFREQ; channel[ch].counter = symbollen / 2; channel[ch].mark_phase = 0; channel[ch].space_phase = 0; channel[ch].mark_mag = 0; channel[ch].space_mag = 0; channel[ch].mark_env = 0; channel[ch].space_env = 0; channel[ch].inp_ptr = 0; if (channel[ch].bits) channel[ch].bits->setLength(symbollen / 8); else channel[ch].bits = new Cmovavg(symbollen / 8); channel[ch].mark_noise = channel[ch].space_noise = 0; channel[ch].bit = channel[ch].nubit = true; for (int i = 0; i < VIEW_RTTY_MAXBITS; i++) channel[ch].bit_buf[i] = 0.0; for (int i = 0; i < VIEW_MAXPIPE; i++) channel[ch].mark_history[i] = channel[ch].space_history[i] = cmplx(0,0); } // stop length = 1, 1.5 or 2 bits rtty_stop = progdefaults.rtty_stop; if (rtty_stop == 0) stl = 1.0; else if (rtty_stop == 1) stl = 1.5; else stl = 2.0; stoplen = (int) (stl * samplerate / rtty_baud + 0.5); rx_init(); } view_rtty::view_rtty(trx_mode tty_mode) { cap |= CAP_AFC | CAP_REV; mode = tty_mode; samplerate = RTTY_SampleRate; for (int ch = 0; ch < MAX_CHANNELS; ch ++) { channel[ch].mark_filt = (fftfilt *)0; channel[ch].space_filt = (fftfilt *)0; channel[ch].bits = (Cmovavg *)0; } restart(); } cmplx view_rtty::mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in;; phase -= TWOPI * f / samplerate; if (phase < - TWOPI) phase += TWOPI; return z; } unsigned char view_rtty::bitreverse(unsigned char in, int n) { unsigned char out = 0; for (int i = 0; i < n; i++) out = (out << 1) | ((in >> i) & 1); return out; } static int rparity(int c) { int w = c; int p = 0; while (w) { p += (w & 1); w >>= 1; } return p & 1; } int view_rtty::rttyparity(unsigned int c) { c &= (1 << nbits) - 1; switch (rtty_parity) { default: case RTTY_PARITY_NONE: return 0; case RTTY_PARITY_ODD: return rparity(c); case RTTY_PARITY_EVEN: return !rparity(c); case RTTY_PARITY_ZERO: return 0; case RTTY_PARITY_ONE: return 1; } } int view_rtty::decode_char(int ch) { unsigned int parbit, par, data; parbit = (channel[ch].rxdata >> nbits) & 1; par = rttyparity(channel[ch].rxdata); if (rtty_parity != RTTY_PARITY_NONE && parbit != par) return 0; data = channel[ch].rxdata & ((1 << nbits) - 1); if (nbits == 5) return baudot_dec(ch & 0x7F, data); return data; } bool view_rtty::is_mark_space( int ch, int &correction) { correction = 0; // test for rough bit position if (channel[ch].bit_buf[0] && !channel[ch].bit_buf[symbollen-1]) { // test for mark/space straddle point for (int i = 0; i < symbollen; i++) correction += channel[ch].bit_buf[i]; if (abs(symbollen/2 - correction) < 6) // too small & bad signals are not decoded return true; } return false; } bool view_rtty::is_mark(int ch) { return channel[ch].bit_buf[symbollen / 2]; } bool view_rtty::rx(int ch, bool bit) { bool flag = false; unsigned char c = 0; int correction = 0; for (int i = 1; i < symbollen; i++) channel[ch].bit_buf[i-1] = channel[ch].bit_buf[i]; channel[ch].bit_buf[symbollen - 1] = bit; switch (channel[ch].rxstate) { case RTTY_RX_STATE_IDLE: if ( is_mark_space(ch, correction)) { channel[ch].rxstate = RTTY_RX_STATE_START; channel[ch].counter = correction; } break; case RTTY_RX_STATE_START: if (--channel[ch].counter == 0) { if (!is_mark(ch)) { channel[ch].rxstate = RTTY_RX_STATE_DATA; channel[ch].counter = symbollen; channel[ch].bitcntr = 0; channel[ch].rxdata = 0; } else { channel[ch].rxstate = RTTY_RX_STATE_IDLE; } } break; case RTTY_RX_STATE_DATA: if (--channel[ch].counter == 0) { channel[ch].rxdata |= is_mark(ch) << channel[ch].bitcntr++; channel[ch].counter = symbollen; } if (channel[ch].bitcntr == nbits + (rtty_parity != RTTY_PARITY_NONE ? 1 : 0)) channel[ch].rxstate = RTTY_RX_STATE_STOP; break; case RTTY_RX_STATE_STOP: if (--channel[ch].counter == 0) { if (is_mark(ch)) { if (channel[ch].metric > rtty_squelch) { c = decode_char(ch); // print this RTTY_CHANNEL if ( c != 0 ) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, mode); } flag = true; } channel[ch].rxstate = RTTY_RX_STATE_IDLE; } break; default : break; } return flag; } void view_rtty::Metric(int ch) { double delta = rtty_baud/2.0; double np = wf->powerDensity(channel[ch].frequency, delta) * 3000 / delta; double sp = wf->powerDensity(channel[ch].frequency - shift/2, delta) + wf->powerDensity(channel[ch].frequency + shift/2, delta) + 1e-10; channel[ch].sigpwr = decayavg( channel[ch].sigpwr, sp, sp - channel[ch].sigpwr > 0 ? 2 : 16); channel[ch].noisepwr = decayavg( channel[ch].noisepwr, np, 16 ); channel[ch].metric = CLAMP(channel[ch].sigpwr/channel[ch].noisepwr, 0.0, 100.0); if (channel[ch].state == RCVNG) if (channel[ch].metric < rtty_squelch) { channel[ch].timeout = progdefaults.VIEWERtimeout * samplerate / WFBLOCKSIZE; channel[ch].state = WAITING; } if (channel[ch].timeout) { channel[ch].timeout--; if (!channel[ch].timeout) { channel[ch].frequency = NULLFREQ; channel[ch].metric = 0; channel[ch].freqerr = 0; channel[ch].state = IDLE; REQ(&viewclearchannel, ch); } } } void view_rtty::find_signals() { double spwrhi = 0.0, spwrlo = 0.0, npwr = 0.0; double rtty_squelch = pow(10, progStatus.VIEWER_rttysquelch / 10.0); for (int i = 0; i < progdefaults.VIEWERchannels; i++) { if (channel[i].state != IDLE) continue; int cf = progdefaults.LowFreqCutoff + 100 * i; if (cf < shift) cf = shift; double delta = rtty_baud / 8; for (int chf = cf; chf < cf + 100 - rtty_baud / 4; chf += 5) { spwrlo = wf->powerDensity(chf - shift/2, delta); spwrhi = wf->powerDensity(chf + shift/2, delta); npwr = (wf->powerDensity(chf, delta) * 3000 / rtty_baud) + 1e-10; if ((spwrlo / npwr > rtty_squelch) && (spwrhi / npwr > rtty_squelch)) { if (!i && (channel[i+1].state == SRCHG || channel[i+1].state == RCVNG)) break; if ((i == (progdefaults.VIEWERchannels -2)) && (channel[i+1].state == SRCHG || channel[i+1].state == RCVNG)) break; if (i && (channel[i-1].state == SRCHG || channel[i-1].state == RCVNG)) break; if (i > 3 && (channel[i-2].state == SRCHG || channel[i-2].state == RCVNG)) break; channel[i].frequency = chf; channel[i].sigsearch = SIGSEARCH; channel[i].state = SRCHG; REQ(&viewaddchr, i, (int)channel[i].frequency, 0, mode); break; } } } for (int i = 1; i < progdefaults.VIEWERchannels; i++ ) if (fabs(channel[i].frequency - channel[i-1].frequency) < rtty_baud/2) clearch(i); } void view_rtty::clearch(int ch) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; REQ( &viewclearchannel, ch); } void view_rtty::clear() { for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; } } int view_rtty::rx_process(const double *buf, int buflen) { cmplx z, zmark, zspace, *zp_mark, *zp_space; static bool bit = true; int n = 0; { reverse = wf->Reverse() ^ !wf->USB(); } rtty_squelch = pow(10, progStatus.VIEWER_rttysquelch / 10.0); for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { if (channel[ch].state == IDLE) continue; if (channel[ch].sigsearch) { channel[ch].sigsearch--; if (!channel[ch].sigsearch) channel[ch].state = RCVNG; } for (int len = 0; len < buflen; len++) { z = cmplx(buf[len], buf[len]); zmark = mixer(channel[ch].mark_phase, channel[ch].frequency + shift/2.0, z); channel[ch].mark_filt->run(zmark, &zp_mark); zspace = mixer(channel[ch].space_phase, channel[ch].frequency - shift/2.0, z); n = channel[ch].space_filt->run(zspace, &zp_space); // n loop if (n) Metric(ch); for (int i = 0; i < n; i++) { channel[ch].mark_mag = abs(zp_mark[i]); channel[ch].mark_env = decayavg (channel[ch].mark_env, channel[ch].mark_mag, (channel[ch].mark_mag > channel[ch].mark_env) ? symbollen / 4 : symbollen * 16); channel[ch].mark_noise = decayavg (channel[ch].mark_noise, channel[ch].mark_mag, (channel[ch].mark_mag < channel[ch].mark_noise) ? symbollen / 4 : symbollen * 48); channel[ch].space_mag = abs(zp_space[i]); channel[ch].space_env = decayavg (channel[ch].space_env, channel[ch].space_mag, (channel[ch].space_mag > channel[ch].space_env) ? symbollen / 4 : symbollen * 16); channel[ch].space_noise = decayavg (channel[ch].space_noise, channel[ch].space_mag, (channel[ch].space_mag < channel[ch].space_noise) ? symbollen / 4 : symbollen * 48); channel[ch].noise_floor = min(channel[ch].space_noise, channel[ch].mark_noise); // clipped if clipped decoder selected double mclipped = 0, sclipped = 0; mclipped = channel[ch].mark_mag > channel[ch].mark_env ? channel[ch].mark_env : channel[ch].mark_mag; sclipped = channel[ch].space_mag > channel[ch].space_env ? channel[ch].space_env : channel[ch].space_mag; if (mclipped < channel[ch].noise_floor) mclipped = channel[ch].noise_floor; if (sclipped < channel[ch].noise_floor) sclipped = channel[ch].noise_floor; // Optimal ATC // int v = (((mclipped - channel[ch].noise_floor) * (channel[ch].mark_env - channel[ch].noise_floor) - // (sclipped - channel[ch].noise_floor) * (channel[ch].space_env - channel[ch].noise_floor)) - // 0.25 * ((channel[ch].mark_env - channel[ch].noise_floor) * // (channel[ch].mark_env - channel[ch].noise_floor) - // (channel[ch].space_env - channel[ch].noise_floor) * // (channel[ch].space_env - channel[ch].noise_floor))); // bit = (v > 0); // Kahn Square Law demodulator bit = norm(zp_mark[i]) >= norm(zp_space[i]); channel[ch].mark_history[channel[ch].inp_ptr] = zp_mark[i]; channel[ch].space_history[channel[ch].inp_ptr] = zp_space[i]; channel[ch].inp_ptr = (channel[ch].inp_ptr + 1) % VIEW_MAXPIPE; if (channel[ch].state == RCVNG && rx( ch, reverse ? !bit : bit ) ) { if (channel[ch].sigsearch) channel[ch].sigsearch--; int mp0 = channel[ch].inp_ptr - 2; int mp1 = mp0 + 1; if (mp0 < 0) mp0 += VIEW_MAXPIPE; if (mp1 < 0) mp1 += VIEW_MAXPIPE; double ferr = (TWOPI * samplerate / rtty_baud) * (!reverse ? arg(conj(channel[ch].mark_history[mp1]) * channel[ch].mark_history[mp0]) : arg(conj(channel[ch].space_history[mp1]) * channel[ch].space_history[mp0])); if (fabs(ferr) > rtty_baud / 2) ferr = 0; channel[ch].freqerr = decayavg ( channel[ch].freqerr, ferr / 4, progdefaults.rtty_afcspeed == 0 ? 8 : progdefaults.rtty_afcspeed == 1 ? 4 : 1 ); if (channel[ch].metric > pow(10, progStatus.VIEWER_rttysquelch / 10.0)) channel[ch].frequency -= ferr; } } } } find_signals(); return 0; } char view_rtty::baudot_dec(int ch, unsigned char data) { int out = 0; switch (data) { case 0x1F: /* letters */ channel[ch].rxmode = LETTERS; break; case 0x1B: /* figures */ channel[ch].rxmode = FIGURES; break; case 0x04: /* unshift-on-space */ if (progdefaults.UOSrx) channel[ch].rxmode = LETTERS; return ' '; break; default: if (channel[ch].rxmode == LETTERS) out = letters[data]; else out = figures[data]; break; } return out; } //===================================================================== // RTTY transmit //===================================================================== int view_rtty::tx_process() { return 0; } fldigi-4.1.06/src/cw_rtty/cw.cxx0000644000175000017500000011176213472115772013421 00000000000000// ---------------------------------------------------------------------------- // cw.cxx -- morse code modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // (C) Mauri Niininen, AG1LE // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "digiscope.h" #include "waterfall.h" #include "fl_digi.h" #include "fftfilt.h" #include "cw.h" #include "misc.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "debug.h" #include "FTextRXTX.h" #include "modem.h" #include "qrunner.h" #include "winkeyer.h" #include "nanoIO.h" using namespace std; #define XMT_FILT_LEN 256 #define QSK_DELAY_LEN 4*XMT_FILT_LEN #define CW_FFT_SIZE 2048 // must be a factor of 2 static double nano_d2d = 0; static int nano_wpm = 0; const cw::SOM_TABLE cw::som_table[] = { /* Prosigns */ {"-...-", {1.0, 0.33, 0.33, 0.33, 1.0, 0, 0} }, {".-.-", { 0.33, 1.0, 0.33, 1.0, 0, 0, 0} }, {".-...", { 0.33, 1.0, 0.33, 0.33, 0.33, 0, 0} }, {".-.-.", { 0.33, 1.0, 0.33, 1.0, 0.33, 0, 0} }, {"...-.-", { 0.33, 0.33, 0.33, 1.0, 0.33, 1.0, 0} }, {"-.--.", {1.0, 0.33, 1.0, 1.0, 0.33, 0, 0} }, {"..-.-", { 0.33, 0.33, 1.0, 0.33, 1.0, 0, 0} }, {"....--", { 0.33, 0.33, 0.33, 0.33, 1.0, 1.0, 0} }, {"...-.", { 0.33, 0.33, 0.33, 1.0, 0.33, 0, 0} }, /* ASCII 7bit letters */ {".-", { 0.33, 1.0, 0, 0, 0, 0, 0} }, {"-...", {1.0, 0.33, 0.33, 0.33, 0, 0, 0} }, {"-.-.", {1.0, 0.33, 1.0, 0.33, 0, 0, 0} }, {"-..", {1.0, 0.33, 0.33, 0, 0, 0, 0} }, {".", { 0.33, 0, 0, 0, 0, 0, 0} }, {"..-.", { 0.33, 0.33, 1.0, 0.33, 0, 0, 0} }, {"--.", {1.0, 1.0, 0.33, 0, 0, 0, 0} }, {"....", { 0.33, 0.33, 0.33, 0.33, 0, 0, 0} }, {"..", { 0.33, 0.33, 0, 0, 0, 0, 0} }, {".---", { 0.33, 1.0, 1.0, 1.0, 0, 0, 0} }, {"-.-", {1.0, 0.33, 1.0, 0, 0, 0, 0} }, {".-..", { 0.33, 1.0, 0.33, 0.33, 0, 0, 0} }, {"--", {1.0, 1.0, 0, 0, 0, 0, 0} }, {"-.", {1.0, 0.33, 0, 0, 0, 0, 0} }, {"---", {1.0, 1.0, 1.0, 0, 0, 0, 0} }, {".--.", { 0.33, 1.0, 1.0, 0.33, 0, 0, 0} }, {"--.-", {1.0, 1.0, 0.33, 1.0, 0, 0, 0} }, {".-.", { 0.33, 1.0, 0.33, 0, 0, 0, 0} }, {"...", { 0.33, 0.33, 0.33, 0, 0, 0, 0} }, {"-", {1.0, 0, 0, 0, 0, 0, 0} }, {"..-", { 0.33, 0.33, 1.0, 0, 0, 0, 0} }, {"...-", { 0.33, 0.33, 0.33, 1.0, 0, 0, 0} }, {".--", { 0.33, 1.0, 1.0, 0, 0, 0, 0} }, {"-..-", {1.0, 0.33, 0.33, 1.0, 0, 0, 0} }, {"-.--", {1.0, 0.33, 1.0, 1.0, 0, 0, 0} }, {"--..", {1.0, 1.0, 0.33, 0.33, 0, 0, 0} }, /* Numerals */ {"-----", {1.0, 1.0, 1.0, 1.0, 1.0, 0, 0} }, {".----", { 0.33, 1.0, 1.0, 1.0, 1.0, 0, 0} }, {"..---", { 0.33, 0.33, 1.0, 1.0, 1.0, 0, 0} }, {"...--", { 0.33, 0.33, 0.33, 1.0, 1.0, 0, 0} }, {"....-", { 0.33, 0.33, 0.33, 0.33, 1.0, 0, 0} }, {".....", { 0.33, 0.33, 0.33, 0.33, 0.33, 0, 0} }, {"-....", {1.0, 0.33, 0.33, 0.33, 0.33, 0, 0} }, {"--...", {1.0, 1.0, 0.33, 0.33, 0.33, 0, 0} }, {"---..", {1.0, 1.0, 1.0, 0.33, 0.33, 0, 0} }, {"----.", {1.0, 1.0, 1.0, 1.0, 0.33, 0, 0} }, /* Punctuation */ {".-..-.", { 0.33, 1.0, 0.33, 0.33, 1.0, 0.33, 0} }, {".----.", { 0.33, 1.0, 1.0, 1.0, 1.0, 0.33, 0} }, {"...-..-", { 0.33, 0.33, 0.33, 1.0, 0.33, 0.33, 1.0} }, {"-.---.", {1.0, 0.33, 1.0, 1.0, 0.33, 0, 0} }, {"-.--.-", {1.0, 0.33, 1.0, 1.0, 0.33, 1.0, 0} }, {"--..--", {1.0, 1.0, 0.33, 0.33, 1.0, 1.0, 0} }, {"-....-", {1.0, 0.33, 0.33, 0.33, 0.33, 1.0, 0} }, {".-.-.-", { 0.33, 1.0, 0.33, 1.0, 0.33, 1.0, 0} }, {"-..-.", {1.0, 0.33, 0.33, 1.0, 0.33, 0, 0} }, {"---...", {1.0, 1.0, 1.0, 0.33, 0.33, 0.33, 0} }, {"-.-.-.", {1.0, 0.33, 1.0, 0.33, 1.0, 0.33, 0} }, {"..--..", { 0.33, 0.33, 1.0, 1.0, 0.33, 0.33, 0} }, {"..--.-", { 0.33, 0.33, 1.0, 1.0, 0.33, 1.0, 0} }, {".--.-.", { 0.33, 1.0, 1.0, 0.33, 1.0, 0.33, 0} }, {"-.-.--", {1.0, 0.33, 1.0, 0.33, 1.0, 1.0, 0} }, {".-.-", {0.33, 1.0, 0.33, 1.0, 0, 0 , 0} }, // A umlaut, A aelig {".--.-", {0.33, 1.0, 1.0, 0.33, 1.0, 0, 0 } }, // A ring {"-.-..", {1.0, 0.33, 1.0, 0.33, 0.33, 0, 0} }, // C cedilla {".-..-", {0.33, 1.0, 0.33, 0.33, 1.0, 0, 0} }, // E grave {"..-..", {0.33, 0.33, 1.0, 0.33, 0.33, 0, 0} }, // E acute {"---.", {1.0, 1.0, 1.0, 0.33, 0, 0, 0} }, // O acute, O umlat, O slash {"--.--", {1.0, 1.0, 0.33, 1.0, 1.0, 0, 0} }, // N tilde {"..--", {0.33, 0.33, 1.0, 1.0, 0, 0, 0} }, // U umlaut, U circ {"", {0.0}} }; int cw::normalize(float *v, int n, int twodots) { if( n == 0 ) return 0 ; float max = v[0]; float min = v[0]; int j; /* find max and min values */ for (j=1; j max) max = vj; else if (vj < min) min = vj; } /* all values 0 - no need to normalize or decode */ if (max == 0.0) return 0; /* scale values between [0,1] -- if Max longer than 2 dots it was "dah" and should be 1.0, otherwise it was "dit" and should be 0.33 */ float ratio = (max > twodots) ? 1.0 : 0.33 ; ratio /= max ; for (j=0; j diffsf) break; } /* If distance is smaller than previous distances */ if (difference < diffsf) { winner = n; diffsf = difference; } } if (!som_table[winner].rpr.empty()) { string sc = morse.rx_lookup(som_table[winner].rpr); if (sc.empty()) return "*"; else return sc; } else return "*"; } void cw::tx_init() { phaseacc = 0; lastsym = 0; qskphase = 0; if (progdefaults.pretone) pretone(); symbols = 0; acc_symbols = 0; ovhd_symbols = 0; cw_xmt_filter->create_filter(lwr, upr); qsk_ptr = XMT_FILT_LEN / 2; maxval = 0.0; } void cw::rx_init() { cw_receive_state = RS_IDLE; smpl_ctr = 0; cw_rr_current = 0; cw_ptr = 0; agc_peak = 0; set_scope_mode(Digiscope::SCOPE); update_Status(); usedefaultWPM = false; scope_clear = true; viewcw.restart(); } void cw::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.CWsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); trackingfilter->reset(); two_dots = (long int)trackingfilter->run(2 * cw_send_dot_length); put_cwRcvWPM(cw_send_speed); for (int i = 0; i < OUTBUFSIZE; i++) outbuf[i] = qskbuf[i] = 0.0; rx_init(); use_paren = progdefaults.CW_use_paren; prosigns = progdefaults.CW_prosigns; stopflag = false; maxval = 0; if (use_nanoIO) set_nanoCW(); } cw::~cw() { if (cw_FFT_filter) delete cw_FFT_filter; if (cw_xmt_filter) delete cw_xmt_filter; if (bitfilter) delete bitfilter; if (trackingfilter) delete trackingfilter; } cw::cw() : modem() { cap |= CAP_BW; mode = MODE_CW; freqlock = false; usedefaultWPM = false; frequency = progdefaults.CWsweetspot; tx_frequency = get_txfreq_woffset(); risetime = progdefaults.CWrisetime; QSKshape = progdefaults.QSKshape; cw_ptr = 0; clrcount = CLRCOUNT; samplerate = CW_SAMPLERATE; fragmentsize = CWMaxSymLen; cw_speed = progdefaults.CWspeed; bandwidth = progdefaults.CWbandwidth; cw_send_speed = cw_speed; cw_receive_speed = cw_speed; two_dots = 2 * KWPM / cw_speed; cw_noise_spike_threshold = two_dots / 4; cw_send_dot_length = KWPM / cw_send_speed; cw_send_dash_length = 3 * cw_send_dot_length; symbollen = (int)round(samplerate * 1.2 / progdefaults.CWspeed); fsymlen = (int)round(samplerate * 1.2 / progdefaults.CWfarnsworth); rx_rep_buf.clear(); // block of variables that get updated each time speed changes pipesize = (22 * samplerate * 12) / (progdefaults.CWspeed * 160); if (pipesize < 0) pipesize = 512; if (pipesize > MAX_PIPE_SIZE) pipesize = MAX_PIPE_SIZE; cwTrack = true; phaseacc = 0.0; FFTphase = 0.0; FFTvalue = 0.0; pipeptr = 0; clrcount = 0; upper_threshold = progdefaults.CWupper; lower_threshold = progdefaults.CWlower; for (int i = 0; i < MAX_PIPE_SIZE; clearpipe[i++] = 0.0); agc_peak = 1.0; in_replay = 0; use_matched_filter = progdefaults.CWmfilt; bandwidth = progdefaults.CWbandwidth; if (use_matched_filter) progdefaults.CWbandwidth = bandwidth = 2.0 * progdefaults.CWspeed / 1.2; cw_FFT_filter = new fftfilt(progdefaults.CWspeed/(1.2 * samplerate), CW_FFT_SIZE); // transmit filtering nbfreq = frequency; nbpf = progdefaults.CW_bpf; lwr = nbfreq - nbpf/2.0; upr = nbfreq + nbpf/2.0; if (lwr < 50.0) lwr = 50.0; if (upr > 3900.0) upr = 3900.0; lwr /= samplerate; upr /= samplerate; xmt_signal = new double[XMT_FILT_LEN]; for (int i = 0; i < XMT_FILT_LEN; i++) xmt_signal[i] = 0.0; qsk_signal = new double[QSK_DELAY_LEN]; for (int i = 0; i < QSK_DELAY_LEN; i++) qsk_signal[i] = 0.0; cw_xmt_filter = new fftfilt( lwr, upr, 2*XMT_FILT_LEN);// transmit filter length int bfv = symbollen / 32; if (bfv < 1) bfv = 1; bitfilter = new Cmovavg(bfv); trackingfilter = new Cmovavg(TRACKING_FILTER_SIZE); makeshape(); nano_wpm = progdefaults.CWspeed; nano_d2d = progdefaults.CWdash2dot; sync_parameters(); REQ(static_cast(&waterfall::Bandwidth), wf, (int)bandwidth); REQ(static_cast(&Fl_Value_Slider2::value), sldrCWbandwidth, (int)bandwidth); update_Status(); synchscope = 50; noise_floor = 1.0; sig_avg = 0.0; } // SHOULD ONLY BE CALLED FROM THE rx_processing loop void cw::reset_rx_filter() { if (use_matched_filter != progdefaults.CWmfilt || cw_speed != progdefaults.CWspeed || (bandwidth != progdefaults.CWbandwidth && !use_matched_filter)) { use_matched_filter = progdefaults.CWmfilt; cw_send_speed = cw_speed = progdefaults.CWspeed; if (use_matched_filter) progdefaults.CWbandwidth = bandwidth = 2.0 * progdefaults.CWspeed / 1.2; else bandwidth = progdefaults.CWbandwidth; double fbw = 0.5 * bandwidth / samplerate; cw_FFT_filter->create_lpf(fbw); FFTphase = 0; REQ(static_cast(&waterfall::Bandwidth), wf, (int)bandwidth); REQ(static_cast(&Fl_Value_Slider2::value), sldrCWbandwidth, (int)bandwidth); pipesize = (22 * samplerate * 12) / (progdefaults.CWspeed * 160); if (pipesize < 0) pipesize = 512; if (pipesize > MAX_PIPE_SIZE) pipesize = MAX_PIPE_SIZE; two_dots = 2 * KWPM / cw_speed; cw_noise_spike_threshold = two_dots / 4; cw_send_dot_length = KWPM / cw_send_speed; cw_send_dash_length = 3 * cw_send_dot_length; symbollen = (int)round(samplerate * 1.2 / progdefaults.CWspeed); fsymlen = (int)round(samplerate * 1.2 / progdefaults.CWfarnsworth); phaseacc = 0.0; FFTphase = 0.0; FFTvalue = 0.0; pipeptr = 0; clrcount = 0; smpl_ctr = 0; rx_rep_buf.clear(); int bfv = symbollen / 32; if (bfv < 1) bfv = 1; bitfilter->setLength(bfv); siglevel = 0; } } // sync_parameters() // Synchronize the dot, dash, end of element, end of character, and end // of word timings and ranges to new values of Morse speed, or receive tolerance. void cw::sync_transmit_parameters() { wpm = usedefaultWPM ? progdefaults.defCWspeed : progdefaults.CWspeed; fwpm = progdefaults.CWfarnsworth; cw_send_dot_length = KWPM / progdefaults.CWspeed; cw_send_dash_length = 3 * cw_send_dot_length; nusymbollen = (int)round(samplerate * 1.2 / wpm); nufsymlen = (int)round(samplerate * 1.2 / fwpm); if (symbollen != nusymbollen || nufsymlen != fsymlen || risetime != progdefaults.CWrisetime || QSKshape != progdefaults.QSKshape) { risetime = progdefaults.CWrisetime; QSKshape = progdefaults.QSKshape; symbollen = nusymbollen; fsymlen = nufsymlen; makeshape(); } } void cw::sync_parameters() { if (use_nanoIO) { if (nano_wpm != progdefaults.CWspeed) { nano_wpm = progdefaults.CWspeed; set_nanoWPM(progdefaults.CWspeed); } if (nano_d2d != progdefaults.CWdash2dot) { nano_d2d = progdefaults.CWdash2dot; set_nano_dash2dot(progdefaults.CWdash2dot); } } sync_transmit_parameters(); // check if user changed the tracking or the cw default speed if ((cwTrack != progdefaults.CWtrack) || (cw_send_speed != progdefaults.CWspeed)) { trackingfilter->reset(); two_dots = 2 * cw_send_dot_length; put_cwRcvWPM(cw_send_speed); } cwTrack = progdefaults.CWtrack; cw_send_speed = progdefaults.CWspeed; // Receive parameters: lowerwpm = cw_send_speed - progdefaults.CWrange; upperwpm = cw_send_speed + progdefaults.CWrange; if (lowerwpm < progdefaults.CWlowerlimit) lowerwpm = progdefaults.CWlowerlimit; if (upperwpm > progdefaults.CWupperlimit) upperwpm = progdefaults.CWupperlimit; cw_lower_limit = 2 * KWPM / upperwpm; cw_upper_limit = 2 * KWPM / lowerwpm; if (cwTrack) cw_receive_speed = KWPM / (two_dots / 2); else { cw_receive_speed = cw_send_speed; two_dots = 2 * cw_send_dot_length; } if (cw_receive_speed > 0) cw_receive_dot_length = KWPM / cw_receive_speed; else cw_receive_dot_length = KWPM / 5; cw_receive_dash_length = 3 * cw_receive_dot_length; cw_noise_spike_threshold = cw_receive_dot_length / 2; } //======================================================================= // cw_update_tracking() //======================================================================= inline void cw::update_tracking(int dur_1, int dur_2) { static int min_dot = KWPM / 200; static int max_dash = 3 * KWPM / 5; if ((dur_1 > dur_2) && (dur_1 > 4 * dur_2)) return; if ((dur_2 > dur_1) && (dur_2 > 4 * dur_1)) return; if (dur_1 < min_dot || dur_2 < min_dot) return; if (dur_2 > max_dash || dur_2 > max_dash) return; two_dots = trackingfilter->run((dur_1 + dur_2) / 2); sync_parameters(); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For CW this is an o scope pattern that shows the cw data stream. //======================================================================= void cw::update_Status() { put_MODEstatus("CW %s Rx %d", usedefaultWPM ? "*" : " ", cw_receive_speed); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For CW this is an o scope pattern that shows the cw data stream. //======================================================================= // void cw::update_syncscope() { if (pipesize < 0 || pipesize > MAX_PIPE_SIZE) return; for (int i = 0; i < pipesize; i++) scopedata[i] = 0.96*pipe[i]+0.02; set_scope_xaxis_1(siglevel); set_scope(scopedata, pipesize, true); scopedata.next(); // change buffers clrcount = CLRCOUNT; put_cwRcvWPM(cw_receive_speed); update_Status(); } void cw::clear_syncscope() { set_scope_xaxis_1(siglevel); set_scope(clearpipe, pipesize, false); clrcount = CLRCOUNT; } cmplx cw::mixer(cmplx in) { cmplx z (cos(phaseacc), sin(phaseacc)); z = z * in; phaseacc += TWOPI * frequency / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; return z; } //===================================================================== // cw_rxprocess() // Called with a block (size SCBLOCKSIZE samples) of audio. // //====================================================================== void cw::decode_stream(double value) { std::string sc; std::string somc; int attack = 0; int decay = 0; switch (progdefaults.cwrx_attack) { case 0: attack = 100; break; case 1: default: attack = 50; break; case 2: attack = 25; } switch (progdefaults.cwrx_decay) { case 0: decay = 1000; break; case 1: default : decay = 500; break; case 2: decay = 250; } sig_avg = decayavg(sig_avg, value, decay); if (value < sig_avg) { if (value < noise_floor) noise_floor = decayavg(noise_floor, value, attack); else noise_floor = decayavg(noise_floor, value, decay); } if (value > sig_avg) { if (value > agc_peak) agc_peak = decayavg(agc_peak, value, attack); else agc_peak = decayavg(agc_peak, value, decay); } float norm_noise = noise_floor / agc_peak; float norm_sig = sig_avg / agc_peak; siglevel = norm_sig; if (agc_peak) value /= agc_peak; else value = 0; metric = 0.8 * metric; if ((noise_floor > 1e-4) && (noise_floor < sig_avg)) metric += 0.2 * clamp(2.5 * (20*log10(sig_avg / noise_floor)) , 0, 100); float diff = (norm_sig - norm_noise); progdefaults.CWupper = norm_sig - 0.2 * diff; progdefaults.CWlower = norm_noise + 0.7 * diff; pipe[pipeptr] = value; if (++pipeptr == pipesize) pipeptr = 0; if (!progStatus.sqlonoff || metric > progStatus.sldrSquelchValue ) { // Power detection using hysterisis detector // upward trend means tone starting if ((value > progdefaults.CWupper) && (cw_receive_state != RS_IN_TONE)) { handle_event(CW_KEYDOWN_EVENT, sc); } // downward trend means tone stopping if ((value < progdefaults.CWlower) && (cw_receive_state == RS_IN_TONE)) { handle_event(CW_KEYUP_EVENT, sc); } } if (handle_event(CW_QUERY_EVENT, sc) == CW_SUCCESS) { update_syncscope(); synchscope = 100; if (progdefaults.CWuseSOMdecoding) { somc = find_winner(cw_buffer, two_dots); if (!somc.empty()) for (size_t n = 0; n < somc.length(); n++) put_rx_char( somc[n], somc[0] == '<' ? FTextBase::CTRL : FTextBase::RECV); cw_ptr = 0; memset(cw_buffer, 0, sizeof(cw_buffer)); } else { for (size_t n = 0; n < sc.length(); n++) put_rx_char( sc[n], sc[0] == '<' ? FTextBase::CTRL : FTextBase::RECV); } } else if (--synchscope == 0) { synchscope = 25; update_syncscope(); } } void cw::rx_FFTprocess(const double *buf, int len) { cmplx z, *zp; int n; while (len-- > 0) { z = cmplx ( *buf * cos(FFTphase), *buf * sin(FFTphase) ); FFTphase += TWOPI * frequency / samplerate; if (FFTphase > TWOPI) FFTphase -= TWOPI; buf++; n = cw_FFT_filter->run(z, &zp); // n = 0 or filterlen/2 if (!n) continue; for (int i = 0; i < n; i++) { // update the basic sample counter used for morse timing ++smpl_ctr; if (smpl_ctr % DEC_RATIO) continue; // decimate by DEC_RATIO // demodulate FFTvalue = abs(zp[i]); FFTvalue = bitfilter->run(FFTvalue); decode_stream(FFTvalue); } // for (i =0; i < n ... } //while (len-- > 0) } static bool cwprocessing = false; int cw::rx_process(const double *buf, int len) { if (cwprocessing) return 0; cwprocessing = true; reset_rx_filter(); rx_FFTprocess(buf, len); if (!clrcount--) clear_syncscope(); display_metric(metric); if ( (dlgViewer->visible() || progStatus.show_channels ) && !bHighSpeed && !bHistory ) viewcw.rx_process(buf, len); cwprocessing = false; return 0; } // ---------------------------------------------------------------------- // Compare two timestamps, and return the difference between them in usecs. inline int cw::usec_diff(unsigned int earlier, unsigned int later) { return (earlier >= later) ? 0 : (later - earlier); } //======================================================================= // handle_event() // high level cw decoder... gets called with keyup, keydown, reset and // query commands. // Keyup/down influences decoding logic. // Reset starts everything out fresh. // The query command returns CW_SUCCESS and the character that has // been decoded (may be '*',' ' or [a-z,0-9] or a few others) // If there is no data ready, CW_ERROR is returned. //======================================================================= int cw::handle_event(int cw_event, string &sc) { static int space_sent = true; // for word space logic static int last_element = 0; // length of last dot/dash int element_usec; // Time difference in usecs switch (cw_event) { case CW_RESET_EVENT: sync_parameters(); cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer cw_ptr = 0; memset(cw_buffer, 0, sizeof(cw_buffer)); smpl_ctr = 0; // reset audio sample counter rx_rep_buf.clear(); break; case CW_KEYDOWN_EVENT: // A receive tone start can only happen while we // are idle, or in the middle of a character. if (cw_receive_state == RS_IN_TONE) return CW_ERROR; // first tone in idle state reset audio sample counter if (cw_receive_state == RS_IDLE) { smpl_ctr = 0; rx_rep_buf.clear(); cw_rr_current = 0; cw_ptr = 0; } // save the timestamp cw_rr_start_timestamp = smpl_ctr; // Set state to indicate we are inside a tone. old_cw_receive_state = cw_receive_state; cw_receive_state = RS_IN_TONE; return CW_ERROR; break; case CW_KEYUP_EVENT: // The receive state is expected to be inside a tone. if (cw_receive_state != RS_IN_TONE) return CW_ERROR; // Save the current timestamp cw_rr_end_timestamp = smpl_ctr; element_usec = usec_diff(cw_rr_start_timestamp, cw_rr_end_timestamp); // make sure our timing values are up to date sync_parameters(); // If the tone length is shorter than any noise cancelling // threshold that has been set, then ignore this tone. if (cw_noise_spike_threshold > 0 && element_usec < cw_noise_spike_threshold) { cw_receive_state = RS_IDLE; return CW_ERROR; } // Set up to track speed on dot-dash or dash-dot pairs for this test to work, we need a dot dash pair or a // dash dot pair to validate timing from and force the speed tracking in the right direction. This method // is fundamentally different than the method in the unix cw project. Great ideas come from staring at the // screen long enough!. Its kind of simple really ... when you have no idea how fast or slow the cw is... // the only way to get a threshold is by having both code elements and setting the threshold between them // knowing that one is supposed to be 3 times longer than the other. with straight key code... this gets // quite variable, but with most faster cw sent with electronic keyers, this is one relationship that is // quite reliable. Lawrence Glaister (ve7it@shaw.ca) if (last_element > 0) { // check for dot dash sequence (current should be 3 x last) if ((element_usec > 2 * last_element) && (element_usec < 4 * last_element)) { update_tracking(last_element, element_usec); } // check for dash dot sequence (last should be 3 x current) if ((last_element > 2 * element_usec) && (last_element < 4 * element_usec)) { update_tracking(element_usec, last_element); } } last_element = element_usec; // ok... do we have a dit or a dah? // a dot is anything shorter than 2 dot times if (element_usec <= two_dots) { rx_rep_buf += CW_DOT_REPRESENTATION; // printf("%d dit ", last_element/1000); // print dot length cw_buffer[cw_ptr++] = (float)last_element; } else { // a dash is anything longer than 2 dot times rx_rep_buf += CW_DASH_REPRESENTATION; cw_buffer[cw_ptr++] = (float)last_element; } // We just added a representation to the receive buffer. // If it's full, then reset everything as it probably noise if (rx_rep_buf.length() > MAX_MORSE_ELEMENTS) { cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer cw_ptr = 0; smpl_ctr = 0; // reset audio sample counter return CW_ERROR; } else { // zero terminate representation // rx_rep_buf.clear(); cw_buffer[cw_ptr] = 0.0; } // All is well. Move to the more normal after-tone state. cw_receive_state = RS_AFTER_TONE; return CW_ERROR; break; case CW_QUERY_EVENT: // this should be called quite often (faster than inter-character gap) It looks after timing // key up intervals and determining when a character, a word space, or an error char '*' should be returned. // CW_SUCCESS is returned when there is a printable character. Nothing to do if we are in a tone if (cw_receive_state == RS_IN_TONE) return CW_ERROR; // compute length of silence so far sync_parameters(); element_usec = usec_diff(cw_rr_end_timestamp, smpl_ctr); // SHORT time since keyup... nothing to do yet if (element_usec < (2 * cw_receive_dot_length)) return CW_ERROR; // MEDIUM time since keyup... check for character space // one shot through this code via receive state logic // FARNSWOTH MOD HERE --> if (element_usec >= (2 * cw_receive_dot_length) && element_usec <= (4 * cw_receive_dot_length) && cw_receive_state == RS_AFTER_TONE) { // Look up the representation sc = morse.rx_lookup(rx_rep_buf); if (sc.empty()) { // invalid decode... let user see error sc = "*"; } rx_rep_buf.clear(); cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer space_sent = false; cw_ptr = 0; return CW_SUCCESS; } // LONG time since keyup... check for a word space // FARNSWOTH MOD HERE --> if ((element_usec > (4 * cw_receive_dot_length)) && !space_sent) { sc = " "; space_sent = true; return CW_SUCCESS; } // should never get here... catch all return CW_ERROR; break; } // should never get here... catch all return CW_ERROR; } //=========================================================================== // cw transmit routines // Define the amplitude envelop for key down events (32 samples long) // this is 1/2 cycle of a raised cosine //=========================================================================== double keyshape[CWKNUM]; void cw::makeshape() { for (int i = 0; i < CWKNUM; i++) keyshape[i] = 1.0; switch (QSKshape) { case 1: // blackman knum = (int)(8 * risetime); if (knum >= symbollen) knum = symbollen; for (int i = 0; i < knum; i++) keyshape[i] = (0.42 - 0.50 * cos(M_PI * i/ knum) + 0.08 * cos(2 * M_PI * i / knum)); break; case 0: // hanning default: knum = (int)(8 * risetime); if (knum >= symbollen) knum = symbollen; for (int i = 0; i < knum; i++) keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / knum)); } } inline double cw::nco(double freq) { phaseacc += 2.0 * M_PI * freq / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; return sin(phaseacc); } inline double cw::qsknco() { double amp = sin(qskphase); qskphase += 2.0 * M_PI * 1000 / samplerate; if (qskphase > TWOPI) qskphase -= TWOPI; return amp; } //===================================================================== // send_symbol() // Sends a part of a morse character (one dot duration) of either // sound at the correct freq or silence. Rise and fall time is controlled // with a raised cosine shape. // // Left channel contains the shaped A2 CW waveform // Right channel contains a square wave burst of 1600 Hz that is used // to trigger a qsk switch. Right channel has pre and post timings for // proper switching of the qsk switch before and after the A2 element. // If the Pre + Post timing exceeds the interelement spacing then the // Pre and / or Post is only applied at the beginning and end of the // character. //======================================================================= //void appendfile(double *left, double *right, size_t count) //{ // FILE *ofile = fl_fopen("stereo.txt", "a"); // for (size_t i = 0; i < count; i++) // fprintf(ofile,"%f,%f\n", left[i], right[i]); // fclose(ofile); //} void cw::nb_filter(double *output, double *qsk, int len) { // fft implementation of if (nbfreq != tx_frequency || nbpf != progdefaults.CW_bpf) { nbfreq = tx_frequency; nbpf = progdefaults.CW_bpf; lwr = nbfreq - nbpf/2.0; upr = nbfreq + nbpf/2.0; if (lwr < 50.0) lwr = 50.0; if (upr > 3900.0) upr = 3900.0; lwr /= samplerate; upr /= samplerate; cw_xmt_filter->create_filter(lwr, upr); } cmplx *zp; int n = 0; for (int i = 0; i < len; i++) { // n will be either 0 or XMT_FILT_LEN qsk_signal[qsk_ptr] = qsk[i]; qsk_ptr++; if (qsk_ptr == QSK_DELAY_LEN) qsk_ptr--; if ((n = cw_xmt_filter->run( cmplx(output[i], output[i]), &zp)) > 0) { for (int k = 0; k < n; k++) if (abs(zp[k].real()) > maxval) maxval = abs(zp[k].real()); if (maxval == 0) maxval = 1.0; for (int k = 0; k < n; k++) xmt_signal[k] = 0.95 * zp[k].real() / maxval; // appendfile(xmt_signal, qsk_signal, n); if (progdefaults.QSK) ModulateStereo(xmt_signal, qsk_signal, n); else ModulateXmtr(xmt_signal, n); for (int k = 0; k < QSK_DELAY_LEN - n - 1; k++) qsk_signal[k] = qsk_signal[k + n]; qsk_ptr -= n; } } } int q_carryover = 0, carryover = 0; void cw::send_symbol(int bits, int len) { double freq; int sample, qsample, i; int delta = 0; int keydown; int keyup; int kpre; int kpost; int duration = 0; int symlen = 0; float dsymlen = 0.0; int currsym = bits & 1; double qsk_amp = progdefaults.QSK ? 1.0 : 0.0; sync_transmit_parameters(); acc_symbols += len; freq = get_txfreq_woffset(); delta = (int) (len * (progdefaults.CWweight - 50) / 100.0); symlen = len; if (currsym == 1) { dsymlen = len * (progdefaults.CWdash2dot - 3.0) / (progdefaults.CWdash2dot + 1.0); if (lastsym == 1 && currsym == 1) symlen += (int)(3 * dsymlen); else symlen -= (int)dsymlen; } if (delta < -(symlen - knum)) delta = -(symlen - knum); if (delta > (symlen - knum)) delta = symlen - knum; keydown = symlen + delta ; keyup = symlen - delta; kpre = (int)(progdefaults.CWpre * 8); if (kpre > symlen) kpre = symlen; if (progdefaults.QSK) { kpre = (int)(progdefaults.CWpre * 8); if (kpre > symlen) kpre = symlen; if (progdefaults.CWnarrow) { if (keydown - 2*knum < 0) kpost = knum + (int)(progdefaults.CWpost * 8); else kpost = keydown - knum + (int)(progdefaults.CWpost * 8); } else kpost = keydown + (int)(progdefaults.CWpost * 8); if (kpost < 0) kpost = 0; } else { kpre = 0; kpost = 0; } if (firstelement) { firstelement = false; return; } if (currsym == 1) { // keydown sample = 0; if (lastsym == 1) { for (i = 0; i < keydown; i++, sample++) { outbuf[sample] = nco(freq); qskbuf[sample] = qsk_amp * qsknco(); } duration = keydown; } else { if (carryover) { for (int i = carryover; i < knum; i++, sample++) outbuf[sample] = nco(freq) * keyshape[knum - i]; while (sample < kpre) outbuf[sample++] = 0 * nco(freq); } else for (int i = 0; i < kpre; i++, sample++) outbuf[sample] = 0 * nco(freq); sample = 0; for (int i = 0; i < kpre; i++, sample++) { qskbuf[sample] = qsk_amp * qsknco(); } for (int i = 0; i < knum; i++, sample++) { outbuf[sample] = nco(freq) * keyshape[i]; qskbuf[sample] = qsk_amp * qsknco(); } duration = kpre + knum; } carryover = 0; } else { // keyup if (lastsym == 0) { duration = keyup; sample = 0; if (carryover) { for (int i = carryover; i < knum; i++, sample++) outbuf[sample] = nco(freq) * keyshape[knum - i]; while (sample < duration) outbuf[sample++] = 0 * nco(freq); } else while (sample < duration) outbuf[sample++] = 0 * nco(freq); carryover = 0; qsample = 0; if (q_carryover) { for (int i = 0; i < q_carryover; i++, qsample++) { qskbuf[qsample] = qsk_amp * qsknco(); } while (qsample < duration) qskbuf[qsample++] = 0 * qsknco(); } else while (qsample < duration) qskbuf[qsample++] = 0 * qsknco(); if (q_carryover > duration) q_carryover = duration - q_carryover; else q_carryover = 0; } else { // last symbol = 1 duration = 2 * len - kpre - knum; carryover = 0; sample = 0; int next = keydown - knum; if (progdefaults.CWnarrow) next = keydown - 2*knum; for (int i = 0; i < next; i++, sample++) outbuf[sample] = nco(freq); for (int i = 0; i < knum; i++, sample++) { if (sample == duration) { carryover = i; break; } outbuf[sample] = nco(freq) * keyshape[knum - i]; } while (sample < duration) outbuf[sample++] = 0 * nco(freq); q_carryover = 0; qsample = 0; for (int i = 0; i < kpost; i++, qsample++) { if (qsample == duration) { q_carryover = kpost - duration; break; } qskbuf[qsample] = qsk_amp * qsknco(); } while (qsample < duration) qskbuf[qsample++] = 0 * qsknco(); } } if (duration > 0) { if (progdefaults.CW_bpf_on) nb_filter(outbuf, qskbuf, duration); else { if (progdefaults.QSK) ModulateStereo(outbuf, qskbuf, duration); else ModulateXmtr(outbuf, duration); } } lastsym = currsym; firstelement = false; } //===================================================================== // send_ch() // sends a morse character and the space afterwards //======================================================================= void cw::send_ch(int ch) { string code; int chout = ch; int flen; sync_parameters(); // handle word space separately (7 dots spacing) // last char already had 3 elements of inter-character spacing double T = (50.0 - 31 * fsymlen / symbollen) / 19.0; if (!progdefaults.CWusefarnsworth || (progdefaults.CWspeed >= progdefaults.CWfarnsworth)) T = 1.0; int tc = 3.0 * T * symbollen; int tw = 7.0 * T * symbollen; if ((chout == ' ') || (chout == '\n')) { firstelement = false; flen = tw - tc - ( T > 1.0 ? fsymlen : 0); while (flen - symbollen > 0) { send_symbol(0, symbollen); flen -= symbollen; } if (flen) send_symbol(0, flen); put_echo_char(progdefaults.rx_lowercase ? tolower(ch) : ch); return; } if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed <= progdefaults.CWfarnsworth)) flen = fsymlen; else flen = symbollen; code = morse.tx_lookup(chout); if (!code.length()) { return; } firstelement = true; // while (code.length()) { for (size_t n = 0; n < code.length(); n++) { send_symbol(0, flen); send_symbol(1, flen); if (code[n] == '-') { send_symbol( 1, flen ); send_symbol( 1, flen ); } } send_symbol(0, flen); send_symbol(0, flen); send_symbol(0, flen); // inter character space at WPM/FWPM rate // if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed <= progdefaults.CWfarnsworth)) { if (T > 1.0) { flen = tc - 3 * flen; while(flen - symbollen > 0) { send_symbol(0, symbollen); flen -= symbollen; } if (flen) send_symbol(0, flen); } if (ch != -1) { string prtstr = morse.tx_print(); for (size_t n = 0; n < prtstr.length(); n++) put_echo_char( prtstr[n], prtstr[0] == '<' ? FTextBase::CTRL : FTextBase::XMIT); } } //===================================================================== // cw_txprocess() // Read characters from screen and send them out the sound card. // This is called repeatedly from a thread during tx. //======================================================================= int cw::tx_process() { int c; if (use_paren != progdefaults.CW_use_paren || prosigns != progdefaults.CW_prosigns) { use_paren = progdefaults.CW_use_paren; prosigns = progdefaults.CW_prosigns; morse.init(); } c = get_tx_char(); if (c == GET_TX_CHAR_NODATA) { if (stopflag) { stopflag = false; if (progdefaults.CW_bpf_on) { // flush the transmit bandpass filter int n = cw_xmt_filter->flush_size(); for (int i = 0; i < n; i++) outbuf[i] = 0; nb_filter(outbuf, outbuf, n); } put_echo_char('\n'); return -1; } Fl::awake(); MilliSleep(50); return 0; } if (progStatus.WK_online) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); return -1; } if (WK_send_char(c)){ put_echo_char('\n'); return -1; // WinKeyer problem } return 0; } if (use_nanoIO) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); nano_serial_flush(); return -1; } nano_send_char(c); put_echo_char(c); return 0; } if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; if (progdefaults.CW_bpf_on) { // flush the transmit bandpass filter int n = cw_xmt_filter->flush_size(); for (int i = 0; i < n; i++) outbuf[i] = 0; nb_filter(outbuf, outbuf, n); } put_echo_char('\n'); return -1; } acc_symbols = 0; send_ch(c); char_samples = acc_symbols; return 0; } void cw::incWPM() { if (usedefaultWPM) return; if (progdefaults.CWspeed < progdefaults.CWupperlimit) { progdefaults.CWspeed++; sync_parameters(); set_CWwpm(); update_Status(); } } void cw::decWPM() { if (usedefaultWPM) return; if (progdefaults.CWspeed > progdefaults.CWlowerlimit) { progdefaults.CWspeed--; set_CWwpm(); sync_parameters(); update_Status(); } } void cw::toggleWPM() { usedefaultWPM = !usedefaultWPM; sync_parameters(); update_Status(); } fldigi-4.1.06/src/cw_rtty/morse.cxx0000644000175000017500000001665113472115772014136 00000000000000/* * morse.c -- morse code tables * * Copyright (C) 2017 * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #include #include #include #include "morse.h" #include "configuration.h" /* ---------------------------------------------------------------------- */ /* * Morse code characters table. This table allows lookup of the Morse * shape of a given alphanumeric character. Shapes are held as a string, * with "-' representing dash, and ".' representing dot. The table ends * with a NULL entry. * * This is the main table from which the other tables are computed. * * The Prosigns are also defined in the configuration.h file * The user can specify the character which substitutes for the prosign */ bool CW_table_changed = false; CWstruct cMorse::cw_table[] = { // Prosigns {1, "=", "", "-...-" }, // 0 {0, "~", "", ".-.-" }, // 1 {1, "<", "", ".-..." }, // 2 {1, ">", "", ".-.-." }, // 3 {1, "%", "", "...-.-" }, // 4 {1, "+", "", "-.--." }, // 5 {1, "&", "", "..-.-" }, // 6 {1, "{", "", "....--" }, // 7 {1, "}", "", "...-." }, // 8 // ASCII 7bit letters {1, "A", "A", ".-" }, {1, "B", "B", "-..." }, {1, "C", "C", "-.-." }, {1, "D", "D", "-.." }, {1, "E", "E", "." }, {1, "F", "F", "..-." }, {1, "G", "G", "--." }, {1, "H", "H", "...." }, {1, "I", "I", ".." }, {1, "J", "J", ".---" }, {1, "K", "K", "-.-" }, {1, "L", "L", ".-.." }, {1, "M", "M", "--" }, {1, "N", "N", "-." }, {1, "O", "O", "---" }, {1, "P", "P", ".--." }, {1, "Q", "Q", "--.-" }, {1, "R", "R", ".-." }, {1, "S", "S", "..." }, {1, "T", "T", "-" }, {1, "U", "U", "..-" }, {1, "V", "V", "...-" }, {1, "W", "W", ".--" }, {1, "X", "X", "-..-" }, {1, "Y", "Y", "-.--" }, {1, "Z", "Z", "--.." }, // {1, "a", "A", ".-" }, {1, "b", "B", "-..." }, {1, "c", "C", "-.-." }, {1, "d", "D", "-.." }, {1, "e", "E", "." }, {1, "f", "F", "..-." }, {1, "g", "G", "--." }, {1, "h", "H", "...." }, {1, "i", "I", ".." }, {1, "j", "J", ".---" }, {1, "k", "K", "-.-" }, {1, "l", "L", ".-.." }, {1, "m", "M", "--" }, {1, "n", "N", "-." }, {1, "o", "O", "---" }, {1, "p", "P", ".--." }, {1, "q", "Q", "--.-" }, {1, "r", "R", ".-." }, {1, "s", "S", "..." }, {1, "t", "T", "-" }, {1, "u", "U", "..-" }, {1, "v", "V", "...-" }, {1, "w", "W", ".--" }, {1, "x", "X", "-..-" }, {1, "y", "Y", "-.--" }, {1, "z", "Z", "--.." }, // Numerals {1, "0", "0", "-----" }, {1, "1", "1", ".----" }, {1, "2", "2", "..---" }, {1, "3", "3", "...--" }, {1, "4", "4", "....-" }, {1, "5", "5", "....." }, {1, "6", "6", "-...." }, {1, "7", "7", "--..." }, {1, "8", "8", "---.." }, {1, "9", "9", "----." }, // Punctuation {1, "\\", "\\", ".-..-." }, {1, "\'", "'", ".----." }, {1, "$", "$", "...-..-" }, {1, "(", "(", "-.--." }, {1, ")", ")", "-.--.-" }, {1, ",", ",", "--..--" }, {1, "-", "-", "-....-" }, {1, ".", ".", ".-.-.-" }, {1, "/", "/", "-..-." }, {1, ":", ":", "---..." }, {1, ";", ";", "-.-.-." }, {1, "?", "?", "..--.." }, {1, "_", "_", "..--.-" }, {1, "@", "@", ".--.-." }, {1, "!", "!", "-.-.--" }, // accented characters {1, "Ä", "Ä", ".-.-" }, // A umlaut {1, "ä", "Ä", ".-.-" }, // A umlaut {0, "Æ", "Æ", ".-.-" }, // A aelig {0, "æ", "Æ", ".-.-" }, // A aelig {0, "Å", "Å", ".--.-" }, // A ring {0, "å", "Å", ".--.-" }, // A ring {1, "Ç", "Ç", "-.-.." }, // C cedilla {1, "ç", "Ç", "-.-.." }, // C cedilla {0, "È", "È", ".-..-" }, // E grave {0, "è", "È", ".-..-" }, // E grave {1, "É", "É", "..-.." }, // E acute {1, "é", "É", "..-.." }, // E acute {0, "Ó", "Ó", "---." }, // O acute {0, "ó", "Ó", "---." }, // O acute {1, "Ö", "Ö", "---." }, // O umlaut {1, "ö", "Ö", "---." }, // O umlaut {0, "Ø", "Ø", "---." }, // O slash {0, "ø", "Ø", "---." }, // O slash {1, "Ñ", "Ñ", "--.--" }, // N tilde {1, "ñ", "Ñ", "--.--" }, // N tilde {1, "Ü", "Ü", "..--" }, // U umlaut {1, "ü", "Ü", "..--" }, // U umlaut {0, "Û", "Û", "..--" }, // U circ {0, "û", "Û", "..--" }, // U circ // array termination {0, "", "", ""} }; /* ---------------------------------------------------------------------- */ void cMorse::enable(std::string s, bool val) { for (int i = 0; cw_table[i].rpr.length(); i++) { if (cw_table[i].chr == s) { cw_table[i].enabled = val; return; } } } void cMorse::init() { // Update the char / prosign relationship if (progdefaults.CW_prosigns.length() == 9) { for (int i = 0; i < 9; i++) { cw_table[i].chr = progdefaults.CW_prosigns[i]; } } enable("", 1); enable("Ä", 0); enable("ä", 0); enable("Æ", 0); enable("æ", 0); enable("Å", 0); enable("å", 0); enable("Ç", 0); enable("ç", 0); enable("È", 0); enable("è", 0); enable("É", 0); enable("é", 0); enable("Ó", 0); enable("ó", 0); enable("Ö", 0); enable("ö", 0); enable("Ø", 0); enable("ø", 0); enable("Ñ", 0); enable("ñ", 0); enable("Ü", 0); enable("ü", 0); enable("Û", 0); enable("û", 0); if (progdefaults.A_umlaut) { enable("Ä", 1); enable("ä", 1); enable("", 0); } if (progdefaults.A_aelig) { enable("Æ", 1); enable("æ", 1); enable("", 0); } if (progdefaults.A_ring) { enable("Å", 1); enable("å", 1); } if (progdefaults.C_cedilla) { enable("Ç", 1); enable("ç", 1); } if (progdefaults.E_grave) { enable("È", 1); enable("è", 1); } if (progdefaults.E_acute) { enable("É", 1); enable("é", 1); } if (progdefaults.O_acute) { enable("Ó", 1); enable("ó", 1); } if (progdefaults.O_umlaut) { enable("Ö", 1); enable("ö", 1); } if (progdefaults.O_slash) { enable("Ø", 1); enable("ø", 1); } if (progdefaults.N_tilde) { enable("Ñ", 1); enable("ñ", 1); } if (progdefaults.U_umlaut) { enable("Ü", 1); enable("ü", 1); } if (progdefaults.U_circ) { enable("Û", 1); enable("û", 1); } CW_table_changed = false; utf8.clear(); toprint.clear(); } std::string cMorse::rx_lookup(std::string rx) { if (CW_table_changed) init(); for (int i = 0; cw_table[i].rpr.length(); i++) { if (rx == cw_table[i].rpr) { if (cw_table[i].enabled) { return cw_table[i].prt; } } } return ""; } std::string cMorse::tx_lookup(int c) { if (CW_table_changed) init(); c &= 0xFF; utf8 += c; toprint.clear(); if (((utf8[0] & 0xFF) > 0x7F) && (utf8.length() == 1)) { return ""; } for (int i = 0; cw_table[i].rpr.length(); i++) { if (utf8 == cw_table[i].chr) { if (!cw_table[i].enabled) { utf8.clear(); return ""; } toprint = cw_table[i].prt; utf8.clear(); return cw_table[i].rpr; } } utf8.clear(); return ""; } int cMorse::tx_length(int c) { if (c == ' ') return 4; std::string ms = tx_lookup(c); if (ms.empty()) return 0; int len = 0; for (size_t i = 0; i < ms.length(); i++) if (ms[i] == '.') len += 2; else len += 4; len += 2; return len; } /* ---------------------------------------------------------------------- */ fldigi-4.1.06/src/cw_rtty/winkeyer.cxx0000664000175000017500000007562113507402064014642 00000000000000// ---------------------------------------------------------------------------- // winkeyer.cxx -- Interface to k1el WinKeyer hardware // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "winkeyer.h" #include "status.h" #include "serial.h" #include "threads.h" #include "modem.h" #include "morse.h" #include "icons.h" #define LOG_WKEY LOG_VERBOSE using namespace std; //---------------------------------------------------------------------- // WinKeyer general support //---------------------------------------------------------------------- Cserial WK_serial; pthread_t WK_serial_thread; pthread_mutex_t WK_mutex_serial = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t WK_buffer_mutex = PTHREAD_MUTEX_INITIALIZER; //====================================================================== // WinKey command sequences //====================================================================== // ADMIN MODE static const char ADMIN = '\x00'; //static const char CALIBRATE = '\x00'; static const char RESET = '\x01'; static const char HOST_OPEN = '\x02'; static const char HOST_CLOSE = '\x03'; static const char ECHO_TEST = '\x04'; //static const char PADDLE_A2D = '\x05'; //static const char SPEED_A2D = '\x06'; //static const char GET_VALUES = '\x07'; //static const char GET_CAL = '\x09'; //static const char WK1_MODE = '\x0A'; static const char WK2_MODE = '\x0B'; //static const char DUMP_EEPROM = '\x0C'; //static const char LOAD_EEPROM = '\x0D'; static const char FSK_MODE = '\x13'; //static const char *SEND_MSG_NBR = "\x0E"; // HOST MODE //static const char *SIDETONE = "\x01"; // N see table page 6 Interface Manual static const char *SET_WPM = "\x02"; // 5 .. N .. 99 in WPM //static const char *SET_WEIGHT = "\x03"; // 10 .. N .. 90 % //static const char *SET_PTT_LT = "\x04"; // A - lead time, B - tail time // both 0..250 in 10 msec steps // "0x04<01> = 10 msec lead, 1.6 sec tail static const char *SET_SPEED_POT = "\x05"; // A = min, B = range, C anything //static const char *PAUSE = "\x06"; // 1 = pause, 0 = release static const char *GET_SPEED_POT = "\x07"; // return values as per page 7/8 //static const char *BACKSPACE = "\x08"; //static const char *SET_PIN_CONFIG = "\x09"; // N as per tables page 8 static const char *CLEAR_BUFFER = "\x0A"; static const char *KEY_IMMEDIATE = "\x0B"; // 0 = keyup, 1 = keydown //static const char *HSCW = "\x0C"; // N = lpm / 100 //static const char *FARNS_WPM = "\x0D"; // 10 .. N .. 99 //static const char *SET_WK2_MODE = "\x0E"; // N as per table page 9 static const char *LOAD_DEFAULTS = "\x0F"; // A = MODE REGISTER B = SPEED IN WPM C = SIDETONE FREQ // D = WEIGHT E = LEAD-IN TIME F = TAIL TIME // G = MIN_WPM H = WPM RANGE I = 1ST EXTENSION // J = KEY COMPENSATION K = FARNSWORTH WPM L = PADDLE SETPOINT // M = DIT/DAH RATIO N = PIN_CONFIGURATION O = DONT CARE ==> zero //static const char *FIRST_EXT = "\x10"; // see page 10/11 //static const char *SET_KEY_COMP = "\x11"; // see page 11 static const char *NULL_CMD = "\x13\x13\x13"; //static const char *PADDLE_SW_PNT = "\x12"; // 10 .. N .. 90% //static const char *SOFT_PADDLE = "\x14"; // 0 - up, 1 - dit, 2 - dah, 3 - both //static const char *GET_STATUS = "\x15"; // request status byte, see page 12 //static const char *POINTER_CMD = "\x16"; // see page 12 //static const char *SET_DIT_DAH = "\x17"; // 33 .. N .. 66 N = ratio * 50 / 3 // BUFFERED COMMANDS //static const char *PTT_ON_OFF = "\x18"; // 1 = on 0 = off //static const char *KEY_BUFFERED = "\x19"; // 0 .. N .. 99 seconds //static const char *WAIT = "\x1A"; // 0 .. N .. 99 seconds //static const char *MERGE = "\x1B"; // merger CD into prosign, ie AR, SK etc //static const char *CHANGE_BFR_SPD = "\x1C"; // 5 .. N .. 99 //static const char *CHANGE_HSCW_SPD = "\x1D"; // N = lpm / 100 //static const char *CANCEL_BFR_SPD = "\x1E"; //static const char *BUFFER_NOP = "\x1F"; //====================================================================== // loop for serial i/o thread // runs continuously until program is closed // only accesses the serial port if it has been successfully opened //====================================================================== void WK_version_(int); void WK_echo_test(int); void WK_status_(int); void WK_speed_(int); void WK_echo_(int); void WK_eeprom_(int); bool WK_readByte(unsigned char &byte); int WK_readString(); int WK_sendString (string &s); void WK_clearSerialPort(); void WK_display_byte(void *d); bool WK_bypass_serial_thread_loop = true; bool WK_run_serial_thread = true; bool WK_PTT = false; int WK_powerlevel = 0; static string WK_str_out = ""; static bool WK_get_version = false; static bool WK_test_echo = false; static bool WK_host_is_up = false; static bool wk2_version = false; static bool read_EEPROM = false; static char eeprom_image[256]; static int eeprom_ptr = 0; static int wkeyer_ready = true; static cMorse *wkmorse = 0; static std::string hexstr(std::string &s) { static std::string hex; static char val[3]; hex.clear(); for (size_t i = 0; i < s.length(); i++) { snprintf(val, sizeof(val), "%02x", s[i] & 0xFF); hex.append(" 0x").append(val); } return hex; } static void upcase(string &s) { for (size_t n = 0; n < s.length(); n++) if (s[n] > ' ') s[n] = toupper(s[n]); } enum {NOTHING, WAIT_ECHO, WAIT_VERSION}; static void WK_send_command(string &cmd, int what = NOTHING) { int cnt = 101; while (cnt-- && !WK_str_out.empty()) MilliSleep(1); if (!WK_str_out.empty()) return; guard_lock wklock(&WK_mutex_serial); upcase(cmd); cnt = 101; WK_str_out = cmd; while (cnt-- && !WK_str_out.empty()) MilliSleep(1); switch (what) { case WAIT_ECHO : WK_test_echo = true; break; case WAIT_VERSION : WK_get_version = true; break; default: ; } } static bool WK_wait_for_char = false; static char lastchar = ' '; int WK_send_char(int c) { if (!wkmorse) wkmorse = new cMorse; c = toupper(c); if (c <= 0) { MilliSleep(10); Fl::awake(); return 0; } struct timeval t; long msec_start; long msec_end; if (c < ' ') c = ' '; if (c == '0' && progStatus.WK_cut_zeronine) c = 'T'; if (c == '9' && progStatus.WK_cut_zeronine) c = 'N'; int n = 0; if (lastchar == ' ' && c == ' ') n = 7; else if (lastchar != ' ' && c == ' ') n = 4; else { if (c != ' ') { std::string code = wkmorse->tx_lookup(c); for (size_t i = 0; i < code.length(); i++) { n += 2; if (code[i] == '-') n += 2; } n += 2; } } // if (btn_WK_serial_echo->value()) // n *= 2; // needed for ZLP clone compatibility n *= 1200 / cntCW_WPM->value(); lastchar = c; if (c != ' ') { guard_lock wklock(&WK_buffer_mutex); WK_str_out += c; if (btn_WK_serial_echo->value()) WK_wait_for_char = true; } gettimeofday(&t, NULL); msec_start = (t.tv_sec - (t.tv_sec / 10000) * 10000) * 1000; msec_start += t.tv_usec / 1000; msec_start += n; if (WK_wait_for_char) { n += 100; while (WK_wait_for_char) { MilliSleep(1); if (n % 50 == 0) Fl::awake(); if (--n == 0) { WK_wait_for_char = false; LOG_ERROR("Winkeyer did not echo character!"); return 1; } if (active_modem->get_stopflag()) { WK_wait_for_char = false; LOG_INFO("Aborted transmission"); return 1; } } } else { while (!active_modem->get_stopflag()) { MilliSleep(1); gettimeofday(&t, NULL); msec_end = (t.tv_sec - (t.tv_sec / 10000) * 10000) * 1000; msec_end += t.tv_usec / 1000; if (msec_end >= msec_start) { break; } n--; if (n == 0) { break; } if (n % 50 == 0) Fl::awake(); } Fl::awake(WK_display_byte, reinterpret_cast(c)); } return 0; } void * WK_serial_thread_loop(void *d) { SET_THREAD_ID(WKEY_TID); unsigned char byte; for(;;) { if (!WK_run_serial_thread) break; MilliSleep(1);//5); if (WK_bypass_serial_thread_loop || !WK_serial.IsOpen()) goto WK_serial_bypass_loop; // process outgoing { guard_lock wklock(&WK_buffer_mutex); if (!WK_str_out.empty()) { WK_sendString(WK_str_out); WK_str_out.clear(); } } // receive WinKeyer response { guard_lock wklock(&WK_mutex_serial); if (WK_serial.ReadBuffer(&byte, 1) == 1) { if ((byte == 0xA5 || read_EEPROM)) WK_eeprom_(byte); else if ((byte & 0xC0) == 0xC0) WK_status_(byte); else if ((byte & 0xC0) == 0x80) WK_speed_(byte); else if (WK_test_echo) WK_echo_test(byte); else if (WK_get_version) WK_version_(byte); else if (WK_wait_for_char) WK_echo_(byte); } } WK_serial_bypass_loop: ; } return NULL; } void WK_display_byte(void *d) { long lch = (long)d; char ch = (char)lch; LOG_WKEY("echo: %02x", ch); ReceiveText->add(ch, FTextBase::XMIT); } void WK_display_chars(void *d) { char *sz_chars = (char *)d; ReceiveText->add(sz_chars); } void WK_echo_(int byte) { if (WK_wait_for_char) { if (byte == ' ' && lastchar == '\n') byte = lastchar; } Fl::awake(WK_display_byte, reinterpret_cast(byte)); lastchar = byte; WK_wait_for_char = false; } void WK_echo_test(int byte) { if (byte != 'U') return; LOG_WKEY("passed echo test"); WK_test_echo = false; } void WK_version_(int byte) { static char ver[200]; snprintf(ver, sizeof(ver), "\nConnected to Winkeyer h/w version %d\n", byte & 0xFF); WK_host_is_up = true; WK_get_version = false; Fl::awake(WK_display_chars, ver); progStatus.WK_version = byte; } void WK_show_status_change(void *d) { int byte = reinterpret_cast(d) & 0xFF; box_WK_wait->color((byte & 0x10) == 0x10 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_wait->redraw(); box_WK_keydown->color((byte & 0x08) == 0x08 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_keydown->redraw(); box_WK_busy->color((byte & 0x04) == 0x04 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_busy->redraw(); box_WK_break_in->color((byte & 0x02) == 0x02 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_break_in->redraw(); box_WK_xoff->color((byte & 0x01) == 0x01 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_xoff->redraw(); } void WK_status_(int byte) { if ((byte & 0x04)== 0x04) wkeyer_ready = false; else wkeyer_ready = true; LOG_DEBUG("Wait %c, Keydown %c, Busy %c, Breakin %c, Xoff %c", byte & 0x10 ? 'T' : 'F', byte & 0x08 ? 'T' : 'F', byte & 0x04 ? 'T' : 'F', byte & 0x02 ? 'T' : 'F', byte & 0x01 ? 'T' : 'F'); Fl::awake(WK_show_status_change, reinterpret_cast(byte)); } void WK_show_speed_change(void *d) { if (!progStatus.WK_use_pot) { return; } long wpm = (long)d; int iwpm = (int)wpm; static char szwpm[8]; snprintf(szwpm, sizeof(szwpm), "%3d", iwpm); txt_WK_wpm->value(szwpm); txt_WK_wpm->redraw(); cntCW_WPM->value(iwpm); cntCW_WPM->redraw(); progdefaults.CWspeed = iwpm; sync_cw_parameters(); string cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_WKEY("SET_WPM %d : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_speed_(int byte) { int val = (byte & 0x3F) + progStatus.WK_min_wpm; Fl::awake(WK_show_speed_change, reinterpret_cast(val)); } void WK_set_wpm() { string cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_WKEY("SET_WPM %d : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_use_pot_changed() { progStatus.WK_use_pot = btn_WK_use_pot->value(); if (progStatus.WK_use_pot) { string cmd = GET_SPEED_POT; LOG_WKEY("GET_SPEED_POT : %s", hexstr(cmd).c_str()); } else { string cmd = SET_WPM; if (cntCW_WPM->value() > 55) cntCW_WPM->value(55); if (cntCW_WPM->value() < 5) cntCW_WPM->value(5); progdefaults.CWspeed = cntCW_WPM->value(); cmd += progdefaults.CWspeed; LOG_WKEY("SET_WPM %d : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } } void WK_eeprom_(int byte) { if (byte == 0xA5) { memset( eeprom_image, 0, 256); eeprom_ptr = 0; read_EEPROM = true; } if (eeprom_ptr < 256) eeprom_image[eeprom_ptr++] = byte; if (eeprom_ptr == 256) { read_EEPROM = false; LOG_WKEY("\n%s", str2hex(eeprom_image, 256)); eeprom_ptr = 0; } } void load_defaults() { // progStatus.WK_mode_register |= 0x04; // Winkeyer must echo characters string cmd = LOAD_DEFAULTS; cmd += progStatus.WK_mode_register; cmd += progdefaults.CWspeed; cmd += progStatus.WK_sidetone; cmd += progStatus.WK_weight; cmd += progStatus.WK_lead_in_time; cmd += progStatus.WK_tail_time; cmd += progStatus.WK_min_wpm; cmd += progStatus.WK_rng_wpm; cmd += progStatus.WK_first_extension; cmd += progStatus.WK_key_compensation; cmd += progStatus.WK_farnsworth_wpm; cmd += progStatus.WK_paddle_setpoint; cmd += progStatus.WK_dit_dah_ratio; cmd += progStatus.WK_pin_configuration; cmd += progStatus.WK_dont_care; LOG_WKEY("\n\ mode register .... %0x\n\ CW speed ......... %d\n\ side tone ........ %d\n\ weight ........... %d\n\ lead in time ..... %d\n\ tail time ........ %d\n\ min wpm .......... %d\n\ rng wpm .......... %d\n\ first ext ........ %d\n\ key comp ......... %d\n\ farnsworth wpm ... %d\n\ paddle setpoint .. %d\n\ dit dah ratio .... %d\n\ pin config ....... %d\n\ don't care ....... %d\n\ hex string ....... %s", progStatus.WK_mode_register, progdefaults.CWspeed, progStatus.WK_sidetone, progStatus.WK_weight, progStatus.WK_lead_in_time, progStatus.WK_tail_time, progStatus.WK_min_wpm, progStatus.WK_rng_wpm, progStatus.WK_first_extension, progStatus.WK_key_compensation, progStatus.WK_farnsworth_wpm, progStatus.WK_paddle_setpoint, progStatus.WK_dit_dah_ratio, progStatus.WK_pin_configuration, progStatus.WK_dont_care, hexstr(cmd).c_str()); WK_send_command(cmd); cmd = SET_SPEED_POT; cmd += progStatus.WK_min_wpm; cmd += progStatus.WK_rng_wpm; cmd += 0xFF; LOG_WKEY("SET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); if (progStatus.WK_use_pot) { string cmd = GET_SPEED_POT; LOG_WKEY("GET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } else { string cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_WKEY("SETWPM %d : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } } void WKCW_init() { string cmd; if (wk2_version) { cmd = " "; cmd[0] = ADMIN; cmd[1] = WK2_MODE; LOG_WKEY("WK2_MODE %s", hexstr(cmd).c_str()); WK_send_command(cmd); } btn_WK_use_pot->value(progStatus.WK_use_pot); load_defaults(); cmd = GET_SPEED_POT; LOG_WKEY("GET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_WKEY("SET_WPM %d : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); cmd = SET_SPEED_POT; cmd += progStatus.WK_min_wpm; cmd += progStatus.WK_rng_wpm; cmd += 0xFF; LOG_WKEY("SET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); cmd = GET_SPEED_POT; LOG_WKEY("GET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } void open_wkeyer() { int cnt = 0; string cmd = NULL_CMD; LOG_WKEY("NULL_CMD : %s", hexstr(cmd).c_str()); WK_send_command(cmd); WK_clearSerialPort(); // This code only works for a real WinKeyer // fails for the K3NG Arduino sketch code as written to MORTTY if (btn_WK_serial_echo->value() && !btnK3NG->value()) { cmd = " "; cmd[0] = ADMIN; cmd[1] = ECHO_TEST; cmd += 'U'; LOG_WKEY("ECHO_TEST : %s", hexstr(cmd).c_str()); WK_send_command(cmd, WAIT_ECHO); cnt = 5000; while (WK_test_echo == true && cnt) { MilliSleep(1); cnt--; } if (WK_test_echo) { debug::show(); LOG_ERROR("%s", "Winkeyer not responding"); WK_test_echo = false; pthread_mutex_lock(&WK_mutex_serial); WK_bypass_serial_thread_loop = true; pthread_mutex_unlock(&WK_mutex_serial); WK_serial.ClosePort(); progStatus.WK_serial_port_name = "NONE"; select_WK_CommPort->value(progStatus.WK_serial_port_name.c_str()); return; } LOG_WKEY("Echo response in %d msec", 5000 - cnt); // cmd = " "; // cmd[0] = ADMIN; // cmd[1] = DUMP_EEPROM; // WK_send_command(cmd); // read_EEPROM = true; // cnt = 4000; // while (read_EEPROM == true && cnt) { // MilliSleep(10); // cnt--; // } // LOG_WKEY("EEprom read time %.2f sec", (4000 - cnt) * 0.01); } // else { // cmd = " "; // cmd[0] = ADMIN; // cmd[1] = ECHO_TEST; // cmd += 'U'; // WK_send_command(cmd); // } cmd = " "; cmd[0] = ADMIN; cmd[1] = HOST_OPEN; LOG_WKEY("HOST_OPEN : %s", hexstr(cmd).c_str()); WK_send_command(cmd, WAIT_VERSION); cnt = 1000; while (WK_get_version == true && cnt) { MilliSleep(1); cnt--; } } void close_wkeyer() { string cmd = " "; cmd[0] = ADMIN; cmd[1] = RESET; LOG_WKEY("WKEY RESET : %s", hexstr(cmd).c_str()); WK_send_command(cmd); cmd[0] = ADMIN; cmd[1] = HOST_CLOSE; LOG_WKEY("HOST CLOSE : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_cancel_transmit() { string cmd = CLEAR_BUFFER; LOG_WKEY("CLEAR_BUFFER : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_tune(bool on) { string cmd = KEY_IMMEDIATE; if (on) cmd += '\1'; else cmd += '\0'; LOG_WKEY("KEY_IMMEDIATE : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } //---------------------------------------------------------------------- // WinKeyer setup support //---------------------------------------------------------------------- void WK_change_btn_swap() { progStatus.WK_mode_register &=0xF7; progStatus.WK_mode_register |= btn_WK_swap->value() ? 0x08 : 0x00; LOG_WKEY("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_auto_space() { progStatus.WK_mode_register &=0xFD; progStatus.WK_mode_register |= btn_WK_auto_space->value() ? 0x02 : 0x00; LOG_WKEY("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_ct_space() { progStatus.WK_mode_register &= 0xFE; progStatus.WK_mode_register |= btn_WK_ct_space->value(); LOG_WKEY("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_paddledog() { progStatus.WK_mode_register &=0x7F; progStatus.WK_mode_register |= btn_WK_paddledog->value() ? 0x80 : 0x00; LOG_WKEY("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_cut_zeronine() { progStatus.WK_cut_zeronine = btn_WK_cut_zeronine->value(); } void WK_change_btn_paddle_echo() { progStatus.WK_mode_register &=0xBF; progStatus.WK_mode_register |= btn_WK_paddle_echo->value() ? 0x40 : 0x00; LOG_WKEY("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_serial_echo() { progStatus.WK_mode_register &=0xFB; progStatus.WK_mode_register |= btn_WK_serial_echo->value() ? 0x04 : 0x00; LOG_WKEY("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_sidetone_on() { progStatus.WK_sidetone = choice_WK_sidetone->index() + 1; progStatus.WK_sidetone |= (btn_WK_sidetone_on->value() ? 0x80 : 0x00); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_tone_on() { progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xFD) | (btn_WK_tone_on->value() ? 2 : 0); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_ptt_on() { progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xFE) | (btn_WK_ptt_on->value() ? 1 : 0); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_min_wpm() { progStatus.WK_min_wpm = cntr_WK_min_wpm->value(); // cntr_WK_wpm->minimum(progStatus.WK_min_wpm); // cntr_WK_wpm->maximum(progStatus.WK_rng_wpm + progStatus.WK_min_wpm); if (progStatus.WK_speed_wpm < progStatus.WK_min_wpm) { progStatus.WK_speed_wpm = progStatus.WK_min_wpm; cntCW_WPM->value(progStatus.WK_speed_wpm); } if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_rng_wpm() { progStatus.WK_rng_wpm = cntr_WK_rng_wpm->value(); // cntr_WK_wpm->minimum(progStatus.WK_min_wpm); // cntr_WK_wpm->maximum(progStatus.WK_rng_wpm + progStatus.WK_min_wpm); if (progStatus.WK_speed_wpm > progStatus.WK_min_wpm + progStatus.WK_rng_wpm) { progStatus.WK_speed_wpm = progStatus.WK_min_wpm + progStatus.WK_rng_wpm; cntCW_WPM->value(progStatus.WK_speed_wpm); } if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_farnsworth() { progStatus.WK_farnsworth_wpm = cntr_WK_farnsworth->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_cmd_wpm() { progStatus.WK_cmd_wpm = cntr_WK_cmd_wpm->value(); } void WK_change_cntr_ratio() { progStatus.WK_dit_dah_ratio = (unsigned char)(cntr_WK_ratio->value() * 50 / 3); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_comp() { progStatus.WK_key_compensation = cntr_WK_comp->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_first_ext() { progStatus.WK_first_extension = cntr_WK_first_ext->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_sample() { progStatus.WK_paddle_setpoint = cntr_WK_sample->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_weight() { progStatus.WK_weight = cntr_WK_weight->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_leadin() { progStatus.WK_lead_in_time = cntr_WK_leadin->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_tail() { progStatus.WK_tail_time = cntr_WK_tail->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_choice_keyer_mode() { int modebits = choice_WK_keyer_mode->index() << 4; progStatus.WK_mode_register = (progStatus.WK_mode_register & 0xCF) | modebits; LOG_WKEY("mode reg: %02X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_choice_hang() { int hangbits = choice_WK_hang->index() << 4; progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xCF) | hangbits; if (progStatus.WK_online) load_defaults(); } void WK_change_choice_sidetone() { progStatus.WK_sidetone = choice_WK_sidetone->index() + 1; progStatus.WK_sidetone |= (btn_WK_sidetone_on->value() ? 0x80 : 0x00); if (progStatus.WK_online) load_defaults(); } void WK_change_choice_output_pins() { int pinbits = (choice_WK_output_pins->index() + 1) << 2; progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xF3) | pinbits; if (progStatus.WK_online) load_defaults(); } //---------------------------------------------------------------------- // serial support //---------------------------------------------------------------------- extern bool test; //static const char *nuline = "\n"; //static int iWK_BaudRates[] = { 300, 600, 1200, 2400, 4800, 9600, // 19200, 38400, 57600, 115200, 230400, 460800 }; //static const char *szWK_BaudRates[] = { "300", "600", "1200", "2400", "4800", "9600", // "19200", "38400", "57600", "115200", "230400", "460800", NULL }; //int WK_BaudRate(int n) //{ // if (n > (int)sizeof(iWK_BaudRates)) return 1200; // return (iWK_BaudRates[n]); //} bool WK_start_wkey_serial() { WK_bypass_serial_thread_loop = true; WK_serial.ClosePort(); if (progStatus.WK_serial_port_name == "NONE") return false; WK_serial.Device(progStatus.WK_serial_port_name); WK_serial.Baud(1200); WK_serial.Stopbits(2); WK_serial.Retries(1); WK_serial.Timeout(1);//50); WK_serial.RTSptt(false); WK_serial.DTRptt(false); WK_serial.RTSCTS(false); WK_serial.RTS(false); WK_serial.DTR(true); if (!WK_serial.OpenPort()) { LOG_ERROR("Cannot access %s", progStatus.WK_serial_port_name.c_str()); return false; } else { LOG_WKEY("\n\ Serial port:\n\ Port : %s\n\ Baud : %d\n\ Stopbits : %d\n\ Timeout : %d\n\ DTR : %s\n\ RTS/CTS : %s", progStatus.WK_serial_port_name.c_str(), WK_serial.Baud(), WK_serial.Stopbits(), WK_serial.Timeout(), WK_serial.DTR() ? "true" : "false", WK_serial.RTSCTS() ? "true" : "false"); } MilliSleep(400); // to allow WK1 to wake up return true; } #define WK_RXBUFFSIZE 512 static unsigned char WK_replybuff[WK_RXBUFFSIZE+1]; static string WK_replystr; bool WK_readByte(unsigned char &byte) { unsigned char c; int ret = WK_serial.ReadBuffer(&c, 1); byte = c; return ret; } int WK_readString() { int numread = 0; size_t n; memset(WK_replybuff, 0, WK_RXBUFFSIZE + 1); while (numread < WK_RXBUFFSIZE) { if ((n = WK_serial.ReadBuffer(&WK_replybuff[numread], WK_RXBUFFSIZE - numread)) == 0) break; numread += n; } WK_replystr.append((const char *)WK_replybuff); return numread; } int WK_sendString (string &s) { if (WK_serial.IsOpen() == false) { LOG_WKEY("command: %s", str2hex(s.data(), s.length())); return 0; } int numwrite = (int)s.length(); WK_serial.WriteBuffer((unsigned char *)s.c_str(), numwrite); if (isprint(s[0])) LOG_WKEY("Sent %d: '%s' %s", numwrite, s.c_str(), str2hex(s.data(), s.length())); else LOG_WKEY("Sent %d: %s", numwrite, str2hex(s.data(), s.length())); return numwrite; } void WK_clearSerialPort() { if (WK_serial.IsOpen() == false) return; WK_serial.FlushBuffer(); } static bool WK_thread_activated = false; void WK_exit() { if (!WK_thread_activated) return; if (progStatus.WK_online) WKCW_connect(false); pthread_mutex_lock(&WK_mutex_serial); WK_run_serial_thread = false; pthread_mutex_unlock(&WK_mutex_serial); pthread_join(WK_serial_thread, NULL); } // ===================================================================== // Winkeyer 3.0 FSK interface support // ===================================================================== // progStatus configuration parameters: // // WKFSK_baud // WKFSK_stopbits // WKFSK_ptt // WKFSK_polarity // WKFSK_sidetone // WKFSK_auto_crlf // WKFSK_diddle // WKFSK_diddle_char // WKFSK_usos // WKFSK_monitor #define wait_one_char(baud, stopbits) (int)((6 + (stopbits))*1000.0 / (baud)) void WKFSK_send_char(int ch) { unsigned char c = toupper(ch); int n = (int)(5 * wait_one_char(45.45, 2)); if (c == 0 || c == '\n') { MilliSleep(10); Fl::awake(); return; } if (c == '\r') c = '}'; { guard_lock wklock(&WK_buffer_mutex); if (c == '[' || c == ']' || c == '}' || c == '{' || c < ' ') { LOG_WKEY("%s", (c == '[' ? "[ - ptt ON" : c == ']' ? "] - ptt OFF" : c == '}' ? "} - CR/LF" : c == '{' ? "{ - left brace" : "Control code")); } else LOG_WKEY("Sending %c, %x", c, c); if (progStatus.WKFSK_monitor) WK_wait_for_char = true; WK_str_out += c; } while (WK_wait_for_char) { MilliSleep(10); Fl::awake(); n -= 10; if (n <= 0 || active_modem->get_stopflag()) { WK_wait_for_char = false; LOG_WKEY("%s", (n <= 0 ? "echo: NIL" : "xmt aborted") ); return; } } return; } void WKFSK_init() { std::string cmd = " "; LOG_WKEY("mode %d", progStatus.WKFSK_mode); LOG_WKEY("diddle %d", progStatus.WKFSK_diddle); LOG_WKEY("ptt %d", progStatus.WKFSK_ptt); LOG_WKEY("auto crlf %d", progStatus.WKFSK_auto_crlf); LOG_WKEY("monitor %d", progStatus.WKFSK_monitor); LOG_WKEY("polarity %d", progStatus.WKFSK_polarity); LOG_WKEY("baud %d", progStatus.WKFSK_baud); LOG_WKEY("stopbits %d", progStatus.WKFSK_stopbits); LOG_WKEY("sidetone %d", progStatus.WKFSK_sidetone); LOG_WKEY("diddle_char %d", progStatus.WKFSK_diddle_char); LOG_WKEY("usos %d", progStatus.WKFSK_usos); cmd[0] = ADMIN; cmd[1] = FSK_MODE; cmd[2] = (progStatus.WKFSK_mode ? 0x80 : 0x00); cmd[2] |= (progStatus.WKFSK_diddle ? 0x40 : 0x00); cmd[2] |= (progStatus.WKFSK_ptt ? 0x20 : 0x00); cmd[2] |= (progStatus.WKFSK_auto_crlf ? 0x10 : 0x00); cmd[2] |= (progStatus.WKFSK_monitor ? 0x08 : 0x00); cmd[2] |= (progStatus.WKFSK_polarity ? 0x04 : 0x00); cmd[2] |= progStatus.WKFSK_baud; cmd[3] = (progStatus.WKFSK_sidetone ? 0x10 : 0x00); cmd[3] |= (progStatus.WKFSK_stopbits ? 0x08 : 0x00); cmd[3] |= (progStatus.WKFSK_diddle_char ? 0x04 : 0x00); cmd[3] |= progStatus.WKFSK_usos; WK_send_command(cmd); } void WKCW_connect(bool start) { LOG_WKEY("WKCW_connect(%s)", (start ? "ON" : "OFF")); progStatus.WKFSK_mode = false; btn_WKFSK_connect->value(0); btn_WKCW_connect->value(0); if (!WK_thread_activated) { if (pthread_create(&WK_serial_thread, NULL, WK_serial_thread_loop, NULL)) { perror("pthread_create"); exit(EXIT_FAILURE); } WK_thread_activated = true; } if (!start) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); ReceiveText->add("\nWinKeyer disconnected\n"); progStatus.WK_online = false; return; } // shutdown and then reconnect if currently in FSK mode if (progStatus.WK_online) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); } if (WK_start_wkey_serial()) { WK_bypass_serial_thread_loop = false; open_wkeyer(); if (!WK_serial.IsOpen()) { progStatus.WK_online = false; return; } else { progStatus.WK_online = true; btn_WKCW_connect->value(1); } } WKCW_init(); } void WKFSK_connect(bool start) { LOG_WKEY("WKFSK_connect(%s)", (start ? "ON" : "OFF")); progStatus.WKFSK_mode = false; btn_WKFSK_connect->value(0); btn_WKCW_connect->value(0); if (!WK_thread_activated) { if (pthread_create(&WK_serial_thread, NULL, WK_serial_thread_loop, NULL)) { perror("pthread_create"); exit(EXIT_FAILURE); } WK_thread_activated = true; } if (!start) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); ReceiveText->add("\nWinKeyer disconnected\n"); progStatus.WK_online = false; return; } // shutdown and then reconnect if currently in CW mode if (progStatus.WK_online) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); } if (WK_start_wkey_serial()) { WK_bypass_serial_thread_loop = false; open_wkeyer(); if (!WK_serial.IsOpen()) { progStatus.WK_online = false; return; } else { progStatus.WK_online = true; } } if (progStatus.WK_version < 31) { fl_alert2("Winkeyer version must be 31 or greater"); close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); ReceiveText->add("\nWinKeyer disconnected\n"); progStatus.WK_online = false; progStatus.WKFSK_mode = false; return; } progStatus.WKFSK_mode = true; WKFSK_init(); btn_WKFSK_connect->value(1); } fldigi-4.1.06/src/trx/0000775000175000017500000000000013515625027011455 500000000000000fldigi-4.1.06/src/trx/nullmodem.cxx0000644000175000017500000000453213472116001014104 00000000000000// ---------------------------------------------------------------------------- // NULLMODEM.cxx -- NULLMODEM modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gMFSK source code // distribution. // gMFSK Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "nullmodem.h" #include "fl_digi.h" #include "ascii.h" #define null_bw 1 // a NULLMODEM and will be instantiated before the dynamic member wf, // digiscope, and fl_digi_main, the main dialog NULLMODEM:: NULLMODEM() : modem() { mode = MODE_NULL; samplerate = 8000; restart(); } NULLMODEM::~NULLMODEM() {}; void NULLMODEM::tx_init() { } void NULLMODEM::rx_init() { if (fl_digi_main) put_MODEstatus(mode); } void NULLMODEM::init() { modem::init(); rx_init(); if (digiscope) digiscope->mode(Digiscope::SCOPE); } void NULLMODEM::restart() { if (wf) set_bandwidth(null_bw); } //===================================================================== // receive processing //===================================================================== int NULLMODEM::rx_process(const double *buf, int len) { return 0; } //===================================================================== // transmit processing //===================================================================== int NULLMODEM::tx_process() { modem::tx_process(); MilliSleep(10); if (!fl_digi_main) { return 0; } int c = get_tx_char(); if (c == GET_TX_CHAR_ETX) { stopflag = false; return -1; } if ( stopflag ) { stopflag = false; return -1; } return 0; } fldigi-4.1.06/src/trx/test_signal.cxx0000644000175000017500000000213013472116001014414 00000000000000// ---------------------------------------------------------------------------- // test_signal.cxx // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "test_signal.h" Fl_Double_Window* test_signal_window = (Fl_Double_Window *)0; void show_testdialog(void) { if (!test_signal_window) test_signal_window = make_testdialog(); test_signal_window->show(); } fldigi-4.1.06/src/trx/tune.cxx0000644000175000017500000001146613472116001013067 00000000000000// ---------------------------------------------------------------------------- // tune.cxx -- create a single sinewave output with controlled start/end shape // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "sound.h" #include "confdialog.h" #include "test_signal.h" namespace xmttune { // use same wave shaping for tune key down / key up as for the CW tx_process // produces a 4 msec leading / trailing edge #define KNUM 32 // keydown wave shape double kdshape[KNUM] = { 0.00240750255310301, 0.00960708477768751, 0.02152941088003600, 0.03805966253618680, 0.05903864465505320, 0.08426431851158830, 0.11349374748686800, 0.14644543667658500, 0.18280204383628200, 0.22221343555548300, 0.26430005922814900, 0.30865659834558700, 0.35485587590940700, 0.40245296837259500, 0.45098949048925500, 0.49999800980765500, 0.54900654829266300, 0.59754312772456200, 0.64514031509964400, 0.69133972425796200, 0.73569643038517400, 0.77778325487450100, 0.81719487928327800, 0.85355174876454100, 0.88650372738152000, 0.91573347010241700, 0.94095947900139100, 0.96193881423287900, 0.97846943367117300, 0.99039213868324900, 0.99759210729604500, 0.99999999999295900 }; // keyup wave shape double kushape[KNUM] = { 0.99999999999295900, 0.99759210729604500, 0.99039213868324900, 0.97846943367117300, 0.96193881423287900, 0.94095947900139100, 0.91573347010241700, 0.88650372738152000, 0.85355174876454100, 0.81719487928327800, 0.77778325487450100, 0.73569643038517400, 0.69133972425796200, 0.64514031509964400, 0.59754312772456200, 0.54900654829266300, 0.49999800980765500, 0.45098949048925500, 0.40245296837259500, 0.35485587590940700, 0.30865659834558700, 0.26430005922814900, 0.22221343555548300, 0.18280204383628200, 0.14644543667658500, 0.11349374748686800, 0.08426431851158830, 0.05903864465505320, 0.03805966253618680, 0.02152941088003600, 0.00960708477768751, 0.00240750255310301 }; #define BUFLEN 512 double phaseacc = 0.0; double phaseincr = 0.0; double pttacc = 0.0; double outbuf[BUFLEN]; double pttbuf[BUFLEN]; //=========================================================================== inline double nco() { phaseacc += phaseincr; if (phaseacc > TWOPI) phaseacc -= TWOPI; return cos(phaseacc); } inline double pttnco() { pttacc += TWOPI * 1000 / active_modem->get_samplerate(); if (pttacc > TWOPI) pttacc -= TWOPI; return sin(pttacc); } //===================================================================== //===================================================================== void keydown(double freq, SoundBase *scard) { int i; phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < KNUM; i++){ outbuf[i] = nco() * kdshape[i]; pttbuf[i] = pttnco(); } for (; i < BUFLEN; i++) { outbuf[i] = nco(); pttbuf[i] = pttnco(); } if ((active_modem == cw_modem) && progdefaults.QSK) { active_modem->ModulateStereo( outbuf, pttbuf, BUFLEN, false); } else { active_modem->ModulateXmtr(outbuf, BUFLEN); } } //===================================================================== void keyup(double freq, SoundBase *scard) { int i; phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < KNUM; i++) { outbuf[i] = nco() * kushape[i]; pttbuf[i] = pttnco(); } for (; i < BUFLEN; i++) { outbuf[i] = 0.0; pttbuf[i] = pttnco(); } if ((active_modem == cw_modem) && progdefaults.QSK) { active_modem->ModulateStereo( outbuf, pttbuf, BUFLEN, false); } else { active_modem->ModulateXmtr(outbuf, BUFLEN); } } //===================================================================== void tune(double freq, SoundBase *scard) { int i; if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) freq += ctrl_freq_offset->value(); phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < BUFLEN; i++) { outbuf[i] = nco(); pttbuf[i] = pttnco(); } if ((active_modem == cw_modem) && progdefaults.QSK) { active_modem->ModulateStereo( outbuf, pttbuf, BUFLEN, false); } else { active_modem->ModulateXmtr(outbuf, BUFLEN); } } }; // namespace tune fldigi-4.1.06/src/trx/trx.cxx0000664000175000017500000005767413507401434012754 00000000000000// ---------------------------------------------------------------------------- // trx.cxx -- Main transmit/receive control loop / thread // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "trx.h" #include "main.h" #include "fl_digi.h" #include "ascii.h" #include "misc.h" #include "configuration.h" #include "status.h" #include "dtmf.h" #include "soundconf.h" #include "ringbuffer.h" #include "qrunner.h" #include "debug.h" #include "nullmodem.h" #include "macros.h" #include "rigsupport.h" #include "psm/psm.h" #include "icons.h" #include "fft-monitor.h" extern fftmon *fft_modem; #include "spectrum_viewer.h" #if BENCHMARK_MODE # include "benchmark.h" #endif LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; void trx_reset_loop(); void trx_start_modem_loop(); void trx_receive_loop(); void trx_transmit_loop(); void trx_tune_loop(); static void trx_signal_state(void); //#define DEBUG /* ---------------------------------------------------------------------- */ static sem_t* trx_sem; static pthread_t trx_thread; state_t trx_state; modem *active_modem = 0; cRsId *ReedSolomon = 0; cDTMF *dtmf = 0; SoundBase *RXscard = 0; bool RXsc_is_open = false; bool TXsc_is_open = false; SoundBase *TXscard = 0; static int current_RXsamplerate = 0; static int current_TXsamplerate = 0; static int _trx_tune; // Ringbuffer for the audio "history". A pointer into this buffer // is also passed to the waterfall signal drawing routines. #define NUMMEMBUFS 1024 static ringbuffer trxrb(ceil2(NUMMEMBUFS * SCBLOCKSIZE)); static float fbuf[SCBLOCKSIZE]; bool bHistory = false; bool bHighSpeed = false; static double hsbuff[SCBLOCKSIZE]; static bool trxrunning = false; extern bool trx_inhibit; bool rx_only = false; #include "tune.cxx" //============================================================================= // Draws the xmit data one WFBLOCKSIZE-sized block at a time static void trx_xmit_wfall_draw(int samplerate) { ENSURE_THREAD(TRX_TID); ringbuffer::vector_type rv[2]; rv[0].buf = 0; rv[1].buf = 0; #define block_read_(vec_) \ while (vec_.len >= WFBLOCKSIZE) { \ wf->sig_data(vec_.buf, samplerate); \ REQ(&waterfall::handle_sig_data, wf); \ vec_.len -= WFBLOCKSIZE; \ vec_.buf += WFBLOCKSIZE; \ trxrb.read_advance(WFBLOCKSIZE); \ } trxrb.get_rv(rv); block_read_(rv[0]); // read blocks from the first vector if (rv[0].len + rv[1].len < WFBLOCKSIZE) return; if (rv[0].len == 0) block_read_(rv[1]); #undef block_read_ // read non-contiguous data into tmp buffer so that we can // still draw it one block at a time if (unlikely(trxrb.read_space() >= WFBLOCKSIZE)) { double buf[WFBLOCKSIZE]; do { trxrb.read(buf, WFBLOCKSIZE); wf->sig_data(buf, samplerate); REQ(&waterfall::handle_sig_data, wf); } while (trxrb.read_space() >= WFBLOCKSIZE); } } // Called by trx_trx_transmit_loop() to handle data that may be left in the // ringbuffer when we stop transmitting. Will pad with zeroes to a multiple of // WFBLOCKSIZE. static void trx_xmit_wfall_end(int samplerate) { ENSURE_THREAD(TRX_TID); size_t pad = WFBLOCKSIZE - trxrb.read_space() % WFBLOCKSIZE; if (pad == WFBLOCKSIZE) // rb empty or multiple of WFBLOCKSIZE return; ringbuffer::vector_type wv[2]; wv[0].buf = wv[1].buf = 0; trxrb.get_wv(wv, pad); assert(wv[0].len + wv[1].len == pad); if (likely(wv[0].len)) { // fill first vector, write rest to second vector memset(wv[0].buf, 0, wv[0].len * sizeof(*wv[0].buf)); if (pad > wv[0].len) memset(wv[1].buf, 0, (pad - wv[0].len) * sizeof(*wv[1].buf)); } else // all write space is in the second write vector memset(wv[1].buf, 0, pad * sizeof(*wv[1].buf)); trxrb.write_advance(pad); trx_xmit_wfall_draw(samplerate); } // Copy buf to the ringbuffer if it has enough space. Queue a waterfall // request whenever there are at least WFBLOCKSIZE samples to draw. void trx_xmit_wfall_queue(int samplerate, const double* buf, size_t len) { ENSURE_THREAD(TRX_TID); ringbuffer::vector_type wv[2]; wv[0].buf = wv[1].buf = 0; trxrb.get_wv(wv, len); if (unlikely(wv[0].len + wv[1].len < len)) // not enough space return; #define write_(vec_, len_) \ for (size_t i = 0; i < len_; i++) \ vec_[i] = buf[i] * progdefaults.TxMonitorLevel; size_t n = MIN(wv[0].len, len); write_(wv[0].buf, n); if (len > n) { // write the rest to the second vector buf += n; n = len - n; write_(wv[1].buf, n); } #undef write_ trxrb.write_advance(len); if (trxrb.read_space() >= WFBLOCKSIZE) trx_xmit_wfall_draw(samplerate); } //============================================================================= void trx_trx_receive_loop() { size_t numread; assert(powerof2(SCBLOCKSIZE)); if (unlikely(!active_modem)) { MilliSleep(10); return; } #if BENCHMARK_MODE do_benchmark(); trx_state = STATE_ENDED; return; #endif if (!RXscard) { MilliSleep(10); return; } try { if (!progdefaults.is_full_duplex || !RXsc_is_open || current_RXsamplerate != active_modem->get_samplerate() ) { current_RXsamplerate = active_modem->get_samplerate(); if (RXscard) { RXscard->Close(O_RDONLY); RXscard->Open(O_RDONLY, current_RXsamplerate); REQ(sound_update, progdefaults.btnAudioIOis); RXsc_is_open = true; } } } catch (const SndException& e) { LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 5); if (RXscard) RXscard->Close(); RXsc_is_open = false; current_RXsamplerate = 0; // if (e.error() == EBUSY && progdefaults.btnAudioIOis == SND_IDX_PORT) { if (progdefaults.btnAudioIOis == SND_IDX_PORT) { sound_close(); sound_init(); } MilliSleep(1000); return; } active_modem->rx_init(); ringbuffer::vector_type rbvec[2]; rbvec[0].buf = rbvec[1].buf = 0; if (RXscard) RXscard->flush(O_RDONLY); while (1) { try { numread = 0; if (RXscard) { while (numread < SCBLOCKSIZE && trx_state == STATE_RX) numread += RXscard->Read(fbuf + numread, SCBLOCKSIZE - numread); } if (numread > SCBLOCKSIZE) { LOG_ERROR("numread error %lu", (unsigned long) numread); numread = SCBLOCKSIZE; } if (bHighSpeed) { for (size_t i = 0; i < numread; i++) hsbuff[i] = fbuf[i]; } else { if (trxrb.write_space() == 0) // diRXscard some old data trxrb.read_advance(SCBLOCKSIZE); size_t room = trxrb.get_wv(rbvec, numread); if (room < numread) { LOG_ERROR("trxrb.get_wv(rbvec) = %d, numread = %d", (int)room, (int)numread); } else { // convert to double and write to rb for (size_t i = 0; i < numread; i++) rbvec[0].buf[i] = fbuf[i]; } } } catch (const SndException& e) { if (RXscard) RXscard->Close(); RXsc_is_open = false; LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 5); MilliSleep(10); return; } if (trx_state != STATE_RX) break; if (trx_inhibit) continue; if (bHighSpeed) { bool afc = progStatus.afconoff; progStatus.afconoff = false; QRUNNER_DROP(true); if (progdefaults.rsid) ReedSolomon->receive(fbuf, numread); active_modem->HistoryON(true); active_modem->rx_process(hsbuff, numread); QRUNNER_DROP(false); progStatus.afconoff = afc; active_modem->HistoryON(false); } else { trxrb.write_advance(numread); wf->sig_data(rbvec[0].buf, current_RXsamplerate); REQ(&waterfall::handle_sig_data, wf); if (!bHistory) { if (fft_modem && spectrum_viewer->visible()) fft_modem->rx_process(rbvec[0].buf, numread); active_modem->rx_process(rbvec[0].buf, numread); if (progdefaults.rsid) ReedSolomon->receive(fbuf, numread); dtmf->receive(fbuf, numread); } else { bool afc = progStatus.afconoff; progStatus.afconoff = false; QRUNNER_DROP(true); active_modem->HistoryON(true); trxrb.get_rv(rbvec); if (rbvec[0].len) active_modem->rx_process(rbvec[0].buf, rbvec[0].len); if (rbvec[1].len) active_modem->rx_process(rbvec[1].buf, rbvec[1].len); QRUNNER_DROP(false); progStatus.afconoff = afc; bHistory = false; active_modem->HistoryON(false); } } } if (trx_state == STATE_RESTART) return; if (!progdefaults.is_full_duplex ) { if (RXscard) RXscard->Close(O_RDONLY); RXsc_is_open = false; } } //============================================================================= void trx_trx_transmit_loop() { if (rx_only) return; if (!TXscard) { MilliSleep(10); return; } if (active_modem) { try { if (current_TXsamplerate != active_modem->get_samplerate() || !TXsc_is_open) { current_TXsamplerate = active_modem->get_samplerate(); if (TXscard) { TXscard->Close(O_WRONLY); TXscard->Open(O_WRONLY, current_TXsamplerate); TXsc_is_open = true; } } } catch (const SndException& e) { LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 1); current_TXsamplerate = 0; MilliSleep(10); return; } if ((active_modem != ssb_modem) && (active_modem != anal_modem) && !active_modem->XMLRPC_CPS_TEST && !PERFORM_CPS_TEST ) { push2talk->set(true); REQ(&waterfall::set_XmtRcvBtn, wf, true); } active_modem->tx_init(); if ( ReedSolomon->assigned(active_modem->get_mode()) && (progdefaults.TransmitRSid || progStatus.n_rsids != 0)) { if (progStatus.n_rsids < 0) { for (int i = 0; i > progStatus.n_rsids; i--) { ReedSolomon->send(true); MilliSleep(200); } } else if ( progStatus.n_rsids > 0 ) { for (int i = 0; i < progStatus.n_rsids; i++) { ReedSolomon->send(true); MilliSleep(200); } MilliSleep(200); if (progStatus.n_rsids == 1) progStatus.n_rsids = 0; } else ReedSolomon->send(true); } if (progStatus.n_rsids >= 0) { active_modem->tx_sample_count = 0; active_modem->tx_sample_rate = active_modem->get_samplerate(); while (trx_state == STATE_TX) { try { if (!progdefaults.DTMFstr.empty()) dtmf->send(); if (active_modem->tx_process() < 0) if (trx_state != STATE_ABORT) trx_state = STATE_RX; } catch (const SndException& e) { if (TXscard) TXscard->Close(); TXsc_is_open = false; LOG_ERROR("%s", e.what()); put_status(e.what(), 5); current_TXsamplerate = 0; MilliSleep(10); return; } } } else if (trx_state != STATE_ABORT && trx_state != STATE_RESTART) trx_state = STATE_RX; if (ReedSolomon->assigned(active_modem->get_mode()) && progdefaults.TransmitRSid && progdefaults.rsid_post && progStatus.n_rsids >= 0) ReedSolomon->send(false); progStatus.n_rsids = 0; trx_xmit_wfall_end(current_TXsamplerate); if (TXscard) TXscard->flush(); if (trx_state == STATE_RX) { if (!progdefaults.is_full_duplex) { if (TXscard) TXscard->Close(O_WRONLY); TXsc_is_open = false; } } } else MilliSleep(10); push2talk->set(false); REQ(&waterfall::set_XmtRcvBtn, wf, false); psm_transmit_ended(PSM_STOP); if (progStatus.timer) REQ(startMacroTimer); WriteARQ(0x06); } //============================================================================= void trx_tune_loop() { if (rx_only) return; if (!TXscard) { MilliSleep(10); return; } if (active_modem) { try { if (!progdefaults.is_full_duplex || !TXsc_is_open || current_TXsamplerate != active_modem->get_samplerate() ) { current_TXsamplerate = active_modem->get_samplerate(); if (TXscard) TXscard->Close(O_WRONLY); if (TXscard) { TXscard->Open(O_WRONLY, current_TXsamplerate); TXsc_is_open = true; } } } catch (const SndException& e) { LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 1); MilliSleep(10); current_TXsamplerate = 0; return; } push2talk->set(true); active_modem->tx_init(); try { if ((active_modem->get_mode() == MODE_CW) && (use_nanoIO || progStatus.WK_online)) { if (use_nanoIO) nanoCW_tune(1); else WK_tune(1); REQ(&waterfall::set_XmtRcvBtn, wf, true); while (trx_state == STATE_TUNE) MilliSleep(10); if (use_nanoIO) nanoCW_tune(0); else WK_tune(0); } else { while (trx_state == STATE_TUNE) { if (_trx_tune == 0) { REQ(&waterfall::set_XmtRcvBtn, wf, true); xmttune::keydown(active_modem->get_txfreq_woffset(), TXscard); _trx_tune = 1; } else xmttune::tune(active_modem->get_txfreq_woffset(), TXscard); } xmttune::keyup(active_modem->get_txfreq_woffset(), TXscard); } } catch (const SndException& e) { if (TXscard) TXscard->Close(); TXsc_is_open = false; LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 5); MilliSleep(10); current_TXsamplerate = 0; return; } if (TXscard) TXscard->flush(); if (trx_state == STATE_RX) { if (!progdefaults.is_full_duplex) { if (TXscard) TXscard->Close(O_WRONLY); TXsc_is_open = false; } } _trx_tune = 0; } else MilliSleep(10); push2talk->set(false); REQ(&waterfall::set_XmtRcvBtn, wf, false); } //============================================================================= void *trx_loop(void *args) { SET_THREAD_ID(TRX_TID); state_t old_state = STATE_NOOP; for (;;) { if (unlikely(old_state != trx_state)) { old_state = trx_state; if (trx_state == STATE_TX || trx_state == STATE_TUNE) trxrb.reset(); trx_signal_state(); } LOG_DEBUG("trx state %s", trx_state == STATE_ABORT ? "abort" : trx_state == STATE_ENDED ? "ended" : trx_state == STATE_RESTART ? "restart" : trx_state == STATE_NEW_MODEM ? "new modem" : trx_state == STATE_TX ? "tx" : trx_state == STATE_TUNE ? "tune" : trx_state == STATE_RX ? "rx" : "unknown"); switch (trx_state) { case STATE_ABORT: delete RXscard; RXscard = 0; delete TXscard; TXscard = 0; trx_state = STATE_ENDED; // fall through case STATE_ENDED: REQ(set_flrig_ptt, 0); stop_deadman(); return 0; case STATE_RESTART: REQ(set_flrig_ptt, 0); stop_deadman(); trx_reset_loop(); break; case STATE_NEW_MODEM: REQ(set_flrig_ptt, 0); trx_start_modem_loop(); break; case STATE_TX: REQ(set_flrig_ptt, 1); start_deadman(); trx_trx_transmit_loop(); break; case STATE_TUNE: REQ(set_flrig_ptt, 1); start_deadman(); trx_tune_loop(); break; case STATE_RX: REQ(set_flrig_ptt, 0); stop_deadman(); trx_trx_receive_loop(); break; default: LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "trx in bad state %d\n", trx_state); MilliSleep(100); } } } //============================================================================= static modem* new_modem; static int new_freq; void trx_start_modem_loop() { if (new_modem == active_modem) { if (new_freq > 0 && !progdefaults.retain_freq_lock) active_modem->set_freq(new_freq); active_modem->restart(); trx_state = STATE_RX; if (progdefaults.show_psm_btn && progStatus.kpsql_enabled && progStatus.psm_use_histogram) psm_reset_histogram(); return; } modem* old_modem = active_modem; new_modem->init(); active_modem = new_modem; if (new_freq > 0 && !progdefaults.retain_freq_lock) active_modem->set_freq(new_freq); trx_state = STATE_RX; REQ(&waterfall::opmode, wf); REQ(set599); if (old_modem) { *mode_info[old_modem->get_mode()].modem = 0; delete old_modem; } } //============================================================================= void trx_start_modem(modem* m, int f) { new_modem = m; new_freq = f; trx_state = STATE_NEW_MODEM; } //============================================================================= static string reset_loop_msg; void show_reset_loop_alert() { progdefaults.btnAudioIOis = SND_IDX_NULL; // file i/o sound_update(progdefaults.btnAudioIOis); if (btnAudioIO[0]) { fl_alert2("%s", reset_loop_msg.c_str()); btnAudioIO[0]->value(0); btnAudioIO[1]->value(0); btnAudioIO[2]->value(0); btnAudioIO[3]->value(1); } } void trx_reset_loop() { if (RXscard) { RXscard->Close(); RXsc_is_open = false; delete RXscard; RXscard = 0; } if (TXscard) { TXscard->Close(); TXsc_is_open = false; delete TXscard; TXscard = 0; } switch (progdefaults.btnAudioIOis) { #if USE_OSS case SND_IDX_OSS: try { RXscard = new SoundOSS(scDevice[0].c_str()); if (!RXscard) break; RXscard->Open(O_RDONLY, current_RXsamplerate = 8000); RXsc_is_open = true; TXscard = new SoundOSS(scDevice[0].c_str()); if (!TXscard) break; TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); TXsc_is_open = true; } catch (...) { reset_loop_msg = "OSS open failure"; REQ(show_reset_loop_alert); } break; #endif #if USE_PORTAUDIO /// All of this very convoluted logic is needed to allow a Linux user /// to switch from PulseAudio to PortAudio. PulseAudio does not immediately /// release the sound card resources after closing the pulse audio object. case SND_IDX_PORT: { RXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); TXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); unsigned long tm1 = zmsec(); int RXret = 0, TXret = 0; int i; RXsc_is_open = false; TXsc_is_open = false; for (i = 0; i < 10; i++) { // try 10 times try { if (!RXret) RXret = RXscard->Open(O_RDONLY, current_RXsamplerate = 8000); if (progdefaults.is_full_duplex) { if (!TXret) TXret = TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); } if (RXret) RXsc_is_open = true; if (TXret) TXsc_is_open = true; break; } catch (const SndException& e) { MilliSleep(50); Fl::awake(); } } unsigned long tm = zmsec() - tm1; if (tm < 0) tm = 0; if (i == 10) { if (RXscard) delete RXscard; if (TXscard) delete TXscard; RXscard = 0; TXscard = 0; LOG_PERROR("Port Audio device not available"); reset_loop_msg = "Port Audio device not available"; REQ(show_reset_loop_alert); } else { LOG_INFO ("Port Audio device available after %0.1f seconds", tm / 1000.0 ); } break; } #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: try { RXscard = new SoundPulse(scDevice[0].c_str()); if (!RXscard) break; RXscard->Open(O_RDONLY, current_RXsamplerate = 8000); RXsc_is_open = true; TXscard = new SoundPulse(scDevice[0].c_str()); if (!TXscard) break; // needed to open playback device in PaVolumeControl TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); double buffer[1024]; for (int i = 0; i < 1024; buffer[i++] = 0); TXscard->Write_stereo(buffer, buffer, 1024); if (progdefaults.is_full_duplex) TXsc_is_open = true; else { TXscard->Close(); TXsc_is_open = false; } } catch (const SndException& e) { LOG_ERROR("%s", e.what()); if (RXscard) delete RXscard; if (TXscard) delete TXscard; RXscard = 0; TXscard = 0; reset_loop_msg = "Pulse Audio error:\n"; reset_loop_msg.append(e.what()); reset_loop_msg.append("\n\nIs the server running?\nClose fldigi and execute 'pulseaudio --start'"); REQ(show_reset_loop_alert); } break; #endif case SND_IDX_NULL: RXscard = new SoundNull; TXscard = new SoundNull; current_RXsamplerate = current_TXsamplerate = 0; break; default: abort(); } trx_state = STATE_RX; } //============================================================================= void trx_reset(void) { trx_state = STATE_RESTART; } //============================================================================= void trx_start(void) { #if !BENCHMARK_MODE if (trxrunning) { LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "trx already running!"); return; } if (RXscard) { delete RXscard; RXscard = 0; } if (TXscard) { delete TXscard; TXscard = 0; } if (ReedSolomon) delete ReedSolomon; if (dtmf) delete dtmf; switch (progdefaults.btnAudioIOis) { #if USE_OSS case SND_IDX_OSS: RXscard = new SoundOSS(scDevice[0].c_str()); TXscard = new SoundOSS(scDevice[0].c_str()); break; #endif #if USE_PORTAUDIO case SND_IDX_PORT: RXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); TXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); break; #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: try { RXscard = new SoundPulse(scDevice[0].c_str()); if (!RXscard) break; TXscard = new SoundPulse(scDevice[0].c_str()); if (!TXscard) break; // needed to open playback device in PaVolumeControl TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); double buffer[1024]; for (int i = 0; i < 1024; buffer[i++] = 0); TXscard->Write_stereo(buffer, buffer, 1024); if (progdefaults.is_full_duplex) TXsc_is_open = true; else { TXscard->Close(); TXsc_is_open = false; } } catch (const SndException& e) { LOG_ERROR("%s", e.what()); if (RXscard) delete RXscard; if (TXscard) delete TXscard; RXscard = 0; TXscard = 0; reset_loop_msg = "Pulse Audio error:\n"; reset_loop_msg.append(e.what()); reset_loop_msg.append("\n\nIs the server running?"); REQ(show_reset_loop_alert); } break; #endif case SND_IDX_NULL: RXscard = new SoundNull; TXscard = new SoundNull; break; default: abort(); } current_RXsamplerate = current_TXsamplerate = 0; ReedSolomon = new cRsId; dtmf = new cDTMF; #endif // !BENCHMARK_MODE #if USE_NAMED_SEMAPHORES char sname[32]; snprintf(sname, sizeof(sname), "trx-%u-%s", getpid(), PACKAGE_TARNAME); if ((trx_sem = sem_open(sname, O_CREAT | O_EXCL, 0600, 0)) == (sem_t*)SEM_FAILED) { LOG_PERROR("sem_open"); abort(); } # if HAVE_SEM_UNLINK if (sem_unlink(sname) == -1) { LOG_PERROR("sem_unlink"); abort(); } # endif #else trx_sem = new sem_t; if (sem_init(trx_sem, 0, 0) == -1) { LOG_PERROR("sem_init"); abort(); } #endif trx_state = STATE_RX; _trx_tune = 0; active_modem = 0; if (pthread_create(&trx_thread, NULL, trx_loop, NULL) < 0) { LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "pthread_create failed"); trxrunning = false; exit(1); } trxrunning = true; } //============================================================================= void trx_close() { LOG_INFO("%s", "closing trx thread"); int count = 1000; active_modem->set_stopflag(true); while (trx_state != STATE_RX && count--) MilliSleep(10); if (trx_state != STATE_RX) { LOG_INFO("%s", "trx_state != STATE_RX"); exit(1); } count = 1000; trx_state = STATE_ABORT; while (trx_state != STATE_ENDED && count--) MilliSleep(10); if (trx_state != STATE_ENDED) { LOG_INFO("%s", "trx_state != STATE_ENDED"); exit(2); } #if USE_NAMED_SEMAPHORES if (sem_close(trx_sem) == -1) LOG_PERROR("sem_close"); #else if (sem_destroy(trx_sem) == -1) LOG_PERROR("sem_destroy"); delete trx_sem; #endif if (RXscard) { delete RXscard; RXscard = 0; } LOG_INFO("%s", "trx thread closed"); } //============================================================================= void trx_transmit_psm(void) { trx_state = STATE_TX; }; void trx_transmit(void) { if (progdefaults.show_psm_btn && progStatus.kpsql_enabled && (!PERFORM_CPS_TEST || !active_modem->XMLRPC_CPS_TEST)) psm_transmit(); else trx_state = STATE_TX; } void trx_tune(void) { trx_state = STATE_TUNE; } void trx_receive(void) { trx_state = STATE_RX; } //============================================================================= void trx_wait_state(void) { ENSURE_NOT_THREAD(TRX_TID); sem_wait(trx_sem); } static void trx_signal_state(void) { ENSURE_THREAD(TRX_TID); sem_post(trx_sem); } fldigi-4.1.06/src/trx/modem.cxx0000664000175000017500000011254213507402064013222 00000000000000// ---------------------------------------------------------------------------- // modem.cxx - modem class - base for all modems // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "misc.h" #include "filters.h" #include "confdialog.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "arq_io.h" #include "configuration.h" #include "waterfall.h" #include "qrunner.h" #include "macros.h" #include "testsigs.h" #include "test_signal.h" #include "status.h" #include "debug.h" using namespace std; modem *null_modem = 0; modem *cw_modem = 0; modem *mfsk8_modem = 0; modem *mfsk16_modem = 0; modem *mfsk32_modem = 0; // experimental modes modem *mfsk4_modem = 0; modem *mfsk11_modem = 0; modem *mfsk22_modem = 0; modem *mfsk31_modem = 0; modem *mfsk64_modem = 0; modem *mfsk128_modem = 0; modem *mfsk64l_modem = 0; modem *mfsk128l_modem = 0; modem *wefax576_modem = 0; modem *wefax288_modem = 0; modem *navtex_modem = 0; modem *sitorb_modem = 0; modem *mt63_500S_modem = 0; modem *mt63_500L_modem = 0; modem *mt63_1000S_modem = 0; modem *mt63_1000L_modem = 0; modem *mt63_2000S_modem = 0; modem *mt63_2000L_modem = 0; modem *feld_modem = 0; modem *feld_slowmodem = 0; modem *feld_x5modem = 0; modem *feld_x9modem = 0; modem *feld_FMmodem = 0; modem *feld_FM105modem = 0; modem *feld_80modem = 0; modem *feld_CMTmodem = 0; modem *psk31_modem = 0; modem *psk63_modem = 0; modem *psk63f_modem = 0; modem *psk125_modem = 0; modem *psk250_modem = 0; modem *psk500_modem = 0; modem *psk1000_modem = 0; modem *qpsk31_modem = 0; modem *qpsk63_modem = 0; modem *qpsk125_modem = 0; modem *qpsk250_modem = 0; modem *qpsk500_modem = 0; modem *_8psk125_modem = 0; modem *_8psk250_modem = 0; modem *_8psk500_modem = 0; modem *_8psk1000_modem = 0; modem *_8psk1200_modem = 0; modem *_8psk1333_modem = 0; modem *_8psk125fl_modem = 0; modem *_8psk125f_modem = 0; modem *_8psk250fl_modem = 0; modem *_8psk250f_modem = 0; modem *_8psk500f_modem = 0; modem *_8psk1000f_modem = 0; modem *_8psk1200f_modem = 0; modem *_8psk1333f_modem = 0; modem *psk125r_modem = 0; modem *psk250r_modem = 0; modem *psk500r_modem = 0; modem *psk1000r_modem = 0; modem *psk800_c2_modem = 0; modem *psk800r_c2_modem = 0; modem *psk1000_c2_modem = 0; modem *psk1000r_c2_modem = 0; modem *psk63r_c4_modem = 0; modem *psk63r_c5_modem = 0; modem *psk63r_c10_modem = 0; modem *psk63r_c20_modem = 0; modem *psk63r_c32_modem = 0; modem *psk125r_c4_modem = 0; modem *psk125r_c5_modem = 0; modem *psk125r_c10_modem = 0; modem *psk125_c12_modem = 0; modem *psk125r_c12_modem = 0; modem *psk125r_c16_modem = 0; modem *psk250r_c2_modem = 0; modem *psk250r_c3_modem = 0; modem *psk250r_c5_modem = 0; modem *psk250_c6_modem = 0; modem *psk250r_c6_modem = 0; modem *psk250r_c7_modem = 0; modem *psk500_c2_modem = 0; modem *psk500_c4_modem = 0; modem *psk500r_c2_modem = 0; modem *psk500r_c3_modem = 0; modem *psk500r_c4_modem = 0; modem *olivia_modem = 0; modem *olivia_4_125_modem = 0; modem *olivia_4_250_modem = 0; modem *olivia_4_500_modem = 0; modem *olivia_4_1000_modem = 0; modem *olivia_4_2000_modem = 0; modem *olivia_8_125_modem = 0; modem *olivia_8_250_modem = 0; modem *olivia_8_500_modem = 0; modem *olivia_8_1000_modem = 0; modem *olivia_8_2000_modem = 0; modem *olivia_16_500_modem = 0; modem *olivia_16_1000_modem = 0; modem *olivia_16_2000_modem = 0; modem *olivia_32_1000_modem = 0; modem *olivia_32_2000_modem = 0; modem *olivia_64_500_modem = 0; modem *olivia_64_1000_modem = 0; modem *olivia_64_2000_modem = 0; modem *contestia_modem = 0; modem *contestia_4_125_modem = 0; modem *contestia_4_250_modem = 0; modem *contestia_4_500_modem = 0; modem *contestia_4_1000_modem = 0; modem *contestia_4_2000_modem = 0; modem *contestia_8_125_modem = 0; modem *contestia_8_250_modem = 0; modem *contestia_8_500_modem = 0; modem *contestia_8_1000_modem = 0; modem *contestia_8_2000_modem = 0; modem *contestia_16_500_modem = 0; modem *contestia_16_1000_modem = 0; modem *contestia_16_2000_modem = 0; modem *contestia_32_1000_modem = 0; modem *contestia_32_2000_modem = 0; modem *contestia_64_500_modem = 0; modem *contestia_64_1000_modem = 0; modem *contestia_64_2000_modem = 0; modem *rtty_modem = 0; modem *pkt_modem = 0; modem *thormicro_modem = 0; modem *thor4_modem = 0; modem *thor5_modem = 0; modem *thor8_modem = 0; modem *thor11_modem = 0; modem *thor16_modem = 0; modem *thor22_modem = 0; modem *thor25x4_modem = 0; modem *thor50x1_modem = 0; modem *thor50x2_modem = 0; modem *thor100_modem = 0; modem *fsq_modem = 0; modem *ifkp_modem = 0; modem *dominoexmicro_modem = 0; modem *dominoex4_modem = 0; modem *dominoex5_modem = 0; modem *dominoex8_modem = 0; modem *dominoex11_modem = 0; modem *dominoex16_modem = 0; modem *dominoex22_modem = 0; modem *dominoex44_modem = 0; modem *dominoex88_modem = 0; modem *throb1_modem = 0; modem *throb2_modem = 0; modem *throb4_modem = 0; modem *throbx1_modem = 0; modem *throbx2_modem = 0; modem *throbx4_modem = 0; modem *wwv_modem = 0; modem *anal_modem = 0; modem *ssb_modem = 0; double modem::frequency = 1000; double modem::tx_frequency = 1000; bool modem::freqlock = false; // For xml socket command unsigned long modem::tx_sample_count = 0; unsigned int modem::tx_sample_rate = 0; bool modem::XMLRPC_CPS_TEST = false; modem::modem() { scptr = 0; if (wf) frequency = tx_frequency = wf->Carrier(); else frequency = tx_frequency = 1000; sigsearch = 0; if (wf) { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; } else reverse = false; historyON = false; cap = CAP_RX | CAP_TX; PTTphaseacc = 0.0; s2n_ncount = s2n_sum = s2n_sum2 = s2n_metric = 0.0; s2n_valid = false; bandwidth = 0.0; } // modem types CW and RTTY do not use the base init() void modem::init() { stopflag = false; if (!wf) return; bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; } void modem::set_freq(double freq) { frequency = CLAMP( freq, progdefaults.LowFreqCutoff + bandwidth / 2, progdefaults.HighFreqCutoff - bandwidth / 2); if (freqlock == false) tx_frequency = frequency; REQ(put_freq, frequency); } void modem::set_freqlock(bool on) { freqlock = on; set_freq(frequency); } double modem::get_txfreq(void) const { if (unlikely(!(cap & CAP_TX))) return 0; else if (mailserver && progdefaults.PSKmailSweetSpot) return progdefaults.PSKsweetspot; if (get_mode() == MODE_FSQ) return 1500; return tx_frequency; } double modem::get_txfreq_woffset(void) const { if (mailserver && progdefaults.PSKmailSweetSpot) return (progdefaults.PSKsweetspot - progdefaults.TxOffset); if (get_mode() == MODE_FSQ) return (1500 - progdefaults.TxOffset); if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) return tx_frequency + ctrl_freq_offset->value(); return (tx_frequency - progdefaults.TxOffset); } void modem::set_bandwidth(double bw) { bandwidth = bw; put_Bandwidth((int)bandwidth); } void modem::set_reverse(bool on) { if (likely(wf)) reverse = on ^ (!wf->USB()); else reverse = false; } void modem::set_metric(double m) { metric = m; } extern void callback_set_metric(double metric); void modem::display_metric(double m) { set_metric(m); if (!progStatus.kpsql_enabled) REQ(callback_set_metric, m); } bool modem::get_cwTrack() { return cwTrack; } void modem::set_cwTrack(bool b) { cwTrack = b; } bool modem::get_cwLock() { return cwLock; } void modem::set_cwLock(bool b) { cwLock = b; } double modem::get_cwRcvWPM() { return cwRcvWPM; } double modem::get_cwXmtWPM() { return cwXmtWPM; } void modem::set_cwXmtWPM(double wpm) { cwXmtWPM = wpm; } void modem::set_samplerate(int smprate) { samplerate = smprate; } double modem::PTTnco() { double amp = sin(PTTphaseacc); PTTphaseacc += TWOPI * 1000 / samplerate; if (PTTphaseacc > TWOPI) PTTphaseacc -= TWOPI; return amp; } double modem::sigmaN (double es_ovr_n0) { double sn_ratio, sigma; double mode_factor = 0.707; switch (mode) { case MODE_CW: mode_factor /= 0.44; break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: mode_factor /= 0.22; break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : mode_factor *= 3.0; break; case MODE_PSK31: case MODE_PSK63: case MODE_PSK63F: case MODE_PSK125: case MODE_PSK250: case MODE_PSK500: case MODE_QPSK31: case MODE_QPSK63: case MODE_QPSK125: case MODE_QPSK250: case MODE_PSK125R: case MODE_PSK250R: case MODE_PSK500R: mode_factor = 400; break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: mode_factor *= 6.0; break; // case MODE_RTTY: // case MODE_OLIVIA: // case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: // case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: // case MODE_MFSK4: case MODE_MFSK11: case MODE_MFSK22: case MODE_MFSK31: // case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: // case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: // case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: // case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80: default: break; } if (trx_state == STATE_TUNE) mode_factor = 0.707; sn_ratio = pow(10, ( es_ovr_n0 / 10) ); sigma = sqrt ( mode_factor / sn_ratio ); return sigma; } // A Rayleigh-distributed random variable R, with the probability // distribution // F(R) = 0 where R < 0 and // F(R) = 1 - exp(-R^2/2*sigma^2) where R >= 0, // is related to a pair of Gaussian variables C and D // through the transformation // C = R * cos(theta) and // D = R * sin(theta), // where theta is a uniformly distributed variable in the interval // 0 to 2 * Pi. double modem::gauss(double sigma) { double u, r; u = 1.0 * rand() / RAND_MAX; r = sigma * sqrt( 2.0 * log( 1.0 / (1.0 - u) ) ); u = 1.0 * rand() / RAND_MAX; return r * cos(2 * M_PI * u); } // given the desired Es/No, calculate the standard deviation of the // additive white gaussian noise (AWGN). The standard deviation of // the AWGN will be used to generate Gaussian random variables // simulating the noise that is added to the signal. // return signal + noise, limiting value to +/- 1.0 void modem::add_noise(double *buffer, int len) { double sigma = sigmaN(noiseDB->value()); double sn = 0; for (int n = 0; n < len; n++) { if (btnNoiseOn->value()) { sn = (buffer[n] + gauss(sigma)) / (1.0 + 3.0 * sigma); buffer[n] = clamp(sn, -1.0, 1.0); } } } void modem::s2nreport(void) { double s2n_avg = s2n_sum / s2n_ncount; double s2n_stddev = sqrt((s2n_sum2 / s2n_ncount) - (s2n_avg * s2n_avg)); pskmail_notify_s2n(s2n_ncount, s2n_avg, s2n_stddev); } bool disable_modem = false; #define SIGLIMIT 0.95 void modem::ModulateXmtr(double *buffer, int len) { if (unlikely(!TXscard)) return; if (disable_modem) return; tx_sample_count += len; if (progdefaults.PTTrightchannel) { for (int i = 0; i < len; i++) PTTchannel[i] = PTTnco(); ModulateStereo( buffer, PTTchannel, len, false); return; } if (test_signal_window && test_signal_window->visible()) add_noise(buffer, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, buffer, (size_t)len); double mult = pow(10, progdefaults.txlevel / 20.0); if (mult > SIGLIMIT) mult = SIGLIMIT; for (int i = 0; i < len; i++) { buffer[i] *= mult; if (buffer[i] < -SIGLIMIT) buffer[i] = -SIGLIMIT; if (buffer[i] > SIGLIMIT) buffer[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write(buffer, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } #include using namespace std; void modem::ModulateStereo(double *left, double *right, int len, bool sample_flag) { if (unlikely(!TXscard)) return; if (disable_modem) return; if(sample_flag) tx_sample_count += len; if (test_signal_window && test_signal_window->visible() && progdefaults.noise) add_noise(left, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, left, (size_t)len); double mult = pow(10, progdefaults.txlevel / 20.0); if (mult > SIGLIMIT) mult = SIGLIMIT; for (int i = 0; i < len; i++) { if (right[i] < -SIGLIMIT) right[i] = -SIGLIMIT; if (right[i] > SIGLIMIT) right[i] = SIGLIMIT; left[i] *= mult; if (left[i] < -SIGLIMIT) left[i] = -SIGLIMIT; if (left[i] > SIGLIMIT) left[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write_stereo(left, right, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } //------------------------------------------------------------------------------ // modulate video signal //------------------------------------------------------------------------------ void modem::ModulateVideoStereo(double *left, double *right, int len, bool sample_flag) { if (unlikely(!TXscard)) return; if(sample_flag) tx_sample_count += len; if (test_signal_window && test_signal_window->visible() && progdefaults.noise) add_noise(left, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, left, (size_t)len); double mult = SIGLIMIT * pow(10, progdefaults.txlevel / 20.0); for (int i = 0; i < len; i++) { if (right[i] < -SIGLIMIT) right[i] = -SIGLIMIT; if (right[i] > SIGLIMIT) right[i] = SIGLIMIT; left[i] *= mult; if (left[i] < -SIGLIMIT) left[i] = -SIGLIMIT; if (left[i] > SIGLIMIT) left[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write_stereo(left, right, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } void modem::ModulateVideo(double *buffer, int len) { if (unlikely(!TXscard)) return; tx_sample_count += len; if (progdefaults.PTTrightchannel) { for (int i = 0; i < len; i++) PTTchannel[i] = PTTnco(); ModulateVideoStereo( buffer, PTTchannel, len, false); return; } if (test_signal_window && test_signal_window->visible() && progdefaults.noise) add_noise(buffer, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, buffer, (size_t)len); double mult = SIGLIMIT * pow(10, progdefaults.txlevel / 20.0); for (int i = 0; i < len; i++) { buffer[i] *= mult; if (buffer[i] < -SIGLIMIT) buffer[i] = -SIGLIMIT; if (buffer[i] > SIGLIMIT) buffer[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write(buffer, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } //------------------------------------------------------------------------------ void modem::videoText() { if (trx_state == STATE_TUNE) return; if (progdefaults.pretone > 0.2) pretone(); if (progdefaults.sendtextid == true) { wfid_text(progdefaults.strTextid); } else if (progdefaults.macrotextid == true) { wfid_text(progdefaults.strTextid); progdefaults.macrotextid = false; } if (progdefaults.videoid_modes.test(mode) && (progdefaults.sendid || progdefaults.macroid)) { #define TLEN 20 char idtxt[TLEN] = ""; switch(mode_info[mode].mode) { case MODE_CONTESTIA: snprintf(idtxt, TLEN, "%s-%d/%d", mode_info[mode].vid_name, 2*(1<(rtty::BAUD[progdefaults.rtty_baud]), rtty::BITS[progdefaults.rtty_bits]); break; case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: if (progdefaults.DOMINOEX_FEC) snprintf(idtxt, TLEN, "%s-FEC", mode_info[mode].vid_name); else strcpy(idtxt, mode_info[mode].vid_name); break; default: strcpy(idtxt, mode_info[mode].vid_name); break; } wfid_text(idtxt); progdefaults.macroid = false; } } // CW ID transmit routines //=========================================================================== // cw transmit routines to send a post amble message // Define the amplitude envelop for key down events // this is 1/2 cycle of a raised cosine //=========================================================================== void modem::cwid_makeshape() { for (int i = 0; i < 128; i++) cwid_keyshape[i] = 1.0; for (int i = 0; i < RT; i++) cwid_keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / RT)); } double modem::cwid_nco(double freq) { cwid_phaseacc += 2.0 * M_PI * freq / samplerate; if (cwid_phaseacc > TWOPI) cwid_phaseacc -= TWOPI; return sin(cwid_phaseacc); } //===================================================================== // cwid_send_symbol() // Sends a part of a morse character (one dot duration) of either // sound at the correct freq or silence. Rise and fall time is controlled // with a raised cosine shape. // // Left channel contains the shaped A2 CW waveform //======================================================================= void modem::cwid_send_symbol(int bits) { double freq; int i, keydown, keyup, sample = 0, currsym = bits & 1; freq = get_txfreq_woffset() - progdefaults.TxOffset; if ((currsym == 1) && (cwid_lastsym == 0)) cwid_phaseacc = 0.0; keydown = cwid_symbollen - RT; keyup = cwid_symbollen - RT; if (currsym == 1) { for (i = 0; i < RT; i++, sample++) { if (cwid_lastsym == 0) outbuf[sample] = cwid_nco(freq) * cwid_keyshape[i]; else outbuf[sample] = cwid_nco(freq); } for (i = 0; i < keydown; i++, sample++) { outbuf[sample] = cwid_nco(freq); } } else { for (i = RT - 1; i >= 0; i--, sample++) { if (cwid_lastsym == 1) { outbuf[sample] = cwid_nco(freq) * cwid_keyshape[i]; } else { outbuf[sample] = 0.0; } } for (i = 0; i < keyup; i++, sample++) { outbuf[sample] = 0.0; } } ModulateXmtr(outbuf, cwid_symbollen); cwid_lastsym = currsym; } //===================================================================== // send_ch() // sends a morse character and the space afterwards //======================================================================= void modem::cwid_send_ch(int ch) { std::string code; // handle word space separately (7 dots spacing) // last char already had 2 elements of inter-character spacing if ((ch == ' ') || (ch == '\n')) { cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); put_echo_char(ch); return; } // convert character code to a morse representation code = morse.tx_lookup(ch); //cw_tx_lookup(ch); if (!code.length()) return; // loop sending out binary bits of cw character for (size_t n = 0; n < code.length(); n++) { cwid_send_symbol(0); cwid_send_symbol(1); if (code[n] == '-') { cwid_send_symbol(1); cwid_send_symbol(1); } } cwid_send_symbol(0); cwid_send_symbol(0); } void modem::cwid_sendtext (const string& s) { cwid_symbollen = (int)(1.2 * samplerate / progdefaults.CWIDwpm); RT = (int) (samplerate * 6 / 1000.0); // 6 msec risetime for CW pulse cwid_makeshape(); cwid_lastsym = 0; for (unsigned int i = 0; i < s.length(); i++) { cwid_send_ch(s[i]); } } void modem::cwid() { if (progdefaults.cwid_modes.test(mode) && (progdefaults.CWid == true || progdefaults.macroCWid == true)) { string tosend = " DE "; tosend += progdefaults.myCall; cwid_sendtext(tosend); progdefaults.macroCWid = false; } } //===================================================================== // transmit processing of waterfall video id //===================================================================== static int NUMROWS; static int NUMCOLS; static int TONESPACING; static int IDSYMLEN; static int CHARSPACE; static bool useIDSMALL = true; #define MAXROWS 14 #define MAXIDSYMLEN 16384 #define MAXTONES 128 #define MAXCHARS 10 struct mfntchr { char c; int byte[MAXROWS]; }; extern mfntchr idch1[]; // original id font definition extern mfntchr idch2[]; // extended id font definition static int id_symbols[MAXCHARS]; static C_FIR_filter vidfilt; void modem::wfid_make_tones(int numchars) { double f, flo, fhi; int vwidth = (numchars*NUMCOLS + (numchars-1)*CHARSPACE - 1); f = get_txfreq_woffset() + TONESPACING * vwidth/2.0; fhi = f + TONESPACING; flo = fhi - (vwidth + 2) * TONESPACING; for (int i = 1; i <= NUMCOLS * numchars; i++) { wfid_w[i-1] = f * 2.0 * M_PI / samplerate; f -= TONESPACING; if ( (i > 0) && (i % NUMCOLS == 0) ) f -= TONESPACING * CHARSPACE; } vidfilt.init_bandpass( 1024, 1, flo/samplerate, fhi/samplerate) ; } void modem::wfid_send(int numchars) { int i, j, k; int sym; double val; for (i = 0; i < IDSYMLEN; i++) { val = 0.0; for (k = 0; k < numchars; k++) { sym = id_symbols[numchars - k - 1]; for (j = 0; j < NUMCOLS; j++) { if (sym & 1) val += sin(wfid_w[j + k * NUMCOLS] * i); sym = sym >> 1; } } // soft limit the signal - heuristic formulation val = (1.0 - exp(-fabs(val)/3.0)) * (val >= 0.0 ? 1 : -1); // band pass filter the soft limited signal vidfilt.Irun( val, val ); wfid_outbuf[i] = val; } ModulateVideo(wfid_outbuf, IDSYMLEN); } void modem::wfid_sendchars(string s) { int len = s.length(); int n[len]; int c; wfid_make_tones(s.length()); for (int i = 0; i < len; i++) { if (useIDSMALL) { c = toupper(s[i]); if (c > 'Z' || c < ' ') c = ' '; } else { c = s[i]; if (c > '~' || c < ' ') c = ' '; } n[i] = c - ' '; } // send rows from bottom to top so they appear to scroll down the waterfall correctly for (int row = 0; row < NUMROWS; row++) { for (int i = 0; i < len; i++) { if (useIDSMALL) id_symbols[i] = idch1[n[i]].byte[NUMROWS - 1 - row]; else id_symbols[i] = idch2[n[i]].byte[NUMROWS - 1 - row]; } wfid_send(len); if (stopflag) return; } } void modem::pretone() { int sr = get_samplerate(); int symlen = sr / 10; double phaseincr = 2.0 * M_PI * get_txfreq_woffset() / sr; double phase = 0.0; double outbuf[symlen]; for (int j = 0; j < symlen; j++) { outbuf[j] = (0.5 * (1.0 - cos (M_PI * j / symlen)))*sin(phase); phase += phaseincr; if (phase > TWOPI) phase -= TWOPI; } ModulateXmtr(outbuf, symlen); for (int i = 0; i < progdefaults.pretone * 10 - 2; i++) { for (int j = 0; j < symlen; j++) { outbuf[j] = sin(phase); phase += phaseincr; if (phase > TWOPI) phase -= TWOPI; } ModulateXmtr(outbuf, symlen); } for (int j = 0; j < symlen; j++) { outbuf[j] = (0.5 * (1.0 - cos (M_PI * (symlen - j) / symlen)))*sin(phase); phase += phaseincr; if (phase > TWOPI) phase -= TWOPI; } ModulateXmtr(outbuf, symlen); memset(outbuf, 0, symlen * sizeof(*outbuf)); ModulateXmtr(outbuf, symlen); } void modem::wfid_text(const string& s) { int len = s.length(); string video = "Video text: "; video += s; if (progdefaults.ID_SMALL) { NUMROWS = 7; NUMCOLS = 5; CHARSPACE = 2; vidwidth = progdefaults.videowidth; TONESPACING = 6; IDSYMLEN = 3072; useIDSMALL = true; } else { NUMROWS = 14; NUMCOLS = 8; CHARSPACE = 2; vidwidth = progdefaults.videowidth; TONESPACING = 8; IDSYMLEN = 2560; useIDSMALL = false; } if (progdefaults.vidlimit) { if ((vidwidth * TONESPACING * (NUMCOLS + CHARSPACE)) > 500) vidwidth = 500 / (TONESPACING * (NUMCOLS + CHARSPACE)); } if (progdefaults.vidmodelimit) { if ((vidwidth * TONESPACING * (NUMCOLS + CHARSPACE)) > get_bandwidth()) vidwidth = (int)ceil(get_bandwidth() / (TONESPACING * (NUMCOLS + CHARSPACE))); } put_status(video.c_str()); disable_modem = true; int numlines = 0; string tosend; while (numlines < len) numlines += vidwidth; numlines -= vidwidth; while (numlines >= 0) { tosend = s.substr(numlines, vidwidth); wfid_sendchars(tosend); numlines -= vidwidth; if (stopflag) break; } // blank lines for (int i = 0; i < vidwidth; i++) id_symbols[i] = 0; wfid_send(vidwidth); wfid_send(vidwidth); put_status(""); disable_modem = false; } double modem::wfid_outbuf[MAXIDSYMLEN]; double modem::wfid_w[MAXTONES]; mfntchr idch1[] = { { ' ', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, }, { '!', { 0x00, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, }, }, { '"', { 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }, }, { '#', { 0x00, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x00, }, }, { '$', { 0x00, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x00, }, }, { '%', { 0x00, 0x19, 0x02, 0x04, 0x08, 0x13, 0x00, }, }, { '&', { 0x00, 0x08, 0x1C, 0x0D, 0x12, 0x0F, 0x00, }, }, { '\'', { 0x00, 0x18, 0x08, 0x10, 0x00, 0x00, 0x00, }, }, { '(', { 0x00, 0x0C, 0x10, 0x10, 0x10, 0x0C, 0x00, }, }, { ')', { 0x00, 0x18, 0x04, 0x04, 0x04, 0x18, 0x00, }, }, { '*', { 0x00, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x00, }, }, { '+', { 0x00, 0x00, 0x04, 0x1F, 0x04, 0x00, 0x00, }, }, { ',', { 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x00, }, }, { '-', { 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, }, }, { '.', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, }, }, { '/', { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, }, }, { '0', { 0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00, }, }, { '1', { 0x00, 0x0C, 0x14, 0x04, 0x04, 0x04, 0x00, }, }, { '2', { 0x00, 0x1C, 0x02, 0x04, 0x08, 0x1F, 0x00, }, }, { '3', { 0x00, 0x1E, 0x01, 0x06, 0x01, 0x1E, 0x00, }, }, { '4', { 0x00, 0x12, 0x12, 0x1F, 0x02, 0x02, 0x00, }, }, { '5', { 0x00, 0x1F, 0x10, 0x1E, 0x01, 0x1E, 0x00, }, }, { '6', { 0x00, 0x0E, 0x10, 0x1E, 0x11, 0x0E, 0x00, }, }, { '7', { 0x00, 0x1F, 0x01, 0x02, 0x04, 0x08, 0x00, }, }, { '8', { 0x00, 0x0E, 0x11, 0x0E, 0x11, 0x0E, 0x00, }, }, { '9', { 0x00, 0x0E, 0x11, 0x0F, 0x01, 0x0E, 0x00, }, }, { ':', { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, }, }, { ';', { 0x00, 0x18, 0x00, 0x18, 0x08, 0x10, 0x00, }, }, { '<', { 0x00, 0x01, 0x06, 0x18, 0x06, 0x01, 0x00, }, }, { '=', { 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, }, }, { '>', { 0x00, 0x10, 0x0C, 0x03, 0x0C, 0x10, 0x00, }, }, { '?', { 0x00, 0x1C, 0x02, 0x04, 0x00, 0x04, 0x00, }, }, { '@', { 0x00, 0x0E, 0x11, 0x16, 0x10, 0x0F, 0x00, }, }, { 'A', { 0x00, 0x0E, 0x11, 0x1F, 0x11, 0x11, 0x00, }, }, { 'B', { 0x00, 0x1E, 0x09, 0x0E, 0x09, 0x1E, 0x00, }, }, { 'C', { 0x00, 0x0F, 0x10, 0x10, 0x10, 0x0F, 0x00, }, }, { 'D', { 0x00, 0x1E, 0x11, 0x11, 0x11, 0x1E, 0x00, }, }, { 'E', { 0x00, 0x1F, 0x10, 0x1C, 0x10, 0x1F, 0x00, }, }, { 'F', { 0x00, 0x1F, 0x10, 0x1C, 0x10, 0x10, 0x00, }, }, { 'G', { 0x00, 0x0F, 0x10, 0x13, 0x11, 0x0F, 0x00, }, }, { 'H', { 0x00, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00, }, }, { 'I', { 0x00, 0x1C, 0x08, 0x08, 0x08, 0x1C, 0x00, }, }, { 'J', { 0x00, 0x01, 0x01, 0x01, 0x11, 0x0E, 0x00, }, }, { 'K', { 0x00, 0x11, 0x12, 0x1C, 0x12, 0x11, 0x00, }, }, { 'L', { 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, }, }, { 'M', { 0x00, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x00, }, }, { 'N', { 0x00, 0x11, 0x19, 0x15, 0x13, 0x11, 0x00, }, }, { 'O', { 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00, }, }, { 'P', { 0x00, 0x1E, 0x11, 0x1E, 0x10, 0x10, 0x00, }, }, { 'Q', { 0x00, 0x0E, 0x11, 0x11, 0x15, 0x0E, 0x01, }, }, { 'R', { 0x00, 0x1E, 0x11, 0x1E, 0x12, 0x11, 0x00, }, }, { 'S', { 0x00, 0x0F, 0x10, 0x0E, 0x01, 0x1E, 0x00, }, }, { 'T', { 0x00, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x00, }, }, { 'U', { 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00, }, }, { 'V', { 0x00, 0x11, 0x12, 0x14, 0x18, 0x10, 0x00, }, }, { 'W', { 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A, 0x00, }, }, { 'X', { 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00, }, }, { 'Y', { 0x00, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x00, }, }, { 'Z', { 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F, 0x00, }, }, }; mfntchr idch2[] = { {' ', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'!', { 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00 }, }, {'"', { 0x00, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'#', { 0x00, 0x50, 0x50, 0xF8, 0xF8, 0x50, 0x50, 0xF8, 0xF8, 0x50, 0x50, 0x00, 0x00, 0x00 }, }, {'$', { 0x00, 0x20, 0x20, 0x78, 0xF8, 0xA0, 0xF0, 0x78, 0x28, 0xF8, 0xF0, 0x20, 0x20, 0x00 }, }, {'%', { 0x00, 0x40, 0xE4, 0xE4, 0x4C, 0x18, 0x30, 0x60, 0xC8, 0x9C, 0x9C, 0x88, 0x00, 0x00 }, }, {'&', { 0x00, 0x30, 0x78, 0x48, 0x48, 0x70, 0xF4, 0x8C, 0x88, 0xFC, 0x74, 0x00, 0x00, 0x00 }, }, {'\'', { 0x00, 0x40, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'(', { 0x00, 0x00, 0x20, 0x60, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xC0, 0x60, 0x20, 0x00, 0x00 }, }, {')', { 0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00 }, }, {'*', { 0x00, 0x00, 0x00, 0x10, 0x10, 0xFE, 0x7C, 0x38, 0x6C, 0x44, 0x00, 0x00, 0x00, 0x00 }, }, {'+', { 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00 }, }, {',', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x40, 0xC0, 0x80 }, }, {'-', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'.', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00 }, }, {'/', { 0x00, 0x08, 0x08, 0x18, 0x10, 0x30, 0x20, 0x60, 0x40, 0xC0, 0x80, 0x80, 0x00, 0x00 }, }, {'0', { 0x00, 0x00, 0x78, 0xFC, 0x8C, 0x9C, 0xB4, 0xE4, 0xC4, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'1', { 0x00, 0x00, 0x10, 0x30, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00 }, }, {'2', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0xFC, 0x00, 0x00 }, }, {'3', { 0x00, 0x00, 0xFC, 0xFC, 0x04, 0x0C, 0x18, 0x1C, 0x04, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'4', { 0x00, 0x00, 0x38, 0x78, 0x48, 0xC8, 0x88, 0xFC, 0xFC, 0x08, 0x08, 0x08, 0x00, 0x00 }, }, {'5', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF8, 0xFC, 0x04, 0x04, 0xFC, 0xF8, 0x00, 0x00 }, }, {'6', { 0x00, 0x00, 0x78, 0xF8, 0x80, 0x80, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'7', { 0x00, 0x00, 0xFC, 0xFC, 0x04, 0x04, 0x0C, 0x18, 0x30, 0x20, 0x20, 0x20, 0x00, 0x00 }, }, {'8', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x78, 0xFC, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'9', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0xFC, 0x7C, 0x04, 0x04, 0x7C, 0x78, 0x00, 0x00 }, }, {':', { 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00 }, }, {';', { 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x00 }, }, {'<', { 0x00, 0x00, 0x08, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x08, 0x00, 0x00 }, }, {'=', { 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00 }, }, {'>', { 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00 }, }, {'?', { 0x00, 0x00, 0x70, 0xF8, 0x88, 0x08, 0x18, 0x30, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00 }, }, {'@', { 0x00, 0x00, 0x7C, 0xFE, 0x82, 0x82, 0xB2, 0xBE, 0xBC, 0x80, 0xFC, 0x7C, 0x00, 0x00 }, }, {'A', { 0x00, 0x00, 0x30, 0x78, 0xCC, 0x84, 0x84, 0xFC, 0xFC, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'B', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xF8, 0xF8, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x00 }, }, {'C', { 0x00, 0x00, 0x38, 0x7C, 0xC4, 0x80, 0x80, 0x80, 0x80, 0xC4, 0x7C, 0x38, 0x00, 0x00 }, }, {'D', { 0x00, 0x00, 0xF0, 0xF8, 0x8C, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xF8, 0xF0, 0x00, 0x00 }, }, {'E', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF0, 0xF0, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'F', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF0, 0xF0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'G', { 0x00, 0x00, 0x3C, 0x7C, 0xC0, 0x80, 0x8C, 0x8C, 0x84, 0xC4, 0x7C, 0x38, 0x00, 0x00 }, }, {'H', { 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0xFC, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'I', { 0x00, 0x00, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'J', { 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'K', { 0x00, 0x00, 0x84, 0x84, 0x8C, 0x98, 0xF0, 0xF0, 0x98, 0x8C, 0x84, 0x84, 0x00, 0x00 }, }, {'L', { 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'M', { 0x00, 0x00, 0x82, 0xC6, 0xEE, 0xBA, 0x92, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00 }, }, {'N', { 0x00, 0x00, 0x84, 0xC4, 0xE4, 0xB4, 0x9C, 0x8C, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'O', { 0x00, 0x00, 0x30, 0x78, 0xCC, 0x84, 0x84, 0x84, 0x84, 0xCC, 0x78, 0x30, 0x00, 0x00 }, }, {'P', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0xF8, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'Q', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x84, 0x84, 0x94, 0x94, 0xFC, 0x78, 0x08, 0x08 }, }, {'R', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0xF8, 0x88, 0x8C, 0x84, 0x84, 0x00, 0x00 }, }, {'S', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x80, 0xF8, 0x7C, 0x04, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'T', { 0x00, 0x00, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00 }, }, {'U', { 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'V', { 0x00, 0x00, 0x82, 0x82, 0x82, 0xC6, 0x44, 0x6C, 0x28, 0x38, 0x10, 0x10, 0x00, 0x00 }, }, {'W', { 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x92, 0x92, 0x92, 0xFE, 0x6C, 0x00, 0x00 }, }, {'X', { 0x00, 0x00, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x82, 0x82, 0x00, 0x00 }, }, {'Y', { 0x00, 0x00, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00 }, }, {'Z', { 0x00, 0x00, 0xFC, 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'[', { 0x00, 0x00, 0xE0, 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0xE0, 0x00, 0x00 }, }, {'\\', { 0x00, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00 }, }, {']', { 0x00, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x00, 0x00 }, }, {'^', { 0x00, 0x20, 0x20, 0x70, 0x50, 0xD8, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'_', { 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00 }, }, {'`', { 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'a', { 0x00, 0x00, 0x00, 0x00, 0x78, 0x7C, 0x04, 0x7C, 0xFC, 0x84, 0xFC, 0x7C, 0x00, 0x00 }, }, {'b', { 0x00, 0x00, 0x80, 0x80, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x00 }, }, {'c', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xF8, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x78, 0x00, 0x00 }, }, {'d', { 0x00, 0x00, 0x04, 0x04, 0x74, 0xFC, 0x8C, 0x84, 0x84, 0x84, 0xFC, 0x7C, 0x00, 0x00 }, }, {'e', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xFC, 0x84, 0xFC, 0xFC, 0x80, 0xF8, 0x78, 0x00, 0x00 }, }, {'f', { 0x00, 0x00, 0x3C, 0x7C, 0x40, 0x40, 0xF8, 0xF8, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00 }, }, {'g', { 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x7C, 0x78, 0x00 }, }, {'h', { 0x00, 0x00, 0x80, 0x80, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'i', { 0x00, 0x20, 0x20, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'j', { 0x00, 0x08, 0x08, 0x00, 0x38, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF8, 0x70 }, }, {'k', { 0x00, 0x00, 0x80, 0x88, 0x98, 0xB0, 0xE0, 0xE0, 0xB0, 0x98, 0x88, 0x88, 0x00, 0x00 }, }, {'l', { 0x00, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'m', { 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0x92, 0x92, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00 }, }, {'n', { 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'o', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'p', { 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xC4, 0xFC, 0xB8, 0x80, 0x80, 0x80 }, }, {'q', { 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x04, 0x04 }, }, {'r', { 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0xC4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'s', { 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x80, 0xF8, 0x7C, 0x04, 0xFC, 0xF8, 0x00, 0x00 }, }, {'t', { 0x00, 0x00, 0x40, 0x40, 0xF0, 0xF0, 0x40, 0x40, 0x40, 0x40, 0x78, 0x38, 0x00, 0x00 }, }, {'u', { 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x00, 0x00 }, }, {'v', { 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00 }, }, {'w', { 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x92, 0x92, 0xFE, 0x6C, 0x00, 0x00 }, }, {'x', { 0x00, 0x00, 0x00, 0x00, 0x82, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x82, 0x00, 0x00 }, }, {'y', { 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x7C, 0x78 }, }, {'z', { 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0xFC, 0x00, 0x00 }, }, {'{', { 0x00, 0x20, 0x60, 0x40, 0x40, 0x40, 0xC0, 0xC0, 0x40, 0x40, 0x40, 0x60, 0x20, 0x00 }, }, {'|', { 0x00, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00 }, }, {'}', { 0x00, 0x80, 0xC0, 0x40, 0x40, 0x40, 0x60, 0x60, 0x40, 0x40, 0x40, 0xC0, 0x80, 0x00 }, }, {'~', { 0x00, 0x98, 0xFC, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }; fldigi-4.1.06/build-aux/0000775000175000017500000000000013515625026011742 500000000000000fldigi-4.1.06/build-aux/config.guess0000755000175000017500000012475313472115742014215 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || \ echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; e2k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fldigi-4.1.06/build-aux/config.sub0000755000175000017500000010646013472115742013653 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fldigi-4.1.06/build-aux/depcomp0000755000175000017500000005601613472115742013246 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-4.1.06/build-aux/install-sh0000755000175000017500000003546313472115742013700 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2014-09-12.12; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # $RANDOM is not portable (e.g. dash); use it when possible to # lower collision chance tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so # create the $tmpdir first (and fail if unsuccessful) to make sure # that nobody tries to guess the $tmpdir name. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-4.1.06/build-aux/test-driver0000755000175000017500000001104013472115742014053 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2014 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-4.1.06/build-aux/compile0000755000175000017500000001624513472115742013247 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-4.1.06/build-aux/config.rpath0000755000175000017500000004364713472115742014207 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2007 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix4* | aix5*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-4.1.06/aclocal.m40000664000175000017500000016005113515623764011642 00000000000000# generated automatically by aclocal 1.15.1 -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # intlmacosx.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2004-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29.1) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # Copyright (C) 2002-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/intl/gettext.m4]) m4_include([m4/intl/iconv.m4]) m4_include([m4/intl/lib-ld.m4]) m4_include([m4/intl/lib-link.m4]) m4_include([m4/intl/lib-prefix.m4]) m4_include([m4/intl/nls.m4]) m4_include([m4/intl/po.m4]) m4_include([m4/intl/progtest.m4]) m4_include([m4/ax_compare_version.m4]) m4_include([m4/benchmark.m4]) m4_include([m4/bind.m4]) m4_include([m4/build.m4]) m4_include([m4/c++11.m4]) m4_include([m4/debug.m4]) m4_include([m4/docs.m4]) m4_include([m4/fltk.m4]) m4_include([m4/funcs.m4]) m4_include([m4/hash.m4]) m4_include([m4/libintl.m4]) m4_include([m4/macosx.m4]) m4_include([m4/np-compat.m4]) m4_include([m4/opt.m4]) m4_include([m4/oss.m4]) m4_include([m4/pkg-config.m4]) m4_include([m4/progs.m4]) m4_include([m4/static.m4]) m4_include([m4/tls.m4]) m4_include([m4/win32.m4]) fldigi-4.1.06/configure.ac0000664000175000017500000002726413515623732012273 00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_COPYRIGHT([Copyright (C) 2007, 2008, 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net)]) AC_PREREQ(2.61) dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [4]) m4_define(FLDIGI_MINOR, [1]) m4_define(FLDIGI_PATCH, [.06]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.7]) AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH, [fldigi-devel@sourceforge.net]) # substitute in Makefiles AC_SUBST([FLDIGI_VERSION_MAJOR], [FLDIGI_MAJOR]) AC_SUBST([FLDIGI_VERSION_MINOR], [FLDIGI_MINOR]) AC_SUBST([FLDIGI_VERSION_PATCH], [FLDIGI_PATCH]) AC_SUBST([FLDIGI_VERSION], [FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH]) AC_SUBST([FLARQ_VERSION_MAJOR], [FLARQ_MAJOR]) AC_SUBST([FLARQ_VERSION_MINOR], [FLARQ_MINOR]) AC_SUBST([FLARQ_VERSION_PATCH], [FLARQ_PATCH]) AC_SUBST([FLARQ_VERSION], [FLARQ_MAJOR.FLARQ_MINOR[]FLARQ_PATCH]) # define in config.h AC_DEFINE([FLDIGI_VERSION_MAJOR], [FLDIGI_MAJOR], [Fldigi major version number]) AC_DEFINE([FLDIGI_VERSION_MINOR], [FLDIGI_MINOR], [Fldigi minor version number]) AC_DEFINE([FLDIGI_VERSION_PATCH], ["FLDIGI_PATCH"], [Fldigi patch/alpha version string]) AC_DEFINE([FLARQ_VERSION_MAJOR], [FLARQ_MAJOR], [Flarq major version number]) AC_DEFINE([FLARQ_VERSION_MINOR], [FLARQ_MINOR], [Flarq minor version number]) AC_DEFINE([FLARQ_VERSION_PATCH], ["FLARQ_PATCH"], [Flarq patch/alpha version string]) AC_DEFINE([FLDIGI_VERSION], ["FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH"], [Fldigi version string]) AC_DEFINE([FLARQ_VERSION], ["FLARQ_MAJOR.FLARQ_MINOR[]FLARQ_PATCH"], [Flarq version string]) AC_SUBST([AC_CONFIG_ARGS], [$ac_configure_args]) AC_CONFIG_AUX_DIR([build-aux]) # define build, build_cpu, build_vendor, build_os AC_CANONICAL_BUILD # define host, host_cpu, host_vendor, host_os AC_CANONICAL_HOST # define target, target_cpu, target_vendor, target_os AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([-Wall -Wno-portability foreign std-options subdir-objects 1.9.6]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AM_MAINTAINER_MODE AC_CONFIG_SRCDIR([src/main.cxx]) AC_CONFIG_HEADER([src/config.h]) AC_CONFIG_MACRO_DIR([m4]) FLDIGI_AUTHORS="Dave Freese, Stelios Bounanos, and others" FLARQ_AUTHORS="Dave Freese, Robert Stiles, and others" PACKAGE_HOME="http://www.w1hkj.com/Fldigi.html" PACKAGE_DL="http://www.w1hkj.com/download.html" PACKAGE_PROJ="http://sourceforge.net/projects/fldigi/files/" PACKAGE_NEWBUG="https://fedorahosted.org/fldigi/newticket" PACKAGE_DOCS="http://www.w1hkj.com/FldigiHelp/index.html" PACKAGE_GUIDE="http://www.w1hkj.com/beginners.html" FLARQ_DOCS="http://www.w1hkj.com/FlarqHelpFiles/flarq.html" AC_DEFINE_UNQUOTED([FLDIGI_AUTHORS], ["$FLDIGI_AUTHORS"], [Fldigi authors]) AC_DEFINE_UNQUOTED([FLARQ_AUTHORS], ["$FLARQ_AUTHORS"], [Flarq authors]) AC_DEFINE_UNQUOTED([PACKAGE_HOME], ["$PACKAGE_HOME"], [Home page]) AC_DEFINE_UNQUOTED([PACKAGE_DL], ["$PACKAGE_DL"], [Download page]) AC_DEFINE_UNQUOTED([PACKAGE_PROJ], ["$PACKAGE_PROJ"], [Sourceforge page]) AC_DEFINE_UNQUOTED([PACKAGE_NEWBUG], ["$PACKAGE_NEWBUG"], [Trac new ticket page]) AC_DEFINE_UNQUOTED([PACKAGE_DOCS], ["$PACKAGE_DOCS"], [Docs index]) AC_DEFINE_UNQUOTED([PACKAGE_GUIDE], ["$PACKAGE_GUIDE"], [Beginners guide]) AC_DEFINE_UNQUOTED([FLARQ_DOCS], ["$FLARQ_DOCS"], [Flarq Docs index]) AC_SUBST([FLDIGI_AUTHORS], [$FLDIGI_AUTHORS]) AC_SUBST([FLARQ_AUTHORS], [$FLARQ_AUTHORS]) AC_SUBST([PACKAGE_HOME], [$PACKAGE_HOME]) AC_SUBST([PACKAGE_DL], [$PACKAGE_DL]) AC_SUBST([PACKAGE_PROJ], [$PACKAGE_PROJ]) AC_SUBST([PACKAGE_NEWBUG], [$PACKAGE_NEWBUG]) AC_SUBST([PACKAGE_DOCS], [$PACKAGE_DOCS]) AC_SUBST([PACKAGE_GUIDE], [$PACKAGE_GUIDE]) AC_SUBST([FLARQ_DOCS], [$FLARQ_DOCS]) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_USE_SYSTEM_EXTENSIONS #Check for C++11 compliance AX_CXX_COMPILE_STDCXX_11(, optional) # Checks for header files. AC_HEADER_STDC AC_HEADER_DIRENT AC_CHECK_HEADERS([arpa/inet.h execinfo.h fcntl.h limits.h memory.h netdb.h netinet/in.h regex.h stdint.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h sys/utsname.h termios.h unistd.h values.h linux/ppdev.h dev/ppbus/ppi.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_CONST AC_C_INLINE AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_INT8_T AC_C_RESTRICT AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T AC_C_VOLATILE # Checks for library functions. AC_FUNC_CLOSEDIR_VOID AC_FUNC_ERROR_AT_LINE AC_PROG_GCC_TRADITIONAL dnl AC_FUNC_MALLOC dnl AC_FUNC_REALLOC AC_FUNC_SELECT_ARGTYPES AC_TYPE_SIGNAL AC_FUNC_STRFTIME AC_FUNC_STRTOD AC_CHECK_FUNCS([getaddrinfo gethostbyname hstrerror gmtime_r localtime_r memmove memset mkdir select setenv snprintf socket socketpair strcasecmp strcasestr strchr strdup strerror strlcpy strncpy strncmp strnlen strncasecmp strrchr strstr strtol uname unsetenv vsnprintf]) # Check for O_CLOEXEC AC_FCNTL_FLAGS AC_PRESERVE_HELP_ORDER ### Internationalization AM_GNU_GETTEXT([external]) AM_CONDITIONAL([USE_NLS], [test "x$USE_NLS" = "xyes"]) ### Programs # Determine if fldigi and flarq have been requested and can be built # Set ac_cv_want_fldigi and ac_cv_want_flarq to yes/no # Set WANT_FLDIGI and WANT_FLARQ Makefile conditionals AC_FLDIGI_PROGRAMS ###### OS support ### OSX # Set ac_cv_mac_universal to yes/no # Set DARWIN Makefile conditional # Substitute MAC_UNIVERSAL_CFLAGS and MAC_UNIVERSAL_LDFLAGS in Makefile AC_FLDIGI_MACOSX ### win32 # Set WIN32 Makefile conditional # Set HAVE_WINDRES Makefile conditional # Substitute WINDRES in Makefile AC_FLDIGI_WIN32 ### Non-POSIX compatibility (i.e. mingw32) # Sets various Makefile conditionals; see m4/np-compat.m4 AC_FLDIGI_NP_COMPAT ### static flag # Set ac_cv_static to yes/no # Substitute RTLIB in Makefile AC_FLDIGI_STATIC ### optimizations # Set ac_cv_opt to arg # Substitute OPT_FLAGS in Makefile AC_FLDIGI_OPT ### debug flag # Set ac_cv_debug to yes/no # Override CXXFLAGS # Set ENABLE_DEBUG Makefile conditional # Substitute RDYNAMIC in Makefile AC_FLDIGI_DEBUG ### benchmark mode # Set ac_cv_benchmark to yes/no # Define BENCHMARK_MODE in config.h # Set ENABLE_BENCHMARK Makefile conditional AC_FLDIGI_BENCHMARK ### TLS flag # Set ac_cv_tls to yes/no # Define USE_TLS in config.h AC_FLDIGI_TLS ### std::bind or alternatives # Set ac_cv_std_bind or ac_cv_std_tr1_bind to yes/no # Define HAVE_STD_BIND or HAVE_STD_TR1_BIND in config.h # Substitute BOOST_CPPFLAGS and BOOST_LDFLAGS in Makefile # if falling back to Boost AC_FLDIGI_BIND ### std::hash or alternatives # Set ac_cv_std_hash or ac_cv_std_tr1_hash to yes/no # Define HAVE_STD_HASH or HAVE_STD_TR1_HASH in config.h # Substitute BOOST_CPPFLAGS and BOOST_LDFLAGS in Makefile # if falling back to Boost AC_FLDIGI_HASH ### FLTK # Substitute FLTK_CFLAGS and FLTK_LIBS in Makefile # Set FLUID variable # Set HAVE_FLUID Makefile conditional AC_FLDIGI_FLTK ### OSS # Set ac_cv_oss to yes/no # Define USE_OSS in config.h AC_FLDIGI_OSS ### libpng # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_png to yes/no (not used) # Define USE_PNG in config.h (as above) # Substitute PNG_CFLAGS and PNG_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then AC_FLDIGI_PKG_CHECK([png], [libpng >= 1.2.8], [no], [no]) fi ### libsamplerate # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_samplerate to yes/no (not used) # Define USE_SAMPLERATE in config.h (as above) # Substitute SAMPLERATE_CFLAGS and SAMPLERATE_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then AC_FLDIGI_PKG_CHECK([samplerate], [samplerate >= 0.1.1], [no], [no]) fi ### libsndfile # Set ac_cv_sndfile to yes/no # Define USE_SNDFILE in config.h # Substitute SNDFILE_CFLAGS and SNDFILE_LIBS in Makefile AC_FLDIGI_PKG_CHECK([sndfile], [sndfile >= 1.0.10], [yes], [yes], [enable reading/writing of audio files via libsndfile @<:@autodetect@:>@] ) ### portaudio # Set ac_cv_portaudio to yes/no # Define USE_PORTAUDIO in config.h # Substitute PORTAUDIO_CFLAGS and PORTAUDIO_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then AC_FLDIGI_PKG_CHECK([portaudio], [portaudio-2.0 >= 19], [no], [no]) fi ### pulseaudio # Set ac_cv_pulseaudio to yes/no # Define USE_PULSEAUDIO in config.h # Substitute PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS in Makefile AC_FLDIGI_PKG_CHECK([pulseaudio], [libpulse-simple >= 0.9.7], [yes], [yes], [enable support for PulseAudio @<:@autodetect@:>@] ) if test "x$ac_cv_oss" = "xno" && \ test "x$ac_cv_portaudio" = "xno" && \ test "x$ac_cv_pulseaudio" = "xno"; then AC_MSG_WARN([*** $PACKAGE will be compiled without audio device support ***]) fi ### hamlib # Set ac_cv_hamlib to yes/no # Define USE_HAMLIB in config.h # Substitute HAMLIB_CFLAGS and HAMLIB_LIBS in Makefile # Set ENABLE_HAMLIB Makefile conditional AC_FLDIGI_PKG_CHECK([hamlib], [hamlib >= 1.2.4], [yes], [yes], [use hamradio control libraries @<:@autodetect@:>@], [ENABLE_HAMLIB]) # We compile our own copy of hamlib's locator.c if hamlib is not available # or if it is version <= 1.2.9, which has a broken azimuth_long_path function AX_COMPARE_VERSION([$pkg_hamlib_version], [le], [1.2.9], [need_locator_c=yes], [need_locator_c=no]) AM_CONDITIONAL([NEED_HAMLIB_LOCATOR], [test "$need_locator_c" = "yes"]) ### X11 # Set ac_cv_x to yes/no # Define USE_X in config.h # Substitute X_CFLAGS and X_LIBS in Makefile if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then AC_FLDIGI_PKG_CHECK([x], [x11], [no], [yes]) fi ### libflxmlrpc # Set ac_cv_flxmlrpc to yes/no # Define USE_FLXMLRPC in config.h # Substitute FLXMLRPC_CFLAGS and FLXMLRPC_LIBS in Makefile AC_FLDIGI_PKG_CHECK([flxmlrpc], [flxmlrpc >= 0.1.0], [yes], [yes], [use external flxmlrpc library @<:@autodetect@:>@], [ENABLE_FLXMLRPC]) ### libmbedtls # Set ac_cv_mbedtls to yes/no # Define USE_LIBMBEDTLS in config.h # Substitute LIBMBEDTLS_CFLAGS and LIBMBEDTLS_LIBS in Makefile AC_FLDIGI_PKG_CHECK([libmbedtls], [libmbedtls >= 2.16.0], [yes], [yes], [use mbedtls libraries @<:@autodetect@:>@], [ENABLE_LIBMBEDTLS]) ### libintl # Substitute INTL_CFLAGS in Makefile # Substitute INTL_LIBS in Makefile # (default to LIBINTL) AC_FLDIGI_INTL ### asciidoc # substitute ASCIIDOC and A2X in doc/Makefile # set HAVE_ASCIIDOC Makefile conditional AC_FLDIGI_DOCS ### build info # Define various build variables in config.h AC_FLDIGI_BUILD_INFO ### silent build rules AC_FLDIGI_BUILD_RULES ### output AH_TOP([ #ifndef CONFIG_H_ #define CONFIG_H_ ]) AH_BOTTOM([ #include "pkg.h" #include "util.h" #endif /* CONFIG_H_ */ ]) AC_CONFIG_FILES([Makefile src/Makefile po/Makefile.in doc/Makefile]) AC_OUTPUT ### summary AC_MSG_RESULT([ Configuration summary: Version ..................... $VERSION Static linking .............. $ac_cv_static CPU optimizations ........... $ac_cv_opt Debugging ................... $ac_cv_debug fldigi ...................... $ac_cv_want_fldigi flarq ....................... $ac_cv_want_flarq i18n ........................ $USE_NLS ]) ac_xmlrpc_report="internal lib"; if test "x$ac_cv_flxmlrpc" = "xyes"; then ac_xmlrpc_report="external lib"; fi ac_mbedtls_report="internal lib"; if test "x$ac_cv_libmbedtls" = "xyes"; then ac_mbedtls_report="external lib"; fi if test "x$ac_cv_want_fldigi" = "xyes"; then AC_MSG_RESULT([ fldigi build options: sndfile ..................... $ac_cv_sndfile oss ......................... $ac_cv_oss portaudio ................... $ac_cv_portaudio pulseaudio .................. $ac_cv_pulseaudio libmbedtls .................. $ac_mbedtls_report flxmlrpc .................... $ac_xmlrpc_report hamlib ...................... $ac_cv_hamlib ]) fi